티스토리 툴바


달력

05

« 2012/05 »

  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  

'전체'에 해당되는 글 416

  1. 2012/05/16 vim에서 zen coding 사용하기
  2. 2012/05/08 Ubuntu에 github에서 최신 node.js 설치 하기.
  3. 2012/05/07 구글 드라이브 오프라인 사용하기
  4. 2012/04/02 CentOS에서 memcached 설치법
  5. 2012/03/26 터미널에서 git의 자동완성 기능 사용하기.
  6. 2012/03/22 ssh와 rsync를 이용한 백업
  7. 2012/02/27 안드로이드 에뮬레이터 속도 개선하기.. (15)
  8. 2012/02/09 Eclipse에 vrapper 설치 후 키 설정하기
  9. 2012/02/08 CentOS 6에서 subversion 1.7.2 설치하기
  10. 2011/10/18 svn 저장소(repository) dump 및 load 복구 정리
  11. 2011/10/13 Eclipse에서 ant를 이용해서 sftp로 파일 전송하기 (1)
  12. 2011/10/06 안드로이드 치수 정리, dpi, dp, dip, sp, pt px, mm, in (4)
  13. 2011/10/04 오디오 볼륨 조정하기.. (1)
  14. 2011/08/31 OSX에서 Mp3 Tag를 유니코드로 변경하기..
  15. 2011/08/30 OSX의 터미널 대체 어플 iTerm2 (1)
  16. 2011/08/29 Lion에서 Python PIL 사용하기
  17. 2011/08/26 iOS 캡쳐 자동화 하기 (1)
  18. 2011/08/26 아이폰 시뮬레이터 캡쳐 받기 - iOS-Simulator Cropper
  19. 2011/08/26 [iOS Open Source] FTUtils Core Animation (1)
  20. 2011/08/24 Mac OS X Lion 폰트를 나눔고딕 폰트로 변경하기 (1)
  21. 2011/07/26 OSX Lion에서 한영 전환을 shift-space로 하기 (10)
  22. 2011/06/23 이메일과 클라우드 200GB 짜리 이벤트... (1)
  23. 2011/06/10 [iOS Open Source] ShareKit : iOS에서 이미지, 텍스트, URL 그리고 파일 한방에 공유를..
  24. 2011/06/10 UILabel 글씨에 테두리선 그리기. (2)
  25. 2011/06/06 gvim에서 unity의 도움말 보기
  26. 2011/05/25 NSString 암호화
  27. 2011/05/02 구글에서 사전의 음성 및 TTS 음성 MP3 받기.. (2)
  28. 2011/04/26 UIImage를 흑백 이미지로 바꾸기
  29. 2011/04/25 UIView에서 Subview 지우기
  30. 2011/03/22 아이폰에서 통신 사업자 및 국가코드 알아 오기. (3)

Vim에도 Zen Coding 플러그인이 있습니다.

HTML을 코딩하면서, 뭔가 반복하는 느낌이 생길때 이걸 편하게 대체해 주는

코딩 방법 이죠..

하지만, 사용법을 먼저 공부 해야 한다는 ^^;;


vim의 zen coding 플러그인의 주소는

여기입니다. 


여기서 다운로드 받아서 윈도우는 vim의 vimfiles 폴더에 압축을 풀어서 넣어 주시면 되고,

맥이나 리눅스 사용자 분들은 개인 경로에서 .vim 폴더에서 아래와 같이 압축을 풀어 주시면 됩니다.


# cd ~/.vim
# unzip zencoding-vim.zip



여기 홈페이지에 가시면 동영상으로 사용법을 보실 수 있습니다.


여기는 vim용은 아니지만, 동영상을 보시면 이해가 더 편할 겁니다.


저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하

node.js 설치를 찾아 보다보니..

홈페이지에서 소스를 받아서 설치하는 것만 나오고,

마땅히 github에서 받아서 설치하는게 나오지 않아서..

정리해 봅니다.


먼저 패키지를 받습니다.


sudo apt-get install g++ curl libssl-dev  apache2-utils

sudo apt-get git-core


이렇게 받아 줍니다.

이제 node.js의 github 저장소에서 소스를 받아 옵니다.


# git clone git://github.com/joyent/node.git

# cd node

# git tag

..... 생략

v0.6.15
v0.6.16
v0.6.17
v0.6.2
v0.6.3
v0.6.4
v0.6.5
v0.6.6
v0.6.7
v0.6.8
v0.6.9
v0.7.0
v0.7.1
v0.7.2
v0.7.3
v0.7.4
v0.7.5
v0.7.6
v0.7.7
v0.7.8
works


이렇게 치면 버전이 태그가 무섭게 나옵니다.

여기서 내가 필요한 태그를 checkout 받습니다.

현재 nodejs.org 홈페이지에서는 v0.6.17을 배포하고 있습니다.

하지만, 전 최신 버전을 써 보고 싶어서 최신 태그를 받았습니다.


# git checkout v0.7.8


이렇게 해주면, 현재 버전이 v0.7.8로 변경이 됩니다.

여기 부터는 다른 곳에서 설치하는 것과 같습니다.


# ./configure

# make

# make install


마지막으로 설치된 버전을 확인 합니다.

# node --version



저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하

이번에 구글의 새로운 서비스인 구글 드라이브를 드디어 한국에서도 사용할 수 있게 되었습니다.

구글 닥스를 잘 사용하고 있던 저로서는, 구글 드라이브가 구글닥스와 합쳐진 형태로 나온것도 환영할 만한 일이였습니다. 

하지만, 닥스의 문서를 오프라인에서는 보거나 편집이 불가능한것은 아직가지 불편한 사항입니다.


잘 뒤져 보니... 오프라인에서 보기는 가능 해서 그 기능을 적어 볼까 합니다.

처음에는 오프라인을 사용 할려고 하는 거니까, 구글 드라이브 어플리케이션을 설치 하셔야 합니다.

그리고, 이 오프라인 기능을 사용하기 위해서는 크롬 웹 브라우저를 설치 하셔야 합니다.


위 2가지 조건이 갖춰 진다면,


닥스의 목록에 보시면 문서도구 오프라인 설정이 보일 겁니다.



오프라인 문서도구 허용을 하시고 Chrome 웹 스토어에서 설치를 누르시면,



이런 화면이 나오고 +CHROME에 추가를 누르시면 설치가 완료 됩니다.




이제 구글닥스에 가 보시면 오프라인 동기화라는 것이 생기고

동기화 된 문서는 편집은 불가능 하지만, 보기가 가능해 집니다.

동기호 된 문서는 오프라인 문서도구 보기에서 보시면 목록으로 출력 됩니다.


Google Documents와 Spreadsheets는 보기만 가능하고 수정은 불가능 합니다.

하지만, 그외 오피스 파일, 이미지, PDF 등등의 모든 파일은 내 하드내에서 보기와 수정이 가능하며, 이 파일들은 파일의 오프라인에서 변경된 사항의 시간을 가지고 인터넷에 접속 때 싱크가 됩니다.


뭐... 꼭 인터넷이 되야 편집 할 수 있다는 불편함이 있지만,

그래도, 뭔가 아쉬운게 해결이 되긴 했네요.







저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하

CentOS에서 memcached 설치법



아래는 CentOS 6.2기준으로 작성되었습니다. 권하는 root로 작업을 했습니다.

먼저 yum을 통해서 libevent 설치

# yum install -y libevent libevent-devl


최신 memcached 소스 코드 다운로드 받기

위 주소로 가서 최신 버전을 다운로드 받습니다.

그리고 아래와 같이 진행합니다.


# wget http://memcached.googlecode.com/files/memcached-1.4.13.tar.gz
# tar -zxvf memcached-1.4.13.tar.gz
# cd memcached-1.4.13
# ./configure --prefix=/usr/local/memcached
# make
# make install


이렇게 하면 memcached는 설치가 끝났습니다.

