[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] 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

    문서 업데이트

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

[키보드] Filco – Minila

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

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

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

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

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

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

이상입니다.

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

이 슬라이드 쇼에는 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 를 이용해서 별도로 처리하도록 한다.

[후기] 테스트 주도 개발

  • 지은이: 켄트 백
  • 옮긴이: 김창준, 강규영
  • 출판사: 인사이트
  • 출간일: 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] 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
이 글은 git 카테고리에 분류되었고 태그가 있으며 님에 의해 에 작성되었습니다.

[후기] 열혈강의 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 배틀넷 서버 소스를 분석해보자.
이 글은 read 카테고리에 분류되었고 태그가 있으며 님에 의해 에 작성되었습니다.

[후기] 리눅스 그냥 재미로(Just for fun)

리눅스 그냥 재미로

  • 제목: 리눅스 그냥 재미로(Just for fun)
  • 저자: 리누스 토발즈, 데이비드 다이아몬트(안진환 역)
  • 출판사: 한겨례신문사
  • 기간: 2016.07.19~2016.07.19

본것

  • 리눅스를 만들게 된 동기와 오픈소스에 대한 철학을 볼 수 있다.
  • 과학 스스로는 돈을 벌어주지 못한다. 부를 창출하는 것은 과학의 부차적 효과이다. 오픈 소스도 마찬가지다.
  • 유닉스는 “작은 것이 아름답다” 라는 철학을 가지고 있다.

외에 전반적인 리누스가 왜 운영체제 개발을 시작했고 어떤식으로 오픈소스 프로젝트를 시작했는지 그리고 현재까지 유지할 수 있었던 방법은 어떤 것인지에 대한 이야기가 나와있다.

그리고 대학 연구조교를 나와 기업에 취직할 때도 비리눅스 기업에 취직하는 내용은 정말 대단한 사람이라는 생각이 들었다. 이익 보다는 소신을 지키는 내용이 멋있었다.

깨달은것

리누스는 컴퓨터를 처음 사용하면서 프로그래밍을 접하고 그것을 보다 효율적으로 사용하기 위한 방법을 많이 생각했던 것 같다. 나의 어린 시절과 비교를 하면 나는 대부분의 학생들과 마찬가지로 컴퓨터를 가지고 게임을 할 생각만 했지 컴퓨터를 가지고 프로그래밍을 할 생각은 못했던 것 같다.

물론 베이직(GW Basic) 언어를 이용하는 프로그래밍을 배우기는 했지만 그것은 단순 컴퓨터 학원의 커리큘럼 이었을 뿐 집에서 그것을 가지고 내가 원하는 기능을 직접 만들어 본다는 것은 생각조차 하지 않았던 것 같다.

Java라는 언어를 내 기반으로 두고 사용하기에 하드웨어에 대해 모른다는 것을 별로 민감하게 받아들이지 않았지만 좋은 개발자가 되기 위해서는 하드웨어에 대한 지식도 이제는 필수라고 생각한다.

적용할 것

  1. DOS와 같은 운영체제를 만들기(?)

솔직히 위의 운영체제 만들기는 어려울 것 같다는 생각이 들지만 한번 시도를 해보면 정말 많은 도움이 될 것 같다는 생각이 든다. 그렇기 때문에 적용할 것 에 추가해본다.

이 글은 read 카테고리에 분류되었고 태그가 있으며 님에 의해 에 작성되었습니다.

[여행후기] 오크밸리 리조트

오크밸리 리조트 & 수영장


  • 일정: 2016. 07. 01 ~ 2016. 07. 03 (2박 3일)
  • 누구랑: 안지기 아는 사람 가족(지우, 지호)과
  • 장점: 아름다운 풍경과 울창한 숲
  • 단점: 유아가 놀기에는 다소 차가운 수영장.

일본 출장 때문에 아이들과 못놀아줘서 기분도 낼겸해서 금요일 연차를 쓰고 오크밸리에 다녀왔습니다.
어디로 갈지 딱히 정하지 못했는데 쿠팡을 통해 저렴한 객실과 7/1일이 성수기로 포함되지 않았다는 점 때문에 오크밸리로 다녀왔습니다.

리조트는 평범했지만 주변 경관 및 진입로가 너무 잘되어 있어 깜짝 놀랬습니다.

