Create TOC

2013년 12월 27일

Debian/tracker 끄기

언제부턴가 Debian Sid에서 Gnome 3.x를 사용하면 indexing 작업을 위해 tracker 프로세스가 CPU를 사용한다. 이게 맘에 안들면 아래와 같은 방법으로 tracker가 구동되지 않게 설정할 수 있다.

  1. tracker-preferences를 실행해서 indexing 대상을 비운다.
  2. 아래 명령을 실행해서 tracker 로그를 지운다.
    tracker-control -r
  3. tracker 프로세스를 모두 죽인다.
  4. /etc/xdg/autostart/tracker-miner-fs.desktop/etc/xdg/autostart/tracker-store.desktop파일 내용 중

    X-GNOME-Autostart-enabled=true

    이 부분을 아래와 같이 수정한다.

    X-GNOME-Autostart-enabled=false

iTunes/Downloads 폴더 삭제

iTunes에서 App 업데이트시 "파일 처리 중"에서 멈춰 있을 경우 iTunes를 강제 종료 후 Downloads 폴더를 지우고 iTunes를 실행하면 된다.

Downloads 폴더 위치는 아래와 같다.

  • OS X
    ~/Music/iTunes/iTunes Media/Downloads
    
  • Windows Vista
    %USERPROFILE%\Music\iTunes\iTunes Media\Downloads\
  • Windows 7
    %USERPROFILE%\My Music\iTunes\iTunes Media\Downloads\
  • Windows XP
    %USERPROFILE%\My Documents\My Music\iTunes\iTunes Media\Downloads\

2013년 12월 23일

Firefox/gae9 사진이 보이지 않을 때

Smart Referer 확장 기능을 사용할 경우 gae9 사이트 사진이 보이지 않는다.

Smart Referer 설정에 Allow에 아래 내용을 추가하면 된다.

*>ssproxy.ucloudbiz.olleh.com

2013년 12월 22일

iOS/블루투스 키보드 단축키

일반



  • Command + Space : 입력 언어 전환

  • Shift + 화살표키 : 블럭 설정

  • Command + a : 전체 선택

  • Command + c : copy

  • Command + x : cut

  • Command + v : paste

  • Command + z : undo

  • Command + Shift + z : redo

  • Command + Up : 문서 처음

  • Command + Down : 문서 끝

  • Command + Left : Home

  • Command + Right : End

  • Option + Left : 단어 단위 이동

  • Option + Right : 단어 단위 이동

  • Control + a : Home

  • Control + e : End

  • Control + f : 글자 단위 이동(왼쪽)

  • Control + b : 글자 단위 이동(오른쪽)

  • Control + Shift + a/e/f/b : 블럭 설정

  • Command + Del : 커서 왼쪽 모두 지우기

  • Option + Del : 커서 왼쪽으로 단어 하나 지우기

  • Control + h : Delete

  • Control + j : Enter

  • Control + m : Enter

  • Option + 글자키 : 한글 입력 상태일 때 영어 소문자 입력. Shift 랑 같이 누르면 대문자

  • Option + 글자키 : 영어 입력 상태일 때 특수 문자

  • Tab : 다음 입력 control (일부 앱에서만)

  • Shift + Tab : 이전 입력 control (일부 앱에서만)



Safari (iPad에서만)




  • Command + T - 새 탭

  • Command + W - 탭 닫기

  • Command + L - 주소 표시줄로 포커스 이동




TistoryM에서 작성됨

2013년 11월 11일

Firefox/Anti-Adblock Killer 스크립트 를 사용할 경우 iCloud 로그인 창이 표시되지 않는 문제

Firefox에서 Anti-Adblock Killer 스크립트를 사용할 경우 iCloud에서 로그인 창이 표시되지 않는다.

이 문제를 수정하기 위해서 GreaseMonkey에서 해당 스크립트의 설정동작하지 않을 페이지에 아래 주소를 추가한다.

http*://*.icloud.com/*

2013년 10월 17일

Debian/Boxes를 이용해 Windows 설치하기

Boxes를 이용해 Windows를 설치하는 방법을 기술한다.

