HPCメモ

HPC(High Performance Computing)に関連したりしなかったりすることのメモ書き

cloud9の環境をVS onlineのself-hosted environmentとして使ってみる(その1)

ちょっと前にこちらの記事で試したとおり、現在iPadからcloud9を使うことはできません。

hpcmemo.hatenablog.com

そのうちAWSappleが解決してくれるかもしれませんが、現状でもiPadから使うことができるVS onlineを試してみることにしました。 アカウントのセットアップとかは、こちらの公式ドキュメントの通りにやれば数ステップで簡単にできます。*1

docs.microsoft.com

この手順だと、Azureのインスタンスを立ちあげてそこにブラウザからアクセスする形で使うわけですが、このアクセス先のインスタンスを普段cloud9で使っているAWSインスタンスにしてしまおうというのが今回の記事の目的です。

VS codeのインストール

cloud9でも同じように既存のインスタンスにアクセスすることができますが、その時のアクセス先インスタンス

  • sshでアクセスできること
  • python2.7がインストールされていること
  • node.js 0.6.16以降がインストールされていること

という条件になってました。一方、VS onlineの場合はVS codeを導入してVS online用のextensionをセットアップする必要があるようです。

docs.microsoft.com

といっても、パッケージ化されてるのでコマンドラインからこんな感じで楽々とインストールできます。

code.visualstudio.com

$ sudo snap install --classic code
code 78a4c914 from Visual Studio Code (vscode✓) installed

X サーバのインストール

さっそくVS codeを起動・・・と言いたいのですが、VS codeをインストールしたマシンはディスプレイもなければキーボードやマウスも繋がってません(たぶん)。手元で使っているPC(以下、ローカルPC)からリモートマシンのVS codeを操作するために、ローカルPCにXサーバをインストールしてX11転送が使えるようにします。

Xサーバのソフトはmacの場合は、XQuartzを、windowsならVcXsrvあたりをインストールしてください。

www.xquartz.org sourceforge.net

インストールが完了したら、xlogoとかを起動してみて、正常にXサーバがインストールできていることを確認しましょう。

f:id:n_so5:20200318210418p:plain f:id:n_so5:20200318210427p:plain

ssh接続の設定&X11 転送の確認

続いて、AWSのwebコンソールでインスタンスに対してssh接続ができるように設定します。

EC2コンソールの左ペインから、"セキュリティーグループ"を選んでcloud9で使われているセキュリティグループを選んでください。

f:id:n_so5:20200318154757p:plain

Edit inbound rulesボタンを押すとずらーっとルールが書かれた画面に遷移するのでMy IPからのssh接続を許可します。

f:id:n_so5:20200318155638p:plain

あとは手元のPCの公開鍵を、cloud9のterminalから~/.authorized_keysに追記すればsshでアクセスできるようになります。

ターミナルを開いて-Yオプションをつけてcloud9用のインスタンスsshでログインし、xeyesを起動します。*2

> ssh -Y ubuntu@cloud9のマシンのIPアドレス
$ xeyes

無事にかわいい目玉が画面に表示されたら、Xまわりの作業は終了です。*3

f:id:n_so5:20200318211715p:plain

これでようやく、インストールしたVS codeを起動することができます。

VS online用extensionのインストール

続けて同じコンソールで

$ code

と入力してしばらく待つとそのうちVS codeの画面が手元のPCで表示されます。

f:id:n_so5:20200318170939p:plain

次はこちらの手順に沿って、VS onlineで設定をしていきます。

docs.microsoft.com

まずサイドバーのextensionボタンを押して 'Visual Studio Online' を検索し、表示されたextensionをインストールします。 最初、検索ウィンドウに 'VS online' って入力して該当するextensionが出てこなかったもんで、小一時間悩んでましたが手順を良く読むと確かに、

search for 'Visual Studio Online'

書かれてますorz

f:id:n_so5:20200318171541p:plain

インストールしたら、まずはAzureにログインしろ話はそれからだ(意訳)って言われるので、Singinボタンを押してみます。

f:id:n_so5:20200318171814p:plain

Xの別窓が立ち上がるんですが、私の環境の場合途中で止まってしまって、10秒も待っても返事が無いけど別の方法でサインインするけ?と聞かれてました。

f:id:n_so5:20200318172424p:plain

再実行すれば行けそうな気もするけど、そもそもこの状態から再実行するボタンが無いのでとりあえず "Use Device Code" ボタンを押してみます。するとここへアクセスしてコードを入力しろというような表示とともに、9文字のアルファベットとか数字とかの文字列が表示されます。

