2005年11月アーカイブ

planet::dojo - Blog Archive - Cross-Domain XMLHTTP

Abe Fettig, my co-worker and developer of the uber-useful JotLive, had just published a description of how to get XMLHTTP working across sub-domains. This isn’t fully cross-domain Ajax, but will certainly ease deployment issues for many developers.

Today's "hack" is tomorrow's "standard".

javascriptのライブラリ(toolkit)の1つであるdojoのブログを引用したものですが、この最後の1文がなんかカッチョえぇ。

確かに最近のネット界隈は「今日のハックが明日のスタンダード」になっていくのを感じます。やったもの勝ち的なところもあれど、それが認められさえすればスタンダードになっていきます。これがWeb2.0的なのか!(←言いたいだけ)。

でもそんなのは最近始まったものではなく、技術というのは昔からその繰り返し。だれかがハックしたらそれをみんなでわーっていじってあきたら次、みたいな。そしてそのあきた時点でその技術がスタンダードになってる(ならない場合も多々あるが…)。ただ最近違うのは、ブログがあり、RSSやAtomがあり、ブックマークなどがあるので情報の伝達速度が以前より早く、自分が興味のあるコミュニティの向っている方向っていうのが見え易いために、そのハック祭に参加する敷居が下り、参加する人が多くなっているんじゃないかと思う今日この頃。もちろんそれには読む、聞く、ハックするという意味での能動的な行動(情報収集なども含め)が必要なのですが。これもWeb2.0的なのか!(←言いたいだけ)。


なにが言いたいかっていうと、最初に書いた1文がなんかいいなと思ったしだいです、はい。

あるときネットワーク越しにいろいろなことやりたくて、shellのコマンド調べていて覚えたことを覚え書き的に記しておきます。
下記はコマンドラインから、ネットワーク越しにその場で書いた内容のファイルを作る方法です。

% cat <<EOT | ssh $SERVER "cat > /path/to/file"
content
content
content
content
EOT

これの応用で、パッチを複数サーバであてたいときは、

% cat <<EOT | ssh $SERVER "cat > /path/to/patch"
--- /path/to/orig   2005-11-29 13:45:42.129125170 +0900
+++ /path/to/new   2005-11-29 13:46:27.540536045 +0900
@@ -1,3 +1,3 @@
 aaa
-bbb
+ddd
 ccc
EOT
% ssh $SERVER "patch < /path/to/patch"

とか、もっとやるとファイルなぞ作らなくても直接patchをあてちゃったりできる。

% cat <<EOT | ssh $SERVER patch
--- /path/to/orig   2005-11-29 13:45:42.129125170 +0900
+++ /path/to/new   2005-11-29 13:46:27.540536045 +0900
@@ -1,3 +1,3 @@
 aaa
-bbb
+ddd
 ccc
EOT

こんな感じです。知ってる人には常識中の常識なのかもしれませんが…。

あと自分は複数サーバで同時にあるコマンドを実行したいときは下記のようにコマンドラインでやっちまいます。
Borne Shellでは

% for x in 192.168.0.1 192.168.0.2 192.168.0.3; do command; done

tcshだったら

% foreach x (192.168.0.1 192.168.0.2 192.168.0.3)
foreach?command
foreach?end

みたいな感じで。サーバのIPはserver_list.txtとかに1サーバ1行で書いてcatする方法でもいけます。

んで疑問なのは、tcshでborne shellみたいにコマンドラインで1行でone-linerが書けないのかということなんですが、調べてみたんですがどうもできなそうなんですよね…。教えてエラい人!(注:NDOメソッド)

23 Photo Sharing: Introducing 23

23 makes it easy to share your digital photos.

flickrみたいなサービスが出来たみたいです。今のところ無料アカウントだと1ヶ月15MBまでの転送制限がりますが、29ユーロ払うと転送量が無制限のアカウントが貰えるらしいです。

ブログもあるみたい→23hq blog

最近flickrが日本からのアクセスだと遅い(※1)から、他も使ってみたいからちょっと使ってみようかと思ったりしないでもない。

とおもったら今はサーバが足りないっぽくて重い。。。ブログを見るとサーバ届いてるけど、HDDがまだ届かないとか…(笑)
ベンチャーっぽくて面白い。

※1 宮川さんがアメリカだと激っぱやとか言ってたけど

fluxiom - capture, manage, access and deliver content across your enterprise

capture, manage, access and deliver content across your enterprise

mir.aculo.usのサイトの人が作ってる(?)っぽい「fluxiom」というサービスの紹介ムービーをオープン予定のところで見ることができます。このムービーが、なんていうか、まるでどっかのアーティストのCMみたいにカッコイイw。Appleテイストな感じも受けますが。

