« 2010年4月 | トップページ | 2010年6月 »

2010年5月の8件の記事

2010/05/31

WMVファイルをiPhoneで...それはHandBrakeの仕事でしょう

本ブログで一番の人気記事は

 WMVファイルをiPhoneで

です。

当時、このやり方しか知らなかったのでそれを記事にしたのですが、一年経った今では別のやり方でiPhone用のファイルを作っています。
なので、そのまま放置するのも無責任かなと思い、改めて記事にしてみました。

現在使用しているソフトウェアは、

 HandBrake

です。

使い方はとっても簡単。

20100531

アプリケーションを起動すると、変換するファイルを選択するダイアログが表示されるのでそこで選択するか、"Source"のアイコンをクリックすると同じ様にダイアログが表示されるのでそこで選択します。

次に、"Toggle Presets"をクリックすると予めいくつかのデバイス用に初期設定されたリストが表示されるので、ここで"iPhone & iPod Touch"を選択します。

これで、"Start"を押して変換を実行すれば、数分後にmp4またはm4vの拡張子を持ったファイルが出来上がるので、これをiTunesに読み込ませて、iPhoneに転送するだけ。

しかし、残念ながら出来上がるファイルのサイズはWMVのおよそ2倍になってしまいます。でも、多少容量を消費しますができないよりできた方が便利なので、これはOKとする。

ということで、今年も同様に放送大学のレポートが終わってな〜い。今、必死に勉強中です。

| | コメント (2) | トラックバック (0)

2010/05/27

prawn-svg + Inkscape = サイズ調整

InkscapeでA4サイズの帳票を作り、prawnで作成したA4サイズのPDFに読み込んでみると、確かに読み込めるのですが、どうもしっくりこない。


しっくりこないと思ったら、Inkscapeとprawn-svgでは少し座標系が異なっているのが原因のようでした。

prawn-svgでは幅の指定ができ、その指定によってサイズの調整をするようなので、そこにA4サイズの横幅210[mm]を指定します。

次に用紙の左下が座標[0, 0]になるので、描画位置を左上に指定します。
これには高さを取得する必要があり、A4サイズの場合では297[mm]になるようです。

以上のことから、SVGを描画するコードは下記となります。

f = open("sample.svg")
svg_data = f.read
f.close

@pdf = Prawn::Document.new()
@pdf.svg(svg_data, :at => [0, 297.mm], :width => 210.mm)

ところが、これでもまだきちんと描画されません。297[mm]は、用紙の一番上になるはずですが、少し上に描画されてしまいます。

調べてみると、どうやらPrawnでは用紙に余白が標準で設定されており、これが位置のずれに関係しているようでした。

なので、これを0mmに初期化してあげます。
Prawnの初期化で用紙の余白を0[mm]に設定することとし、以下のコードに書き換えます。

@pdf = Prawn::Document.new(
  :page_size => "A4",
  :left_margin => 0.mm,
  :top_margin => 0.mm,
  :bottom_margin => 0.mm
)

これで一件落着。
Inkscapeで描画した通りにPDFが生成されるようになりました。

良かった、良かった。

| | コメント (0) | トラックバック (0)

2010/05/20

prawn-svg + Inkscape = フォントを指定する

最近めっきりprawn-svgネタばかりで、Googleで「prawn-svg」を検索すると検索結果のランクにて本家を追い抜いてしまいました。
さて、そんなこんなで本日もまたprawn-svgネタです。

以前、日本語を表示する場合、フォントをあらかじめ指定しておけば良いという書き方をしましたが、フォントについてはInkscape内で指定した設定をきちんと帳票に反映して欲しいものです。ということで、その方法を探してみました。

prawn-svgでは「parser.rb」内の「map_font_family_to_pdf_font(font_family)」というメソッドでフォントを指定しているようです。

では、IPA明朝を指定する方法を探してみます。

