プログラム

google chrome frame ためしてガッテン

by oganosin. 0 Comments

しかし、ブログに書くべきことはすでに
http://d.hatena.ne.jp/con_mame/20090924/1253769270
ここにまとめられていました・・・。

google chrome frameのすばらしい点は

  • サイト製作者側からもユーザー側からもgoogle chrome frameの使用を指定できる
  • プラグインの判定Javascriptまで用意されている

の2点に尽きるのではないかな。

んで、実際自分の管理しているサイトにメタタグを入れてみると・・・
おお~IE6で透過PNGがちゃんと表示されている!!!
今後製作するサイトにはすべてメタタグ

<meta http-equiv="X-UA-Compatible" content="chrome=1" />

を入れるようにしよう、と今の時点では思う。

初めてのwordpress plugin その1

by oganosin. 0 Comments

勉強がてらwordpressのpluginを作ってみた。
どうやらwordpressのpluginはadd_filterで出力に対してフィルターをかけることが
一つの定番のようです。当初はDBなんかは使わず、出力に対してフィルターをかけることがメインかと思う。

参考にしたのは
http://zone.maple4ever.net/blog/archives/440/
このサイト。
まずは初めてのプラグインということで、Ktai_styleにteltoリンクを追加するものを
作成してみた。ソースは以下の通り。
例えば 0120-000-000
なんかにリンクがつくはず。

<?php
/*
Plugin Name: Add mobile links
Plugin URI: http://www.oganosin.net/
Description: add telto link to the entry
Author: oganosin
Version: 1.0
Author URI: http://www.oganosin.net
*/

add_filter('the_content', 'addteltolinks');

function addteltolinks($body) {
        if(!defined ('KS_VERSION')){
            return $body;
        }
        $body = preg_replace('/(\d{2,4}\-\d{2,4}\-\d{2,4})/',
                '<a href="tel:\\1">\\1</a>',
                $body);
        return $body;
}
?>

xml-rpc の勉強 その3

by oganosin. 2 Comments

今回はブログのデータ以降をxml-rpc経由でやってみようというサンプル。
wordpressだとDBをまるまる移すのが定番みたいだけど天の邪鬼にperl + xml-rpcでやってみました。
例によって公開できる部分だけ抜き出しているので、このソースはあくまでも雛型です。

ポイント

  • WordPress用のxml-rpcのメソッド wp.suggestCategories を使用
  • 記事の移行だけでメディアデータは持ってきていません

前回と同じく重複チェックには穴があるので要注意。

#!/usr/bin/perl

use strict;
use warnings;
use Encode;
use LWP::UserAgent;
use HTTP::Request;
use XML::LibXML;
use XMLRPC::Lite;
#use XMLRPC::Lite trace => 'debug' ;
use Data::Dumper;
use File::Basename;
use MIME::Base64;
use MIME::Parser;
use Getopt::Std;
use vars qw(%interface $username $passwd $target $postcnt);

BEGIN {
	$interface{'from'} 
		= 'http://www.example.com/blog/xmlrpc.php';
	$interface{'to'}
		= 'http://www.example.net/blog/xmlrpc.php';
	$username = 'xxxxxx';
	$passwd  ='xxxxxx';
	$target  = '';
	$postcnt = 100;
}

# get original data
my $rpc = XMLRPC::Lite->new();
$rpc->proxy($interface{'from'});
my $res = $rpc->call("metaWeblog.getRecentPosts",
	1,	# blog ID
	$username,
	$passwd,
	$postcnt,
)->result;

$rpc->proxy($interface{'to'});
foreach my $content (@{$res}) {
	# get posts
	#print Dumper $content;
	my ($title, $description, $date, $excerpt, $wp_slug, $keyword);
	$title = $content->{'title'};
	$description = $content->{'description'};
	$date = $content->{'dateCreated'};
	$excerpt = $content->{'excerpt'};
	$wp_slug = $content->{'wp_slug'};
	$keyword = $content->{'mt_keywords'};

	# check data
	$target = "http://www.example.net/blog/uncategorized/"
		. $wp_slug
		. "/";
	my $ua = new LWP::UserAgent;
	my $req = new HTTP::Request(HEAD => $target);
	my $resp = $ua->request($req);
	if($resp->{'_rc'} eq '200'){
		print STDERR "Alredy convert URL: $target\n";
		next;
	}

	# edit posts
	
	# get category_id
	$res = $rpc->call("wp.suggestCategories",
		1,	
		$username,
		$passwd,
		Encode::encode('utf8', $content->{'categories'}[0]),
	)->result;
	my $category_id = $res->[0]{'category_id'};

	$res = $rpc->call("metaWeblog.newPost",
		1,	# blog ID
		$username,
		$passwd,
		{
		'title'
			=> Encode::encode('utf8', "$title"),
		'description'
			=> Encode::encode('utf8', "$description"),
		'dateCreated'
			=> Encode::encode('utf8', "$date"),
		'mt_excerpt'
			=> Encode::encode('utf8', "$excerpt"),
		'mt_keywords'
			=> Encode::encode('utf8', "$keyword"),
		'wp_slug'
			=> Encode::encode('utf8', "$wp_slug"),
		#'custom_fields'=> [ 
		#	{
		#	'key'   => '',
		#	'value' => '',
		#	},
		#],
		},
		1
	)->result;
	my $postid = $res;

	$res = $rpc->call("mt.setPostCategories",
		$postid,
		$username,
		$passwd,
		[
			{
				"categoryId" => $category_id,
				"isPrimary"  => 1
			}
		]
	)-> result;
}

