블로그 이미지
윤영식
Frontend Application Architecter, Full Stacker, KnowHow Dispenser and Bike Rider

Publication

Statistics Graph

Recent Comment

장강일님 페이스북 글 발췌 


"더 나은 의사결정을 내리는 7단계"

1. Set a deadline.

의사결정의 반대는 지지부진 의사결정을 미루는 것이다. 우유부단함(indecision)은 다른 사람들이 당신을 대신해 의사결정내릴 때까지 망설이게 만든다. 그러므로, 중요한 의사결정은 마감일(deadline)이 있어야 한다. 당신이 "자율적으로(will)"으로 결정을 할 수 있는 최종기한을 뜻한다.

2. Discover the knowns.

최선의 판단을 하기 위해선, 의사결정에 필요한 정보들을 획득해야한다. 그런데, 정보를 취합할 때, 수확체감(diminishing returns)의 법칙이 적용된다는 것을 상기하라. 너무 세세한 디테일들에 과도하게 사로잡히기 시작할 때, 정보 수집을 멈추는 것이 좋다.

3. Gather relevant inputs.

의사 결정 이후에, 다른 사람들이 그 결정된 내용을 실행해야 한다면, "반드시" 그 사람들의 관점을 의사결정 내리기 전에 반영하라. 이 과정을 빠뜨리게 되면, 그 사람들은 당신이 내린 의사결정을 자신들의 것으로 수용(own)하지 않을 것이다. 당연히 매끄럽게 실행되기도 힘들다.

4. Decide.

결정하다(decide)의 어원은 라틴 말로 절단(cut off)에서 나왔다. 결정은 논쟁을 중단시키는 것이며, 다른 결정을 내릴 가능성들을 쳐내는 것이다. 일단 결정을 내리면, 바로 실행으로 나아가라. 그렇지 않으면, 당신이 내린건 진짜 의사결정이 아니다.

5. Explain your reasoning.

(3단계에서) 다른 사람들이 자신들의 관점을 피력할 기회를 주었다면, 이제 그들에게 왜 다른 옵션을 취하지 않고 이러한 의사결정을 내렸는지 설명하라. 그들은 기꺼이 당신의 의사결정에 따를 준비가 되어 있을 것이다.

6. Never second guess.

일단 의사결정을 내린 뒤에는 그 결정에 의구심을 갖지도 말고, 회의적인 시각을 지닌 사람들에게 심각하게 귀 기울이지 마라. 실제 실행에 온 힘을 기울이고, 결과를 얻기 전까지는 말이다. 이미 내려진 판단에 의심을 가질수록 우유부단함에 물들게 되며, 자연히 실행력도 떨어지게 된다.

7. Observe the results

정말로 진실되게 그리고 갖은 힘을 다해 실행에 주력했다면, 이제 한 걸음 뒤로 물러나 그 결과를 엄정하게 살펴보라. 기대하는 성과를 거두었다면 축하하라. 만약 그렇지 않다면, 8단계로 넘어가라.

8. Adjust the decision

명심하라!!! 꽉 막힌 완고함(Bullheadedness)은 우유부단함 못지 않게 당신을 대책없는 사람으로 전락시킨다. 오히려, 더 많은 자원과 노력을 낭비하게 만들면서 말이다. 그러므로, 기대하는 결과를 얻지 못했다면, 1단계로 다시 돌아가라. 그간 실행하면서 터득한 경험을 활용해 더 다듬고, 더 나은 의사결정을 내려라.



<참조>

  - 장강일 페이스북

저작자 표시 비영리 변경 금지
신고
posted by peter yun 윤영식
페이스북의 글이 너무 좋아서 그냥 막 펐습니다. 

윤석찬
 · 2,243명이 좋아합니다.
