일기쓰기 참 어렵다!

지난 몇주간 거의 매주말마다..
땡볕아래에서 열심히 프리즈비를 던지고 있는데…
점점 까메지고 있음을 느낀다. ㅋ

주말 오전엔 운동하고, 먹고, 출근하고, 먹고, 야근하고, 먹고, 퇴근하고..
뭐 이런 패턴?

대략 살찌는 패턴이다 -_-;;
그것도 배만 뽈록…

일기쓰기도 참 어렵네…

서버해킹 사건 이후.,.. 내 블로그도 좀 나눴다.
이제 요 블로그는 소소한 내 일상으로만 채울 작정이다.
기술적인 내용은 다른곳에 정리하고.. 😀

졸지에 블로그를 3개나 운영하게 됐는데…
뭐 상관은 없는듯… ㅋ

여튼 요즘엔 회사서 사는듯싶다. 제기랄~

앱이름을 한글로 쓰기

타이타늄 모바일 앱의 기본 언어셋은 영어다.

이 말은 즉 특별한 한글 이름을 지정하지 않으면 영문으로 앱이름을 써야한다는 얘기도 되겠다.

그렇다면, 앱 이름은 어디서 설정하는 걸까?

먼저 tiapp.xml 파일을 뒤져보자.

<?xml version=”1.0″ encoding=”UTF-8″?>

<ti:app xmlns:ti=”http://ti.appcelerator.org”>

<sdk-version>2.0.1.GA2</sdk-version>

<id>com.miconblog.sampleapp</id>

<name>SampleApp</name>

<version>1.0</version>

…. 이하 생략

대충 살펴보니 <name> 태그가 보인다

. 그리고 이 태그에 값을 설정하면 실제 빌드되어 만들어지는 앱의 이름으로 쓰인다는 사실도 쉽게 알수있다.

그럼 이 태그에 한글을 넣으면 될까? 아마 빌드해보면 아래와 같이 에러가 날것이다.

UnicodeDecodeError: ‘utf8’ codec can’t decode byte 0xb5 in position 0: invalid start byte

그럼 도대체 어디에…???

국제화와 지역화 그리고 세계화

타이타늄 프로젝트 폴더를 보면, i18n이라는 폴더가 있다. 이 폴더가 없는 경우엔 Resouces 폴더와 동등 위치(최상위)에 만들어주면 된다. 여튼 이 폴더는 국제화(internationalization)라는 단어를 줄여서 첫글자와 마지막 글자 그리고 그 사이의 글자가 18개를 의미하는 단어다. 즉, i18n 이라는 얘기는 국제화를 의미하고, 영어권에서는 통용되는 줄임말이다.

그럼 여기서 잠깐,  l

10n은 뭘까? 이쯤되면 대충 지역화(localization)라는걸 유추해볼수있다. 그리고 g11n은 세계화(globalization)라는 것쯤은 일단 상식으로 알아두자!

다시 돌아와서, 바로 이 i18n 폴더에 국제화와 관련된 언어셋들을 정리해두면, 타이타늄이 알아서 상황에 맞게 표시해준다.

그럼 만들어보자!

한글 언어 설정

  1. 먼저 i18n 폴더를 최상위에 만든다.
  2. 그리고 그 하위에 ko 폴더를 만든다.
  3. 그리고 그 안에 app.xml 파일을 만들자.

app.xml 파일은 아래와 같이 작성한다.

<?xml version=”1.0″ encoding=”UTF-8″?>

<resources>

<string name=”appname”>한글이름</string>

</resources>

—-

[summary]

if you want i18n

1. make i18n folder

2. make sub folder for language (ex. ko, en, etc…)

3. create app.xml file

4. write your properties

Blob 이미지를 SQLite에 저장하고 불러오기

Blob 객체란?

타이타늄 모바일에서 Blob 객체는 내부 데이터를 바이너리로 가지고 있는 객체를 의미한다.

The blob is an abstract data type that represents binary information, often obtained through HTTPClient or via files. It often is used to store text or the actual data of an image.

그리고 종종 이 객체를 그대로 데이터베이스에 저장하고 싶을때가 있다. 예를 들면 카메라로 찍은 이미지를 서버에 저장하지 않고, 그냥 앱안에 저장하고 싶은 경우가  있을수 있다. 이런경우엔, 보통 2가지를 생각해볼 수있다.

  1. SQLite 를 이용해 이미지를 앱 안에 저장한다.
  2. 찍은 이미지를 로컬 파일 시스템에 저장하고, Native Path를 DB에 저장한다.

여기서 다룰 내용은 바로 1번에 해당하는 내용이다. 그럼, 본론으로 들어가자!

Blob 이미지와 SQLite

타이타늄 모바일 커뮤니티 Q&A 게시판을 뒤져보면, Blob 객체를 SQLite DB에 저장하고 싶어하는 사람들이 많다는 사실을 알수있다. 하지만 그 어떤 누구도 뾰족한 해답을 제시해주지 못하고 있다.

SQLite에 쓰려면 직렬화 하세요!

문제의 핵심은 바로 SQLite DB에 있다. SQLite 가 지원하는 데이터 타입에 분명 BLOB 타입이 존재하지만, 자바스크립트에서 쓰는 그 Blob 객체가 그대로 저장된다는 의미는 아니다. 결국, DB에 데이터를 쓰려면 객체를 직렬화해야한다. 가장 간단한 방법은 객체를 문자열로 만들면 된다. 그럼, Ti.Blob 객체가 제공하는 toString() 메소드를 이용하면 되겠네? 라고 생각할수도 있지만, 결론은 안된다. 그럼 도대체 어쩌란 말인가???

바이너리 객체를 인코딩하세요!

결론은 base64로 인코딩했다가, 디코딩해서 쓰면된다.  코드로 써보면 다음과 같다.

// 저장할땐, 인코딩
exports.setImage = function(_rowId, _blob) {
    var mydb = Ti.Database.open(DATABASE_NAME);
    var sImg = Ti.Utils.base64encode(_blob);
    mydb.execute('UPDATE [table_name] SET blobImg="'+ sImg +'" WHERE  rowId="'+_rowId+'"');
    mydb.close();
};

// 사용할때, 디코딩
var db = require('db');
var encodedImg = db.getImage(rowId);
var blobImg = Ti.Utils.base64decode(encodedImg);

Summary

  1. save Blob image to SQLite

    var sImg = Ti.Utils.base64encode(_blob);

  2. use Blob image from SQLite

    var encodedImg = db.getImage(rowId); var blobImg = Ti.Utils.base64decode(encodedImg) ;

  3. but it is too slow in titanium, don’t use it!

덧,

몇가지 테스트해서 구현해봤더니 이미지를 DB에 때려 박는 무식한 방법은 쓰지 않는게 좋겠다. 이미지를 Base64로 인코딩하고 디코딩하는데 시간이 너무 오래 걸린다. 여튼 위 방법은 속도가 엄청 느리므로 비추한다.