2020年07月の日記です

目次

13日 【書評】またたびさんの事件ログ
17日 phpSpreadsheet で小数点付き数値と見なせる文字列を入力するとおかしくなる
22日 夏休み
27日 リングフィットアドベンチャー


【書評】またたびさんの事件ログ  2020-07-13 17:15:18  その他

▲目次へ ⇒この記事のURL

あ、ふと気が付くと、今月も半ばだというのに日記書いてない。

何か書こうと思っても、最近家の外に…雨続きなので庭にすら…出ていないので、大した話題もない。


というところで、そういえば最近面白い本読んだので書評でも書こう。




情報系女子またたびさんの事件ログ。今のところ全二巻。


Amazon Kindle unlimited で無料で読めました。

だから読んだのだけど。


(無料とはいってもサブスクリプションの代金は払っているし、作者の方にいくばくかのお金は行くはず)



大学の情報科を舞台としたミステリー小説です。

もっとも、ミステリーといっても本格的な推理などがあるわけでもなく、「ミステリー風小説」といった方が良いかも。

2冊ともそれほど長くもないし、気軽に読める内容です。



そして、たぶん読む人をすごく選ぶんでしょうね…

理系大学の出身者なら、ある程度「懐かしい」感覚に浸れるかも。


僕の場合、情報科学科の出身で、研究室では人工知能なんかも扱ってました。

友人の研究室は画像解析なんかもやってました。


この小説の舞台は、情報理工学部の研究室で、人工知能などを扱っていて、画像解析などもやってます。

僕の大学当時と今では、技術レベルは雲泥の差なのだけど、一応その後の進歩も知ってはいるので楽しく読めました。




1冊目の舞台は、学祭の直前。


泊まり込みで準備しているサークルもあるし、サークルごとの「展示スペース」の奪い合いもあったり、学内が混沌としながらも楽しそうな雰囲気がうまく描かれています。


一方で、「探偵役」の、通称「またたびさん」は、研究室に引きこもっています。

凄く頭の良い天才なのだけど、人と接するのが苦手で、歩いて1分の学食まで出ていくのも嫌がる。


彼女は、自分の作ったロボットを唯一の「友達」だと公言し、そのロボットに学食から食事を運んでもらっている状況です。



そんな「部屋から出ない安楽椅子探偵」のまたたびさんの代わりに、あちこち走り回って実際の事件を解決するのは、主人公の さくら君。

先輩である またたびさんにこき使われています。



事件の発端は、学祭を中止させようとする「破壊工作」に、さくらくんのクラスメイトが巻き込まれたこと。

彼は無罪を主張しており、犯行現場を撮影したとされる写真は、どうやら偽造されたもの。



ここで、画像解析の出番ですね。

情報科学の知識が駆使され、話が前進します。


こうした「知る人ぞ知る」知識で話が進むので、ミステリではない。ミステリ風なだけ。

だって、読者が知らないことが推理の前提になっているのだから。



さくらんくん、またたびさんにこき使われるだけでなく、事件を追う中で知り合ったいろいろな人にこき使われます。

パシリ体質。頼まれたらいやと言えない性格。


困った時には またたびさんに頼り、事件の真相に迫っていきます。




2冊目も同じような構成。

こちらは、人工知能研究していた研究室で、ロボットアームが「あり得ない」動きをしたために怪我人が出ます。


ロボットアームには安全対策が何重にもなされていて、そんな動きをするはずがない。

でも、実際に監視カメラに事件の瞬間が写っている。


人工知能が人間に反乱を起こしたのだ、とか言い出す輩も出始めて、研究室は一時的に閉鎖されてしまいます。



しかし、この件に関して またたびさんは非協力的。

「自分はこの事件について何か言う資格がないから」と…。


1冊目では、少し理解できる部分もありながら基本的に「変人」だったまたたびさんの人物像が、徐々に明らかになってくる話です。

人付き合いは苦手かもしれないけど、すごく優しい一面が明らかになってくる。




またたびさんが変人すぎて、ちょっと現実的ではない。


でも、2冊目を読み終えた時点で、すごく魅力的なキャラクターに思えてきます。

この続きをもっと読みたい。



情報系女子…とタイトルにもあり、お話の中でも「リケジョ」と呼ばれるところが度々出てくるのですが、一方で作者さんがこの言葉を嫌っているのもわかる。


うん。僕もこの言葉嫌い。

事実として理系の女性は珍しいのだけど、この言葉はその珍しさにレッテルを張り、差別しているだけに思える。


このお話の中では、またたびさんは「女性」ではありますが、女性らしさを出すようなところは特にない。

