MySQLをバージョン5.5.xにアップデート

yum 経由で MySQL をアップデートした備忘録。

MySQL がバージョン 5.5.3 なってからコマンドやサーバオプション、変数に大幅な変更や廃止が加えられている。グーグルで検索すると今回の変更のことで MySQL が起動しないことがたくさんヒットする。この機会に古い設定を見直しておきたい。

バージョン5.5.x のインストールは無事に済んだが、データベースに繋がらず。

Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

再起動しても失敗。ログを見ると、いくつかエラーが見られる。

tail -50 /var/log/mysqld.log
...
110830 12:39:45 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
...
110830 12:39:46 [ERROR] /usr/libexec/mysqld: unknown variable 'default-character-set=utf8'
110830 12:39:46 [ERROR] Aborting
...
110830 12:39:47 [Note] /usr/libexec/mysqld: Shutdown complete

一つ一つ解決。

まずは、デフォルトで文字コードを設定しているが、文字コードの設定の方法が変わったみたいだ。それで MySQL が起動せずにシャットダウン。

my.cnf の設定を変更。[mysqld] ディレクティブにある default-char-set を

default-character-set=utf8

から

character-set-server=utf8

に変更。

再起動ができるようになった。

そしてつぎは、アップグレードの度に実行する mysql_upgrade コマンドでテーブルの互換性をチェック、修正を施す。

mysql_upgrade -u root -p

無事アップグレードが済んで、データベースに繋がった。

関連サイト

PHPでHTML上にエラー表示/非表示する php.ini 設定

PHP でのエラー表示は php.ini にある

display_errors = On

で HTML 上にエラーが表示される。

display_errors = Off

で HTML 上に表示されなくなる。

さらにエラーレポートレベルによってエラーの種類を設定する必要がある。

PHP 4 と PHP 5 のデフォルトは

error_reporting = E_ALL & ~E_NOTICE

他は、全てのエラー出力をオフにする

error_reporting = 0

全てのエラーを出力する

error_reporting = E_ALL

など定義済み定数で細かく設定できる。

php.ini にあるサンプルには

error_reporting
Default Value: E_ALL & ~E_NOTICE
Development Value: E_ALL | E_STRICT
Production Value: E_ALL & ~E_DEPRECATED

とある。

開発環境には以下の設定を。

error_reporting = E_ALL | E_STRICT

E_ALL には PHP5 から追加された E_STRICT が含まれていないため、E_STRICT で互換性がない推奨されていないコードの警告とスクリプトのチェックをしたい。

Webサービスとして運営する時には、

error_reporting = E_ALL & ~E_DEPRECATED

PHP 5.3.0 で新しく加わった E_DEPRECATED で特定の機能が将来のPHPバージョンで推奨されない場合に警告が表示されるので、回避策として。

さらに

display_errors = Off

でエラー表示をなくしたい。

関連サイト

Fatal error: Allowed memory size of … に対処してPHPの使用メモリを増やす

WordPress などを使っていると PHP スクリプトがサーバーに割り当てられたメモリをオーバーして使用している際に遭遇する。

Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 19456 bytes) in ....

そこで、メモリーを増やすことに。設定は /etc/php.ini に。

memory_limit = 16M

から

memory_limit = 32M

に変更して保存。

Apacheを再起動して確認。

あらら、またまた同じエラーが。

Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 19456 bytes) in ....

phpinfo() で確認すると、memory_limit の項目が Master Value では 32M。Local Value では 16M と php.ini で設定された値とは別に .htaccess や httpd.conf など他のどこかで設定されているようだ。

サーバーに ServersMan@VPS を使っている場合、いろいろ探してみるとサブドメインの設定 (/etc/httpd/conf.d/subdomains/site1.xxx.conf) に該当箇所があった。削除するか、

php_admin_value memory_limit 16M

から

php_admin_value memory_limit 32M

に変更保存。

再びサーバ再起動。

/etc/init.d/httpd restart

phpinfo() でも Master Value と Local Value が同じ 32M を確認。

きちっとメモリーが割り当てられた。

関連サイト

スタイルシートを切り替えるjQuery Plugin「CssSwitcher」アップグレード

スタイルシートを切り替える jQuery Plugin「CssSwitcher」をアップグレードしました。あわせて JavaScript 版もアップグレード。

