– go to post
Bookmark this on Delicious
このエントリーをはてなブックマークに追加
はてなブックマーク - id3lib-rubyをSnow Leopardにインストール

id3lib-rubyをSnowLeopardにインストールしようと思ったんだけど、gemに怒られるばかりでインストールできない。でググったら以下のページに解決方法が書いてありました。

Installing id3lib-ruby on OS X Snow Leopard

インストール時にオプション指定しないと上手くインストールできないらしい。

sudo env ARCHFLAGS=”-arch x86_64″ gem install id3lib-ruby — –with-opt-dir=/opt/local


 
– go to post
Bookmark this on Delicious
このエントリーをはてなブックマークに追加
はてなブックマーク - Redmineのガントチャートに日付を出したい。

プロジェクト管理にRedmineを導入してみました。状況を報告する為にガントチャートをPDF出力してみたのですが、時間の単位が日付ではなく週で表示されるのでちょっと不評でした。。。

自分としてはそんなもんかなぁと気にならなかったのですが、同僚がRedmineのガントチャートに日付の表示を追加を見つけてきてくれたので、ブラウザでの閲覧時には日付を表示出来るように対応してみました。

やったことは参照先のまんまなんではしょりますが、ブラウザで日付で見れるとなると今度はPDFには反映されないの?ってことになります。

PDFの生成をどこでやっているのかわからないので、ムリです。って答えていたのですが色々調べているウチに/lib/redmine/export/pdf.rbでPDFを生成していそうって事がわかったので実験してみたところ日付が出るようになりました。

