String の + 演算 vs StringBuilder#append(String)

String は immutable なオブジェクトなので、例えば "1" + "2" というコードを書くと "1" の領域の最後に "2" がくっつくわけではなく "12" という新しいインスタンスが割り当てられる。だが "1" + "2" + "3" と書くと、"12" という String がまずできて、そ…

Integer.parseInt(String, int) にご注意

0xFFFFFFFF は 32 bit int で、型が符号付きなら -1 です。Java は符号なし int はないので、常に -1 なのですが、ちょっとした罠があります。以下は文字列 "FFFFFFFF" を int に直そうとするコードです。これを実行するとどうなるでしょう。 public class P…

WeakReference と ReferenceQueue

今日は新しい技を会得したぞ!Java のオブジェクトが GC で回収されたことを検知したい場合、いくつかの方法があります。対象のオブジェクトに finalize() を実装しておく、というのは最も簡単な方法ですが、副作用があるし、何より自分で実装したクラスじゃ…

printf と write の同期

フレームワークが write システムコールで標準出力にログ出力、そのフレームワーク上で動作するアプリケーションは printf で標準出力にログ出力し、アプリケーションはマルチスレッドで動作するというケースにおいて、write の出力が printf の出力で潰され…

始発で帰る

久しぶりに会社に泊まってしまった。バグを残したまま週末をまたぐと色々と忘れてしまうから、もう少し、あと少し、としているうちに、終電がなくなってしまった。バグがとれたのでよかったんだけど。 始発が始まるまでの間、はてなダイアリーの下書きに眠っ…

Java の総称型は便利だけどちょっと残念

Java の総称型はかなり便利で、いやそれまでが不便だったんだけど、それに気がつかなかったということかも知れない。たとえばこういう宣言を見ると、ちょっと苦痛に感じる。 List list = new ArrayList(); このリストには何が入ってんだよ? 参照するときキ…

各種テキストエディタのデータ構造と処理を邪推する

IT

鈴川エディタというテキストエディタをご存知でしょうか。私はついさっき*1知りました。触れ込みは以下の通り。 小さいメモリ(50MB以下)で大規模テキストファイル(300GB、2,000億行)を編集できる世界唯一の超巨大テキストエディター http://www.szkwjp.c…

正規表現エンジンメモ #2

IT

正規表現エンジンメモ - satosystemsの日記 の続きです。 SRegex http://www.syuhitu.org/other/regex/regex.html 「主筆」という Solaris で動作するテキストエディタを作成されている方の、主筆のための正規表現エンジン。 世の中に存在する正規表現ライブ…

JDK のソースコードのコピーライトがヒドイ

Sun Microsystems のコピーライト条項に問題があったのか、以下のようにバッサリ削られている。 全部見たわけではないけど、多分全部こうだ。もう少しマシな消し方があったのではないか。

Open Group の正規表現実装

IT C

こちらのサイト(http://www.syuhitu.org/other/regex/regex.html)を読んでいたら、気になる文章を発見。 (余談だが、ANSIの規格ではCのライブラリに正規表現ライブラリが含まれることとなっているらしい。 そのため、Borland C++ Compiler 5.5.1では使用…

Wink でキャプチャ、ffmpeg でエンコード、VLC Player で H264 に変換

IT

動画作成のメモ。僕は Wink というキャプチャソフトで SWF(flv ではない)を作成していたんだけど、お客様がそろそろ Flash をやめたいという意向があって、メジャーな動画形式にするということになった。Wink はものすごく使いやすいというわけではないん…

構造体のメンバのオフセットを取得する offsetof

Android のソースツリー内に頻繁に見かけられる offsetof というマクロ。構造体のメンバのオフセットを取得するマクロなんだけど、よく考えられてるなと感心した。 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) もっとも、構造体のオフ…

Prolog の紹介

IT

