Online Bookmark Incremental Search の v2.0.3 をリリースしました

Online Bookmark Incremental Search の v2.0.3 をリリースしました。
大量のブックマークがあると、Chrome版でlocalStorage APIの制限(5,242,880バイト)に引っかかり、ブックマークが保存されないという問題に対応しています。

unlimitedStorage という権限を付けると、制限を回避できるので、それで対応しています。

問い合わせのあった方は、4万件のブックマークがあり、この制限に引っかかっていました。

Online Bookmark Incremental Search の v2.0.2 をリリースしました

Online Bookmark Incremental Search の v2.0.2 をリリースしました。
はてなブックマークで動作しなくなっていたのを修正しています。

Online Bookmark Incremental Search は、オンラインブックマーク(Google Bookmarks, Pinboard, はてなブックマーク)をインクリメンタルサーチする拡張機能です。
ChromeとFirefox版の2つをリリースしています。

Firefox側でのコメントで、はてなブックマークで動作しないってあったので、今回の問題に気が付きました。
はてなブックマークが常時https化されたタイミング(2019年5月28日)から動いていないと思うので、はてなブックマークで使っている人はいなさそうです。

Googleブックマークも今月末で終了なので、この拡張機能を使う人もほとんどいないのかもしれませんね、、

Rocket.Chatでファイルアップロードを頻繁に使うならば、アップロードしたファイルの保存先はデフォルト(GridFS)から変えた方が良い

Rocket.Chatでアップロードしたファイルの保存先は、最新(3.16.3)だと下記の5種類から選ぶ形になっています。

  • GridFS
  • FileSystem
  • Amazon S3
  • Google Cloud Storage
  • WebDAV

設定方法などは、下記にまとまっています。

デフォルトはGridFSです。GridFSでは、ファイルをチャンクに分割してMongoDBのドキュメントとして登録するので、新たな設定が不要(Rocket.ChatはMongoDBが必須)で手軽に使えるのですが、MongoDBに負荷を与えることにもなります。

そのため、Rocket.Chatでは、ファイルアップロードを頻繁に使うような場合にはGridFSの利用を推奨していません。

  • Recommendations for File Upload - Rocket.Chat Docs

    Though GridFS is used in rocket.chat for file storage because MongoDB offers this functionality with zero configuration but GridFS is not recommended for day to day file storage needs in a production environment because it puts an immense amount of load on the database.

Rocket.Chatがちょっと重たくなってきたとか、ファイルアップロードが遅かったり、エラーになったりするような場合には、GridFSを疑ってみると良いと思います。
デフォルトがGridFSなので、問題が起きて気が付く、、といった場合が多そうですね。Rocket.ChatのGitHubやForumでもGridFSに関する問題が何度かやりとりされているようでした。

GridFSからの変更ですが、FileSystemが一番手軽にできる変更だと思います。適当なフォルダ切って、Rocket.Chatからアクセスできるように権限を与え、Rocket.Chat上からフォルダを指定するだけです。再起動はいりません。
ただし、Rocket.Chatを複数台で運用している場合、すべてのRocket.Chatサーバから見て同じパスになるように設定(ネットワークフォルダ等)する必要があります。

2021年5月から6月にZennで書いた記事

2021年5月から6月までの記事

Redmineでステータスと連動して進捗率と担当者を変更する(View customize plugin)

View customize pluginで、(個人的に)一番便利だと思っているスクリプトです。
チケットの担当者を切り替えながら進めていくような場合には、ほんんんんとに便利なので、ぜひ試して欲しいです。

GoでCSVファイルを処理するCLIのツール(csvt)を作りました

CSVファイルを処理するcsvtというCLIのツールをGoで作りました。
作り始める時点で用意しようと思っていた機能が揃ったので紹介します。

下記のようなサブコマンドを用意しています。

  • choose CSVファイル内から一部の列を取り出して新しいCSVファイルを作成する
  • count CSVファイルの行をカウントする
  • filter CSVファイルの行を条件に応じてフィルタリングし、新しいCSVファイルを作成する
  • header CSVファイルのヘッダ内容を表示する
  • join 2つのCSVファイルを列の値をキーとして結合する
  • remove CSVファイル内から一部の列を削除して新しいCSVファイルを作成する

一番気に入っているコマンドはjoinです。
ExcelのVOOKUP的なことができます。

$ csvt join -1 INPUT1 -2 INPUT2 -c COLUMN -o OUTPUT
Usage:
  csvt join [flags]

Flags:
  -1, --first string     First CSV file path.
  -2, --second string    Second CSV file path.
  -c, --column string    Name of the column to use for joining.
      --column2 string   (optional) Name of the column to use for joining in the second CSV file. Specify if different from the first CSV file.
  -o, --output string    Output CSV file path.
      --usingfile        (optional) Use temporary files for joining. Use this when joining large files that will not fit in memory.
      --norecord         (optional) No error even if there is no record corresponding to sencod CSV.
  -h, --help             help for join

例えば、input1.csvとして下記内容のCSVファイルと、

UserID,Name,Age,CompanyID
1,"Taro, Yamada",10,2
2,Hanako,21,1
3,Smith,30,2
4,Jun,22,4

input2.csvとして下記内容のCSVファイルを用意して、

CompanyID,CompanyName
1,CompanyA
2,CompanyB
3,CompanyC
4,"AAA Inc"

CompanyIDの値を使って結合します。

$ csvt join -1 input1.csv -2 input2.csv -c CompanyID -o output.csv

できあがったoutput.csvは下記のような内容になります。
input1.csvを基準として、input2.csvの内容を足していくようなイメージです。

UserID,Name,Age,CompanyID,CompanyName
1,"Taro, Yamada",10,2,CompanyB
2,Hanako,21,1,CompanyA
3,Smith,30,2,CompanyB
4,Jun,22,4,AAA Inc

--usingfile というオプションを利用すると、メモリにファイル全体を載せることなく結合するので、どんな大きなファイルでも問題なく処理できます。(数GBのCSVファイルでも使用メモリは数十MB)

他のコマンドも含め、詳しい利用方法はREADMEをご参照ください。

使っているもの

サブコマンドの仕組みは Cobra を使いました。とても簡単にサブコマンドが作れます。

joinコマンドでのメモリを使わない実装では、キーバリューストアのBoltを使いました。手軽に使えてすばらしいです。

第20回 redmine.tokyo勉強会で『Redmine issue assign notice plugin の紹介』というタイトルで発表しました

第20回 redmine.tokyo にて、『Redmine issue assign notice plugin の紹介』というタイトルでLTさせていただきました。

資料はこちら。

Redmine issue assign notice pluginは、チケットの担当者を切り替えて進めていくようなプロジェクトでは、とても有用なプラグインだと思っていますので、今回このLTを見て試してみようという方がいたらうれしいです。

f:id:onozaty:20210523182619p:plain

今回の勉強会は、ところどころ抜けながらの参加(リモートだから家のことを途中で出来るので助かる)でしたが、聴いた発表はどれも良いものでした。
その中でも特に skys さんの「新型コロナウイルス感染者情報管理」は、Redmineをカスタマイズすることで、コロナウイルス感染者情報管理するという、とても面白い事例でした。

Redmineのカスタマイズ性の高さからか、開発以外の用途でも活用できる事例は多いですね。