Progateの前田(@kzk_maeda)です。
本記事はProgateAdventCalendarの16日目の記事です。
初日にふざけ倒してハードル下げに下げた記事を公開したのですが、その後のメンバーがみんなしっかりした記事をあげてくれていたので、今日リベンジしたいと思います。
何を書こうかと考えたこと
弊社は初学者向けのプログラミング学習サービスを展開しているのですが、その折もあって、初学者の方が学習過程でどういったところで躓き易いのか、また、自分がまだ初学者だった頃は何を難しいと思っていたか、など考えることがよくあります。
その中で一つ思いつくのが、「ターミナル操作が怖い」という点かなと思います。
あの黒い、文字しか表示されない謎のウィンドウでカタカタ操作することが、何か間違えたら取り返しのつかないことになるんじゃないかという恐怖心を駆り立てて、なかなか慣れない方も多いのではないでしょうか。
実際にターミナル操作(というか黒い画面の操作)が怖いという声に答えてLINE風のコマンドプロンプトを作って公開する猛者も今年現れていました。
「コマンドプロンプトは黒い画面に文字がたくさん出て怖い」
— 武器のブの字の武内です♨Webひとすじ20年/サッカー好きが多い会社のサッカーを知らない社長 (@4126takeuchi) 2020年10月11日
と言う人がいたのだけれど、こんな画面になったら、パソコンに不慣れな人でも少しは抵抗なくなるでしょうか。 pic.twitter.com/cftcT7UksQ
これを見て、「じゃあもはや実際のLINEアプリからターミナル操作できるようにすればいいんじゃない?初学者の人、これでターミナル操作の学習ハードル下がるんじゃない?」と思いました。
なので作ってみました。
出来上がったもの
完成品がこちらです。
LINE Official Accountから該当アカウントの友達になると、リッチメニューが表示され、そこから「Terminal」を選択すると、サーバ選択のカルーセルが返却されます。
そこから接続したいサーバをタップすると、その後は対象サーバに対してターミナル操作ができるようになります。
どうやって実装したか
構成概要は下記です。
実装自体はかなりシンプルで、LINE Messaging APIを受け取るGatewayとなるコンテナと、裏でGatewayからSSHで接続できるサーバ群(コンテナ群)を用意し、APIで受け取った命令をサーバにSSHで流して結果をMessaging APIのReplyとして返しているだけです。
今回Gatewayから裏のコンテナへのSSH Command実行にPythonライブラリのparamikoを使用したのですが、そもそもLINE Messaging API自体が状態を持たないステートレスなHTTPのリクエストを投げるのみで、コンテナとのSSHセッションを張りっぱなしにするということが困難なため、擬似的なセッションストア(今どのディレクトリにいて、どのOSユーザになっているのかなどの情報を保持)層としてDynamoDB Localも横に立てました。
DynamoDBは上記の構成をそのままFargateなど活用してAWSにデプロイすることを見越して選択したのですが、結局デプロイはしませんでした。なぜなら思っていたより遥かに使いづらかったのでいらないかなと思って(後述)。
また、LINE Messaging APIからローカルのGatewayコンテナにHTTPリクエストをつなぐためにngrokというサービスを利用しました。
その他、雑に書いたコードは下記に置いておりますので興味があれば見てみてください。
LINE Official Account開設してdocker-compose起動してDynamoDB設定周りをREADME通りにやったら手元でも再現できると思います。多分。
やってみた感想
今回のモチベーションは「じゃあもはや実際のLINEアプリからターミナル操作できるようにすればいいんじゃない?初学者の人、これでターミナル操作の学習ハードル下がるんじゃない?」と着想したところから始まりました。
そして、実際にスマホのLINEからターミナル操作ができる簡易的な仕組みを作って検証してみました。
そして気づいたのは、めちゃくちゃ使いづらいということでした(当然だ)。
まず、圧倒的に遅い。そしてLINE Messaging APIでできることに限定されるので自由度がめちゃくちゃ低く、体験上ターミナル操作をしているような感覚にはなりません。
また、本当にターミナル操作を学習するなら、コマンドを実行して標準出力結果を返すだけではなく、シグナルや対話処理やページャーや標準出力が更新される処理(topとかtail -fとか)など、他にも考えないといけない実装が大量にありますが、LINEでそれを全て実現するのは不可能に思えます(できる方法があれば知りたいです、教えてください。LIFF使えばなんとか?)。
ではどうすればいいか
大人しくターミナル操作に慣れましょう。
なんと、幸いにも弊社のサービスでブラウザ上でターミナル操作を体験できるコースがあります。
Command Line | プログラミングの入門なら基礎から学べるProgate[プロゲート]
これだと、ユーザーごとに個別の環境を用意して、ブラウザからちゃんとターミナル操作を体験できるようになっているので、安心して黒い画面に慣れていってもらうことができるかなと思います。
また、11月には学習ロードマップサービスも公開しており、その中にもターミナル操作について解説したコンテンツがありますので、こちらもご参照ください。
さいごに
IT、Web技術、プログラミングについてちゃんと学習しようと思うと、学ばないといけないこと、覚えないといけないことが多岐にわたり、何から手をつけるべきか、どうやって学習していけばいいのか迷うことが多くあるかと思います。
せっかく何かをきっかけに学習しようと奮い立ったのに、多すぎる情報量の壁にぶつかって挫折してしまう人がたくさんいるのは非常にもったいないと思っています。
弊社の学習サービスやロードマップコンテンツなどを活用して情報の海から抜け出し、着実に学習と成功体験を積み上げていって、気付いたら自力で作りたいものが作れる人ようになった、みたいな人が一人でも増えるよう、プロダクト開発に心血を注いでいきたいと思います。
また、そう言ったプログラミング学習サービスの開発・運営に興味のある方、グローバルに展開するサービスに携わりたい方など、積極的に募集中です!
ご興味ありましたら採用ページか、僕のTwitter DMなどからご連絡いただければと思います!
採用情報 | プログラミングの入門なら基礎から学べるProgate[プロゲート]
kzk@エンジニャー (@kzk_maeda) | Twitter
明日はi18n(国際化)チームマネージャーのKaiくんがラズパイ使った個人開発系の話を書いてくれます!お楽しみに!