EmEditor C# snippet

正月から Windows 7 を使っているけど Opera と EmEditor しか使っていない…

まぁ Ubuntu でもあまり変わらないけど。
画像と動画は Ubuntu でしか見ない、てか Windows 7 はミニノートだし。

もう少し EmEditor v10 をカスタマイズしなければ今はチト苦しい。
EmEditor 用に <>& をエスケープするマクロを最低でも作らねば。
Blog に XAML 等の XML を書き込む等の時に必要なんだもの。
Linux Gedit 用は自分で公開しているし秀丸では他人が作ったマクロを利用していたが。

実は簡易で作っていた、JavaScript が得意じゃない私なので酷い処理。
ぶっちゃけ document.selection.Replace() を 3 回繰り返すというギャグw
これではあんまりなので今度は JavaScript の勉強。

html_escape.js

if (!document.selection.IsEmpty) {
	var ss = document.selection.Text;
	var s, result = "";
	var n = ss.length;
	for (var i=0; i<n; i++) {
		s = ss.charAt(i);
		if (s=="&") {s = "&amp;"};
		else if (s=="<") {s = "&lt;"};
		else if (s==">") {s = "&gt;"};
		result += s;
	};
	document.selection.Text = result;
}

でいいみたい、得意じゃないので無駄が多いかもしれないけど。
String は charAt メソッドで日本語でも一文字づつ取り出しできるんだね。
ソレさえ理解すれば後はどうとでも作れるはず、今までどの言語でもそうだった。
JavaScript も今年はもう少し勉強しよう。

それよりデフォルトは C# が C/C++ と同じスニペットになっている…
全然同じじゃ無いだろ、これ私の環境だけなのかな?
C# 専用スニペット郡を作って最低でも以下を追加しないと。

トリガ doc

/// <summary>
/// $0
/// </summary>

トリガ main

class __main__
{
	[STAThread]
	public static void Main(string[] args)
	{
		var app = new Application();
		app.Run(new ${0:/*ClassName*/}());
	}
}

トリガ try

try
{
	$0
}
catch (Exception e)
{
	
}
finally
{
	
}

トリガ proc

private void ${0:/*procedure*/}(object sender, RoutedEventArgs e)

これだけ作っておけば結構楽にコードが書けると思う。
VisualStudio を使わないなら summary はあまり意味が無いけど一応。
Python で docstring を使うようになったので基本に合わせたくなるのよ。

後はたとえば main と打ち込み tab キーを叩けば

Linux ではスニペットって常識以前なんだが何故 Windows では流行しないのか?
おかげで cmd.exe は Tab キーで補完できることを Linux を使うまで知らなかったぞ。
cd do と打ち込んで Tab キーで cd Documents まで補完、こんなに移動は楽なのに。

というか秀丸にスニペット機能が付けば秀丸に戻るんだけどな。
Windows 版 Gedit が存在するのは知っているが大半のプラグインが動かないと思うし。
試すつもりも無いが。

沢山のアプリを試す暇があったら一つを徹底的に使いこなしたほうがイイ。
機能に不満で乗り換えて、を繰り返すと結局最後は Em か秀丸になるのだから。
と元フリーソフト作者自身が言うのだから間違いない。

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

そうだ、Windows アプリといえば

Qonoha

この人だけは続くだろうとは思っていたけどまさか今でも更新しているとは。
てか他のプレイヤー作者って誰がいたっけ?マジで忘れたw

私なんて今や Windows は VLC media player だ、Cinema 使っていない…
だってあんまり Windows を使わないのに別途でデコーダーを入れるなんて面倒臭い。

というか、ココは今では何もインストールしないでプログラミングのブログだし。
なるべく最小限構成な Windows のままで使いたいので単体な VLC が一番なのよね。
Linux では Y901x を使っているからいいじゃん、みんな Linux においで。

Windows 7 C# Build @ .NET4.0

正月といえば、やはりプログラミングですよね。

前回は .NET Framework 3.5 の WPF を使いました。
それは Windows 7 なら最初から必ず入っているからという理由もありますが。
実は .NET 4.0 でやってみたけど上手くいかなかったから…

やはり現在の最新技術である 4.0 を使ってみたいじゃないですか。
ということで色々と自分で実験してみた。
技術文書とかは読まず(解らないもん)自力で漁った結果と前置きして。

.NET 3.5 での reference はカレント及び csc.exe のディレクトリ
それと C:\Windows\assembly を探すようだ。

このファイルに見えるものは実態ではない、端末で見れば解る。
Linux ばかり使っていて良かった、以前なら端末で見ようなんて絶対に思わない。

サブディレクトリ内に実態がある、正直なんだかよく解らない。
とにかく 4.0 の csc.exe ではこの位置の PresentationCore.dll は見つけられない。

4.0 の csc.exe があるディレクトリをよく見ると、ぶっちゃけ下記だが
C:\Windows\Microsoft.NET\Framework64\v4.0.30319
に WPF というディレクトリがありソコにも PresentationCore.dll 等が。
ということはコッチを /lib オプションで指定すればいいようだ。

/lib 指定でビルド、System.Xaml.dll が見つからないとエラー…
って .NET 3.5 までは System.Xaml アセンブリなんて無かったような気がするんだが。
上記 assembly ディレクトリを漁ってもやはり見当たらないし。

WPF 4(VS 2010&.NET 4シリーズ) ? @IT

どうも .NET Framework 4.0 からのようで、XAML を使っていなくても必要なのね。
csc.exe のディレクトリ直下にある、ので System.Xaml.dll を参照追加指定だけ。
暗黙のリンクはやってくれない、何か事情があるのだろう。

