humbleCoding

tkHWANG's humble tech blog | Still Learning

[Android] Photo, Video 와 같은 Media Access 하기 위한 Permission

| Comments

Android 의 security model 은 linux kernel 에 기반을 둔 sandbox sepration 과 함께 manifest permission 이 중요한 부분을 이루고 있다.

주요 개인 정보를 다루기 위한 필요한 permission

몇가지 android manifest permission
1
2
3
4
5
6
7
8
9
android.permission.READ_SMS
android.permission.READ_CONTACTS
android.permission.READ_CALENDAR
android.permission.READ_USER_DICTIONARY
android.permission.READ_PHONE_STATE
android.permission.READ_SYNC_SETTINGS
android.permission.READ_SYNC_STATS
android.permission.READ_LOGS
com.android.browser.permission.READ_HISTORY_BOOKMARKS

하지만, 중요한 개인 정보 중의 하나라고 생각되는 개인이 만든 media 를 access 하기 위한 permission 은 보이지 않는다.

  • Photo
  • Video
  • 개인 media

왜 이러한 media 를 access 하기 위한 permission 은 없는 것일까 ???

Android permissions to access media store

관련해서 찾아보다가 stackoverflow 에 좋은 답변 하나를 발견.

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
[Q] Are there any specific permissions needed to access android's
mediastore? I wrote a test app that could access all of the users
photos - but I find this behavior unexpected. It really seems like
there should be some permissions to access this data.

[A] Images(and video) taken with the device camera are stored in the
External Storage (SD card on most devices) generally they are stored
in sdcard/dcim/Camera/


On android there is no permission required to read from the external
storage, this means that any application that is installed on the
device could indeed have access to the photos that were taken with
your device.


writing to the external storage does however require a permission, so
if an application wanted to delete or change one of these files they
would need to have that permission.


Though, to be honest unfortunately I think the permissions are a moot
point. If there is a nice pretty icon, and promises of amazing things
the general population will install anything regardless of what
permissions it requires. For most people the permissions page is just
that thing where you have to scroll down and press install.

Android 에서 사진, 비디오와 같은 media 파일은 sandbax spepraacted 된 /data/data/package 폴더와 같은 개인 어플리케이션을 위한 데릭토리가 아니라 sdcard 와 같은 외장 메모리에 저장이 되고 있고, 외장 메모리에 경우에는 파일에 대한 access 제어가 되지 않고, 외장 메모리를 access 할 수 있다면 다른 어플리케이션에서 만든 파일도 access 를 할 수 있기 때문에 이를 윗단에서 다시 퍼미션으로 보호 조치를 만드는 것이 의미가 없다고 생각하고 있는 것 같다.

미디어 자체가 pysically 외부에서 access 할 수 있으므로 이에 대한 접근이 가능한 상황이므로, 이를 android app security 관점에서 manifest permission 으로 관리하는 것은 의미가 없다고 생각을 하는 것 같다.

구글은 개인정보를 보호하는 관점에서 퍼미션 운영 정책을 정하는 것이 아니라, 다소 geek 스럽게, 해당 리소스에 대한 접근 주체를 기반으로 해서 security model 을 운영하는 듯 하다.

개인정보가 중요하다고 생각하여 이를 보호하려고 한다면 top-down 방식으로 개인 미디어 보호를 위한 퍼미션도 만들어 두고, 이에 맞게 control 이 되도록 저장 위치도 고려하고 할텐데…

물론 사이즈 때문이겠지만, 미디어 파일은 외장 메모리에 저장하게 하고, 이 경우 access control 제어가 되지 않기 때문에 미디어 파일에 대한 접근은 누구나 가능하다가 간주하고, 이를 위한 퍼미션 처리는 하지 않고 있다는 사실…

재미있군요. 앞으로도 새로운 리소스에 대한 퍼미션 보호 정책을 고민하는데 중요한 기준이 될 것 같다. :)

