Perl

HTTP::Message#content($bytes)を呼んでもcontent-lengthは計算されない

HTTP::Request#content($bytes) もしくは HTTP::Request#add_content($bytes) を呼んでもcontent-lengthは自動で計算されず、0になる。 なのでそのままリクエストを送ると、ちゃんとcontent-lengthだけbodyを読む実装はボディが空だとみなすのでちゃんとcont…

Perl で memcached を使うときは Cache::Memcached::Fast::Safe がよさそう

memcached はコマンドインジェクションの機会が主に2つあって、1つはプロトコルで定められたキー長250文字を越えた場合と、キーに改行文字を含む場合。詳しくは: 第2回 memcachedのセキュリティと脆弱性:memcachedの活用と運用 実践編|gihyo.jp … 技術評論…

indirect object notationでハマらないためのno indirectプラグマ

普段、Perlを書くときは require_ok などでモジュールがコンパイル可能か・構文エラーがないかをテストするようにしているけれど、 require_ok では発見できない構文エラーを発見したのでそれの詳細と対策について。 実行時エラーになる構文エラー (?) とind…

JSON::TypeInference 1.0 と JSON::Schema::Generator (trial) をリリースした

JSON::TypeInference 1.0 metacpan.orgだいたい欲しいものは実装したので覚悟を決めるという意味での 1.0 リリース。 これはなにか? Perl の値 (スカラ値、ハッシュリファレンス、配列リファレンスなど) が JSON のどの型であるかを推論するモジュール。 Per…

JSON::TypeInference 0.04 で null かもしれない値を Maybe 型として推論するようにした

metacpan.orggithub.comNull と値型のただ2つからなる Union 型を Maybe という特別な型として推論するようにした。ちょっと便利。Maybe だったら {"type" : ["null", "string"]} のように出力するようにすると、より厳密な JSON スキーマを生成することがで…

最近の CPAN モジュールを作るときの構成

github.comMinilla を使っている。minil new してからちょっと手を入れる。 .mailmap <aereal@aereal.org> <aereal@users.noreply.github.com>GitHub の Web インターフェースで Merge Pull Request ボタンを押すとコミットの AUTHOR_EMAIL がこれになる。たぶんメールアドレスを非公開にしているとこれになるよう</aereal@users.noreply.github.com></aereal@aereal.org>…

Perl の値から JSON の型を推論するモジュールを書いた

github.com metacpan.org これは何か Perl の値 (スカラ値、ハッシュリファレンス、配列リファレンスなど) が JSON のどの型であるかを推論するモジュール。Perl の 1 という値は JSON の number である、Perl の "a" は JSON の string である、という風な…

Config::ENV で各環境で必ず定義すべきキーを定めておく

metacpan.orgちょうどいいデフォルト値が見当たらないので、このキーは各環境で適宜、定義せよ、という風にしたい。interface みたいなかんじ。 use strict; use warnings; use Test::More tests => 2; use Test::Fatal qw(exception); { package My::Config…

Path::Tiny を継承する

Path::Tiny - search.cpan.org Path::Tiny には new という、いかにもオブジェクト指向的なコンストラクタのような名前のメソッドが定義されているのでいかにもオブジェクト指向的に継承できるように見えるが結論から言うと できない 。 sub new { shift; pa…

テンプレートエンジン Night (#tenight) で「テンプレートの静的解析とリファクタリング」について発表した

テンプレートエンジンNight というイベントで Text::Xslate を使ってテンプレートの静的解析とリファクタリングを行った知見について発表した。 テンプレートエンジンを使ってこういうことができる、というような内容から、テンプレートエンジン作った・作っ…

Shipped Text-Xslate-AST-Walker @ 0.01

Text::Xslate::AST::Walker - Filter Nodes in the AST made by Text::Xslate - metacpan.org ae real / Text-Xslate-AST-Walker-0.01 - search.cpan.org これはなに? Text::Xslate::Parser が返す AST を文字通り「歩きまわる」ためのモジュールです。0.01…

HTML::Selector::XPath @ 0.17 で normalize-space() するようになった

HTML::Selector::XPath@0.16 は CSS における class セレクタと等価な XPath を出力しない - Sexual Knowing HTML::Selector::XPath@0.16 は CSS における class セレクタと等価な XPath を出力しない - Sexual KnowingNormalize space characters of the cl…

HTML::Selector::XPath@0.16 は CSS における class セレクタと等価な XPath を出力しない

再現コード class_with_lf.t class 属性の値における「空白文字」 class 属性の値は: The attribute, if specified, must have a value that is a set of space-separated tokens representing the various classes that the element belongs to. HTML Stand…

Vim で現在カーソルがあるテストメソッドを実行する

Perl には Test::Class という JUnit 風にテストを書けるモジュールがある。すなわち: テスト用のクラスを定義し アサーションをインスタンスメソッドとして括り出す ことができる。Test::Class はテスト実行時に環境変数 TEST_METHOD に与えられた値で実行…

Foreman で Test::mysqld のようにテスト用のデータベースを起動する

Test::mysqld とは Perl に Test::mysqld というモジュールがある。テストを実行するときに MySQL のインスタンスをよしなに起動してくれる。同じテストスイート (プロジェクト、リポジトリ) を並行して実行する場合、データベースの接続先は同じなので複数…

cpanfile の構文を watchdogs.vim (+ quickrun.vim) で検証する

最近は Perl で書かれたプロジェクトの依存モジュール管理は cpanfile で行われていることが多い*1ので自然と cpanfile を読み書きする機会も増える。cpanfile もきちんと構文が定められているので、些細な構文間違いに気付かぬままコミットしてしまうといっ…

Template Toolkit 2 の出力結果にテンプレートファイル名を付与するモジュール

aereal/Template-Context-SourceMap · GitHub id:r7kamura さんが作った view_source_map.gem をいいアイデアだなあ、と思っていて、折しも INCLUDE/WRAPPER が舞う嵐のようなテンプレートを抱えるアプリケーションの開発というかデバッグにおいてまさにこう…

Chef で cpanm --installdeps . を実行すると大量のメモリを消費する

経緯 Vagrant で立てた VM を provision する際に Chef を用いて cpanm --installdeps . を実行して依存する CPAN モジュールをインストールする Recipe を書いて実行するとたびたび NoMemoryError で Chef を実行するプロセスが殺されてしまう。まず、デフ…

Perlのはなし

今週はずっとPerlを書いていたのでいろいろ。コンテキストつらい。コンテキストがどういうものかは『初めてのPerl』とPlackなどのコードを通して概要をハハンと掴んでいた程度で実際に付き合いはじめたのは今回が初めて。使ってみての印象は最悪で動的型付け…

cpanm XML::Parser

expat.hがないと怒られた。 $ sudo aptitude install libexpat-dev Ubuntuだとこれでビルドが通った。~/.cpanm/build.log を見ろよ、って言われたのだけど、「expat.hがないぞ」という肝心のところに辿りつくまでかなり戻らないといけなかった(関係のないエ…

無名関数を引数にとる関数

#!/usr/bin/perl use strict; use warnings; use feature qw( say ); sub hoge(&) { my ($func) = @_; $func->(); } hoge { say &#39;call from anonymous function!&#39; } Perlを書きはじめている。なにもかもがわからない(なにがわからないのかすら、わ…