2008年8月27日水曜日

fiberで添付ファイルを開く

Windows Vista で Meadow で Wanderlust 使ってて、これまでは添付ファイルは一旦ディスクに保存して開いていたけど、いい加減面倒になってきたので v (mime-preview-play-current-entity) で開けるようにした。

まず、~/.mailcapを作って以下のように記述

application/*; fiber -s '%s'
image/*; fiber -s '%s'


%s をシングルクォートでくくっているのは、ファイル名が日本語の時に、末尾に改行コードっぽいのが紛れ込んで認識できない事があったから。
シングルクォートでくくったら、なぜかOK。

cygwin のシェル経由で fiber を起動するので、文字コード/改行コードを明示的に指定。

(modify-coding-system-alist 'process ".*sh\\.exe" '(sjis-dos . sjis-unix))


そんで、何故だか FLIM の mime-format-mailcap-command がマルチバイト文字の前に'\'を追加するので、.wl に以下を追加して除去。

(eval-after-load "mime-conf"
'(defadvice mime-format-mailcap-command
(after remove-escape-chars activate)
"Remove all '\\' characters in return value of mime-format-mailcap-command "
(while (string-match "\\\\" ad-return-value)
(setq ad-return-value (replace-match "" nil t ad-return-value)))))


これで開けるようになった。

2008年7月2日水曜日

JPEG圧縮におけるDC成分とAC成分

DC成分は隣り合うブロックとの差がほとんどないため、差の配列を符号化する
AC成分はそのような特性は無いため、ブロック毎にDC成分を除く63個の値を左上から順にジグザグスキャンして符号化する

http://www2.starcat.ne.jp/~fussy/algo/algo8-7.htm
http://www.ccad.sist.chukyo-u.ac.jp/~mito/syllabi/compaction/frame.htm

2008年7月1日火曜日

The Collection Interface

Use Iterator instead of the for-each construct when you need to:

* Remove the current element. The for-each construct hides the iterator, so you cannot call remove. Therefore, the for-each construct is not usable for filtering.
* Iterate over multiple collections in parallel.


http://java.sun.com/docs/books/tutorial/collections/interfaces/collection.html

2008年6月29日日曜日

オイラーの公式

全く起源の異なる指数関数と三角関数が複素数の世界では密接に結びついていることを示している
http://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%A4%E3%83%A9%E3%83%BC%E3%81%AE%E5%85%AC%E5%BC%8F

幾何学的に解釈すると、実軸と虚軸の平面上での単位円になる

ここも参考にした
http://www12.plala.or.jp/ksp/mathInPhys/euler/

すっかり忘れていたから、復習した。

画像の輪郭

1次微分(グラディエント)による方法
→輝度の差が「輪郭の輝度」に効いてくる

2次微分(ラプラシアン)による方法
→輝度がどれだけ急激に変化したかが「輪郭の輝度」に効いてくる(輝度の差は関係ないという事)

2008年6月4日水曜日

2008年5月26日月曜日

libevent

http://www.monkey.org/~provos/libevent/

こんな便利なライブラリの存在に、つい先日気づいた。
あの時に使いたかった。。。

2008年5月8日木曜日

ファイルのアップロード

<input type="file" />のデフォルトのボタンが気に入らないので、カスタマイズする方法を探してたら、
http://www.quirksmode.org/dom/inputfile.html

http://www.shauninman.com/archive/2007/09/10/styling_file_inputs_with_css_and_the_dom
を発見。

前者は、CSSのcursor: pointerが効かない。
細かいとこだけど、これは結構でかい。

さらに、Fakeなボタン画像の大きさを、元のボタンの大きさに合わせて作らなきゃならないみたい。

後者は、IE上で実行すると、input要素がずっとマウスポインタにくっついてきて、
全然関係ないとこでクリックしても、ファイル選択ダイアログが開かれてしまう。

そんで、こっちもcursor: pointerが効かない。

んー、SWFUpload使うか。

UTF-8で符号化されたバイト配列から文字列を復元する関数

作ったんだけど、使わなくなった。
もったいないから、残しとく。

var decodeUtf8Array = function(ary) {
var s = "";
var uc = function(ind) {return (ary[ind] >= 0)? ary[ind]: (ary[ind] + 0xff + 1)};
for (i = 0; i < ary.length;) {
var c1 = uc(i);
if (c1 >= 0xf0) {
var c2 = uc(i+1);
var c3 = uc(i+2);
var c4 = uc(i+3);
s += String.fromCharCode(((c1 & 0x07) << 18) | ((c2 & 0x3f) << 12) | (c3 & 0x3f) << 6 | (c4 & 0x3f));
i += 4;
} else if (c1 >= 0xe0) {
var c2 = uc(i+1);
var c3 = uc(i+2);
s += String.fromCharCode(((c1 & 0x0f) << 12) | ((c2 & 0x3f) << 6) | (c3 & 0x3f));
i += 3;
} else if (c1 >= 0xc0) {
var c2 = uc(i+1);
s += String.fromCharCode(((c1 & 0x1f) << 6) | (c2 & 0x3f));
i += 2;
} else {
s += String.fromCharCode(c1 & 0x7f);
++i;
}
}
return s;
};

2008年4月9日水曜日

さくらインターネットとimapとopensslとwl

WanderlustでさくらインターネットのIMAPサーバにSSLで接続。

これまでは、.wlに、
(setq ssl-certificate-verification-policy 1)
と書いていたけど、誤魔化しているようで嫌だったので証明書を取り込むことにした。

SSLのネゴシエーションのパケットをWiresharkでキャプチャしたら、
Protocol: TLSv1
Info: Certificate
のレコードに証明書が二つ含まれていたので、それぞれバイナリで保存した。

保存した二つの証明書を、opensslコマンドでBase64エンコード
$ openssl base64 -in sakura-1.bin -e -out sakura-1.pem
$ openssl base64 -in sakura-2.bin -e -out sakura-2.pem

sakura-*.pemの最初と最後に
-----BEGIN CERTIFICATE-----

-----END CERTIFICATE-----
を追加した。

ちなみに、この証明書のフォーマットはX509形式で、Base64で符号化したものをPEMというらしい。
PEM以外にも符号化の種類によって、DERとかあるみたい。

この2つのPEMを'hash format'のディレクトリに置くべく、
$ cp sakura-1.pem /path/to/certdir/
$ cp sakura-1.pem /path/to/certdir/
$ c_rehash /path/to/certdir/
とやった。

そのあと、
$ openssl s_client -host hostname.sakura.ne.jp -port 993 -verify 0 -CApath /path/to/certdir

Verify return code: 0 (ok)
となっている事を確認。

最後、wlからopensslを使うときの証明書ディレクトリを指定して完了。
(custom-set-variables
'(ssl-certificate-directory "/path/to/certdir/"))


2008/8/28 追記
証明書ディレクトリは
(custom-set-variables
'(ssl-certificate-directory "/path/to/certdir/"))

じゃなくて、
(setq ssl-certificate-directory "/path/to/certdir/")

って形で.wlにフルパスで定義した方が良さそう。

2008年3月31日月曜日

2物体の衝突

参考になりました。
http://homepage2.nifty.com/eman/dynamics/collision.html

内積とか外積とか

すっかり忘れてて、ショック!!
二次元座標上の二つのベクトル間の角度が求められなかったよ!!

2008年3月25日火曜日

jhatメモ

class HeapDump {
public static void main(String[] args) {
java.util.List l = new java.util.ArrayList();
for (int i = 0; ; ++i) {
l.add(i);
}
}
}


のような、OutOfMemoryErrorが発生するプログラムを実行。

$ java -XX:+HeapDumpOnOutOfMemoryError HeapDump
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid4888.hprof ...
Heap dump file created [84987937 bytes in 4.720 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.lang.Integer.valueOf(Integer.java:585)
at HeapDump.main(HeapDump.java:9)


ダンプファイルができているのを確認。

$ ls
HeapDump.class
HeapDump.java
java_pid4888.hprof


なお、
http://java.sun.com/javase/ja/6/docs/ja/technotes/tools/share/jhat.html
によれば、

Java のヒープダンプを生成するには、いくつかの方法があります。
* jmap の -dump オプションを使って実行時にヒープダンプを取得する。
* jconsole のオプションを使って HotSpotDiagnosticMXBean 経由で実行時にヒープダンプを取得する。
* -XX:+HeapDumpOnOutOfMemoryError VM オプションを指定すると、OutOfMemoryError のスロー時にヒープダンプが生成される。
* hprof を使用する。


という事らしい。

jhatの引数にダンプファイルを指定して起動すると、

$ jhat java_pid4888.hprof 
Reading from java_pid4888.hprof...
Dump file created Tue Mar 25 14:19:26 JST 2008
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Hashtable.rehash(Hashtable.java:356)
at java.util.Hashtable.put(Hashtable.java:412)
at com.sun.tools.hat.internal.model.Snapshot.addHeapObject(Snapshot.java:153)
at com.sun.tools.hat.internal.parser.HprofReader.readInstance(HprofReader.java:724)
at com.sun.tools.hat.internal.parser.HprofReader.readHeapDump(HprofReader.java:470)
at com.sun.tools.hat.internal.parser.HprofReader.read(HprofReader.java:222)
at com.sun.tools.hat.internal.parser.Reader.readFile(Reader.java:79)
at com.sun.tools.hat.Main.main(Main.java:143)


がーん。気を取り直して。

bash-3.2$ jhat -J-Xmx512m java_pid4888.hprof 
Reading from java_pid4888.hprof...
Dump file created Tue Mar 25 14:19:26 JST 2008
Snapshot read, resolving...
Resolving 3312656 objects...
Chasing references, expect 662 dots......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Eliminating duplicate references......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.


となった後、http://127.0.0.1:7000/ にアクセスして、Heap Histogramをみると、

Class Instance Count Total Size
class java.lang.Integer 3308797 13235188


となってて、Integerが怪しいね、って話になる。
References by Typeで辿ると、

Class Count
[Ljava.lang.Object; 3308667


ってのがあって、
Objectのでかい配列がIntegerの配列になってるんだ、って閃いて、
Collection系のインスタンスが怪しいね、って閃いて、
ArrayListじゃね?、と閃いて解決。
あってるよね?

2008年2月27日水曜日

ファイル共有

vistaで、どーしても、どーやっても、ファイル共有できなくて悩む。

共有にしたつもりのフォルダに、他のPCからアクセスできない。
ファイアウォール切ってもダメ。
ポート(445番)は開けてるけど、コネクション張れない。
445番宛てにコネクトしようとすると、リジェクトされる。
でも、netstatでみるとLISTENINGに、、、なぜ?

結局、ネットワーク接続のプロパティで「Microsoftネットワーク用ファイルとプリンタ共有」がオフだったので、チェック入れたらつながった。。。。

2008年2月24日日曜日

Bluetoothの接続

ペアリングはボンディング、ボンディングはペアリング
PINコードはパスキー、パスキーはPINコード

お互い同じにするのね

2008年2月11日月曜日

private 継承

それを実装手段とする (s-implemented-in-terms-of) 関係で使う。

でも、ほとんどの場合、コンポジション使えば済む。

prototypeはchainする

A = function() {}
A.prototype.myfunc = function() {
alert("A's myfunc")
}

B = function() {}
B.prototype = new A();
B.prototype.myfunc = function() {
alert("B's myfunc")
}

b1 = new B();
b1.myfunc = function() {
alert("b1's myfunc")
}
b1.myfunc(); // b1's myfunc

b2 = new B();
b2.myfunc(); // b2's myfunc not found -> B.prototype's myfunc

delete B.prototype.myfunc

b3 = new B();
b3.myfunc(); // b3's myfunc not found -> B.prototype's myfunc not found -> A.prototype's myfunc

2008年2月3日日曜日

typename

って複数の意味があったんだね。
http://www.fides.dti.ne.jp/~oka-t/cpplab-template-4.html


っていうか、typenameの存在知らなかったんだけどね。。。

2008年2月2日土曜日

UnicodeとUTF-8

Unicodeというのは、単に文字に付けたコードを指すだけで、そのコードがメモリ上やファイルにどう保存されるかは全く関与しない。
UTF-8というのは、そのコードのエンコードの種類の一つ。

例えば、ひらがなの「あ」。
Unicodeのコードは「U+3042」。
UTF-8でエンコードすると、「0xE38182」。

エンコードのルールは以下のようになってるみたい。

Char. number range | UTF-8 octet sequence
(hexadecimal) | (binary)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

http://www.ietf.org/rfc/rfc3629.txt

基本ができてないと駄目ね、基本が。

2008年1月26日土曜日

__attribute__((constructor))

ライブラリのコンストラクタ関数およびデストラクタ関数として使えるんだ。

structとclassの違い

デフォルトのアクセス指定子が違うだけ。
struct -> public
class -> private

http://www.bohyoh.com/CandCPP/FAQ/FAQ00117.html

2008年1月20日日曜日

コピーコンストラクタ

class Value {
private:
int value;
public:
Value(int value = 0) {
this->value = value;
}
Value(Value& value) {
this->value = value.value;
}
};

int main(int argc, char** argv) {
Value a = Value(1);
return 0;
}


このコードをコンパイルすると

$ g++ -Wall test.cpp
test.cpp: In function 'int main(int, char**)':
test.cpp:44: error: no matching function for call to 'Value::Value(Value)'
test.cpp:11: note: candidates are: Value::Value(Value&)
test.cpp:7: note: Value::Value(int)


って怒られる。

使ってるgccは以下。

$ g++ -Wall test.cpp
$ g++ -v
Using built-in specs.
Target: i686-apple-darwin8
Configured with: /private/var/tmp/gcc/gcc-5250.obj~20/src/configure --disable-checking -enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.0/ --with-gxx-include-dir=/include/c++/4.0.0 --build=powerpc-apple-darwin8 --with-arch=pentium-m --with-tune=prescott --program-prefix= --host=i686-apple-darwin8 --target=i686-apple-darwin8
Thread model: posix
gcc version 4.0.1 (Apple Computer, Inc. build 5250)


どうも、テンポラリオブジェクトがconstで作成されてるみたい。

 Value(const Value& value) {
this->value = value.value;
}


みたく、コピーコンストラクタの引数をonst referenceにすればOK、というか、そうすべきみたい。

代入演算子

をオーバーロードした場合、戻り値は参照にすべき。

そうしないと、以下のコードの(1),(2)のような式が成り立たなくなってしまう。

class Value {
private:
int value;
public:
Value(int value = 0) {
this->value = value;
}
int get() {
return value;
}
Value& operator=(Value& value) {
this->value = value.value;
return *this;
}
Value& operator+=(int value) {
this->value += value;
return *this;
}
};

int main(int argc, char** argv) {
Value a = 1;
Value b = 2;
Value c = 3;
Value d = 4;

c = b = a; // (1)
printf("c=%d,b=%d,a=%d\n", c.get(), b.get(), a.get());
(a = d) += 1; // (2)
printf("a=%d,d=%d\n", a.get(), d.get());

return 0;
}

2008年1月15日火曜日

画面遷移しないファイルアップロード

このページではファイルアップロードしても、画面遷移が発生してないんだけど、どうやってるのか分からなかったのでソース読んだ。
そしたら、submit時に非表示のiframe作って、そこをtargetにして、postしてた。
なるほどね。

2008年1月11日金曜日

window.onload Problem

The window.onload Problem - Solved!
によれば、

The problem is that the onload event fires after all page content has loaded (including images and other binary content). If your page includes lots of images then you may see a noticeable lag before the page becomes active. What we want is a way to determine when the DOM has fully loaded without waiting for all those pesky images to load also.

ってことで、ブラウザ毎の回避策が書いてある。

conditional compilation

http://msdn2.microsoft.com/en-us/library/121hztk3(vs.71).aspx

こんな事ができるのね、、、

if (1 /*@cc_on -1 @*/) alert("not ie");

実践 パケット解析

欲しい。。。
http://www.oreilly.co.jp/books/9784873113517/toc.html

7-9章のケーススタディが面白そう。

追記(2008/1/27)
立ち読みしたけど、期待した程ではなかった。だから買わないことにした。

2008年1月6日日曜日

関数属性の宣言

__attribute__((constructor)) みたいな、関数属性の宣言って知らなかった。

asmlinkage

http://kernelnewbies.org/FAQ/asmlinkage
「すべての引数がスタックで渡されることが保証される」ということかな?