설치

시작하기 전에 다음 명령으로 시스템에 설치되어 있는 wine을 제거합시다

sudo apt-get autoremove wine --purge

.wine 폴더도 제거합시다

sudo rm -rf ~/.wine

wine의 최신 버전을 다운로드 할 수 있도록 wine 저장소를 추가하고, 설치합니다

sudo add-apt-repository ppa:ubuntu-wine/ppa
sudo apt-get update && sudo apt-get install wine

이제 wine의 설치가 끝났으며 사용할 준비가 됬습니다. 만 이대로 사용하기에는 문제가 있습니다. 이 상태로 64비트 우분투에서 wine을 실행하면, 제대로 작동하는 32비트 wine을 사용하지않고 오류가 많은 64비트 wine을 사용하게됩니다. 32비트 우분투에서도 wine으로 게임이나 포토샵 같은 프로그램을 사용하기에는 꼭 필요한 DLL과 라이브러리가 부족합니다.

설정

최신버전의 wine을 설치하고 나서, home 폴더에 .wine 폴더를 만드는 winecfg을 실행합시다

터미널을 열고 다음을 입력하세요


옮긴이 주 - 다음 명령어는 최근에 개발되었거나 사용중에 있는 프로그램을 위해서는 실행하실 필요는 없는 듯 보입니다.

WINEARCH=win32 winecfg

만약 gnome-keyring-pkcs11.so 파일을 못찾겠다고 하면 이 곳을 클릭하여 문제점을 해결받으시길 바랍니다.

.wine 폴더가 생성되고 난 후에 wine의 기능을 완벽하게 사용하기 위한 필요한 DLL과 라이브러리를 설치할 수 있습니다. 제일 먼저 winetricks로 할 일은 필요한 DLL과 라이브러리를 쉽게 설치할 수 있는 스크립트를 사용하는 것입니다.

터미널을 열고 다음 명령어를 입력하세요

cd ~/.wine
wget http://winetricks.googlecode.com/svn/trunk/src/winetricks

받은 스크립트를 사용할 수 있게 합시다

chmod +x ./winetricks

이제 필요한 DLL과 라이브러리를 설치할 것입니다.

시스템에 필요하지 않은 것들은 제거 할 수 있다는 걸 잊지 마세요

./winetricks dotnet20 droid winxp sound=alsa volnum vcrun2008 ie6 corefonts

<!----------------------------------- 수정된 내용 -----------------------------------!>

다음은 카카오톡을 위해서 설치해야 할 winetricks 목록 입니다.

./winetricks wmp9 riched20


wmp9은 메세지 알림을 위해서, riched20은 한글 입력을 위해서 필요한 듯 합니다.

다음은 폰트 설치 입니다. 우선 gulim.ttc를 구합니다. 그리고 다음을 순서대로 진행합니다.

mv gulim.ttc ~/.wine/drive_c/windows/Fonts


cd ~/.wine/drive_c/windows/Fonts


ln -s gulim.ttc batang.ttc

ln -s gulim.ttc dotum.ttc

그리고 system.reg파일을 수정합니다.

vi ~/.wine/system.reg


find "MS Shell Dlg" and modify


"MS Shell Dlg"="Tahoma" --> "MS Shell Dlg"="Gulim"

"MS Shell Dlg 2"="Tahoma" --> "MS Shell Dlg 2"="Gulim"

<!----------------------------------- 수정된 내용 -----------------------------------!>


Nvidia 그래픽 카드를 사용하고 있다면, physx 기술을 설치해야 합니다

./winetricks physx

이제 wine설치를 끝내고 최신 윈도우 응용프로그램을 설치할 수 있도록 하는 설정까지 마쳤습니다

이제 최신 게임 플레이를 위한 설정을 해야하는데 해당하는 레지스트리 키가 보이지 않아 스킵합니다.

Install and configure wine to Play latest windows games in Linux - M. Zinoune(Unixmen)

이제 wine으로 윈도우 응용 프로그램을 설치하고 사용할 수 있습니다


