맥북을 한동안 업그레이드 하지 않고 살다가 어제 시간을 들여 업그레이드를 했다. 작년 10월에 나왔으니 6개월이 지났네.

뭔가 프로젝트를 진행하고 있을 땐, OS 업그레이드같은 걸로는 안건드리는게 상책인지라. 늑장 업그레이드.

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

King's Legion, Dungeon Poker 서버를 내리다.


2015년, 3월, 5월에 각각 오픈한 Dungeon Mason (a.k.a Gitul) 팀의 게임을 내렸다. 대략 5000명, 500명의 가입자가 있었으며, 지난 10개월정도는 DAU 1~2 를 꾸준히(!) 유지하고 있었다. (아무도 안쓴다는 이야기). 대략 매월 서버 비용으로 10만원정도가 나가고 있었으며,아마존의  m3.medium 한 대와 Redis 서비스하나로 운영되고 있었다.


나조차 실로 작년 6월 이후로는 접속조차하지 않았으나, 어떤 레퍼런스가 필요할지 몰라 유지하고 있었던 것을 더 이상 의미 없어 내리게 됐다.

마지막으로 들어가 소스들을 확인 한 바로는 내가 이 코드를 작성했었나 싶을 정도로 잘 기억나지 않는 것도 있었다. 그래도 기억을 위해서라도 기록을 하자면,


* Node.js 로 만들어진 Game API Server 데몬 하나, 이용자간 게임을 중계하기 위한 실시간 게임 데몬 두 개, A.I 로봇 데몬 한 개.


위 조합으로 한 개의 King's Legion을 담당하고, 같은 조합 하나를 더 두어 Dungeon Poker를 담당시켰다. 이 모든 데몬들을 m3.medium에서 운영했다.

그리고, Leader board 운영을 위해 Redis 서비스를 하나 돌렸으며, DB로는 MySQL 5.6을 사용했다. t2.micro 사이즈로 운영서버를 돌렸다.

서버는 접속자가 너~무 없는 관계로 펑펑 놀고 있었으며, 적절한 메모리가 필요했기에 m3.medium은 필요로 했었다.


* 로그인과 인벤토리 관리 Daily present는 모두 일반 웹서버로 동작하는 api 서버로 구현하였으며, 최대 4인이 하나의 방에서 실시간으로 하는 게임을 위해서는 Node.js + Websocket 기반으로 만들어졌다. 실시간 게임 데이터는 단지 메모리를 사용했을 뿐이며, 게임 서버와 api 서버간 메시지 교환은 Redis의 Publish/Subscribe 기반으로 중계하였다.


* 또한 Redis 서버는 ZRANK를 이용하여 각 리그당 주별 리더보드를 계산하기 위해 사용하였다.


* 로봇 서버는 일반 사용자가 접근하는 것과 똑같은 프로토콜로 게임서버에 Websocket으로 접속하여 운영되었으며, 동시에 30기가 운영되었다. 초반 붐업을 위해 도입하였으나, 오픈빨이후 하락하여서 내릴 여유(?)가 없었다. (로봇임이 너무 드러나는지라 아마 더 안되었으려나?)


서버들이여. 비록 그대들은 세상에 물리적으로 존재하는 가상의 서버였음에도, 우리의 사업을 오픈하는데 충분하였노라.

다시 그대들을 깨운다면, 그 때는 아마 과거에 대한 회상 때문이리라.

고이 잠에 드시기를....



저작자 표시 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
  1. 이성연 2016.04.15 20:30 신고

    고이 잠드소서

  2. june8th 2016.04.15 23:57 신고

    평생 서비스 하는거 아니었나요? 약관 좀 봅시다. 환불! 환불! 환불!

회상, recall. 반사행동.

자극이 들어 오면, 자극에 대한 반응이 일어난다.

인간을 신경의 다발이라고 가정한다면, 그 수준은 신경의 물리적인 자극에서부터 신경계의 2차, 3차 층위에 해당하는 추상적인 층위까지 모두 회상이라는 반응이 일어난다.

여기에는 측정되지 않은 무작위성(randomness)가 자극과 섞이면서 비슷하지만 조금씩 다른 결과를 만들어낸다.

그 결과는 다시 신경계의 연결 강도(weight)를 조절하거나, 혹은 기억이라는 과정으로 다음 회상의 재료가 된다.


그 신경다발 구조체가 얼마나 복잡해야 인간다운 수준이 될까?

혹은 어느 수준이 되어야 인간과 무리없는 상호작용을 할 수 있을까?

혹은 인간이 집중한다면 어느정도 상호작용은 할 수 있는 수준은 이뤄낼 최소 값은 존재할까?


염두에서 떠나지 않는다.

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

그 여름 가장 조용한 바다.