2시간 전 · 
  • 정부에서 창조 경제의 일환으로 IT 기반 지식을 통한 융합 인재를 양성하겠다고 초등생 부터 프로그래밍 교육 개설에 열의를 가지고 있죠? 아마 얼마전 나온 Cod dot org의 아래 동영상이 큰 영향을 준것 같습니다.
    http://www.youtube.com/watch?v=lHZxmcP-CHI

    최근에는 일부 대학들도 교양 필수 과목으로 프로그래밍 교육을 하려는 움직임을 보였고, 그 중에 한 대학이 저에게 문의를 해와서 제가 드린 소견을 잠시 소개하고자합니다.

    사실 프로그래밍이 별로 필요없는 대부분 분야 교수님은 반발이 심하다고 합니다. 프로그래밍이 아니라 전공별 요구되는 전산 관련 활용(예: SPSS나 그래픽 SW 활용)을 배워야지 전공 구분 없이 모든 학생들에게 프로그래밍을 배우는 것은 무리가 있다다는 것이죠. 

    예를 들어, 생명과학부 학생중에 생물정보학을 전공하는 학생도 있지만, 순수 연구만 하는 학생들이 더 많은데, 그런 학생들조차 프로그래밍을 배워야 한다는 것은 많은 학생들에게 고통을 주는 것이라는 것입니다. 

    이런 인식은 프로그래밍 교육이 가지고 있는 사고적 변화와 문제 해결 능력 배양 같은 근본적인 목적 보다는 "SW 도구 활용"이나 "언어 교육"같은 실용적인 측면에서만 바라보기 때문에 생기는 오해인 것 같습니다. 따라서, 교양 과목 답게 "사고와 활용"이라는 양측면이 강조된 두 가지 교육 과목을 한번 제안해 봅니다. 

    1. 전산적 사고 (Computational Thinking)
    우선 "전산적 사고(Computational Thinking)"라는 수업을 개설하시길 권해 드립니다. 컴퓨터로 이해하는 각종 알고리즘과 문제 해결 절차 방법론을 배우고, 향후에 어떤 수준의 프로그램을 짜더라도 그쪽을 이해할 수 있는 보편적 능력을 갖는게 중요하기 때문입니다.

    프로그래밍 언어 교육 보다 선행되어야 할 수업 내용으로 미국 초중고에서 CS(전산과학) 입문용 과목까지 광범히 하게 진행되고 있습니다. 아래에는 커리큘럼과 교육용 예제를 자세하게 참고할 수 있습니다. 
    http://www.google.com/edu/computational-thinking/
    http://scratched.media.mit.edu/resources/computational-thinking
    http://www.iste.org/learn/computational-thinking
    http://www.cs.cmu.edu/~CompThink/index.html

    국내에서는 포항공대 황승원 교수님이 2007년에 교양 교과목으로 한번 개설하신 바 있습니다.
    http://www.postech.edu/~swhwang/ct.html
    (FAQ 참조: http://webcache.googleusercontent.com/search?q=cache%3AaFohHRkYWGQJ%3Awww.postech.ac.kr%2F%7Eswhwang%2Fctfaq.hwp )

    전산 사고 훈련을 하다보면 필수적으로 컴퓨터 언어의 구조에 대해 이해하게 되고, 숙제를 위해서 간단한 언어 하나씩은 배울 수 있게 됩니다. 언어는 도구라서 특정하지 말고, 과외 학습으로 문제 풀이를 위한 방법으로 자연스럽게 익히도록 해 주는게 좋겠습니다.

    2. 크리에이티브 엔지니어링(Creative Engineering)
    두번째 교과목은 뭔가를 만들어서 세상에 이바지 해보자는 목적이면 좋을 것 같습니다. 이를 위해서는 아주 쉽게 뭔가를 만들어 볼수 있는 서버 인프라, 프론트, 백엔드, API를 모두 조금씩 활용할 수 있는 가벼운 방법을 사용해 보는게 좋겠습니다.

    추천할 만한 커리큘럼으로 현재 스탠포드대에서 코세라에 개설한 Startup Engineering와 제가 제주대에서 강의했던 클래스를 잘 섞으면 잘 나올 것 같습니다.
    https://www.coursera.org/course/startup
    http://code.google.com/p/web-engineering-class/

    무엇 보다 중요한 것은 자기 전공과 관련된 간단한 아이디어를 직접 구현하는 프로젝트를 병행하게 하는 것일 것 같습니다. 예를 들어, 복지 전공인 경우 자기 지역의 복지시설을 지도에 매핑하는 서비스를 만들어 본다던지, 어문학 전공자라면 간단한 사전 서비스를 만들어 본다던지, 특정 해외 문화에 대한 정보를 제공하는 모바일 페이지라던지요.

    그냥 HTML로 문서를 만드는 게 아니라 간단한 기능을 추가하게 하고, 코드를 github에 공개하고 이를 직접 아마존 웹서비스 같은데 올려 실제 동작하게 하는 것을 해보는 것만으로도 큰 성취감을 얻을 수 있을 것 같네요.

    그 외에 비 전공자로서 더 배우고 싶은 학생들을 위해 심화 트랙을 하나 기본 전산학과나 컴퓨터 광학과에 두어 비전산 전공자를 위한 가벼운 커리큘럼을 운영하시도록 하는게 좋을 듯 합니다. 

    대부분 전산 교육은 MS 오피스나 포토샵 같은 "소프트웨어 도구 활용법"이거나, C/PHP/Java 같은 "프로그래밍 언어 습득"에 한정되는 경우가 많습니다. 전산적 사고를 배우고, 이를 기반으로 자신이 관심이 있는 문제를 해결하는 실용적인 프로그래밍 기술을 가르쳐 준다면, 더 많은 인재들이 IT를 활용한 창조적인 아이디어에 도전할 수 있을 것입니다.


저작자 표시 비영리 변경 금지
신고
posted by peter yun 윤영식

에릭리스가 이야기하는 린 스타트업은 이미 예전부터 있어 왔다. 그리고 나에게 현재 진행형이다. 

 Do it, Measure, Learn


  - 프로그래머는 현대판 락스타다. 컴퓨터 석학이 되려는게 아니다 그냥 이웃에서 도움이 되는 재미있는 뭔가를 하고 싶었다

    


  - 작은 것부터 시작하라. 린 스타트업의 MVP (Minimum Viable Product) 최소 요건 제품을 시장에 내놓고 평가받고 배워라

    

  - 다른 사람이 이용할 수 있는 당신만의 뭔가를 만들 수 있다. 그 진실을 깨달으면 당신의 삶은 영원히 바뀔 것이다
    


저작자 표시 비영리 변경 금지
신고
posted by peter yun 윤영식

오브젝트간의 이벤트 전달이 필요할 경우 loose coupling 을 유지하면서 커뮤니케이션이 가능토록 해주는 중재자 패턴에 대해 알아보자 



1) 중재자 패턴

  - 하나의 오브젝트 상태 변경시 다른 오브젝트가 해당 변경 정보를 알아야 할 경우

  - 별도의 중재자를 두어서 해당 중재자가 한 오브젝트의 변화에 대해 관심을 가지고 있는 오브젝트들한테 변경 정보를 전달한다

  

    + Mediator : Colleague 오브젝트와 통신할 수 있는 인터페이스를 정의한다 

    + ConcreteMediator : ConcreteColleagues 오브젝트들의 레퍼런스를 가지고 있다. 정보를 전달해 주는 역할을 수행

    + Colleague classes : Mediator 오브젝트의 레퍼런스를 가지고 있다가 다른 Colleague와 통신하길 원하면  Mediator를 통해서 통신을 한다 


  - 사용예

    + GUI Libraries : GUI 컴포넌트에서 하나가 선택되면 다른 것들이 enable/disable 되는 경우 

    + Chatting Application

       Chatroom : Mediator 로써 참석자들끼리 대화를 중재 인터페이스 정의

       ChatroomImpl : ConcreteMediator 한 참가자가 메세지 보내면 다른 참가들에게 메세지 전송하는 역할을 구현

       Participant : Colleague 참가자 인터페이스 정의

       HumanParticipant, Bot : ConcreteColleague 는 사람이 될 수도 bot이 될 수도 있다. Mediator 레퍼런스를 참조한다다



