読者のことを考えずに自分の都合だけで書いてるブログだから人気が出ないんじゃないの?

せっかく読みに来てくれた人に興味のないものを読ませてしまう。それって、読んでくれた人にとっても、書いた方にとっても、お互いに悲劇じゃないんですかね。だから、僕は読者は選ぶべきだと思っています。最近たまたま見たブログでこんなことが書いてありました。また3日間ブログの更新を休んでしまいました。ダメですね。毎日更新するというのが最初の目標だったので初心に戻って頑張ります。これを読んで思ったわけです。この人の「最初の目標」は、本当に「毎日更新」することだったんだろうか?どんな目的でブログを書いているにしろ「最初の目標」は、大勢に読んでもらうという事じゃなかったのかな。

最近たまたま見たブログでこんなことが書いてありました。

また3日間ブログの更新を休んでしまいました。
ダメですね。毎日更新するというのが最初の目標だったので初心に戻って頑張ります。

これを読んで思ったわけです。この人の「最初の目標」は、本当に「毎日更新」することだったんだろうか?

どんな目的でブログを書いているにしろ「最初の目標」は、大勢に読んでもらうという事じゃなかったのかな。

その目標のための手段が「毎日更新」することなんじゃないの?

人に読んでもらえようが、もらえまいが、そんな事は関係ない。ただ毎日更新し続ける。それが男の試練!

そういう目標なの?修行ですか?

多分ブログをはじめる時に、どこかの入門サイトで

大勢の人に読んでもらうためには毎日欠かさず更新を続けましょう。それがアクセスアップには重要です!

とか書いてあったから、その通り実践してるだけなんじゃないの。

確かに、毎日更新すれば人の目につく確率は上がります。それは間違いない。でも、それが必ずアクセスアップにつながるんでしょうか?

つまらないページを量産していたら読者は増えない

毎日更新すれば、確率的に人の目につく可能性は増えますが、それがそのままアクセスアップにつながるんでしょうか?

僕は、それだけでは繋がらないと思います。

毎日更新するというのを日課にすると、どうしても書かなければいけなくなります。

  • 今日は忙しくて、時間がない。
  • 今日は何も書くネタが浮かばない。

それでも書かなければいけない。ブログの更新が苦行になってきます。

苦行として、無理やり書き上げたページというのは得てしてつまらなくなりがちです。

もちろん、無理やり書いたページでも面白ければいいんです。多分、プロの執筆業者なら、ある程度のクオリティは保つでしょう。

でもアマチュアが書いた場合、苦行の結果として無理やり公開したページのクオリティって低くなりませんか。

さっき「毎日更新すれば、確率的に人の目につく可能性は増えます」と書きましたが、その時にクオリティの低いページを見られてしまったら、その人はリピートしてくれません。一期一会。さようならです。

クオリティが低いページを毎日更新していれば、人気は出ません。当然です。かえって危険、リスキーです。

それでも

ダメですね。毎日更新するというのが最初の目標だったので初心に戻って頑張ります。

なんでしょうか?

「初心」というのは、大勢に読まれるブログを書きたい。みんなに読んでもらいたい。ということであって、「毎日更新」というのは、そのための手段に過ぎないんじゃないんですか?

目標のために選んだ手段が間違っていたのなら、その「手段」を変更して、目標を達成するべきじゃないんですかね。

「ああ時間がない。もういいやこれで公開!」

そうやって、毎日毎日、低レベルのページを公開するのは逆効果なんじゃないの?

充実していて楽しければ休まないでしょ?普通は

冒頭で紹介したページには、仲のいいブロガー達からのコメントがあって「私も最近はついつい更新を休みがちですが、お互いに頑張って更新しましょう」とか書いてる人もいます。何を頑張ればいいのかわかってるんでしょうか。

そもそも、なんで「私も最近はついつい更新を休みがち」になったんでしょう。それが解決できないのに、闇雲に頑張って毎日更新してもムダじゃないですか。

休みがちになった理由は、更新しても手応えがないからでしょ?毎日の更新が楽しければ休まないでしょ。普通。

更新しても更新しても読者が増えないから、つまらなくなって休むんでしょ。その解決をしないで毎日更新しても何も変わらないですよね。

まず第一に考えるべきは、本当に毎日更新するのが正しい事なのか?もし正しいなら、何故自分のブログの読者は増えないのか?じゃないですか。

毎日毎日更新して、それが常に面白ければ、普通に考えて人気ブログになるんじゃないの。

でも、ちゃんと毎日更新している。なのに人気にならない。ということは、ブログが面白くないって事じゃん。

そうであるなら、やるべきことは「毎日更新」することよりも優先して、面白いページを作ることなんじゃないの。

神様、私のページは何故つまらないのでしょうか?

自分で楽しいと思っていない「苦行」を実践していたら、その結果生み出されたものもつまらなくなるんじゃないですかね。

ここで聞きたいんですが、毎日30分かけて新しいページを公開しているとします。そのページがつまらないんです。どうすればいいでしょう?

まずは苦行から解放されるべきではないですか。だって、しょうがないじゃない。私のブログはつまらないんだもん。

それで更新しないで書きためていけばいいじゃないですか。毎日30分で書いていたのなら、7日かければ3時間半。3時間半かければ少しは面白くなりません?

毎日ひとつのページを書こうと思うからいけないんであって、7日でひとつのページならパワーが集積されるでしょ。それでもつまらなければ、もっと時間をかければいいじゃん。

間違いなく言えるのは、7日に一回の更新なら毎日更新する場合に比べて人様にクオリティの低いページを見られてしまう確率が落ちます。少なくとも7分の1に縮小できます。いいじゃないですか、ブラボー!

そして重要なのは、同じ物を読んでも面白いと思ってくれる人と、くれない人がいるという事。リピーターというのは面白がってくれる人です。

重要だから2回書きます。世の中には同じものを読んでも面白がってくれる人と、くれない人がいます。だから、ターゲティングを間違えれば喜んでもらえません。好みの違いです。

何故つまらないページを書き続けてしまったのか?

ここで、ひとつ疑問があります。その人はなぜ、苦行を続けて休みがちになるまで、つまらないページを書き続けてしまったのか。という疑問です。

普通、書いても書いても人気が出なければ、やめます。弱肉強食の摂理に基づけば、面白いブログだけが残ります。淘汰です。

でも、そのブログはやめなかった。やめずに続けたのは何故なんでしょう。

それは仲のいい人達からのコメントです。その人達もみんなブロガーです。ブロガー仲間たちから励ましを受けて、今日まで続けてきました。

美談です。

でも、結果として自分のブログがつまらないという事に気がつけなくなりました。

普通はつまらなければ何のリアクションも、もらえません。

だけど、そのブログには毎日読みに来てくれるブログ仲間がいて、毎日コメントを残してくれます。そして、自分も毎日仲間のブログを読んで回ってコメントをしていきます。