Inkscapeでは、フォントにIPA明朝を設定するとSVG内で「font-family:IPAMincho;」と記述されます。これをprawn-svgに読み込ませると、フォント名は全て小文字になって「ipamincho」と認識されるようです。
IPA明朝のファイル名は「ipam.ttf」なので、このひも付けをすれば良さそうです。

僕の環境(MacOSX 10.6)では、フォントが

/Library/Fonts/

に入っているので、prawnにこれを認識してもらうためには、

[ipamincho] → [/Library/Fonts/ipam.ttf]

となれば良いはず。

parser.rbには、フォントの置き換え用に「GENERIC_CSS_FONT_MAPPING」(400行目付近)という配列が作ってあります。用途は違うかもしれませんが、ここではこれを使って指定できるようにしてみます。ついでなので、IPAゴシックの設定もしておきます。

GENERIC_CSS_FONT_MAPPING = {
  "serif" => "Times-Roman",
  "sans-serif" => "Helvetica",
  "cursive" => "Times-Roman",
  "fantasy" => "Times-Roman",
  "monospace" => "Courier",
  "ipamincho" => "/Library/Fonts/ipam.ttf",
  "ipagothic" => "/Library/Fonts/ipag.ttf"
}

そして、Inkscapeで文字を入力して、PDFに変換してみると...できた、できた。きちんとIPA明朝で表示されていました。

まだまだ、帳票の作成にはコツが必要だけど、十分使い物になる気がしてきました。
とりあえず...何しよう。

| | コメント (0) | トラックバック (0)

2010/05/18

prawn-svg + Inkscape = 帳票作成

先々週から細々といじっているprawn-svgですが、なんとかそれっぽく使えるようになってきました。

その後の調査でわかったことは、

  1. Inkscapeの吐き出すSVGでは、文字列のタグとして'text'と'flowRoot'の2種類があるが、prawn-svgでは'text'しか処理していない
  2. 日本語を表示しようとするとうまく出なかったのは、Inkscapeで設定しているフォントをprawnが認識出来ず、英字フォントで表示しようとしていたため

ということでしたので、これを解決するために少しソースをいじって、下記のコードを追加してみました。

##### lib/prawn/svg/parser.rb 160行目付近 #####

        when 'flowRoot'
          # Very primitive support for font-family; it won't work in most cases because
          # PDF only has a few built-in fonts, and they're not the same as the names
          # used typically with the web fonts.
          if font_family = style_attrs["font-family"]
            if font_family != "" && pdf_font = map_font_family_to_pdf_font(font_family)
              calls << ['font', [pdf_font], []]
              calls = calls.last.last
            else
              @warnings << "#{font_family} is not a known font."
            end
          end
      
          element.elements.each do |child|
            #puts child.attributes
            if child.name == 'flowRegion' then
              #element.text = child.text
              child.elements.each do |child2|
                child_attrs = child2.attributes
                opts = {:at => [x(child_attrs['x']), y(child_attrs['y'])]}
              end
            elsif child.name == 'flowPara' then
              element.text = child.text
            end
          end
      
          opts = {:at => [x(attrs['x']), y(attrs['y'])]}
          if size = style_attrs['font-size']
            opts[:size] = size.to_f * @scale
          end
            
          # This is not a prawn option but we can't work out how to render it here -
          # it's handled by Svg#rewrite_call_arguments
          if anchor = style_attrs['text-anchor']
            opts[:text_anchor] = anchor        
          end
      
          calls << ['text_box', [element.text, opts], []]

##### ここまで #####

次に実行する側のソースにてフォントをあらかじめ指定しておきます。

Prawn::Document.generate("sample.pdf") do
  font "ipag.ttf"
  svg svg_data, :at => [50, 200.mm], :width => 100.mm
end

これを実行するときちんと日本語が表示されて、万事OK。

