読者です 読者をやめる 読者になる 読者になる

kondoumh のブログ

- とあるソフトウェアエンジニアのめったに更新されないブログ -

UML とプログラミング言語

Modeling Programming

モデル描きからコード書きへ

UML 登場時は自分でモデリングツールを書いていたこともあります。

kondoumh.com

昔はモデルを描いてからコードを書いてたというか、モデルだけ描いてお仕事が終わってたプロジェクトもありました。

UML の登場とオブジェクト指向プログラミング

UML は C++ 普及期に誕生し Java の成熟とともに発展してきました。元々 OMT や Booch など複数の流派が存在して独自に CASE ツール*1 が開発されていました。しかし、世紀末が近づいたからか、統一の機運が高まり Unified Model Language として標準化されました。

UML 2.0 以降、表現力が増し、色々なモデル表現*2がサポートされていますし、シーケンス図の opt / alt / loop やガード条件を駆使して、手続き型の処理も表現できるようになっています。とはいえ基本的にはオブジェクト指向設計、実装を主要なターゲットパラダイムとしており、クラス図で静的な構造を、コミュニケーション図やシーケンス図で動的な振る舞い (インスタンス同士のコラボレーション) を表現します。クラス分割と責務の割り当てという設計作業を支援するグラフ言語と言ってよいでしょう。GoF デザインパターンの解説本も、クラス図とシーケンス図が使われてました。

90年代後半から2000年代前半ぐらいまでは UML と OOP が開発者の必須スキルと言ってもよい状況*3でした。

UML の不得意分野

総称プログラミング

C++ の Template や Java の ジェネリクスは、オブジェクト指向ではなく、型をパラメータとした生成的プログラミング技法に端を発する技術です。そして UML はこれが苦手というか表現が面倒な部分があります。

ジェネリクスは Java におけるタイプセーフなコーディングには欠かせません。業務システムでエンティティや DAO (Data Access Object) を作る場合などでも多用します。

/** 識別子を表すインターフェース */
public interface Identifiable<T> {
  // ..
}

/** エンティティの抽象型 */
public abstract class DefaultEntity implements Identifiable<Long>, Serializable {
  // ..
}

/** DAO のインターフェース */
public interface Dao<E extends DefaultEntity> {
  // ..
}

/** デフォルト DAO 実装 */
public abstract class DefaultDao<E extends DefaultEntity> implements Dao<E> {
  // ..
}

/** 顧客エンティティ */
public class Customer extends DefaultEntity {
  // ..
}

/** 顧客 Dao */
public class CustomerDao extends DefaultDao<Customer> {
  // ..
}

といった具合。型パラメータに具象型を適用しつつ拡張・・といったことが簡潔に表現できます。これをクラス図でまじめに表現するとこんな感じ*4

f:id:kondoumh:20161202220457p:plain

モデリングするにあたり型パラメータにバインディングされた型を個別に定義しないといけません。つまりコンパイラがやってくれる型バインディングによる型生成を手動でやるということ。コード書くよりモデリングの方が複雑になってしまいます。

実際問題、ジェネリクスの構造を UML エディタで作るのはかなり面倒です。設計時にはやってられないので、実装した後に可視化のためリバースした方が楽ということになります。

関数型プログラミング

C++ の STL*5 でコンテナとファンクタ (と内部のアルゴリズム) を組み合わせてコードを書くパラダイムが登場します。ファンクタの実態は関数ポインタで、オブジェクト指向パラダイムのポリモフィズムよりも強力にデータ構造とアルゴリズムを分離可能にしました。その後、C# に LINQ が登場し、近年では Java 8 で Stream が実装され、メジャーなプログラミング言語は、関数型プログラミングパラダイムを取り込んでいます*6

関数型プログラミングが有効なのは、状態を持たない計算やデータ加工 ( map / filter ) で、Java や C# ではメソッド内の局所的な処理です。関数型はオブジェクト指向をリプレースする技術ではなく手続き型を駆逐する技術として普及しています。

一方で、メソッドや関数をファーストクラスオブジェクトとして扱っていなかった UML では関数型プログラミングを表現するのは困難です。LINQ や Stream を表現する手段はないと言ってよいでしょう。関数型プログラミングは宣言的な表現になり、可読性が高いのが特徴です。関数型プログラミングには独自のモデル表現が考案されていますが、現在のところ UML には取り込まれていません*7

