Beginner's Rock Official Website

犬土偶日記

海の近くに住みたい

BR日記の使い方

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

2019年05月01日

令和の祝日

公開日時: 2019年05月13日 22時25分05秒

昨日は死ぬほど眠くなつて夕方に寢た。早朝に起きた。寢てゐる間に平成から令和に變つてゐた。ネットニュースで退位關聯の動畫を見た。昭和から平成へ改元した時はまだ小學生でプードル以下の知能しか無く、昭和を生きた實感も無かつた。昭和天皇の下血量が連日報道されてゐたのを覺えてゐるくらゐ。あの頃は特に時代が變る感慨みたいなのも無かつたが、さすがに平成から令和へといふのはだいぶ違ふな。平成は日本の戰爭は無かつたが大きな災害が多かつた。令和にはまだ南海トラフ大地震といふラスボス的なのが待つてゐる。少子高齢化と格差の擴大などもあつてあまり明るい未來は見えないが、どうなつて行くのか樂しみではある。

さて、今日は天皇即位の日として特例的に祝日になるらしい。天皇誕生日も變更になる。DebugのWebサイトのScheduleのページで使つてゐる祝日判定サブルーチンの修正が必要だらう。Debug用のCGIライブラリを開いて適當にプログラムを眺めてみた。念のため祝日を調べてみた。10月の即位礼正殿の儀も祝日になるらしい。天皇關係だけでなく他にもかなり修正が必要であるらしい。祝日に挾まれた平日は休日といふ扱ひになる。實質的に9月の敬老の日と秋分の日に挾まれる部分しか無かつたと思ふのだが、今後はそれ以外も考慮する必要がある。まさに今日がそれだ。今日が祝日といふことで、昨日と明日も休日になる。今年だけ特別だといふことで、今年の4月30日と5月2日を最初から特定して祝日扱ひにするといふのでも良いかもしれないが、今後も祝日が増えることでこの祝日に挾まれた休日といふのが増えるかもしれない。政府は連休の經濟效果に期待してすぐに無駄に連休を増やしたがる傾向がある。オリンピック關聯で2020年だけ海の日とスポーツの日(現在は体育の日。2020年から改稱。)と山の日が變更になる。これも連休を作るための處置らしい。盆休みを増やすために山の日を作つたり、今後いくらでもさういふことがあるだらうから、祝日に挾まれた平日の處理といふのは入れておいた方が良いだらう。それと、知らなかつたのだが、連續する祝日のうち1日でも日曜があれば祝日後の最初の平日が振替休日になる仕組みらしい。日曜が祝日で月曜が平日の場合だけではないんだな。振替休日の判定も見直す必要がある。今後祝日が増えるかもしれないことを考へると、5月の連休だけでなく全ての日に關して判定が必要になるが、それだとほとんど連休になる可能性が無い日までいちいち判定することになつて無駄な處理が増え過ぎる。判定日が平日で且つ前日が祝日の場合、前日の曜日とさらにその前日が祝日かどうかとその曜日を調べるといふやうなのを過去一番近い平日に至るまで繰り返す再歸的な處理が必要になつて鬱陶しい。365日全てこの處理をするのはさすがに無駄だ。これは連續する祝日が増えるたびにその部分だけ判定を追加する感じにした方が負荷も増えなくて良いだらう。當面は5月6日が火曜か水曜の場合には振替休日とするといふことで良い。月曜の場合はこれまでの判定をそのまま使へる。國民の休日且つ振替休日となる場合はどちらが優先されるのだらうか。プログラムを見ると、2006年以前の5月4日の判定では振替休日が優先されてゐる。日曜でも振替休日でもない場合にのみ國民の休日といふことになつてゐる。そのプログラムを書いた時の俺は何を根據にしてさういふ優先順位にしたんだらう。法律上はどうなんだらうか。祝日法の3條を見ると2項で振替休日、3項で祝日に挾まれた休日を規定してゐる。2項が先だから振替休日優先といふことで良いのかな。

