2018年に読んだ本

年末にまとめるつもりが新年でした。 いっぱい読んだなー。この一覧以外にも積読がたくさんある。 まったくお金がたまらない。

読み切った本

PythonとKerasによるディープラーニング

PythonとKerasによるディープラーニング

PythonとKerasによるディープラーニング

今年一番影響を受けた本。ディープラーニングの細かいところをここまで丁寧に説明している本はなかなかないと思う。非常に実践的な本

エンジニアの知的生産術

経験則でやっていた・心がけていたことをすべて文字で説明されていた。もっと効率的にやれそうなことにも気付かされたすごい本。うまく説明できないけどすごい。曖昧にやっていたことを文字にしたことがとにかく凄い。

AWSによるサーバーレスアーキテクチャ

AWSによるサーバーレスアーキテクチャ

AWSによるサーバーレスアーキテクチャ

最近のAWSの使い方を教えてくれた本。実務と完璧にマッチしたためAWSに対する意識がおおきくかわった。

Clean Architecture

Clean Architecture 達人に学ぶソフトウェアの構造と設計 (アスキードワンゴ)

Clean Architecture 達人に学ぶソフトウェアの構造と設計 (アスキードワンゴ)

オブジェクト指向、関数型などパラダイムを説明する下りがとくに気に入った。「我々はなにをしたら良いかは分からないけど、何をしてはいけないかはわかる」という言葉は最高。後半は細かすぎてすぎてついていけなかった。

基礎から学ぶVue.js

基礎から学ぶ Vue.js

基礎から学ぶ Vue.js

まったく興味がなかったけどVueをやることになったので読んだ。SPAはロジックでWebページを作っていくのでロジック書きたいマンにはVueは楽しい。HTMLとCSSがわからんので最低限のことはできるようになりたい。

Linuxのしくみ

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

2018年にOS(Linux)の仕組みを簡単に説明してくれた貴重な本。ただ誤植が多く、図がわかりにくいのが難点…。2版、3版で修正されていたら書い直したい。

Docker/Kurbenetes実践コンテナ開発入門

Docker/Kubernetes 実践コンテナ開発入門

Docker/Kubernetes 実践コンテナ開発入門

単なるDocker入門書ではなく、正しいDockerの使い方を説明した良書。最近Dockerに触れていないのでそのうち読み直したい。

スターティングGo言語

スターティングGo言語 (CodeZine BOOKS)

スターティングGo言語 (CodeZine BOOKS)

単なる入門書だろう…と高をくくっていたけど、かなり細かいところまで説明している本だった。他の言語を長年やっていてGoを始めようとしている人にはピッタリだと思う。

JavaScript関数型プログラミング

実務でTypeScript/JavaScriptを書くために読んだ本。なるほどーで終わっている

TypeScript実践マスター

TypeScript実践マスター

TypeScript実践マスター

実務でTypeScript/JavaScriptを書くために読んだ本。

読み切ったけどピンとこなかった本

UNIXという考え方

UNIXという考え方―その設計思想と哲学

UNIXという考え方―その設計思想と哲学

古典。UNIX全盛期に書かれたものなのでオラオラ感がすごい。いいことがたくさん書いてあるのだけれど、宗教色がつよいのでお腹いっぱい。

SQLアンチパターン

SQLアンチパターン

SQLアンチパターン

理論から学ぶデータベース実践入門

SQL実践入門

SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)

SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)

検索エンジンをメインで触れていたのでSQL疎くて再勉強した。ORMをばりばり使うことになったので、あまりピンとこなかった。

つまみ食い or 途中まで読んだ本

実践Vim

超良書だけど覚えることがおおいのでつまみ食いして終わっている。なんども読みかえすべきほん。今年は本格的なVim入門年でした。Vim力をたかめていきたい

Amazon Web Service 実践入門

Amazon Web Services実践入門 (WEB+DB PRESS plus)

Amazon Web Services実践入門 (WEB+DB PRESS plus)

AWSの全体像を知りたくて買ったけど、内容が古かった。実際触らないとイメージし辛いことが多いので読んでると眠くなる。

AWS Lambda実践ガイド

AWS Lambda実践ガイド

