2010-03-05

ブログでのソースコード表示  [by miyachi]

前回の投稿もそうですが「プログラマの日記」なものでプログラム等のソースコードをブログに書く場合が多いです。しかし表示は手を抜いていたので見苦しいものでした。以前から何とかしなければと考えていましたが、お昼休みにエイヤッとやってしまったので記録です。

まずどういうやり方が一般的なのかググってみました。JavaScriptやPHPのプラグイン的にやるケースが多いようです。行番号が付けられたりして便利そうですが、プラグインを使うのはどうも好きではありません。そんな中で見つけたのがMTサイト構築Tips集様の以下の記事。

 pre、codeタグを使ってソースコードを美しく表示する

CSSを使って結構美しく出来るようです。早速参考にしてみてCSSにPREとCODEタグの定義を組み込んでみました。おお。結構綺麗。背景画像もこのブログ用に修正して…前回の投稿のソースも見やすくなったと思いますがいかがでしょうか?MTサイト構築Tips集様ありがとうございましたm(_ _)m

ただまだ問題があります。ソースを入れる場合にソースコードの特殊文字を変換する必要があります。まあこれは比較的簡単なのでJavaScriptで作ってみました。以下長くなるので続きを読むにて。 [続きを読む]
2010-03-05 13:23:40 - miyachi - コメントを書く - [プログラミング]

2010-02-22

ActionScript3.0でのXML操作  [by miyachi]

Flashに組み込むActionScript3.0でXMLの扱いを勉強。なんと文字列としてでは無く直接代入が出来ることに感動。例えば以下。

 var xml:XML = <data>coffee</data>;

でもふと困った。例えば上例だと coffee としている箇所を文字列変数を使いたい場合どうすれば? ヘルプを見ても良く分からなかったけど検索して発見。ちょっと見つけにくかったのでここにも書いておきましょう。

結論から言えば波括弧 { } で括れば変数の値をそのまま使ってくれるそうです。例えば以下。

 var drink:String = "tea";
 var xml:XML = <data>{drink}</data>;

これは楽だ。あと当然ながらノードや要素のリプレース等も出来るが独自すぎてDOM等に慣れていると逆に分かり難い面も。何にせよActionScriptは独自の世界だなぁ。

[追記]
ActionScript3.0からURLRequestとURLLoaderを使ってHTTP通信のプログラミング。登録コマンドを送って再読み込みコマンド…あれ?反映されていない?ブラウザからチェックしてみると登録されている。?????

暫く何が悪いか分からず時間を無駄にしてしまいました。調べてみるとどうやら強力にキャッシュされてしまいサーバに接続しないで古い内容が戻って来ているらしい。これを避けるにはなんとURLの最後に乱数を付けて毎回異なるURLにアクセスしていると思わせる方法が一般的のようです。

と言うことで以下のように現在時刻のミリ秒をダミーとして引数に与える事で解決。

 var urlReq:URLRequest = new URLRequest();
 urlReq.url = url + "?dummy_number=" + new Date().getTime();

え~い時間を返せ(^^; ActionScript3.0はなかなか手強い。
2010-02-22 10:52:18 - miyachi - コメントを書く - [プログラミング]

2010-02-17

環境変数をJavaScriptで取得する  [by miyachi]

訳あってJavaScriptからサーバの環境変数を取得する必要がありました。こんなの簡単だろう…と思ったら、単純には取得できないらしい…orz 理屈から言えばJavaScriptはクライアント側で動作するのでサーバの環境変数は取れないらしい。ネットで調べると結構皆さん苦労されているようでした。

他の方法も考えられないでは無いのですが出来ればJavaScriptで取得したいと思って色々検討した結果、以下の手順を思いつきました。

 1) PHPで環境変数を取得してPHPの変数に格納
 2) JavaScriptからPHPの変数を取得

PHPはサーバ側で動作することもあって環境変数は全く問題無く取得できます。JavaScriptからPHP変数の値が取得できれば出来るはずです。でとりあえず動作したのでここに書いておきます。htmlの中に以下のようにPHPとJavaScriptを記述して実現しました。

<?php
$addr = $_SERVER['REMOTE_ADDR'];
?>
<script type="text/javascript">
jaddr = "<?= $addr ?>";
document.write("address = " + jaddr);
</script>

ここでは環境変数REMOTE_ADDRを取得しています。なおPHPが先でJavaScriptを後に記述しないと順番があるのでうまく動作しません。まあ釈然としない部分はあると思いますがまずは目的クリアの為にはこういう方法もあると言うことでご参考まで。
2010-02-17 17:13:56 - miyachi - コメントを書く - [プログラミング]

