EC2 インスタンスを Android / iOS から起動・接続・停止する環境を構築する

これまで VPS をレンタルしてましたが、利用頻度がさほどでもないので、必要時だけ EC2 のインスタンスを起動することで定額課金を無くそうと思いました。t2.micro や t2.nano のインスタンスは開発環境としてはそこそこのスペックで時間当たり料金も安いので財布にやさしいのです。

モバイルから Web UI でインスタンスの起動や停止を行うのは面倒なので、AWS CLI を使いたいところです。AWS CLI の実行には Python が必要なので単なる SSH クライアントアプリだと動きません。

ということで、AWS のドキュメントを参考にしながら Android と iOS でそれぞれ環境構築してみました。

docs.aws.amazon.com

Android

もちろん Termux を使います。

play.google.com

Python 環境を構築して、awscli を pip install します。

# Python パッケージをインストール
$ pkg install python python-dev

# venv を作成
$ python3 -m venv enva

# venv をアクティベート
$ source /enva/bin/activate
(enva) $ 

# pip で awscli をインストール
(enva) $ pip install awscli 

# awscli 起動確認
(enva) $ aws --version
aws-cli/1.16.96 Python/3.7.2 Linux/4.9.96-gce70628-ab5122554 botocore/1.12.86

iOS

iSH (ベータテスト中) を使いました。

github.com

iSH は Alpine Linux ベースなので apk コマンドでパッケージをインストールします。

# sudo をインストール sudo ユーザ追加
# apk add sudo
# adduser user1
# vi /etc/sudoers

# python3 をインストール
$ sudo apk add python3 python3-dev

# venv を作成
$ python3 -m venv enva

# venv をアクティベート
$ source enva/bin/activate

# awscli  を pip でインストール
(enva) $ pip3 install awscli

# awscli 起動確認
(enva) $ aws --version
aws-cli/1.16.96 Python/3.6.6 Linux/3.2.0-ish botocore/1.12.86

iSH は Python のチューニングがまだみたいでけっこう待たされますが一応 aws コマンドは使えるようになりました。

EC2 インスタンスの作成

AWS の EC2 マネージメントコンソールでキーペアを作成し、作成したキーペアを使って EC2 インスタンスを AMI から作成します。 今回は、Ubuntu を選択しました。

キーペアの作成も EC2 マネージメントコンソールで行いました。AWS CLI でコマンドを叩く方法もあるのですが、インスタンスを複数の端末から使うため、キーペアのファイルを取得しておきたいためです。

AWS CLI の設定

あとは端末ごとに設定を行います。AWS CLI の設定用サブコマンドでアクセスキーID、アクセスキー、リージョン、出力フォーマットを入力します。

(enva) $ aws configure
AWS Access Key ID [None]: xxxxxxxxxxxx
AWS Secret Access Key [None]:  xxxxxxxxxxxxxxxxxxxxxxxxx
Default region name [None]: ap-northeast-1
Default output format [None]: text

キーペアのファイルを保存し、読み取り権限を変更しておきます。

$ chmod 400 devenv-key.pem 

以上で、EC2 インスタンスへの接続準備ができました。

起動、接続、停止

固定 IP アドレスは取得していないので、起動のたびにインスタンス ID から取得する必要があります。

#  venv をアクティベート
$ source enva/bin/activate

# インスタンス起動
(enva) $ aws ec2 start-instances --instance-ids "i-xxxxxxxxxxxxxxxxxxx"

# IP アドレス取得
(enva) $ aws ec2 describe-instances --instance-ids i-xxxxxxxxxxxxxxxxxxx --query "Reservations[0].Instances[0].PublicIpAddress"

# ssh でログイン
(enva) $ ssh -i devenv-key.pem ubuntu@xx.xxx.xxx.xxx

# インスタンス停止
(enva) $ aws ec2 stop-instances --instance-ids "i-xxxxxxxxxxxxxxxxxxx"

シェルにしておいた方がいいですね。これで Pixel 3 からも iPad からも EC2 インスタンスを起動して SSH 接続、停止ができるようになりました。iSH はまだベータ版とはいえ、SSH に関しては問題なく作業できる状態です。

EC2 インスタンス自体も必要時に AMI から作って環境構築を Ansible で実行するよう自動化しておけば、Immutable Infrastructure をさらに進めることができます。今後 Ansible Playbook を整備していきたいと思います。

Scrapbox Electron アプリ - タイトル付き書式でリンクを貼る機能

Scrapbox には URL をペーストすると、その Web ページのタイトルを取得して、[url title] の記法でペーストしてくれる Chrome 拡張や Bookmarklet がいくつかあります。

ScrapScripts もそのひとつ。

