formヘルパーのfieldNameはモデル名を含めて書こう

コントローラ側:

$uses = array('UserMst', 'UserList');

ビュー側:

$form->text('nickname');

の場合、nicknameは$usesの先頭のモデルのフィールドと見なされて、送られるデータは
['UserMst']['nickname']
な形になる。


複数のモデルを使用してたりする場合は、以下のようにformヘルパーできちんとモデル名を含めたfieldNameにしておいたほうが、トラブルを避けることが出来る。

$form->text('UserMst.nickname');

はてなブックマーク拡張のタグ候補をカウントの大きい順にソートして表示する


extensions\bookmark@hatena.ne.jp\chrome\content\addPanel\18-TagCompleter.jsの64行あたりに一行追加。

showTags: function(tags, el, pos) {
    this.clear();
    let tagsCount = TagCompleter.tagsCount;
    let self = this;

    // タグカウントの大きい順にソート
    tags.sort(function(a, b) tagsCount[b] - tagsCount[a]); //この一行を追加

    tags.forEach(function(tag) {
        let item = E('richlistitem', {flex:1, 'class': 'hBookmark-tagcomplete-listitem', value:tag},
            E('hbox', {flex:1},


きっと便利。


はてブ拡張のタグ付けを補助するAutoHotkeyスクリプト

使い方

はてなブックマーク拡張にコメントを入力後、選択してから任意のキーを押すといい感じのタグに変換する。


以下のコードは変換キーに割り当てています。

;はてなブックマーク拡張のタグ付けをサポート。はてブ拡張のダイアログだけで動作。
;文字列を選択してキー押下でタグに加工。スペースや改行は区切りと見なす。
;例「しなもん はてな」→「[しなもん][はてな]」
;英語版は「#IfWinActive ブックマークを〜」のタイトル部分を適宜変えること。
;====================
SetTitleMatchMode, RegEx
#IfWinActive ブックマークを(追加|編集) ahk_class MozillaDialogClass
sc079:: ;変換キー
cc := Clipboard
Send, ^c
ClipWait, 1
Clipboard := RegExReplace(RegExReplace(Clipboard, "^[\s ]+|[\s ]+$", ""), "[\s ]+", "][")
Clipboard = [%Clipboard%]
Send, ^v
Clipboard := cc
return
#IfWinActive

注意

  • クリップボードにテキスト以外の画像などが入っている場合はそれを壊してしまい、貼り付けができなくなる。
    • ClipboardAllを変数にコピーしてClipboardに戻してもうまくいかない。

技術メモ

  • #IfWinActiveでタイトルの正規表現マッチを行うためにSetTitleMatchMode, RegEx
  • #IfWinActiveでタイトル、クラス名など複数の条件を付ける場合はタイトルが先。ウィンドウ指定の方法 - AutoHotkeyJp
  • 変数名は大文字小文字の区別をしない。
  • if文は条件の後に改行必須。C言語のように if (hoge) i++ 一行で表現することはできない。
  • Send, ^cでコピーしたあと ClipWait, 1は必須。選択せずに動作した場合、永久に待ち受けるためらしい。
  • クリップボードの画像を変数に入れて後で戻したいがうまくいかない。ClipboardAllがおかしい?ClipWaitの第2引数がカギ?ClipWait - AutoHotkeyJp
  • 日本語を入力する際はクリップボードを使ったほうがいい。Sendだとキータイプイベントを送るのでうまくいかない。
  • クリップボードを使う利点。元に戻す(Undo)が一発。
  • IMEの状態確認、on/off,半角/全角切り替えはIME.ahkが便利。 AutoHotokeyを流行らせるアップローダ089.zipに入っている。
  • 関数ライブラリスクリプトIME.ahkなど)は「%A_MyDocuments%\AutoHotkey\Lib\」に突っ込んでおくと#Includeなしで使える。

いまさらながらAutoHotkeyが大変便利なことに気が付いた

インストール

本家 から "Installer for AutoHotkey_L"をダウンロードして、インストール時にUnicodeを選ぶ。

使い方


My DocumentsのAutoHotkey.ahkを編集。

;ひらがなキーを半角全角キーに割り当てる。
sc070::sc029


;Windows+Cでコマンドプロンプト起動。引数で起動時のディレクトリを指定。
#c::Run cmd, C:\Users\cherenkov


;Ctrl+Dで20110215の書式で日付を入力。
^d::
cc := Clipboard
Clipboard = %A_Year%%A_Mon%%A_MDay%
Send, ^v
Clipboard := cc
return


;MSキーボードの上部にあるホットキー(再生/一時停止)を拡張し、アクティブではないMedia Player Classic Home CinemaでもPlay/Pauseできるようにする。
sc122::
WinGetActiveTitle, ActiveTitle
DetectHiddenWindows,On ;WinGetでMinMax取る場合は必須。事前に入れるべし。
WinGet, mpcWin, MinMax, ahk_class MediaPlayerClassicW
if (mpcWin == -1) {
    WinRestore, ahk_class MediaPlayerClassicW
}
ControlSend,,{Space},ahk_class MediaPlayerClassicW
if (mpcWin == -1) {
    WinActivate, %ActiveTitle%
}
return
メモ
  • cc := Clipboardではなくcc = Clipboardのほうがいいかも。よくわかってない。
  • Key historyで"半角/全角"のように表示されたのでそのままRemapのキー名に使うとダメ。そういう場合は、サンプルにならって「vkXX」や「scYYY」のような仮想キーコードやスキャンコードで登録する。
  • 「Ctrl+Dで20110215の書式で日付を入力」は、以前 NILScript で組んで使っていたが、今回AutoHotkeyでこんな簡単にできる事を知ってガッカリした。
  • mpcは最小化状態では、ControlSendしても反応しないので、WinRestoreを使って元のサイズに戻してから処理するようにした。
  • 最小化状態から元のサイズに戻す際にWinActivateを使うと、Virtual Dimension(仮想デスクトップ)を使っている場合にウィンドウの取り扱いがおかしくなる。WinRestoreを使えば大丈夫だった。
  • 元々mpcが最小化していた場合は操作を終えてから、それまでアクティブだったウィンドウをアクティブに戻すようにしてある。
  • mpcを再び最小化するためにWinMinimizeを使うと、Virtual Dimensionがおかしくなるので行なわないことにした。

*1

*1:検索用:キーバインド

Google Spreadsheetsで選択範囲のセルの文字を大文字小文字に変換するGoogle Apps Script


Google Spreadsheetsのメニューから ツール - スクリプトエディタ を開いて、コードを以下のように書き換えて、Upper/Lower case なり適当な名前で保存すると、スクリプトが登録される。
スクリプトを使う場合は、大文字に変換したいセルを選択した状態で、ツール - 管理 upperを選んで、Run すれば完了。

function upper() {
  var range = SpreadsheetApp.getActiveRange();
  var cells = range.getValues();
  var rowLen = range.getNumRows();
  var columnLen = range.getNumColumns();
  for (var i = 0; i < rowLen; i++) {
    for (var j = 0; j < columnLen; j++) {
      if (typeof cells[i][j] == 'string') {
        cells[i][j] = cells[i][j].toUpperCase();
      }
    }
  }
  range.setValues(cells);
}

function lower() {
  var range = SpreadsheetApp.getActiveRange();
  var cells = range.getValues();
  var rowLen = range.getNumRows();
  var columnLen = range.getNumColumns();
  for (var i = 0; i < rowLen; i++) {
    for (var j = 0; j < columnLen; j++) {
      if (typeof cells[i][j] == 'string') {
        cells[i][j] = cells[i][j].toLowerCase();
      }
    }
  }
  range.setValues(cells);
}
メモ
  • forループしないで選択範囲を順に設定する方法他にありそうだけどわからん。
  • Browser.msgBox('message');でalertデバッグできる。
  • スクリプトエディタなどはChromeで開いたほうが操作しやすい。