2009年4月28日火曜日

 

【symfony】携帯向けサイトの開発(※追記:2009/06/19)

sfMobileJPlugin - symfony/trac/plugins

この"sfMobileJPlugin"は日本国内の3キャリア(DoCoMo/SoftBank/EZWeb)向けコンテンツをsymfony1.2xで作る際に便利なクラス郡になります。

主な機能は以下の通りです。

  • Net_UserAgent_Mobile をsymfony上から使用できるようになります
  • URLを生成(link_to helper等)する場合、DoCoMo端末に対しては自動でUID取得のためのパラメータを付与します(imodeID or uid)
  • テンプレートを切り分けることが可能になります。(モバイル共通、各キャリア毎に1テンプレート等)
symfonyによる携帯向けサイト開発 - symfony:株式会社センティリオンシステム

どちらも「PEAR::Net_UserAgent_Mobile」が必要。

※追記:2009/06/19

sfJpMobilePlugin - GitHub

携帯サイトの作成支援のsymfony用プラグイン。

== 実装機能
* UserAgentによるキャリア判別
* 端末IDの取得
* 契約者番号の取得
* セッションへの対応
* 絵文字の相互変換
* テンプレートの自動振り分け
アシアルの中の人が技術と思いのたけをつづるブログ symfonyの携帯開発プラグイン作成 - アシアルブログ
「sfMobileViewPlugin」

携帯キャリアごとに実行するタグ([[i,e,s]][[/i,e,s]])を作成し、1つのViewファイルテンプレートで携帯ごとに分けて表示させるViewプラグイン。
「PEAR::Net_UserAgent_Mobile」必要。

モバイルサイトで携帯キャリアのUserAgentに合わせてContentTypeを切り替えるsymfonyライブラリ sfMobileTool - Knowledge Database IT

ファイル1つだけで利用可能。

symfonyで携帯サイトを作る件 - 続・ken39arg

「templates/」以下に「m/」というモバイル用ディレクトリを作り各キャリア用テンプレートを置く。
「view.yml」もキャリア毎に分ける。絵文字も対応。

SymfonyでIP制限するフィルター作りました - KAYAC engineers' blog
携帯サイトのキャリア判別は、おなじみのNet_UserAgent_Mobileを使うと簡単ですが、ユーザーエージェントだけでは簡単に偽装できてしまうので

ラベル:


2009年4月27日月曜日

 

【symfony】別々のテーブルのFormクラスを組み合わせたフォームとアクション - embedForm(), mergeForm()

symfony1.2 embedFormでファイルアップロード - GANCHIKU.com

リンク先では、日記のテーブルと画像のテーブルに、それぞれのFormクラスを使って一つのフォームから投稿できるようにしている。

ラベル:


2009年4月22日水曜日

 

【JavaScript】数値の桁を"0"で埋めて揃える

関数

足りない桁数を 0 で埋めた数値文字列を得る - AOK's JavaScript Library

function formatNum(keta, num) {
  var src = new String(num);
  var cnt = keta - src.length;
  if (cnt <= 0) return src;
  while (cnt-- > 0) src = "0" + src; return src;
}

プロトタイプ~その1

先頭を0で埋めて桁をそろえる(解説付き) - 素人がプログラミングを勉強するブログ

Number.prototype.fillZero=function(n){
  var zero=new Array(n).join('0');//0をn-1文字分つなげた文字列を作る。n==4だと'000'
  var str=zero+this;//zeroとthisをくっつけた文字列を作る。
  var result=str.substr(-n);//strの後ろから、n文字分の文字列を取ってくる。
  return result;
}

n」より大きい桁の数値が切り捨てられるので注意。

プロトタイプ~その2

"先頭を0で埋めて桁をそろえる" を考えてみた - Higé au lait

n」に足りない数値の桁数分の"0"を先頭に結合。(数値を配列として「unshift()」)

Number.prototype.fillZero = function(n) {
  var r = this.toString().split('');
  while(r.length <= n) {
    r.unshift('0');
  }
  return r.join('');
}

n」から数値の桁数の足りない分の"0"を配列にして、「join()」で文字列にして数値と結合。

Number.prototype.fillZero = function(n) {
  return Array((n+1) - this.toString().split('').length).join('0') + this;
}

小数や負の数では、そのまま返す条件。

if(this < 0 || (this - Math.floor(this) != 0)) return this;

ラベル:


2009年4月14日火曜日

 

【symfony】ユーザ認証プラグインsfGuardAuthのカスタマイズ

