geek-branch

書き置きです。

"高校数学でわかる線形代数"を読んだ

"高校数学でわかる線形代数"を読み終えた。この本を買ったのは半年程度前だったのだが、なかなか読む時間が取れず今までいた。

大学の科目で線形代数を現在学習しているため、補助教材として使用した。

内容的にはかなりわかりやすく、かなり理解の助けになった。教科書のような感じではなく、行列や行列式の歴史も含め書かれている。その辺を僕は楽しめる人間なので楽しく読めた。

あと線形代数の学習については問題集として"スバラシク実力がつくと評判の線形代数キャンパス・ゼミ"を使用し学習している。

 

PythonのimportがVSCodeでunresolved importされる現象の対処

起こったことをそのまま書いたらルー語のようなタイトルになった。

Pythonの計算ライブラリを用いて線形代数の学習をしていたのだが、importで波線が引かれ続けるのがすごく気になった。カーソルを当てるとunresolved importと表示される。

importはできているらしく動作に問題はないのだが、コード補完も効かないためストレスを感じ、対処した。

行ったこととしては、

  1. 環境におけるPythonの使用バージョンの設定
  2. プロジェクト内のsetting.json、.env等のファイル追加

の2つだ。

まず、python --versionなどで現在のバージョンを調べたところ、2.7系のバージョンが使用されていた。

Pythonにはpyenvというツールがあり、それを使用することで複数バージョンのPython環境を使用できるらしい。

下記記事を参考にPythonの使用バージョンを変更した。

qiita.com

変更したものの、そのままだと状態を保持してくれないらしくターミナルを閉じると2.7に戻ってしまったため、下記質問を参考に対処した。

teratail.com

それでもunresolved importは解決できなかったため、以下の記事を参考にファイルを追加した。

blog.mrym.tv

これでとりあえずは解決した。学習を進めようと思う。

"痛快!コンピュータ学"を読んだ

痛快!コンピュータ学をつい先日読み終えた。1年くらい前に購入して積読していたものだ。

偶然にも大学の指定教科書となっていて、少しテンションが上がった。内容はコンピュータの歴史に触れながら、ハードウェアやソフトウェア、インターネットについて学べる内容になっている。とても面白い書籍だった。本書はコンピュータに詳しくない人でも(興味があれば)、楽しく読めると思う。

ちょうど、著者や著者の関わっているプロジェクトについてのこんなニュースを読んだ。

news.yahoo.co.jp

TRONというのはOSの名称で、坂村健氏のプロジェクトである。本書で存在は知っていたが、ここまで世界に広がっているとは知らなかった。

もう少しTRONについて深く知ろうと思う。

"Effective Modern C++"を読んでいる

Effective Modern C++を読み直している。

C++11/14で気をつけたいtipsが記載されており、僕の中では一番思い入れが強いC++の書籍である。

というのも、この書籍に出会うまではいまいちモダンなC++の書き方というものを知らなかった。

僕の周りにはベターCのように書く人が多く、ネットなんかでたまにC++11以降の機能を見かけては「なんだこれは」と衝撃を受けていた。

モダンなC++の書き方を知りたい、と1年ほど前に購入したのだが、とても助けられている。

当時は型推論すら知らず、まともに読み進められなかったことを覚えている。そもそもの機能の知識が全くなかったのだ。

C++の書籍は沢山あるが、C++11以降とそれまででは様々なことが大きく違う。

C++11/14について学びたい人にはかなりお勧めできる。

読み終えたら次はC++テンプレートテクニック第2版を読み直そうと考えている。

テンプレート関数で配列を受け取る

テンプレート関数に配列を渡したいなーとたまに考えることがあった。
しかし、T[]で受け取ることはできないし、T*で受け取ってもサイズの情報を引数だけで持たせることはできないしなあ、と考えていたけれど、以下のコードで可能だった。

#include <iostream>

template<typename T, std::size_t N>
std::size_t array_size(T (&)[N]) {
    return N;
}

template <typename T>
void cout_array(T& param) {
    for (std::size_t i = 0; i < array_size(param); ++i) {
        std::cout << param[i] << std::endl;
    }
}

int main() {
    int arr[5] = {5, 4, 3, 2, 1};
    cout_array(arr);
}

参照で受け取り、配列のサイズを返す関数を用意することで問題なく配列を渡した処理ができる。
Effective Modern C++を読み直しているのだけれど、やはり技術書は知識が乏しい段階で読むのと多少知識が備わった段階で読むのとでは理解のレベルが変わってくると思う。
時間を見つけて購入したC++の書籍を全部読み直したい気持ちがある。

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

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

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

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

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

 

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取れるようにならないかな。