2018年12月28日金曜日

iCalendar 仕様

iCalendar 仕様

iCalendar コンテンツの作成にとりあえず役立ちそうな情報の抜書き。(正確な仕様は RFC にあたること)

目次

仕様書

iCalendar は RFC で定義されている。
  • RFC2445 (November 1998) Internet Calendaring and Scheduling Core Object Specification (iCalendar)
  • RFC2446 (November 1998) iCalendar Transport-Independent Interoperability Protocol (iTIP) Scheduling Events, BusyTime, To-dos and Journal Entries
  • RFC2447 (November 1998) iCalendar Message-Based Interoperability Protocol (iMIP)

全般

  • MIME タイプは text/calendar。テキストファイルとして記述。(RFC2445 3.1)
  • ファイル拡張子は ics、Macintosh ファイルタイプコードは iCal。free or busy time information のみ ifb。Macintosh では iFBf。(RFC2445 3.10)
  • 各行の区切りは CR+LF。(RFC2445 4.1)
  • 1行 75 octet 以内。行頭に空白を入れない。2行以上続ける場合に、2行目以降の行頭に空白を入れる。(RFC2445 4.1)
  • デフォルトの文字セットは UTF-8。(RFC2445 4.1.4)
  • 日付と時刻を一緒に記述する時は、間を T で区切る。例: 19980119T230000 (RFC2445 4.3.5)
    これらの日付時刻書式は、ISO 8601 Data Elements and Interchange Formate -- Information Interchange -- Representation of Dates and Times に定められた形式。
  • 時刻は、末尾に Z がつけば UTC、つかなければローカル時間。(RFC2445 4.3.12)

構造

   
BEGIN:VCALENDAR
PRODID:
VERSION:2.0
METHOD:PUBLISH
   
   
BEGIN:VTIMEZONE
TZID:...
   
   
BEGIN:STANDARD
 :
END:STANDARD
   
   
BEGIN:DAYLIGHT
 :
END:DAYLIGHT
   
   
END:VTIMEZONE
   
   
BEGIN:VEVENT
ORGANIZER:MAILTO:CI5M-NMR@asahi-net.or.jp
DTSTART;VALUE=DATE:20001009
DTEND;VALUE=DATE:20001010
RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=MO;BYMONTH=10;BYSETPOS=2;WKST=SU
LOCATION:
TRANSP:TRANSPARENT
SEQUENCE:
UID:
DTSTAMP:
CATEGORIES:
DESCRIPTION:
 :
SUMMARY:
PRIORITY:
CLASS:PUBLIC
END:VEVENT
   
   
END:VCALENDAR
   

詳細

BEGIN, END

(RFC2445 4.4, 4.6) VCALENDAR, VTIMEZONE などすべてのコンポーネントは、必ず
BEGIN:コンポーネント名
ではじまり
END:コンポーネント名
で終わらなければならない。

VCALENDAR

(RFC2445 4.7)
CALSCALE
(RFC2445 4.7.1) ?????????????????? 今のところ、定義済みはデフォルトの GREGORIAN だけ。
PRODID
(RFC2445 4.7.3) 必須。iCalendar オブジェクトを生成したアプリケーションの識別情報。
VERSION
(RFC2445 4.7.4) 必須。RFC2445 は 2.0。
METHOD
(RFC2445 4.7.2) ???? 値には PUBLISH, REQUEST がある? MIME メッセージで使用する場合、Content-type "method" の値と一致しなければならない。
(RFC2446) ??????????????????????

VTIMEZONE

(RFC2445 4.6.5) タイムゾーンの情報を定義する。TZID と、最低1つの STANDARD または DAYLIGHT の定義を含んでいなければならない。
日本の場合は次の記述でよい?
BEGIN:VTIMEZONE
TZID:Japan
BEGIN:STANDARD
DTSTART:19390101T000000
TZOFFSETFROM:+0900
TZOFFSETTO:+0900
TZNAME:JST
END:STANDARD
END:VTIMEZONE
TZID
必須。タイムゾーンを識別するための文字列。
STANDARD
(RFC2445 4.6.5) 標準時刻の情報。DTSTART, TZOFFSETFROM, TZOFFSETTO を含まなければならない。 ただし Microsoft Outlook 2000 (以下 Outlook) では DTSTART を省略している?
DTSTART
タイムゾーンの使用がはじまった日時???
TZOFFSETFROM
(RFC2445 4.8.3.3) VTIMEZONE に必須。現在のタイムゾーンがはじまる前に使われていたタイムゾーンの UTC からのオフセット???(夏時間がある地域の場合は、夏時間のオフセット???)
TZOFFSETTO
VTIMEZONE に必須。現在のタイムゾーンの UTCからのオフセット???
DAYLIGHT
夏時間の情報。DTSTART, TZOFFSETFROM, TZOFFSETTO については STANDARD に同じ。

VALARM

(RFC2445 4.6.6) 未調査。

VEVENT

