表示調整
閉じる
挿絵表示切替ボタン
▼配色
▼行間
▼文字サイズ
▼メニューバー
×閉じる

ブックマークに追加しました

設定
設定を保存しました
エラーが発生しました
※文字以内
ブックマークを解除しました。

エラーが発生しました。

エラーの原因がわからない場合はヘルプセンターをご確認ください。

ブックマーク機能を使うにはログインしてください。

この作品ページにはなろうチアーズプログラム参加に伴う広告が設置されています。詳細はこちら

日々是好日

デジタルネイティブ VS 老害SE

作者: Y.
掲載日:2025/10/19

第0話 プロローグ ― 老害SE、再起動 ―


昼下がりの書斎。

静かな部屋に、ひとつだけ機械の音があった。

カチ、とマウスのクリック音。

ファンの低いうなり。

液晶画面の中で、見慣れたOSのロゴがゆっくりと立ち上がる。

――まだ、動くじゃないか。


年季の入ったデスクトップは、もう何年も前に現役を退いた。

だが、たまにこうして電源を入れると、

ファンの微かな唸りとともに、あの頃の自分が少しだけ帰ってくる。

この指先は、かつて数万行のソースを叩き、

エラーを潰し、徹夜で仕様書を直し、納期と戦い続けた。

人生の大半を、キーボードの上で過ごしてきたようなものだ。


今思えば、ブラックと呼ばれても仕方のない業界だった。

だが、不思議なことに

――あの地獄を、私は嫌いになれなかった。

いや、むしろ、好んでその中で格闘していたのかもしれない。


今はもう、プロジェクトも、仲間も、上司もいない。

あるのは、机と椅子と、年季の入ったモニターだけ。

それでも

――この機械に向かうと、胸の奥が少し温かくなる。


「おじい、またパソコンいじってるの?」

振り返ると、孫が顔をのぞかせていた。

あどけない声が、部屋の中の静寂をやさしく破る。


「ああ、ちょっと古い写真を探しててな」

「ふーん。スマホで見れば早いのに」

そう言って、孫は軽く笑った。


その何気ない言葉に、胸の奥がチクリとする。

そうだ、今は何でもスマホで済む。

検索も、写真も、買い物も。


もはや“知識”より“操作”が重要な時代だ。


だが私は、こうして“中身”を見たいのだ。

どう動くのか。なぜ動くのか。

仕組みを知ることが、生き方そのものだった。


モニターに映る古いコードの断片を見つめながら、ふと笑みがこぼれた。

記号と数字の並びに、青春があった。

あの頃は、未来を作っているつもりだった。


まさかその未来の中で、自分が“老害”と呼ばれるとは、夢にも思わなかったけれど。


孫が言う。

「ねぇ、これって何のプログラム?」

「ん? これはな、もう動かないやつだ」

「じゃあ、直して動かせばいいじゃん」

その一言に、私は息をのんだ。

ああ、そうか。

いつの時代も、技術を前に進めるのは

――こういう“素朴な好奇心”なのだ。


孫のその言葉に、私はそっとマウスに手を戻した。

再起動の音が鳴る。

古いOSが、再び立ち上がる。

画面の光が、少しだけ眩しい。

老害SEの一日が、また始まった。


第1話 デジタルネイティブ


-この夏休み、孫が遊びに来た。-


小学校二年生。わずかな間に、まるで別人のように背が伸び、見違えるほど大きくなっていた。


以前は、家のなかでは積み木、ブロック、お手玉と遊び、庭ではシャボン玉を追いかける。こちらが音を上げるまで、無邪気に元気いっぱいに走りまわっていたものだ。


それが、二年生にもなると、どこか落ち着きを纏い、急に大人びて見える。


時が経つのは早い。彼の成長を喜ぶたび、こちらはそれだけ、確実に歳を取ったことを突きつけられる。


そうか、見違えるのは孫ばかりではない。鏡の向こうで、知らないうちに深く刻まれた皺の数、重くなった足取り。その一つ一つが、私の残された「時間」を声なく囁いている。喜びと寂しさが混じり合い、夏の光の中で曖昧に揺れる感情。一体いつから、こんなにも静かに、過ぎゆく季節が恐ろしくなってしまったのだろう。


