ど田舎うまれ、ポケモンGOをつくる_読書メモ_20240414

  • 上島珈琲勉強→ランチから帰った後、ポストに入っていた本書を読み始め、数時間で一気に読んでしまった。
  • 自分が作ったデモがその後プロダクトになって、ってのはやっぱり最高だなと。
  • デモ力上げたい。が、急がば回れで基礎をやろう。
  • キューバで時間を持て余してそうだった人達、インドでの発展途上なインフラ・生活水準で暮らしている人たち、ボリビアでろくに酸素すらない場所で暮らす人たち、今まで見てきた色んなことを思い出した。3食困らず栄養のあるものが食べれて、さらにはいくらか自分で自由に使える時間とネットへのアクセスがあるのに、ダラダラしている場合ではないな、などと。

以下メモ

  • Googleマップドラクエ化や、ポケモン探し化などのエイプリルフール企画をやり、その後ポケモンGOのPdMになった人

  • 10歳ほどしか離れてない人なのに、レンガで作った家に住めず、泥とわらで作った家に引っ越して、米がなくトウモロコシの粥を食べていた話はショッキングだった。(親戚伝いでなんとか日本に。その後も貧しい中苦労して国立の信州大に。)

  • p82. 大学ではアプリの作り方のような実践的なことよりも、プログラムが動く理論や原理を学ことが重要。見たことのない問題に突き当たった時に限界がきてしまう。一見早道に見えるが、基礎をやるべき。料理番組ばかり見て料理できるようになるより、なぜこの素材とこの素材を組み合わせるのか、素材の栄養価はどうなっていて、どんな場面/季節で作るのが適切なのかを学ぶべき。

  • p126 情熱を追いかけろ。これをやれば就職に有利、だとか将来稼げる、だとか、そんなことは気にしていなかった。自分の興味が向くにまかせて動いていた。その時々夢中になっていたことに情熱を燃やしていた。今も好きなことを続けていられるのは、いつも本気で目の前のことに取り組んでいたからだと思う。

  • バイトばかりするな。1200円で20歳の時間を買えるならぜひ買いたい。ということは未来の君も買いたいはずなのだから、未来の自分から借りるつもりで奨学金を借りて、その分の時間を、どんなことでも良いので、好きなこと、情熱を持っていることに使おう。

  • 同僚との立ち話から、その日の夜中に2-3時間でデモを作って、次の日にドラクエGoogle mapのデモ。デモは何よりも人を引きこみ、動かす力がある。

  • 英語の勉強はとにかく話すこと。次に、同じ内容の映画を英語字幕で何度も見ること。知らない単語が出るたびに止める。(なんとなく意味がわかっても。)セリフを覚えるくらい続ける。その映画に出てくる言い回しを自分のものにする。小説を読むときは、わからない単語があってもスキップする。

  • 世の中には本当に今日の食べ物に困っている人が大勢いる。職業選択の自由がある人はほんの一握りだし、新しいことに挑戦できる人はほんのわずか。チャレンジしないことは悪いことではないが、本当にもったいない。日本に住んでいたり、新しいことに挑戦できる環境にいたりすることは、この上なく幸運なこと。恐れず挑戦しよう!

疑問集

# for文は改行しなくてもいいのか?

 何故これが動く?

 



 

 

 

# 確率の問題

nCr / nCr でも確率出せるけど、nPr /nPrでも同様に出してよかったはず?

本当によかったのか整理する

algo-method.com

 

 

# input()の処理はそれだけをまとめて行った方が速い?

algo-method.com

これだとTLE

 

# まだTLEな箇所がある
# 先に、Pごとに、満たす整数x,yのくみが何個あるか数えておく


num_couples_to_make_p = [0 for _ in range(10001)]


for x in range(-100,101):
for y in range(-100,101):
p = x**2 + y**2
if p <= 10000:
num_couples_to_make_p[p] += 1

Q = int(input())

for _ in range(Q):
P = int(input())
print(num_couples_to_make_p[P])

 

 

これが正解

# 入力を受け取る
Q = int(input())
P = [0 for _ in range(Q)]
for i in range(Q):
P[i] = int(input())

pmax = 10**4 # P の最大値
counter = [0 for _ in range(2*pmax+1)] # counter[v] : x^2 + y^2 = v を満たす整数組 (x, y) の個数
# 必要な範囲だけ全探索
for x in range(-100, 101, 1):
for y in range(-100, 101, 1):
v = x * x + y * y
counter[v] += 1

