Docker에서 중요한 개념이 이미지와 컨테이너입니다. 컨테이너는 이미지를 실행한 상태라고 많이 설명합니다. 이 컨테이너중에 데이터 볼륨 컨테이너라는 유형이 있는데 이에 대한 이야기를 해보겠습니다.


Docker 호스트에 있는 특정 디렉토리를 Docker 컨테이너에 공유하고 싶다면 VOLUME을 사용합니다. Dockerfile에 VOLUME을 설정해보겠습니다.


FROM ubuntu:14.04

MAINTAINER scott hwang("k16wire@gmail.com")

VOLUME ["/opt/project/webapp", "/data"]


이 Dockerfile 이미지로(k16wire/ubuntu) 컨테이너를 만들면 '/opt/project', '/data' 디렉토리가 컨테이너에 만들어집니다. 컨테이너에 만들어진 디렉토리와 호스트에 있는 디렉토리를 바인딩 시키는건 컨테이너를 실행할때 합니다. 

docker run -d -P --name datacontainer -v src/webapp:/opt/project/webapp k16wire/ubuntu


 VOLUME을 명시하지 않고 -v 로 바인딩하면 어떻게 될까요? 바인딩 됩니다. 단 바인딩하려는 디렉토리가 반드시 존재해야 에러없이 컨테이너가 실행됩니다.


컨테이너가 하나 더 있다고 해보겠습니다. 이 컨테이너 역시 호스트에 있는 src/webapp 디렉토리를 공유하고 싶습니다. 그럼 앞에서 사용한 -v 옵션을 이용하면 됩니다. 

docker run -d -P --name web -v src/webapp:/opt/webapp nginx

하지만 이렇게 하지않고 앞에서 만든 컨테이너를 활용할수도 있습니다.

docker run -d -P --name web --volumes-from datacontainer nginx

후자처럼 컨테이너를 실행한다고 했을때 VOLUME을 공유하는 컨테이너를 데이터 볼륨 컨테이너라고 부릅니다. 그럼 데이터 볼륨 컨테이너를 쓰는것과 -v로 직접 디렉토리를 공유하는게 어떤 차이가 있을까요. 결과만 놓고 본다면 다르지 않습니다만 컨테이너 구성면에서 변화가 생깁니다.


-v 옵션으로 공유를 추가하는것은 컨테이너와 호스트간에 연결을 맺는것이지만 데이터 볼륨 컨테이너를 사용하면 컨테이너와 컨테이너간의 연결로 바뀝니다.(궁극적으로는 데이터볼륨컨테이너를 거쳐 호스트와 연결이 되는것이죠.) 호스트가 공유하고 싶은 데이터(여기서는 디렉토리)를 논리적인 단위로 추상화 시켰다고 볼수도 있습니다. 꼭 Symbolic Link를 만들어서 사용하고 물리적인 실제 경로는 숨기는것과 유사해보입니다.

Microservice 아키텍처로 본다면 컨테이너는 서비스에 해당하며 서비스는 특정 행위를 책임집니다. 데이터 볼륨 컨테이너는 데이터 공유라는 행위를 책임지는 서비스인 셈입니다. 이렇게 행위에 대한 역할이 명확해 지기 때문에 데이터 볼륨 컨테이너가 필요합니다. 


참고자료

[1] https://docs.docker.com/userguide/dockervolumes/#creating-and-mounting-a-data-volume-container

[2] https://medium.com/@ramangupta/why-docker-data-containers-are-good-589b3c6c749e

[3] http://stackoverflow.com/questions/18496940/how-to-deal-with-persistent-storage-e-g-databases-in-docker/20652410#20652410

[4] http://www.offermann.us/2013/12/tiny-docker-pieces-loosely-joined.html

[5] http://crosbymichael.com/advanced-docker-volumes.html


저작자 표시 비영리 변경 금지

닷 클라우드 솔로몬 하이크(Solomon Hykes)가 내부적으로 개발하던 Docker를 Pycon2013에서 처음 공개했던 영상입니다.


The Future of Docker Container

http://www.youtube.com/watch?v=wW9CAH9nSLs

