Hatena::Groupasakura

浅倉卓司@blog風味? このページをアンテナに追加 RSSフィード

Error : RSSが取得できませんでした。

2011-11-24(Thu)

Virtual PCにCentOS6.0を入れようとしてハマる

| Virtual PCにCentOS6.0を入れようとしてハマる - 浅倉卓司@blog風味? を含むブックマーク Virtual PCにCentOS6.0を入れようとしてハマる - 浅倉卓司@blog風味? のブックマークコメント

 ブート時にエラーが出る理由が全然わからんどーしたものかと悩んでたけど、どうやらメモリ割り当てを1GBにする必要があった模様(最初512MBでやってた。768MBでもダメだった)。

 ……まぁ、そのあとは「Examining storage devices」で止まってるのですが。

トラックバック - http://asakura.g.hatena.ne.jp/asakura-t/20111124

2011-11-18(Fri)

WordPress3.2で wp_handle_upload フィルタの引数のfileにフルパスが渡ってこないのはバグじゃなかろうか?

|  WordPress3.2で wp_handle_upload フィルタの引数のfileにフルパスが渡ってこないのはバグじゃなかろうか? - 浅倉卓司@blog風味? を含むブックマーク  WordPress3.2で wp_handle_upload フィルタの引数のfileにフルパスが渡ってこないのはバグじゃなかろうか? - 浅倉卓司@blog風味? のブックマークコメント

 wp-includes/class-wp-xmlrpc-server.phpの3103行目は

<?php
return apply_filters( 'wp_handle_upload', array( 'file' => $name, 'url' => $upload[ 'url' ], 'type' => $type ), 'upload' );

じゃなくて

<?php
return apply_filters( 'wp_handle_upload', array( 'file' => $upload['file'], 'url' => $upload[ 'url' ], 'type' => $type ), 'upload' );

とすべきでは? とかちょっと思った(wp_handle_upload()に合わせるならそのほうが正しい気がするため)。

 そのうちバグレポを調べるか。。。


追記(2011-11-21)

 どうやらかなり昔から指摘されてたらしいのだけれど、修正されてないみたい。

 仕方ないので

<?php
	$uploads = wp_upload_dir();
	$filepath = preg_replace("@\\A{$uploads['baseurl']}@", $uploads['basedir'], $args['url']);

――とかやって変換するようにしたけど。これで問題ないかな?

トラックバック - http://asakura.g.hatena.ne.jp/asakura-t/20111118

2011-11-10(Thu)

WordPressのKtaiStyleプラグインで、ログイン状態を保持したい場合、

|  WordPressのKtaiStyleプラグインで、ログイン状態を保持したい場合、 - 浅倉卓司@blog風味? を含むブックマーク  WordPressのKtaiStyleプラグインで、ログイン状態を保持したい場合、 - 浅倉卓司@blog風味? のブックマークコメント

 WordPressのコードをみて「あー、PHPのフレームワークってこういう方向(あえてglobal依存にしちゃう)がいいのかもしれないなぁ」とかちょっと思ったりもした今日この頃。

 ケータイ向けにしたい→会員向けなのでログイン必須→どうやって対応すんの?と思ってちょっと調べたところ、KtaiStyleがログイン処理もケータイ向けにやっててよさげだと思ったのですが、ログインセッション保持はあくまで管理画面向けで、通常画面ではセッション保持をしていないらしい。


 どーしたものかとソースコードを眺めていたところ、画面出力の直前にパッチを当ててStickyQueryを付ければいいんじゃね? ということで「ktai-style/ktai_style.php」にこんな修正をしてみた:

<?php
(略)

