同じ条件のStreamを繰り返し作るためのビルダーを書いてみた

同じ条件のStreamを繰り返し作るためのビルダーを書いてみました。まったく使いどころが見いだせませんが、、とりあえず書いたので晒しておきます。

Streamの中間処理の流れを定義しておいて、、

Streamer<String, Integer> streamer =
        Streamer.create(String.class)
                .map(x -> {
                    try {
                        return Integer.parseInt(x);
                    } catch (NumberFormatException e) {
                        return null;
                    }
                })
                .filter(x -> x != null)
                .sorted();

Streamの元となるデータを指定することで、Streamを作ります。同じ条件で繰り返しStreamを作れます。

streamer.build(Arrays.asList("a", "2", "1", "", "000"))
        .collect(Collectors.toList()); // -> [0, 1, 2]

streamer.build(Arrays.asList("1", "2", "-1"))
        .collect(Collectors.toList()); // -> [-1, 1, 2]

streamer.build(Arrays.asList("a"))
        .collect(Collectors.toList()); // -> []

streamer.build(Arrays.asList("100", "abc"))
        .collect(Collectors.toList()); // -> [100]

書き始めたときは、何か目的があったはずなのですが、今となっては何のためだったかわからなくなりました...

Redmine: チェックボックスのカスタムフィールドを2列で表示する (View customize plugin)

チェックボックスを2列で表示したいとのことなので、ちょっと考えてみました。

CSSでcolum-countというプロパティがあり、これを使うと段組みが簡単にできます。

View customize pluginを利用して、column-countを設定します。

設定内容

Path pattern

チケット編集系の画面を対象とします。

/issues

Code

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

span.enumeration_cf.check_box_group {
  column-count: 2;
  -moz-column-count: 2;
  -webkit-column-count: 2;
}

追記@2016-09-07
上記はキー・バリューリストの場合ですが、リストの場合には、list_cfとなるようです。また、特定のカスタムフィールドを対象にする場合には、CSSの隣接セレクタ使って下記のように書きます。

label[for="issue_custom_field_values_1"] + span.list_cf.check_box_group {
  column-count: 2;
  -moz-column-count: 2;
  -webkit-column-count: 2;
}

結果

対応前は1列だったものが、

f:id:onozaty:20160905225251p:plain

2列で表示されるようになりました。

f:id:onozaty:20160905225259p:plain

カスタムフィールドの1列化のカスタマイズしていないときでも、チェックボックスの項目が多くて、かつ項目のラベルが短い場合には、2列表示は場所取らなくて良いかもしれませんね。

Redmine: チケット一覧の進捗率欄に値も表示する (View customize plugin)

Blogへのコメントで、チケット一覧の進捗率で数値も表示したいといったコメントをいただきました。

View customize pluginを使って以下の様なことをしようとしていますが、うまくいきません。宜しければアドバイス頂けないでしょうか?

・やりたいこと: Redmineのチケット一覧の"% Done"を数値でも表示したい。

チケット一覧では%Doneはバーで表示されます。これでは正確な数値がわからないので数値で表示したいです。 %Doneの数値が取得できるのかどうかもわかりません。

デフォルトの表示だと、こんな感じでバーでの表示になっています。

対応前

要素見てみたら、class属性として数値が記載されているので、それを使ってView customizeで対応してみます。

設定内容

Path pattern

チケット一覧を対象とします。

/issues$

Code

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

$(function() {
  $('table.progress').each(function() {
    var target = $(this);

    // classから進捗の値を取得(progress-値 となっている)
    var match = target.attr('class').match(/progress-([0-9]+)/);
    if (!match) {
      return;
    }

    // 値を追記して表示
    var value = match[1];
    target.after($('<p>').text(value));
  });
});

対処後の画面イメージ

対応後

Justin Bieber - Purpose World Tour (2016年8月13日@幕張メッセ)

Justin Bieber(ジャスティン・ビーバー)のライブに嫁さんと2人で参加してきました。今回の日本公演は、幕張メッセの国際展示場1~3での2日間で、初日の8月13日に参戦です。

昨年末のアメリカン・ミュージック・アワードでのパフォーマンスを見てから、ライブで見たくてしょうがなかったので、日本に来てくれてとてもうれしいです。

VIPの300番台だったので、とても近くで見れました。

Cold Waterと、Love Yourselfの引き語りで鳥肌が立ち、全体通してJustinのパフォーマンス(特にダンス)はすっごくかっこいいです。

アンコールのSorryは、雨を降らせた中でのパフォーマンスでびっくりしました。(アメリカン・ミュージック・アワードでも雨を降らせてたので、定番だったのかもしれません)

ショーを見ている感じで、感動しっぱなしで、あっという間にコンサートの1時間半が終わってしまいました。

次は3、4年後くらいですかね… 今から待ち遠しいです。

VIP特典

VIPの特典は、トートバックとキャップ、ネックストラップでした。猛暑の中、開場まで待つ必要があったので、キャップには救われました。

あと、グッズ販売でもVIP用のファストレーンがあって、長蛇の列に並ばずにグッズを買えたのは、とても大きな特典でした。

スタンディングについて

13日のVIPスタンディングが酷かったといった話がTwitterなどで流れていました。

確かにスタンディング(ALにいました)はかなり押し合いに近い状態になっていて、ある程度覚悟(オープニングの2、3分前に、歓声とともに、後ろから割り込んでくる流れがあって、そこからちょっとヤバイ雰囲気だった)はしていたものの、踏ん張るのは結構きつかったです。足が筋肉痛になりました(苦笑)。

