watermint.org - Takayuki Okazaki's note

JJUG CCC 2017 Spring

JJUG CCC 2017 Spring

ブログを書くまでがJJUG CCC、ということではありますが、かなり、、時間が経ってしまいました。6月頃に書き始めたものを再編集しているのと記憶もややあやふやな部分があり不正確な点もあるかとおもいますがご容赦ください。JJUG CCC 2017 Springへ参加した話を思い出しながらまとめています。

今回は年次総会の後に行われたJJUG CCC 20th fireside chatというセッションにて登壇させていただきました。発表者は「20回生き残っている幹事たち」ということでしたが、僕が実際にJJUG幹事として参加させてもらっているのは手元の記録が確かならば2009年6月からで20回すべてには幹事として参加していませんが、最初の頃はSun Microsystems社でJavaエバンジェリストとして関わっていたというオマケで加えてもらっています。

お話しした内容は当日のアドリブで、正確には覚えていませんが大まかに当日お話した内容に注釈を加えつつ振り返ってみます。

RIA

2007年頃といえばAdobeのAir、MicrosoftのSilverlightといったRIA (Rich Internet Application)が流行っていたように思います。RIAという言葉はほぼ死語ですが、現在のスマートフォン・タブレット向けのアプリ、あるいはMac App StoreやWindows StoreのようなデスクトップアプリとしてRIAという言葉は消え去ってもコンセプトとしては完全に当たり前のものとなりました。

初代iPhoneもこの年に発表されていますが、RIAの流れに続く原動力を作ったのは個人的には2005年にGoogle Mapsがリリースされたことだと思っています。個人的にも衝撃的でしたし、多くのインターネットユーザーや企業IT部門の考え方まで大きく変えていった原動力になったのではないかと思っています。当時、Web上で地図を見ると言えば住所で検索したり、上下左右ボタン、縮尺変更を押して切り取られた地図を次々に見ていく。というスタイルだったと思いますがマウスによるスクロールや縮尺変更は圧倒的にわかりやすく仕上げられていました。AjaxというWebテクノロジーもGoogle Mapsの発表を境に大きく花開いたと記憶しています。

さて、Java界でのRIAといえば、JavaFX。もともと、ICAN SuiteというSOA基盤ソフトウエアで知られていたSeeBeyondという会社を2005年にSunが買収したところが始まりです。SeeBeyondに在籍していたChris Oliverが個人プロジェクトとして作っていたF3というスクリプト言語が出発点となっています。2007年5月のJavaOneではJavaFXという名前で目玉としてキーノートにて発表されました。

当時の記事を少し読み返してみました。

2007発表されたJavaFXではJavaFX Scriptというスクリプト言語が同時に発表されています(これはまさに前述のF3そのものです)。GUI記述について、無理なく自然な記述ができるスクリプト言語です。JavaをiOS/macOSにおけるObjective Cとするならば、JavaFX ScriptはSwiftのような存在です。

F3という名前は”Form Follows Function” (形態は機能に従う)を元としているそうです。Chrisとは話をしたことはありませんでしたが、JavaOneセッションやブログなどで発信されていた彼のF3へのこだわりと、JavaFXをJavaのRIA基盤としてエコシステムを築き上げたいSunとの思惑は当時から少しずつずれているように感じていたように記憶しています。

その後、JavaFX 2.0が2011年に発表されるとJavaFX Scriptは廃止となり、Javaからネイティブに呼び出しができるライブラリの一つとなりました。2011年、すでに多言語実行プラットホームとなっているJavaにとって、ライブラリとして存在を変えることはまさに”Form Follows Function”であったのだと感慨深く思い出します。

Webサービス

10年程度前で記憶のあるトピックとしては2006年、Project Tangoという名前で.NET(Windows Communication Foundation)とJavaをWebサービスで相互運用するという発表があったことです。Project TangoはWeb Services Interoperability Technology (WSIT)という名前の成果物でWS-Security、WS-PolicyなどWS-I基礎的な仕様についてまとめ相互運用できるようパッケージ化されたものです。

今でこそ、APIを使ったサービス間連携というのはもはや何の疑いもなく当たり前のものとなっていますが、.NETとJavaで相互運用するということだけでニュースバリューになるぐらい相互運用するというのはまだ早熟な時期であったと思っています。

その後、RESTful APIというキーワードに注目が集まりより簡単にAPIが提供でき、利用できるになりプログラミング言語やOS環境に依存しないという土壌はどんどん整っていきました。

