XOOPS Cube Legacy 2.2にALTSYS0.71aを導入する

XOOPS Cube Legacy 2.2にALTSYS0.71aを導入(ファイルを展開しただけ)したところ下記のエラーが出力された。

[PHP]
Notice [PHP]: Use of undefined constant _LANGCODE – assumed ‘_LANGCODE’ in file class/template.php line 85
Notice [PHP]: Use of undefined constant _CHARSET – assumed ‘_CHARSET’ in file class/template.php line 86
Notice [PHP]: Use of undefined constant _LANGCODE – assumed ‘_LANGCODE’ in file modules/legacyRender/kernel/Legacy_AdminRenderSystem.class.php line 123
Notice [PHP]: Use of undefined constant _CHARSET – assumed ‘_CHARSET’ in file modules/legacyRender/kernel/Legacy_AdminRenderSystem.class.php line 124
Notice [PHP]: Use of undefined constant _CHARSET – assumed ‘_CHARSET’ in file modules/legacyRender/kernel/Legacy_RenderTarget.class.php line 25
[/PHP]

ついでに、インストールを行おうとすると、次のように失敗する。

[PHP]
ブロック 管理メニュー をインストールしました
コンフィグ adminmenu_hack_ft を追加しました
コンフィグ adminmenu_insert_mymenu を追加しました
コンフィグ admin_in_theme を追加しました
コンフィグ enable_force_clone を追加しました
コンフィグ images_dir を追加しました
コールバック ‘xoops_module_install_altsys’ を実行することができませんでした
ALTSYS モジュールのインストールに失敗しました
Force Uninstallation is started.
[/PHP]

解決方法としては次の1行をhtml/preload/SetupAltsysLangMgr.class.phpの中のfunction loadGlobalMessageCatalog()下に追加する。

$this->_loadLanguage('legacy', 'setting');

[PHP]
function loadGlobalMessageCatalog()
{
/* if (!$this->_loadFile(XOOPS_ROOT_PATH . “/modules/legacy/language/” . $this->mLanguageName . “/global.php”)) {
$this->_loadFile(XOOPS_ROOT_PATH . “/modules/legacy/language/english/global.php”);
} */
$this->_loadLanguage( ‘legacy’ , ‘global’ ) ;
$this->_loadLanguage( ‘legacy’ , ‘setting’ ) ;

//
// Now, if XOOPS_USE_MULTIBYTES isn’t defined, set zero to it.
//
if (!defined(“XOOPS_USE_MULTIBYTES”)) {
define(“XOOPS_USE_MULTIBYTES”, 0);
}
}
[/PHP]

参照

DreamweaverでXML parsing fatal errorが出た。

DreamWeaverを立ち上げたらこんなエラーが出た。

XML parsing fatal error: An exception occurred!
Type:UnexpectedEOFException, Message:The end of input was not expected, line: 17, file:
C\:Users\xxx\AppData\Roaming\Adobe\Dreamweaver CS4\ja_JP\Configuration\Workspace\Classic.xml

内容を見るに、パネルレイアウトに関するxmlファイルの終わりが予期しない形式になってるよ(要は壊れてるよ)とのことなので、該当のファイルを開いてみると案の定こんな形で途切れてた。

[PHP]

修正のしようもないので、一旦DWを強制終了して該当のファイルを削除してから再起動したら普通に立ち上がった。

あとはパネルレイアウトを再設定して完了。ちなみにClassic.xmlは勝手に再作成された。

山下達郎コンサート

山下達郎コンサート。急遽行かれなくなった友人からチケットを譲り受け、有名どころの何曲かしか知らないままの参加。結果的にはトータル4時間弱の長丁場にもかかわらずそれと感じないほど楽しい時間を過ごせた。

ご本人の歌やおしゃべりは当然として、それを支えるバンドメンバーが素晴らしくてきっとリハーサルの回数以上に息がピタリ。そして山下達郎本人が一人一人のメンバー紹介やソロで活躍する場を作るのを(しかも何度も!)見ていて非常に気持ちが良い。

