[RaspberryPi] USB Port control

24시간 내내 돌리면 라즈베리 파이가 너무 뜨거울 것 같아서 USB 선풍기를 포트에 연결하고, 이걸 껐다 켰다 하려고 시도했다. 결론적으론 다른 USB 기기를 쓰지 않는다면, 전체 USB 포트를 껐다 켜는 방식으로 가능하다. 다른 USB 기기를 사용한다면, 실패. 아직 디바이스 드라이버에 커널 컴파일까진 시도하고 싶지 않다.

https://www.raspberrypi.org/forums/viewtopic.php?f=29&t=93463 쓰레드를 참고하면, hub-ctrl을 이용하면, 전체 포트 혹은 개별 포트를 껐다 켰다 하는 것을 할 수 있다.  그러나 개별 포트를 끄는 게, 실제 VBUS 전원까지 내리는 건 아니고, 그냥 못쓰게 할 뿐이다. 그래서, 전체 포트를 끄지 않는 한, 개별 포트를 꺼도 해당 포트 VBUS는 살아있기 때문에 USB 선풍기는 계속 돈다-_-;;

다음은 usb-ctrl의 설치 및 사용 방법이다.

라즈베리 파이에서 다음을 설치한다.

# apt-get install libusb-dev

다음으로 바이너리를 만든다.

# apt-get install git gcc
# git clone https://github.com/codazoda/hub-ctrl.c
# gcc -o hub-ctrl hub-ctrl.c -lusb

만든 바이너리를 적당한 곳(예를 들면, /usr/sbin/)에 설치한다.

# cp hub-ctrl /usb/sbin/

나의 경우 한 시간에 한번 정도, 50초 정도 돌게 하고 싶었다. /etc/cron.hourly 아래에 다음과 같은 스크립트를 만들어 실행 권한을 준다.

# vi /etc/cron.hourly/coolingusbfan
#!/bin/sh
hub-ctrl -h 0 -P 2 -p 1; sleep 50; sudo hub-ctrl -h 0 -P 2 -p 0

참고로, 다음 그림과 같이 포트 번호를 붙인다면,

라즈베리 파이 3 Model B의 경우, 다음과 같다고 한다.

Hub:Port — Controlled port(s)
0:1 — Controls the Ethernet port
0:2 — Controls all four USB ports (not the Ethernet)
0:3 — Controls USB Port 4
0:4 — Controls USB Port 2
0:5 — Controls USB Port 3

NAS를 위해, 외장 하드를 붙일 거라 이제 더는 위 스크립트를 사용하지 못한다.

‘진짜배기 코드 평가자라면 하지 말아야 할 네 가지’를 읽고

개인의 경우는 대체적으로 설득 가능하다. 그러나, 모든 팀원이 그래서 모두를 설득해야 한다면, 팀 혹은 회사 차원의 문제다. 이런 경우, 개인을 설득하려 해도, “다들 그래요”, “그게 여기서 되겠어요?”, “그거 한다고 안바뀌어요”, “당신 때문에 내 코드가 못들어가고 있어요. 오늘 릴리즈인데, 당신이 책임질거요?” 따위의 말이나 듣는다. ‘협업 안되는 사람’이 되고.

내가 아는 어떤 회사가 그랬다. 요즘은 좀 바꾸려고 하는 것 같던데, 이런 사람들이 위에서 때리면, 제일 먼저 자기는 안그런다 하더라.

만약 당신이 동료를 향해 신경쓰이는 기분이 든다면 회사 혹은 팀의 경영 측면에서 문제가 있는 겁니다.

(번역) 진짜배기 코드 평가자라면 하지 말아야 할 네 가지

[Eclipse] Source code Navigation 단축키

Eclipse는 내부적으로 Indexer가 돌아서 이를 이용해 찾고 싶은 File, Funtion decalaration/definition, symbol 등을 찾을 수 있다. 내가 자주 쓰는 단축키는 다음과 같다.

  • F3: Funtion declaratiin/definition. 함수 선언이나, 함수 정의로 이동하고 싶을 때 사용한다.
  • Alt + ‘<-‘: 이전 코드. 이전에 보던 부분으로 돌아갈 때 사용한다.
  • Ctrl + Shift + ‘R’: File name 찾아서 열기. 파일 이름을 알 때, 혹은 앞 몇글자만 기억날 때, 찾아서 연다.
  • Ctrl + Shift + ‘G’: Workspace에서 Reference 찾기. 함수 호출되는 부분을 찾고 싶을 때 사용한다.
  • Ctrl + ‘H’: Search. 주로 File Search를 이용한다. Scope을 셋팅해서 쓰는 것도 좋다.
  • Ctrl + Alt + ‘G’: Workspace에서 Text 찾기. Ctrl + ‘H’ 대신 사용하기도 한다.
  • Ctrl + ‘O’: Quick Outline. 주로 함수를 찾아 이동할 때 사용한다.

HTML 자동 이동 – meta refresh

<html>

<head>

<meta http-equiv=”refresh” content=”0; url=./index.php”>

</head>

<body onload=”javascript:window.location=’./index.php'”>

Please follow <a href=”index.php”>this link</a>

</body>

</html>

참고: https://en.m.wikipedia.org/wiki/Meta_refresh

git worktree

git worktree add <path> <branch>

하나의 git repository로 체크 아웃을 한군데 하는게 아니라 여러군데에 하고 싶을 때 쓴다. 브랜치를 아예 물리적으로 다른 경로로 나누어서 작업하고 싶을 때라던지 용도는 매우 다양하다.

curl 사용법

