2011年 8月 の投稿一覧

強制的にポインタを指カーソルにするCSS

IE6等でアンカーの中に文字列以外のタグ等を設定すると指カーソルが出ない場合が有ります。

そういう場合はCSSで強制的に指カーソルを表示するようにします。

style="cursor:pointer;cursor:hand"

jQueryでtype=”file”のvalueをリセットする

type=”reset”だと全てリセットされてしまうので、type=”file”のvalueだけリセットしたい場合。

こんなHTMLだった場合
[HTML]


[/HTML]

通常だと

    $('#resetid').click(function(event){
        $("#photoid").val('');
    });

でリセット出来るはずですが、IEでリセットできない。。。

replaceで置き換えてやるのが正解のようです。

    $('#resetid').click(function(event){
        event.preventDefault();
        $("#photoid").replaceWith("<input type='file' name='photo1' value='' id='photoid'>");
    });

pg_dumpで複数のテーブルのダンプを取る方法

純粋に複数のテーブルのダンプを取るのは-tオプションで複数のテーブルを指定すれば複数テーブルのダンプを取得する事が出来ます。
dbnameデータベースからa_tableb_tableテーブルのダンプを取る場合

$ pg_dump -t a_table -t b_table dbname > ~/dbname.dump.sql

どのバージョンからかは定かじゃないですが、8.2では-tオプションにワイルドカードを指定する事が出来るので

$ pg_dump -t '*_talbe' dbname > ~/dbname.dump.sql

と書くと_tableで終わる名前のテーブルを全てダンプする事が出来ます。

CakePHPでHABTMのデータのチェックボックスを作る

前提

前提として以下のような場合のテーブルでHABTMの設定をしているとします。

テーブルのリレーション

モデル

good.php

<?php
class Good extends AppModel {
    var $name = 'Good';
    var $hasAndBelongsToMany = array(
        'Tag' => array(
            'className'             => 'Tag',
            'joinTable'             => 'goods_has_tags',
            'with'                  => 'GoodsHasTag',
            'foreignKey'            => 'good_id',
            'associationForeignKey' => 'tag_id',
            'conditions'            => array(
                'Tag.deleted' => null,
            ),
            'unique'                => true,
        )
    );

    var $validate = array(
        'id'          => array('notempty'),
    );

}
?>

tag.php

<?php
class Tag extends AppModel {
    var $name = 'Tag';
    var $hasAndBelongsToMany = array(
        'Good' => array(
            'className'             => 'Good',
            'joinTable'             => 'goods_has_tags',
            'with'                  => 'GoodsHasTag',
            'foreignKey'            => 'tag_id',
            'associationForeignKey' => 'good_id',
            'conditions'            => array(
                'Good.deleted' => null,
            ),
            'unique'                => true,
        )
    );
    var $hasMany = array(
        'GoodsHasTag' => array(
            'className'  => 'GoodsHasTag',
            'foreignKey' => 'tag_id',
        )
    );

    var $validate = array(
        'id' => array('notempty'),
    );

}
?>

goods_has_tag.php

<?php
class GoodsHasTag extends AppModel {

    var $name = 'GoodsHasTag';

    var $belongsTo = array(
        'Good'           => array(
            'className'  => 'Good',
            'foreignKey' => 'good_id',
            'conditions'            => array(
                'Good.deleted' => null,
            ),
            'unique'                => true,
            'fields'     => '',
            'order'      => ''
        ),
        'Tag' => array(
            'className'  => 'Tag',
            'foreignKey' => 'tag_id',
            'conditions'            => array(
                'tag.deleted' => null,
            ),
            'unique'                => true,
            'fields'     => '',
            'order'      => ''
        )
    );

}
?>

※deletedは削除用フラグ

チェックボックス作成用のソースコード

コントローラー

function add(){
        $this->set('tags', $this->Good->Tag->find('list', array(
            'conditions' => array(
                'Tag.deleted' => null,
            ))));
    ...
}

ビュー

<?php
echo $form->input('Tag',array('multiple'=>'checkbox', 'label' => 'タグ'));
?>

このように書いておけば、例えば更新画面の場合は$this->dataに入ってるデータをデフォルトでチェックつけた状態で表示されますし。登録の際に$this->Good->saveAll($this->data);とすればgoods_has_tagsテーブルも更新されます。(更新の場合はDELETE、INSERTされます)

