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

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

MacBook Pro(13-inch, Mid 2010)をSSDに換装した。

少し前に、MacBook Proのメモリーを16GBに増設し、多少動作に改善が見られた。ただ、メモリーを増やしたところで、「本体の起動が遅い」、「アプリケーションの起動が遅い」、「Unity、Visual Studioが重い」といった事象は解消されなかった。

uuc1h.hatenablog.jpやはり、SSDの換装が必要だなと思い、Amazon Prime Dayを利用し、SSDを購入した。事前に色々調べていて、SSD換装に必要な物は、ここで一気に購入した。

 ちなみに、MacBook Proの裏ふたを開ける精密ドライバーはすでに持っていたので、ここでは購入していない。

で、実際のSSD換装手順は、以下の手順通りそのままにうまくいった。本当に詳しく、分かりやすく手順を載せてくれているので、マジでありがたいです。
https://rikei-danshi.work/entry/2018-08-10-ssd

1点だけ注意が必要なのが、MacBook Pro 13-inchは、macOS mojavaには非対応で、macOS High Sierraをインストールする必要がある。
ただApp Storeを普通に検索してもmacOS High Sierraが検索でヒットしない。
いろいろ調べたら、ここからmacOS High Sierraインストーラーをゲットできた。
https://support.apple.com/ja-jp/HT208969

f:id:uuc1h:20190728092455p:plain

上記画像の「こちらのリンク」をクリックすると、App Storeが開き、macOS High Sierraをダウンロードできた。あとは、手順通りにスムーズにできた。

で、無事にSSDに換装でき、MacBook Proを起動すると、たしかに早い。これまでの起動時間の半分くらいになっていると思う。あと、アプリケーションの起動も早くなっている。
「おーこれはSSDに換装した甲斐があったなー」とUnity、Visual Studioを起動し、いろいろ使っていくと、各アプリケーションが重い事象は改善されていない。
また、アプリケーションの実行時に、本体が熱を持ち、ファンが凄まじく回転する事象もそのままである。
いくらSSDに換装したといえ、CPUがCore2Duoではキツイのか。。。
こればっかりは仕方ないような気がするので、MacBook Proの改造はここまでとします。

スペックだけみると、メモリー16GB、SSD500GBと高スペックになったな。しかも、金額的にはちょうど2万円くらいでできるし、手順もそれほど複雑ではないのでかなりオススメできる作業だ。
けど、最新のmacOSに対応していないし、CPUが非力なままなので、早く新しいパソコン買いたいなー。

もう自分も年なんだなと感じた今日この頃。

f:id:uuc1h:20190724185841j:plain

よくCMで、「日本人の8割は歯周病にかかっている」とかって見ても、「ふーん」ぐらいにしか感じたことがなかったし、むしろ「ふーん」とも思わないことが多かった。
だがしかし、最近銀歯が取れたので、かれこれ4年振りぐらいに歯医者に行ったら、かなりショックな診断が。。

 

「かなり進行している虫歯があります。あと、歯周病が進んでいて、このままいくと歯がぐらついてきます。」

「えっ、治るんですよね?」

「治療は行えますが、これ以上病状が進まないようにする現状維持しかできません。」

「えっ、じゃあもう歯が抜けちゃいます?」

「いえ、今から治療すればこの先も自分の歯は守れますよ」

あぶねえ、ギリセーフ。。ということで、しばらく歯医者に通うハメになりました。
けど、自分は、歯ブラシだけでなく、デンタルフロスも毎日使って、結構気を使ってた方なんだけどなぁ。タバコも吸わないし、歯周病なんて自分には全くの無関係だと思ってただけに、かなり落ち込む。

まぁ、このタイミングで見つかったことを幸運として、これからは定期的に歯医者に通うことにします。

今日は久しぶりにブログらしいブログを書こうと思う。

継続は力なりとはよく言うけども、それは確かに本当なんじゃないかという気がしてきた。
このブログ、立ち上げてから2年以上たっている。当初は、ブログでお小遣いを稼げたらなーと思っていたが、全く稼げない。そもそもアクセスが無いのだ。
けど、考えてみたら当たり前で、何の特徴も無いただのサラリーマンのブログなんか、誰も読もうと思わない。だから、最近はアクセス数はそんなに気にしないで、自分のアウトプット用として、このブログを使っている。例えば、こんな風にだ。

uuc1h.hatenablog.jp

こういうことを続けていたら、1日10アクセスもなかったのが、1日50アクセスぐらいに増えてきた。1ヶ月で1000アクセスを超えるまでになってきた。
なんどもなんどもブログやめようとしたけど、このまま続けてみるか。 

 

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