5분밖에 안되는 발표지만 지금 보면 정말 충격적인 내용을 선보인겁니다. 저기 앉아 있는 사람들은 복받았네요. Hello World를 찍는 새로운 방법으로 추가할만 합니다.


위 데모중 Hello World 찍는 부분을 다시 재 구성한 영상도 있습니다.

http://www.youtube.com/watch?v=w4jfLy633xM





저작자 표시 비영리 변경 금지

Play 웹앱을 개발할때 특정 URL에 대한 접근권한을 제어하는 부분을 직접 구현하기보다는 Deadbolt를 이용하면 쉽게 처리할수 있습니다. Deadbolt는 오픈소스로 Java와 Scala를 둘다 지원합니다.


  • 소스코드: https://github.com/schaloner/deadbolt-2-java
  • Deadbolt 데모 페이지: http://deadbolt-2-java.herokuapp.com/

Deadbolt를 적용해보겠습니다.


1.project/plugins.sbt파일에 Resolver 추가

resolvers += "Deadbolt2 java releases" at "https://github.com/schaloner/deadbolt-2-java/releases"


2.build.sbt 파일에 Dependency 추가

"be.objectify" %% "deadbolt-java" % "2.3.2"


3.DeadboltHandler 정의

public class MyDeadboltHandler extends AbstractDeadboltHandler {

    @Override

    public F.Promise<Result> beforeAuthCheck(Http.Context context) {

        return F.Promise.pure(null);

    }


    @Override

    public F.Promise<Subject> getSubject(Http.Context context) {

        final Http.Cookie userCookie = context.request().cookie("userid");

        return F.Promise.promise(new F.Function0<Subject>()

        {

            @Override

            public Subject apply() throws Throwable

            {

                return // Subjet를 구해서 반환

            }

        });

    }

}


4.Deadbolt 모델 정의

https://github.com/schaloner/deadbolt-2-java/tree/master/test-app/app/be/objectify/deadbolt/java/test/models


5.application.conf에 Deadbolt 핸들러 정의

deadbolt {

    before-auth-check-timeout=4000,

    java {

        cache-user=true,

        handlers {

            defaultHandler=MyDeadboltHandler

        }

    }

}


6.conf/play.plugins에 Deadbolt 플러그인 추가

10000:be.objectify.deadbolt.java.DeadboltPlugin


7.로그인때 subject 키를 쿠키에 저장

response().setCookie("userid", String.valueOf(user.id), 60*60);


8.로그아웃때 subject 키를 쿠키에서 삭제

response().discardCookie("userid");


9.컨트롤러에 접근권한 설정

admin 그룹만 접근할수 있다면

@Restrict(@Group({"admin"}))

public static Result restrictedToFooAndBar()

{

        return ok("Content accessible");

}


로그인한 사람만 접근할수 있다면

@SubjectPresent

public static Result subjectPresent() {

    return ok(accessOk.render());

}


로그인하지 않은 사람만 접근할수 있다면

@SubjectNotPresent

public static Result subjectNotPresent_loggedIn() {

    return ok(accessOk.render());

}


컨트롤러에 Deadbolt가 적용되면 기존에 작성해 놓은 컨트롤러 테스트 코드가 인증정보가 없어서 실패할수 있습니다.


[1] 설정 관련 도움말 http://deadbolt.ws/#/java-docs


저작자 표시 비영리 변경 금지

Docker 컨테이너를 만들때 사내 사이트 dns에 대한 정보를 hosts 파일에 넣어야 하는 상황이 생겼습니다. 처음에는 간단하게 생각했습니다. 


표준 이미지를 만들때 표준으로 사용하는 hosts 파일을 복사하자.


Dockerfile의 COPY 명령어로 해결될줄 알았는데 해당 url에 대한 ip가 다르게 나와서 확인해보니 아래 링크를 찾았습니다.


Editing networking config files

Starting with Docker v.1.2.0, you can now edit /etc/hosts/etc/hostname and /etc/resolve.conf in a running container. This is useful if you need to install bind or other services that might override one of those files.