저작 : 블랙캣닷컴( http://blog.bloodcat.com/ )

Posted by gofly

댓글을 달아 주세요

  1. Favicon of https://belong2jesus.tistory.com BlogIcon gofly 2013.04.09 13:36 신고  댓글주소  수정/삭제  댓글쓰기

    개인적으로 WINEARCH=win32 winecfg는 하지말고 그냥 winecfg을해서 64bit로해도 될 것 같네요;;;;;; win32로 어떤 부분에서 문자가 잘못써지는 문제가 있는듯 합니다.
    ;;;;;

  2. Favicon of https://belong2jesus.tistory.com BlogIcon gofly 2015.01.21 10:26 신고  댓글주소  수정/삭제  댓글쓰기

    다음의 블로그 포스팅에 Wine 으로 카카오톡 설치하는 부분을 보시면 도움이 많이 되실 것입니다.

    http://blog.nacyot.com/articles/2014-01-18-ubuntu-setting/#toc--wine-

Apache Jakarta(이하 Web Server)와 Apache Tomcat(이하 WAS)로 구성되어 있는 홈페이지가 꾀 존재하는 것으로 알 고 있다.

그런데 이런 홈페이지 중에 금저의 이유로 L4를 쓰지 못해 L4와 유사 기능을 하는 소프트웨어를 설치하여(HA-Proxy) 로드발란싱과 Fail-Over 기능을 대체하고 있습니다.


그런데 HA-Proxy를 거쳐서 Web Server를 통하여 ajp1.3으로 WAS와 연동하는 구조에서 Web Server 까지는 Client의 실제 IP를 X-Forwarded-For라는 X-Host Header 정보로 확인이 가능하지만 Web Server에서 WAS로 보내지는 Reqeust에서는 이 X-Host Header 정보가 보내지지 않아 IP Filter 작업을 할 때 애를 먹게 되는 경우가 있습니다.



구성도시스템 구성도


위 구성도에서 보면 HA-Proxy1에서 Web Server와 통신할 때에는 HTTP 통신이기 때문에 Client의 실제 IP를 확인할 수 있습니다. 하지만 HA-Proxy2에서는 Web Server와 WAS의 통신이 AJP 1.3이라는 TCP/IP통신을 하게 되면서 실제 클라이언트 IP가 아닌 Web Sever에서 AJP1.3 통신을 하기위한 IP가 Client IP가 되어 WAS에서 확인하게 됩니다.


WAS에서는 Client IP가 Web Server가 됨WAS에서는 Client IP가 Web Server가 됨


이 처럼 HA-Proxy와 같은 소프트웨어 로드밴런싱 도구를 사용하는 경우 WAS에서 Client IP를 알 수 있는 방법은 없습니다. 해서 사용되는 것이 

X-Forwarded-For라는 X-Host 헤더정보 입니다. 사실 Web Server의 입장에서도 WAS와 동일하게 HA-Proxy1이 있는 Server가 Client가 됩니다. 해서 Web Server에서 로그를 남길 때 %h또는 %{c}a 를 할 때 HA-Proxy 서버의 IP가 확인 됩니다. 하지만 %{X-Forwarded-For}를 하면 실제 Client IP가 확인되게 됩니다. 물론 HA-Proxy에서 X-Forwarded-For 헤더정보로 Client IP를 실어서 보낼 수 있도록 설정을 미리 해두어야 합니다.


오늘은 HA-Proxy에서 X-Forwarded-For 헤더로 Client IP를 더하여서 Web Server로 보내고 있다고 가정하고 Web Server의 설정과 WAS의 설정을 확인해 보도록 하겠습니다.


사실 Web Server도 X-Forwarded-For 헤더를 WAS로 보내는 설정만 하면 됩니다. 문제는 mod_jk.so 파일의 버전입니다. mod_jk.so를 추가하고 <IfModule jk_module>에서 JkOptions라는 곳에 옵션으로 +ForwardPhysicalAddress라는 명령어를 추가해야 이 명령어를 추가하면 에러가 발생하는 경우를 보게 됩니다. 그래서 mod_jk의 버전별 ChangeLog를 확인해 보았는데 mod_jk 1.2.39버전부터 ForwardPhysicalAddress 옵션을 JkOptions로 사용할 수 있음을 보게 됩니다. 해서 mod_jk 소스를 최신버전으로 다시 받아서 compile하고 mod_jk.so파일을 변경해 주었습니다.


다음은 mod_jk소스를 받아서 compile하는 과정입니다.


1. 최신 mod_jk.so 컴파일 하기

우선 mod_jk 최신 버전을 다운로드 받습니다(현재 2014-04-22일 최고 버전은 1.2.40 입니다).

[root@localhost ~]# wget http://mirror.apache-kr.org/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.40-src.tar.gz


다운로드된 파일을 압축을 해제합니다.

[root@localhost ~]# tar -zxvf tomcat-connectors-1.2.40-src.tar.gz


압축해제된 디렉토리의 native 폴더로 이동합니다.

[root@localhost ~]# cd tomcat-connectors-1.2.40-src/native/


configure 파일에 apxs위치를 설정해 줍니다. 

[root@localhost native]# ./configure --with-apxs=${webserver.home:web server 설치 디렉토리}/bin/apxs


make 또는 make install 합니다. make install 하게 되면 아파치 홈 디렉토리의 /modules 폴더에 자동을 mod_jk.so파일이 복사된다고 하더군요.

[root@localhost native]# make


[root@localhost native]# make install


하지만 혹시 모르니 그냥 mod_jk.so파일을 아파치 홈 디렉토리의 /modules 폴더에 복사합니다.


자 이제 최신 mod_jk.so는 구했습니다. 다음은 아파치 설정을 하도록 하겠습니다.


2.아파치 설정하기

web server 홈 디렉토리의 설정파일로 이동합니다. 저는 Apache Jakarta(Web Server)를 사용하고 있기 때문에 ${webserver.home}/conf/httpd.conf 파일을 수정하도록 하겠습니다. httpd.conf 파일에 LoadModule하는 부분 마지막에 다음을 추가 합니다.


LoadModule jk_module modules/mod_jk.so


그리고 <IfModule jk_module>에 JkOptions를 추가합니다.


<IfModule jk_module>

        JkWorkersFile ...

        JkShmFile ...

        JkLogFile ...

        JkOptions +ForwardKeySize +ForwardPhysicalAddress +ForwardURIProxy

        JkLogLevel error

</IfModule>


이렇게 JKOptions에 +ForwardKeySize +ForwardPhysicalAddress +ForwardURIProxy 를 추가 합니다. JkOptions에는 어떤 값이 있고 의미하고 있는 것이 무엇인지는 아래 링크를 참조해주시기 바랍니다.


>>JkOptions링크 클릭<<


자 이렇게 한 후에는 한 가지 추가적으로 더 해줘야 할  것이 있습니다. 바로 mod_remoteip.so 파일을 추가해주는 것입니다. 이미 httpd.conf에는 mod_remoteip.so가 있습니다. 주석처리 되어 있는 것을 삭제해 주시면 됩니다. 그리고 이 또한 설정을 해줘야 합니다. 다음은 

<IfModule remote_module>에 대한 설정입니다.


<IfModule remoteip_module>

    RemoteIPHeader X-Client-IP

    RemoteIPInternalProxy 127.0.0.1

</IfModule>


remoteip_module에 대한 설정은 다음 링크를 확인해 주시기 바라빈다. X-Forwarded-For에 대한 내용을 jk_module로 WAS에 보내려면 위와 같이 RemoteIPHeader에 X-Client-IP라고 입력하고 RemoteIPInternalProxy에는 127.0.0.1을 입력합니다.


>>mod_remoteip 링크<<


자 이 것으로 Web Server에서는 모든 설정이 끝났습니다. 이제 WAS에서 request.getHeader("x-forwarded-for")로 Client IP를 확인해 보면 정상적인 Client IP가 확인되게 됩니다.


HA-Proxy에서 X-Forwarded-For를 구성하는 방법은 다음 링크 또는 X-Forwarded-For on HA-Proxy를 구글링 해보시기를 추천듭니다.


>>HA-Proxy 링크<<<


감사합니다.



Posted by gofly

댓글을 달아 주세요

  1. BlogIcon 성현 2015.06.24 18:56  댓글주소  수정/삭제  댓글쓰기

    제가 위와 같은 문제가 발생한 상태인데 글 내용대로 똑같이 따라했는데 잘 안되네요... 혹시 따로 연락 가능하시면 도움좀 받을 수 있을까요?... ㅠ

  2. BlogIcon 성현 2015.06.24 18:56  댓글주소  수정/삭제  댓글쓰기

    제가 위와 같은 문제가 발생한 상태인데 글 내용대로 똑같이 따라했는데 잘 안되네요... 혹시 따로 연락 가능하시면 도움좀 받을 수 있을까요?... ㅠ

/etc/sysconfig/i18n 


파일에 다음과 같이 캐릭터 셋에 맞춰서 정보를 변경합니다.


아래의 폰트는 레드헷 리눅스를 기준으로 합니다.


[UTF-8]

LANG="ko_KR.UTF-8"

SUPPORTED="ko_KR.UTF-8:ko_KR:ko"

SYSFONT="lat0-sun16"

SYSFONTACM="8859-15"


[EUC-KR]

LANG="ko_KR.eucKR"
SUPPORTED="ko_KR.eucKR:ko_KR:ko"
SYSFONT="lat0-sun16"
SYSFONTACM="8859-15"

[출처] 레드햇 한글 설정|작성자 조랑말



저장하고 나면 



$ source /etc/sysconfig/i18n


하시면 됩니다.

Posted by gofly

댓글을 달아 주세요

필자는 갤럭시 노트 2 HD LTE를 사용했을 때에는 우분투에 연결하면 USB 저장소로 인식하여 파일을 넣거나 다시 가져오는 것에 있어서 크게 문제가 되지 않았습니다. 하지만, 갤럭시 S3을 쓰면서 부터는 자꾸 캘럭시 핸드폰에 연결 할 수 없다는 메세지가 나와서 얘를 먹었습니다.




그래서 알아 보니, 최근 안드로이드 진영에서는 예전의 USB Mass Storage protocol을 사용하 던 것과 달리 MTP라는 새로운 프로토콜을 사용하고 있음을 알게 되었고, 이는 애플에서 iTune을 깔아야 iPhone이나 iPad와 소통이 되듯  윈도우에서 스마트 기기와의 소통을 위하여 마련된 전용 프로토콜이라는 것을 알게 되었습니다. 그리고 우분투에서는 적어도 제가 어려움을 겪을 당시에는 이러한 프로토콜을 지원하지 않아서 위와 같은 에러가 지속적으로 났던 것을 알게 되었습니다.


해서 mtp-tools라는 것을 설치하여 이 부분을 어느 정도 해결은 하였지만, 버그가 심해 보였습니다. 스마트 기기의 내부는 읽을 수 있지만, 항상 빠른 반응으로 읽어 지는 것도 아니었으며, 파일을 (스마트 기기에)전송하거나 복사해 올 때 또한 매끄럽지 못한 모습을 보였습니다. 그리고 Go-Mtps라는 것도 있지만, 기사를 읽어 보니 Android 기기를 수동으로 마운트 시켜야 하는 불편함이 있는 것으로 알고 있습니다. 그런데 어제 저는 우연히 다시 이 부분에 대해서 검색을 하게 되었고, webup8 싸이트에 Gvfs를 업그레이드 하면 12.04,12.10의 Nautilus나 Tuna(Ubuntu용 파일 탐색기)에서 Android 4.0+의 기기들을 접근 할 수 있음을 알게 되어 이렇게 글을 써 봅니다.


(출처: UPGRADE TO GVFS WITH MTP SUPPORT IN UBUNTU 12.10 OR 12.04 TO EASILY CONNECT ANDROID 4.0+ DEVICES)


Gvfs는 Ubuntu 13.04에서 Update(갱신)되었으며 사용자가 수락한 MTP Backend로 USB Mass Storage 규약을 지원하지 않는 Adroid 4.0(또는 상위버전)기기지원하기 위하게 되었습니다. 가장 최근의 Gvfs는 1.15.2로 공식적이지 않게 구 Ubuntu를 위하여 출시되었습니다. PPA를 추가하여서 업데이트가 가능합니다.


자 그럼 Gvfs를 업데이트하여 12.04,12.10에서 Android 4.0을 지원해 보도록 하겠습니다.


1.우분투 12.04, 12.10의 Gvfs MTP 비공식 개발자 PPA를 생성을 통하여서 Gvfs(그리고 libmtp)를 추가하는 명령어


Linux terminal:~$:


sudo add-apt-repository ppa:langdalepl/gvfs-mtp

sudo apt-get update


2.이제 소프트웨어 업데이트를 실행합니다(또는 업데이트 메니저). 그리고 존재하는 업데이트 내역들을 모두 업데이트 합니다.


3.모든 업데이트가 끝나면, 컴퓨터를 재부팅합니다. 그리고 잠금(Lock)을 푼상태로 USB를 통하여 Anroid기기를 컴퓨터와 연결합니다.


와~~그랬더니 이제 깔끔하게 Nautilus에서 Adroid 기기의 파일이 보이기 시작했습니다. 감격~~~~



Gvfs 업데이트로 연결된 Adroid 기기Gvfs 업데이트로 연결된 Adroid 기기



오~~파일의 접근이나 나머지 부분도 깔끔하게 잘 작동하는 것을 테스트 하였습니다~~~~

이제는 안드로이드폰도 문제 없이 예전처럼 Ubuntu에서 파일을 넣고 뺄 수 있겠네욬ㅋㅋㅋㅋ


이상 포트팅을 마치겠슴돠~~~~좋은 월요일 되세요












Posted by gofly

댓글을 달아 주세요

  1. BlogIcon 김선생 2013.05.12 03:23  댓글주소  수정/삭제  댓글쓰기

    우분투 12.10인데요. 왜 저는 안드로이드가안뜰까요 ㅜㅜ?
    말씀하신데로 설치했는데....

MyUnity는 Ubuntu의 화면 인터페이스를 이루고 있는 프로그램입니다. 

이 Unity를 내가 원하는 취향으로 조금더 자세히, 그러나 간단하게 조작하기위해서는 MyUnity를 설치하여 사용하는 것을 권합니다.


MyUnity는 terminal에서 "sudo apt-get install myunity"나 우분투 소프트웨어 센터에서 MyUnity라고 검색하면 손쉽게 설치가 가능합니다.


---추가된 부분 -----

만약에 앱이 없다거나 찾을 수 없다고 나온다면 sudo add-apt-repository ppa:myunity/ppa 하시면 됩니다.

---추가된 부분 -----

Unity의 기능을 Tab별로 분류하여 조작할 수 있게 해 두었습니다. 


1. Luancher에서는 화면의 오른쪽에 나타나는 Luancher에 대해서 조작할 수 있습니다.

2. Dash는 Launcher의 우분투 모양 버튼을 누르거나, 키보드의 윈도우표시(Ubuntu 전용 키보드에선 Ubuntu마크이곘죠)를 눌렀을 때 나타나는 Dashbaord에서 3. 조작하고 싶은 것을 조작할 수 있습니다.

4. Panel은 화면의 상단 Bar를 조작할 수 있는 Tab입니다.

5. Desktop은 바탕화면의 전반적인 것을 조작할 수 있습니다.

6. Font는 시스템에서 사용하고 있는 font를 고르고 조작할 수 있습니다.

7. Themes는 우분투의 기본적인 테마를 고르고 조작할 수 있습니다.


MyUnity 홈화면MyUnity 홈화면


MyUnity Credits화면MyUnity Credits화면


이상 블로깅을 마치겠슴돠~~^^

Posted by gofly

댓글을 달아 주세요


Ubuntu Tweak우분투 트윅 홈 싸이트


개인 적으로 생각할 때, Ubuntu를 설치하고 나면 MyUnity와 함께 꼭 설치해야할 필 수 어플리케이션(Application)이 아닌가 생각합니다. Ubuntu Tweak은 http://ubuntu-tweak.com/ 또는 terminal에서 "sudo apt-get install ubuntu-tweak"이라고 하시면 자동으로 설치가 될 것입니다(홈 사이트에서 받으면 *.deb파일을 받아 설치하시면 됩니다).


Ubuntu Tweak 홈화면Ubuntu Tweak 홈화면


Ubnunt Tweak을 설치하고 실행하면 위와 같은 홈 화면이 나타납니다. 여러가지 기능이 있는데 이중에서 중요하게 자주 쓰는 것이 바로 "재니터"입니다.

각종 어플리케이션과 커널(Kernel)을 업데이트하고나면 삭제되지 않고 찌거기가 남기 마련인데 "재니터"를 통하여서 이를 청소 할 수 있습니다.


불필요한 프로그램을 청소해주는 불필요한 프로그램을 청소해주는 "재니터"


재니터의 화면입니다.


그럼 즐 사용하세염~~~^^

Posted by gofly

댓글을 달아 주세요

지난 24일 카카오 그룹에서는 카카오톡(Kakao Tal


k) 베타테스터 모집을 마감하였습니다....^^

저는 신청하였고!!!! 당당히 당첨을....ㅠㅠ 눈물나...ㅋㅋㅋㅋ

해서 받자마자 이렇게 글을 올립니다.....



베타테스터 모집베타테스터 모집



메일로 당첨소식을 받음메일로 당첨소식을 받음


처음에는 반신 반의 하면서 신청했는데 오늘 메일로 모집에 당첨 되었다는 소식을 전해 받고 초고속으로 다운 받아서 설치 하였습니다.

ㅋㅋㅋ 설치 하면서 간략하게 캡쳐하여 블로깅해봅니다.....^^ 아이 좋아~~~~


베타테스터 페이지베타테스터 페이지


[카카오톡 PC 베타 테스트 페이지 바로가기]를 누르면 위에서와 같은 베타 테스터 페이지가 나타납니다. 여기서 로그인 하면

이벤트 화면이 나타납니다. 성실히 베타테스터에 임하는 사람 45명에게 선물을 준다는!!! +_+ 노려 볼까??? ㅋㅋㅋㅋ


카카오톡 베타 설치화면 1카카오톡 베타 설치화면 1


카카오톡 베타 설치화면 2카카오톡 베타 설치화면 2


위의 두 화면은 베타테스터 로그인 후 카카오톡 PC 베타버전을 다운받아 설치하는 화면입니다. 

여려운 부분이 있는 것은 아니니 쉽게 설치가 가능 할 것입니다.


카카오톡 PC베타 로그인카카오톡 PC베타 로그인 화면


설치가 끝나고 나면 로그인 화면이 나타납니다. 여기서 로그인 하는 계정은 카카오톡에 등록한 이메일 계정입니다.

즉, 이메일 계정이 없으신 분은 만들어서 쓰셔야 겠죠?? ^^ ㅋㅋㅋㅋ


카카오톡 PC 친구목록카카오톡 PC 친구목록


로그인을 하면 볼 수 있는 친구 목록입니다. 아마도 카카오톡과 이름이 다를 수 있다고 하네요.....

설명은 위의 것을 눌러보면 되는데 오늘은 간략한 리뷰이니 화면만...^^


카카오톡 PC 대화목록카카오톡 PC 대화목록


채팅목록입니다. 채팅목록은 현재 저의 채팅목록이 나오는데 채팅방을 열어보면 채팅내용은 없습니다....ㅋㅋㅋ

즉, 설치 이후 채팅내용에 대해서만 볼 수 있는 것이죠...^^


카카오톡 PC 설정카카오톡 PC 설정

설정 화면입니다.

"PC인증 해제" 라는 버튼이 보이실 것입니다. 

이 부분을 설명을 하자면 카카오톡 PC베타버전의 인증과정은 마이피플과 인증 부분이 비슷합니다.

카카오톡으로 인증할 것인지 물어봐서 선택하면, 카카오톡으로 인증번호를 보내주는 식이죠....^^

이 것도 간략히 이정도만 리뷰를....^^

카카오톡 PC 채팅방카카오톡 PC 채팅방

마지막으로 채팅창입니다.

이모티콘도 잘되고.....ㅎㅎㅎ 참 맘에 듭니다.

항상 피씨로 작업하는 저에게 카톡이 오면 키보드를 버려두고 가상키보드로 톡을 했어야 하는 불편을 덜어 낼 수 있어서

너무나 좋습니당~~~ㅋㅋㅋㅋㅋㅋㅋ


더욱 더 발 전해서 좋은 메신저로 자리잡길 기대합니다...^^

Posted by gofly

댓글을 달아 주세요

안드로이드의 명령 바이너리 파일들을 /system/bin 폴더에 위치해 있습니다.

Android Terminal Emulator에서 확인 할 수 있습니다.


그런데 cp명령어가 없더군요....;;;;

카피를 해서 어딘가 복사를 하고 싶어도 명령을 찾을 수 없다고 나와서요....


인터넷 이 곳 저 곳을 뒤지다가 cp명령을 대용해서 사용하는 방법이 있더군요


cat source_file > dest_file


이렇게 하면 cp를 대신해서 사용 할 수 있습니다.

">"은 POSIX계열의 Shell명령어 입니다. Redirecting Output이죠...

이렇게 하면 캐취한 원본파일을 밀어 넣기가하면서 복사하고자 하는 곳에 파일이 복사되게 됩니다.



eg.

cat /system/app/Application.apk > /storage/sdcard0/Application.apk



Posted by gofly

댓글을 달아 주세요



1. 군산 히로쓰 가옥
군산은 내게 눈의 도시다. 옛 건물을 찾아 다니는 여행을 하기로 결심한 후 처음으로 방문했던 날도, 한 해의 마지막보내기 위해 갔던 날도 도시는 눈 속에 폭 파묻혀 있었다. 히로쓰 가옥이 복원을 거쳐 다시 방문자들에게 공개된 후 찾았을 때 역시 이 오래된 일본식 목조 주택은 흰 눈을 고스란히 맞은 채 서 있었다. 거부였던 히로쓰 게이샤브로의 옛 집에 발을 디뎠을 때 느꼈던 차가운 바닥의 감촉은 지금도 생생하다. 최예선(<청춘남녀, 백년 전 세상을 탐하다> 저자)

2. 창경궁
2012년이 시작되고 얼마 되지 않은 어느 날, 선배의 부탁으로 웨딩 사진을 찍으러 창경궁에 갔다. 잔뜩 찌푸린 하늘을 보며 걱정했는데 궁 안에 들어서자마자 하늘하늘 눈이 내리기 시작했다. 점점 하얗게 변하는 궁궐을 배경으로 선 커플은 유난히 더 아름다웠다. 흔치 않은 기념 사진을 원했던 선배의 웨딩 촬영은 그렇게 우연히 내린 눈으로 더욱 특별해졌다. 표기식(일러스트레이터 겸 포토그래퍼)

3. 파주 헤이리
5년 전, 부모님께서 파주 헤이리 마을로 이주하셨다. 작년 가을과 겨울, 그러니까 계절의 변화가 가장 뚜렷할 때 그곳에서 지냈는데, 서울에서 나고 자란 내겐 상상 속에서만 존재했던 시골집의 푸근함을 느꼈다. 헤이리 안에 있는 호수는 여름에는 연꽃, 가을에는 갈대, 겨울에는 썰매를 타는 아이들로 가득 찬다. 추운 날씨 탓에 아이들마저 자취를 감춘 어느 겨울날, 꽁꽁 얼어붙은 호수 위에 흰 눈이 소복이 쌓인 풍경을 찰칵 찍었다. 이솔네(포토그래퍼)




4. 화북초등학교 입석분교
경북 상주시 화북면과 충북 괴산군 청천면은 도로 하나를 사이에 두고 나뉜다. 청천면 삼송리에 있는 왕소나무를 보러 간 날 아침, 소나무 밑에서 흠뻑 젖은 마음이 되어서는 이제 막 하루를 시작하려는 동네 주민들을 학교로 장터로 이웃마을로 태워드렸다. 이곳은 길 건너에 있는 화북초등학교 입석분교 운동장. 전교생이 모두 나와 한바탕 눈싸움을 하고 들어간 자리에 목도리 하나가 남아 있었다. 둘둘
말아 교무실에 전했다. 교무실이 참 따뜻했다. 장우철( 피처 디렉터)

5. 무주 덕유산
겨울의 한가운데, 전북 무주의 덕유산에 가면 ‘눈꽃’이라는 예쁜 말을 실감할 수 있다더니 정말 그랬다. 무주 스키장에서 곤돌라를 타고 설천봉(눈 덮인 하늘이라니, 봉우리의 이름마저 시적이다)에서 15분만 걸으면 산 정상인 향적봉에 도착하기 때문에 트래킹이 두려운 사람에게도 걱정 없는 코스다. 곤돌라 안에서 바라보는 눈 쌓인 능선은 굽이굽이 그림처럼 아름다웠다. 이지나(<엄마 딸 여행> 저자)

6. 서울숲
종종 서울숲에 간다. 갈 때마다 도시 한가운데 이런 넓은 녹지가 있다는 사실에 감사한다. 가끔 퇴근길에 성수대교를 건널 땐 노래를 들으며 멀찍이 바라보기도 한다. 눈이 많이 내렸던 지난 겨울에는 하얗게 변한 모습이 궁금해 간편하게 찍을 수 있는 네추라 클래시카 카메라를 메고 서울숲으로 갔다. 앙상한 가지마다 쌓인 하얀 눈, 거세게 불던 한강 바람, 눈 위를 사부작사부작 걷는 사슴…. 마치 한 폭의 동양화 같은 모습에 감탄하고 말았다. 강영규(‘카메라 스토리지’ 대표)
* 출처:<VOGUE GIRL> 2012년 12월호 


'Life Story > Travel Story' 카테고리의 다른 글

눈오면 꼭 가봐야 할 곳  (0) 2012.12.28
원효대교 북단 한강변의 엔젤인어스  (0) 2011.03.22
Andrew's Eggtart & Coffee  (0) 2010.01.14
쌈지길의 책갈피 같은 곳 "갈피"  (0) 2010.01.11
Posted by gofly
TAG 가봐야, , ,

댓글을 달아 주세요

루트(root)권한으로 adb shell 또는 안드로이드 터미널(Android Terminal)로 다음을 하시면 됩니다.

먼저 현제 mount되어있는 파티션을 확인 합니다.

# mount


그리고 당신이 원하는 파티션을 다시 마운트 시킵니다. eg. /system:



# mount -o rw,remount -t yaffs2 /dev/block/mtdblock3

자 이체 sytem의 권한을 바꿀 수 있습니다.

# chmod 777 /system


네 다시 rw모드로 마운트 하려면 아래 문장을 실행하시면 됩니다.

mount -o rw,remount -t rootfs /

Posted by gofly

댓글을 달아 주세요

KT Galaxy(갤럭시, 갤) S2 HD LTE 루팅방법 입니다.

휴대폰이 꺼진 상황에서 USB 커넥터를 연결하고 "전원+홈+볼륨 하단 키"를 누르고 3초 정도 있으면 다운로드 모드에 들어갑니다.

이 때 Odin을 실행 시키면  아래와 같은 화면이 나타납니다.



1. ID:COM에 COM 포트로 인식된 휴대폰이 있어야 합니다.

2. PDA를 눌러 이미지를 찾습니다.

3. Start를 누르면 휴대폰에 PDA에 입력한 이미지로 휴대폰이 변경됩니다.


클릭

Posted by gofly

댓글을 달아 주세요

VIM에서 내 소유가 아닌 파일을 열어서 수정하고 저장을 하려고 하면 "readonly"모드가 설정 되어있다 라고 하며 파일이 저장 되지 않을 때가 있습니다.

이럴 때 내(로그인 사용자) 권한이 관리자 권한이라면 저장을 하고 싶을 때 아래 명령을 쓰면 readonly로 되어 열람하던 파일도 저장할 수가 있습니다.


:w !sudo tee % > /dev/null


Posted by gofly

댓글을 달아 주세요


명령어설명 모드 
 :w 현재 편집하던 내용을 저장한다. 명령행 모드
 :q 현재 편집내용을 끝내고 에디터를 종료한다.
변경 내용이 있을 때는 :q로 종료할 수 없고 저장하지 않고 끝내기인 :q!로 종료해야 한다.
 명령행 모드
 :wq 편집하던 내용을 저장하고 에디터를 종료한다. 명령행 모드
 명령어 뒤에 붙이는 옵션으로 강제로 해당명령어를 수행한다는 뜻이다.
:q! -> 저장하지 않고 강제종료
:w! -> 강제로 덮어쓰기
:wq! -> 강제로 덮어쓰고 종료.
 명령행 모드 (옵션)
 a, A a : 현재 커서위치에서 한 칸 뒤로 이동 후 입력모드로 전환
 A : 현재 형에서 끝으로 이동한 후 입력 모드로 전환
 일반 모드 (에서 입력모드로 전환시)
 i, I i : 현재 커서위치에서 입력모드로 전환
 I : 현재 행 맨 앞으로 이동 후, 입력모드로 전환
 일반 모드 (에서 입력모드로 전환시)
 o, O o : 현재 행에서 아래 새로운 행 삽입 후 입력모드로 전환
 O : 현재 행에서 위로 새로운 행 삽입 후 입력모드로 전환
 일반 모드 (에서 입력모드로 전환시)
 R 수정 모드로 글자가 덮어 씌어짐. 일반 모드 (에서 입력모드로 전환시)
 x 현재 커서의 문자를 삭제한다.
Delete키와 동일한 기능
 일반 모드
 dd 현재의 행을 잘라내기한다.
잘라낸 행은 vim이 가진 고유한 저장소에 저장된다. dd 앞에 숫자를 붙이면 현재행에서 n의 숫자 만큼 잘라내기한다.
 일반 모드
 yy 현재 행을 복사한다.
복사한 행은 vim이 가진 고유한 저장소에 저장된다. yy 앞에 숫자를 붙이면 현재행에서 n의 숫자 만큼 복사한다.
 일반 모드
 p 가장 마지막에 복사 혹은 잘라내기한 내용을 해당 위치에서 부터 붙여넣기 한다. 일반 모드
 u undo 기능. Vim의 undo 기능은 매우 강력하여 편집기가 열린순간부터 편집한 모든 내용을 되돌리기 할 수 있다. 일반 모드
 ctrl - R redo 기능. 일반 모드
 h 왼쪽 방향키와 같은 기능. 앞에 n의 숫자를 붙인 만큼 이동이 가능. 일반 모드
 j 아래쪽 방향키와 같은 기능. 앞에 n의 숫자를 붙인 만큼 이동이 가능. 일반 모드
 k 위쪽 방향키와 같은 기능. 앞에 n의 숫자를 붙인 만큼 이동이 가능. 일반 모드
 l 오른쪽 방향키와 같은 기능. 앞에 n의 숫자를 붙인 만큼 이동이 가능. 일반 모드


알아두면 더욱 편리한 Vim 에디터 기본 입력키 2번째. 
Advanced. 


 명령어 설명모드 
 ^ 행의 맨 처음으로 이동 하지만 공백은 제외. 일반모드
 Home키 행의 맨 처음으로 이동. 일반모드
 $ 행의 맨 끝으로 이동 (End 키와 같음). 일반모드
 ctrl + B 위로 한 화면 스크롤(PageUP키와 같음). 일반모드
 ctrl + F 아래로 한 화면 스크롤(PageDown키와 같음). 일반모드
 ctrl + U 위로 1/2 화면 스크롤. 일반모드
 ctrl + D 아래로 1/2 화면 스크롤. 일반모드
 #gg #행으로 이동. 없을 시 맨 처음으로 이동. 일반모드
 #G #행으로 이동. 맨 마지막으로 이동. 일반모드
 :# #행으로 이동. 명령행 모드
 ctrl - G, g 현재 문서의 위치정보를 하단에 표시. 일반모드
 :d 현재 행을 잘라내기. 명령행 모드 
 D 현재 위치에서 현 행의 끝부분까지 잘라내기 일반모드
 J 아래 행을 현재 행의 끝에 붙임. 
(아래행의 공백은 무시)
 일반모드
 :pu p와 같은 기능. 현재 행에 붙여넣기. 명령행 모드
 P 현재 행 위에 붙여넣기. 일반모드
 :y 현재 행을 레지스터에 복사. 명령행 모드
 Y 현재 행을 레지스터에 복사. 일반모드
   


범위 지정에 사용하는 특수 기호와 사용법
 . 현재 행. 메타 문자
 $ 마지막 행. 메타 문자
 % 문서 전체. 메타 문자
 +# 현재 위치에서 #만큼 아래 행을 의미. 메타 문자
 -# 현재 위치에서 #만큰 위의 행을 의미. 메타 문자
 :10, 25d 10행에서 25행까지 잘라내기. 명령행 모드
 :%y 문서 전체 복사. (%는 1,$와 동일하다) 명령행 모드
 :.,+20y 현재 행부터 아래로 20행을 복사. 명령행 모드
 :-10,+5d 현재 행부터 위로 10행, 아래로 5행 삭제.  명령행 모드
 :40pu 40번 행에서 레지스터의 내용을 붙여넣기.  명령행 모드

 v 일반 비주얼 모드로 현재 커서 위치에서 블록을 지정. 일반 모드
 V 비주얼 라인 모드. 현재 커서가 위치한 행에서 행 단위로 블록을 지정. 일반 모드
 ctrl-V 비주얼 블록 모드로, 열(Column) 단위로 블록을 지정. ctrl-Q로 대신 할 수 있음. 일반 모드


Vim 에디터를 사용할 때 기본적으로 사용하는 옵션에 대해서 알아보자.

1. 편집기 좌측에 라인숫자 표시.
2. 편집기 사용시 기본적인 문법 검사.
3. 자동으로 들여쓰기
4. Tab의 크기, 블록 이동시 열의 넓이

 명령어 설명 모드
 :set 현재 에디터에 셋팅된 옵션 목록을 볼 수 있다.
:set all 라고 명령하게 될 때 vim에서 셋팅할 수 있는 모든 옵션의 종류를 볼 수 있다.
 명령행 모드
 :set # # 써있는 속성을 on 할수 있다. no# 라고 할 경우 해당 속성을 off 시킬 수 있다.
 #! 이라고 할 경우 해당 값이 반전 된다(on/off)
 명령행 모드
 :set #=값 속성중에 특정 값을 갖는 속성들이 있다. #속성들의 특정한 value 값을 대입하기 위해서 사용한다. 명령행 모드

해당 옵션 값을 설정할 때 앞에 :set을 붙여야 한다.
ex) :set nu

 nu 또는 number 화면에 라인의 숫자를 표시한다.  명령행 모드
 ai 또는 autoindent 자동 들여쓰기를 쓴다. (sw로 설정한 값으로)  명령행 모드
 cindent C언어 스타일의 들여쓰기를 사용.
