2020年01月の日記です

目次

03日 あけましておめでとうございます
14日 忙しい
16日 mysql で varchar を int に alter table する。


あけましておめでとうございます  2020-01-03 18:07:45  その他

▲目次へ ⇒この記事のURL

あけましておめでとうございます

今年は新年のあいさつエントリが遅めです。


まずは例年通り、今年のお節料理から。


栗きんとん、鶏ハム、伊達巻、煮卵。


…作ったのは、以上。今年は少なめ。



一応、かずのこ入り松前漬けは、半完成品を購入してきて作ったもの。

(封を開けて、材料を付属のたれで付けるだけ。かずのこは既製品を入れた)


いくらの醤油漬けは、秋のうちに作って冷凍していたもの。


その他、既製品で買ってきて入れただけのものは、

昆布巻き、きゃらぶき、うぐいす豆、ハム、伊達巻、紅白かまぼこ、さくらんぼの練り切り。



栗きんとんは特筆事項アリ。


長男が中学の科学部の畑で収穫した薩摩芋を使用し、長女と次女が2度裏ごしして作ったもので、非常に美味でした。

親戚の集まりで披露しても、すごくおいしいと大評判。




さて、おせち料理の手作りが少ない理由は、昨年暮れの仕事がぎりぎりまで忙しかったため。


12月頭に、年内に作っておきたい、と頼まれた部分がそもそもボリューム多め。

それでも、なんとかほぼ作り上げています。


これに加え、25日ごろになってから「この仕事もお願い」と頼まれたものが1つ。

まぁ、これは半日程度の仕事でした。


しかし、一番問題なのは、27日…昨年の仕事納めと決めた日の、午後4時ごろに急遽入った仕事。

これが丸2日ほどかかる仕事になり、28・29の土日がつぶれました。



30日は大掃除。

小4の次女はまだ私物を「捨てる」技術が身についていなくて、ガラクタの山を前に途方に暮れている始末。

一つ一つ聞き取りをして、本人が本当に置いておきたいものと、なんとなく捨てられないだけのものを分別しないとならない。


これがシャレにならない大仕事で、これをこなしつつもおせち料理の買い出し。


いつもより買い出しが遅いので、正月価格の高い材料しかない。

なんでタケノコの水煮一本で 800円もするのだ。(普段は 100円。結局捜し歩いて、250円で購入したけど)


この時点で、時間がないので作るものを大幅に絞り込む。

料理が少ないと寂しいので、豆やハム、昆布巻きなど、既製品を買いそろえる。


で、31日に、大掃除の残りをやりつつ、少ない料理を完成させた、という次第。




今年は長男は高校受験を控えており、年末年始も塾があった。


こんな時まで塾で勉強する必要があるのか。

「気合を入れれば何とかなる」という非科学的主義の、本人がやった気になる、というだけの勉強ではないのか。


とはいえ、その「本人が満足する」ことこそが大切なのかもしれない。

受験生にとって、ライバルに後れを取る、というのが一番の恐怖だし、恐怖を感じながらでは正月気分も味わえないだろう。



というわけで、上に書いたようなおせち料理を作っている最中にも、長男の塾の送り迎えが発生する。


元日も、あさ8時過ぎには家を出て塾へ。夕方には帰れるのが「正月らしくのんびりできる」ところ。

(日曜日など、12時間くらい塾に行っている)




昨日2日、親戚一同の集まりがあった。

毎年、母が同居している、長男(僕から見ての兄。上に書いた、僕の子の長男ではない)の家に行く。


今年は、兄弟の子供たち(僕から見て、甥姪)の集まりが悪い。

すでに多くが仕事を持っていたり、今年は大学受験だったりで、何かと忙しいそうだ。


というわけで、我が家の子供たちと、長男の子(長女)だけが、いとこの集まり。



いつもより寂しいかというと、あまりそういう感じではなく、むしろ人が少なめでスペースがあったため、持って行ったボードゲームをゆっくり遊べた。


昨年のクリスマスプレゼントから、「ラブレター」は、簡単なルールで楽しいので人気があった。