また、アンコールの後も続けて何曲か歌うところまではお約束だけれど、その”何曲か”が多くて近くのお客さんから「まだやるのか?」という声がちらほらと聞こえて少し可笑しかった。

デビュー37年なんて自分が生まれてもいないような少し気が遠くなる時間。そんなに昔から大舞台のしかも第一線で頑張り続けているなんて本当にすごい。来年で還暦だそうだけれどますますの活躍を願いながらまた聴きに行きたいなと思う。

MySQLのInnoDBに対してAUTOCOMMITが無効であるのにも関わらずCOMMITするのを忘れていた。

MySQLのInnoDBに対してAUTOCOMMIT = 0の状態でsqlを発行しCOMMITしなかった(するのを忘れた)場合、次のようになった(idはAUTO_INCREMENT)。

a. スクリプト実行前

id, value
1 taro
2 jiro
3 saburo

b. スクリプト実行中(shiroを追加するsqlを発行/COMMITせずにスクリプト終了)

id, value
1 taro
2 jiro
3 saburo
4 shiro

c. スクリプト実行後

id, value
1 taro
2 jiro
3 saburo

d. 同じsqlを再度発行し、きちんとCOMMITした場合。

id, value
1 taro
2 jiro
3 saburo
5 shiro

そもそもの原因は、「sqlをphpスクリプト上で発行してもDBに反映されないが、同sqlをphpMyAdminから直接発行すると正常に反映される」という現象が発生し、ついでに対象となるテーブルのid(AUTO_INCREMENT)がなぜか飛び番号になってしまったこと。いろいろと調べた結果、原因は単純にAUTOCOMMITの設定値の問題だった。

MySQLでInnoDBテーブルを利用していた場合、トランザクション時の挙動はAUTOCOMMITの値によって異なる。AUTOCOMMIT = 1の場合は、ユーザーが明示的にmysql_query(“BEGIN”)としなくともトランザクションを自動的に設定してコミットまで行ってくれる。AUTOCOMMIT = 0の場合は、ユーザーがmysql_query(“BEGIN”)とすることが前提となっており、またコミットには同じく明示的にmysql_query(“COMMIT”)が必要となる(もしくはmysql_query(“ROLLBACK”)とすることで反映をキャンセルする)。

参照:13.5.10.2. InnoDB と AUTOCOMMIT

DBの更新については通常であれば次のように常にAUTOCOMMIT = 0として明示的にBEGINおよびCOMMIT/ROLLBACKを行うようにしていたが、今回は例外的に下記を通さずにsqlを個別に発行しなければならない状況になり、かつ、その発行の直前にAUTOCOMMIT = 0を発行していることを忘れていたためにいくらか悩んでしまった。

$dbHandle = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die('Could not connect: ' . mysql_error());
mysql_select_db("TEST");

$sql = "INSERT INTO table_name ...";

mysql_query("SET AUTOCOMMIT = 0");
mysql_query("BEGIN");

try {
	$result = mysql_query($sql);	
	if (!$result) {
		throw new Exception('exception : ' . mysql_error()) ;
	}	
	mysql_query("COMMIT");

} catch(Exception $e) {
	echo $e->getMessage;	
	mysql_query("ROLLBACK");
}

if (!$dbHandle) {
    mysql_close($dbHandle) ;
}

ちなみにAUTOCOMMITの値は下記sqlによって取得する

SELECT @@autocommit;

なお上記のテーブルの履歴で、dにおいて追加されたshiroのidが5となっているのは次の理由からだと思われる。

1. bにおいて発行されたsqlによってidが一つ使用(予約?)される。
2. cにおいてCOMMITなしに接続が切れることによるROLLBACKでレコードは元に戻されるがidは元に戻らない。
3. よってdの段階においては一旦使用されたidを飛ばしてその次の5が使用される。

参照:13.5.10.9. 暗黙的なトランザクション コミットとロールバック

もし自動コミット モードがオフで、最後のトランザクションを明示的にコミットせずに接続を閉じると、MySQL はそのトランザクションをロールバックします。