이제는 서비스에 등록 과정입니다.

아래의 내용 /etc/init.d/memcached
파일에 넣습니다.

#!/bin/bash
#
#   /etc/init.d/memcached
#
# Starts the Memory Cache Daemon
#
# chkconfig: 2345 90 10
# description: Memory CacheDaemon
# processname: memcached
# pidfile: /var/lock/subsys/memcached

source /etc/rc.d/init.d/functions

memcached="/usr/local/memcached/bin/memcached"

[ -x $memcached ] || exit 1

### Default variables
SYSCONFIG="/etc/sysconfig/memcached"

### Read configuration
[ -r "$SYSCONFIG" ] && source "$SYSCONFIG"

RETVAL=0
prog="memcached"
desc="Memory Cache Daemon"
memsize="32"
listenip="127.0.0.1"
port="11211"
uid="root"
pidfile="/var/run/$prog.pid"

start() {
   echo -n $"Starting $desc ($prog): "
   daemon $memcached -d -u $uid -m $memsize -l $listenip -p $port -P $pidfile
   RETVAL=$?
   if [ $RETVAL -eq 0 ]; then
     touch /var/lock/subsys/$prog
   fi
   echo
}

obtainpid() {
   pidstr=`pgrep $prog`
   pidcount=`awk -v name="$pidstr" 'BEGIN{split(name,a," "); print length(a)}'`
   if [ ! -r "$pidfile" ] && [ $pidcount -ge 2 ]; then
        pid=`awk -v name="$pidstr" 'BEGIN{split(name,a," "); print a[1]}'`
        echo $prog is already running and it was not started by the init script.
   fi
}

stop() {
   echo -n $"Shutting down $desc ($prog): "
   if [ -r "$pidfile" ]; then
        pid=`cat $pidfile`
        kill -s 3 $pid
        RETVAL=$?
   else
           RETVAL=1
   fi
   [ $RETVAL -eq 0 ] && success || failure
   echo
   if [ $RETVAL -eq 0 ]; then
     rm -f /var/lock/subsys/$prog
     rm -f $pidfile
   fi
   return $RETVAL
}

restart() {
        stop
     start
}

forcestop() {
   echo -n $"Shutting down $desc ($prog): "

   kill -s 3 $pid
   RETVAL=$?
   [ $RETVAL -eq 0 ] && success || failure
   echo
   if [ $RETVAL -eq 0 ]; then
     rm -f /var/lock/subsys/$prog
     rm -f $pidfile
   fi

   return $RETVAL
}

status() {
   if [ -r "$pidfile" ]; then
        pid=`cat $pidfile`
   fi
   if [ $pid ]; then
           echo "$prog (pid $pid) is running..."
   else
        echo "$prog is stopped"
   fi
}                                                                          

obtainpid

case "$1" in
  start)
   start
   ;;
  stop)
   stop
   ;;
  restart)
   restart
   RETVAL=$?
   ;;
  condrestart)
   [ -e /var/lock/subsys/$prog ] && restart
   RETVAL=$?
   ;;
  status)
   status
   ;;
  forcestop)
   forcestop
   ;;
  *)
   echo $"Usage: $0 {start|stop|forcestop|restart|condrestart|status}"
   RETVAL=1
esac

exit $RETVAL

여기서 listenip는 로컬에서만 쓸 경우에는 127.0.0.1로 하시고, 다른 IP에서 접근이 필요한 경우에는 현재 호스트의 ip를 쓰시면 됩니다.

서비스가 잘 되는지 실행을 해 봅니다.


# service memcached start


성공 메시지가 뜨면, 정상적으로 연결이 되는지 확인합니다.

telnet 명력으로 아래 아래와 같이 실행하시고, stats하고 엔터를 누르면 구동 상태가 나옵니다.

혹시 telnet명령어가 없으면 yum install -y telnet 으로 설치해 주세요.


# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
stats
STAT pid 6172
STAT uptime 9298
STAT time 1333340313
STAT version 1.4.13
STAT libevent 1.4.13-stable
STAT pointer_size 64
STAT rusage_user 0.000000
STAT rusage_system 0.003999
STAT curr_connections 5
STAT total_connections 9
STAT connection_structures 6
STAT reserved_fds 20
STAT cmd_get 0
STAT cmd_set 0
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 0
STAT get_misses 0
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 48
STAT bytes_written 2063
STAT limit_maxbytes 2147483648
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT bytes 0
STAT curr_items 0
STAT total_items 0
STAT evictions 0
STAT reclaimed 0
END
quit
Connection closed by foreign host.


상태가 확인 되었으면 quit로 종료 합니다.

정상적으로 설치가 되었으면 서비스에 등록을 합니다.


# chkconfig --add memcached


이렇게 해서 서비스에 등록해 줍니다.
마지막으로 서비스 등록 확인은 ntsysv 명령으로 하시면 됩니다.


저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하

git을 컴파일 하셔서 설치 하셨으면 gitd의 다운로드 받은 소스에서  contrib/completion에 보시면 git-completion.bash라는 파일이 있을 겁니다.
이 파일을 홈 디렉토리에 카피하고 .bashrc 파일에 아래 내용을 추가합니다.

source ~/.git-completion.bash

하지만 git을 컴파일해서 사용하지 않고, yum이나 apt-get으로 설치 하신 분들은.

 # find / -type f -name "git-completion.bash" -print
/usr/share/doc/git-1.7.1/contrib/completion/git-completion.bash


찾은 내용을 .bashrc파일에 넣어 줍니다.

source /usr/share/doc/git-1.7.1/contrib/completion/git-completion.bash

이렇게 하고 나면, git 명력을 입력 할 때 <TAB>키를 누르면 제안하는 명령어들이 출력 됩니다.

# git co<Tab><Tab>
commit config


이런 식으로~

그럼 즐 git 하세요~


저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하
2012/03/22 14:18

ssh와 rsync를 이용한 백업 컴퓨터2012/03/22 14:18

리눅스 시스템 사이에서 백업을 해야 할일이 생겨서 이것저것 찾아 보다가..
rsync를 사용하기로 했습니다.

우선 ssh를 통해서 rsync 백업을 할려고 하면, password를 묻습니다.
한번씩 할 때는 패스워드를 치면 상관없지만, crontab을 사용해서 주기적으로 할려고 하면 문제가 발생합니다.

해결하는 방법을 이것저것 찾았는데 2가지 정도가 나오네요.

첫번째ssh-keygen을 통해서 패스워드를 묻지 않게 하는 방법 입니다.
# ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa): <ENTER>
Enter passphrase (empty for no passphrase): <ENTER>
Enter same passphrase again:  <ENTER>
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
58:bd:ef:fd:3b:62:79:2e:ea:de:c4:73:2d:7d:11:2b root@web-tl
The key's randomart image is:
+--[ DSA 1024]----+
|                 |
|         .       |
|        . .    . |
|       o   .    o|
|      . S .  E o |
|           .. ..o|
|            .+o.+|
|           .o*o+.|
|          o++.*++|
+-----------------+
# cat ~/.ssh/id_dsa.pub | ssh [원격ID]@[원격HOST] "cat >> .ssh/authorized_keys"
password: 암호입력<ENTER>
# _

이렇게 설정을 해 두면, 해당 원격 서버에 접속할때 암호를 전혀 묻지 않게 됩니다.

# rsync -avzP -e ssh [원격HOST]:/home/source /home/target


이런식으로 백업 하시면 됩니다.

하지만, 뭔가 찝찔하죠..
누구나 이 자리에 앉으면 패스워드를 몰라도 원격 호스트에 접근을 할 수 있게 되죠...


두번째sshpass를 사용해서 접근하는 방법니다.
CentOS나 fedora에서는 기본 yum해서는 들어 있지 않습니다.
아래와 같이 epel을 통해서 받습니다.