悲しいことを言うようだが、この身に許された「季節の巡り」は、あと何度残っているのだろうか。咲き誇る桜の、あの鮮やかな宴を、あと何度、この目で愛でることができるのだろう。孫の成人式までは、あるいは。その結婚式までは、どうにか。ひ孫の顔を見る夢は、あまりにも遠く、残酷な残光のように思えてならない。


この夏、孫は、うちにくると、挨拶もそこそこに、書斎のパソコンに向かって走っていった。

「パソコンつかわせて!」

「いいよ、電源わからない?」

「うちのと違うから、わからないし、勝手にパソコン触ってはダメって」

「そうか。は、電源オン、後はいい?」

「うん、ユーチューブみれるよね?」

「動画見たいんだ?」

「うん、家では、ずっと見てると怒られるから」

「そうだね、見てもいいけど、あまり長い時間はだめだよ」

「うん、わかってるって」


まだおぼつかないタイピングで、画面にへばりつくようにして検索ワードを入力した。


どうやら、Vtuberの動画らしい。


「へぇ~、面白いの、それ?」


「うるさい!集中させて!」


強い言葉が、弾かれたように返ってきた。そりゃそうだ、せっかく手に入れた時間、一瞬たりとも奪われたくないのだろう。


私は静かに口を閉じ、椅子に腰かけ、その背中を眺めることにした。


耳に流れてくるのは、人工的な高揚感を持つ、甲高い声。画面の奥の、架空のキャラクターと一心に向き合う孫の横顔は、真剣そのもので、まるで世界に二人きりであるかのように静謐だった。


(私が夢見た“積み木”や“シャボン玉”を追いかけた時間は、もう戻らない。私たちが知りもしない、“新しいひかりの玉”を懸命に掴んでいるのだ。)



第2話 天体観測


今年の夏、木星と金星が大接近するらしい。


普段、夜空なんて気にも留めない。

けれど、思えば毎年、何かしらの天体現象がある。

今や望遠鏡は地球を飛び出し、微細な光さえも逃さず、

次々と新しい発見を届けてくれる。


自分が子どもの頃は、図鑑を食い入るように眺め、

夜になると外に出て、遠い星々に思いをはせていた。


親にねだって買ってもらった小さな望遠鏡。

それで初めて眺めた月の凹凸。

そして土星――図鑑で見たままの輪が本当に見えたときの、

あの胸の高鳴りはいまも忘れられない。


この夏、孫に木星を見せた。

どうやら宇宙や天体に興味があるらしい。


(血は争えないな……いや、子どもは誰だって空が好きなのかもしれない)


望遠鏡を覗いたあと、孫がぽつりと言った。


「縞模様、あんまり見えないね。大赤斑は?…ネットの写真のほうがすごいじゃん」


……返す言葉が、見つからなかった。


そうだよなぁ。

眼視観測には限界がある。

でも、もっとワクワクさせてやれたはずだ。


急いで準備した、手軽な望遠鏡。

せっかくなら、ちゃんと準備して見せてやるべきだった。


「よし! 明日は、すごいものをちゃんと見られるように準備するから」


「ほんとに?」


今度は月に望遠鏡を向けた。

幸い、月ならこの小さな望遠鏡でも十分。

クレーターの凹凸、その浮遊感は伝わったようだ。


(少し、安心した)


幸い天気は良い。

翌日は昼のうちから庭に出て、三脚を立てた。

今度は二十五センチの望遠鏡。

さらに、電子観望用という最新式の望遠鏡もセッティングする。


テーブルを置き、ノートPCをつなぎ、

ヘッドマウントディスプレイをセット。

キャンプ用の椅子も並べ、眼視と電子観望の両方が楽しめるように整えていく。


(今は極軸合わせも自動。追尾も簡単だ。

昔とは大違い――けれど、バッテリーや結線、ピント合わせ……

やることは、まだまだ多い)


夕暮れが近づき、少しずつ風が冷たくなる。

準備の手を止めて空を見上げると、

白い月が、昼の残光の中でぼんやり上り始めた。


あとは夜の天候と大気の状態――こればかりはどうにもならない。


(あぁ……ドームが欲しいな)


つい、口の中でつぶやいて、笑ってしまった。


第3話 画像処理


孫と観た木星。

翌日、撮影しておいたデータの画像処理を始めた。


電子観望では、観測と同時に“ライブスタック”が行われる。

接眼レンズ――といっても、その先にあるのは小さな液晶モニターだ。