(sw로 설정한 값으로)
  명령행 모드
 ts=값 또는 tablestop=값 탭(Tab) 크기를 지정하는 값으로 지정한다.  명령행 모드
 sw=값 또는 shiftwidth=값 블록 이동시 지정하는 열의 너비.  명령행 모드

해당 옵션을 셋팅할 때는 :set을 붙이지 않는다.
 :syntax enable 문법검사를 실시한다. (지정된 색깔테마로) 명령행 모드
 :syntax clear 문법검사를 해제한다. 명령행 모드
 :colorscheme 에디터에 색깔 테마를 지정한다. 명령행 모드

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


아래의 그림 파일은 색깔 테마와 문법 검사 그리고 행 표시를 하지 않은 경우이다.




:set nu     (라인 표시)
:syntax enable     (문법 검사 on)
:colorscheme default      (색깔 테마 on) 
(참고로 색깔 테마는 16가지 정도가 더 있으므로 colorscheme라고 친 뒤 한 칸을 띄고 ctrl+D를 치면 셋팅 가능한 다른내역을 확인할 수 있다)

를 한 뒤 확인해 보면 아래 문법이 틀린 부분은 색깔이 다르게 표시되거나 강조가 되어 있어서 편집과 동시에 확인할 수 있다.
또한 화면 좌측에 라인에 행별로 라인의 숫자가 표시 된 것을 확인 할 수 있다. 우분투의 경우 syntax와 colorscheme가 기본적으로 셋팅되어 있으니 별도로 셋팅해주지 않아도 괜찮다. 하지만 만약에 꺼져 있을 때 아래의 옵션 셋팅 내용을 기억해 두자.