# sudo su -
# rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-5.noarch.rpm
# yum update
# yum -y install sshpass

이렇게 설치해 주시면 됩니다.
Ubuntu를 쓰시는 분들은 apt-get으로 받으세요.

# sudo apt-get install sshpass

sshpass을 사용법을 알아보면..  아래와 같습니다.

sshpass -p '[암호]' ssh [원격ID]@[원격HOST]

# sshpass -p 'myPassword' ssh username@server.example.com

이런식이죠...

그러면, 이걸로 rsync를 해 봐야 겠죠?

# rsync --rsh="sshpass -p myPassword ssh -l username" server.example.com:/var/www/html/ /backup/

이렇게 하시면 됩니다.

참 쉽죠?

여기서 주기적으로 백업을 하고 싶다면..

# crontab -e

이렇게 뛰우시고 내용을 수정하시면 됩니다.
*/5 * * * * rsync --rsh="sshpass -p myPassword ssh -l username" server.example.com:/var/www/html/ /backup/

이렇게 해 두면 5분 주기로 백업이 진행 됩니다.

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하

안드로이드를 개발 할려고 하면, 에뮬레이터의 속도가 정말 절망적입니다.
아이폰 시뮬레이터는 정말 쾌적한 환경이라는 생각이 들죠..

이렇게 느린 이유는 안드로이드 리얼 에뮬레이터에서 돌아가는게 아니라서 그럽습니다.
아이폰 시뮬레이터는 같은 x86 호스트에서 돌아가고 있습니다. 그래서 빠르게 작동을 하죠. 하지만, 안드로이드 에뮬레이터는 x86프로세스 위에서 ARM processor를 에뮬레이터를 하고 있습니다. 이러면서 오버헤드가 생겨서 겁나게 느린겁니다.

하지만, 개발할때는 ARM processor의 에뮬레이터가 꼭 필요 한게 아니죠. 정상적으로 어플리케이션 동작만 하면 땡큐 한거죠.

Android-x86
다행히 안드로이드 OS를 x86 CPU에 포팅한 오픈소스 프로젝트가 있습니다.
  • http://www.android-x86.org/
이 프로젝에서는 여러가지의 버전별로 여러가지의 이미지를 제공합니다. 안드로이드 SDK에서 릴리스 하는 모든 이미지가 있는 것은 아니지만 사용 하는데는 별 지장이 업습니다.

아래 다운로드 URL에 가서 자신이 원하는 버전의 이미지를 받으면 됩니다.



여기서는 2.3버전을 사용했습니다. 그리고 되도록이면 eeepc를 받으세요. 다른 이미지는 VirtualBox에서 네트워크를 사용하는데 문제가 발생할 수 있어서, 별 설정이 필요 없는 eeepc를 추천합니다.

Android-X86을 VirtualBox에 설치하기
설치를 하기 전에 VirtualBox 홈페이지에 가서 VirtualBox 어플리케이션을 다운로드 받아서 설치 합니다.
  • https://www.virtualbox.org/wiki/Downloads
설치가 잘 완료 되었으면 VirtualBox 관리자에서 "새로 만들기" 버튼을 눌러서 새로운 이미지를 만들어 줍니다.

설정은 아래와 같이 진행합니다.
  • 가상머신 이름 : Android_2.3 (나중에 설정에서 사용 됩니다.)
  • 운영체제 종류
    • 운영체제 : Linux
    • 버전 : Other Linux
  • 메모리 : 1024 (원하는 용량으로 선택하세요)
  • 부팅 하드디스크
    • 새 가상 디스크 만들기
  • 파일 형식
    • VDI (VirtualBox 디스크 이미지)
  • 저장소 정보
    • 동적 할당
  • 가상 디스크 파일 위치 및 크기
    • 원하는 대로

이미지가 만들어 졌으면 네트워크 옵션을 브리지 어탭터로 수정 합니다.


그리고, 저장소에서 CD/DVD드라이버에 다운로드 받은 ISO이미지를 넣어 줍니다.

이제 부팅을 하시면 아래 화면이 나옵니다.

여기서 Installation - Install Android-x86 to harddisk를 선택합니다.

  1. Choose Partition
    • Create/Modify partitions
  2. cfdisk
    • [New] -> [Primary] -> 엔터 -> [Bootable] -> [Write] -> yes -> [Quit]
  3. Choose Partition
    • sda1  linux   VBOX HARDDISK
  4. Choose filesystem
    • ext3 -> Confirm -> Yes
  5. Do you want to install boot loader GRUB?
    • Yes
  6. Do you want to install /system directory as read-write?
    • Yes
  7. Android-x86 is installed successfully.
    • Create a fake SD card -> 수정 -> 엔터
  8.  Reboot
완료 되면, 저장소에서 iso이미지를 제거 합니다.

이렇게 설치하면 정상적으로 안드로이드가 실행 되는 것을 볼 수 있습니다.


안드로이드용 개발 해상도 지원하기
하지만, 가로가 길쭉한 해상도로 나옵니다. 안드로이드폰용 어플을 개발 하기 적절하지 않은 해상도 입니다.
가로 해상도를 지원해 보겠습니다.

VirtualBox가 설치된 폴더로 가서 cmd 창을 실행합니다.

VBoxManage setextradata "Android_2.3" "CustomVideoMode1" "480x800x16"

그리고 위와 같이 입력해 줍니다. 여기서 Android_2.3은 가상장치를 만들때 사용했던 이미지 이름 입니다.

이제 가상 머신을 작동 시키고 Debug mode를 시작합니다.

그리고 아래와 같이 입력을 합니다.
mount -o remount,rw /mnt
vi /mnt/grub/menu.lst



여기에 보시면 부팅할 때 선택하는 모드가 있습니다.
각 내용을 변경 하시면 됩니다.
여기서는 1번째 옵션을 그대로 사용하고 해상도만 추가해 보겠습니다.

kernel /android-2.3-RC1/kernel quiet root=/dev/ram0 androidboot_hardware=generic_x86 acpi_sleep=s3_bios,s3_mode DPI=240 UVESA_MODE=480x800 SRC=/android-2.3-RC1



작성을 완료 하셨다면 :wq로 저장하시고 exit를 명령을 쳐 주시고 머신을 중단하고 새로 시작합니다. 그냥..재시작로 하게 되면 값이 적용이 안 되는 경우가 있습니다.




멋찐 가로 해상도가 보이죠?
아.. 마우스가 움직이지 않으시죠? 이럴때는 머신 -> 마우스 통합 비활성화 를 선택하시면 마우스 커서가 보입니다.

개발환경 설정하기
안드로이드에서 Alt-F1을 누릅니다.
여기서 커맨드 창이 나오면
netcfg

를 쳐 봅니다.
여기서 eth0 옆에 나오는 IP를 보시면 됩니다.
여기서는 192.168.10.43이 나왔습니다.



보고 나서는 ALT-F7을 눌러서 원래 화면으로 돌아 갑니다.


윈도우에서 android platform-tools 디렉토리로 이동해서
커맨드 창을 열고 netcfg에서 나온 IP와 함께 아래와 같이 입력 합니다.
adb connect 192.168.10.43




이렇게 설정하고 나면 이클립스에서 안드로이드 개발을 하실때 VirtualBox에 어플이 실행 됩니다.

이제 이클립스를 띄워 보시면,
디바이스 창에 에뮬레이터가 보일 겁니다..



열심히 프로그램을 짜주시면 됩니다~ ^^*

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하

이클립스(eclipse)에서 vim 커맨드 사용하기
를 포스팅 한 적이 있는데..
키 설정하는걸 빼 먹은거 같아서 글 쓴지 약 1년 반 후에 붙여서 씁니다.

먼저 홈페이지는  http://vrapper.sourceforge.net/home/ 입니다.


1. 설치하기

메뉴에서 Help -> Install New Software...
http://vrapper.sourceforge.net/update-site/stable
주소를 추가하고 설치 합니다.

