レンタルサーバで自前で運用していた WordPress から WordPress.com にデータを移した。これでどれだけ放っておいても安心だ!

先月さくらインターネットから CORESERVER.JP に移転した際、WordPress の記事の ID がずれてしまったようなので、元通りに修正しました。結果的に、各記事の URL がこの一ヶ月の間は変わってしまっていたので、各種ブックマークから飛んできた方が別の記事にたどり着いていたはずで、大変申し訳ないことをしてしまいました。そもそも記事のURLに管理上のIDを含めてしまったのが間違いのもとなのです。。

今回は WordPress のインポート機能は使わずに、MySQL から直接エクスポートしておいたデータを、phpMyAdmin 経由で直接書き戻しました。

広告

Windows のファイルシステムアクセスを監視したかったので、FileMonを使ってみた。

起動すると、「プログラムのデバッグ権限がない」というようなエラーメッセージが出たので、自アカウントに開発元のフォーラムを参考にしてデバッグ権限を付与する。

  1. [スタート]メニューから[ファイル名を指定して実行]で「secpol.msc」を実行
  2. [ローカルセキュリティ設定]ウインドウが開くので[セキュリティの設定][ローカルポリシー][ユーザー権利の割り当て]と順に開く
  3. [プログラムのデバッグ]ポリシーのプロパティを開いて[ユーザーまたはグループの追加]から自アカウントを追加する

以上でFileMonを起動できた。

ブラウザで ER 図を書ける WWW SQL Designer というツールがあります。ER 図から 様々な DBMS 向けの SQL 文を生成できるのですが、PostgreSQL 向けの SQL を出力し、PostgreSQL に食わせてみてもエラー。あれ?

例えば良くあるブログのモデルを書いて出力してみると、こうなりました。

CREATE TABLE entries(
id INTEGER NOT NULL serial,
name text NOT NULL default '',
title text NOT NULL default '',
body text NOT NULL default '',
excerpt text NOT NULL default '',
PRIMARY KEY (id)
);

うーん、正しくはこうじゃないのかな?serialってSERIAL型だよね?

CREATE TABLE runs(
id SERIAL NOT NULL ,
owner_id INTEGER default '0',
blog_id INTEGER default '0',
timezone text NOT NULL default '',
language text NOT NULL default '',
root BIT NOT NULL default '0',
PRIMARY KEY (id)
);

ということで、ちょっと手直ししてみました。

WWW SQL Designer Patch for PostgreSQL

xml2postgresql.xsl に適用してください。WWW SQL Designer 1.4.1 で確認済みです。

また、PostgreSQL で出力すると外部キー制約が出力されないので、これも Oracle 用スクリプトを参考にして出力するようにしました。

WWW SQL Designer は中間データを XML で保持していて、SQL へは XSLT で変換しているので、かなり容易に変更できました。

サーバ移転中

2008/01/8

これまでこのブログはさくらインターネットのホスティングサービスで運用していました。また、SubversionリポジトリやRailsで遊ぶためにDreamHostとも契約しています。

DreamHost は初年度は安いのですが、ちょうど契約してから1年経って値上がりしてしまったうえ、仕事が変わってRailsに触れる機会も減ってしまったので、どこか別のホスティングサービスにまとめてしまおうと考えました。 そこで、CORESERVER.JPがそこそこ良さそうだと聞いて、15日のお試し期間を利用してみたところ、レスポンスも機能もそこそこよかったので、移転を決断しました。

CORESERVER.JP(コアサーバー)は、PHP+MySQLの快適性を重視した大容量の次世代レンタルサーバーサービスです。

とサイトのトップに記載されているくらいなので、WordPressの動作は問題ないのですが、問題はDreamHostにホストしているSubversionリポジトリやRailsアプリケーションです。 Subversionリポジトリについては、どこかのSubversionホスティングサービスを利用しようと思っています。現在 Beanstalkを検討中です。RailsアプリケーションはCORESERVER.JPでも CGIでは動きそうなので、CORESERVER.JPに移そうと思います。

先ほど43hr.orgドメインのDNSレコードを変更したので、数日中にはCORESERVER.JPに向いているはずです。

WordPress 2.3.1

2007/11/27

気が向いたので、このブログのWordPressを最新バージョンである 2.3.1 に上げてみました。

WordPressは2.3からタグ付け機能をサポートしているので、これまで必要だったタグ関連のプラグインは不要になっています。有名どころのタグ付けプラグインからのインポート機能も提供されているので、簡単に移行できました。

