akiyoko blog

akiyoko の IT技術系ブログです

「現場で使える 基礎 Django」ってどんな本? その読みどころをガッチリ解説

akiyoko です。

今回は、4月22日の「技術書典4」 *1 で頒布した人生初の技術同人誌 『現場で使える 基礎 Django』 の概要と読みどころについて解説します。


現在、オンラインショップの「BOOTH」にて、増刷した紙の本が 販売中です。*2 完売しました!

booth.pm

《2018/8/17 追記》
BOOTH で販売していた技術書典4バージョンの「現場で使える 基礎 Django」(紙の本)はおかげさまで完売いたしました。そしてこのたび、36ページの加筆(本文144⇒180ページ)、Django 2.1 対応などの改訂をおこなった「現場で使える Django の教科書《基礎編》」を Kindle Direct Publishing で出版することになりました。電子版と紙の本を予定しています。





 

概要

どんな本?

この本は、B5サイズ・148ページの 本格的な Django 解説書 です。

Django を仕事の現場で6年ほど使っている私が、日本語で書かれた書籍が少なくてずっと困っていたので自ら書きました。「現場でこんな本があったらなぁ」という想いで書いたので、仕事で使っているあなたにぴったりな本に仕上がっている はずです。


表紙はこんな感じです。
電車の中でも読めるようなものがよいと思い、派手さは極力抑えるようにしました。

f:id:akiyoko:20180531233638p:plain:w200


いわゆる「技術系同人誌」というジャンルの自費出版本になりますが、いたって真面目な技術解説書です。

表紙も含めて基本的に一人で作り上げました。レビューには Django 界隈から有志の方二人と、同僚二人に協力していただきました。スタートから入稿まで二ヶ月ほどで書きましたが、執筆にかかった時間は優に300時間を超えていると思います *3


 

内容は?

目次はこのようになっています(クリックで拡大します)。



f:id:akiyoko:20180416234902p:plain:w160

f:id:akiyoko:20180416234958p:plain:w160

f:id:akiyoko:20180416235011p:plain:w160


この本は、サンプルプロジェクトを実装ながら(読者によっては実際に手を動かしながら)技術要素を順番に説明していくような、いわゆるチュートリアル本ではありません。Django の全体像から構成要素の詳細まで、基本動作やハマりやすいポイントについて幅広く解説した本です。読者の方々に「Django って意外と簡単だな」と感じていただけることを目指して、基礎から詳しく丁寧に解説しています。


本書の構成としては、第 3 章までで Django の全体像や重要な概念の説明をおこない、 第 4 章以降でそれぞれの構成要素の説明をしながら、私の知見や経験から得たベストプ ラクティスについても紹介しています。


f:id:akiyoko:20180526163355p:plain:w250


対象読者

本書の対象読者としては、

  • Python の文法はある程度分かるけど Django は初めてという初心者の方
  • Django を始めてみたけど今いちコツが掴めないという初級者の方
  • Django のベストプラクティスを学びたいと考えている中級者の方

を想定しています。特に、

  • Django の日本語書籍が無くて困っている方
  • Django で一度挫折したことがある方

にピッタリな再入門書にもなっていると思います。
しかしながら、Webアプリケーション開発の経験がまるっきり無いという方には多少難しい内容になっているかもしれません。

 

本の評判

日本語のまとまった情報が少ないということでやはりニーズが高かったのでしょうか、技術書典4 では(強気で刷った)300部が3時間ほどで完売してしまいました。当日は初参加の上に予想をはるかに超えた売れ行きにてんてこ舞いで、全く余裕がありませんでした。



Twitter に上がっていた Django 本の感想を勝手にピックアップさせていただきました。おおむね好評のようで、ほっとしました。



本を買っていただいた上に感想までブログに書いてくださった心優しい方も何人かいらっしゃいました。本当にありがとうございます。こちらも勝手に貼り付けさせていただきます。



匿名の読後アンケートフォーム を用意して感想を聞かせていただいたのですが(現在も絶賛募集しているので是非とも感想をお願いします)、その結果もおおむね良かったようです。改善すべき点としてご指摘いただいた部分については(すでに v 1.0.1 で対応したものもありますが)今後の改訂や補足ブログのネタにさせていただきたいと思います。



 

読みどころ

章ごとの簡単な解説をしながら、本書の読みどころについて書いていきます。

第1章: はじめに

1.1  なぜ今 Django なのか?
1.2  本書について
1.3  動作環境と各種バージョン
1.4  まとめ

短く書きたかったのですが、勢い余って長くなってしまった序章。

機械学習などで Python を使う人が増えているので、Django もどんどん盛り上がってくるよねという書き出しだったのですが、実際、私がよく参加させていただいている fin-py でも「Django の勉強がしたい」という声がちらほら聞こえていましたし、最近では日本では初めての DjangoCongress が今年5月に開催されるなど、本格的な盛り上がりを感じます。


Django に少し詳しい人なら気になるのが、Django のバージョンでしょう。結論から言えば、仕事で使うなら今はまだ「1.11 LTS」、趣味で使うなら「2系」を使えばよいと考えています。この本では仕事の現場にフォーカスしたので「1.11」推しとなっていますが、実際には 1.11 と 2.0 はそんなに違いがありません(Python 2 のサポートが切られたことを除いて)。これについては追々、補足のブロク記事で解説したいと思います。


(2018/6/15 追記)
補講記事をアップしました。
akiyoko.hatenablog.jp


Python は 3.5系で動作確認しましたが、これは 3.6系でも特に問題ないはずです。改訂するのであれば、3.6系を前提に書きたいと考えています。

第2章: アーキテクチャ

2.1  全体像
2.2  MTVフレームワークとは?
2.3  まとめ

何事にもまずは全体像から掴んだ方が理解しやすいので、大枠から解説。ビューやフォーム、モデルなどの構成要素(コンポーネント)がどのように連携しながら動作しているのかを、図を見ながらざっくりと理解することができます。

第3章: プロジェクト構成

3.1  プロジェクトとアプリケーション
3.2  django-admin.py と manage.py
3.3  よくあるプロジェクト構成
3.4  ベストプラクティス1: 分かりやすいプロジェクト構成
3.5  まとめ

本章の読みどころは、startproject コマンドや startapp コマンドを使って自動生成されたファイルの説明と、分かりやすいプロジェクト構成についてです。 *4

第4章: URL ディスパッチャと URLconf

4.1  概要
4.2  URLconfの書き方
4.3  ベストプラクティス2: アプリケーションごとに urls.py を配置する
4.4  まとめ

リクエストをビュー関数に振り分ける「URLディスパッチャ」と、リクエスト URLとビュー関数をマッピングしている「URLconf」(URL設定)についての解説です。URLconf については 2系で書き方が新しくなる(ただし 1系の書き方も継続して使える)ので、そちらは補足ブログで追記したいと考えています。

第5章: ビュー(View)

5.1  概要
5.2  ビュー関数の書き方(関数ベース vs クラスベース)
5.3  全ての基本となる基本汎用ビュー
5.4  シンプルでよく使う基本汎用ビュー
5.5  さまざまな用途に特化した汎用ビュー
5.6  ログイン・ログアウトについて
5.7  まとめ

本書では、関数ベースのビューについてはほとんど説明しておらず、クラスベースビューを中心に解説しています。クラスベースビューを使う理由やメリットについてももちろん書いていますし、デメリットである継承の複雑さやオーバーライドできるメソッドや変数がどうなっているかについては、解決のヒントを提示しています。

この章に書いた、Django でのログイン・ログアウト処理は実はややこしいのですが、よく分かっていなかった人もこれを読めばだいぶスッキリすると思います。

第6章: モデル(Model)

6.1  概要
6.2  モデルクラスの書き方
6.3  「一対一」「多対一」「多対多」リレーションはどう定義するか?
6.4  よく使われるUserモデル
6.5  モデルマネージャとクエリセット
6.6  単体のオブジェクトを取得する
6.7  複数のオブジェクトを取得する
6.8  単体のオブジェクトを保存・更新・削除する
6.9  ベストプラクティス3: Userモデルを拡張する
6.10  ベストプラクティス4: 発行されるクエリを確認する
6.11  ベストプラクティス5: select_related / prefetch_related でクエリ本数を減らす
6.12  まとめ

便利だけど実はいろいろとややこしい、そんなモデルを分かりやすく解説しています。

この章は本書で最もページ数を割いたトピックですが、なぜそんなにページ数を割いたかというと、個人的にモデルが Django 最強の武器(そして最も厄介な諸刃の剣)だと考えているからです。Django を使う場合は DB を使わないことは少ないと思いますので、モデルの仕組みを理解するのは必須でしょう。

モデルの設計で重要な「一対一」「多対一」「多対多」のリレーションについては、基本から説明しています。分かりにくいモデルマネージャとクエリセット、遅延評価、関連先モデルの JOIN についても詳しく説明しています。発展編として、あまり知られていない(と思われる)「select_related」「prefetch_related」の使いどころや実際に発行される SQL 文を確認する方法についても解説しています。

またこの章では、Django の User モデルについても解説。ややこしい継承関係や User モデルのカスタマイズ方法についても取り上げています。

第7章: テンプレート(Template)

7.1  概要
7.2  変数表示
7.3  フィルタ
7.4  テンプレートタグ
7.5  ベストプラクティス6: ベーステンプレートを用意する
7.6  まとめ

Django がデフォルトのテンプレートエンジンとして利用している「DTL(Django Template Language)」の記法について解説(Jinja2 については解説していません)。数あるフィルタやテンプレートタグの中からよく使うものをピックアップして紹介しています。

第8章: フォーム(Form)

8.1  概要
8.2  バリデーションの仕組み
8.3  フォームクラスの書き方
8.4  ビューやテンプレートからフォームを利用する方法
8.5  CSRF対策について
8.6  ベストプラクティス7: こんなときは ModelForm を継承しよう
8.7  まとめ

ユーザーの入力データを保持するためのフォームですが、やはりキモとなるのはバリデーションですよね。フォームでは is_valid() を起点としてさまざまなメソッドが順番に呼ばれますが、そのややこしいバリデーションのフローを図を使って分かりやすく解説しています。また、さらにややこしい ModelForm についても何とか一枚の図にまとめてみました。必見です。

エラーに悩まされた方も多いであろう、CSRF対策(csrf_token)についてもこの章で解説しています。

第9章: ミドルウェア(Middleware)

9.1  概要
9.2  主なミドルウェアの役割
9.3  ミドルウェアの書き方
9.4  ベストプラクティス8: メッセージフレームワークを使う
9.5  まとめ

Django のミドルウェア、何となく使ってませんか?

見逃されがちなミドルウェアですが、実は縁の下の力持ちなんですよね。ということで、新規プロジェクト作成時にデフォルトで設定されるミドルウェアの役割や必要性などについて解説しています。

また、便利なメッセージフレームワーク(いわゆるフラッシュメッセージ)については、注意点やちょっとした TIPS とともにベストプラクティスとして解説しています。

あと、1.11 から導入された ミドルウェアの新しい書き方 についても言及しています。django.utils.deprecation.MiddlewareMixin を継承する書き方は非推奨にマークされているので、要注意です。

ミドルウェアについてここまできちんと書いている Django の書籍は、おそらくこれまで無かったと思います。

第10章: 設定オブジェクトと設定ファイル(settings.py)

10.1  概要
10.2  インストールするアプリケーション一覧
10.3  デバッグ設定
10.4  静的ファイルパス関連の設定
10.5  ロギングの設定
10.6  その他の重要な設定
10.7  ベストプラクティス9: 個人の開発環境の設定は local_settings.py に書く
10.8  ベストプラクティス10: シークレットな変数は .env ファイルに書く
10.9  まとめ

実はこの章が本書の一番のウリかもしれません。匿名の読後アンケート でも最も評価が高かった章の一つでもあります。

