Windowsのコマンドプロンプトでワンライナーを書こうとすると二重引用符がビョーキ
半二重のRS-485上に複数機器をつなげるModbus
BEMS機器の接続規格として最も古いModbusは1970年代からあります。その物理層は二線式のRS-485。半二重のシリアル通信を二線間の電圧差分で伝達するものです。
RS-485は単純なシリアル通信であり、ルーティング機能や衝突検知機能は持ちません。しかも半二重。半二重とはホスト2つを一対一でつないだとき、同時には片方からしかデータ送信ができないことを意味します。
そんなRS-485上で、Modbusは一対の二線式ケーブルにいくつもの(247台までの)機器をぶらさげるネットワークを実現しています。いったいどんな魔法を使っているのか?
魔法のからくりは、マスタースレーブ通信にあります。マスター機器が一台だけ存在し、
- 通信を開始できるのはマスターだけ
- 通信に応答してよいのはマスターに指名されたスレーブだけ
- マスターから全員への通信(ブロードキャスト)には誰も応答してはいけない
というルールで衝突を防いでいるのです。
この仕組み上、機器はリアルタイム情報を中枢へアップロードするという仕組みは構成できません。あくまで、中枢が各機器へひとつずつ状態を聞いて回るという手順になります。
そのため参加機器が増えると(といっても247台が上限ですが)、最大19200bpsしか出ない通信帯域の中では状態取得頻度が上げられなくなるという性質があります。
あわせてどうぞ【BEMS技術】
5Lと3Lのバケツで4Lの水を作る問題・人力で解く編
就活シーズンだからかこの記事が検索されることが増えてきたので、プログラムではなく人の頭で答にたどり着く方法をまとめておきます。
問題は
5Lと3Lのバケツで4Lの水を作ってください。
です。暗黙の条件として、バケツから水を半分だけこぼすような操作はできません(円柱のドラム缶や角柱の石油缶なら可能でしょうが、バケツは円柱ではありません)。
続きを読むEBeanのトランザクションがtry-with-resources構文で書けるようになります
Play!(2.2以前)も採用している軽量O/RマッピングライブラリEBeanに出していたプルリクエスト*1が通ったので手前味噌。
これまでEBeanでは、トランザクションはtry-finallyで書くのが基本でした。
Ebean.beginTransaction(); try { Order order = Ebean.find(Order.class,10); ... Ebean.save(order); Ebean.commitTransaction(); } finally { Ebean.endTransaction(); }
Java7にはtry-with-resourcesという構文があり、finallyやendTransactionを自分で書かなくてよくなるというものなのですが、EBeanのトランザクションはその対象ではありませんでした。Closeableインターフェースを実装していなかったからです。
Closeableインターフェースを実装するというだけのプルリクエストを出していたのですが今回受理され、EBean 3.2.6からはこういう書き方が可能になります。
try(Transaction tran = Ebean.beginTransaction()) try { Order order = Ebean.find(Order.class,10); ... Ebean.save(order); tran.commit(); }
ちょっとスマートになりますね!
3.2.6がリリースされたらPlay!の各バージョンからもbuild.sbt(またはBuild.scala)に
"org.avaje.ebeanorm" % "avaje-ebeanorm" % "3.2.6",
の一行を書き加えることで利用できます。
GitBucketのユーザ認証をActiveDirectoryと連携する
GitBucketは驚きの超お手軽GitHubクローンです。
そのお手軽さたるや、落としてきたgitbucket.warファイルをTomcatにデプロイするかjarとして実行java -jar gitbucket.war
するかするだけで社内GitHubがもう構築完了。
あとはrootユーザ(初期パスワード root)でサインインして自分のパスワードを変えるだけでもう実使用可能な状態になっています。
そのGitBucket、社内の開発者全員分のユーザアカウントを各自に作ってもらうまでもなくActiveDirectoryの認証情報でサインインするように設定することが可能です。手探りでやってみて設定に成功したので、方法を解説します。
続きを読むPlay2でHaxeを使う覚え書き
HaxeはActionScriptをベースにした汎用言語だが、Javascriptへのコンパイルが当初から実現されているのでBetter JSのひとつとしても人気。
実験的にJava, C#, C++へのコンパイルまでサポートされている。
特徴としては、強力な型推論を持ったクラスベースのオブジェクト指向言語。
型システムの拡張性が高く
- enum型が、単なる列挙体というよりは共用体、いや、OptionやEitherがそのまま書けてしまう合併型と呼ぶべき存在。
- 構造的部分型と呼ばれる、持っているべきメソッドの集合によって表現された型がある。ダックタイピング型でありinterfaceと違ってクラス側が“実装”する必要が無い。GCC版C++のSignatureに近いが、Signatureと違ってその場で書けるから柔軟性はより高い。Scalaにもあるやつです。
福岡方面でひんぱんに勉強会やってるらしい。福岡こわい。
コンパイラのインストール
Windowsならインストーラで一発。PATHも勝手に通る。PATHは勝手に通らない。通っていたのはHaxe 2.x時代のインストーラ?
なんかC:ドライブのルートにインストールしようとしてくるのでProgram Files (x86)の下にそっと導いてやる。
HaxeソースをJavascriptに変換するPlay2プラグイン
plugins.sbtに
addSbtPlugin("com.github.hexx" % "play-haxe" % "0.0.2")
と書き加えるだけでOK。
IDEの対応
Eclipseではググるとeclihxというプラグインがすぐに見つかるがこれはおすすめしない。少なくともEclipse 4.3(Kepler)ではまともに動かなかった。
おすすめできるのはFDT5というプラグイン。Flash開発用のプラグインだが、Haxe開発用としても秀逸。
プラグインインストール用のリポジトリURLは http://fdt.powerflasher.com/update/fdt5/
ただしFDT5を使って開発するときちょっと問題になるのがプロジェクトの構成の仕方。
Haxeプロジェクトとして立ち上げたプロジェクト内でならコード補完もばりばり効くのだが、Javaプロジェクト内に置いてあるHaxeソースを開いた場合はまったく効かない。
Play2のサーバアプリとHaxeのクライアントコードは別プロジェクトとして管理するべき?
というか、別プロジェクトして扱うんだったら無理してEclipse使わなくてもFlashDevelp使いましょーよという話になります。
IntelliJの場合、標準リポジトリのHaxeプラグインが完成度が高い。Javaプロジェクト内のHaxeソースでももちろんコード補完効きます。
Stringとかの標準型に波線引かれるのはなんでなんだろう…
実行
Play2プロジェクトのappディレクトリ内にassetsディレクトリを作って、その中にHaxe.hxを作ります。
package assets.javascripts; class Haxe { static public function main() { var h = new Haxe(); trace(h.hello("World!")); } public function new(){} public function hello(str: String) : String { return "Hello, " + str; } }
Play2アプリを起動して
Javascriptにコンパイルされたものが出て来ます。Haxeソースが複数本あっても一本のJSファイルにまとまります。