rubyがちゃんとわかっているわけではないので、ブラウザに対応した時の対応の真似事をしただけなのですが備忘録として書いておきます。(#addが追加した部分です。)

300行あたり

if gantt.months < 7
  show_weeks = true
  headers_heigth = 2*header_heigth
  if gantt.months < 3
    show_days = true
#   headers_heigth = 3*header_heigth
    headers_heigth = 4*header_heigth #add
  end
end
 
g_width = 210
zoom = (g_width) / (gantt.date_to - gantt.date_from + 1)
g_height = 120
t_height = g_height + headers_heigth
 
y_start = pdf.GetY
 
# Months headers
month_f = gantt.date_from
left = subject_width
height = header_heigth
gantt.months.times do 
  width = ((month_f >> 1) - month_f) * zoom 
  pdf.SetY(y_start)
  pdf.SetX(left)
  pdf.Cell(width, height, "#{month_f.year}-#{month_f.month}", "LTR", 0, "C")
  left = left + width
  month_f = month_f >> 1
end  
 
# Weeks headers
if show_weeks
  left = subject_width
  height = header_heigth
  if gantt.date_from.cwday == 1
    # gantt.date_from is monday
    week_f = gantt.date_from
  else
    # find next monday after gantt.date_from
    week_f = gantt.date_from + (7 - gantt.date_from.cwday + 1)
    width = (7 - gantt.date_from.cwday + 1) * zoom-1
    pdf.SetY(y_start + header_heigth)
    pdf.SetX(left)
    pdf.Cell(width + 1, height, "", "LTR")
    left = left + width+1
  end
  while week_f <= gantt.date_to
    width = (week_f + 6 <= gantt.date_to) ? 7 * zoom : (gantt.date_to - week_f + 1) * zoom
    pdf.SetY(y_start + header_heigth)
    pdf.SetX(left)
    pdf.Cell(width, height, (width >= 5 ? week_f.cweek.to_s : ""), "LTR", 0, "C")
    left = left + width
    week_f = week_f+7
  end
end
 
# Days headers
 
if show_days
  left = subject_width
  height = header_heigth
  wday = gantt.date_from.cwday 
  day_num = gantt.date_from #add
  pdf.SetFontStyle('B',7)
  (gantt.date_to - gantt.date_from + 1).to_i.times do 
    width = zoom
    pdf.SetY(y_start + 2 * header_heigth)
    pdf.SetX(left)
    pdf.Cell(width, height, day_name(wday).first, "LTR", 0, "C")
    # add ここから
    pdf.SetY(y_start + 3 * header_heigth)
    pdf.SetX(left)
    pdf.Cell(width, height, day_num.day.to_s, "LTR", 0, "C")
    day_num = day_num + 1
   # ここまで   
    left = left + width
    wday = wday + 1
    wday = 1 if wday > 7
  end
end

Posted – 3月 28th, 2009
under mac, ruby
Leave a comment
 
– go to post
Bookmark this on Delicious
このエントリーをはてなブックマークに追加
はてなブックマーク - RMagick勉強中

ImageMagick:
Uploaded with plasq‘s Skitch!

発想が貧素で何すれば面白いか思いつかないので、面白しろい事をしてる同僚の記事を真似つつRMagickを勉強してみることにしました。

参考にしたのはこちらの記事と公式のリファレンス

まずはじめに、イメージの作成

require 'rubygems'
require 'RMagick'
include Magick
pict = Image.new(200,200) {self.background_color = "white"}
pict.display
exit

Image.newでイメージを作成して、displayで表示しています。
XServerが入っていない環境では、displayメソッドは使えないみたいです。

また、displayメソッドはとっても便利なのですが、macのRMagickに問題があるらしくImageMagickのバージョンによって上手く表示されないそうで、実際Rotateメソッドを使って回転したオブジェクトをdisplayしたら、うちの環境では点滅表示されてしまいました。

次は、ファイルの表示。ほとんど新規作成と同じです。

mu = Image.new("mu.jpg")
mu.display
exit

そして回転

mu.rotate(10).display
exit

ここで、displayが点滅しまくってしまったので、ファイル保存することに。

mu.rotate(10).write("mu10.jpg")

とりあえず回転までできました。
mu10

今日はここまで。


 
– go to post
Bookmark this on Delicious
このエントリーをはてなブックマークに追加
はてなブックマーク - RMagickをインストールした。

同僚がPythonのPILで遊んでいて楽しそうだったので、
Rubyでも画像処理したい!と思いRmagickをインストールしてみました。

macでは、以下のコマンドでサクっとインストール

$ sudo port install ImageMagick
$ sudo gem install RMagick

適当な画像をリサイズし動作確認

require 'rubygems'
require 'RMagick'
 
cat = Magick::ImageList.new('ho.jpg')
cat.resize(0.1).display
exit

リサイズされた画像が表示されました。

で、つまづいたのがWindows
とりあえず、ImageMagickをインストールと思いhttp://www.imagemagick.org/script/index.phpより最新版をダウンロードしインストール。
続いてRmagick。RubyForgeよりrmagick-2.9.0-doc.tar.gzwをダウンロード、一向に落ちてこない。
しょうがないので、「RMagick-2.9.0-ImageMagick-6.4.8-6-Q8.zip mirror」でググったミラーからダウンロード

どうやらWindows版のRMagickはImageMagickのバージョンの整合がシビアらしくImageMagickが同梱されいた為、先にインストールしたImageMagickをアンインストール。ついてきたImageMagick-6.4.8-6-Q8-windows-dll.exeを実行
インストールできたら、以下のコマンドでrmagickをインストール

gem install rmagick-2.9.0-x86-mswin32.gem

これで、準備完了と思いmacと同じスクリプトを実行してみたのですが、なんかエラー

プロシージャエントリポイントtransparentPaintImageChroma がダイナミックリンクライブラリ CORE_RL_Magick_.dllから見つかりませんでした

ImageMagickが見えないのかな?とPATHを確認したりしてみたのですが問題なさそう。
(今考えると、DLLから・・・ってことだからDLLは見えてるわけでとんだお門違いですね。)

手詰まったのでGoogle先生に聞いてみたら、こちらにそのままズバリの記事を発見。
RMagickがVC++ 2008 でコンパイルされていることが問題とのことなので、Microsoft Visual C++ 2008 Redistributable Package (x86)をインストール
無事、動作確認ができました。

さて、これからがなにするかが問題だ。


 
– go to post
Bookmark this on Delicious
このエントリーをはてなブックマークに追加
はてなブックマーク - Notes/Ruby フィールドリスト作成

NotesDBのフィールドリストが必要になったので
簡単にRubyで書きました。

たいした内容じゃないので公開する必要なんてないんだけど
以前も書いたのですが、どっかにいっちゃって困ったのでなくさないようにメモ

#!ruby -Ks
require 'win32ole'
ns = WIN32OLE.new('Notes.NotesSession')
 
sv = gets.chomp
fn = gets.chomp
 
db = ns.GetDatabase(sv, fn)
 
title = db.Title
puts "DBTitle:#{title}"
 
forms = db.Forms
 
forms.each{|form|
  puts "FormTitle:#{form.name}"
  fields = form.fields
  fields.each{|field|
    puts field
  }
}

Posted – 12月 16th, 2008
under ruby, ノーツ
Leave a comment
 
– go to post
Bookmark this on Delicious
このエントリーをはてなブックマークに追加
はてなブックマーク - Notes 添付ファイル その2

RubyでNotesのメールを書き出す
を参考に、Notes添付ファイルを一括出力する処理をRubyで書いてみました。
まんまコピーなんですが、忘れないように記録

全件対象で処理した場合、エラーが発生し落ちてしまったので、
@Attachmentsで抽出したViewを作成し処理対象を添付ファイルが
存在する文書のみに変更しました。

require 'win32ole'
 
class Log
  def initialize(s)
    @@logger ||= Proc.new { |x| puts x }
    @@logger.call(s)
  end
 
  def Log.register_logger(p)
    @@logger = p
  end
end
 
class Notes
  class Session
    def initialize(server, dbname)
      @server, @dbname = server, dbname
      @session = WIN32OLE.new('Notes.NotesSession') or return nil
      @db = @session.GetDatabase(@Server, @dbname)
    end
 
    def each
      view = @db.GetView('Attachments')
      doc = view.GetFirstDocument
 
      while doc
        yield Notes::Document.new(doc)
        doc = view.GetNextDocument(doc)
      end
    end
    include Enumerable
 
    #添付ファイルをdirに書き出す
    def extract_files(dir)
      self.each do |doc|
        doc.each_attachment do |obj|
          name = obj.name
          Log.new "\t#{name}"
 
          #対象外の拡張子をチェックする
          ext = File.extname(name).downcase
          next if %w(htm html csv pif scr com bat).include?(ext)
 
          #書き出しメソッドを呼び出し
          doc.extract_file(name, "#{dir}/#{name}")
        end
      end
    end
 
    #添付ファイルをdir/fromに書き出す
    def extract_files_by_sender(dir, body_hash = nil)
      self.each do |doc|
        k = doc.unid
 
        #出力先の作成
        extract_dir = "#{dir}/#{k}"
        Dir.mkdir(extract_dir) unless File.exist?(extract_dir)
 
        doc.each_attachment do |obj|
          name = obj.name
          Log.new "\t#{name}"
          ext  = File.extname(name).downcase
          next if %w(htm html csv pif com bat).include?(ext)
          doc.extract_file(name, "#{extract_dir}/#{name}")
        end
      end
    end
  end
 
  class Document
    def initialize(doc)
      @doc = doc
    end
 
    def each_attachment
      a = @doc.Items or return
      a.each do |obj|
        yield Notes::Attachment.new(obj) if obj.Type == 1084 #ATTACHMENT
      end
    end
 
    def unid;    @doc.UniversalID; end
 
    def extract_file(name, path)
      obj = @doc.GetAttachment(name) or return
      begin
        obj.ExtractFile(path)
      rescue => e
        Log.new "**** #{e.message} ****"
      end
    end
  end
 
  class Attachment
    def initialize(obj)
      @obj = obj
    end
 
    def extract_file(path)
      @obj.ExtractFile(path)
    end
 
    def name
      @obj.Values[0]
    end
  end
end

呼出し側

require 'notesruby'
require 'optparse'
 
opt_hash = Hash.new
opt_hash['dir'] = '.'
 
p ARGV
ARGV.options do |opt|
    opt.on('-d [dir]') { |v| opt_hash['dir'] = v }
    opt.on('-s') { |v| opt_hash['same_folder'] = v }
    opt.parse!
end
 
dir = File.expand_path(opt_hash['dir'])
if !File.writable?(dir) || ARGV.size == 0
  Log.new "Usage: ruby #{$0} [-s] [-d dir] file [file...]"
  exit
end
 
body_hash = Hash.new
ARGV.each do |arg|
  if m = arg.match(/(.*)@(.*)/)
    nsf, svr = m[1, 2]
  else
    nsf, svr = [arg, '']
  end
 
  if db = Notes::Session.new(svr, nsf)
    Log.new "添付ファイル抽出...(#{arg})"
    if opt_hash['same_folder']
      db.extract_files(dir)
    else
      db.extract_files_by_sender(dir, body_hash)
    end
  end
end