Aikの技術日記

技術的な進捗とか成果とかを細々と投稿するブログです。時々雑記も。

CODEPREPで勉強しよう その9

その1(CODEPREPとは/学習予定ブック紹介)はこちら
その2(Sass,Bootstrap,Fontawesome編)はこちら
その3(HTML&CSS実践編 前編)はこちら
その4(HTML&CSS実践編 後編)はこちら
その5(JavaScript編 前編)はこちら
その6(JavaScript編 後編)はこちら
その7(Three.js,moment.js,Canvas編)はこちら
その8(React,Vue.js編)はこちら
その10(Ruby,Scala編)はこちら
その11(CODEPREPやってみた感想等)はこちら

CODEPREP勉強中です

前回の記事では、JSの有名フレームワークについてしこたま色々勉強できました。
AngularとReactとVue.jsに触れられる良い機会となれました本当…!

今回はRustとGoogleMap,Webカメラにまつわるブックをやっていこうかなと思います。
具体的には下記のブックを…。

  1. はじめてのRust
  2. はじめてのRust(後編)
  3. Rustの特徴を理解する 所有権編
  4. GoogleMapで遊ぼう
  5. Webカメラで遊ぼう!

早速学んだブックの感想やらまとめをば!

各ブックの感想など

いつもの様に、各ブックで学んだことのまとめや感想などを書き連ねていきたいと思います。

はじめてのRust

今回はRustというプログラミング言語に触れていくブックでした。
なかなか聞きなれない言語名…少なくともWeb系に関連するものではない様です。

CODEPREPさんのブック紹介文には、Rustに関して下記の様な説明が載ってありました。

RustはC/C++の安全な置き換えを目的として作成された言語です。
RustではC/C++での大きな課題であったメモリ資源の安全性の担保に力が入れられています。
加えてRustではGCVMを必要としない高速なネイティブアプリケーションの作成が可能です。
Rustのコンパイラは非常に厳格でその学習コストは決して低くはないですが、それに見合うだけの価値があります。

※その他の大百科系記事に記載されたRustの説明も、下記に載っけておきます。
(ニコニコ大百科に非常にがっつりとしたRustの記事があって驚きました…)

Rustの概要(Wikipediaより引用)

Rust(ラスト)はMozillaが支援するオープンソースシステムプログラミング言語である。
Rust言語は速度、並行性、安全性を言語仕様として保証するC言語C++に代わるシステムプログラミング(英語版)に適したプログラミング言語を目指している。
2006年の開発初期はグレイドン・ホアレの個人プロジェクトだったが、2009年にMozillaが開発に関わり始めてMozilla Researchの公式プロジェクトとなった。
2015年に1.0版がリリースされるまでにいくつもの破壊的な仕様変更があったが、1.0版以降は基本的には後方互換を保って6週間間隔で定期的にリリースされている。
プロジェクトはオープンソースのコミュニティベース開発で進行しており、言語仕様(検討段階含む)、ソースコード、ドキュメントはオープンソースライセンスで公開されている。

Rustはマルチパラダイムプログラミング言語であり、手続き型プログラミング、オブジェクト指向プログラミング、関数型プログラミングなどの実装手法をサポートしている。
基本的な制御フローはC言語に似ているが、ほぼ全ての命令文が式(expression)であるという点においてはML言語に似ている。
コンパイル基盤にMIRとLLVMを用いており、実行時速度性能はC言語と同等程度である。
強力な型システムとリソース管理の仕組みにより、メモリセーフ(英語版)な安全性が保証されている。

Rustは2016年、2017年のStack Overflow Developer Surveyで「最も愛されているプログラミング言語」で一位を獲得している。
一方で、Rustは学習難易度が高い言語とも考えられており、2017年ロードマップでは学習曲線の改善を目的として挙げていた。

Wikipedia)より

Rustの概要(ニコニコ大百科より引用)

Rustとは、メモリ安全性や並列処理の安全性に注目して開発されたプログラミング言語である。

速度、安全性、並行性が特徴のプログラミング言語である。
C++と遜色ない実行速度を誇り、GCがないにも関わらず手動のメモリ管理は不要で、しかもメモリ安全である。
また、並列処理に起因するバグをコンパイル時に検出することができる。
開発はオープンなコミュニティによって行われているが、Mozillaから支援を受けている。

