ハヤオキスルフクロウ

早起き < 呑み会

ショートコンテンツという地獄

年々、コンテンツのショート化が止まらない。 1分ドラマなんてのも出てきた。

「なぜ、短くなるのだろう?」

それは、みんなの脳が壊れていっているからだと言える。

これについて説明を試みてみよう。 ショートコンテンツに犯された読者の脳が最後の力を振り絞って最後まで読める事を切に願いながら。

TikTok、Instagramのリール、YouTubeショート。 あのアホみたいに短い動画たち。 これらは、本当に心から「面白い」と思って見ているのだろうか?
たまには面白いと思ってみてるかもしれないが基本的にはあなたは、もうそれしか見れなくなっている可能性がある。

誰しもが持っているスマホは、、賢い人たちがよってたかって我々の時間、認知を奪い合うビジネスの戦場といえる。

あなたが何か他のことに集中していても、すぐこちらに戻ってきてほしい。そういう思いで設計された様々なコンテンツは我々から貴重な時間を奪い取り、広告費に変える。

我々に楽しい思いをさせて、お金を稼ぐことは悪いことではないのかもしれない。 確かに、YouTubeやInstagram、TikTokを触ると、脳では快楽物質であるドーパミンがたくさん出て快楽を感じる。

さて、ここが本質的な点なのだが、快楽はそのまま幸福になり得るだろうか? 結論からいうとドーパミンによる快楽からは決して幸福は得られない。

スマホ依存があるように薬物に依存する人がいる。 実は薬物の依存は、スマホの依存と同じ仕組みで説明できる。キーワードはやはりドーパミンだ。
脳は快楽、依存に対して防衛機能があるため、この薬物、ドーパミンに対して効果を弱める対策を取る。 つまり、同じ量を摂取しても同じ快楽を得られなくなる。 結果、より多くの薬物を摂取するこになる。 そして、ドーパミンが過剰に出た後の脳は、精神に異常をきたして不安に襲われやすくなったり、極端な無気力になるのである。

このメカニズムはそのままスマホにも当てはまる。

スマホを使いすぎて、ドーパミンが出る。 快楽になれると麻痺する。 より強い刺激が必要になる。 短い時間でドーパミンを摂取せざるを得なくなる。 こうしてショートコンテンツを大量に消費する。 その結果、精神的に不安定になり、無気力になる。

ショートコンテンツが増えた理由はこれである。 我々(僕は入らないタイプの我々)はドーパミンという快楽に麻痺し続けてきた。より短い時間でより高刺激を欲した結果、ショートコンテンツが爆増したのだ。

ここまでで見てきたように、我々は確かに快楽を得ている。 しかし、これが本当の幸福だろうか。 ドーパミンがもたらす快楽というのは刹那的で麻痺し、副作用がある。 そんなものが我々をより豊かにするだろうか。

そうでないのなら、真の快楽とはなんだろうか? これは誰しもが知っているもの、または忘れてしまったものかもしれない。

快楽に関わる神経伝達物質の名前と効果、摂取条件についてまとめてみよう。

名前 摂取条件 効果
ドーパミン ショートコンテンツ、薬物、SNS、ジャンクフード、ゲーム、ガチャ。 快楽を感じるが短い時間だけ。脳の報酬系が麻痺し、普通の幸せを感じられなくなる。常に焦燥感に襲われ、燃え尽きやすい。
セロトニン 日光浴、散歩、バランスのいい食事、ゆったりとした読書。 自律神経が整い情緒が安定する(しかも長く持続する)。これがないとドーパミンの刺激に心が壊される。
オキシトシン 信頼できる人との会話。動物や自然との触れ合い。親切な行い。 不安が消え、孤独感が癒やされる。心臓を保護し、寿命を延ばす効果さえある。
エンドルフィン 激しい運動、辛い食べ物、心底から笑う。 痛みや苦痛を強制的にシャットアウトする。

見ての通り摂取条件に対してはよく知っているものだらけだ。

つまり、親しい人と仲良くし、健康的な食事をし、運動をして、たまには読書でリラックスしろということだ。

我々はきっと、幸福になる方法を知っている。 SNSなどでドーパミンに破壊された脳では、本質的でないのにも関わらず、より短時間で高刺激な物を欲してしまう。本当の幸せを忘れた、または知っていても選べないのだ。

あなたがもし、ショートコンテンツに今後も触れるのであればその度に、今から脳を破壊されにいく、不安に襲われやすくなり、無気力になるだろう。 そういう覚悟もって見るといい。 きっとそんなことができる人はいない。 依存とはそういものだ。

ここまでの話は説ではない。
現代の科学が突き止めた事実である。
信じる信じないの自由はない。
科学が見つけた事実は誰1人こぼすことなく全人類に適応される。

昨今のAIの発展しかり、人類の発展とは何かを日々考えさせられる。

スマホ依存を脱した結果、より豊かな感情、脳、時間を持っている僕がこの根深い問題を少しずつ解きほぐさなくてはいけない。

自分が自由であると信じ込んでいる者ほど、救いようのない奴隷はいない。

ヨハン・ヴォルフガング・フォン・ゲーテ

12時の呪い

「12時の呪い」というものがある。
名付けたのは、ほかならぬ僕だ。
それは――誰もが12時になると、ランチを欲してしまうという不可解な呪いのことを指す。

1時間ずらしたランチを考えてみよう。
11時のランチ、13時のランチ。
どちらも少し気持ちが悪い。
(13時は少し許してやってもいい)
この1時間に特別な意味はないはずなのに、僕らは抗えない。
そう、すべからく12時の呪いにかかっているのだ。

ここであえて僕は、1時間程度早めにずらした生活を送ることを心がけている。
ランチは11時に、夕飯は17時に。
パートナーや友人がいる時、仕事の日にはコントロールできないかもしれないが可能な限りそうする。  

すると、人気店にもスルッと並ばずに入れるし、移動時に混雑にも巻き込まれない。

仕事では早めに出勤すれば、誰からも話しかけられずに集中する時間を確保できる。 この時間は現代ではあまりにも貴重だ。 僕はフルリモート、フレックスなので5時とかに始めて家事などを挟みつつも10時にはその日倒したい仕事が片付いていることが多い(てかそうしないと詰む)。

「12時の呪い」を解いてからは謎の自由を得たような気になりとても気持ちがいい。

だからみんなにも試しにやってほしいけど、みんながそうするとその恩恵を僕が享受できないというジレンマがある。

こういった謎の慣習というのが我々の周りには確実に、累々と存在する。
ただし認識することは非常に難しい。
こういう発見は、外国かつかなり前の時代の本を読んだときに出会うことが多い気がする。
現代の常識と違う当たり前がそこにはある。

本は素晴らしい。

我々は、近くの人間の平均値のような存在になるという。

本はよくそこをぶち壊してくれる。

さっきもそういう文章に出会えて感謝感激って感じ。

それじゃあ、これぐらいで。

人間の自由を奪うものは、悪法よりも暴君よりも、実に社会の習慣である。

ジョン・スチュアート・ミル

僕は脳のために運動している

医学の父と呼ばれる古代ギリシャの医者ヒポクラテスの残した言葉にこういうものがある。

「あなたが不機嫌なら散歩に出かけなさい。 それでもまだ不機嫌なら、 もう一度散歩に出かけなさい。」

