モデルの共用ダメ説の提唱

はじめに

最近サーバとクライアントを同じ言語にしてみたよ、っていう話を良く聞きます。その理由として「モデルの共用ができる」というメリットが挙がります。これに関して、いやそれ違うだろ、って前から思っていて、もやもやしているので書きます。

本当はQiitaで書きたかったのですが、どう考えてもポエムなのでHatenaBlogにしておきます。

軽い背景解説

「はじめに」が大筋理解できていれば読む必要が無いと思いますが、そうでない人もいると思うので解説します。

所謂Webの世界ではサーバ側とクライアント側で厳密に分けられることが多くなっており、ソシャゲだったら運営側のAPIサーバとスマホアプリ(クライアント)という感じで分けられています。ゲームに必要なデータはAPIサーバから取ってきて、スマホアプリは動きとか絵を管理している感じですね。普通のWebサイトでも単純なAPIサーバからデータを取得してJavaSciprtがレンダリングする仕組みのサイトが増えています。この方がUIの自由度が増すんですね。

で、そのAPIサーバとクライアントの間で必要な通信のデータ構造をモデルとここでは呼んでいます。例えばサーバにPersonという情報があって、Person内にname(文字列)とage(数値)があるとします。Scalaで書けばこんなんですね

case class Person(name: String, age: Int)

クライアントがPersonのデータを欲したら、この形式でJSONのObjectなりMessagePackなりでパックされて送られてくるわけです。

当然この形式になっていることをAPIサーバ側もクライアント側も知っていないといけない訳です。ところが今まではサーバ側とクライアント側で言語の断絶があって、サーバ側はRuby/PHP/Perl/Java、クライアント側はJavaScriptが多かったので、結果的に両方でモデル定義を持つ必要がありました。今までは。

ところが、NodeJSでクライアントの覇者JavaScriptがサーバサイドで書けるようになったり、サーバサイドでも使い勝手良さそうなC#が、Unityとしてクライアントで大々的に使われるようになったところで、モデル定義を1つ書けばいいんじゃないか、という話が出てきたわけです。(Fate/Grand OrderがUnityだからサーバもC#にしているという話がありました)

で、ここでぼくが書きたいのは「モデル定義を本当に共用して大丈夫?」という話です。ようやく追い付きましたね。

本題

モデル定義を共用するのに疑問を持っている理由は「そのモデルが更新されたときの、クライアントとAPIサーバの互換性どうするの」という点に尽きます。

さてサービスが運用に乗ります。機能を追加します。最初に作ったPersonモデルにデータが追加しよう! 良くありますよね?ここでは例でnameとageがあったPersonに、海外展開に備えて言語情報を設定しましょう。めっちゃありそう。langっていう名前の文字列でいいかな。

langを追加するためにはモデルに修正が必要です。共用のモデルなら1箇所にlangを追加すればいいだけですね。さてリリースしましょうか?

このとき、もしクライアントとサーバが同時に変更してリリースが可能であればうまくいきます。それは大変幸運で、そして現代においては稀有なパターンだと思います。1つのAPIサーバに1つのJSクライアントしかなければ、まぁうまくいくかもね?

つまり、APIサーバは運営が自由にアップデート可能なことが多いですが、クライアントはそうではなく、古いモデルでやりとりをすることが多々あります。クライアントがスマホアプリだったら更新サボってる人も多そうですし、APIサーバを公開していて多数のクライアントが付いてる場合だと更に困難ですね。全員に更新が行き渡るのに何年掛かるの?TwitterBasic認証やめるのに何年掛かったっけ?

結論として、APIサーバは最大公約数的なモデル定義をする必要があり、クライアントにその必要はなく、それによる弊害の方が大きいと考えています。APIサーバがクライアントからPersonの投稿を受け付けるときはlangがある場合と無い場合がありえるので、両方のパターンを記述する必要があります。クライアントはサーバが自分の持っているPerson型を受け付けられない可能性を考慮する必要はありません。モデル定義さえ別ならば。langという余計なデータが来ても捨てればいいのです。