現在、SQL Server からデータを読み取り、Excel ファイルを出力するアプリケーションを作っています。社内ツールなのですが、元になるデータが複雑かつ大量であるため、操作効率を重視して、ウェブアプリケーションではなくデスクトップアプリケーションです。そこで、開発環境として .NET Framework 2.0 を利用して C# で開発しています。

sourcecode language=”

S2Container.NETS2Dao.NETを利用することにし、サンプル集も公開されていたので、それを参考にして作ることにしました。サンプルに従い、アプリケーションは

  • Presentation層
  • Service層
  • Domain層

の3つからなるレイヤアーキテクチャを採用しています。使用するコンポーネントはS2Container.NET、S2Dao.NET、Quill、S2Form、S2Windows.NET、S2Unit.NET、そして本エントリのタイトルもあるS2Dxo.NETです。

はてなキーワードいわく、Dxoとは

Data eXchange Objectの略。プレゼンテーションモデルとドメインモデルを相互変換するオブジェクト。ライブラリにS2Dxoなどがある。

です。S2Dxoを利用すると、インタフェース定義だけでDxoを作れて大変便利なのですが、やはり標準で提供されている変換だけでは対応しきれない場合があります。例えば、データベース上は整数値で管理している項目を、画面上ではその値が示す意味を文字列で見せたいような場合、どうしても独自の変換が必要になります。

このような場合、S2Dxoの.NET版であるS2Dxo.NETではどうすれば良いのでしょう。サイトに説明はありませんでしたが、S2Dxo.NETのソースを読むと、独自の変換クラスを実装すれば、変換ルールを追加できそうです。以下、実装例です。

携帯電話を表すドメインモデルクラスMobilePhoneDtoを、表示用のMobilePhonePageに変換するDxoを作る想定です。MobilePhoneDtoにはキャリアを表すint型のCarrierID属性があるとし、MobilePhonePageはキャリア名を画面に表示するためのstring型のCarrierName属性があるとします。このような場合、まず独自の変換クラスを作ります。変換クラスは Seasar.Dxo.Converter.AbstractPropertyConverterを継承すればよいよいです。S2Dxo.NETのソースを見ると、Seasar.Dxo.Converter.Impl以下に様々な変換クラスの実装があったので、参考にすればよいです。

using Seasar.Dxo.Converter;
namespace Example.Logics.Dxo.Converter.Impl
{
    /// 
    /// キャリアIDをキャリア名に変換するためのコンバータクラス
    /// 
    public class CarrierConverter : AbstractPropertyConverter
    {
        /// 
        /// キャリア名
        /// 
        private static class CarrierName
        {
            public const string DOCOMO = "DoCoMo";
            public const string AU = "au";
            public const string SOFTBANK = "SoftBank";
        }
        /// 
        /// オブジェクトのプロパティを任意の型に変換します
        /// (抽象メソッドは派生クラスで必ずオーバライドされます)
        /// 
        /// 変換元のオブジェクト
        /// 変換先のオブジェクト
        /// 変換先のオブジェクトに期待されている型
        /// bool 変換が成功した場合にはtrue
        protected override bool DoConvert(object source, ref object dest, System.Type expectType)
        {
            // int 以外なら変換不能
            if (!(source is int)) return false;
            switch ((int)source)
            {
                case 0:
                    dest = CarrierName.DOCOMO;
                    return true;
                case 1:
                    dest = CarrierName.AU;
                    return true;
                case 2:
                    dest = CarrierName.SOFTBANK;
                    return true;
                default:
                    return false;
            }
        }
    }
}

以上が変換クラスです。そして、Dxoのインタフェース定義において、ConversionRule属性で変換クラスを以下のように指定します。

using Seasar.Dxo.Annotation;
using Example.Logics.Dto;
using Example.Logics.Page;
using Example.Logics.Dxo.Converter.Impl;
namespace Example.Logics.Dxo
{
    public interface IMobilePhoneDxo
    {
        [ConversionRule(PropertyName = "CarrierID",
                        TargetPropertyName = "CarrierName",
                        PropertyConverter = typeof(CarrierConverter))]
        MobilePhonePage ConvertToMobilePhonePage(MobilePhoneDto site);
        void ConvertPageToMobilePhone(MobilePhonePage page, MobilePhoneDto site);
    }
}

