ラベル UnixLife の投稿を表示しています。 すべての投稿を表示
ラベル UnixLife の投稿を表示しています。 すべての投稿を表示

2012年3月9日

automake

FreeBSD を 9.0 に上げてから、私の環境・グラフィックカードでは mplayer や ffplay で動画を再生した時に画面が時々真っ暗になる。設定をいろいろ変えたり、下位ライブラリをリビルドしたりとあれこれ楽しんでいるが1ヶ月ずっと解消できていない。

Perl のモジュールは最近 cpanp から o; i *; (o コマンドで更新のあったモジュールをリストアップして、i *; で直前のリストアップ全てを更新 ) として、p5-* を含めて軒並み bsdpan- にしているのだが、そこに関連して しばらくメールが読めなかった。

mutt-devel に対して aspell に依存するって間違った情報が登録されているのを解消したく、一度削除して再コンパイル・インストールしようとしたのが原因。

===>   mutt-devel-1.5.21_3 depends on shared library: sasl2.2 - found
===>   mutt-devel-1.5.21_3 depends on shared library: idn - found
===>   mutt-devel-1.5.21_3 depends on shared library: iconv.3 - found
===>   mutt-devel-1.5.21_3 depends on shared library: intl - found
===>   mutt-devel-1.5.21_3 depends on shared library: db-4.7.0 - found
===>  Configuring for mutt-devel-1.5.21_3
Can't locate object method "tid" via package "threads" at /usr/local/share/automake-1.11/A
utomake/ChannelDefs.pm line 241.
*** Error code 2
Stop in /usr/ports/mail/mutt-devel. *** Error code 1< br /> Stop in /usr/ports/mail/mutt-devel.

気づいてみれば、なんのことはない。site_perl 以下の threads.pm が Perl 本体の入れた threads.pm を上書き (overload ) していたのが原因。

一瞬で気づかなかった理由は、目の前にエラーメッセージをみながら、automake が Perl に依存しているわけがないと歴史的な前後関係に目を曇らせていたせい。

2011年9月9日

本日づけの vim でコンパイルエラー

kikansah.jp を再開できそうなめどが立って、古いサーバの手入れで昨日に vim の最新版 (表示は 7.3.107 )を hg で取ってきてコンパイルした。ふつうに入った。

昨日はそのとき、自宅 PC の ruby も更新した。それゆえ、ruby と perl , python が vim のスクリプトから使えるほうの拡張版が動かなくなった。gvim に使っていて、ないと困るので今日再コンパイル。

再コンパイル時にまた最新ソース (これも表示は 7.3.107 )に更新したら、コンパイルエラー。Undefined routine ExtUtils::ParseXS::error だったかな。

perl の version は 5.14.1。cpanp コマンドを起動して ExtUtils::ParseXS モジュールを入れて、コンパイルは通った。

警告がいくつか流れていたし、perl が動くかテストするためだけの vim script が手許にないので、コンパイルできたってところまでしか確認していないが。とりあえず。

2011年3月4日

30分スクリプト for wassr reader

ちょっとした現実逃避の30分コーディング。

参照はwassr API 仕様書

#!/bin/sh
#  $Id: wassr,v 1.1 2011/03/04 01:27:05 yaemon Exp $
#
for i in 1 2 3 4 5 6 7 8 ; do
 wget   -q --user=UserID --password="PassPhrase"  -O - \
 'http://api.wassr.jp/statuses/friends_timeline.json?page='"$i" | \
 json_xs -f json -t yaml 2> /dev/null
done |  \
egrep -v '~$' | \
egrep -v '^  (id|rid|link|text|user):' | \
grep -v '^    ' | \
egrep -v '^---$' | \
less

#!/bin/sh
#  $Id: wassr,v 1.2 2011/03/04 01:39:12 yaemon Exp $
#
# for i in 1 2 3 4 5 6 7 8 ; do
for i in 1 2 ; do
 wget   -q --user=UserID --password="PassPhrase"  -O - \
 'http://api.wassr.jp/statuses/friends_timeline.json?page='"$i" | \
 json_xs -f json -t yaml 2> /dev/null
done |  \
egrep -v '~$' | \
egrep -v '^  (id|rid|link|text|user):' | \
grep -v '^    ' | \
egrep -v '^---$' | \
perl -MDateTime -e '{while ( my $line =  )
{
if ( $line =~ s/^  epoch: // )
 {
 chomp( $line );
 my $d =  DateTime->from_epoch(epoch => $line); 
 $d->set_time_zone( "Japan") ; 
 print "\n" , $d->hms() , "\n";
}
else
 {
 print $line;
}} }' | \
less

どうせ perl 使うなら、(e)grep 行もすべて perl に任せて、ついでに記事ごとのフォーマットもすべし ?

うん、もちろん。朝の30分の頭の体操としてはここで打ちきるというだけの話。

そして、トイ・スクリプトがテストをしてデータを見ながら、どうやってきちんとしたプログラムになっていくのかという過程を公開してみたい て稚気です。

2011年3月1日

欧州言語と Android OS の2月後半

昨年2月、フランス語が文字化けせずに表示できる小さな機器を持ち歩きたいから、スマートフォンにしたいと希った。

昨年12月、au ショップで クリスマスから販売。予約受付中。おそらく入手は二月半ば という言葉に惹かれて、ふらふらと IS04 を予約。

同じく12月~1月半ば。中古ノートパソコンを、英語、フランス語の古典や辞書の持ち歩きように注文。送料が 3,000円かかる。従兄から余っていた無線LAN (Wi-Fi) カードをもらい、3千円足らずの Wi-Fi ルータを買って設定ができた。

1月末。IS04 到着のお報らせ。しかし、こちらの手続き不備で受け取りが難しい。

2月上旬。mixi アプリで従来の携帯電話専用のゲームにはまっていて、なんとか両立できないかいろいろ考える。

同じく2月上旬。ノートパソコンは重量と、中古故のバッテリのへたりに持ち歩きを断念。

2月15日、ワインバーグ氏 のサイトトップに、彼の著作へのリンクがあって、電子書籍を持ち歩きたいという熱が再燃。一晩、電子書籍の規格や unix パソコンでの扱いについて調べる。

2月16日朝に思う。Wi-Fi で遊べる従来の携帯に予算を落としたら、差額でAlex (Android OS ) かKindle といった、一万円代半ばの、ネットもできる、Skype までできちゃう電子書籍リーダが買えるだろう、と。

2月16日夕方。寝不足あたまで、寄る機会があって au ショップに。勘違いして IS03 の予約、といったものだから 在庫ありますよ と。Wi-Fi の使える従来の携帯は結構お高いから、7~8千円くらいしか違わないとわかり、ふらりと機種変更してしまう。

2月17日、フランス語やスペイン語が表示されることを喜び、Kindle はアンドロイド・アプリとして実装・無料配布もされていることを知る。

2月22日。従来の携帯電話の画面の使い方にはもう戻れないし、そういったコンテンツしか出していないニュースサイトにもはや戻る気にはならないと結論した

同じく2月22日。漫画家さんが語ると聞いて Ustream 中継をみてしまって気づく。私についていえば、タワー PC のほうが業務用の文字環境。マルチメディア環境はあきらかにこちらの携帯、いや PDA だ。

2月26日。夕暮れに歩く正面に見えるのが金星、向きを変えて見えるふたつの星は、夜空ならば簡単に見分けがつくシリウスとピスカだとアプリに教えてもらい、機種変更をして本当に良かったと思った。

2月28日。ヒトの作ったアプリで、アイデアを敷衍して改善したヴァージョンを作りたいものもいくつかある。だがアプリをつくるよりも、まず Android という 環境そのものが一番おもしろそうだと、興味の方向が見えた。

アプリは、ある程度に環境の中身がわかり、かつお仕事で手をつけないといけなくなったらにしよう。私の性向は主なアイデアに沿って改善や実装、リメイクをすることなので、自分が主体でのアプリ開発には向かない。

2011年2月25日

Gmail / mutt / multi-account

承前

一年近く前の記事Gmail / Mutt まとめ への機能追加。