# クエリに対する答え
for i in range(Q):
p = P[i]
print(counter[p])

なるほど?

 

勉強法について調べた

0.勉強が面白くなる瞬間(勉強法ではない)

最高。勉強したくなる。モチベが落ちたら読み直す。

 

 

 

 

1.慶應医学部TOPのお医者さん(書籍化されて今売れてるやつの動画)

最高の勉強法・効率的な覚え方【科学的根拠のある効果的な学習方法について医者が解説】 - YouTube

 

良くやられているが、効果が低い勉強法

- 繰り返し読むこと

- 蛍光ペンによるハイライト

 

効果的な勉強法

1-1.アクティブリコール

- 能動的に思い出す、アウトプットする

- 思い出すことによってこそ記憶に定着する

- 繰り返しアウトプットするのが重要

- 教科書読んだ後、教科書見ないで今読んだことをチラ裏に書きなぐる。声に出して、誰かに教えるふりをしてやると尚良い。ノートとして残すわけではないので、綺麗に書く必要はない。

- 電車の中で昨日学んだことを思い出そうとする、というのも良い

 

1-2.間隔反復

- まとめて一回で勉強するより、何回にも分けて学んだ方が定着する

- トータル学習時間が同じでも、分割した方が定着が強い

 

単調な数字の組み合わせの覚え方

- インパクトのある画像/脳内イメージで覚える

- 1929年の世界恐慌は、ウォール街のビルから肉(29)が落ちてくるイメージを頭に。

- パピローマウイルスに関連する遺伝子の番号は、パピコ加えたイチローが際に耳をかじられサンゴが生えてくる話

-  - コテンラジオでもホモサピエンスの脳はストーリー理解に最適化されている、という話があった。日露戦争

- - 世界最強のバルチック艦隊を破った日本海軍最強。というストーリー。ロシア側から見たら、日本海に来る頃にはすでにボロボロになっていて戦略良くないよね、というストーリー。日本人側だけのストーリーを聞くと、factの認識能力が下がる。ホモサピエンスがfactを認識するには複数のストーリーを理解するしかないのでは。

『戦争に勝つ』とは何か?日露戦争が後世に残したいくつもの物語【COTEN RADIO #276】 - YouTube

- - コテンラジオもスっと入るのは、ストーリーとして語ってくれてるからか。

-- ふろむだ本にも、「一貫したストーリー」による人間の判断誤りの件があった。

 

 

colloquial (口語の、会話的な)という単語を覚える

- 単語の意味もイメージになるべく含める

- 歩いてたら、KIAの自動車に乗ったコロ助に話しかけられるイメージをする

 

暗記に関してはこの本に色々あるとのこと

- ごく平凡な記憶力の私が1年で全米記憶力チャンピオンになれた理由

https://www.amazon.co.jp/dp/4767811805/?coliid=I7FT1TXBDNLZI

 

 

2. 河野玄斗

www.youtube.com

- 全体像を常に意識する

- - 教科書を片っ端から入れるのではなく、大事なストーリーラインが何なのか意識しながらやる

- - RPGの探索と同じ。まずはマップを手に入れて全体を把握する。枝葉末節の知識はマップを手に入れてから、必要な時に探索する

 

- 目標を意識する

- - 辞書をaから全て覚えるのではなく、大学入試が目標なら、それに必要なものを選んで覚える

-- 目標を知る→具体的なゴールを設定する→ゴール達成に必要なものをリストアップする→スケジュールに落とし込んでいく→実践する(難しい)→進み具合を定期的に確認

 

-自分のレベルかんにあったものをやることでできるループを回して、楽しめる

- タイムアタックでゲーム化 何分で終わらす。を決めてから取り組む。

 

- セルフレクチャーする。自分で自分に説明する。

- 教科書というまとまったものがあるので、ノートにまとめ直すということはしない。

- 目次を見ながら、こういう項目があったな、と思い出す。

- 復習にかかる時間を短縮するために、下記のループをする

- - 教科書読む→もう一度読んでわかってないとこマーク→マークついたとこだけ読んで、その中でも甘いとこ別の色でマーク→繰り返し

 

- スキマ時間の活用

- - 朝3単語見て、通学中や歯磨き中、お風呂入ってる時にぼーっと思い出す。1日3単語でも1年やれば高校英単語の2000の半分終わってる。

 

-集中力の継続方法

