月報 2022/11

Tue 01 Nov 2022

12:49:12

ヤクルトの宅配を管理する web ページ. 何かを変更した直後には upd_success=true がついたURLに飛ばされる. ページはURLを見てこれがついてたら alert(変更が完了しました) を実行する. 今どき alert は無いだろ.

12:56:53

10月の月報を書いている. スプラトゥーン3はS+9になり, S+10への昇格戦に一敗した.

13:54:00

月報スタイルに変えたせいで, 記事一覧からその中身がわからなくなった. あの話題を書いたのはいつだったか検索できる必要がある. neta/ と同じように n-gram データベースを無理やり埋め込むか, あるいは web API だけ別サーバに立ててしまうか. 後者の方が楽だ. やりたいのは結局 git grep なので.

15:37:17

17:10:32

思い出すシリーズ, RSS という素晴らしいインターネット基盤について.

http://s.cympfh.cc/rss

これは web 漫画の更新を勝手にチェックして一つのRSSに集約してる. 主な顧客は私自身とたまに友人数人で, 要望があったら一冊ずつ丁寧に手作業で入れてるだけだ. 公式がRSSを提供していればそれをそのまま使う. そうでないものはスクレイピングする. スクレイピングはやっぱり頑強性がない. サイトデザインの変更ですぐに, いつの間にか最近更新を検知できてないなということがある.

それはさてきおき.

次のようになっている.

  1. SQLite3
    • 作品エンティティ, 更新内容, アップデート日付時刻
  2. 更新を全部チェックするマシン
    • 更新があったら SQLite3 に新しいレコードとして挿入
  3. RSS サーバ
    • SQLite3 からアップデート日付の新しい順に N 件取ってきて XML としてエクスポート
      • これは出来るだけキャッシュして使い回す
    • HTTP リクエストが来たら XML ファイルを返す

2 だけを追加すれば新しいRSSがいくらでも作れる. 今欲しいのは, アニメの放送/配信 RSS. 放送/配信があるタイミングの 24 時間前くらいに流れてくればいい. 当たり前だが放送がまさに始まるタイミングで流れてきてもおかしいが, 一週間前に流れてくるのでは結局わからなくなる(RSSリーダー側で未読管理をすればいいけど). あと Twitter 代替 RSS.

17:38:26

この頃は皆が面白いといってるアニメを見ても面白く感じられなかったけど, 今期は違う. 面白いアニメが面白い.

Wed 02 Nov 2022

Python 3.11.0 のインストール

難しいこと考えずに毎回ソースからビルドしてシステムにインストールしてる. pyenv は邪悪ツール. 正しい我らには不要だ.

wget https://www.python.org/ftp/python/3.11.0/Python-3.11.0.tgz
tar xf Python-3.11.0.tgz && cd Python-3.11.0

./configure --enable-optimizations --enable-shared

make
echo $?  # 0 なら一応は成功

# ↑ "The necessary bits to build these optional modules were not found:" にオプショナルなライブラリでビルド出来なかったものが表示される
# 要確認
# 例えば "_dbm" が無いと言われたので ( https://blog.amedama.jp/entry/2018/08/25/134642 )
#    sudo apt install libgdbm-dev libdb-dev
# そしてもう一回
#    ./configure --enable-optimizations --enable-shared
# checking for stdlib extension module _gdbm... yes と言われる
#    make
# あくまでオプショナルなので不要なライブラリなら無視していい
# 例えば _tkinter とかは大抵の人は要らない

sudo make install

which python3.11
which pip3.11
# /usr/local/bin/python3.11
# /usr/local/bin/pip3.11

# 私の場合は ~/.local/bin/ 以下にシンボリックリンクを張ってこれを参照してる
ln -s /usr/local/bin/python3.11 ~/.local/bin/python
ln -s /usr/local/bin/pip3.11 ~/.local/bin/pip

Python 3.11.0 で導入された新しい型システム


Python Release Python 3.11.0
The official home of the Python Programming Language
 
www.python.org/downloads/release/python-3110/

PEP 673 – Self Type | peps.python.org

Self 型が導入された. class が自分自身を参照することができる.

from typing import Self

