IronPython」タグアーカイブ

Windows 7 で IronPython そのに

一般的な互換性問題 – Windows 7 対応アプリケーションの互換性

Windows 7 で最初からブロックされないようにする方法はそんなに難しくは無いわけだ。
しかし個人オンラインソフトごときにこんな大げさななことをするか…minipoli とかに。
少なくとも私はそんなことまでして公開なんかしたくないよ。

「こんなのを作ったので気に入ったら使ってくれい!」
なんて文化が Windows にはあったのが懐かしい、もうユーザーのほうが求めていない?

MS はエクセルとワードとパワポを利用するためだけの OS にしたいらしい。
でもやっぱり Windows しか使えない人ばかりなのでみんな疑うことなく Windows を選ぶ。

Ubuntu のほうがいいよ、けどこれ Windows じゃないから。
ということで書名が必要な拡張子をよくみてよ。

拡張子 .exe、.dll、.ocx、.sys、.cpl、.drv および .scr のついたファイルが対象

C# で作ると *.exe になるね。

*.py は無いじゃん。

Windows 7 で .NET Framework は IronPython の時代になる!

かもしれない。

しかし IronPython で奇妙なことに気がついた。
騙されたと思ってコレを実効してみよう。

#-*- coding:utf-8 -*-

s = "あいうえお"
i = 12345

print dir(s)
print dir(i)
print "\n"
import System

print dir(s)
print dir(i)

dir

s や i は当然 str や int という Python の型になる。
しかし System をインポートした時点で System.String や System.Int32 としても使える。
恐ろしいのはどっちでもいいということである、動的言語の凄さを見た。
面倒な型変換は不要だし両方のメソッドが利用できるということである。

C++/CLI のマーシャリングっていったい何? IronPython なら全自動じゃん。
以前書いたように P/Invoke なんて不要になる、 ctypes モジュールが使えるようになる。
ライバルになりそうなナントカビーは他人が読みにくいコードを書くのに命を掛けるだろう。
元々「 C# で var 使っているの?ププッ」な言語でもある。
VB …何それ知らないんだけど?

ということで IronPython の時代がやってくる、はず…

Windows 7 で IronPython

WPF を Microsoft の思想を無視こいて単なるウインドウ部品として使うのは面白い。
しかし Ubuntu 上 VirtualBox のゲストな XP で使っていて一番困っていること。

Windows XP の .NET Framework は死ぬほど遅い!

もう Vista はほとんど使わないのでコイツもゲスト OS にしてしまおうか?
何度も書いているが Vista なら .NET Framework も初回起動以降は実用レベル。

でもそれではライセンスがもったいない、HDD ブートで使いたくなる場合もある。
何よりこれまでに作り上げた環境をゼロから作り直しなんてご勘弁。
一時間あれば再構築が完了するほどデフォルトが充実した Ubuntu のようにいかない。
んー何か良い方法は…

そうだ、Windows 7 RC という手があった!

こいつは Windows 6.1、単なる Vista メーカーチューニング版。
なので Vista とほぼ同じように動かせるはず。
最新版 .NET Framework も PowerShell も標準装備だったはず。
利用する開発環境の IronPython は数メガバイト、構築も簡単。
VirtualBox のゲスト OS にして IronPython テストが目的だから RC で十分。
なんだよ、いいことだらけだ。

IE でないと iso を落とせないだろうから vista HDD につなぎ替え。
起動すると Windows Defender が「スキャンされていません」だと。
一ヶ月も電源を入れていないのにスキャンも糞もあるか!ふざけるな!
こういう部分で Windows が嫌になる、こんなことより sudo を用意しろよ。

IE から Windows 7 で検索、あっという間にダウンロードページへたどり着く。
2.52 GB か、何故にこんなにデカいやら、とにかく落として DVD-R に焼く。

Ubuntu 9.04 の HDD に戻してインストール開始。
VirtualBox ose には普通に Windows 7 のインストール項目があって驚く。
仮想 HDD は可変の 20GB、メモリ割り当ては 512MB に一応指定して開始。

インストーラは超親切、説明はアホらしいので割愛。

とりあえずインストールが終わった時点で vdi のサイズは 5.2GB だった。
やっぱりデカいなぁ、本当にサクサク動くか心配。

一度シャットダウンして起動時間を、ユーザー選択画面まで私の環境で約 100 秒。
XP は 20 秒、本当はちーとも Vista から早くなっていないのは予想どおり。

デフォルト状態で解像度が変更できる、これは驚いた。
というか VirtualBox ドライバーが標準装備なんだ、でもワイド画面には未対応か。

vga

他パフォーマンスは以下、メモリ使用量は Vista の約半分になっているのは本当みたい。

power7