映し出された映像は、PCやスマートフォンにも転送される。

つまり、アイピースで覗くか、大きな画面で見るかの違いにすぎない。


光学望遠鏡は、言わば“アナログ”の世界。

そこには何の補正も加工もない。

ただ、大口径・高倍率で覗く分だけ、昨夜の小さな望遠鏡よりも

確かに木星の縞がくっきりしていた。


せっかくだからと、その大口径の望遠鏡で写真も撮っておいた。

――そして今、そのデータを前にしている。


数百枚の画像を“加算平均”する。

いわゆる“スタック処理”と呼ばれる手法だ。

重ねれば重ねるほどノイズが消え、淡い縞や陰影が浮かび上がってくる。

まるで、時間そのものを積み重ねて、一枚の真実に近づいていくような感覚だった。


昔は――といっても、まだ銀塩フィルムが主流だった頃――

ポジ(スライドフィルム)を現像し、フィルムスキャナーでPCに取り込んで、

画像処理ソフトで演算処理を行っていた。


当時はそれだけでも、まるで魔法のようだった。

手を汚さずに、暗室に入らずに、

光を自在に扱えるようになったのだから。


そもそも、この画像処理ソフトとPCの登場が、

長いあいだ当たり前だった“暗室作業”を過去のものにしたのだ。


しかし、今は――。


もはや、演算処理の知識などなくてもいい。

“スタックソフト”にファイルを放り込めば、ものの数分で結果が出る時代だ。


しかも、電子観望用の望遠鏡なら、その場でリアルタイムに映像が仕上がる。

星雲の淡いガスが、緑や紅の色を帯びて闇の中から立ち上がり、

彗星の、肉眼では見えにくいイオンテールさえも現れる。


魔法の進化は、止まることを知らない。


処理を終え、画面に映し出された木星を見つめた。

輪郭は滑らかに、縞模様は息づくように揺れている。

その姿は、あの夜、孫と覗いた小さな光とはまるで違っていた。


けれど、あのときの驚きや歓声は、確かにこの中に刻まれている。


(たとえ技術がどれほど進んでも、

 心の中の“最初の一枚”は、決して更新されないのかもしれない)


知り合いの星景写真家が、こんなことを言っていた。


「星像写真は、データさえ決めれば誰でも撮れる。

 けれど――星景写真は、一期一会なんだよ」と。


挿絵(By みてみん)

レモン彗星(C/2025 A6; Lemmon)2025/11/01


第4話 FPV疑似体験


ゴーグルを装着してドローンを操縦する――

そんなFPV(First Person View/一人称視点)の世界。

まるで自分が機体そのものになって飛んでいるような没入感だ。


その感覚を、天体観測でも味わえないかと思った。


カメラには、超広角から望遠までをカバーするズームレンズを装着。

その映像をPCに映し出し、さらにミラーリングでゴーグルへ送る。

即席の“宇宙船コクピット”の完成だ。


もちろん、普通のカメラでは明るい星や月しか映らない。

それでも、広角から望遠へとゆっくりズームしていくと――

まるで、自分が星々へと近づいていくような錯覚を覚える。


これも、昔の“アナログ時代”を知っているからこそできる体験かもしれない。


かつては、光学望遠鏡のアイピースをCCDセンサーに換装し、

NTSCやPALでアナログ変調してテレビモニターへ出力していた。

その映像をさらにゴーグルやプロジェクターに投影していたのだ。


今では、RGBやHDMIといったデジタル信号のまま、

遅延も劣化もなく映像を投影できる。

技術は進化した――けれど、やっていることの根っこは変わらない。


「おじい、すごい! 本当に宇宙船に乗ってるみたい!」


(心の中で、ガッツポーズ!……その言葉が聞きたかった)


「じゃあ、明日はドローンを飛ばしに行こう」


「うん!」

弾んだ声が、夜気の中に跳ねた。


今は、誰もが“鳥の目”を手に入れられる時代。



第5話 無いなら作ろう


自分が子供の頃、TVはとても高価なものだった。

近所でもTVを持っている家庭は少なかったと思う。


父は、“無いなら自作”という趣味の人だった。

当時の雑誌には、回路図が付録になっていて、

秋葉原の電気街には、電気(電子)部品が山の様に並んでいた。

当時は、それを見ても、何が何なのか訳も分からず、父の後に付いて行くだけだったが、