電話をかけるAPI、テキストを翻訳するAPI、株価や天気予報のAPIなど様々なAPIを組み合わせて新しいサービスを作るというのはシステム開発のなかでも珍しいことではなくなりました。Mashup Awardsという取り組みも2006年に始まっていていまもどんどん規模を拡大しているようです。

前述のようなRIAが目指した使いやすいインターネット向けUIはAPIを通じたサービス提供ならびにサービス利用が増えるに従ってその地盤を確固たるものになっていったものだと思っています。サーバサイドで起こっていた相互運用性やSOAなどのようなエコシステム、スマートフォンやタブレット、デスクトップ環境向けの「アプリ」というエコシステムは決してどちらか片方だけでは成り立ち得なかったのだろうと思っています。

Nexus 7 (2012)をAndroid 7.1.2にバージョンアップ

Nexus 7 (2012)が自動バージョンアップによってアップデートされた最終バージョンがAndroid 5.1.1。このバージョンになってからひどく端末が遅くなり、使い勝手ががくんと落ちてしまいました。このため今では手元にある数少ないNFC対応端末として、Suicaの利用履歴をMoneyforwardのアプリケーションでMoneyforwardに転送するぐらいの使い道にしか使っていませんでした。

軽量で手頃なサイズなのでもう少し使い勝手が上がればいいなということと、単純に新しいAndroidを触ってみたいということでAndroid 7.1.2へバージョンアップしてみることにしました。いくつか失敗しながらとなったので備忘録として残しておきます。なおメーカーサポート外となりますので自己責任にて。

参考にしたサイト

手順

試行錯誤しながら+うろ覚え部分もありますがだいたい次のような流れです。

Nexus 7のデータをバックアップ

このアップデートのタイミングでデータは一度消去するのでバックアップをとっておきます

Nexus 7を開発者モードに

  • 設定→端末詳細→ビルド番号でビルド番号を7回ぐらいタップ
  • 設定→開発者向けオプションでUSBデバッグをONに

Platform Toolsをダウンロード

Android 7.1.2等をダウンロード

ROM 7.1.2_r33 NZH54D Grouper Tilapia F2FS/EXT4 Android 7.x AOSPに掲載されているものをダウンロード。

Gappsは最初Android 7.1 Nougat on Nexus 7 2012 WiFiに記載のあるOpenGappsを入れてみたのですがAndroid 7.1.2起動直後の初期設定アプリがクラッシュするためBeansGappsを使いました。

OpenGappsでもキャッシュをクリアしたりすれば大丈夫だったというような報告をみて試してみましたが、手元ではうまくいかず最終的にBeansGappsでは問題ありませんでした。

ブートローダーのアンロックとTWRPの導入

パソコンとNexus 7をUSB接続してブートローダーのアンロック。Platform Toolsのなかに入っているadbコマンドとfastbootコマンドを使います。

$ adb reboot bootloader
$ fastboot oem unlock

次にtwrpイメージの書き込み。twrpのファイル名は適当に読み替えてください。

$ fastboot flash recovery twrp-x.x.x-x-x.img
$ fastboot reboot

TWRP for Asus Nexus 7 2012 Wi-Fiに記載のあるとおり最後のリブートコマンド実行時にすこし注意が必要です。

Note many devices will replace your custom recovery automatically during first boot. To prevent this, use Google to find the proper key combo to enter recovery. After typing fastboot reboot, hold the key combo and boot to TWRP. Once TWRP is booted, TWRP will patch the stock ROM to prevent the stock ROM from replacing TWRP. If you don’t follow this step, you will have to repeat the install.

最後にリブートする際、Nexus 7のボリュームダウンボタンと電源ボタンを長押しします。これにより書き込んだカスタムリカバリーが自動的に工場出荷状態に戻されることを防ぎます。

OSとGappsの導入

あとはAndroid 7.1 Nougat on Nexus 7 2012 WiFiにある手順5から順に実行していきます。スクリーンショットをとらなかったのでスクリーンショットを参照されたい方は該当記事をご参照ください。

リカバリモードで起動。

$ adb reboot-bootloader

起動するとコマンドが表示されているのですが、ボリュームアップ・ダウンで選択し電源ボタンで実行できます。ボリュームダウンボタンを何回か押して「Recovery Mode」を選んで電源ボタンで実行します。