AWS Lambda実践ガイド

Lambdaの使い方をまなぶために読んだけど、途中までよんで公式を理解できるようになったので放置

Elasticsearch実践ガイド

Elasticsearch実践ガイド (impress top gear)

Elasticsearch実践ガイド (impress top gear)

業務でElasticsearchを使うことになったのでかった。スキーマ設定まで知りたかったので途中までよんだ。

Nuxt.jsビギナーズガイド

Nuxt.jsビギナーズガイド―Vue.js ベースのフレームワークによるシングルページアプリケーション開発

Nuxt.jsビギナーズガイド―Vue.js ベースのフレームワークによるシングルページアプリケーション開発

Nuxtの使い方をしるためにかった。途中で止まっている。

体系的に学ぶ安全なWebアプリケーションの作り方

ORMばかりだったので、インジェクション系がもピンとこなかった。また読み直したい。

Goプログラミング実践入門

入門書に読もうとおもったけど、いきなり読む本にしては難易度が高めだった。途中で挫折。

vimconf2018にいってきた

vimポエム。

 vimconfにいってきた。vim歴1年弱です。1年弱なのでもちろん初参加です。 vimを使うに至った理由は、 Java以外の言語をやるため だったと思います。

 Javaという世界は良い意味で異常でして、非常に高性能な開発環境がすべて無料で整います。 静的型付き言語なので補完されて当たり前だし、定義ジャンプは正確にできて当然です。 このままだとJava以外の言語やれなくなるぞと、危機感を感じemacsに手を出すもcommon lispがわからず vimに流れ着きました。

 ちなみにneovim派です。理由はpython2とpython3を同時にを使いたかったからです。 vimUbuntuだとコンパイルが面倒だったり、なぜかpython2/3の環境がうまく動作しなかったりと躓きポイントがおおく挫折しました。 vimIDEのように扱いたいという願望もあったのでneovimを使っています。

さてvimconfですが、Bram氏がくるという情報をしり、そしてmattnさんの正体も知りたく何も迷わずEarly bird チケットをゲットしました。 当日の内容で心に残った部分をざざっと書き留めると

  • 正直言うとvimの難しい話はわかならかった。登壇者の方々申し訳ない・・・

    • ですが、わからないものはわからないので諦めしょう。
  • vim-jpの窓口としての役割・存在はとても面白いとおもった。コミュニティの一つの成功例だと思う。

  • Bram氏がLSP知らないというのは面白かった。

    • エディタにはLSPのような機能は標準でいらないということなんだろう。
  • 少し前に話題になったvim.wasmのお話がきけておもしろかった

    • vimconfですが、web assemblyがどんなもの少しかわかったので勉強になった


 一つ心配になったことがあった。vim開発者が途絶えてしまうのではないか?ということだ mattnさんは、viが初めて使ったエディタで、vimは毎日差分を読んで何が更新されていたかチェックしていたとのことでした。 成長していく過程で主体的に開発に携わることはすごく重要で、とても貴重な体験だなぁと。。

 Bram氏が開発コントロールしているとはいえ、今のvimはとても膨大で新規参入のハードルは高めでして。 今回のvimconfの内容もかなり玄人むけで。 新規参入の道が狭いと、衰退の道に向かってしまう話はよくきくので いまからvimの開発に携わるには、どうしたらいいかなぁと思うのでした。 素晴らしいツールであり、素晴らしいコミュニティなので、なにかしらのかたちで役に立ちたいところです。

 直近の私にできることはvimconfに言ってtwitterでワイワイしてblogを書くことでしょう。 というわけで来年もvimconfいきます。 あーたのしかった。

※そしてmattnさんはモヒカンでも裸でもなかった。

会社で読む本と読まない本

無事に入社して2ヶ月経ちました。

自席も徐々に自分のモノであふれはじめました。 技術書も5,6冊ほど持ち込んだのですが、全く読まない本と定期的に手に取る本があることに気づきました。

先にまとめてしまうと、「手に取らない本 = Google or 公式Docで解決できてしまう本」 でした。

手に取った本

手に取らない本

  • Gitの本
  • Linuxコマンドの本
  • Dockerの解説本
  • AWSの使い方
  • 技術雑誌

