shell-script

[Powershell] 포트 정보 조회

파워쉘(Powershell)을 이용한 포트 정보 조회

파워쉘을 이용하면 네트워크 연결 상태에 보다 효율적인 접근을 할 수 있습니다.

이전 명령 프롬프트(cmd)를 이용하면 아래와 같이 할 수 있습니다.

> netstat -anp tcp | findstr 8080

위의 정보는 TCP 연결중 8080 이 포함된 문자열을 검색하라는 뜻입니다.

TCP 연결 상태 조회

Get-NETTcpConnection cmdlet 을 이용하면 현재 운영체제에서 TCP로 연결된 목록을 출력할 수 있습니다.

PS> Get-NetTCPConnection | Select-Object -First 10

LocalAddress                        LocalPort RemoteAddress                       RemotePort State       AppliedSetting OwningProcess
------------                        --------- -------------                       ---------- -----       -------------- -------------
::                                  60625     ::                                  0          Bound                      15984
::                                  60357     ::                                  0          Bound                      21468
::1                                 60625     ::1                                 3306       Established Internet       15984
::                                  49672     ::                                  0          Listen                     708
::                                  49668     ::                                  0          Listen                     700
::                                  49667     ::                                  0          Listen                     2384
::                                  49666     ::                                  0          Listen                     1388
::                                  49665     ::                                  0          Listen                     1192
::                                  49664     ::                                  0          Listen                     600
::                                  17500     ::                                  0          Listen                     18324

위의 명령은 TCP연결중에서 10개의 데이터만 출력하라는 뜻입니다.

특정 포트 정보 조회

그렇다면 TCP 연결중에 원하는 포트만 찾고 싶은 경우에는 다음과 같이 할 수 있습니다.

PS> Get-NetTCPConnection | Where-Object {$_.LocalPort -eq 3306 -and $_.State -eq 'Listen'}

LocalAddress                        LocalPort RemoteAddress                       RemotePort State       AppliedSetting OwningProcess
------------                        --------- -------------                       ---------- -----       -------------- -------------
::                                  3306      ::                                  0          Listen                     8248

포트 정보를 이용해서 프로세스 정보 조회하기

가끔 서버를 설정하다보면 포트 충돌이 발생하는 경우를 확인할 수 있습니다. 그럴 경우 이전에 해당 포트를 사용하는 프로세스를 검색하고 검색된 프로세스를 죽이는 방식으로 처리를 하곤 합니다.

아래의 명령을 통하면 해당 포트를 사용중인 프로세스가 어떤 프로세스인지 확인할 수 있습니다.

PS> $pid3306 =  Get-NetTCPConnection | Where-Object {$_.LocalPort -eq 3306 -and $_.State -eq 'Listen'} | select-object -ExpandProperty owningprocess

PS>  Get-Process | Where-Object {$_.ID -eq $pid3306}
Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    230      22   445112      79396       0.20   8248   5 mysqld

결과는 3306 포트를 사용중인 프로세스는 mysqld 라는 프로세스입니다.

아직 파워쉘(Powershell)을 사용한지 오래되지 않았지만 확실하게 느낄 수 있는 것은 Batch 프로그램 보다는 효율적인것 같습니다.

기본
git

[Git] Powershell 에서 한글 깨짐

Powershell 에서 git log 명령 실행시 한글로 작성된 커밋 메시지가 깨져 보이는 현상


commit bd269780b5c888b0ea86939f3dd08c12e68ef595
Author: coozplz <coozplz@gmail.com>
Date:   Mon Aug 22 19:44:26 2016 +0900

    ?뚯씠釉??뺣낫 異붽?

commit 23f13d59f8bc9f7e53fc91f322b8dfbbfddf0f95
Author: coozplz <coozplz@gmail.com>
Date:   Mon Aug 22 16:51:15 2016 +0900

    臾몄꽌 ?낅뜲?댄듃

위와 같은 문제 해결을 위해 git 명령 실행 결과를 디코딩과 인코딩 하는 작업을 하면서 확인 했었는데 보다 간단한 해결 방법을 찾았습니다.

1. Powershell 프로필 위치 확인

PS C:> $profile
C:\Users\coozplz\Documents\WindowsPowerShell\Microsoft.PowerShellISE_profile.ps1
$profile 결과는 출력되는데 해당 위치에 파일이 없다면 위와 같은 경로에 파일을 생성해주세요.

