쉘과 프롬프트


@ 앞 : 접속 계정

@ 뒤 : 접속한 시스템의 이름

: 뒤   : 현재 경로( pwd로도 확인 가능)



사용자 관리



1.사용자 추가

useradd [option] 계정이름


-d : 홈 디렉토리를 저장할 때 사용

-g : 그룹 지정

-G : 기본 그룹 이외에 추가로 지정할 그룹이 있는 경우

-c : 계정에 대한 설명


현재 시스템의 사용자를 확인하려면 "cat /etc/passwd" 명령어를 통해 확인 가능하다.

각 라인은 다음을 의미한다 [ID : 비밀번호 : UID : GID : 설명 : 홈 디렉터리 : 로그인 쉘]


2. 사용자 비밀번호 설정


사용자의 비밀번호는 /etc/shadow 파일에 암호화 되어 있다.

비밀번호가 설정되어 있지 않은 곳은 느낌표(!)로 표시되어 있다. 


계정에 비밀번호를 설정하고 싶다면 passwd [계정 이름] 으로 설정할 수 있다.


3. 사용자 삭제


userdel [option] 계정


-r : 사용자의 홈 디렉터리를 같이 제거한다.


4. 그룹 추가 및 삭제


groupadd 그룹명

groupdel 그룹명



그룹에 대한 정보는 /etc/group 파일에 있으므로 cat 명령어로 확인가능하다.


사용자가 속한 그룹을 보고 싶다면 "groups 계정명"을 입력하여 볼 수 있다.



디렉토리 관리


1. 파일목록 표시



ls [op] [directory]


-l : 파일에 대한 자세한 내용 출력

-a : 현재 디렉토리의 모든 내용 출력(히든, 디렉토리..)

-h : 파일 크기 단위를 변경하여 출력한다.

-F : 실팽 파일이나 디렉터리 등이 쉽게 구분 될 수 있도록 출력

-R : 하위 디렉터리 내용 함께 출력


alias : 미리 명령어를 지정해놓은 것.

alias는 .bashrc 파일에 있다. 90번 라인쯤으로 이동하면 (":90" 명령어를 이용하여 90라인으로 이동가능하다.)

vi로 alias를 추가한다.

.bashrc의 경우 로그아웃 후 로그인 하면 다시 적용이 된다. 하지만 이런 과정없이도 source명령어를 통해 업데이트 할 수 있다.

source .bashrc

후에 alias 명령어를 실행해보자.



2. 디렉토리 생성 및 삭제


mkdir [op] [디렉토리 명]


-m : 디렉토리의 권한 지정 default는 755(rwxr_xr_x)

-p : 상위 디렉토리가 존재하지 않으면 상위 디렉토리도 만든다.


rmdir [op] [디렉토리 명]


-p : 상위 디렉터리도 지운다. 단 폴더가 비어 있지 않은 경우 삭제 불가능


파일 관리


1. 파일의 종류

프로그램들은 주변의 장치를 파일로 인식하기 때문에 , 파일의 종류가 다양하게 존재하게 된다.


- : 일반 파일

b : 블록 디바이스 파일

c : 문자열 디바이스 파일

d : 디렉토리

l : 심볼릭 링크

s : 소켓

p 또는 = : 명명된 파이프


2. TOUCH


touch [op] 파일이름


-c : 현재 시간으로 파일 시간을 변경

-d [yyyy-MM-dd hh:mm:ss] : 현재 시간 대신 지정한 시간('yyyy-MM-dd hh:mm:ss')으로 파일 시간을 변경

-t [yyyyMMddhhmm.ss]: 현재 시간 대신 지정한 시간('yyyyMMddhhmm.ss')으로 변경


3. CP


: 파일을 복사하는 명령어


cp [op] [원본] [사본]


-a : 파일의 속성, 링크 정보를 유지하면서 복사

-i : 이름이 겹치는 파일이 존재하면 덮어씌울지 말지를 결정한다.