年初には、その約一年前に書いた記事のコードを変更・追記したし。なんだか、PC 関係のネタは一年単位で巡回しているような気がする。

マルチアカウントが可能

imap(s) の一つからログアウトする、というコマンドの記載を、mutt-users ML で読んだ。

そうか。ならば複数の接続を同時に行えるのか。

最終的には、実行中の mutt から source コマンドが使える、つまりアカウントごとの接続設定のほかに、フォルダに対する設定も、書名ファイルやヘッダ情報もそれぞれ分離できることが判明。

$ cat ~/.muttrc
# $Id: .muttrc,v 1.10 2011/02/25 13:34:30 yaemon Exp $
source ~/dotfiles/.muttrc-common source ~/dotfiles/.muttrc-gmail
source /home/yaemon/dotfiles/.muttrc-account-1

macro generic gUaccount-1 ":source ~/dotfiles/.muttrc-account-1" macro generic gUaccount-2 ":source ~/dotfiles/.muttrc-account-2" macro generic gUaccount-3 ":source ~/dotfiles/.muttrc-account-3" macro generic gUaccount-4 ":source ~/dotfiles/.muttrc-account-4"

$ echo ".muttrc-common は、前回と同じなので省略" $ cat ~/dotfiles/.muttrc-gmail mailboxes imaps://imap.gmail.com/inbox set smtp_authenticators="plain" set ssl_starttls set move=no set delete=yes set folder='imaps://imap.gmail.com/'
set spoolfile='+INBOX' set postponed='+[Gmail]/下書き' set record='+[Gmail]/送信済みメール' folder-hook . 'push "<limit> ~d <1y<enter>"' macro index gi "<change-folder> =INBOX<enter>" "Go to inbox" macro index ga "<change-folder> =[Gmail]/すべてのメール<enter>" "Go to all mail" macro index gs "<change-folder> =[Gmail]/送信済みメール<enter>" "Go to Sent Mail" macro index gd "<change-folder> =[Gmail]/下書き<enter>" "Go to drafts" macro index gS "<change-folder> =[Gmail]/迷惑メール<enter>" "Go to Spam"

folder-hook =INBOX 'push "<limit> ~d <2d ~N<enter>"' folder-hook =[Gmail]/すべてのメール 'push "<limit> ~d <2d ~N<enter>"'

$ cat ~/dotfiles/.muttrc-account-1 # $Id: .muttrc-account-1,v 1.1 2011/02/25 13:34:31 yaemon Exp $
my_hdr X-MSN-Passport: .... my_hdr X-Mixi-SearchWord: ... my_hdr X-Twitter-ID: ... my_hdr X-YahooJP-ID: ... my_hdr From: NAKAGAWA Tsuneo <yaemon.the.tank@gmail.com>
set hostname="gmail.com" set imap_user="yaemon.the.tank@gmail.com" set imap_pass="ひ・み・つ"

set sendmail= set smtp_url="smtp://yaemon.the.tank@smtp.gmail.com:587/" set signature="~/.signature"

2010年8月29日

全力で

日常を進める気力が沸かずに眠ってばかりいたので、全力で現実逃避してみた。

mutt のソースの最新を取ってきて自力コンパイルしたり、MakeWorld してみたり、ふた月ほど離れていた mixi のコミュニティの話題に追いつくため、トピックの記事一括ダウンロードのスクリプト書いたり。

見るトピックがわかっていれば、スクリプト書かなくてもブラウザから全記事を見れば良い 、正しい。単に頭の体操としてスクリプト書いて遊んでいただけだ。

単に遊んでいるだけ。

mutt のコンパイル手順

  1. もし hg コマンドが使えないならば mercurial をインストール
  2. $ hg clone hg clone http://dev.mutt.org/hg/mutt workdir
  3. $ cd workdir ; ./prepare configureOptions
  4. $ make && sudo make install

私が configure オプションスを与えるのに使ったスクリプト

./prepare \
--prefix=/usr/develop \
--enable-pgp \
--disable-pop \
--enable-imap \
--enable-smtp \
--enable-debug \
--enable-inodesort \
--disable-nfs-fix \
--disable-mailtool \
--enable-locales-fix \
--enable-exact-address \
--enable-hcache --with-gdbm --without-bdb --with-tokyocabinet \
--enable-iconv \
--with-regex \
--with-ssl=/usr \
--with-gnutls=/usr/local \
--with-sasl=/usr/local \
--with-idn=/usr/local \

インストール先が /usr/develop てのは相当苦しいが、/usr/local に入れた ports からの 安定 version と別にしたかった

ports の版と違い、データベースファイルに tokyocabinet は使えないので、じつはこれを動かすと警告が出る。

GNU make でなく、BSD に元からある make が使えたのはうれしかった。気分の問題でしかないが。

いまはこんな設定を加えた。

yaemon@bouon-an$ alias muttd
alias muttd='/usr/develop/bin/mutt -F /home/yaemon/dotfiles/.muttrc-develop  -d 1'
yaemon@bouon-an$ diff ~/dotfiles/.muttrc{,-develop}
21,21
< set smtp_pass=Secret
---
> # 送信パスワードは、本家の版では保存されない。コメントアウトしておいて毎回入力
25a25,28
>
> set header_cache=/home/yaemon/var/mutt/CachesGDB/header
> set message_cachedir=/home/yaemon/var/mutt/CachesGDB/body
> set pager=

fetchMixiBBS

車輪の再発明 とかいわない。運動をしたら汗をかくようなもので、全力で現実逃避したら成果ができる。それだけ。

Objective でない考え方でスクリプトが設計できないってだけのバカです。

$ cat ~/bin/fetchMixiBBS
#!/usr/bin/env perl
#
#       $Id: fetchMixiBBS,v 1.1 2010/08/29 00:16:11 yaemon Exp $
#
use strict;
use warnings;
use FileHandle;
use WWW::Mixi::Scraper;
use lib( "/home/yaemon/lib/perl" ); use MixiToRFC2822::BBSWrapper qw( id subject pop );
sub checkMaildir($); sub getMessage( $$ );
my $mixi = WWW::Mixi::Scraper->new( 'email' => 'EmailAddressForLogin' , 'password' => 'PasswordForMixi' , );
my $storeDir = $ENV{ 'HOME' } . "/Maildir/mixi/"; checkMaildir( $storeDir );

my $list = new FileHandle( "< $ARGV[0]" ); if ( ! defined( $list ) ) { die "Can't open $ARGV[0]:$!"; }
while( my $line = $list->getline ) { chomp( $line); $line =~ s/#.*//; if ( $line !~ /^[0-9]+$/ ) { next; }
getMessage( $mixi , $line); }
sub checkMaildir( $ ) { my $maildir = shift; if ( ! -d $maildir ) { mkdir( $maildir ) or die "Can't mkdir $maildir:$!"; } if ( ! -d "$maildir/new" ) { mkdir( "$maildir/new" ) or die "Can't mkdir $maildir/new:$!"; mkdir( "$maildir/cur" ) or die "Can't mkdir $maildir/cur:$!"; mkdir( "$maildir/tmp" ) or die "Can't mkdir $maildir/tmp:$!"; } }
sub getMessage( $$ ) { my $account = shift; my $bbs = shift;
my $all = $account->parse( "/view_bbs.pl?id=$bbs&page=all" ); if ( defined ( $all ) ) { printf STDERR "%s: %s fetch success\n" , my $datestr = localtime() , $bbs ; } else { die( "Can't get $bbs. retry not implimented" ); } my $board = MixiToRFC2822::BBSWrapper->new( $all ); my $dir = $storeDir . "/" . $board ->community->id() . '-' . $board->community()->name();
checkMaildir( $dir );
while( my $comment = $board->pop() ) { if ( -f $dir . "/new/" . $comment->uniqueName() || glob( $dir . "/cur/" . $comment->uniqueName() . '*' ) ) { return; }
my $out = new FileHandle( "> $dir/new/" . $comment->uniqueName() ); if ( ! defined( $out )) { die "Can't open messagefile:$!"; } $out->print( $comment->message() ); } }
$ ls ~/lib/perl/MixiToRFC2822
BBSWrapper.pm
CVS/
Community.pm
Message.pm
$ cat ~/lib/perl/BBSWrapper.pm
#!/usr/bin/env perl
#
#   $Id: BBSWrapper.pm,v 1.1 2010/08/29 00:17:16 yaemon Exp $
#
package MixiToRFC2822::BBSWrapper;
use strict;
use warnings;
use Carp; use Exporter; use lib( "/home/yaemon/lib/perl"); use MixiToRFC2822::Community; use MixiToRFC2822::Message;
use vars qw( $VERSION @ISA @EXPORT_OK ); sub id($); sub subject($); sub child($); sub root($);

