React Component ライフサイクル ひとめぐり (CodeSandbox 付き)

書籍『はじめてのフロントエンド開発』が2018年5月9日に技術評論社さまより刊行されております。

執筆プロジェクトでは React のパートを担当させていただいたのですが、執筆にあたり作成した React Component ライフサイクル に関する図 をこのたび CC0 ライセンスで公開しました。

React Component ライフサイクルに関する図

.ai および .svg フォーマットも取り揃えておりますのでどうぞご活用ください。

ところでお気づきの方もいらっしゃると思いますが、書籍執筆時点では React v16.3 のリリース前であったため、上記のダイアグラムも v16.3 で追加されたライフサイクルについての情報が盛り込まれていません。

更新版を作成する意思を見せつつ(言い訳)、今回は、React Component ライフサイクルのメソッドについて改めて整理しようという目的で筆を執りました。

Sand Box 的な何か

本エントリで登場するメソッドたちを利用したごく簡単なサンプルアプリを公開しています。

codesandbox.io

あらためて、React の Component ライフサイクルに関するメソッドについて

"React の Component ライフサイクルに関するメソッド" についての情報は公式ドキュメントにまとまっています。

reactjs.org

詳細は公式ドキュメントをご覧いただくとして、各メソッドについて簡単に整理します。

componentDidMount()

componentDidMount() は Component が Mount された後に実行されるメソッドです。用途の例は以下のとおりです。

  • Ajax を使ったデータフェッチを行う(初回)
  • DOM に対する処理を行う(初回)
  • タイマーをセットする
  • イベントリスナのセット

fetch() を利用してデータフェッチを行う例です。

fetchUser = (name: string) => {
  fetch(`https://api.github.com/users/${name}`)
    .then(res => res.json())
    .then(json => this.setState({ gitHubUser: json as GitHubUser }));
};

componentDidMount() {
  this.fetchUser(this.props.name);
}

SandBox では GitHubAPI を利用して指定したユーザーの Avatar を表示とタイマーのセットを行っています。

componentDidUpdate()

componentDidUpdate() は、Component の props または state が変更されたときに実行されます。用途の例は以下のとおりです。

  • Ajax を使ったデータフェッチを行う(二回目以降)
  • DOM に対する処理(二回目以降)
  • その他諸々

componentDidMount() は一度のみ実行されます。初回のデータフェッチは componentDidMount() に記述し、props ないし state の変更に応じて再フェッチする場合 componentDidUpdate() にも処理を書くことになります。

componentDidMount() {

  // 初回のフェッチ
  this.fetchUser(this.props.name);
}

componentDidUpdate(prevProps) {

  // props.id が変更されたら再フェッチ
  if (this.props.name !== prevProps.name) {
    this.fetchUser(this.props.name);
  }
}

SandBox では Select Box の 状態が変更された場合、GitHubAPI を再び呼び出す処理を記述しています。

componentDidMount() に無限ループするようなロジックを書いてしまいがちですので注意します。

// 無限にアップデートされ続ける
componentDidUpdate(prevProps: Props, prevState: State) {
  this.setState({ count: prevState.count++ });
}

componentWillUnmount()

componentWillUnmount() は Component が Unmount されるときに実行されます。componentDidMount() で行った処理の解除を行うことが多いでしょう。

  • タイマーを解除する
  • イベントリスナを解除する
  • 非同期処理を中止する
componentWillUnmount() {
  clearInterval(this.timerId);
}

getDerivedStateFromProps()

v16.3 で新設のメソッドです。戻り値とした Object の内容で state が更新されます。戻り値がない場合は state は更新されません。

static getDerivedStateFromProps(nextProps: Props, prevState: State) {
  const name = nextProps.name.toUpperCase();
  if (prevState.name !== name) {
    return { isDerivered: true, name };
  }
  return;
}

上記のサンプルはかなり苦肉の策感がありますが、実際、props の値をレンダリングに使うだけという場合、わざわざ state として管理する必要はありません。「初期値を props から求める + ユーザーの操作に応じて state の値が変更される」ような場合に利用します。

getDerivedStateFromProps() は static method のため、メソッド内で this.props.hoge !== nextProps.hoge のような比較処理は行えません。この点において componentWillReceiveProps() の代替ではない点に注意します。

shouldComponentUpdate()

shouldComponentUpdate() は、不要な再レンダリングを抑制してパフォーマンスの低下を防ぐ目的で利用されます。

shouldComponentUpdate(nextProps: Props, nextState: State) {

  // isVisible が変更されたときだけ再レンダリングを行う
  if (this.state.isVisible !== nextState.isVisible) {
      return true;
  }
  return false;
}

// shouldComponentUpdate() により props.text が更新されただけでは再レンダリングされない
render() {
  return <div>
    {this.state.isVisible && <p>{this.props.text}</p>}
  </div>
}

