레이블이 개발인 게시물을 표시합니다. 모든 게시물 표시
레이블이 개발인 게시물을 표시합니다. 모든 게시물 표시

2017년 12월 28일 목요일

프로그래밍의 정석 책에 대한 소개와 관점에 대한 프리젠테이션


프로그래밍의 정석 책에 대한 소개와 관점에 대한 프리젠테이션


위 책을 가지고 독서 모임에 참여하였다. 첫 날이고 다들 토론에 대한 감이 없는 관계로 첫 시간은 주최자의 프리젠테이션으로 시작하였다. 둘째 시간은 프리젠테이션 내용과 책의 내용을 바탕으로 토론을 했다.
아래 내용은 첫 시간에 들은 내용과 프리젠테이션 발표 자료를 취합하여 정리한 내용이다.


  1. 왜 하필 이렇게 코드를 작성했나요?
    1. 일반적으로  취향, 가치관, 지식, 규칙을 흔히 말한다. 하지만 이것은 아름다운 이야기일뿐..
    2. 결국 중요한 이유는 돈 ( 시간 )
      1. 코드를 어떻게 짜는가에 대한 가장 중요한 이유는 돈 = 시간 = 개발 시간 + 수정 시간(일반적으로 개발 시간의 8~9 배) 이다.
      2. 왜냐하면 프로그래밍에 필요한 자원은 인건비가 전부라고 봐도 무방하기 때문이다.
    3. 이 코드의 당위성을 설명할 근거
      1. 이 코드를 이렇게 작성하면 사후 이 코드를 수정 시 시간이 절약됩니다.
        1. 꿈 같은 이야기... 현실에서는 코 앞의 일정과 이해관계로 설득의 근거가 될 수 없다.
        2. 고객 요구사항, 투입 가능 자원, 필수 구현 사항, 프레임웍 및 언어에 대한 제약, 일정 준수 등의 가치가 충돌하는 가운데서는 수정시 시간이 절약된다는 근거는 설득력이 희박하다. 심지어 위원회 개발로 치닫게 될 위험이 커진다. 위원회 개발을 초래할 수 있는 가치의 충돌을 포스( forth )라고 한다.
        3. 설득과 책임을 통해 위의 여러 가치들을 보다 구체적이고 강력한 방향성으로 묶을 수 있다.
      2. 보다 구체적이고 강력한 방향성
        1. 코드 ( 프로젝트 )를 보다 구처젝이고 강력한 방향성으로 이끌기 위한 여러 근거들을 바탕으로 설득의 과정을 거친다.
        2. 서로 고도화된 개발 지식 체계를 갖고 있는 경우 등에서 원리를 바탕으로 설득해 볼 수 있다.
          1. 원리의 항목: 추상, 캡슐화, 은닉, 패키지, 관심의 분리, 완전성과 순수성, 정책과 구현, 인터페이스와 구현, 단일 참조, 분할 정복
          2. 원리 중심 설명의 예시: 이거 캡슐화가 깨졌잖아. 고쳐야 할 것 같아. / 이건 인터페이스 분리가 필요할 것 같은데?
          3. 원리의 미덕: 원리 수준에서 설득되는 팀을 구축할 수 있다면 해당 팀은 큰 가치를 달성할 수 있다. ( 향후 수정에 드는 비용이 매우 감소하기 때문에.. )
          4. 추상: 일반화 ( 카테고라이즈, 그룹화 ), 사상 ( 모델링, 기억할 것만 남김 ) 을 통해 달성할 수 있다. 
          5. 추상의 미덕: 구체는 매우 다양하며 복잡하기 때문에 필요한 요소들만을 단순화한다.
        3. 원리로 설득이 되지 않는 경우 원칙을 바탕으로 설득해 볼 수 있다. 단, 원칙을 바탕으로 설득시 원리를 위배하지 않아야 한다.
          1. 원칙의 항목: 결과의 국소화, 반복의 최소화, 로직과 데이터의 일체화, 대칭성, 선언형 표현, 변경 빈도 
          2. 원칙 중심 설명의 예시: 교장 선생님 훈화 말씀 시 사열한 학생의 예. 학생은 모두 정렬되어 서있어야 한다는 원칙이 세워져있다면, 모두가 똑바로 서있기 때문에 일사병으로 쓰러지는 학생을 발견할 수 있다. / 코딩스탠다드가 지켜지고 있는 모듈 안에서는 코딩스탠다드가 깨진 잘못되거나 품질이 떨어지는 코드를 쉽게 발견할 수 있다.
          3. 원칙의 미덕: 지켜질 때 지켜지지 않는 요소를 쉽게 인지할 수 있다.
          4. 논란? : 선언형 표현은 반드시 좋다고 할 수 있을까?
            1. 선언형 표현은 로직이 들어가지 않고 상태관리의 곧홍이 격감하기 때문에 안전하다.
            2. 고로 어느 정도 수준의 품질을 유지하는데 유용하다.
            3. 하지만 선언형의 한계로 인하여 팀원 전체가 해당 선언형의 한계치를 초과할 수 없게 된다.
            4. 또한 코드의 품질도 해당 선언형의 한계치를 초과할 수 없게 된다.
            5. 선언형 한계의 예시: 애노테이션을 적극 활용한 프로젝트에서 해당 애노테이션을 통해 쉽게 기능의 추가 등이 가능하나 해당 애노테이션을 구현할 수 있는 능력은 도태되게 된다.
            6. 따라서 코드 품질과 발전 가능성을 염두하여 선언형을 어디까지 사용할 것인가의 균형을 잘 잡아야 한다.
        4. 원칙으로 설득이 되지 않는 경우 가치를 가지고 설득해 볼 수 있다. 단, 가치를 바탕으로 설득시 원칙을 위배하지 않아야 한다.
        5. 가치의 항목: 의사소통, 단순성, 유연성
          1. 가치 중심 설명의 예시: 너 혼자 일할거야? 코드 이렇게 짜면 알아보겠어?
          2. 단순성과 유연성의 상보성: 단순성과 유연성은 흔히 상반되는 가치로 인식되지만 프로그래밍에서는 최소기능을 단순하게 짜야 유연해진다. 즉 단순성과 유연성은 상반되는 가치가 아니라 상보되는 가치이다.
          3. 단순성과 유연성의 예시: Math.sin() 은 어디에나 쓸 수 있으며 항상 입력값에 대해 일정한 값을 반환한다.
        6. 설득의 레벨링. 고도화된 인원 간에는 가치와 원칙과 원리가 어우러진 설득이 가능하다. 하지만 대부분의 경우 설명의 근거를 레벨링하여 원리에 대한 이야기와 원칙에 대한 이야기, 가치에 대한 이야기를 나눠서 해야 설득할 대상의 혼돈을 방지할 수 있다.
        7. 가치로 설득이 되지 않는다면 가치의 기저인 철학을 통해 설득해 볼 수 있다.
      3. 철학 :: 가치의 기저
        1. 철학은 크게 합리주의와 상대주의로 나뉜다.
        2. 합리주의는 이성주의로서 연역적 방법론을 사용한다.
        3. 합리주의의 미덕은 기준제시이다. 일반적인 수준에서 이성적인 이야기를 하기 때문에 이해하기 편해서 쉽게 받아들여진다.
        4. 상대주의는 경험주의로서 귀납적 방법론을 사용한다.
        5. 상대주의의 미덕은 상황평가이다. 어떠한 가치에 대해 변증법을 사용한 설명 등을 바탕으로 옳고 그름을 헤아릴 수 있다.
        6. 변증법의 예시:  a=b 이고 b=c 이다. 그러므로 a=c 이다.
        7. 따라서, 우리가 누군가를 설득하기 위해서는 이성적으로 이해하기 쉬운 화두를 바탕으로(합리주의 기준제시) 근거를 가지고 설명(상대주의 상황평가)하거나 근거를 나열하고 이해할 수 있게 풀어서 설명하는 등으로 두 가치를 상보적으로 활용하여야 한다.