curl 잘쓰면 엄청 편하다.
* HTTP 전송 과정에 대한 상세 정보. curl이 하는 모든 일을 debugdump.txt에 저장한다.
curl –trace-ascii debugdump.txt http://blog.dasomoli.org/
* 일반적인 http 요청(GET method)
curl http://blog.dasomoli.org/
* HTTP authentication
curl -u <id>:<password> http://blog.dasomoli.org/
* POST method 요청
curl -X POST -d”<data>” http://blog.dasomoli.org:80/post/
다음과 같은 form이 있다면,
<form method=”POST” action=”dasomoli.cgi”>
<input type=text name=”id”>
<input type=submit name=press value=” OK “>
</form>
다음과 같이 전송 가능((hidden type도 그냥 쓰면 됨)
curl –data “id=dasomoli&press=%20OK%20”  http://blog.dasomoli.org/dasomoli.cgi
–data-urlencode를 쓰면 %20같이 쓰지 않고, 아래처럼도 가능하다고 한다.
curl –data-urlencode “name=JeongSeok Yang” http://blog.dasomoli.org/dasomoli.cgi
* POST로 파일 보내기
curl -X POST -d@<filename> http://blog.dasomoli.org/post/
* PUT method
curl –upload-file uploadfile http://blog.dasomoli.org/receiveput.cgi
* JSON 전송
curl -X POST http://blog.dasomoli.org/json/ -d@dasomoli.json -H “Content-Type: application/json”
* 쿠키 쓰기
curl -b cookie.txt -c cookie.txt http://blog.dasomoli.org/

 

 

[Security] TLS-PSK

일단 기본 개념부터.

PSK는 Pre-Shared Key의 줄임말로, 보안이 필요한 통신을 하는 양자 간에 미리 공유된 symmetric 키를 말한다.

TLS는 Transport Layer Security의 줄임말로, SSL이 표준화되면서 쓰이는 이름이다.

TLS-PSK는 PSK를 이용해서 TLS연결을 맺는 것으로 RFC 4279에 문서화되어 있다.

RFC 4279의 내용을 살펴보자.

      Client                                               Server
      ------                                               ------

      ClientHello                  -------->
                                                      ServerHello
                                                    (Certificate)
                                               ServerKeyExchange*
                                             (CertificateRequest)
                                   <--------      ServerHelloDone
      (Certificate)
      ClientKeyExchange
      (CertificateVerify)
      ChangeCipherSpec
      Finished                     -------->
                                                 ChangeCipherSpec
                                   <--------             Finished
      Application Data             <------->     Application Data

위 그림이 TLS handshake과정을 나타낸다.

1. 클라이언트는 ClientHello 메시지에 TLS Version과 하나 이상의 cipher-suite을 실어 보낸다.

2. 서버는 ServerHello 메시지에 사용할 TLS Version과 사용할 cipher-suite를 실어 보낸다. ServerKeyExchange 메시지로 클라이언트가 어떤 PSK를 사용할 지, PSK identity hint를 함께 보낸다. ServerHelloDone도 보낸다.

3. 클라이언트는 ServerKeyExchange에 포함된 PSK identity hint로 사용할 PSK를 고른다. 고른 PSK의 PSK identity를 ClientKeyExchange 메시지에 실어 보낸다. Premaster secret은 PSK가 N octets라면, uint16 타입의 N, N개의 0 octets, 두번째 uint16타입의 N, 그리고 PSK N octets.

OpenSSL에서는 Client 쪽에서는 PSK callback을 SSL_CTX_set_psk_client_callback()이나 SSL_set_psk_client_callback()을 통해 설정하도록 되어있는데, 이 callback을 Server로부터 받은 PSK Identity Hint를 읽어 valid한지를 check하고, 해당 hint에 맞는 PSK를 psk에, PSK identity를 identity argument에 채워주는 역할을 한다. callback은 psk의 length를 return해야 한다. 0이나 그 이하는 error를 나타낸다.

Server쪽에서는 SSL_CTX_use_psk_identity_hint()나 SSL_use_psk_identity_hint()를 통해서 사용할 PSK Identity Hint를 Setting하고, SSL_CTX_set_psk_server_callback()나 SSL_set_psk_server_callback()을 통해 callback을 셋팅한다. 이 callback은 PSK identity가 valid한지를 체크하고, PSK identity가 있다면, pre-shared key를 psk argument에 채우고, PSK의 길이를 return한다.

 

* 참고

RFC 4279 – PSK Ciphersuites for TLS(https://tools.ietf.org/html/rfc4279)

TLS: https://en.wikipedia.org/wiki/Transport_Layer_Security, https://namu.wiki/w/TLS

TLS-PSK: https://en.wikipedia.org/wiki/TLS-PSK

OpenSSL

SSL_CTX_set_psk_client_callback: https://www.openssl.org/docs/manmaster/ssl/SSL_CTX_set_psk_client_callback.html

SSL_CTX_use_psk_identity_hint: https://www.openssl.org/docs/manmaster/ssl/SSL_CTX_use_psk_identity_hint.html

ssh 접속 시 no matching key exchange method found. 문제

SSH 접속 시 다음과 같은 에러가 발생할 때가 있다.

Unable to negotiate with blog.dasomoli.org: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1

OpenSSH가 7.0이상이면, 요 키 교환 알고리즘이 기본으로 켜져 있지 않아서 나는 문제인데, 다음과 같은 방법으로 해결 가능하다.

ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 user@host

이걸 명령 줄 때마다 하긴 귀찮으니까 ~/.ssh/config 파일 안에 다음 내용을 추가하면 된다.

Host blog.dasomoli.org
KexAlgorithms +diffie-hellman-group1-sha1

참고: Using OpenSSH with legacy SSH implementations