Note, however, that changes to these files will not be saved by docker commit, nor will they be saved during docker run. That means they won't be saved in the image, nor will they persist when a container is restarted; they will only "stick" in a running container.


원본링크: https://docs.docker.com/articles/networking/


요약하면 /etc/hosts, /etc/hostname, /etc/resolve.conf 와 같은 네트워크 설정 파일을 실행중인 컨테이너에서만 유지된다는 설명입니다. 이를 지원하는 옵션이 RUN 명령에 들어있습니다.


$ /docker run -ti --add-host db-static:86.75.30.9 ubuntu cat /etc/hosts

RUN 명령어 문서: https://docs.docker.com/reference/run/


--add-host 옵션뒤에 dns:ip 와 같이 적어주면 etc/hosts 파일안에 내용이 추가된것을 확인할 수 있습니다.

저작자 표시 비영리 변경 금지

Play2 프로젝트를 개발할때 IDE로 IntelliJ를 이용하면 Scala 플러그인이 있어 편하다. 그런데 Activator idea 명령으로 Play 프로젝트를 IntelliJ 프로젝트로 변환할때 소스 Path가 잘못 잡혀서 스칼라 코드 컴파일 에러가 나온다. 간단한 설정만 수정하면 스칼라 코드 컴파일 에러를 제거할 수 있다.


1.프로젝트 > Open Module Setting 화면을 연다.

2.소스코드 경로에 자동으로 생성되는 scala 코드 위치를 추가한다.

target/scala-2.11/twirl/main/views

target/scala-2.11/src_managed/main 



저작자 표시 비영리 변경 금지

Kubernets 소개 영상

Work & Study/TechTalk 2014/12/23 02:23 posted by k16wire

Docker 컨테이너 오케스트레이션 시스템 Kubernets를 소개하는 영상입니다.


http://www.youtube.com/watch?v=tsk0pWf4ipw#t=89

 

저작자 표시 비영리 변경 금지

AWS 콘솔에서 Docker 지원

Work & Study/TechTalk 2014/11/27 16:28 posted by k16wire

'소리없이 강하다.'는 표현은 아마존에게 어울리는 말이라는 생각이 듭니다.

조용히 있다가 툭하니 서비스를 내놓는데 그게 물건이니까요. MS나 구글이 도커에 대한 지원을 발표할때 가만히 있다가 이번에 API 로 도커 컨테이너를 만들수 있는 기능을 발표했습니다.


http://news.naver.com/main/read.nhn?mode=LSD&mid=sec&oid=293&aid=0000015091&sid1=001


저작자 표시 비영리 변경 금지

'Work & Study > TechTalk' 카테고리의 다른 글

IntelliJ에서 Play 프로젝트 설정 팁  (4) 2014/12/27
Kubernets 소개 영상  (0) 2014/12/23
AWS 콘솔에서 Docker 지원  (0) 2014/11/27
도커 입문서 Docker Book  (0) 2014/11/25
Play 책 저술을 접습니다.  (9) 2014/08/12
Try Ruby  (0) 2014/08/07

도커 입문서 Docker Book

Work & Study/TechTalk 2014/11/25 01:57 posted by k16wire

도커 공부하시는 분들 많으시죠.

저도 요즘 시간날때마다 찾아보는게 도커인데요. 

새로운 기술을 배울때 책으로 배우면 이미 늦었다고 말하지만 이정도면 괜찮은거 같습니다.

도커에 관심은 있고 컨퍼런스에서 발표도 몇번 들었는데 막상 해본적은 없어서 어떻게 시작할까 망설이는 분들에게 권해드립니다.


http://www.dockerbook.com/


저작자 표시 비영리 변경 금지

'Work & Study > TechTalk' 카테고리의 다른 글

Kubernets 소개 영상  (0) 2014/12/23
AWS 콘솔에서 Docker 지원  (0) 2014/11/27
도커 입문서 Docker Book  (0) 2014/11/25
Play 책 저술을 접습니다.  (9) 2014/08/12
Try Ruby  (0) 2014/08/07
멤버변수 타입과 클린코드  (0) 2014/03/31

Play 책 저술을 접습니다.