-f : 복사한 곳에 같은 이름의 파일이 존재하면 강제로 덮어씌운다.

-R : 디렉토리의 경우 그 안에 포함된 모든 하위 디렉토리 및 파일을 함께 복사한다.


4. MV


:파일을 이동시키는 명령어


mv [op] [원본] [이동 목적지]

-b : 덮어 쓰게 되는 경우 백업 파일을 만들고 파일을 만든다.

-i : 이름이 겹치는 파일이 존재하면 덮어씌울지 말지를 결정한다.

-f : 강제로 덮어씌운다.


5. RM


: 파일 삭제 명령어


mv [op] 파일이름

-r , -R : 일반 파일이 아닌 디렉터리인 경우 그 하위 디렉터리와 파일 까지 모두 삭제

-i : 파일을 삭제 할 것인지 사용자에게 물어본다.

-f : 강제


6. CAT


: 파일의 내용을 화면에 출력한다


cat [op] 파일 이름


-n : 줄 번호를 표시

-b : 빈 행은 제외하고 줄 번호를 표시한다.

-E : 각 행마다 끝에 $ 문자를 출력한다.


7. FIND


: 다양한 조건으로 특정 파일을 찾는다. 시작 디렉토리를 지정한다.


find [시작 디렉토리] [조건]

-name "문자열" : '*' , '?'등을 이용하여 검색조건을 지정할 수 있다.

-user "유저이름" : 특정 유저가 소유한 파일들을 모두 찾는다. 

-perm "퍼미션" : 퍼미션으로 된 파일을 찾는다. 

-type ? : 파일의 종류를 검색한다.

-size : 파일 크기

-atime : 날짜


8. GREP


: 파일 내에서 또는 입력 값으로부터 특정 패턴 검색


grep [op] 표현 [파일]


-v : 일치되는 내용이 없는 라인을 표시한다.

-c : 일치되는 내용이 있는 행의 개수

-n : 일치되는 내용이 있는 행은 행 번호화 함께 표시


9. PIPE


:프로그램의 실행결과를 다른 프로그램의 입력으로 연결.


ex) ps -ef | grep sshd


10. REDIRECTION


: 리다이렉션을 이용하면 명령의 출력을 변경할 수 있다. default는 터미널(stdout)이지만, 리다이렉션을 이용하면 파일에 기록할 수 있다.


명령어 > 파일 : 파일이 없으면 생성, 있다면 기존의 내용을 지운다.

명령어 >> 파일 : 파일이 없으면 생성, 있다면 기존의 내용에 추가

명령어 < 파일 : 파일에서 표준 입력을 받는다


echo "문자열" : 주어진 문장을 터미널에 출력시킨다.

sort : 입력을 순서대로 정렬하는 명령어



11. chown


: 파일 소유자나 소유그룹을 변경하기 위한 명령어


chmod [op] 소유자:소유그룹 파일명

 

-R : 경로와 그 하위 파일들을 모두 변경



파일 압축 관리


1. tar


:기본적으로 압축을 하지 않고 묶어 주는 역할(아카이브)을 한다.


tar [op] 생성파일.tar 묶을 파일   : 묶을 때


tar [op] 파일.tar   : 해제시


-c : 새 저장 파일을 만든다.

-x : 묶인 파일을 해제한다

-v : 퍼리 중인 파일을 자세하게 보여준다.

-f : 파일을 지정한다

-z : gzip을 해제 또는 압축한다.

-j : bz2 압축 또는 해제


tar는 기본적으로 압축이 아닌 파일을 묶어주는 역할만 하게 된다. 때문에 10개의 파일을 tar파일로 생성한다 해서 크기가 줄어들거나 하지 않는다. 


2. gzip


: 파일 압축을 한다


gzip [op] 파일 : 파일을 압축한다.


-d : 압축 해제


'Programming > 리눅스' 카테고리의 다른 글

