drilldripper’s blog

機械学習とソフトウェア開発を頑張ってます

分離式キーボードと最高の開発環境

分離式のキーボードMiSTEL BAROCCO MD600を購入しました。

MD600はキーボードの軸を選ぶことができます。私は赤軸を選択しました。

以下は購入に至った心の動きです。

  • 分離式のキーボードが欲しい
  • Ergodoxは良さそうだけど高い*1
  • 比較的安価なMD600の存在を知る(16000強)
  • Ergodoxの半額近い値段で購入できる。コスパ最強で間違いなく買い!

冷静なると16000超えのキーボードに対してコスパが良いという感想を持つのは、暑さに頭がやられてた可能性があります。

デスクの様子

デスクではキーボードをノートPCのサイドにおいて使用しています。 f:id:drilldripper:20170610183824j:plain

このとき付属のUSBでは長さが足りないので適当な長さのケーブルを購入する必要があります。

この方法ではノートPCの画面を下、外付けディスプレイを上にする運用が可能になり、Retinaディスプレイトラックパッドを有効に活用することができます。

また写真を見て分かる通りこのキーボードは厚みがあるので、リストレストを使って段差を軽減しています。私はマウス用のリストレストを2つ使用しています。

キーボードの感想としては肩を開いて姿勢良くタイピング可能で、メカニカルキーボードの小気味よい打鍵感と相まって最高です。

最高の開発環境

追加アイテムを購入することで、開発環境をさらなる高みに導くことができます。

これです。

これが組み上がった状態です。 f:id:drilldripper:20170610183630j:plain

これにPCを載せてサイドにキーボードを起きます。

f:id:drilldripper:20170610183633j:plain

f:id:drilldripper:20170610183636j:plain

f:id:drilldripper:20170610183638j:plain

人間としては終わっている感じが強いですが、最高にリラックスして作業することができます。

参考

プログラマーの三大美徳 - Mercari Engineering Blog

Ruby on Railsチュートリアルを軸にしてWeb周辺技術を勉強した

最近まとまった時間ができたので、Web開発手法の勉強をしていました。

Ruby on Railsチュートリアルが体系的に学べて良いという話を聞いていたので、これを軸にしながら自分のWeb知識の穴を埋めていくことにしました。

Ruby on Rails チュートリアル:実例を使って Rails を学ぼう

一区切りついたのでまとめておきたいと思います。

前提知識

以下は勉強を始める前の私の知識です。

  • Webフレームワークを使ったことがない

    • PHPなどで開発をしたことはある
    • MVCモデルは一応理解している
      • Java Servletを使った講義を受けたことがある
    • DB Migrationなどの言葉は聞いたことがある
  • Rubyを一行も書いたことがない

    • 普段はPythonC++を書いている
    • 趣味でJSも少し書く
  • CS的なインフラの基本技術は知っているが、IaaSやPaaSなどにはあまり明るくない*1

参考書

Railsチュートリアルをやる前に、参考書でWeb技術に基礎を固めました。

最初にWebを支える技術を読みました。

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

RESTの基本を学ぶのに非常に役立ちました。またステートレスやリソースなど、「なんとなく意味はわかるけど正確には知らない」知識を得ることができたり、実践的なAPI設計などが書かれていたりして非常に良い本だと思います。途中microformatsAtomなど、今ではあまり使われていない技術に多くのページが割かれているので、興味がない人は適当に読み飛ばせばいいと思います。(Webの栄枯盛衰を感じる歴史としては面白いと思います。)

次にマスタリングTCP/IP 入門編を読みました。*2

マスタリングTCP/IP 入門編 第5版

マスタリングTCP/IP 入門編 第5版

名著だと言われていますが、教科書的で結構退屈です。また既に知っている知識が多かったので、私は適当に読み流しました。

低レイヤーを学んだので、次は高レイヤーのIaaSやPaaSを学ぶことにしました。今回はAWSを選択しました。

Amazon Web Services クラウドネイティブ・アプリケーション開発技法 一番大切な知識と技術が身につく (Informatics&IDEA)

Amazon Web Services クラウドネイティブ・アプリケーション開発技法 一番大切な知識と技術が身につく (Informatics&IDEA)