こんな感じです。これで IMobilePhoneDxo にインジェクトされるDxoオブジェクトを使えば、MobilePhoneDtoを画面表示用のMobilePhonePageに変換することができました。

以上

del.icio.us API

2007/10/10

del.icio.us API を使ってみようと思い、API について調査しました。help に注意事項が書いてあったので、意訳してみます。おかしかったら誰か指摘してください。

API

  • API は https で提供され、ベーシック認証を利用する。
  • API は開発中なので変更される可能性がある。バージョン管理しているが、旧バージョンの API は積極的に廃止していく予定。

注意事項

  • クエリとクエリの間は少なくとも 1 秒間待機すること。さもないとサーバから閉め出される。API にアクセスするライブラリをリリースする場合は、必ずこれを守ること。
  • サーバから閉め出されたら 503 エラーが返るので、適切に待機すること。
  • API を利用したソフトウェアをリリースするつもりなら、del.icio.us に知らせること。
  • ユーザエージェントは、クライアントを識別できるように適切に指定すること。”Java/1.4.3″ や “lwp-perl” のようなデフォルトのユーザエージェントでアクセスすると拒否されることがある。
  • 他人が使うソフトウェアやサービスをリリースする場合、ソフトウェアやサービスは、ユーザの明確な指示がない限り、リンクを追加したり URL を変更したりしてはならない。

[nice_link]http://del.icio.us/help/api/[/nice_link]

RMagick で画像に Wet floor effect を適用する

せっかく上の記事で勉強したので、Web アプリケーション化しました。名前はベタに「Reflectr」としておきます。

Reflectr

画像をアップロードすると、Wet floor effect を適用してくれます。床の色も指定できるようにしました。

アプリケーションは Ruby on Rails で、DreamHostにホスティングしています。作るのはそんなに苦労してませんが、DreamHost で動かすのに苦労しました。そのあたりは追々書きます。

ちなみに、ロゴはここで作ってみました。

Wet floor effect – Wikipedia, the free encyclopedia

画像や文字が床に反射しているようなエフェクトは Wet floor effect と呼ばれるらしい。確かにぬれた床っぽい。Wikipedia によると、Apple が初めにメジャにしたらしい。

僕もいろんな画像をぬれた床に映してやりたいのですが、Photoshop を使うほどのことじゃないし、そもそも Photoshop 入ってません。そこで我らが RMagick の出番です。

RMagick は ImageMagick の Ruby 用インタフェースで、ImageMagick がインストールされている環境なら gem でゴリっとインストールできます。

$ sudo gem install rmagick

RMagick のドキュメントを見ると、RMagick 1.15.0 以降には wet_floor というそのまんまのメソッドが用意されています。早速使ってみました。

まずは元となる画像を用意。パブリックドメインの画像を探してきました。
Original

では、やってみます。

$ irb
>> gem 'rmagick'
=> true
>> require 'RMagick'
=> true
>> include Magick
=> Object
>> originals = ImageList.new('original.png')  # 元画像から ImageList オブジェクト生成
=> [originalpng PNG 176x240 176x24000 DirectClass 8-bit 88kb]
scene0
>> reflection = originals.first.wet_floor  # wet_floor を呼ぶ
=> originalpng PNG 176x240=>176x80 176x24000 DirectClass 8-bit 88kb
>> reflection.write('reflection.png')  # wet_floor の結果をファイルに書き出す
=> originalpng=>reflectionpng PNG 176x240=>176x80 176x24000 DirectClass 8-bit 35kb

こんな感じで、wet_floor の結果を reflection.png に書き出してみます。
Reflection
wet_floor で生成される Image オブジェクトは映り込みの部分だけなので、実際に使う場合には元の画像とくっつけて出力する必要があります。

>> results = ImageList.new
=> []
scene
>> results << originals.first < [originalpng PNG 176x240 176x24000 DirectClass 8-bit 88kb
originalpng=>reflectionpng PNG 176x240=>176x80 176x800240 DirectClass 8-bit 88kb]
scene1
>> result = results.append(true)
=> originalpng PNG 176x240=>176x320 176x32000 DirectClass 8-bit 88kb
>> result.write('result.png')
=> originalpng=>resultpng PNG 176x240=>176x320 176x32000 DirectClass 8-bit 137kb

result.png はこうなります。
Result

以上で完成。今回試した限りでは JPEG ではまったく透明になりませんでした。環境の問題かもしれませんが、そのような場合でも一度 PNG などに変換してから処理すればよいと思います。