dackdive's blog

新米webエンジニアによる技術ブログ。JavaScript(React), Salesforce, Python など

「実践Rust入門」を読んだ

一旦読み終わったので、感想や個人的に良かったなあと思ったポイントなどをメモしときます。

全体的な感想

私のように、初めて Rust を勉強する人が基本的な文法やテスト・パッケージ(クレート)などのエコシステムについて体系的に学ぶのに良い本だと思いました。
私の場合、最初は the book と呼ばれる公式ドキュメントから入ろうとしたものの英語に挫折し、日本語訳を見つけるも情報の鮮度にいまいち確証が持てず(エディションがなんなのかいまいちわからなかった)。。。という感じだったので
2018 Edition に対応しており、かつ日本語で書かれた書籍という点では非常にありがたかったです。

また、サンプルも豊富です。

  • 「2-4節 RPN計算機プログラムとデバッガによる実行」では RPN逆ポーランド記法)で記述された数式を計算するプログラム
  • 「第3章 クイックツアー」ではソートアルゴリズムの 1 つであるバイトニックソート
  • 「7-9節 ライフタイムの詳細:簡単なベクタの実装」では簡易的なベクタ型
  • 「第9章 パーサを作る」では四則演算を行うためのパーサ
  • 「第10章 パッケージを作る」ではファイルの文字数をカウントするパッケージ
  • 「第11章 Web アプリケーション、データベース接続」ではWebアプリ
  • 「第12章 FFI」ではRustとCの連携プログラム

というように、実際に手を動かしてある程度のまとまりのあるコードを書くための題材が複数用意されています。
基本文法を覚えた後でいくつか実践的なお題に取り組めるのは良いと思いました。

加えて、本書は500ページ超と自分にとってはかなりのボリュームだったんですが、各サンプルは独立性が高いので、
特に後半の第10章〜第12章は自分に興味のあるトピックだけかいつまんで読み進めることができます。
私も第11, 12章は必要になったときに熟読しようと思い流し見だけしました。

困ったところがあるとすると、RPN計算機、バイトニックソートなど、題材自体の理解が難しいものがいくつかあったことでしょうか。
私は本を読むときたいてい前の方からじっくり読んでしまうんですが、文法もよくわかってない状態であれば第2, 3章はとばして第4, 5, 6, 7章あたりから読めばよかったなーと思いました。

写経したソースコード

https://github.com/zaki-yama-labs/rust-study/tree/master/bicycle-book
にあります。

良かったところ、勉強になったところ

VSCode でのデバッグ方法を知ることができた

「2-4-2 デバッガのセットアップ」の項で、CodeLLDB というVSCode拡張を使ったデバッグ方法について説明されており、これは今後も役立ちそうです。

データがメモリ上にどう配置されるのか、図を交えて説明されておりわかりやすかった

本書でRustを勉強して印象に残ったことの1つとして
「Rustでもデータがメモリ上にどういうふうに格納されているのかとか、ポインタに近い概念みたいなものは意識しないといけないんだ」
という感想を抱いたのですが、本書ではそのあたりの説明が丁寧でわかりやすかったように思えました。

「5-1 スタック領域とヒープ領域」でそれぞれのメモリ領域の特徴の紹介がされていたり、ちょっと話が複雑な場面では「今メモリ上はこのようになっています」というのを説明した図が何度も登場しました。

例として、Rustで文字列を扱う際に登場するStringとstrを比較した図を引用します。

f:id:dackdive:20200729013932p:plain

let foo = "abc" などとしたときの文字列リテラルは不変なので静的領域に置かれるがStringは可変なのでヒープ領域に置かれる、とか、
&str は実データを所有せず参照している、というのが図によってイメージしやすかったです。

パッケージの作り方、テストの書き方が理解できた

これは主に第10章です。
普段はWebフロントエンドの開発をしているため、npm パッケージに相当するものはRustだとなんだろう?とか、テストはどういうライブラリを使うんだろう?といった疑問がこちらの章で解決しました。

また、CI についても触れられていて、実際にRustで何か作ろうとするときには役立ちそうな知識だなーと思いました。
本書で紹介されていたのはTravisCIとAppVeyorでしたが、私はGitHub Actionsで構築しました。

そのへんの話はこちらに書きました:

余談ですが、Cargo.toml に書く [badges] というセクションは現在は deprecated のなんですかね。
Remove badges from crate lists and details · Issue #2436 · rust-lang/crates.io

README にこんな感じでバッジを直接埋め込むとよさそう。

