2011년 12월 19일 월요일

gnome 터미널에서 emacs를 쓰려다가 alt키로 고생하기

gnome terminal에서 emacs를 쓰려면 alt 키 이벤트를 그놈 터미널이 채가는 바람에 이맥스의 meta키가 제대로 작동하지 않을 수가 있다. 터미널에서 오른클릭하고 Show Menubar를 꺼버리면 된다.

2011년 11월 23일 수요일

우분투에서 trac 설치 중에 trac.*cgi 파일이 없어서 시간 허비하기

0.11 이후로 trac의 cgi 파일은 deploy를 통해서 생성해야 한다. 기본 패키지에 들어 있지 않다. 우분투 10.04 기준.
$trac-admin <env 디렉토리> deploy <cgi파일 만들 경로> 

2011년 11월 2일 수요일

Google I/O 2011: Memory management for Android Apps 요약 (draft)

  • 메모리가 커진다고 해도 화면 해상도는 그 못지 않게 빠른 비율로 상승하므로 메모리 관리의 필요성이 줄어든다고 오판하지 말 것
  • Gingerbread, Honeycomb의 주요 변경점
    • Gingerbread에서 concurrent garbage collection 지원 시작
    • Honeycomb에서 비트맵 데이터가 Dalvik Heap으로 들어옴
  • 메모리 관리툴 사용하기
    • logcat
    • HPROF dump
    • MAT

Honeycomb에서 비트맵 데이터가 Dalvik Heap으로 들어옴

  • 허니컴 이전까지는 비트맵 데이터는 native malloc으로 메모리에 잡히고, 이것의 레퍼런스를 담고 있는 오브젝트가 Dalvik Heap에 들어 있었음.
  • 따라서 제대로 메모리가 GC 되기 위해서는, recycle이라는 메소드를 수동으로 호출하거나, finalizer에 의존해야만 했음.
  • 또한 MAT 등의 표준적인 메모리 도구에 잡히지 않던 점이 개선될 것임.

MAT

  • dominator 개념을 익힐 것 - GC에서 특정 obj로 연결되는, 지나가지 않으면 안 되는 entity
  • MAT의 dominator 그래프 기능을 활용할 것

2011년 9월 26일 월요일

Android에서 sqlite3 파일을 패키지에 포함시키기.

안드로이드에 미리 만든 sqlite파일을 이용하기 위하여 처리할 것들을 간략하게 정리

1. 파일 크기
asset 리소스는 1메가 이상 크기의 파일을 허용하지 않는다. 미리 900kb정도 사이즈로 split해야 하고, 앱의 첫 구동시에 이 파일을 지정된 경로로 합쳐서 복사하는 루틴이 필요하다.

2. db의 포맷
  • 데이터 테이블에는 `_id`라는 이름의 integer filed가 필요하고, 이것은 rowid여야 한다.
  • android_metadata라는 테이블이 필요하다. 특히 locale이라는 text형 filed가 필요하다.


3. SQLiteOpenHelper, ContentPrivider 클래스를 작성.


위의 세 가지 사항을 해결해야 한다. 자세한 내용은 추후에.

2011년 8월 29일 월요일

JAVA - PHP 간 AES encryption 데이터 송수신에서 패딩으로 망하기

자바에서 encryption한 데이터를 php로 전달했을 때 패딩에 의해서 문제가 생길 수 있다.

AES 등의 암호화 알고리듬은 데이터를 특정 사이즈의 블록 단위로 암호화한다. 예를 들어서 블록의 사이즈가 32kb인데 암호화하려는 스트링은 50kb라면, 32kb * 2 = 64kb를 맞추도록 뒷부분을 패딩으로 채워넣는다.

이 패딩 방식이 php는 null 패딩이며, 자바의 경우에는 몇 가지 패딩 방식을 지원하지만 php의 null 패딩은 포함되지 않는다. 결론은


1. 자바에서 직접 null padding을 구현하거나
2. php에서 PKCS5 패딩을 제거하거나.


1의 경우에 사용 알고리듬에 따라서 사이즈가 딱 맞는 블록을 어레이로 선언하고 나머지를 null값으로 채워주면 되겠고, 후자의 경우에