評判が良くて比較的出版が新しかったのでこの本を選びました*3スクリーンショットなども多く、手を動かしながらサービスを満遍なく学習できて面白かったです。無料枠で十分遊べます。

AWSRailsチュートリアルにはあまり関係ないかと思っていましたが、一部ストレージサービスのS3を使う部分などがあり、学んだ知識を生かすことができました。

Rubyの学習

RailsチュートリアルではRubyの前提知識を求めていませんでしたが、さすがにHello Worldも書けない状態で特攻するのは嫌だったので、簡単に言語仕様をさらいます。

まずは公式ドキュメントを読みました。

20分ではじめるRuby

他言語からのRuby入門

公式ドキュメントは量が少なく、あまりにもあっさりとしているので他の資料にあたりました。

[Ruby]他言語使用者のためのRuby入門知識まとめ - Qiita

便利なRubyイディオム - Qiita

ASCII.jp:Ruby超入門(前編)|Rubyで学ぶRuby

特にRubyで学ぶRubyは面白かったです。(Rubyで自作インタプリタを作る連載で、正直文法やイディオムの書き方を学ぶのには適していないと思います)

Ruby on Railsチュートリアル

ここまでやった段階でRuby on Railsチュートリアルに取り掛かりました。基本的には演習問題に取り組み、erb(HTML)とCSS以外はコピペしない方針で進めました。

Twitterライクなアプリを作る中でGitの使い方からマイグレーション、PaaSへのデプロイ、テスト駆動開発などを実践的に学ぶことがでます。 思っていたよりもにWebの広範囲な知識が得られてやってよかったと思います。

またGitのコミットの粒度やコメントの書き方などは普段の開発にも活かせる部分があり、Masterブランチ一本で開発していた自分のプロジェクトを見直すきっかけにもなりました。

たくさんのことが学べる素晴らしいチュートリアルですが、それは裏を返せば非常に長大なチュートリアルであるということです。 電子書籍版のPDFに換算すると800ページ以上あるので*4、結構挫折感は強いです。個人的には勢いに任せて一気にやるといいと思います。

補足:Ruby on Railsチュートリアルのメモ

以下はチュートリアルを進めながらのTipsやエラー回避、感想です。

進めながらメモをとっているので、適当なことを言っている可能性があります。

1章

  • Cloud9が推奨されているが、小回りがきいて便利だと思ったのでローカル環境を作成
    • JetBrainsのIDEが使いたいというモチベーションが大きい
  • nokogiriでインストールエラーが発生
    • Command Line Toolsをいれておく必要がある

2章

  • Viewを表示しようとしたらArgumentError: key must be 32 bytesのエラー

  • RailsはRESTfulを採用した先駆者らしい

    • Webを支える技術を読んでおいてよかった感ある

3章

  • コミットの粒度や命名規則のあたりがいい話
  • .erbはhtmlを書ける
  • テスト駆動開発
    • 知識として知ってたけど、実際にこのプロセスをやるのは初めてだ

4章

  • 言語仕様
    • ここはサラッと流せそう
    • Railsの拡張も結構ある

単なるRubyのコードを書くのであれば、モジュールを作成するたびに明示的にインクルードして使用するのが普通ですが、Railsでは自動的にヘルパーモジュールをインクルードしてくれるので、include行をわざわざ書く必要がありません。 つまり、このfull_titleメソッドは自動的にすべてのビューで利用できるようになっている、ということです。

  • メソッドが破壊的かどうかを表現するために!をつけるルール、すごく良さそう
  • 必ずしも守られているわけではなさそうだけど http://qiita.com/tadsan/items/7baab2605a4d8ac1858e

  • pythonのスライスとrubyのスライスは仕様が違うので注意

    • [0..7]としたときに、7自体も含まれる

5章

  • CSSを書くのが結構めんどくさい

    • 自分が普段書かないからサラサラかけなくてストレスなのかも
  • HTTP技術の話

    これは、HTTP標準では技術的にリダイレクト後に完全なURLが要求されるためです。ただし、ほとんどのブラウザではどちらの方法でも動作します。

  • Webを支える技術にそんなようなことが書いてあったなあ