Django でつまづくパターンとして、settings.py によく分からない設定がたくさん羅列してあるのを見たり、runserver を動かしたときに何だか分からないエラーが出たりして途方に暮れる、というのがあるのではないでしょうか。あるいは、「この設定って何が正解?」「動いたけどこのままでいいんだろうか?」と悩みながら何となく使っているのではないでしょうか。

また、

  • 「INSTALLED_APPS」にはアプリケーション名を書くべきか、それとも apps.py の AppConfig のサブクラスを書くべき?
  • 静的ファイルパス関連の「STATIC_URL」「STATIC_ROOT」「STATICFILES_DIRS」の違いは一体何なの?
  • 「SECRET_KEY」や「ALLOWED_HOSTS」って何に使うの?
  • 「LOGGING」は具体的にどう設定すればいいの?

など疑問は尽きないと思います。この章ではこれらの疑問に全てお答えしています。

そして現場で利用するなら必須のベストプラクティスとして、本番用の settings.py と個人開発用のものを分けるための方法や、シークレットな変数値を環境変数に分離する方法などについても解説しています。

第11章: データベースのマイグレーション

11.1  概要
11.2  マイグレーションコマンドについて
11.3  まとめ

マイグレーションについての説明は短め。実際の運用ではもう少しディープな理解が必要かもしれませんが、紙面の都合で割愛しました。

第12章: 開発用 Web サーバ(runserver)を起動する

12.1  概要
12.2  runserver コマンドについて
12.3  まとめ

開発用の Web サーバ(runserver)の特徴や使い方、Docker で利用する場合の注意点について書きました。こちらも割とシンプルにまとめています。

第13章: 管理サイト(Django Admin)

13.1  概要
13.2  モデルの登録方法
13.3  一部機能のカスタマイズ方法
13.4  利用条件
13.5  使い方
13.6  まとめ

Django の便利な点として、この管理サイト(Django Admin)が挙げられるかと思います。ログインできるユーザーや権限などの利用条件、一部機能のカスタマイズ方法など、少し詳しめに解説しています。

第14章: 便利な Django パッケージを使おう

14.1  概要
14.2  DRY系パッケージ
14.3  開発補助系パッケージ
14.4  まとめ

実際に開発する際にほぼ必須の知識になってくる「Django パッケージ」について、選定のコツや私のオススメするパッケージをいくつか紹介しています。

第15章: サンプル実装

「本のオンラインショップ」をテーマに、ログイン・ログアウトまわりを中心に実装したサンプルプロジェクトです。本書で説明したことをベースにしたサンプル実装になっており、コードには日本語の説明をなるべく多く書きました。紙面の都合でコードの掲載はカットし、その代わりにソースコードのURLを載せています。

付録

付録A: macOS における Django 開発環境の構築方法
付録B: Docker でラクラク開発
付録C: 覚えておきたい Django 管理コマンド 10 選

ローカルPC への Python の導入方法については、技術書典バージョンでは Anaconda を使った方法について書いていましたが、読者の方からの指摘を受けて、「v1.0.1」(BOOTH での6月以降販売分)ではよりシンプルな方法に修正しています。また、Django の開発環境についても PyCharm をベースにしたものに書き直しました。

あと、自分でも最近取り入れて良かったと思っているのが「Docker でラクラク開発」です。ローカルPCの環境を汚すことがなく、要らなくなったらすぐに環境を作り直せるので、開発や検証が容易になります。



 

おわりに

「現場で使える 基礎 Django」ってどういう本なの? 買うべきなの? と悩んでいる人向けに、この本はどういう本なのか、誰にピッタリな本なのかを解説してみました。

仕事の現場で使っている人を主なターゲットにしていますが、仕事ではなく趣味で使ってるという方や、2系の情報が知りたいという方にも有益な情報がたくさん含まれているはずですので、是非ともお手にとっていただければと思います。よろしくお願いします。


《販売サイトはこちら》


おまけ

DjangoCongressJP 2018 の一日目に一般参加したのですが、偶然にも LT で発表させていただく機会を得て、「Django の同人誌を書いた話」というテーマで登壇しました。

意外と小心者なので、テンパって噛みまくりでお聞き苦しかったかと思います。その節は大変失礼いたしました。

*1:春と秋の年二回ずつ開催される、技術者による技術者のための技術系同人誌の販売イベント。今回は4回目の実施となり、参加者は6,000人を超えました。 https://techbookfest.org/event/tbf04

*2:技術書典4で頒布したものから少しだけ改訂した「v1.0.1」バージョンになります。ページ数は同じです。

*3:多忙な時期とも重なり、本当に死ぬほど疲れました。。

*4:しかしながら、これがベストか?については異論あると思います。もう少し複雑になった場合の本格的なプロジェクト構成について、もし続編を書くのであればこのあたりも補足してみたいと考えています。

4/22 の「技術書典4」で「現場で使える 基礎 Django」を頒布します

akiyoko です。

このたび、4/22 の「技術書典4」で人生初の技術系同人誌『現場で使える 基礎 Django』を頒布する ことになりました。


techbookfest.org


f:id:akiyoko:20180416235202p:plain:w300
(表紙はこんな感じになりそうです。*1




(2018/4/25 追記)

お陰さまで技術書典4では300部を3時間ほどで完売することができました。皆さま、ありがとうございました!

部数限定ですが、会場に持ち込めなかった紙の本を BOOTH にて再販致しました。現地で購入できなかった方、技術書典4に来れなかった方は是非どうぞ。

akiyoko.booth.pm



「技術書典」って何?

技術書典」は、春と秋の年二回ずつ開催される、技術者による技術者のための技術系同人誌の販売イベントです。今回が4回目の開催になりますが、毎回どんどん認知度と熱量が上がっているようで、今回天気が良ければ 3,000〜4,000人ほどの来場者で溢れ返りそうな勢いのホットなイベントなのです(行ったことないけど)。

私は初のサークル参加でもあり、初のイベント参加にもなります。

techbookfest.org

前々から何か本が書きたいなと思っていたところで「当選したら書いてみようかな」という軽いノリでこのイベントのサークル参加に申し込みをしたら、見事に抽選に当たっ(ってしまっ)たのが二月初旬。そこからちまちまと目次を作り始め、本格的に書き始めたのは二月下旬あたり。そこから泣きそうになりながら毎日明け方まで執筆することを繰り返し、ようやく脱稿できそうな目処がついて安堵感を感じ始めています。これまでに要した総時間はおそらく 300時間を超えると思います。



こちらは昨日 Twitter で聞いたアンケート。
半数が入稿済みだった。皆さん早い!!



「基礎 Django」はどんな内容?

全148ページ(表紙や奥付を除けば本文 142ページ)まるまる Django 本です。執筆はほぼ完了し、現在絶賛校正中です。


本書の読者としては、

  • Python の文法はある程度分かるけど Django は初めてという初心者の方
  • Django を始めてみたけど今いちコツが掴めないという初級者の方
  • ベストプラクティスを学びたいと考えている中級者の方

を想定しています。

私自身 Django 歴がまだまだ浅い(仕事で6年ほど)ので上級者向けの本は書けませんが、Django の動作原理から実戦的な書き方まで、初級者向けの基礎知識として押さえるべき内容は全て網羅したつもりです。読者の皆さんに「Django って意外と簡単だな」と感じていただけることを目指して、基礎から詳しく丁寧に解説しています。

特に、

  • Django の日本語書籍が無くて困っている方
  • Django で一度挫折したことがある方

にオススメです。


目次

気になる目次は、



f:id:akiyoko:20180416234902p:plain:w190

f:id:akiyoko:20180416234958p:plain:w190

f:id:akiyoko:20180416235011p:plain:w190


となる予定です。
もう動かない・・・はず。


「基礎 Django」を書いた理由は?

今回 Django 本を書いた理由はズバリ、「Django の日本語の書籍が少ない」からです。 私自身、Django をずっと仕事で使っているのですが、日本語で書かれた良書が見つからず、結局「Two Scoops of Django」シリーズという海外の書籍(個人的に「ベスト・オブ・Django本」に認定)に辿り着いたわけですが、それだと初心者向けに薦める本としてはハードルが高過ぎるのではないかとモヤモヤを感じていたのです。Django の人気が今ひとつ上がらないのも、日本語の書籍が不足していることが大きな要因になっているのではないか、と思い立ったのがきっかけです。


akiyoko.hatenablog.jp


この状況を打破すべく、「無いのなら 自分で書こう Django本」ということでまず私から書いてみることにしてみました。この本が版を重ね、将来「ベスト・オブ・Django本」と呼ばれるようになればという願いを込めて。




頒布本情報

B5サイズ、148ページ(1円玉より少し小さい 9.3 mm の厚さです!)。

技術書典での価格は 1,000円。
お釣りの煩雑さを考えての特別価格です(他のサークルさんもだいたい 1,000円にしているようです)。

部数は未定。

頒布場所は「く33」の「あきよこブログ」です。
見本誌を置いてますので、立ち読みだけでもお気軽にどうぞ。

f:id:akiyoko:20180415000417p:plain


秋葉原UDX、4/22(日) 11時オープンですが、午前中はどえらい混雑すると思いますのでご注意を。

お品書きも作りました。

f:id:akiyoko:20180421021919p:plain:w400


今悩んでいること

来週月曜(4/16)が入稿の〆切で、そこで何部刷るかを決めなくてはいけません。

これまでの技術書典の売れ行きから考えて、200部くらい刷れば十分余るかな?と考えていたのですが、「万万が一早々に売り切れてしまって、欲しいという人が買えなかったら嫌だなぁ」という邪念がムクムクと出てきてしまっている状態がまさに今なのです。


後日、BOOTH で当日売り切れなかった紙の本(電子版はもし対応可能であれば)の販売をしようと考えているので、結構余ってもいいとは考えています。


もし反響があれば少し多めに刷ろうかなとも目論んでいたりしますが、どうなることやら。


何はともあれ、技術書典の当日(4/22)、秋葉原 UDX アキバ・スクエア まで遊びに来ていただければありがたいです!

ぜひ冷やかしにきてくださいませ。

*1:黄色の丸は「Django(ダンゴ)三兄弟」です。だいぶ古いな。。

仮想通貨税金計算サービス「BITCOINTAX」をリリースしました

アカウント登録不要、完全無料で利用できる税金計算サービス「BITCOINTAX」をリリースしました


もっと手軽に仮想通貨取引の税金計算を!
ドラッグ&ドロップだけで使える税金計算サービスが登場


f:id:akiyoko:20180213212659p:plain



【 サービスURL 】
 BITCOINTAX : https://bitcointax.jp/


 

背景

「ビットコイン」「NEM」「仮想通貨」などといったキーワードが連日のようにニュースを賑わせるようになり、ビットコインを始めとする仮想通貨が国内で広く認知されるようになってきました。仮想通貨を売買できる取引所も金融庁に仮想通貨交換業者として登録された業者を中心に競い合うように次々と設立され、スマホで手軽に仮想通貨の取引ができるようになった一方で、仮想通貨取引にかかる税金計算は複雑で、専門知識のない人にとっては非常にストレスフルな作業になってしまいがちです。


昨年12月に国税庁から「仮想通貨に関する所得の計算方法等について」という資料が公表されましたが、特に仮想通貨同士の売買については取引当時の時価を計算する必要があるなど計算は煩雑です。国内の取引所ならまだしも、国外の取引所で売買した場合の日本円での時価は容易には算出できず、国税庁の方針に従って税金計算をするには困難を極めます。


2月16日より平成29年分の所得税等の確定申告受付が開始されるにあたり、これから仮想通貨の税金計算をしようとする人がその煩わしさに途方もない時間を奪われてしまう人が多く出てしてしまうことが懸念されます。最近になって仮想通貨の税金計算サービスがいくつかリリースされ始めてきましたが、いずれのサービスもアカウント登録が必要であったりと手軽に使えるものがありませんでした。


そこで「BITCOINTAX」は、

  • アカウント登録不要
  • 取引所の取引履歴ファイルをドラッグ&ドロップするだけ
  • 無料で全ての機能が利用可能

という特徴を備え、誰でも簡単に使える税金計算サービスとしてリリースいたしました。

なお、現在の対応取引所は、bitFlyer*1)、CoincheckZaif*2)、bitbankBITPointPoloniexBittrexBinanceHitBTCCryptoBridge の計10種類となっておりますが、要望次第で随時対応を予定しています。