構文はCライクであるが、型を後置したりする。また"fn" "Vec"のようにキーワードや識別子の省略を多用するのが気持ち悪い特徴的。
関数型言語の影響を受けて型推論や代数形、パターンマッチング、タプル、高階関数、型クラス(トレイト)などをサポートしたマルチパラダイム言語である。

コンパイラが親切なのもRustの特徴である。
分かりやすいメッセージで、問題のあるコード部分に下線を引いて注釈を入れ、時には正しいコードを示してくれたりもする。
また、言語仕様や標準ライブラリは処理系のメジャーバージョンが変わるまで後方互換を保つ。
処理系をアップデートしても昔のコードが壊れることは滅多にないのだ。

一部では、Rustは入門者にとって厳しい言語であるということで有名である。
自動メモリ管理のための機構である「所有権(Ownership)」の概念を把握できていないと、頻繁にコンパイルエラーに遭遇し、しかもその意味がわからないのである。
ある程度習得できていればひと目見て解決できる問題であったりする場合が多く、所有権を理解しないまま何時間も試行錯誤するようなことは時間の無駄となる可能性がある。
行き詰まったらRustコミュニティで質問したりして、エラーの原因を理解することを勧める。
また、ドキュメントやサンプルも眺めておこう。

用途:

  • 高パフォーマンスを要求される場面。
    • コストを可視化する傾向の言語・ライブラリ設計となっている。
    • 高レベルな抽象化を行ってもノーコストな機械語に落ちたりする(ゼロコスト抽象)。
  • 他言語との連携。
    • GCやその他の言語ランタイムが無いため、他言語で書かれたプログラムのボトルネックをRustで実装しなおすといったことが気軽に行える。
    • FFIの呼び出しコストを無くすためグリーンスレッドが取り除かれた経緯があるため、Rustの主な用途の一つなのだろう。
    • ちなみに、非同期処理にはイベントループが使われるようになった。
  • デバッグが地獄になりそうなとき。セキュリティが気になるとき。
    • 複雑な並列並行処理や、文字列処理はバグの根源となる。Rustの型システムが提供する安全性が役に立つ。
  • 組み込みやその他のベアメタル環境。
    • 現在ARMで動かせる他、AVRマイコンへの対応も進んでいる。
    • 実験的なRust製OSがいくつか開発されている。

新しい言語として同時に挙げられることの多いGoなどと比べると、中々ニッチな領域を攻めている言語だと言える。
Mozillaが支援しているからには当然だがブラウザの開発はこれらの特徴にピッタリと当てはまり、Firefoxがバージョン48以降で徐々にコンポーネント単位でRustに移行している他、次世代ブラウザエンジンであるServoの開発にも用いられている。
Mozillaの外ではDropboxやnpmがWebサービスのバックエンドに用いており、ドワンゴも分散型ファイルシステムの開発にRustを用いているという。

ニコニコ大百科より

筆者は学校でCに少し触れたことがありまして…。
その視点から見ると、確かにRustはCに近い感じがしました。

Javaほど高級感というか色々出来る感じしなかったりとか、JavaScriptみたいに何でもかんでもvarに放り込むんじゃなくちゃんと型宣言しないといけないとことか…。
FireFoxの開発にも用いられている面から考えるに、Webアプリケーションとかそう言ったのではなく、もっと深い…低レベルのアプリケーションを作る感じの言語なのでしょうかね。

また、学習コストの高さが概要にも挙げられていましたが…。
入門編のブックを少しやったくらいでは、その難しさというか闇?には気づけませんでした…。

所有権というものの理解をするのが難しそうだなぁと思ったくらいです。
(Cのポインタが可愛く見えるほどに難しい概念だそうです…)

ただ、色々調べてるとRustには所有権以外にも、他の言語にはない概念がたくさん盛り込まれているみたいで。
借用検査、とかライフタイム、とか…。
この概念に慣れなきゃいけないってのが、Rustの難しさなのでしょうかね…??

まぁRustに関するブックは他にもありますし、色々語るのはまずはそれをやってからですかね。

