2012년 12월 4일 화요일

회사 로고!

이번에 창업지원단에서 무료지원사업으로 만들어준 회사 BI,CI디자인
심플하니 마음에 들어 좋다

2012년 12월 3일 월요일

REST 구현

자체개발건을 진행하면서 REST구현때문에 고민하다가 발견한 자료
예전엔 그냥 따라하기로 뭔지도 모르고 구현했는데
이번에 제대로 공부하게 된듯 하다.

근데 제대로 공부한거 맞나...;;;

찾은 사이트는 여기!!!




ubuntu에서 apache2, tomcat연동

이건 할때마다 기억도 안나고 햇갈린다.
그래서 오늘도 퍼담아 둔다

퍼온곳은 요기
http://bs-secretroom.blogspot.kr/2012/08/ubuntu-os-apache2-tomcat6.html


우분투 Ubuntu OS 에서 apache2 tomcat6 연동하기

우분투 Ubuntu OS 에서 패키지 설치를 위해 제공해 주는
apt-get 명령어를 이용한 패키지 설치 및
상호간 연동 방법이다.
이미 나와 있는 방법들을 통해서 많이들 아는
apache2 의 80번 포트로 접속해서 jsp 파일을 띄우는 것이다.

tomcat6 가 실행되기 위해서 우선적으로 java-jdk 가 설치되어야 한다.
또한 웹 서비스를 실행하기 위해 apache2 를 설치한다.

$ sudo apt-get install openjdk-6-jdk
$ sudo apt-get install apache2 tomcat6

apache2 와 tomcat6 가 서로 연결하기 위해 추가 패키지
libapache2-mod-jk 를 설치한다.

$ sudo apt-get install libapache2-mod-jk

libapache2-mod-jk 를 설치하면서 생성된 디렉토리에서 파일 하나를 복사해서 수정한다.

$ cp /etc/libapache2-mod-jk/workers.properties /etc/apache2/
$ sudo vi /etc/apache2/workers.properties

# 우분투 12.04 server 32bit 버전 기준으로,
# openjdk-6-jdk 를 설치했을 때의
# JAVA_HOME=/usr/lib/jvm/java-6-openjdk-i386/
# JAVA_HOME 위치는 변경될 수 있으니 /usr/lib/jvm 등의 위치를 통해 분명히 확인해 두자.

$ sudo vi /etc/default/tomcat6
JAVA_HOME=/usr/lib/jvm/java-6-openjdk-i386/

vi /etc/apache2/workers.properties
이하에 나오는 내용은 파일 내 이미 있는 내용을 수정한 것이다.
내용 추가 및 수정 내용
woeker.java_home=/usr/lib/jvm/java-6-openjdk-i386/
worker.list=jspstudy
worker.jspstudy.port=8009
worker.jspstudy.host=localhost
worker.jspstudy.type=ajp13
worker.jspstudy.lbfactor=20
파일 내용 추가 및 수정 끝

$ sudo vi /etc/apache2/apache2.conf
libapache2-mod-jk 를 설치한 모듈 관련 설정을 추가해 준다.
이하 내용을 추가한다.
내용 추가 및 수정 내용
<IfModule jk_module>
JkWorkersFile /etc/apache2/workers.properties - 위에서 복사한 workers 파일 위치 지정
JkLogFile /var/log/apache2/mod_jk.log
JkShmFile /var/log/apache2/mod_jk.shm
</IfModule>
파일 내용 추가 및 수정 끝

apache2 에서는 각 웹사이트 마다 설정 파일을 따로 만들 수 있다.
기본으로 제공하는 파일을 복사해서 tomcat 연동을 위한 파일 수정을 한다.
$ sudo cp /etc/apache2/site-available/default /etc/apache2/site-available/add-tomcat
$ sudo vi /etc/apache2/site-available/add-tomcat
이 파일 역시 파일 내 있는 정보를 수정하거나 내용을 추가한다.
내용 추가 및 수정 내용
Servername jspstudy.org
DocumentRoot /srv/web/jspstudy - 위치는 개별적으로 지정한 위치를 기억하고서 지정한다.
<Directory /srv/web/jspstudy/>
   Options FollowSymLinks
   AllowOverride None
   Order allow,deny
   Allow from all
