Keep on moving

あんまりまとまってないことを書きますよ

「やらないことリスト」を早めに決める, 自分で文章を書くときに気を付けていること

すんごい久しぶりにブログを書く気がします。 レバテックさんで仕事で携わっている会社のテックブログの話を公開しました。

levtech.jp

ブログの書き方について相談を受けたときに何を気を付けて壁打ちしているかを雑にまとめておきたいと思います。

なんのためのものなのか == (自分が)絶対に伝えたいこと

  • 伝えたいことがはっきりしていると文章が書きやすい。
  • 1個を推奨. 多くても2個
  • 多すぎると読者が読んで頭に残りづらい

誰に読んで欲しいか

  • 主に読者に知ってて欲しいことをどれくらい説明するかを想像してもらうために考えている
  • 雑に 誰にでもわかる or ある程度知っている人に話すのかの2択くらいで考えると良い
    • 誰にでもわかる: 前提知識をたくさん書く必要あり。その分読者が増えやすい
    • ある程度知っている人: 前提知識を書く量を抑えられるので、絶対伝えたいことが書きやすい。ただし読者はある程度限られる

読み手に必ず理解して欲しいことを整理する

  • 読み切った後でこれだけは必ず頭に残って欲しいことを考える
    • 伝えることを意識することで、伝えなくてもいいことを意識するのが狙い

xtech.nikkei.com

何を誰にどう伝えるかを考える上で、「やらないことリスト」を早めに決めることが大事だなとようやく気づけてきた気がする。伝えたいことをいかに(読者が)引っ掛かることなしに読めるようにしていくかを考える上で実は引き算が大事らしい。

DataClass 3.10での機能追加(kw_only, slots)

こんにちはPython界のレアキャラです。

dataclassから機能が追加され attrsであった機能が取り込まれました。 以前書いた記事のアップデートをしておこうと思います。

TL;DR

  • dataclassにkw_onlyと slotsが入った
  • attrsのつかいどころ
    • ボイラープレートコードを避けたい.(特にdataclassにない機能を利用したい)
    • 今Python3.9 以下を使っているし、今後dataclassを使いたい.
  • ドキュメントをきちんと読むと色々書いてある

docs.python.org

kw_only

https://docs.python.org/ja/3.10/glossary.html#term-parameter キーワード専用フィールドを設定するためのもの.

