月曜日までに考えておきます

ITネタとゲームネタ中心に興味のあること色々書きます。

"「学力」の経済学"は特に子育て世帯におすすめな良書だった

"「学力」の経済学"という本、本屋で見て帯に書いてある内容が面白そうだったので読みたいと思ってました。 図書館で予約したんですが100人待ちとかで、ちょうどKindleで20%ポイント還元をやっていたのもあるので買ってみました。

「学力」の経済学

「学力」の経済学

ご褒美で釣るのは良くないわけではないという話

  • テストでいい点を取ったらご褒美
  • 本を一冊読むたびにご褒美

という二つの条件で実験をしてみた結果、後者の方が効果が高かったとのことです。

「テストでいい点を取る」というのはアウトプットに該当し、これを達成するためにしなければならないことが具体的ではないです。一方、「本を読む」というのはやることが明確であるというのが良いそうです。

実際に知識量を増やすための読書であればテストで良い点を取るという結果に繋がりますし、行った努力(読書)に対して、結果(テストの点)に繋がれば子供が努力して結果を出すという楽しさを知りそうでこうかがばつぐんな感じしますね。

一方で、著者は最近の教育の、みんな平等やみんな揃ってゴールのようなものは批判しています。努力したが人がかならず報われるとか、残業している社員のほうが定時で帰る社員よりも頑張っていて優秀である、というのはまた違うんでしょうね。努力や頑張っている(または頑張っているアッピール)こと自体が目的になってしまうと、「良い結果を得るための努力」ではなく、「努力すること自体が目的」という手段の目的化になってしまうという話なのかなぁと思いました。

成果のトラッキング

ゆとり教育子ども手当てなど、社会の要請に応じて開始されたものの、まるで流行が廃れるかのように、いつの間にか終わってしまった教育政策は枚挙にいとまがありません。(中略)このように世代の子どもたち全員を対象にした政策は、子どもたちの成績、学歴、年収などに対して何らかの効果があったのかなかったのか、後にも先にもはっきりしないのです。

ゆとり教育とか子ども手当とか、センセーショナルなワイドショーとか匿名掲示板で叩かれたり、最終的にゆとり世代とかバラマキみたいなレッテルに使われるのよくありますね。こちら、実施側も批判側も良くなくてデータを用いて話していないというのがあるなぁと思いました。

