Movable Type 5.2.9

この開発日誌には書いていませんでしたが、一昨年頃?にMovable Typeを5に
アップデートしていました。単にプログラムを更新しただけでしたので、
記事は何も書いていませんでしたが。。。

さて、今月に入りやっとサイト運営にも手をかけられるようになりましたので、
そのMovable Type 5を最新版にアップデートしておきました。
合わせて、記事に付けてたランキング用バナーのところに、
新たにdtn開発日誌用のソーシャルリンクも貼り付けておきました。
まだどこも0件ですが、宜しければクリックして下さいませ。
social_link.gif


一年以上放置して死んでいたコンテンツを復旧させるのに、他にも色々と細かいところを
修正かけていたのですが、中でもAPIのレスポンスデータをパースするあたりを
大きく変更しておきました。

APIデータの連携部分は、PHP4だった頃に作ったものが多かったので、
xml_parser_create関数でXMLをパースし、foreach文でぐるぐる回して
↓のように要素を引っこ抜いたりしていたのですが、、、



$p = xml_parser_create();
$ERROR = xml_parse_into_struct($p,file_get_contents($q),$vals,$index);
xml_parser_free($p);
foreach ($val as $key1 => $val1){....}

とっくの昔にPHP5になっていたので、SimpleXMLが標準で使えるようになっていたので、
ニュースAPI、検索API等のXMLパースが必要だった部分を全て作り直しておきました。

SimpleXMLは使い方も楽で、何やら速度も速いような気がします。。。



$Result = simplexml_load_file($q);
//Yahoo検索APIのレスポンスから全レコード数を取得するときは↓でOK
$TOTAL = $Result -> SiteSearchResults -> attributes() -> TotalCount;

ただ、肝心のAPI提供がどんどん少なくなっているので、企業様方に
なんとか頑張っていただきたいなぁと思いますね。

被リンク数取得用php

dtnディレクトリでは、登録サイト様のSEOチェックツールを
オマケでご用意しておりました。
とは言いましても、単にMETAタグの情報を表示したり、
被リンク数と検索インデックス数を取得して表示させてただけですので、
ほとんど必要ない機能だとは思っていますが、、、

さて、久しぶりにこのページを見てみたところ、
どのサイトも被リンク数が0件となってしまっておりました。

数年前は各社の検索エンジンでは、検索APIを大盤振る舞いで
解放してくれていたので、被リンク数・インデックス数も
気楽にAPIで取得出来ていたのですが、Yahoo!、Googleも
検索用APIは次々サービス提供終了となってしまったようで、
どうやらレスポンスが何もない状態となっていたようです。。。

このままでは申し訳ないので、代わりの方法で数値を取ろうと思いましたが、
APIが無い以上、数値を取得するにはHTTP_Requestとかで
検索結果ページを丸っと取得して数値を引っ張るしかないかなぁ
とも思っておりました。
ただ、、、前にもやったことはありましたが、データ取得→数値引っこ抜きに
非常に時間がかかってしまうので、全くダメなんですよね。。。

という訳で、色々探してみたところ、公式にはサービス終了となった
Google Search APIがまだ使えるよということで、プログラム
公開している人がいたので、これで対応してしまいました。
これも近々使えなくなるとは思いますので、この先どうしましょうかねぇ。。。


function GoogleBL($domain){
	$url="http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=link:".$domain."&filter=0";
	$ch=curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_USERAGENT,$_SERVER['HTTP_USER_AGENT']);
	curl_setopt($ch, CURLOPT_REFERER,"YOUR_REFERER");	//リファラ入れないとエラーになりました
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($ch, CURLOPT_HEADER, 0);
	curl_setopt($ch, CURLOPT_NOBODY, 0);
	curl_setopt($ch, CURLOPT_TIMEOUT, 30);
	$json = curl_exec($ch);
	curl_close($ch);
	$data=json_decode($json,true);
	if($data['responseStatus']==200){
		return $data['responseData']['cursor']['resultCount'];
	}else{
		return false;
	}
}

詳細はこちらでご確認を。

YouTube、ニコニコ動画の動画ID

先日のトラブル以来、画像掲示板プログラムの修正を続けております。
imgbbs_dtn_2012.gif
色々見直していると、突貫で作って放置してしまっていただけに、
もはや正常に動かなくなっていたり、最初から機能していなかった部分も
多々見つかり。。。なんともお恥ずかしいばかりです。
 
特に目立ったのは、YouTubeとニコニコ動画の動画IDを引っこ抜くあたりが
先方の仕様変更もあって、全然うまく動いていなかった気がします。
そこで、取り急ぎですが、この部分の修正作業をしてみました。
 
ちなみに。動画IDをプログラムで正確に抜き取りさえ出来れば、
HTML中に小窓で表示させるのはIDはめ込むだけなので超簡単です。
こんな感じで縦横サイズも指定できてしまいます。



