Programming」カテゴリーアーカイブ

Windows 7 C# Build @ WPF

久々に Windows を使っているけど IronPython が遅すぎる。
コンパイル不要でライブラリも .NET がほぼフルで使えるので困らないし何より簡単。
なのはいいのだけれど、DLR 初期化が遅すぎて道具として使う気にならない。
地味に小物ツールを作っているんだけれど使わない…

コンパイルするなら C# で作ったほうが楽だし Web 上の Tip’s も C# なら桁違い。
それより何より Windows 7 なら何もインストールせずに C# がビルドできる。

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

なんか IronPython も将来性が不安な雰囲気だし。

米Microsoft、IronRubyおよびIronPythonをコミュニティに移管 – SourceForge.JP Magazine : オープンソースの話題満載

もう Windows は C# を主に利用するほうが懸命かと。
SeeMe も次で C# に戻すか考えなければ。

ということで今回は VisualStudio 等を一切使わずに WPF ウインドウを作る方法を。

VisualStudio を使ったほうが簡単だ!と言わない。
Linux ばかり使っている人間はテキストエディタとコンソールのほうが楽なんじゃい。
小物のツールを作るのに統合開発環境なんてバカな話だ。
本音は Visual C# だかの無償開発環境をインストールして何も作れない人を馬鹿にしたいから。

Microsoft.Win32.OpenFileDialog for .NET 4.0

IronPython は clr.AddReferenceByPartialName() メソッドでアセンブリ参照の追加ができた。
けど C# は同じようにコードでアセンブリ参照を追加する方法が見つからない。
というかコンパイル時に厳しい文法チェックを行う C# ではソレは無理なのかな。
素直にコンパイラオプションで参照する方法を MSDN で探す。

C# Compiler Options Listed by Category

/reference オプションを利用するだけなのか。
アイコンも /win32icon オプションだけで指定できる、VC++ より簡単だ。
引数が多くて長いのでバッチを作ったほうが楽だね。

build.bat

C:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe ^
/reference:PresentationCore.dll ^
/reference:PresentationFramework.dll ^
/reference:WindowsBase.dll ^
/target:winexe ^
/out:net35wpf.exe ^
/win32icon:777.ico ^
/optimize+ ^
wpf_win.cs
PAUSE

この例は .NET 3.5 の csc.exe を使うのでフルパスを、32bit の人はパスを書き換えてね。
^ を利用すればインラインなコマンドを改行できる、bash は \ だけど。
最後に PAUSE と書けば *.bat の W クリックでコンソールが閉じないのでお勧め。
アイコンは勝手に用意して書き換えよろしく。

肝心な C# コードはせっかくなので Binding を使ってみた。
Main 関数に Single Thread Apartment 属性は必須なので忘れずに。
あ、BOM 付き UTF-8 で保存ね。

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;

class OreWin : Window
{
	private TextBox _textbox;
	private TextBlock _textblock;

	public OreWin()
	{
		this.Title = "俺のういんどう!";
		this.Width = 400;
		this.Height = 120;
		this.DataContext = _textbox;
		this.CreateControls();
		// Binding
		var binding = new Binding("Text");
		binding.Source = _textbox;
		_textblock.SetBinding(TextBlock.TextProperty, binding);
	}
	private void CreateControls()
	{
		_textbox = new TextBox();
		_textblock = new TextBlock();
		var label = new TextBlock(new Bold(new Run("何か書くと下にコピーされる")));
		var stackpanel = new StackPanel();
		// Append
		stackpanel.Children.Add(label);
		stackpanel.Children.Add(_textbox);
		stackpanel.Children.Add(_textblock);
		this.Content = stackpanel;
	}
}

class Test
{
	// WPF 等では STA 属性必須!
	[STAThread]
	public static void Main(string[] args)
	{
		var win = new OreWin();
		var app = new Application();
		app.Run(win);
	}
}
//

