TIM Labs

CTOの小宮です。

先月開催された PyCon JP 2020で「How Sphinx generates document from Python code」というテーマで発表してきました。

こんにちは、@tk0miya です。 PyCon JP 2020 プロポーザル採択速報 によると、私が投稿した「Sphinx はどのように Python コードからドキュメントを生成するのか」が今年の PyCon JP 2020 に採択されたようです。ありがたいことです。

予定しているトークの内容は以下のようなものです。

Sphinx は Python の公式ドキュメントや numpy, pandas, django など数多くのプロジェクトで利用されているドキュメント生成ツールです。

Sphinx が広く利用されている理由のひとつに Python プログラムからのドキュメント自動生成(autodoc)があります。ドキュメント自動生成機能を用いると、手元の Python コードからかんたんにドキュメントを生成できます。本セッションではこのドキュメント自動生成機能がどのように実装されているのかにフォーカスを当て、Python プログラムの動的解析および静的解析の実装方法をご紹介します。

発表内容:

  • Sphinx とはなにか
  • Python コードからドキュメントを生成する
  • Python オブジェクトから情報を抽出する (動的解析)
  • Python のスペシャルメソッドを理解する
  • PEP を読む
  • Python コードから情報を抽出する (静的解析)
  • AST の使い方
  • Python のバージョン差と戦う
  • 質疑応答

さて、そんな PyCon JP 2020 ですが、今年はコロナの影響もあってリモートでの開催になることが決定しています。 ですので、このセッションも自宅から発表することになります。 そこで、本記事では PyCon JP 2020 に向けて整えた自宅の収録環境を紹介します。

こんばんは、小宮です。

本当に使ってよかったOpenAPI (Swagger) ツール を見て Stoplight Studio を使ってみたくなったので、homebrew cask に cask を登録してみました。 登録してもらった PR はこれです

これで brew cask install stoplight-studio でインストールできるようになりました。 homebrew-cask に登録されていないパッケージを見つけた場合は、homebrew-cask プロジェクトに PR を投げて cask を追加してもらいましょう。

Cask の作り方

cask を作るには大まかに、以下の 5つのステップを順次に実行していきます。

  • generate_cask_token コマンドによる cask token の生成 (ファイル名などに用いる)
  • brew cask create コマンドで cask コマンドを生成
  • メタデータを書き込む (アプリ名とか URL とかハッシュ値とか)
  • インストール、アンインストールの動作確認
  • 作成した cask ファイルをコミットして PR を投げる

詳細な手順は ドキュメント に非常に丁寧に (ステップごとに) まとめられているので、ここでは詳細は説明しません。 PR のテンプレートでも、各ステップを実施したかのチェックボックスが並んでいるので、ドキュメントを読みながらであればすぐ作れるはずです。

今回は 20分ほどで cask を作りました (1年ぶり2度目)。

まとめ (?)

Stoplight Studio の cask を作ってみました。便利そうなツールなので、ぜひ cask 経由でインストールしてみてください。

次のような模様を見たことが無いだろうか?

これは、Processingに用意されているnoize関数を用いることで、簡単に作ることができる。

パーリンノイズ(Perlin noise) と呼ばれるこの関数は、自然なテクスチャを表現するために用意されたもので、雲を表現するためなどに使われる。

PerlinNoise1.png

この画像は、以下のプログラムを実行すると、静止画として表示されたものである。

void setup() {
  background(255);
  colorMode(HSB, 100);
  size(500, 500);
  strokeWeight(1);
}

void draw() {
  for ( int x=0; x<width; ++x ) {
    for ( int y=0; y<height; ++y ) {
      float co =100 * noise(x/50.0, y/50.0);
      stroke(co, 100, 100);
      point(x, y);
    }
  }
}

最初に、setup()が呼ばれる。

  colorMode(HSB, 100);

が、カラーモード指定で、色をHue(色相)、Saturation(彩度)、 Brightness(明度)で表現し、範囲が0から100である。

