YAMAGUCHI::weblog

海水パンツとゴーグルで、巨万の富を築きました。カリブの怪物、フリーアルバイター瞳です。

make関数でチャネルを作成する際にキャパシティを指定しない場合の内部動作

はじめに

こんにちは、Stackdriver担当です。Goの make 関数はあらゆるビルトイン型の作成を行う役割を担っているわけですが、諸用でチャネルを作成する際にキャパシティを設定しなかった場合にデフォルト値の0を設定する処理はどこでやってるのかなと思って見てみました。

Go言語による並行処理

Go言語による並行処理

TL;DR

メモ書き

Goのbuiltinは src/builtin/builtin.go にあると見せかけて、それはgodocのために書いてあるだけのダミー。 実際は src/rumtime 以下と src/cmd/compile/internal/gc 以下に隠されている。

src/runtime/chan.go には func makechan(t *chantype, size int) *hchan があり、これが唯一のチャネルを作る関数。したがって、これを呼び出すときにはintの引数が必要になる。

makechan 関数は src/cmd/compile/internal/gc/walk.go 内の func walkexpr(n *Node, init *Nodes) *Node構文解析した結果のノードのオペレーターが OMAKECHAN という識別子になっていた場合に呼ばれている。

OMAKECHAN はどこで呼ばれているかと言うと、src/cmd/compile/internal/gc/typecheck.gofunc typecheck1(n *Node, top int) *Node 内でやはりオペレーターが OMAKE だったときに呼ばれていて、かつその引数が TCHAN (チャネルの識別子)だった場合に呼ばれている。

go/typecheck.go at ae9c822f78d5048aa4290b06a5a38f67aaf23dbe · golang/go · GitHub

case TCHAN 内で i という値は引数の数として i = 1 (=チャネル型を指定しているところ)がまず最低限の数として定義されていて、もしこの他に引数がある(=キャパシティ)の設定がされている場合にはその値を設定している。

で、知りたかった、キャパシティの引数が設定されていない場合は、 n.Left = nodintconst(0) が設定される。 詳細は省くが nodintconst(0) は名前の通り 0 というintの値を持ったノードを作って返すので、ここでデフォルト値のキャパシティの0が設定されている、ということでした。

GoでStackdriver Logging向けのログをお手軽に出力する設定

はじめに

こんにちは、Stackdriverで遊んでいる人です。Stackdriver Loggingは標準出力に出されたJSON形式のログをFluentdベースのエージェント経由でいい感じに表示してくれます。

一方でGoに限らず通常のロギングライブラリは標準エラーにログを吐くという感じになるのですが、Stackdriver Loggingの場合デフォルト設定だと標準エラーに吐かれたログはすべてエラー扱いになりますので(まあ当たり前だよな)、そのあたりのすり合わせ調整が必要。

標準の log パッケージの場合

標準パッケージだけ使うのであれば、とりあえずこれだけやっておけばOK

  • 標準出力に出す(GKEの場合)
  • JSON形式でいくつかの決められたフィールド名(message, time, severity)を満たす

ということなのでこういう log.Loggerインスタンスを作ってあげる感じになりそう。

func sdLog(l *log.Logger, severity, msg string) {
    now := time.Now().Format(time.RFC3339Nano)
    entry := map[string]string{
        "time":     now,
        "severity": severity,
        "message":  msg,
    }
    b, err := json.Marshal(entry)
    if err != nil {
        log.Fatal(err)
    }
    l.Print(string(b))
}

logger := log.New(os.Stdout, "", 0)
sdLog(logger, "info", "hello")

logrus を使う場合

上の条件を満たすだけなんだけども、 logrus の場合はJSONFormatterがあるし、logrus.Loggerに各種ログレベルにあわせたメソッド(InfofWarnf など)があるので楽に設定できる。

log := logrus.New()
log.Level = logrus.DebugLevel
log.Formatter = &logrus.JSONFormatter{
    FieldMap: logrus.FieldMap{
        logrus.FieldKeyTime:  "timestamp",
        logrus.FieldKeyLevel: "severity",
        logrus.FieldKeyMsg:   "message",
    },
    TImestampFormat: time.RFC3339Nano,
}
log.Out = os.Stdout

Stackdriver LoggingのGo用のクライアントライブラリを使う

これを使っていいならはじめから使ったほうが良い。ただ個人的には logrus のほうがseverityに応じたヘルパーメソッドがあるので使い勝手が良いように感じる。

godoc.org