【お知らせ】
  • Bittrex 対応済み(2018年2月15日更新)
  • ご指摘を受けて一部計算の誤りを修正しました。お手数ですが、16日以前に利用された方は再度計算し直してください(2018年2月16日更新)
  • BITPoint 対応済み(2018年2月17日更新)
  • Zaif 対応済み(2018年2月18日更新)
  • Binance 対応済み(2018年2月18日更新)
  • CryptoBridge 対応済み(2018年2月19日更新)
  • HitBTC 対応済み(2018年2月21日更新)
  • bitbank 対応済み(2018年2月23日更新)


なお、他の取引所への対応やバグの修正依頼は、admin@bitcointax.jp 宛にご連絡ください(取引履歴ファイルを添付していただけると助かります)。




日本における仮想通貨のさらなる発展と、仮想通貨に携わる方々のストレスが少しでも解消されることを願っています。




【 サービスURL 】
 BITCOINTAX : https://bitcointax.jp/


 

使い方

BITCOINTAX にアクセスし、各取引所でダウンロードした CSV形式(取引所によっては Excel形式)の取引履歴のファイルをドラッグ&ドロップするだけで利用可能です。


f:id:akiyoko:20180213214829g:plain


アカウント登録などの面倒な作業無しに、すぐに使うことができます。



【 サービスURL 】
 BITCOINTAX : https://bitcointax.jp/


 

その他の特徴

  • 複数ファイルをまとめてドラッグ&ドロップすることも可能です(最大5ファイル・1MBまで)
  • 計算結果が表示された後に、続けて別の取引所のファイルをアップロードできます(計算が全てやり直されます)
  • 計算結果が表示された後に、計算結果を CSV形式でダウンロードできます(ダウンロードした CSVファイルを再びアップロードすることもできます)
  • アップロードされたファイルはサーバで保持していません

 

計算方法

  • 時価計算方法は移動平均法による *3
  • 時価計算には以下のデータを使用
    • bitFlyer の各通貨の時価については、Cryptowatch API が提供している1〜6時間足データを使用
    • Coincheck の各通貨の時価については、Coincheck が提供している日足データを使用
    • Zaif の各通貨の時価については、Zaif が提供している日足データを使用
    • bitbank のビットコインの時価については、bitbank.cc API が提供している時間足データを使用
    • Binance の各通貨の時価については、Binance API が提供している日足データを使用
    • CryptoBridge の各通貨の時価については、CoinMarketCap が提供している日足データを使用(ただし、120通貨中 63通貨のみ。2018年2月19日現在)
    • 上記以外の海外取引所の各通貨の時価については、Kraken(BTC/USD) Poloniex API が提供している時間足データを使用(2018年2月20日更新)
    • 海外取引所の場合の USD/JPY については、ドル円為替の日足データを使用
    • 2016年1月以降のデータを使用しているため、2015年12月以前の取引がある場合には対応できない場合があります

 

免責

  • 本サービスは予告なく停止、終了、仕様が変更されることがあります
  • 本サービスの利用によって生じたいかなる損失または損害については一切の責任を負いません

 


【 サービスURL 】
 BITCOINTAX : https://bitcointax.jp/


 

問い合わせ先

パブリックな問い合わせは GitHub Issue、プライベートな問い合わせは admin@bitcointax.jp または Twitter にお願いします

*1:現物取引のみ。bitFlyer Lightning(ビットコイン現物・FX・先物取引、イーサリアム現物の取引)には未対応です。

*2:現物取引のみ。信用取引・AirFX取引・先物取引には未対応です。

*3:参考:「移動平均法(棚卸資産の評価方法)の仕訳・会計処理 | 仕訳NET

2017年に読んだ本のリスト

akiyoko です。

2017年の読書歴を振り返ってみたのですが、技術系の本や雑誌を除いて38冊読んでいました。つまり、約10日に1冊以上読んだことになります。昨年は「多読」を心掛けていたのですが、私自身としては十分過ぎる結果だったと感じています(ちなみに一昨年は11冊)。


《過去記事》
akiyoko.hatenablog.jp


なお私の読書スタイルは、気になった本はポチポチと買っておいて、ヒマが出来たときにそのときの気分に合わせて読むというのが基本です。それ以外にも、学習したいテーマに沿って次々と連鎖的に読んでいくパターンや本の中で紹介されていたものを読んでいくパターンもあります。


今回は、昨年読んだ38冊のうち19冊を紹介します。


上記以外にも、ビットコイン・仮想通貨・ブロックチェーンの勉強のために読んだ本が11冊、投資やチャートの勉強のために読んだ本が8冊ありますが、後者はまた別途紹介するかもしれません。


《過去記事》
akiyoko.hatenablog.jp


来年も自分のペースを守りながら、できるだけ多くの本を読んでいきたいと考えています。


 

マネジメント系

一昨年の年末から年頭にかけて、自身のマネジメント力の欠如が顕になってきたとひしひしと実感したので、新たに知識を投入した上で実践していきたいと考えていました。

 

1.新1分間マネジャー

オススメ度:★★★☆☆


「新1分間マネジャー」はケン・ブランチャードとスペンサー・ジョンソンの共著で古典的なベストセラー「1分間マネジャー」の新版ですが、現代風にアレンジが施されているそうです。なおスペンサー・ジョンソンは「チーズはどこへ消えた?」の著者としても有名です。


「1分間」シリーズを全部読んだという shiba_yu36 さんのブログ記事を読んで、まずはこの本を読んでみようと思い立ちました。

「1分間顧客サービス」を読んだ - $shibayu36->blog;


本自体は薄く、ストーリー形式で描かれているので、すぐに読み終えられます。

この本の核となる 1分間マネジメントの「3つの秘訣」は、「新1分間マネジャーのゲームプラン」という図で完結にまとめられています。

  • 「1分間目標」
    • (共同で)明確な目標を立てる
    • 正しい行動とはどのようなものか見せる
    • 目標を1ページに1項目ずつ書き出す
    • 素早く頻繁に目標を読み返す
    • 自分の行動を振り返り、目標と一致しているかを確認するよう奨励する
    • 一致しない場合、行動を切り替えて成功を達成できるよう促す
  • (目標または一部の目標を達成したら)「1分間賞賛」
    • 行動をほめる
    • すぐほめる。具体的にほめる
    • どれほどうれしく感じているかを伝える
    • 少し間を置いて、部下にも満足感を味わわせる
    • さらによい仕事を続けるように励ます
  • (目標を達成できなければ)「1分間修正」
    • 協力して目標を明確化する
    • 事実関係を確認する
    • ミスをすぐに検証する
    • どれほど懸念しているかを伝える
    • 少し間を置いて、部下にも不安を味わわせる
    • ミスは取り返せること、人間として評価していることを伝える
    • いつまでも引きずらない


少し前にバズった記事「GEとAdobe、人事評価制度やめたってよ。目的のためには手段はどんどん変えていく」では、今までの人事評価ではフィードバックまでのサイクルが長すぎるという問題に対して、年次評価制度を撤廃して「頻繁にフィードバックを与える」という新しい仕組みを導入したと書かれていますが、新1分マネジャーで説明されている3つの秘訣「1分間目標」「1分間賞賛」「1分間修正」も目的は同じなのではないかと感じます。短く端的なフィードバックを頻繁に与えていくことで、社員や組織を変化の激しい現代に対応できるように変えていく、そんな新しいタイプのマネジャーが望まれているということなのでしょう。


 

2.1分間マネジャーの時間管理

オススメ度:★★★★☆


ケン・ブランチャードの「1分間」シリーズは数多く出版されていますが、著者自らが管理職の参考書として薦める五作として、

を挙げています。本作「1分間マネジャーの時間管理」は、サルの世話に追われて本職のマネジメントに掛ける時間が無いと悩む中間管理職に向けて贈られた「救いの書」となっています。なお、1分間シリーズには〈1分間マネジャー〉がメンターとしてストーリー中に登場するようなので、「新1分間マネジャー」は真っ先に読んでおいた方がよさそうです。


さて、本書の核として登場する「サル」は部下の肩から飛び乗ってくる「プロジェクトやトラブルに伴う『次の対応』」を指していますが、単に「次の対応」と書かずに「サル」に見立てて書くことで、インパクト絶大で忘れられない「アイコン」になっています。

ついつい部下の肩から飛び乗ったサルの世話をしてしまうと、余計な世話を焼くダメマネジャーになってしまうというのがストーリー仕立てで語られています。そしてサルを管理するには、何を、誰が、いつまでに、どのように実行するのかを確定することが重要と説きます。また、「何のためにこれをやっているのか」を自問し、はっきりした答えが出ない場合は、サルを抹殺した方が良いとも指南しています。


いつもながらストーリー仕立てになっているのがややダラダラした感じもしますが、本自体が薄くてすぐに読み終えられるので、半日ほど空き時間があるときに一気に読んでしまうのがよいかと思います。




 

3.人を動かす

オススメ度:★★★★★


人を動かすって本当に難しいですよね。「動かす」というより「動いてもらう」にはどうすればよいか? と悩むことが多いです。そんなときの薬になる、古典中の古典。これまで読んだことが無かったので、一念発起。なお、後で紹介する「SOFT SKILLS ソフトウェア開発者の人生マニュアル」の著者ジョン・ソンメズも最も推薦する必読書として挙げています(ただし、自助・自己啓発の本として)。

内容が分かりやすくて腹落ちすることも多く、各章のラストに簡潔なまとめが書かれているのも有難いです。ということで各章のまとめを列挙してみました(多少アレンジしていますが)。

  • 人を動かす3原則
    • 批判も避難もしない。苦情も言わない
    • 素直で、誠実な評価を与える
    • 強い欲求を起こさせる


上記の「人を動かす原則だけ」でなく、「人に好かれる原則」「人を説得する原則」「人を変える原則」についても書かれていますが、いずれにしても、まずは相手を立て、誠意を持って相手の身になり、相手に重要感を与えるようにすることが大事であると説いています。つまり、尊厳欲求・承認欲求などの高次の欲求に訴えかけることが重要であるということでしょう。

  • 人に好かれる6原則
    • 誠実な関心を寄せる
    • 笑顔で接する
    • 名前を覚える
    • 聞き手に回る
    • 相手の関心を見抜いて話題にする
    • 心からほめる(重要感を与える、誠意を込めて)
  • 人を説得する12原則
    • 議論を避ける
    • 相手の意見に経緯を払い、誤りを指摘しない
    • 自分の誤りを直ちに快く認める
    • 穏やかに話す
    • 相手が即座に「イエス」と答える問題を選ぶ
    • 相手にしゃべらせる
    • 相手に思いつかせる
    • 人の身になる
    • 相手の考えや希望に対して同上を寄せる
    • 人の美しい心情に呼びかける
    • 演出を考える
    • 対抗意識を刺激する
  • 人を変える9原則
    • まずほめる
    • 遠回しに注意を与える
    • まず自分の誤りを話したあと相手に注意する
    • 命令をせず、意見を求める
    • 顔を立てる
    • わずかなことでも惜しみなく心からほめる
    • 期待をかける
    • 激励して、能力に自信を持たせる
    • 喜んで協力させる


これらは部下や組織のマネジメントとは別枠ではありますが、「心掛け」として普段から実践しやすいのは嬉しいところです。



 

4.韓非子 ― 強者の人間学

オススメ度:★★★★☆


教養系(?)なのかもしれませんが、以前から読んでみたいと思っていた韓非子です。韓非子の解説本は何冊かありますが、以前受講していた「gacco」の「中国古典に見る指導者の条件」の講義をしていた SBI大学院大学の守谷 洋教授の本をチョイスしました。


