greasemonkey for 4u

4u を眺めるとき、4u にもともとあるスライドショーを使うまでもないけど
マウススクロールじゃ物足りない(僕の場合、ThinkPadトラックボールだからなおさらめんどい)
そんな時用に、流し見する程度の簡単なスライドショー的な greasemonkey を作ったので
どこからでも使えるように自分用にアップしといた。

http://mgry.sakura.ne.jp/download/js/4uslide.user.js

ubuntu + php + symfony インストール編

いまさらだけど、PHPのFrameworkとしてsymfonyを触ってみる

インストール

今回は1.0系をいれてみる → 参考 symfony

  • /etc/apt/sources.list の更新
$ diff /etc/apt/sources.list /etc/apt/sources.list.orig
2d1
< deb http://www.symfony-project.org/get debian/
  • list の update
$ sudo apt-get update
  • install
$ sudo apt-get install php5-symfony

インストール終わり。案外すんなり入りました。

実行ファイルの確認

$ type symfony
symfony is /usr/bin/symfony


次は簡単なアプリの作成をやってみよう

リストから絞り込んで取得すると共にトータル件数を取得

例えば

table
+--------------+
|  id |  name  |
+-----+--------+   
|   1 |  name1 |
+-----+--------+
|   2 |  name2 |
+--------------+

こんなテーブルがあったとして、普通なら
1. リストを取得

SELECT id, name
FROM table
/* Oracle */ WHELE ROWNUM BETWEEN :START AND :END
/* MySql */ LIMIT :COUNT OFFSET :OFFSET

2. トータル件数取得

SELECT COUNT(id) AS total
FROM table

なんて感じですごく効率の悪いことをしていた。
けど、ちょっと調べてみたらもっと便利にリストとトータル件数を取得できるらしい。

Oracle の場合

OVER() を使う

SELECT id, name, COUNT(id) OVER() AS total
FROM table
WHERE ROWNUM BETWEEN :START AND :END

mysql の場合

リスト取得SQLの最初に SQL_CALC_FOUND_ROWS をいれる

SELECT SQL_CALC_FOUND_ROWS id, name
FROM table
LIMIT :COUNT OFFSET :OFFSET

その後すぐに FOUND_ROWS() を使って取得する

SELECT FOUND_ROWS() AS total

結論

mysql の場合、2回SQLを発行しないといけないのには変わりないけど、
それでも最初のよりは全然早いし楽ですね。

さくらでPDOを使ってMYSQLを使う

そもそも

さくらインターネットではPHP5.2が使えるようになったが、どういうわけかMYSQLのPDOドライバーが入ってないみたい。
別にPDO使わなくてもいいじゃんって思うけど、どんなDBでも同じように書けるのでいつも使っているです。
だから、さくらでもせっかくmyswlサーバまでかりれるんだからそれを使うためにPDOでやりたい。

やったこと

  1. PHP5.2 を自分でコンパイル
  2. .htaccess により、それを使うようにする
  3. --with-pdo-mysql でウマー

PHP5.2 インスコ

ソースを取ってくる
$ mkdir package
$ cd package
$ wget http://jp.php.net/get/php-5.2.5.tar.gz
$ tar -zxvf php-5.2.5.tar.gz
$ cd php-5.2.5
コンパイルする前の準備

さくらでデフォルトで入ってるPHPの configure

'./configure' '--prefix=/usr/local/php-5.2.5' '--enable-force-cgi-redirect' '--enable-mbstring' '--enable-mbregex' '--with-openssl=/usr' '--with-gd' '--with-zlib=/usr' '--with-jpeg-dir=/usr/local' '--with-png-dir=/usr/local' '--with-ttf' '--with-freetype-dir=/usr/local' '--with-mysql=/usr/local' '--enable-soap' '--with-curl' '--with-xsl=/usr/local' '--with-gettext=/usr/local' '--enable-exif' 

まぁ。PDO入ってないですよね。
そこで。
以下のファイルを準備。(ファイルじゃなくて直接実行してもいいけどあとで修正したいかもしれないから忘れないように。)

#!/bin/sh
./configure \
--prefix=$HOME/php \
--program-suffix=5 \
--with-config-file-path=$HOME/www/cgi-bin \
--with-pear=$HOME/php/pear \
--enable-force-cgi-redirect \
--enable-mbstring=all \
--enable-mbregex \
--with-openssl=/usr \
--with-gd \
--with-zlib=/usr \
--with-jpeg-dir=/usr/local \
--with-png-dir=/usr/local \
--with-ttf \
--with-freetype-dir=/usr/local \
--with-mysql=/usr/local \
--enable-soap \
--with-curl \
--with-xsl=/usr/local \
--with-gettext=/usr/local \
--enable-exif \
--with-pdo-mysql \
--enable-pdo \
--enable-sqlite-utf8 \
PHPコンパイル

さっきつくったファイルを実行してから、

$ make test
$ make
$ make instal

これで

$ ls $HOME/php/bin/
pear*           pecl*           php-config5*    phpize5*
peardev*        php-cgi5*       php5*

ができる。

最後に

1. .htaccess

$ cd $HOME/www
$ vim .htaccess
Action php5-script /cgi-bin/php5.cgi
AddHandler php5-script .php

2. cgi-bin

$ cd $HOME/www
$ mkdir cgi-bin
$ ln $HOME/php/bin/php-cgi5 $HOME/www/cgi-bin/php5.cgi

確認

これでphpinfo()とか実行してみたら、

PDO drivers  sqlite2, sqlite, mysql  

うまー

あるカラムの前後を取得するのが重いんです

環境

  • Oracle10g

普通はこんなやりかた

select prev,next from (
    select id,
        lag( id ) over( order by id ) as prev,
        lead( id ) over ( order by id ) as next
    from hoge
)  where id = :ID;

でもこれだとすげー遅い。

なので、もっと効率よくとれないかと思って色々やってみた。

そもそも lag,lead を使うのをやめる

select h.id, h.name from hoge h,
    ( select max( id ) as id from hoge where id < :ID order by id ) prev,
    ( select min( id ) as id from hoge where id > :ID order by id ) next
where h.id in ( prev.id, :ID , next.ID ) and rownum <= 3;

lag,lead とちがって max,minならフルアクセスしないで1レコードしか取ってこないから激早
ついでにいうと、 in の中の要素数を rownum <= で指定してやるとさらに効果大

よかった、一安心。

ちなみに、mysql なら・・・

select id as prev from hoge where id < :ID order by id asc limit 1;
select id as next from hoge where id > :ID order by id desc limit 1;

これだけでいいのに。。

coLinux/Ubuntu のインストール

参考にしたのはcoLinux/Ubuntu 7.04インストールです

このサイトと違うところは、インストーラ作業続き のところの

DHCPでのアドレス取得を試みるが失敗する

失敗しなかった。

まぁいいか。

さっそく使ってみる

コマンドプロンプトからcoLinuxを起動。
ssh で使えるようにするため必要最低限のものだけいれてみた

# sudo apt-get update
# sudo apt-get install ssh

おお!すごい!

sshしてみる

coLinuxを起動した状態で、putty起動。
IPアドレスを指定して実行してみる。

・・・

入れた!

環境整備

とりあえず必要最低限のパッケージをいれてみた

rnamiki@ubunthu ~$ sudo apt-get install vim zsh screen


とりあえず今日はここまで。
お疲れ様でした。