ただ付いて行き、父の買物を見ているだけで、遊園地へ行くより楽しかった記憶が今も残っている。


今でも信じられないが、TVを部品から自作した。

(まぁ、今思えば、回路図に合わせ、半田付けしただけだが…)

当時、高嶺の花だったTVが我が家に!

梯子をかけ、屋根に上り、アンテナを付け、

壁に穴を開け、アンテナ線を通し、

いよいよ、電源を入れると、当然モノクロだが、ブラウン管に映像(TV番組)が流れた。

その歓喜たるや、自作の喜び、今までの原動力になっている気がする。


時は流れ、自作が好きというのは変わらないが、さほど器用な方ではない。

が、


少し前だとアナログな、シリコンで型を作り、レジンを流し込む(鋳造と同じ)

旋盤リース、フライス盤で削る、と言った機械工作が、NC処理で自動化、そして

図面さえ描けば、レーザー彫刻、3Dプリンターで、様々な造形物、部品が簡単に作れる様になった。


まぁ、孫にはCADは少し早い気はするが、

CADと言っても、直方体、球体、円柱、(プリミティブ)の加算、減算で多くの部品モデルは作れる。

しかも平面図を描けば、“押し出し”で立体化もできる。

あとは希望の寸法さえ決めておくだけだ。


今の時代の子ならすぐおぼえるだろう。


(今ある機器の陳腐化の方が心配だけど…)


第6話 箱庭 (プロキシー)


「おやじー、古いパソコンたくさんあるよねぇー

一台貸して~、子供にそろそろ渡そうとおもってるんだけどさー」


「あゝ、でも古いのばかりだぞ、いいのか?」


「別に、ネットつなげて、動画が見れれば、いいからさー」


「まぁ、いいけど、お前も小さいとき、Ddosの踏み台にされた事あったからなぁ、

『箱庭』作るか…」


「箱庭?…」


「時々、監視して、ブロックとかできた方が、いいだろ」


「フィルターソフトじゃダメ?」


「わからんからなぁー、人任せだと…ソフトと自分で管理した方が精神衛生上安心だろうに、まぁ、やれる事はした方が良いと思うぞ…」


「そりゃそうだけど、やってくれるんだろなぁ」


「あゝ、暇だから基本設定までは、やるけど、管理はお前の仕事だからな」


古いミニタワーPCと古いタブレットPC、そして、小さいモニターなど…を渡し、

まずは、タワーPCの設定を始めた。


ミニタワーPCとは言え、記憶装置の容量は、昔に比べれば、広大な海

何しろ、タブレットの初期設定と日々のデーター、

そして、通信記録を保存する場所。


孫に渡すPCは起動の度に初期設定に一旦戻るようにした。


「一応、これで、アクセス先、時間帯はわかるだろうが、ドメイン名を偽装されていたらわからないから、注意をするように」 といって、

簡単な運用を説明して、孫には、タブレットPCを渡した。


タブレットPCを手にした孫は、

「これ? 新品?」と目を丸くした。

「いや、少し古いものだけど……嫌か?」


思わず探るように聞いてみる。

(やっぱり中古は、子どもには嬉しくないか……)


けれど孫は、画面をくるりと回しながら笑った。

「ううん、違うよ。液晶とキーボードが離れたり、くっつけられたりして、

なんか、変身するみたいで面白いなって」


その言葉に、思わず頬がゆるむ。

(メカニカルなものは、子供は好きだよなと、少し、安心した。)


横で見ていた息子に、ふと懐かしそうに言った。

「お前も昔、キッドピックスを始めたころは、そんな感じだったな。

あの頃はネットなんてなかったから、ただパソコン渡して終わりだったけど」


「ああ、そうだったな……。

“PCでも触ってろ”って、ゲームをやらせておけば大人しかった。

…今はそうもいかん時代」



孫は、タブレットPCで最近、お絵かきに夢中らしい。

生成AIと会話チャットしながら、

<どう、変えたらいい?>

<こうしたら、いいのでは?>

と、まるで絵画教室で先生と話しているみたいにやり取りしているという。


その話を聞いて、思わず感心した。

(今の子どもたちは、教わるより“引き出される”時代なんだな……)


画面の中の“先生”は、決して怒らない。

どんな落書きにも「いいね」と返してくれる。

けれど、その一言が、孫の創造の芽を確かに育てているような気がした。


