タグ『 失敗話 』

≒ Sphereについて

Sphere

前のエントリで予定を書いていたやつです。昨日公開しました。アプリそのものと同じく需要あるか分からないけど、以下製作過程まとめです。

1)製作期間

2015年12月9日開始なので約一ヶ月。最初に公開したアプリとConfig画面(=処理)はほぼ共通なのでその部分は端折れた。
球体の3D座標はこのページを熟読して、サンプルからコピペしたコードで生成w
数学的素養がほとんど(まったく)無いからすごく助かった。
今初めて確認したけど(オイ)高専の公式ページだったのか。小坂先生本当にありがとうございました。サンプルコードすごく読みやすかったです。ここで言ってても意味ないな。

2)嵌ったところ

 webでThree.js使ってこのブログのヘッダーみたいなの作ったときは、最終的にシェーダー言語使うことを諦めてすべてThree.jsにお任せで処理を記述してるから自覚してるとおりページが糞重い。
ヘッダーの球体なんか色違いの面の数だけ球体を生成して各面の部分だけ表示させてるという体たらく。
そんで今回AndroidのopenGLで球体つくるにあたって、シェーダー言語使って無駄な描画をしないで多面球体を作りたかった。
結果を言えば道半ばで、面はそれぞれ一つのオブジェクトとして生成してる。どうしても座標を共有した状態で各面の色を変えるのは出来なかった。
つまり、小坂先生のコードで生成した(一つの)球体座標から、各面=四角形(台形)=三角形×2の座標をセットで切り出してるということ。ようするに面の数だけドローコール打ってるw やっぱり処理が糞重いw

 そしてもっとも嵌ったのは今回もマッハバンド。おかげで4日間試行錯誤して(=ググりまくって)、シャドウアクネだとかピーターパニングだとかopenGLのシャドーイングの定石みたいなのは色々勉強できたけど、結局あきらめた。
確かに視体積の適切な設定=near/far間を描画に必要最低限な長さに設定すると球体上部の細かなノイズは無くなった。
けど球体下部のノイズは残ったまま。AmbientLightの生成する影とpointLightの生成する影がコンフリクト起こしてるような感触はつかめたんだけど解決には至らず。
趣味のプログラミングで諦めるってどうなのとは自分でも思うけど、あきらめた最大の理由はこのアプリで採用してるOpenGL20の制約が結構あることが分かったから。
今回シャドウマッピングでRGBA値(=ColorBuffer)にZ値入れてるとかは、GL30だとデプスバッファが使えるから無用な処理らしい。
デプスバッファ使えたほうが当然精度は高いと思いGL30で書き換えるかと思ったけどGL30対応はAndroid4.3以上、フル規格は5.0からだということで今回は見送ったのです。対応機種減りすぎるからね。
結局カリングして球体裏面だけ描画して、そのあと表面だけ描画、さらにその間で地面の平面も描画してるからトータルで3回×面数ドローコールwwwそりゃ1秒に2回GC走るってw

 次点で嵌ったのは球体の脈動。リズムに乗ってるようにしたかったけど「リアルタイムBPM解析」は処理が重過ぎる。色々実装は試した。でも処理量がでかすぎて書いてる途中で躊躇するレベルw で、結局一定周波数以下の低音拾ってるだけww これは別の「リアルタイムBPM解析アプリ」でも作って試してから実装しようと結論。

「嵌ったところ」なんて書いてて全然解決していないw openGL30対応とかリアルタイムBPM解析とか色々課題はあるけど、今後このアプリいじるとしたらGCの軽減が最優先だなぁ。

3)その他

 今回ピンチイン/アウト処理を実現するのにGestureDetector初めて触ったんだけど、何これ便利! 実装も簡単だし、何よりGC走りまくってるのに遅延も無くスムーズに動く。前のアプリでonTouch直接いじってたのがうその様だ。
 最後の最後、公開用のスクショにも苦労。前のアプリのようにエミュでスクショ撮ろうとしたんだけど、無茶苦茶ノイズが出る。マッハバンドというレベルではなくて球体崩壊w
仕方がないので実機をつないで撮った。実機でもADMでスクショ撮れるのは知らなかった。実機でスクショとるのと違いpngで撮れるので画質もまずまず。
でもその結果タブレットのスクショは撮れず、「タブレット非対応」になってしまった。安いタブ買うかなー。
 エミュが使えないので困るのはAndroid 6.0(Marshmallow)でpermisson周りの挙動確認ができないということも一つ。前のエントリに書いたとおり。

4)まとめ

 まさに「自分向けのメモ」w 取り留め無く書き散らかしたけど、何ヵ月後かの自分が哀れみの目で見返せるレベルに達していると嬉しい。