ただし、レンダリングに利用する値かどうかを shouldComponentUpdate() で判断してレンダリングのコントロールを行うことは適切ではありません。レンダリングに使用しない(が状態が変更される)ものは Class のメンバ変数として扱い state として管理しないようにします。

shouldComponentUpdate(nextProps: Props, nextState: State) {

  // (動作上は問題ないが) render() 内で利用しない状態をここで比較しているということは
  // そもそも state では無い説
  if (this.state.timerId !== nextState.timerId) {
      return false;
  }
  return true;
}

getSnapshotBeforeUpdate()

v16.3 で新設のメソッドです。getSnapshotBeforeUpdate() は、Component の再レンダリングが行われる直前に実行されます。戻り値がある場合、componentDidUpdate() の第三引数に値が渡ります。

getSnapshotBeforeUpdate() の用途としてスクロールポジションの管理に使う例が提示されています。

componentWillReceiveProps()

v1.7 で廃止予定。これまで componentWillReceiveProps() で行っていた処理は getDerivedStateFromProps() ないし componentDidUpdate() に移管できるはず。

componentWillUpdate()

v1.7 で廃止予定。同様に getDerivedStateFromProps() ないし componentDidUpdate() で代替できるはず。

componentWillMount()

v1.7 で廃止予定。使用しない。

書籍について

冒頭で言及した『はじめてのフロントエンド開発』は、パンダの表紙が目印の通称パンダ本です。

本エントリで触れた Component ライフサイクルを始め、React の "さわり" を眺めつつ、React を使った SPA を実装する流れです。TypeScript + React に挑戦してみたい方にもお勧めできます。

React、Angular、Vue.js、React Nativeを使って学ぶ はじめてのフロントエンド開発

React、Angular、Vue.js、React Nativeを使って学ぶ はじめてのフロントエンド開発

特徴としてはパンダが可愛いことです (語彙力)。

書籍で解説しているコードは下記の Repository で公開しています。あわせてご参照ください。

github.com

共著者のブログ

massa142.hatenablog.com

taisablog.com

以上です。

SQL がはじめてのひとも、ニガテなひとも - 技術評論社『これからはじめる SQL 入門』

昨年から執筆していた書籍『これからはじめる SQL 入門』(以下、本書)が 2018年5月2日に技術評論社さまより刊行されます。今回はその紹介記事を投稿します。

これからはじめる SQL入門

これからはじめる SQL入門

どんな本か

本書はいわゆる一つの SQL 入門本です。SELECT文、INSERT文、UPDATE文... にはじまり、JOIN や GROUP BY、データ型や関数などの基礎知識をひととおり解説しています。

本書では PostgreSQL 10 がサポートする SQL の構文を解説の対象としていますが、MySQLSQL Server など他の RDBMS でも通用する知識が得られるはずです。

本書はSQL の基礎知識をひととおり学ぶことを目的として書かれた一冊です。データベースとはなにか、SQLとはなにかといったことに触れつつ、SELECT文やINSERT 文などのSQL の構文を中心に解説を進めていきます。はじめてSQL を学ぶ方を対象としていますので、プログラミングやシステム開発に関する知識を前提としない内容になっています。同時に本書は、読者が本書を通読したあとに「SQL入門者」のレベルを脱していられるような情報量と難易度となっていることを狙って書かれています。

(はじめに より)

なぜ書いたのか

企画段階で編集チームよりオファーいただいたのが本書執筆のきっかけです。

また、SQL を日常的に使っているけれども苦手意識をもっているソフトウェア開発者の層が一定数いるものと認識しており、そういった方々があらためて SQL を学びなおす本があったら良いと考えたというのが動機の一つです。

ゼロから SQL を学びたいと考えている人がいるときに「これ読んでおいて」と言える本が一冊あるといいなと考えたということもありました。

本書は、筆者が初心に戻り「自分がSQL を学び始めたときにこのような解説書があればよかった」と思える一冊に仕上げようという思いで筆を執ったものです。

(はじめに より)

誰のための本か

本書は以下の方に向けて書かれています。

  • これから SQL を学ぼうとしている方
  • SQL に苦手意識をもっている方
  • 普段 O/RM に頼っていてじつは 素の SQL には自信がないという方

本書がSQL をはじめて学ぶ方の学習の手助けになること、SQL に対して苦手意識をお持ちのかたが再入門するきっかけになることを願っています。

(はじめに より)

書名のとおり初心者向けではあるものの、SQL を基礎から改めて学び直したいという方も対象としています。

こだわりポイント1 : 反復

本書を読み終えたあと、SQL が以前より肌に馴染むようになっていて欲しい、ということが本書の構成を考えるうえでこだわったポイントです。

SQL を身につけるコツとしてお勧めしている方法を本書より引用します。