6章

  • 名前だけ知ってたActive Recordの概念が出てきた
    • SQLの操作を抽象化している
  • ここでRails console内で生成されるTime Stampの値がおかしいことに気付く

  • 正規表現がでてきた

    • 読むのがめんどくさくて、たぶんあってるだろうと思ってコピペする
      • 普段から正規表現に対してはこのスタンス。良くない癖だ…。
  • passwordはハッシュ化して保存する

7章

  • RESTに従ってデータベースを取得したサービスを設計し始めた

    • Resourceとしてデータを扱う
  • debuggerメソッド、とても便利。ブレイクポイントだ

  • POSTで送ることのできる要素を限定させる(Strong Params)
    • すべての要素を送ろうとするとエラーが発生する
  • pluralize
    • 英語を複数形にするメソッド。言われてみればめっちゃ需要ある
  • configを一行変更するだけで簡単にSSL通信ができてすごい
    • というよりもHerokuが簡単にSSLを無料で扱えるのが使えるのがすごい

8章

  • rails routesでルーティングが表示できる

    • コンソールで対話的にwebアプリを作れるメリットを感じる
  • 残念ながらヘルパーメソッドはテストから呼び出せない

    • これ少しめんどくさい

9章

  • XSSの対策をしなくていいの?と思いながら進めていたけど、railsが自動的にやっていたみたい
    • やっぱり標準で対応するべきだよなー
    • PHPだと明示的にescapeしないといけないし、世の中を良くするためにはデフォルトで対策したほうがよい
  • 記憶トークンの使用はセッションハイジャックの対策にもなって一石二鳥
  • PythonのselfとRubyのselfは似たような感じ?
  • 署名と暗号化を同時に行う。合理的

  • 0も1もRubyの論理値ではtrue

    • if文を書くときに他言語に慣れてると罠に嵌りそう
  • チェックボックスとかの分岐のテストはなかなか大変

10章

  • そういえばテストではpostじゃなくてpatchが使われている機会が多いことに気づいた
  • has_secure_passwordはオブジェクト生成時に存在性を検証する
    • ユーザ登録時にnilが有効にならない
  • log_in_asヘルパーがすごく強力であることがわかってきた
  • unless @user == current_userよりもunless current_user?(@user) のほうがわかりやすいという説明、いまいちピンとこない
    • 前者のほうが何をしているか明確でいいと思う
      • Python的な考え方かもしれない
  • Cookieをユーザが手動で削除してフォームを送信する場合を考慮してテストされてて、なかなか細かい
  • ブラウザはネイティブではDELETEリクエストを送信できないらしい
    • 知らなかった…。

11章

  • このへんでようやくedit_account_activation_urlの意味がわかってきた
    • @がURLで使えないということを初めて知った
  • どうやってメール受信のテストをやるのかなあと思いながら読み進めていたけど、簡単にプレビューする方法がRailsで提供されているらしい。

    • この仕組、テストが行いやすくするための工夫だよなあ
      • これがないとTDDはしにくそう
  • assert_matchめっちゃ便利

  • メタプログラミング

  • テストがあるとリファクタリングしたときの安心感があって良い

    • ところでコントローラからモデルに操作を移したい理論的な動機について書かれていないんじゃないか?
      • 感覚としてなんとなくわかるけど
  • 本番環境でメールのテストを行うためのプラグインをHerokuで使うためにクレジットカード登録が必要

    • 先延ばしにしていた登録をここで終わらせる
    • Vプリカが使えるのでセキュリティ的にも安心
  • 本番環境でメールがなかなか届かなくて失敗してるかと思ったけど、時間がかかっているだけだった。

12章

  • この章の序盤は本当に11章とやっていることの本質は変わらないっぽい
  • チュートリアルで一番難しいのは、漏れがないようにテストを書く演習な気がしてきた
  • ようやくこの章でログインの管理が終わった。結構しんどかった。

