投稿者「sasakima-nao」のアーカイブ

IronPython で WPF

IronPython には nt という os の代替モジュールがあることを今更知った。
ということは前回のコードは

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

# 環境変数の書き出し

import nt

keys = nt.environ.keys()
result = ""
for key in keys:
	result += key + "\n" + nt.environ[key] + "\n\n"

f = open("env2.txt", "w")
f.write(result)
f.close()

あーあ、os を nt に書き換えるだけで動いてしまったお。
open() とかは組み込み関数だからそのまま使えるし。

とはいえ IronPython ではコッチで書く人はほとんどいないだろう。
C# コードからの変換ばかりやるはめになるのは目に見えているし。

ということで

の本で WPF アプリのコードがあまりに不親切だったので補完。
部品を作るのにいきなり XAML を利用では IronPython の意味が無いでしょみたく。
XAMLPAD では Glade のようにはいかないと思うし、機能がショボすぎる。

マイレビューを一つ、CPython コードを書くのにも少し役に立ったよと。
ちなみに上記の nt モジュールの存在はコレを読み直して知った…
しかし mono の本同様にコレしかなく選べない状態が続いているのは悲しい。

さて最小限のコードを書いてみる。

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

import clr

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

import System

w = System.Windows.Window()
w.Title = "実験"
a = System.Windows.Application()
a.Run(w)

最小限のライブラリとは VC# とかを持っている人なら解るかな?
ソリューションエクスプローラにある参照設定以下のことね。
VC# なら右クリックして「参照の追加」をするけど IronPython はコードで行う。

se

本当は System も必要だけど最初から含まれているっぽい。

後、上記の本ではいきなり from 文を使っているけど理解してから使いましょう。
Window や Application というクラスは System.Windows 名前空間にあります。

知っていると思うけど Python の名前空間はモジュール名そのままである。
partial 指定ができないのが場合によっては辛いかもしれない。
boo という Python そっくりな言語はココの画像を見るとできるっぽい。

【ハウツー】F#、IronPython、Booまで使えるフリーの統合開発環境「SharpDevelop」 (3) 利用できるプログラミング言語 | エンタープライズ | マイコミジャーナル

まあそれはよくて。
上記を拡張しても後々で困るのでさっさとクラスに変更します。

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

import clr

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

from System import *
from System.Windows import *

class TestWin(Window):
    def __init__(self):
        self.Title = "class の実験"
        self.Closing += self.onClosing
    
    def onClosing(self, sender, e):
        MessageBox.Show("閉じます")

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

やっぱり面倒なので from を利用、これで C# の using と同じ意味。

VC# で作るのと同じように Window を継承したクラスを __main__ で作る。
最後に Application インスタンスの Run() にぶち込めばクラス化は完了である。
これで C# コードからの変換が簡単になりました。

ついでに終了時にダイアログを出すようにハンドラを追加してみた。
Python のクラスなので引数に必ず self が必要です、よく忘れるんだこれが。

最後にコントロールを追加してみます。
XAML を使わずにコードで作る方法をば。

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

import clr

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

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

class TestWin(Window):
    def __init__(self):
        self.Title = "Controls"
        # ボタン作成及びクリックハンドラ登録
        button = Button()
        button.Content = "ボタンだよ"
        button.Click += self.onClick
        # 一行エディットの作成
        # 内容を他で使うのでアトリビュートにしておく
        self.textbox = TextBox()
        self.textbox.Text = "なんか書け"
        # TextBlock の作成
        tb = TextBlock()
        tb.Text = "何か書き込んでボタンを押してね"
        # レイアウタを作成してこれらをセット
        sp = StackPanel()
        sp.Orientation = Orientation.Vertical
        sp.Children.Add(button)
        sp.Children.Add(self.textbox)
        sp.Children.Add(tb)
        # レイアウタを Window にセット
        self.Content = sp
        # この指定でコンテンツの大きさ固定なウインドウになる
        self.SizeToContent = SizeToContent.WidthAndHeight
        self.ResizeMode = ResizeMode.NoResize
    
    def onClick(self, sender, e):
        MessageBox.Show(self.textbox.Text)

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

