Raspberry Pi 2のセットアップとかなんとか

OSをセットアップして利用できるようにするまでの手順メモ。NOOBS 1.4.0でやった手順です。
Raspbianを直接インストールするやりかたもあるようですが、ワタクシは初心者なのでNOOBSで。

ブートイメージの用意

  • microSDを用意する。8GB以上必要。
  • Downloads | Raspberry PiよりNOOBSをダウンロード。LITEの方はNETBOOTっぽいので、インストールに時間が掛かるかも。
  • SDカードをフォーマットする。FAT32でよい。
  • ダウンロードしたNOOBSのZIPを解凍してSDカードにコピーする。

ブート

  • microSDをRaspberry Pi本体に差してからmicroUSB(電源)を差す。
  • Raspbianにチェックを入れて、Installをクリック。
  • インストールが終わるまで待つ。

raspi-config(と文字化けの解消)

  • インストール完了後に再起動。
  • 再起動後にraspi-configが起動されるので、一旦Finishで抜ける。
  • jfbtermをインストールする。
sudo aptitude -y install jfbterm
jfbterm
  • raspi-configを起動。
sudo raspi-config
sudo reboot

パスワード変更

  • パスワードをデフォルトから変更しておく。
passwd
  • rootのパスワードも変更しておく。
sudo passwd
  • デフォルトのユーザー(pi)がパスワードなしでsudoできるのが気持ち悪いので、パスワードを聞くよう変更。
sudo nano /etc/sudoers
pi ALL=(ALL) NOPASSWD: ALL

