2009-01-01から1年間の記事一覧

goroutine は OS thread も使う

goroutine は GOMAXPROCS >= 2 の場合は OS の thread も使って動くので、 そもそもgoroutineはスレッドじゃない。 そう、goroutineはスレッドじゃない。Big Sky :: 非同期UI この部分はちょっと誤解を招くかもなあと思いました。実際に複数の goroutine か…

JPerl Advent Calendar 2009 Hacker track 17日目

Casual track に引き続いて、 Hacker track の 17日目も書きました。Sub::Pipe で UNIX pipe みたいな関数適用をする

JPerl Advent Calendar 2009 14日目

JPerl Advent Calendar 2009 casual track の 14日目を書かせていただきました。 こちらからどうぞ パスワード保存のお供に Crypt::SaltedHash

Linux でファイル名の大文字小文字を同一視する

かつて Windows server で動いていたらしい、とあるコンテンツを Linux + Apache の環境に載せてくれないか、というお話をいただきまして。何のことはない、静的コンテンツなのでファイル置くだけだろうと思ったら、なんと URL の大文字小文字が同一視される…

GOMAXPROCS でマルチコアCPUを有効に使う

via #golang でマルチコアをつかいきれた人っているの? http://twitter.com/tokuhirom/status/6229784117 # 何か、以下のような意味じゃない気もするんだけどとりあえずお互いに無関係な (フィボナッチ数を求める) goroutine を 3つ走らせて、それに対して環…

Go と Perl で sha1sum(md5sum) コマンドっぽい機能を実装した場合のソースコード比較

同じ機能を両方で書いてみたらどんな感じになるかなと。 起動されたコマンド名から SHA1 or MD5 を求めるように切り替わる コマンドライン引数があれば引数のファイルについて、なければ標準入力からの入力について SHA1(MD5) hash を求めて表示 こんな仕様…

TCPのテスト用に空いているポートを探す