学問に性別は関係ない。彼女は天才で、ただ淡々と知識を披露し、事実を解き明かしていく。


「リケジョ」なんて言葉が出てくるシーンでは、この言葉が空虚であるように描かれています。


そして、お話の中でも、またたびさんが女であることを意識させるような箇所はない。

主人公のさくら君は男で、またたびさんは女なのだけど、恋愛に発展しそうなところは一切ありません。


この関係性が非常にいい。理系大学の研究室として、普通にありそうだから。




現在この2冊だけのようです。5年間、続巻はありません。


ネットで情報探したけど、書評書いているような人も少ないみたい。



ラブコメにもならないし、理系大学の雰囲気わからないと楽しめないかもしれないし、もしかしたら情報科学に興味がないと面白くないかもしれない。


ターゲット狭すぎたんだろうな…僕にはすごく面白かったのだけど。



▲目次へ ⇒この記事のURL

同じテーマの日記(最近の一覧)

その他

別年同日の日記

07年 サーバー交換

12年 強力な武器

15年 【追悼】岩田聡さん(任天堂社長)

15年 収益を考える

17年 ルビク・エルネーの誕生日(1944)

22年 大学の時の話


申し訳ありませんが、現在意見投稿をできない状態にしています

phpSpreadsheet で小数点付き数値と見なせる文字列を入力するとおかしくなる  2020-07-17 18:28:24  コンピュータ

▲目次へ ⇒この記事のURL

また、えらく重箱の隅つつきな話です。

バグとして報告したいところだけど、やり方わからないからとりあえず書き留めとく。




現在行っている仕事で、「データをExcel出力」している個所がある。

まぁ、よく見るね、こういうの。


サービスの主要部分は node.js で作成している。

サーバー側で javascript を動かす仕組みだ。


でも、Excel 出力する部分は、PHP でやっている。

node に良いライブラリがなく、phpSpreadsheet というライブラリが良い、と担当者が判断したためだ。


(少なくとも、xlsx と xls の両方出力でき、細かく装飾されたシートを出力できる必要があった。

 ただこれだけの条件で、できるライブラリは非常に限られている)


担当者が、と書いた通り、僕はこの部分の担当ではなかった。

でも、バグが報告され、その時担当者が忙しかったために、僕が原因を調べることになった。




具体的には、「文字列」として入力された、小数点を伴う数字を複数 Excel のセルに含めようとしたところ、

正しい値が入らずにぐちゃぐちゃになった。


最初は何が起きているかわからず、いろいろなデータを入れて試したところ、次のようなことが分かった。


・小数点を伴う数値と見なせる文字列を複数のセルに記載した場合、同じ整数部を持つ、先に入れたセルの内容が、後のセルの内容にコピーされる。


何を言っているのかわからないだろうから、実例。


0.1 / 1.1 / 0.2 / 1.2


という4つの数値があったとしよう。これは以下のようになる。


0.1 / 1.1 / 0.1 / 1.1


「同じ整数部を持つ、先に入れた内容が、後のセルにコピーされる」というのは、こういうことだ。


整数部が同じであれば全部同じ内容になってしまう。


数値としてみなせない文字列であれば、このような問題はない。

また、小数点を含まなければ問題はない。


数字だけの文字列でも


0120


のようなものも問題はない。




phpSpreadsheet は非常に高機能なライブラリだが、遅くてメモリ食いだ。

というのも、このライブラリは、「エクセルの読み書き」だけでなく、本当にスプレッドシートの中身を実現しようとしているため。


で、遅さをカバーするためにも、データはまとめて入れることが推奨されている。


fromArray というメソッドでデータをまとめて入れられる。

applyFromArray というメソッドで、セルの装飾データなどをまとめて与えられる。




そして、fromArray は高機能で、入れようとしたデータを自動的に識別し、正しく扱ってくれる。


= で始まるデータは、数式だ。セルの式をセットしてくれる。

数値として扱えるものは数値として入れてくれるし、そうでなければ文字列にしてくれる。


…ここで、文字列を与えたとしても、数値として扱えるものは数値になってしまう。


数値は、Excel 上「右寄せ」で表示される。文字列なら「左寄せ」だ。

文字列として入れたのに、右寄せになると格好が悪い。


そのため、担当者が作ったプログラムでは、データを入れた後で、セルに入っている値のデータを明示していた。

数値として入ったものであっても、「文字列」と指示すれば、文字列になってくれるようで、左寄せになる。



これは、Excel でいう「セルの書式設定」とは違うものだ。


セルの書式設定にも「文字列」とか「数値」があるのだけど、それはセル内部のデータを「書式設定のデータに変換して」表示する、という設定。