class X:
    def f(self) -> Self:
        return self

3.10 までは

from __future__ import annotations

class X:
    def f(self) -> X:
        return self

あるいは

class X:
    def f(self) -> 'X':
        return self

と書いてた. X を定義し終える前に X を参照しようとしてるから多少のごたつきがあったわけだ. SelfSelf でしかないのでその問題を回避してる.

継承する場合に型が揃う良さもある.

from typing import Self

class X:
    def f(self) -> Self:
        return self

class Y(X):
    def f(self) -> Self:
        return self

これまでは, やろうとしたら X.fY.fX を返す必要があった. このコードなら X.fX を, Y.fY を返せばよい.

またこれを用いたコード例として連結リスト (cons list) が挙げられていた.

from typing import Self, TypeVar, Generic
from dataclasses import dataclass

T = TypeVar('T')

@dataclass
class LinkedList(Generic[T]):
    value: T
    _next: Self | None

arr: LinkedList[int] = LinkedList(1, LinkedList(2, LinkedList(2, None)))
print(arr)

いいね.

またメソッドの最後が return self で終わっていれば -> Self は勝手に推論される.

class X:
    def f(self):  # -> Self が推論される
        return self

PEP 646 – Variadic Generics | peps.python.org

ほとんど numpy というか近年の機械学習(ひたすらテンソルデータをいじくりまわすような)のための型. テンソル, もとい, 多次元配列を表現する Array というクラスを作ることを考える. ここで Array は何次元でもよくて, 更に各次元には名前が付いている. 例えば (Height, Width) だったり (Batch, Time) だったり.

名前をつけるのは TypeVar で宣言して Generic でそれらを受け取れば良かった. ただしこれでは次数が固定でやるしかなかった. Generic は固定個の型変数しか受け取れなかったから. 3.11 からの Generic は可変個受け取れるようになった.

from typing import TypeVar, Generic, TypeVarTuple, NewType

DType = TypeVar('DType')
Shape = TypeVarTuple('Shape')

class Array(Generic[DType, *Shape]):
    pass

Height = NewType('Height', int)
Width = NewType('Width', int)
x: Array[int, Height, Width]
y: Array[int, Width, Height]

Batch = NewType('Batch', int)
Time = NewType('Time', int)
z: Array[float, Batch, Time]

他にサイズそのものを型にする例が挙げられた.

from typing import Generic, TypeVarTuple, Literal

Shape = TypeVarTuple('Shape')

class Array(Generic[*Shape]):
    pass

Height = Literal[480]
Width = Literal[640]
x: Array[int, Height, Width]

いいね.

* で TypeVarTuple を受け取れるのは Generic だけじゃなくて, 例えば tuple[] もそう.

from typing import TypeVarTuple

Value = TypeVarTuple('Value')

# ここで x, y は同じ型であると宣言してる
def f(x: tuple[*Value], y: tuple[*Value]):
    pass

f((1, '2'), (3, 4))  # NG, 型が違うので怒られる
f((1, '2'), (3, '4'))  # OK

PEP 675 – Arbitrary Literal String Type | peps.python.org

リテラルな文字列(ハードコーディングした文字列)かそれ以外の区別がつく. 特に SQL を自力で組み立てるような際に, 外から紛れ込んできた文字列を間違えて使ってないかを型レベルでチェックできる.

from typing import LiteralString

def f(x: LiteralString) -> LiteralString:
    return f"this is also LiteralString: {x}"

f("foo")    # OK
f(input())  # NG, input() は str を返す

def g(x: LiteralString, y: str) -> LiteralString:
    return x + y  # NG!!

リテラルに書いた文字列だけが LiteralString. 標準入力やファイルの中身は str. LiteralString に str を少しでも混ぜたものはそれはもう str であって LiteralString ではない.

PEP 655 – Marking individual TypedDict items as required or potentially-missing | peps.python.org

辞書の各フィールドについて, 必須か必須でないかを指定できる. これまでの TypeDict では「全部必須」か「全部オプショナル」かの二者択一だった. 一応この2つを mix-in することで, 必須のフィールドとオプショナルのフィールドを指定することはできたが, 非本質的なクラスを一つ余計に宣言することになってた. もうそんな必要はない.