또한 편집하다가 대괄호를 치고 Enter 키를 치면 행의 처음으로 돌아가게 때문에 자동으로 들여쓰기 등을 옵션으로 셋팅해놓으면 좀 더 편리하게 편집할 수 있다. 또한 그 값도 적당하게 조절해 놓으면 좀 더 손쉽고 편리하게 자신에게 최적화 하여 편집할 수 있게 된다.
이번에는 tablestop(ts) 값과 shiftwidth(sw) 값을 조정하면 어떻게 변화하는지 확인해보면

:set sw=20       (들여쓰기 값 20)
:set ts=2         (탭 크기 2)
:set cindent    (C언어 스타일의 들여쓰기)

일부로 printf 문만 들여쓰기로 하고 나머지는 tab으로 진행해 보았다. int나 for의 경우는 왼쪽 끝과 2칸 정도 밖에 차이나지 않지만 printf문 이후로는 엔터를 쳐서 들여쓰기를 했더니 중괄호로 부터 20의 넓이만큼 벌어져 있는 것을 확인할 수 있다.




:set 을 치면 현재 편집기에 셋팅된 옵션 내용을 확인 할 수 있는데
현재 확인해보면 
cindent
tabstop=2
syntax=c
shiftwidth=20
등이 셋팅 되어 있는 것을 확인 할 수 있겠다.



------------------------------------------------------------------------------------------------------------------------------------
그럼 이렇게 편집기를 열때마다 해당 내역을 저장해야 하는가?
다행이 vim 에디터는 처음 실행될때 자신의 홈디렉토리에 .vimrc 파일을 로드하여 기록되어 있는 내용을 먼저 로드한다.
따라서 내가 항상 위의 내역을 저장해 놓고 사용하고 싶다면. 자신의 홈디렉토리로 가서 .vimrc 파일을 생성(혹은 수정)하여 위의 내용을 기록해서 사용하면 된다. 

주의할 사항은 콜론은 사용하면 안됀다. 아래와 같이 셋팅하여 사용하면 되겠다.
파일명은 .vimrc 이다.   . 을 빼먹으면 안됀다. 


Vim 에디터에는 문자열 검색기능을 지원한다. 
아직은 잘 모르지만 Ctag라는 플러그 인을 사용하면 테크를 검색할 수 있다고 알고 있는데 예전에 선배가 사용하는 것을 보고 뭔가 멋지다라고 생각했던 기억이 난다. 하지만 우선 Vim에 내장되어 있는 간단한 문자열 검색 기능에 대해서 알아보자.


 명령어설명 모드 
 f# 현재 행에서 문자열 #을 전방으로 검색할때 사용한다.일반모드 
 F# 현재 행에서 문자열 #을 후방으로 검색할때 사용한다. 일반모드
 t# 현재 행에서 문자열 #을 전방으로 검색한 뒤, 검색어의 한 칸 앞으로 이동한다. 일반모드
 T# 현재 행에서 문자열 #을 후방으로 검색한 뒤, 검색어의 한 칸 뒤로 이동한다. 일반모드
 ; 가장 최근에 검색한 명령을 재 검색한다. 일반모드
 , 가장 최근에 검색한 명령을 반대 방향으로 
재검색한다.
 일반모드
 * 현재 커서가 위치한 곳에 단어를 검색하고 하이라이트 해준다. 일반모드 
/# # 단어를 검색하고 하이라이트 해준다. 명령행 모드 
n 검색된 단어에서 다음 하이라이트 위치로 이동한다. 일반모드
 검색된 단어에서 반대방향의 하이라이트 된 단어로 이동한다. 일반모드
 /화살표 이전에 검색한 단어내역을 본다. 명령행 모드
 :set hls 검색하는 단어에 하이라이트를 지정한다. 
nohls를 하게 되면 하이라이트가 해제된다.
 명령행 모드

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

아래 그림 내용은 명령행 모드에서 /int 로 int 문자열을 가진 모든 부분을 검색해본 경우이다.
원래는 하이라이트가 꺼져 있어서 :set hls 를 사용하여 하이라이트를 줬더니 해당 내용 내에 int 내용은 모두 노란색으로 하이라이트가 표시되어 해당 내용이 어디에 있는지 확인할 수 있다. 이 상태에서 일반모드라면 n 이나 N 을 주면 다음 혹은 이전에 어디에 검색한 문자열이 있는지 커서를 이동시켜줘서 좀 더 편리하게 디버깅 혹은 코드 내용을 검색 할 수 있겠다.


이전에 Vim 에디터로 편집을 할 때, 굉장히 알고 싶었던 내용이 많았는데 '손에 잡히는 Vim' 서적을 보다보니 알고 싶었던 내용이 제법 있다.
이런 기능만 알아도 엄청나게 빠르게 편집을 할 수 있었는데 예전에 그걸 몰랐다는 사실이 조금 아쉽게 느껴진다. 
그렇게 어려운 내용은 아니지만 조금 더 부지런히 찾아보고 공부할 껄 하는 후회가 밀려온다.

하지만 시작이 반이고 가장 늦었다고 할때가 가장 빠르다고 누가 말했던가.
지금이라도 열심히 익혀보자.

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

이번에는 문자열 교체하기에 대해서 알아보자.
크게 내용이 어렵지는 않고 간단하다.

 명령어 설명  모드 
 (범위)s,바뀌어야할 단어,바꿀내용,옵션

ex) 1,$s,man,boy,g
총 4개의 부분을 나뉘어져 있다.
가장 처음에는 문서에서 교체할 범위를 지정하고 s를 그 다음에는 구분자로 ,를 써주고 바꿀단어를 쓴 뒤 구분자를 써준다. 또 바꿀내용 뒤에도 구분자를 쓰고 옵션을 준다.
 
 명령행 모드
 
위의 예시에서 지정된 범위인 1,$ 는 첫 번째 줄에서 마지막행까지 즉 문서 전체인 %를 말한다.
s는 교체 명령어이다. s 다음에 나올 문자는 교체에 사용할 문자로 사용된다.
현재는 s 다음에 ,(콤마)를 사용하겠다고 표시했으며 다른 문자를 사용해도 무방하다.   
저번에 "Vim 에디터에 대해 알아보자 - 1 (기본 입력키2)"에서 간단히 포스핑 했었는데 
Vim 에디터에서 사용하는 범위 지정에 쓰이는 특수기호(메타기호)에 대해서 복습해보자.

 . 현재 행을 의미. 메타기호
 $ 마지막 행을 의미. 메타기호
 +# 현재 위치에서 #만큼 아래 행을 의미. 메타기호
 -# 현재 위치에서 #만큼 위 행을 으미. 메타기호
 % 문서(파일) 전체를 의미. 메타기호

즉 위의 1,$s,man,boy,g 는 %s,man,boy,g 와 같은 역할을 하게 된다.
매우 직관적으로 판단할 수 있다. 문제는 까먹지 않는게 .... ㅡㅡ

그럼 마지막에 붙는 옵션에 대해서 알아보자.
 옵션 설명  메타기호
 g 범위 내에 검색된 모든(global) 문자열을 교체.  메타기호
 i 대소문자를 무시함. 메타기호
 c 문자열을 교체하기 전 교체 여부를 확인.

y/n/a/q/l/^E/^Y 등의 답변을 해야 한다.
y:yes, n:no, a:all, q:quit, l:line 정도 알아두자.
 메타기호
 e 교체 과정 중 에러를 무시. 에러 표시도 안함. 메타기호

그럼 마지막으로 확인해보자.
%s,man,boy,gcie 이렇게 하면 모든 옵션을 붙여서 문서 전체에 man 문자를 교체하는데 교체할때마다 다 물어봐라 이 뜻이 된다.

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

재미있는 팁

1. 어떠한 문자의 ASCII 코드 값을 알고 싶을 때 굳이 인터넷이나 표를 찾아보지 말고 원하는 문자에 커서를 위치시키고 명령행 모드로 :as를 입력해보자. 10진수 8진수 16진수로 표시할 때의 ASCII 코드 값을 알려준다. 

2. 특수문자를 입력하고자 할때 입력모드에서 ctrl-v, V 를 입력하게 되면 특수문자 ^E, ^M ^Y 등을 입력할 수 있다.


이전의 내용은 Vim 에디터의 초급 단계의 내용으로 중급 단계로 가기 위한 작은 첫 걸음을 띄기 위해서는 파일 관련 기능을 필히 숙지해야 한다.
물론 파일 관련 기능을 알았다고 해서 중급사용자라고 할 순 없지만 그래도 Vim 에디터를 조금은 사용할 줄 알게 되는 수준은 되는 것 같다.

이번 파일 관련 기능1 에서는 다양하게 파일을 열고 닫는 법에 대해서 알아보도록 하자. 

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

 명령어 설명  모드 
 :e # 추가로 편집하고자 하는 파일 이름 인 #을 넣으면 이전 편집하던 내용을 잠시 놔두고 다른 파일을 편집한다. 없으면 새롭게 생성한다. 
대신 이전에 수정하던 파일은 반드시 수정하고 넘어가야 한다. 수정하지 않고 강제로 넘어가면 수정했던 내용은 지워진다. 
어떠한 파일을 편집 할 수 있는 한개씩 확인하고 싶다면 tab을 누르면 되고 모두 확인하고 싶다면 ctrl-d 를 누르면 된다. 
 명령행 모드
 ctrl-6 또는 ctrl-^ 이전에 편집했던 내용으로 돌아갈때 누르면 된다. 역시 현재 편집했던 내용은 저장하지 않으면 없어진다. 명령행 모드
 vim #1 #2 #3 #4.... vim 에디터는 여러개의 파일을 동시에 열 수 있다. vim 이후에 여러개의 파일명을 공백과 함께 입력하면 동시에 여러개의 파일을 편집할 수 있다. 명령행 모드
 :#n 여러개의 파일을 동시에 오픈했을 때, 현재 편집하던 파일이 아니라 #1 -> #2 로 가고자 할때 
:n을 누르면 된다. 한번에 여러개를 건너 띌때는 # 숫자를 기업하면 된다. 
ex) :2n 을 입력하면 #1 -> #3 으로 이동함.
 명령행 모드
 :#N :n이 정방향으로 증가한다면 :#N은 뒤쪽으로 이동한다. 
ex) 현재 편집하던 파일이 #4라면 :3N 을 입력하면 #4 -> #1 로 가게 된다.
 명령행 모드
 :qa 여러개의 파일이 열려 있을 때 다른 파일이 편집중이라 닫히지 않을때는 qa를 누르면 모두 닫히게 된다. 혹은 q! 를 눌러서 강제로 종료해도 된다.  명령행 모드
 :w # #에 해당하는 파일 이름을 저장할 수 있다.
w는 write의 약자로 wrie라고 써도 된다.
 명령행 모드
 :sav # #에 해당하는 파일을 다른 이름으로 저장한다.
