Book Review, The Year Without Pants: WordPress.com and the Future of Work

“바지 벗고 일하면 안 되나요?- 워드프레스닷컴과 미래의 노동” 이라는 책을 읽었다. 이 책에서는 오픈소스 기업에서 어떻게 일하는지, 그들의 문화를 어떻게 만들어 내는지에 대해서 알려주고 있다. 이 책의 내용은 꽤 흥미로웠는데 내가 일하고 있는 소프트웨어 산업에서는 원격근무(Remote working)가 낳설지 않다.[1] 물론, 내가 원격근무를 해본건 아니지만 장단점들이 존재하겠지. 만일, 오픈소스 기업이나 원격근무에 대해서 관심있는 사람들이라면 이 책이 도움이 될거 같다. 원서로 읽어도 되고, 한글판도 있으니 도움이 되시길

I’ve been reading a book named, “The Year Without Pants: WordPress.com and the Future of Work.” The book explains how an open source company works and makes their own culture. It was a very interesting story for me. Especially in the software industry, remote working is common nowadays [1]. An employees focuses on the their performance without formality. Of course, there’re pros and cons. If you’re interested in an open source company and remote working culture, this book will come in handy to you.

[1] https://weworkremotely.com

Slack에서 Zabbix 알림 받기 (How to integrate Slack and Zabbix)