>>> # クラスの全フィールドをキーワード専用にするもの
>>> @dataclass(kw_only=True)
... class A:
...   a: int
...   b:int
... 
>>> a = A(1,2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: A.__init__() takes 1 positional argument but 3 were given
>>> a = A(a=1,b=2)
>>> a
A(a=1, b=2)

ちなみに1フィールドだけ キーワード専用にしたいときは dataclasses.field でできる。

>>> from dataclasses import field
>>> @dataclass
... class B:
...   x:int
...   y:int = field(kw_only=True)
... 
>>> B(1,2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: B.__init__() takes 2 positional arguments but 3 were given
>>> B(1,y=2)
B(x=1, y=2)
>>> 

ちなみにattrsでは以下のように書く.attrsでは3.9以前のバージョンでも使える.

from attrs import define, field

@define(kw_only=True)
class A:
  a: int
  b: int

@define
class A:
  a: int
  b: int = field(kw_only=True)

slots オプション

全俺が欲しかったもの。 以前は明示的に __slots__をつけないといけなかった。3.10からはこんな感じで書ける

from dataclasses import dataclass

## 3.9 以前のスタイル
@dataclass
class SlotedMessage:
    __slots__ = ["sender", "recipient", "body"]
    sender: str
    recipient: str
    body: str

## 3.10からはslotsを指定する
@dataclass(slots=True)
class SlotedMessage:
    sender: str
    recipient: str
    body: str

以前試した メモリの使用量見てみよう。

masahito.hatenablog.com

ちなみに実行前に pymperをinstallしてほしい。

pip install pympler
from typing import NamedTuple
from pympler import asizeof
from attrs import define
from dataclasses import dataclass

Message = NamedTuple("Message", [("sender", str), ("recipient", str), ("body", str)])


@dataclass
class DataClassMessage:
    sender: str
    recipient: str
    body: str


@dataclass(slots=True)
class SlotedMessage:
    sender: str
    recipient: str
    body: str


@define(auto_attribs=True, slots=True, weakref_slot=False)
class AttrsMessage:
    sender: str
    recipient: str
    body: str


if __name__ == "__main__":
    d = {
        "sender": "sender@exmaple.com",
        "recipient": "recipient.example.com",
        "body": "Hello, World!",
    }
    message = Message(**d)
    simple_data = DataClassMessage(**d)
    slotted = SlotedMessage(**d)
    attrs = AttrsMessage(**d)
    print(
        "NamedTuple %d, Dataclass %d, Slotted dataclass %d, attrs %d"
        % asizeof.asizesof(message, simple_data, slotted, attrs)
    )
% python aaa.py    
NamedTuple 272, Dataclass 528, Slotted dataclass 56, attrs 56

ここまでくると attrsのweakre_slots も入れて欲しかった気がする.

久しぶりにdataclassのドキュメントを読み返すことで発見がたくさんありました。 Python 開発者、ドキュメント書いてくれている皆様に感謝!

Python 3.11の新機能試す(1) - トレースバックのエラー位置の改善

app version
Python 3.11 rc1

本日試す機能

本日試すのはこちら。

PEP 657: Enhanced error locations in tracebacks 「トレースバックのエラー位置の改善」とでも訳すのがよさそう。

対応するPEP

peps.python.org

試してみたコード

from dataclasses import dataclass


@dataclass
class Point:
    x: int
    y: int


def manhattan_distance(p1, p2):
    return abs(p1.x - p2.x) + abs(p1.y - p2.y)


if __name__ == "__main__":
    p1 = Point(x=1, y=2)
    p2 = None  # Ouch!!! forget to initialize it for some reason

    print(manhattan_distance(p1, p2))

これを実行すると 3.10では

% python3.10 distance.py 
Traceback (most recent call last):
  File "/Users/masahito/src/python/try_3_11/distance.py", line 16, in <module>
    print(manhattan_distance(p1, p2))
  File "/Users/masahito/src/python/try_3_11/distance.py", line 9, in manhattan_distance
    return abs(p1.x - p2.x) + abs(p1.y - p2.y)
AttributeError: 'NoneType' object has no attribute 'x

どこでエラーになっているかはわからない。

けど、3.11で実行すると

% python3.11 distance.py
Traceback (most recent call last):
  File "/Users/masahito/src/python/try_3_11/distance.py", line 16, in <module>
    print(manhattan_distance(p1, p2))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/masahito/src/python/try_3_11/distance.py", line 9, in manhattan_distance
    return abs(p1.x - p2.x) + abs(p1.y - p2.y)
                      ^^^^
AttributeError: 'NoneType' object has no attribute 'x'

となって、エラーになっている行だけではなく、変数のどこで何が起こっている(今回の場合は変数がnone)のかが追いやすくなっていますね! これはなかなかいい

m1macbook air の環境をmacports -> homebrewに入れ替え

思うところがあってm1 macbook airを買ってからずっと使っていた macportsをやめてhomebrewに入れ替えてみた

対象 monteley 12.3

macportsをアンインストール

公式の以下の説明通りやればOKです。 guide.macports.org

注意点

ただし、rmコマンドで削除するときに以下のように permission denied が出た場合はセキュリティ設定をチェックしてみた方が良いです。

フルディスクアクセスを以下のようにターミナル(またはあなたがお使いのterminal application)にフルディスクアクセスを与えてください。

f:id:Ehren:20220410221100p:plain

homebrewをインストール

docs.brew.sh

前は apple sillicon用のインストール方法はintel版と違っていた気がしたのですが、 今は一緒のようです。

% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
% brew --version
Homebrew 3.4.5
Homebrew/homebrew-core (git revision 76904b3d872; last commit 2022-04-09)

Cloud Loggingでミュート(disable)しているアラートの一覧を表示する

こちらのブログを読んでいてCloud Loggingでミュート(disable)しているアラートの一覧を表示したくなった。

blog.luispc.com

やり方

gcloud commandを使うといけるっぽい.

cloud.google.com

アラートの名前を一覧表示する(jqを使用)

$ gcloud alpha monitoring policies list --project=PROJECT --filter=enabled:false --format=json \
 | jq '.[].displayName'

注意点

  • projectは必須
  • format optionはjsonyamlから選べる
  • 返り値は REST APIを参照

cloud.google.com

理想

qiita.com

Datadogみたいに一時ミュートできると本当はいいんだけどなぁ

Gradle で「詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください」と表示されたときの対処(for build.gradle.kts)

レアキャラです。今回は久々なので小ネタです。

software version
Java 11.0.9.1
Gradle 7.3.3

Gradle で「詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください」と表示される時があります。 build.gradleの時は以下の記事を参照。

qiita.com

ただ、この書き方だとbuild.gradle.kts(kotlinで書く方のやつ)だと動きません。 ではどう書くかというと以下のような感じになります

tasks {
    withType<JavaCompile> {
        options.compilerArgs.add("-Xlint:unchecked")
    }
}

先人に感謝

参考

https://discuss.gradle.org/t/what-is-xlint-deprecation-and-how-to-use-it/40270