• このエントリーをはてなブックマークに追加
  • このエントリをクリップ! このエントリをクリップ!


2012-02-08 15:10 追記
@fmkt さんから「『説明』を必須にするパッチ」について言及いただいたので,その旨を追記しました.

ss-1328678321

はじめに

Redmine で「新しいチケット」発行時,そのフォームの「題名」を入力しているときに,全角モードのつもりで入力確定!ッターン! とかしたら実は英数モードのままで,中途半端な題名のチケットが登録されてしまうことってありますよね!

もうホントストレスフルなので,ちょっと愚痴りました:

#redmine チケット登録フォームの「題名」フォーカス時,Enterを押してもsubmitされないようにしてくれるプラグインとかないですか!
Twitter / @issm: #redmine チケット登録フォームの「題名」フォ …

そうしたら,@yusuke_kokuboさんから,こんなリプライをいただきました:

@issm グリモン書いてください
Twitter / @yusuke_kokubo: @issm グリモン書いてください …

...ということで,サクっとGreasemonkeyをでっち上げてみました.

ちなみにこれが私の初 Greasemonkey です!

Chrome で Greasemonkey

個人的環境では,Chrome で Redmine をよく使うので,そもそも Greasemonkey な環境をよく知らない私は,拡張機能探しから始まりました.

「Greasemonkey」で検索したら見つかったのが Tampermonkey でした.

ss-1328678404

星もいっぱいついていたので,とりあえずこれをインストール.

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行だけの変更なのでプラグインに落とし込んだ方が良いのかなあ…

Twitter / @fmkt: @issm 具体的に書くと app/models/i …

なるほど,入力の流れで見れば,「題名」 → 「説明」なので,前者の時点で 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.

JavaScript 用テンプレートエンジン Jarty の紹介 – ドワンゴ 研究開発ブログ

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なテンプレート中で,自分で定義した処理を行うための「フィルタ」を追加してみるお話でした.

  • このエントリーをはてなブックマークに追加
  • このエントリをクリップ! このエントリをクリップ!

ss-1325848366

はじめに

1つ前のエントリ の「今後」として書いたうちの1つ:

ランチャからInboxに放り込めると便利そう
「GTDme」というオレオレGTDツールを作って使い始めようとしています « いわぶろ(ろてん)

今のうちに作ってしまった方が今後恩恵に与れそうなので,「Alfredの拡張機能」という形でひとつこさえてみました.

以下,そのあたりの紹介などです.

Alfredって何?

いわゆる「ランチャ」の1つです.

もともと qsb-mac を使っていたのですが,ここ2年近くアップデートもなくてマンネリ化してきたので,「Mac ランチャ」とかでググっていたところ,次のエントリに行き当たりました.

現在ベータ版で普通にはダウンロードができませんが、メールアドレスを登録するとダウンロードリンクが送られてきます。

Google Quick Search Boxをよりお洒落に使いやすくしたような印象。

なにより軽快に動いて、わかりやすい操作方法なのがいいですね。

格好いい・使いやすい・軽快と三拍子揃ったランチャ『Alfred』 | Macの手書き説明書

エントリ時期自体はちょっと前のものですが,「Google Quick Search Boxをよりお洒落に使いやすくしたような印象。」の一文で,使ってみる気になった感じです.(QSBの使い勝手は好きなので.)

で,Alfred の半分くらいの機能は,£ 15 の「Powerpack」を購入する必要があり,本エントリで触れる「拡張」機能もこの範囲に入っていたかと思います.が,他の機能も含めて,その価値は十分にあると思いますよ.例えば,Free版では,ランチャの表示・非表示の際必ずフェイドイン・フェイドアウトがかかり,サクサク感を得にくいのですが,Powerpackによって,この設定を解除することができるようになる,といった具合です.

セットアップ

拡張機能のインポート

続きを読む »

  • このエントリーをはてなブックマークに追加
  • このエントリをクリップ! このエントリをクリップ!

ss-1325810374

はじめに

ここ2年ほどで,未実施なプロジェクトリスト == 紙の束を持ち運ぶのが大変になってきたり,毎度紙におこすのがメンドかったりと,週次レビューに対するモチベーションが,本題とは外れた部分をきっかけに下がり始めてきたので,ちょっとツールを切り替えてみようかな,などと思い立ちました.

で,これまでやってきたオレオレ週次レビューの流れをそれなりに活かせそうな形で,「GTDme」というツールを作り始めてみてます.ネーミングは気にしない.

多少形になってきたので,以下,現状での紹介など.

そもそもGTDって何?

ここでは省略.

まずは実践してみることをオススメします.「脳はHDDではなくCPUである」という考えに賛同できれば,コンセプトは吸収しやすいんじゃないかな,と思います.

現状をざっと詳細

認証

Twitter な OAuth のみサポートしています.個人レベルでの利用とかいいながら,認証はソーシャルっぽく.

ナビゲーション

ss-1325807388

GTDにおいて,一般的に「準備しよう」とされている各種の「リスト(フォルダ)」に相当するようにナビゲーションを置いてます.だいたい次のような感じです:

Home
「次に取るべき行動」リスト
Inbox
「In-box」
Calendar
「カレンダー」.オレオレ的に,特定日(期間)もの,週次反復もの,月次反復もの,と分割していたり
Background
「連絡待ち」リスト
Materials
「資料」.単語に違和感><
Someday
「多分やる・いつかやる」リスト
Projects
「プロジェクト」リスト

Add to Inbox?

ss-1325807448

どのページにも,右上のあたりに「Add to Inbox?」という,ボタンのようなものを置いてます.これをクリックすると...

ss-1325807658

...何か入力フォームが表示されるので,頭に浮かんだ気になったことを書いて Enter すれば,その内容が Inbox に入ります.

Inbox

ss-1325808195

こんな感じで,「Add to Inbox」した内容がいろいろたまります.それらにマウスを乗せると...
続きを読む »

6 of 991...45678...203040...99
  • twitter
  • facebook
  • github
  • hatena bookmark
  • SlideShare
  • flickr
  • foursquare
  • ustream
  • tumblr
  • friendfeed
  • mixi
  • Apple
  • WordPress
  • come icons are powered by komodomedia!