2) 구현상의 고려사항

  - Mediator 인터페이스정의는 Colleague 들이 여러개의 Mediator가 필요할 경우이다. 한개의 Mediator만 필요하다면 굳이 인터페이스 정의는 필요없다

  - Colleague의 상태가 변하면 정보를 Mediator에 전달하고 해당 정보에 관심이 있는 Colleague에 정보를 전달해 주는 Observer 패턴과 유사하다

  - 정보가 많을 경우 Asynch를 고려한다면 Message Queue 가 필요할 수 있다 

  - Colleague가 많아지면 Mediator 구현체가 복잡해 질 수 있다. 



3) Mediator.js 분석

  - 사이트 : https://github.com/ajacksified/Mediator.js

  - 중재자 패턴을 이용하여 WebSocket, AJAX call, DOM 이벤트를 쉽게 다루고 테스트 할 수 있도록 한다 

  - 채널(Channel)이 중재자가 되어서 Colleague들에게 관심 정보를 전파한다 

  - 설치하기 

$ npm install mediator-js

npm http GET https://registry.npmjs.org/mediator-js

npm http 200 https://registry.npmjs.org/mediator-js/-/mediator-js-0.9.2.tgz

mediator-js@0.9.2 node_modules/mediator-js


  - Node.js에서 사용하기 

////////////////////

// md_node.js 파일

var Mediator = require("mediator-js").Mediator,

    mediator = new Mediator();


mediator.subscribe("wat", function(){ console.log(arguments); });

mediator.publish("wat", 7, "hi dowon", { one: 1 }); 


////////////////////

// 결과 (wat이 채널) 

$ node md_node.js

{ '0': 7,

  '1': 'hi dowon',

  '2': { one: 1 },

  '3':

   { namespace: 'wat',

     _subscribers: [ [Object] ],

     _channels: [],

     _parent:

      { namespace: '',

        _subscribers: [],

        _channels: [Object],

        _parent: undefined,

        stopped: false },

     stopped: false } }


  - 브라우져에서 AMD로 사용하기 

     + require.js 와 mediator.js 파일은 md_browser.html 파일 위치에서 js/ 폴더 밑에 존재함

////////////////////

// md_browser.html

<!doctype html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Test</title>

</head>

<body>


<script src="js/require.js"></script>

<script>

        // base url을 반드시 주어야 한다 

requirejs.config({

   baseUrl: './js/'

});


        // 주의) mediator.js 에서 define을 Mediator 로 M을 대문자로 정의하였다 

require(['Mediator'], function(mediator) {

 mediator.subscribe("wat", function(){ console.log(arguments); });

 mediator.publish("wat", 7, "hi", { one: 1 });

});

</script>


</body>

</html>


   + subscribe/publish API

mediator.subscribe(channel, callback, <options>, <context>);

mediator.publish(channel, <data, data, ... >)

mediator.remove(channel, <identifier>)


   + on/bind 는 subscribe 의 alias 이고, trigger/emit 은 publish 의 alias, off 는 remove의 alias

   + Channel의 Namespace 로 : 를 사용한다 예) application:chat



<참조>

  - http://www.oodesign.com/mediator-pattern.html

  - 3실 청년 설명

  - 예제를 가지고 시퀀스 다이어그램을 통해서 설명

  - 다이어그램 보기 : UML 기초

  - 자바스크립트의 Mediator 패턴 설명

  - 자바스크립트 디자인패턴 - 설명

저작자 표시 비영리 변경 금지
신고
posted by peter yun 윤영식

완벽한 자바스크립트 아키텍쳐는 어떻게 구성되는지를 NodeJS, Google Chrome Extention, MongoDB를 통하여 알아보자


1) 역할

  - NodeJS : 서버 측면, 실시간 연결을 장시간 유지하기 위하여 Socket.io 사용한다

  - Google Chrome Extention : 클라이언트 측면, WebSocket, Notification과 Local Storage가 사용된다

  - MongoDB : 데이터를 저장한다 



2) 아키텍쳐

  - 트윗을 추적하여 실시간으로 클라이언트에게 브로드케스팅 한다

  - 클라이언트 "What's Next"는 Google Chrom browser extension 이다 (크롬 애플리케이션)

  - HTML5의 기능을 사용한다 

  - MongoDB에 트윗 내역을 저장하고 이벤트가 끝나면 통계를 생성한다 

  


3) Node 아키텍쳐

  - V8 JavaScrpt engine 기반의 서버사이드 애플리케이션 개발을 위한 오픈소스 툴킷이다 

  - Node 기반 API는 CommonJS 모듈 시스템을 사용하여 확장한다

  - 2009년 2월 라이언 일병 (Ryan Dahl)이 만들었고, Python의 Twisted나 Ruby의 EventMachine과 유사하다 

  - Joyent에서 no.de Node.js 호스팅 준비하면 진행하고 있다


      



