Verfolgen

notice

参加予定イベント

コミックマーケット75
開催日時:2008年12月28日(日)~30日(火)・10:00~16:00
開催場所:東京都 江東区 東京ビッグサイト
配置場所:火曜日 東 チ-44b 『Verfolgen』終了

extra

web拍手ボタン

photo gallery

最新9件の写真

twitter

ゆみむ

最新30件の呟き

note

Twitterでのつぶやきを表示するPHPスクリプト(写真表示対応版)

2011.09.23追記:日本語をはじめとした多言語のハッシュタグを処理出来るように修正しました。

Twitterが写真付きツイート機能を実装したので拙作のTwitterでのつぶやきを表示するPHPスクリプトでも写真が表示されるように改良してみました。と言っても携帯百景のRSSをごにょごにょするスクリプトのサムネイル生成部分を流用して手を加えただけですが。
なお、つぶやきのJSONデータをキャッシュする為にPEARのCache_Liteとサムネイルを生成する為にPECLのImagickを使いますのでご用意下さい。

処理の流れとしては、
TwitterのサーバからJSONデータを取得してキャッシュに保存→キャッシュもしくは取得したJSONデータをデコードして変数$decodeに代入→つぶやきを含めたHTMLを生成し、写真が含まれたつぶやきでサムネイルが存在しないならサムネイルを生成→投稿時刻が24時間以内なら相対時刻を、それ以外なら日時を出力→指定された回数の生成処理を繰り返し→使わなくなった古いサムネイルを削除
となります。
あとは出力されたHTMLをスタイルシートで成形すれば完成です。動作見本
なお、HTML5でマークアップされているので、それ以外の場合は適宜修正して下さい。

JSONデータを取得する際に指定出来るオプションなどについてはTwitter Developersをご覧下さい。


<?php
////////////////////////////////////////////////////////////////////////// 設定項目
$name         = 'hoge'; // Twitterのユーザ名
$count        = '30'; // 表示するツイート数
$size         = array ("180", "180"); // 生成するサムネイルの横幅と高さ
$imgurl       = 'http://example.com/img/twitter'; // サムネイルを保存する場所のURL
$imgpath      = '/home/username/www/img/twitter'; // サムネイルを保存する場所のパス
$cacheOptions = array (
    'cacheDir' => '/home/username/tmp/', // キャッシュが保存される場所のパス
    'lifeTime' => '300', // キャッシュを使う秒数(nullにすると無期限)
);
////////////////////////////////////////////////////////////////////////// 設定項目ここまで
require_once 'Cache/Lite.php';
$cacheId  = 'twitter';
$objCache = new Cache_Lite($cacheOptions);

if ($cache = $objCache->get($cacheId)) {
    $json = $cache; 
} else if ($json = file_get_contents("http://api.twitter.com/1/statuses/user_timeline.json?screen_name=$name&count=$count&include_rts=true&include_entities=true")) {
    $objCache->save($json, $cacheId);
} else {
    echo "<header>\n<h2>twitter</h2>\n</header>\n<section>\n<article>\n",
         "<p><strong>クジラはお昼寝中です。</strong></p>\n</article>\n</section>\n";
    return;
}

$decode    = json_decode($json, true);
$img       = $decode[0]['user']['profile_image_url'];
$user_name = $decode[0]['user']['name'];
echo "<a href=\"http://twitter.com/$name\">\n<header>\n<h2>twitter</h2>\n",
     "<img src=\"$img\" width=\"48\" height=\"48\" alt=\"$user_name\" />",
     "</header>\n</a>\n<section>\n<h3>最新"."$count"."件のつぶやき</h3>\n";