Work & Study/TechTalk 2014/08/12 09:39 posted by k16wire

출판사와 맺었던 Play 책 저술 계약을 파기했습니다. 책을 쓰겠다고 결심하고 1년 넘게 진행했던 일을 접으려니 아쉬움이 남네요. 사실 원고를 80~90%정도 쓰고나서 출판사 리뷰, 독자리뷰도 여러차례 진행하면서 몇가지를 깨달았습니다.


  • 이 책은 많이 팔리지 않을거 같다.
IT책이 아니더라도 국내 출판 시장이 부진한건 어제 오늘 일이 아닙니다. 그중에도 IT책은 더 심하죠. 당장 써먹을수 있는 기술이나 트렌드가 되는 기술이 아니면 책을 사지 않습니다. 애자일, SW 품질, Play 프레임워크 같은 기술은 철저히 외면받는게 현실입니다. 팔릴거 같지 않은 책을 굳히 내겠다고 출판사를 조르는것도 아닌거 같습니다.
  • 책을 쓰는게 돈벌이가 안된다.
책을 쓰는 목적이 여러가지가 있겠습니다만 들어간 시간대비 비용은 보전할수 있어야 한다고 생각합니다. 저술의 경우 인세율은 5~15% 사이입니다. 보통 8-10% 정도 받는다고 보시면 맞습니다. 10,000원이 정가인 책을 1쇄(2000~3000권)를 찍는다고 하면 저자가 손에 쥘수 있는 돈은 인세 8%기준일때 160~240만원 정도되겠네요. 이 돈이면 그냥 강의한번 하는게 낫죠. 책이 많이 팔리면 더 많이 벌수 있는거 아니냐고 반문하실 분들도 계실거 같은데 IT책은 1쇄를 파는데 보통 1년이 걸리고 2쇄를 안찍고 절판되는 경우도 흔합니다.
  • 제가 쓰고 싶은 책은 이게 아닌데
이 부분이 저술을 접게된 가장 큰 이유입니다. 처음에 쓰겠다고 잡았던 컨셉은 점점 안드로메다로 가버리고 어느새 제 손에는 전혀 다른 책이 들려 있었습니다. 독자들이 원하는 책, 읽고 싶어하는 책에 맞추다 보니 저도 모르게 그렇게 되더군요. 그러고 나니 점점 책을 교정보기 싫어하는 자신을 발견했습니다. 왜 내가 이렇게 싫은일을 꾹꾹 참으면서 해야하는 거지.

책을 낼겁니다. 그런데 이런 기성 출판 시장의 문제점을 끌어 안은채 내고 싶지는 않네요. 제가 쓰고 싶은 책을 원하는 방식으로 내기 위해서 오늘은 저술을 접습니다.


저작자 표시 비영리 변경 금지

'Work & Study > TechTalk' 카테고리의 다른 글

AWS 콘솔에서 Docker 지원  (0) 2014/11/27
도커 입문서 Docker Book  (0) 2014/11/25
Play 책 저술을 접습니다.  (9) 2014/08/12
Try Ruby  (0) 2014/08/07
멤버변수 타입과 클린코드  (0) 2014/03/31
빌드배포 시스템 JARVIS  (0) 2014/02/26

Try Ruby

Work & Study/TechTalk 2014/08/07 20:54 posted by k16wire

루비 언어를 쉽게 배울수 있게 해주는 사이트입니다.


http://tryruby.org/levels/1/challenges/2


저작자 표시 비영리 변경 금지

'Work & Study > TechTalk' 카테고리의 다른 글

도커 입문서 Docker Book  (0) 2014/11/25
Play 책 저술을 접습니다.  (9) 2014/08/12
Try Ruby  (0) 2014/08/07
멤버변수 타입과 클린코드  (0) 2014/03/31
빌드배포 시스템 JARVIS  (0) 2014/02/26
git 레파지터리에 대한 통계가 필요하면 gitstats  (0) 2014/01/07

멤버변수 타입과 클린코드

Work & Study/TechTalk 2014/03/31 11:48 posted by k16wire

