プログラミングを学ぶならJavaScriptがオススメ
2020年は小学生の授業の「論理的思考学習」の一環として、プログラミング教育が始まると言いますが、実際には教える側がITリテラシーがアレな日本で、実際にはプログラミングをやるわけではないという話も。海外ではプログラミングが実際に学校で教えられているのも珍しくなく、また、社会人でも今のままでは、近い将来自分の職が危ないということで学び始める人も増えてきているとか。
ただここで勘違いしてはならないのは、現代のプログラミングは「ガチのエンジニアとしてのプログラミング」と「現場で必要とされるプログラミング」の2つに大別され、前者は学校などに通っていてもまず身につかないでしょう(実戦が最大の訓練です)。後者は事務の現場や家庭などで自分の実現したいことを実現する手段としてのプログラミングになります。
今回、様々な理由でプログラミングを学びたい、学ばせたいと思ったのならばJavaScriptオススメですよというまとめになります(エンジニア視点で語る魅力やメリットではなく、個人で使う視点でプログラミングのまとめを行っています)。
目次
JavaScriptで出来る主なジャンル
- JavaScript - ブラウザ上で唯一動かせる言語(ウェブアプリケーションを作れる)
- Node.js - PHPやRuby, PythonやJavaのようにサーバアプリケーションを作ったりする為のサーバサイドJavaScript
- Electron - Node.jsを利用したデスクトップアプリをHTML5で構築する環境
- Cordova - Node.jsを利用したスマフォアプリをHTML5で構築する環境
- Alexa - Amazon EchoのスキルはNode.jsを利用すると作成が可能です。人工音声AIを作ってみよう。
- IoT - Raspberry PiやArduinoのセンサーデータをNode.jsを利用して取得したり命令を送れます
- Google Apps Script - JavaScriptベースのG Suiteで使えるVBA的な存在。業務自動化で大きく貢献します。
- TensorFlow - 今一番熱い機械学習をJavaScriptで構築
- puppeteer - Phantom.jsのようなスクレイピングをNode.jsで行えます。操作自動化ならばSeleniumがあります。
- Chromeの拡張機能 - JSとHTML, CSSで作成が可能です。
- Socket.io - Node.jsを利用してリアルタイム通信でチャットなどの通信アプリを構築可能
- Express - Node.jsを使って自前のWeb APIを作成可能
- Officeアドイン - 現在はMicrosoft OfficeのアドインもJavaScriptで作成が可能になっています。
- Excel操作 - Excel OnlineではVBAは使えませんが、JavaScriptでマクロが作れます。Online側もマクロが一部で利用可能に。
- Apple Script - Macの操作自動化で利用するAutomater。Apple Scriptで記述するものをJavaScriptでも記述が可能に(Yosemite以降)。
- UiPath - JavaScriptでRPA操作を実現することも可能
- RPGツクールMX - プラグインはJavaScriptで作成が可能になっています。
- Kintone - 小規模なウェブアプリ作成に活躍するKintone。プラグインはJavaScriptにて作成が可能です。
- Scratch - 子供向けプログラミング学習でも有名なブロック型のプログラミング環境。拡張するのにJavaScriptが利用できます。
- Minecraft - MakeCode for MineCraftで機能の拡張が可能になっています。
素のJavaScriptではクライアントサイドのUI作成や各種プラグインの作成、Node.jsを使ったものではサーバサイドやウェブアプリ、機械学習や操作自動化など高度な分野。また、同じくNode.jsを利用してRaspberry Piのようなハードウェアの操作(GPIOからの情報の入出力)やスマートフォンアプリの作成などなど。
1つの言語スタイルで多種多様な事に挑戦できるのがJavaScriptの魅力の一つと言えます。もちろん、Google Apps ScriptもJavaScriptベースですしHTML Serviceで利用する言語はJavaScriptそのものです。
目的別の詳細
このセクションでは前項の出来るジャンルのうち、もっともよく利用されているであろう項目について解説しています。
アプリの作成
スマートフォン用アプリ
JavaScriptでスマフォアプリ作成は意外と歴史が古く、PhoneGapというもので以前はつくられていました。ここ最近では、Apache Cordovaであったり、React Nativeであったり、ネイティブなモジュールを使うNative Script等と言ったものまで出てきています。
それぞれにはそれぞれの特徴がありますが、共通する点として
- JavaScriptでスマフォの各種ハードウェアの制御が可能(カメラやGPS、センサー類など)
- モジュールがネイティブモジュールを使うようになってきているので、速度面でも十分な力を出せるようになりつつある
- HTML5の技術でアプリを作れる。また、各種プラグインで機能の拡張が容易に出来るようになっている。
- iOSおよびAndroid用に同時リリースも可能になってきている。利用するUIの部品類はネイティブのOSの部品が使えるものもある。
- Node.jsを必要とするものの、Node.jsな環境でアプリを構築するわけではない。
- App StoreやGoogle Playへ向けてリリースする事も可能
- JavaやObjective-Cといった言語ではないので、学習コストが低く身につける事が可能
といった点。既に世の中、企業であってもスマートデバイスファーストになりつつある為、これらHTML5で作れるアプリを用意し脱Windowsを推し進める上では強い味方になると思います。なお、Cordovaの拡張機能はJavaで作成されていたりします。
デスクトップ用アプリ
JavaScriptを利用したデスクトップアプリケーションの作成は、主にElectronやNW.jsが使われています。両者の一番の大きな差は、Electronはウィンドウの無いアプリを作れますが、NW.jsは基本ウィンドウを必要とする点です。それ以外でもNW.jsはChrome APIが実行可能、nwjcでソースコードをコンパイル可能などの特徴があります。目的の応じて使い分けるのが良いと思います。
共通する点として、どちらも「Node.js」を必要とする点である事と、HTML5でデスクトップの操作やGUIを構築する事が可能である点。ローカル環境や様々な拡張機能はNode.jsが担当し、操作の要であるGUIをHTML側が担当します。どちらもJavaScriptで記述する事になります。
また、ウェブアプリケーションの流儀やライブラリが使えるのでウェブエンジニアでも、綺麗なローカルアプリケーションを作れてしまうのは非常に魅力がある(しかもマルチプラットフォームで展開ができるので、Windowsだけといった事がない)
但し、Node.jsを利用する点で躓く人が多いかも。Node.js特有のCallback地獄が待っています。これも最近はPromiseやasyncなどで同期処理が可能になって来ているのと、シングルタスクだから・・・というものも、一部分では既にマルチタスク・マルチスレッド化されてきている。
※Electronでは必ずしもNode.jsの追加モジュールがそのまま利用できるとは限りません。リコンパイルする必要があるモジュールもあります(KeytarやSQLite3など)
Chromeの拡張機能作成
ここ最近の様々なソリューションやアプリケーションは、機能を拡張する事が可能なものが非常に多くなっていて、それを実現する為の言語にJavaScriptを採用するケースが非常に増えているように思えます。以前は専用の言語らしきものであったり、C言語でAPI叩いてといったようなケースが多かったのですが、良い時代になったものです。
プラグインと言えば、Google Chromeの拡張機能。非常に便利なものが多いですが、これもJavaScriptで作成が可能です。Chromeブラウザに用意されている各種APIをJavaScriptから叩けるようになっています。それらを用いて現在表示してるウェブサイトのDOMを操作したり、情報を取得して別のサービスへと送って連携させたり。
社内だけで使ってるオンプレミスなサービスと直接人間による操作でセミオートマチックに連携出来る手段としては非常に面白い手段だと思います。デベロッパーモードにしておけば自作拡張機能は公開することなく使える為、HTML5 + manifest.json(package.jsonみたいなもの)だけで、手軽にチャレンジが可能です。
現在表示してる項目をCRMにAPI経由で打ち込んでみたり、サーバ側にロジックを用意せずに社内インフラに対してぶん投げてみたり、また場合によっては、自作ウェブアプリに拡張機能から機能を追加してみたりといった具合に、夢が広がります。
業務自動化
Node.jsは様々なモジュールを利用してローカル環境の自動化を行う事が可能です。Windowsのバッチファイルのように一連の作業を連続実行できますし、ローカルのファイルシステムにアクセス出来るので、人間が手作業でフォルダを作ってファイルを配置してといったことが自動化可能。それだけではなく、Puppeteerを使った自動化では、Chromeを自動操縦し、Seleniumよりもより確実により高度なコントロールが出来ます。
また、Node.jsでは難しいofficeの操作などは、VBSと連携して行わせる事も可能。モジュールを使えばExcelのファイルの読み書きも可能であるため、殆どの業務の自動化をローコストで実現できちゃいます。
個人的には、Raspberry Piとnode-cronを使って、定期的に自動でセンサーの値に基づいて植物に、自動で水を供給する装置を開発したい。node-cronがあれば、常駐してスケジュール実行が可能なので、夏も安心して旅行に行けるようにしてみたいものです。
サーバ構築
Node.jsは、PHPやPython、Javaのようにサーバーサイドのサービスを構築する事が本来の目的として生まれました。サーバサイドもJavaScriptで構築が可能であれば、クライアントサイドとの連携もしやすくスピーディに構築が出来るというのが主な利点になるかなと。ただ、現在ではノンブロッキングI/Oであるとか、シングルスレッドで高速処理といった点から、ゲームや多数の人間が接続するようなサービスの構築などでも活躍している言語です。
海外では非常にメジャーに使われている反面、日本国内ではPython同様にあまりメジャーじゃないという点がありますが、日本の場合PHPやJavaに傾倒してきた歴史がある為、Node.jsやPythonといったものに力を割いてこなかったのが原因かなと個人的には思う所。
Node.jsには様々なモジュールが用意されており、それを発展させてスマフォアプリやハードウェア制御などまで対応出来るようになって来ている点は、Pythonには無い、またPHPにもない特徴だと思います(カテゴリー的にはJavaに近いとも言える)。
Expressを利用したWeb APIの構築やバックエンドのデータベースとの仲介、ウェブアプリの作成、ウェブサーバーを構築して前述のようなウェブアプリケーションの運用、またそれを利用したRocket Chatのようなサーバアプリケーションに大きく貢献しています(NetflixやLinkedIn、Trello、freeeなどがこれでサービスを構築してるのは有名)。
また、Google Cloud Functionsのような自前で自社内にサーバをおかずに、Node.jsを使ったサーバをクラウドに構築も可能。AWSでもありますね。本当に良い時代になりました。オンプレをわざわざ設置して、要因手配や配置、人件費の削減が可能です。
ハードウェア制御
JavaScript自体はあくまでもウェブブラウザ上で動く言語です。其のため、通常はローカル環境へのアクセスやましてやC言語じゃあるまいし、直接ハードウェアの制御などは出来ません。
しかし、Node.jsの力を借りる事で、Raspberry PiやArduinoといったIoT基盤であるデバイスを制御し、ブレッドボード上に構築したセンサー類等から、GPIOを介して値の取得や命令を送り込む事が可能になっています。またNode-REDを使うことでノーコーディングでこれらの制御を可能にもなっていると言う。
ハードウェア制御に関しては、Pythonのほうがよく用いられていますがNode.jsも負けじと様々なセンサー用のモジュールやドキュメントが用意されており、またシリアルポート通信を使ってのハードウェア制御も可能になっているので、大昔に自作で作ったRS-232Cなデバイスを今に蘇らせる事も可能ではないかと。
但し注意したいのは、これを使ってセンサーを自動制御、命令を送ることまでは確かに出来るのですが、Raspberry Piが供給できる電力は非力であるため、もし大きなデバイス制御となると、電気工事が必要(素人がやると火事になったりするので、実際にはスイッチボットを使ったスイッチのオンオフを使う手法のほうが安全ですね)
※Arduinoでは資料があるので使える電子パーツであっても、Raspberry Pi上ではドキュメントが無いので自力でなんとかしなければいけないケースもあるので、其の場合には素直にPythonを使ったり、Arduinoからのデータ取得といった対応が必要です。
AIや機械学習
最近、ウェブ業界で盛んに話が出てきてるのが、AI。といっても、大きな錯誤がありますが、このAIはいわゆるアニメや映画に出てくるようなAIではありません。基本的には機械学習を積み重ねて最適解を出すという、平たく言うと力技です。機械が人間のように頭脳で考えて答えを出してるわけではありません。
これらの分野に於いてもJavaScriptが活躍する事が可能です。
人工音声AIで確固たる地位を築いた「Amazon Echo」。Alexaというシステムになりますが、こちらのスキルの開発はNode.jsを持って開発をする事が可能です。5000円程度で買えるデバイスで、様々な操作や情報の入手などを音声で行える為、PCが苦手スマフォが苦手な人でも扱える次世代のスマートデバイスですね。
GoogleのGoogle Assistantのアプリも同様にNode.jsにてCloud Functionsなどを利用してJavaScriptでの開発が可能になっています。
また、きゅうりの自動選別でも有名なTensorFlow。何枚もの画像を読み込ませて機械学習させ、自動で規格仕分けを人間の手を使わずに行えるように自作してしまった凄腕農家さん。アルバイトを簡単にもう雇える時代じゃない日本の農業でのITの未来はここにあると感動したものです。このTensorFlowもJavaScriptから操作することが可能です。
機械学習と言うとNode.jsよりもPythonが有名ですが、せっかく身につけたJavaScriptにて操れるとしたら、明日からでも開発に取り書かれるメリットは大きいです。学習コストの大きい小さいは何にも勝る要素ですから。こちらもNode.jsを利用して作成を行えます。
G Suite
アプリの操作や自動化
G SuiteにはDrive, Calendar, Mail, Spreadsheet, Slide, Documentなどのオフィスアプリケーションが用意されています。これらをアプリの枠を超えて連携や操作を可能にする為に用意されているのが、Google Apps Script。Microsoft OfficeのVBAに当たるもので、最近ではマクロにあたる「操作の記録機能」も装備されています。
UrlfetchAppを利用する事で、外部の他のウェブサービスとの連携(Web APIを用いて)が可能になったり、またGoogle Cloud Functionsなどに自前で用意したサービスとの連携、Cloud SQLで用意したデータベースとの連携なども可能になっています。
VBAとの大きな違いは、ローカルで動いているわけではないので、トリガー機能を使うことで真夜中に自動でプログラムを動かしたり、Web API化しておいて、他のプログラムから受け待ちをしておく事も可能である点。Excelでも数分起きに実行は出来なくもないのですが、PCを動かしたままにしておく必要があります。
何よりもメソッド1発でメールが送れたり、ドライブのファイルを操作する事が簡単に出来るので、これだけでも業務の自動化や効率化がぐっと図れるます。
ウェブアプリケーションの作成
HTML Serviceという機能を利用する事で、G Suiteのアプリの操作だけでなく独自の社内向けウェブアプリケーションの作成が可能です。データの保存場所は主にGoogle Spreadsheetを利用するので、使い手は余計な操作をする事なく、スプレッドシート上で集計作業や加工が可能なので、へたなウェブサービスを契約して毎月お金を取られるよりも、自前で用意して小さなサービスを充実させれば、最低月額600円/1アカウントで運用が可能です。
ライブラリを活用する事でスマートフォン用のウェブアプリケーションの作成も可能。
また、現在のHTML Serviceは、jQueryやVue.jsといったライブラリも活用可能になっているため、Google Formでは出来ないオリジナルのフォームアプリケーションの作成も可能になっています。
その仕組はNode.jsのメインプロセス(GAS側)とレンダラプロセス(HTML側)の関係に似ています。サーバを用意せずにウェブアプリケーションを作れるメリットは非常に大きいです。
ウィジェット
新しいGoogle Sitesには、前述の作成したウェブアプリケーションを貼り付ける事が可能になっています。それとは別にGoogle Sites上では、直接JavaScriptとHTML, CSSにてアプリを直書きする事も可能になっています。
昔流行ったウィジェット関係を直接記述出来るので、イントラネットの情報を充実させる一役にJavaScriptだけで作成が可能です。昔利用できていた「XMLガジェット」の代わりがこの機能とも言えます。