3-way handshake 

 3-way handshake란 TCP/IP 에서 호스트와 서버가 Connection 을 맺을때 수행되는 전송제어 프로토콜(Transmission Control Protocol) 이다.  (SYN-SYN-ACK 라고도 한다.)

순서는 다음과 같다. Host A가 server, B는 client라고 가정하자.

1. HOST A는 B에게 TCP SYNchronize packet을 보낸다
2. B는 A에게  SYN 패킷을 받는다. 이후 SYNchronize-ACKnowledgement 패킷을 보낸다.
3. A는 B의 SYN-ACK를 수신후 다시 A에게 ACKnowledge 패킷을 보낸다.
4. B가 ACK를 수신하고 TCP 소켓이 ESTABLISHED 된다.

 

 위 그림에서 SYN 패킷을 보낼때, M과 N이 보이는데 이는 Sequence Number 라 한다, 여기에 랜덤한 숫자가 담겨진다. 초기 Sequence Number를 ISN이라 하는데, 이는 0이 아닌 랜덤한 숫자가 보내진다. 
 

왜 ISN에는 랜덤한 수가 담겨질까?

 https://www.quora.com/Why-in-a-TCP-sequence-is-a-number-taken-as-a-random-number-and-what-is-the-actual-number-at-the-start?awc=15748_1574583388_8da30461914e738de7495e39d9ab34b1&uiv=6&txtv=8&source=awin&medium=ad&campaign=uad_mkt_en_acq_us_awin&set=awin&pub_id=85386

 

Why in a TCP sequence, is a number taken as a random number and what is the actual number at the start?

Answer: There are two underlying reasons for the use of random sequence number Why they came into existence? The port numbers in TCP connections come from a finite range and, as such, are reused over time. As such, it is possible that two communicating hos

www.quora.com

 

단순히 응답을 주고받는데 2-way Handshake면 충분해보이지 않는가? 왜 3-way 일까?

 TCP/IP 통신은 양방향성 connection 이다. A host가 B host에게 존재를 알리고 패킷을 받을수있다는 것을 증명하듯이, B host도 패킷을 보낼수 있다는 신호를 보내야한다. 이는 2-way handshaked에서는 성립될 수 없다.

 

4-way handshake

 TCP연결이 해제 될때는 FIN 패킷, ACK 패킷을 각각 한번 씩 주고 받으면서 연결을 종료 하게 된다. 이를 4 way handshake라 한다


ESTABLISHED 된 소켓을사용하는 A Host와 B Host가 있다. A HOST는 이제 연결을 종료하려고한다.
 1) A host는 B호스트에게 FIN Flag 패킷을 보내고 socket의 상태가 FIN_WAIT_1 이 된다.
 2) FIN 을 수신한 B는 ACK를 전송하고 socket의 상태가 CLOSE_WAIT로 변경한다.
 3) ACK를 수신한 A는 B가 잘받았다고 판단하고 FIN_WAIT_2 의 상태로 소켓을 변경한다.
 4) B는 A에게 FIN을 전송하고 소켓을 LAST_ACK로 변경한다.
 5) FIN을 수신한 A는 B에게 ACK를 전송한뒤 상태를 TIME_WAIT 상태로 변경한다.
 6) B는 ACK를 수신하고 소켓을 CLOSED 한다.

 

CLOSE_WAIT 와 TIME_WAIT 상태란 무엇일까?

 TIME_WAIT 상태로 대기하는(60s) 이유는, 세션 종료후, 혹시나 네트워크에 아직 라이브 패킷이 존재할수도 있기때문이다.

process와 thread의 차이점?

 

 

Scenario


최근 git cli를 사용하려고 노력중이다보니, Source tree를 사용하지 않고 직접 cmd를 치다보면 merge를 해야할지 rebase를 해야할지, 헷갈리때가 있다. 또한 옵션에 대해서도 잘 모르고 써었는데 한번 정리해보자 한다.

 

 

Solution


기본적으로 git pull = git fetch + git merge 이다.

그러면 어느때 git merge를 쓰고 어느때 git rebase를 써야할까?

 

Merge

현재 C2 parent에서 brach가 둘로 분기되었다 가정하자
master로 checkout 한후 merge 하였다. (checkout master && merge experiment)

위의 경우가 통상적인 merge 방법이나 이렇게 되면 작업 history가 가시적일 순 있어도 branch가 많아지면 많아질수록 알아보기가 어려워진다. 사람들은 이러한 이유로 rebase를 쓴다.

 

rebase

똑같은 상황 가정

 

 

'experiment에서 master rebase (checkout experiment && rebase master) 

