resource type

Google Slidesで作成したスライド類や、Mathematicaのsource類、試作システムなど。

resource

1.崇めよBlank讃えよObject
技術書典6にて頒布
2016年9月

2. MathematicaでOOPを理解する
オンライン技術書典8にて頒布
2020年2月
top

1.OOP for Mathematica
MathematicaのOOPを解説
2016年9月
2.S3でHTMLホスティング
HTMLサーバーをS3に移行した
2016年9月
3.Mathematicaはなぜ敬遠されるのか
Mathematicaが敬遠される理由とは何か、分析してみた
2016年10月
4.Mathematica言語の原理
Mathematica言語の原理を説明する
2016年10月
5.プログラミングとMathematica
何のためにMathematicaでプログラムするのか
2017年3月
5.1.ATcorder精選10問
AtCoderの精選過去問10問をWolfram言語で記述してみるソースはここ
2020年3月
6.Mathematicaで中学数学を学び直す
Mathematicaをプログラム言語として学ぼうとする人に、どのようなメリットを提供できるだろうかを考えた。その一つとして、多くの人々が数学嫌いになる契機となっている中学数学を取り上げ、これをMathematicaを通して学び直してみる、という経験を提供することを思いついた。数学を学ぶということは、Wolframの言うように全ては計算であるとすると、学ぶ人の内部に計算実行環境を構築することであると、看做せる。この時、学ぶ人は、Mathematicaの計算実行過程を観察し、それをフォローすることで、自らの内部に、新たな計算実行環境を構築することができるであろう。その構築過程は、問題集と回答の組合せの両方からトライアンドエラー方式で、環境構築を行なう従来手法より、ずっと容易であることが期待される。ソースはここ
2018年1月
6.1.なぜシンボルの理解が困難であるか
中学数学の学ぶ上での第一の障壁は文字式の導入であるという、意見がある。なぜ、文字式の理解が困難であるかを、シニフィアンとシニフィエの関係という観点から見てみる。そこには数学と我々の住む物理世界との違いがあることが分かる。ソースはここ
2018年1月
7.COVID-19
COVID-19のモデリングをしてみた
2020年3月
7.1.微分方程式モデルを通した現象の理解
COVID-19のモデリングの背景について説明した。
2020年4月
top

Wolfram Communityに投稿した記事がSTAFF PICKS:として、選ばれているので、リストアップしておく。

1. Parallel Mathematica Environment on the RaspberryPi using OOP
2. Chaos bifurcation of double pendulums calculation with OOP
3. Parallel Computing and Object Oriented Programming - Part 1
4. Parallel Computing and Object Oriented Programming - Part 2
5. Graph Editor 2020 ver. powered by the Object Oriented Programing
6. Finding of the loops hidden in the Tokyo-Metropolitan-Highway

首都高を知っている編集者がいるようで、このリンクをTwitterで呟いてくれた。

7. Parallel computing environment with ZMQ on the Raspberry Pi cluster
8. Multi-Node Multi-Core Parallel computing system on the Raspberry Pi cluster
9. Applying Instance Indexed OOP to Multi-core Life Game
10. Instance-preceded and Method-preceded Object Oriented Wolfram Language
11. Parallel Computing and Object Oriented Programming - Part 3

2020年頃の投稿なのだが、編集者が大分遡って見てくれているようだと。

12. Graph Editor ver.2 powered by the Object Oriented Programming

これは投稿したその日にピックアップされた。

13. EventHandler polymorphism with OOP

Graph Editorのコードを整理している途中に気づいてcall-backの記述法を述べた。

top

