Home

日記
引っ越しEdit

自分メンテサーバーがあまりにも高負荷&不安定な状況が続き、それをメンテするモチベーションも払底して久しいので、諸々動いていたアプリケーション群を撤収してしまい、オンラインでの活動はtwitterで時々つぶやくだけになっていたんだけど、やっぱり長文を書く場所がほしいよねということで、自分で管理しなくてもいいサーバー上にWordPressをインストール。すげー初期の頃のWordPressしか使ったことがなかったんだけど、新しいWordPressはすごくよくできているんだね。俺の趣味とは違う方向だけど、それでもすごい。

で、tDiaryとかMovableTypeとかの過去の記事をインポートしようと試してみたんだけど、俺があんまり標準的(というかブログ的)な記事を書いていなかったせいか、t2m.plにWikiStyle対応パッチを当てて、tDiaryからMT形式へのエクスポートしてみたら、かなり変なデータになってしまった。これじゃちょっとインポートはできないな。

tDiary形式のデータから直接MT形式にエクスポートするのではなく、tDiaryの通常画面を日付ごとにwgetして本文部分のHTMLを取得し、それを加工してからMT形式データとして出力した方が、まともなデータを作れそうだ。いつかやる気が出たらそうやってインポートしよう。

Published At2010-05-07 08:13Updated At2010-05-07 08:13

技術日記
tDiaryからMT形式で出力するスクリプトEdit

tDiaryからWordPressにデータをインポートしようとして、

とかを試してみたんだけど、うまくいかなかったんで適当にでっち上げた。コメントとかトラックバックには対応していないし、内部リンクとかの解決もしてない。なぜか画像へのリンクだけは適当に変換かけてある。

HTTPでがしがしアクセスしまくるんで、共有サーバーとかでそのまま実行しちゃだめ。自力で安全に使用できそうな人は参考にどうぞ。

#!/usr/bin/php
<?php

define('DEBUG', false);
mb_internal_encoding('utf-8');

$author = 'ishinao';
$baseUrl = 'http://tdiary.ishinao.net/';
$dailyPattern = 'Ymd.\h\t\m\l';
$sourceImagePath = 'images/';
$destImagePath = '/wp-content/';

$startDate = '2009-10-29';
$nextDate = $startDate;

while ($nextDate = processDay($nextDate)) {
}

function processDay($date)
{
 global $baseUrl, $dailyPatten;
 $url = getDailyUrl($date);
 debug($url);
 $html = file_get_contents($url);

 $body = getBodyHtml($html);
 //debug($body);

 $sections = splitSections($body);
 $sectionInfo = array();
 foreach ($sections as $section) {
 //debug($section);

 $sectionInfo[] = array(
 'html' => $section,
 'body' => cleanupSection($section),
 'title' => getTitle($section),
 'category' => getCategory($section),
 );
 }
 foreach ($sectionInfo as $section) {
 printSection($date, $section);
 }

 $nextDate = getPrevLink($html);
 debug($nextDate);

 return $nextDate;
}

function printSection($date, $section)
{
 global $author;
 $title = $section['title'];
 $date = date('m/d/Y h:i:s A', strtotime($date));
 $body = $section['body'];
 $categories = $section['category'];
 echo <<<EOD
AUTHOR: $author
TITLE: $title
STATUS: Draft
ALLOW COMMENTS: 0
CONVERT BREAKS: __default__
ALLOW PINGS: 0

EOD;
 foreach ($categories as $category) {
 echo 'CATEGORY: ' . $category . PHP_EOL;
 }
 if (!empty($categories)) {
 echo 'PRIMARY CATEGORY: ' . $categories[0] . PHP_EOL;
 }

 echo <<<EOD
DATE: $date
-----
BODY:
$body

-----
EXTENDED BODY:

-----
EXCERPT:

-----
KEYWORDS:

-----

--------

EOD;
}

function cleanupSection($html)
{
 global $baseUrl, $sourceImagePath, $destImagePath;

 $result = trim($html);
 $result = preg_replace('#^<div>#', '', $result);
 $result = preg_replace('#</div>$#', '', $result);
 $result = preg_replace('#<h3>.+?</h3>#', '', $result);
 $result = preg_replace('#<a name="p\d+".+?</a>#', '', $result);
 $result = preg_replace('/(' . preg_quote($baseUrl, '/') . ')?' . preg_quote($sourceImagePath, '/') . '/', $destImagePath, $result);
 return trim($result);
}