microsoft.com

駄目元で手元のPCのブラウザでこのURLにアクセスして、表示された文字列を入力&MSアカウントでサインインしてみたのですが、やっぱりAzure accountにsign inしてねっていう通知が出てきます。

f:id:n_so5:20200318205217p:plain

ここでsign inボタンをクリックすると、google chromeがXで立ち上がろうとするのですがしばらく待ってもこんな画面のままでchromeのUIすら表示されません。

f:id:n_so5:20200318205228p:plain

単に時間がかかっているだけかと思ってたのですが、google chromeがデフォルトでhardware accelarationを有効にしているせいで転送先のXサーバ(要は手元のPCにインストールされているXQuartz)で描画できないのが原因じゃないかとのことです。

askubuntu.com

firefoxなら大丈夫説が書かれてたので、google-chromeをアンインストールしてfirefoxを入れてみます。

> sudo apt-get remove google-chrome
> sudo apt-get install firefox

続けて、firefoxを起動して設定メニューからデフォルトブラウザに設定します。 これが f:id:n_so5:20200318223758p:plain こうなればOK f:id:n_so5:20200318223813p:plain

その後、VS Codeの画面に戻って、remote explorerサイドバーからVS ONLINEの項目の下にある"Sign in to view environments"をクリックします。

f:id:n_so5:20200318224732p:plain

firefoxが立ち上がって1分くらい待っているとMSアカウントの認証画面が表示されるのでログインします。

f:id:n_so5:20200318225640p:plain

認証まではうまく行くんですが、残念ながらVS codeに帰ることができません・・・orz

f:id:n_so5:20200318225707p:plain

その後、色々とぐぐっていたところこちらのQiita記事に解決方法が書かれてました。

qiita.com

VNCで接続しているかX11で接続しているかの違いはありますが、たぶん同じ原因だろうということで同じ手順を試してみました。

開発者ツールのnetworkタブを開いた状態で同じように認証すると、さきほどの"The address wasn't understood"と書かれた画面に遷移したところで、302が返ってきているのが見えます。response headerの中のlocationにvscode://・・・というめっちゃ長いURLが見えるのでこれをコピーして、terminalから次のコマンドを実行します。

> xdg-open 'vscode://ms-vsonline.vsonline/signin?code=(以下省略)'

その後、VS Codeの画面を見るとextensionがこのURIを開くのを許可しますか?というダイアログが表示されるので、Openをクリックすれば認証は完了です。

f:id:n_so5:20200319000007p:plain

この後、ドキュメントによると VS Online: Register Local Environment というコマンドを実行するようにと言われているんですが、コマンドパレットから実行しても何も反応しませんでしたorz そもそも register とか入れてみても候補に出ない状態です。

さてどうしたもんかな〜

*1:実は、以前iPadからセットアップした時にはsafariからアクセスしたらログインしても何も表示されないという現象があって1、2時間はまってたんですが、ブラウザを変えたりMSアカウントを切り替えたりしているうちになんか解決してしまいました。この顛末を記事としてシェアした方が役に立ちそうなんですが、ろくに記録もとらずに試行錯誤してたら使えるようになってたので、結局原因不明のままです :p

*2:たぶん何かパッケージを追加でインストールしないと駄目だと思いますが、この辺の設定をしたのはずいぶん昔なので記憶があやふやです・・・orz

*3:Xquartzの場合はインストール後に一回ログアウトか再起動をしないと駄目だったかもしれません。VcXsrvの人は・・・頑張って:p

15年ぶりにキーボードを買いました。

昨年末あたりから、3DプリントでUSB2BTplusをHHKBにくっつけるための台座をがんばって作ってたんですが、2回の試作(失敗作ともいう)を経てようやく使えそうなものができあがりました。

あとは、微妙に穴のサイズが違うのを削って、USBコネクタのハンダづけをやり直せばOKだったんですが、そんなタイミングでこんな記事を見つけてしまいました。

k-tai.watch.impress.co.jp

しかも、発売日はどうやら私が慣れないCADソフトをいじりまわし始めた時期だったようで・・・orz

というわけで、失意のあまりこのまま完成は諦めてHHKB hybridを買うことにしました。 15年ぶり三台目のHHKBですw

三代目の選定にあたっては、色々とと悩むところがありました。 これまで、2代目HHKB(PS/2, ADB, SUNコネクタ対応のメンブレンやつ)、HHKBPro(墨)と使ってきて、

  • 白地に黒のキートップは見た目が煩い
  • 墨の印刷見えん