の行をコメントアウト(行頭に#を挿入)。
設定するとGUI(LXDE)のメニューからシャットダウン等が効かなくなるので、一旦やめておく。

インプットメソッドを入れる

  • フォントとanthyのインストール。
sudo aptitude -y install fonts-vlgothic ibus-anthy

Xを起動してみる

  • Xの起動。
startx
  • iBusの設定。
  • ターミナルからraspi-configを起動して、ブート時にXが起動するように変更。

manpageの日本語化

  • 日本語化されたmanpageをインストールする。
sudo aptitude -y install manpages-ja manpages-ja-dev

iceweaselのインストール

  • iceweaselと日本語リソースをインストールする。
sudo aptitude -y install iceweasel iceweasel-l10n-ja

rbenv使えるようにしなきゃだわ。

SQL Server LocalDBでerror 50

SQLServer 2014のLocalDBでEntityFrameworkでEnable-Migrationしようとしたときとか、SSMSで(localdb)\v12.0に接続しようとしたときにerror 50を吐く場合の対処方法。

SQL 2014 LocalDB Error: “Cannot connect to (localdb)v12.O.” | some assembly required, batteries not included

既知の問題でLocalDBのインストール時にインスタンスが作成されないので、手で作ってやる必要があるそうな。

SPREAD 3.0J for Web Forms + IE8で障害

凄く今更な環境ですが、ググっても全然ヒットしなかったので書いときます。
誰かの役に立てば、これ幸い。

一応、公式でSPREAD 3.0J SP2 (build 3.0.2028)でIE8に対応しました、となってるのだけど、実行するとクライアント側で"実装されていません fpspread.htc X行"というJavascriptエラーが発生してセル上のコマンドボタンなどが動作しなくなる問題でハマること1日。
今更サポートが終わってるSPREAD3.0のサポートは期待できないので、「どうしたもんかなー」と悩みながら問題を切り分けしてたら発生条件が解った。

  • FrozenColumnCountとかFrozenRowCountプロパティを指定している。
  • IE8のレンダリングがドキュメントモードが"IE8標準"となっていて、かつブラウザーモードが"IE8互換"になっている。

という条件が重なったときに該当のエラーが発生していた。開発者ツールからブラウザーモードを"IE8" に変更すると正しく動作するようになったため、"IE8互換"にしている原因を探すことに。

MSDN Blogs

上記blogの記事によると、IE8互換になる理由は以下のいずれかで、

  • metaタグかhttpヘッダのX-UA-CompatibleでEmulateIE8を指定されている。
  • [互換表示設定]で[互換表示に追加したWebサイト]に追加されている。
  • [互換表示設定]で[互換表示でイントラネットサイトを表示する]にチェックが入っていて、対象のサイトがイントラネット内に存在する。

今回は対象サイトが互換表示に追加されていたのが原因だったので、互換表示の対象から外すと意図したとおりに動作するようになった。
ドキュメントモードはmetaタグで開発者側がコントロールできるのだけど、ブラウザーモードのデフォルト状態をコントロールできないのは困るなあと思う。ここは利用者に互換表示設定から外して貰うより仕方が無いのだけど。

UMTP L3にパスしました

UMTP L3に合格しました。
今のところ対策本とかは出てないので、自分のやったことを簡単にまとめてみます。

出題範囲

出題範囲についてはUMTP Japan - 試験概要となります。

上記より勉強した部分

その他

  • 設問1〜3の形式の問題が出た場合、いきなり解こうとせずに設問を全て読むこと。設問3は設問1から導出した、というパターンがあったりするので、お互いにヒントになるのでチャンスになります。例えばクラス図=>アクティビティ図を導出など。
  • 制限時間120分で分析〜設計を行うので、見直しの時間まで含めると結構余裕の無い制限時間で設定されています。難しそうな問題の場合、一旦保留しておいて他の問題を先に解いた方がよいと思います。
  • 120分フルフルで物を考え続けるので、脳に負担が掛かります。寝不足に注意して、開始一時間前くらいに甘い物を採って血糖値を上げておくといい感じです。
  • 問題が難しいと感じても、ともかく時間までもがき続けること。

何かの参考になればよいのですが。健闘を祈ります。

値型

構造体、列挙体、数値型、boolが該当します。
インスタンスはマネージスタックに確保されます。
値型の変数は値自体を保持します。なので、値型の変数を別の変数に代入すると値がコピーされます。
構造体はSystem.ValueTypeから暗黙的に派生し、列挙体はSystem.Enumから暗黙的に派生します。

namespace SuperclassTest
{
	// 列挙体は明示しないが暗黙的にSystem.Enumを継承
	enum EnumTest
	{
		val0,
		val1
	}
	
	// 構造体は明示しないが暗黙的にSystem.ValueTypeを継承
	struct StructTest
	{
		int val0;
		long val1;
	}
	
	class Program
	{
		static void Main(string[] args)
		{
		}
	}
}

ILDasmでMethodInfoをダンプすると

TypeDef #1 (02000002)
-------------------------------------------------------
TypDefName: SuperclassTest.EnumTest (02000002)
Flags : [NotPublic] [AutoLayout] [Class] [Sealed] [AnsiClass] (00000100)
Extends : 01000001 [TypeRef] System.Enum


TypeDef #2 (02000003)
-------------------------------------------------------
TypDefName: SuperclassTest.StructTest (02000003)
Flags : [NotPublic] [SequentialLayout] [Class] [Sealed] [AnsiClass] [BeforeFieldInit] (00100108)
Extends : 01000002 [TypeRef] System.ValueType

となっています。

値型から新しい型を派生することはできません。(但しインターフェースの実装はできます)

using System;

namespace InheritsTest
{
	class Program
	{
		// これはコンパイルエラー
		// エラー CS0527: インターフェイス リストの型 'int' はインターフェイスではありません。
		//private struct StructTest : int
		//{
		//}
		
		// これはインターフェースの実装なので問題ない
		private struct StructTest : IDisposable
		{
			#region IDisposable メンバー
			public void Dispose()
			{
				throw new NotImplementedException();
			}
			#endregion
		}
		
		static void Main(string[] args)
		{
		}
	}
}

値自体を保持するので値型は暗黙的にコンストラクタを持ち、宣言時に値が初期化されます。(なので、コンストラクタは1つ以上の引数を取るものしか宣言できません)

namespace ConstructorTest
{
	class Program
	{
		private struct StructTest
		{
			int _i;
			
			// これはコンパイルエラー
			// CS0568: 構造体に明示的なパラメーターのないコンストラクターを含めることはできません。
			//public StructTest() { this._i = 0; }
			
			// これはオーバーロードなので問題ない
			public StructTest(int val) { this._i = val; }
		}
		
		static void Main(string[] args)
		{
		}
	}
}

定数式のオペランドが全て単純型の定数の場合、式はコンパイル時に解決されます。

using System;

namespace ConstTest
{
	class Program
	{
		const int val1 = 1;
		const int val2 = 2;
		const int val3 = 3;
		
		static void Main(string[] args)
		{
			Console.WriteLine(val1 + val2 + val3);
		}
	}
}

ILDasmで逆アセンブルすると該当のMainメソッドの内容は

.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// コード サイズ 9 (0x9)
.maxstack 8
IL_0000: nop
IL_0001: ldc.i4.6
IL_0002: call void [mscorlib]System.Console::WriteLine(int32)
IL_0007: nop
IL_0008: ret
} // end of method Program::Main

となります。IL_0001で評価後の値がリテラルとして設定されています。

プリミティブ型について

厳密に言うと「プリミティブ型」という型は存在せず、「値型」か「参照型」しか存在しないのですが、コンパイラが認識して特別扱いをする型についてはプリミティブ型と言う場合があります。
"組み込みのデータ型"とも。(JIS X 3016で定義されている用語では"組み込みの値型""組み込みの参照型"とも)