フィボナッチで各種言語をベンチマーク - satosystemsの日記 で Prolog のフィボナッチを以下のように実装しました。 fib(0, 0). fib(1, 1). fib(N, NF) :- A is N - 2, B is N - 1, fib(A, AF), fib(B, BF), NF is AF + BF. goal :- fib(38, NF), write([NF…

プログラミング言語の後付け仕様による微妙な制約

IT

JavaScript は、当初正規表現を扱えなかったのですが、やっぱり正規表現は使いたいよね〜、ということで Perl から正規表現リテラルをインポートしました。その結果、以下のような微妙な制約が生まれてしまいました。 /* 正規表現リテラルがコメントの終わり…

SSL を推奨しない国、中国

妻が義父のために、中国の「Yahoo! メッセンジャー」こと「QQ」のアカウントを作成した。目的は、孫の写真を簡単に共有することだ。QQ は当初はメッセンジャーだったんだけど、SNS 機能がついて、Facebook のようなウォールを持てる。なお、QQ というのは、…

モバイル OS 第三極

IT

新興・マイナー系モバイル OS の僕なりの感想。 Firefox OS 「独占的モバイルプラットフォームからの解放」をうたった OS。そのわりには Firefox Marketplace というものの準備が進められていて、なんだか自己矛盾のように感じる。マーケットはプラットフォ…

【絶対】PC の時計を 2099 年 12 月 31 日にしてはいけない【ダメ】

IT

下手すると PC が起動しなくなります。コンピュータには 2036 年問題というのがあって、簡単に言うと、2036 年のある時刻以降、内部時計が 1900 年に戻ってしまうというもの。まあこれぐらいならかわいらしい現象です。僕は実際に 2099 年 12 月 31 日 23 時…

Lua が組み込まれているアプリ

Lua

Lua が組み込まれているアプリはどんなものがあるか。 ゲーム World of Worcraft: Diablo を世に送り出した Blizzard Entertainment の看板 MMORPG。コア API が Lua でラップされていて、UI なんかはすべて Lua で書かれているらしい。カスタマイズ(という…

正規表現エンジンメモ

IT

C++ の GapBuffer に対して正規表現を適用できないか、ということで調査を行ったメモ。GapBuffer というのは、誤解を恐れずに簡単に言ってしまうと、不連続メモリに格納されている文字列のこと。これを正規表現のためだけに連続領域に格納しようとすると、領…

Javadoc の package.html をパースできない不具合

Javadoc は package.html という HTML をパッケージに配置しておけば、パッケージサマリーページとして取り込んでくれる。今まで数千の package.html を生成し、数十万行にわたるドキュメントを書いてきた私ですら、本日初めて遭遇する Javadoc のバグが見つ…

組み込み言語 Lua

Lua

今年習得する言語として Lua を選択した。主に VM の実装がどのようになっているのか、という方面に興味があるんだけど、いじり倒す予定なので言語としての Lua も極めておこうかと思う。雰囲気はこんな感じ。 function foo() local s, e = string.find("ば…

boost::filesystem で ~ ディレクトリを作ってはいけない

よくあるアプリ固有の設定ファイルを保持するディレクトリを、ホーム以下に以下のように Boost のライブラリを使用して作ろうと思ったら・・・ boost::system::error_code ec; const boost::filesystem::path dir("~/.hoge"); const boost::filesystem::file…

バッチファイルで条件に一致する配下のファイル・ディレクトリすべてに対して何か処理をしたい場合

IT

以下のように行う。 for /F "usebackq" %%a in (`dir /b`) do ( echo %%a | find "<ファイル名・ディレクトリ名の一部>" >NUL if not ERRORLEVEL 1 ( rem 何かの処理 echo %%a ) )echo と find を使うところがポイント。 もっと複雑な条件なら、ファイル名・…

ECMAScript 5.1 の規格書を読んで発見したこと

ECMAScript 5.1、別の言い方では Ecma-262、通称 JavaScript の規格書を読んで、僕的にいくつか驚いたことをまとめておきます。規格書は以下から参照できます。 Standard ECMA-262 日本語訳もあるのですが、僕は原典をあたることをお勧めします。 識別子に U…

中国における 38 と 250

今日で 38 歳になりました。さて、中国では「ばか」「あほ」「まぬけ」「うすのろ」「ぼんくら」みたいなニュアンスを持つ数字があります。ひとつは 38、もうひとつは 250 です。僕が中国で実際に体験した逸話を紹介します。 知り合いの誕生日は 3 月 8 日だ…

Cygwin 管理下のファイルを Windows で編集すると実行権限がついて困る、を解決

IT

表題の件、ずっと困ってたんですよ。ソースコードを Windows のエディタで編集したりすると、Cygwin 環境で勝手に実行権限がついてしまったり、新規作成したファイルが実行権限だったり。そうして作ったファイルを Git にコミットしてしまったりすると、実行…

~ がホームディレクトリを表す理由

IT

なぜUnix&Linuxではホームディレクトリを「~」文字で表現するのか。 - [モ]Modern Syntaxリンク先参照。なるほど。~ の下に ^ があるけど、どうやって 3 種類を打ち分けるんだろう。ちなみに ^ はアクサンシルコンフレックスと読む。今日初めて知ったという…

ゲームに使えそうな Unicode の文字一覧 🀙

IT

Unicode に麻雀牌の文字コードを発見。 麻雀牌 ロン!平和のみ フォントによっては表示されないかも(されないので、スクリーンキャプチャ)。 - - その他、ゲームに使えそうな文字一覧。 ドミノ トランプ チェス、サイコロ、トランプマーク、将棋マーク、…

ブロックする InputStream を BufferedInputStream でラップしてはいけない

以下のコードを実行すると: import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; public class InputStreamTest { static class MyInputStream extends InputStream { int pos; byte[] data = "HelloWorld".getB…

C/C++ でファイルサイズ取得

C/C++ を使用して、ファイルサイズを取得する方法の備忘録。 // g++ getFileSize.cpp -lboost_system-mt -lboost_filesystem-mt #define CAN_CUST_FPOS_TO_LONG 0 #include <stdio.h> #if CAN_CUST_FPOS_TO_LONG unsigend long getFileSize1(const char *fileName) { </stdio.h>…