韓非子は中国戦国時代末期の法家である韓非の書で、乱世を生き抜くために君主の権力を法によって強固にすることで国を統治しようと訴える組織管理論であるとも言えます。

韓非の統治理論は、「法」(法律)、「術」(部下をコントロールするためにリーダーが身に着けるべき操縦術)、「勢」(権限)の三つを中核としています。「術」については、

  • 1.臣下の言い分を互いに照合して事実を確かめること
  • 2.法を犯した者は必ず罰して威信を確立すること
  • 3.功績を立てた者には必ず賞を与えて、やる気を起こさせること
  • 4.臣下のことばに注意し、発言に責任をもたせること
  • 5.わざと疑わしい命令を出し、思いもよらぬことをたずねてみること
  • 6.知っているのに知らないふりをしてたずねてみること
  • 7.白を黒と言い、無いことをあったことにして相手を試してみること

の7つを挙げており、トップは権力の要(賞罰の権限)を押さえ、黙って睨みを利かすのが最良だと説いています。

『韓非子』全篇を貫いているのは、徹底した人間不信の哲学である。人間を動かしている動機は、何か。愛情でもない、思いやりでもない、義理でも人情でもない、ただひとつ利益である。人間は利益によって動く動物である、というのが『韓非子』の認識であった。

といったようなフレーズが書中に何度も出てきますが、「利用者が利己的な行動をしてもそれがシステム全体としての利益に繋がる」というブロックチェーンの設計思想にも繋がる最新の考え方なのでは?と思ってしまいます。勝手な妄想ですが。。

全般的に面白い本なのですが、構成にやや疑問が残る(章の前後の関連性・繋がりに違和感がある)ので ★マイナス1としました。



 

5.これからのマネジャーの教科書

オススメ度:★☆☆☆☆


「ミドルマネジャーのための本」という触れ込みで、なかなか良さげな出だしの本だったのですが、買って損したとは言いませんが全く腹落ちしなかった本です。

グロービス経営大学院の院生へのインタビューからの実例分析なのでしょうが、主観的な分析に終始しているような印象を受けました。どこかで聞いたことのあるようなノウハウを言い回しを変えて並べただけの焼き回し本というイメージです。残念ながら私には響きませんでした。



 

教養・教育系

6.あらためて教養とは

オススメ度:★★★★☆


一昨年、教養とは何か?というのをふと考えて二冊ほど本を読んでみたのですが、釈然とせずに残っていたモヤモヤがこの本を読んで霧消しました。


当時読んだのは以下の二冊です。
① 「おとなの教養」(池上 彰)
② 「ビジネスに効く最強の「読書」 本当の教養が身につく108冊」(出口 治明)

①では、教養とは「進歩の速い世の中にあっても陳腐化しないスキル」であり、「すぐに役に立つことは、世の中に出て、すぐ役に立たなくなる。すぐには役に立たないことが、実は長い目で見ると、役に立つ」と書かれています。つまり、「長い人生を生きていく上で、自分を支える基盤になるもの」というのが教養、という理論です。

②では、教養については「人間が賢くなる方法は、人に会い、本を読み、世界を旅すること以外にない」と書かれていて、読書については「読書は知識を得るためではなく、自分の頭で考える材料を得るためにある」と書かれています。読書で考え方の幅を広げる訓練をすることで教養が磨かれるということでしょうか。

「学問、知識などによって養われた品位」という国語辞典的な意味をなぞっているだけで、何だかモヤモヤが残りますよね。


そして「あらためて教養とは」では、「自らを立てるために必要なのが教養」と書かれており、「自らを立てる」とは「揺るがない自分を創り上げる。自分に対して則(規矩)を課し、その則の下で行動できるだけの力をつける」と説明しています。なお「規矩」については、「自分独りに課したものでありながら、自分の生きる社会との関係の中で、自らと社会の協調関係の中で、見出し、自分に課していくべきもの」としています。また教養は、ドイツ語での「Buildung」が意味的に近いとし、がっちりとした基礎の上に自分という人間をきちんと創り上げていくことだと述べています。

また、「分別」というキーワードが本書に何度も登場しますが、以下の説明が分かりやすかったです。

分別(ふんべつ)のある人というのは具体的にどんな人のことをいうので... - Yahoo!知恵袋


ここで、私の「教養」に対する理解を図式化したものが以下になります。

f:id:akiyoko:20180104040316p:plain


ハイ、全然分かりませんよね(笑)。少し説明すると、本書にも書かれている通り、教養の最低限のベースは「人間としてのモラル」です。自分をきちんと律した上で、そこに幅広い知識や経験を乗せ、それを自分なりに咀嚼・吸収して分別を育てていき、いずれ揺るがない自分を自立させていくといった構図になっています。知識や経験は「栄養」、育てていくべき分別が「幹」というイメージです。自分の中では非常にスッキリしたのですが、全然スッキリしないという方は是非本書を読んでみてください。



 

7.自分を成長させる 最強の学び方

オススメ度:★☆☆☆☆


表紙だけ見ると脳科学者の茂木健一郎さんの本に見えますが(笑)違います。オンライン学習サービス「gacco」の前社長の本です。

学びの真の目的は「自分のアイデンティティを確立すること」であり、学び続けるためには、

  • 費用負担が軽くて
  • 距離・時間の自由が効き
  • モチベーションが維持できる

という学び方を選択するのがよいとの前置きがあり、それら全てを満たしている「gacco」(「モチベーションの維持」はディスカッションボード上の「学び合い教え合う」コミュニティ)で学びましょう、という宣伝本です。


学びとは「社会を知り、自分を知って、社会に自分の力がどう活かせるかを見つけ出すこと」という意見には同意ですが、結局、タイトルの「最強の学び方」って一体何?という疑問符が残ります。個人的には、学びには3つ目の「モチベーションの維持」が非常に重要だと考えていますが、「学び合い教え合う」だけでモチベーションが湧いてくるようなそんな簡単なものではないんじゃないかなと思います。勉強そのものが「楽しい」と思える人は少ないと思いますし、だからこそ、「学びの先に何があるか?(学ぶことで何が得られるのか?)」が想像できないとモチベーションの維持は難しいと考えています。「学習とは、入力(感覚)と出力(行動)が結びつくこと」というのは、まさにそういう意味だと思います。


あと細かい感想としては、

  • 目新しいことが書いていない(どこかで聞いたことがあるような話が多い)
  • データが示されてないので信憑性、根拠が乏しい

という感じでした。




 

データ分析系

データ分析系としては、昨年は「PythonユーザのためのJupyter実践入門」などの技術系の本も読みましたが、一般の読み物としては以下の一冊のみです。

 

8.「原因と結果」の経済学 ――― データから真実を見抜く思考法

オススメ度:★★★★★


因果推論の入門の入門書。ビッグデータ時代を生き抜くためのスキルとして、データ分析だけでなく、「データ分析の結果を解釈するスキル」を身に付ける必要があるとし、その一つとして、因果関係と相関関係の違いを理解し、原因と結果に本当に因果関係があるかを考えるトレーニングをすることで、思い込みや通説にとらわれない正しい判断が出来るようになると説いています。


共著者の中室牧子氏は二年前に読んだ「「学力」の経済学」を執筆していますが、その本が面白かったということもあってこの本を読み始めました。

akiyoko.hatenablog.jp


前著と同じく読みやすく、取り扱っているテーマも非常に面白いです。
経済学者で「とくダネ!」にも出演している安田洋祐氏のブログの書評でも、

データ分析に欠かせないこの因果推論を驚くほど分かりやすく解説・紹介した、現代の新教養の画期的な入門書


『「原因と結果」の経済学』が分かりやすい3つの理由 : ECONO斬り!!

と書かれている通り、取っ付きにくい因果推論に特化した本でありながら、読者が挫折しないようにいわゆる教科書的な込み入った説明や小難しい数式を使わずに、データ分析の現場での最先端の手法を紹介しています。

経済学では特に、因果関係を示唆する根拠のことを「エビデンス(科学的根拠)」と言い、「回帰分析」や「自然実験」「疑似実験」よりもエビデンスレベルが高い因果推論の理想形として「ランダム化比較実験(RCT:Randomized Controlled Trial)」が存在し、複数のランダム化比較実験を統合した「メタアナリシス」がエビデンス・ピラミッドの頂点に位置しているという構図は、日本ではまだ馴染みがないでしょう。


最後に、因果関係を読み解くための因果推論の5つのステップは以下のようになっています。

  • 1.「原因」は何か?
  • 2.「結果」は何か?
  • 3.3つのチェックポイントを確認
    • まったくの偶然ではないか
    • 交絡因子(第三の変数)が存在しないか
    • 逆の因果関係は存在しないか
  • 4.反事実を作り出す(「もっともらしい値」で置き換える)
  • 5.比較可能になるように調整



 

自己啓発系

自己啓発本は最近はあまり読まないようにしていたのですが、タイトルが気になったりしてついつい読んでしまいます。

 

9.SOFT SKILLS ソフトウェア開発者の人生マニュアル

オススメ度:★★★★☆


この本は、「ソフトウェア開発者の人生マニュアル」という副題の通り、ソフトウェア開発者の生活を豊かにするための指南書です。

「キャリア」「自分自身のマーケティング」「学び方」「生産性を上げる方法」「お金(に働かせるという考え方)」「健康をハックする方法」といった幅広い分野について具体的な実践方法を紹介しています。ソフトウェア開発者のために特化した本というよりは、著者のキャリアがソフトウェア開発者だったということで、著者自身の経験から「これは人に勧められる」と考えた方法を惜しみなく紹介しています。実践方法が具体的なので今すぐ始めようという気持ちになれますし、実際すぐに始められることが多いです。私もスクワットから始めてみました(笑)。

前半は他のソフトウェア開発本にもよくある感じであまり響かなかったのですが、後半のお金の話や健康ハックの章はグイグイ引き込まれました。開発者向けの本としてはあまり出てこない新鮮なテーマだったからでしょうか。

意識高い系のおっさんが読んでも面白いですが、学生や20代のプログラマ、SEが読むと非常に有益かと思います。



 

10.やりたいことをやれ

オススメ度:★★★☆☆


本田技研工業(ホンダ)の創業者、本田宗一郎氏の本。家の近くに工場があったのと、タイトルに釣られて何となく手に取りました。パナソニック創業者の松下幸之助氏の「道をひらく」が好きで何度も読み返していて、それと同じように人生の教訓が読めるのかと勝手に想像していたのですが、全く違いました(笑)。この本はエッセイ集で、タイトルもその中の特徴的なものを単にチョイスしただけのようで、本全体を貫くテーマでは無かったようです。うーん、紛らわしい。。

ところで本田宗一郎氏は、「頭に閃いたアイデアを実証せずにはいられない」という根っからの技術者のようです。物作りに対しては、創意、工夫、失敗を恐れない勇気が必要で、中でも特に重要なのが弾力性のある見方、物の考え方であり、アイデアであると説く一方、人間関係については、「礼儀は人間の基本」「結局は人柄」「他の人の立場、気持ちを考える」など人間愛に溢れる考え方を持っています。

また、

人を動かすことのできる人は、他人の気持ちになれる人である。そのかわり、他人の気持ちになれる人というのは自分が悩む。自分が悩んだことのない人は、まず人を動かすことはできない。

こちらが望んでいること、こうやりたいと欲していることをスムーズに受け入れてもらうためには、まず、先方の心を知らねばならない。相手の気持ちを知って、相手が理解しやすいようにもっていかなければ、心からの協力は求められないからである。

人間にとって大事なことは、学歴とかそんなものではない。やはり他人から愛され、喜んで協力してもらえるような、徳を積むことである。そしてそういう人間を育てようとする精神なのではないだろうか。