2015년 7월 22일 수요일

[스크랩]DOM 링크 열기 제어. 새 창, 현재 페이지, 부모 페이지

DOM 링크 열기 제어. 새 창, 현재 페이지, 부모 페이지

1. 현재페이지에 부를때
onclick="location.href='링크 주소'"

1-1. 새 창에 열때
onclick="window.open('링크 주소')"

2. 상위 프레임에 부를때
onclick="parent.location.href='링크 주소'"

스크랩일: 15-07-22
출처: http://technote.co.kr/php/technote1/board.php?board=memberqna&command=body&no=13364
이름아이콘 YunHu
2008-05-26 20:58
선택된 답변입니다.

2015년 6월 15일 월요일

스크랩 :: VIM 활용 :: 복수의 문자열의 하나의 문자열로 바꾸기 혹은 복수의 문자열로 바꾸기


4. 복수의 문자열을 하나의 문자열로 바꾸기

이것은 결국 위의 정규표현식을 사용한 패턴을 특정한 문자열로 바꾸는 것이다. 웬만한 vi 기초 문서에서 간단하게라도 다루는 내용이다.
:%s/[vV]i//g   - vi 또는 Vi 를 null string 으로 치환한다. 즉 삭제한다.
:%s/<.*>//g    - html 화일에서 태그를 제거하는 경우인데, 이렇게 쓰면 내용 라는 줄이 있을 때 죄다 지워질 것이다. 
                 따라서 <.*> 대신에 <.\{-}> 를 쓰는 게 낫다.
::%s/\(gnu\|Gnu\)/GNU/g  - gnu 또는 Gnu 를 GNU 로 치환
간단한 것이니 이 정도로 통과.

[edit]5. 복수의 문자열의 복수의 문자열로 바꾸기