この後の手順は下記の通りです。

  • Wipeを選んでFactory Resetを実行します。
  • TWRPのメインメニューまで戻り、Advanced→ADB Sideloadまで進みスワイプしてsideloadを開始します
  • パソコンから$ adb sideload aosp_grouper-7.1.2-ota-eng-20170811.ds.zipとコマンドを実行してOSイメージを書き込みます。
  • 次にGappsを書き込みますが、またTWRPのメインメニューまでもどりAdvanced→ADB Sideloadまで進み、今度はWipe Dalvik Cacheを選択した状態でスワイプします
  • パソコンから$ adb sideload BeansGapps-Mini-7.1.x-20170725.zipとしてGappsを導入します。
  • Reboot Systemを選択してリブートします。TWRPのアプリを入れるかどうか聞いてきますが、これはどちらでもよいでしょう。

その後の設定など

起動後にはAndroidの初期設定を勧めていきます。Wifiの設定などを行い、設定を勧めていけば完了です。Play Storeアプリはインターネット接続されていれば自動的にダウンロードされてきます。

Visual Studio CloudとAzureとiPad Proによる仕事環境

手元で使っている仕事用のIT環境というと、数年前からMacBook ProにせいぜいVirtualBoxやDockerを使った仮想環境というぐらいでした。ただ、いくつか不便なところも出てきたり、Windowsデスクトップ環境でのテストが必要になったりと要件が増えてきたのでいまはVisual Studio Cloudを使っています。加えて仕事上外出も増えたのでiPad Proを使うことも増えてきました。そのいきさつ等を記録がてら公開しておきます。

増えてきた要件と変わってきた要件

Windowsデスクトップ環境

Windowsデスクトップ環境

手元に持っているハードウエアは仕事用も個人用も見事にほぼApple一色でiPhone、iPad Pro、MacBook Proといった組み合わせです。

OSの種類でいえば、macOSとiOSだけですが仕事がら、Windowsデスクトップ環境での検証がなんだかんだ必要になります。会社のPCにはWindowsのライセンスと仮想環境があるのでこれを使えば実用上困らないのですが、まっさらなWindows環境を準備したり、様々なバージョンのWindowsを準備するのはディスクが足りなくなったりかなりの手間もかかります。

手元にWindows 7、Windows 8.1などのライセンスも持っているのですが、Windows Server 2012R2が検証に必要になったり、最近ではWindows 10を検証したい場合も増えてきました。

iPad Pro

デモや検証のために会社のMacBook Proを出先に持ち歩いてもいいのですが、VMwareのような重量級アプリケーションを利用するとあっという間にバッテリーもなくなってしまいます。それに、MacBook Proも15インチ版を利用していると少々かさばるので持ち歩きには不便なときもあります。

このため最近では出先にiPad Pro (SIMフリーモデル)だけを持っていていくことも増えてきました。作成した書類はすべてDropboxに入れてありますし、別途個人的にOffice 365 Businessも契約しているのでExcelやPowerPointなどが必要になってもiPadからでも利用できます。iPadからHDMIやVGAへの変換端子を使えばプレゼンテーションもiPadから可能ですし、Apple TVが会議室に設置されていればそのまま投影することもでき、パソコンを使うよりも便利な場合さえあります。

iPad Proを使っていて最も便利と感じるのはインターネット接続です。Wifiモデルではなく、SIMフリーモデルを利用してIIJmioのデータ用SIMを入れているので、テザリングやWifiルータなどは別途必要ありません。一昔と比べればiPhoneからのテザリングやWifiルータの操作も幾分か簡単になったのですが、それでもネットワーク接続のためにあれこれ操作するのは一定の煩わしさがあります。

出先でiPadのような端末を使いたいというときの利用シーンは議事メモ、スケジュール確認、仕様などの確認、プレゼンテーション、デモといったところでしょうか。このような使い方であれば、iPadは今のところおおよそ丸一日持ち歩いてもバッテリーは十分持ちます。

クラウドの選択肢

クラウドもこれまでAmazon Web Services、OpenStack、OpenShift、DigitalOcean、Herokuなど様々利用してきました。その中でもいまVisual Studio CloudとAzureを使っているのはほぼ消去法での選択です。理由はWindowsデスクトップ環境が使えて簡単にいろんなWindowsバージョンを試せるところです。

