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

kondoumh のブログ

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

遅まきながら macOS Sierra に移行

Mac Tools

昨年9月リリースされた macOS Sierra、ずっとスルーしてましたが、半年経ったしそろろろいいかなと思い MacBook Pro 13 Retina Early 2015 に導入してみることにしました。

インストール

さようなら OS X

f:id:kondoumh:20170211130803p:plain

わりとあっさり終わりました。すぐに 10.12.3 へのアップデートが降ってきました。

こんにちは macOS

f:id:kondoumh:20170211130827p:plain

導入直後 CPU が高騰してるのでプロセスを見たら photoanalysisd というのが暴れてます。ぐぐって iCloud と写真アプリの同期を解除後、フォトライブラリを移動して OS を再起動、元に戻したら解決しました。

Homebrew パッケージ更新、IntelliJ IDEA や Visual Studio Code の更新も問題なし。見た目 OS X El Capitan との違いは全然感じられません。

Farewell Seil

起動時に Seil が警告ダイアログを出すようになりました。

f:id:kondoumh:20170211130854p:plain

そういえば、Sierra が出た直後 Karabiner が動かなくなったと言ってる人たちがいたなあと思い出しつつ Seil って Windows 用キーボードを使えるようにするユーティリティなので Magic Keyboard にスイッチした今となっては不要と気づきアンインストール。

f:id:kondoumh:20170211130908p:plain

新機能

フォルダの並べ替えが Windows っぽくなるオプションを有効化。これは地味に便利かも。

f:id:kondoumh:20170211131800p:plain

Siri が使えるようになりました。

f:id:kondoumh:20170211192654p:plain

Windows 10 の Cortana さん同様、当面活躍の場がなさそうな気がしますが。

他にも色々と新機能があるみたいなのですが、基本は小さな改善の集積なのではないかと思いました。

Boot Camp

先日からメイン環境を Windows 10 on Boot Camp にしています。

blog.kondoumh.com

この時は El Capitan の Boot Camp で使ってたわけですが、Thunderbolt - Mini DisplayPort ケーブル使って WQHD 解像度で使うと Chrome で YouTube を視聴すると切断されてしまうという不具合があり HDMI の FullHD でしのいでいます。

Sierra の Boot Camp の Windows サポートソフトウェアをダウンロードしてドライバー類を確認してみましたが、特に更新されてない模様。 ちょっと残念。

Windows 10 on Boot Camp で生活する

PC Gadget Keyboard

しばらく Boot Camp の Windows 10 で生活することにしました。

macOS と Windows の切り替えコスト

MacBook Pro 13 Early 2015 で macOS (まだ El Capitan ですが) を普段使っていて、たまに Windows 使うときに再起動して切り替えてます。最近 Windows でまとまった作業をする必要が出てきて macOS と Windows を行ったり来たりするのが億劫になってきました。自分の用途だと VMware Fusion の仮想マシンでは性能が不満という結論が出ているので、Boot Camp か Windows 専用機かということになります。

複数マシン所有のデメリット

では Windows マシンを別途買いたいかというとラップトップは15-20万円コースだし、マザーボード / CPU / GPU / メモリ買ってきて PC 組むのも面倒くさくてもうやりたくない*1

複数のマシンを所有するとそれぞれのマシンの稼働率が下がってしまうし、性能の落ちる Windows ラップトップ で妥協して MacBook Pro のパワーを使えないのはもったいない。

複数マシンを自宅の狭い机で使うには キーボード / マウス / ディスプレイの切替も考えなくてはいけなくなり地獄。

ということで Boot Camp の Windows 10 でも本来の macOS でも切り替えっぱなしで何週間でも使えるようにしていくしかないという結論に至りました。そして両方の環境で Magic Keyboard / Magic Trackpad 2 を他の入力デバイスに置き換えることなく使おうと考えました。

Windows 10 を快適に使うための設定

Magic Keyboard