いうまでもなく、人間関係を支えるものは相互の愛であり、信頼であり、尊敬である。私はこれをひっくるめて一言でいえば、秘密を守ることだと思う。なぜかといえば、(中略)秘密を守るという行為の中に、その人の人格の要素となっているさまざまな精神的なものがにじみ出ていると思うからである。お互いに秘密を持ち、守りあう量で、人間関係の質が判断できると思う。

などといった一節は、デール・カーネギーの「人を動かす」にも通ずるものがあって面白いなと感じました。



 

11.エッセンシャル思考 最少の時間で成果を最大にする

オススメ度:★★★☆☆


エッセンシャル志向とは何か?を簡潔に表した模式図が以下になります。「より少なく、しかしより良く」を追求するために、努力の方向を絞ったのが右側の図です。

f:id:akiyoko:20180104113356p:plain:w500

「全部手に入れよう」「全部やろう」とすると本質を見失ってしまう、自分で選べない人は他人の言いなりになる、だから自分で優先順位を決めなければいけない、というのは耳の痛い言葉です。

中途半端なイエスをやめて、「絶対やりたい!」か「やらない」かの二択にしよう

は、大胆ですが本質を突いた究極の判断基準になるでしょう。

全体的に分かりやすく書かれていて、内容に特に違和感は無いのですが、もっと手短に書かれていてもいいかな(冗長すぎる)と感じたので、★をマイナス1しました。



 

投資系

SOFT SKILLS ソフトウェア開発者の人生マニュアル」で投資について書かれていたのを機に人生で初めて手を伸ばしてみた分野です。全然分からない分野なので、気になった本を手当たり次第読んでみたというのが実情です。

 

12.株で富を築くバフェットの法則 ――― 不透明なマーケットで40年以上勝ち続ける投資法

オススメ度:★★★★☆


株式投資で巨万の富を築いた伝説の投資家、ウォーレン・バフェットの半生を描いた一冊。投資の神様と言えば「バフェット」というのは聞いたことがあったので、投資の勉強をするならバフェットの本を何か一冊読んでみようと考えて辿り着いた本です。

バフェットの投資哲学は一貫していて、「簡単に理解できる事業を行っており、5年・10年・20年先にきっと今より大きな利益を上げていると思われる企業の株式を納得できる価格で買うことが投資家の目標」と本人がレポートに書いた通り長期投資をメインとし、景気や企業業績が不調のときに買うことを最良としています。ちなみにバフェットが経営するバークシャー・ハサウェイの業績は、過去50年間(1965~2014年)の平均年利(複利)で約20%という驚異的な数字を上げているとのこと。初年度に100ドル投資していれば、50年後に7万5000ドルを超えるリターンが得られる計算になります。
http://iiwsk.net/2017/07/01/%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AC%E3%83%B3%E3%83%BB%E3%83%90%E3%83%95%E3%82%A7%E3%83%83%E3%83%88%E3%81%A8%E3%81%AF/


バフェットの投資手法と言えば「バリュー投資」(実際の価値よりも割安に放置されている株を購入して本来の価値で売却する)で有名ですが、その手法に大きく影響を与えたのが、「安全なマージン」という銘柄選別法を提唱したベンジャミン・グレアム、「収益性と優れた経営者が大事」とし「理解できるものに絞り込んで投資する」というフィリップ・フィッシャー、割安でなくても良質な企業を買うチャーリー・マンガーだといいます。それについて、

グレアム、フィッシャー、マンガーへのバフェットの思い入れはよく理解できる。グレアムがバフェットに「安全なマージン」という投資の基礎を与え、感情のコントロールを教えた。フィッシャーによって、バフェットの手法は洗練され、長期投資のよい対象を見極めて集中的に投資する方法が与えられた。マンガーは、優れた事業を保有することで大きな利益がもたらされることや、投資判断で陥りがちな心理的な失敗について教えてくれた。バフェットの投資判断について、その意図をどう解釈するかでしばしば混乱が起きるが、3人の教えの組み合わせがバフェットだと考えると、その誤解は解けるだろう。

と著者は書いています。


そのほか、バフェットの考え方や人となりを知る上で非常によくまとまった本になっていると思います。バリュー投資、長期投資を戦略にしている人であれば鉄板本ではないでしょうか。なお、よく耳にするバフェット語録をまとめて読みたければ、下に挙げた「1分間バフェット」などがオススメです。



 

13.1分間バフェット お金の本質を解き明かす88の原則

オススメ度:★★★★☆


投資の神様とも称されるウォーレン・バフェットのいわゆる金言集。
「価格とは、買う時に支払うもの。価値とは、買う時に手に入れるもの」
「投資で重要なのは、自分でルールを考えることと、それを破らないこと」
「リスクとは、自分が何をやっているかよくわからない時に起こるもの」
「他人が貪欲になっている時は恐る恐る、まわりが怖がっている時は貪欲に」
などなど、シンプルでありながら深いフレーズを88個集めた一冊です。

バフェットがどんな人でどんな投資手法を取ってきたかを知った上で読むと有益と思われますので、先に紹介した「株で富を築くバフェットの法則」を合わせて読むことをオススメします。合わせて読む前提で ★★★ からプラス1で。



 

14.生涯投資家

オススメ度:★★★★☆


ニッポン放送株のインサイダー取引(村上ファンド事件)で世間を騒がせた、いわゆる「もの言う株主」村上世彰氏の波瀾万丈な半生を描いた自叙伝です。阪神電鉄の買収劇や 2006年の逮捕は一体何だったのか? が語られています。

その他、子供の頃のエピソードや氏の投資信念なども書かれていて、それだけでも読む価値があります。

企業とその経営者にとって、上場には二つのメリットがある。ひとつは、株式の流動性が上がること。すなわち、株式が換金しやすくなることだ。もうひとつは、資金調達がしやすくなることだ。逆に言えば、この二つが必要ない場合には上場する必要もない、と私は考えている。

私の投資は徹底したバリュー投資であり、保有している資産に比して時価総額が低い企業に投資する、という極めてシンプルなものだ。

投資家として大事なことは、失敗したと気が付いた時いかに素早く思い切った損切りができるか。下がり始めたら売る決断をいかに速やかにできるか、ということだ。それによって、失敗による損失を最小限に止めることができる。

期待値一・〇を超えないと、金銭的には投資する意味がない。この「期待値」を的確に判断できることが、投資家に重要な資質だと私は考えている。

「期待値」のほか、私が投資判断を行なうにあたって重要視している指標がIRR(内部収益率、InternalRateofReturn)だ。手堅く見積もっても、IRRの数字が一五%以上であることが基準となる。

投資につきものであるリスクを査定する際には、定量的な分析よりも定性的な分析が重要なポイントとなる。数字や指標の判断よりも、経営者やビジネスパートナーの性格や特徴を摑むことだ。


事件の真相については、この自伝があくまで村上氏側の主張になっているので果たして真実が何だったのかは私には判断できませんが、当時のメディアから受けたイメージは一変しました。しかしながら、全ては「コーポレート・ガバナンスとその浸透による資金循環の促進こそが経済成長を促す」という想いから、というのはあまりにも良く書かれ過ぎているんじゃないか感も否めません。氏の締め括りのフレーズをどう感じるかは、読者次第です。

私は多くの批判を受けてきた。その原因として、自分の信念を信じ、その信念に自信を持ちすぎて、早急に物事を進めすぎた場面があったことも、今になって振り返ると否定できない。しかし、その方法論や私の言動に賛否はあっても、私が目指してきたことは常に「コーポレート・ガバナンスの浸透と徹底」であり、それによる日本経済の継続的な発展である。


現在は半リタイアしてシンガポールに在住しているという村上氏ですが、Yahoo!ニュースの特集記事に氏の近影が載っていました。あの頃からだいぶ老けたなぁ、という印象です。

「日本郵政は外資が買えばいい」―― 再始動の村上世彰氏が語る - Yahoo!ニュース



 

15.お金の流れでわかる世界の歴史 富、経済、権力・・・はこう「動いた」

オススメ度:★★★★☆


意外というか(笑)予想以上に面白かった一冊。一気に読み終えました。
知っている人からすれば当り前のことなのかもしれませんが、歴史に疎い私としてはいつかもう一度読み直したい本です。


お金が歴史を大きく動かしていた、そして歴史は繰り返す、というのは示唆的で興味深いです。

国の盛衰というものには、一定のパターンがある。強い国は、財政システム、徴税システムなどが、しっかりと整っている。そして国が傾くのは、富裕層が特権をつくって税金を逃れ、中間層以下にそのしわ寄せがいくときなのである。だから国を長く栄えさせようと思えば、税金を逃れる「特権階級をつくらないこと」だといえる。
現在、タックスヘイブンなどにより、世界的規模で特権階級が生じている。ということは、世界的な規模での「国家崩壊」が近づいているのかもしれない。


 

その他

 

16.予想どおりに不合理: 行動経済学が明かす「あなたがそれを選ぶわけ」

オススメ度:★★★★★


この本は昨年読んだ本の中で一番面白かったです。
一昨年読んだ「フリー」の中にも登場していましたし、経済学者で東大名誉教授の伊藤元重先生の「ビジネスエコノミクス」の反転授業に参加したときにも話題に上っていたので結構有名な本なのかなと思ったら、ニューヨーク・タイムズのベストセラーリストに載ったほどの本だとか。著者のダン・アリエリーは現在デューク大学で心理学と行動経済学の教授職を務めており、過去には TED で何度かプレゼンテーションをしたこともあるようです。 *1


ひと言でこの本を説明すると、

わたしたち人間は、従来の経済学の見方からすると、ちっとも合理的でない行動ばかりとっているらしい。本書でも、人間の行動や決断がいかに不合理かを示す興味深い実験がいくつも紹介されている。けれども、著者がこの本全体を通じて主張しているのは、その不合理さには規則性があって予想することができ、だから解決策もある、ということだ。

という訳者あとがきの通りなのですが、行動経済学の入門書として、自ら行った実験結果や多彩なエピソードを交えて、楽しく分かりやすく解説してくれています。またその解決策としては、著者の言うように、我々の行動に規則性のある予想できる形で影響を及ぼす力(感情、相対性、社会規範など)を過小評価したり無視したりせず、我々の脳がそれらに何らかの影響を受けていると認識することで失敗を回避できるとしています。

「本当に求めているものではないのに『無料!』となると不合理に飛びつきたくなるのはなぜ?」など、日常生活でよく見かけるテーマが散りばめられていて面白く、「へえ」と頷くことしきりの一冊です。




 

17.1日ひとつだけ、強くなる。世界一プロ・ゲーマーの勝ち続ける64の流儀

オススメ度:★★★★☆


面白かったです。5年ほど前に「勝ち続ける意思力」を昔読んだのですが、より一層密度が増したように感じました。

「勝ち続ける意思力」を読んだ - akiyoko blog


まずは、「排水の逆転劇」と呼ばれる Evolution 2004 決勝戦の動画を見てください。

この派手な逆転劇に、日々の弛まぬ努力、追い詰められても焦らず判断力を乱されない心の鍛錬、卓越した大局観が凝縮されています。


たかが格闘ゲームと言えどトップの世界で勝ち続ける人の言葉は、ビジネスや人生にも通じる教訓として捉えることもできますが、世の中全体の競争が一段と激しくなりつつある中でこれらの言葉がさらに輝きを増しているようにも感じます。梅原氏も格闘ゲームのプロは真面目にさえやっていれば生きていける世界ではない、自ら積極的に成長していける人だけが勝ち残れると語っていますが、我々のビジネスにもこういった思考力や精神力がますます必要になってくるのでしょう。

もし勝ちたいのであれば、自分ではどうにもならないことに感情を動かされないよう努力したほうがいい。

勝負において自分の戦い方を崩してしまうのは、最も避けるべきことのひとつだ。僕が大切にしているのは、同じ負けにしても感情的にならずに、自分の戦い方のまま負けるということ。感情に呑まれず、自分のやるべきことをしっかりやることが最優先だ。勝ち負けはその結果でしかない。自分の戦い方を保ってさえいれば、ミスがミスを呼ぶことがない。逆転につながる可能性も出てくる。


