解決できた方に1,000ポイント進呈します。

サーバ上のサイボウズ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.
※エラーの状況は追記します。

この問題を解決できる方、よろしくお願いします。

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2012/11/14 08:45:29
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。
id:news1

質問者から

news12012/11/07 18:09:54

なお Gcal Connection for Cybozu Office は既に試用しており、大変優良なソフトであることは承知しております。但し当方の条件だと19,800円が必要で、稟議では却下されてしまいました。

ベストアンサー

id:a-kuma3 No.3

回答回数4973ベストアンサー獲得回数2154

ポイント950pt

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だけで済むことが分かってきたので、対応してみました。おざなりなものですが。

テストが十分ではないのでおそらく不具合(特にRRULE)が結構あると思います。人柱希望の方はどうかお試しください。

http://blog.as-is.net/2006/11/cybozu2ical-010.html

ここを踏み込んでいくには、問題がある 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 メンバが空っぽのままになっていそうです。

# これが原因くさいので、コメントの内容を転記しました

他37件のコメントを見る
id:a-kuma3

あ、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 のファイル名って、ファイル名の先頭はピリオドになってますよね?

2012/11/13 22:13:25
id:a-kuma3

キャンセルで良かったのに。
これで、逃げられなくなっちゃったじゃないですか(嘘♪)

2012/11/14 08:56:33

その他の回答5件)

id:oil999 No.1

回答回数1728ベストアンサー獲得回数320

ポイント25pt

Cyrus SASL がインストールされていないのではないでしょうか。
下記を参照してください。
http://arinux.net/?eid=4

id:news1

以下のとおり関係モジュールをインストールしたのですが、同じエラーが出ます。

[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

2012/11/08 08:53:48
id:saiken1212617 No.2

回答回数3ベストアンサー獲得回数0

ポイント25pt

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オプションで実行してみてはいかがでしょうか?

他1件のコメントを見る
id:news1

次のようなエラーが出ます。
コマンドの記述が間違ってますでしょうか?

[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: コマンドが見つかりません

2012/11/08 09:03:41
id:news1

パスが通ってなかったようです。
以下のように書き換えて実行しました。
[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.

2012/11/08 09:12:33
id:a-kuma3 No.3

回答回数4973ベストアンサー獲得回数2154ここでベストアンサー

ポイント950pt

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だけで済むことが分かってきたので、対応してみました。おざなりなものですが。

テストが十分ではないのでおそらく不具合(特にRRULE)が結構あると思います。人柱希望の方はどうかお試しください。

http://blog.as-is.net/2006/11/cybozu2ical-010.html

ここを踏み込んでいくには、問題がある 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 メンバが空っぽのままになっていそうです。

# これが原因くさいので、コメントの内容を転記しました

他37件のコメントを見る
id:a-kuma3

あ、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 のファイル名って、ファイル名の先頭はピリオドになってますよね?

2012/11/13 22:13:25
id:a-kuma3

キャンセルで良かったのに。
これで、逃げられなくなっちゃったじゃないですか(嘘♪)

2012/11/14 08:56:33
id:news1

質問者から

news12012/11/09 16:24:02

モジュールの状況

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

id:GRY No.5

回答回数58ベストアンサー獲得回数2スマートフォンから投稿

難しい問題ですね。
インストールでエラーするなら、パソコン変えてやったらどうでしょ。

id:nikodesu No.6

回答回数1025ベストアンサー獲得回数39

ここを活用しましょう。
http://centossrv.com/patio/patio.cgi

  • id:a-kuma3
    news1 さんに、ひとつお願いがあります。

    cybozu2ical スクリプトで HASH のエラーを引き起こす原因となったスケジュールは、どんな指定で作ったもので、その指定だと CSV で type には、どんなデータが吐き出されていたのか、ってことを、コメントに書いてもらえませんか?
    これから同じようなはまり方をする人に、情報を提供する、と言う意味で。
  • id:news1
    了解です。
    エラーの出たスケジュールは、「繰り返し予定」という設定で、
    繰り返し条件『毎日、毎日(土日を除く)、毎週n曜日、毎月n日』
    期限『期限なし、n年n月n日まで』
    という設定ができるものでした。
  • id:a-kuma3
    >繰り返し条件『毎日、毎日(土日を除く)、毎週n曜日、毎月n日』
    上記の四つのうち、選ばれてたのは「毎週n曜日」での「毎月最終木曜日」ってことですよね、きっと。
  • id:news1
    その通りです。毎週金曜日と毎月最終木曜日を登録していました

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません