Tangerine

情報隠蔽

せっかくOOスタイルで書いてるのに、モジュールの中で情報隠蔽が破れてるところがいくつかあったので、きちんとアクセサを介してオブジェクトに触れるように修正。定めたインターフェースを介してデータに触れたほうが、実装の変更に対して壊れにくいし、な…

sub import

んー、実装に悩む。どう書いたら一番スマートなものか…。現状はまだRegexp::Assembleに依存してます。本当はこれに依存させたくないんだよね。だいたいは思いついてるので、あとで書いて試してみます。あ、今日はTangerine::Core::Listが増えました。List::U…

sub import

ちょっとずつ手を入れては走らせてみるのをひたすら繰り返し。exceptを指定して特定のプラグインを使わないようにできるようにしようかと思って、手を入れてみる。まだ書きかけ。

明日やること

perldoc -f ref を読む。 Regexp::Assembleに対する依存の排除。 sub pluginsのリファクタリング。

またちょっと書き直し

昨日書き直したばかりだけど、Class::Data::Accessorは使わないようになりました。Class::Data::Inheritableだけ使います。それ以外にも小さい書き直しをいくつか。&Tangerine::importが少し汚いから、明日はこれに手を入れてみよう。

pluginsメソッド

sub plugins { map { $_->new } sort plugin_sort grep { /Plugin::(?:(?!Base|NoMatch).)+$/ } _plugins(@_); } grepしてsortしてmap。…さすがにこれはちょっとどうよ?とか思わないこともない。

Class::Data::InheritableとClass::Data::Accessor

Class::Data::Inheritableを使おうかどうしようかってところ。これ使った方がスマートに書けそうかな。ドキュメント読んで試してみよう。 追記 [22:03] Class::Data::Accessorも使うことに決定。これ使った方がスマートな書き方に出来る。しかし、コア以外の…

モジュールの読み込みにオプションをつける

use Hoge foo => 'bar'; みたいな感じで、読み込むときにオプションを設定できるようになっているモジュールがあります。例えば今私が使っているModule::Pluggableなんかもそうです。こういう実装をするにはどうすればいいのかと思って、ソースを読んでみた…

Tangerine::Core::Log

ああもういいや。キモい実装だけどこれで書き上げてしまおう。もうめどい。

Singleton

Tangerine::Core::Logを書くのに、デザインパターン 初めの一歩:Singleton - hibomaのはてなダイアリーとか読みながら、自分でSingletonなクラスを設計しようか、CPANモジュールを使おうかとか悩んでるところ。とりあえず今はClass::Singletonのサブクラス…

調べ物

Tangerineを書く上で気になることとかいろいろと調べ物。Perlでどう書けばいいのか、とか。ついつい範囲外のことまで調べてしまうのが困り物だけど。今日はコードを書くよりも調べ物をしてる方が多かったかな。

ログ

どう実装しようかちょっと悩み中。Tangerine::Core::Logを書いて、T::Plugin::Baseの親にしようかなと思ってる。T::P::Baseにログ関連の機能を持たせないのは、スクリプト中からもクラスメソッドとして呼び出せるようにしたいから。T::P::Baseに実装したとし…

明日すること

Google Code SearchとkodersでClass::Singletonを使ったコード例を探す。

ファイルの比較

とりあえず[]T::P::Base->equal($src, $dest)[]メソッドを作りました。ファイルの内容はFile::Compareで比較することにしたけど、条件分けがめどい。 []@{$dests}[]が全て存在する。 []@{$dests}[]は全て[]$src[]と同じ内容である。 []@{$dests}[]は全て[]$s…

File::Spec

$dest = File::Spec->rel2abs(File::Spec->catfile($self->_dir, $file)); とか、File::Specを呼んでる場所があって、しかもディレクトリ掘るのに相対パスだとまずい*1から、相対パスを解決してフルパスにするのに上の例みたいに二重に呼び出してるのがなん…

Tangerine::Plugin::Base::Rename