our $VERSION = "0.01"; @ISA = qw( Exporter); @EXPORT_OK = qw( id subject commuity pop);

sub new($$) { my $self = bless {} , shift; $self->{ '_data' } = shift; return $self; }
sub id($) { my $self = shift; return $self->{ '_id' } if exists $self->{ '_id' } ; my @tmp = grep( /^id=/ , split( /[\&\?]/ , $self->{'_data'}->{'link'}->opaque )); if ( @tmp != 1 ) { die "Can't parse " . $self->{'_data'}->{ '_link' } } $self->{'_id'} = $tmp[0]; $self->{'_id'} =~ s/^id=//; return $self->{'_id'}; }
sub community($) { my $self = shift; return $self->{'_community'} if exists $self->{ '_community'};
$self->{'_community'} = MixiToRFC2822::Community->new( $self->{'_data'}->{'community'} ); }
sub subject($) { my $self = shift; return $self->{'_data'}->{'subject'}; }
sub root($) { my $self = shift; return $self->{ '_root' } if exists $self->{ '_root' } ; my $message; $message->{'subject'} = $self->subject(); $message->{'name_link'} = $self->{'_data'}->{'name_link'}; $message->{'name'} = $self->{'_data'}->{'name'}; $message->{'time'} = $self->{'_data'}->{'time'}; $message->{'description'} = $self->{'_data'}->{'description'}; $message->{'to'} = $self->community(); $self->{'_root'} = MixiToRFC2822::Message->new( $message , 'bbs' ); }

sub pop($) { my $self = shift; return undef if exists $self->{'_end'} ; my $message = pop( @{ $self->{_data}->{comments}} ); if ( ! defined( $message ) ) { $self->{'_end'} = 1; return $self->root(); } $message->{'reply_to'} = "<" . $self->root()->uniqueName() . ">"; $message->{'subject'} = "Re: " . $self->subject(); $message->{'to'} = $self->community();
return MixiToRFC2822::Message->new( $message , 'bbs' ); } 1;

$ cat ~/lib/perl/Community.pm
#!/usr/bin/env perl # # $Id: Community.pm,v 1.1 2010/08/29 00:17:16 yaemon Exp $ # package MixiToRFC2822::Community; use strict; use warnings;
use Carp; use Exporter; use vars qw( $VERSION @ISA @EXPORT_OK );
sub id($); sub name($);
our $VERSION = "0.01"; @ISA = qw( Exporter); @EXPORT_OK = qw( id name );

sub new($$) { my $name = shift; my $data = shift; return bless $data , $name;
}
sub id($) { my $self = shift; return $self->{ '_id' } if exists $self->{ '_id' } ;
$self->{'_id'} = $self->{'link'}->opaque(); $self->{'_id'} =~ s/.*id=//;
return $self->{'_id'}; }

sub name($) { return shift->{'name'}; }
1;
$ cat ~/lib/perl/Message.pm
#!/usr/bin/env perl
#
#   MixiToRFC2822.pm      2010-07-07 yaemon
#   $Id: Message.pm,v 1.1 2010/08/29 00:17:16 yaemon Exp $
#
package MixiToRFC2822::Message;
use strict;
use warnings;
use Carp;
use Exporter;
use Mail::Internet;
use Mail::Header;
use Encode qw/encode/;
use DateTime;
use vars qw( $VERSION @ISA @EXPORT_OK );
sub message($); sub date( $ ); sub uniqueName($); sub messageFrom($);
our $VERSION = "0.01"; @ISA = qw( Exporter); @EXPORT_OK = qw( uniqueName message );

sub new($$$) { my $self = bless {} , shift; $self->{ '_message' } = shift; $self->{ '_kind' } = shift;
return $self; }
sub message($) { my $self = shift; return $self->{ '_mailFormat' }->as_string() if exists $self->{ '_mailFormat' }; my $myAddr = "( T.Nakagawa ) <23211\@mixi.jp>"; my $otherAddr = sprintf( "( %s )<%d\@mixi.jp> " , encode( 'MIME-Header' , $self->{ '_message'}->{ 'name' } ) , $self->messageFrom() ); my $header = Mail::Header->new(); $header->header_hashref( { 'Subject' => encode( 'MIME_Header' , $self->{ '_message'}->{'subject'} ), 'MIME-version' => "1.0" , "Message-Id" => sprintf( "<%s\@mixi.jp>" , $self->uniqueName() ), 'Content-Type' => 'text/plain; charset=utf-8' , 'Date' => $self->date->strftime( "%a, %d %b %Y %H:%M:%S %z") , } );
if ( $self->{ '_kind'} eq "inbox" ) { $header->add( 'From' , $otherAddr ); $header->add( 'To' , $myAddr ); } elsif ( $self->{ '_kind'} eq "outbox" ) { $header->add( 'To' , $otherAddr ); $header->add( 'From' , $myAddr ); } elsif ( $self->{ '_kind' } eq "bbs" ) { $header->add( 'From' , $otherAddr ); $header->add( 'To' , sprintf( "( %s )<%s%%community\@mixi.jp>" , encode( 'MIME-Header' , $self->{'_message'}->{'to'}->name() ) , $self->{'_message'}->{'to'}->id() ) ); if ( exists( $self->{'_message'}->{'reply_to'} ) ) { $header->add( 'In-Reply-To' , $self->{'_message'}->{'reply_to'} ); } } else { die "Not implementd messagebox:$self->{'_kind'}"; }

my $body = encode( 'utf-8' , $self->{ '_message' }->{ 'description'} ); $body =~ s/&#(\d+);/pack("W" , $1)/meg;
$self->{ '_mailFormat' } = Mail::Internet->new( 'Body' => [ map { "$_\r\n"; } split( "<br />" , $body ) ], 'Header' => $header, );
return $self->{ '_mailFormat' }->as_string(); }

sub uniqueName($) { my $self = shift; return $self->{ '_uniqueName' } if exists $self->{ '_uniqueName' } ; $self->{ '_uniqueName' } = sprintf( "%d.%s.%s" , $self->date()->epoch() , $self->messageFrom() , "mixi.MixiToRFC2822" );
return $self->{ '_uniqueName' }; }

sub messageFrom($) { my $self = shift; return $self->{ '_from' } if exists $self->{ '_from' }; my $tmp; if ( $self->{'_kind'} =~ /box$/ ) { $tmp = $self->{ '_message' }->{ 'link' }->opaque(), } else { $tmp = $self->{ '_message' }->{ 'name_link'}->opaque(); } $tmp =~ /id=([0-9]+)/; $self->{ '_from' } = $1; return $self->{ '_from' }; } sub date( $ ) { my $self = shift;
return $self->{ '_date'} if exists $self->{ '_date' };

my @date = split( /[\- :]/ , $self->{ '_message' }->{ 'time' } );
$self->{ '_date' } = DateTime->new( "year" => $date[0] , "month" => $date[1] , "day" => $date[2] , "hour" => $date[3] , "minute" => $date[4] , "second" => 1 , time_zone => 'Asia/Tokyo' , );

$self->{ '_date' }; }

1;
yaemon@bouon-an$  /usr/local/lib/perl5/site_perl/5.12.1/WWW/Mixi/Scraper/Plugin/ViewBBS.pm{.orig,} 
*** /usr/local/lib/perl5/site_perl/5.12.1/WWW/Mixi/Scraper/Plugin/ViewBBS.pm.orig        Sun Aug 29 13:45:12 2010
--- /usr/local/lib/perl5/site_perl/5.12.1/WWW/Mixi/Scraper/Plugin/ViewBBS.pm    Sun Aug 29 06:22:10 2010
***************
*** 36,42 ****
        description => $self->html_or_text;
      process 'dd.bbsContent>dl>dd>div.communityPhoto>table>tr>td',
        'images[]' => $scraper{images};
!     result qw( time subject description name name_link images link );
 };