まとめ

中級・上級向けの本を持っていきましょう。  

ちなみに手に取らない本が役に立たないというわけではないです。 通勤時間や暇な時間に眺めていると新しい発見があったりします。 仕事中は辞書としての役目を果たすかがとても重要で、仕事上PCの前にずっといるため ネットを上回る情報がないと職場に持ち込もう本としては不適だなと感じました。

積読を消化

年末年始はJediやDoc2Vecと格闘しつつ、積ん読の消化に励みました。

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

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

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

前半は優しい内容でしたが、後半は実践的な内容でとても勉強になる本でした。 後半だけさらっと振り返ります。

4章 スクレイピング

 Scrapyはすごい強力なツールですが、細々としたスクレイピングではちょっと重厚すぎる印象でした。 サーバーを立ち上げて、スケジュール組んで定期的にジョブをはしらせるような状況なら非常にありがたいツールです。 あとScrapy shellには驚きました。もっとはやく使えばよかった。

5章 PyData入門

 describeメソッドには感動しました。 いま開発しているニュース原稿のカテゴリー分類機は、入力データが単純なCSVなのでPyDataを使う機会がなさそうなので残念です。 センサーなどで収集した大量なデータを扱うときには強力なツールになるという印象です。

6章 Webアプリケーション開発

 DjangoでWebアプリを作っていく章でした。Djangoの使い方の流れを追いましたが、正直覚えきれてないです。それぞれのパーツの存在理由、設定理由を把握しつつ読みましたが、自主的に何か作って流れを追わないと覚えきれないですね。こればかりは仕方がありません。実戦あるのみです。

TeamGeek

Team Geek ―Googleのギークたちはいかにしてチームを作るのか

Team Geek ―Googleのギークたちはいかにしてチームを作るのか

 出版直後に購入したのですが、長年放置した1冊です。当時は会社でのチーム作業で八方塞がり状態だったので、この本を読んで平静を保つ自身がなく途中で投げ出したのを思い出しました。凄くいい本なのですが、この本を読んでだと感じたらなら、きっとその職場を去るときなのでしょう。

 内容は誰もが当たり前だと思いながらも当たり前にできないでいることが整理して書いてあります。一言でまとめるなら「仕事する相手、商売する相手、みな心をもった人間である」でしょうか。

 一番、響いたのは「ミッションステートメント」でした。前職のチームでは、ミッションステートメントが曖昧だったり、曲解したり、都合のいいように解釈したり、破ったりすることが横行していました。方向性の統一が出来てないと、検討する内容が増え、集中力が散漫になり、作業効率がどんどん落ちていきます。「ミッションステートメント」を作りみんなで守ることは、シンプルな意思決定を保つことができます。人間が作るものなので多少の間違いがあるかもしれないが、ー度決まったものは蒸し返さず守るというのはとても大事なことです。チームの方向性を定義して、プロダクトのスコープを制限する。、そしてこれを守り気持ちよく仕事をしたいものです。

つぎの本

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

 お次はリーダブルコードを読もうと思います。これも出版直後に買ったのですが、前職では毒になっていたため、パラパラ読んで放ったらかしにしていた。

VimをStrict modeにする

qiita.com

この記事に触発されました。

 Ctrl-cによるESC、十字キー、バックスペース、そしてノーマルモードでの h, l 移動を強制的に禁止します。 禁止しないとついつい使ってしまうので仕方がありません。

おすすめはしません。

vnoremap  <C-c>    <nop>
vnoremap  <Up>     <nop>
vnoremap  <Down>   <nop>
vnoremap  <Left>   <nop>
vnoremap  <Right>  <nop>
inoremap  <C-c>    <nop>
inoremap  <Up>     <nop>
inoremap  <Down>   <nop>
inoremap  <Left>   <nop>
inoremap  <Right>  <nop>
inoremap  <BS>     <nop>
noremap   <C-c>    <nop>
noremap   <Up>     <nop>
noremap   <Down>   <nop>
noremap   <Left>   <nop>
noremap   <Right>  <nop>
noremap   h <nop>
noremap   l <nop>

