転職を繰り返したサラリーマンの多趣味ブログ

30才未経験でSEに転職した人の多趣味ブログ

MacBook Pro 13-inch, Mid 2010のメモリを16GBに増設した

最近はWindowsをメインマシンとしてきたが、Windowsが謎のフリーズを繰り返すようになり、仕方なく昔のMacを引っ張り出してきた。それが、MacBook Pro 13-inch, Mid2010だ。もう10年近く前に買ったことになる。
で、Macは起動はするのだが、何をするにも遅い。そこで、メモリを増設することにした。で、何も考えずに16GBに増設しようと考え、以下のメモリを購入する。

シリコンパワー ノートPC用メモリ DDR3 1600 PC3-12800 8GB×2枚 204Pin Mac 対応 永久保証 SP016GBSTU160N22

シリコンパワー ノートPC用メモリ DDR3 1600 PC3-12800 8GB×2枚 204Pin Mac 対応 永久保証 SP016GBSTU160N22

 

 で、交換作業自体はうまくいったが、何とMacが起動しない。いろいろ調べてみると、そもそもMacBook Pro 13-inch Mid 2010は16GBに公式には対応してないとのこと。
また、メモリは相性がいろいろあるらしく、結果自分が買ったメモリはうちのMacには合わなかったということらしい。。

そこで、もう一度調べていくと、MacBook Pro 13-inch Mid 2010と動確が取れてるメモリはいくつかあるが、Amazonから買えるメモリは以下のものだった。

 さっそく交換して、起動してみると起動したー!!
がしかし、MacBook Proの内蔵キーボードが反応しない。USB端子で接続している外部キーボードは反応するという謎事象。。
で、試して成功したのが、PRAMリセット。ようやく、メモリ交換が成功しました。

MacBook Pro 13-inch, Mid 2010で、メモリを16GBに増設することを検討している方は、この記事が参考になれば!

【技術書メモ】C#プログラミングのイディオム / 定石&パターン③

ラムダ式

ラムダ式は一種のメソッドで、メソッドをかなり簡略化することができる。

public void Do() {

    var numbers = new[] { 5, 3, 9, 6, 7, 5, 8, 1, 0, 5, 10, 4 };

    // 変数judgeに処理内容を代入
    Predicate<int> judge = (int n) => {
        if (n % 2 == 0) {
            return true;
         } else {
             return false;
         }
     };

     // Countメソッドの呼び出し
     var count = Count(numbers, judge);
}

// 第2引数のjudgeには、int型を受け取り、bool値を返すメソッドを指定可
public int Count(int[] numbers, Predicate<int> judge) {
    int count = 0;
    foreach(var n in numbers) {
        if(judge(n) == true) {
            count++;
        }
    }

    return count;
}

上記のようなソースがあったとして、変数judgeに代入している処理は、ラムダ式でだいぶ簡略化できる。

  • returnの右側には、式を書ける。
  • ラムダ式の{}が1つであれば、{}とreturnを省略可。
  • 引数の型を明示しなくてもよい。
  • 引数が1つであれば、()を省略可。

省略したソースがこちら。

var count = Count(numbers, n => n % 2 == 0);

とかなり省略できるが、ラムダ式は全然慣れてないので、初見だと何をやっているかわからない。また、Predicateの理解も曖昧だし、メソッドの引数にメソッドを指定するって考え方もピンとこない。慣れたら、便利なのかな。

Listクラスとラムダ式の組み合わせ

Listクラスには、ラムダ式を引数に受け取れるメソッドがたくさんあるらしい。
まずは、以下Listがあるとする。

var list = new List<string> {
    "Tokyo", "New Delhi", "Bankok", "london", "Paris", "Berlin", "Canbera", "Hong Kong"
};

このListに対して、ラムダ式を使ったメソッド呼び出し例を記載していく。
Existsメソッド

// 引数で指定した条件に一致する要素がするかをtrue / falseで返却
// 最初の文字が'A'である要素がリスト内に存在するかチェック
var exists = list.Exists(s => s[0] == 'A');

Findメソッド

// 引数で指定した条件と一致する要素を検索し、最初に見つかった要素を返却
// 文字列の長さが6文字の最初の要素を返却する(Bankok)
var name = list.Find(s => s.Length == 6);

FindIndexメソッド