13章

  • PostgresQLではStringとTextではパフォーマンスの差が出ないのは初めて知った
  • Reference型よい
    • 今自分は間違いなくmigrationのメリットを享受している
  • 状況に応じて生のSQLが読み書きできないと処理ができない部分がまだたくさんある
  • pluralizeがまた出てきた
    • 中身は泥臭いルールベースのコードなのかな
  • if object.errors.any?objectにするだけで抽象度が高くコードが書けて楽しい
  • 文字列をescapeする必要がなくても、とりあえずescapeしておく癖をつける
  • 画像のファイル名にはStringを使うのか
    • 全部Textにするのはだめなのか?
  • この章で初めてvalidationのメソッドを自分で書くことになった
    • railsの機能が豊富なのか、それともいままでの課題が基礎的なものだったのか
      • たぶん両方だと思う

14章

  • 冒頭のデータベース設計、すごく参考になる
    • データベース正規化を実際のサービスに当てはめて、パフォーマンスと保守性を考慮しながら設計している
  • foreign_key: "follower_id"という記述
    • ActiveRecordはDBを操作しているということを思い出させてくれる
  • HTMLを構造的にテストしていくのは複雑で難しい
    • 現実ではさらにデザイナーとバックエンドを書く人が別れているケースもあるから、もっと難しくなりそう
  • RailsにおけるAjax、JSを意識せずに使える

各行の末尾にセミコロン ; があることに注目してください。 これはプログラミング言語によくある文法で、古くは1950年代中ごろに開発されたALGOLまで遡ります。

  • ;を使わない言語をはじめに使う人達も増えてきたんだろうな…。(老害感)

  • アプリ完成

    • 長かったけどすっごく面白かった

*1:情報科学を専攻しています

*2:すごい昔に買った本を引っ張り出してきた

*3:AWSは進化が速く、陳腐化しやすいので比較的新しい参考書を選んだほうが良いと思います

*4:https://gumroad.com/l/railstutorialjp_ebook

Pythonの引数を統一的に選択するためのツールを作りました

PycharmやVisual Studioなどの統合開発環境を使っていると、コマンドライン引数の指定が面倒に感じたりしませんか?

例えばPycharmではEdit configurationsを開きScript parameterを変更する必要があります。 f:id:drilldripper:20170406222203p:plain またScript parameterではGUIを使って引数を選択することができないため、パスを自分で記述しなければなりません。 f:id:drilldripper:20170406222207p:plain

そしてこのような引数の指定方法は開発環境によって異なるため、複数の環境をまたいで開発を行っているとやり方を忘れてしまうことがあります。

こういった問題を解決するために、統一的に引数を選択することができるツールを作りました。pipからインストールすることができます。

$pip install QtArgSelector

以下のようにして使います。

import sys
from qtargs import QtArgSelector  # ライブラリのimport

QtArgSelector.ShowArgumentSelector() # GUIを立ち上げる
print(sys.argv) #  引数に反映されているか確認する

スクリーンショット付きの説明はGitHubに書いてあります。

github.com

一つ前に選択した引数の履歴は保存されるので、同じ引数で実験を行いたいときはOKを押すだけ実行できます。

みなさんもお気に入りの開発環境で快適に引数を選択しましょう!

手書き風グラフを支える技術 -Matplotlibのxkcd関数とFIRフィルタ-

Pythonのグラフ描画ライブラリのMatplotlibには、手書き風のグラフを描画するための関数xkcd()があります。以下のソースコードを実行すると、手書き風のsinグラフが描画されます。

from matplotlib import pyplot as plt
import numpy as np
plt.xkcd()  # この関数を実行すると、次のグラフが手書き風グラフになる
plt.plot(np.sin(np.linspace(0, 10)))
plt.title('Handwriting sin graph')
plt.show()

f:id:drilldripper:20170324202314p:plain

温かみがあっていい感じですね。

このような手書き風グラフは、関数の名前にも使われているxkcdというサイトの画像をリスペクトしたものです。

xkcd: Color Pattern

理系的なネタが多く、エンジニアの間でもよく話題になります。また海外版空想科学読本といったテイストの本、ホワット・イフが翻訳されて話題になりました。*1

ホワット・イフ?:野球のボールを光速で投げたらどうなるか

ホワット・イフ?:野球のボールを光速で投げたらどうなるか

さて、このような手書き風グラフはコンピュータでどのように描画しているのでしょうか?

 乱数生成とローパスフィルタ

