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
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
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互換"にしている原因を探すことに。
上記blogの記事によると、IE8互換になる理由は以下のいずれかで、
- metaタグかhttpヘッダのX-UA-CompatibleでEmulateIE8を指定されている。
- [互換表示設定]で[互換表示に追加したWebサイト]に追加されている。
- [互換表示設定]で[互換表示でイントラネットサイトを表示する]にチェックが入っていて、対象のサイトがイントラネット内に存在する。
今回は対象サイトが互換表示に追加されていたのが原因だったので、互換表示の対象から外すと意図したとおりに動作するようになった。
ドキュメントモードはmetaタグで開発者側がコントロールできるのだけど、ブラウザーモードのデフォルト状態をコントロールできないのは困るなあと思う。ここは利用者に互換表示設定から外して貰うより仕方が無いのだけど。
Gist記法を試すテスト
あ、やり方解った。
この辺ヘルプが見当たらないのがはてなブログが使いづらいとこだよなあ。
UMTP L3にパスしました
UMTP L3に合格しました。
今のところ対策本とかは出てないので、自分のやったことを簡単にまとめてみます。
出題範囲
出題範囲についてはUMTP Japan - 試験概要となります。
上記より勉強した部分
- デザインパターン
- GRASPパターン
- 設計の指針。責務の分割をどうすべきか?
- 拡張/揺さぶりに強いモデルを作成するための指針。
- GRASPに関しては定番の実践UML 第3版 オブジェクト指向分析設計と反復型開発入門 - 和書 - ピアソンは教育ソリューションを通じて世界に貢献しています。。というか、この本以外でいい本が見つかりませんでした。
- 開放閉鎖原則
- 運用に入ったクラスを変更してはならない。機能を追加したい場合は、クラスの拡張によって対処されるべき。
- 豆蔵 羽生田さんの技術の広場 - 羽生田栄一の「オブジェクト論」---目次:ITpro連載。
- msdnマガジン2008年06号実践的なパターン : 開放/閉鎖原則。
- リスコフの置換原則
- 大雑把に言うと「スーパークラスが使用されている箇所は全てサブクラスで置換できる」(=サブクラスで置換した場合、挙動が変わるデザインをしてはならない)という原則。
- オブジェクト制約言語(OCL)
- L2まででは余り問われてなかった気がする。この辺はOCUPの参考書を併用した方がいいかも。
- OCUPは勉強してなかったので、O'Reilly Japan - UML 2.0クイックリファレンスで勉強しました。
- ロバストネス分析
- オージス総研の実践ロバストネス分析。
- その他
- O'Reilly Japan - Head Firstオブジェクト指向分析設計。この本は最初に読んでおくといいかも知れない。
- UMTP L2の参考書。L2取得から時間が開いてるので復習の意味で。
その他
- 設問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ライブラリを参照すると、インクリメントやデクリメントは演算子オーバーロードが実装されているので、オーバーロード呼び出しに変換された形になります。