月曜日, 3月 30, 2009

00ガンダム テレビ版

「人類を超越した主人公が世界最強のロボット兵器に乗って、人類に相互理解を訴えるお話」

と書くと、ものすごくひどい話に思える。

00ガンダムは1stをW経由でやり直していると思っていたので、最後は全ガンダム廃棄(オリジナル太陽炉廃棄)だと予想していたけど、全ガンダム残っているという、正反対の結果にちょっと驚いたり。
劇場版のためなのかもしれないけど、一基ぐらい壊れてもいいんじゃないかと思うんだけどな。
どうせティエリアはヴェーダになったんだし、もういらないでしょ。

劇場版ではもうちょっとマシな展開になるんだろうか。
00ガンダムの木星にまつわる設定は「オリジナル太陽炉の生産場所」程度なわけだけど。何があるんだろ。
イオリア計画という前振りから考えると、既に外宇宙から知的生命体が来ているという展開もありだろうし、巨大な黒い板とオーライザーのバトルとか、せっちゃんがスターチャイルドになるとかそういう面白映画になることを期待しよう。

金曜日, 3月 27, 2009

癒し系ソフト2

ライブラリリファレンスを見ていたら、標準ライブラリだけでもプログレスバーを作れることに気付いたので、作ってみた。
Tkinterの拡張であるTixを使えばよいらしい。

Python3.0とPython2.6で動作を確認済。
try:
from tkinter import DISABLED
from tkinter import Frame
from tkinter import Button
from tkinter import tix
except ImportError:
from Tkinter import DISABLED
from Tkinter import Frame
from Tkinter import Button
import Tix as tix

