なんでPimple、ArrayAccessなのかな〜

ふつうに $container->get('namae')でいいじゃんね作者がphp人生一度は訪れるというArrayAccess期だったんすかね〜と思ったのですが、


ところでArrayAccessとは!

これ。PHP: ArrayAccess - Manual

連想配列のようにアクセスできる(内部でメソッドが呼ばれる)というちょっとかっこいい機能である。perlだとTIEぽいかな。


もしコンテナに(オブジェクトではなく)連想配列を突っ込んで使う場合に、5.3でも直接その値のキーにアクセスできて便利だからじゃないかなーと思いました。

PHP 5.4 以降では、関数やメソッドの返す結果を直接配列として扱えるようになりました。 以前は、いったん一次変数に代入しないと配列としては扱えませんでした。

why Pimple uses ArrayAccess interface?

みたいな項目がトップにあっても良いかと思ったのですが、5.3が過去のものになりつつありますのでまあいいです

use Pimple\Container;

$container = new Container();
$container['namae'] = array('foo' => 'foooo');
print_r($container['namae']['foo']); // => "foooo" 5.3でも取れるぅ
function get($key)
{
    $c = array(
        'namae' => array( 'foo' => 'foooo')
    );

    return $c[$key];
}

print_r(get('namae')['foo']); // =>  PHP Parse error:  syntax error, unexpected '['

fabricとhostと私 2014

fabric、fabfileかかなくても

fab -H "web1, web2" -- "hostname"

みたいにできるのがかわいくて好きだ

ところで、2.x系では @task(depends="foo") のような依存関係が解決されるAPIが追加されるらしいのだけど、今versionではそれは無いので自分で書くことにした。

fabric.api.task()をwrapperした@commandというデコレータとすることにした。@taskの代わりにこれを使っておくと、envを調べてて規定の前処理がおわってないとそもそも動かない、みたいな。

デコレータ機能が追加されてからまじめにpython書いたのがひさしぶりだー。@command@command()両方をサポートしないといけなくなるとデコデコしてくるのがアレだな。

@runs_once
def check_env():
    # なんかしらべて場合によってはabort()
    pass


def command(*args, **kwargs):

    # @command(role="web", ...) or just @command
    invoked = bool(not args or kwargs)

    def deco(func):

        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            execute(check_env)  # <-- check env!
            return func(**kwargs)

        if len(kwargs) > 0:
            return task(**kwargs)(wrapper)
        else:
            return task(wrapper)

    if not invoked:
        return deco(args[0])
    else:
        return deco

とちゅうでハマったのだけど、fabricはtaskの対象hostの扱いがややカオスなので要注意だ。

env.hosts, -H, -x@hosts=...、roleなどが関係してくる。あと、Taskクラスはインスタンス化される前にその対象ホストが解決されるので、タスク自体が動き出した後はできることが限られているのが要注意。

あと、execute()documentでwarningされているように、気をつけないと同じタスクが倍々に動いてしまうことがあるので要注意。

そこだけ気をつければ思ったようにうごいてそこそこ良かった。

metacpanに++しよう

https://www.facebook.com/n.tomita/posts/10151588193792010

めんどくさいことはいつまでたっても面倒なので、簡単なところからまず

perlのエコシステムであるcpanについては、ひごろ search.cpan.org ではなく https://metacpan.org/ を使うようにし、一案件終わったら(もしくはなんとなくイイネと思ったらすぐ) 該当モジュールを ++ すると良いんじゃないか。

Makefile.PLとかcpanfileからモジュール抜いてまとめて++する君があってもいいかもね

gemなどにもいえることだけど、モジュール検索エンジンは一番いいのを出すというところまで進化するのむずかしい。モジュールの更新量はなんだかんだでハンパないし、世の中的にどんどんキラキラネームが増え名前だけじゃ何をしたいものなのかわからないことが増えつつあり、ふつうにgoogleすると古い情報がおおい。

前に本を書いた時にきにしていたことはこのへんに書いたけど いまだと metacpan.org の ++ がそんだけでだいぶ良いんじゃないか。(search.cpan.orgにも★5方式のratingがあるのだがamazonとかitunes storeみたいにその方式だとありがちな★1つけて文句を言う場を兼ねているのであてにならない)

ログインして++すると公開情報となるので、++が増えたあとも++主によるスコアリングとかやりようがある。

https://metacpan.org/favorite/recent

※watcherに、あの会社あらたにあのジャンルを取り組み始めたーなどがわかる場合もあり、そういうのがセンシティブな職場の人はまとめてやるとかそういう方が良いかも知んない。これはbookmarkにもいえる

ここまで書いておきながら、ぼくがけっきょく(まだ誰も++していなかった!)サイクロンさんのGCMのやつにしか++していないことがわかっちゃいます。てへ

エクセルと私 2013 春

DBにつっこむ元データ、「1行1レコードの感じで作ってくれればいい感じにとりこみます〜」、とだけ言っておいたもののうっかり放置していたら驚きの、大量複数シート、セルの結合などを駆使したリッパなエクセル出来上がってしまっていてOMG

xlsのパースを・・・ 2013年にやることになるとは。 何が良いのだろう・・・ (google docsに上げてそっちのAPIを使う手もあるがね。)

IRCで聞いたら他部署で PHPExcel とやらを使った事例があったとか。
見てみたらなんと! ドキュメントがわざわざword形式でできているww
なかなかのこだわりですねww ウケた

pypiみてたら、超かっこいいキラキラネームがあった
https://pypi.python.org/pypi/excellent/0.0.2

