레이블이 프로그래밍인 게시물을 표시합니다. 모든 게시물 표시
레이블이 프로그래밍인 게시물을 표시합니다. 모든 게시물 표시

2013년 12월 31일 화요일

네이버 Band(밴드) 어플, 충격적인 배터리 소모량

삼성 갤럭시 소프트웨어 업데이트 이후에 배터리 소모량이 급격하게 늘어난(지난 글 : http://www.ojt.co/2013/12/blog-post_30.html) 원인을 파악하고자, 이것저것 다양한 환경으로 테스트를 해보니 주요원인 중 하나가 네이버의 커뮤니티 어플 '밴드(Band)'로 드러났다.

네이버의 앱들이 배터리 많이먹는 것으로 이미 악명이 높긴 했지만, 배터리 총량의 81%를 단 하나의 어플리케이션이 소모했다는 것은 가히 충격적이다.(게임도 아니고..ㄷㄷ) 물론 예외적인 환경에서 구동된 것이고 삼성 갤럭시의 소프트웨어 업데이트라는 변수가 있기 때문에, OS쪽에서 각 어플들에게 정확한 정보를 전달하지 않은 것이 문제일 가능성도 있다.

하지만, 여러 네이버 앱 사용자들의 배터리 관련 리뷰를 볼 때, Band에서 예외처리를 제대로 안하고 무한히 Loop를 돌려 백그라운드 서비스에 에너지를 소모한 것이 유력한 원인으로 추정된다.

2013년 10월 26일 토요일

RC카 개조 '스마트폰으로 조종하기'

안드로이드 IOIO를 이용한 하드웨어 제어 첫 프로젝트!
실제 완성은 지난 추석(9/20일경)에 끝났지만 구동되는 동영상을 촬영할 기회를 잡지 못하여 종합포스팅이 늦었다.

#. 이전글 링크

#. 추가 작업관련 사진

어처구니 없는 실수로 DC모터 제어드라이버를 태워먹었다. (모터 전원선을 반대편부터 꼽았더니 회로가 꼬여서 흰 연기가 발생했다..ㅠㅠ) 다행히 같은 칩 'TB6612FNG'을 사용한 드라이버를 더 저렴한 가격에 파는 국내 제품(오른쪽)이 있어서 대체할 수 있었다. 캔타입 커패시터를 사용하고 크기가 더 작고, 더 저렴하다. 너무 작아서 납땜이 힘들었던 것은 단점..

Human error로 인해 고장이 발생한 것이기에,
각 접점의 표기가 보이도록 납땜하려함.

최종 완성된 하드웨어
RC카를 너무 작은 것으로 샀다는 생각이 든다.

RC카 컨트롤을 위해 자체 제작한 어플

#. 구동 동영상


맑은 날 필드에서 운전하는 것을 촬영하고 싶었으나, 촬영을 도와줄 사람도 없고... 회사부서가 변경되면서 시간도 부족하고 하여, 그냥 방에서 시연하는 것으로 대체함. 좀 아쉬움이 남는다.


#. Lesson learned

임베디드 지식도 없고, 안드로이드는 커녕 자바 지식도 없이, 무턱대고 시작한 프로젝트라서 시행착오 덩어리였지만 그 중에 가장 어려웠던 것을 하나 꼽자면, 하드웨어의 기계적/전기적 특성의 중요성을 너무 얕잡아본 것 같다.
2만원짜리 RC카는 크기도 작고, 앞뒤 모터도 부실하며, 제어용 전원을 별도로 사용해야 했고, 그래서 추가된 AAA배터리의 무게도 버거워했다. 제대로 만들어 보려면 5만원대 이상의 제품을 사용해야 할 듯...

이번에 해보면서 깨달았던 크고 작은 아이디어를 모아서 다음 프로젝트는 더 재미있고, 완성도 높은 것으로... 그리고 나만의 Originality를 담은 제품으로 만들어 보고싶다.

2013년 10월 20일 일요일

안드로이드 RC카 App.(자체제작 어플)

싸구려 RC카를 안드로이드로 컨트롤하려면, 당연한 이야기이겠지만 안드로이드 어플개발법을 알아야한다. 하지만 나는 C언어와 그 계열의 스크립트 언어(Python...)만을 다루어봤기에 자바부터 안드로이드 개발까지 한 스텝씩 밟아 나갈만한 시간이 없었고, 날림으로 만든... 그리고 처음으로 만든 어플임을 미리 밝혀둔다!

간단하게 만든 RC카 컨트롤 어플


매우 단순한 이 어플리케이션은 상하방향의 Seekbar를 조작하여 속도를 조절하고, 좌우방향의 Seekbar로 RC카의 방향을 조절하도록 한다. 내가 발휘한 약간의 창의력이라고 하면, '센서Drive ON' 토글버튼으로 스마트폰 내 가속도센서를 읽어 Seekbar를 컨트롤 할 수 있도록 한 것이다.

즉, 스마트폰을 수직으로 점차 세우면 속도가 빨라지고, 좌우로 기울이면 방향이 전환된다. 마치 스마트폰을 핸들처럼 사용할 수 있는 것이다. (내부 센서를 읽어오는 방법은 IBM의 자료 http://www.ibm.com/developerworks/library/os-android-sensor/ 를 참고했다. 약간은 deprecated된 내용인 듯 하니 유의바람)

그리고 안드로이드 api 내에는 수직으로 된 Seekbar가 없기에 기존의 것을 Extend하여 구현해 주어야 했다. Stackoverflow와 기타 블로그등등을 돌아다니며, 빌드해보고 안되는 것 없애고 필요한 것 덧붙인 누더기 클래스이지만, 누군가에게는 도움이 될지 모르니ㅠㅠ 올려봄.

//VertSeekBar.java로 만들고 메인java에서 임포트하여 사용

package ioio.app.rover;

import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.SeekBar;

public class VertSeekBar extends SeekBar {
  
    public VertSeekBar(Context context) {
        super(context);
    }
 
    public VertSeekBar(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
 
    public VertSeekBar(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(h, w, oldh, oldw);
    }
 
    @Override
    protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(heightMeasureSpec, widthMeasureSpec);
        setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());
    }
 
    protected void onDraw(Canvas c) {
        c.rotate(-90);
        c.translate(-getHeight(), 0);
 
        super.onDraw(c);
    }
    
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (!isEnabled()) {
            return false;
        }
 
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            // onChangeListener.onStartTrackingTouch(this);
            setPressed(true);
            setSelected(true);
            break;
        case MotionEvent.ACTION_MOVE:
            super.onTouchEvent(event);
            int progress = getMax() - (int) (getMax() * event.getY() / getHeight());
             
            // Ensure progress stays within boundaries
            if(progress < 0) {progress = 0;}
            if(progress > getMax()) {progress = getMax();}
            setProgress(progress);  // Draw progress
             
            onSizeChanged(getWidth(), getHeight() , 0, 0);
            setPressed(true);
            setSelected(true);
            break;
        case MotionEvent.ACTION_UP:
            setPressed(false);
            setSelected(false);
            break;
        case MotionEvent.ACTION_CANCEL:
            super.onTouchEvent(event);
            setPressed(false);
            setSelected(false);
            break;
        }
        return true;
    }
 
    public synchronized void setProgressAndThumb(int progress) {
        setProgress(progress);
        onSizeChanged(getWidth(), getHeight() , 0, 0);
    }

    public void updateThumb(){
        onSizeChanged(getWidth(), getHeight(), 0, 0);
    }
    
    public synchronized void setMaximum(int maximum) {
        setMax(maximum);
    }
 
    public synchronized int getMaximum() {
        return getMax();
    }
}