public function output() {
	if (is_robots() || is_feed() || is_trackback()) {
(略)
	if (function_exists('mb_http_output')) {
		mb_http_output('pass');
	}

	// sticky-query begin
	if (is_user_logged_in() and !$this->get('cookie_available')) {
		$sid = $this->admin->get_sid();
		ini_set('session.use_trans_sid', 1);
		ini_set('session.use_only_cookies', 0);
		session_name(KtaiStyle_Admin::SESSION_NAME);
		session_id($sid);
		session_start();
	}
	// sticky-query end

	header ("Content-Type: $mime_type; charset=$iana_charset");
	echo $buffer;
	exit;
}
(略)

――要するに出力直前にPHPのセッションとtrans_sidを有効にして、PHP側でクエリを追加してもらう事にしたんですな。

($bufferを書き換えるのはいろいろ面倒くさいので)


 これでなんか上手く動いているっぽい? と思ったら、セッションIDがPHPの制限に引っかかったため、セッションIDの生成部分(ktai-style/admin/class.php)もちょっとだけ変更:

<?php
(略)
private function make_sid() {
	$salt = wp_salt();
	$rand = uniqid(mt_rand(), true);
	$sid = base64_encode(hash_hmac('sha1', $rand, $salt, true));
	//return str_replace(array('+', '/', '='), array('_', '.', ''), $sid);
	return str_replace(array('+', '/', '='), array('-', ',', ''), $sid);
}
(略)

 これでうまく動いている――気がする。

(outputとmake_sidがフックできるといいのかなーと思いつつ、他に需要はないだろうしなぁ)


 このままだとセッションを使ってプラグインを使ってると動かないはずなので、

  • KtaiStyleプラグインが動作するタイミングで ini_setとセッションの名前・SIDをセットする
  • 出力前にsession_start()されてなかったら、session_start()するようにする

――のようにしたほうがいいのだろうけれど。

 みなさんどうやっているのかねぇ。


フッタ等での「ログイン/ログアウト」表記(追記:2011-11-11)

 ログイン/ログアウトを表示するために ks_login_link という関数が用意されているのですが、ログインしたあとのページを指定できるようになってればいいのに、とかちょっと思ったのでそういう関数を作ってみた:

<?php

/* ==================================================
 * @param	string  $redirect_to
 * @param	string  $before
 * @param	string  $after
 * @param	boolean $echo
 * @param	string  $accesskey
 * @param	string  $label
 * @return	string  $output
 */
function ks_login_link_redirect() {
	$defaults = array(
		'redirect_to' => '',
		'before'    => '',
		'after'     => '',
		'echo'      => true,
		'accesskey' => '',
		'anchor'     => __('Log in'),
		'anchor_logout' => __('Log out'),
		'before_logout' => NULL,
		'after_logout' => NULL,
	);
	$r = _ks_parse_arg(func_get_args(), $defaults);

	global $Ktai_Style;
	$output = '';
	if ( isset($Ktai_Style->admin) ) {
		if (is_user_logged_in()) {
			$url = ks_get_logout_url(false, $r['redirect_to']);
			if ( isset($r['label_logout']) ) { // backward compati
				$r['anchor_logout'] = $r['label_logout'];
			}
			$anchor = $r['anchor_logout'];
			$before = isset($r['before_logout']) ? $r['before_logout'] : $r['before'];
			$after = isset($r['after_logout']) ? $r['after_logout'] : $r['after'];
		} else {
			$url = ks_get_login_url(false, $r['redirect_to']);
			if ( isset($r['label']) ) { // backward compati
				$r['anchor'] = $r['label'];
			}
			$anchor = $r['anchor'];
			$before = $r['before'];
			$after = $r['after'];
		}
		$output = $before . sprintf('<a href="%s"%s>%s</a>', $url, ks_accesskey_html($r['accesskey']), $anchor) . $after;
		if ($r['echo']) {
			echo $output;
		}
	}
	return $output;
}

/*
// ks_login_link() が redirect_to に対応すれば下記でOKになるはず:
function ks_login_link_redirect() {
	$defaults = array(
		'redirect_to' => '',
		'before'    => '',
		'after'     => '',
		'echo'      => true,
		'accesskey' => '',
		'anchor'     => __('Log in'),
		'anchor_logout' => __('Log out'),
		'before_logout' => NULL,
		'after_logout' => NULL,
	);
	$r = _ks_parse_arg(func_get_args(), $defaults);
	return ks_login_link($r);
}
*/

 ks_login_link と引数の順番が変わるのでそのまま置き換えるのはよくなさそうなので、別名にしたほうがよさげ(リダイレクト先は最初に指定できた方が利便性が高いので)。

 ks_login_linkでリダイレクト先が指定できるようになっていれば、ラッパ関数追加するだけで済むんだけどなぁ。

(これは作者さんに提案してもいいかもしれない)


KtaiStyleの通常ページでのログインセッションを、携帯向けテーマへの functions.php の追加のみで対応する(追記:2011-11-14)

 あれから色々調べてみたところ、下記のようなコードをテーマのfunctions.phpに追加することで通常画面でのログインセッション保持に対応できそうな感触。

 ざっくり解説すると


  • ks_sticky_query() では、ログイン状態でかつCookieが使えない場合にセッション用のクエリストリングを追加する
    • これを ktai_convert_links のフィルタに追加する
  • ks_sticky_query() では、ログイン状態でかつCookieが使えない場合に $shrinkage->convert_links()を適用する
    • これを ktai_split_page のフィルタに追加する

――ことで対応しています。

 それはそれとして、$shrinkage->shrink_content() ってデフォルトだと使われないのかな?

(もしかして設定変えれば使われるようになるんだろうか)

 最初 ktai_convert_links のフィルターに追加したのに動作してなくて、しばらく悩んでました。


<?php

function ks_sticky_query($link_html, $orig_html, $href, $label) {
	global $Ktai_Style;
	if (! is_user_logged_in()) return $link_html;
	if (ks_cookie_available()) return $link_html;

	$sid = $Ktai_Style->admin->get_sid();
	$name = KtaiStyle_Admin::SESSION_NAME;
	$qstr = http_build_query(array($name => $sid));

	$href .= (strpos($href, '?') === false)? '?': '&amp;';
	$href .= $qstr;

	$html = "<a href=\"{$href}\">{$label}</a>";
	return $html;
}
add_filter('ktai_convert_links', 'ks_sticky_query', 10, 4);

function ks_sticky_query_filter($buffer) {
	global $Ktai_Style;
	if (! is_user_logged_in()) return $buffer;
	if (ks_cookie_available()) return $buffer;

	return $Ktai_Style->shrinkage->convert_links($buffer);
}
add_filter('ktai_split_page', 'ks_sticky_query_filter', 19, 1);

 実際には前述の ks_login_link_redirect() もfunctions.phpに追加して使っています。

トラックバック - http://asakura.g.hatena.ne.jp/asakura-t/20111110

2011-11-08(Tue)

MySQLでマルチマスタなレプリケーションをしていて、メインマスタが障害を起こしてダウンした時、

|  MySQLでマルチマスタなレプリケーションをしていて、メインマスタが障害を起こしてダウンした時、 - 浅倉卓司@blog風味? を含むブックマーク  MySQLでマルチマスタなレプリケーションをしていて、メインマスタが障害を起こしてダウンした時、 - 浅倉卓司@blog風味? のブックマークコメント

  • master1とmaster2があって、相互にレプリケーションしている(マルチマスタレプリケーション)。
  • master1をメインとして使っている時、master1に障害が発生してダウンするとMySQL-MMMはmaster2をメインに切り替える。
  • その後master1を復帰させると、master1はmaster2から更新情報を取得して同期するようになる。同期後は再び相互にレプリケーションを行うようになる。

(ここまで合ってるかな?)

  • master1の障害で書き込まれなかったbin-logがあるため、master2はレプリケーションエラーが発生する。
    • Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from impossible position'
  • 仕方ないので、mticket2のマスターのポジションを、新しい(再起動後に作られた)bin-logに変更する。
    • CHANGE MASTER TO MASTER_LOG_POS=0, MASTER_LOG_FILE='mysql-bin.****'

――これで正しくレプリケーションが再開される?

トラックバック - http://asakura.g.hatena.ne.jp/asakura-t/20111108

2011-11-04(Fri)

MySQL-MMMで複数セットを監視する

|  MySQL-MMMで複数セットを監視する - 浅倉卓司@blog風味? を含むブックマーク  MySQL-MMMで複数セットを監視する - 浅倉卓司@blog風味? のブックマークコメント

 MySQL-MMMのmonitorで複数セットのマスターを監視する正しい方法がイマイチ分からない。

 とりあえずインストールガイドをベースに mmm_common.conf を修正してみた:

active_master_role          writer1

<host default>
    cluster_interface       eth0

    pid_path                /var/run/mmmd_agent.pid
    bin_path                /usr/lib/mysql-mmm/

    replication_user        replication
    replication_password    replication_password

    agent_user              mmm_agent
    agent_password          agent_password
</host>

<host db1>
    ip                      192.168.0.11
    mode                    master
    peer                    db2
</host>

<host db2>
    ip                      192.168.0.12
    mode                    master
    peer                    db1
</host>

<host db3>
    ip                      192.168.0.13
    mode                    master
</host>

<host db4>
    ip                      192.168.0.14
    mode                    master
</host>


<role writer1>
    hosts                   db1, db2
    ips                     192.168.0.100
    mode                    exclusive
</role>

<role writer2>
    hosts                   db3, db4
    ips                     192.168.0.101
    mode                    exclusive
</role>

 これでdb1とdb2のマルチマスタと、db3とdb4のマルチマスタを監視できるようになる――はずなのだけれど、active_master_role には writer1 か writer2 しか指定できない模様。

 active_master_role の指定ができないと困る理由は、マスターをアクティブにした時にread_onlyを解除できないため。実際、上記のように設定するとdb3⇔db4で切り替えてもread_onlyが解除されない(ので、書き込むとエラーになる)。


 active_master_roleを参照してるプログラムはagentとmonitorとのことで、db3とdb4のmmm_agent.confに

include mmm_common.conf
this db3
active_role_master writer2

――のようにactive_master_roleの設定を追加すればread_onlyが解除(切り替え)されるっぽい。

 これで問題ないのだとすると、monitorでactive_master_roleは何のために使われてるのか気になるところです。


 それにしても、MySQL-MMMを使ってる話を(日本語では)あまり見かけないって事は、あんまり(日本では)使われてないんでしょうかね。RHELのepelにあるくらいなので、一般的なツールのような気もしたのですが。

トラックバック - http://asakura.g.hatena.ne.jp/asakura-t/20111104
2004 | 01 | 02 | 03 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 08 | 09 | 10 | 11 | 12 |
2007 | 02 | 03 | 04 | 05 | 06 | 07 | 10 | 11 | 12 |
2008 | 02 | 03 | 04 | 06 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 02 | 03 | 04 | 05 | 07 | 08 | 10 | 11 | 12 |
2013 | 01 | 05 | 07 |
2014 | 01 | 02 |
2016 | 01 |
2017 | 01 | 05 |