リンク先に有りますが、「modules/sfGuardAuth/」ディレクトリを作り「templates/」ディレクトリ内に「signinSuccess.php」「secureSuccess.php」を作るとこちらが呼ばれます。actionはデフォルトのものが呼ばれるので作らなくても問題ありません。

/* テンプレートのカスタマイズ */
modules/
∟sfGuardAuth/
   ∟templates/
      ∟signinSuccess.php
      ∟secureSuccess.php 
※「action/」はなくても良い

アクションのカスタマイズをする場合、sfGuardPluginのアクションを継承します。
アクション・クラスのファイルを作ると「template/」ディレクトリのテンプレートが読み込まれます。ファイルがない場合はログインフォームは表示されません。

/* アクションのカスタマイズ */

<?php
  require_once(sfConfig::get('sf_plugins_dir').'/sfGuardPlugin/modules/sfGuardAuth/lib/BasesfGuardAuthActions.class.php'); 
  class sfGuardAuthActions extends BasesfGuardAuthActions   {

    public function executeSignin(sfWebRequest $request)
    {
      parent::executeSignin($request);
    }
    public function executeSignout(sfWebRequest $request)
    {
      parent::executeSignout($request);
    }
    public function executeSecure()
    {
      parent::executeSecure();
    }
    public function executePassword()
    {
      parent::executePassword();
    }
  }

親クラスのある「sfGuardPlugin/modules/sfGuardAuth/lib/BasesfGuardAuthActions.class.php」には「executeSignin()」「executeSignout()」「executeSecure()」「executePassword()」が定義されてます。「BasesfGuardAuthActions」クラスは「sfActions」クラスを継承してます。
ログイン認証の為に「$request」を渡します。
ログイン前後の処理を追加したりして、後は親クラスのメソッドに任せます。これでテンプレートファイルはデフォルトが読み込まれます。アクションも全て記述しなくて済みます。

関連

ユーザ認証プラグイン sfGuardPlugin - さぼてん:2009年4月8日
sfGuard plugin - symfony-doc-ja
既存のテーブルを利用する認証システムplugin - symfonyはじめました

ラベル:


2009年4月8日水曜日

 

【symfony】ユーザ認証プラグイン sfGuardPlugin

参照

Jobeet - 13日目: ユーザ - Absolute Playing!

symfonyに備えてあるアクセス制限の設定。

以下の設定で全てのアクセスをブロック。デフォルトでは「off」になっている。

/* apps/myapp/config/security.yml */
default:
  is_secure: on

credentials」を設定してユーザごとの権限も分けることが出来る。

default:
  is_secure:   off
  credentials: admin

モジュールやアクションごとにアクセス制限を設定するには各モジュールに「config/」ディレクトリを作り「security.yml」を作成する。

/* apps/myapp/modules/mymodule/config/security.yml */
index:
  is_secure: off
 
all:
  is_secure: on

アクセス制限書けた場合の設定や認証についての設定を「setting.yml」でします。「all:」の部分を変更。

/* apps/myapp/config/setting.yml */
all:
  .settings:
    # Form security secret (CSRF protection)
    csrf_secret:       UniqueSecret   
    # Output escaping settings
    escaping_strategy:      true           
    escaping_method:        ESC_SPECIALCHARS # Function or helper used for escaping. Accepted values: ESC_RAW, ESC_ENTITIES, ESC_JS, ESC_JS_NO_ENTITIES, and ESC_SPECIALCHARS.

    enabled_modules: [default, sfGuardAuth]

  .actions:
    login_module:    sfGuardAuth
    login_action:    signin
    secure_module:          default   # To be called when a user doesn't have
    secure_action:          secure    # The credentials required for an action

これはsfGuardPluginを使って認証する為の設定です。

symfonyでユーザ認証の処理をやってくれるプラグインが有ります。sfGuardPluginというもので、以下のようにsymfonyコマンドからインストールします。

インストール

/* インストールコマンド */
$ symfony plugin:install 

以下のコマンドでは自分の環境(さくら・スタンダード)はエラー。「You try to install a symfony 1.0 plugin~」とか。

$ symfony plugin-install http://plugins.symfony-project.com/sfGuardPlugin

モデルを再構築。DBが初期化されるので注意。

$ php symfony propel:build-all-load --no-confirmation

モデルを再生成したのでキャッシュをクリア。

$ php symfony cc

アカウント作成コマンド

ユーザアカウント作成を作成します。