(ps) 참고로 외장 메모리 access 하기 위해서는 android.permission.WRITE_EXTERNAL_STORAGE 퍼미션이 필요.

[Book] Python Cookbook 과 APUE 읽기 시작하다…

| Comments

업무 관련해서 python 을 쓰게될 일이 있어서 사용하면서 정말 괜찮은 언어인 것을 느끼는데 제대로 된 코드를 보지 못해서 아쉬움이 많이 있었는데 o’reilly 책 세일하는 것을 보고 주요 topic 에 대한 코드 예제 / recipe 가 나와 있는 python cookbook 책을 사고 매일 조금씩 좋은 코드 보면서 익힐 예정이다.

또한 하는 김에 kernel 쪽 system programming 을 위하여 APUE (Advanced Programming in the Unix Environment) 도 함께 조금씩 읽어볼 예정.

이곳에 이렇게 적어두면 그나마 조금이나마 더 보게 되지 않을까… 아자아자.. ^_;

[Android] 보안과 퍼미션 Security and Permissions

| Comments

Android Develoer Site : Security and Permissions

안드로이드는 각각의 어플리케이션과 시스템 내의 각 영역들이 자신의 공유한 프로세스 상에 실행되는 멀티 프로세스 시스템이다. 어플리케이션과 시스템 간의 대부분의 보안은 어플리케이션에 할당된 user id 혹은 group id 오 가타은 표준 리눅스 설비를 통해 프로세스 레벨에서 강제된다. 보다 섬세한 추가적인 보안 기능은 퍼미션 메카니즘에 의해 제공된다. 퍼미션은 특정 프로세스가 수행할 수 있는 특정 오프레이션에 제약을 부가한다. 그리고 데이터의 특정 영역에 대한 임시적 접근을 부여하는 URI 별 퍼미션이 있다.

보안 아키텍쳐

안드로이드 보안 아티텍쳐의 핵심 다지인 핵심은, 디폴트로 어떤 어플리케이션도 다른 어플리케이션과 운영체제, 또는 사용자에게 나쁜 영향을 미칠 수 있는 임의의 오퍼레이션을 수행할 수 있는 퍼미션을 가지지 않는다는 것이다.

하나의 어플리케이션에 의해 요처된 퍼미션은 그 어플리케이션 내에 정적으로 선언된다. 그러므로 그 퍼미션은 그 어플리케이션의 설치전에 알 수 있으며, 그 후에는 변경될 수 없다.

Application Signing

모든 안드로이드 어플리케이션은 그것의 개발자가 보유한 개인키 인증서로 서명되어야 한다. 서명이 보안에 미치는 가장 중요한 사항들은 서명 기반의 퍼미션에 누가 접근 가능하며 누가 사용자 ID를 공유할 수 있는 지를 결정하는 것이다.

User ID 와 파일 접근

안드로이드 패키지 파일에는 그것 자신의 고유한 리눅스 유저 ID 가 부여된다. 이 유저 ID 는 어플리케이션이 디바이스에 설치될 때 할당되며, 그 디바이스에 그것이 존속하는 동안 변하지 않고 유지된다.

보안에 대한 강제는 프로세스 레벨에서 이루어지기 때문에, 임의의 두 개의 패키지 내의 코드는 일반적으로 동일한 프로세스에서 실핼될 수 없다. 서로 다른 패키지가 동일한 유저 ID 부여받기 위해서는 AndroidManifest.xml 의 manifest 태그의 sharedUserId attribute를 사용할 수 있다. 이를 사용한 경우 두 개의 패키지는 동일한 어플리케이션으로 간주되며 동일한 유저 ID 와 파일 퍼미션을 갖는다. 보안을 유지하기 위해, 동일한 서명을 가진 (그리고 동일한 sharedUserId를 요청하고 있는) 두 개의 어플리케이션에게만 동일한 유저 ID 가 부여된다.

