2012 1月 ITかあさん

ITかあさん

Twitpic×Twitter×WordPressで作る写真ブログ

1Tweetを1ページにする、お手軽ブログ

前々から『Twitterでの投稿をWordpressに反映させたい!』と思っていました。
もっと手軽に、もっと簡単なブログの更新方法は無いかと考えた結果、
『1Tweetを1ページにする、お手軽ブログ』を作りました。
また、どうせならTwitpicで投稿された内容も表示して、絵日記のような、写真日記を作りたかったのですが、ついに完成しました。

必要なもの

・wrodpress
・Mysql
・PHP
・Twitterアカウント
・Pear:MDB2

特徴と動作方法

あらかじめWordpressのインストールを完了させておく必要があります。
以下のスクリプトを設置したURLにアクセスされると、15件分のツイートをWordpressに1ツイート1記事にしてくれます。
重複登録回避で、最後に登録したデータと、新しいデータを比べて、最後に登録されたデータより日時が新しければ登録します。そうでなければ登録しません。
xmlが17件くらいしかツイートデータを拾ってくれなかったので、それ以上だと拾いきれないと思います。
Twitterでは短縮URL化されたものは、URLは元の短縮前のものに置き換わります。
写真の表示はTwitpicしか対応していません。
以下のスクリプトをどこかのWEBページにおいて、アクセスすると、書き込みを開始します。
正規表現でハッシュタグは削除されます。
ブログのタイトルはツイートのテキストの部分だけ。URL、ハッシュ、RTタグは正規表現で削除されます。
(けっこう重たいです)
なので、どこかのWEB環境において、Cronで定期実行してあげることで 自働で書き込みされるようにしてあげてください。
なお、Noticeエラー出ちゃってますが、書き込みには支障ないです。
何はともあれ最大の特徴は1ツイートを1ブログでTwitpicを表示できること。これで写真ブログになります。
あと、URLは元のURLに置き換えられているので、自分のブログのURL付きでツイートすれば、SEO効果も見込めると思います。

個人的に作ったものなので、動作の保障はしません。あくまで自己責任でお願いします。

require_once 'MDB2.php';//ライブラリのロード
//DSN
  $db = "mysql://ユーザー名:パスワード@localhost/データベース名?charset=utf8";
//接続
  $mdb2 =& MDB2::factory($db);
//フェッチモード設定
  $mdb2->setFetchMode(MDB2_FETCHMODE_ASSOC);
//SQL文発行
  $sqlStr = "select * from wp_posts order by post_date desc limit 1";
  $res = $mdb2->queryAll($sqlStr); 
$update = $res[0]['post_date'];//最終投稿の日付取得
//URL置き換えフォーマット
  function square($short_url){
  $h = get_headers($short_url,true);
  if(isset($h['Location'])){
  $long_url = $h['Location'];
  if(is_array($long_url)){
  $long_url = end($long_url);
  }
  }
  return $long_url;
  }
$contents = file_get_contents('http://twitter.com/statuses/user_timeline.xml?id=自分のTwitterアカウント');
//XMLをオブジェクトに変換
  $xml = simplexml_load_string($contents);
  //XMLオブジェクトを扱いやすいよう、通常の配列に一度変換を行う
  $arrayA = array();
for ($i = 0; $i <= 15; $i++) {
  $arrayA[$i]['title'] = (string)$xml->status->$i->text;
  $arrayA[$i]['updated'] = (string)$xml->status->$i->created_at;
  }