改良点は二つ。

  • ソースの全面見直し。初期設定の仕方を変更しました。
  • ブラウザの戻るボタンで前のページに戻る際に、先のページで変更したスタイルシートが反映されない場合の対処

二つ目はブラウザによって挙動が違うのですが、ブラウザで直前まで見ていたページの状態を復元する「Back Forward Cache」が働いているため、スタイルシートが反映されないことが起こっているようです。Firefox ではデフォルトで「Back Forward Cache」がオンの状態。

参考

続きを読む "スタイルシートを切り替えるjQuery Plugin「CssSwitcher」アップグレード"

Perl で OAuth / モジュール OAuth::Lite::Consumer インストール

Twitter や Facebook などウェブサービスの連携には欠かせなくなりつつある認証システム OAuth (オー オース)。アプリ開発者としてマスターしておきたい認証システムのひとつ。今回モジュール OAuth::Lite::Consumer をインストールして、Perlで OAuth 認証できる環境をつくってみた。Twitter で認証してアカウント情報を表示するサンプルプログラムも。

OAuth::Lite::Consumer インストール

ふつうに cpanm でインストールできず。パッケージ openssl-devel が必要。

cpanm OAuth::Lite::Consumer
...
Checking if you have Crypt::OpenSSL::RSA 0.25 ... No
Checking if you have Crypt::OpenSSL::Random 0.04 ... No
...

エラーで止まってしまう。パッケージがないので、perlモジュールの依存関係を解決できず。

まずは、パッケージ openssl-devel をインストール。

yum install openssl-devel

インストール後。

cpanm OAuth::Lite::Consumer

complete!!

サンプルプログラム

Twitter のアカウントでログイン認証。アクセストークンを取得して Twitter のアカウント情報を表示するサンプルプログラム。サンプルを動かすには Twitter にアプリケーションを登録して、ConsumerKey と ConsumerSecret を取得する必要があります。
登録は dev.twitter.com から。

流れとメソッド

  1. リクエストトークンを取得する - get_request_token()
  2. リクエストトークンを元に認証 - url_to_authorize()
  3. Twitterログイン画面でアプリ認証
  4. アプリ認証ボタンを押すと callback_url に転送 (リダイレクト)
  5. アクセストークンの取得 - get_access_token()
  6. アクセストークンを元に認証が必要なリクエスト (GET account/verify_credentials) を発行、今回Twitterアカウント情報を表示 - gen_oauth_request()
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use CGI;
use OAuth::Lite::Consumer;
use LWP::UserAgent;
use JSON;

my $ConsumerKey = 'xxxxxxx';
my $ConsumerSecret = 'xxxxxxxx';
my $callback_url = 'xxxxxxxx';

my $consumer = OAuth::Lite::Consumer->new(
  consumer_key    => $ConsumerKey,
  consumer_secret => $ConsumerSecret,
  site => "http://twitter.com/",
  request_token_path => "https://api.twitter.com/oauth/request_token",
  access_token_path => "https://api.twitter.com/oauth/access_token",
  authorize_path => "https://api.twitter.com/oauth/authorize",
  callback_url => $callback_url,
);

my $query = CGI->new;

if ($query->param('oauth_token') && $query->param('oauth_verifier')) {
  my $access_token = $consumer->get_access_token(
    token => $query->param('oauth_token'),
    verifier => $query->param('oauth_verifier'),
  );

  my $req = $consumer->gen_oauth_request(
    method => 'GET',
    url => 'http://api.twitter.com/1/account/verify_credentials.json',
    token => $access_token,
  );

  my $ua = new LWP::UserAgent();
  my $res = $ua->request($req);
  die $res->status_line if ! $res->is_success;
  my $account = decode_json($res->content);

  print "Content-type: text/html;charset=UTF-8\n\n";
  print "<img src='$account->{profile_image_url}' />";
  print "<p>ID : $account->{id}</p>";
  print "<p>name : $account->{name}</p>";
  print "<p>screen_name : $account->{screen_name}</p>";
  print "<p>description : $account->{description}</p>";
  exit;
}
else {
  my $request_token = $consumer->get_request_token();
  my $uri = $consumer->url_to_authorize(
    token => $request_token,
  );
  print $query->redirect($uri);
}
exit;

関連サイト

最近の投稿

カテゴリー

アーカイブ