現在のファイルをダウンロードできるようにおいておきます。もし、興味のある方がおられればご利用下さい。ちなみにprawn-svgのバージョンは0.9.1.8です。

「parser.rb」をダウンロード

prawnをインストールする必要があるから、無料や安めのレンタルサーバで使用するのは少し難しいかもしれないけれど、環境を自由に構築出来る自営のシステムではいろいろな使い道があるような気がします。

| | コメント (0) | トラックバック (0)

2010/05/09

prawn-svg + Inkscape = 円が描画されない

昨日に引き続き、Inkscapeで帳票を作る方法を模索中です。

今度は、タイトルにもあるとおり円が描画されない事について調査してみました。

prawn-svgでは、'circle'または'ellipse'というエレメントに対し、円を描画する処理を施すようになっています。しかし、InkscapeのSVGでは'path'のエレメントに'sodipodi:type'という属性を使って円を描画しているようでした。

'sodipodi'とは、Inkscapeの派生元のソフトウェアとのことです(Wikipedia参照)。

ということで、'path'というエレメントの処理中に円を処理するプログラムを割り込ませてみます。

##### prawn-svg-0.9.1.6/lib/prawn/svg/parser.rb 190行目付近 #####

when 'path'

  if attrs['sodipodi:type'] == "arc" then
    calls << ["ellipse_at",
      [[x(attrs['sodipodi:cx'] || "0"), y(attrs['sodipodi:cy'] || "0")],
      distance(attrs['sodipodi:rx']), distance(attrs['sodipodi:ry'])],
      []]
  else

  ## 略(元のコードそのまま) ##

  end

##### ここまで #####

ということで、変更後に再度実行してみるとエラーなくPDFが生成されました。
良かった、良かった。

ただ、楕円になるとおかしな形になっているので、これはまた後日解決したら記事にしてみます。

| | コメント (0) | トラックバック (0)

2010/05/08

prawn-svg + Inkscape = エラーで文字が表示出来ない

先日、Inkscapeで帳票を作ってprawn-svgでPDF化するという記事を投稿しましたが、Inkscapeで作成したSVGに文字列があるとエラーでPDFが生成できませんでしたので、ちょっと調べてみました。

調査の結果、文字列の読み込みに失敗しているようだったので、少しprawn-svgのソースコードを見てみると、prawn-svgではtextというエレメントの文字列を読み込んでいたのですが、InkscapeのSVGではtextの子エレメントのtspanというエレメントに文字列が入っているのでこれを読み込むように変更してみます。
変更内容は、以下の赤字の部分を追加しました。

##### prawn-svg-0.9.1.6/lib/prawn/svg/parser.rb 140行目 #####

# This is not a prawn option but we can't work out how to render it here -
# it's handled by Svg#rewrite_call_arguments
if anchor = style_attrs['text-anchor']
  opts[:text_anchor] = anchor
end

element.elements.each do |child|
  if child.name == 'tspan' then
    element.text = child.text
  end
end

calls << ['text_box', [element.text, opts], []]

##### ここまで #####

ということで、変更後に再度実行してみるとエラーなくPDFが生成されました。
良かった、良かった。

ただ、おかしなところで改行されているので、これはまた後日解決したら記事にしてみます。

| | コメント (0) | トラックバック (0)

2010/05/05

Ruby + PrawnとInkscapeで帳票ができそうです

昨日まで出勤だったので、GW最終日にして、やっとお家でのんびりと過ごせる休日になりました。
明日から仕事ですけど...

さて、先日のオープンソースサロンにて伝票作成システムについてお話をしましたが、その後の調査でPrawnというPDF作成ライブラリ向けにSVGファイルを読み込むクラスがあるようだということがわかりました。

mogest / prawn-svg

ということで、早速ダウンロードして、試してみました。

まず、インストール手順ですが、gemを使って簡単にインストールできました。

$ sudo gem install prawn-svg

