出力を入力へ

プログラミングに関する基本的な事を中心にまとめます

Redmine4(Rails5)プラグイン開発ハンズオン無料セミナーに参加しました

Redmine4(Rails5)プラグイン開発ハンズオン無料セミナーに参加しました

Redmine4を見据えた,プラグイン開発ハンズオンに参加しました.

主催のアジャイルウェアさん,会場提供のテクマトリックスさん ありがとうございました.

agileware.connpass.com

参加者

ほとんどの人がPlugin開発経験なし, Ruby(Rails)も普段バリバリ書いている人はいない という感じでした.

自分も2-3個のRailsアプリを書いたことがあるだけでほとんど知見なし, Rails5についても情報収集はあまり行っていない (開発経験もない)というスキルでの参加です.

ハンズオンの流れ

connpassにアップロードされた資料の通りです. Cloud9上でRedmineの最新版(trunk)を動作させ, サンプルのプラグインとして チケットに「いいね」ができる いいねプラグイン を写経しました. また,途中途中で講師の方から注意点や 実際のプラグイン開発の知見を説明してもらいました.

ハンズオン内容・ポイント

プラグインチュートリアル

redmine公式wikiにもプラグイン開発のチュートリアル掲載されています. しかし最終更新が2014年で,Redmine 2系を対象としており, メンテされていません. 自分も以前プラグイン作成を検討した際に 情報の古さから断念しました.

加えて,チュートリアル中では rails generate redmine_plugin コマンドにてプラグインの雛形を生成して 作成するように支持がありますが, このツールのメンテがあまり行われておらず アジャイルウェアさんでもこのツールは利用していないとのこと.

このためプラグイン開発は手作業でファイルやディレクトリを作成して進めました. しかし,Rails開発に慣れていないこともあって 多くの参加者でミス・不具合が発生(自分も何度かミスしました). 正直なところ,このツールは必要だと思ったのですが 慣れてくるとどうでもよくなるのでしょうか.

プラグインHook

Redmineにはプラグイン向けに 処理を差し込めるポイントが準備されています. Hookリストはこちら.

ただし,このHookは数が十分ではなく, 大抵のプラグイン開発で必要なHookが足りない状況におちいるとのこと. このため,ベースとなるHookポイントにテンプレートの元となる記述を書き込み, 後からJavaScriptで書き換えるのがよいそうです.

プラグイン開発パターン

issue_patch

既存のクラスに機能を追加する(モンキーパッチを当てる)仕組み. ここではIssueに対するパッチで,iine_countersテーブルへの 参照を追加しています. 他にも本プラグインではuser_patchを利用しています.

query column

Issue一覧のカラムを追加する方法です. available_columnsに追加することで実現できます.

Rail5対応に必要な変更

ActiveSupport::Reloader

Rails4ではActionDispatch::Reloaderとして実装されていましたが Rails5でActiveSupport::Reloaderとクラスが変更になっています.

Module:prepend

Rails4ではalias_method_chainを利用していましたが, Rails5からは非推奨となり,prependを利用する必要があるそうです.

その他

redminerailsの再読み込みの相性があまりよくないらしく, 開発中においてプラグインを書き換えても自動で反映されず サーバ再起動が必要になったり,ならなかったりすることがあるそうです.

hatena-blog-modeのテスト

手軽にブログを投稿できるようにするために emacsで作成・ポストできる環境を構築する. hatena-blog-mode はまさにこれを実現するためのelispなのでこれを利用する.

追加でやりたいこと

ファイルの保存場所の指定

デフォルトではHOMEに作成され, 投稿が完了すると(投稿しなくても) 編集後にファイルを削除する. hatena-blog-backup-dir を指定することで 編集後にファイルを保存してくれる.

現在はローカルファイルの管理にhowmを利用しており, これは home-dir/YYYY/mm/ にファイルを作成する. これと統合して同一ディレクトリに作成するようにしたい.

またはhowmでファイルを管理してもいい(こちらの方がいい?).

ファイル名の指定

デフォルトでは hatena-new-entry.md となりこれをカスタマイズすることはできない. バックアップファイルは YYYY-mm-dd-HH-MM-SS フォーマット. これをhowmと同一の YYYY-mm-dd-HHMMSS フォーマットに変更(統一)したい.

ただし,現状ではローカルにて作成途中のファイルを管理することを想定していない様子.

記事名やカテゴリの自動設定

デフォルトでは投稿時( hatena-blog-post 実行時)に タイトルやカテゴリ,ドラフト等を指定できる. これをfront matterのように ファイル内で指定できるとさらに便利.

el-getレシピ化

とりあえず作成してみたけど上手くいかない. 先に自分の.emacsの整理が必要かも.

関連

minikubeのvm-driver noneでk8sを構築したときに外部ホストからアクセスを許可する

minikubeでkubernetesを構築するとき,
デフォルトではVirtualBoxVMを作成してその上で構築する.

一方で,この挙動はvm-driverオプションで変更することができ,
オプションに'none'を指定すると,minikubeコマンドを実行したホスト上に
kubernetesを構築することができる.

$sudo minikube start --vm-driver none
Starting local Kubernetes v1.8.0 cluster...
Starting VM...
Getting VM IP address...
Moving files into cluster...
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.

しかし,この方法では外部ホストからのアクセスを許可できず,
例えばダッシュボード画面を外部ホストから表示できない.

$ minikube dashboard --url
http://127.0.0.1:30000

VirtualBox上に構築した場合は
外部からアクセスできるようになっている.

(VirtualBox上に構築した場合)
$ minikube dashboard --url
http://192.168.99.100:30000

これに対処する方法として,
プロキシにより外部からアクセス可能な経路を作成する方法がある.

$ kubectl proxy --address=0.0.0.0 --accept-hosts='.*'
Starting to serve on [::]:8001

あとはminikubeを実行したホストに
ブラウザでアクセスすれば おなじみにダッシュボード画面にアクセスできるようになる.
(例: IPが192.168.1.61の場合 http://192.168.1.61:8001/ui など)

f:id:thaim:20171209122143p:plain

Redmineのサブプロジェクトを表形式で表示するView Customize pluginスクリプト

Redmineの各プロジェクトの概要ページにて,サブプロジェクトはコンマ区切りで表示される. これはサブプロジェクトが2-3個であれば気にならないが, 多くなるほどに見辛くなることが気になっていた.

これを解決するために,View Customize pluginを利用して サブプロジェクトの表示方法を変更する.

続きを読む

Ubuntu Desktop 16.04上で、OpenCV3.1.0をビルドする

軽い気持でOpenCV3.1.0をビルドしようとしたら 想像以上に苦労したのでそのまとめ。

続きを読む

ゲストOS(Windows10)からmicroSDカードリーダの認識に失敗した

Raspberry Pi2でWindows 10 IoTを動かそうという目標に対して VMのWindows10を利用しようという話。

結局Windows10 IoTまで話が進まず、 ゲストOSにSDカードリーダを認識させることができずに 失敗しています。

続きを読む

KVM上のWindowsでVirtIOを利用する

やっとの事でKVM上にWindows10をインストールすることに成功した。

thaim.hatenablog.jp

とはいえ、ディスクIOがものすごく遅い。 アプリのインストールにも時間が掛かるし、 普段使いにも非常に不便。 そこでディスクをIDEからVirtIOに変更してみる。

続きを読む