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でいいだろって突っ込みは無しで…。

C#|暇だからトランプゲームとか作ってみた

こんなん作ってみた。あれ、あのトランプの、スピードってゲーム。

https://anis774.net/Application/speed/publish.htm

適当に書いてたらコードがgdgd…。もう少しかっこよくしたいけど、コードいぢるの怖い…。

カオスなので今回はソースコードなし。

そしてClickOnceで配布してみる。これ楽でいいかも。

60FPSでゲームループ回してるのでCPU使用率が凄いことになってるけど、仕様です。

ループ回さないでキーイベント拾って、COMのAIは別スレッドかタイマーコントロールかなんか使えばいい感じのコードになったかも。

C#|突然Twitterに投稿出来なくなった

 日頃から愛用しているコマンド入力型のアプリケーションランチャーから呼び出せる様にC#で書いたTwitterのステータス投稿プログラムが、

ハンドルされていない例外: System.Net.WebException: リモート サーバーがエラーを返しました: (417) Expectation Failed

とか吐いて使えなくなった。

 今までは期待どうりステータスを投稿出来ていたのに…。困りました。

using System;

using System.Collections.Specialized;

using System.Net;

using System.Text;

class Program {

static void Main(string[] args) {

WebClient client = new WebClient();

client.Encoding = Encoding.UTF8;

client.Credentials = new NetworkCredential(args[0], args[1]);

NameValueCollection nvc = new NameValueCollection();

nvc.Add("status", args[2]);

byte[] res = client.UploadValues("http://twitter.com/statuses/update.xml", nvc);

string resStr = Encoding.UTF8.GetString(res);

client.Dispose();

Console.WriteLine(resStr);

}

}

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

 ここまで出来ましたよ~って感じの進捗報告のつもりでUP

TwitterClient.zip

 少しは使えるようになって来たと思います。Webから色々引っ張ってくるときの作法とか良く知らないので、動いてはいるけど正しいかは自信が無いです。

 まだテストしてないところとか、ちゃんと動かない部分とかコメント付けてるので、利用前に必ず確認、修正して下さいね。

 こんな汚いコード読めねぇよ!って人の為にヒント

using System;
using System.Collections.Generic;
using System.Linq;
using Anis.Twitter.Api;
class Program {
  static void Main(string[] args) {
    Methods twitterClient = new Methods("ユーザーID", "パスワード");
    var timeLine = from status in twitterClient.GetFriendsTimeline()
                    orderby status.Id
                    select status;
    foreach(var status in timeLine) {
      Console.WriteLine("{0}\t{1}\t{2}\n\t{3}",
        status.User.Screen_name,
        status.Created_at,
        status.Id,
        status.Text);
    }</p>
  }</p>
}</p>

こんなに簡単にタイムライン取ってこれるんですよ。

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

 Twitter始めました。Twitterの先輩がいましたら是非是非followして下さい。

http://twitter.com/anis774

TwitterはWebAPIを公開しているとのことで、それを利用したクライアントも多数あります。その中でもJavaで実装されたPeraPeraPrvが気に入ったので導入しました。

でもやっぱり、サンデーヘボグラマなら自分で作ってみたくなりますよね。さらに楽して作りたいとも思う筈です。面倒なことはしたくないですよね。

そこでライブラリを探したところ、

http://devblog.yedda.com/index.php/twitter-c-library/

こんなのを見付けました。なんだ英語じゃないですか。英語怖いよ、英語怖い。でも恐る恐るDLしてソースを読んでみると、読めるじゃないですか。英語は読めないけどC#は読めるって当たり前の話でした。短いソースコードだったのでさらっと読んで…捨てました。オプションの引数の指定とか全く出来ないんですもん。サンプルとしては参考になるのでしょうけど、そのまま実用にはなりませんね。実はサンプルなのかも知れませんが…、英語読めないから分かりません。