筆者がSQL初心者であったころの悩みは「それぞれの意味はわからなくないけど、なかなか覚えられない」というものでした。筆者の経験を踏まえて、1 つアドバイスがあります。それはコピー& ペーストに頼らず、自分の手でタイプして体になじませるというものです。

(84ページ 章末コラムより)

具体的な方法として以下を提案しています。

  1. SQL を書き写してみる(写経)
  2. 書き写したSQL の列名や絞り込み条件を変更してみる
  3. エラーが発生することを恐れずに、期待どおりの結果がでるまで書き直す
  4. 別のSQL を書き写してみる

(84ページ 章末コラムより)

この思想にもとづき、本書では多くの SELECT文 に ORDER BY句 や LIMIT句 が付与されていたり、INSERT文 実行結果を確認するための SELECT文 を添えたりしています。

  • 解説対象外であっても ORDER BY句 や LIMIT句 を使用している例
SELECT id,
       isbn,
       user_id,
       ROUND(score)
  FROM rating
 ORDER BY id ASC
 LIMIT 3;

SQL とその実行結果を一致させるという意味においては特別な配慮ではないかも知れませんが、冗長であっても実際に頻繁に使用するであろう SQL の構文をくり返し学んだほうがよいという意図をもってサンプルコード群が構成されています。

  • INSERT文のあとに SELECT文を使用している例
INSERT INTO b2 (published_at, id, title)
VALUES ('2017-09-14', '3', 'Angular アプリケーションプログラミング');

-- INSERT文 実行後の結果を確認
SELECT *
  FROM b2
 ORDER BY id DESC;

本書では INSERT文や UPDATE文 などのテーブルに対する更新処理を行ったあと、SELECT文 で処理内容の結果を確認するようにしています。

こだわりポイント 2 : ベン図

本書では図表による解説は必要最小限にしていますが、AND句 と OR句 の解説箇所ではベン図を多用しています。

f:id:iktakahiro:20180416233438p:plain:w300
(67ページより)

f:id:iktakahiro:20180416233455p:plain:w300
(72ページより)

図解書ではないのでメインはコードと文書ですが、JOIN や WHERE句 など、初学者にとって概念が難しいと思われる部分では図説を取り入れた解説を行っています。

サポートサイト公開中

本書に関するサポートサイトとして以下のリポジトリを作成しました。本書中で利用している主要な SQL コードも公開しています。

本書中では諸般の事情により VirtualBox を使って PostgreSQL の学習環境を構築しているのですが、上記リポジトリでは Docker を利用した学習環境の構築方法を解説しています。(ここだけの話ですが、著者としては Docker 利用を推奨します...!!)

コマンドラインが苦手な方は PostgreSQL と pgweb をセットで構築できる docker-compose.yml を使ってみると幸せになれるかも知れません。

f:id:iktakahiro:20180430141529p:plain:w600
参考: pgweb を使った PostgreSQL へのアクセス

レビュー記事(随時追記)

本書のレビューにご協力いただきました @t2y さんが素敵なレビューを書いてくださっています。

t2y.hatenablog.jp

『Python エンジニアファーストブック』- Python活用 の "さわり" がコンパクトに詰まった一冊

2017年9月9日に技術評論社より『Python エンジニアファーストブック』が刊行されました。

Pythonエンジニア ファーストブック

Pythonエンジニア ファーストブック

  • 作者: 鈴木たかのり,清原弘貴,嶋田健志,池内孝啓,関根裕紀
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/09/09
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

本書は以下の構成からなります。

  • 第1章 Pythonの動向 - その特徴、歴史とコミュニティの紹介
  • 第2章 最低限知っておきたいPython言語の基本 - Pythonで開発を始める前に知っておくべきこと
  • 第3章 開発環境とチーム開発 - チーム開発で使われている開発環境とツール
  • 第4章 スクレイピング - PythonによるWebスクレイピング
  • 第5章 PyData入門ガイド - Pythonによるデータ分析のはじめの一歩
  • 第6章 Webアプリケーション開発 - Webフレームワークを使ってWebアプリケーション開発に挑戦

さまざまな場面で利用される Python の魅力のエッセンスともいうべき情報がコンパクトにまとめられた内容になっています。

その中で今回「第5章 PyData 入門ガイド」の執筆を担当いたしました。Python 本の執筆としては 2014年に『Pythonエンジニア養成読本(以下、養成読本)』の執筆チームに参加させていただいたのが初めてでして、今回はその大幅改訂版ということで個人的には感慨深くもあるプロジェクトでした。

いっぽう、これだけデータ分析業界のタレントやプレーヤーが増えてきた中で、改めて僕が本章の筆を執ることに若干の躊躇いもあったのですが、「Data Engineering のはじめの一歩」を伝える内容になれば意義もあろうというモチベーションで取り組みました。