시게루(마키 쿠로우도 분). 주인공으로 쓸만한 이름이다. 머리가 곱슬이다. 황정민을 닯았다.

서핑을 한다.

여주는 박..모씨를 닯았다.

개연성 없는 오바. 일본 영화의 애니메이션 스러움.

서핑은 초속5cm에서 나오는 에피소드 3번이 인상 갚었는데...

영화는 2004년 개봉인데, 여기나오는 복장은 거의 써니 수준이다.

서핑보드 8600엔 대략 90만원

12000불짜리 서핑 보드를 산다.

일본 버스의 자동문이나, 내림버튼, 뒷문에 붙어 있는 백미러, 한국것과 비슷하구나. 출구는 반대겠지만.


그렇게 열심히 달렸는데, 땀 좀 내주지.

여자는 벙어리인가...

둘 다 청각장애인인가?

...



음악감독 히사이시 조. 바로 그~! 감독이라고!



저작자 표시 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
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

젊은(?)친구들은 공공연하게 저는 긴 글을 잘 못읽어요라는 말을 한다. 가끔 내 글 읽기 생활에서도 그러함을 느낄 때가 있는데, 요즘이 그렇다. 너무 분주하게 살다보면 긴 글 집중력 게이지가 떨어진다. 마음이 급하면 긴 시간 확보가 어렵기 때문이다.


이걸 기회로 측정할 수 있는게 있다는 사실을 발견하게 된 것 같다. 긴 글을 집중해서 읽어보기를 시도하면, 내 생활이 얼마나 뭔가에 몰입되어 사는 지 알 수 있는 것이다. 약간 아이러니인데, 그렇게 긴 글에 집중할 수 있으면, 사실 여유로운 생활을 한다는 것이고, 집중할 수 없다면 분주한 삶을 사는 것이다. 둘 다 잡는 것이 불가능할지라도 잡아야지.

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

"나는 옳다"라고 종종 되뇌인다. 내가 옳은 것은 마치 이것과 같다. 식물에 물을 주면 자란다. 그건 식물이라는 생명이 작동하는 방식이 그러하기 때문이다. 식물이 자라는 방식은 옳고 그름의 문제가 아니라 그냥 그 자체로 옳은 것이다. 미묘한 뉘앙스라 생각되기는 하지만, 나는 다른 적절한 표현을 찾지 못했다. 아니, 옳다라고 표현하는 것이 그리 나쁜 표현이 아니며, 내가 느끼는 느낌을 잘 표현한다고 생각한다.


내가 옳다는 것을 전제하지 않으면, 지금의 나를 살아갈 수가 없다. 중요한 것은 "지금" 이 시점에서의 내가 사는 방식이 그러하다는 것이다. 지금 내가 옳지 않으면, 그릇작동한다면, 그것은 내 존재의 작동방식이 부정되는 것이며, 그것은 이미 내가 아니다.


옳다는 전제, 제대로 작동하고 있다는 전제하에 단지 스스로를 해석할 뿐이다. 그것이 도덕적으로는 그를지라도, 생물학적, 자연적으로는 옳다. 그렇게 형성되어온 가치관 대로 판단하는 것이 지극히 자연스러운 것이기 때문이다.



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

하루의 시작은 광고성 메일을 지우는 것부터지.


4월은 불쑥 내 주위에 찾아 왔다. 그것도 2016년이라는 이름으로. 2013년 5월은 벌써 3년전 이야기가 되었고, 그 동안 나는 작은 전투에서 승리하지 못한 채 탈출구가 보이지 않는 미래를 좇아가며 때로는 나태로 때로는 조바심으로 살아왔다. 여전히 불안하다. 아무것도 이루지 못했고, 이것저것 해보지만 신통하지 않다. 집값은 아직도 다 값지 못했으며, 다행이 아내는 일을 하고 있다. Status Anxiety가 늘 있으며, Human-being Anomaly에 대한 의구심도 여전하다.


자유를 늘 추구하지만, 그간의 삶의 패턴에 조금씩 이식했을 뿐 그렇게 크게 용감하게 실행하지도 않는다.


아이들은 커가고, 다치고, 생일을 맞이한다. 때로는 좋은 아빠, 무심한 아빠, 나쁜 아빠. 일인삼역이 베스킨라빈스31 파인트처럼 켜켜이 쌓여 있다.


어쩌랴, 가려워도 조금참는 것처럼 가려운 인생 좀 긁다 포기하고 참는 것을 기술로 살아야지.

저작자 표시 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
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

공각기동대가 던져주는 메시지를 진작 알았다면 좋았을 것을 이 재밌는걸 요새 보고 있다니.


인간을 흉내내는 것으로 시작했지만, 결국 도착하는 것은 인간과는 다른 형태의 지능의 예고가 아닐까.

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

+ Recent posts