처음이라 아직까진 엉망이지만, 일단 부딪혀 보면서 많은 것을 배울 수 있으리라 기대한다. Java 언어가 가상머신위에 돌아가서 그런지 모르겠으나, High level 언어처럼 좀 더 사람이 쓰기 편하게 구조화 되어있다는 느낌을 받았고, 자바/안드로이드/디자인패턴에 대한 배움욕구(?)가 솟아나고 있다.

2013년 9월 15일 일요일

안드로이드 RC카 중간현황(2013.09.15)

토/일요일 이틀 모두 회사에 출근했음에도 불구하고, 집에 있는시간 틈틈히 프로젝트를 진행했다. 브레인 리소스를 오버클럭(!) 하여, 자바와 안드로이드, 전기기초+ IOIO하드웨어 등등의 개념을 한꺼번에 잡아가려니 힘이든다. 업무적으로도 로드가 많이 걸리는데, 이렇게 뇌를 혹사해도 되는가 싶다. 아무래도 방송통신대를 이번 학기 휴학해야 할 듯...


일단 싸구리 RC카의 모터와 전원부 라인을 Desoldering하여 빼내었다. 전원부 회로는 최대한 유지하여, 내부회로를 통한 배터리 충전이 가능하도록 두었으며 뽑아낸 선으로 옆구리의 Ni-Cd 전원을 사용할 수 있다.