겨울에 스키장으로 간다면 잘 못 느낄거 같은 풍경들이 여름이 가니 보여서 좋았습니다.

Adobe AIR 를 이용한 멀티플랫폼 어플리케이션

회사를 이직하면서 맡은 업무가 주로 모바일 플랫폼에 대응하는 어플리케이션을 개발하는 내용이었습니다.
iOS, Android, Phonegap(하이브리드) 등 개발한 앱 개수는 적응데 다양한 플랫폼을 경험 할 수 있었습니다.

고객사가 일본에 있는 교육 관련된 컨텐츠를 주로 만드는 회사여서 그런지 교육과 관련된 어플리케이션을 주로 작성하였습니다.

위의 두개는 Adobe AIR를 이용하여 직접 작성한 어플리케이션입니다. 작품의 퀄리티나 내용은 별로 없지만 처음 접하는 Adobe AIR를 사용한다는 것이 매력이 있었습니다.

위에 있는 6개의 항목은 제가 유지보수를 하고 있는 항목중의 일부 입니다. 초등학교용으로 제작된 어플리케이션으로 수학을 재미있게 배울 수 있도록 도움을 주는 어플리케이션입니다. 수학 어플리케이션은 컨텐츠도 많고 여러가지 기능이 많이 포함되어 복잡한 어플리케이션입니다.


Adobe AIR 로 어플리케이션을 개발 해도 괜찮은 경우

  1. iOSAndroid등에서 기본적으로 제공하는 컴포넌트등을 사용하지 않아도 되는 경우. 예) ListView, TableView.
  2. 디자이너가 별도로 있어 이미지 생산에 문제가 없는 경우
  3. 화려한 애니메이션 효과가 필요한 경우.

위의 3가지 경우에 해당된다면 Adobe AIR를 사용해서 어플리케이션을 개발해도 크로스플랫폼 대응에는 문제가 없습니다.

제가 대응한 플랫폼은 Android, iOS, Windows 입니다. 개수는 적지만 점유율이 많은 플랫폼을 대응하는거기 때문에 좋습니다.


Adobe AIR절대 개발하면 안되는 경우

절대라는 단어는 함부로 쓰지 말아야 하지만 절대라고 적은 이유는 Adobe AIR 로 어플리케이션을 개발 해도 괜찮은 경우 에서 해당되는 항목이 하나라도 있는 경우에는 개발 소스 작성 보다는 다른 부분에 더 많은 공수가 들어갑니다.

고객이 iOS, Android에서 제공하는 기본 컴포넌트와 같은 UI를 요청하는 경우

iOSAndroid에서는 기본 컴포넌트 사용이 편리하게 구성이 되어 있습니다. 그렇지만 그것과 동일한 기능을 Adobe AIR를 이용해서 하려면 정말 피곤이…몰려옵니다.

못 만드는 것은 아닙니다. 그렇지만 직접 만들려고 하면 쉽지는 않을 겁니다.

디자이너가 별도로 없는 경우

제가 말하는 디자이너는 그래픽 편집이 가능한 사람입니다. 개발자도 물론 편집은 할 수 있습니다. 그렇지만 고객이 원하는 만큼 좋게 하는 분은 찾기 힘듭니다.

고객이 원하는 디자인을 해줄 수 있는 사람이 없다면 포기해야 합니다. Adobe AIR의 경우 버튼을 만들때 이미지를 3개 정도 추가합니다. MouseOver, MouseDown, MouseUp 상태의 이미지가 필요합니다.
이런 사소한 이미지를 개발자가 직접 만들면서 작업한다는 것은 어려운 일입니다.

물론 다른 플랫폼용 개발에서도 디자인은 필요하지만 기본 버튼으로만 작성된 어플리케이션도 심심치 않게 볼 수 있습니다.

화려한 애니메이션 효과가 필요한 경우

Adobe Flash의 경우 화려한 UI를 작성하는데 다른 플랫폼에 비해 쉽습니다.
예를들어 Kiosk의 경우 기능이 많지는 않지만 화려하게 작성된 경우가 많이 있습니다. 이럴 경우 Adobe AIR를 사용하면 보다 쉽게 작성할 수 있습니다.

이상입니다.