Linux admin 2일차  (0) 2018.11.19
Linux Admin 1일차  (0) 2018.11.16
아카이브를 받을 수 없습니다.  (0) 2018.03.09
리눅스 기본 명령어 정리  (0) 2018.01.17
[리눅스/CentOS7] 싱글 모드 진입하기  (0) 2017.08.14
[리눅스]한글이 안 써질 때  (0) 2017.08.13

리눅스 소개


  1. 무료
  2. POSIX(Portable Operating System Interface)와 100퍼센트 호환
  3. 서버 환경 뿐망 아니라 데스크톱, 임베디드, 안드로이드와 같은 스마트폰과 스마트 TV 등에 포팅되어 운영되고 있는 광범위하고 다양한 시스템에 이용되고 있다. ( 다양한 컴파일러를 가지고 있기 때문에 소스코드만 있다면 지원하고 있는 컴파이러를 이용하여 컴파일 가능)
  4. Unix 운영체제의 특징을 모두 가지고 있다.( 멀티 유저, 멀티 프로세스, 멀티 프로세서, 멀티 스레드)
  5. 여러 사용자가 하나의 시스템을 사용하기 때문에 계정과 비밀번호 그리고 홈 디렉토리로 사용자를 구분 하며 계정별 권한과 제약을 두어 시스템 보안을 제공.

리눅스는 크게 커널과 사용자 계층으로 나누어 생각할 수 있다.

커널

  1. 실제 운영체제를 구성하는 핵심 부분
  2. 메모리나 프로세스 등의 하드웨어를 관리
  3. 응용프로그램이 커널을 이용할 수 있도록 시스템 호출과 같은 API를 제공. 이 공통된 명령어 집합 -> 드바이스 드라이버


사용자 모드


  1. 응용 프로그램들이 위치하는 영역
  2. 시스템 콜을 호출하기 위한 시스템 라이브러리와 네트워크 통신을 위한 socket 라이브러리 등 다양한 라이브러리를 제공하고 응용 프로그램을 위한 컴파일러를 제공한다.
  3. 사용자는 이러한 프로그램을 쉘(Shell)을 통해 실행할 수 있다.

쉘(Shell) : 커널 외부에서 사용자와 커널 사이의 인터페이스를 제공하는 프로그램

사용자가 입력한 명령어를 해석하고 실행 시킨다(쉘 스크립트)

기본적으로 csh, bsh, bash 등의 쉘 프로그램을 지원하고 사용자는 필요 따라 shell을 바꿀 수 있다.


리눅스 기본 관리



-인스톨 디스크의 파티션


일반적으로 리눅스를 설치할 디스크에 파티션을 나눠서 사용한다.


 파티션

포맷 및 마운트 디렉토리 

 부트 파티션

 ext3, ext4, xfs 파일 시스템으로 포맷.  /boot 디렉토리로 사용 

 루트 파티션 

 ext3, ext4, xfs 파일 시스템으로 포맷.  / 디렉토리로 사용

  swap 파티션 

 swap 영역으로 포맷

 kdump

 ext3, ext4, xfs 파일 시스템으로 포맷.  마운트 x

 데이터용 

 애플리케이션 데이터영역으로 사용


부트 파티션은 커널과 초기 RAM 디스크를 포함.

루트 파티션은 인스톨 예정의 RPM  패키지와 애플리케이션 소프트웨어를 인스톨 할 수 있는 정도의 사이즈가 필요

swap 영역은 RHEL에서 추천하는 다음 계산을 따른다.

메모리가 2GB 이하 : 물리 메모리의 2배

메모리가 2GB 이상 : 물리 메모리 + 2GB

kdump는 물리 메모리 사이즈의 2~3배 정도

데이터용 파티션은 애플리케이션 데이터 영역으로 운용 중에 데이터가 계속 증가할 영역으로 따로 파티션을 잡아두는 것이 좋다.


-기본 개념들

런레벨 : 

- 리눅스는 시스템이 기동될 때 런레벨 값을 참조한다.

- 일반적으로 서버를 운용할 때는 3 또는 5를 지정