Magic Keyboard のキータッチとスマートさに身体がすっかり馴染んでしまったので Windows でもそのまま使いたい。Apple Wireless Keyboard は Boot Camp でちゃんと対応されてたはずですが、Magic Keyboard だと「かな」キー /「英数」キーが効かない、'\‘(バックスラッシュ)、’|‘(パイプ)、’_‘(アンダーバー)が入力できない。。とボロボロです*2。現状お金で解決するしかないようです。

AppleK Pro for 10 64bit 概要

AppleK Pro のドライバーをインストールしてライセンスキーを取得すれば Magic Keyboard が完全に動作します。

Magic Keyboard JP は control キーが HHK と同じくファーストクラスな位置にあるのでよいのですが、caps キーも control キーとして使って左小指の肉球で押せるようにしたいです。特に Emacs では重要。これは macOS のようにシステム設定ではできないのでレジストリをいじる必要があります。

あと Windows では macOS のような Emacs リスペクトのキーバインドがサポートされていません。昔は Xkeymacs とか Keyhac などを使ってあがいたもんですが、Windows 標準のキーバインドとのコンフリクトが激しく返ってストレスになるので Emacs 以外では標準に従うことにしました。

ja.osdn.net

Keyhac - Pythonによる柔軟なキーカスタマイズツール - craftware

AppkeK Pro だと fn キーとカーソルキーの組み合わせで、Page Up/Page Down/Home/End をエミュレートできます。あとのカーソル移動は Trackpad で補うことにします。

Magic Trackpad 2

コントロールパネルの Boot Camp 設定でタップによるクリックを有効にします。MacBook Pro Early 2015 と Magic Trackpad は共に感圧センサーの Trackpad ですが、Windows 10 でもちゃんと使えます。ただし、Magic Trackpad の方は突然動きがにぶくなるという謎の症状があるので、Magic Mouse を待機させています。

スクロール方向が macOS と逆なので、レジストリをいじって macOS のナチュラルに合わせました。慣性スクロールは諦めるしかありません。

起動ドライブ

マシン起動時に Option キーでディスクを選択して Windows を起動する方法だと、スリープ開けに macOS が起動してしまいます。コントロールパネルで起動ドライブを Boot Camp のディスクにします。

Windows 10 on MacBook Pro の使い心地

マルチディスプレイサポート

ラップトップとして外部ディスプレイと繋がず使っている分には macOS と遜色ないのですが、マルチディスプレイのサポートは macOS に一日の長があります。

macOS では画面ごとに仮想画面を切り替えられるので使いやすいです。確か OS X Marvericks あたりで今の形に改良されました。Windows 10 はディスプレイをまたがる仮想的なスクリーンとして管理していて、タスクビューで切り替えるとすべてのディスプレイが切り替わります。

MacBook Pro の Retina と Full HD / WQHD ディスプレイを行き来する時、システムバーのボタンが標準の大きさにならないアプリがあります。レガシーアプリには多いようです*3

全画面

macOS の全画面はラップトップで使っている際、スワイプして切り替えるのには使いやすいですが、マルチディスプレイではさほど活躍しません。Windows だと仮想画面でワークスペースをいくつか作り (スワイプは効かないので) control + command + カーソル(左右) で切り替えます。Windows 10 は command + カーソル (上下左右) によるスナップや最大化・最小化が簡単にできるので全画面がなくても不便は感じません。このへんは macOS の方が使いにくいですね。

バッテリーライフ

macOS で使っている時と大差ない印象です。MacBook Pro 13 Early 2015 の CPU は Haswell 世代なのでかなり省電力仕様ですが、Windows 10 はこれまでのバージョンに比べてかなり軽量化・省電力化が進んでるのでしょう。Bootcamp Manager っていうサービスは CPU を占有するので切った方がよいです。

終わりに

細かいところで macOS のような洗練と安定感には欠ける Windows ですが、Ubuntu on Windows が熟成していけば開発環境も macOS から 移行できそうだし、次は MacBook ではなく Windows ラップトップにスイッチできるかもしれません。今から macOS へのロックインを解除できるよう身体を慣らしていくのもありかもしれませんね。

f:id:kondoumh:20160410125845p:plain