chrome.google.com

同僚からこの拡張の使い方を教えてもらい、確かにこの機能は取り込むべきだと思いました。

まずは、安直にアプリ起動時に ScrapScripts 拡張をそのままロードする方法を試みました。Electron には BrowserWindow.addExtension という API が生えています。この API を使うと一応ロードはできていますが、肝心のペースト機能は動作しません。

Electron は Chrome 拡張のサポートはしない *1 というスタンスのようです。まあ、ブラウザ用に作られた拡張のためのエミュレートは難しいということだろうと思います。

ということで、同等な機能をアプリ側に実装することにしました。Scrapbox の開発者で ScrapScripts の作者 daiiz さんが実装を解説されています。

scrapbox.io

DOMParser というオブジェクトでページの要素が取り出せるんですね。Electron ではクリップボード周りの API が簡単に使えたり、クロスブラウザの考慮が不要だったりとかなり楽ができます。ページを fetch して DOM を parse するレイテンシーのある非同期処理なので、ステータスバーに経過を表示するようにしてみました。

f:id:kondoumh:20190125223858g:plain

これで、外部リンクを貼るのが楽になりました。

Release v0.3.2 · kondoumh/sbe · GitHub

*1:DevTools 拡張はサポートされています

Scrapbox Electron アプリにページ一覧と検索 UI を追加

弊社の Scrapbox 活用事例が公開されました。

medium.com

社内 Scrapbox けっこう盛り上がっていて、なにかというと更新しています。ページもすごい勢いで増加していて退屈しません。

Scrapbox の更新頻度アップに伴って Electron アプリも時々更新してます。

社内チャットなどで Scrapbox の URL が連携されてきた時にアプリで開きたいケースがあることに気づき、テキストボックスの入力窓を付けました。

複数キーワードの AND で検索したいという要望が同僚からあったので、URL 用のテキストボックスに URL でない文字列が入力されている場合は、検索クエリを投げ結果を新規タブに表示するようにしてみました。

f:id:kondoumh:20190121221851g:plain

AND 検索自体は Scrapbox の Web UI でも可能であることに実装後に気づきました。本家の UI は単語の補完に重点を置いていて、検索ワードが入力欄に残らないため、条件を変えた再検索がしづらいという面もあるので、これはこれでよいかと思って残しています。

Scrapbox のトップページはアイコンのグリッド表示なのですが、タイトルのみの一覧が欲しいという意見もありました。 ページ情報を JSON で取得する API を使って、新規タブに一覧を出すようにしてみました。API ではビュー数や被リンク数も取れるので一緒に出してみました。

f:id:kondoumh:20190122223607g:plain

ビュー数の降順とかで表示してみたいところですが、ソートキーを指定可能な API は今のところ提供されていない模様です。公式ドキュメントには載っていませんでしたが、ビュー数などをソートのキーとして指定することが出来ました。ドロップダウンリストでソートキーを選べるようにしました。

ということで v0.3.1 をリリースしておきました。

github.com

PC レスなモバイル作業環境 2019

blog.kondoumh.com

Pixel 3 のコンパニオンに買った iClever の折りたたみキーボードはけっこう当たりでした。Scrapbox にも書きました。

scrapbox.io

Termux 環境は言語学習や CLI プログラム開発の用途では十分いけます。今は Emacs に rust-mode を導入して Rust のブートストラップしてます。

Termux では苦しい Web UI 開発については、以前紹介した CodeSandbox がけっこう使えます。

blog.kondoumh.com

PWA として動作します。Showcase というか Sandbox モードでは非常に良い感じに Responsive に動作します。Editor モードはいまいち使いにくくなりますが、ランドスケープにしたらなんとか使えます。プレビューまでついててちゃんと動く。

f:id:kondoumh:20190116222150p:plain

Scrapbox も PWA で使えます。

このように Chrome は多くのサービスで第一級市民のブラウザであり、Android では iOS と違い Webkit じゃない本物の Chrome が動くので、デスクトップ向け Web アプリもけっこうちゃんと動きます。

最近、実家の事情で月1回ぐらい帰省していて、ラップトップ持っていくのが重かったですが、前回 Pixel だけでも色々と作業ができたので、短期間であればなんとかなることがわかりました。

ただ、Pixel で作業してるとバッテリーの消耗が激しくなるので、チャージャーの充電が気になり、ちょっとストレスも。やはり iPad を活用したいところではあります。

iOS にも Termux に相当する iSH というアプリが鋭意開発中ということを知り期待しています。

github.com

TestFlight で開発版を使うことができるのでインストールしてみました。

なかなかいい感じです。あとは、Chrome がちゃんと動いてくれるといいのですが。

