2006-09-19

メガiアプリ  [by miyachi]

iアプリの開発をするとやはり一番困るのが100KBのサイズ制限でした。次の903iシリーズからは久しぶりにこのサイズが緩和される事になったようです。

 ITmedia:ドコモ、「903i」シリーズ向け大容量iアプリ「メガiアプリ」を発表

従来は本体100KBに保存領域400KBの合計500KBだったものが、903i以降のメガiアプリでは両方の区別が無くなりトータル1MBまで許されるとのこと。実質としては2倍の領域拡大ではありますが、保存領域との区別が無くなった事もありエンタープライズ系のiアプリ開発時には朗報です。ところで先日開発したiアプリは外部メモリ(miniSD)への保存機能を使った。これに関しては

外部メモリにデータが保存できるのは一部の機種(「P902i」「902iSシリーズ」「DOLCE SL」「N902iX HIGH-SPEED」)に限られていた。

とあるのだが… えーとつまり902iSシリーズならOKと言う事で別に903iシリーズ以降の特長では無いと思うのですが(^^; 903iシリーズでは他にも機能アップ(一部の機種だけの機能だったものが標準搭載)があると聞いています。なんだかiアプリも本格的なアプリ開発が出来そうな環境になってきたように思います。

携帯アプリと言うと他にもC++をベースにしたBREWアプリがありますが、私的にはJava系の方がBouncyCastleが使える事もあり慣れてきているのでメガiアプリには期待です。1MBあれば公開鍵暗号も使えるかも。ちなみにiアプリ開発にはeclipseも使えてデバッグ環境も揃っているので結構便利です。
2006-09-19 12:56:54 - miyachi - - [プログラミング] -

2006-09-06

UnicodeからShift-JISへの変換  [by miyachi]

日本語コードは最近のプラットホームではUnicodeに統一されつつあります。Java/MacOS-X/.NET等の環境では内部コードはUnicodeです。とは言えお仕事をしていたり古いコードが捨てられない場合にはどうしても旧来のShift-JISで文字列を取得する必要がある場合がまだまだ多いのも事実でしょう。メモ代わりに簡単に各種言語や環境でもUnicodeからShift-JISへの変換例をまとめます。

まずはJavaです。私も最初にUnicodeとShift-JISの変換が必要になったのはJava環境でした。またShift-JISと言っても細かく分けると色々ありJava環境でも混乱しています。ここではWindows環境で一般的な"MS932"をShift-JISとして扱った例を示します。JavaではShift-JISは文字列として扱えないのでbyte列として取得する事になります。

// ----- Java -----------------------------------------------
 // Unicode文字列をShift-JISに変換してbyte[]に格納
 String str = "日本語";
 byte[] sjisData = str.getBytes("MS932");
 // "MS932"はWindows用で"SJIS"が本来のShift-JIS
// ----------------------------------------------------------

次に最近やったばかりのCocoa/Objective-Cの環境での変換。Objective-CでもShift-JISは文字列として扱えないのでNSDataとして取得します。しかしObjective-Cって何でこんなに1行が長くなるかな(笑) ちなみに [str cString]; でも const char * のポインタ取得できますがこれは使わない方が良いそうです。

// ------ Objective-C ---------------------------------------
 // Unicode文字列をShift-JISに変換してNSDataに格納
 NSString* str = @"日本語";
 NSData* sjisData = [ str
  dataUsingEncoding:NSShiftJISStringEncoding // SJIS変換指定
  allowLossyConversion:YES // 変換不能でもとにかく変換
 ];
// ----------------------------------------------------------

最後はWindowsの.NET環境と言う事でC++/CLIでの例をおまけとして。幾つか試してみましたが結局はMFC/ATLのCStringを使って変換するのが一番簡単で間違いが無いようです。

// ------ C++/CLI (おまけ) ----------------------------------
 // マネージコードUnicode文字列を変換してMFCのCStringに格納
 String^ str = L"日本語";
 CStringA sjisStr = str; // 手抜きだけど一番楽かと…
// ----------------------------------------------------------

あと最近はXMLだとUTF-8形式が一般的ですね。内部コードはUnicodeでXMLはUTF-8がこれからの標準でしょうか。本来は上記のようなコード変換は不要になるが一番なので、ぼちぼちと移行して行きたいですね。
2006-09-06 12:53:30 - miyachi - - [プログラミング] -

2006-09-04

Objective-C  [by miyachi]

CodeWarriorを使ったお仕事をやってました。でもなぜかCarbonからCocoaのライブラリを呼び出して使いとうとうObjective-Cまで使って短い機能を実装。いやObjective-Cを本格的に使うのは私は実は初めてだったりして(^^; これまでにC/C++/Java/C#等は使ってきていたので同じように考えていたら全く違っていて少しびっくり。オブジェクト指向っぽい使い方です。例えば文字列オブジェクトにサイズをたずねるには、

 unsigned int len = [ strObj length ];  // strObjの文字列長を取得する。

むう。これはかなり来てますね(^^; 他の言語だと "." や "->" を使うところをいきなりカギカッコ "[]" を使うとは。オブジェクト指向と言うよりもメッセージ指向に近くなるのかな? 慣れれば何と言う事も無さそうですが、今回は慣れる程のコーディング量では無かったのでさわっただけでした。

あとObjective-CはC言語の拡張でコンパイラもgccを使っていますので、過去のC言語の利用も従来通り利用が、特に混在が可能になっています。この辺りは.NETで言えばC#よりもC++/CLIに近いかもしれません。C#の方がJavaに近いかも。それにしても最近は似て否なる言語が多くて困ったもんです(笑)

これだけじゃ情報としてつまらないので文字列に含まれる改行コードの変換した例を紹介しておきましょう。通常はNSStringと言うクラスを使って文字列を操作します。ただ置換などの機能を使う場合にはNSMutableStringを使います。

 NSMutableString *mst = [NSMutableString stringWithString:str];
 [mstr replaceOccurrencesOfString:@"\n" withString:@"\r\n" options:0 range:NSMakeRange(0, [mstr length])];

おや簡単(^^; でもあまりネット上に情報が無かったので参考まで。改行コードをDOS風に変換する時に利用しました。他にも幾つか参考になりそうなコーディングをしましたがまた今度ネタ切れの時にでも書きましょう。
2006-09-04 12:36:42 - miyachi - - [プログラミング] -