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"


저작자 표시 동일 조건 변경 허락
신고

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에 직접보내는 그런 아름다운 방법) 왜 잘 안될까.

저작자 표시 동일 조건 변경 허락
신고

http://lockscreen.sortuniq.com/


1.

한달전쯤부터 잠금화면을 마치 누군가 연락을 하려했으나 못 본지 한참된 화면으로 설정해 놓는게 유행이었다. 아이디어가 떠올라 생각한 지 1시간 내로 도메인을 구입, DNS 설정, 아마존 가상서버 생성을 마쳤다. 그리고 퇴근 및 주말을 이용하여 휘릭 한페이지를 만들었는데, 바로 저 위 사이트다. 게다가 기존 adsense 계정에 항목하나 추가해서 간단히 광고를 집어 넣어 보았다. (물론 트래픽이 거의 없으니 광고 효과는 미미~하다.)


2.

서버에서 그래픽 작업을 하면, 아마존 비용이 증가할 것 같아서 모두 클라이언트에서 하도록 작성하였다. 이 부분이 가장 고심한 부분인데, 다행이 html2canvas라는 좋은 라이브러리가 있어서 html로 적절하게 화면을 구성한 뒤 html5의 toDataUrl 함수를 이용하여 'data:' scheme으로 변환하면 png 파일로 떨굴 수가 있었다.


3.

그러나 이 작업이 항상 좋은 화질을 보장하지 않는데, 폰에서는 point/pixel 개념으로 하나의 점을 구성하기 위해서는 여러 픽셀이 동원되는 미려한 일이 동원된다. 따라서 픽셀 단위로 화면을 캡쳐해 놓지 않으면, 화질이 떨어지는 상황이 발생한다. 이를 위해 샘플로 만든 HTML을 확대해서캡쳐해야할 필요가 있다. 이 때 사용한 것이 css의 filter인데, transform.js를 이용하면 쉬운 방법으로 확대할 수 있다. 잠시 확대하고 캡쳐한 뒤 그림으로 만들어 바로 저장한 다음 다시 원래대로 돌려 놓는다.


이상 간단한 장난질 메모.





저작자 표시 동일 조건 변경 허락
신고
  1. 2016.12.14 16:12

    비밀댓글입니다

    • Coolen 2016.12.15 13:41 신고

      저도 오래전에 해봐서 따로 샘플을 만들어 드리긴 어렵고요. 웹으로 저 페이지 소스를 이해하시면 훌륭한 예제가 되지 않을까 싶습니다.

http://vim.wikia.com/wiki/Modeline_magic


Modeline hack이라는 것으로, 어떤 파일을 열 때, vim의 환경을 그 파일에 맞게 설정하는 것을 말한다.

기본적으로 다음과 같은 설정이 되어 있어야한다.


$ grep ~/.vimrc

set modeline

set modelines=5


위와 같은 설정이 있을 때, 소스상의 주석에 다음과 같은 (혹은 몇가지 다른 포맷으로) 설정이 있다면 열자마자 적용된다.


# vim: set syntax=javascript:


끝이 ":" 으로 끝나는 것에 주의 한다. 어떤 주석은 /*... */ 으로 표현될 수도 있으므로 설정의 끝을 나타내는 ":"을 요구한다.

저작자 표시 동일 조건 변경 허락
신고

Samsung Printer SL-M2020 Series requires firmware upgrade to print via 'AirPrinter' with iOS8 iPhone.