function getCategory($html)
{
 $result = array();
 if (preg_match('#<h3>(.+?)</h3>#', $html, $matches)) {
 $title = preg_replace('#<span>.+?</span>#', '', $matches[1]);
 $title = trim(strip_tags($title));
 if (preg_match_all('#(\[[^\]]+\])#', $title, $matches)) {
 foreach ($matches[1] as $match) {
 $category = trim($match, '[] ');
 $result[] = $category;
 }
 }
 }
 array_unique($result);
 return $result;
}

function getTitle($html)
{
 if (preg_match('#<h3>(.+?)</h3>#', $html, $matches)) {
 $title = preg_replace('#<span>.+?</span>#', '', $matches[1]);
 $title = trim(strip_tags($title));
 $title = preg_replace('#^(\[[^\]]+\]\s*)+#', '', $title);
 return $title;
 } else if (preg_match('#title="(.+?)"#', $html, $matches)) {
 return $matches[1];
 }
}

function splitSections($html)
{
 $result = array();
 $splitter = '<div>';
 $splits = explode($splitter, $html);
 if (count($splits) > 1) {
 array_shift($splits);
 $splits[count($splits) - 1] = preg_replace('#</div>\s*$#', '', $splits[count($splits) - 1]);
 }
 foreach ($splits as $split) {
 $split = trim($split);
 if ($split == '') {continue;}
 if (trim(strip_tags($split)) == '') {continue;}
 $result[] = $splitter . $split;
 }
 return $result;
}

function getBodyHtml($html)
{
 if (preg_match('#(<div>.+</div>\s*)<div>#ims', $html, $matches)) {
 return $matches[1];
 }
}

function getPrevLink($html)
{
 if (preg_match('#<link rel="prev".+?href="(.+?)".*?>#', $html, $matches)) {
 $link = $matches[1];
 if (preg_match('#(\d{4})(\d{2})(\d{2})#', $link, $matches)) {
 return $matches[1] . '-' . $matches[2] . '-' . $matches[3];
 }
 }
 return null;
}

function getDailyUrl($date)
{
 global $baseUrl, $dailyPattern;
 return $baseUrl . date($dailyPattern, strtotime($date));
}

function debug($string)
{
 if (DEBUG) {echo $string . PHP_EOL . str_repeat('-', 50) . PHP_EOL;}
}

Published At2010-05-07 15:15Updated At2019-12-30 15:35

日記
WordPress Wiki Plugin?Edit

はじめに

入れてみたけど、何が出来るのかよくわからない。ひとまずこの投稿はWiki Friendly Pageとして投稿してみる。

なるほど

投稿する際に、Wiki Friendly Pageにしておくと、TOC(Table Of Contents:目次)とかを表示できるようになるのね。TOCは見出し2以下が認識されるみたいだ。あと、TOCはトップページとか記事一覧には表示されず、個別記事ページでのみ表示されるみたい。

で、多人数で編集できるようにするには、誰でもアカウントを取得できるようにしておかないといけないのかな?

多人数で編集するために

はじめから編集出来る人を決めてアカウントを発行しておくのでなければ、WordPressを誰でもアカウントを登録できるように設定しておき、新規ユーザーのデフォルトの権限をWiki Editorにしておくといいようだ。

新規にアカウントを登録してログインすると、Wiki Friendly Pageとして投稿された記事を表示するときに、編集機能へのリンクが表示されるようになる。そこから、記事の編集ページにいける。

記事の投稿自体は、通常のWordPressの投稿編集機能を使う。特別にWiki記法を使って編集するモードに切り替わるわけではない。Wiki Friendly Pageでは、編集履歴なんかも見ることができるようになる。

セキュリティ的にはどうなんだろう? WordPressの投稿編集機能って、記述内容には特に制限はないよね? 一応ユーザー登録にはメールアカウントが必要だし、編集したら管理者にメール通知がくるようにできるから、実用上はそれほど大きな問題はないのかな?

通常のコメントでのフィードバック以上のフィードバックが欲しい場合とかに、使うといいのかな? まあメールアドレスを伴なうユーザー登録っていう敷居の高さがあるから、そう簡単には参加してもらえないだろうけど。

Published At2010-05-08 08:08Updated At2010-05-08 08:08

日記
2010-05-10のアイテムEdit

Published At2010-05-10 23:27Updated At2010-05-10 23:27

日記
マウスでドラッグした部分をTwitterに引用するブックマークレット - 頭ん中Edit

マウスでドラッグした部分をTwitterに引用するブックマークレット - 頭ん中.

のbookmarkletをベースに、最終的には、

