ダメ人間オンライン

あまり信用しないほうがいい技術メモとか備忘録とかその他雑記

HTMLタグがちゃんと閉じてるかどうかだけをチェックするやつ書いた

かるぱねるらさんの「HTMLのバリデーションをよしなにやりたくてHTML::Lint::Pluggable書いた - Perl Advent Calendar Japan 2012 Hacker Track」を見て、そういえば書きかけのHTMLなんとかあったと思いだしたのでとりあえずそれっぽくした。

既存のモジュールでHTMLタグが閉じてるか開きタグがないかとかカジュアルにチェックするようなやつないかなと探しててHTML::Lintとかも見つけたんですが、マルチバイト入ってるだけでいらんエラー出したりしてカジュアルに使うには色々めんどくさそうだった。

というわけで既存モジュールでありそうだったけど見つからなかったのでHTML::Lint::ParserをみつつHTMLタグが閉じてるかどうかだけをチェックするやつ書いた。

dameninngenn/p5-HTML-Validate-Structure-Simple · GitHub

そう、名前どうしようかってのをずっと悩んでて、Lintもちょっと違う気がするしValidationっつってもなんかアレだしってことで一旦適当な感じで名前つけてそのままです。良い名前つけてくれる人いませんか。。。

使い方

use HTML::Validate::Structure::Simple;

my $v = HTML::Validate::Structure::Simple->new();
$v->parse( $html );

if( not $v->is_valid ) {
    for my $error ( $v->errors ) {
        warn $error->as_string;
    }
}

$v->clear();

parseにチェックしたいHTMLを渡すと、エラーがなければis_validは1を返してそうでなければ0が返ってきます。
で、エラーがあればerrorsがarrayでerrorオブジェクトを返してきます。

errorオブジェクトはas_stringを使うと

(265:138) span is unopened.

みたいな感じでどのタグが閉じてないか開きタグがないか返してくれます。
もしくは $error->tag, $error->type, $error->line, $error->column で個別に値もとれます。

errorsを空っぽにしたい時はclear()を使えば空っぽになります。

imgとかinputみたいな閉じタグがないやつは HTML::Tagset の emptyElement を見て判断してます。

はい

タグが閉じてるかどうかしか見てないので、hoge みたいな存在しないタグでも対応とれてさえすればエラーにはなりません。

色々ちゃんとやりたい場合はHTML::Lintとか上述したHTML::Lint::Pluggableとかがいいのではないでしょうか。

というか探しきれなかっただけで同じことする既存モジュールありそうな気がする。

TengでNULLをセットしたかった

UPDATE table_name SET hoge = NULL WHERE id = 100;

みたいにNULLを入れたい時Tengでやるには

$teng->update('table_name', {
    hoge => undef,
},{     
    id => 100,
}); 

のようにundefでいける。

追ってみたらundefはundefのままSQL実行する前のとこまで渡ってきてて、DBIのquote()でundefがNULLになってって感じだった。

NULL Values
Undefined values, or undef, are used to indicate NULL values. You can insert and update columns with a NULL value as you would a non-NULL value.

https://metacpan.org/module/DBI

YAPC::Asia Tokyo 2012に行ってきた&LT-THONで話してきた

今年もPerlのお祭りであるYAPC::Asiaに行ってきた。

f:id:dameninngenn_owata:20121001021632j:plain
こういうネームプレートをつけていましたが別にイジメられてるわけではないです><

LT-THON

今年はメイントラックとは別にLT-THONというHachioji.pmの方々が主催となって行ったイベントがあってそれがとてもよかった。

飛び入りでLTするという人も多くてすごく盛り上がってた。かくいう自分も元々応募してたLTに加え飛び入りでもLTさせてもらった。

1本目

「エンジニアのための格ゲー入門」というなんともふざけたタイトルの話をしてきた。

色々考えたあげくこの内容にしたのは訳があって、一番の理由は2本目の理由でも少し話したんですが「LTは本当の意味でのカジュアルであって欲しい」というものですね。(個人の見解です)

「おもしろい発表が多くてハードルが高い」とかで中々発表はしてみたいけど出て来づらいって人が結構多いのかなーって思ってます。今回のLT-THONは特にそういった人達向けに「どんな話でもいいからやってみなよ!おもしろいよ!」っていう趣旨も込められてると思って、あまりガチな話とかじゃなくこういうゆるふわな話をして「あ、こういうのでもいいんだ!」って思ってもらって、少しでも背中を押すことに繋がればと考えてました。

もちろん格ゲーの普及もしたかったんですよ!!

だいぶ自由な感じでLTできたのでとても楽しかったですね。こんな内容でも司会の@uzullaさんは拾って広げてくれたし良い感じの質問もしてもらえてとても嬉しかったです。

2本目

あわよくば話したいなーと思ってもう1本スライド用意してたんですが本編LTは申し込みできてなかったしLT-THONの飛び入りもたくさんいたので話せないかなーと思ってたんですが、1日目の最後の最後で飛び入りで話させてもらいました。

前半は「上手い」「下手」とか「おもしろい」「おもしろくない」とか関係なく話したいと思ったらどんどん話せばいいし、たかが5分なんだからカジュアルに何でも話したらいいんじゃないかなみたいな話をした。気がする。

LTでガッチガチなのは5分という制約だけでよくて、あとは個人の好きなように5分という時間を使って何かしたらいいぐらいのカジュアルさであって欲しい。

自分はただ行儀の良いシュッとしたトークを聞きたいと思ってるわけじゃなくて、シュッとしてなくてもなんというかこう情熱のこもったトークを聞きたいと思ってる。情熱を伝える手段としてシュッとしたやり方が合わないなら合うやり方でやればいいのではないでしょうか。