なんかオープン前のサイトのCMをムービーで紹介ってなんか新しい。今後はこんな感じのプロモーションとかも増えてくんですかねぇ。
思わずオープンお知らせメールの登録をしてしまった…orz

del.icio.usの登録する画面等のIFが微妙に変ってますね。noteのフォームがtextareaになってるのと、補完のための単語がハイライトするようになってますね。その他にもいくつか変ってるとこありますね。

del.icio.usはちょこちょこいろんなとこが変ってるような気がするな~。

del.icio.us/blogには別になにも書かれてないですね。。。

ひさびさにMac OS Xネタでも。

最近はめっきり踏み台サーバ化しているオフィスに置いてあるMac OS Xですが、ひさかたぶりにアカウント管理なぞをいじる必要があり、環境からそれを呼び出そうとしました。だが何度やってもその画面が開かない…。なんじゃこりゃと思ってConsoleを見たら

*** -[NSCFString replaceCharactersInRange:withString:]: nil argument

なんていうエラーが…。なんじゃこりゃと思ってググってみたら下記のページを発見。

tancred.com: Malte Tancred's Weblog: Archives: 2004-04-06

I seldom mess around in the Accounts Preference Pane but yesterday I had reason to do so, only to rediscover a long time problem I've had with this preference pane. For some reason an exception was thrown when the pane was activated, making it almost unusable. According to console.log the exception was raised because a nil string (or other) argument was passed to NSCFString's -replaceCharactersInRange:withString:. The whole thing was driving me mad.

どうやら、今までに作成したアカウントの中にrealnameプロパティが設定されてないアカウントがあるとエラーになって、アカウント管理が開けなくなるというのがわかったので、下記のone-linerで設定されてないアカウントをチェック。nidumpとかniutilとか久々に使ったみた。

for i in `niutil -list / /users | cut -d' ' -f2`; do REALNAME=`niutil -readprop / /users/${i} realname 2>&1`; echo $i $REALNAME; done
#とりあえず全部のアカウントを出力するようにしてますが、別に必要ないか…。

そんで設定していないアカウントはエラーがでてると思うので、そのアカウントのrealnameを下記のように設定しました。
自分はqmail用のアカウントをコマンドラインで作成したのでrealnameが設定されていなかったようです…。

for i in qmaild qmails qmailr qmaill alias qmailq qmailp; do echo $i; sudo niutil -createprop / /users/${i} realname ${i}; done

これでアカウント管理が開くようになりまた。めでたしめでたし。

Catalystには、Catalyst::Helper::Model::CDBIというデータクラスを自動生成するためのヘルバーモジュールがデフォルトで付いてきます。これを使って作成されるデータクラス(例えばMyApp::M::CDBI)の親クラスはCatalyst::Model::CDBIとなっていて、その上の親クラスはCatalyst::BaseとClass::DBIとなっています。図にすると下記のような感じ

Catalyst::Base, Class::DBI
  ↑
Catalyst::Model::CDBI
  ↑
MyApp::M::CDBI

あるとき僕はこのデータクラスをコマンドラインで実行するスクリプトから読み込んで使おうとしたときに困ってしまいました。なぜなら、CatalystはWebで使うのを前提に設計されていて、コマンドラインからの実装は想定されていないさそうだからです。

生成されたMyApp::M::CDBIに下記のようなコードを付け加えて、その下にあるスクリプトのようにやればCatalyst関係のモジュールを使用しないで読み込めるので、むりくり実行させられなくもないのですが。。。

sub new_from_command {
    my $class = shift;
    my $self = bless $class->_config, $class;
    $self->{namespace}               ||= ref $self;
    $self->{additional_base_classes} ||= ();
    push @{ $self->{additional_base_classes} }, ref $self;
    eval { $self->loader( Class::DBI::Loader->new(%$self) ) };
    for my $class ( $self->loader->classes ) {
        $class->autoupdate(1);
        no strict 'refs';
        *{"$class\::new"} = sub { bless {%$self}, $class };
    }

    return $self;
}

my $cdbi = MyApp::M::CDBI->new_from_command;
my $film = $cdbi->loader->find_class('film');
my @rec = $film->search(foo => 'bar');


この解決法として1つ思いついたのは、データクラスの親クラスからCatalyst::Baseを除くということです。これでCatalystとの依存がなくなるしすっきりだ!とか思ったのですが、でもそれだとデータクラスを使うときには毎回useが必要になってくるし、(←これは間違いで、useしなくていいのはCatalyst::Baseが親クラスだからではなく、Module::Pluggable::Fastを使っているからですね。※1)いろいろめんどくさいっちゃめんどくさいし、Catalyst的にどうなんだろう?と悩んでいるところです。
他のCatalystユーザは、データクラスをコマンドラインから使ったりしないのだろうか…。たぶんそんな使い方している人はあまりいないんだろうなぁ…。