// 引数で指定した条件と一致する要素を検索し、インデックスを返却
// 要素の中からBerlinを検索し、そのインデックスを返却
int index = list.FindIndex(s => s == "Berlin");
Console.WriteLine(index);

FindAllメソッド

// 引数で指定した条件と一致する、すべての要素を取得する
// Tokyo, Parisを取得(文字列が5文字以下)
var names = list.FindAll(s => s.Length <= 5);
foreach (var s in names) {
    Console.WriteLine(s);
}

RemoveAllメソッド

// 引数で指定した条件と一致すよ要素をリストから削除し、戻り値は削除した要素数
// London, Hong Kongを削除
var removedCount = list.RemoveAll(s => s.Contains("on"));
Console.WriteLine(removedCount);

ForEachメソッド

// リストの各要素に対して引数で指定した処理を実行
list.ForEach(s => Console.WriteLine(s));

// 上と下は同じこと
foreach(var s in list) {
    Console.WriteLine(s);
}

ConvertAllメソッド

// リスト内の要素を別の型に変換し、変換された要素が格納されたリストを返却
var lowerList = list.ConvertAll(s => s.ToLower());
lowerList.ForEach(s => Console.WriteLine(s));

LINQ to Objectsの基礎

まず、LINQの概要としては、オブジェクト、データベース、XMLなどのさまざまなデータに対して標準化された方法で問い合わせできるというもの。自分の中では、ソースに対して実施できるSQLのイメージできる。(selectやwhereなどがあるから)
また、クエリ演算子はIEnumerableに対する拡張メソッドとして定義されている。
ここでクエリ演算子の例を一つ。

// Whereで5文字以下の要素に絞り、Selectで、引数にラムダ式で小文字変換を指定し、その結果を出力
IEnumerable<string> query = list.Where(s => s.Length <= 5).Select(s => s.ToLower());

※シーケンスとは
標準クエリ演算子の捜査対象のデータのこと。(配列やListなど)
IEnumerableインターフェイスを実装するオブジェクトはすべてシーケンスとして見なされ、LINQのクエリ演算子を使用し、さまざまな操作が可能になる。

遅延実行と即時実行

遅延実行とは、本当にデータが必要になったときにクエリが実行されて、LINQの大きな特徴の一つ。

var list = new List<string> {
    "Tokyo", "New Delhi", "Bankok", "london", "Paris", "Berlin", "Canbera", "Hong Kong"
};

// ここで変数queryに値を代入しているようにみえるが、実際は検索結果が代入されていない
var query = list.Where(s => s.Length <= 5);

list[0] = "Osaka";

// 値が実際に必要になったタイミングで、クエリ演算子が実行される。
// そのため、実行結果は"Osaka","Paris"
foreach(var i in query) {
    Console.WriteLine(i);
}

即時実行とは、クエリを明示的に実行させることをいう。ここでは、ToArrayメソッドを使用した例を示す。

var list = new List<string> {
    "Tokyo", "New Delhi", "Bankok", "london", "Paris", "Berlin", "Canbera", "Hong Kong"
};

// ここで、Whereメソッド実行
var query = list.Where(s => s.Length <= 5).ToArray();

list[0] = "Osaka";

// すでにWhereメソッドが実行されているため、実行結果は"Tokyo","Paris"
foreach(var i in query) {
    Console.WriteLine(i);
}

【技術書メモ】C#プログラミングのイディオム / 定石&パターン②

C#についてがっつり勉強しようと思い、購入した技術書。
まだまだ序盤だが、評判通りのかなりの良書の予感。
uuc1h.hatenablog.jp
では、前回同様、まとめていきたいといきます。

複数の値の代入方法

このやり方は知らなかったので、メモ。

for (int feet = 1; feet <= 10; feet++) {
    double meter = feet * 0.3048;
    // feetが{0}に、meterが{1}に代入される
    // {0.0000}は、meterの値を小数点第4位まで表示する書式設定
    Console.WriteLine("{0}ft = {1:0.0000}m", feet, meter);
}

定数について

定数の定義方法は、以下の通り。

// constは、staticと解釈されるので、staticをつける必要なし
private const double ratio = 0.3048;

けど、constした定数は、publicにしない方がいいとある。
「けど、他クラスから定数を呼び出す場合は結構あるし、そもそもなんでpublicにするべきなのか?」と思っていると、バージョン管理問題に関連するらしい。
※ここで、バージョン管理問題の詳細は割愛