4) Node의 목적

  - 쉽고 안전한 방법으로 고성능이며 확장가능한 네트워크 프로그램을 JavaScript로 만드는 것이 목적이다 

  - 목적을 위하여 취한 아키텍쳐 

    + Single Threaded : Apache 처럼 각 요청마다 thread를 띄우지 않는다

       > 단일 스레드를 사용함으로 CPU context switching일 피할 수 있다

       > 메모리상에 대량의 실행 컨텍스트를(Execution Context) 두지 않아도 된다

    + Event Loop : Marc Lehman 씨가 libev 라이브러를 C++로 작성한 것을 이용함

       > 이벤트 루프는 확장가능한 이벤트 알림 메커니즘(scalable event notification)을 위하여 epool 또는 kqueue를 사용한다 

    + Noe blocking I/O : Marc lehmann 씨가 libeio 라이브러를 작성한 것을 이용함 

       > input 또는 output response에 대해서 (예로 database, file system, web service등) 기다리면서 CPU time losss를 피한다

    

  - 위 특징들로 인해 Node는 thread에 자유로우면서 대량의 트래픽을 처리할 수 있게 한다 

  - 대부분의 프로토콜에(TCP, DNS, HTTP) 대해서 이미 내장되어 지원한다

  - 모든 I/O 관련 function 수행은 callback을 사용해야 한다 

  - Event Driven 언어인 JavaScript는 Node의 'Event Loop' 방식 개발에 적합하고, 익명함수/클로져 같은 자바스크립강점을 이용

  - 참조 PDF

  - GitHub에서 가장 인기있는 OSS 목록

  - 설치는 사이트에서 다운로드 또는 http://nodejs.org/dist 목록 파일 버전을 선택에서 wget등 여러 방법으로 설치함 



5) Node 서버 만들기 

  - Node 단순 서버 만들기


  - Socket.io 단순 서버 만들기


  - http server에 socket.io 모듈을 붙여서 기능을 첨부하는 것이다. 

    + a = b  대입연산의 변환  b(a) funcational로 표현됨 (functional lanuage는 assignment 즉, 대입문이 필요없다

    + 대입문이 없으므로 대입변수를(variable) 메모리에 생성할 필요가 없이 function이 state를 안가진다. (참조)

  - http.createSever()에서 callback function을 제거했으므로 client 요청에 대한 처리를 하지 않고

     대신 이벤트가 발생하면 데이터를 바로 push 한다

  - socket.io에 callback을 넣으면 클라이언트 요청을 처리한다 

var socket = io.listen(server, function(client) { ... new client connection ... } );



6) 트위터 추적 모듈 만들기

  - Twitter Streaming API를 사용해서 "What's Next" 이벤트 틔윗을 받는다

  - API는 설정 메션에 대한 모든 트윗을 전달해 준다 

  - Twitter API 연결 -> 새로운 트윗 발견시 매번 이벤트 발생을 모듈로 만든다 


7) 트위터 추적하기 

  - Basic Authorization을 사용모듈


8) Twitter OAuth 설정하기 

  - 원문의 Basic Authorization을 사용하지 않고(2010.8.31 종료됨) OAuth를 사용한다

  - OAuth 모듈을 설치한다 

$ npm install oauth

npm http GET https://registry.npmjs.org/oauth

npm http 200 https://registry.npmjs.org/oauth

npm http GET https://registry.npmjs.org/oauth/-/oauth-0.9.8.tgz

npm http 200 https://registry.npmjs.org/oauth/-/oauth-0.9.8.tgz

oauth@0.9.8 node_modules\oauth

  - https://dev.twitter.com/ 에 로그인하여서 Consumer Key, Request Token, Access Token을 만든다

  - OAuth를 적용한 코드를 다시 만들어 보자 (실천과제)



<참조>

  - 원문 : A Full Javascript Architecture, Part One - NodeJS

  - Twitter OAuth 설명글

  - Node.js + Express로 Twitter 보기

  - Twitter OAuth with node-oauth for node.js+express


저작자 표시 비영리 변경 금지
신고
posted by peter yun 윤영식

웹애플리케이션을 개발하기 위한 최신 기술셋을 알아보자. 모바일 컨버전스 솔루션 또는 서비스를 개발하기 위하여 방향전환을 시도중이다. 14년을 Java만 사용하다가 이제 다시 Reset 하는 기분으로 스터디중이랄까... 기본 언어가 자바스크립트이기 때문에 틈틈히 언어 공부도 필요하다. 하기 작성된 목록은 원문의 내용중 눈에 띄는 것을 임으로 정리한 것이다. 


1) Node.js 

  - 생태계가 잘 갖추어져 가고 있다 : modulesresources

  - 특징 : single-threaded, event-driven, asychronous I/O JavaScript Server Framework 

  - twitter list 팔로잉해서 최신 정보를 받자 

  - Logging, Error Handling, Bootup&Restart, Hosting 등의 해결책을 제시하고 있다 


2) JavaScript 

  - Node를 하려면 기본적으로 숙달해 있어야 한다 (JavaScript: The Definition Guide 추천 - 번역서 나왔음 6th)

  - DailyJS 통하여 최신 정보도 숙지한다 


3) CoffeeScript

  - .coffee 확장자로 코딩하여 .js로 컴파일 된다

  - 코드가 깔끔해 지고 유지보수성이 높아진다 

  - CoffeeScript의 스타일 가이드 참조 (참조2)

  - JavaScript를 CoffeeScript로 전환 툴

  - cake.coffee 툴 : CoffeeScript로 작성한 make 버전이다. CLI 방식 호출 (참조)


4) MongoDB

  - NoSQL : JSON방식 데이터 통신, 저장은 BSON(Binary JSON) 형태, JavaScript언어로 제어 

  - Replication Set 을 통한 High Availability 제공

  - Sharding을 통한 Scale-out을 제공

  - Aggregation Framework을 통하여 Big Data 제어 


5) Web Application 개발

  - Node에서는 Jade(Template Engine)사용, CSS는 stylus 사용함 

  - jQuery 기본 사용

  - UI MV* Framework으로 Backbone.js가 대세 - underscore.js를 기본사용함 -

  - Express : Node 에서 기본사용하는 MVC Framework - REST Web Services 개발함 - 