みんなが同じようにコメントを書き、書いてもらっています。だからみんな安心です。コメントをもらう度に「読んでもらっているんだ。」そう思います。

でも実際には世間の誰にも読まれていないわけです。仲間以外には。その結果、休みがちなブログがひとつ完成しました。

ただ、全員が休みがちなわけではなく、楽しんでいる人は毎日更新しています。この違いは何でしょう。

同じブログでも好きな人と、そうでない人はいる

休みがちのブログにとって残念だったのは、仲間の嗜好が書いているブログの方向性と違ったということです。

例えば、40代50代の女性が多いグループで、アニメの話を書いても喜ばれるものなんでしょうか?

そのブログのアニメのページにこんなコメントが残されています。

私はこれ見たことがないんですけど、孫が好きで見ているらしいですよ。

ここで「読んでもらった。コメントくれた。」なんて喜んでしまうのは危険ですよね。

だって、これって裏を返せば「私はこれ興味ないんです。けど、孫は好きらしいです」ってことでしょ。

ああ、興味がないんだ。という風に気づければよかったのに。

せっかく読みに来てくれた人に興味のないものを読ませてしまう。それって、読んでくれた人にとっても、書いた方にとっても、お互いに悲劇じゃないんですかね。

多分、コメントを残した人も大変だったと思うんですよ。書くことがなくて。その結果「孫が好きらしい」です。

普通は、よほど面白かったか、腹が立ったかしないとコメントはくれません。なのに、もらってしまった。そして安心してしまった。その結果として、そのブログは後に更新を休むことになります。

悲劇です。

だから、僕は読者は選ぶべきだと思っています。お互いのために。

マニアが読者な場合とそうでない場合で書き方は変わる

でも、この場合選んだ題材よりも、まず書き方が悪かったんだと、僕は思っています。というのは、そのアニメを見ている人を対象にした書き方だったから。

自分のブログの読者には、40代以降の主婦が多いということを意識して書けば、違った反応がもらえたんじゃないかと思います。

自分の読者には、普段そのアニメを見ていない人が多い。そのアニメのことを知らない人が多い。という事に気づいて書いていれば違う書き方になったと思うんです。そして、それを読んでくれた人に

「面白そうなアニメですね」

そんなコメントがもらえたのなら、しめたもの。脈アリです。

次の更新でも、そのアニメがいかに面白いのか、さらに補足しながら情熱を持って紹介すれば、読んだ人もそのアニメを見てくれるかも知れません。そうなれば違う展開が期待できます。

でも、そうではなく日頃からそのアニメを見ている人を対象にして書いてしまった。自分のブログのターゲティングを明らかに間違えています。だから喜ばれませんでした。

そう考えると結局、何故その人は休む事になったんでしょうか?

読んでくれる読者のことを考えずに、自分の都合だけで書いているから人気が出ないんじゃないの?

だから休みたくなるんじゃないの? と、僕はそう思っています。

そのブログの作者へ向けた追記

読者を選べとしつこく言ってきたけど、
一緒にいて楽しい読者じゃないとブログは続かないと思うよ。

読者というのはコメントをくれる人だけじゃなくて、
一度も会話したことがない人達がほとんどなわけだけど。

そういう人達、読んでくれる人たちの顔を思い浮かべて書くといいよ。

誰に向かって書いているのかわからないから、書いていてもつまらなくなる。
誰に向かって書いているのかがハッキリすれば的は絞れる。

例えて言うなら、見知らぬ読者にコメントを返すつもりで書けばいい。
誰に向かって書いているのかわからないと、読む側もつまらなくなる。

コメントをもらってうれしいのは、自分に向かって書いてくれているからでしょ。
的を絞れ。的を絞らないで書くという事は、誰からも興味を持たれないということ。

###########################################

勘違いするといけないので追記。

はじめからジャンルを絞る必要はない。
試行錯誤をしないと成功しない。

最初に決めたことだから、やり続けるというけど、
最初から正しければ、学校はいらない。
最初から正しいわけなんかないんだから、間違いを続けても意味はない。

だから、いろいろ試すことが必要になる。
その中で自分がいちばん楽しいことを見つけるのが成功のもと。

自分が楽しめないブログは読者が楽しめない。これ重要。

今までを思い返して、自分で楽しんできたと思う?
毎日書くという義務感だけが優先して、楽しんでなかったんじゃないの?
それでは読んでくれる読者に対しても失礼だ。

PHPでTwitterのOAuth認証するサイトのサンプルページを作ってみました

PHPでTwitterのOAuth認証でログインするサイトのサンプルページを作って見ました。実行内容は、次の通りです。
.htaccess を使ってすべてのアクセスを index.php に渡す。index.php でログイン済みかどうかをチェック。ログインしていない場合、template.php を使って状況に応じたメッセージを表示。「ログイン」をクリックしたら、Twitterの認証ページヘリダイレクト。認証がすんだら page_1.php を開く。あとは自由にページを見られる。存在しないページをリクエストされたら、404.php を表示する。「ログアウト」をクリックしたらログアウトする。

PHPでTwitterのOAuth認証を使ってログインするサイトのサンプルページを作って見ました。
http://php-oauth-sample.dwm.me/

追記:上のはあまりにもみすぼらしいので、ちょっと真面目に作り直しました。こちらが新しいサンプルです。
http://dwm.me/sample/todo/

ただし、今ご覧頂いているページの内容は最初のサンプルにそって書かれています。

作ったファイルは、.htaccess と index.php、page_1.php、page_2.php、404.php、それから template.php です。

ファイルはhttp://php-oauth-sample.dwm.me/twitter_oauth_sample.zip からダウンロードできます。

実行内容は、次の通りです。

  • .htaccess を使ってすべてのアクセスを index.php に渡す。
  • index.php でログイン済みかどうかをチェック。
  • ログインしていない場合、template.php を使って状況に応じたメッセージを表示。
  • 「ログイン」をクリックしたら、Twitterの認証ページヘリダイレクト。
  • 認証がすんだら page_1.php を開く。
  • あとは自由にページを見られる。(他には page_2.php しかありませんけど)
  • 存在しないページをリクエストされたら、404.php を表示する。
  • 「ログアウト」をクリックしたらログアウトする。

page_1.php と page_2.php それから 404.php は独立していて、それ以外の処理を template.php に渡して表示します。

また、ライブラリとして https://github.com/abraham/twitteroauthで公開されている twitteroauth を使っています。(上に書いた圧縮ファイルの http://php-oauth-sample.dwm.me/twitter_oauth_sample.zip には同梱していません)

Twitter Apps で認証キーを取得する