(誰だって、否定されれば反発する。

 でも、ただ同意してほしいわけでもない。

 同意した上で、“違い”や“気づき”、”ほんの少しのより良い方向”が欲しい)


画面の向こうの生成AIは、それを絶妙な距離感でやってのける気がした。

叱らず、褒めすぎず、まるで無限の忍耐を持ち、時には嘘をつく教師みたいだ。


…昔は、プログラムに「考えさせる」なんて発想はなかった。

だが今は、人が問いかけ、AIが考え、人がまた考え直す。


「箱庭」を作ったつもりが、気づけば自分もその中を覗かれている気がする。

技術ってやつは、いつもそうだ。

使うつもりが、いつの間にか、使われている。


第7話 ロードマップ


まぁ偶然だが、社会人になる頃、

パーソナルコンピュータが身近になると言う時代を経験できた。

しかし、今や老害。


当時は、右も左も分かららず、

依頼に基づき、仕様書を書き、それをソースコードに起こすと言う時代。


その前はコンピュータ言語だと言っても、ほぼ0と1の世界。

紙テープやカードに穴を開けた物をコンピュータに読み込ませていた。


コンパイルと言う処理ではなく、インタープリタ。


家庭用にはF-BASICが組み込まれた富士通 FM7、NEC PC8001、シャープはCP/MのMZあたりが徐々に浸透していた頃だろう。

MS-DOS、IBM-DOSになり、AT互換機が日本を席捲する頃

一方、AppleはApplell、Applell gsでGUIが浸透。


家庭、一部業務で、GUIが一般化したのは、Windows3.x、System6、7からだろう。

爆発的に浸透したのはインターネットが普及し始めた事もあり、Windows95(pc)、漢字トーク7(Mac)


業務では。文章作成や構成管理で使用していた、JSTAR、これはワークステーションと呼ばれていた、UNIXマシン。シェルにOpenLOOK、motifを被せ、GUI環境が整っていた。


この間、今のスマホ全盛の前に、モバイルOSとして、

Palm OSやZaurus OSが生まれた。

このZaurus OS(日本純国産)、国産OSとしては、TRONがあったが、ザウルスは消え、TRONは組み込みOSに

この派生として、WindowsやMacOSと時代は流れ

今はLinux、Android、iOSなどに。


アプリで言うなら日常フロント事務処理はPC(オフィス系ソフト)、

DTP、画像処理等はMac(特にMacは、画面解像度を意図的に72dpiとし、画面で見たものがそのまま印刷されるというWYSIWYGWhat You See Is What You Get)を徹底したことと、画面で見たフォントの輪郭情報が、PostScriptによってプリンター側で高解像度(300 dpi以上)の滑らかな曲線に変換されて印刷されることで、DTP市場を席捲した)、3Dグラフィックはシリコングラフィックス社製(SGI)、ワークステーションと分担だった感じ。


(個人的には、NeXTSTEP “NeXTcube”が欲しかったが…

当時のMAC(68K)ワークステーション並みに動かす為にラディウス社のロケットという拡張カードを入れ、一台のマシンにCPUが2個、そしてグラフィックカードも32Bitのものにしてみたりと、PC自作機と同じような魔改造をしていた、それでもレンダリング(レイトレーシング、ラジオシティー)には3日間作動させても終わらない、なんてことが懐かしい…)



この作業分担、道具の使い分けを行う事、しかもデータの共有をする為には、通信の仕組みも知らないとできない時代だった。


AppletalkとNETBIOSの接続、通信の苦労…

ディスクフォーマットの違いやら、互換性の問題は常につきまっとていた。 

 

今や、それがどうした?

である。


そこらへんの話はブラックボックスでも良いのかも知らない。


今のこのIT関係の教育のロードマップを考察すると、

【小学校低学年(1〜2年)】

└─ プログラミング的思考の導入

・順序やルールを理解(例:朝の準備の手順)

・簡単なゲームや迷路などの操作体験


【小学校中学年(3〜4年)】

└─ ブロック型プログラミング(Scratchなど)

・キャラクターを動かす、音を鳴らす

・順序、条件(if)、繰り返し(loop)を学ぶ

・変数やイベントの概念を導入

・修正:ブロックの順番を変えたり、パラメータを変える


【小学校高学年(5〜6年)】

└─ ブロック型での応用・自作作品

・簡単なゲームやアニメーションを作る

・条件分岐やループを複合的に利用

