シンガポール・マレーシア雑メモ

日本からシンガポールへの行き方

シンガポール直行便はやや高く、バンコクかクアラルンプール経由が安い。
今回は行きはバンコク・ドムアン経由、帰りは陸路でクアラルンプールから乗機した。

往路:スクート
成田→バンコク・ドムアン→シンガポール

成田まで
今回始めて大崎発の成り立っ空港行き、Willerのバスを使った。
http://travel.willer.co.jp/narita-osaki/

バスのシートはいくつかのタイプがあるようで、今回は「寝顔が隠せるカノピーチ付き」だった。乗車中寝ることはなかったが、なかなか快適だった。
スクートは成田の第二ターミナル。ゲートはサテライトエリアでけっこう遠いので注意。

サテライトは以前来たときは工事中だったのか、深夜だったのか、何もないイメージがあったが、シャワールームやらメニューがぜんぜん違う吉野家やら充実していた。



スクートは機内WiFiが使えるようだ(今回は利用せず)


シンガポール

飲食系

シンガポール金融街にある屋台村。東京で言えば新橋的な存在だろうか。

中華料理店に入ったらタブレットを渡され注文はここから。

ロボットが置いてある店もある(稼働しているのかどうかはわからない)

シンガポールは全体的に綺麗で健全だが、政府公認の風俗店があるゲイラン地区はそれなりに猥雑な感じ。

その他

中国で話題になっているレンタル自転車はシンガポールにも。何社かあるようだ。

電車の駅の天井には巨大なファンが。

写真ボケちゃったけど、シンガポールの$1硬貨は新旧2種類あって、これは古い方。コインランドリーが古い硬貨しか使えないため、コインを求めて彷徨うことに。

シンガポールからマレーシアへ

シンガポールからマレーシアへはGolden Mile Complexという商業施設の前から早朝に出発。

シンガポールを出国して

橋を渡って

マレーシアに入国。めっちゃゆるい。

マレーシア

マレーシア国内の離島へ渡るフェリー。チケットの買い方がなかなか難しい。チケット買って、定員のチェック?して、乗り間違え内容の札をもらってと3回別の窓口に並ばないといけない。

仕事に明け暮れる日々。


ちなみに、マレーシア国内は酒があまり売っておらず値段も高いが、リゾート地は特区になっているようで、欧州ブランドが現地生産しているらしいビールが安く飲める。
ビール350ml缶が3リンギットで1リンギット25円くらいなので75円くらい。ヒューガルデンは5リンギットだったかな?

クアラルンプールでは350ml缶で10RMくらいする。

クアラルンプールは大都会。

今回泊まったホテルはKLCC駅近く。徒歩10分くらい歩いたと思うけど、商業施設からほぼ直結なので快適。
ユニクロがベストポジション取ってる。

伊勢丹も入ってる。

KL Sentral駅で空港行きの急行列車に乗り換える。


クアラルンプールの空港はKLIAとKLIA2の2つのターミナルがある。

駅を降りるとここにもユニクロ

KLIA2は綺麗で商業施設もいろいろはいってる。


空港内は広く、出国審査をしたあと、ゲートにいく前に再度荷物チェックがある。

bay area滞在雑メモ

Amber Alert

誘拐事件等が発生した時にスマホにこんなアラートが送られてくる。

Uber

ベイエリアではUber/Liftはなくてはならない交通手段になっていて、今回も何度か利用した。

いろいろなバックグラウンドのドライバが多いので話をしていても面白いことが多い。今回は衣類系の商品開発をしているというおばちゃんと会話がはずんだ。15年くらいベイエリアに住んだけど、IT系企業の影響で地下が高騰し、サンフランシスコ周辺の"chamingな"部分はなくなってしまった、まもなく離れるつもりだと言っていた。

絶対お得なアメックス

Uberはアメックスと提携しているらしく、毎月$15のクレジットがもらえるらしい。いつからかわからないが、自分の場合$300分のクレジットがたまっていた。

深夜、場所によってははキャンセルに注意

UberXでリクエストを送ってドライバーが割当られると、後は待つだけなのだが、ドライバーがまっすぐピックアップ場所に向かってくる保証はない。
深夜に空港の近くから乗ろうとしたところ、3人ほど立て続けにキャンセルされた。どうやら空港に行って客を拾ったてキャンセルしたらしい。

ナンバーのない車

USではたまにナンバーのついてない車を見かけるんだけど、これっていいの?

Residence Inn Palo Alto

https://www.marriott.co.jp/hotels/travel/sfomv-residence-inn-palo-alto-mountain-view/
今回泊まったホテル。一泊$300くらい。
プールやランニングマシンもついている。


朝食

ワッフルは自分で作る。