- 보통 서버에서는 GUI가 필요가 없기 때문에 3를 지정하는 것이 보통


런레벨  0 : 시스템 정지

    1 : 싱글 유저 모드로 기동 (시스템 복구시 사용)

    2 : 멀티 유저 (네트워크를 사용하지 않는 텍스트 멀티 유저모드)

    3 : 멀티 유저 (일반적인 쉘 기반의 텍스트 멀티 유저 모드)

    4 : 사용하지 않음

    5 : GUI 멀티 유저 모드 (x-window)

    6 : 시스템 재기동


 CRON : 

-시스템 운영에 필요한 일상적이고 주기적인 작업을 지정된 시간에 반복적으로 수행하기 위한 목적

- crond라는 데몬으로 작동하며, 기본적으로 작동하도록 설정되어있음.

- /etc/crontab 이라는 설정 파일과 /etc 아래에 cron.* 로 구성되있다.


로그인 스크립트 :

- 로그인을 하게 되면 몇 가지 설정 스크립트가 실행되고 계정의 환경을 설정하게 된다.

- /etc/profile -> ~/.bash_profile -> ~./bashrc -> /etc/bashrc 순으로 실행된다.


마운트 :

- 특정 디바이스를 사용하기 위해 하드웨어와 디렉토리를 연결하는 작업


원격 터미널 :

- 가상 터미널이라는 장점을 고스란히 제공하면서 네트워크상의 어떤 컴퓨터에서도 접속할 수 있다.

- 보안상 telnet보다 ssh를 많이 사용한다.

SSH : 