- -始めた瞬間と終わる直前が一番集中力が高い。25分区切りなどで細かく分けてやる。

- - 勉強に戻れる5分休憩にする。音楽を爆音で1曲聞いてるとのこと。(スマホ触ったら戻れない)

 

 

センター日本一の同期に前聞いた話

- 勉強として自分が今やっている作業の目的を意識して、より良い方法がないか常に考える。

- 今ノートにまとめてるけど、思考整理のためにまとめるのか、後で見返すためにまとめるのか、それに沿ったもっと良い方法はないのか。

- 復習用に1枚にまとめる。試験範囲全てを一枚に。もっといくと高校化学を1枚に。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

競プロ学びながらの気づきメモ

 

2024/3/31

 

# 二重ループにならないで済む実装がないか考える

円周率の小数点以下に、0~9が各何回出るか数える

0~9に関してループして、それぞれ頭からお尻まで見ると二重ループ

頭からお尻まで見ながら、今見てる数のグループのcntを+1すれば一回の確認ですむ。

問題のリンクは忘れた。

 

# 3個前のアルファベットにするシーザー暗号

単純にord()とchr()使うと、aやbやcが溢れる。aはzに変換。という例外を持たせた関数を3回走らせるようにすれば、例外の記述はaの時だけですむ。(自分で実装した時はordが96以下の時+26する、という対応表見ながらじゃないとわからないマジックナンバー入りの実装になってた。)

 

algo-method.com

 

chr() とord()

ord()の方が文字コードの数字を返してくれる。chr()はその逆

 

 

listのアンパック

mylist=[1,2,3]

print(*mylist)

→1 2 3

printは複数個をカンマ区切りで渡せて、その場合空白スペース区切りで表示する

 

 

print()したときに下記のような変のものが出る時

<__main__.Tortoise object at 0x...>

これは、自作したTortoiseクラスのインスタンスをprintしようとしている

Tortoiseクラスのインスタンスは、print()されたときにどういう挙動すべきか定義されてないからこうなる。

逆にいうと、他のstringとかlistとかもクラスであり、それらはprint()された時の挙動が最初から定義されているから、直感的なprint()による表示ができる。

定義するには__str__ メソッドを使う

    def __str__(self):
        return f"name: {self.name}"

https://algo-method.com/tasks/1278

 

 

# defaultdictが便利。辞書作るときに初期値に何か設定しておけるので、後からいじりやすい。

from collections import defaultdict
# 各有権者が投票した立候補者の名前
votes = ["aruru", "iruru", "ururu", "aruru", "eruru", "oruru", "aruru", "iruru", "aruru", "eruru", "iruru", "ururu", "eruru"]

d = defaultdict(int) # 空の辞書型変数
for vote in votes: # 投票された立候補者に 1 を足す
d[vote] += 1

# 投票結果を出力
for name, value in d.items():
print(f"{name} {value}")

https://algo-method.com/tasks/1294

 

 

 

#順列や組み合わせを出す時はiteretoolsを使う

nPr nCr  

iteretools.permutations(iterable, r)

itertools --- 効率的なループ実行のためのイテレータ生成関数 — Python 3.12.2 ドキュメント

https://algo-method.com/tasks/1315/editorial

 

# str.join(iterable)で iterableの各要素をstrを間に入れてくっつけられる

 

 

# 空白文字で複数入力があるときはsplitだけど、改行されて2個入力されるときは普通に2つinput()作る

S = input()
T = input()

if S == T:
print("Yes")
else:
print("No")
 
#こうではない
S, T = map(int, input().split())
 

https://algo-method.com/tasks/31

 

 

# popは要素へのアクセスと削除を同時に行う

 

 

# 可変長配列であるlistから特定の順番の要素を削除したり、追加したりするのは時間がかかる

- 先頭要素を消したら、それより後ろの要素全てを前に詰めてindex振り直すみたいな作業が必要

- 先頭要素を追加しても一緒。

- 逆に末尾に削除したり追加したりする分には、既存のものに影響ないからO(1)

- なので先頭に足したりしたい時は、反転してから足すと良い

- ちなみに反転はO(n)。後ろの要素から一個ずつ新しいリストに足したく感じかな?

https://algo-method.com/tasks/832

 

 

2024/4/13

配列の要素削除/挿入がO(N)なのは何故か

・配列はメモリの中で連続したアドレスにデータを配置

 →ランダムアクセスがO(1)

  →mylist[i]のアドレスを下記の式でパッと1回で計算できるので、そのメモリにたどり着ける