ヒポクラテス

注目すべきは、気分(心)を変えるために体を動かせと言っていることだ。
この視点は、現代の医学(脳科学)の観点からはあまりにも的を得た指南だと言える。

「なんのために運動しているの?」

大抵の人は、健康とかダイエットが目的だと答えるだろうが、僕なら 「脳のため」 だと答える。
ここ数年、脳についてあらゆる本を読んできたが、ほとんどの本に「運動が脳に良い、というかマジ最強」と書かれている。
その意外な事実を目の当たりにすることがあまりにも多いため、導かれるように運動を始めた。

僕は、「一日中穏やかで、不安を感じず、集中力もある」という状態がほしい。
運動はこれを可能にする。

今回は、運動の意外な効果を伝えることができて、運動しないほうがおかしいのかもしれないと思わせられれば僕が書いた意味がある。

もしあなたが、日々不安や倦怠感、集中力の欠如を感じているなら、ぜひ最後まで読んでほしい。

我々の脳はまだ森にいる

前回の記事(スマホ依存の話)でも書いているが、口酸っぱく言わせてもらうと 我々の脳はまだ森の中にいる

この高度な文明社会は、人類の歴史からすると期間としてまだ0.1%にも満たない。
ましてや、インターネットが普及して50年も経っていない。
進化というものは、1000年どころではない時間を要する。
故に、我々の脳はこの激しい文明の進歩に置いてきぼりを食らって、まだ森/自然の中で生活するのに適した形で存在している。

森の中での生活は、常に動き回っていたはずだ。
食べ物を取りに行くときも、危険から逃れるときも。
動き回ることが前提の脳を持っていることは、想像に容易いし、実際にそうなのだ。

動き回ることは、生存に有利になる。
生存に有利になるものには、脳は報酬を与える。
故に動き回ると脳は報酬を与える。

今日話したいことの概要は、以上ですべてといってもいい。
その具体的な報酬を紹介したいと思う。

可能であれば、その原理、脳で脳神経科学的に何が起こっているのかも解説したかったが、いささか煩雑なりすぎる。
コルチゾール、GABA、HPA軸、偏桃体、エンドルフィンなどなど運動と脳の関係を説明するための、様々な用語を解説していては、記事があまりにも長くなり、せっかくの本題までたどり着けないと悟ったため、そういった説明はほぼほぼ省くことにした。

詳しく知りたい人は、この本をおすすめする。

amzn.asia

もう少し簡単なものがいい人はこの本。
タイトルが怪しくて残念なんだけどまじでいい本。

amzn.asia

疑問に答える形式

以降は、一問一答形式で、運動がすごいことを伝えていこうと思う。
パラパラみて気になるところだけ見てもいいかも。

仕事のストレスがすごいです。ストレスに強くなるためには何をすべきですか?

「運動してください」

運動をしたらストレスが解消される。とかそんな次元の話ではありません。

運動後すぐにその効果を感じられます。心地よく、心が穏やかになり、集中力があがり、不安などを感じづらくなります。
この効果は、1時間から数時間続きます。もしあなたが定期的に運動すれば、持続時間は伸びていって、数時間にとどまらず丸一日続くようになります。

集中できません。

「運動してください」

運動をすると集中に必要なモチベーションに関係するドーパミン(前回の記事参照) が放出されやすくなります。
論理的思考などを司る、前頭葉にもいい影響を及ぼし、いろいろな情報を取捨選択する力が強くなり、目の前のことに根気強く取り組めるようになります。

僕が強く実感するのはこの集中力。
家で仕事をする関係上、集中というのは容易ではないです。
あらゆる方法を試したんですが、運動を軽く行った直後に仕事をすると、雑音が消えて穏やかな気持ちでスーっと仕事に入れることが多いです。
本当に驚きっます。

運動後、最初は改善が感じられない場合もありますが、継続的に運動をするとこの集中する時間は伸びていきます。

イライラします。穏やかな性格になりたいです。

「運動してください」

運動の後は、ストレスを感じずらくなります。
ストレスホルモンに対抗する脳の機能が高まるためです。
運動後は、気持ちが晴れやかに心地よくなるのはそのためです。
運動を続けていると、この効果は運動直後だけでなく、数時間、または1日中続きます。
1日中続くのであれば、それは性格が変わったといっても過言ではないでしょう。

ストレスを緩和するための薬がほしいんですが、副作用が気になります。

「運動してください」

鬱などの精神疾患の治療にも運動が使われています。
薬などと同様の効果があるのに、全く副作用がありません。
さらに比較研究の被験者が治療後に再発するかを見た場合、再発する割合が薬が半数以上だったのに対して、運動で再発した人は1割にも満たないという結果が出ています。

やるべきことを後回しにしてしまいます。

「運動してください」

我々はスマホなどの強い刺激を大量に浴びすぎて(前回の記事参照)麻痺してしまっています。
結果、強い刺激にしか体が動かない、モチベーションが保てなくなるという状態です。
家事やその他やるべきことを後回しにしてしまうのはこのためです。

この偏りを運動で調整できます。
運動を継続的にすると、倦怠感、無気力がなくなり、やるべきことを後回しにすることが減るでしょう。

記憶力をあげたいです。

「運動してください」

結論から言うと、運動以上に記憶力を高めるものはない。
運動、ストレス、快楽などと海馬(記憶する脳)はかなり密接に結びついている(解説したい、、、)。

運動は、脳のあらゆるところにいい影響を及ぼすが、その恩恵を最も受けるのが海馬である。

海馬は1年で1%程度縮むらしいが、運動をするとむしろ大きくなったという研究結果がある。

よく動くご老人が元気なのが体だけではなく、脳も元気なのを思えば不思議ではない。
運動は、前頭葉(論理的思考、理性、感情コントロールなど)と海馬(記憶) に多大なる恩恵を与える。
よく運動するご老人が、ハキハキしゃべって記憶もはっきりなのは脳科学の視点からでは必然なのだ。

子供の成績をあげたいです。

「運動させてください」

記憶力をあげたいです。 を読んでもらえたら答えは一目瞭然です。
運動することにより、論理的思考、感情をコントロールする力、記憶力が高まります。

研究では、体育の時間を最初の授業に持ってきたクラスのほうが成績が良くなったという結果があります。
特に、2時間目の授業の成績の改善が大きかったとのこと。

幼い時からスマホタブレットを与えて、塾に行かせるなんて愚行を行わず、親も一緒に外で汗をかきましょう。

ゲームがうまくなりたいです。

「運動してください」

もう説明不要でしょう。
黙って運動してください。

とりあえず説明しておくと、ゲームに必要な 感情コントロールする力、集中力、反射神経が運動によって鍛えられるんですから。

脳トレで変化を感じられません、なぜですか?

「運動してください」

脳トレとかしてる場合ではないです。
脳トレで脳に良い効果があったという研究はほとんどありません。
ほとんどの研究結果が効果なしと決断されています。

「運動はいい結果がでているの?」
「山ほどあります」

運動ならなんでもいいの?

心拍数をあげるならとりあえずなんでもいいです。
ヨガのようなストレッチは心拍数が上がらないのでだめです。

筋トレもいいですが、一番効果がみられるのは、ランニングだと言われています。

運動量はどの程度がいい?

