takaha.siの技術メモスマートフォン用の表示で見るtakaha.siの技術メモ勉強したことをお伝えします。誰かの役に立てればいいな...この広告は、90日以上更新していないブログに表示しています。踏んだのでメモScalaにはtraitという機能があります。traitは「それ単体で動作することはなく、他classを拡張(mixin)するか、他classから継承されることによって動作するエンティティ」と定義して良いと思います。JavaのInterfaceにたとえられることもありますけども、JavaのInterfaceが実装を持つことができないのにたいして、Scalaのtraitは実装を持つことができます。Scalaのtraitは便利で、mixinしてclassに機能をどんどん追加していくという事ができます。実質、多重継承のようなこと事ができてしまいます。この機能、利便性と引き換えに危険性が伴います。乱用すると複雑な継承関係を容易に生み出してしまい、コードの可読性が低下します。最悪NullPointerException(ヌルポ)でプログラムが死にます。ScalaはOptionさえ適切に使ってればヌルポは根絶できるのだと無邪気に考えていた私は甘かったです。BaseFunc1をmixinしています。実行すると、NullPointerExceptionが起こります。Main.main(bbbb.scala)まあちょっと考えれば、このコードがなぜヌルポが引き起こすのかはすぐわかると思います。rpc(14行目)がまだ決定されておらず、RPCBinderにnullが放り込まれてnewされちゃうんですね。BaseDefaultの方でインプリ(19行目)されており、BaseModel1でmixinされてしまっている(31行目)ので、コンパイルは通ってしまうわけです。そもそもこんな意味不明なコードを書くんじゃない!というのはもちろんそのとおりです。脳死プログラミングしているときでさえこんなコードには絶対ならない!と断言はできないと思いますし、なまじコンパイルが通ってしまうのでエラーは実行時に当該のパスを踏むまで見抜けません。ちなみに私はリファクタリングをしているときにこれに陥りました。いうわけで、scalaのtraitは注意して使わないといけないなと思いました。mixinがされているコードをレビューするときは、こういうエラーを引き起こす潜在因子がないかどうかちょっと考えてみるべきかもしれません。Baseを以下のように変更すれば問題なく実行されます。RPCBinder(rpc)}RPCbinderをnewするときにlazyをつければ、意図したとおり、ヌルポはでずに動きます。動くには動きますが、コードとして明示的に記述されない初期化の順番というものを、コードを読む人に意識させてしまうという点でこのコードが良くないということに変わりはないと思います。いうコードを書くべきではない。陥らないように注意すべきであるというそもそも論に変わりはないでしょう。p.s.lazyは、Scalaに対して初期化のコードの実行順番の変更を行うものでありますが、使い方によってはもっとヤバイ自体に陥ります。それはデッドロックです。以下に例が上げられています。gist.github.comヌルポはまだ可愛い方で、プログラムが落ちてくれるのでわかりやすいですよね。II+を購入してから、ずっとこれで満足してました。システム領域のFlashが不穏なエラーを吐き出しはじめたのでそろそろ買い替え時かと思い立ちました。容量もそろそろいっぱいになってきましたし。そこで、今回、なるべく安価に10GbEのLAN環境と10GbE対応NASを構築しましたので構成を紹介したいと思います。HCAがほしい!!!!!!!!!!...じゃぁなかった10GbEが欲しいなあとかZFSを使いたいからメモリは最低最悪でも16GBは欲しいなあとか考えてると、QNAPのNASの場合なかなかヘビーなお値段になります。そこでやむなく、パーツを柔軟に取捨選択でき、結果安価に済ませられそうな自作の道をえらびました。家庭環境のNASで10GbEなぞ必要なのか?と訝しがる人がいるかもしれません。Plusなどですと、シーケンシャルライトで2.4GB/secぐらいの速度はふつーにでます。RAIDを組めばもっと速度は出るでしょう。これはすでに1Gbpsを優に超える速度です。SSDでRAIDを組んだNASというのは、流石に個人ユースではまだちょっとハードルが高いかもですが、HDDのRAIDであったとしても1Gbps以上の書き込み速度は普通にでます。ZFSでHDD4台のRAIDZ2だと、メモリからのコピーで、350MB/secぐらいの速度はでます。この速度もすでに1Gbpsを上回っています。今、広く普及している1GbpsのLAN環境ではストレージへの書き込み速度を十分にカバーできているとは言えません。時代は10GbEです。テンジーの時代なのです。NASのパーツリストSlack上で@yoshikigと喧々諤々の議論の末。https://www.yodobashi.com/product/100000001001037761/まずケースを決定。@yoshikigが見つけてきてくれました。U-NAS社のNSC-810A。このケースにはホットスワップできるSATAのHDDスロットが8ポートついています。大きさも家庭に置けるレベルのサイズ感。つや消しのマットブラック塗装が醸し出す高級感。