Button 等のクラスは System.Windows.Controls にあるので import する。
Window や Button に何かを乗せるには Content プロパティに代入する。
レイアウタにコントロールを追加するには Children.Add() メソッドを利用する。
という簡単な例である、最後に Run() の中で Window を作る小技をば。

seira

C# でウインドウをコードで作った人なら解るだろうけどほとんど同じに書けます。
C++ から Pascal への変換を経験した人なら「え?それだけ???」ですよね。
今回はここまで。

環境変数の対応リストを作る

Windows では os.environ[“HOME”] が例外になってしまった。
環境変数が違うようだ、Windows が用意しているのってどんなのがあるのだろう?
C++ では Windows SDK に個別取得する関数があるのであまり気にしていなかった。

今後のプログラム用に環境変数の対応リストが作りたい。

ということで environ のキーと値を書き出す簡易スクリプト。
Windows でも Linux でも動きます、一応 Windows 版は Python 3.0 で試した。
print でリダイレクトしたほうが今の私は早いけど Python だけでやってみよう。

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

# 環境変数の書き出し

import os

keys = os.environ.keys()
result = ""
for key in keys:
	result += key + "\n" + os.environ[key] + "\n\n"

f = open("env.txt", "w")
f.write(result)
f.close()

ちなみに私の環境ではこうなった(合体しています)

env.txt

同じモンがありゃしねぇ、こりゃ環境変数を利用したコードの共有は無理だ。
どうでもいいけど Windows 用 Python での \n は CRLF になるんだね。

ちなみに IronPython では下記の要領で同じことができます。

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

import System

# IronPython は clr なので \n では LF 固定になってしまう
nn = System.Environment.NewLine

# IDictionary が返る
dic = System.Environment.GetEnvironmentVariables()
result = ""
# DictionaryEntry に展開
for ent in dic:
	result += ent.Key + nn + ent.Value + nn + nn

sr = System.IO.StreamWriter("env.txt")
sr.Write(result)
sr.Close()

なんか Python らしくないコードだ、なんたって値取得に括弧が付いていない。
プロパティから取得する部分には当然括弧は付かないわけでこうなってしまう。
大文字が多いのはしかたがないが CPython コードとの見分けになると思えば…

#! /usr/bin/env python は言うまでもなく書いてはいけません。
つーか *.py は Windows での振り分けにはどうしよう?関連づけは CPython だし。

なんて解説をしているのでもう解ると思うけどこのコードは mono でも動きます。
Ubuntu 8.10 デフォルト状態でも IronPython 1.1.2 ならそのまま動かせる。

linux_ipy

とはいえ Linux で IronPython というのは凄く無駄を感じますけど。
動かせるとはいえ実用となると今後もビミョーとしか言いようがない。

一応書くと Mac は全然解りません。

PowerShell はなんとも 2

PowerShell をメニューから起動すると巨大なウインドウになって面食らう。
コレは右クリックしてプロパティから調節できるはずなんだけど…

psproperty

大きさを変更して「適用」するとフォントが太字に早変わり。
パス区切りもバックスラッシュになり Alt+半角/全角 を押しても日本語入力が不能に。
ワケワカンネェ!デフォルトのまま使うしか無いってこと?

と思ったけどメニューにあるショートカットをコピーして弄くるとこうなるっぽい。
本体から右クリックドラッグして直接ショートカットを作ったら普通にカスタマイズできた。
でも「デスクトップにショートカット作成」を利用するとアイコンが cmd.exe に。
わけわかんねぇ、Vista というか私の環境だけか?

画面バッファのサイズがスクロール範囲
ウインドのサイズが半角英数が何文字入力できるか(全角は半分)のようだ。
システム設定を使うにチェックを入れると起動位置は Windows が勝手に決める。
というか cmd.exe も同じなんですけどね。

