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

2017-08-27

Excel から Markdownのテーブル形式で簡単に貼り付けられる Redmine プラグインを作った

誰でも簡単にテーブルが書けるように Excel からコピペでできるプラグインを作った。

元ネタは ReleaseNotes/2017/02/03/Excel等から簡単に表を貼り付けられるようになりました - docs.esa.io から。

仕事に使っている Redmine に導入したら評判がよく、たくさんテーブルを書いてくれるようになった。

この記事を書くにあたって macOS の Numbers にも対応した。

環境

Redmine 3.0 以降

リポジトリ

https://github.com/suer/redmine_paste_as_markdown_tables

インストール

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

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

2. Redmine再起動

機能

Excel や Numbers で表を作ってコピーして、

f:id:suer:20170827221651p:image

Redmine のチケットに貼り付けると Markdownテーブルにしてくれる。

f:id:suer:20170827221646p: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 だけ切り出したい。

2010-01-28

ActiveRecordとSequelでビューのモデルを作ってみる実験

ちょっと気になってやってみたら普通にできました。

環境

ActiveRecord2.3.5
Sequel3.8.0
ruby1.8.7 (2008-08-11 patchlevel 72)
sqlite33.6.12

実験データ

$ sqlite3 test.sqlite3
sqlite> create table groups (id integer, name string);
sqlite> create table members (id integer, group_id, name string);
sqlite> select g.id, m.id as member_id, g.name, m.name from groups g, members m where g.id = m.group_id;
sqlite> insert into groups (id, name) values (1, 'group1');
sqlite> insert into groups (id, name) values (2, 'group2');
sqlite> insert into members (id, group_id, name) values (1, 1, 'aaa');
sqlite> insert into members (id, group_id, name) values (2, 1, 'bbb');
sqlite> insert into members (id, group_id, name) values (3, 2, 'ccc');
sqlite> create view  v_groups as select g.id, m.id as member_id, g.name, m.name from groups g, members m where g.id = m.group_id;

sqlite> select * from v_groups;
1|1|group1|aaa
1|2|group1|bbb
2|3|group2|ccc
sqlite> 

ActiveRecordの場合

ar_view_test.rb

require 'rubygems'
require 'active_record'
require 'pp'

ActiveRecord::Base.establish_connection(
  :adapter  => "sqlite3",
  :database => "test.sqlite3"
)


class VGroup < ActiveRecord::Base
end

pp VGroup.find(:all)

begin
  VGroup.new.save!
rescue
  puts '書き込みはできない!?'
end

v_groups ビューの全件読み出しと、書き込み。