sav는 saveas로 써도 된다.
 명령행 모드
 :up 현재 바뀐 내용만 저장하게 된다. w는 내용이 바뀌던 안 바뀌던 모두 저장하므로 서버에 터미널이 여러개 붙어 있을 과부하를 주게 되는데 up은 상대적으로 적은 과부하를 주게 되어 유리하다. 명령행 모드
 :x 기능은 up 을 한 다음에 q 를 동시에 한 것과 같다. 즉 wq와 같은 기능을 하지만 wq가 upq 와 같은 효과라서 wq보다 효율적인 명령이다. wq보다 x를 사용하기를 추천한다. 명령행 모드


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

여러개의 파일을 동시에 열었을 때 해당 파일들을 동시에 편집하고 관리하는 좀 더 강력한 기능에 대해서 알아보자

 명령어 설명 모드
 :ls
 :buffers
 :files
 현재 열려 있는 파일 목록을 확인한다. 명령행 모드 
 숫자ctrl-6
 :e #숫자
 숫자번째 파일 목록을 연다.  일반모드 
 :0f 현재 파일을 목록에서 제거합니다.
연결된 파일이 있다면 해제하여 이름없음 파일로 바꿉니다. 
 명령행 모드 
 :r 해당파일을 목록에 끼워넣는다.  명령행 모드 
   


또한 비쥬얼 베이직 이나 기타 편집 툴에도 있는 기능에 대해서 소개하겠다.
바로 해당 함수나 헤더파일 등의 정의부로 이동하는 단축키인데, #include<stdio.h>의 경우 stdio.h 파일의 내용을 보고 싶을 때가 있다면 해당 부분에 커서를 옮기고 gf를 눌러보자. 해당 파일의 정의부로 이동할 수 있을 것이다. 물론 :e /usr/include/stdio.h 와 같은 방법으로도 열 수 있지만 좀 더 편리한 단축키 사용법을 알아놔서 나쁠 것 없으니 이 기회에 알아놓자.

 gf  현재 커서 위치의 파일명을 열어준다.
기본적으로 등록된 /usr/include 와 같은 검색 위치를 제외한 추가적인 위치를 등록하고 싶다면 :set path+=경로명을 쳐주거나 .vimrc 파일에 등록해서 사용하면 된다. 
 일반모드
 ctrl-w f  현재 커서 위치의 파일명을 분할된 창에 열어준다. 일반모드
 ctrl-w gf  현재 커서 위치의 파일명을 탭에서 열어준다. 일반모드


 명령어 설명  모드 
 :#sp filename #에 숫자를 넣은 행의 크기 만큼 창이 수평 분할된다. filename을 넣게 되면 해당 파일을 오픈하거나 없으면 새파일을 만든다. 같은 파일에서는 일반모드로 #ctrl-w s 를 치면 #크기 만큼 창이 수평으로 분할된다. 명령행 모드
 :#vs filename #에 숫자를 넣은 열의 크기 만큼 창이 수직 분할된다. filename을 넣게 되면 해당 파일을 오픈하거나 없으면 새파일을 만든다. 같은 파일에서는 일반모드로 #ctrl-w v 를 치면 #크기 만큼 창이 수직으로 분할된다. 명령행 모드
 :#new filename #에 넣은 숫자만큼 상하로 창을 수평 분할하여 위쪽에 창에는 새로운 파일을 생성하여 표시한다. 일반모드에서 #ctrl-w n 를 치면 단축키로 사용할 수 있다.  명령행 모드
 :#vnew filename  #에 넣은 숫자만큼 좌우로 창을 수직 분할하여 왼쪽에 창에는 새로운 파일을 생성하여 표시한다. 명령행 모드
 ctrl-w ctrl-방향키 
또는 ctrl-w 방향키
또는 ctrl-w ctrl-h,j,k,l (소문자)
 현재 창에서 해당 방향의 창으로 이동할 때 사용된다. 방향키 대신 소문자로 h,j,k,l 키를 사용할 수 있다. 대신 대문자를 사용하면 창을 해당으로 보내게 된다. 일반모드
 ctrl-w ctrl-w
 ctrl-w w
 현재 창에서 오른쪽 방향으로 이동합니다. 오른쪽 끝 창이라면 아래로 내려감.  일반모드
 ctrl-w ctrl-p
 ctrl-w p
 바로 이전에 사용한 창으로 이동. 일반모드
 ctrl-w = 모든 창의 크기를 동일하게 조절 일반모드
 ctrl-w #+ #크기만큼 창의 크기를 키운다. #이 생략되어 있을시에는 1로 판단. 일반모드
 ctrl-w #-  #크기만큼 창의 크기를 줄인다. #이 생략되어 있을시에는 1로 판단. 일반모드

명령어 설명  모드 
 :#tabedit filename
또는 :#tabe filename
 #번째 탭에 filename에 해당 하는 파일을 엽니다. #이 생략되면 현재 열려 있는 탭 바로 뒤에 탭을 생성하여 파일을 엽니다. filename이 생략되면 빈 이름의 파일이 생성됩니다. 명령행 모드
 :#tabnew filename #번째 탭에 파일을 생성합니다. #이 생략되면 현재 열려 있는 탭 바로 뒤에 탭을 생성하여 파일을 생성합니다. filename이 생략되면 빈 이름의 파일이 생성됩니다. 명령행 모드
 :#tabclose
또는 :#tabc
 #번째 탭의 파일을 닫습니다. #이 생략되면 현재의 탭을 닫습니다. 명령행 모드
 :#tabnext
또는 :#tabn
 #번째 다음 탭을 봅니다. #이 없으면 바로 다음 탭을 엽니다. 명령행 모드
 #gt #번째 탭을 엽니다. #이 생략되면 바로 다음 탭을 엽니다. 일반 모드
 #ctrl-PageDown #번째 탭을 엽니다. #이 생략되면 바로 다음 탭을 엽니다. 일반 모드
 :#tabprevious
또는 :#tabp
 #번째 이전 탭을 봅니다. #이 없으면 바로 이전 탭을 엽니다. 명령행 모드
 #gT #번째 이전 탭을 엽니다. #이 생략되면 바로 이전 탭을 엽니다. 일반 모드
 #ctrl-pageUp #번째 이전 탭을 엽니다. #이 생략되면 바로 이전 탭을 엽니다. 일반 모드
 :tabmove #
또는 :tabm #
 #번째 탭으로 이동합니다. #이 생략되면 가장 마지막 탭으로 이동합니다. 명령행 모드

사실 모든 Path를 외우지 않는 이상 창을 분할해서 열어서 편집할 때 그 파일이 어디에 위치해 있는지 알기 어렵다.
그래서 Vim에서는 윈도우 탐색기와 같이 디렉터리 탐색기 플러그인 툴을 기본적으로 제공하는데 netrw 라는 툴이다.
이 기능은 창을 분할하여 탐색하고 동시에 편집도 가능하게 해주는 강력한 Vim의 툴로써 그 사용법을 알아두면 매우 이로울 것이다.

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

 명령어 설명 모드
 :e 디렉토리경로 명령행 모드에서 edit 또는 e를 한 다음 디렉토리 경로를 입력하면 해당 디렉토리에 대해서 netrw 툴이 실행된다. 명령행 모드
 <Enter> 해당 디렉토리 또는 파일을 연다. netrw 명령어
 w 또는 j 또는 방향키 ↓ netrw 내에서 아래로 이동하는 방향키 netrw 명령어
 b 또는 k 또는 방향키 ↑ netrw 내에서 위로 이동하는 방향키 netrw 명령어

 i 파일을 표시할 방법을 변경한다.
(한줄 방식, 파일 정보 표시방식, 와이드 방식, 트리 방식)
 netrw 명령어
 s 정렬 방식을 바꿔준다 (time, size, name 방식) netrw 명령어
 o 커서 위치의 파일을 수평 분할된 새창으로 열어준다. netrw 명령어
 v 커서 위치의 파일을 수직 분할된 새창으로 열어 준다. netrw 명령어
 p 커서 이취의 파일을 미리 보기 창으로 열어준다. (미리 보기 파일의 창 닫기는 일반 모드로 CTRL-w z 를 사용한다) netrw 명령어
 P 커서 위치의 파일을 바로 이전에 생성된 창에 열어준다. 바로 이전에 생성된 창이 없을 시에는 수평 분할된 새 창으로 열어준다. netrw 명령어
 R 커서위치의 파일의 파일명을 바꾼다. netrw 명령어
 t 새로운 탭으로 분할하여 열어준다. netrw 명령어
 - 상위 디렉토리로 이동한다. 디렉토리가 보이는 것에서 ../에 커서를 위치시키고 엔터를 눌러도 된다. netrw 명령어



현재 수평분할해서 파일을 하나 열어 놓은것을 확인할 수 있다. (s 키)
수평분할된 창에서 아래창을 보면 Netrw 의 현재 상태를 알 수 있는데
/root 로 현재 위치를 표시하고
Sorted by 즉 정렬방식은 name으로 되어 있고
파일 표시 방식(i 키)를 이용하여 정보표시방식으로 되어 있다.
현재 커서의 위치는 하얀색 가로 줄로써 확인할 수 있다. 
Quick Help라고 써 져있는 부분을 보면 간단한 실행 단축키를 알 수 있다. 더욱 자세한 설명은 F1 키를 눌러 Help를 참고하자.

Posted by gofly
TAG gvim, tab, vi, vim, 명령어

댓글을 달아 주세요

Visual Studio에서 JavaScript 응용프로그램 개발하기


Before delving into the details of the application, I want to say a few things about JavaScript application development. One of the challenges facing the JavaScript developer is the dynamic nature of the language. With JavaScript you aren’t constrained by a rigid type system; instead, objects can be built dynamically. This poses a challenge to the developers of JavaScript editors and IDEs. With strongly typed languages such as C# and Java, the type information can be used to provide enhanced code navigation, refactoring and IntelliSense. With JavaScript, on the other hand, the lack of type information means that the IDE typically provides far fewer developer aids.
응용프로그램의 자세한 사항으로 들어가기 앞서, 저는 JavaScript 응용프로그램 개발에 대하여 몇 가지 이야기 하고 싶습니다. 훌륭한 JavaScript 개발자로 도전할만 한 것은 언어의 역동적 성질입니다. JavaScript와 함꼐라면 딱딱한 유형의 시스템으로 부터 구애받지 않을 수 있습니다; 그 대신에, 객체를 역동적으로 만들 수 있습니다. JavaScript 에디터와 통합개발툴(IDE) 개발자들의 도전 자세가 
C#또는 Java와 같은 강력한 유형의 언어와 같이 강력한 Refactoring 또는 IntelliSense한 안내 코드를 제공하여 사용할 수 있게합니다. 그러나 반대로 자바스크립트는 유형 정보의 뜻이 몇몇 개발자를 보조하는보통의 IDE에서 부족하게 제공되고있습니다.


Fortunately, things have improved recently, with Visual Studio 2010 performing pseudo-execution of your JavaScript code in order to determine the “shape” of each object, allowing it to provide JavaScript IntelliSense. In order to take full advantage of the IntelliSense support, we have to provide the IDE with a few “hints” in the form of “references” that tell the IDE which files to include in its pseudo-execution. With the demo project, all files start with a reference comment that tells the IDE to include the intellisense.js file. The content of this file is simply a list of references that ensure the IDE includes all the important application JavaScript files, providing quality IntelliSense support across the application, as shown here:
다행히도, 이런 것들은 비쥬얼 스튜디오 2010의 JavaScript IntelliSense 에서 제공된 각각의 JavaScript 객체의 "형"(Shape)을 측정하는 JavsScript 가상시현(pseudo-execution) 기능으로  현제 많이 개선되었습니다. IntelliSense의 모든 장점을 취하기 위해선 가상시현(pseudo-execution)을 위해 IDE 파일 내부에 몇가지 힌트를 참조양식(Form of "references")과  함께 제공해야했습니다. 시현(Demo) 프로젝트에는 모든 파일의 시작에 intelllisense.js파일을 포함하는 IDE 참조코멘트(Reference comment)가 있습니다. 다음에 보시는 크로스 응용프로그램을 지원하는 IntellliSense  파일의 내용은 IDE에서 포함한 중요한 응용프로그램 JavaScript파일들의 간단한 참조리스트입니다:



  1. /// Ensure IntelliSense includes all the files from this project.
  2. ///
  3. /// <reference path="app.js" />
  4. /// <reference path="viewModel/ApplicationViewModel.js" />
  5. /// <reference path="viewModel/SearchResultsViewModel.js" />
  6. /// <reference path="viewModel/TweetViewModel.js" />
  7. /// <reference path="viewModel/TwitterSearchViewModel.js" />
  8. /// <reference path="lib/jquery-1.6.4.js" />
  9. /// <reference path="lib/cordova-1.5.0.js" />
  10. /// <reference path="lib/knockout-1.2.1.js" />