さらに以前のクリスマスプレゼントだが、タイムボムも人気。


「こんなにのんびり遊べるなら、街コロも持ってくればよかった」というのが子供の意見。

(あれは場所を取るゲームなので、遊べないだろうと思ってもっていかなかった。

 しかし、我が家の子供たちの一番のお気に入りのボードゲーム)



我が家の長男、先述の通り、塾で忙しいため夕方から参加。

主な参加理由は「寿司とカニが食いたい」だった。毎年、用意してくれているから。


今年ももちろんあり、食べさせてもらった。忙しくて正月気分を味わえてなかったが、満足したようだ。




そして今日。

大みそかから3日間は、塾は「特訓」で忙しかったのだけど、今日だけは休み。

(また明日から通常授業)


長男ものんびり過ごし、やっと正月な気がする、と言っていた。


次女は宿題の書初めをやる、というので、先ほどまで指導していました。

(僕はとても字が汚いのですが、習字を習っていたことがあって、一応筆遣いなどは教えられます。)



これで、やっと僕も日記を書けているわけです。




明日は土曜日なのですが、仕事始め。

年末ぎりぎりまでやっていた仕事の続きをやらねば…


「年末までに終わらせたかったぶん」は終わっていますが、年始早々に使いたい部分は、まだ終わっていないのです。



▲目次へ ⇒この記事のURL

同じテーマの日記(最近の一覧)

その他

別年同日の日記

03年 年賀回り

08年 あけましておめでとうございます

14年 あけましておめでとうございます

16年 三が日

18年 親戚廻り


申し訳ありませんが、現在意見投稿をできない状態にしています

忙しい  2020-01-14 12:10:16  その他

▲目次へ ⇒この記事のURL

日記を全然書いてないし、正月にかろうじて書いた日記を読めばわかることなのだけど、


仕事が忙しい。

日記を書く暇もない。


より正確に言えば、仕事ばかりしているので、日記に書くようなネタがない。

本当は書きたいネタもある(12月頭に草稿を書いている)のだけど、詰めが甘くてアップできない。

詰めている時間はない。




とはいえ、日記だから…いや、もともと日々書いてはいないのだけど、あまり間が空きすぎないようにしたい。


箇条書きでも最近の出来事を。



長男、高校受験で精神的に不安定。

急に泣き出したりしたこともある。


塾に行っているが、ハードスケジュールだ。


塾は平日と土曜日に合計3日。


平日は午後7時から9時40分まで。

土曜日は午後1時30から6時半まで。


これが、年明けからさらに増えた。

土曜日に追加で、午前中10時から11時50分まで授業。

日曜日に、朝 8時50分から午後 5時までに模擬テスト。


僕が高校受験していた時はこんなにハードではなかったが、今はこれが「標準的」なようだ。



そして、模試を見せてもらったが、昔よりもずっと問題数が多い。

ちょっとでも悩んだら全体の時間が足りなくなるような分量で、昔みたいな時間配分で「見直し時間を確保しておき、迷ったら後回し」みたいな戦略は使えないようだ。

見直しの時間などなく、迷ったら捨てる、という感じなのだろう。


…これ、自分たちの世代が時間配分などのテクニックを駆使して「本来の勉学の成績とは関係なく、受験テクニックがあるやつが点数を取る」という風潮を作り出してしまったため、封じてきたのかもしれない。


でも、ルールがあれば対策も必ずある。

今のやり方だと、ダメと感じたときに潔く捨てられるやつが高得点を取りそうだ。


地道にコツコツ積み上げるタイプが低く見られ、すぐに派手な成果を出せるタイプがもてはやされる…

そんな時代が求める受験形式なのかもしれない。




神奈川県では特色試験、というものがあって、幅広い知識を必要とされる試験形式だ。


長男が模試を受けて「よくわからない問題があった」と見せてきたので、少しやってみた。


英語で、円周率が小数点以下何桁まで解き明かせたか、という歴史を説明した問題文。

これに対し、「この時代に、ヨーロッパと日本ではそれぞれどのような事件が起きたか」とか、「円周率の小数点以下の桁数を、横軸を西暦、縦軸を桁数の対数としたグラフに折れ線で示せ」とか、設問がある。