僕がLTに初めて出会ったのは2008年で、LTきっかけで人生が楽しくなったりもしてきた経験があるので、僕みたいな人見知りやコミュ弱にこそLTで何か表現するということをオススメしたいです。

後半はちょっと前に書いたモジュールの話をした。

いわゆる奇行に走る系のやつですね。

前半の真面目な感じの流れをぶった切ってこの話を入れたのは照れ隠しです。はい。

2本目のLTで話したモジュールの補足

demoは解像度高いやつだと時間かかるので動画撮っておいて用意しておいた。

GIFアニメをターミナルで動かすやつ

FLVをターミナルで動かすやつ

dameninngenn/p5-Acme-Term256-Animation · GitHub

どうみても誰も得しないモジュールなんですがワクワクしたりしませんか?しませんか。僕だけですか。

前にエクセルでアニメのopを再生する動画を見てすっげーワクワクしたことがあって、それ以来なんか「これそういうソフトウェアじゃねーから!」みたいな使い方した変なやつ作りたいなーって思ってました。

最近だとマインクラフトでアニメ再生するってのもあった。(探したけどうろ覚えで見つからなかった。。)

最初はドット絵のGIFアニメうまくターミナルで表示できないかなーとか思ってて「■」とか塗りつぶして並べたらいいかなーと思ってた。けど「■」だと隙間空いて綺麗にならなかったのでどうしたもんかなーって考えた結果背景塗りつぶせば隙間できないことに気づいた。

で、まず画像の画素値をターミナルで表現できる色に近似するとこから初めようと思ってすごいおおざっぱに近似するコードを途中まで書いたところでImage::Term256Colorっていうやろうと思ってたことを全てやってくれそうな良い感じモジュール見つけたのでそれ使うことにした。

あとはそれ使ってターミナルのサイズに合わせて並べたやつをパラパラと細かい間隔で描画して動かすだけ。

ちなみにGIFアニメの素材は餓狼伝説シリーズでお馴染みの不知火舞ですね。おっぱいぷるんぷるん。
FLVの素材は東方のBad Apple!!です。

なんかmacとかなら音楽も合わせて流せそうな気がするので気が向いたらやる。

あと、依存周りがひどいことになってるので(GDとかImageMagickとか)そこも気が向いたらマシにする。

さいごに

今年もすごく楽しかった。

LTおもしろかったですって話しかけてもらえたりしてとても嬉しかったし、IDと顔がようやく一致した人も何人かいて良かった。タイミング合わず話しかけることはできなかったけど><

去年一昨年と比べるとお祭り感が上がってる気がして、ゆるーく色んなトークを聞いたりして楽しむことができた。懇親会でも顔見知りの人と話したり、去年のYAPCから一年ぶりに会った人と話したりできて時間があっという間に過ぎてしまった。

こう毎年楽しむことができるのも運営の方々のおかげですね。

牧さん941さん、ボランティアスタッフの皆さん、LT-THONのHachioji.pmの皆様、YAPC::Asia Tokyo 2012に関わった全ての皆様ありがとうございました。

f:id:dameninngenn_owata:20120929121716j:plain

アメッシュのシンプルなchrome拡張

東京アメッシュのchrome拡張書いた。

dameninngenn/chrome-ext-amesh-simple · GitHub

(2014/05/07追記)
いまさらChrome ウェブストアで公開しました。


機能はシンプルに2つだけ。

1. アイコンをクリックしたら現在のアメッシュで表示してる画像が見れる。
2. 23区あたりで雨が降ってそうな雰囲気ならアイコンの表示を変化させる。

1についてはこんな感じですね。

f:id:dameninngenn_owata:20120914160029p:plain

画像クリックしたらアメッシュのサイトに飛びます。

2については少し降ってる地域があるかもしれない、そこそこ降ってるとかをアイコンでなんとなくわかるようにしてる。

f:id:dameninngenn_owata:20120914160334p:plainf:id:dameninngenn_owata:20120914160339p:plainf:id:dameninngenn_owata:20120914160343p:plainf:id:dameninngenn_owata:20120914160346p:plain

どの程度雨が降ってるかどうかの判別はだいぶゆるふわな感じでやってます。

雨の画像とってきて特定範囲内のピクセル値を見て色ついてるとこを単純にカウントして、その数に応じて画像を出し分けしてます。雨量の色は見てません。赤くなってようが水色だろうが同様に画素値(rgba)を見てカウントしてるだけです。

カウント対象の範囲は下の赤い矩形部分なので左上のほうで雨がザーザー降ってようがアイコンは変化しません。

f:id:dameninngenn_owata:20120914160258p:plain

background pageで5分おきに更新してます。元画像の更新間隔が5分毎なので。

まだ調整が全然足りてないので閾値はわりと適当です。雨が降った日に微調整する感じ。オプションページでユーザー毎に閾値決められるほうが使い勝手はいいかな?

出かけようとした時に直近で濡れる可能性があるかどうかをなんとなく知りたいっていう思想で作ったのでこれ以上はたぶん複雑にしない。
アイコンが白かったらそのまま何も考えず外に出て、アイコン色ついてたら押してどんな感じで降ってるのか確認するみたいな。

ちゃんとしたのはアメッシュのサイト見ればいいし降りまくってたら音でわかるしたまにはカーテン開けて窓の外見ろ!!

あと、アメッシュの画像無断で使わないでねって書いてあったのでこんな感じで使ってもいいかなって問い合わせ送った。返事まだきてない。もし怒られたらやめる。