なお、本エントリでいう「Data Engineering(データエンジニアリング)」とは、いわゆる Data Science(データサイエンス) とは異なるもので、この定義も実際容易ではないわけですが、データ収集や前処理などの工程や、ある程度フロー化された統計解析への取り組み、分析プロセスの高度な自動化(より具体的にいうとバッチ処理化やプロトタイピングのプロダクションコード化)などの領域を指しています*1

第5章は Data Engineering 領域の一部の入門的内容を取り扱っているという(自分の中での)位置づけです。

第5章 PyData 入門ガイド の読みどころ

それでは、担当章の読みどころを簡単に紹介してみようと思います。

構成

第5章の構成(= 節見出し)としては次のとおりです。

  1. PyData とは
  2. はじめての Jupyter Notebook
  3. 実践 レゴデータ分析[データ探索編]
  4. 実践 レゴデータ分析[データ可視化、分析編]
  5. Anaconda環境の利用
  6. PyData パッケージガイド

養成読本では、PyData パッケージのいくつかについてダイジェストで紹介した上で、最後にオープンデータを可視化してみるという構成でした。こんにち、パッケージの使い方的な情報はすでにありふれており、養成読本のデータの可視化はおまけ程度の内容でしたので、抜本的に改訂が必要であろうということで大方の内容を書きかえました。

メインコンテンツ紹介

「第4章 スクレイピング」で収集したレゴのデータを利用して、データの読み込み、集計、簡単な統計解析、可視化に取り組むというのがメインコンテンツです。ツール的には Jupyter、pandas、SciPy、Matplotlib が登場します。統計解析的な要素としては単回帰分析を用いています。

f:id:iktakahiro:20170922230632p:plain:w400
pandas を使ったデータ探索の解説(本書200頁)

f:id:iktakahiro:20170922230803p:plain:w400
pandas (Matplotlib) を使ったデータ可視化の解説(本書207頁)

本書全体をとおして読むと、

  1. Python の使い方がわかり
  2. スクレイピングで Web からデータが収集でき
  3. PyData パッケージを使ったデータエンジニアリングの初歩が学べる

という流れになっています。

こぼれ話

データ可視化は主に pandas の plot() メソッドを利用して行っています。

theme_ranking10 = count_theme.sort_values(ascending=False).head(10)
theme_ranking10.plot.bar(figsize=(10, 5))

さまざまな方法を検討しましたが、簡単にグラフ出力したいならたぶんこれが一番楽だと思います。Matplotlib を直接触っているところもあります。

すごく余談ですが、最近僕の中で、Python データ可視化パッケージのキャラ付けは以下のようになっています。

  • 論文書くなら Matplotlib 先生
  • 実務に手堅い Seaborn 中尉
  • お一人様なら pandas くん
  • よそゆき Bokeh さん

この話はまた別のどこかでしたいと思います(しません)。

あと執筆期間中に発覚した衝撃(?)の事実として matplotlib は固有名詞としては先頭大文字始まりの Matplotlib だったというものがありました。ロゴが小文字なので小文字と思い込んでいたのですが*2、公式ドキュメントではしっかり大文字表記でした。

回帰分析には SciPy を使っています。scikit-learn のほうが良かったという説がありますが、機械学習以前の領域を取り扱いたいということもありましたのでご容赦ください。

Anaconda と すばらしき PyData パッケージたち

Python の環境としては公式インストーラーの Python を利用する前提の解説ですが、補足情報として Anaconda の conda コマンドを紹介しています。

また Appendix 扱いで、PyData パッケージガイドとして NumPy や scikit-learn、TensorFlow などの超メジャーなものから、比較的あたらしめの PyTorch などを一覧で紹介しています。本書中でも触れているのですが、PyData 関連パッケージも日進月歩ですので、Awesome Python で探すといいよ、というのが本音ですね。

まとめ

次の書評ブログがとても端的に本書の特色を示していると思います(まとめを人様のブログに委ねるスタイル)。

massa142.hatenablog.com

本書は Python を活用してくための情報がコンパクトに詰まった一冊です。@checkpoint 渾身の Django 解説も見所です。

サイズ的にも気軽に手に取れる仕上がりですので、ぜひご覧いただければと思います。

あわせて読みたい

拙著で恐縮ですが、Jupyter や データ可視化についてもっと詳しく知りたい方向け。

PythonユーザのためのJupyter[実践]入門

PythonユーザのためのJupyter[実践]入門

4章でスクレイピングに興味をもった方へ激しくお勧めな一冊。Scrapy の詳解あります。

Pythonクローリング&スクレイピング -データ収集・解析のための実践開発ガイド-

Pythonクローリング&スクレイピング -データ収集・解析のための実践開発ガイド-

じつは Python 文法よくわかってなかったわ… という方はこちらをどうぞ。

みんなのPython 第4版

みんなのPython 第4版

*1:Data Engineer ≠ Data Scientist