코드를 리팩토링하다가 배운것 하나를 정리해 봅니다. 아래와 같은 이메일 발송을 위한 VO가 있습니다.

public class MailContents {

private String[] to;

private String subject;

private String text;

private boolean isHtml = true;


public MailContents(String[] to, String subject) {

this.to = to;

this.subject = subject;

}


public MailContents(String from, String[] to, String subject) {

this.from = from;

this.to = to;

this.subject = subject;

}


public MailContents() {

}


}


메일을 받게될 to가 Stringp[] 으로 되어 있네요. 이 객체를 만드는 서비스는 DAO를 호출한 결과로 이 값을 설정하는데 반환값이 List<String> 이어서 아래와 같은 형변환이 일어납니다.

private String[] getMailRecipients(Long projectId) {

        String[] recipients memberRepository.findRecipients(projectId);

  return recipients.toArray(new String[recipients.size()]);

}


문제는 이와 같은 형변환이 이 객체를 사용하는 곳곳에서 일어난다는데 있습니다. 반드시  String[] 배열을 사용해야 하는게 아니라면 데이터를 반환하는 메소드의 반환타입(여기서는 List<String>) 쓰는게 간결한 코드를 만들수 있습니다. 변환이 필요하다면 가능한 중간에 변환하지 말고 마지막까지 변환을 미루는게 좋습니다.



저작자 표시 비영리 변경 금지

빌드배포 시스템 JARVIS

Work & Study/TechTalk 2014/02/26 11:10 posted by k16wire

작년은 회사에서 사용할 빌드/배포 시스템을 만드느라 보낸거 같습니다. 모든 내용은 아니지만 간단하게 이 시스템을 만들면서 고민했던 내용을 정리해서 회사 블로그 README에 올렸습니다.


http://readme.skplanet.com/?p=7148


빌드 배포 시스템에 관심있는 분들 한번씩 읽어보세요.



저작자 표시 비영리 변경 금지

'Work & Study > TechTalk' 카테고리의 다른 글

Try Ruby  (0) 2014/08/07
멤버변수 타입과 클린코드  (0) 2014/03/31
빌드배포 시스템 JARVIS  (0) 2014/02/26
git 레파지터리에 대한 통계가 필요하면 gitstats  (0) 2014/01/07
테스트 커버리지를 측정하는게 필요할까요  (0) 2013/06/03
glu 모델  (0) 2013/05/27

git 레파지터리를  가지고 통계 데이터를 뽑아줍니다. 


설치

