あっという間に、2018年も終わろうとしています。2018年は皆さんにとってどんな年だったでしょうか。今回は、2018年の反省を踏まえて、2019年を有意義にする年間計画表を作るプログラムを、なでしこを使って作ってみましょう。
定期的な反省と堅実な計画を立てるのが大切
さて、皆さんの中には、2018年が思った通りに行かなかったと嘆いている方も多いのではないでしょうか。筆者も、出来るだけのことはやったという気持ちもありつつ、もっと有意義に時間を使えたら良かったのに、という反省があります。時間を有意義に使う方法は、しっかりとした計画を立てることです。そこで、2019年を有意義にする計画表を作ってみましょう。
連載の7回目で、年間カレンダーを作るプログラムを紹介しましたので、今回は、その時のプログラムを改良してみましょう。
復習 - 年間カレンダーの作り方
まずは、前回のプログラムを改良して、2019年の年間カレンダーを作るプログラムを作ってみましょう。以下のプログラムを、なでしこ3簡易エディタに貼り付けて実行してみましょう。
# 365日分のカレンダーを作成
対象日=「2019/01/01」
対象秒=対象日をUNIXTIME変換。
365回
F曜日=対象日の曜日。
F日付=対象日の「/」をタブに置換。
「{F日付}{タブ}{F曜日}」を表示。
対象秒=対象秒+(60 * 60 * 24)
対象日=対象秒を日時変換して「 」まで切り取る。
ここまで。
わずか10行のプログラムですが、2019年の1年分のカレンダーのデータ(タブ区切りCSV形式)を出力します。
ここで出力されたカレンダーデータを選択して、クリップボードにコピーします。そして、ExcelやGoogleスプレッドシートで、新規シートを作成し、クリップボードの内容を貼り付けましょう。すると、以下のように、それらしい2019年の年間カレンダーが完成します。
祝日を書き込む
計画表を作ろうと思っているのに、その日が祝日かどうか判断できないと不便です。そこで、上記のプログラムを改良して、祝日かどうかをカレンダーに書き込んでみましょう。
以下のプログラムを、簡易エディタに貼り付けて実行してみましょう。
# 365日分のカレンダーを作成(祝日付き)
対象日=「2019/01/01」
# 2019年の祝日データ --- (*1)
祝日データ = {
"2019/01/01": "元日",
"2019/01/14": "成人の日",
"2019/02/11": "建国記念の日",
"2019/03/21": "春分の日",
"2019/04/29": "昭和の日",
"2019/04/30": "祝日",
"2019/05/01": "即位の礼",
"2019/05/02": "祝日",
"2019/05/03": "憲法記念日",
"2019/05/04": "みどりの日",
"2019/05/05": "こどもの日",
"2019/05/06": "こどもの日 振替休日",
"2019/07/15": "海の日",
"2019/08/11": "山の日",
"2019/08/12": "山の日 振替休日",
"2019/09/16": "敬老の日",
"2019/09/23": "秋分の日",
"2019/10/14": "体育の日",
"2019/11/03": "文化の日",
"2019/11/04": "文化の日 振替休日",
"2019/11/23": "勤労感謝の日"
}
対象秒=対象日をUNIXTIME変換。
365回
F曜日=対象日の曜日。
F日付=対象日の「/」をタブに置換。
F予定=祝日データ[対象日] # ---(*2)
もし(F予定=未定義)ならば、F予定=空。
「{F日付}{タブ}{F曜日}{タブ}{F予定}」を表示。# --- (*3)
対象秒=対象秒+(60 * 60 * 24)
対象日=対象秒を日時変換して「 」まで切り取る。
ここまで。
実行すると、以下のように、祝日付きの年間カレンダーを出力します。
プログラムを確認してみましょう。プログラムの(*1)の部分では、2019年の年間カレンダーのデータを定義しています。これは、検索エンジンで「2019年 祝日 JSON」と検索して出てきたものを編集して貼り付けたものです。2020年以降のカレンダーを作る時にも、きっと同様の方法で修正できるでしょう。そして、(*2)の部分では、JSONで定義した祝日データから、任意の日付を取り出します。もし、祝日に該当データがないと、未定義(undefined)という値になるので、未定義であれば、変数「F予定」の値を空にしています。そして、(*3)の部分で、実際に出力するデータを指定します。
フィールドをカスタマイズしよう
ところで、年間カレンダーに予定が入っているだけでは、普通の年間カレンダーと換わりありません。もし、業務カレンダーを作る場合には、上記(*1)の休日データに、社内休日データを追加して利用すると良いでしょう。
また、2019年のカレンダーということが明らかなので、年のフィールドが要らない場合には、以下のように、上記のプログラムの(*3)の上に2019を消すプログラムを追加して、以下のように書き換えると良いでしょう。
F日付=F日付の「2019{タブ}」を空に置換。
「{F日付}{タブ}{F曜日}{タブ}{F予定}」を表示。# --- (*3)
あるいは、フィールドを分けずに『何月何日(何曜日)』の書式でデータを出力したい場合には、プログラムの(*3)の部分とその上の部分を以下のように修正できるでしょう。
F日付をタブで区切る。
何月=それ[1]
何日=それ[2]
「{何月} 月{何日}日({F曜日}){タブ}{F予定}」を表示。# --- (*3)
書き換えて実行すると、以下のように出力されます。
また、せっかくの年間カレンダーですから、2019年があと何日残っているのかの情報もいれてみましょう。以下のプログラムは、祝日データを省略していますが、エディタに貼り付けて実行してみましょう。
対象日=「2019/01/01」
祝日データ = {
# 祝日データは省略
}
対象秒=対象日をUNIXTIME変換。
残り日数=365
365回
F曜日=対象日の曜日。
F日付=対象日の「/」をタブに置換。
F予定=祝日データ[対象日]
もし(F予定=未定義)ならば、F予定=空。
「残り{残り日数}日{タブ}{F日付}{タブ}{F曜日}{タブ}{F予定}」を表示。
残り日数=残り日数−1
対象秒=対象秒+(60 * 60 * 24)
対象日=対象秒を日時変換して「 」まで切り取る。
ここまで。
このように、ちょっとプログラムを書き加えるだけで、自分の好きなフォーマットで計画表を出力できます。
残り日数の表示の仕組みは、変数「残り日数」に365を代入しておいて、一日分表示するごとに、値を減らしていくという単純なものです。
同じようにして、自分の好きな値を計算して出力するようにすると、楽しく予定表を作ることができるでしょう。
また、ExcelもGoogleスプレッドシートも「条件付き書式」と言って特定の文字列があるセルの書式を変更する機能を持っています。この機能を使えば、年間予定表を、より見やすく表示することができるでしょう。
なでしこの開発と『執筆ドリブン開発』について
2018年を振り返ってみると、災害が多く暗いニュースも多かったのですが、個人的には、なでしこ3の開発も順調に進み、とても思い出深い一年となりました。
種明かしをすると、本連載を執筆するために、なでしこ3に新機能を何度も追加しました。本コラムを面白いものにしたいと、頑張って新機能を追加したのです。そのため、なでしこユーザーの方からは、コラムを読んで新機能を知ったというお便りもいただきました。
コラム執筆が、なでしこへ新機能を追加するのモチベーションとなり、良い成果をあげることができたのです。ですから、この手法を「執筆ドリブン開発」と名付けて、世に広めた方が良いかもしれません。これから、新たなオープンソースのプロジェクトを始めようと思っている方がいるなら、ぜひ、そのプロジェクトについての連載コラムを一つ持つと良いでしょう。コラムに良い報告を書きたくて、頑張って開発を進めることができます。
そんな訳で、来年2019年もたくさんコラムを書いて、そのたびに、なでしこに新機能を加えていきたいと思います。2019年の終わりに、コラムを読んでくださっている皆さんと、執筆の機会をくださっているマイナビニュースの皆様に改めて感謝します。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2005年IPAスーパークリエイター認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。