소프트웨어(안드로이드 어플)는 Onboard LED를 켜고끄던 테스트 어플에 덧대고 덧대어 이 지경까지 왔다;; 나중에 필요한 부분만 독립시켜서 Rover control 전용어플로 만들 생각임.


안드로이드 내부의 가속도센서를 읽고, 이것을 이용하여 RC카를 컨트롤 할 계획이다. 맨 아래의 '센서Drive ON버튼'을 누르면 구동되게 했고, 안드로이드 폰을 자동차 핸들처럼 쥐고 앞으로 세우면 가속, 좌/우로 기울이면 방향전환이 되도록 했음. (사진은 세워서 약간 왼쪽으로 했을 때의 SeekBar)

추석 연휴에 별일이 없다면, 안드로이드-RC카 연계 가능할 듯...

2013년 8월 28일 수요일

안드로이드 IOIO 수령, 전원테스트

퇴근하고 초상집에 들렀다 늦은 시간 집에 도착해 피곤했지만, 안드로이드 IOIO OTG를 포함한 택배가 도착해 있는 것을 확인하니 에너지가 약간 솟아납니다. 잠들기 전까지 간단한 테스트만 해보렵니다.


안드로이드 IOIO(좌), 모터드라이버(우) 둘 다 크기가 매우 작습니다. 희생양으로 구입한 RC카도 미니 지프이지만, 내부에 회로구성해도 충분한 공간이 나올 것 같네요.


안드로이드 IOIO OTG 고화질 샷, 클릭하시면 원본을 보실 수 있습니다. 아마도 웹상에 도는 사진 중 가장 고화질이 아닐까...싶네요.


전원부는 JST커넥터로 체결하게 되어있습니다. 하지만 JST 커넥터가 한 번 들어가면 빠지지 않도록 위쪽에 돌기를 두 개 가지고 있기에 가공작업이 필요합니다. 늦은 시간... 여기에 공들이기는 피곤해서 나중에 하기로 합니다.


대신 집에 굴러다니는 정체모를 USB 단자(미니도 아니고 마이크로도 아녀;;)를 자르고, 스마트폰 충전용 DC어댑터를 물려서 기본적인 테스트를 해봅니다.


전원이 잘 들어오네요. 빨간 USB선으로 갤노트에 연결해 기본 예제 HelloIOIO 어플도 구동했는데 잘 됩니다. (갤노트2를 카메라로 쓰려고 Activity를 숨기니 하드웨어 작동도 멈추네요. 그래서 Hello테스트는 사진이 없음... 테스트용 안드로이드폰을 마련해야 할 것 같습니다.)
 

2013년 8월 25일 일요일