データの型を指定する、というのは、表示時に変換するのではなく、セルの中の値の型を指定するものだ。

そう、エクセルの値には型がある。恥ずかしながら、僕は今回の調査までそれを知らなかった。



phpSpreadsheet では、セルに入れたデータは、php としてのデータ型がある。

そして、それとは別に、セルの中の値の型を保持するようになっていた。


fromArray で入れた場合は、自動判別され、数値型であれば、php のデータとしても数値に変換され、セルの値の型も数値になった。

しかし、この後で「文字列型」と指定すると、php データは数値のまま、セルの値の型は文字列になった。




そして、出力の段階に至る。


これも知らなかったのだが、xlsx ファイルでは、セルの情報と、「文字列」情報は別に保持されている。

セルに文字列を入れる場合は、文字列へのポインタ(参照番号)が入る形、だそうだ。


これにより、同じ文字列が大量に入るような Excel ファイルは…非常に一般的だと思うが、データが圧縮されることになる。


ライブラリはセルの値の型が文字列型だった場合に、配列として対応表を作っている。

「文字列」に対して、「参照番号」を調べられる対応表で、出力時にこれを使って、同じ文字列には同じ参照番号を出力するのだ。


この時、「文字列」に対して、というのは、セルの値の型のことだ。

でも、実際の php のデータは、文字列とは限らない。


そこで、ライブラリのプログラムでは、「実際の php データが文字列か否か」で処理を分けている。

文字列の場合、ハッシュ関数を通して一意な数値を得て、それを引数として配列にアクセスする。

文字列ではない場合は数値なので、そのまま配列にアクセスする。



…ここにバグがある。

文字列ではない場合、数値ではあるが、整数とは限らない。

小数点を含む場合、php によって小数部分が切り捨てられ、整数化されたアクセスになってしまう。


結果として、小数点以下を含む値を文字列として扱おうとすると、同じ整数部を持つ値のコピーになってしまう。




回避方法。

fromArray でまとめて値をセットするのをやめればよい。


fromArray の中身は、setValue という関数を使い、ループで書き込んでいる。

この setValue は、入れられるデータを検査し、文字列であっても数値と見なせる場合は数値に変換する、などの高度な処理を行う。


これに対し、setValueExplicit を使うと、データを入れる際にそのセルの値の型を一緒に指定できる。

勝手な変換も行われない。


今回は、fromArray でデータを入れやすいように、データだけを配列としてあらかじめまとめてあった。

セルの値の型の指定は、後で行えるように別にまとめてあった。


なので、先にセルの値の型を指定してしまう。

セルに値が入っていなくても、型だけ指定できる。


その後で、自分で2重ループを作ってデータを入れる。


まず、セルの値の型を確認する。(getDataType でとれる)

型を指定していない場合は、文字列の "null" が返るので、この場合は setValue でデータを入れる。

null 以外が返っている場合は、データ型の指定があるので、setValueExplicit で型を指定してデータを入れる。


これで、勝手な型の変換はなくなり、想定していた型で入ることになる。

文字列型が指定されているのに内部が数値、などということもなくなり、おかしな挙動に悩まされなくなる。




phpSpreadsheet 、すごく動作が遅いし、ここに書いたような複雑怪奇な動作によるバグもある。

もっといいライブラリがあれば乗り換えるのだろうけど、


・xlsx 、xls の両方を出力できる。

・細かな装飾も行える

・計算式も含む、複雑な表を作れる。


などを満足するライブラリがなかなかないんだよね…


(PHP に限る必要はない。

 go の excelize はかなり良い線行ってそうなので少し試してみたのだけど、「既定のフォント」指定はできるのに、「既定のフォントサイズ」が指定できない、というかなり基本的な部分でダメだったよ…)




▲目次へ ⇒この記事のURL

同じテーマの日記(最近の一覧)

コンピュータ

別年同日の日記

02年 冷蔵庫に乾杯

14年 続・世界初のMML

15年 NECの創業日(1899)

15年 エジホン探偵事務所

21年 FFMPEG


申し訳ありませんが、現在意見投稿をできない状態にしています

夏休み  2020-07-22 17:48:43  家族

▲目次へ ⇒この記事のURL

さて、今日で学校の1学期は終わりで、明日から夏休みだ。

…というはずだった。



例年、関東近郊の1学期終業式は7月25日で、翌日から夏休みが始まる。

今年は25日は土曜日だから、24日が終業式…と普通はなるのだが、オリンピックのための特別措置がある。


10月第2月曜日の「スポーツの日」が24日に移動している。

7月第3月曜日の「海の日」が、23日に移動している。


