Hatena::Groupcside

Cside::StudyMemo このページをアンテナに追加 RSSフィード

メインブログに書くまでもない自分用メモを垂れ流す。日々是勉強也。

カテゴリー

2014-04-10

引越しします

http://cside-study.hatenablog.com/

トラックバック飛ばすのつらかったから。

2014-03-19

daemontools の /service/サービス名/down というファイル

システム起動時には、svscan によって起動された supervise はデフォルトでデーモンを up してしまう。 これを防ぐためには、ディレクトリ /service/サービス名 に down という ファイルをつくっておく。

$ touch /service/サービス名/down

とすればよい。中身はなくてもファイルの存在だけがスイッチになる。 supervise はその起動時にこのファイルを発見すると、 デフォルトでサービスを down のままにしておく。 supervise が down ファイルの有無を 検査するのは、supervise の起動時だけなので注意すること。 いったん supervise が起動してしまったら、デーモンの 停止・再開には svc を使おう。

私家版 daemontools FAQ (2/3)

2014-01-05

[]Perlを書くときにいつも迷うこと

  • 複数のものを返すメソッドで、return value をリストにするか ArrayRef にするか
  • getter / setter のメソッド名に get_ / set_ を付けるか否か
    • (これはPerlにかがったことじゃないけど)

[]$`, $&, $'

いつも忘れる。

$`マッチした文字列に先行する部分
$&マッチした文字列全体
$'マッチした文字列に後続する部分

Perl 5.10 から、等価な変数である ${^PREMATCH}, ${^MATCH}, ${^POSTMATCH} も使えますが、これらが定義されるには、正規表現に /p (保存(preserve)) 修飾子をつける必要があります。

perlreref - Perl の正規表現のリファレンス - perldoc.jp

2013-12-31

正規表現の xms オプション

いわゆるクリスマスオプション。頻出だけどすぐ忘れる。。。

x PATTERN 内のスペースを無視して、コメントを使えるようにする
m ^ と $ が行の先頭と末尾にマッチする(複数行のテキストにマッチさせるときに指定する)
s ワイルドカードのドット( . )が改行にもマッチするようにする

2013-12-16

[]N 日前の YYYYmmdd

date --date '1days ago' +%Y%m%d

2013-12-09

[]lsでファイルサイズ順にソート

ls -lS | head

.gitconfig メモ

[alias]
    # 最近使った順にソートされた git branch
    recent-branchs = for-each-ref --format='%(refname:short)' --sort=-committerdate refs/heads
    # master にマージ済みのブランチを消す
    delete-merged-branches = !git branch --merged | grep -v \\* | xargs -I % git branch -d %

PATH_INFO と REQUEST_URI の違い

path_info => クエリパラメータなし

request_uri => あり

2013-12-02

