Ubuntu 9.10 には build-essential はイラン

アクセスログを見て見つけたが

Ubuntu9.10を使っています。 Cの勉強をしてみたいと思っているのですが、gccの使い方について教えてください。 ソース内に日本を含み、シェルでの出力にも日本語を伴う場合.. – 人力検索はてな

> http://palepoli.skr.jp/content/ubuntu/mono.php
> 統合環境を使ったほうがお手軽です。

いや…
C をまったく知らない人にイキナリ総合開発環境を勧めるのはどうかと。
そのページを書いた本人も十年前は Windows にて BCC で勉強していた人なんですけど。

というか Emacs で文字コードがどうのって普通に保存すれば local と同じにならないのかな?
local は UTF-8 なんだから bash も当然 UTF-8 で出力するわけで、とりあえず cat しろと。
なんか気になったので仮想の Ubuntu 9.10 を立ち上げて適当にコンパイルしてみる。

やっぱり問題無い。
return かセミコロン書き忘れとか超くだらない理由じゃないのかと疑ってしまう。

しかしおかげで気がついた。
Ubuntu 9.10 には build-essential はイラン、最初から gcc がありヘッダも揃っている。
と以前 Blog には書いたと思うけど覚書のページは昔のまんまや!
書き換えなきゃ…でも今は日本で人気が薄い Mandriva Linux がメインな私ですけど。

ところで、今でも PyGtk よか mono や c の覚書ページのほうがアクセスが倍以上のまま。
Google のおかげで Python 知名度は上がったけど初心者の大半は C/C++ 開発に憧れている。
と勝手に解釈している、基本は C 言語であるというのは同意だし絶対に勉強しておけ。
だけど何故か Y901x のダウンロード数は増えて今月は既に百を超えているのって不思議。

それより、なんたって初心者御用達な Ubuntu でのプログラミングですので…
楽をしようと Python/PyGtk からプログラミングに入ると寒いアプリが乱立しそう…
VB に ActiveX コントロールを貼り付けただけで工夫の無いアプリみたいなのが再現…

やはり Linux で C/C++ のページをキチンと作ったほうがいいかなと思ってきた。
オブジェクト指向っていうけどソレってつまり実態に見せかけただけのポインタですから。

IronPython IDisposable and Python Context Management

What is the equivalent of the C# “using” block in IronPython? – Stack Overflow

IronPython で using てか IDisposable が利用できたんだ。
知らなかった、てゆーか with, as って何だ?
私が買った Python の本にはこんなの書いていなかった気がするんだが。

with – odz buffer

Python 2.5 以降で使えるらしい、IronPython だけというわけでは無いようで。
やっぱり知っている人は少ないのか、もう少し調べてみよう。

3.10 コンテキストマネージャ型