exit 1;

定価:

EAN:


xml-rpc の勉強 その2

by oganosin. 1 Comment

というわけでその2.今回はいきなりレベルアップして
xmlのデータをwordpressにxml-rpc経由でpostする
というプログラムのサンプル。例によって公開できる部分だけ抜き出しているので、このソースはあくまでも雛型です。

以下注意点

  1. STDINがshiftjisなのはxmlの文字コードが実はshiftjisだったから
  2. check wordpressの部分はサーバーの設定のよって違うと思うので適宜変更のこと
  3. for文が降順なのはxmlのデータが生成時間の新しいものから並んでいるのでそれをwordpressでも引き継ぎたかったから

しかし、wordpressには罠が潜んでした・・・。
wordpressは存在しない投稿スラッグを指定した場合、指定された投稿スラッグに近い投稿スラッグがあればそちらにリダイレクトしてくれる。
たとえばこの記事のパーマリンクは
http://www.oganosin.net/blog/programming/xml-rpc-part2/
なんだけど
http://www.oganosin.net/blog/programming/xml-rpc-part/
でもアクセスできるはず。
なので下記のスクリプトの重複チェックには穴があります。

#!/usr/bin/perl

use strict;
use warnings;
use Encode;
use encoding "utf-8", STDIN => "shiftjis", STDOUT => "utf-8";
use LWP::UserAgent;
use HTTP::Request;
use XML::LibXML;
use XMLRPC::Lite;
#use XMLRPC::Lite trace => 'debug' ;
use Data::Dumper;
use File::Basename;
use MIME::Base64;
use MIME::Parser;
use Getopt::Std;
use vars qw($interfaceurl $blogid $username $passwd $target);

BEGIN {
	$interfaceurl = "http://www.example.com/wp/xmlrpc.php";
	$blogid = 1;
	$username = 'xxxxx';
	$passwd   = 'xxxxx';
	$target = '';
}

sub read_bin_file(){
	my ($filename) = @_;
	#--------------------
	# read in the picture
	my $fh = IO::Handle->new();
	open($fh, $filename) or die "$! $filename";
	local($/) = undef;  # slurp
	binmode($fh);
	my $bits  = <$fh>;
	close($fh);
	return $bits;
}


# get XML data
my $ua = new LWP::UserAgent;
my $req = new HTTP::Request(GET => 
	"http://www.example.com/data.xml");
my $resp = $ua->request($req);

my $parser = XML::LibXML->new();
my $doc = $parser->parse_string($resp->content);

my $rpc = XMLRPC::Lite->new();
my @items = $doc->getElementsByTagName('item');
for(my $i=$#items; $i>=0; $i--){
	my ($wp_slug,$description,$excerpt,$img);
	# edit data

	# check wordpress
	my $posturl = "http://www.example.com/wp/uncategorize/"
		. $wp_slug
		. "/";
	my $req = new HTTP::Request(HEAD => $posturl);
	my $resp = $ua->request($req);
	if($resp->{'_rc'} eq '200'){
		print STDERR "Alredy convert URL: $posturl\n";
		next;
	}

	my $rpc = XMLRPC::Lite->new();
	$rpc->proxy($interfaceurl);
	my $res = $rpc->call("metaWeblog.newMediaObject",
		$blogid,
		$username,
		$passwd,
		{
			'bits' => XMLRPC::Data->type('base64',
				&read_bin_file($img)),
			'type' => "image/jpeg",
			'name' => basename($img),
		}
	)->result;
	$img = $res->{'url'};

	$res = $rpc->call("metaWeblog.newPost",
		$blogid,
		$username,
		$passwd,
		{
		'title' =>
			Encode::encode('utf8', "$title"),
		'description'  =>
			Encode::encode('utf8', "$description"),
		'dateCreated'  =>
			Encode::encode('utf8', "$date"),
		'mt_excerpt'  =>
			Encode::encode('utf8', "$excerpt"),
		'wp_slug'  => $wp_slug,
		'custom_fields'=> [ 
			{
			'key'   => '',
			'value' => '',
			},
		],
		},
		1
	)->result;

	my $postid = $res;
	$res = $rpc->call("mt.setPostCategories",
		$postid,
		$username,
		$passwd,
		[
			{
				"categoryId" => 1,
				"isPrimary"  => 1
			}
		]
	)-> result;
}
exit 1;