$ ruby ar_view_test.rb 
[#<VGroup id: 1, member_id: 1, name: "group1", name:1: "aaa">,
 #<VGroup id: 1, member_id: 2, name: "group1", name:1: "bbb">,
 #<VGroup id: 2, member_id: 3, name: "group2", name:1: "ccc">]
書き込みはできない!?

find :all は通常のテーブルのモデルと同様に成功する。

当然書き込みはできない。

Sequelの場合

sequel_view_test.rb

require 'rubygems'
require 'sequel'
require 'pp'

Sequel.sqlite("test.sqlite3")

class VGroup < Sequel::Model
end
pp VGroup.all

begin
  VGroup.new.save!
rescue
  puts '書き込みはできない!?'
end

やってることは同じ

実行してみる。

$ ruby sequel_view_test.rb 
[#<VGroup @values={:member_id=>1, :name=>"group1", :id=>1, :"name:1"=>"aaa"}>,
 #<VGroup @values={:member_id=>2, :name=>"group1", :id=>1, :"name:1"=>"bbb"}>,
 #<VGroup @values={:member_id=>3, :name=>"group2", :id=>2, :"name:1"=>"ccc"}>]
書き込みはできない!?

同じ結果。

まとめ

思った通りできました。

すばらしい。

2007-01-28

Tomcatの基本認証にMySQLを利用する

Tomcat の基本認証に MySQL を利用することができます.

ユーザが運用時に変化するような Web アプリの場合にはこれが便利だと思います.

各Webアプリ側の設定はこちら

1. DB 設定

create database authentication;

create table user_table (
  user varchar(30),
  pass varchar(30)
);

create table role_table (
  user varchar(30),
  role varchar(30)
);

grant select, insert, update, delete on authentication.*
to 'authtest'@'localhost' identified by 'authtest';

テーブル名,カラム名は自由につけることができますが,以降の設定で合わせる必要があります.

2. server.xml の設定

元々有効になっている「UserDatabaseRealm」に関する部分をコメントにし、

JDBCRealm用として記述されている中のMySQLを使うものをコメントを外して

有効にする.

<!--
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
       resourceName="UserDatabase"/>
-->

<Realm  className="org.apache.catalina.realm.JDBCRealm"
       driverName="com.mysql.jdbc.Driver"
    connectionURL="jdbc:mysql://localhost/authentication"
   connectionName="authtest" connectionPassword="authtest"
        userTable="user_table" userNameCol="user" userCredCol="pass"
    userRoleTable="role_table" roleNameCol="role" />

driverName はドライバのクラス名に合わせます.

この例は Connector/J を利用している場合の記述です.

~Table,~Col は 1. で設定したテーブル名,カラム名に合わせます.

3. DB へ入力

テストのために一件登録してみます.

ここではロールを role1 とします.

他のロール名でもかまいません.

insert into user_table (user, pass) values ('sue', 'sue');
insert into role_table (user, role) values ('sue', 'role1');

"Tomcat Webアプリケーションマネージャ"もこのDBを使うようになるので,これを使う場合は

ここで manager ロールも登録しておく必要があります.

4. ドライバを配置

ドライバの入った jar を $CATALINA_HOME/common/endorsed/ 以下に格納

5. tomcat を再起動

2006-03-09 HSQLDB embedded in Web Application

HSQLDB

仕事でHSQLDBを使うことになったのでメモ。

参考: http://www.chikkun.com/computer/java/primary/hsqldb.html

デモ用のWebアプリにHSQLDBを組み込むことが前提の文章です。

サーバの起動。

  1. /WEB-INF/lib/ に hsqldb.jar をコピー
  2. /WEB-INF/lib へ移動
  3. java -cp hsqldb.jar org.hsqldb.Server -database <DB Name> &

これでDBが立ち上がる。

テーブルの生成。

  1. /WEB-INF/lib へ移動
  2. java -cp hsqldb.jar org.hsqldb.util.DatabaseManager
  3. クライアントが立ち上がるので create table する。

(コマンドラインだけでもできそうなもんだが。。。要調査)

いろいろいじると /WEB-INF/lib に <DB Name>.* が四つくらいできる。

これを含めて配布すればデータごと配布したことになる。やっぱデモ用だな。

でもこれじゃあlib以下にバラまかれてしまってかっこ悪いので /WEB-INF/db とか作ってそこに cd してDBを作るのがいいだろう。

ここでタイムアップ。

できたDBにWebアプリから接続する方法はまたやろう。

みんなのプロフィールみんなのプロフィール 2006/03/10 17:44 ブログ開設おめでとうございます!!

アクセス数を上げるために当コミュニティサイトに登録しませんか?
http://blog.livedoor.jp/om5546/


より多くのひとに貴方のブログを見てもらえます。

参加するにはこちらからが便利です
http://blog.livedoor.jp/om5546/?mode=edit&title=%82%B7%82%A6%82%D0%82%EB%82%AA%82%E8%82%C1%82%C1%82%C1%82%C1%21&address=http%3A%2F%2Fd%2Ehatena%2Ene%2Ejp%2Fsuer%2F


お問い合わせはコチラから
http://blog.livedoor.jp/om5546/?mail