週に3回程度、1回当たり20~30分程度が好ましいようです。

とはいえ、生活スタイルや日頃の運動習慣にもよると思うのでとりあえず心拍数を上げる運動を一日5分程度から始めるといいでしょう。
ちなみに長い時間を一回より、短いのを数回のほうが効果が出ます。

そんなに運動がいいならなぜみんなこの事実を知らないの?

お金にならないからです。

脳トレのソフトや、気分が落ち着くサプリや薬は、ものすごいお金が動きます。
企業が広告に力を入れて、我々に認知されるように頑張っているのです。

何億もの費用をかけて、我々に運動したほうがいいよ!って伝えるビジネス上のメリットはないから我々には届かないのです。

終わりに

「運動してください」

fkubota

スマホが奪うのは時間だけか?

違う。断じて違う。
この小さなデバイスはもっと我々から多くのものを奪っている。
それも我々が認識できない形で、無慈悲に、刻々と、、、

スマホは便利だ。世界を一変させた。でも僕はその悪影響を知ってから可能な限り人生から排除したいと思っている。
スマホが好きな人が多い中、今すぐスマホをやめたほうがいいなんてことは言わないけど、どんな形で影響があるかを理解しておくことはそれなりに意味があるんじゃないかなって思うんだ。

だから、少なくとも僕が影響を及ぼせる範囲内には警報を鳴らす意味で文字にする。
スマホ依存の現代人がこんな長い記事を我慢して読めるのかはなはだ疑問だけど頑張ってみるよ。🙄

具体的な悪影響

先に結論だけいうと、スマホを長時間触れていると以下のような悪影響が出る。

  • 無気力になる
  • 睡眠に影響が出る
  • 困難に立ち向かえなくなる
  • 不安に襲われる

などなど多岐にわたる。
僕は、Youtubeを気づいたら2時間見ていた後なんてのは、幸福な気持ちかといわれると「あーまたやってしまった」と後悔し嫌な気持ちになる。この時、時間を失った後悔でネガティブになっているのかというと、実はそうじゃないかもしれない。
2時間もYoutubeを見た後の脳は、無気力になり不安に陥りやすくストレスを感じやすくなっている。
無気力になるのでこのあとやろうと思っていた家事などのやるべきことへのやる気が著しく下がっているはずだ。

今日はこれらのメカニズムについて、脳神経科学の立場から簡単に説明する。
脳で何が起こっているのかを知るのは今後の役に立つと思う。

3つのキーワード

このブログを読んだ後、3つのキーワードについてある程度理解し覚えてもらえたらこの上なくうれしい。
以下の三つだ。

  1. 我々の脳はまだ森の中にいる
  2. ドーパミン
  3. かもしれないは依存する

我々の脳はまだ森の中にいる

我々は高度な文明、情報化社会で生きている。
ITが当たり前になってどれほどの時間が経っただろうか。
せいぜい30年だ。
江戸幕府が倒れてから高々150年。
圧倒的スピードで進化した人類、我々人類の遺伝子は、ホモ・サピエンスとしてこの世界に現れてからの30万年間ほとんど進化していないらしい。
言わずもがな、昨今の情報化社会に対応できているわけもなく、体、脳はまだ森の中に適応した形で存在している

目の前に、人参とチョコがあった場合、圧倒的にチョコが食べたくなるだろう。
この選択に対してチョコを毎回選んでいると不健康になり、ゆくゆくは人参を選んだ場合よりは早く死ぬのは想像に容易い。
なぜ、脳は早く死ぬ選択をさせるのだろうか。

チョコを食べさせたい、これは脳が「カロリーを摂取しろ」と命令しているに他ならない。
カロリーは我々の体を動かすエネルギーでこれなしでは動けない。
そして、このカロリーは自然界(森の中)では非常に貴重な栄養源だった。
だから脳は、カロリーを見ると反応し、我々にそれを頑張って獲得せよと命令する。

森の中であれば問題なかった。カロリーは貴重だから頑張って走って走って苦労して獲得する。
カロリーが周りに溢れていていくらでも摂取できる状態ではなかった。

現代はどうか、ドーナツやポテトチップスはあまりにも簡単に獲得できてしまう。
脳はまだ、森の中、だから命令する「そのカロリーを摂取せよ」と。取れるだけたくさん、際限なく。

僕らは、カロリーに対して抗うのは非常にむずかしい、脳が森の中にいるのに実際には高度な文明の中にいるから。
このギャップ、これが現代の悩みの種の多くの原因である。

ドーパミン

脳が命令する「〜せよ」と。
この時、脳内ではドーパミンという神経伝達物質が放出される。
ドーパミンが出て行動を促進されて、獲得すると報酬が出て、海馬(記憶)に記録される。
海馬に快楽が記憶されるので、次もまた報酬が欲しくなる、ドーパミンが出て我々は行動に移る。

依存については、このドーパミンが非常に深く関わっている。
今日の重要キーワードの二つ目の ドーパミン ぜひ覚えておいてほしい。

かもしれないに依存する

こんな実験がある。
ネズミの前にレバーがあり、これを引くと餌が出る。
ネズミは餌がほしいからレバーを引く、このレバーを引くときにドーパミンが出る。
脳が「レバーを引け」とドーパミンを通して命令する。報酬がもらえるのを記憶しているから。

面白いのはここからだ。
レバーを引いてもたまに餌が出ないようにする。
あらゆる確率で実験した結果、3~7割で出る時に最もドーパミンが放出され、ネズミは必ずもらえるときよりレバーを引く 。 同様の実験をサルに行った結果、5割の時に最もドーパミンが放出されたらしい。
半分の確率でしか得られないかも知れないが、脳が「それをしろ!」と激しく命令し、そしてそれを行うと快楽を得る。

人間も同様、この かもしれない というものに激しく反応する(ドーパミンを放出する) 。

このかもしれないをたくみに操っているのがギャンブルだろう。(ギャンブルは50%よりちょっと小さい確率で勝てるように調整されている)
毎回勝っているより、負けても次は勝てる かもしれない を味わった方が脳はドーパミンを出し、快楽を得る。
ゲームも同様 「次は勝てるかもしれない」「ガチャでいい素材が手に入るかもしれない」 で我々は熱中する。

詰まるところ、我々は かもしれないに依存 し、 かもしれないの奴隷 なのだ。

かもしれないの究極体

もう予想がついたと思うだろうが、このかもしれないを究極に集合させたのがスマートフォンだ。
今この記事を書いている間、スマホは別の部屋に置いてある。
でも脳は僕にこう言う「連絡が入っているかもしれないよ」。
誘惑に負け、スマホを開くと色々なアプリが僕を誘う、

「Xが、漫画アプリが、instagramが、Youtubeが、...が、...が、...が、更新されているかもしれないよ」と。

これでもまだ終わらない。
Youtubeを開いた場合、ショートが流れる、1つ見終わった後に僕の脳はこう言う「指をスクロールするとまた面白い動画が あるかもしれないよ」。
あとは想像の通り、狂ったように指をスクロールさせる、十分に僕を喜ばせる動画なんてほとんどない。でも、脳は確実に快楽を得ている、だから僕にそれをさせる。
残念なことに、脳が得ている快楽は、「かもしれない」に対してなのだからその動画そのものではない。

