Debug- Official Website -

犬土偶日記

海の近くに住みたい

Debug日記の使い方

話題:Webプログラミングとか

2016年08月06日

山の日!?

公開日時: 2016年08月07日 07時09分13秒

昨日の夕方からずつと起きてゐる。食料を買ひに行かねばならんのだが、いつも通り朝になつてから激烈に眠くなつた。GENKYの開店まで起きてゐられる氣がしない。かと言つて少し寢て午後に行くといふのも經驗上恐らく不可能だらう。寢たら夜遲くまで爆睡に違ひ無い。あと1時間半がつらい。で、超久しぶりに開店からパチ屋へ。さすがにあんなうるさい場所にゐたら寢ることは無いだらうと。爆音に曝されながらGENKYの開店を待つ作業だ。しかし、なんと打ちながら餘裕で寢てしまつた。小刻みに何度も何度も寢たり起きたり。死ぬほどつらい。無事にGENKYで食料を買つて歸宅。今日もクソ暑いな。

晝に寢て、21時半頃に目が覺めた。中途半端だな。

B'zのカレンダーをチラッと眺めて猛烈な違和感を覺えた。11日が赤い。木曜だぞ。祝日なんか無いはずだ。よく見てみると、山の日と書いてある。まさか知らないうちに祝日が増えてゐたのか?去年は無かつたはずだよな。祝日が増えるとなればそこそこニュースになるだらうし、ネットでさういふ記事を見て日記に書いたりするはず。さう思つて犬土偶日記内を檢索してみたが、「山の日」そのものはヒットしない。「犬山の日本モンキーパーク」とか「屋久島登山の日の日記」とかさういふのがヒットする。やはり「山の日」といふ祝日自體知らなかつたのだな。ググつてみると、2014年制定、2016年施行といふことらしい。今年から8月11日は祝日。

祝日が増えたとなると、プログラムの修正が必要になる。DebugのWebサイトのScheduleのページがカレンダー形式になつてゐる。バンドメンバーだけが豫定を書き込めるやうになつてゐる。まあ俺しか書き込まないけど。もちろんカレンダーはプログラムによる自動生成だ。かういふのを毎月手書きのHTMLで作つてゐる奴がゐたら無能と言はざるを得ないだらう。日曜は赤で表示する。祝日も當然同じやうに赤く表示すべきだらう。そこで祝日判定が必要になる。この日付は祝日かどうかといふのを調べる必要がある。祝日なら赤く表示し、祝日名も表示されるやうになつてゐる。新たな祝日が追加されたといふことは、この祝日判定プログラムを修正せねば山の日が反映されないといふことになる。祝日判定はSchedule以外にも他のプログラムでも利用できさうだから、schedule.cgiの中ではなく、共通ライブラリの中にある。使用言語はPerl。普通に考へれば年・月・日を引數にして祝日フラグと祝日名が返るサブルーチンだらう。俺の場合、祝日フラグはTRUEかFALSEではなく1か0だらう。そもそもPerlにTRUEとかFALSEとか無かつたかも。複數の言語を使つてゐると混同してしまふことがよくある。みんなどうしてゐるんだらう。早速中身を見てみよう。いや、待て。祝日であるかどうかのフラグなど必要か?祝日名だけ返せば良いではないか。戻り値があればその時點で祝日確定だ。戻り値無しとか空文字とか0とかが戻つても祝日ではない。祝日名だけで良いな。調べてみると、最初に作つたのは2005年5月26日と31日のことらしい。11年以上も前なんだな。當然、自分自身どういふプログラムを書いたのか完全に忘れてゐる。4月29日と5月4日の名稱が2007年から變つたやうで、その頃に一度修正した形跡がある。

#■ 祝日チェック(引数:年, 月, 日, 曜日    戻り値:祝日フラグ(0:平日、1:祝日), 祝日名)