ninjinkun.hatenablog.com

それでも UML は有用

UML は OOP にマッチしているので、OOP がワークする部分、すなわちクラスを跨るメソッド呼び出し、クラス自体の状態遷移にフォーカスすべきです。そして、クラスのメソッド内に実装されるアルゴリズムは、極力ステートレス (状態を持たない) に実装すべきで、その領域には関数型プログラミングが有効なのです。ということで、プログラムの構造は UML で可視化、メソッドの実装は関数型プログラミングで宣言的に実装することで可視化するというのが現状ではないかと思います。

以下 UML ツールのユースケースについて。

スケッチ

設計者と実装者の間でコミュニケーションするための用途がスケッチとしてのモデリングです。合意ができればモデルの役割は終了。未来永劫保守することは最初から諦めています。

ソースコード生成

Model-Driven Architecture が注目されていた時代がありました。モデルからコードを生成できれば、実装工数は圧縮できると期待されたのです。大量に属性を持つ Entity クラスの生成などには有効ですが、Excel マクロなどでも事足りることが多いです。コードエディタや IDE が高度に進化している現在 CASEツールが生成するコードの価値は下がる一方です。コードを書くスピードは、もはやボトルネックとは言えません*8

可視化

実装が終わったコードの可視化。主に保守用に使用します。モデリングと同様、プログラムの構造を伝えるためセンスが必要とされます。

*1:Computer Aided Software Engineering のツール

*2:アクティビティ図、ステートマシン図、コンポーネント図、配置図など

*3:少なくともエンタープライズのオープン系では

*4:実際にはこんな詳細までは図にしませんが

*5:Standard Template Library

*6:オリジナルの C++ / Java は純粋なオブジェクト指向言語であり、関数はファーストクラスオブジェクトではありませんでした。最近はラムダや無名関数がサポートされ、モダンな言語とのギャップが小さくなっています

*7:ツールベンダーは UML にこだわらず使えるようにする可能性はあります。

*8:組み込み業界では MDA のパラダイムが残っています

Magic Trackpad 2 にアップグレード

Mac Gadget

2 が気になっていた

最近になって今更ながら Magic Trackpad 2 が気になってました。Magic Keyboard との相性がよくなっているはずで、使い勝手を試したくなったから*1

ちなみに以前、指が痛いという理由で Magic Keyboard を iPad の周辺機器扱いしてましたが、最近はまた Magic Keyboard を MacBook Pro にペアリングしてメインで使っています。

blog.kondoumh.com

買ってきた

ということで買ってきました。Trackpad 2 は ¥12,800 と旧モデルと比べてかなり高くなっていてます。Kensington のトラックボール等の高級こだわりインプットデバイスと同一価格帯です。

開封するまで知らなかったのですが、値段だけでなくサイズも旧モデル (写真右) を大きく上回っています。

f:id:kondoumh:20161123091245j:plain

色が真っ白になっているのもリニューアル感があります。感圧タッチになり可動部がなくなったことも薄さに貢献している感じです。感圧タッチのおかげでクリックがパッドの上の方でもできて、テキスト選択がしやすくなり MacBook Pro の Trackpad と同等の操作ができるようになりました。Magic Keyboard と同様に Ligntning でペアリングが一瞬で完了し充電も可能。もう旧モデルとは別製品と言ってよいでしょう。

MacBook 的レイアウトの使用感

薄くなったので、これがやりやすくなりました。

f:id:kondoumh:20161123103402j:plain

blog.kondoumh.com

旧モデルでは (Wireless Keyboard とともに) 電池格納部の出っ張りが存在するおかげで凸凹してましたが、Magic Keyboard と Magic Trackpad 2 の組み合わせだと、キーボードが水平に近くなり、MacBook で入力している使っている感じにより近づいた感があります。

パームリジェクションが欲しい

かなりよくなったのですが、手のひらがパッドにタップっぽく触れるとタップになってしてしまい、テキスト入力で惨事が起こってしまうのが相変わらずストレスです*2。システム環境設定で、「タップでクリック」をオフにすると防げはするのですが。

f:id:kondoumh:20161123114740p:plain

「タップでクリック」を使えないとそれはそれでストレスなので*3、テキストは手のひらが触れないように両腕を極力広げてタイプするようにしています。