インスタのストーリー含め、ものすごく嬉しかったり楽しい気持ちになることはほとんどない。でも指は勝手に動く。
この時、森の中にいたときには絶対得られなかった量のドーパミンを大量に摂取する。
森の中にいたときに7日でやっと得られたような量のドーパミンをわずか 1時間足らずで摂取できてしまう。
(ニコニコしながらストーリーやショートをスクロールさせる人を見たことがあるかい?感情は動いているのかい?(←自戒) きっと僕と話した方が笑顔になれるよ。)

ここがとても大問題なんだ。

ドーパミンを過剰に摂取すると

意外な事実だが、快楽と苦痛は同じ場所で処理されるらしい。
運動して苦しくても快楽を感じるのはこれが原因だ。

さて、ドーパミンを過剰に摂取した場合、どのような反応が体に起こるのだろうか。
苦痛と快楽はシーソーに例えると少しわかりやすい。

快楽を得ると、シーソーは快楽側に偏る。
人間(その他生命)には、強力な自己調整メカニズム(ホメオスタシス)が備わっており、偏ると元に戻そうとする力が働く。
結果として、多くの快楽を短時間に摂取しすぎると不安になったりする。
スマホを長時間触った後の倦怠感の正体はこれだ。

逆に言うと、苦痛を感じると幸福を感じやすくなる。
運動を日頃からおこなっているとストレスを感じにくくなり、小さなことでも幸福を得やすくなる。
(僕が運動をする理由はこれ、ストレス耐性をつけるため。今度詳しく書こうと思う。運動は最高だ。)

もう少し話を進めよう、ドーパミンを過剰に摂取するともう一つ厄介なことが起こる。
耐性ができて、同じ量のドーパミンでは快楽が得られなくなるというものだ。
ドラッグ依存者、アルコール依存者の摂取量が増えるのはこのため。

同じ刺激では満足できなくなりより多くのドーパミンを欲する。
短期間に大量に欲しくなる。
最近でいうと、映画を倍速再生でしか見れない若者ととかがそうだと思う。
こんな化け物を産んでしまった大人は反省したほうがいいまじで。

結果として、小さいドーパミン(モチベーション)では動けなくなる、無気力になり不安が生じる。
やるべきことを後回しにしがちになる。
慢性的な倦怠感、不安感がある人が、急激に増えているらしい。原因は明らかだと思う。

先日、飲食店に来た4人家族が一言も喋らずにお互いにスマホを見ながら食事をしていた。
これを見た時に、僕は「あーもう、人類滅んでいいんじゃないかな」と思ったりもした。
まあ、この家族もある意味で犠牲者なのかもしれないけど。

疑ってみて

あなたがもし、常々不安だったり焦りがあったり無気力だったりするのなら、それはドーパミンを過剰に摂取しているからかもしれない。
実際、僕は明らかに変わった。
イライラしなくなったし、謎の焦燥感も消え去った。心穏やかでゆったり過ごすことができている。
散歩をすると、いろんなところに目が付き、興味が沸く、たったこれだけで幸福を感じることができる。

ドーパミンデトックス で検索してみてほしい、動画とかブログとかたくさん出てくるから。似たような体験をした人が多くいるよ。

1日だけ

1日だけでいいから、パートナーとか友達と一緒にスマホをどこかに預けて出かけてみてほしい。
ものすごく楽しいから。
行き先も特に決めずにお出かけをするんだ。興味が沸いたところにたくさん寄り道すればいい。
終わった頃には、心が落ち着いて穏やかになっているのがわかると思う。
そしてそれは、翌日にも続いているはず。

終わり

ものすごく疲れた。
頑張ったと思う。
ここまで読んでくれた人、本当にありがとう。

僕は疲れて理性(前頭葉)の機能が少し落ちている、そうなるとドーパミンの誘惑に抗えないんだ。
だからたぶん、この後にスマホを少しでも触ったらまたたくさん触っちゃうんだ。
嫌になっちゃうねほんと。

「主よ。彼らをお赦しください。彼らは、何をしているのか自分でわからないのです」

エス

fkubota

早起きについて

なんか唐突に早起きについて書きたくなった。
最近、突然文字に起こしたくなる衝動に駆られる。
メモの習慣は昔からあった。10年ぐらい前かな。
メモよりちゃんとしたものとして残そうとうしたいらしい。
何かが積もって相転移が起こったのかも知れない。

今日は、僕の大好きな早起きについて書く。
世の社長や偉人、意識高い人がよくやってるやつ。
偉大な人たちとはおそらく違って、僕は大学時代に難関な物理学に挑むために日々の生活にも手を加えないといかんなぁという焦燥から出た平凡な習慣という位置付けになる。

朝4時半に起きているというと、顔をしかめられる。
みんな朝が嫌いなんだ。
気持ちはわかる僕もそうだったから。偉そうだけど、本当にそうだったんだ。
不思議なもんで、今では何よりも好きな時間になっている。

早起きのコツをよく聞かれる。
僕の中ではコンクリートぐらい固まった答えが出ている。
「早く寝ること」
これにつきる。早く起きようとするんじゃなくて、早く寝ればいいんだ。

「早く寝れない。」ここを深堀るといろいろ見えてくるものがある。

僕らは、基本的に夜を終わらせたくない。
疲れた日中、頑張った自分、そこに訪れる癒しの・ご褒美の時間が夜の時間。
寝ることを拒否すれば、そのオアシスはより大きくなる。
だから寝たくないんだ。

もちろん甘い話だけではない。
その代償は翌日の自分が受けとる。
寝不足という形で、朝のせわしなさという形で。

うるさいよね、ほっとけよって思うよね、でも読んでるのはそっちなんだ。ありがとね読んでくれて。

けだし、夜を終わらせるかどうかってのは、次の2点に集約されるかもしれない。

  1. 夜を終わらせる勇気
  2. 翌日の自分への配慮

さて、上記の2点をうまく使って早起きした場合の世界はどうだろうか。

  1. 誰にも邪魔されない時間
  2. 仕事で疲れたりしていないから、ストレスのない時間
  3. 穏やかな一日のはじまり

が待っている。
特に2は結構すごい。仕事で疲れた夜の時間は疲弊して、Youtube見るとか受け身の趣味とかしか僕はできなかったが、朝はニコニコしてなんでもできちゃう。
ぐっすり寝たからちゃんとエネルギッシュ。
Youtube見てもいいし、なにしたっていい、でも夜と違って選択肢は広い気がする。
僕の感覚としては、仕事終わりの精神も肉体も濁った状態で過ごす数時間が、清い精神と肉体で過ごす数時間に変わったような感覚がある。

いろいろ書いたけど、「早起きは最高、みんなやるべき」ってのは全くなくて、問題の捉え方を 早起き→早く寝る に変えればワンチャンあるかもよってぐらい。
夜にしかできない趣味もあるかもしれないし、僕は夜中までお酒飲み歩くのが大好きだから朝早く起きない日もたくさんある。

本当に余計なお世話な文章書いてしまった気がする、こんなはずじゃなかったんだ...

嵐のあとにいつもこんな平穏が訪れるのなら、風よ、死者が目を覚ますほど激しく吹き荒れろ。
           「オセロー」シェイクスピア

fkubota

スマホ依存vsワイ の 10年戦争

      【スマホという地獄】
