간단히 메모한다. DNS 323 Sensor는 온도센서와 FAN Speed Sensor가 있다.


온도는


/sys/class/hwmon/hwmon1/device/temp1_input


FAN Speed는


/sys/class/hwmon/hwmon0/device/fan1_input

으로 알 수 있다.


온도값은 temp1_input 값의 1/1000 이며, 단위는 섭씨이다.

FAN Speed는 RPM을 나타낸다.

저작자 표시 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
  1. june8th 2017.08.11 07:53 신고

    이게 아직도 돌아갑니까 나는 꺼 놨어요.

  2. Coolen 2017.08.11 07:55 신고

    집에 NAS는 하나 있어야해서 어떻게든 돌리고있는 중. 갑자기 쉘이 필요할 때도 있으므로...

    Alt-f 로 덮어썼음. 원래 펌웨어는 기억도안나네.

개발자가 만드는 어떤 기능이란, 완전 무에서 창조하는 것이 아닌 이미 존재하는 하위 기능을 조합하여 상위기능으로 만들어 내는 것이다. 하위 기능에 대한 충분한 이해를 바탕으로 상위 기능을 조합해야하는데, 하위 기능자체에 버그 혹은 구현 미비점이 있어서 상위기능을 만들어내는데, 문제가 생긴다면 우회하는 방법으로 만들어야한다. 이때 사용하는 기술에 대한 통칭을 'Hack'이라한다. 정석이 아닌 꼼수를 사용하였기 때문이다.


간혹, 하위기능의 버그가 아닌 이해부족으로 우회하는 방법을 사용해야했다면, 이것은 Hack이라 할 수 없다. 왜 자신의 무지에 근거한 개발을 Hack이라는 고상(?)한 이름으로 포장하려하나. 그것은 자신의 무지를 드러내기 싫고, 이해하기 위해 들인 노력을 무위로 돌리고 싶지 않기 때문에 그렇다.


저작자 표시 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

여러개의 탭을 열었을 때, 인접한 탭들을 한 번에 닫고 싶으면, SHIFT 혹은 Cmd (Window의 ctrl)키를 누른 채 마우스로 선택한다음 Cmd+W (Windows의 Ctrl-W)을 누르면 된다.

저작자 표시 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

라즈베리파이에 무선랜 USB를 꽂고, (무선랜이 지원되는 버전3의 경우에도 비슷하리라 생각되는데) 이동하면서 작업할 때, 무선랜 접속 설정을 변경해야 할 일이 생긴다. 무선랜에 접속하는 정보는 /etc/wpa_supplicant/wpa_supplicant.conf 파일에 저장되며, 여기에 알려진 무선랜 접속 정보를 기록해두는데, 대략의 설정은 다음과 같다.


ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
	ssid="lorthlorien"
	psk="xxxxxxxxx"
	key_mgmt=WPA-PSK
}

network={
	ssid="TOMNTOMS"
	psk="toms5123"
	key_mgmt=WPA-PSK
}

저 network 항목하나만 추가하면 될 일인데, micro sd card를 빼어 수정하면 될 일이지만, adapter가 없거나, 노트북에서 읽을 수 없는 파티션으로 만들어졌다면, 라즈베리파이 화면이 보이지 않기 때문에 손 쓸 수 있는 방법이 쉽지 않다.


다음과 같은 방법으로 해결한다. 안전한 곳에서 연결되었을 때 미리 해두어야한다.


/etc/rc.local 에 /etc/rc.hojin 을 실행하도록 한다.


#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

/etc/rc.hojin &
exit 0

그리고 /etc/rc.hojin은 다음과 같이 부팅후 접속되어 있는 모든 파티션에서 wpa_supplicant.conf 가 있는지 확인해서 뒤에 추가하는 방식을 취한다. 소스에는 기존 내용을 덮어 쓰지 않기 위한 장치를 마련했으나 자세한 설명은 생략한다.


#!/bin/sh

W=wpa_supplicant.conf
T=/etc/wpa_supplicant/wpa_supplicant.conf

fdisk -l /dev/sd[abcd] 2>/dev/null | grep ^/ | awk '{print $1}' |
while read partition
do
	mount $partition /media
	if test -f /media/$W 2>/dev/null; then
		echo "Found setup file: $partition"
		LINE=`grep -n HOJIN $T | awk -F: '{print $1}'`
		if test -z "$LINE"; then
			echo "#HOJIN" >> $T
			cat /media/$W >> $T
		else
			( head -n +$LINE $T; cat /media/$W ) > /tmp/$W
			mv /tmp/$W $T
		fi
		( sleep 20; mount $partition /media; ifconfig -a > /media/ifconfig.log; umount /media ) &
	fi
	if test -f /media/rc.sh; then
		bash /media/rc.sh
	fi
	umount /media 2>/dev/null
