Posts

Showing posts with the label Database

子供が産まれて、育休を取り始めました

この度、赤ちゃんが生まれました。 めでたい。 そんでもって、10月から半年ほど育休を取って、育児に専念することになりました。 会社・部署の方々など、様々な方のサポートがあってのことです。 とても感謝しています。 休み自体は9月のシルバーウィークから取っていて、すでに絶賛育児中です。 ただね…… この時点ですでに大変なんだが? 細かいポイントを含めれば色々あるけど、しんどかったポイントをあげるなら、こんな感じ。 1. 生活リズムが不規則になる 私の担当範囲は、起きている時間のミルク、おむつ替え、沐浴、暇な時にじっと赤ちゃんの様子を見つめるなど。(あれ、意外とやってないな……) 主に昼から夜、あとは深夜から朝方(1時〜7時)に起きている感じ。 深夜に起きる前と、朝の担当が終わったあとに、それぞれ3〜4時間程度寝ている。 元々深夜に作業するのが苦じゃないタイプなので、深夜も赤ちゃんが寝ている時などは、パソコンでAIと戯れたり、スマホでダラダラとこんな感じの記事を書いたりと好き勝手やっている。 が、最初の方は生活リズムを変えるのがしんどかった。 無理やり寝るためにサプリメントを飲んだり、とにかく横になったりと色々試したが、寝れない時はとにかく寝れない。これがしんどい。 結局、慣れるまではどうにもならなかった。 人間って生活リズムを変えるのが難しい生き物なんだな、と割り切ることにした。 一方、妻の側は、今のところだいたい3時間おきに授乳がある。 母乳だったり、ミルクだったり、その併用だったり。 これがシンプルながらに、妻への負担が半端ない。 妻は授乳のたびに起きているし、赤ちゃんの空腹具合によっては泣き声と共に叩き起こされたりと、不規則な睡眠を強いられている。 授乳の間隔が空くと胸が張るし、乳腺炎になることもあるそう。 発熱などが出ることもあるので、妻の体調も気になる。 うちは基本的に母乳をあげて、足りない分はミルクを作って補う感じで運用している。 育児を始める前は、12時間ずつ分担して、私のターンはミルク、妻のターンは母乳でいいんじゃない?とか考えていた。 が、現実はそんなに割り切れるようにはなっていなかった。 赤ちゃんの都合だけじゃなく、妻の体の事情もある。 あと、沐浴とかも...

OracleのNVARCHAR2は2バイト

Image
 という話。 そもそも何でそんな話に? 文字列をバイトで区切って処理を行おうとした時の話。 これOracleから取り出すときにsubstrb関数を使ってバイト数を指定すれば楽じゃね? という考えに至り、実際にそれを試したがテストを行った時にあらびっくり。 半角も全角も同じ桁数で区切られているじゃありませんか。 これはまずい。半角1バイト全角2バイトじゃないの!?という考えを持っていたのでパニクった。 ってことでひとまず原因を調べたところ、タイトルの内容に辿り着きました。 固定バイト数で考えられるからプラスに働くこともあるが、今回は知らないが故に時間を無駄にかけてしまった・・・ NVARCHAR2、便利なので何でもかんでもNVARCHAR2に設定していいわけではない、という教訓を得ました。 取り方を知っていれば一発で解決じゃん、という考えもあるのでコードをメモ的に取っておくと良いかも。やるかは分からない。

SQLで連続するレコードの比較をする(LeetCode Database)

Image
概要 問題 解法 概要 前回 に引き続きSQLです。 問題 +---------------+---------+ | Column Name | Type | +---------------+---------+ | id | int | | recordDate | date | | temperature | int | +---------------+---------+ 今回用意されているテーブルは以上です。 以下のように、前日よりも気温が気温が高かった日のレコードの id を表示してください、という問題です。 解法 SELECT w1.Id FROM Weather w1, Weather w2 WHERE w1.Temperature > w2.Temperature AND subdate(w1.recordDate, 1) = w2.recordDate テーブルを二つ用意し、 subdate 関数を使うことで時間の差を求めます。 売り上げが前日よりも上の日とか抜き出すのに使えそうなSQLとなりました。 SQLは列の比較には強くても、行の比較は思ったより苦手ということを改めて感じました。

重複している要素をSQLで抜き出す(LeetCode Database)

Image
LeetCodeにDatabaseのカテゴリがある話。 問題 例 解法 LeetCodeにDatabaseのカテゴリがある話。 実はSQLの勉強にも使えるんですよね。 暇な時にEasyから潰したりしてます。 で、解くのはいいのですが、一度解いただけで解きっぱなしだとなんだかもったいない! あれ?記事として書いてパターン化しておいたら楽なんじゃない? と感じたので書いておきます。 問題 182. Duplicate Emails Person テーブルのEmail列に重複する文字列が存在するのでそれを抜き出して欲しい、という問題ですね。 例 ±—±--------+ | Id | Email | ±—±--------+ | 1 | a@b.com | | 2 | c@d.com | | 3 | a@b.com | ±—±--------+ 仮に上記のテーブルなら以下の形で返すようにクエリを設計してください。 ±--------+ | Email | ±--------+ | a@b.com | ±--------+ 注意 : Email列は全て小文字です。 解法 # Write your MySQL query statement below SELECT Email FROM Person GROUP BY Email HAVING COUNT(Email) > 1 重複というのはつまり二つ以上存在する、ということなので GROUP BY で分類します。 その後に条件( HAVING 句)として上記の重複の条件を集計関数である COUNT で数え上げを行えば無事完了です。 つまり、重複する要素だけを抜き出したいときは # Write your MySQL query statement below SELECT カラム FROM テーブル GROUP BY カラム HAVING COUNT(カラム) > 1 で一般化できるということですね。 今回はここまで。お疲れ様でした。

LeetCodeのDatabaseカテゴリで見つけたTRUNCATE TABLEについて

Image
LeetCodeのDatabase問題にて。 181. Employees Earning More Than Their Managers という問題を解いた時の話。 LeetCodeのDatabaseカテゴリの問題では SQL Schema という欄があり、どういったクエリを実行して該当テーブルが作成されているか、またその中に入っているデータはどういったものかを見ることができる。 その中に TRUNCATE TABLE Employee という一文を見つけた。 Employeeはテーブル名なので TRUNCATE TABLE テーブル名 という使い方をするものなのだろう。 恥ずかしながら知らなかったので調べてみたところ、指定したテーブルの全てのデータを削除するという内容らしい。 これまではそういった操作はDELETE文で実行していたが、どうやらTRUNCATE TABLE文には以下のようなメリットがあるらしい。 オートインクリメントの初期化 大量のデータが存在する場合はDELETE文よりも高速であること オートインクリメントの初期化がされるのは知りませんでした。確かにDELETE文だと初期化されなかった記憶があるので助かります。 削除が高速なのはDELETE文はあくまで特定のデータを削除することに特化しているからなのだろうか?確かに全て消去しかないのと特定の条件を付けられるものだと後者の方が処理は複雑になる傾向があるが。ここら辺も根本的な理由を調べる機会を設けたいな。 一方で、DELETE文を実行した際のログなどを記録するようなトリガーを設定していても、TRUNCATE TABLE文はDELETE文とは関係ないので当然追跡はできません。そこには注意が必要ですね。