# bbs topic is not an array --- 36,46 ---- description => $self->html_or_text; process 'dd.bbsContent>dl>dd>div.communityPhoto>table>tr>td', 'images[]' => $scraper{images}; ! ! process 'p.utilityLinks03>a', ! _community_name => 'TEXT', ! _community_link => '@href'; ! result qw( time subject description name name_link images link _community_name _community_link); };
# bbs topic is not an array *************** *** 84,89 **** --- 88,103 ---- } $stash->{comments} = \@comments;
+ + $stash->{_community_name} =~ s/.*\[//; + $stash->{_community_name} =~ s/\].*//; + + $stash->{community}->{name} = $stash->{_community_name}; + $stash->{community}->{link} = $stash->{_community_link}; + + undef $stash->{_community_name}; + undef $stash->{_community_link}; +
return $stash; }

2010年6月23日

環境オタク

開発の現場に戻ると、私が手を動かそうとしない時間は、人より多く見えるのを改めて実感する。

C 言語でこの業界に入ったときから プログラムを書かないプログラマを目指す と言いつづけているしね。

どこまでをプログラムにやらせ、どこを人間が行うのか、問題の解決に向けた最短時間をいつも計っている。考えている。だから手を動かし始めるまでが遅い。動かしてからも、よく手を止め、喫煙所に向かう。

他の人の仕事内容をつかむためにも、喫煙所をよく訪れるが。

それでも、うっかり時間を割きすぎてしまう箇所は私にもある。

環境設定だ。自分の武器は unix/shell を良く知っていて、便利なツール・設定を状況に応じて繰り出す小技だと思っている。状況分析 6割、応じた開発手法の編み出し・使用するライブラリ/モジュールの導入 3割、開発 1割。

だからこそ、自宅環境は便利な設定でいっぱい。最新のツール(やライブラリ) を常に揃えようとする。最新をとりあえず入れていると、時間がとられることは多い。

などと、過去 15年の 自分がこだわってしまう、非効率になりがちな場所 を今朝反省していた。つまり踏みとどまることができた。

単に、外部から自分のデスクトップに ssh する方法 を設定していて、このマシンでは公開鍵/秘密鍵の設定をまだしておらず、パスワードアクセスになると気づいただけだ。

一日、二日で推測されるようなパスワードじゃあるまいし、その設定は後日にしておけとね。

最近まで、この手の環境の不備に気づくと、うっかり徹夜してでも仕上げていた。今回、一週間。朝の出勤前での作業を心がけていて、やっと自分の環境オタクに気づけた。

2010年5月2日

PC 環境復旧

恵んでもらったマシンがメインだが、復旧 したのは環境であって、PC ではないということで。

4月30に追加の買い物をして、作業開始。各種アプリの更新作業まで含めて、終了したのは今朝未明4時。

技術寄りの、FreeBSD に特化した話を軽く書く。

/usr/local , /usr/src , /usr/compat は前からのディスク (320GBytes , ATA 接続 ) へのシンボリックリンク。/usr/home , /var , /tmp は前からのディスクの該当パーティションへマウント。動作確認で FreeBSD-8.0 RELSEASE をインストールした新しいディスク ( 80Gbytes , SATA 接続 ) から起動して、/etc はまるっぽ mv して /etc/fstab のみを編集した。

8.0-RELEASE と、マシン故障前時点の 8.0-STABLE で ライブラリに変化があり、ports でなく自分で作っている vim だけが動かなかった。どうせ更新は趣味で行うので、vim を作り戻しはせず csup , makeworld 。そのほかは素直に動いた。Pentium4 1.6GHz から Celeron 1.8GHz 、どちらも i686 と表示される移行なので、CPU に合わせて最適化した /usr/local のバイナリも最適なまま動いているのだろう。

変えた設定は、失効した kikansha.jp のドメインから **.local への名前変更のみ。

ハードの変更に伴う変更は二点。ネットワークカード ( カーネルで bfe → em ) と、グラフィックボード ( Radeon RV200 QW [Radeon 7500]Volari Z9s で、ports から入れている X のドライバと xorg.conf を radeon から sis に ) 。

ドライバを変更しなくとも、前の設定ファイルそのままでとりあえず X が VGA (基本) ドライバで動いてくれたのはありがたかった。メールチェックくらいはできるということだ。(そこまで18日もの長きに渡って、携帯から生活していたから今更ともいうが)。vim が使えるまで、積極的に日本語を入力する気にならなかったけれどね。

X が VGA で動いていたとき、まだ /boot/loader.conf を動かしていなくて sem.so をロードしていなかったが firefox3 は素直に動いていた。なぜだろうね。とくに追求する気はない。

おっと、一時間後に追記。サーバ用の機材 で、音声出力端子がマザーにないので USB のスピーカを購入していた。ヨドバシカメラで一番廉かった品物、 1,980円。

Windows 用の CD がついたソフトウェア制御の品物で、音量調整はコマンドラインから mixer と叩かないといけないが、/boot/loader.conf に snd_uaaudio_load="YES" と追記したほかにとくに設定はない。(追記終わり)

ひさびさに、睡眠障害寸前まで作業した。どうなることかと思ったが、徹夜→13時から2時間の仮眠→風呂などの日常もこなして24時に就寝→6時半に自然に目が覚めた、ので私も復旧できたのだろう。

ゴールデン・ウィークのあいだは復職活動をしても無駄なので、あと五日間でちと作品を作ろうと、今朝思いついた。前に河野さんとお話して、こんな仕様でこんな実装なら良いよねと意気投合した CMS の、ブログ部分だけ軽く。五日でできる範囲だけに限定して。

五日あれば、構想は固まっているわっさ用の人工無脳も一個半作れるんだけれどさ。環境構築も実験も済んでいるし。わっさそのものにアクセスするのを控えているので、人間の環境が今は向かないのだ。

2010年4月3日

Re: 家庭教師 vol.9

ブロガー、エラー bx-pwlsr7

昨日付けの記事を編集後、blogger.com がエラーを出してくれた。

携帯からの写真送信をするのに設定を前後したせい、もしくは携帯の写真を含んだ HTML を手で編集したせいでデータを壊したかと蒼ざめた。二時間ほどゴチャゴチャするうちに、エラーコードを含んだ検索結果に段々と声が集まってきた。

ほかにも同様の目に遭っている人がいるならばタイミングの問題だろう。データが壊れていた場合に備えて、私も被害者の名乗りをあげて修復希望リストに名を連ね、しばらくして眠った。

六時間後に起床。エラーは解消されていた。保存すらできなかったはずの記事は、草稿として保存されていた。

技術者はエラーリポートに詳細を書かないと意味がないと考える。だが、動かないぞ、ばかやろう という抗議がリアルタイムに集積するだけで情報の価値が発生することもあるのかと感じ入った。

Re: 家庭教師 vol.9

せっかくだから、文章構成に紛れて書かなかった昨日の詳細。

目黒の図書館で、館内地図をみてどこに見処があるかという意見をいうのを堪え、好きに行動させた。

一度、喉が乾いたときの対処を訊きに探しにこられたほかは、120分間好きに本の森に遊んでいた。

ひとりで本棚を周りながら考えた。本との出会いをプロデュースしながら、好みを押し付けないという自制はどれだけ大変か。押し付けるというエゴが、自覚して排除することをいくら繰り返しても残っていると。

図書館を出てしばらく、ちと不機嫌になっている自分がいた。夜の教科別の指導では、今まで以上に関われた。

今年にはいって、人が人にコミットする覚悟について考えている。馴れ合いや同化の押し付けでもなく、腰が引けて逃げるのでもない、互いに変わるという覚悟。