class Window(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self._p = 0
self._stopFlg = False

self.pack()
self.createWidgets()
self.progress()

def createWidgets(self):
self.stopButton = Button(text='now progress', command=self.stopToggle)
self.stopButton.pack({'side': 'bottom'})

self.meter = tix.Meter(value=self._p)
self.meter.pack({'side': 'bottom'})

def stopToggle(self):
self._stopFlg = not self._stopFlg
if self._stopFlg:
self.stopButton.configure(text='now pause')
else:
self.stopButton.configure(text='now progress')

self.progress()

def progress(self):
if self._p < 1:
if not self._stopFlg:
self._p = self._p + 0.001
self.meter['value'] = self._p
self.after(10, self.progress)
else:
self._p = 1
self.stopButton.configure(text='finished', state=DISABLED)

if __name__ == '__main__':
root = tix.Tk()
app = Window(master = root)
app.mainloop()


Tkinterの使い方は紫藤のページさんの記事を参考にしました。

火曜日, 3月 17, 2009

足立美術館 五つ星

2年くらい前に行った、島根県の足立美術館がミシュラン観光ガイドで3つ星を獲得したそうです。
厳密に言うと、足立美術館は2つ星で、3つ星とったのは足立美術館の日本庭園だそうですが。
わざわざ分けたのは、美術館が持っている横山大観コレクションを別枠にしたかったのかな?
事情はともあれ、合計5つ星取っている観光地ってミシュランの中でも珍しいんじゃないだろうか。

あの庭園は、島根に行く機会があるなら絶対に見るべき価値があると断言出来る。それどころか、島根に行ってあれを見ないなんてありえない、と言いたいくらい素晴らしいのですが、今回の3(+2)つ星で大混雑になっちゃうのかなあ。
前に行ったときでさえ、結構混んでたのに。

日曜日, 3月 08, 2009

癒し系ソフト

最近ずっとPerlに触っていて、ちょっと疲れたのでPythonで息抜き。


プログレスバーがだんだん伸びていくのを見ると、とても落ち着くので、そのためだけのアプリを作ってみました。
実行イメージはこんなかんじ。



一時停止も出来る。



面倒なので画面はGladeで適当に。プログレスバーの終了処理は適当過ぎるかもしれないけど、ネタでしかないので気にしない。
一応3分で完了するはずだけど、あまり厳密ではない。そもそも、癒されているときにそんなことを考えないので、実用(?)上問題ない。


基本的な機能は20分ほどで完成。プログレスバーの使い方を調べるのにちょっと時間がかかった。で、ダラダラしたり、Perlについて調べたりする合間に、適当にやっているうちに出来あがり。やはり慣れている言語だと速い。調べたこともライブラリの使い方であって、Pythonそのものについて調べるなんてことはまったく無し。
Perlでもこれくらいさくさく書けるようになるだろうか。


以下、コード。ui.gladeは適当に。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import gtk
import gtk.glade
import gobject


class Progress(object):

def __init__(self):
self.gladefile = 'ui.glade'
self.wTree = gtk.glade.XML(self.gladefile)

self.window = self.wTree.get_widget('window')
self.progress = self.wTree.get_widget('progressbar1')
self.button = self.wTree.get_widget('togglebutton1')
self.flag = True

self.window.connect('destroy', gtk.main_quit)
self.button.connect('toggled', self.on_toggled)

self.timer = gobject.timeout_add(100, self.update_progressbar)

def show_all(self):
self.window.show_all()

def update_progressbar(self):
if self.flag:
current_fraction = self.progress.get_fraction()
if current_fraction < 1:
self.progress.set_fraction(current_fraction + 0.000556)
return True

def on_toggled(self, *args):
self.flag = not self.flag
if self.flag:
self.button.set_label('ぷろぐれすちゅう')
else:
self.button.set_label('ていしちゅう')


if __name__ == '__main__':
prog = Progress()
prog.show_all()
gtk.main()


99%でなかなか終わらないとか、60%ぐらいで0%に戻る機能も考えたけど、癒し効果が無くなりそうなので、やめました。

木曜日, 3月 05, 2009

Perl学習中 ここ数週間の成果

ここ数週間の頑張りの成果。
CSVから配列を作るサブロジックと、配列からハッシュを作るサブロジック。
最終的にハッシュからDBにinsertするものを作りたかったけど、そこはDBIx::Classにお任せすることにした。
一応インサート文を組み立てるサブロジックも作ったけど、使うのはちょっとどうかと思う作り。手元のソースからはあとで消そう。
そうなるとモジュール名も変えなきゃ。

Csv2Db.pm


#!/usr/bin/perl -Ilib
package Csv2Db;
use strict;
use warnings;

use IO::File;
use Text::CSV_XS;

sub csv2array {
shift;
my $file = shift;

my $csv_reader = new Text::CSV_XS( { binary => 1 } );
my @_line = ();
my @csv_lines = ();

while (<$file>) {

#CSV_XSを利用し、カラムを分解する
$csv_reader->parse($_)
|| die "error: " . $csv_reader->error_input() . "\n";
@_line = $csv_reader->fields();
push( @csv_lines, [@_line] );

}
return @csv_lines;
}

sub array2hash {
shift;
my ( $schema, $csvlist ) = @_;

_check_hash_refference($schema);
_check_array_refference($csvlist);

my %hash = ();

foreach my $key ( keys %$schema ) {
$hash{$key} = @$csvlist[ $schema->{$key} ];
}
return %hash;
}

sub createInsertSql {
shift;
my ( $table, $valueHash ) = @_;

_check_hash_refference($valueHash);

my $fields = '';
my $sql = "INSERT $table SET ";

foreach my $key ( sort keys %$valueHash ) {
$fields = $fields . "$key='$valueHash->{$key}', ";
}
$fields = substr( $fields, 0, -2 );

$sql = $sql . $fields . ";";

return $sql;
}

sub _check_hash_refference {
my $hash = shift;
die 'Undefined Hash..' unless defined $hash;
die 'Not a HASH refernce..' unless ref $hash eq 'HASH';
die 'Empty Hash..' unless keys(%$hash) > 0;
}

sub _check_array_refference {
my $array = shift;
die 'Undefined Array..' unless defined $array;
die 'Not a ARRAY refernce..' unless ref $array eq 'ARRAY';
die 'Empty Array..' unless $#$array > -1;
}
1;



ここからテストコード。

01_csv2db_csv2array.t


use strict;
use warnings;
use Test::More;
use File::Temp qw( tempfile );

use Csv2Db::Csv2Db;

plan( tests => 2 );

#test1
{
my ( $tmp, $filename ) = tempfile();
print {$tmp} "0,k,hiro,m\n1,k,mai,f";
close($tmp);

my @result_arr
= ( [ ( '0', 'k', 'hiro', 'm' ) ], [ ( '1', 'k', 'mai', 'f' ) ] );

open( $tmp, "<", $filename );
my @res = Csv2Db->csv2array($tmp);
ok( eq_array( \@res, \@result_arr ), 'normal pattern' );
close($tmp);
}

#test2
{
my ( $tmp, $filename ) = tempfile();
close($tmp);

open( $tmp, "<", $filename );
my @res = Csv2Db->csv2array($tmp);
ok( eq_array( \@res, [ () ] ), 'empty file' );
close($tmp);
}



02_csv2db_array2hash.t


use strict;
use warnings;
use Test::More;

use Csv2Db::Csv2Db;

plan( tests => 7 );

#normal
{
my %schema = ( 'id' => 0, 'fname' => 2 );
my @arr = ( '000', 'k', 'name' );
my %result = ( 'id' => '000', 'fname' => 'name' );
my %test = Csv2Db->array2hash( \%schema, \@arr );
ok( eq_hash( \%test, \%result ), 'normal case' );
}

#undef hash
{
my @arr = ( '000', 'k', 'name' );
my %result = ( 'id' => '000', 'fname' => 'name' );

eval { my %test = Csv2Db->array2hash( undef, \@arr ); };
like( $@, qr/Undefined/, 'undef schema' );
}

#empty hash
{
my %schema = ();
my @arr = ( '000', 'k', 'name' );
my %result = ( 'id' => '000', 'fname' => 'name' );

eval{my %test = Csv2Db->array2hash( \%schema, \@arr )};
like( $@, qr/Empty/, 'empty schema' );
}

#not hash
{
my @schema = ();
my @arr = ( '000', 'k', 'name' );
my %result = ( 'id' => '000', 'fname' => 'name' );

eval{my %test = Csv2Db->array2hash( \@schema, \@arr )};
like( $@, qr/HASH/, 'not a hash' );
}

#undef arr
{
my %schema = ( 'id' => 0, 'fname' => 2 );

my %result = ( 'id' => '000', 'fname' => 'name' );

eval { my %test = Csv2Db->array2hash( \%schema, undef ); };
like( $@, qr/Undefined/, 'undef array' );
}

#empty arr
{
my %schema = ( 'id' => 0, 'fname' => 2 );
my @arr = ();
my %result = ( 'id' => '000', 'fname' => 'name' );

eval{my %test = Csv2Db->array2hash( \%schema, \@arr )};
like( $@, qr/Empty/, 'empty array' );
}

#not hash
{
my %schema = ( 'id' => 0, 'fname' => 2 );
my $arr = 'not a array';
my %result = ( 'id' => '000', 'fname' => 'name' );

eval{my %test = Csv2Db->array2hash( \%schema, \$arr )};
like( $@, qr/ARRAY/, 'not a array' );
}



03_csv2db_createInsert.t


use strict;
use warnings;
use Test::More;

use Csv2Db::Csv2Db;

plan( tests => 1 );

#createInsertSql
my $table1 = 'main_table';
my %values1 = ( 'id' => "000", 'fname' => "hiro" );
my $sql1 = Csv2Db->createInsertSql( $table1, \%values1 );
is( $sql1, "INSERT main_table SET fname='hiro', id='000';" );



PODを一切書いていないので、書かなきゃですね。
とりあえず目標期間内にここまで作れたのでOKとしよう。

水曜日, 3月 04, 2009

Perl学習中 リファレンスとアルパカ本

どうやら今のレベルでPerlで書いていて、一番引っかかるのはリファレンス関係らしい。

そして、リャマ本(第二版)にはリファレンスについてほとんど書いておらず、モダンPerl入門はリファレンスは知っていて当然というスタンスという、自分にとって一番必要な情報が書籍として手元に無いというひどい状態。

で、更に書籍追加ということで「続・初めてのPerl(改訂版)」を買ってきた。目次を見ると分かる通り、前半は大体リファレンスについて書かれている。おかげで「なんだか良く分からないけど、バックスラッシュつけたら動いたよ」程度の認識だったリファレンスについて、というよりか、何でリファレンスを使うのかについて分かってきた。
リファレンスも慣れれば自由自在に使えるんだろうか。

目次のURLを取るためにオライリーを見に行ったら今度はマスタリングPerlが発売されるらしい。
目次を見ても何言っているのか分からないので、今買う必要は無さそう。
どちらかというとPerlベストプラクティスのが欲しいかな。
ラクダ本はPerl6がちゃんとリリースされてからでいいや。