現在Matplotlibに実装されているxkcd()関数の原案となったブログ記事を参考にしながら読み解いて行きます。

XKCD-style plots in Matplotlib | Pythonic Perambulations

記事のxkcd_line()に注目してください。この関数ではグラフを描くための配列(x, y)を与えたときに、その間を補間するための点を生成します。補完する点にノイズ(ゆらぎ)を加えることによって、手書きのようなガタガタとした線を表現することができます。

この線を描画するために、補間する点数の制御やB-Spline曲線での近似などの様々な工夫がされていますが、肝となる部分はFIRフィルターのローパスフィルタによるノイズ制御と言って問題ないと思います。*2

xkcd_line()中の次のコードを見てみましょう。

# create a filtered perturbation
coeffs = mag * np.random.normal(0, 0.01, len(x_int) - 2) # mag=10
b = signal.firwin(f1, f2 * dist_tot, window=('kaiser', f3)) # f1=30, f2=0.05, f3=15
response = signal.lfilter(b, 1, coeffs)

1行目のコードは線に加えるノイズの大きさを決めています。magを変化させることによって乱数のスケールが変化し、線のガタツキの強弱が変わります。

2行目のコードではFIRフィルタでローパスフィルタの設計を行っています。(FIRフィルターについては後述します)ローパスフィルタは低周波成分のみを通過させて、高周波成分をカットするフィルタです。すなわち1行目で生成した乱数の中で、しきい値を超えたものを0にする処理を行います。これにより本来のグラフから極端に外れた点を抑制することができるので、適度なガタツキを表現することができます。

3行目のコードでは、2行目で設計したローパスフィルターを実際に適応しています。

FIRフィルター

FIRフィルターは有限インパルス応答フィルタ(Finite Impulse Response Filter)とも呼ばれるディジタルフィルタの一種です。FIRフィルターの回路は次の図と式で表されます。

f:id:drilldripper:20170324205455p:plain

{} $$ y = \sum_{k=0}^{N-1} (b[k]x[n-k])
= b[0]x[n-0] + b[1]x[n-1] + b[2]x[n-3] +… b[N-1]x[n-(N-1)] $$

x[n]を入力信号、y[n]を出力、b[n]をフィルタ係数とします。

このとき上式のNを一般にタップ数と呼びます。このフィルタに入力x[n]を入れたときに必要のない周波数成分を取り除くように回路を設計することによって、ローパスフィルタやハイパスフィルタを実現することができます。またこの式から、タップ数を増やすことで入力に対して大きな応答を得ることができることがわかります。

xkcd_line()内で使われいるscipyに実装されているFIRフィルターsignal.firwin()は、第1引数にカットオフ周波数、第2引数にタップ数、第3引数に窓関数を指定する仕様になっています。*3

実験

xの入力を[-3, -2, -1, 0, 1, 2, 3]、yの入力を[9, 4, 1, 0, 1, 4, 9]として、タップ数とカットオフ周波数を変更していきながらグラフの結果を見ていきます。これは{}y = x2のプロットです。

タップ数の変更

(左から順にタップ数の係数0.05, 0.1, 0.2) タップ数の係数を大きくするに従って波の振動が細かくなっていることがわかります。

ここで注意したいのは変更した値はタップ数の「係数」で、タップ数そのものではありません。あらかじめ計算しておいた補間する点の2点間距離に係数をかけています。

カットオフ周波数の変更

(左から順にカットオフ周波数1, 30, 200) カットオフ周波数を大きくするにしたがって、波の振動が抑えられていることがわかります。

参考

SciPyのFIRフィルタの使い方 - 人工知能に関する断創録

*1:私もこの本を読みましたが、とてもおもしろかったです

*2:他にもフォントの変更など、Matplotlibに実装されているxkcd()関数はもっと凝った処理をしています

*3:窓関数の特性に応じて、信号の解析することのできる範囲を変更することができます。詳しい説明は省きますので、気になる方は各自お調べください

SVMとランダムフォレストのどちらの手法を使えばよいか?

分類や回帰の問題を扱う場合、選択する手法としてサポートベクターマシン(SVM)とランダムフォレストが候補に上がってくると思います。