というのを常々思ってたので、白の無刻印で英語配列というところまではすぐに決まりました。あと、複数台の機器に接続するのが目的なのでBT版ってとこも。 しかし、type Sにするか、Proにするかはかなり悩みました。

特に静音とか気にしないタイプの人間なんですが、type Sだとストロークが0.2mm浅くなります。 実はメンブレン版からProに乗り換えたとき、なんかタイプした時に底まで遠いなぁと思ってたんですが、いまさらながら仕様を見てみたらこの時0.2mm長くなってたようです。

https://www.pfu.fujitsu.com/hhkeyboard/eol.html

押下圧も50gから45gに軽くなってたし、微妙にキートップのカーブも変わってたので、その辺の影響かと思ってましたが、どうやら15年前に私が感じた違和感はストロークが長くなってたのが原因だったっぽいです。そして、type Sだとなんと押下圧は45gのままで、ストロークは3.8mmに戻ってます!

スペック的にはtype Sの方が好みのものっぽいけどどうしようかなぁと思って、その後も比較しているレビュー記事を読みあさりながら迷ってたんですが、こちらの記事で公開されてた比較動画を見て type Sに決めました。

blog.skeg.jp

到着して数日使ってみたんですが予想以上に快適です。 Proと比較するとやはりtype Sのちょっと浅目のキーストロークメンブレン時代のHHKBっぽい感触で、私みたいにProに乗り換えた時になんか遠くまで押さないと駄目になったなぁという感想を持った方はさっさとtype Sに乗り換えるのをお勧めします。*1

しかし、ひとつだけ大きなデメリットがありました。





ペ ア リ ン グ 激 ム ズ







これば無刻印モデルのというか私の問題ですが、数字が連続してるとタッチタイプできないタチでして、BTのペアリング時のパスコードを入れるのにめっちゃ苦労しましたorz

まだやってないけどたぶん銀行のワンタイムパスワードを入れるのとかも苦戦しそうな気がしてますw

*1:歴戦の強者はとっくの昔に乗り換えてるかもしれませんがw

iPadからcloud9へアクセスできるようにしたかった・・・

うちのメインの開発環境はcloud9なんですが、YubiKeyを使ったMFA認証を必須にしたところiPadから使えないという残念な状態になってました。 iPadOSでマウスがサポートされたのを期に、iPadからのアクセス専用ユーザを作って環境を共有してみました。 残念ながら別の理由で(今のところは)使えないようですが、そのうちAWSappleかどっちかが解決してくれるのに期待しつつ手順を公開しときます。

参考資料 AWS Cloud9 の共有環境を使用する - AWS Cloud9

新規のIAMユーザを追加

IAMのマネジメントコンソールへ移動して新規ユーザを作成します。 f:id:n_so5:20191009132855p:plain

元のユーザが属していたCloud9Administratorの権限を持つグループに入れます。 f:id:n_so5:20191009132844p:plain

新しく作成したユーザでログインして実際にcloud9のマネジメントコンソールにアクセスできるか確認できたらここでの作業は完了です。

既存のcloud9環境を作成したユーザと共有

既存のユーザでcloud9のIDEにアクセスして、右上にあるshareボタンを押します。 f:id:n_so5:20191012234104p:plain

設定してるテーマとの相性が悪くて、もの凄く見難いですが"invite members"と書かれた欄に先程作成したIAMユーザの名前を(iPad)を入れてInviteを押します。 するとと認証情報に関する警告が出ますが、そのままスルーすれば作業完了です。

f:id:n_so5:20191012234113p:plain

なお、Inviteの横にある"RW"はinviteするユーザに、この環境に対するread/writeアクセスを認めるという意味です。 これまた分かり難いですが、この部分がスライドスイッチになっていてクリックすると "R" つまりread onlyアクセスに変えることができます。*1

iPadからアクセス

これでiPadからcloud9の既存環境にアクセスできるようになりました。

が、残念ながら現在のiPadOS上で動くブラウザではtherd party cookieをサポートしていないため、IDEの画面には辿りつけません・・・orz 標準のsafariはもちろんのこと、google chrome, firefox, edgeと試してみましたが、全部同じ結果です。*2

f:id:n_so5:20191118135943p:plain

*1:RWがグレーアウトしてるように見えるので、RWの設定が無効になっているのかと思って必死にクリックしましたがな・・・

*2:opera? あーあれおいしいですよね

rsyncのinclude/excludeオプション

