Redmine: カスタムフィールドを連動させる(親の値に応じて、子を絞り込む) (View customize plugin)

カスタムフィールドを連動させられないかといった質問があったので、View customize pluginでやってみました。

親の選択内容に応じて、子の選択項目を絞るようなイメージです。

下記のような状態のものを対象にします。

f:id:onozaty:20160403030448p:plain

設定内容

Path pattern

チケット作成、更新のページを対象にします。

/issues/

Code

Type:JavaScriptとして下記を設定します。 親の選択内容に応じて、子のカスタムフィールドの項目を絞り込む(関係するものは表示、それ以外は非表示)形になります。

$(function() {

  var parentFieldId = 'issue_custom_field_values_1';
  var childFieldId = 'issue_custom_field_values_2';

  // 表示条件
  var isTarget = function(child, parent) {
    // 前方一致のものを対象に
    return child.text().indexOf(parent.text()) == 0;
  }

  // 子フィールドの絞り込み
  var narrowChildField = function() {

    // 親で選択している項目
    var parentSelected = $('#' + parentFieldId + ' > option:selected');

    $('#' + childFieldId + ' > option').each(function() {

      var child = $(this);

      // 一致したものだけに絞り込む
      if (isTarget(child, parentSelected)) {
        child.show();
      } else {
        child.hide();
      }
    });
  }

  // 現時点のもので子を絞り込み
  narrowChildField();

  // 親フィールドが変わった際に子フィールドを絞り込み
  $('#all_attributes').change(function(e) {
    if (e.target.id == parentFieldId) {
      narrowChildField();
    }
  });

  // ステータス変更時などにDOMが差し替えられるので
  // フォームの内容が書き変わるたびに絞り込みを反映
  var _replaceIssueFormWith = replaceIssueFormWith;
  replaceIssueFormWith = function(html){

    _replaceIssueFormWith(html);

    narrowChildField();
  };
});

(追記@2016-10-09) IEだと、optionをdisplay:noneで非表示にできないので、このコードは動きません。無効にすることはできるので、それによって選択不可とすることはできます。下記リンクにdisableにしているコードがありますので、ご参考まで。

設定後のイメージ

親の選択項目に応じて、子が絞られるようになりました。

f:id:onozaty:20160403030708p:plain

Redmine: プロジェクト一覧からの各プロジェクトのリンク押下時のリンク先を変える(View customize plugin)

プロジェクト一覧の各プロジェクトのリンクを押下時のリンク先は、プロジェクトの概要ページとなっていますが、ここを変更したいといった要望があったので、View customize pluginでやってみます。

今回は、概要ではなく、チケット一覧ページに呼ぶようにします。

設定内容

Path pattern

プロジェクト一覧のページを対象にします。

/projects$

Code

Type:JavaScriptとして下記を設定します。

プロジェクト名のリンクに対して、末尾にissuesをつけるようにします。

$(function() {
  // リンクの末尾に"/issues"を付与
  $('#projects-index a.project').each(function() { this.href += '/issues' });
})

設定後のイメージ

リンク先がissuesとなりました。 f:id:onozaty:20160327004450p:plain

超音波距離センサー(HC-SR04)で距離を計測する(Arduino)

超音波距離センサーを使って距離を測ってみます。

今回使うのは、HC-SR04 です。1つ400円くらいの品になります。

測定可能距離は 2〜400cm となっています。

Trig端子を10マイクロ秒以上Highにすると、40KHzのパルスを8回送信して受信までの時間が計測されます。 Echo端子のHighとなっている時間がパルスを送信してから受信するまでの時間になるので、この時間をもとに計算することにより距離を測ることができます。

配線図は下記の通りです。

で、スケッチは下記のように書きました。

const int TRIGGER = 2;
const int ECHO = 3;

void setup() {

  Serial.begin(9600);
  pinMode(TRIGGER, OUTPUT);
  pinMode(ECHO, INPUT);
  
}

