Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

「Pythonでやってみた」~広がるプログラミングの愉しみ~

2,068 views

Published on

Slide deck of Keynote Speech at PyCon JP 2018, 18 Sep 2018.

Published in: Engineering
  • Be the first to comment

「Pythonでやってみた」~広がるプログラミングの愉しみ~

  1. 1. Pythonでやってみた ~広がるプログラミングの愉しみ~ 2018-09-18 ransui@live.com
  2. 2. お前誰よ Ransui Iso (磯 蘭水) AWS Enterprise Support Senior Technical Account Manager Since 2015-05 Past. • Software Developer / Architect • Part-time Lecturer for IT engineers • University Faculty • Writer / Translator
  3. 3. お前誰よ:学生時代 • Distributed AIの研究 • IJCAI ’97 RoboCup Simulation League Best 8 A Multi-layered Planning Architecture for Soccer Agent. RoboCup-97: Robot Soccer World Cup I. Lecture Notes in Computer Science 1395 Springer Common LispとCを使っていたが、研究室のメ ンバーがLispを読み書きできない問題が発生し、 Pythonを使い始める
  4. 4. お前誰よ:社会人になって • Software Developer • Ultraseek Search Engine • Ultraseekを利用したアプリケーション開発 • ライバルはNTTのInfobee 当時Infobeeをチューニングしまくっていた方が、 10年後に親会社の社員として登場!お互いにライ バル視していたらしい
  5. 5. お前誰よ:社会人になって • Software Developer • amazonが日本に来る前に総合e-Commerceサ イトの開発(結局amazonに負けた…) • 商品情報管理システム • 商品データ・メタデータ管理 • 検索エンジン • 在庫・物流システムとの連携 開発チーム 6人 開発期間 4ヵ月
  6. 6. お前誰よ:社会人になって • AD Technology Company Tech Lead. • 技術・ビジネス戦略 • エンジニア採用・チームビルディング • プロジェクトマネージメント・スクラムマスター • アーキテクティング • プログラミング • システム管理 • ラックマウント・ケーブリング! ライバルはYahoo Japan & Google 超レッドオーシャン&無謀な戦い
  7. 7. お前誰よ:翻訳とか
  8. 8. プログラミング 2つの動機
  9. 9. 面倒くさいことを簡単に
  10. 10. いったいどうなっているんだ? おもしろそう
  11. 11. 雑な対比 めんどうくさい おもしろそう 手間をかけずに最大の成果 手間暇かけて小さな結果 目的を達成する手段 手段そのものが目的 誰かの役に立つ(かも) 自己満足とドヤ顔 ありものを最大限に活用 車輪の再実装
  12. 12. どちらが正しいという訳ではない • いずれにしても「仕組みの理解」は非常に重要 • 対象はなにか • 実現したい事はなにか • いかにして実現するか
  13. 13. どちらが正しいという訳ではない • いずれにしても「仕組みの理解」は非常に重要 • 対象はなにか • 実現したい事はなにか • いかにして実現するか Algorithm Data Program Niklaus Wirth
  14. 14. プログラミングが出来るということ • プログラミングは何かを実現・表現するための強力な武器 • 絵を描く事 • 楽器を弾くこと • 彫刻・造形・・・
  15. 15. プログラミングでできること • プログラミングは何かを実現・表現するための強力な武器 • 絵を描く事 • 楽器を弾くこと • 彫刻・造形・・・ 「何か」を操作することで 出力としての結果を得るという観点からみれば 「Art」とされる領域の活動となんら変わりはない
  16. 16. プログラミングの美味しいところ • PC1台あればOK • 電気以外に資源を消費しない • 時間・・・・精神力・・・・周辺機器・・・・気にしちゃだめ! • 幾らでも試行錯誤できる • 身に着けた技は意外と色々な所で便利だったりする • 逆に、身に付けている技が意外な所で役に立つことも
  17. 17. 「やってみた」
  18. 18. 子供のために作った玩具 • YAMAHA TENORI-ON • すごく楽しそうな電子楽器 • 残念ながらもう売ってない
  19. 19. 子供のために作った玩具 • YAMAHA TENORI-ON • すごく楽しそうな電子楽器 • 残念ながらもう売ってない • 実はCommon Lispで制作 • LispBuilder-SDL • CLOS • Multi-Thread
  20. 20. 子供のために作った玩具 • YAMAHA TENORI-ON • すごく楽しそうな電子楽器 • 残念ながらもう売ってない • 実はCommon Lispで制作 • LispBuilder-SDL • CLOS • Multi-Thread • ライブコーディング • 子供の見ている前でインクリメンタルに 開発した
  21. 21. notes Notes Notes 中の仕組み Sound Patch Timer ALSA Mixer Button Row Button Row Button Grid Note On Pointer
  22. 22. ようするにすごく単純 • グリッド上のボタンがOn状態 • 音を出す • グリッド上のボタンがOFF状態 • 音を出さない • タイマー • スレッドを1つ作って(sleep)しながらループ • (sleep)から抜けると[Note on Pointer]を一つずらしてButton Gridに メッセージを送る • ButtonGirdは[Note on Pointer]の指す位置のボタンをスキャンして ALSA Mixerに送るSound Patchを決める
  23. 23. 音そのものを合成したい • Tiny TENORI-ONはサウンドパッチを再生するだけ • 音データを用意すればいくらでも色々なことができる • フリーのパッチデータもいっぱいある
  24. 24. 音そのものを合成したい • Tiny TENORI-ONはサウンドパッチを再生するだけ • 音データを用意すればいくらでも色々なことができる • フリーのパッチデータもいっぱいある • 音データだって最終的には「数値」の列 • コンピュータは計算機 • なんらかの方法で数字列を作れば「音」として出力される。はず。
  25. 25. シンセサイザーは 漢のロマン
  26. 26. シンセサイザーは 漢のロマン だけれども、いきなりこのレベルから突入するのは 流石にきびしい
  27. 27. PSG • Programmable Sound Generator 1986年11週製造とか!
  28. 28. PSG • 発振器3チャンネル • 矩形波 • 8オクターブ • ノイズ発生器1チャンネル • 周波数指定可能 • ホワイトノイズ • エンベローブジェネレータ • 1系統 • プリセットパターン • ミキサ • 音量調整16段階 • モノラル出力
  29. 29. PSG • 発振器3チャンネル • 矩形波 • 8オクターブ • ノイズ発生器1チャンネル • 周波数指定可能 • ホワイトノイズ • エンベローブジェネレータ • 1系統 • プリセットパターン • ミキサ • 音量調整16段階 • モノラル出力 Tone Generator Tone Generator Tone Generator Channel A Switch Channel B Switch Channel C Switch Noise Generator AMP Envelope Generator Channel A Volume Channel B Volume Channel C Volume
  30. 30. PSG • 発振器3チャンネル • 矩形波 • 8オクターブ • ノイズ発生器1チャンネル • 周波数指定可能 • ホワイトノイズ • エンベローブジェネレータ • 1系統 • プリセットパターン • ミキサ • 音量調整16段階 • モノラル出力 Tone Generator Tone Generator Tone Generator Channel A Switch Channel A Switch Channel C Switch Noise Generator AMP Envelope Generator Channel A Volume Channel B Volume Channel C Volume これなら作れそう
  31. 31. PSGの制約 • 矩形波しか出せない • ピコピコ音 • 3和音まで • 発振器が3個しかないから • エンベローブ • チャネルごとに独立して 設定不可 • パターンはプリセット された数種類のみ • ミキサ • モノラル出力 Tone Generator Tone Generator Tone Generator Channel A Switch Channel B Switch Channel C Switch Noise Generator AMP Envelope Generator Channel A Volume Channel B Volume Channel C Volume
  32. 32. せっかくPythonで実装するなら • 発振器 • 多チャンネルにする • 実際には処理速度の問題で制約は出る • 波形は矩形波のみ • 実装が簡単だから。フーリエ先生ごめんなさい。 • ノイズジェネレータは簡単に実装できるけれど今回はパス • エンベロープ発生器 • ボリュームコントロールで代用 • 8bit時代も「ソフトウェアエンベロープ」で頑張ったし • ステレオ出力対応 • 発振器は左右同音量のデータを出力する • ボリュームで左右音量を調整できるようにする
  33. 33. さて、どうやって実装するか • まずは最も単純な構成を考える • 最初から全部やろうとしないのがミソ
  34. 34. さて、どうやって実装するか • まずは最も単純な構成を考える • 最初から全部やろうとしないのがミソ Tone Generator Channel A Volume AMP
  35. 35. さて、どうやって実装するか • まずは最も単純な構成を考える • 最初から全部やろうとしないのがミソ Tone Generator Channel A Volume AMP OSとハードウェアレイヤ • PySDL2/Mixer • ALSA
  36. 36. さて、どうやって実装するか • まずは最も単純な構成を考える • 最初から全部やろうとしないのがミソ Tone Generator Channel A Volume AMP OSとハードウェアレイヤ • PySDL2/Mixer • ALSA PCMデータ化 入力:0 ~ 1までの実数列 出力:チャンク化されたPCMデータ
  37. 37. さて、どうやって実装するか • まずは最も単純な構成を考える • 最初から全部やろうとしないのがミソ Tone Generator Channel A Volume AMP OSとハードウェアレイヤ • PySDL2/Mixer • ALSA 矩形波データを生成 入力:周波数 クロックカウンタ 出力:0 or 1 の数列 PCMデータ化 入力:0 ~ 1までの実数列 出力:チャンク化されたPCMデータ クロックカウンタ 入力:サンプリング周波数 出力:現在時刻 (t)
  38. 38. さて、どうやって実装するか • まずは最も単純な構成を考える • 最初から全部やろうとしないのがミソ Tone Generator Channel A Volume AMP OSとハードウェアレイヤ • PySDL2/Mixer • ALSA 矩形波データを生成 入力:周波数 クロックカウンタ 出力:0 or 1 の数列 正確にはアッテネータ 入力:減衰率(左右チャネル独立指定) 出力:0 ~ 1までの実数列 PCMデータ化 入力:0 ~ 1までの実数列 出力:チャンク化されたPCMデータ クロックカウンタ 入力:サンプリング周波数 出力:現在時刻 (t)
  39. 39. さて、どうやって実装するか • まずは最も単純な構成を考える • 最初から全部やろうとしないのがミソ Tone Generator Channel A Volume AMP OSとハードウェアレイヤ • PySDL2/Mixer • ALSA 矩形波データを生成 入力:周波数 クロックカウンタ 出力:0 or 1 の数列 正確にはアッテネータ 入力:減衰率(左右チャネル独立指定) 出力:0 ~ 1までの実数列 PCMデータ化 入力:0 ~ 1までの実数列 出力:チャンク化されたPCMデータ クロックカウンタ 入力:サンプリング周波数 出力:現在時刻 (t)
  40. 40. 具体的な実装の方針を考える • パーツの性質を観察して共通している姿を探す Component Processing Input Output
  41. 41. 具体的な実装の方針を考える • パーツの性質を観察して共通している姿を探す Component Processing Input Output Component Processing Input Output Component Processing Input Output
  42. 42. 具体的な実装の方針を考える • パーツの性質を観察して共通している姿を探す • 使える機能を探してうまくあてはめる Method Queue Queue Method Queue Thread Thread • データの受け渡し • queue.Queue • データ処理 • threading.Thread こうしておけば、各コンポーネントは自力で データを取得しに行く必要は無く、ただ口を 開けて待っていればOK
  43. 43. 3チャンネルのPSGもどき • こんな感じになる Tone Generator Tone Generator Tone Generator Attenuator Attenuator Attenuator + SDLMixer
  44. 44. 音は出せるけれど・・・・ • これだけでは「音楽」を演奏することはできない Tone Generator Tone Generator Tone Generator Attenuator Attenuator Attenuator + SDLMixer
  45. 45. 音は出せるけれど・・・・ • これだけでは「音楽」を演奏することはできない Tone Generator Tone Generator Tone Generator Attenuator Attenuator Attenuator + SDLMixer 「演奏者」不在
  46. 46. 「音楽」を考える • 音楽を構成する要素を考える
  47. 47. 「音楽」を考える • 音楽を構成する要素を考える • 「楽譜」が表しているものは何か?
  48. 48. 「音楽」を考える • 音楽を構成する要素を考える • 「楽譜」が表しているものは何か? 1.音の高さ 発信器の周波数 2.音を出すタイミング クロックカウンタの値 3.音を出し続ける長さ クロック長
  49. 49. シーケンサの原理 • 「音程」「KeyOnタイミング」「音長」を制御する Tone Generator Sequencer 周波数 Attenuator 減衰率 Clock Command Value 0 SetVolume (1.0, 1.0) 0 SetFreq 440.0 22050 SetFreq 0.0 22050 End シーケンスデータは単純に(Clock, Command, Value)と いう構成のタプルのリストとして表現してしまう。 わざわざクラス化するまでもない。
  50. 50. シーケンサの原理 • 「音程」「KeyOnタイミング」「音長」を制御する Tone Generator Sequencer 周波数 Attenuator 減衰率 Clock Command Value 0 SetVolume (1.0, 1.0) 0 SetFreq 440.0 22050 SetFreq 0.0 22050 End シーケンスデータは単純に(Clock, Command, Value)と いう構成のタプルのリストとして表現してしまう。 わざわざクラス化するまでもない。 そういやMIDIなんて物も ありましたっけ!
  51. 51. シーケンスデータの作成 • シーケンスデータを作成するのは人間には酷な話 Clock Command Value 0 SetVolume (1.0, 1.0) 0 SetFreq 440.0 22050 SetFreq 0.0 22050 End 音程 :周波数を計算して値を決定 音長 :サンプリング周波数・テンポ指定・音符指定より計算 KeyOn :音長の累積値から計算
  52. 52. シーケンスデータの作成 • シーケンスデータを作成するのは人間には酷な話 Clock Command Value 0 SetVolume (1.0, 1.0) 0 SetFreq 440.0 22050 SetFreq 0.0 22050 End 音程 :周波数を計算して値を決定 音長 :サンプリング周波数・テンポ指定・音符指定より計算 KeyOn :音長の累積値から計算 楽譜相手にハンドアセンブル…
  53. 53. 少しでも文化的な入力環境 • もう少し「楽譜」っぽい表現でシーケンスデータを記述したい • シーケンサは単純なままにしておきたい
  54. 54. 少しでも文化的な入力環境 • もう少し「楽譜」っぽい表現でシーケンスデータを記述したい • シーケンサは単純なままにしておきたい • つまり・・・ 何らかの Human Readable な表現形式 Sequencerが 直接実行できる シーケンスデータ
  55. 55. 少しでも文化的な入力環境 • もう少し「楽譜」っぽい表現でシーケンスデータを記述したい • シーケンサは単純なままにしておきたい • つまり・・・ 何らかの Human Readable な表現形式 Sequencerが 直接実行できる シーケンスデータ 音楽を表現するための 「楽譜記述言語」
  56. 56. 少しでも文化的な入力環境 • もう少し「楽譜」っぽい表現でシーケンスデータを記述したい • シーケンサは単純なままにしておきたい • つまり・・・ 何らかの Human Readable な表現形式 Sequencerが 直接実行できる シーケンスデータ 音楽を表現するための 「楽譜記述言語」 「楽譜記述言語」を シーケンスデータへ変 換する
  57. 57. 少しでも文化的な入力環境 • もう少し「楽譜」っぽい表現でシーケンスデータを記述したい • シーケンサは単純なままにしておきたい • つまり・・・ Compiler 何らかの Human Readable な表現形式 Sequencerが 直接実行できる シーケンスデータ 音楽を表現するための 「楽譜記述言語」 「楽譜記述言語」を シーケンスデータへ変 換する
  58. 58. 楽譜記述言語 • MML : Music Macro Language • 古より伝わる古代語で多数の方言に分化 • 「音色」や「表現(トレモロ等)」を記述できるようなものもある コマンド 引数 意味 T 整数値 テンポ指定 V 0~15 ボリューム指定 L 1 ~ 64 デフォルト音長設定 O 1~8 オクターブ指定 > 無し 1 Octaveアップ < 無し 1 Octaveダウン R 1 ~ 64 休符 C, D, E, F, G, A, B 1 ~ 64 音符 + 無し 半音Up - 無し 半音Down 基本的なものを抜粋 なにせ歴史が長いので方言毎 の派閥があったりもする!!
  59. 59. MML • 実際の記述例 L4G>D<B-.A8 L8GB-AGF+AB4 GDADB-A16G16AD L16G8DGA8DAB-8AGAD>DC T120O4V15
  60. 60. Sequencer Attenuator Attenuator Attenuator 実際に1曲演奏させてみる • コンポーネントの構成はこんな感じ Tone Generator + SDLMixer Tone Generator Tone Generator Tone Generator Attenuator Duplicator + Sequencer Sequencer Sequencer Attenuator L0 : R1 Attenuator L1 : R1 Delay (1100 tick) InverterSequence Data
  61. 61. Sequencer Attenuator Attenuator Attenuator 実際に1曲演奏させてみる • コンポーネントの構成はこんな感じ Tone Generator + SDLMixer Tone Generator Tone Generator Tone Generator Attenuator Duplicator + Sequencer Sequencer Sequencer Attenuator L0 : R1 Attenuator L1 : R1 Delay (1100 tick) InverterSequence Data 音に厚みを出すためにエフェ クトを入れている
  62. 62. それでは 1曲お聞きください
  63. 63. Johann Sebastian Bach 1685-1750 Fugue in G minor, BWV 578
  64. 64. こんな趣味のプログラミングでも
  65. 65. ふたを開けてみれば・・・ • 疎結合オブジェクトモデル • マルチスレッドプログラミング • (疑似)リアルタイム処理 • DSLの開発 • 言語の設計 • コンパイラ • バイトコードインタプリタ • 音響データ操作と再生の基本 • PySDL2とか
  66. 66. ふたを開けてみれば・・・ • 疎結合オブジェクトモデル • マルチスレッドプログラミング • (疑似)リアルタイム処理 • DSLの開発 • 言語の設計 • コンパイラ • バイトコードインタプリタ • 音響データ操作と再生の基本 • PySDL2とか これらの技術を「使おう」とか 「学ぼう」と思って制作を始めた わけではない点に注意 やりたいことを実現するためにア レコレ試していたら、結果として これらをやっていたということ 当然のことながら、途中で各種資 料を参照したりはしている
  67. 67. その他にも
  68. 68. Zope – Z Object Publishing Environment • 色々言われるが10年時代を先取りしていた • Pythonの動的な性質をフル活用した柔軟なシステム • 「Acquisition」という画期的なアイディア • 生きた「インスタンス」を格納するZODB • Webブラウザから利用できるフル開発環境 ZODB Z Publisher TAL/METAL/DTML Medusa/ZServer
  69. 69. Zope – Z Object Publishing Environment • 色々言われるが10年時代を先取りしていた • Pythonの動的な性質をフル活用した柔軟なシステム • 「Acquisition」という画期的なアイディア • 生きた「インスタンス」を格納するZODB • Webブラウザから利用できるフル開発環境 ZODB Z Publisher TAL/METAL/DTML Medusa/ZServer 全てを統合したが故の複雑さに押しつぶされた感があるが、 Zopeを構成する各種の実装・アイディアそれぞれには、現在で も注目すべき点は多い
  70. 70. 10年以上使っている俺様Web Framework • Zopeは凄かったが毛深すぎた • 「お作法」は少ない方がいい • URLのパスとオブジェクトの包含関係が対応しているのがいい • Regexとかつかって「ルーティング」するのは性に合わない • そういうのは上位のWebサーバでやればいい派 • ZODBはやりすぎ • 必要な時にインスタンスを作成すればいい • 永続データの記憶は外部DBMSに任せる • レンダリングエンジンは自分の好みの物を使いたい • 生Octet Streamとかも自然に使えるようにしたい
  71. 71. 10年以上使っている俺様Web Framework • 現代的にWSGIアプリケーションとして動作 • 最初はApache + mod_pythonだった • アプリケーションはクラスオブジェクトの階層として表現 • 継承関係ではなくクラスメンバに別のクラスオブジェクトをセットする • クラスそのものがオブジェクトとして実行時に簡単に操作できるというPythonの性質を使う https://example.com/foo/bar/baz → getattr(root, “foo”) getattr(foo, “bar”) getattr(bar, “baz”) • 最後にtype(baz)をして • Class Objectならインスタンス化して “default” メソッドをCall • Function/Method ObjectならそのオブジェクトをCall • 必要に応じてインスタンス化が行われスレッド独立になるので考えることが少なくて済む • レンダリングの指定はデコレーターで指定 • 個人的な趣味でGenshiが標準
  72. 72. 結局のところ
  73. 73. • 疎結合オブジェクトモデル • マルチスレッドプログラミング • (疑似)リアルタイム処理 • DSLの開発 • 言語の設計 • コンパイラ • バイトコードインタプリタ • 音響データ操作と再生の基本 • PySDL2とか PSGもどきを作った時のこと (再掲)
  74. 74. 出来上がっているものを模倣する • プロダクトとしての完成品 • 実現されていること • 表現形式 • 内部構造・モデル
  75. 75. 出来上がっているものを模倣する • プロダクトとしての完成品 • 実現されていること • 表現形式 • 内部構造・モデル モデルを真似して「再実装」してみる アイディアそのものの「再発明」ではない
  76. 76. 作ってみることのご利益 • 「なぜそのようになっているのか」 • 「どのようにして実現するのか」 • 「どこが簡単で、どこが難しいのか」 • 「使える道具はどれで、使えない道具はどれなのか」 • 「どこがコアで、どこからが応用なのか」 これらの見当識はエンジニアにとってどれも非常に大切
  77. 77. Pythonの良いところ • 大抵のものはほとんど揃っている • Web開発 • ネットワーク系 • GUI • 機械学習/AI系 • 数値解析・分析 • メディア系 • 制御系 仕事に便利に使えるのはもちろん だが、趣味的なプロジェクトのた めにも非常に便利
  78. 78. Pythonの良いところ • 大抵のものはほとんど揃っている • Web開発 • ネットワーク系 • GUI • 機械学習/AI系 • 数値解析・分析 • メディア系 • 制御系 仕事に便利に使えるのはもちろん だが、趣味的なプロジェクトのた めにも非常に便利 しかも、大抵はOSSとして提供さ れていて、アイディアをどう実現 しているかも見放題
  79. 79. 学習する能力は 知識・経験量に比例する
  80. 80. 「Python使って意外と 簡単にできましたよ」
  81. 81. Thank You For Attending. Happy Hacking with Python, Everyone!

×