geek-branch

書き置きです。

"オブジェクト指向でなぜつくるのか"を読んだ

ちょっと自由に使える時間があったため、以前読んだ"オブジェクト指向でなぜつくるのか"を読んだ。

初めて読んだ時は理解できない部分が多々あった気がするのだが、今読むとかなりわかりやすかった。かなりの範囲を網羅しておりとてもいい本だと思う。

どうしてもオブジェクト指向と聞くとポリモーフィズムや継承等のプログラミング技術を想像してしまうが、上流工程に対するオブジェクト指向にも触れている。

新しいものというのは既存のものより便利であり、必要になった経緯というものが存在する。そういった背景を知るとより理解が深まると思う。とてもお勧めできる良書だ。

 

forの初期値をdecltypeで推論する

基本的になんでもauto型で推論させたい派だから、vectorとかarrayなどのコンテナを使うとき

for (auto i = 0; i < vec.size(); i++) {}

本当はこう書きたいんだけど、まあもちろん0から推論するとint型になるわけで。.size()からはsize_tが返るからこれはまずい。

for (decltype(vec.size()) i = 0; i < vec.size(); i++) {}

こう書けば正しく推論できるかな、と最近こう書いている。
size_tは32ビット環境と64ビット環境でビット数が違うことがある。C++では基本的にautoやdecltypeなどの型推論を用いるべきだ。
長いし、indexが必要になる場合以外は範囲ベースforを用いるべきだが。範囲ベースforでindex取れるようにならないかな。

#include <bits/stdc++.h>の波線がどうしても消えなかった

今までWindowsVisual Studioを使用して競技プログラミング出てたんだけど、本腰を入れようということで

この辺の記事なんかを参考にさせてもらいながらMacの環境を整えた、ら、なぜか#include <bits/stdc++.h>の波線が恐ろしく消えなかった。昔ちょっといじくって変な感じになったのを放置してたツケが来た。

結論から言うとなんかbrewでインストールしたgccシンボリックリンクがうまく貼れてなかったらしい。シンボリックリンクの貼り直しをして再起動したら波線は消えた。

Macのデフォルトシェルがzshに変わったからか?とかいろいろ考えてたんだけど大丈夫だった、と思う(一応コンパイル &実行シェルはbashを指定するよう変更した)。

c_cpp_properties.jsonのincludePath以外もなんか見てるのね(シンボリックリンクがちゃんと貼れていなかった=gccではなくclangを使っていた…?ただ波線は出てたものの動いてはいた…)。

なんつってる間に3時間使っちゃってますよ、あ〜あ、会社終わりの辛いとこね、これ

帝京大学理工学部情報科学科通信課程に行くことにした

今年から、CSの学位取得のため帝京大学理工学部情報科学科通信課程に通うことにした。

 

せっかく自分の好きな分野を知ることができたのだからそれについて深く学びたい、という思っている。

ただ、大学に入るべきかどうかというのは正直ものすごく悩んだ。

働きながらの単位取得というものにかなり不安を感じている。案件の状況によっては残業や休日出勤が考えられるからだ。試験日に出勤となると無条件で留年が決まってしまうのでは…なんてネガティブな考えばかり浮かんでいた。

4年というのもかなり長く感じた。相当な時間を割くことになるだろうし、好きに勉強ができるのとどちらがいいのか考えていた。

だが、休学や退学を考えられないわけでもないし、CSの基礎科目や数学は自分でも学ばないといけない分野でもあるため入学を決めた。

入学を決めた一番の理由は、将来ずっと後悔し続けるのは嫌だなという感情だと思う。1年以上も悩んでいたものをやめてしまうとこの先ずっと後悔すると感じた。多分この感じだと、今やらなくてもいつかやるだろうし。あとなんか、CSの学位ってコンピュータ好きとして惹かれるものがある。

学習時間についてはかなり不安を感じているが、学習しているものが何に繋がっているか、というイメージは浮かびやすいだろうと思うのでうまくやっていきたいと思う。がんばろ。

Xcode エラー [Unexpectedly found nil while implicitly unwrapping an Optional value]

使用環境: 

Xcode: Version 11.3.1 

エラー内容: [Unexpectedly found nil while implicitly unwrapping an Optional value]

 