2. $profile 값에 인코딩 변경 추가

# filename: Microsoft.PowerShellISE_profile.ps1

$env:LC_ALL='C.UTF-8'

3. Powershell 창에서 확인

commit bd269780b5c888b0ea86939f3dd08c12e68ef595
Author: coozplz <coozplz@gmail.com>
Date:   Mon Aug 22 19:44:26 2016 +0900

    테이블 정보 추가

commit 23f13d59f8bc9f7e53fc91f322b8dfbbfddf0f95
Author: coozplz <coozplz@gmail.com>
Date:   Mon Aug 22 16:51:15 2016 +0900

    문서 업데이트

정상적으로 표시되는 것을 확인할 수 있습니다.

기본
review

[키보드] Filco – Minila

약 3개월 전에 구매한 키보드입니다. 저는 미니키보드에 대한 약간의 애정이 있습니다.

이번에 키보드를 검색하다 Filco Minila 키보드에 빠져 결국은 지르게 되었습니다.

3개월정도 열심히 쓰니 손에 너무 익어 불편함을 모르고 있습니다. 해피해킹DELETE 키 위치가 서로 달라 고생은 하지만 충분히 사용해볼 가치가 있는 키보드인거 같습니다.

그리고 최근 키캡만 AliExpress에서 구매하여 변경했습니다.

제가 여러가지 미니 키보드를 써보고 느낀점은

키가 적으면 적을수록 익히기가 어렵다.

이상입니다.

사진상에 나오는 키보드는 해피해킹Filco Minila입니다.

이 슬라이드 쇼에는 JavaScript가 필요합니다.

기본
javascript

[요약] High Performance Javascript

전역 변수에 대한 접근은 모든 브라우저에서 느려진다.


function initUI() {
    var bd = document.body;
    var links = document.getElementsByTagName("a");
    var i = 0;
    var len = links.length;

    while (i < len) {
        update(links[i++]);
    }

    document.getElementById('go-btn').onclick = function() {
        start();
    };

    bd.className = 'active';
}

위의 예제에서는 document 객체를 3번이나 참조하므로 느려진다.
그렇기 때문에 전역변수를 로컬 변수로 변환해서 사용하면 성능이 향상된다.

// 변경 로직
function initUI() {
    var doc = document;
    var bd = doc.body;
    var links = doc.getElementsByTagName("a");
    var i = 0;
    var len = links.length;

    while (i < len) {
        update(links[i++]);
    }

    doc.getElementById('go-btn').onclick = function() {
        start();
    };

    bd.className = 'active';
}

클로저를 사용할 때는 항상 주의를 해야 한다.

동적 코드를 생성하는 eval() 함수의 사용은 자제 하는게 좋다.

멤버가 깊이 중첩될수록 데이터 접근이 더 느려진다.

windows.location.href.toString() 보다 window.location.href 를 더 빨리 해석한다.

// Bad
window.location.href

// good
location.href

DOM이 하나의 대륙이고 자바스크립트가 다른 대륙인데, 두 대륙을 아주 긴 다리로 연결했다고 생각하면 이해하기 쉽다.

아래의 로직은 innerHTML 값을 읽기 위해 한번 접근하고 그 값을 수정하기 위해 한번 더 DOM 에 접근한다.

// Bad
function innerHTMLLoop() {
    for (var count = 0; count < 15000; count++) {
        document.getElementById('here').innerHTML += 'a';
    }
}

// Good
function innerHTMLLoop() {
    var content = '';
    for (var count=0; count < 15000; count++) {
        content += 'a';
    }

    document.getElementById('here').innerHTML += content;
}

예기치 못한 무한루프

  • document.getElementsByName()
  • document.getElementsByClassName()
  • document.getElementsByTagName()

HTMLCollection 객체에 접근하는 함수는 호출 될 때 마다 DOM 모델에서 모든 객체를 대상으로 하므로 아래의 코드는 무한 루프에 빠진다.

var allDivs = document.getElementsByTagName('div');
for (var i=0; i<allDivs.length; i++) {
    document.body.appendChild(document.createElement('div'));
}

