PHPでbtree

f:id:y_d:20180306230107p:plain

golangで書かれた google/btree をPHP7.1に移植してみた。
移植する事が目的ではなく google/btree のソースリーディングだったので、かなり雑な移植になっている。

github.com

ソースの移植 golang --> PHP

golangをPHP7.1に書き換えた訳だけど、配列周りでクラス定義の工夫が必要だったものの、ほぼそのまま書き換えるだけで済んだと思う。メソッドの中身を見ると分かるけどgolangPHPはほぼ同じ行数になっていて、1対1でプログラムを書き換える事ができた。

golang

func (n *node) get(key Item) Item {
    i, found := n.items.find(key)
    if found {
        return n.items[i]
    } else if len(n.children) > 0 {
        return n.children[i].get(key)
    }
    return nil
}

PHP

<?php
public function get(Item $key) : ?Item
{
    list($i, $found) = $this->items->find($key);
    if($found){
        return $this->items[$i];
    }else if($this->children->count() > 0){
        return $this->children[$i]->get($key);
    }
    return null;
}

またgolangでは下記のように組み込み型にエイリアスやメソッド追加ができるため、PHPへの書き換えが難しく悩んだ箇所だった。PHPと比較して、golangにはこういうパフォーマンスに配慮した機能があるのが特徴的だなぁ、と書き換えながら感じた。

type Int int

// Less returns true if int(a) < int(b).
func (a Int) Less(b Item) bool {
    return a < b.(Int)
}

パフォーマンス

せっかくなのでパフォーマンス比較をしておこうと思う。
そもそも実用目的に移植した訳ではないのでパフォーマンスや可読性などは気にもしていなかった訳で、PHP版は1レコードあたり1インスタンスを生成する作りになっていたりと、パフォーマンスがでるはずはないのだけれど。

以下の通りbtreeにデータを流し込んだ時の速度を比較した。検索速度は比較するのが面倒なのでしていない。

golang(10万件データを投入)

$ time go run btree_mem.go --size=100000
   ....省略...
real    0m0.311s
user    0m0.301s
sys 0m0.118s

PHP(10万件データを投入)

$ time php btree_mem.php
   ....省略...
real    0m6.016s
user    0m5.851s
sys 0m0.145s

上記の通り処理時間も google/btree の圧勝だったし(0.3秒:6秒)、google/btree の方が圧倒的に省メモリだった。
※100万件の投入でも google/btree は数秒で終わったが、PHP版は数分間待っても戻ってこなかったので強制終了した

一応念押ししておくと、決してPHP言語そのもののパフォーマンスが悪いとか、golangが優れているとか、そういう事を言いたい訳ではない。
パフォーマンスがでないのはソースが悪いという事とと、そもそもこうした比較をする事が間違っていると思っている。※じゃあ比較すんなよ的な

とあるプログラマの地方移住

f:id:y_d:20180216013721j:image

関東から東北に移住してまとまった時間が経とうとしているのと、今日はちょっと色々あったので、これまでの事を振り返り書いてみようと思う。

地方移住を検討しているプログラマへ向けて自分の経験が多少なりとも何か役に立てば嬉しい。
なお地方移住を勧める訳でも「地方が良い悪い」「都会が良い悪い」という事を言いたい訳でもない。

自分について

田舎や都会の定義は曖昧なので、まずはじめに自分について書いておく。

  • 地元は岩手県盛岡市
  • 神奈川県に10年以上住んでいた
  • 東京のメーカー系SIerで主に受託・派遣・常駐をやっていた
  • 子供が産まれたことをきっかけに数年前に地元に戻った

転職活動

転職活動は大変だった。

会社の絶対数が少ないため応募先の選択肢が非常に少ない。

そして面接を受けるのも大変だった。
自分の場合はSkype面接、東京での面接、勤務地(岩手県)での面接をこなしたが、勤務地での面接は物理的な移動を伴うため面接先のスケジュール調整がとても大変だった。
しかしこれはあらかじめ想定していたので、まずは所属中の会社で退職の段取りを行い、たくさん余っていた有給消化期間で地元に戻り、面接と引越し先の選定を行ってきた。
このやり方で結果的にはうまく行ったが、次の会社が決まる前に退職の手続きをすることになり当時の上司には非常に心配された。まあ逆の立場なら自分も心配しただろう。

給与相場

転職エージェントによると東京の年収は地方の平均1.5倍らしく、例えば東京で年収500万なら地方では333万ということになる。
これは人や地方によって状況は異なるだろうからこの辺にしておく。

物価

都会は物価が高いと言う人がたまにいるが、それは間違いだと感じる。
確かに家賃や駐車場代は都会の方が高いが、都心から離れた場所なら家賃は地元と大差なかったりするし、食材や洗剤などはだいたい同じか、どちらかというと関東の方が安い。
給与平均も含めトータルで見ると都会の方がお金が貯まると思う。

風景

遠くに見える山など、地方ならではの自然に溢れた風景はとても気持ちがいい。
もちろん時間が経つにつれ新鮮味はなくなりはするが、今でも風景に見とれる時はたまにある。

アニメ

テレビで放送されるアニメは限られているのでAmazon Prime VideoとNetflixで見るようになった。
地元ではアニメを見ている人自体少なく感じるが、コンビニではアニメコラボ商品が数多く並んでいて、ちゃんと売れているのか他人事ながら不安になる。

都会も地方も極端には変わらない印象。
相対的に見て関西にはお喋りな人が多いだろうし、そういう地域性はあると感じる。

買い物・娯楽

地元はイオンの支配下にあり、買い物となるとイオンに行くことになる。
お気に入りだったお店が地元には出店してなかったりで、買い物や食事、映画など多少の諦めは必要になるが、そういったものは無くても生きていけるので我慢出来なくはない。その代わり地方ならではの施設もあるので、その辺はバランスだと思う。

交通手段

自家用車がないと生きていけない。電車やバスもあるが網羅率が低いので自家用車がないと本当に生きていけない。
そして雪が降るとヤバい。
自動運転の世界が早くきて欲しいが、雪が降ると車線もクソもないので自動運転なんて出来るのかと不安になる。

最後に

地方移住を検討している人の参考になればと思う。


(この文章は大雪のより軽い交通事故を起こしてしまい、会社を休んだ日の夜に書かれました)

golangでTUIのスーパーマリオブラザーズ

golangがどんなものか軽く触ってみようかと思い、何か題材でもないと触るのも難しいだろうという事で、TUIでスーパーマリオブラザーズでも実装してみようという謎の題材をふと思いついた。

早速実装しては見たものの、本来の目的であるgolangを知る事そっちのけで実装してしまい、あまり理解が深まらないまま今に至る。題材が悪かったかも。

github.com

Githubのリリースページから実行ファイルをダウンロード、解凍、ターミナルから実行で起動します。
操作方法は、左右の矢印キーで移動、上矢印キーでジャンプです。

f:id:y_d:20161105022858g:plain

MacLinuxWindowsで動きますが手元のWindows7だとチラツキがハンパないです。
とはいえMacでコードを書いて、MacWindowsのexeをビルドして、Windowsに配布でそのまま動くというのはなかなか素敵な体験でした。