祝日に挾まれた平日のチェックで苦戰した。サブルーチンに日付が引數として渡されてゐる。その日が祝日でも振替休日でも日曜でもない場合、その日付から前日と翌日の日付を計算し、それぞれを引數として再歸的にこのサブルーチンを呼び出してチェックし、前後が兩日とも祝日の時に國民の休日にすれば良いだらうと適當に考へてさういふコードを書いてみたんだが、實行したら表示に異常に時間が掛かつた。タイムアウトになるのではないかといふほどに。その結果、スケジュールのページに表示されるカレンダーは祝日のみで平日が出力されてゐないといふわけの分からない状態。國民の祝日を正しく判定できないといふなら分かるが、平日が出力されない意味が分からない。出力されたHTMLソースを見ると、TDタグすら出力されてゐない。スケジュールを設定するメンバー用の管理プログラムでは7列5行のカレンダーが表示されることになつてゐる。それも祝日を赤く表示するために祝日チェックをしてゐるので、何か影響が出るはず。見てみたらやはり異常に時間が掛かつた擧句、祝日の部分だけ出力して終つてゐた。スケジュールの表示や設定のプログラムは今まで正常に動いてゐたので、これらのプログラムが惡いはずはない。修正した祝日チェックのサブルーチンがをかしいに決まつてゐる。考へてみると、前日と翌日をチェックする時に、中でさらに再歸的なチェックがされてしまふ氣がする。前日の前日の前日の・・・とか翌日の翌日の翌日の・・・とかアホみたいに遡つていくのではないか。無限ループに陷つて言語の設定か何かの影響で強制終了されたりしてゐるのかもしれない。何かがをかしいのは間違ひ無いが、調べるのは面倒だし根本的に別のやり方にした方が良いだらう。前日と翌日が固定の祝日かどうかだけを調べれば良いので、前日や翌日が振替休日や祝日に挾まれた國民の休日かどうかはチェックしなくて良い。なので、固定の祝日のみをチェックするパターンと通常の全チェックを内部で分けることにした。引數の最後にフラグを1つ追加すれば良い。年・月・日・曜日が引數だつたが、もう1つ追加。これは値は何でも良い。0や空文字列やundefなら通常チェックで、何らかの0以外の値が渡されたら固定祝日のみチェックといふことにした。最初に固定の祝日をチェックし、ここで固定祝日チェックフラグが存在すればチェック結果を眞僞値で返す。固定祝日チェックフラグが無ければその後に振替休日と國民の休日のチェックをする。最後に祝日名を返す。返す値も統一すべきかもしれないが、まあ取り敢へずこれでOKなはず。動かしてみたら無事にできた。あとは祝日の日付設定が間違つてゐないかどうか、ちやんと振替休日が表示されるかどうか、國民の休日が表示されるかどうか、といふやうなチェックを輕く。國民の休日は今月と先月を見れば正しく動いてゐるかどうか分かる。振替休日は月曜以外になるパターンを探してチェックする必要がある。ググつてみたら2008年と2009年の5月にあつたらしい。2007年からかういふ仕組みの振替休日だつたらしいので、今までは2008年と2009年の5月のカレンダーは間違つてゐたことになる。これも無事に正しく表示できてゐた。

