はてなキーワード: 浮動小数とは
暗黙的にJSTとして時間を使ったせいでUTCで作った場所で盛大にバグる
応急処置でバグったところを+9とかやってしまうと、それ以降に逆に誰も気付かずに更に影響範囲が拡がったりする
海外展開しようとしたときにバグに気付くがどうしようもなくなって途方にくれて海外だけは別アプリになったりする
UNIXTIMEを使えば楽なんだけれど、そうすると生データぱっと見で時間を判別できないので困ることも多い
素直にUTCでISO8601が良い
とりあえずUTF-8にしとけば大丈夫、ってことで実装を進めた結果、Mac/Winでハマる
他にもBOMでハマったりして、むしろSJISの方が良かったんじゃ無いか、とか言い出す
DBが統一的になっている場合はまだ後からどうにかできるが、変なところでキャッシュされてたりすると凄い困ることになる
MySQLなりPostgreSQLなりでUTF-8を正しく扱う方法はいろんな記事があるのでちゃんと読んでおけば問題無い
とかよく分からないことを言い出して価格を浮動小数にしてしまう
確かに米国なら$2.43みたいな感じで価格を使ったりするし、むしろ小数点以下が無い通貨の方が珍しいのだけれど
丸め誤差を考えないで作ってしまってバグが見つかりめちゃくちゃ揉める
プログラミング未経験から1ヶ月ほどで、将棋の評価値の新たな方法でのグラフ化を行うPythonツールを作った。
https://github.com/k-the-p/notherscore
この記事は2本立てです。プログラミングより結果のグラフや将棋に興味がある方はもう一方の将棋編から読むことをおすすめします。
未経験から1ヶ月!Pythonで観る将ライフを向上させた話(将棋編)
AIはわれわれアマチュアの将棋への親しみを大幅に向上させてくれた一方で、棋士が悩みに悩んだ結果として評価値が下がる手を指してしまったときに、「悪手きたwwww」と騒ぐ主にABEMAのコメント欄には忸怩たる思いがあった。
とはいえ、もう評価値を知らなかった時代に後戻りするなんてことは誰にもできないだろう。そして、電王戦から将棋にハマった自分自身としても、AIを否定はしたくない。
であるなら、AIを用いた新しくよりよい将棋の楽しみ方を探っていくしかないのではないか。
以前から私は、「AIの手を指せるなら人間も苦労しないんだよなあ」と思っていた。あるとき藤森哲也先生がYoutubeチャンネルで言っていたことを聞いて得心がいった。「AIの一手は最強の一手なんです。確かにプラス1000点になるけど一手間違えた瞬間にマイナス何百点になるような綱渡りの手。それよりもアマチュアの皆さんにはプラス数百点で得は少ないけど安全な道、最善の一手を学んで欲しい」(大意)と。
ここで言う「最強の一手」に人間にして最も近いのは紛れもなく藤井聡太四冠であろう。藤森先生はアマチュアに向けて喋っていたが、その葛藤は間違いなくプロの中でもあるはずである。渡辺明三冠が言うように「藤井くんと全く同じスタイルを今から目指しても絶対藤井くんより強くなれない」のは自明であるからして。
私はここにドラマがあると思う。また、最強の一手と最善の一手が等しく「いい手」に見えてしまうわれわれアマチュアとしては、そこを機械に教えてもらえるのであれば、棋力向上にも繋がりそうである。
第1候補手と第2候補手の評価値の差を取ってグラフ化すればよさそう?
(差が小さければ手が広い、差が大きければ絶対手に近い、綱渡り)
目指すのはあくまで便利な将棋ツール。将棋AIを作りたいわけではないので、将棋AI自体は局面を入れたら評価値を吐く謎の箱という扱いでよい。
グラフ化や数値の扱いだけでなく、将棋AIとのやりとりをやってくれるあれこれもあるようなので。
あと習得が楽だと聞いた。その話を教えてくれた人はもう10年間英語学習法をブクマし続けてるけど。
あと「読みやすいコードじゃないと動かない」って設計思想がかっこいい。ついでに言うといわゆる「おまじない」が少なそうなのも魅力。(CのHello worldで挫折した経験あり。studio.hって何……)
プログラム講師をやっている?方が音楽制作を初歩からやってみる、という(残念ながら)リアルタイム視聴者が俺だけしかいないような配信があったので、音楽の基礎(についての知識は持っていた)を教えてあげたお返しのような形で、「pythonでこういうことがしたくてこういうライブラリがあるのはわかった。経験はHTML+CSS(変数導入前、Bootstrapなんてなかった)のみ。どうしたらよいか」という質問をしたら、「progateは簡単すぎると思うのでPaizaが丁度いいのではないか」というアドバイスを頂き、比較もせずに即登録したのだが結果的にはこれがドンピシャだった。
最近流行りの、環境構築不要で講座の内容を書いて覚えるタイプのサイト。
無料で入門講座の序盤を受けていたらふと目に入ったのが、「対象者:これからプログラミングを学びたい方。HTMLがどのようなものかを知っている方。」でYoutuber先生のオススメ完璧か?と思った。そして実際に完璧だった。
基本的に1講座3分+演習1~2問+やりたければ問題集たくさんという形式なのだが、これが簡単すぎることなく難しすぎることもなく、俺の知識レベルにベストマッチだった。基本的に毎回何か書くことになるので、変数とは~みたいな解説だけで終わる回がほぼ無いのも飽きなくてよい。
Python入門(と言ってはいるがまだこれだけで発展編はない)の見出しは「プログラミングとは」「条件分岐・比較演算子」「ループ処理」「リスト」「辞書」「多次元リスト」「関数」「クラス」「クラス発展」「例外処理」に各5~8講座*3分+演習、という感じ。クラス発展の途中で行けそうだと思ったのでドロップアウトして実製作に移った。実際関数まで理解していれば、この程度の小さなツールには十分だった(もしかしたらクラスを使えば多少楽になった場面はあったかもしれないけど)。
また、これは書いてる今気づいたことだが、上のコースで学んだことで、実際に役立たなかったものはほとんどなかった(強いて挙げれば辞書くらい?使えてないだけかも)。このこともコース構成の優秀さを示している。
ここまででだいたい2週間くらい。
もともとこのサービスは知っていたのと、谷合先生が実際に使っていたように、便利そうなライブラリのcshogiが主にcolab(jupyter)上で動かすことを意図しているようだったので、まずここから入った。最初はcshogiが列挙してくれる特定局面での合法手をリストに入れて、そのリストの項目数=その局面での合法手の数を出力することから始めた。これは本当に簡単にできて興奮した。
学習と好きなことが直結してると、こんなサンプルコードみたいな簡単なことで喜べるのでコストパフォーマンスがよい。
cshogiのチュートリアルで紹介されているレサ改というAIがどうもmultipv(有望な候補手を2手以上挙げる)に対応してないらしく、強さ的な問題でいずれ手を出すつもりだった予定を繰り上げてやねうら王との連携を試みる。
makeって何?あー、もりかしてMakefileが無いと動かない?(これを書いている今もこんな理解である)みたいな人間でもなんとかやねうら王をビルド?することはできた。レサ改をcshogiに読ませる数行のサンプルコードがとても役に立った。今でもあの完成品らしき拡張子が無いファイルがなんなのか分かってない。(なお、評価関数nn.binが無いと怒られたのでどこのご家庭にもある水匠4のそれをぶち込んだら動いた。評価関数とやねうら王の分担は今もって理解があやふや)(また、途中でAyane[やねうらお氏謹製ライブラリ]も使おうとしたがcolab上では上手く動かす方法が分からなかった)
一応これでcshogiで局面の最善手と次善手およびそれらの評価値を呼び出せるようになったのだが、単にdebugでずらずらと余計なものまで出力するのではなく、重要な指し手周りのinfoだけ出力するようにしようとしたが、上手いやり方がわからず、結局こうなった。
sys.stdout = open('out.txt', 'a') engine.go(listener=print)
ここは絶対もっとマシなやり方があるはずなので、識者の教えを請いたい。
Colab上でまあまあ目処がついたので、この辺りでPythonの環境を作った。ここまでそれをやっていなかった理由は、「おま環」トラブルの可能性をなるだけ遠ざけておきたかったからである。環境が悪いのか俺が悪いのか分からない、というのは初心者にとって限りなきストレスである。あーネットが繋がらなくてルーターの設定や接続とか支払いとか文字通り部屋をひっくり返しながら調べてたら実はフレッツ自体が落ちてた件を思い出してイライラしてきた。cshogiはJupyter上で動かすことを意図しているようなので、それで動かなければ自分の書き方が間違っているのだとほぼ確実にわかる。
まあこの辺りはいろんなサイト見ながら仮想化などしつつ普通に。仮想化が何か分かってないんですけど。
これまでColab上で書いてきたものは多少の書き換えで動いたので、ローカルにJupyter notebookをインストールして、数字の計算とグラフ化を試みる。
ちなみにこの時点で得られているデータはこんな感じ。
go info depth 1 seldepth 1 score cp -47 multipv 1 nodes 483 nps 241500 time 2 pv 3c3d info depth 1 seldepth 1 score cp -86 multipv 2 nodes 483 nps 241500 time 2 pv 4a3b info depth 2 seldepth 2 score cp -53 multipv 1 nodes 847 nps 423500 time 2 pv 3c3d 9g9f info depth 2 seldepth 2 score cp -68 multipv 2 nodes 847 nps 423500 time 2 pv 8c8d 7g7f info depth 10 seldepth 17 score cp -78 multipv 1 nodes 100163 nps 1963980 time 51 pv 8c8d 2f2e 4a3b 7g7f 3c3d 2e2d 2c2d 2h2d 8d8e 6i7h 8e8f 8g8f info depth 10 seldepth 17 score cp -111 multipv 2 nodes 100163 nps 1963980 time 51 pv 3c3d 7g7f bestmove 8c8d ponder 2f2e go info depth 1 seldepth 1 score cp 117 multipv 1 nodes 206 nps 206000 time 1 pv 2f2e info depth 1 seldepth 1 score cp 78 multipv 2 nodes 206 nps 206000 time 1 pv 7g7f ...
今回の小目標は、goで区切られた中から下から2行目と3行目のcpほにゃららを取得していい感じのリストにする、というものだ。この辺りは正規表現でなんとかなるだろうと見通しを立てたが、実際そうなった。
ただ、後手が見たときの評価値が後手目線なので、それだけにマイナスをかけるのはどうするか(そうしなければ、先手+3000点の次が「後手から見て」-2900点だったりして綺麗にグラフにならないのだ)を調べるのに結構時間が掛かった。
また、詰み周りでまたプラスマイナスやカンストの絡む計算をしたくないのもあり、数値にNaNを入れてグラフ表記を省略することにしたのだが、そうするとnumpyの関係で整数(とNaN)しか扱わないのに浮動小数点で計算しなければいけなくなって若干気持ち悪かったり。まあ動くのでヨシ!
この時点で、ローカルにKIFファイルを保存し、pyファイルでcshogiと水匠を動かし、Jupiter notebookを開き評価値グラフと手の広さのグラフを重ねて表示する、というそれなりのものは出来上がった。
簡単に言えばpyファイルで1手10万局面(森内チャンネルに出てたHEROZの方が使ってた数字をそのまま使っているので特に意味は無い)探索させ、最善手と次善手についての生の評価データを吐き出させ、ipynbでそれを整形し、グラフ化している。
基本的に全部VSCode上でできるので、慣れれば計算時間も含めて10数秒で結果が出るのだが、このワークフローはいかにも美しくない。
なので、Flaskという簡単らしいフレームワークを使ってローカルでWebアプリとして使えるようにしようと思った。inputとoutputをどうにかするだけだから余裕やろ。
Google colabを触り始めてからここまで1日。圧倒的成長!
Paizaラーニング再び。後半ではデータベースとか本格的な話もあるようなのだが、txtに書き込む一行掲示板を作るまでの前半部を高速で履修(演習は全部飛ばした)。なるほどー、こうやってやりとりするのね、と最低限は完全に理解した。
Jupyter向けのコードを普通のPythonに直してあっちで数字を出してこっちでそれを受けて元に戻して……とかやってると循環参照か何かで怒られることに。その対策に細かく部分を分けて関数にしたのだが、その場合ってもしかしてdefの内部しか読まれない?(共通部分も読まれると思ってた)(いや、共通部分は読まれるけど他のdef内が見えないのか?何も分からん)なるほど。こうなると関数の内部から上に戻るためにクラスとか欲しくなるのかなーという感想。
最終的にWebに公開しようとこの時点では思ってたので、txtに一旦出力するのが安全性的にどうかとか考えてたのだが、テキストの読み取り周りでハマる。結局抜け出せず諦めた。
以降は、HTMLにダブルクオートが抜けてるのに一時間気づかないとか、FlaskのXSS対策の対策をするとか、ファイルの書き込み設定をミスって2万手くらい蓄積されて評価値グラフが大変なことになったが、原因に気づかずひたすらグラフ生成部を調べ続けるなど、非本質的な問題にかかずらっていたので書くことは特にない。
なので、最初にgitignoreしてなかったせいで1万ファイルくらい上げそうになったけど、それ以外は特に問題も無く。中間報告からここまで2日ほど。結局1ヶ月かけずにプログラミングをそれなりに身につけることが出来た。「プログラムを覚えたければ作りたいものを見つければいい」というのは本当だな、と改めて思った。
https://anond.hatelabo.jp/20220107060727
どれくらい書けるようになったのか、を見たい方は主にvalue_output.py(将棋AIに思考させてデータを取り出す)とgraph.py(データを整形してグラフを書き出す)を見ていただければいいかと思います。
最初にPaizaを教えてくださったYoutuberの方、cshogiを初心者でも使いやすいように作って展示してくださったTadaoYamaoka様、水匠開発者のたややん様、水匠含めこんにちの将棋AIの基盤を作ってくださったやねうらお様、cshogiを通して利用したpython-shogiのKIFパーサーを書いてくださったTasuku SUENAGA様に、厚く御礼申し上げます。
どうも、以前こんなの書かせていただきました。
突然、紹介されるAndroidアプリ集を書いた増田のガジェット
ガジェットマニアとしての自己紹介みたいなものなので趣味の傾向を知りたい場合は以前のエントリを読んで貰えれば何となくわかるでしょう。
長々と出囃子をやっても仕方ないので早速本題に入りましょうか。
題して【今のiPhoneは優れているのか?】
「iPhoneは優れている」と主張されれば100人中99人はこの主張を肯定すると思います。実際に筆者自身がこの主張を耳にしたら筆者も肯定しますし、流行に敏感な高校生の姪っ子もおそらくは肯定してくれることでしょう。
しかし「iPhoneは優れているってことで結論ね」で終えてしまうのは芸がない。そもそもエントリを描く意味すら無い。
わざわざ書き始めたということは目的があって書いているわけです。
ここまでの書き出しでこれに気付いた人は非常に賢いか、筆者のように物事を斜に構えてみているかのどちらかだ。
一言で「iPhoneは優れている」と表現しても評価できるパラメータは膨大にあり「iPhoneは優れている」との主張へ多くの人が肯定を示していても「iPhoneは○○が優れている」の○○は人によって違う可能性が高いのだ。
そしてその個々人の価値観は話題となった下記のエントリへ寄せられる声で知ることが出来る。
個々人が各々にiPhoneへ優れている点を見出しており、ある意味でiPhoneの評価は一様ではないとわかる。
しかし、筆者と趣味を同じくするガジェットマニアの皆さんはこの程度のことで感心してはくれないので、もう少し踏み込んだ話をしよう。
「iPhoneは○○が優れている」の中でもかなりポピュラーな主張である「iPhoneは“性能”が優れている」だが、実はこれAppleは結構雰囲気でこのイメージを押し通そうとしているフシが最近ある。
まずiPhone 13無印とiPhone 13 miniを発表した際「率直に言って去年どころか2年前の私達のチップに追いつこうとしているところです」と主張した後に搭載するSoCであるA15 Bionicを指して「(A15 Bionicを使ってもっと)差を広げる」と主張した。
更に「主要な他社製品より最大で50%も高速です」「グラフィックスは主要な他社製品より最大で30%も高速です」と付け加えた。
もうおわかりだろう。主要な他社製品とは?最大で50%や最大で30%とはどういう演算能力のどういうシチュエーションで高速なのだろうか?実際のところAppleの発表を見てもよくわからないのだ。
ガジェットマニア、そしてコンピュータの性能を測ることを生業としているベンチマーカーはコンピュータの性能を比較するためのポピュラーな演算方式と単位系を持っている。浮動小数点演算とその単位であるFLOPSだ。
浮動小数点演算と言っても単精度や倍精度とかまぁ細かく言えば色々あるけれど、わざわざn%とかいう相対値など使わずnFLOPSのような絶対値を使ったほうがわかりやすいに決まっている。
しかし何故か最近のAppleは相対値が非常に大好きで、何なら比較先のチップすら「主要な他社製品」とボカしてしまう有様だ。
もしかしたらAppleフリークは「一般人へのわかりやすさを重視したんだ」と言うかも知れないけれど「アナタのペーパーテストは他の人より50%上です」と言われてわかりやすいだろうか?普通は「50%はわかったから自分は一体何点だったんだ?」と思わないか?
いやそれでもAppleフリークは「絶対値あるじゃん!16-core Neural Engineは15.8兆回も演算が可能ですって言ってるぞ!」とAppleの出す数字を信じるのかも知れない。
いや、その機械学習モデルは何なの?どういう機械学習モデルが15.8兆回演算できるの?知ってるなら逆に教えて欲しいとガジェットマニアやベンチマーカーたちは思うのだ。
オマケとしてもう1つ付け加えよう。
元記事の増田はどうやら「iPhoneは“ゲーム性能”が優れている」と評価しているようだが、ゲーム性能が良いからと言ってイマドキのスマホゲームで有利になるとは限らないのがイマドキのスマホゲームなのだ。
言ってしまえばイマドキのスマホゲームはPay to Win、つまり課金すりゃ勝てるゲームシステムを採用していることが多くあり、実は課金を考えた場合はiPhoneよりAndroidのほうが投資額が少なくて済むのだ!
まず前提としてGoogle Play Storeは事実上のキャッシュバックがある。更にキャッシュバックキャンペーンもあり、特定のゲームタイトルへ課金した場合に通常よりも多くキャッシュバックが得られることがあるのだ。
そしてAndroidにはGoogle公式のお小遣い稼ぎアプリたる「Googleアンケートモニター」の存在が強すぎる。
https://play.google.com/store/apps/details?id=com.google.android.apps.paidtasks
Googleアンケートモニターはアンケートに答えるだけで少額ではあるがGoogle Playポイントを貰うことが可能。まぁつまり個人情報を売ってポイントを得られるだけなんだが、貰えることに意味があるユーザは少なくないだろう。お小遣いに限りある学生とか。
つまり、iPhoneユーザの10,000円課金とAndroidユーザの10,000円課金は意味が違う。Google Play Storeの実質キャッシュバックは100円につき1円キャッシュバック、キャンペーン時は3円キャッシュバックなのでAndroidユーザは10,000円課金すると実質10,100円を課金することが可能なのだ。
そしてそこへGoogleアンケートモニターを加えると、真面目にアンケートに答え続ければ1ヶ月で500ポイント前後は貯まるのでAndroidユーザの1ヶ月10,000円課金は実質的に10,500円課金になっていると考えたら良い。Pay to Winでこの差はデカイ!
というような感じで、一般的な目線からわざとズレて変な角度からiPhoneを評価してみたけれどもどうでしたか?
iPhoneには優れた面が沢山あるけれども、わざと面白おかしく評価することも可能であることを見せてみたかった。
ちなみに筆者がiPhoneを使っていない最大の理由が「ハードウェアQWERTYキーボードが搭載されていないから」なので、いつか搭載してくれることを心待ちにしてエントリを終えようと思います。
いえいえ、なんかの助けになれば幸いですけど😃
あと、ソースコード読んでるなら命名はやっぱり大事だなあと思う
最近も命名についてちょっと考えさせられてしまうことがあったのだけど
命名からググってというのも自分の場合はかなりヒントになる、助かる
知らない分野でもとりあえず関数や変数の名前でググってみるとか(というか、Googleない時代を考えると地獄だよなあ
コメントも適度にあるといいとは思うけど、過剰にコメントする意味はないし、
といっても、コメントを書く必要があるかないかって当然だけど読む側のレベルを試されているんですよね
やっぱりハッカーが好きそうなトリッキー?な書き方があったりして、
でも、こういうときはこう書くものだ、みたいなのがあったりもするので、
昔のゲームとか、あとメガデモみたいなのもそうだけど、浮動小数点演算とか富豪すぎるので、
整数演算でいかに適当に誤魔化すかみたいな、精密さより高速にそれらしく動作するのが求められるのもあるし、
自分の場合はレベルが低いのか、知らなくてもググって調べてけば大体なんとかなってる
でも、発売前のゲーム機と書いたけど、公開されてないのでググっても出ない情報、社外秘のソースコードとか技術で、
特にレベルが高いのとか、逆に酷く汚いコードだけどなんか動いてる()みたいな場合は、
例えば、サンプリング定理(標本化定理)を知らなければ音声の録音も圧縮も理解できないのは当たり前。
だから、大学で情報科、もしくは電子工学や機械工学を履修するのは無駄ではない。
日本の専門学校だと給与が安い仕事の即戦力になるようなカリキュラムになりがちだから。
(専門学校が扱う職業のラインナップを見ればそれは明らかだと思う
乱暴に一言で表現するなら、この世のすべてはビット、つまり0と1で表現できてしまう。
例えば小数点以下無限に数字が続くような数字は、言い換えれば無限に情報が必要ということになる。
メモリは有限だし、たった1つのそんな感じの数字を記憶するためにどんな巨大なメモリも埋まってしまうのでは意味がない。
だから、コンピュータで浮動小数点を表現する場合、どこかで足を切らなければならない。
それによって、紙で計算すれば問題ないことが、コンピュータではおかしな結果になることがある。
しかし、これを知っていなければ科学計算はもちろん、銀行のようなお金の計算もおかしな結果になってしまう。
大学で数値計算の授業を取得するのは退屈だが、これを理解してなければ社会に出ても間違ったコードを書いてしまう。
というか、私も大学在籍中に間違ったコードを書いたことが何回かあるw
その原因は根源的で哲学みたいな話で、
世の中のほとんどの物事には正解がないとか、そういう話にしかならない。
良いテキストはあるわけだけど、それを読むべきタイミングもあるし、万人向けが自分に向いてるとも限らない。
本なら何冊かはドブに捨てるつもりで買うしかない
みんなが良いから読めという本も、なんとなく自分にはこれがいいんじゃないか、も買うしかない
買って家でじっくり読んで、途中でナニコレ?みたいな本だったら後悔するかもしれないけど、世の中そういうもんだから。
自分はレシピ通りに作らないでヒントにしかしないタイプなのだけど、
焼く、炒める、煮る、蒸す、みたいな方法だけ理解していれば味付けなんて適当でいいのだ。
なんらかの魚があったとして、それは食べられる魚だと分かっているが調理方法はまったく知らなかったとする。
どうするか?
とりあえず、まず口に入れられるサイズに切るべきだろう。
口に入れられないと食事にならんのだから、魚を切って骨を取る。
さばき方もググれない状況なのだから、もう適当に切断していくしかない。
鱗も大味で取るしかない。
ググらないと、とんでもないほど非効率的なさばき方をしている可能性があるが、とにかく食えればいいのだ。
腐らせては意味がない。
日本の刺身みたいな生で食べる文化はイヌイットではないが、漁師が船の上で食べることとも関係しているように思う。
何が言いたいかというと、生食は現代文明のロジスティクスは保存技術の成せるわざであって、料理の基本は何でも熱を通すべきなのだ。