つぶやきテック

日々のつぶやきアウトプット

つぶやき@properpy

@○○.setterと@property

ここでは「@○○.setter」「@property」についてすこしお話ししてみます。

はじめにざっくり言ってしまうと、この2つはJavaのクラスでいうset, getメソッドにあたるものです。 でもじゃあ、なんで「def set○○」「def get○○」という書き方じゃないんでしょうね。

Pythonic v.s. オブジェクト指向

ちょっぴり、詳しくみてみましょう。 PythonにはPythonic(パイソニック)という「コードを書くときの考え方」があって、 そこで「読みやすくて単純なコードを書こう」というようなことがうたわれています。 つまり、Pythonicに則れば「(変数名).get_name()」と書くよりも「(変数名).name」というように 書きたいな~というわけですね。

けれども、オブジェクト指向的な考え方に基づくと、オブジェクトの変数に直接代入するのは 危険。そのリスクを避けるための「知恵」がset, getメソッドでした。

すると自然と、「Pythonでクラスを実装するときは変数呼び出しするような見た目で メソッド呼び出ししたいよね」という声が出てくることになります。 その声に応えるものが「@○○.setter」&「@property」、というわけです。

ちなみに、こうした「@xxx」はJavaのsetter/getterと「完全に同じ」ではないので、 気になる方は調べてみても良いかもしれません。 (そしてお詳しい方、補足等お待ちしておりまする<m(__)m>)

つぶやきアーキテクチャ

アーキテクチャに関するドキュメント

アプリケーションにおける、アーキテクチャのドキュメント(設計書)について 調べたこと・わかったことメモです。

そもそもアーキテクチャって?

UML開発者Grady Booch氏の定義

Architecture is the set of significant design decisions that cover the structural components and their behavior, their organization and their style. (アーキテクチャとは一連の重要な設計判断であり、コンポーネントの構造と、それらの振る舞い、組織、様式をカバーするものである)

ふむ?

アーキテクチャの「四位一体」

こちらのサイト様によると、アーキテクチャ設計は以下の4つの要素に分けられそうです。

  1. インフラ定義:プラットフォーム、ミドルウェア等の選定
  2. サブシステム分割:レイヤ化(水平分割)/パーティショニング(垂直分割)
  3. 並行性の決定:実際に並行動作する単位の決定
  4. キーメカニズムの実装:生産性に大きく影響する「共通部分」の設計・実装

エンジニアのAleksey Kladov氏は、こうした「アーキテクチャに関する知識量」は、そのアプリケーションの開発スピードを左右する要素だと指摘し、特に大規模なプロジェクトにおいて、アーキテクチャを示す「ARCHITECTURE.md」を用意することの重要性を説いています。

つぶやきRenku

データプロビナンスとRenku

  • 個々のデータだけでなく、それぞれのデータの「あいだ」、つまりどのような加⼯を経てそのデータとなったかも含めて管理することをデータプロビナンスと呼びます。
  • データの流れも管理することで、たとえばコンピュータを用いた学問研究時に、どんなデータが、どんなコードを通して、どんな結果になったか振り返ることが容易になります。

データが誰によって取得され,そのデータが誰によってどのように加工され,その加工されたデータがさらに,別の研究者によって利用されてゆくという一連のプロセスをすべてきっちりと管理するフレームワークの構築が不可欠である。このエコサイクルが回ることによりデータを取得した研究者にデータを提供する大きなインセンティブが生まれ研究のスピードが大きく加速されるものと考える。データベースの研究分野ではこれらの仕組みをプロビナンスと呼び,誤った結果が得られた場合,どの段階でエラーが混入したかを素早く捕捉することを可能とすることの有用性が明らかにされつつある。

