[키보드] 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

[후기] 열혈강의 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 배틀넷 서버 소스를 분석해보자.

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

리눅스 그냥 재미로

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

본것

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

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

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

깨달은것

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

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

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

적용할 것

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

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

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

오크밸리 리조트 & 수영장


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

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

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

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