JavaScript is a relaxed and forgiving language, with features such as value coercion and semi­colon insertion making it easy to use in a scripting environment. However, these same features often become problematic when managing large quantities of code. For that reason I highly recommend using JSLint, a tool that applies a more rigid set of coding standards to JavaScript. A popular Visual Studio Extension adds JSLint support (jslint4vs2010.codeplex.com), reporting lint errors within the error console. I’ve used JSLint for the Twitter Search application (and virtually every other JavaScript project I’ve worked on).
JavaScript는 느슨하고 관용적인 언어이지만, 스크립팅 환경에서 값의 강제성과 세미콜론(;)을 쉽게 삽입하는 특징을 이루고 있습니다. 그러나 이 것과 같은 특징들은 큰 규모의 코드를 관리하는데 있어 자주 문제시 되어지는 부분입니다. 그런 이유에서 저는 
툴에 더욱 완고한 표준 JavaScript 코딩을 설정 적용하고 싶다면, 강하게 JSLint를 사용할 것을 권하고 싶습니다. 대부분의 Visual Studio Extension 에는 JSLint 지원(jslint4vs2010.codeplex.com)하여 lint 오류를 오류콘솔을 통해서 통보하고 있습니다. 저는 트위터 검색 응용프로그램에 JSLint를 사용하였습니다(그리고 가상적으로 모든 JavaScript 프로젝트에 사용하고 있습니다).


You might notice a “globals” comment at the start of each JavaScript file within the project. JSLint helps prevent variables “leaking” into global scope by accidental omission of the var keyword. The “globals” comment provides JSLint with a formal definition of which variables are allowed to occupy a global scope.
당신은 프로젝트의 JavaScript파일에 "global"이라는 코멘트를 주의하셔야 할 것입니다. JSLint는 우발적인 키워드 생략으로 인한 전역적으로 발생하는 일명 "누수"현상을 막아줍니다. "global" 코멘트는 선점적으로 정의하여 제공하고 있습니다.


Model-View-View Model(MVVM) 응용프로그램 구조

The Twitter Search application is, from the perspective of the phone’s browser control, a single-page application. Conversely, from the user perspective, it has multiple pages, as seen in Figure 5. In order to support this, a Knockout ViewModel is constructed that contains a stack of ViewModel instances, each one representing a page within the application. As the user navigates to a new page, the corresponding ViewModel is added to this stack, and when the user navigates back, the topmost ViewModel is popped off the stack (see Figure 6).
트위터 검색 응용프로그램은 폰(phone)의 브라우저 컨트롤러로 보는 단일 
페이지 응용프로그램입니다. 반대로 사용자 시점에서 보면 Figure 5에서 보듯 다중 페이지로 보입니다. 응용프로그램간 페이지를 각각 대표하는 ViewModel 객체들의 더미(stack)을 포함하도록 지원하는 Knockout ViewModel이 구성되어졌습니다. 사용자에게 새로운 페이지를 안내하게 된다면 이에 상응하는 ViewModel을 ViewModel객체들의-더미(stack)에 추가하고 사용자에게 안내를 돌려주게 되고 가장 상위의 ViewModel은 ViewModel객체 더미에서 튀어나오게 됩니다(참조 Figure 6).


Figure 6 The Knockout ApplicationViewModel

  1. /// <reference path="..//intellisense.js" />
  2. /*globals ko*/
  3. function ApplicationViewModel() {
  4.   /// <summary>
  5.   /// The ViewModel that manages the ViewModel back-stack.
  6.   /// </summary>
  7.   // --- properties
  8.   this.viewModelBackStack = ko.observableArray();
  9.   // --- functions
  10.   this.navigateTo = function (viewModel) {
  11.     this.viewModelBackStack.push(viewModel);
  12.   };
  13.   this.back = function () {
  14.     this.viewModelBackStack.pop();
  15.   };
  16.   this.templateSelector = function (viewModel) {
  17.     return viewModel.template;
  18.   }
  19. }


When the application starts, an instance of the ApplicationViewModel is created and bound to the UI using Knockout:
응용프로그램이 시작되면 응용프로그램의 ViewModel의 객체가 생성 및 Knockout을 이용한 UI로 묶여지게 됩니다:


  1. document.addEventListener("deviceready", initializeViewModel, false);
  2. var application;
  3. function initializeViewModel() {
  4.   application = new ApplicationViewModel();
  5.   ko.applyBindings(application);
  6. }



The UI itself is quite simple, comprising a div element that uses the Knockout template binding to render the ViewModel stack:
div 엘레멘트를 포함한 Knockout 템플릿의 묶음과 
ViewModel 더미를 표현하는 UI 자체는 굉장히 단순합니다:



  1. <body>
  2.   <h1>Cordova Twitter Search</h1>
  3.   <div class="app" data-bind ="template: {name: templateSelector, foreach: viewModelBackStack}">
  4.   </div>
  5. </body>


The Knockout template binding works in a similar manner to the Silverlight ItemsControl in that it binds to an array of ViewModel instances and is responsible for generating the View for each via a template. In this case, the templateSelector function is invoked on the ApplicationViewModel in order to determine the named template for each ViewModel.
Knockout 템플릿 바인딩은 
SilverLight ItemControl의 템플릿을 통한 각각의 VIew를 생성하는 역활과 ViewModel 객체의 배열로 묶어주는 방식과 비슷하게 동작합니다. 이 경우에 각각의 ViewModel의 이름을 지정하기 위한 ApplicationViewModel을 templateSelector  가 호출하게됩니다.


If you run this application you’ll find that it doesn’t actually do anything—that’s because there aren’t any ViewModels to represent the pages of the application!
이응용프로그램을 실행하면 막상 아무 것도 하고 있지 않을 것을 발견할 것입니다. 왜냐하면 응용프로그램을 대표하는 페이지지 즉 ViewModel들이 어디에도 없기 때문입니다!


트위터 검색 뷰 모델(The TwitterSearchViewModel)

I’ll introduce the first ViewModel, TwitterSearchViewModel, which represents the first page of the application. This ViewModel exposes a few simple observable properties that support the UI, namely the searchTerm, which is bound to the user input field, and isSearching, which is a Boolean observable that disables the search button when the Twitter APIs are being queried via HTTP. It also exposes a search function that’s bound to the search button, in much the same way that you would bind an ICommand to a Button within Silverlight (see Figure 7).
제가 응용프로그램을 대표하는 첫 페이지 첫 ViewModel인 TwitterSearchViewModel을 소개하겠습니다. 이 ViewModel은 몇 가지 간단한 관찰가능한 UI요소들인 사용자 입력 필드(field)인 searchTerm과 Twitter API로 
HTTP를 통하여 질의할 때 조회 버튼이 사용불가능 하도록하는 Boolean 관찰자인 isSearching으로 나타내보여집니다. Silverlight에서 ICommand버튼에 바인드 하듯이, 이 것 역시 조회 기능을 조회버튼에 바인드 할 수 있습니다(참조 Figure 7).


Figure 7 The TwitterSearchViewModel

  1. /// <reference path="..//intellisense.js" />
  2. /*globals $ application ko localStorage SearchResultsViewModel TweetViewModel*/
  3. function TwitterSearchViewModel() {
  4.   /// <summary>
  5.   /// A ViewModel for searching Twitter for a given term.
  6.   /// </summary>
  7.   // --- properties
  8.   this.template = "twitterSearchView";
  9.   this.isSearching = ko.observable(false);
  10.   this.searchTerm = ko.observable("");
  11.   // --- public functions
  12.   this.search = function () {
  13.     /// <summary>
  14.     /// Searches Twitter for the current search term.
  15.     /// </summary>
  16.     // implementation detailed later in this article ...
  17.   };
  18. }


The template property of the ViewModel names the View that’s associated with this ViewModel. This View is described as a jQuery template within the index.html file:
ViewModel 템플릿 요소인 View를 ViewModel의 조합으로 이름하였습니다. 이 VIew는 index.html파일에 jQuery템블릿으로 기술되어진 것입니다:


  1. <script type=text/x-jquery-tmpl" charset="utf-8" id="twitterSearchView" 
  2.   <div>
  3.     <form data-bind="submit: search">
  4.       <input type="text"
  5.         data-bind="value: searchTerm, valueUpdate: 'afterkeydown'" />
  6.       <button type="submit"
  7.         data-bind="enable: searchTerm().length > 0 &&
  8.           isSearching() == false">Go</button> 
  9.     </form>     
  10.   </div>
  11. </script>



If you add an instance of the TwitterSearchViewModel to the application ViewModel stack, the application now shows the first page, as shown in Figure 8.
만약 TwitterSearchViewModel의 객체를 응용프로그램 ViewModel 더미(stack)에 추가했다면 Figure 8에서 보듯이 으용프로그램은 첫페이지를 보여주게 됩니다.



The TwitterSearchViewModel Rendered via the twitterSearchView Template
Figure 8 twitterSearchView템플릿을 통한 TwitterSearchViewModel 표현

Posted by gofly

댓글을 달아 주세요

Cordova Applications 개발하기

You can add your HTML, JavaScript and CSS files to the www folder and—as long as you mark them with a Build Action of Content—they’ll be included in your project and accessible via the browser control when your application executes. You can use any of the standard JavaScript/HTML5 libraries or frameworks in your Cordova application, as long as they’re compatible with the phone’s browser.
당신은 HTML, JavaScript그리고 CSS 파일을 www폴더에 추가 할 수 있고-어느정도 당신이 컨텐츠 표현을 위한 구현을 할 수 있게- 당신의 응용프로그램이 실행될 때 브라우저 콘트롤러를 통하여 접근할 수 있는 프로젝트에 포함되어야 할 것을 추가할 수 있습니다.


The Cordova APIs are documented on the Cordova Web site; I won’t describe them in detail here. One important thing to note is that you must wait for the deviceready event before making use of any of the other API methods. If you inspect the index.html file generated from the template, you can see that it waits until the device is ready before updating the UI:
Cordoba API는 Cordova Web site에 문서화되어 있습니다; 이 곳에서는 그 것들에 대해서 자세하게 다루지는 않겠습니다. 한가지 주의해야 할 중요한 점이 있다면 기계구동준비(Device Ready) 이벤트 전에 다른 API 메소드의 사용 할 수 있도록 기다려야 한다는 것입니다. 만약 당신이 템플릿으로 부터 생성된 index.html 파일을 검사해보면, 기계구동상태가 준비되기전에 UI(User Interface)를 수정(Updating)하는 것을 볼 수 있습니다:

  1. <script type="text/javascript">
  2.   document.addEventListener("deviceready",onDeviceReady,false);
  3.   function onDeviceReady()
  4.   {
  5.     document.getElementById("welcomeMsg").innerHTML
  6.       += "Cordova is ready! version=" + window.device.cordova;
  7.     console.log(
  8.       "onDeviceReady. You should see this " +
  9.         "message in Visual Studio's output window.");
  10.   }
  11. </script>


The console object used in the preceding code allows you to add debug output to your application. These messages are sent to the Visual Studio console by Cordova.
콘솔 오브젝트를 사용하여 디버그를 출력하는 선행 응용프로그램 코드입니다. 이 메세지들은 코르도바에 의해 비주얼 스튜디오 콘솔에 보내지게 됩니다. 


단일페에지 또는 다중 응용프로그램 아키텍쳐

When building Cordova applications, you can employ two distinct patterns:
Cordova 응용프로그램을 만들 때 당신은 크게 두 가지 패턴을 사용할 수 있습니다:

Multipage applications: In multipage applications, multiple HTML pages are used to represent the various screens of your application. Navigation between pages uses the standard browser mechanics, with links defined by anchor tags. Each HTML page includes script references to the Cordova JavaScript code and your application JavaScript.
다중페이지 응용프로그램: 다중페이지 응용프로그램 안에는, 당신의 응용프로그램이 대체적으로 여러 HTML 페이지들이 여러 스크린에 의하여 표현되어진다는 것을 뜻합니다. 페이지들을 안내(Navigation)하기 위해 사용되는 것은 기본 브라우저 메카닉과 앵커 태그에 의해 정의되어진 링크입니다. 각각의 HTML페이지는 Cordova JavaScript 코드 레퍼런스 또는 사용자 응용 JavaScript를 추가하고 있습니다. 

Single-page applications: In single-page applications, a single HTML file references Cordova and your application JavaScript. Navigation between the various pages of your application is achieved by dynamically updating the rendered HTML. From the perspective of the phone browser, the URL remains the same and there’s no navigation between pages.
The choice you make between these two patterns has a significant impact on the structure of your code.
단일페이지 응용프로그램: 단일 페이지 패턴의 응용프로그램은, 하나의 HTML 파일에 Cordova 또는 당신의 응용 JavaScript가 참조될 수 있습니다. 당신의 응용프로그램에서 여러 페이지들을 안내(Navigation)하기 위해서 HTML을 다이나믹하게 수정하여 그려내게(Rendered) 됩니다. 폰의 브라우저의 시점에서는 URL(Uniform Resource Locator)은 남아서 동일하고, 페이지 주소를 안내(Navigation)하진 않습니다.
이 두가지 패턴중에 한 가지를 선택하는 것은 코드의 구조에 중요한 영향을 미치게 됩니다.