embed src="http://www.youtube.com/v/'.$動画ID.'" type="application/x-shockwave-flash" wmode="transparent" width="横サイズ" height="縦サイズ"


 
さて、少々手間なのが、この動画IDをURLから抜き取る作業です。
YouTube、ニコニコ動画共に、動画を見ている時のブラウザURLを見ると、
パラメータが山ほどくっついてたりして、そこから動画IDだけ抜き取らなければ
いけないので、これが少々厄介です。
かといって、投稿時に『sm00000000』や『v=XXXXXXX0XXX』みたいな部分だけを
コピペして下さいというのも手間だったり、ミスも多いと思うので、
正規表現使ってIDだけ引っこ抜く必要があります。
という訳で、あれこれやってこんな形になりました。


preg_match('@[&?]v=([^&]+)|be/(.+)$@',$URL, $match); //YouTube

preg_match('/[a-zA-Z0-9]{8,10}$/',$URL, $match);  //ニコニコ


ニコニコ動画の場合は、この前にパラメータ部分を消し去ったりもしてますが、
なんとか抜き取りできております。
また先方の仕様変更があったらダメになりそうですが、当面は大丈夫でしょう。
 
 
ところで。ここ最近のサーバートラブルの影響もあってか、
肝心の訪問者数が減りまくっておりまして、なんとも困った話です。
荒れるよりはマシかもしれないですが、寂しい話です。

掲示板に荒し対策をしました

先週になりますが、画像掲示板をふと見てみると、
全てのスレッド画像が異様な画像で埋め尽くされてしまっておりました。
imgbbs-arashi.gif
 
余所の画像掲示板でも、昔に似たような騒ぎがあったような記憶がありますが、
こんな過疎掲示板にも攻撃が来るとはさすがにちょっと驚きました。
と共に、プログラム制作の時間がなく、荒し対策処理をやっていなかったことを
心から後悔致しました。。。
 
さて、そうこうしてる間に、サーバーがますます不安定になってきたので、
仕事帰りで眠い目をこすりつつ、大急ぎでプログラムの見直し作業に着手しました。

どうやら連続投稿を制限していなかったこと、最大スレッド数(100スレッド)を
超えた際に最古データを削除していましたが、この削除処理機能に不具合があり、
投稿データが無限増殖していたことがサーバー障害の原因となっていたようです。
 
 
この対処を続ける間もDoS攻撃は続いており、まずは一旦httpdを落とし、
その間にプログラムを修正しつつ、異常な書き込みにより
削除されてしまった書き込みをバックアップから復旧するという、
激しいリカバリ作業をするはめになってしまいました。。。
 
朝方やっと落ち着いてきたようなので、httpd startさせてみましたが、
急いで作ったプログラムが不具合だらけだったのか、
昼間dfしてみた結果がまたまた悲惨なことになってました。。。


Filesystem    1K-blocks     Used   Avail Capacity  Mounted on
/dev/aacd0s1e  22020096 22****** 0    102%    /
/dev/aacd0s1e         1        1       0   100%    /skel
devfs                 1        1       0   100%    /dev
/dev/aacd0s1d         1        1       0   100%    /ports

再度、httpdを落とし、データをロールバックし直し、
プログラムに修正を施しまくりまして、やっと今日ぐらいに
サイトが落ち着きを取り戻してきた感じがします。

お陰様で、今回はcrontabファイルの中身が消えてしまったり、
他のファイル、サーバー全体への影響も予想以上に大きく、
過去いくつかの掲示板でも痛い思いはしてきましたが、
一番影響が大きかった気がします。
 
復旧までの数日間、一部の書き込みが消えてしまったりと、
ご利用者の皆様にも大変ご迷惑をお掛け致しました。
心からお詫び申し上げます。
 
仕事の関係で、サイト更新作業に時間をかけることが非常に困難であるので、
ユーザーさんのマナーに期待してサイト運営を続けてしまっておりますが、
中には悪意のある方がいることも十分肝に銘じ、
今後もサイト運営を継続していきたいと思います。
 
色々とご連絡下さった皆様、本当に有難うございました。
まずはこの場を借りまして、御礼申し上げます。

久しぶりの更新です

最後に日誌を更新したのが昨年末でしたので、4ヶ月近く書き込みしてませんでした。
仕事に、何かに、忙しい日々を過ごしてはいるようなのですが、
思い出しても何かやったかな?という感じで、
大した成果も残せていないのがツライところです。
 
2002年夏に取得したdtn.jpも、あと少しで丸十年経過してしまいますが、
それまでにはこのドメインも、もうちょっとは活躍してくれればと願うばかりです。
 
そんな一見放置しっぱなしのサイトではありますが、さすがに完全放置してはおらず、チョコチョコと小修正はしておりました。
 