iPad Pro の Pencil のようなパームリジェクションが実装されるとよいのですが指と手のひらの識別は難しいのかな。次善策としてパッドにスイートスポットを設定できるようにすることも考えられますが、そのソリューションはデザイン的には負けた感があるのでやらなさそうですね。この問題は Trackpad が巨大化した 最新の MacBook Pro でも同じかもしれません。

まとめ

ということで ますます macOS に最適化した入力環境を整えてしまいました*4

*1:旧モデルは使わなくなってしまい Magic Mouse に回帰してました

*2:パッドの上に手のひらを置き続けている分には問題ありません

*3:Magic Mouse でも BetterTouchTool でタップでクリック設定にしてますし

*4:たまに Windows を BootCamp で使うとかなりストレスになります

Visual Studio が macOS に降臨 - Visual Studio for Mac Preview を使ってみる

Mac Programming Visual Studio

年末近くになって Microsoft の イベント Connect(); // 2016 で Visual Studio for Mac が発表され、Preview を試せるようになりました。

connectevent.microsoft.com

事前にリークというか MSDN のページに掲載されてしまった*1ので、Connect 自体のインパクトは薄まってしまった模様ですが。

New Release Preview: Visual Studio for Mac | Visual Studio

Visual Studio for Mac までの流れ

OSS でクロスプラットフォームな .NET Framework 互換プロジェクト Mono から始まり、IDE である Mono Develop も開発され、Mono Develop に Xamarin の開発ツールをアドオンした Xamarin Studio と発展してきて、今年のはじめに Microsoft が Xamarin を買収。そしてとうとう Visual Studio の名前を冠したプロダクトが登場したという流れです。

Mono プロジェクトと Microsoft の関係は微妙だった時期もありましたが、.NET Core / ASP.NET Core など OSS に舵を切った今となっては、完全に Microsoft の戦略に統合されました。

Electron ベースのクロスプラットフォームコードエディタが Visual Studio Code の名前で登場したのが昨年。熟成を重ねて ATOM や Sublime Text キラーなコードエディタとなった今年 Visual Studio 自体がクロスプラットフォームな IDE として登場したということで、.NET での開発に少なからず携わってきた身としては感慨深いものがあります。

インストール

ということで、MacBook Pro (OS X El Capitan) にインストールしてみました。

Preview のパッケージをダウンロードしてインストーラを起動。

f:id:kondoumh:20161117090045p:plain

Xamarin 用の環境の選択肢が出てきます。Visual Studio 2015 でもおなじみのモジュールが並んでいます。

f:id:kondoumh:20161117090139p:plain

4GB 程度のバイナリをダウンロードしつつインストール。

f:id:kondoumh:20161117090404p:plain

1時間程度で完了。macOS に Visual Studio が降臨。

f:id:kondoumh:20161117090505p:plain

起動すると基本英語メニューですが、プロジェクト作成のダイアログなどは一部日本語にローカライズされています。

開発できるもの

開発言語は C# / F# / VBNet から選べます。Visual Basic も Mac にやってきちゃいました。

Xamarin.Forms

Visual Studio 2015 同様 iOS / Android 向け Forms アプリの開発ができます。プロジェクト構成は WPF や Windows ストアアプリとそっくりで、XAML 定義とデザイナーコードによる開発が可能です。ネイティブ の Toolkit (iOS の場合 UIKit) は Xamarin に隠蔽されていて XAML プログラミングの知識があればアプリが作れるところがメリットです。

f:id:kondoumh:20161117215222p:plain

Xamarin Forms の場合、独自の Look & Feel になりますが、iOS / Android でソースコードを共通化できます。さらに、iOS / Android それぞれに特化した Look & Feel のアプリも作れます。

Connected App と Single Page App (または Forms App) というテンプレートが選択可能で、前者は ASP.NET Core Mobile Service という BaaS 側のプロジェクトも生成してくれる模様です。Azure が前提になるのでしょうか。

おまけに iOS / macOS で SpliteKit / SceneKit に対応したゲームも作れるようです。Xamarin.Forms は macOS アプリも作れるということですね。

f:id:kondoumh:20161117191035p:plain

iOS / Android ネイティブアプリ

ネイティブアプリも C# で開発できます。それぞれネイティブのプラットフォームの知識が必要です。例えば iOS のプロジェクトでは UIKit を Mono から使えるようになっているので、UIKit の知識が必要になります。RubyMotion のような位置付けですね。