Generally speaking, the multipage pattern is best suited to applications that mostly comprise static content. With this approach you can take HTML/CSS/JavaScript that’s currently used on your Web site and package it, using Cordova, for delivery to the phone as an application. But the multipage approach has some disadvantages. First, when the browser navigates from one page to the next, it has to reload and parse all the JavaScript associated with the new page. There’s a noticeable pause as the Cordova lifecycle, which creates the link between the JavaScript APIs and C# counterparts, is executed. Second, because your JavaScript code is being reloaded, all application state is lost.
일반적으로 말해서 다중페이지가 최고의 정적 컨텐츠 응용프로그램 패턴이라고 할 수 있습니다. 단일페이지 응용프로그램으로서 당신의 폰에 Cordova를 사용하여 전달한다는 접근은 현제 당신의 웹사이트나 패키지에서 사용되고 있는 HTML/CSS/JavaScript를 취할 수가 있다는 것입니다. 그러나 다중페이지 접근은 몇 가지 불리한 것이 있습니다. 첫 째, 브라우저로 하나의 페이지에서 다음으로 안내되어 질 때, 모든 것을 새로읽고 해독하고 JavaScript를 새로운 페이지에 조합하여야 한다는 것입니다. 여기 Cordova 생활주기에서는 중요한 실행 또는 정지되어 질 때 생성되는 JavaScript API와 C#의 응대(반응)하기위한 연결 상태값 등이 있습니다. 두 번째는 JavaScript코드가 있기 위해서 새로 읽어질 때 모든 응용프로그램 상태가 손실될다는 것입니다. 

The single-page pattern overcomes the issues associated with the multipage approach. The Cordova and application JavaScript code is loaded just once, resulting in a more responsive UI and removing the need to pass application state from one page to the next. The only disadvantage to this approach is the added complexity, with JavaScript code being required to update the UI when navigation occurs.
단일 페이지 응용프로그램 패턴은 다중 페이지 응용프로그램 접근과 같이 대두된 이슈를 극복하였습니다. Cordova와 JavaScript 응용프로그램 코드는 딱 한 번만 읽혀지고, 많은 UI(사용자 인터페이스)의 반응 값과 한 페이지가 소멸되고 남은 응용프로그램 상태 값을 다음 지우는 것입니다(Remving the need to pass application state from one page to the next). 이런 접근에 있어서 유일하게 불리한 점은 페이지들 간에 안내(Navigation)가 되고 있을 때 JavaScript코드로 UI의 상태 또는 모양을 업데이트하게 될 때 복잡해 진다는 것입니다.

The demo application described in this article uses the single-page pattern. For an example of the multipage approach in action, I recommend looking at the DemoGAP CodePlex project (demogap.codeplex.com), which provides a simple demonstration of the Cordova API features within a Windows Phone application.
현제 제공되는 데모 응용프로그램은 싱글 페이지 패턴의 문서를 가지고 기술 된 것입니다. 윈도우 폰 응용프로그램으로 제공된 간단한 Cordova API 데모 중 다중 페이지 접근의 예문을 활용하시려면 저는 DemoGap Complex Project(demogap.complex.com)을 보라고 추천하고 싶습니다. 

데모 응용프로그램

The rest of this article describes “Cordova Twitter Search,” a simple Windows Phone application that allows the user to search Twitter based on one or more keywords, as shown in Figure 5.
다음 기술된 "Cordova Twitter Search:Cordova 트위터 검색" 글은 Figure 5에서 보시듯 아주 간단하게 한 개 이상의 키워드로 트위터를 검색하는 윈도우 폰 응용프로그램을 보여주고 있습니다. 


As well as Cordova, this application makes use of the following frameworks:
다음은 코르도바 응용프로그램의 프레임웍입니다.
  • jQuery and jQuery Templates: jQuery has become the de facto standard framework for manipulation of the browser Document Object Model (DOM). jQuery templates are plug-ins that Microsoft developed (bit.ly/8ZO2V1), making it easy to create reusable HTML templates that can be rendered to the DOM. Twitter Search uses jQuery templates to define the UI for the various pages within the application.
  • jQuery 와 jQuery 템플릿: jQuery는 브라우저의 DOM을 가공한 de facto 표준 프레임웍이 되었습니다. jQuery 템플릿은 DOM으로 그려낼 수 있는 HTML 템플릿이고, 창조적인 재사용이 가능하게 Microsoft developed( bit.ly/8ZO2V1)에서 프러그인으로 제공됩니다. 트위터 검색은 응용프로그램에 jQuery 템플릿 UI로 정의된 여러가지 페이지로 구성되어있습니다.


  • Knockout JS: Knockout is a Model-View-ViewModel (MVVM) framework that makes it easy to construct ViewModels and keep them synchronized with Views in a manner familiar to Silverlight developers. It’s this familiarity that led me to choose Knockout over the numerous other suitable JavaScript UI frameworks.
  • Knockout JS: Knockout은 아주 쉽게 뷰모델을 구성하고 지속적으로 동기화 해주는 Silverlight 개발자를 위한 매우 친숙한 Model-View-ViewModel(MVVM)프레임 웍입니다. 이런 친숙함이 다른 괜찮은 JavaScript UI 프레임웍보다 더욱 더 Knockout을 선택하게 이끌었습니다.

I won’t be covering Knockout in detail in this article. If you’re interested in learning more about this framework, I recommend reading John Papa’s recent article, “Getting Started with Knockout” (msdn.microsoft.com/magazine/hh781029). And if you aren’t familiar with the MVVM pattern (where have you been hiding?), I recommend this excellent article by Josh Smith: “WPF Apps with the Model-View-ViewModel Design Pattern” (msdn.microsoft.com/magazine/dd419663).
저는 Knockout을 자세하게 이 글에서 다루고 싶지 않습니다. 그러나 만약 프레임웍(Knockout)에 대하여 더 배우길 원하신다면, 저는 Jhon Papa의 최근 글인 "Getting Started With Knockout"(msdn.microsoft.com/magazine/hh781029)을 권하고 싶습니다. 그리고 만약 MVVM패턴이 익숙하지 않으시다면(뭘 숨기시려하십니까?-역자주: 부끄러워 말라는 거겠죠? 모를수도 있으니...), Josh Smith의 글 "WPF Apps with the Model-View-ViewModel Design Pattern"(msdn.microsoft.com/magazine/dd419663)을 권하고 싶습니다.


마치며...
너무나 오랜 만에 번역 작업을 한 것 같습니다. 역시나 허접하지만, "개떡같이 말해도 찰떡같이 알아들어라" 현명한(?) 우리의 선조들의 말을 빌어 그지같은 저에 오역글에 자비와 인애로 애쓴다하는 생각으로 글을 봐주시길 희망합니다.


아!!!! 아래 추천좀 눌러주심 감사하겠습니다...쿄쿄쿄
좋은 하루 되세요!!!!^^

Posted by gofly

댓글을 달아 주세요

아래 경로에 아이콘인 *.png, *.xpm등을 아래 경로에 붙여 넣습니다.


/usr/share/app-install/icons/eclipse.xpm

/usr/share/pixmaps/eclipse.xpm


그러면 프로그램을 실행시키고 나면 정상적인 Icon이 이쁘게 뜨게 됩니다.

위의 예제는 우분투의 12.04버전이며 대상 프로그램은 eclipse입니다.

Posted by gofly

댓글을 달아 주세요

최근에 객체지향프로그램인 JAVA의 초기 입문서인 Head First Java를 모두 읽었습니다. 그런데 읽으면서 아주 흥미로운 사실 하나를 읽게되었고 깨닫게 되었습니다. 바로 객체지향에 있어서 어떤 프로그램을 작성하는데 세포단위(즉 더 이상 쪼갤 수 없는 기능이 상실되지 안는 최소한의 단위)로 쪼개어 설계하고 기능을 만들어야 한다는 점 이었습니다.


물론 이런 식의 글은 누군가는 썼을 것입니다. 사실 고찰이라는 제목을 썼지만, 아주 개똥철학일 수 있습니다. 누군가에게 나의 대단함을 내보이려기 보다는 그냥 내 생각을 정리함으로 조금더 확실한 학습을 유도하려는 스스로에대한 글인 것입니다.


돌아 와서 세포단위로 쪼개어 설계하고 기능을 구현한다는 것은 다음을 예를 들어 설명하고 싶습니다.


세포단위 기능구현


예를들어 자바에서는 외부의 파일을 읽어 드리거나 외부 파일을 만들거나 파일에 내용을 기제할 때, InputStream 또는 OutputStream과 같은 객체를 다른 객체와 Chain하여 쓰고 있습니다. 왜 굳이 Stream과 특정 객체를 체인하여 사용할까요?? 그것은 Stream에서 하는일과 각 객체 File 또는 FileWriter에서 하는 일을 불리함으로서 File 또는 FileWriter가 아닌 다른 객체 또는 다른 일(예를 들어서 Stream형태로 외부의 컴퓨터와 통신을 하게 될 때)을 하게 될 때 쉽게 변경 또는 확장하는 것이 쉽기 때문입니다.


이와 같이 객체지향적으로 프로그램을 하려면 최소단위로 그 기능을 쪼개는 시도와 고민을 많이 해야 할듯 하다는 것이 결론입니다. 물론 이 과정에서 List와 ArrayList와 같은 관계가 생길 수도 있습니다. 즉, 인터페이스와 추상클래스와 같은 다형성의 활용이 필요하게 될 수도 있다는 것입니다. 그렇기 때문에 다형성(Polymorphism)을 알아야 하며, 중요하고 중점적으로 파고들어야 하는 핵심중의 핵심이라고 말하고 싶습니다(핵심이다보니 아주 어렵습니다. 하지만 꼭 잘이해를 해야만 하는 부분임은 확실합니다).


세포단위 기능구현에서 주의 할 점


프로그램을 작성하는데 있어서 세포단위로 생각한다는 것은 아주 중요하지만, 주의 할 점이 많다고 생각합니다.


1.세포로서의 생명력(?)이 있어야 합니다.

2.증식 또는 배양을 통하여 또 다른 종으로서 사용할 수 있게해야합니다.


위의 두 가지 규칙은 반드시 존재해야만 하는 기능이라고 필자 스스로는 생각합니다. 이유는 간단합니다. 하나하나 풀어보자면 필자가 "세포단위"라고 말할 때 "세포"라는 단어를 굳이 선택한 이유는 세포라는 것은 최소한이긴 하지만 생명력이 있다는 것을 말하고 싶어서 였습니다. 프로그램에서 생명력이란 하나의 움직임 즉 기능이라고 할 수 있습니다. 가장 기초가 되는 기능 그 것이 바로 "세포단위" 기능 구현인 것입니다.


예를들자면 자바에서 String은 하나의 클래스입니다. String클래스는 그 하위에 많은 메소드들을 가지고 있는데, 이 것이 String클래스를 정의하는 최소한의 기능들입니다. 이 기능들을 활용하거나 확장하여 다른 많은 작업들을 할 수 있습니다. 이 String 클래스에서 구현되어있는 최소한의 기능들은 분리되거나 한다면 그 생명력은 String클래스 하나만으로는 존재할 수 없는 즉 생명력이 없는(다른 클래스가 있어야 기능이 되거나 하는) 클래스가 될 것입니다. 물론 인터페이스나 추상클래스와 같은 것 들은 생명력이 없는 것 아니냐는 질문을 할 수 있지만 그러한 인터페이스나 추상클래스 조차도 어떤 객체에 사용되면 오버라이드가 되지 않는 한 확장 또는 구현(Implements)선언 만으로 구현 되는 기능들이 존재합니다. 차라리 생명력이 있는 하나의 클래스를 만들기 전에 인터페이스나 추상클래스같은 것들을 만들어서 파생적으로 세포로서 생명력이 있는 클래스를 만든다면 다형성의 좋은 예로서 활용될 것입니다.


마지막으로 "증식 또는 배양을 통하여 또 다른 종으로서 사용할 수 있게해야합니다."는 주의 사항은 내가 만든 클래스를 누군가 확장하거나 재사용이 가능 하도록 만들어야 한다는 것입니다. 바로 위에서 설명했듯이 인터페이스나 추상클래스와 같은 녀석들은 자체적으로 존재할 수 없습니다. Head First Java에서는 추상클래스를 다음과 같이 예를 들었습니다.


동물에는 개과 고양이과와 같은 식의 종의 분류들이 있습니다. 이 종의 분류는 실제하기는 하지만 종의 분류자체가 하나의 동물은 아닙니다. 이와 같이 추상 클래스는 다형성에서 상속과 관련하여 하나의 종의 분류와 같이 사용할 수는 있지만, 그것 자체로서는 하나의 객체가 될 수 없는 것이어야 한다고 말합니다.


인터페이스도 이와 비슷합니다. 다중상속을 허용하고 있지 않은 자바에서 다중상속과 비슷한 역활을 하는 것이 바로 이 인터페이스입니다. 인터페이스는 다음과같이 설명합니다. 상속관계와 무관하게 어떤 객체가 확장성을 위하여 가지고 있어야 하는 특성(또는 하는 일)이 필요할 때 인터페이스를 만들고 이를 구현합니다.