しかし、どちらの手法を使うべきなのでしょうか?どのような問題に対しても、一方の手法を使い続ければ良いのでしょうか?それとも問題によって使い分ける必要があるのでしょうか?

手法の手軽さ

Python機械学習プログラミングの著者であるSebastian Raschka氏は次のように述べています。

I would say that random forests are probably THE “worry-free” approach - if such a thing exists in ML: There are no real hyperparameters to tune (maybe except for the number of trees; typically, the more trees we have the better). On the contrary, there are a lot of knobs to be turned in SVMs: Choosing the “right” kernel, regularization penalties, the slack variable

- When Does Deep Learning Work Better Than SVMs or Random Forests?

意訳 :

ランダムフォレストは安心して使える機械学習のアプローチです。ハイパーパラメータ調整も必要ありません(木の数の指定は除きます)。対してSVMは"正しい"カーネル正則化ペナルティ、スラック変数などの調整が必要になります。

- ディープラーニングはどんなときにSVMやランダムフォレストより勝るか?

ランダムフォレストは調整する変数がSVMに比べて少ないため、とりあえず試してみるという使い方ができます。

また記事中では言及されていませんが、ランダムフォレストは事前に学習データの正規化や標準化を行う必要のない手法です。これも手軽さの一因となっていると思います。

手軽さという面ではランダムフォレストに軍配があがると思います。

多クラス分類

データを複数のクラスに分類したい場合は、どちらの手法を選ぶのが良いでしょうか?

これもSebastian Raschka氏が書いています。

there are multi-class SVMs, the typical implementation for mult-class classification is One-vs.-All; thus, we have to train an SVM for each class – in contrast, decision trees or random forests, which can handle multiple classes out of the box.

- When Does Deep Learning Work Better Than SVMs or Random Forests?

意訳:

マルチクラスSVMの典型的な実装は、一対他分類法です。したがってSVMは各クラスごとにトレーニングを行う必要があります。逆に決定木やランダムフォレストは手法をそのままマルチクラス分類に使うことができます。

- ディープラーニングはどんなときにSVMやランダムフォレストより勝るか?

SVMの一対他分類法とは、ある1つのクラスとその他のすべてのクラスでSVMを構築する方法で、これに対応する一対一分類法は2つのクラスを選び、それを分類するSVMを構築する方法です。以下の記事の説明がわかりやすいと思います。

SVMを使いこなす!チェックポイント8つ

Sebastian氏は典型的な実装法として一対他分類法が使われるとありますが、代表的なSVMライブラリであるlibsvmには一対一分類法が実装されています。

どちらの手法を用いるかによって計算量と分類精度が変わってきます。 一方ランダムフォレストは2クラス分類とマルチクラス分類を行うとき、何か特別な処理をする必要はありません。

学習データ数

用意した学習データの数によって手法を選択することもあると思います。現在QuoraのVPエンジニアリングで元機械学習研究者のXavier Amatriain氏は以下のように述べています。

Unfortunately, the major downside of SVMs is that they can be painfully inefficient to train. So, I would not recommend them for any problem where you have many training examples. I would actually go even further and say that I would not recommend SVMs for most “industry scale” applications. Anything beyond a toy/lab problem might be better approached with a different algorithm.

What are the advantages of different classification algorithms?

意訳:

SVMの欠点は学習が非常に非効率なことです。なのでデータのサンプル数が多い場合、どのような問題でもおすすめできません。もっと言えば工業規模(industry scale)で使うことは推奨できません。研究室レベルや単純化された問題では他のアルゴリズムよりうまく動作します。

分類アルゴリズムのそれぞれの利点はなんですか?

サンプルデータ数が十分に用意できる場合は、SVMではなくランダムフォレストを使うほうが良いと言えそうです。実際、Kinectの身体部位測定の判定にランダムフォレストベースのものが使われているようです。

www.microsoft.com

まとめ

これらの調査から、次のような方針が立てられると思います。

  • ランダムフォレストかSVMか迷ったらとりあえずランダムフォレストを使ってみる
    • ハイパーパラメータ調整が少なくて手軽
    • データ数が多くても効率的に学習できる
  • データ数が少ないときは、SVMを使うことを検討する