また、Rustとは関係ないですが、ブック学習中に「サロゲートペア」なる、聞き慣れない単語を見つけ…。
気になって調べてみたら、分かりやすい上にとても面白い記事を発見しました。

せっかくなのでリンクを貼っておきます。
サロゲートペアってなんでコワイの - Qiita

はじめてのRust(後編)

先にやった「はじめてのRust」ブックの続きとなるブックで、前編にやった内容よりRust独特の様々な文法や機能に触れていくブックでした。

※前編で学んだことと後編で学んだことの一覧も載っけておきます。

こちら

今回でよりRustの様々な面を見ることがと思います。
また、ブックの最後の方にRustの概念「借用」に触れるものもありました。

触れてみた感じ…確かに難しいなと思いましたが、使いこなせば非常にバグを減らすことが出来そうだなぁと思いました。

また、バグを減らすという話題に関して話したいことが一つ…。
Rustを前後編やって思ったのが、コンパイラがひっっっじょうに強力ということです。

エラー出力自体が分かりやすいってのもありますが、何よりすごいのは(状況にもよりますが)コンパイラがコードの解決法を提案してくれるというものです。
今回学んでいくのにあたって、幾つか手詰まりになりかけた場面もあったのですが…コンパイラの提案により難を逃れたことがいくつもありました。
こんなにかしこいコンパイラってあるんですねぇ…本当にすごい。

※なお、エラー出力はこんな感じで出てきます。参考に…
"Rustのエラー出力画面"

また、ブック終了後Rustに関する記事を色々みてみました。
主にRustの使用感や特徴を述べている記事を見ていたのですが…。
なかなかすごい人が執筆された記事を結構発掘しちゃって。
(例えばGoogleに務めてらっしゃる界隈でも有名な方の記事とか…あ、めっちゃ分かりやすい記事でした)

せっかくなので、その記事も含め参考になった記事のリンクを貼っておきます。
Rustって玄人向けの言語なんでしょうかね…??

Rustは何が新しいのか(基本的な言語機能の紹介) - いもす研 (imos laboratory)
https://saitoxu.io/2017/05/27/rust-feature.html
Rustに100日触れてわかったこと - Qiita
http://ir5.hatenablog.com/entry/20171209/1512821837

また、Rustでプログラミングコンテストに出場されたという記事も見受けられました。
https://hayato.io/2017/icfp-rust/

Rustは処理速度が速い言語とありましたからね…。
オンラインプログラミングチャレンジサイト(ex. AIZU Online JUDGE)でもRustを使えるようにしている所が結構あるみたいです。

Rustの特徴を理解する 所有権編

先に学んだ2つのブック、「はじめてのRust」「はじめてのRust(後編)」の知識が前提となる応用編の様なもので、Rustの特に理解が難しいと言う部分「所有権」や「ライフタイム」について見ていくブックでした。

余談ですが、今回のブックの冒頭にRustに関する下記の様な記述が。

Rustが他の言語と決定的に異なる点は所有権とライフタイムという概念が存在することです。
所有権は誰が何のデータを持っているかを明確にします。関数や構造体、あるいはプログラム自体が所有権を持つことができます。

ライフタイムはあるデータが解放されるまでの期間を明示するものです。
コンパイラが所有権とライフタイムを適切に管理してくれるので、Rustではいわゆるガベージコレクションが必要ありません。
結果としてRustでは安全に高速でガベージコレクションによるStop the worldのないプログラムを書くことができます。

筆者は普段ガベージコレクションなんて気にしなくていいレベルの簡単な言語というか、高級言語ばかりをやってるので…改めてRustの敷居の高さというか、深いレベルの言語なんだなっていう認識が出来たというか…。

ガベージコレクション(略してガベこれ)については下記の記事を…
- Wikipedia: ガベージコレクション - Wikipedia - qiitaの参考記事: ガベージコレクションはこうすれば理解できる - Qiita - ガベこれはメモリリークへの対策に…メモリリークとは?: メモリリーク - Wikipedia - Javaでのガベこれ: Java - Wikipedia

Rustに触れてみた感想