2. 키 설정하기
Window -> Preferences -> General -> Keys -> Vim's key bindings
아래와 같이 설정 합니다.
  • Page Down: Ctrl+F
  • Page Up: Ctrl+B
  • Scroll Line Down: Ctrl+E
  • Scroll Line Up: Ctrl+Y

그리고 Apply 버튼을 누르고 OK



저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하
2012/02/08 11:32

CentOS 6에서 subversion 1.7.2 설치하기 컴퓨터2012/02/08 11:32

현재 centos에서 yum으로 받을 수 있는 subversion은 1.6.11 입니다.
1.7 버전을 쓰고 싶은데.. 받을수가 없어서.. 인터넷에 찾아 봤더니..
마땅한게 없더군요. 그래서 설치 방법을 정리해 봤습니다.

먼저 yum으로 설치된 기존 svn을 삭제 합니다.
# sudo yum remove subversion



http://svn-ref.assembla.com/download-clients.html#CentOS
여기 방문해서 rpm의 주소를 알아냅니다.

# wget http://svn-ref.assembla.com/svn-clients/SVN_1.7.2_clients/CentOS-6-Subversion%201.7.2_client-64bit.rpm


저 같은 경우는 64bit라서 위 주소로 받았습니다.

# sudo rpm -Uvh CentOS-6-Subversion\ 1.7.2_client-64bit.rpm


이렇게 설치 하시면 땡~

error: Failed dependencies:
        apr >= 1.2.7 is needed by subversion-1.7.2-1229026.x86_64
        apr-util >= 1.2.7 is needed by subversion-1.7.2-1229026.x86_64


이런 에러가 발생하면 아래꺼를 설치합니다.
# sudo yum install apr apr-util


그리고
error: Failed dependencies:
        libpq.so.5()(64bit) is needed by subversion-1.7.2-1229026.x86_64

이런 에러가 발생하면 아래꺼를 설치 하시면 됩니다.
sudo yum install postgresql


설치가 완료 되면, 버전을 확인해 보세요~
# svn --version
svn, version 1.7.2 (r1207936)
   compiled Jan 13 2012, 15:15:54

Copyright (C) 2011 The Apache Software Foundation.
This software consists of contributions made by many people; see the NOTICE
file for more information.
Subversion is open source software, see http://subversion.apache.org/

The following repository access (RA) modules are available:

* ra_svn : Module for accessing a repository using the svn network protocol.
  - with Cyrus SASL authentication
  - handles 'svn' scheme
* ra_local : Module for accessing a repository on local disk.
  - handles 'file' scheme
* ra_serf : Module for accessing a repository via WebDAV protocol using serf.
  - handles 'http' scheme
  - handles 'https' scheme


저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하

덤프 받기

1. 전체 덤프 받기
svnadmin dump /var/www/svn/reposA/  > ~/reposA.svn_dump

전체 저장소를 덤프 받습니다.

2. 지정 덤프 받기
svnadmin dump /var/www/svn/reposA/ -r 10  > ~/reposA.svn_dump

리비전 10만 덤프 받습니다.

3. 구간 덤프 받기
svnadmin dump /var/www/svn/reposA/ -r 10:20  > ~/reposA.svn_dump

리비전 10에서 20까지 덤프를 받습니다.

4. 특정 폴더 덤프 받기
svnadmin dump /var/www/svn/reposA/ | svndumpfilter include WORK > ~/reposA.svn_dump

저장소에서 WORK 폴더만 덤프를 받습니다.

5. 특정 폴더를 제외 하고덤프 받기
svnadmin dump /var/www/svn/reposA/ | svndumpfilter exclude TEMP > ~/reposA.svn_dump

저장소에서 TEMP 폴더만 제외하고 덤프를 받습니다.

5. 증분 덤프 받기
svnadmin dump /var/www/svn/reposA/ -r 0:1000  > ~/repos-0-1000.svn_dump
svnadmin dump /var/www/svn/reposA/ -r 1000:2000 --incremental > ~/repos-1000-2000.svn_dump
svnadmin dump /var/www/svn/reposA/ -r 2000:3000 --incremental > ~/repos-2000-3000.svn_dump

구간별로 증분이 가능 하도록 덤프를 받습니다. load시 증분해서 복원이 가능 함.



덤프 복원하기
덤프를 복원하기 위해서는 기존의 저장소나 빈 저장소가 있어야 합니다.
svnadmin --help create 를 참고 하세요.

1. 복원하기
svnadmin load repo < ~/reposA.svn_dump

repo라는 저장소에 덤프 파일을 복원 합니다.

2. 증분 덤프 복원하기
svnadmin load < ~/repos-0-1000.svn_dump
svnadmin load < ~/repos-1000-2000.svn_dump
svnadmin load < ~/repos-2000-3000.svn_dump

이전에 증분했던 순서대로 다시 차례대로 넣어 주면 됩니다.

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하

요즘은 이클립스에서 웹개발을 하게 되었는데..
ant를 이용해서 소스 파일을 사이트로 업로드 하는 방법이 있어서 정리 해 봅니다.

전 php용도로 사용해서 거기에 맞춰서 정리 합니다.

먼저 이클립스에서 ant를 설치 합니다.

Help > Install New Software 를 선택합니다.

아래와 같은 화면에서 Work with에서 --All Available Sites -- 를 선택합니다.
조금 기다리고 나서, 하단 필터에 java EE를 입력해 주면,
아래와 같이 목록이 뜹니다.


이 다음부터는 next와 finish를 눌러가면서 알아서 설치해 주시면 됩니다.

설치가 끝난후 이클립스를 재시작 합니다.

Window > Show View -> Other를 선택하면 ant가 추가 된것을 볼 수 있습니다.


OK를 누르고 적당한 위치에 Ant를 배치합니다.

이번에는 sftp를 사용을 위해서 Maverick ANT 라이브러리를 설치 해야 합니다.

다운로드

위 파일을 다운로드 받습니다.

더보기

 
그리고 적당한 폴더에 압축을 풀어 줍니다.
해당 파일은 계속 사용하니.. 잘 고민해서 넣어 주세요.

Window -> Preferences를 선택해서 Ant > Runtime을 선택합니다.
여기서 Ant Home Entries(Default)를 선택하고 Add External JARs.. 버튼을 클릭합니다.


그리고 위 라이브러리의 압축을 푼 위치에서 lib/maverick-ant.jar 파일을 선택해서 추가해 줍니다.

여기 까지 하면 설치는 끝났습니다.

이제 부터는 사용 방법 입니다.

먼저 프로젝트에 build.xml 파일을 추가 합니다.
그리고 아래와 같이 입력해 줍니다.

<?xml version="1.0" encoding="UTF-8"?>
<project name="project" basedir="." default="UploadAll">
    <property name="sftp.server" value="123.123.123.123"/>
    <property name="sftp.port" value="22" />
    <property name="sftp.home.dir" value="/var/www/project/"/>
    <property name="sftp.userid" value="userName"/>
    <property name="sftp.pw" value="userPassword"/>

    <taskdef name="ssh" classname="com.sshtools.ant.Ssh" />

    <target name="UploadAll">
        <ssh host="${sftp.server}" port="${sftp.port}" username="${sftp.userid}" password="${sftp.pw}" version="2">
            <sftp action="put" remotedir="${sftp.home.dir}" verbose="true">
                <fileset dir=".">
                    <include name="**/*" />
                    <exclude name=".settings/**" />
                    <exclude name=".project" />
                </fileset>
            </sftp>
        </ssh>
    </target>

    <target name="UploadChangedFiles">
        <ssh host="${sftp.server}" port="${sftp.port}" username="${sftp.userid}" password="${sftp.pw}" version="2">
            <sftp action="put" remotedir="${sftp.home.dir}" verbose="true" depends="yes">
                <fileset dir=".">
                    <include name="**/*" />
                    <exclude name=".settings/**" />
                    <exclude name=".project" />
                </fileset>
            </sftp>
        </ssh>
    </target>