まずはじめにTwitter Apps(https://apps.twitter.com/)で、API key と API secret を取得します。

Twitter AppsTwitter Apps

Website と書かれた項目と Callback URL と書かれた項目以外は、好きに書いて構いませんが、認証画面で次のように表示されます。

Twitter Apps

Website には、認証させるサイトのURLを入力します。

Callback URL は、認証が済んだ後に自動でリダイレクトされる先のURLです。私のサンプルでは http://php-oauth-sample.dwm.me/twitter_callback/ になっていますが、ここで必要なデータを取得したら、再びリダイレクトして http://php-oauth-sample.dwm.me/page_1/ に飛ばしています。結果として、ログインしたユーザーが最初に見るのは http://php-oauth-sample.dwm.me/twitter_callback/ ではなく http://php-oauth-sample.dwm.me/page_1/ になります。

また、Twitter Apps に登録する際に注意しなくてはいけないのが、Allow this application to be used to Sign in with Twitter という部分です。ここにチェックを入れておかないと、ログインする度に認証ページが開いてしまいます。

ここにチェックをいれておけば、最初の認証以外は、すぐに http://php-oauth-sample.dwm.me/twitter_callback/ へリダイレクトさせることが出来ます。その説明は次のページが詳しいです。

PHPで「Sign in with Twitter」を実装する方法 – 頭ん中

同ページより引用

  • ユーザーが呼び出し元アプリケーションを承認している場合
    • ユーザーが Twitter にログインしている場合:直ちに承認されて、呼び出し元のアプリケーション(callback URL)にリダイレクトされる。
    • ユーザーが Twitter にログインしていない場合:Twitter のログイン画面が表示され、ログイン後は直ちに承認されて、呼び出し元のアプリケーションにリダイレクトされる。
  • ユーザーがまだ呼び出し元アプリケーションを承認していない場合、あるいは承認を取り消している場合
    • ユーザーが Twitter にログインしている場合:OAuth の承認画面が表示され、承認後は呼び出し元のアプリケーションにリダイレクトされる。
    • ユーザーが Twitter にログインしていない場合:まず Twitter のログイン画面が表示され、ログイン後に OAuth の承認画面に移り、承認後は呼び出し元のアプリケーションにリダイレクトされる。

ライブラリ twitteroauth の取得

OAuth認証をするために使うライブラリを https://github.com/abraham/twitteroauth から取得します。

開いたページの右側に Download ZIP というボタンがあるので、それをクリックするとダウンロードできます。

twitteroauth

ダウンロードした .zip ファイルを解凍するとファイルがたくさんありますが、必要なのは twitteroauth というフォルダだけです。このフォルダの中に入っている2つのファイル OAuth.phptwitteroauth.php を使います。

.htaccess の作成

この項目は私のやった方法の場合で、OAuth認証と基本的に無関係です。

サイトへの、すべてのリクエストを index.php に渡して、そこで処理するために次の内容の .htaccess を用意しました。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule . index.php [QSA,L,PT]
</IfModule>

実際の .htaccess には他にもいろいろ書いていますが、mod_rewrite に必要なところだけ書き出しています。これで、すべてのアクセスは index.php に渡されるので、そこで処理をします。

URLは http://php-oauth-sample.dwm.me/page_1/ という形式で、この場合だと page_1.php を読み込んで表示するようにします。

index.php の内容

大きく分けると switch 文で、次のように処理を振り分けています。

実際に使っているファイルは http://php-oauth-sample.dwm.me/twitter_oauth_sample.zip からダウンロードできますので、そちらを参照してください。

switch($match[1]){
	// ログインをリクエストされた場合
	case TWITTER_LOGIN:

		// 認証用のtokenを取得

		if(token が取得できたら){
			// Twitter へリダイレクトして終了
			//(認証後、登録したリダイレクトページに返ってくる)
			return;
		}

		// token が取得できなければ、表示するメッセージを用意してbreak
		break;

	// Twitterの認証画面からリダイレクトされてきた場合
	case TWITTER_CALLBACK:

		if(認証されていたら){
			// 送られたデータをセッションに渡し
			// http://php-oauth-sample.dwm.me/page_1/ ヘ リダイレクトして終了
			return;
		}

		// 認証されなていなければ、表示するメッセージを用意してbreak
		break;

	// ログアウトをリクエストされた場合
	case LOGOUT:

		// セッションをクリア

		// ログアウト完了のメッセージを用意してbreak
		break;

	// その他のケース
	default:

		if(指定のページが存在する場合){

			if(ログインしていれば){
				// そのページを表示して終了
				return;
			}

			// ログインしていなければ、ログインを促すメッセージを用意

		}else{
			// ページが存在しなければ 404ページを読み込んで終了
			return;
		}

		// 指定のページが存在するけど、ログインしていない場合はbreak
		break;
}

// ここまでで return していなければ
// template.php に用意したメッセージを埋め込んで表示

header('Content-Type: text/html; charset=UTF-8');
require_once(TEMPLATE_FILE);

ログインをリクエストされた場合

// API key と API secret は https://dev.twitter.com/apps から取得する

define('API_KEY', '*************************');
define('API_SECRET', '**************************************************');

define('LOCATION_BASE', 'http://php-oauth-sample.dwm.me');
define('TWITTER_CALLBACK', 'twitter_callback'); // Twitterからのコールバックページ

/************************************************************************/

// switch文から該当部分のみ抜粋

case TWITTER_LOGIN:

	// token を取得

	$auth = new TwitterOAuth(API_KEY, API_SECRET);
	$url = sprintf('%s/%s/', LOCATION_BASE, TWITTER_CALLBACK);
	$token = $auth->getRequestToken($url);

	// token が取得できたら Twitter へリダイレクトして終了
	//(認証後、登録したリダイレクトページに返ってくる)

	if(isset($token['oauth_token']) && isset($token['oauth_token_secret'])){

		// セッションに登録
		$_SESSION['oauth_token']        = $token['oauth_token'];
		$_SESSION['oauth_token_secret'] = $token['oauth_token_secret'];

		// 2つ目の引数が true だと
		// アプリケーションを承認済みユーザーは即座にcallbackページにリダイレクト
		// 未登録の場合は、承認画面を表示後、承認が終わるとリダイレクトされる
		// ただし、Twitter Apps で
		// Allow this application to be used to Sign in with Twitter
		// にチェックを入れておく事が必要

		$auth_url = $auth->getAuthorizeURL($_SESSION['oauth_token'], true);

		header("Location: " . $auth_url);
		return;

	}

	// token が取得できなければ、表示するメッセージを用意してbreak

	$message = 'エラーが発生しました。恐れ入りますが、もう一度やり直してください。';

	break;

Twitterの認証画面からリダイレクトされてきた場合

case TWITTER_CALLBACK:

	// 認証されていたら
	if(isset($_REQUEST['oauth_verifier']) && ('' != $_REQUEST['oauth_verifier'])){

		$auth = new TwitterOAuth(API_KEY, API_SECRET,
			$_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);

		$access_token = $auth->getAccessToken($_REQUEST['oauth_verifier']);

		$_SESSION['user_id']     = $access_token['user_id'];
		$_SESSION['screen_name'] = $access_token['screen_name'];

		// ログイン後、最初に表示するページヘリダイレクトして終了
		// URLにGETで oauth_token と oauth_verifier が含まれているので
		// それを消すために require でファイルを読むのではなくリダイレクトさせる

		// define('FIRST_PAGE', '/page_1/');

		header('Location: ' . LOCATION_BASE . FIRST_PAGE);
		return;

	}

	// 認証されなければ、表示するメッセージを用意してbreak

	$message = 'ログイン出来ません。Twitterアカウントを確認してください。';

	// 認証されていなければセッションの削除
	session_destroy();
	unset($_SESSION);

	break;

ログアウトをリクエストされた場合

case LOGOUT:

	// ログアウト完了のメッセージを用意

	$message = 'ログアウトしました。';

	// セッションの削除
	session_destroy();
	unset($_SESSION);

	break;

閲覧用のページが指定された場合

default:

	// define('FILE_PATTERN', FILES_PATH . '/files/%s.php');
	// .php ファイルは FILES_PATH/files/ にある

	$path = sprintf(FILE_PATTERN, $match[1]);

	// 指定のページが存在する場合

	if(file_exists($path)){

		// ログインしていれば

		if(isset($_SESSION['user_id'])){

			// そのページを表示して終了

			header('Content-Type: text/html; charset=UTF-8');
			require_once($path);
			return;

		}

		// ログインしていなければ、ログインを促すメッセージを準備

		$message = sprintf('%sをご覧になるにはログインが必要です。', $match[1]);

	}else{ // 指定のページが存在しない場合

		// ページが見つからない404ページを読み込んで終了

		header('HTTP/1.0 404 Not Found');

		$file_404 = sprintf(FILE_PATTERN, PAGE_404);
		require_once($file_404);
		return;

	}

	break;

大体、このような流れで処理しています。

動作はデモページ http://php-oauth-sample.dwm.me/ でご確認ください。

実際のファイルはhttp://php-oauth-sample.dwm.me/twitter_oauth_sample.zip からダウンロードできます。(ライブラリの twitteroauth は同梱していません)

最新のChromiumもChromeも動かない古いPCでChromiumを使うLinuxの設定

SSE2非搭載のパソコンでは、最新のChromium browserもGoogle Chromeもサポート対象外という事でバージョンアップすると起動できなくなります。UbuntuベースのLinux Mintで元のバージョンに戻したんですが、その作業に苦労したので方法をメモしておきます。また、再びバージョンアップされないようにする設定方法も書き残しておきます。古いPCでは設定しておいた方が安心です。

SSE2非搭載のパソコンでは、最新のChromium browserもGoogle Chromeも立ち上がらなくなるみたいです。サポート対象外という事でバージョンアップすると起動できなくなります。UbuntuベースのLinux Mintでapt-get upgradeをしたら立ち上がらなくなりました。

そこで、元のバージョンに戻したんですが、その作業に苦労したので方法をメモしておきます。また、再びバージョンアップされないようにする設定方法も書き残しておきます。古いPCでChromium browserを使われる場合は設定しておいた方が安心です。

事のあらまし

うちのフラッグシップマシンは富士通FMV DESKPOWER CE22DといってCPUにAMD Athlon™XP プロセッサ 2200+を搭載しています。富士通サイトによると大容量256MBメモリ搭載との事ですが、うちではさらに512MB追加して、なんと768MBもあります。

このフラッグシップマシンに OS Linix Mint 13(LTS: Long Term Support)を入れて動かしているわけです。ところがapt-get upgradeしたらChromium browserが動かなくなりました。アイコンをクリックしても反応がないので、コンソールで chromium-browser & と打つと「Illegal instruction」と表示されます。

調べてみたところ、Chromium browserも、それがベースのGoogle ChromeもSSE2非搭載のパソコンでは動かなくなったらしいです。

Linux Mint Forums • View topic – Updated Chromium browser not workingより

That’s it! Anybody else had this problem? Anybody know how to solve it? Although the AthlonXP doesn’t have SSE2 I’ve always been able to run earlier versions of the browser without trouble before. Opera and Firefox both run fine. Any experts out there know how to fix this? Could it be down to a hardware problem? Any help or advice would be very welcome.

Googleによる翻訳(訳文のまま)

以上です!誰もが他にこのような問題を持っていた?誰でもそれを解決する方法を知っている? AthlonXPのがSSE2を持っていませんが、私は常に前に問題なくブラウザの以前のバージョンを実行することができました。 OperaとFirefoxは両方問題なく動作。そこに任意の専門家がこの問題を解決する方法を知っている?それがダウンしてハードウェアの問題になるだろうか?すべてのヘルプやアドバイスは非常に歓迎されるでしょう。

Chromiumの便利なところは、他のパソコンでChromiumやGoogle Chromeを立ち上げても、ログインすればお気に入りが保存されているという点。我が家のフラッグシップマシンのLinuxでChromiumに登録したブックマークが、他のWindows PCで立ち上げたGoogle Chromeで、そのまま使えるというスグレモノです。

さらに恐ろしいことにいろいろなサイトへのログインパスワードも保存されていて、はじめて使うパソコンでサイトを開いてもパスワードが当たり前のように入力されています。これが便利なんですが、グーグルに情報を抜かれているという懸念もあります。(Google Syncというサービスのようです)

そんなChromiumですが、我が家のフラッグシップマシンで立ち上がらないと見たいページがどこにあるのかわかりません。firefoxなど他のブラウザは立ち上がるのでWebは見られますが、使い慣れていないブラウザだと、お気に入りも登録してないし不便です。

そこで、Chromiumを古いバージョンに戻すことにしました。これが結構大変でした。といっても、知らないことを調べるのが大変だったのであって、作業そのものは大した量ではありません。

apt-getでバージョンを指定してインストールする(失敗)

最初にやったのはapt-getで古いバージョンに戻すという作業。ただ、これは rollback する方法が見つからなかったので、一旦入れてしまった新しいChromium browserを削除して、古いバージョンを指定してインストールという事に挑戦しました。しかしこれは失敗します。

参考までにrollbackとは次のような意味です。

ロールバックとは 【 rollback 】 – 意味/解説/説明/定義 : IT用語辞典より

データベースに障害が発生したときに、記録してあるチェックポイントにまでデータを巻き戻して、改めて処理を開始すること。バックアップ時のデータは再現されるが、それ以降に行った処理は失われる。主に、データベースの論理的障害に対して用いられる。

現在インストールされているバージョンを調べる

まず、今入っているバージョンがわからないとそれより古いバージョンがわからないので、コンソールで dpkg -l | grep chromium と実行します。これでインストールされているすべてのパッケージから chromium を含むものを抽出します。

dpkg -l は debian系Linuxでインストール済みのパッケージをすべて表示するコマンドです。その結果をUNIX系のOSで使えるパイプ | にかけて、grep コマンドで chromium を含むものだけ抽出して表示しています。

下の例は、復旧後の現在の状態です。実際に削除したバージョンは 36.0.1985.125-0ubuntu1.12.04.0 です。

$ dpkg -l | grep chromium
ii  chromium-browser                       32.0.1700.107-0ubuntu0.12.04.1~20140204.866.1 Chromium browser
ii  chromium-browser-l10n                  32.0.1700.107-0ubuntu0.12.04.1~20140204.866.1 chromium-browser language packages
ii  chromium-codecs-ffmpeg                 32.0.1700.107-0ubuntu0.12.04.1~20140204.866.1 Free ffmpeg codecs for the Chromium Browser

この時、先頭に i と表示されたものが現在インストールされているものです。先頭に r と表示された場合は既に削除されたもので、h の場合はホールドされているものという意味です。

これで、バージョンが32.0.1700.107-0ubuntu0.12.04.1~20140204.866.1の3つのパッケージ、chromium-browser、chromium-browser-l10n、chromium-codecs-ffmpegがインストールされていることがわかります。(繰り返しますが実際に削除したのは 36.0.1985.125-0ubuntu1.12.04.0 で、上の例は復旧後の現在コマンドを打ち込むとこうなるという例です)

インストールされている動かないバージョンを削除する

apt-getでアップグレードする場合なら、古いファイルを削除しないでも自動で入れ替えてくれますが、今回はダウングレードなのでトラブルが起きないように念の為、今入っているバイナリーは事前にアンインストールしておくことにしました。

sudo apt-get remove chromium-browser chromium-browser-l10n chromium-codecs-ffmpeg

これで、削除できたはずなのですがもういちど dpkg -l | grep chromium で確認するとまだ残っていました。そこで dpkg で削除を試みます。

dpkg -r chromium-browser chromium-browser-l10n chromium-codecs-ffmpeg

そうすると,必要なら –purge を使えというようなメッセージが出たので –purge オプションで全部削除しました。設定ファイルが残っていたのが原因です。

dpkg -r パッケージ名 (設定ファイルは残して実行ファイルを削除する)
dpkg –purge パッケージ名 (設定ファイルも含め全てのファイルを消去する)

設定ファイルは残っていても問題ないかと思いましたが、ブックマークは保存されているわけだし、あくまで念の為に削除しておきました。ただし、復旧後に再設定は必要になります。

再インストール後、パスワードが保存できなくなった場合は設定画面で、一度「このユーザーを削除」を実行します。警告が出ますが構わずに削除して、再び同じユーザーでログインすればパスワードが自動入力されるようになります。

chromiumの設定画面

インストールできるバージョンを調べる

今入っているバージョンがわかったので、それより古いバージョンを入れればいいわけですが、やり方がわかりません。そこで、参考にしたのがこちらのサイトです。

apt-getで特定のバージョンをインストールする – Ryoの開発日記

今使っているシステムに、どのバージョンのバイナリーが入れられるのかは apt-cache showpkg パッケージ名 でわかるらしいです。

実際に apt-cache showpkg chromium-browser と打ってみました。非常に見にくいのですが、36.0.1985.125-0ubuntu1.12.04.0~pkg897 と 32.0.1700.107-0ubuntu0.12.04.1~20140204.866.1 なら入るみたいです。動かなかったのが 36.0.1985.125-0ubuntu1.12.04.0 なのだから 32.0.1700.107-0ubuntu0.12.04.1 にすればいいようです。

$ apt-cache showpkg chromium-browser
Package: chromium-browser
Versions: 
36.0.1985.125-0ubuntu1.12.04.0~pkg897 (/var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_precise-updates_universe_binary-i386_Packages) (/var/lib/apt/lists/security.ubuntu.com_ubuntu_dists_precise-security_universe_binary-i386_Packages)
 Description Language: 
                 File: /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_precise_universe_binary-i386_Packages
                  MD5: f899058e5c597ae295f6ef23b467dade
 Description Language: en
                 File: /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_precise_universe_i18n_Translation-en
                  MD5: f899058e5c597ae295f6ef23b467dade
 Description Language: ja
                 File: /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_precise_universe_i18n_Translation-ja
                  MD5: f899058e5c597ae295f6ef23b467dade

32.0.1700.107-0ubuntu0.12.04.1~20140204.866.1 (/var/lib/dpkg/status)
 Description Language: 
                 File: /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_precise_universe_binary-i386_Packages
                  MD5: f899058e5c597ae295f6ef23b467dade
 Description Language: en
                 File: /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_precise_universe_i18n_Translation-en
                  MD5: f899058e5c597ae295f6ef23b467dade
 Description Language: ja
                 File: /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_precise_universe_i18n_Translation-ja
                  MD5: f899058e5c597ae295f6ef23b467dade

18.0.1025.151~r130497-0ubuntu1 (/var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_precise_universe_binary-i386_Packages)
 Description Language: 
                 File: /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_precise_universe_binary-i386_Packages
                  MD5: f899058e5c597ae295f6ef23b467dade
 Description Language: en
                 File: /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_precise_universe_i18n_Translation-en
                  MD5: f899058e5c597ae295f6ef23b467dade
 Description Language: ja
                 File: /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_precise_universe_i18n_Translation-ja
                  MD5: f899058e5c597ae295f6ef23b467dade


Reverse Depends: 
  pepflashplugin-installer,chromium-browser 23.0
  chromium-codecs-ffmpeg,chromium-browser 4.0.203.0~
  pepflashplugin-installer,chromium-browser 23.0
  djview-plugin,chromium-browser
  djview-plugin,chromium-browser
  chromium-codecs-ffmpeg-extra,chromium-browser 4.0.203.0~
  chromium-codecs-ffmpeg,chromium-browser 4.0.203.0~
  chromium-browser-l10n,chromium-browser
  chromium-browser-l10n,chromium-browser 36.0.1985.125-0ubuntu1.12.04.0~pkg897.1~
  chromium-browser-l10n,chromium-browser 36.0.1985.125-0ubuntu1.12.04.0~pkg897
  chromium-browser-l10n,chromium-browser
  chromium-browser-l10n,chromium-browser 32.0.1700.107-0ubuntu0.12.04.1~20140204.866.1.1~
  chromium-browser-l10n,chromium-browser 32.0.1700.107-0ubuntu0.12.04.1~20140204.866.1
  chromium-browser-dbg,chromium-browser 36.0.1985.125-0ubuntu1.12.04.0~pkg897
  mythbuntu-desktop,chromium-browser
  mozplugger,chromium-browser
  lxde-core,chromium-browser
  lxde,chromium-browser
  lubuntu-desktop,chromium-browser
  gecko-mediaplayer,chromium-browser 4.0
  djview-plugin,chromium-browser
  djview-plugin,chromium-browser
  chromium-codecs-ffmpeg-extra,chromium-browser 4.0.203.0~
  chromium-codecs-ffmpeg,chromium-browser 4.0.203.0~
  chromium-browser-l10n,chromium-browser 18.0.1025.151~r130497-0ubuntu1
  chromium-browser-dbg,chromium-browser 18.0.1025.151~r130497-0ubuntu1
Dependencies: 
36.0.1985.125-0ubuntu1.12.04.0~pkg897 - gconf-service (0 (null)) libasound2 (2 1.0.23) libatk1.0-0 (2 1.12.4) libc6 (2 2.15) libcairo2 (2 1.6.0) libcap2 (2 2.10) libcomerr2 (2 1.01) libcups2 (2 1.4.0) libdbus-1-3 (2 1.2.14) libexpat1 (2 1.95.8) libfontconfig1 (2 2.8.0) libfreetype6 (2 2.3.9) libgcc1 (2 1:4.1.1) libgconf-2-4 (2 2.31.1) libgcrypt11 (2 1.4.5) libgdk-pixbuf2.0-0 (2 2.22.0) libglib2.0-0 (2 2.26.0) libgssapi-krb5-2 (2 1.6.dfsg.2) libgtk2.0-0 (2 2.24.0) libk5crypto3 (2 1.6.dfsg.2) libkrb5-3 (2 1.6.dfsg.2) libnspr4 (2 1.8.0.10) libnss3 (2 3.14.3) libpango1.0-0 (2 1.22.0) libstdc++6 (2 4.6) libudev0 (2 147) libx11-6 (2 2:1.4.99.1) libxcomposite1 (2 1:0.3-1) libxcursor1 (4 1.1.2) libxdamage1 (2 1:1.1) libxext6 (0 (null)) libxfixes3 (0 (null)) libxi6 (2 2:1.2.99.4) libxrandr2 (2 2:1.2.99.2) libxrender1 (0 (null)) libxss1 (0 (null)) libxtst6 (0 (null)) zlib1g (2 1:1.1.4) xdg-utils (0 (null)) chromium-codecs-ffmpeg-extra (18 0.6) chromium-codecs-ffmpeg (2 0.6) dpkg (2 1.15.6~) chromium-browser-l10n (0 (null)) chromium-browser-inspector (0 (null)) chromium-browser-inspector (0 (null)) 
32.0.1700.107-0ubuntu0.12.04.1~20140204.866.1 - gconf-service (0 (null)) libasound2 (2 1.0.23) libatk1.0-0 (2 1.12.4) libc6 (2 2.15) libcairo2 (2 1.6.0) libcap2 (2 2.10) libcomerr2 (2 1.01) libcups2 (2 1.4.0) libdbus-1-3 (2 1.2.14) libexpat1 (2 1.95.8) libfontconfig1 (2 2.8.0) libfreetype6 (2 2.3.9) libgcc1 (2 1:4.1.1) libgconf-2-4 (2 2.31.1) libgcrypt11 (2 1.4.5) libgdk-pixbuf2.0-0 (2 2.22.0) libglib2.0-0 (2 2.18.0) libgnutls26 (2 2.12.6.1-0) libgssapi-krb5-2 (2 1.6.dfsg.2) libgtk2.0-0 (2 2.24.0) libk5crypto3 (2 1.6.dfsg.2) libkrb5-3 (2 1.6.dfsg.2) libnspr4 (2 1.8.0.10) libnss3 (2 3.14.3) libpango1.0-0 (2 1.22.0) libstdc++6 (2 4.6) libudev0 (2 147) libx11-6 (2 2:1.4.99.1) libxcomposite1 (2 1:0.3-1) libxcursor1 (4 1.1.2) libxdamage1 (2 1:1.1) libxext6 (0 (null)) libxfixes3 (0 (null)) libxi6 (2 2:1.2.99.4) libxrender1 (0 (null)) libxss1 (0 (null)) libxtst6 (0 (null)) zlib1g (2 1:1.1.4) xdg-utils (0 (null)) chromium-codecs-ffmpeg (18 0.6) chromium-codecs-ffmpeg-extra (2 0.6) dpkg (2 1.15.6~) chromium-browser-l10n (0 (null)) chromium-browser-inspector (0 (null)) chromium-browser-inspector (0 (null)) 
18.0.1025.151~r130497-0ubuntu1 - gconf-service (0 (null)) libasound2 (2 1.0.23) libbz2-1.0 (0 (null)) libc6 (2 2.15) libcairo2 (2 1.6.0) libcups2 (2 1.4.0) libdbus-1-3 (2 1.2.14) libexpat1 (2 1.95.8) libfontconfig1 (2 2.8.0) libfreetype6 (2 2.3.9) libgcc1 (2 1:4.1.1) libgconf-2-4 (2 2.31.1) libgcrypt11 (2 1.4.5) libgdk-pixbuf2.0-0 (2 2.22.0) libglib2.0-0 (2 2.20.0) libgtk2.0-0 (2 2.24.0) libnspr4 (2 1.8.0.10) libnss3 (2 3.12.3) libpango1.0-0 (2 1.20.0) libpng12-0 (2 1.2.13-4) libstdc++6 (2 4.6) libudev0 (2 147) libx11-6 (0 (null)) libxext6 (0 (null)) libxfixes3 (0 (null)) libxrender1 (0 (null)) libxss1 (0 (null)) zlib1g (2 1:1.2.3.3.dfsg) libnss3-1d (2 3.12.3) xdg-utils (0 (null)) chromium-codecs-ffmpeg (18 0.6) chromium-codecs-ffmpeg-extra (2 0.6) dpkg (2 1.15.6) chromium-browser-l10n (0 (null)) chromium-browser-inspector (0 (null)) chromium-browser-inspector (0 (null)) 
Provides: 
36.0.1985.125-0ubuntu1.12.04.0~pkg897 - www-browser chromium-browser-inspector 
32.0.1700.107-0ubuntu0.12.04.1~20140204.866.1 - www-browser chromium-browser-inspector 
18.0.1025.151~r130497-0ubuntu1 - www-browser chromium-browser-inspector 
Reverse Provides: 

上記サイトによると、バージョンを指定してインストールするには、sudo apt-get install パッケージ名=バージョン というようにパッケージ名の後にイコールでバージョンをつければいいみたいです。

実際にsudo apt-get install chromium-browser=32.0.1700.107-0ubuntu0.12.04.1としてみたのですが、バージョンが見つからない旨のエラーが返ってきます。

バージョン指定の仕方が違うのかと、
sudo apt-get install chromium-browser=32.0.1700.107 や
sudo apt-get install chromium-browser=32.0 など右から順に一区切りづつ削っていき、更には
sudo apt-get install chromium-browser=32.0.1700.107-0ubuntu0.12.04.1~20140204.866.1.1~ など、右に追加することも試しましたが、結果は全部同じでした。

コマンドのオプションは正しいのだと思いますが、アップデートした際にどうやらリポジトリが変わったようです。指定したバージョンがリポジトリになければ当然、コマンドは失敗します。

.debパッケージを手動ダウンロードしてインストール(成功)

apt で入れられなくてもパッケージさえ手に入れば dpkg でインストールできます。ということでソースの在り処を検索しました。入れるものはわかっているので、そのまま chromium-browser 32.0.1700.107-0ubuntu0.12.04.1 というキーワードで検索したら chromium-browser 32.0.1700.107-0ubuntu0.12.04.1 が見つかりました。

i386 build of chromium-browser 32.0.1700.107-0ubuntu0.12.04.1~20… : stage for security updates : “Canonical Chromium Builds” team

このページのいちばん下に Built files という項目があって同時にインストールが必要なものも全部ダウンロードできます。今回ダウンロードしたのは下の中で赤文字の4つです。dbgを含むものはデバッグ用(開発用)なので必要ありません。

chromium-browser-dbg_32.0.1700.107-0ubuntu0.12.04.1~20140204.866.1_i386.deb (543.9 MiB)
chromium-browser-l10n_32.0.1700.107-0ubuntu0.12.04.1~20140204.866.1_all.deb (3.1 MiB)
chromium-browser_32.0.1700.107-0ubuntu0.12.04.1~20140204.866.1_i386.deb (33.7 MiB)
chromium-codecs-ffmpeg-dbg_32.0.1700.107-0ubuntu0.12.04.1~20140204.866.1_i386.deb (625.6 KiB)
chromium-codecs-ffmpeg-extra-dbg_32.0.1700.107-0ubuntu0.12.04.1~20140204.866.1_i386.deb (1.4 MiB)
chromium-codecs-ffmpeg-extra_32.0.1700.107-0ubuntu0.12.04.1~20140204.866.1_i386.deb (695.8 KiB)
chromium-codecs-ffmpeg_32.0.1700.107-0ubuntu0.12.04.1~20140204.866.1_i386.deb (361.6 KiB)

4つのファイルをダウンロードして、どこか1つのフォルダの中にまとめます。そして、そのディレクトリの中で、次のコマンドを実行すればインストールできます。

sudo dpkg -i chromium-browser-l10n_32.0.1700.107-0ubuntu0.12.04.1~20140204.866.1_all.deb chromium-browser_32.0.1700.107-0ubuntu0.12.04.1~20140204.866.1_i386.deb chromium-codecs-ffmpeg-extra_32.0.1700.107-0ubuntu0.12.04.1~20140204.866.1_i386.deb chromium-codecs-ffmpeg_32.0.1700.107-0ubuntu0.12.04.1~20140204.866.1_i386.deb

この時、大切なのは4つ全部を同時にインストールするという事です。

4つのファイルはそれぞれお互いに必要なので、どれかがインストールされていない場合は、必要なファイルがないというエラーが出ます。なので4つまとめずに、次のようにひとつづつ順番にインストールしようとするとエラーになります。

sudo dpkg -i chromium-browser-l10n_32.0.1700.107-0ubuntu0.12.04.1~20140204.866.1_all.deb
sudo dpkg -i chromium-browser_32.0.1700.107-0ubuntu0.12.04.1~20140204.866.1_i386.deb
sudo dpkg -i chromium-codecs-ffmpeg-extra_32.0.1700.107-0ubuntu0.12.04.1~20140204.866.1_i386.deb
sudo dpkg -i chromium-codecs-ffmpeg_32.0.1700.107-0ubuntu0.12.04.1~20140204.866.1_i386.deb

4つインストールしましたが、 dpkg -l で確認すると先ほどの3つだけが表示されます。chromium-codecs-ffmpeg-extra は chromium-codecs-ffmpeg とマージされたのか、不要だったのかもしれません。

apt-get upgrade でバージョンアップしないように設定する

これで、無事に起動できる chromium に戻りました。ただ、このままだと次に apt-get upgrade をした時、またバージョンアップされてしまいます。

そこで、それを抑制する設定をします。参考になったのは次のサイトです。

Debian(Ubuntu)で apt-get upgrade で自動更新したくない場合の対応 | レンタルサーバー・自宅サーバー設定・構築のヒント

上記のサイトで、2つの方法が非常に詳しく説明されています。そのうちのひとつ目を私は実行しました。

$ echo chromium-browser hold | sudo dpkg --set-selections
$ echo chromium-browser-l10n hold | sudo dpkg --set-selections
$ echo chromium-codecs-ffmpeg hold | sudo dpkg --set-selections

これで apt-get upgrade をしても、3つのファイルは保留されて、アップグレードされなくなりました。

$ sudo apt-get update
$ sudo apt-get upgrade
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージは保留されます:
  chromium-browser chromium-browser-l10n chromium-codecs-ffmpeg
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 3 個

amazonで中古パソコン検索

WordPress “Custom Permalinks”で引っ越したブログのURLを維持する

移転前のURLを元のブログから読み込んで、インポートした移転先ページのURLパスを同じように書き替える方法です。WordPressにはCustom Permalinksというプラグインがあって、これを使うとすべてのURLを自由に変更できます。ただ、その場合問題となるのが修正URLの入力です。1ページ毎に入力してURLを直していたんではキリがありません。そこでそれを一気に自動入力してくれるプラグインを作ってみました。

このスクリプトはPHPのバージョンが5.3以上でないと動きません。近々修正します。

WordPressにはCustom Permalinksというプラグインがあって、これを使うとすべてのURLを自由に変更できます。

もちろんドメインは変更できませんが、ドメイン以降のURLは自由に変えられます。

Custom Permalinksの設定は投稿の編集画面で出来ます。Custom Permalinksの設定画面

ただし、複数のページで同じURLを登録できてしまうという欠点もあります。注意すれば問題ないのですが、この世に同じURLのページは複数存在しないのが鉄の掟。同じURLを複数登録すれば、当然正しく表示されません。

このCustom Permalinksを使えば、引っ越した先のWordPressで、引越し前のブログと同じパスを維持できます。

ただ、その場合問題となるのが修正URLの入力です。1ページ毎に入力してURLを直していたんではキリがありません。

という事で、移転前のURLを元のブログから読み込んで、インポートした移転先ページのURLを書き替えるプラグインを作ってみました。

old permalinks keeper

自作プラグインの名前は、old permalinks keeper としました。

このプラグインは、インポートしたページのURLを読み込んでCustom Permalinksに登録するだけのプラグインです。登録後、old permalinks keeperは削除して構いませんが、Custom Permalinksを無効にするとURLは変更前に戻ってしまいます。

ダウンロード: old permalinks keeper

old permalinks keeperの使い方

old permalinks keeperを使う前に必ずCustom Permalinksをインストールして、有効化してください。

Custom Permalinksはプラグインの検索からインストールできます。
Custom Permalinks

old permalinks keeperの方は、検索しても出て来ません。ここからダウンロードして、圧縮されているファイルをローカルで展開します。

展開した状態で、フォルダごとまとめて”wp-content/plugins”にFTPでアップロードしてください。

アップロードが終わればプラグイン一覧に”old permalinks keeper”の名前があるので有効化します。

有効化できるとサイドバーの「設定」の中に「インポートページのURLを設定」という項目が増えていますので、そこへ移動してください。

opk2

移動すると次のように表示されます。

opk3

旧サイトのURL」には移転前のブログのトップページURLを入力してください。
例)http://www.example.com/ (一番最後のスラッシュはあってもなくても対応します)