エックセレントゥゥ!

ステキ (・◡・ 人)
ただしこいつwrite用だけだ。そんなにエクセレントじゃない

けっきょくcpanみてたらExcel::Tableというのがある。こいつはラッパーモジュールで、どうやらxlsについては今でもなつかしのSpreadsheet::ParseExcelが、そしてxlsxについてはSpreadsheet::XLSXというのを使っている。

use strict;
use warnings;
use utf8;
use lib "extlib/lib/perl5";
use Data::Dump qw/dump/;

use Excel::Table;

my $excel = Excel::Table->new;
my $book  = $excel->open('DB/おさっしください.xls');

for my $sheet ($book->worksheets) {
    warn $sheet->get_name;
    dump $excel->extract($sheet->get_name, 0); // disable title_row
}

フツーにうごく。よかった。

ただし

_人人人人人人人人人人_
> 突然のLog4perl! <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

まあいいけどね。

あと https://metacpan.org/author/JMCNAMARA Spreadsheet::ParseExcel の作者のアイコンが怖い ( ;д;)

f:id:tomi-ru:20130409184450p:plain

こっちを何かが見ている!

use feature qw/dot/;

perlが、featureっていうプラグマモジュールをつかって新機能をついかするってのを5.10からできるようになってるのですが、

use feature 'say';

たとえばこうすると組み込みのsay関数が使えるようになる。みたいな。これなら普通に use 5.012; とかでまとめてONにする方がよかったのですが、すごい(いい意味で)変態なのが出てきておもしろい(まだbranchesで、どう?って状態

http://www.nntp.perl.org/group/perl.perl5.porters/2011/11/msg178772.html

use feature 'dot';
use HTTP::Tiny;
my $response = HTTP::Tiny.new.request('HEAD', $url);
say "Hello" ~ "world"; # => "Helloworld"

わーい  ->  のかわりに .がつかえるよー(^∀^) (文字連結は~)

でも思ったよりそんなに見やすくないですねwww

昔、perl始めたころ、こんなこと妄想したなあとおもって調べたら、ちょっとだけ残ってた。

http://clip.livedoor.com/page/547685/Elementary,%20...%20LLDN%E3%81%AE%E6%84%9F%E6%83%B3%20-%20use%20dot;%20%E3%81%A8%E3%81%8B%E3%81%A9%E3%81%86%E3%81%8B%E3%81%AA

2005年かあ。記事のブログの拡張子がphpであるところを見るとwordpressからの引っ越し時に消したみたいです。そのときは、たしかドットじゃないけど autoboxっていう近いのがあるよって誰かがおしえてくれたはず。6年のときをへてまさか現実的なものになろうとしてるとは。

Tumblrべんり

http://e8y.net/blog/Movabletypeなのだけど、次なんかブログやるときはホスティング形をつかおうと思ってました。今回、http://cpanbook.koneta.org/ つくるにあたり、比較したのはこのへん。

比較ポイントは、

  • そんなに重くない
  • 独自ドメインが使える(念のため引越しの可能性を残しておくため)
  • カスタマイズ性(HTMLやCSSレベルでいじれる)
  • 有料無料問わず

やー、Tumblrべんりっすね。なんか面白画像の投稿用にしか使われてないのだが、これは究極のホスティング型ブログサービスである。ごちゃごちゃしていないのに、すごいカスタマイズ性が高い。

独自ドメインまで無料で使える。テンプレートはイカすのがいろいろそろっているのにくわえ、HTMLレベルでもいじれる(独自の広告も貼れる)。テンプレートの管理はMTやWPに比べると格段にわかりやすい。つまり1ファイルによる管理だし、タグの情報もひとつのページにまとまっている。

あとPagesという機能がやばい

これは任意のドメイン以下のパスに以下のようなものを置ける。

  • エントリを作成する(通常のテンプレートを使う)
  • 完全にHTMLレベルでまったく違うものをおく
  • 外部サイトを含む別のURLへのリダイレクトとする

あと時限投稿や全体にパスワードをかける機能もある。一般ユーザーからの投稿窓口を用意する機能もある。投稿APIもあるし、きわめつけにさいしょからMarkdownがつかえるよ

これだけそろって、奥さま、無料! 無料でございます!

SLA的なものはどこも似たようなものだと思うので、外部ホスティング型が許される案件なら仕事でも使えると思う。

複数のブログを使い分けることもできる。ブックマークレットとかAddonを使ってる場合、設定で切り替えられるか、メインの(最初に作った)やつに投稿されるようなので、エロ画像を投稿している人はまじめはブログに投稿してしまわないように気をつけよう。

Pagesについての制限

リダイレクトの場合は制限はないようなのだが、ページを置く場合、

/foo/bar

までは行けるのだけど、

/foo/bar/baz

とか深くなると(作成はできるのだけど)404となる。これはサポートに問い合わせたら、About Me, Bio, Resume, Contact Info, etc.を使う想定であるため現状そうなってしまっているとのこと。作成できてしまうのはバグでは?と伝えたつもりなんだけど、最終的にありがとう!何かあったら言って!みたいな返事だったのでうまく伝えられたかどうかはわからんな。サポートはやたら反応が速かった。

この機能をむりやりつかって、e8y.net全部tumblrに持っていこうと思ったのだけど、あれすでにあるパーマリンクのパスが /blog/2011/03/18/p301.html とかなのでだめでした。パーマリンク変えていいならリダイレクト機能を使っても良いのだけど。まあいいやMovabletypeのままで。