(なお、Azure上でWindowsデスクトップ環境を使うにはVisual Studio Cloudの年間サブスクリプションが必要です。詳しくはVisual Studioのサイトにてご確認ください)

Windowsデスクトップ環境を使うには有名どころとしてAWSのWorkSpacesを使う方法もあります。WorkSpacesも一月ほど試しに使ってみてかなり便利であることは実感しました。ただ頻繁に検証用に環境を作り直したかったので目的には合いませんでした。

AzureでのWindowsデスクトップ環境

よく使うところとしてWindows 7 Enterprise N、Windows 8.1 Enterprise N、Windows 10 Enterprise N、Windows Server 2012 R2 Datacenterなどのバージョンを使っています。仮想環境を新規作成するとしてもだいたい5分くらい待てばできあがります。デスクトップ環境にはRemote Desktopアプリケーションを利用しますがこれは、Mac版もiPad版もあります。Amazon WorkSpacesと比べればUIなどすこし使いづらいですが、慣れとして割り切って進めましょう。

特に混乱するのはiOS版Remote DesktopではCmdキーはWindowsのCtrlキーにマップされているものの、Mac版Remote DesktopではマッピングがないためmacのアプリからコピーしRemote DesktopでペーストするにはCmd+C → Ctrl+V といった操作になり頻繁に操作ミスします。このマッピングを設定的に変更する方法はすこし調べた限りは無いようで、慣れるしかありません。

仮想環境のお値段

Visual Studio Cloudの年間サブスクリプションを購入すると毎月50ドル (5,500円分)のクレジットが付与されます。初期設定ではもし利用がこの枠を超えてしまった場合には仮想環境がすべて停止するだけで追加で請求されることはないようですから安心です。クラウドの価格は頻繁に変わりますので随時ご確認いただくとして、ここでは手元の実績をすこし紹介しておきます。

まずVisual Studio Cloudで仮想環境を立ち上げる際、利用できるリージョンには制限があります。残念ながら執筆時点で利用できるリージョンに日本は含まれていません。韓国などアジア地域のリージョンで利用可能なところはありますが、日本が使えないなら一番安いリージョンにしようということで今はもっぱらWest US 2を利用しています。

仮想マシンはSSDタイプのDS1_V2 (1コア、3.5GBメモリ)を一番よく使っています。執筆時点での見積もり利用料金は4,401円/月です。これは稼働させっぱなしの場合での見積もりです。停止している間もストレージなどの利用料金は発生し、SSDの仮想マシン1台ぶんで1,500円/月ぐらいです。これまで実績利用時間としては週数時間ずつぐらいですが、おおよそ2,000円前後といったところでした。

データ転送などでも料金がかかりますが通常の利用方法であれば、5,500円のクレジットでおおよそ仮想マシン2台分ぐらいは常に作成済みの状態で使える換算になります。

West US 2での使い勝手

大陸をまたぐのでレイテンシの点について気にしていましたが、たまにもたつく印象のときもありますが慣れでカバーできる範疇と思えるようになってきました。YouTubeなどを再生しても十分再生が追いつきますし、ネットワーク環境の充実と技術の進歩には驚かされます。

Visual Studio Team

Visual Studio Team

ほとんどWindows仮想デスクトップのために利用しているVisual Studio Cloudですが、せっかくなので他の付属サービスも使い始めています。いくつか最近Goでツールを作っているのですが、固定したCI環境を準備していなかったので今回はVisual Studio Teamに作ることにしました。

git pushをトリガーとしてビルドもできますし、成果物をビルドごとにパッケージにすることもできます。どちらかというと、Webアプリケーション向けにデプロイするという流れのUIになっていますが、ビルドにDockerも使える点が便利です。

いまDockerイメージをDocker HUBからダウンロードしてくるだけで5〜6分かかってしまうところが難点ですが、もう少し本格的に困ったら解決方法を探すことにします。

まとめ

Visual Studio CloudとAzureを使ってアプリケーション開発環境もそうですし、検証やデモといった作業もほとんどクラウド上で行える環境ができあがってきました。時々まだパソコンでなければできない操作もありますが、ほとんどの作業はiPadからも作業できるようになってきました。

パソコンはたくさんのメニューやショートカットを使いこなしててきぱき作業するのに向いていますし、iPadのようなデバイスは出先で主要な用事を片付けるためにかなり役立ちます。