・簡単な関数やカスタムブロックの利用

・プログラムの動作確認・修正・改善の体験


【中学校】

└─ テキスト型プログラミングの導入

・Python、JavaScript、Javaなど

・ブロック型で学んだ変数・条件・ループをコード化

・デバッグ、エラー理解、コメントの書き方

・簡単なデータ構造(リスト、辞書など)を学ぶ


【高校】

└─ 応用・発展

・アルゴリズム(探索、ソート、再帰など)

・データベース、SQL、Webアプリ開発の基礎

・VBAやPythonで業務自動化

・チーム開発やGitなどのツールを体験


と言う感じだろうか?


言語はUNIXと言うかLinuxなのかな

開発言語はやPython、SQL、HTMLかな

(まぁ多くの人は知らなくても良いかも、AIに投げれば、コード化してくれる時代だろう)

通信プロトコルは…TCP/IPは当面無くならないだろう。


孫たちは今、生成AIの利用が身近になった時代。

そしてそのスタートラインに立った様だ。

この子達の未来、老害は静かに見守るだけしかない。


「おじい!こんな事もできないの?」

(あー、いつか言われるのだろうなぁー…。)


悔しいからきっと、掌を見せ、

「これでいくつ迄数えられる?」と孫に言う。

(もし、指を折り、5と答えたら、)

笑いながら、もっと数えられるよ。と言ってやるつもり…



補足

現在の生成AIで、プログラムをどの程度、自動生成するか試してみたところ、

以下の様なコードを自動生成した。

プログラムと言ってもJavaScriptの生成を頼んだ。

<!doctype html>

<html lang="ja">

<head>

<meta charset="utf-8"/>

<title>年・日付表ジェネレータ</title>

<style>

body{font-family:system-ui, -apple-system, "Hiragino Kaku Gothic ProN", "メイリオ", sans-serif; padding:20px}

input, button, select {margin:4px 6px 4px 0; padding:6px}

table{border-collapse:collapse; width:100%; margin-top:12px}

