すえひろがりっっっっ! このページをアンテナに追加 RSSフィード

2016-03-23

Redmine で Github のように絵文字を入力できるプラグインを作った

f:id:suer:20160323215745p:image

チケットの内容は簡潔に書くのがいいと思うが、簡潔に書きすぎると冷たい印象になったりしてよくない。

一方、同じような issue 管理機能でも Github では ":"(コロン) で囲った一定の文字列で絵文字が手早く書けるので、簡潔に内容を書きながら、ちょっとした感情を含めることができて冷たい感じになりにくい。

Redmine でも同じことがしたいのでプラグインを作ってみた。

環境

Redmine 3.0 以降

リポジトリ

https://github.com/suer/redmine_emoji

インストール

1. 以下のようにプラグインインストールする。

$ cd $RAILS_ROOT/plugins
$ git clone https://github.com/suer/redmine_emoji.git
$ cd $RAILS_ROOT
$ bundle install

2. Redmine再起動

機能

Wiki 記法が効くところならどこでも :xxxx: 形式の Github の絵文字を認識し、画像と差し替える。

no title



また、先頭マッチでサジェストを行う。

f:id:suer:20160323215744p:image


似たプラグイン

当然同じようなことを考えている人はいるようで、同じ目的のプラグインは既にある。

https://github.com/tmy/redmine_gemoji

こちらは Textile のみの対応となっており、Markdown で使えないのと、サジェストする機能がなかったので新たに作った。

2012-09-25

自作 Redmine プラグインの Redmine2.1 への対応状況

Redmine 2.0 までは prototype.js ベースだったのに対して、2.1 では jquery ベースとなっています。


prototype.js を前提とした javascript のコードを含むプラグインは全て修正の対象となります。


自作プラグインRedmine 2.1 への対応状況をまとめておきます。


アップデートが必要なプラグイン

以下のプラグインRedmine 2.0 用のままでは動作しません。

Redmine 2.1 で使用する場合は最新のものを使用してください。

2.0 用のまま使えるプラグイン

Redmine2.0 からアップグレードした場合、以下のプラグインは更新の必要がありません。

まとめ

私の自作プラグインは小さなものばかりなので、javascript のコード量も少なく対応は楽でした。

少なくとも Rails3 対応よりはかなり楽でした。

大型プラグインでは javascript を多用しているものが多いと思うので大変だと思います。

Rails 自体変化が激しいので、今後もすぐにプラグインが動かなくなるのでしょうか。。。

2012-07-16

codefirst が使用している 10 の Redmine プラグイン

codefirst で使っている Redmineインストールされているプラグインを数えてみるとちょうど 10 だったので公開してみようと思います。

ちなみにほとんど自作プラグインです。自演乙。


1. Redmine Absolute Dates plugin

http://github.com/suer/redmine_absolute_dates

チケットの作成日や更新日などで表示される「XX 日前」のような表記を yyyy/mm/dd 形式に変更するプラグインです。

小ネタプラグインのわりにはダウンロード数が多いようです。

みんな困っていたのか。

2. Redmine Code Review plugin

http://www.r-labs.org/projects/r-labs/wiki/Code_Review

Redmineリポジトリ表示上でコードレビューコメントをつけることを可能にするプラグインです。

コードレビュー結果はチケットとして作成されるため、すぐに担当者にフィードバックされます。

codefirst で使用している Redmine プラグインの中ではとても重要で、このプラグインが対応されるまで Redmine2.0 へのアップデートを止めていたほどです。

もはやこのプラグイン無しでグループ開発は考えられません。

3. Redmine Enter Cancel plugin

https://github.com/suer/redmine_enter_cancel

説明を書く前にチケットのタイトルでエンターを入力してチケットが作成されてしまうのを防ぎます。

これも困っていた人は多かったようです。

4. Redmine Incr Code Search plugin

https://github.com/suer/redmine_incr_code_search

ソースコードリポジトリのファイルをインクリメンタルサーチします。

階層の深いソースコードリポジトリを持つプロジェクトにおすすめ。

5. Redmine Issues Summary Graph plugin

https://github.com/suer/redmine_issues_summary_graph

チケットの作成、クローズを時系列に集計してグラフ化するプラグインです。

どの時期にチケットが増えたのか、対応をがんばったのはいつ頃かを可視化することができるので、暇なときにニヤニヤしながら眺めることができます。


6. Markdown Extra formatter

https://github.com/juno/redmine_markdown_extra_formatter/

Wiki記法markdown 形式を追加します。

textile 形式に馴染まないので。。。

