non vorrei lavorare

昔はおもにプログラミングやガジェット系、今は?

マレーシアのペルヘンティアン島へ行ってきた1日目

背景

奥さんは旅行好き。それもおもに海外旅行。仕事もそれに関連して海外ホテル関係。なので、 英語は読み書きに加えて、喋れる。

自分は、奥さんに命令され、子供のお使い程度に一人でホテルの人や店員さんと 知ってる英語文法と単語を駆使して、なんとか意思疎通ができることがある程度。

2度目のマレーシア入国

前回は、おじいちゃん、おばあちゃんも同行してコタキナバルのタンジュンアルに行き、 そこで、 インスタできれいな写真でボルネオ島の紹介をされている観光ガイドのジェイソン ボルネオ(@jasonborneo)さんのガラマ川のリアルジャングルクルーズを楽しんできた。

www.borneo2leaf.com

今回は奥さんと子供たちの家族4人で、マレー半島側のペルヘンティアン島に行く。

イスラム教徒の多いマレーシアでのお酒がなかったり、豚肉のない、牛肉と鶏肉の食事も全然OKなので 楽しみ。

アラフォーにして初の単独飛行機移動かつ海外へ

すでに、何度か海外旅行は行っているので、 大まかな流れは分かっているつもりだが、いざ一人で飛行機に乗るのは ちょっと緊張した。

羽田からKILA2へ

分かれた家族の飛行機も羽田では30分ほど遅れての出発の様だったけど、 到着はほぼ予定通りだった模様。

家族と合流してコタバル空港へ

イミグレを単独でクリアして、メッセンジャーで奥さんからの到着のメッセージを受信、 KILAの空港のWiFiにつなげて送信してきた模様。

羽田で決めておいたKILA2の待ち合わせ場所で無事合流できた。

船でペルヘンティアン島へ向かう

コタバルの空港内のカウンターで今回のメインの滞在先の ペルヘンティアン島への向かう往復チケットを購入 空港から、指定のタクシーで船着き場へ

タクシーの運転は乗り心地はまずまずだけど、 走り方が怖かった。ちょっとでも遅い車がいると対向車線の 僅かな切れ目が出来るまで、前の車の斜め後ろにピッタリ張り付いて 対向車の切れ目ですかさず追い越し。 右折レーンも追い越し車線として走行。

船着き場の直前の施設(たぶん旅行代理店)にて

長旅で眠くなってソファーで寝てしまった次男も混んできて 場所を動かそうとしたら皆さんかわいそうだからそのまま寝かせてて良いよ という温かい対応。怖かったけどガンガン飛ばしてくれたタクシーのお兄さんんおかげで、 あとから、同じ飛行機からの旅行者で店内があふれかえってきたので、 子供たちのスペース確保できて得したかも?

ボートで移動

f:id:kjw_junichi:20180724142036j:plain

スピード出して、海上を飛び跳ねながらの移動。

ペルヘンティアン島

複数ある島のホテルに、お客さんを次々下ろして 我々も滞在するホテルで降りた。

海が絵にかいたような水色が広がり、 謳い文句とおり、写真にとると船が浮かんで見える?!

f:id:kjw_junichi:20180724145119j:plain

ホテル

f:id:kjw_junichi:20180724151212j:plain

f:id:kjw_junichi:20180724163756j:plain

昼飯

f:id:kjw_junichi:20180724151249j:plain

夕飯

隣のホテルにいって食べた。

f:id:kjw_junichi:20180724201641j:plain

東南アジア風のチャーハンとそれのご飯の代わりに米でつくった麺が入ったやつなどを注文。

続く

abrakatabura.hatenablog.com

関連記事

macOSのCPU温度をgRPCを使ってElectronで作ったデスクトップマスコットに表示させた

おはようございます。最近子供達はライフル銃のような物を紙工作しています。@kjunichiです。

背景

gopheronでraspberry piのCPU温度の表示が既に出来ていた。

ふと昔のQiitaの投稿

qiita.com

を見つけてから、Swiftが出てからこの辺りのAPI何か変化ないか調べたら、 特に変化はないものの、

github.com

を見つけた。

これで、これまでのRaspberry Piと同様のgRPCのクラサバ方式で gopheronでCPU温度を表示できるはず。

メインの処理はすぐ出来た

gopheron-raspberrypi同様に外部コマンドを起動して結果を取得するだけなので、

というツイートの通り、ファミレスドヤリング駆動であっさり実装できた。

Macらしいアイコンを表示したい!

macOSと分かるアイコンを表示したいと思い、これを実現するのが 険しい道のりだった。

もっとも、アイコンデータを吸い出して、Raspberry PiのCPU温度の表示のするクライアントと同様に クライアント側にアイコンデータを埋め込めば全然難易度低いが、 Githubに公開して場合にアイコンのライセンスが非常に気になる。

f:id:kjw_junichi:20180723082301j:plain

何は無くともアイコンデータ

以下の記事に助けられ、

/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を使う方法に続く。

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を特定のスレッドから 呼び出す必要があったりする模様。

参考資料

関連記事

Cocoaつながり

14年前の記事

8年前の記事

3年前の記事

2年前の記事

2018年のAmazonプライムデーで買ったものメモ

こんばんは、最近次男は料理の手伝いをやりたがります。長男もそんな時期があったので、一時的なものなのかもですが、ずっとそれが続いてほしいと思ってます。@kjunichiです。

背景

何度かプライムデーで買い物はしているが、正直、kindleなどamazon関連品はお買い得感あるけでどPC系は毎度微妙

Surface goが出てなければ、15マンの

買ったもの

プライムデーで割引対象にならないものも買っている気がするけど。

まずは、初代のTV Stickが激おそなので、改善に期待して

ポイント還元に期待してこの機会に購入

ポイントの事さっぱりわかってないけど。

あわせ買い対象でこの機会に購入する品たち

来週マレーシアに旅行に行くのでその準備の品たち

新婚旅行で行ったオーストラリアのケアンズのデパートでは顔が大きすぎてサイズの合うサングラスがなかったけど、これ大丈夫か?w

ホテルのコンセントの配置によっては念のために単純な変換プラグも追加購入

18万のsurface proが15万に下がっているけど買えない悔しさで買った品

やっぱりsurface goが欲しい

関連記事

1年前の記事