ところで 64bit ディレクトリ指定にして配布は大丈夫なのだろうか?
exe に位置情報が埋め込まれていたりすると 32bit では動かないんだが。
32bit と 64bit の csc.exe でビルドして diff してみる。

exe 名以外は特に違いが見つからない、というかパス情報は無いみたい。
というかどちらも AnyCPU ビルドなんだからほとんど同じものが作られるんだね。
ネイティブで動くか WOW64 で動くかの違いだけなのかな?

どっちでも同じなら 32bit 位置指定のほうが心配が少なそうだから今後はそれで。
ということで 64 でないほうのディレクトリ指定でバッチを作る。

build32.bat

C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe ^
/lib:C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF ^
/reference:System.Xaml.dll ^
/reference:PresentationCore.dll ^
/reference:PresentationFramework.dll ^
/reference:WindowsBase.dll ^
/target:winexe ^
/out:TextReader.exe ^
/win32icon:icon.ico ^
/optimize+ ^
src.cs
PAUSE

v4.0.30319 というディレクトリ名は皆同じなんだろうか…
この Blog は自分で作って自分で使う(遊ぶ)人向けなのだからオケということで。

ということで今回は自分で復習のつもりでテキストリーダーを作ってみた。
UTF-8 以外は文字化けします、私は全部 UTF-8 保存しているので問題無し。
エントリポイントが解りにくいので __main__ という名前にしたw

src.cs

using System;
using System.IO;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using Microsoft.Win32;

class TextReader : Window
{
	private TextBox _textbox;

	public TextReader()
	{
		this.Title = "てきすとりぃだぁ!";
		this.Width = 400;
		this.Height = 400;
		this.CreateControls();
	}
	private void CreateControls()
	{
		_textbox = new TextBox();
		_textbox.TextWrapping = TextWrapping.NoWrap;
		_textbox.AcceptsReturn = true;
		_textbox.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
		_textbox.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
		// Button
		var button = new Button();
		button.Content = "Open the Text";
		//button.Click += new RoutedEventHandler(on_button_click);
		button.Click += on_button_click;
		DockPanel.SetDock(button, Dock.Top);
		// DockPanel
		var dockpanel = new DockPanel();
		// Append
		dockpanel.Children.Add(button);
		dockpanel.Children.Add(_textbox);
		this.Content = dockpanel;
	}
	void on_button_click(object sender, RoutedEventArgs e)
	{
		var dlg = new OpenFileDialog();
		var res = dlg.ShowDialog(this);
		if (res.Value)
		{
			var sr = new StreamReader(dlg.FileName, Encoding.UTF8);
			_textbox.Text = sr.ReadToEnd();
			sr.Close();
		}
	}
}

class __main__
{
	[STAThread]
	public static void Main(string[] args)
	{
		var app = new Application();
		app.Run(new TextReader());
	}
}

textreader.zip

new RoutedEventHandler() を使わずにイベントハンドラが追加できたんだが…
以前からそうなのかな、VisualStudio だと強制的に書き込まれるはずなんだが。
余計な new が少ないのは嬉しいよ。

.NET 4.0 なので Microsoft.Win32 名前空間のダイアログも最新だ。
それ以外は 4.0 の恩恵が何も無いという…

3.0 時のような劇的進化は特に無いし 3.5 でイイやとか思ってしまうよ。
とにかく .NET 4.0 でも何もインストールせずに遊ぶ方法が解ったのでよし。

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 でっきあっがりぃー

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

Majestouch Tenkeyless Keyboard

ディスプレイを 23inch FullHD に変更してからキーボードが気になる。
机がそんなに大きくないのでキーボード位置がどうしても左に寄ってしまう。
以前はディスプレイ自体を左寄せしていたけど大きくなってしまったら無理だ。
更にディスプレイの色が銀から黒になりアイボリーのキーボードが浮いている。

もう小型で黒いキーボードに変えるしか違和感を消す手は無いようだ。
Home/End キーが私は絶対に単独で必要だからテンキーレスでいきたい。
値段は少々高くてもいい。

そうなると評判がやけに高い RealForce か。

あの独特なタイプ感に馴染めるかが少し心配だ。
詳細を見ようと東プレのサイトを見てみた。

東プレ株式会社

あれ?東プレってパソコン周辺機器の専門会社じゃなかったんだ。
そんな勘違いをしていたのは私だけなのだろうか。
まあ社名からプレス関連だと解りそうなのだが。
ついでに見てみた株価も底値臭いし買い時かな?様子見しよう。

と書きつつダイヤテックの FILCO Majestouch を買ってみた。
カチカチ音がするキーボードを久々に使ってみたくなったので。

本日届いたので早速試す、意外に重い。
とにかく真ん中にキーボードとディスプレイが自然に置けたぞと。
大きさ比較用に Tommy の CD を置いてある。

Opera でサイト観覧時に片手で Home や PageUp を叩こうとしたときに迷った。
そういう時って自分は右端を基準にキー位置を探しているようだ、慣れが必要そう。

でも両手でタイピングをしている場合は普通に叩ける。
テンキーは普段はあまり触らないので気にならない。

それより space キーが大きめなことが意外に重宝する。
RealForce は何故あんなに小さいのだろう。

カチカチ音は気持ちいいけど夜中はやっぱりタイプ音が少し大きいかな…
しかしタッチは最高だ、前に使っていた薄型キーボードより遥に打ちやすい。
キーストロークは深いほうがミスタイプが少ないと思い知る。

実際の話ショップで試し叩きしたりして良さは解っていたのだが。
それにしてもやはりこの手は Amazon が一番安上がりだなぁ。