さとやn Blog

試合はRuby,勝負はC#!

mono

Mono3.4 のBuildでエラー

Ubuntuで Mono3.4をソースから入れようとしたところ、こんなエラーになった。

 cannot stat `targets/Microsoft.Portable.Common.targets': No such file or directory

Mono3.4ではこのファイルが欠けているらしい。
ということなので自分でファイルを作ってもう一回 sudo make install してやればいい。
中身は

  <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <Import Project="..\Microsoft.Portable.Core.props" />
   <Import Project="..\Microsoft.Portable.Core.targets" />
 </Project>

元記事は、
http://stackoverflow.com/questions/22844569/build-error-mono-3-4-0-centos 

Btonic辞書のMac版もC#で試してみる

先日トライしてみたC#によるiPhone,Android辞書アプリですが、せっかくなのでMonoMacで同様にMacデスクトップ版もやってみました。

よく「結局UIが異なるからそれぞれのプラットフォームで作りこみが必要でしょ?」と言われるのですが、逆にUI以外の部分は共有できるわけで、その効果は想像以上です。

PhoneGapも試してみましたが、アプリによってはものすごくいいと思いましたが、基本HTML&JavaScriptなので、それこそJobsが懸念していた最大公約数的な機能しか使用できなくて、あまり食指が動きませんでした。ただ、作る物によってはかなり有効な選択肢になるとは思いました。
 
 5557

C#でSpec NSpec on Mono Mac

ちょっと前に.NETのSpecテストフレームワークでSpecFlowというものを試したのですが、なんかちょっと違うなーと感じてはいました。要はRSpecと同じようにSpecで単体テストがしたかっただけなのですが SpecFlowはどちらかというと受け入れテスト向けのもののようですね。確かにソースコードとは別になんかシナリオみたいの書くって、なんかメンドーだなーと、、、。
で、やっぱりRubyにはRSpecがあるように、C#、つまり.NETにはNSpecなるものありました。
私が探していたのはこっちこっち、って感じで早速やってみました。
サイトの方ではNuget(VisualStudioのパッケージ管理ツールみたいなやつ)向けのドキュメントですが、中身はDLLとEXEファイルなのでMonoでもできるはず、という事で今回もMonoです。
やっぱりSpecテストはこんな感じが良いですよね。

20


C# でIPhone Xcode4.1でできるようになった

InterfaceBuilderとXcodeが統合されてしまったせいでさっぱりやり方がわからなくなってしまったMonoTouchですが、Xcode4に対応したバージョンがAlpha版で出たらしいので、早速やってみました。
確かに以前より使いやすくなってはいますね。

LinuxでASP.NET MVC3(ビューエンジンはRazor)を動かす

ようやく仕事でもRails3になったので、しばらくはプライベートではC#で色々やりたい。
というわけで、ASP.NET MVC3で噂のビューエンジンRazorを使用して作ったWebアプリをLinuxのmono
で動かしてみました。

さすがにMonoDevelop(マック版)はMVC3やRazorにはまだ対応してないので、開発はVisualStudio2010で作成して、それをLinux(Cent5.5)のMonoにデプロイすることに。

開発:Windows7, VS2010, MVC3, Razor
ホスト: Linux(Cent5.5), Apache

とりあえず動作確認のため、デフォルトのMVCプロジェクトをコンパイルしてLinuxにコピー。
でmonoでASP.NETを動かすには、
http://www.mono-project.com/ASP.NET
ここに書いてあることによると、
mod_mono
xsp
が必要とのこと。
それぞれソースを落としてコンパイル&インストール。
インストールが完了すると、mod_mono.conf というApacheの設定ファイルが出来ているので基本的にそれはそのままでOK。
私の場合は /etc/httpd/ 直下にできていたので、conf.d下に移動。

続いてサイトの説明を読んでいくと、何やらAutoHostingなるものがあるらしい。
http://www.mono-project.com/AutoHosting
これによるとAutoHostingなら後々ASP.NETプロジェクトをホストする場合でもいちいちApacheの設定ファイルを弄る必要がなくて便利ですよー、とのこと。指示通りに設定ファイルをいじっていたら、途中でMVCプロジェクトの場合はルーティングにファイル拡張子が使用されないから云々とかで、AutoHostingは推奨しません、だって。かなりガッカリ。
で、仕方ないので、従来通りの方法でASP.NETのプロジェクト単位でApacheの設定ファイルを作ることに。

http://go-mono.com/config-mod-mono/
このサイトでは必要な項目を入力すればそれを元に設定ファイルを作成してくれるようなので、サーバー名とかプロジェクトのディレクトリパスとか必要な項目を入力して作ってもらう。
mod-mono-serverのパスが/usr/binになってたり若干自分の環境と異なっているので、そこは自分で修正。更にmod-mono-server2となっていたのをmod-mono-server4に変更。
そいつをコピーして、Apacheのconf.d下に my_mvc_project.conf みたいな名前のファイルを作ってそこに保存。

Apache再起動してブラウザで表示してみると、なんかエラー。
リモートマシンなのでエラーの内容がわからないため、Web.config の <customErrors mode="Off" />にして再度トライ。
なんかDLLが見つからないよーみたいなことを言われるので、VS2010に戻って必要なDLLを参照追加して、更にそいつのプロパティでローカルコピーをTrueにして再デプロイ。
するとまた別のDLLがないよーと言われるので、その都度同様の作業を繰り返す。
結局Windowsから持っていかなきゃならないDLLは
  • System.Web.Mvc.dll 
  • System.Web.Razor.dll 
  • System.Web.WebPages.dll 
  • System.Web.WebPages.Deployment.dll 
  • System.Web.WebPages.Razor.dll
  • System.Data.Entity
  • System.Web.Helpers.dll
 Entityとか使ってないんだけどなー、、、。

でもとりあえずページは表示されました。

C#でRedisしてみる

MemcachedをRubyから試す予定だったけど、半分気まぐれRedisをC#から試してみることにしました。 仕事ではどっちもRailsでやる予定なんで、家で触るならC#でってことで。

とりあえずRedisをインストール。

wget http://redis.googlecode.com/files/redis-2.2.11.tar.gz
tar xzvf redis-2.2.11.tar.gz
cd redis-2.2.11
make
sudo make install

因みにhttp://redis.googlecode.com/
このサイトではブラウザ上でインタラクティブにRedisのコマンドを叩けるTutorialがあって大変面白かったです。

Redisサーバーを起動してみる。
redis-server
クライントを起動していくつか適当なコマンドを叩いて動作確認。
redis-cli #クライアント起動

#rootというキー名で satoyan 文字列をセット
redis 127.0.0.1:6379> set root satoyan
OK

#取り出す
redis 127.0.0.1:6379> get root
"satoyan"

#queen:membersリストの最後尾に Fready を追加
redis 127.0.0.1:6379> rpush queen:members Fready
(integer) 1

#同様にBrian も追加
redis 127.0.0.1:6379> rpush queen:members Brian
(integer) 2

#リストの中身を表示 0から-1というのはつまり先頭から最後尾までという意
redis 127.0.0.1:6379> lrange queen:members 0 -1
1) "Fready"
2) "Brian"

次にC#からRedisを扱うライブラリをダウンロードする。なんか幾つかあるようですが、今回はServiceStack.Redisというもので試してみる。

https://github.com/ServiceStack/ServiceStack.Redis
ここからDLL一式をダンロード。

MonoDevelopを起動して適当なプロジェクトを作成してDLL参照を追加。
こんな感じ。

C#でiPhone - キーボードの有無によってテキスト編集エリアのサイズを変更する

テキストエリアのフォーカスが移ると自動的にキーボードが表示されるようになっていますが、テキストエリアを画面いっぱいに表示してたりすると、表示されたキーボードがテキストエリアの一部を隠してしまう場合があります。
そのような画面レイアウトの場合は、キーボードの表示・非表示に応じてテキストエリアのサイズを変更する必要が出てきます。
というわけでやってみました。
ポイントは
  • NSNotificationCenter.DefaultCenter.AddObserver − キーボードの表示・非表示の通知を受けるようにする
  • ResignFirstResponder - コントロールからフォーカスを外す - .NETで言うところのLostFocus
ってところでしょうか。

using System;
using System.Collections.Generic;
using System.Linq;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using System.Drawing;

namespace HelloIPhoneTextView
{
	public class Application
	{
		static void Main (string[] args)
		{
			UIApplication.Main (args);
		}
	}
	
	// The name AppDelegate is referenced in the MainWindow.xib file.
	public partial class AppDelegate : UIApplicationDelegate
	{
		
		NSObject kbdShow, kbdHide;
		
		// This method is invoked when the application has loaded its UI and its ready to run
		public override bool FinishedLaunching (UIApplication app, NSDictionary options)
		{
			doneButton.Enabled = false;
			
			kbdShow = NSNotificationCenter.DefaultCenter.AddObserver (UIKeyboard.WillShowNotification, delegate(NSNotification n) {
				var kbdFrame = UIKeyboard.BoundsFromNotification (n);
				var frame = textView.Frame;
				frame.Height -= kbdFrame.Height;
				textView.Frame = frame;
				doneButton.Enabled = true;
			});
			
			kbdHide = NSNotificationCenter.DefaultCenter.AddObserver (UIKeyboard.WillHideNotification, delegate(NSNotification n) {
				var kbdFrame = UIKeyboard.BoundsFromNotification (n);
				var frame = textView.Frame;
				frame.Height += kbdFrame.Height;
				textView.Frame = frame;
				doneButton.Enabled = false;
			});
			
			doneButton.TouchDown += (sender, e) => {
				textView.ResignFirstResponder ();
			};
			
			
			window.MakeKeyAndVisible ();
	
			return true;
		}
	
		// This method is required in iPhoneOS 3.0
		public override void OnActivated (UIApplication application)
		{
		}
		
		public override void WillTerminate (UIApplication application)
		{
			NSNotificationCenter.DefaultCenter.RemoveObserver (kbdShow);
			NSNotificationCenter.DefaultCenter.RemoveObserver (kbdHide);
		}
		
	}
}



C#でiPhone - UiWebViewでWebブラウザを実装してみる

要素のクリックイベントとかフォーム送信イベントとかキャッチできて対象のDOM要素とかも判定出来ればいいんだけど、、方法を知らないだけ?

オープニング用にメンデルスゾーンの結婚行進曲をギターで作ってみました。うるさいし、何がしたいのかよくわからなくなってきた、、、。

パート1

パート2
using System;
using System.Collections.Generic;
using System.Linq;
using MonoTouch.Foundation;
using MonoTouch.UIKit;

namespace HelloIPhoneWebBrowser
{
	public class Application
	{
		static void Main (string[] args)
		{
			UIApplication.Main (args);
		}
	}
	
	// The name AppDelegate is referenced in the MainWindow.xib file.
	public partial class AppDelegate : UIApplicationDelegate
	{
		// This method is invoked when the application has loaded its UI and its ready to run
		public override bool FinishedLaunching (UIApplication app, NSDictionary options)
		{
		
			myWebBrowser.ShouldStartLoad = delegate(UIWebView webView, NSUrlRequest request, UIWebViewNavigationType navigationType) {
				if (navigationType == UIWebViewNavigationType.LinkClicked) {
					UIApplication.SharedApplication.OpenUrl (request.Url);
					return false;
				}
				return true;
			};
			
			goButton.TouchDown += (sender, e) => {
				myWebBrowser.LoadRequest (new NSUrlRequest (new NSUrl (myUrlText.Text)));
			};
			
			myWebBrowser.LoadStarted += (sender, e) => {
				UIApplication.SharedApplication.NetworkActivityIndicatorVisible = true;
				myUrlText.Text = myWebBrowser.Request.Url.AbsoluteString;
			};
			
			myWebBrowser.LoadFinished += (sender, e) => {
				UIApplication.SharedApplication.NetworkActivityIndicatorVisible = false;
				myUrlText.Text = myWebBrowser.Request.Url.AbsoluteString;
				this.updateNavigateButtonEnabled ();
			};
			
			
			myWebBrowser.LoadError += (object sender, UIWebErrorArgs e) => {
				UIApplication.SharedApplication.NetworkActivityIndicatorVisible = false;
				using (var alert = new UIAlertView("Error!!", e.Error.LocalizedDescription, null, "OK", null)) {
					alert.Show ();
				}
				this.updateNavigateButtonEnabled ();
			};
			
			backButton.TouchDown += (sender, e) => {
				myWebBrowser.GoBack ();
			};
			
			forwardButton.TouchDown += (sender, e) => {
				myWebBrowser.GoForward ();
			};
			

			window.MakeKeyAndVisible ();
	
			return true;
		}
		
		void updateNavigateButtonEnabled ()
		{ 
			backButton.Enabled = myWebBrowser.CanGoBack;
			forwardButton.Enabled = myWebBrowser.CanGoForward;
		}
		
	
		// This method is required in iPhoneOS 3.0
		public override void OnActivated (UIApplication application)
		{
		}
	}
}


NUnitの結果をHTMLで表示する

.NETでもSpecFlowアドインによってSpecテストが出来ることはわかったのですが、結果をHTMLで表示できるみたいなこともガイドに書いてありました。
で、どうやるんだろう? とよく読んでみたら
  1. nunit-console でテストプロジェクトを実行してXMLファイルを生成して
  2. specflow.exe でHTML生成する
てな手順でやるようです。


こんな感じ。
※環境はMac上のmonoです。


#MySpec.dllはテストプロジェクト(nUnit)
nunit-console -labels -out=TestResult.txt -xml=TestResult.xml ./bin/Debug/MySpec.dll


mono specFlowを解凍したディレクトリ/tools/specflow.exe nunitexecutionreport ./MySpec.csproj


とやってやると、こんな感じのHTMLが生成される。
テスト3つしかないから寂しい。それにfeatures 0 ってのもよくわからない、、、。
10)



livedoor プロフィール
QRコード
QRコード
  • ライブドアブログ