"python"

2023-05-13

もともとbashで書いていたスクリプトを拡張したくなって、普段ならPythonで書くところを今日は新しいことをしてみようということでRustをつかってみることにした。

Rustはまったく初めてと言うわけではなくて、ちらちらドキュメントを読んだり、ノリで学校の課題をRustで書いてみたり(痛い目にあった)したことがある。所有権のあたりで苦労はあまりしなかった(というかPythonっぽくヒープを贅沢に使うコードを書いた)のだが、Result / Optionの変換で発狂しかけた(メソッドが定義されていることに思いをはせられずに自作してしまった)。

あまり苦労しなかったと言いつつ、所有権のあたりで困りはしている。参照を受け取るコンストラクタに、その場で作ったオブジェクトを渡したいときに、一旦変数に束縛しないと、渡すオブジェクトが即死してしまっていけない問題が面倒。名前をつけるまでもない、式が体をを表しているような値にまで名前をつかないといけないのはしんどい。コンストラクタが所有権を奪うようにすればよいのだろうか。いらないから参照にしたのだよな…。

今ではそこそこなれてきて、代数的データ型とまともな型検査器がついたPythonくらいの書き方はできるようになった。 Rustのライブラリがイケイケに作られていて(エラー処理周りは辛いと感じるけど)、プログラムを書いていて楽しい。すごく汚く書いてしまった。当面の目標はまともにかけるようになることかな?ちょっとしたCLIでは大差ないのかもしれないけど。

ブログのGitHubのプログラミング言語構成比がカオスなことになってきた。

ここ何日か胃腸炎でつらい。今日はだいぶ回復して、Rustを勉強できるくらいになったけど、まだつらみを感じる。とはいえ三食たべても大丈夫な体に戻りはしたので問題なし。何日か会社に行けなかったのがなかなか悲しい。

今日は以前もらい忘れた診断書を書いていただいた。前回の診療に対して診断書を出してもらうことはなんだか難しそうで、もう一度診察していただくことになってしまった。自分の中では治ったと思っていたけど、見ていただいたらまだ治っていないとのことだったし、今はそう感じる(流されやすい性格なのか?)ので、忠告していただけてよかったと思うことにしている。

病院の帰り道で食器のフリマ的なことを日本料理屋さんがやっていた。普段使っている食器を入れ替えるのかなにかで、安く売り出してくださっていたようだ。胃腸炎になるまえに、会社のランチで「おいしそうな自炊の写真はくろっぽい器が大切」とのアドバイスを頂いていたことを覚えていたので、これは運命だと思い食器を購入した。黒っぽい器はどんぶりしか出会えなかったけど、それがなかなかいい感じだし、白っぽい器もいい感じのにいくつか巡り会えたのでほくほくしている。

あとはおいしそうなご飯をつくればよい。

夕飯につかってみた。いい感じ。味噌汁のお椀(蓋付き)が小さいやつで、フリーズドライの味噌汁一杯分しか入らないやつ(褒めてる)。感動している。

(アマプラ)。グレンラガンの監督?が制作しているらしい。ノリが楽しい。

2023-04-02

CPythonの開発者向けドキュメントがとてもよい。今はコンパイラの構成に関する部分を読んでいる。抽象構文木の扱いやメモリ管理の方針など、コンパイラ開発の方針を説明している。ドラゴンブックとかからは得られない、開発手法の知識を得られて幸せ。

好きな言語にドキュメントがたくさんあることは本当に嬉しい。

Pythonのジェネレータをyieldで書く例

Pythonのジェネレータ(というよりyield)の挙動を示す例を書いた。二分木を作るgenと、ノードを探索してその内容を表す文字列を返すジェネレータを返すconvを定義した。convがこういう風に定義できることを例で確認したかった。

from dataclasses import dataclass
import itertools
import random
from typing import Generator


@dataclass
class Tree:
    value: str


@dataclass
class Node(Tree):
    children: list[Tree]


@dataclass
class Leaf(Tree):
    pass


def gen(n):
    msg = f"{random.randbytes(1)}"
    if n <= 0:
        return Leaf(msg)
    else:
        return Node(msg, [gen(n - 1), gen(n - 2)])


def conv(t: Tree) -> Generator[str, None, None]:
    if isinstance(t, Leaf):
        yield f"Leaf: {t.value}"
    elif isinstance(t, Node):
        for i in itertools.chain(*map(conv, t.children)):
            yield i
        yield f"Node: {t.value}"


if __name__ == "__main__":
    import pprint as pp

    t = gen(3)
    pp.pprint(t)
    for i in conv(t):
        print(i)

2023-01-05

年末にPython向けのGoogleのスタイルガイド を読んでからPythonを書くのがとても楽しい。知らなかった言語機能やその有効な使い方とその理由をコンパクトに説明してくれる。言語機能の使い方は補足程度で、機能そのものは知っていたりググって理解することを読者に期待していそう。言語に入門したあと、息を吸うようにかけるようになるまでの間を埋めるのに役立ちそう。

その他の言語についてもGoogleはスタイルガイドを公開しているので折をみて目を通したい。

UbuntuでPDFを印刷するときに拡大縮小ができなくて困っていた。たまたま巡り合ったこの記事のおかげで解決した。