*1:ゲームとか VR 目的なら別ですが

*2:本体のキーボードだと問題なく入力できます

*3:iEdit もそうなんですが

ひらくPCバッグmini を購入

Gadget

最近 iPad Air 2 を常に、MacBook Pro も時々持ち歩くようになり、ビジネスリュックを使ってました。しかしリュックは背負ったり降ろしたりするアクションがどうしても多くなってしまうし、満員電車だと後ろの人に気を使うしし・・とフラストレーションがあります。年末に、以前から欲しいと思ってた「ひらくPCバッグmini」注文しちゃいました。

superclassic.jp

年明けから持ち歩いてます。肩掛けタイプなのでリュックより取り回しが格段に楽。電車の中でも周囲への圧迫感がない。MacBook と iPad 両方入れるとさすがにちょっと重いですが、肩紐の生地が分厚いため荷重がほどよく分散される感じです。

f:id:kondoumh:20161224162315j:plain:w300

開口部のメッシュの部分は、ファスナーが下にあるのが「??」って思ったのですが、ベローンと開いて、小物の出し入れが簡単にできるので「なるほど」と納得しました。

f:id:kondoumh:20161224162349j:plain:w300

電車で膝の上に乗せるといい感じの作業台になり iPad や MacBook がほどよい高さで使えます。出張の時もトランクと別にこのバッグ持っていくと宿泊用の荷物と作業用の荷物をいい感じに分離できそうです。

マジックテープで間仕切りを好きな位置に調整できて、サイフやバッテリチャージャーや入館証など、毎日持ち歩く小物を定位置に入れてすぐに出し入れできるのもよいです。細いものなら弁当箱も余裕で入ります。

あと自立するのがめちゃ便利。リュックだと壁にもたせ掛けるつもりでバランス逆でこけてしまうことがよくあるのですが、そうしたストレスから解放されました。これが一番のキラー機能かもしれません。

ということで、買ってよかったです。

2016 ふりかえり

Gadget Job Life Programming

今年も残り僅かとなりました。恒例のふりかえりエントリーです。

Job

フレームワーク開発 (.NET)

前半は、昨年から継続して .NET の業務アプリフレームワーク開発。機能開発は昨年暮れまでにほぼ完了しており、年明けから結合テストの傍らリファクタリング漬けの日々 (コード凍結が中々できず・・) 。性能チューニングやメモリリークの特定と修正、アプリ開発開始に伴う追加要望対応とバグフィクス、テストドライバーの改善、アプリの結合試験環境作成や保守用ドキュメント作成・・とフル回転。怒涛のプロジェクト進行によるハードワークで何回かバーンアウトしてました。

多くのコードを設計書から自動生成し、標準で縛り、開発者がロジックを書く部分を極力限定するという、いい意味で統制のとれたアーキテクチャでした (try catch も書かせません)。

性能チューニングでは、起動処理の並列化や通信の圧縮といった通常の対応はもちろん、クラスを JIT ではなく CompilerServices でプリコンパイルしておくなど、打てる手は打ち尽くすという感じでした。RDB の1000列のテーブルの更新を数秒以内に終わらせることが求められました。そんな DB 設計を許容するということ自体がありえないと思いましたが、兎にも角にもフレームワークとしては非機能要件を満たしたのでした。

フレームワーク開発が本格化してから約10か月、採用された UI コンポーネントの品質が低かったり、仕様追加が激しかったり、コードが複雑化して保守が難しくなったりといろいろと大変でしたが、経験豊かな力量ある .NET エンジニアがフルパワーで戦ってくれたおかげでなんとか乗り切れました。

.NET による開発の知見も色々と得られました。リリースに関しても、Jenkins の .NET 系プラグインや PowerShell プラグインを駆使してかなりのオートメーションを実現できました。

6月で無事卒業。

フレームワーク開発 (Java EE)

7月からは一転 Java EE の業務アプリフレームワーク開発現場に着任。ここではプロダクトコードはメンバーに任せ、仕様調整、設計レビュー・コードレビュー、チケット管理、各種自動化をやっています。

