C#の例外処理

例外とは、プログラム実行時に発生するエラーのことです。C#の例外処理機能を使えば、実行中に発生する予期しないエラーや例外的な状況に対処できます。

C#では、「try」「catch」「finally」のキーワードを使って、例外処理を記述します。

最も基本的な書き方を以下に示します。

try {
  // なんらかの処理
 // この中で、例外が発生する可能性あり
} catch {
  // 例外が発生したときに処理したいコード
}

例外の発生を検出したい場合は、tryブロック内に記述します。tryブロック内で何らかの例外が発生すると、処理が中断され、catchブロックに処理が遷移します。次のコードで確認してみてください。

using System;

namespace Gushwell.Sample {
	class Program {
		static void Main(string[] args){
			try {
				int n = 100;
				string s = Console.ReadLine ();
				int m = int.Parse (s);
				int ans = n / m;
				Console.WriteLine (ans);
			} catch {
				Console.WriteLine ("エラーが発生");
			}
			Console.ReadLine ();
		}
	}
}

ポリモーフィズム

ポリモーフィズムとは、異なる型を同一視することによって、複数のクラスを同じ操作で制御できる言語特性のことです。「オブジェクト指向」において、もっとも重要な機能の一つと言えるでしょう。

多くのデザインパターンは、このポリモーフィズムの機能を利用しています。

ポリモーフィズムを使わない例

using System;
using System.Collections.Generic;

namespace PolySample {
	class Program {
		static void Main(string[] args){
			List<object> list = new List<object>();
			list.Add(new CSharper());
			list.Add(new Rubyist());
			foreach(object p in list){
				if (p is CSharper){
					(p as CSharper).Work();
				} else if (p is Rubyist){
					(p as Rubyist).Work();
				}
			}
			Console.ReadLine();
		}
	}

	public class CSharper {
		public void Work() {
			Console.WriteLine ("C#でプログラムを書きます");
		}
	}

	public class Rubyist {
		public void Work () {
			Console.WriteLine ("Rubyでプログラムを書きます");
		}
	}
}

ポリモーフィズムを利用した例

using System;
using System.Collections.Generic;

namespace PolySample {
	class Program {
		static void Main(string[] args){
			List<Programmer> list = new List<Programmer> ();
			list.Add(new CSharper());
			list.Add(new Rubyist());
			foreach(Programmer p in list){
				p.Work ();
				}
			Console.ReadLine();
		}
	}

public abstract class Programmer {
	public abstract void Work ();
}

	public class CSharper : Programmer {
		public override void Work() {
			Console.WriteLine ("C#でプログラムを書きます");
		}
	}

	public class Rubyist : Programmer {
		public override void Work () {
			Console.WriteLine ("Rubyでプログラムを書きます");
		}
	}
}

静的メンバーと静的クラス

プログラムが開始されるときは、どのクラスのインスタンスもnewされていない状態です。

using System;

class Program {
	static void Main() {
		Console.Write ("ヤード ->");
		string s = Console.ReadLine ();
		double yard = double.Parse (s);
		double meter = YardToMeter (yard);
		Console.WriteLine ("{0}ヤードは{1}メートルです。", yard, meter);
		Console.ReadLine ();
	}

	// 静的メソッドとして定義
	static double YardToMeter (double yd)
	{
		double meter = yd * 0.9144;
		return meter;
	}
}

mono

C#のアクセス修飾子

クラスのメンバーへのアクセスを制御するためのものがアクセス修飾子です。C#には、「private」「public」「protected」「internal」の4つが用意されています。
publicなメンバーは、そのメンバーが定義されているクラスの外側から自由にアクセスすることが可能です。一方、privateなメンバーは、そのクラスの中からのみアクセスすることができます。

using System;
using System.IO;

namespace Sample {
	class Program {
		static void Main(string[] args){
			NumericsPicker np = new NumericsPicker ("Sample.txt");
			string line = np.GetNext ();
			while (line != null){
				Console.WriteLine (line);
				line = np.GetNext ();
			}
			Console.ReadLine ();
		}
	}

	class NumericsPicker {
		private StreamReader reader;
		public NumericsPicker(string filepath){
			reader = new StreamReader(filepath);
		}

		private bool IsAllDigits(string line){
			foreach (var c in line) {
				if (!char.IsDigit (c))
					return false;
			}
			return true;
		}

		public string GetNext(){
			string line = reader.ReadLine ();
			while (line != null && !IsAllDigits (line))
				line = reader.ReadLine ();
			return line;
		}
	}
}

メソッドのオーバーロード

クラスを使っていると、メソッド名が同じにもかかわらず、引数の数や引数の型が異なるメソッドがあります。これをメソッドのオーバーロードと言います。
例)

