Pages

2011年6月27日月曜日

構造化ドキュメント作成管理ツール Sphinxを試す

ドキュメント作成ツール Sphinxが注目されている。ざっと調べてみたが、Wikiと違い構造化ドキュメントを作成するのに適しているようだ。
LaTeXも出力出来るし、アドオンでダイアグラムやUML図もできるようなので、これを私の標準ドキュメントツールとして採用することにした。
日本語サイトは、ここ http://sphinx-users.jp/index.html

さくらVPSへのインストールは、ここを参考にしました。
http://b.l0g.jp/dev/sphinx-on-centos55/

[baker]$ su -
[baker]# yum install python-pip python-setuptools
[baker]# pip-python install sphinx

あっさり、終了。インストールしたパッケージは
  • python-pip -- pythonのパッケージ管理ツール
  • python-setuptools -- パッケージ・インストーラ makeに近いのか?

一般ユーザでテストドキュメントを作成してみた。
気になったこと、問題になったこととしては
  • デフォルトのデザインがもう少しなんとかならないかな。
  • ファイル名を間違えた。警告をうっかり見過ごした。
  • ソースをみるで、日本語が化ける。文字コード指定がないのか。

ドキュメントの作成とリリース、メンテナンス、公開については
  1. リポジトリ内でプレーンテキストで保管
  2. プレーンテキストでVersion管理
  3. 自動バッチでサイトにアップし、一気にコンパイル
  4. プロジェクト管理システム内にドキュメントリンクを張る
で良いだろうか。

2011年6月26日日曜日

Node.jsのwebフレームワーク expressのチュートリアルを試す

node.jsの多分、現在一番有名なWebアプリケーションフレームワークexpressのチュートリアルをためした。
express github

cd work/
# fooと言う名のプロジェクトを作る
express foo && cd foo
# 必要とするパッケージをこのプロジェクトディレクトリ内にセット
rpm install -d
# パッケージ一覧をみる
npm list
application-name@0.0.1 /home/baker/work/foo
├─┬ express@2.3.12 
│ ├── connect@1.5.1 
│ ├── mime@1.2.2 
│ └── qs@0.1.0 
└── jade@0.12.4 

# 実行してみると
node app.js

パッケージの説明

  • express -- web application framework
  • connect -- 他社ミドルウエアを動作させるためのフレームワーク
  • mime -- mime type一覧 multipurpose internet mail extention
  • qs -- Query Stringsを解析してJSON形式で出力
  • jade -- viewテンプレート

基本となるアプリケーションのセットはapp.jsに書くそうだ。
railsで言うところのroute.rbだろうか。

初期プロジェクトの構成は以下のようになっている。
$ tree -L 2
.
|-- app.js              # アプリケーション本体
|-- logs                # ログ保管
|-- node_modules        # モジュールの保管場所 railsのvender/plugin
|   |-- express
|   `-- jade
|-- package.json        # パッケージ情報
|-- pids                # ロックファイル保管
|-- public              # 公開ディレクトリ 実際に公開するときはどうするかな
|   |-- images
|   |-- javascripts
|   `-- stylesheets
`-- views               # Viewファイルの保管場所
    |-- index.jade
    `-- layout.jade

いろいろと気になることは
* データベース関連はどうなるのかな。MVC構造をどうするのか。
* サンプルプログラムが提供されているけど、どうやって取得して利用するかな。
* リリース(デプロイ)する時にはどうするのか。

2011年6月19日日曜日

コンテキストメニューの「印刷」

最近は簡単な業務アプリをrailsで作成しているが、その時にいつも課題となるのが印刷。
印刷は、おおむねpdfで実現している(逃げている)が、自動で印刷したいとニーズも多い。

調べてみたが、どうもすっきりした手がない。恐らく、正解はsambaでプリンターサーバを立てることではないかと推定しているが、大掛かりすぎるな。

結局、Webアプリケーションを稼働させているサーバ(windows)にアクロバットリーダをインストールし、oleで操作することにした。pdfファイルを右クリックし、コンテクストメニューの「印刷」を選んで印刷する。この操作をOLEで実現することだ。
掲示版で記載されていたアイディアの拝借です。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/40924

Linuxサーバでは使えないが、Net::ssh/sftpライブラリを使って、リモートのwindowsプリンタサーバにpdfファイルを送信して、このプログラムをキックさせれば良いだろう。

事前作業は2つ。
  • アクロバットリーダインストール
  • Active Script Ruby