OS 설치

초기 화면에서 새로 만들기를 눌러서 OS를 추가한다.

OS 이미지를 선택한다.

빠른설치는 그냥 넘어간다.

만들기을 누르기 전에 사용자 정의를 통해서 OS 구동 환경을 변경할 수 있다.

만들기를 누르면 OS 설치가 시작된다.

드라이버 설치

OS 설치가 끝난 후 spice guest tools를 받아서 설치한다.

설치 완료

드라이버가 설치되면 Boxes 창 크기에 따라 화면 해상도가 자동으로 변경된다.

2013년 10월 4일

Debian/Conky의 투명도 조절

Conky의 투명도를 조절하기 위해서 ~/.conkyrc파일의 내용을 수정한다.

own_window_argb_visual yes
own_window_argb_value 180
own_window yes
own_window_type normal
own_window_transparent no

2013년 9월 14일

Python/pip로 설치한 패키지 업그레이드

pip를 이용해 설치한 패키지를 한번에 업그레이드 하려면 아래와 같이 python 스크립트를 실행한다.
python -c "import pip, subprocess; [subprocess.call('pip install -U ' + d.project_name, shell=1) for d in pip.get_installed_distributions() if d.location.find('site-packages') != -1]"

2013년 8월 30일

Python/Spiral Array

원문

문제는 다음과 같습니다:

6 6

  0   1   2   3   4   5
 19  20  21  22  23   6
 18  31  32  33  24   7
 17  30  35  34  25   8
 16  29  28  27  26   9
 15  14  13  12  11  10

위처럼 6 6이라는 입력을 주면 6 X 6 매트릭스에 나선형 회전을 한 값을 출력해야 합니다.

풀이

#!/usr/bin/python
# -*- coding: utf-8 -*-

def fill_round(matrix, num, mx, my, base_x, base_y):
    ix = base_x
    iy = base_y

    # LR 진행
    for n in range(0, mx):
        matrix[iy][ix] = num
        num = num + 1
        ix = ix + 1
    ix = ix - 1
    mx = mx - 1

    # UD 진행
    iy = iy + 1
    for n in range(1, my):
        matrix[iy][ix] = num
        num = num + 1
        iy = iy + 1
    iy = iy - 1
    my = my - 1

    if my < 1:
        return

    # RL 진행
    ix = ix - 1
    for n in range(mx - 1, -1, -1):
        matrix[iy][ix] = num
        num = num + 1
        ix = ix - 1
    ix = ix + 1
    mx = mx - 1

    if mx < 1:
        return

    # DU 진행
    iy = iy - 1
    for n in range(my - 1, 0, -1):
        matrix[iy][ix] = num
        num = num + 1
        iy = iy - 1
    return num

def solution(x, y):
    if x < 0 or y < 0:
        return [[]]
    matrix = [[-1 for i in range(0, x)] for j in range(0, y)]

    num = 0
    w = x
    h = y
    i = 0
    while True:
        num = fill_round(matrix, num, w, h, i, i)
        i = i + 1
        w = w - 2
        h = h - 2
        if w <= 0 or h <= 0:
            break
    return matrix

matrix = solution(6, 6)
print '\n'.join([' '.join(['%3u' % n for n in m]) for m in matrix])

print ''

matrix = solution(9, 7)
print '\n'.join([' '.join(['%3d' % n for n in m]) for m in matrix])

결과

  0   1   2   3   4   5
 19  20  21  22  23   6
 18  31  32  33  24   7
 17  30  35  34  25   8
 16  29  28  27  26   9
 15  14  13  12  11  10

  0   1   2   3   4   5   6   7   8
 27  28  29  30  31  32  33  34   9
 26  47  48  49  50  51  52  35  10
 25  46  59  60  61  62  53  36  11
 24  45  58  57  56  55  54  37  12
 23  44  43  42  41  40  39  38  13
 22  21  20  19  18  17  16  15  14

Python/LCD Display

원문