というのも、オリンピック開会式が25日の予定だったためだ。

準備を十分行えるように、直前に休みを寄せたのだ。


まぁ、そんなわけで、本来なら今日22日が終業式のはずなのだった。




でも、結局コロナウィルスの世界的蔓延により、オリンピックは現状1年延期予定。

実際に1年後にできるかどうかは誰にもわからない。


コロナ騒ぎで1学期の授業が大幅に足りていないので、連休明けからも学校は続行。


通常6週間ほどの夏休みは、3週間に短縮。

8月中に夏休みは終わってまた学校が始まるのだが…


「2学期」は9月1日からなんだよね。


夏休みが開けて学校が再開すると、まだ1学期。

そして、長男の学校では、夏休み明けに期末テストを行うらしい。

内容忘れちゃうよ!




昨年は、長男の高校受験で夏休みの家族旅行に出かけていない。

今年はどこかに、と考えていたが、今のところ出掛けない予定で考えている。


大きな旅行に行かないだけで、家の近所で遊んだりはするのではないかな。

庭でバーベキューとかでもいいし。



▲目次へ ⇒この記事のURL

同じテーマの日記(最近の一覧)

家族

別年同日の日記

11年 3連休

16年 ハイジと、2つの教育方針

16年 携帯関連アイテム2点

21年 夏休み

24年 第2回ご出生お祝い会


申し訳ありませんが、現在意見投稿をできない状態にしています

リングフィットアドベンチャー  2020-07-27 15:32:16  コンピュータ 家族

▲目次へ ⇒この記事のURL

やっと入手できたので遊び始めた。

いま、1週間ほどやったところ。


先週末の4連休はどこにも出かけられなかったが、このゲームで家族中楽しめていた。





任天堂 Switch 向けのリングフィットアドベンチャーは、昨年の秋発売。


発売前は「色物なので様子見」と思っていた人が多いようだし、僕もそうだった。

しかし、発売直後から「面白い」と話題になり、入手困難に。


時々入荷の話題を聞いてはネットのショッピングサイトを探し、すでに売り切れている、という事実を確認する。


2度ほど、なんとなく覗いた Amazon で在庫を確認し、慌てて購入手続きをとるも「在庫なし」となっていた。

手続している数秒の差で売り切れてしまうのだ。それほどの人気商品。



で、年明けごろから中国でコロナウィルスの感染拡大があり、生産自体が止まってしまった。

4月ごろから再びわずかではあるが入荷するようになったが、多くは抽選販売。


抽選に応募し続け、やっと当たった次第。




ゲームについてはいろいろなところで話題になっているので、多くを書く必要はないだろう。


実際に筋トレなどにも使用される、弾力性の高いリングがコントローラーになっており、これを使ってゲームが進む。


Switch の Joy-con は左右1対あるが、左は太ももに括り付け、足の角度を測る。

「走る」とか「スクワット」とかは、足の角度を計測して行うわけだ。


右はリングに接続し、リングのたわみ具合を測るようになっている。

ここ、不思議なのだが、コントローラーに外部との接続端子があるのだろうか?



Wii リモコンでは、「ヌンチャク」をはじめとする外部機器を接続できるようになっていた。

だから、Joy-con でも外部機器が接続できても不思議はない。


そもそも、Bluetooth 機器としてのペアリングも「本体に装着」すれば完了するようになっているので、外部との連絡端子は何かしら持っているはずだ。




で、右 Joy-con は、たわみ具合を計測して送信するだけでなく、傾きなどのセンシングも当然行う。

だから、リングをどのような向きで持っているか、など計測できる。


これで、非常に多彩な動作をセンシングできるようになっている。



一番面白いと思ったのは(そして、あまりゲームレビューなどで見かけないのが)、Joy-con 右で脈拍を計測できること。



Joy-con 右には、もともと赤外線カメラがついている。

これを指に密着させることで、脈拍を測るのだ。


内部でどのように取れているのかはわからない。

おそらく、カメラに近すぎてピントはあっていないのだろう。


でも、赤外線なので、おそらくは血管が写る。

脈動に合わせて面積が広がったり縮んだりするので、それを「うまく」計測すれば、脈拍がわかる。



任天堂って、脈拍測るの好きだよね…


(N64 では「バイオセンサー」の名前で発売されたが、対応ソフトはテトリス64のみ。

 Wii では「バイタリティセンサー」として発表されたが、発売されなかった)



今回は、特別な外部機器なしに標準機能を工夫して測った、というところで感心した。




ゲーム自体は、一本道の RPG だと思ってもらっていい。


お話があって、道を進んでいくと(実際に足を動かし、走る必要がある)、敵と遭遇したりして戦いになる。