0.OOP for Mathematica(zip Mathematica source)
Mathematica OOPの解説である、 Associationについて加筆した
MathematicaOOPの解説書の目次である
解説書自体はMathematicaで書いてあるのだが、そのうち、Kindle本にしたいなんて思っている。
2018年8月
1.GraphEditor with OOP 
以前に頂点と辺から構成されるグラフのエディタを作ってみたが、速度的に使えるものではなかった。これをOOPで書き直して、使えるものとすることができた。というより、これを実現したいがためにOOPを開発したとも言える。都合上、YouTubeにもアップした。実行ムービーはこちら
2016年10月
2.Oscilloscope with OOP
プログラムのデバッグ作業においては、Print文を使わざるを得ない場面が度々出現する。Print文に代わる、変数のビューアーである。変数のトレンドを見る事もできる。OOPで作ってあるので、ビューワーを幾つでも生成することができる。
2016年10月
p.s. 初版はAppendTo関数を使っていたが、AppendToはガベージを残すようで、MNISTでは問題を起こしていることがわかった。そこでAppendToをRotateLeftに置き換えた。
2017年5月
3.Moving points defined by OOP 3Dにした実行ムービーはこちら
OOP を使った、基本的なプログラム例である。3D化も容易である。
2016年10月
4.Drums simulator powered by OOP
グラフィックスを持つインスタンスを複数生成する例である。
2016年11月
5.Calculator using OOP
OOPを使った計算機である。継承を用いている。
2016年11月
6.Task Sheduler
Mathematica のtask shedulerはまだ不具合があるというので作ってみたもの。
2016年12月
7.Docked Twitter Tool
ノートにドックインしておいて、何時でもTwitterにアクセスできるツールである。RaspberryPi-Zeroを使った、Mathematica講習会を念頭に置いている。
2017年2月
8.OOP with the Association
Ver.10から連想(Association)が取り入れられている。同時に名前付きの純関数変数が使えるようになったので、オブジェクトデータの記述に連想を用いると、OOPにスムーズに連結することができる。
2017年3月
9.MNIST classifire with OOP
パーセプトロンがうまく収束しなかったので暫く放っておいたのだが、再開してみたら、バイアス値を1->0にしただけで収束するようになったので、慌てて、整備してからMathematica Communityに投稿した。
2017年5月
10.Double pendulum motion with OOP
OOPの応用を探していたらdouble pedulumの初期値の違いによる発散の記事をTwitterで見つけて、なるほどOOPにぴったりだし、ラグランジアンの計算は大学の時以来なので、ちょうど良いと開発してみたもの。Chaos bifurcation of double pendulums calculation with OOPというタイトルで、Mathematica Communityに投稿したところ、幾つかの反応があった。
2017年5月

RaspberryPi、ことにRaspberryPi ZeroとMathematicaの組合わせに種々の外部デバイス、さらにはArduinoを接続すると、新たな展開が生まれる。
そこで、RaspberryPi Zeroに各種外部デバイスを接続して、これらをMathematicaで制御する手法について解説することとした。接続する外部機器は、加速度計・磁力計・ジャイロ・気温/気圧計などのセンサー類、SSD1306 OLEディスプレイ、サーボモーター・ステッパーモーター・DCブラシモーター等のアクチュエーター類、各種スイッチ、リチウム電池・チャージャー・DC/DCコンバーターなどの電源周り、およびArduino/ATtiny85、である。V.3.6 ダウンロードはここからYouTubeはここから
top

