OTP 기능을 구현하라는 미션이 떨어졌고, 힌트로는 구글OTP라는 것이 있다라는 것만 받았다.


   찾아보니 거의 다 "Google Authenticator"라는 앱을 다운받아서 구글 로그인을 할 때에 이용하는 내용이었다.


   뭔가 구글에서 제공하는 API가 있어야 구글앱을 이용해서 개발을 할 수 있을 텐데, 눈을 씻고 찾아봐도 API는 없었다.


   찾다찾다 구글앱의 공식 홈페이지에서 파일들을 다운로드 할 수 있는 곳을 찾았는데, C언어로 되어있고 내가 원하는 것은 아니었다. 아마도 SSH로 접속해서 이걸 설치하고 로그인을 할 때에 사용하는 그런 종류인 듯 싶다.(이곳 참고)


   알고리즘을 중심으로 찾아본 결과, 아마도 IETF에 있는 RFC6238이라는 문서를 기반으로 구글앱이 이와 같은 알고리즘으로 구현을 해놓은 것 같다.


   따져보니 이것과 똑같은 알고리즘으로 Key/바코드를 만들어내고 그것을 검증하는 코드를 짜면 완벽하게 구글앱을 사용하는 OTP 기능을 만들어낼 수 있을 것 같았다.


   다른 사람들이 만들어놓은 자바 코드를 찾지 못했을 경우, 최악의 경우엔 정말 그렇게 해보려고 했다.


   국내에선 파이썬 코드를 쉽게 찾을 수 있었지만 자바가 아니어서 아무 쓸모가 없었다.


   지푸라기라도 잡는 심정으로 온갖 검색어 조합을 동원하여 외국 사이트를 이 잡듯이 뒤진 결과,


   다행히 누군가 자바스크립트로 구현해놓은 코드를 발견했다.


   미칠듯이 기뻤다. 속으로 감동의 눈물을 흘릴 정도였다. 그러나 의존하는 라이브러리 파일들을 제대로 다 링크해주고, 코드도 이대로 했음에도 불구하고 어떤 연유에서인지 내가 테스트하는 프로젝트에서는 작동하지 않았다. 


   이내 포기하고 다른 코드를 찾아 헤맸는데, 정말 다행스럽게도 자바로 구현한 코드를 찾았냈다!!!


   그런데 이것도 코드에서 sercretSize, numOfScratchCodes, scratchCodeSize를 몇으로 설정해줘야 하는지 별 말도 없고 그닥 친절하지 않아서 적용에 실패했다.


   더 찾아보니 이 코드를 기반으로 복잡하게 만들어놓은 코드를 발견했는데, 이건 더 머리가 터질 것 같았다. 하루 반 동안 붙잡고 하다가 GG.


   결국 다시 간단한 자바 코드로 돌아가서 붙잡고 요리조리 해본 결과, 성공!!!!


   서론이 길었다.;;


   아무튼 총 4일 동안 끙끙대서 성공한 결과물을 아래에 설명하고자 한다. 비록 내가 처음부터 날코딩한 것은 아니지만, OTP를 구현하려 나처럼 인터넷 망망대해를 떠돌고 있을 불쌍한 중생들을 위해 올려놓는다.




   먼저 OTP란 무엇이고 어떻게 돌아가는지부터 알고 들어가야 하니 간단하게 짚고 넘어가겠다.



   1. OTP란?


   One Time Password의 약자로, 우리말로 하면 일회용 비밀번호라 할 수 있다. 일회성이라는 특징 때문에 일반 비밀번호 입력이나 공인인증서 이용보다도 더 안전한 방법으로 알려져있다. 주로 금융권이나 일반 웹사이트 2차 로그인 인증으로 많이 활용되고 있다. OTP의 종류에는 원리에 따라 S/KEY방식, 시간 동기화 방식, 챌린지 응답 방식, 이벤트 동기화 방식 등이 있다. (좀더 자세한 내용을 알고 싶다면, 위키백과 참조) 여기서는 이중 시간 동기화 방식을 사용한 Google Authenticator라는 앱으로 TOTP 인증을 구현해보도록 하겠다.




   2. TOTP((Time-based One Time Password)의 원리


   많은 사람들이 오해하는 게 있는데(나 또한 그랬다), OTP 기기와 서버가 통신하는 줄 착각한다. 실상은 그렇지 않다. OTP 기기와 서버는 모두 같은 알고리즘을 바탕으로 하기 때문에 통신이 필요치 않다. 원리는 간단하다. 서버쪽에서 해당 알고리즘으로 Key나 바코드 주소를 생성해주면 그걸 OTP 기기에 입력해준다. 그러면 기기에서는 그 Key나 바코드를 기준으로 하여 30~60초 마다 계속하여 새로운 일회용 비밀번호를 생성해낸다. 그 일회용 비밀번호를 입력하여 서버로 전송하면 서버에서 그 비밀번호가 맞는지 알고리즘으로 확인하는 방식이다. 여기서 구글앱을 이용한다는 것은 OTP 기기 대신에 스마트폰에 있는 Google Authenticator라는 앱으로 대체한다는 것이다.


   뭔가 복잡해보이지만, 이해하고나면 쉽다.




   3. Java로 구현해보기.


   자 그럼 Java로 직접해보자. 아래는 JSP를 이용해서 웹사이트에 구현하다는 가정 하에 진행하였다.


   먼저 commons-codec.jar 파일을 라이브러리에 추가해준다.



 commons-codec-1.9.jar



   또 만약 자바 버전이 1.6 이하일 경우에는 아래의 파일을 다운받아서 라이브러리 추가해준다.



 security.jar



   그리고 자신의 스마트폰에 Google Authenticator 앱을 다운받아 설치해놓는다.

   


   다음은 실제 코드다.


   2차 인증 로그인 리퀘스트가 들어올 시, 사용자명과 계정명을 받아서 키를 생성할 부분.


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import java.io.IOException;
import java.util.Arrays;
import java.util.Random;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.apache.commons.codec.binary.Base32;
 
public class OtpServlet extends HttpServlet {
 
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
         
        // Allocating the buffer
//      byte[] buffer = new byte[secretSize + numOfScratchCodes * scratchCodeSize];
        byte[] buffer = new byte[5 5 5];
         
        // Filling the buffer with random numbers.
        // Notice: you want to reuse the same random generator
        // while generating larger random number sequences.
        new Random().nextBytes(buffer);
 
        // Getting the key and converting it to Base32
        Base32 codec = new Base32();
//      byte[] secretKey = Arrays.copyOf(buffer, secretSize);
        byte[] secretKey = Arrays.copyOf(buffer, 5);
        byte[] bEncodedKey = codec.encode(secretKey);
         
        // 생성된 Key!
        String encodedKey = new String(bEncodedKey);
         
        System.out.println("encodedKey : " + encodedKey);
         
//      String url = getQRBarcodeURL(userName, hostName, secretKeyStr);
        // userName과 hostName은 변수로 받아서 넣어야 하지만, 여기선 테스트를 위해 하드코딩 해줬다.
        String url = getQRBarcodeURL("hj""company.com", encodedKey); // 생성된 바코드 주소!
        System.out.println("URL : " + url);
         
        String view = "/WEB-INF/view/otpTest.jsp";
         
        req.setAttribute("encodedKey", encodedKey);
        req.setAttribute("url", url);
         
        req.getRequestDispatcher(view).forward(req, res);
         
    }
     
    public static String getQRBarcodeURL(String user, String host, String secret) {
         
        return String.format(format, user, host, secret);
    }
     
}




   otpTest.jsp

