@blog.justoneplanet.info

日々勉強

textareaでmaxlengthを使えるようにする

以下のようにする。

var textarea = $('textarea[maxlength]');
textarea.bind(
    "keydown keyup click",
    function(){
        var max = $(this).attr('maxlength');
        if($(this).val().length > max){
            $(this).val($(this).val().substr(0, max));
        }
    }
);

面倒なのでjQueryを使用してます。ちなみにHTML5ではネイティブで使えるので以上のコードは必要ない。

SQLの性能をテストする

以下のようにEXPLAINしてみるとイイ。

EXPLAIN SELECT *
    FROM  `parent`
    LEFT JOIN  `child`
    ON  `parent`.id =  `child`.id_parent
    WHERE  `parent`.id = 1

どうやらchildテーブルを全て検索してるようだ。

table type possible_keys key ref rows
parent const PRIMARY PRIMARY const 1
child ALL NULL NULL NULL 311

■改善

以下を実行してインデックスを付加し、クエリの性能を向上させる。

ALTER TABLE `child`
    ADD CONSTRAINT `fk_child_tbl_parent_tbl`
    FOREIGN KEY (`id_parent`) REFERENCES `parent` (`id`)
    ON DELETE CASCADE
    ON UPDATE NO ACTION;

劇的だ!ヾ(@⌒▽⌒@)ノchildテーブルを1行しか検索しなくなった。

table type possible_keys key ref rows
parent const PRIMARY PRIMARY const 1
child ref fk_child_tbl_parent_tbl fk_child_tbl_parent_tbl const 1

参考

type
結合型。
const。テーブルに、一致するレコードが最大で 1 つ。
ref。前のテーブルのレコードの組み合わせのそれぞれに対して、インデックス値にマッチするすべてのレコードがこのテーブルから読み取られる。ref は、『インデックスの左端の先頭部分のみが結合で使用される場合』、『インデックスが UNIQUE や PRIMARY KEY ではない場合』に使用される。
ALL。前のテーブルのレコードの組み合わせのそれぞれに対して、フルテーブルスキャンが実行される。
possible_keys
テーブル内のレコードの検索に MySQL で使用可能なインデックスを示す。
key
MySQL が実際に使用を決定したキー(インデックス)を示す。
ref
テーブルからレコードを選択する際に key とともに使用されるカラムまたは定数。
rows
クエリの実行に際して調べる必要があると MySQL によって判定されたレコードの数を示す。少ない方がイイ。

Google font api(directory)を使ってみる

ヘッダに以下を追加する。

<link href='http://fonts.googleapis.com/css?family=Lobster' rel='stylesheet' type='text/css'>

cssに以下を追加する。

p {
    font-family: 'Lobster', arial, serif;
}

そうすると以下のように表示される。

Hello, world.

■探究

http://fonts.googleapis.com/css?family=Lobsterをブラウザ別で比較する。

Google Chrome

どうやらスクリーンに絞ってるらしい。

@media screen {
@font-face {
  font-family: 'Cantarell';
  font-style: normal;
  font-weight: normal;
  src: local('Cantarell'), url('http://themes.googleusercontent.com/font?kit=tGao7ZPoloMxQHxq-2oxNA') format('truetype');
}
}

いわゆるCSS3のWeb Fontsだ。

Firefox

@mediaが無い以外は大体chromeと同じだ。

@font-face {
  font-family: 'Cantarell';
  font-style: normal;
  font-weight: normal;
  src: local('Cantarell'), url('http://themes.googleusercontent.com/font?kit=tGao7ZPoloMxQHxq-2oxNA') format('truetype');
}

CSS3のWeb Fontsだ。

IE6~8(かわいそうなブラウザ)

なんか読み込んでるファイルが違う。

@font-face {
  font-family: 'Cantarell';
  src: url('http://themes.googleusercontent.com/font?kit=tGao7ZPoloMxQHxq-2oxNA');
}

http://ascii.jp/elem/000/000/465/465458/index-2.html

IEでWebフォントを使うには、一般的なTTF/OTF形式ではなく、独自のEOT(Embedded Open Type)形式のフォントを用意する必要がある。

複数テーブル同時削除