client, _ := logging.NewClient(ctx, projectID)
logger := client.Logger("my-log")
// Text Payload
logger.Log(logging.Entry{Payload: "Hello, world!")

// JSON Payload
type MyEntry struct {
    Name  string
    Count int
}
logger.Log(logging.Entry{
        Payload: MyEntry{Name: "Bob", Count: 3},
        Severity: logging.Critical,
})

ターミナルのデモ用プロファイルで特定の環境変数を反映させる

はじめに

こんにちは、Stackdriver担当の者です。仕事柄デモを大勢の前で行う機会が度々あるのですが、その際にターミナルのプロファイルを普段使っているものと分けたくなりました。とりあえずこういう形が良いかなというところで落ち着いたのでメモしておきます。

やりたいこと

  • 文字サイズの変更(デモ用なのでとても大きく)
  • 起動時に環境変数の読み込み
    • PS1をシンプルなものに
    • GCPAWSなどのcredentialを自動で環境変数に設定し、デモ中に読み込みの必要を無くす。また万が一ターミナルを落としてしまっても、同じプロファイルで起動するだけで良くする。

各種ターミナルエミュレータでの設定

macOSのiTerm2での設定

macOSではiTerm2を使っていますが、Profileの設定でCommandという項目があります。

f:id:ymotongpoo:20180821132428p:plain

ここを "Login shell" ではなく "Command" にチェックを入れ、起動させたいコマンドを書くわけですが、ここにこれから書くシェルスクリプトへのパスを書いておきます。

LinuxでのGNOME Terminalでの設定

マシンによってはLinuxデスクトップ環境で、GNOME Terminalを使っています。その場合も同様に "Run a custom command instead of my shell" にチェックし、そこに同様にシェルスクリプトへのパスを書いておきます。

f:id:ymotongpoo:20180821133550p:plain

.demo.sh の内容

起動時に呼び出すコマンドは単純に通常使っているシェルを呼び出し、その後各種環境変数の設定をexportします。

#!/bin/bash
export DEMO=1
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/credential.json
export AWS_ACCESS_KEY=xxxxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxx
export AWS_DEFAULT_REGION=us-east-2
source /path/to/venv/bin/activate

exec /bin/zsh

ここで先頭の DEMO という環境変数は、自分の .zshrc 内でプロンプトの切り替えを行うために設定しています。

...
if [ -n "${DEMO}" ] && [ "${DEMO}" = "1" ]; then
  PROMPT="> "
fi
...

これでデモ用プロファイルを指定して立ち上げるだけでいい感じになりました。

深圳に行ってきた(その2)

はじめに

こんにちは、Stackdriver担当になったものです。StackdriverはGoogle Cloud Platform内の製品群で、ロギング、エラーレポート、トレース、モニタリングなどを扱いやすくするものです。

さて、この記事は下の「深圳に行ってきた(その1)」の続きです。

ymotongpoo.hatenablog.com

華強北(华强北)の雰囲気

自分が行ったのはまさに今週の水曜日なので夏が始まったばかりだったのですが、外気温は34度。とてもじゃないけど外にい続けたら暑くてかないません。

歩道の幅が青山通りくらいあるので、人が少なく感じますが、実際歩行者の数自体もそんなにいなかった気がします。平日だから、というのもあると思いますが、多くの人が建物内にいたのでしょう。また近くに昼食を取れるお店が多くなく外に出たくないので、デリバリーを頼む人が多かったのか、電動スクーターが数多く走っていました。深圳に来て驚いたのは、QR決済よりも電動スクーターの数とその馴染み方です。

上のようにデリバリーサービスの電動スクーターが普通に日本の原付スクーターと同じような感覚でバンバン走っていました。広場からちょっと外れた通りではこのような馴染み具合。

どれくらい電動スクーターが多いかは駐輪されている数をみると明らかです。近くに止められていたもののうち半分以上が電動スクーターでした。

一方で、レンタル自転車も健在です。道路の反対なので見づらいですが、黄色いのものがofo、オレンジのものがmobikeです。

ところで、わりときれいめな写真ばかり載せてきましたが、やはり急速に発展したところには必ず光が当たらない場所もあり、ビルの中にはがらんどうになっているブースやビルの中でもゴミが散乱していることもあり、館内禁煙の建物でも普通に廊下で喫煙している人がいたりします。

そうした建物を子供が遊んでいるのを見ると、なかなかに切ない気持ちになったりすることもあります。

京基100(KK100)

さて時間はあっという間に過ぎて3時過ぎ、深圳から香港まで2時間かかることを考えると、そろそろ別のところに移動してもう一つ何かみたいなと思っていたところに良いものを見つけました。

遠くに見える高い先に向かって尖ったビルは深圳で最も高いビルである京基100です。これは行ってみる価値がありそうだということで、タクシーを捕まえられないかとビルの方向に歩いていましたが、結局地下鉄に乗りました。

大劇院(大剧院)駅から直結で建物には入れましたが、京基100には展望台はないと言われます。残念だなあと思っていたところ、中にあるホテルの利用者であれば行けるとのこと。そして、96階にある展望ができるラウンジは一人230元(3800円)払えば「アフタヌーンティー」の利用ができるとのこと。次いつ来るかもわからないし、スカイツリーの450m展望台にはもっと高い料金を払って行ったことがあるので、まあいいか、ということで入りました。

96階からの眺めはなかなかに圧巻で、深圳が中国で3番目に大きな都市だということをあらためて意識させられる眺めでした。ガスで霞んでいるのも、発展している地域であるからこそかなと思いました。ところで230元払った「アフタヌーンティー」ですが、割と良心的なもので、230元までならメニューにある飲み物と食べ物を自由に頼んでも良いというものでした。ビールを数杯とチーズを食べつつ、96階からの眺めを堪能できるのはなかなかの体験です。

面白かったのは国境側の眺めで、川を挟んで向こう側とこちら側で明らかに発展の様子が違う。実際に帰りにMTR羅湖駅から撮った写真でも其の様子は明らかです。

MTR羅湖駅は深圳から見たら川向こうで、先の写真のように非常に牧歌的な風景でした。そして遠くに見える深圳の町並みは急速に発展した近代都市という感じです。

中国を垣間見る

深圳の街中にもプロパガンダ広告をしばしば見かけました。

「人民には信仰があり、民族には希望があり、国家には力がある」これは一昨年の共産党党大会での習近平の言葉ですね。 またほかにも電気街の建物の中に次のような垂れ幕がありました。

見切れていますが、これも去年の共産党党大会で習近平が触れた「習近平による新時代の中国の特色ある社会主義思想」が、そのまま垂れ幕としてかかっています。

さきほどの京基100からの風景を見たり、街中の発展を見ていても感じましたが、国が特区として開発を進めることの利点はトップダウンのスピード感だと思います。深圳がこれほどまでに急激に発展して世界有数の技術特区になったのは、ひとえに国策によるものでしょう。

電気街のビル内に局所的に見られた荒廃も、今後の発展で上書きされ、また新たな発展をしていくのでしょう。実際、華強北から京基100に向かって歩いているときも、古いビルを潰して新しい巨大なビルを建築している工事現場の横を通りました。

巨大な中国がトップダウンで開発を進めているその根底にあるのは、こうした共産的な動きなのだなと、改めて感じました。

深圳は面白い街でした

単純に電気街を歩くというのは自分のような人間には楽しいもので、時間を忘れてすごせるので、またぜひ来てみたいです。 それだけでなく、もともとの深圳がまだ残っている場所は今回の訪問では見ていないので、次回来たときにはぜひ見たいと思います。 また次回来るまでには新たな開発が行われていることでしょう。そうした街の変化もぜひ見てみたいです。

深圳に行ってきた(その1)

はじめに

こんにちは、最近部署異動をして、弱くてニューゲームを始めたものです。今週香港に出張があり、せっかく香港まで行くのでついでに深圳にも行っておいたほうがいいなと思ったので行ってきました。なかなか楽しかったので、忘れないうちにメモ書きを残しておきます。 中国本土に行くのも初めてだったので、事前情報調べずに準備してたらもったいないこともしたので、そのあたりもメモしておきます。後半は写真が多くスクロールが長くなります。

エントリが長くなったので前後編に分けてあります。後編はこちらです。

ymotongpoo.hatenablog.com

前提

今回の深圳訪問は次のような前提で行ってます。

  • 香港に事前に数日間滞在している
  • 深圳自体には平日に日帰りで訪問
  • ピンポイントに華強北(华强北)に行って電気街の様子を見るのが主な目的
  • SIMは事前に動くとわかっているものを持っていった

事前準備

現金

「最悪現金があればなんとでもなる、ただし換金はお得にしたい」ということでいろいろ画策しましたが、結局国境付近で両替すればいいか、という話になって深圳入国後に近くに会った両替所で替えました。

ソニー銀行に口座を持っていて、普段は外貨はそっちから引き出してるので、はじめはそこの外貨普通預金に適当に人民元を入れておけば、人民元対応ATMで引き出せるかなと思って入れておいたんだけどどうも引き出せない。 そこでソニー銀行に問い合わせてみたところ、こうした外貨預金系の口座で扱っているのは「オフショア人民元」というもので、実際に中国本土で扱っている人民元とは金融市場での扱いが異なるとのこと。詳細は他のサイトに譲ります。 もしかするとクレジットカードであればキャッシングで人民元を引き出せるかもとのことで試してみたがだめでした。なおHSBCの口座を持っていると人民元が引き出せるようです。

微信支付(WeChat Pay)

深圳といえばQRコードでの支払いの話が必ず出てくる。どれくらい使えるのかはともかく、WeChat Payのアカウントを作っておいて準備だけしておくのが良いだろう、ということで、幸い中国からの同僚がたくさんいることを最大限に利用して、訪問前日にさくっとWeChat Payのアカウントを作った。(WeChat Payのアカウント作成方法に関する記事は関連記事にリンクを貼っておく)

細かいことは関連記事に譲って、結論から言うと特に準備をしていないと自動でWeChat Payアカウントに銀行口座やクレジットカードからチャージすることは出来ません。したがって、手数料諸々を考えると「必要になったら現地でそのへんの人に現金を渡してチャージしてもらう」のが一番手っ取り早い、ということでアカウント開設時に入れた1元以外は入れずに現地に行きました。

クレジットカード

事前に調べたり、香港オフィスの同僚に再確認したところだと、やはりクレジットカードを電気街で気軽に使うのは難しいということなので、銀聯ユニオンペイ)のクレジットカードを持ってない自分としては基本的にはクレジットカード決済はないものとしました。