/* アカウント作成 */
$ php symfony guard:create-user admin password
$ php symfony guard:promote admin

この上記コマンドでユーザを管理者として登録する模様。

原文)Promotes a user as a super administrator
訳文)最高の管理者としてユーザを昇進させます。

プラグインに関するオプションを見るコマンド。

/* オプション一覧コマンド */
$ php symfony list guard

認証にプラグインを使うように変更。元の継承は「sfBasicSecurityUser 」。

/* apps/myapp/lib/myUser.class.php */
sfGuardSecurityUser
  {
  }

ここまでがsfGuardPluginを使うための工程。

ログイン・ログアウトや認証時間などリンク先参照。

sfGuard plugin - symfony-doc-ja

sfGuardPlugin使った認証はテーブル作ってするようだ。

既存のテーブルを利用する認証システムplugin - symfonyはじめました

ラベル:


2009年4月3日金曜日

 

【EC-CUBE】商品表示のSQLクエリを改善する

使えるねっとの共有サーバでEC-CUBEを開設して幾日も経っていないのにサーバ負荷が酷いとお叱りを受け、専サバに移りゃとお達しがありました。
実際、商品の検索等の表示には数秒かかるにしてもそんなにアクセスがある訳でもありません。
「ああ、そういえば昨日商品の規格を編集してたらタイムアウトしまくったが、それか」と考えつつ一大事なので調べました。

EC-CUBEのDBはテーブルのリレーションが複雑で、データの取得時にサブクエリをたくさん発行するので処理が重くなるという印象が得られました。
改良されたSQLがありましたので、適応してみますとフォーラムに有ります通り、体感で判る程度の改善が見られました。
以下のファイルのメソッドを変更します。

 ファイル:data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php
 - クラス:SC_DB_DBFactory_MYSQL
 - メソッド:viewToSubQuery()
    function viewToSubQuery() {
     ~(略)~

"vw_products_allclass" => '
( SELECT
T1.product_id,
product_code_min,
product_code_max,
price01_min,
price01_max,
price02_min,
price02_max,
stock_min,
stock_max,
stock_unlimited_min,
stock_unlimited_max,
T1.del_flg,
status,
name,
comment1,
comment2,
comment3,
main_list_comment,
main_image,
main_list_image,
product_flag,
deliv_date_id,
sale_limit,
point_rate,
sale_unlimited,
T1.create_date,
deliv_fee,
T1.rank,
T4.category_rank,
T4.category_id
FROM
(
SELECT *
FROM
(
SELECT
product_id,
MIN(product_code) AS product_code_min,
MAX(product_code) AS product_code_max,
MIN(price01) AS price01_min,
MAX(price01) AS price01_max,
MIN(price02) AS price02_min,
MAX(price02) AS price02_max,
MIN(stock) AS stock_min,
MAX(stock) AS stock_max,
MIN(stock_unlimited) AS stock_unlimited_min,
MAX(stock_unlimited) AS stock_unlimited_max
FROM dtb_products_class
GROUP BY product_id
) AS T0
LEFT JOIN dtb_products USING (product_id)
) AS T1
INNER JOIN
(
SELECT
T2.product_id,
MAX(T2.category_id) AS category_id,
MAX(T3.rank) AS category_rank
FROM dtb_product_categories T2
INNER JOIN dtb_category T3 USING (category_id)
GROUP BY product_id
) AS T4
USING (product_id)
)',
~(略)~
   }

根本的な話としてMySQLを使わないというのが一番良いようで、PostgressSQLに移行しただけでも数千倍の改善が見られ、20~30秒ほど要していたのが一瞬で検索結果が表示されるとのことです。
それにしても、こういったことであからさまに問題が生じているのは商品件数が1000件を優に超えている状態の様ですが、当方のサイトでは数百件レベルです。リレーションの事があるとなると商品規格が多いからでしょうか。
そもそも共有サーバで運用することが無茶なのでしょうか。

追記:2010/03/25
MySQL の遅さをサブクエリの改善とコードの一部改良で手間暇かけずに解決する - EC-CUBE開発Wiki

こちらのクエリは微妙に違う。

関連

MySQLのVIEWで商品管理の規格表示を改善する - さぼてん[2010/03/25]

参考

EC-CUBE 開発コミュニティサイト - フォーラム 商品一覧の表示が遅い
EC CUBEの使用推奨環境に関してのご相談
 ∟もっとパフォーマンスのよいEC-CUBE

ラベル:


This page is powered by Blogger. Isn't yours?

登録 投稿 [Atom]

Google