$twitter_array = array();
  foreach($arrayA as $val => $twitter){
  preg_match_all("/http:\/\/[a-z0-9\/\-_\.]+/i",$twitter['title'],$match);

foreach($match[0] as $match_url){
$URL = square($short_url = $match_url);//短縮化されたURLに一度アクセスをし、正規のURLを取得する処理
  $twitter_array[$val]['url'][] = $URL;
  }
$twitter['title'] = preg_replace("/http:\/\/[a-z0-9\/\-_\.]+/i","",$twitter['title']);
//RTタグを削除
  $twitter['title'] = preg_replace("/[QR]T ?@[a-z0-9_]+:?/i","",$twitter['title']);
//返信を削除
  $twitter['title'] = preg_replace("/@[a-z0-9_]+:?/i","",$twitter['title']);
//ハッシュタグを削除 日本語対応
  $twitter['title'] = preg_replace("/(?:^|[^ー゛゜々ヾヽぁ-ヶ一-龠a-zA-Z0-9a-zA-Z0-9&_\/]+)[##]([ー゛゜々ヾヽぁ-ヶ一-龠a-zA-Z0-9a-zA-Z0-9_]*[ー゛゜々ヾヽぁ-ヶ一-龠a-zA-Z0-9a-zA-Z]+[ー゛゜々ヾヽぁ-ヶ一-龠a-zA-Z0-9a-zA-Z0-9_]*)/","",$twitter['title'], -1);
//ハッシュタグを削除 数字のみのハッシュタグを削除
  $twitter['title'] = preg_replace("/[##]([0-9_])+:?/i","",$twitter['title']);
//ハッシュタグを削除 半角英字のみ
  $twitter['title'] = preg_replace("/[##]([a-zA-Z0-9])+:?/i","",$twitter['title']);
$twitter_array[$val]['title'] = $twitter['title'];//Twitterのテキスト
$twitter_array[$val]['updated'] = date('Y-m-d H:i:s', strtotime($twitter['updated']));
//もしURLがセットされていたら
  if(isset($twitter_array[$val]['url'])){
  //画像出力用のURL
  foreach($twitter_array[$val]['url'] as $url){
  
  if(strstr($url,"twitpic") == false){
  //ツイート内容にhrefでリンクを付ける
  $twitter_array[$val]['text'] .= '<a href="'.$url.'">'.$twitter['title']."</a>";
  }else{
  $str = substr($url, -6);
$twitter_array[$val]['text'] .= '<a href="'.$url.'"><img src="http://twitpic.com/show/full/'.$str.'.jpg"/></a>';
}
}
}else{
  //Tweet中にURLが特に含まれていなかったら
  $twitter_array[$val]['text'] = $twitter['title']; 
  }
  }