月〜水は夜スナックがでてビール飲み放題。日によっては夕食として十分。

東京からシリコンバレー雑なメモ

いつも海外に行ったりするときは、知見をまとめておこうとするんだけど、ついつい面倒になってやめてしまうので、今回は雑にメモを残してみることにする。

飛行機

HND→LA→SFO
アメリカン航空ボーイング777
2週くらい前にskyscanner経由で取って、往復で72160円。自分が使った記憶の限り最安値。

機内設備

全席AC電源、USB電源あり。機内エンターテインメントも充実してそうだった。
機内WiFiもあり。使わなかったから速度はわからないけど、電源の心配なく使えるならありだね。

これまではデルタかユナイテッドで、たぶんアメリカンは初めてだけど、だいぶ印象良い。

機内食

アメリカンの機内食、一食目はわりと美味しかった。

その後は、まあこんな感じかってところ。


LAXでの乗り換え

到着はターミナルから離れた場所。降りると"Express Connection"と書かれた袋に入った乗り換えのチケットが張り出されていた。

これで早くなるのかと思いきや、入国審査はむしろ遅くなったんじゃないかな、、、

まず、飛行機内のアナウンスで、2008年以降にアメリカに入国したことがある場合は入国書類はいらない、と言われたので書かずにいった。で、自動化ゲートに行こうとしたらExpress Connectionはこっち、と言われ人がいる窓口へ。

以前の様な大渋滞ではないものの、しばらく並んでさて次、という時になって入国書類が必要と言われた。で、書いて戻ってくるとその事情を知らない別の職員に並び直せと言われる(それは押し切って先頭に入ったが)。

そんなこんなで乗り継ぎゲートについたのが出発20分前くらいで、機内預けの荷物も持ってアメリカンの窓口に行くように言われ、外に出て隣のターミナルへ。

なんとかギリギリくらいのゲートに着くと、あれSFO行きじゃない、、、ゲート変更があったらしく、そっちへ。

LAXはいつもなかなかすんなりいかない、鬼門だなぁ。

空港からMountain Viewへ

LAXでのトランジット中にSuperShuttleを予約。

SuperShuttleは前からオススメしてる(サンフランシスコの空港から市街へは「Supershuttle」がオススメ - Hacking My Way 〜 itogのhack日記)んだけど、日本人が使ってるって話はあんまり聞かないなぁ。

今は(ってか4年以上まえから リムジン・タクシー配車サービス「Uber」を利用してみた - Hacking My Way 〜 itogのhack日記) Uberがあるからそれでもいいけど、ある程度の距離があるならSuperShuttleの方が安い。

今回は、乗り場がBaggage Claim出たすぐのところになっていて、青い服を来た係員もいたのですぐにわかった。Web予約しないでその場で予約してる人も多かった。同乗者は自分を入れて3人だったが、他の2人はGoogle I/Oのために来たようだった。

シリコンバレー到着

こんな行程でシリコンバレーに到着。いつも晴れているイメージだが、今日は曇り空で小雨がぱらついていた。

ブレッドボードのサイズはちょっとずつ違う

電子工作をする際によく使うブレッドボード。中でも穴数:400のブレッドボードはスイッチサイエンスでは「普通のブレッドボード」として販売されているくらいで、ブレッドボードといえばこのサイズを思い浮かべる人も多いだろう。

ところが、このブレッドボード、特に規格化されているわけでもないのでメーカーによってちょっとずつサイズが違う。以下、秋月電子千石電商で販売しているブレッドボード。

EIC-801

  • 赤いパッケージ
  • メーカー E-CALL ENTERPRISE CO., LTD.
  • 販売価格 : 270円
  • 84x54.3x8.5mm

BB-801

  • 緑色のパッケージ
  • メーカー CIXI WANJIE ELECTRONICS
  • 販売価格: 200円
  • 82x53x8mm

SGK-BB8455

  • 販売価格: 220円
  • 83.5x54.5x8.5mm

ケースをつくったり選んだりする場合は要注意。
どうせパクるならサイズ統一してほしかった!

Android SDK auto-downloadをCircleCIで有効にする

SDKのauto-download

AndroidのGradle Pluginでは2.2.0-alpha4 (2016/6/23)からSDKのauto-downloadをサポートしている。

ローカル環境で実行する場合、特に意図することなく自動でDLされるが、CI環境でそれを期待して実行するとエラーになる。

* What went wrong:
A problem occurred configuring project ':app'.
> You have not accepted the license agreements of the following SDK components:
  [Android SDK Build-Tools 25.0.2, Android SDK Platform 25].
  Before building your project, you need to accept the license agreements and complete the installation of the missing components using the Android Studio SDK Manager.
  Alternatively, to learn how to transfer the license agreements from one workstation to another, go to http://d.android.com/r/studio-ui/export-licenses.html