6) Testing 

  - Jasmine : BDD 

  - Vows : 비동기 BDD

  - QUnit : jQuery Javascript library


7) 통합 해주는 것들 

  - Express 개발할 때 : Express Wiki

  - CoffeeScript, Express, Jade, Stylus에 대한 boilerplate 코드 생성 : Cham

 

8) 추가적인 것들

  - socket.io : 실시간 구현

  - meteor : 실시간 서버 프레임워크 

  - 모바일 프레임워크 : PhoneGap


위의 내용들이 대충 눈에 들어오면 SKT의 CornerStone Framework을 내가 생각하는 모바일 컨버전스 솔루션이나 서비스에 접목 시켜 볼까 한다. 맨땅에 해딩하지 말고 이미 만들어진 것을 사용 목적에 맞게 수정하여 써보는 방향을 택한다. 실력이 된다면 기여자가 되보고 싶다. 



<참조>

  - 원문 : Getting Started With Node.js, Coffeescript, MongoDB, and More

저작자 표시 비영리 변경 금지
신고
posted by peter yun 윤영식
2013.01.16 17:58 Lean Agile Culture

tistory에서 앞으로 코드를 넣을 때 SyntaxHighlighter를 사용해보자. 


- 설정방법 : http://gyuha.tistory.com/405

- 코드를 넣고 테스트 하기 

var a = function b() {
   alert('hi');
}


- 설정후 코드 넣을 때 : html 체크하고 pre 태그의 class="brush:[언어]"넣어서 해결


- 지원 문법

Brush nameBrush aliasesFile name
ActionScript3as3, actionscript3shBrushAS3.js
Bash/shellbash, shellshBrushBash.js
ColdFusioncf, coldfusionshBrushColdFusion.js
C#c-sharp, csharpshBrushCSharp.js
C++cpp, cshBrushCpp.js
CSScssshBrushCss.js
Delphidelphi, pas, pascalshBrushDelphi.js
Diffdiff, patchshBrushDiff.js
Erlangerl, erlangshBrushErlang.js
GroovygroovyshBrushGroovy.js
JavaScriptjs, jscript, javascriptshBrushJScript.js
JavajavashBrushJava.js
JavaFXjfx, javafxshBrushJavaFX.js
Perlperl, plshBrushPerl.js
PHPphpshBrushPhp.js
Plain Textplain, textshBrushPlain.js
PowerShellps, powershellshBrushPowerShell.js
Pythonpy, pythonshBrushPython.js
Rubyrails, ror, rubyshBrushRuby.js
ScalascalashBrushScala.js
SQLsqlshBrushSql.js
Visual Basicvb, vbnetshBrushVb.js
XMLxml, xhtml, xslt, html, xhtmlshBrushXml.js

저작자 표시 비영리 변경 금지
신고
posted by peter yun 윤영식
2012.12.21 09:29 Lean Agile Culture

웹서핑을 하다가 user-agent의 역사에 대한 글을 읽었다. 모자익->넷스케이프->IE->사파리/오페라->크롬에 오기까지 서로 엔진은 유사하면서 이름은 틀린 브라우져의 전쟁사이다. 결국 내부적인 엔진은 유사한데 이름만 틀리다는 이야기이다. 뿌리깊은 나무~


* 참고 : user-agent의 역사



크롬에서 user-agent를 보려면 다음 순서로 확인함

  • F12 펑션키 클릭
  • network 탭 -> 서브 Headers 탭 이동 
  • 임의 url 브라우징 요청
  • Headers 탭안에 user-agent 값 확인

user-agent:
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11


저작자 표시 비영리 변경 금지
신고
posted by peter yun 윤영식
2012.12.17 11:33 Lean Agile Culture
기존 산업에서 모바일로 이동하기 위한 또는 융합하기 위해 인지하고 있어야 할 5가지 패러다임에 대하여 잘 요약했다. Web 3.0 소셜 시대에 대비하고 기존 로컬 솔루션을 서비스화 하기위해 알아야 할것은 무엇이 있을까?  예로 든다면 GitHub처럼 Git 원격 저장소를 서비스형태로 만들었고, APM 업체인 New Relic은 APM 서버를 Cloud 기반 SaaS 로 바꾸었다. 국내에서는 ERP업체가 Cloud 기반 SaaS를 준비하고 있다. 기존 솔루션을 서비스화하고 모바일을 지향하기 위한 우리의 패러다임 변화는 무엇일까?



저작자 표시 비영리 변경 금지
신고
posted by peter yun 윤영식
TAG Mobile

SlideShare 링크 



저작자 표시 비영리 변경 금지
신고
posted by peter yun 윤영식

SlideShare 링크 



저작자 표시 비영리 변경 금지
신고
posted by peter yun 윤영식
2012.12.05 10:39 Lean Agile Culture

예전 한 서버안에서 대량으로 들어오는 데이터처리를 위하여 Multi-Thread 기반 Queuing을 통하여 막힘없는 서비스를 구현했었다. 하지만 점점더 많은 데이터가 들어올 경우 Scale out을 하려면 결국 어떻게 해야 할까? 서로 다른 Stack에 있는 것들 예로 웹서버와 데이터베이스 사이, 또는 WAS와 데이터베이스사이에 Queue를 두고 사용하면 어떨까 생각해 볼 수 있다. 


  • A<->B 사이에 데이터량은 많으나 느린 성능이 예상될 경우
  • A는 계속 막힘없이 다음 C를 호출해야 할 경우
  • 정기적인 통계정보 생성 및 레포트 생성 배치 Job도 괜찮을 듯 하다. 

결국 Queue기반 Job 분산처리 Server 라고 이해하면 될듯...


▶ GearMan 이해하기

GearMan은 Queue를 하여 요청을 처리하는 Job Server이다. Scale Out을 고려하여 여러대의 서버를 운영하여 Job을 수행해야 한다면 좋은 대안으로 보인다. 