こういうの、システム開発しててもよくあって適当な感じのマーケティング部門がウェーイな感じで要求出してきて、実際にその機能作った結果をトラッキングしなくてその機能が良かったのかどうかわからんとかよくあると思います。それでうまくいかない原因はすべて機能が足りないせいにしてくるヒャッハーマーケ部門はしねばいいのに!とかは昔よくありましたよ(ヽ'ω`)

政治ですらそういう状態になっているのは大変良くないですね。

少人数教育が良い、と言うのはバイアス化

一人の担任の先生が担当する生徒数が少ないほうが、児童にとって良いというのはまあなんとなく分かりますし、実際にデータとしても効果が高いということが現れているようです。

ただ、日本の場合少人数教育を実施している学校を"選んで"入学させる親の意識の高さと、それを可能にする親の収入という要因も加わってくるので純粋に少人数教育による学力の高さだけであるという判断はできないということが書いてありました。

海外で無作為に少人数教育をやった実験結果によると、費用対効果的にはそこまで高くないそうです。

教員の質の差の話

皆さん、本当に師と呼べるとても良い先生に巡り会えたこともあれば、ゲロ以下の匂いがプンプンするレベルの邪悪な教師にあったこともあるんじゃないかと思います。

教員の質を上げるためには高い専門性を持った人を採用するのが良いですが、教員免許というハードルが高いですね。こちらも海外のデータになりますが、「教員免許を持っている教師と教員免許を持っていない教師の差」よりも「教員免許を持っている教師内での格差」のほうが大きいそうです。

情報の信頼性

教育の効果のエビデンスの信頼性は以下の順になるのですが、

  • ランダム化比較試験
  • 非ランダム化比較試験
  • 分析疫学研究
  • 症例報告
  • 論説・専門家の意見や考え

日本だと最も信頼性の低い一番最後のもの、ましてや専門家ですらない人物のワイドショーでのコメントなどが影響あったりすることが問題視されていました。ランダム化っていうのはさっきの少人数教育の場合別の要因も絡んでくるので、そういうのが無いように完全にそれだけで判断できるようにしましょう、というような話ですね。

最近だとアニメ見てると犯罪が〜みたいなTVのコメンテータよくいますが、これなんてまったく信頼性ないですしむしろエビデンス的に言うと良影響のほうが強いのではないでしょうかね。(世界の中でも最もアニメが盛んと言える日本における性犯罪率の低さ)

まとめ

特に教育に関しては思い込みやテレビに出ていた誰かのよくわからない話が前提になって進んでしまうことがありがちなんですが、データを用いて説明してくれていてとても納得感あると思いました。

子育て中の人もそうじゃない人も読んで楽しめる本だと思います。 特に子供の教育に関わるお仕事をしている人には絶対に読んでもらいたい一冊ですね。

スマホ版ロマサガ2出ました

先日、ついにスマホロマサガ2こと「ロマンシング・サガ2」が出ましたね。

ロマンシング サガ2 | SQUARE ENIX

ロマサガ2

あえてこんな記事読みに来ている人はロマサガ2をリアルタイムでプレイしたおっさんゲーマーが多いように思うんですが、知らない人に説明しておくと、古典JRPGの中でもトップ10とか四天王とかトップ3争いをするレベルに面白いRPGです。ドラクエ(特に3)とかと同じようなレベルの名作ではないかと!

イケメンホストな主人公がモブ仲間数名引き連れて無双して途中で付いてきたメスビッチとイチャイチャしながら悪者倒してめでたしめでたし、というゲームではなく、ある帝国の皇帝が次世代に継承しながら長い時代をかけて世界を統一して平和にしていく壮大なストーリーです。ゲーム、特にスクエニのゲームでだいたい悪者になる帝国の皇帝が善玉で主人公というの珍しいですね。

ゲーム難易度はかなり高くてある程度理解して進めないと、詰む状況によくなります。

例えば、敵の強いダンジョン、とかがあるわけではなく戦闘回数に応じて敵が強くなるので逃げまくっていると自分は成長していないのに敵だけ強くなってしまいます。嫌なことから逃げてばかりいるといつの間にか友人とか同期と差がついて行くようなのは現実世界の中だけにしていただきたい!

覚えた技を次世代に継承できたり、強い武器を発明させておけば次世代で量産されて使えたりするわけなんですが、そういうのをやっていないと最終的に装備周りがろくなものがないってことになるんですね。この辺も現実世界的な厳しさある。

こんなピーキーなゲームなんですが、奥の深さとかパーティーの自由さ、陣形システム等で自分好みの戦略を立てて戦えるところから人気が根強いゲームなのだと思います。

あと音楽が全体的に神がかってて良いです。

リメイクの変更点

スマホドラクエは難易度が優しくなったりしているみたいですが、ロマサガ2は原作と比べて圧倒的に簡単になっているなぁ、という気が今のところしないので、まったくあるいは大幅には調整されていないのではないでしょうか?

他には追加要素とかあるみたいですね(わりと どうでもいい!)

ヌルくなる要素としては、強くてニューゲームがいつでもできます。なので詰んだとしてもそこからデータだけは引き継いで新規にやり直せるのはヌルくなった捉えるべきか、ようやく人間らしい心を取り戻したと捉えるべきなのかw

スマホの操作性

「思ったよりは悪く無い」って感じですね。Better than expected.ってやつや。

もちろん、オリジナルSFCコントローラのように操作できるわけではないので際どい敵の間をダッシュで走り抜けるとかは陣形崩されやすいと思います。そして死ぬ。

デフォルトでダッシュ有効になってるんですが、それだとパニクったら触っちゃって陣形崩されるのでボタン押してる時だけダッシュのほうがいいんじゃないでしょうか。 それ以外は及第点かと思います。

対応プラットフォーム

iPhone

https://itunes.apple.com/jp/app/romanshingu-saga2/id1083834924?l=ja&ls=1&mt=8

Android

https://play.google.com/store/apps/details?id=com.square_enix.android_googleplay.romancingsaga2_jp

PS VITA

https://store.playstation.com/#!/ja-jp/cid=JP0082-PCSG00870_00-ROMANCINGSAGA200

マルチプラットフォームで出てます。機種を持ってて操作性を極限まで気にするならPS VITA、それ以外なら手持ちのスマホに合わせて選べばいいんじゃないでしょうか?ぼくはVITAも持っているものの、スマホだとどこででもやれて、ゲーマー友達にプレイ中のロマサガ2を見せて一緒に語れるなんて最高の体験じゃないかと思ったのでiPhone版買いました。

名作古典ゲームなので、かつてプレイした人はもちろんのこと、未プレイの人にもぜひやってもらいたい作品です!

Fallout4クリアしたので感想など

「Fallout4」クリアしました

昨年末に購入したPS4版「Fallout4」最近クリアして2周目進行させているのでそろそろ感想等書きます。

Fallout 4

Fallout 4

どんなゲームか

核戦争後のアメリカを舞台にしたオープンワールドRPGです。 動画やスクリーンショットだけ見ているとFPSゲームの印象が強いですが、TPS視点にもできるし近接攻撃も可能でかつ強いです。時間の流れを遅くしてコマンド式RPGのように敵を攻撃するモードもあるのでアクション苦手な人でも遊べると思います。

グロさ

日本版だと表現がまろやかになるゲームとか多いですが、このゲームはすごいグロかったですね。規制まったく入ってないのか規制されててこれなのかは知りませんが。

ヘッドショットで人間撃つと頭が吹っ飛ぶとかざらで、頭から脳みそが原型とどめたままポーンって飛び出していく死に方とかあります。手足ダメージ受けると四肢切断ありますし。

また、虫枠としてごきぶり、蚊、ハエなどの人気昆虫たちが巨大化して出てくるのもポイント高い。

一番エグいなと思ったのが、スーパーミュータントというシュレックみたいな見た目の緑の怪物(元人間らしい)がいるのですが、こいつらは自分たちの殺した獲物をミンチにして袋に入れて飾る趣味があるんですね。ミートバッグという赤黒いオブジェクトと肉片がこいつらの巣にはたくさん配置されています。調べるとアイテムが手に入るのですが人骨出てきたり、たまに手とか出てるミートバッグがあってポイント高い。

良いなぁと思った点

ボリュームがすごい

いろいろ和ゲー洋ゲーやってますし、面倒なものとかじゃなければコンプリート目指すのですが、このゲームのボリュームは異常ですね。クリアだけを目指すならそれほどではないのですが、サブクエストに手を出し始めると半端じゃないボリューム量に驚きます。

オープンワールドだとマップは広大だけどイベントがあまりないというのがよくあると思います。それとは真逆で、最初に全体マップを見た時に「あれ、あまり広くないな?」って思ったんですが、イベントの起きる建物、エリアが大量に配置されていてすごく密度の濃いマップになっていることに気付きました。そしてそのマップごとにそれぞれクエストが発生するようになっていて、かなりの長時間プレイしているけどいつ終わるんだ?というぐらいのボリュームが有ります。

雰囲気

核による世界崩壊後の雰囲気がすごく良く書かれていると思います。 おそらく核爆発で死んだ白骨死体が落ちていたりヒャッハーな人たちに殺された人や、ヒャッハーな人も化物に殺されたりしてて世紀末感すごいです。さらに放射能に汚染されてゾンビになって生きている超設定があったり、ゾンビ顔になったけど理性はあって普通に人として暮らしている人も少なからずいたりしてカオスですね。最初は北斗の拳ばりに文明無いと思ってたら、ストーリーだけ追ってたら割と序盤で行く街がかなり栄えてたりして面白いです。 ストーリー中盤〜終盤辺りで行く、核爆発が起きたところは終末感すごくて強い化物もいっぱいいて、こちらも楽しいですね。

自由度

オープニングの核が落ちたあとにシェルター脱出するところまで終えたら完全に自由で、メインシナリオはあるものの圧倒的ボリュームのサブシナリオはどこからでも始められるようになっています。自分の好きなようにシナリオを進めるもよし、コミュニティを開拓するもよし、サブシナリオを進めるもよしとなっていますね。

びっくりしたのが、BOSというストーリーの中で4つの大きな勢力があってその中の1つを占める勢力があって、シナリオによってはラスボスになるその組織のリーダーを普通に物語の中盤なのに攻撃を仕掛けて殺したりできるんですよね。もちろんその後その組織の人間から袋叩きになるんですが、これうまく生き延びたらその後ストーリーどうなるんだろうというのすごい気になりました。主要人物全部やっつけちゃったらシナリオ普通に詰むんじゃないでしょうか。それぐらい自由なゲームです。

イマイチなポイント

バグ多すぎ

オープンワールドはバグ多いものですが、このゲームは特に多いですね。フラグ消失で手に入るアイテムが入らないとか、敵殺したのにアイテム拾えないとか(これはセーブ&ロードで直るのでまだ良心的)、フリーズとかよくあります。ゲームの安定性がマサカリヒャッハーしてる感じありますね。

正直クソゲー的な安定感なのにプレイしてしまうのは、悔しい、でもプレイしちゃう!!だし、それだけ面白いってことなんでしょうね。

ロード長すぎ

とにかくロードは長いですね。オープンワールドなのでマップ広いと死んでリトライが長いとかは良くある話ですが、それにしても長い。そして他のオープンワールドゲーと比べて死にまくるんですよね。とくに序盤、うっかり強いところ行くと某人間性を捧げるゲームかと思うぐらいに死にまくって、1死ごとに30秒ぐらい待たされる上に最後にセーブしたところに戻されて自分の人間性がすごい勢いで摩耗していくのがわかります。

オープンワールドゲーのシステムでよくあるファストトラベル(ルーラみたいなもんですね)やると、1分ぐらい読み込みが掛かってる気がします。長時間プレイしているの、システムの不親切さとかロードの長さもあるんじゃないか、という気がしますね。

あと、オープンワールド謳ってるんですが、ぼくの思ってた「オープンワールド」の定義って、ドラクエやFFのいわゆるRPGみたいに街に入ったらマップ切り替わります、洞窟も切り替わります、というんじゃなくてGTAやアサクリみたいに基本的に読み込み無しでどこへでも行けて、建造物の外見と内部の広さに矛盾がないものだと思っていたんですね。それでいうとフォールアウト4は建物内部に入る時に読み込みが走ってマップが完全に別物に切り替わる、というのが普通によくあるんですよね。

前者は、マップ切り替え頻繁で読み込みは都度入るけどその読み込みごとの長さは控えめ、後者は最初の読み込み超長いけど一回プレイ可能になったら読み込みなし、というふうにメリット/デメリットが分かれていると思うんですが、フォールアウト4はどっちの悪いところも取ってる感じですね。さすがに建物内部への読み込みは遅くはない(早くもないよ!)ですが、建物内部から外部は超絶長いです。うっかり建物に入ってしまうとつらいですね。

ぼくの考えていたオープンワールドの定義が間違っているのか、FO4がオープンワールドじゃないのかどっちなんでしょう。

ちなみに、ウィッチャー3みたいに広いエリア間の移動は読み込みありのマップ切り替えだけど、一つの広いエリアは読み込み無しでずっと動けるっていうのはGTA、アサクリと同じぼくの考えていたオープンワールドに入る方だと考えています。

最初の育成ミスると死ねる

ゲーム開始直後にストレングスやインテリジェンス, アジリティやラックなどのパラメータを一定のポイント割り振れるのですが、ここで割り振ったポイントに応じて、ストレングスが6以上ないと取得できないスキル、などをレベルアップの度に1つ選んで獲得していくのですね。 レベルアップの時にそれぞれのパラメータにポイントを割り当てることもできるのですが、その場合スキルが得られません。

それで、最初にどういうキャラにしたいか(近接脳筋、近接ステルス、中距離シューター、スナイパー)などを考えて振らないと、適当に降っていたら何もできないキャラになってずっとつらくなります。例えば近接をやるなら、近距離攻撃強化(ストレングス2以上)、ステルス強化、VATS距離延長(アジリティ7, 9)などがないと死ねます。さらにラック5でランダムで経験値を5倍にする能力が取得可能になり、さらにこの能力はインテリジェンスが低いほうが発動率が高くなるので序盤はインテリジェンス上げないほうがいい、など明らかに要求されるドメイン知識が多いですね。近接ならもっとストレングス必要ですし、カリスマが6ないとコミュニティの発展が大変みたいな事情もあってそっちも上げないといけなくなります。

行き当たりばったりに鍵開けできないから鍵開ける、死にまくるからHP上げる、とかやっていると中途半端になってつらくなります。最初から攻略サイト見てどういうタイプにしないといけないか考えたほうが良いバランスですね。このあたりは古いゲーム的な厳しさもあって、ある意味楽しいです。

アイテム拾うのめんどい

フィールドを歩いていたり建物を探索しているとたくさんのアイテムがあります。机/テーブルの上や棚などにたくさんアイテムがあるのですが、これをいちいちエイム合わせないと拾ってくれないのつらいですね。「ラストオブアス」みたいに、ある程度一定の範囲は連打で拾えるようにしたくれたらもっと楽に遊べるのになぁ、という気がします。

商人の所持金システム

敵倒してたくさん武器防具奪って、重量いっぱいで持てなくなりながらもいらないのを捨ててやっとの思いで拠点に持ち帰ったアイテムを売ろうとしたら、商人は一日あたり300〜400円ぐらいしか持っていなくて、それ以上売ってもお金が入らないというシステムです。なお、高い武器、防具は10,000円台がゴロゴロしています。この商人の所持金システムってウィッチャー3でもそうだったんですけど洋ゲーオープンワールド界隈で流行りなんでしょうか?正直、寝るとかで時間進めればまた商人の金復活するからゲームシステム的な難易度の制約にはなっていないし、不便さしかないんですけど。正直リアルマネー100円課金してやるから商人10,000円持てよという気持ちになる。毎日300円ずつ売って、何万円貯めましょうとか貯金箱貯金的な概念になっててつらい。

一応10,000円のものを買ったときに同時に10,000円の価値になるものを売れば相殺できますが、持てる量に限度もあるのでそんなに10,000円ちょうど持って行くとか難しい/めんどいです。あと売買インターフェースがイケてなくて、複数選択可能かと思ったらできるやつがあったりできないやつがあったり、売ったあとの挙動がカーソルが下に行くこともあったり上に行くこともあったりして何も考えずに連打していると今装備している重要なやつを売ってしまうという素敵システムです。

そもそも売買するときも、いきなり取引始まらなくて商人と会話して売買を始めるとかで10秒ぐらい掛かっている気がしますしつらいですね。ドラクエ的なまず会話のある売買システムは滅びて欲しくて、FFのいきなり取引が始まって複数売却もしやすいというああいうシステムに全ゲームさっさとなるべきだと思います。

現状

トロフィー75%ぐらい、1周目インスティチュートだったのであとレールロード、BOSでクリアするトロフィーと、その他の依頼50件、拠点の満足度100%あたりが残っています。まだやることあるのですがこのボリューム感、ラーメン二郎的な何かでさすがにつらくなってきたのでそろそろやめるかもしれませんw

まとめ

ゲームとしての面白さは凄いですね。日本人には作れないというか、むしろ昔の日本人が作って今のおっさんたちが過去に感動したドラクエ3ロマサガ2的な凄さがあります。一方で品質面もドラクエ3ロマサガ2的なつらいアレ感はあります。(さすがにセーブデータは消えないけど)

最近の親切なゲームを想定してやるとつらい面もありますが、店員の態度は悪いけど料理は超絶うまい店、という感じなのでそこが許せるならやったほうがいいと思います。って書いてて自分なら店員の態度は悪いけど料理がうまいという店には行かない気がしてきました!

けれどもそんな自分が楽しめているので、大体の人は楽しめるのではないでしょうか。

Google画像検索で画像保存するGem作ったけど・・・

キーワードを入れればGoogle画像検索で欲しい画像を引っ張ってきてくれるGemを作りました。

https://rubygems.org/gems/google_image_fetcher

クエリ入れれば画像をとってくれる

$ google_image search "艦これ 時雨”

これで

こうじゃ!

なぜ作ったか

テストとかしてて、会社PCのDLフォルダに有る数枚の画像を使い分けているだけだとバグとか見落としそうだし楽しくないので、 寿司の画像とか焼肉の画像とか検索してたんですがそもそもそんなの一気にガーッと取ってきたいじゃん、的なモチベーションで作りました。

が!!!

APIキーが要ります

APIキーが要ります

画像検索APIの実情

しかもGoogleの画像検索API、1日に100回までという制約があるんですよね。 この辺り、調べてみると画像検索系のAPIはかなりいろいろ厳しくなってるんですよね。

無料で使える画像検索APIとリクエスト数制限まとめ - Qiita

たしかに検索エンジンAPIは便利なので、無料(または定額)で無制限とかやったらビジネス活用でフルに使われて提供側が破綻しそうな気がします。 一定の限度を超えた使われ方をすると急激に運営側にとってコスト効果が悪くなるっていうこの辺りはオンラインストレージサービスなどと似ているのかもしれませんね。

有名なところでいうとNAVERまとめがGoogle画像検索できなくなったという出来事があるようです。あの規模で使われると厳しそうに思えますね。 それで考えると、課金力で検索できるBingはすごい良心的に思えます。

設定

APIキーの取り方

  • Google Developer Consoleに行く

https://console.developers.google.com

  • ここでAPIを有効にする

  • Custom Search API

  • 有効にして認証情報からAPIキーを取得

カスタム検索も作る必要がある

Googleカスタム検索へ

https://cse.google.co.jp/

新規に検索エンジンを作り、以下のように設定

  • 画像検索を「オン」にする
  • 「検索するサイト」は絞らない
  • 検索エンジンID」を取得する

と言った設定を行う必要があります。

APIキーと検索エンジンIDを環境変数

export GOOGLE_API_KEY={your_api_key}
export SEARCH_ENGINE_ID={your_seach_engine_id}

みたいに取得した値を入れてください。

これでようやく

$ google_image search "艦これ 時雨”

ができます(ヽ'ω`)

まとめ

Gemで解決している以上にやらないといけないことがイロイロあるね・・・

Slackの絵文字を変更すると世界(観)が変わる

Slack便利ですよね。

仕事でもプライベートでもSlackを使っている人も多いと思います。 今日はその中でも絵文字の設定について説明したいと思います。

絵文字の設定は変えられる

Slackの起動直後は絵文字がこんな感じになっていると思います。

これを設定画面から変更することが可能なんですね。

Slack画面の左上のチーム名をクリックして、 Preferences > Messages & Media でこのような設定画面を出すことができます。

Noneを除くと、4つの選択肢があるわけですね。

デフォルトサンプルの4つの中にunko入れてるSlackのセンスすごいなぁと思います。

さて、ここにあるサンプル以外のアイコンでの雰囲気を見てみましょう。謝罪にも感謝にも使える便利アイコンのみんな大好き:bow:だと

Apple/International

Google Hangouts

Twitter

Emoji One

となっています。で、この中で明らかに変な奴が一人いますよね。

こいつは一体何なんでしょうか。

Google Hangouts Styleの黄色い人

このイエローマン、他の絵文字でも特徴的でだいたいこんな感じです。

癒し系ゆるキャラ感がありますね。

Dancerとか、Appleがこれなのに対して

こんなですよ。ふなっしーかよ。

:ok_woman:のイエローマンedition

「OKに見えない」「頭抱えている」「/(^o^)\」とか言われている :ok_woman:さん

これもOKに見えます。そう、Google Hangouts Styleならね。

どこからどう見てもOKですね。むしろwoman要素どこ行った。

まとめ

みなさんもEmoji Styleを変えてみてSlack生活にちょっとした変化をもたらしてみてください。

モンハンクロスの進捗

11月下旬に発売して3ヶ月ぐらいやりこんでいたモンハンクロスですが、そろそろやめそうなので進めたところまで書きます。

プレイ時間とHR

300時間弱、と言ってもあと3時間は遊ぶだろうから300時間は超えると思います。前作4Gは150時間ぐらいでお腹いっぱいになったので、今作はだいぶ遊べたと思います。

使用武器

片手剣大好きなのですが、今作は片手剣忙しさの割に報われないとかエリアル/ブシドーやってみたいのに弱いとかあったので、途中から双剣に切り替えて遊んでました。強走薬飲んで高火力叩きだしていればパーティー貢献できるので楽しかったです。

勲章

97%まで進めました。

残りはネコ5匹LV50と金冠2種です。

ネコ5匹LV50は3匹までは済で、レベル10隻眼ガルルガを猫部屋で5分針で終わってほぼ1上がります。そして上げるための貫通/巨大/ブーメラン得意を持ったネコをLV40が1匹、LV30が1匹という状態なのでこれはやると思います。

金冠は、同じこと繰り返し&運が絡むというのが苦手なので、毎日少しずつやろうとして途中で飽きるパターンかなぁと思います。

次何やるの

最近出たのだといけにえと雪のセツナ、スト5あたり気になってるのですが、セツナは評判割と良さそうですがキャチコピーが気に入らない(スクエニがそれ言うな)、スト5は評判良くないのでとりあえずスルーかなぁと。買って序盤で止まっていた Fallout4 やってます。

来月はVITAのミクさん新作やると思います。

RailsとJavascriptのレンダリングわからん

Railsのサーバサイドだけで解決している編

Railsで例えばこういうデータがあったとして、

positive_phrasesテーブル

text
頑張る人は報われる
ここで諦めちゃダメだ
君ならやれる
さあ、もう一度トライしよう

view側でこの文言を装飾したいとすると、

- @positive_phrases.each do |positive_phrase|
  tr
    td
      = in_social_game_context(positive_phrase.text)
def in_social_game_context(text)
  "#{text} ※ソーシャルゲームのガチャの話です"
end

こういうヘルパーを作ったら、以下のような表示がされます。

ここまでは楽勝ですね。

Javascript

より良いUXのためにデータをページ遷移無しで追加/更新できるようにするとか、コンテンツ量が多い時のpagenationを「次へ」ボタンを押させるのではなく、スクロールに応じて動的に追加していく(いわゆる無限スクロールってやつですね)などの要求が出てくるケースはよくあると思います。

そういうことをやろうとすると、JavascriptAPIをコールしてJSONで値を取得して要素を追加するというやり方になりますよね。 例えばこういう感じに。

positive_phrases/index.html.slim

input#new-phrase type="text"
button#submit-by-jquery
  | Create Phrase by jQuery

positive_phrases.coffee

  $("#submit-by-jquery").on("click", ->
    $.ajax(
      type: "POST"
      url: "/positive_phrases.json"
      data:
        positive_phrase:
          text:$("#new-phrase").val()
      success: (data) ->
        $("<tr><td>#{data.text}</td></tr>").appendTo($("#tbody"))
        #$("<tr><td>#{in_social_game_context(data.text)}</td></tr>").appendTo($("#tbody"))
      error: (a, b, c) ->
        alert("error")
      dataType: "json"
    )
  )

これで取得してきたJSONをHTMLに追加しようとした時に、Javascriptからin_social_game_contextというRailsのhelperは呼べないんですよね。

$("<tr><td>#{data.text}</td></tr>").appendTo($("#tbody"))
#$("<tr><td>#{in_social_game_context(data.text)}</td></tr>").appendTo($("#tbody"))  => これが呼べない

RailsJavascriptでダブルメンテという問題

まあこれぐらいならJavascript側でも"※ソーシャルゲームのガチャの話です"って追加してやるだけで解決するわけですが、以下のような二つの問題が生じます。

1つ目の問題

その後の仕様変更で「※ソーシャルゲームのガチャの話です」を「※ただしイケメンに限る」に変えましょう、という話になりました。

そういうときにRails側だけ変更して、Javascript側は「※ソーシャルゲームのガチャの話です」になったままで、いっけなーいって気づくようなことってよくあると思います。2重メンテを担保し続けるのはハード。

  inSocialGameContext = (text) ->
    "#{text} ※ソーシャルゲームのガチャの話です"
    
  ...
        success: (data) ->
        $("<tr><td>#{inSocialGameContext(data.text)}</td></tr>").appendTo($("#tbody"))
  ...

JS側で同じようなメソッドを作って呼んでやるが、仕様変更の対応を忘れて片方だけ直した、みたいになっていると

(Rails側のView)

            = but_only_handsome(positive_phrase.text)

JSで取得した部分だけ違う表示になってしまう。

2つ目の問題

片方を修正忘れする問題の以前に、Viewに書くhelperやdecoratorはこの例よりももっと複雑なケースが多いと思います。

特にRailsだと便利なGemで表示フォーマットを1メソッド呼ぶだけで複雑な整形を容易に実現している、というケースがあって、Javascriptだとそれを自前で実装しないといけないというケースは多いんじゃないかなと。

RailsJavascriptの両方で同じ表示テンプレートを用意してやるのが手間ですね。

と言っても

ダブルメンテつらいけどやるしかないのか?と思っているのが現状。

他に考えられる案を挙げて見ると、

  • JavascriptによるリッチなUXなんてやめましょう

=> それが本質的な解決策ならいいですが、そうじゃないケースが多いはず

=> レンダリングのテンプレート組み立ては一箇所で済むのですが、Javascriptだと表示してから描画されることになるのでSEO評価されない可能性がありそう(※)です。これまた受け入れてもらえないケースが多そうですね。

(※)そこでReactのサーバーサイドレンダリングですよ、的な話はちょっと脱線するのであえて触れません

そうなると、Railsでのレンダリング、JSでのレンダリングの両方やらなきゃいけないのがつらいところなのかなと。

remote: trueとjs.erbを使うという手段もありますが、こちらは以下のような問題があるのかなあと思っています。

  • formでしか使えない(?)
    • 今回の例で言うとアイテムの追加には対応できるけど、無限スクロールでの要素追加なんかには対応できなさそう
  • レンダリングしたDOMをHTMLに挿入する、という仕組みはjQueryではないちゃんとしたJSフレームワークとは相性が悪そう
    • vue.jsにModel管理させて、あとはtemplateで描画してほしいねん・・・

この辺り、皆さんどうやってうまく解決しているのか気になるところですね。