Open17

積読をなくす、本気でなくす

pondpond

きれいなpython プログラミング

pondpond

1章エラーの取り扱いと質問の仕方

ここから始まるのかという印象、構成が面白い。でも独学しようとすると意外とこういうところが一番大事かもしれない。Pythonのエラーメッセージの出方って独特だからちゃんと読まないとよくわからないというのはほんとうにそう。

  • トレースバックを読め
  • エラーメッセージで検索しろ
  • リンターを使え
    • リントって言葉の由来知らなかった
  • 掲示板で質問しろ
    • ただし質問するときは必要最低限のお作法は守ろう
pondpond

2章環境設定とコマンドライン

これもPythonというよりOSの理解の章。ただここを理解してないときついのでしっかり教えてくれるのはありがたい。

2-1ファイルシステム

  • 本書のルートフォルダはC:\ (Linuxの場合は/に読み替え)
  • 追加ボリュームはD:¥、E:¥(Linuxの場合は/mnt)
  • pathlibでOSの違いを吸収する
  • ホームディレクトリはC:\Users(Linuxの場合は/home)
  • 作業ディレクトリ(cwd)
    • from pathlib import Path
      import os
      Path.cwd()
      
  • 絶対パス
    • 常にルートフォルダから始まる
  • 相対パス
    • cwdからのパス
  • . はこのフォルダ
  • .. は親フォルダ
pondpond

2-2プログラムとプロセス

  • ソフトウェアアプリケーション⇒プログラム
  • 実行中のプログラム⇒プロセス
  • プロセスは互いに独立
pondpond

2-3コマンドライン

  • CLI:コマンドラインインターフェース
  • GUI:グラフィカルユーザーインターフェース
  • シェル:コマンドラインプログラム /bin/bash
pondpond

2-3-1ターミナルウィンドウを開く

  • Linuxでの開き方
    • Winキーを押してDashを表示し、Terminalと入力してエンター
    • CTRL+ALT+T
  • 開くとシェルプロンプトが表示される
    • 基本 $
pondpond

FreeRTOS

pondpond

マルチタスクオペレーティングシステム

オペレーティングシステムには、単一タスク型(例: MS-DOS)とマルチタスク型があります。単一タスク型は一度に1つのアプリケーションしか実行できず、限られた機能を提供します。一方、マルチタスク型は複数のプログラムを並行して実行可能であり、プロセッサの時間を切り替えることで、ユーザーに同時実行しているような錯覚を与えます。

1つのコアしかない場合は厳密には並列実行されませんが、複数のコアやプロセッサがあれば実際に並列処理が可能です。ただし、すべてのプログラムが完全に同時に実行されるわけではありません。

pondpond

タスクの概念

freeRTOSのタスクはコンピュータプログラムに相当し、典型的なC/C++プログラムのmain()関数内の無限ループに似ています。
この無限ループでは、ユーザーからの選択肢に応じたコードを実行し、再びループに戻るという単調な処理が行われます。
マイクロコントローラでは、ピンを入力や出力に設定し、シリアル通信を有効化した後、入力状態を確認して送信するコードをループ内で繰り返す形でプログラムが構成されます。
Arduinoではmain()関数にアクセスできず、代わりにsetup()とloop()関数を使用して操作を簡略化しています。これにより、プラットフォームの低レベルの詳細を意識せずにプログラムを作成できます。

pondpond
Listing 1 - Example of a C monotask application for microcontroller
void main(void) {
    //Sets pin 13 as output (LED) and pin 1 as input
    pinMode(13, OUTPUT);
    pinMode(1, INPUT);
    //Starts the serial with 9600 bps
    Serial.begin(9600);
    //main loop
    for(;;) {
        digitalWrite(13, HIGH);
        delay(1000);
        digitalWrite(13, LOW);
        delay(1000);

        //Sends the state of the input key on pin 1
        if(digitalRead(1) == HIGH) {
            Serial.println("Key on!");
        } else {
            Serial.println("Key off!");
        }
    }
pondpond

プログラムの主な機能は

  • LED(ポート13)の点滅
  • ボタンの状態(オン/オフ)の送信

このコードは1つのプログラム内で2つのタスクが処理されています。

12〜15行目と18〜22行目のコードを分け、それぞれを関数化することで整理されたコードにすることができます。
2つのタスクを独立した関数に分割し、より構造的なコードに改善します。

pondpond

doughnut

pondpond

doughnutってなに?
doughnut は、ソフトウェア開発のためのドメイン駆動設計(DDD)を支援するフレームワークです。特に、エンタープライズ向けアプリケーションをクリーンアーキテクチャで構築することを目的としていて、バックエンドとフロントエンドがしっかり分離されています。

GitHub上のプロジェクトを見た限りでは、主に**Java(Spring Boot)+TypeScript(React)**を使っていて、開発を効率的に行うためのツール類やテスト環境が整っています。

pondpond

Nixってなに?
Nix は「パッケージマネージャ」で、最大の特徴は「完全に再現可能な開発環境を構築できる」こと。

普通のパッケージマネージャ(aptやbrew)と違って、依存関係をすべて明示的に記述して、他人の環境でも完全に同じ状態を再現できる。

Dockerみたいな仮想環境とは違って、OSの上で直接動作するけど汚さない。

ソフトウェアのバージョンや設定を"immutable"に保つのが強み。

たとえば:

「Nodeのバージョンは18.x、Javaは17、pnpmは…」みたいな環境を全部コードで定義できて、それを使って即座に開発環境を立ち上げられる!