</Directory>
JkMount /*.jsp jspstudy - jspstudy 는 위에서 언급한 workers.list 이름이다.
파일 내용 추가 및 수정 끝

이제 tomcat6 에서의 파일을 수정해준다.

$ sudo vi /etc/tomcat6/server.xml

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
위 부분의 앞뒤로 <!--, --> 이렇게 주석처리가 되어 있다.
웹사이트에서의 주석처리하는 부분인데 이 주석 부분을 삭제해서
위 내용이 나오도록 한다.

이제 각 서비스를 재시작한 후 정상적으로 올라오는지 확인해 본다.

$ sudo /etc/init.d/tomcat6 restart
$ sudo /etc/init.d/apache2 restart

웹사이트에서 접속해 본다.
http://localhost - 기본적인 apache2 서비스
http://localhost:8080 - 기본적인 tomcat6 서비스

이제 연동이 끝났으니
http://localhost/hello.jsp 파일이 정상적으로 올라오면 성공이다.

hello.jsp 파일 내용

<%@ page import="java.util.*" %>
<%@ page import="java.util.Date" %>

<html>
<body>
        <% out.print("Hello JSP"); %><br>

        <% Date toDay = new Date(); %><br>
        <%= toDay %>

</body>
</html>

여기서 toDay 부분은 서비스를 제공해주는 서버의 현재 시간이다.
이부분이 정상적으로 나오면 tomcat 서비스가 정상적인 것이다.



tomcat6 만 이용해서 80 포트 접속을 통한 서비스 시작하기
apache2 와 연동하는 주 목적은 80 포트를 이용하기 위함이다.
구글링을 하다가 아주 빠르고 간편하게 80 포트를 접속하는 방법을 찾아서 첨부한다.
$ sudo vi /etc/default/tomcat6

AUTHBIND=yes
파일 하단부에 보면 # 주석처리 되어 있다.

$ sudo vi /etc/tomcat6/server.xml
    <Connector port="80"
               protocol="HTTP/1.1"
               connectionTimeout="20000"
               URIEncoding="UTF-8"
               redirectPort="8443" />
기본값은 Connector port 가 8080 이다.

$ sudo /etc/init.d/tomcat6 restart

위에서 했던 작업이 허무할 정도로 간단하다;;;

참고로 tomcat6 메인 위치를 변경하고자 한다면
$ sudo vi /etc/tomcat6/server.xml

<Host...
로 시작하는 부분에서
appBase="[원하는 디렉토리]"

를 추가해 주자

참고 URL
http://wonchanlee.tumblr.com/post/6969537049/tomcat6-80-port-binding-on-ubuntu

2012년 11월 14일 수요일

Android google map debug key for windows7

대부분 windows xp 환경에서 설명되어 있는데
windows7도 크게 다르지 않지만 경로등이 조금 다르다.
JAVA버전에 따라 keytool 명령어도 옵션을 추가해 주어야 한다.

먼저 keytool로 debug.keystore에서  키값을 받아야 하는데...
debug.keysotre위치 -> c:\user\user-name\.android\ 아래 있음(windows7)
keytool은 JDk설치 폴더 아래 bin아래

c:\user\user-name\.android\keytool -list -v -keystore debug.keystore
위 처럼 실행하면 전체 키 값을 볼 수 있다.

실행하면 비번을 입력하라고 나오는데 개발용 암호는 android로 고정되어 있다.
실행 결과는 아래와 같다.

키 저장소 비밀번호 입력:

키 저장소 유형: JKS

키 저장소 제공자: SUN

키 저장소에 1개의 항목이 포함되어 있습니다.


별칭 이름: androiddebugkey

생성 날짜: 2012. 11. 12
항목 유형: PrivateKeyEntry
인증서 체인 길이: 1
인증서[1]:
소유자: CN=Android Debug, O=Android, C=US
발행자: CN=Android Debug, O=Android, C=US
일련 번호: 1826273a
적합한 시작 날짜: Mon Nov 12 14:23:21 KST 2012, 종료 날짜: Wed Nov 05 14:23:21 K
ST 2042
인증서 지문:
         MD5: 5C:14:C7:FB:0A:72:CF:EE:40:8E:AA:CB:0F:16:B5:39
         SHA1: F2:3E:AE:0E:DD:ED:02:73:8F:C1:59:D0:8C:C8:88:D4:5D:D8:12:A6
         SHA256: 39:92:D4:56:A0:93:87:EF:44:88:E7:D0:88:E2:0D:98:99:AD:3A:B9:F0:
EE:06:29:82:0F:77:53:32:E0:C9:5A
         서명 알고리즘 이름: SHA256withRSA
         버전: 3

확장:


#1: ObjectId: 2.5.29.14 Criticality=false

SubjectKeyIdentifier [
KeyIdentifier [
0000: 59 67 6F 63 F6 DE EF 40   54 5C 7D D8 F8 13 15 30  Ygoc...@T\.....0
0010: 5D 6D 66 09                                        ]mf.
]
]

여기까지 실행후 아래 사이트로 가서 저 실행 결과 값의 MD5값을 입력하고 키 발급받기 클릭!
https://developers.google.com/maps/documentation/android/maps-api-signup
그러면 사용자 키와 더불어 친절하게 xml예제도 짧게 보여준다.

그런데 이거 언제부터 한글로 나왔었지...전엔 영문밖에 없었던듯 한데...


2012년 11월 2일 금요일

Microsoft BizSpark

MS에서 신생 IT기업을 지원하는 프로그램이다.
설립 3년미만, 연매출 100만달러 미만인 업체는 누구나 지원가능 하다.

지원받게 되면 MS에서 판매하는 대부분의 소프트웨어를
3년간 무상으로 이용가능한 프로그램이다.
자세한건 링크가서 확인
http://www.microsoft.com/bizspark/Default.aspx

이번에 사업자 내면서 신청해서 윈7 정품으로 설치!

2012년 8월 20일 월요일

2012.08.20 잡설~

지원사업 통과되어 진행 해야 하고

그 덕분에 없던 인력이 추가될 예정이라
사무실 확장과 앞으로 애들 월급 걱정

지원사업 받아서 하는 프로젝트 진행에
먹고 살기 위해 외주 영업도 해야하고

역시 일은 한번에 몰려 오나보다 ㅎ

2012년 8월 1일 수요일

2012년 8월 첫날 주저리

오랜만에 블로그 관리좀 하려고 들어 왔더니
내 블로그 우측 광고가 삼숭 겔3이다.

난 개인적으로 삼성을 좋아 하지 않는다.
정확히 말하면 싫어 한다.

특히나 내가 소프트워어 개발자이다보니
그네들의 방식을 더더욱 싫어 한다.

하드웨어 제조 능력은 인정한다.
하지만 하드웨어서 발생한 문제는 하드웨어로 해결 해야지
그걸 소프트웨어로 커버하고 눈가리고 아옹해서는 안된다고 생각한다.

그런 의미에서 그냥 하드웨어 제조나 하시고
소프트웨어는 제발 손 안댓으면 좋겠다.

그나저나...내 블로그에 저 광고 내 맘대로 변경하는 방법좀...ㅠㅠ

2012년 6월 11일 월요일

APK 디컴파일 방법.



오늘은 Android 최종 package 형태인 apk 파일에 대해서 Decompile 하는 방법을 소개 하겠습니다.
최종 APK 파일이 나오기 까지는 아래 그림처럼 많은 단계를 거칩니다.
대충 간단하게 정리해보면 리소스 파일들과 java 컴파일된 dex 파일 그리고 signature 정보가 들어가게 됩니다.
여튼 자세한 정보는 여기를 참고 하시고… http://developer.android.com/guide/developing/building/index.html

우리가 열심히 개발한 소스는 classes.dex 라는 파일 안에 들어가게 되는데.. 이 dex 파일을 풀면 class 파일들이 나옵니다.
이 class 파일을.. decompile 하면 소스 코드가 보이는 것이죠..

이런 코드가

이렇게까지 디컴파일 됩니다.

그럼 자세한 decompile 순서를 알아보겠습니다.

  • Apk 파일을 압축을 풉니다.
알집을 사용해도 되고.. 간단하게 jar xf hello.apk 하면 apk 파일이 풀립니다.
위 그림처럼 android manifest파일과 사용한 resource들 그리고 classes.dex 파일과 META-INF의 signature 정보들이 보입니다.

  • Dex를 jar로 변환합니다.
Classes.dex 파일은 android의 dalvik 에서 사용하기 위한 일종의 jar 패키지 형태인데.. 이를 다시 jar로 변환이 가능합니다.
여기에서 간단히 쓸 수 있는 변환툴을 다운로드 할 수 있다.
실행해보면
Jarfile이 하나 생긴 것을 알 수 있다.

  • Jar를 class로 압축을 풀어줍니다.
다시 jar xf classed_dex2jar.jar 하면 압축이 풀리면서.. class 파일들이 나온다.

Class 파일은 아시다시피 중간 바이너리 형태라 디컴파일이 가능하다.

  • Class 파일을 디컴파일 하여 보는 툴을 사용하여 소스를 본다.
소스를 보기위해.. jd 라는 툴을 사용하면 된다.
http://java.decompiler.free.fr/?q=jdgui 여기서 다운 받을수 있다.

다운받아 간단히 실행하여 class 파일을 열어보면 소스가 나온다..

정말 무서운 세상이다…

NDK addr2line 사용방법

FFmpeg프로젝트 중에 계속해서 build fingerprint 라는 알수없는 로그가 발생하면서
실행중인 앱이 죽어 버리는 증상이 발생하고 있다.

뭔가 알아 볼수 없는 주소값인건 알겠는데 어찌 읽어야 하나 방법을 찾다가 발견했다.

아래와 같이 로그가 발생 했다면

06-11 13:27:17.275: I/DEBUG(1435): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
06-11 13:27:17.275: I/DEBUG(1435): Build fingerprint: 'generic/broadcom_cmp/cmp/:2.2/FRF91/132:jp/release'
06-11 13:27:17.275: I/DEBUG(1435): pid: 9504, tid: 9504  >>> net.jbong.FFmpegBasic <<<
06-11 13:27:17.275: I/DEBUG(1435): signal 11 (SIGSEGV), fault addr 00000008
06-11 13:27:17.275: I/DEBUG(1435):  r0 00000000  r1 bef68370  r2 00000000  r3 00000001
06-11 13:27:17.275: I/DEBUG(1435):  r4 00000000  r5 bef68370  r6 00000c60  r7 81a50e20
06-11 13:27:17.275: I/DEBUG(1435):  r8 00000680  r9 4410eac8  10 4410eab4  fp 452090f4
06-11 13:27:17.275: I/DEBUG(1435):  ip 00000003  sp bef68370  lr 810b6624  pc 810b65dc  cpsr 60000010
06-11 13:27:17.425: I/DEBUG(1435):          #00  pc 000b65dc  /data/data/net.jbong.FFmpegBasic/lib/libbasicplayer.so
이하 생략


arm-linux-androideabi-addr2line.exe -f -e libbasicplayer.so 000b65dc
위와 같이 실행하면
다음과 같은 결과를 출력한다.

av_interleave_packet
D:\workspace2\FFmpegBasic/jni/ffmpeg/libavformat/utils.c:3239

위처럼 실행할때 so파일은 libs폴더가 아니고 obj/local/armeabi 아래 있는 파일을 사용해야 한다.

이제 어디가 문제인지 찾았으니 수정을 해야겠다.

2012년 6월 1일 금요일

Android - ndk-gdb

AndroidManifest.xml

<application
        android:icon="@drawable/showplay_launcher"
        android:label="@string/app_name" android:debuggable="true">
...
debuggable 확인

하지만 현재 작업중인 ffmpeg에서는 뭔가가 때문에 저렇게 하고 ndk-build하면
에러 나면서 정상진행 되지 않는다.
뭐가 문제 일까...

Android - view call stack of crashed application on android


출처 : http://rxwen.blogspot.com/2011/01/resolve-stack-trace-of-crashed.html

view call stack of crashed application on android

On android, when a process crashes in native code, the call stack of the process will be saved to a log file in /data/tombstomes/, and written to logcat as well. The information is helpful for debugging.
Unfortunately, the call stack doesn't show in human readable format, file name, function name. Instead, it's shown as module name (e.g., libc.so) and memory address of the instruction. We can use addr2line to translate the address to corresponding file name and function name if we have the binary of the module that contains symbol information.
To make it easier to use, this function is included in agdbtool (see here for more). We can use "agdb.py -r -e module_name address" to find out the function name of specified address within the module.

When we have a long call stack, instead of running the command above for each line in the call stack manually, we can feed the whole call stack to agdb through pipe and get the full resolved call stack. For example, use  "adb logcat | agdb.py -r"command for adb logcat output with below contents:

22 F/ASessionDescription(   33): frameworks/base/media/libstagefright/rtsp/ASessionDescription.cpp:264 CHECK_GT( end,s) failed:  vs.
23 I/DEBUG   (   30): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
24 I/DEBUG   (   30): Build fingerprint: 'generic/generic/generic:2.3.1/GINGERBREAD/eng.raymond.20101222.130550:eng/test-keys'
25 I/DEBUG   (   30): pid: 33, tid: 450  >>> /system/bin/mediaserver <<<
26 I/DEBUG   (   30): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
27 I/DEBUG   (   30):  r0 deadbaad  r1 0000000c  r2 00000027  r3 00000000
28 I/DEBUG   (   30):  r4 00000080  r5 afd46668  r6 40806c10  r7 00000000
29 I/DEBUG   (   30):  r8 8031db1d  r9 0000fae0  10 00100000  fp 00000001
30 I/DEBUG   (   30):  ip ffffffff  sp 40806778  lr afd19375  pc afd15ef0  cpsr 00000030
31 I/DEBUG   (   30):          #00  pc 00015ef0  /system/lib/libc.so
32 I/DEBUG   (   30):          #01  pc 00001440  /system/lib/liblog.so
33 I/DEBUG   (   30):
34 I/DEBUG   (   30): code around pc:
35 I/DEBUG   (   30): afd15ed0 68241c23 d1fb2c00 68dae027 d0042a00
36 I/DEBUG   (   30): afd15ee0 20014d18 6028447d 48174790 24802227
37 I/DEBUG   (   30): afd15ef0 f7f57002 2106eb56 ec92f7f6 0563aa01
38 I/DEBUG   (   30): afd15f00 60932100 91016051 1c112006 e818f7f6
39 I/DEBUG   (   30): afd15f10 2200a905 f7f62002 f7f5e824 2106eb42
40 I/DEBUG   (   30):
41 I/DEBUG   (   30): code around lr:
42 I/DEBUG   (   30): afd19354 b0834a0d 589c447b 26009001 686768a5
43 I/DEBUG   (   30): afd19364 220ce008 2b005eab 1c28d003 47889901
44 I/DEBUG   (   30): afd19374 35544306 d5f43f01 2c006824 b003d1ee
45 I/DEBUG   (   30): afd19384 bdf01c30 000281a8 ffffff88 1c0fb5f0
46 I/DEBUG   (   30): afd19394 43551c3d a904b087 1c16ac01 604d9004
47 I/DEBUG   (   30):
48 I/DEBUG   (   30): stack:
49 ........................
92 I/DEBUG   (   30):     408067e4  6f697470
93 I/BootReceiver(   75): Copying /data/tombstones/tombstone_09 to DropBox (SYSTEM_TOMBSTONE)

we get:


22 F/ASessionDescription(   33): frameworks/base/media/libstagefright/rtsp/ASessionDescription.cpp:264 CHECK_GT( end,s) failed:  vs.
23 I/DEBUG   (   30): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
24 I/DEBUG   (   30): Build fingerprint: 'generic/generic/generic:2.3.1/GINGERBREAD/eng.raymond.20101222.130550:eng/test-keys'
25 I/DEBUG   (   30): pid: 33, tid: 450  >>> /system/bin/mediaserver <<<
26 I/DEBUG   (   30): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
27 I/DEBUG   (   30):  r0 deadbaad  r1 0000000c  r2 00000027  r3 00000000
28 I/DEBUG   (   30):  r4 00000080  r5 afd46668  r6 40806c10  r7 00000000
29 I/DEBUG   (   30):  r8 8031db1d  r9 0000fae0  10 00100000  fp 00000001
30 I/DEBUG   (   30):  ip ffffffff  sp 40806778  lr afd19375  pc afd15ef0  cpsr 00000030
31 I/DEBUG   (   30):          #00  pc 00015ef0  /system/lib/libc.so
32 I/DEBUG   (   30):          #00  __libc_android_abort: abort.c:82
33 I/DEBUG   (   30):          #01  pc 00001440  /system/lib/liblog.so
34 I/DEBUG   (   30):          #01  __android_log_assert: logd_write.c:235
35 I/DEBUG   (   30):
36 I/DEBUG   (   30): code around pc:
37 I/DEBUG   (   30): afd15ed0 68241c23 d1fb2c00 68dae027 d0042a00
38 I/DEBUG   (   30): afd15ee0 20014d18 6028447d 48174790 24802227
39 I/DEBUG   (   30): afd15ef0 f7f57002 2106eb56 ec92f7f6 0563aa01

Similarly, we can use "echo tombstone_01.txt | agdb.py -r" command to resolve call stack addresses in a tombstone log file.

2012년 5월 2일 수요일

ffmpeg에 libx264추가 하기


x264 다운로드
  - 사이트: http://www.videolan.org/developers/x264.html
  - 다운로드
    $ git clone git://git.videolan.org/x264.git
    (우분투에서 git 없으면 apt-get install git 하면 될듯..)

x264 빌드
  - 다운받은 디렉토리로 이동하고 아래 명령 실행.
   $ ./configure --host=arm-linux --cross-prefix=arm-linux-androideabi- --enable-shared --enable-static --prefix=/opt/android-8-toolchain/sysroot/usr
   $ make
   $ make install
   (--prefix 는 안드로이드 툴체인이 있는 곳으로 설정해야하며, 하지 않을 경우 make install 시 /usr/local/include 와 /usr/local/lib에 header와 library가 위치해서 ffmpeg 빌드시에 libx264 header와 library를 찾지 못함)
  
테스트는 안해봤지만 빌드는 잘됨.

2012년 4월 6일 금요일

Android 소스 받기

일단...안드로이드 사이트에 잘 정리 되어 있다.
http://source.android.com/source/downloading.html




  • Make sure you have a bin/ directory in your home directory, and that it is included in your path:
    $ mkdir ~/bin
    $ PATH=~/bin:$PATH
    
  • Download the Repo script and ensure it is executable:
    $ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
    $ chmod a+x ~/bin/repo


  • 이하는 생략....

    아래 명령어 실행에서 에러가 나는 경우가 있다.

    repo init -u https://android.googlesource.com/platform/manifest


    git가 설치 되지 않아서 발생하는 문제이다.

    sudo apt-get install git 로 git 설치후 문제 해결!




















    2012년 4월 3일 화요일

    우분투 서버 초기 설정

    1. 고정IP 설정
    sudo vi /etc/network/interfaces
    ----------------------------------------------------------------------------------
    # and how to activate them. For more information, see interfaces(5).

    # The loopback network interface
    auto lo
    iface lo inet loopback

    # The primary network interface
    auto eth0
    #iface eth0 inet dhcp
    iface eth0 inet static
    address 192.168.0.71
    gateway 192.168.0.1
    netmask 255.255.255.0
    dns-nameservers 168.126.63.1 168.126.63.2
    ----------------------------------------------------------------------------------

    아래 실행하여 변경 내용 반영
    sudo /etc/init.d/networking restart

    2. SSH설정
    sudo apt-get install openssh-server
    sudo /etc/init.d/ssh restart
    sudo vi /etc/hosts.allow

    ----------------------------------------------------------------------------------
    #                   See the manual pages hosts_access(5) and hosts_options(5).
    #
    # Example:    ALL: LOCAL @some_netgroup
    #             ALL: .foobar.edu EXCEPT terminalserver.foobar.edu
    #
    # If you're going to protect the portmapper use the name "portmap" for the
    # daemon name. Remember that you can only use the keyword "ALL" and IP
    # addresses (NOT host or domain names) for the portmapper, as well as for
    # rpc.mountd (the NFS mount daemon). See portmap(8) and rpc.mountd(8)
    # for further information.
    #
    sshd 192.168.0.2

    ----------------------------------------------------------------------------------

    3. ssh툴에서 언어 UTF-8로 변경


    4. sudo apt-get install mysql-server

    5. sudo vi /etc/mysql/my.cnf
    bind address 찾아 주석 처리

    6. FTP설정
    sudo apt-get install vsftp

    필요한 옵션 편집
    sudo vi /etc/vsftpd.conf
    local_eable=YES

    서비스 재시작
    sudo /etc/init.d/vsftpd restart

    2012년 3월 26일 월요일

    PC수리 관련한 설문.

    제 블로그에 얼마나 많은 분들이 오시는지는 모르겟지만...

    제목처럼 PC수리 관련한 설문을 진행 중입니다.
    아래 링크 클릭 하시면 9문항 짜리 간단한 설문이 나옵니다.
    https://docs.google.com/spreadsheet/viewform?formkey=dHdKVzNMR3U5eW9LUFRrY3NpaEVNNVE6MQ

    어려운것도 없고 대부분 그냥 찍으시면 되는 질문들입니다.
    부디 잠시만 시간내셔서 참여 부탁 드립니다.

    2012년 3월 25일 일요일

    예천 회룡포

    지난 17일날 다녀온 회룡포 회룡대에서 바라본 모습
    비가 좀 내린 뒤에 갔으면 더 좋았으려나?
    아니면 원래 강이 저정도 였을까?

    2012년 3월 24일 토요일

    Android NDK + ffmpeg

    시간내서 정리하여 올려야할 자료중에 하나 NDK 그리고 ffmpeg...

    Android NDK와 ffmpeg은 각각 사이트에서 받고...

    아래 내용은 Windows + cygwin 에서 ndk 셋팅하고 ffmpeg빌드해서 테스트 하는데 까지 과정을 시간되는대로 조금씩 올릴 예정이다.
    (정리를 좀 해놔야 나중에 써먹던 버리던 ㅠㅠ)

    0. Cygwin 설치할때 development등 몇몇 옵션에 필요 한것들 추가해서 설치 되도록 한다.

    1. ndk 압축 해제후에 다음 명령어 실행하여 toolchain 설치 할것
    $ /cygdrive/c/android-ndk-r5b/build/tools/make-standalone-toolchain.sh --platform=android-8 --install-dir=/cygdrive/c/my-android-toolchain
    경로는 약간씩 바뀔거고... 명령어 실행했는데 에러나면서 안되는 경우는 대부분 뒤쪽에 옵션 문제이다.
    에러 메시지 잘 보고 옵션 변경 해 가면서 설치 할것.

    Tomcat, Log4J 간단 사용법.


    먼저 log4.properties 파일...
    저장 위치는 WEB-INF/classes/log4j.properties
    저~ 아래 jar 파일은  WEB-INF/lib/

    # Log4j Setting file
    log4j.rootLogger=INFO, console
    # Daily file log
    log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
    #log4j.appender.logfile.File=G:/Apache_Tomcat/webapps/MusicalServer/MusicalServer.log
    #log4j.appender.logfile.File=${catalina.home}/logs/musical.log
    log4j.appender.logfile.File=/home/scuser/public_html/MusicalServer/Musical.log
    log4j.appender.logfile.DatePattern='.'yyyy-MM-dd
    log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
    log4j.appender.logfile.layout.ConversionPattern=[%d{HH:mm:ss}][%-5p](%F:%L) - %m%n
    # Console log
    log4j.appender.console=org.apache.log4j.ConsoleAppender
    log4j.appender.console.layout=org.apache.log4j.PatternLayout
    log4j.appender.console.layout.ConversionPattern=%-5p %l - %m%n
    # log level and appender
    log4j.logger.ticketBuy=INFO, logfile
    log4j.logger.errorPurchase=INFO, logfile
    log4j.logger.cancelPurchase=INFO, logfile
    log4j.logger.ticketBuyResult=INFO, logfile

    jsp소스에선
    Logger logger = Logger.getLogger("cancel_purchae.jsp");
    logger.info("CancelPurchase : " + date.toString() + " mobile=" + mobile + " imgIdx=" + imgIdx + " CharacterCode=" + cCode);

    간단히 저런 형식으로...
    설정 파일을 많이 다뤄 본적이 없어서 로그를 파일로 남기는거 찾는데 고생한 기억이 ㅠㅠ
    첨부된 파일은 log4j 라이브러리 파일

    jsp 테이블 내용 엑셀로 저장하기


    펌도 펌도 이런 불펌을 ㅋㅋㅋ

    =========================================================================================
    예를들어 제목(title)을 조건으로 검색하여 리스트를 조회하는 화면이 있을때에
    <EXCEL 파일저장>이라는 글자를 클릭하면 조건으로 들어가는 제목(title)을 parameter로
    갖고 엑셀파일을 보여줄수 있는 pop-up대용의 jsp화면으로 보내준다.
    ========================================
                              list.jsp
    ========================================
    <%@ page contentType="text/html;charset=euc-kr" %>
    <html>
     .....
     function toXLS() {
       var address = "/jsp/excel.jsp?title=타이틀&file_name=리스트.xls";
       location.href = address;
     }
     .....
    <body>
     .....
    <a href="javascript:toXLS()"><strong>EXCEL 파일저장</strong></a>
     .....
    </body>
    </html>
    ========================================
    지금의 코드에 이어 나오는 excel.jsp가 실제적으로 더 중요한 코드라 할수 있는데
    맨처음에 jsp화면에서 설정코드를 눈여겨보아야 한다.
    ========================================
                              excel.jsp
    ========================================
    <%@ page contentType="application/vnd.ms-excel;charset=euc-kr" %>
     ===> contentType를 반드시 위와같이 정의해주어야 한다.
    <%
       String file_name = request.getParameter("title");
       response.setHeader("Content-Disposition", "attachment; filename=""+file_name+"";");
     ===> 저장할시에 기본적으로 설정되는 파일명을 지정하고(여기서는 order_list.xls)
            반드시 attachment로 설정을 해야 파일열기,저장 중에 선택하는 메시지가 뜬다.
       response.setHeader("Content-Description", "JSP Generated Data");
     ===> 정확히 어떤 정의였는지는 자세히 기억이 나지 않지만 필수적으로 설정해야한다.
      String title = request.getParameter("title");
      ...( title파라미터를 이용하여 DB에서 해당 목록을 ResultSet으로 받아온다. )
    %>
    <html>
    <head>
    <title>엑셀파일변환</title>
    </head>
    <body bgcolor=white>
    <table border=1>
    <tr bgcolor="#CACACA">
    <th>지시일자</th>
    <th>완료일</th>
    <th>담당자</th>
    <th>현 황</th>
    <th>제      목</th>
    </tr>
    <%
       while(rs.next()) {   
    %>       
    <tr>
    <td><%=rs.getString("ord_date")%></td>
    <td><%=rs.getString("cmp_date")%></td>
    <td><%=rs.getString("charge_name")%></td>
    <td><%=rs.getString("state_name")%></td>
    <td><%=rs.getString("subject")%></td>
    </tr>
    <%
    }
    %>
    </table>
    </body>
    </html>
    ========================================
    이렇게 화면이 만들어지면 해당 <EXCEL 파일저장>을 클릭하게되면 order_list.xls(지정한파일명)
    를 현재 위치에서 열것인지 저장할 것인지를 묻는 창이 뜬다.
    여기에서 저장을 하게되면 이름을 바꿔서 저장이 가능하고, 열기를 선택하면 excel.jsp에
    구성된 내용들이 현재화면에 엑셀형식으로 보여지게 되는것이다.
    처음 참고자료를 뒤졌을때 excel.jsp의 attachment 부분이 다른방식으로 지정되면 곧바로 엑셀파일
    열기가 실행되어 난감했던 기억이 난다.
    반드시 attachment을 해야만 저장을 묻는다는 것을 기억하고.. 또 기억하자 ㅡ_ㅡ/

    iOS 이미지 처리 함수


    먼저 리사이징 함수..  

    -(UIImage *)resizeImage:(UIImage *)image width:(float)resizeWidth height:(float)resizeHeight{
    UIGraphicsBeginImageContext(CGSizeMake(resizeWidth, resizeHeight));
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(context, 0.0, resizeHeight);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextDrawImage(context, CGRectMake(0.00.0, resizeWidth, resizeHeight), [image CGImage]);
    UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return scaledImage;
    }


    크롭용 함수입니다. 파라메터로 이미지와 크로핑하고 싶은 영역

    - (UIImage*)imageByCropping:(UIImage *)imageToCrop toRect:(CGRect)rect
    {
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef currentContext = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(currentContext, 0.0, rect.size.height);
    CGContextScaleCTM(currentContext, 1.0, -1.0);
    CGRect clippedRect = CGRectMake(00, rect.size.width, rect.size.height);
    CGContextClipToRect( currentContext, clippedRect);
    CGRect drawRect = CGRectMake(rect.origin.x * -1,rect.origin.y * -1,imageToCrop.size.width,imageToCrop.size.height);
    CGContextDrawImage(currentContext, drawRect, imageToCrop.CGImage);
    CGContextScaleCTM(currentContext, 1.0, -1.0);
    UIImage *cropped = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return cropped;
    }


    마스킹함수 첫번째 파라메터로 마스킹할 대상 이미지 파일 두번째 이미지 파일에는 마스킹용의 이미지

    -(UIImage *)maskingImage:(UIImage *)image maskImage:(NSString)_maskImage{
    CGImageRef imageRef = [image CGImage];
    CGImageRef maskRef = [[UIImage imageNamed:_maskImage] CGImage];
        
    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
    CGImageGetHeight(maskRef),
    CGImageGetBitsPerComponent(maskRef),
    CGImageGetBitsPerPixel(maskRef),
    CGImageGetBytesPerRow(maskRef),
    CGImageGetDataProvider(maskRef),
    NULLfalse);
        
    CGImageRef masked = CGImageCreateWithMask(imageRef, mask);
    CGImageRelease(mask);
        
    UIImage *maskedImage = [UIImage imageWithCGImage:masked];
    CGImageRelease(masked);
    return maskedImage;
    }

    Android device CPU type 알아내는 소스.


    main.xml
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     >
    <TextView
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:gravity="center_horizontal"
     android:text="android-er.blogspot.com"
     android:autoLink="web"
     />
    <TextView
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:text="Android CPU Info.:"
     />
    <TextView
     android:id="@+id/CPUinfo"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     />
    </LinearLayout>

    CPUTypeInfo.java
    package com.systemworks.CPUType;
    import! java.io.IOException;
    import! java.io.InputStream;
    
    import! android.app.Activity;
    import! android.os.Bundle;
    import! android.widget.TextView;
    
    public class CPUTypeActivityextends Activity {
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
      
         TextView strCpuInfo = (TextView)findViewById(R.id.CPUinfo);
         strCpuInfo.setText(ReadCPUInfo());
      
     }
    
     private String ReadCPUinfo()
     {
      ProcessBuilder cmd;
      String result="";
      
      try{
       String[] args = {"/system/bin/cat", "/proc/cpuinfo"};
       cmd = new ProcessBuilder(args);
       
       Process process = cmd.start();
       InputStream in = process.getInputStream();
       byte[] re = new byte[1024];
       while(in.read(re) != -1){
        System.out.println(new String(re));
        result = result + new String(re);
       }
       in.close();
      } catch(IOException ex){
       ex.printStackTrace();
      }
      return result;
     }
    }

    2012년 3월 23일 금요일

    시작

    여기저기 다 맘에 안들어서 결국 이리로 이사왔다.

    많진 않지만...저 글들이랑 사진들 언제 다 옮기지 ㅠㅠ


    2024년 첫번째 도서 리뷰 GPT-4를 활용한 인공지능 앱 개발

     "한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다." 24년 첫 도서 리뷰이다. 작년까지? 한참 핫 했던 인공지능 서비스 Chat GPT에 관한 책이다. 핑계지만 어쩌다보니 GPT에 대한 접근이...