Java だと Spring や Hibernate などデファクト技術で構築することが多いので、ド標準の Java EE (JSF / CDI / JPA) には正直馴染みが薄いです。情報も少ないですし。メンバーはライブラリの実装までみて問題解決できるレベルなので開発自体はさしたる問題もなく進んでいます。やはりうちは Java 中心の技術者集団なのだと改めて思いました。

Java 8 はお初です。Lambda / (Parallel)Stream / Optional など Functional な言語機能が取り込まれて、フレームワークのコードもかなり様変わりしてます。

blog.kondoumh.com

エンプラシステムのアーキテクチャ構築・フレームワーク開発に携わって長いんですけど、お客様の事情を理解してモノを作るというところ(要約すると要件定義)で毎回苦労してます。このプロジェクトでは、まだアプリの開発は始まっていません。先は長そうです。

Writings

業務用

会社の宣伝活動も兼ねて ITmedia エンタープライズで連載させていただきました。

blog.kondoumh.com

モデリングの話は最近少ないので、一周回って新鮮に受け止められたのではないかと思います。自分としては最終回で UI の設計プロセスについて語れたのがよかったです。

はてなブログ

はてなダイアリー時代から10年以上続けてきて、今年はアイキャッチ画像も気を使うようになりましたし、広告を消したいという動機ではてなブログ Pro にアップグレード、サブドメイン使うようにしてみました。結果、更新のモチベーションに繋がっている気がします。iPad ネタが多かったですね。今後も引き続きソフトウェアやガジェットについて書いていくんだろうと思います。

Qiita

.NET の小ネタを2件ほど投稿してました。

qiita.com

qiita.com

Personal Development

iEdit

今年は初めてリリース0回。2年近く放置したので窓の杜からも消えました・・。シナリオ作ってる人がいまだに使ってくれてるようなので Electron と d3.js あたりを使ってクロスプラットフォームアプリへと式年遷宮したい気持ちはあります。

社内アプリ

社内業務支援アプリを構想中。プロトタイプの作成に取りかかっています。

昔も稼働が空いた時、同僚と SFA アプリを作りました。しかし営業支援ツールなのに VPN でしか使えず、保守工数も取れず、定着化・改善のサイクルに持って行けませんでした。今回はモバイルファースト・クラウドファーストなアプリにして改善サイクルを回したいです。お客様に DevOps の話してる時に自分達でやってないと説得力ないですしね。運用もやるつもりです。

サーバーサイドは Java 技術者が多い社内事情を考慮して Spring Boot。DB はとりあえず H2 で良いかなと。ドメインモデルを Astah で作りました。RESTFul API の設計を Swagger 使ってやるべく環境構築。全文検索も Solr とかで実装したいところ。

UI は React / Mithril / Riot.js あたりで迷っています。いずれにしても SPA で行くつもりです。

Gadgets

持ってるものは去年とさほど変わってなくて、Android Wear の時計買ったのと iPad リニューアルぐらいです。

Moto 360 2nd gen

時計 & 活動量計 & 通知デバイスとしてすっかり生活に溶け込みました。

blog.kondoumh.com

スマートウォッチの市場はシュリンクしていて未来はないという予測も出ています。時計をつける習慣がなく、スマートウォッチだから使い始めた自分のような人も多いと思うのですが。

jp.techcrunch.com

市場のシュリンクを裏付けるかのように年末モトローラのスマートウォッチ撤退のニュースが。

forbesjapan.com

でも Google はまだやる気のようです。

www.forbes.com

Android Wear 2.0 は単独でアプリのインストールができるようです。スマホのコンパニオンデバイスではなく、独立したガジェットとして発展していくという未来はあるのでしょうか。

iPad Air 2 Cellular

3年間使った Wi-Fi 版 Air とお別れして、Cellular 版 Air 2 に乗り換えました。

blog.kondoumh.com

通勤のお供に漫画リーダー、Ingress 端末、コーディング環境と幅広く活躍してくれます。MacBook Pro を持ち歩くときのテザリング端末としても優秀。iOS の進化は引き続き見守っていこうと思っています。