perl でいうと、Test::TCP::empty_port() が欲しかったのでちょっと書く。 import ( "net"; "fmt"; ) func empty_port() int { for port := 10000; port < 20000; port++ { addr := fmt.Sprintf("localhost:%d", port); l, err := net.Listen("tcp", addr); …

100行ぐらいで分散しないKVSを実装する(Go)

54行で分散KVSを実装する(レプリケーション機能付き)をみて、Go でとりあえず分散もレプリケーションもしないのを書いた。といっても rpc ライブラリは付いてきているので、それを使うだけ。http://golang.org/pkg/rpc/ サーバ側の保存は map[string] stri…

GMP wrapper を使って pidigits を書き直す

Go

このあたり でベンチマークの結果が python に負けてるのもあってがっかり、みたいな話題に対して、id:tokuhirom さんが「チートぎみなのもあるからソースをよく読んで判断せよ」という話。http://d.hatena.ne.jp/tokuhirom/20091124/1259029688探してみたら…

Coro と Go で並列実行数の制御

http://d.hatena.ne.jp/tokuhirom/20090710/1247196134 この Coro の例を Go でやってみます。まず特定数 (ここでは 3) の worker thread を立ち上げておいて、そこにメッセージを送って仕事させるモデル。メッセージのやりとりに Coro::Channel を使います…

Go でテンプレートエンジン (json template)

http://d.hatena.ne.jp/tokuhirom/20091117/1258418742 をみて。 Go に付いてくるテンプレートエンジンは json-template て奴でした。 記法は リファレンス にありますが、テストケース を眺めると雰囲気がつかみやすいかも。こんなコードを書いて package m…

Go をちょっと試すのに便利な wrapper 二題

8g とか 6l とかのコマンドが (分かりにくい|打ちづらい) ということに定評のある Go ですが、パッケージを作るような場合は Makefile をこんな風に書くと make 一発でことが済むので簡単です。via http://blog.yappo.jp/yappo/archives/000697.htmlでもちょ…

Go で http アプリケーションサーバ

デフォルトで付いてくるパッケージで、httpd (アプリケーション) が簡単に作れます。import . "http" とすると、http. の前置なしで http パッケージの関数が使えるので、見た目も結構すっきり。 HandlerFunc(func(c *Conn, req *Request) { が繰り返される…

Go で duck typing

string を返す String() を実装した型のオブジェクト foo があったとして、 fmt.Printf("%s", foo); とすると foo.String() を評価してくれる。これが duck typing ってやつですね。特に何も宣言しないでも、とにかく String() が実装されていれば ok。inter…

Go で goroutine

go で関数の実行を並列化できる(非同期化が正しい?)。結果は channel というものを使って取り扱うのかな。このあたりは Erlang ぽい? あまり意味のない例だけど、sleep を並列にするとこんなかんじ。 [Wed Nov 11 20:29:29 2009] sleep 1 seconds [Wed Nov 1…

Go で fizz buzz

とりいそぎ FizzBuzz ってみる。 The Go Programming Language package main import "fmt" func main() { for i := 1; i <= 100; i++ { switch { case i % 15 == 0 : fmt.Printf("fizz buzz\n"); case i % 3 == 0 : fmt.Printf("fizz\n"); case i % 5 == 0 :…

mod_psgi をインストールしてみた

【注意】2009年10月16日現在の情報です。 【追記】 初出時にあった configure.ac, Makefile の問題は修正されたため、記事内容も修正しました。mod_psgi を試してみたのでメモしておきます。 Ubuntu 9.04 x86_64 Apache/2.2.11 (Ubuntu) Perl v5.10.0 built …

PostgreSQL でランダムに 1行選択する方法

対象は feed の entry を本文込みで保存した 100万行ほどのテーブル。PostgreSQL 8.3.7 on x86_64-pc-linux-gnu.まずは単純な方法。 SELECT * FROM entry ORDER BY random() LIMIT 1; 直感的 シンプル しかしシーケンシャルスキャンが起きる $ EXPLAIN ANALY…

YAPC::Asia 2009 で Lightning Talk をしてきました

「Perl で Salesforce」という題で発表させて頂きました。 かなり詰め込んだので駆け足になってしまった感がありますが、スライドは http://labs.topicmaker.com/~fujiwara/yapc2009/ に置いておきます。カーソルキーの左右で捲れます。(今見たら Safari / C…

携帯 Googlebot の IP アドレス帯域追加?

Google のモバイル クロールでコンテンツがクロールされるようにするにはどうすればよいですか によると携帯向け Googlebot の IP アドレス帯域は 72.14.199.0/25 (72.14.199.0 - 72.14.199.127) 209.85.238.0/25 (209.85.238.0 - 209.85.238.127) だそうな…

Catalyst debug log 有効で大きなデータを POST したら予想外にメモリ使って驚いた

タイトルがすべてですよ。 Debug mode ではログに query param が出力されるので、(ファイルアップロードじゃなく) 大きなデータを渡すと、一旦全部文字列にしてメモリに持つため予想以上にメモリを食って「どこでこんな使ってるんだ?」と悩んだお話。 1MB …

ある日 XML::Simple がいきなりこけて泣かないために

ちゃんと PREFERRED_PARSER を指定すること。 $XML::Simple::PREFERRED_PARSER = 'XML::Parser'; なにかこう、2005年ぐらいにみた感じの話題で恐縮なのですが。XML::SAX をインストールしたら、いきなり XML::Simple を使ってたコードが Cannot decode strin…

PostgreSQL の dump をテーブルごとに分割する pg_dump_splitter.pl

pg_dump で (-t オプションなしで) 出力したファイルは、すべてのテーブルのデータが一緒になっているわけです。 が、バックアップが必要な時って「データベース全体を復旧したい」だけではなくて、「このテーブルのデータ間違って消しちゃった(updateしちゃ…

HTTP::Engine::MinimalCGI で upload の挙動を他の interface と合わせる

MinimalCGI だと $request->upload が CGI::Simple->upload の wrapper になっているので、他の interface みたいに HTTP::Engine::Request::Upload オブジェクトを返すようにしたかった。 まったく同じにはできなかったけど。 同じ name の input (type=fil…

Data::Model PostgreSQL 対応作業中

http://github.com/fujiwara/p5-Data-Model/tree/masterData::Model を PostgreSQL でも使いたいので対応作業をやってみたら、テストまわりでいくつか困ったことが。 テーブル名 user は PostgreSQL では予約語のため、quote しないと使えない quote すれば…

Data::YUID::Generator を 32bit マシンでも使えるように

Data::YUID::Generator が 32bit でも動くように Math::BigInt 使ってみた。ベンチマーク。new() が遅い。 # new->get_id Rate bigint original bigint 2635/s -- -95% original 51945/s 1872% -- # get_id Rate bigint original bigint 79591/s -- -70% ori…

Sub::Filter を書いたら Sub::Pipe ができていた

何を言っているのか分からねーと思うが(ry Sub::Filter http://github.com/fujiwara/Sub-Filter/tree/master これを作って、さて CPAN に up しようかと思ったら dan さんが perl - id:sfujiwaraのFilter.pmをSub::Pipeに http://blog.livedoor.jp/dankogai/…

演算子 | を overload して TT のフィルタみたいな記法を実装する

TT (Template-Toolkit) で値にフィルタを掛ける時に [% value | replace('x','y') | uri | html %]みたいに書きますが、Text::MicroTemplate だと仮に replace(), uri() という関数を用意しても こんな感じ。なんか読みにくい気がする。(まあ PHP だってそう…

「このままのスピードで」をリリースしました

最初に X あったものが 1年後に Y になるとしたらこの先どうなるか、が分かるウェブサービス このままのスピードで をリリースしました。インスパイア元はご存知のこちらです。 このままのスピードでエグザイルが増えていけば2040年に地球は滅亡する。 h…

Queue::Q4Pg::Lite を書いた

PostgreSQL で簡易に MQ - Mi manca qualche giovedi`? を読んで、こりゃ素晴らしいと思ったので Perl モジュール化しました。 simple message queue using PostgreSQL. http://github.com/fujiwara/perl-queue-q4pg-lite/tree/master 割と簡易な Message Qu…