(https://www.jstage.jst.go.jp/article/johokanri/55/10/55_705/_pdf)

  • このデータプロビナンスのためのプラットフォーム、ツールとして使えるもののひとつにRenkuがあります。

Renku

プロジェクトの作成

  • https://renkulab.io/ にアクセスし、ログインします。初回アクセス時はサインアップが必要ですが、GitHubアカウントでの登録もできます。
  • "create new project" のリンクから、プロジェクト名の入力、テンプレートの選択をして作成します。

JupyterLab notebookサーバの新規作成・接続

  • Enviromentタブを押下し、遷移した画面で"New"タブをクリックします。
  • ブランチ名、メモリ、CPU数を選択して作成します。
  • 作成が終わると、Runningタブから当該サーバに接続できます。

データセットの追加

RenkuではDOIs(Digital Object Identifier system)と呼ばれる、データマネジメントシステムから、一意なデータIDを指定してインポートできます。

JupyterLabの"Terminal"を選択し、以下のコマンドを実行することでデータセットがダウンロードできます。

$ renku dataset import --name flight-data 10.7910/DVN/WTZS4K

Output:

CHECKSUM    NAME                       SIZE (MB)  TYPE

----------  -----------------------  -----------  ---------------

            2019-01-flights.csv.zip       7.9301  application/zip

Do you wish to download this version? [y/N]: y

OK

追加済みデータセットの取得

$ renku dataset ls
ID                                    NAME         TITLE               VERSION
------------------------------------  -----------  ------------------  ---------
72f6aab5-7cd2-414d-846f-0f239fb3c571  flight-data  2019-01 US Flights  1.0

gitとの関係

renkuによるデータセットの追加等の操作は、gitのログとして残っています。

$ git log
commit 88f6826... (HEAD -> master)
Author: John Doe <john.doe@example.com>
Date:   Sun May 16 23:43:18 2021 +0000

    renku dataset import --name flight-data 10.7910/DVN/WTZS4K

commit 3af7657...
Author: John Doe <john.doe@example.com>
Date:   Sun May 16 23:43:18 2021 +0000

    renku dataset: committing 1 newly added files

commit 991d350... (origin/master)
Author: John Doe <john.doe@example.com>
Date:   Sun May 16 23:11:41 2021 +0000

    service: renku init -n "sample_renku" -s "https://github.com/SwissDataScienceCenter/renku-project...

JupyterLabからgitコマンドでpushを実行すると、renkulab.io に作成したRenkuプロジェクトにpushされます。

参考

つぶやきWeb-RTC

Web-RTC

  • P2P通信でビデオチャット、ボイスチャットなどのリアルタイムコミュニケーションをWebブラウザだけで実現するための技術です。

  • 通信相手に関する情報を得るために、シグナリングサーバが必要です。

  • また、「NAT越え」のためのSTUNサーバやTURNサーバが必要です。*1

  • プラグインと呼ばれるような拡張機能や、専用アプリをインストールする手間を省けます。

  • ただし、配信側で視聴側の通信を制御するため大人数での利用は現実的ではないです。

つぶやきSemVer

セマンティックバージョン(SemVer)

  • 「パッケージのアップデートによって及ぶ影響」を、パッと見でわかるようにするためのバージョン記述法です。*1
  • パッケージの後ろにつく「5.2.0」という、あれです。

メジャーバージョン

  • 「5.2.0」の「5」です。
  • アップデート前のバージョンとの互換性に影響するような大きな変更です。

マイナーバージョン

  • 「5.2.0」の「2」です。
  • 互換性には影響しない、機能的な変更です。

パッチ

  • 「5.2.0」の「0」です。
  • 以前のアップデートからのバグ修正です。

つぶやきmanage.py【Django】

manage.py とは?

  • Djangoフレームワークにおいて管理タスクを実行するためのファイル(コマンド)です。
$ python manage.py [オプション] (コマンド)

コマンド・オプション

showmigrations

  • マイグレーションの一覧を表示します。
$ python manage.py showmigrations

makemigrations

  • マイグレーションファイルを作成します。

migrate

  • マイグレーションファイルの変更をデータベースに適用します。

出会ったエラー

ProgrammingError

psycopg2.ProgrammingError: column sample_app_region.app_url does not exist 
LINE 1: ...s", "sample_app_region"."python_url", "apps_os... 
  • 以前出会ったこのエラー。私の場合は、マイグレーションファイルのDBへの適用順がおかしくなっていることが原因でした。

解決方法

  • 先にDBに適用するマイグレーションを明示的に指定してmigrateします。
$ python manage.py migrate sample_app
  • 残りをmigrateします。
$ python manage.py migrate

つぶやきpackage-lock.json

package-lock.jsonって?

  • npm でインストールしたパッケージ情報が記載されるファイルです。
  • 以下のコマンドで作成・更新されます。
$ npm install

実行時は以下のような挙動をしています。

  1. package.json の内容を更新する
  2. package.json の内容をもとに node_modules のディレクトリにパッケージをインストールする
  3. node_modules に実際にインストールされたパッケージのバージョン情報が package-lock.json に記述される

(引用元:package-lock.json ってなに? - Qiita)

  • package-lock.json をもとにパッケージ群をインストールするには、以下のコマンドを使います。開発者それぞれの環境で違ったバージョンがインストールされるのを防げます。
$ npm ci

つぶやきpackage.json

package.json とは

  • 自分のNode.jsプロジェクトが依存する(参照したり、利用したりする)パッケージの管理に主に用いられるファイルです。
  • 一般的に、パッケージレジストリ(npm, apt, pip...) ではパッケージ同士が「依存のネットワーク」を構成しています。例えば babel-cli の依存マップはこんな感じ。

f:id:fugithora812:20210422050325p:plain
参考:https://npmgraph.js.org/?q=babel-cli

dependencies と devDependencies

# dependencies に追加
$ npm install express

# devDependencies に追加
$ npm install --save-dev nodemon
  • パッケージの依存関係を記入するためのプロパティとして、dependencies と devDependenciesがあります。

この2つには以下の違いがあります。

npm install に --production が渡されたり環境変数が NODE_ENV=production にセットされているとき、devDependenciesはインストールされない
そのプロジェクトがnpmパッケージとしてインストールされたとき、dependenciesのパッケージは一緒にインストールされるが、devDependenciesはインストールされない
(引用元:npmのpackage.jsonと依存関係を理解しよう! - bagelee(ベーグリー)

  • つまるところ、開発・テストのシーンでのみ使うパッケージはdevDependenciesに追加するのが望ましいです。

主なプロパティ(随時更新)

lint-staged

  • コミット前のファイルのLintを強制できるプロパティです。

設定例:

  "lint-staged": {
    "linters": {
      "*.js": "eslint --max-warnings=0",
      "*.ts": [
        "eslint --max-warnings=0",
        "tslint"
      ],
      "*.scss": "stylelint",
    },

つぶやきFHS【Linux】

FHSって?

  • Filesystem Hierarchy Standardの略です。
  • Linuxにおける、ディレクトリの基本ルールを規定しています。

FHS の構造

ポイントとなる性質

  1. 静的(コマンド実行などで書き換らない)かどうか
  2. 複数マシンで共有できるか

代表的な / 直下のディレクトリ

実行するコマンド・共有ライブラリの保管

ディレクトリ名 利用目的 静的 共有可
/bin 必須なコマンドのバイナリ(一般ユーザ用)
/sbin 必須なコマンドのバイナリ(特権ユーザ用)
/lib 必須の共有ライブラリ(及びカーネルモジュール)

システム・ログ・アプリケーション

ディレクトリ名 利用目的 静的 共有可
/opt 追加のパッケージ
/var 可変なデータ*1 × *2
/run システム起動後の、システムに関する情報*3

第二の階層 /usr

  • /usr 以下は静的・共有可です。
  • 主なディレクトリは以下の通りです。*4
ディレクトリ名 利用目的
/usr/bin 大部分のユーザコマンド
/usr/include C言語で使うヘッダファイル
/usr/lib ライブラリファイル
/usr/local パッケージシステム管理外
/usr/sbin 管理者用コマンド
/usr/share アーキテクチャに依存しないデータ

/bin と /usr/bin はどう違う?

FHSの定義においては、/ 直下のディレクトリ側には、システムを起動・復元・復旧・修復するのに必要なコマンド群を置くべきだとされています。*5

*1:ログ(/var/log)やロックファイル(/var/lock)、キャッシュ(/var/cache)など。歴史的には、/usrの可変な部分を/varに切り出したことで、/usrは読み込み専用にできるようになったのだとか。

*2:共有できるサブディレクトリとそうでないもの両方があります。

*3:デーモンプロセスIDを記述したファイルや、マシン内のサービス用のUNIXドメインソケットなど。/runディレクトリ内のデータは起動時に削除される必要があります。

*4:https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch04.html

*5:『SoftwareDesign 2021.4』「ディレクトリ構造とファイルシステム」