こうなると Chrome OS のクラムシェルやタブレット端末も気になってきました。

今のところ、ターミナル作業と Chrome での作業が両方それなりのレベルで可能ということで、Pixel 3は悪くない選択肢ではあります。

2018 ふりかえり

Job

去年から引き続き Java EE の大規模プロジェクト。5月で一足先に卒業させていただきました。約2年間、会社としても大きな案件で色々とあったプロジェクトでした。

今年は Oracle の Java リリースサイクルとサポートの変更が発表され、各ベンダーからの OpenJDK サポート表明も話題になりました。業界的にはこのネタで仕事ありそうな感じがします。

6-9月は開発支援ツール系 PoC を作るプロジェクトに参加。Eclipse Che や Node RED などのアドオン開発、Node Express や Spring Boot 使ったプロト開発など、短期間で色々やって長期案件のリハビリになりました。TypeScript に覚醒しました。

10月からとあるプロダクト開発のお手伝い。コテコテのエンプラ開発ではあまり体験できない、Cloud Native で Infrastructure as Code な世界に来ています。

Personal Development

3年ぶりに iEdit 更新しました。MFC すっかり忘れてました。

Windows 10 / HiDPI 対応 blog.kondoumh.com

JSON 対応 blog.kondoumh.com

VS Code の拡張を作って公開というのもやってみました。

blog.kondoumh.com

Scrapbox の Electron クライアントとかも作ったり。

blog.kondoumh.com

GW あたりから GitHub に毎日草を生やすというのを始めてしまい、現在も続行中です。

f:id:kondoumh:20181227211550p:plain

iEdit も BitBucket から GitHub に引っ越したので草に貢献しています。チュートリアルやったりとかが多いですが、毎日何かしらコミットするネタを探すため、広く浅く手を出してみました。とりあえず着手への心理的障壁が低くなる効果はある気がします。

Writings

年明けから月2回はブログ書くという謎のノルマを自分に課してました。GitHub に草を生やす活動とも連動しました。投稿数としては過去最多になりました。

Chrome を筆頭に各ブラウザが 常時 SSL を必須とするようになったので、ホームページとブログを HTTPS 対応しました。

blog.kondoumh.com

blog.kondoumh.com

ホームページの方は静的サイトジェネレータに移行したいなと思ってますが、今年は構造見直しに終わりました。

blog.kondoumh.com

iEdit のサイトを GitBook + GitHub Pages でリニューアルしたりしてみました。

blog.kondoumh.com

Services

仕事も Cloud Native な感じになりましたが、年明けぐらいから個人でも AWS を使い始めたり、Cloud IDE を試したりしました。

blog.kondoumh.com

CodePen とか CodeSandbox も少し。

blog.kondoumh.com

blog.kondoumh.com

最近は GitLab を仕事で使っています。GitLab Flow にも慣れました。

about.gitlab.com

会社で Scrapbox が導入されたことで、組織でのユースケースを初めて体験しましたが、書きやすいし非常に好評です。リアルタイム更新やリンクによるネットワーク可視化など、より一層そのポテンシャルを実感するようになりました。

scrapbox.io

Trello のタスクは放置しがちになり、Google カレンダーのリマインダーを活用するようになりました。大抵の TODO はカレンダーと連動してくれた方が管理が楽だということに気づきました。

trello.com

そう言えば Inbox 終了のお知らせがありました。リマインダーもいい感じに混ざって使いやすかったのですが。

仕事での VS Code 利用比率が高まって、IntelliJ IDEA は Community 版でいいかなと思うようになりました。 Java 書く機会も減ってきましたし。

ニュース系では Menthas をよく見にいくようになりました。

menthas.com

このブログも何回か掲載されてました。

Ingress は ようやく LV 16 に到達し6周年の Ouroboros メダルはオニキスでした。

Ingress Prime のローンチ直後は旧アプリ Deducted ばかり使ってましたが、今後は Prime の進化を見守りたいと思います。

Amazon Music Unlimited あまり使わないので解約して Spotify をフリープランで聴いてます。YouTube Premium はまだ試してません。

www.spotify.com

Anigif を作るツール。ソフトウェアの操作イメージを Web に貼るのに便利です。macOS 専用なので、Windows でも似たのがあるといいのですが。

gifox.io

Gadgets

Nexus 6P から Pixel 3 XL にスイッチ

blog.kondoumh.com

Echo Dot を買って Alexa Skill 開発にトライしましたが、Hello, world で終わってしまいました。

blog.kondoumh.com

MacBook Pro 13 Early 2015 がまだメインマシンです。Docker for Mac で Java の巨大プロジェクトをデバッグしたときに力不足を感じました。自宅ではそこまでヘビーなことは滅多にしないのですが。