1
2
3
4
5
6
7
8
9
10
당신의 키는 → ${encodedKey } 입니다. <br>
당신의 바코드 주소는 → ${url } 입니다. <br><br>
 
<form action="<%=request.getContextPath() %>/otpTestResult.ok" method="get">
    code : <input type="text" name="user_code"><br><br>
     
    <input type="hidden" name="encodedKey" value="${encodedKey }" readonly="readonly"><br><br>
    <input type="submit" value="전송!">
     
</form>


   키나 바코드를 이용해 구글앱에서 항목을 추가한 뒤, 거기서 생성되는 일회용 비밀번호를 code 부분에 써주고 전송을 클릭한다.



   code 부분에 저 숫자를 넣어주면 된다.




   전송 리퀘스트를 받는 부분에서 해당 코드가 맞는지 여부를 검사한다.


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Date;
 
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.apache.commons.codec.binary.Base32;
 
public class OtpResultServlet extends HttpServlet {
 
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
         
        String user_codeStr = req.getParameter("user_code");
        long user_code = Integer.parseInt(user_codeStr);
        String encodedKey = req.getParameter("encodedKey");
        long l = new Date().getTime();
        long ll =  l / 30000;
         
        boolean check_code = false;
        try {
            // 키, 코드, 시간으로 일회용 비밀번호가 맞는지 일치 여부 확인.
            check_code = check_code(encodedKey, user_code, ll);
        catch (InvalidKeyException e) {
            e.printStackTrace();
        catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
         
        // 일치한다면 true.
        System.out.println("check_code : " + check_code);
         
    }
 
    private static boolean check_code(String secret, long code, long t) throws NoSuchAlgorithmException, InvalidKeyException {
        Base32 codec = new Base32();
        byte[] decodedKey = codec.decode(secret);
 
        // Window is used to check codes generated in the near past.
        // You can use this value to tune how far you're willing to go.
        int window = 3;
        for (int i = -window; i <= window; ++i) {
            long hash = verify_code(decodedKey, t + i);
 
            if (hash == code) {
                return true;
            }
        }
 
        // The validation code is invalid.
        return false;
    }
     
    private static int verify_code(byte[] key, long t)
            throws NoSuchAlgorithmException, InvalidKeyException {
        byte[] data = new byte[8];
        long value = t;
        for (int i = 8; i-- > 0; value >>>= 8) {
            data[i] = (byte) value;
        }
 
        SecretKeySpec signKey = new SecretKeySpec(key, "HmacSHA1");
        Mac mac = Mac.getInstance("HmacSHA1");
        mac.init(signKey);
        byte[] hash = mac.doFinal(data);
 
        int offset = hash[20 1] & 0xF;
 
        // We're using a long because Java hasn't got unsigned int.
        long truncatedHash = 0;
        for (int i = 0; i < 4; ++i) {
            truncatedHash <<= 8;
            // We are dealing with signed bytes:
            // we just keep the first byte.
            truncatedHash |= (hash[offset + i] & 0xFF);
        }
 
        truncatedHash &= 0x7FFFFFFF;
        truncatedHash %= 1000000;
 
        return (int) truncatedHash;
    }
     
}