モデル定義を共用化するためにクライアントのコードを不必要に複雑にする必要はありません。モデル定義のコストとか多寡が知れてるし、2つぐらい作ったらどうですか、という話です。どうせサービス運用がうまくいって3年とか経てば全くの別物になっているのですから。

MyFleetGirlsの経験について

実際あったかのように語りましたが、実際にあったんです、MyFleetGirlsで、という話です。

MyFleetGirlsという自作の艦これツールがありまして、ScalaサーバとWebクライアントとScalaクライアントに分かれています。艦これの通信をMyFleetGirlsのサーバに横流しするのがScalaクライアントの仕事で、サーバと同じ言語なので、この通信に使われるモデルは共用化されています。安易に共用化しました。

結果として、後から追加されたモデルデータは全てOptional、存在するか分からない型として処理されるか、古いクライアントからのアクセスを拒否する仕様になりました。サーバが古いクライアントと通信する可能性があるからです。Optionalになった場合、クライアントは常に値があることが保証されているにも関わらずOptionalを強要されるため、コードからのスメルは強烈なものになりました。古いクライアントからのアクセスを拒否する仕様のために、強制的にクライアントをアップデートする仕組みを1から作るハメになりました。

蔵王キツネ村探訪2017/9/16

大分前になってしまったがきつね村に行ってきたのでひたすらもふい写真を貼る。

f:id:ponkotuy:20170916101635j:plain

入口。檻が無い…というより檻の中に入れる動物園なので、色々免責事項が多い。

f:id:ponkotuy:20170916102212j:plain

入口の安全地帯(突然キツネに攻撃されない的な意味で)にはうさぎとかヤギとか馬がいる。

f:id:ponkotuy:20170916102354j:plain

f:id:ponkotuy:20170916102407j:plain

f:id:ponkotuy:20170916102550j:plain

f:id:ponkotuy:20170916102422j:plain

f:id:ponkotuy:20170916102510j:plain

f:id:ponkotuy:20170916102633j:plain

f:id:ponkotuy:20170916102716j:plain

f:id:ponkotuy:20170916102834j:plain

こっから先はキツネが生息するだだっぴろい空間。

f:id:ponkotuy:20170916103236j:plain

f:id:ponkotuy:20170916103200j:plain

f:id:ponkotuy:20170916103250j:plain

f:id:ponkotuy:20170916103345j:plain

f:id:ponkotuy:20170916103132j:plain

f:id:ponkotuy:20170916103436j:plain

f:id:ponkotuy:20170916103530j:plain

f:id:ponkotuy:20170916104157j:plain

f:id:ponkotuy:20170916103754j:plain

f:id:ponkotuy:20170916103639j:plain

f:id:ponkotuy:20170916104220j:plain

f:id:ponkotuy:20170916104306j:plain

f:id:ponkotuy:20170916104452j:plain

f:id:ponkotuy:20170916104536j:plain

f:id:ponkotuy:20170916105005j:plain

f:id:ponkotuy:20170916104411j:plain

f:id:ponkotuy:20170916105119j:plain

f:id:ponkotuy:20170916111311j:plain

放し飼いにされていた子山羊

f:id:ponkotuy:20170916111845j:plain

f:id:ponkotuy:20170916111715j:plain

f:id:ponkotuy:20170916112301j:plain

f:id:ponkotuy:20170916112507j:plain

f:id:ponkotuy:20170916111929j:plain

おしまい。入場料1000円でそこそこリーズナブルだけど場所が本当にひどいところにあるので新幹線代金とレンタカーorタクシー代を片手に来訪されることをお勧めする。

なお私は現地でタクシーを駆使して色々行くつもりだったのだが、残念ながらお金を引き出さずに蔵王高原に入ってしまい、泣く泣く歩いてキツネ村から駅まで戻りました。

