2012年2月アーカイブ

text型のカラムをINTEGER型に変更しようとしたら、エラーが出ました。
ALTER TABLE tbl  ALTER COLUMN foo TYPE integer ;

ERROR:  column "foo" cannot be cast to type integer
こういう場合は、USING句を使って明示的に型変換してやる必要があるみたいです。
ALTER TABLE tbl ALTER COLUMN foo TYPE integer USING foo::int ;
これでうまく行きました。
参考
http://archives.postgresql.org/pgsql-admin/2009-08/msg00156.php

クロージャは何の役に立つのか?

前回の記事で、クロージャは「状態を保持する関数」であると書きました。
これを応用すると、いろいろ便利なことができます。

jQueryとクロージャは相性バツグン

jQueryを使った経験があれば、誰でも下記のようなコードを書いたことがあるのではないでしょうか?
$('#btn').click(function(){
  alert('hello');
});
ここで、clickメソッドに渡されているのは無名関数function(){...}です。
そう、無名関数と言えばクロージャの出番です!

クロージャの応用例:2回目にクリックすると警告が出るボタン

ショッピングカートの「注文する」ボタンで、2重クリックすると2回決済されてしまうというサイトをたまに見かけます。
jQuery + クロージャを使うことで、これを防止してみましょう。
HTML
<form name="frm" id="frm">
  <input type="submit"   value="注文する" />
</form>
Javascript
$(function(){

    var isClicked = false;

    $('#frm').submit(function(){
        if (isClicked) {
            alert('すでにクリック済みです。');
            return false;
        }

        isClicked = true;
    });

});
デモ

↓2回クリックすると、2回目に警告が出ます。


クラスを作るより手軽なので、jQuery+クロージャの組み合わせはとってもおすすめです。
ぜひいろんな場面で使ってみてください!

これで、あなたはクロージャ入門を卒業しました。
最後まで読んでくれてありがとう。
おつかれさまですた。

