IronPython|XHTMLをゴニョゴニョするスクリプト書いてみた。

コード保管庫の更新でいずれこういうのが必要になるんじゃないかと思って書いてみた。sysすらimportしない生粋のIronPython、全部.NETで書いてます。あーIronPython可愛いよIronPython可愛い。

import clr
clr.AddReference("System")
clr.AddReference("System.XML")
from System import *
from System.Console import *
from System.IO import *
from System.Environment import *
from System.Xml import *

def update(file):
	WriteLine(file)
	
	nameSpace = "http://www.w3.org/1999/xhtml"
	xmlDoc = XmlDocument()
	xmlDoc.Load(file)
	xnm = XmlNamespaceManager(xmlDoc.NameTable)
	xnm.AddNamespace("ns", nameSpace)
	for node in xmlDoc.SelectNodes("//ns:html/ns:body/ns:p/ns:code", xnm):
		at = xmlDoc.CreateAttribute("class")
		at.Value = "code"
		node.Attributes.Append(at)
	
	xmlDoc.Save(file)

dir = GetCommandLineArgs()[2]

for file in Directory.GetFiles(dir, "*.html", SearchOption.TopDirectoryOnly):
	if (Int32.TryParse(Path.GetFileNameWithoutExtension(file)) and 
	Path.GetFileNameWithoutExtension(file).Length == 5):
		update(file)

XPATHで要素拾って属性付けるだけのコード。Int32.TryParseがうまく呼べないんだよなぁ。C#のout相当のことをPythonでやる方法がわからない。だから引数省いたら実行出来た。でも、パース出来ない値でもTrue返してるみたいだ。意味が無い。

dir = GetCommandLineArgs()[2]

って行なんだけど、System.Environment.GetCommandLineArgs()が返すのは頭から

0:ipy

1:自身のスクリプトのパス

2:スクリプトに渡した引数

になるみたい。sys.argvと違うから注意。

昨日はCLR/Hの勉強会

初めての勉強会で、周りの人が皆スーパーハカーに見えて、やっぱり皆さんプロの方で…。良い日でした。

難しいこと書くの苦手なんでざっくりと感想を書きます。

C#4.0:dynamic怖い、dynamic怖い。でもIronPythonと連携しやすくなるんなら嬉しいかな。

SilverLight:TreeView楽しみだよ、TreeView楽しみ。早く来てー。

Windows7:軽くなるのは嬉しいな。窓一杯開いても重くならないしくみとか、PCの使い方が変わりそうですよ。

【課題】

名刺を作る。

次回も参加させて頂こうと思うです。

C#|TwitterのAPIを叩くライブラリを作ってみた2

少しずつ作業を進めています。

C#|TwitterのAPIを叩くライブラリを作ってみた

でUPしてるファイルを最新版に差し替えました。追加でUPしてると容量パンクしちゃうので差し替えです。

TwitterClient.zip

ダイレクトメッセージ関連とかブロック関連とか未実装だったり、書きっぱなしでテスト出来てない部分は多いですが、そこそこ使えるようになってきました。

TwitterAPIとか全く知らないけどTwitterクライアント作っちゃうよって用途に使えるライブラリにするのが目標ですが道のりは遠い…。

簡単な使い方なんですが、Anis.Twitter.Api.MethodsクラスをID、パスワードでインスタンス化して、あとはインテリセンスのコメント見て下さい。

VB.NET|Visual Basic中学校にて僕のプログラム掲載

以前に常駐しない付箋紙ソフトを作ってみた。にてUPしていたC#製の付箋紙アプリ”DeskTopMemo”のVB.NET版”DeskTopMemoVB

“がVisual Basic 中学校で紹介されました。

紹介して貰うためにわざわざVB.NETで書き直して、管理人のるきおさんにメールでお願いしたんですけどね。

ソースの中には

・設定の簡単な保存、読み込み

・テキストの描画サイズを正確に計算する方法

・.NETでWindowsの壁紙を変更する方法(ここはネットで拾ったコードのコピペですが…)