原因はメッセージにあるようにlicense agreementsをacceptしてないから。
リモート環境の場合は、lisenceファイルをコピーすればいいとリンク先に書いてある。(上記リンクは古く、以下にリダイレクトされる)
https://developer.android.com/studio/intro/update.html#download-with-gradle

CircleCIでlicense agreementを有効にする

さて、上記のとおりにlicenseファイルをCircleCI上に置ければいいのだが、CircleCIにはビルド時に参照出来るようなファイルを単純に置くことは出来ない。解決策としては、ぱっと思いつくので以下3通りのやり方がある。

1. ファイルをリポジトリに置く
一番簡単な方法だが、licenseファイルを公開するのはよろしくない。Privateリポジトリならいいかも

2. licenseファイルをCIサーバから参照できる場所に置いといてダウンロードする
これが一番応用が効くので良いが、今回はお手軽な方法として、次の方法を使う。

3. 環境変数を使う
licenseに同意した時に作られるファイルandroid-sdk-licenseの中身は以下のように文字列のみ

$cat android-sdk-license
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9c55

この値をコピーして、CircleCIの環境変数に設定する。ここではANDROID_SDK_LICENSE_VALUEとした。


circle.ymlのpreセクションでandroid-sdk-licenseファイルを所定の場所に作成する

pre:
    - mkdir $ANDROID_HOME/licenses
    - echo $ANDROID_SDK_LICENSE_VALUE > $ANDROID_HOME/licenses/android-sdk-license

ちなみに、これで足りないSDKおよびBuild ToolsのDownloadは出来るようになったが、ライブラリ等のアップデートは以前と変わりなく必要になるので、全体としては以下のようになる。

  pre:
    - echo y | android update sdk --no-ui --all --filter tool,extra-android-m2repository,extra-android-support,extra-google-google_play_services,extra-google-m2repository
    - mkdir $ANDROID_HOME/licenses
    - wget $ANDROID_SDK_LICENSE_URL
    - mv android-sdk-license\?dl\=0 $ANDROID_HOME/licenses/android-sdk-license

「ちゃお」付属のお掃除ロボがなかなかすごい

ニュースで女の子向けの雑誌の付録でお掃除ロボがついてくると話題になっていたのでゲットしたよ。
http://headlines.yahoo.co.jp/hl?a=20170307-00010003-abema-bus_all


Amazonではすでに売り切れだったので、リアル本屋で購入。リアル本屋で本買うこと自体いつ依頼か憶えてないくらいなんだが、まさか少女雑誌を買うことになるとはw

付録を開けるとこんな感じ。

あまりゆるふわ感はなく、普通にプラモとかミニ四駆とかと同じようなイメージ。
組み立てはほぼ完了していてモータを取り付けて蓋を閉じるだけ。

早速動かしてみるとこんな感じ。

机の角に行くと向きを変えて落ちないようになってる。

この仕組みはメカで実装されている。

これ、ぱっと見だとどうなっているのかわからなかったが、左ホイールがクラッチの役目になっていて、直進時は噛んだ状態で順転する。

机の端に来て左右前方についているパーツの高さが落ちるとシャフトの中心についているネジ状のところに突起部があたりシャフトが左にズレ、クラッチが外れると同時に内側のギアが噛んで逆転する。

少女雑記の付録と侮るなかれ、よく考えられた構造だ。雑誌を何部くらい出してるのかわからないけど、これ原価100円とかで作るのはすごい。

今はなんでも電子制御しちゃうから、イマドキこういうの設計出来るメカエンジニアは少なくなってるんじゃないかなぁ。

モーターカバーでかろうじてゆるふわ感を出しているが、これは取り付けないでもOK.

ESP32 breakout boardでLチカ!