</project>
각 property에는 자신의 설정을 입력해 주세요.
그리고 마지막으로 실행 ant 창에서 개미에 더하기 버튼이 있는 버튼을 눌러서, build.xml파일을 선택합니다.



그리고 실행 할 때는 해당 실행에서 오른쪽을 눌러서 run을 하거나, 버튼을 눌러 주시면 됩니다.


저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하

dpi (Dots Per Inch )

1인치(2.54 센티미터)에 들어 있는 픽셀의 수. 안드로이드에서는 160을 기본으로 한다.

참고 : http://en.wikipedia.org/wiki/Dots_per_inch



dp 또는 dip (Density-independent Pixels)

화면의 크기를 기준으로 표시. 어떤 화면의 크기에서도 동일한 크기를 표시 하게 된다.
스크린의 픽셀과  dp가 160인 경우에는 1dp는 1pixel과 같다. 그러나 dpi가 240인 경우에는 1dp는 1.5pixel이 된다.

계산 공식은 아래와 같다

dp = pixel / (density / 160)

내 화면의 dp를 구하기 위해서는 아래와 같이 WindowManager를 쓰면 된다.

DisplayMetrics outMetrics = new DisplayMetrics();    getWindowManager().getDefaultDisplay().getMetrics(outMetrics);

int sum = outMetrics.densityDpi;




sp (Scale-independent Pixels)

dp의 비슷하다. 다만 사용자가 선택한 글꼴 크기에 의해 크기가 조절된다.




pt

1/72 인치 기반의 물리적 화면 사이즈, 인쇄에서 쓰이던 크기, 안드로이드 화면에서는 잘 사용되지 않는다.



px (Pixels)

스크린의 실제 픽셀 단위를 사용. 실제 크기나 밀도와 상관 없음




mm (Millimeters)

화면의 물리적 사이즈 기반으로 밀리미터를 사용



in (Inches)

화면의 물리적 사이즈 기반으로 인치를 사용




비교표



저해상도 화면 고해상도 화면에 같은 크기
물리적 넓이 1.5 인치 1.5 인치
dpi (Dots Per Inch) 160 240
px (Pixels) 240 360
밀도 (기본값 160) 1.0 1.5
dip 또는 dp (Density-independent Pixels) 240 240
sip 또는 sp
(Scale-independent pixels)
사용자 폰트 설정 사이즈 따름 동일
px (Pixels) 40픽셀을 1인치에 표시 40픽셀을 0.66인치에 표시
mm (Millimeters) 1 밀리미티 1밀리미티
in (Inches) 1 인치 1인치

참고로 아래는 DPI의 치수를 편하게 계산해 주는 사이트 입니다.

http://members.ping.de/~sven/dpi.html  
저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
TAG Android, dip, dp, DPI, SP
Posted by 신규하
2011/10/04 16:58

오디오 볼륨 조정하기.. Programming/Android2011/10/04 16:58

안드로이드 앱을 짜다 보면, 미디어의 불륨을 조정해야 할 때가 있습니다.
그런데 불륨 조정을 누르면 당황스럽게 벨소리 볼륨이 조정이 됩니다.

그걸 다른걸로 조정하고 싶을 경우에는 아래와 같이 onCreate에 setVolumeControlStream을 넣어 주시면 됩니다.

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setVolumeControlStream(AudioManager.STREAM_MUSIC); // 하드웨어 볼륨이 미디어 볼륨을 조절
    }
설정할 수 있는 키는 아래와 같습니다.
  • AudioManager.STREAM_ALARM : 알람 볼륨.
  • AudioManager.STREAM_DTMF : DTMF 톤 볼륨.
  • AudioManager.STREAM_MUSIC : 미디어 볼륨입.
  • AudioManager.STREAM_NOTIFICATION : 알림 볼륨.
  • AudioManager.STREAM_RING : 벨소리 볼륨.
  • AudioManager.STREAM_SYSTEM : 시스템 볼륨.
  • AudioManager.SYSTEM_VOICE_CALL : 음성 통화 볼륨.

또 다른 방법으로는 아래와 같이 키를 가로채서도 동작이 가능 합니다.
    private AudioManager audio;
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        audio = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
    }
   
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
        case KeyEvent.KEYCODE_VOLUME_UP:
            audio.adjustStreamVolume(AudioManager.STREAM_MUSIC,
                    AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
            return true;
        case KeyEvent.KEYCODE_VOLUME_DOWN:
            audio.adjustStreamVolume(AudioManager.STREAM_MUSIC,
                    AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI);
            return true;
        }
        super.onKeyDown(keyCode, event);
        return true;
    }

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
TAG Android, Audio
Posted by 신규하

다운로드 받은 MP3 음악들을 구글뮤직에 올리거나, 아이튠즈에 넣고 플레이 하다 보면,
꼭 한글이 깨지는 파일들이 있습니다.
참.. 우울하죠..
아이튠즈에서 변경하는 방법도 있지만, 그것보다는 편하게 하는 어플이 있어서 적어 봅니다.



UnicodeRewriter라는 어플입니다.

홈페이지에 가서 다운로드 받고 jar 파일을 더블클릭해서  설치 하시면 됩니다.
어플리케이션 > Unicode Rewriter > bin > UnicodeRewriter.jar
를 실행하시면 스샷과 같은 화면이 뜨고,
Browse 버튼을 누르고, 바꾸실 mp3 파일이나 폴더를 선택하고 Convert를 누르면 끝입니다.
전 귀찮아서 mp3가 있는 폴더를 선택하고 통재로 convert를 눌러서 변경합니다.
저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
TAG MP3, tag, 한글
Posted by 신규하
2011/08/30 10:41

OSX의 터미널 대체 어플 iTerm2 컴퓨터/OSX2011/08/30 10:41


OSX의 기본 터미널이 조금 아쉬워서 검색을 해 봤더니.. 바로 나오네요.
iterm2
무료에 오픈소스 입니다.
한글 지원도 문제 없고, 무엇보다.. 마음에 드는건 화면 분할을 지원 한다는 겁니다.
쉘 코딩하다가.. 실행 할려고 하면 창전환이나 탭 전환을 했었는데..
이 터미널이면 그게 바로 해결 되네요..

기본 터미널이 부실하고 뭔가 아쉽고, 느리다고 생각하시던 분은 바로 바꿔 보세요.

화면 분할 방법
좌우 분할은 command+D, 상하 분할은 shift+command+D 입니다.
그리고 분할한 다음에 이동은 alt+command+방향키 입니다.


더보기




저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하
2011/08/29 11:21

Lion에서 Python PIL 사용하기 iOS/iPhone2011/08/29 11:21

예전 파이션을 이용한 아이폰4용 이미지 컨버팅 스크립트를 사용하는 PIL라이브러리를 사용 했습니다.
그런데 Lion으로 버전이 올라가면서 PIL 설치가 잘 안 되서..
이래저래 찾아 봐서 해결 했습니다.
그리고 그 내용을 정리 합니다.


먼저 v8c of jpeg 를 받아서 컴파일을 해 줍니다.
혹시 안 받아 질 경우에는 제일 마지막에 업로드 해 놨으니.. 그 파일을 받으세요.

컴파일은 아래와 같이 진행 하시면 됩니다.

sudo make clean
CC="gcc -arch i386" ./configure --enable-shared --enable-static
make
sudo make install

컴파일 완료 후 PIL을 설치해 줍니다.

sudo easy_install pip
sudo ARCHFLAGS="-arch i386 -arch x86_64" pip install PIL

이렇게 해주면 끝입니다.

참고

다운로드

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하
2011/08/26 12:05

iOS 캡쳐 자동화 하기 iOS/iPhone2011/08/26 12:05