よしよし、これなら十分実用範囲だ。
Windows Power Shell も標準で入っていて XP で使うより数倍早い、これなら使う気になる。
とりあえず以下をダウンロード&インストール。

IronPython 2.0.1
EmEditor 8.0.5
FileZilla 3.2.4.1

使用期限があるんだから他はいいや、メーラーはマジで最初は入っていないのね。

あれ?Program Files 以外で EXE を起動させると警告画面が出るようになった。
(ちょっと違っていた、追記で)
これは素晴らしい、やっとその気になったか…てか遅すぎだよ。
アプリ作りは面倒になるだろうけどセキュリティを考えると当然の選択なのに今まで…
これがあるので IronPython は msi 版を入れたけどインストーラでパスくらい通してくれよ。

でもこのせっかくのセキュリティを OFF にする Tips ページが乱立するんだろうなぁきっと。
んでセキュリティソフトを売ろうと必死になるのは今までどおりと。

しかしこれは…

メモリ使用量以外に Vista からの進化を何一つ感じない、まさしく 6.1 。
Explorer は更に使いにくい、余計なことはしないで普通の階層表示に戻してくれ!
タスクバーの結合機能は酷い、ランチャ状態なのかタスクの最小化状態なのか判別し辛い。
の改悪点ばかりが気になる。

それはともかく .NET Framework と WPF だが昨日のコードは問題なく動かせる。

player

はっきりいって現在 Vista を利用中の人が買い換える理由はゼロに等しい感じ。
まあいいや、512MB 程度のメモリ割り当てでも動くんだから仮想にして遊ぶには丁度良い。
でも ipy.exe が Vista ほど早く動かない、メモリをもっと割り当てなきゃダメ?

追記

やっぱり開発に不便なので minipoli と ExpLZH くらいは必要か。
あれ? Explorer が標準で LHA の解凍ができるようになっているぞ。
と、喜んで早速 minipoli を Program Files に突っ込んだのだが。

app

ぅおーーーーーーい!

Program Files に入れてもブロックされてもーた。
プロパティを見たらコレ、そういうことだったのか。
もうアーカイブを展開するだけで使える Windows アプリは全滅だ。

「こうやってブロックを解除してください」