記事一覧ページ最後のURL」は、トップページからたどれる記事一覧の最後のURLです。
例)http://www.example.com/index-123.html (省略せずに全部書く)

Seesaa Blog だと、http://xxx.seesaa.net/index-10000.html のように「そんなにたくさんないし」という位大きな数字を入れると自動で最後のページに飛びます。ただしブラウザのアドレスバーの表示は http://xxx.seesaa.net/index-10000.html のままなので、一歩進んで一歩下がるようなカンジでアドレスバーを変更させて、URLを取得してください。

まだトップページだけで収まっているページ数の場合は「記事一覧ページ最後のURL」は空欄にします。

個別ページURLの末尾から削除」は、URLがたとえば .html で終わっているけど、それいらないという時に書きこんでください。書き込んだ文字列と同じ末尾だった場合、それが削除されます。消したいものがない場合は空欄にします。

個別ページへのリンク識別タグ」は、記事一覧ページの中で、どこが個別ページへのリンクなのかを識別するために必要です。通常、記事一覧ページで各記事のタイトルをクリックすれば、そのページに移動するリンクになっています。そのタイトルリンクの開始タグをそのまま書きこんでください。

次のようなソースなら、<h1 class=”entry-title”> と書き込みます。
<h1 class=”entry-title”><a class=”new_link” href=”http://xxx.seesaa.net/article/xxxxx.html” rel=”bookmark”>かぎ針編みの湯たんぽカバー</a></h1>

