ScalaでOpenCVを使うときの予約語トラップ

ハマったので記録。

問題

OpenCVにはScalarというクラスがある。このクラスはvalという名のフィールドを持つがゲッターはない。値を得るためには直接アクセスする必要がある。valの型はArray[Double]であり、その先頭の値を得るために以下のようなコードを書いた。

するとエラーが出た。

解決

これはvalがScalaの予約語だからである(もちろんJavaでは違う)。

When one needs to access Java identifiers that are reserved words in Scala, use backquote-enclosed strings. For instance, the statement Thread.yield() is illegal, since yield is a reserved word in Scala. However, here's a work-around: Thread.`yield`()

(筆者訳)
Scalaでは予約語となっているようなJavaの識別子にアクセスする必要があるときは、バッククォートで囲まれた文字列を使う。たとえばThread.yield()という文はScalaではyieldが予約語なので許されない。回避策はこうだ: Thread.`yield`()

ScalaはJavaのライブラリを流用できるのでこういう事故はよくあるのだろう。

トラップ

単に予約語を識別子として用いた場合シンタックスハイライトで色がつくので気づくはずだが、今回は先頭の値にアクセスするために(0)をつけており、シンタックスハイライトが効かず発覚が遅れた。

🙂

 

Cooler Master Elite361というPCケースについて

http://apac.coolermaster.com/jp/case/mini-tower-elite-series/elite-361/
これ

ATXマザー対応でありながらコンパクトであり横置きも可能。設置スペースに制約がある場合は唯一無二のケースとなりうる。私も部屋が狭いので重宝している。一方で小さくて薄いのでパーツの制約がきつい。

幅が狭いのでCPUクーラーの高さは122mmまでと制限されているが、同様の理由でグラボを挿すと場合によっては側面ファンが設置できない。グラボの追加電源のケーブルも折り曲げることになる。具体的にはZOTAC GTX1050 LPなら側面ファンは設置できたが、ZOTAC GTX1060 AMP! Editionではダメだった。Elite361の公式ページにはグラボの長さの上限は記されているが、幅(高さ?とにかくマザーボードに対して垂直方向の寸法)の上限は記されていない。

ZOTAC GTX1050 LPの幅は70mmだが、ZOTAC GTX1060 AMP! Editionの幅は128mmである。この差で側面ファンが設置できなくなる。

Elite361に標準搭載されているファンは上部排気ファンのみである。最も近い後部のファン用の穴からの吸気が大部分を占めるだろう。となるとCPUには冷たい空気を供給できる一方で、グラボの周りには空気の流れが生じない。前述の通り側面ファン穴はグラボの真上にあるので、ここから自然吸気が行えるように、排気ファンを増設するのが妥当だろうか。あるいはグラボに冷たい空気を回すのは諦めて外排気型のグラボを買うべきだろうか。まあ問題が起きたら考える。

自作初心者は小さいケースを買うべきではない。パーツの性能上の相性以上に物理的な制約は見落としがちだからだ。

ホームページを復活させた

このホームページはしばしば消える。その理由はMySQLがしばしば原因不明のエラー(socketがない)を吐き、僕の技術では結局DBをリセットするしかなくなるからだ。

いい加減キレたので今回はdocker-composeでwordpressを立てた。

https://github.com/chao7150/myhomepage

https化も難題だった。立てたworepressのコンテナにexec -it <container id> bashで入り、certbotのインストールからapacheの設定ファイル更新まで地道にやった。

パソコン作った

  • CPU : i5-8400
  • グラフィックボード : GTX1050GTX1060(6GB)
  • メモリ : 16GB
  • SSD : 500GB
  • HDD : 1TB
  • ディスプレイ : ASUS VX24AH (24インチWQHD)
  • OS : ubuntu16.04
スペックよりもディスプレイの方が大事だと思って良いやつを買った。ドット抜けは許せないのでツクモで保証をつけた。1回交換してもらったら抜けがない個体を引けた。24インチWQHDの作業領域の広さもさることながら、この商品は発色が良い。暗い色がかなりよく区別できる。
キーボードも良いやつを買ったがまだ届いてない。液タブとのスペース問題は保留。
windowsからubuntuに変えた。ブラウザで何でも出来る時代なので特に支障なし。
CPUはi7にしても良かったのだが、昨今の脆弱性騒動やパッチによる性能低下の話を聞いて、ハイエンドにこだわるのがバカバカしくなったのでこうなった。
ゲームはDota2とかする。最高画質FHDで120Hz余裕。グラボ以上にCPUの性能が大事らしい。実際はディスプレイが60Hzなのでゲーム側で最高FPSを制限して使っている。人間の目の性能は高くないので高FPSディスプレイには価値を感じない。
opentoonzでアニメを描いたりもする。以前のPCよりも描画のカクつきが減った。詳しくないが多分グラボがopenGLをいい感じに処理してくれてるんだろう。使っている液タブ(UGEE HK1560)が安物なので若干の遅延はある。慣れればどうということはない。
液タブがubuntuで動くかどうかは心配していたが、全く問題なかった。つなぐだけで筆圧もちゃんと取れていた。
https://digimend.github.io/support/howto/drivers/evdev/
これに従ってマッピングの設定をしただけで使えた。
最近はvimの練習をしている。タイピング中に方向キーに手を伸ばすのが嫌だからだ。
 2018/2/8追記
YOLOで物体検出したくなってcuDNNで動かそうとしたらグラボのメモリが全然足りなくて詰んだので、ツクモの交換保証を発動して1060の6GBモデルを召喚した。予算オーバー。