안드로이드 IOIO 라이브러리 임포트

안드로이드에서 하드웨어를 제어할 수 있도록 해주는 kit 들이 나오고 있는데, IOIO라는 USB host를 이용해서 웹상에 돌아다니는 프로젝트를 따라해 보기로 했다. (개발환경은 윈도우7 32bit, JDK7u25, android sdk r22, eclipse Indigo임.)

아직 IOIO는 주문도 하지 않았고, 집에 납땝인두도 하나 없는 상황이며, 자바도 배워본 적 없지만, 무작정 따라하기 정신으로 안드로이드 IOIO의 드라이버를 먼저 설치해 보고자 했다. 개발환경도 셋팅되어있지 않으니, 미리 해둬야 할 일들이 많았음.

드라이버 링크(https://github.com/ytai/ioio/wiki/Downloads)에서 IOIO-OTG용 라이브러리인 3.30을 다운받았다. 국내에서 IOIO판매하는 업체가 드문데 다들 OTG로 팔고있어서 OTG밖에 대안이 없다.

다운받은 라이브러리를 이클립스에 Import하는 과정에 삽질이 많았는데, 해결책은 간단하였다. 일단 Import를 하기 전에 zip형태의 라이브러리의 압축을 풀어서 전체폴더를 workspace 내로 옮겨주는 것이 좋다.


폴더를 옮겨놓았으면 Import 메뉴에서 Existing Projects into Workspace를 고른다. 처음에 샘플코드랑 같이 임포트 하려고 Android 하위항목을 고르기도 했고, zip파일에서 라이브러리를 직접 import하기도 했는데... 그러면 삽질을 많이 하게 될 것임;;



Next로 뜨는 창에서 Select root directory로 하여, 아까 workspace 안으로 옮겨놓은 폴더를 선택하고 대신 Copy projects into workspace 체크를 해제해야 한다.



요렇게하면 삽질 안하고 빨간표시 하나도 없이 위와같이 Import를 순조롭게 마무리 할 수 있다. 이유가 궁금하거나, Eclipse 관련 다른 문제가 생기면 IOIO github의 wiki를 참고하시길...
https://github.com/ytai/ioio/wiki/Eclipse-Troubleshooting

2013년 2월 6일 수요일

오픈소스 하드웨어

무슨 내용으로 웹 서핑을 하고 있었는지는 모르겠는데, 서핑 중에 흥미로운 세계를 알게되어서 블로그에 logging 한다. 바로 '오픈소스 하드웨어'라는 개념인데, 아래의 슬라이드를 보면 그들의 강령(?)과 대표적인 제품들이 나온다.



#. 오픈소스 하드웨어 정신(?) 요약

디자이너는
 - 사용자의 modification을 도울 수 있도록 도면을 제공한다.
 - 그리고 그 도면의 수정/재배포를 허용한다.
 - 원본 하드웨어에서 수정되거나, 이를 이용해 만들어진 제품의 생산/판매/배포/사용을 허용한다.
 - 개발된 제품이 적절하게 기능할 수 있도록 documentation 혹은 software를 포함한다.


예제로 보여주는 제품에도 신기한 것들이 많았는데, 그 중에 가장 관심이 갔던 것은 Beagle Board라는 가로x세로 7센티미터에 불과한 팬리스 베어본 보드였다. (하단 사진)

예전부터 작은 사이즈의 메인보드에 관심이 많았기에, 해외배송이지만 질러볼까 하는 마음이 생긴다. 국내에도 관련자료가 있나에서 검색해보니, 비글보드로 시작하는 임베디드에 대한 책이 있었다. 물론 내가 할 수 있는 것은 리눅스를 깔아서 체험... 해본다 던가, 다운로드 머신으로 쓰는 것 밖에 없겠지만...^^;

2012년 10월 9일 화요일

자바스크립트 이용한 쿠키삭제

우리회사 인트라넷에는 로그아웃 버튼이 없다. 왜 로그아웃 버튼을 만들어주지 않는지는 해명을 들어봐도 이해가 되지 않지만, 암튼 로그아웃 대신에 익스플로러를 끄라고 한다. 그게 인터넷 익스플로러7 까지는 먹혔는데 IE8이상에서는 탭이나 창을 닫아도 로그아웃되지 않는 문제가 있었고,  그 해결방안을 찾다가 익스플로러 즐겨찾기에 javascript를 등록하여 로그인정보를 제거하는 꼼수를 생각해내었다.



익스플로러를 껐다가 켜라는 뜻은 결국 클라이언트쪽에서 쿠키방식으로 로그인을 관리한다는 것인데, 그러면 쿠키를 지워주는 버튼을 만들면 되는거 아닌가?? 암튼 안해주니 직접하는수밖에... 웹 개발할 때에도 jQuery 프레임워크만 써서 잘 모르는 문법이지만, 구글신에게 여쭈어가며 익스플로러 즐겨찾기 버튼에 아래와 같은 함수를 삽입했다.


javascript:(function(cookieName){var expireDate=new Date();expireDate.setDate(expireDate.getDate()-1);document.cookie=cookieName+"= ; expires="+expireDate.toGMTString()+";path=/";})("Authentication");location.reload();

요약하자면, 로그인 정보인 "Authentication"쿠키의 expiration date를 현재의 날짜(getDate)보다 하루 전날의 날짜로 설정하여, 쿠키를 삭제하도록 한 것... 요렇게 해서 회사 인트라넷에 공유하였고 많은 사람들이 잘 사용하고 있다.

내가 프로그래머들의 세계에서 조직적으로 일해 본 적이 없어서 그런지 모르겠지만, 전산관리 조직은 가끔씩 이해가 안갈 때가 있다.

2012년 9월 20일 목요일

다른 세계의 사고방식 『프로그래밍 심리학』

 
 
이 책의 저자는 천공카드(punch card)로 데이터를 작성하여 커다란 메인프레임에 기계를 돌리던 시절부터, 그리고 프로그래머들이 한 대의 머신앞에 길게 줄서서 자신의 프로그램을 가동하길 기다리던 시절부터 컴퓨터의 역사를 써온 IBM의 엔지니어였다.

책을 처음봤을 때 들었던 우려는, 제목에 심리학이 붙어있는데 이와 관계된 부분은 없고, 저자의 가십거리만 늘어놓은 책일 수도 있다는 생각을 했으며, 더욱이 글쓴이가 뼈속까지 엔지니어였던 출신의 사람이기에 더욱 그럴 가능성이 높아보였다.

그.러.나!!! 예상을 뛰어넘는 전문적인 심리학의 깊이로 '프로그래머가 기계를 다루는 또 다른 기계'로 취급받지 않도록, 현대인지과학[cognitive psychology] 의 이론들을 적극적으로 활용하고 있다. 그래서 심리학 전공자인 나에게 있어서 이 책은 psychological mind로 프로그래밍이라는 영역에 접근하게 해 준 고마운 책이 되었다.
 
 
아주 옛날옛적 프로그래밍 언어로 설명하고 있지만, 본질은 변하지 않는 듯~


방송대를 제외하고 내가 처음 졸업한 전공은 심리학이지만, 고등학교 때부터 문과/이과의 선택기준으로 심리학/컴퓨터공학을 고민했을 정도로 컴퓨터를 좋아해왔고, 지금은 프로그래밍을 취미로 하고 있다. 프로페셔널하게 개발하려는 계획은 아직 없지만, 혼자 프로그래밍을 하면서 드는 생각은 ‘내가 하는 프로그래밍은 실제 직업프로그래머들이 하는 것과 얼마나 많이 다를까?’ 아니면, 내가 정말 얼마나 엉망인지, 아니면 공대생들이 생각하지 못하는 방식으로 새로운 영역을 개척하고 있는 것은 아닌지 궁금했다. 그 답은 물론 실제로 사람들을 만나고 co-work해보는 것에서 찾아야 겠으나, 이 책을 통해 프로그래밍의 본질에 대해서 생각해 보면서 약간이나마 그 궁금함이 해소된 듯 하다.
 

25년판 주석에는 '이제야 말할 수 있는' 내용도 담겨있다.


#. 내가 표시해 둔 이책의 명언

1. 사람의 정신은 일반적으로 가진 능력에서 10%만을 발휘한다. 나머지는 그 정신의 운영체제 때문에 발생한 오버헤드로 소진된다.
 
2. 두려운 것은 실패 그 자체가 아니라 다른 사람들에게 자신이 실패하는 모습을 보이는 것이다.
 
 

2012년 9월 19일 수요일

AVR, ARM, PLC, PAC 기초개념잡기

기계 혹은 공정을 제어하는 '두뇌'들의 이름이 참으로 다양해서, 뭘 붙들고 공부해야 할 지 포인트가 안잡혔는데, 의외로 주변(풍력터빈의 제어)에서 힌트를 얻어 찾아보니 어렴풋이 그림이 나오는 듯 하다. 일단 결론부터 요약하면, 매우 다양한 컨트롤러가 있는데 성능과 가격에 따라서 그 활용처가 달라지는 것이고, 개발자에게 제공하는 인터페이스 또한 각자 특색을 지니는 것 같다.

AVR하고 인텔I7 비교, 일단 pin수만 비교해도 어떤게 더 비싼넘인지 딱 나온다.


1. AVR

AVR 이나 PIC 같은 마이크로컨트롤러는 천원정도의 낮은 가격에 단순한 제어에 적합한 MCU(Micro Controller Unit)로서, 만약 휴머노이드를 만든다고 하면 팔다리의 반사신경이나 반복동작을 구현하는 데 적합한 것으로 보인다. 밥통, 냉장고 등 단순생활가전에 많이 사용되는 편임.


2. ARM

요넘은 AVR류보다 메모리용량이 크고, 속도도 빠르다고 한다. 요즘 MP3 player는 어떤지 모르겠지만, 한창 임베디드 리눅스나 CE계열 운영체제가 탑재되었던 MP3는 요넘을 썼다고 한다. 가격은 AVR에 10배정도 되는 것 같다.(물론 구매방식에 따라 다를 수 있겠지...)


3. PLC

Programmable Logical Unit의 약자로 위의 AVR, ARM같은 MCU에다가 추가적인 회로와 응용프로그램을 덧붙여서 만든 '프로세스 제어용 유닛'인듯... 특정한 제품형태를 지칭한다기 보다는 제어처리기의 일반명사이다. 요넘은 각 메이커 별로 고유의 Hardware, OS, Protocol, Programming Tool 등을 사용하기에 제조사가 바뀌면 그에 따른 학습이 필요하다.


4. PAC

한 마디로 PC를 사용한 PLC라고 할 수 있는데, Programmable Automation Controller라고 부르는 듯 하다. 위에 쓴 것처럼 PLC는 제조업체에 따라서 다른 특성을 지니고 있는데 반해, PC를 제어의 중심에 두면 Windows도 깔 수 있고... 로직을 다양한 언어로 작성할 수 있으며, 유연하게 확장할 수 있다는 장점이 생긴다. 하지만, Windows라는 말에서 느낄 수 있듯이(?) 안정성이 떨어지는 단점이 있다. 바이러스나 악성코드에도 취약하기 때문에 산업용 컨트롤 유닛으로는 부적합하다는 주장이 많은 듯...

그래도 대규모 기계나 공정프로세스를 운영할 때는 PC를 쓰나 AVR을 쓰나 제품의 가격 혹은 플랜트의 경제성에 미치는 영향이 크지 않으므로 날이 갈수록 용처가 많아지는 듯 함. 게다가 멀티코어 CPU가 많이 발달한 요즈음, 개별코어들을 활용해서 제어의 Safety를 backup하는 솔루션도 선보이는 것 같다.


한 풍력터빈 제어업체는 쿼드코어 CPU에서 각각의 코어를 컨트롤하기 때문에 한 넘이 죽어도 다른 넘들은 지장이 없도록 잘 해놓았다고 한다.

2012년 9월 13일 목요일

기계제어를 배울 수 있을까?

공장에 내려와서 제품에 대한 기계적, 전기적인 부분의 교육을 받다보니, 기계를 제어하는 방법을 공부하고 싶다는 생각이 든다. 이것저것 찾아보니 일단 임베디드(embeded) 분야를 통해서 저레벨언어를 통해 기계와 직접 대화를 하는 방법이 하나가 있는 것 같고, High level쪽으로 찾아보니 파이썬 스크립트로 로보틱스 제어가 가능한 듯하다.

AVR(낮은 수준의 CPU 같은 것) 모듈에 어릴 적 라디오 공작하던 전기회로 상식으로 LED깜빡이부터 만들어 가면서 배우는 것이 가장 탄탄한 공부가 되기는 하겠지만... Life is too short, I need python이다. 아마츄어가 취미로 접근하기에는 너무 많은 시간이 소요될 듯...

쉽게 접근할 수 있는 파이썬 쪽으로 찾아보니, Python Robotics : 파이로(Pyro)라는 것이 존재한다. 윈도우 환경에서 돌려볼 수 있는 것인지 뭔지, 아직 개념도 잡히지 않지만, 툴 소개를 천천히 읽어보니, 아이보, 룸바와 같은 상용화된 로보트들을 활용하고 저레벨지식(기계와 직접 의사소통하는 수준) 없이도 컨트롤 가능하다고 한다.(참고 : http://pyrorobotics.org/)



소니에서 만든 로봇멍뭉이 아이보(AIBO)


파이썬 쪽으로 Pyro말고 로봇프레임워크(http://code.google.com/p/robotframework/) 라는 것도 있던데, 전반적으로 개념이 없으니 찬찬히 둘러봐야 겠다. 사회에 발들이면서 죽였다고 생각한 나의 소중한 전공 '심리학'을 인공지능 같은 것으로 돌려서, 언젠가는 "눈에 보이는" 성과물을 만들어낼 수 있을까?

2012년 9월 3일 월요일

pymssql, py2exe 활용 DB 긁어오기

이번 포스팅을 위해서 블로그에 Syntax highlight를 적용하였다.
앞으로 코드를 올릴 때,
## 이 안에 코드텍스트를 그대로 붙여넣기만 하면,
Javascript가 적용되어, 가독성 좋은 코드가 펼쳐지게 된다.(참고 : http://isakaone.blogspot.kr/2011/11/bloggercom-syntax-highlight.html )

pymssql, py2exe 모듈은 아래의 링크에서 exe로 만들어진 배포본을
다운받아 윈도우에서 간편하게 설치가능하다.
(http://www.lfd.uci.edu/~gohlke/pythonlibs/#pymssql)

※ pymssql 구글코드(http://code.google.com/p/pymssql/)
※ py2exe 사용법 포스트(http://soooprmx.com/wp/archives/976)



import pymssql, time

with open('SQLfetcher.ini') as f:
    cfg = f.readlines()
    Provider = cfg[0].split('=')[1].strip()
    DataSource = cfg[1].split('=')[1].strip()
    InitialCatalog = cfg[2].split('=')[1].strip()
    UserId = cfg[3].split('=')[1].strip()
    Password = cfg[4].split('=')[1].strip()
    SQLscript = cfg[5].split(':')[1].strip()
    DelaySeconds = cfg[6].split('=')[1].strip()
    Sec = int(DelaySeconds)

print "Provider = " +Provider
print "DataSource = " +DataSource
print "InitialCatalog = " +InitialCatalog
print "UserId = " +UserId
print "Password = " +Password
print "SQLscript = " +SQLscript

loop = 1

while True:
    print '\nRunning count : ' + str(loop)

    con = pymssql.connect(host=DataSource,
                          user=UserId,
                          password=Password,
                          database=InitialCatalog)
    cur = con.cursor()
    cur.execute(SQLscript)

    filename = time.strftime("%Y%m%d-%H%M%S")
    dataset = cur.fetchall()

    output = open(filename + '.txt','w')
    for data in dataset:
        i = data[0]
        output.write(i + '\n')

    con.close()
    
    print 'And Waiting ' + DelaySeconds + ' seconds...'
    time.sleep(Sec)
    loop += 1


간단하게 mssql 서버에서 필요한 내용을 긁어오는 프로그램으로, 서버정보와 sql쿼리명령문은 ini파일에서 읽어오도록 하였고, 별도로 에러처리는 하지 않았다

Ini파일에서 SQLscript 를 분리해 낼 때, SQL문에 이퀄(=)이 들어갈 수 있음을 고려하지 않은 실수가 있었다. (=)->(:)으로 수정

파이썬코드를 exe로 변환하기 위해 같은 폴더에 setup.py를 만들고 아래의 코드를 적어넣었는데, 특이한 점은 추가되는 모듈에 pymssql만 넣으면 안되고, "_mssql", "decimal", "uuid"를 넣어주어야 한다는 것


from distutils.core import setup
import py2exe, sys
 
sys.argv.append("py2exe")
 
setup(console=["SQLfetcher.py"],
      options={
          "py2exe":{
              "packages" : ["pymssql", "_mssql", "decimal", "uuid",], 
              "bundle_files":1,
              "optimize":2,
              "dll_excludes": ["w9xpopen.exe"],
              }
          },
      zipfile = None
      )

이 포스트를 쓰기 전까지의 '나'는 다른 프로그래머들의 지적생산물을 소비하기만 해왔는데, 지금 이 포스트를 시작으로 내가 뭔가를 생산해내어 공유하는 것 같아 보람이 느껴지려고 한다. 물론 많이 미숙하긴 하지만...

2012년 8월 23일 목요일

플밍의 추억 - 처음으로 배포한 프로그램


 파이썬으로 프로그래밍의 세계에 한걸음, 한발짝씩 가까워지면서 가장 즐거웠던 것은 '말단사원이 해야하는 수 많은 노가다성 단순 반복작업'을 순식간에 해 치울 수 있다는 사실이었다. 지금도 프로그래밍, 더 나아가서는 'co-work을 위한 코딩개념'이 잡혀있지 않은 상태이지만, 처음 하는 프로그램의 소스코드는 너무도 가독성이 떨어졌던 것으로 기억한다.

2010년말에 후배의 노가다성 업무를 도와주기 위해, 급하게 몇 시간 두들겨서 만들었던 파이썬 프로그램이 첫 배포판 프로그램이었던 것 같다. (코드를 실행파일-exe-로 만들 때는 py2exe모듈을 활용하였다.) 울 회사가 바람을 다루는 회사인데, 후배가 매달 작성하는 보고서에 바람의 난류강도(Turbulence Intensity)가 필요했던 것... 안타깝게도 매 10분마다 측정된 바람데이터를 한 달마다 일일이 엑셀로 긁어와 어려운 계산을 하였었기에 절로 도와주고 싶은 마음이 들었다. 일회용 프로그램이긴 하지만, 코드도 document도 넘 미숙했던 것 같다.



첫 documentation (readme.txt) --------------------------


## Turbulence_Intensity_Calculater 매뉴얼

1.같은폴더 내에 있는 모든 csv파일을 읽어서 난류강도를 계산한 후, 그 결과를 result.csv로 생성합니다.
2.끝
3.제작자
   - 무슨무슨팀 누구누구(2010.12.2)
   ※ 참고로 처음으로 배포해보는 application임.