エンジン将棋盤を買った

Macで将棋の検討をするためにいろいろ探していたら「エンジン将棋盤」なるアプリを見つけました。

 

調べてみたら全然口コミなし…ということで2000円しましたが人柱になる覚悟で購入してみましたのでレポートします。

 

とりあえず起動した画面はこんな感じ。

f:id:jnory:20180608160453p:plain

 

 盤の色は設定で変えられるみたいです。

f:id:jnory:20180608160954p:plain

試しにこちらのサイトを参考にしつつポンポン桂を入力してみました。このアプリは裏の解析エンジンを差し替えられるのですが今回使ったのはelmoです。

f:id:jnory:20180608160950p:plain

最善手が評価値167なので先手よしということですかね。

解析で読んだ結果も見せてくれます。

f:id:jnory:20180608160945p:plain

これは…王手飛車…ここまで行けばかなりよさそう。

 

試しに失敗例で解析してみます。

f:id:jnory:20180608160941p:plain

ほぼ互角になってます。

解析の例を見ると…

f:id:jnory:20180608160937p:plain

私には後手よさそうに見えます…

 

さて、ここまで書いてきましたがしばらく触った限りでいくつか気になった点があります。もし何か見落としていて私の勘違いだったらごめんなさい。

  • 手元のkifファイルを読み込ませたら無言で落ちました
    • 将棋ぶらうざQで作ったファイルなのでこのアプリのバグでは無いかもしれませんが、エラーメッセージ出して欲しかった
  • 棋譜の分岐を本譜に移す機能が見当たりません
    • うっかり間違えて駒を動かすと本譜としてはそれで確定されるみたいで、修正は全部分岐に入ります
  • 棋譜の保存がうまく動かないみたい
    • メニューの保存ボタンを押してもなんの反応もない…

UIは良いと思うので今後の発展に期待ですね。

聖書通読botをherokuに移行した

今朝メールをみてびっくり。

This is your final notice that the sunset of the previous generation OpenShift Online 2 platform will be September 30, 2017.

完全に忘れてた…(たしかにだいぶ前にメールが来ていたような…)

 

と、いうわけで、急遽、聖書通読botをお引っ越しです。

移行先はherokuにしました。

 

 

OpenShiftでは「どこまで投稿したか」の情報を面倒くさがってテキストファイルに保存していたのですがherokuではそれも厳しそうだったのでheroku postgresを使いました。

DBと言ってもステータスをメモしているだけなので超簡単です。

 

というわけで夕方には完成。

FPGAに書き込めた

前にブログで「FPGAに書き込めない」と言っていましたが無事書き込めました。

jnory.hatenablog.com

動いた #Lチカ #FPGA #ice40

 

LatticeにはDiamond Programmerというツールがありまして、それを使ってFPGAに書き込むのですが、どうしてもエラーになって動きませんでした。

ERROR - Programming failed.
ERROR - Failed to Open FTDI USB port. Make sure to select the right cable type.
If you have not installed the FTDI Windows USB Driver, follow the instructions in the Programmer Help topic:
"Installing/Uninstalling Parallel Port Driver and USB Driver".
If you have installed the driver, if you recently plugged in the cable, please wait a few seconds and try again.
This will give the operating system time to recognize the cable.

 解決策

ice40にはOpen Sourceの書き込みツールicestormがあります。それを1度使うとDiamond Programmerも動くようになりました。

http://www.clifford.at/icestorm/

手順

  1. icestormのインストール*1
  2. FPGAをPCにつなげます
  3. icecube2で生成したbinファイル(bitmapファイル)をiceprogコマンドで書き込みます
  4. Diamond Programmerを起動します
  5. Diamond ProgrammerからFPGAに書き込みます

1度iceprogコマンドで書き込みを行っていれば、後はDiamond Programmerから何度でも書き込めるようです。

なぜ?

iceprogコマンド実行前後でlsmodコマンドを実行し比較すると、lpモジュールがロードされていることがわかりました。詳しいことはよくわからないのですが、lpモジュールはparallel port driverだそうなので、driver周りのエラーだったと言うことが推測できます。

 