위에 밑줄 친 두 개의 예문은 좋은 예시가 되어 주리라 생각합니다. 어떤 객체를 만들기 앞서 그 객체들의 고통관심사나 공통분모를 찾아 내어서 하나의 추상클래스나 인터페이스화 하는 것 이것은 후에 내 클래스가 누군가에 의해서 확장되는 데에 많은 영향을 줄 것이라고 생각합니다.


마치며...


필자는 최근에 2개의 프로그램을 만들어 보았습니다. 하나는 TelegramSpliter(SVN 주소입니다. 받아서 확장하실 분은 메일 주시거나 댓글로 의사표현을 해주시면 함께 발전해 나갈 수 있었으면 하는 바램입니다)로 전문을 받아서 사용자가 입력해준 전문 길이로 전문을 나누고 사용자가 입력해준 클래스로 자동으로 Wrapping해주는 프로그램을 만들어 보았고, 또 하나는 전문을 가지고 오는 프로그램(각가지 방식-FTP, HTTP, SSH등-으로 통신하는)을 만들어 보았습니다. 이 때 Head First Java에서 배운 내용으 가지고 여러가지 활용을 해보면서 사용해 보았습니다. 앞으로 내공을 더 쌓아서 객체지향 프로그램에서 스프링이나 스트러츠를 만들었던 분들과 같이 되고 싶은 것이 내 바램입니다.

Posted by gofly

댓글을 달아 주세요

1.스토리지의 정보를 조회합니다.

$ sudo fdisk -l(L입니다. 소문자...)


2.마운트 시킬 포인트를 만듭니다.

$ sudo mkdir /media/usb_storage


3.마운트 합니다.

$ sudo mount -t vfat /dev/sdb /usb_storage //fat계열로 포멧된 경우

   또는

$ sudo mount -t ntfs-3g /dev/sdb /usb_storage //ntfs계열로 포멧된 경우


## 여기에서 /dev/sdb는 fdisk -l을 했을 때 보이는 내용을 가지고 유추한 것입니다.

## 아래 사진을 참고하시기 바랍니다.




## 위에 빨간 부분으로 밑 줄이 그어져 있는 부분이 제가 추가한 USB스토리지의 정보입니다. 

## 그리고 /dev/sdb ^(띄어쓰기) /media/usb_storage를 하게 되면 sdb를 usb_storage에 마운트 하겠다는 의미가 되어 마운트가 정상 적으로 이뤄지게 됩니다.


Posted by gofly

댓글을 달아 주세요

요즘 ORM으로는 하이버네이트, JPA등 많이 사용하고 있으나, 역시 SI 쪽은 mybatis(ibatis)를 많이 사용된다.

문제는 mybatis는 xml로 sql을 관리하고 있는데 보통 조금 바꿀때 마다 서버를 재구동 시켜야 되는 문제가 된다.

시스템이 클 경우 재시작시 오랜 시간 걸리고 session 사용시 또 로그인을 해야 하는듯 개발의 흐름이 끊어지는 문제가 많이 발생한다.

예전에 ibatis를 사용 했을시에도 그런 부분이 많이 불편했었는데, 예전 대우정보시스템의 JCF 프레임워크에서 사용된다고 Refresh 되는 클래스 소스가 한번 공개 된적이 있었다. ( 몇년전인지 기억은 안나지만, 당시 인터넷 검색으로 찾았었다. )

그것이 버전이 문제인지 바로 사용이 안되어서 커스터마이징하고 사용을 잘사용 했었다.

그런데 지금 프로젝트가 mybatis로 진행하기 때문에 예전과 같은 불편함이 또 생기게 되었는데, 이 번에는 그 소스를 mybatis에 맞도로 커스터마이징 하기로 했다.  

일단 사전 조건은 

JDK 1.5 이상, Spring, mybatis, spring-mybatis 라이브러리가 설치되어 있는 환경에서만 된다.


일단 기존 Spring 에서 mybatis 설정을 보겠다.

보통 sqlSessionFactory를 이렇게 설정 한다. 

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" p:mapperLocations="classpath*:패키지경로/**/mapper.xml" p:configLocation="classpath:/MapperConfig.xml" p:dataSource-ref="dataSource"/>

classpath*:패키지경로/**/mapper.xml  <- 이부분이 재로딩될 xml 파일 경로

이부분에서 굵게 표시한 class 부분만 새로 만든 클래스로 바꾸면 모든게 해결된다.

<bean id="sqlSessionFactory" class="패키지경로.RefreshableSqlSessionFactoryBean" p:mapperLocations="classpath*:패키지경로/**/mapper.xml" p:configLocation="classpath:/MapperConfig.xml" p:dataSource-ref="dataSource" />

RefreshableSqlSessionFactoryBean.java

import java.io.IOException;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.Timer;

import java.util.TimerTask;


import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.apache.ibatis.session.SqlSessionFactory;

import org.mybatis.spring.SqlSessionFactoryBean;

import org.springframework.beans.factory.DisposableBean;

import org.springframework.core.io.Resource;


import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantReadWriteLock;


/**

 * mybatis mapper 자동 감지 후 자동으로 서버 재시작이 필요 없이 반영

 *

 * @author

 *

 */

public class RefreshableSqlSessionFactoryBean extends SqlSessionFactoryBean implements DisposableBean {


private static final Log log = LogFactory .getLog(RefreshableSqlSessionFactoryBean.class);


private SqlSessionFactory proxy;

private int interval = 500;


private Timer timer;

private TimerTask task;


private Resource[] mapperLocations;


/**

 * 파일 감시 쓰레드가 실행중인지 여부.

 */

private boolean running = false;


private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();

private final Lock r = rwl.readLock();

private final Lock w = rwl.writeLock();


public void setMapperLocations(Resource[] mapperLocations) {

super.setMapperLocations(mapperLocations);

this.mapperLocations = mapperLocations;

}


public void setInterval(int interval) {

this.interval = interval;

}


/**

 *

 * @throws Exception

 */

public void refresh() throws Exception {

if (log.isInfoEnabled()) {

log.info("refreshing sqlMapClient.");

}

w.lock();

try {

super.afterPropertiesSet();


} finally {

w.unlock();

}

}


/**

 * 싱글톤 멤버로 SqlMapClient 원본 대신 프록시로 설정하도록 오버라이드.

 */

public void afterPropertiesSet() throws Exception {

super.afterPropertiesSet();


setRefreshable();

}


private void setRefreshable() {

proxy = (SqlSessionFactory) Proxy.newProxyInstance(

SqlSessionFactory.class.getClassLoader(),

new Class[] { SqlSessionFactory.class },

new InvocationHandler() {

public Object invoke(Object proxy, Method method,

Object[] args) throws Throwable {

// log.debug("method.getName() : " + method.getName());

return method.invoke(getParentObject(), args);

}

});


task = new TimerTask() {

private Map<Resource, Long> map = new HashMap<Resource, Long>();


public void run() {

if (isModified()) {

try {

refresh();

} catch (Exception e) {

log.error("caught exception", e);

}

}

}


private boolean isModified() {

boolean retVal = false;


if (mapperLocations != null) {

for (int i = 0; i < mapperLocations.length; i++) {

Resource mappingLocation = mapperLocations[i];

retVal |= findModifiedResource(mappingLocation);

}

}


return retVal;

}


private boolean findModifiedResource(Resource resource) {

boolean retVal = false;

List<String> modifiedResources = new ArrayList<String>();


try {

long modified = resource.lastModified();


if (map.containsKey(resource)) {

long lastModified = ((Long) map.get(resource))

.longValue();


if (lastModified != modified) {

map.put(resource, new Long(modified));

modifiedResources.add(resource.getDescription());

retVal = true;

}

} else {

map.put(resource, new Long(modified));

}

} catch (IOException e) {

log.error("caught exception", e);

}

if (retVal) {

if (log.isInfoEnabled()) {

log.info("modified files : " + modifiedResources);

}

}

return retVal;

}

};


timer = new Timer(true);

resetInterval();


}


private Object getParentObject() throws Exception {

r.lock();

try {

return super.getObject();


} finally {

r.unlock();

}

}


public SqlSessionFactory getObject() {

return this.proxy;

}


public Class<? extends SqlSessionFactory> getObjectType() {

return (this.proxy != null ? this.proxy.getClass()

: SqlSessionFactory.class);

}


public boolean isSingleton() {

return true;

}


public void setCheckInterval(int ms) {

interval = ms;


if (timer != null) {

resetInterval();

}

}


private void resetInterval() {

if (running) {

timer.cancel();

running = false;

}

if (interval > 0) {

timer.schedule(task, 0, interval);

running = true;

}

}


public void destroy() throws Exception {

timer.cancel();

}

}


만약에 재로딩 되는 시간을 바꾸고 싶으면 

<bean id="sqlSessionFactory" class="패키지경로.RefreshableSqlSessionFactoryBean" p:mapperLocations="classpath*:kr/web/**/mapper.xml" :configLocation="classpath:/MapperConfig.xml" p:dataSource-ref="dataSource" p:interval="1000" />

 p:interval="1000" 이부분을 수치를 정해주면된다. ( 디폴트는 500, 단위 ms )


이제 설정을 서버를 시작해서 위에 로케이션 해당하는 mapper.xml ( sql이 있는 xml , 설정에 따라 다름)에서

sql을 바꿔 보자 그리고 클라이언트에서 바뀐지 확인해보자

큰 문제가 없다면 반영될것이라고 생각된다. 


아 단 운영 시스템에 사용은 보장 못합니다~ 개발시에서만 사용하세요~


이 소스는 예전에 인터넷에서 나돌던 RefreshableSqlMapClientFactoryBean 소스를 커스터마이징한 소스인데 문제가 있다면 연락주시길바랍니다.



원문:http://sbcoba.tistory.com/entry/Spring-mybats-%EC%82%AC%EC%9A%A9%EC%8B%9C-%EC%9E%AC%EC%8B%9C%EC%9E%91-%EC%97%86%EC%9D%B4-%EC%84%9C%EB%B2%84-%EB%B0%98%EC%98%81

Posted by gofly

댓글을 달아 주세요

XDA 퍼온 글입니다. Galaxy S3 Touchwiz 를 겔투에 맞게 리사이징 작업 한거네요 ㅎ


Galaxy S3 가 ICS기반이여서.. 
ICS만 될듯하네요..


경로는 아래와 같이...

/system/app/SecLauncher2.apk      퍼미션 644 (rw-r--r--)
/system/lib/libdrawglfunction.so      퍼미션 644 (rw-r--r--)

META-INF는
/ 밑으로 폴더채 복사하여 넣습니다(이렇게하면 껐다가 켜면 Script가 자동으로 실행됩니다).

참고로 갤럭시 S2 HD LTE나 갤럭시 S2 LTE는 5*5가 않되는듯 합니다. 해상도 문제 때문에요....
그래서 갤치디난 S2 LTE는 4*5로 자동 보정됩니다.....

이하 원문.
-----------------------------------------------------------

Hi Guys!

This is my first work, i have ported the new Touchwiz UX launcher from Galaxy S3 to our GS2.

Try it and give me feedback, there are some things to fix but it' s look very nice and smooth

Work only on Samsung based Roms!

Changelog:
TouchwizUX-1.1 :
-Fixed widget layout issues

TouchwizUX-1 :
-Fullsize Icon
-Page indicators in AppDrawer
-Other layout fix

Thanks to wanam and zohawkish to point me on the right way with framework releated smali code!



TouchwizUX-1.5.1-5x5.zip


Posted by gofly

댓글을 달아 주세요

  1. 알통맨이야 2012.08.16 20:37  댓글주소  수정/삭제  댓글쓰기

    근데 바탕화면에 위젯이 안되요 ㅠㅠ

    • Favicon of https://belong2jesus.tistory.com BlogIcon gofly 2012.08.16 23:57 신고  댓글주소  수정/삭제

      바탕화면을 꾹~~~ 누르고 있으면

      "홈화면에 추가"를 누르면
      "앱스"를 누릅니다. 그러면 상단에 "앱스"가 있고 그 옆으로 TAB형식으로 "위젯"이라고 보입니다....

      거기서 위젯하나를 골라서 꾹~~~~누르고 있으면 바탕화면으로 추가가 됩니다....


      물론 그냥 홈화면 말고 "앱"화면으로 가면 상단에 "위젯"이라고 보입니다. 거기서 동일하고 위젯 골라서 꾹~~눌러서 바탕화면에 추가하시면 됩니다.....

      터치위지 5부터는 위젯 추가하는게 변경되어서 좀 헛갈리실 겁니다.....

  2. 알통맨이야 2012.08.17 08:52  댓글주소  수정/삭제  댓글쓰기

    혹시 루팅 필수인가요? 저는 지금 순정폰이라...위젯을 설치하려하면 퍼미션이 안되있다고 나와요..