昔読んで、すごく分かりやすかったwebページがあったんですが、見あたらなくなってたので自分用のメモ

  • include/excludeオプションはファーストマッチ
  • --recursiveが指定された時(つまりほぼ常に)、include/excludeのマッチもrecursiveに行なわれるので、--exclude='*'を指定すると何も送られない
  • これを避けるためには、送りたいファイルのsrcディレクトリ直下に居る先祖ディレクトリ名を指定しておけば良い

参考資料

www.samba.org

最後の方の"FILTER RULES"と"INCLUDE/EXCLUDE PATTERN RULES"を読んでおけばだいたい事足りる(はず)

YubiKey

さて、cloud9にもだいぶ慣れてきたのですが、こう頻繁にAWSを使っているとMFA認証が煩わしくなってきました。

AWSのベストプラクティスとして推奨されているMFA認証ですが、スマホにインストールしたgoogle認証アプリを使っているものだから

  1. MFAでの認証画面が出る
  2. スマホを取り出す
  3. なんか通知が来てる
  4. twitter やらfacebookやらをつい見てしまう。
  5. ・・・あれ今何してたっけ?

という恐しい罠によくはまるんですよ・・・orz

AWS以外でMFAは使っていないので、以前はこの罠も月に1、2度くらいのものでしたが、さすがに1日1回はひっかかるようになってきたので こちらのハードウェアMFAデバイスを導入してみました。

aws.amazon.com

色々と並んでいますが、私が買ったのは左から2番目に表示されているyubico社製のYubiKeyという製品です。

AWSのページからはamazon.comの製品ページにリンクされていますが、リンク先にあるYubiKey4という製品は"Currently unavailable"となってました。 しかし、YubiKey自体は国内ではソフト技研さんが代理店として取り扱っているようで、amazon.co.jpでも普通に売ってました。

NFCが付いてたり、すごい小さいのがあったりと、色々バリエーション豊富なんですが、うちのスマホNFC非対応だし小さいと紛失する可能性が高くなるので*1旧バージョンらしきこちらの製品にしてみました。

AWSでの設定方法

こちらの公式ドキュメントに書いてある手順に従って進めていきます。

docs.aws.amazon.com

f:id:n_so5:20190401230922p:plain

一部和訳が進んだせいか、[My Security Credentials] が「マイセキュリティ資格情報」に進化してますが*2とりあえず進んでいって、一旦MFAの設定を削除すると、MFAデバイスをセットアップできるようになります。しかし、なんとサファリは非対応とのこと。

f:id:n_so5:20190401231423p:plain

Firefoxで同じページまで行くと、「U2F セキュリティキー」が選べるようになるのですが、今度はこの画面でYubiKeyをタップしても先に進めません。

トラブルシューティングのドキュメントへリンクが貼ってあったのでそちらを見てみると、firefoxは設定変更が必要な可能性が高いとのことでした。

docs.aws.amazon.com

こちらの設定変更を行なって、Firefoxを一度再起動すると、さきほどの画面でYubiKeyを挿した時点でキーのインジケータが点滅します。後はウィザードの指示どおりKeyをタップすると設定完了です。

この状態からgoogle chromeでマネジメントコンソールのページにアクセスすると、いつものユーザ名やパスワード入力画面の後で、こんな画面が表示されます。

f:id:n_so5:20190401233758p:plain

そして、ドヤ顔しながらKeyを軽く触わると、ログインできてマネジメントコンソールへ移ります。

しかし、safariで同じことをやろうとすると、

f:id:n_so5:20190401234836p:plain

うーむ残念。まぁこういう状況のようなので、そのうち使えるようになるでしょう。

applech2.com

それよりもモバイルブラウザが全滅なので、iPadからログインできなくなったのがちょっと痛いところです。

AWS consoleアプリを入れておけば、アクセスキー&シークレットアクセスキーでアクセスできるんですが、このアプリからではcloud9は使えないので私の用途には合いませんでしたorz

*1:たいして小さくもないRSA SecurIDのトークンでも1回紛失騒動を起こしたことがありまして・・・

*2:どうしてマイをつけちゃったんだw

モバイルディスプレイ用スタンド

去年導入したモバイルディスプレイに、こちらの記事で書いたように長ネジをネジ込んでスタンド代わりにしてました。

hpcmemo.hatenablog.com

最初は見た目のインパクトもあって楽しんでたものの、いかんせん後ろのデッドスペースが大きすぎますw

もともとVESAマウント用のネジ穴が本体に切られてるんだから、VESA規格のディスプレイスタンドに載せようかとも思ったんですが、 小さめのものでも数kgクラスのディスプレイ用に作られているものばかりのようで、11インチのサブディスプレイを載せるにはゴツすぎるものしか 見つけられませんでした。