そこらへんの顛末はTwitterでどうぞ

twilog.org

FactorioRecipeリリース

FactorioRecipeというFactorioの組立機の比率や材料の数が分かるツールを作りました。

FactorioRecipe

まぁ良くあるFactorioのアイテム作成チェーンを見るツールの1つなわけですが、最大のウリはゲーム内のluaファイルを直接読む機能が付いているので、特に面倒なことしなくても最新版に追従できるという点です。ので、現在α版のv0.15に対応していて、今後も速攻対応できる感じです。自動化サイコー。

Factorioは不時着した未知の惑星で工場を作るゲームで、プログラミングみたいにどんどん自動化を進めつつ、高機能かつ複雑なアイテムを大量に作っていくのが面白いです。

まぁこれ見るのが早いと思います

www.youtube.com

サーバサイドのアプリケーションはScala + Playframework、DBはPostgreSQL。View側はCoffeeScript + VueJS。インフラは自宅サーバのArchLinuxの上のDockerで動いてます。

今までやったことが無いのはLuaの読み込みですが、最近使ってる言語はリッチなものばかりなので面倒くさかったですね。あとJavaからLuaを実行できるluajのLua内オブジェクトをJavaのオブジェクトに割り当てる機能も貧弱で厳しい。

あと今回は初めてPostgreSQLを使いましが、やはり色々設定まわりとか違うので最初は手間は掛かりますね。ただ`create table`でもtransactionが効くので、開発中のmigrationテストで失敗してもロールバックされて、DB修復しなくていいのは楽ですね。(MySQLにはこの機能が無い)個人的にPostgreSQLを使うモチベで最大のものはMaterialViewですがまだ試してないです。そういえばcreate table内でunique indexとか張れない気がしたけど何か間違ってたかな。謎

CrucialのSSD(MX300) 525GB買った

仕事マシンは自作PCになることが多い。(これは大体ぼくの我侭が原因であって会社のPC支給に問題があるわけではないのだが)そのPCのSSDが壊れたらしいのでアキバに買いに行ったときの話。

購入したいSSDはどちらかというと安定性重視のSATA接続のやつ。とはいえ鯖用の高いのを買う気はないので、コンシューマ向けで評判良さそうなの買えばいいかな、ぐらい。多分必要な容量は100GBだと思ってて、ただ最近はSSD安いので200GBぐらいでいいかなぁみたいなノリでアキバへ。

んでSSDのメーカーどこがいいのかTwitterに聞いてみたら、やっぱりIntelの評判が良くて、次点でPlextorSamsungあたりだろうか。実際手元にあるSSDもそこら辺が多い。壊れたSSDIntelなのが気掛りだけど、まぁIntelかなぁと思いつつ物色。

ところが、実際の店舗に行ってみるとIntelSSDはほぼ全部品切れになっており、Plextorも在庫無さそうという感じ。Samsungはちょいちょい在庫ある、とかそんなんで、大体どの店もADATA、Trancend、CFD、WesternDigital辺りを売れ筋にしたい(せざるを得ない?)感じだった。Twitterで聞いてた感じと随分違うので戸惑ってかなりウロウロしてた。

ただ色々考えてみると、安物が売れ筋になる商品って、大体どのメーカでもスペック十分で安定してる状態なのでは、と思ったのが1つある。

SSD黎明期、HDDよりランダムアクセスがアホみたいに早くなるので、かなり高いけど下手にCPU買うよりよっぽどいいぞ、とかSDカードをn枚でRAID0した方が安い!とかアホみたいな事をやってた時期は、実はマトモに動くSSDが殆ど無くて、プチフリが多発していた。ので、「SSDのあのメーカー・コントローラはプチフリしずらいぞ」っていう情報はすごい飛び交っていた。