done

일단 처음 부팅하면 wpa_supplicant.conf를 수정하는 일만 일어나므로 다시 부팅하도록 한다.


두번째 부팅후 20초가 지나면 같은 파티션에 ifconfig.log 로 현재 ip 정보를 기록하도록 되어 있으므로 노트북으로 확인할 수 있다.





저작자 표시 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

인터넷에서 다운로드 받은 파일을 실행하면, 경고가 나온다. 그 정보는 디렉토리내의 파일 속성(attribute)에 저장되며 xattr 명령으로 확인해볼 수 있다. 이 속성은 복사(cp)할 때도 따라다니는데, xattr -d 로 해당 (com.apple.quarantine 같은) 속성을 지우면 경고가 나오지 않는다. 또는 cp -X 옵션으로 복사할 경우 속성은 복사하지 않으므로 지운 효과를 얻을 수 있다.

저작자 표시 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

링크를 누른뒤 백버튼을 눌렀을 때, 그 위치로 돌아가는 것이 일반적인 사용성인데, 보고 있는 페이지가 ajax로 scroll 혹은 pagination이 구현되어 있을 때, 현재 보고 있는 위치를 기억하는 문제가 있다. 9년전 idtail . com 만들 때도 고민 많이 했던 부분이었는데, 지금의 페이스북도 답이 크게 없나보다. 스크롤 중에 내용을 보려고 클릭하는 것은 뭔가 안심이 안돼.

저작자 표시 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

통합환경(IDE)을 볼 때마다, Turbo C가 생각난다. 내가 기억하기로 고등학교 때 버전 2.0으로 처음 접했다. 이 툴은 최소한의 통합환경을 제공했는데, 그 통합이라는 것은, 에디터, 컴파일러, 링커, 디버거였다. 말그대로 각 프로그램을 필요할 때마다 실행했어야했던 것을, 메뉴에서 선택하는 것만으로 하나로 묶어줬으니, 생산성이 얼마나 높아졌겠는가? 그 처음을 기억하건데, 사실 어리둥절했다. 배움에도 순서라는 것이 있고, 빌드에도 순서가 있다. 그리고 그런 것들은 어느정도 1차원적으로 되어 있는데, 이 IDE는 메뉴라는 익숙한 것에 그 것들을 2차원적으로 나열을 해 놓았으니, 한꺼번에 여러 개념에 동시에 노출되는 것에서 오는 당혹감이 있었으리라. 그리고 정규적인 C 언어를 배운 것이 아닌 상황에서 디버깅같은 것은 고급 과정이었으므로, 한동안 몰라서 사용을 못했던 것 같다.


IDE가 주는 정보의 양에 대해 생각해 보건데, 지금 나오는 모든 개발툴로서의 IDE들은 그 메뉴에 너무너무 많은 것이 노출되어 있다. 그래서 처음 어떤 새로운 언어에 특정 IDE를 접하는 순간, 그것이 일로서 주어진 것이 아니라면, 몇번 보다가 접는 것이 대부분 취하는 행동아닐까? 일로써 사용해야했다면, 그 때부터 호기심은 100% 왕성해져서 그 많은 기능을 이것저것 살펴보며, 상당한 정보량을 머리 주억거리며 습득하게 된다. 욕도하고, 감탄도하고 몰랐던 개념을 익히기도하고 행복하(?)고 화도나는(!) 그런 시기가 프로젝트 기간 동안 지나게 된다.


IDE는 자체로는 전혀 교육적이지 않다. 메뉴의 순서도 친절하지 않으며, 그 어느 누군가의 학습곡선에 맞춰있는것 같지도 않다. 스스로 교육하며 커다란 프로젝트도 마무리 할 수 있는 IDE가 있을 수 있을까? 사실 어떤 프로젝트에 들어가는 개념들은 그 사용되는 상황이 전혀 순차적이지 않으며, 일관성이 없다. 개인의 능력에 따라 IDE를 사용하게 되는 것이다. 늦게 시작하는 모든 개발자들에게 건배!




저작자 표시 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

페이스북도, Line messenger도, 발표를 계속 해대는 Chat api.

선도 개발 그룹에서 Chat bot에 대한 관심이 계속 올라가고 있는 즈음, 내 작업도 빨라져야겠다는 생각이 든다.

그러나 현실은 여기저기 손을 빌려달라한다.

Show me the money!

저작자 표시 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

bash 에서 yaml 파일을 해석해서, 환경변수로 설정해주는 간단한 코드입니다.