<?php
$decrypted = mdecrypt_generic($td, base64_decode($enc_auth_token));
$dec_s = strlen($decrypted);
$padding = ord($decrypted[$dec_s-1]);
$decrypted = substr($decrypted, 0, -$padding);
?>


처럼 처리해 주면 될 것이다.

2011년 8월 18일 목요일

sqlite3에서 vacuum으로 rowid 말아먹기

sqlite3에서는 rowid라는 컬럼이 int형의 primary key로 존재하는 것이 보장되어 있다. 문제는 vacuum시켰을 때 rowid의 값이 sqlite3에 의해서 임의로 재지정될 수 있다는 점이다.

따라서 MySQL로 치면 autoincrement, int형 PK를 안정적으로 쓰기 위해서는 rowid의 이름을 수동으로 직접 지정해줄 필요가 있다. 안드로이드에서 쓸 거면 어차피 _id로 고정일테니 크게 고민할 거리도 안 될 것이다.

2011년 8월 2일 화요일

jqgrid - 데이터 받아오기

자바스크립트가 url로 날리는 리퀘스트를 잘 정리한 페이지가 없음.



name
내용
page돌려받고자 하는 페이지
rows페이지 당 몇 행인지
sidx소팅하는 기준이 되는 인덱스
sord내림차순(desc) or 오름차순(asc) 쿼리문에 직접 삽입 가능함


대신 다음과 같은 php 코드를 예제로 보여주고 있음. 나는 post를 선호하지만 그건 각자 알아서;;
<전략>
// Get the requested page. By default grid sets this to 1.
$page = $_GET['page'];

// get how many rows we want to have into the grid - rowNum parameter in the grid
$limit = $_GET['rows'];

// get index row - i.e. user click to sort. At first time sortname parameter -
// after that the index from colModel
$sidx = $_GET['sidx'];

// sorting order - at first time sortorder
$sord = $_GET['sord'];

// if we not pass at first time index use the first column for the index or what you want
if(!$sidx) $sidx =1;

전체 예제코드는 여기.



데이터 수정시 서버에 날리는 request가 정리된 페이지가 없음



name 내용
name:value pair 이름:값의 짝들. colModel에서 설정한 name
id:rowid id로 설정된 값. 대개의 경우에는 pk일 것이다.
oper:edit(add|del) 데이터 변경 종류. 수정, 추가, 삭제
editData return
onclickSubmit return

구글 앱스 스크립트용 GUI 빌더





자바 스크립트로 이런 짓까지 하는 녀석들은 구글 외에는 없겠지;;


2011년 7월 28일 목요일

Blogger에 +1 버튼 추가하기 howto

이론 없이 블라인드 카피하려는 분들을 위한 문서입니다.
작동을 보장하는 것은 블로거 기본 테마 사용자 분들에 한합니다.

1. 디자인에 삽입할 소스코드를 얻습니다.


에 가서 버튼 사이즈, 언어 등을 선택합니다. 그럼 하단에 소스코드가 그에 맞춰서 생성됩니다.


소스코드는 두 부분으로 나누어집니다. 하나는 어딘가 적당히-_-삽입하면 되는 부분이고, 다른 하나는 버튼을 붙이려는 장소에 맞춰서 삽입해 주어야 하는 부분입니다.


1. 적당히 삽입하면 되는 부분

이하의 코드를 적당히 삽입하면 됩니다.

========
<!-- 아래 태그를 헤더나 </body> 태그 앞에 붙여 넣습니다. -->
<script type="text/javascript" src="https://apis.google.com/js/plusone.js">
{lang: 'ko'}
</script>
========

여기서 적당한 부분으로는 헤더나 바로 앞을 말합니다. 이 글에서는 </body>앞을 택하겠습니다.

블로거 대쉬보드에서

디자인 -> html편집 -> "가젯코드 펼쳐서 보여주기 체크" -> 최하단의 </body>태그 직전에 위의 코드 삽입



2. 버튼을 나타낼 부분에 코드 삽입하기.

여기서는 적당하게 하면 안 됩니다. 위에서 부주의하게 "가젯코드 펼쳐서 보여주기 체크를 하지 않으셨다면, 1로 돌아가서 처음부터 다시 하셔야 합니다.

찾아야 하는 구절은
===========
<data:post.body/>
===========
입니다.

