NeverBlog::Likk::Unexistable;

見なかったことにして下さい

YAPC::Asia 2014 2日目感想

1日目感想かいてからだいぶ間が空いたけど、2日目感想まとめた。LTは除く。
謎の腹痛に悩まされて午後から参加。途中タリーズでうずくまったりもした。

地域pm Meet up

思った以上部日本全国あちこちにpmあった。
都内出身なので地域pmに行くことは殆どなさそうだけど、地方pmの人を都内pm呼ぶの楽しそう。

YAPC::Europe 2014にいってきました

ブルガリアはビールクズ天国。覚えた。
ヨーロッパは英語あんまり喋れなくても寛容。覚えた。
そもそも日本から出たことないんですけどね。

趣味開発のためのクラウド/VPS活用術

VPSは2社ほど、レンタルサーバは1社ほど使ってるけど、正直そんなに活用してない。
聞いて改めてまた引っ越そうということはないけど、最近のVPS情報を知ることができてよかった。

キーノート エンジニアとして生きる

「20代の経験が今後の人生のベースになる」ときいて、ああ手遅れだなとか思ったのは置いといて、
実際ベースとなっているのは確か。自分のベースは「誰を楽にすることができるか」なんだけど、
これも20代の経験が元になってる。自分のなりたいエンジニアのロールモデル大事。

クロージング

PerlのカンファレンスなのにPHPの話が一位とか自由すぎてとってもPerl.
残念なことに、1-3位のトークはどれも聞いていなかったので動画を見ます。

全体を通して

今回は会社の補助もあって、初めて企業スポンサー枠で参加した。
どちらかというと今までは、有給とって自由にYAPC参加していたので気楽だった。
今回は、会社へのフィードバック前提での参加だったので、
なるべく社内の人の参加数が少ないトークをフォローする形であまり興味のない分野のトークも聞いた。
そういうこともあり、今までで一番真剣にYAPCに参加していたんじゃないかなと思う。
こういう参加の仕方は刺激が多く、気持もリセットされるので、非常に実りあるものだった
ただ、すごい疲れるし何よりベストスピーカ賞への投票権がないので、来年はやっぱり個人スポンサー参加にしようと思います。
企業スポンサー枠ってなんで投票権無いんでしょうね?組織票できちゃうから?

YAPC::Asia 2014 1日目感想

ブログに感想書くまでがYAPCらしいので、YAPC::Asiaの1日めの感想まとめた。LTは除く。
2007年ぐらいから断続的に参加してるけど、なにげに感想書くの初めて。

Perl meets Real World ?ハードウェアと恋に落ちるPerlの使い方

全く知識がない分野で、実際自分が手を出すことはないだろうなと思いつつ、一旦手を出したら楽しそうだなと思った。
時間になったらWebから天気情報拾ってきて雨だったらLED光らせるとか思いつたので誰かお願いします。

Go For Perl Mongers

これを聞いてGoをやってみよう!とか思うひとは居ないんじゃないのかなー。
それでも手を出してみたくなった or 手をださないといけなくなったら go-stf-server 追ってみます。
とはいえ、オブジェクト指向との対比で 「草を食べるAPIを持っている物=(草食動物)」の説明はわかりやすかった。

JSON SchemaとAPIテスト

JSON Schemaで仕様を定義しつつそれをそのままテストに利用するのは異常系テストが捗りそう
Web全体として考えるとキツイけど、API周りのテストで試してみたい

作られては消えていく、泡のように儚いクラスタの運用話

テレビ案件の裏側大変そう。テレビ全然見ないからイメージがあまり沸かないけど。
本番稼働時を予想するのに、シナリオ建てて負荷の予想/ボトルネック探すの大事。

Windows ユーザーのための Perl による Web アプリケーション開発チュートリアル

初心者向け。
今どきの macbook 作って開発ウェーイみたいなことできないけど手元のWindowsマシンでやってみたいというケースを想定
Windows ユーザー向けといいつつ、strawberry perlのところを置き換えれば環境問わずそのまま出来る

継続的翻訳活動をささえる技術

翻訳作業お疲れ様です。
tran 翻訳以外にも(他人様の)Webサービス差分管理システムみたいなのに応用できそう

YAPC::Asia2014会場ネットワークのツクリカタ

会場ネットワーク構築お疲れ様です
会場に持ち込んだのはスイッチ AP VPNのみ/DNS DHCP 監視とかは遠いところ
接続点からの距離は大人の次手段で解決。
大人の次手段 = 金とコネは大事だよね。自分は両方持ってないけど。

where狙いのキー order by 狙いのキー

はじめにMysqlの検索の仕組みをイメージして
それをperlコードに落としこんで説明という内容で非常に分かりやすい。
インデックスとかよく分かんないという人は是非ともスライドを見てほしい。
投票権持ってなかっけど個人的にはベストスピーカーの投票対象だった。