www.rubymotion.com

Xcode で作れるものとほぼ同じものが作れそうです。Metal や Open GL のような低レベルグラフィックスライブラリもサポートされています。

ネイティブアプリは Xamarin の Core なレイヤーにより Mono Framework と統合されているようです。

f:id:kondoumh:20161117191338p:plain

Android では、Wear アプリなども提供されていて、Android Studio で作れるアプリは大体作れそうです。

f:id:kondoumh:20161117202821p:plain

tvOS アプリ

iOS のファミリーである tvOS アプリも作れます。

f:id:kondoumh:20161117203046p:plain

Mac 用アプリ

Cocoa アプリが作れます。iOS 同様 SpliteKit / SceneKit や Metal がサポートされています。Cocoa アプリの開発には iOS と同様 Cocoa プログラミングの知識が必要になります。

f:id:kondoumh:20161117203133p:plain

.NET Core

Console アプリやライブラリが作れます。

.NET

GTK アプリは、Windows Form ではなく GTK の ToolKit を C# で扱えるようにしたモノのようです。

f:id:kondoumh:20161117220157p:plain

ASP.NET

ASP.NET は MVC / Web Form がともにサポートされているようです。

f:id:kondoumh:20161117203220p:plain

Windows 版との比較

Windows / Mac でカバーしているアプリ構成が異なり、Xamarin と .NET Core / ASP.NET Core の部分が共通という状況です。 ざっと比較すると以下のような感じでしょうか。

Visual Studio 2015 (Windows) Visual Studio for Mac
Xamarin.Forms
Android App
iOS App ×
ASP.NET MVC
ASP.NET Web Form
Console App
Cocoa App ×
GTK App ×
UWP App ×
WPF App ×
Windows Form ×
MFC App ×

まとめ

これまで有償だった Xamarin Studio が Microsoft 純正 Visual Studio として身近な存在になり、macOS / iOS / Android アプリを C# や XAML といった .NET ディベロッパーおなじみの技術で開発できるようになったというのは、かなりインパクトの大きい出来事と言えるでしょう。Swift が霞んでしまう可能性もあるかもです。

Xamarin アプリは Windows 版 Visual Studio でも作成できますが、iOS のアプリを作成する際、別途 Xcode が必要となってしまうため、iOS のサポートが必要な場合 Visual Studio for Mac を選択する方がよいでしょう。iOS / Android 両方の開発をしたい場合、Visual Studio for Mac は有力な選択肢と言えます。Xamarin 用の環境構築も Windows より手軽な印象です。Xamarin が流行るかどうかはこれからですが、Web サービスのスマートデバイス向け開発環境としては有力候補に違いありません。

.NET Standard のコードで書けるポータブルなライブラリの整備が WPF などのアプリ資産からの移植性を高める上でポイントになりそうです。

*1:直後に消えましたが。

ITmedia エンタープライズで「システム開発地図」の連載を開始しました

Job Modeling

同僚の今田さんと書いてます。リンクは随時追加します。

www.itmedia.co.jp

www.itmedia.co.jp

www.itmedia.co.jp

システム開発地図は、システム開発のいわゆる「上流」から「下流」までに作成されるであろう成果物を仮想的な平面上に並べて成果物の要素間の繋がりを可視化したものです。抽象的な情報だと繋がりを表現できないので、具体的な業務(在庫管理)を対象として成果物を作成し、成果物を作成する活動、および成果物の要素の関連を可視化しています。

インフォグラフィック的な狙いもあるのですが、個々の成果物には独自の表現形式があり、デフォルメは難しいので、実際に地図を俯瞰したり詳細にフォーカスして見ていただくのが良いかと思います。かなりベタな可視化になっています。

第1回と第2回は概要の話に終始してますが、5回分ぐらいネタあります。

元々は7年前に社内でコンサルネタを纏めたもので、外部にも出してます。

システム開発地図:目次 | 豆蔵ソフト工学ラボ

今回は地図は PDF で公開しましたが、当時は地図ビューアを (今はなき) Silverlight で作成してました。可視化好きなので楽しんでました。

blog.kondoumh.com

モデルを Astah で描いてたので平鍋さんが反応してた。

当時も ITmedia さんから @IT あたりに掲載する話をいただいてましたが、ITmedia さんの人事異動が激しくいつの間にか消滅してました。改めて読み返してみて、今現在も共感できて古くなっていないと判断し、内容的にはエンタープライズのシステム構築がよかろうとのことで、あまり大きな修正はせず掲載してもらいました。