まずは画像掲示板のデザイン変更。
目玉のvectorファイルを拾ったので、何かに使えないかなぁと思い色とか変えましたが、、
半日くらいで終わる作業ですね。。
siterighttop.png
 
次に、ツイッターやらFacebookやらのカウント整理。これも一瞬で終わる作業です。。
sitecenterunder.png 
 
最後に、新たなアフィサイトの制作。これは一日一時間を一週間程度でしょうか。。
siteleftunder.png
 
あまり意味のない作業ばかりやってましたが、仕事でやってる制作とかの
息抜きにやってるような作業ですので、これくらいが限界ですね。
 
新年度も始まりましたので、新たなコンテンツ制作もやってみようかな。

PHPのstrlen()

このタイトルを書いて、あのことだなとご想像がつく方も多いと思いますが、
まさにその通りのお話です。。。
UTF-8の環境にて、PHPのstrlen関数で文字列のカウントをすると、
全角文字が2バイトではなく1から6バイトとしてカウントされるというものでした。
 
この開発日誌を読み直してみたところ、1年前くらいにサイトの文字コードを
SJISからUTF-8に変えていたので、この間あちこち不具合あったのだろうな
と恐縮するばかりです。
 
さて、対処方法ですが、こちらに解説付きでまとめられてますので、
詳しくはリンク先をご確認頂きたいと思いますが、
要はstrlen()を使う時には文字コードをSJISに変えてしまえということでした。



strlen(mb_convert_encoding($text,"SJIS","UTF-8"))


放ったらかしの画像掲示板を少々手入れした際に、
文字カウントがどうもおかしい....と思って気が付いたのですが、
なんともお恥ずかしいお話です。
 
 
imgbbs_201109.gif
さて、その放ったらかしだった画像掲示板ですが、
ホント僅かではありますが書き込みもあったようなので、
せっかくですからサブドメイン化をして、ディレクトリと分けてみました。
それに合わせてデザインも少々変え、サイト名も画像掲示板の泉としてあります。
見よう見まねで作った掲示板プログラムですので、まだ不具合多いとは思いますが、
よろしければご利用下さい。

jQueryでレスアンカーポップアップ

最後にプログラムを更新したのが、2010年末だったという、
ほぼ放ったらかし状態の画像掲示板dtnですが、
その際に新機能を一つ追加していたのを思い出しました。
 
書き込み内にレスアンカー( >>2 みたいなものですね )があった場合に、
これを自動的に該当記事までリンクさせるというものです。
↓のような感じで、掲示板phpに一行足しただけでしたけども。。。


$txt = preg_replace('/>>([0-9]+)/','\\0',$txt);

本当なら、他の掲示板でもよくあるように、Javascriptでポップアップさせ、
当該書き込みをそこに表示させたりもしたかったのですが、
なかなかうまくいかず...時間もなく...搭載を断念しておりました。
 
これを今回実際に組み上げてみました。
 
 
実は、初めはjQueryのお世話にならずに、単純にJavascriptで 
組み進めていたのですが、IEではうまくいっても、
Firefoxや他で動作が失敗してたりと、色々面倒になってしまい....
というわけでjQueryでやってしまいました。
 
で、完成したのがこんな感じです。 
popup.jpg
基本的な考え方はJavaScriptでやるのと同じで大丈夫です。
 
まず、下記のようにレスアンカーを表示させる為のdivをhtmlに用意しておく。

<div id="ID"></div>

次に、レスアンカー部分にマウスがのったらポップアップさせる
肝心のjQueryコードを書くのですが、
その前にアンカーリンク自体にも仕掛けをしておきます。
どの書き込みをポップアップさせるかを判別する必要があるからです。
 
という訳で、手っ取り早くする為、a link のname属性部分に、
表示させたいdivのidを仕込んでおきました。

<a href="#1" class="onMouse" name="d1">

 
で、最後は肝心のjQueryのソースとなります。

$(function(){
$("#ID").css({
opacity:"0.9",
position:"absolute",
display:"none"
});
$("a.onMouse").mouseover(function(){
var popupID = $(this).attr("name")
$("#ID").html($("#" + popupID).clone());
$("#ID").fadeIn("fast");
}).mouseout(function(){
$("#ID").fadeOut("fast");
}).mousemove(function(e){
$("#ID").css({
"top":e.pageY+10+"px",
"left":e.pageX+10+"px"
});
});
});
 
流れとしては、レスアンカーリンクにマウスがのった時に、
name属性の値を取得して、値のdivボックスデータをdiv#IDにコピー。
最後に、フェードイン、フェードアウトの設定を付けたという感じです。
 