예를 들어, setting.yaml 이라는 파일이 있을 때

default:

    mysql:

        host: localhost

        port: 3306

        username: test

    redis:

        host: localhost

        port: 1122

test:

    mysql:

        host: remote.example.net

        port: 3306

        username: test


위와 같은 파일을 해석하고 싶을 때, 다음과 같은 방식으로 사용합니다.

#!/bin/bash


YAML=settings.yaml ENV=default source parse_yaml.sh


echo $mysql_host

echo $mysql_port

echo $mysql_username

최상위 객체를 ENV에 넘겨주면, 각 객체를 "_"로 연결하여 환경변수로 만들어 줍니다. 자세한 내용은 코드를 보시기 바랍니다. 끝!

$ cat parse_yaml.sh

# Copyright 2016 By Hojin Choi
# You should source this file as "YAML=../config/settings.yaml source parse_yaml.sh"

if test -z "YAML"; then
	echo "YAML is not set"
	exit 1
fi

if test -z "$LEADSPACE"; then
	LEADSPACE="    "
fi
if test -z "$FIELDSP"; then
	FIELDSP="_"
fi

if test -z "$ENV"; then
	ENV="default"
fi

TMPSH="/tmp/tmp.$$.sh"

#Remove white space from IFS, we use only new line character
lastdepth="0"
while IFS="\n" read line
do
	depth=`echo "$line" | sed -e "s;$LEADSPACE;@;g" | sed -r -e 's;^(@*).*;\\1;' | wc -c`
	read k v <<<"$line"
	k=$(echo $k| tr -d ':')
	keys[$depth]="$k"
	if test "$lastdepth" -ne "$depth"; then
		lastdepth=$depth
	fi
	unset keys[$(($lastdepth+1))]
	unset keys[$(($lastdepth+2))]
	unset keys[$(($lastdepth+3))]
	unset keys[$(($lastdepth+4))]
	unset keys[$(($lastdepth+5))]
	unset keys[$(($lastdepth+6))]
	unset keys[$(($lastdepth+7))]
	unset keys[$(($lastdepth+8))]

	if test "$ENV" != "${keys[1]}"; then
		continue
	fi

	if test -z "$v"; then
		continue
	fi

	v=$(echo $v| tr -d '"')
	read key <<<"$(echo ${keys[@]:2} | tr ' ' $FIELDSP)"
	echo $key=$v
done < "$YAML" > "$TMPSH"

. "$TMPSH"

rm -f "$TMPSH"


저작자 표시 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

Raspberry pi를 가지고 놀다 bluetooth 장비는 있으나 연결된 headset을 이용할 수 없었다.

어찌어찌해서 alsa-pulseaudio에 bluetooth headset을 연결하는 것까지 성공하였으나, 그 다음이 막혀 한동안 고생했다.


$ pactl list .... 생략 ... Card #5 Name: bluez_card.00_02_5B_00_FF_CE Driver: module-bluez5-device.c Owner Module: 29 Properties: device.description = "VISVI J2" device.string = "00:02:5B:00:FF:CE" device.api = "bluez" device.class = "sound" device.bus = "bluetooth" device.form_factor = "headset" bluez.path = "/org/bluez/hci0/dev_00_02_5B_00_FF_CE" bluez.class = "0x240404" bluez.alias = "VISVI J2" device.icon_name = "audio-headset-bluetooth" device.intended_roles = "phone" Profiles: a2dp: High Fidelity Playback (A2DP Sink) (sinks: 1, sources: 0, priority: 10, available: yes) off: Off (sinks: 0, sources: 0, priority: 0, available: yes) Active Profile: a2dp Ports: headset-output: Headset (priority: 0, latency offset: 0 usec) Part of profile(s): a2dp headset-input: Headset (priority: 0, latency offset: 0 usec, not available)

이렇게 나오는 것은 device 5번으로 잡혔다는 것이고, 여기에 paplay를 통해 wav, raw 등을 밀어 넣을 수 있다. 하지만, mp3는 paplay로는 안된다. 


mpg123 을 통해 stdout 으로 mpeg 파일을 raw로 변환하여 출력하는 것을 넘겨주면 된다.


$ mpg123 -s "blah.mp3" | paplay -d 5 --raw --passthrough


paplay에는 --raw 형식을 stdin (--passthrough)으로부터 입력받는 옵션이 있으며, mpg123에는 stdout으로 출력하는 옵션이 있다. (-s)


저렇게 하는 방법외에도 있을 것 같으나, (mpg123이 pulseaudio에 직접보내는 그런 아름다운 방법) 왜 잘 안될까.

저작자 표시 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

+ Recent posts