C Sharpens you up

http://qiita.com/yuba に移しつつあります

Windowsのコマンドプロンプトでワンライナーを書こうとすると二重引用符がビョーキ

Windowsコマンドプロンプト(cmd.exe)でコマンド引数に空白を含む文字列を渡したいときは二重引用符でくくります。ここまではよく知られたノウハウ。

では、二重引用符を含む文字列を渡したいときは?、となると大半の人はあやしいはず。「¥でエスケープすればいい?」、いえ、¥がエスケープ文字になるのはUNIX系のシェルです。cmd.exeでのエスケープはどうなるかというとこれが公式情報が出ていない上に、どうもその隠し仕様も相当複雑なようで、こちらの記事

を読んでみても頭がくらくらするのですが、この知見を下敷きに、最近見つけた面白い動作の例をひとつご紹介します。

続きを読む

半二重のRS-485上に複数機器をつなげるModbus

BEMS機器の接続規格として最も古いModbusは1970年代からあります。その物理層は二線式のRS-485。半二重のシリアル通信を二線間の電圧差分で伝達するものです。

RS-485は単純なシリアル通信であり、ルーティング機能や衝突検知機能は持ちません。しかも半二重。半二重とはホスト2つを一対一でつないだとき、同時には片方からしかデータ送信ができないことを意味します。

そんなRS-485上で、Modbusは一対の二線式ケーブルにいくつもの(247台までの)機器をぶらさげるネットワークを実現しています。いったいどんな魔法を使っているのか?

魔法のからくりは、マスタースレーブ通信にあります。マスター機器が一台だけ存在し、

  • 通信を開始できるのはマスターだけ
  • 通信に応答してよいのはマスターに指名されたスレーブだけ
  • マスターから全員への通信(ブロードキャスト)には誰も応答してはいけない

というルールで衝突を防いでいるのです。

この仕組み上、機器はリアルタイム情報を中枢へアップロードするという仕組みは構成できません。あくまで、中枢が各機器へひとつずつ状態を聞いて回るという手順になります。

そのため参加機器が増えると(といっても247台が上限ですが)、最大19200bpsしか出ない通信帯域の中では状態取得頻度が上げられなくなるという性質があります。

あわせてどうぞ【BEMS技術】

5Lと3Lのバケツで4Lの水を作る問題・人力で解く編

就活シーズンだからかこの記事が検索されることが増えてきたので、プログラムではなく人の頭で答にたどり着く方法をまとめておきます。

問題は

5Lと3Lのバケツで4Lの水を作ってください。

です。暗黙の条件として、バケツから水を半分だけこぼすような操作はできません(円柱のドラム缶や角柱の石油缶なら可能でしょうが、バケツは円柱ではありません)。

続きを読む

DHCPで立てた社内サーバにマシン名でアクセスできるようにする

Windowsを使えばよろしい。
…で終わってしまうのでLinuxでもマシン名でホストアクセスを受け付けるようにする方法。

ドメインがexmaple.comでマシン名がmyhostだったら、dhclientの設定ファイルに次の設定を加えます。

send fqdn.fqdn "myhost.example.com";
send fqdn.server-update on;

dhclientの設定ファイルはディストリビューションとアダプタデバイス次第ですがCentOSなら/etc/dhclient-eth0.confなど。

次回DHCP取得時、DHCPサーバがDNSにマシン名を登録してくれます。

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",

の一行を書き加えることで利用できます。

*1:オープンソースソフトウェアに独自に改良を加えたとき、本家にその改良の採用を依頼すること。開発者向けSNSGitHubの機能です。

GitBucketのユーザ認証をActiveDirectoryと連携する

GitBucketは驚きの超お手軽GitHubクローンです。
そのお手軽さたるや、落としてきたgitbucket.warファイルをTomcatにデプロイするかjarとして実行java -jar gitbucket.warするかするだけで社内GitHubがもう構築完了。
あとはrootユーザ(初期パスワード root)でサインインして自分のパスワードを変えるだけでもう実使用可能な状態になっています。

そのGitBucket、社内の開発者全員分のユーザアカウントを各自に作ってもらうまでもなくActiveDirectoryの認証情報でサインインするように設定することが可能です。手探りでやってみて設定に成功したので、方法を解説します。

続きを読む

Play2でHaxeを使う覚え書き

HaxeActionScriptをベースにした汎用言語だが、Javascriptへのコンパイルが当初から実現されているのでBetter JSのひとつとしても人気。
実験的にJava, C#, C++へのコンパイルまでサポートされている。

特徴としては、強力な型推論を持ったクラスベースのオブジェクト指向言語
型システムの拡張性が高く

  • enum型が、単なる列挙体というよりは共用体、いや、OptionやEitherがそのまま書けてしまう合併型と呼ぶべき存在。
  • 構造的部分型と呼ばれる、持っているべきメソッドの集合によって表現された型がある。ダックタイピング型でありinterfaceと違ってクラス側が“実装”する必要が無い。GCCC++の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ファイルにまとまります。