f:id:kondoumh:20161112175018p:plain

iPad でコードを書く - Coda for iOS 編

iOS Programming Tools

先日の記事では iOS のピクチャ・イン・ピクチャを活用してコーディング作業をアシストする方法について書きました。

blog.kondoumh.com

SFTP 対応 iOS ネイティブテキストエディタを使う

その後、iPad Air 2 を入手してさらに色々試してたのですが、ターミナルから ssh で Emacs でコード編集するのは (tmux で復元できるものの) セッション切れたり描画崩れなどの問題があり iOS ネイティブのコードエディタを使う方がよいという結論に至りました。

VPS 上で ssh 用デーモンである sshd をスーパーデーモンとして sftp サーバをオンデマンド実行できます。iOS のテキストエディタが sftp 対応していれば iPad のローカルファイルのようにコードを開いて編集できます。Ubuntu の場合 /etc/ssh/sshd_config で以下の行をコメントアウトするだけ。

Subsystem sftp /usr/lib/openssh/sftp-server

Textastic は sftp 対応しています。

www.textasticapp.com

Textastic の sftp サーバー設定画面。

f:id:kondoumh:20161020000939p:plain

サーバからディレクトリ階層・ファイルを取得して編集更新できます。Dropbox と同様に使えます。

f:id:kondoumh:20161020001417p:plain

Split View で画面割って Textastic と Prompt 行き来すると捗ります。

f:id:kondoumh:20161020080857p:plain

ブラウザでの動作確認をする時は、アプリを切り替えることになります。gulp-webserver などを使用して tmux などでセッション維持しておけば、Prompt は閉じたままブラウザとエディタだけでライフプレビューしながらコード書けちゃいます。独自のコントローラー(?) でカーソル移動とかもできますし。

f:id:kondoumh:20161020224558p:plain

ソフトウェアキーボードの分割と位置調整

ちなみに iPad でソフトウェアキーボード使うときは分割して好きな高さに移動できます。移動はキーボードアイコンをドラッグです。ずっと下でやってると手がぷるぷるしてくるのでバランス取りやすい位置でタイプするとよいでしょう。日本語もフリック入力できますし。

Coda for iOS Again

ここまでやってみて、かなり昔購入して使わなくなっていた Coda for iOS を思い出しました。

blog.kondoumh.com

当時は Diet Coda というプロダクト名だったんですね。数年間の進化を期待して久々にインストールしてみました。アプリ内で ターミナル、コードエディタ、ビルトインブラウザをタブで切り替えて使える恐ろしいアプリです。

ターミナルは Prompt 相当です(同じメーカーですし)。

f:id:kondoumh:20161020225546p:plain

コードエディタはコードハイライティングや入力補完もやってくれて Textastic に匹敵するできばえです。sftp でディレクトリをブラウズして、対象のファイルを開き編集・更新できます。

f:id:kondoumh:20161020225630p:plain

ビルトインブラウザは、JavaScript の console.log() やエラーの確認までできるため、開発者モードがない iOS のブラウザではできない(簡易な)デバッグも可能。

f:id:kondoumh:20161020230603p:plain

HTML ならエディタからプレビューに遷移できます。ブックマーク機能もあるといいな。

iOS の限界まで頑張ってる異色アプリですが、おかげで iPad でも IDE 使ってる感じに作業できます。

Coda のように1アプリの機能凝集性が高まると Multi View でできる作業も広がりますね。IPad Pro に求められるアプリはこういう感じなのかもしれません。親和性の高いアプリの融合が進んで高度な作業フローがこなせるようになっていくのではないかと想像しました。

iPad Air 2 Wi-Fi + Cellular Gold 128GB を購入

Gadget iOS

初代 Air Wi-Fi モデルから Cellular モデルにアップグレードしたくて Apple ストアで新品買ってきました。

直前にソフマップで程度のいい中古が出てるの見て結構迷ったのですが、やっぱ iPad は新品がいいなと思って。

Pro 9.7 じゃなく Air 2 を選んだ理由

Air 2 は既に2年前のモデルであり、初代 Air と何倍ものスペック差はありません。なにも考えずに現時点で最高の iPad を入手するのが正しいのかもしれませんが、今回は以下のような要因から最新を追うのはやめました。

