2008年02月18日

文字コード変換ライブラリ「ICU」セットアップ(Fedora8)

Linux(Fedora8)向けのセットアップ方法です。

1.IBM ICUのホームページ
http://www.icu-project.org/
↑のDownload ICUから辿っていき、「icu4c-3_8_1-src.gz」をダウンロードします。

2.ICUライブラリを構築します。
以下のようにコマンドを実行していきます。
#cp -p icu4c-3_8_1-src.gz /tmp

#tar zxvf icu4c-3_8_1-src.gz

#cd /tmp/icu/source

#./configure
checking for ICU version numbers... release 3.8.1, library 38.1
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking for gcc... gcc
〜〜〜
config.status: creating common/unicode/platform.h
config.status: creating common/icucfg.h
You must use /usr/bin/gmake to build ICU.

#make

3.ICUライブラリとインクルードファイルをインストールします。
#make install

ICUライブラリ(*.so)→/usr/local/lib
ICUインクルードファイル(*.h)→/usr/local/include
にインストールされます。

完了です。


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 21:03| Comment(0) | TrackBack(0) | 技術メモ(Linux C/C++)

2008年02月17日

文字コード変換ライブラリ「ICU」での文字コード変換処理

UTF-8エンコーディングの文字が書かれているファイル("utf8_src.txt")を準備して、プログラムでファイルの1行目を読み込み、その文字列からUnicodeStringオブジェクトを構築してから、SJISにコード変換するサンプルです。

文字コード変換ライブラリ「ICU」セットアップ
が行われいることが前提です。


#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <string>
#include <fstream>


#include <unicode/unistr.h> // ICU


int main(int argc, char* argv[])
{
std::fstream r("utf8_src.txt");
std::string str;
r >> str;


//一旦Unicodeで文字列オブジェクトを構築して、extractメソッドで
//他のマルチバイト文字に変換します。


//Unicodeオブジェクト構築 例:"shift_jis"、 "utf8"、 "euc-jp"
icu::UnicodeString src(str.c_str(), "utf8");


//変換後の文字列長を取得
int32_t len = src.extract(0, src.length(), NULL, "shift_jis");


//変換後文字列の格納領域を準備
char* result = new char[len + 1];


//文字コード変換
src.extract(0, src.length(), result, "shift_jis");


//変換結果確認
printf("[%s]\n", result);


delete [] result;
return 0;
}


posted by 台北猫々 at 11:59| Comment(0) | TrackBack(0) | 技術メモ(Windows C/C++)

文字コード変換ライブラリ「ICU」セットアップ

VisualC++ 2005 ExpressEdition向けのセットアップ方法です。

1.IBM ICUのホームページ
http://www.icu-project.org/
↑のDownload ICUから辿っていき、「icu4c-3_8_1-Win32-msvc8.zip」をダウンロード
します。

2.「icu4c-3_8_1-Win32-msvc8.zip」を適当な場所に解凍します。ここでは、
"c:\\usr\local"に解凍することにします。

3.VC++のディレクトリ設定
[ツール]>[オプション]でオプションダイアログを起動し、
[プロジェクトおよびソリューション]>[VC++ディレクトリ]で、ICUのディレクトリを
設定します。

[インクルードファイル] → c:\\usr\local\include
[ライブラリファイル] → c:\\usr\local\lib

※この後は、UnicodeStringを使用してUTF8←→SJIS/EUC変換するだけのICU機能を使うための最低限の設定になります。

4.プロジェクトの設定
[プロジェクト]>[プロパティ]でプロパティダイアログを起動し、
[構成プロパティ]>[リンカ]>[入力]で、[追加の依存ファイル]に"icuuc.lib"を追記します。
#こんな感じになります。→ kernel32.lib $(NoInherit) icuuc.lib
#今回は文字コードの変換処理のみ使用するので"icuuc.lib"だけです。

5.DLLの配置
ソリューションで、exeファイルが生成されるディレクトリ(※1)に"icudt38.dll"と
"icuuc38.dll"をコピーします。
#今回は文字コードの変換処理のみ使用するので2つだけです。

(※1)例では〜\Visual Studio 2005\Projects\<ソリューションフォルダ>\debug もしくは、\releaseです。
posted by 台北猫々 at 10:23| Comment(0) | TrackBack(0) | 技術メモ(Windows C/C++)

2008年02月16日

文字コード(エンコーディング)変換

WebサービスのRESTクライアントクラス(C/C++)を作っていて思ったのですが、文字コードが結構困り者ですね。

