読者です 読者をやめる 読者になる 読者になる

Write and Run

it's a simple way, but the only way.

LINEインターンに参加した

40万円

f:id:koba789:20160904022502j:plain

LINE Payのチームでなんかの実験環境を作ったりしました。

f:id:koba789:20160902132637j:plain

例えば、これは最終日の昼に食った肉です。

f:id:koba789:20160807073851j:plain

たまたま倒壊していなかったときの建物です。

ほかにもなにかを作ったりしました。はやくリリースされるといいですね。

f:id:koba789:20160807034851j:plain

つくばから東京までは自転車で行って、五反田のベッドで寝てました。

f:id:koba789:20160825100314j:plain

これは見えるやつです。

f:id:koba789:20160826183747j:plain

夜になるとよりよい。

LINE Pay は LINE ID: koba789 にお金を送ることができる良いサービスです。

はい

Rustのstd::io::copyとEchoサーバー

気が向いたので Rust でも書いてみるかという感じになって書いてるんですが、TCP Echo サーバーを書くだけで躓いたのでメモ。

fn main() {
    use std::io::prelude::*;
    use std::net::{TcpListener, TcpStream};
    use std::thread;

    let listener = TcpListener::bind("127.0.0.1:8124").unwrap();

    fn handle_client(mut stream: TcpStream) {
        std::io::copy(&mut stream.try_clone().unwrap(), &mut stream);
    }

    // accept connections and process them, spawning a new thread for each one
    for stream in listener.incoming() {
        match stream {
            Ok(stream) => {
                thread::spawn(move|| {
                    // connection succeeded
                    handle_client(stream);
                });
            }
            Err(e) => { /* connection failed */ }
        }
    }

    // close the socket server
    drop(listener);
}

handle_client 内、std::io::copy の引数に std::io::copy(&mut stream, &mut stream) とやりたくなるが、ownership が第1引数に渡ってしまうので第2引数が不正とみなされコンパイルエラーになる。それを避けるために try_clone() しているが、内部的にはファイルディスクリプタの複製をやっているようで、ちょっと無駄っぽい気がする。

std::io::copy を使わずにこうすれば平気。

    fn handle_client(mut stream: TcpStream) {
        let mut buf = [0; 128];
        let mut written = 0;
        loop {
            let len = match stream.read(&mut buf) {
                Ok(0) => break,
                Ok(len) => len,
                Err(ref e) if e.kind() == std::io::ErrorKind::Interrupted => continue,
                Err(e) => break,
            };
            stream.write_all(&buf[..len]);
            written += len as u64;
        }
    }

とはいえ、せっかくのユーティリティ関数使いたいよなぁ。

Rust に詳しい人、ベストプラクティスを教えてください。

Raspberry Pi 2 Model Bが届いたのでB+と比較したりベンチマークしたりしてみた

来月の生活費がありません。KOBA789 です。 来月の生活費がないのに Raspberry Pi 2 が出たと聞いて速攻でポチりました。10人位でまとめて購入したので一気に口座から5万くらい飛んでいきました。未払い各位は僕に生活費を払いに来てください。よろしくお願いします。

さて、その Raspberry Pi 2 Model B が早速届いたのでベンチとかしてみよう、というのが今回の主題です。では張り切っていきましょう。

スペックで見る Raspberry Pi 2 Model B

公式サイトの解説ページ曰く、

A 900MHz quad-core ARM Cortex-A7 CPU (~6x performance)
1GB LPDDR2 SDRAM (2x memory)
Complete compatibility with Raspberry Pi 1

とのこと。CPU が速くなってたり、RAM が倍増してたりします。RAM が 1GB あると VRAM を増やせるので嬉しいですね。

ちなみに Model B+ と比較するとこんな感じ。

Raspberry Pi Model B+ Raspberry Pi 2 Model B
SoC BCM2835 BCM2836
CPU ARM1176JZ-F ARM Cortex-A7
GPU Dual Core VideoCore IV Dual Core VideoCore IV
RAM 512MB 1GB

引用元: High Definition 1080p Embedded Multimedia Applications Processor - BCM2835 | Broadcom, Raspberry Pi 2 on sale now at $35 | Raspberry Pi

写真で見る Raspberry Pi 2 Model B

左が B+ 右が 2 B。ロゴがちょっと小さくなってます。また、B+ の SoC には SUMSUNG のロゴが印字されていますが、2 B は Broadcom のロゴですね。

f:id:koba789:20150205173024j:plain

向きを変えてもう1枚。左が B+ 右が 2 B。

f:id:koba789:20150205173102j:plain

特徴的な裏側。左が B+ 右が 2 B。2 B は裏に ELPIDA のメモリセルがあります。B+ のときは SoC 内蔵だったから容量が小さかったのでしょうか。

f:id:koba789:20150205173135j:plain

追記: こういうことっぽい。賢くなった。

起動

とりあえず手元の microSD に Raspbian を焼いて起動してみました。クアッドコアの証として、2 B はコンソールの左上にロゴが4つ表示されます。

f:id:koba789:20150205184420j:plain

起動速度

参考までに dmesg のログを貼っておくとこんな感じです。

B+

[   32.236583] Adding 102396k swap on /var/swap.  Priority:-1 extents:2 across:2162644k SSFS

2 B

[   15.395821] Adding 102396k swap on /var/swap.  Priority:-1 extents:2 across:2162644k SSFS