> 파란색의 Client와 Worker만 API를 사용하여 간단히 작성하면 된다. 다양한 언어에 대하여 지원한다


> Client 코드 : 함수를 문자 리터럴로 전송


> Worker 코드 : 함수를 문자 리터럴로 전송 


> 호출 흐름도 

> 구성 예시 : High Availibility와 Fault Tolerance의 분산 환경의 구성이 가능하다



저작자 표시 비영리 변경 금지
신고
posted by peter yun 윤영식
2012.11.25 15:37 Lean Agile Culture
jsfiddle.net 은 브라우져에서 html5, css, javascript를 개발하고 테스트 해볼 수 있는 서비스이다. 사용법을 공부하던중 jsfiddle을 통하여 javascript 코드에 대한 테스트 및 결과를 하기와 같이 embedded 할 수 있는 방법이 있다. 




▶ jsfiddle 코드 웹페이지에 넣기 


  - 공식 참조 문서

  - http://{url_of_the_fiddle}/embedded/[{tabs}/[{style}]]/  구성이고 iframe으로 넣는다 

<iframe
  style="width: 80%; height: 200px"
  src="http://jsfiddle.net/nulpulum/w9NJZ/embedded/js,resources,html,css,result">
</iframe>

  - 위 코드에서 nulpulum은 등록 계정, w9NJZ 은 페이지 그리고 맨뒤의 js,resources,html,css,result 구분자는 탭을 의미한다.

  - Result 탭 옆의 > 아이콘을 클릭하면 Result 탭으로 자동이동하면서 html 수행결과를 볼 수 있다. 


이제 테스트 코드를 jsfiddle을 이용하여 블로그에 넣어보자


저작자 표시 비영리 변경 금지
신고
posted by peter yun 윤영식

시장 조사를 통하여 모바일 서비스에서 주고자 하는 가치를 찾거나, 가치를 발견하는 것은 기획자가 초기단계에 수행해야 하는 일이다. 검색을 통하여 정적 데이터들을 획득하여 정리 할 수 있지만, 실제 답변을 원하는 항목에 대한 설문 조사(Survey) 또는 투표(Poll)를 쉽게 할 수 있다면  살아있는 데이터를 가지고 분석을 할 수 있으리라 본다. 역시 가치가 의미있으려면 시장(마켓)의 추측이 아닌 사실(팩트)가 중요하다. 사용해 볼만한 onDemand 서비스를 알아보자 


  - http://polldaddy.com  

    + Poll(투표) 사용 예

    + 상세 설명 블로그

  - https://ko.surveymonkey.com 

    + 서베이 몽키 설명


니츠마켓을 만들기 위한 시장 조사(Survey)나, 프로젝트 관리에서 의견 취합용 투표(Poll)등을 적극 사용해 보자. 역시 필요한 것은 서비스로 나오는 세상이다.

저작자 표시 비영리 변경 금지
신고
posted by peter yun 윤영식
2012.11.21 11:19 Lean Agile Culture

나는 전규현님의 블로그 포스팅을 관심있게 읽고 있는 독자이다. 패키지SW 개발을 7년 넘게 해보면서 느꼈던 모순과 방황에 대한 원인과 솔루션을 잘 설명해 주고있기 때문이다. 최근 지인들과 모여서 새로운 모바일 서비스를 기획하면서 어떤식으로 진행을 하고 어떤 시스템들이 필요할지 그리고 어떤 형태로 운영을 할지 고민을 하고 있다. 그 좋은 해답을 해당 블로그에서 이야기 해주고 있다. 


  • 소스저장소, 이슈, 위키, 프로젝트관리 :  http://softwaredev.tistory.com/297
    • 소스저장소 : Git onDemand : BitBucket
    • 이슈 : Jira onDemand
    • 위키 : Confluence onDemand
    • 스크럼 도구: GreenHopper onDemand (추가)
    • 프로젝트 관리 : Podio onDemand (추가)
  • SVN or Git 어느 것을 쓸것인가 :  http://softwaredev.tistory.com/238
    • 분산환경에서 일할 경우 : Git Repository

최근에 Podio로 프로젝트 관리를 하고 스크럼 방식 진행은 Trello를 사용하고 있다. 둘을 연결시켜서 보자가 Zapier를 사용하고 있지만 Zapier 오류로 인해 Trello -> Podio 연동이 잘 되지 않는다. 연동만 잘 된다면 Podio + Trello로도 사용할 만 하다. 물론 기본 전제는 분산환경에서 일할 경우 유용하고, 로컬에서 모여 일한다면 벽에 Post-It을 활용하는 것도 좋다. (GreenHopper 를 사용하면 Trello는 버려도 좋겠다)


저작자 표시 비영리 변경 금지
신고
posted by peter yun 윤영식

모바일 컨버전스 서비스를 기획하면서 가장 헤메이는 부분이 대용량 데이터에 대한 신뢰성 있는 아키텍쳐를 구축하는 일이다. 이미 대형 포털과 모바일 서비스에서 많은 아키텍쳐 연구를 통하여 최적화를 했겠지만 이를 전수받거나 아니면 뼈대를 살표보는 일은 쉽지 않다. 그러나 AOSA(The Architecture of Open Source Applications) 라는 외국 사이트에서 이에 대한 단초를 제공하고 있고, 네이버 HelloWorld에서 일부 번역한 내용이 있어서 공부를 시작해 본다.


  - AOSA : http://www.aosabook.org/en/index.html

  - Naver 번역 :  http://helloworld.naver.com/helloworld/206816


스터디 모임에서 AOSA의 아키텍쳐 번역과 분석을 해보아야 겠다. TA(Technical Architecture) 설계능력 강화를 위하여 전체적인 조망아래 WAS 및 Open Source Solution 에 대한 접근을 Cloud에 구축/테스트해 보자. 



