日記とか、工作記録とか

自分に書けることを何でも書いてゆきます。作った物、買ったもの、コンピュータ系の話題が多くなるかもしれません。

Python Twitterのメモ

Python-Twitterの細かい説明が無くソースコードを読んだりTwitter APIの規格を読む必要があります。
ちょっとメモのため残しておきます。
Modules Documentation — python-twitter 3.1 documentation

Status

Tilelineを取得したときなど、ツイートのひとつひとつはStatusと呼ばれる単位で管理されています。これに含まれる情報の一覧です。

AsDict このオブジェクトの辞書形式表現
AsJsonString このオブジェクトのJSON文字列形式
NewFromJsonDict  
contributors このアカウントをcontributorsとして運営するユーザの一覧
coordinates ユーザやアプリによって報告された緯度経度など
created_at ツイートされた時間。世界標準時(UTC)で表記
created_at_in_seconds ツイートされた時間を秒数で表記
favorite_count likeされたおおよその回数
favorited このユーザによってlikeされたかどうか(true/false)
geo 使わない。corrdinatesを代わりに使用する
hashtags  
id このツイートにつけられた固有のID
id_str idの文字列表現
in_reply_to_screen_name このツイートがリプライの場合、元ツイートを書いた人のスクリーン名
in_reply_to_status_id このツイートがリプライの場合、元ツイートのID
in_reply_to_user_id このツイートがリプライの場合、元ツイートを書いた人のユーザID
lang 機械的に検知されたこのツイートの言語(BCP47形式)
location  
media  
param_defaults  
place このツイートが関連づけられた場所
possibly_sensitive このツイートが(sensitive)と判断されたかどうか(true/false)
retweet_count リツイートされた回数
retweeted このユーザによってリツイートされたかどうか
retweeted_status  
scopes プロモーションツイートで使われる模様
source  
text このツイートのテキスト(UTF-8形式)
truncated ツイートは140文字で短縮されたかどうか
urls  
user このツイートをポストしたユーザについての情報
user_mentions このツイートでメンションされているユーザのIDとScreenName
withheld_copyright DCMAの申し立てで保留されているかどうか(true/false)
withheld_in_countries 保留されている国を表す2文字のコードのリスト
withheld_scope 保留の範囲(userまたはstatus)

Twitter公式の説明を参考にしました。
dev.twitter.com

User

ついでにuserの内容についても書いておきます。

created_at ユーザアカウントの作成日時
description ユーザの自己紹介文
favourites_count likeの数
followers_count フォロワー数
friends_count フォロー数
id アカウントのID番号
lang 言語
listed_count このユーザがリストされている数
location 場所
name スクリーンに表示される名前
profile_background_color  
profile_background_image_url  
profile_image_url ユーザのアイコン
profile_link_color  
profile_sidebar_fill_color  
profile_text_color プロファイルのテキスト
screen_name ログインID
statuses_count ツイート数
time_zone タイムゾーン
utc_offset 世界標準時からの時差(日本は32400秒(+9時間))

Raspberry pi 3 + Python = Twitter Botの起動(とりあえず投稿するところまで)

Raspberry piの良いところは常時起動しても電気代があまりかからないところです。Raspi 3になって消費電力はやや増えましたけれども、それでもスマホより少し少ないくらいなので、24時間稼働していても心が痛みません。

常時起動の良さを活かしてTwitterBotにしてみようということで、今回は起動部分を作ってみます。今回の作業はとっかかりのところだけですが、このくらいなら1時間ほどあればできるのでお手軽です。

Python Twitterモジュールのインストール

Twitterはユーザが凄く多いですから、自分で作らなくても配布されているものがたくさん見つかります。GitHubを探したらたくさんForkされているモジュールがあったので、これをお借りすることにしました。顔写真は作者さんなのでしょうか…… 熊……

github.com

インストールはsudo pipを使えば簡単です。

pi@pi3:~/twitter $ sudo pip install python-twitter
Collecting python-twitter
  Downloading python-twitter-3.1.tar.gz (80kB)
    100% |????????????????????????????????| 81kB 1.2MB/s
Collecting future (from python-twitter)
  Downloading future-0.15.2.tar.gz (1.6MB)
    100% |????????????????????????????????| 1.6MB 154kB/s
Requirement already satisfied (use --upgrade to upgrade): requests in /usr/lib/python2.7/dist-packages (from python-twitter)
Collecting requests-oauthlib (from python-twitter)
  Downloading requests_oauthlib-0.6.2-py2.py3-none-any.whl
Collecting oauthlib>=0.6.2 (from requests-oauthlib->python-twitter)
  Downloading oauthlib-1.1.2.tar.gz (111kB)
    100% |????????????????????????????????| 112kB 1.2MB/s
Building wheels for collected packages: python-twitter, future, oauthlib
  Running setup.py bdist_wheel for python-twitter ... done
  Stored in directory: /root/.cache/pip/wheels/22/1e/2e/506871fa7dc610616948e70812d5e2518cd89c13f757b98f6c
  Running setup.py bdist_wheel for future ... done
  Stored in directory: /root/.cache/pip/wheels/11/c5/d2/ad287de27d0f0d646f119dcffb921f4e63df128f28ab0a1bda
  Running setup.py bdist_wheel for oauthlib ... done
  Stored in directory: /root/.cache/pip/wheels/e6/be/43/e4a2ca8cb9c78fbd9b5b14b96cb7a5cc43f36bc11af5dfac5b