前々回、前回、今回のブックでRustに一通り触れることが出来ました。
使ってみた感想としては、「学習コストは確かに高く難しいが、この言語を使いこなせれば相当な技術力UPが目指せそうだ」という感じです。

言語自体のハードルが高い(CODEPREPさんレベルで分かりやすい入門サイトで触ってみてもいまいち分かんない箇所が沢山あるレベル)ってこともそうなのですが、何より感じたのが「Rustコミュニティには相当レベルが高い人がごろごろいそう」ということです。
前回のブックでRustに関することを書かれてた記事を見ましたが、その筆者の方のレベルが高いことからそれを感じましたし…。

提供されているドキュメントもかなりハードルが高い感じで、筆者はぜんっぜん読む気力すら湧かないレベルでしたが…。
このレベルのものが分かる様になれば、他のドキュメントも怖くない!って自信がつきそうかなと思ったり。

あとは割とマイナーっぽい言語ってこともあるのでしょうか…。
また、Javaみたいな高級さがなかったり、JavaScriptのようなとっつきにくさがないって事もあるのかも。
JavaとかJSとか使うと、中身とか色々わかってなくても簡単にそれなりのアプリが作れますから…でもRustはそこを許さない感じ。

今後学んでおくには非常に良さげな言語かもと感じました。
AIZU Online JUDGEとかに取り組む際に、Rustでやってみてもいいかもですね…!

GoogleMapで遊ぼう

GoogleMapのAPIに触れていくブックでした。
以前よりGoogleMapのAPIは気になってたので…すっごくいい機会に恵まれました!!

触ってみた感想としては…うん、GoogleMapのAPI使いやすい。
ちょっとした表示や機能とかがAPIに全部搭載されてる感じというか…。

近年だと、色んなWebサイトとかで独自に拡張されたGoogleMap(マーカーが独自アイコンだったりルートを表示させたり)が見られますが、そういった処理も本当に簡単にできる感じでした。
それに、1個前のブックでRustみたいな学習コスト高いやつの後にやると…その手軽さが余計際立つ感じですな。

結構面白かった上、Google公式ドキュメントにはTutorialもあったので…今度やってみようかなと思います。
まぁ、CODEPREPさんでやった時はGoogleMapを使うための準備段階(APIkey取得)とかが全部終わった段階から勉強したので…。
自力でするとなると、この辺りもやらないとな。

Webカメラで遊ぼう!

Media Capture and Streams APIを使用して、PCのカメラを使った簡単なアプリケーション作成を通じ、Webカメラ技術に触れるブックでした。
なお、今回推奨ブラウザがChromeFirefoxになっておりました。
(どうもSafariではMediaAPIがサポートされていないためすべてのカメラ機能が、Microsoft Edgeでは一部の機能(録画機能)が動作しないそうです)

…ただ、どうも自分の環境(Chrome Ver69.0.3497.100(Official Build-64 ビット))だと起動せず…。
その後CODEPENでも試してみると、Safari(Ver12.0)でやるとカメラ部分は認識しましたが、画面に何も映らない状態に。