なんてサイトに書いてもわざわざそんなのやる人は余程のヲタだけだ。
一般の人には信頼できないアプリの烙印を押されて終わり。
Windows 7 正式版が出る前に minipoli もインストーラを作らないとまずい。
minipoli だけでいいや(ぉい!

IronPython で簡単動画再生

川西 裕幸のブログ : Media Foundation の更新 @ Windows 7

Windows 7 の Media Foundation は H.264 もサポートらしい。
WMV 以外はまともに再生できなかったのに、FLV は流石にサポートしないか。

せっかくなので IronPython で動画再生方法、書くまでもなく WPF。
もちろん System.Windows.Controls.MediaElement を使います。
こいつが Media Foundation のフロントエンドです。

# -*- coding: UTF-8 -*-

import clr

clr.AddReferenceByPartialName("PresentationCore")
clr.AddReferenceByPartialName("PresentationFramework")
clr.AddReferenceByPartialName("WindowsBase")

from System import *
from System.Windows import *
from System.Windows.Controls import *

class MoviePlayer(Window):
    def __init__(self):
        self.Title = "動画プレイヤー"
        # System.Windows.Controls.MediaElement
        self.player = MediaElement()
        self.Content = self.player
        self.Width = 320
        self.Height = 240
        # D&D
        self.AllowDrop = True
        self.Drop += self.on_drop

    def on_drop(self, sender, e):
        # System.Array なので str に変換
        filenames = e.Data.GetData(DataFormats.FileDrop)
        filename = str(filenames[0])
        if filename != None and filename.Length != 0:
            self.player.Source = Uri(filename)

if __name__ == "__main__":
    a = Application()
    a.Run(MoviePlayer())

konko

自分で作って驚いたけど VirtualBox のゲストである XP で動いてしまった。
Cinema は動かなかったのに、というより DirectX 使いまくりなのに普通に動くとは。
DirectShow は関係無く現状では WMV しかまともに再生できませんけどね。

Windows 7 でやってみてアリなら作り込んでみるのも面白いかも。
7 を買うかどうかは…これなら VirtualBox のゲストにするのもいいかも…

IronPython2.6beta を試す

IronPython – Release: 2.6 Beta 1

DevHawk – IronPython 2.6 Beta 1

どうやら IronPython 2.6 には ctypes が追加されるみたいなんだが。
面白そうなので落としてみる。

ipy26b1

なんかイッパイファイルが増えているなぁ。
とりあえずインタラクティブシェルで試してみるか。

errer

だめヤン、やりかたが悪いのかな?

そういえば IronPython 2.0 では普通の ctypes も import できなかったっけか。
なんか os モジュールでエラーになってしまう、こっちも試してみよう。

#! /usr/bin/env python
# -*- coding: UTF-8 -*-

import sys

# CPython 2.6 を自分がインストールしている場所
sys.path.insert(0, "C:\\Python26\\lib")
import ctypes

MB_OK = 0
MB_OKCANCEL = 0x00000001
IDOK = 1

dll = ctypes.windll.user32
res = dll.MessageBoxW(0, u"どちらかを押してください", u"たいとる", MB_OKCANCEL)

if res == IDOK:
    dll.MessageBoxW(0, u"OK を押しました", u"りざると", MB_OK)
else:
    dll.MessageBoxW(0, u"キャンセルを押しました", u"りざると", MB_OK)

IronPython 2.6 で実効。
間違えて CPython で動かしちゃダメよ。

cmd

おぉエラーにならなくなっている。
つまり普通の ctypes を使えばいいだけってことなのかな?
今は解らない、もっと情報が上がるのを待とう。

IronPython は親クラスの __init__() がいらない

.NET Framework について何を今頃知ったのだが…
StreamWriter はエンコード指定をしなければ BOM 無し UTF-8 になるらしい。

ま、元々 Opera は付けていたのでSeeme for Linux の場合は問題無いのだが。
UTF-8 を指定すると BOM が付いて困ることがあったので理解しておかなきゃ。

てなわけで実際そうなのか実験コードを IronPython と WPF で書いてみたのだが…
突っ込みどころ満載になってしまった。

# -*- coding: UTF-8 -*-

import clr
#import nt

# 最小限下記ライブラリ(dll)が必要
clr.AddReferenceByPartialName("PresentationCore")
clr.AddReferenceByPartialName("PresentationFramework")
clr.AddReferenceByPartialName("WindowsBase")

from System import *
from System.Windows import *
from System.Windows.Controls import *
from System.Windows.Media import *
from System.IO import *

class UTF8Writer(Window):
    """
        System.IO.StreamWriter の実験
        何も指定せず書き込みすると BOM 無し UTF-8 になる
    """
    def __init__(self):
        """
            IronPython では Window.__init__(self) はいらないようです
            書いても例外にならないけど
        """
        self.Title = "UTF-8 書き込みの実験"
        self.textbox = TextBox()
        self.textbox.TextWrapping = TextWrapping.Wrap
        self.textbox.AcceptsReturn = True
        self.textbox.FontFamily = FontFamily("MS ゴシック")
        # ボタン作成及びクリックハンドラ登録
        button = Button()
        button.Content = "書き込み"
        button.Click += self.onClick
        # StackPanel だとサイズ連動ができないので DocPanel を使う
        # けど何故 static なんだ!
        DockPanel.SetDock(button, Dock.Top)
        # レイアウタを作成してこれらをセット
        dp = DockPanel()
        dp.Children.Add(button)
        dp.Children.Add(self.textbox)
        # レイアウタを Window にセット
        self.Content = dp
        self.Width = 320
        self.Height = 240

    def onClick(self, sender, e):
        """
            流石に以下はできない、nt.path が無い…
            sw = StreamWriter(nt.path.dirname( __file__ ) + "\\put.txt")
        """
        sw = StreamWriter("put.txt")
        try:
            buf = self.textbox.Text
            sw.Write(buf)
        except Exception, ex:
            MessageBox.Show(ex.Message)
        finally:
            sw.Close()

class UTF8WriterCopy(UTF8Writer):
        """
            自作クラスでもコレでイケる、なんか変
        """
        pass

if __name__=="__main__":
    a = Application()
    a.Run(UTF8WriterCopy())

writer

なるほど、BOM 無し UTF-8 になることは確認できた。
XP 用の WPF にはフォントにアンチエイリアスを掛けるのをヤメてくんないかなぁ。

つーかナンジャコレ。

今まで気がつかなかったよ、親クラスの __init__ はいらないんだ。
Python じゃ無いヤン、コンストラクタになっているってことだよね。
それとも CLI の仕様なのかな?

更に気がつかなかったけど DockPanel へのレイアウトは static なんだ。
XAML で書いていると普通に見えるけどコードで書くと違和感がたっぷり。
GTK+ とは違ってパッキング情報は子オブジェクト側が持っているということか。

やりにくいのでコンテナの継承をして pack_start みたいなのを作ろうかな?
と思ったけど要求が StackPanel と DockPanel に分かれているし無理っぽい。
WPF は XAML で書くのを強要しているってことだろう多分。

os モジュールのクローン nt を作ったのなら nt.path も用意してくれよみたいな。

まだ気がついていないところってありそうだ。
IronPython は Python クローンだと思って書くと痛い目に遭いそう。
しかし例外の書き方なんかはまったく同じだ、逆に変な気分になった。