ORGANIZER
(RFC2445 4.8.4.3) カレンダー・コンポーネントのOrganizer(主催者)情報。グループのスケジュール・カレンダーをもつコンポーネントには必須。
ORGANIZER;CN=NOMURA Mahito:MAILTO:CI5M-NMR@asahi-net.or.jp
CONTACT
(RFC2445 4.8.4.2) カレンダー・コンポーネントに関連した情報のコンタクト先。
DTSTART
(RFC2445 4.8.2.4) 開始日時。定期的なイベントの場合は、最初の分の開始日時。
タイムゾーンを明示する場合は、
DTSTART;TZID=Japan:19970714T133000
のようにあらかじめ VTIMEZONE で宣言した TZID を指定する。
DTEND
(RFC2445 4.8.2.2) 終了日時。定期的なイベントの場合は、最初の分の終了日時。(祝日のように終日の場合は、翌日の 00:00:00 を指定すればよい?)
RRULE
(RFC2445 4.8.5.4) 定期的なイベントについて、頻度、月日、間隔などの規則。
RRULE;FREQ=DAILY;COUNT=10
(DTSTART の日から同一時刻で毎日、全10回) 以下の指定可能な属性は (RFC2445 4.3.10) を参照。
BYMONTH
実際の月の指定。
BYMONTHDAY
BYMONTH と組み合わせて、実際の日の指定。マイナスの場合は、DTSTART から値の分だけ先行する期間。
BYDAY
LOCATION
(RFC2445 4.8.1.7) 場所の指定。
TRANSP
(RFC2445 4.8.2.7) 設定した時間の状態。OPAQUE (デフォルト), TRANSPARENT が指定可能。 Outlook では「予定の公開方法」に反映される。これがなかったり TRANSP:OPAQUE だと「予定あり」、TRANSP:TRANSPARENT が指定されていると「空き時間」
SEQUENCE
(RFC2445 4.8.7.4) リビジョンのシーケンス番号。カレンダーコンポーネントがはじめて作成された時に0、Organizerによる修正更新があるたびに増分。
UID
(RFC2445 4.8.4.7) Unique Identifier、全世界でユニークな永続的ID。RFC 822 の addr-spec に従ったシンタックスを推奨。
メールやネットニュースのMessage-IDみたいなものか。
DTSTAMP
(RFC2445 4.8.7.2) オブジェクトの作成日時。 Outlook では必須。
CATEGORIES
(RFC2445 4.8.1.2) コンポーネントを分類するためのカテゴリー。 Outlook の「分類」に対応。
SUMMARY
(RFC2445 4.8.1.12) カレンダー・コンポーネントの短いサマリまたはサブジェクト。
件名、見出しに相当。
DESCRIPTION
(RFC2445 4.8.1.5) SUMMARY に対して、カレンダー・コンポーネントの完全な説明。
本文に相当。
PRIORITY
(RFC2445 4.8.1.9) 相対的な優先度を示す整数。最低は0(優先度なし)。
CLASS
(RFC2445 4.8.1.3) アクセス許可の区分。PUBLIC(デフォルト), PRIVATE, CONFIDENTIAL が定義済み
RELATED-TO
(RFC2445 4.8.4.5) 他のカレンダー・コンポーネントとの関連を示す。通常、該当するコンポーネントのUIDを指定。
RELTYPE
(RFC2445 4.2.15) RELATED-TO で示される他コンポーネントとの関係を明示する。PARENT(デフォルト), CHILD, SIBLING

テンプレート

テンプレート。
BEGIN:VCALENDAR
PRODID:-//NOMURA Mahito//Manually//EN
METHOD:PUBLISH
VERSION:2.0
BEGIN:VTIMEZONE
TZID:Japan
BEGIN:STANDARD
DTSTART:19390101T000000
TZOFFSETFROM:+0900
TZOFFSETTO:+0900
TZNAME:JST
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
UID:
DTSTAMP:
SUMMARY:
LOCATION:
DESCRIPTION:
DTSTART;TZID=Japan:
DTEND;TZID=Japan:
RRULE:FREQ=;INTERVAL=;BYMONTH=;BYMONTHDAY=
CATEGORIES:
TRANSP:TRANSPARENT
PRIORITY:0
CLASS:PUBLIC
END:VEVENT
END:VCALENDAR

実装

Outlook 2000 用の .ICS を作る過程で気づいたことのメモ。
  • 1ファイルには1つの VCALENDAR しか記述できない? 2つ以上記述しても、Outlook では最初のものしか認識しない。
  • Outlook 2000 では、1年以上の周期をもつイベント RRULE:FREQ=YEARLY;INTERVAL=2 以上 を認識できない。ただし、月数で1年(12ヶ月)以上の周期は指定できる。
元ネタ http://www.asahi-net.or.jp/~CI5M-NMR/iCal/ref.html

ASP.NET MVCでiCalendarのサービスを追加

ASP.NET MVCのグループウェアを作成後
スマホでカレンダーを見たいと要望される。

ASP.NET MVCでiCalendarのサービスを追加
Nugetから iCal.Netを追加して対応しました。


2018年12月25日火曜日

ASP.NET MVCのKANBAN Library


ASP.NET MVCのKANBAN Libraryを探していたからNugetにあった。

元はgithubに
https://github.com/DlhSoftTeam/Angular-Kanban

個人で管理するならこれくらいで十分
todo見たいに管理出来るから簡単なイメージが良いです。

2018年12月14日金曜日

Telerik ASP.NET MVC Schedulerの日付設定

Kendo().Schedulerで当日日付の指定

@(Html.Kendo().Scheduler<AskaGroup.Models.EventViewModel>()
    .Name("scheduler")
    .Date(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day))
    .StartTime(new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 9, 00, 00))

    .Height(600)
    .Views(views => {
        views.DayView();
        views.WeekView(weekView => weekView.Selected(true));
        views.MonthView();
        views.AgendaView();
    })
    .Timezone("Etc/UTC")
    .DataSource(d => d
        .Model(m => {
            m.Id(f => f.EventID);
            m.Field(f => f.OwnerID).DefaultValue('1');
            //Set the recurrence ID field from the model:
            m.RecurrenceId(f => f.RecurrenceID);
        })
        .Read("Event_Read", "SDL")
        .Create("Event_Create", "SDL")
        .Destroy("Event_Destroy", "SDL")
        .Update("Event_Update", "SDL")
    )
)