Yahooの検索サービスAPIの仕様を調査してみると、検索ワードはUTF8エンコーディングすることになっており、レスポンスデータ(XMLデータ)は、こちらは当然といえば当然ですが、UTF8エンコーディングです。

こうなると、UTF8←→SJIS/EUCの相互変換機能が必要な気がしてきました。標準ライブラリやAPIを使って自作するという手もあるのですが、とりあえず、良いライブラリがないかな?と思って探した所、ありました!

IBMが公開しているオープンソースで、"ICU"というなんかすごい数の文字コードの変換をサポートしているライブラリがありました。

http://www.icu-project.org/

しかも、素敵なことにWindows、Linux共にサポートしていますね。
後日にICUの調査レポートを公開しますね。

posted by 台北猫々 at 00:09| Comment(0) | TrackBack(0) | 日記

2008年02月15日

更新しました(StdUtilクラス)

細かい追加ですが・・・↓を追加しました。

/**
* 指定した開始文字・終了文字の前後をトリミングします。
* @param src ソース文字列(IN/OUT)
* @param begin 開始文字
* @param end 終了文字
*/
static void Trim(string &str, char begin, char end)

1.Trimメソッド追加
開始文字・終了文字を指定してトリミングします。
例:元が"aaa<ggggggg>bbb"で開始文字'<'、終了文字'>'ならば、結果は "<ggggggg>"


公開URLはページの→側にもありますが、
http://winter-tail.sakura.ne.jp
です。

良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 19:34| Comment(0) | TrackBack(0) | 日記

2008年02月14日

更新しました(HttpURLConnectionクラス)

WebサービスのRESTクライアントクラス作成に伴う機能追加です。

2008.02.14 V1.0.2
1.GetChunkedBody, GetNonChunkedBody, IsChunkedメソッド(protected)追加
Transfer-Encoding:chunkedのデータも受信できるようにしました。


公開URLはページの→側にもありますが、
http://winter-tail.sakura.ne.jp
です。

良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 19:57| Comment(8) | TrackBack(0) | 日記

2008年02月13日

ことの葉ひらひら その18

「一番ついてはいけない嘘は、自分につく嘘です。」

自分を騙す生き方は楽ですけど、空っぽなんですよね。猫
posted by 台北猫々 at 22:36| Comment(0) | TrackBack(0) | ことの葉

2008年02月12日

更新しました(SocketStreamクラス)

HTTPのTransfer-Encoding:chunkedに対応するためのメソッドを追加しました。chunkedデータをデコードするために長さ指定で受信するメソッドです。

2008.2.12 V1.0.6
1.Readメソッド追加
chunkedデータを処理するために長さ指定で受信するメソッドを追加しました。



公開URLはページの→側にもありますが、
http://winter-tail.sakura.ne.jp
です。


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 17:57| Comment(0) | TrackBack(0) | 日記

2008年02月11日

Oracle Master更新しよう

実は、Oracle Master 9i Platinumを持っているのです(ただし、制度改定前なので、現状では実質 9i Goldなのです)。

今はシステム開発会社に所属しているわけではないので、10g Goldに更新することに関心がなかったのですが、なぜだか急に更新する意欲が湧いてきました。

そこで、今年も4月には10g Goldへの移行試験をパスしてしまうことに決めましたことを、ここに宣言します猫

とりあえずは、Oracle10gのインストールと黒本の入手からでしょうか?
posted by 台北猫々 at 13:04| Comment(2) | TrackBack(0) | 日記

2008年02月10日

虎猫残夢

いつのまにやら、
私の部屋にトラ猫の幽霊が出るようになっていました。

幽霊といっても、おどろおどろしいものではなく、半透明で触ることができない以外には、生きている猫と変わることはありません。

生きている猫のように、いつのまにやら部屋の中をうろうろして、いつのまにやらどこかへ出掛けてしまいます。

私が部屋で食事していると、いつのまにか足元に猫がいて、ものほしそうにこっちを見ます。私は、幽霊でも食べられるのかな?と思って、食事を取り分けて猫の前に置きました。

猫は見た目、食べ始めたようですが、量は一向に減りません。それでも、しばらくすると満足したようで、その辺で寝始めました。

いつのまにやら、
幽霊猫が部屋に来なくなってしまいました。
私は寂しくなってしまいました。


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 09:35| Comment(0) | TrackBack(0) | 夢日記

2008年02月09日

HTTP1.1勉強不足です。

この間公開した、HttpURLConnectionクラス使ってRESTタイプのWebサービスクライアントクラスを作成しているのですが、受け取ったXMLを見てみると、データ先頭・途中・末尾になにやら意味不明な文字を入っていて、XMLのパースが上手くいきません。