速いっぽいです。

/proc/cpuinfo

クアッドコアと聞いて、まずやってみたくなるのはこれですよね?

pi@raspberrypi ~ $ cat /proc/cpuinfo
processor   : 0
model name  : ARMv7 Processor rev 5 (v7l)
BogoMIPS    : 38.40
Features    : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part    : 0xc07
CPU revision    : 5

processor   : 1
model name  : ARMv7 Processor rev 5 (v7l)
BogoMIPS    : 38.40
Features    : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part    : 0xc07
CPU revision    : 5

processor   : 2
model name  : ARMv7 Processor rev 5 (v7l)
BogoMIPS    : 38.40
Features    : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part    : 0xc07
CPU revision    : 5

processor   : 3
model name  : ARMv7 Processor rev 5 (v7l)
BogoMIPS    : 38.40
Features    : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part    : 0xc07
CPU revision    : 5

Hardware    : BCM2709
Revision    : a01041

うひょー! マジで4コアある!!!! しかし、Hardware: BCM2709 というのが気になりますね……。

/opt/vc/src/hello_pi/hello_encode

CPU はたぶん速くなってるだろうという予想がつくので、どちらかというと気になるのはOpenMAX のほうではないかと思います。というわけで動画のエンコードの実験をしてみます。

まずは B+ から。

pi@raspberrypi /opt/vc/src/hello_pi/hello_encode $ time ./hello_encode.bin /dev/null > /dev/null

real    0m4.781s
user    0m3.600s
sys 0m0.450s

次に 2 B。

pi@raspberrypi /opt/vc/src/hello_pi/hello_encode $ time ./hello_encode.bin /dev/null > /dev/null

real    0m2.595s
user    0m1.870s
sys 0m0.130s

2倍とまでは行きませんが有意な差が出ています。この速度差が CPU の高速化によるものなのか、あるいは CPU 同様に GPUクロックアップしているのかという点については今後更に詳しく調べる必要がありそうです。

まとめ

2 B 速いです。まぁこの小さいボードがそんなに速くなってなにが嬉しいんだという気もしますが、$35 でこの性能ですから非常に遊びやすくなったと言えると思います。なにより RAM 1GB が本当に嬉しいですね。

さてなんで私がこれほどまでに(今更) Raspberry Pi で興奮しているのかというと、Raspberry Pi 向けの HDMI キャプチャユニットを開発中だからです。Raspberry Pi で HDMI がキャプチャできれば LT のスライドにオーバーレイでコメント流すデバイスを作ったり、LiveShell のような使い方をしたりということができるようになるんではないかと考えています。

それではまた。

これはcoins Advent Calendar 25日目の記事です

あけましておめでとうございます。今年もよろしくお願いします。

今日がクリスマス、というのが一般的な見識かと思いますが、割と一部ではそうではないみたいなこともあって、というか今日はもうすでに年明けてるかもしれなくて、君の枕元にあったクリスマスプレゼント(ちくわ大明神)の代金はこっそりお年玉から天引きされてた、なんてこともありえるわけです。あそこにベンツが止まっていますが、君のお年玉では買えません。まぁ牧瀬紅莉栖に言わせれば未来の可能性は無限らしいので何言っても嘘にはならないと思いますし、せっかくなのでどんどん法螺吹いていこうかと思います。(ここで法螺貝の音が聞こえるはず。聞こえない人は今すぐ病院に行ってください)

さて、なぜクリスマスの日付について言及したかというと、合理的なクリスマスというのは12月の25日ではないからであります。クリスマスにはケーキと七面鳥を食べたり、カップルであればなんかいい感じの場所に出かけたりするのでしょうが、まともに考えて12月25日にクリスマスを祝う人間(あるいは便乗して盛り上がるだけの人間)が一気にそれらの行動をすればそりゃ世界規模の DDoS なわけで、ケーキも七面鳥も高騰するし、ラブホも満室になるわけです。そこで勘のいい人間はクリスマスを12月26日以降に祝うということを思いつくわけです。俺は勘がいいので気づいたんですよ。どうだ参ったか。三回回ってワンと言え。

そもそもですね、サンタクロースだって1日で全世界を廻らなきゃいけなくて大変なんですよ。キリストが生まれてから2000年ほど経つっぽいですが、2000年もの間サンタクロースはキリストの誕生日前夜の1晩で世界を回るために多額の資金を投入して技術開発を行ってきたわけですからね(いや知らんけど)。ほんと頭が上がりません。でもですね、人類は2000年の時間をかけて賢くなったわけですよ。ピークタイムをずらせばサンタクロースの苦労も減るという偉大な発見を、今日、俺が、この記事で、みなさんにお伝えするわけです。それこそ1年かけて世界を回ればね、もうね、365倍楽なわけですから。365倍楽になるというのは0.5単位取ったら卒業要件を満たせちゃうっていうレベルの革命ですよ、この発見がいかに偉大であるかわかりますか。

そういうことなんでサンタクロースは1日遅れてやってきます。今朝起きた時にプレゼントが届いてなかったと慌てた読者の皆さんも実際ご安心です。プレゼントがなかったのは今年良い子にしてなかったのがバレたからだと落ち込む必要はもうないわけです。まぁみなさんがいい子にしてなかったことはどーせサンタクロースにモロバレですので、プレゼントの内容に関しては期待できないかと思いますが。

ともあれ、coins にもクリスマスプレゼントがありますように。