sub holiday_check{

    my ($year, $month, $day, $wday) = @_;
    my $flag = 0; my $holiday = "";

    if($month == 1 && $day == 1){$flag = 1; $holiday = "元日";}
    elsif($month == 2 && $day == 11){$flag = 1; $holiday = "建国記念の日";}
    elsif($month == 4 && $day == 29){
        if($year < 2007){
            $flag = 1; $holiday = "みどりの日";
        }elsif($year > 2006){
            $flag = 1; $holiday = "昭和の日";
        }
    }
    elsif($month == 5){
        if($day == 3){$flag = 1; $holiday = "憲法記念日";}
        elsif($day == 4 && $year < 2007 && $wday != 1 && $wday != 0){$flag = 1; $holiday = "国民の休日";}
        elsif($day == 4 && $year > 2006){$flag = 1; $holiday = "みどりの日";} 
        elsif($day == 5){$flag = 1; $holiday = "こどもの日";}
    }
    elsif($month == 11){
        if($day == 3){$flag = 1; $holiday = "文化の日";}
        elsif($day == 23){$flag = 1; $holiday = "勤労感謝の日";}
    }
    elsif($month == 12 && $day == 23){$flag = 1; $holiday = "天皇誕生日";}

    my $week = int(($day - 1) / 7) + 1;
    if($month == 1 && $wday == 1 && $week == 2){$flag = 1; $holiday = "成人の日";}
    if($month == 7 && $wday == 1 && $week == 3){$flag = 1; $holiday = "海の日";} 
    if($month == 9 && $wday == 1 && $week == 3){$flag = 1; $holiday = "敬老の日";} 
    if($month == 10 && $wday == 1 && $week == 2){$flag = 1; $holiday = "体育の日";}

    my $spring = int(20.8431 + 0.242194 * ($year - 1980) - int(($year - 1980) / 4));
    if($month == 3 && $day == $spring){$flag = 1; $holiday = "春分の日";}
    my $autumn = int(23.2488 + 0.242194 * ($year - 1980) - int(($year - 1980) / 4));
    if($month == 9 && $day == $autumn){$flag = 1; $holiday = "秋分の日";}

    if($month == 9 && $wday == 2 && (int(($day - 2) / 7) + 1) == 3 && ($day + 1) == $autumn){$flag = 1; $holiday = "国民の休日";}

    if($wday == 1){
        my $y_time = timelocal(0, 0, 0, $day, $month - 1, $year, $wday, 0, 0);
        $y_time -= 86400;
        my (undef, undef, undef, $y_day, $y_month, $y_year, $y_wday, undef, undef) = localtime($y_time);
        $y_year += 1900; $y_month++;
        my ($y_flag, undef) = &holiday_check($y_year, $y_month, $y_day, $y_wday);
        if($y_flag == 1){$flag = 1; $holiday = "振替休日";}
    }

    return($flag, $holiday);

}

文句の附け所が多少あるが、まあ良いだらう。{ }を附ける位置に違和感がある。2007年の修正部分とそれ以外で{ }の附け方に違ひがある。長い年月の間にコーディングの自分ルールも少しづつ變るといふことか。引數のチェックをしてゐないのは、サブルーチンの使用者が俺自身のみだから俺自身を信用してチェックしないといふことだらう。どうせ變な値を渡してもPerlはコンテキストで適當に型を決めてそれなりの處理をする。をかしくても結果的に$flag = 0で返るだけだからどうでもいい。大體豫想通りな仕組みだつたが、引數は年月日だけでなく曜日も必要だつたな。ハッピーマンデーや振替休日のチェックが必要だし。そんなことよりも祝日の仕組み自體が結構複雜になつてゐるんだな。春分・秋分のところ、何だこれ。$springと$autumnのところ、見ても全然分からんよ。日附で決まつてゐるのではなく地球の公轉の微妙な誤差とかで1日ズレることもあり得るといふことなのか。どういふ計算なんだらう。自分で計算できるとは思へないからネットで調べたんだらう。ハッピーマンデーも厄介だな。振替休日チェックでは同じサブルーチンを再歸的に使つてゐる。プログラミング超初心者には勉強になるかもしれんな。あまり良くない部分がいくらかあるので、そこを修正する題材としてなかなか良いプログラムだらうと思ふ。4月29日のチェックはアホだな。2007年以降は昭和の日でそれ以前はみどりの日といふことだが、條件式は1つでいい。elsifで無駄な條件を判定してゐる。5月4日の國民の休日かみどりの日かの判定ももう少し效率良く書けさうな氣もするが、面倒だからどうでもいいわ。最初に年を評價すれば無駄な條件判定が減るか。まあ拘らなくても良い。適當適當。當時も動けばいいわみたいな感じで適當に書いたんだらうな。かういふところにも人間性が反映するんだな。構成としてはまづ固定の祝日、次にハッピーマンデー、次に春分・秋分、次に9月に國民の休日が現れる場合、最後に振替休日といふ順番で判定してゐる。山の日は固定の祝日なので、最初の方の5月と11月の間に插入すれば良いだらう。elsif($year > 2015 && $month == 8 && $day == 11){$flag = 1; $holiday = "山の日";} これでOK。2016年からといふのが分かりやすいやうに$year >= 2016の方が良いかな。次囘は天皇誕生日の修正が必要になるだらう。讓位の話が出てゐるし、讓位が實現しなかつたとしてもいつか必ず崩御する時が來る。その前に俺が死ぬかもしれんけどな。

