グラスフェッドバターて何?バターコーヒーダイエットの方法

バターコーヒーダイエットを実践して75日で36キロも痩せた方がいるんだとか。バターコーヒーダイエットとは朝食の代わりにグラスフェッドバターを入れたコーヒーを飲むこと。ここで気になるのがグラスフェッドバターです。普通のバターと違うんでしょうか?

今アメリカではバターコーヒーダイエットが人気なんだそうです。

参考記事:たったひとさじ!米で大ブーム「朝コーヒーにバター」 – 健康ダイエット – Yahoo!ヘルスケア

このバターコーヒーダイエットを実践して75日で36キロも痩せた方がいるんだとか。どんなダイエット方法なんでしょう。

朝食にグラスフェッドバターを入れた Bulletproof Coffee

バターコーヒーダイエットとは毎朝、朝食の代わりにグラスフェッドバターを入れた Bulletproof Coffee を飲むこと。

グラスフェッドバターについては後で説明しますが、Bulletproof Coffee は日本語に訳すと「防弾コーヒー」という意味だそうです。ブラックコーヒーにグラスフェッドバターを入れて飲むのが Bulletproof Coffee です。

バターコーヒーブームの始まりはシリコンバレーの起業家であったデイブ・アスプレイ氏で、チベット旅行中にヤクの乳のバターを入れるチベット茶を知って、それをヒントにバターコーヒーを思いついたんだとか。

参考記事:アメリカで話題、バター入りコーヒー 脳活性化やダイエットに効果との声も | ニュースフィア

Bulletproof Coffee の味は、コーヒーにリッチでクリーミーな風味が加わった感じなんだそうです。

バターコーヒーの作り方

バターコーヒー(Bulletproof Coffee)の作り方は簡単です。

YouTuben にデイブ・アスプレイさん自身が作り方を説明している英語のオフィシャルビデオがありました。

How to Make Bulletproof® Coffee (The Official Video)

グラスフェッドバターとは?

バターを入れたコーヒーなんて胸焼けがするような気がします。むしろバターからカロリーを多く吸収してしまうんではないでしょうか。

でもアメリカのセレブに大流行ということは何か理由があるのでしょう。ここで気になるのがグラスフェッドバターです。普通のバターと違うんでしょうか?

グラスフェッドというのは家畜の飼育方法のひとつで、牧草だけで家畜を育てることをグラスフィーディングといいます。

一般的な家畜の飼育はグレインフェッドと呼びます。

一般的な飼育(グレインフィーディング)
トウモロコシや麦などの穀物をエサにする。
グラスフェッド飼育(グラスフィーディング)
牧草だけで育てる。

アルプスの少女ハイジの世界がグラスフィーディングというイメージでしょうか。

グラスフィーディングで育った牛の乳から作られたバターには、コレステロールや中性脂肪の減量に効果があるといわれる不飽和脂肪酸が豊富に含まれています。これが Bulletproof Coffee のキモなんですね。

不飽和脂肪酸は魚介類やオリーブオイル、亜麻仁油などにも含まれている良質の油ですが、脂肪の中の飽和脂肪酸と置き換わることでダイエット効果があるといいます。

マグロのトロを生のさしみで食べても口溶けがよくておいしいのは高度不飽和脂肪酸を多く含むからだそうで、それと同じ効果がグラスフェッドバターにもあるようです。

グラスフェッドバターを入手するには

ということなら早速グラスフェッドバターを買ってみよう。と思って調べたんですがなかなか売っていないです。

インターネットの通販での結果は下のような感じでした。でも、どれもグラスフェッドバターとは書かれていないので違うんだと思います。

アメリカだとグラスフェッドバターはパッケージにGrass-fedという表記があるそうです。

グラスフェッドバター。日本でも普及しそうなんですけど、牧場の方とか輸入業者さんで扱う人はいませんかね?いたら是非紹介させてもらいたいです。

画像が縦長か横長か調べて自動でクラス名をつけるJavaScript

画像が横長なのか、縦長なのか、正方形なのかで分けて、それぞれクラス名を追加するJavaScriptを書いてみました。よく読んでもらっているページに「絶対はみ出さない画像!自動でサイズ調節するスタイルシート」というのがあるんですが、これに関連したことで「スマホで見ても、すべての画像が横幅いっぱいになって、はみ出さなくなったんですが、縦長の写真だけサイズを変えられないか」という質問を受けました。

うちでよく読んでもらっているページに「絶対はみ出さない画像!自動でサイズ調節するスタイルシート」というのがあるんですが、これに関連したことで質問を受けました。

「スマホで見ても、すべての画像が横幅いっぱいになって、はみ出さなくなったんですが、縦長の写真だけサイズを変えられないか」という内容です。

