2009/09/10

MAMP Mysql 起動しない

Macに手軽にMySQL, Apache, PHPを導入できる MAMP。インストールはとても簡単なのですが、MySQLをうまく起動できないトラブルの修正メモ。結論としては、すでにパッケージでインストールしていたMySQLのmy.cnfが悪さをしていたのが原因。

症状としては、インストール後に、MAMPのコントロールパネルからサーバを起動しようとしても、Apacheは起動するけれど、MySQLは起動しないという状態。まずはエラーログを確認する。

more /Applications/MAMP/logs/mysql_error_log
[ERROR] /Applications/MAMP/Library/libexec/mysqld: unknown option '-skip-federated'

このエラーメッセージをググると以下の記事があった。

Installing Magento Commerce and MAMP on Leopard 10.5.6 - Russ Back

別途パッケージでインストールしていた古いMySQLのmy.cnfの設定ファイルが問題ということ。/etc/my.cnf の以下の設定をコメントアウト。

Disable Federated by default
skip-federated

ちなみに、過去にインストールしたMySQLが、Mac起動時に自動で起動される場合は、
/Library/StartupItems/MySQLCOM にあるMYSQL起動スクリプトを実行しないように、
/etc/hostconfig を設定してあげればよい。

sudo emacs /etc/hostconfig
hostconfig内の
MYSQLCOM=-YES-
という記述を以下に変更
MYSQLCOM=-NO-
以上で、MAMPからMySQLも起動できるようになった。あと、
/Applications/MAMP/tmp/mysql/mysql.pid が関係するケースもあるそうです。


2009/08/31

GOOGLEのCanonical URL

動的URLだと、ひとつの商品に付き複数のURLが発生します。
googleなどの検索エンジンのリスティングではNGらしいので
こういった場合の対策として
<link rel="canonical" href="登録したいURL" />

ってのを挟めば良いそうです。

なのでoscommerceに組み込んでみます。

../catalog/includes/function/general.phpの最後の行に