以下のようにdelete文を使用すると、複数テーブルからレコードが削除できる。

DELETE
    `table`,
    `child`,
    `grandchild`
FROM
    `table`
LEFT JOIN
    `child`
ON
    `table`.id = `child`.`id_table`
LEFT JOIN
    `grandchild`
ON
    `child`.id = `grandchild`.`id_child`
WHERE
    `table`.id = 1

但し、外部キー制約でON DELETE CASCADEを使った方が早い気がする。

外部キー制約

以下のようにする。

ALTER TABLE `child`
    ADD CONSTRAINT `fk_child_table_parent_table`
    FOREIGN KEY (`id_parent`) REFERENCES `parent` (`id`)
    ON DELETE CASCADE
    ON UPDATE NO ACTION;

こうするとparentテーブルからレコードAを削除した時に、レコードAのidとchildテーブルのid_parentが等しいレコードが同時に削除される。

ちなみにid_contentsは全く同じ型でないとALTER TABLEが失敗する。

Amazon EC2にPostfixをインストールする

■インストール

以下のコマンドでPostfixをインストールする。

sudo yum install postfix

■設定

以下のコマンドで設定ファイルを編集する。

sudo vi /etc/postfix/main.cf

設定ファイルの内容についてはさくらVPSの記事を参照する。

■認証デーモン

以下のコマンドで認証デーモンを起動する。

sudo /etc/rc.d/init.d/saslauthd start
sudo chkconfig saslauthd on

■メールボックス

以下のコマンドでメールボックスを準備する。

sudo mkdir -p /etc/skel/Maildir/{new,cur,tmp}
sudo chmod -R 700 /etc/skel/Maildir/

■sendmail

EC2のAmazon Linuxではsendmailがデフォルトで起動しているようなのでストップする。

sudo /etc/rc.d/init.d/sendmail stop
sudo chkconfig sendmail off

■起動

以下のコマンドでPostfixを起動する。

sudo /etc/rc.d/init.d/postfix start
sudo chkconfig postfix on

makeをつかってみる

■GCC

makeの前にGCCでビルドする方法を試す。

ソースファイル

main.c
main(){
  hello();
}
hello.c
#include <stdio.h>
hello(){
  printf("Hello, World\n");
}

#include <stdio.h>が欠けていると以下のエラーが発生する。

incompatible implicit declaration of built-in function

ビルド

以下のコマンドでビルドする。

gcc -c main.c
gcc -c hello.c
gcc main.o hello.o -o hello

実行

以下のコマンドで実行してみる。

./hello
# Hello, World

■make

makeの前に前述でできたファイルを削除しておく。

rm hello main.o hello.o

煩雑なのでmakeを使う方法にする。まずはMakefileを生成する。

vi Makefile

以下のように記述する。

all: hello
hello: main.o hello.o

以下のようにしてmakeする。ターゲット名を省略した場合は最初のターゲットが実行される。慣習的にallを使用する。

make

同様に以下のコマンドで実行できる。

./hello
// Hello, World

make clean

cleanとはターゲットのことであり以下のようにして動作を定義できる。

clean:
	rm -f *.o hello

以下のコマンドで確認する。

make clean

ファイルが消えていることが確認できる。

コンパイラ

Makefileの先頭部分で以下のように記述することによってコンパイラを変更することができる。

GCC
CC = gcc
インテルコンパイラ
CC = icc

MacのXAMPP環境でCakePHPのbakeを使う

パスを通してもいいんだけど個人的に以下のようにアプリのルートディレクトリから叩く。

./cake/console/cake bake

以下のようなエラーが発生する。

No such file or directory (trying to connect via unix:///tmp/mysql.sock)

ソケットが見つからないとのことなので、以下のコマンドでシンボリックリンクを生成して対応する。

ln -s /Applications/XAMPP/xamppfiles/var/mysql/mysql.sock /tmp/mysql.sock

関連

cd /var 
mkdir mysql
cd mysql
ln -s /tmp/mysql.sock mysql.sock

おまけ

本題とかなり違うけど、ちょっとbakeのメモ(●´ω`●)

スキーマの生成
./cake/console/cake schema generate
ACLの生成
./cake/console/cake schema create DbAcl