そんな頃にSSDを5〜10台調達したぼくの脳味噌はその時の気持ちがあまりアップデートされておらず、Twitterでオススメされた商品が、店だとそれが少数派だったという状況に、時代の変化を感じたわけである。

冷静に考えてみると、SSDはここ4年以上ずっとSATA3.0の6Gbpsがネックになる時代が続いており、スペック上がりようがない上に、ハイスペックなやつはM.2やPCIeに移行しており、USBメモリみたいな、容量さえあればいい、みたいな市場になっていたのである。つまり安いのでこまらん。好きなメーカーを買えというわけだ。

あとIntelは付加価値の高い商品しか扱わないから実態としてほぼ撤退してるんだろうな、という感じ。実際スペックで高付加価値付けられるM.2やPCIeではまだ人気だ。

というあたりがCrucialを買った理由である。容量の割に安いのと、流石にTrancendのSSDはなーとか思ったとか、Twitterで勧められたのもある。(あとSATAの限界内でも速度というのは無いでない)

100GBで十分な人間が525GBにした理由も説明しておこう。ぼくの環境、稼働率の高いPCで大変SSDが壊れやすい。単に使い方がハードなのかなーと、今まであまり気にしてなかったのだが、容量に余裕が無いとSSDは壊れやすい、という指摘を食らうまでウッカリ忘れていた。

これも昔から言われていたんだけど、SSD高いのでぽんこつさんは低容量な奴買うことが多くてカツカツになってることが多かった。SSDを使い切るのが良くない、というのは昔も今もあんまり変わってないらしい。

つまりすぐに壊れて欲しくないのであれば、信頼性の高いメーカーにお金を払うのではなく、容量にお金を払うべきだ、というのが結論である。適当なメーカーでもいいので大容量品を買うべきなのだ。最近のPCはついウッカリ50GBとかぐらいなら消費してしまうので、500GBぐらいまでなら容量増やした方が良いことが多いとおもう。

余談だが光学ドライブも買った。最初8000円のが目に付いてそんなもんだよねーと思ってあまり気にしなかったのだが、下の方に2000円の光学ドライブがあって「ファッ!?」ってなった。これDVD非対応なドライブかと一瞬思ってしまったが勿論そんなことはなかった。8000円の方に目線戻したらBD対応で、BD対応ドライブのあまりの安さに眩暈がした。光学ドライブとか5-6年買ってないからね…。

ちなみにぼくはBDドライブの購入はお勧めしない。BD(それはGB単価でHDDより高い)にデータを焼くことはもう既に無く、使うとしたらブルーレイのアニメぐらいだろうがあれは馬鹿にみたいに高い再生ソフトを買わないと見ることはできない(そして往々にして不便である)。ましてそれがLinux対応なんて望むべくもない。素直にPS3で再生するなりTVに繋ぐ専用の再生機(それならなんと5000円で買える)を買おう。

VAIO ZでArchLinuxが動いた話

はじめに

VAIO ZでLinuxが動かなかった話 - ponkotuyのブログ

の続きになります。なんとか動きました。

何がわるかったのか

詳しくは分からないけど、EFIだと4.7.6以降のKernelでブートしなくなるのが問題のようです。

VAIO Z で Arch LinuxとWindows 10をデュアルブートする - Qiita

ArchLinuxをインストールした - ふれめも

きちんとコメント含めて読んでいくと書いてありますね。ちゃんと読め。

補足

基本的には2つのリンク先のようにやれば良いです。ただし彼等は既にインストール済の状態で問題に遭遇しているため、最初から問題ありKernelでやらないといけない場合補足が必要です。

まず先にも問題になっていたKernelの問題はarchisoにも適用されます。つまりインストールに必要なarchisoがブートしません。なのでインストーラブートローダが起動したらまずeを押して起動オプションを変更します。最後にnoefiを付けるだけです。この状態であれば起動します。

勿論この状態でefivarsなどを参照してもEFIモードではありませんが、普通にsystemd-bootをEFIで起動するように設定することはできます。私はWindowsEFIパーティションをそのまま流用してブートできました。勿論このときもnoefiを付けるのを忘れずに。