Pascal & C++ 屋だった頃は勘違いしやすい var に否定的だったけど…
Python 屋になった後では var と書くのすら面倒臭くなってしまった。
つーかメンバアクセスに this を書かなければ気がすまなくなっているのが怖い。
new もウザい、セミコロンを忘れる、メンバ変数も this にくっつけ…(以下略
C# って何か中途半端な気がする、まあ従うだけだが。

とにかく build.bat を W クリックしてコンパイル。
アイコンを含めたコードも置いてみる。

wpf_win_src.zip

よしよし、何もインストールしないでコンパイルできたぞと。
しかも起動はアッという間、IronPython をやっていたのが馬鹿馬鹿しい。
来年からはこんな感じで Windows でも小物を作っていきますか。

******************************

2010 年の反省、サイトもブログも更新歩度が下がり続けている。
ヤル気が無くなったわけではない、株を始めたので勉強に忙しいのです。

ちなみに今年のアフィリエイト収入は三千円ちょっと…
たった二十万円で始めた株は四ヶ月で一割強増えた…
当然のように株の更なる勉強と増資の日々に…

Linux プログラミング Blog なんてアホくさくてやってらんねぇ!
いくら Linux でのアプリ作りが主な記事の Blog だからってコレでは…

やはり Windows プログラミングをもう少し増やしたほうが良さそう。
というわけでまた来年。

Ramen Timer for Ubuntu sh

以前 bash を使ってラーメンタイマーを作った。

Ramen Timer for bash

しかしイマイチ気に入らない、Ubuntu の sh は dash へのリンクだ。
普通に #!/bin/sh で始めたり sh に渡すと逆順連番が展開されない。

Almquist Shell – Wikipedia

dash でヤルなら seq を使うしか無いかな、知識が足りないからだろうけど。
seq は逆順にできないので sort で反転させれば上手くいくと思う。

ところで printf なんてコマンドがある。

#!/bin/sh

read -p "何色? :" pantu
printf "%sのパンツ\n" $pantu

echo より遥に解りやすい、C 言語の使い方で括弧やカンマが無いだけだし。
\r や \n エスケープが必要なところが自然に思えて逆に嬉しい。
しかし for 文に使うと何故か %d でも %s でもエラーになって困っていた。
今頃知ったのだが for 文の場合は %g を指定すればイケた。

そんなこんなで dash 版ラーメンタイマーを作ってみる。

#!/bin/sh

for i in `seq 180 | sort -n -r`
do
    printf "残り %g 秒  \r" $i
    sleep 1
done
echo でっきあっがりぃー

ちょっぴり進化したけど何か無駄を感じる…

Ubuntu 10.10 for DotNet EXE

こんなタイトルだけどまず Python の話。
Python で文字列を得ようとしたけど None が戻る場合がある。
今まで if で確認していたけど or 演算子が使えるようだ。

>>> import os
>>> print os.environ.get("HOME") or "Hentai"
/home/sasakima-nao
>>> print os.environ.get("LOLI")
None
>>> print os.environ.get("LOLI") or "Hentai"
Hentai

便利だけど他の言語と互換性が無いよな…
最近使っていないけど超何でもあり言語な C# なら同じ事が可能かな?
と思い久々に Ubuntu 10.10 で C# コードを書いてみたけどダメだった。

しかし何だこれは!

実行パーミッションが付いていたら exe を起動できるようになっている。
「./」指定をすると Tab キーで exe 拡張子までを保管する親切さだよ。
いつからだろう?Ubuntu 10.04 までは mono に渡す必要があったと思うんだけど。
Nautilus から W クリックすると書庫マネージャが起動してしまうんだけどw

てゆーか…
そんなに .NET アプリを Linux で使いたいのだろうか…

標準以外のライブラリは使わない、P/Invoke も WPF も利用しない。
であるならソレでもいいのだが、逆に Windows で GtkSharp なんかもご勘弁。
ところで Ubuntu 10.10 デフォルトは WindowsForm さえ使えないみたいですけど。

GtkSharp も TomBoy が残っている間は有るわけだが、今後はどうだか。
趣味プログラミングならともかくアプリケーション作りはライブラリ次第だもの。
小物を作るにも Python のほうが便利だしライブラリは標準で豊富だし、なんだよね。

register_sinkfunc

Y901x を機動すると以下の推奨メッセージが出るようになった。

** Message: pygobject_register_sinkfunc is deprecated (GstObject)

問題なく動くからあまり気にしていなかったけどそろっそろ…
海外を探しても関係ないバグ情報ばかりで困っていたのだが…

ふと思いついて rhythmbox で試してみても同じだった。

どうせ見つからないと思うけど日本語で探してみた。
んー、これはもしかしなくても ATI なのが悪いのかな。

Ubuntu日本語フォーラム / Moovidaメディアセンターが起動できません

ということで GStreamer がおかしいのだろう。
お手上げだ。

ついでに発見。
Y901x のフルスクリーンは全体サイズをフルスクリーンにしていた。
けど GDK だけフルスクリーンでもイケたと何を今更知った。
GtkBox に配置しているパーツは hide しなきゃいけないみたいだけど。

def change_fullscreen(self):
    if self.p_filename == "":
        return
    if self.fullscreen:
        self.fullscreen = False
        self.w.window.unfullscreen()
        #self.w.unfullscreen()
        self.fullobj.destroy()
        self.fullobj = None
        self.menubar.show()
        if self.full_list:
            self.listbox.show()
        #self.w.resize(self.fullsize.width, self.fullsize.height)
    else:
        self.fullscreen = True
        #cx, cy = self.w.get_size()
        #self.fullsize.width = cx
        #self.fullsize.height = cy
        self.full_list = self.listbox.get_property("visible")
        if self.full_list:
            self.listbox.hide()
        self.menubar.hide()
        self.fullobj = CFullCtrl(
                self.hbox_ctrl,
                self.toolbox,
                self.vbox_main,
                self.statusbar
            )
        #self.w.fullscreen()
        self.w.window.fullscreen()

つまり gtk.Window.window.fullscreen() 処理だけでよかった。
全体をフルスクリーンにして後でサイズを戻す処理は必要ないんだね。

コレならフルスクリーン中にリストを出す処理も簡単に実装できるかな?
そういえばリストを下に移動する処理を入れるって前書いたっけな。
ユーザーは多分自分だけだと思うからどうするのも勝手だけど。

WebKit for Python

Ubuntu 10.10 のアップデート、61MB もあるんかい!
ってよく見たら libwebkit なんてのがあるんだけど…

WebKit な Epiphany は GNOME 標準だけど Ubuntu では除かれているのに。
ライブラリだけは存在しますということなのかな?
まてよ、そういうことならデフォルト状態で Python から使えるかも。

>>>import webkit

10.10 はデフォルトで利用できるようです、てゆーか
/usr/share/doc/python-webkit/examples/browser.py
にサンプルコードがあるわな。

このサンプルコードを試してもいいけど最小限のコードを書いてみる。

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

import gtk
import webkit

class WebKitTest(gtk.Window):
    """
        WebKit test for Python
        from Ubuntu 10.10
    """
    def __init__(self):
        # Window
        gtk.Window.__init__(self)
        self.connect("delete-event", gtk.main_quit)
        self.resize(640, 480)
        # WebKit
        w = webkit.WebView()
        w.load_uri("http://google.co.jp/")
        # ScrollWindow
        sw = gtk.ScrolledWindow()
        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        # add
        sw.add(w)
        self.add(sw)
        self.show_all()

if __name__ == "__main__":
    w = WebKitTest()
    gtk.main()

おぉ、コレだけで使えるのか。
GtkScrolledWindow を噛まさないと縦長のページで悲惨になるので注意ね。
後はサンプルコードを見ながらチマチマ弄くれば立派な自作ブラウザになりそう。

とにかく Python だけで何でも作れてしまう。
デフォルト状態でも作って遊べるというのはやはり素晴らしい。
Windows ではこんなこと考えられないものなぁ。