예전 Queue, NIO에 대한 간단한 개념 정립을 위해서 공부했던 Jenkov의 사이트를 다시 방문했다. Java API들에 대한 기본 개념정리가 잘 되어 있다.


  - http://tutorials.jenkov.com


저작자 표시 비영리 변경 금지
신고
posted by peter yun 윤영식

스토리는 개인, 기업(조직), 소프트웨어, 서비스 모두에 필요한 초기단계의 전략과도 같다. 스토리가 없으면 재미가 없다. 앙꼬없는 찐빵을 무슨 맛으로 먹으랴. 소프트웨어쪽으로 눈을 돌리면 처음 이 제품을 만들게 된 동기가 있어야 한다. 동기를 유발한 사건이 있고 그 사건의 해결방안을 소프트웨어적으로 아니면 컨버전스적으로 해결 할 수 있는 생각의 흐름 또는 프레임을 가지고 있다면 좋은 아이디어가 나오지 않을까?


오늘 읽은 조성문님의 "스토리가 중요한 이유"를 읽고 많은 것을 생각하게 되었고, 생각을 스토리로 만들어 표현하는 훈련이 필요함을 느낀다.




저작자 표시 비영리 변경 금지
신고
posted by peter yun 윤영식

그동안 간간히 트윗되는 서비스 기업들의 아키텍쳐를 살펴보면서 향후 비슷한 서비스를 할 때 어떤 요소 기술들이 필요할까 생각해 보았다.


  - Netflix 온라인 VOD 서비스 Netflix의 AWS로 옮겨가기 까지의 아키텍쳐 변화 (Java 기반)

  - Evernote 자바 기반 아키텍쳐링 (Hibernate를 사용했다는 것이 흥미롭다, 참조)

  - Instagram SytleShare와 비슷한 구조인듯 하다 그리고 좀 더 세심한 아키텍쳐링  (Python 기반)

  - StyleShare AWS에서 어떤 서비스를 사용하는지 설명 (Python  기반)

  - Etc Search :  http://highscalability.com


향후 만들어갈 Mobile Service에 대해 Netflix 모델과 더불어 기업문화까지 본받을 필요가 있겠다. 자신의 성숙한 기술을 OSS로 공개하고 공유하는 정신을 높게 사고 싶다.




 모바일 컨버젼스 서비스를 만들기 위하여 어떤 단계를 거쳐가야 하는지 생각해 본다. 

  - Big Picture : 서버(미들웨어) 아키텍쳐를 서비스의 요구조건에 맞게 고려한다

  - Framework Picture : 어플리케이션 레벨의 구현에 필요한 Framework들을 고려한다 

  - Project Picture : 프로젝트를 어떻게 진행할 것인지 고려한다.


<Big Picture>
조대협님의 블로그에 소개된 대용량 시스템의 레퍼런스 아키텍쳐와 Netflix의 사례를 고려하여 각 단계의 필요 미들웨어와 배치등을 어떻게 할 것인지 생각해 보자

  - 클라우드 서비스 이용하기 : AWS Pacific zone 이용하기 (각 서비스에 대한 이해와 사용경험을 가져야 한다)

  - 미들웨어 선정 : 현재는 Virgo 위에 Tomcat + SpringDM 사용 예상 (OSGi Bundle 이용)

  - 메모리 캐싱 : Redis를 고려해 보고 있다. 역시 설치와 테스트가 필요하고 어느 부분에 쓰일지도 검토해야 한다)

  - 프레임워크 : 

    + 통신용 프레임워크는 Vert.x 를 Bundle로 올려서 NIO 처리 (apache 대체로 생각하지만 각 필요한 요구조건에 대한 테스트가 필요하다)

    + 도메인 업무처리용 프레임워크는 Spring Roo를 통해 빠르게 개발을 진행하고 싶다 


  - 데이터베이스 : RDBMS를 고려한다면 MySQL, NoSQL을 본다면 Cassandra와 MongoDB를 사용하려 한다. 

  - 상호 연결 : Apache Trift를 통하여 서로 틀린 부분에 대한 Communication을 해소하려 한다 (ESB와 비슷하게 이용 가능할까?)

  - 클라이언트 Push : Vert.x의 Socket.io를 이용한다

  - 모니터링 : Netflix의 오픈소스를 이용하거나 필요시 별도로 만든다

  - 개발, 테스트, 배포 : 운영서버와 유사한 AWS 클라우드 기반으로 가져가며 AMI(Amazone Machine Image)를 이용하여 만들고, 개발, 테스트, 배포 각각 별개의 인스턴스를 가져간다

    + 개발 : 운영과 동일 환경구성

    + 테스트 : JUnit 단위 테스트는 개발단계에서 수행하고, FitNeese 통하여 인수테스트 수행등 종합적인 테스트 방안을 마련한다


<Framework Picture>
모바일 컨버전스 서비스 성격에 맞는 프레임워크를 선택하는 것이 관건으로 보인다

  - UI Layer : 하이브리드 웹앱으로 가고, 성능향상이 필요한 부분이 있다면 고객 확보시점에 따라 네이티브로 간다. Rapid Development를 위하여 선택

  - UI Framework : Sencha Touch, JQuery Mobile, PhoneGap등을 사용, PC 버전은 Sencha의 ExtJS를 사용한다. Unit Test와 개발환경때문에 GWT를 고려해 보았으나, 기초장벽을 어느 정도 해소하면 ExtJS로 하는 것이 좋겠다는 판단임 (요즘 열심히 JavaScript 파고 있다)

  - Server Framework : Vert.x, Spring, Spring roo 등을 사용할 예정

  - Test Framework : JUnit, FitNeese

  - Deploy : Maven 또는 Gradle 고려중, Jenkins + HuBot (GTalk 통하여 deploy 명령) 사용

  - Open API 지향 설계 : Restful 서비스 