CODEPREPさんの解説に「もしカメラが動かない場合は[chrome://flags/]にアクセスし、Experimental Web Platform featuresを有効化してください」とあり、それも試しましたが駄目…。
どういう事だという事で、今回使用したAPIMedia Capture and Streams APIについてちょっと調べてみました。

Media Capture and Streams APIとは

とりあえずググってみると、最上位にMozillaさんDocsが出てきました。
そちらには概要が下記の様に書かれてありました。

Media Capture and Streams APIは一般的にMedia Stream APIやStream APIと呼ばれるWebRTCに関連したAPIです。

※参考記事: Media Capture and Streams API (Media Streams) - Web API | MDN

うーん、WebRTCって何じゃ。
というわけでこちらに関して見てみました。

WebRTC(Web Real-Time Communication)とはWorld Wide Web Consortium(W3C)が提唱するリアルタイムコミュニケーション用のAPIの定義で、プラグイン無しでウェブブラウザ間のボイスチャットビデオチャット、ファイル共有ができる。

※参考記事: WebRTC - Wikipedia

WebRTC (Web Real-Time Communications、ウェブリアルタイムコミュニケーション)は、ウェブアプリケーションやウェブサイトにて、仲介を必要とせずにブラウザ間で直接、任意のデータの交換や、キャプチャしたオーディオ/ビデオストリームの送受信を可能にする技術です。
WebRTC に関する一連の標準規格は、ユーザーがプラグインサードパーティ製ソフトウェアをインストールすることなく、ピア・ツー・ピアにて、データ共有や遠隔会議を実現することを可能にします。
WebRTCはこれらを実現するために、いくつかの相互に関係するAPI群とプロトコル群から構成されます。

※参考記事: WebRTC API - Web API | MDN
※冒頭に「この翻訳は不完全です。英語からこの記事を翻訳してください。」とありました。参考までに下記に英語Verのものを載っけておきます。

WebRTC概要文:英語Ver: by MDN

WebRTC (Web Real-Time Communications) is a technology which enables Web applications and sites to capture and optionally stream audio and/or video media, as well as to exchange arbitrary data between browsers without requiring an intermediary.
The set of standards that comprises WebRTC makes it possible to share data and perform teleconferencing peer-to-peer, without requiring that the user install plug-ins or any other third-party software.

WebRTC consists of several interrelated APIs and protocols which work together to achieve this.
The documentation you'll find here will help you understand the fundamentals of WebRTC, how to set up and use both data and media connections, and more.

参考: WebRTC API - Web APIs | MDN

なるほど…なるほどぉ…??
WebRTCという大元があって、Media Capture and Streams APIはそれにぶら下がっている形をとってるのでしょうか…。

この辺りの技術分野の記事を色々見た感じ…どうもどのブラウザも試験的な実装であるっぽかったんですよね。
まだ新しすぎて、各ブラウザが対応が取れていない…という事なのでしょうか。

また、WebRTCについて、W3Cの対応状態がどうなってるかを見てみると、まだ規格策定の最終段階にすらいってないっぽいです。
W3C勧告候補段階のは、2018/6/21となってますし…Editor's Draftもボコボコ出てる感じ。

WebRTCにぶらさがる各APIの状態も…規格策定の最終段階に行くものは、早くて2019年のQ1(1月〜3月)らしいです。
先に出てきた「Media Capture and Streams」も、この時期辺りに最終段階に行く様子。
Web Real-Time Communications Working Group

この各APIの中には、先にあったMedia Capture and Streamsや、Screen Capture等、ブラウザの可能性が瞬く間に上昇しそうなものがたくさんありました。
ここの動向は見ておいて損はないかもです。

W3Cの勧告のプロセスについては下記を↓
W3C勧告 - Wikipedia
HTML標準仕様などを決める、W3Cによる勧告のプロセスとは? - Build Insider

個人的な感想としては…。
ブラウザからプラグイン等なしで、ビデオやオーディオ周りが扱えるのは非常に魅力的ですが、W3Cの勧告が成熟する予定の…2019年1月〜3月辺りまで、もう少しだけ待ってみてもいいかもしれないと思いました。
まだ英語のドキュメントばかりでハードルが高いってのもあるかな…。

まぁ今のうちに最新の情報に触れるのと同時に英語について親しんでみるって意味では、この技術を追っかけてみてもいいかなと思いました。

余談: Media CaptureAPIが動かなかったことについて

先ほど、CODEPREPさんのカメラ機能がChromeでは動かず、Safariだと動くが画面に何も映らない…ということを話しました。
結論から言うと…いまだに原因は不明です。

原因として、CODEPREPさんで紹介されたコードが古いものとなり使えなくなったから…?と思い、MDNさんのデモコードをCODEPENさんにくっつけてみましたが、ChromeでもSafariでもFirefoxでも駄目でした。なんでぇ…??

色々調べて行くと、似た様な状況になられている方の記事があり…。
覗いてみましたが、イマイチわからなかったです…。
WebRTCサンプルが Safari × Codepenで動かなかったこと - ヒキダスブログ

もし似た様な状態になられた方がおりましたら、ぜひコメントを…!!

次回の記事について

次回記事では、RubyScalaに関するブックを見ていきたいと思います。
RubyRuby on Railsとかで触れましたが、Scalaは全く触れてないので…とても楽しみです!!

ではでは|д゚)