・コントロールのイメージをBitmapに描画する方法

等のTipsが詰まってます。

一つでも興味があれば是非々々読んでみて下さいです。

C#|WPFアプリケーションにてマウスイベントが拾えない問題

まず問題のコード

【XAML】Window1.xaml

<Window x:Class="WpfApplication1.Window1"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    Title="Window1" Height="300" Width="300">

    <Grid MouseLeftButtonDown="Grid_MouseLeftButtonDown">

        

    </Grid>

</Window>

【C#】Window1.xaml.cs

using System.Windows;

using System.Windows.Input;

namespace WpfApplication1 {

    /// <summary>

    /// Window1.xaml の相互作用ロジック

    /// </summary>

    public partial class Window1 :Window {

        public Window1() {

            InitializeComponent();

        }

        private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {

            MessageBox.Show("Clicked!");

        }

    }

}

フォームをクリックしても何も起こらない。

しかし、Window1.xamlをこうすると…

【XAML】

<Window x:Class="WpfApplication1.Window1"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    Title="Window1" Height="300" Width="300">

    <Grid MouseLeftButtonDown="Grid_MouseLeftButtonDown" Background="White">

        

    </Grid>

</Window>

GridのBackgroundプロパティにWhiteを指定している。

こうすると意図した通りにメッセージボックスが表示される。

また、Window1.xamlではなくWindow1.xaml.csのコンストラクタで

GridのBackgroundにBrushes.Whiteを指定してもメッセージボックスが表示された。

色が無いコントロールはマウスイベントを拾えない!?仕様なのかバグなのか…。

Linux|WindowsとUbuntuのurlショートカット

【IEのお気に入り】

ファイル名は”タイトル.url”

中身は最低限これで動く

[InternetShortcut]

URL=ここにURL

文字コードはshift-jis

改行コードはCR-LF

【ubuntu】

ubuntuでFireFoxを起動して、アドレスバー横のアイコンをデスクトップにドラッグ&ドロップして出来たファイルはこんな感じだった。

ファイル名:”タイトル.desktop”

Windowsと違ってプログラムのショートカットとurlのショートカットの区別はないらしい。

中身はこんな感じ

[Desktop Entry]

Version=1.0

Encoding=UTF-8

Name=ここにタイトル

Type=Link

URL=ここにURL

Icon=gnome-fs-bookmark

文字コード:UTF-8

改行コード:LF

デスクトップ上で表示されるのはファイル名じゃなくてNameキーの内容だった。

こんな感じでIEのお気に入りをubuntu用に変換するプログラム書いたらうまく動いた。

他のディストリビューションはどうなんだろう。ググっても分からなかった。

Mono|Monoを試してみた

Linuxを使ってみた

+

.NETプログラミングをしてる。

+

Windowsの資産をLinuxで活かしたい

=

monoですよね。

Ubuntuにはじめからmonoが入っていたので、https://anis774.net/Application/15puzzle/publish.htmでClickOnceで配布してる15パズルを実行してみました。しかし、ダイアログが出て実行出来ません。考えてみればWindowsの実行ファイルがそのまま動くわけないですよね。

ググってみると、mono hoge.exeみたいにしないと実行出来ないんだとか。java hogeってやるみたいなものですね。右クリックで開くファイルにmonoを指定して実行してみます。すると、ダイアログは出ませんが、何も起こりません。

またまたググってみると、どうやらmonoにはWindow.Formsに相当するものが標準では入ってないらしいです。

パッケージマネージャでmonoで検索して、それっぽいのを適当にインストールしてからもう一度実行を試みると動きました、こんな感じで。
ClpBdImg2[1]

リソースに入れた効果音がならない問題はありますが、ちゃんとゲームは出来ました。速度も全く問題無しです。

他にも色々な自作アプリを試したのですが、Windowsの時と挙動が若干違うのがあったり、中でWin32APIを呼び出してるアプリは動かなかったりとかはあるようです。

でも、最初からmono、Windows双方での運用を意識して開発することは充分可能なんじゃないかと感じました。