어플리케이션에 의해 저장된 모든 데이터는 그 어플리케이션의 유저 ID 가 부여될 것이며, 일반적으로는 다른 패키지들에게는 접근 불가하다. 어떤 파일을 getSharedPreferences(String, int), openFileOutput(String, int), openOrCreateDatabase(String, int, QSLiteDatabase.CursorFactory)를 사용하여 생성할 경우, 이 파일에 대한 읽기/쓰기를 다른 패키지에 허용하기 위해 MODE_WORLD_READABLEMODE_WORLD_WRITABLE 플래그를 사용할 수 있다.

퍼미션 사용하기

어플리케이션 설치 시점에, 어플리케이션에 의해 요청된 퍼미션은 해당 퍼미션을 선언하고 있는 어플리케이션의 서명 확인을 기반으로, 그리고/또는 사용자와의 상호작용에 기반해서 패키지 인스톨러에 의해 그 어플리케이션에 부여된다. 어플리케이션이 실행되는 동안에는 사용자와의 어떤 확인 절차도 이루어지지 않는다. 어플리케이션이 설치될 때 특정 퍼미션이 부여되어 해당 기능을 원하는 대로 사용할 수 있거나, 또는 그 퍼미션이 부여되지 않아 그 기능을 사용하려는 어떠한 시도도 사용자에게 알리지 않고 실패할 것이다. 종종 퍼미션 실패는 어플리케이션에 보안 예외 Security Exception가 발생하게 되지만 모든 곳에서 발생하는 것을 보장받지는 못한다. 그러나 거의 대부분의 경우에 퍼미션 실패는 시스템 로그에 기록될 것이다.

프로그램이 동작되는 동안에 다음 여러곳에서 특정 퍼미션이 강제될 수도 있다.

  • 어플리케이션이 특정 함수 수행하는 것을 방지하기 위하여 시스템 내부로의 호출 시점.
  • 어플리케이션이 다른 어플리케이션의 activity를 런치하는 것을 방지하기 위해, activity 시작하는 시점.
  • 브로드캐스트 보내고 받는 시점.
  • 컨텐트 프로바이저에 접근해서 동작하는 시점.
  • 서비스를 바인딩하거나 시작하는 시점.

퍼미션 선언 및 강제

AndroidManifest.xml

  • permission : 퍼미션을 먼저 선언.
  • permissioinGroup : 선택사항. 시스템이 사용자에게 퍼미션을 표시하는 것을 돕기 위하여 사용.
  • label : 문자열 리소스. 사용자가 퍼미션 리스트를 볼 때 표시.
  • description : 문자열 리소스. 한 개의 퍼미션을 상세히 볼 때 표시.

AndroidManifest.xml 에서 퍼미션 강제하기

시스템이나 어플리케이션의 모든 컴포넌트에 대한 접근을 제약하는 상위계층의 퍼미션들은 AndroidManifest.xml 을 통해서 적용될 수 있다. 이를 위해 요구되는 것은 필요한 컴포넌트에 android:permission attribute를 포함하고 그 컴포넌트에 대한 접근을 제어하기 위해 사용될 퍼미션 이름을 지정하는 것이 전부이다.

Activity

  • 누가 해당 activity를 시작할 수 있는지를 제약.
  • Context.startActivity()Activity.startActivityForResult() 함수 내에서 점검.
  • 만약 호출자가 필요한 퍼미션을 가지고 있지 않으며, 보안 예외가 호출되는 곳에서 발생.

Service

  • 누가 해당 서비스를 시작하거나 바인딩할 수 있는가를 제약.
  • Context.startService(), Context.stopService(), Context.bindService() 함수 내에서 점검.
  • 만약 호출자가 필요한 퍼미션을 가지고 있지 않다면, 보안 예외가 호출되는 곳에서 발생.