ただし、iceprogコマンドの代わりにmodprobeコマンドでlpモジュールをロードしてみてもエラーは解消しませんでした。なのでlpモジュールが直接の原因というわけではなさそうです。(結局わからない) 

*1: https://github.com/nesl/ice40_examples が参考になります

golangのimport順を並び替えるツールを作った

tl;dr;

github.com

 

やりたいこと

標準ライブラリ→3rd partyライブラリ→ローカルライブラリの順に並べたい

 

goimportsつかえよという声が聞こえてきそうですが

goimports、おおむね良いのです。たとえば、

 

 import (
    "github.com/ziutek/blas"
    "math"
    d "./data"
   "fmt"
)

に対して*1goimports使うと、

 

import (
    "fmt"
    "math"

 

    "github.com/ziutek/blas"

 

    d "./data"
)

 になって素敵です。

 

でも、変換元が

 

import (
    "github.com/ziutek/blas"
    "math"

 

    d "./data"
    "fmt"
)

 のとき(mathの後ろに一行空行がある)、

import (
    "math"

 

    "github.com/ziutek/blas"

 

    "fmt"

 

    d "./data"
)

 になっちゃうんです。これ、IDE使っていると一番下の行に挿入されるので容易に順番が崩れちゃうんですが、同じ要望を持ってる人どうしてるんですかね?

 

作ったもの

ゆるいツールを作りました。mukagoと名付けていますが適当です。

importの順を並び替えるだけですが、GolangのASTがよくわからなくて、結構ハマりました。

mukagoを使うと、上記の状態でも、