아이폰 시뮬레이터 캡쳐 받기 - iOS-Simulator Cropper 포스팅에서 마지막에 스크립트로 자동화 하기가 있었습니다.
사이트에서는 그냥.. 캡쳐만 대체해 주면 잘 된다고 했는데 -_-;
잘 되질 않더군요.
코드도 손 볼 부분도 좀 있고 해서..
나름대로 수정을 했습니다.


먼저 자동화 된 캡쳐를 받기 위해서는 소스코드에 NSLog를 등록 합니다.

형식은 3가지를 지원 합니다.
그냥.. 일반적인 캡쳐
NSLog(@"screenshot mainmenu.png");
앞 쪽과 뒤쪽은 숫자는 자동으로 증가 합니다.

NSLog(@"screenshot -once mainmenu.png");
-once를 넣어 주시면 딱 한번 만 캡쳐를 받아 줍니다.

NSLog(@"screenshot -delay 4.0 mainmenu.png");
-delay를 넣어 주시고 뒤에 숫자를 넣어 주시면, 숫자 만큼 초가 지난후에 캡쳐를 받아 줍니다.
위에서 받은 캡쳐는 4초 후에 캡쳐가 받아 지겠죠?


첨부파일 다운로드 :

우선 첨부 파일을 다운로드 받아서, 더블클릭해서 압축을 푸시거나,
쉘이 편하신 분은 터미널에서

$ tar -zxvf iOS-Simulator-Screenshot.tgz

이렇게 해서 압축을 푸시면 됩니다.
그리고 해당 경로로 이동 후

./iOSCapture.sh [캡쳐 할 경로]

이렇게 실행하시면 됩니다.


이미지에서는 바탕화면에 캡쳐 하도록 되어 있습니다.

그리고 시뮬레이터를 실행 시켜 주시면, 해당 타이밍에 착착~ 캡쳐를 받아 줄겁니다.
참 쉽죠?

아래는 코드를 적어 봅니다.
iOSCapture.sh
#!/bin/bash
# 아이폰 캡쳐 자동화
#
# 사용법
#
# $ iOSCapture.sh [저장 경로]
#
# 예) iOSCapture.sh ~/Desktop
#
#-------------------
# 어플리케이션 추가
#
# * 캡쳐 하기
#     NSLog(@"screenshot mainmenu.png");
# * 한번만 캡쳐 하기
#     NSLog(@"screenshot -once mainmenu.png");
# * 2초후에 캡쳐 하기
#     NSLog(@"screenshot -delay 2.0 mainmenu.png");
#
# 참고 :
#     http://stackoverflow.com/questions/1360552/automate-screenshots-on-iphone-simulator/1579182#1579182

# 사용법에 대한 함수.
function usage()
{
    echo "`basename $0` [-h] [targetPath]"
    echo "    -h : 도움말"
    echo "    targetPath : 저장 할 경로"
}

while getopts :hr: optname ;do
    case $optname in
        h)
            usage; exit 1;;
    esac
done

tail -f -n0 /var/log/system.log | ./iOSLogGrab.py $1



iOSLogGrab.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import string
import re
import os
import threading

from collections import defaultdict

captureApplication = "./iOS-Simulator\ Cropper.app/Contents/MacOS/iOS-Simulator\ Cropper"
defaultPath = "."

def screenshotRun(filename):
    command_line = captureApplication + " -p 1 -f " + filename
    print command_line
    os.system(command_line)

def screenshot(filename, select_window=False, delay_s=0):
    t = threading.Timer(delay_s, screenshotRun, [defaultPath+"/%s" % filename])
    t.start()

def handle_line(line, count=defaultdict(int)):
    params = parse_line(line)
    if params:
        filebase, fileextension, once, delay_s = params
        if once and count[filebase] == 1:
            print 'Skipping taking %s screenshot, already done once' % filebase
        else:
            count[filebase] += 1
            number = count[filebase]
            count[None] += 1
            global_count = count[None]
            file_count_string = ('-%02d' % number) if not once else ''

            filename = '%02d.%s%s.%s' % (global_count, filebase, file_count_string, fileextension)
            print 'Taking screenshot: %s%s' % (filename, '' if delay_s == 0 else (' in %d seconds' % delay_s))
            screenshot(filename, select_window=False, delay_s=delay_s)

def parse_line(line):
    expression = r'.*screenshot\s*(?P<once>-once)?\s*(-delay\s*(?P<delay_s>\d*(\.?\d*)))?\s*(?P<filebase>\w+)?.?(?P<fileextension>\w+)?'
    m = re.match(expression, line)
    if m:
        params = m.groupdict()
        #print params
        filebase = params['filebase'] or 'screenshot'
        fileextension = params['fileextension'] or 'png'
        once = params['once'] is not None
        delay_s = float(params['delay_s'] or 0)
        print str(delay_s)
        return filebase, fileextension, once, delay_s
    else:
        #print 'Ignore: %s' % line
        return None

def main():
    try:
        while True:
            handle_line(raw_input())
    except (EOFError, KeyboardInterrupt):
        pass

if __name__ == '__main__':
    if len(sys.argv) > 1:
        print "default path : " + sys.argv[1]
        defaultPath = sys.argv[1]
        print defaultPath
    main()


참고 :


저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하


간간히 블로그에 글을 쓰거나 앱을 올릴때 캡쳐를 받아야 하는데.. 이런걸 쉽게 해 주는 어플리케이션이 있어서 포스팅을 해 봅니다.

이 어플을 사용하면 아이폰과 아이패드 시뮬레이터의 사진을 종류별로 받을 수가 있습니다.
거기다, 내용물만 쓰고 테두리는 iPhone 3 모양으로도 출력을 해 줍니다.

홈페이지 바로가기





그리고 터미널 모드도 지원해서 자동화 해서 캡쳐도 가능 합니다.
파이썬을 이용해서, NSLog로 나오는 메시지를 봐서 캡쳐를 받는 형식으로 자동으로 캡쳐 형식입니다.
순간적으로 나오는 화면이나 동작 중간이라서 캡쳐 받기 곤란한 화면이 있을 경우에는 이걸 이용하면 정말 좋겠네요.

방법은 아래는 참고 하시면 됩니다.



글을 쓰고 나서, stackoverflow의 글에 좀 오류가 좀 있고, 약간 수정하게 있어서 새로 포스팅 했습니다.
iOS 캡쳐 자동화 하기 를 참고 하세요
저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하



Core Animation transitions을 사용하는 FTUtils 입니다. 


블럭이나 재스쳐 애니메이션을 사용할 때 도움일 될 만한 메서드와 프로퍼티를 볼 수 있습니다. 그리고 NSArray와 NSMutableArray 오브젝트를 이용해서 되돌리기도 지원 합니다.


프로젝트에서는 라이브러리 형태로 컴파일 해서 사용하라고 되어 있는데, 소스가 많지 않아서, 그냥 프로젝트에 Headers와 Classes 파일을 복사해서 사용하는게 더 편해 보입니다.


다운로드

gitHub : FTUtil project.


저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하


OS X가 라이언으로 올라 가면서 나눔고딕 폰트가 기본 폰트로 들어갔습니다.
이 폰트를 OS의 폰트로 사용하는 방법입니다.

터미널을 열고 3줄 복사해서 넣어 주시면 됩니다.

먼저 응용프로그램 > 유틸리티 > 터미널을 열어 줍니다.

그리고 아래와 같이 입력해 줍니다.

sudo su -


라고 입력 하면 Password: 라고 뜨고, 계정의 암호를 입력 해 줍니다.

그리고 아래를 복사해서 넣어 줍니다.
cp /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/CoreText.framework/Versions/A/Resources/DefaultFontFallbacks.plist /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/CoreText.framework/Versions/A/Resources/DefaultFontFallbacks.plist.org

이건 백업을 위한 작업입니다. 혹시나 ~ ^^;