SL-M2028 (I guess it's Korean domestic serial) needs Version 3.00.01.11

http://www.samsung.com/sec/consumer/it/printers-multifunction/laser-printer/SL-M2028W


저작자 표시 동일 조건 변경 허락
신고

아이폰의 "사파리에서 보기"는 대부분의 앱에서 웹 컨텐츠를 볼 경우 추가적으로 제공되는 기능이다. 페이스북 앱도 마찬가지인데, 오늘 발견한 것은, 페이스북에서 그 사파리에서 페이스북 로그인을 해놓겠느냐는 것을 물어 온 것이다. 페이스북 입장에서는 항상 로그인 상태를 유지하게 만들고 싶은데, 사파리로 열 경우 로그인 상태가 아니므로, 좋아요를 누르거나 공유를 하는 행위가 줄어들기 마련일 것이다. 영악한 이 페이스북은 내가 사파리를 사용하기 전에 로그인을 해두는 것을 권유한다.


저작자 표시 동일 조건 변경 허락
신고

MySQL에서 초단위를 나타낼때, 소숫점 이하를 표현하는 기능은 2011년 12월에 출시된 5.6.4 버전이후에서부터 가능하다. micro second를 저장하기 위한 방법이며, 다음과 같은 문법으로 사용가능하다.


SELECT NOW(6);

CREATE TABLE X ( current datetime(6) );


위와 같이 NOW, SYSDATE 등의 함수에 소수점 이하 자리수를 지정하면 된다. 이 기능은 아직 아마존의 yum repository가 5.5 밖에 지원하지 않기 때문에 사용하려면, mysql이 제공하는 커뮤니티 패키지를 이용하여 설치해야한다. 아마존 RDS는 5.6을 지원하므로 바로 사용가능하다.

저작자 표시 동일 조건 변경 허락
신고

업무상 느끼는 것이지만 종종 주장하는 말이 있다.


'Raw data'에 많이 노출되어라


컴퓨터 바이러스 엔진을 만드는 개발자가 신종 바이러스를 샘플을 접하지 않고, 그간의 샘플 혹은 분석 자료만 가지고 만든다면, 그 엔진이 가지고 있는 한계는 어떤 단계에서 멈추기 마련이다. (종종 개발 일정이나 그 위험성 때문에 신종 샘플을 분석하는 일은 개발과 분리된 팀에서 진행된다) 고객들의 행동을 분석해 제품에 반영하는 절차를 갖는 개발사에서도 고객을 만나는 일과 개발자가 분리되어 있기 때문에 시장의 목소리를 정리하고 우선순위를 정하는 사람과 실제 제품을 만드는 개발자가 분리되어 있다면, 최종 산출물의 경쟁력이 어떤 수준에서 아쉬울 때가 있다.


'Raw data'로부터 최종 산출물까지의 종합적 사고 대신 누군가의 판단이나 실행에 의존하게 되는 경우로 개발이 되는 것보다 Start up에서는 그 단계가 압축된 경우가 많으므로 더 좋은 구현이 나올 가능성이 크다. 큰 회사에서도 'Raw data'로부터 안목을 기르고 개발 방향을 정하거나 개발의 우선순위를 결정하는 부분에 참여한 개발자가 시간이 지나면 중요한 위치에 올라갈 가능성이 더 크다.


생명체가 환경에 적응하고 적응한 변이들이 축적되어 복잡한 유기체로 발전해 온 원리가 위와 크게 다르지 않다. 그렇게 복잡하게 발전한 결과로서의 인간을 생각해 보자. 인간은 추상화의 능력에서 다른 종을 앞선다. 추상화와 미래에 대한 시뮬레이션으로 위험을 최소화하는 능력을 길러왔다. 일차적인 감각기관은 다른 생명체들과 마찬가지로 자연계로부터 얻을 수 있는 데이터들이다. 그 기반위에 종합하여 패턴을 발견하는 추상적인 감각이 길러진 사람이 더 잘 살아 남는 것이다.


맛에 대한 것도, 소리에 대한 것도, 시장에 대한 것도, 기술에 대한 것도 인간에게는 같은 방식으로 동작하는 전문성이 있다.



저작자 표시 동일 조건 변경 허락
신고

과거의 경험을 비추어 생각해보건데, 한 사이트의 보안에 취약한 페이지는 로그인페이지보다는 ID와 비밀번호 찾기였었다. 그 이유는 로그인에 대해서는 신경써서 여러가지로 테스트 해보면서 만들지만, 그것보다 중요하지 않다고 생각하는 페이지는 고민을 많이 하지 않고, 원래 의도하던 기능만 충실히 만들기 때문에 취약점이 많은 것이 사실이었다.


사이트를 만들때 생각하는 시간에 대해 생각해 보건데, 요즘엔 모바일 페이지와 PC 버전이 만들어지는 상황에서, PC 버전은 당연히 만들어야하나 만들고, 모바일 페이지에서는 PC 버전으로 확인하라는 메시지로 대치하는 경우가 있다. 모바일로 구현하자니 시간이 들어가고, 사용성도 높지 않은 상황이라면, 쉽게 그냥 PC 버전으로 유도하는 팝업만 보이라고 작업지시가 내려지기 마련이다.


보안문제라면 사이트 제작자에게 피해가 가겠지만, 모바일 버전-PC버전 문제는 사용자에게 돌아간다. 사실 모바일 페이지를 만드는 이유는 PC 화면처럼 넓게 쓰지 못하는 상황을 작은 화면에 최적화시키도록 만드는 것이다.  PC 버전을 만들때, 모바일 화면으로 보지 않는 것이 아니다. 정말 한 번도 안본 페이지를 만날때는 정말 당황스럽다. 내가 YES24에 1년간 로그인하지 않았나보다. 모바일로 확인하다가 PC 버전으로 로그인하면 1년 넘지 않아 잠긴 내 계정을 해제시켜주겠다하여 PC 버전을 모바일로 봤다. 그러나 나에게 돌아온 것은 누를 수없이 뭉게진 로그인 다이얼로그였다.


YES24 왜 그러세요. 이 페이지 이번만 쓰고 말 것인가요?


저작자 표시 동일 조건 변경 허락
신고

라즈베리파이에 로지텍 블루투스 키보드를 연결하여 쓰던차 "|" (pipe)가 입력되지 않고 "#"이 입력되는 문제는.


$ sudo apt-get install console-data

$ sudo loadkeys us


로 해결한다.


저작자 표시 동일 조건 변경 허락
신고

+ Recent posts