1.RaspberryPi-Zero setup
Raspberrypi-Zero上でMathematicaを動かすための、Headless setupの手順である。HeadlessとはRaspberrypi Zeroなどに、キーボードやマウス、ディスプレイ等を接続することなしに、セットアップすることである。ここでは、Raspberrypi ZeroのRNDIS/Ethernet Gdgetを利用して、USBケーブルのみで、ホストとなるPCに繋げてセットアップする手順を示す。
2017年1月
2.Remote RaspberryPi-Zero Mathematica evaluation
ホストのMathematicaから、ホストとRaspberrypi-ZeroをSSH接続した上でMathematicaを起動させ、実行結果を戻すスクリプトである。
2017年2月
3.RaspberryPi cluster
photo
USBで接続した様子
Raspberrypi Zeroに興味を持ったのは、電源レス、低コスト、小サイズのクラスターを作れるのではないか、という目論みだったのだ。しかも単純にセッションを分配するのではなくて、OOPを使えば並列化と相性が良いのは分かっていたので、OOPのインスタンスをクラスタに分配して、メッセージを送信するという方法を取ることができると予想したのだ。クラスターとコントローラーの間の通信方法に悩んだが、一ヶ月程で、ほぼ当初の目的を達成できた。Mathematica Communityに投稿したところ、Contributerに選ばれた。
2017年4月
4.SSD1306-OLED display
photo
128x32 dot-display
Raspberrypi Zeroのコストを考えると、これに接続するペリフェラルも、相応のコストが求められるだろう。都合のよいことに、ディスプレイについては、低コストのOLED(有機エレクトロルミネッセンスディスプレイ)が供給されている。ということで、これをRaspberryPiにi2Cで接続することにした。手持ちのRaspberryPi Zero上のMathematicaでは、i2C接続関数がうまく動作しないので、OSに付属するi2Cルーチンを使うことにした。速度的には満足できるものではないけれど、他のドライバーは必要としないので、簡潔なプログラムでディスプレイを動作させることができた。フォントは高さが8 bitに収まるものを選んで、これもMathematicaからハンドリングするようにした。
2017年8月
5.touchPHAT switch
photo
静電式タッチスイッチ
Raspberrypi Zeroに対する入力方式で、最も単純なのはスイッチであろう。ここでは、本体よりも高価な、タッチスイッチを試してみた。接続はi2Cである。試してみたら、タッチスイッチに対応しているべき表示用のLEDが逆順になっていて、これは殆ど試作品であるな。
2017年8月
6.STORY-TELLER : OLEDに日本語を表示
photo
8*8ドットサイズの漢字を表示
美咲フォントという究極のフォントがある。8*8ドット、周辺に1ドットの隙間を空けてあるので、実質的には7*7ドットで、JISの第二水準まで表示してやろう、というフォントである。当然、細部を表現することはできないので、見る方の人間の形態認識力を使おうというアイデアでできたフォントである。こういう考え方は好きだな。SSD1306でドライブするOLEDは8ビット高さのページが基本単位であるので、そのサイズに合致しているのも、このフォントを選んだ理由だ。

ということで、目的は何かを表示するのではなくて、何かを表現することにした。そこで、青空文庫のイリアスを選んで、これを自動的に映し出す、何かを作る事にしたのだ。出来上がった、この何かは、土井晩翠訳イリアスを、人が見ている見ていないに関わらず、勝手に表示するのだ。イリアスは長編であるので、一二時間では表示しきれない、そういう何かが出来たので、これをSTORY-TELLERと名付けたのだ。
photo
インタラプトスイッチを取り付けて3Doodlerでフレームを作った

p.s. その後、スタンドアローンで動作させることを考えた。動作を開始させるのは、rc.local にmathkernelにファイルアドレスを付けたものを、書き込んでおけばよいのだが、問題は、これをどのように中途終了させるかだ。そこでタクト・スイッチをGPIOに接続して、中途終了させることにした。この時、GPIOピンの中で、初期状態がhighであるピンをスイッチオンの時に接地させて、ピンの状態を監視している関数が、Mathematicaコードを終了させることにした。ということで、タクトスイッチを発注してあるのだ。(2017/9)

p.s. タクトスイッチが到着したのでインタラプトスイッチとした。3Doodlerという3Dを作るペンがあるので、これでちょっとおどろおどろしい感じのフレームを作って、全体を取りまとめた。(2017/9)

YouTubeに投稿してから、そのリンクを貼っておいたのがこれ
2017年8月