한 친구가 방금 새 컴퓨터를 샀다. 그 친구가 지금까지 샀던 가장 강력한 컴퓨터는 공학용 전자 계산기였다. 그런데 그 친구는 새 컴퓨터의 모니터보다 공학용 계산기에 있는 LCD 디스플레이가 더 좋다며 크게 실망하고 말았다. 그 친구를 만족시킬 수 있도록 숫자를 LCD 디스플레이 방식으로 출력하는 프로그램을 만들어보자.

입력

입력 파일은 여러 줄로 구성되며 표시될 각각의 숫자마다 한 줄씩 입력된다. 각 줄에는 s와 n이라는 두개의 정수가 들어있으며 n은 출력될 숫자( 0<= n <= 99,999,999 ), s는 숫자를 표시하는 크기( 1<= s < 10 )를 의미한다. 0 이 두 개 입력된 줄이 있으면 입력이 종료되며 그 줄은 처리되지 않는다.

출력

입력 파일에서 지정한 숫자를 수평 방향은 '-' 기호를, 수직 방향은 '|'를 이용해서 LCD 디스플레이 형태로 출력한다. 각 숫자는 정확하게 s+2개의 열, 2s+3개의 행으로 구성된다. 마지막 숫자를 포함한 모든 숫자를 이루는 공백을 스페이스로 채워야 한다. 두 개의 숫자 사이에는 정확하게 한 열의 공백이 있어야 한다.

풀이

#!/usr/bin/python
# -*- coding: utf-8 -*-

q = {
    '1': {
        0: lambda c: [c, 0, 0],
        1: lambda c: [0, (c - 1), 1],
        2: lambda c: [c, 0, 0],
        3: lambda c: [0, (c - 1), 1],
        4: lambda c: [c, 0, 0],
    },
    '2': {
        0: lambda c: [1, (c - 2), 1],
        1: lambda c: [0, (c - 1), 1],
        2: lambda c: [1, (c - 2), 1],
        3: lambda c: [1, (c - 1), 0],
        4: lambda c: [1, (c - 2), 1],
    },
    '3': {
        0: lambda c: [1, (c - 2), 1],
        1: lambda c: [0, (c - 1), 1],
        2: lambda c: [1, (c - 2), 1],
        3: lambda c: [0, (c - 1), 1],
        4: lambda c: [1, (c - 2), 1],
    },
    '4': {
        0: lambda c: [c, 0, 0],
        1: lambda c: [1, (c - 2), 1],
        2: lambda c: [1, (c - 2), 1],
        3: lambda c: [0, (c - 1), 1],
        4: lambda c: [c, 0, 0],
    },
    '5': {
        0: lambda c: [1, (c - 2), 1],
        1: lambda c: [1, (c - 1), 0],
        2: lambda c: [1, (c - 2), 1],
        3: lambda c: [0, (c - 1), 1],
        4: lambda c: [1, (c - 2), 1],
    },
    '6': {
        0: lambda c: [1, (c - 2), 1],
        1: lambda c: [1, (c - 1), 0],
        2: lambda c: [1, (c - 2), 1],
        3: lambda c: [1, (c - 2), 1],
        4: lambda c: [1, (c - 2), 1],
    },
    '7': {
        0: lambda c: [1, (c - 2), 1],
        1: lambda c: [0, (c - 1), 1],
        2: lambda c: [c, 0, 0],
        3: lambda c: [0, (c - 1), 1],
        4: lambda c: [c, 0, 0],
    },
    '8': {
        0: lambda c: [1, (c - 2), 1],
        1: lambda c: [1, (c - 2), 1],
        2: lambda c: [1, (c - 2), 1],
        3: lambda c: [1, (c - 2), 1],
        4: lambda c: [1, (c - 2), 1],
    },
    '9': {
        0: lambda c: [1, (c - 2), 1],
        1: lambda c: [1, (c - 2), 1],
        2: lambda c: [1, (c - 2), 1],
        3: lambda c: [0, (c - 1), 1],
        4: lambda c: [1, (c - 2), 1],
    },
    '0': {
        0: lambda c: [1, (c - 2), 1],
        1: lambda c: [1, (c - 2), 1],
        2: lambda c: [c, 0, 0],
        3: lambda c: [1, (c - 2), 1],
        4: lambda c: [1, (c - 2), 1],
    },
}