Get a kick out of CPAN

PAUSE にIDだけ登録してアカウント使って放置しててすいません。
codereposとかgitとかの方が気が楽過ぎる

Gamificationの話ししてたけど、言うほどみんなフィードバック欲しいのかな?
自分は作ったものが公開できればそれでいい。10個ぐらい作れば勝手に使う人が現れるのは経験済みなので。
どっちかというと質問とかの対応が面倒くさすぎてモチベーションには余り繋がらなかった。

開発合宿!!!

はてなブックマークは合宿で作られた
やろうぜ -> 次の日に合宿 -> こんなのできたよー -> ベータリリース みたいなスピード感
非参加者を巻き込むの大事。

ColdFusion で日付処理

元ネタ:誰もが一度は陥る日付処理。各種プログラミング言語におけるDateTime型/TimeStamp型の変換方法のまとめ - Yuta.Kikuchiの日記
ColdFusion がないので書いてみた。
って、「普通ねえよ」とか、「ColdFusionって何やねん!」とか、「うわーまだ生きてたのかー。」とか反応が普通だろうけどそこはスルー。
「ありがとー」、「たすかった」、「これを探してた」とかいう人は多分居ないけどそれも気にしない。


もう3年ぐらいちゃんと書いてなくて記憶を呼び起こしながら書いた。一応、動作チェック済み。
たまに、こういうことをすると頭の体操になる。

<cfset localDate = now()>
<cfset utcDate   = DateConvert("Local2utc", localDate)>
<cfset epoch     = DateDiff("s", "January 1 1970 00:00", utcDate)>
<cfset utime     = 1371729285>
<cfoutput>
    Local Date: #localDate# <br>
    UTC Date: #utcDate# <br>
    Epoch: #epoch# <br>
    Time :#DateAdd("s", utime ,DateConvert("utc2Local", "January 1 1970 00:00"))# <br>
    yymmdd24hmiss: #DateFormat(localDate, "yyyy/MM/dd")# #TimeFormat(localDate, "HH:mm:ss")#
</cfoutput>

簡単に解説するけど、段々やることが面倒臭くなります。

DateTime
now()

普通にnow関数を呼ぶだけ。

DateTime(UTC)
DateConvert("Local2utc",now())

DateConvert でローカル時間からUTCに変えてあげる。

DateTime -> Unixtime
DateDiff("s", "January 1 1970 00:00", DateConvert("Local2utc",now()))

epoch秒はDateTimeには無い情報なので、ローカル時間をUTCに変更したうえ、epoch0秒である1970/01/01 00:00:00 と秒単位で差分をだしてepoch秒を算出する。面倒臭い。

Unixtime -> DateTime
DateAdd("s", 0 ,DateConvert("utc2Local", "January 1 1970 00:00"))

上記の DateAddの第二引数0にあたるところに変換したいepoch秒を指定します。
DateTimeからUnixtimeを計算したのと同じ要領でその逆をしてあげます。

yyyy/mm/dd 24h:mi:ss の表示
DateFormat(now(), "yyyy/MM/dd")
TimeFormat(now(), "HH:mm:ss")

now() をそれぞれDateFormatとTimeFormatを使って日付と時刻を表示します。
日付時刻両方を上手く出すDateTineFormatというのもありますが、CFMXのバージョン10より前にはそんな関数在りませんので、別々にやってつなぐ必要があります。くそ面倒臭いですね。
CFMX9以下の場合、ColdFusion DateTimeFormat() Utility Function で紹介されてるようなfunctionを実装すればできなくも無いです。

もやもやしたときに

#encoding: utf-8

class Moya
  def なんでだろう ()
    return "なんでだろう"
  end

  def oO (ward)
    buf  = '(´-`).oO( '
    ward = ward.length > 0 ? ward : なんでだろう
    puts buf << ward
  end
end

begin
  (´ー`)= Moya.new
  (´ー`).oO(ARGV.join(' '))