まぁ標準出力なんだから cmd.exe から使えるんですけどね。

cmdpower

とにかく kill コマンドが使えるのが嬉しい、タスクマネージャより楽。
cmd.exe でもやれるんだろうけど使い方イマイチ解らないし。

でもファイルをドロップしても bash みたくパス名に展開してくれないなぁ…
まあ minipoli を使えばいいんですけど、D&Dは Windows のほうが本場じゃ?
Ctrl+Shift+C (V) という解りやすいコピペのショートカットもやはり無理か。

他に検索すると F7 でコマンド履歴とか見つかるけど上矢印キーのほうが楽だと思う。

そういえば UAC はどうなるの?と思って cp コマンドで system32 フォルダへ。
容赦なく拒否された、UAC ダイアログくらい出してよ、いやそれではリモート接続が…
「管理者として実行」をまずしなきゃいけないの? su なり sudo なりも真似してよ。
UAC が嫌われる原因の一つがよく解った。

PowerShell はなんとも

upman

VirtualBox 上の Ubuntu は三ヶ月置いたらこんなにイッパイ…
本当に Ubuntu は凄まじい勢いでアップデートを行っているなぁと。

vlgosic

どうしても同じ VL ゴシックの 9pt に見えないんだが何故だろう?
って画像にしたらアンチエイリアスが掛かってまったく同じに見えるわな。
実物はやはり違う、Windows では MS ゴシックでいくほうが良さそうだ。

さて環境の更新作業が終わったところで。

Windows Power Shell をインストール。
.NET なので最初の起動が当然遅い、SupewFetch が覚えるまでの我慢だ。

とりあえず cd のドライブ間移動で /d オプションが不要になったみたい。
つーか

pshell

ちょー!何コレ。
パス区切りは \ は当然だけど / でもいいとか、^/ でホームに戻るとか。
カレントディレクトリにあるスクリプトの実行は ./ を付加する必要があるとか。
おいおい、kill コマンドまで使えちゃったよ、何を考えているのコレ。

完全に UNIX からの乗り換えを意識しまくっている。
でもやっぱりアルファベットの大小文字の区別はしてくれないのね。

ところで Tab キーでの補完って cmd.exe でもできたんだ、知らなかった。

パスを通しておけば python と打つだけで普通に Python 端末にもなる。
でも Windows は UNIX 系のように実行ファイルが特定ディレクトリに固まっていない。
こうしたい場合は自前でパスを通さないと bash のようには簡単に使えない。
cmd.exe の代わりにシェル端末としても十分使えるようだ。

pspy

ググれば $ を使った変数や関数の書き方がすぐに見つかる。
けどそういうのは Python 等でやったほうが楽なので覚えても使わないかと。
UNIX のように必要な場面はあまり無いだろうと思う、書き方も面倒だし。

cmd.exe よりは圧倒的に使い道があるなと。
ただ .NET ではなくネイティブコードでコレを実現してほしかったなぁという感じ。
Vista 以前の Windows では遅すぎて使う気にならないだろうし。

Windows での Python はシステムには関係無いので遠慮無く 3.0 を使う。
とりあえず昔書いたスクリプトを動かしてみる、あっさりエラー。
print が文から式に変わったので括弧が必要になるのをお忘れなく。
Windows 版 Python 端末は Ctrl+Z で終了ですのでお間違いなく。

しばらく Windows へ

いやいや、Linux から Windows へのデータ引越しは面倒だわ。

一番困るのは USB メモリへのコピーとかでファイル名の大小文字を区別しないこと。
いくつかの名前変更、仮想の Ubuntu に持っていく奴はアーカイブを強いられた。
どう考えたって区別したほうが便利なのに、統一望む。

Windows のファイル名に使えない文字は使っていないと思うけど…
ちなみに Linux でのファイル名駄目文字は半角スラッシュただ一つ。