System名前空間で宣言されているオブジェクトのエイリアスです。(System.Int32=>intとか)
なので、ある変数を宣言するときにSystem.Int32で宣言しても、int(C#の場合。VisualBasicではInteger)で宣言しても出力されるILはまったく同じになります。C#で書いている時にIntelliSenseで"String"と"string"が候補に挙がってくるのはこれが原因。恐らくC++とかに合わせてstringというエイリアスを設定したのだろうけど、どっちを使うべきか混乱する人が居るんですよね。

通常の値型や参照型と大きく異なる点として、リテラルとして記述可能という点があります。
例えば"123.ToString()"という記述が可能です。

using System;

namespace LiteralTest
{
	class Program
	{
		static void Main(string[] args)
		{
			string s = 123.ToString(); // これはOK
			Console.WriteLine(s);
			Console.WriteLine(123.GetType().Name); // これもOK
		}
	}
}

コンソールに出力される内容は下記になります。

123
Int32

また、リテラルからなる式はコンパイル時に式の評価が行われます。

using System;

namespace AtCompile
{
	class Program
	{
		static void Main(string[] args)
		{
			Console.WriteLine(1 + 10 + 100);
			Console.WriteLine("A" + "b" + "C");
		}
	}
}

ILDasmで逆アセンブルすると該当のMainメソッドの内容は

.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// コード サイズ 21 (0x15)
.maxstack 8
IL_0000: nop
IL_0001: ldc.i4.s 111
IL_0003: call void [mscorlib]System.Console::WriteLine(int32)
IL_0008: nop
IL_0009: ldstr "AbC"
IL_000e: call void [mscorlib]System.Console::WriteLine(string)
IL_0013: nop
IL_0014: ret
} // end of method Program::Main

となります。
IL_0001とIL_0009で評価後の値がリテラルとして設定されています。
余談ですが、IL命令に関してStandard ECMA-335(Common Language Infrastructure)を参照すると

ldc.i4.s ldcはload numeric constant命令、i4は4バイト整数でInt32、sは符号あり
ldstr ldstrはload a literal string命令

と読むようです。

System.Decimal構造体はプリミティブ型の中でも扱いが特殊です。

using System.Numerics;

namespace OpCode
{
	class Program
	{
		static void Main(string[] args)
		{
			ValueType();
			StructureType();
		}
		
		private static void ValueType()
		{
			int i = 0;
			i++; // add IL命令に変換される
			long l = 0;
			l--; // sub IL命令に変換される
		}
		
		private static void StructureType()
		{
			decimal d = 0;
			d++; // op_Incrementメソッドの呼び出しに変換される(Decimal構造体で演算子オーバーロードされている)
			BigInteger b = 0;
			b--; // op_Decrementメソッドの呼び出しに変換される(BigInteger構造体で演算子オーバーロードされている)
		}
	}
}

ILDasmで逆アセンブルすると

.method private hidebysig static void ValueType() cil managed
{
// コード サイズ 16 (0x10)
.maxstack 2
.locals init ([0] int32 i,
[1] int64 l)
IL_0000: nop
IL_0001: ldc.i4.0
IL_0002: stloc.0
IL_0003: ldloc.0
IL_0004: ldc.i4.1
IL_0005: add
IL_0006: stloc.0
IL_0007: ldc.i4.0
IL_0008: conv.i8
IL_0009: stloc.1
IL_000a: ldloc.1
IL_000b: ldc.i4.1
IL_000c: conv.i8
IL_000d: sub
IL_000e: stloc.1
IL_000f: ret
} // end of method Program::ValueType

インクリメント=>add命令、デクリメント=>sub命令に変換されています。
これらInt32やInt64構造体は演算子の定義が行われていません。コンパイラが扱い方を知っているため、適切なIL命令に変換を行います。(例えばIL命令でsigned版とunsigned版がある場合、これらはコンパイラによって適切に変換されます。)

しかし、Decimal(とプリミティブ型ではないのですがBigInteger構造体)については

.method private hidebysig static void StructureType() cil managed
{
// コード サイズ 30 (0x1e)
.maxstack 2
.locals init ([0] valuetype [mscorlib]System.Decimal d,
[1] valuetype [System.Numerics]System.Numerics.BigInteger b)
IL_0000: nop
IL_0001: ldc.i4.0
IL_0002: newobj instance void [mscorlib]System.Decimal::.ctor(int32)
IL_0007: stloc.0
IL_0008: ldloc.0
IL_0009: call valuetype [mscorlib]System.Decimal [mscorlib]System.Decimal::op_Increment(valuetype [mscorlib]System.Decimal)
IL_000e: stloc.0
IL_000f: ldc.i4.0
IL_0010: call valuetype [System.Numerics]System.Numerics.BigInteger [System.Numerics]System.Numerics.BigInteger::op_Implicit(int32)
IL_0015: stloc.1
IL_0016: ldloc.1
IL_0017: call valuetype [System.Numerics]System.Numerics.BigInteger [System.Numerics]System.Numerics.BigInteger::op_Decrement(valuetype [System.Numerics]System.Numerics.BigInteger)
IL_001c: stloc.1
IL_001d: ret
} // end of method Program::StructureType

インクリメント=>Decimal::op_Incrementメソッド、デクリメント=>BigInteger::op_Decrementメソッド呼び出しに変換されます。
DecimalやBigIntegerはmsdnライブラリを参照すると、インクリメントやデクリメントは演算子オーバーロードが実装されているので、オーバーロード呼び出しに変換された形になります。