Receiver

  • 누가 해당 리시버에게 브로드캐스트를 발송할 수 있는 가를 제약.
  • 퍼미션은 Context.sendBroadcast() 가 리턴된 후, 시스템에 제출된 브로드캐스트를 주어진 리시버에 전달하기를 시도할 때 점검된다. 결론적으로 퍼미션 실패는 호출자에게 예외 결과를 발생시키지 않는다. 다만 퍼미션 실패는 인텐트를 전달하지 못할 뿐이다.
  • 마찬가지로 Context.registerReceiver() 에 퍼미션 제공하여, 프로그램적으로 동록된 리시버에게 누가 브로드캐스트를 할 수 있는 가를 제어할 수 있다.
  • broadcast send 시에 퍼미션 명명하는 경우에, Context.sendBroadcast() 에 퍼미션 스트링과 함께 호출하는 경우에, 이 브로드캐스트 받기 위해서는 receiver application 은 해당 퍼미션을 반드시 가지고 있어야 한다. 이와 같이 broadcaster 와 receiver 양쪽 모두 퍼미션이 필요로 할 수도 있다.

Provider

  • 누가 컨텐트 프로바이더에 있는 데이터에 접근할 수 있는가를 제약.
  • andriod:readPermission : 누가 프로바이더로부터 읽기를 할 수 있는가를 제약.
  • android:writePermission : 누가 그것에 쓰기를 할 수 있는가를 제약.

그 밖의 퍼미션 강제

  • 임의의 정교한 퍼미션들이 하나의 서비스 안으로 호출이 일어날 때 강제될 수 있다. Context.checkCallingPermission() 메쏘드에서 수행됨.
  • Context.checkPermission(String, int, int)
  • PackageManager.checkPermission(String, String)

URI 퍼미션

  • Activity 시작시킬 때나 결과를 actitity 에 리턴할 때, 그것을 호출한 곳에서 Intent.FLAG_GRANT_READ_URI_PERMISSION 및/또는 Intent.FLAG_GRANT_WRITE_URI_PERMISSION 을 설정 가능 : 인텐트를 수신하는 activity 가 인텐트에 대응되는 컨텐트 프로바이더 내의 데이터 접근 퍼미션을 보유하고 있는 지와 상관없이, 그 액티비티에게 그 인텐트 내의 특정 데이터 URI 에 대한 접근 퍼미션을 부여한다.
  • Context.grantUriPermission()
  • Context.revokeUriPermission()
  • Context.checkUriPermission()

[Python] Python 에서 Excel File 작업하기

| Comments

작업하는 python script 에서 결과물을 excel file 로 export 할 필요가 있어서 python 에서 excel file 사용하는 방법 관련하여 찾은 내용 간단하게 정리해봅니다. :)

Working with Excel Files in Python

xlrd : excel file 로부터 읽기

xlwt : excel file 로 쓰기

xlwt 설치 in Ubuntu

sudo apt-get install python-xlwt

Excel file 로 data 저장하기 (단순 버전)

Reference : Using Python to write to an Excel / OpenOffice Calc spreadsheet on Ubuntu Linux

제가 필요한 것은 우선 결과물을 보기 좋게 excel file 로 저장하는 것이라서 우선 xlwt 쪽만 이용해보았습니다.

write data in excel file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env python

import xlwt

DATA = (
    "ONE",
    "TWO",
    "THREE",
    "FOUR"
)

wb = xlwt.Workbook()
ws = wb.add_sheet("excelPage")

for i, row in enumerate(DATA):
    ws.write(0, i, row)

wb.save("excelFilename.xls")
  • xlwt.Workbook()으로 excel workbook 만들기.
  • wb.add_sheet("")로 sheet 추가.
  • 각 cell 지정하여 ws.write(x, y, data)로 값
  • 작업 끝나면 마지막 wb.save("file name")으로 file 저장하면 끝!

Cell 의 font 및 border 설정 추가한 버전

write data in excel file
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
# -*- encoding: utf-8 -*-
#!/usr/bin/env python

import xlwt

# Header Font
header_fnt = xlwt.Font()
header_fnt.name = 'Verdana'
header_fnt.bold = True

# Body Font
body_fnt = xlwt.Font()
body_fnt.name = 'Verdana'