値段

128GB モデルで2万円の価格差。チップ性能に1世代分の差があるとはいえ、ステレオスピーカーや True Tone ディスプレイはさほど重要な機能とは思えません。Pencil と専用キーボードは高すぎて手が出ないですし、高性能カメラも使わないので宝の持ち腐れです。Air のカバーやキーボードも流用できるし。1万円ぐらいですが値下げされているため Air 購入時と同じ価格でストレージが倍になっています。

Pro でも重さが同じ

可搬性は Air 2 と Pro は変わらず。より軽くなれば Pro を選択する可能性はぐっと高まるのですが。。。Air 2 の重さに慣れてから Air 持つともう戻れません。

Touch ID は Pro と同様

Touch ID は Air にはない機能で Pro と変わらず。アンロックが楽だし App Store での購入時の認証にも使えるし。

Split View も Pro と同様

前の投稿では、ピクチャ・イン・ピクチャ推しましたが、真のマルチタスクである Split View も Pro と同様使えます。

blog.kondoumh.com

iPad Pro はスマホを中心に使っているユーザー向けステップアップ製品の位置付けと、グラフィックデザインなどをこなしたいプロシューマ向け 2nd マシンの位置付けがあると思っているのですが、自分のように PC / Mac メインでタブレットはスマホに次ぐ 3rd マシンの位置付けであるユーザーには Too much というかラグジュアリーすぎるマシンと思われます。

次世代の iPad は Pro シリーズに統一されるという噂もあります (Air 2 も継続販売されるかもですが)。

www.macotakara.jp

周辺機器やアプリを含めたエコシステムが Pro のラインに移行するにはもう1世代以上熟成を待つ必要があるのではないでしょうか。

使用感

常時ネット接続は快適すぎる

Wi-Fi オンリーと Cellular の格差が大きいです。IIJmio の データ通信専用 NanoSim (3GB プラン) を刺して通勤に持ち歩いてます。取り出してすぐにネットワークに接続されてるのは想像以上に快適です。電車の中では Nexus 6P 使わなくなり、もっぱら Podcast / Music Player になってます。MNVO の格安 SIM の恩恵を享受できます。これがあれば、電話なんて feature phone で十分ではないかと思えるほどです。

大きい画面なのに軽い

Nexus 6P の 5.7 インチも片手持ち端末としては申し分ないのですが、やはり 9.7 インチの iPad はいいものです(PPI は Nexus 6P の圧勝なのですが)。自分の場合 mini のサイズはないです。

Split View 便利

ピクチャ・イン・ピクチャによるオーバーレイだけでなく、同一画面でシームレスにタスク切り替え可能な Split View は iPad で生産活動するのに欠かせない機能だと思います。

ということで、お買い得な iPad Air 2 非常に満足しています。

iPad でコードを書くAgain 2

iOS Keyboard Programming Tools Gadget

通勤時間の有効活用

3月に VPS + iPad の作業環境を整えました。

blog.kondoumh.com

この時は数日の出張や帰省の荷物を軽くしたいというモチベーションでした。一応コード書けるけど、iPad 1台では作業が完結しないという結論でした。

最近、勤務地が変わり通勤時間が往復3時間を超えてしまいました。読書やゲームなどの消費活動だけだと間が持ちません。MacBook Pro を持ち歩いたりしてみたのですが、座れないことが多くほとんど使えません。そこで再び iPad Air を生産活動に活用すべく試行錯誤中です。iPad Pro ではなく手持ちの Air で頑張ってみるというテーマです。

物理キーボードは使わない

blog.kondoumh.com

Magic Keyboard と iPad の相性はとても良いのですが、膝上に置いて使えません*1。iPad Pro のキーボードカバーは Air では使えないので Amazon レビューで評価の良かった廉価なキーボードカバーを2つほど試しました。

見た目は MacBook っぽくなってよさげなのですが、本体と合わせるとそこそこ重くなり、付け外しも面倒です。苦手な US 配列しかなく*2 Ctrl キーの位置が全然ダメ。キーピッチが狭いため、フットプリントは MacBook とさほど変わらないのにタイプしづらい。

ということで物理キーボードは今のところ決定打がありません。やはりソフトウェアキーボードをポートレイトで使うのが現実的という結論に達しました。ポートレイトは iPad 使いの最もメジャーな操作スタイル。iPad Air の 9.7 インチというのはポートレイトでもタイプしやすいギリギリのサイズで画面も広く使えます。取り出してすぐ使えるし、立ってても使えます。