from typing import TypedDict, NotRequired

class X(TypedDict):
    x: int
    name: NotRequired[str]

a: X = {'x': 2}  # OK
b: X = {'x': 2, 'name': 'Mark'}  # OK
c: X = {'name': 'Mark'}  # NG!!

TypedDict を継承するクラスにおいて typing.NotRequired が使えるようになる. 必須であることを示すのに typing.Required もあるが, これは何も付けないのと同じ効果.

PEP 681 – Data Class Transforms | peps.python.org

まじで何を言ってるのか理解できんなかった. Examples が動かない例しかないので Examples の体をなしてない.

Thu 03 Nov 2022

16:37:05

夢日記。人が imoutoid について話してるのを聞いた。

共感性羞恥というのは近年インターネット上で発明された感情. 実在するのかはよくわからない.

ルービックキューブの状態や操作は上手に定義することで数式で厳密に形式的に記述できる. イラストがなくても書けるので嬉しい. あったほうが分かりやすいけど. 圏論とかもあの図式で書かなくても数式で書けばいいと思ってしまう. 図式があったら分かりやすいけど.

Fri 04 Nov 2022

13:48:22

CATE; Condtional Average Treatment Effect, 条件付き平均処置効果

処置するかどうか \(W \in \{0,1\}\) . 潜在結果 \(Y(W)\) . 潜在効果 \(\tau = Y(1) - Y(0)\) .

処置の影響を受けないだろう特徴量 \(X\) を用いる. 次の値を CATE と定義してこれを推定する.

\[tau(X=x) = E [ \tau \mid X=x ].\]

Causal Tree

iid なサンプルとして \(\{ (Y_i(W_i), W_i, X_i) \}\) が与えられる. \(Y_i(W_i)\) は観測 (observed) された結果なので単に \(Y_i^{obs}\) とも言う.

Causal Tree では決定木を作る. 各葉ではほぼほぼ \(X\) が似たものになってるはずなので, その中で効果を見ればいい. 決定木は空間 \(X\) を分割する.

\[\Pi = \Pi_1, \Pi_2, \ldots, \Pi_k\] \[\mu(x, w=1; \Pi) = E [ Y(W=1) | x \in \Pi_m \land X \in \Pi_m ]\] \[\mu(x, w=0; \Pi) = E [ Y(W=0) | x \in \Pi_m \land X \in \Pi_m ]\]

この平均値をサンプルの中の平均で推定する. 求めたかった値は

\[\tau(x; \Pi) = \mu(x,w=1) - \mu(x,w=0)\]

20:41:12

三大インターネットが発明した実在性が疑わしい感情:共感性羞恥、承認欲求

21:32:17

今偶然発見した E-perm 手順.

