強制的にポインタを指カーソルにする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);

素晴らしすぎる!

文字色と背景色のコントラスト

文字の色と、その背景色のコントラスト(色の差、明度差)が十分でないと、文字の視認性が低下してしまいます。

W3Cで公開されている計算式を利用すると適切なコントラストにする事が出来ます。

明朗度を求める計算式

結果が「125」以上となれば基準を満たす

((R×299)+(G×587)+(B×114))÷1000

色の差を求める計算式

結果が「500」以上となれば基準を満たす

(max(R1,R2)-min(R1,R2))+(max(G1,G2)-min(G1,G2))+(max(B1,B2)-min(B1,B2))

サンプル

明度差/色の差が共に不足
  • 文字色:#3366ff(51:102:255)
  • 背景色:#33cccc(51:204:204)
  • 明度差:54
  • 色の差:153
明度差/色の差が共に基準を満たしている
  • 文字色:#3333ff(51:51:255)
  • 背景色:#ffff00(255:255:0)
  • 明度差:152
  • 色の差:663
色の差が不足
  • 文字色:#ff0000(255:0:0)
  • 背景色:#ffff00(255:255:0)
  • 明度差:150
  • 色の差:255
明度差が不足
  • 文字色:#ffff00(255:255:0)
  • 背景色:#00ffff(0:255:255)
  • 明度差:47
  • 色の差:510

チェックサイト

http://www.kanzaki.com/docs/html/color-check

CSSの優先順位

CSSにはスタイルが適用される優先順位があります。
大きなサイトになればなるほど、スタイルが競合して適用されないといったケースが出てきますので注意が必要です。

CSSのスタイル適用順を決定する要素

CSSの提供元による優先順位
  1. Webページ制作者が作成したCSS[制作者スタイルシート]
  2. Webブラウザのユーザーが作成したCSS[ユーザースタイルシート]
  3. Webブラウザがデフォルトで適用するCSS[デフォルトスタイルシート]
個別性による優先順位
個別性の高いものが優先される
記述位置による優先順位
後から出てきたものが優先される
!importantルール
!important宣言の付いたスタイルが最優先される

  1. ユーザースタイルシート(!important宣言付き)
  2. 制作者スタイルシート(!important宣言付き)
  3. 制作者スタイルシート
  4. ユーザースタイルシート
  5. デフォルトスタイルシート

 

個別性による優先順位(個別性の計算ルール)

個別性は最大4ケタの正数値で表現され、より大きい値のスタイル程、個別性が高いと判断され優先される。計算方法は以下のようになる。

1,000の位(a)
(X)HTML文書内に、style属性がある場合は、1をカウント
100の位(b)
セレクタに含まれているid属性の数をカウント
10の位(c)
セレクタに含まれているid以外の属性と、疑似セレクタの数をカウント
1の位(d)
セレクタに含まれている要素、疑似要素の数をカウント

計算例

記述例 a b c d 個別性
* 0 0 0 0 0
li 0 0 0 1 1
li:first-line 0 0 0 2 2
ul li 0 0 0 2 2
ul ol+li 0 0 0 3 3
p[class=”memo”] 0 0 1 1 11
ul ol li.menu 0 0 1 3 13
li.menu.service 0 0 2 1 21
#example 0 1 0 0 100
div#example 0 1 0 1 101
style=”” 1 0 0 0 1000

最近、(X)HTMLやHTML5の勉強をしております。