foreach ($decode as $val) {
    $text  = $val['text'];
    $photo = $val['entities']['media'][0]['media_url'];
    if ($val['entities']['media'][0]['media_url']) {
        $photourl = $val['entities']['media'][0]['expanded_url'];
        if (file_exists("$imgpath/".strtotime($val['created_at']).basename($photo)) == false) {
            $image = new Imagick($photo);
            $image->cropThumbnailImage($size[0],$size[1]);
            $image->writeImage("$imgpath/".strtotime($val['created_at']).basename($photo));
            $image->destroy();
        }
        $photo = "<br /><a href=\"$photourl\"><img src=\"$imgurl/".strtotime($val['created_at']).basename($photo).
                 "\" width=\"$size[0]\" height=\"$size[1]\" alt=\"\" /></a>";
    }
    $pattern = array (
        "/(https?:\/\/[a-zA-Z0-9\-\.\/~_]+)/",
        "/(\s|^)@([a-zA-Z0-9\.\/~\-_]+)\b/",
    );
    $replace = array (
        "<br /><a href='\\1'>\\1</a>",
        "<a href=\"http://twitter.com/\\2\" rel=\"external\">@\\2</a> ",
    );
    $text     = preg_replace($pattern, $replace, $text);
    if ($val['entities']['hashtags']) {
        foreach ($val['entities']['hashtags'] as $hashtag) {
            $pattern = "/(\s| |^)#".$hashtag['text']."/";
            $replace = " <a href=\"http://search.twitter.com/search?q=%23".$hashtag['text']."\" rel=\"external\">#".$hashtag['text']."</a>";
            $text = preg_replace($pattern, $replace, $text);
        }
    }
    $tweet_id = $val['id_str'];
    $time     = strtotime($val['created_at']);
    $date     = date("c", $time);
    echo "<article>\n<p>$text".$photo."</p>\n<footer>\n<time pubdate datetime=\"$date\">";
    $diffmin  = round((time()-$time)/60);
    $hour     = floor($diffmin/60);
    $min      = $diffmin%60;
    if($hour < 1) {
        $date = $min."分前";
    } else if ($hour < 24) {
        $date = $hour."時間".$min."分前";
    } else {
        $date = date("Y年n月j日 H:i", $time);
    }
    echo "<a href=\"http://twitter.com/$name/status/$tweet_id\" rel=\"external\">".$date."</a>",
         "</time>\n</footer>\n</article>\n";
}
echo "</section>\n";

if (count(glob("$imgpath/*")) > $count) {
    exec ("ls $imgpath/*", $output);
    unlink ($output[0]);
}
?>

キャッシュの保存期間はご自身のツイートペースに合わせて調整して下さい。 保存期間があまりにも短いとTwitterのサーバに負荷をかけてしまうだけでなくAPI制限を受けるおそれが有りますので程々に。

使い方ですが、HTMLに直接埋め込むなり外部ファイルにしてPHPなどで呼び出すなりご自由にどうぞ。私はWordPressのfunctions.phpに上記のソースコードを埋め込んで必要な場所で呼び出しています。

最後になりましたがPHPに関して私はただの素人なのでご利用は自己責任でお願いします。
もっとエレガントでスマートな方法と記述が有ると思いますが、今の私にはこれが精一杯です、、、
改善案やご指摘が有りましたら遠慮無く仰って下さい。

Twitterでのつぶやきを表示するPHPスクリプト

2011.09.23追記:日本語をはじめとした多言語のハッシュタグを処理出来るように修正しました。

2011.08.20追記:Twitterでのつぶやきを表示するPHPスクリプト(写真表示対応版)』を作りましたので投稿した写真も表示したい方はどうぞ。

サイトをリニューアルする際に「このままじゃスカスカだし、Twitterでのツイート(つぶやき)でも表示してお茶を濁そう!」と思いTwitter公式ウィジェットなどを色々と試してみたものの、デザインの自由度が低い事と出力されるマークアップが気に食わない事で「それなら自分の納得いくものを作ろう!」という訳でPHPの勉強がてら作ってみました。つぶやきのJSONデータをキャッシュする為にPEARのCache_Liteを使います。

処理の流れとしては、
TwitterのサーバからJSONデータを取得してキャッシュに保存→キャッシュもしくは取得したJSONデータをデコードして変数$decodeに代入→呟きを含めたHTMLを生成し、投稿時刻が24時間以内なら相対時刻を、それ以外なら日時を出力→指定された回数の生成処理を繰り返したら終了
となります。
あとは出力されたHTMLをスタイルシートで成形すれば完成です。動作見本
なお、HTML5でマークアップされているので、それ以外の場合は適宜修正して下さい。

JSONデータを取得する際に指定出来るオプションなどについてはTwitter Developersをご覧下さい。


<?php
////////////////////////////////////////////////////////////////////////// 設定項目
$name  = 'hoge'; // Twitterのユーザ名
$count = '30'; // 表示するツイート数
$cacheOptions = array (
    'cacheDir' => '/home/username/tmp/', // キャッシュが保存される場所のパス
    'lifeTime' => '300', // キャッシュを使う秒数(nullにすると無期限)
);
////////////////////////////////////////////////////////////////////////// 設定項目ここまで
require_once 'Cache/Lite.php';
$cacheId  = 'twitter';
$objCache = new Cache_Lite($cacheOptions);