힙챗(Hipchat)슬랙(Slack)은 요즘 많이 사용하는 IRC 대체 도구들이다. 이 도구들은 일정량 혹은 기능들들은 무료로 사용가능하다. 특정 프로젝트를 도와주고 있고, 커뮤니케이션 도구의 통합이 필요해보였다. 또한, 서비스 운영상의 알림들을 여기로 통합할 필요가 있었다. Slack 에서는 RESTful APIs 를 공개하고 있고, 이를 구현한 구현체 또한 많다. 이걸 사용하게 되면 Zabbix 에서 알림을 받을 수 있다.
이미 공개된 스크립트(https://github.com/ericoc/zabbix-slack-alertscript)가 있긴한데 인코딩 및 개행문자의 버그가 있어 직접 스크립트를 작성했다. 고작 몇줄…

As you know, many start-ups and people use free services such as HipChat or Slack to communicate with others. Recently I helped some project to integrate their communication channels. They wanted to integrate slack and monitoring systems such as Zabbix as well.
I have discovered that open source script(https://github.com/ericoc/zabbix-slack-alertscript) has some bug include encoding, literal problems. So, I wrote a few codes to alert message to Zabbix. It helps you if you want to integrate slack and Zabbix.

Pre Requirements

* Zabbix
* Python
* Slacker (https://github.com/os/slacker)

Install

1. Get api-key from Slack
1) Move to http://api.slack.com
2) “Create token” That’s it.

2. Save the script
vim /usr/lib/zabbix/alertscripts/zabbix-slack.sh

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
Zabbix Slack Alert Script
"""

import sys
from slacker import Slacker
import datetime

if __name__ == '__main__':
    if len(sys.argv) != 4:
        exit(1)

    recipient = sys.argv[1]
    subject = sys.argv[2]
    body = sys.argv[3]
    now = datetime.datetime.now()

    message = "-----------------------------------------\n\nDate : %s\nSubject: %s\n\n%s" % (now, subject, body)

    #print message
    slack = Slacker('slack-api-key')
    slack.chat.post_message('#general', message)

3. Configure on Zabbix
1) Administrator > Media types > Add
– Name : Slack Notification
– Type : script
– Script name : zabbix-slack.sh

2) Users > user > Media tab > Add
– Type : Slack Notification
– Send to : any

3) Triggers

Results

하둡 설정 방법( How to configure Hadoop 2.X )

기술에 관심있는 많은 사람들이 하둡과 빅데이터에 대해서 알고 있습니다.(물론, 빅데이터 != 하둡) 그래서 하둡을 설치하고 운영하려고 합니다. 하지만, 많은 사람들이 하둡 설정에 대해서 어려워하고 어떻게 해야하는지 물어 보는데 설정법을 정리해서 공유합니다.

Nowadays tech guys know about Hadoop or Bigdata(Of course Bigdata != Hadoop). So, they try to install and operate Hadoop. However, soon they feel it’s hard to install or configure it. So many people ask how to configure Hadoop 2.X. Thus, I share my experience here.

1. 하둡의 설정파일 위치( Configuration file path of Hadoop )
$HADOOP_HOME/etc/hadoop

2. 핵심 설정 파일( Core configuration files )
– /etc/hosts
– core-site.xml
– hdfs-site.xml
– mapred-site.xml
– yarn-site.xml
– slaves

3. /etc/hosts

xxx.xxx.xxx.xxx namenode
xxx.xxx.xxx.xxx secondarynamenode
xxx.xxx.xxx.xxx datanode01
xxx.xxx.xxx.xxx datanode02
xxx.xxx.xxx.xxx datanode03
......
......
xxx.xxx.xxx.xxx datanode0N

4. core-site.xml

<configuration>
<property>
        <name>fs.defaultFS</name>
        <value>hdfs://namenode:9000</value>
</property>
<property>
        <name>hadoop.tmp.dir</name>
        <value>/data/hadoop/tmp</value>
</property>
</configuration>

5. hdfs-site.xml
$HADOOP_HOME 변수를 치환해야 합니다.(You have to replace the $HADOOP_HOME value.)

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>3</value>
  </property>
  <property>
    <name>dfs.webhdfs.enabled</name>
    <value>true</value>
  </property>
  <property>
    <name>dfs.secondary.http.address</name>
    <value>secondarynamenode:50090</value>
  </property>
  <property>
    <name>dfs.hosts.exclude</name>
    <value>$HADOOP_HOME/etc/hadoop/exclude</value>
  </property>
  <property>
    <name>dfs.hosts</name>
    <value>$HADOOP_HOME/etc/hadoop/include</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/data/hadoop/dfs/name</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///data/hadoop/dfs/data</value>
  </property>
  <property>
    <name>dfs.namenode.checkpoint.dir</name>
    <value>/data/hadoop/dfs/namesecondary</value>
  </property>
  <property>
    <name>dfs.datanode.hdfs-blocks-metadata.enabled</name>
    <value>true</value>
  </property>
</configuration>

6. mapred-site.xml
$HADOOP_HOME 변수를 치환해야 합니다.(You have to replace the $HADOOP_HOME value.)

<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
  <property>
    <name>mapreduce.jobtracker.hosts.exclude.filename</name>
    <value>$HADOOP_HOME/etc/hadoop/exclude</value>
  </property>
  <property>
    <name>mapreduce.jobtracker.hosts.filename</name>
    <value>$HADOOP_HOME/etc/hadoop/include</value>
  </property>
</configuration>

7. yarn-site.xml

<configuration>
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <property>
    <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
  </property>
  <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>namenode</value>
  </property>
</configuration>

오픈소스 활동의 오해

많은 사람들이 오픈소스 활동에 대해서 관심이 무척이나 많다. 척박한 국내환경을 벗어날 수 있는 유일한 대안처럼 여기는 듯하다. 오해는 오해를 만들어 내며 잘못된 방향(묻지마 창업투자, 소프트웨어 수능과목 추진처럼)으로 이끌기도 한다. 난 예전부터 늘 지식공유 활동에 대해서 관심이 많았고, 오픈소스 활동을 한지는 사실 얼마되지는 않았다. ( 다른 사람들처럼 수년에서 십수년한게 아니니… ) 실제로 오픈소스 활동들을 하다보니 밖에서 보는 것과 실제로 느끼는 감정들이 다르다. 실제로 오픈소스 활동을 고민하고 있는 사람들을 위해서 글로 적고 싶다는 생각을 하였다.

1. 오픈소스를 꼭, 반드시 해야만 한다?

개발자 커뮤니티의 모임, 각종 컨퍼런스와 세미나에서 오픈소스 활동을 권장을 하고 있다. 큰 맥락에서 다 옳은 길이며 나또한 그렇게 믿고 사회를 발전 시키는 한 방법이라고 생각한다. 실제로 오픈소스 활동을 하면서 나의 보잘것 없는 실력을 깨닫기도 하고, 이런저런 시도를 하면서 발전을 하기도 한다. 하지만, 이 모든 것은 본인과 오픈소스 활동이 잘 맞을 때의 이야기이다. 오픈소스 활동은 일종의 문화활동, 취미활동과 유사하다. 따라서 본인과의 궁합(?)이 잘 맞는지가 아주 중요하다.

많은 엔지니어가 년초마다 새해결심들을 한다. 많은 항목들이 운동하기, 영어공부, 책 몇권 이상 읽기, 스터디 참석, 오픈소스 활동 등등의 것들일 것이다. 하지만,  우리에게는 24시간 밖에 주어지지 않고 모든 것을 다할 수 없다. 따라서, 결심이 실제 행동으로 옮겨지기까지는 많은 노력이 필요하다. 오픈소스 활동을 하기 위해서는 본인의 시간을 할애해야 한다. 실제로 행동에 옮겼더라도 많은 장애요소들이 많다. 특히 남의 코드를 읽는 일, 실력, 언어의 장벽은 노력해도 참 어렵다.

업무와 어느정도 연관이 있어 활동하는 나도 주당 몇시간 이상을 퇴근 후 메일링리스트를 읽고 답변하고, 코드를 읽으며 활동하다보면 어느덧 자정이다. 회사에서 일하며 지친몸으로 친구와의 치맥의 유혹을 벗어던지고도 이러한 활동들이 즐겁다면 본인에게 맞는 것이다. 그렇지 않다면, 기혼자라면 자식들과의 시간을, 미혼자라면 연애를 하는것이 인생을 훨씬 잘살아가는 방법일 것이다. 사랑을 하기에도 인생은 짧은거 같다. 오픈소스활동은 개발을 좋아하는 사람들의 한가지의 방법이라는 것으로 인식하는 것이 중요하며 단지 무슨 무슨 커미터라는 타이틀만 보고 덤비기에 이세계 사람들은 뜨네기를 너무나도 잘 안다.

2. 오픈소스 커미터들은 슈퍼개발자?!

스타트업에서 정의하는 슈퍼개발자와 일정규모 이상의 조직에서 정의하는 슈퍼개발자가 다르듯 상황에따라 슈퍼 개발자는 다르게 정의된다. 단어 자체가 가지는 모호한 성격이 있다. 오픈소스 커미터 또한 슈퍼개발자로 바라보는 일부 시선이 있는듯 하다. 나또한 예전에는 그렇게 바라보았고 동경해왔던 것이 사실이다.

하지만, 실제 활동을 하다보니 앞서 얘기한 것처럼 활동 자체를 즐기는 사람들이 아니면 꾸준히 하기 어렵고, 개발(프로젝트)을 정말 좋아하는 사람들이 아니면 이러한 활동들을 하기 어렵겠다라고 많이 느낀다. 시간을 많이 쓰다보니 커미터들의 개발실력은 당연히 어느정도 갖추어지는 것은 맞는듯하지만(확률상) 모든 것을 다 알며 개발하는 것은 아니다. ( 느끼기에 타고난 머리가 있는 사람들도 있지만 사실 시간을 많이쓴 사람들이 더 많은 느낌이다.) 따라서, 오픈소스 커미터를 슈퍼개발자 혹은 동경의 대상으로 바라보기보다는, 활동자체를 즐기며 개발을 즐기는 사람이라고 보는 것이 더 객관적인 평가일듯 하다.

마무리,

오픈소스가 무조건적인 ‘선’, 상업적인 소프트웨어가 무조건 ‘악’ 이 아니다. 서로의 영역들이 존재하고 서로 긍정적인 경쟁을하며 IT업계가 더 발전하고 있다. 지식이 공유되며 사회가 발전하는 것이라고 믿고 있고, 오픈소스 활동또한 이러한 맥락이라고 생각한다. 하지만, 무조건적인 찬양은 지양해야하며 객관적인 시선을 유지할 필요가 있다. 자기의 시간을 할애하면서도 오픈소스 활동에 도전을 하고 싶다면 아래 슬라이드가 도움이 될 것이다.

2013년 10대 키워드

  • 첫사랑 설램과 사랑
  • 영어
  • OSCON 2013 발표
  • 아파치 커미터
  • KTH 구조조정, 그리고 KT
  • 두번째 미국 방문
  • 공개 소프트웨어 공헌상
  • 컨설팅과 한계
  • L* 로 차 변경
  • 모모팀 여행