P.S.

余興で作った上の15パズルのJava版をUbuntuのGUI上で実行出来ませんでした。monoの場合はmono hoge.exeで動きますが、Javaの場合はjava hoge.classではなくてjava hogeですよね。これ相当の操作はGUI上で出来るんでしょうか。

Linux|Linuxを入れてみた

以前からLinuxに興味があったのですが、敷居の高さを感じてなかなか導入に至りませんでした。

PCが1台しかないので考えられる方法は

1.デュアルブート

2.1CD Linux

3.仮想マシン

1はWinが起動しなくなることが稀にあるとかで却下。

2はCDROM買わないといけないので却下。お金はかけない主義。

残るは3の仮想マシンです。仮想マシンというとVirtualPCしか知らないのでその線で調べると、僕のWinXPHomeではVirtualPCは使えないらしい。

そこでVMwareという同種のソフトがあるのをグーグルで見付けました。VMware Playerというタダバージョンもあるとか。

しかしこのVMware Player、インストールしてみたら、仮想マシンが作れない!そう、これは構築済みの仮想マシンを動かすだけのソフトだったのです。よく調べないお前が悪い!仮想マシンを作れるバージョンは有料だとか。

そこで色々検索してみたら、ありました。UbuntuのサイトでUbuntuインストール済みのVMwareの仮想PCのファイルを配布しているではありませんか。そうか、Linuxにはこんな配布方法もあったのか…。

さっそく導入しました。Windowsを1からインストールするよりずっと簡単でした。VMwareを起動したら、もうすぐそこに使えるUbuntuの環境があるんですよ。GUIバリバリでWindowsと同じ感覚で使えます。必要なアプリも最初から一通りインストールされてるのも親切です。ブラウザやテキストエディタ、Officeソフト各種、メディアプレイヤーから、Windowsになりすましてファイル共有が出来るSambaサーバー、各種言語のコンパイラなんかも入ってるのには驚きです。

といっても、Windowsを使いながら培ってきた過去の遺産を生かせなければ進んでLinuxを使おうとは思いません。そこでまずはsambaサーバーでWindowsのディレクトリにアクセス出来るようにしてMS Officeの各種ファイルを開いてみました。OOoで問題なく扱えます。

次は画像、一通りのフォーマットはプリインストールのビューアで開けました。画像、オーディオ、ビデオ関連も付属のプレイヤーで再生出来ました。

FireFoxでニコニコ動画も見られるし、ずっとWindows使ってきて、Linuxで使えない資産があるってわけじゃなければこれで充分ですね。

ってことで超簡単にLinuxを使ってみる方法、

http://www.ubuntulinux.jp/products/JA-Localized/vmware

ここに全部載ってます。

C#|WPFブラウザアプリケーション(XBAP)で製作したWindows用タスクバー時計

JavaScriptで製作したWindows用タスクバー時計なんてページを見付けたので、それなら僕はXBAPでってことでやってみました。いかに.NETが楽かってことを見せ付けてやろうかと(誰にだ?)。

手順は簡単。VSでWPFブラウザアプリケーションのプロジェクトを作ったらPageにLabelを置いてこんな感じでコーディングします。

using System;
using System.Windows.Controls;
namespace clock {
  public partial class Page1 :Page {
    System.Threading.Thread thread;
    public Page1() {
      InitializeComponent();
      thread = new System.Threading.Thread(loop);
      thread.IsBackground = true;
      thread.Start();
    }
    private void loop() {
      while(true) {
        this.Dispatcher.Invoke(new System.Threading.ThreadStart(update), null);
        System.Threading.Thread.Sleep(1000);
      }
    }
    private void update(){
      this.label1.Content = DateTime.Now.ToString("yy/M/d(ddd)H:mm");
    }
  }
}

う~ん、Javascriptの方が簡単だったかも…。

こんな感じでタスクバーに時計が表示されます。

clockss[1]

そのうちSilverlightでもやってみたいですね。Javascriptでいいだろって突っ込みは無しで…。