# Borders
borders        = xlwt.Borders()
borders.top    = 0x5
borders.bottom = 0x5
borders.left   = 0x5
borders.right  = 0x5

# Header configuration
header_style = xlwt.XFStyle()
header_style.font = header_fnt
header_style.borders = borders

# Body configuration
body_style = xlwt.XFStyle()
body_style.font = body_fnt
body_style.borders = borders

TITLE = (
    "ONE",
    "TWO",
    "THREE",
    "FOUR"
)

BODY = (
    "1",
    "2",
    "3",
    "4"
)

wb = xlwt.Workbook(encoding="utf-8")
ws = wb.add_sheet("excelPage")

for i, row in enumerate(TITLE):
    ws.write(0, i, row, header_style)

for j, row in enumerate(BODY):
    ws.write(1, j, row, body_style)

wb.save("excelFilename.xls")
  • xlwt.Font() 로 선언한 font 에서 font.name, font.bold 등 property 설정 추가.
  • xlwt.Borders() 로 선언한 boards 에서 borders.{top,bottom,left,right}에 선 굵기 설정.
  • 최종 xlwt.XFStyle()로 font 와 borders 설정한 내용 설정.
  • ws.write(x,y,data,STYLE) 에 설정한 style 설정 추가하기.

xlwt 공식 사이트의 예졔

위의 링크에 나와있는 예제들을 살펴보면 어렵지 않게 좀더 고급 기술(?) 익혀서 사용하실 수 있을 것 같네요. 참고하세요.

캬~~~ 이렇게 몇 줄로 python 에서 excel file 로 write 하는 것이 가능하다니… python 참 좋다… :)

Sublime Text Editor

| Comments

개인적으로 최고의 editor는 역시나 emacs라고 생각합니다.

처음 입문에 가장 어려움으로 작용하는 key binding 이 익숙해지만 edit 하는데 그렇게 편할 수가 없고, lisp 으로 확장하여 제공되는 많은 추가 기능으로 최고의 editor 가 분명하다.

그런데, 약간 무거운 면도 있고 본격적인 editing이 아니라 간편하게 소스 보는 경우등에도 다소 버거운 면이 있는 것도 사실이다.

이런 경우에 ultra edit를 사용하다가 최근에는 notepad++를 사용하고 있는데 최근에 이보다 훨씬 세련(?)된 editor를 알게 되서 소개한다.

Sublime text

  • Python 으로 작성된 것 같은데, 전체적으로 너무 깔끔하고 이쁘다.
  • 여러 언어에 대한 syntax highlighting 이 지원 잘 되고…
  • 오른쪽에 minimap 으로 file 전체 이동하기도 쉽고… (Scott Hanselman blog 에서 봤던 RockScroll 과 동일한 interface. 요즘은 blog 나 웹의 navigate 시에도 적용하는 듯…)
  • Evaluation 을 위해서는 free 이며, 50번 저장할 때 register pop-up 뜨긴 하지만 기능 제한 없는 듯 함.
  • Sublime text 2 에서는 windows 뿐만 아니라 OS X, Linux 도 지원.
  • 현재 가장 문제점은 한글 입력. UTF-8 한글 표시는 폰트 설정하면 가능한 듯 한데, 한글 입력은 문제가 좀 있는 듯. (=> 소스 코드 읽는 용도로 주로 사용하니깐 사용에는 큰 문제 없을 듯)

Sublime text2 download : Win x32, x64, OS X, Linux x32, x64

Sublime text 1.4 download : Wins x32(?)

항상 그렇지만 editor 선택 이후에는 solarized (dark) color theme 설정과 monaco/나눔고딕 font 설정(참고: [Windows] Monaco 폰트에 한글 폰트 (나눔고딕코딩) 설정 하기)은 필수 !!

  • Preferences > Color scheme > Solarized (Dark)
  • Preferences > File Settings - User 에서 font 설정은 Monaco 로…
Preferences > File Settings - User
1
2
3
4
5
{
  "color_scheme": "Packages/Color Scheme - Default/Solarized (Dark).tmTheme",
  "font_face": "Monaco",
  "font_size": 10
}