*2:https://matplotlib.org/_static/logo2.svg

PythonユーザのためのJupyter実践入門 - JupyterユーザーによるPython ユーザーのためのJupyterの本

2017年9月9日に、書籍『PythonユーザのためのJupyter[実践]入門』(以下、本書)が発売になりました。僕含めた4名の著者による共著本です。

PythonユーザのためのJupyter[実践]入門

PythonユーザのためのJupyter[実践]入門

何の本か

書名に Jupyter とあるとおり、Jupyter Notebook を取り扱った書籍です。同時に、pandas 基礎、Matplotlib および Bokeh 詳解をメインコンテンツとした書籍でもあります。

jupyter.org

本書の見出しを以下に記載します。

  • 第1章: Jupyter Notebookを導入しよう
  • 第2章: Jupyter Notebookの操作を学ぼう
  • 第3章: pandasでデータを処理しよう
  • 第4章: Matplotlibでグラフを描画しよう
  • 第5章: Matplotlibを使いこなそう
  • 第6章: Bokehでグラフを描画しよう
  • 第7章: Bokehを使いこなそう
  • 第8章: Jupyter Notebookをカスタマイズしよう
  • 第9章: クラウド上でJupyter Notebookを使おう
  • 第10章: Jupyter NotebookでRubyとRを使おう
  • Appendix: ipywidgetsとJupyterLab

なぜ書いたのか

Jupyter Notebook は IPython Notebook という名称であった時代から人気のツールで僕自身もよく利用しており、何らかの形で書籍にできればよいとかねてから考えていました。

Jupyter Notebook は最低限の機能を使用するだけならマニュアルが必要ないほど簡単に利用できるツールです。それ故に、キーボード・ショートカット機能や設定ファイルの活用などより便利な用法を知らずに使われがちであると考えていました。

Matplotlib は可視化ツールとしてよく知られていますが、歴史が長く、かつ多機能であるため公式ドキュメントを手繰ったとしても機能の要所を掴むことは容易ではありません。

これらの状況を踏まえて、和書として Jupyter Notebook と可視化 について詳しく取り扱った書籍があれば有意義なのではないかという理由で執筆プロジェクトがスタートしました。

見所

著者視点で本書の見所をいくつかピックアップします。

カラーページを使い可視化例を豊富に掲載

本書では、データの可視化を中心に取り扱った一部の章について、カラーページを採用しています。

f:id:iktakahiro:20170912131735p:plain:w700

f:id:iktakahiro:20170918001405p:plain:w500

単色で表現できる簡単なグラフから、透過や重ね合わせを組み合わせた複雑なグラフのどちらもカラーで紹介しているので、具体的なイメージを確認しながら学べる内容になっています。

サブプロットが使いこなせるようになる

本書は Matplotlib の ここがわからない という疑問を解消できるように配慮して構成されています。1例として、複数のグラフを並べて 1つのプロットとする サブプロット の解説に紙面を割いています(本書144頁)。

# フィギュアの生成
fig = plt.figure()

# フィギュア内にサブプロットを3つ配置します
ax1 = fig.add_subplot(221) # 2行2列の1番
ax2 = fig.add_subplot(222) # 2行2列の2番
ax3 = fig.add_subplot(223) # 2行2列の3番

plt.show()

上記のコードに含まれるような、add_subplot(221) という記述を見たたけでは、サブプロットのコードとグラフの関係は判然としません。本書では、コードと図説を交えて、サブプロットについての解説を行っています。subplots() 関数についての言及もあります。

f:id:iktakahiro:20170918001850p:plain:w400

本書を読むことで、なんとなく利用していたサブプロットを使いこなせるようになるでしょう。

コーディングスタイルについて言及

本書では、Matplotlib のコーディングスタイルとして、通称 MATLAB-style と、オブジェクト指向スタイルである OOP-style という2つのコーディングスタイルを紹介し、後者のほうが明示的なコードであり望ましい、という意見を表明しています。

MATLAB-style のコードと、それに言及した一文を本書 252 - 253頁より引用します。

%matplotlib inline

import matplotlib.pyplot as plt

x = [1, 2, 3]
y = [3, 6, 9]

plt.bar(x, y)
plt.title('Sample Bar Chart')
plt.xlabel('X')

— 略 — まず、グラフを作成するために、pyplotモジュールのtitle()やxlabel()を直接呼び出して利用しています。このコードをアレンジして複数のグラフを描こうと考えたとき、どのようにすればよいか手がかりがありません。

また、グラフの描画について暗黙的な動作をしています。plt.xlabel(‘X’)を実行するとグラフが描画されますが、plt.xlabel(‘X’)を削除するとplt.title()の実行後にグラフが描画されます。

このトピックは公式ドキュメントにも Coding Styles*1 として解説があります。本書ではなぜ「OOP-style がいいのか」「OOP-style のどこが明示的なのか」という点をコード例を交えて解説しています。