\[E = (Sx)' U_2 (Sh)_3 U_2 (Sx)\]

ここで (Sx) は Sexy Move で

\[(Sx) = RUR'U'\]

\((Sx)'\) はその逆手順.

また (Sh) は Sledgehammer で

\[(Sh) = R'FRF'\]

\((Sh)_3\) はこれを三回繰り返す.

手数は 24 QTM. 最短が 16 QTM なので比べると長い. 見慣れた手順の規則的な合成になってるので回しにくいことは無いし, 何より覚えやすい. まあでも普通に 16 QTM を覚えたほうが実用的.

Mon 07 Nov 2022

18:46:16

CLIP; Contrasitive Language-Image Pre-training

Zero-shot Transfer

クラス分類をやってみる.

サンプルは X の写真. これを画像としてそのまま入れる. テキストとしては "A photo of {X}." を入れる. テキストの X を全通り試して最も関連度が高いものを答えることで, 画像の分類問題を解くことが出来る.

普通程度に解くことが出来る.

DDPM; Denoising Diffusion Probabilistic Model

完全にノイズの画像 \(x_T\) があり, Reverse process は \(x_t\) から \(x_{t-1}\) を作る. \(x_0\) が生成された画像.

確率過程を学習してくわけだが, 各ステップの過程は

Forward process の定式化から 「 \(x_t\) から \(x_{t-1}\) を導く確率」を求めたいが, これは \(x_0\) にノイズを載せてく過程なので条件に \(x_0\) はどうしても必要で, 結局

\[q(x_{t-1} \mid x_t, x_0) = \mathcal{N}(x \mid \mu_t(x_t,x_0), \beta_t I)\]

という形式が導ける. ここで \(\beta_t\) は適当にハイパーパラメータだとして決めると \(\mu_t\) はそこから決まる. \(\beta_t\) は \(t\) に従って大きくなる適当な数だとしておく.

\(p_\theta\) の \(\theta\) を, \(\mu_\theta\) が真の \(\mu\) と等しくなるように学習を進める.

本来 \(x_0\) が分からないと分からないはずのノイズ \(\epsilon\) を, 現在のノイズ画像だけから予測したものを

\[\epsilon_\theta(x_t, t)\]

とする. 基本的にはこれを引き算していけば, それがノイズ除去.

画像生成はノイズだけからなる一枚の画像に \(T\) 回ノイズ除去を噛ます出来る. \(T\) は 1000 くらいで固定.

DDIM; Denoising Diffusion Implicit Model

DDPM で言うステップを連続値にすることができるのでやる. DDPM でいう \(T=10\) くらいの繰り返し操作を一回で出来る.

ADM-G

GLIDE; Guided Language to Image Diffusion for generation and Editing

CLIP でテキストを特徴量に変換. これを条件にして画像生成する.

Classifier-Free Guidance. テキスト特徴量を \(c\) , 現在のノイズ付き画像を \(z\) とする. ここで \(\epsilon_\theta(z,c)\) が条件付きのノイズ. \(\epsilon_\theta(z)\) が条件を与えないときのノイズ. \(c\) の情報を強調するために,

\[\tilde{\epsilon}_\theta(z,c) = (1+w) \epsilon_\theta(z,c) - w \epsilon_\theta(z)\]

このように補正したノイズを使う.

unCLIP, DALL-E2

DDRM; Denoising Diffusion Restoration Model

DDPM の学習済みモデルを持ってきたら, これらのタスクを追加学習することなく出来る.

代わりに対応する劣化プロセスを Forward process とすると, ノイズ除去の式がちょっと代わるだけ.

Image-to-Image, SDEdit

  1. 入力画像を用意する
  2. ノイズを載せる
  3. ノイズを除去する

Composable-Diffusion

条件を強めたり弱めたり, AND, NOT でプロンプトを合成できる. Classifier-Free Guidance と同じことをやる. NOT のプロンプトは引き算するだけ.

Structured Diffusion Guidance

属性の係り受けを正しく見る. "red car and white sheep" で red sheep が出力されないようにする.

プロンプトを係り受け解析する. 木構造の全てのノードを冗長に入力してやる.

Tue 08 Nov 2022

01:29:47

夢日記。 二日前の夢だ。今でもはっきり思い出せる。 深夜と思える時間帯を私は一人散歩している。どこか分からない道に思えたが今なら分かる、当時の家から小学校に向かう通学路である。だからこそあそこに公園があるとわかった。私はそこに向かった。どうやらいつの間にか明朝で、既にグラウンド上には部活を初めている学生たちがいる。それを横目に登校している学生たちがいる。 どうやら私はかなり珍妙な格好をしているのか、指を指して笑い者にする人たちがいる。 私は気にしない。 公園の隅では馬が何頭か放たれている。 どうやら小さな動物園が併設されてるらしい。 そこに向かうと同じく動物園に向かう数名の学生グループがいる。 私になにやら話しかけるので、この人達も私を笑い者にするのかと思ったが、違うらしい。 動物園の入り口に立つと私を招き入れてくれた。 飼育員が出てきて私を中に案内してくれた。 多くの動物がそこにいる。 この手伝いをするのが、この子たちにとっての朝の日課らしい。それを私も手伝うというらしいが、大歓迎だ。 水槽ではロブスターがハサミを水面から出している。 私は自分が文鳥を飼っていること、文鳥もよく嘴で噛んでくるものだが、不意に噛まれるととても痛く、さあ噛み付くぞと待ち構えて噛まれるときには案外痛く感じないものだ、ということを熱心に説明した。

Wed 09 Nov 2022

16:06:59

ダサいから辞めたいし辞めてほしい言葉

あらゆる文法は普及した時点からダサくなる

Thu 10 Nov 2022

12:12:05

夢日記。終業式を迎えた。終わった後気がついたら皆帰っていた。勝手に私は、一緒に帰るものだと思っていたので寂しかった。寮に行くとまだ自分の荷物だけ山のようにある。これも撤去しないといけない。引越し業者を呼ばなくてはいけないと思った。学校の中を散歩していると、やり残した仕事をしてる知人に出会った。彼もまた一人だったので安心した。 餃子を食べてラーメンを二杯食べた。

Tue 15 Nov 2022

21:45:42

メモ

mail@cympfh.cc
SMTP: smtp20.gmoserver.jp
POP: pop20.gmoserver.jp

MX: mx20.gmoserver.jp

DNS(使わない):
  dns01.gmoserver.jp
  dns02.gmoserver.jp

今正しく動いてるが, ほんのつい先程まで DNSの設定をいじりまくったので明日もう一回確認して, 正しい設定一覧を残しておく.

21:52:33

今年の8月頃からメインのインターネットブラウザを Firefox から Vivaldi に切り替えた.

タブに関する機能が標準でリッチなのが良い. タブを右端に縦一列に並べることができる. タブは普通, 横長の矩形で表現されるが, タブを10個も20個も常に開いてる人間はこれを横に並べるともう追えなくなってしまう. 縦に並べるだけで全てを見渡すことができる. またタブスタックという機能がある. これまで Firefox のタブツリー (Tree Style Tab) というプラグインを使っていたが, 大胆に言ってしまえばほとんどそれに同じ. 正確にはルートから数えて高さが 3 に抑えられた木構造であり, 親ノードはただの抽象概念で, 葉だけがタブに対応している. タブが並ぶ代わりにタブのグループが並んでる, といったほうが早いか. これで十分だと思う(マジで).

また, タイリングという機能がある. これは他の全てのブラウザが真似すべき機能だと思う.

これらが標準であるのが素晴らしい. 一方で PDF ビューワが標準にないのが意外だった. ただしこれはプラグインがあるので問題なかった. Vivaldi の中身の実態は Chromium なのでプラグインが足りないということはない. 必要なものは探せば絶対ある.

以下のプラグインを入れてる

  1. PDF Viewer
    • pdf.js を内蔵してくれる
  2. Surfingkeys
    • Vim ライクに操作できる
    • あの頃の Vimperator の頃のような操作はさすがにもう無理だが, それでもかなりやれてる方
  3. Dropbox Passwords
    • パスワード管理ツール
    • 個人的な信条
  4. Enhancer for YouTube
    • 個人的な信条
  5. Minimal Theme for Twitter
    • 個人的な信条

またほとんどのショートカットは設定から変更したりできるので, それも良い. 仕事に使ってるPCでもプライベートのPCでも Firefox を完全に辞めてしまった. なんとなく, 仕事PCで新しいものを実験的に導入してみて, 私用PCでさらに深く使ってみるみたいな検証スタイルが出来てる.

Wed 16 Nov 2022

12:50:59

昨日の続き.

この変更のあと, じっと待てば良い

Sun 20 Nov 2022

20:40:40

たぶんずっと使ってるのは iPad Pro, 11inch の初代モデル. 2018 年かな?たぶん. 動作が怪しくなってきた. たぶんなんだけど OS 自体が重たいんじゃないかなと思う. iPadOS はアップグレードする一方で意図的にダウングレードすることが出来ない.

最新モデルの iPad Pro, 11inch を購入した. これは第四世代の2022年モデルになるらしい. 来週届くらしい. 今のうちに画面保護用のフィルムを探した. 第三世代までのものはあるが第四で使えると銘打たれたものがない. でもたぶん表面(画面側)の形状は同じだよね. 結局インカメラ部分を避けてくれるかだけだし(覆われてても困らないし). というわけで第三世代用のフィルムを買っておいた.

今まで使ってたのは 27,000 円で引き取ってもらえるらしい. 調べるとやはり自分の手でどこかの中古ショップに持っていって売るのがお得ではありそうだが, Apple が引き取った場合はストレージを盗み読まれることの心配がなくなる(元々いつでも読み取られる状態にあるわけなので, ここから追加の心配をする必要がない). というわけでそういうことになった.

家にノートパソコンとミニパソコンがゴミの状態でいくつか放置されてる. 買ったところで回収してもらうのが正しいらしいが, ツイてきたものは全部捨てたのでもう何も分からない. なんなら海外で買ったものもある. どうやらヨドバシカメラがこういうものを回収してくれるらしい.


https://www.yodobashi.com/ec/support/beginner/setup/kogatakaden/index.html

 
www.yodobashi.com/ec/support/beginner/setup/kogatakaden/index.html

段ボール箱に詰めて送る場合は 2,000 円. 自分で持ってくなら, 品にもよるがパソコンであれば, 無料らしい. 捨て方がわかったので安心した.

Mon 21 Nov 2022

23:09:41

今まで楽器っていう趣味に手を出してなかったのちょっともったいなかった. 音楽は聞くだけじゃなくて自分で演奏するほうがストレスの解消になる. 気持ちよくなれる.

Tue 22 Nov 2022

00:28:59

万有引力 少革委員会 相対性理論 光輪密造工房

13:16:05

専用のアプリケーションを入れたいものとは常時起動しておきたいもの. 常時起動しておきたいものとは, 通知がリアルタイムに欲しいもの. しょっちゅう見るもの. ブラウザで済ましたいものとは, 頻繁に使わないもの, またはリアルタイムの通知が欲しくないもの.

14:45:47


警察の不祥事 | [交通違反]取締り110番[否認したら罰金や点数は?]

 
xn--110-rf4b302pzd3bcnm.com/category/illegal-police/

15:07:39

興味あり


ヒトラーを殺し、その後ビッグフットを殺した男 : 作品情報 - 映画.com
ヒトラーを殺し、その後ビッグフットを殺した男の作品情報。上映スケジュール、映画レビュー、予告動画。伝説のナチハンターと謎の生物ビッグフットの死闘を描いたモンスターアクション。独裁者アドルフ・ヒトラーを暗殺した伝説...
 
eiga.com/movie/92318/

18:03:51

ようやく今日の長い長い用事が終わった. 今からお昼ごはん.

18:18:17

国によっては死刑制度ってのがあるんですけど, あれって自殺じゃなくて他殺なんですよね. 三人が同時にボタンを押してっていうのがあるんですけど, だとしても三人のうちの一人が殺してるんですよね. あるいは三人が平等に少しずつ殺してるって言い換えても本質的には同じなんですけど.

散歩をする.

Wed 23 Nov 2022

01:15:20

ア冥6見る. 結局OPがカッコよければアニメは良いものになる. かっこいい. 登場人物がかわいい女の子なだけのヤクザ映画.

ア冥7見る. よくよく見るとOPが実は全部ネタバレになってた(というのが後から見ると分かる)という仕掛け. 簡単に作れる割に効果が良い. 見た.

ぼ・ち6. 陰キャをずっとネタにし続けるわけだが, そもそも重大な嘘を一つ第一話でついていて, ぼっちがぼっちではなくなるところから物語が始まってる.

ぼ・ち7. 見た.

Thu 24 Nov 2022

17:24:16

食べるのに理由が必要な食べ物なんてない. お寿司はいつ食べてもいい.

(見ないといけない映画はない, 読まないといけない本なんてない.)

昨日は祝日だったので近所の喫茶店をハシゴして, 村上龍の69を読んだ. 一瞬で読み終えた. おおよそ, きまぐれオレンジロードの世界観だった. 田舎少年としてはギターは一通りコードが抑えられるのが基礎教養.

Fri 25 Nov 2022

17:00:21

消費するという快楽には依存性がある. かっこよく言い換えると, 生活水準を上げるとか, QOL を高めるとか.

「一度引き上げた生活水準は下げられない」

ドラッグの類を広めるには如何に印象良く清潔感と上品さをもった言葉に置き換えるかが鍵.