深圳までの移動

香港から深圳に行く方法はいくつかありますが、自分は香港MTRで行きました。乗り換えが3回あるのが面倒ですが、国境までほぼ確実に1時間半くらいでいけるのと、たった52.5HKD(訪問当時で750円くらい)でいける手軽さを取りました。(そもそも香港で泊まっていたエリアが銅鑼湾という事情もある)

香港島側では上の写真のように混んでますが、深圳が近づくと結構空いてのんびり座れます。

行きは落馬洲という駅まで行って、福田口岸でイミグレーション。(駅直結で迷わず行ける)まずは香港側の出国手続き。出国手続きはすごく簡単で、香港入国時に受け取った入国申請書のカーボーンコピーをさっと取られて終了。

それが終わると今度は広東省側での入国手続き。これまで看板は繁体字と英語が併記してあったものが、途端に簡体字のみ、英語の併記も少なくなり、本土に近づいてきた雰囲気を感じます。また上の写真のあとにものすごい数の監視カメラが設置してあって、とてもじゃないけどカジュアルに写真を撮る感じではなかったので写真は控えました。

ただ入国審査自体は結構スムーズで、審査所のすぐ近くにある申請書にぱぱっと書いて提出して指紋と顔写真を撮られるだけで特に質問もされずあっさり入国。