[Android] 빌드 과정 Build Process 및 APK 구조 Structure, DEX, ODEX

| Comments

apk, .class, dex, odex 등에 익숙하지 않아서 명확하게 이해할 겸해서 andriod developer site 의 내용을 번역하면서 정리해본다. :)

(Android Developer’s Site) Building and Running

Android build 과정을 통해서 android projects 는 compile 되고 .apk file 로 package 된다. .apk 파일은 application 실행시킬 수 있도록 다음 정보를 가지고 있다.

  • compiled .dex files (Java .class file 을 dalvik byte code 로 변환한 것)
  • AndroidManifest.xml 의 binary version
  • compiled resources resources.arsc 와 uncompiled resource files

Eclipse 로 개발을 한다면 ADT plugin 이 bin folder 에 .apk output 으로 자동 빌드해주며, eclipse 사용하지 않는다면 generated build.xml Ant file 이용하여 project build 할 수 있다.

Application 을 emulator 나 device 에서 실행시키기 위해서는 application 은 반드시 debug 또는 release mode 로 서명 sign 되어야 한다.

일반적인 개발에서는 debug mode 에서 application 을 서명하고 test 하며, 이 경우 known password 의 debug key 를 이용하여 서명을 하므로 buid 할 때마다 이를 입력하지 않아도 된다.

하지만 최종 Android market 에 application release 시에는 release mode개인 private key를 이용하여 서명하여야 한다. (서명 Signing 관련된 자세한 글 참조 바람.)

Added by tkHWANG

.apk file 은 압축파일로서 확장자를 .apk 에서 .zip 으로 변경하면 압축툴을 통해서 압축 풀어서 내부 파일들을 볼 수 있다.

서명을 위한 private key 및 서명 절차는 How to Sign Android APK or Zip Files 참조.

(Android Developer’s Site) A Detailed Look at the Build Process

일반적인 build 를 위한 절차는 다음과 같다.

  • Android Asset Packaging Tool aaptAndroidManifest.xml 이나 activities를 위한 XML files과 같은 application resource files을 compile 하여 R.java file 을 생성하고, java code 에서 이를 통해서 resource 참조하게 된다.
  • aidl tool.aidl interface 를 Java interface 로 변경한다.
  • R.java.aidl 파일을 포함하는 모든 java code 는 java compiler 에 의해서 compile 되서 .class file output 이 된다.
  • dex tool.class 파일을 Dalvik byte code 를 위한 .dex 파일로 변경한다. 이때 3rd party libraries 나 project 에 포함시킨 .class 파일 역시 .dex 파일로 변환되어 이들을 패키지하여 최종 .apk 파일이 된다.
  • 이미지와 같은 compile 되지 않은 resources, comiplie 된 resource 와 .dex 파일 모두를 apkbuilder tool 가 패키지해서 최종 .apk 파일을 생성시킨다.
  • .apk 파일이 생성되면 debug or reelase key 로 서명되어야 하며, 서명 이후에 device 에 설치될 수 있다.
  • release mode로 서명한 경우에는 .apkzipalign tool을 이용하여 align 시켜야 한다. 최종 .apkaligning 하면 application 이 device 에서 running 시에 memory usage 를 감소시킨다.

Added by tkHWANG

최신 APK 의 경우에 build option 에 따라서 .dex 가 아니라 .odex optimized dex 로 compile 이 되어 apk 안에 .class 파일이 없는 경우가 많이 있는 것 같다.

What Is Odex And Deodex In Android [Complete Guide]

.odex 파일이란 ?

.odex 파일은 booting 이전에 optimized 된 aplication 의 일부의 collection 이며, 이렇게 함으로써 application 의 일부를 preloade 할 수 있으므로 boot process 를 speed up 할 수 있는 장점이 있다. 또한 apk 내의 coding 의 일부분을 exeuction 이전에 다른 위치에 extract 시켜두어 application hacking 하는 것이 어려워지게도 해준다.