mylist[i]のアドレス = 先頭のアドレス + 1データのサイズ*i 

 

逆に、連続したアドレスにデータ入れとかないといけないので、途中で一個抜いたりすると、それより後のやつを全部前にずらさないといけなくてO(N)

→liked listなら、O(1)で済む

 

tech.connehito.com

 

 

 

* 演算子で、ミュータブルな型を並べたリストを作成する場合、参照渡しによるコピーに気をつける必要がある。

ミュータブルな型(リストとか)に対して、*を使うと、参照渡しによるコピーになる

# 「0 を 3 回繰り返したリスト」を 2 回繰り返したリスト
2# 各要素の内容は実は同じもの
3a = [[0] * 3] * 2
4print(a) # 出力: "[[0, 0, 0], [0, 0, 0]]"
5
6a[0][0] = 1 # 0 番目のリストの 0 番目の要素を 1 に変更する
7print(a) # 出力: "[[1, 0, 0], [1, 0, 0]]"

リスト内包表記によるコピーで防ごう。

# 「0 を 3 回繰り返したリスト」を 2 回生成して追加したリスト
2# 各要素の内容は独立している
3a = [[0 for j in range(3)] for i in range(2)]
4print(a) # 出力: "[[0, 0, 0], [0, 0, 0]]"
5
6a[0][0] = 1 # 0 番目のリストの 0 番目の要素を 1 に変更する
7print(a) # 出力: "[[1, 0, 0], [0, 0, 0]]"

 

algo-method.com

 

# リストへの*演算子の適用

・リストの中身を繰り返した新たなリストを作成する

 

奈良の大仏とLLMとマトリックス

 

 

TLDR

- これを聞いてくれ。

歴史を面白く学ぶコテンラジオ (COTEN RADIO): 【19-4】大乗仏教が神道国家・日本に上陸!その時歴史が動いた【COTEN RADIO 最澄と空海編4】 on Apple Podcasts

 

 

コテンラジオは全て面白いけど、今回は特に感動ものだったので、備忘録として記録

 

 

前提

- 唯識

 仏教の中の考え方の1つ。結局世の中の全てのものはあなたの認識でしかなくて、バーチャルなんじゃね?そうではないことを証明する方法はないじゃん。という考え。(実はずっとVRヘッドセットつけててSAOの中に今もいるのかもしれんが自分はSAOの外の世界を認識できない、的な。SFによくある世界観)。だから仏教はどうやって自分の認識を変えるかを考えている。自分の認識は頑張れば変えられるけど、無意識はどうしたらいいかわからんから身体的苦痛を与える修行でアプローチしたりもする。「認識を変えるにはどうすべきか」を真剣に考えてる。

 

- 当時の仏教は宗教というより、中国や朝鮮といった先進国における最先端の学問体系であり、お坊さんはMITのエリートエンジニア

 人はなぜ苦しいのか、的な哲学が出発だが、律令みたいな法律制度もあるし、お寺の建て方とかの工学技術とかも。(日本にはない技術がたくさん)

 

 

聖徳太子は仏教を国策として導入したが、これは社会福祉費と防衛費への投資。

日本で僧侶を国家公務員として、「呪術」のスペシャリストとして育てたかった。

下記2つへの投資であるので、社会福祉費と防衛費への投資になる。

 -病気を跳ね返す呪力

- 怨霊を跳ね返す呪力

(病気やら戦争やら災害やら、悪いことも全部結局認知の問題である、とトップジャーナルである経典に書いてある。じゃあそこにアプローチする最先端技術(呪術)をもったエンジニアとして、呪術のスペシャリストが増やす投資をしたいな、という気持ち。)

 

病気辛い。災害辛い。

→実はこれらは自分の全て認識の問題だから、認識を変えれば大丈夫。それにはハードウェアとして大仏が必要だよ、と世界のエリート(坊さん達)が言ってる。大仏立てよ!大衆は理解しきってないけど、頭いい政治家達がしっかり考えて沢山お金かけて作ったし大丈夫っしょ、と安心できる。 

 

ICBM飛んできたらやばい。

→撃ち落とせば大丈夫。それにはハードウェアとしてミサイルが必要だよ。と世界のエリート(防衛省とかの偉い人?)が言っている。ミライル配備しよ!大衆は理解しきってないけど、頭いい政治家達がしっかり考えて沢山お金かけて作ったし大丈夫っしょ、と安心できる。

 

 