それと DVD-R 書き込みに Barasero というのを使っているんだが。
書き込み完了毎にエラーが出る、いや書き込めてはいるんだけど。
それより何より使いにくい、他を探すっても書き込みなんて年に数回しかしないし。
シンプルなのはイイんだけどやはり Windows の市販アプリと比べてしまうよ。

Vista を入れたままの HDD に入れ替え、ついでにホコリを掃除して起動。
多分、三ヶ月も放置したからいきなり Windows Update が始まるだろう。

・・・・・・・・・・・・・・・

と思っていたけど何も無い、あれ?
それどころか「ウイルス対策ソフトがインストールされていません!」と警告が出た。
監視オフにしていたはずなのに勝手に監視するな!

…セキュリティを何か勘違いしていないか Microsoft さんは。

OS のまめな更新
必ずファイルの拡張子は表示させ意味を理解しておく
ネットワークと実行ファイルとスクリプトの知識を付ける
IE は Microsoft 等の公式サイト以外では使わない
日本語がおかしいサイトから落としたアプリはインストールしない
海外のあやしいサイトは覗かない
UAC は絶対にオフにしない
2ちゃんねるを見ない。

を徹底すれば感染する要素なんて何も無い。
OS がこうでは世間の勘違いは止まらないんだが。
それともコレもウイルス対策ソフト会社の圧力だろうか。
Windows 7 が圧力に負けてセキュリティを意図的に落としたように。

とりあえず即座に自分で Windows Update を。
三ヶ月間が開いたわりには 14 個か、もう随分安定したってことだね。

kousin

その Update 中に Java の更新通知が出る。
Sun のほうがよっぽどまともだと思った。

「はい」を押すとなつかしの UAC ダイアログが。

中途半端だ、パスワード入力を強制にしろ!
ついでにスクリプトや EXE の実行にはもっと制限を付けてくれ。
Linux から戻るとこの甘さに唖然だ。

そうだ IE を v8 にしなきゃ、もちろん表示確認用にだが。
Opera と Firefox も更新と、軽く使ってみる。
あぁ、Windows 版の Opera はウソみたいに安定しているなぁ。
それよりスムーススクロールでもキビキビ動く現実が信じられない。
Linux 版もこのレベルに…Qt の時点で無理だと思うけど。

秀丸とかを使ってみる。
MS ゴシックのフォントが今やギザギザにしか見えない。
そういえば VL ゴシックを以前入れたなぁと思い出し変更。
あれ?やっぱりギザギザ、どうもアンチエイリアスが掛からないっぽい。
しかしやはり ATOK は神だ、Anthy の意味不明変換にはもう慣れたけど。

・・・・・・・・・・・・・・・

OS のネタだったね。

Aero なのでウインドウ表示は超綺麗だし移動や最小化も呆れるほどスムース。
CPU 負荷がゼロも同然なのが今更怖い、Ubuntu は 3D 無効でも結構使っていたし。
それより何よりダイアログのアクティブ化が正確なところが Windows の強さだと思った。
Compiz がこうなる希望は持てないんですよね。

だけどウインドウを動かした時に隅にスナップしないことに違和感が…
最初はスナップすることに違和感があったのにすっかり馴染んでいる…

Explorer だが以前はプレビューが嫌いで無効にしたりしていたが悪くない。
でもアイコンの大きさは Nautilus と同等にしてや、大アイコンなんてウザいだけ。
てかいちいち前回の表示状態を記憶するのはヤメてくれないか、イライラする。

それと動画のプレビュー位置が Nautilus と違うのが変に気になった。
Nautilus は真ん中くらいだったけど Explorer は最初の数秒後になるようだ。

プレビューするファイルを大ざっぱに選択できる Nautilus のようにすればいいのに。
そういうコトはオンラインソフトを使うというのが Windows の世界だったわけだが。
てゆーかファイル全部に拡張子を付けるのが面倒くさいぞ。

さてと…なんか端末や Python が無いと落ち着かなくなったぞ、病気か?
cmd.exe を起動…してみたが使い方がワカラン、困ったものだ。
Windows Power Shell とか Python 3.0 をインストールしよう、続く。