th,td{border:1px solid #ccc; padding:6px; text-align:left}

thead{background:#f4f4f4}

.small{font-size:0.9em; color:#666}

.controls{margin-bottom:10px}

</style>

</head>

<body>

<h1>年・日付表ジェネレータ</h1>


<div class="controls">

<label>モード:

<select id="mode">

<option value="year-full">単一年:その年の全日付</option>

<option value="range-jan1">年の範囲:各年の 1月1日一覧</option>

</select>

</label>


<label id="label-year">年:

<input type="number" id="year" value="2025" min="1" style="width:100px"/>

</label>


<label id="label-start" style="display:none">開始年:

<input type="number" id="startYear" value="2020" min="1" style="width:100px"/>

</label>


<label id="label-end" style="display:none">終了年:

<input type="number" id="endYear" value="2025" min="1" style="width:100px"/>

</label>


<button id="generate">生成</button>

<button id="exportCsv">CSV をダウンロード</button>

</div>


<div id="summary" class="small"></div>

<div id="tableWrap"></div>


<script>

const modeEl = document.getElementById('mode');

const yearEl = document.getElementById('year');

const startEl = document.getElementById('startYear');

const endEl = document.getElementById('endYear');

const labelYear = document.getElementById('label-year');

const labelStart = document.getElementById('label-start');

const labelEnd = document.getElementById('label-end');

const generateBtn = document.getElementById('generate');

const tableWrap = document.getElementById('tableWrap');

const summary = document.getElementById('summary');

const exportBtn = document.getElementById('exportCsv');


function updateUI() {

const m = modeEl.value;

if (m === 'year-full') {

labelYear.style.display = '';

labelStart.style.display = 'none';

labelEnd.style.display = 'none';

} else {

labelYear.style.display = 'none';

labelStart.style.display = '';

labelEnd.style.display = '';

}

}


modeEl.addEventListener('change', updateUI);

updateUI();


function pad(n){ return (n<10? '0'+n: ''+n); }


function weekdayName(d){

// 日本語の曜日

return ['日','月','火','水','木','金','土'][d];

}


function generateFullYearTable(y){

const rows = [];

let date = new Date(y,0,1); // Jan 1

const end = new Date(y+1,0,1); // next Jan 1 (exclusive)

while (date < end) {

const yyyy = date.getFullYear();

const mm = pad(date.getMonth()+1);

const dd = pad(date.getDate());

rows.push({date: `${yyyy}-${mm}-${dd}`, weekday: weekdayName(date.getDay())});

date.setDate(date.getDate()+1);

}

return rows;

}


function generateRangeJan1(startY, endY){

const rows = [];

for(let y=startY; y<=endY; y++){

const d = new Date(y,0,1);

rows.push({year: y, date: `${y}-01-01`, weekday: weekdayName(d.getDay())});

}

return rows;

}


function renderTable(headers, rows){

if(rows.length === 0){

tableWrap.innerHTML = '<p>該当するデータがありません。</p>';

return;

}

const table = document.createElement('table');

const thead = document.createElement('thead');

const trh = document.createElement('tr');

headers.forEach(h=>{

const th = document.createElement('th');

th.textContent = h;

trh.appendChild(th);

});

thead.appendChild(trh);

table.appendChild(thead);


const tbody = document.createElement('tbody');

rows.forEach(r=>{

const tr = document.createElement('tr');

headers.forEach(h=>{

const td = document.createElement('td');

td.textContent = r[h.toLowerCase()] ?? r[h] ?? '';

tr.appendChild(td);

});

tbody.appendChild(tr);

});

table.appendChild(tbody);

tableWrap.innerHTML = '';

tableWrap.appendChild(table);

}


generateBtn.addEventListener('click', ()=>{

const mode = modeEl.value;

if(mode === 'year-full'){

const y = parseInt(yearEl.value,10);

if(isNaN(y)){ alert('年を正しく入力してください'); return; }

const rows = generateFullYearTable(y).map(r=>({date:r.date, weekday:r.weekday}));

renderTable(['Date','Weekday'], rows);

summary.textContent = `${y}年:合計 ${rows.length} 日を表示しています。`;

} else {

const s = parseInt(startEl.value,10);

const e = parseInt(endEl.value,10);

if(isNaN(s) || isNaN(e) || s>e){ alert('開始年と終了年を正しく入力してください(開始 ≤ 終了)'); return; }

const rows = generateRangeJan1(s,e).map(r=>({year: String(r.year), date:r.date, weekday:r.weekday}));

renderTable(['Year','Date','Weekday'], rows);

summary.textContent = ` ${s}年 〜 ${e}年:合計 ${rows.length} 行を表示しています。`;

}

});


// CSV エクスポート

exportBtn.addEventListener('click', ()=>{

const tbl = tableWrap.querySelector('table');

if(!tbl){ alert('まず表を生成してください'); return; }

// CSV を生成

const rows = [];

const ths = Array.from(tbl.querySelectorAll('thead th')).map(th=>th.textContent.trim());

rows.push(ths.join(','));

tbl.querySelectorAll('tbody tr').forEach(tr=>{

const cols = Array.from(tr.querySelectorAll('td')).map(td=>{

// カンマや改行をエスケープ

const t = td.textContent.replace(/"/g,'""');

return `"${t}"`;

});

rows.push(cols.join(','));

});

const csv = rows.join('\n');

const blob = new Blob([csv], {type: 'text/csv;charset=utf-8;'});

const url = URL.createObjectURL(blob);

const a = document.createElement('a');

a.href = url;

const now = new Date();

const fn = `dates_${now.getFullYear()}${pad(now.getMonth()+1)}${pad(now.getDate())}.csv`;

a.download = fn;

document.body.appendChild(a);

a.click();

a.remove();

URL.revokeObjectURL(url);

});


// 初回レンダリング(例)

generateBtn.click();

</script>

</body>

</html>


である。

しかもこのHTMLの使い方まで、生成してくれたのである。

このHTML、styleseat、Javascriptが読める人は修正ができるし、

万年カレンダーが必要な人のように、使う(使いたい)人は結果をCSVに出力して使えばよい。

という時代なのだ。


評価をするにはログインしてください。
ブックマークに追加
ブックマーク機能を使うにはログインしてください。
― 新着の感想 ―
感想はまだ書かれていません。
感想一覧
+注意+

特に記載なき場合、掲載されている作品はすべてフィクションであり実在の人物・団体等とは一切関係ありません。
特に記載なき場合、掲載されている作品の著作権は作者にあります(一部作品除く)。
作者以外の方による作品の引用を超える無断転載は禁止しており、行った場合、著作権法の違反となります。

↑ページトップへ