View customize の redmine.org でのURLが変わりました

redmine.org には、プラグインの情報を登録できる仕組みがあります。 登録したものは、下記で公開されます。

プラグインには、Identiferというプラグインを一意に表す識別子があり、上記サイトでもIdentiferを入力し、それがURLになるようになっています。

また、このIdentiferの情報を使って、インストール済みのプラグインの更新をチェックする仕組みがあります。

f:id:onozaty:20200825224858g:plain

で、本日下記のようなIssueをいただきました。

View customizeは既に登録済みなのに、なんでこんなIssueがあがるんだろう、、って思って確認したところ、redmine.orgに登録していたIdentiferが間違えていることに気が付きました。 view_customizeとすべきだったのがredmine_view_customizeになっていました。。

プラグイン側を変えるわけにはいかないので、redmine.orgに登録していたIdentiferを修正しました。これによってredmine.orgでのURLも変わることになりました。

redmine.org側にリンク張っていた方がいたら申し訳ありません。。

チェックボックスがチェックされたらテキストボックスを無効にする(Redmine View Customize Plugin)

上記の問い合わせに対応したサンプルコードを書いてみました。

チェックボックスをチェックしたら、テキストボックスを無効化します。

設定内容

  • Insertion position: Bottom of issue form
$(function() {

  const checkbox = $('#issue_custom_field_values_1');
  const text = $('#issue_custom_field_values_2');

  function changeEnableText() {
    text.prop('disabled', checkbox.prop('checked'));
  }

  checkbox.on('change', changeEnableText);

  changeEnableText();
});

動作

f:id:onozaty:20200823231739g:plain

FlywayのJavaコードによるマイグレーション

JavaのデータベースマイグレーションのライブラリであるFlywayですが、SQLファイルだけでなく、Javaのコードによるマイグレーションにも対応しています。

やり方は簡単で、SQLファイルと同じパッケージ(デフォルトだとdb.migration)配下に、SQLファイルと同じ規則でBaseJavaMigration を継承したクラスを追加して、migrateメソッドを実装するだけです。

package db.migration;

import org.flywaydb.core.api.migration.BaseJavaMigration;
import org.flywaydb.core.api.migration.Context;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.datasource.SingleConnectionDataSource;

public class V2__Load_data extends BaseJavaMigration {

    @Override
    public void migrate(Context context) throws Exception {

        NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(
                new SingleConnectionDataSource(context.getConnection(), true));

        jdbcTemplate.update(
                "INSERT INTO customers(first_name, last_name, address) VALUES (:firstName, :lastName, :address)",
                new MapSqlParameterSource()
                        .addValue("firstName", "Taro")
                        .addValue("lastName", "Yamada")
                        .addValue("address", "Chiba"));
    }
}

SQLで書くのが面倒なもの(ロジック自体が既にJava側にあるようなものとか)は、SQLで頑張らずにJava側での処理で行った結果をデータベースに登録する、、といったことで手間が減らせそうです。
また、データベース以外(ファイルとして保存されているようなデータとか)のマイグレーションも、これを使うと合わせて行うことができるので、いろいろ幅が広がりそうだなーと思いました。

Redmine: View customize plugin の v2.7.0 をリリースしました

View customize plugin の v2.7.0 をリリースしました。

2つの機能追加、改修を行っています。

プロジェクト識別子で対象ページを指定可能に

プロジェクト識別子(正規表現)で対象ページを絞ることができるようになりました。

今までもそういったシチュエーションがあることは認識していて、JavaScriptでViewCustomize.context.project.identifierなどを参照してハンドリングするコードを書いていましたが、プロジェクト毎の指定が多くなると管理がしずらくなる(一覧で見た際にわからない)というのをPull Requestいただいた際に認識できたので、機能として入れることにしました。
(@basyura さんからPull Requestいただきました。ありがとうございます!)

Path Pattern を任意項目に

Path Patternを必須項目ではなく任意項目に変えました。未入力の場合は、すべてのページが対象になります。
Insert Positionが入ってから、Path Patternを.*とすることが多くなったので、いつか必須は外そうと考えていました。今回新たに入力項目が増えて良いタイミング(キャプチャ撮り直すのが1度で済む...)だと思ったので、あわせて対応しています。

f:id:onozaty:20200705212001p:plain

リビングでのオンラインミーティングには Jabra Engage 50 がおススメ

リビングでのオンラインミーティングの悩み

在宅勤務で毎日オンラインミーティングがあるのですが、

  • PCデスクはリビングにおいてあるのでリビングで作業している
    (元々家にいるとき暇があればPC触っているので、家族がいるところに置きたくてリビングにしています)
  • 家族(嫁さん+娘3人)も学校やパートの休みが多くなり、平日昼間にリビングにいる時間が多い