入力が終わったら「送信」ボタンを押します。

送信ボタンを押すと、次のような表示に変わります。

opk4

この例では、現在のURL archives/2540 が article/301807656 に変更されます。移転前のURLが article/301807656.html なので、そこから .html を削除した形です。この .html は前のページで「個別ページURLの末尾から削除」の項目に書きこまなければ削除されません。

もし、同じタイトルのページが複数あった場合には次のように表示されます。そのページはURL変更の対象から外れますので、あとから個別に訂正してください。

opk5

また、公開していない下書きページのURLは取得できないので変更されません。必要ならプラグインを使う前に移転前のブログの下書き記事を公開するか、後から手動でURLを修正してください。

確認したら「送信」ボタンを押してください。次のように表示されて終了です。

opk6

最初に書いた通り、old permalinks keeperは削除して構いませんが、Custom Permalinksを無効にするとURLは変更前に戻ってしまうので注意してください。

PHPのmb_convert_encodingを使って文字コードを検出する方法

読み込んだ文字列の文字コードがわからない場合はどうすればいいか?次の方法を試してみたら、うまく行きました。PHPには文字コードを変換してくれるmb_convert_encodingという関数があります。元の文字コードがわからなくても自動判別をしてくれるようになっているんですが、それでうまく判別できない時に mb_convert_encoding 関数を利用して、文字コードを調べる方法です。