if ($cache = $objCache->get($cacheId)) {
    $json = $cache; 
} else if ($json = file_get_contents("http://api.twitter.com/1/statuses/user_timeline.json?screen_name=$name&count=$count&include_rts=true")) {
    $objCache->save($json, $cacheId);
} else {
    echo "<header>\n<h2>twitter</h2>\n</header>\n<section>\n<article>\n",
         "<p><strong>クジラはお昼寝中です。</strong></p>\n</article>\n</section>\n";
    return;
}

$decode    = json_decode($json, true);
$img       = $decode[0]['user']['profile_image_url'];
$user_name = $decode[0]['user']['name'];
echo "<a href=\"http://twitter.com/$name\">\n<header>\n<h2>twitter</h2>\n",
     "<img src=\"$img\" width=\"48\" height=\"48\" alt=\"$user_name\" />\n",
     "</header>\n</a>\n<section>\n<h3>最新"."$count"."件の呟き</h3>\n";

foreach ($decode as $val) {
    $text    = $val['text'];
    $pattern = array (
        "/(https?:\/\/[a-zA-Z0-9\-\.\/~_]+)/",
        "/(\s|^)@([a-zA-Z0-9\.\/~\-_]+)\b/",
    );
    $replace = array (
        "<br /><a href='\\1'>\\1</a>",
        "<a href=\"http://twitter.com/\\2\" rel=\"external\">@\\2</a> ",
    );
    $text     = preg_replace($pattern, $replace, $text);
    if ($val['entities']['hashtags']) {
        foreach ($val['entities']['hashtags'] as $hashtag) {
            $pattern = "/(\s| |^)#".$hashtag['text']."/";
            $replace = " <a href=\"http://search.twitter.com/search?q=%23".$hashtag['text']."\" rel=\"external\">#".$hashtag['text']."</a>";
            $text = preg_replace($pattern, $replace, $text);
        }
    }
    $tweet_id = $val['id_str'];
    $time     = strtotime($val['created_at']);
    $date     = date("c", $time);
    echo "<article>\n<p>$text</p>\n<footer>\n<time pubdate datetime=\"$date\">";
    $diffmin  = round((time()-$time)/60);
    $hour     = floor($diffmin/60);
    $min      = $diffmin%60;
    if($hour < 1) {
        $date = $min."分前";
    } else if ($hour < 24) {
        $date = $hour."時間".$min."分前";
    } else {
        $date = date("Y年n月j日 H:i", $time);
    }
    echo "<a href=\"http://twitter.com/$name/status/$tweet_id\" rel=\"external\">".$date."</a>",
         "</time>\n</footer>\n</article>\n";
}
echo "</section>\n";
?>

キャッシュの保存期間はご自身のツイートペースに合わせて調整して下さい。保存期間があまりにも短いとTwitterのサーバに負荷をかけてしまうだけでなくAPI制限を受けるおそれが有りますので程々に。

使い方ですが、HTMLに直接埋め込むなり外部ファイルにしてPHPなどで呼び出すなりご自由にどうぞ。私はWordPressのfunctions.phpに上記のソースコードを埋め込んで必要な場所で呼び出しています。

これの応用で携帯百景のRSSをごにょごにょするPHPスクリプトも作ってみましたので、よろしければどうぞ。

最後になりましたがPHPに関して私はただの素人なのでご利用は自己責任でお願いします。
もっとエレガントでスマートな方法と記述が有ると思いますが、今の私にはこれが精一杯です、、、
改善案やご指摘が有りましたら遠慮無く仰って下さい。

携帯百景のRSSをごにょごにょするPHPスクリプト

携帯百景の公式ブログパーツが表示出来るサムネイルは僅か1枚という、あまりにもあれな仕様にブチ切れて(?)携帯百景のRSSからサムネイルを生成して並べるPHPスクリプトを作ってみました。RSSに含まれた画像のURLからサムネイルを生成するので最大で10枚まで並べる事が可能です。
RSSをキャッシュする為にPEARのCache_Liteとサムネイルを生成する為にPECLのImagickを利用しますのでご用意下さい。