//Twitter投稿をWordpressに登録する
  foreach($twitter_array as $view){
//最終投稿より、日時が新しければ登録実行
  if($res[0]['post_date'] < $view['updated']){

$mdb2->exec("INSERT INTO `wp_posts` (`post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES
  (1, '{$view['updated']}', '{$view['updated']}', '{$view['text']}', '{$view['title']}', '', 'publish', 'open', 'open', '', 'test', '', '', '{$view['updated']}', '{$view['updated']}', '', 0, 0, 'post', '', 0)");
}
}

最新のPHP5.3.xをインストールしよう

最新のPHP5.3.9をインストールしよう

普通のyumコマンドではPHPは5.1系しか入れることが出来ず、WordpressでさえPHPは5.2.4以上が必要です。前回追加したリポジトリを利用して最新のPHP環境を手に入れましょう。
なお、remi、epelリポジトリから追加できるPHPは2011/1/27現在5.3.9となります。

PHP5.3.9インストール

PHPのインストールは以下のコマンドを入力するだけ。

#yum --enablerepo=remi,epel install php

Complete!という表示が出たら、バージョンを確認しましょう。

念のためバージョン確認

# php -v

CentOSのデフォルトのリポジトリでインストしたら?

もしここで、remi、epelリポジトリを使わずにPHPをインストールするなら

# yum -y install php

となります。ただし、ここでremi、epelリポジトリを使わないと、PHPは5.1系しか入らないので注意が必要です。

PHPでよく使うモジュールをインストール

PHPを使う上で、比較的利用頻度の高そうなモジュールをまとめてインストールしておきます。

#yum --enablerepo=remi install php-devel php-gd php-mbstring php-mysql php-pdo php-pear php-xml php-imap

※依存関係を考慮して、追加したリポジトリからPHPを入れた場合、PHPのモジュールも追加したリポジトリから入れるようにしてください。その場合必ず –enablerepo=remiの記述が必要です。

必要であればpearもインストールするとよいでしょう。
あるといいのは pear:MDB2(データベースの取扱),pear:pager(ページャー),pear:auth(ユーザーセッション)
pearのインストールはこちらを参考にして下さい。

Apache再起動

Apache再起動/etc/rc.d/init.d/httpd restart

※PHPのパッケージとモジュールをインストールしたら Apacheを再起動しないとhttpdに反映されません。必ず再起動を。

PHPの動作確認

PHPがインストールされたかどうか確認します。

# vi /var/www/html/test.php ← PHPテスト用ページ作成

※/var/www/html/は、IPアドレス直下の閲覧可能ディレクトリのこと

インサートモードで以下を入力

インサートモードになって、以下を入力してください。


phpinfo();
?> ?>

[iキー]でインサートモード
[Escキー]インサート終了、
:wq! と入力で、保存して終了
:q! と入力で、保存しないで終了

:wq! と入力で、保存して終了したら試しにアクセスします。

アクセスするURLは以下。

http://サーバーのIPアドレス/test.php

表示が確認できたらテストページを削除します。

# rm -f /var/www/html/*

以上でPHPのインストールは完了です。

remi、epelリポジトリを削除したい

もし追加したリポジトリを削除したくなったら

設定をうっかり間違えたり、もう一度最初からインストールし直したい時 リポジトリを削除しなければなりません。
依存関係に注意しながら削除しなければなりませんので慎重に作業を行いましょう。

慎重に、といっても自分のインストールしたリポジトリのバージョンを確認しながら行えばよいだけです。

remiリポジトリ、epelリポジトリの削除の手順

1.バージョン確認
2. rpm-e remi-release-○○.remiを先に削除(○○は自分のバージョン)
3. -e epel-release-○○を削除(○○は自分のバージョン)

epelリポジトリの確認

# rpm -qa | grep epel ←epelリポジトリのバージョン確認コマンド
epel-release-5-4  ←出力結果。現在epel は5-4が入っている。

remiリポジトリの確認

パッケージをremiからインストールしていると、そのパッケージも表示されます。

# rpm -qa | grep remi ←remiリポジトリのバージョン確認コマンド
remi-release-5-8.el5.remi  ←出力結果。現在remi は5-8が入っている。
ysql-5.5.20-1.el5.remi ←remiリポジトリでインストールされたパッケージ
php-common-5.3.9-1.el5.remi ←remiリポジトリでインストールされたパッケージ
php-cli-5.3.9-1.el5.remi
php-pdo-5.3.9-1.el5.remi
php-pear-1.9.4-3.el5.remi
php-imap-5.3.9-1.el5.remi
php-devel-5.3.9-1.el5.remi
mysql-libs-5.5.20-1.el5.remi
mysqlclient15-5.0.67-1.el5.remi
mysql-server-5.5.20-1.el5.remi
php-5.3.9-1.el5.remi
php-mysql-5.3.9-1.el5.remi
php-mbstring-5.3.9-1.el5.remi
php-gd-5.3.9-1.el5.remi
php-xml-5.3.9-1.el5.remi

削除実行

削除するリポジトリのバージョンを確認し、バージョンを指定して削除

#rpm -e epel-release-5-4 ←削除コマンド(自分のバージョンをしっかり確認)

先にrpm -e remi-release-5-8.el5.remiから削除をしなさいというエラー。

error: Failed dependencies:
epel-release >= 5 is needed by (installed) remi-release-5-8.el5.remi.noarch

そこで先にremiリポジトリから削除を行う。
#rpm -e remi-release-5-8.el5.remi ←-e remi-release-5-8.el5.remi削除(自分のバージョンをしっかり確認)
#rpm -e epel-release-5-4 ←-e epel-release-5-4あらためて削除

以上で削除が完了です。
2つのリポジトリの依存関係に注意して、先にremiリポジトリから削除実行後、epelリポジトリを削除するようにしてください。

phppgadminのdumpが動かないとき

PostgresqlのPHPベースのGUI管理ツール phppgadminですが、バックアップを実行しても空のファイルが生成されたりと、どう~してもDBのバックアップを取ることが出来ませんでした。

結論:pg_dumpの場所を確認する

この手のエラーはpg_dumpのパスがphppgadminに記載されているものとで相違があるから発生するケースがほとんどなのだそうです。

参考

phpPgAdminでエクスポートをする方法 WEBサイト+phpリファレンスより

デフォルトでは
正しくエクスポート出来ない場合、
conf/config.inc.php のpg_dumpのパス設定を直すとエクスポートできます。
デフォルトでは
$conf[‘servers’][0][‘pg_dump_path’] = ‘/usr/bin/pg_dump’;
$conf[‘servers’][0][‘pg_dumpall_path’] = ‘/usr/bin/pg_dumpall’;
となっているので
$conf[‘servers’][0][‘pg_dump_path’] = ‘/usr/local/bin/pg_dump’;
$conf[‘servers’][0][‘pg_dumpall_path’] = ‘/usr/local/bin/pg_dumpall’;
とか
$conf[‘servers’][0][‘pg_dump_path’] = ‘/usr/local/pgsql/bin/pg_dump’;
$conf[‘servers’][0][‘pg_dumpall_path’]= ‘/usr/local/pgsql/bin/pg_dumpall’;
とかに変更するとエクスポートできるようになります。
ちなみに私は後者の設定でエクスポートできるようになりました。

・・・それでも出来ません。

冷静にpg_dumpの場所を確認

すると、私の環境では以下のディレクトリの中にありました。

/usr/local/postgresql/bin

と、いうわけで、以下のように変更して、無事dumpの実行ができましたとさっ!
pgadminのcomf/config.inc.phpの35行目あたり

$conf[‘servers’][0][‘pg_dump_path’] = ‘/usr/local/postgresql/bin/pg_dump’;
$conf[‘servers’][0][‘pg_dumpall_path’] = ‘/usr/local/postgresql/bin/pg_dumpall’;

まとめ:phppgadminのdumpが動かないとき

多くの先人が語るとおり、phppgadminでdumpが動かない場合ほとんどがpg_dumpの場所が間違っているケース。それぞれ環境によって場所が違うようですから、どうしてもdumpがうまくいかないときは/usr/local下のpostgresqlまたはpgsqlなどからpg_dumpの場所を確認してみてください。

CentOSにPear:MDB2インストール

DBの種類に関係なく、同じソースコードでPHPからクエリが投げられる便利なライブラリ、Pear:DBがありましたが、インストールしようとしたところ、MDB2を利用するように怒られてしまいました。
まだPearが入っていなければ先にインストール

Pearをインストール

#yum -y install php-pear

MDB2をインストール

MDB2本体と、ドライバの2つが必要です。ドライバの入れ忘れに注意してください。

# yum install php-pear-MDB2.noarch
# yum install php-pear-MDB2-Driver-mysql.noarch

Apache再起動

ドライバまで入れ終わったらApache再起動が必要です。

/etc/rc.d/init.d/httpd restart

Pear:MDB2動作テスト

文字コードはutf-8の場合はutf8となります。間違えないように。

require_once 'MDB2.php';//ライブラリのロード
$db=MDB2::connect('mysqli://user:password@localhost/mydb?charset=utf8');  if(PEAR::isError($db)) die("<p>{$db->getMessage()}</p>");//エラー処理

MDB2 Error: not found

MDB2 Error: not foundと表示された場合はドライバが入っていない可能性があります。
MysqlのドライバならMysqlのドライバを、PostsreSQLならPostsreSQLのドライバを、各利用するDBにあわせたドライバが必要になりますので注意です。
(確かPear:DBの時は、Pear:DB単体で接続できたはず。この点だけ注意が必要です。)

ドライバがあるのにそれでも接続できない?

実際に私も遭遇したのですが、ドライバも揃っている、DNSも間違っていないのにうまくつながらないことがあります。
その時は以下のようにするとつながります。

$db = “mysqli://user:password@localhost/database_name?charset=utf8″;

//mysqliを→mysqlに変更
$db = “mysql://user:password@localhost/database_name?charset=utf8”;

以上で終了です。

ついに完成!TwitterAPI利用してTweet内容を完全に表示する

前回短縮URL化した内容から、Twitpicを出力する方法を紹介しましたが、それを利用して、このブログの右カラムにもあるような最新Tweetを表示するようなガジェットを作ってみたいと思います。

ただし、ちょっと違うのが、短縮されたURLを全て展開したり、さらにTwitpicで投稿された画像もキレイに出力されるようにしたいと思います。
(一応最初にこのプログラムのデメリットを申し上げると、短縮されたURLを全て展開していくので、非常に重たいです。)

画像&URLを完全表示させるITかあさん手作りガジェット

このプログラムの作成した経緯は、TwitterとWordpressを利用して、TwitterからTweetされたらその内容でWordpressの更新をさせることでした。もっと手軽にWordpressを更新させたかったのです。
Tweet内容をそのまま出力させると問題がいくつかあり、

  • URLが短縮されてしまう(一度URLを展開して、URLの正規化)
  • ブログにTwitpicでの画像も出力したい

このことから、短縮化されたURLを一度展開する必要があったのです。
前回の投稿にあるように、Twitpicなど何かしらTwitpicの画像を出力させるには一度URLを展開してあげる必要があったのです。

前置きはそれくらいにして、解説。

手順

  1. Tweetされた内容をxmlで展開
  2. URLを短縮化されたものを一度展開する。
  3. ハッシュくタグ、RT、返信など余計なもの正規表現で排除
  4. 展開したURLから、画像のURLを取得する
  5. 出力

PHP

//URL置き換えフォーマット
function square($short_url){
$h = get_headers($short_url,true);
if(isset($h['Location'])){
$long_url = $h['Location'];
if(is_array($long_url)){
$long_url = end($long_url);
}
}
return $long_url;
}
$contents = file_get_contents('http://search.twitter.com/search.atom?q=from:自分のTwitterアカウント&amp;rpp=15');
//XMLをオブジェクトに変換
$xml = simplexml_load_string($contents);
//XMLオブジェクトを扱いやすいよう、通常の配列に一度変換を行う
$arrayA = array(); for ($i = 0; $i <= 15; $i++) {
$arrayA[$i]['title'] = (string)$xml->entry->$i->title;
$arrayA[$i]['updated'] = (string)$xml->entry->$i->updated;
} $twitter_array = array();
foreach($arrayA as $val => $twitter){
preg_match_all("/http:\/\/[a-z0-9\/\-_\.]+/i",$twitter['title'],$match);
foreach($match[0] as $match_url){ $URL = square($short_url = $match_url);//短縮化されたURLに一度アクセスをし、正規のURLを取得する処理
$twitter_array[$val]['url'][] = $URL;
} $twitter['title'] = preg_replace("/http:\/\/[a-z0-9\/\-_\.]+/i","",$twitter['title']); //RTタグを削除
$twitter['title'] = preg_replace("/[QR]T ?@[a-z0-9_]+:?/i","",$twitter['title']); //返信を削除
$twitter['title'] = preg_replace("/@[a-z0-9_]+:?/i","",$twitter['title']); //ハッシュタグを削除 日本語対応
$twitter['title'] = preg_replace("/(?:^|[^ー゛゜々ヾヽぁ-ヶ一-龠a-zA-Z0-9a-zA-Z0-9&_\/]+)[##]([ー゛゜々ヾヽぁ-ヶ一-龠a-zA-Z0-9a-zA-Z0-9_]*[ー゛゜々ヾヽぁ-ヶ一-龠a-zA-Z0-9a-zA-Z]+[ー゛゜々ヾヽぁ-ヶ一-龠a-zA-Z0-9a-zA-Z0-9_]*)/","",$twitter['title'], -1); //ハッシュタグを削除 数字のみのハッシュタグを削除
$twitter['title'] = preg_replace("/[##]([0-9_])+:?/i","",$twitter['title']); //ハッシュタグを削除 半角英字のみ
$twitter['title'] = preg_replace("/[##]([a-zA-Z0-9])+:?/i","",$twitter['title']); $twitter_array[$val]['title'] = $twitter['title'];//Twitterのテキスト $twitter_array[$val]['updated'] = $twitter['updated']; //もしURLがセットされていたら
if(isset($twitter_array[$val]['url'])){
//画像出力用のURL
foreach($twitter_array[$val]['url'] as $url){

//展開したURLにtwitpicという文言が無ければ if(strstr($url,"twitpic") == false){
//ツイート内容にhrefでリンクを付ける
$twitter_array[$val]['text'] .= '<a href="'.$url.'">'.$twitter['title']."</a>";
}else{
//展開したURLがTwitpicに投稿されたURLなので、画像を表示するHTMLに。 $str = substr($url, -6); $twitter_array[$val]['text'] .= '<a href="'.$url.'"><img src="http://twitpic.com/show/mini/'.$str.'.jpg"/></a>'; } } }else{
//Tweet中にURLが特に含まれていなかったら
$twitter_array[$val]['text'] = $twitter['title'];
}
}

HTML(出力)

<dl>
<?php foreach($twitter_array as $view):?>
<dt><?php echo $view['title'];?></dt>
<dd><?php echo $view['text'];?></dd>
<dd><?php echo $view['updated'];?></dd>
<?php endforeach;?>
</dl>

試しにテストで出力したものは以下のようになっています。

URLが何も存在しない場合はただのTweetされたテキストを、URL内容でtwitpicというテキストが含まれていれば画像用に出力を行います。

メリット

このプログラムのメリットは、URLを一度展開しているので、展開したURLよりTwitpicに投稿されたIDを取得できるので、好きなところに投稿した画像を出力させることが出来ます。
またURLは短縮化されたURLではなくなるので、元のURLに置き換わり、URLの正規化によって 投稿されたURLによってSEO効果を図ることができるかな~と思っています。

デメリット

どうしてもTwitpicにて投稿された画像を出力したかったので 一度URLを展開する必要がありました。
展開とは、短縮化されたURLにアクセスをして 元のURLを拾ってきているのです。例えば15件URLの投稿があれば、15回もURLを読み込みに行くので この間非常に重たくなってしまうのです。

活用方法

私はこのプログラムを利用して、一言ブログなるものを作ってみようかと思います。
正直 そのままどこかに表示するのは非常に重たいのですが、Cronを利用し、定期実行によって生成された配列をWordpressのDBにINSERTをしていけば Twitterから出力される簡易一言ブログの完了です。
iphoneからでも、写真付のTweetを行えば、そのままWordpressに反映させることも可能かな~と。

注意

このプログラムは勉強がてら作ってみたり、後今後ブログの更新を簡単にするために作ったものなので動作の保障は致しません。
特に自分は正規表現が苦手なので そこらへんは特に怪しいです。

あ~、大変だった

Postfix main.cfの設定

Postfixはインストール後起動さえしておけば基本的に使うことは出来ますがセキュリティ的に問題ありなので、きちんと設定しておかないとスパムメールなどの踏み台にされる可能性があり。

viエディタでSSHで変更する場合

# vi /etc/postfix/main.cf

webminの設定ファイルの編集から行う場合

左メニューより
1.Un-used Modules
2.Postfix の設定 クリック
右カラムより
1.設定ファイルの編集
2./etc/postfix/main.cf  選択

main.cfの変更点

myhostname = kaasan.info ← 追加 取得した自分のドメイン
mydomain = kaasan.info ← 追加 取得した自分のドメイン
myorigin = $mydomain ←追加
inet_interfaces = localhost

inet_interfaces = all ← 変更(外部からのメール受信を許可)
mydestination = $myhostname, localhost.$mydomain, localhost

mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
home_mailbox = Maildir/(追加)

SMTP関連の設定

smtpd_banner = $myhostname ESMTP unknown (追加)
最終行に
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous, noplaintext
broken_sasl_auth_clients = yes
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, check_relay_domains, reject
message_size_limit = 10485760 ← 追加(受信メールサイズを10MB=10*1024*1024に制限)

参考サイト

メールサーバー構築(Postfix+Dovecot) → Postfix設定
このサイトに書いてある変更点をコピペで対応したところ、最後の(SMTP-Auth設定)が失敗してしまいました。

参考サイト2

最後の(SMTP-Auth設定)の設定については下記を参考にしました。
PostfixによるSMTP認証[SMTP-AUTH]

Twitterなどで短縮URL化したものを展開する

TwitterでURL付きでツイートするとき、よく短縮URL化します。短縮URLのままだと、URLの正規化が出来ないため、ブログにログを張ってもSEO効果を出せません。Twitter以外でツイートしたものを表示する際は、短縮したものを展開したいものです。

結論:header locationを使う

短縮されたURLにアクセスすると、リダイレクトのような動きをして、元のURLを表示してくれますから、これを利用してlocationでURLを取得できないかと思っていましたが、同じことを考える人は普通にいるものですね。

参考:PHPで短縮URLを展開するコード

実際のコードは以下のようになります。

function square($short_url){
$h = get_headers($short_url,true);
if(isset($h['Location'])){
$long_url = $h['Location'];
if(is_array($long_url)){
$long_url = end($long_url);
}
}
return $long_url;
} echo square($short_url = '短縮URL');

応用:ついっぷるふぉとから投稿した画像を取得する

画像を投稿した際、URLが短縮されます。しかし、短縮されない、元のURLの最後の何文字かは画像のIDが書かれています。
つまり、これを取得きれば、短縮されたURLからTwitpicやついっぷるふぉとなどのURLから画像を引っ張ることが出来るのです。
(私はこれがやりたくてけっこうチマチマ作業してました。)

function square($short_url){
$h = get_headers($short_url,true);
if(isset($h['Location'])){
$long_url = $h['Location'];
if(is_array($long_url)){
$long_url = end($long_url);
}
}
return $long_url;
}

//テスト投稿したついっぷるふぉとの短縮URL
$URL = square($short_url = 'http://bit.ly/xxeAs8');
//ついっぷるフォトは最後の5文字が画像のID
$str = substr($URL, -5);

画像IDが取得できたら後はsrcの中に入れてあげるだけで完了。

<img src="http://p.twpl.jp/show/large/<?php echo $str;?>"/>

リポジトリの追加をしよう

そもそもリポジトリとは?

リポジトリとはパッケージの管理ツールのことです。何かしらのパッケージ管理ツール(リポジトリ)があるからこそ、コマンドとパッケージ名を入力するだけでパッケージのインストールが可能になるのです。
(パッケージとは、例えばPHPとかperlとかApacheとか。)
リポジトリを利用しない場合、ソースファイルをダウンロードして自分でコンパイルしなければならず、手間がかかります。
リポジトリがあるからこそ、簡単にパッケージの管理が出来るわけですね。
リポジトリにはもともとCentOSについているものもあれば、後からインストールすることも出来ます。

remiリポジトリを追加しよう

CentOSにだけでのリポジトリでは『安定している』と認定されたパッケージしかダウンロードすることが出来ません。
PHPにいたっては5.1、Mysqlは5.0系しかダウンロードが出来ません。(一応、PHPは確か5.3.3までは何とかCentOSのリポジトリでいけたはず)
もっと新しい、最新のパッケージが欲しい!しかも手軽に!となったらremiとepelリポジトリを利用しましょう。
インストールはとても簡単です。
以下のコマンドを入力するだけでインストールが可能です。

CentOS 5.8にepelリポジトリの追加

依存関係でepelリポジトリを先にインストします。

epelリポジトリの追加

# rpm -ivh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
こちらでは2012年7月現在- Unknown or unexpected errorで、インストール出来ませんでした。
現在はこちら
# rpm -ivh http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm

CentOS 5.8remiリポジトリの追加

# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-5.rpm

追加したリポジトリの設定

一応これだけで使えるようにはなるのですが、このままでは常に追加したリポジトリからパッケージを探すことになるので、通常は出てこないようにしなければなりません。

enableを全て0に

enableを全て0にします。たったこれだけです。
viエディタでそれぞれ2つのファイルを変更してください。
enable = 0

コマンド:
#vi /etc/yum.repos.d/remi.repo

[remi]
name=Les RPM de remi pour Enterprise Linux $releasever – $basearch
#baseurl=http://rpms.famillecollet.com/enterprise/$releasever/remi/$basearch/
mirrorlist=http://rpms.famillecollet.com/enterprise/$releasever/remi/mirror
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
failovermethod=priority

[remi-test]
name=Les RPM de remi en test pour Enterprise Linux $releasever – $basearch
#baseurl=http://rpms.famillecollet.com/enterprise/$releasever/test/$basearch/
mirrorlist=http://rpms.famillecollet.com/enterprise/$releasever/test/mirror
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

コマンド:
#vi /etc/yum.repos.d/​epel.repo
[iキー]でインサートモード、[Escキー]でインサート終了、保存してコマンド画面に戻るには[:wq!]と入力して[Enter]キー
#baseurl=http://download.fedoraproject.org/pub/epel/5/$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL

[epel-debuginfo]
name=Extra Packages for Enterprise Linux 5 – $basearch – Debug
#baseurl=http://download.fedoraproject.org/pub/epel/5/$basearch/debug
mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-debug-5&arch=$b
asearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL
gpgcheck=1

[epel-source]
name=Extra Packages for Enterprise Linux 5 – $basearch – Source
#baseurl=http://download.fedoraproject.org/pub/epel/5/SRPMS
mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-source-5&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL
gpgcheck=1

以上でリポジトリ関係は終了です。

もし、リポジトリを削除したくなった場合はこちらを参考にして下さい。

さくらVPSにApacheをインストールしよう

さくらにはApacheがインストールされていない

初期段階ではさくらVPSにはApacheがインストールされていません。これではPHPどころか、HTMLすら表示することは出来ませんのでApacheをインストールしましょう。

apacheインストールコマンド

Apacheのインストールは以下のコマンド一発で終了です。
#なので、rootユーザーにてコマンドを実行しています。

# yum -y install httpd

しばらくすると、インストールの旨確認を求められるので[Yキー]Enterを押してください。
インストールが終了したら、念のため、Apacheのバージョン確認をします。

# apachectl -v
Server version: Apache/2.2.3
Server built: Oct 20 2011 17:00:12

これだけでApacheのインストールは完了です。
Apacheの起動、再起動はこちらを参考にして下さい
Apache起動、再起動などApacheの基本コマンド