2012년 9월 22일 토요일

android를 좀더 빨리 빌드하는 방법

안드로이드는 build 시간이 상당히 오래걸리는 build 구조를 가지고 있다.

성능좋은 build server를 가지고 있어도 사람의 욕구상 좀 더 빠른 빌드를 하고싶은게 당연하다.

따라서 source.android.com에서는 ccache를 이용한 faster build 방법을 소개하고있다.


ccache는 자주 빌드되는 c파일들을 default로 로컬에 caching 해 놓고 사용하는 방식이다

build 하기 전에 아래와 같이 설정해주면 build 시 ccache를 사용하게 된다.


$ export USE_CCACHE=1
$ export CCACHE_DIR=~/.ccache
# android 소스 안에 이미 ccache 실행 파일이 들어있다. source의 root tree 에서 하면된다.
$ prebuilt/linux-x86/ccache/ccache -M 20G

ubuntu 12.04 버전에서 java6 깔기 (android 빌드환경 구성)

android build 를 하기위해  java6를 깔아야 한다. (정확히 sun-java6-jdk)

그러나 sun-java6가 ubuntu의 package에서 빠진지 한참된데다 이젠 아에 dependency까지 언급하면서 ppa에서도 안깔린다..ㅜㅜ

그래서 구글링으로 찾은결과..