また、リスクや投資についても鋭い考え方も持っています。リスクを恐れず前に進むには、大局観が必要とのこと。

弱い人というのは目先の損が我慢できない。状況を考えず感情で前に出てしまい、自分のリズムを崩すきっかけを作ってしまう。当然、結果も出ない。

行動力のない人には、共通点がある。特徴のひとつは、「リスク」と捉えるものが多すぎること。「あれも損」「これも損」と考えている。目先の少し損、他人の目、ちょっとした手間なんかが気になって、行動に移せないのだ。

どういうコンセプトで臨むかによって、思考の流れは変わってくる。大局観を持っていれば、ここまでは失敗できる、という線がだいたい見えてくる。大きな目で見れば、少しの失敗がリスクでもなんでもないことが分かってくる。自然と、行動力が出るようになるものだ。

大局観があれば、大きく行動できるようになる。別に正しい視点を持とうとしなくて構わない。大切なのは「仮にこういう視点はどうだろう」と考えて、その視点に沿って行動すること。自分の自由を広げることだ。

投資として、動くことのポジティブな面を考えるのが強いプレイヤー。リスクとして、動くことをネガティブに考えるのが弱いプレイヤー。


「大局観」と言えば、最近、国民栄誉賞の受賞が決定した羽生善治竜王の本「大局観 自分と闘って負けない心」を4年ほど前に読んだことを思い出しました。(現在は47歳ですが)40歳を過ぎてもさらに積極的にリスクに向き合えるようになったという変化は、大局観の賜物ということになるのでしょうか。勝負の世界に生きる最前線の人たちが同じような境地に辿り着いているというのは大変興味深いです。

《過去記事》
akiyoko.hatenablog.jp


私も大局観を意識して持つようにし、日々の変化をチャンスと思えるようにしていきたいです。




 

18.キャッチコピー力の基本 ひと言で気持ちをとらえて、離さない77のテクニック

オススメ度:★★☆☆☆


どこかで見たことのあるようなキャッチコピーのノウハウをまとめたもの。すぐに使えるようなテクニックもあり、まとめてあるので読みやすいのですが、薄いカルピスを飲んでいる感じが否めません。

コピーやライティングに関する本であれば、以前に読んだ「究極のセールスレター」の方が面白かったです。




19.雑談のトリセツ: 会話が楽しくなる!

オススメ度:★★☆☆☆


雑談がとにかく下手なので、読んでみた一冊。
ちょっとした時間に気軽に読み終えられるくらいに薄い本です。

内容については、一瞬「こんなの当り前」と思ってしまうのですが、こういう当り前が出来ていないから雑談が下手なのでしょうね。

以下、気になったところを抜粋。

  • 原則1:「話す内容を思いつきやすい」内容を喋る
  • 原則2:「思いついた内容を話しやすい」環境を作る
    • 相槌を打ち、質問をする
    • 相手が話し手のときは自分は聞き手に回る
    • 話の中に自分のことを交える
    • お互いによく知っている話題を選ぶ
    • 適度に感情が動いた話題を探す(楽しかったこと、ほっとしたこと、恥ずかしかったこと、嬉しかったこと)
    • 相手を不安な気持ちにさせない(落ち着いた態度、相手の話に興味を持っているような態度)
    • 相手に好かれるようにする(挨拶、話を聞くときには目を見る、相手の名前を会話に混ぜる、ねぎらいや感謝の言葉を掛ける、相手の話した内容を覚えておく)

2017年の akiyoko blog 振り返り

明けましておめでとうございます。
勝手に恒例にしていますが、昨年(2017年)の akiyoko blog を振り返っておきたいと思います。

f:id:akiyoko:20180102031254p:plain


ちなみに 2016年の振り返りはこんな感じでした。

<過去記事>
akiyoko.hatenablog.jp



2017年の akiyoko blog 振り返り

昨年一年間にアップした記事の本数は 37本でした。約10日に一本のペースです。

2014年をピークに 77本(2014年)→ 59本(2015年) → 44本(2016年) → 37本(2017年)と記事数が少しずつ減っていますが、アウトプットをサボっている訳ではなく、年々忙しくなっているというのもありますし(面倒なので正確な数字は測っていませんが)一記事あたりのボリュームが増えてきているようにも感じています。


全 37本中、Python 関連の記事が 14本で全体の約4割というのは前回とほぼ変わらず。しかしながら、13本と多かった Django 関連の記事は 2本に減り、代わりに pandasScrapyJupyter などのデータ分析関連の記事が増えました。


大きな変化と言えば、ブロックチェーン仮想通貨 関連の記事が増えたことでしょうか。昨年は社外の勉強会に20回参加し、その内 18本(*1)を記事としてアップしたのですが、その半数ほどがブロックチェーン、仮想通貨関連の勉強会でした。「fin-py もくもく会」には4回、「ビットコインとか勉強会」には5回も参加していました。特に fin-py は自分のやりたいことをいろいろ試せるので、来年も積極的に出ていきたいです。


ブログ記事ごとのアクセス数ランキング(akiyoko blog 2017年)

記事ごとのアクセス数ランキングです。2017年内のアクセス数(*2)ランキング上位 30本をリストアップしています。

なお昨年中に書いた記事 37本中、30位以内に入ったのは 9本でした。 *3


# 昨年比 タイトル 作成日 ポイント
1 まだ CSV の文字化けで消耗してるの?(Excel で直接開いても文字化けしない CSVファイルを Python3 で作成するスマートな方法) - akiyoko blog 2017/12/09 507.2
2 「プロジェクトマネージャ試験」に一発合格するための三か条 - akiyoko blog 2014/10/26 152.0
3 Git で コミットを無かったことにする方法 (git revert の使い方) - akiyoko blog 2014/08/21 71.9
4 IPA「情報セキュリティマネジメント試験」に一夜漬けで合格するためのたった二つの勉強法 - akiyoko blog 2016/11/17 66.6
5 あなたのパンダ(pandas)止まってませんか? 〜 Bokeh と ipywidgets でインタラクティブ Jupyter のススメ - akiyoko blog 2017/12/22 63.8
6 Python でリストのソートまとめ - akiyoko blog 2014/09/26 59.7
7 AppStore 登録前の iOSアプリを Ad-Hoc で配布してインストールする方法 - akiyoko blog 2014/08/23 48.8
8 Video.js を使って HLS形式の動画をストリーミング再生する - akiyoko blog 2015/08/11 46.4
9 pandas.DataFrame の列の抽出(射影)および行の抽出(選択)方法まとめ - akiyoko blog 2017/04/03 44.1
10 「一対一」「一対多」「多対多」のリレーションを分かりやすく説明する - akiyoko blog 2016/07/31 40.7
11 Open BroadCaster Software (OBS) で YouTube ライブストリーミングを使った動画配信をする方法 - akiyoko blog 2016/01/26 38.3
12 PyCharm のオレオレ最強設定 - akiyoko blog 2017/03/10 30.4
13 Python で Selenium WebDriver を使ったブラウザテストをする方法 - akiyoko blog 2014/04/29 25.9
14 iMovie の設定あれこれ - akiyoko blog 2016/02/01 24.5
15 Windows で R(統計解析ツール)を使う - akiyoko blog 2014/11/07 18.9
16 「Python 3 エンジニア認定基礎試験」に合格しました! - akiyoko blog 2016/12/21 18.1
17 Apple Developer Program の有効期限が切れてしまったときの対処方法 - akiyoko blog 2015/11/13 17.6
18 Mac の MySQL クライアントに「Sequel Pro」を使っているなら PostgreSQL クライアントは「PSequel」がオススメ - akiyoko blog 2016/07/29 14.6
19 Pythonのself - akiyoko blog 2012/06/27 14.1
20 見よ!これが Python製の WordPress風フルスタックCMSフレームワーク「Mezzanine(メザニン)」だ! - akiyoko blog 2015/12/23 14.0
21 初心者がプルリクまでに覚えるべきたった 9つの厳選 Gitコマンド - akiyoko blog 2014/12/02 13.7
22 まだ Moodle で消耗してるの? オープンソースの Python製 LMS「RELATE」が圧倒的にカスタマイズしやくてヤバイぞ! - akiyoko blog 2017/12/19 13.1
23 jQuery で Ajax を使ってみる - akiyoko blog 2014/07/21 12.7
24 ビットコイン・仮想通貨・ブロックチェーンの本を合計10冊読んだのでオススメ本を紹介 - akiyoko blog 2017/12/18 12.6
25 Python, Django 界隈の単体テスト事情(unittest / nose / django-nose) - akiyoko blog 2015/01/01 12.3
26 Open BroadCaster Software (OBS) の設定あれこれ - akiyoko blog 2016/01/23 12.2
27 matplotlib のグラフに日本語を表示する方法(文字化け対応) - akiyoko blog 2017/04/11 12.1
28 Pythonで単回帰直線 - akiyoko blog 2013/06/16 12.0
29 Pandas の DataFrame の基本的な使い方 - akiyoko blog 2017/03/27 11.9
30 pandas.DataFrame で時系列データの手習い - akiyoko blog 2017/04/10 11.5



#1 の「まだ CSV の文字化けで消耗してるの?(Excel で直接開いても文字化けしない CSVファイルを Python3 で作成するスマートな方法) - akiyoko blog」は、「python Advent Calendar 2017 - Qiita」の一記事として書いたものですが、公開して丸一日以上経ってから はてなのホットエントリー(テクノロジー) に出始め、そこからアクセスが瞬間的に伸びたのが要因です。結局、400 以上ブックマークされました。「文字化け」がプログラマを悩ま続ける共通のテーマだったからというよりも、「悪循環画像ジェネレータ」で作った図がウケたんじゃないかなと勘繰っています。


f:id:akiyoko:20180101182840p:plain:w400



全体的に Python 系の記事がアップしているのは、機械学習やデータ分析を扱うための中心的言語になっているなど、Python への注目度が上がっている表れなのかもしれません。特に、30位までに4記事がランクインした「pandas」、12位にランクインした「PyCharm」など、こんなニッチな記事が本人の予想を大きく超えて読まれていることに驚きを隠せません。


akiyoko.hatenablog.jp




浮かばれなかった記事

前回も書きましたが、頑張って書いたのにアクセスが全然だった「浮かばれなかった記事」は以下になります。


オープンソースのブロックチェーン「Hyperledger Sawtooth」の調査記事。ほぼ 3万字の超大作ですが、何のインパクトも残せませんでした。。

akiyoko.hatenablog.jp


お手軽データ分析シリーズの三部作。3記事で 1万5000字超えです。
ちなみに個人的には Scrapy は結構使えるなと感じています。うまくデータが抜き出せた時の楽チン度は半端ないです。

akiyoko.hatenablog.jp
akiyoko.hatenablog.jp
akiyoko.hatenablog.jp




今年の目標

記事数の目標は特にありません。

今年は何かプロダクトを作っていこうと考えていますので、それに沿った記事をメモ代わりにアウトプットできればと考えています。

*1:某ECサイトの勉強会と FinTech LT大会&忘年会 については記事を書いていません。

*2:純粋な PV数ではなく、作成日からの日数で割ったポイントで算出しています。

*3:作成日のところを黄色く塗っています。

あなたのパンダ(pandas)止まってませんか? 〜 Bokeh と ipywidgets でインタラクティブ Jupyter のススメ

この投稿は 「Jupyter Advent Calendar 2017 - Qiita」 の 22日目の記事です。


こんにちは、パンダ好きの akiyoko です。

f:id:akiyoko:20171222151740p:plain:w250