7.ROLLING-WORDS : OLEディスプレイをサーボモーターで回す
photo
サーボモータの先端にディスプレイを取付けた
OLEディスプレイをI2C接続することができたので、次にこのディスプレイをサーボモーターで回してやろうと思いついた。"Rolling Stones"にインスパイアされて、この"Stones"の部分を次々に変更して"Rolling"させると面白いのではないだろうか、と。

最初はサーボモーターを回すためには電力の関係で無理かも知れないし、サーボモーターを動かすためのパルス列をMathematica配下にあるRaspberryPiで出来るだろうかとの懸念があったので、別ボードを用意してあったのだが、RaspberryPiでPWMを実現するツールがあって、しかも標準でインストールされている、という話をみつけて、俄然やる気が出たのだった。

組み上げていくと思いのほか電力も喰わず、RaspberryPi ZeroにOLEDと一緒に、購入してあったSG90サーボモータを動かしても何ら支障のないことが確かめられた。一番の問題は、ディスプレイを回転させる時にどのようにして配線を取り回すかで、結局、出来るだけ細い線を見つけるために、手持ちのUSBケーブルをばらして、なんとかなりそうな目処をつけたのだった。

早速、Wolfram Communityに投稿した。動画が投稿できなかったので、YouTubeに投稿してから、そのリンクを貼っておいた。

ところで、使ったOLEDやSG90、配線用のピンなどの中華製品が送料込み数百円で手に入って、これで利があるのだろうかと、驚くほどに安い。
2017年9月

8.NEWS DIRECTOR : 磁力計とディスプレイとステッピングモーターを組み合わせる
photo
ステッピングモーターで回すターンテーブルに
磁力・加速度計とディスプレイを搭載している

磁力計の応用は、コンパスとなるのが常道である。だが、単に方位を示すだけでは、何の面白味もない。思いついたのは、北や南などの方位がタイトルに含まれる小説などを、方位に合わせて表示したらどうかと。つまり、ディスプレイが東を見ている時に、エデンの東を表示させようと。そういやこの小説は読んだことがなかったな、と思わせるガジェットなのである。

仕組みとしては、出来上がったガジェットをどんな向きにおいてあっても、よいことにする。そのために、最初に360度磁力計を回して、磁北を検出する。磁北の検出には、角度ーテスラがサインカーブを描くので、これにサイン関数をフィッティングさせて、その時の位相角から磁力の最大値、すなわち磁北を推定することにした。

次に、方位に関連させた小説ファイルから、ランダムに小説を選んで、その方向にディスプレイを回して、これを表示する。そこで、あ、この小説は読みたいな、と思って、あるいは、ただランダムに回転するディスプレイを眺めて、ぼんやりする、と。

開発にあたっては、磁力計・加速時計のコンビである、LSM303DLHCのレジスタの読み込み方に癖があって、個別に読むとノイズが大きいとか、磁力計の各方向レジスタは、全部読まないとリフレッシュされないなどの、特性を突き止めるのに時間を要した。

YouTubeに投稿してから、そのリンクを貼っておいたのがこれ
2017年10月

9.Node.jsと組み合わせてI/O制御を行なう
photo
Node.jsでLEDを点滅させ続け、任意のタイミングでMathematicaから周期を変更する

Mathematicaから、RaspberryPI Zeroに接続された外部機器の制御には、Shellを使うことができる。一方、MathematicaからShellの呼び出しと、ShellからI/O機器の呼び出しには、一定の時間を必要とするので、Mahematicaを用いたプログラムは、その影響を受けて、一定の制限を受けることになる。

Node.jsは、RaspberryPi上でHTTPサーバーとして設定できると同時に、rpioによってI/O機器を制御することができる。同時に、Node.jsを用いることで、JITによる高速化と非同期処理機能を享受することができる。これらを考慮すると、MathematicaとNode.jsの組合せは、Mathematica単体による外部機器制御に比べて、その適用範囲を拡大できる可能性がある。

ここでは、両者を組み合わせた結果を評価するために、Node.jsでGPIOに接続したLEDを一定周期で点滅させながら、Mathematicaから任意のタイミングで、この周期を変更するプログラムを試作した。ソースはここ
2018年3月