void loop() {

  // 10マイクロ秒出力 -> パルスが送信
  digitalWrite(TRIGGER, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGER, LOW);

  // パルス送信から受信までの時間を取得
  int duration = pulseIn(ECHO, HIGH);

  if (duration > 0) {
    // 往復にかかった時間 / 2 * 音速(340m/s)
    double distance = (double)duration / 2 * 340 * 100 / 1000000;
    Serial.println(distance);
  }
  delay(1000);
}

シリアル通信で距離を出力しています。Arduino IDEのシリアルモニタで確認することができます。

f:id:onozaty:20160323230024p:plain

他のアプリケーションから値を取得するようなこともやりたいので、他のシリアル通信方法で値をとることを考えてみました。プログラム書いてもいいのですが、コマンドで取れるのが何かと簡単なので、Macのターミナルからコマンドで値を取ってみます。

対象のデバイスに対して、catなどで普通に参照できるようなので、、

$ cat /dev/tty.usbmodem1421

としてみましたが、応答がありません…
screenコマンドでは、普通にシリアルモニタとして確認できたので、デバイスが間違えているわけではないようです。

いろいろ試してみたところ、 /dev/cu.*の方だと参照できることがわかりました。(根本的な原因やttyとcuの違いはわかってません)

$ ls -1 /dev/*usb*
/dev/cu.usbmodem1421
/dev/tty.usbmodem1421

$ cat /dev/cu.usbmodem1421
124.11
122.43

計測できた値ですが、近いのは結構あってそうな気がしますが、1メートル以上離れると、あまり精度が良くない気がします。部屋の形や、反射する対象物などによっても変わってくるようです。

あと、本当ならば、音速を求めるにあたっては湿度も影響してくるので、湿度センサーで計測した値も使った方が良いようです。この辺りは、また後で他のセンサーも含めて試してみようと思っています。

GitのGUIクライアントSourceTreeがおすすめ

今までGUIのクライアントは使ってなかったのですが、最近SourceTreeを使い始めました。Gitの導入コストを下げるのに、GUIのものを使うのはどうかなぁと試してみたのがきっかけです。

Gitは多機能なので、コマンドでやろうとすると、最初は結構迷う気がします。そこで、SourceTree使うと、良く使うものが簡単に出来て、かつビジュアル的に見やすいので、最初の敷居を下げてくれるかなぁと思いました。

WindowsとMacの両方で使えるのも良いですね。

Arduino始めました

前から触ってみたいと思っていたArduinoですが、ちょうど試してみたいものが出てきたので触り始めました。

Arduinoは敷居が低くて、部品さえそろえば、半田なしで遊べます。情報もあふれているので、とっても簡単です。

まずは下記を購入して、寝る前の1時間くらいでちょっとづつ進めています。

Arduino エントリーキット(Uno版)- Physical Computing Lab

Arduino エントリーキット(Uno版)- Physical Computing Lab

Arduinoをはじめよう 第3版 (Make:PROJECTS)

Arduinoをはじめよう 第3版 (Make:PROJECTS)

LEDが光っただけで、ニヤニヤしてしまいます…

Vagrantのboxを共有する

インターネットでの共有

Vagrantの開発元でもあるHashiCorpがAtlasというサービスを提供しています。

これを使うと、Vagrantのboxをアップロードし、共有することができます。コストもかからないし、バージョン管理もできちゃいます。

Atlasに登録したものは、そのまま名前を指定すると仮想マシンを立ち上げられます。

vagrant init onozaty/redmine-3.2
vagrant up

とても便利ですね!

インターネットに公開できない場合

インターネット上に公開できないようなものの場合だと、Atlas使えないのでちょっと面倒です。

ファイルサーバなどでboxを共有する

みんなが参照可能な場所にboxを配置し、vagrant init時にURLを指定します。

vagrant init testapp file:////server/vagrant/testapp.box
vagrant up

ちなみに、上記は下記と同じです。

vagrant box add testapp file:////server/vagrant/testapp.box
vagrant init testapp
vagrant up

場所を周知するだけなので、そこまで面倒ではありませんが、あんまりパスを入力したくないですよね、、

boxの場所が書かれたVagrantfileを配布する

ということで、パスを入力するのが嫌なので、別の方法としてVagrantfileを配布する方法があります。

Vagrantfileには、boxのURLが書けて、boxとして登録されていない場合には、そのURLからboxを取得して登録してくれます。 (vagrant init <box名> <URL>でVagrantfile作った時にも同様のVagrntfileが作られています)

  • Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "testapp"
  config.vm.box_url = "file:////server/vagrant/testapp.box"
end

これならば、配布されたVagrantfileを置いたディレクトリで

vagrant up

で終了です。

バージョン管理をする

Vagrantには、boxに対してバージョンを付与し、boxをアップデートする仕組みが用意されています。(Atlasでは、アップロード時にバージョンも記入するので、その情報を元に最新があるかどうかを返してくれています)

jsonファイルにて記載します。バージョンの情報として、バージョン毎のbox取得先URLが記載されています。

  • testapp.json
{
  "description": "Test",
  "short_description": "Test",
  "name": "testapp",
  "versions": [{
    "version": "1.0.0",
    "status": "active",
    "description_html": "<p>Test App</p>",
    "description_markdown": "Test App",
    "providers": [{
      "name": "virtualbox",
      "url": "file:////server/vagrant/testapp-1.0.0.box"
    }]
  },
  {
    "version": "1.1.0",
    "status": "active",
    "description_html": "<p>Test App</p>",
    "description_markdown": "Test App",
    "providers": [{
      "name": "virtualbox",
      "url": "file:////server/vagrant/testapp-1.1.0.box"
    }]
  }]
}

boxのURLとして、上記のjsonファイルを指定します。

vagrant box add file:////server/vagrant/testapp.json
vagrant init testapp
vagrant up

こうすると、jsonに書かれた最新のバージョンを使って立ち上がります。

boxがアップデートされた時には、jsonのファイルを修正すると、vagrant upの時に、新しいものがあることを伝えるメッセージが出ます。

>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'testapp' is up to date...
==> default: A newer version of the box 'testapp' is available! You currently
==> default: have version '1.1.0'. The latest is version '1.2.0'. Run
==> default: `vagrant box update` to update.

vagrant box updateでboxが更新できます。

vagrant box update --box testapp

jsonファイルもconfig.vm.box_urlに指定できるので、Vagrantfileを配布するような方法も取ることができます。

5 Seconds Of Summer - "Sounds Live Feels Live" JAPAN TOUR 2016 (2016年2月23日@日本武道館)

5 Seconds Of Summer(ファイヴ・セカンズ・オブ・サマー)のライブに嫁さんと2人で行ってきました!
昨年の日本初ライブには残念ながら行けなかったので、待ちに待ったライブです。

若い人ばっかり、しかも女性ばっかりで、ちょっと自分は場違いでは、、といった不安がありましたが、とっても楽しめました。

5sosのメンバも、ほんと楽しそうに演奏しているので、こっちも楽しくなります。(こんな息子たちがいたらいいなぁと思いました(笑))

アシュトンがすごい真剣(というか表情豊か)に演奏していて、モニタで抜かれるたびに、気になってしょうがありません。

「Hey Everybody!」から始まって、最後は「She Looks So Perfect」で、あっという間の時間でした。
ほんと楽しかったです。さらにさらに5sosのことが好きになりました。

セットリスト
  • Hey Everybody!
  • Money
  • Disconnected
  • Don’t Stop
  • Waste the Night
  • Outer Space
  • Castaway
  • Jet Black Heart
  • Vaper
  • Amenisia
  • Beside You
  • End up Here
  • Good Girls
  • Voodoo Doll
  • Permanent Vacation
  • What I like About You
  • She’s Kinda Hot (アンコール)
  • She Looks So Perfect (アンコール)