カメラ用三脚なら小型のものもあるので

  • 120x120mmくらいのアルミかアクリル板を買う
  • VESA穴の位置に穴を開ける
  • 真ん中に適当に穴を開けて、三脚ネジのメスを埋め込む

といった工作を考えてたんですが、材料をアマゾンで物色してたらちょうど良い製品がありました。

記事作成中に確認しようと思って見に行ったら消えてましたが、私が買った時は商品説明に横幅115mmって書かれてたので、両端の溝同士で多少斜めにすればVESAマウンタの横幅(100mm)にはまるかなーと期待して買ってみました。

で、装着してみたらこの通りちょうど両端の穴同士で100mmだったようです。

f:id:n_so5:20190403115128j:plain

手元にあった卓上三脚に小型の自由雲台を追加して載せるとこんな感じです。 上からのアングルなので分かり難いかもしれませんが、机の上におくと自然な姿勢でちょっと見降ろした時に良い位置に来て使い勝手が良くなりました。

f:id:n_so5:20190403115504j:plain

AWS cloud9 メモ

これまで、自宅兼オフィスではMac mini、外出先はASUSのtransbook(surfaceっぽいwindows tablet)と2環境を使い分けてきました。

しかし、この構成だと外出先で電源とwifiを確保して、さー仕事するぞーと意気込んで git pull したのに mac側で作業した後で push してなくて何もできないという悲しい事態が稀によく起きます・・・orz

こういうミスが嫌だったので、一昔前はデスクトップマシンは使わず全ての作業をノートPCでやってたんですが、 最近はiPadやらラズパイやらと使う端末が増えることはあっても1台にまとめるのは到底無理な感じです。

というわけで、複数端末間の開発環境の統一のためにAWS Cloud9を導入してみました。

aws.amazon.com

網羅的な解説資料は既に色々なところにあるので、私が調べたり試したものをいくつかトピック毎にまとめておきます。

セットアップ方法

EC2を使う環境の場合は、ドキュメントの通りに作業すればほとんどひっかかるところは無いと思います(そもそも選択するオプションがほとんど無い)

唯一気をつけておく必要があるのは最初に入力する "Name" で、これがIDE起動後に表示されるファイルツリーのrootの名前になるのであまり長い名前をつけてると見難くなりますw f:id:n_so5:20190401140358p:plain

何が使えるのか?

こちらにインストール済のパッケージの一覧があります。

docs.aws.amazon.com

  • Amazon Linux AMI ウェブサイトの「Amazon Linux AMI 2018.03 パッケージ」にリストされているパッケージ。

なんて書かれてますが、こちらのパッケージリストには、

  • gcc-4.8.5
  • gcc44-4.4.6
  • gcc48-4.8.5
  • gcc64-6.4.1
  • gcc72-7.2.1

と色々書かれてて、イマイチよくわかりません。とりあえずログインして、調べてみましょう。

[ec2-user@ip-10-0-0-248 environment]$ gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

[ec2-user@ip-10-0-0-248 environment]$ which gcc
/usr/bin/gcc
[ec2-user@ip-10-0-0-248 environment]$ ls -l `which gcc`
lrwxrwxrwx 1 root root 21 Feb 18 10:29 /usr/bin/gcc -> /etc/alternatives/gcc

おお、alternativesだ・・・どうやって使うんだっけ。*1

ぐぐりながら調べてみたところ、どうやらgccは4.8.5しか入っていないようです。

[ec2-user@ip-10-0-0-248 environment]$ alternatives --display gcc
gcc - status is auto.
 link currently points to /usr/bin/gcc48
/usr/bin/gcc48 - priority 482
 slave cc: /usr/bin/gcc48
 slave c89: /usr/bin/gcc48-c89
 slave c99: /usr/bin/gcc48-c99
 slave gcov: /usr/bin/gcov48
 slave gcc.1: /usr/share/man/man1/gcc48.1.gz
 slave gcov.1: /usr/share/man/man1/gcov48.1.gz