draw() が実際に描画する部分だが、noise()関数は、引数を1個,2個,または3個とり、それぞれ1次元、2次元、3次元のnoize空間に対応する。引数に対しては、型はfloatで、範囲の指定は特にない。しかし、noise()の戻り値は0.0〜1.0となっている。
そのため、100倍して、HSBの色として利用している。
これを、ピクセル数だけ繰り返しているという、非常に単純なプログラムである。

前回、400円オシロスコープの話をしたが、これはProcessingで作られているのだ。

信号(電圧)の読み取りはArduinoで行っているが、そのデータは全部パソコン側に送られ、Processingでつくられたプログラムで処理されているのだ。

oscilloscope-bridge-2.png

電圧の測定はArduinoで行い、データをパソコン上のProcessingのプログラムに送って処理している。
もちろん、右側のボタンによるさまざまな制御もProcessingで処理されている。
これだけできるにだから、これは十分に習得する価値があるプログラミング言語と思われる。

最近は、STEM教育といって、小学生のうちからプログラミング、IoTなどの教育を始めようと言う動きが世界中に拡がっている。
そこで良く紹介されていて、書籍なども非常にたくさん出ているのが、ScratchというMITのMedia Lab で子供向けに開発されたプログラミング言語であり開発環境がある。

しかし、子供向けにしているために、せっかくのコンピュータの性能が十分に生かせないなど問題も色々ある。
入門には良いが、そのまま実用に結びついている訳ではない。

今回紹介しようとしているProcessingは、非常に入門のハードルは低いけれど、コンピュータの持つさまざまな機能、性能を十分に使えるようにしたものである。
とくに、デザイナー向けに作られており、最近のデジタルデザインが手軽に、そして優れたデザインができるようにと作られたものだ。
ということで、グラフィックス機能はやたらに高く、かつ便利にできている。
たとえば、東京芸術大学のメディアアート・プログラミングでは、Processingが用いられているのだ。

なお、このProcessingもMITのMedia Lab発祥のプログラミング言語である。

oscilloscope-bridge-2.pngIoTを色々いじっていると、電気が思った通りに変化しているか、電圧の波形を見たいことがある。つまり、可視化。

ということで、Arduinoで何とか測定装置、要するにオシロスコープはできないだろうか、できそうではないか、一定時間間隔で電圧を測定して記録さえできれば、あとは表示するだけだ。

といっても、オシロスコープを自分で考えるのはとても面倒である。

折角のインターネット時代なので、ちょっとインターネットで検索してみたら、こんなサイトが見つかった。

Arduino簡易オシロスコープ|国立大学法人 九州工業大学情報工学部【飯塚キャンパス】で作り方が公開されているのだった。

ソフトウエアもダウロードできるようになっていて、これはもう作るしかない。

Arduino1台と、簡単な回路を作ることと、パソコン側にProcessingという最近流行りのプログラミング言語をインストールしてオシロスコープの画面・制御パネルを動かす構成になっている。

Arduinoは、その機能の一部が使われるだけなので、Arduino Uno の必要もなく、もっと小さいArduino Nanoで十分である。Arduinoはオープンハードウェアなので、安い互換品が多数存在する。
ネットで調べていたら、中国からのネットショッピングで、USBケーブル+Geekcreit® ATmega328P Nano V3 Module Improved Version が1セット275円であったので入手した。

とても怪しいビニール袋(小さなゴミ袋の感じ)に、最低限の包装で物が入っているだけだったが、組み立てたらちゃんと動作した。

ということで、ケーブル付きで275円のArduino nanoを、ブレッドボード互換のユニバーサル基板に若干の部品と共に取り付けたら、Arduino側ができた。
その他の部品を入れて、400円程度で完成した。つまり、普通に安いオシロスコープの値段の1%である。

128×64ドットで、多数jの文字を表示するのは、1画面ならOKだが、2画面だとダメだった。