설정 -> [http://programmingskills.net/archives/315 ]


별첨

- samba server

- editer : vi, gedit, 자기가 펴한 에디터

'Programming > 리눅스' 카테고리의 다른 글

Linux admin 2일차  (0) 2018.11.19
Linux Admin 1일차  (0) 2018.11.16
아카이브를 받을 수 없습니다.  (0) 2018.03.09
리눅스 기본 명령어 정리  (0) 2018.01.17
[리눅스/CentOS7] 싱글 모드 진입하기  (0) 2017.08.14
[리눅스]한글이 안 써질 때  (0) 2017.08.13

1.비슷한 문제를 풀어본 적이 있던가?



형태가 비슷하거나 관련된 문제를 풀어 본 적이 있다면 이전에 적용했던 방법과 비슷한 접근 방법을 사용할 거라고 예측할 수 있다. 따라서 기존에 접했던 문제가 온전히 경험이 되기 위해 그 원리를 완전히 이해하고 변형할 수 있어야 한다. 


2. 단순한 방법에서 시작할 수 있을까?



비슷한 문제를 본 적이 없거나, 비슷한 문제의 해법이 곧장 적용되지 않는다면 "무식하게 풀 수 있을까?"라는 질문으로 시작한다. 이렇게 만든 단순한 알고리즘에 효율적인 자료 구조를 사용하거나, 계산 과정에서 같은 정보를 두 번 중복으로 계산하지 않는 등의 최적화를 적용해서 충분히 빨라질 때까지 알고리즘을 개선하는 식으로 문제를 풀 수 있다.


3. 내가 문제를 푸는 과정을 수식화할 수 있을까?



손으로 간단한 입력, 예를 들어 문제에 주어진 예제 입력을 직접 해결해보는 것. 자신이 문제를 해결한 과정을 공식화해서 답을 만드는 알고리즘을 만들 수 있는 경우가 흔히 있고, 그렇지 못하더라도 이 과정에서 알고리즘이 어떤 점을 고려해야 하는지를 알게 된다.


4. 문제를 단순화할 수 없을까?



주어진 문제의 좀더 쉬운 변형판을 먼저 풀어보는 것. 문제의 제약 조건을 없애거나, 계산해야 하는 변수의 수를 줄일 수도 있으며, 다차원의 문제를 1차원으로 줄여서 표현할 수도 있다. 단순화된 문제의 해법이 원래 문제의 해법에 대한 직관을 제공할 수 도 있고, 이것을 직접적으로 이용해 원래 문제를 풀 수도 있다.


5.그림으로 그려볼 수 있을까?



문제에 관련된 그림을 그려 보는 것. 많은 사람들의 사고 체계는 숫자의 나열보다 기하하적 도형을 더 직관적으로 받을이기 때문.


6.문제를 분해할 수 있을까?



문제에 주어진 복잡한 조건을 더 단순한 형태를 갖는 조건의 집합으로 분해한다. 한 개의 복잡한 조건보다 여러 개의 단순한 조건이 다루기 쉽기 때문에 이 변형은 종종 유용하다. 


7.순서를 강제할 수 있을까?



순서를 뒤집는 방법의 연장선으로, 순서가 없는 문제에 순서를 강제해서 문제를 푸는 방법도 있다. 순서 강제 기법은 경우의 수를 셀 때도 유용하다. 특정 조건을 만족하는 답들의 수를 세는 문제를 흔히 볼 수 잇는데, 이때 까다로운 것은 한 가지 답을 두 가지 이상의 방법으로 만들 수 있을 때 이답들을 중복하여 세는 경우다. 



8. 특정 형태의 답만을 고려할 수 있을까?



순서를 강제하는 기법의 연장선으로 정규화 기법이 있다. 정규화란 우리가 고려해야 할 답들 중 형태가 다르지만 결과적으로는 똑같은 것들을 그룹으로 묶은 뒤, 각 그룹의 대표들만을 고려하는 방법. 




'3학년 > 알고리즘' 카테고리의 다른 글

6장 알고리즘 설계 패러다임  (0) 2018.11.22
5장 알고리즘의 정당성 증명  (0) 2018.11.22
문제 해결 전략 질문들  (0) 2018.11.16
백준 알고리즘 2294번  (0) 2018.01.16
백준 알고리즘 2870번  (0) 2018.01.15
백준 알고리즘 1003번  (0) 2018.01.15

N+1 Selects 문제


N+1 문제란 ?

조회를 위해 select 쿼리(1번)를 날렸다가 관련 컬럼을 얻기 위해 N번의 셀렉트(N번)를 하게 되는 상황.


같은 결과를 낼지라도, 그 쿼리를 수행하는데에 있어 몇 번의 쿼리를 해야하는지에 따라 성능이 달라진다.


마이바티스의 association에서 Nested Select, Nested Results를 예로 들 수 있다.


Nested Select 는 결과에서 다시 한번 참조를 하기 위해 다음 Select구문을 실행하는 것을 말하고, Nested Results는 조인된 결과물에 대해 반복적으로 사용하여 결과를 맵핑하는 방법을 말한다. 


예시를 보도록 하겠다. (참고 : http://www.mybatis.org/mybatis-3/ko/sqlmap-xml.html#insert_update_and_delete)



위에서 만약 블로그와 저자와의 관계가 (1:N) 상황이라면 N+1의 셀렉트가 발생하게 된다. 각각의 author_id를 위해 셀렉트를 실행한다



하지만 위와 같이 조인된 결과에 대하여 맵핑을 하게 되면 위와 같이 N+1번의 호출이 일어나지 않게 된다.



MyBatis Insert not working



insert 구문을 계속 실행시켰지만 데이터베이스에 적용도 안되고 오류도 안나기에 무엇이 잘못된지 한참 찾아다녔다


결론적으로 SqlSession을 commit()시켜주니 적용이 되었는데, 당연히 JDBC처럼 auto commit이 되어있을 거란 생각을 했었다..


궁금해서 코드를 따라가보니 일단 SqlSessionFactory는 DefaultSqlSessionFactory였고,



이 팩토리의 opensession(boolean autoCommit)부분을 쭈욱 따라가보니 DefaultSqlSession에서 autoCommit이 설정안되있다는 것을 알게되었다. 

 


autoCommit을 설정하고 싶다면 다음과 같이 sqlSession을 생성할 때 true로 설정해야한다




+ Recent posts