publicにして、他クラスからアクセスさせたい場合は、static readonlyを使えばいい。

public static readonly double Ratio = 0.3048;

オブジェクト初期化子

オブジェクト生成をする際、各フィールドの初期値を設定する。

Sale sale = new Sale {
    ShopName = "ぱんや";
    ProductCategory = "食品";
    Amount = 120;
}

Dictionary型をforeachで扱う際

KeyValuePair型を1つずつ取り出す。ここらへん、あんまりピンとこなかったが、ソースで表すとしっくりきた。

Dictionary<string, int> amountPerStore = sales.GetPerStoreSales();

foreach(KeyValuePair<string, int> obj in amountPerStore) {
    Console.WriteLine("{0}{1}", obj.Key, obj.Value);
}

KeyValuePair型は、キーと値がペアになっていて、上記のようにそれぞれ取り出せる。

C#インターフェイスについて

public class List<T> : IList<T>, ICollection<T>,,,

上記のように記載されていたら、Listクラスは、IList、ICollectionなどのインターフェイスに定義しているメソッドやプロパティを実装していることを示している。
そのため、

List<int> list = new List<int>() {1, 2, 3,4, 5};
ICollection<int> collection = list;
var count = collection.Count;

IEnumerable<int> enumerable = list;
  • Listクラスは、ICollection型の変数に代入でき、ICollectionインターフェイスが定義するプロパティ、メソッドが使える。
  • プロパティ、メソッドの具体的な動作は、Listクラスに実装されている。

といった点が特徴である。

メソッドの戻り値や引数にインターフェイスを指定しておくと、プログラム修正に強くなる。
例:引数がこれまでListだったメソッドを、やはり配列も受け取りたいとした場合、引数をIEnumerableにしておけば、どちらでも受け取れる。

varによる暗黙の型指定

メソッド内のローカル変数宣言の際、型名の代わりにvarを使うと、コンパイラが自動で型を判断してくれる。

var dict = new  Dictionary<string, int>();

なお、代入の右側から型が明らか出ない場合は、varを使用しないこと。

今日は、こんな感じで終わります。
こうやって、まとめると頭に入るけど、やっぱ時間かかるな。

【Unity】Unity2019.1.5f1でAndroid Buildをしようとしたら、「gradle build failed」と出てしまったときの対処方法

複合的な問題でした。
まずUnity2019では、Android SDK & NDK Toolsを一緒にインストールしている。そのため、Preferencesより、インストールしたファイルのパス設定を行った。自分が確認したときは、ズレていた。
詳しくは、以下参照。
https://framesynthesis.jp/tech/unity/android/

上記を直しても解決しない。。
ここで致命的だったのが、プロジェクト名に日本語を入れていたこと。。「タップRPG」にしていた。
プロジェクトを作り直し、そのときのプロジェクト名を「TapRPG」にしたら無事ビルドできましたー。

【NBA】私たちはまた3ピートの瞬間に立ち会えなかった。

まさか、ウォリアーズが負けるとは微塵も思ってなかったから、Game6が終わった直後はちょっと信じられなかった。
KDが怪我で出られないという強烈なアクシデントは合ったものの、KD抜きのウォリアーズも十二分に強い。最初の優勝は、KDいなかったし、シーズン73勝したときもKDはいなかった。そう、スプラッシュブラザーズに、グリーン、イグダーラがいれば、ウォリアーズの強さを発揮できる。

だが、トンプソンの怪我は致命的すぎた。

 特にこのGame6では絶好調だっただけに、トンプソンが怪我さえしなければGame 7があったのでは?と考えずにいられない。
しかもトンプソンは、左前十字靭帯断裂という大怪我だ。この怪我をきいて、まず思い出すのはデリック・ローズ。彼も同じ怪我をおい、大きくキャリアが狂ってしまった。
ローズとトンプソンではタイプが違う選手だが、カットインも多様するトンプソンだけに、万全な形で復帰できるのかが気になってしまう。