少しだけ手を入れて、とりあえずこれは完了でいいかな。次はT::P::Base->moveの、ファイルの比較まわりに手を入れないと。

うー

あんまり気分が乗らないので、ほとんどコード眺めてるだけだけど、それでも現状でわかってる問題点だけはメモしておこう。 $plg->destまわり。if ($plg->can('rename')として、プラグインごとにrenameメソッド持たせるか検討中。この場合も基本的ないくつか…

テストケース

書いた方が効率がいい気がする。というか、普通に考えたらまず間違いなくそうだよね。Test::SimpleとかTest::MoreとかTest::Harnessとかかな。 Test-Simple-0.98_05 - Basic utilities for writing tests. - metacpan.org Test-Harness-2.65_02 - use a Perl…

ところでここ何日かずっと書いてるTangerineってなにさ?

そういえばまだ一度も書いてないよね。Tangerineはファイル名から判断して、ファイルを適切な場所へ移動するツール。必要なら自動でリネームもしてくれます。プラグインも使えます。というかプラグインを書かないと使えません。実装言語はPerl。ただいま作成…

妄想

今突発的に思いついただけだから具体的な形はないけど、Tangerine::PluginMakerみたいなクラスがあって、YAMLか何かでほげほげごにょごにょ書いて渡してやると、自動でPluginを書いて、ふさわしいディレクトリにインストールしてくれたりするとすごく嬉しい…

moveメソッド実装

これでやっとファイルの移動処理が実装できたかな。すでに存在していたりする場合の処理もきちんと組めてるはず。List::Utilに依存するようになったけど、これはコアモジュールだしまあいいよね。List::MoreUtilsで定義されてるサブルーチン*1も使ってるけど…

覚え書き

disorganisedを16^3に分割。 完了。さすがに8000を超えるファイル*1を手作業で移動するのは死ねるので、書き捨てのちょっとしたスクリプトでやっつけ仕事。 上にあわせてT::P::ImgBBS->destの変更。 完了。1行の変更で済んだ。 T::P::Base->move。File::Comp…

moveメソッドの定義場所

同じ処理を何回も書くのは嫌いなので、メソッドに括りだしてしまったほうがいいね。使い回しも利くし。世の中にはDRYというコトバもあることだし。自分でモジュールを書くようになると、再利用性の素晴らしさが身に沁みて実感できる。moveメソッドをどこで定…

any

また少しずつ書き足したり削ったり。List::MoreUtilsのanyだけ使いたかったので、useする代わりにコピペ。ただし、ちょっとだけ弄ってみた。 sub any (&@) { my $f = shift; return if !@_; foreach (@_) { return 1 if $f->(); } return 0; } オリジナルは…

気分が乗らない

やりたいことは決まってて、どう実装したらいいかもわかってる。あと足りないのは、頭の中のモノを実際のコードに落とす気力。

moveももう少し書き直せる。古いコードも参考にしながら手を入れよう。

節約節約

ちょっと書き直し。オブジェクトを使いまわせるところは使いまわした方がいいよね。いちいち新規に作るのもコストがかかってアレだし。

destメソッド

destメソッドはもう少し手を入れないと。繰り返してる部分が多いから、そのあたり別のメソッドに切り出せる。返値も今はスカラーか配列リファレンスだけど、必ず配列リファレンスを返したほうが簡単になるね。

継承しよう

いろいろ書いてみる。プラグインを書くのに、各プラグインで共通するメソッドをプラグインごとに書くのも面倒だし、DRYじゃないから、baseプラグマで継承するようにしてみた。今のところ、クラス固有の値とコンストラクタ以外のメソッドは全部スーパークラス…

ImgBBS用の正規表現

モジュールに切り出すか、iniなりyamlなりで書いたconfigurationから読み込むかちょっと検討中。モジュールにした方が全体として綺麗に纏まるんだけど、configurationの方が編集が楽なんだよね。不便なプログラムは使う価値が無いけど、美しくないプログラム…