deodex 란 ?

Deodexing 이란 이러한 APKs 을 어떤 식으로든 repackage 하여 최종 classes.dex 파일로 재조합하는 과정을 일컫는다. 이렇게 함으로써 모든 applicati package 들이 하나로 모아짐으로써 이후 수정이 용이하게 된다. 따라서 modified APK 가 독립된 odexed parts 가 conflict 되는 문제점은 발생하지 않게 된다.

다시 정리하면 deodexed ROMs (APKs)은 해당 applicatioi packages 의 모든 것을 한 곳에 모아서 재조합함으로써 이후 수정이 용이하도록 하는 작업이다. 이를 적용하면 외부에 존재하는 관련 code 가 없기 때문에 custom ROMs/APKs 는 항상 deodexed하여 integrity 를 항상 보장받도록 한다.

동작원리

Android OS 는 application 수행을 위하여 Java based VM, dalvik virtual machine 을 이용한다. .dex 파일에는 Dalvik-cache라고 하여 VM 에서 사용되는 cache 를 APK file 안에 포함되어 있는 반면, .odex 파일의 경우에는 이와는 달리 APK 내부가 아니라 APK 외부에 VM을 위한 cache를 저장한다. Android 에서는 모든 system application에 대해서는 기본으로 odex를 이용한다.

Android sysetm booting 시에 dalvik VM 을 위한 dalvik cache는 이 .odex 파일을 이용하고 있으며 OS가 어떤 application 이 load되는지 미리 알게 함으로써 booting process 를 빠르게 해준다.

[Windows] Monaco 폰트에 한글 폰트 (나눔고딕코딩) 설정 하기

| Comments

윈도우 기본 한글 폰트 바꾸기 (from http://westzero.net/47)

위의 blog 에서 알게된 내용.

Windows 에서 영문 font 가 좋아서 monaco font 사용하였는데, 명조체 한글 font 가 너무 보기 싫었는데 registry 에서 다른 한글 font 로 설정할 수 있군요.. 좋다… :)

Windows registery
1
2
3
4
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink]
"MONACO"="나눔고딕코딩.ttf,나눔고딕코딩"

[Emacs] Smex : M-x Enhancement

| Comments

Smexido와 같이 M-x의 확장으로서 최근에 사용했거나 가장 많이 쓰는 command 를 손쉽게 표시해주는 M-x 확장이다.

Smex

semx 자동 loading 되도록 .emacs에서의 설정

.emacs 설정
1
2
(require 'smex)
(smex-initialize)

Key binding 관련 설정. M-xsmex 사용하도록 설정함.

Key binding
1
2
3
4
(global-set-key (kbd "M-x") 'smex)
(global-set-key (kbd "M-X") 'smex-major-mode-commands)
;; This is your old M-x.
(global-set-key (kbd "C-c C-c M-x") 'execute-extended-command)

tkhwang-dotemacs에도 smex.el 추가 및 설정 추가 완료. :)

[Emacs] Auto Complete Mode

| Comments

Emacs 의 자동 완성 기능.

두 번째 blog 에서 소개된 emacs auto complete mode 설정 글을 참고로 emacs-prelude.emacs.d/vendor 에 설치 적용. :)

Auto Complete Mode

My Emacs Python environment

Download, unpack and byte-compile

$ cd ~/.emacs.d/vendor
$ curl http://cx4a.org/pub/auto-complete/auto-complete-1.2.tar.bz2 | tar jx 
$ cd auto-complete-1.2 
$ make byte-compile 

Edit ~/.emacs

(add-to-list 'load-path "~/.emacs.d/vendor/auto-complete-1.2")
(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories "~/.emacs.d/vendor/auto-complete-1.2/dict")
(ac-config-default)

저는 tkhwang-dotemacs.emacs.d/personal/tkhwang-dotemacs.el 에 설정 적용하고, .emacs.d/vendor/auto-complete-1.2 add 하여 적용함. :)