とっても簡単な感じで、ブラウザの差異もあまり気にしなくていいですし、
ホントにjQueryさまさまです。
 
 
こんなことやる前に、ディレクトリの登録審査やら、
猫ねこサーチエンジンのXHTML化やら、
やること山ほどあるのですが、さっぱり進まず。
ご迷惑お掛けしてしまいます。
 
登録申請して下さった方々には大変申し訳ございませんが、
今しばらくのお時間を頂きたく、宜しくお願い致します。

電力使用状況API

東日本大震災により被害にあわれた皆様に心よりお見舞い申しあげるとともに、
犠牲になられた方々とご遺族の皆様に対し、深くお悔やみを申しあげます。
 
何もできない非力な自分が悲しいですが、少しでも力になれればと思い、
日々頑張っていこうと思っています。
 
さて、震災以後、計画停電や放射性物質の情報確認でネットをよく見てますが、
停電実施頃より、Yahoo! Japanトップページに東京電力の電力使用状況グラフが
表示されるようになっています。
yahoopowerusage.jpg
さすがはYahoo! Japanと思って自分も確認していたのですが、
それだけではなく、このデータを電力使用状況API として公開もしてありました!
 
という訳で、早速これを使って電力使用状況グラフを作ってみました。
作り方はいつもと同じで、リクエストURLにクエリを投げ、


http://setsuden.yahooapis.jp/v1/Setsuden/latestPowerUsage?appid=<あなたのアプリケーションID>

返ってくるXMLをパースして、データを抜き取ればよい感じです。
方法はこちら等と同じ方法です。
 
レスポンスデータから、電力使用量、最大供給量などが取得できると思います。
せっかく取得したデータですので、これをYahoo! Japanのように
グラフ化して表示する為、pChartを使ってみました。
このpChartは、phpにGDライブラリが組み込んであれば、かなり簡単に
折れ線グラフや、棒グラフ、円グラフの描画ができます。
 
pChartのページにサンプルコードがたくさん用意されているので、
使うグラフのサンプルコードを見て、データセットの部分の
数値配列、項目配列に、APIで取得したデータを入れれば完成です。

// Dataset definition
$DataSet = new pData;
$DataSet->AddPoint(array(10,2,3,5,3),"Serie1");
$DataSet->AddPoint(array("Jan","Feb","Mar","Apr","May"),"Serie2");
$DataSet->AddAllSeries();
$DataSet->SetAbsciseLabelSerie("Serie2");

取得したグラフ画像はpng画像にして出力できるので、
定期的にcronで画像作成し、保存するようにしてあります。
power_usage.jpg
 
一日も早い復興を願い、節電への協力をしていきましょう。

掲示板のバージョンアップ完了

dtnのディレクトリ部分を、テーブルレイアウトから
XHTML+CSSレイアウトへと変更しましたが、
まだやっていなかった画像掲示板部分も修正が終わりました。
これに合わせて色々不具合が発生していたプログラムも修正しておきました。
 
imgbbs_1009.jpg
 
どうやら、しばらく見ていなかったうちにYouTubeの仕様もだいぶ変わっており、
新しくなった埋め込みタグからID抽出するのも面倒だったので、
今度はURLからIDを引っこ抜くよう変えておきました。
 
ニコニコ動画の方は、各動画に、タイトル・ID・マイリスト登録数他....を
まとめたXMLデータが用意されていたので、
こちらを使ってデータ取得するようにしてみました。
  
それと、投稿フォーム部分を、JQUERYでタブ切り替えとしておいたので、
画像アップ、YouTube・ニコニコ貼り付けが、多少は分かりやすくなったかと。
imgbbs_1009-2.jpg
 
あまり人も集まらない画像掲示板ですので、
ほのぼの皆さんの情報交換にご活用下さい。

XHTMLとCSSレイアウトへ移行

あと数日で、dtn運営開始から丸8年が経ち、9年目に突入となりそうです。
9年目突入までに、サイト全体をテーブルレイアウトから
CSSレイアウトに変更しておきたいなぁ・・・といつぞや思ったことから、
XHTML+CSSでの制作、プログラム修正にはまってしまい、
ディレクトリの登録申請チェックを後回しにしてしまっておりました。
申し訳ございませんm(_ _)m

先々月のお詫び以来、さらに申請がたまってしまい、、、
現在4000サイト以上の申請待ちとなってしまっております。
順次確認、登録作業を進めておりますので、
今しばらくお待ち下さい。
宜しくお願い致します。
 
さて、とりあえずdtnの主要ページ等はテーブルレイアウトから
CSSレイアウトに変更することが出来ました。
まだ一部テーブルレイアウトのページがございますが、
順次修正したいと思っています。
 
dtn_image_100822.jpg
 
修正に合わせて、表示エンコードもSJISからUTF-8に変えたので、
プログラム的にもだいぶ楽になり、動きも軽快になった気もします。
微妙に新しくなったdtnを、是非とも今後とも宜しくお願い致します。