master 브랜치를 Fast-forward시킨다 ('앞으로 진행한' 커밋인 master 브랜치 포인터는 최신 커밋으로 이동한다. 이런 Merge 방식을 'Fast forward'라고 부른다.)

 

완료후 정리된 커밋모습

 

위와같이 c3` 커밋메세지 기반으로 history가 정리됨을 알수있다.

tip) git rebase [basebranch] [topicbranch] 처럼 인자를 준다면 일일히 checkout 하지 않고 rebase할 수있다.

위 그림같은 경우는
$ git rebase master experiment

 

 

 Merge

Rebase 

 특징

 -  branch의 최종 결과만을 가지고 합병

 - 지정한 브랜치를 베이스로 기준 삼아 합병

 - 중복수정된 로그가 남지않는다.

 - 브랜치의 변경사항을 순서대로 다른 브랜치에 적용하면서 합병

 장점

 - 이해하고 사용하기 쉬움

 - 브랜치 컨텍스트 유지

 - history가 단순해짐

 - branch가 많을때 커밋을합치는 직관적인방법

 단점

 - 히스토리가 난잡

 - 커밋 순서대로 rebase를 하는데, 각 커밋마다 충돌해소를 순서대로 해주어야하여 복잡함

 

추가유용 명령어
- FILE 되돌리기 및 삭제편

git checkout [-- 파일명]
아직 스테이징이나 커밋을 하지 않은 파일의 변경내용을 취소하고 이전 커밋상태로 돌린다. svn에서 revert와 동일하다 (그냥 git checkout branch를 할경우 현재 활성화된 브랜치를 바꾸는 명령어이다)  

git checkout -- . wd에 수정된내용 모두 되돌림

git diff [--cached]
스테이징영역과 현재 작업트리의 차이점을 뵤어준다. --cached 옵션을 추가하면 스테이징영역과 저장소의 차이점을 볼 수 있다. git diff HEAD를 입력하면 저장소, 스테이징영역, 작업트리의 차이점을 모두 볼 수 있다. 파라미터로 log와 동일하게 범위를 지정할 수 있으며 --stat를 추가하면 변경사항에 대한 통계를 볼 수 있습니다.
git diff --ours 머지이전과 머지이후 결과비교

git reset — hard HEAD^
commit한 이전 코드 취소하기

git merge --abort 머지 취소하기(커밋이나 stash 하지않는 존재시 못함)

git config — global user.name “user_name ”
git 계정Name 변경하기

git config — global user.email “user_email” 
git 계정Mail변경하기

git stash / git stash save “description”
작업코드 임시저장하고 브랜치 바꾸기

git stash pop
마지막으로 임시저장한 작업코드 가져오기

git reset HEAD [-- filesName] stage에 있는 파일 내리기

git reset — soft HEAD^ 
코드는 살리고 commit만 취소하기

git reset — merge 
merge 취소하기

git reset — hard HEAD && git pull  git 코드 강제로 모두 받아오기

git reset --hard HEAD 머지하기이전상태로 모두되돌림

git reset --[hard] [mixed] [soft] 

--hard: reset하기 전까지 했던 staging area, working directory의 작업까지 모두 reset!
(모든 게 잘못됐어! 나 돌아갈래~ 꽃피던 때부터 정갈하게 다시 해보자!)
--mixed(default): staging area은 reset, reset하기 전까지 했던 working directory의 작업은 남겨둠.
(현재 작업물은 지우긴 싫고, 이전 버전으로 돌아가서 add할지 말지 결정해야 할 때)
--soft: reset하기 전까지 했던 staging area, working directory의 작업은 남겨둠.
(reset한 버전과 현재까지의 작업을 합쳐 새로운 버전 만들 때)
git reset --hard 커밋된 파일빼고 모두삭제
git clean -df 커밋,stage 되지 않은 파일 폴더 모두삭제 [untrack 중인] (매우 유용) 

 

-- 유용한명령어들

git add .
git commint -m "{msg}"
git remote -v  --list all
git remote set-url origin "{repo-url}"
git remote add origin "{repo-url}"
git remote remove origin
git push --set-upstream origin master 초기
git config --list
git commit --author "asd<asd@gmail.com>" -m
git log --graph --oneline --all  로그를 커밋메시지는 한줄로 그래프형태로 모두보기
git log --graph --oneline --all --pretty="format:[%h]%s - %an" 커미터지정해서 보기

+git stash

stash는 다시 한번 말하지만 하고 있던 작업을 잠시 담아두는 역할을 한다.

따라서 명령어는 크게 두 가지만 기억하면 된다.

git stash(=git stash save) : 하던 작업을 저장하고 가장 최근 commit상태로 만든다.

git stash pop 또는 git stash apply : 저장되어 있는 작업중 가장 최근 stash를 가져온다.

이 외에 명령어 옵션들

git stash list : stash 목록을 봄 stash@[숫자]형식으로 보여지며 0번이 가장 최근 1,2,3... 이런식으로 밀림

git stash drop[stash@[숫자]] : stash를 따로 지정하지 않으면 최신의 stash삭제

* git stash pop은 git stash apply + git stash drop을 같이 한 것과 같은 효과임.

  즉, git stash pop은 한번 불러오면 stash 목록에 저장한 시점이 삭제되어있고 git stash apply는 해당 stash를 불러와도 여전히 list에 남아 있음.

 

Scenario


내 프로젝트에서 commons.jar 내부에 있는 commonController의 로직을 바꾸고 싶었다. 내 프로젝트 내부에서 새로 정의한다면 오버라이드 되지 않을까? 하고 생각해보았다.

 

 

Solution


class load scenario
예를 들어보자. 만약 내 프로젝트의 이름은 test이고 test 프로젝트 내부에서 a.jar에 대한의존성을 추가하였다.

a.jar 내부에있는 com.a.a 라는 class가 있었다.  
test 프로젝트 내부에서 com.a.a 라는 경로와 똑같이 class를  만든다면 어느 class가 load가 될까?

-> 정답은 배포되었을시에 web-inf에 있는 classes 폴더에있는 것들이 최우선순위로 load 되고 그다음부터는 lib 내부에 있는 jar들이 알파벳 순서에따라 class가 loadㄷ가 된다.

참고사항: tomcat 실행시 java -verbose:class 옵션을주면  어느 jar에서 load 되었는지 알게해줌
+추가 공부내용: 배포될때 WEB-INF/classes 폴더는 classpath와 관계가 있으니 잘 확인해볼 것

 

 현재 컴퓨터의 환경

Os

 Windows 10

 IDE

 STS 4.1.3

 Jdk

 1.8.0_211

 

1. STS.ini 최적화 설정변경

* 현재 사용중인 STS.ini 설정내용

-Dosgi.requiredJavaVersion=1.8

-vm

C:/Program Files/Java/jdk1.8.0_172/bin/javaw.exe

--add-modules=ALL-SYSTEM

-Dosgi.module.lock.timeout=10

-Dorg.eclipse.swt.browser.IEVersion=10001

-XX:+UseParallelGC

-XX:permSize=128m

-Xms1024m

-Xmx4096m-Dosgi.requiredJavaVersion=1.8
-vm
C:/Program Files/Java/jdk1.8.0_211/bin/javaw.exe
-Xms1024m
-Xmx4096m
-XX:+UseParallelGC
-XX:+UseStringDeduplication
--add-modules=ALL-SYSTEM
-XX:permSize=128m
-Xverify:none
-XX:+UseParallelGC
-XX:+AggressiveOpts
-XX:-UseConcMarkSweepGC
-XX:PermSize=128M
-XX:MaxPermSize=128M
-XX:NewSize=128M
-XX:MaxNewSize=128M
-XX:NewSize=128M

 

 

  • 선택사항

-Xverify:none

-XX:+UseParallelGC

-XX:+AggressiveOpts

-XX:-UseConcMarkSweepGC

-XX:PermSize=128M

-XX:MaxPermSize=128M

-XX:NewSize=128M

-XX:MaxNewSize=128M

-XX:NewSize=128M

  • 설명

1) -vm 

    C:/Program Files/Java/jdk1.8.0_172/bin/javaw.exe 

    >이클립스에서 사용할 JDK

2) -Dosgi.requiredJavaVersion=1.8

    > 이클립스가 사용할 최소버전의 JDK

3) -Xverify:none 

    > 설정시 이클립스 초기 구동시 클래스 및 플러그인의 유효성 검사를 건너뛰겠다는 의미이며 구동속도 향상

4) -XX:+UseParallelGC

   > 병렬 가비지 컬렉션사용, 병렬처리로 인한 처리속도 향상

5) -XX:+AggressiveOpts

   > https://www.opsian.com/blog/aggressive-opts/

6) -XX:-UseConcMarkSweepGC

   > http://zzikjh.tistory.com/entry/Java-GC%ED%83%80%EC%9E%85-%EB%B0%8F-%EC%84%A4%EC%A0%95-%EC%A0%95%EB%B3%B4

7) -XX:PermSize=128M

   -XX:MaxPermSize=128M

   > JVM 클래스와 메소드를 위한공간이며 Out of Memory 발생시 크기 상향조절

8) -XX:NewSize=128M

   -XX:MaxNewSize=128M

   > 새로 생성된 객체들을 위한 공간

9) -Xms1024m

   > 이클립스가 사용하는 최소메모리

10) -Xmx4096m

  > 이클립스가 사용하는 최대메모리 - 사용할 컴퓨터에따라 할당크기를 변경해줘야됨.

 

2. 이클립스 Show Heap Status

 - Window > preferences > General - Show heap status 체크

 

3. 스펠링체크 설정 해제

 - Window > preferences > General > Text Editors > Spelling - Enable spell checking 체크해제

 

4. Automatic Updates

 - Window > preferences > Install/Update > Automatic Updates - Automatically find new updates and notify me 체크해제

 

5. 이클립스 인코딩 UTF-8 설정

- Window > preferences > General >Workspace - Text file encoding

 

6.Controll 눌렀을시 느려지는 현상 해결

- Window -> Preferences -> General -> Editors -> Text Editors -> Hyperlinking 나는 다 uncheck

Scenario


스프링 시큐리티 소스를 적용하려고 했는데, 소스 옆에 GA 및 SNAPSHOT이라는 태그가 붙여 있었다. 가장 높고 최신 버전의 소스가 좋은 것인지 아니면 무엇을 보고 판단해야 할지 모르겠어서 포스팅

 

 

Solution


- GA (General Availability) - 테스트가 완료된 정식 릴리즈 버전으로 안정적으로 운영되어야 하는 프로젝트에서 사용. 대부분 GA 버전을 가져다 사용하면 된다.

- RC (Release Candidate) - 베타 버전이다. 정식 릴리즈 버전은 아니므로 기능은 픽스되었으나, 안정적 동작은 보장할 수없다.

- M (Milestone) - 테스트 버전이다. 아직 기능이 픽스되지 않아 구현될때마다 테스트 버전이 릴리즈 될 수 있다.

- SNAPSHOT - 스냅샷이 붙으면 아직 개발단계라는 의미이며, 일종의 백업시점인 것이다.

Scenario


깃 헙이나, 외국 사이트를 돌아다니다 보면 보일러 플레이트 코드란 말을 많이 들을 수 있다. 이 '보일러 플레이트' 코드란 무엇일까?



Solution


boilerplate code; boilerplate
보일러플레이트 코드; 보일러플레이트, 상용구 코드, 상용구
  • 최소한의 변경으로 재사용할 수 있는 저작품
  • 적은 수정만으로 여러 곳에 활용 가능한 코드, 문구
  • 각종 문서에서 반복적으로 인용되는 문서의 한 부분 

제타위키 펌



Scenario


윈도우에서 BitNami에서 제공하는 패키지로 RedMine을 설치했는데, DB를 MySQL 에서 MariaDB로 변경하고 싶었다.



Solution


1. 레드마인 메인 서버

 -bitnami설치(설치는 설명없음)

 -DB Migtion (처음 설치 시 필요없는 작업)


2. 레드마인 DB 서버

 -mysql 설치 (설치는 설명없음)

 -DB 복원(처음 설치 시 필요없는 작업)


3.mainserver 에서 DB연동

DB를 연결시켜주는 부분

- C:\Bitnami\redmine\apps\redmine\htdocs\config - (본인이 설치한 경로)



4.database.yml  수정

  

  adapter: 해당어댑터(bitnami는 mysql2)

  database: Redmine_DBname 예)bitnami_redmine

  host: DB_Server_IP 예)127.0.0.1 예는 이렇지만 서버 분리할 경우 mysql설치한 서버의 IP겠죠

  username: mysql_ID 예)bitnami *root로 해도 상관 없음

  password: mysql_PW

  encoding: utf8

  port: mysql_port(기본은 3306)


이후 Maria DB에도 레드마인과 관련된 기본 데이터를 넣어주어야한다.


5.    세션 생성

http://dev.mysql.com/downloads/connector/c/6.0.html#downloads 사이트에서

mysql-connector-c-noinstall-6.0.2.zip을 받아서 lib 밑에 있는 libmysql.dll을 넣어 준다.

입력 : 경로\redmine\redmine-2.3.3 -> rake generate_secret_token



6.   DB migrate 실행 (아마 여기서부터 시작하면 된다)

입력 : 경로\redmine\redmine-2.3.3 -> rake db:migrate RAILS_ENV=production




7.  기본 데이터 입력

입력 : 경로\redmine\redmine-2.3.3 -> rake redmine:load_default_data RAILS_ENV=production

(명령어 실행 중 언어선택 메시지가 나오면 ko라고 입력한다.)


8.  서버 기동

입력 : 경로\redmine\redmine-2.3.3 -> ruby script/rails server webrick -e production

 

9.  확인

http://localhost:3000/


BitNami로 설치하면 기본적으로 MySQL이 설치되니, Maria DB로 연동후 MySQL은 삭제할것


참고: http://pinkwony.tistory.com/1

Atom 에디터 단축키 (Windows 기준)


Editor


Ctrl + Shift + P: 커맨드 팔레트 열기

Ctrl + P : 트리뷰 내 파일 찾기.  [eclipse: Ctrl + Shfit + F]

Ctrl + ,: 설정 뷰

Ctrl + .: 키 바인딩 보기 (단축키 작동 현황 보기)

Ctrl + K > 방향키: 패널 나누기

Ctrl + K > Ctrl + 방향키: 패널 전환

Ctrl + W: 창(패널) 닫기

Alt + \ or Ctrl + 0: Treeview 포커스 전환

Ctrl + \: Treeview 열기/닫기

Ctrl + K > Ctrl + B: Treeview 열기/닫기

Ctrl + Shift + L: 언어 선택

Ctrl + Shift + M: Markdown 프리뷰

Ctrl + Shift + U: 인코딩 설정

Ctrl + Alt + I: 개발자 콘솔 열기

Esc: 열린 기능 패널 닫기 및 취소

F11: 전체화면

Tree View (활성화 상태일 때)


A: 새로운 파일 생성

Shift + A: 새로운 폴더 생성

M or F2: 파일(폴더) 경로 및 이름 변경

Delete or Backspace: 파일(폴더) 삭제

D: 파일(폴더) 복사

J, K 커서 이동

H, L 선택 열기/닫기



Tab


Ctrl + T: 파일 파인더 열기 (탭 전환)

Ctrl + B: 열린 파일 보기 (탭 전환)

Ctrl + Tab: 다음 탭 전환

Ctrl + Shift + Tab: 이전 탭 전환

Ctrl + Pagedown, Pageup: 다음/이전 탭 전환

Crtl + Shift + T: 최근에 닫은 탭 다시 열기

Alt + 숫자: 열린 탭 전환



General Editing


Ctrl + /: 주석 토글

Ctrl + F: 찾기/바꾸기

Ctrl + Shift + F: 프로젝트 전체에서 찾기

Ctrl + E: 선택 영역을 찾기/바꾸기

Ctrl + G: 라인 번호로 커서 이동

Ctrl + R: 키워드로 이동

Ctrl + M: 블럭 매칭

Ctrl + J: 라인 조인

Ctrl + L: 라인 선택

Ctrl + D: 현재 단어 선택 (이후 전체 범위에서 같은 단어 선택)

Ctrl + Backspace, Delete: 단어 별 삭제

Ctrl + Shift + K: 현재 라인 삭제 [Eclipse Ctrl + d]

Ctrl + Shift + D: 현재 라인 다음 라인으로 복사 [Eclipse ctrl + alt + ↓]

Ctrl + [, ]: 들여쓰기

Ctrl + Alt + [, ]: 코드 폴딩 토글

Ctrl + Shift + Alt + [, ]: 전체 코드 폴딩 토글

Ctrl + ←, →: 단어 별 이동

Ctrl + ↑, ↓: 현재 라인 이동

Ctrl + Alt + ↑, ↓: 다중 커서 삽입

Ctrl + Enter: 현재 라인 밑으로 개행

Ctrl + Shift + Enter: 현재 라인 위로 개행

Ctrl + Space: 코드 힌트 보기

Shift + 방향키: 텍스트 선택

Shift + Ctrl + ←, →: 단어별 텍스트 선택



Scenario: 인터넷의 이미지 파일들을 저장해서, 이 이미지들의 파일명으로 DB의 프로필 파일이름을 변경시키려고 했다.


Solution: 아닛!! 이렇게 쉬운방법이



▲ 그럼 위와 같이 하면 됩니다.
dir /b >list.txt 로 지정을 하면...  자동으로 list.txt 의 파일을 생성해서 파일목록을 딱 넣어 줍니다.
물론, 파일이름은 임의로 지정할수 있습니다. 꼭 list로 해야하는거 아닙니다.^^













Scenario: 이클립스와 디비를 직접 연결하여 DDL 문장을 직접 써줄 수 도있는데, 사실 나중에 MyBatis를 쓰거나 하면 별로 많이 쓰지 않는 기능이고 많이 느리기때문에 자세한 설명은 생략하고 그림으로 대체하겠다.


Solutions(아래)




































+ Recent posts