深圳内での移動

無事、深圳に入れたので華強北に移動します。深圳地下鉄4号線で早速移動!と思ったのですが、そこで驚いたのが、なんと地下鉄の切符を買う前にX線による手荷物検査と金属探知機ゲートがあることです。間違えた場所に来てしまったかと思って手荷物検査所のところにいた警備員に、とりあえず英語で聞いてみるも全部中国語で返されて、本土の洗礼を浴びました。昔取った杵柄で中国語(普通語)で「華強北に行きたいんですが」と聞くと、「ここを通るんだ」と言われたので、そこで始めて仕組みを理解しました。

ようやく切符売り場に来て切符を購入。いろいろな記事で見ていたように、下手するとWeChat Payじゃないと電車に乗れなかったりするのかなと思ったりしましたが、券売機もあるし、WeChat Payの宣伝はあるものの普通に現金で切符を買えました。福田口岸駅から華強北駅までで3元(50円くらい)だったので、地下鉄はめちゃくちゃ安いです。

切符はプラスチックのコインで、中におそらくNFCのようなものが入っています。入場のときにはNFCと同様に改札機の読み取り機に当てて、出場するときはコインを改札機のコイン投入口に入れておしまい。体験としては日本の自動改札と変わりません。

車両やホームは自体は結構きれいで、いくつかしかないですが自分が乗り降りした駅ではホームドアは天井までの設置で(東京メトロ南北線と同様)プラットフォームやコンコースも非常にきれいでした。ただ一つ印象に残っているのは、プラットフォームにいたのが駅員ではなく「警備員」だったという点です。

華強北(华强北)の電気街