ちなみに`bootctl install`した際、エラーが出てこまりましたが、エラー放置して進めても全く問題はなかったです。ここは今でも良く分かってないです。

最後に

TwitterFacebookでアドバイスしてくださった方々ありがとうございました。

VAIO ZでLinuxが動かなかった話

補足:動きました

ponkotuy.hatenablog.jp

VAIO ZにArchLinux(+試しでUbuntu)をインストールしたいんだけど、うまくできなくて大変こまっているので、とりあえず纏めて、教えてもらおうと書いてる。

VAIO Z で Arch LinuxとWindows 10をデュアルブートする - Qiita

構成が大変良く似ているので(マシン構成の違いで問題になりそうなのはキーボードのみ)、この記事はかなり参考にしたが、全く書いてないところで引っ掛かっており大変困惑中。

UEFIモード

VAIO ZにはUEFIモードとBIOSモードの2つがあるが、とりあえずUEFIモードで。Secure Bootはdisableにし、USBブートとenableにした。ブート順序をUSBブート→ディスクブート→Windowsブートの順にしてある。

  • ArchLinux(2017/1/1)のisoをddしてUSBメモリにコピーしたやつ
  • UbuntuServer 16.10のisoをddしてUSBメモリにコピーしたやつ
  • ArchLinuxのisoをDVDに焼いたやつ
  • UbuntuServerのisoをDVDに焼いたやつ

の4つを用意した。

上2つのUSBメモリでは、中にあるbootloader的なものは起動してメニューは出てくるが、そこからinstallを選択しても何も出てこない、という問題が発生した。USBメモリアクセスランプも見てみたが、すぐにアクセスが止まってしまう上、10分ぐらい待っても特になにもなかったので、落ちてるんだと思う。

下2つのDVDでは、同様にbootloaderは起動し、installを選ぶとすぐにエラーがでて止まる。

上記URLでは高速スタートアップを切ると良いと書いてあるので試してみたが、症状は特に変わっていない。ただし全パターンやり直した訳ではないので漏れがあるかも。

PXEも試そうとしたが、USB接続の有線LANではUEFI起動時にアクセスランプが付かないのでドライバが無いんじゃないか、という話である。

先の起動メニューにおいてnoefiオプションを付けて起動した場合、問題なく動いた。

BIOSモード

BIOSモードでは問題なくインストールできる。ただしGRUBのインストールができない。(Ubuntu、Arch両方)調べたらNVMeだとGRUBは動かないそうで、UEFIを重点的に調べることにした。最悪USBメモリGRUBぶっ込んで解決というのも考えてはいる(最終手段)

という状況なので、追加で聞きたいこととか、こうすればいいんじゃね、とかあれば教えてください(土下座

近況報告

Twitterに書くには長すぎるのでHatenablogで。

転職決まりました。2/1付けで新しい会社に行きます。今日から有給消化で休みに入ってます。(私は休みデース!画像略

新しい会社は何故かScalaではなくRailsの会社なので、当面はRuby書いてると思います。最早型の恩恵は受けられないのだ…。というかこんなブログ書いてる暇あったらRuby書け。

新しい会社が家賃補助あるということなので、1月中に引っ越ししようと、1日で部屋を決めて部屋が確定する前に解約通知書を出すとかいう、エクストリーム引っ越しになってます。やばい。というかこんなブログ書いてる暇あったら書類書け。

※追記:1日で決まったかと思ったら先越されたやばい

たまには話しようとか新しい勤務先の話とか今の勤務先の話が聞きたい人は個別に御飯食べに行きましょう。自分の恥をさらすだけな気もするし、話のネタにもならん気がするけど。

あと転職祝いくれる人はこちらへどうぞ

http://amzn.asia/dFL0c0X

中古でも全く気にしないタイプです。