Current `best' version is /usr/bin/gcc48.
[ec2-user@ip-10-0-0-248 environment]$ alternatives --config gcc

There is 1 program that provides 'gcc'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/bin/gcc48

Enter to keep the current selection[+], or type selection number: 
failed to create /var/lib/alternatives/gcc.new: Permission denied

しかも、よくみたらgfortranが入っていません。AWSの人はFortran死すべし派だったのか?

yum install一発で4.8.5がインストールされるので必要になったらインストールしましょうか。

[ec2-user@ip-10-0-0-248 environment]$ sudo yum install -y gcc-gfortran
Loaded plugins: priorities, update-motd, upgrade-helper
amzn-main                                                                                                                                          | 2.1 kB  00:00:00     
amzn-updates                                                                                                                                       | 2.5 kB  00:00:00     
epel/x86_64/metalink                                                                                                                               | 6.7 kB  00:00:00     
epel                                                                                                                                               | 4.7 kB  00:00:00     
1060 packages excluded due to repository priority protections
Resolving Dependencies
--> Running transaction check
---> Package gcc-gfortran.noarch 0:4.8.5-1.22.amzn1 will be installed
--> Processing Dependency: gcc48-gfortran >= 4.8.5 for package: gcc-gfortran-4.8.5-1.22.amzn1.noarch
--> Running transaction check
---> Package gcc48-gfortran.x86_64 0:4.8.5-28.142.amzn1 will be installed
--> Processing Dependency: libgfortran.so.3()(64bit) for package: gcc48-gfortran-4.8.5-28.142.amzn1.x86_64
--> Running transaction check
---> Package libgfortran.x86_64 0:6.4.1-1.45.amzn1 will be installed
amzn-main/latest/filelists_db                                                                                                                      | 5.7 MB  00:00:01     
amzn-updates/latest/filelists_db                                                                                                                   | 7.3 MB  00:00:00     
epel/x86_64/filelists_db                                                                                                                           | 7.9 MB  00:00:00     
--> Processing Dependency: libquadmath.so.0(QUADMATH_1.0)(64bit) for package: libgfortran-6.4.1-1.45.amzn1.x86_64
--> Processing Dependency: /usr/lib64/libquadmath.so.0.0.0 for package: libgfortran-6.4.1-1.45.amzn1.x86_64
--> Processing Dependency: libquadmath.so.0()(64bit) for package: libgfortran-6.4.1-1.45.amzn1.x86_64
--> Running transaction check
---> Package libquadmath.x86_64 0:6.4.1-1.45.amzn1 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==========================================================================================================================================================================
 Package                                   Arch                              Version                                        Repository                               Size
==========================================================================================================================================================================
Installing:
 gcc-gfortran                              noarch                            4.8.5-1.22.amzn1                               amzn-main                               3.8 k
Installing for dependencies:
 gcc48-gfortran                            x86_64                            4.8.5-28.142.amzn1                             amzn-updates                            8.0 M
 libgfortran                               x86_64                            6.4.1-1.45.amzn1                               amzn-main                               391 k
 libquadmath                               x86_64                            6.4.1-1.45.amzn1                               amzn-main                               197 k

Transaction Summary
==========================================================================================================================================================================
Install  1 Package (+3 Dependent packages)

Total download size: 8.5 M
Installed size: 20 M
Downloading packages:
(1/4): gcc-gfortran-4.8.5-1.22.amzn1.noarch.rpm                                                                                                    | 3.8 kB  00:00:00     
(2/4): libgfortran-6.4.1-1.45.amzn1.x86_64.rpm                                                                                                     | 391 kB  00:00:01     
(3/4): libquadmath-6.4.1-1.45.amzn1.x86_64.rpm                                                                                                     | 197 kB  00:00:00     
(4/4): gcc48-gfortran-4.8.5-28.142.amzn1.x86_64.rpm                                                                                                | 8.0 MB  00:00:02     
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                     3.3 MB/s | 8.5 MB  00:00:02     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : libquadmath-6.4.1-1.45.amzn1.x86_64                                                                                                                    1/4 
  Installing : libgfortran-6.4.1-1.45.amzn1.x86_64                                                                                                                    2/4 
  Installing : gcc48-gfortran-4.8.5-28.142.amzn1.x86_64                                                                                                               3/4 
  Installing : gcc-gfortran-4.8.5-1.22.amzn1.noarch                                                                                                                   4/4 
  Verifying  : gcc-gfortran-4.8.5-1.22.amzn1.noarch                                                                                                                   1/4 
  Verifying  : libgfortran-6.4.1-1.45.amzn1.x86_64                                                                                                                    2/4 
  Verifying  : gcc48-gfortran-4.8.5-28.142.amzn1.x86_64                                                                                                               3/4 
  Verifying  : libquadmath-6.4.1-1.45.amzn1.x86_64                                                                                                                    4/4 

Installed:
  gcc-gfortran.noarch 0:4.8.5-1.22.amzn1                                                                                                                                  

Dependency Installed:
  gcc48-gfortran.x86_64 0:4.8.5-28.142.amzn1                 libgfortran.x86_64 0:6.4.1-1.45.amzn1                 libquadmath.x86_64 0:6.4.1-1.45.amzn1                

Complete!
[ec2-user@ip-10-0-0-248 environment]$ gfortran --version
GNU Fortran (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28)
Copyright (C) 2015 Free Software Foundation, Inc.

GNU Fortran comes with NO WARRANTY, to the extent permitted by law.
You may redistribute copies of GNU Fortran
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING

しかし相変わらず、alternativeの方にはfortranは出力されない。

[ec2-user@ip-10-0-0-248 environment]$ alternatives --display gcc
gcc - status is auto.
 link currently points to /usr/bin/gcc48
/usr/bin/gcc48 - priority 482
 slave cc: /usr/bin/gcc48
 slave c89: /usr/bin/gcc48-c89
 slave c99: /usr/bin/gcc48-c99
 slave gcov: /usr/bin/gcov48
 slave gcc.1: /usr/share/man/man1/gcc48.1.gz
 slave gcov.1: /usr/share/man/man1/gcov48.1.gz
Current `best' version is /usr/bin/gcc48.
[ec2-user@ip-10-0-0-248 environment]$ alternatives --display gfortran
gfortran - status is auto.
 link currently points to /usr/bin/gfortran48
