食道楽1日目

スーツとか言うの明らかにspdにマイナス補正だし就職するとおおよそ外せなくなるしマジ呪いの装備
東京行くとスーツ来てない人増えるしもっとそういう文化広まれ
まじで飛行機初心者は1時間前についてるべき
満席につきアップグレードされた。喜ぶところなんだろうけどめっちゃビビるからやめて頂きたい。。。
朝食べていなかったので鶏カツサンドを頂いた。
650円もしただけに美味しかった
満席だったからか、搭乗手続きが遅くてビビった。
誘導が十分じゃなかったからビビる。
BTを利用した短距離情報提供サービスが実際欲しい
席は中央の一番前だった。CAさんの仕事をチラ見で来て面白いけど外は見れない。。。
タクシングしてるだけでテンション上がるあるある
タービンたんはぁはぁ
離陸まで大して走ってなくて、ストールとかどんだけなんだろうと思った
スロットルによって体感Gが変わるの面白い
カーテン「CAさんが見えるといったな。あれは嘘だ
一時間半のフライトなのに機内食がアンブッシュ「アイエエエ、かにごはん、かにごはん
カニが微妙にいる感じの仕出し弁当ッて感じだった。
アルコールも頼めたけど流石に控えた。。。
札幌まで行くのは何事もなかった
とりあえずホテルに荷物をシュウウウウウ
ちょっと北大まで、フラフラしようとか考えたら死にかけた。ひろすぎんよー(駅から徒歩20分強顔
今日はデバイスのセッション行こうと思ってたら、満席かほぼ満席ばっか。。。
仕方ないので大した興味もなかった有機太陽電池のセッションをうつらうつら聞いていた。
学会のプログラムにwifi使えますって書いてあったからおって思ってたら、(ただし1室に限る)で(゚Д゚)ハァ?ってなった。
しかたがないのでインターネッツリーチャブルマンになりにホテル(全室wifi完備)にチェックインしたら、輻輳してるのか知らんが繋がらなかった(何個もあるルータのSSIDに特に考えずに単一のを振ってたから?)
仕方なく駅前にあったヨドバシカメラでUSB給電の小型無線LANルータを買った。
インターネッツにつながるようになったので札幌、ラーメンで検索、検索ぅしたら、ラーメン共和国の白樺山荘さんが美味しそうだったので行って、みそチャーシューめん(980円)と山形だしのかけ丼(250円)を頂いた。
腹ごなしに駅の南側を散歩してたら、よさ気なイタリアンダイニングと大将がいる寿司屋があったので、かけ丼を食べてなかったら危なかった(´・ω:;.:...
ホテルに帰ってサッポロクラシックを飲みながらこれを投稿してる。

RasbPiにminidlnaを入れてメディアサーバーにする

MiniDLNA?

ReadyMedia (formerly known as MiniDLNA) is a simple media server software, with the aim of being fully compliant with DLNA/UPnP-AV clients. It is developed by a NETGEAR employee for the ReadyNAS product line.

It is not in any way endorsed by the Digital Living Network Alliance®.

SourceForge見ても最終更新日が14/08/26だしシンプルで良さそう(小並感

install

以下Debian/Ubuntu

sudo apt-get install minidlna

config

/etc/minidlna.conf

media_dir={{サーブしたいファイルがあるフォルダ}}

これだけ書いておく。

register

sudo minidlna -R

するとdbにファイルを登録する。

start

sudo service minidlna start

firewall

もしファイアウォールを利用しているなら8200番を開けておく。

golangでpipeするときのpattern

元ネタ

Go Concurrency Patterns: Pipelines and cancellation

読んでいて、このパターン使えばよかったのかという気づきがあったので内容を抜粋してメモする。

channelの基礎の基礎

channelを使って送信、受信したい時は、それぞれch <-, <- chと書けば良い

ch <- x //xをchに送信
<- ch //chから受信
x := <- ch //chから受信した内容をxに代入

channelからいくつの値が送信されるのかが分かっているのならば、この受信演算子を用いることもできなくもない

for i := 1; i < 4; i++ {
    fmt.Println(i, "th value is ", <-ch) // channelから3回受信する
}

rangeとclose

channelをrangeで回すことによってchannelからの受信を簡単にすることができる。

for i := range ch {
    process(i)
}

また、channelをcloseすることでrangeのイテレーションを止めることができる。送信するべきデータを送り終えたり受信側のchannelがcloseした時に、送信側のchannelをcloseすることで処理の終了を伝搬させることができる。

というか、rangeで回すときはcloseしなければ恐らくdeadlockして怒られる。みんな経験あるよね?(震え声

途中終了

rangeとcloseを用いることで処理の終了を伝搬させることができるが、これでは正規に送信が終わるまで、処理を途中で止めることができない。

途中で処理を終了したいときは、途中で処理を終了するためのchannelを新たに作る。このchannelを引数として渡すことで、関数の外から処理を終了させることができるようになる。また、この新たに作ったchannelとそれまで使っていたchannelのどちらからも受信できるように、select構文を用いる。

go func() {
    defer close(out)
    for n := range in {
        select {
        case out <- n * n:
        case <-done: // doneから受信したら即座に処理を終了する
            return
        }
    }
}()

goroutineの生やし方

func processX(done <-chan struct{}, in <-chan <T>) <-chan <T> {
    out := make(chan <T>)
    go func() {
        defer close(out)
        for n := range in {
            select {
            case out <- processX_(n):
            case <-done:
                return
            }
        }
    }()
    return out
}

こんなものが載ってた。<T>は何か知らんが型名

言葉にすると、関数の最初で出力channelを作って、goroutineな無名関数の中で実際の処理を行い、返り値は出力channelってパターン。

むっちゃpipeって感じがして、とりあえずこれを知っておけばgolangでできることがかなり増えそうだと思った。

最後に

golangのgoroutine周りあまり上手く使えていないので、誰かいいチュートリアル教えてください。なんでもしますから

触れなかったこと

  • channelのbuffer
  • runtime.GOMAXPROCS

golangで、実行ファイルがあるディレクトリに移動する

すごくテキトウな目的用のアプリケーションの場合、バイナリと同じ場所に設定ファイル置いておけばいいやーってなるのだけれど、そんな時どうするか

コード

package main

import (
    "fmt"
    "os"
    "path"
)

func main() {
    dir := path.Dir(os.Args[0])
    fmt.Println(dir)
    os.Chdir(dir)
}

golangでXxx型をstringにしたい

悩んだこと

Int64型であるanaconda.Tweet.Idを、map[String][]stringであるnet/url.Valuesに使おうとして詰まった。

答え

fmt.Sprint(foo)すれば良い

アカン奴

strconvにはint型をstringにキャストする関数しか無い

string()関数でキャストしようとすると、utf8でエンコードされたバイト列だとみなされて死ぬ

コード

golangでスライスのdeep copy

結局http://blog.golang.org/go-slices-usage-and-internalsこれ読んだほうが早いのだけれど

package main

import (
    "fmt"
)

func main() {
    s := []int{1, 2, 3, 4, 5}
    s_ := s[3:5]
    s__ := make([]int, cap(s))
    copy(s__, s)
    fmt.Println(s, s_) // [1 2 3 4 5] [4 5]
    s[4] = 1
    fmt.Println(s, s_, s__) // [1 2 3 4 1] [4 1] [1 2 3 4 5]
}