javascript:(function(){var d=document;var s='';if(d.selection)s=d.selection.createRange().text;else{if(d.getSelection)s=d.getSelection();else{if(window.getSelection)s=window.getSelection();}}var t=d.title;var h=location.href;window.open('http://twitter.com/home?status='+encodeURIComponent(h+'%20"'+s+'" %C2%BB '+t), null)})();
といった感じにした。Firefoxだとbookmarkを編集するときに半角スペースとかが自動的に%20に展開されてしまうんだっけ? なんかその辺で無駄に悩まされた。

Published At2010-05-11 08:35Updated At2010-05-11 08:35

技術日記
Amazon Reloaded Plugin改造Edit

WordPressでAmazonから書誌情報を取得するプラグインは、ググったらWP-Amazonという名前をあちこちで見かけるんだけど、WordPressの管理ツールからプラグイン検索しても出てこない。よくわからないんで、Amazon Reloadedとかいうのをインストールしてみた。

投稿ページでAmazonを検索して、見つかった商品の画像やタイトルをリンク付きで投稿フォームに挿入する、という基本的な機能は十分なんだけど、これは著者情報とかはとってきてくれないらしい。著者情報は個人的には必須なんで改造して対応させた。

amazon-reloaded-for-wordpress.php

$imageUrls = array();
 $images = $item->getElementsByTagName('URL');
 for ($imageNumber = 0; $imageNumber < $images->length; $imageNumber++) {
 $imageUrls[] = $images->item($imageNumber)->nodeValue;
 }
// ↓ここから↓
 $authorNames = array();
 $authors = $item->getElementsByTagName('Author');
 for ($authorNumber = 0; $authorNumber < $authors->length; $authorNumber++) {
 $authorNames[] = $authors->item($authorNumber)->nodeValue;
 }

 $actorNames = array();
 $actors = $item->getElementsByTagName('Actor');
 for ($actorNumber = 0; $actorNumber < $actors->length; $actorNumber++) {
 $actorNames[] = $actors->item($actorNumber)->nodeValue;
 }

 //$item = array('asin'=>$asin, 'name'=>$name, 'detailPageURL'=>$detailPageUrl, 'imageURLs'=>$imageUrls);
 $item = array('asin'=>$asin, 'name'=>$name, 'detailPageURL'=>$detailPageUrl, 'imageURLs'=>$imageUrls, 'authors' => $authorNames, 'actors' => $actorNames);
// ↑ここまで↑

amazon-reloaded.js

var $newRow = jQuery('#arfw-result-template').clone().attr('id','arfw-result-' + this['asin']).addClass('arfw-result');
 $newRow.html($newRow.html().replace(/%ASIN%/g,this['asin']).replace(/%NAME%/g,this['name']).replace(/%DETAIL_PAGE_URL%/g,this['detailPageURL']).replace(/%IMG_SRC%/g,this['imageURLs'][0]).replace(/%IMG_SRC_MED%/g,this['imageURLs'][1]).replace(/%IMG_SRC_LRG%/g,this['imageURLs'][2]));
// ↓ここから↓
 if (this['authors']) {$newRow.html($newRow.html().replace(/%AUTHOR%/g,this['authors'].join(', ')));}
 if (this['actors']) {$newRow.html($newRow.html().replace(/%ACTOR%/g,this['actors'].join(', ')));}
// ↑ここまで↑

meta-box.php

<td>
 <p></p><a target="_blank" href="%DETAIL_PAGE_URL%">%AUTHOR%『%NAME%』%ACTOR%</a> <a href="%DETAIL_PAGE_URL%"><?php _e( 'Send Link to Editor' ); ?></a></p>
</td>

なんて感じで、%AUTHOR%と%ACTOR%で著者と出演者をテンプレートに埋め込めるようにした。

Published At2010-05-11 10:01Updated At2019-12-30 15:34

日記
BN-SDCLP3を買うとMedia Travelerがもらえるキャンペーンがもうすぐ終わるよEdit

BN-SDCLP3を買った人が対象の期間限定「Meida Traveler SD 1Seg Editionプレゼントキャンペーン」受付期間が5/14(金)24時で終わっちゃいますよ。

Media Travelerってのは何かというと、いわゆる携帯電話向けワンセグ録画ビデオをPC(Windows)で再生できるツール。

私の場合、テレビコンテンツを自分の好きな形で消費するために、ソニーのロケフリ(PC、WindowsMobile向け)とかDTCP-IP対応DLNA(RD-A600、DMR-BW950、REGZA、BRAVIA、LT-H91LAN)とかiPhone用のTVPlayer+「SEG CLIP」 GV-SC310とかいろいろ試してきて、やっぱりFriio的なデジタル放送コピーフリー化装置に手を出さなきゃだめかと悩んでいたところに、このMedia Travelerを使ったソリューションに出会い、今のところそれで落ち着いてます。