ちなみに、prawn-svgにはprawn 0.8.4以上が必要ですので、インストールされておられない方はそちらもインストールされます。

次に、読み込むSVGファイルですが、このブログでも何度か紹介しているInkscapeを使用して作成します。

Inkscape

Inkscapeで四角や丸を描画したファイルを作成し、sample.svgという名前で保存します。

続いて、以下のコードをsample.rbという名前のファイルで、sample.svgと同じフォルダに保存します。

##### ここから #####

require 'rubygems'
require 'prawn'
require 'prawn/measurement_extensions'
require 'prawn-svg'

x = 0
y = 0
w = 1000

f = open("sample.svg")
svg_data = f.read
f.close

Prawn::Document.generate("sample.pdf") do
  svg svg_data, :at => [0, 200.mm], :width => 100.mm
end

##### ここまで #####

最後に次のコマンドを実行します。

$ ruby sample.rb

すると、同じフォルダにsample.pdfというPDFファイルが作成され、sample.svgの内容が読み込まれたPDFができあがっているはずです。

先日の発表では、伝票のフォーマット作成にはGUIのあるツールがあれば良いなと言っていましたが、どうやらこの課題は早々に解決してしまいそうですね。

本当の意味でのソースコードを修正したりできない僕でも、こうした各種ソフトウェアの組み合わせで、様々なソリューションを見つけられるのもオープンソースソフトウェアの醍醐味の一つかななんて思います。

どうですか、倉橋さん?
使いたくなりました?

| | コメント (0) | トラックバック (0)

2010/05/01

「死」を知ることは、「生きる」を知ること

先日、親戚の葬儀に参列してきました。
葬儀には多くの方が参列し、皆さんに惜しまれていました。

葬儀の中で、亡くなられた方の人生を生年から学生時代、就職、結婚と順番に説明する部分があるのですが、この中で大変様々なことに貢献された方だったことを初めて知るとともに、いろいろな事を考えさせられました。

そして、いつものように自分に置き換えてみる。

僕はいずれ死ぬのでしょう。
では、死んだ後に僕はどうなるのでしょうか。
死後の世界を妄想するのはネタが尽きませんが、それはそれほど重要ではないので、死後のこの現世はどうなるのかを考えてみます。

僕がいなくなって、誰かに悲しんでもらう事ができるのかな。
それとも、僕がいなくなって、誰かが喜んだりしないだろうか。

僕に依存している人はいるのかな?
僕が依存している人はどうだろう。

僕はほとんどの人に知られない、一個人に過ぎないけれど、これで良いのか?

生前から有名で、死後も広く語り継がれる人がいます。
一時期有名でも、誰にも知られる事無く消えていく人もいます。
生前は無名でも、死後に有名になる人もいます。
ある地域または分野において、神のごとき存在でも、他方では全く知られていない人もいます。
また、他方では悪魔のように忌み嫌われる人もいます。

でも、先に述べたように僕は小さな小さな一個人に過ぎないので、有名な方々と対比する意味がわからない。
僕がいなくなっても、いなくなったことは数少ない知人のうち、さらに近い数人に知られるだけなのでしょう。
そして、あっという間に風化し、みんなの記憶から消えていくだけ。

僕は何のために生きているのか。
僕が生きている事に何の意味があるのか。
僕は生きている間に何を成すべきなのか。

果たして意味なんてあるのか。
何かを成す必要もないのかもしれない。

だから何でしょう。

目の前にあるものを追い続けるのも人生。
目の前にあるものを追わないのも人生。
目の前に無いものを追うのも人生。

だから何でしょう。

ただ、先人の生き方だけが、これからも生き方の道標になる唯一の地図なのかもしれません。

というようなことを考えた時、これまでの自分の生き方やこれからの自分の生き方を今一度見直してみるのも悪くないかなと思う次第でした。

| | コメント (0) | トラックバック (0)

« 2010年4月 | トップページ | 2010年6月 »