import (
    "fmt"
    "math"

 

    "github.com/ziutek/blas"

 

    d "./data"

 になって幸せです。

まとめ

かなり雑な作りなので、同じ機能をもったもっとちゃんとしているものがあったら使いたいです。探した限り見当たりませんでしたが…

*1: 相対パスimportは諸々の都合上例としてそうなっていますが通常行いません。 

FPGAデビュー

【追記2017/8/20】FPGAの書き込みに成功しました!

 

jnory.hatenablog.com


ど素人なのにFPGA買いました。

 

https://www.instagram.com/p/BXWw4-VAS4T/

ぐへへへへへへへへへへ #はじめての #FPGA #買った

 

さっぱり使い方がわかりません。

 

とりあえず、仮想マシンLinuxを入れて、ドライバいれて、USBつないでみました。

…認識されません。

 

っていうかログには

usb 1-5: Product: Lattice iCE40LP1K Eval Kit

って出てて、「いや、ちげーよ」みたいな。買ったのはICE5LP4Kのはずなんですが、誤認識でしょうか…?実はそんなもん?

 

iCEcube2(開発環境)に付属のチュートリアルは別の機種で解説されてるし、お手上げ感強い。

聖書通読botを再開

 

twitter.com

なんでまた急に

いつも礼拝ではiPhoneアプリ新改訳聖書を使っています*1

新改訳聖書

新改訳聖書

  • Word of Life
  • ブック
  • ¥3,000

で、昨日の礼拝でも使おうと思ってiPhone開いたら、バッテリーがなかった…

やばっ、と思ってAndroidスマホを取り出しまして*2、急いでその場でアプリを入れました。それがこちら。

play.google.com

 

口語訳聖書の初版は著作権が切れているので、そのデータをつかったアプリがこれ以外にもたくさんありました。Public Domainありがてぇ。

 

まあそういうようなわけで思考が、

そういえば自分も昔このデータでbot作ったな→止まっちゃってるな→やるか。(短絡的な発想)

となった結果、帰宅後に開発が始まりました。

聖書通読botの裏側

ざっくりいうと、Python3+SQLAlchemy+SQLite+OpenShiftです。OpenShiftのCronカートリッジを使っています。

SQLiteにデータ突っ込んで、前から順にデータを投稿しているだけなので、全然難しいことしてません。

ハマった点

OpenShiftでは、プログラムのコード等をGitでpushすることでDeployします。SQLite形式のDBファイルそのままGitにつっこんだら、そのデータの書き込みに失敗しました*3

調べてみたら永続化が必要なファイルは環境変数OPENSHIFT_DATA_DIRで指定されたディレクトリに置く必要があるとのこと。そちらにファイルを作ってしのぎました。

ところで

副産物として口語訳聖書のSQLite形式のデータが手元にあるのですが、需要ありますかね?(Public Domainなので配布しても問題ないはず。)

*1:しばらくメンテナンスが止まっているので購入はオススメしません。

*2:最近iPhoneからAndroidに乗り換えたのです。なのでiPhoneの方は解約済み。

*3:どこまで投稿済みかメモしておくのに当初はDBを使おうとした。

圧縮配列ライブラリyunomiをリライトしました

数年前に圧縮配列を作ってgithubで公開していました。 この度そのライブラリを一から書き直してリニューアルしました。

github.com

元々圧縮配列ライブラリであることをメインに作っていたのですが、今回のリニューアルで簡潔データ構造のライブラリとしても使えるようになっています。

圧縮配列とは

大量のデータを配列に格納しないといけないとき、あまりにデータが大きすぎてメモリに乗り切らないことはありませんか?圧縮配列は情報を圧縮状態でメモリに格納するためのものです。圧縮されているためそのまま格納するより省メモリですみます。当然通常の配列に比べて速度は落ちますが、ランダムアクセスリードが可能です。yunomiでは、Kimmo Fredriksson and Fedor Nikitinの論文に記載してあるFibonacciコーディングによる圧縮配列を実装しています。詳細を知りたい方は参考文献に当たってみてください。

簡潔データ構造とは

簡潔データ構造とは、0, 1からなるビットベクトルの様子を調べるためのデータ構造(とアルゴリズム)です。主に2つの関数からなり、rank関数、select関数と呼ばれます。rank関数は、nビット目より前に何個1があるか求めます。select関数はn個目の1がどこに現れているかを求めます。rank/select関数を応用することで、圧縮配列のようなアプリケーションを実装することができます。

なぜ作ったのか

自分で気軽に使える簡潔データ構造のライブラリが欲しかったのです。 簡潔データ構造自体はいろいろなOSSで(内部で使うために)実装されていますが、なかなかそれ自体をライブラリ化して切り出したものはあまり見かけません。 知っている限りGPLなライブラリはありますが、それを非GPLなプロジェクトで利用するにはハードルが高いです。

なぜリライトしたのか

前述の通り、自分で気軽に使える簡潔データ構造ライブラリが欲しかったのですが、過去に書いたyunomiは簡潔データ構造ライブラリ部分と圧縮配列部分が入り交じっており、簡潔データ構造のライブラリとして使うことはできませんでした。そこで、再設計し、書き直そうと思いました。

以前のコードは数年前に急に思い立って数日間で一気に作り上げたものでした。 一応動いてはいましたが、設計が甘く、ユーザー視点では使いにくいライブラリとなっていました。 また、テストがほとんど存在しておらず、信頼性の面でも問題がありました。

今回のリニューアルは使いやすさに重点を置き、時間をかけて設計・実装を行いました。 (足かけ半年以上もかかっています。)

加えて今回のリニューアルでは、コードの信頼性に重点を置き、できるだけたくさんのテストを書きました。たぶんほぼすべての関数にテストが存在するはずです。リニューアル前のコードにはテストがほぼ存在しなかったことを考えると大きな進歩です。正直テストのないライブラリを使いたくありませんから。

開発環境

Mac OS X + clangで開発しました。 また、同梱したDockerfileによる環境でもテストが通ることを確認しています。

今後やりたいこと

  • ちゃんとCIする
  • せっかくテストケースをたくさん書いたのでCIしたいです
  • 旧バージョンとの速度比較
  • 旧バージョンとはいくつかアルゴリズムも変更したところがあります。念のため調べておきたいです。

さいごに

どんな小さなものでもpull requestいただければ飛び上がって喜びます。