__ext__ 指定だけだと例外になった、__enter__ と常に対にする必要あり。
試しに何か書いてみよう、と思ったけど IronPython で思いつかなかった(ぉい!

で、PyGtk の gtk.MessageDialog は destroy() メソッドを呼ぶ必要があるので

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

import gtk

class MessageBox(gtk.MessageDialog):
    def __init__(self, parent=None, flags=0, type=gtk.MESSAGE_INFO, 
                  buttons=gtk.BUTTONS_NONE, message_format=None):
        gtk.MessageDialog.__init__(self, parent, flags, type, buttons, message_format)
    def __enter__(self):
        #print 'enter' # debug
        return self
    def __exit__(self, *excinfo):
        #print 'exit %s' % repr(excinfo) # debug
        self.destroy()

def messagebox(text):
    with MessageBox(buttons=gtk.BUTTONS_OK, message_format=text) as dlg:
        dlg.run()  

messagebox("Test !")

おぉ!確かにこれで解放処理を書かずに関数が使える。
でも try, finally のほうが解りやすいと思うんですけど…
組込みなら使うけど自分で書くかは少し微妙。

DataBinding Compare Code and XAML

IronPython にて WPF の DataBinding をコードで行う方法が解らなかった。
ElementName をコードで書き込んでも反映されないし。
ということで毎度のように検索、C# コードなら日本語で見つかるから便利だね。

[WPF][C#]Bindingでくっつけてみよう その1

コードで行うには Source Property か DataContext を利用すればいいのか。
XAML を含めて IronPython でやってみよう。

Source Version

# -*- 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 DataBindingTest(Window):
    """
        Source Version
    """
    def __init__(self):
        # Create Controls
        textbox = TextBox()
        textblock = TextBlock()
        # Append
        stackpanel = StackPanel()
        stackpanel.Children.Add(textbox)
        stackpanel.Children.Add(textblock)
        self.Content = stackpanel
        self.SizeToContent = SizeToContent.WidthAndHeight
        # Binding
        binding = Data.Binding("Text")
        binding.Source = textbox
        textblock.SetBinding(TextBlock.TextProperty, binding)

if __name__ == "__main__":
    Application().Run(DataBindingTest())

DataContext Version

# -*- 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 DataBindingTest(Window):
    """
        DataContext Version
    """
    def __init__(self):
        # Create Controls
        textbox = TextBox()
        textblock = TextBlock()
        # Append
        stackpanel = StackPanel()
        stackpanel.Children.Add(textbox)
        stackpanel.Children.Add(textblock)
        self.Content = stackpanel
        self.SizeToContent = SizeToContent.WidthAndHeight
        # Set DataContext
        self.DataContext = textbox
        # Binding
        binding = Data.Binding("Text")
        textblock.SetBinding(TextBlock.TextProperty, binding)

if __name__ == "__main__":
    Application().Run(DataBindingTest())

XAML Version

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

import clr

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

from System.Windows import Application
from System.Windows.Markup import XamlReader

xaml = """<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    SizeToContent = "WidthAndHeight">
    <StackPanel>
        <TextBox Name="_tname" />
        <TextBlock Text="{Binding ElementName=_tname, Path=Text}" />
    </StackPanel>
</Window>"""

w = XamlReader.Parse(xaml)
Application().Run(w)

どれでも結果は同じ、TextBox に書き込んだ文字列がそのまま TextBlock に。
DataContext はバインディング元データが一つなら問題無いだろうけどチト怖いかな。

というより、やはりこういうのは XAML が一番解りやすく書けますね。
用途によってコードにするか XAML にするかで選べばいいことだけど。

Windows 7 の csc.exe で遊んでみる

最近の Linux で GNOME ならばデフォルトで C# のコンパイルが可能。
Mono が入っている環境であれば必ず gmcs があるからである。

と以前書いたけど実は Windows 7 も可能だったりします。

C:\Windows\Microsoft.NET\Framework64\v2.0.50727

を Explorer で開いてみて、32bit の人は 64 を外してください。

csc.exe という C# コンパイラがあるのが解ります。
つまりコンパイルするファイルが一つであればこうやればいいわけです。
C# コードは BOM 付き UTF-8 で保存してくださいね。

フルパスを打ち込むのが面倒であればパスを通しておきましょう。
これで csc と打ち込むだけでパス指定しなくてもコンパイルが可能になる。

コマンドラインオプションのサンプルは MSDN にあります。
csc.exe を使用したコマンド ラインからのビルド

又、MSBuild を利用したコンパイルも普通に可能です。
幸い私は SeeMe をオープンソースにしているのでコイツで実験してみます。

SeeMe は現在 .NET Framework 3.5 でビルドしているので v3.5 の MSBuild.exe を使う。
コレに SeeMe4.sln というファイルを渡します。

なんかエラー?が出るけどしばらく待っていると SeeMe4.exe が出来上がってしまった。
SDK なんかインストールしないでもビルドできちゃうんですね、自分で驚いたよマジで。

MSDN に細かい解説が日本語であるけど手書きは少々辛いかも。
MSBuild

無償版 VC# が存在する今だけどこんな方法で何もインストールしないで遊べるよ。
開発環境をインストールだけやってプログラマー気取りの人を笑ってあげましょう。

実は .NET Framework 3.5 導入済みなら Windows 7 である必要は無いんですけど…
Vista より前てか XP では .NET が遅すぎて使わないだろうしやはり 7 を進めておくよ。
たった 1.2GB の CULV ノートでも快適に .NET が動きますので。

Windows 7 の PowerShell で遊んでみる

IronPython は楽しくて最高だけど Windows にデフォルトでは入っていない。
基本として OS デフォルト状態で動かせるアプリしか配布したくない私には少々問題だ。
アプリ配布で「まずコレを入れてくれ」ではアレほど馬鹿にしていた VB6 以前とカワンネ。

そうだ、Windows PowerShell という手があった。
Windows 7 ならデフォルトで入っているじゃないか。

地味に利用はしていたのだが、cd コマンドで移動して

rm *.zip

とかやって ZIP ファイルをまとめて削除したり kill コマンドを使ったりetc…
Linux と Windows を併用しているとソレが普通に、同じコマンド名が使えるところが嬉しい。
つか cmd.exe のコマンドなんてほとんど知らない…

しかし PowerShell はもっと強力で .NET がほぼフルで使えウインドウも造れるはず。
文法がイマイチ好きになれなかったけどもう少し突っ込んだ使い方をしてみよう。
検索すれば日本語での情報も IronPython よりは多い。

そういえば PowerShell では文字列のリダイレクトはどうなるのだろう?

echo あ > a.txt

は cmd.exe では当然のように Shift-JIS だが PowerShell では BOM 付き UTF-16LE に。

やっぱり文字列は UNICODE なのか、リダイレクトでは UTF-8 にはならないんだね。
リダイレクトするとUnicodeで出力されるとは… – もにっき
これだから内部と local が違う変態 OS は困る…

起動オプションは cmd.exe で以下を打ち込めば echo される。

powershell -?

ヘルプによると *.ps1 を読み込むにはフルパスか ./ 指定が必要。
まぁこれは bash でも同じなんだが、しかしやたら親切なエラー表示だなぁ。

PowerShell は通常 Multi Thread Apartment で起動する。
クリップボードとか STA(Single Thread Apartment) 属性が必要な場合は以下で起動。

powershell -sta

そうすると

[void] [Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[System.Windows.Forms.Clipboard]::SetDataObject("ほげ")

等ができる、-sta 指定しないとエラーになる、つまり WPF の利用なんかでも必須。
Windows PowerShell ISE から利用すれば自動で STA になるけど…

beep 音を鳴らす方法は何故か日本語で見つからなかった。

[console]::Beep()

音がショボイ、コッチのほうがいいかも

[System.Media.SystemSounds]::Beep.Play()

ここまでやって気が付いたけど…
*.ps1 ファイルを作ってもコンソールを出さないで利用する方法が無いみたい。
GUI を使うには物凄く向いていない、IronPython の代わりに使うのは無理かと。
やはりコイツはサーバー管理者向けですわ、まぁ何か思いついたら利用するべ。

よさげなサイト
PowerShell FAQ

こんなのもあるんだよね。
窓の杜 – 【NEWS】「PowerShell」v2の機能を拡張するモジュールパック「PowerShell Pack」が公開