//Canonical URL対策はじまり
function CanonicalUrl() {
$domain = substr((($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER), 0, -1); // gets the base URL minus the trailing slash
$string = $_SERVER['REQUEST_URI']; // gets the url
$search = '\&osCsid.*|\?osCsid.*'; // searches for the session id in the url
$replace = ''; // replaces with nothing i.e. deletes
echo $domain . ereg_replace( $search, $replace, $string ); // merges the variables and echoing them
}
//Canonical URL対策おしまい
ってなくだりを入れて

動的URLになるページのヘッダーに(index.php,default.php,product_info.php)
これを挟み込む。
<link rel="canonical" href="<?php CanonicalUrl(); ?>" />

2009/08/24

Oscommerce引っ越し - Unable to determine the page link、Oscommerce

Error! Unable to determine the page link! が表示される

対策:管理画面の『サーチエンジン対策のURLを使用(開発中)』をoffにするか

../catalog/includes/apprication_top.phpの以下の件を変更。
だいたい185行目付近
$PHP_SELF = str_replace(getenv('PATH_INFO'), '', $PHP_SELF);
バージョンが違えば
$PHP_SELF = str_replace(getenv('PATH_INFO'), '', $HTTP_SERVER_VARS['PHP_SELF']);
これを
こう変更する。
$PHP_SELF = str_replace(getenv('PATH_INFO'), '', $_SERVER['SCRIPT_FILENAME']);

2009/08/20

Got error 28 from table handler

Got error 28 from table handler

見慣れないエラーが出ている。
ここ数日はサーバーのファイルに触れていないので
データベースがどうにかなったのかな?

とりあえずテーブルの最適化をして様子をみます。

2009/06/09

AjaXplorerを使ってみる

webを管理する時に面倒なのがファイル管理。
アップロードとダウンロード、そしてユーザIDとパスワード。
ftpツールを使えば良いが、それすら面倒。

それならファイル管理プログラムを探そうってことで
PHP4も5にも対応でAjaxな美しいインターフェイス。

AjaXplorer

ダウンロードソースはこちら=>

オンラインストレージサービスのような感じのものを自前のサーバで構築するためのWebアプリケーションといったところでしょうか。

1.AjaXplorer のアーカイブをダウンロードして展開。
2./var/www/html/axとしてコピー。
3.chownでaxのフォルダの所有者を(サブフォルダも含めて)apacheに。
とりあえず、上記3点を行えば使えるようになります。

外部サーバと組み合わせて使用したりする場合、server/conf/conf.phpファイルを編集する必要がありそうですが、単体で使用する場合はデフォルトのままでもOKのようです。

なお、.htaccessでアクセス制限を行っているため、Apacheの設定でAllowOverride noneなんてしていると、予期せぬファイルが閲覧されたりするので注意が必要。

ちなみに、日本語化に関して。
フォルダ構成は変更されていますが、

http://www.chrysaor.org/wiki/index.php?Ajaxplorer

にまとめられている内容+αで対応できました。

1.client/i18n フォルダ内にja.phpを作成。なお、ファイルのエンコードをutf8で作成しておくと、server/classes /class.ConfService.php ファイルの編集が不要になります(mb_convert_variablesの処理が不要になる)。

2.server/conf/conf.php の $available_languages に、"ja"=>"Japanese" を追加。これで、設定画面で「Japanese」を選択できるようになります。

3.client/html/fancy_tpl.html、client/html/admin.html の2つのhtmlファイルのcharset=iso-8859-1charset=utf-8に。

4.以下のファイルから、utf8_decode,utf8_encodeを除去する。
 ・content.php
 ・index.php
 ・server/classes/class.AJXP_XMLWriter.php
 ・server/classes/class.HTMLWriter.php
 ・server/classes/class.UserSelection.php
 ・server/classes/class.AJXP_ClientDriver.php
 ・server/classes/class.AbstractDriver.php
 ・plugins/ajxp.fs/class.fsDriver.php

なお、AJXP_ClientDriver.phpにおいては、$mess = array_map("utf8_encode", $mess);という部分の除去(コメント化)も必要となるので注意。

ちなみに、アップロード可能なファイルサイズは、/etc/php.ini内のupload_max_filesizeおよびpost_max_sizeの値に準拠します(デフォルトでは2MB)。

2009/05/11

半透明CSS

CSS設定でオブジェクトを半透明にできるプロパティがあります。
IEのみのCSSプロパティでしたが、Firefox・Operaでも同じように表示可能にできる方法を説明したサイトがありましたので紹介しておきます。
他にもいくつかのOpacityプロパティを使ったTipsが紹介されていますので、参考に覗いてみてください。

http://www.mandarindesign.com/opacity.html

CSS Opacity設定

以下のコードでIE・Firefox・Opera・Netscape・Safariで同等表示がえられます。

  filter: alpha(opacity=25);
-moz-opacity:0.25;
opacity
:0.25;
IE
alpha(opacity=透明度);
100が100%となる。25%の場合は、25
Firefox・Netscape
-moz-opacity:.透明度;
1.0が100%となる。25%の場合は、.25
Opera・Safari
opacity:透明度;
1.0が100%となる。25%の場合は、.25

CSS3.0からは、opacity:透明度;の設定ですべてのブラウザで表示可能となるようです。

半透明のグラデーションをかける-タグインデックス
http://www.tagindex.com/stylesheet/filter/alpha.html

2009/02/07

phpのデバッグ

echoとprint
これは基本。
echo や print は関数ではなく構文なのでカッコが不要です。

echo $something."";
print $something."";

などと省略して書けます。

echo と print は(ほぼ)同じものですが、
echo の方が文字数が少ないのでオススメです。

print_r

引数の型に関係なく変数の中身を表示できます。
配列や連想配列、オブジェクトなどもOK!

print_rは、PHPのバージョン4.3.0以降、第二引数が追加されました。

//$somethingのprint_r表示を$outputに入れる
$output = print_r($something,true);

とするとprint_rの出力結果を変数に入れることができます。
(便利です!)

print_rはブラウザで表示させるときは見づらいので、

echo "改行";
print_r($something);
echo "改行"

などとしてあげるとブラウザで改行がそのまま表示されます。
これも関数にしておくと便利かもしれません。

/*
preタグで囲んだprint_r出力
@param mixed $var 出力したい変数
@return void
*/

function pre_print_r($var){
echo "改行";
print_r($var);
echo "改行";
}
スタイルシートなどで見やすくすると良いと思います。
var_dump
print_rの詳細版です。構造と値だけではなく、型やサイズもあわせて表示します。
オブジェクトの場合、クラス名までわかるので便利です。
厳密にチェックしたい時などに。

例えば
$profile = array(
"company" => "FACTORY",
"name" => "ジェイさん",
"birth_month" => 3,
"birth_day" => 1,
"hobby" => array("dance","プログラム","音楽")
);
var_dump($profile);

とすると

array(5) {
["company"]=>string(7) "FACTORY"
["name"]=>string(10) "ジェイさん"
["birth_month"]=>int(3)
["birth_day"]=>int(1)
["hobby"]=>array(3) {
[0]=>string(5) "dance"
[1]=>string(10) "プログラム"
[2]=>string(4) "音楽"
 }
}

と出力されます。

DBに接続して検索表示の基本

require( )とinclude( )との違い。
include("http://www.yahoo.co.jp/index.html");
require("http://www.yahoo.co.jp/index.html");

・違いは?
☆ include - 読み込めなくてもスルー
☆ require - 読み込めないと中止

require( )が処理中に1回だけ読み込まれるので、
ループの中で読み込むファイル名を変える時などは
include( )で処理します。

require( )やinclude( )はローカルにあるファイルだけでなく、
リモートにあるファイルもURLを使って読み込む事が出来ます。


require_once'DB.php';
$username = "dbuser";//DBユーザー名
$password = "dbpass";//パスワード
$host = "dbhost";//DBのホストlocalhost
$database = "dbname";//利用するDB名
$db = DB::connect("mysql://$username:$password@$host/$database");//接続
//できなかった場合
if (DB::isError( $db )) {
die($db->getMessage());
}
//DBにリクエストを要求する
$sql = "select * from table";
$result = $db->query($sql);

if (DB::isError( $result )) {
die($result->getMessage());
}

while($row = $result->fetchRow()){
echo $row[0]; // 返却データをループ
}
?>

2009/01/18

Ajaxzip2

べんりなajaxzip2。
郵便番号を入力すると、該当する都道府県名・住所が自動的に入力されます。
AjaxとJSONフォーマットを利用するJavaScriptライブラリとして公開されているものを利用。
JavaScript のみで稼動するため、サーバサイドで稼動するCGIプログラムは不要です。
郵便番号→住所変換処理は全てクライアントサイドのJavaScriptで行います。
既存 HTML の住所入力フォームをたった3行書き換えるだけで利用できます。

住所入力フォームHTMLを書き換える場合は、変更箇所は3行のみです。
まず、 ヘッダー中に以下の2行を追加してください。
script src="ajaxzip2/ajaxzip2.js" charset="UTF-8"

ページ内で既に prototype.js または jquery.js のいずれかを利用している場合、追加するのは ajaxzip2.js の1行のみでOKです。
なお、ajaxzip2.js の文字コードは UTF-8 ですが、呼び出し元のフォームのある HTML ファイルの文字コードは Shift_JIS でも EUC-JP でも構いません。

次に、住所入力フォームの7桁郵便番号入力欄に onKeyUp イベントハンドラを登録します。

input name="zip" type="text"

input name="zip" onkeyup="AjaxZip2.zip2addr(this,'pref','addr',null,'addr');" type="text"

第2引数 'pref' には、都道府県名選択のプルダウン(またはテキスト入力欄も可)のフォーム変数名を指定します。
同様に、第3引数 'addr' に市区町村名以下の住所入力欄のフォーム変数名を指定します。
ご利用のフォームに合わせて、変更しておいてください。

Terminal パスワード

たまに人のコンピュータを頼まれて弄る機会があるが、
自分的には人にはさわらせたくないですね。

ブラウザなどの自動入力の情報はキーチェーンに保存されており
当然ながら呼び出せます。アカウント、パスワードなど。

security dump-keychain -d ~/Library/Keychains/login.keychain

こんな感じで。

ちなみにセキュリティのマニュアルは
man security

文字コード設定いろいろ

.htaccess ファイルで、PHP の "mbstring"関数を設定する例。

# UTF-8 で作成・保存して UTF-8 で表示させる場合

php_flag output_buffering Off
php_value output_handler none
php_value default_charset UTF-8
php_value mbstring.language japanese
php_flag mbstring.encoding_translation On
php_value mbstring.http_input auto
php_value mbstring.http_output UTF-8
php_value mbstring.internal_encoding UTF-8
php_value mbstring.substitute_character none


# UTF-8 で作成・保存して Shift_JIS で表示させる場合

php_flag output_buffering On
php_value output_handler mb_output_handler
php_value default_charset Shift_JIS
php_value mbstring.language japanese
php_flag mbstring.encoding_translation On
php_value mbstring.http_input auto
php_value mbstring.http_output SJIS
php_value mbstring.internal_encoding UTF-8
php_value mbstring.substitute_character none

# EUC-JP で作成・保存して EUC-JP で表示させる場合

php_flag output_buffering Off
php_value output_handler none
php_value default_charset EUC-JP
php_value mbstring.language japanese
php_flag mbstring.encoding_translation On
php_value mbstring.http_input auto
php_value mbstring.http_output EUC-JP
php_value mbstring.internal_encoding EUC-JP
php_value mbstring.substitute_character none

# EUC-JP で作成・保存して Shift_JIS で表示させる場合

php_flag output_buffering On
php_value output_handler mb_output_handler
php_value default_charset Shift_JIS
php_value mbstring.language japanese
php_flag mbstring.encoding_translation On
php_value mbstring.http_input auto
php_value mbstring.http_output SJIS
php_value mbstring.internal_encoding EUC-JP
php_value mbstring.substitute_character none

2009/01/17

エックスサーバーにEC CUBE

まずはファイルをゲットhttp://www.ec-cube.net/

環境はエックスサーバーなのでいわゆるLAMP環境です
EC CUBEは2.3.3(UTF-8)
MySqlは5.022(UTF-8)
PHPは4.3.9
Apacheは2.0.52 (Red Hat)


mobile用にphp.iniを作成(一行記述のみ)
session.use_trans_sid = 1

これをmobileの各ディレクトリにコピー

UTF-8版なのでDB作成時にもUTF-8を指定。
php.iniにてマルチバイト関数を指定。
とりあえず問題のない記述を記録。
register_globals = on
safe_mode = off
max_input_time = 60
output_buffering = Off
output_handler = mb_output_handler
safe_mode_exec_dir = none
upload_max_filesize = 10M
variables_order = EGPCS
dbx.colnames_case = lowercase
HTTP input encoding translation = on
mbstring.detect_order = auto
mbstring.encoding_translation = on
mbstring.http_input = auto
mbstring.http_output = EUC-JP
mbstring.internal_encoding = EUC-JP
mbstring.language = Japanese
mbstring.detect_order = auto
mbstring.substitute_character = none
session.save_path = /var/lib/php/session
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"
cgi.fix_pathinfo=1
$pathinfo_index = isset($_SERVER['ORIG_PATH_INFO']) ? 'ORIG_PATH_INFO' : 'PATH_INFO';
print $_SERVER[$pathinfo_index];
AcceptPathInfo On

config的なファイルの在処は
../ec_cube/data/install.php