MessageBox.Show("hello world!");
MessageBox.Show("hello world!", "HelloDialog");

メソッドのオーバーロードは簡単です。また、引数の数が同じで、引数の型が異なるメソッドをオーバーロードすることもできます。
オーバーロード機能があることで、クラスを使う側も作る側も楽ができます。

using System;

namespace Sample {
	class Program {
		static void Main(string[] args){
			DateUtility du = new DateUtility ();
			// IsEndOfMonth(DateTime date)を呼び出す
			DateTime date = new DateTime(2011, 5, 30);
			bool eom1 = du.IsEndOfMonth (date);
			Console.WriteLine (eom1 == true ?
					"月末です" :
				"月末ではありません");
			// IsEndOfMonth(int year, int month, int day)を呼び出す
			bool eom2 = du.IsEndOfMonth(2011,2,28);
			Console.WriteLine (eom2 == true ?
				"月末です" :
				"月末ではありません");
			Console.ReadLine ();
		}
	}

	class DateUtility {
		public bool IsEndOfMonth(DateTime date){
			Console.WriteLine ("Call IsEndOfMonth(DateTime date)");
			return date.AddDays(1).Day == 1;
		}

		public bool IsEndOfMonth(int year, int month, int day){
			Console.WriteLine ("Call IsEndOfMonth(int year, int month, int day)");
			DateTime date = new DateTime (year, month, day);
			return IsEndOfMonth (date);

		}
	}
}

書籍を扱うクラス

規模が大きなプログラムを作るには、クラスの理解が必須。
とのことで、C#でのクラスを見てみましょう。

using System;

namespace ConsoleApplication1 {
	class Program {
		static void Main(string[] args){
			Book[] books = new Book[2];
			books[0] = new Book {
			title = "伊豆の踊り子",
			author = "川端康成",
			price = 380,
			publisher = "新潮社"
			};
			books [1] = new Book {
				title = "坊ちゃん",
				author = "夏目漱石",
				price = 378,
				publisher = "岩波書店"
			};
			foreach (Book book in books)
				Console.WriteLine ("{0} {1} {2} {3}",
					book.title, book.author,
					book.price, book.publisher);
			Console.ReadLine();
		}
	}

	class Book {
		public string title;
		public string author;
		public int price;
		public string publisher;
	}
}

アセンブラツール

よく使われる代表的なもの

1.MASA
Microsoft Macro Assemblerの略ともいわれ、当初は、Macro Assembler。MicrosoftのOS(DOSやWindows)上で実行するプログラムのために開発されたアセンブラです。

; hello.asm

	include ¥masm32¥include¥masm32rt.inc

	.code

start:

	print "Hello, Assembly Language!",13,10
	exit

end start

2.NASM
NASM(Netwide Assembler)はGNUのLGPLで公開されているフリーソフトウェアのアセンブラです。このアセンブラはIntel x86ファミリーをターゲットとしており、様々な形式で出力することができます。

; ha.asm
	bits 16
	org 0x100

	mov ah, 2 ;文字出力を指定
	mov dl,[msg]	;msgの先頭'H'
	int 21h
	mov dl,[msg+7] ; msgの8番目'a'
	int 21h
	mov ax,4C00h ;プログラム終了
	int 21h

msg db "Hello, assembler$"

3.GNU Assembler(GAS)
UNIX系の各種アーキテクチャ(x86, 680×0, SPARC, VAX)向けのアセンブラファミリーです。AT&T表記と呼ばれる構文を使っています。もともと、gcc(GNU C, C++コンパイラ)との親和性が高く、UNIX系OSでC/C++とリンクするアセンブリ言語プログラムを記述するためによく使われます。

# hello.S
.text
	.global _start

	_start:

	movl $len,%edx
	movl $msg,%ecx
	movl $1,%ebx
	movl $4,%eax
	int $0x80

	# exit

	movl $0, %ebx
	movl $1, %eax
	int $0x80

	.data

	msg:
		.ascii "Hello, world!¥n"
		len = . - msg

iOS位置情報 API

ポケモンGOやってますか?
ボールが直ぐなくなってしまいますが、なんとかならないでしょうか?

さて、ポケモンGoにも出てくる位置情報ですが、どんな仕組みが気になりませんか?
AppleのDeveloper向けのサイトで、”Location and Maps Programming Guide“があります。
数時間で読めると思いますので、是非ご参照ください。
その中で、
Core Location framework, which defines Objective-C interfaces for obtaining information about the user’s location and heading
Maps app(Map Kit framework)
と記述があり、Core LocationというFrameworkがあることがわかります。
Core Locationはこちら
bullseye_view_2x