修正したプログラムを載せてみる。Perl。Time::Local必須。バンドのWebサイトを作つた時期の關係で、2005年以前の祝日は考慮されてゐない。こんなの自分で作らなくても探せばいくらでもあるだらう。車輪の再發明はするなとよく言はれるが、かういふのは練習に最適だ。プログラミング初心者はかういふ簡單なのをまづ自分で作つてみると良い。こんなクソみたいなものでも學べることは非常に多い。プログラミングといふのは本を讀むだけでは習得できない。自分で書かないと絶對に身につかない。しかし、本を讀んである程度自分で組めさうな感じになつたところで多くの人がハマることがある。「作るものが無い!」「ネタが思ひ浮かばない!」などなど。プログラミングの習得は高度なことを目指すと死ぬほど大變だが、そこそこで良いなら全然難しくはない。人が樂をするためのツールなのに習得が難しかつたら本末轉倒だ。習得後が問題なのだ。プログラミングといふツールを使つて何をするか、といふところが難しい。最初から目的があつて習得する場合は良いが、取り敢へずプログラミングを習得したいと思つて始めると大抵ハマる。さういふ場合は、かういふ短いライブラリ的なものを自分で作つてみると良いかもしれない。たまにしかプログラムを組まない人も定期的にかういふもので練習しておくのが良いと思ふ。今は義務教育でプログラミングをやらうといふ時代。これからどんどんプログラミングできない奴は落ちぶれて行く。プログラミングなんてIT土方のやることだとか言つてバカにしてゐると死ぬぞ。IT土方にならなくてもあらゆる分野で役に立つ。こんな便利なスキルは他にない。英語やら簿記やら勉強するくらゐならプログラミングをやつた方が壓倒的に役に立つぞ。もう老後のことだけ考へてゐれば良い世代なら何もしなくて良いが、30代くらゐなら全員やるべき。今からならPythonでAI關係をやるのが良いかな。WebならJavaScript。普通のサラリーマンでもExcelのVBAマクロくらゐはやつておけ。信じられないのだが、自動化すれば一瞬で終ることを人力で何時間もかけてやる無能な人間が世の中にはたくさんゐるらしい。ほんの少しの向上心を發揮するだけで樂に優位に立てるといふことだ。やらない理由は無いだらう。↓のプログラムを見て、效率惡さうな部分を修正したいなと思へるレベルを取り敢へず目指さう。


#■ 祝日チェック
#    引数:年, 月, 日, 曜日, 国民の祝日チェックフラグ(1:祝日法2条の祝日のみチェック, 0:振替休日・国民の休日もチェック)
#    戻り値:祝日名(固定祝日チェックの場合、真偽値)