def print_x(s, nums):
    if s <= 0:
        return
    c = s + 2
    r = s * 2 + 3

    print ''.join([' ' * q[n][0](c)[0] + '-' * q[n][0](c)[1] + ' ' * q[n][0](c)[2] + ' ' for n in nums])
    print '\n'.join([''.join(['|' * q[n][1](c)[0] + ' ' * q[n][1](c)[1] + '|' * q[n][1](c)[2] + ' ' for n in nums]) for i in xrange(0, r / 2 - 1)])
    print ''.join([' ' * q[n][2](c)[0] + '-' * q[n][2](c)[1] + ' ' * q[n][2](c)[2] + ' ' for n in nums])
    print '\n'.join([''.join(['|' * q[n][3](c)[0] + ' ' * q[n][3](c)[1] + '|' * q[n][3](c)[2] + ' ' for n in nums]) for i in xrange(0, r / 2 - 1)])
    print ''.join([' ' * q[n][4](c)[0] + '-' * q[n][4](c)[1] + ' ' * q[n][4](c)[2] + ' ' for n in nums])

print_x(2, '1234567890')
print ''
print_x(4, '1234567890')

실행 결과는 아래와 같다.

      --   --        --   --   --   --   --   --
   |    |    | |  | |    |       | |  | |  | |  |
   |    |    | |  | |    |       | |  | |  | |  |
      --   --   --   --   --        --   --
   | |       |    |    | |  |    | |  |    | |  |
   | |       |    |    | |  |    | |  |    | |  |
      --   --        --   --        --   --   --

        ----   ----          ----   ----   ----   ----   ----   ----
     |      |      | |    | |      |           | |    | |    | |    |
     |      |      | |    | |      |           | |    | |    | |    |
     |      |      | |    | |      |           | |    | |    | |    |
     |      |      | |    | |      |           | |    | |    | |    |
        ----   ----   ----   ----   ----          ----   ----
     | |           |      |      | |    |      | |    |      | |    |
     | |           |      |      | |    |      | |    |      | |    |
     | |           |      |      | |    |      | |    |      | |    |
     | |           |      |      | |    |      | |    |      | |    |
        ----   ----          ----   ----          ----   ----   ----

2013년 8월 14일

Debian/ssh 접속시 Google Authenticator 적용

Debian Sid에서 ssh 접속시 Google Authenticator를 적용하는 방법을 기술한다.

설치

$ sudo apt-get install libpam-google-authenticator

키 생성

$ google-authenticator

아래와 같은 질문에 y으로 대답하면 화면에 바코드가 출력된다.

Do you want authentication tokens to be time-based (y/n) y

바코드를 iPhone의 Google Authenticator 앱으로 찍어서 등록한다.

그 뒤에 질문들에는 y으로 대답한다.

Do you want me to update your "/사용자명/.google_authenticator" file (y/n) y

Do you want to disallow multiple uses of the same authentication
token? This restricts you to one login about every 30s, but it increases
your chances to notice or even prevent man-in-the-middle attacks (y/n) y

By default, tokens are good for 30 seconds and in order to compensate for
possible time-skew between the client and the server, we allow an extra
token before and after the current time. If you experience problems with poor
time synchronization, you can increase the window from its default
size of 1:30min to about 4min. Do you want to do so (y/n) y

If the computer that you are logging into isn't hardened against brute-force
login attempts, you can enable rate-limiting for the authentication module.
By default, this limits attackers to no more than 3 login attempts every 30s.
Do you want to enable rate-limiting (y/n) y

ssh 설정

/etc/pam.d/sshd 파일에 아래 내용을 추가한다.

auth       required     pam_google_authenticator.so

/etc/ssh/sshd_config 파일의 ChallengeResponseAuthentication 값을 yes로 수정한다.

ChallengeResponseAuthentication yes

ssh 를 재시작한다.

$ sudo /etc/init.d/sshd restart

2013년 7월 1일

nodejs/sample