戦う方法は筋肉のトレーニング。


画面に指示されるとおりに行う。

左ももの角度と、リングコントローラーの組み合わせだけで、いろいろな筋トレをセンシングし、まじめにやっていれば相手に大きなダメージを与えられる。


(決して力が問題ではなく、まじめにやっていればいい)



この攻撃方法も、ちゃんと RPG らしく、旅の途中で「強い攻撃」を手に入れられる。

1体だけに強い攻撃、とか、弱めだけど3体同時攻撃、とか。

敵との「相性」で攻撃力が上がったりもある。


そういうことを考慮し、自分で選んで、指示通りに筋トレすれば攻撃できるわけだ。

適度に考えて、適度に体を動かして、狙い通りに敵を倒せれば楽しいし、あと少し攻撃力が足りなくて倒せないと悔しい。



で、自分の攻撃が終わると、敵の攻撃のターンだ。


これは基本的に、腹筋でガードする。攻撃のように選んだりはできない。

リングを両手で腹に押し当て、大きくたわませれば強いガードになるのだけど、しっかり腹筋を固くしていないとたわまないのだ。




トレーニングの負荷量は自分で選べるし、毎日「前回の運動はきつかったか」など聞かれ、調整される。

最初は軽い感じから…と始めたが、それでも3日目には軽い筋肉痛になった。


というのも、普段使っていないような筋肉も使うから。

で、3日目の筋肉痛を超えたら、同じ負荷では物足りなくなったので、少し負荷を上げた。


以降、筋肉痛にはなっていない。

それなりの運動量だとは思うし、毎日30分程度ゲームをやると「もう今日はここまでにしとこう」と思うくらい疲れる。

(ちょうど、それくらいでゲームから「今日はここまでにしませんか?」と聞かれる)



疲れるのだけど、辛くはない。

筋トレって、普通は「自分の筋肉を鍛える」ことを目標にやるのだと思うけど、すぐに目に見えるほどの効果が出るわけではないので、挫折しやすい。


そこを、「先のストーリーが気になる」という別の目的に変えて、楽しみながらトレーニングできるようにしてある。




移動中、リングを「押し込む」と空気を吐き出して空気砲で周囲のものを攻撃できる。

逆に「引っ張る」と、空気を吸い込んで、周辺のアイテムを取得できる。


道端に箱があれば、空気砲で壊してアイテムを入手できる。

でも、アイテムが直接落ちていれば、吸い込まないといけない。


さらに、下に向けて空気砲を出すと、ジャンプできる。

押し続けていればホバリングも可能だ。


そして、一番大切なこと。

速く走るとトレーニング効果が高い。

これは、ゲーム中では早く「レベルアップ」して、強くなることを意味する。



結果、早く走って目まぐるしく変わる景色の中で、周囲のアイテムを見極めて、リングを押したり引いたり、結構忙しいゲームなのだ。


敵との遭遇時などは、筋トレの体制が整うまでいくらでも待ってくれる。

でも、移動中は、単純だけど忙しいアクションゲーム。


ここら辺のバランスもうまくできていて、適度に楽しみつつ、適度に悔しがりつつ遊ぶことができる。




元々僕は運動嫌いなのだけど、独立して自宅で仕事を始めたころから、「体が資本」だと考えるようになりました。

健康に気を使って、時々走ったりしています。


と言っても、やっぱりめげるんだよね…もともと好きではないから。

夏の暑さに負け、冬の寒さに負け、走るのは春秋のわずかな期間だけ。


「こんなんじゃいかんよなぁ」と思って、家事をしながら中腰で足腰を鍛えたり、本を読みながら上半身を傾けて腹筋を鍛えていたりすることもあるのだけど、それだって毎日ではない。



運動嫌いとはいえ、やってないわけではないので、「急にやると辛いだけ」というのは知っています。

だから、負荷は軽めにして、毎日楽しむことを優先している。


リングフィットも、入手したけど筋肉痛で挫折した…というような話も聞きます。

筋トレに慣れていない人が「身体鍛えるぞ!」って頑張りすぎると、そうなりそうだと思う。



僕もまだ1週間で、最後まではやっていません。

途中で挫折しないように頑張りたいと思います。



▲目次へ ⇒この記事のURL

同じテーマの日記(最近の一覧)

コンピュータ

家族

別年同日の日記

02年 誕生日!

11年 節電その後

12年 続・理系と工学系

14年 NTSC PAL SECAM


申し訳ありませんが、現在意見投稿をできない状態にしています


戻る
トップページへ

-- share --

0000

-- follow --




- Reverse Link -