10.JD-TEACING-MACHINE : タッチスイッチコントーラ付きデジサイン

photo
3.5インチディスプレイにコンテンツが表示され
タッチスイッチによりオート/マニュアル/フォワード/バックワード機能を切り替える

Mathematicaの基本原理を説明するスライドを、入力とそのリアルタイムの評価結果出力のペアで表示するシステムである。ハードウェアとしては、RaspberryPi Zero Wと静電タッチスイッチ、3.5インチLCDディスプレイ、シャットダウン・スイッチから構成される。

システムのソフトウェアは、スライドのコンテンツをDatasetで保持し、これをNotebook関連ルーチンで表示する。タッチスイッチの制御をOOPで構成し、Task管理ルーチンを用いて自動処理するように構成されている。

このプロジェクトは、可動する部分がなくて、RaspberryPiからLCDに映し出すだけ、とも言える代物なので、実はなかなか形が決まらず、そもそも一体型にする意味があるのか、とか、いやいやディスプレイが剥き出しだからよくないのではないのか、とか、コネクタの向きがおかしいのでうまく纏まらないのだ、とか、HDMIケーブルが長過ぎるから散漫な印象になるのか、とか、プログラムが出来てから、ひと月程も、弄り回していたのだ。

で、ある夜の銭湯で閃いて、そうかこれはストーリーがないからまとまらないのだ、と。とすれば、これは、Mathematicaの秘術を頬を寄せながら高校生に教える女子大生の誘惑の道具なのだ、というシチュエーションを思いついてから、すらすらと纏まったものなのだ。

どんなものでもストーリーは必要だ、という知見を得たプロジェクトだったのだ。ソースはここ
2018年5月

11.SG90サーボモーターを用いた二軸テーブル制御

photo
2軸のパン・チルト・キットとSG90

SG90サーボモータの使用が想定されている、"Pan/Tilt Camera Platform Anti-Vibration Camera Mount"なる、安価な2軸のパン・チルト・キットが流通している。そこで、RaspberryPi-Zeroの2チャンネルのPWM出力を、SG90に接続した上、Mathematicaからこの2軸を制御してみる。

このプロジェクトは、パン・チルト2軸制御テーブルに搭載するセンサーを特定せずに、開発したものである。制御システムは以下のようなレイヤー構造を持っている。
(1) PWM設定のためのシェルスクリプト
(2) チルト角度あるいはパン角度を与えた場合に、現在位置から与えた角度に移動する制御関数
(3) チルト角度とパン角度を同時を与えて、2軸を少しずつ動かして目標角度に移動する制御関数
(4) コニカル・スキャンする2軸角度データを作り、このデータから2軸制御テーブルを動かす制御関数

パン・チルト2軸制御テーブルが動作する様子は、YouTubeに投稿してある。リンクを貼っておいたのがこれ。 ソースはここ
2018年8月

12. 二軸テーブルに搭載した超音波距離計によるコニカルスキャン

photo
2軸のパン・チルト・テーブルに装着した超音波距離計

二軸テーブルの制御については作ってあるので、これに超音波距離計を搭載して、これを用いてコニカルスキャンするシステムとした。問題となるのは、超音波距離計の仕組みから云って、トリガー信号を距離計に送ってから、リターンパルスの長さを測定する必要があるのだが、これをRaspberryPiで実現するのが困難なことである。他方、Arduinoはこれを容易に実現するピンと関数が準備されている。

photo
ラズベリーパイ・コンテスト2018優良賞

そこで、ATtiny85で超音波距離計を制御し、測定結果をI2C経由でRaspberryPiが受け取る仕組みとした。もう一つの問題は、超音波距離計が5Vで動作することである。ATtiny85は5Vの電圧で動作するのであるが、RaspberryPiのピン電圧は3.3Vであるので、両者の電圧差を吸収するための、レベルシフターが必要となった。