自分の周りでは、Twitterであったような怪我人や喧嘩する人などは見受けられませんでした(すくなくとも気が付かなかった)。もしかしたら、もっときついブロックがあったのかもしれません。

手を伸ばしてスマートフォンで動画撮影している人も確かに多くて、ポジションによっては全然見えなくなる時があったので、そこはちょっと残念でしたが、許可されていることだし、スタンディングで隙間がないので、しょうがないのかなと(ただ、自分の頭に後ろの人の手が当たった状態がずっと続いているのはちょっと…)。自分は後ろの人が気になって、手を伸ばして写真を撮ることもないのですが、このあたりのマナーってどうあるべきなんですかね。

とはいえ、自分自身がVIPスタンディングで後悔したかというと、そういったことは全くなく、近くで見れたのはとても良かったし、スタンディングでぎゅうぎゅうになるのもライブの一環として楽しめました。ただ、同じ会場で怪我人が出たり、喧嘩がおきていて、ライブを楽しめない人が出ていたならば残念です。

セットリスト

  1. Mark My Words
  2. Where Are Ü Now
  3. Get Used To It
  4. I'll Show You
  5. The Feeling
  6. Boyfriend
  7. Cold Water
  8. Love Yourself
  9. Been You
  10. Company
  11. No Sense
  12. Hold Tight
  13. No Pressure
  14. As Long as You Love Me
  15. Children
  16. Life Is Worth Living
  17. What Do You Mean?
  18. Baby
  19. Sorry

観客の反応がひどくて、曲数大幅に減らされた!といった噂も流れていましたが、海外アーティストで1時間半のライブは、結構普通だと思います(逆に2時間超えると得した気分)。

気になったので他の会場でのセットリスト見てみましたが、だいたい20曲前後で、構成はほとんど変わりませんでした。

関連リンク

Redmine 3.3 で"+"ボタンを有効にしながら、「新しいチケット」タブも表示する (View customize plugin)

Redmine3.3で追加された"+"ボタンはとても良いと思うのですが、「新しいチケット」タブが消えるといったところは、それなりにインパクトが大きいようです。

だったら両方有効にすれば、、、ということで、Redmineの設定としては、"+"ボタンを有効にしておきながら、View customize pluginにて「新しいチケット」タブを表示します。

設定内容

Path pattern

全画面を対象とします。

.*

Code

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

$(function() {
  var newIssueSub = $('.menu-children a.new-issue-sub');

  if (newIssueSub.size() == 1) {
    // "+"ボタンで「新しいチケット」が表示され時のみ、タブにも追加
    $('#main-menu > ul > li > a.issues').parent()
      .after($('<li>').append(newIssueSub.clone().attr('class', 'new-issue')));

    if (location.pathname == newIssueSub.attr('href')) {
      // 新しいチケットに選択を切り替え
      $('#main-menu > ul > li > a.issues').removeClass('selected');
      $('#main-menu > ul > li > a.new-issue').addClass('selected');
    }
  }
});

対処後の画面イメージ

両方表示されるようになりました。これでどっちを有効にするかで揉めることは無くなりますね!(インタフェースとしては、統一性が無くてダメな感じになりますが…)

f:id:onozaty:20160815000449p:plain

Redmine 3.3 で導入された"+"ボタン

Redmine 3.3 で"+"ボタンが追加されて、さまざまなオブジェクトの作成が、一か所にまとまりました。 f:id:onozaty:20160717010201p:plain

個人的には、メニューに統一感が出るのと、ニュースやバージョン作成へのルートが短縮されるので、とても良い変更だと思っています。

ただ、この変更に合わせて、今まで頻繁に使われていたであろう「新しいチケット」タブが消えることになり、それに対してのインパクトがとても大きかったようで、設定で元の形に戻せるような形になりました。

慣れの部分も大きいとは思いますが、確かにタブとして見えていた方がわかりやすく、ユーザにとってよりアクセスしやすいと思います。ただ、もしも素早く新しいチケットを作りたいということならば、accesskey使うと良いのではと思っています。

accesskey

サイト上でのショートカットを割り当てる方法として、リンクやテキストボックスに対してaccesskey属性としてキーを割り当てることができます。 accesskeyの実行方法はブラウザによって異なります。WindowsのFirefoxだとAlt+Shift、ChromeだとAltといった感じです。Macだと、たいていCtrl+Altだったかと。(すいません調べてないです)

Redmineでは、accesskeyとして7が新しいチケット作成に割り当てられています。 なので、もしもWindowsのFirefoxで新しいチケット作成画面に飛びたい場合には、Alt+Shift+7 で飛ぶことができます。

画面見ただけだと気が付かない機能ですが、とても便利だと思っています。

Redmine: ステータスに応じて、カスタムフィールドの表示を切り替える (View customize plugin)

ステータスが却下になったら、カスタムフィールドを表示したいといったIssueがあがっていたので、スクリプトを書いてみました。

設定内容

Path pattern

チケットの作成、編集ができる可能性のある画面を対象にします。

/issues

Code

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

$(function() {

  // 表示の切り替え
  var changeVisibility = function() {

    var visible = $('#issue_status_id').val() == '6';

    if (visible) {
      $('#issue_custom_field_values_1').parent().show();
      $('.cf_1').show();
    } else {
      $('#issue_custom_field_values_1').parent().hide();
      $('.cf_1').hide();
    }
  };

  // 現時点のもので表示切替
  changeVisibility();

  // ステータスが変わったタイミングで切り替え
  $('#all_attributes').on('change', '#issue_status_id', function(e) {
    changeVisibility();
  });

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

    _replaceIssueFormWith(html);

    changeVisibility();
  };
})