OLEを実現するため、ASRに含まれるwin32oleライブラリを利用することにした。

#!ruby -Ks
=begin
filename : print.rb
必ず ファイルをShiftJISにて保管すること
実行 : $ ruby print.rb 
=end
require 'win32ole' # oleを操作するライブラリ

class WIN32OLE
  include Enumerable # oleのコレクション操作にeachを使うため(かな?)
end

parent, name = File.split(File.expand_path(ARGV.shift))
parent.gsub!("/", "¥¥") # フルパス指定するときに問題にならないように

shell = WIN32OLE.new('Shell.Application')  # シェルを起動
verbs = shell.NameSpace(parent).ParseName(name).Verbs # コンテクストコマンドリスト取得

if v = verbs.find {|v| v.Name == "印刷(&P)" }
  v.doIt
  sleep(2) # 起動が遅い場合 (excel とか),少し待ってあげないとだめ(らしい)。
end

2011年6月5日日曜日

iCalendarでgoogleカレンダーへの登録を自動化

会社で使っているグループウエアのスケジュール情報をGoogleカレンダーに写すことを考えてみた。グループウエアにicalファイルを発行する機能があらば良いのだが、あいにくそのような機能はない。
用意するプログラムの概要は
  • 会社のグループウエアのデータベースからsqlでスケジュールファイルを出力
  • スケジュールファイルからicalファイルを作成し、webで公開
  • Googleカレンダーで「その他のカレンダー」を追加。(url指定)

iCalendarは、RFCで定義されている、カレンダー情報の共通規約です。あんまり、普及していないような気もしますが。詳細は定義は、以下が日本語でわかりやすいです。
iCalendar

icalendarを扱うライブラリが、rubygemにありましたので、それをインストールします。
$ sudo gem install icanlendar

sqlで取得したスケジュールファイルはこんな感じ。
ZZZ FW切り替え作業 監視 |       |      | 2011-06-04 00:00:00 | 2011-06-04 00:00:00
月曜ミーティング        |       |      | 2011-06-06 09:00:00 | 2011-06-06 10:00:00

require "rubygems"
require "icalendar"
require "kconv"    # 日本語の文字コードを扱うための標準ライブラリ
require "date"
# OpenStruct (標準ライブラリ)
# javascriptのobjectのようにプロパティの追加を気楽に扱う
# http://memo.yomukaku.net/entries/244
require "ostruct" 

schdule_file = 'schedules.dat'
schedules = []
File.readlines(schedule_file).each do |line|
  v = line.split(/\|/).map{|val| val.strip}
  next unless v.size > 1
  schedule = OpenStruct.new
  schedule.user = v[0]
  schedule.event = v[1]
  schedule.content = v[2]
  schedule.place = v[3]
  schedule.start = DateTime.parse(v[4])
  schedule.end = DateTime.parse(v[5])
  schedules.push schedule
end

cal = Icalendar::Calendar.new
# VEVENT コンポーネント
# ここがスケジュールの本体
schedules.each do |schedule|
  cal.event do
    dtstart schedule.start, {'TZID' => 'Asia/Tokyo'}
    dtend   schedule.end  , {'TZID' => 'Asia/Tokyo'}
    summary schedule.event
    description schedule.content
  end
end

# STANDARD コンポーネント
standard_component = Icalendar::Component.new('STANDARD')
standard_component.custom_property('dtstart', '19700101T000000')
standard_component.custom_property('tzoffsetfrom', '+0900')
standard_component.custom_property('tzoffsetto', '+0900')
standard_component.custom_property('tzname', 'JST')

# VTIMEZONE コンポーネント
vtimezone_component = Icalendar::Component.new('VTIMEZONE')
vtimezone_component.custom_property('tzid', 'Asia/Tokyo')
vtimezone_component.add(standard_component)
cal.add(vtimezone_component)

# iCalファイル
ical_file = 'calendar.ics'
File.open(ical_file, "w+b") { |f|
    f.write(cal.to_ical.toutf8)
}

さらっと、書いたが実はいろいろと苦労した。
  • 最初はタイムゾーンを設定せずに作成したため、時間がずれた
  • Googleカレンダーの更新が遅いため、ファイルを変更してもカレンダーに反映せず

それにしても、Googleカレンダーはどの程度の間隔で外部カレンダー情報を更新しているのだろうか? サイトを調べた限りでは、数時間ということだが、なんかいつまでたっても更新しない。

困ったもんだ。