Redcarpet Formatter プラグイン ( http://www.r-labs.org/projects/r-labs/wiki/Redcarpet_Formatter )に変更したかったのですが、既存のリソースが微妙に崩れるので断念。

7. Milkode plugin

https://github.com/suer/redmine_milkode

上記の Incr Code Search plugin と違い、コード内の文言からファイルを引っ掛けることができます。

手元にソースコードがない状態でも検索ができて便利。

Milkode が高速なので、手元にソースコードがある状態でも使ったりします。

ソースコードにリンクするので、コードレビューまでシームレスに行うことができます。

8. My Search plugin

https://github.com/suer/redmine_my_search

chrome 拡張を使用して OmniBox からチケットに一発で飛ぶことができるようになります。

9. Post Script plugin

https://github.com/suer/redmine_post_script

Redmine のチケット、wiki などの作成イベントにフックして外部スクリプトを実行するプラグインです。

実験的プラグインにつき動作がとても不安定。

10. Readme plugin

https://github.com/suer/redmine_readme

プロジェクトのトップにリポジトリ内の README ファイルを表示するプラグインです。

github のようにプロジェクトのトップがかっこよくなります。

おまけ

gist ですが、全ての活動へのリンクを追加するプラグイン(の init.rb) を公開しています。

https://gist.github.com/2657660

f:id:suer:20120716000801p:image

メンバーが何をしているかを一覧するのに便利です。

2010-04-10

Cronのスケジュール記法を解決する

Rails + BackgrounDRb 環境で、柔軟なスケジューリングをしたくて、Cron の記法を簡単に解決できないかなぁ、とBackgrounDRbのソースを読んでいたら、CronTrigger という便利なクラスがありました。

これを使えば Rails アプリから柔軟にスケジュールを制御できていい感じ。

# cron_test.rb
require 'vendor/plugins/backgroundrb/server/lib/cron_trigger'

cron = BackgrounDRb::CronTrigger.new("*/10 * 8-20 * * * *")
p cron.sec    # 秒
p cron.min   # 分
p cron.hour # 時

$ ruby cron_test.rb
[0, 10, 20, 30, 40, 50]
0..59
[8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

それぞれ秒、分、時間が配列で返るようです。

BackgrounDRb は cron と違って秒と年が追加されているので注意。

これを使って、

class CreateSchedules < ActiveRecord::Migration
  def self.up
    create_table :schedules do |t|
      t.column :cron, :string          # スケジュール
      t.column :task_id, :integer   # タスクを表すテーブルへの外部キーのイメージ
      t.timestamps
    end
  end

  def self.down
    drop_table :schedules
  end
end

のようにテーブルを作成して、カラムcronにスケジュールを入れるようにします。

class Schedule < ActiveRecord::Base
  def self.find_triggered(time = Time.now)
    find(:all).select do |sched|
      cron = BackgrounDRb::CronTrigger.new(sched.cron)
      cron.sec.include?(time.sec) and cron.min.include?(time.min) and cron.hour.include?(time.hour)
    end
  end  
end

のようにしておけば、Schedule.find_triggered で実行すべきタスクを取得できるようになります。

(注) 秒、分、時間以外は無視しています。

とても便利なのでCronTrigger.rb だけ切り出したい。

2009-12-07

FSWikiのwiki記法形式のファイルを一括でHTMLに変換する

FSWiki Ver.3.6.2。

PukiWiki よりも FreeStyle Wiki が好きで使ってたのですが、諸事情により MindTouch に移行する必要が発生してしまいました。

FSWiki <=> PukiWiki の変換はそんなに面倒じゃないのですが、MindTouchはDB内にHTML形式でページを持つので、data/*.wiki ファイルを変換してやらなきゃいけない。

でも、それなら FSWiki が自分でそういうパーザを持ってるよね、と思ってソースを読んでたらすぐにありました。

lib/Wiki.pm から抜粋

#===============================================================================
# <p>
# 引数で渡したWikiフォーマットの文字列をHTMLに変換して返します。
# </p>
# <pre>
# my $html = $wiki-&gt;process_wiki(文字列);
# </pre>
#===============================================================================
sub process_wiki {
	my $self    = shift;
	my $source  = shift;
	my $mainflg = shift;
	
	if($self->{parse_times} >= 50){
		return $self->error("Wiki::process_wikiの呼び出し回数が上限を越えました。");
	}
	
	$self->{parse_times}++;
	my $parser = Wiki::HTMLParser->new($self,$mainflg);
	$parser->parse($source);
	$self->{parse_times}--;
	
	return $parser->{html};
}

そのまんまじゃん。

ということで、こいつに文字列を渡してやれば HTML に変換してくれそうです。

実験

以下のファイルをtest.plという名前でFSWikiのルートディレクトリに作成します

#!/usr/bin/perl
use lib './lib';
use strict;
use Wiki;
use Util;
use Jcode;

my $wiki = Wiki->new('setup.dat');
print $wiki->process_wiki("!!!hoge");

$ perl test.pl 
<h2>hoge</h2>

できてるっぽい!

一括変換

ということで data/*.wiki を読み込んで、 process_wiki() に渡してやって、ファイルに出力してやれば良さそうです。

まずひとつの .wiki ファイルを読み込んで HTML を標準出力に吐くスクリプト。

translate.pl

#!/usr/bin/perl
use lib './lib';
use strict;
use Wiki;
use Util;
use Jcode;
use HTML::Template;

my $input = "";
open(IN, $ARGV[0]);
while (<IN>) { $input .= $_; }
close(IN);

my $wiki = Wiki->new('setup.dat');
print $wiki->process_wiki($input);

簡単ですね。Perl ってこんな感じでいいのかしら?

data/ ディレクトリ内の *.wiki ファイルを translate.pl にかけて html/ ディレクトリに保存するスクリプト。

#!/bin/sh

for wiki in `find data -maxdepth 1 -mindepth 1`; do
  perl translate.pl $wiki > html/`basename $wiki`.html
done

まぁワンライナーですが。

実行

 $ mkdir html
 $ sh translate.sh

以上。