個人的にはHABTMでデータ持つのは面倒な気がしていてあまり好きじゃないので、多対多の場合はカンマ区切りで文字列でデータを持たせるように作ってます。
(goodsの場合だと、goods.tagのようなフィールドを作って文字列で)

文字列で持たせる場合も、以下のコードでチェックボックスを作成できます。

<?php
echo $form->input('tag', array('type' => 'select', 'multiple' => 'checkbox', 'options' => Invariable::$TAG_TYPES, 'value' => explode(',', $this->data['Good']['tag']), 'label' => 'タグ'));
?>

※タグは定数Invariable::$TAG_TYPESで管理。

SQLの実行結果(SELECT)を見やすくする方法

psql

psql => \x
psql => select * from users;

mysql

mysql> select * from users \G;

psqlもmysqlも縦でカラムを表示するようになるので崩れずに見やすくSELECTの実行結果を確認できるようになります。

コマンドプロンプトからFTP接続確認

コマンドのメモ

C:\>ftp
ftp> op xxx.xxx.xxx.xxx
Connected to xxx.xxx.xxx.xxx
220 Welcome to hikari-dream.com FTP service.
User (xxx.xxx.xxx.xxx:(none)): linux
331 Please specify the password.
Password:
230 Login successful.
ftp> put c:\test.txt
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 File receive OK.
ftp: 13 bytes sent in 0.00Seconds 13000.00Kbytes/sec.

Xcodeでフォーマット

個人的にソースコードは見やすく書きたいタイプの人間なのですが、Xcodeにはフォーマット機能がありません。

調べたところ、外部のコード整形プログラムUncrustifyを使用して、それをXcodeから呼び出す形で実現できるようなので、フォーマットできるようになるまでの備忘録として書いておきます。

Uncrustifyのインストール

githubにソースコードが上がっていたのでそれをダウンロード、configure、make、installします。

$ cd ~/Desktop/bengardner-uncrustify-20b21c2/
$ ./configure
$ make
$ sudo make install

成功すると /usr/local/bin/uncrustify にインストールされます。
また、ビルドしたuncrustifyディレクトリのtests/configには、サンプルで設定ファイルがあります。この中のobj-c.cfgという設定ファイルを使ってもいいのですが、今回参考にさせて頂いたサイトのdrikinさんが設定ファイルを公開されていたので、そちらをとりあえずそのまま使用させてい頂きました。

設定ファイルを/usr/local/share/uncrustify/にコピーします。

$ sudo cp ~/Desktop/obj-c_dk.cfg /usr/local/share/uncrustify/

Xcodeのスクリプトに登録する

Xcodeからユーザースクリプトを登録します。

入力を文書全体、出力を書類の内容を置き換える、ショートカットをShift+Ctrl+i、スクリプトを以下のものを登録しました。

#!/bin/sh

echo -n “%%%{PBXSelection}%%%”
/usr/local/bin/uncrustify -q -l oc+ -c /usr/local/share/uncrustify/obj-c_dk.cfg <&0 echo -n "%%%{PBXSelection}%%%" [/bash] これで、フォーマットできるようになりました。 ビルドする際に自動でフォーマットもできるようなので、その場合はCode beautifier and formatter with Xcodeを参考に。

設定ファイルについてはこちらが参考になります。

PHPで多次元配列をソートする

$data = array(
    [0] => array(
        "foo" => 10,
        "bar" => 5,
        "hoge" => 7
    ),
    [1] => array(
        "foo" => 8,
        "bar" => 6,
        "hoge" => 1
    ),
    [2] => array(
        "foo" => 10,
        "bar" => 5,
        "hoge" => 7
    )
);

foo列でソートする場合

foreach($data as $key => $row){
    $foo[$key] = $row["foo"];
}

array_multisort($foo,SORT_DESC,$data);

foo,bar,hogeでソートしたい場合

foreach($data as $key => $row){
    $foo[$key] = $row["foo"];
    $bar[$key] = $row["bar"];
    $hoge[$key] = $row["hoge"];
}

array_multisort($foo,SORT_DESC,$bar,SORT_DESC,$hoge,SORT_DESC,$data);

素晴らしすぎる!