著者ブログ

スッキリスト秘話(外伝) dokojava & dokoC 編

こんにちは、無事なんとか10周年感謝祭も終わり、最近、久々の登壇が楽しいスッキリシリーズ著者の中山です。いよいよ本日、みなさまのおかげで、

スッキリわかるC言語入門 第2版』が発売になりました!!!21

この第2版、約3年半ぶりの改訂になるわけですが、その製作秘話については10周年記念感謝祭の以下の著者ブログ記事にも記載させていただきました。

スッキリスト秘話(8) 岬悠馬&赤城ゆり 編

こんにちは。スッキリシリーズ著者 兼 監修人の中山です。 10月1日からはじまっております「スッキリわかる入門シリーズ10周年記念祭」。前回は、五右衛門さんやキッドさん、レオタード姿の三姉妹22、ホッ ...

ただ、上記の記事ではあえて触れなかった、大きな改訂ポイントがあるんです...。それが、この第2版の発売とともに提供開始となる、
クラウドC言語開発環境 dokoC です。

ということで、記念祭は終わったけどやっちゃいます今回の「スッキリスト秘話(外伝)」は、人じゃないし擬人化もされてないけど、10年前に生まれたこのシステムたちで参ります!

dokojava
dokoC

(※dokoQLさんは、内部機構が大幅に違うため、本日はおやすみです。)

百聞は一QRにしかず

え? クラウド開発環境ってなに...? という方は、百聞は一見にしかず。お手持ちのスマートフォンのカメラで、こちらの『スッキリわかるC言語入門』の紙面掲載コード3-14の右上隅のQRコードをうつして、リンクをタップしてみてください。

すると、紙面のコードが取り込まれた「dokoC」というアプリの画面になります。画面右下の「>>」という丸いボタンを押すと、コンパイルといわれる変換処理が行われ、さらに右下の「再生マーク」ボタンを押すとプログラムが実行され結果を確認できます。なお、結果画面の「<>」ボタンを押すと、またもとのソースコード画面に戻ります。28

・・・はいっ! これであなたもC言語プログラマの仲間入り!!

「C言語使ったことある?」って聞かれたら、 「お、おぅ...まぁ、Linux上に構築したDocker開発環境上のGCC 11.1系で、簡単なプログラム動かしたぐらいだけどね。」とかいっておけば、なんかすごいエンジニアっぽい感じを醸し出せる!かも!!

そして、それはあながち嘘じゃないんです。このdokoC、本物のGCCが本物のLinuxサーバー上で、あなたの送ったソースコードをコンパイルして動かしていますから。

「入門学習」特化のこだわり

実はこの「クラウド上でコンパイルしたり実行したりする開発環境」、今から10年前の2011年、『スッキリわかるJava入門』が発売されたときに同時公開されたJava用の開発環境 dokojava の流れを汲んでいます。


2011年当時のdokojava(v1)

今でこそ、ブラウザ内でコードを動かす仕組みも増えてきましたが、10年前当時、開発環境といえばローカルPCに導入するのが当たり前だったので、実験や趣味レベルではなく(公開後は何年もひっこみつかない)書籍のような形で世にでた国内のクラウドIDEは、dokojavaが最初だったんじゃないかと思います。それでもどうしても実現したかった背景に、中山の悲しい過去があることは、10年前当時の恥ずかしいブログ記事にでてますが青島刑事がでてきて自分でもびっくりです。

JDK導入不要の開発環境『Dokojava』 本当の狙い

2019/11/14補記 当記事に登場するdokojavaは、2019年11月の「スッキリわかるJava入門 第3版」発売にあわせ全面改訂され、dokojava v2 となりました。 概要は、スッキリ ...

ただ、このdokojava...(他に類似サービスが当時なかったことからも容易に想像がつくように)かなりの難産でした。それは、自ら「リアルタイム非同期実行方式」というHARD_MODEへの道を選んでしまったから...なのですが...。

リアルタイム

dokojava当時から、本日発表のdokoCに至るまでこだわっているのが、「ユーザーのキー入力待ち(C言語でいうscanfなど)の命令が含まれるプログラムが、ちゃんと途中でキー入力待ちをしながら動く」ということを実現するという点です。たとえば、以下のプログラムを動かしてみて頂くと体験できます。またQRから辿っても結構ですし、試しにPCからアクセスしてみるという方は、こちらのリンクからどうぞ(IEでは動きません)。

このコード、コンパイルして実行すると、名前と年齢を聞かれますので、画面の下部の入力欄に入力します。ただのサンプルアプリなので、もちろん、真面目に答えなくて大丈夫です34です。

「え? なにこれ、あたりまえじゃない?」って思われるかも知れないんですが、ユーザーキー入力待ちがあるプログラムをちゃんと動かす仕組みを「クラウドで実現しようとすると、実はかなり大変」なんです。マニアックな技術的仔細をすっとばして表現すると、「プログラムが入力待ちしている間もずっとサーバーを動かし続けないといけないので、真面目にやるとお金がかかって大変なことになっちゃう...」っていう感じでしょうか。