Matplotlib のユーザー、あるいは PyData 関連パッケージのユーザー構成の特長として、いわゆるソフトウェアエンジニアではない層が一定数存在するということが挙げられます。ソフトウェアエンジニアが前提として持っている(あるいは持っていて欲しい)コーディング規約やコーディングスタイルに関する知識および関心をあまり持たないユーザーに対して、Zen of Python の設計思想を伝える意図を持って、この一節が盛り込まれました。

なんだか見所紹介が Matplotlib 推しみたいになってしまいましたが、実際推しメンなので*2 紹介してみました!

謝辞

本書の刊行にあたり、共著者のほかに、出版社のみなさま、編集プロダクションのみなさま、レビューにご協力いただいたコミュニティのみなさまの多大なるサポートをいただきました。特に、今回はレビュワーのかたのご協力なしには完遂できなかったプロジェクトでした。裏を返すと、僕の進行の拙さにより執筆チームに負担を強いる結果となり、反省も多い企画となりました。お世話になりましたみなさまには、この場を借りて心よりの御礼を申しあげます。

経過はともあれ、成果物としての本書の善し悪しは読者のみなさまにご裁定いただくものと考えています。本書がわずかでもお役に立つことを願っています。

*1:https://matplotlib.org/faq/usage_faq.html#coding-styles

*2:といいつつ、執筆箇所でいうと僕はおもに Jupyter 周りの担当でした

Python プログラミングを学ぶための準備運動 - 翔泳社『スラスラわかる Python』

このたび、縁あって『岩崎圭、北川慎治 著書、寺田学 監修 (2017). スラスラわかる Python, 翔泳社』(以下、本書) を恵贈賜りました。

著者並びに出版社の皆様にお礼とご慰労をかねまして、僭越ながら本エントリにて一読後のレビューを兼ねたブログを投稿いたします。

スラスラわかるPython

スラスラわかるPython

総評

本書は、これからプログラミングや Python を学ぶための 準備運動 として最適な一冊に仕上がっています。

初学者が Python を学び進めるにあたり、本書には次の良い点があるでしょう。

  1. ボリュームが適度
  2. Python 文法の中で重要な点が抽出されている
  3. 図説、コード、解説のバランスが良い

「1.」および「2.」について、本書が構成されるにあたり、多くの取捨選択がなされています。例えば本書では「リスト型」の説明をするにあたり Python の特長の 1つでもある「リスト内包表記」の説明はなされません。リスト型や辞書型の説明はありますが集合型の説明は省略されています。当然のようにクラスの解説も登場しません。

まず Python を知ってもらう、プログラミングが動く楽しさを体験する という観点でこの取捨選択は妥当と言えます。反面、網羅性は犠牲になっていますので、Python の基礎レベルに到達するためには最低でも別のもう1冊の書籍から学びを得る必要があります。その意味で、準備運動のつもりで本書に取り組む姿勢が望まれます。

本書を通読したということは、充分に体がほぐれたことを意味します。

その自信をつけたうえで別の−−網羅性の高いものが望ましい−−入門本を手に取り、プログラミング学習という長い道のりを走り出すのがよいでしょう。

雑感: 例外処理と型について

例外処理について改めて感じたことですが「Python の例外の仕様がわかる」と「Python で適切な例外処理が記述できる」という両者には隔絶の差があります*1。比較的平易であるとされる Python の言語仕様において例外が例外なのか (※ 駄洒落ではない) 例外処理そのものが難しいのか……。

本書でもこのことは考慮されており、入力チェックについて例外処理を濫用せずに if 文でチェックを実施する方法が参考情報として解説されています。

# 114ページのコードを一部変更したもの

def add_10(num):
    if not isinstance(num, int):
        print('Invalid num')
    
        return False

    add_num = num + 10
    print('add_num is {}'.format(add_num))

    return add_num

Python としては普通の感じですが (Early Return していて好き) 、型があればよりシンプルにな制御で済むし、False または int が戻る関数というのも少し収まりが良くありません*2。これはコード例が悪いということではなく例外処理難しいですねと思ったということです。

おそらく説明平易性を維持するために Type Hints*3 には触れられていないのだと推察しますが、こうも書けるでしょうか。

def add_10(num: int) -> int:
    add_num = num + 10
    print(f'add_num is {add_num}')

    return add_num

ただ Type Hints を付けたからといって データ型にまつわる例外処理や条件分岐を無条件で省略可能になるわけではないです。

型論争みたいなところに首を突っ込むと Python だけに藪蛇 (※ 注釈略) になりそうなので深い言及は避けたいですが、適度な制約は学習曲線向上の手助けになると感じています。つまり Python を初学者に教えるにあたり Type Hints は積極的に推していくのがよいと思っています。ただしこの考えはおそらく本流ではないです。

雑感でした。

