その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

YAPC::Asia Tokyo 2014でPerl::Lintについて喋りました

タイトルのとおりです.
スライドは以下です.



もうちょい詳しく話す予定だったんですが,冒頭のライブリリースに失敗するなどして出鼻をくじかれテンパってしまいました……
ちょっと詳しい話をすると,

  • ポリシー周り
    • 各ポリシーがトークンを受け取って,それを各々独自に走査して処理する
    • ポリシーはevaluate()というメソッドを持っていて,そこで解析処理をする.各ポリシーのevaluate()はそれぞれ同じ引数を受け取り,violationsを含むarray referenceを返す.ゆるふわなインターフェイス的思想.
  • フィルターもゆるふわなインターフェイス的思想になってて,filter()というメソッドを持ち,filterしたいポリシー名を含んだarray referenceを返す.
  • こんな感じで,新しいポリシーやフィルターを作りやすい!! と思ってたんだけどそうでもない気がする,後述.
  • とりあえず,開発のモチベーションとして,処理が高速でないと話にならんと思ったのでパフォーマンスの為にあえてダーティなコードを書いている部分がある
  • 一方でパフォーマンスとは関係の無いダーティなコードも書いている
  • あとまあ,Perl::Lintが速い場合と遅い場合があるのはわかっていて,スライドには割と恣意的なベンチの結果を載せている


あと,現状だと独自のポリシーとか独自のフィルターを書く為の敷居が高過ぎる (例えば,作法とかが一切わからん) という意見をもらったので,そこら辺を上手くサポート(チュートリアルとかスケルトンジェネレータとかで)したいなあというモチベーションになりました.何か良い意見あれば是非教えて下さい!


質疑応答は(覚えている限り)以下のとおりです.

Q. なんでAST使わないの?
A. Compiler::Parserがまだ不安定で,解釈できないコードが多かったため諦めた

Q. ASTじゃなくてToken使うことによるメリットってあるの?
A. よくわからない,無いのでは.手でToken走査して頑張るの本当に大変.ASTあるなら本当に使いたいケースは確かにある.

Q. Compiler::Lexer,SEGVとか多いイメージあるけど最近どう?
A. 最近では少なくなっているとは思います.でもまあ起きるには起きるんで……

Q. コントリビュータ募集って言ってたけど,どのへんに協力して欲しいの?
A. ぶっちゃけ僕が実装したくないポリシーを実装して欲しいんですけど,まあ無理な話なんでドキュメントとかで協力していただきたく存じます.

Q. Perl::LintにPerl::LintかけるとたくさんPerl::Lintのviolation出るけどこれって直るの?
A. 無理では……(ほんとうに難しい)

Q. C-Style forやめたら?
A. C-Style forの方が楽なんで許して欲しい (これは発表中にも喋ったんですけど,トークンの先読みとか後戻りとかを結構するので自在にインデックスをいじれたほうが良い)



YAPC会期中は常に会場のどこかしらにいますんで,何かPerl::Lint周りに興味がある方いらっしゃいましたらお話しましょう!

YAPC::Asia Tokyo 2014でPerl::Lintについて喋ったりします

おわび

Perl::Lint出来てません

本題

明日8月28日(木)から3日間に渡ってアジア最大のPerlのカンファレンスであるところのYAPC::Asia Tokyo 2014が開催されますね! 楽しみですね! 夜も眠れないですね!


さて,そのYAPC::AsiaでわたくしPerl::Lintという開発中のツールについて一席打たせて頂きます.
Perl::Lint - Yet Another Perl Source Code Linter - YAPC::Asia Tokyo 2014

  • そもそも静的解析とは何か
  • 静的解析して何が嬉しいのか
  • Perlにおける静的解析ってぶっちゃけどーなのか
  • Perl::Lintの構造とかポリシーとか実装とかってどうなってんのか
  • Perl::Lintにたっぷり詰まってるバッドノウハウについて
  • 理想の社会とは何か

みたいな話をする予定です.「Perl::Lintの話」と銘打ちましたが,コードの静的解析技術やその応用について言及する予定です.
どっこいあくまで予定です.まだ資料できてません.
資料できてませんが,必ず良い発表にするので皆さん是非足を運んでいただけたらと存じます.


資料できてないしPerl::Lintもできてないしで,別の意味で夜も眠れませんが,俺のこの熱量は本物です.
それではみなさん会場でお会いしましょう!!!!!!!

OS Xのクリップボードとtmuxのクリップボードを共通化する

OS Xクリップボードとtmuxのクリップボード *1 を共通にする設定に関するメモです.
なお,tmuxのバージョンは1.9a,reattach-to-user-namespaceのバージョンは2.3です.

1. まずreattach-to-user-namespace入れる
$ brew install reattach-to-user-namespace

簡単.

2. 設定ファイルを書く

.tmux.confに設定を書く.

if-shell 'test "$(uname -s)" = Darwin && which reattach-to-user-namespace > /dev/null 2>&1' 'source-file ~/.tmux-reattach-to-user-namespace.conf'

if-shell使うと,第一引数がtrueの時だけ第二引数を実行してくれて便利.
上記の設定では,「OSがDarwin,つまりOS X」かつ「reattach-to-user-namespaceがパス通ってるところに置いてある」時だけ,~/.tmux-reattach-to-user-namespace.confを読みに行くという感じになっています.


で,.tmux-reattach-to-user-namespace.confを書く.

set-option -g default-command "exec reattach-to-user-namespace -l $SHELL"

unbind -t vi-copy Enter
bind -t vi-copy Enter copy-pipe "reattach-to-user-namespace pbcopy"

unbind ]
bind ] run-shell "reattach-to-user-namespace pbpaste | tmux load-buffer - && tmux paste-buffer"

