11月25日の技術勉強会

11月25日の技術勉強会

11月25日に行われました技術発表会の内容を撮影した動画ファイルを公開いたしました。内容は以下のとおりです。

テーマ Perl::Critic
発表 d:id:onishi
時間 15:17
ファイルサイズ 88,770,896Bytes

以下よりダウンロードしてご覧ください。

http://www.hatena.ne.jp/sound/tech/051125hatenatech.wmv

Perl::Critic::Policy::TestingAndDebugging::RequirePackageStricture

Using strictures is probably the single most effective way to improve the quality of your code. This policy requires that the 'use strict' statement must come before any other staments except package, require, and other use statements. Thus, all the code in the entire package will be affected.

use strict を使用するのは、あなたのコードの品質を改良する最も効果的な方法だよ。

use strict はpackage以外のrequire,useなどのあらゆるステートメントの前に書こう。そうすればpackage内の全てのコードに有効になるよ。

Perl::Critic::Policy::TestingAndDebugging::RequirePackageWarnings

Using warnings is probably the single most effective way to improve the quality of your code. This policy requires that the 'use warnings' statement must come before any other staments except package, require, and other use statements. Thus, all the code in the entire package will be affected.

use warnings も同様だよ。

Perl::Critic::Policy::ValuesAndExpressions::ProhibitConstantPragma

Named constants are a good thing. But don't use the constant pragma because barewords don't interpolate. Instead use the Readonly module.

定数に名前をつけるのはいいけど、constantプラグマは使わないこと。なぜならbarewordは展開しないから。

代わりにReadonlyモジュールを使おう。

  use constant FOOBAR => 42;  #not ok

  use Readonly;
  Readonly  my $FOOBAR => 42;  #ok 
大西注

use constantでbarewordを定数にした場合、文脈によりどっちだかわかんなくて困ることがあるから、Readonlyモジュールを使おう、ということらしい。

use constant HOGE => 'hoge';
$fuga{HOGE} = 'fuga';

みたいに書いた場合、HOGEがconstantで指定した定数なのか、hashキーなのかわかんない、みたいな。

Perl::Critic::Policy::ValuesAndExpressions::ProhibitEmptyQuotes

Don't use quotes for an empty string or any string that is pure whitespace. Instead, use q{} to improve legibility. Better still, created named values like this. Use the x operator to repeat characters.

空文字列のクォートは使わないで、代わりにq{}を使おう。名前をつけるとなおよし。繰り返すときはx 演算子を使おう。

  $message = '';      #not ok
  $message = "";      #not ok
  $message = "     "; #not ok

  $message = q{};     #better
  $message = q{     } #better

  $EMPTY = q{};
  $message = $EMPTY;      #best

  $SPACE = q{ };
  $message = $SPACE x 5;  #best

Perl::Critic::Policy::ValuesAndExpressions::ProhibitInterpolationOfLiterals

Don't use double-quotes or qq// if your string doesn't require interpolation. This saves the interpreter a bit of work and it lets the reader know that you really did intend the string to be literal.

展開する必要がないところでダブルクォートやqq//を使わないように。

これはインタプリタ仕事を少し節約できるし、コードを読む人が文字列がそのままの文字通りであると意図していることができるよ。

  print "foobar";     #not ok
  print 'foobar';     #ok
  print qq/foobar/;   #not ok
  print q/foobar/;    #ok

  print "$foobar";    #ok
  print "foobar\n";   #ok
  print qq/$foobar/;  #ok
  print qq/foobar\n/; #ok

  print qq{$foobar};  #preferred
  print qq{foobar\n}; #preferred

Perl::Critic::Policy::ValuesAndExpressions::ProhibitLeadingZeros

Perl interprets numbers with leading zeros as octal. If that's what you really want, its better to use oct and make it obvious.

0先行の禁止。Perlは0が先行する数字を8進数としてみなすよ。本当に8進数を使いたい場合はoctを使ってそれをわかりやすくしよう。

  $var = 041;     #not ok, actually 33
  $var = oct(41); #ok

Perl::Critic::Policy::ValuesAndExpressions::ProhibitNoisyQuotes

Don't use quotes for one or two-character strings of non-alphanumeric characters (i.e. noise). These tend to be hard to read. For legibility, use q{} or a named value. However, braces, parens, and brackets tend do to look better in quotes, so those are allowed.

1~2文字の非英数字(これすなわち雑音)にクォートを使用しないように。だって読みにくいんだもん。q{}を使うか名前をつけて変数にしちゃおう。

でも、brace {},paren (),bracket []はクォートの中の方が読みやすいから特別に許しちゃおう。

  $str = join ',', @list;     #not ok
  $str = join ",", @list;     #not ok
  $str = join q{,}, @list;    #better

  $COMMA = q{,};
  $str = join $COMMA, @list;  #best

  $lbrace = '(';          #ok
  $rbrace = ')';          #ok
  print '(', @list, ')';  #ok

Perl::Critic::Policy::ValuesAndExpressions::RequireInterpolationOfMetachars

This policy warns you if you use single-quotes or q// with a string that has unescaped metacharacters that may need interpoation. Its hard to know for sure if a string really should be interpolated without looking into the symbol table. This policy just makes an educated guess by looking for metachars and sigils which usually indicate that the string should be interpolated.