ということで、家族が気を使ってくれていても、ミーティングに家族の声や生活音がどうしても入ってしまっていました。

ミーティングに参加しているメンバーは理解があって、まったく気にしないし、時々その音がネタになって話が盛り上がる、、みたいな感じでしたが、逆に家族に気を使ってもらうのが申し訳ないなと思う状態が続いていたため、これをどうにかすべく、マイクを調べ始めました。

元々使っていたものは、ゼンハイザーのPC 3 CHAT という3000円くらいで買ったヘッドセットです。

単一指向性でノイズキャンセリングマイクということですが、結構周りの音も拾ってしまっています。家族がリビングで話していたら、普通に聞こえる感じです。

他のものを探そうにも、なかなか家族の生活音などに関するレビューはなく、同じようなシチュエーションって考えると、コールセンターではと思い、コールセンター用のヘッドセットを探し始めました。

Jabra

コールセンター用のヘッドセットで調べていくと、Jabraというメーカーの製品がよさそうに見えました。コールセンター用のヘッドセットで高いシェアを持っているメーカーです。

www.jabra.jp

マイク性能で見ていくと、Jabra Engage 50 というのが、トリプルマイクテクノロジーとやらで、すごそうです。

とはいえ24,000円なので、これで失敗したら怖いな、、ってことで他の人のレビューを探していたところ、下記にたどり着きました。

Jabra の Engage 50 が最強だった 検証の結果、 Jabra / Engage 50 のマイク指向性が格別に強力という結論にいたりました。口元のマイク位置が数 cm ずれると装着者の声ですら拾わなくなると書けば、その指向性の強さが伝わるかと思います。

これは期待できる!!ということで、購入に踏み切りました。(この記事が無かったら、もっと悩んでいたと思います。感謝!!)

結果

1週間使ってみましたが、大満足です。まったく家族の音を拾わなくなりました。

参考までに、リビングで子供がいる状態で録音した音声を2つあげておきます。 最初がゼンハイザーのPC 3 CHAT、2つ目がJabra Engage 50です。

  • ゼンハイザー PC 3 CHAT
  • Jabra Engage 50

ゼンハイザーでは子供の声が入り込んでいますが、Jabra Engage 50 ではまったく入り込んでいません。また、マイクが拾う声もとてもクリアです。

同じ悩みを抱えた方は多いと思いますので、参考になったらうれしいです。値段以上の価値があると個人的には感じています。

attendance-recorder という出退勤を記録、参照するアプリケーションを作りました

在宅勤務中の出退勤がもう少し見える化できないかなぁと思って、attendance-recorder という出退勤を記録、参照できるアプリケーションを作りました。

github.com

Spring Bootで作ってます。

APIを叩いて出勤、退勤を記録して、それをWeb上で見れるような形になっています。

https://raw.githubusercontent.com/onozaty/attendance-recorder/master/screen.png

Rocket.Chat上でボットに話しかけて記録したかったので、Rocket.ChatのOutgoing WebHookを使って連携できるようにしています。(Slackと同じフォーマットだったと思うので、Slackでも使えるかも)

https://raw.githubusercontent.com/onozaty/attendance-recorder/master/rocket-chat.png

最低限の機能しかないのですが、公開したら他にも使う人がいるかもしれないということで、、

詳しくはREADMEをご参照ください。

第18回 redmine.tokyo勉強会で発表してきました

第18回 redmine.tokyo にて、『「伝わるチケット」の書き方』というタイトルでLTさせていただきました。

資料はこちら。

www.slideshare.net

一番重要なのは「チームの他のメンバのことを考えること」としましたが、実際この気持ちが無いと、なかなか今回書いたようなことをやろうという気持ちになれないと思います。
逆に「チームの他のメンバのことを考える」という気持ちがあれば、これ以外にもいろいろできることがあると思います。

そういう気持ちのメンバが一人だったとしても、それをチケットに表していけば、他の人もそのチケットを見ることによって、どんどんチーム内に伝播していくと思います。そして気が付いたら、それがチーム内の文化になっていると思います。
もしも自分のチームにはそういった気持ちが足りないな、、って感じたら、まずは自分が一人目としてチケットに表現していくのはいかがでしょうか。

最後に、、
お誘いいただいたスタッフの皆様ありがとうございました。 オンラインでの開催でしたが、スムーズに開催できたのは、スタッフのみなさまのおかげだと思います。
他の方々の発表は、急遽はいった家の用事もあって全部は聞けなかったのですが、気になる話ばかりだったので、後から資料などで見返そうと思っています。

次の開催も楽しみにしています。ありがとうございました!