2010年11月12日

電書部マークアップvalidatorを作ってみた

[ Ruby 電子書籍 ]

電書部の技術班。今年はこればっかりやっていた気がする。

gihyo.jpで、電書部の技術解説の記事「電書部技術班,電子書籍配信サーバーに挑む」がはじまっています。その中でEPUB変換まわりの原稿書きました。

第4回 電書用マークアップYDMLを使った原稿作成と,YDMLパーサ
第5回 電書原稿からEPUBをつくりだす

何気ないふうを装いつつも、少しどきどきしながらYDMLという言葉を出しました。でもどこからも何の突っ込みもなくてそれはそれでちょっとさみしいものです。

YDMLパーサ記事について「なんでXMLパーサでやらないの?」という趣旨のつっこみがtwitterで入りました。思い起こすとそもそもパーサジェネレータ作った理由は

  • YDMLとは違うマークアップを目論んでいた
  • DSLぽいものをRubyで作ってみたかった
  • とにかく作ってみたかった
そんなことでした。が、何をぼけていたのか、テキスト混合ノードはXML的にはwell-formedじゃないからという恥ずかしい説明をしてしまいました。恥ずかしいのでその経緯はリンクしません。(tweet消してはいないので探せばみつかります)

XMLでのvalidateくらいやってみるかと思い立ってやってみましたら、RelaxNGの勉強からはじめたのに1時間くらいで出来てしまい愕然としました。

YDMLを少しだけ改変(ルートのエレメント定義して、書式が変なタグを修正)してwell-formed XMLにしたものにたいして、RelaxNG compact syntaxでスキーマを定義し、それをcompactじゃないsyntaxに変換したうえでNokogiri::XML::RelaxNGに喰わせています。

ちゃんとvalidateはできるのですが、validじゃなかったときのエラーメッセージが分かりづらい。場合によっては分かりづらいを通り越して意味不明なので実用性低めです。でもせっかく作ったのでgithubにあげました。

https://github.com/skoji/ydml_simple_validator

2007年12月27日

Ruby入門とか読むくらいならコレを読め

[ Ruby ]

いまさら気がついたことに激しく後悔しています。もっとずっと早く読めばよかった...。

Rubyソースコード完全解説: 第1章 Ruby言語ミニマム
http://i.loveruby.net/ja/rhg/book/minimum.html

このページでは冒頭でこんなことが書いてあります。

Ruby言語について、当面第一部を理解するのに必要な知識だけ簡単に解説しておく。プログラミング上のテクニックであるとか注意すべきところなんてものは全く指摘しないので、この章を読んだからと言ってRubyプログラムが書けるようになるわけではない。既にRuby言語の経験がある読者はこの章は飛ばして問題ないだろう。

とばして読んではいけません、もしあなたがRubyを手足のように使いこなせるのではなければ。とわたしは感じました。それはわたしのレベルが低すぎるのでしょうか。

この第1章、「ミニマム」というだけあって短いです。しかし、ユーザから見えるRubyの仕組みが簡潔にまとまっています。メカニズムの原則がわかります。メカニズムの原則がわかることが、そのメカニズムでかたちづくられたものを使いこなすのに、どれだけ重要かはいうまでもないでしょう。

プログラミングそのものはわかっていて、でもRubyはどう使えばいいんだろう? と思っているひとは、誰でもRHG第1章は読むべきです。と思います。

すくなくともわたしはもっと前によむべきだった、と思いました。クラス定義と定数定義、includeとnew、などが示唆的でした。はい。

2007年12月 1日

アルゴリズム

[ Ruby ]

http://blog.livedoor.jp/dankogai/archives/50957658.htmlをよんで。

メルセンヌ・ツイスタ以外は理解してたはずなのにけっこう忘れてる。ということで思い出すために実装してみます。Rubyで。

続きを読む "アルゴリズム" »

2007年11月25日

mixi-photo.rb

[ atom Ruby ]

さきほどからなんだかとまらなくなって、rubyでmixi用写真アップロードのライブラリ作ってみました。ドキュメンテーションもエラー処理もテストも皆無ですが一応置いておきます。

激しく添削希望です。

mixi-photo.rb

MixiPhoto.newすると既存のアルバム情報をとってきて、albumsに入れます。MixiPhoto#createAlbumで新規アルバムが作成できます。このとき、MixiPhoto#albumsは更新されません(ってよくないですね)。MixiPhotoAlbum#uploadPhotoするとアルバムの写真が更新されます。

超簡単な使い方例。

#!/usr/bin/ruby
$KCONV='u'
require 'mixi-photo'

user='foo@bar.com'  # mixi登録メールアドレス
pass='foobar'             # mixiパスワード

mixi = MixiPhoto.new(user, pass)

# 既存のアルバムに写真追加
mixi.albums.each { |x|
  x.uploadPhoto("./test.jpg")
}

# 新規アルバム作成、写真を追加
mixi.createAlbum("テストアルバム", "説明文").uploadPhoto("./someimage.jpg")

2007/11/26 0:59 version 0.0.2 createAlbumで説明文を必須にしました

2007/11/27 21:00 version 0.0.3 ちょっと手直し

2007/12/08 02:30 version 0.0.4 nonce生成方法のバグを、指摘に従い修正(ありがとうございます)

mixi 写真アップロードAPI

[ atom Ruby ]

このあたりを参考に、mixiのatom ppでの写真アップロードをちまちまRubyで検証してました。

ちょっとだけ自分用にメモ。

  • 今日現在では、リクエストのURLがhttp://photo.mixi.jp/atom/r=4になってるみたい。
  • アルバムのアクセス制御は
    • 公開: <permit:access>public</permit:access>
    • 友達まで: <permit:access>friends</permit:access>
    • 非公開: <permit:access>protected</permit:access>、このときは<permit:token>に閲覧キーを入れる

まだアルバム生成のとこまでしかできてない上になんだか恥ずかしいコードですが一応貼ってみます。検証用につくったんで、写真アップロードまで入れるかどうかはわかりませんが、もし変更したらここに反映させてきます。

追記: 一応ひととおり作りましたので、新しいほうをご参照ください。古いほうはひっこめました