最近では「ブラウザ上でコードを動かせる」という仕組みも増えてきましたが、その多くがプログラム実行時に「プログラム動作中にリアルタイムでユーザーのキー入力待ちをしない(その代わりに、プログラム起動時にキー入力情報も一緒に与えてしまう)」という仕組みになっているのは、そういう大人の事情があるんですが...。

dokojavaやdokoCは、「入門学習」で使われる道具。だから、「コンピュータと自由に対話する」という楽しい体験をなるべくできる環境でありたいなって思ってたんです。本格的なコードは動かせないんだけど、せめて「コンピュータの出力を見て、その場で人間が入力を変えていける...」まぁその典型がゲームなわけですが、そういうものも作れる環境だったら、楽しいだろうなって...35
たとえばこういうコードを作って楽しめるのも、リアルタイム非同期実行方式ならではです。

そのほか、「本来の手元PCで開発するときの形により近く、自然な形で学習ができたほうが、学校教育などには向いている」ということもあり、やめときゃいいのに「リアルタイム非同期実行方式」にこだわってます36

それでもdokoCだけは作れなかった...

...みたいなことを言いますと、時々不思議に思われて次のようなことを尋ねられることがあるんです。

「dokojavaが2011年に作れたんだから、2018年にはdokoCだって簡単に作れたでしょう?
なんでスッキリわかるC言語入門(2018発刊)には、dokoCがついてこなかったの?」

まぁ、『スッキリわかるC言語入門』は、こちらの記事にあるように製作に6年もかかっているため、「本を書くだけで力尽きた」っていうのも嘘じゃないし、恥ずかしながら、dokojavaみたいな「動くほど大赤字なシステム」を運用するのってなかなか厳しいっていう事情もあったのですが...。

それでも確かに、2018年の『スッキリわかるC言語入門』発売時、dokoCを提供することは夢でした。一方で、「手を出してはならない夢だ」ということも、よくわかっていました。

見ての通り、dokojavaやdokoCは、「ユーザーが入力してくるいろんなコードを、実行するサービス」です。

さらっと書きましたが、これ、ちょっとIT系でお仕事している人であれば気づくように、一歩間違えると「犯罪兵器」以外のなにものでもありません。このブログをお読みの方も、時々ネットニュースなどで「iOSで遠隔マシンから任意コード実行可能な脆弱性が見つかった」などという記事を見かけたことがある方もいると思います。つい先日12月10日にも、Javaで広く使われているLog4J2というライブラリにセキュリティホールがみつかり、「このライブラリを使っている世界中のWebサービス(iCloudやらマイクラやら)が片っ端から攻撃受けたりで、全Javaエンジニアが絶望と驚愕の淵に立たされる」という事件もおきましたが、これらの例も含め、リモートから送った任意のコードを実行できる(RCE: Remote Code Execution)環境っていうもの自体、360度どこからどうみてもセキュリティホールそのものなわけです。

事実、dokojavaサーバーにも、毎日おびただしい量の「このJavaプログラム動かしたら、サーバー壊せるんじゃね?」とか「これ動いたら、乗っ取れるんじゃね?」とか「こいつ踏み台にして他のサーバーにパケットおくりつけてやろう」とか試そうとするコードが送られてきています37

そんなdokojavaが、2011年の時点で公表できて、その後もかろうじて「兵器」にならずにすんでいるのは、悪用を防ぐ仕組み(セキュリティサンドボックス)がJava仮想マシン自体に20年以上前から備わっていて、それを使うことができたからなんです。



一方その頃、おれたちのC言語は——

OS上で直接動くし、なんでもやり放題だぜOhYeah!

...まぁ、「任意のCコードを動かせるサービス」なんて、聞いただけで犯罪の臭いしかしませんし、当然「兵器転用される未来」しかみえません。だから、2018年当時、dokoCは作りたくても作れなかったんです...38

そして2021年、時は満ちた...

「dokoCができたら、素敵だろうな...」とはずっと思っていました。いや、ここ数年Javaのローカルセットアップはかなり楽になってきていて、むしろCのほうがえげつない39ことを考えると、dokojavaよりdokoCの方が、よほど必要なのではないかと思うほどです。

特にこのコロナ禍、研修講師の方や先生方が「相手ごとに違うPC環境で、セットアップがらみで地獄の苦しみ」を味わいながら奮闘されている姿を真横で見ていました。私自身、Java研修で端末トラブル発生時などにはdokojavaにものすごく助けられていたりします(最近、最初のHelloWorldは、eclipseではなくdokojavaでやってもらうことのほうが多いかもしれません。理屈はいいから、最初の「うごいた!」を体験すること、これ何より大事だと私おもうんです)。自宅に帰って復習したい、という想いがある人にも、あれこれ自宅PC用のセットアップの案内などもしなくていいし...。