Nexus 6P

Nexus 6P は引き続き愛用してます。

blog.kondoumh.com

この記事を書いた時はまだ iPad Air 2 を入手しておらず、生産活動にも活用しようとしてました。

夏に Nougat がリリースされました。目玉機能の一つであるマルチウィンドウは日頃全く使わないです。Android タブレットだったら使いそうですね。

その後 Pixel が発表され、Android 7.1.1 がリリース。UI がかなりブラッシュアップされた感じです。ホーム画面でアプリアイコンを長押しすると機能のショートカットメニューが出るようになりました。iOS の 3D Touch 的な機能ですが、これも今の所全く使ってないですねえ。

多くのサービスを Google に依存しているため利便性が高い Nexus ですが、Pixel の登場でディスコンになってしまいました。Pixel の日本発売は未定ですが、FeliCa 使える iPhone に回帰する可能性もありますね。iOS も Android も差がなくなっているし Android のフラグシップモデルと iPhone の価格差も縮まっているし。iOS で不便なのは Chrome をデフォルトブラウザにできないことぐらいなので。

MacBook Pro

13-inch Early 2015 を使い続けています。macOS Sierra は未導入です。今年のモデルチェンジ、Touch Bar はともかく USB-C オンリーとかマシンパワーがアップしてないとか信者じゃないと厳しそう。あと2年ぐらいは今のモデルでいけそうな気してます。

VR とか AI で GPU パワーが使いたいならゲーミング PC がよさそうですね。ツクモが Razer Blade 扱い始めてます。スリムなゲーミングノートよいかも。

getnews.jp

VR グラス

Cardboard のヘッドセット買いました。スマホの装着がけっこう面倒 (留め金がキツめで Nexus 6P に傷がつきそう) なので数回使って埃かぶってます。

blog.kondoumh.com

Android 7.1.1 で Nexus 6P も Daydream 対応になったし日本でも発売してほしいですね。スマホの装着が楽そうでリモコンもついてるし OS がサポートしてるのは大きいと思います。

vr.google.com

Oculus Rift や PlayStation VR が発売され VR 元年と話題になりました。パーソナルコンピューティングを変えるポテンシャルを持ちつつあるようです。

SFマガジン 2016年 12 月号 [雑誌]

SFマガジン 2016年 12 月号 [雑誌]

Fire TV Stick

Amazon プライムに入りました。

MacBook や iPad でプライムビデオ観てましたが TV CM で音声認識リモコン見て買ってしまいました。Chromecast だと対応してないというのもありました。

http://stock.kondoumh.com/post/153171945022/amazon-fire-tv-stick
stock.kondoumh.com

Magic Trackpad 2

キーボードもマウスもパッドも Magic シリーズで揃えてしまいました。

blog.kondoumh.com

Software

Microsoft プロダクトの話題が多かったですね。

Bash On Ubuntu On Windows

Windows 10 Anniversary Update の目玉です。 インストールしてブログ書いただけで、本格活用には至っていません。普段はやはり macOS です。

blog.kondoumh.com

Visual Studio Code

統合ターミナルも入ってきて完成度が高くなりコードエディタの決定版になりました。

blog.kondoumh.com

Visual Studio for Mac

とうとう macOS でも使えるようになった Visual Studio (というか Xamarin Studio ですが)。

blog.kondoumh.com

今年は仕事で Xamarin にも少々関わりました。Windows の Visual Studio 2015 での Xamarin 開発は環境構築の敷居が (ハードウェア的に) 高い印象でしたが Mac 版はネイティブな Xamarin Studio ベースだけあってスムーズですね。ASP.NET Core も Java EE 並みの存在になっていくかもしれません。NET Standard の範囲でコードを書いておけばポータビリティ高そうです。

docs.microsoft.com

Emacs

25.1 にアップデート。org-mode だけは手放せない感じです。

blog.kondoumh.com

VS Code がメインになったので、不要になったパッケージや設定をダイエットしてます。

Emacs も「ソフトウェアの死」を迎えつつあるのでしょうか。