僕はスマホが嫌いだ。僕の大切な時間を奪うから。  
僕はスマホが嫌いだ。いつだって僕を呼ぶから。
僕はスマホが嫌いだ。僕を堕落させるから。  
僕はスマホが嫌いだ。嫌いなのに離れられないから。
スマホからは逃げられない。あらゆる物事がスマホ前提で動いているから。
                   
                      fkubota

「待ち合わせ場所に早くついてしまった。気になってたあれについて調べておくか。 おもむろにブラウザを開いたら別タブの無料マンガサイトが気になった。そっちをまず読むか。」

「〜頑張ったぞ...気分転換に少しだけyoutube見よう。(気づいたら2時間経過)また下らない時間を過ごしてしまった、、、」

「休日だけど早く起きれた。予定まで時間もあるし、少しだけスマホを触るか。(気づいたら2時間経過)今すぐ準備しないと間に合わない、、、急がなきゃ。」

こうやって僕の大切な時間が少しずつ大胆にそして残酷に奪われてます。
久々に書きます。fkubota です。
スマホが嫌いなのに依存している人です..........🤪。
今回は、スマホ依存からの脱却を頑張った話とそのノウハウを公開します。
血と涙の結晶です。(さっさとノウハウが見たい人は後半の スマホ依存から脱却するために に飛んでくだせぇ。)

この記事はカンムのアドカレ13日目になります。
12日目はいつもニコニコcathyさんらしい記事でめちゃ好きです。(ワイが登場するのも高得点)

note.com

スマホが嫌い

スマホがとにかく嫌いです。
スマホはどんどん頭良くなるけど反比例して僕がどんどんアホになっていくのをここ10年で感じ続ける日々です。
誤解のないようにはじめに言っておくと、スマホはめちゃ便利です。我々の生活を一変させたことは間違いないです。
正しい使い方をすると人生をより良くするんだと思います。正しく使えばね。。。

依存

彼はいつだって僕を呼びます。
用もないのに呼びます。
「もしかしたら、Xが更新されてるかもよ?」
「もしかしたら、無料の漫画が更新されてるかもよ?」
「もしかしたら、メールが来てるかもよ?」
「もしかしたら、もしかしたら、もしかしたら、、、、、、」

近くにないときにも僕を呼びます。
カバンの中から、となりの部屋から、忘れてきた家の中から。
体と脳は家に忘れてきたスマホをその空のポケットに探し求めます。
スマホを使いたくないからと電源を切ったのに通知がないか気になってスマホに手を伸ばし、そこでスマホの電源が切れていることを思い出します。

恥ずかしいけれど、極度に依存しています。
自分をうまくコントロールできないどうしようもない人間です。

その時間があまりにもくだらないと思っているのに、10年も戦ってきました。
僕はあまりにもスマホやゲームの誘惑に弱い。ほどよく付き合えない。
しっかりした人からすると、怠惰に見えるでしょう。
でも、誘惑に対してどれだけ抵抗できるかは人に依るらしいです。
だから優しくしてあげてね。
この記事によって同じように悩んでいる人の助けになればいいなと思います。

二種類のダラダラ

スマホを長時間触ること、それ自体は問題ないと思います。
好きであれば堂々と何時間でも触っていいと思います。
僕は、触りたくて触っているというより触らされている感覚が強いです。
実際、長時間触ったときには、楽しかったという感覚より、またやってしまったと自己嫌悪で苦しくなります。

僕はダラダラは二種類に分けられると思っています。
- 意識的に行うダラダラ
- 気づいたらそうしていたダラダラ

意識的に行うダラダラ
好きなyoutuberの動画をいっきに見るとか、映画を見るとか、漫画を全巻読むとか。
そうすると決めて行うものです。

気づいたらそうしていたダラダラ
見たい動画を見たときに関連動画にあるそこまで興味のないショート動画を見始める。次になにがくるかわからないけどとにかく指をスクロールさせて次々に見ていく。大して興味もないのに。
◯曜日だから無料マンガの◯◯が更新されているから見る。見終わった後、表示されている無料漫画を片っ端から見る。その後流れるように別の無料漫画サイトで同じことをする。大して興味もないのに。

そういう、スマホに操られるように行われるダラダラが問題だと思っていて限りなくゼロにしたいと思っています。
あまりにも下らない時間で、休日の午後が食い散らかされたことが何度もあります。

前者だけであれば、うまく付き合ってるんだと思います。
僕は圧倒的に消費させられる、後者が多い立場です。

意図的に得ようとするメリット << 触らされることによるデメリット

という感じなので僕はスマホと上手に付き合えているとは到底言えません。

歴史

高校生の時にスマホを手にしてからうまく付き合おうと頑張ってきました。
最初は依存も弱く、簡単な手で戦えていました。

経験ある人もいるんじゃなでしょうか?
youtubeを見すぎているから、youtubeアプリを消すとか。
スクリーンタイムなどを使って15分でyoutubeを見れなくするとか。

それで適度に依存から逃れられていたら、すばらしいです。
僕のようなどうしようもない人間は、それらをあらゆる手で突破していつもと変わらず使い続けます。  

Youtubeプレミアムを解約して、広告を出すことによって見る回数を減らそうとしても、堂々と広告を見ます。
Youtubeアプリを削除したら、ブラウザから見ます。
スクリーンタイムはすぐに解除します。

なんという執着心、もっと別なところで発揮してほしいものです。
まるでセルフいたちごっこです。自分で壁を用意してそれを悠々と乗り越えます。

こういうPDCAを10年間で100回近く回したと思います。
いっときうまくいっていてもまた駄目になるを延々と繰り返します。

結論から言うと、やっと、、、やっと、、、光が見えた気がします。
スマホと勉強時間を記録していますが、スマホ時間が1日1時間いないの日も増えてきました。

2024年4月から2024年12月までの250日ぐらいの記録

つらつらと戦いの歴史を書いてもいいのですが、誰も興味ないと思うので、さっそく脱却方法を紹介していきます。

スマホ依存から脱却するために

脱却と言っても人によって適切な方法は違うでしょう。あくまで一例として見てください。
専門家でもありませんから、経験によるもので医学的な根拠などはなにもありません。

考え方

まずは、考え方を変えましょう。
スマホ依存いやだなぁ〜、とか甘ったれた考えでは駄目です。
スマホに触り続けることは狂った行いだと考えましょう。
という意識の切り替えをちゃんとした書物によって行います。
有名なこの本ですね。(アフィリンクじゃないよ)

Amazon.co.jp: スマホ脳(新潮新書) eBook : アンデシュ・ハンセン, 久山葉子: 本

他にもあるんですが、まあこれで間違いないでしょう。
未だに定期的に読み返して、たるまないようにしています。
キーワードはドーパミンです。

現状を知る

次に現状を知ることです。
おそらく誰しもが想像の1.5倍や2倍の時間は触っているんじゃないかと思います。

スマホのホーム画面にその日のスマホ時間を表示するようにしましょう。
ウィジェットってやつです。
- iphoneならスクリーンタイム
- androidならDigital Wellbeing という最初から入っている機能で可能です。
iphoneならこんな感じ

アプリやwebサイトの対策

依存しがちな、Twitter(新X)や漫画アプリ、youtubeなど への対策を考えます。
大事なことは2点です
- 意思に頼らないこと
- 使えるけど面倒くさいを作ること