PHPには文字コードを変換してくれるmb_convert_encodingという関数があります。

元の文字コードがわからなくても自動判別をしてくれるようになっているんですが、それでうまく判別できない時に mb_convert_encoding 関数を利用して、文字コードを調べる方法です。

mb_convert_encoding 関数

string mb_convert_encoding( $str, $to_encoding, $from_encoding );

$str に変換したい文字列
$to_encoding に変換後の文字コード
$from_encoding に変換前の文字コード を指定します。

$from_encoding には配列またはカンマ区切りの文字列で文字コードを複数指定できます。複数指定した場合は順番に試していって該当する文字コードが適用されます。

例えば、Shift_JISのWebページを $buff に読み込んで($buffの中にShift_JISの文字列)

$string = mb_convert_encoding( $buff, ‘UTF-8’, ‘SJIS’ );

とすれば、$string にはUTF-8に変換されたWebページが入ります。
(PHPのマニュアルにはSJISと書いてありますが、試してみたらShift_JISでも大丈夫でした)

変換前の文字コードがわからない場合は、$from_encoding を省略すると、そこに mb_internal_encoding() の結果が割り当てられます。(内部文字エンコーディングが割り当てられます)

また言語設定が Japanese の場合は、$from_encoding を auto にすると “ASCII,JIS,UTF-8,EUC-JP,SJIS” が割り当てられます。(PHP: サポートされる文字エンコーディング – Manual

$from_encoding を省略したり、auto を指定したりしてうまくいけばいいんですが、うまくいかない場合は $from_encoding を正しく指定しなければいけません。

読み込んだ文字列の文字コードがわからない場合はどうすればいいか?

次の方法を試してみたら、うまく行きました。$str に変換したいけど文字コードがわからない文字列が入っています。

$to_encoding = 'UTF-8';
$from_encoding = null;

foreach(array('UTF-8','SJIS','EUC-JP','ASCII','JIS') as $charcode){
	if(mb_convert_encoding($str, $charcode, $charcode) == $str){
		$from_encoding = $charcode;
		break;
	}
}

if(!$from_encoding){
	echo 'ERROR: 文字コードが判別出来ませんでした。';
	return;
}

if($to_encoding == $from_encoding){
	echo $str;
	return;
}

echo mb_convert_encoding($str, $to_encoding, $from_encoding);

mb_convert_encoding($str, $charcode, $charcode) == $str

例えば $str が ‘UTF-8’ だった場合、mb_convert_encoding($str, ‘UTF-8’, ‘UTF-8’) の結果は、元の $str と同じになるはずです。

そうなった場合には、$from_encoding に’UTF-8’を代入して break します。

foreach を抜けても $from_encoding が null のままだったなら、array(‘UTF-8′,’SJIS’,’EUC-JP’,’ASCII’,’JIS’) の中には該当文字コードがなかった事になるのでエラーを表示して終了します。

もし、$from_encoding と $to_encoding が同じなら、変換の必要がないので、そのまま $str を表示します。

そうでない場合は $str を ‘UTF-8’ に変換して表示します。

文字列判別関数を作っておくと便利

たとえば、次のような文字列判別関数を作っておくと便利です。

function hoge($str){
	foreach(array('UTF-8','SJIS','EUC-JP','ASCII','JIS') as $charcode){
		if(mb_convert_encoding($str, $charcode, $charcode) == $str){
			return $charcode;
		}
	}

	return null;
}