しかし、3ピートがなかなか見れない。以前はマイアミ・ヒートが達成しそうだったが、この時はスパーズに阻まれた。いや、正確にいうと当時のファイナルで覚醒したレナードに阻まれた。この時のレナードは、まだまだスター選手ではなかったが、ファイナルに突入するとまさに覚醒状態に入り、ヒートを、レブロンの夢を打ち砕いた。
今度は史上最強チームとの呼び声もあるウォリアーズの3ピートを、またもやレナードがストップしてしまった。

3ピートって、ホント難しいんすね。俺が生きているうちに、3ピートを達成するチーム出てくるかな。

【技術書メモ】C#プログラミングのイディオム / 定石&パターン①

趣味で、Unityでゲームを作っているが、C#についてちゃんと勉強したことがない。
そのため、ここらでC#について基礎から学ぼうと思い、以下の技術書を読んだ。
uuc1h.hatenablog.jp
入門としては、最適な良書だと思う。
そこで、次に入門書の一歩先の技術書を読もうと思い、この本を選択した。

まだまだ序盤しか読んでないが、かなりの良書の予感。。
文法を説明するだけでなく、どういったときにこういう書き方をしなければならないのかという、一歩踏み込んだところまで書いてくれている。
ていうことで、読んだだけでは頭に残らないので、読んだ内容をブログにまとめていきます。

プロパティ

プロパティとは、Javaでいうセッター、ゲッターメソッドの代わりだと認識していた。
ただ、C#3.0で導入された自動実装プロパティのことは知らなかった。こっちの方が凄い簡単。

// 自動実装プロパティを使った書き方
public int Code { get; set; }

// 自動実装プロパティを使わない書き方
private int code;
public int Code 
{ 
    get { return this.code; }
    set { this.code = value; }
}

これまで6行で書いていたところを、たった1行で済んでしまう。。

※ここでちょっとした参考になったこと。
なぜ値型と参照型が必要なのか。
参照型と値型の違いは分かっているのだが、使い分けが分からなかった。
よく入門書では、大きなオブジェクトをコピーする際、値型だったらコピー処理が大変だが、参照型だったらアドレスをコピーするだけですむ。と書いてあるが、これは分かる。
けど、この本には小さなオブジェクトの場合、参照型だとオブジェクトを格納する領域と、アドレスを格納する領域と2つ必要になってしまう。値型なら、変数の領域そのものにオブジェクトを格納できる利点があると書いてあり、腹落ちした。

静的クラスについて

静的クラスの定義方法などは分かっているので、ここでは静的クラスを使う理由について。
インスタンスは、1つのクラスから複数を生成できるので、たとえば以下のようなクラスがあったとする。

class Product
    {
        public int Price { get; set; }

        public double getTaxPrice()
        {
            return this.Price * 1.08;
        }

    }

1つのクラスから複数のインスタンスを生成できるので、車オブジェクトやバイクオブジェクトなどを生成でき、それぞれ個別の値を変数Priceに設定できる。
そのため、Productクラスを静的クラスにしてしまうと、上記利点が消えてしまう。
そのため、静的クラスは特定の値に左右されない場合に適用する。代表的なのが、DateTime.Todayなど。

継承について

// 基底クラス
class Person
    {
        // 名前
        public string Name { get; set; }
        // 誕生日
        public DateTime Birthday { get; set; }

        // 年齢を返却
        public int GetAge()
        {
            DateTime today = DateTime.Today;
            int age = today.Year - Birthday.Year;
            if(today < Birthday.AddYears(age))
            {
                age--;
            }
            return age;
        }
    }
// 派生クラス
class Employee : Person
    {
        // 社員ID
        public int Id { get; set; }
        // 部署名
        public string DivisionName { get; set; }
    }
class Program
    {
        public static void Main(string[] args)
        {
            Employee em = new Employee
            {
                Id = 100,
                Name = "山田",
                Birthday = new DateTime(1980, 1, 1),
                DivisionName = "プログラミング1課",

            };

            Console.WriteLine("{0}({1})は、{2}に所属しています", em.Name, em.GetAge(), em.DivisionName);
        }
    }

継承については、文法的にはJavaとほぼ一緒の印象。なお、基底クラスの変数に派生クラスのインスタンスを代入可能だが、その場合基底クラスのプロパティやメソッドしか使用できない。(これもJavaと一緒)
ちなみにis a 関係というものを知らなかったのでメモ。
継承は「〇〇は△△である」という関係が成り立つときに使用する。上の例でいえば、「社員は人である」という関係が成り立つので、継承を使用して可。
逆に、「人は社員である」という関係は成り立たないので、継承を使ってはいけないとのこと。