しかしながら、以上の方針は絶対ではありません。no free lunch定理が示しているとおり、すべてを上回る手法は存在しないからです。

no free lunch定理 - 機械学習の「朱鷺の杜Wiki」

したがって、以上の方針を頭に入れつつデータの特性を考えながら手法を選択することが重要になります。

参考

初心者が将棋を楽しく続けるためのロードマップ

将棋初心者がどうしたら将棋を続けられるか、という問題が話題になっていました。

将棋ド初心者にどうすれば将棋を続けて貰えるか問題 - 誰かの場所の複数

私の周りでも将棋を始める人が増えていますが、長続きせずにやめてしまう人が多いです。もっと将棋を続けてくれる人が増えるといいなーと思うので、私の考えを書いておこうと思います。

私の将棋の実力

元記事で将棋倶楽部24と将棋ウォーズを基準に実力を述べているので、言及しておきます。私は将棋倶楽部24では初段で、将棋ウォーズでは2段のあたりをうろうろしています。そんなに強くはないですが、それなりの時間と情熱を注ぎましたというレベルです。

ロードマップ

ハム将棋に勝てない段階でネット将棋に手をだすと負け続けることが予想されるため、モチベーションを失ってしまします。というわけで、まずハム将棋に勝つことを目標として、安定して勝てるようになってからネット将棋にデビューするのが良いと思います。

以下に示すロードマップは、効率的に強くなるにはどうすればよいかを私が考えたものです。

1. 戦法と囲いの組み合わせを一つ覚える

初心者の間は戦法と囲いを一つ決めて指すといいと思います。「棒銀 + 矢倉」や「四間飛車+ 美濃囲い」などがわかりやすい戦法です。

将棋チェスネット:千鳥銀の戦法図鑑 Flash

このサイトは戦法の概要が大量にまとめられています。駒を動かすこともできるので、符号が読むのが大変な初心者でも使いやすいと思います。

個人的に棒銀は狙いがわかりやすいのでおすすめです。

【戦法図鑑】7 棒銀戦法(相掛り型)

囲いについては以下のサイトを見るといいと思います。

将棋の囲い一覧 | 将棋研究

ちなみに穴熊囲いが強い、という話を聞いたことがあるかもしれませんが、初心者の間ははおすすめできません。穴熊囲いは本来攻めに使うはずの駒を守りに使うため、攻撃の構想を立てることが難しくなります。よく考えてささないと一方的に攻められて終わってしまうので、違う囲いから始めるのがよいと思います。

2. 簡単な詰将棋を解く

3手ぐらいの簡単な詰将棋を解いてみましょう。インターネットで検索して出て来るもので十分です。

初級詰将棋

詰将棋を解くと頭の中で駒が動かせるようになり、うっかりミスを減らすことができます。また王様が詰む形にはパターンがあるので、よくある形を覚えておくと良いでしょう。

3. ハム将棋と何度も戦う

ハム将棋はこちらが手を変えない限り、同じ手順を再現してきます。なので一度失敗した手順を避けて手を改善していくことで、ハム将棋攻略の糸口が見えてくると思います。

4. コンピュータ将棋で棋譜を解析する

将棋倶楽部24や将棋ウォーズでは、棋譜(指しての手順を示したもの)を取得することができます。この棋譜をコンピュータに読み込ませて解析することで、手の良し悪しを判定することができます。

おすすめのソフトはshogiguiです。GUIが直感的でとても使いやすいソフトです。Windows版、iPhone版、Android版が提供、無料で利用することができます。

ShogiGUI

5. 本を読む

インターネットだけでも将棋の情報を集めることができますが、やはり本は体系的にまとまっているため勉強しやすいです。もし将棋を継続しようと考えているのなら、購入を検討すると良いでしょう。以下におすすめの本のリンクを貼っておきます。

四間飛車を指しこなす本〈1〉 (最強将棋塾)

四間飛車を指しこなす本〈1〉 (最強将棋塾)

将棋の基礎がつまった戦法、四間飛車をわかりやすく学ぶことができる本です。「指しこなす本」シリーズは一問一答形式になっており、将棋盤を用意する必要がないので、気軽に読むことができます。

3手詰ハンドブック

3手詰ハンドブック