画像が横長なのか、縦長なのか、正方形なのかで分けて、それぞれクラス名をつければいいんですが、もうすでに大量のページがある場合は全ページを修正しなくてはいけないし、そうでないとしても毎回画像毎にクラス名を割り当てるのは大変です。

そこで、自動でクラス名を追加するJavaScriptを書いてみました。

画像のサイズを調べてクラス名を割り当てるJavaScript

今回、参考になったのは次のページです。これが非常に素晴らしい内容で、作業がとても簡単になりました。ありがとうございます。

[JavaScript] 画像のオリジナル サイズを取得する 最もシンプルな方法 – こじょらぼ

で、実際に作ったソースはこんなカンジです。HTMLのどこに追加しても動きますが、<head> 部分の終わりにある「</head> の直前」につけるのがいいと思います。

<script>
(function(){
	function image_class(){
		var img = new Image();
		var images = document.querySelectorAll('img');

		for(var i=0;i<images.length;i++){
			img.src = images[i].src;

			if(img.width < img.height){
				images[i].className += ' vertically_long';
				images[i].parentNode.className += ' vertically_long_outer';
			}else if(img.width > img.height){
				images[i].className += ' horizontally_long';
				images[i].parentNode.className += ' horizontally_long_outer';
			}else{
				images[i].className += ' square';
				images[i].parentNode.className += ' square_outer';
			}
		}
	}

	if(window.addEventListener){
		window.addEventListener('load', image_class, false);
	}else if(window.attachEvent){
		window.attachEvent('onload', image_class);
	}
})();
</script>

これでページ読み込み完了後
縦長の画像には vertically_long というクラス名が
横長の画像には horizontally_long というクラス名が
正方形には square というクラス名が追加されます。

さらに
vertically_long の親ノードには vertically_long_outer
horizontally_long の親ノードには horizontally_long_outer
square の親ノードには square_outer
というクラス名が追加されます。

このクラス名毎にスマホ専用スタイルシートを書けば、好きなように表示を変えられます。

ただ、お気づきかと思いますが同じ親ノードの中に、縦長と横長の両方の画像があった場合、両方のクラス名が親ノードに追加されるので、その部分は思ったように表示されないと思います。

サンプルページ

このスクリプトを適用していない場合と、適用した場合のサンプルページを用意しました。2つのページの違いはスクリプトをつけているか、いないかだけです。

スマホで見ても絶対にはみ出しませんが、スクリプトを適用したページだけ、縦長と正方形の表示が変わります。

スクリプトを適用していない場合
http://dwm.me/download/vertical_and_horizontal_ratio_js_sample_1.html
スクリプトを適用した場合
http://dwm.me/download/vertical_and_horizontal_ratio_js_sample_2.html

サンプルページのスタイルシートは次のようになっています。

<style type="text/css">

/* これで画像は絶対にはみ出さない */
img {
	max-width: 100%;
	height: auto;
}

/* 縦長の画像を真ん中に配置する */
.vertically_long_outer {
	text-align: center;
}

/* 縦長の画像のサイズを横幅120ピクセルに固定 */
/* 高さは自動で調整 */
.vertically_long {
	width: 120px;
	height: auto;
}

/* 正方形の画像を右寄せで配置 */
.square_outer {
	text-align: right;
}

/* 正方形画像の高さを200ピクセル、幅も200ピクセルに固定 */
.square {
	width: 200px;
	height: 200px;
}

</style>

真ん中合わせにしたいのに、左寄せになってしまう場合は下のように変更してください。

変更前

.vertically_long {
	width: 120px;
	height: auto;
}

変更後

.vertically_long {
	width: 120px;
	height: auto;
	/*2行追加*/
	margin-left: auto;
	margin-right: auto;
}

2015年1月9日追記:今年になってSeesaaブログでの表示で縦の長さが固定されてしまい、表示がおかしくなったというご指摘がありました。その場合は width と height に !important を追加してください。


height: auto !important;

今後更に変更される場合があるので、width と height 以外もすべて !important を追加してもいいかもしれません。

これを、ページの本文にだけ適用させたくて、サイドバーなどそれ以外の部分には影響を与えたくない場合があると思います。

例えばSeesaaブログなら各ページの本文は #content .text の中にあるので、それをスタイルシートに追加してください。(同じSeesaaブログでも構成の違うテンプレートがあるようです。詳しくはコメント欄を参照してください。)

具体的に言うとこんなカンジになります。

<style type="text/css">

#content .text img {
	max-width: 100%;
	height: auto;
}

#content .text .vertically_long_outer {
	text-align: center;
}

〜〜以下省略〜〜

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

せっかく読みに来てくれた人に興味のないものを読ませてしまう。それって、読んでくれた人にとっても、書いた方にとっても、お互いに悲劇じゃないんですかね。だから、僕は読者は選ぶべきだと思っています。最近たまたま見たブログでこんなことが書いてありました。また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で中古パソコン検索