   시간이 흘러서 일회용 비밀번호가 계속 바뀌어도 바뀐 일회용 비밀번호를 입력하면 완벽하게 true를 뱉어냄을 확인할 수 있다.


   지금까지 구글앱을 이용한 OTP 기능을 어떻게 구현하는지 알아봤다.


   사실 구글앱을 이용하는 방법 말고도 오픈소스를 이용한다든지, 돈으로 떼우는 방법 등등..  방법은 많다.


   아무쪼록 구글앱을 이용한 OTP 기능 개발을 찾아헤매는 사람들에게 도움이 되었길 바란다.

저작자 표시
신고
Posted by gofly

설치

시작하기 전에 다음 명령으로 시스템에 설치되어 있는 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

/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

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

루트(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, 명령어

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


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

/usr/share/pixmaps/eclipse.xpm


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

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

저작자 표시
신고
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

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

■ 하나의 파일로 묶기

tar cvf 파일명.tar 압축할폴더명

예) tar cvf backup.tar www


■ 압축하기

tar cvfz 파일명.tar.gz 압축할폴더명

예) tar cvfz backup.tar.gz www


■ 압축 풀기

1) 묶었을때>> tar xvf 묶은파일명.tar 

2) 압축시에>> tar xvfz 압축한파일명.tar.gz


■ zip으로 압축하기 압축 풀기

zip 설명 보기 명령어 : zip

zip 파일이름 -x


■ rar로 압축하기 압축 풀기

unrar x 파일명 