간단한 node.js sample.

var url = require('url');
var domain = require('domain');
var fs = require('fs');

require('http').createServer(function(req, res) {
	var u = url.parse(req.url, true);
	if (u.pathname == '/error') {
		if (u.search == '') {
			res.writeHead(200);
			res.write('<html><title>error</title></head><body>error</body></html>');
		}
		else {
			res.writeHead(u.query.e);
			res.write('<html><title>error</title></head><body>' + u.query.e + '</body></html>');
		}
		res.end();
	}
	else {
		if (u.pathname == '/') {
			u.pathname = '/index.html';
		}
		var d = domain.create();
		d.run(function() {
			fs.readFile(__dirname + '/public_html'+ u.pathname, d.intercept(function(data) {
				res.writeHead(200);
				res.write(data, 'utf8');
				res.end();
			}));
		});

		d.on('error', function(err) {
			console.log(err);
			var errpage = '/error';

			if (err.errno == 34) {
				errpage = errpage + '?e=404';
			}
			res.writeHead(302, {'Location': errpage});
			res.end();
		});
	}
}).listen(1234);

2013년 6월 27일

C++/Visual Studio의 Code Analysis에서 strsafe.h에 대해 경고를 출력하지 않게 설정

Visual Studio의 Code AnalysisDetecting and Correcting C/C++ Code Defects로 소스를 점검하다 보면 strsafe.h에 대해 많은 양의 경고를 출력한다. strsafe.h를 포함하기 전에 warning 설정을 바꿔주면 경고가 나오지 않는다.

#include <CodeAnalysis/warnings.h>
#pragma warning(push)
#pragma warning(disable: ALL_CODE_ANALYSIS_WARNINGS)
#include <strsafe.h>
#pragma warning(pop)

2013년 1월 21일

cygwin/error: cannot fork() for fetch-pack: Resource temporarily unavailable

cygwin 환경에서 git실행 시 아래와 같은 오류가 발생했다.

$ git clone https://주소
Cloning into '주소'...
       0 [main] git-remote-https 1076 child_info_fork::abort: cygldap-2-3-0.dll: Loaded to different address: parent(0x320000) != child(0x3A0000)
error: cannot fork() for fetch-pack: Resource temporarily unavailable

cygwin FAQ에 해결 방법이 나와 있다. 내 환경에서는 rebaseall명령으로 해결되었다.

cygwin/필요한 공유 라이브러리가 없어서 실행되지 않을 때

최근 cygwin을 다시 설치하고 curl을 실행했더니 아래와 같은 오류가 발생했다.

$ curl
/usr/bin/curl.exe: error while loading shared libraries: ?: cannot open shared object file: No such file or directory

ldd을 이용해서 설치되지 않은 라이브러리를 찾던 도중 cygcurl-4.dll에서 아래와 같은 무수한 ???를 만나게 되었다.

$ ldd /usr/bin/cygcurl-4.dll
        ntdll.dll => /cygdrive/c/Windows/SysWOW64/ntdll.dll (0x77700000)
        kernel32.dll => /cygdrive/c/Windows/syswow64/kernel32.dll (0x75640000)
        KERNELBASE.dll => /cygdrive/c/Windows/syswow64/KERNELBASE.dll (0x74ff0000)
        ??? => ??? (0x63f80000)
        ??? => ??? (0x6ff60000)
        ??? => ??? (0x61000000)
        ??? => ??? (0x68b80000)
        ??? => ??? (0x6f550000)
        ??? => ??? (0x6b440000)
        ??? => ??? (0x67d40000)
        ??? => ??? (0x71440000)
        ??? => ??? (0x6a840000)
        ??? => ??? (0x6bc80000)
        ??? => ??? (0x44000000)
        ??? => ??? (0x70ec0000)
        ??? => ??? (0x67140000)
        ??? => ??? (0x6c100000)
        ??? => ??? (0x6fd50000)
        ??? => ??? (0x6fd70000)
        ??? => ??? (0x64d80000)
        ??? => ??? (0x71040000)
        ??? => ??? (0x6c400000)
        ??? => ??? (0x10000000)
        ??? => ??? (0x410000)