上野動物園の赤ちゃんパンダ、シャンシャン可愛いですよね〜。
Ueno Panda Live.jp というサイトで、開園日なら毎日(ただし開園時間のみ)パンダのライブ映像が見れる(オススメは3カメ!)のは皆さんもうご存知ですよね。しかしながら、たまに小一時間ほどパンタ達がじーーーっと動かないことがあるんですね。ただ寝てるだけという。こっちはあのモフモフが愛くるしく動く姿が見たいのに!! 見たいだけなのにぃ!!!!

f:id:akiyoko:20171222124515p:plain:w400
(親子水入らずで全く動かない様子。キャプチャ元:Ueno Panda Live.jp


ハァハァ。少々取り乱してしまいましたが、ところで、あなたのパンダ(pandas)も止まってしまっていませんか? というのが今回のテーマです。 *1


最近、この本を少しずつ読んでいます。

Python 界隈で大注目のデータ分析ツール「Jupyter Notebook」を中心に、1次元・2次元データを便利に扱うための「pandas」、2次元データからグラフを描画するための「Matplotlib」、インタラクティブなグラフを描画するための「Bokeh」などについて 400ページを超える大容量ボリュームで書かれており、動的・対話的なグラフを Jupyter Notebook 上に描くことが一つのゴールとなっています。


また、fin-py にも何度か参加させていただいているのですが、LT でたまに見かける、Jupyter Notebook 上でグリングリン動かせるインタラクティブなチャートに憧れを抱いていたのは私ではないはず。


いろいろ調べたり聞いたりしたところ、動的にチャートを動かす部分は Bokeh、ウィジェットの部分は ipywidgets がよさげということが分かりました。 *2

上記 Jupyter本の共著者で fin-py 主催の driller さんも昨年の「jupyter notebook Advent Calendar 2016 - Qiita」で「ipywidgetsとBokeh使ってインタラクティブな可視化をする」というズバリそのままの記事をアップしていたりします。



一周遅れになった感はありますが、今回は「Bokeh と ipywidgets でインタラクティブ Jupyter のススメ」と称して、Bokeh と ipywidgets を使って Jupyter Notebook 上の pandas のチャートをグリングリン動かしてみたい と思います。

チャートに使うデータは、CoinMarketCap から取得した今年1月からの仮想通貨の価格、および米 Yahoo Finance から取得したドル円為替を使います。



 

Bokeh, ipywidgets のインストール

現在のローカル環境は以下の通りです。

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.12.6
BuildVersion:   16G1114

$ python -V
Python 3.5.2 :: Anaconda custom (64-bit)

 

Bokeh

Anaconda をインストールしていれば、Bokeh は標準で入っていると思います。

(参考)Anaconda package lists — Anaconda 2.0 documentation


 

ipywidgets

一方の ipywidgets のインストール方法は、「Jupyter 本」の付録「A-1 ipywidgets の使い方」に詳しく書かれているのですが、私の環境ではそのままではうまく動きませんでした。

$ conda install -conda-forge ipywidgets

として、

from ipywidgets import interact

@interact(n=5)
def f(n):
    return n

を実行してもウィジェットが起動せず。実行するたびに、Jupyter Notebook のログに

[IPKernelApp] WARNING | Widget Javascript not detected.  It may not be installed or enabled properly.

というワーニングが出ている状態。
結局、ipywidgets が利用している widgetsnbextension のバージョンが「3.0.0」だとダメっぽいと判断。一旦、2系に戻しました。

$ conda install 'widgetsnbextension<3'

とし、

$ jupyter notebook

を止めて、再度立ち上げ直せば動くようになりました。

f:id:akiyoko:20171222140001p:plain

$ pip list | grep bokeh
bokeh (0.12.2)

$ pip list | grep widgets
ipywidgets (6.0.0)
widgetsnbextension (2.0.0)

 

データ収集

仮想通貨の日足チャート

Scrapy という Python 製のクローリング・スクレイピングツールを使って CoinMarketCap から 1月からの日足チャートを取得し、ローカルに CSVファイルとして保存しました。


《過去記事》
akiyoko.hatenablog.jp


なお、Scrapy を使った今回のスクレイピング実行コードは
github.com
に置いてあります。
実行環境は Python 3.5 です。


取得したデータはこのような形式で保存されています。


BTC.csv

symbol,date,open,high,low,close,volume,market_cap
BTC,"Dec 20, 2017",17760.30,17934.70,16077.70,16624.60,"22,149,700,000","297,526,000,000"
BTC,"Dec 19, 2017",19118.30,19177.80,17275.40,17776.70,"16,894,500,000","320,242,000,000"
BTC,"Dec 18, 2017",19106.40,19371.00,18355.90,19114.20,"14,839,500,000","320,000,000,000"
  ...
BTC,"Jan 03, 2017",1021.60,1044.08,1021.60,1043.84,"185,168,000","16,426,600,000"
BTC,"Jan 02, 2017",998.62,1031.39,996.70,1021.75,"222,185,000","16,055,100,000"
BTC,"Jan 01, 2017",963.66,1003.08,958.70,998.33,"147,775,000","15,491,200,000"

ETH.csv

symbol,date,open,high,low,close,volume,market_cap
ETH,"Dec 20, 2017",827.52,845.06,756.00,819.09,"3,969,940,000","79,810,600,000"
ETH,"Dec 19, 2017",793.90,881.94,785.34,826.82,"4,096,550,000","76,552,200,000"
ETH,"Dec 18, 2017",721.73,803.93,689.23,794.64,"3,249,230,000","69,578,400,000"
  ...
ETH,"Jan 03, 2017",8.37,10.00,8.32,9.73,"33,625,200","732,988,000"
ETH,"Jan 02, 2017",8.17,8.44,8.05,8.38,"14,579,600","714,900,000"
ETH,"Jan 01, 2017",7.98,8.47,7.98,8.17,"14,731,700","698,149,000"



ローカルに保存した仮想通貨の日足チャートの CSVファイルを全て読み込みます。1ファイルごとに 1通貨のチャートが入っているので、とりあえず行方向に連結しておきます。

import glob
import pandas as pd

pd.options.display.max_rows = 10

df_all = pd.DataFrame()
paths = glob.glob('/Users/akiyoko/PycharmProjects/ccspider/downloads/*.csv')
for path in paths:
    df = pd.read_csv(path, index_col='date', parse_dates=True)
    df = df.sort_index()
    df_all = df_all.append(df)

df_all

f:id:akiyoko:20171222141316p:plain:w400


例えば、BTC のチャートを取り出すときは以下のようにすればよいでしょう。

df_all[df_all.symbol == 'BTC']

f:id:akiyoko:20171222144226p:plain:w400


pandas.DataFrame の条件による切り出しについては、過去記事に詳しい説明があります。

《過去記事》
akiyoko.hatenablog.jp


 

ドル円為替の日足チャート

ドル円為替は、pandas-datareader というライブラリを使って、米 Yahoo Finance から日足チャートデータを取得しました。

import pandas_datareader.data as DataReader

df_usdjpy = DataReader.get_data_yahoo('JPY=X', start='2017-01-01', end='2017-12-31')
df_usdjpy

f:id:akiyoko:20171222143621p:plain:w400


pandasで為替データUSD/JPYの取得 - はしくれエンジニアもどきのメモ」を参考にさせていただきました。


それにしても、pandas-datareader スゴイ!
たった一行で為替チャートが取ってこれるのですね。他にも株価や世界人口、GDP のデータも簡単に取れるようです。

(参考)pandas-datareaderで株価や人口のデータを取得 | note.nkmk.me


 

実践

移動平均線

まず、n日移動平均のチャートをハンドルで動かせるようにしてみます。ここまではほぼ「Jupyter 本」のパクリです。

from bokeh.io import output_notebook, push_notebook, show
from bokeh.plotting import figure
from ipywidgets import interact

output_notebook()
plot = figure(plot_width=600, plot_height=300, x_axis_type='datetime')
df = df_all[df_all.symbol == 'BTC']
close = plot.line(df.index, df['close'])
ma = plot.line(df.index, df['close'].rolling(10).mean(), color='red')
handle = show(plot, notebook_handle=True)

@interact(n=(0, 30))
def redraw(n=10):
    ma.data_source.data = {'x': df.index, 'y': df['close'].rolling(n).mean()}
    push_notebook(handle=handle)

f:id:akiyoko:20171223171743g:plain:w500


ハンドルを動かすと、赤色の移動平均線がグリグリ動きます。気持ちいいです。


 

ドロップダウンで通貨を入れ替え

次に、pandas.DataFrame の条件による切り出しを使って、ドロップダウンの条件によって通貨を入れ替えられるようにしてみました。

from bokeh.io import output_notebook, push_notebook, show
from bokeh.plotting import figure
from ipywidgets import interact

output_notebook()
plot = figure(plot_width=600, plot_height=300, x_axis_type='datetime')
df = df_all[df_all.symbol == 'BTC']
close = plot.line(df.index, df['close'])
ma = plot.line(df.index, df['close'].rolling(10).mean(), color='red')
handle = show(plot, notebook_handle=True)

@interact(symbol=['BTC', 'ETH', 'BCH', 'XRP', 'LTC', 'MIOTA', 'ADA', 'DASH', 'XEM', 'BTG'], n=(0, 30))
def redraw(symbol='BTC', n=10):
    df = df_all[df_all.symbol == symbol]
    close.data_source.data = {'x': df.index, 'y': df['close']}
    ma.data_source.data = {'x': df.index, 'y': df['close'].rolling(n).mean()}
    push_notebook(handle=handle)

f:id:akiyoko:20171223174020g:plain:w500


Market Cap の上位10通貨を切り替えられるようにしてみましたが、なかなか面白いです。



 

USD ⇔ JPY の切り替え

最後に、USD と JPY の価格表示が切り替えられるようなチェックボックスを付けてみました。

df に「close_jpy」列を追加し、通貨の終値(USD)とドル円為替の終値(1USD あたりの JPY)を掛けた値を入れています。なお、為替は相場が休みの日はデータが取れない(N/Aになる)ため、「fillna(method='ffill')」を使って前日のデータで補完しています。

from bokeh.io import output_notebook, push_notebook, show
from bokeh.plotting import figure
from ipywidgets import interact

output_notebook()
plot = figure(plot_width=600, plot_height=300, x_axis_type='datetime')
df = df_all[df_all.symbol == 'BTC']
close = plot.line(df.index, df['close'])
ma = plot.line(df.index, df['close'].rolling(10).mean(), color='red')
handle = show(plot, notebook_handle=True)

@interact(symbol=['BTC', 'ETH', 'BCH', 'XRP', 'LTC', 'MIOTA', 'ADA', 'DASH', 'XEM', 'BTG'], n=(0, 30), jpy=False)
def redraw(symbol='BTC', n=10, jpy=False):
    df = df_all[df_all.symbol == symbol]
    # interpolate() causes ValueError: Out of range float values are not JSON compliant... why?
    #df = df.assign(close_jpy=(df['close'] * df_usdjpy['Close']).interpolate())
    df = df.assign(close_jpy=(df['close'] * df_usdjpy['Close']).fillna(method='ffill'))
    y = df['close_jpy'] if jpy else df['close']
    close.data_source.data = {'x': df.index, 'y': y}
    ma.data_source.data = {'x': df.index, 'y': y.rolling(n).mean()}
    push_notebook(handle=handle)

f:id:akiyoko:20171223173442g:plain:w500


全体的に 5月、12月に何があったの??という感じのチャートになっています。


 

まとめ

pandas.DataFrame は時系列データを保持したりチャートを描いたりするのに非常に便利に使えますが、Bokeh と ipywidgets でインタラクティブにチャートを描画できるようにすれば、見栄えもよくもっと強力なツールになります。


そんな Bokeh や ipywidgets についてもしっかり書かれている「Jupyter 本」はスゲエなってことを今回再認識しました。つまり、買えってことです(笑)。


ちなみに今回の Advent Calendar では当初、pandas.DataFrame の resample を使ってインタラクティブに5分足 ⇔ 1時間足 ⇔ 日足といったようにチャートを書き換えられるようにしたかったのですが、うまく動かすことができませんでした。figure の X軸を書き換えるのは難しいのかもしれませんね。。


明日は、u1and0 さんの「Jupyter Advent Calendar 2017 - Qiita」 23日目の記事です。よろしくお願いします。




 

おまけ

今回の件とは直接関係ありませんが、notebook 保存時に以下のエラーが出てファイルを保存できなくなって困ってしまいました。

f:id:akiyoko:20171222150328p:plain

結局、
python - plotly plots in jupyter notebooks: Validation fails when saving - Stack Overflow
に書かれているように、

$ conda update nbformat

を更新してから、

$ jupyter notebook

を止めて再度立ち上げ直せば、保存できるようになりました。

原因は不明ですが、急に動かなくなると焦りますよね。

*1:なお、pandas の名前の由来は「panel data」らしいです。 pandasで使われるデータ構造 ~1次元、2次元、3次元のデータの扱い方~ - 今日も窓辺でプログラム

*2:ipywidgets については「Jupyter 本」にも説明があります。

まだ Moodle で消耗してるの? オープンソースの Python製 LMS「RELATE」が圧倒的にカスタマイズしやくてヤバイぞ!

この投稿は 「Django Advent Calendar 2017 - Qiita」 の 19日目の記事です。


こんにちは、akiyoko です。

「Django Advent Calendar」は 2年連続 4度目の参加になります。昨年は最後まで枠が空いていたので、調子に乗って3日分も担当してしまいました。 *1, *2, *3


あと、2年前に Python製 CMS「Mezzanine」を紹介したときの流れで、煽りタイトルを付けてしまいました。重ね重ね申し訳ございません。

《過去記事》
akiyoko.hatenablog.jp



 

はじめに

オープンソースの LMS(学習管理システム)と言えば、

などがまず真っ先に挙げられますが、今回紹介するのは、Python 製で Webフレームワークの代表格「Django」をベースに開発されたオープンソースの LMS、その名も「RELATE」です。 *4


例えば、Pythonista なあなたが LMS を開発することになったとしましょう。
良さげな候補が Moodle しか見つからず、「仕方ない、Moodle をカスタマイズするか。はぁ、PHP か・・」というのは精神衛生上よろしくないですよね?(すいません、個人の意見です。)

そんなとき、Moodle じゃない Python製の LMS があればワクワクしてきませんか? ・・しませんか、そうですか。


あとよく聞くのは、Moodle は要らない機能が多すぎるという問題。ちょっとしたテキストと動画、小テスト(クイズ)が受講できる講座をオンラインで実施したいだけなら、もっとシンプルなものが求められるケースもありますよね。


しかも、Moodle は GPLライセンス のため、Moodle をカスタマイズしてオンライン学習サービスをリリースした場合にはソースコードの公開が求められることになります。

Moodleはコピー・利用・修正してかまいませんが,条件として,ソースコードを公開し,元のライセンスや著作権表示を修正したり削除したりせず,同じライセンスをMoodleから派生したソフトにも与えなければなりません。


Moodleとは - MoodleDocs


そのため、BtoB 向けに Moodle をカスタマイズして提供するというのはライセンス上どうしても困難な面があるかと思います。その点、RELATE は MITライセンス なのでソースコードの公開義務はありません。機能追加し放題、思う存分カスタマイズすることができます。



 

RELATE の特徴

まず、RELATE には、

  • Python 製、Django ベース
  • コースコンテンツを Markdown 形式で記述(プログラマ向け!)
  • コースコンテンツは1講座ごとに Git 管理(管理画面でバージョンの切り替えも可能)
  • VideoJS による動画埋め込みを標準サポート
  • 日本語にも翻訳可能 *5

といった特徴があります。中でも、コースコンテンツを Markdown で書くという特徴はオンリーワンじゃないでしょうか(私の知る限りで)。


画面はトップ画面、テキスト(動画)画面、クイズ画面、成績画面、管理側画面などで構成され、LMS としてひと通りの機能が揃っています。機能はさほど多くないですが、実用的でしっかりと作り込まれており、Moodle や Canvas の2000オーバーには及びませんが、GitHub スターは現時点で120ほど付いています。また、Python 3、Django 1.11 にも対応しています。


ところで Django 1.11 なら、この「Two Scoops of Django」シリーズの最新版が絶対オススメです。英語ですが(と言っても難しい感じの本ではないです)、現場で役立つこと間違いなしのナンバーワン Django本です。


GitHub の履歴を覗いてみると、2014年5月から inducer がコツコツとプロトタイプを作り始め、dzhuang が途中で加わり、現在は主に二人で開発を続けていますが、最近も頻繁にコミットがされています(今日も何件かコミットされていました)。

inducler(Andreas Klöckner)はプロフィールを公開していて、ドイツ出身で現在はイリノイ州立大学のコンピュータサイエンスの助教授をしているとのこと。自身(?)の オンラインクラス にこの RELATE を使っているようです。なので、ちゃんと Python や Django のバージョンアップに追随しているのですね。

全部を一個人が作ったのではなく(一応)複数人が開発していて、Issue や PR をオープンに受け入れているのでサポートもある程度期待できそうです。何よりも、ベースが Django なのでコードが理解しやすくカスタマイズしやすいのが嬉しいところです。


これで SPA だったら最高なのになぁ、と思ったあなた。・・そんなあなたのために、「Web Expedition」(webexp)という「Django + Angular」なイケてる LMS を見つけておきました(*6)。一応オープンソースなのですが開発者が最新版のソースコードを push してないのか、昔触ったときにうまく動かなかった記憶がありますのでご注意を。





 

Ubuntu 16.04 on Docker for Mac で構築してみる

Ubuntu 16.04 on Docker for Mac 上に RELATE のサイトを構築してみます。
もちろん、以下の構築手順は本番向けではありませんのでくれぐれもご注意を。

環境

$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.12.6
BuildVersion:	16G1114

$ docker --version
Docker version 17.09.1-ce, build 19e2cf6


 

Docker コンテナを起動

$ docker run -it -p 80:8000 --name relate ubuntu:16.04

# cat /etc/issue
Ubuntu 16.04.3 LTS \n \l

# apt-get update
# apt-get install -y python3-dev python3-pip
# pip3 install -U pip
# apt-get install -y vim git curl

# python3 -V
Python 3.5.2
# pip3 -V
pip 9.0.1 from /usr/local/lib/python3.5/dist-packages (python 3.5)

### Bower をインストール
# apt-get install -y nodejs npm
# nodejs -v
v4.2.6
# npm -v
3.5.2
# npm install -g bower



以降は、Installation — RELATE 2015.1 documentation を参考にして RELATE のインストールを進めていきます。

なお、検証時の RELATE のバージョンは、66d3d38 です(2017/12/19 時点の最新版)。

# cd /opt/
# git clone https://github.com/inducer/relate.git

### 事前にコースコンテンツも配置しておく
# git clone https://github.com/inducer/relate-sample.git
# cd relate
# pip3 install -r requirements.txt

ここで、

Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-uh2f9ekj/django-select2/

というエラーが出る場合がありますが、「django-select2」6.0.0 のバグの可能性があります。

diff --git a/requirements.txt b/requirements.txt
index 3a5dbd3..e39372f 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -94,7 +94,7 @@ git+https://github.com/celery/django-celery.git@6232c79557517afa74967fcb980c0db2
 # }}}

 # For searchable select widgets
-django_select2>=5.5.0
+django_select2<6

 # To sanitize HTML generated by user code
 bleach>=2.0,<3

と修正して

# pip3 install -r requirements.txt

をやり直せば、うまくインストールできました。

# cp local_settings.example.py local_settings.py
# vi local_settings.py

で、

ALLOWED_HOSTS = ["*"]

に変更。

# python3 manage.py migrate
# python3 manage.py createsuperuser
### (admin/admin@example.com/pass)

# python3 manage.py bower_install --allow-root

ここで、Ubuntu 16 は "node" ではなくて "nodejs" として認識するため、ここで以下のようなエラーが出てしまう場合があります。

/usr/bin/env: 'node': No such file or directory

この場合は、以下のコマンドを実行すれば OK です。

# ln -s /usr/bin/nodejs /usr/bin/node

改めて、

# python3 manage.py bower_install --allow-root

を実行。

最後に、runserver を起動します。

# python3 manage.py runserver 0.0.0.0:8000

ブラウザで、
http://localhost/login/
にアクセスします。

f:id:akiyoko:20171219230405p:plain


 

コースコンテンツの登録

「Sign in」のリンクを辿り、superuser でログインします。

f:id:akiyoko:20171219230421p:plain

ログインできたら、「Set up new course」ボタンをクリックします。

f:id:akiyoko:20171219230508p:plain


以下のようにサンプル講座の設定をおこない、「Validate and create」ボタンを押下。

Course identifier: t-001
Course name: Test Course
Number: T001
Time period: March 2018
Start date:
End date:
Only visible to course staff: チェック
Listed on main page: チェック
Accepts enrollment: チェック
Git source: /opt/relate-sample
SSH private key: 
Course root in repository: 
Course file: course.yml(デフォルト)
Events file: events.yml(デフォルト)
Enrollment approval required: 
Enrollment required email suffix: 
From emai: admin@example.com
Notify email: admin@example.com

f:id:akiyoko:20171219230813p:plain:w300


サンプル講座のトップ画面が表示されます。

f:id:akiyoko:20171219233802p:plain


講座を受講してみる

本来は受講者を作成してログインし直すべきですが(成りすましモードもあります)、このまま進めていきます。

トップ画面から以下のリンクをクリックするか、「http://localhost/course/t-001/flow/001-linalg-recap/start/」にアクセスすると、テキストページのフローに進むことができます。

f:id:akiyoko:20171219233606p:plain

ここに動画やテキストを配置します。ページ移動は上部のナビゲーションから可能です。

f:id:akiyoko:20171219233129p:plain



次に、クイズ(小テスト)です。


トップ画面から、「sample quiz」というリンクをクリックするか、「http://localhost/course/t-001/flow/quiz-test/start/」にアクセスします。

f:id:akiyoko:20171219233629p:plain

クイズが横に並んでいます。

f:id:akiyoko:20171219231934p:plain

いろんな形式のクイズを出すことができます。

f:id:akiyoko:20171219232041p:plain

クイズの形式はこの他にも多数用意されています。

f:id:akiyoko:20171219232011p:plain

クイズを提出する場合は、右側のボタンをクリック。

f:id:akiyoko:20171219232146p:plain

確認画面が表示されます。

f:id:akiyoko:20171219232604p:plain

結果画面も用意されています。

f:id:akiyoko:20171219232639p:plain

完了したクイズは、後で振り返りをすることもできます。

f:id:akiyoko:20171219232748p:plain


管理者側の画面で成績の一覧をチェックすることも可能です。

f:id:akiyoko:20171219232906p:plain



 

まとめ

2年前に Python製で Django ベースの CMS「Mezzanine」を紹介しましたが、今回は同じく Python 製で Django ベースの LMS「RELATE」を紹介してみました。


Django ベースで開発されているため、Django に慣れている Pythonista であれば容易にカスタマイズができますし、既存の様々なライブラリを利用することができるため、思うがままの LMS を創り上げることができます。

これを機にオリジナルのオンライン学習サービスをリリースしてみてはいかがでしょうか。



明日は、kzkamago0721 さんの「Django Advent Calendar 2017 - Qiita」 20日目の記事です。よろしくお願いします。

*1:昨年は最後まで枠が空いていたので、調子に乗って3日分も担当してしまいました。《過去記事》akiyoko.hatenablog.jp

*2:《過去記事》akiyoko.hatenablog.jp

*3:《過去記事》akiyoko.hatenablog.jp

*4:検索に引っかかりにくい名前つけやがって、こんちくしょう!!

*5:ただし、コースコンテンツの翻訳は難しいかも。

*6:Quiz Web App with Django + Angular and deployment on pythonanywhere | Bhargav Patel