ためしに commit を使って英文を作れといわれると、自殺や犯罪くらいしか浮かばない。そらみろ、我々欧米人だって、個人としての自覚をもって行動するようになったのは最近なんだと言われました。なるほど神様を差し置いて、自分で決めるのがコミットですからね。

原文は河合隼雄 、記憶から再構成しているので、文責は私中川

2010年3月29日

手法と文化

twitter で、占い師として有名なアレクサンドロ原田氏の呟きをみた

alx_hrd: ウエイト版だけやってタロットカードを分かった気になってしまう事がどういうことかと、最近強く感じます。芸事でもクラシックを学んだ人程コンテンポラリーで実力を発揮するように。 #tarotjp #spiritualjp |03:17 AM Mar 29, 2010|

alx_hrd: かといって「ウエイト版は邪道だ」と言うガチガチの偏り過ぎ古典主義もどうかと思います@ #spiritualjp #tarotjp |03:33 AM Mar 29, 2010|

twitter で占いに関する発言はすまい、と思っていなかったら。きっと反応して浅い発言をしていただろう。原田氏は百も承知の内容、そして他の方には偉そうにしか思えない発言を。

占いにしか興味のない相手に、西洋文化全般を学べといっても詮のないこと。入り口として古典の図柄のタロットを勧める。それは正しい。

コンピュータ言語に関しても同様。スクリプト言語も良いけれど、まず C から学ばなきゃ , いや、C やるならアセンブラだろう この手の発言はよく見る。私より10歳ほど若い技術者から、C を学んだことのない技術者は未生以前 というニュアンスの発言を聞いたこともある。

表層ではなく、ハウツーではなく文化を学ばないと、一定の段階から先に進めない。本当に言いたいのはそれだけなのに、人はどうしても自分の辿った道を人に示したくなる。悪くはない。実績はあるのだから。でも、他の道もある。

私も先だって、Linux / Windows で java から学んでいる人に BSD 系 unix という文化を勧めようとしたな。一歩間違えると、押し付けると 老害

そう考えると、東川氏の作品 にあった まさかオランウータンが侵入して殺したなんてことはありませんよね。ミステリとしても三流ですよ 君、本当に探偵小説研究会か ? というギャグは深い。

2010年3月25日

jfbterm uim-fep screen

2日前の記事に加筆して独立させた。

jfbterm と screen

jfbterm から screen を起動したときに、termcap の情報がロックされるのか、less , lv などが文句をいったり、mutt が暴走したりする。

何度か設定を工夫していたが、やっと満足のいく設定ファイルができたので公開する。

$ grep jfb .aliases
test -x /usr/local/bin/jfbterm  && \
alias jfb="$HOME/bin/jfbterm.wrapper"
$ cat $HOME/bin/jfbterm.wrapper
#!/bin/sh -euf
#
#   $Id: jfbterm.wrapper,v 1.2 2010/03/24 20:11:03 yaemon Exp $
#

if test ! -x /usr/local/bin/jfbterm ; then echo "not exist jfbterm" 1>&2 exit 2 fi . $HOME/dotfiles/.env.UTF-8.FreeBSD SCREENRC=$HOME/dotfiles/.screenrc.jfbterm ; export SCREENRC exec /usr/local/bin/jfbterm
$ cat $HOME/dotfiles/.env.UTF-8.FreeBSD
# $Id: .env.UTF-8.FreeBSD,v 1.7 2010/03/24 19:34:42 yaemon Exp $
LANG=ja_JP.UTF-8 ; export LANG

export COLORTERM TERM=xterm-color SCREENRC=$HOME/dotfiles/.screenrc.xterm ; export SCREENRC
LC_COLLATE=C LC_MONETARY=C LC_NUMERIC=C LC_TIME=C LC_MESSAGES=C export LC_COLLATE LC_MONETARY LC_NUMERIC LC_TIME LC_MESSAGES
# for jman use if test -x /usr/local/bin/jman ; then JMAN_JA_NROFF='LANG=ja_JP.eucJP /usr/local/bin/groff -S -Wall -mtty-char -man -Tnippon -dlang=ja_JP.eucJP' export JMAN_JA_NROFF if test -x /usr/local/bin/lv ; then PAGER=lv ; export PAGER fi fi if test -x /usr/local/bin/lynx && test -r $HOME/.lynx/utf-8.conf ; then LYNX_CFG=$HOME/.lynx/utf-8.conf export LYNX_CFG fi
$ cat $HOME/dotfiles/.screenrc.jfbterm
#
# $Id: .screenrc.jfbterm,v 1.5 2010/03/24 19:34:42 yaemon Exp $
#
chdir
defutf8 on
encoding UTF-8
# term jfbterm-256color
term jfbterm
nethack on

$ tail $HOME/.bashrc
if test $SHLVL -eq  1 && test "$LANG" != "C" ; then
 . $CONFDIR/.env.locale.C
fi

if test "$TERM" = "jfbterm" ; then TERM=jfbterm-256color fi

ログインシェルに余計な環境変数を持ち込まないように工夫すると wrapper が必要になった。

通常は、アクセスしたらもうターミナルの状態が変わらないから、コンソールやリモートログインに合わせ = 環境変数 LANG に合わせて環境を変えるだけで良い。基本、言語と OS に合わせた設定ファイルは .bash_login や .login で読み込んでいる。

今回は、xterm でもないのに 日本語、ということで不正規な処理になっている。

FreeBSD 以外で jfbterm を使うときのためにもうひと工夫したいが、今回は見送り。

jfbterm と uim-fep

2日前、やっとコンソールで日本語が入力できるようになった。

uim-fep をいれてからずいぶんとかかった。

最大の敗因は、Alt + Space での切り替えにこだわったこと。いくら設定ファイルを試行しても変わらない、いやどうもデフォルトでもそうらしいと調べたが、私の環境では Alt + Space が何かにフックされて uim に届かない。

そして英語キーボードとして使っているから、もう一つのデフォルトのキーバインドの [半角/全角] は存在しないし。起動しないよね。

Alt + Space が何にフックされているのかは調査打ち切り。 jfbtermX のライブラリを使っているから、X で普段使いしている設定が怪しいと .xinit で読み込んでいる設定ファイルを調べたり、無効にしたりもしたが、それでも Alt + Space は uim-fep に届かないとしか分からなかった。

次の敗因。uim 付属の README.fep に screen を使用する場合は… という説明があってそれに従おうとしたこと。歴史的な経緯で残っている記載だろう( 旧名 : screen-uim ) が、 jfbterm を起動して、自分で uim-fep を起動してから screen 動かすと、ふつうにそれぞれの窓で日本語が入力できる。

jfbterm から uim-fep や screen を自動起動しないのは、趣味と使い方の問題。日本語を表示したいけれど、書く必要がない日もある。

いっとき、jfbterm が動かなくなった という愚痴をこぼしたことがある。

$ jfbterm 2> logfile と起動してわかった。/usr/local/etc/jfbterm.conf (私の環境) の video.mode 指定をねぼけてコメントアウトした日があるらしい。

jfbterm デフォルトの解像度 800x600 で動かなくて、1024 x 768 だと動くグラフィックカードというのも不思議な気がするが、逆よりは宜しい、と書いておこう。

解像度と色数は、/var/log/Xorg.0.log を参照してやっと正常に指定できた。

Xorg の設定ファイルをみたら、いつのまにかフォントサーバ xfs を使わなくなっていた自分に気づいたりする。これが原因で、Thunderbird 2.x の文字がふと横に間延びしていたのか。( Thunderd を 3.x 系統にしてから気づいた、ので未検証だが )