???의 정체를 알기 위해 구글링해본 결과 cygcheck을 사용해보라는 글이 있어서 cygcheck을 사용해 보았다.

$ cygcheck /bin/cygcurl-4.dll
C:\cygwin\bin\cygcurl-4.dll
  C:\cygwin\bin\cyggcc_s-1.dll
    C:\cygwin\bin\cygwin1.dll
      C:\Windows\system32\KERNEL32.dll
        C:\Windows\system32\API-MS-Win-Core-RtlSupport-L1-1-0.dll
        C:\Windows\system32\ntdll.dll
        C:\Windows\system32\KERNELBASE.dll
        C:\Windows\system32\API-MS-Win-Core-ProcessThreads-L1-1-0.dll
        C:\Windows\system32\API-MS-Win-Core-Heap-L1-1-0.dll
        C:\Windows\system32\API-MS-Win-Core-Memory-L1-1-0.dll
        C:\Windows\system32\API-MS-Win-Core-Handle-L1-1-0.dll
        C:\Windows\system32\API-MS-Win-Core-Synch-L1-1-0.dll
        C:\Windows\system32\API-MS-Win-Core-File-L1-1-0.dll
        C:\Windows\system32\API-MS-Win-Core-IO-L1-1-0.dll
        C:\Windows\system32\API-MS-Win-Core-ThreadPool-L1-1-0.dll
        C:\Windows\system32\API-MS-Win-Core-LibraryLoader-L1-1-0.dll
        C:\Windows\system32\API-MS-Win-Core-NamedPipe-L1-1-0.dll
        C:\Windows\system32\API-MS-Win-Core-Misc-L1-1-0.dll
        C:\Windows\system32\API-MS-Win-Core-SysInfo-L1-1-0.dll
        C:\Windows\system32\API-MS-Win-Core-Localization-L1-1-0.dll
        C:\Windows\system32\API-MS-Win-Core-ProcessEnvironment-L1-1-0.dll
        C:\Windows\system32\API-MS-Win-Core-String-L1-1-0.dll
        C:\Windows\system32\API-MS-Win-Core-Debug-L1-1-0.dll
        C:\Windows\system32\API-MS-Win-Core-ErrorHandling-L1-1-0.dll
        C:\Windows\system32\API-MS-Win-Core-Fibers-L1-1-0.dll
        C:\Windows\system32\API-MS-Win-Core-Util-L1-1-0.dll
        C:\Windows\system32\API-MS-Win-Core-Profile-L1-1-0.dll
        C:\Windows\system32\API-MS-Win-Security-Base-L1-1-0.dll
  C:\cygwin\bin\cygcrypto-1.0.0.dll
    C:\cygwin\bin\cygz.dll
  C:\cygwin\bin\cyggssapi-3.dll
    C:\cygwin\bin\cygheimntlm-0.dll
      C:\cygwin\bin\cygkrb5-26.dll
        C:\cygwin\bin\cygasn1-8.dll
          C:\cygwin\bin\cygroken-18.dll
            C:\cygwin\bin\cygcrypt-0.dll
          C:\cygwin\bin\cygcom_err-2.dll
        C:\cygwin\bin\cygwind-0.dll
        C:\cygwin\bin\cyghx509-5.dll
        C:\cygwin\bin\cygintl-8.dll
          C:\cygwin\bin\cygiconv-2.dll
        C:\cygwin\bin\cygsqlite3-0.dll
        C:\cygwin\bin\cygheimbase-1.dll
  C:\cygwin\bin\cygidn-11.dll
  C:\cygwin\bin\cyglber-2-4-2.dll
  C:\cygwin\bin\cygldap-2-4-2.dll
cygcheck: track_down: could not find cygsasl2-2.dll

    C:\cygwin\bin\cygssl-1.0.0.dll
  C:\cygwin\bin\cygssh2-1.dll

중간에 cygsasl2-2.dll이 없다고 나왔고, 관련 라이브러리를 설치 한 후 curl 실행 오류도 해결되었다.