マレーシアのペルヘンティアン島へ行ってきた1日目
背景
奥さんは旅行好き。それもおもに海外旅行。仕事もそれに関連して海外ホテル関係。なので、 英語は読み書きに加えて、喋れる。
自分は、奥さんに命令され、子供のお使い程度に一人でホテルの人や店員さんと 知ってる英語文法と単語を駆使して、なんとか意思疎通ができることがある程度。
2度目のマレーシア入国
前回は、おじいちゃん、おばあちゃんも同行してコタキナバルのタンジュンアルに行き、 そこで、 インスタできれいな写真でボルネオ島の紹介をされている観光ガイドのジェイソン ボルネオ(@jasonborneo)さんのガラマ川のリアルジャングルクルーズを楽しんできた。
今回は奥さんと子供たちの家族4人で、マレー半島側のペルヘンティアン島に行く。
イスラム教徒の多いマレーシアでのお酒がなかったり、豚肉のない、牛肉と鶏肉の食事も全然OKなので 楽しみ。
アラフォーにして初の単独飛行機移動かつ海外へ
すでに、何度か海外旅行は行っているので、 大まかな流れは分かっているつもりだが、いざ一人で飛行機に乗るのは ちょっと緊張した。
羽田からKILA2へ
分かれた家族の飛行機も羽田では30分ほど遅れての出発の様だったけど、 到着はほぼ予定通りだった模様。
家族と合流してコタバル空港へ
イミグレを単独でクリアして、メッセンジャーで奥さんからの到着のメッセージを受信、 KILAの空港のWiFiにつなげて送信してきた模様。
羽田で決めておいたKILA2の待ち合わせ場所で無事合流できた。
船でペルヘンティアン島へ向かう
コタバルの空港内のカウンターで今回のメインの滞在先の ペルヘンティアン島への向かう往復チケットを購入 空港から、指定のタクシーで船着き場へ
タクシーの運転は乗り心地はまずまずだけど、 走り方が怖かった。ちょっとでも遅い車がいると対向車線の 僅かな切れ目が出来るまで、前の車の斜め後ろにピッタリ張り付いて 対向車の切れ目ですかさず追い越し。 右折レーンも追い越し車線として走行。
船着き場の直前の施設(たぶん旅行代理店)にて
長旅で眠くなってソファーで寝てしまった次男も混んできて 場所を動かそうとしたら皆さんかわいそうだからそのまま寝かせてて良いよ という温かい対応。怖かったけどガンガン飛ばしてくれたタクシーのお兄さんんおかげで、 あとから、同じ飛行機からの旅行者で店内があふれかえってきたので、 子供たちのスペース確保できて得したかも?
ボートで移動
スピード出して、海上を飛び跳ねながらの移動。
ペルヘンティアン島
複数ある島のホテルに、お客さんを次々下ろして 我々も滞在するホテルで降りた。
海が絵にかいたような水色が広がり、 謳い文句とおり、写真にとると船が浮かんで見える?!
ホテル
海
昼飯
夕飯
隣のホテルにいって食べた。
東南アジア風のチャーハンとそれのご飯の代わりに米でつくった麺が入ったやつなどを注文。
続く
関連記事
macOSのCPU温度をgRPCを使ってElectronで作ったデスクトップマスコットに表示させた
おはようございます。最近子供達はライフル銃のような物を紙工作しています。@kjunichiです。
背景
gopheronでraspberry piのCPU温度の表示が既に出来ていた。
ふと昔のQiitaの投稿
を見つけてから、Swiftが出てからこの辺りのAPI何か変化ないか調べたら、 特に変化はないものの、
を見つけた。
これで、これまでのRaspberry Piと同様のgRPCのクラサバ方式で gopheronでCPU温度を表示できるはず。
メインの処理はすぐ出来た
gopheron-raspberrypi同様に外部コマンドを起動して結果を取得するだけなので、
ファミレスでドヤリングしてmacOSのCPU温度を表示するサーバ、クライアントの開発がほぼできたw
— kjunichi (@kjunichi) 2018年7月21日
RaspberryPi向けのアイコンをmacOSっぽいのに変えないとなぁを pic.twitter.com/3LrDZc6uQg
というツイートの通り、ファミレスドヤリング駆動であっさり実装できた。
Macらしいアイコンを表示したい!
macOSと分かるアイコンを表示したいと思い、これを実現するのが 険しい道のりだった。
もっとも、アイコンデータを吸い出して、Raspberry PiのCPU温度の表示のするクライアントと同様に クライアント側にアイコンデータを埋め込めば全然難易度低いが、 Githubに公開して場合にアイコンのライセンスが非常に気になる。
何は無くともアイコンデータ
以下の記事に助けられ、
/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/FinderIcon.icns
のファインダーのアイコンを使えば良さそうだと発見。
このアイコンの画像データをgRPCでクライアント側にimgタグにData URI形式して埋め込んで、 クライアント側にHTMLデータとして送信して、gopheron側で、HTMLをレンダリングすれば、 macOSを示すアイコンが表示されるはず。
icnsファイルをどうやって読み込むか
libicnsなるUNIX系なライブラリを発見するも、ハタと考えた。 今回はgRPCサーバ側の処理はmacOS限定なので、Cocoa APIで手軽にできそうなら そちらで実装した方がスッキリ出来そう。
cgoからCocoa APIを使う
数年前に、Cocoa APIをcgoで使う以下の記事を読んでいたので、Objective-Cと連携させれば出来そうな事が分かってはいたが、 今回改めて調べたら、以下が見つかった。
http://unknownplace.org/archives/cgo-and-eventloop.html
ポイントは、CFLAGSでの指定と、LDFLAGSで依存するフレームワークを指定するところ。
#cgo CFLAGS: -x objective-c #cgo LDFLAGS: -framework Foundation -framework AppKit
Cocoa APIの冒険
ここで、一旦Cocoa APIを使ってicnsファイルを読み込んで、PNG画像データをData URI形式の 文字列を返却するObcjective-Cのコードを書いておく。
icnsファイルをCocoa APIで読み込むには
を見つけたが、試行錯誤したものの、どうもダメ。 以下のコードが自分の環境では動いた。
NSBitmapImageRepにimageRepsWithContentsOfFileなるファイルパスを指定すると配列に読み込んでくれるメソッド?が 見つかった。
配列からは、本来は、使いたい画像サイズから適切な画像要素を取得するべきなのだろうが、メンドくさいので、 2番目を決め打ちで指定している。
NSString *path = @"/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/FinderIcon.icns"; NSArray * imageReps = [NSBitmapImageRep imageRepsWithContentsOfFile:path]; NSImageRep *imageRep = [imageReps objectAtIndex: 1];
PNGのバイナリデータを取得するには
NSBitmapImageRep型になっていれば、そこから指定した画像フォーマットを取得するのは簡単だった。 でもpropertiesを明示的に指定しないと落ちたのでこの点は要注意。
NSData *data = [imageRep representationUsingType:NSPNGFileType properties : nil];
NSData型のデータをBase64エンコードするには
base64EncodedStringWithOptionsを使えば出来る。昔はbase64EncodedStringもあったが、現在は base64EncodedStringWithOptionsが推奨されてる模様。
NSString *pngstr = [data base64EncodedStringWithOptions:0 ];
NSString型をchar*型に変換するには
cgoでGo側に連携するためにC.String型に変換する必要がある。 以下のコードで行えた。
int len = [pngstr length]; char *buf = (char*)malloc(sizeof(char)*(len+1)); strcpy(buf, [pngstr UTF8String]);
cgoでObjective-Cの結果を扱う
Objective-Cで作った関数を呼ぶには
CやC++同様にC.関数名で呼び出せる。
tmpStr := C.getFinderIconStr()
cgoでCString型をGoのstring型に変換するには
pngDataUrl := C.GoString(tmpStr)
cgoでCStringの領域を解放するには
C.free(unsafe.Pointer(tmpStr))
成果物
動かし方
macOS側で
go get -u github.com/kjunichi/gopheron-macos cd $GOPATH/src/github.com/kjunichi/gopheron-macos go run server/main.go
gopheronを動かすPCで
go get -u github.com/kjunichi/gopheron cd $GOPATH/src/github.com/kjunichi/gopheron go build gopheron.go ./gopheron & node macosClient.js hostname.local
まとめ
Cocoa APIを調べるとiOS専用っぽいAPIが出てきたり、SwiftのAPIだったり、cgoで使える型式で すぐには見つからないこともあるようだ。
今回はgoroutineを使ってないから、あんまり問題なさそうだが、Cocoa APIを特定のスレッドから 呼び出す必要があったりする模様。
参考資料
関連記事
- Raspberry Piの温度をgRPCを使ってElectronで作ったデスクトップマスコットに表示させた
- DeprecationWarning: grpc.load: Use the @grpc/proto-loader module with grpc.loadPackageDefinition insteadの警告を消すには
- gRPCでmojaveに勝利してリモートからWebカメラを利用した
Cocoaつながり
14年前の記事
8年前の記事
3年前の記事
2年前の記事
2018年のAmazonプライムデーで買ったものメモ
こんばんは、最近次男は料理の手伝いをやりたがります。長男もそんな時期があったので、一時的なものなのかもですが、ずっとそれが続いてほしいと思ってます。@kjunichiです。
背景
何度かプライムデーで買い物はしているが、正直、kindleなどamazon関連品はお買い得感あるけでどPC系は毎度微妙
Surface goが出てなければ、15マンの
買ったもの
プライムデーで割引対象にならないものも買っている気がするけど。
まずは、初代のTV Stickが激おそなので、改善に期待して
ポイント還元に期待してこの機会に購入
ポイントの事さっぱりわかってないけど。
あわせ買い対象でこの機会に購入する品たち
来週マレーシアに旅行に行くのでその準備の品たち
新婚旅行で行ったオーストラリアのケアンズのデパートでは顔が大きすぎてサイズの合うサングラスがなかったけど、これ大丈夫か?w
ホテルのコンセントの配置によっては念のために単純な変換プラグも追加購入
18万のsurface proが15万に下がっているけど買えない悔しさで買った品
やっぱりsurface goが欲しい
関連記事
- Amazonのkindle fire HD6が届いた
- Amazon dashボタンをWindowsで使うまで 完結編
- Node.jsとAmazon Dashボタンで鬼が来たボタンを作った
- WindowsだけでAmazon DashボタンのMACアドレスを取得できるjsを書いた
- 2018年、買ってよかったモノ(その1)
- Fire7(第7世代)が届いた
- 2018年アマゾンのサイバーマンデーで買ったもの
- 2019年のAmazonプライムデーで買ったものメモ
- 2020年Amazonプライムデーで買ったもの
- 2021年Amazonプライムデーで買ったものメモ