処理の流れとしては、
携帯百景のRSSを取得してキャッシュに保存→キャッシュもしくは取得したRSSを扱いやすい形にして変数$xmlに代入→サムネイルが既に生成されているかチェックして、もし無ければRSSに含まれていたURLから画像を読み込みImagickでサムネイルを生成→写真のタイトルと携帯百景の個別ページへのリンクを用意してサムネイルと纏めてリストを生成→指定された回数の生成処理を繰り返したら終了→使わなくなった古いサムネイルを削除
となります。
あとは出力されたHTMLをスタイルシートで成形すれば完成です。動作見本


<?php
////////////////////////////////////////////////////////////////////////// 設定項目
$name    = 'hoge'; // 携帯百景のユーザ名
$read    = '9'; // サムネイルを表示する数(最大10まで)
$size    = array ('60', '60'); // 生成するサムネイルの横幅と高さ
$imgurl  = 'http://example.com/img/movapic'; // サムネイルを保存する場所のURL
$imgpath = '/home/username/www/img/movapic'; // サムネイルを保存する場所のパス
$cacheOptions = array (
    'cacheDir' => '/home/username/tmp/', // キャッシュが保存される場所のパス
    'lifeTime' => '3600', // キャッシュを使う秒数(nullにすると無期限)
);
////////////////////////////////////////////////////////////////////////// 設定項目ここまで

require_once 'Cache/Lite.php';
$cacheId = 'movapic';
$objCache = new Cache_Lite($cacheOptions);

if ($cache = $objCache->get($cacheId)) {
    $rss = $cache; 
} else {
    if ($rss = file_get_contents("http://movapic.com/feed/user/$name")) {
        $objCache->save($rss, $cacheId );
    } else {
        echo "<p><strong>携帯百景からの応答がありません。</strong></p>\n";
        return;
    }
}
$xml = simplexml_load_string($rss);

echo "<ol>\n";

$count = 0;
foreach ($xml->channel->item as $str) {
    preg_match('/(<img.+?src[^=]*=[^"\']*["\']([^"\']*)["\'][^>]*>)/i', $str->description, $matches);
    if (file_exists("$imgpath/".basename($matches[2])) == false) {
        $image = new Imagick($matches[2]);
        $image->cropThumbnailImage($size[0],$size[1]);
        $image->writeImage("$imgpath/".basename($matches[2]));
        $image->destroy();
    }
    $title = $str->title;
    $title = ereg_replace("$name - |\r|\n","",$title);
    echo "<li><a href=\"$str->link\"><img src=\"$imgurl/".basename($matches[2]).
         "\" width=\"$size[0]\" height=\"$size[1]\" alt=\"\" title=\"$title\" /></a></li>\n";
    $count++;
    if ($count >= $read) {
        break;
    }
}

echo "</ol>\n";

if (count(glob("$imgpath/*")) > 10) {
    exec ("ls -r $imgpath/*", $output);
    unlink ($output[10]);
}
?>

キャッシュの保存期間はご自身の写真アップロードペースに合わせて調整して下さい。保存期間があまりにも短いと携帯百景のサーバに負荷をかけてしまうおそれが有りますので程々に。

使い方ですが、HTMLに直接埋め込むなり外部ファイルにしてPHPなどで呼び出すなりご自由にどうぞ。私はWordPressのfunctions.phpに上記のソースコードを埋め込んで必要な場所で呼び出しています。

ちょっと改造すれば同様の写真共有サイトのRSSでも使えると思います。尤も、RSSなんか読み込まなくてもJSONデータなどを引き出せるような場合は、そちらを利用したほうがいいと思います。携帯百景もその辺り便利になると嬉しいのですが、、、。
元々はTwitterでのつぶやきを表示するスクリプトを組む為に勉強していて、「もしかしたら似たような感じに携帯百景のサムネイル一覧も取得できないかなぁ。」と思いついて作ってみました。よろしければTwitterでのつぶやきを表示するPHPスクリプトもご覧下さい。

最後になりましたがPHPに関して私はただの素人なのでご利用は自己責任でお願いします。
もっとエレガントでスマートな方法と記述が有ると思いますが、今の私にはこれが精一杯です、、、
改善案やご指摘が有りましたら遠慮無く仰って下さい。

HTML5とCSS3でリニューアル致しました。

