サーバ上のサイボウズoffice6をgoogleカレンダーに同期させるために、Cybozu2icalを使いたいのですが、うまくいきません。
※他の回答者もいた場合、ベストアンサーの方を最高ポイントとして按分します。
Cybozu2icalの希望する使用法
3名分のスケジュールをそれぞれのgoogleカレンダーに同期させたい。
環境は以下のとおり
サーバ:さくらVPS
OS:CentOS 6.3
起動しないスクリプト:Cybozu2ICal
http://code.google.com/p/ogawa/wiki/Cybozu2ICal
モジュール:cpanにより以下インストール。
※cpanでのインストールが失敗したと判断してcpanmによるインストールも行っております。
モジュールの状態は追記で説明
Text::CSV 1.0+
DateTime
LWP
Class::Accessor::Fast
Data::ICal
YAML
この状態で ./cybozu2ical>cybozu.ics を実行すると、以下のエラーが出ます。
Can't use an undefined value as a HASH reference at ./cybozu2ical line 154.
※エラーの状況は追記します。
この問題を解決できる方、よろしくお願いします。
なお Gcal Connection for Cybozu Office は既に試用しており、大変優良なソフトであることは承知しております。但し当方の条件だと19,800円が必要で、稟議では却下されてしまいました。
rrule メンバが HASH になっていない、というエラーが出てます(No.2 の方が言われる通り)。
Cyboze2Ical のソース を見てみましたが、このデータを作っているのは cybozu2ical スクリプトではないので、ここを攻めても解決しないと思います。
んで、開発者ご本人のブログから。
大きな変更点は二つあって、ひとつはサイボウズオフィス6からカレンダーデータを取得・パーズする処理を分離して、WWW::CybozuOffice6::Calendarモジュールを作ったということです。
http://blog.as-is.net/2006/11/cybozu2ical-010.html
念のため、確認しますが、WWW::CybozuOffice6::Calendar って、導入してますよね?
zip をそのまま展開してあれば大丈夫ですが、質問でさらされているのが、Google code のスクリプト本体だけなのが、非常に気になってます。
http://code.google.com/p/ogawa/wiki/Cybozu2ICal
↑の cybozu2ical-0.36.zip を使ってますか?
単体はこちら(ブログにも書いてありますけど)。
ogawa - Revision 618: /trunk/WWW-CybozuOffice6-Calendar
導入済みであるとして、開発者当人もブログに書かれていますが、RRULE の解釈に問題があるのだと思います。
iCalendarのRRULEは常人の理解を超えているのでずっと敬遠してきました(RRULE, RDATEをフルサポートするカレンダーソフトウェアってまじすごいよ)。が、冷静にサイボウズが対応している反復イベントのパターンを観察してみていたら、割と単純なRRULEだけで済むことが分かってきたので、対応してみました。おざなりなものですが。
http://blog.as-is.net/2006/11/cybozu2ical-010.html
テストが十分ではないのでおそらく不具合(特にRRULE)が結構あると思います。人柱希望の方はどうかお試しください。
ここを踏み込んでいくには、問題がある RRULE のデータをさらさないと、誰にも解決できないと思います(開発者当人も)。
単純なカレンダーを用意できないでしょうか?
反復イベントが無ければ、正しく動作するような気がします。
もし、その確認ができたら、反復イベントをひとつ作って、また動作確認です。
もし、正しく動くようであれば、実際に連携したいイベントと何か差があるはずなんです。
以下は、WWW::CybozuOffice6::Calendar の関連がありそうなソースです。
rrule メンバが有効になるのは、RecurrentEvent (反復カレンダーイベント) だけのようですし、何がしかのデータが設定されてます。rrule メンバが HASH じゃないとは、ちょっと考えにくいですけどねえ...
cybozu2ical-0.36.zip に同梱されている RecurrentEvent.pm が、先の URL で参照できるソースとちょっと違ってました。
our %FREQUENCY = ( 'y' => 'YEARLY', 'm' => 'MONTHLY', 'w' => 'WEEKLY', 'd' => 'DAILY', # weekdays 'n' => 'WEEKLY', # fixed weekday, monthly 1 => 'MONTHLY', 2 => 'MONTHLY', 3 => 'MONTHLY', 4 => 'MONTHLY', 5 => 'MONTHLY', ); our @WEEK_STRING = ( 'SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA' ); sub parse { my ( $this, %param ) = @_; $this->SUPER::parse(%param); # rrule my ( $type, $day ) = ( $param{type}, $param{day} ); if ( defined $type && defined $day && exists $FREQUENCY{$type} ) { # ※ココ! my %rrule = ( FREQ => $FREQUENCY{$type} ); ... $this->rrule( \%rrule );
該当しそうなところを切り出すと、こんな感じになってて、ソースで持っている FREQUENCY のどれかにマッチすること、という条件があります。
これを満たしていないデータがあると、rrule メンバが空っぽのままになっていそうです。
# これが原因くさいので、コメントの内容を転記しました
以下のとおり関係モジュールをインストールしたのですが、同じエラーが出ます。
[root@www1××××]# rpm -qa | grep cyrus-sasl
cyrus-sasl-plain-2.1.23-13.el6.x86_64
cyrus-sasl-md5-2.1.23-13.el6.x86_64
cyrus-sasl-2.1.23-13.el6.x86_64
cyrus-sasl-devel-2.1.23-13.el6.x86_64
cyrus-sasl-lib-2.1.23-13.el6.x86_64
154 my %rrule = %{ $item->rrule }; で↓のエラーということは、
itemのrruleプロパティが定義されていないということになります。
Can't use an undefined value as a HASH reference at ./cybozu2ical line 154.
少しソースを見たのですが、rruleが何の設定かわかりませんね、
reference ruleのことのようですが。。
提示されていた、↓のURLに
http://code.google.com/p/ogawa/wiki/Cybozu2ICal
「--compat-google-calendarオプションの追加。Google Calendarのバグに対応するためにRRULE内でWKST=SUプロパティを指定する必要があるが、この指定はMacOS X iCalendarと互換性がない。デフォルトではWKST=SUプロパティは出力せず、--compat-google-calendarオプションを指定した場合のみ出力するようにした。」
と記載がありましたので、ためしに--compat-google-calendarオプションで実行してみてはいかがでしょうか?
次のようなエラーが出ます。
コマンドの記述が間違ってますでしょうか?
[root@www××× cybozu2ical-0.36]# cybozu2ical --conf /var/www/html/cybozu2ical-0.36/config.yaml --compat-google-calendar > /var/www/html/cybozu2ical-0.36/ical.ics
bash: cybozu2ical: コマンドが見つかりません
パスが通ってなかったようです。
以下のように書き換えて実行しました。
[root@www×××× cybozu2ical-0.36]# /var/www/html/cybozu2ical-0.36/cybozu2ical --conf /var/www/html/cybozu2ical-0.36/config.yaml --compat-google-calendar > /var/www/html/cybozu2ical-0.36/ical.ics
しかし以下のようなエラーが出てしまいます。
Can't use an undefined value as a HASH reference at /var/www/html/cybozu2ical-0.36/cybozu2ical line 154.
rrule メンバが HASH になっていない、というエラーが出てます(No.2 の方が言われる通り)。
Cyboze2Ical のソース を見てみましたが、このデータを作っているのは cybozu2ical スクリプトではないので、ここを攻めても解決しないと思います。
んで、開発者ご本人のブログから。
大きな変更点は二つあって、ひとつはサイボウズオフィス6からカレンダーデータを取得・パーズする処理を分離して、WWW::CybozuOffice6::Calendarモジュールを作ったということです。
http://blog.as-is.net/2006/11/cybozu2ical-010.html
念のため、確認しますが、WWW::CybozuOffice6::Calendar って、導入してますよね?
zip をそのまま展開してあれば大丈夫ですが、質問でさらされているのが、Google code のスクリプト本体だけなのが、非常に気になってます。
http://code.google.com/p/ogawa/wiki/Cybozu2ICal
↑の cybozu2ical-0.36.zip を使ってますか?
単体はこちら(ブログにも書いてありますけど)。
ogawa - Revision 618: /trunk/WWW-CybozuOffice6-Calendar
導入済みであるとして、開発者当人もブログに書かれていますが、RRULE の解釈に問題があるのだと思います。
iCalendarのRRULEは常人の理解を超えているのでずっと敬遠してきました(RRULE, RDATEをフルサポートするカレンダーソフトウェアってまじすごいよ)。が、冷静にサイボウズが対応している反復イベントのパターンを観察してみていたら、割と単純なRRULEだけで済むことが分かってきたので、対応してみました。おざなりなものですが。
http://blog.as-is.net/2006/11/cybozu2ical-010.html
テストが十分ではないのでおそらく不具合(特にRRULE)が結構あると思います。人柱希望の方はどうかお試しください。
ここを踏み込んでいくには、問題がある RRULE のデータをさらさないと、誰にも解決できないと思います(開発者当人も)。
単純なカレンダーを用意できないでしょうか?
反復イベントが無ければ、正しく動作するような気がします。
もし、その確認ができたら、反復イベントをひとつ作って、また動作確認です。
もし、正しく動くようであれば、実際に連携したいイベントと何か差があるはずなんです。
以下は、WWW::CybozuOffice6::Calendar の関連がありそうなソースです。
rrule メンバが有効になるのは、RecurrentEvent (反復カレンダーイベント) だけのようですし、何がしかのデータが設定されてます。rrule メンバが HASH じゃないとは、ちょっと考えにくいですけどねえ...
cybozu2ical-0.36.zip に同梱されている RecurrentEvent.pm が、先の URL で参照できるソースとちょっと違ってました。
our %FREQUENCY = ( 'y' => 'YEARLY', 'm' => 'MONTHLY', 'w' => 'WEEKLY', 'd' => 'DAILY', # weekdays 'n' => 'WEEKLY', # fixed weekday, monthly 1 => 'MONTHLY', 2 => 'MONTHLY', 3 => 'MONTHLY', 4 => 'MONTHLY', 5 => 'MONTHLY', ); our @WEEK_STRING = ( 'SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA' ); sub parse { my ( $this, %param ) = @_; $this->SUPER::parse(%param); # rrule my ( $type, $day ) = ( $param{type}, $param{day} ); if ( defined $type && defined $day && exists $FREQUENCY{$type} ) { # ※ココ! my %rrule = ( FREQ => $FREQUENCY{$type} ); ... $this->rrule( \%rrule );
該当しそうなところを切り出すと、こんな感じになってて、ソースで持っている FREQUENCY のどれかにマッチすること、という条件があります。
これを満たしていないデータがあると、rrule メンバが空っぽのままになっていそうです。
# これが原因くさいので、コメントの内容を転記しました
あ、php をインストールしたところを、あれなんですけど、ダウンロードの CGI を perl で書けば良いんじゃないか、ということに、いまさらながら気が付いた。
というわけで、↓のスクリプトをちょっといじる(ぼくは、perl が書けないので)。
http://chaichan.lolipop.jp/perlnote/perlnote2008-01-292.htm
#!/usr/bin/perl use strict; #宣言 my $FilePath = '/var/www/html/cybozu2ical-0.36/ical.ics'; my @FileName = split(/\\/, $FilePath); #ダウンロードファイルオープン open (DF, $FilePath) or die "cannot open '$!'"; #ヘッダー部ダウンロード print <<"HERE1"; Content-type: text/calendar; charset=utf-8 HERE1 #本体ダウンロード binmode DF; binmode STDOUT; while (my $DFdata = <DF>) { print STDOUT $DFdata; } #ダウンロードファイルクローズ close DF;
最初の一行は、perl の置き場所によって /usr/local/bin/perl とかに変更する必要があるかも。
スクリプトを download.pl という名前で保存して、パーミッションを 705 (or 755) にするのは、php のときと同じ。
もし、.pl なファイルが cgi として動作するようになってなかったら、.htaccess に以下を追加して、httpd を restart。
AddHandler cgi-script .pl
念のための確認ですけど、.htaccess のファイル名って、ファイル名の先頭はピリオドになってますよね?
キャンセルで良かったのに。
これで、逃げられなくなっちゃったじゃないですか(嘘♪)
モジュールの状況
cpanを使用してモジュールを再インストールした内容を転記します。
Text::CSV 1.0+
to find objects with matching identifiers.
Text::CSV is up to date (1.21).
DateTime
DateTime is up to date (0.77).
LWP
LWP is up to date (6.04).
Class::Accessor::Fast
Class::Accessor::Fast is up to date (0.34).
Data::ICal
Data::ICal is up to date (0.18).
YAML
YAML is up to date (0.84).
./cybozu2ical>cybozu.ics の実行時エラーについて。
Can't use an undefined value as a HASH reference at ./cybozu2ical line 154.
この154行には以下の内容が書かれてました。(実際には153行から転記)
153 # rrule
154 my %rrule = %{ $item->rrule };
155 $rrule{UNTIL} = to_icaldate( $rrule{UNTIL}, $item->is_full_day )
156 if $rrule{UNTIL};
157 $rrule{WKST} = 'SU'
158 if $param->{'compat-google-calendar'};
なお、config.yamlは次のように記述しています
cybozu_url: http://hoge/hoge/ag.cgi
calname: hoge-hoge
username: abcd
#userid:
password: hogepass
time_zone: Asia/Tokyo
tzname: JST
input_encoding: shiftjis
output_encoding: utf8
#calendar_driver: SyncCalendar
calendar_driver: ApiCalendar
date_range: 30
あ、php をインストールしたところを、あれなんですけど、ダウンロードの CGI を perl で書けば良いんじゃないか、ということに、いまさらながら気が付いた。
というわけで、↓のスクリプトをちょっといじる(ぼくは、perl が書けないので)。
http://chaichan.lolipop.jp/perlnote/perlnote2008-01-292.htm
最初の一行は、perl の置き場所によって /usr/local/bin/perl とかに変更する必要があるかも。
スクリプトを download.pl という名前で保存して、パーミッションを 705 (or 755) にするのは、php のときと同じ。
もし、.pl なファイルが cgi として動作するようになってなかったら、.htaccess に以下を追加して、httpd を restart。
念のための確認ですけど、.htaccess のファイル名って、ファイル名の先頭はピリオドになってますよね?
2012/11/13 22:13:25キャンセルで良かったのに。
2012/11/14 08:56:33これで、逃げられなくなっちゃったじゃないですか(嘘♪)