github(https://github.com/flexiondotorg/oab-java6)에 공개된 script 발견~!

script를 사용하니 깔린다...(감격~~T^T)

아래대로 하면 된다.

$ wget https://raw.github.com/flexiondotorg/oab-java6/master/oab-java.sh
$ chmod a+x oab-java.sh
$ sudo ./oab-java.sh
$ sudo apt-get install sun-java6-jdk
# 아래 명령으로 default로 설정된 openjdk에서 sun-java6로 변경
$ sudo update-alternatives --config java

아래 명령으로 정상적으로 java가 바뀌었는지 확인

$ java -version
$ javac -version

2012년 9월 13일 목요일

SystemError: ../Objects/stringobject.c:4271: bad argument to internal function

android를 빌드하다 보면 아래와 같이 build error가 날때가 있다.

아래 build error는 zlib를 쓰는 python의 자체 에러로 이미 python issue tracker에 report 되어 있었다. (참조 : http://bugs.python.org/issue8571 )





Traceback (most recent call last):
  File "./build/tools/releasetools/img_from_target_files", line 234, in
    main(sys.argv[1:])
  File "./build/tools/releasetools/img_from_target_files", line 220, in main
    AddSystem(output_zip)
  File "./build/tools/releasetools/img_from_target_files", line 172, in AddSystem
    common.ZipWriteStr(output_zip, "system.img" + post_fs_type, data)
  File "/home/kyunam.jo/build/tools/releasetools/common.py", line 658, in ZipWriteStr
    zip.writestr(zinfo, data)
  File "/usr/lib/python2.6/zipfile.py", line 1106, in writestr
    bytes = co.compress(bytes) + co.flush()
SystemError: ../Objects/stringobject.c:4271: bad argument to internal function



아마 대부분 ubuntu 10.04 버전의 build server를 사용한다면 발생하는 에러로 이는 ubuntu 10.04에 default로 들어간 python의 버전이 2.6.5이기 때문이다. 

해당 버전은 2.6.5 버전 이후 2010년 5월 8일에 fix되어 반영됬으며 이는 아래 링크를 보면 확인 가능하다. 

2012년 9월 13일에 최신 버전인 2.6.8버전의 source code(http://www.python.org/download/releases/2.6.8/) 에서 확인결과 해당 patch가 반영되어 있음을 확인하였다. 

따라서 위와 같은 build error 가 발생할 경우 python을 최신으로 버전업하기 바란다.

그렇다고 python3으로 버전업은 조금 지양한다. (구문이 좀 달라진게 있으므로...^^)

2012년 8월 2일 목요일

jenkins 설치 및 upgrade


====== Jenkins Installation ======
- 서버에 패키지 키값을 추가한다.
$ wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
- source list에 jenkins의 주소를 추가한다.
$ sudo echo "deb http://pkg.jenkins-ci.org/debian binary/" > /etc/apt/sources.list.d/jenkins.list

위 코드로 추가가 안될시 위 폴더위치에 vim으로 새로 파일을 만들어서 추가시켜준다.

- 다음 아래와 같은 설치 작업을 진행한다.
$ sudo aptitude update
$ sudo aptitude install -y jenkins

- 이제 아파치와 젠킨스를 새로 시작해준다.
$ sudo /etc/init.d/apache2 restart
$ sudo /etc/init.d/jenkins restart

위와 같이 설치하면 default로 젠킨스가 설치완료된다.

====== Jenkins update ======
- 최신의 Jenkins를 다운 받는다(http://mirrors.jenkins-ci.org/war/latest/jenkins.war)
- 해당 파일을 기존에 설치된 jenkins.war 파일과 교체한다. 위에 설치 과정대로 작업을 진행했으면 /usr/share/jenkins 위치에 파일이 존재한다.
- apache2의 demon을 stop 후 jenkins를 restart한다. 그후 apache2를 start 해주면 된다.
- jenkins에 접속하여 버전을 확인한다.

====== 추가 설정 작업 ======
* 기존에 설정된 기본셋팅값을 변경할경우
* /etc/default/jenkins 여기에 파일의 값을 변경하면된다.( 예 포트번호 or 새로운 prefix 등)
* 위의 값을 변경하고 jenkins를 restart해준다.

===== plug-in =====
* Jenkins Active Directory plugin : https://wiki.jenkins-ci.org/display/JENKINS/Active+Directory+plugin
* Jenkins Parameterized Trigger plugin : https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Trigger+Plugin
* Jenkins GIT plugin : https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin
* Gerrit Trigger : https://wiki.jenkins-ci.org/display/JENKINS/Gerrit+Trigger
* Jenkins REPO plugin : https://wiki.jenkins-ci.org/display/JENKINS/Repo+Plugin
* LDAP Email Plugin : https://wiki.jenkins-ci.org/display/JENKINS/LDAP+Email+Plugin
* Jenkins SSH plugin : https://wiki.jenkins-ci.org/display/JENKINS/SSH+plugin
* Jenkins SSH Slaves plugin : https://wiki.jenkins-ci.org/display/JENKINS/SSH+Slaves+plugin

터보란 ?


[출처] http://www.navi4u.com/bbs/view.php?id=lecture&no=93
copyleft navi4u.com

둥굴레차의 효능


녹차와 함께 가장 널리 애용되는 차의 하나이다.
구수한 맛으로 인해 물처럼 마시는 경우도 많다.
둥굴레는 신선들이 먹는 음식이라 했을 만큼 좋은 향과 효능을 가지고 있다.
둥글레는 한방에서는 옥죽이라 불리는 약초로 음을 보하는 보약의 한 종류이다.
효능은 습한 성질이 있어 기관지나 폐, 인후가 건조하여 생기는 마른 기침을 없애주고, 음기를 보충하여 노인성 해수를 방지해 준다.
그리고 진액(몸안의 정상적인 체액)을 생성하게 함으로써 입안이 건조하여 갈증이 나는 것을 방지하고 위에 작용하여 공복감, 즉 허기를 많이 느끼는 것을 없애준다..그래서 다이어트에도 좋은 식품으로 알려져있다. 인삼과 달리 체질에 크게 상관없이 섭취할 수 있다.
한방의서에서는 "둥글레는 맛이 달고 성질은 차다(혹은 독이 없고 성질이 평하다). 그리고 폐와 비(소화기계통)로 들어가서, 위음을 돕고, 폐를 윤택하게 하고, 몸의 진액을 생기게 하고 위장을 도와주는 작용을 한다"고 적혀 있다
남녀를 불문하고 허약증상을 호소하면서 팔, 다리가 쑤신다거나 원인 모르게 식은땀과 열이 나며, 입안이 마르면서 갈증이 있고 소변을 붉게 보면서 시원함을 느끼지 못하는 경우에 둥굴레차를 꾸준히 복용하면 탁월한 효과를 볼 수 있다고 한다.

요즘엔 남성 정력, 피부미용, 노화방지, 변비 등에 좋다고 해서 많이들 이용하고 있다.

약리학적으로 둥글레는 혈압과 심장, 혈당에 주로 작용한다.
혈당이 높을 때 지속적으로 복용을 하면 혈당을 낮추는 작용을 한다.
둥글레는 허약체질, 폐결핵, 마른기침 그리고 당뇨병, 갈증, 그리고 심장을 튼튼하게 하여 심장쇠약, 협심증 등 심장질환이 있는 사람에게 좋다.
또 위로 들어가 위, 십이지장궤양이 있는 사람도 꾸준히 먹으면 속이 편안해짐을 느낄 수 있다.
식은땀과 원인 모르게 얼굴로 열이 오르면서 가슴이 답답하거나 수족에 열감이 있어 갑갑하게 느껴지는 사람, 노화방지에도 좋은 식품으로 볼 수 있다.

또 둥굴레는 고유의 성질과 효능이 강하기 때문에 옥수수나 보리 등과 함께 끓이는 것보다 하나만 끓여먹는 것이 맛과 효능을 더욱 살리는 비결입니다.^^

이상 둥굴레차에 대해 살펴보았습니다. 참고로 재배산보다는 야생 토종이 좋겠지요. 이중 사람들이 지리산 야생 것이 좋다고 하오니 '지리산둥굴레' 나 아님 다른 야생둥글레라도 구해 차로 끓여마셔서 건강을 챙겼으면 합니다.

Pywinauto

===== Installation =====
* Pydwinauto의 압축을 푼 경로에서 Python을 실행한다.
* 아래의 코드를 실행한다.
$ setpu.py install
* 아래의 Test Code를 돌려본다.
>>> from pywinauto import application
>>> app = application.Application.start("notepad.exe")
>>> app.notepad.TypeKeys("%FX")

===== Getting Start =====
* Syntax에 관련된 내용은 Pywinauto Documentation에 잘 기술되어 있다.
(그러나 잘 찾아보기 힘들게 되어있다. Documantation과 Googling을 적절히 복합적으로 활용해야한다.

* 주의 사항
* 실행되는 Application의 Control ID와 class등을 알고 있으면 code의 작성이 좀 더 수월해 진다.
* Windows Eng version과 Windows Kor version에 따라 달라진다.
* 창의 제목이 한글일경우 ** #-*-coding: utf-8 -*- ** 를 코드 맨 앞에 적용해준다.

dlg = app.YourDialogTitle
dlg = app.ChildWindow(title = "your title", classname = "your class", ...)
dlg = app['Your Dialog Title']

ctrl = dlg.YourControlTitle
ctrl = dlg.ChildWindow(title = "Your control", classname = "Button", ...)
ctrl = dlg["Your control"]

===== Example =====
* 아래 코드는 윈도우즈에 기본적으로 내장되어 있는 메모장(Notepad)를 컨트롤 하는 코드이다.

#-*-coding: utf-8 -*-
import time

from pywinauto import *


app = application.Application()
app.start_("Notepad.exe")
app[u'Notepad'].Wait('ready')

app[u'Notepad'].MenuSelect((u'파일(&F)->열기(&O)'))
open = app.window_(title_re =u"열기")

open['Edit'].TypeKeys(u'D:\\test.txt')
open['Edit'].TypeKeys(u'{ENTER}')

* 더 많은 코드는 pywinauto의 압축 파일 내에 example 폴더 안에 있다.

=====Reference=====
* [[http://code.google.com/p/pywinauto/|Pywinauto Official Site]]
* [[http://pywinauto.googlecode.com/hg/pywinauto/docs/contents.html|Pywinauto Documentation]]

2012년 8월 1일 수요일

python의 기본 자료 및 변수타입

Python은 동적으로 변수의 타입을 설정한다 따라서 기존 언어들 처럼 타입을 선언 할 필요가 없다.
[x:y] => x ≤ a < y
* 문자열 타입(String Type)
* **a.upper()** : 문자열 a의 모든 문자를 대문자로 바꾸어 준다.
* **a.lower()** : 문자열 a를 모두 소문자로 바꾸어 준다.
* **a.count(x)** : 문자열 a에서 x와 동일한 문자의 수를 반환한다.
* **a.find(x)** : 문자열 a에서 x와 동일한 문자가 처음 등장하는 위치를 반환, ** 없으면 -1을 반환 **
* **a.index(x)** : 문자열 a에서 x와 동일한 문자가 처음 등장하는 위치를 반환, ** 없으면 에러 **
* **a.join(s)** : s라는 문자열의 각각의 요소 문자사이에 문자열 a를 삽입한다.
* **a.lstrip()** : 왼쪽 공백 모두 제거
* **a.rstrip()** : 오른쪽 공백 모두 제거
* **a.strip()** : 양쪽 모든 공백 제거
* **a.replace(s, r)** : 문자열 a의 s라는 문자열을 r이라는 문자열로 변경한다.
* **a.split([s])** : 문자열 a를 공백으로 나누어 리스트값을 돌려준다.
* **a.swapcase()** : 문자열 a의 대문자는 소문자로, 소문자는 대문자로 각각 바꾸어 준다.


참고 - 여기서 a[1] = ['a', 'b', 'c']라고 하는 것과는 전혀 다른 결과값을 갖게
되므로 주의 하도록 하자. a[1] = ['a', 'b', 'c']는 리스트 a의 두 번째 요소를
['a', 'b', 'c']로 바꾼다는 말이고 a[1:2]는 a[1]에서 a[2]사이의 리스트를 ['a',
'b', 'c']로 바꾼다는 말이다. 따라서 a[1] = ['a', 'b', 'c']처럼 하면 위와는 달리
리스트 a가 [1, ['a', 'b', 'c'], 4]라는 값으로 변하게 된다.


**딕셔너리 함수**
* a.keys() 딕셔너리 a의 Key들을 모아놓은 리스트를 돌려준다.
* a.values()딕셔너리 a의 Value들을 모아놓은 리스트를 돌려준다.
* a.items() 딕셔너리 a의 (Key, Value)쌍의 터플을 모아놓은리스트를 돌려준다.
* a.clear() 딕셔너리 a의 모든 Key:Value 쌍들을 삭제한다.
* a.get(x) 딕셔너리 a의 Key가 x인 것의 Value를 돌려준다.
* a.has_key(x) 딕셔너리 a에 x라는 Key가 있는지 조사하여 참,거짓을 돌려준다.

**문자열 함수**
* a.upper() 문자열 a를 모두 대문자로 바꾸어 준다.
* a.count(x) 문자열 a중 x와 일치하는 것의 갯수를 반환한다.
* a.find(x) 문자열 a중 문자 x가 처음으로 나온 위치를 반환한다. 없으면 -1을 반환한다.
* a.index(x) 문자열 a중 문자 x가 처음으로 나온 위치를 반환한다. 없으면 에러를 발생시킨다.
* a.join(s) s라는 문자열의 각각의 요소 문자사이에 문자열 a를 삽입한다.
* a.lower() 문자열 a를 모두 소문자로 바꾸어 준다.
* a.lstrip() 문자열 a의 왼쪽 공백을 모두 지운다.
* a.rstrip() 문자열 a의 오른쪽 공백을 모두 지운다.
* a.strip() 문자열 a의 양쪽 공백을 모두 지운다.
* a.replace(s, r) 문자열 a의 s라는 문자열을 r이라는 문자열로 치환한다.
* a.split([s]) 문자열 a를 공백으로 나누어 리스트값을 돌려준다.
* a.swapcase() 문자열 a의 대문자는 소문자로, 소문자는 대문자로 각각 바꾸어 준다.

**리스트 함수**
* a.append(x) 리스트 a의 마지막에 x추가
* a.sort() 리스트 a를 정렬
* a.reverse() 리스트 a의 순서를 거꾸로 만든다.
* a.index(x) 리스트 a에서 x를 찾아서 그 위치 반환
* a.insert(i, x) 리스트 a에서 i 위치에 x 삽입
* a.remove(x) 리스트 a에서 처음 나오는 x 삭제
* a.pop()리스트 a의 맨 마지막 요소 반환하고 마지막 요소 삭제
* a.count(x) 리스트 a 안에 x가 몇 개 있는지를 반환
* a.extend(x) 리스트 a에 리스트 x를 더함(확장)

2012년 7월 31일 화요일

Ubuntu에 android-sdk 깔기


Android SDK란 android software development kit의 약자로서..

그냥 간단히 app을 짜는데 필요한 것이다. ^^

일딴 d.android.com으로 접속하여 sdk를 다운받는다.(linux용으로다가)
(link : http://developer.android.com/sdk/index.html )

자신이 사용할 폴더를 만들고 압축을 푼다.


$ wget http://dl.google.com/android/android-sdk_r20.0.1-linux.tgz

$ tar xzvf android-sdk_r20.0.1-linux.tgz



압축을 풀었다고 해서 끝난건 아니다.

압축을 풀면 android-sdk-linux라는 폴더가 생길것이다.
폴더로 들어가서 tools로 이동한다.

이동후 ./android 라고 실행해 준다.

여기서 주의해야 할점은 server 버전을 설치했을때 발생한다.
./android는 gui기반이므로 server전을 깔았을 경우 아래와 같이 실행한다.




$ ./android update sdk --no-ui




만약 adb를 실행하려고 하는데  "No such file or directory" 에러가 날경우




apt-get install ia32-libs



울 포쿱이의 휠과 타이어 스팩


Varrstoen - T GTR 18inch (Matt Black)
전륜 8.0J +42 =  8.7kg후륜 9.0J +41 =  9.1kg
NEXEN N9000 225/40R 18

연비 문제로 오늘 리맵핑~!

2010/11/27

내 애마 포르테 쿱이의 첫번째 다이노 그래프

2010/11/09

우분투 apm설치

일반적으로 설치순서는 Apache -> MySQL -> PHP 등으로 이루어 지게 됩니다.

* 설치

1.Apache
$ sudo apt-get install apache2
$ sudo apt-get install libapache2-mod-auth-mysql

2. MySQL
$ sudo apt-get install mysql-server mysql-client

3. php5
$ sudo apt-get install php5-common php5 libapache2-mod-php5
$ sudo apt-get install php5-mysql

참고 : http://mysql.com
http://apache.org
http://php.net

print server 설정


우분투 - samba


Samba는 윈도우즈와 리눅스간에 파일을 공유할 수 있는 방법을 제공하는 프로그램이다.
리눅스 서버를 두고, 여기에 여러대의 윈도우즈 클라이언트에서 리눅스 서버에 접근을 해서 마치 자신의 로컬 디스크를 사용하는 것 처럼 사용을 할 수 있도록 해준다는 것이다.

먼저 Samba를 설치한다.
$ sudo apt-get install samba smbfs

Ubuntu에서는 apt-get을 사용하여 설치하려는 프로그램, 또 그와 연관된 프로그램들을 다운로드 받아서 설치할 수 있다.

남은 부분은 Samba에 관한 설정 부분이다.
smb.conf 파일을 열어서 필요한 부분을 수정해주면 된다.
$ sudo vi /etc/samba/smb.conf

...
[global]
...
# 문자셋에 관련된 부분.. 윈도우즈에서 한글 깨짐 없이 볼 수 있음..
dos charset = cp949
display charset = UTF8
unix charset = UTF8
...

# 윈도우즈 탐색기에 출력할 컴퓨터 이름
# 기본적으로 제공되는 녀석을 사용한다. 이후에 보게 될 테지만, 디폴트로 사용하면 리눅스 서버의 이름으로 공유
# 폴더를 열 수 있다.
server string = %h server (Samba, Ubuntu)

# 사용자 계정 등 설정
security = share
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
...

# 윈도우즈에서 나타나게될 samba 공유 폴더
#============================ Share Definitions ============================

[home]
comment = Home Directories
browseable = no
writable = yes

smb.conf 파일의 수정을 마쳤으면, smaba 서버를 재실행하자.
$ sudo /etc/init.d/samba restart

우분투 telet, ftp, ssh 설치


1. Telnet 설치하기

- Telnet 설치


$ sudo apt-get install xinetd

$ sudo apt-get install telnetd


- telnet 설정파일 (xinetd 설정 추가)


$ sudo vi /etc/xinetd.conf (아래 내용을 추가한다.)



service telnet

{

     disable = no

     flags = REUSE

     socket_type = stream

     wait = no

     user = root

     server = /usr/sbin/in.telnetd

     log_on_failure += USERID

}


- xinetd 데몬 재구동

$ sudo /etc/init.d/xinetd restart



2. FTP 설치하기

- vsftpd 설치

$ sudo apt-get install vsftpd



- vsftpd.conf 파일 수정

$ vi /etc/vsftpd.conf

#anonymous_enable=NO

#local_enable=YES  의 주석 삭제

#write_enable=YES 의 주석 삭제



- FTP 데몬 재구동

$ sudo /etc/init.d/vsftpd restart



3. SSH 설치하기

- ssh 설치

$ sudo apt-get install ssh

# 우분투 시냅틱 패키지 관리자에서 SSH를 설치하면 openssh-server와 ssh 가 함께 설치된다.



- ssh 설정파일

$ sudo vi /etc/ssh/sshd_config


- ssh 데몬 재구동

$ sudo /etc/init.d/ssh restart



4. 서버 작동 확인

$ netstat -ntl

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State

tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN

tcp        0      0 0.0.0.0:23              0.0.0.0:*               LISTEN

tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN

tcp6       0      0 :::22                   :::*                    LISTEN



Port 21 : FTP
Port 22 : Telnet
Port 23 : SSH
[출처] http://citylock.tistory.com/73

git version upgrade 방법

Ubuntu에서 apt-get을 통해 설치되는 git 버전은 최신버전이 아니기 때문에 최신 버전을 설치하려면 아래와 같은 작업을 해주어야 한다.
(예 : 10.04.4에서는 git 1.7.0.1(?)버전이 설치 되었다 )

먼저 git source를 가지고 와야 하기 때문에 git-core를 설치한다.

$ sudo apt-get install git-core

이후 git source를 받아 complie를 진행한다.

$ git clone git://github.com/git/git ./git

$ make configure
# --prefix=/usr 옵션을 삭제할경우 /usr/local/bin에 git이 설치된다.
# --prefix=/usr 옵션을 넣으면 /usr/bin에 설치된다.
$ ./configure --prefix=/usr
$ sudo make install install-doc install-html


** 아래의 경우 complie error가 발생할경우 다음과 같이 처리한다.

- autoconf 가 없다고 나오면

$ sudo apt-get install autoconf


- curl-config 가 없다고 나오면

$ sudo apt-get install libcurl4-openssl-dev


- "tclsh failed; using unoptimized loading" 에러가 나면

$ sudo apt-get install gettext

ubuntu 에 java6 깔기

ubuntu 10.04 버전 부터는 openjava를 사용하게 recommand 되었나보다.. sun-java6-jdk가 안깔린다..

android 에서는 sun의 java를 권장하는데....음...

따라서 열 구글링을 하다 발견한 tip~!

PPA repo를 이용하여 sun-java6-jdk를 설치하는 방법~!

$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:sun-java-community-team/sun-java6
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk
$ sudo update-java-alternatives -s java-6-sun

 [출처]http://blog.dasomoli.org/364

2012년 7월 26일 목요일

리눅스에서 해당 processor의 갯수를 알아보는 방법

리눅스는 자신의 하드웨어 정보를 파일로 저장한다.

해당 파일은 /proc/ 안에 있으며

그중 하나가 cpuinfo라는 파일이다.

이 파일을 cat으로 열어보면 상당히 자세히 정리되어있다..

이중 android build system이 사용하는 GNU make에서 j옵션을 사용하기위해 processor 갯수를 알아볼 필요가 있었다

따라서 몇몇 방법이 있는데 그중 몇가지를 기록하고자 한다.
1. cpuinfo라는 파일의 processor 갯수를 알아낸다.
cat /proc/cpuinfo | grep process | wc -l
2. 미리 predefine 된 processor 값을 읽어오는것
getconf  _NPROCESSORS_CONF

블로그를 시작했습니다

요즘들어 자주자주 망각을....
이제부터 조금씩이나마 글로 남겨야겠다 ^^