魔法の大鍋(http://www.eldhrimnir.com/)さんのブレイクアウトボードを入手したのでArduinoでLチカまでやった。

ブレイクアウトボードについて

今回使ったブレイクアウトボードはこんなやつ。

まだテスト中なので、パブリックな入手ルートはない。
今後配布されることがあっても仕様変更してるかもしれないのであくまで参考までに。

その他のブレイクアウトボード(および直配線)でも手順はだいたい同様かなと。

実装

チップ部品が1608サイズなので、出来る人には手実装出来るレベル。

個人的にはUSBコネクタを一番最初に、次にシリアルICを先に載せるといいと思った。一枚目を実装する時、USBコネクタを最後に残したらこてを当てづらかった。

一部シルクがないところがある

  • 表面シリアルのTX/RX近くの抵抗*2:1kΩ
  • 表面その他のシルクなし*3:0.1uF
  • 裏面右下:1uF

Arduino開発環境

ESP32は ESP8266と同様Arduino互換機として使える。しかもESP8266のときは有志による開発であったが、ESP32ではespressif本家がサポートしている。

arduino-esp32 https://github.com/espressif/arduino-esp32

Arduino IDEがインストールしてあれば、README.mdにあるとおおりshellをコピペするだけ、一発でインストール完了。

今回自分の環境(Mac)では事前にインストール済みだったが、おそらくFTDIのドライバインストールが必要。インストールはこちらから http://www.ftdichip.com/Drivers/VCP.htm

Arduino IDEを再起動して
Tool→Board→ESP32 Dev Module
Tool→Port→/dev/cu.usbserial-XXXXX

を選択。

シリアルモニターを開いてbaud rateを115200にし、リセットボタンを押すと以下が出力される。

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
ets Jun 8 2016 00:22:57

rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0x00
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3ffc0000,len:0
load:0x3ffc0000,len:2304
load:0x40078000,len:3788
ho 0 tail 12 room 4
load:0x40098000,len:532
entry 0x4009813c
�[1;36m

�[0m�[1;36m**************************************
�[0m�[1;36m* hello espressif ESP32! *
�[0m�[1;36m* 2nd boot is running! *
�[0m�[1;36m* version (V0.1) *
�[0m�[1;36m**************************************
�[0m�[0;36mcompile time 18:16:58

�[0m�[0;36m SPI Speed : 40MHz
�[0m�[0;36m SPI Mode : DIO
�[0m�[0;36m SPI Flash Size : 4MB
�[0m�[1;36mPartition Table:
�[0m�[1;36m## Label Usage Type ST Offset Length
�[0m�[1;36m 0 factory factory app 00 00 00010000 00100000
�[0m�[1;36m 1 rfdata RF data 01 01 00110000 00040000
�[0m�[1;36m 2 wifidata WiFi data 01 02 00150000 00040000
�[0m�[1;36mEnd of partition table
�[0m�[1;36mLoading app partition at offset 00010000
�[0m�[0;36msection 0: paddr=0x00000020 vaddr=0x00000000 size=0x0ffe8 ( 65512)
�[0m�[0;36msection 1: paddr=0x00010010 vaddr=0x3f400010 size=0x05b64 ( 23396) map
�[0m�[0;36msection 2: paddr=0x00015b7c vaddr=0x3ffba720 size=0x01378 ( 4984) load
�[0m�[0;36msection 3: paddr=0x00016efc vaddr=0x40080000 size=0x00400 ( 1024) load
�[0m�[0;36msection 4: paddr=0x00017304 vaddr=0x40080400 size=0x126ac ( 75436) load
�[0m�[0;36msection 5: paddr=0x000299b8 vaddr=0x00000000 size=0x06658 ( 26200)
�[0m�[0;36msection 6: paddr=0x00030018 vaddr=0x400d0018 size=0x325b4 (206260) map
�[0m�[0;36mstart: 0x400807ac

�[0mInitializing heap allocator:
Region 19: 3FFBBA98 len 00024568 tag 0
Region 25: 3FFE8000 len 00018000 tag 1
Pro cpu up.
Pro cpu start user code
nvs_flash_init
frc2_timer_task_hdl:3ffbc564, prio:22, stack:2048
tcpip_task_hdlxxx : 3ffbeca8, prio:20,stack:2048
phy_version: 80, Aug 26 2016, 13:04:06, 0
pp_task_hdl : 3ffc34f0, prio:23, stack:8192

:>enter uart init
uart init wait fifo succeed
exit uart init

IDF version : master(db93bceb)

WIFI LIB version : master(934d079b)

ssc version : master(r283 4d376412)

!!!ready!!!
mode : softAP(26:0a:c4:03:83:34)
dhcp server start:(ip: 192.168.4.1, mask: 255.255.255.0, gw: 192.168.4.1)

  1. WIFI:AP_START

Arduino IDEからの書き込み

ボード上のmodeスイッチを押しながらリセットを押す。
シリアルポートに以下メッセージが表示されればOK.

rst:0x1 (POWERON_RESET),boot:0x3 (DOWNLOAD_BOOT(UART0/UART1/SDIO_REI_REO_V2))
waiting for download

Arduino IDEからUploadボタンを押して書き込み。

  • GNDピンのすぐとなりの13番ピンを使うコード

#define LED_PIN 13

void setup() {
pinMode(LED_PIN, OUTPUT);
}

void loop() {
digitalWrite(LED_PIN, HIGH);
delay(1000);
digitalWrite(LED_PIN, LOW);
delay(1000);
}


部品実装さえ済めばさくっと出来た。