会社支給マシンが軽量な Let's note CF-SZ6 になって Windows 10 でも macOS と同等の開発環境を構築して利用するようになりました。

scrapbox.io

バッテリーの持ちがもう少しよくて薄いラップトップ か 2in1 あってもいいなという気持ちです。

まとめ

今年は個人的にクラウド元年な気がします (今更)。

macOS Mojave にアップグレード - ダークモードとフォントレンダリング設定

年末なのでアップグレードしてみました。

f:id:kondoumh:20181222154150p:plain

30分ぐらいで完了しました。

デフォルトがダークモードになっていたのでそのまま選択。システム情報がダークに。

f:id:kondoumh:20181222154244p:plain

ファインダーもダークに。

f:id:kondoumh:20181222154544p:plain

ターミナルもダークに(もともと黒いですが)。

f:id:kondoumh:20181222155148p:plain

ゴミ箱もダークに。直近に起動したアプリを表示する領域ができてました。

f:id:kondoumh:20181222154914p:plain

Safari もダークに。iPhone のサイトもダークに。

f:id:kondoumh:20181222161905p:plain

せっかくなので、Chrome にもダークテーマを導入して統一感を出してみました。

chrome.google.com

f:id:kondoumh:20181222162129p:plain

ダークになった。

開発ツールやエディタはダークテーマが定番化していて、ツイッターもダークテーマ使ってたのでそれほど印象は変わりません。Web ページは Lite 系が多いですが、今後レスポンシブに Dark になることが求められるかもですね。

デスクトップのファイルをまとめてくれるスタック機能。便利かも。

f:id:kondoumh:20181222162228p:plain

非 Retina ディスプレイでのフォントレンダリングが汚くなるという話がありますが、自宅のディスプレイ (WQHD) では「ちょっと薄くなった?」という感じ。

試しにググって以下のコマンドを実行して再起動しました。

$ defaults write -g CGFontRenderingFontSmoothingDisabled -bool NO

コマンド実行前

コマンド実行後

やっぱり薄くなってた感じですね。

VMware Fusion のアップグレードは利用頻度が下がったのもあり、今年は見送ることにしました。

Pixel 3 XL を Linux マシンとして活用する

blog.kondoumh.com

Pixel 3 XL にスイッチして1ヶ月以上快適に使ってます。電話も6インチ超えになると iPad を持ち歩く意味も希薄になり、外出時はスマホだけあればいいというミニマリズムを追求したくなってきました。

iPad では VPS に SSH 接続してコード書いてました。

blog.kondoumh.com

Android でも同様のことはできますが、それよりも Termux というキラーアプリがあります。

play.google.com

これインストールするだけで root を取らなくても Linux 環境を利用できます。

github.com

多くのパッケージが提供され、pkg コマンドで簡単に導入できます。もちろん Node.js の開発も可能です。

$ pkg install nodejs

npm でエラーが出ますが、この issue のコメントに従って usr/lib/node_modules/npm/node_modules/worker-farm/lib/farm.js を編集したら動くようになりました。

github.com

Vue のアプリを起動して Chrome で localhost:8080 を開いて動作確認ができました。

Python、Go、Rust などの環境も構築できます。

しかしハイエンドスマホのスペックはちょっと前の PC を凌駕しているとはいえ、ここまで普通に Linux の開発環境が動くというのはすごい時代になったものです。

エディタは Vim や Emacs をターミナルでを使うことになります。SSH と違って tmux などを使わなくてもセッションが維持されますし、Termux 内で複数セッションをスワイプで切り替えられます。デスクトップでは VS Code しか使わなくなりましたがここにきて Emacs に回帰。 画面狭いので検索絞り込みインタフェースが適してるだろうと Anything か Helm 入れようとちょっと調べたら 最近は Counsel が人気のようなので M-x package-install counsel で導入しました。

Hackers Keyboard を使えば、Alt や Ctrl キーもポートレートモードで使えるので Emacs もそのまま使えます。

play.google.com

とはいえ物理キーボードは必要なので、軽くて本体にスタンドがついている iClever の折りたたみ式キーボードを買ってみました。

ちょっとおもちゃっぽく、キー配列は変則であるものの意外と打ちやすく感じます。スタンドの安定感はいまいちですが、一体型である点を考慮すると許容範囲かなあと。あまりしっかりしたキーボードだと重くなってラップトップ持って行った方がいいという閾値を超えてしまうので。

小さい画面と小さいキーボードでの作業は体に負担がかかり長時間は厳しいですが、荷物が軽くなるのは助かります。次回帰省するときは Pixel だけで過ごしてみるつもりです。