사실 이 얘기를 하고 싶었던 것인데... 이것만 덜렁 쓰기가 뭣해서 서론이 장황해졌다.
핵심은, 괄호를 사용하여 찾는 문자열 쪽에 그룹을 지정한 후에, 바꿀 문자열 쪽에서 그 그룹을 부를 수 있다는 것이다.
\0 은 찾은 문자열 전체
\1 은 첫번째 괄호
\2 는 두번째 괄호
\3 은 세번째 괄호
...
괄호의 순서는 여는 괄호 "(" 의 순서로 따진다. 또 . 나 [list] 등이 괄호안에 있을 경우는 실제로 검색된 문자열을 의미한다는 것에 유의. 즉 abef 라는 스트링이 있고 \(ab\|cd\)ef 로 검색했다면 \1 은 ab 가 된다.
다음과 같은 경우를 생각해 보자. html 화일 안에 수십개의 링크가 다음과 같이 나열되어 있다.
  • aaa
  • bbb
  • ccc ...
  • 이것을 내가 위키위키 페이지에 옮기려 한다. (사실 위처럼 깔끔하게 되어 있으면 그냥 html 코드를 써도 되겠지만)
    * [http://www.aaa.com aaa]
    * [http://www.bbb.com bbb]
    * [http://www.ccc.com ccc]
    ...
    
    다음의 한 줄로 만사형통.
    :%s/
    
  • \(.\{-}\)<\/a>/* [\1 \2]/g

  • 관련 링크:

    2015년 6월 2일 화요일

    [스크랩] Vim의 창(Window) 제어

    Vim의 창(Window) 제어

    창 나누기

    • :split 혹은 Ctrl-Ws : 창을 가로로 나눈다. 인자를 지정하지 않으면 현재 보고있는 파일을 그대로 새창에 보여준다.
    • :vsplit 혹은 Ctrl-Wv : 창을 세로로 나눈다.
    • :split file 은 새창에서 파일을 연다.
    • :숫자split : 창의 크기를 숫자 줄만큼으로 지정하여 연다.
    • :new : 새 배퍼를 생성하면서 창을 연다.

    창이 나뉜 상태에서

    창간 이동

    • Ctrl-Ww : 창들간을 순차적으로 이동한다.
    • Ctrl-Wj : 아래 창으로 간다
    • Ctrl-Wk : 위 창으로 간다
    • Ctrl-Wh : 왼쪽 창으로 간다.
    • Ctrl-Wl : 오른쪽 창으로 간다. (소문자 L)
    • Ctrl-Wo : 현재 창을 제외한 모든 창 닫기
    • ZZ 혹은 :q 혹은 Ctrl-Wc 혹은 Ctrl-Wq : 창 닫기, 미묘한 차이가 있다.

    창 높이 조정

    • Ctrl-W= : 모든 창의 높이와 너비를 동일하게 한다.
    • 숫자Ctrl-W+ : 창 높이를 숫자 칸수만큼 증가시킨다. 숫자 제외시 1로 간주
    • 숫자Ctrl-W- : 창 높이를 숫자 칸수만큼 감소시킨다. 숫자 제외시 1로 간주
    • 숫자Ctrl-W_ : 현재 창의 높이를 숫자칸수로 만든다. 숫자 제외시 최대 크기

    창 너비 조정

    • 숫자Ctrl-W< : 창 너비를 숫자 칸수만큼 감소시킨다. 숫자 제외시 1로 간주
    • 숫자Ctrl-W> : 창 너비를 숫자 칸수만큼 증가시킨다. 숫자 제외시 1로 간주
    • 숫자Ctrl-W| : 창 너비를 숫자 칸수로 만든다. 숫자 제외시 최대 크기

    2015년 4월 30일 목요일

    Vim 학습일지 15-04-30 Session의 중요성. 정규식(regex)의 적극적인 사용에 대한 부족함을 느낌.

    기회가 좋게도 현재 맡은 업무에서 터미널 작업을 많이 하게 되는데 덕분에 vim을 마음껏 써볼 수 있게 되었다. 공부는 조금씩 했었지만 개발에 적극적으로 써보진 못했던 상황이었어서 물론 아직은 이클립스가 더 친숙하긴 하다.

    아직 vim에서 해본게 새 발의 피이긴 하지만 벌써 몇가지 커맨드들과 이동방식에는 친숙해져 버려서 이클립스나 Aptana 상에서도 '/'라던지 'i'라던지를 누르게 되어버렸다;;;

    아직은 커맨드 한 번 입력하려면 익숙해진 yy,dd,w 등의 아주 많이 쓰는 커맨드들 외에는 검색을 한 번 해봐야 쓸 수 있다.


    그 중에서 정말 유용한 건 탭 나누기와 세션을 적극적으로 활용하는 방법이다.

    vim에 강력한 기능이 정말 많지만 지금까지 느낀 것으론 탭 나누기가 정말 유용한 것 같다. 특히 한 파일이 정말 긴 경우에는 왔다갔다 하면서 봐야 하는 이클립스 등에서는 생산성이 극히 떨어지는데 vim에서는 :vs, :sp 등으로 화면을 분할해서 하나의 파일을 다각도로 볼 수 있는 것이 정말 유용했다. 그런데 처음 며칠은 신나게 분할하고 탭 열고 해서 환경을 잡아놔도 다음날이 되면 다시 그짓을 하려니 귀찮음과 비효율적이란 느낌을 받았다.

    그러던 중 세션 저장이란 걸 알게되어 써보니 어제 작업하던 환경을
    :mks! 를 이용해서 작업하고 shell 상에서
    vim -S Session.vim 하여 여니 어제와 같은 환경을 유지할 수 있었다.

    더 다양한 활용법이 있겠지만 일단은 이 정도만으로도 큰 도움이 되었다.


    vim에서 느끼는 또하나의 강점은 검색.
    물론 아직은 이클립스에서 쌓아온 노하우 정도까지는 따라가지 못한다. 하지만 현재 작업 방식 자체가 원격에 있는 소스를 보며 작업하는 상태라서 이클립스의 전역 검색(Ctrl-H)이 제대로 되지 않는 상태이다. 그래서 vim에서의 검색이 더 빛을 발하는 환경이기 때문에 학습하기 좋은 환경(?)이 된 것 같다.

    다양한 방법으로 원하는 부분을 찾아서 작업을 하곤 하는데 아쉬운 부분은 정말 잘 쓰시는 분들이 regex를 적극적으로 사용해서 문자 치환이나 전역 검색등을 아주 강력하게 사용하시는데 반해 나는 아직까지는 이클립스의 Ctrl-F 정도의 검색밖에는 못하고 있다는 점이다.
    regex를 좀 더 적극적으로 활용한다면 개발 속도도 더 빨라지지 않을까란 생각이 든다..


    일지이지만 사실상 근 한달간의 학습(?) 결과이니 월지라고 해야 하려나..ㅎㅎ

    2015년 4월 29일 수요일

    용어 :: 파사드 - 건축 용어이나 개발에서 UI단이 비즈니스로직의 파사드 역할을 한다는 등으로 사용될 수 있음...

    파사드

    위키백과, 우리 모두의 백과사전.
    성 베드로 대성당의 기념비적인 파사드.
    파사드(Façade)는 건물의 출입구로 이용되는 정면 외벽 부분을 가리키는 말이다. 한글화하여 순화하려면 '정면'(正面)이 무난할 것으로 여겨진다. 건축에서 파사드의 궁극적 목적은 '소통'이다.
    건축의 관점에서 파사드는 종종 그 건물에서 가장 중요한 디자인적 요소가 된다. 그리하여 파사드가 그 건물의 나머지 부분의 색채, 톤을 잡아준다. 이런 측면에서 '파사드'라는 개념은 은유적으로 사용될 수 있는데, 거시적 관점과 미시적 관점에 대해 사유할 여지를 준다.[1]
    많은 경우에 파사드는 역사적인 구조물이며, 지역 법률에 의하여 그 변경이 크게 제한되어 있으며, 가끔 파사드의 변경은 거부감을 발생시킨다.
    '미디어 파사드'는 '파사드(Facade)'와 '미디어(Media)'의 합성어로, 건물 외벽 등에 LED 조명을 설치해 미디어 기능을 구현하는 것을 의미한다.[2] [3] [4]

    관련 서적[편집]

    • Spacetime. 《파사드》. SPACETIME. 2011년. ISBN 9788955921946
    • 신영환·원민수. 《뉴 미디어 하이퍼 파사드 콘텐츠 신기술》. 진한엠엔비. 2011년. ISBN 9788984325456
    • 이성창. 《도시 경관을 고려한 서울시 미디어 파사드 설치 및 관리 방안 연구》. 서울연구원. 2012년. ISBN 9788980529155
    • 진중권. 《진중권의 이미지 인문학1》. 천년의상상. 2014년. ISBN 9791185811000

    주석[편집]

    1. 이동 서윤. 건축물의 은유: 일베와 탈식민주의 그리고 숨겨진 공간 찾기. 슬로우뉴스. 2014년 9월 16일.
    2. 이동 안석현. 백화점 외관 `LED`로 수 놓는다. 전자신문. 2009년 11월 4일.
    3. 이동 서울대&디스트릭트, 건물 외벽에 '미디어 파사드' 선보여. 뉴시스. 2009년 12월 11일.
    4. 이동 이인선. 디지털 시대 변주되는 프레임. 주간한국. 기사입력 2010년 1월 19일. 최종수정 2010년 1월 25일.

    2015년 4월 22일 수요일

    데이터 시각화란 무엇인가...데이터 시각화 전문가의 부상 @신기술 동향, IT

    데이터 시각화란 무엇인가...데이터 시각화 전문가의 부상

    출처:
    http://www.itworld.co.kr/news/82097?page=0,0
    http://www.itworld.co.kr/news/82097?page=0,1

    의사 결정권자들이 빅 데이터가 주는 결과를 이해하지 못할 때 빅 데이터의 유용성은 떨어진다. 그래서 빅 데이터를 분석해 표현해주는 데이터 시각화(data visualization) 전문가들이 필요하다.

    데이터의 단순한 나열보다 사진 한 장이 더 가치가 있다는 말은 오늘날 경영분석에서 자주 논의된다. 빅 데이터 트랜드가 가속화되고 분석 기법을 사용하는 기업이 늘어나면서, 분석된 데이터를 알기쉽게 설명해주는 전문가들의 수요는 늘어나고 있다.

    지난해 가을, IT 전문 리서치 업체인 가트너는 2015년까지 빅 데이터 관련 일자리가 440만 개로 늘어나게 될 것이며 이들 가운데 대부분은 데이터 시각화와 같이 이전에는 요구되지 않았던 새로운 기술들을 필요로 한다고 예측했다.

    데이터 시각화는 정확히 무엇인가? 데이터 시각화를 실시하는 주체가 정확히 누구이며, 이것이 단순히 총천연색 그래프나 흥미를 유발하는 인포그래픽과 다른 점은 무엇인가?

    역설적인 사실은, 데이터 시각화 전문가(data visualizer)가 정확히 어떤 것인지 알기가 쉽지 않다는 것이다. 이에 대해 IT 고용 전문가들은 데이터 시각화의 정의가 아직 확실히 내려지지 않았기 때문이며, 이를 직함이나 직업 그 자체로 간주하는 사람은 드물다고 말했다.

    오히려 데이터 시각화를 다른 역할과 더해져 직원들이 갖춰야 하는 능력(a skill set)으로 보는 기업들이 많아지고 있다. 특히 이런 경향은 사업분석업무를 담당하는 직원들 사이에서 더욱 더 두드러진다.

    기업에서 채용시 자격요건으로 '데이터 시각화'를 제시하는 경우도 지난 6개월간 12%가 증가했다고 데이터 분석 전문 채용사이트인 icrunchdata의 공동창립자인 토드 네빈스는 말했다. 이에 반해 기업에서 채용시 자격요건으로 빅 데이터를 제시하는 경우는 63% 증가했다고.

    네빈스는 "데이터 시각화는 아직 초기 단계지만 기업들이 데이터 사용과 축적을 전략적으로 추진함에 따라 점점 주목받고 있다"고 말했다.

    하지만 이런 흐름을 주도하는 것은 IT 부서가 아니다. IT 전문가들은 "IT 부서는 데이터 분석과 데이터 시각화에서 제한적인 역할만을 수행하고 있다"고 말했다.

    시스코(Cisco) 애널리틱스 부문장 그레고리 르완도스키(Gregory Lewandowski)는
    "IT 부서는 일반적으로 기업 플랫폼(dashboard)과 비즈니스 인텔리전스를 제공하는 역할을 수행하지만 대부분 주어진 역할을 수행하는데 그칠 뿐 적극적으로 나서는 경우는 적다"고 말했다.


    데이터 시각화 전문가인 스테판 퓨는 단순한 색상의 그래프 막대를 이용해 이를 보는 사람들이 쉽게 세 가지 종류의 데이터를 구분할 수 있게 한다. 화살표와 부가 설명을 함으로써 그래프가 의미하는 바를 누구든지 알아볼 수 있게 한다. 이곳을 클릭하면 스테판 퓨의 손을 거치기 이전의 그래프를 볼 수 있다.

    데이터 시각화 전문 컨설팅 업체인 퍼셉츄얼 에지(Perceptual Edge) 창업자 스테판 퓨는 "IT 부서는 시각화를 구현하는 기술에 주목할 뿐 이런 기술 자체를 사용하지 않는다"고 말했다.

    퓨는 에드워드 투프트(Edward Tufte)의 데이터 시각화에 대한 워크숍에 참석한 후, IT와 비즈니스 인텔리전스에 대한 전문성을 바탕으로 2003년 퍼셉츄얼 에지를 설립했다. 에드워드 투프트는 원칙으로서의 데이터 시각화를 개발하고 1983년에 이에 대해 '양적 정보의 시각 디스플레이(The Visual Display of Quantitative Information)'라는 제목의 책을 저술했다.

    스테판 퓨는 데이터 시각화 전문가로서 유명해졌고 '설득적 그래프 및 도표 디자인(Show Me the Numbers : Designing Tables and Graphs to Enlighen)' 등 여러 권의 책을 저술했다.

    퓨는 "심지어 IT 부서에는 자주 요청하는 리포트를 작성하는 상근 비즈니스 인텔리전스 분석가가 배치되어 있다"며, "하지만 이들 비즈니스 인텔리전스 분석가들은 데이터를 이해하지 못한다. 사람들이 리포트의 어느 부분의 데이터를 가져다 활용하는지 알지 못한다"고 말했다.

    퓨는 "데이터를 사용해 의사결정을 내리는 사람들과 이들이 필요로 하는 데이터를 제공하는 IT 관계자 사이에는 커다란 간극이 있다. 데이터를 이해하는 사람과 조직에서 데이터를 분배하기 위해 갖고 있는 기술을 이해하는 사람을 찾기란 매우 힘들다. 그리고 두 가지를 모두 잘하는 사람은 더욱 찾기 어렵다"고 말했다.

    스테판 퓨와 다른 많은 이들은 오늘날 데이터 시각화에서 필요로 하는 미적인 감각을 연마하는 것에 대해 논의하고 있다.

    포레스터 리서치 수석 애널리스트이자 부회장인 보리스 에벨슨은 "데이터 시각화에는 두 가지 단계가 있다"고 말했다. 첫 단계는 개인의 능력을 통해 최신의 기술과 도구를 사용해 정보를 제시하고 분석하는 것이다.

    예를 들어 엑셀이나 코그노스(Cognos)와 같은 도구를 사용하기 보다는 데이터 분석가들은 타블로(Tableau)나 스팟파이어(Spotfire)를 사용하기가 쉽고 이해가 용이한 차트나 스캐터 플롯(Scatter Plot) 등을 만든다.

    하지만 일부 애플리케이션에 있어서는 이것만으로는 충분치 않다. 최근 뉴욕의 한 대형 은행은 보리스 에벨슨에게 은행 내부적으로 포괄적이면서도 세련된 포트폴리오 분석을 시각적으로 잘 표현해 줄 수 있는 직원이 필요하다고 전했다.

    이를 통해 많은 고객들에게 나타날 수 있는 투자와 위험에 대해 분석해 주고자 했다. 그 은행은 모든 도구와 기술을 갖고 있었지만 여전히 다양한 시각 정보를 두뇌가 흡수하고 반응하는 방법에 대한 전문적인 이해를 가진 직원을 찾고 있었다.

    보리스 에벨슨은 "중요한 것은 데이터 시각화 기술이 아니라 비쥬얼 인식의 심리적인 부분을 아는 것"이라고 말했다. 이 은행에서는 데이터 종류에 따라 다른 시각화를 적용할 수 있는 사람을 찾고 있었다. 또한 인구의 약 7%정도는 색맹이기 때문에 색상에 의존하지 말아야 할 것이라는 예시에서 보듯이, 특정 시각화 기술이 줄 수 있는 한계에 대해서도 충분히 이해하고 있는 사람이 필요했다.

    이 은행은 새로운 전문가를 초빙했다. 정규직이 아닌 파트타임 컨설턴트였는데, 애널리스트들은 이는 빅 데이터에 대한 수요가 많아지더라도 많은 기업에서 채택하게 될 고용 형태가 될 것이라고 설명했다. 세 번째 옵션은 데이터 시각화 프로젝트를 외부에 맡기는 것이다.

    데이터 시각화를 다룬다는 것
    데이터 시각화를 다룬다는 것은 다음과 같다.
    - 데이터와 고객을 이해해라. 어떤 메시지를 전달할 것인지 결정해라.

    - 메시지 전달에 필요한 핵심 내용을 제외한 나머지는 생략하라.

    - 최선의 표현 방법을 결정하라

    양적 정보 전달시에는 단어, 숫자가 기입된 도표, 그래프, 이들의 조합 등 효과적인 정보 전달을 위해 다양한 방법을 생각해야 한다. 이 원칙은 직관적이지 않다. 그래서 훈련을 통해 인간의 눈과 두뇌가 어떤 방식으로 시각 정보를 처리하는지 연구해야 한다. 이를 위해 데이터 시각화 전문가와 상의해야 한다(혹은 스스로 터득하거나 직원들을 훈련시킬 수도 있다).

    - 단순, 명료, 정확한 커뮤니케이션을 위해 화면을 디자인하라
    데이터가 아닌 그 어떤 것도 필요가 없을 시에는 집어넣지 마라.
    다채로운 색상과 비주얼 효과나 그래프의 선도 불필요하게 많이 넣지 마라.
    데이터가 아닌 요소는 정보에 비해 크게 부각되어서는 안 된다.
    메시지 전달에 가장 중요한 정보를 시각적으로 강조하라.

    - 데이터를 토대로 어떤 행동을 취해야 하는지에 대해 설명하라. 대부분의 양적 정보는 단순히 정보 전달뿐만 아니라 유용한 반응을 이끌어 내기 위해서 제시된다.

    애널리스트뿐만 아니라 조직 전반에도 데이터 시각화 훈련의 필요하다는 것을 인식하는 기업들이 늘고 있다.

    시스코의 르완도스키는 스테판 퓨의 워크숍을 6년 전에 이수했다. 르완도스키는 "많은 이들이 놓치고 있는 중요하지만 미묘한 부분을 알게 되었다. 변화를 가져오지만 알아차리기는 어려운 것들이 매우 많다"라고 말했다.

    여러 데이터 시각화 전문가들과 마찬가지로, 르완도스키는 자연히 데이터 시각화 분야에 끌려 들어갔다. 14년 전, 르완도스키는 시스코에서 영업과 사업개발업무를 담당했다. 그리고 나서 파트너 관계를 조율하는 업무를 담당하며 비즈니스 인텔리전스(BI) 애플리케이션을 시작했다.

    자신의 전문성을 비즈니스 인텔리전스와 데이터 분석으로 점차 확산시킨 르완도스키는 이제 사내에 비즈니스 인텔리전스 보급을 전담하는 글로벌 비즈니스 오퍼레이션 팀에서 세 명으로 구성된 팀을 이끌고 있다.

    르완도스키는 "데이터 시각화가 IT 부서의 기능은 아니라고 생각하지만, 그럼에도 이 팀이 IT 조직과 사업의 중간자적 성격을 지니고 있다"고 말했다.

    르완도스키의 팀은 시스코 데이터에 대한 특정한 시각화와 기업의 모범사례 보급과 같은 데이터 시각화 전반에 많은 시간을 쏟고 있다.

    르완도스키는 "우리 팀은 교육을 통해 올바른 데이터 시각화를 실현시키기를 원한다. 종국에는 누구나 의사소통능력을 높혀 나가야 할 책임을 지게 될 것"이라고 설명했다.


    스테판 퓨는 시장 점유율이 전달 내용의 핵심이었기 때문에 일부러 보기 쉽고 절제된 전 구획을 통해 도표를 구성했다. 그래프 아래 부분의 도표를 통합함으로써 정확한 수치를 원하는 사람들에게 필요한 정보를 제공한다. 이곳을 클릭하면 스테판 퓨의 손을 거치기 이전의 그래프를 볼 수 있다.

    그러나 르완도스키는 "데이터 시각화 전문가에게 있어 최종적 목적으로 특정 질문에 대해 해답을 제시하는 데이터를 제시하는 것만으로는 충분치 않다"고 말했다.

    "데이터 시각화의 본질 가운데 하나는 사물을 바라보는 방식을 바꿈으로써 의사결정권자들이 예전에는 질문하지 못했던 것을 하게 만드는 것이다. 성공적인 데이터 시각화가 이뤄지면, 사람들은 더 심층적인 질문을 하게 되고 이는 뛰어난 전략으로 이어져 궁극적으로는 기업에 도움이 된다"고 설명했다.

    르완도스키는 데이터 시각화가 적절히 이뤄지면 근본적 사업 이익을 가져온다고 말했다. 르완도스키는 '르완도스키 피라미드'라 부르는 그래픽을 개발했다. 이 그래픽은 글로벌 전략에 변화를 가져왔다. 이는 실제로 전략적 중요성이 크기 때문에 세부적인 내용까지 언급하지는 않았다.

    르완도스키는 "기본적으로 르완도스키 피라미드는 우리가 어떤 것의 개수를 셀 때 사용하는 구분이다. 예를 들어 주문 숫자나 고객 숫자를 파악하고 난 후 이를 여러 층위로 나누는 것"이라고.

    오랫동안 이 모델이 있어 관리자들은 변화된 부분을 추적 관리하고 변화를 유발하는 기저의 원인을 파악해 기업의 포지셔닝에 변화를 주거나 이머징 마켓에서 이익을 보는 것이 가능해진다(르완도스키는 정확히 무엇에 있어서의 변화인지는 밝히지 않았다).

    르완도스키는 "이를 묘사함에 있어서 이전에는 본적없는 방식으로 만들어 내부의 이해관계자들이 물어봐야 하는 질문의 종류를 구체화시킬 수 있는 방식으로 하려고 한다"고 말했다.

    웰스파고의 기업 데이터와 분석 전문가인 다나 주버는 12년의 경력 가운데 여러 직책에서 데이터 분석 일을 했지만 데이트 시각화를 알게 된 것은 6년 전 웰스파고에 들어왔을 때였다고 말했다.

    은행에서는 데이터 시각화에 대한 내부 훈련 프로그램을 받게 했고 투프트 등이 제공하는 외부 세미나도 참석하게 했다. 다나 주버는 "이 전에는 데이터 시각화에 원칙이 있다는 사실에 대해 이해하지 못했다"고 말했다.

    웰스파고 은행의 경영자가 분명하게 느끼고 있는 것은 바로 데이터 분석뿐만이 아니라 데이터 시각화가 데이터 분석가가 아니더라도 필수적인 스킬이 됐다는 점이다.

    관심있는 사람들은 누구든지 사내에서 필요한 과정을 들을 수 있다. 다나 주버는 "과정 이수자의 수가 늘어남에 따라 데이터 시각화에 대한 관심이 조직 전반에 늘어나고 있다. 데이터 시각화의 가치를 알고 업무에 적용하는 사람들이 늘어나고 있다"고 설명했다.

    이것이야 말로 스테판 퓨가 원하는 과정이었을 것이다. 물론 빅 데이터가 데이터 시각화에 초점을 맞추기는 했지만, 데이터 시각화는 기업에서 오랜 시간동안 필요성이 제기되는 스킬이었다.

    데이터 시각화의 중요성을 깨닫는 기업이 늘고는 있지만 이들 가운데 대다수는 초점을 잘못 맞추고 있다. 직무상세에서는 코그노스로 차트를 어떻게 그리는지 등에 대한 기술적인 부분들에 대해 기재가 된 반면 그래픽 디자인 전문성에 대한 언급은 없다.

    퓨는 "현재 사람들이 원하는 기술의 종류는 그들 자신이 원하고자 하는 기술은 아닐 것이다. 인간 두뇌가 색과 모양을 인식하는 스킬을 포함해, 미묘한 부분에 대한 이해가 없이는, 순간적인 데이터 시각화에 그치게 되는 것이다. 그리고 여러 비주얼 이팩트가 만연한 내용을 제시하는 수준이 되어버려 눈은 즐겁지만 의사소통 전달에는 부족함이 많아진다"고 말했다.

    좋은 데이터 시각화에 필요한 특질들은 다음과 같다.
    - 어려운 문제 풀기를 즐기고 데이터를 받아들여라
    - 고객과 고객이 원하는 정보가 무엇인지에 대해 이해해야 한다.
    - 인내심을 갖고 새로운 도구나 디스플레이 표기방법의 차이에 대해 이해해야 한다.
    - 예술과 비주얼 디자인에 대한 이해와 관심이 있어야 한다.
    - 수학, 공학, 통계, 경영, 재무 등으로 학위를 따야 한다
    - 에드워드 투프테나 스페한 퓨가 등 고수들에게서 최고의 현장경험을 배워야 한다
    - 좌뇌와 우뇌를 둘 다 사용할 수 있다는 두뇌 스킬
     editor@itworld.co.kr

    2015년 4월 7일 화요일

    스크랩: 리눅스 파일 검색 (find), 파일 내부 문자열 검색(grep 이용)

    리눅스 파일 검색 (find), 파일 내부 문자열 검색(grep 이용)

    2012/06/29 20:20 Linux/Fedora&CentOS

    출처: http://ngee.tistory.com/83 그대로 퍼옴.
    안녕하세요.

    리눅스에서 파일 검색을 하기 위한 명령어 find를 소개합니당.

    리눅스 상에서 주로 개발을 하는 저로써는 매우 자주 사용하는 명령어 인데요.

    간단하니깐 !! 바로 !! 명령어 들어갑니당.


    명령어 : find 파일 찾을 위치 지정 -name 찾을 파일 이름
        ex  : find ./ -name aaa.txt

    위에 ex를 설명해드리면 ./(현재 폴더 부터, 하위 폴더 포함) aaa.txt 파일을 찾아줘!!! 입니다.




    다음으로 파일 내부 문자열을 검색하는 명령어 grep 입니다.

    사실 grep은 여러군데서 사용하고 있는 것이기 때문에, 파일 내부 문자열 검색만을 위해서 쓰이고 있지는 않습니다.

    grep의 man을 보시면 -print lines matching a pattern 으로 나와있어요.

    이번 포스팅에서는 grep을 통해서 파일 내부의 문자열을 검색해서, 찾고자 하는 문자열과 동일한 문자열을 가진

    파일을 찾아주는 것으로 

    명령어 : grep -r "찾을 문자열" ./*
         ex : grep -r "aaa" ./*
            
    위의 ex를 설명드리면 ./(현재 폴더 아래 모든 파일에서) aaa라는 문자열이 있는지 찾아라!! 단 하위 디렉토리 모두에서(-r) 입니다.

    간단하죠? ^ ^ 


    리눅스 관련 포스팅 모음

    리눅스 파일 검색 (find), 파일 내부 문자열 검색 (grep 이용) : http://ngee.tistory.com/83
    scp (공개키 암호화 사용, 패스워드 없이) : http://ngee.tistory.com/80
    디스크 남은 용량, 메모리 사용량, 리눅스 작업관리자 알아보기 : http://ngee.tistory.com/76
    리눅스 하드웨어 확인하기 : http://ngee.tistory.com/88
    리눅스 테마 적용, 꾸미기 : http://ngee.tistory.com/90
    리눅스 패널에 모니터링(CPU, Memory, Network) 추가하기 : http://ngee.tistory.com/100
    리눅스 yum 사용법 : http://ngee.tistory.com/127

    저작자 표시 비영리 변경 금지
    posted by moto ngee

    2012년 11월 8일 목요일

    dojo.xhr*을 사용하여 Ajax에 권한 위임

    dojo.xhr*을 사용하여 Ajax에 권한 위임

    Ajax를 사용하는 웹 애플리케이션 작성은 일반적으로 XmlHttpRequest(XHR) 오브젝트를 작성하여 수행되며, 이 오브젝트는 주어진 URL로 HTTP 요청을 하여 요청 헤더와 본문을 전달하고, 응답이 성공적인 응답 본문이나 HTTP 실패 응답으로 리턴될 때 수행되어야 하는 조치를 정의하는 콜백 함수를 정의한다. 크로스 브라우저 XHR을 구현하는 과정은 아무래도 힘들 수밖에 없지만, 다행히도 Dojo를 이용하여 GET, POST, PUT  DELETE 요청을 가능하게 하는 일련의 dojo.xhr* 함수를 사용하면 이러한 힘든 작업을 상당히 완화할 수 있다.
    제공되는 네 가지 함수는 다음과 같다.
    • xhrGet
    • xhrPost
    • xhrPut
    • xhrDelete
    이러한 함수는 모두 동일한 구문을 따르며, 단일 특성 구성 오브젝트를 인수로 받는다. 이 오브젝트에서 작성하고자 하는 Ajax 요청의 다양한 특성을 정의할 수 있다. 또한, 이러한 옵션은 모든 XHR 함수에서 동일하다.
    XHR 함수에서 사용 가능한 더 유용한 구성 옵션 중 일부는 다음과 같다.
    url
    이 옵션은 HTTP 요청이 작성되어야 하는 URL이다. 이 URL은 요청을 작성 중인 페이지와 같은 도메인과 포트의 조합으로 되어 있어야 한다.
    handleAs
    응답 처리 유형을 정의할 수 있게 한다. 기본값은 text이지만, json, javascript, xml 및 기타 두 가지 옵션이 사용 가능하다. 나중에 이 섹션에서는 JSON 응답 형식을 처리하는 콜백 함수를 사용하여 Ajax 요청을 작성하는 예제를 살펴볼 것이다.
    form
    <form> 요소의 문자열 ID 표현이나 참조이다. 양식에 있는 각 필드의 값은 요청과 함께 요청 본문으로서 전송된다.
    content
    요청 본문에 있는 자원에 전달할 매개변수를 포함하고 있는 오브젝트이다. 이 오브젝트는 form 특성에서 가져온 값과 혼합된다(이 두 값이 모두 제공되는 경우).
    XHR 함수 예제는 목록 22에 표시되어 있다.

    목록 22. XHR 함수 호출 예제
    dojo.xhrGet({
        url: "save_data.php",
        content: {
            id: "100",
            first_name: "Joe",
            last_name: "Lennon"
        }
    });
    


    이 예제에서는 문서 자체와 같은 위치에 있는 save_data.php 파일에 비동기적으로 HTTP GET 요청을 한다. 또한, 컨텐츠 오브젝트의 특성을 매개변수로서 PHP 스크립트에 전달한다. PHP에서는 $_GET 변수를 사용하여 이러한 값을 검색한 후, 이 값을 데이터베이스에 저장한다.
    이전 예제에서는 dojo.xhrGet을 사용하여 Ajax 요청을 호출하는 방법을 배웠다. 이 예제는 실제로 요청을 작성하기에 충분하지만, 이 예제에는 처리 및 응답 기능이 없다. 또한, 콜백 함수가 구성 오브젝트로 전달된다. 사용 가능한 옵션은 다음과 같다.
    load
    이 함수는 Ajax 요청이 성공적인 응답 메시지를 리턴할 때 실행된다. 응답 데이터와 요청 오브젝트는 매개변수로 이 함수에 전달된다.
    error
    이 함수는 Ajax 요청에 문제가 발생할 때 실행된다. 이러한 현상은 Ajax 요청에 지정되어 있는 URL이 올바르지 않은 경우, 요청 제한시간이 초과한 경우 또는 기타 HTTP 오류가 생기는 경우에 발생한다. 오류 메시지와 요청 오브젝트는 인수로서 전달된다.
    handle
    이 함수를 이용하면 로드 및 오류 콜백 함수를 하나의 함수로 결합할 수 있으며, 요청이 성공하든지 오류가 발생하든지 사실상 신경 쓰지 않는 경우에는 이렇게 하는 것이 유용하다.
    다음 예제에서는 JSON 파일에서 데이터를 일부 로드하여 해당 페이지에 표시하는 로드 콜백 함수가 있는 Ajax 호출을 작성한다.
    더 현실적인 예제를 작성하여 dojo.xhr* 함수를 충분히 테스트해보자. 우선 파일을 새로 작성한 후, 이 파일을 listing1.html과 같은 디렉토리에 삽입한 다음 이 파일에 JSON 데이터를 일부 추가한다. 이 파일의 컨텐츠는 목록 23에 표시되어 있다.

    목록 23. data.json — Ajax 요청으로 처리할 JSON 데이터
    {
        count: 4,
        people: [
            {
                first_name: "Joe",
                last_name: "Lennon",
                age: 25  
            },{
                first_name: "Darragh",
                last_name: "Duffy",
                age: 33
            },{
                first_name: "Jonathan",
                last_name: "Reardon",
                age: 30
            },{
                first_name: "Finian",
                last_name: "O'Connor",
                age: 23
            }
        ]
    }
    


    이제 Firebug에서 Ajax 요청을 작성하고, Dojo가 로드되도록 Firefox에서 listing1.html 페이지가 로드되었는지 확인한다. 이 요청은load 콜백 함수를 사용하여 JSON 응답을 처리하고 테이블을 페이지에 표시한다(목록 24 참조).

    목록 24. Ajax를 사용하여 JSON 데이터를 로드하고 처리
    dojo.xhrGet({
        url: "data.json",
        handleAs: "json",
        load: function(data) {
            var table = "<table border=\"1\">";
            table += "<tr><th>Name</th><th>Age</th>
    </tr>";
            dojo.forEach(data.people, function(person) {
                table += "<tr><td>";
                table += person.first_name+" "+person.last_name;
                table += "</td><td>";
                table += person.age;
                table += "</td></tr>";
            });
            table += "</table>";
            dojo.place(table, dojo.body());
        }
    });
    


    Firebug에서 목록 24에 있는 코드를 시도한다. JSON 파일에서 로드한 데이터와 함께 테이블이 페이지에 동적으로 추가된다. 이 과정은 그림 5에 표시되어 있다.
    chrome browser에서는 firefox에서처럼 data.json 처럼 파일로 받는건 안된다..

    그림 5. Ajax로 JSON 데이터를 로드한 테이블
    사람 이름 네 개와 해당 나이가 표시되어 있는 테이블이 있는 페이지 
    실제로는 PHP, Python, ASP, .NET 또는 Java와 같은 서버측 언어를 사용하여, Ajax 요청을 통해 전달되는 매개변수를 기반으로 JSON 데이터를 동적으로 생성한다.
     

    2012년 11월 2일 금요일

    Dojo의 이벤트 처리

    대부분의 Javascript 라이브러리에는 기본 Javascript 이벤트 처리의 크로스 브라우저 구현이 있어서 DOM 이벤트가 트리거될 때 호출될 함수를 연결할 수 있다. 이는 유용하지만 Dojo에서는 한층 더 진보된 개념을 취하여 함수를 다른 함수와 연결할 수 있게 하며, 이러한 것으로는 DOM 이벤트, 오브젝트 이벤트, 사용자 정의 함수 또는 "주제(이 섹션에서 나중에 논의함)"가 있다.
    DOM 이벤트에 함수를 연결하는 첫 번째 방법은 dojo.connect 함수를 사용하는 것이다. 이점을 확인할 수 있는 가장 좋은 방법은 예제를 사용하는 것이다. Firebug 콘솔에서 목록 13에 있는 코드를 입력한다.

    목록 13. dojo.connect를 사용하여 함수를 DOM 이벤트에 연결
    var message = dojo.byId("message");
    dojo.connect(message, "onclick", function() {
        alert(message.innerHTML);
    });
    


    이렇게 하면 목록 14와 같은 결과가 콘솔에 표시된다.

    목록 14. 결과
    >>> var message = dojo.byId("message"); dojo.connect..., function() 
                                                  { alert(message.innerHTML); });
    [div#message, "onclick", function(), 1]
    


    결과는 우수하지만, 실제로 무엇인가를 수행할 만한 함수는 전혀 아니다. Dojo는 ID가 "message"인 요소의 click 이벤트 핸들러에 함수를 연결했다. 시험해 보려면 "This is a DIV element with id attribute message" 컨텐츠가 있는 화면에서 해당 메시지를 클릭한다. 그림 4와 같은 Javascript 경보 상자가 표시된다.

    그림 4. DOM 이벤트에 함수 연결
    A message box containing 'This is a DIV element with id attribute                     message.' 
    멋지지 않은가? 배열에 있는 모든 항목에 이벤트를 연결하려면 어떻게 해야 할까? 예를 들어, 해당 페이지에서 순서없는 목록의 각 항목을 클릭하면 이 항목이 굵은체로 강조되도록 하려고 한다고 하자. 목록 15에 있는 코드를 사용하면 이 작업을 손쉽게 수행할 수 있다.

    목록 15. 요소의 배열에 이벤트 연결
    dojo.query("#list li").forEach(function(item) {
        dojo.connect(item, "onclick", function() {
            dojo.style(item, {
                fontWeight: "bold"
            });
        });
    });
    


    시험해 보면 제대로 작동할 것이다. Dojo를 이용하면 훨씬 더 간결한 방법으로 코드를 작성할 수 있다. forEach를 사용하여 배열을 반복하는 대신, 목록 16과 같이 NodeList.connect 바로 가기 함수를 사용하여 이 작업을 수행할 수 있다.

    목록 16. 요소로 구성된 배열에 이벤트 연결(개선됨)
    dojo.query("#list li").onclick(function(e) {
        dojo.style(e.target, {
            fontWeight: "bold"
        });
    });
    


    이미 목록에 이벤트를 연결했으므로 목록 16에 있는 코드를 시도하여 작동하는지 확인하기 전에 페이지를 다시 고친다. e 인수는Event 오브젝트에 대한 참조이며 이 오브젝트의 target 특성을 이용하여 이벤트가 개시된 요소를 식별할 수 있다. 이 특성을 사용하여 굵은체로 스타일이 지정되어야 하는 요소를 식별한다. 목록의 세 가지 항목을 클릭해 보면, 클릭한 후에는 각 항목이 굵은체로 바뀐다.
    이전 예제에서는 함수를 DOM 이벤트에 연결했다. Dojo에서는 이와 같은 방법으로 함수를 다른 함수에 연결할 수 있다. 이러한 예는 물레 이미지를 페이지의 어딘가에 표시하는 함수가 될 수 있다. 사용자가 Ajax 함수를 수행할 때, 이 이미지가 표시되게 하려고 한다. 마찬가지로 이 함수가 응답을 리턴하면 이 이미지를 숨기고 싶다. dojo.connect를 사용하지 않으면 코드는 목록 17과 같은 형태가 된다.

    목록 17. dojo.connect를 사용하지 않고 함수를 다른 함수에 연결하기
    function toggleImage() {
        //Code to show/hide loading image goes here
    }
    
    function callAjax() {
        toggleImage();
        //Code to call Ajax function goes here
    }
    
    function handleResponse() {
        //Code to handle Ajax response goes here
        toggleImage();
    }
    


    이 코드에는 아무런 문제가 없지만, callAjax handleResponse 함수에서 toggleImage 함수가 수정되었다. 또 다른 함수 호출을 추가할 경우에는 이러한 함수를 수정하여 추가 호출이 포함되도록 해야 한다. 함수 자체에 함수 호출을 추가하는 대신에dojo.connect를 사용하여 이러한 함수를 서로 연결할 수도 있다. 목록 18에는 dojo.connect 메소드를 사용하는 방법이 표시되어 있다.

    목록 18. dojo.connect를 사용하여 함수를 다른 함수에 연결
    function toggleImage() {
        //Code to show/hide loading image goes here
    }
    
    function callAjax() {
        //Code to call Ajax function goes here
    }
    
    function handleResponse() {
        //Code to handle Ajax response goes here
    }
    
    dojo.connect(callAjax, toggleImage);
    dojo.connect(handleResponse, toggleImage);
    


    이러한 코딩 스타일이 모든 개발자에게 적합한 것은 아니지만, 이렇게 하면 코드를 훨씬 더 읽기 쉽게 하는 방식으로 코드를 체계화할 수 있다.
    언급할 만한 가치가 있는 Dojo 이벤트 처리의 궁극적 특성은 주제에 발행하고 등록하는 기능에 있다. 이 기능은 Dojo 컴포넌트가 서로의 존재를 인식하고 있지 않은 경우에도 서로 상호 작용할 수 있게 한다. 예를 들어, 개인의 성명이 있는 message 오브젝트가 예상되는printName이라고 하는 주제를 정의하고 있었다고 하자. 그러면 이 주제에 등록하고, 또 다른 컴포넌트가 개인의 이름으로 이 주제에 발행할 때마다 콘솔에 이름을 표시하는 컴포넌트가 있을 수 있다. 목록 19에는 이러한 등록을 하는 예제가 표시되어 있다. (Firebug에서 이 예제를 자유롭게 사용해 보자.)

    목록 19. 등록
    dojo.subscribe("printName", function(msg) {
        console.log("The person's name is: "+msg.first_name+" "+msg.last_name);
    });
    


    이 주제에 발행하려면 해당 주제의 API에 연결된 오브젝트의 배열을 전달해야 한다. (이 경우에는 오브젝트에 성과 이름이 포함되어 있어야 한다.) 목록 20에 예제가 표시되어 있다.

    목록 20. 주제에 발행하기
    dojo.publish("printName", [
        {
            first_name: "Joe",
            last_name: "Lennon"
        }
    ]);
    


    이 코드의 결과는 목록 21과 같다.

    목록 21. 결과
    >>> dojo.publish("printName", [ { first_name: "Joe", last_name: "Lennon" } ]);
    The person's name is: Joe Lennon
    


    아는 바와 같이 이 오브젝트를 printName 주제에 발행하면, 등록 함수가 해당 메시지를 콘솔에 출력한다.
    출처: http://www.ibm.com/developerworks/kr/library/wa-ground/

    크롬 에서 번역 옵션 뜨는 거 막는 방법

    버그 같은게 아니고 저 옵션의 기본 값이 제공으로 바뀐듯... 번역 옵션 제공을 비활성화하면 안 뜸. Chrome에서 웹페이지 번역 모르는 언어로 작성된 페이지를 방문할 때 다음 단계에 따라 Chrome이 페이지를 번역하도록 할 수 있습...