Successfully built python-twitter future oauthlib
Installing collected packages: future, oauthlib, requests-oauthlib, python-twitter
Successfully installed future-0.15.2 oauthlib-1.1.2 python-twitter-3.1 requests-oauthlib-0.6.2
You are using pip version 8.1.1, however version 8.1.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
pi@pi3:~/twitter $ pip install --upgrade pip
Collecting pip
  Downloading pip-8.1.2-py2.py3-none-any.whl (1.2MB)
    100% |????????????????????????????????| 1.2MB 201kB/s
Installing collected packages: pip
  Found existing installation: pip 8.1.1
    Uninstalling pip-8.1.1:
Exception:
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/pip/basecommand.py", line 209, in main
    status = self.run(options, args)
  File "/usr/local/lib/python2.7/dist-packages/pip/commands/install.py", line 317, in run
    prefix=options.prefix_path,
  File "/usr/local/lib/python2.7/dist-packages/pip/req/req_set.py", line 726, in install
    requirement.uninstall(auto_confirm=True)
  File "/usr/local/lib/python2.7/dist-packages/pip/req/req_install.py", line 746, in uninstall
    paths_to_remove.remove(auto_confirm)
  File "/usr/local/lib/python2.7/dist-packages/pip/req/req_uninstall.py", line 115, in remove
    renames(path, new_path)
  File "/usr/local/lib/python2.7/dist-packages/pip/utils/__init__.py", line 267, in renames
    shutil.move(old, new)
  File "/usr/lib/python2.7/shutil.py", line 303, in move
    os.unlink(src)
OSError: [Errno 13] 許可がありません: '/usr/bin/pip'
You are using pip version 8.1.1, however version 8.1.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
pi@pi3:~/twitter $ sudo pip install --upgrade pip
Collecting pip
  Downloading pip-8.1.2-py2.py3-none-any.whl (1.2MB)
    100% |????????????????????????????????| 1.2MB 201kB/s
Installing collected packages: pip
  Found existing installation: pip 8.1.1
    Uninstalling pip-8.1.1:
      Successfully uninstalled pip-8.1.1
Successfully installed pip-8.1.2
pi@pi3:~/twitter $

Exampleを入手するためにソースコードもclone

pipでインストールすると、exampleは含まれていません。exampleの入手や、今後の開発の目的でソースも入手しておきます。

pi@pi3:~/twitter $ git clone https://github.com/bear/python-twitter/
Cloning into 'python-twitter'...
remote: Counting objects: 2954, done.
remote: Total 2954 (delta 0), reused 0 (delta 0), pack-reused 2954
Receiving objects: 100% (2954/2954), 7.24 MiB | 1.36 MiB/s, done.
Resolving deltas: 100% (1873/1873), done.
Checking connectivity... done.
pi@pi3:~/twitter $

Twitterのアカウントに開発者登録する

さて、いまやろうとしていることは、既存のTwitter Botを利用者として使うということではなくて、自作の(とはいえソースのほとんどは借り物ですが)Botを動かそうということです。こういったときには、Twitter社に自分のプログラムを登録して、アクセス権をもらう必要があります。このため自分のTwitterアカウントを登録します。

dev.twitter.com

apps.twitter.com

私はこれまでTwitterアカウントに携帯電話の番号を登録していなかったのですが、開発者登録するときには必須となっていました。私のアカウントのうち、ほとんど使われていなかったWindVoice_enのほうにプログラムを登録しました。

twitter.com

開発者登録の方法は、上でソースをもらったbearさんのページに記載があるのでそれを参考にすればOKです。自分で作ろうとしているアプリケーションの名称、簡単な説明、アプリを登録しているURL(作成中の場合はとりあえず何でも埋めておけばいい(spaceholder)ようです)を記載すれば良いことになっています。

登録をすると、コンシューマーキー、コンシューマーシークレット、アクセストークン、アクセストークンシークレット、という4種類の鍵文字列がもらえます。これらは大事な情報なので他の人に知られてはいけません。パスワードに相当するものですね。以下の説明ではxで情報をつぶしてあります。

テストツイート

cloneしたソースコードのexample/tweet.pyがつぶやきを投稿するためのサンプルプログラムです。投稿したい文字列と一緒にアクセスキー4個を入力する必要があるのですが、長くて面倒なので、環境変数に登録してしまうことにしました。それができる機能がすでに織り込まれています。

pi@pi3:~/twitter/python-twitter/examples $ tail ~/.bashrc
fi

eval $(thefuck --alias)

# Env for Raspi3Bot
export TWEETUSERNAME=xxxxxxxxxxxxxxxxxxxxxxxxx
export TWEETPASSWORD=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export TWEETACCESSKEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export TWEETACCESSSECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

pi@pi3:~/twitter/python-twitter/examples $
pi@pi3:~/twitter/python-twitter/examples $ . ~/.bashrc