前者は、スマホを箱に入れてロックするとか別の部屋に置くとかそういう対策です。
これだけでスマホ依存を直せるならいいのですが、まあ、そのうちやらなくなります。

後者がめっちゃ大事です。経験上、完全に遮断する(アプリ消すとか)ような作戦は必ず破綻します。
またダウンロードしちゃうとか、違う手段(ブラウザや他のpcなど)で代替するなどです。
完全に遮断すると、自分にとってとても魅力的なものが近くにあるのに触れないとうストレスになります。
疲れたりして意思の力が弱くなっているタイミングで欲を抑えていたダムが決壊し、今までの我慢を取り戻すように触り始めます。
そして、まただめだったと自分を攻めます。   その対象が魅力的だからだめなのです、魅力をより減らしていきましょう。
そのアプリを触れるけど面倒くさい、少しストレスを感じる状態を作り出します。

僕がTwitterアプリを触るとき、以下のことが行われます。

  1. Twitterアプリをタップ
  2. OneSecというアプリが立ち上がり、10秒待つ(OneSecはTwitterを開くたびに強制的に発生する)
  3. やっと触れるが、4分後にBlockinというアプリが立ち上がり、解除の手続きをする。
  4. Twitterに戻るとまたOneSecというアプリが立ち上がり10秒待つ。

↓は 上記3, 4のBlockinとone secの動作例です

この他にも、連続稼働で10分、15分周期などで強制的にアプリを触れなくするアプリが複数あり、それが立ち上がるたびにわざわざ解除しにいきます。
そしてTwitterに戻るたびにOneSecが立ち上がるので発狂するのです。
依存がひどい時期だとそれでも触っていました。
今はそういう症状はなく、Twitterとほどよい距離で関われています。
Twitterの魅力を削ることで、依存しないようにしています。

このようにいくつかのアプリを組み合わせることで達成します。
それぞれにあったやり方と強度で行うといいでしょう。

使えるアプリやその他工夫を紹介していきます。

アプリ立ち上がるタイミング

立ち上がるタイミングに邪魔をするものを紹介します。
全て、androidiphoneで動作します。

  • One Sec
    • 超優秀です。めっちゃイライラします。
    • 無料だと対応するアプリ数に制限があるので、有料をおすすめします。
  • Screen Zenn
    • これも立ち上がり時期に動作します。
    • n分稼働で再度立ち上がるという機能もGoodです。

連続稼働で立ち上がるアプリ

  • 共通
    • Blockin
      • これも超優秀です。One Secとのコンビネーションはよりあなたを発狂へと導くでしょう。
  • iphone
    • refocus
      • n分動作したらブロックするというもの
    • Opal
      • n分動作したらブロックするというもの
  • android
    • UBhind
      • 超優秀です。n分使ったら、m分使えないという設定ができます。
    • 最近androidになったのでその他は探し中

狂った作戦

こっからは普通の人は立ち入る必要はないです。
上記で不十分な人は見てください。

ブラウザアプリを使わない

依存するものを減らしていっても無限の可能性のあるインターネットにはまだまだ危険が潜んでいます。
僕は、依存対策アプリであらゆるブラウザを使うことを禁止しています。
調べたいときはどうするかって?

  1. google mapを立ち上げる
  2. 飛行機を使う必要があるところを検索する(沖縄に住んでいる僕は、東京タワー)
  3. 移動手段に飛行機が出るのでそれを選ぶ
  4. googleフライトというボタンが現れるのでそれをタップ
  5. google map内臓の低機能ブラウザが立ち上がる

という感じです。
タブという概念もないし、google mapを閉じればブラウザを使うにはまた上記の手順を踏まなければなりません。
ここまでしてググりたいものってほぼないです。
諦めて深呼吸したり、親しい人に久々に連絡したりしましょう。

ガラケーにする

先日ガラケー(正確にはガラホですが)をかいました。
android OSが入ってるのでできないことはありませんが、文字を打つという動作が致命的にイライラするのでめっちゃいい感じです。
このブログがおすすめです。

note.com

終わり

僕は真の人生を取り戻す。
ゼッタイマケナイ。

より信頼できるクエリを書くために、SQLでもテストを書く

はじめに

こんにちは、久しぶりに技術系の記事を書きます、株式会社カンムで機械学習エンジニアをしている fkubota です。
今日はSQLについてです。
弊社に入社してから毎日のようにSQLのクエリを書いてきました。
クエリを書き始めてからもう3年が経とうとしています。
日々クエリを書きながら少しずつ自分のスタイルが出来上がってきているのを日々実感しています。
僕は

  • 正確で
  • 読みやすく
  • 再利用しやすいクエリを
  • 高速に

生み出すための工夫を重ねてきました。
結果的にテスト駆動開発ぽいスタイルが生まれたので今日は紹介してみようと思います。
似たような記事がないので少しドキドキですが温かい気持ちで読んでもらえると嬉しいです。

対象読者

対象読者は、分析のためにクエリを書いている人とします。
プロダクトに乗せるクエリというより、ビジネス的になにか示唆を得たいときにクエリを書く人を想定します。

痛み

クエリを日々書いていると書きたいものが書けているか不安になることはないでしょうか?
僕はそういう気持ちになることは頻繁で、とくに慣れていないテーブルや新しいパターンの集計を行うときなんかは、クエリの隙間に select hoge from foo などと書いて一部実行して目で確認するということをよく行います。
「nullはないよな?」「xxxに対してユニークだよな?」「xxxはマイナスにならないはず...」 などなど心配事は多岐に及び、さらに複雑になるほどその数は増えていきます。
そうやって一つ一つを確認していきながら丁寧に書いたクエリは、時間が立つと行数も増え、何を確認して何を確認していないかがあやふやになり、不鮮明な不安が積もるのは必須です。
コメントで確認したことをメモしていても、クエリ前半で確認が取れていたことが、クエリの後半でも担保されているかは別問題ということもよくある状況でしょう。(予期しない動作のjoinにより前半部分では存在しなかったnullがクエリの途中から追加されていた。など)

再利用するときにも苦しくなるときがあります。
このクエリはどこまで信用できるんだっけ?といった不安がつきまといます。
クエリを書いている時間は、ワーキングメモリに可視化されないクエリの事情が脳内に展開されていますが、1ヶ月後に見たときにはどこまで信用して良いものかわからないのが常です。
クエリというものは常にそうした不安と付き合いながら分析していくものだとは思いますが、こういう痛みを弱める工夫はあってもいいでしょう。

ということで、僕の場合はこうしているよというのを紹介してみます。
少なくとも僕はこの方法を取ることによって、

  • より高速に
  • より正確性の有る

クエリを書くことができています。
加えて後で読んだクエリの品質の把握も容易にできていて上記の痛みはかなり解消されたと実感しています。
それでは少しずつ説明していきます。

クエリにテストを書く

上述した痛みを解決するために行っているクエリに書くテストを例を交えながら紹介していきたいと思います。
今回はBigQueryで書いていますが、その他でも同様なことはできます。(把握している限りですが)

題材としてECサイトのテーブルを想定します。
テーブルは、usersとshoppingの二種類。
前者はユーザそれぞれの情報で、shoppingはそのユーザの購買行動を記録しています。

