daruma3940の日記

理解や文章に間違い等あればどんなことでもご指摘お願いします

Unityのml-agents使ってみた

github.com
f:id:daruma3940:20160520223745p:plain

Unityのml-agents使ってみたので忘れる前に記録しておこうじぇ??


.......


......


...
f:id:daruma3940:20160520223745p:plain

もう忘れたwww





とりあえず記憶を呼び起こしながらでも今書いておかないとあとからまた思い出すのに手間取ってしまうのでがんばれ自分!!!

とりあえず上のリンクにあるwikiを見ながらやっていけば基本いける

Unityで作った環境(実行ファイルは ml-agents\pythonに置くのが安全(exeファイルだけじゃなくてDataフォルダも一緒に置かないと動かないので注意な)
env_name
には
env_name = "TestBall2"
みたいな感じで実行ファイルから.exeを除いた名前を置いておく。ちょっとわかりにかった(ソースコード読んで理解した。)
この指定の仕方が嫌ならソースコードを改変すればよろし

学習するときはBrain(Script)のType of BrainをExternalにしておく。
Type of brainのtypeにはPlayer, Hulistic, External, Internalの4タイプがある。
PlayerはPlayer Actionを決めることで人間が動かすモード
Hulisticは手で書いたコードを動かすモード
Externalは学習するときのモード
Internalは学習させたモデルを使って動かすときのモード
InternalモードはTensorFlow# AssetをUnity Projectに入れて PlayerSettingのScripting Define SymbolにENABLE_TENSORFLOWを追加して Scripting Runtime VersionをExperimental(.Net4.6)にしないといけないはず


自分の作った環境で
学習させたりするのは大変そうに見えるかもしれないけどそんなに難しくないはず
AcademyとAgentとDecisionを作成した環境に合わせて弄ってやるだけでいい。
ML-AgentをgithubからダウンロードしてきたところについてるTemplateフォルダに雛形があるのでそれを弄れば基本出来るはず


CollectState()関数でStateにおける特徴をリストにして返す{{Brain(Script) InspectorのStateSizeはここの特徴の数を入力する}}
AgentStep(float[] act),AcademyStep()はFixedUpdate()で毎回呼ばれる処理を記述する
Agent.done=trueで今回の試行が終わったフラグを立てる
AgentReset(),AcademyReset() はdone=trueになった後次の試行へ移るときに呼び出される
Agent.rewardは報酬
Decisionについてはよくわかってない

学習時にはml-agents\python内のppo.pyかPPO.ipynbを使えばいい
exeファイルのレスポンスがタイムアウトすることがよくあった。私の場合jupyter notebookを再起動したらタイムアウトしなくなったのでよくわからない。


wikiにはSplashImage(ゲームを開始したときに出てくるロゴ)の表示はOFFにしておけと書いているが、nonProUnityではオフにできないしONにしてても起動に時間がかかるようになるだけでちゃんと動くから大丈夫。

AndoridでInternalmodeを動かすことに成功したのでこれを利用したAndroidアプリも作れる

f:id:daruma3940:20160520223745p:plain
まあwikiに書いてないことで特記しておくことはこれぐらいかだじぇ...????

行列 ベクトル 微分

f:id:daruma3940:20160520223745p:plain
これであってるはずなのだけれど間違ってたら教えてほしいのじぇ。




 A = \left(
    \begin{array}{ccc}
      a_{11} & a_{21}  \\
      a_{12} & a_{22} 
    \end{array}
  \right)
\\
 \vec{x }= \left(
    \begin{array}{c}
      x_1 \\
      x_2 
    \end{array}
  \right)
\\とすると\\
\vec{y}=A \vec{x}=\left(
    \begin{array}{c}
      a_{11} x_1+a_{21} x_2 \\
      a_{12} x_1+a_{22} x_2 
    \end{array}
  \right)
≡ \left(
    \begin{array}{c}
      y_1 \\
      y_2 
    \end{array}
  \right)
\\となる\\
\\ここで\\
\frac{ \partial \vec{y} }{ \partial \vec{x} } = 
\left(
\begin{array}{ccccc}
\frac{ \partial {y}_{1} }{ \partial {x}_{1} } & \cdots & 
\frac{ \partial {y}_{j} }{ \partial {x}_{1} } & \cdots & 
\frac{ \partial {y}_{m} }{ \partial {x}_{1} }\\
\vdots & \ddots & & & \vdots \\
\frac{ \partial {y}_{1} }{ \partial {x}_{i} } & & 
\frac{ \partial {y}_{j} }{ \partial {x}_{i} } & & 
\frac{ \partial {y}_{m} }{ \partial {x}_{i} } \\
\vdots & & & \ddots & \vdots \\
\frac{ \partial {y}_{1} }{ \partial {x}_{n} } & \cdots & 
\frac{ \partial {y}_{j} }{ \partial {x}_{n} } & \cdots & 
\frac{ \partial {y}_{m} }{ \partial {x}_{n} }\end{array}
\right)
\\というベクトルに対するベクトル微分の定義
http://www.r.dl.itc.u-tokyo.ac.jp/~nakagawa/SML1/math1.pdf

qiita.com

から

\frac{ \partial \vec{y} }{ \partial \vec{x} } 
= 
\left(
    \begin{array}{ccc}
      \frac{ \partial {y}_{1} }{ \partial {x}_{1} } & \frac{ \partial {y}_{2} }{ \partial {x}_{1} }  \\
      \frac{ \partial {y}_{1} }{ \partial {x}_{2} } & \frac{ \partial {y}_{2} }{ \partial {x}_{2} } 
    \end{array}
  \right)
= 
\left(
    \begin{array}{ccc}
        a_{11} & a_{12}  \\
      a_{21} & a_{22} 
    \end{array}
  \right)
=
 {}^t A
\\
\\
\\





\\また\\

\vec{a}_{1}=
\left(
    \begin{array}{ccc}
      a_{11} \\ a_{12}
    \end{array}
  \right)
,
\vec{a}_{2}=
\left(
    \begin{array}{ccc}
      a_{21} \\ a_{22}
    \end{array}
  \right)
\\とすると\\
A=\left(
    \begin{array}{ccc}
      \vec{a}_{1} & \vec{a}_{2}
    \end{array}
  \right)
\\であるので\\


\frac{ \partial f( \vec{x}) }{ \partial \vec{x} } 
= 
\left(
    \begin{array}{ccc}
      \frac{ \partial  f(\vec{x}) }{ \partial {x}_{1} } \\ \frac{ \partial f(\vec{x}) }{ \partial {x}_{2} }
    \end{array}
  \right)

\\より\\


\frac{ \partial \vec{y} }{ \partial A } 
= 
\left(
    \begin{array}{ccc}
      \frac{ \partial \vec{y} }{ \partial \vec{a}_{1} } & \frac{ \partial \vec{y} }{ \partial \vec{a}_{2} }
    \end{array}
  \right)
= 
\left(
    \begin{array}{ccc}
        \left(
    \begin{array}{ccc}
      \frac{ \partial {y}_{1} }{ \partial {a}_{11} } & \frac{ \partial {y}_{2} }{ \partial {a}_{11} } \\
       \frac{ \partial {y}_{1} }{ \partial {a}_{12} } & \frac{ \partial {y}_{2} }{ \partial {a}_{12} } 
    \end{array}
  \right)
&&
\left(
    \begin{array}{ccc}
      \frac{ \partial {y}_{1} }{ \partial {a}_{21} } & \frac{ \partial {y}_{2} }{ \partial {a}_{21} } \\
       \frac{ \partial {y}_{1} }{ \partial {a}_{22} } & \frac{ \partial {y}_{2} }{ \partial {a}_{22} } 
    \end{array}
  \right)
     
    \end{array}
  \right)
\\
= 
\left(
    \begin{array}{ccc}
        \left(

    \begin{array}{ccc}
      x_1& 0 \\
      0 & x_1
    \end{array}
  \right)

&
\left(
    \begin{array}{ccc}
     x_2& 0 \\
      0 & x_2
    \end{array}
  \right)
     
    \end{array}
  \right)
\\

= 
\left(
    \begin{array}{ccc}
      x_1 I & x_2 I
    \end{array}
  \right)
= 
\left(
    \begin{array}{ccc}
      x_1 & x_2 
    \end{array}
  \right)
I
= 
\left(
    \begin{array}{ccc}
      x_1 & x_2 
    \end{array}
  \right)
=

 {}^t \vec{x}

電王トーナメント申し込み始まったみたいなのじぇ

f:id:daruma3940:20160520223745p:plain
電王トーナメントの申し込みが始まったみたいなのじぇ

denou.jp


f:id:daruma3940:20160521003616p:plain
他人事みたいに言うわね....
f:id:daruma3940:20160520223745p:plain
出ようかなぁどうしようかなぁ....

なんかほかにもいろいろやりたいことあるし,研究もあるし、以前みたいに熱中して開発する気は起らないし、
でも研究ややりたいことがいっぱいあるなんて言っても、どうせごろごろして無駄な時間を過ごしそうだし。出なかったら出なかったで後悔もしそうだし。
でも参加申し込みしたら大会のことで頭のメモリが常に何割か占拠されるし、
何日もウィンウィンうなるPCの前で寝るのもつらいし、
学習にi7 4770Kを占拠されて 開発はクッソ遅いi5でしないといけないのもつらいし....

もし出るとしてもまだWCSC27後からRootStrapを成功させたことによるR上昇100しかないし
おそらくトップ勢はR200ぐらい上げてくる気がするので今のままだと相対的に後ろに下がっていることになるし...

まあうちもR200ぐらい上げようと思えばKPPを取り入れてRootStrapで学習させればそれぐらいは行く気がする(簡単だとは言っていない)んだけれど
どこまで巨人の肩に乗り続けるんだよって感じもするし....
一応次の大会でやりたいことはあるけれど、モチベーションを保てるかどうか....
f:id:daruma3940:20160520223745p:plain
とりあえず申し込み期間はまだあるのでもう少しなやもうじぇ??

カオスについて2

daruma3940.hatenablog.com
f:id:daruma3940:20160520223745p:plain
院試も終わったし前回の続きをかくのじぇ
前回2次元調和振動子は摂動を加えられなければトーラスになり、
摂動が弱い場合でも元のトーラスは変形して新しいトーラスができ、摂動が強くなるとトーラスが壊れてカオスが発生するらしいことについて書いたのじぇ。

f:id:daruma3940:20160520223745p:plain
ここでポアンカレマップについて説明するのじぇ。
ポアンカレマップとはトーラスの断面を切り取ったものなのじぇ。
f:id:daruma3940:20170824112349p:plain

2次元調和振動子の場合は変数はx,y,px,pyの4つであるけれど、
ハミルトニアンが一定という条件
{ \displaystyle
H_0 = \sum_{i=1,2} (p_i^2+\omega_i^2q_i^2)/2 
}
から変数(例えばpy)を一つ消せ、
y=0の点となった時に点をプロットするということをすれば
変数はx,pxだけになるので2次元平面に点をプロットできるようになるというわけのじぇ。
↓こんな感じ
f:id:daruma3940:20170824114046p:plain
f:id:daruma3940:20160520223745p:plain
ここで非加積分系について考えようじぇ。
{ \displaystyle
H_0 = (p_x^2+p_y^2+x^2+y^2)/2 -kxy
}

f:id:daruma3940:20170824142059p:plain
周期軌道から少しずらしたものがポアンカレマップのどこに来るのかを考えると

{ \displaystyle
\delta x(T)=M \delta x(0)
}

となるのじぇ。
このMは安定性行列と呼ばれ、保存系ではdet(M)=1となるのらしいのじぇ(よくわかってない)
これはリウビルの定理と呼ばれるものなのじぇ(リウビルの定理って正準変換のところで出てきたけど...)
{ \displaystyle
 M = \left(
    \begin{array}{ccc}
      a & b  \\
      c & d 
    \end{array}
  \right)
}
とすると
{ \displaystyle
M \left(
    \begin{array}{c}
      1 \\
      0 
    \end{array}
  \right)
=
 \left(
    \begin{array}{c}
      a \\
      c 
    \end{array}
  \right)
}
{ \displaystyle
M \left(
    \begin{array}{c}
      0 \\
      1 
    \end{array}
  \right)
=
 \left(
    \begin{array}{c}
      b \\
      d 
    \end{array}
  \right)
}
となり、
f:id:daruma3940:20170824143433p:plain
            ↓
f:id:daruma3940:20170824143442p:plain

面積S=ab-bc=det(M)=1
になるのでdet(M)は面積が何倍されたかを表すのじぇ。
ここで行列Mの固有値について考えると
{ \displaystyle
det(M)=\lambda_1 * \lambda_2=1               

\\
\lambda_1 = 1/\lambda_2                
}

ここでもし固有値が実数で重解ではない場合、どちらか片方は固有値が1より大きく片方が固有値が1より小さくなるのじぇ
ということは片方は写像を繰り返すたびに指数関数的な拡大をし、
片方は写像を繰り返すたびに指数関数的に小さくなっていくのじぇ。
f:id:daruma3940:20170824163326p:plain
f:id:daruma3940:20170824163339p:plain
安定方向の直線上にない、つまり安定成分と不安定成分を持っているものは不安定性の指数関数的増加に引っ張られて不安定方向に流されていくのじぇ
f:id:daruma3940:20170824164353p:plain
もし固有値複素数の場合、
λ1はλ2の複素共役かつλ1*λ2=|λ1|^2=1なので
{ \displaystyle
\lambda_1 =exp(i \theta) \\
\lambda_2 =exp(-i \theta)
}
になりこのような行列Mは
{ \displaystyle
 M = \left(
    \begin{array}{ccc}
      cosθ & sinθ  \\
      -sinθ & cosθ 
    \end{array}
  \right)
}
であり、これは回転行列なのじぇ。
これは指数関数的に拡大しないため安定なのじぇ。
f:id:daruma3940:20170824191827p:plain
もし重解を持った場合、
λ1=λ2=1であり、このような固有値を持つ行列は
{ \displaystyle
 M = \left(
    \begin{array}{ccc}
      1 & a  \\
      0 & 1 
    \end{array}
  \right)
}
であり
{ \displaystyle
M \left(
    \begin{array}{c}
      1 \\
      0 
    \end{array}
  \right)
=
 \left(
    \begin{array}{c}
      1 \\
      0 
    \end{array}
  \right)
}
{ \displaystyle
M \left(
    \begin{array}{c}
      0 \\
      1 
    \end{array}
  \right)
=
 \left(
    \begin{array}{c}
      a \\
      1 
    \end{array}
  \right)
}

となるのじぇ。
図に書くとこんな感じ。
f:id:daruma3940:20170824191749p:plain

これも指数関数的に大きくなっていくわけではないので安定(中立安定)なのじぇ(この図あんまり理解できていない)
f:id:daruma3940:20170824191805p:plain


もし上のハミルトニアンでk=0のときこれは加積分系であり、周期軌道から少し初期値をずらしても別の周期軌道に乗るだけなのでこれは指数関数的に大きくなっていかず、中立安定的なのじぇ
しかしkが大きくなっていくとトーラスが壊れ、もしそれが複素数のほうへ壊れたのなら、安定固定点が発生し、実数のほうへ壊れたのなら不安定固定点が発生するのじぇ

このようすをkicked rotatormodelで描いてみるとこんな感じになったのじぇ
kicked rotatormodelとは
周期的に撃力を受ける回転子のことで....って書くのはめんどくさいので
http://a-phys.eng.osaka-cu.ac.jp/suri-g/phys8.html
このページを見てくれだじぇ
f:id:daruma3940:20170824160407p:plain

これがK(キックの強さ)=0の時
キックのじゃまを受けないのでひたすらθは大きくなっていくのじぇ
f:id:daruma3940:20170824160307p:plain
こんな感じ まさしく中立安定
K=0.01のとき
f:id:daruma3940:20170824160435p:plain
K=1.2の時
f:id:daruma3940:20170824160514p:plain
島みたいなのが現れているのじぇ。これが複素数の方向に壊れたやつなのじぇ。
島と島の間には実数の方向に壊れたやつが存在しているけどカオス的になってしまっているので構造はみてとれないのじぇ
ちなみにこの島を拡大すると島の中にも島が存在するのじぇ。これはいわゆるフラクタル的構造なのじぇ
f:id:daruma3940:20170824160921p:plain
さらにキックを強くするとこんな感じ
f:id:daruma3940:20170824160713p:plain


これらの図は範囲が違ったりするので注意なのじぇ
Kが大きくなると完全にカオス的になるのはすべて実数方向にずれるから??
安定固定点と不安定固定点が交互に出てくるのはなぜ???
さっきの
{ \displaystyle
H_0 = (p_x^2+p_y^2+x^2+y^2)/2 -kxy
}

についてもやってみたけどそんなにきれいなのは見られなかったのじぇ
でもまあ一応張っておくか
f:id:daruma3940:20170824183931p:plain
f:id:daruma3940:20170824172501p:plain
f:id:daruma3940:20170824195423p:plain
f:id:daruma3940:20170824223802p:plain
f:id:daruma3940:20170824223818p:plain
f:id:daruma3940:20170825113033p:plain
f:id:daruma3940:20170824223831p:plain
f:id:daruma3940:20170826195420p:plain
f:id:daruma3940:20170826184006p:plain

なんかうまくいかないなーー
なんでだろうだじぇ?


う~~んう~~ん......
f:id:daruma3940:20160520223745p:plain
分かったのじぇ
ハミルトニアン
{ \displaystyle
H_0 = (p_x^2+p_y^2+x^2+y^2)/2 -kxy
}
で表されるので運動方程式
{ \displaystyle
d x / dt=p_x / m \\
d p_x / dt =-x +ky \\
d y / dt  =p_y /m \\
d p_y / dt = -y +kx
}

これは線形なので非線形性がないためカオスは現れないのじぇ。
f:id:daruma3940:20160520223745p:plain
そしてk=0の時トーラスっぽいものが現れていないのは
これは単純な調和振動子なので一度ポアンカレマップに乗った後運動をして、もう一度ポアンカレマップに乗ったときに完全に同じ点に乗ってしまう、
つまりトーラス上の一部しか運動をしないためトーラスが現れていないのじぇ

それに変数変換をすれば、2つの2次元調和振動子に分離もできるのじぇ
{ \displaystyle

f(x)=(x^2+y^2)/2-kxy \\


\\
{\bf x}=\left(
    \begin{array}{c}
      x \\
      y 
    \end{array}
  \right)
\\
\\
 A = \left(
    \begin{array}{ccc}
      1/2 & -k/2  \\
      -k/2 & 1/2 
    \end{array}
  \right)
\\

とすると
\\
固有ベクトルから
\\
P= 1/\sqrt{2} \left(
    \begin{array}{ccc}
      -1 & 1  \\
      1 & 1 
    \end{array}
  \right)
\\
\\
f(x)= ^t{\bf xAx} \\
\\
^t{\bf xAx}={\bf (^txP) P^{-1}AP (P^{-1}x)\\=^t(^tPx)P^{-1}AP (P^{-1}x)\\=^t(^tPx)P^{-1}AP (^tPx)\\=^tx^{'}A^{'}x^{'}  } \\

\\
\\
P^{-1}=^tP= 1/\sqrt{2} \left(
    \begin{array}{ccc}
      -1 & 1  \\
      1 & 1 
    \end{array}
  \right)
\\
\\
A^{'}=P^{-1}AP=\left(
    \begin{array}{ccc}
      (1+k)/2 & 0  \\
      0 & (1-k)/2 
    \end{array}
  \right)
\\
\\

{\bf x^{'} = ^tPx}=1/\sqrt{2}
\left(
    \begin{array}{c}
      -x+y \\
      x+y 
    \end{array}
  \right)
\\

運動量は\\
P_{x'}=1/ \sqrt{2}(-P_x+P_y)\\
P_{y'}=1/ \sqrt{2}(P_x+P_y)\\

}

A'は体格化されているのでx',y'のように変数変換をすれば2つの調和振動子に分けることができるのじぇ。
つまりこれはkの値がなんであれトーラスでカオス性は持たないのじぇ

でもkが0.6の時にはトーラスが出てきてないよね???これはなんで???
そしてトーラスの中心が2つに分かれているのはなんでなんだじぇ???

息抜き

f:id:daruma3940:20160520223745p:plain
院試の勉強つまらんので息抜きに将棋盤アプリ作り始めてみたら
息抜きのほうに力が入ってしまっていたのじぇ......

f:id:daruma3940:20170816224032p:plain

f:id:daruma3940:20160521003616p:plain
何やってんのよ....
f:id:daruma3940:20160520223745p:plain
なにやってんだろうなぁ~~~~~~~~~~~~~~~~
f:id:daruma3940:20160520223745p:plain
うちの教授陣は優しいのできっと....きっと私の解けなかった問題の配点を0点にしてくれるはずなのじぇ.....
f:id:daruma3940:20160709192554j:plain
....(;^_^A

Rotated Bitboardなのじぇ

f:id:daruma3940:20160520223745p:plain
Rotated Bitboardについての解説をしようじぇ?

Bitboardについての解説は以前の記事を見てくれだじぇ。
daruma3940.hatenablog.com



f:id:daruma3940:20160709192554j:plain
SquirrelはRotated Bitboardを使って効きのある升を計算しているよ!

f:id:daruma3940:20160521003616p:plain
最近はPEXTbitboardとかもあるらしいじゃない?どうしてRotated Bitboardを使うの?
f:id:daruma3940:20160520223745p:plain
twitter.com
mermoさん曰くPEXTよりも早いそうなのじぇ。
そしてまりちゃのPCはアルバイトして買った学習用i7-4770K以外のPCはAVX2に対応していなくてPEXTは使えないのでRotatedにせざるを得なかったのじぇ。

f:id:daruma3940:20160520223745p:plain
Bitboardによる効きの表現は効きのあるマスに対応するbitを1にすることである駒がどこに効きを作っているのかを表現するというものなのじぇ。
しかし長い効きを持つ駒の場合効きを遮る駒がどこにあるのかによってどこまで効きを伸ばすことができるかが変わってくるのじぇ。
そこで、(とびゴマの位置、邪魔ゴマの位置)全通りに対してどこに効きを発生させることができるかのTable集を作成し、どこに邪魔ゴマがあるかをindexにしてそのテーブルを引っ張ってくることで効きを表現しようという方法なのじぇ。


例えば
青いマスを邪魔ゴマがいるマス、赤いマスを効きを発生させている駒の升だとすると

f:id:daruma3940:20170813122054p:plain

この図で4の場所にいる飛車の縦方向のききを求めたければ
TateKikiTable[4(効きを発生させる駒の場所)][(bitboard>>1)&(7)] のようになるのじぇ
今のbitboardをシフトして必要なところだけマスクして取り出すことによって Tableのindexを作成できるのじぇ

f:id:daruma3940:20170813122635p:plain
この場合は
TateKikiTable[31(効きを発生させる駒の場所)][(bitboard>>28)&(7)]になるのじぇ


しかし横の効きを求めるためにはこのマスの番号のつけ方では
f:id:daruma3940:20170813122837p:plain
シフトとマスクではindexを作れないのじぇ。

そこでこのbitboardを90度回転させたboard(bitboard90とする)を作成すれば
f:id:daruma3940:20170813123015p:plain
これはさっきと同じようにシフトとマスクでindex作成できるのじぇ。

f:id:daruma3940:20160520223745p:plain
実際のbitboardは64bit整数2つ(ここではint64_t bb[2]とする)で作られるためbb[0]かbb[1]かどちらを参照するべきかも指定しないといけないためもうちっとふくざつになるのじぇ
斜め+45度斜め-45度についても似たような感じなのじぇ。
f:id:daruma3940:20160520223745p:plain

もし将棋の駒がすべて近接駒ならRotated Bitboardなんて技術は必要ないのじぇ。
Rotated Bitboardは長い効きを持つ駒の効きを考慮するために必要なのじぇ
f:id:daruma3940:20160520223745p:plain
ちなみにこれがSquirrelにおけるRotated Bitboardの設計図なのじぇ
f:id:daruma3940:20170813124340j:plain
f:id:daruma3940:20170813124350j:plain
f:id:daruma3940:20170813124412j:plain


テーブルの作り方 sifttableの作り方,mm256で一気に計算する方法はまたこんどなのじぇ

open ai gym[atari]をwindowsでも使えるようにしようじぇ??

f:id:daruma3940:20160520223745p:plain
なんかopen ai gym[atari]をwindows環境で

 pip install gym[atari] 

しようとしたらインストールできなかったので
ビルドする方法をいろいろ調べてやってみたのでここに書き記しておきのじぇ
ちなみにbash on windowsとか vcXsrv とか使うのはめんどくさいのでそれを使わない方法なのじぇ(MSYS2は使ってる)
f:id:daruma3940:20160520223745p:plain
まあこのQuitaの方法のそのまんまなのでこれ読めばわかるって人はこれ読んでくれだじぇ
qiita.com

f:id:daruma3940:20160520223745p:plain
github.com
このissueの
f:id:daruma3940:20170813025408p:plain
この投稿に注目なのじぇ

github.com
どうやらこれをつかえばいいらしいのじぇ?

pip install -U git+https://github.com/Kojoley/atari-py.git

f:id:daruma3940:20160520223745p:plain
まりちゃのPCにはすでにMSYS2環境はすでにあってそこにpathも通っていたので
Visualstudio 2015のC++ビルドツールさえ用意すれば うまくいったのじぇ

f:id:daruma3940:20170813025746p:plain
(このソースは
github.comより

)
f:id:daruma3940:20160520223745p:plain
うむ!ちゃんと動いてるみたいなのじぇ!



f:id:daruma3940:20170813025834p:plain

f:id:daruma3940:20160520223745p:plain

早く公式で対応して..(懇願)