사이트(http://gitstats.sourceforge.net/)에서 압축파일을 다운받아 적당한 위치에 압축을 해제하면 됩니다.

파이썬으로 되어 있어 별다른 설치가 필요없지만 내부적으로 gnuplot(http://www.gnuplot.info/)을 사용합니다. 그래서 gnuplot도 설치해 줍니다.

brew update

brew install gnuplot

설차하다 중간에 libpng를 찾을수 없다는 에러가 떠서 brew(http://brew.sh/)를 업데이트 한 다음 다시 설치하니 정상적으로 끝났습니다.


실행

gitstats를 실행하려면 분석할 git 레파지터리를 clone 받아야 합니다. 

gitstats [options] <gitpath..> <outputpath>

gitpath는 미리 로컬에 clone 해놓은 위치를 명시해주면 됩니다. 실행하면 결과는 html 형식의 레포트로 나옵니다. gitstats 사이트에 가보면 레포트 샘플을 확인할수 있습니다.


http://gitstats.sourceforge.net/examples/dokuwiki/activity.html


저작자 표시 비영리 변경 금지



오늘 지인분과 테스트 커버리지에 대해 나눈 이야기를 간단하게 정리해봤습니다.


테스트 커버리지를 측정하는게 필요할까요?

저는 필요하다고 생각합니다. 커버리지를 측정하지 않으면 현재 가진 문제점이 드러나지 않습니다. 현재 얼마나 테스트 코드를 작성하고 있는가에 대한 대답을 할 수 있어야 합니다.


테스트 커버리지를 어떻게 가이드 해야 할까요?

N사에 있을때는 80% 이상이면 Gold, 70% 이상이면 Silver 이런식으로 등급을 나누어서 이를 각 조직에서 달성하도록 했습니다. 그러면 각 팀이 현재 어느수준에 와있고 어떤 노력을 해야 하는지 조금은 명확해 집니다. 아래 그림은 CI 서버를 이용해 자동으로 커버리지를 계산하여 등급을 보여주는 화면입니다.



테스트 커버리지를 높히기 위해서 경쟁하게 될거 같은데요

맞습니다. 그래서 커버리지를 측정한다고 해도 이를 강요해서는 안됩니다. 커버리지는 현재 테스트 코드 수준을 판단하는 한가지 지표일 뿐입니다. 


그럼 얼마나 높은 수준을 유지해야 할까요?

80%. 사실 테스트 코드를 작성하는 수준이 높아지면 테스트 커버리지는 의미가 없어집니다. 테스트 커버리지로 테스트 코드의 질을 평가할수는 없기 때문입니다. 어떻게 하면 좋은 테스트 코드를 작성할 수 있을까를 고민하는 개발자에게 '너 왜 코드 커버리지가 이렇게 낮아. 이 부분을 보강해.' 이런 식의 강요는 의미없죠.


너무 테스트 코드가 많으면 테스트 코드를 유지하느라 많은 비용이 들거 같아요.

소스가 변경되었을때 테스트가 실패하는것은 당연합니다. 그게 바로 테스트 코드가 해야하는 일입니다. 테스트 코드를 수정하는 일을 비용으로 보는것은 잘못된 시각입니다. 깨지는것, 버려지는것을 테스트 코드의 라이프 사이클로 보세요.


테스트 커버리지에 대한 논란이 있다는건 아직 테스트 코드 작성에 대한 마인드가 개발조직에 자리잡지 못했다는 징후라고 생각합니다. 숫자에 얽메이지 마세요. 

버그를 막아주는 좋은 테스트 코드를 작성하는데 집중하세요. 


참고자료

[1] http://googletesting.blogspot.kr/2010/07/code-coverage-goal-80-and-no-less.html


저작자 표시 비영리 변경 금지

glu 모델

Work & Study/TechTalk 2013/05/27 00:42 posted by k16wire

glu는 배포에 필요한 작업을 모델에 정의합니다. 이 모델은 json 형태로 되어있으며 모델이 갖는 정보는 3가지입니다.: 애플리케이션을 배포하기 위해서 무엇을, 어디에, 어떻게 할것인지  

튜토리얼에 들어있는 샘플 모델을 보겠습니다.


{
  "fabric": "prod-chicago",
  "entries": [
  {
   "agent": "node01.prod",
   "mountPoint": "/search/i001",

   "script": "http://repository.prod/scripts/webapp-deploy-1.0.0.groovy",
   "initParameters": {
      "container": {
        "skeleton": "http://repository.prod/tgzs/jetty-7.2.2.v20101205.tgz",
        "config": "http://repository.prod/configs/search-container-config-2.1.0.json",
        "port": 8080,
      },
      "webapp": {
        "war": "http://repository.prod/wars/search-2.1.0.war",
        "contextPath": "/",
        "config": "http://repository.prod/configs/search-config-2.1.0.json"
      }
   }
  }
  ]
}
  • 위 예에서 어디에 해당하는것이 agent와 mountPoint 이며 
  • 어떤 스크립트를 이용해서 배포를 하겠다는 부분이 script 이며 
  • 마지막으로 무엇을 배포하겠다는 정의가 initParameters 입니다.

glu 오케스트레이션 엔진은 이 모델파일을 읽어서 다음과 같은 작업을 진행합니다.

  1. 현재 배포되어 있는 상태와 모델에 정의된 상태를 비교한다.
  2. 실행 명령을 가지고 배포 계획을 만든다.
출처: http://pongasoft.github.io/glu/docs/latest/html/index.html

저작자 표시 비영리 변경 금지

glu는 무엇인가

오픈소스 배포 모니터링 자동화 플랫폼


glu로 무엇을 할수 있는가

- 많은 노드에 애플리케이션을 배포하고 모니터링 할 수 있다.

- 배포 시간때문에 발생하는 불일치를 막아준다.

- 문제가 발생했을때 이를 재빨리 알아내서 해결할 수 있게 해준다.


어떻게 동작하는가

glu는 필요한 작업을 model에 정의해 놓으면 이를 바탕으로 동작한다. glu가 동작하는 방식을 나눠보면

- 어플리케이션을 배포/업그레이드하는 일련의 작업을 계산한다.

- 일관성을 유지하기 위해 얼마나 시간이 걸리는지 확인한다.

- 배포가 잘못되면 확인해서 알려준다.


glu 아키텍처

glu는 크게 ZooKeeper, glu 오케스트레이션 엔진, 에이전트로 구성된다. ZooKeeper는 glu 에이전트가 보내주는 정보를 받아서 애플리케이션이 배포된 서버가 살아있도록 유지해주는데 사용한다. glu 에이전트는 애플리케이션이 배포될 서버에 설치되어 실행된다. glu 엔진이 이 시스템이 중요한 부분이다.



출처: http://pongasoft.github.io/glu/docs/latest/html/index.html

저작자 표시 비영리 변경 금지

GTAC 2013

Work & Study/TechTalk 2013/05/07 22:55 posted by k16wire

GTAC은 Google Test Automation Conference 입니다. 지난 4월23~24일 양일간 뉴욕에서 열렸는데요. 이 멋진 컨퍼런스의 모든 발표자료와 영상이 무료로 공개되었습니다. 

GTAC 2013 WrapUp

GTAC2013: Presentations

제목만 봐도 끌릴만한 발표들이 즐비합니다. 잘 준비해서 내년에는 직접 한번 가보고 싶네요.


저작자 표시 비영리 변경 금지

'Work & Study > TechTalk' 카테고리의 다른 글

glu 모델  (0) 2013/05/27
배포 모니터링 자동화 플랫폼 glu  (0) 2013/05/20
GTAC 2013  (0) 2013/05/07
Play2 특징을 소개하는 영상  (0) 2013/05/01
나는 프로그래머로서 어느정도 수준인가  (0) 2013/04/25
초간단 웹서버 띄우기  (0) 2013/04/18

Play2 특징을 소개하는 영상

Work & Study/TechTalk 2013/05/01 16:29 posted by k16wire

이전에 NHN에서 진행했던 테크 브리핑 영상입니다. 사내행사를 녹화한것입니다만 어차피 시간이 지나면 의미없으니 공개하려고 합니다. 40분동안 Play2 Framework의 특징에 대해 설명합니다. 

샘플을 가지고 시연하는 부분도 사이사이 들어있으니 부담없이 보세요.



저작자 표시 비영리 변경 금지

팀원분이 공유해주신 Programmer Competency Matrix를 보면서 궁금해 졌습니다. 

나는 프로그래머로서 어느정도나 되는걸까? 

많은 개발자분들이 저와 같은 고민을 하고 있지 않을까요. 아래 링크를 따라가시면 Computer Science, Software Engineering, Programming, Experience, Knowledge 영역별로 Level0 ~ Level3 까지 정의되어 있는 매트릭스를 보실수 있습니다. 


http://www.indiangeek.net/wp-content/uploads/Programmer%20competency%20matrix.htm


내용이 모두 마음에 드는것은 아닙니다. 특히 SE는 너무 내용이 빈약하네요. 하지만 Computer Science와  Programming은 괜찮은거 같습니다. 한번쯤 재미로라도 본인의 수준을 확인해보시죠.


저는 영역에 따라 다르기는 한데 Level2 ~ Level3를 왔다갔다 하네요.



저작자 표시 비영리 변경 금지

'Work & Study > TechTalk' 카테고리의 다른 글

GTAC 2013  (0) 2013/05/07
Play2 특징을 소개하는 영상  (0) 2013/05/01
나는 프로그래머로서 어느정도 수준인가  (0) 2013/04/25
초간단 웹서버 띄우기  (0) 2013/04/18
Play에서 사용할수 있는 모듈들  (0) 2013/04/12
좋은 API 디자인 하기  (0) 2013/04/09

초간단 웹서버 띄우기

Work & Study/TechTalk 2013/04/18 17:58 posted by k16wire

맥에는 python이 기본으로 설치되어 있습니다. 이 python으로 초간단 웹서버를 띄우는 방법입니다. 

python -m SimpleHTTPServer 8081


저작자 표시 비영리 변경 금지

플레이 프레임워크가 뜨지 못하는 이유중 하나를 저는 서드파티 모듈이 부족해서라고 생각합니다. 

RoR, GRails, Play와 같이 빠른 개발을 지향하는 기술에서는 굉장히 중요한 부분이죠. 부족하다고 말했지만 그래도 2.0을 지원하는 모듈이 꽤 많이 개발되고 있습니다. 아래 링크에서 한번 확인해보세요. 


http://www.playframework.com/documentation/2.1.1/Modules





저작자 표시 비영리 변경 금지

좋은 API 디자인 하기

Work & Study/TechTalk 2013/04/09 17:25 posted by k16wire

KTH 개발자 블로그에 올라온 좋은 API 디자인하기, 왜 그것이 중요한가? 를 읽다가 내용이 너무 좋아서 원본 동영상을 공유합니다. API를 코드로 바꿔도 손색이 없을만큼 좋은 내용이네요.

역시 좋은 발표는 시간이 흐른다고 흐트러지는게 아니네요. 꼭 한번씩 감상해보세요. (영어자막도 있으니 잘 안들리면 키고 보셔도 좋습니다.)



저작자 표시 비영리 변경 금지

SKP에 오자마자 가이드를 만드는 일을 맡아서 오랜만에 코딩 표준을 좀 찾아봤습니다. 

그런데 몇년전에 비해 하나도 변한게 없네요. 안드로이드쪽은 많이 다를거라 생각했는데 의외로 코딩에 대한 기준은 차이가 없더군요. 그러다 구글링으로 찾은 슬라이드에서 우연히 본 내용이 마음에 들어 공유합니다.

출처: http://courses.coreservlets.com/Course-Materials/pdf/android/Android-Coding-Style.pdf


코드에 달린 주석을 살펴보면 쓸데없는 주석이 많습니다. 그런 주석중 대표적인 형태가 이런겁니다.

"이 클래스는 사용자 관리를 위한 클래스 입니다." 있으나 마나한 주석이죠. 

그 보다는 어떤 동작을 하는지 설명하는 주석이 좋은데 잘 안 와닿습니다. 그럴때는 3인칭 관점에서 주석을 써보시죠. 좀 더 의미있는 주석이 나올거 같습니다.



저작자 표시 비영리 변경 금지

이런 서비스 하나 있으면 좋겠다 하는 생각은 누구나 합니다. Programmable Web에 올라오는 수많은 오픈 API들을 보면서 이런 서비스들을 잘 엮어주는 서비스 없나. 그런것 있으면 참 좋을거 같은데..하는 생각을 했습니다. 있네요. ^^;


Zapier(https://zapier.com/)는 코딩 한줄 안해도 원하는 서비스를 엮을수 있도록 해줍니다. gmail에서 메일을 받아서 evernote로 남기는 작업을 어떻게 통합하는지 한번 보시죠.



통합작업이 아무리 쉬워도 내가 원하는 서비스가 없다면 소용없죠. Zapier를 이용해 통합할수 있는 서비스에 어떤것들이 있는지는 https://zapier.com/zapbook/에서 확인 가능합니다. 제가 아는 서비스는 이미 대부분 지원하는군요. 와우!


UX도 깔끔하고 정말 맘에 드는 서비스네요.


저작자 표시 비영리 변경 금지

Yalp Framework

Work & Study/TechTalk 2013/03/12 09:15 posted by k16wire

Play 1.2.x에서 파생되어 나온 프레임워크입니다. 메일링 리스트에서 계속 논란이 있더니 결국에는 새로운 프레임워크가 등장했네요. 어떻게 발전해나갈지 궁금합니다.


https://github.com/yalpframework/yalp



저작자 표시 비영리 변경 금지