2022-12-30

昔聴いていた音楽を久しぶりに聞きたくなったのだがSpotifyで配信されていなかった。ローカルにデータがあったのでそこからSpotifyかVLCとかで使えるようにしようと思ったのだが、ローカルデータのファイルフォーマットが変だったりディレクトリ構成がイマイチで体験が良くない。

そこでメタデータをもとにフォルダに振り分けたりフォーマットをmp3に変換するスクリプトを書いた。量があったので並列化したところ割といい感じになった。

せっかくなのであとで使いやすいようにCLIを調整した。コードをGitHubにアップロードしてある。 できることや使い方はreadmeを参照すること。

ffmpegはすごいし、Pythonもすごい。

型ヒントに関する記事で欲しい要点がまとまった記事 と出会ったので共有。 Enumはしらなかった。これまではLiteralとUnionでしのいでいたのでありがたい。

最近Pythonを好きになりつつある。4月からキャディで使っていた下地と、最近学んだ人権のための機能のおかげ。

別に職を探しているわけではなく、気になった人のプロフィールを見たかったので。スキルをテストして、パスするとバッジとして自慢できる機能がある。 OOPで試したらパスした。やったね! クラスベースのOOPLに関する知識を見ている感じだった。

世の中にはいろんな機能があるのだなあという感想。自己申告でスキルを履歴書とかに書くよりも客観的な感じがして良いかもしれない。

公開したいと思ってきたのだけど、スパムが嫌でずっと避けてきた。 Base64でエンコードして公開するアイデアを思いついたので試しにやってみる。このブログの自己紹介ページに載せてみた。この方法の問題点は面倒なことと、なれてない人には難しい点だろう。

それなりに頑張らないと収集できないだろうからスパムが来てもどんなところがそんなに頑張ったかを知れて楽しいだろう。

風の噂でこの方法は対策してあるソフトが存在すると聞いた。それではつまらないのでもう少し凝ったことをしてみた (該当コミット)。

Base64でhtmlにアドレスを書いておいて、JSで一定時間後にhtmlに書き込むアイデア。伝えたい人にとって楽になるのが何より良いし、クローラのタイムアウトにある程度期待できるのも良い。無限に対策と不安点は出てきそうなのでこのくらいにしておこう。

実現のためにHugoのショートコード機能を使った。もっと楽しい使いみちがあるようなので気が向いたら導入する。

2022-12-28

就職先のイベントに参加してきた。想像以上にたくさんの方に認識していただいていた。僕が初めて認識した方や、ネットで認識していた方、面接などでお世話になった方から、たくさんお話をうかがえて楽しい時間だった。みなさん、ありがとうございました。

入社が楽しみ。入社するまでに学校でのやり残しを作らないように気合を入れて頑張ろう。

Python bug trackerに議論があった。

Py_DECREFは参照カウントのオペレータか。初めてPython VMのソースを垣間見たけどなかなか面白そう。

2022-12-21

最近ちいさな言語処理系(検証器)をPythonで実装している。学校の講義でそういう講義があって、好きに言語を選んでよいということだった。参加者の間で関数型言語がメジャーな感じではなかったのこともあり、怖いもの見たさでPythonを選んでみた。ちなみに今回の実装は性能を問題にしておらず、動くことが大切。

Pythonをつかうだけでも少しドキッとするのだが、 ASTとかにクラスを使わないとどうなるかを試している。クラスとかADTを使いたくなるときはすべて辞書かタプルでゴリ押す実装をしている。

意外となんとかなるけどしんどさはある。結局ADTを自分で書いているだけなので、型システムという友達を失っただけかもしれない。クラスを使うのと比べてどちらが楽かは疑問。流石にクラスが楽であって欲しい気はするけど、 expression problemに思いを馳せるとクラスよりADTの方が今回の処理系の実装に向いている気がする。

文字列処理をググりやすいのはPythonのよいところだと思う。そもそも文字列処理を僕がPython以外でほとんどやったことがないだけかもしれないが。

今のところ、型システムがなくて絶望したことはない。(ほしいとは常に思うが)

型システムがなくて絶望した。 Dataclassを使うことにした。抽象化の機構はやはり欲しいことがわかった😇。

Python のfilter関数が良い

ドキュメント を読むのが早い。

こういうことができる。

$ cat map-none.py                                                                                                                          17:34
def f(x):
    if x < 0:
        return x

for i in filter(f, map(lambda a: a-10, range(100) ) ):
    print(i)

$ python3 map-none.py                                                                                                                      17:34
-10
-9
-8
-7
-6
-5
-4
-3
-2
-1

静的型つき言語では fmaybe を返すようにして、filter の代わりに mapMaybe のような関数を使うところだ。 Python のおしいところは、filter という名前でよぶところか。

def map_maybe(fn, lst):
  filter(fn, lst)

とすれば良い話ではあるが。

こういう機能は Python に限らないような気はする。動的で関数型に関心のある言語ならこういう仕組みにするのが None のような値の扱いとして自然だろう

TODO: 他の動的言語での扱いを調べる。

  • scheme
  • CL
  • JS
  • ruby
  • julia