prepareで遷移先のView ControllerのImage Viewに代入しようとしていることが原因だった。

prepare時にはまだImage Viewは用意されていないらしい。

遷移先のView ControllerクラスにUIImage型の変数を持たせそちらに代入後、viewDidLoadで代入することで解決できた。なるほど。

C++11以降で使える時間計測クラス

前々から読みたかったOptimized C++をやっと読めたし、影響を受けてホットスポットの検索やパフォーマンス改善時に使える時間計測クラスをなんとなく作った。

Qiitaに載せていたが大した内容でもないしブログに移行。
使用したのはC++11より追加されたchrono。

#include <iostream>
#include <chrono>

class measure_time
{
	std::chrono::time_point<std::chrono::steady_clock> start_time;
	std::chrono::time_point<std::chrono::steady_clock> end_time;

public:
	enum unit
	{
		nanoseconds,
		microseconds,
		milliseconds,
		seconds,
		minutes,
		hours
	};

	measure_time() { start_time = std::chrono::high_resolution_clock::now(); }

	auto lap_time(int unit)
	{
		end_time = std::chrono::high_resolution_clock::now();

		switch (unit)
		{
		case unit::nanoseconds:
			return (end_time - start_time) / std::chrono::nanoseconds(1);

		case unit::microseconds:
			return (end_time - start_time) / std::chrono::microseconds(1);

		case unit::milliseconds:
			return (end_time - start_time) / std::chrono::milliseconds(1);

		case unit::seconds:
			return (end_time - start_time) / std::chrono::seconds(1);

		case unit::minutes:
			return (end_time - start_time) / std::chrono::minutes(1);

		case unit::hours:
			return (end_time - start_time) / std::chrono::hours(1);

		default:
			return -1ll;
		}
	}
};

int main()
{
	measure_time check_time;	// 測定開始

	for (auto i = 0; i < 100; i++) std::cout << i << std::endl;	// target 1

	std::cout << check_time.lap_time(measure_time::unit::microseconds) << std::endl;	// lap 1

	for (auto i = 0; i < 1000; i++) std::cout << i << std::endl;	// target 2

	std::cout << check_time.lap_time(measure_time::unit::milliseconds) << std::endl;	// lap 2

	for (auto i = 0; i < 10000; i++) std::cout << i << std::endl;	// target 3

	std::cout << check_time.lap_time(measure_time::unit::seconds) << std::endl;	// lap 3

	return 0;
}


コンストラクタ呼び出し時点をstart、lap_time呼び出し時点をendとして計算し返却する。
lap_timeの引数としてスタティック定数を渡してやることで単位の変更が可能。

Xcode エラー [[APP NAME] is only available in iOS 13.0 or newer 'UIScene' is only available in iOS 13.0 or newer]

使用環境: 

Xcode: Version 11.3.1 

iPhone実機: iOS 13.3.1 (失敗)

                     iOS 12.4.1 (成功)

エラー内容: [[APP NAME] is only available in iOS 13.0 or newer 'UIScene' is only available in iOS 13.0 or newer]

 

iPhone実機のビルドが恐ろしく通らず数日かなり悩んでいたが、単純に今使用しているXcodeiOS 13.3.1だとビルドできない説が濃厚らしい。

なんとか実機で動いているのを見たい勢として、それならばと少し前まで使用していたiPhone7を引っ張り出してtargetを12.4へ変更後実機ビルド、した結果タイトルにもあるエラーに遭遇した。

targetが13.2になっている事は知っていたのだが、なんでも'UIScene'はiOS 13.0以上でしか使えない機能らしい。

解決法としては、とにかくエラーが出るのでそれらをすべてFixし(Fixすると

@available(iOS 13.0, *)

と追加される)、

class AppDelegate: UIResponder, UIApplicationDelegate {

クラスに

    var window: UIWindow?

を追加したところ問題なくビルドできた。

とりあえずできた、が、iOS 13.3.1でビルドができるようになればそっちで動かしたいのでこれをしたことによって動かなくなる、とかは本当に勘弁して欲しいと願っている。

なんかXcodeからコピペするとめちゃくちゃカッコいい感じになった。ウケる(ウケない)。