마지막으로 아래를 복사해서 넣어 주시면 끝납니다.
vi -e -c ":%s/<string>AppleGothic/<string>NanumGothic/g" -c ":wq" /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/CoreText.framework/Versions/A/Resources/DefaultFontFallbacks.plist

그리고 마지막으로 컴퓨터를 재시작 하시거나, 로그아웃하시고 다시 로그인 하시면 됩니다.

참 쉽죠?

추가로 백업이 필요 없으신 분도 계시죠?
이럴때는 터미널을 띄우시고 아래를 복사해서 붙여 넣기 해 주시면 됩니다.

sudo vi -e -c ":%s/<string>AppleGothic/<string>NanumGothic/g" -c ":wq" /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/CoreText.framework/Versions/A/Resources/DefaultFontFallbacks.plist
그리고 패스워드 입력 & 재시작~
한줄이면 끝나죠? ^^*

혹시 몰라서 원복도 적어 봅니다.
sudo vi -e -c ":%s/<string>NanumGothic/<string>AppleGothic/g" -c ":wq" /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/CoreText.framework/Versions/A/Resources/DefaultFontFallbacks.plist


참고 문헌 : http://clien.career.co.kr/cs2/bbs/board.php?bo_table=lecture&wr_id=87413
저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하

OSX로 바꾸면서 한영 전환를 shift-space로 하는 방법이 약간 달라졌습니다.

여기서 준비물이 있는데, .plist 파일을 수정해 주기 위해서 xcode를 받아서 설치해 주시거나,
Property List Editor를 받아서 설치해 주시면 됩니다.

우선 ~/Library 폴더가 보이지 않네요.

터미널을 띄워서 ~/Library폴더를 먼저 보이게 해 줘야 합니다.
응용프로그램 > 유틸리티 > 터미널 을 선택해서 터미널을 띄워 주시고 아래와 같이 입력해 줍니다.

chflags nohidden ~/Library/



이렇게 입력하고 나면 보이지 않던 라이브러리 폴더가 보입니다.


여기서 ~/Library/Preferences/com.apple.symbolichotkeys.plist 파일을 찾아서 열어 줍니다.
60 > value > parameters > Item 2의 값을 1048576에서 131072로 변경합니다..
61 > value > parameters > item 2의 값을 1572864에서 131072로 변경합니다. (metapho님 좋은 팁 감사합니다.)




이제는 맥을 재부팅해 주시면, 단축키가 변경 된 것을 보실 수 있습니다.

그리고 라이브러리 폴더가 다시 안 보이길 원하시는 분은

chflags hidden ~/Library


이렇게 입력해 주시면 됩니다.


저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하


어쩌다가 보니.. 지금 쓰고 있는 PC가 회사와 집에서 옮겨 가면서 쓰고 있습니다.
거기다가, mac과 윈도우를 혼용해서 쓰고 있는 상황이라서.
요즘 요긴하게 쓰고 있는게 바로 클라우드 서비스 입니다.
덕분에 USB나 하드로 파일 옮기는 일이 없어지고,
여러 컴퓨터와 모바일 기기에서 파일 보는게 자유로워 졌죠.

그 중에서 용량을 많이 주는 Daum 클라우드를 주로 쓰고 있었습니다.

하지만, 지금 제 컴퓨터에 깔려있는 클라우드 서비스만 해도..
Daum 클라우드, uCloud, Naver N드라이버, DropBox -_-;;
이렇게 4개나 깔려 있네요..
정리 좀 해야 하는데,

정리 할려는 찰나에 tistory에서 대박 이벤트를 진행하네요.
@tistory.com 이메일을 만들면, 이메일로 클라우드 해서 200기가.. 각각 100기가씩 준답니다.
이번 이벤트 당첨되면 100기가가 된다면, 다음클라우드 하나로 통일해 버릴렵니다..

1만명
이나 준다는데.. 설마 저두 끼겠죠~
제발~~~



PS. 그런데 Daum 클라우드 아이패드 버전은 안 나오나요?
저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하


ShareKit
은 iOS에서 이미지, 텍스트, URL, 파일을 공유해 주는 오픈소스 프레임워크 입니다.
공유 할 수 있는 곳도 다양합니다.
Delicious, Email, Facebook, Google Reader, Instapaper, Pinboard, Read It Later, Tumblr, Twitter
이 많은 곳을 이 ShareKit  하나로 다 사용할 수 있습니다.

인터넷으로 어플을 공유 하고 싶다면 꼭 이용해 보세요.



사용하는 것도 쉽습니다.
홈페이지에서는 15분이면 된다고 하는데..
그건 좀...

홈페이지

github 홈페이지에서 소스를 받으실 분은



저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하
2011/06/10 15:58

UILabel 글씨에 테두리선 그리기. iOS/iPhone2011/06/10 15:58

UILabel의 글씨에 테두리선 그리기 입니다.





UIOutlineLabel.h
#import <Foundation/Foundation.h>


@interface UIOutlineLabel : UILabel {
    UIColor *outlineColor;
    CGFloat outlineDeep;
}

@property (nonatomic, retain)     UIColor *outlineColor;
@property (nonatomic) CGFloat outlineDeep;

@end


UIOutlineLabel.m
#import "UIOutlineLabel.h"

@implementation UIOutlineLabel
@synthesize outlineColor, outlineDeep;

- (id) initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.outlineColor = [UIColor blackColor];
        self.outlineDeep = 3;
    }
    return self;
}

-(void)drawTextInRect:(CGRect)rect {
   
    CGSize shadowOffset = self.shadowOffset;
    UIColor *textColor = self.textColor;
   
    CGContextRef c = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(c, self.outlineDeep);
    CGContextSetLineJoin(c, kCGLineJoinRound);
   
    CGContextSetTextDrawingMode(c, kCGTextStroke);
    self.textColor = self.outlineColor;
    [super drawTextInRect:rect];
   
    CGContextSetTextDrawingMode(c, kCGTextFill);
    self.textColor = textColor;
    self.shadowOffset = CGSizeMake(0, 0);
    [super drawTextInRect:rect];
   
    self.shadowOffset = shadowOffset;
}

@end

사용법
    UIOutlineLabel *test = [[[UIOutlineLabel alloc] initWithFrame:CGRectMake(10, 10, 200, 30)] autorelease];
    test.text = @"Outline Test";
    test.outlineDeep  = 3;
    test.textColor = [UIColor whiteColor];
    test.outlineColor = [UIColor redColor];
    test.textAlignment = UITextAlignmentCenter;
    [self.view addSubview:test];


저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하

gvim에서 유니티의 도움말을 보기 위해서..
웹브라이저를 띄우는 방법을 열심히 찾다가..
결국 괜찮은 플러그인을 찾았습니다.

이걸 이용하면, 웹페이지 띄우기와 웹검색이 가능 합니다.
여기서 unity의 도움말을 보기 위해서는 플러그인에 몇 줄을 추가해 줘야 합니다.

압축을 풀고 autoload/openbroswer.vim 파일을 열어서..
110번째 줄에 unity 사이트를 추가해 주시면 됩니다.

let s:default = {
\   'google': 'http://google.com/search?q={query}',
\   'yahoo': 'http://search.yahoo.com/search?p={query}',
\   'unity': 'http://unity3d.com/support/documentation/ScriptReference/30_search.html?q={query}',
\}

이렇게 추가하고 나고 띄울려고 하면.. 역시 좀 귀찮죠..
확장자가 .js나 .cs일때 F1을 누르면, 도움말을 보도록 설정 합니다.
au BufNewFile,BufRead *.js,*.cs :noremap <F1> :silent OpenBrowserSearch -unity <C-R>=expand("<cword>")<CR><CR>
이렇게 해 두면, 편하게 도움말을 띄워 볼 수 있습니다.

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하
2011/05/25 10:56