이 바로 아래에
===========
<!-- 아래 태그를 +1 버튼을 렌더링하고자 하는 위치에 붙여 넣습니다. -->
<g:plusone expr:href="data:post.url"></g:plusone>
===========
를 넣읍시다.

그리고 "스킨 저장" 버튼을 눌러 저장하고 나면 이 블로그처럼 포스팅 아래에 +1 버튼이 나타납니다.


문서에 대한 피드백은 답글로 남겨주세요.

2011년 7월 25일 월요일

jqGrid, loadonce 옵션 때문에 망한 경험담

loadonce 옵션을 false로 줄 때

auto-increment int인 PK를 가지는 테이블일 때, loadonce:false 상태에서 새로운 row를 등록하면 PK를 제대로 잡지 못한 상태가 된다.


새로운 row 등록 -> 서버쪽에서 PK 생성 -> loadonce:true라서 서버사이드에서 피드백 오지 않음 -> 클라이언트에서는 새로운 데이터에 지맘대로 PK 설정.


이 상태에서 새로 등록된 데이터를 수정하면 지맘대로 설정한 PK값을 가지고 있는 기존 row를 오염시킨다.





loadonce:true로 줄 때

jqGrid에 채우는 데이터가 DB에서 JOIN을 많이 사용한 쿼리문을 통해서 만들어졌을 경우 검색이 제대로 돌아가게 만들기가 만만치 않다.




이 둘 사이에 끼어서 고생 좀 한 적이 있음.

2011년 7월 20일 수요일

Fedora 15에서 PostgreSQL, phpPgAdmin 설치 및 설정

아주 초심자용 문서는 아니다. 기본적인 페도라 관리가 가능하고 SQL에 대해서 어느 정도의 이해가 있어야 한다.

yum으로 설치해야 하는 패키지 목록 : postgresql, postgresql-libs, postgresql-server

1. 설정
최초 설정의 문제는 다음과 같다.
  1. 사용자 : postgres라는 수퍼유저만 존재.
  2. 인증방식 : 시스템 아이디와 postgresql에서의 role이 동일한지 확인하는 방식으로 인증
  3. phpPgAdmin 설정 : 안 되어 있음.
  4. postgresql 서버 구동 되어있지 않음.

다시 말해서, yum 설치 직후 postgresql에는 postgres라는 사용자만 등록되어 있으며, 이 사용자로 postgresql에 접속하기 위해서는 (psql이라는 명령어를 사용한다.) 시스템에도 postgres로 로긴되어 있어야 한다. 또한 접속하기 위한 서버가 실행되지도 않았다.

각각을 해결하는 방법은 다음과 같다.

1. 계정(role)이 postgres뿐.

su
<암호입력>
su postgres

이제 postgres계정으로 시스템에 로긴한 상태가 될 것이다. 이 상태에서

createuser <새 유저 아이디(role)> -P

-P는 유저등록과 함께 패스워드를 설정하겠다는 옵션이다.
superuser인지, DB생성을 허용할지, Role생성을 허용할지 등을 묻는다.


여기까지 성공했으면 이제 psql에는 사용자(role)가 두 명이다. postgres와 방금전에 생성한 아이디까지 두 명의 사용자가 된다. 만약에 위에서 createuser로 생성한 postgresql role과 같은 아이디가 시스템에도 있다면, 시스템에서 그 아이디로 로긴되어 있는 동안 psql로 접속할 수 있다.


2. 로긴 방식이 시스템 id == postgresql role

phpPgAdmin은 id/password를 통하여 postgresql에 접근하려고 한다. 그런데 기본 설정은 시스템id와 일치하는 postgresql role이 존재하는지 확인하여 이 아이디로 로긴시키는 것이다. 이것을 수정해주기 위해서는 /var/lib/pgsql/data/pg_hba.conf 라는 파일을 수정하면 된다.

local all all ident sameuser에서 ident sameuser를 md5로 바꿔주면 된다.


3. /etc/phpPgAdmin/config.inc.php-dist를 /etc/phpPgAdmin/config.inc.php로 복사.


4. 루트 권한으로 (sudo, su -c 등은 개인 취향) service postgresql initdb, service postgresql restart 등.

2011년 2월 16일 수요일

2011년 2월 13일 일요일