gensimでDoc2Vecと格闘する

 今回は少し前に大ブームになっていたらしいDoc2Vec( Word2Vec)です。Doc2Vecでも内部ではWord2Vecが動いているので、どちらにしてもWord2Vecです。gensimを使ってPythonから呼び出そうと思いましたが、困ったことに使い方がさっぱりわかりません。ネット上に転がっているサンプルは、うまく動かなかったり、どこからかコピペしたものを焼き増ししたり、説明なく謎のパラメーター設定をしてたりしていたため、自分の環境ではうまく動かせず、年末・年始を非常に有意義に消化してしまいました。

まだ詳しいところ(各種パラメーター等)理解していませんが、結果が出たので雑にまとめておきます。

 

各パラメータとサンプルコード

 今回も以前Qiitaに投稿した際に使用した、Yahooニュースの原稿を用いて学習をすすめます。

qiita.com

パラメーターについて

  • 学習率の初期値alphaは、今回かなり小さめに設定しました。ニュース原稿のような長文で複雑なデータは、非常に発散しやすいためです。
    • min_alphaもかなり小さくしています。
  • windowは変更しても大きな変化はありませんでした。
  • size(ベクトルの次元数)も100以上ではあまり変化がなく、また高次元すぎて類似度が無駄に下がるだけなので100にしています。
  • min_countはとりあえず1にしておきます。
  • その他のパラメータはデフォルトにします。
    • 下手に弄らないほうがよかったです。
  • 詳しくは公式を見るのが一番でしょう。gensim: models.doc2vec – Deep learning with paragraph2vec

以下gensimを用いたコード付近の抜粋です。抜粋なのでコピペしても動かないでしょう。

サンプルコード

def sentences():
    # wakati_gen = news_tokenizer.read_wakati()
    wakati_gen = list(news_tokenizer.read_wakati())
    random.shuffle(wakati_gen)
    for category, tokens in wakati_gen:
        # categoryはニュース記事のカテゴリー(サッカー,野球など)
        # tokensはニュース原稿を形態素解析して単語を並べたリスト
        yield doc2vec.LabeledSentence(tokens, tags=[category])

def main():
    word = 'microsoft'

    data = sentences()
 # ニュース原稿は複雑なデータなので学習率は小さめにしておく
    model = doc2vec.Doc2Vec(data, size=100,
                            alpha=0.0025,
                            min_alpha=0.000001,
                            window=15, min_count=1)
    # microsoft に最も似た単語を並べる(未学習)
    print(model.wv.most_similar(word))
    training = 10
    for epoch in range(training):
        data = sentences()
        model.train(data, total_examples=model.corpus_count, epochs=model.iter)
     # microsoft に最も似た単語を並べる(学習中)
        print(model.wv.most_similar(word))
    model.save('./data/vector/d2v/category.model')

 ネット上に転がっているソースは、学習率のmodel.alphamodel.min_alphaを訓練ループ毎に減らしているものがありました。ですが、そんなことをしなくてもWord2Vec内でデフォルトで線形に減衰していきます。(非線形に減らしたいなら別ですが)  

microsoftに類似するワードの経過

 未学習の状態ではmicrosoftとは関係ない「三十三観音」とか「クラフトビール」とかが出てきます。

 ですが最終的には「マイクロソフト」や「azure」などが出てきます。「linux」が出てくるのは、WSLが話題になった次期だからでしょうか。

おもしろい

[('pot', 0.40417373180389404), ('クリーク・アンド・リバー', 0.3955865800380707), ('アンドリュー・クライスバーグ', 0.38725024461746216), ( 'クラフトビール', 0.3792040944099426), ('三十三観音', 0.3782668709754944), ('cafe', 0.37654101848602295), ('情報基盤センター', 0.3752627968788147), ('イオンモール岡山', 0.3726036548614502), ('カッチー', 0.3725459575653076), ('輸送用機器', 0.3713015913963318)]

[('android', 0.9968464374542236), ('プラットフォーム', 0.9967312812805176), ('azure', 0.9967294931411743), ('windows', 0.9965859055519104), ('aws', 0.9965192675590515), ('ios', 0.9956364035606384), ('アップデート', 0.9955232739448547), ('提供', 0.995313286781311), ('ソリューション', 0.9951471090316772), ('セキュリティ', 0.9951217174530029)]