あ、それと数少ないこのブログの読者の方でインストールしたよって奇特な方が居たら、どこでも良いのでダメ出しお待ちしてます。

≒ wikipediaデータ利用でハマった件

twitterデータを使って色々するサイトというかサーバは組めて、その経緯を残しておこうと思ったんだけど、この2~3日サーバ自体が不安定ですぐ落ちる。それを直してからまとめるとします。

そんでつぎにwikipediaデータで色々するサイト作ろうとしてるんだけど、まずはローカルのというかサーバでもなく手元のwindowsノートのMySQLに全データ突っ込もうとして四苦八苦。

mwdumper.jarでやるのが良さそうなのでまずは挑戦。やっぱりjavaが好き。

で、2時間ぐらいで終了。DBの中身は空w なんか初っぱなにERROR吐いてるのはわかってたんだけど、無視してた。というか処理止まらないし。このページを参考にcharcter-set指定。

java -jar mwdumper.jar –format=sql:1.5 jawiki-latest-pages-articles.xml.bz2 | mysql -u フガフガ -pホゲホゲ –default-character-set=utf8 wikidb

中身入った。けど色々見てみると何かおかしい。SELECT COUNT(*) FROM text でレコード数見てみると413000しかない。元データは1853286pagesあったのに。

ケツに >aaa.txt 2>&1  付けて処理を記録。ものすごい勢いで流れてっちゃうからね。

途中でエラー吐いてMySQLが終わってるらしい。「ERROR 1366 (HY000) at line 4241」

このページを参考にSTRICTモードを外す。my.iniで指定したんだけど上手くいかず。

mysql> SET @@GLOBAL.sql_mode=”; ってmysql内で設定する。ここで「なぜ指定が効かないのか」を追究していれば次のはまりは無かったのに…

で 結果)1853286pages count(*):1853286

無駄にDBがでかいので必要な部分だけ抜き出して別テーブルへ。
で、ERROR 1206 (HY000): The total number of locks exceeds the lock table size
ググった結果の対処法は「innodb_buffer_pool_sizeを増やす」一生懸命 C:\Program Files\MySQL\MySQL Server 5.6\my.iniを
変更しても反映されず。諦めてJAVAでなんか書くかと思ったが、最後にもう一度my.iniがどっかに隠れてないか検索。
見たことないのが出てきた→C:\ProgramData\MySQL\MySQL Server 5.6\my.ini???
変更したらちゃんと反映。くそ。

≒ wordpressのif文がわからない

(表題の件の解答は載ってません。あくまで備忘録です。)

職業訓練も卒業制作の期間に入って、毎日自習状態。
これなら家でやってたほうが環境(現実のとPCスペックと)は良いんだけど、出席足らずで訓練終了認定もらえなかったら元も子もないので、教室に来てしょぼいPCでコード書いてます。Eclipseが使えないのでPHPコードをごりごり書くのは敬遠して、前から気になってたこのブログがW3C先生に怒られてたのを直すことにする。
細かいの(id指定をclass指定に変えるとかね)を全部つぶして、最後に残ったのがページ遷移部分。wordpressのテンプレート通りだと、例えば先頭ページの場合、当然、もっと「最近の投稿」は存在しないのだけれども、<span>タグだけは出力されるので、「中身がないですよー」って怒られる。以下試してみた対処法。

  • if文でくくる。「if(『最近の投稿』を出力する関数』){echo”<span>”. 『最近の投稿』を出力する関数』.”<span>”}」
  • 同じく。「if(『最近の投稿』を出力する関数』){echo”<span>”;(改行)『最近の投稿』を出力する関数』;(改行)echo”<span>”;(改行)}」
  • 同じく。ぐぐってwordpress(というか別の書き方)のif構文に書き換える。「if(): ~ endif;」

以上全部駄目。なぜか<span>タグだけ出力されない。『最近の投稿』は出力される。試しに実行部分の『最近の投稿』を出力する関数』を削って「echo”<span>”」だけにしても『最近の投稿』だけ出力される。幽霊みたいでちょっと怖くなった。
まぁ、良く考えたら、分岐判定部分に記述している関数が実行されて処理を抜けちゃってることがわかったんだけど、今度はそれの直し方がわからない。つまり「if文で判定にある関数の実行結果を参照したい。けど実行はさせたくない」という問題。
if(()==”TRUE”)って明示してみたりしたんだけど全然駄目。

以上、午前中いっぱい使って駄目だったのであきらめる。宿題として覚えておく。まだif構文の理解が甘い。
え、でも治ってるって?<span>タグには&nbsp;突っ込んでW3C先生を騙してます…