*1:これはどんなものもそうだと思いますが、例外処理が特に、という意味です

*2:Go に慣れた今では特に。error を常に返したいと思ってしまう

*3:typing — Support for type hints https://docs.python.org/3/library/typing.html

ReDoc - Angular な静的 Webページを生成できる REST API ドキュメンテーションツール

REST API のドキュメンテーションツールにはいまだこれといった決定打がなく、定期的に「API document tool 2017」などのワードでぐぐってはブラウザを閉じ、ぐぐってはブラウザを閉じるという悶々とした日々を過ごしていました。そんなおり、以下の記事で「ReDoc」というツールを知りました。

簡単にさわってみたところ感じがよかったので紹介します。

なお、本稿で「API」と記載する場合 Web Application の RESTful API を指します。

ReDoc

ReDoc は、API ドキュメントのジェネレーターです。

github.com

手元で作成した成果物のスクリーンショットを掲載します。

f:id:iktakahiro:20170609022023p:plain

詳細は LiveDemo をご覧いただくのがよいでしょう。

ReDoc の特長

ReDoc の特長は以下のとおりです。

  • HTML に redoc.min.js と swagger.json を読み込ませるだけというお手軽設計
  • ドキュメントは Angular ベースの HTML + JS な静的ファイルとして出力される

利用方法

README のとおりですが、アプリケーションの JavaScript と API の定義ファイルを読み込むのみです。

<!DOCTYPE html>
<html>
  <head>
    <title>ReDoc</title>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1">
  </head>
  <body>
    <redoc spec-url="http://petstore.swagger.io/v2/swagger.json"></redoc>
    <script src="https://rebilly.github.io/ReDoc/releases/latest/redoc.min.js"></script>
  </body>
</html>

ローカルの swagger.json を読み込む場合は Web サーバー経由でアクセスします。

ReDoc のよさ

ReDoc のよさを語ります。

静的ファイルであることのよさ

現存する API ドキュメンテーションツールにはモック機能や実際のリクエストを発行できる機能が備わっている場合があります。Swagger UI がその代表例です。

リッチな機能を提供するためか、Swagger UI はサーバーサイドアプリケーションとして実装されていますが、 ごく個人的には、API の入出力情報を示す程度の目的を果たすために、アプリケーションサーバーを運用したくないと考えています。

ReDoc による API ドキュメントは静的ファイルとして構成されます。したがって GitHub PagesAWS S3 などを利用して Static Web Site としてドキュメントを公開できます。

デフォルトスタイルのよさ

ReDoc はデフォルトのスタイルが美しく、そのままで公開クオリティ感があります。3ペインスタイルは、しばしば API Docs 界隈(?)でお手本とされる Stripe.com の API ReferenceAuth0 の API Docs を参考にされているのではないかと推察されます。

構成もシンプルで、サービスロゴを入れたりカラムの色を調整するだけでもほどよいオリジナリティを出せる設計だと思います。

OpenAPI (Swagger) Specification を利用できることのよさ

ここ最近その動向がまったくオープンに感じられない Open API Initiative にはかなり色々思うところがありますが、さておき、OpenAPI (旧Swagger) Specification が API ドキュメントの定義ファイルとして一定の存在感を示していることは否定できません。

OpenAPI Specification のつらさもあってか、RAML のように別の “alt-YAML 的な何か” に走る動きや、そもそも JSON や YAML は無理なので、lord/slate のように Markdown で定義を書かせようという試みも見られます*1

しかしながらひとめぐりしてみると、エコシステムは大きいほうがよいということと、フォーマットとして将来変換可能であったほうがよい *2 といった理由により、次善の策として OpenAPI Specification を採用しておくのは悪手ではないように思われます。

ReDoc は OpenAPI Specification をそのまま利用できるので、いままで Swagger を利用していた場合には資産を活かせます。将来 Swagger 方面に合流することになっても問題ありません。

おわりに

API ドキュメンテーションツールは多く存在します。その中で ReDoc は、OpenAPI Specification を利用しつつ品質のよい静的 Webページを生成する*3というバランスのよいポジションに属していると思います。

まずは現存する自社の API Document をリプレースしてみようと考えています。API ドキュメンテーションをめぐるツールやプラクティスについてどこかで意見交換できるとよいですね。

*1:Apiary… うっ…頭が…

*2:Markdown のような書式では仕様がファジーになりやすく JSON や YAML などに相互変換しにくいという問題があります。仕様によりますが

*3:HTML ファイルが generate されるわけではないので、変換といったほうが適切かも知れません

ケーススタディからはじめよ - 秀和システム『フリーライブラリで学ぶ 機械学習入門』レビュー

このたび縁あって『堅田洋資, 菊田遥平, 谷田和章, 森本哲也 (2017). フリーライブラリで学ぶ 機械学習入門』(以下、本書。著者名は書籍中掲載順)を恵贈賜りました。

