著作一覧 |
icmppingだとかcstructとかの小物を単一のリポジトリにまとめた。
cstructはとんでもないバグがあったので修正。指摘してくださった人、どうもありがとう。
#というか、なんでcstructを作ったかを思い出したけど、どうしようかなとか思案したり(あまり必要性を感じなくなってきたわけなのだ)。
ruby-listでiconvが話題になってるときに、エンコード名Windows-31Jを使った例が出てた。で、試しにやると
c:\home\test>ruby -riconv -e 'puts Iconv.conv("windows-31j", "utf-8", "\xe3\x80\x9c")' -e:1:in `conv': invalid encoding ("windows-31j", "utf-8") (Iconv::InvalidEncoding) from -e:1うが。
c:\home\test>ruby -riconv -e 'puts Iconv.conv("cp932", "utf-8", "\xe3\x80\x9c")' 〜
で、これはiconvのバージョンが古いからWindows-31Jが未登録なのか(ASRに添付しているiconvは1.9)と思って、FSFからlibiconvの最新版を取ってきた。1.11.1だ。
ところが相変わらずwoe32とか書いているのは良いとしてmakeに失敗する。Win32の場合、./configureせずに単にMakefile.msvcを利用すればいけるはずなんだが(というか1.9は普通に作れた)といろいろ見ていくと、結構漏れがある。
で、最終的には1.11.1はビルドできたのだが、簡単なスクリプトに関しては1.9と動作の違いは見えないように見える。Windows-31Jが登録されていない点では変わりないし。で、1.9のままでも良いかなとか思わないでもない。
追記:jzkeyさんのコメント参照。ただし僕のツッコミは正確じゃなくてWindowsの世界でcp932とutf-8変換を相互変換する場合にはローマ数字とか処理できます(1.9、1.11.1どちらも)。
一応、生成したDLLとリンクに必要なヘッダとライブラリを置いておく(libiconv-1.11.1-bin.zip)。なお、DLLに埋め込まれたバージョン番号が1.11.0.0となっているのは元のリソースがそうなっているからで、利用したソースアーカイブ自体は1.11.1を利用している。
お願い: 1.11.1にバージョンアップしたほうが良い例/理由があれば教えてください。
で、とりあえず、1.11.1をVC6でMakeする人もいないでもないかも知れないから、僕がMake通すためにやった修正だけ以下に示す。
diff -u config.h.msvc.org config.h.msvc --- config.h.msvc.org Thu Jul 20 04:10:22 2006 +++ config.h.msvc Sun Dec 31 12:57:36 2006 @@ -715,3 +715,4 @@ # define DLL_VARIABLE #endif +#define EXEEXT "exe"
cd srclib
diff -u Makefile.msvc.org Makefile.msvc --- Makefile.msvc.org Sat Jan 24 18:11:24 2004 +++ Makefile.msvc Sun Dec 31 03:26:20 2006 @@ -90,7 +90,8 @@ xmalloc.obj xstrdup.obj \ \ relocatable.obj \ - setenv.obj unsetenv.obj + setenv.obj unsetenv.obj \ + width.obj all : icrt.lib @@ -120,6 +121,9 @@ unsetenv.obj : unsetenv.c $(CC) $(INCLUDES) $(CFLAGS) -c unsetenv.c + +width.obj : width.c + $(CC) $(INCLUDES) $(CFLAGS) -c width.c icrt.lib : $(OBJECTS) -$(RM) icrt.lib
diff -u unitypes.h.org unitypes.h --- unitypes.h.org Fri May 20 01:58:24 2005 +++ unitypes.h Sun Dec 31 03:10:10 2006 @@ -20,7 +20,10 @@ #define _UNITYPES_H /* Get uint8_t, uint16_t, uint32_t. */ -#include <stdint.h> +/* #include <stdint.h> */ +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; /* Type representing a Unicode character. */ typedef uint32_t ucs4_t;
diff -u unsetenv.c.org unsetenv.c --- unsetenv.c.org Sun Jun 18 00:51:52 2006 +++ unsetenv.c Sun Dec 31 03:03:49 2006 @@ -27,7 +27,9 @@ #include <stdlib.h> #include <string.h> +#if HAVE_UNISTD_H #include <unistd.h> +#endif #if !_LIBC # define __environ environ
コマンドライン(NO_NLS=1が必須。あとは必要に応じて)
nmake -f Makefile.msvc DLL=1 MFLAGS=-MD NO_NLS=1
以上
追記:Backyardに外出しした。
なぜ大晦日、と思わないでもないが(子供ならお年玉の予定を組めということだろうなとは思うけど)、アマゾンからEDM(E-Direct Mail)が来た。
ちゃんと購買履歴を見た上でシリーズの続きとか同傾向の作品とかを選んでいる。
が、シリーズの続きにしては遅すぎる。
ふたつのスピカ 11 (MFコミックス フラッパーシリーズ)(柳沼 行)
もう、買ったよ。
一方、同傾向のお勧めの筆頭としてこれが来た。
Binary Hacks ―ハッカー秘伝のテクニック100選(高林 哲)
いや、傾向分析は正しいが……
ちなみに、お勧めの理由として挙げられているのが
と、
ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門(青木 峰郎)
向井さんの本(RubyKaigiの時にいただいたサイン付き)は途中まで読んだところで実際に処理系を叩きながら読まないとだめじゃんと気づいてそのままになってるからさっさと読むことにしたい(晩飯用スタックに積んでいるのが間違いだった)。ふつけるはRHG読書会で読めるからいいやと思ってたら結局、1回しか行けずそのままになってしまったのが悔やまれる。
晩飯スタックのうち次のは読了したので子供にやったらちゃんと読んでるっぽい。
クマムシ?!―小さな怪物 (岩波 科学ライブラリー)(鈴木 忠)
最後のほうに出ている苔の上からどうやって雨樋に落ちるかの図解がかわいいと評判だ。というか、0.1mmの世界は肉眼で見るときっとうじゃうじゃとして気持ち悪いんじゃないかと思うが、顕微鏡で眺めるとノソノソしていて可愛いというのは興味深い。森を見ずに木を見る大切さ。
で、今の晩飯スタックのトップはこれ。
アレキザンダもまだスタックにあるが、ほとんど読み終わった。
最後のほうになると具体的なパターンが出てきてそれがどう歴史的、慣習的、文化的、地域的に適用され、生活に意味を与えるかが書かれているので、最初のほうのエセタオイストっぽさは抜けて、きわめてまっとうな考察となるのが興味深い。それにしても、思弁的な領域を建築という具体的な技術に落とし込むというのは困難な作業だな、と考える。
解説というほどのことはないけど、「RHG(このタイトルと内容の乖離っぷりが奇怪だ)」の後ろに「JavaScriptパワーについて、ちょっと説明」を追記。
ちなみに僕は、部分部分を除いては全滅でした。7とかは正答できるけど、仕様が〜だからこの場合は〜になる、というのを正しく説明できるという意味では、ということ。13は仕様は説明できるけど、その出力は知らなかったから、そういうのもあるけど。
もうすぐ正月でにんじんとだいこんの膾でなますて。
ソースの雰囲気からWindowsプログラマだと想定すると、次のような羹に懲りたのかも。
while (fgets(buff, len, f)) { LPWSTR pw = A2W(buff); ... }
行数にもよるけど普通に死ぬ(開放しないというかできないし)。
で、これは結構、面倒な問題なのだ。と、A2Wの説明をしないまま突っ走る。ATLプログラマ以外のことは知らない。(追記:alloca使ったマクロだよー)
たとえば、あーと死んだ後になって気付いて次のようなことをしてみたり。
LPWSTR conv(LPSTR p) { USES_CONVERSION; return A2W(p); } ... while (fgets(buff, len, f)) { LPWSTR pw = conv(buff); ... }
この戦略は、結構うまく行く。問題点を正しく把握して目を光らせている限りは。でも、断崖絶壁を命綱無しで歩いているわけで当然のようになんてことを! ということも生まれる。
「なんかファイルがおかしいみたいなんでデバッグ用メッセージを入れたらすごくおかしくなっちゃったんですが」while (fgets(buff, len, f)) { LPWSTR pw = conv(buff); wprintf(pw); ... }
いや、それをやったらおしまいなんだが。
Cはおもしろい。
追記:気になったので試してみたら12MBのファイルでは死なず、24MBでは死んだ(VC++6 CL ノンオプションでコンパイルした場合)。すると規定のスタックサイズは32MBくらいかな。
今年は、点数にして3冊上梓しました。
読者諸氏および編集者諸氏、出版社、そして技術を教えてくださったり共に学ばれたりしてくださる諸兄に感謝します。
かんたんRuby on RailsでWebアプリケーション開発(arton)
Railsの入門書です(はじめてのWebアプリケーション開発みたいな色彩も強い)。読了後は、西さんのリファレンス性が強い本や、吉田&馬場さんのノウハウ本へ進まれることをお勧めします。
Seasar2で学ぶ DIとAOP アスペクト指向によるJava開発(arton)
この本の真のきっかけは、はぶさんといがぴょんさんとのスマートクライアントオフ会でひがさんと高井さんに出会ったところまでさかのぼります。もうすぐ3年になるのか……。そこで「IoCコンテナというのがあってね……」という話を聞いて「なるほど! そりゃ逆転の発想だ」と感動(大げさかな? でも感心というとちょっと気付かなかったくせにえらそうだよね)したところからここまで来たわけです。
Visual C# 2005プログラミング入門(arton)
というわけで1巡。
(1年前、3年前、6年前という過去があるわけですね)
ジェズイットを見習え |
libiconvでローマ数字とかWindows-31JとかEUC-JP-MSとかを云々しようとおもったら、 パッチが要るはずです確か。
http://www2d.biglobe.ne.jp/~msyk/software/libiconv/
ご教示、どうもありがとうございます。
ということは、CP932と書いて変換できるように見えるけど、実際にはCP932で定義されているいわゆる機種依存文字についてはlibiconv自体は何も関知してないということなんですね。
とりあえず僕自身はそのあたりはいらないから、単にmakeを通らせるとこで終わりにしておきます。