やはり自分で書くしかないと…。書きました。ここを参考にしました。

http://watcher.moe-nifty.com/memo/docs/twitterAPI13.txt

ここの『ステータス関連のAPI』の実装が出来たので、実際に動くサンプルのビューアと、コマンド形式のランチャから呼び出して使える投稿プログラムを書いて見ました。

疲れたのでひとまず公開します。何の反響も無ければこれで終わりにします。反響があれば少しだけやる気が出るかも。むしろ誰かが完成させて公開してくれると嬉しいかも。そう言う意味で、恥ずかしいけどソース付きです。

煮るなり焼くなり好きにして下さい。

TwitterClient.zip

VB.NET|任意のタイミングでキーボードの状態を取得

 フレームごとに計算をするゲームのプログラムなんかだと、イベント発生時以外にキーボードの状態を取得したいと思うでしょう。

 そこで通常ならDirectInputを使うのでしょうが、あえて使わないで解決してみようと書いたコードがこれ。今回はVB2005です。

Imports System.Windows.Forms

Module KeysState

    Dim keysState As New Dictionary(Of Keys, List(Of Boolean))

    ''' <summary>
    ''' 毎フレーム呼び出す
    ''' </summary>
    Public Sub UpDate()
        For Each key As Keys In keysState.Keys
            keysState(key).RemoveAt(1)
            keysState(key).Add(keysState(key)(0))
        Next
    End Sub

    ''' <summary>
    ''' キーが押し始められたかを取得
    ''' </summary>
    ''' <param name="key">押し始められたかどうかを取得するキー</param>
    ''' <returns>押し始められていたらTrue、押し始められていなければFalse</returns>
    Public Function IsPush(ByVal key As Keys) As Boolean
        Return keysState.ContainsKey(key) AndAlso Not keysState(key)(1) AndAlso keysState(key)(2)
    End Function

    ''' <summary>
    ''' キーが押されているか取得
    ''' </summary>
    ''' <param name="key">押されているかどうかを取得するキー</param>
    ''' <returns>押されていたらTrue、押されていなければFalse</returns>
    Public Function IsPress(ByVal key As Keys) As Boolean
        Return keysState(key)(0)
    End Function

    ''' <summary>
    ''' キーが離されたかを取得
    ''' </summary>
    ''' <param name="key">離されたかどうかを取得するキー</param>
    ''' <returns>離されたらTrue、離されていなければFalse</returns>
    Public Function IsUp(ByVal key As Keys) As Boolean
        Return keysState.ContainsKey(key) AndAlso keysState(key)(1) AndAlso Not keysState(key)(2)
    End Function

    ''' <summary>
    ''' 対象のコントロールのKeyDownイベントハンドラに追加する
    ''' </summary>
    Public Sub KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs)
        If keysState.ContainsKey(e.KeyCode) Then
            keysState(e.KeyCode)(0) = True
        Else
            keysState.Add(e.KeyCode, New List(Of Boolean)(New Boolean() {True, False, False}))
        End If
    End Sub

    ''' <summary>
    ''' 対象のコントロールのKeyUpイベントハンドラに追加する
    ''' </summary>
    Public Sub KeyUp(ByVal sender As Object, ByVal e As KeyEventArgs)
        If keysState.ContainsKey(e.KeyCode) Then
            keysState(e.KeyCode)(0) = False
        Else
            keysState.Add(e.KeyCode, New List(Of Boolean)(New Boolean() {False, False, False}))
        End If
    End Sub
End Module

C#|テキストボックスのサイズを内容に合わせて変更

 ググるとSystem.Drawing.Graphics.MeasureString()を用いた方法がHITしますが、これでは誤差が出るので悩んでいる人を掲示板のログ等で見かけます。

 僕も同じことをやろうとして調べてみたのですが、

System.Windows.Forms.TextRenderer.MeasureText()メソッドを用いると誤差なく描画サイズの取得が出来ました。