아래의 코드는 HTMLCollection이 아니므로 반환된 노드는 문서 구조를 동적으로 변경하지 않는다.

var elements = document.querySelectorAll('#menu a');

알고리즘

  • for 문
  • while 문
  • do while문
  • for-in 문

위의 4가지 반복문중에서 for-in 문의 성능이 가장 낮다. 객체에 많은 속성이 포함되어 있다면 for-in 문은 사용을 자제해야 한다.

루프의 순서

일반적인 프로그래밍 언어에서는 루프의 순서를 거꾸로 하기만 해도 성능이 향상된다.
실행 조건을 평가 할 때 단순히 0과 비교.

for (var i=0; i<items.length; i++) {
    process(items[i]);
}

// Better

for (var i=items.length; i > 0; i--) {
    process(items[i])
}

조건문

  • if-else
  • switch

조건이 적을 때는 if-else 구문을 사용하고 조건이 많은 경우에는 switch 구문을 사용한다. if-else 구문은 조건이 많아 질 수록 느려진다.

if-else 구문을 사용할 때도 자주 발생하는 조건을 우선적으로 적으면 성능이 향상된다.

문자열과 정규 표현식

정규 표현식의 효율성을 올리는 방법

  1. 실패할 거라면 되도록 일찍 실패하게
  2. 단순하고 꼭 필요한 토큰으로 시작
  3. or 연산자를 줄이고, 써야 한다면 적용 범위를 작게
  4. 정규식을 뼌수에 할당해서 재사용
  5. 복잡한 정규식을 간단한 조각으로 분리

응답성 좋은 인터페이스

  • 자바스크립트 코드가 100밀리초 이상으로 실행되서는 안된다.
  • 오래 걸리는 작업을 타이머로 분리해서 실행한다.
  • 큰 JSON 문자열의 파싱 작업은 web worker 를 이용해서 별도로 처리하도록 한다.
기본
read

[후기] 테스트 주도 개발

  • 지은이: 켄트 백
  • 옮긴이: 김창준, 강규영
  • 출판사: 인사이트
  • 출간일: 2014년 2월

중요
– 1. 오직 자동화된 테스트가 실패할 경우에만 새로운 코드를 작성한다.
– 2. 중복을 제거한다.

프로그래밍 순서

  • 빨강 – 실패하는 작은 테스트를 작성한다.
  • 초록 – 빨리 테스트가 통과하게끔 만든다.
  • 리팩토링 – 일단 테스트를 통과하게만 하는 와중에 생겨난 모든 중복을 제거한다.

매크로를 이용하여 테스트를 작성한 후 얻은 교훈

  • 테스트가 충분히 빨라서 내가 직접, 자주 실행할 수 있게끔 만들자.
  • 많은 오류가 반드시 어머어마한 양의 문제는 아니다.

TDD가 XP의 어떤 부분을 향상 시키는가?

  1. 짝 프로그래밍
    TDD를 하면서 작성하게 되는 테스트는 짝 프로그래밍 과정에서 뛰어난 의사소통 수단이 된다.
  2. 활기차게 일하기
    XP에서는 기운이 있을 때 일을 시작해서 지치면 그만할 것을 권유한다. 테스트를 통과하지 못하겠거나, 어떤 테스트 두 개를 동시에 통과하도록 만들 방법을 모르겠다면 쉬어라.
  3. 지속적인 통합
    테스트를 좀더 자주 통할할 수 있게 해주기 때문에 아주 훌륭한 자원이 된다. 새로운 테스트를 통과시킨 후 중복을 제거했다면 커밋한다. 그렇게 되면 체크인 간격이 15~30분 정도로 단축된다.
  4. 단순 설계
    테스트를 통과하기 위해 필요한 만큼만 코딩하고 모든 중복을 제거한다면 요구사항에 딱 들어맞는 설계를 얻게 될 것이다.
  5. 리팩토링
    중복 제거 규칙은 리팩토링의 또 다른 이름이다. 테스트가 있다면 더 큰 리팩토링을 수행하더라도 시스템의 행위가 변하지 않았다는 자신감을 얻을 수 있게 된다.
  6. 지속적인 전달
    TDD 테스트들이 정말 당신 시스템의 MTBF(Mean Time Between Failure)를 개선한다면, 고개을 혼란시키지 않으면서도 훨씬 더 자주 코드를 출시할 수 있을 것이다.