2010-02-09

WindowsでのSSLクライアント認証プログラム  [by miyachi]

先日事情があってWindows上でのSSLクライアント認証のプログラミングの調査をしました。良く考えたら数年前に使ったことがあったのを忘れていました。健忘録として書いておきます。

SSLのサーバ認証は皆さん https で始まるサイトを利用する事で使っていると思います。クライアント認証はサーバ側が逆にクライアントを認証して接続の可否を決める仕組みです。X.509形式証明書と秘密鍵を使いますのでPKI的な素養が必要ですがPKIとは言えませんね。

と言うことでプログラミングで考えるとクライアント側からサーバへのhttp通信になります。良く使われているレガシーな通信APIとしてはWinInetがあります。Win32からhttp等の通信をするならWinInetが一般的です。msxml等からも使われています。ところがWinInetはSSLサーバ認証は対応していますがSSLクライアント認証には対応していません。SSLクライアント認証に対応するにはWinInetの後継であるWinHTTP英文)を使うとなっています。

でも何だかWinHTTPを生で使うのは面倒そうです。と言うことで.NET FrameworkのクラスであるHttpWebRequestHttpWebResponseを使う事をお勧めします。HttpWebRequestとHttpWebResponseを使ったクライアント認証の説明とサンプルのページもあります。私の場合はこのページだけでうまく使うことができました。

少し面倒なのが X509Certificate クラスで接続に利用するクライアント証明書を用意するところでしょうか。先のサンプルページでは「.cer ファイルが必要」となっていますがこれはWindows証明書ストアから取得した方が間違いがありません。X509Certificate2クラスの関連クラスを利用すればGUIによる証明書選択も可能になりますし必要な証明書を取り出す事も可能です。
2010-02-09 17:56:18 - miyachi - 2 コメント - コメントを書く - [プログラミング]

2009-04-09

.NET Framework の DataGridView  [by miyachi]

現在開発中のプロジェクトはMacOS-Xで動作しているあるアプリをWindowsに移植するというもの。Windows版もC++とMFCなら経験もあるので簡単ですが、せっかくなのでC#と.NET FrameworkだけでGUIも作ってしまおうと初めて本格的にC#だけでアプリを開発しています。これがなかなか一筋縄では行きません(笑) まあでも経験値はアップしていると思うので頑張りどころです。

閑話休題。さて今週取り組んでいたのは以下のようなスマート検索のダイアログです。問題になるのはメインの検索条件を入力する部分です。プルダウンありテキスト入力ありボタンありと言う事で DataGridView クラスを使うことにしました。



これが思った以上に簡単には使えない!何の罰ゲームですか?と言う感じでした。まあ情報はあるんですが私には判りにくかったです。なのでここで簡単にポイントだけ押さえておこうと思います。以後興味がある方は [続きを読む] にて。 [続きを読む]
2009-04-09 13:00:53 - miyachi - コメントを書く - [プログラミング]

2009-03-04

System.Data.SQLite の GetDateTime でエラー  [by miyachi]