このうち一問が、円周率のような、ある程度の桁数以上を求めることに全く意味がない数学分野が、なぜこれほど重視されるのか、という説明に引き続き、その応用としての「公開鍵暗号」の仕組みを説明するものだった。


最初にざっくりと、公開鍵暗号の基礎の一つである、電子署名の仕組みを説明してある。

それを理解したうえで、小さな問いにいくつか答える形式だった。


しかし、長男は限られた時間内で電子署名の仕組みを十分に理解できず、正しい回答ができたかわからないという。



そーですか。最近の高校受験は、公開鍵暗号くらいは知ってないとだめでしたか。

(これはあくまでも模試なのだけど、この程度の問題は出てくるということだな)



電子署名のアルゴリズムは、問題文の中で説明されているので、知っている必要はない。

でも、「電子署名」というものが何なのか、という程度の知識はないと、アルゴリズムを示されても何をしたいのか理解できない。


そんなわけで、長男には電子署名というものが何か教えておいた。


「Alice と Bob が通信しようとしているところに、これを盗み聞きしようという Charlieがいて…」という定番説明をしたら、ウケた。


(この名前を出しただけで面白がった長男は、筋がいい。名前でありながら、単に A B C という区別記号にすぎないことを理解できたのだから。

 暗号の教科書を見ると、たいていはこの3人が登場人物です)




昨年秋に台風で壊れたウッドデッキは、無事修復された。


昨年の末までに、大まかな工事は終わっていたが、白木だった。

今年に入ってから塗装が行われ、つい数日前に、物干しざおなどを支える金具が取り付けられた。


しかし、雨樋はまだ壊れたまま。

台風の後、雨樋の業者さんが一番忙しいらしい。



ウッドデッキは、基本的に「新築時の状態」に修復された。

時代の流れもあり、多少の部材変更はあるし、それに伴う設計変更もあるのだけど。


で、SWH では、ウッドデッキの床面は「塗装しないで引き渡し。家主が自分で塗装する」ことになっている。


SWH は木部が多い住宅で、メンテナンスは家主の責任だから。

ウッドデッキは比較的メンテナンスしやすいところで、最初に白木を塗ることから練習してもらう、という意図だ。



もう練習いらないから、塗ってもらえると楽できるのだけどな…と思うのだけど、白木での引き渡し。

今は寒いから、春になったら塗ろう。




小6の長女はスプラトゥーン2が大好きでずっと遊んでいるが、年末についに念願の「ウデマエX」に到達した。


スプラトゥーン2の中には、初心者向けの「ナワバリバトル」と、より難しいゲームである「ガチバトル」がある。


このうちガチバトルは、下から順に、C、B、A、S、Xという「ウデマエ」分けがなされている。

厳密には、ABCの上下には-と+があるし、Sの上にはS+0~S+9という10段階がある。


勝ち続ければウデマエは上がるし、負け続ければ落ちる。

大抵は、自分に合ったウデマエのあたりで上がったり下がったり、になる。

Xに到達できるのは、ほんの一握りだ。


さらに細かくは、ガチバトルは4つのルールに分かれる。ウデマエはそれぞれで別だ。


長女は、冬休みに入ってすぐに一つのルールでXに達し、さらに大みそか直前にもう一つのルールでXになった。


そして、「毎月頭に、評価が低い人は自動的に降格」というのがXの特別ルールで、大みそかのぎりぎりの時間で残留を決めた。

(X以外は、勝敗で昇降格が決まる。しかし、Xは戦績で評価される数値があり、この数値によって降格が決まる)


さらに、年を挙げてすぐにまた別のルールでXに。3つのルールでXになった。

残る一つのルールは「もう少し」なのだけど、苦手でまだXになれていないようだ。



僕はもう、スプラトゥーンは「諦めて」いる。

というか、最初から FPS はそんなに好きではない、とこの日記でも公言している。


今でも熱心なのは、長女と妻。妻は現在ウデマエS。

長女は、我が家の中で間違いなく一番強い。




