2008年8月27日水曜日
fiberで添付ファイルを開く
Windows Vista で Meadow で Wanderlust 使ってて、これまでは添付ファイルは一旦ディスクに保存して開いていたけど、いい加減面倒になってきたので v (mime-preview-play-current-entity) で開けるようにした。
まず、~/.mailcapを作って以下のように記述
%s をシングルクォートでくくっているのは、ファイル名が日本語の時に、末尾に改行コードっぽいのが紛れ込んで認識できない事があったから。
シングルクォートでくくったら、なぜかOK。
cygwin のシェル経由で fiber を起動するので、文字コード/改行コードを明示的に指定。
そんで、何故だか FLIM の mime-format-mailcap-command がマルチバイト文字の前に'\'を追加するので、.wl に以下を追加して除去。
これで開けるようになった。
まず、~/.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
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/
すっかり忘れていたから、復習した。
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/
すっかり忘れていたから、復習した。
2008年6月4日水曜日
2008年5月29日木曜日
2008年5月26日月曜日
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使うか。
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に、
SSLのネゴシエーションのパケットをWiresharkでキャプチャしたら、
保存した二つの証明書を、opensslコマンドでBase64エンコード
sakura-*.pemの最初と最後に
-----BEGIN CERTIFICATE-----
と
-----END CERTIFICATE-----
を追加した。
ちなみに、この証明書のフォーマットはX509形式で、Base64で符号化したものをPEMというらしい。
PEM以外にも符号化の種類によって、DERとかあるみたい。
この2つのPEMを'hash format'のディレクトリに置くべく、
そのあと、
最後、wlからopensslを使うときの証明書ディレクトリを指定して完了。
2008/8/28 追記
証明書ディレクトリは
じゃなくて、
って形で.wlにフルパスで定義した方が良さそう。
これまでは、.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日月曜日
2008年3月25日火曜日
jhatメモ
class HeapDump {
public static void main(String[] args) {
java.util.Listl = 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日水曜日
2008年2月24日日曜日
2008年2月11日月曜日
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日日曜日
2008年2月2日土曜日
UnicodeとUTF-8
Unicodeというのは、単に文字に付けたコードを指すだけで、そのコードがメモリ上やファイルにどう保存されるかは全く関与しない。
UTF-8というのは、そのコードのエンコードの種類の一つ。
例えば、ひらがなの「あ」。
Unicodeのコードは「U+3042」。
UTF-8でエンコードすると、「0xE38182」。
エンコードのルールは以下のようになってるみたい。
http://www.ietf.org/rfc/rfc3629.txt
基本ができてないと駄目ね、基本が。
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日土曜日
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)のような式が成り立たなくなってしまう。
そうしないと、以下のコードの(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日火曜日
画面遷移しないファイルアップロード
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");
登録:
投稿 (Atom)