ご無沙汰しております。2年半ぶりでしょうか?
この度、当サイトをHTML5とCSS3でリニューアル致しました。
啓蒙活動の意味も込めてIE8以前のInternet Explorerをお使いの方にはブラウザ更新を促すメッセージを表示させて頂いております事をご了承下さい。て言うかさっさと乗り換えて下さいお願いします!!!!
また、CMSもMovableTypeからWordPressへと移行致しました。PHPさえ解ればコアファイルを弄ることなく何とでもなるWordPressは素敵です。
今回のリニューアルで表示確認したブラウザは以下の通りです。

  • Internet Explorer8
  • Internet Explorer9
  • Internet Explorer10PP2
  • Firefox5.0
  • Firefox6.0beta
  • Firefox Aurora7.0a2
  • Firefox Nightly8.0a1
  • Google Chrome13.0.782.107
  • Google Chrome14.0.835.15dev-m
  • Google Chrome15.0.841.0canary
  • Safari5.1
  • Opera11.50
  • Opera12pre-alpha

さて、2年半の間に色々な事が御座いましたが、以前お知らせ致しましたように現在は東京を離れ神戸市民としてひっそりと暮らしております。最近はお菓子作りが趣味になるなどで絵もすっかり描かなくなってしまったので絵描きサイトとしては既に終了している感は否めませんが、サイトのほうは今後もだらだらと続けていく所存です。

冬コミの告知と近況報告及び今後に関して

冬コミの告知が遅くなってしまい申し訳ございません。
おかげさまで今現在iPhone関連のお仕事を頂いておりまして、ようやくそれが一段落しましたので、これから冬コミの準備をさせていただきます。

、、、はい、お察しの通り、まだ何も準備出来ていないので、何が出せるのか、そもそも何か出せるのか自分でも判りません、、、。今回のお仕事の話を頂いたのが9月でして、参加申し込みのキャンセルを判断するまでの時間があまり残っていませんでした、、、
予定していたCG集は間違いなく無理です。ごめんなさい、、、 出せたとしても落書き程度をコピー本もしくはCDに収録、という形になると思います。
一応、頒布物はハヤテのヒナギク中心を予定しております。

それと、来年の11月辺りに引越しの予定が有りまして、今後も暫くは忙しい状況が続きそうです。
そんなこんなで唐突ではございますが、今回の冬コミを最後に落ち着くまでの数年間サークル活動を休止させて頂きたいと思います。
なお、サイトのほうは今後も継続していきますので宜しくお願い致します。

Firefox3.0を入れてみました。

WebブラウザのFirefoxがバージョンアップしたので、表示確認用に早速インストールしてみました。

以前のFirefox2時代は汚かったCSS3で実装予定の角丸表示も、下の画像の通り大変綺麗にレンダリングされるようになりました。火狐さん、よく頑張った!感動した!
Safari3・Firefox2・Firefox3のレンダリング比較

以上、Firefox2時代の動作の重たさに辟易してOperaに浮気してしまった元Firefoxユーザからのご報告でしたw

C73冬コミお疲れ様でした。

明けましておめでとうございます。今年も、やる気は有っても実を結ばない当サイトと、その中の人を宜しくお願い申し上げます。正月絵って何ですか?お餅とか描けばいいのかな?かな?
ふと、かがみん餅という単語を思いついてしまいましたが、気のせいです。

冬コミ、お疲れ様でした。お陰様で搬入した既刊は全て完売する事が出来ました。
スペースに訪れて下さった皆様に、この場を借りて厚く御礼申し上げます。

父上様、母上様、会場内売店のホットドッグ美味しゅうございました。

もってけ! 下仁田ネギ

明日香さんとこのサークル『ねぎ☆なの』の新刊音楽CD『もってけ! 下仁田ネギ』のジャケットを描かせて頂きました。
「バルディッシュのコアをタマネギに」等々の無茶なご注文、本当に有り難う御座いました。

これを描くにあたり初めて魔砲魔法少女リリカルなのはの1期・2期を観たのですが、これは良いアニメですね。今ではニコ動で一日一回『高町フェイトの憂鬱』や『エレクトリック少女フェイト』を観ないと禁断症状がw
スーパーフェイトタイム!!

site information

about this site

author
ゆみむつちのこ
site name
Verfolgen<フェアフォルゲン>
home page
http://yumimu.jp/
banner
Verfolgen
http://yumimu.jp/ban.png
e-mail
mail@yumimu.jp