現在開発中のプロジェクトでSQLiteの.NET(C#)用の System.Data.SQLite を使っています。これらはアプリから簡易にデータベースを利用するオープンソースのプロジェクトです。SQL文を使って1つだけデータベースを開いて操作が出来るもので、軽くて使い方も簡単で初めて使いましたがなかなか便利です。(ただSQLをつかうのは久しぶりなものでちょっと最初だけ思い出すのに苦労しました(^^;;)

レコードの種類としてTIMESTAMP型があり、読み出す時には reader.GetDateTime() で取得できます。ところがINSERT時にはエラーになりませんがSELECTして GetDateTime() を実行すると例外になってしまいました。何でだろうと少しググると先人がやはりいらっしゃいました。でもまあ私も一応原因を書いておきましょう。

INSERT時には最初は DateTime.Now を使っていましたがこの場合に挿入される文字列は例えば "2009/03/04 18:00:00" となります。これが原因でした。挿入する文字列として "2009-03-04 18:00:00" とすればSELECT時にも例外は発生しません。 つまり日付の区切り文字を "/" から "-" に変更する必要があります。C#で書くなら、

 String timeStr
  = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

と言う文字列を取得してINSERTすれば良いようです。これなら SQLiteDataReader の GetDateTime() で正しく日時が取得できます。この程度は通って欲しいけど互換性等の問題もあるのかもしれません。

余談ですが .NET用の System.Data.SQLite は、オリジナルのSQLiteのラッパーでは無く別途実装し直しているようです。なのでオリジナルのDLLファイルも不要になっています。安易に考えるとラッパーの方が楽とも思えますがマネージコードだけで済むようにしたかったんでしょうね。Monoでも動くようです。公開してくださっている皆様に感謝しつつ使わせて頂きます。
2009-03-04 18:28:52 - miyachi - コメントを書く - [プログラミング]

2009-02-04

MeCabによる解析  [by miyachi]

某所のお仕事でオープンソース公開されている形態素解析エンジン「MeCab」を使いました。なんだかLangEdgeの社名に相応しい(一応Languageをもじった社名なんです)仕事だったような(^^;; 作者様に感謝しつつ使わせて頂きました。

さてMeCabを使うだけならサンプルソースも付いているのでここで書くまでもなく簡単です。ただ今回は複数の候補を取り出す必要がありましが、これのサンプルソースがありませんでした。ネットで検索しても見つからなかったので自前で何とかしました。せっかくなので公開の許可も得られたのでここで公開しときます。以後ご興味があれば [続きを読む] にて。 [続きを読む]
2009-02-04 13:00:27 - miyachi - コメントを書く - [プログラミング]

2008-09-22

マネージStringからwchar_tポインタの取得  [by miyachi]

C++/CLIを使っていてマネージのString文字列からconst wchar_tのポインタを直接取得する方法です。これって結局単純に PtrToStringChars で pin_ptr すれば良いだけのようです。つまり、

 String^ str = gcnew String("日本語文字列");
 pin_ptr<const wchar_t> pStr = PtrToStringChars(str);
  :
 pStr = nullptr; // 使い終わったらpin_ptrを開放しておきましょう

とやれば良い。ちなみにMSDNサイトでも「方法 : System::String の文字にアクセスする」で解説してあります。

実は今CAPICOMだけだった部分をWin32のCAPIでも使えるように機能追加中です。CAPIはアンマネージのAPIなのでマネージの文字列から直接ポインタ取得できないかと調べた1ポイント情報でした。CAPICOM使うと便利なんですがCAPICOMのDLLも過去に脆弱性が発見されたり更新が面倒だったりと依存しない方が便利なケースも多いように感じています。
2008-09-22 19:45:12 - miyachi - コメントを書く - [プログラミング]

2008-03-05

.NET Frameworks PropertyGrid コンポーネントを...  [by miyachi]

この1週間くらい新しいお仕事の為にOffice2007を入れたりついでなので色々とアップデートをしていました。だいたい一段落ついたので早速Visual Studio 2005で作業を開始しようとしたところ、プロジェクトのプロパティを開こうとすると以下のメッセージが…



なになに?

 .NET Frameworks PropertyGrid コンポーネントを作成できませんでした。
 共通言語ランタイムおよび .NET Frameworks が正しくインストールされていることを確認してください。


だと?既存の他のプロジェクトを開いても同じエラーが表示されるのでどうもVisual Studio 2005の問題のようだ… 色々いじっているうちに環境壊れたかな…orz

なのでググってみたが現象はヒットするものの、解決策が書いてあるサイトが無い。同じ現象で困っているケースは見かける。やっとこさ2chでここの手順で解決したとの書き込みを発見。なにこの手順は最後はVisual Studio 2005の再インストールかい(T-T)

あきらめきれずにジタバタしていて、ふとプロジェクトを開いた時に出力ウィンドウに何やらエラーメッセージが出ていたのを発見。メッセージ全体はコピーし忘れたので残ってないのですが、どうやらコマンドラインから以下のdevenvコマンドを実行しろとのこと。

 > devenv /resetskippkgs

で試してみたら見事に問題が再現しなくなりました!ちなみに devenv.com は以下のフォルダ下にあります。

 C:\Program Files\Microsoft Visual Studio 8\Common7\IDE

と言うことでネット検索であまり解決方法の情報が出ていなかったので参考まで。

それにしても以前にブレークポイントがヒットしなくなる件でもそうだったが、Visual Studio 2005で異常があった場合には良く見ると解決法が表示されているケースが多いようだ。その意味では良く出来ているな(^^;
2008-03-05 13:33:44 - miyachi - 4 コメント - コメントを書く - [プログラミング]

2006-11-21

続々Windowsインストーラ  [by miyachi]

これまたシリーズ化してしまいそうですが、前回に引き続きまたWindowsインストーラの話題を。今回はインストーラによる、拡張子からのアプリケーション関連付けに関してです。ある拡張子(例えば ".langedge")に、Visual Studio 2005 で作成しているアプリケーション(例えば "letool.exe")を関連付けたいとします。

良くある要求だと思いますのでこれはOrcaを使わなくても出来るだろうと、Visual Studio 2005 のセットアッププロジェクトのプロパティや色々な箇所をチェックしてみました… それらしい項目が見つからない…

ではと出来上がったMSIファイル(例えば letool.msi)をOrcaで開いてみました。TablesのExtensionがどうもそれらしい。でも Component としてどうやってアプリケーションを指定するかが良く判りませんでした。仕方が無いのでググって以下のページを発見。

 チュートリアル : Windows アプリケーションの配置

この中に「ファイルの関連付けの作成」と言う解説があり、これが私の探しているものでした。とは言えここの説明は少し例が良く無いので意訳として ".langedge" 拡張子の例を以下にまとめてみましょう。
  1. ソリューション エクスプローラで自分のセットアッププロジェクトを選択。
  2. [表示]メニューから[エディタ > ファイルの種類]を実行。
  3. [ファイルの種類]画面の[対象コンピュータ上のファイルの種類]を選択。
  4. [操作] メニューか右クリックから[ファイルの種類の追加]を実行。
  5. "新しいドキュメントの種類 #1"を"letool.Document"に変更。
  6. [プロパティ] ウィンドウで[Extensions] プロパティに「langedge」を設定。
  7. 同様に[Command] プロパティに「プロジェクトのプライマリ出力」を設定。
  8. 同様に[Description] プロパティに説明[letoolのドキュメント]を設定。
  9. 必要なら同様に[Icon]や[MIME]を設定。
以上で関連付けが出来ます。こうやって作成したインストールファイルをOrcaで開くと、Extentsionの項目に上記設定した内容がセットされているのが確認されます。なお注意点としては拡張子を[Extensions]プロパティにセットする際にはドット"."は付ける必要がありません。

上記手順では[&Open]しか動作がセットされていません。他にも必要な動作があればドキュメント名(上例なら"letool.Document")を選択して[操作] メニューか右クリックから[動作の追加]を実行すれば増やすことが出来ます。それにしても、[表示]メニューから[エディタ > ファイルの種類]を実行、なんてなかなか気が付きませんよね(^^;;

上記設定をしたインストーラを使ってインストールしたらレジストリエディタ(regedit)を使って確認しておきましょう。まず[マイコンピュータ > HKEY_CLASSES_ROOT]を開いて拡張子(上例なら ".langedge")が追加されていて、ドキュメント名(上例なら "letool.Document")がセットされている事を確認。次にドキュメント名("letool.Document")も追加されていて、"shell > open > command" にアプリケーション実行ファイルのパスが入っていたらOKです。以上参考になれば幸いです。

あと拡張子の関連付けではありませんが、Windows Installer を使う手順が判りやすく解説されているMSDNのページを見つけたのでリンク貼っておきましょう。

 10 行でズバリ !! セットアップ プログラムの作成

余談:
FireFoxの2.0を入れてみました。少し動作が軽くなったのかな?良い調子ですが、タブを閉じるボタンが各タブに付くようになったので、タブを閉じる時にまだマウスが悩んでしまいます(笑) まあじきに慣れるでしょう(^^;
2006-11-21 10:17:53 - miyachi - コメントを書く - [プログラミング]

2006-11-16

続Windowsインストーラ  [by miyachi]

Windowsインストーラが Visual Studio 2005 のプロジェクト追加で出来る事は判った。非常に簡単で便利です。ところが必須コンポーネントを自動インストールした後でMS-Officeの動作がおかしくなるとの報告が。再起動すれば直るらしいので、どうも再起動を必須にしなければいけない様子。

ではと Visual Studio 2005 で追加したセットアッププロジェクトをチェックするがどうも再起動の指定に関する項目が無いようだ… とググってみたところ、MSサポートで以下のページを発見する。

 Orca データベース エディタを使用して Windows インストーラ ファイルを編集する方法

Orcaと言うツールを使えば作成したインストーラファイルの項目を修正できるようだ。OrcaってMSから提供されるツールなんですが、こんなツールがあるなんて知らなかったなあ(^^;

ただ取得方法が少し面倒。上記ページに手順がありますが、まずは Windows Installer SDK を手に入れてインストールする必要がある。ここから入手しろとありますが、このリンク先は「Windows Server 2003 SP1 Platform SDK Web Install」です。そのままインストールすると色々と不要な物までインストールされるので、カスタマイズインストールで Windows Installer SDK だけをインストールすればOKです。

Windows Installer SDK をインストールしたらOrcaが使えるようになる訳ではありません(笑) 更に Microsoft SDK\Bin の下に Orca.msi があるので、それをダブルクリックしてOrcaインストーラを起動してやっとこさOrca本体のインストールが完了です。う~ん面倒。でもこれでOrcaが使えるようになります。便利なツールなので会社の場合には誰かがまず Orca.msi をゲットしてそれを共有した方が良いですね。と言う事で社内の share\archive の下に Orca.msi を置いておきました。>Okaくん&Komoriyaくん

次に再起動の設定はどうすれば良いかと言うと以下のページが参考になります。

 管理システムは、 Visual Studio .NET を使って、作成したセットアップ プロジェクトで再起動します。

さっきのページと違って日本語が胡散臭いですね。これは機械翻訳された物ですがまあ日本人には参考になります。再起動のセットはOrcaを使って以下の手順で行えます。
  1. Orcaで修正したいインストールファイル(*.msi)を開く。
  2. TablesタブよりPropertyを選択して右側に一覧を表示する。
  3. メニュー"Tables/Add Row..."を実行する。
  4. PropertyにREBOOTを、ValueにForceをセットしてOKをクリック。
  5. 保存すれば完了。
ふむ簡単だし便利ですね。この調子で細かなインストーラ設定がOrcaを使って出来そうです。ところで先に書いた機械翻訳のページではREBOOT/Forceも再起動/強制になってますが、当然これは英語で書かねばなりません。こういう場合はオリジナルの英語ページを見ましょう。URL最後のjaen-usに変更すれば英語で見る事が出来ます。

今回はGUIを使って手動でセットしましたが、VisualBasic等を使って自動セットする方法もあるようですが、今日はここまで。参考になれば幸いです。
2006-11-16 09:49:59 - miyachi - コメントを書く - [プログラミング]

2006-10-27

Windowsインストーラ  [by miyachi]

先日公開開始したLe-XAdESを使ったXAdEStoolに関して先日インストーラを付けました。XAdEStool自体に必要なセットアップがある訳ではありませんが、必要とするMSのコンポーネント(.Net Framework 2.0/VC++ランタイム他)を手動ですると面倒であったのでこれらが自動インストールできるのが判ったので取り急ぎ対応したと言う事です。

公開ページにもありますが、Le-XAdES/XAdEStoolは、Visual Studio 2005 C++ で開発しています。Windows標準の「Windows Installer」を使うなら使っているソリューションに新たにセットアッププロジェクトを追加するだけでインストーラが出来てしまいます。更に「必須コンポーネント」を追加して.Net Framework 2.0/VC++ランタイム他を自動ダウンロードと自動インストールさせる事も可能です。なかなか便利になりましたね。

ただし出力されるのは1つのファイルでは無く複数のファイルになります。CDに格納してインストールするだけならこれで充分ですが、ダウンロード用に1つのファイルにまとめたいので調べてみました。昔なら InstallShield を買えば良いと言う事になりますが、今はどうなっているのかなと。

調べてみるとWindows2000以降では「IExpress」と言うツールが標準で提供されているようです。これで複数のファイルを1つにまとめて自己解凍してインストーラを起動する事が出来るようです。素晴らしい!早速使ってみると確かに簡単に使えます。これなら InstallShield 無くても良いのかな?と思ったら1つ落とし穴がありました。

Visual Studio 2005 で作成されたインストールキットにはフォルダが含まれていました。一方 IExpress ではフォルダを含んでいる場合には使えません。駄目じゃん…orz さすがMSだけあって使えそうで微妙に使えませんでした(笑) IExpress が階層フォルダに対応してさえくれれば良いのですが。

無い物ねだりしても仕方がありません。無い物は作るか買ってくるしかありません。まあ書庫化してインストーラ(setup.exe)をキックするだけなら作っても簡単そうです。近いうちに IExpress の代わりになる物を自作する事にして、XAdEStool はとりあえず単にZIPでまとめて公開しました。書庫化ツールが出来たら自己解凍方式に切り替える予定です。

ちなみに Visual Studio のセットアッププロジェクトの使い方はここが簡単で便利でした。IExpress に関してはこちらの記事あたりを参考にしてみました。
2006-10-27 16:58:12 - miyachi - コメントを書く - [プログラミング]

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 - コメントを書く - [プログラミング]