幸いここ数年、コンテナ技術がそこそこ進化してルートレスコンテナ等の隔離機能も充実し、運用コストも落ちてきました。また、CKA/CKADやらk8s認定トレーナーやらの有資格者がフレアリンクのメンバーに加わり直接アドバイスやレビューを受けられる体制になったり、セキュリティ含めたオートテストの技術が発展したこともあって、2021年、ようやくチャレンジできる勇気を持てた...という次第です。

ただ、それでも、やはりdokoシリーズの中で最高難度のサービスであることには違いありません。
ぼんやりネットに公開・稼動してたら、いつ「最終兵器dokoC40」になってもおかしくない...そのことを肝に銘じての第一歩。兵器化しないよう(してもすぐ検知できるよう)、第一種戦闘配備のなか、いろんな謎のケーブルを体中につけられつつ、ネットという荒野に立つdokoCちゃんなのでありました41

dokojavaにはなくdokoCにだけある、「コードを編集するにはユーザー登録が必要」という制約も、正直「面倒くせぇな」って思われるとおもいますが、上記のようなやんごとなきセキュリティとの兼ね合いでやむを得ず...というものでして、安全なご利用のために、何卒ご理解をいただけますと幸いです。

dokoCは段階的に検証や改良を重ねながら、いずれはより広く自由に使って頂けるようにしていきたいと考えています。これからもスッキリわかるシリーズでは、書籍はもとより環境周りもふくめて、ひとりでも多くの学び手の方が「最初から挫折しない」「楽しいプログラミングに出会える」世界をお届けできたらと思いますので、ひきつづきどうぞよろしくお願いします!

  1. いつもより少し多めにさば読んでもOK
  2. リアルタイム方式といえば、FF4のリアルタイムバトル方式(ABT)。あれに出会ったあの日の感動はすごかった。「すげー。なにこれ、スレッドとかないだろうにどうやって実現してんの?CPU割り込みかな?まさか根性で手動タイムスライス?」とかわくわくしちゃったあの頃。
  3. 今はWebSocketなどという便利な技術があるからまだ楽なのですが、それでも企業や学校の中継サーバーの影響で通信が遮断されたり...っていうのを回避する機構を入れたり。10年前のdokojava開発時は、WebSocketがまともに動くブラウザがなかったためcometという懐かしの通信プロトコルを手でゴリゴリ書いて、愛と勇気と気合いと根性だけで動かしてたような気がします。
  4. dokojava宛てに限らず、世の中のWebサービスへの攻撃的なアクセスや攻撃試行アクセスは「不正アクセス禁止法」という法律で処罰されるので、興味本位や善意の検証であってもやっちゃダメです。特に仕事でITに関わる人は懲戒解雇される(または、その証拠を「脅迫」などのソーシャルエンジニアリングの材料に使われる)可能性もあるので、絶対にやらないようにしましょう!
  5. スッキリわかるC言語入門では開発環境用にVMやDockerコンテナも提供しているのですが、ローカルPCへの直接導入はご案内していません。もちろん可能ですし、巷のネット上に記事はあるのですが、C言語の「簡単に暴走するし、暴走したときになんでもできる破壊力」を知っている身としては、特にミスを犯しやすい入門時は隔離空間で動かしたいという想いがあって...(普通にWindowsやMacで開発する分には、今はプロセス分離もしっかりされてるのでsegfとかで落ちるぐらいで済むんでしょうけどね...古い人間なのでエヴァ零号機なみの「実行⇒暴走⇒研究設備ごと破壊」の悲劇を何度か体験しておりまして、やっぱ怖いんです。)
  6. VC入れれば早いけど組み込み系の方はGCCベースで学びたいだろうし、cygwinとかMSYS2とか相変わらず伏魔殿(文字コードがらみの落とし穴もある)だし、WSL2まだ使えないPCの人もいるし...うーん...
  7. 北海道を舞台に、背中に鋼の翼がはえたdokoCちゃんが敵も味方も殲滅する「C言語界で一番最後のラブストーリー」。
  8. 「ぱっ...パターン青です!」⇒中山、拳でガラスパネルたたき割り、その奥の赤いボタンを強打⇒「非常停止シーケンス開始します! LB封鎖! アプリケーションサーバー停止開始します! 停止完了まで約40秒...30秒...だ、ダメです! SIGTERM、SIGKILLともに受け付けません!」⇒中山「くっ......総員、クラウド外に退避しろ...」⇒「な、中山さんは?」⇒「俺はこのttyに残る...」てな万が一の可能性も考慮し、2022/1月末まで、dokoCは企業や学校での利用をご遠慮いただいております。

-著者ブログ
-