reattach-to-user-namespace経由でシェルを起動することで,tmux上でもpbcopypbpasteを正常に使える状態にしておき,あとはキーバインドをオーバーライドして,コピー時は内容をOSのクリップボードに送り,ペースト時はOSのクリップボードから読み込んでくるようにすればOK.


別に.tmux.confに書いても良いとは思うんですけど,.tmux.confif-shell1発書いて「こういう条件の時にこの外部設定ファイル読み込むんですよ〜」と表明したほうがわかりやすい気がしてこうした次第.気分です.

結論

if-shellは便利

*1:クリップボードと言うのだろうか

XSのABRTをキャッチしたい





以下の様なコードを実行するとABRTしてアプリごと死ぬという厳しい状況にぶち当たりました.
(なおこのバグはfix issue #45 · 93ff36f · goccy/p5-Compiler-Lexer · GitHubにて修正されている様子.@さんには頭が上がりません.ありがとうございます)


$SIG{ABRT} = sub {...};

という具合で書いてやればABRTを握れるのかな〜とか思って書いてみたら,この方法ではシグナルをトラップできない感じだったので,やむなく以下の様にforkを使ってなんとかすることにしました.
https://github.com/moznion/Perl-Lint-Playground/blob/5d9c23b59646dcc65fbb8d95e67368f6b02c3c01/lib/Perl/Lint/Playground/Service/Lint.pm

IO::Pipe便利!!!!!


さて皆さんこういう感じで,入力によってはXSがエラー吐いてどうにもならん時ってどうされてるんですかね?

Published “Perl::Lint Playground”

(またしても日本語は下にあります / Japanese follows English)


I published “Perl::Lint Playground”.
http://perl-lint.moznion.net/


You can try feature of Perl::Lint easier on this playground.
However this and Perl::Lint have not been completed yet, so possibly results are vague.
(e.g. Now, source code that was written in this playground is not file in spite of playground warns by policy of file path. I think there is more problems...)


For now, please play here and tell me your mind.
Enjoy!




Perl::Lint Playgroundを公開しました.
http://perl-lint.moznion.net/


ブラウザ上でPerl::Lintを試してみることができます.
まあ,みなさんもご存知の通りPerl::Lintは未完成ですので,このプレイグラウンドの結果もあんま信用しないほうが良いです.
(例えば,プレイグラウンドで試す為のソースコードはファイルではありませんが,現状ではファイルにまつわるポリシーによって警告されるなどといった問題があります.多分他にも結構あるとおもいます)


とりあえず遊んでみて,僕にフィードバックなどをくれると嬉しいです.
よろしくお願いします.

git grepの代わりにgit agを使う

git grepが便利なので,同じ感覚でag (The Silver Searcher)を使ってみたいという話です.何事も速いほうが良い.

前提

ぶっちゃけagは,デフォの状態で.git/以下の内容や.gitignoreに書かれてるファイルやディレクトリなんかを検索の対象から排除するのであんま旨味は無い.

方法

以下のエイリアスを張る *1.もちろんconfigファイルを直で編集しても良いです.

$ git config alias.ag '!git ls-files | xargs ag'

git ls-filesを使って,gitで管理されているファイルの一覧を持ってきて,xargsを使ってagに渡してやるという感じ.

実際僕はこれで十分なんですが,表示と挙動をgit grep(1)っぽくしたい場合は以下のようになるでしょう.

$ git config alias.ag '!git ls-files | xargs ag --pager="less -F -R" --nogroup --color-match=0\;31 --color-path=0\;0 --no-numbers'

--pager="less -F -R"はお使いのpagerに応じて変更するか,あるいはお好みに応じてpagerオプションを取り去ると良いでしょう.

結論

$ git ls-files | xargs $COMMAND

が基本的に便利!!!!!

*1:場合によって--globalオプションなどを付けても良いでしょう

Released Perl::Lint as underdevelopment

(日本語は下にあります / Japanese follows English)


I've just released Perl::Lint as underdevelopment.
https://metacpan.org/release/MOZNION/Perl-Lint-0.01_01


Development of Perl::Lint is in progress, but I need feedback about this module.
Thus I released it on CPAN to simplify installation in spite of it is on the way.
(Thank you for your advice, @tomhukins and @)


Installation is easy.

$ cpanm --dev Perl::Lint


And usage is simple!

use Perl::Lint qw/lint/;
my $violations = lint(['path/to/file.pl']);


This module is unfinished as you know.
Please don't believe this and me!!

I'm looking forward to hearing your feedback.
Please send your mind to the GitHub Issues or @.

Enjoy!


P.S.
I'm going to talk about Perl::Lint at YAPC::Asia Tokyo 2014.
Let's talk me at there!!



Perl::Lintを開発版としてリリース致しました.
https://metacpan.org/release/MOZNION/Perl-Lint-0.01_01


Perl::Lintは目下のところ開発中のモジュールですが (まだ出来てねえのか!) ,そろそろユーザのフィードバックが欲しいなあとか,Tom Hukins氏や@氏らから「とりあえずリリースしちゃえよ! インストールしにくくてかなわん!」という意見を頂いたとか,そういった事情でunderdevelopment releaseを敢行したというのが背景です.


インストールは至って簡単です.

$ cpanm --dev Perl::Lint


使い方もシンプルです.

use Perl::Lint qw/lint/;
my $violations = lint(['path/to/file.pl']);


ご存知の通りこのモジュールは未完成です.
このモジュール (の吐き出す結果) と俺を信用しないでください.

フィードバックはGitHub Issuesに書いてもらえるか@まで直でメンション飛ばしてもらえると嬉しいです.

よろしくお願いします.


[追記]
そういや言い忘れてましたが,YAPC::Asia 2014というイヴェントでPerl::Lintの話をします.
会場でお会いしましょう!!!