ということで、次のような実験をした。

  1. 画面を128×64ではなく、128x32を指定してみた。
  2. 表示する文字数をぐっと半分以下に減らしてみた。

これだと、ディスプレイの上半分だけが使われるのだろうか。

プログラム全体を以下に示す。

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#define OLED_RESET     4

Adafruit_SSD1306 display1(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_SSD1306 display2(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  Serial.begin(115200);
  display1.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display2.begin(SSD1306_SWITCHCAPVCC, 0x3D);

  displayText(display1, "Arduino is an open-source hardware and software company,"
                        "project and user community ");
                       
  displayText(display2, "that designs and manufactures "
                        "single-board microcontrollers and microcontroller kits " );
} 

void loop() {
  
}

void displayText(Adafruit_SSD1306 disp, char* text) {
  disp.setTextColor(WHITE);
  disp.clearDisplay();
  disp.setTextSize(1);
  disp.setCursor(0,0);
  disp.print(text);
  disp.display();
}

すると、結果はこうなった。

OLED-128x32displa2.JPG

文字が縦に倍に伸ばされているようだ。1行の文字数には変化がない。

さて、どうして、128×64では動かず、128×32にしたら動いたのであろうか。

たぶん、以下のような理由ではないかと思う。

OLEDは非常に鮮明な表示と言われているので、文字を非常に小さくしてみた。

DSCN4780-small.JPG    DSCN4782-small.JPG

漢字を表示したりするには、フォントを入れたりしないといけないのだが、面倒なので止めた。

とりあえず、これを表示しているスケッチ(プログラム)を示す。

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     4

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  displayText(display,"Arduino is an open-source hardware and software company,"
                       "project and user community that designs and manufactures "
                       "single-board microcontrollers and microcontroller kits " );
} 

void loop() {
  
}

void displayText(Adafruit_SSD1306 disp, char* text) {
  disp.setTextColor(WHITE);
  disp.clearDisplay();
  disp.setTextSize(2);
  disp.setCursor(0,0);
  disp.print(text);
  disp.display();
}

さて、次は、2つのディスプレイに異なる内容を表示してみよう。

adafruitのデモプログラムに手を入れて、2つのディスプレイに異なるグラフィックス表示をさせるのは面倒だったので、とりあえずこのプログラムを修正して、2つのディスプレイで、最後まで表示してみよう。

I2CバスでOLED(有機EL)のドットディスプレイを Arduinoに接続したが、まったく何も表示されず、画面は真っ暗なままだった。

OLED-128x64display.JPG

こういうとき、一番考えられるのは、I2Cのアドレスが一致していないことである。

スケッチのコードを見ると...

  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3D)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }

となっていて、プログラムではアドレスが0x3Dが指定されている。

デバイス側のI2Cのアドレスが3Dであるかどうかを確認しなくてはならない。

確認方法は色々考えられる。

  1. 他のI2Cのアドレスを調べられるマシンで確認する。
  2. デバイスの説明書を読んで確認する。
  3. Arduinoに、I2Cバスに接続したデバイスのアドレスを調べるソフト(スキャナ)を入れて確認する。

2.が正統派と思うが、ここでは、知っておくと非常に便利なI2Cのアドレス・スキャナについて説明しよう。

前回、Arduinoの小型版のArduino nano に、128×64のモノクロのOLED(有機EL)を繋いでみたことを書いた。今回は、もっと掘り下げてみよう。

Arduino-nano-OLED-1.JPG

まず、もっとも標準的なArduino UNOから、より小さい、ブレッドボード上に挿せるArduino nanoについて説明しよう。

機能的にはArduino UNOとほぼ同じであるが、ピンに違いがあるので、結線するときには必ず印刷されているピンの記号を見ながら行おう。

今回は、I2CでOLEDディスプレイを繋ぐので、必要な結線は4本だけである。

OLED-128x64display.JPG

ディスプレイの上に、ピンが4つあるが、左から GND, VCC, SCL, SDA になっている。

月別 アーカイブ