[![<YOUR-CRATE-NAME> at crates.io](https://img.shields.io/crates/v/<YOUR-CRATE-NAME>.svg)](https://crates.io/crates/<YOUR-CRATE-NAME>)
[![<YOUR-CRATE-NAME> at docs.rs](https://docs.rs/<YOUR-CRATE-NAME>/badge.svg)](https://docs.rs/<YOUR-CRATE-NAME>)

実際に試したやつ:https://crates.io/crates/zaki-yama-bicycle-book-wordcount

また、クレート名はグローバルで一意じゃないといけない(npmパッケージのscopeみたいなものがない)、というのも、クレートを公開しようとしたときに地味にハマったポイントでした。

疑問点をSlackで質問できる

https://github.com/ghmagazine/rustbook#ご質問や不具合報告など

にも記載がありますが、本書に関する質問は rust-jp チームの Slack で著者らに質問することができます。
私も2つほど質問させていただきました。とても助かりました。

f:id:dackdive:20200729090419p:plain

引き続き勉強が必要だと感じたところ

「Rustならではの型や構文は覚えたので前より読めるようにはなったけど、正直まだまだ自分でRustを書けるレベルには程遠いな〜」というのが率直な感想です。

具体的には

  • Box<T> 型はまだよくわかってない
  • 所有権システム
    • 参照とか借用とかムーブとか
    • 7-9 節で簡易ベクタ型を実装するとき、メソッドの引数が &self だったり &mut self だったり self だったり。どういうときにどう書くのがいいか全然わからない
    • ライフタイム...
  • ベクタを扱う操作
  • モジュール単位、ディレクトリ構成など
    • 本書では単一ファイルに全部の関数やそのテストも書く、みたいな感じだったので、どういう粒度でファイル分けるんだろうなとか

この記事にもライフタイムは鬼門だって書いてますね。

次やること

次は WebAssembly の作り方、動かし方を勉強したいです。
Tour of WebAssembly をはじめました。

学習メモ

本を読みながらとっていたメモはリポジトリに。
https://github.com/zaki-yama-labs/rust-study/tree/master/bicycle-book

GitHub ActionsでRustプロジェクトを複数ツールチェイン&複数OSでビルドする

背景

こちらの本を読んでRustを勉強しています。

「10-5 自動テストを行う」でTravis CIとAppVeyorを使ったCI環境の構築方法が紹介されていたのですが、せっかくなので同じことをGitHub Actionsで実現しようとして、調べたことをメモ。

やりたいこと

  1. Rustの Stable/Beta/Nightly チャネルそれぞれでビルド・テストを実行したい
  2. 加えて、Windows/macOS/Linux でビルド・テストを実行したい
  3. Nightly チャネルでのテスト失敗は無視したい
続きを読む

Rust, WebAssemblyの学習に良さそうなチュートリアル系記事まとめ

個人的な興味で5月ぐらいからRustを勉強してるんだけど、「今読んでる本が終わったら読みたいなー」という記事が溜まってきたので一旦メモ。
Tips 系の記事というよりは、ある程度まとまったボリュームのチュートリアルっぽいものだけ集めた。

🇯🇵: 日本語。または日本語訳もある

Rust

WebAssembly (WASM)

おまけ:書籍

実践Rust入門[言語仕様から開発手法まで]

実践Rust入門[言語仕様から開発手法まで]

今読んでる。かなりのボリュームだけどサンプルプロジェクトが多くて個人的にはありがたい。

プログラミング言語Rust入門

プログラミング言語Rust入門

実践Rust入門を読んでる最中に、より出版日が新しい本があることを知った。
内容は調べてない。

買ったけど、RustとTCP/IPの基礎知識があることが前提らしく積ん読

2020年4〜6月のふりかえり

前回のふりかえりからまた3ヶ月経ったので。
前回:2020年1〜3月のふりかえり

2020年4〜6月にやったこと

「みんなのデータ構造」を読み終えた

みんなのデータ構造

みんなのデータ構造

  • 作者:Pat Morin
  • 発売日: 2018/07/20
  • メディア: 単行本(ソフトカバー)

コンピューターサイエンスを勉強するぞ計画の第一弾。
読み終えました。4/23 に終わっていたらしい。

かなり読み飛ばしている(まえがきでオススメされていたところしか読めてない)のに加え、最後に全体のまとめをしたかったんですができてないことに気づいた。

Rust の勉強を始めた

「みんなのデータ構造」を読み終わった後、何しようかなーとしばらく考えた結果
やっぱ Rust 一回勉強してみたいなという気持ちになり、本を一冊買った。

実践Rust入門[言語仕様から開発手法まで]

実践Rust入門[言語仕様から開発手法まで]

5, 6月はほとんどこれしかやってない。なのに全然終わらない。

それから、買った後に発行日がもっと新しい本もあることに気づいた。

プログラミング言語Rust入門

プログラミング言語Rust入門

こちらもレビューとかを読む限り良さそう。

leetcode をちょくちょくやるようになった

Rust 勉強しつつコンピューターサイエンス系の勉強も継続するために、週1ぐらいでいいので leetcode をやるようにした。
まだ6問しか解いてないようです。

f:id:dackdive:20200706232217p:plain

30分ぐらい自分で考える→discussionから模範解答っぽいの探して、もう30分で実装してみる、みたいな感じでやってます。

所感

この3ヶ月どうだったか、今のお気持ちは、など。

👍 コンピューターサイエンス:大学に通いたい熱が高まった

身の回りで自分と同じようにコンピューターサイエンスを学びたいと考えている人が何名かいて、中には実際にオンラインの大学に通い始めた人もいたので
自分も大学に行きたいというモチベーションが高まった。

ぼんやり35歳ぐらいでチャレンジするイメージだったけど、どういう選択肢があるのかだけでも調べておくのはいいことだなと。

そして、いろんな方の話を聴いてると問題は金ではなく時間だということがわかりつつある。

👍 読書が以前よりも習慣づくようになった

Rust の勉強をし始めてから、在宅勤務の中でコンスタントに毎日30分〜1時間ぐらい本を読む習慣ができてきた気がする。

😢 Webエンジニアとして成長した感じがしない3ヶ月だった

はっきりとした理由はわからないが、業務でやっていること、コロナにより今まで通りの仕事ができない(と感じている)こと、その他いろんな要因があって
エンジニアとして何かできるようになった、というのが実感できない数ヶ月だった。
5, 6月のブログが0件なのも一部それを表している気がする。

ありがたいことに一緒に働く仲間たちがみんな優秀なので、必要以上に彼らと比較してしまっているという部分もあるのだとは思う。
四半期の後半あたりから「もう今一番自分がやりたいと思うことをやろう」と考えるようになってから少し吹っ切れたかも。

次の四半期(2020年7〜9月)のテーマ

7月中に今読んでる本は終わるといいなあ。
終わったら、次はこの2冊のどちらかを読みたい。

年末に立てたTryの確認

  • 英語ブログ、今年こそ書く!目標は3本
    • →何もやってない
  • 今年もどっかのカンファレンスにCfP出す
    • →何も(略
  • 「みんなのデータ構造」とあともう1冊、コンピュータサイエンスに関する本を読む
    • ✅「みんなのデータ構造」
  • 本は年間で6冊読む
    • →2冊め

MacにHomebrewでsquidをインストールし、Basic認証つきのプロキシサーバーを立てる

ローカルに検証用のプロキシサーバーを立てる方法を調べていて、Squid を使った方法を備忘録のためメモしておく。

Linux 向けの情報はよく出てくるけど、Mac 環境です。

続きを読む

「みんなのデータ構造」学習メモ:6.2 BinarySearchTree 二分探索木

みんなのデータ構造(紙書籍+電子書籍) – 技術書出版と販売のラムダノート

amazon

みんなのデータ構造

みんなのデータ構造

  • 作者:Pat Morin
  • 発売日: 2018/07/20
  • メディア: 単行本(ソフトカバー)

これまでのメモ

二分木の続き。 TypeScript によるソースコード
https://github.com/zaki-yama/open-data-structures-typescript/blob/master/src/BinarySearchTree.ts

続きを読む

2020年1〜3月のふりかえり

本当は毎月ふりかえりたかったんですが、気がついたら最初の四半期が終わってました。
この3ヶ月の間にやっていたこととか勉強していたことのふりかえり。

ちなみに年末のふりかえりは 2019年のふりかえりと2020年の抱負 - dackdive's blog です。

2020年1〜3月にやったこと

コンピュータサイエンスを勉強する💪 → 「みんなのデータ構造」

2020年の個人的メインテーマである「コンピュータサイエンス系のことを勉強する」。
その第一歩として読み進めていた「みんなのデータ構造」、ざっくり3ヶ月以内を目標にしていたんですがまだ終わってません。。。

みんなのデータ構造

みんなのデータ構造

  • 作者:Pat Morin
  • 発売日: 2018/07/20
  • メディア: 単行本(ソフトカバー)

読み始めた当初、この本に書かれている内容は細かいところまですべて理解しようと意気込んでいたんですがあえなく挫折しました。
今は、「本書の読み方」に書いてあったように「わからないところは飛ばしてもよい」ものと割り切り、また特に重要な項目として取り上げられていたものだけとりあえず読むことにしました。

あとトピックとしては3つぐらいなので、4月中に読み終えてまとめもしたい。

ブラウザの Cookieについて学んだ

年明けにHTTP/Tokyoという勉強会に参加したのがきっかけで、1月後半〜2月頃はブラウザのCookieについて勉強してました。
アウトプットとして何も残せなかったのが残念。

こちらのブログ・スライドはとてもわかりやすくまとめられていて、定期的に読み返したくなります。

ECMAScript Proposal の Realms や SES について学んだ

今の職場のチームでは業務時間内に興味のある技術の調査・探究をする時間があるのですが、この時間を利用して前々から興味のあったRealmsとSESというECMAScript Proposalについて勉強してました。

github.com github.com

Realmsは現在Stage 2、SESはStage 1です。
前提とされるJavaScriptの仕様の話が難しく、時間をかけた割に概要レベルでしか把握できてないのですが
それぞれがどんなことを実現しようとしているのか、雰囲気だけでも理解できてよかったです。

また、ECMAScriptの仕様の読み方、策定中のProposalの追っかけ方なども学びがありました。
(後者はまだコツがつかめてなくて、いつの間にかSESから分離したProposal Compartmentsなるものができてたことに気づきませんでしたが...)

この2つの記事はまだ積ん読状態なので読みたいなあ。

また、Realmsなどを理解する上でJavaScriptのPrototype Pollutionという攻撃についても学びました。
こちらの記事が非常にわかりやすかったです。

Node.jsにおけるプロトタイプ汚染攻撃とは何か - ぼちぼち日記

ChromiumMicrosoft Edgeに興味を持った

チームでブラウザ情報とかウォッチするようにしてるんですが、年明けにリリースされたChromium版のMicrosoft Edgeに関する公式ブログを読んだおかげでEdgeに興味を持つようになりました。

Chromiumベースの新しいMicrosoft Edgeについて - dackdive's blog

また、実現はできませんでしたが、このブログ記事がきっかけで勉強会に登壇しないかと声をかけていただくこともありました。

(話そうかと思ってた内容の一部を資料にまとめたものは
Chromium版EdgeのTracking Prevention機能 / Tracking Prevention in Chromium-based Microsoft Edge - Speaker Deck
です)

あんまり日本語の情報も出回ってないので、しばらくは引き続きウォッチしてこうかなーという気持ちになりました。
また、Macでも使えるようになったし、Chromiumベースだから普通に使いやすいのでデフォルトのブラウザとしても使っていこうかと。

次の四半期(2020年4〜6月)のテーマ

最初の四半期をなんとなく過ごした結果、四半期ごとぐらいの大きめのテーマと、月ごとの小さなテーマの2種類を用意しておくと自分にはいいんじゃないかなという考えになりました。

データ構造とアルゴリズム勉強するぞ!みたいな目標だと1ヶ月はハードル高いし、かといって「この本読みたい」みたいな目標であれば◯月中に終わらせる!という目標設定にした方が間延びせず良さそうです。
毎月

というわけで

長期(四半期)

引き続きデータ構造とアルゴリズム系の勉強をするぞ!ということで、次の課題図書はこちらです。

すらすら読める本であってくれ頼む〜😇

あとは密かな裏テーマとして、Rust + WebAssembly 的なところにもぼちぼち手を出したい。
今は rustlings をちまちまやっています。

またこんな情報もある。

短期

4月中は「みんなのデータ構造」を読んでると思います。
5, 6月は設計の勉強をしたい。

ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本

ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本

  • 作者:成瀬 允宣
  • 発売日: 2020/02/13
  • メディア: 単行本(ソフトカバー)

年末に立てたTryの確認

  • 英語ブログ、今年こそ書く!目標は3本
    • →何もやってない
  • 今年もどっかのカンファレンスにCfP出す
    • →何も(略
  • 「みんなのデータ構造」とあともう1冊、コンピュータサイエンスに関する本を読む
    • →「みんなのデータ構造」は続いているぞ💪
  • 本は年間で6冊読む
    • →1冊め