香港の銅鑼湾駅を発ってから2時間弱で華強北にやってきました。出入国含めてこれなので結構近いなという印象です。

広場はとにかく幅と規模が広くて、感覚だと6車線分くらいの幅がある歩道の両側に、ヨドバシAkiba/ヨドバシ梅田くらいのサイズの電気屋がバンバン建っているという感じです。(正確な比較はしてませんが雰囲気そんな感じ)

そうしたビルの中を覗いてみると、いわゆる家電量販店ではなく、秋葉原のラジオデパートやラジオ会館が超巨大サイズになった感じで、小さい商店がたくさん並んでいます。本当におもしろかったのは「华强电子世界」の5階が全部LED関連製品しか売っていなかったこと。ヨドバシAkibaのサイズのフロアでLEDだけ。

整っているお店とそうでないお店の差は激しくて、整っているお店はきっちり陳列されていて、中に客が座れるような座席もあったりするほどだけれども、そうでないお店は倉庫の延長で、ただひたすら荷物のパッキングをしていたり、あるいは何をしてるかよくわからないけど、ひたすらぼーっとしていたりします。

2つめのこの白い封筒のようなものが高く棚いっぱいに積み上がっているのは、スマートフォンのタッチパネル部分で、各機種のものがたくさんあります。手前のお姉さんはきちんとしたパッケージに詰め替えてから、細かくステッカーを貼るという作業を店先で行っていました。自分たちがAliExpressなどで見かける製品はこうした場所から出荷されているのかなあ、などと想像していました。

気になるQRコードでの支払いですが、特にそれがないと電気街で支払いが出来ないという感じではなく、見かけただけでもQRコード決済と現金決済が半々と言ったところでした。(タッチパネル屋さんでもQRコードが店先に貼ってありますね)ただどこもたいていWeChat Payには対応してて、AliPayと両対応しているところが多いなという印象です。クレジットカードカード対応はしていません。

そろそろお腹が空いたなということでお昼ご飯をそのまま電気街ビルの中で食べようとフードコートのような場所に行って排骨菜飯を注文。16元(270円)って安すぎる。。。味はアジアだけあって普通に松屋とかにあったら頼むなあというような味。

やはりこちらの人たちは長年かけて歴史を作ってきただけあって、白米を美味しく食べる方法を知っていると感じました。白米そのものの味は日本の米が最高であることはまず間違いないのですが、米をどう調味したら、それも安く、美味しく食べられるのか、という積み重ねがこれなんだなと。シンガポールで食べた経済飯も似た見た目なので、きっとこういう味に行き着くんだろうなあ。結局塩と油がいい感じに入っているとそれなりに美味しく感じてしまうようです。ただ、排骨は安いだけあってほぼ骨でした。

腹もおさまったので別のビルに行き店内をうろつきます。こちらのビルは多少整ってはいるものの、子供がはしゃいでいたり結構パワフルな状況です。下の写真は建物内でスケボーをしていた子どもたち。直前までスケボーでダッシュしていました。奥の方にも黄色いTシャツの子供が写っていますが、彼もキャッキャ遊んでいましたね。

深圳の電気街に来て思ったのは、店番をしている人たちの年齢や性別がまったくランダムで、様々な人が働いているということ。また本当に皆かしこまらずに過ごしていて、訪ねたのがお昼どきだったこともあり、多くの店員さんは店先でお弁当や出前を食べていました。

建物の中に弁当のワゴン販売もあったりしました。奥に写っているベビーカーに座っている子供はおそらく店員の子供。深圳の電気街のお店は家族経営で成り立っているお店も多いなと感じました。

こちらのお店はソフトウェアの販売をしているようでしたが、おそらく母親らしき人と長男らしき人が一生懸命イラストレーターを駆使して宣材を作っていました。手前で子どもたちが暇そうに一人遊びをしています。

深圳で気になったのは、建物内に同じものを売っているお店が超大量にあるということ。彼らはお互いにどうやって販路を確保して、どうやって生計を立てているのだろう。店賃はいくらだろう。家族でここで仕事をしているということは自営業なんだと思うけれど、どういう生活をしているのだろう。上の写真は、スマートフォンのケースだけを売っているお店が並んでいる一角。ここ以外に建物内で同様のお店を20軒以上は見かけました。単純に問屋が一箇所に集まっているだけ、と考えて、ここから世界中に販売しているとすれば、理屈ではなんとなくありえるかなとは思えるのですが、実際暇そうにしている店員を見るといろいろなことを想像してしまいます。

長くなってきたので、その2に続きます。

ymotongpoo.hatenablog.com

関連記事