sub holiday_check{

    my ($year, $month, $day, $wday, $f) = @_;
    my $holiday = "";
    my $week = int(($day - 1) / 7) + 1;
    my $spring = int(20.8431 + 0.242194 * ($year - 1980) - int(($year - 1980) / 4));
    my $autumn = int(23.2488 + 0.242194 * ($year - 1980) - int(($year - 1980) / 4));

    #■ 祝日法2条に規定する国民の祝日及び特例による固定の祝日

    if($month == 1){
        if($day == 1){$holiday = "元日";}
        elsif($week == 2 && $wday == 1){$holiday = "成人の日";}
    }
    elsif($month == 2){
        if($day == 11){$holiday = "建国記念の日";}
        elsif($day == 23 && $year > 2019){$holiday = "天皇誕生日";}
    }
    elsif($month == 3 && $day == $spring){$holiday = "春分の日";}
    elsif($month == 4 && $day == 29){
        if($year < 2007){
            $holiday = "みどりの日";
        }elsif($year > 2006){
            $holiday = "昭和の日";
        }
    }
    elsif($month == 5){
        if($day == 3){$holiday = "憲法記念日";}
        elsif($day == 4 && $year < 2007 && $wday != 1 && $wday != 0){$holiday = "国民の休日";}
        elsif($day == 4 && $year > 2006){$holiday = "みどりの日";} 
        elsif($day == 5){$holiday = "こどもの日";}
        elsif($day == 1 && $year == 2019){$holiday = "天皇即位の日";}
    }
    elsif($month == 7 && $week == 3 && $wday == 1 && $year != 2020){$holiday = "海の日";} 
    elsif($month == 8){
        if($year > 2015 && $year != 2020 && $day == 11){$holiday = "山の日";}
        elsif($year == 2020 && $day == 10){$holiday = "山の日";}
    }
    elsif($month == 9){
        if($week == 3 && $wday == 1){$holiday = "敬老の日";} 
        elsif($day == $autumn){$holiday = "秋分の日";}
    }
    elsif($month == 10 && $week == 2 && $wday == 1){
        if($year > 2020){$holiday = "スポーツの日";}
        elsif($year < 2020){$holiday = "体育の日";}
    }
    elsif($month == 11){
        if($day == 3){$holiday = "文化の日";}
        elsif($day == 23){$holiday = "勤労感謝の日";}
    }
    elsif($month == 12 && $day == 23 && $year < 2019){$holiday = "天皇誕生日";}

    elsif($year == 2019 && $month == 10 && $day == 22){$holiday = "即位礼正殿の儀";}
    elsif($year == 2020 && $month == 7 && $day == 23){$holiday = "海の日";}
    elsif($year == 2020 && $month == 7 && $day == 24){$holiday = "スポーツの日";}

    if($f && $holiday ne ""){return 1;}
    elsif($f && $holiday eq ""){return 0;}

    #■ 振替休日と国民の休日

    if($holiday eq "" && $wday == 1){
        my $prev_day = timelocal(0, 0, 0, $day, $month - 1, $year, $wday, 0, 0) - 86400;
        my (undef, undef, undef, $p_day, $p_month, $p_year, $p_wday, undef, undef) = localtime($prev_day);
        $p_year += 1900; $p_month++;
        my $p_holiday = &holiday_check($p_year, $p_month, $p_day, $p_wday, 1);
        if($p_holiday){$holiday = "振替休日";}
    }

    if($month == 5 && $day == 6 && ($wday == 2 || $wday == 3)){$holiday = "振替休日";}

    if($holiday eq "" && $wday != 0){
        my $prev_day = timelocal(0, 0, 0, $day, $month - 1, $year, $wday, 0, 0) - 86400;
        my (undef, undef, undef, $p_day, $p_month, $p_year, $p_wday, undef, undef) = localtime($prev_day);
        $p_year += 1900; $p_month++;
        my $p_holiday = &holiday_check($p_year, $p_month, $p_day, $p_wday, 1);

        my $next_day = timelocal(0, 0, 0, $day, $month - 1, $year, $wday, 0, 0) + 86400;
        my (undef, undef, undef, $n_day, $n_month, $n_year, $n_wday, undef, undef) = localtime($next_day);
        $n_year += 1900; $n_month++;
        my $n_holiday = &holiday_check($n_year, $n_month, $n_day, $n_wday, 1);

        if($p_holiday && $n_holiday){$holiday = "国民の休日";}
    }

    return($holiday);

}

(1.3)Easy Come,Easy Go!、孤独のRunaway -Mixture style-、煌めく人、アラクレ、ELECTRIC EYE、ながい愛、Fever、今夜月の見える丘に (Alternative Guitar Solo ver.)、ultra soul 2011、OCEAN、憎いあの娘、イカロス、アクアブルー、勝手にしやがれ、ALL-OUT ATTACK。

ギター練習46分、讀書18ページ。

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

Info.
公開日時2019年05月13日 22時25分05秒
本文文字数8053文字 (タグ込み)
URLhttps://orca.xii.jp/br/diary/diary.cgi?id=dogoo;date=20190501
Comments

コメントはありません。

コメント投稿フォーム
文字色              
  • 名前を省略すると「名無しBeginner」になります。
  • メールアドレスの入力は任意です。
  • 海外からのコメントスパム対策のため、表示された漢字の読みを必ず入力してください。
  • 本文は必須項目です。投稿する場合は必ず記入してください。タグは使えません。
  • 改行が1つ入力された場合は強制改行として処理されますが、2つ以上連続する改行は段落の終了として処理されます。
  • 本文の行頭に「>」のある文は引用としてマークします。引用でない部分の冒頭に「>」は付けないでください。
  • コメントの削除は管理者若しくは日記執筆者しかできません。書き込む時は注意しましょう。
  • 全部記入が済んだら投稿ボタンを押す前に一度読み直して推敲しましょう。