著者並びに出版社の皆様にお礼と慰労をかねまして、僭越ながら本エントリにて一読後のレビューを掲載いたします。

フリーライブラリで学ぶ機械学習入門

フリーライブラリで学ぶ機械学習入門

なお読者の益となるようなるべく公正な目線でレビューします。掲載されているコードの正確性については本レビューの対象外とします。

総評

昨今「機械学習、深層学習、人工知能」というトピックを扱った書籍が多く出版されています。本書もその中の一冊と言えますが、以下の点が特長です。

  • Issue を起点としたビジネス領域のケーススタディが含まれていること

本書のうちいくつかの章は、「不動産の成約価格を予測したい」「ニュース記事をグループに分けたい」というような Issue、あるいはニーズを起点に始まります。物事を学ぶにあたり目的設定は理解を深めるための手助けとなり得ます。著者の経験を根拠とするであろうケーススタディは貴重なテキストです。

  • 講義形式であること

本書の内容は著者によって開催されたワークショップの内容がベースとなっています。そのため講義形式および口語体に近い文体で記述されている章があります。この点が冗長だと感じる人もいれば、読み手にやさしいと感じる人もいるでしょう。

本書に掲載されているケーススタディに関心を持たれた方や、ワークショップ形式(の雰囲気)で機械学習を学んでみたいと考えている方は手に取ってみるとよいのではないかと思います。

なお、「フリーライブラリ」と冠されていますが、実質的に活用されているのは Python であり、サンプルコードは Jupyter Notebook 形式で公開されています*1

以下、各章をピックアップして簡単に紹介します。

第2章 予測モデルを作ってみよう

ビジネス要件が登場することが本書の1つの特長です。第2章は、「不動産仲介会社のデータサイエンティストであるあなたが、成約価格の予測システムを作らなくてはならなくなった」という状況設定のもと、予測モデル構築の流れについての解説がなされる章です。ビジネス要件を理解した上で、データを知り、特徴量を設計し、作成したモデルを評価していく… という流れです。

執筆者の堅田さんの経験に基づくものと推察され、参考になる点も多くあると思います。

第3章 クラスタリング入門

機械学習の解説書では頻出の K-means 法 *2を中心に、クラスタリングについて解説される章です。階層型クラスタリングにも言及があります(久しぶりに Dendrogram を見た気がしました)。

しばしば課題になるクラスター数の決定に関するアプローチや、K-means 法の適応に関する注意点などがあわせて解説され実践的な内容になっています。

第5章 レコメンデーション入門

古典的(?)な機械学習の適応例である、協調フィルタリングによるレコメンデーションについての解説が主です。スパースな行列を取り扱う方法としての次元削減 (Dimensionality Reduction) についても紙面が割かれています。

分類器を用いた手法によりレコメンデーションを行う方法が提案としてのみ掲載されていますが、ごく個人的には、ユーザーベース強調フィルタリングの解説は多いため、むしろこちらの詳細な解説を読みたかったりもしました。

第6章 評判分析入門

第6章は自然言語処理を活用して、映画レビュー内容のネガ/ポジ判定を行おうという章です。前提となる自然言語処理の基本、形態素解析や特徴量作成について丁寧に説明されています。

ちなみに、形態素解析の解説など一部内容が第4章の「トピックモデル入門」と重複しておりかつ第6章のほうが説明に紙面が割かれているので、自然言語処理について学びたい読者は先に6章を読んでから4章に遡ったほうが良いかも知れません。

第8章 ディープラーニング理論編 / 第9章ディープラーニング実践編

第8章、第9章は みんな大好きディープラーニングについての話題です。たびたび本書がケーススタディを軸にした解説書であると述べましたが、本章については理論ベースの解説です。

理論編では、Neural Network, Perceptron, 活性化関数などの理論から、CNN や RNN の実装についての解説があります。著者曰く「数式を1個も使わないという制約を己に課し*3」たそうで、講義形式であることも相まって読みやすい構成になっていると思います。

実践編は定番と化した Keras + TensorFlow のコンボを利用したディープラーニングの実践です。Keras を利用した画像およびテキストの分類問題への取り組みです。

Ex 補足資料

本書はある程度「Pythonが書けること」が前提となっていますが、巻末の Appendix にて、Anaconda 環境の導入や Jupyter Notebook の使い方、Python の文法(!)の解説があります。本書のサンプルコードを実行するにあたり実は Python がよく分かっていなかったことに気付いた方は、目をとおすとよいでしょう。

以上です。

関連するかもしれない書籍

  • とても売れているらしい。

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

  • 本格的に scikit-learn を活用したい方向け。

Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)

Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)

*1:https://github.com/yosukekatada/mlbook

*2:本書で実践されるのは scikit-learn に実装のある K-means++ です

*3:書籍版 251頁