--

上記のように考えるとお坊さんの社会的地位が高かったり、大量の金かけて大仏立てたりしてたのも納得。なぜなら意識さえ変更できちゃえば何でも思いのまま何だから。

例えるならSAOの世界でカヤバアキヒコと同列の権限持ってソースコード書き換えるための方法をSAOの世界の中で日々研究してる人たち、的な感じか。

2024/3時点だとLLMがすごくそれに近い。病気の画像診断から、自動運転とそれによる無人攻撃まで、何でもできる。LLMエンジニア年収5000万とか1億とかで超巨大モデル作ってるけど、LLMエンジニアが坊さんで、大仏がLLMなのかも知れない。

 

 

----

次の回のコテンラジオ

映画「マトリックス」の中のネオは、この世界が全てコードであることを真に理解した者。真に理解すると空を飛んだり救世主としての動きが何でもできる。

密教が言っているのもこれ

ミサイル防衛も何でもできる。

密教は、単語に概念を埋め込むことで、悟りスピードを上げようとしてる。I'm lovinit.という単語でビックマックや店舗の中のイメージが一斉に湧くように。1つの単語や1つの呪具にイメージを詰め込んでスピードアップを測っている。圧縮ファイル。圧縮ファイルは誰でも解凍できたら困るので、解凍する方法を体得できる物を一部に制限するための、秘密の仏教であるとして、密教

 

ブッダは全正解全宇宙。無限の過去から無限の未来まで、全てにブッダがいて、全てがネットワークで繋がっている。華厳経

というか全てが同一で全てがブッダ。全てがコードでありコードは全て0と1で書かれている。

この世界にいる大日如来を供養すれば、あらゆる時空間のブッダにアクセスできるので悟りのスピードが爆上げする(それまでは輪廻転生しながらちょっとずつ近づくしかなかった。)

 

印を結ぶのはソフトウェアのインストール

印の一つ一つに意味が埋め込まれている。

 

祓い清める:OSのクリーンインストール

結界を張る:ファイヤーウォール

阿修羅をおく:ウイルスバスター

プログラムインストール

インストールしたソフトで病気治す

アンインストールの儀式をする

三密加持

 

 

 

 

 

 

 

利き目とテニスのフォーム

 

人間には右利き左利きと言った「利き手」があるように、「利き目」もある。

 

この「利き目」によって、テニスの得意なヒッティングフォームが変わるとのこと。

(効き目の確かめ方は動画参照。)

 

私は「右利き」で効き目も右なので、バックはクローズドスタンス。フォアはオープンスタンスの方が安定するとのこと。

 

要は、ボールが遠くにある間は顔が横向いていると近い方の目でみるが、体に近づいてちょうど打点くらいになると右目の方が見やすいので、切り替えが発生して、一瞬ボールが視界の外になってしまう。

 

今までどうしてもフォアのクローズスタンスが安定しなかったのだが、これが起きていたっぽい。

 

右利き右目の選手として、ズべレフを挙げ、彼は肩を回さず、顔は常に前を向いたままで、オープンやセミオープンで打つことが多いとのこと。(フェデラーとは対照的に。)

打点は体の右側。()

ボールを打つ瞬間には完全に体が開いている状態。

 

サーブの時体を前向きに打った方が良い、バックハンドの方が得意な人が多い、というのも今までの経験と合致する。

 

感動したのでテニスプレイヤーの人は是非一度見てほしい。

 

余談

昔、イチローがバッターは体開いてしまったら負け。如何にギリギリまで体開かないようにするか、と言っていたが、その観点だと私は左バッター向きなのかも。

 

www.youtube.com

Docker compose

Docker compose

複数コンテナのアプリケーションを定義したり、走らせたりするためのツール。

compose.yamlというファイルに設定を書く。
(docker-compose.yamlという名前を昔使ってたので互換性があってまだ使えるが、非推奨)



compose.yamlで繰り返しな記述を避けるTips
YAMLの便利機能がそのまま使えて、繰り返し記述を避けられる

Anchor(fragments?)
&hogeより後に書いたものを、”anchor”として登録し、*hogeリユースできる

services:
first:
image: my-image:latest
environment: &env
- CONFIG_KEY
- EXAMPLE_KEY
- DEMO_VAR
second:
image: another-image:latest
environment: *env



# サービスとコンテナ
コンテナ:実行環境
サービス:特定のタスクの実行のために設計された複数のコンテナの集合