この年末、我が家は急に「ジュエルペットてぃんくる」がリバイバルブームとなった。


長女が保育園のころに大好きだったアニメ。

その頃の次女は赤ちゃんだったため、見ていたことも覚えていない。


で、先日話をしていた時に、次女が「見たい」と言い出した。

当時の CATV での再放送を DVD に撮ったものならあるよ…と言っていたら、YouTube に公式に全話が公開されているのを次女が見つけてきた。


じゃぁ、こちらの方が画質が良い。

CATV は、SD 画質で、ハイビジョン放送の全体を収めるために、上下に黒い帯を入れて放送していたんだよね。

つまり、現在のテレビで見ると、上下左右に枠がある「額縁」状態になる。


ただ、YouTube での全話公開は、オープニングとエンディングはカットだった。


最終話だけ「特別編の」 OP・ED があるのだけど…

これ、放送時は「いつもと違う」からこそ、特別感があったのね。

YouTube でも最終話は OP・ED ちゃんとついていたけど、特別感が感じられないのがちょっと残念。


冬休み中に少しづつ見て、もう見終わったのだけど、長女・次女は ED の歌が好きで時々歌ってる。

歌い始めると、長男も一緒に歌ってたりするのが仲の良い兄弟でほのぼのする。


(あの歌は、僕もいい歌だと思う。

 以前公言したが、僕はてぃんくるは好きなアニメ。久しぶりに見てもよかった。)




▲目次へ ⇒この記事のURL

同じテーマの日記(最近の一覧)

その他

別年同日の日記

03年 libSDL

04年 アンケート

11年 おさんぽ

16年 トーマス・J・ワトソン 誕生日(1914)

17年 WaveRunner


申し訳ありませんが、現在意見投稿をできない状態にしています

mysql で varchar を int に alter table する。  2020-01-16 20:00:56  コンピュータ

▲目次へ ⇒この記事のURL

興味ない人には、なんのこっちゃわからないタイトル。


仕事で複数人数、複数のマシンで開発を行っているので、それらのマシンを同期しないといけない。

プログラムなんかは github 使って管理しているのだけど、DB 構造なんかの問題もある。


で、mysql (実際には mariadb だけど)のテーブル構造を、ファイル化してある。

このファイルは github で管理し、新しいサーバーを建てるときには、ファイルを mysql コマンドで

流し込めば完了する。


そして、開発中に「変更」になったものについては、alter table を列記したファイルを作る。

github から最新のデータを得たときなどは、このファイルを mysql に流し込めば完了する。


…というつもりで作業していたら、そう単純じゃない問題があったよ、という話。




もともと技術者でないとわからない話なので、ついてこれる人だけ読み進めてほしい。


alter table でテーブル構造の変更はできるが、alter table には IF NOT EXISTS というオプションがある。

「もし、その構造が存在していないなら」新しく追加する、などという動作を行う。


だから、先に書いたように、プログラム更新のたびに、必ずこの「 DB 構造差分データ」を DB に流し込めば、構造がすでにあれば無視され、なければ正しく追加される。



でも、「varchar(4) を tinyint に変えたい」で詰まったんだ。


設計段階ではいろいろあって varchar(4) してあったけど、事実上小さな数値しか入らない、と分かったため。



直接 alter table で変換しようとすると、「文字列を数値に変えられない」とエラーが出て失敗する。

これは、何もデータがない時に、NULL 文字列が入っていたため。


数値になった際も、0 は使わないとわかっている。だから、NULL 文字列は 0 に変換してほしい。


というわけで、事前に



UPDATE [table] SET [col]='0' where [col]=''


という感じで、'' を 0 に変える。それから alter table すればうまくいく。



…というわけでもなかった。




上の UPDATE 文、[col] が varchar の時は動いた。

でも、tinyint になると、エラーになって止まる。


先に書いた通り、このファイルはプログラム更新のたびに読み込まれるのだ。

すでに tinyint の時には、何もせずにスルーしてほしい。


エラーの理由はわかっている。


[col]は数値なので、where 句に書かれた比較は数値で行おうとする。

しかし、NULL 文字列は数値ではないので、「文字列を数値に変えられない」とエラーが出て失敗する。