今回は、日付、時刻の操作方法。

DateTime構造体

DateTime構造体のインスタンス生成の主な方法と、よく使われるTodayプロパティとNowプロパティ。

// インスタンス生成
var dt1 = new DateTime(2016, 2, 15);
var dt2 = new DateTime(2016, 2, 15, 8, 45, 20);

// TodayとNowプロパティ
var today = DateTime.Today;
var now = DateTime.Now;


また、DateTime構造体には、年、月、日など、様々な日付および時刻の情報を、プロパティから参照することができる。
※ここでは割愛。


指定した日付の曜日の求め方。

var today = DateTime.Today;
DayOfWeek dayOfWeek = today.DayOfWeek;
if(dayOfWeek == DayOfWeek.Sunday)

// DayOfWeekプロパティの型はDayOfWeek列挙型
public enum DayOfWeek {
    Sunday = 0,
    Monday = 1,
    Tuesday = 2,
    Wednesday = 3,
    Thursday = 4,
    Friday = 5,
    Saturday = 6


DayTime構造体を使用すれば、閏年の判定も可能。

var isLeapYear = DateTime.IsLeapYear(2016);


日付形式のもう字列をDateTimeオブジェクトに変換する方法。

DateTime dt1;
if(DateTime.TryParse("2017/6/21", out dt1))
    // 2017/06/21 0:00:00
    Console.WriteLine(dt1);
DateTime dt2;
if(DateTime.TryParse("2017/6/21 10:41:38", out dt2))
    // 2017/06/21 10:41:38
    Console.WriteLine(dt2);

日時のフォーマット

日時を文字列に変換するには、ToStringメソッドを使用する。
ToStringの引数に、あらゆる書式を指定すると、結果の値も変わってくる。

var date = new DateTime(2016, 4, 7, 21, 6, 47);
var s1 = date.ToString("d"); // 2016/04/07


日付を和暦で表示するには、DateTimeクラスを使用する。

var date = new DateTime(2016, 8, 15);
var culture = new CultureInfo("ja-JP");
culture.DateTimeFormat.Calendar = new JapaneseCalendar();
var str = date.ToString("ggyy年M月d日", culture);


指定した日付の元号を得るには、DateTimeFormatInfoクラスのGetEraNameメソッドを使用する。

var date = new DateTime(1995, 8, 24);
var culture = new CultureInfo("ja-JP");
culture.DateTimeFormat.Calendar = new JapaneseCalendar();
// 元号コードの取得
var era = culture.DateTimeFormat.Calendar.GetEra(date);
// 元号コードから元号名を得る
var eraName = culture.DateTimeFormat.GetEraName(era);


指定した日付の曜日を得るには、DateTimeFormatInfoクラスのGetDayNameメソッドを使用する。

var date = new DateTime(1998, 6, 25);
var culture = new CultureInfo("ja-JP");
culture.DateTimeFormat.Calendar = new JapaneseCalendar();
// 曜日の取得
var dayOfWeek = culture.DateTimeFormat.GetDayName(date.DayOfWeek);

DateTimeの比較

日時を比較するには、比較演算子をそのまま利用できる。

var dt1 = new DateTime(2006, 10, 18, 1, 30, 21);
var dt2 = new DateTime(2006, 11, 2, 18, 5, 28);
if (dt1 < dt2)
else if (dt1 == dt2)


時刻情報を含まない日付だけを比較する場合は、Dateプロパティを使う。

var dt1 = new DateTime(2001, 10, 25, 1, 30, 21);
var dt2 = new DateTime(2001, 10, 25, 18, 5, 28);
if (dt1.Date < dt2.Date)
else if (dt1.Date == dt2.Date)

日時の計算

指定した時分秒後を求めるには、TimeSpan構造体を使用する。

var now = DateTime.Now;
// TimeSpanオブジェクトを加える
var future = now + now TimeSpan(1, 30, 0);


n日後、n日前の日付を求めるには、AddYears、AddMonthsメソッドを利用する。

var date = new DateTime(2009, 10, 22);
var future = date.AddYears(2).AddMonths(5);


2つの日時の差を求める。

var date1 = new DateTime(2009, 10, 22, 1, 30, 20);
var date2 = new DateTime(2009, 10, 22, 2, 40, 56);
TimeSpan diff = date2 - date1;
Console.WriteLine("差は、{0}日間{1}時間{2}分{3}秒です", diff.Days, diff.Hours, diff.Minutes, diff.Seconds);
Console.WriteLine("トータルで{0}秒です", diff.TotalSeconds);


2つの日付の日数差を求める。

var date1 = new DateTime(2009, 10, 22, 1, 30, 20);
var date2 = new DateTime(2009, 10, 22, 2, 40, 56);
TimeSpan diff = date2.Date - date1.Date;
Console.WriteLine("{0}日間", diff.Days);


DaysInMonth静的メソッドを使えば、月末日を求めれる。

var today = DateTime.Today;
int day = DateTime.DaysInMonth(today.Year, today.Month);
var endOfMonth = new DateTime(today.Year, today.Month, day);


DayOfYearプロパティを使って、1月1日からの通算日を求める。

var today = DateTime.Today;
int dayOfYear = today.DayOfYear;

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

今回はディクショナリの操作について。ディクショナリと聞くと馴染みがないが、JavaでいうMapと認識している。

ディクショナリの基本操作

ディクショナリの初期化。

var flowerDict = new Dictionary<string, int>() {
    {"sunflower", 400},
    {"pansy", 300},
};


なお、ディクショナリにはオブジェクトも値に格納できる。

var employeeDict = new Dictionary<int, Employee> {
    {100, new Employee(100, "やまだ") },
};


では、続いて各操作を確認していく。
まずは、要素の追加から。

flowerDict["violet"] = 600;

// Addメソッドを使う場合
flowerDict.Add("violet", 600);


要素を取り出す。

int price = flowerDict["rose"];


指定したキーにディクショナリが存在しない場合は、例外が発生してしまう。
そのため、ディクショナリにキーが存在しているか調べることができる。

var key = "pansy";
if (flowerDict.ContainsKey(key)) {
}


ディクショナリから要素を削除する。

var result = flowerDict.Remove("pansy");


ディクショナリからすべての要素を取り出す。
foreach文を使うことになるが、foreachで取り出せる要素の型は、KeyValuePair型。
Keyプロパティでキーの値、Valueプロパティで対応する値を参照する。

foreach (var item in flowerDict)
    Console.WriteLine("{0} = {1}", item.Key, item.Value);


では、ディクショナリからすべてのキーを取り出す方法をみてみる。

foreach (var key in flowerDict.Keys)

ディクショナリの応用

配列やリストをディクショナリに変換する。

var employeeDict = employees.ToDictionary(emp => emp.Code);


ディクショナリから別のディクショナリを作成する。
ディクショナリからある条件に一致したものだけを抜き出し、新たにディクショナリを生成するなどの場合に用いられる。

var newDict = flowerDict.Where(x => x.Value >= 400).ToDictionary(flower => flower.Key, flower => flower.Value);


カスタマクラスをキーにする。
文字列や数値ではなく、独自に作成したカスタムクラスも、ディクショナリーのキーにできる。
ただ、これには一つだけ注意が必要で、キーに使用するカスタムクラスに、EqualsメソッドとGetHashCodeメソッドをオーバーライドする必要がある。

public int Day { get; private set; }

public int Month { get; private set; }

public MonthDay(int month, int day) {
    this.Month = month;
    this.Day = day;
}

public override bool Equals(object obj) {

    var other = obj as MonthDay;
    if (other == null)
        throw new ArgumentException();
    return this.Day == other.Day && this.Month == other.Month;

}

public override int GetHashCode() {
    return Month.GetHashCode() * 31 + Day.GetHashCode();
}
public static void Main(string[] args)
{

    var dict = new Dictionary<MonthDay, string> {
        {new MonthDay(3, 5), "珊瑚の日" },
        {new MonthDay(8, 4), "箸の日" },
        {new MonthDay(10, 3), "登山の日" },
    };

    var md = new MonthDay(8, 4);
    var s = dict[md];
    Console.WriteLine(s);
}


ディクショナリを使う際、キーがディクショナリに格納されていることが重要で、その値を利用しないケースがある。
こういった場合は、HashSetクラスを使用する。

var hash = new HashSet<string>();
hash.Add("string");
hash.OrderBy();


ディクショナリは、キーの重複を許していない。そのため、同一キーで複数のオブジェクトを関連づけることができない。
こういう場合は、値をリスト型にしておく。

var dict = new Dictionary<string, List<string>() {
    { "PC", new List<string> {"パーソナルコンピュータ", "プログラムカウンタ",}},
}

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

今回は、配列とListの操作です。
配列とListは似たところがあるけど、自分はほぼListしか使わないかも。配列の使い所がわからない。
この章ではLINQのさらに詳しい使い方も説明してくれるらしいので、頑張ります。

要素の設定

配列あるいは、Listを同じ値で埋める。

// List<T>(要素数:20個)の値を-1で埋める
var numbers = Enumerable.Repeat(-1, 20).ToList();

// 配列(要素数:12個)の値をunknownで埋める
var strings =  Enumerable.Repeat("(unknown)", 12).ToArray();


配列あるいは、Listに連続した値を設定する。

// 配列に1〜20の値を設定
var array = Enumerable.Range(1, 20).ToArray();

コレクションの集計

平均値の求め方。

var numbers = new List<int>{9, 7, 5, 4, 2, 5, 4, 0, 4, 1, 0, 4};
var average = numbers.Average();

// 合計の求め方
var sum = numbers.Sum();


最小値、最大値の求め方。

var numbers = new List<int>{9, 7, 5, 4, 2, 5, 4, 0, 4, 1, 0, 4};
var min = numbers.Where(n => n > 0).Min();
var max = numbers.Where(n => n > 0).Max();


条件に一致する要素をカウントする。

var count = numbers.Count(n => n == 0);

コレクションの判定

条件に一致する要素があるかどうか調べる。
Anyメソッドは、条件に一致する要素が見つかった時点で要素の取得を中止する。

bool exists = numbers.Any(n => n % 7 == 0);


コレクション内のすべての要素が条件を満たしているかどうかを調べる。

bool isAllPositive = numbers.All(n => n > 0);


2つのコレクションの要素が等しいか調べる。

bool equal = numbers1.SequenceEqual(numbers2);

単一の要素の取得

条件に一致する最初、または最後の要素を取得する。

var word = words.FirstOrDefault(x => x.Length == 4);
var word = words.LastOrDefault(x => x.Length == 4);


条件に一致する最初、または最後のインデックスを求める。

var index = numbers.FindIndex(n => n < 0);
var index = numbers.FindLastIndex(n => n < 0);

複数の要素の取得

条件を満たす要素をn個取り出す。

var results = numbers.Where(n => n > 0).Take(5);


コレクションの中から、条件を満たしている間だけ要素を取り出す。
例として、400, 281, 389, 637, 411というリストがあった場合、600以下という条件をつけたら、先頭の400、281、389だけ取れるというもの。

var selected = books.TakeWhile(x => x.Price < 600);


では逆に、条件を満たしている間だけ要素を読み飛ばすには、SkipWhile演算子を使う。

var selected = numbers.SkipWhile(n => n >= 0).ToList();

その他の処理

コレクションから別のコレクションを生成する。
基本的には、ToArray()、ToList()メソッドを使用する。

var words = new List<string>{"Microsoft", "Apple", "Google", "Oracle", };
var lowers = words.Select(name => name.ToLower()).ToArray();


重複を排除する。

var result = numbers.Distinct();


コレクションを並び替える。

// 昇順にソート
var sorteBooks = books.OrderBy(x => x.Price);

// 降順にソート
var sortedBooks = books.OrderByDescending(x => x.Price);


2つのコレクションを連結する。

var allfiles = files1.Concat(file2);

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

今回は文字列操作編!
そういえば、会社の研修でJavaを勉強し始めた当初、文字列の比較のやり方がわからなくて、かなりつまづいたな。
結局、10才近く年下の子にやり方教えてもらったのは、いい思い出です。

文字列の比較

C#での文字列比較をやっていきます。
まず、これが一番シンプルな比較方法。大文字小文字も区別される。

if (str1 == str2)


次が、大文字小文字の区別なく比較する方法。
3つ目の引数のtrueが、大文字小文字の区別なく比較することを表している。

if (String.Compare(str1, str2, ignoreCasetrue) == 0)


ひらがなとカタカナを区別なく、比較することも可能。

var str1 = "カステラ";
var str2 = "かすてら";
var cultureInfo = new CultureInfo("ja-JP");
if(String.Compare(str1, str2, cultureInfo, CompareOptions.IgnoreKanaType) == 0)


全角半角の区別なく比較するには

var str1 = "HTML5";
var str2 = "HTML5";
var cultureInfo = new CultureInfo("ja-JP");
if(String.Compare(str1, str2, cultureInfo, CompareOptions.IgnoreWidth) == 0)


また、String.Compareメソッドの第3引数は論理演算子で繋げることも可能で

var str1 = "Html5";
var str2 = "HTML5";
var cultureInfo = new CultureInfo("ja-JP");
// 大文字小文字と全角半角の区別なく比較
if (string.Compare(str1, str2, cultureInfo, CompareOptions.IgnoreWidth | CompareOptions.IgnoreCase) == 0)

文字列の判定

nullあるいは空文字かを判定。これはよく使いそう。

if(String.IsNullOrEmpty(str))


空文字かを判定する。

if(str == String.Empty)


nullか空文字か空白文字列かを判定する。空白文字列も判定できるのか。

if(String.IsNullOrWhiteSpace(str))


指定した文字列で始まっているか。

if(str.StartsWith("Visual"))


指定した文字列で終わっているか。

if(str.EndsWith("Exception"))


指定した部分文字列が含まれているか。

if(str.Contains("Program"))


上記は文字列だったが、文字が含まれているかを調べるには、LINQを使う。

var target = "The quick brown fox jumps over the lazy dog.";
var contains = target.Contains('b');


次もまたLINQ。条件を満たしている文字が含まれているか。

var target = "C# Programming";
// 小文字が含まれているかチェック
var isExists = target.Any(c => Char.IsLower(c));


上記はどれか1文字でも条件を満たしているかどうかのチェックだったが、今度はすべての文字が条件を見てしているかをチェックする。

var target = "141421536";
// 数字かどうかをチェック
var isAllDigits = target.All(c => Char.IsDigit(c));

文字列の検索と抽出

部分文字列を検索し、その位置を求める。

var target = "NameList;BirthdayList";
var index = target.IndexOf("BirthdayList");


文字列の一部を取り出す。

// 指定した位置から最後までを部分文字列として取り出す
var value = target.Substring(index);


取り出す長さを指定することもできる.

var value = target.Substring(index, endIndex - startIndex);

文字列の変換

文字列の前後の空白を取り除く。

var replaced = target.Trim();


文字列の前後片方だけの空白を取り除く。

var replaced1 = target.TrimStart();
var replaced2 = target.TrimEnd();


指定した位置から任意の数の文字を削除する。

var result = target.Remove(5, 3);


指定した位置に文字列を挿入する。

var target = "01234";
// 01abc234が出力される
var result = target.Insert(2, "abc");


文字列の一部を別の文字列で置き換える。

var target = "I hope you could come to with us.";
// I wish you could come to with us.と出力される。
var replaced = target.Replace("hope", "wish");


小文字を大文字に変換する。

var replaced = target.ToUpper();


大文字を小文字に変換する。

var replaced = target.ToLower();

文字列の連結と分割

文字列の連結は、+演算子を使う。これは、Javaと一緒。

var name = "山田" + "太郎";


文字列の末尾に追加する。

var name = "やまだ";
name += "先生";


指定した区切り文字で文字列配列を連結する。

var languages = new[]{"C#", "Java", "VB", "Ruby", };
var separator = ",";
// C#, Java, VB, Rubyと出力される
var result = String.Join(separator, languages);


指定した文字で文字列を分割する。
>|cs|
var target = "I hope you could come to with us.";
// 空白文字で分割する
string[] words = target.Split(' ');


なお、空の配列要素を含めないようにするには、以下の書き方が必要。

var target = "I hope you could come to with us.";
// 空白文字で分割する
string[] words = target.Split(new [] {' ', '.'}, StringSplitOptions.RemoveEmptyEntries);


文字列は基本的に普変オブジェクトである。そのため、文字連結を行うたびに、新たなインスタンスを生成していることになる。
そこで、StringBuilderを使った文字連結がある。StringBuilderクラスは、インスタンス生成時に、文字列を格納する領域を確保し、その領域を超えて文字列を追加しようとした場合は、自動的に容量が増えていく。そのため、無駄なインスタンスを生成する必要がない。

var sb = new StringBuilder();
foreach (var word in GetWords()) {
    sb.Append(word);
}
// 文字列に変換
var text = sb.ToString();

その他の文字列操作

文字列から文字を1つずつ取り出すには、foreach文を使う。

foreach (var c in str) { }


文字配列から文字列を生成する。

var chars = new char[] {'P', 'r', 'o', 'g', 'r', 'a', 'm' };
var str = new string(chars);


数値を文字列に変換するには、ToStringメソッドを使用する。
ToStringメソッドには、さまざまな書式指定を引数で行えるが、多すぎるのでここでは割愛する。


指定した書式で文字列を整形するには、String.Formatメソッドを使用する。

var novelist = "やまだ";
var bestWork = "春麗";
var bookline = String.Format("Novelist={0};BestWork={1}", novelist, bestWork);