例えば↓


4aa

<?xml version="1.0" encoding="UTF-8" ?>
〜〜〜〜
<link>http://XX

5a8

XXXX.com/point/city/9999.html</link>
〜〜〜〜
</root>


0



というように"4aa"や"5a8"や"0"などが入ってきます。
一体これはなんだろうと思っていましたが、HTTPヘッダを
見直してみると、
Transfer-Encoding: chunked
になっています。もしかして、これがチャンクデータ?と思って、
http://www.studyinghttp.net/cgi-bin/rfc.cgi?2616#Sec3.6.1
を見てみると、確かにチャンクデータのようです。HTTP/1.1からの仕様ですね。

HttpURLConnectionクラスはHTTP/1.1を使用しているので、チャンクデータのデコード(連結)は、仕様的にやらなければならないようです。

全く勉強不足でした。対応しなければ・・・

ただ、仕様上はチャンクサイズの後ろはCRLFのようなのですが、実際受け取ったXMLデータでは、CRCRLFのように見えるのですよね。どういうことなのでしょう?


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 09:46| Comment(0) | TrackBack(0) | 日記

2008年02月08日

テキストファイル読み込み処理雛形

Javaでテキストファイルを1行づつ読み込む処理の雛形です。



import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class FileReadSkelton {

public void read(File file) throws Exception {

BufferedReader in = null;
try{
in = new BufferedReader(new FileReader(file));
String line;
while( (line=in.readLine() ) !=null ) {
System.out.println("行データ:" + line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
throw new Exception("ファイルがありません" + file.getPath() );
} catch(Exception e){
e.printStackTrace();
throw e;
}finally{
try {
if( in != null ) {
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}




良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 18:51| Comment(0) | TrackBack(0) | 技術メモ(Java)

2008年02月07日

ロードモジュール(exe)を作成するMakefile

Makefileの書き方って、結構忘れがちですよね。
というわけで、メモ。

Linuxでロードモジュール(exe)を作成するMakefileのサンプルです(C++用)。


#
# Makefile for
CC = g++
SRCDIR = ./
OBJDIR = ./
INCD00 = ./
PROGRAM = SocketSample
DEST = ./
CP = /bin/mv
LIBS = -L./ -lSample
CFLAGS = -Wall -O
INCD = -I. -I$(INCD00)

vpath %.h $(INCD00)

vpath %.cpp $(INCD00)
#
SRCS=\
main.cpp \

OBJS=\
main.o \
#
all: $(OBJS) $(PROGRAM)
#
.cpp.o:
$(CC) $(CFLAGS) -c $(INCD) $<
#
$(PROGRAM): $(OBJS)
@echo "Loading $(PROGRAM) ..."
@$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS)
@echo "done"
#
install: $(PROGRAM)
@echo Installing $(PROGRAM) in $(DEST)
@$(CP) $(PROGRAM) $(DEST)
#
clear clean:; @rm -f $(OBJS)




一応、以前に作成例を出したlibSample.soをリンクするよう
にしています。ただし、上記の指定の仕方だと環境変数LD_LIBRARY_PATHにライブラリファイルの位置を実行時に
指定しておく必要があります。


良かったらクリックお願いします→banner_01.gif


posted by 台北猫々 at 20:50| Comment(0) | TrackBack(0) | 技術メモ(Linux C/C++)

2008年02月06日

公開しました(HttpURLConnectionクラス)

新たに公開したのは、↓です。
■HttpURLConnectionクラス(C/C++)Windows,Linux共用
HTTPクライアント処理を行います。一応基本的なGET, POSTを行うことができます。また、COOKIEも保持するのでセッションを維持することもできます。

ただ、1.0.1版にしていますが気持ち的には0.9.0版です・・・HTTPにどこまで対応しようか考えていて、ちょっと発散気味だったのでとりあえずリリースして、一段落させることにしました。

今後は、HTTPの準拠やバイナリデータのダウンロードなどなど機能追加いていこうと思います。

あと、このクラスを継承か保持してWebサービスのRESTクライアントを作成する計画もあります。

ともあれ、スケジューリングしてからですね。


公開URLはページの→側にもありますが、
http://winter-tail.sakura.ne.jp
です。


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 21:12| Comment(0) | TrackBack(0) | 日記

2008年02月05日

静的ライブラリ(*.a)を作成するMakefile

Makefileの書き方って、結構忘れがちですよね。
というわけで、メモ。

Linuxでアーカイブファイル(=静的ライブラリ(*.a))を作成するMakefileのサンプルです(C++用)。

#
# Makefile for
CC = g++
AR = ar
SRCDIR = .
OBJDIR = ./
INCD00 = ./
ARFLAG = crsv
LFILE = libSample.a
DEST = ./
CP = /bin/mv
LIBS =
CFLAGS = -Wall -O
INCD = -I. -I$(INCD00)

vpath %.h $(INCD00)
vpath %.cpp $(INCD00)

#
SRCS=\
$(INCD00)Socket.cpp \
$(INCD00)SocketStream.cpp \
#
OBJS=\
$(OBJDIR)Socket.o \
$(OBJDIR)SocketStream.o \
#
all: $(OBJS) $(LFILE)
#
.cpp.o:
$(CC) $(CFLAGS) -c $(INCD) $<
#
$(LFILE): $(OBJS) $(SRCS)
$(AR) $(ARFLAG) $(LFILE) $(OBJS)
@rm -f $(OBJS)
@echo "libSample.a make success"

install: $(LFILE)
@echo Installing $(LFILE) in $(DEST)
@$(CP) $(LFILE) $(DEST)

clear clean:; @rm -f $(OBJS)
@rm -f $(LFILE)
#


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 20:53| Comment(0) | TrackBack(0) | 技術メモ(Linux C/C++)

2008年02月04日

やっぱり行けませんでした。

結局、路面凍結のためバスの運行の復旧目処立たずで、職場に行く事ができませんでした・・・猫

自転車で行くという選択肢もあったのですが、それも危険な気がして止めました。

まあ、C/C++ライブラリでも作るかな?猫
posted by 台北猫々 at 13:29| Comment(0) | TrackBack(0) | 日記

会社に行けない・・・

雪の影響で、バスが午前中運休になってしまいました。。。

とりあえず、午前半休にさせてもらったのですが、時間が空いてしまったので、家の周りの雪かきをやりました。

バス動くかな?
posted by 台北猫々 at 10:42| Comment(0) | TrackBack(0) | 日記

2008年02月03日

雪と鍋

雪が降っているので、昼は鍋にしました。はりはり鍋のカキバージョンでした。

窓から、しんしんと降りしきる雪を見ながら食べる鍋は、美味しさが倍増しますね。雪見ビールも美味しゅうございました。


降り積もる雪は、真綿のようでありました。猫
posted by 台北猫々 at 13:57| Comment(0) | TrackBack(0) | 日記

更新しました(Socket, RawSocketクラス)。

IPPROTO_RAWを指定した場合への対応を行いました。でも、WindowsXP SP2では、機能しないのですが・・・
そういった意味では、WinSock2.2への変更は必要ないのですが、一応最新にしておくというレベルです。

・RawSocketクラス v1.0.2
1.Openメソッド更新
プロトコルにIPPROTO_RAWが指定された時にsetsockoptでIPPROTO_IPにIP_HDRINCLを指定するように変更(ユーザ側でIPヘッダを設定しますよという指定です)。
・Socketクラス v1.0.6
1.StartUpメソッド更新
MAKEWORD(2,0)→MAKEWORD(2,2)。最新にするのを忘れていました。

2.GetProtocol、GetTypeメソッド追加
アクセッサを忘れていました。
posted by 台北猫々 at 09:06| Comment(0) | TrackBack(0) | 日記

2008年02月02日

リーダーということ

結構昔ですが、仕事上関わりを持った若い人と話していて、「ちょっとずれるな」と思うことに「リーダー」の意味ということがありました。

「リーダー」の役割を、例えば会議の司会進行役を上手くやる人だという考え方をしている人がいるのですね。システム開発でいえば、目の前の作業を上手くまわせる人ということでしょうか。

もちろん、それも大事なのですが、本質とはいえないですね。

「リーダー」の意味は、そのまま訳すと「導く人」ですよね。本質はそこにあります。つまり、メンバーが道に迷わないように進むべき方向を指し示すのが、リーダーの役割だと思っています。

メンバーより多くの情報を持っているはずのリーダーがするべきことは、視野が狭くなりがちのメンバーに代わって、ずっと先のことも見越した物事を考え、チームの進むべき道を指し示す努力と成果を挙げなければならないと思います。

ただ、リーダーにも誤りがあるときもあると思います。指し示す方向が間違ってしまうことも。しかし、かといって、リーダーとしての本質を考えず、司会進行役などでリーダーの職務を全うしているようなことをいうのはナンセンスです。


#ちょっと思い出したので、
#「ソフトウエア受託開発業界考察」に割り込みました。猫
posted by 台北猫々 at 18:21| Comment(0) | TrackBack(0) | コラムみたいな