qiita.com

Coda for iOS

数年前購入したきりになっていて、今年になって活用方法を発見した web 開発ツール。機能凝集性の高い IDE として VPS クライアントとして iPad で使っています。

blog.kondoumh.com

PowerShell

今まで積極的に使おうとはしてなくて今年になって愛用者になりました。Jenkins のプラグインがあるのが助かります。

blog.kondoumh.com

Windows 10 では PowerShell が標準のコマンドシェルに置き換えられるようなので、今のうちから慣れておくとよいと思います。

fossbytes.com

DOS 互換のコマンドもエイリアス定義されているから、通常の使い方ならあまり困らないと思います。それにしてもようやく cmd.exe / BAT ファイルとおさらばできるのは喜ばしいですね。あとはコマンドヒストリとかキーバインドとかフォント表示とかいろいろ改善してほしいですが。

IntelliJ IDEA

買ったきりで活用が進んでいませんでしたが、Java の検証コード作成とかで時々起動するようになりました。社内アプリのサーバーサイド開発でも使う機会が増えそうです。Ultimate では Spring Boot がサポートされてて楽ちんです。

www.jetbrains.com

Super Mario Run

年末に公開されました。やり込みがいありそうです。アプリ内課金しました。

supermariorun.com

Services

Slack

これまで使う機会がなかったのですが、遅ればせながら社内プロジェクト用にサインアップ。IRC や Lingr からの進化を目の当たりにしました。

slack.com

常駐先では Slack クローンの Mattermost を導入して朝会や業務連絡などの専用チャネル使ったり、Jenkins の自動テスト結果通知 Bot とか Excel ファイルや Redmine チケットの更新通知 Bot 作ったりと、もはやなくてはならないインフラになってます。

Mattermost

来年は、カンバセーショナル UI が来るらしいです。

medium.com

Slack の API 使って協調作業できるアプリを作りたい気持ちになっています。

ConoHa

VPS サービス。メモリ 512MB なら \630/month で VPS を維持できます。Ubuntu 16.04.1 LTS で運用中。

www.conoha.jp

Stackoverflow

US オンリーですが新サービス Documentation がいい感じです。

Moto Body

活動量計が iPhone 5s のモーションセンサーから Moto 360 に移行したため Fitbit にデータが溜まらなくなり、Moto Body アプリに移行しました。Fitbit のデータは一応ローカルにダウンロードしました。モトローラはスマートウォッチ撤退なので、サービスも間もなくシャットダウンされるでしょう。Pebble を買収した Fitbit に戻るか Google Fit にしておくか悩ましいところです。

Moto Body | Motorola

Ingress

Ingress は今年で4周年。自分は2年と数ヶ月ぐらいやってます。年末登場した Luminarie メダルは Silver でした。野良エージェントとして細々と活動してます。現在 LV11。11月の AP 2倍キャンペーンでかなり稼いだのでメダルがあと2つ金になると12なんですがノルマがなかなか厳しい。今は、なるべくミッションやるようにしてます。

charingress.tokyo

ねこあつめ

ひたすら餌を補充して、時々ねこ画像をツイートしています。あいことば登録が日課です。

Pokémon GO

インストールして1週間ぐらいでアンインストール。自分には Ingress の方がなじみました。

Amazon Music

Google Play Music を解約して、プライムで利用できる Amazon Music に移行しました。Podcast 聴いてる時間が長いので Amazon で充分かと。昔 CD からリッピングして iTumes ライブラリで管理してた音源がバックアップもろとも消失してショックでしたが、もうあまり気にしないことにしました。音楽はストリーミングで十分かなぁ。

Kindle Unlimited

こちらはお試し期間から1か月延長して利用して解約。あまり読みたいのがなくて。

Mixlr

Rebuild.fm ライブが Mixlr で配信されるようになったのでサインアップ。リスニングオンリーです。

mixlr.com

おわりに

今年も客先でフル稼働だったので、来年はもう少し個人および社内プロジェクトへのコミット比率を上げていきたいなあ。

それではよいお年を。

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:直後に消えましたが。