ホームディレクトリの.bascrcの末尾のところにこんな感じで4つの鍵を書いておきます(.bashrcはworld readableなので、アクセス権的に不安ですけど、このラズパイを使うのは私だけということで……)。これを記載したら、.bashrcを再読込させて、いよいよ投稿を試してみます。

pi@pi3:~/twitter/python-twitter/examples $ ./tweet.py "もう一度コメントに挑戦……"
WindVoice_en just posted: もう一度コメントに挑戦……
pi@pi3:~/twitter/python-twitter/examples $

念のため自分のタイムラインを確認すると確かに投稿されていました。

f:id:WindVoice:20160720115411p:plain

まとめ

とりあえず投稿するところまでいけましたが、目的はコマンドラインからつぶやくことではなくて、これで常時起動のBotを作ることでした。場当たり的ですがここからがアイディアの出し所ですね。過去の投稿と合わせればセンサーからの読み取り値をつぶやくなどはすぐできると思いますが、しかし公に知らせて楽しい物でもないかも…… どうしたものか少し考えます。

誰でもできるTwitter Botの作り方―人気キャラにつぶやかせる

誰でもできるTwitter Botの作り方―人気キャラにつぶやかせる

Virtual Reality:とりあえずローエンドコース試しました

前回の日記で書いたような仮想現実環境は、PCから買い直しになるわけで、そう簡単に購入というわけにもいきません。コメントでMicrosoftのHoloLenzを紹介頂きましたが、限定的に販売されているようでどうも手に入れるのは無理そうです。

しかし手軽なのを探してみると、簡易なものも出回っていました。案ずるより産むが易しということで「とりあえず」手に入れてしまいましたよ。Tepoinn VR Shineconというゴーグルです。
f:id:WindVoice:20160612152637j:plain
類似した商品がいくつもAmazonに掲載されているのですが、これがランキング1位だったので、という安易な理由で注文しました。値段は3000円。初めて体験するにはこのくらいの値段の方が手を出しやすいですよね。

開梱

内容物は本体と、ぺらっとした紙のマニュアルと、スタイラス2本。あとで書きますが、VR体験中は画面をタッチすることがほとんど不可能なので、このスタイラスはどういうシチュエーションで使うことを想定して同梱されているのか不明です。本体はこんな感じ。
f:id:WindVoice:20160612152736j:plain
本体上部のツメからフロントベゼルを外すことができます。外すとそこにiPhone等をセットするための場所があります。スマホを挟み込めるようにバネが仕込んであり、説明によれば3.5インチから6.0インチまでの画面サイズに対応しているそうです。私はiPhone6sを持っていますのでこれをセットすれば本体側は準備完了です。

なお、正面のVR SHINECONと書かれている部分は取り外すことができます。そうするとスマホのカメラレンズ部分が露出するので、部屋の様子を映せば拡張現実用途にも使えるようになっています。
f:id:WindVoice:20160612152809j:plain

上の写真は裏側です。私は眼鏡を使っているのですが、眼鏡をかけながらゴーグルをかぶるのは無理でした。また、鼻があたるところは結構大きめに隙間があいている(私の鼻が低いのか?)ので、外から光が漏れてきます。部屋を暗くするか、ここになにか詰め物でもすると良いと思います。顔に当たる部分のクッションは適度に柔らかく触り心地のいいものです。没入感を邪魔しない良い作りだと思いました。

両目で立体視する場合見やすいように調整する必要がある(そうでないとめまいがして気持ち悪いと思います)わけですが、このゴーグルでは2カ所調整ができるようになっています。ひとつは視差を調整するためのもので、眉間のあたりにダイヤルがあります。これを調整すると2個あるレンズが寄り目になったり離れたりします。もうひとつはスマホ画面との距離を調整するもので、こめかみのあたりにダイヤルがあります。調整できる範囲は1cmくらいですが、それでも結構違いを感じます。

テスト(なごみの耳かきVR)

この製品には専用のソフトは付いていません。世の中にあるVR関係のアプリを使ってね、ということのようです(そういう説明もありませんが)。App Storeで探してみたところ、真っ先に見つかったのがこれでした。

なごみの耳かきVR

なごみの耳かきVR

  • EISYS,inc.
  • ゲーム
  • 無料

公式サイトにあるプロモーションムービーはこちらですね。というか基本的にこれだけしかない、単機能といってよいソフトのようです。


なごみの耳かきVR プロモーションビデオ

いえ、探したわけじゃ無くてホントにこれが最初に見つかったんです。ホントなんです…… っていいわけはさておきまして、インストールしてみました。どういうものかは動画を見ればわかると思いますので技術的な感想を。

できることできないこと

できること

驚くほどちゃんと立体視できます。障子の向こうでひらひら舞う落ち葉、近くにある茶器や床の間、女の子との距離感(見る角度によりポリゴン突き抜けることがありますが)が違和感なく見えます。音はスマホのスピーカーではなくイヤホンを推奨します。耳かきしてもらうというシチュエーションなのですが、右耳を下にするか左耳を下にするかで、ゴソゴソいう効果音や、声の聞こえてくる方向が変わります(よくできてますが、こういうところがしっかりしていないと没入感でませんよね)。

スマホのセンサが非常に精度のよいものなので、首を少し傾けたり振り向いたりしても即座に画面が付いてきます。ラグは感じません。あちこちよそ見をして楽しめます。体験そのものは短いです。5分くらいでしょうか? 無料のソフトですので不満はありません。よくできているなぁと素直に関心しました。

できないこと

気がついたことがいくつかあります。

  • まず、移動は検知されません。検知されるのは方向と角度だけです。例えば女の子に近づこうとして身を乗り出しても、自分の位置は変わりません。そのあたりは、首を傾ける ⇒ 女の子の膝が近づいてくる、というようにプログラム的に作られているようでした。
  • 次に、画面をタップできません。目の前にあるのですから当然と言えば当然ですが、スマホに直接触れないので、他のボタンを含めて操作する方法がありません。この問題を解決する方法が実装されていました。最後に空中に「終了しますか?」というようなUIが空中に浮かんでみえるのですが、「はい」「いいえ」のどちらかの選択肢を画面の真ん中に持ってきて少し維持すると、その選択肢が選ばれる、という仕組みになっていました。最初セットアップするときに「ゴーグルのふたを閉じてしまったらどう操作するんだ?」と疑問に思っていましたが、この解決方法はなかなかうまいと思いました。
  • スマホが熱くなります。もともと3Dの処理はプログラム的に重たいものですが、5分程度遊んでスマホを取り出してみたら、熱くなっていて驚きました。iPhone6sはそれほど熱くならない機種だと思うのですが、熱で動作不安定になるような一部の機種ではつらいかもしれません。

そのほか感想

  • Google cardboardというゴーグルが売られているようです。

Google Cardboard I/O 2015 ハコスコ社製

Google Cardboard I/O 2015 ハコスコ社製

これだと、「トリガー」と呼ばれる穴が空いていて、そこからボタンが押せる?らしいのですが、ちょっと仕組みがわかりません。そんなところから指を入れても押すところ無いのでは?と思うのですが…… こちらはcardboardというだけあって単純な紙製でレンズもないようで、私の買ったような顔にぴったり装着するタイプとは違います。ゴーグルをずっと手で持って使う前提のようです。肩がこりそう…… 類似のものを手作りするのはいいかもしれませんね。

  • YouTubeの360対応動画などもあり、スマホが一般に広く使われていることや手軽に試せる値段などを考えると、本格的なVR向けハードウェアよりもちらの方がずっと先に普及しそうです。しかし、映画1本をこのゴーグルでみるかというと、おそらくバッテリーが持たないため無理と思います。マニュアルには、充電しながら使わないこと、と注意が書かれていました(過熱の恐れがあるのだと思われます)。
  • 操作が不便なのだけが難点ですが、イヤホンに付いているボリュームボタンとか「次の曲に進む」「戻る」ボタンを前提にしてアプリを作ってみる手もあるかもしれません。専用コントローラを前提にするのは、スマホを使う手軽さとはトレードオフになってしまうと思います。もしくは、ひょっとして声で操作するアプリの可能性はあるでしょうか。処理能力的に追いつくかどうかですが、簡単なキーワード操作くらいならなんとかならないかな。いずれにしても、スマホが大きく普及した要因であるタップやスワイプなどの手軽な操作を使えないのは、痛いところです。

まだ手元に届いたばかりですので、もう少し遊ぶ余地があります。対応アプリなど探してみようと思います。

おまけ。Clash of ClansのYouTube動画。これもゴーグルでみると360度見渡せます。

Clash of Clans 360: Experience a Virtual Reality Raid

しらべもの:拡張現実って手に入るのですか(Oculus Rift)

最近、NHKの番組で仮想現実(VR)の特番をみました。テクノロジが進む方向であることは間違いないですが、相当頑張って本格的なハードウェアを導入しても、制約が多く表現がいまいちで、快適な仮想現実 / 拡張現実を実現するのは難しそうだというのがこれまでの印象でした。

私としては、バーチャルボーイのころから楽しみに待っている感じなのですが…… もう20年くらい経ってしまうのではないでしょうか。


Nintendo Virtual Boy Unboxing & Review (VB)

しかし、Oculus Riftとか、Playstation VRとか、最近出てきた新製品の話題は多いです。
そろそろ遊べるレベルになったのかもしれないし、どのくらいでどんなものが手に入るのか、調べました。

Oculus Rift

www.oculus.com

Raspberry piのときもそうでしたが、まずスペルが覚えにくい! 検索するとGoogle先生にスペル間違いを指摘されます。なんとか公式サイトにたどり着いてとりあえず価格をみると$599となっています。お一人様1台限りの表示もあり、納期は8月予定。人気で生産が追いつかないのだろうと推測するわけですが、日進月歩の分野で2ヶ月待たされるのは正直辛い…… スマホが出始めたころもそうでしたが、つぎつぎ新しいデバイスが紹介されたりしますよね。2ヶ月で世の中が変わっている可能性も否定できません。

どうでもいいことかもしれませんが、このWebサイト、IEでみると表示がされないことがありますね。

有線でPCと接続するのですが、予想通り要求がかなり高いです。USB 3.0ポートを3個要求するのが微妙に厳しいですね。買ってみないと状況がわかりませんが合計4ポート要求するというデバイスは初めてみました。そんなにいろいろ津名郡でしょうか。NVIDIA GTX 970はこの記事を書いている時点では35000円前後で買えるようです。

Video Card NVIDIA GTX 970 / AMD R9 290 equivalent or greater
CPU Intel i5-4590 equivalent or greater
Memory 8GB+ RAM
Video Output Compatible HDMI 1.3 video output
USB Ports 3x USB 3.0 ports plus 1x USB 2.0 port
OS Windows 7 SP1 64 bit or newer

ところで、Oculus Riftは仮想現実向けのデバイスですので、拡張現実の機能に必要なカメラ(自分の部屋の様子が見られるなど)機能はありません。つまりゲームはできるんだけど、自分の部屋に何かを映し出して遊ぶような使い方はこれだけでは無理です。私が手に入れるならゲームで遊ぶだけでは無くて何か作れないと面白くないので、そういうことはできないのかなぁと調べていたら、すでに製品化している人たちがいました。すごい。

Ovrvision

ovrvision.com

これはOculus Riftのゴーグルに追加装着して、拡張現実に対応させるための双眼カメラです。説明によれば、Open CVやUnityを使ってプログラミングできるということです。OpenCVを使うことで自分の手の動きをトラッキングできると書いてあるので、両手のモーションで操作することができるわけですね。だいぶ未来的な感じになってきました。

さすがに簡単に作れますよ、とまではいかないのかもしれませんがこれは要注目です。なお、こちらのカメラは$415。Riftと合わせると10万円超え。PCも買い直すなら20万円では足りません。25万くらいは準備しなくては。というわけで、これはハイエンドコースですね。

ToDo:ローエンドコースを調べる

スマホを使ってお手軽にVRやARを実現するデバイスは、かなり安価に手に入るようです。$100くらいからあるみたい。引き続きこちらを調べてみたいと思います。スマホならカメラもついているからARの可能性もありますね。プログラムするとなるとPCにくらべて敷居が高く感じますが。

Playstation VRも紹介されていますね。ソニーが女子高生と過ごすゲーム(?)を展示して不謹慎だとか言われたものです。こちらも10月発売とオフィシャルにでているので、あとで調べてみたいと思います。しかしさすがに開発は無理かな…… PlayStation 4は持っているので、ゴーグル買うだけですむなら助かるのですが。

Ovrvision Pro : Stereo Camera for Oculus Rift DK2

Ovrvision Pro : Stereo Camera for Oculus Rift DK2

備忘録:Visual Studio 2015 Community Edition + Bonanza 6.0

今回はRaspberry piとは無関係です。Windowsと将棋ソフトの話題ということで。Raspberry piで動かすにはCPUパワーもメモリも不足ですね。

Bonanza 6.0

Bonanzaは将棋の思考ルーチンです。少し前にこの界隈でパラダイムシフトを発生させたプログラムとして有名です。機械学習の考え方を取り入れており、それまでの、職人が勘と経験で磨き上げるように作成されていた思考ルーチンとは一線を画していました。段違いに強いと評判になり、その後作者ご本人がソースコードを含めて公開したため、後発のソフトウェアの開発に非常に大きな影響を及ぼしました。

Bonanza - The Computer Shogi Program

Visual Studio 2015でコンパイルする方法について備忘録的にまとめておきます。Visual Studio 2015で、とは書きましたが実はIDE環境は必要なくてnmakeというコマンドラインツールを使うだけです。IDE環境は、ソースコードを読むときに使いましょう。

コンパイル

ソースコードのzipアーカイブをダウンロードして、好きなところに解凍します。

Windowsのスタートメニューから「開発者コマンドプロンプトfor VS2015」を実行します。コマンドプロンプトが開きますが、このコマンドプロンプトにはVisual StudioコンパイラがPATH環境変数に追加されていて、nmakeコマンドが使えます。

Bonanzaソースコードに含まれるreadme.txt(\src\client\readme.txt)を読むと、コンパイル方法が書いてあります。ソースフォルダでnmakeを実行します。これでバイナリBonanza.exeができあがります。わざわざ書くことか?と思ってしまうほど簡単ですが、いや、Visual Studioをインストールしてそっちからコンパイルしようとすると駄目なんです。隠し機能のようなnmakeを使うところがミソなんですよ。

C:\...\client> nmake -f Makefile.vs cl

実行

これまたreadme.txtに書いてありますが、実行するには他のファイルが必要です。winbinフォルダに入っているbook.binとfv.binをコピーしてきましょう。あと、このプログラムは単体で動かすものではないのでCSA将棋を用意する…… と書かれていますが、CSA将棋はわかりにくいのでおすすめできません。u2c.exeを用意して、CSAプロトコルをUSIプロトコルに変換するソフト(u2c.exe)を使って将棋所に接続して使う方がGUIがわかりやすいです。

shogis.com

ソースコードを読んでいるのですがまだ機械学習のコアのところまでたどり着いていません。ゴールデンウイークの課題にしようと思っているのですが、どこまで進めるかなぁ。

将棋の渡辺くん(1) (ワイドKC 週刊少年マガジン)

将棋の渡辺くん(1) (ワイドKC 週刊少年マガジン)

Raspberry pi 3 + thefuck

fuck

fuckコマンドというのをご存じでしょうか。Linuxには有用なパッケージが多数公開されていますが、中には明らかにジョーク目的で作られたにもかかわらず意外にも有用だったりするものもあるのです。というわけでfuckコマンドを紹介します。

github.com

何これ?

fuckコマンドは、コマンドの打ち間違いを自動的に修正してくれるコマンドです。例えば、lsコマンドを実行しようとしてslと打鍵してしまうことがあります。「コマンドが見つかりません」エラーが出力されたらすかさず"fuck!"と叫びながらfuckコマンドを実行しましょう(注:叫ぶのは必須ではないです)(あと、余談ですがLinux界隈にはslコマンドというジョークコマンドも実在します)。

pi@pi3:~ $ sl
-bash: sl: コマンドが見つかりません
pi@pi3:~ $ fuck
ls [enter/↑/↓/ctrl+c]
Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos  python_games  shogi
pi@pi3:~ $

すると、fuckコマンドは直前の入力ミスを類推して、「よしよし、おまえが実行したかったのはlsだろう?」ということで修正候補を示してくれます。あとはEnterするだけです。

また、よくあるイライラであるapt-get upgradeコマンド。piユーザでは実行できないのでsudoを頭につける必要がありますが、これを良く忘れます。そんなときも……

pi@pi3:~ $ apt-get upgrade
E: ロックファイル /var/lib/dpkg/lock をオープンできません - open (13: 許可がありません)
E: 管理用ディレクトリ (/var/lib/dpkg/) をロックできません。root 権限で実行していますか?
pi@pi3:~ $ fuck
sudo apt-get upgrade [enter/↑/↓/ctrl+c]

fuckと入力すればあとは考えてくれます。賢いです。仕事では使えませんが(使わないことをおすすめしますが)、自宅の趣味の環境なら便利に使えます。インストール方法を紹介します。

thefuckのインストール

sudo pip install thefuck ... のまえに前提パッケージをインストール

開発元のサイトでは、pip install thefuckでインストールできるよ、とあるのですが、Raspberry pi 3ではそれだけだとインストールエラーになります。python-pip、python-dev、thefuckの順番でインストールしてゆきましょう。まず、python-pipはapt-getコマンドでインストールです。

pi@pi3:~ $ sudo apt-get install python-pip
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
python-pip はすでに最新版です。
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  libasn1-8-heimdal libgssapi3-heimdal libhcrypto4-heimdal libheimbase1-heimdal libheimntlm0-heimdal
  libhx509-5-heimdal libkrb5-26-heimdal libroken18-heimdal libwind0-heimdal
これを削除するには 'apt-get autoremove' を利用してください。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 2 個。
pi@pi3:~ $ sudo apt-get install python-dev
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  libasn1-8-heimdal libgssapi3-heimdal libhcrypto4-heimdal libheimbase1-heimdal libheimntlm0-heimdal
  libhx509-5-heimdal libkrb5-26-heimdal libroken18-heimdal libwind0-heimdal
これを削除するには 'apt-get autoremove' を利用してください。
以下の追加パッケージがインストールされます:
  libpython-dev libpython2.7-dev python2.7-dev
以下のパッケージが新たにインストールされます:
  libpython-dev libpython2.7-dev python-dev python2.7-dev
アップグレード: 0 個、新規インストール: 4 個、削除: 0 個、保留: 2 個。
18.2 MB のアーカイブを取得する必要があります。
この操作後に追加で 25.7 MB のディスク容量が消費されます。
続行しますか? [Y/n] y
取得:1 http://mirrordirector.raspbian.org/raspbian/ jessie/main libpython2.7-dev armhf 2.7.9-2 [17.9 MB]
取得:2 http://mirrordirector.raspbian.org/raspbian/ jessie/main python-dev armhf 2.7.9-1 [1,188 B]
取得:3 http://mirrordirector.raspbian.org/raspbian/ jessie/main libpython-dev armhf 2.7.9-1 [19.6 kB]
取得:4 http://mirrordirector.raspbian.org/raspbian/ jessie/main python2.7-dev armhf 2.7.9-2 [281 kB]
18.2 MB を 9秒 で取得しました (1,884 kB/s)
以前に未選択のパッケージ libpython2.7-dev:armhf を選択しています。
(データベースを読み込んでいます ... 現在 127602 個のファイルとディレクトリがインストールされています。)
.../libpython2.7-dev_2.7.9-2_armhf.deb を展開する準備をしています ...
libpython2.7-dev:armhf (2.7.9-2) を展開しています...
以前に未選択のパッケージ libpython-dev:armhf を選択しています。
.../libpython-dev_2.7.9-1_armhf.deb を展開する準備をしています ...
libpython-dev:armhf (2.7.9-1) を展開しています...
以前に未選択のパッケージ python2.7-dev を選択しています。
.../python2.7-dev_2.7.9-2_armhf.deb を展開する準備をしています ...
python2.7-dev (2.7.9-2) を展開しています...
以前に未選択のパッケージ python-dev を選択しています。
.../python-dev_2.7.9-1_armhf.deb を展開する準備をしています ...
python-dev (2.7.9-1) を展開しています...
man-db (2.7.0.2-5) のトリガを処理しています ...
libpython2.7-dev:armhf (2.7.9-2) を設定しています ...
libpython-dev:armhf (2.7.9-1) を設定しています ...
python2.7-dev (2.7.9-2) を設定しています ...
python-dev (2.7.9-1) を設定しています ...
pi@pi3:~ $

そのあと、psutilとthefuckはpipコマンドでインストール。

pi@pi3:~ $ sudo pip install psutil
Collecting psutil
  Using cached psutil-4.1.0.tar.gz
Building wheels for collected packages: psutil
  Running setup.py bdist_wheel for psutil ... done
  Stored in directory: /root/.cache/pip/wheels/28/46/4d/aaf6794133b80d7203b0a1d934febf4f59d0c6516e46fbafcd
Successfully built psutil
Installing collected packages: psutil
Successfully installed psutil-4.1.0
pi@pi3:~ $ sudo pip install thefuck
Collecting thefuck
  Using cached thefuck-3.9-py2.py3-none-any.whl
Requirement already satisfied (use --upgrade to upgrade): psutil in /usr/local/lib/python2.7/dist-packages (from thefuck)
Requirement already satisfied (use --upgrade to upgrade): decorator in /usr/local/lib/python2.7/dist-packages (from thefuck)
Requirement already satisfied (use --upgrade to upgrade): six in /usr/lib/python2.7/dist-packages (from thefuck)
Requirement already satisfied (use --upgrade to upgrade): pathlib in /usr/local/lib/python2.7/dist-packages (from thefuck)
Requirement already satisfied (use --upgrade to upgrade): colorama in /usr/lib/python2.7/dist-packages (from thefuck)
Installing collected packages: thefuck
Successfully installed thefuck-3.9
pi@pi3:~ $

設定

.bashrcの末尾にキーワードを追加しておきます。これで準備OKですが、初回は.bashrcを手動で読み込みましょう。これで使えます。

pi@pi3:~ $ tail ~/.bashrc
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

eval $(thefuck --alias)

pi@pi3:~ $
pi@pi3:~ $ . ~/.bashrc

では皆様、正しいfuckライフを。

Raspberry pi 3 + ネットワークの設定(Wi-Fi風味)+ DNS設定 + 日本語フォント

さて、ようやくラズパイ3の初期設定が進んできましたので引き続きメモを。
f:id:WindVoice:20160430155819j:plain

ネットワークの設定

前回の最後に書いたのですが、ネットワークの設定には苦労しました。ラズパイ2の時と少しずつ変わっているのですね。カーネル4.1なんだけどどうしてなんだろう。

Wi-Fi

ラズパイ3では、無線LANのアンテナは本体に内蔵されています。具体的にどの部分がアンテナなのかよくわかりません…… ここは難しく考えず、ラズパイ2の設定ファイルをコピーして持ち込みました。以前のエントリにありますが、アンテナの種類は違ってもこのあたりは問題なさそうです。
自宅で使っているWi-Fiルータは2つのアンテナを内蔵しているタイプなのですが、SSIDの末尾がgとgwのように分かれています。どちらでもつながるのですが、既存のラズパイ2と別のアンテナにつないでしまうと、この後相互にSSH接続できないことになります。そういうものらしいです。

root@pi3:~# cat /etc/wpa_supplicant/wpa_supplicant.conf 
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=GB

network={
	ssid="aterm-cae33a-g"
	psk="xxxxxxxxxxxxx"
	proto=RSN
	key_mgmt=WPA-PSK
	pairwise=TKIP
	auth_alg=OPEN
}
root@pi3:~#

デフォルトゲートウェイ

外の世界に接続するにはデフォルトゲートウェイの設定が必要です。コマンドラインから設定するなら、これでOKでした。

pi@raspberrypi:~ $ sudo route add default gw 192.168.10.1

しかし、これでは再起動すると設定が消えてしまいます。恒久的な設定にするには/etc/network/interfacesファイルに記載することになっています。ここでうまくいかず、かなり色々試したのですが、結論としてはstatic設定にすることで解決しました。manual設定だとgatewayオプションを書いても反映されず、なぜだ?と調べてもわからず…… 納得いきませんが、動きました。

root@pi3:~# more /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)

# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'

# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d

auto lo
iface lo inet loopback

iface eth0 inet manual

allow-hotplug wlan0
iface wlan0 inet static
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
    address 192.168.10.100
    netmask 255.255.255.0
    gateway 192.168.10.1
    dns-nameservers 192.168.10.1

さて、これで外の世界にもつながります。

日本語フォントをインストール

raspi-configで日本語キーボードを設定し、画面表示も日本語表記にしたのですが、そのせいでデスクトップのフォントが文字化けしてしまいました。デフォルトでは日本語の文字を含むフォントはインストールされていないようです。ラズパイ2では英語のままで使っていたのですが、この際なので日本語フォントをインストールします。

日本語フォントっぽいものを探す

パッケージのリストから探します。True Type Font(ttf)のJapaneseというキーワードで探すといくつか用意がありました。

pi@raspberrypi:~ $ sudo apt-cache search ttf | grep -i japanese
fonts-hanazono - Japanese TrueType mincho font by KAGE system and FontForge
fonts-mona - Japanese TrueType font for 2ch ASCII art
ttf-kochi-gothic - Kochi Subst Gothic Japanese TrueType font without naga10
ttf-kochi-mincho - Kochi Subst Mincho Japanese TrueType font without naga10
ttf-sazanami-gothic - Sazanami Gothic Japanese TrueType font (legacy)
ttf-sazanami-mincho - Sazanami Mincho Japanese TrueType font (legacy)
ttf-kochi-gothic-naga10 - Kochi Subst Gothic Japanese TrueType font with naga10 (non-free)
ttf-kochi-mincho-naga10 - Kochi Subst Mincho Japanese TrueType font with naga10 (non-free)
pi@raspberrypi:~ $

もうパパッとそのまま入れてしまいましょう。

pi@raspberrypi:~ $ sudo apt-get install fonts-hanazono fonts-mona ttf-kochi-gothic ttf-kochi-mincho ttf-sazanami-gothic ttf-sazanami-mincho
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  fonts-hanazono fonts-mona ttf-kochi-gothic ttf-kochi-mincho ttf-sazanami-gothic ttf-sazanami-mincho
アップグレード: 0 個、新規インストール: 6 個、削除: 0 個、保留: 77 個。
34.5 MB のアーカイブを取得する必要があります。
この操作後に追加で 86.4 MB のディスク容量が消費されます。
取得:1 http://mirrordirector.raspbian.org/raspbian/ jessie/main ttf-kochi-gothic all 20030809-15 [3,142 kB]
取得:2 http://mirrordirector.raspbian.org/raspbian/ jessie/main ttf-kochi-mincho all 20030809-15 [3,737 kB]
取得:3 http://mirrordirector.raspbian.org/raspbian/ jessie/main ttf-sazanami-gothic all 20040629-15 [2,888 kB]
取得:4 http://mirrordirector.raspbian.org/raspbian/ jessie/main ttf-sazanami-mincho all 20040629-15 [3,756 kB]
取得:5 http://mirrordirector.raspbian.org/raspbian/ jessie/main fonts-hanazono all 20141012-1 [19.3 MB]
取得:6 http://mirrordirector.raspbian.org/raspbian/ jessie/main fonts-mona all 2.90-7 [1,712 kB]
34.5 MB を 1分 32秒 で取得しました (373 kB/s)
以前に未選択のパッケージ ttf-kochi-gothic を選択しています。
(データベースを読み込んでいます ... 現在 127116 個のファイルとディレクトリがインストールされています。)
.../ttf-kochi-gothic_20030809-15_all.deb を展開する準備をしています ...
ttf-kochi-gothic (20030809-15) を展開しています...
以前に未選択のパッケージ ttf-kochi-mincho を選択しています。
.../ttf-kochi-mincho_20030809-15_all.deb を展開する準備をしています ...
ttf-kochi-mincho (20030809-15) を展開しています...
以前に未選択のパッケージ ttf-sazanami-gothic を選択しています。
.../ttf-sazanami-gothic_20040629-15_all.deb を展開する準備をしています ...
ttf-sazanami-gothic (20040629-15) を展開しています...
以前に未選択のパッケージ ttf-sazanami-mincho を選択しています。
.../ttf-sazanami-mincho_20040629-15_all.deb を展開する準備をしています ...
ttf-sazanami-mincho (20040629-15) を展開しています...
以前に未選択のパッケージ fonts-hanazono を選択しています。
.../fonts-hanazono_20141012-1_all.deb を展開する準備をしています ...
fonts-hanazono (20141012-1) を展開しています...
以前に未選択のパッケージ fonts-mona を選択しています。
.../fonts-mona_2.90-7_all.deb を展開する準備をしています ...
fonts-mona (2.90-7) を展開しています...
fontconfig (2.11.0-6.3) のトリガを処理しています ...
ttf-kochi-gothic (20030809-15) を設定しています ...
ttf-kochi-mincho (20030809-15) を設定しています ...
ttf-sazanami-gothic (20040629-15) を設定しています ...
ttf-sazanami-mincho (20040629-15) を設定しています ...
fonts-hanazono (20141012-1) を設定しています ...
update-alternatives: /usr/share/fonts/truetype/fonts-japanese-mincho.ttf (fonts-japanese-mincho.ttf) を提供するために自動モードで /usr/share/fonts/truetype/hanazono/HanaMinA.ttf を使います
fonts-mona (2.90-7) を設定しています ...
update-alternatives: /usr/share/fonts/truetype/fonts-japanese-gothic.ttf (fonts-japanese-gothic.ttf) を提供するために自動モードで /usr/share/fonts/truetype/mona/mona.ttf を使います
pi@raspberrypi:~ $

で、結果はこんなところですね。この画面はMacからです。xrdpパッケージをインストールすれば簡単にリモートデスクトップ接続できます。
f:id:WindVoice:20160501161911j:plain
Raspberry piは2台目なので、ホスト名を分けて使うことにします。簡単にpi2とpi3ですね。/etc/hostsに記載してお互いに接続できるようにして、基本設定はOKです。さて、次は本格的に使い道を考えようと思います。