<Project Picture>
프로젝트는 Agile의 Scrum 방식으로 진행을 하면 이를 위하여 다음과 같은 협업도구를 사용한다

  

- Issue, Wiki 는 Atlassian의 Jira와 Confluence를 SaaS로 이용

  - Scrum 방식 개발위해 Atlassian GreenHopper 이용

  - 소스서버는 DVC로 GitHub private 신청하여 이용

  - 오프라인 정기 모임

  - 온라인 협업 도구 최대하 활용 : Atlassian 제품, Podio, CaCao Agit, GMail 등


그 동안 살펴본 기능들을 잘 엮어서 프로토타입 모바일 컨버전스 서비스를 내년 초까지 만들어 볼 계획이다.



저작자 표시 비영리 변경 금지
신고
posted by peter yun 윤영식




결핍은 새로운 가능성을 만들어 낸다. 대기업처럼 왠만한 것은 갖추어진 집단에서 과연 새로운 가능성을 만들어 낼 수 있을까 라는 생각마저 든다. 그래서 애플이나 구글의 조직은 작은 단위로 팀을 나누어 마치 스타트업 기업처럼 움직인다고 하니 그부분에서 이해가 간다. 


오늘 에버노트의 기업환경 기사를 읽으며 새로운 Enterprise Social Network 서비스인 Yammer를 알게되었다. 그래서 바로 인큐베이팅 그룹 멤버들끼리 Private  소셜 네트워킹을 해보자는 의도에서 바로 신청을 했다. 


  - Facebook처럼 얘네도 청록색맹 끼가 있다. Facebook과 같이 모든 이에게 노출되는 것이 아니라 회사의 @xxx.co.kr 로 그룹이 된다. 즉, 한 회사(Enterprise)나 그룹에서만 사용 할 수 있다. 

  - 인큐베이팅 멤버가 10명이 넘지 않아 우리는 google application에서 등록하여 gmail을 사용하고 있는 것을 등록했다. 예) xxx@yuwin.co.kr 

  - PC버전-Adobe Flex Air 애플리케이션, Android/iOS 앱등이 존재하여 다양한 기기에서 Private SNS를 할 수 있다. 

  - 기능으로 파일첨부하여 메세지 보내기, 실시간 채팅, 새로운 부서나 그룹을 만들어 자유로인 그룹핑을 할 수 있다. 


아 이런게 있어으면 좋겠다 하는 결핍을 메워주는 좋은 서비스로 보여지는데, 우선 멤버들끼리 사용해 보고 Feedback을 받아 보아야 겠다. 



▶ 운영하고 있는 인큐베이팅 모임의 Yammer PC 버전 사용 화면

  - 그룹 SNS

  - 문서파일 공유

  - 설문조사

  - 칭찬하기

  - 질문&응답

  - 이벤트


등의 서로 특색있는 UI를 메세지박스에서 보여준다. 
iPad에서의 UX 경험은 PC보다 좀 더 색다르고 재미있다. 




▶ 지원하는 기기


저작자 표시 비영리 변경 금지
신고
posted by peter yun 윤영식

이민화교수님의 스타트업 창업에 대한 연재글을 우연히 etnews를 통하여 보게되었다. 어려운 주제를 쉽고 간결하게 풀어쓴 글을 보며 교수님의 경험과 충고에 끌려 연재글을 다 읽고 간단하게 머릿속에 정리할겸 적어본다. 


  - 기업가 정신 = 세상에 가치를 창출하고 일부를 분배하는 선순환 과정을 만드는 것

    + 차별화 역량을 통한 가치 창출

    + 기업을 공동체로 인식  : 급여의 의미만을 놓고 보자. 공동체에서는 급여가 부가가치를 높이는 것이다.



  - 성공적 스타트업을 하기 위한 질문 2가지 = 과연 시장은 존재할 것인가? + 나는 차별화된 역량을 가지고 있는가?

    + 시장 기회 포착 방법 = 미래 패러다임 변화 인지 -> 창조적으로 해석 -> 본질 파악 -> 자신의 생각을 제시 -> 이를 뒷받침하는 구체적인 증거를 제시하는 것

    + 차별화를 지속 시킬 수 있는 핵심역량 = 기술역량


  - 기업 차별화 = 기술 + 인문학 + 비즈니스의 만남

    + 차별화 요소 = 기술 + 계약(특허, 독점)

    + 차별화 역량 = 특출난 기술이 아닌 적정 기술의 융합 = 인문학을 통하여 인간요구 발견 및 만족 시킬 수 있는 가치를 찾아라 = 인문학이 차별화의 핵심

    + 차별화 전략 = 시장기회의 포작 + 창업팀 구축 + 기술사업화 + 틈새시장 개척


  - 틈새시장 = 용꼬리가 아닌 뱀머리가 되라

    + 스마트 기업에게 1위,2위만 살아남음. 즉, 3위는 적자보고 실패함

    + 스타트업 기업 팀 기술역량에 맞는 틈새시장을 찾아 1위를 해라 

    + 돈많이 들이지 말고 몇천만원에 가능한 기존 플랫폼기반의 스마트 창업!


  - 차별화와 가치창출 = 차별화된 기술력으로 고객에게 가치를 줄 수 있는 사업을 하라

    + 차별화와 가치창출없이 수익 모델에 집착하는 것은 본말이 전도된 것이다.

    + 거칠더라도 독창적인 혁신성이 있어야 한다


성공적인 스타트업 = 시장 기회 포착과 1등으로 가는 차별화된 역량이 핵심이다. 

참조) 이민화교수 연재글

저작자 표시 비영리 변경 금지
신고
posted by peter yun 윤영식
prev 1 2 next