使い分けはまだまだ必要でしょうけれど一つ変わったのはパソコンのスペックについての考え方です。Azure上のWindows仮想デスクトップは必要に応じて簡単にメモリーやCPUコア数などを追加できます。手元のMacBook ProにはCore i7 6920という比較的高スペックなものが乗っていますが、一方のAzureではサーバ用のXeon E5-2673といったCPUを使っているようで、クラウド上で処理した方が早い場合もあります。

手元のデバイスはいかに手になじんで、目に優しいかが大事でスペックについてはそろそろ妥協していい時代になってきているのかもしれません。

Cross compiling Go app with go-sqlite3 on Docker

Part of my Go app in my project, toolbox, using go-sqlite3. I spent couple of hours to setup cross compiling environment for this.

go-sqlite3 using CGO for binding sqlite3 to go library. That requires cross compilers for each target platform. First, I tried to setup mingw64, etc for each platform. But it was easy to implement if you are familiar with xgo.

xgo is a Docker images that pre configured for each Go version and target platforms. If you are using glide for packaging system. Prepare Dockerfile like below.

FROM karalabe/xgo-1.7.x

RUN apt-get update -y
RUN apt-get upgrade -y
RUN apt-get install -y zip git curl

ENV GOBIN=/usr/local/go/bin
ENV PATH=$PATH:/usr/local/go/bin
RUN curl https://glide.sh/get | sh

Then, just build with xgo command like below.

xgo --ldflags="$LD_FLAGS" -targets "windows/*,linux/*,darwin/*" github.com/watermint/toolbox/tools/$t

Mathematicaの練習: Asanaタスクの集計

大学で使ってからもう十数年ぶりになりますがMathematicaをさわっています。数学とあとは機械学習関連を勉強するためMathematicaのHome版を購入してみました。まずはデータを分析したりするところから手始めにやってみようと思っていますが、 十数年ぶりということもありますし、大学時代もさほど深く使い込んでいなかったのでWolfram Languageの知識はほぼゼロの状態です。

慣れたプログラミング言語で書けばすぐできることですが、手始めにAsanaで管理しているタスクを集計したり分析する流れをやってみました。AsanaのタスクはJSON形式でエクスポートができますのでこれを読み込んで集計してみます。

週ごとのタスク数

JSONを読み込むにはImportを使いますがこのとき、”JSON”ではなく、”RawJSON”をつかうとすべてがAssociation(連想配列のようなもの)として読み込むことができます。ここまでくるだけで結構つまづきました。Asanaから得られるJSONは”data”というキーが最初にあるのでいろいろなプログラミング言語の連想配列と同じように["data"]のように書いて値を取得します。値が取り出せたので続いて集計です。

AsanaのJSON書式はAPI referenceあたりを参照しながら処理を進めましょう。たとえばタスクが作成された日時は、”created_at”というキーに対する値として設定されています。時刻の書式はISO 8601形式です。

ISO8601形式をMathematicaで読み込むには DateObject["2017-03-31T09:00:00Z"]のようにDateObjectへ渡してやればよいようです。

手元のAsanaデータは1月中旬に整理整頓してそれ以前はあまり正確ではありませんでしたから、1月中旬以降のものだけを集計対象としています。

asanaTasks = 
  Select[asanaJSON, 
   DateObject[#["created_at"]] > DateObject[{2017, 1, 15}] &];

集計対象としたいタスクだけを取り出すにはSelect関数を使えば良いようです。関数型言語でプログラミングした経験があれば比較的すんなり理解しやすいかと思いますが、&のような簡略書式はMathematica独特なのでこれはマニュアルや例をみながら見様見まねで覚えるしかなさそうですね。

集計をするときもCountsByのような関数で簡単に集計できます。関数がたくさんあるので、プロトタイピングするにはもってこいです。

週ごとに集計するために日付を丸めたかったのですがこれがなかなかわからず苦労しました。

taskCountPerWeek = CountsBy[
   asanaTasks,
   CurrentDate[
     DateObject[#["created_at"]],
     "Week"
     ] &
   ];

最近出た11.1というリリースで追加されたCurrentDateを使うと簡単にできるようです。CurrentDate[Now, "Week"]のように日付の粒度を指定すればその粒度で値がかえってきます。語感としてややこしいのは、CurrentDateとありますがDateObjectなどを渡してやれば与えた日時を基準に変換してくれます。

最後にDateListPlotでグラフを書けば週ごとにどれぐらいタスクが作成されているかわかりました。