user_id name age registered_date
1 aaa 25 2023-01-01
2 bbb 30 2023-01-01
3 ccc 20 2023-03-01
4 ddd 43 2023-07-01
5 eee 18 2023-12-01
shopping_id user_id amount shopping_date
1 1 1000 2023-01-01
2 3 2000 2023-03-04
3 3 1500 2023-04-10
4 1 1000 2023-05-01
5 4 5000 2023-07-02
6 4 3000 2023-10-15

だれでも手元でイジイジできるように with句でCTE(Common Table Expression)化しておきました。

with users as (
SELECT * FROM UNNEST([STRUCT<user_id INT64, name STRING, age INT64, registered_date date>
    (1, 'aaa', 25, date('2023-01-01'))
    , (2, 'bbb', 30, date('2023-01-01'))
    , (3, 'ccc', 20, date('2023-03-01'))
    , (4, 'ddd', 43, date('2023-07-01'))
    , (5, 'eee', 18, date('2023-12-01'))
    ])
)


, shopping as (
SELECT * FROM UNNEST([STRUCT<shopping_id INT64, user_id INT64, amount INT64, shopping_date date>
    (1, 1, 1000, date('2023-01-01'))
    , (2, 3, 2000, date('2023-03-04'))
    , (3, 3, 1500, date('2023-04-10'))
    , (4, 1, 1000, date('2023-05-01'))
    , (5, 4, 5000, date('2023-07-02'))
    , (6, 4, 3000, date('2023-10-15'))
    ])
)

20歳以上のユーザの合計購入金額を出してみます。

with users as (
SELECT * FROM UNNEST([STRUCT<user_id INT64, name STRING, age INT64, registered_date date>
    (1, 'aaa', 25, date('2023-01-01'))
    , (2, 'bbb', 30, date('2023-01-01'))
    , (3, 'ccc', 20, date('2023-03-01'))
    , (4, 'ddd', 43, date('2023-07-01'))
    , (5, 'eee', 18, date('2023-12-01'))
    ])
)


, shopping as (
SELECT * FROM UNNEST([STRUCT<shopping_id INT64, user_id INT64, amount INT64, shopping_date date>
    (1, 1, 1000, date('2023-01-01'))
    , (2, 3, 2000, date('2023-03-04'))
    , (3, 3, 1500, date('2023-04-10'))
    , (4, 1, 1000, date('2023-05-01'))
    , (5, 4, 5000, date('2023-07-02'))
    , (6, 4, 3000, date('2023-10-15'))
    ])
)

-- ここから分析クエリ

, users_over20 as (
select *
from users
where age>=20 
)

, tbl_agg as (
select
    u.user_id
    , max(u.age) as age
    , sum(s.amount) as total_amount
from users_over20 u
left join shopping s on u.user_id=s.user_id
group by u.user_id 
)

select *
from tbl_agg

結果

というまぁ簡単なクエリですが、これが大規模で全数を目視できなかったり初めて使うので元のテーブルへの理解が十分でないと想定して、確認作業というものをやっていこうと思います。
今回は、users.ageに nullはないか?tbl_agg.total_amountにnullはないか? を確認していこうと思います。
users.ageに関しては、ユーザの自由記入欄でnullになっているかも?とかそういう目線での疑いです。
すでにわかっていることですが、total_amountにはnullがあります。shoppingテーブルに存在しない→購買行動を行っていない、のでこれは0とするのが適切な処理でしょう。
こうあるべき を確認してクエリの品質を担保していきます。

users.age に nullがないと確認するのはどうやるべきでしょうか?
通常であれば、CTEとCTEの間に select ... from ... と書いて部分実行するか、別クエリで確認するなどでしょう。
total_amountの確認も同様かと思います。

テストを行うために tbl_agg の CTE と 最後の select の間に test という名前のCTEを追加する形で書いていきたいと思います。
結論から言うと以下のようになります。

with users as (
SELECT * FROM UNNEST([STRUCT<user_id INT64, name STRING, age INT64, registered_date date>
    (1, 'aaa', 25, date('2023-01-01'))
    , (2, 'bbb', 30, date('2023-01-01'))
    , (3, 'ccc', 20, date('2023-03-01'))
    , (4, 'ddd', 43, date('2023-07-01'))
    , (5, 'eee', 18, date('2023-12-01'))
    ])
)


, shopping as (
SELECT * FROM UNNEST([STRUCT<shopping_id INT64, user_id INT64, amount INT64, shopping_date date>
    (1, 1, 1000, date('2023-01-01'))
    , (2, 3, 2000, date('2023-03-04'))
    , (3, 3, 1500, date('2023-04-10'))
    , (4, 1, 1000, date('2023-05-01'))
    , (5, 4, 5000, date('2023-07-02'))
    , (5, 4, 3000, date('2023-10-15'))
    ])
)



, users_over20 as (
select *
from users
where age>=20 
)


, tbl_agg as (
select
    u.user_id
    , max(u.age) as age
    , sum(s.amount) as total_amount
from users_over20 u
left join shopping s on u.user_id=s.user_id
group by u.user_id 
)


, test as (
select
    -- ageにnullがない
    case
        when exists(
            select 1
            from users
            where age is null
            ) then error('ageにnullが存在します')
        else '問題なし'
        end as test1
    
    
    -- total_amountにnullがない  
    , case
        when exists(
            select 1
            from tbl_agg as t
            where t.total_amount is null
            ) then error('total_amountにnullが存在します')
        else '問題なし'
        end as test2
)



select *
from tbl_agg
cross join test

結果は以下のようになりました。

total_amountにnullが存在するために、用意していたエラー文が出ました。

sum(s.amount) as total_amountsum(case when s.amount is null then 0 else s.amount end) as total_amount とすると以下のように出力されます。

解説の前にポイントを軽く解説しておくと、

  • test というCTE内で、別々のテーブルusersとtbl_aggの中身をチェックしています。クエリがどんなに大きくなろうと、このCTE testを起点にどこのテーブルにでも自由度高く確認ができるということです。
  • このテストは、クエリを実行するたびに実行されるので、この時点では問題なかったが後の追加作業でバグが埋め込まれたとしても検知できます。
  • さらに後日このクエリを読んだときに、どの程度のことまでが保証されているのか一目でわかります。
  • 実行速度の問題もCTE のtestはselect一つ、つまり一行の実行で後にcross joinされます。そのため大規模な計算が行われることはありません。気になる場合は、cross join test をコメントアウトするだけでテスト実行がオンオフできます。

という感じのメリットがあります。

簡単な解説

select
    -- ageにnullがない
    case
        when exists(
            select 1
            from users
            where age is null
            ) then error('ageにnullが存在します')
        else '問題なし'
        end as test1

さてこれはどういう挙動をしているのでしょうか?
分析を普段からやっている人を対象とするので少々くどいと思いますがとりあえず解説していきます。

まず case 文があります。trueなら error(xxx) が発生してエラー文が出る。falseであれば、問題なしが出力されるようになっています。
(postgresqlには、errorがありません。めっちゃキモいですが、cast(date(cast('ここにエラーメッセージ' as text))) で代用できます。)
true/falseを決めるのは exists() 。これはexists内のサブクエリに結果が帰ってこればtrueでそうでなければelseを返します。
今回は、users.ageにnullが存在しないので、サブクエリ

select 1
from users
where age is null