저작자 표시
신고
Posted by gofly

구글이 구글 I/O기조연설에서 구글드라이브를 쓰고 있는 기업들을 나열 할 때 우리나라의 포스코가 구글드라이브를 도입한 것으로 나와서 충격을 줬습니다.


국내기업에서 구글의 클라우드를 쓴다는 것이 너무나 이색적이고 파격적이었기 때문이라고 생각합니다.


사실 구글 드라이브는 많은 이슈가 되긴 하나봅니다. 왜냐하면 저의 블로그에 들어오시는분들 그중에서도 "구글 드라이브"를 키워드로 찾아 들어 오시는 수가 일평균 방문객중에 가장 많은 방문자를 차지하고 있는 것을 보면 구글 드라이브에 대한 관심은 대단하다고 생각이 듭니다.


그리고 구글 I/O기조연설에 나온 또다른 기사에서는 "이제부터 구글 드라이브 오프라인 편집가능"이라는 말이 나오더라구요 물론 오프라인에서 작업한 것은 캐쉬되어 있다가, 인터넷이 연결되면 캐시되어있던 작업내용들을 동기화 하는 방식으로 동작한다고 하네요.....^^


그래서 오늘은 구글 드라이브의 오프라인 설정에 관하여서 알아보도록 하곘습니다.


구글 드라이브 오프라인 설정하기...


구글 드라이브는 차차 보게되겠지만;;;; 오프라인으로 싱크하는 방법이 2가지 재공이 됩니다.

첫 번째는 구글드라이브 어플리케이션을 설치해서 싱크하는 방법이 있고, 구글 드라이브 싸이트에 가서 오프라인에대한 확인해 주는 것으로  간단하게 사용될 수 있는 상황이 됩니다.


구글 들라이브에 들가게 되면 내 드라이브에 있는 폴더 및 파일들의 리스트가 보입니다. 

구글 드라이브구글 드라이브



위와 같이 설정버튼을 클릭하면 롤다운 메뉴가 나옵니다.



구글 드라이브 설정 메뉴구글 드라이브 설정 메뉴



위 그림에 표시된 곳을 클릭합니다. 그러면 아래와 같이 오프라인 베타 설정에대한 popup이 뜨게 됩니다.


문서도구 오프라인 베타 설정창문서도구 오프라인 베타 설정창


이미 오른쪽의 "드라이브 Chrome 웹 앱 설치"은 설치되어 있습니다. 이제는 왼쪽에 "Set up offline Docs(View only)만 "Enable offline Docs"만 해주면 오프라인에서도 구글 드라이브를 통한 문서작성을 할 수가 있게 됩니다.



오프라인 문서도구 준비 끝!!오프라인 문서도구 준비 끝!!


자!! 이제 오프라인에서도 구글드라이브를 통해 문서 작성을하고 온라인이 되면 싱크하고 뭐 이런 멋진 클라우드 오피스 환경이 갖춰지게 되었습니다!!!! 수고 하셨습니다.



마치며...


점점 구글드라이브는 클라우드 컴퓨터로서 입지를 굳혀가는 느낌입니다. 왜냐하면 Google Compute Engine을 구글 I/O에서 발표하며 경쟁자로 아마존의 EC2(Elastic Compute Cloud)를 지목했기 때문입니다. 사실상 현존하는 거의 모든 클라우드 컴퓨팅기술이 아마존의 기술이라고 해도 과언이 아닐정도로 기술적으로 많은 영향을 줬는데....이제는 구글이 경쟁을하겠다고 나선것이죠.....

뭐 미래가 보이니 믿음직해 보이긴 하네요......이제 구글드라이브와, 메일, 그리고 피카사, 구글 플레이 북등을 합쳐서 하나의 유기적인 클라우드 환경을 만들면 좋겠다 하는 생각이 듭니다.


저작자 표시
신고

'Software Story > Google' 카테고리의 다른 글