end
% ruby ./moya.rb
(´-`).oO( なんでだろう
% ruby ./moya.rb もやもやする
(´-`).oO( もやもやする

分かったこと。
・マルチバイトの変数、メソッド名は使える
・マルチバイトで始まってても半角記号は変数名に使えない
・クラス名はCamelCaseなので記号や全角は使えない。

対話式git-clean

まー、直前に git clean -d -n しろよ!! ってだけの話で済むんですが、物の弾みとか、コマンド履歴からうっかり実行とか色々有るじゃないですか。
ということで、対話式のgit-clean を書いた。

ただこれをgitエイリアスでgit-cleanに紐付けるとややこしいことになるので、適当な別のものに逃がして下さい。

あと、物の弾みとか、コマンド履歴からよく確認せずに実行とかは改めます。

ソースは以下の通り。

#!/usr/bin/perl

use strict;
use warnings;
use utf8;
use feature ':5.10';

use Getopt::Long qw(GetOptions :config posix_default no_ignore_case bundling );
use Params::Validate qw/:all/;
use Pod::Usage 'pod2usage';
use Term::UI;
use Try::Tiny;

$SIG{__WARN__} = sub {
    my $w = shift;
    die $w if $w =~ /^Unknown\soption/; #
    warn $w;
};

our $BASE_CMD = 'git clean ';

try {
    GetOptions(\my %opt, qw/d X x h f|help/);
    main( valid(\%opt) );
}
catch {
    warn $_;
    pod2usage(2);
    die;
};

exit;


sub main {
    my $p = shift;
    my $term          = Term::ReadLine->new();

    my $option  = join ' ', map { "-$_" } keys %$p;
    my $dry_cmd = $BASE_CMD. '-n '. $option;
    say `$dry_cmd`;

    my $exec = $term->ask_yn(
        print_me => '========',
        prompt   => 'remove really?',
        default  => 'n',
    );

    return unless $exec;
    my $remove_cmd = $BASE_CMD. $option;
    say `$remove_cmd`;
}


sub valid {
    my %p = validate(@_,
        {
            d => { regex => qr/\A1\z/, optional => 1 },
            x => { regex => qr/\A1\z/, optional => 1 },
            X => { regex => qr/\A1\z/, optional => 1 },
            f => { regex => qr/\A1\z/, optional => 1 },
            h => { regex => qr/\A1\z/, optional => 1 },
        }
    );
    pod2usage(2) if $p{h};
    return \%p;
}

__END__

=pod

=head1 NAME git_clean

  git clean を対話式に行う。

=head1 DESCRIPTION

  git clean を対話式に行う。
  git clean -n {opt} にて削除されるファイルを表示した後、実際に削除するかどうか対話式で行う。

=head1 SYNOPSIS

perl git_clean.pl {-d|-x|-X}

=over options

=item B<-f>

.git/config のclean.requireForce が設定されていたなら、削除にはこの引数が必要になる。

=item B<-d>

ディレクトリも対象にする

=item B<-x>

.gitinore を考慮に入れない。これを指定すると.gitignore で指定してあっても削除の対象になる。

=item B<-X>

.gitinore のみを対象にする。これを指定すると.gitignore で指定してあるものだけ削除対象にする

=back

=cut

=head1 SEE ALSO

man git-clean

=cut

YAMLの適当さ。

いままで、インデントに対して凄い厳密かと思ったけどそうでもなかった。

use strict;
use warnings;
use YAML;
use YAML::Syck;
 
my $d = YAML::Syck::Load(<<"EOT");
 
indent1_0:
 indent1_1:
  indent1_2: foo
 
indent2_0:
  indent2_1:
    indent2_2: foo
 
indent_mix:
 indent_mix1:
   indent_mix2: foo
 
key_o:
  - array0_key1: _01
    array0_key2:
      - { _02_array0 : vvvv }
      - { _02_array1 : vvvv }
 
key_t:
  - array0_key1: _01
    array0_key2:
    - { _02_array0 : vvvv }
    - { _02_array1 : vvvv }
EOT
 
warn YAML::Dump $d;
local $Data::Dumper::Indent = 1;
warn Data::Dumper::Dumper $d;

これを実行すると

---
indent1_0:
  indent1_1:
    indent1_2: foo
indent2_0:
  indent2_1:
    indent2_2: foo
indent_mix:
  indent_mix1:
    indent_mix2: foo
key_o:
  - array0_key1: _01
    array0_key2:
      - _02_array0: vvvv
      - _02_array1: vvvv
key_t:
  - array0_key1: _01
    array0_key2:
      - _02_array0: vvvv
      - _02_array1: vvvv
$VAR1 = {
  'key_o' => [
    {
      'array0_key2' => [
        {
          '_02_array0' => 'vvvv'
        },
        {
          '_02_array1' => 'vvvv'
        }
      ],
      'array0_key1' => '_01'
    }
  ],
  'indent_mix' => {
    'indent_mix1' => {
      'indent_mix2' => 'foo'
    }
  },
  'indent2_0' => {
    'indent2_1' => {
      'indent2_2' => 'foo'
    }
  },
  'key_t' => [
    {
      'array0_key2' => [
        {
          '_02_array0' => 'vvvv'
        },
        {
          '_02_array1' => 'vvvv'
        }
      ],
      'array0_key1' => '_01'
    }
  ],
  'indent1_0' => {
    'indent1_1' => {
      'indent1_2' => 'foo'
    }
  }
};

こうなる。

インデントの深さ混ぜても問題無い上に期待したとおりに動いていて逆に怖い。