は何も返ってきません。結果として exists は falseを返すためエラーにならないという挙動です。

逆に test2のほうは、existsがtrueを返していたためにエラーが出たという仕組みでした。

解説完了です。

こんな感じであらゆるテーブルに自由度高く確認が行える点が強力だと個人的には思っております。
データ分析経験者であれば遭遇したことのある以下のようなケースにも対応できます。

  • ユーザをいくつかのセグメントに分けたセグメントのユニークユーザ数の和が、もとの和と一致しない。(セグメントの分け方がMECEでない)
  • ある単位でユニークだと思っていたが実は違っていて、left join 時に数倍に膨れ上がり想定の数倍の数値が集計された。 

などなど枚挙にいとまがないと思います。
こういう複雑なケースにも自由度高く対応できて、実際に何度も僕を救ってくれました。

クエリを書く流れ

クエリを書きはじめるときは、だいたい以下のようなテンプレートになります。

with const as (
...
)

, tbl1 as (
...
)

, tbl2 as (
...
)

, tbl_agg as (
...
)


, test as (
...
)

select *
from tbl_agg
cross join test

constに変数のようなもの、日付とかを書いて、tbl1, tbl2などで集計前のCTEを作成して、tbl_aggで集計、そしてtest内でテストを実行。
これが大まかな流れです。
testに書き込むタイミングはわりと好きなタイミングでやっています。
クエリって書いていると脳汁がドバドバ出て勢いで書けるときってありますよね?あのときのペースを邪魔したくないので、testにコメントだけを書いてあとからチェックするなど好きなタイミングで書くなどをよくします。

, test as (
select
    -- test1
    , case
        when ...
    
    -- tableA.col1にnullは存在しない
    
    -- tableB.hoge_at は 2022年以降のデータのみ存在する

    -- tableAのuuとtableDのuuが一致する
)

と開発過程はこんな感じで進むことは多いです。
確認していないことが可視化されるだけでも大きいです。

基礎編終わり

ここまでで何がしたいのかはわかってもらえたかと思います。
自分で気を張って監視をしなくても、常にクエリがそのクオリティを担保しようと働いてくれます。
クエリが複雑化し大きくなったとしても抑えるべきところは抑えている状態でクエリを書けるので心理的面でも大きな意味が有ると思います。
安心して、より難しいクエリを書くことに集中できます。

僕は結果的に

  • より高速に
  • より正確性の有る

クエリが書けるようになりました。

最初は慣れないと思いますが、慣れればこっちも悪くないと実感してもらえると思います。
実際に試してもらえると嬉しいです。
そしてより良い方法があればお互いに共有していければなと願っております。

とまあ一旦ここで締めるのですが、以降で少し発展的な例を起点に、あらゆるテストを行うことができることを主張した後、ある低程度体系化してみようと思います。 こういうテストはこういう書き方でできるよ的なことを書いてみます。

発展編

もう一つ違う例を書こうと思います。
ユーザ数は意図した数になっているか?を見ます。

具体的には、 users_over20 のユーザ数と、tbl_agg のユーザ数が一致するか?を確認します。
集計の手順として、users_over20で集計対象とする集団を作って、tbl_aggでユーザそれぞれにtotal_amountの情報を付与という手順を取っています。

users_over20 から最終的な出力まで、ユーザは増えも減りもしない前提ですが、この間にあらゆるjoinを行った結果user_idに対してユニークになっていなかったり、減っていたり増えていたりする事故は往々にしてあります。
今回の簡単なクエリであれば心配ありませんが、大きめのクエリを書いている気持ちになってこのタイプのテストを行います。

以前の2つのテストと大きく違う点は、2つのテーブルの集約値を比較すること にあります。
テストはこうなります。

, test as (
select
    -- test1
    -- test2

    -- users_over20 とユーザ数が一致しません
    , case
        when (select count(user_id) from users_over20) = (select count(distinct user_id) from tbl_agg) then '問題なし'
        else error('users_over20 とユーザ数が一致しません')
        end as test3
)

このように2つのテーブルをまたがって比較することも可能です。
自由度の高さを示す例の一つでしょう。

テストは大きく4種類に分かれると思っています。
軸が2つあり

  • 1行単位の確認なのか?それともテーブルの集約値なのか?の軸
  • 2つのテーブル同士の比較なのか?の軸

です。2つの軸で4象限あり、表にすると以下のような形になります。

1つのテーブル 2つのテーブル
1行単位 A B
集約値 C D

4つの領域にA,B,C,Dと名前を振って例を示していこうと思います。

A: 1行単位 x 1つのテーブル

これは、最初に示した2つの例のことですね。
今回は、監視したい対象が負になっていないかを見ることとします。

, test as (
select
    -- colに負の値が存在しない
    case
        when exists(
            select 1
            from table1
            where col < 0
            ) then error('colに負の値が存在します')
        else '問題なし'
        end as testA
)

B: 1行単位 x 2つのテーブル

2つのテーブルの各行間を比較します。
これは経験上、そこまで多くないパターンです。
table1のcol1とcol2の和がtable2のcol1と一致するという例を書きます。

, test as (
select
    -- table1のcol1とcol2の和がtable2のcol1と一致する
    case
        when exists(
            select 1
            from table1 t1
            left join table2 t2 on t1.user_id=t2.user_id
            where t1.col1+t1.col2 = t2.col1
            ) then error('table1のcol1とcol2の和がtable2のcol1と一致しません')
        else '問題なし'
        end as testB
)

C: 集約値 x 1つのテーブル

これも頻出ですね。
例えば、すでにどこかで出た実績値と一致しているか見るとか、合計値が0になっているはずとかそういうときに使います。

, test as (
select
    -- col1の合計値が 1234 と一致する
    case
        when (select sum(col1) from table1) = 1234 then '問題なし'
        else error('col1の合計値が 1234 と一致しません')
        end as testC
)

D: 集約値 x 2つのテーブル

これは例で出したパターンですね。
セグメント切った前後がMECEか?などのチェックで活躍します。
例えば、ある月の購入額が3000円以上/未満のユーザの数 を数えるときに、あるユーザが3000円未満と3000円以上の購入をしたがために両方のセグメントに属してしまうなどあるあるではないでしょうか?
こういう考慮漏れが起こったときにテストが活躍して自分の問題定義の甘さが露呈します。
この場合は、 ある月の最高購買額が3000円以上/未満のユーザの数 が妥当でしょう。こうやって問がシャープになっていくことはよくあることだと思います。

, test as (
select
    -- table1のユニークなユーザ数とtable2の2つのセグメントのユニークなユーザ数が一致する
    case
        when (select count(distinct user_id) from table1) = (select count(distinct case when seg='A' then user_id else null end)+count(distinct case when seg='B' then user_id else null end) from table2) then '問題なし'
        else error('table1のユニークなユーザ数とtable2の2つのセグメントのユニークなユーザ数が一致しません')
        end as testD
)

やっと終わり

以上です。
これで頻出のケースは網羅できたかなと思います。
このテストを活用する方法は、日進月歩で育ってきました。
これが完成形ではないと思っているので、これからも発展させていくつもりです。
また共有できることがあれば書いちゃいます。

長いのに最後まで読んでいただいありがとうございます。
お礼に沖縄に遊びに来ていいよ券を置いてておきますね。

つ 🎫