PHPのカレンダー関数のメモ。unixtojdでunixのタイムスタンプ(Epochからの秒数)からユリウス通日(Julian Day)に変換、それをcal_from_jdでいろんな暦の日付に変換する。今主に使われているのはグレゴリオ暦だから、CAL_GREGORIANを指定するとよい。 日本の元号には対応していない。曜日や月の名前も英語がベース。インタフェース的にも足りてないね。太陰暦にも対応してないっぽい。…使えん。暦の形式はarrayで、例えば今日は以下の通り。…そっか今日金曜日か。 Array ( [date] => 10/3/2003 [month] => 10 [day] => 3 [year] => 2003 [dow] => 5 [abbrevdayname] => Fri [dayname] => Friday [abbrevmonth] => Oct [monthname] => October ) ちなみにJulian DateはBC4713の元旦の正午(!)を0として数えた日数。今は2452916。
Category: プログラミング
英ソフォス、スパム対策のActiveState社を買収(sophos.co.jp)だって。
法人向けウイルス対策大手のソフォス(本社:神奈川県横浜市、代表取締役社長:アラン・ブロデリック)は本日、法人向けスパム対策ソフトやオープンソース言語プログラマ用のプロフェッショナルツールを開発しているカナダのソフトウェア会社、 ActiveSate社を買収したことを発表しました。
ActiveStateってWindows向けのPerlとかPythonとか作ってたとこだ。Python.jp(python.jp)より。
Pythonプログラムのプロファイルをとる方法。
# python /usr/lib/python2.x/profile.py your-file.py
あるいは、対話型インタプリタから、
import profile profile.run('your_function()') profile.run('your_function()', "your_file")
詳しくはマニュアルを参照。hotshotというCで書かれたプロファイル用モジュールもあるらしい。こいつがprofileの後継となる模様。
Python 2.3.1(python.org)がリリースされていた。おめでとう。で、入れてみた。
We are pleased to announce the release of Python 2.3.1 on September 23, 2003. This is a bug-fix release for Python 2.3 and supersedes the original Python 2.3 release.
What’s newで知らない機能を知ってみた。csvモジュールがあったり、*.zipの中のファイルをimportできたり、loggingモジュールがあったり。最近はずいぶんJavaの影響を受けてるのかな。
Pythonの文字列の連結は「+」だった!! …驚いている自分が辛い。今まで、"".join([“a”,“b”])を使っていたのはヒミツにしといたほうが信用を失わずに済むかもしれない。
>>> "a"+"b" 'ab' >>> 1+"b" Traceback (most recent call last): File "", line 1, in ? TypeError: unsupported operand types for +: 'int' and 'str' >>> str(1)+"b" '1b' >>> repr(1)+"b" '1b' >>> `1`+"b" '1b' >>> `1+10`+"b" '11b' >>>
(追記) 2003-09-17 10:31 掛け算もできるんだ…ふーん。
pickleモジュールかcPickleモジュールを使う。機能はほぼ同じ。 import pickle
##
serialize
f=open(“test.pickle”, “w”) p=pickle.Pickler(f) p.dump(your_object) f.close()
##
deserialize
f=open(“test.pickle”, “r”) p=pickle.Unpickler(f) your_object2=p.load() f.close()
##
your_object = your_object2 になっている
StringIOを使えばファイルではなく文字列にserializeできる。
printfに「%+d」がない。正整数に符号をつけたい場合はどうすればいいのか。まさか、
$fp=popen("/usr/bin/printf %+d {$n}", "r"); $rst=fgets($fp, 1024); pclose($fp);
で$rstに入るからそれ使ってね! なんてことはないよねぇ。 strip_tags()でタグを除去することができる。除去しないタグも指定できる。しかし属性は指定できない。つまりタグのhref以外の属性を除去するとか、そんなことはできない。
D(digitalmars.com)というプログラミング言語がやたらに流行りつつある。OpenD(opend.org)なんてのもある。組織的にはどうなのかよくわからないが、Linux版もあることだし、dmdとdliの.specを作ってインストールしてみた。うーん、/etc/dmd.confが読み込まれている気がしない。 日本語ではD Memo(kmonos.net)を読むとよいだろうと思う、たぶん。D言語研究(aaacafe.ne.jp)というWikiもある。マニュアルの日本語訳(kmonos.net)も。 とりあえずtime.dの中にgettimeofdayがなくて秒単位でしか計測できない。linux.dの中にgettimeofdayがあった。これでまともに計測できることが判明した。コンパイル速度も、機能や記述力も悪くない。速度的には…これから計測しなければ。
名著「プログラミング言語C」の解説(kyutech.ac.jp)の前口上について。ある意味Cの生きる道を示しているかもしれない。Cは動作が分かってないと書けない、あるいは動作がわかってない人は書かないほうがいい。 書く側としてはもうちょっと縛りをかけたり、高級な機能をつけたりして欲しいのだが、低レベル教育用としてはいいかもしれない。低レベルとは言え、プログラミング技術に共通の要素もそれなりに含まれているし。ただリスクも大きくて、Cで教育に失敗すると…(略)
プログラミング言語は日夜、改良が加えられている。コンピュータの歴史は浅く、現在利用できるすべての言語は人間の思考活動をその上に展開するにはまだまだ不十分である。改良を加えたつもりがじつは改悪となることもある。 C をベースに C++ や Java など、新しい言語が開発されているが、それでも、C を知る必要はあると思う。プログラムがコンピュータ上でどう実行されるのかの具体的なイメージを持って、あるいは、Java にはなぜポインタや構 造体がないのかを理解した上で、プログラムできたほうがエレガントなコードが書けるのではないか。 C を改良したとされる Java であっても通過点の言語である。過去の歴史に目をくれず、軽薄な宣伝文句につられ、自分で判断することを放棄して Java するとしたらそのうち必ず取り残される。C++ がいかに汚い言語であるかも理解できないだろう。 C を扱う以上、ポインタやアドレスをきちんと説明しないのは「角をためて牛を殺す」と同じである。計算機の内部状態をしっかり頭に浮かべながらプログラムを書いたり読んだりすることが C のプログラミングでは肝要と思う。
いま(このサイトじゃないけど)PHP-4.2.2とcurl-7.10.4を使っているが、以下のようにしてもIf-Modified-Sinceヘッダもつかないし、戻ってくるLast-Modifiedヘッダを処理してくれない。なぜか。よくわからん。$mtimeに数字を入れておけばHTTPのIf-Modified-Sinceが送られ、$modifにLast-Modifiedの文字列をパースした値が入るのではないのか!?
$tmpfile=tmpfile(); $c=curl_init(); curl_setopt($c, CURLOPT_URL, $url); curl_setopt($c, CURLOPT_FILE, $tmpfile); curl_setopt($c, CURLOPT_HEADER, 0); if($mtime){ curl_setopt($c, CURLOPT_TIMECONDITION, TIMECOND_IFMODSINCE); curl_setopt($c, CURLOPT_TIMEVALUE, $mtime); } $r=curl_exec($c); $rcode=curl_getinfo($c, CURLINFO_HTTP_CODE); $modif=curl_getinfo($c, CURLINFO_FILETIME); $size=curl_getinfo($c, CURLINFO_SIZE_DOWNLOAD); curl_close($c); fclose($tmpfile);
Cで書くとうまくいくなぁ。
#include#include int main(int argc, char **argv) { CURL *c=curl_easy_init(); curl_easy_setopt(c, CURLOPT_URL, "http://localhost:9999/"); curl_easy_setopt(c, CURLOPT_HEADER, 0); curl_easy_setopt(c, CURLOPT_TIMECONDITION, TIMECOND_IFMODSINCE); curl_easy_setopt(c, CURLOPT_TIMEVALUE, 1061276136); curl_easy_perform(c); curl_easy_cleanup(c); return 0; }
結果は以下の通り。ちゃんとIf-Modified-Sinceヘッダがついているのがわかる。
# socket -s 9999 GET / HTTP/1.1 Host: localhost:9999 Pragma: no-cache Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */* If-Modified-Since: Tue, 19 Aug 2003 06:55:36 GMT
(追記) 2003-09-29 15:05 Pythonでもうまくいった。…PHPのソースを見たら、TIMECOND_IFMODSINCEが定義されていなかった。ヘッダを見ると値が1だったので、