$ cat $HOME/.uim
(define-key generic-on-key? '("<Control>\\" "<Shift> "))
(define-key generic-off-key? '("<Control>\\" "<Shift> "))
(define-key anthy-on-key? 'generic-on-key?)
(define-key anthy-latin-key? 'generic-off-key?)
(define-key generic-cancel-key? "<Control>g")

2010年3月23日

Gmail / mutt まとめ (「PC 設定メモ」から改題)

最新記事も読みやすくなって、やっとまとまった。過去記事と重複あり

.muttrc にすべてのアカウント情報を書く手段も Web で見たが、私は別ファイルにした。

パスワードに使っている文字のなかに、初期設定としてだと指定できるが、切り替えに使うことができないものが含まれている、なんてことがあるかもしれない。

$ alias | grep mutt
alias official='/usr/local/bin/mutt -F $HOME/.muttrc-official'

↑のちに、一度の起動でマルチアカウントできることが判明

$ cat $HOME/.muttrc
# for mutt-devel ( higher then 1.5.20 )
# $Id: .muttrc,v 1.5 2010/03/16 00:19:47 yaemon Exp $
#
source ~/dotfiles/.muttrc-common
source ~/dotfiles/.muttrc-gmail
#
my_hdr X-(お遊びヘッダ): (いくつか)
my_hdr From: NAKAGAWA Tsuneo <yaemon.the.tank@gmail.com>
#
set imap_user="yaemon.the.tank@gmail.com"
set imap_pass="(なんだろうね)"
set smtp_url="smtp://yaemon.the.tank@smtp.gmail.com:587/"
set smtp_pass="(imap_pass と同じ値)"

.muttrc-official も書いてる情報の項目は同じ

# .muttrc-common は長いので、適当に抜粋。
# 日本語パッチではなく、本家のものを使用していて動くのが素晴らしい
# 環境変数 LC_MESSAGES を使って表示メッセージは原文で使うけれど
set alias_file=~/.mail_aliases # where I keep my aliases
set allow_8bit   # never do Q-P encoding on legal 8-bit chars
set mime_forward  # use message/rfc822 type to forward messages
set pager=lv # some people prefer an external pager
set pager_index_lines=6  # how many index lines to show in the pager
set print_command=/bin/false # how to print things (I like to save trees)
set envelope_from=yes # use From: to envelope-from
set timeout=0   # timeout for prompt in the index menu
set use_8bitmime  # enable the -B8BITMIME sendmail flag
set pgp_verify_sig=yes
set visual=vim   # editor invoked by ~v in the builtin editor
source /usr/local/share/examples/mutt/gpg.rc
$ cat $HOME/dotfiles/.muttrc-gmail
set hostname="gmail.com" # my DNS domain
mailboxes imaps://imap.gmail.com/inbox
# set  imap_passive=yes # yes is default
set smtp_authenticators="plain"
set ssl_starttls
# set move=yes #  /* ローカルに保存してしまうことが判明 */
set move=no
set delete=yes
set folder='imaps://imap.gmail.com/'
#
set spoolfile='+INBOX'
set postponed='+[Gmail]/下書き'
set record='+[Gmail]/送信済みメール'
#
# gmail の設定として日本語を使っているのが間違っている気もする
macro index gi "<change-folder>; =INBOX<enter>" "Go to inbox"
macro index ga "<change-folder> =[Gmail]/すべてのメール<enter>" "Go to all mail"
macro index gs "<change-folder> =[Gmail]/送信済みメール<enter>" "Go to Sent Mail"
macro index gd "<change-folder> =[Gmail]/下書き<enter>" "Go to drafts"
#
# mutt のメーリングリストを読んで、下の記述方法を憶えたのがうれしくて今日は日記に書いた :-)
folder-hook  INBOX 'push "<limit> ~d <2d ~N<enter>"'
folder-hook  すべてのメール  'push "<limit> ~d <2d ~N<enter>"'

2010年3月9日

言語処理学会 NLP2000 -前夜-

退役状態の私だが、ひょんなことで 情報処理学会と共同開催 言語処理学会第16回年次大会(NLP2010) の前夜祭、チュートリアルに行ってきた。

講聴したのは、推薦システム -機械学習の視点から- ( 神嶌 敏弘 氏 ) 、ALAGIN フォーラムの活動 ( ALAGIN より若手研究者3人 ) 、「現代思想」と言語 -脳、認知から遠く離れて- ( 影浦峡 氏 )

スリリングでインタレストな一日だったよ、いやもう本当に。

リコメンドシステムの話では、心の叫びが口から飛び出しそうになって、声帯だけは使わずに耐えたが、何人かにはチャチゃとして聞こえたんじゃないかな。EC / Web 開発の現場を離れて2年以上になるのに、知った顔と会って挨拶されるしね。最後のコマに至っては、質問をしたら哲学者の先生に 中川先生 と (胸の外来タグを読んで) 言われてしまった。俺はソシュールとラカンとフーコーの区別も怪しい、一介の技術者。実用の徒だ。

スリリングすぎるネタの話はその辺にして、真面目な感想を書こうか。

リコメンドシステムの話を聴いて

隣席の若い男が、数式を言葉に翻訳したほかは全く資料そのままのメモを、パソコンに Mule で書いていたな。

全般に、聴講者がそんな感じ。資料を調べるなら、わざわざ身体を運ばなくても事足りるんだよ。ここに来て、人間から話を聴くことで、君は何を受け取りに来たのかと激しく糾弾したい。

私が触発されて考えはじめたのは、EC は何のためにリコメンドシステムを作成するのか という戦略。ソムリエ問題 という名称が思い浮かんだ。

アマゾンのように、ロングテイル (裾野需要) を喚起するためにリコメンドするのか。ならば誰でも知っている、メジャーなものは推薦対象から省くべきだろう。それが神嶌氏の言うところの Serendipity -意外性- の提示、リコメンドからアテンダントへ という最終の結論につながる道のはずだ。

聴講者のなかに混乱している人がいたが、新規性 は知りたいと思っている事柄の続報、ニュース。意外性 は隣接分野への啓蒙。 ーーだと思う

論文はモデルの美しさを、仮説を競う。現実に対する評価は、利益の拡大で計られる。シェアですらない。

ALAGIN の発表を聴いて

同じ文脈に出てくる単語は、新しい概念として類義語といえる 単純な、ここまでは誰でも思いつくアイデアを、資料を集めさせ、実証するのにどれだけの手間が必要だろう。

門外漢は プログラムしてあとはコンピュータにやらせたのだったら、楽なのではないの と言う。(いや、私も時々言う。セールストークとして。) でも NICT の人々がこのデータベースを作るのに、40台のマシンを協力して動くように注意深くプログラム組んで、ぶん回して、一ヶ月かかったんだよ。

そのデータを活用するのに、 何回補正作業をしながら、問いなおしをすれば良いか を決めるのは慣れた人間の勘だと割り切っている。そこが素晴らしい。

質疑応答の時間、若い男がした発言に血圧が上がった。サービスが動き出したら、プログラムからアクセスしたいという需要が見込まれますが、それ用の API は予定されないのですか ?

API を用意しろとほざく前に、アクセスするプログラムを、負荷が迷惑にならないように書きやがれ。窓口に API という名前がつけば何やっても良いというワケじゃないだろう、バカ者が。

言語学の講義を聴いて

聴講者のほとんどが、みたところ影浦氏の大学の生徒らしくて笑った。

はい、論文の一つ (次女たち ) を読んでおいてねと書いてあったから、図書館に行って フーコー全集 ( 全7冊 だったかのうちの2冊と、解説本 / ちくま学芸文庫版 ) をおさらいしましたよ。ざっくり20年弱ぶり、ですかね。

フランス哲学、構造主義。識りません♪ ちょうど世代だけれど浅田彰のベストセラーとか読まなかったし (立ち読みで充分)

私が識っているのは、外国語で書かれた内容を認識するのはおもしろい。言葉のひとつひとつを単純に置き換えるのは翻訳ではない。そして心の動きや体験を言語に直すという作業にも同じ過程が存在する という、それだけ。

シニフィアン/シニフィエ という言葉を好んで使う。これはソシュールだっけ (いまやっと調べた) 。

エピスメーテとかアルシーヴとかいう言葉は憶えきらなかったから、近年自分で再発見したときには事象と現実という言葉で表現してきた。

二十代でフランス哲学に出会っていたからエピスメーテを認識できたのか、フランス哲学に出会ったことがなくても自力で発見できたのか。それは誰にも分からない。

2010年3月3日

mutt + imap/Gmail (閲覧)

だいたいの設定はうまくいったが、INBOX だけうまく表示できていなかった。

1万通と2,3千通がはいったフォルダを読み込もうとすると、ヘッダを読み込んだメールの数が満杯になったあと Error: opening mailbox という表示が出て、メール表示のない Index 画面になるのだ。

最新の何通かのみを受信する設定ができないかという方向で調べていたが、解決できなかった。

昨日ふと気づいた。FreeBSD の port ( mail/mutt-devel ) では、mutt デフォルトの gdm を使わずに、bdb ( バークレイ DB ) を使うようにしてある。別の選択肢ならば、tokyocabinet という、いままで私の使っていなかった データベースファイルだ。

ためしに、imap 情報をキャッシュするのに tokyocabinet を使う設定で再コンパイルして、caches ディレクトリを一から作らせてみた。スムーズに使えるようになった。

BDB で扱える制限を越えていたのか… いや違うな。header_cache は単一ファイルなんだ。私が気を利かせて、同名のディレクトリをあらかじめ作っていたのが敗因だ。

tokyocabinet はおもしろそうなデータベースファイルだから、結果オーライでよしとする。

pgp (gpg) 署名と既読管理 ( mutt の常用手段としては、既読のメールは別ディレクトリに移動することで処理を軽くするらしい) が未だできていないが、とりあえず使える状態にはなった。

ここにあった設定からの抜粋は、冗長に過ぎるのでざっくりとコメントアウト。 Gmail / mutt まとめに続きます

2010年2月26日

gmail / imap と mutt

送信

誤 : smtp_url = smtps://smtp.gmail.com/ エラーメッセージSSL failed: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

誤 : smtp_url = smtp://smtp.gmail.com/ エラーメッセージSMTP session failed: 530 5.5.1 http://mail.google.com/support/bin/answer.py?answer=14257

正 : smtp_url = smtp://user@smtp.gmail.com

古い情報、遅れた情報がありすぎて、Web の検索はあまり役に立たない。たとえば Port 番号は本家ドキュメントを見るべきだ。

最初に挙げたエラーで検索すると SASL は入れたかい ? という答をみた。ML はそれがあるよね、私も自分と同じ原因を、別の人の別のエラーメッセージに求めた回答をしたことが、かつてある。

SASL がないときのエラーメッセージは SMTP authentication requires SASL

google で解決策がわかる かも しれない。

原因はソースに当たるのが早い。現在目の前にある情況を把握して考えるには

2010年2月25日

テキストベースで生きたい

1.

先週、Thunderbird Thunderbird を 3.x 系統にあげてみた。使いやすくなったなぁ、色々の面で。

しかし、重いや。私のマシンでは ( 1.6GHz , メモリ 1GBytes , FreeBSD , X , fvwm2 , non Gnome ) 、Gmail / imap(s) がことに使いやすくなったのだけれどな。メール溜まりすぎ。

mutt をまたコンパイルしてみた。少しまじめに設定を読みかけている。

$ mutt -f imaps://user@imap.gmail.com/日本語らべる名 で、アクセスできることがさきほど実験できた。本気で設定するつもりが、増した。

メールが軽く読めるならば emacs キーバインドにも挑戦する気はあったが、設定の簡単なGnusでは日本語フォルダに対応できなかった。

2.

しばらく前に書いたわっさー向けのボットを作ろう という話、構想が進んでいる。

アイデアが無いからとりあえず先に作ろうと思っていた、似非占い師ボットよりも、人工無脳ぽく学習をして反応するヤツのほうが、設計としておもしろい。そらそうだ。ややこしいから面白いんであって。

環境を整えて、初期の発言データをごそごそと貯めてなどと考えつつ。ロジックが頭の中にできてから今日で3日目。

いや、およそ使い物にならないほどにややこしいロジックで良かったら、とうからできていたのよ。だんだん、実用的な条件で動きそうなものにシフトしているということ。この3日、アイデアが 考えてもこれ以上は進展していない 確認が取れているのも進歩のうち。

さて、昨日、PC に重い処理をさせながら、ボット用の ワッサー投稿スクリプトを使って投稿しようかな、と思った。

前は読める発言を全部読みたかったから、それに合わせたクライアントを作りたかった。その方向に沿うて、ニュースリーダ / MUA のようなものを構想していた。

いま、私のわっさとの付き合いかたが変わっている。ボットの構想も、自分の普段の行動をもしも自動でプログラムにやらせるとしたらどうするか、で考えている。それに合わせた、べつのクライアントの構想もできるわけだな。

前回に見たときから半年、わっさの API が充実してきたから、vim script で充分にクライアントができそうだな、つまみ食いのように読んで、ちょこりと評価を与え( [イイネ] )て、投稿して離脱するような。

似たようなもので、twitter.com 用のものがないかと調べた。3つあったが、評価が高く開発も進んでいるのが TwitVim

30分ほど、触ってみた。素晴らしい。日本語も通るし、Twitter だけならばこれで遊べる。解析するのも面白そうだ。

やってみたいことリストに、わっさクライアント by vimscript の作成が追加された。

3.

そして、この日記。Blogger.com も、ブラウザを使うの面倒。vim script で投稿したいね、前に tDiary を使った自分のドメインでやっていたように。

blogger の API 一覧を見ながら考えていたのだが、調べたら存在はした

Google Data API のサンプルプログラムを使う --パスにインストールされるものでなく、サンプルを使う-- とか、予想外の作りに対応・実験・評価できていない。また、別に日本人が作った、もっと大げさなものもあった気がする。

既存のプログラムを利用させてもらうか、自分であれこれ遊ぶかは別にして。これもやってみたいことリスト入り。

4.

テキストだけで生活したい話は、私のリストでは比較的高順位。

だが一説では、マシンをもう一台調達し、データを同期する仕組みを作って、片方で開発や更新を遊びながら、もう片方でネットを遊ぶというローテーションを組めば必要が無いんじゃないか という疑いもある。

2010年2月13日

テクニカルな覚え書き -1-

読み返すと、年が明けてから、ひとつとてテクニカルな話題を書いていない。

わっさー 用のボットを作るかもしれない、途中で投げ出すかもしれない。ちょこちょことアイデアだけはある。

昨九月に、ワッサー・ゲイザー という開発コードで、MH 風のメッセージで各記事をまとめて、メーラとして読んだり、高評価をつけるという話をしていた。

そのプロトタイプで、Perl でダウンロードツールを作って自分の記事をローカルに保存してみたりしたが、メモリリークを解消することができずに、これでは公開もできないと放ってある。

その時には、API を使うことにこだわり、さらに API で不足な部分を ユーザ用の Web から取ってくることに頭が凝り固まっていて、先に進まなかった。

2週間ほど前に、Gtalk からメッセージを送受信したら一番楽であることに気づく。気づいたきっかけは、ボット好きのユーザと知り合ったこと。

ならば、私もボット作ってみようじゃないか。もう、自分が読める記事を全部読もうと思わなくなったし、メーラ風のインタフェイスを作る興味も失せたが。リハビリには良いだろう。

というわけで、最初に入れた Perl のモジュールは、Net::XMPP3 。jabber で使われる XMPP プロトコルで、メッセージを送受信するためだ。

Net::XMPP がバグを抱えたまま長くメンテされていないので XMPP3 という名前で bug fix した、のだそうだ。ただし、インストール時のテストプログラムの名前が Net::XMPP のままになっている。

アカウント設定などの周辺作業を了えて、さて、ちょっとテストしようかというところで、PC が壊れて中断していた。

今日、Ports の更新をしていて、p5-Astro というジャンルがあるのに気づいた。

おりしも昨日、発言として 日出・月出・月齢告知 機能をつけると宣言したばかり。ここから使えるものがあるかな ?

Astro::MoonPhase , Astro::SunTime , Astro::Sunrise というのがある。

Astro::SunTime よりも、Astro::Sunrise のほうが、きめ細かな指定ができそうだとインストール開始。タイムゾーンを取得できないと、インストーラがテストで停まる。

PERL_DL_NONLAZY=1 /usr/local/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/00load.t ....... ok
Subroutine main::ok redefined at t/01basic.t line 9
Cannot determine local time zone
# Looks like you planned 237 tests but ran 232.
# Looks like your test exited with 2 just after 232.
t/01basic.t ...... 
Dubious, test returned 2 (wstat 512, 0x200)
Failed 5/237 subtests 

ports 更新作業をしながらのかたわら、あまり重い処理をさせるのは鬱陶しいので、軽く流す程度に調べていると、CPAN の中には DateTime::Event::Lunar というのもあるのを発見。こちらをまずインストール。

依存で入った、DateTime::Util::Astro が、太陽と月の出入り、月相くらいならば計算できるようだ。私は DateTime 型を他でも使っているので、こちらでテストして、うまくいけば常時稼働環境に仕込むことに決めた。

2009年11月20日

NHK のラジオニュースをインターネットで聴く

NHK 国際短波ラジオのニュース( mms://wm.nhk.or.jp/rj/on_demand/wma/japanese.wma )が、ネットから音声だけでざっくり聞くには、時間も手頃で良かったのだが。

最近、更新が不定期なのが酷くなって、24時間以上も前のニュースだったりする。

やむをえず、r-news の最新を、ブラウザを立ち上げずにコマンド一発で聴くスクリプトをざっくりと書いた。(改訂があったので初期ヴァージョン省略)

60秒のバッファはてきとうに。

え? mplayer 側でバッファを指定すれば良いじゃないかって? いや。人間もうっかり聞き流してしまい、巻き戻して聞き返したりするからローカルキャッシュは必要なのです。

2010年12月/改訂

NHK の出す HTML が変わったので、対応しました。

ついでに 他のプロセスが音楽を鳴らしていたら一時停止ダウンロードだけしておいてあとで聴く の二つの機能を追加。

#!/bin/sh -euf
#
#   $Id: nhk-long.sh,v 1.7 2011/01/12 13:38:32 yaemon Exp $
#
WGET=/usr/local/bin/wget
MIMMS=/usr/local/bin/mimms
ASX=`$WGET -O - http://www.nhk.or.jp/r-news/ | \ grep asx | head -1 | nkf -w | sed -e 's/.*href="//;s/".*//;' `
MMS=`$WGET -O - $ASX | \ grep HREF | sed -e 's/.*="//;s/".*//'`
OUT=`echo $ASX | sed -e 's:.*/::;s/_.*_/_/;s/\.asx$/.wma/;'` OUTFILE=$HOME/download/nhk/$OUT

if test -f $OUTFILE ; then echo "file exist: $OUTFILE" 1>&2 exit fi
if test $# -ge 1 && test "$1" = "download" ; then $MIMMS $MMS $OUTFILE else $MIMMS $MMS $OUTFILE > /dev/null 2>&1 & sleep 90 MUSIC=`pgrep ogg123 || pgrep mplayer || true` if test ! -z "$MUSIC" ; then kill -STOP $MUSIC sleep 2 fi /usr/local/bin/mplayer $OUTFILE if test ! -z "$MUSIC" ; then sleep 2 kill -CONT $MUSIC fi fi

2009年11月19日

今晩の東京は、星降る夜

動画を観る

ひさびさに YouTube をみた。

テレビを観ないで20年経ったので、たいがいの歌手をしらない。ちかごろ YouTube のこの歌が良かったよ という話をよく読むので、興味を惹かれてよく観る。[関連動画] でおもしろそうなものも辿る。途中で時間がなくなり、[クイックリスト] に仮に並べたものを、未整理と名づけたリストに保存する。

気づけば、半年で 108 の未整理 = まだ観ていない動画が溜まっていた。

いま、ひさびさに flash blocker を切って、自動連続再生で 108 曲連続で流している。

しらなかった歌手とか

すでに整理済みのところから挙げると、ミュージカル映画が好きなのに、Funny Girl , チキチキバンバン に私好みのシーンが集まっているのを知らなかった。いつか映画館や DVD で通して観たいものだ。

川崎あいとか、青山テルマという歌手も知らなかった。

いま連続して、山崎まさよしの曲が流れている。

耳にしたことがあるがいくら探してもないな、と思ったら パセリ で探してもないわけだ。セロリ

と書いて笑われたことがあるくらいに知らなかったが、フォークの系譜で落ち着く。風味堂といっしょに教えてもらったのだったかな。

そういえば、Michael Jacksonミハエル・ジャクスン と読みそうになるのは、私だけ?

いまは Jacque Brel が連続して流れている。30年ほど前のシャンソンが好きだから、むろん名前は知っていたが。女性歌手の声で馴染みのある名曲の数々が、この夭逝した歌手の作詞作曲と思って聴くと興味深い。

手許で視聴する

著作権にどうなの、という話もあるが。

前に、雑記帳でDownload Helper の話を書いたことがあるが、100回のダウンロードで金を払うことを求められたので乗り換えた。

今は、 Net Video Hunter を使っている。日本語 (や、C ) がファイル名から落ちるのが問題だが、直感的に使える。

もってきたファイルを、今はこんなスクリプトで mp4 にして保存している。フラッシュのファイル( .flv ) だと、 mplayer で再生できないファイルも多いので。

ffplay コマンドだと、一つ終わっても次に行かないで停まってしまう。

気軽にさっくりあげたが、ffmpeg で作る mp4 ファイルはやたらにファイルサイズが大きいので、納得のいく形式を探してある日いちにち費した代物。

#!/bin/sh -eu
#
#   flv2mp4.sh      2009-10-20 yaemon
#
BACKUPDIR=$HOME/video/flv_backup
MP4DIR=$HOME/video
LIST=flv2mp4.`date +%m%d`
for file in *.flv ; do echo $file base=`echo $file | sed -e 's/\.flv$//;s/ /_/g;s/^YouTube_-_//;'` if ! test -f $MP4DIR/$base.mp4 ; then if ! ffmpeg -sameq -i $file -f avi /tmp/$base.avi ; then echo "Can't convert to .avi $file . abort" rm /tmp/$base.avi exit fi if mencoder -profile encoding /tmp/$base.avi -o $MP4DIR/$base.mp4 ; then rm /tmp/$base.avi mv $file $BACKUPDIR echo "$MP4DIR/$base.mp4" >> $LIST else echo "$MP4DIR/$base.mp4 exist. skip" fi fi done
$ cat $HOME/.mplayer/mencoder
[encoding]
quiet=yes
of=lavf=yes
lavfopts=format=mpeg4
ovc=lavc=yes
oac=lavc=yes
lavcopts=vcodec=mpeg4:acodec=libfaac:mbd=2:trell=yes:v4mv=yes:vglobal=1:aglobal=1:autoaspect=yes
noencodedups=yes
noskip=yes

音楽を聴くときの演奏はこんな感じ。

$ cat $HOME/.mplayer/config
[default]
volstep=100
# osdlevel=3
osdlevel=1
fs=yes
ao=oss
[sound] softvol-max=30 quiet=yes vo=null
$ mplayer -profile sound ~/video/*mp4

2009年11月10日

8日 [思いつき] のフォローアップ

思いつき関連のフォローアップ

家計簿などについては、ez アプリの開発が一番手早そう

リソースは au のezアプリの開発資料に書いてある辺りが調査の取っ掛かりか。

最初の予定、オープンアプリ / Jblend は、アプリクス周りを5分見た感だけでは開発環境とライセンスがわからない。まだ本腰入れて調べていないのだが

jfbterm での日本語環境に uim-fep を使えるはずだが、fep の On/Off が動かない。~/.uim の記載は間違いないと思うのだがなぁ

uim-fep で Anthy の辺り (本家)

uim は FreeBSD→ports→pkg-discr に書いていないが Wnnサーバとも通信できるのを知った。なんだ。もっと早く見ておけば良かった。(いや、むかし見たときには開発途中だった記憶があるのだが)

screen / onewは UTF-8 に対応していないっぽいから却下

おまけ : モバイルサイトの input 要素の入力モード指定