他に修正したい部分も色々あつたが、餘計なことをしてエラーが出まくつても鬱陶しいので、山の日を追加しただけで他は一切弄らず終了。ライブラリを更新し、schedule.cgiにアクセスしてみる。 http://orca.xii.jp/debug/schedule/schedule.cgi?year=2016;month=8 無事に反映されてゐる。このURLの最後の部分のyear=2016のところを2015にしてみると山の日は表示されない。境界チェックだけで良いので2015と2016だけ調べる。これくらゐの修正が上手く行かなかつたら怖い。無事にできるに決まつてゐる。と言ひつつ修正後に動かす時は少し緊張する。

まあこんなライブラリは自分で作らなくてもあるんだらうけど、練習のために自分で作つてみるのも良いね。プログラミングは本を讀むだけでは習得できない。自分で書いて動かして習得するものだ。祝日判定は祝日の仕組みを知ることから始める必要があるから少しハードルが高い。カレンダー生成プログラムなんかがプログラミング練習には良いかも。でも閏年が厄介か。まあ閏年の計算ぐらゐは一般知識として持つておいて良いだらう。プログラミングは絶對習得した方が良いよ。IT土方になれといふのではなく、どんな種類の仕事でも必ず效率アップに繋がる。趣味でも大いに役立つ。IT系で上流の仕事をする人でも下流のことが分かつてゐなければ現場が迷惑するだらう。上に分かつてゐない奴がゐると死ぬほど鬱陶しいと思ふ。文系だらうと理系だらうと、これは基礎的教養だと思ふ。クソの役にも立たない英語や簿記を勉強したがる奴が多いが(そのくせ使へるレベルまでは習得しない)、プログラミングを勉強した方が絶對人生有利だよ。何となく難しくて習得できなささうと感じる人もゐるかもしれないが、驚くほど簡單に短期間でそこそこできるやうになる。極めるのは大變だが。勉強できなくてFラン大學にすら行けないやうなのが情報專門學校に行つて簡單に習得したりするだらう。アホでもできるんだよ。例へばAndroidのスマホを使つてゐる人なら痒いところに手が屆きまくる無駄の一切無い自分專用アプリなんかをサクッと作つて效率的な人生を送ることもできるだらう。iPhoneだと自分しか使はないアプリでも勝手にインストールとかできないらしい。ウザいよな。とにかく、こんな有用なスキルを習得しようともしない人間は向上心が無いとしか思へない。プログラミングなんか底邊のIT奴隷がやるものだから自分がやる必要など無い!なんて考へる傲慢な奴もゐるかもしれないが、さう考へるとしても、できるけどやらないといふ状態であるべき。單にできないだけの無能はダメ。知識や技術を持つてゐるのとさうでないのでは全然違ふ。と、俺が力説しても何の意味も無い。向上心のある奴は既に勝手に習得してゐるし、ダメな奴は誰に何を言はれても必要に迫られたとしても言ひ譯ばかりして絶對にやらない。

(1.0)野性のENERGY、The Wild Wind、もう一度キスしたかった、世直しGOOD VIBRATION、Pleasure'98 〜人生の快楽〜、Enter Sandman、WAKE UP, RIGHT NOW、ultra soul 2011、Easy Come, Easy Go!、ながい愛、Raging River、Anniversary song、fake、MIRAI、turning、トウダイモトクラシー、pain。

ギター練習76分、腕立て伏せ300囘、讀書16ページ。

話題:Webプログラミングとか

Info.
公開日時2016年08月07日 07時09分13秒
本文文字数6722文字 (タグ込み)
URLhttps://orca.xii.jp/debug/diary/diary.cgi?id=dogoo;date=20160806
RSS1.0https://orca.xii.jp/info/diary-dogoo.rdf
Comments
コメント投稿フォーム
文字色              
  • 名前を省略すると「名無しDebugger」になります。
  • メールアドレスの入力は任意です。
  • 海外からのコメントスパム対策のため、表示された漢字の読みを必ず入力してください。
  • 本文は必須項目です。投稿する場合は必ず記入してください。タグは使えません。
  • 改行が1つ入力された場合は強制改行として処理されますが、2つ以上連続する改行は段落の終了として処理されます。
  • 本文の行頭に「>」のある文は引用としてマークします。引用でない部分の冒頭に「>」は付けないでください。
  • コメントの削除は管理者若しくは日記執筆者しかできません。書き込む時は注意しましょう。
  • 全部記入が済んだら投稿ボタンを押す前に一度読み直して推敲しましょう。