구글드라이브 오프라인 설정하기  (0) 2012.06.29
Google Drive - 구글 드라이브  (5) 2012.05.02
Posted by gofly

 find

    : 지정된 경로로 주어진 조건에 따라 파일을 찾고, 그 경로를 보여줌

      root에서 접근 권한을 제한한 파일이나 디렉토리에 관해서는 " 허가 거부됨" 이라는

      메세지가 뜨고 찾지를 못함 (경로를 지정하지 않으면 현재 디렉토리부터임)

   1. 사용법

       find [경로] options expression!

    2. 옵션들

        -name : 이름을 기준으로 ...

        -perm : 퍼미션을 기준으로...

        -gruop: 해당그룹 소유의  파일이나 디렉토리를 찾을때

        -user : 해당 소유자의 파일이나 디렉토리를 찾을때

        -atime n  : n일 이전에 엑세스한 파일을 찾을때

        -ctime n : n일 이전에 변경된 파일을 찾을때

        -mtime n : n일 이전에 수정된 파일을 찾을때

        -exec : 찾아진 파일등과 연계하여 명령을 내리게 하는 옵션

                    사용하기위해 마지막에  " \; "를 입력해야함.

         -type : 찾고자 하는 파일이나, 디렉토리의 유형을 지정해 줄때

                1)  -type d : 디렉토리를 찾는다

                2)  -type f : 일반파일을 찾는다

                3)  -type l :  링크된 것을 찾는다.

                4)  -type b : 블록 파일을 찾는다.

                5)  -type c : 문자 파일( usb, serial port)을 찾는다.

                6)  -type p : 파이프인 특수 파일을 찾는다      

                7)  -type s : 소켓파일을 찾는다. 

         -ok : -exec와 유사

         -print : 출력을 화면으로...(생략가능)

                   뒤에 2>/dev/null 를 쓰면 접근 권한이 없는 파일이나 디렉토리에 접근시 나오는

                    리스트는 화면에 출력하지 않는다. -->이 부분은 find명령어에서 권한이 없다고 나오는 메세지를 않볼 수 있게                     해줍니다.

         ex) find [경로] -name [파일이름] -print 2>/dev/null

         

         -ls : 상세히 출력

         -size n : n블록 길이의 파일을 찾는다. +n은 n블록보다 큰파일, -n은 n블록도다 작은파일

                       nc는 n문자 길이의 파일..

         -inum n : inode번호가 n인 파일을 찾을때

저작자 표시
신고
Posted by gofly

페이스북 댓글에 오타를 남기거나 실수를 했을 때, 이제 이것을 고칠 수 있게 됐다. 게시물의 댓글을 수정하고 수정 히스토리르 볼 수 있는 기능을 적용하기 시작했다. 곧 모든 사용자들이 이용할 수 있게 될 전망이다.
 
지금까지 댓글 편집은 댓글을 올린 후 몇 초 동안만 삭제를 위한 X 버튼을 누르면 일시적인 수정 옵션이 제공됐다. 하지만 이제 시간의 구애 없이 계속 수정을 할 수 있다. 오늘 작성한 것이든 지난 달에 작성한 것이든 상관없이 댓글을 수정할 후 있는 것. 댓글의 오른쪽 상단에 마우스를 올리면 “수정 또는 삭제”라는 설명과 함께 연필 모양 아이콘이 나타난다.
 
수정을 클릭하면 댓글의 글을 지우거나 추가해서 변경할 수 있다. 타임라인을 살펴보면서 여태껏 썼던 댓글을 수정할 수 있어, 지금까지의 일시적인 수정 기능보다 훨씬 더 유용하다. 
 
페이스북은 여전히 사용자의 활동을 추적한다
추적이 불가능하다는 생각은 버리자. 페이스북은 새로운 댓글 수정 히스토리 보기 기능도 같이 도입했다. 이는 댓글을 수정하면 이 댓글이 수정됐음을 알리는 ‘수정됨’ 표시가 나타난다.
 
누군가 ‘수정됨’을 클릭하면, 원래 글과 수정된 버전을 보여주는 팝업창이 나타난다. 따라서, 논란이 되는 댓글을 수정했다고 해서 그 논란에서 완전히 벗어날 수 있다는 생각은 버려야 한다. 
 
이 같은 수정 기능은 아직 공식으로 발표되지는 않았지만, 게시물에도 적용될 것으로 기대된다. 
 
페이스북의 모바일 댓글 플러그인에서도 댓글 수정 기능을 이용할 수 있는지는 아직 확실하지 않다. 키보드 자동 고침으로 실수가 왕왕 일어나는 스마트폰에서 댓글 수정은 꼭 필요할 것으로 보인다.

[발췌:IDG "'드디어'페이스북 댓글 수정 기능 추가" http://www.itworld.co.kr/news/76452]

저작자 표시
신고
Posted by gofly

요즘에 화두가 되고 있는 n-Screen프로그램들 많이 나오고 있습니다. 대부분이 휴대폰에 View 프로그램을 깔아서 내 PC를 조정하는데, 이번에는 반대로 PC에서 내 휴대폰을 조정할 수 있는 프로그램이 나와서 이렇게 소개하고자 합니다.


바로 Mobizen이라는 프로그램인데요, 이 프로그램은 최근에 많은 화두로서 이슈를 불러잃으키고 있습니다(www.mobizen.com).

업무중 카카오톡이 오면 PC사용하다 말고, 휴대폰을 붙잡고있어야 했는데요. 이제는 PC에서 내 휴대폰을 관리할 수 있으니 편하기 그지 없는 프로그램이라고 생각합니다.

현제는 베타테스트 중인것 같고, 무료로 프로그램을 다운 받을 수 있습니다.


Mobizen은 3가지 방법으로 내 휴대폰에 접근을 할 수 있는데, 첫 쨰로 USB연결, 둘 째로 Wifi, 셋 째로, 3/4G로 연결하는 것이 있습니다.

우선 PC에서 Mobizen을 사용하기 전에, 스마트폰으로 안드로이드 마켓인 Play에서 Mobizen을 조회해서 App을 설치하고, 사용할 E-mail과 휴대폰에 접근할 때 허락할 수 있는 비밀번호(숫자 4자리)를 정해줍니다. 그리고 나서 모비젠 사이트에서 프로그램을 받아 설치하고 실행을 합니다. 휴대폰에 접근하는 방법은 3가지고 아래에 간략히 소개해 드리겠습니다.


  1. USB는 환경설정에 "개발자 옵션"에서 USB디버깅을 체크해 줘야합니다.
  2. Wifi는 같은 AP(Access Point)에서만 PC에서 휴대폰으로 접근이 가능합니다.
  3. 3/4G는 위의 두가지 방법이 않될 때는 자동적으로 3/4G로 접근이 가능합니다.

이메일을 등록하고, 비밀번호등록이 끝났다면 PC에서 모비젠을 실행합니다. 


이제 모비젠 프로그램은 자동적으로 USB, Wifi, 3/4G를 사용해서 휴대폰 프로그램을 찾습니다.


모비젠서버에 로그인하는 모습모비젠서버에 로그인하는 모습


앱을 설치할 때 등록했던 E-Mail을 찾습니다. 로그인을 한다고 생각하시면 됩니다.

그리고, 비밀번호를 넣으면 이제 스마트폰과의 모든 연결은 끝이 났습니다.


모비젠에서 카카오 스토리를 실행한 모습모비젠에서 카카오 스토리를 실행한 모습

위 화면은 로그인 후에 카카오톡를 실행한 화면입니다.

이젠 업무중 카카오가 올 때 휴대폰 잡고 있고 할 필요가 없을 것 같아 참 다행입니다.....^^


마무리

몇가지 아쉬운점은 화면의 밝기나 해상도 또는 컬러정보가 살짝 아쉽습니다.

또, Shift가 안눌린다는 단점 떄문에 된발음계열 및 숫자와 함께있는 특수기호들을 키보드에서 직접 입력하지 못한다는 것입니다.

뭐 아직은 베타이고 하니 많이 고쳐질 것이라 생각합니다.

조금 걱정되는 것이 있따면 유료전환을 할 까봐 조금 걱정입니다.

뭐 그래도 우선 베타로 사용할 수 있으니 잘사용하면 좋을 듯합니다......^^


신고
Posted by gofly