…最初の問題に戻ってきた。

んぎぎぎぎ…どうすればよいのだ。


仕方がない。IF 文を使ってみよう。

僕は mysql を「単に使っていた」歴は長いのだけど、php や javascript と組み合わせていたことが多いため、sql のみで記述するファイルとして、IF を使ったことがない。


やりたいのは、「[col] の型が varchar の時だけ、各種処理を行う」だ。


[col]の型を調べるには、



show columns [table] like '[col]'


とすればよい。これで、画面上に型が表示される。


…いやいや、それはダメだ。画面上に出ただけでは、IF 文で判断できないじゃないか。

しかし、どうすればこれを基に IF の判断につなげられるのかわからない。




ところで、mysql はデータベースだ。データの扱いに長けている。

どれくらい長けているかというと、「自ら作成するデータベースの構造も、データベースとして格納されている」のだ。


つまり、先ほど show columns で見た内容も、実はデータベースに入っている。

データベース名 INFORMAION_SCHEMA の中に、テーブル名を示すテーブルや、カラム名を示すテーブルがある。



SELECT data_type FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name=[table]' AND column_name='[col]'


とすれば、目的のカラムのデータ型を得られる。


…が、これもまだ、表示されるだけだ。


また、サーバー内に複数のデータベースが入っており、同じテーブル・カラムがそれぞれにある場合、全てが表示されてしまう。

そのためさらに現在接続しているデータベース名で絞り込む必要がある。




「表示しかできない」という問題に対しては、show columns は名前の通り本当に表示だけだが、select は sql の中心的な構造なので、素敵なオプションがある。


先のコマンドの冒頭を



SELECT data_type INTO @type FROM ~


と変えてやる。 INTO @type が挟まっただけだ。

しかし、これで「表示」するのではなく、@type という変数に格納されるようになる。


もう一つ、目的外のデータベースも検索対象になることについては、WHERE の直後を変えてやる。



~ WHERE table_schema=database() AND tabel_name~


これで、データベースを絞り込める。




ここで、@type には varchar か、tinyint が入っているはずだ。

目的は、varchar の時だけ、tinyint に alter table することなので、



IF @type='varchar' THEN
  UPDATE [table] SET [col]='0' WHERE [col]='';
  ALTER TABLE [table] MODIFY [col] tinyint DEFAULT 0 NOT NULL;
END IF;


みたいな感じで処理してやればよい。


ただし、このまま mysql クライアントで流し込むとエラーになる。

; は「mysql サーバー的には」コマンドの区切りなのだが、「mysql クライアント的には」命令の終わりを兼ねるためだ。


DELIMITER で命令の終わりを変えられる。

なので、最初に DELIMITER で // を命令の終わりに変え、全てが終わった後で元の ; に戻してやるといい。


最初の SELECT から含めて全部を書くと、次のような感じになる。



SELECT data_type INTO @type FROM INFORMATION_SCHEMA.COLUMNS
  WHERE table_schema=database() AND table_name=[table]' AND column_name='[col]';
DELIMITER //
IF @type='varchar' THEN
  UPDATE [table] SET [col]='0' WHERE [col]='';
  ALTER TABLE [table] MODIFY [col] tinyint DEFAULT 0 NOT NULL;
END IF;
//
DELIMITER ;




同じことで悩んでいる人、結構多そうだと思うのだけど、探してもそういう記事を見かけなかった。

ただ、「show columns の結果を変数に入れたい」とか、「文字列から数値のキャストの癖が強すぎる」とか、悩んで解決できていない記事は多数見つけた。


それらがすべて、僕と同じ悩みで書かれたわけではないだろう。

でも、同じ悩みの人の解決の手立てになれれば、幸いである。



▲目次へ ⇒この記事のURL

同じテーマの日記(最近の一覧)

コンピュータ

別年同日の日記

04年 タワーリング・インフェルノ

15年 スーパーマリオとパックランドの関係性について


申し訳ありませんが、現在意見投稿をできない状態にしています


戻る
トップページへ

-- share --

0000

-- follow --




- Reverse Link -