タイトルの通り3手の詰将棋がたくさん載っている本です。ハンドブックシリーズは良問が多いことで有名で、実践に役立つ問題がたくさん含まれています。

寄せの手筋200 (最強将棋レクチャーブックス)

寄せの手筋200 (最強将棋レクチャーブックス)

詰将棋を解けるようにはなったけど、そもそも相手の王様を追い詰められないから詰将棋が役立たないんだけど?」という人が読む本です。上記二冊よりは難易度が高いですが、学習効果は非常に高いです。

駒落ちは効率的な上達法か?

元記事では駒落ちの是非について問われていました。駒落ちが将棋の上達に役立つか、というのは意見が分かれる問題だと思います。私が今まで見聞きした意見をまとめると、以下のような感じになると思います。

駒落ち効率的な上達法派だ

駒落ちは駒の効率的な動かし方を理解する上で役に立ちます。代表的な飛車角落ちの定跡として、銀多伝定跡二歩突っ切り定跡があります。これらの定跡は非常に洗練されていて、定跡を学ぶことによって金や銀を効率的に動かすコツが分かります。また駒の落とす数が徐々に減っていくことで、上達を感じることができます。

駒落ちは非効率的な上達法だ

駒落ちで学んだことは平手の将棋に活かしにくいです。駒落ちの定跡は平手の勝負では出現しませんし、玉の囲いも通常とは異なります。将棋はただでさえ最初に覚えることが多いのに、いちいち駒落ちの定跡を覚えていたら、平手の定跡を覚えることに時間をかけられないので、上達が遅れます。

個人的には駒落ちはあまり好きではありません。平手で使わない定跡を覚えるのは負担に感じてしまいます。また私は飛車角を落として負けると、いくら相手が自分より強くてもモチベーションが下がってしまいます。ネット将棋ではレーティングシステムのおかげで自分と近い実力の人と勝負ができるようになったので、あえて駒落ちをやる必要はないと私は考えています。

そもそも、駒落ちってハンデとしてどうなんですかね?盤上に最初から駒が足りていないわけで、大駒を取られたりしたら、戦力が簡単に逆転してしまうので、駒ボロボロ取られて嫌な思いをし続けるだけな気がします。

将棋ド初心者にどうすれば将棋を続けて貰えるか問題 - 誰かの場所の複数

まったくそのとおりだと思います。

終わりに

ロードマップと題して偉そうにいろいろ書きましたが、基本的に自分の好きなようにやればいいと思います。いろいろな戦法が試したいのであれば、一つの戦法に固定することをこだわる必要もないですし、対人戦から始めるのもいいと思います。面白い、と思って将棋を続けてくれる人が増えるといいですね。

AnacondaのJupyter NotebookがPycharmで動作しない問題の解決方法

Jupyter Notebook(Ipython Notebook)は基本的にブラウザ上で動作するソフトウェアですが、Pycharmでから動かすこともできます。使い慣れているキーバインドやかしこい補完が使えるので、Pycharmで動かすメリットは大きいと思います。

しかし現在Anacondaを使って整えたJupyter Notebook環境だと、Pycharmからはエラーが発生して起動することができません。以下のメッセーが含まれるエラーが発生します。

KeyError: 'python3' jupyter

これはAnacondがPython[Root]という名前でエンジンを登録しているにも関わらず、Pycharmはデフォルトでpython3を探しに行ってしまうことが原因です。

このエラーはAnacondaの新しいカーネルでは修正されていますが、現在conda update condaの本体アップデートでは修正が適応されません。次のコマンドでアップデートを行いましょう

conda update nb_conda nb_conda_kernels nb_anacondacloud

The following packages will be UPDATED:

    anaconda:         4.1.1-np111py35_0 --> custom-py35_0
    conda:            4.2.12-py35_0     --> 4.2.13-py35_0
    nb_anacondacloud: 1.1.0-py35_0      --> 1.2.0-py35_0
    nb_conda:         1.1.0-py35_0      --> 2.0.0-py35_0
    nb_conda_kernels: 1.0.3-py35_0      --> 2.0.0-py35_0

これでPycharmからJupyter Notebookが使えるようになります。

参考

github.com