そんなことを考えてるときに、ふとこんなモジュールはどうだろうと思って、Catalyst-Helper-Model-CDBI-AnyDBD-0.01.tar.gzというモジュールを作ってみました。これは上で書いたことを解決するためのモジュールではないのですが…。自分はClass::DBI::mysqlなどのモジュールを使うのに慣れているせいか、Class::DBI::Loader使うのはなんかなぁと思ったのでこのモジュールを作ってみました。

これはClass::DBI::Loaderを使わずに、Class::DBI::mysqlやClass::DBI::Pgなどを使用するデータクラスを生成するためのヘルパーです。生成されるデータクラスの構造は下記のようになります。

package MyApp::M::CDBI;

use base qw(Class::DBI::mysql Catalyst::Base);
__PACKAGE__->connect('dbi:mysql:db', 'user', 'password');

package MyApp::M::CDBI::Film;

use base qw(MyApp::M::CDBI);

__PACKAGE__->set_up_table('film');

でも結局Catalyst::Baseが親クラスなんですけどね…。


2005-11-15 03:24追記:
※1で書いたんですが、MyApp::M::CDBIは必ずしも親クラスがCatalyst::Baseではなくてもよいようです。Catalyst::Baseを親クラスにする必要があるとしたら、config()、process()などのクラスメソッドを使う時か、controllerから$c->forward()などで呼び出したい時かなぁと思います。自分はあまりそのようなことを行なわないのですが、そのようなニーズってあるのでしょうか。あまり多そうでなければ、上で書いたモジュールで生成されるMyApp::M::CDBIの親クラスからCatalyst::Baseをはずしたものを作成して、CatalystのMLに投げてみようかと思います。
Engadget Japanese

AppleInsiderに、1月のMacworldで発表になると見られている(期待されている)インテルマックの新情報。Macworldでは17インチと20インチモデルが発表(発売)され、その後2月には今より20%から25%薄くiSight内蔵の15インチPowerBookが発売されるとしている。

Engadget Japan経由AppleInsiderの情報では、来年の1月にIntelの入ったマックが発売されるのではという情報を伝えています。
ついに発売になるのでしょうか。意外と早かったな、という印象ですが問題はPowerPCよりも早く、発熱を抑えたものになっているかどうかが気になるなぁ。。。

そっこうで買いってしまいそうな悪寒…。

趣味的にっきさん「Emacsでファイルを新規作成するときにテンプレートを挿入したい」というエントリでファイル作成時に任意のファイルを挿入する方法が書かれていますが、自分は下記のように対話形式でその時々で入れたいものを入れられるようにしています。
これの利点はプライベートと仕事でメールアドレスやコピーライトが違ったりするときにその場でテンプレートの各部分を変更して挿入できる点だと思います。

例としてPerlの.pm、.pl、.cgiという拡張子のファイルを作成する際のコードを下記に書いておきます。このコードの各部分を適当に編集すればそのまま使えるはずです。

これを.emacsに設定しておけば、ファイルを作成する際に「Your e-mail: 」「Copyright: 」というのプロンプトがミニバッファーに出て入力待ちになるので、そこで入力したものがテンプレートに挿入されます。なにも入力をしないでリターンをすればデフォルトで設定されているものが挿入されるので、デフォルトのものはよく使うメールアドレスとコピーライトを設定しておけばよいでしょう。

elispは得意ではないので、もっと効率よい方法もあると思いますので、その辺は適宜変更して下さい。