かなり使えるピクチャ・イン・ピクチャ

iPad でマルチタスク的なことができれば、作業は格段に捗ります。3月時点では iOS 8 だったので使えませんでしたが、iOS 9 *3からはピクチャ・イン・ピクチャという、画面右側からスライドインしてオーバーレイする領域で別アプリを使うことができます*4

次のスクリーンショットは Prompt で VPS に接続し、とある言語の REPL を動かしているところです*5

f:id:kondoumh:20160921014232p:plain

次がピクチャ・イン・ピクチャで iBooks をオーバーレイし ePub*6 を表示しているところ。ページめくりやテキストの選択コピーもできます。Prompt は Foreground で動作してるので ssh が切れることもないです。

f:id:kondoumh:20160921014255p:plain

iPad 1台あればプログラミング言語の解説書を参照しながら、コードを打ち込み実行することができます。これ、プログラミング言語学習環境としてはかなりイケてる気がします。

ピクチャ・イン・ピクチャは Twitter アプリをスライドインするぐらいにしか使えないと思っていたのですが、意外と有用でした。オーバーレイする画面の比率は変更できませんが、全画面アプリの切り替えに比べ操作が楽でストレスが格段に低いです。

その他のアプリのピクチャ・イン・ピクチャ対応状況を少し調べました。

  • Chrome / Safari:普通に使えます。Web でチュートリアルや Stackoverflow などのページを参照・コピーしつつコードを試せます。
  • Google Play Books:Google 製の ePub リーダー。使えます。。が iOS に最適化できていないからか、ページ読み込みに時間がかかったりして快適とは言えません。
  • iBooks:上記のように普通に使えます。ページめくりスムーズ。iOS ネイティブアプリの強みでしょうか。
  • Kindle:使えません(選択肢に出てこない)。
  • Slack:普通に使えます。チャットで打合せしながら文章の推敲や校正するなどの作業に有効そう。
  • Textastic : テキストエディタ。普通に使えます。エディタで下書きして、Word とか Pages で体裁を整えるといった使い方ができそうです。
  • Working Copy : Git クライアント。普通に使えます。テキストエディタと組み合わせると色々と捗りそう?

オーバーレイするアプリはフル機能使えるので、アプリの組み合わせ次第でコード書き以外の作業にも有効活用できそうですね。iOS 9 以降、iPad Air は軽量かつオールインワンな生産性デバイスとしてハイポテンシャルになっていることに気づかされました。iOS 8 で止まってる人は更新してみるとよいかも。

Local web server で開発中のアプリをプレビューしてみた

ブラウザをピクチャ・イン・ピクチャできるなら開発中の Web アプリのプレビューも行けそう。ということで、gulp-webserver と gulp-watch でタスクを書いて、Emacs を画面分割し、コード編集、Eshell で Gulp task を実行してみました。Three.js を使ったサンプルですが、コードで座標データなどを編集すると、オーバーレイしているブラウザに自動リロードされ、即時再レンダリングされます*7。Tips としては gulp-webserver を外部からアクセスするために host プロパティを localhost とかではなく 0.0.0.0 に指定する必要があります。 iOS のブラウザには開発者モードがないので JavaScript のデバッグはできないですが、iPad 1台でコード修正から動作確認までできてしまうのはけっこうすごいことだと思います。

f:id:kondoumh:20160921013504p:plain

まとめ

iOS のソフトウェアキーボードとピクチャ・イン・ピクチャを駆使すれば、ちょっと混雑した電車内でも作業できます*8。iPad Air まだまだ現役です。

*1:Kick Starter あたりで Magic Keyboard 用 iPad マウンターが出たらマジで Back したいです。

*2:この価格帯のキーボードカバーはグローバルに薄利多売されるものでローカライズされにくいのでしょう

*3:記事書いてるうちに 10 になりました。

*4:iPad Air 2 以降なら スプリット・ビューで画面分割して2つのアプリを同時に表示して完全マルチタスクで使えるのですが、iPad Air は残念ながら対応してません。

*5:Elm の elm-repl です

*6:Manning の Elm in Action です。

*7:iOS の WebView でも WebGL のレンダリングができるいい時代になりました

*8:急ブレーキには気をつけないとですが。