このポリシーは展開しそうなエスケープされていないメタキャラシングルクォートやq//の中にあった際に警告するよ。

シンボルテーブルを調べないで文字列が展開されるべきかどうか知る事は難しいよね。このポリシーは文字列が展開されるべきであることを示すメタキャラやsigilsを探す事でそれを推測するよ。

Perl::Critic::Policy::ValuesAndExpressions::RequireNumberSeparators

Long numbers are be hard to read. To improve legibility, Perl allows numbers to be split into groups of digits separated by underscores. This policy requires numbers sequences of more than three digits to be separated.

長い数字は読みにくいよね。可読性のため、Perlはアンスコで数字をわけるのを許しているよ。このポリシーは3桁以上の数字がアンスコでわけられているのを要求するよ。

 $long_int = 123456789;   #not ok
 $long_int = 123_456_789; #ok

 $long_float = 12345678.001;   #not ok
 $long_float = 12_345_678.001; #ok

Perl::Critic::Policy::ValuesAndExpressions::RequireQuotedHeredocTerminator

Putting single or double-quotes around your HEREDOC terminator make it obvious to the reader whether the content is going to be interpolated or not.

ヒアドキュメントのターミネータシングルクォートかダブルクォートで囲もう。

中身が展開されるかどうかに関係なく、コードを読む人にわかりやすいもんね。

  print <

Perl::Critic::Policy::ValuesAndExpressions::RequireUpperCaseHeredocTerminator

For legibility, HEREDOC terminators should be all UPPER CASE letters, without any whitespace. Conway also recommends using a standard prefix like "END_" but this policy doesn't enforce that.

読みなすさのため、ヒアドキュメントのターミネータは空白のない大文字であるべきだよ。コンウェイは "END_"のような標準の接頭語を勧めているけど、このポリシーではそれは強制しないよ。

  print <<'the End';  #not ok
  Hello World
  the End

  print <<'THE_END';  #ok
  Hello World
  THE_END

Perl::Critic::Policy::Variables::ProhibitLocalVars

Since Perl 5, there are very few reasons to declare local variables. The only reasonable exceptions are Perl's magical global variables. If you do need to modify one of those global variables, you should localize it first. You should also use the English module to give those variables more meaningful names.

Perl5以来、local変数を宣言する理由はほとんどないよ。唯一の例外はPerlのmagicalなグローバル変数だけだよ。

これらのグローバル変数を使いたいときは、最初にlocal宣言してね。あと、Englishモジュールを使って、より意味のある名前にした方がいいよ。

  local $foo;   #not ok
  my $foo;      #ok

  use English qw(-no_match_vars);
  local $INPUT_RECORD_SEPARATOR    #ok
  local $RS                        #ok
  local $/;                        #not ok

Perl::Critic::Policy::Variables::ProhibitPackageVars

Conway suggests avoiding package variables completely, because they expose your internals to other packages. Never use a package variable when a lexical variable will suffice. If your package needs to keep some dynamic state, consider using an object or closures to keep the state private.

This policy assumes that you're using strict vars so that naked variable declarations are not package variables by default. Thus, it complains you declare a variable with our or use vars, or if you make reference to variable with a fully-qualified package name.

コンウェイパッケージ変数は徹底的に避けるべきだと提案してるよ。なぜなら内部変数が他のpackageに露出しちゃうから。

レキシカル変数で十分な場合、パッケージ変数は使わないようにしよう。packageが動的な内容を保持したい場合、オブジェクトかクロージャを使ってパッケージプライベートに保つことを考えてね。

  $Some::Package::foo = 1;    #not ok
  our $foo            = 1;    #not ok
  use vars '$foo';            #not ok
  $foo = 1;                   #not allowed by 'strict'
  local $foo = 1;             #bad taste, but ok.
  my $foo = 1;                #ok

In practice though, its not really practical prohibit all package variables. Common variables like $VERSION and @EXPORT need to be global, as do any variables that you want to Export. To work around this, the Policy overlooks any variables that are in ALL_CAPS. This forces you to put all your expored variables in ALL_CAPS too, which seems to be the usual practice anyway.

とはいえ、これは実際には現実的ではない。$VERSIONや@EXPORTはグローバルである必要があるから。

ということでこのポリシーは全て大文字変数については見逃す事にしています。

Perl::Critic::Policy::Variables::ProhibitPunctuationVars

Perl's vocabulary of punctuation variables such as $!, $., and $^ are perhaps the leading cause of its repuation as inscrutable line noise. The simple alternative is to use the English module to give them clear names.

Perlの$!や、$.や、$^などの変数ボキャブラリーは恐らく計り知れないノイズの原因だよね。

シンプルな代替手段として、Englishモジュールをつかってそれらに明確な名前を与えよう。

  $| = undef;                      #not ok

  use English qw(-no_match_vars);
  local $OUTPUT_AUTOFLUSH = undef;        #ok
Englishモジュールについて
大西注

perlvarによると

Due to an unfortunate accident of Perl’s implementation, "use English" imposes a considerable performance penalty on all regu-lar expression matches in a program, regardless of whether they occur in the scope of "use English".

Perl の実装における不幸な事故により、 use English はプログラム中の全ての正規表現マッチングにおいてかなりの性能低下を引き起こします。これは use English のスコープ内かどうかに関わりません。この理由により、ライブラリで use English を使うのはできるだけ避けてください。

って書いてあるYO!