プログラムでドローンを飛ばそう一 Chapter 3 3.3 環境をセットアップしよう ! さて API も決まったところで次はいよいよ環境セットアップです。 今回構築する環境は以下の通りです。 : Windows 10 Professional OS : lntel Corei5 ー 4570 2. 90Ghz 64bit CPU MEM : 8. OGB OTHER : 内臓 Bluetooth なし セットアップは以下の順番で行います。 Micro Soft のしつこいアップデート勧告にうつかりミスし て乗ってしまったため OS のバージョンは 10 ですが他のバージョンでも問題ないはずです。すでに PC で BIuetooth が使える人は①の手順の前半は飛ばして下さい。 ① BIuetooth アダブタの追加 ② Node. js のインストーノレ ③ python と VisuaI Studio のインスト ーノレ ④ Node. js のモジューノレインストーノレ BIuetooth アダブタの追加と設定 まずは PC とドローンが通信出来ないと意味がありません。すでに Bluet 。 oth アダブタが使える PC な ら問題ないですが、そうでない場合まずは BIuet 。 oth アダブタを購入します。 Amazon にて 1500 円前 後で購人可能です。 私は「サンワサプライ Bluetooth 4.0 USB アダブタ (classl) MM-BTUD43 」の Class1 を買いました。 Class は 1 と 2 があるのですが、 Class2 が通信距離 10m に対して Class1 が 100m 、 10m だと心許無 いですし価格も 300 円くらいしか変わらないので CIass1 がお勧めです。 (Windows を通すと通信距離 が 1 / 10 くらいになるという噂も・ S5R1111JR ー新プロファイルに対応ー 最新規格 v 4.0 -LE/EDR. 。 10 Bluet00thV 図 3. BIuetooth アダブタ 53
「伺か」を JavaScript で車輪の再発明 character. JSX use babel' ; import React from react ; export default class Character extends React. component { render ( ) { const chara src return ( く img id={this. props. character} src={chara—src}> く /img> img/' 十 this. props. character 十 ' . png ; comment. JSX use babel' ; import React from react ; export default class comment e.xtends React. component { Chapter 4 render ( ) return ( <p className= comment (this. props. name) onCIick={this. onClickD
ライトにはじめる LLVM Python は 64bit 環境だと int 、 float は 64bit となっているので、気をつけてください。 Chapt er2 i32 f32 ir. IntType(32) ir. FIoatType() def get_ir_type(v) : 型推論が終わったら LLVM IR を生成していきます。こでは LLVMCodeGenerator を定義 ロ LLVM IR へ変換 return self. generic visit(node) node. type get_ir_type(node. n) def visit_Num(se1f, node) : class TypeInferencer(ast. N0deVisitor) : AST を visit していき、変数が現れた場合に、その node に type を付与していきます。 上記のように python のデータ型から LLVM IR のデータ型に変換する関数を準備します。 else: return raise Exception("ERROR, unknown type") print("type: return i32 int: elif t return f32 float: if t # float なら f32 、 int なら i32 しました。 class LLVMCodeGenerator(ast. NodeVisitor) : init_(self, ret_type) : def # 省略 def generic visit(self, node): return ast. NodeTransformer. generic visit(self, node) この LLVMCodeGenerator の動作はすごくシンプルです。純粋に AST を辿っていき、構文 に対して対応する LLVM のコードを IRBuiIder で作っていくだけです。ただし、実装はシン 44
Chapter4 maln. JSX use babel' ; 「伺か」を JavaScript で車輪の再発明 import React from react export default class Main extends React. component { render ( ) { return ( ・ く /main> く main> return ( render ( ) { ・・ ) } で、 HTML を整形して出力する感じですね。 く div id= character—unyu' > く /div> <div id= comment_unyu' 〉く /div> <div id= character—sakura' > く /div> <div id= comment_sakura' 〉く /div> 72 あとは、 jsx ファイルを呼び出します。
llvmlite ではじめる JIT コンパイラ IChapter 2 M0du1e:{'b0dy' FunctionDef:{ ・ args ・ く [ く _ast. FunctionDef object at 9X7f96144Cfdd9 > ] } ast. arguments object at 9X7f96144dbd59 〉 , 'lineno' ・ body' : [ く ast. Return object at 9X7f96144e7150 〉 ] , 1 , 'decorator list' 'returns None, name arguments: { ・ kwonlyargs ・ 9X7f96144df5d9 〉 , く ast ・ arg object at 9X7f96144e3319 > ] , [ ] , 'kw_defaults' ' ( 01 offset ・ : 9 } None, 'vararg': None, None, ・ kwargannotation ・ ・ kwarg [ く _ast. arg object at 'defaults' varargannotation None} arg:{ ・ annotation ・ None, arg:{'annotation ・ None, Return:{ ・ ( 01 offset ・ : 4 , 9X7f96144e7259 > } a rg a rg 'lineno• 2 , BinOp:{ ・ right' く ast. Name object at く ast. Add object at 9X7f961453fb59 〉 , 9X7f96144e7399 〉 , 01 offset' Name:{'Iineno ・ ・ C01 offset' : 11 } Load:{} Add:{} Name:{ ・ lineno' 01 offset' Load:{} : 15 } ー id ー ー id ー X : 11 } 'ctx' 'ctx' 'value' く ast. BinOp object at 9X7f96144e7219 〉 , 'lineno• 'left ー く ast. Name object at く ast . Load object at eX7f961453f119 〉 , く ast . Load object at 9X7f961453f119 > , ロ AST から LLVM IR を生成する 43 キャストがないとルールを決めたため、割とアホな推論でも上手くいくのです。ちなみに 引数の型は実行時に値を渡した段階で判明するので、そこから型を推論していきます。 return ast . NodeTransformer. generic visit(self, node) def generic visit(self, node): # 省略 def init_(self, args) : class TypeInferencer(ast. NodeVisitor) : ます。 ast. NodeVisitor を継承して、 AST を辿れるようにしています。 ないのです。そのため、まず型推論から実施しましよう。 TypeInferencer class を定義し がありません。なので、例えば変数 a があっても、それが int なのか fl 。 at なのかわから があります。 Python は動的型付けプログラミング言語のため、型を明示的に記載すること AST の作成方法がわかったので、さっそく LLVMIR を生成したいところですが、 1 っ問題
Chapter2 2 , 3 ) Python の関数を定義する 関数を AST ( 抽象構文木 ) に変換する AST から LLVM IR へ変換を実施する 引数の値を渡して実行する Pass で LLVM IR を最適化する ライトにはじめる LLVM ちなみに Python コードのイメージはこんな感じです。 def add(), b, ( ) : return a 十 b 十 ( compiler. exe(add, r et print(ret) ロ AST をつくる 1 , AST を作成するのは非常に簡単で、 Python の標準ライプラリを使えば OK です。以下、サ return X 十 y def func(), y) : xmport inspect xmport ast ンプルです。 class ASTTraverser(ast . NodeVisitor) : def generic_visit(self, node) : print("{}:{}". format(type(node) ・ name ast. NodeVisitor. generic visit(self, node) node. dict 実行結果は以下の通りです。ちょっと見にくいですね、 42 ごめんなさい。