@fmkt さんから「『説明』を必須にするパッチ」について言及いただいたので,その旨を追記しました.
はじめに
Redmine で「新しいチケット」発行時,そのフォームの「題名」を入力しているときに,全角モードのつもりで入力確定!ッターン! とかしたら実は英数モードのままで,中途半端な題名のチケットが登録されてしまうことってありますよね!
もうホントストレスフルなので,ちょっと愚痴りました:
#redmine チケット登録フォームの「題名」フォーカス時,Enterを押してもsubmitされないようにしてくれるプラグインとかないですか!
Twitter / @issm: #redmine チケット登録フォームの「題名」フォ …
そうしたら,@yusuke_kokuboさんから,こんなリプライをいただきました:
@issm グリモン書いてください
Twitter / @yusuke_kokubo: @issm グリモン書いてください …
...ということで,サクっとGreasemonkeyをでっち上げてみました.
ちなみにこれが私の初 Greasemonkey です!
Chrome で Greasemonkey
個人的環境では,Chrome で Redmine をよく使うので,そもそも Greasemonkey な環境をよく知らない私は,拡張機能探しから始まりました.
「Greasemonkey」で検索したら見つかったのが Tampermonkey でした.
星もいっぱいついていたので,とりあえずこれをインストール.
Greasemonkey を書いてみた
ひとまず「新しいチケット」にだけ対応できればいいや,という感じです.
// ==UserScript== // @name Redmine Ticket Form Enter-submit Canceller // @namespace http://iss.ms/ // @version 0.1 // @description チケット登録フォームの「題名」入力時,Enterを押してもsubmitされなくなります. // @include https://*/* // @copyright issm // ==/UserScript== var _form = document.getElementById('issue-form') , _subject = document.getElementById('issue_subject') ; if ( _form && _subject ) { var _handle_form_submit = function (ev) { return false; }; _subject.addEventListener('focus', function (ev) { //_form.addEventListener('submit', _handle_form_submit); // うまくいかん _form.onsubmit = _handle_form_submit; }); _subject.addEventListener('blur', function (ev) { //_form.removeEventListener('submit', _handle_form_submit); _form.onsubmit = null; }); _subject.blur(); _subject.focus(); }
フォーム要素の onsubmit プロパティを触っているので,もしかしたら,デフォルトの挙動に対して何かしらの影響があるかもしれません.
あと,@include の値は適宜調整していただいた方がよいかと思います.
おわりに
以上,Redmine のチケット登録時,個人的に感じるストレスを1つだけ解消するための Greasemonkey を書いてみたお話でした.
おまけ(追記)
少しして, @fmkt さんからも.
私は説明も必須項目にするパッチで対応しましたよー。 QT @issm: #redmine チケット登録フォームの「題名」フォーカス時,Enterを押してもsubmitされないようにしてくれるプラグインとかないですか!
Twitter / @fmkt: 私は説明も必須項目にするパッチで対応しましたよー。 …
@issm 具体的に書くと app/models/issue.rb の56行目辺りにあるvalidates_presence_of に :description を追加しました。 1行だけの変更なのでプラグインに落とし込んだ方が良いのかなあ…
なるほど,入力の流れで見れば,「題名」 → 「説明」なので,前者の時点で Enter して submit してしまったとしても,後者が空であれば必ず怒られる(チケットは登録されない),ということですね!
特定要素を3回点滅させるために,特定のクラス属性を追加したり削除したりを繰り返す処理について.
素直に書くとこんな感じ:
$target = $(...) interval_blink = 250 setTimeout( -> $target.addClass('highlighted') setTimeout( -> $target.removeClass('highlighted') setTimeout( -> $target.addClass('highlighted') setTimeout( -> $target.removeClass('highlighted') setTimeout( -> $target.addClass('highlighted') setTimeout( -> $target.removeClass('highlighted') interval_blink ) interval_blink ) interval_blink ) interval_blink ) interval_blink ) 0 )
再帰を使えばこんな感じ:
$target = $(...) n_blink = 3 interval_blink = 250 setTimeout( -> ((b, n) -> return true if n <= 0 f = arguments.callee setTimeout( -> meth = if b then 'addClass' else 'removeClass' $target[meth]('highlighted') f( !b, (if b then n else n - 1) ) interval_blink ) return false )(true, n_blink) 0 )
ということで,久しぶりに再帰とか考えた気がします.こういうこと考えるの楽しいですねw
はじめに
ちょっと前から,「Jarty」という JavaScript なテンプレートエンジンを使ってみていたりします.GTDme とかでも使ってみていたりしてます.
特徴は次のような感じ:
Jarty には以下のような機能があります。書式の多くは Smarty 互換です。
- 変数の置換 {$foo} => “abc”
- {if} {else} {/if} などの条件分岐
- {foreach} {/foreach} などのループ
- {$foo|upper|escape} などのフィルタ (パイプ)
- etc.
Jartyなテンプレート中で,自分で定義した処理を「フィルタ」として使えんだろうか,とソースコードを覗いていたら,意外と簡単に追加できそうな感じだったので,そのあたりを紹介します.(どこかにドキュメントされているのかもしれませんが!)
なお,記述はすべて CoffeeScript で書いています.適宜翻訳してくださいまし.
基本
Jarty.Pipe.prototype のプロパティに,処理したい関数を追加すればよさげです.そのプロパティ名が,「フィルタ」の名前となります.ただし,フィルタ名をスネークケースで使いたいときは,それをキャメルケースでプロパティに追加する必要があります.
Jarty.Pipe.prototype.fooBar = () -> ...
また,パイプの入力値は,関数の中で @value として参照します.
例えば,「何もしない」フィルタを,次のように追加できる感じです:
Jarty.Pipe.prototype.doNothing = () ->
return @valueこうしておけば,Jartyなテンプレート中で,次のようにフィルタが使えるようになります:
{$foo|do_nothing}
{$bar|doNothing}メンドイので関数化しておく
毎回 Jarty.Pipe.prototype. ... とかするのはメンドイので,関数を定義しておくとラクです.
とりあえず add_jarty_filter という名前ででっち上げてみました:
window.add_jarty_filter = (name, func) -> # foo_bar -> fooBar name = name.replace( new RegExp('_(.)', 'g'), (p, c) -> return c.toUpperCase() ) Jarty?.Pipe?.prototype?[name] = func
こうしておけば,先の「何もしない」フィルタは,次のように書けます:
add_jarty_filter( 'do_nothing' () -> return @value )
追加するフィルタが多くなれば,こうしておいた方がラクかもです.
ユーティリティ関数とかをフィルタ化しておく
文字列操作をはじめとする,小粒な関数とかをフィルタ化しておくと便利そうです.
例えば,与えた数値を3桁ごとに区切ってコンマ「,」を挿入するような関数 commify があったとします:
### * 数字を3桁ごとにコンマで区切る * 参考: http://www.din.or.jp/~ohzaki/perl.htm * ### window.commify = (num) -> if typeof num is 'number' return num.toString().replace(/(\d{1,3})(?=(?:\d\d\d)+(?!\d))/g, '$1,') else return num
これは,こんな感じでフィルタ化できます:
window.add_jarty_filter( 'commify' () -> return commify( parseInt(@value, 10) ) )
そうすれば,Jartyなテンプレート中で,
{$foo|commify}みたいに使えて便利です.
おわりに
以上,Jartyなテンプレート中で,自分で定義した処理を行うための「フィルタ」を追加してみるお話でした.
はじめに
1つ前のエントリ の「今後」として書いたうちの1つ:
ランチャからInboxに放り込めると便利そう
「GTDme」というオレオレGTDツールを作って使い始めようとしています « いわぶろ(ろてん)
今のうちに作ってしまった方が今後恩恵に与れそうなので,「Alfredの拡張機能」という形でひとつこさえてみました.
以下,そのあたりの紹介などです.
Alfredって何?
いわゆる「ランチャ」の1つです.
もともと qsb-mac を使っていたのですが,ここ2年近くアップデートもなくてマンネリ化してきたので,「Mac ランチャ」とかでググっていたところ,次のエントリに行き当たりました.
現在ベータ版で普通にはダウンロードができませんが、メールアドレスを登録するとダウンロードリンクが送られてきます。
Google Quick Search Boxをよりお洒落に使いやすくしたような印象。
なにより軽快に動いて、わかりやすい操作方法なのがいいですね。
エントリ時期自体はちょっと前のものですが,「Google Quick Search Boxをよりお洒落に使いやすくしたような印象。」の一文で,使ってみる気になった感じです.(QSBの使い勝手は好きなので.)
で,Alfred の半分くらいの機能は,£ 15 の「Powerpack」を購入する必要があり,本エントリで触れる「拡張」機能もこの範囲に入っていたかと思います.が,他の機能も含めて,その価値は十分にあると思いますよ.例えば,Free版では,ランチャの表示・非表示の際必ずフェイドイン・フェイドアウトがかかり,サクサク感を得にくいのですが,Powerpackによって,この設定を解除することができるようになる,といった具合です.
セットアップ
拡張機能のインポート
はじめに
ここ2年ほどで,未実施なプロジェクトリスト == 紙の束を持ち運ぶのが大変になってきたり,毎度紙におこすのがメンドかったりと,週次レビューに対するモチベーションが,本題とは外れた部分をきっかけに下がり始めてきたので,ちょっとツールを切り替えてみようかな,などと思い立ちました.
で,これまでやってきたオレオレ週次レビューの流れをそれなりに活かせそうな形で,「GTDme」というツールを作り始めてみてます.ネーミングは気にしない.
多少形になってきたので,以下,現状での紹介など.
そもそもGTDって何?
ここでは省略.
まずは実践してみることをオススメします.「脳はHDDではなくCPUである」という考えに賛同できれば,コンセプトは吸収しやすいんじゃないかな,と思います.
現状をざっと詳細
認証
Twitter な OAuth のみサポートしています.個人レベルでの利用とかいいながら,認証はソーシャルっぽく.
ナビゲーション
GTDにおいて,一般的に「準備しよう」とされている各種の「リスト(フォルダ)」に相当するようにナビゲーションを置いてます.だいたい次のような感じです:
Home- 「次に取るべき行動」リスト
Inbox- 「In-box」
Calendar- 「カレンダー」.オレオレ的に,特定日(期間)もの,週次反復もの,月次反復もの,と分割していたり
Background- 「連絡待ち」リスト
Materials- 「資料」.単語に違和感><
Someday- 「多分やる・いつかやる」リスト
Projects- 「プロジェクト」リスト
Add to Inbox?
どのページにも,右上のあたりに「Add to Inbox?」という,ボタンのようなものを置いてます.これをクリックすると...
...何か入力フォームが表示されるので,頭に浮かんだ気になったことを書いて Enter すれば,その内容が Inbox に入ります.
Inbox
こんな感じで,「Add to Inbox」した内容がいろいろたまります.それらにマウスを乗せると...
続きを読む »
最近の閲覧数
- [emacs] インデントをハイライトしてくれる「Highlighting indentation」で脱・インデント迷子
- IRC初心者がIRCを通知ツールとして使ってみる,または個人的IRC環境のメモ
- UbuntuとCentOSとにおけるlogrotateの挙動の違いでハマった
- aquaさんで開通間近の新東名高速道路を走ってきた
- Textile記法で手軽にWikiっぽく記録を残しておくツール「SiTeWiki」を作ってみた
- 「GTDme」というオレオレGTDツールを作って使い始めようとしています
- [git][perl] rebase祭りを支援するツール「git-rebase-matsuri」というのを書いてみた
- [perl] Cache::FileCacheが保存するファイルの中身を覗いてみるメモ
- Kansai.pm #14 へおジャマさせていただいてきた
- HTTPSとバックエンドなPlackアプリケーションとPlack::Middleware::ReverseProxyとHTTPヘッダ「X-Forwarded-HTTPS」と
最近のエントリ
- [perl] Image::Sizeで画像サイズを取得できないことがある件とその(アドホックな)対処方法
- 5月連休とaquaさん
- [perl][php] Textile記法+GeSHiでシンタックスハイライトするためのText::Textile::Pluggableプラグインを書いてみた
- [perl] Markdown記法をプラグインっぽく拡張できる「Text::Markdown::Pluggable」というモジュールを書いてみた
- [perl] Textile記法をプラグインっぽく拡張できる「Text::Textile::Pluggable」というモジュールを書いてみた
- aquaさんで入鹿池を2周してきた(約2年ぶり2回目)
- aquaさんで山崎川とか天白川とかの桜を眺めてきた(おまけで豊橋少々)
- サイクルショップカワタさんなツーリング@奈良
- 「魔法少女まどか☆マギカ展 名古屋会場」の写真いくつか
- Kyoto.pm #1に参加 & LTに飛び入らせていただいてきた
カテゴリー
タグ
-
actionscript
amon2
announce
bicycle
bookmarklet
cafe
cooking
cpan
della.js
dqwindowmanager
eating
elisp
emacs
event
gps
gtd
html
http
image
iphone
javascript
lifelog
linux
mac
mono
music
mylifehacks
mysql
mywebservice
neko
nicograph
onomichi
pc
perl
photo
plack
study
svn
tool
travel
twitomonitor
twitter
wcan
windows
wordpress
最近のコメント
-
No Responses.
最近のトラックバック
-
No Responses.