例えば、あるディレクトリ内の全phpファイルの'user_no'を一気に'user_id'に置換したいときはこのようにします。
対象を確認
find /path/to/dir -name '*.php' -type f | xargs perl -n -e "print if m#'user_no'#i"
置換
(事前にバックアップを取るか、バージョン管理ツールに登録しておきましょう
find app -name '*.php' -type f | xargs perl -pi -e "s#'user_no'#'user_id'#i" 
置換前

$this->get('user_no');

↓

置換後

$this->get('user_id');
ここではiオプションをつけることで大文字・小文字を区別せずに置換しています。 (i = case insensitive)
(つまり、'user_NO'や'USER_NO'なども'user_id'に置換します。)

大文字・小文字を区別して、'user_no'だけを置換したい場合は、iオプションなしで実行してください。
jQueryを使って2重送信を防止する方法を紹介します。
Javascript
$(function(){
  var isSubmitClicked = false;
  $('#submitBtn').click(function(){

   if(isSubmitClicked) {
        alert('既にクリック済みです。お待ちください。');
        return false;
    }

    isSubmitClicked = true;
});
HTML
<form>
 <input type="submit" id="submitBtn" value="送信" />
</form>
os.ubuntu
os.debian
os.centos

などを、

os.linux.ubuntu
os.linux.debian
os.linux.centos

に一発で置換したいときは、どのようにしますか?

replace-regexpを使うとできます。
M-x replace-regexp RET os.\([a-z]+\)  RET os.linux.\1
\(~\)で囲ったものを、後で\1で参照することができます。
応用編
$this->af->setApp('aa', $x->hoge());
$this->af->setApp('bb', $y->fuga());
$this->af->setApp('cc', $z->piyo());
↑このようなメソッド呼び出しを、↓のような連想配列の代入に書き換えたい
$ary['aa'] = $x->hoge();
$ary['bb'] = $y->fuga();
$ary['cc'] = $z->piyo();
M-x replace-regexp RET $this->af->setApp('\(.+\)'[,\ ]+\($.+\)); RET $ary['\1'] = \2;
一発で決まると非常に気持ちがいいですね。
これで、リファクタリングの速度が速くなりそうです。

Smartyでクラス定数を使う方法

| カテゴリ:
Smartyでクラス定数を使う方法
class MyClass {
    const FOOBAR = 1234;
}
{if $x == constant("MyClass::FOOBAR") }
   ...
{/if}
shellにログインした状態でクエリ結果をファイルに保存しかったのですが、やり方が見つかりませんでした。

クエリをjsファイルとしてあらかじめ用意して、mongoクライアントに渡してやるとうまくいきました。

query.js
var query = {action:"hoge"};
db.userlog.find(query).forEach(function(x){ print(x.user_id); });
上記query.jsファイルをmongoクライアントに食わせると、結果を標準出力に吐いてくれます。
$ mongo  host/dbname query.js
MongoDB shell version: 2.0.1
connecting to: mem1/jp8122renshu
205368
206859
196658
152520
156449
156449
234470

MySQLやPostgreSQLでSQLファイル実行するような感覚で使えますね。

Enjoy!
追記
--quietオプションをつけると、余分な出力(バージョン表示とか)を抑制することができます。
$ mongo --quiet host/dbname query.js
205368
206859
196658
参考:MongoDBのshellを使い倒す
anything.elをインストールするのに必要な手順は、次の3つだけです。

auto-install.el を取得

http://www.emacswiki.org/emacs/download/auto-install.el
上記elファイルをダウンロードして、load-pathの通っているところに置きます。

auto-install.el を有効にする

.emacsに下記のように記述して、auto-install.elを有効にします。
;; auto-install.el
;; http://d.hatena.ne.jp/rubikitch/20091221/autoinstall
(require 'auto-install)
(setq auto-install-directory "~/.emacs.d/auto-install/")
(auto-install-update-emacswiki-package-name t)

anythingをインストール

M-x auto-install-batch anything
あとはひたすらC-c C-cを何回か押すだけです。

おまけ
iswitchb-modeを有効にしているとバッファ切替えでanythingと動作がかぶってしまうので、無効にしておきましょう。
(iswitchb-mode nil)
参考
[anything][emacs]anything導入のeverything ~3分で使えるanything.el~
Redmineでは、下記のようなURLを直接たたくことで件名や本文にデフォルト値を入力することができます。
http://example.com/projects/piyo/issues/new?issue[subject]=foo&issue[description]=bar&issue[tracker_id]=2 
Webアプリの管理画面などからRedmineへの直接リンクを貼っておくと、バグ修正や機能追加のチケットが簡単に作成できて開発効率が向上するかもしれませんね。

jQueryを使って下記のようにすれば、今見ている画面のURLをチケットの本文に張り付けることができます。
Javascript
$(function(){
    var redmineURL = 'http://example.com/projects/piyo/issues/new?issue[tracker_id]=3&issue[subject]=&issue[description]=';
    $('#linkToNewTicket').click(function(){
        var currentURL = location.href.replace('&', '%26');
        var url = redmineURL + currentURL;
        $(this).attr('href', url);
    });
});
HTML
<a href="#" id="#linkToNewTicket">チケット作成</a>
参考
チケット新規作成時にURLから初期値を渡したい
Emacsの正規表現検索・置換系のテクニックはいろいろあるのでちょっと敷居が高い感じがします。
勉強しなきゃと解説を読んでも、結局何も身につかなくて終ることが多いのではないでしょうか。

ここは、シンプルに一つだけ覚えておきましょう。

例えば、"hoge"を含む行を全て削除する方法。
  • C-M-s で正規表現検索
  • ミニバッファで
    Regexp I-search: ^.+hoge.+$
    
    
  • と入力。
  • $の直後に改行コード(C-q j)を入力しておくのがポイントです。
  • エンターで検索開始。C-sで次々に対象を確認
  • 全部確認し終わったら、M-%で置換モードに入る。
  • 置換後文字列は空のままエンター
これで、"hoge"を含む行を一括削除することができます。
お試しあれ!

[Ethna]$form_templateを使うときの注意点

| カテゴリ:
Ethnaのアクションフォームでは$form_tempalteという便利な機能があり、バリデーション時によく使う共通項目を親クラスに定義して使いまわすことができます。

ところが1点落とし穴があります。それはバリデーションの順番です。
coLinuxでUbuntu12.04を入れてみたら、"speedlinux"とかいう変なドイツ語のUbuntuが入ってしまいました。

一応使えるのは使えるのですが、coLinuxコンソール上ではキーボードの設定がおかしくて使いづらい(恐らく英語キーボードになってる)
# loadkeys jp106
/usr/bin/ckbcomp: Can not find file "symbols/jp106" in any known directory
試行錯誤の末、aptitudeを入れてconsole-dataを入れれば解決できることがわかりました。
# apt-get install aptitude
ここでメモリオーバーでcoLinuxが落ちた。
colinux設定ファイルでメモリ割り当てをmem=128 →mem=256に増やしてcoLinuxを再起動したらいけました。
# aptitude install console-data
これで、GUIっぽい赤い画面が出てきます。
"Japanese"を選択できました!

無事、キーボードが日本語配列になりました。

ところが、~ (ニョロ)が入力できない・・
# loadkeys jp106
これで、~が入力できるようになりました!
When you see this error while compiling Emacs 23.4 on Ubuntu ,
No rule to make target `/usr/lib/crt1.o', needed by `temacs'. Stop
Just try this.
$ gcc -print-file-name=crt1.o
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o
$ ./configure --without-x --with-crt-dir=/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/
$ make
$ sudo make install
Enjoy! :)
Emacs 23.4がリリースされていたので、早速コンパイル&インストールしました。

sudo apt-get install gcc make  # 準備
wget ftp://ftp.ring.gr.jp/pub/GNU/emacs/emacs-23.4.tar.gz  # ソースをダウンロード
tar xvfz emacs-23.4.tar.gz  # 解凍
cd emacs-23.4
./configure --without-x --with-crt-dir=/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/
make   #  コンパイル
sudo make install   # インストール

--with-crt-dirオプションですが、これをつけないとエラーになりました。
普通にconfigureしてmakeしたら下記のようなエラー。
インストーラにバグがあるみたいです。
No rule to make target `/usr/lib/crt1.o', needed by `temacs'. Stop

下記コマンドでctr1.oの場所がわかります。
ここで表示されたディレクトリ名を--with-crt-dir=の後ろに書けばいけると思います。
%  gcc -print-file-name=crt1.o
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o
参考(英語サイト)
http://comments.gmane.org/gmane.emacs.devel/140480

人気記事

このアーカイブについて

このページには、2012年2月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2012年1月です。

次のアーカイブは2012年3月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

最近の人気記事