/usr/bin/gfortran48 - priority 482
 slave f95: /usr/bin/gfortran48
 slave gfortran.1: /usr/share/man/man1/gfortran48.1.gz
Current `best' version is /usr/bin/gfortran48.

これは、別バージョンのgccを入れた時にgccだけバージョンを変えて、gfortranを変え忘れるとはまるパターンですね・・・

nodeもv6.14.3とかいう挑戦的なバージョンですが、こっちはnvmが入っているのでltsの最新あたりまで上げときましょう。

[ec2-user@ip-10-0-0-248 WHEEL]$ nvm install lts/*
v10.15.3 is already installed.
Now using node v10.15.3 (npm v6.4.1)

で、この辺の初期化処理を自動化しようと思って色々と調べていたのですが、どうやらそういう仕組みは用意されていないようです。 こちらに初期化スクリプトというのがあって、これを使ってねってことかと思ったんですが、なぜかJavascriptです。

docs.aws.amazon.com

数時間ぐぐった結果こちらの記事で使われている例くらいしか見つけられなかったのですが、 これはひょっとするとcloud9独自の初期化処理用プラグイン的なものなんでしょうかね?

qiita.com

AWSのドキュメントによると

現時点では、IDE での初期化スクリプトへのコードの追加は実験的な機能であり、完全にはサポートされていません。初期化スクリプトにコードを追加するときは、ご自分の判断で行ってください。AWS Cloud9 には、この機能をいつでも変更する権利があります。

とのことなので、そのうちもっと分かりやすものが作られるのに期待しておきましょう。 *2

当面はパッケージの追加インストールくらいしかしないので、シェルスクリプトでも作ってgistあたりに置いておく運用が楽そうです。 *3

hibernate設定

環境作成時のウィザードで"Cost-saving setting"という内容で書かれているのですが、 inactive になってから、設定した時間が経過したらEC2のインスタンスを落としてくれるという設定があります。

ちょくちょくブラウザを開きっぱなしにして外出してしまう私としては、 大変ありがたい機能なんですが、どういう条件で inactive と判定してるのかよく分からなかったのでちょっと実験してみました。

実験方法

inactiveになって30分後にhibernateする設定(デフォルト設定)で、次の3パターンで放置し30分以上経過してから止まってたかどうかを確認します。 なお、ブラウザウィンドウは全て表示したままにしています。

  1. IDEを起動しているがterminal、ファイルともに開いていない状態
  2. IDEを起動してファイルを開いた状態
  3. IDEを起動してterminalを開きプロンプトが表示された状態
  4. IDEを起動してterminalを開き定期的に表示が更新されるコマンド(top)を実行した状態
  5. 何も起動せずに preview windowを押して8080ポートにアクセスしたままの状態
  6. immediate windowでwhile(true) console.log("hoge")しておいた場合

stopした時刻は、Cloud Trailには出てこないので(たぶんOS側でシャットダウンしてる)一晩放置してから、IDEのterminal経由で/var/log/messagesをチェックしてみました。

実験結果

全パターンシャットダウンされませんでした。

その後、ブラウザウィンドウを閉じて30分程度経過したところで、EC2コンソールをリロードしながら眺めていたらstopping->stopと遷移していったので、どうやらブラウザが開いてるとIDE上で何もしていなくてもactiveと判定されるようです。*4

というわけで、EC2側の実行状態には関係なくて、ブラウザとの接続が失われるとinactive状態と判定されるようです。

ここまで調べてから、ふとドキュメントを見ていたらしっかりとブラウザからの接続が全部無くなってからの時間ですよって書かれてました。 無駄にインスタンスを立ちあげてしまった・・・ orz

docs.aws.amazon.com

[Cost-saving setting (コスト削減のセットアップ)] で、environment の IDE に接続されているすべてのウェブブラウザインスタンスが閉じられてから、AWS Cloud9 で environment の Amazon EC2 インスタンスがシャットダウンされるまでの時間を選択します。または、デフォルトの選択のままにします。

PCをスリープにするか、ネットワーク接続が切れればinactiveとして扱ってもらえそうなので、たいていの場合は大丈夫そうですが、モバイルルータやテザリングでノートPCを使ってる人とかCellular版のiPadを使っている人は要注意ですね。

複数プロジェクト対応

1つのEnvironmentに複数のプロジェクト(というかgit repository)を配置することができますが、各種設定時に1つ注意が必要になります。

cloud9から立ち上げられたEC2インスタンスは$HOME直下に "environment"というディレクトリが作成されていて、ここがIDEのファイルブラウザ画面のrootになります。したがって、この下にディレクトリを掘ってgitリポジトリを複数作る(またはgit cloneしてくる)ことで複数プロジェクトを1つのEnvironmentに配置することができるのですが、ビルダーやランナー、あとコードフォーマッターなんかの起動時は、"$HOME/environment"がcurrentディレクトリになります。

code formatterにeslintを設定したのに動かなくって、AWS Developer Forumsで教えてもらいながら調べてたのですが、ローカルインストールされたコマンドを叩く場合は、次のように$fileの存在するディレクトリまで移動してからnpxを叩く必要があります。

cd `dirname $file`;npx eslint --fix `basename $file`

ビルダーやランナーの設定にnpmを使う場合も同様で、プロジェクトのディレクトリの下へ移動してからコマンドを実行する必要があります。 こちらは設定ファイルに "working_dir": "$file_path" という項目を追加しておけば、大丈夫です*5

ランナーの設定

デフォルトのランナーは大変お粗末な感じで、例えばC++ランナーだと次のような設定になっています。分割コンパイルはしない前提なのか、$fileをコンパイルして生成された実行ファイルを呼び出すだけのものです・・・

{
  "script": [
    "set -e",
    "if [ \"$debug\" == true ]; then ",
    "    g++ -ggdb3 -std=c++11 $file -o $file.o",
    "    chmod 755 \"$file.o\"",
    "    node $HOME/.c9/bin/c9gdbshim.js \"$file.o\" $args",
    "else",
    "    g++ -std=c++11 $file -o $file.o",
    "    chmod 755 $file.o",
    "    $file.o $args",
    "fi"
  ],
  "info": "Running $file",
  "debugger": "gdb",
  "$debugDefaultState": false,
  "selector": "^.*\\.(cpp|cc)$",
  "trackId": "Cplusplus"
}

プロジェクト全体でcmakeを使っているのであればcmake&&make&&make testみたいな感じで書き直しておきましょう。 あと、clean buildの設定も必要ですね。そもそもプロジェクト毎にcmakeを使うのかGNU auto toolsなのかはたまたmakefile直書きなのかと違うからこれに対応して・・・と考えると破綻しそうなので、私はこの設定を作り込むのは諦めました。

単にterminalを開いてビルドすれば良いだけなので・・・

起動中のインスタンスの確認

画面の右上にcloud9のアイコンがありますが、その隣のボタン(たぶんAWSのユーザ名の頭文字)をクリックするとドロップダウンリストが現れて、cloud9のダッシュボードと、EC2コンソールへのリンクが表示されます。また、cloud9のアイコンはdashboardへのリンクになっています。

f:id:n_so5:20190401141028p:plain

*1:スパコン関連はmodule使ってるとこが多いもんでこいつほとんど使ったこと無いんです

*2:そもそもドキュメントが不足してて何を書けば動くのやらさっぱり分かりませんorz

*3:私の場合はもとももドットファイルgithubで管理してたので、そこにシェルスクリプトを追加しました。

*4:1のケースだけ実験すれば十分だった・・・

*5:code formatterの設定では$fileは使えるけど$file_pathは使えないので一手間かけないといけないのです・・・