Monthly Archives: 6月 2010

CakePHP1.3.2でSQLite3を使う(改訂版)

このエントリーをはてなブックマークに追加
はてなブックマーク - CakePHP1.3.2でSQLite3を使う(改訂版)
Share on Facebook

bakeできなかったので、下記を参考にやり直しました。

CakePHP SQLite – Stack Overflow

bake all するとWarningが続々出ますが、一応動きました。

  1. cakephp’s datasources at master – GitHub から「CakePHP Datasources Plugin v0.2」をダウンロードする
  2. 「cakePHPディレクトリ/app/plugins/datasources」内に解凍する
  3. プラグイン内の「models/datasources/dbo/dbo_sqlite3.php」を編集し、「class DboSqlite3 extends DboSource {」より前の行に「App::import(‘Datasource’,'DboSource’);」を追加する
<?php
/**
 * SQLite layer for DBO.
 *
 * PHP versions 4 and 5
 *
 * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
 * Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
 *
 * Licensed under The MIT License
 * Redistributions of files must retain the above copyright notice.
 *
 * @copyright     Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
 * @link          http://cakephp.org CakePHP(tm) Project
 * @package       datasources
 * @subpackage    datasources.models.datasources.dbo
 * @since         CakePHP Datasources v 0.1
 * @license       MIT License (http://www.opensource.org/licenses/mit-license.php)
 */

App::import('Datasource','DboSource');

/**
 * DBO implementation for the SQLite3 DBMS.
 *
 * A DboSource adapter for SQLite 3 using PDO
 *
 * @package datasources
 * @subpackage datasources.models.datasources.dbo
 */
class DboSqlite3 extends DboSource {
  1. 「/app/config/database.php」を以下のように設定する
    var $default = array(
        'driver' => 'Datasources.DboSqlite3',
        'database' => '/full/path/to/db/db.sqlite',
    );

これで何とかbakeできるようになる。ただし、何かにつけ「Warning: FIXME: Can’t parse field: in C:\xampp\htdocs\cake\sandbox\cake\libs\model\datasources\dbo_source.php on line 2510」みたいなエラーが出てくる。

とりあえずCakePHP1.3の公式チュートリアルをやってみたけど、一応普通に動きました。

CodeIgniterで使う.htaccessの設定

このエントリーをはてなブックマークに追加
はてなブックマーク - CodeIgniterで使う.htaccessの設定
Share on Facebook

RewriteEngine on
RewriteCond $1 !^(index\.php|css|user_guide|.+\.gif$|.+\.jpe?g$|.+\.png$|.+\.js$|.+\.css$)
RewriteRule ^(.*)$ /index.php/$1 [L]

例えば 「http://localhost/hige/moja」がトップディレクトリ(=index.phpの置いてある場所)の時、

RewriteEngine on
RewriteCond $1 !^(index\.php|css|user_guide|.+\.gif$|.+\.jpe?g$|.+\.png$|.+\.js$|.+\.css$)
RewriteRule ^(.*)$ /hige/moja/index.php/$1 [L]

サイト表示高速化メモ

このエントリーをはてなブックマークに追加
はてなブックマーク - サイト表示高速化メモ
Share on Facebook

表示速度確認ツール

FireBug

-基本のアドオン

YSlow

  • Yahooのやつ
  • FireBugと連携
  • 評価の低い項目 (E,F)を優先して修正する
  • 一定規模以上のサイトは「YSlow(V2)」、小規模サイトは「Small Site or Blog」などを選択
  • 「Use a Content Delivery Network(CDN)」はアメリカ以外だとFになるので無視してよい

PageSpeed

  • Googleのやつ

高速化の手段

HTTPリクエストを減らす

  • CSSスプライト

外部CSSロードには@importを使わない

外部CSSファイルはlink要素のみで読み込む。

  • IEはlink要素で読み込まれたCSSをダウンロード完了するまで、@importで指定したCSSファイルを読み込まない
  • IEもFirefoxも、link要素で読み込まれるCSSファイルのダウンロードが完了してからでないと、次のCSSファイルを読み込まない

CSSやJavaScriptのロード順

  • CSSはheadのlink要素で指定するとアクセス後の空白の時間(ホワイトページタイム)が減らせる
  • -ブラウザはCSSを読み込むまでレンダリングを待つため。
  • JavaScriptはbody要素内の最後で読み込むのがよい
    • 並列ダウンロードができず、応答の遅れによってそれ以降のコンテンツのダウンロードが停止されるので。

ファイルの圧縮

  • CSSやJSは「YUI Compressor」などのツールで圧縮可能
  • gzip圧縮転送を使うことでさらに圧縮できる
    • Apache2のmod_deflateモジュールを有効化することで使用可能

CSSや画像の最適化

  • CSSスタイルの適用対象は子孫セレクタで記述するより、シンプルなIDやクラスセレクタの方が処理速度が速い(特にIE6で顕著)
  • 画像は「Yahoo! Smush.it™」などのWebサービスでギリギリまで最適化できる
  • PNGを最適化するなら「BlastPNG」あたり
  • 画像サイズをHTMLで変更するとブラウザに負荷がかかり重くなるので、やらない方が良い
  • CSSスプライトを利用する際のGIF画像は、縦方向ではなく横方向に画像を配置したほうが圧縮率が高い。8bit PNGでは縦横ともに圧縮方式が変わらないのでどっちでもいい。

Selenium IDE + Pearl Crescent Page Saver で複数画面のキャプチャを自動化する

このエントリーをはてなブックマークに追加
はてなブックマーク - Selenium IDE + Pearl Crescent Page Saver で複数画面のキャプチャを自動化する
Share on Facebook

多くの画面があるサイトで、すべてのページを、スクロール領域すべてを含めてキャプチャしなければならない。

こんなこと手動でやっていては大変です。しかも画面修正が入って「もう一回全部撮り直せ」と言われたらもう死ぬしかないですね。

早まる前に、この記事のやり方で自動化してください。

必要なもの

手順

まず、Pearl Crescent Page Saver のショートカット設定をします。「Page Saverオプション」から、下記の通り設定します。

  • 「全般」タブ
    • 「キーボードショートカットかツールバーのボタンがクリックされた時:」 – ページ全体
    • 「キーボードショートカット:」 – Alt+w (好きなキーで構わないですが、下記はこの設定でやります)
  • 「画像のキャプチャー」タブ
    • 「ファイルの保存名:」 – %t %u
    • 「次のフォルダに保存する」 – 好きなフォルダ
    • 「同じ名前のファイルがあるときは上書きする」 – チェックする

次に、Selenium IDEのテストケースを作成します。Selenium IDEの基本的な使い方は 「ブラウザを選ばずWebテストを自動化するSelenium (2/3) – @IT」 が詳しいです。

コマンド 対象
open /index.php
windowFocus
altKeyDown
keyPress // \119
altKeyUp

これが1ページぶんのオープン~キャプチャの流れです。

ここまで設定したら、Selenium IDEの「現在のテストケースを実行」をクリックしてください。指定したURLが開き、先ほど指定したフォルダに画像が出力されていればOKです。

あとは上記の要領で、「open」コマンドの対象を撮影したいページのアドレスに変更しながらコピペを繰り返してください。

日本語を含むテストケースファイルが読み込めない場合

  • XHTMLのヘッダを「xml:lang=”en” lang=”en”」から「xml:lang=”ja” lang=”ja”」に直す
  • ファイル保存形式を「UTF-8 BOM無し」にする

TIPS

カテゴリ毎に多くのコンテンツがあるようなページを連続キャプチャする場合、カテゴリ毎にテストケースを作成し、それをテストスイートに読み込ませると管理が便利(だと思います)。

参考

Seleniumでキャプチャを取得する拡張コマンド:captureScreenshot – 現場のためのソフトウェア開発プロセス – たかのり日記

CodeIgniter1.7.2でSQLite3のカラム名を取得できるようにする

このエントリーをはてなブックマークに追加
はてなブックマーク - CodeIgniter1.7.2でSQLite3のカラム名を取得できるようにする
Share on Facebook

CodeIgniterのSQLite3に対する迫害と、引き続き奮闘しています。

CIでSQLite3を使えるようにする方法は 先日 紹介しました。

CIにはテーブルのカラム名を取得する「$this->db->list_fields()」というメソッドがありますが、上の方法で導入したPDOドライバでは使えません。どうやら list_fields() メソッドから呼び出されるローカル関数が定義されていないようです。

ちょっと改造すれば使えるようになったので、やり方を共有します。

手順

  1. /system/database/drivers/pdo/pdo_driver.php 内に、下記メソッドを追加する。(このメソッドはMySQLドライバ内の同一メソッドをSQLite用に修正したものです)
/**
 * Show column query
 *
 * Generates a platform-specific query string so that the column names can be fetched
 *
 * @access  public
 * @param   string  the table name
 * @return  string
 */
function _list_columns($table = '')
{
    return "PRAGMA table_info(" . $table . ");";
}
  1. /system/database/DB_driver.php 内の l.833-835 を下記のように書き換えます。
if (isset($row['COLUMN_NAME']))
{
    $retval[] = $row['COLUMN_NAME'];
}

 ↓

if (isset($row['COLUMN_NAME']) || isset($row['name']))
{
    $retval[] = isset($row['COLUMN_NAME']) ? $row['COLUMN_NAME'] : $row['name'];
}

これで、SQLite3でも 「$this->db->list_fields()」 を使ってカラム名が取得できるようになります。