もともとDIGA DMR-BW950は持ってるんで、携帯電話互換のワンセグ録画データは手軽に作成&持ち出しできていたんだけど、携帯電話をプレイヤーとして使っちゃうと電池持ちとかが気になってあんまりばりばり使う気になれなかった。

そこで、このMedia Traveler。これがあればDIGA作ったワンセグ録画ビデオデータをPCで再生できるようになる。もちろん携帯電話でも再生できるけど、PCが使える場所でPCの方で見られるなら、電池持ちとかはだいぶ気にしなくてもよくなる。

ワンセグ自体は著作権保護が厳しくないのに、その録画データはやけに厳しく著作権保護されちゃってるせいで、ワンセグ録画ビデオデータを再生できるソフトって、なぜかほとんど存在しないんだよね。

私の場合は、たいていのテレビ放送コンテンツは内容が把握できれば、画質や音質はほとんど気にしないし、ワンセグクオリティでもいいから自分の好きなタイミングで見られることの方が重要なんで、ワンセグ画質でもさほど問題はない(時々字幕がつぶれて読めないのはいやだけど)。

Media Traveler自体のできはあまりよくない(動作が遅いし、見るだけで削除とかできない)んだけど、まあひとまず最低限は使えている。この手のソフトで良くあるマルチ画面での不具合ってのも特にないみたいだし。

ちなみにこのMedia Travelerというか、ワンセグ録画ビデオデータは基本的に著作権保護に対応したメモリカード(SDカード)およびメモリスロットがないと動作しない。BN-SDCLP3とかはもちろん対応しているし、私の使っている新VAIO Z(VPCZ1)も著作権保護対応SDカードスロットを持っているんで、そのまま扱える。

でもPanasonic以外のノートPCでは著作権保護対応のメモリカードスロットを載せていない場合が多いんで、そのあたりは注意が必要。モバイルでミニノートを使って再生しようと思ったら、ミニノートのカードスロットが非対応で、外付けカードリーダーを差さなきゃならなくなったりしたらミニノートの意味がなくなるし。

あとは、最近のDIGAが持っている地上波以外の放送をワンセグ互換データとして出力する機能や、ワンセグ上位互換の高画質で出力する機能で作ったデータを、このMedia Travelerで再生できるのか試してみたいところ。その手の高画質ワンセグには対応していないとは書かれているんだけど、どう対応していないのか実際に試してみないとよくわからないし。

Published At2010-05-11 15:09Updated At2010-05-11 15:09

日記
2010-05-12のアイテムEdit

読んだ

Amazon注文済み

積ん読棚卸し

結構たまってるな。消化しないと。

Published At2010-05-12 11:36Updated At2010-05-12 11:36

技術日記
Amazon Reloaded Pluginで空白(半角スペース)を含む検索が成功しないバグEdit

なぜかAmazon Reloaded Pluginで半角スペースを含む検索を行っても結果が返ってこないんで、ソースを見てみたところ、

$url .= 'Keywords='.urlencode(str_replace(' ', '%20', $terms)).'&';
となっていたんで、
$url .= 'Keywords='.rawurlencode($terms).'&';
と修正したら半角スペースを含む検索も動くようになった。urlencodeで半角スペースが「%20」ではなく「+」に変換されてしまうのを避けたかったのかな?

でも、Amazon Product Advertising APIでこの処理の後に電子署名をつけたりしているんで、その辺対応に変更する際に、なんかおかしくなったのではないかと推測。

signUrl関数の中でもなんか一生懸命それ関係の置換処理とか行ってるけど、素直にrawurlencode関数の方を使っておくようにすれば、全体的にもっときれいに書けそうだ。

Published At2010-05-12 15:28Updated At2019-12-30 15:32

日記
2010-05-13のアイテムEdit

読了

  • 筒井 康隆『アホの壁 (新潮新書)』 しょうもない書き飛ばしエッセイだなー。筒井がよく書く精神分析に絡めたあるある系与太ばなしが八割。小説の一部として書かれているこの手のネタは結構好きだったんだけど、この手のネタだけで一冊書き飛ばされるときつい。一応最後まで飛ばし読みしたけど、読まないで内容を想像してた方が楽しめたかも。

Amazon注文

Published At2010-05-13 08:56Updated At2010-05-13 08:56