[]Test::BaseにはOOインターフェイスがある

    use Test::Base;
    my $blocks1 = Test::Base->new;
    my $blocks2 = Test::Base->new;

    $blocks1->delimiters(qw(!!! @@@))->spec_file('test1.txt');
    $blocks2->delimiters(qw(### $$$))->spec_string($test_data);

    plan tests => $blocks1->blocks + $blocks2->blocks;

    # ... etc

http://search.cpan.org/~ingy/Test-Base-0.60/lib/Test/Base.pm

2013-11-17

[]正規表現で知らなかったメタ文字メモ

\Q~\E ~部分に含まれるメタ文字をメタ文字として解釈しない
(?=regex)肯定先読み
\z行の末尾

自分は少しは正規表現分かってる方かなと思ったけど全然読めなくてワロタ。

2013-11-11

[]あるブランチに存在しないcommit hash一覧を出す

$ git cherry -v BRANCH_NAME

2013-11-03

[]コマンドライン引数処理モジュール選定委員会

なんで GetOpt::Long じゃダメか

  • バッドノウハウがいくつかあって、いちいち調べるのがかったるい。
  • これが一番でかいけれど、バリデーションルールとドキュメントをそれぞれ書かなければならないのがだるい。
    • バリデーションルールから自動でUsage作れや!

要件

  • G::L みたいにバッドノウハウ多くないやーつ
  • バリデーションにこけたら勝手によしななドキュメント自動生成して吐いて欲しい
  • GetOpts::Long しか触ったことない人でもパッと見読めること
  • 引数の方やrequired or not がコードから一瞬でわかること
  • あとできたらperl5.8とかで動いてほしいかな

候補

結論:なんか Getopt::Compact::WithCmd でいいやと思った。

__END__

  • Smart::Options
  • opts
    • DEPRECATED になってた
  • Getopt::Compact::WithCmd
  • Docopt

2013-10-28

シェルで yyyymmdd を取得する

$ date +%Y%m%d
20131028

2013-10-25

[]引数のハッシュのキーの順番を保持したい場合

hashでなくarrayで受け取ればいい

func(
    foo => 'bar',
    baz => 'foobar',
);

sub func {
    my @args = @_; # not %args
    while (my ($key, $val) = splice @args, 0, 2) {
        ...
    }
}

2013-09-19

[]use FindBin qw($Bin); みたいに変数を Export する

use constants した定数は実体は関数だから変数展開とかできなくてだるいので、変数としてExportしたい。

package Foo;
use common::sense;
use Exporter qw(import);

our @EXPORT_OK = qw($Bar);

our $Bar = 'constant variable';

1;
use Foo qw($Bar);

warn $Bar; #=> 'constant variable'

なぜか $Bar はクラス変数にしないと動かない。

2013-08-29

[]レコード数が極端に少ないテーブルでEXPLAINするべきでない

オプティマイザが「全件走査したほうが早い」と判断して、PRIMARYでさえも無視されることがある。無視された。

レコードを1000件くらいに増やしたら、きちんと意図したインデックスが使われていた。

2013-06-20

[]Text::ASCIITableをマルチバイト文字に対応させる方法

cb_count というオプションを使えば良い。

use Text::ASCIITable;
use Text::VisualWidth::PP;
use utf8;

Text::ASCIITable->new(+{ cb_count => \&Text::VisualWidth::PP::width });

これでマルチバイト文字を含んだ時もよしなにやってくれる。

2013-06-19

[]リモートブランチfooをローカルにbarブランチとしてfetchしてくる

git fetch origin foo
git branch bar FETCH_HEAD

もしくは

git fetch origin foo:bar

2013-06-17

[]Reply.pm の便利機能について

Reply is awesome! - tokuhirom's blog

LoadClassプラグインを使いましょう

~/.replyrc に以下の一行を書き足すと、

[LoadClass]

ロードしてないモジュールでもよしなに自動ロードしてくれる。

(下はLWP::UserAgentをuseせずにやってる。Can't locateエラーにならない)

http://cdn-ak.f.st-hatena.com/images/fotolife/C/Cside/20130617/20130617221938.png


Reply、Carp::REPLより軽いし、入りやすいし、コードも読みやすいしで好きだ。

あと不満なのはpackage名の補完がきかないことくらいなので、誰かやってください。(投げ)

2013-06-14

[]特定のsubtestだけを実行する方法

まずprove実行時にTest::Flattenをuseするようにするように、

.proverc

--exec "perl -Ilib -It/lib -MTest::Flatten"

すると、SUBTEST_FILTERという環境変数でフィルタ出来るようになる

SUBTEST_FILTER=foo prove -lvc t/

これで /foo/ にマッチするsubtestだけ実行される。

https://metacpan.org/module/XAICRON/Test-Flatten-0.09/lib/Test/Flatten.pm#SUBTEST_FILTER

2013-06-12

[]コントローラーのテストについて

  • JSオフでも遷移が可能なページ -> WAFにコントローラーのテスト機構があればそれを使う、なければ Plack::Test
  • JSがないと遷移が不可能なページ -> Selenium や PhantomJS
    • Jenkinsサーバー に PhantomJS が入ってないと CI に乗せられないのがアレか

2013-06-06

[]Data::Dumper のよく使うオプション

perlで改行など特殊文字が含まれるものをDumpする時は - $shibayu36->blog;

Useqq オプション便利すね。


Indent, Terse

よく使う。出力結果をコンパクトにしてくれる。

use Data::Dumper;

my $data = { foo => 1, bar => [1, 2] };
warn Dumper $data;
# $VAR1 = {
#           'bar' => [
#                      1,
#                      2
#                    ],
#           'foo' => 1
#         };

local $Data::Dumper::Indent = 1;  # インデントの深さレベル
local $Data::Dumper::Terse  = 1;  # "$VAR1 = " 消す

warn Dumper $data;
# {
#   'bar' => [
#     1,
#     2
#   ],
#   'foo' => 1
# }

ちなみにオプションは、localを使って設定しとくとスコープ限定できて良い。

自分は、Vimのスニペットに

use Data::Dumper;
local $Data::Dumper::Indent = 1;
local $Data::Dumper::Terse  = 1;
warn Dumper 

を d とかで呼び出せるように登録してる。

Deparse

サブルーチンをDumpできる。ただし実体とまったく同じものではない。

use Data::Dumper;
use Path::Class qw(file);

warn Dumper \&file;
# $VAR1 = sub { "DUMMY" };

local $Data::Dumper::Deparse = 1;
warn Dumper \&file;
# $VAR1 = sub {
#             package Path::Class;
#             use strict 'refs';
#             'Path::Class::File'->new(@_);
#         };

Data::Dump::Streamer 使っても同じ事ができる。


こっからは Data::Dumper からは脱線した余談。 


Data::Dump について

デフォルトだとインデントが豪快な Data::Dumper に対して、Data::Dump は出力が最初からコンパクト。

my $data = { foo => 1, bar => [1, 2] };

use Data::Dump qw(dump);
warn dump $data;
# { bar => [1, 2], foo => 1 }

use Data::Dumper;
warn Dumper $data;
# $VAR1 = {
#           'bar' => [
#                      1,
#                      2
#                    ],
#           'foo' => 1
#         };

コンパクトなほうが好きな人はこれ使えばいいと思う。

僕はオブジェクトのdump結果が Data::Dumper よりも見難く感じるから使ってない。

おまけ:変数名も一緒にdumpする

Data::Dumper::Names というのがある

use Data::Dumper::Names;

my $foo;
my @bar = qw/this that/;
warn Dumper($foo, \@bar);
# $foo = undef;
# @bar = (
#     'this',
#     'that'
# );

おまけ2:カラフルなdumper

Data::Printer というのがある

See Also