;; auto-insert
(require 'autoinsert)
(add-hook 'find-file-not-found-hooks 'auto-insert)
(add-hook 'find-file-hooks 'auto-insert)
(setq auto-insert-alist
      (append
       '(
         (("\\.pm$" . "Perl Module Header")
          "Your e-mail: "
          "package " _ ";
# $Id$
#
# Your Name <" str | (setq insert "foo@example.com") ">
# " (read-string "Copyright: ") | (setq insert "Example Co.,Ltd.") "
#

use strict;

1;")
         (("\\.pl$" . "Perl Script Header")
          "Your e-mail: "
          "#!/usr/local/bin/perl
# $Id$
#
# Your Name <" str | (setq insert "foo@example.com") ">
# " (read-string "Copyright: ") | (setq insert "Example Co.,Ltd.") "
#

use strict;
" _ )
         (("\\.cgi$" . "CGI Script Header")
          "Your e-mail: "
          "#!/usr/local/bin/perl
# $Id$
#
# Your Name <" str | (setq insert "foo@example.com") ">
# " (read-string "Copyright: ") | (setq insert "Example Co.,Ltd.") "
#

use strict;
" _ ))
       auto-insert-alist))
Ajaxian: File uploads with live progress bar in a simple perl script

Encodable Industries has released a nice, simple Ajax upload component with a live progress bar. Its a single perl script that can be dropped into any web server with CGI support.

ファイルアップロード時にプログレスバーで進行状況をリアルタイムに表示するcgiのソースがあります。

でもソースにHTMLやらjsやらがいりみだれて見辛いことこの上なす…。ちょとぐったりした(笑)。
今はちょっと見る時間がないのであとで見てみようかなと思います。

Search Result for Sledge::Plugin::*

Sledge本体がないのにSledge::PluginがCPANにアップされてた!これをきっかけに本体ないので上げられないよねぇ的な雰囲気が払拭されてどんどんプラグインが上っていくと面白いかもな。
自分もなにか上げてみようかと思ってみたり。

出遅れ感がさらに満載なんですが(笑)、結城さんがTropyというのを作っていて、いろいろとクローンが出来ているのでSledgeでも作ってみようかと思い作ってみました。最低限の機能しかありません。

Sleropy

これがんばれば10分でできると思うんですけどcssとかいじりだすともっとかかるね。。。やっぱSledge2.0はもっともっと楽に開発(←これ大事w)できるように設計が必要ではないかと実感。

今は表示時にはSQLでORDER BY RAND()をしているため、あきらかに高アクセス時には耐えられない設計となっています(笑)。高アクセスに耐えられるようにするとしたら、このくらいのデータであればはなからDBを使わないでデータを全部memcachedに入れるとか、もしくはDBを使うとしたらidを数字にして(今は32桁の英数字)、last_insert_id()から最後のidを取ってきて、1~最後のidの中でロジック的にランダムで数字を選択してそれをselectして出力とか、もしくはランダムと見せ掛けてid順に出すとか(オイですかねぇ。。。

他にあったら教えて欲しぃー。

Sledge ドキュメント - にぽたん研究所

ってことで、Shibuya.pm から発生した、にわか Catalyst マンセームードに反抗すべく、Sledge ドキュメントを書いてみるであります。

にぽたんさんがSledgeのドキュメントを公開してるー!!カッコイイ!!

一番笑え^H^Hカッコイイのは、「10分で作るSledgeアプリケーション」ですね。

あと、やっぱこれ見てるとValidator、Data、Authorizerクラス用のHelperがあってもいいかなと。作ってせきむらさんの作られたSledge::Helperにpatchでもおくろうかしら。

先日bkbsfilterのネタを書きましたが、その時にインストールしたBecky!上でRubyを動かす、Beckrb用のスクリプトを書いてみました。Rubyでまともにプログラムするのは初めてなので、これでいいんかいな的な感じで作ってるので変なとこあったらコメント下さい。

作成したのは表題の通り、「このフォルダ以下のメールを既読にする」スクリプトです。選択されているフォルダ以下にあるすべてのメールを既読にしてくれます。また下の階層にフォルダがあれば、その中も再帰的に見るようになっています。 これをmark_as_read.rbとか(まぁファイル名はなんでもいいけど)で保存して、スクリプトの割当てで右クリックメニューに出すようにしておくと便利。でもそんなしょっちゅう必要になる機能ではないかもね...。

require "nkf"

def mark_as_read folder
	# set current folder
	Becky.set_current_folder(folder.folder_id)
	
	Becky.each_mail { |mail, sel|
		begin
			if (mail.status & Becky::MESSAGE_READ) == 0 # mark if unread
				if /^subject\:(.*)$/i =~ mail.headers.gsub(/\r\n\s+/, " ") then
					subject = NKF.nkf('-s', Becky.mime_decode($1)[0].strip)
					Becky.status = 'processing... ' + subject
				end
				mail.set_status(Becky::MESSAGE_READ)
			end
		rescue ArgumentError
		end
	}
end

def crawl_folder folder
	Becky.set_current_folder(folder.folder_id) # set current folder
	mark_as_read(folder) # mark_as_read
	
	folder.each_child { |child_folder|
		if child_folder.unread > 0
			mark_as_read(child_folder) # mark_as_read
		end
		crawl_folder(child_folder) # crawl folder
	}
end

crawl_folder(Becky.current_folder)
Becky.status = 'marked as read.'

そんなに詳しくドキュメントを見ないで書いているので変数のスコープとか変なとことかありそう。てかRubyにはPerlで言うところのmyみたいなのないのかな?(そういうのいらねーよとかいう設計なのかな?)

あと変数にPerlで言うところの$fooとか@fooが付いてないのでscalarなのかarrayなのかすぐにわからじ。でもいくつかrubyのスクリプトの例を見たら@fooっていうのがあるなーと思ったら、これは配列ではなくクラスのインスタンス変数らしい。ふむふむ。

といくつかPerlとの違い的なことを書いてみましたが、文法的にPerlっぽいところもありPerl書く人には入りやすいのかなとか思ったりする。

検索

広告

OpenID対応しています OpenIDについて
Powered by Movable Type 4.22-ja