추천 도서

  • Smalltalk Best Practice Patterns
기본
git

[Git] master 브랜치 커밋 막기

git-flow를 이용해서 회사 프로젝트를 진행하는데 git-flow에서는 master 브랜치에 대해 커밋을 허용하지 않는 형태로 진행이 됩니다. develop -> feature -> release -> master 브랜치로 머지(Merge)가 되는 형태입니다.

그렇기 때문에 커밋이 발생 했을 때 취소하는 것 보다 문제가 발생되기 전에 해결하는 것이 좋은 방법이라는 생각이기 때문에 git-hook을 이용하여 master 브랜치에서 커밋전에 현재 커밋이 발생되는 브랜치가 master라면 에러 메시지를 출력하고 커밋이 되지 않는 형태로 작성해 봤습니다.

아래 작성한 shell 스크립트에 실행권한을 주고 .git/hook/pre-commit 파일에 입력하면 master 브랜치에서 커밋이 되는 경우를 막게 됩니다.

#!/bin/bash
#
# FILE: .git/hook/pre-commit
#
# DESC: Stop accidental commits to master

BRANCH=`git rev-parse --abbrev-ref HEAD`

if [[ "$BRANCH" == "master" ]]; then
    echo -e "You are on \e[31m\e[1m[ $BRANCH ]\e[0m branch . You can not directly commit on \e[31m\e[1m[ $BRANCH ] \e[0mbranch"
    echo -e "Please checkout the other branch and commit"
    exit 1
fi


exit 0
기본
read

[후기] 열혈강의 TCP/IP 소켓 프로그래밍

열혈 TCP / IP 프로그래밍

  • 저자: 윤성우
  • 출판사: 오렌지 미디어
  • 기간: 2016.07.13 ~2016.07.15

키워드

네트워크 프로그래밍

  1. TCP / IP
  2. Socket Options
  3. Linux 기반의 네트워크 프로그래밍
  4. Windows 기반의 네트워크 프로그래밍

본것

네트워크 프로그래밍의 기초에 대한 설명이 단계별로 잘 되어 있는 책이라는 생각이듭니다.
소켓(Socket), 주소체계, TCP, UDP, Gracefull Shutdown, 소켓 옵션, 서버 아키텍쳐등 많은 내용이 아주 체계적으로 잘 되어 있습니다.

그리고 Linux와 Windows에서 다르게 구현 되는 부분을 잘 설명해 놨기 때문에 두가지 환경에서 모두 구현하는데 도움이 될 만한 책인 것 같습니다.

책 중간에 나오는 잠시 JAVA 얘기를: 열려있는 사고를 지니자! 는 간략하지만 제가 느끼는 부분과 비슷한 내용인 것 같습니다.

예전에 학원 강좌에서 Java 네트워크 부분에서 Java에서는 소켓을 연결하지 아주 쉽습니다.

Socket s = new Socket("192.168.10.1", 8888);

위와 같이만 하면 연결 끝입니다. 이런 내용을 듣고 네트워크 프로그래밍 뭐 별거 아니네... 이런 생각을 했는데 프로그래밍을 하면 할 수록 네트워크 부분은 점점 어려워 지는 것 같습니다.

깨달은것

멀티 프로세스 방식은 Java로 서버 개발을 하면서 사용한 적이 없고 멀티 플렉싱 방식은 Java NIO 패키지의 비동기 소켓으로 예제 정도만 구현을 해봤는데 이전 보다 조금 더 알게 된 것 같습니다.

그리고 Windows IOCP는 예전 한국 리눅스 유저 그룹 에서 EPOLL과 열딘 토론의 글을 본적이 있어서 관심은 있었지만 실제로 사용해 본적이 없어 어떤 시스템이라는 막연한 부분이 있었는데 대략적으로 어떤 흐름이다라는 것은 알게 되었습니다.

적용할 것

  • 멀티프로세스 방식, 멀티플렉싱 방식 그리고 멀티 스레드 방식의 서버를 각각 구현해 성능 테스트를 해보자.
  • Windows IOCP 서버를 구현해보자.
  • 네트워크프로그래밍 강좌에서 받은 Windows IOCP 배틀넷 서버 소스를 분석해보자.
기본