cls.getTypeとかためしたけどだめでした
IronPython+PTVS+MonoGameでの環境構築(主にIntellisense)
これは何?
IronPython+PTVS(Python Tools for Visual Studio)+MonoGame(XNAライクなライブラリ)を使ってVS2012でゲームを作ろうとしたらIntellisenseが効かなくて悩んだ話。多分MonoGameに限らずPTVSとdllの連携でIntellisenseが効かないという話に対応すると思う。
どうするの?
とりあえずIronPythonとPTVSが入っていればIronPythonのアプリケーションが作れるはずなので、それを作る。
本題ではないけれど、とりあえずWindowsアプリということで、ソリューションエクスプローラの中でプロジェクトを右クリックして、プロパティを開く。GeneralタブのWindowsApplicationにチェックを入れて、InterpreterをIronPythonにしておく。
dllの読みこみは
clr.AddReferenceToFile("MonoGame.Framework.dll")
みたいにやるわけだけど、これだけだとIntellisenseが効かなくて、
import Microsoft.
まで打っても「xna」を補ってくれないので、これが問題になっていた。ちなみにこのとき、IronPython Console(VSやPTVSとは無関係)で補完が効くのは確認していたので、VSかPTVSで問題がおきていることは分かっていた。
結局、先のプロパティページのDebugのSearch Pathのところにdllの在処(私の場合「C:\Program Files (x86)\MonoGame\v3.0\Assemblies\WindowsGL」)を入れて、保存すると、コード中で補完してくれるようになった。DebugのところとIntellisenseが関係あるとは思わなかったので全然思い付かなかったが、PTVSもオープンソースなのだしコードを読む習慣があればもっと早く解決していたのかもしれない。
結局MonoGame+IronPythonのコードがどんな感じになったか。
後述の参考の「MonoGame w/ IronPython Example - doesn't work?」を参考に。
import sys import os sys.path.append(os.getcwd() + '\\lib') import clr clr.AddReferenceToFile("MonoGame.Framework.dll") from Microsoft.Xna.Framework import * from Microsoft.Xna.Framework.Graphics import * from Microsoft.Xna.Framework.Content import * from Microsoft.Xna.Framework.Storage import * from Microsoft.Xna.Framework.Input import * class App(Game): def __init__(self): self.graphics = GraphicsDeviceManager(self) RootDirectory = "Content" def Initialize(self): super(App, self).Initialize() def LoadContent(self): self.spriteBatch = SpriteBatch(self.GraphicsDevice) #TODO: use this.Content to load your game content here def Update(self, gameTime): if GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed or \ Keyboard.GetState(PlayerIndex.One).IsKeyDown(Keys.Escape): self.Exit() super(App, self).Update(gameTime) def Draw(self, gameTime): self.graphics.GraphicsDevice.Clear(Color.CornflowerBlue) super(App, self).Draw(gameTime) game = App() game.Run()
これで無地の青画面が出る。この1ファイル感が好きです。
コンピュータビジョンでできた偶然の産物
「実践コンピュータビジョン」読んで書いてたらこんなのできた。
元画像(http://www.ashinari.com/2010/07/23-338955.php?category=243)
できたの
from PIL import Image from numpy import * import imtools from pylab import * im = array(Image.open("sample/artist.jpg").convert("L")) im2, cdf = imtools.histeq(im) ## imshow(im) imshow(im2) show()
ポストモダン解析学: 補題5.13
これは何?
補題5.13の行間(?)が気になって、結局2日ぐらい考えたら分かったので書く。引用は全て丸善出版「ポストモダン解析学 原書第3版 J.ヨスト著」から。引用中の赤字強調は全てashiato45による。
問題
状況設定
証明しようとしているもの
本題
証明から問題の箇所を引用します。
となるすべてのでとおく。なので、Aは空集合ではない。とおく。fの連続性よりであり…(略)
というのが本文なのだが、「fの連続性」からどうしてが出るのか分からなかった。cがここに書いてある条件を満たしているのかとも思ったのだが、この直後にそのものから
を導いているのでそうではないっぽい。
「fの連続性より」で何がおこったのか。
かいとう
登場人物が多くて大変なので、問題と直接の関わりがあるかは分からないがとりあえずいろいろ調べてみる。状況をなんとか目視しやすくしてみる。
まず、Aの定義からしてでならなことがわかる。*2よって、Aはぶちぶち途中で千切れたりせず、かのどちらかであることが分かる。
図の下の青字にあるように、AがだろうがだろうがAの任意の点で
がなりたつ。なぜなら、cはAの上限なので、cがAに属するとすればAの定義そのままで言え、cがAに属さなかったとしても、cよりちょっとだけ小さい点を十分小さい正数εで表わせばこれはAに属するので、任意の正数εと任意のについて
がなりたち、結局同じことになる。証明おわり。なんなら、一方の点を一個とって、それが他方に入ることを言ってもいい。
ではAから出てしまったらどうなるのかというと、それはとの大小はどちらだか分からなくなってしまう。先程言ったように、「千切れて」とびとびにがなりたっているかもしれないし、ひょっとしたらそんな区間はないのかもしれない。
してみると、cは「aからここまでは確実にと言える」という右端の限界だということになる。そしてこれが大事なのだが、緑字で書いたとおり「右端の限界」ということは、その(cの)ちょっと右ではという風に否定が確実に成りたつということが分かる。
以上をまとめてみると、青字の情報を特殊化してとりだして、「cのちょっと左までは(不等号が小なりイコール)」が言え、緑字より「cのちょっと右までは(不等号が大なり)」が言える。連続性めいてきた。
不等号の両端に式を書くのが面倒なので、以下
と定義する。すると、先程のは「cのちょっと左まではFは0以下」で「cのちょっと右まではFは正」ということが言える。
今は簡単のために、このcの左右ちょっとの範囲では定数であるとする。*3すると、fは連続関数であること、Fはfの足し引き定数倍であること、連続関数の足し引き定数倍は連続関数となることより、Fが連続関数であることが言える。連続関数Fが、cのちょっと左まで0以下、ちょっと右まで正なので、が言えた。
最後に、「cの左右ちょっとの範囲では定数である」の仮定を外す。心配なのは、「cのちょっと左まではFは0以下だったのに、不連続性をつかってぴょんとcで0でない正になってしまうのでは」ということだが、が単調増加であることから、この項はFを減少させる方向にしか寄与しない。したがって不連続性を使って「増える」ことは絶対にできない。おわり。
ところで
Dで区切られた区間の各々について、千切れない区間での有限増分の定理をつかって、それを足しあわせるんじゃだめなんですか。
微分積分学(初等の解析学)やるときに大事っぽい式
ポストモダン解析学を読んでいたら、イプシロンデルタ論法の性質で単独でまとめられてもいんじゃねって思ったのがいくつかできたので書きます。多分、微分積分の教科書の行間埋めに役立つんじゃないかと。「かつ」は楔(くさび)の記号で表わしてます。あと、PとかQとかは、括弧のなかの文字の関係について述べる*1命題をさします。
2つのイプシロンデルタの式を結びつける
lをnとmとのうち、大きいほうをとれば満たされる。2つ以上のイプシロンデルタの命題を結びつけてひとつにしたいときに使う。たとえば、実数列がと収束するとき、
を示せ、みたいなときにつかえるはず。
「小さい」のイメージ
fは常に0以上として、とすると、がなりたつ。
よく教科書とかにしれっと書いてある、「εは十分小さいので、としてよい」みたいなやつの根拠になる。そこで示せたなら、このことによりそれより大きいところは自動的に証明されたことになる。
イプシロンを加工してよい
例えばなりゆきでとかで最後の評価をしてしまったときとかに使える。さっきのと組合せて。
訂正
特に、
要するにいくらでも縮むもので差を抑えられれば、εで直接に抑えなくてもいいという話。なりゆきでで抑えちゃったときとかの合法化に使える。あと、εで抑えるところではかかを気にしなくてよい、ということも保証する。
全称と存在の交換
一様連続性から普通の連続性まで情報を落して使うときに。
*1:使わない文字があってもよいが、他の変数には依存しない
変数スコープに関する初歩的なミスで詰んでた
なんか書いてるjsのコードでの問題が切り離せたので備忘録に。
var array = []; for(var i=0; i < 3; i++){ console.log("i=", i); array.push(function(){ console.log("in function ", i); }); array[i]() } console.log(array.length); for(var j=0; j < array.length; j++){ console.log("run function no.", j); array[j](); }
こういうコードで、最後の配列に入った関数を実行するときに、
run function no. 0 in function 0 run function no. 1 in function 1 run function no. 2 in function 2
となることを期待していたというのが本質のバグ作ってた。このコードの最後は実際は、
run function no. 0 in function 3 run function no. 1 in function 3 run function no. 2 in function 3
と実行される。「なんで"i<3"なのにi=3になってるんだよ!」という類のことで悩んでいたのだが、カウンタが生きているならば、forが終ったあとはその制約の一個次になるんだったなあと高校のBASICの授業を思いだす。
DIM I FOR I = 0 TO 3 PRINT I NEXT PRINT I
みたいに書くと(正確な文法忘れた)
0 1 2 3 4
となるはず
追記
"JavaScript: The Good Parts"のクロージャの章に全く同じの載ってました。結局こう直します。
var array = []; for(var i=0; i < 3; i++){ array.push(function(j){ return function(){ console.log("in function (revised): ", j); }; }(i)); } for(var j=0; j < array.length; j++){ console.log("run function no.", j); array[j](); }
すごいH本のチェスの演習問題書いた
「すごいHaskellたのしく学ぼう!」の308ページの、3手で到達できるときその途中経路を出力する演習問題を書いてみた
import Control.Monad type Route = [(Int, Int)] routeStart :: (Int, Int) -> Route routeStart x = [x] inBoard :: Route -> Bool inBoard (x:xs) = x `elem` [(a,b) | a <- [1..8], b <- [1..8]] possibleRoute :: Route -> [Route] possibleRoute all@((x,y):xs) = do (dx,dy) <- [(2,1), (-2,1), (2,-1), (-2,-1), (1,2), (1,-2), (-1,2), (-1,-2)] let p = (x+dx, y+dy) r = p:all guard $ inBoard r return r canReachIn3 :: (Int, Int) -> (Int, Int) -> [Route] canReachIn3 s g = filter (\x -> head x == g) (return (routeStart s) >>= possibleRoute >>= possibleRoute >>= possibleRoute)