[('connect', 0.9941026568412781), ('linux', 0.9937072992324829), ('azure', 0.9918037056922913), ('更新プログラム', 0.9912915229797363), ('マイクロソフト', 0.9907968640327454), ('プラットフォーム', 0.9906506538391113), ('android', 0.990537166595459), ('windows', 0.9905165433883667), ('platform', 0.9904587864875793), ('商用', 0.9898083209991455)]

[('source', 0.9873005151748657), ('マイクロソフト', 0.9856327176094055), ('open', 0.9854219555854797), ('linux', 0.984656810760498), ('sdk', 0.9821251034736633), ('azure', 0.9807733297348022), ('platform', 0.9805046319961548), ('software', 0.9794276356697083), ('oss', 0.9788164496421814), ('aws', 0.9785921573638916)]
reading wakati files
[('linux', 0.9825512766838074), ('source', 0.9787257313728333), ('open', 0.9778124690055847), ('adobe', 0.9764299392700195), ('platform',0.9740426540374756), ('プラットフォーム', 0.9735702872276306), ('oss', 0.9733889102935791), ('aws', 0.9732674956321716), ('マイクロソフト', 0.9702072739601135), ('プログラミング言語', 0.9694012403488159)]


....


[('source', 0.953851580619812), ('open', 0.9504380822181702), ('linux', 0.9310433864593506), ('azure', 0.9303960204124451), ('aws', 0.9150442481040955), ('vmware', 0.9144693613052368), ('プラットフォーム', 0.9121274948120117), ('platform', 0.9118857383728027), ('ソフトウェア', 0.9039658308029175), ('開発者', 0.9016284942626953)]

ソースコード

 全コードはここにあります。ニュース原稿はありませんので、自分で集めましょう。

github.com

 もしくはロンウィットのサイトからライブドアニュースを取ってきて形態素解析するのもよいでしょう。ダウンロード - 株式会社ロンウイット

UbuntuでPythonのコードをGtags(Global)する

 Qiitaに投稿しようとおもったら、言いたいことが全部この記事に書いてあったので、はてなに残骸を記録しておく。

qiita.com

下準備

globalの入手

 aptだと古いものがインストールされてしまうので公式にから最新者をDLしてきましょう。 GNU global 公式

 自分がインストールした時は、v6.6.1でした。公式は古臭いサイトですが、わりと更新されます。

wget http://tamacom.com/global/global-6.6.1.tar.gz
tar xvf global-6.6.1.tar.gz

globalのビルドに必要なものをインストール

GNU Global公式に書いてあるものをインストールしましょう。 texinfoは書いてないですがmakeするときに怒られるので入れましょう。

sudo apt install automake autoconf gperf bison flex texinfo

Pygmentsのインストール

gtagsはデフォルトだと、C, C++, Yacc, Java, PHP4, assemblyにしか対応していませんが、Pygmentsを使うことで様々な言語のタグ付けが可能です。

pip install Pygments

globalのビルド&インストール

簡単です。もし足りないものがあるとエラーがでるので、都度入れていきましょう。

cd global-6.6.1

sh reconf.sh 
./configure
make
sudo make install

globalrcとgtags.conf

最低でもホームディレクトリに.globalrcがないとPygmentsが使えないので、デフォルトの設定ファイルをコピーしましょう。

cp /usr/local/share/gtags/gtags.conf ~/.globalrc

特定のパスはタグ付けしたくない などプロジェクトごとに細かい設定したい場合は、gtags.confというファイル名でプロジェクトのルートディレクトリに置きましょう。

cp /usr/local/share/gtags/gtags.conf ~/<PROJECT_DIRECTORY>/gtags.conf

タグ付け

Pythonのコードをタグ付けするときは、パーサーにPygmentsを選びましょう。

gtags --gtagslabel=pygments

環境変数で指定することもできます

export GTAGSLABEL=pygments
gtags

.globalrcやgtags.confでも設定できます。 default:\がnativeと記載されているので、これをpygmentsに設定しておけば、オプションの指定や環境変数の設定が不要になります。

default:\
        :tc=pygments:
        #:tc=native: