ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

AttributeError: module '_Box2D' has no attribute 'RAND_LIMIT_swigconstant'

OpenAI Gymのbox2dの中にある、"CarRacing-v0"で遊ぼうとした。

gym.openai.com

このゲームをgymからではなく、直接操作して遊びたかった。

ソースを調べてみると、$HOME/.pyenv/versions/anaconda3-4.3.1//lib/python3.6/site-packages/gym/envs/box2d/car_racing.pyを叩けば良さそう。

$ python $HOME/.pyenv/versions/anaconda3-4.3.1//lib/python3.6/site-packages/gym/envs/box2d/car_racing.py
# ...
    _Box2D.RAND_LIMIT_swigconstant(_Box2D)
AttributeError: module '_Box2D' has no attribute 'RAND_LIMIT_swigconstant'

おろ?

Box2Dがダメっぽいが、pipとか使って落としてみたけど、ダメでした。

で、色々ハマりましたがここで解決法が乗っていました。

github.com

gitのリポジトリを落として、installするだけでした。

できたので、よし。

ゴールデンウィークにやったこと

雑なまとめ。メモしないと忘れると思うのでメモ。

旅行行きましたかって? 散歩以外していないです。

やりたかったこと

マリオカート64のゲームで強化学習したかった

案件で強化学習とか使う場合があるとかないとかで、勉強しないとやべぇってなったので、自分的に遊びで覚えるのが一番早い。

www.udacity.com

udacity(ゆだしてぃ?)の自動運転エンジニア養成の授業を受けたかったんだけど、なんと8万円!これがterm1から3まであるらしく、合計24万円とのこと。

qiita.com

多分金額的には安いんだと思うんだけど、しかし今は金がない。ので、mac上で動くエミュレーターでゲームを動かし、それをopencvで環境から情報を取得しアクションするってことができるんじゃないかなと、勉強できるんじゃないかなと思ったわけです。

ところが問屋はおろしてくれない

まず、udacityの授業を受けている人たちはgithubにソースを上げてくれているので、それを見てマリオカートに最適化?しようと考えました。

んで、ソースを見ているんだけど、全くとは言わないが難しい。

車線を描画するところでギブアップ寸前ですよ。なんじゃこりゃ。

なんとなーく流れは掴めているはずなので、やろうとしていることは理解できていると思いますが、どうしてこれがこうなるという流れが全くわかりません。特に数式!

opencvとかのドキュメントみると、これはこういう原理(数式)で値を求めることができます。それを描画しています。なんてことしか書いていないのですね。それだけみれば、「はーい」なんて、そのままやればいいんだけど、多分チューニングで死ぬのでそうはいかない。

「いやいやソースみればわかるでしょ?」って思うじゃないですか? 実装されているのであればいいのですが、例えばnumpyにある関数で「arctan()」という関数があります。「なんじゃこりゃ?」てドキュメント見に行くでしょ?「tanθの逆関数ですね」だって。意味不明。

numpyの実装を見に行けばなんとかなんて思うかもしれませんが、そうすると時間があっという間に過ぎていきますね。oss読むのは必要な箇所だけでいいのです。これを全部網羅すると大変です。

数式を全部覚える必要はないと過去ある人から伺ったことがあります。フレームワークとして利用するのでおkって感じですね。しかし、私は基礎がボロボロなので、すぐイメージがつかめないのです。辛い。

この世界の面白い(?)ところは、数式スタートなんですよね。「こういう数式があるよね? これはね。Opencvのこのメソッドできますよ!」なんて説明みても、数式がわからないとわからないのです。

書籍読んでも数式。深層学習の本を読んでも数式。画像処理も数式。

このとき既に2日立っていますが、全く進まないわけですえね。ヤバイ。このままじゃダメだ。

ということで、行き先チェンジ。一旦体系的な学習は諦める。

数式の苦手意識は何なのか探す

そもそも、中学や高校前半は数学って結構好きだった覚えがあります。少なくとも英語や国語よりはモチベーションが高かったです。

なんでこんなにわからなくなっているんだっけ? 多分サボっていただけなんじゃないかなと思うけど。

はじめはプログラミングと一緒にやっているうちに覚えるでしょ?と考えていましたが、機械学習の本を読むと数式で説明する書籍が多く、そこで積みます。

ということは私は数式を見ると頭に入らないマンになっているということ。ならば、それを潰していきましょう。

で、色々ググってみると

qiita.com

数学に関しては、微分線形代数、統計の知識が必要になります。

ということらしいです。

じゃあそのあたりを勉強しようと思いました。

統計は会社の研修で一通り勉強したのと、復習で下記本で4月は勉強していました。ので、多分大丈夫なはず。。。(半分ウソですね)

こちらの本はRで書いてあるんだけど、あえてPythonに書き直し中です。一旦全部読んで、いまちまちまPythonで実装しています。

これはわかりやすかった。計算の流れをわかりやすく書いてくれています。レビュー書いている途中。

↑の続きです。これは書いた人が変わった?ぐらいわかりづらくなっていました。怒りを覚えるレベル。

で、次のステップアップで。と、同僚さんにオススメされまして、購入しましたが、無事死亡。sin?cos?tan?なんだっけ?それ?

とまぁこんなレベルなので、どうしよどうしよ。本をまた購入しなければいけない?とおろおろしてたら、こんな動画がYoutubeにあがっていました。

www.youtube.com

これはすごくわかりやすい。

説明の動画のあとに演習の動画で2本で1セットずつ進むんだけど、だいたい説明が基礎で演習が応用の解き方しないと解けないので、基礎をしっかり勉強しないと積むような流れになっています。記憶が新しい人は動画を流し見するだけでいいと思うけど、高校通っていたけど、まったく記憶にない私みたいな人はノートとペンが必須です。書かないと理解できん。

自分で解くと時間がかかるので、中々前に進みませんが、いまんところ、数ⅠAの三角比が終了したのと、数ⅡBの指数対数の半分まできましたねー。やああっとあの意味不明な「log a」と書いてある記号?文字の意味が理解できました。これ機械学習の書籍によくでてくるので、きつかったんですが、いまはもう大丈夫b

この調子で5月中までにはなんとか高校を網羅できればなと思います。

解けないときはイライラ(#^ω^)しますが、解けたらすごくスッキリするね。

英語覚えないといけない

↑で数学でハマった。という話しをしましたが、他にも問題が。。。

機械学習の有益な情報。だいたい論文。んで、ほぼ英語なんですね。読めん。

一回アメリカ行ったことがあるので、数式よりはモチベーション高い英語ですが、これこそペン以外で覚えたいです。

いつか勉強はするんでしょうが、これは体系的に覚えたほうが絶対はやい!と思っています。

別に試験するわけじゃないので、これが一番速いでしょ。

机の上で勉強 < 英会話にかわる < 友達探す

みたいな条件が頭の中に浮かんだので、さっさと友達を探すことしました。

www.japan-guide.com

素晴らしいサイトです。海外にいて、日本に興味がある人が登録しているらしいです。日本語を覚えたいって人が多く、日本人からすると、日本語教えるから○○語教えて?ってことができるってわけですね。

以前後輩から教えてもらっていたサイトがこちらだったので、そのこと思い出して早速登録しました。

ちなみに「プログラミング好き」って書くとその通の人達からメッセージがきました。お前ら日本に興味ないんかい。

そういえば返事返していない(´・ω・)。これも少しずつ進めていきましょう。早く友達にならなければ。。。

あと他にやったこと

なんと!予定もなかったので、お金おろすことを忘れていて、財布に5000円しかありませんでした。

ラーメン2杯食べました。

その他はバナナとキャベツで過ごしました。運動も散歩でカバー。順調に痩せている感じがします。

頭空っぽにするためにB級映画みました。まぁまぁいいんじゃないかな。

感想

沖縄にいても東京にいても引きこもりは引きこもりでした。

1日ぐらいはどっかホロホロすべきかね。秋葉原はもう行き尽くした感あるし、お台場のガンダムは今年3月の終わっちゃったし。。。

うーん。スカイツリーは見に行くべきかな。暇ができたら考える。

わからないことがわからない

一日中やっても成果がない感じのジャンルが久々にきました。全くもってモチベーションが上がりませんーーー!! orz

数学を勉強したらいいのか、それとも数式やアルゴリズムを丸暗記して、InputとOutputだけ理解できてればいいのか。勉強の風呂敷をどこまで広げたらいいのか全くわかりません。

高校のときちゃんと勉強しておけばよかった。なんて、考えても時間の無駄なので、勉強するしかないのです。

はい。結論でました。頑張りましょう。おやすみ。

冷蔵庫ない生活をして1ヶ月が経ちました

只今上京中です。

引っ越しに26万ぐらいかかりました。さほど大きなお金ではないんじゃない?と思いますが、私にとってはほぼ全財産を使ってこっちにきたため、お金がほぼない。

というわけで、家具家電を買うことはありませんでした。 ※さすがに枕は買いましたけど。眠れない。

その中で心配だったのは冷蔵庫。冷蔵庫ってなくても生きていけるの?ってめっちゃ心配でしたが

matome.naver.jp

pocyaco.com

あらあらあらあら。結構いるじゃない。

色々記事はありましたが、その中でも参考になったのはこちら

冷蔵庫なしで生活するための完全マニュアル!一人暮らしからホテル生活の人へ

冷蔵庫無しで生活するため、食材の補完方法が書いてあります。これは助かりました。

はい。そんなこんなでなんとか生き延びているのでとりあえずやったことを書いておこうかと思います。

よかったこと

「卵」と「豆腐」があれば生きていけました

本当にすばらしいと思う。毎食卵1つあれば生きていけました。お腹はめっちゃ空いていましたが。

この本当すばらしい卵さんはなんと冷蔵庫なくても補完できるやつです。ただ、生では食べていません。怖いので。

いまんところ、12個入りを購入したら1週間たたずでなくなります。

ただ、東京の卵って結構高いと思いました。180円~300円近くですねー。一番安いところは業務スーパーで180円でした。

んで、豆腐さんにもお世話になっております。

これは冷蔵庫ないとキツめの食材ですが、購入してきたら12時間以内には食べています。

絹ごしを食べています。醤油かけたら終わりですね。

また、一丁(?)を食べるとお腹いっぱいになるようになりました。40円でこのコストパフォーマンス。本当すばらしい。

食材は食べるときに買う

冷蔵庫がないと作り置きができないので、最低限すぐ食べるものを購入するようになりました。お財布にもやさしいし、無駄がなくなりました。これはいい傾向。

(たぶん)痩せています

冷蔵庫がなければ、冷たいビールは飲めない。実家にいるときは親の酒を勝手に飲んだりしていましたが、いまそれがほぼありません。(会社の飲み会に誘われたら行っていましたが)

また、金もないので外食もできず、お昼は弁当を作ったりして、ずっと自炊していました。

ちなみに、自分の美味しくないご飯ばっかりだとストレスたまると思っていたので、毎週水曜日の昼と毎週土日どちらかは外食おkにしています。痩せるため?いえ、財布のためです。

悪かったこと

便がなんかよくない?

最初吸収されすぎていて、出るものが少ないのかな?と思っていましたが、あんまりよくなさそうな感じですね。

kenko-chokin.com

野菜をちゃんと取ればなんとかなりそうな気がします(多分)。

お肉やお魚が食べれない

腐敗が速いこの2つは多分無理ですかね。

豆腐のようにすぐ食べるなら購入しても良いと思いますが、中々踏み切れないですねー。

雑な感想

この内容って冷蔵庫がない記事じゃなくて、冷蔵庫なしで貧乏だけどちゃんと生きています。っていう内容ですね。

前職の給与が振り込まれたので、もう貧乏しなくてもいいんですけど(かといって油断はできませんが)、面白いのでこのまま続けます。

【WordPress】「 Warning: Missing argument 3 for _post_format_get_terms()」とか「Warning: strpos() expects parameter 1 to be string, array given in」のエラー

WordPress4.2ぐらいのバージョンで発生した事件です。

WordPressはエラーを画面に表示することは設定を変更すればいけます。んで、本番では発生していないように見えて、デバッグ設定が入っている開発環境でエラーが発覚するということは多々ありました。今回もそんな類のやつでした。

Warning: Missing argument 3 for _post_format_get_terms() xxx in plugins.php: 213

まずひとつ。

WordPressを利用している日本ユーザーは多いほうだと思うので、だいたいググったらわかりますが、こういうのは長期戦となります。

まず、エラーを読んでみると引数の3つ目がありません。とのエラーです。ということは何か関数の使い方が間違っているのでは?と推測できます。

しかし、そのような箇所は見当たりませんでした。

ソースの変更をgitで管理しているのならラッキーです。一旦過去のコミットに戻って、このような症状が発生しているか確認してみましょう。

過去を見てもだめでした。おお。なんということでしょう。リリースしたときから発生していたようです。。。困った。

最終手段で一番最初からやるべきこととしては、「処理を追って、コードを読むこと」です。コードを読み慣れている人は最初からやったほうが原因がつかみやすいと思います。(めんどくさいからあんまやりたくないけど)

PHPの場合だとスタックトレースが表示されるので、どのファイルのphpのどのメソッドへ飛んだかというのが書いてありますので、それを追ってコードを読んでみました。

すると、今回の原因はここで発生しているようです。

  • ~/wp-includes/plugins.php
<?php

// ...
    do {
        foreach( (array) current($wp_filter[$tag]) as $the_ )
            if ( !is_null($the_['function']) ){
                $args[1] = $value;
                $value = call_user_func_array($the_['function'], array_slice($args, 1, (int) $the_['accepted_args']));
            }

    } while ( next($wp_filter[$tag]) !== false );

209行目あたりにあるこのdo whileループの中に、call_user_func_arrayという関数があります。これで_post_format_get_terms()を呼んでいるようですが、呼ぶときに3つ目の引数が必要なのに、うまく渡せていないようです。

で、エラー箇所から順序よくエラーを確認した結果、カスタムタクソノミーのslug名がtermsという名前だったのが原因でした。WordPressの予約言語ようなこのtermsをカスタムタクソノミーで利用すると、WordPressのデフォルトの処理と勘違いしてしまい、他の名前で登録したカスタムタクソノミーが入るはずのない処理に取り込まれて動作してしまいました。使い方のミスですね。

ここからわかったことで、次のアクションとしては、既存のタクソノミー名を変更してあげれば良いということです。

ただ、注意点としては、カスタムタクソノミーの名前を変更するのはDBから変更して上げなければいけません。

下記URLを参考にしました。

WordPressテーマの作り方 » タクソノミーの名前を変更する

これでエラーが無くなりました。( ´ー`)フゥー...

「Warning: strpos() expects parameter 1 to be string, array given in」とか色々諸々のエラー

Warning: strpos() expects parameter 1 to be string, array given in

Warning: preg_split() expects parameter 2 to be string, array given in

Warning: Invalid argument supplied for foreach() in

わー、エラーがいっぱい。

これはエラーを見る限り、「stringを入れるところに、arrayが入っている」だったり、「foreachへの引数がない」のようなエラーですね。

上で対処したことを参考に、今回もソースを読むことを先にしました。

  • wp-includes/query.php
<?php
// ...
               if ( strpos($term, '+') !== false ) {
                    $terms = preg_split( '/[+]+/', $term );
                    foreach ( $terms as $term ) {
                        $tax_query[] = array_merge( $tax_query_defaults, array(
                            'terms' => array( $term )
                        ) );
                    }
                } else {
                    $tax_query[] = array_merge( $tax_query_defaults, array(
                        'terms' => preg_split( '/[,]+/', $term )
                    ) );
                }

1871行目あたりにこのコードがあります。ちょうど、strpos()のほうでエラーが発生しているようですね。

このコードを囲む関数はparse_tax_query()という関数です。調べてみると。「カンマ区切りのtaxonomyをパースして、検索するパラメータにしてくれる」ような関数なようです。

ちょっとこの件はややこしかったです。ちゃんと理解できたわけではありませんが、どうやら原因としては、「拡張した検索のクエリパラメータで、カスタムタクソノミー名と同じkeyを利用すると、不可解な動きをする」ということがわかりました。

どゆことかというと、発生している箇所がWordPressの検索を拡張したphpのところでした。通常検索する場合はs=という値をクエリパラメータにセットすれば、WordPressはそのリクエストを検索と認識し動作するようになります。

んで、それに乗っかるように、自分で作成したPHPを書きました。単純にフォームにカスタムタクソノミーの一覧を表示して、nameをslugにする。そして、それをgetでリクエストして、検索側でquery_posts()へ値をセットして、検索する。という流れです。

この時、nameをslugにするにすると、keyがslug名となります。これがダメなようですね。

これをやってしまうと、何故か画面いっぱいにエラーが発生します。。。疲れたよ。

解決としては、クエリパラメータに利用するkeyの名前をslug名以外にすればおkです。php内部ではslug名を指定してあげなければ、検索はできませんが、くクエリパラメータ上では違う名前にするって話ですね。

んー。でも経験としては、過去このように組んだサイトって結構あったような気がしていて、そのときはそんなエラーは発生しなかった覚えがあります。バージョンのせいなのかな?

よくわかっていませんが、とりあえず2日ぐらい悩ませたエラーは修正できたので良しとします。