NSString 암호화 iOS/iPhone2011/05/25 10:56

암호화 할 일이 있어서 제작한 NSString 카테고리를 올려 봅니다.

암호화 하는 방법은
원본 스트링 -> AES256 인코딩 -> base64 인코딩 -> 암호화 된 스트링

역으로 하는건
암호화 된 스트링 -> base64 디코딩 -> AES256 디코딩 -> 원본 스트링

이런 식으로 진행하게 됩니다.
뭐.. 결국은 인터넷에 굴러 다니던 AES256 방법과 base64를 조합한 정도 ^^;;
하지만, 유용해서.. 올려 봅니다.

사용 방법은
클래스들을 프로젝트에 추가하고 NSString+Encrpyt.h를 import합니다.

#import "NSString+Encrypt.h"


그리고 간단하게 아래와 같이 사용 하시면 됩니다.
NSString *str = @"아무도모르게";
NSLog(@"암호화 : %@", [str encryptWithKey:@"key"]);
NSLog(@"복원 : %@", [[str encryptWithKey:@"key"] decryptWithKey:@"key"]);

실행 결과
2011-05-25 10:45:21.394 EncryptSample[38057:207] 암호화 : HVxuorZdmdYtEZUS2PUJia20yCLh6SwLe8+sLBhSMWs=
2011-05-25 10:45:21.396 EncryptSample[38057:207] 복원 : 아무도모르게

소스

샘플 프로그램


참고 사이트


저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하

음성이 파일이 필요해서, 파이썬 스크립트를 작성해 봤습니다.

아래는 2가지 인데.. 한개는 사전에서 음성을 받아 오는 거고, 2번째는 구글 번역에서 받아 옵니다.
둘다 음성 파일의 파일 목록이 필요 합니다.




구글 사전에서 음성 파일 받아 오기.
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import string
import os
import shutil
import codecs

if len(sys.argv) is 1:
    print >> sys.stderr, '읽을 파일명을 입력해 주세요'
    print ''
    print '* 파일의 내용'
    print '\t[원본 파일명]
    print ''
    print '* 사용예'
    print '\t./getWordSound.py [목록 파일 이름]'
    exit(1)

try:
    f = codecs.open(sys.argv[1], "r", "utf-8") # 파일 오픈
except IOError:
    print >> sys.stderr, '그런 파일이 없거나, 열기 에러입니다.'
    exit(1)

topath = "mp3"
if    os.path.exists(topath) == False:
    os.mkdir(topath, 0755)

for line in f.readlines():
    word =  line.strip('\n\r').strip();
    url = "http://www.gstatic.com/dictionary/static/sounds/de/0/"+word+".mp3"
    print url
    os.system("wget -P "+topath+" "+url)

구글 번역에서 TTS 음성 받아 오기
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import string
import os
import shutil
import codecs

if len(sys.argv) is 1:
    print >> sys.stderr, '읽을 파일명을 입력해 주세요'
    print ''
    print '* 파일의 내용'
    print '\t[음성 파일 스크립트]'
    print ''
    print '* 사용예'
    print '\t'+sys.argv[0]+' [목록 파일 이름]'
    exit(1)

try:
    f = codecs.open(sys.argv[1], "r", "utf-8") # 파일 오픈
except IOError:
    print >> sys.stderr, '그런 파일이 없거나, 열기 에러입니다.'
    exit(1)

topath = "mp3"
if    os.path.exists(topath) == False:
    os.mkdir(topath, 0755)

os.chdir(topath)
for line in f.readlines():
    script = line.strip()
    if script.startswith(u'\ufeff'):
        script = script[1:]
    url = "\"http://translate.google.com/translate_tts?tl=en&q="+script+"\""
    output = "\""+script+".mp3\""
    getCommand = "wget -U firefox "+url+" -O "+output
    print getCommand
    os.system(getCommand)

그런데 이렇게 받은 음성의 라이센스를 아시는 분 있으신가요?
구글에 문의를 해 봤는데.. 함흥차사네요..
내 영어가 너무 구린가? ㅜ.ㅜ
저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하
2011/04/26 14:06

UIImage를 흑백 이미지로 바꾸기 iOS/iPhone2011/04/26 14:06

UIIamge를 흑백으로 바꾸는 방법을 찾다가..
찾은 내용 입니다.
참고 하세요.

-(UIImage*)convertImageBlackAndWhite:(UIImage *)image
{
    CGColorSpaceRef colorSapce = CGColorSpaceCreateDeviceGray();
    CGContextRef context = CGBitmapContextCreate(nil, image.size.width, image.size.height, 8, image.size.width, colorSapce, kCGImageAlphaNone);
    CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
    CGContextSetShouldAntialias(context, NO);
    CGContextDrawImage(context, CGRectMake(0, 0, image.size.width, image.size.height), [image CGImage]);
   
    CGImageRef bwImage = CGBitmapContextCreateImage(context);
    CGContextRelease(context);
    CGColorSpaceRelease(colorSapce);
   
    UIImage *resultImage = [UIImage imageWithCGImage:bwImage];
    CGImageRelease(bwImage);
    return resultImage;
}

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하
2011/04/25 09:34

UIView에서 Subview 지우기 iOS/iPhone2011/04/25 09:34

아이폰 프로그램을 사용하면서 가장 자주 쓰게 되는 view에서 subview를 지우는 방법을 간단하게 정리해 봅니다.


먼저 샘플로 라벨을 올려 봅니다.
// UILabel 생성하기
UILabel *aLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 15, 40, 20)];
// label에 태그 넣기
aLabel.tag = 1;
// 글자쓰기
aLabel.text = @"Hello World";
// 라벨을 뷰에 올리기
[self.view addSubview:aLabel];

하위에 있는 뷰 모두 지우기 1

// With some valid UIView *view:
for(UIView *subview in [self.view subviews])
{
    [subview removeFromSuperview];
}


하위에 있는 뷰 모두 지우기 2
while ([self.view.subviews count] > 0)
{
    [[[self.view subviews] objectAtIndex:0] removeFromSuperview];
}


지정한 태그의 subview 지우기
[[self.view viewWithTag:1] removeFromSuperview];


지정 태그 이외의 subview 지우기
for (UIView *subview in [self.view subviews])
{
    if (subview.tag != 1) {
        [subview removeFromSuperview];
    }
}


특정 클래스의 subview 지우기
for(UIView *subview in [self.view subviews])
{
    if([subview isKindOfClass:[UILabel class]])
    {
        [subview removeFromSuperview];
    }
}




저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하

이제는 SK에서도 아이폰이 나오니.. 슬슬 필요 하지 않을까 싶어서
적어 봅니다.
아래 코드를 이용하면, 핸드폰의 국제 설정이 아니라, 서비스의 위치로 사용 할 수도 있습니다.

먼저 프로젝트에서 CoreTelephony.framework를 추가해 줍니다.

그리고 아래와 같은 코드를 넣어 주시면 됩니다.

#import <CoreTelephony/CTCarrier.h>
#import <CoreTelephony/CTTelephonyNetworkInfo.h>

CTTelephonyNetworkInfo *networkInfo = [[[CTTelephonyNetworkInfo alloc] init] autorelease];
CTCarrier *carrier = [networkInfo subscriberCellularProvider];

// 사업자 이름 알아오기
NSString *carrierName = [carrier carrierName];
if (carrierName != nil)
    NSLog(@"Carrier: %@", carrierName);

// 모바일 국가코드 알아 오기
NSString *mcc = [carrier mobileCountryCode];
if (mcc != nil)
    NSLog(@"Mobile Country Code (MCC): %@", mcc);

실행해 보시면 아래와 같이 나타납니다.

app[2191:707] Carrier: KT
app[2191:707] Mobile Country Code (MCC): 450

그리고, 국가 코드표는 아래를 참고 하세요.

Wikipedia Mobile Country Codes


저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 신규하