測定結果は、16個の測定点を円周上に配置して、距離を色で表現した上、Dynamicに書換えることとした。

超音波距離計のコニカルスキャナーが動作する様子は、YouTubeに投稿してある。リンクを貼っておいたのがこれ。このシステムで、ラズベリーパイ・コンテスト2018に応募中である。

p.s.2018年12月8日

で、ラズベリーパイ・コンテスト2018は、優良賞ということで、賞状と賞品のAmazon買い物券¥1000をゲットしたのだ。


2018年10月

13. ST5032 LCDとI2Cバスリピーターを使った表示

photo
RaspberryPi Zero -> PCA9515 I2C bus-repeater -> ST5032 LCD

正確に言えばLCDドライバーであるST5032は、小電力消費を特徴としているICであるので、I2CをもってRaspberryPiと接続する場合には問題が生じる。最初に嵌ってしまったのは、ST5032をATtiny85にI2Cで接続するのには何の問題もないのに、これをRaspberryPiに接続しようとすると動作が不安定になってしまうことだった。

これは誤接続をしてしまったせいで、壊してしまったのかと思ったのだが、どうもそうでもないようだ。あちこちをググってみると、RaspberryPiのGPIOピンのプルアップに抵抗値が低めの内部抵抗が設定されている、つまりプルアップされたI2C信号を定格に見合うLowレベルに引くためには、それなりの電流が必要で、ST5032は省電力設計であるゆえに、RaspberryPiのプルアップされたGPIOピンを、Lowにするために必要なシンク電流を引き込めないことが、不具合の原因だった。これを解消するためには、I2Cバスリピーターを途中に挟まなくてはいけないことが、やっと分かった。

これが分かったのは、秋月電子にRaspberryPi用と打たれたST5032モジュールを発注したあとで、到着したモジュールは、当然のごとくRaspberryPiから制御できた。この発注には、PCA9515バスリピーターも入れてあったので、バスリピーターも使ってみることにしたのだ。と言おうか、ここまでにグダグダがあったのだ。時系列に沿って並べると、
1. ST5032モジュールを購入
2. モジュールは携帯電話に合わせて製造されているので、これを標準の基盤に半田付けし、プルアップ抵抗やコンデンサを追加
3. ATtiny85に制御プログラムを入れて、動くことを確認
4. RaspberryPiに接続しても動作が不安定である
5. 問題がプルアップ抵抗やコンデンサのマッチングかとST5032+インターフェース基盤を購入
6. 新しいST5032をインターフェース基盤に半田付け
7. RaspberryPiに接続しても同じような不具合が発生
8. ST5032にはI2Cバスリピーターが必要であることが判明
9. RaspberryPi用ST5032モジュールとPCA9512を発注
10. RaspberryPi用ST5032モジュールが動作することを確認
11. PCA9512をSOT23基盤に半田付け
12. RaspberryPiからPCA9512を介してST5032が動作することを確認
13. ST5032に何を表示しようかと考えて、vcgencmdで得られるダイ温度、メモリ使用量、クロック速度などを表示することに

結局のところ、ST5032 LCDモジュールを3個購入することとなったのだ。単価は数百円であるのだけれど。

I2Cバスリピーターに拘ったのは、もう一つ訳があって、爪の間に入る程の小さいチップ部品やICを基盤にはんだ付けする手法に慣れる、という目的があるのだ。ルーペで拡大しながら、基盤に極小のチップをはんだ付けするのには、ノウハウが必要で、セロテープや瞬間接着剤で固定したり、はんだ吸い取りワイヤを駆使したり、小容量のはんだごてと、細いはんだを準備したり、こて先のチップの形状や、こて先チップの当て方などに、慣れも必要なのだ。

出来上がった結果は地味なのだが、ノウハウが詰まっているので、YouTubeに投稿してある

ソースはここ


2018年10月

top