【技術書メモ】確かな力が身につくC#「超」入門

Unityをメインにアプリ開発をしているが、Unityで使用する言語はC#だ。
自分は仕事でJavaを使っているからC#も何となく理解できるが、ここらで一度C#を学んでおきたいと思う。
そこで手に取ったのが、この「確かな力が身につく」シリーズだ。

確かな力が身につくC#「超」入門 (Informatics&IDEA)

確かな力が身につくC#「超」入門 (Informatics&IDEA)

イラスト、図が多めで、初心者にとって非常に分かりやすいと思う。
この本から学んだことを、ブログにまとめていく。

プロジェクトの作成

Visual Studioを立ち上げて、新規作成 / プロジェクト を選択する。
そこでプロジェクトの種類が色々出てくるが、ただC#の文法を確認するだけなら「コンソールアプリ」を選べば十分だ。
なお、プログラムの実行はデバッグ / デバッグなしで開始 を選ぶ。

変数の書き方

基本はJavaと同じなので割愛。
定数の書き方も一緒。

const int a = 3;

if文、for文、switch文、while文

これらも基本はJavaと一緒。
ただし、foreach文だけはメモしておこう。Javaの拡張for文とちょっと違うので。

float[] weights = { 41.2f, 42.5f, 44.9f, 43.0f, 29.2f };

    foreach (float f in weights)
    {
            Console.WriteLine(f);
    }

コレクション

まずはList型から。
List型

List<float> weights = new List<float>();

Dictionary
次はDictionary型。Map型に近い印象。

Dictionary<string, float> weights = new Dictionary<string, float>();

weights.Add("2019/12/10", 41.2f);

Console.WriteLine(weights["2019/12/10"]);

LINQラムダ式

ラムダ式とは
戻り値を返す短いメソッドを、より簡潔に書く方法のこと。
(引数) => 戻り値の計算式

int Add(int n)
{
    return n + 5;
}

// これをラムダ式で書くと
n => n + 5

とかなり簡潔に書ける。

LINQとは
統合言語クエリ。配列やコレクションの中から条件を満たす値だけ取り出せる。まさにクエリです。

Whereメソッド

int[] hp = { 420, 120, 600, 0, 1200 };

// 600, 1200が取得できる
var newHP = hp.Where(n => n >= 500);

※var型とは
代入された値によってコンパイラが自動的に型を判断。LINQのメソッドの戻り値は基本var型。


Selectメソッド

int[] hp = { 420, 120, 600, 0, 1200 };

// すべての要素の値を100減らす
var newHp = hp.Select(n => n - 100);


Countメソッド

int[] hp = { 420, 120, 600, 0, 1200 };

// HPが0の要素を取り出し、その数をカウントする
var newHp = hp.Where(n => n == 0).Count();

慣れたら、かなり使いやすそう。

プロパティ

通常、他クラスのメンバー変数にアクセスする場合、そのクラスのセッター、ゲッターメソッドを使用しなければならない。
だが、プロパティを使うと、直接メンバー変数にアクセスするような感覚でできる。

private int hp;

// プロパティ
public int Hp
{
    set
    {
        this.hp = value;
    }
    get
    {
        return this.hp;
    }
}

Player player = new Player("たかし", 500);
// Hpプロパティに代入
player.Hp -= 2000;    // セッター
player.Hp;                 // ゲッター

※ちょっと番外編。staticキーワードについて
いつも忘れてしまうので、ちょっとメモ。
staticをつけると、インスタンスではなくクラス自体に属するようになり、インスタンス間で共有される値になる。「クラス名.メンバ変数」で値を代入、取得できる。また、メソッドでも「Player.GetTeamName()」のように、「クラス名.メソッド名」でも使用できる。

継承について

C#の継承の書き方は、Javaとちょっと違う。

class 派生クラス名 : 基本クラス名
{
}

<b>※またまた番外編。ポリモーフィズムについて</b>
派生クラスのインスタンスを、基本クラスの変数に入れることができる性質。変数の型がすっきりするやつね。

と、ざっとまとめました。ただ、あくまで初歩の初歩の内容なので、次は中級クラスの技術書を読もう。
けど、この確かな力が身につくC#「超」入門は、超良書です。