スマホVR人気アプリ

昔、日テレで、「THE夜もヒッパレ」という番組をよく見ていました。
まだ、ネットに出会う前です。
三宅裕司、中山秀征、赤坂泰彦が司会進行。毎週、MAXが踊って、モト冬樹さんがボケてたのを覚えてます。
今振り返ると、無性に懐かしいものですが、あの頃はテレビがギラギラしてて面白かった。
download

すっかり嗜好も変わり、音楽を殆ど聞かなくなりましたが、人間、いつの時代もランキングをつけたがるという行為自体は変わりませんね。ここで、今回は本日時点でのスマホVR人気アプリランキングを発表したいと思います。じゃらじゃらじゃら〜、ど〜ん!

スマホVRゲーム人気ランキングトップ3

1位:VRミュージアム(iOS/Android)
出演キャラの女の子たちの日常生活とパンツが覗けるアプリ
download-1
“ひょんなことから幽体離脱してしまった あなたはとある場所に迷い込んでしまう。
そこは個性豊かな美少女たちが 暮らすアパート「古来館」だった!
幽体であるあなたは彼女たちの 生活を覗き見し放題!?
もちろん上からも下からも!?
男子諸君の欲望が生み出した 禁断のテクノロジーをご体感あれ!”

2位:ポケカノVR(Android)
熱い視線を彼女に送りまくれ!男子歓喜のシミューレーションゲーム
download-2
“※本アプリを体験するにはCardBoardが必要です。
☆☆TripleYStudio初のVRデモアプリ☆☆
【あなただけの触りたくなる彼女がここにいます!】
★ふたりだけの秘密の世界にご招待!
 あなたのアツイ眼差しで彼女をほっこりさせましょう”

3位:VR Zombie Hunter 3D(iOS/Android)
廃病院で無限に湧き出るゾンビを撃ちまくるVRゲーム
download-3
“Open your eyes. You are in sleep for a long time and you will find yourself inside in a abandoned hospital when you wake up. You need to kill all the zombies to survive. Or, you will be one of them. Let’s start the zombie hunt!
The application is totally free.”

如何ですか?テクノロジーは飛躍的に進化しましたが、なんてくだらないでしょう。

ちなみに、こちらは懐かしのファミコンソフト累計売上ランキングです。
1位:スーパーマリオブラザーズ
2位:スーパーマリオブラザーズ3
3位:ドラゴンクエストⅢ そして伝説へ…

VRのランキングも、格闘、RPG、野球などに変わっていくかもしれません。野球がVRで出来たらリアルですね。
私は、麻雀オンライン対戦をVRでやりたいですね。麻雀格闘倶楽部のVR版。
VRのゴーグルの位置情報によって、対戦相手である上家、対面、下家の目線が動けば、心理戦にもなって、絶対面白いでしょ。

PHPでカレンダーを作ろう

プログラミングの初歩とも言える、簡単なカレンダーを作ります。
ここでは、変数、配列、繰り返し文、if文などを使っています。
コードは以下の通り。

<?php
    class Print_calendar extends Today_Calendar {
        function space_cell($count){
            if ($count!=0){
                for($i=0;$i<$count;$i++){
                    print "<td></td>";
                }
            }
        }
    }
    class Today_Calendar {
        function today($day){
            if (date("Y/m/d")==date("Y/m/d",mktime(0,0,0, date("n"),$day,date(Y)))){
                return "<b>".$day."</b>";
            } else {
                return $day;
            }
        }
    }
    print "<h1>".date("F")."</h1>";
    print "today:".date("Y/m/d");
    print "<br>";
    $arrayweek=array("sun","mon","tue","wed","thu","fri","sat");
    print "<table border=1><tr>";
    foreach($arrayweek as $value){
        print "<th>".$value. "</th>";
    }
    print "</tr><tr>";
    for($i=0;$i<date("t");$i++){
        $week_number = date("w", mktime(0, 0, 0, date("n"), $i+1, date("Y")));
        if ($i==0){
            print "<tr>";
            Print_Calendar::space_cell($week_number);
        } elseif ($week_number == 0){
            print "<tr>";
        }
        print "<td>".($i+1)."</td>";
        if($i+1==date("t")){
            Print_Calendar::space_cell(6-$week_number);
            print "</tr>";
        }elseif ($week_number == 6){
            print "</tr>";
        }
    }
    print "</table>";
?>

さて、出来上がりです。以下のスクリーンショットのようになってるでしょうか?CSSがないと寂しいですが、そこはご愛嬌で。
a

サーバーの構築やHTMLなどは別途ご確認ください。