冷めたコーヒー

Weniger, aber besser

応用情報技術者試験の受験記

2020年10月18日に行われた応用情報技術者試験を受験し、下記の通りギリギリですが合格したので記録を残しておきます。但し、以下で述べるようにほとんど再現性のない合格の仕方をしたため、ここに書かれている内容を鵜呑みにしないように注意されたい。

試験勉強

  • 試験一週間前から勉強開始(総勉強時間: 20h~30h)
  • 午前対策: 応用情報技術者試験ドットコムを周回(直近5回分をほぼ丸暗記)
  • 午後対策: 最新の過去問を一回分解く(通しで解かず、個別に解いた)

所感

  • 午前の対策(午後も?)は参考書で体系的な知識をつけるより過去問を周回するに限る
  • 午後は個々人のバックグラウンドで解きやすい問題が大きく異なると感じた
  • 午後試験の対策として時間を計って通しで解いておけばよかった
  • 昼食はおにぎり一個程度にすると午後試験で眠くならなくてよかった(重要
  • 部分点は割と大らかであると感じた(なので分からなくても何か書こう)

近接勾配法概説

この記事は「数理最適化 Advent Calendar 2020」の24日目の記事です.

Advent Calendar 初参戦です.今回は「数理最適化」がテーマということで,凸計画問題に対する近接勾配法について書こうと思います*1.連続最適化や機械学習に馴染みのある方にとっては新鮮味のない話題かもしれませんが,どうぞよろしくお願いします.

はじめに

数理最適化において,凸集合*2上で凸関数*3を最小化する*4問題は「凸計画問題」 あるいは「凸最適化問題」などと呼ばれる.線型計画問題,二次計画問題,半正定値計画問題,二次錐計画問題などは凸計画問題の代表的な例であり,馴染み深いと感じる方も多いと思う.凸計画問題は非線形最適化問題に分類されるが,局所的最適解が大域的最適解に一致するなどの性質上,理論・応用の両面から古くから研究されてきた最も重要な最適化問題のクラスの一つである.

凸計画問題において,制約条件が凸集合に限定されず空間全体*5であるとき,問題は次のように記述される: \begin{align} \min_{x\in\mathbb{R}^n} f(x)\tag{$\diamond$} \end{align} ここに,$f\colon\mathbb{R}^n\to\mathbb{R}$ は凸関数であり,一般に目的関数と呼ばれる.もし関数 $f$ が微分可能であるならば,後述する勾配降下法などのアルゴリズムによって最適解に収束する点列を構成することができる. 一方,目的関数が微分できない点を含む場合,関数の勾配の情報が使えないため,そのようなアルゴリズムを適用することができないことは想像に容易いだろう.例えば,機械学習などで頻出するLASSO($\ell_1$ 正則化)における正則化項や,行列の補完問題(Matrix completion problem)における核ノルム(nuclear / trace norm)は微分できない点を含むことでよく知られている.

なお,本稿は数理最適化がテーマなので,$n$ 次元ベクトルが頻出する.多くの文献ではベクトルを $\mathbf{x}$ あるいは $\boldsymbol{x}$ と表記されることが多い*6が,本稿では太字にせず $x$ と表すこととする.また,本稿を通して,$\|\cdot\|_2$ はユークリッドノルム,$\|\cdot\|_1$ は $\ell_1$ ノルムを表す*7.行列 $X\in\mathbb{R}^{m\times n}$ に対して,フロベニウスノルム $\|X\|_{F}$ および核ノルム $\|X\|_{\mathrm{tr}}$ はそれぞれ \begin{align} \|X\|_{F} := \sqrt{\sum_{i=1}^{\min \{m,n\}} \left\{ \theta_i (X) \right\}^2 },\quad \|X\|_{\mathrm{tr}} := \sum_{i=1}^{\min \{m,n\}} \theta_i (X) \end{align} で定義される.ここで,$\theta_i(X)$ は $X$ の特異値を表す*8

最後に,指示関数(indicator function)を定義しておく.閉凸集合 $\mathcal{C}$ に対して, \begin{align} 1_\mathcal{C}(x) := \left\{\begin{array}{ll} 0, &\quad \mathrm{if} \; x \in \mathcal{C}, \\ \infty, &\quad \mathrm{otherwise} \end{array}\right. \end{align} と定義される関数 $1_\mathcal{C} \colon \mathbb{R}^n \to \mathbb{R} \cup \{\infty\}$ を集合 $\mathcal{C}$ の指示関数という*9.すなわち,入力ベクトル $x$ が集合 $\mathcal{C}$ に含まれていたら $0$ を,含まれていなかったら $\infty$ を返す関数である.この指示関数を用いると,制約条件を含んだ最適化問題 $\min_{x\in\mathcal{C}} f(x)$ が次のように等価に書き換えられる*10. \begin{align} \min_{x\in\mathbb{R}^n} f(x) + 1_{\mathcal{C}}(x) \end{align}

問題設定

本稿で取り上げる最適化問題は以下のように定式化される問題である: \begin{align} \min_{x \in \mathbb{R}^n} f(x) := g(x) + h(x) \tag{$\ast$} \end{align} ここに,$g\colon\mathbb{R}^n\to\mathbb{R}$ は微分可能な凸関数,$h\colon\mathbb{R}^n\to\mathbb{R}$ は必ずしも微分可能とは限らない凸関数とする.

先に例に挙げたLASSOを例にとると,次のような対応関係になる. \begin{align} \min_{\beta\in\mathbb{R}^{n}}f(\beta) = \underbrace{\frac{1}{2} \| y - X \beta \|_2^2}_{g(\beta)} + \underbrace{\lambda \| \beta \|_1}_{h(\beta)} \end{align}

また,行列の補完問題を例にとると,次のような対応関係になる. \begin{align} \min_{B\in\mathbb{R}^{m\times n}}f(B) = \underbrace{\frac{1}{2} \sum_{(i,j)\in\Omega} \left(Y_{ij} - B_{ij}\right)^2 }_{g(B)} + \underbrace{\lambda \| B \|_{\mathrm{tr}}}_{h(B)} \end{align}

収束解析をする上では,関数 $g$ や $h$ にもう少し条件を付け加える必要があったりするのだが,今回は概説ということなので詳しく触れないこととする.

勾配降下法

問題($\diamond$)の目的関数が微分可能な凸関数である場合,次のような手続きによって,最適解に収束するような点列を生成することができる. \begin{align} x^{k+1} = x^{k} + t_k \cdot d_k, \quad k=0,1,2,\dots \end{align} ここで,$t_k$ は「ステップ幅」と呼ばれる正の実数であり,$d_k$ は降下方向を表すベクトルである.ベクトル $d_k$ として勾配ベクトル $-\nabla f(x^k)$ を採用したアルゴリズムが「最急降下法」に相当する.

少し違った見方をしてみよう.現在の点を $\overline{x}$ として,関数 $f$ の点 $\overline{x}$ の周りで Taylor 展開して得られる関数: \begin{align} f(x) \simeq f(\overline{x}) + \nabla(\overline{x})^\top (x-\overline{x}) + \frac{1}{2} (x-\overline{x})^\top \nabla^2 f(\overline{x}) (x-\overline{x}) \end{align} は点 $\overline{x}$ の周りにおける関数 $f$ の近似した関数になっている.上式においてヘッセ行列 $\nabla^2 f(\overline{x})$ を $tI_n$ とおいた式: \begin{align} \tilde{f}(x) = f(\overline{x}) + \nabla f(\overline{x})^\top (x-\overline{x}) + \frac{1}{2t} \|x-\overline{x}\|_2^2 \end{align} は $x$ に関する二次式であり,最小となる点が存在する.そこで,その最小となる点を求めて次の点として採用することを考えてみる. 具体的には,以下のように式変形をすればよい. \begin{align} x^{\star} &= \mathop{\mathrm{arg~min}}_{x} \left\{ \tilde{f}(x) \right\} \\ &= \mathop{\mathrm{arg~min}}_{x} \left\{ f(\overline{x}) + \nabla f(\overline{x})^\top (x-\overline{x}) + \frac{1}{2t} \|x-\overline{x}\|_2^2 \right\} \\ &= \mathop{\mathrm{arg~min}}_{x} \left\{ 2t \cdot \nabla f(\overline{x})^\top x + \|x \|^2_2 - 2\overline{x}^\top x \right\} \\ &= \mathop{\mathrm{arg~min}}_{x} \left\{ \|x \|^2_2 - 2 (\overline{x} - t \cdot \nabla f(\overline{x}))^\top x \right\} \\ &= \mathop{\mathrm{arg~min}}_{x} \left\{ \|x - (\overline{x} - t \cdot \nabla f(\overline{x})) \|^2_2 \right\} \end{align} 以上より,関数 $\tilde{f}$ を最小とする $x$ は以下のようになる: \begin{align} x^{\star} = \overline{x} - t \cdot \nabla f (\overline{x}) \end{align} これは勾配法において勾配ベクトル $d$ を $-\nabla f(x)$ とした最急降下法に相当する.

近接勾配法

問題($\ast$)に対する近接勾配法は以下の更新式によって点列を更新するアルゴリズムである. \begin{align} x_{k+1} &= \textrm{prox}_{t_k,h} ( x_k - t_k \nabla g(x_k) ),\\ \textrm{prox}_{t,h}(y) &= \mathop{\mathrm{arg~min}}_{x} \left\{ h(x) + \frac{1}{2t} \|x-y\|_2^2 \right\}. \end{align} 上式における $\textrm{prox}$ は近接作用素(proximal operator / mapping)と呼ばれる作用素*11である.意味合いとしては,現在地 $y$ の近くで関数を最小化する問題である.

本稿では上記の更新式がどのような経緯を辿って導出されたものなのか見ていきたい. 解くべき問題について,関数 $h$ は微分不可能な点を含むが,関数 $g$ については微分可能なので $g$ に関する勾配の情報のみを用いることを考える.先のアナロジーにより,現在の点 $x^k$ における関数 $f$ の二次式による近似を考えると,次のような手続きを考えたらよさそうである: \begin{align} x^{k+1} &= \mathop{\mathrm{arg~min}}_{x} \left\{ g(x^{k}) + \nabla g(x){^\top} (x^{k}-x) + \frac{1}{2t} \|x^{k}-x\|_2^2 + h(x) \right\} \end{align} この式を変形していくと次のようになる: \begin{align} x^{k+1} &= \mathop{\mathrm{arg~min}}_{x} \left\{ g(x^{k}) + \nabla g(x){^\top} (x-x^{k}) + \frac{1}{2t_k} \|x-x^{k}\|_2^2 + h(x) \right\} \\ &= \mathop{\mathrm{arg~min}}_{x} \left\{ \frac{1}{2t_k} \left( \| x - x^k \|_2^2 + 2t_k \nabla g (x^k)^\top x \right)+ h(x) \right\} \\ &= \mathop{\mathrm{arg~min}}_{x} \left\{ \frac{1}{2t_k} \left\| x - (x^k - t_k \nabla g (x^k)) \right\|_2^2 + h(x) \right\} \end{align} ここで,近接作用素の定義を用いると, \begin{align} x^{k+1} = \mathrm{prox}_{t_k,h} (x^k - t_k \nabla g (x^k)) \end{align} となり,所望の更新式が得られた.

近接作用素

近接勾配法の更新式において,近接作用素 $\mathrm{prox}$ を逐次計算する必要がある. この計算が重たいと効率的に解の更新を行うことができない. 本稿では応用上重要な以下の 3 つの関数に対する近接作用素が具体的にどのように構成されるのかについて見ていく.

  • $\ell_1$ ノルム
  • 核ノルム
  • 指示関数

まず,$\ell_1$ ノルムについて見ていく.関数 $h$ が $h(x) = \lambda\|x\|_1$ で与えられるとき,近接作用素は次のように表される. \begin{align} \mathrm{prox}_{t,h} (x) = \mathop{\mathrm{arg~min}}_{y\in\mathbb{R}^n} \left\{ \frac{1}{2t} \left\| x - y \right\|_2^2 + \lambda \|y\|_1 \right\} \end{align} 簡単な変形により,上記の右辺を最小にするようなベクトル $y^\star$ は解析的に求めることができ,一般にソフト閾値作用素(soft-thresholding operator)と呼ばれる以下の関数と等価となる. \begin{align} \left[ \mathrm{prox}_{t,h} (x) \right]_i = \mathrm{sgn} (x_i) \max \{ |x_i| - \lambda , 0 \} \end{align} ここに,$\mathrm{sgn}(\cdot)$ は符号関数である.

次に,核ノルムについてである.関数 $h$ が $h(X) = \|X\|_{\mathrm{tr}}$ で与えられるとき,近接作用素は次のように表される. \begin{align} \mathrm{prox}_{t,h} (X) = \mathop{\mathrm{arg~min}}_{Y\in\mathbb{R}^{m\times n}} \left\{ \frac{1}{2t} \left\| X - Y \right\|_{F}^2 + \lambda \|Y\|_{\mathrm{tr}} \right\} \end{align} 上式は行列 $X$ の特異値に対するソフト閾値作用素に帰着される.すなわち,行列 $X$ を $X = U\Theta V^\top$ と特異値分解したとき,近接作用素は \begin{align} \mathrm{prox}_{t,h} (X) = U \tilde{\Theta}_{\lambda} V^\top \end{align} で与えられる.ここで,$\tilde{\Theta}_{\lambda}$ は対角成分が $\left(\tilde{\Theta}_{\lambda} \right)_{ii} = \max \{ \theta_i (X) - \lambda , 0 \} , \; (i=1,2,\dots, \min \{m,n\} )$ で与えられる対角行列を表す.

最後に,指示関数について見ていこう.関数 $h$ が $h(x) = 1_{\mathcal{C}} (x)$ で与えられるとき,近接作用素は次のように表される. \begin{align} \mathrm{prox}_{t,h} (X) &= \mathop{\mathrm{arg~min}}_{y\in\mathcal{C}} \left\{ \frac{1}{2t} \left\| x - y \right\|_{2}^2 + 1_{\mathcal{C}}(y) \right\} \\ &= \mathop{\mathrm{arg~min}}_{y\in\mathcal{C}} \left\| x - y \right\|_{2}^2 =: P_{\mathcal{C}}(x) \end{align} 要するに,入力ベクトル $x$ とのユークリッド距離が最小となるような $\mathcal{C}$ 内の点を見つける問題に相当し,一般に凸射影と呼ばれる写像 $P_{\mathcal{C}}$ に他ならない*12

おわりに

本稿では,凸計画問題に対する近接勾配法に関する初歩的な内容について解説した.途中で断ったように,今回はアルゴリズムの収束解析について触れていない.そのため,目的関数の条件について凸性と微分可能性についてしか言及していない.様々な文献をみていくと,収束解析をするために,関数 $g$ にリプシッツ連続性や平滑性を仮定として置いている場合がある.その上で,リプシッツ定数などの情報を用いてステップ幅などを決定するアルゴリズムを構成し,収束解析がなされているようである.

Refference

本稿を記述する上で参考にした資料を以下に挙げる.より詳しい内容を知りたい場合は以下の文献を参照されたい.

更新ログ

  • (12/24 8:18)指示関数の記述を整理しました。集合論などで出てくる指示関数と最適化の文脈で出てくる指示関数を混同してしまっていました。今回の場合は、入力ベクトルが集合に含まれていたら $0$ を返し、含まれていなかったら $\infty$ を返す関数の方が正しいです。指摘していただいた @weary_samurai さん、 @paruma184 さん、@jirohhana2 さん、ありがとうございました。

*1:12月に入ってから勉強した内容になります.間違い等ございましたら Twitter:@mirucaaura まで知らせて頂けると幸いです.

*2:集合 $\mathcal{C}$ が任意の $x,y\in\mathcal{C}$ と $\lambda \in [0,1]$ に対して $\lambda x + (1-\lambda)y \in \mathcal{C}$ が成り立つとき,集合 $\mathcal{C}$ は凸集合と呼ばれる.

*3:関数 $f\colon\mathbb{R}^n\to\mathbb{R}\cup\{\infty\}$ が任意の $x,y\in\mathbb{R}^n$ と $\lambda \in [0,1]$ に対して $f(\lambda x + (1-\lambda)y) \leqq \lambda f(x) + (1-\lambda)f(y)$ を満たすとき,関数 $f$ は凸関数と呼ばれる.

*4:もちろん最大化する問題を考えても差し支えない.

*5:本稿の議論はそのままヒルベルト空間に拡張できる点が多いが,応用上分かりやすいようにユークリッド空間で考えることとする.

*6:ちなみに,$\boldsymbol{x}$ ははてなブログにおいて「\boldsymbol{x}」と記述すると出力される.

*7:過剰な配慮かもしれないが,$n$ 次元ベクトル $x = (x_1,\dots, x_n)^\top$ に対して,ユークリッドノルムは $\|x\|_2 = \sqrt{x_1^2 + \dots + x_n^2}$ で定義され,$\ell_1$ ノルムは $\|x\|_1 = |x_1| + \dots + |x_n|$ で定義される.

*8:はてなブログにおいて sigma が表示されないので代わりに $\theta$ を用いている.

*9:閉凸集合に限定するような書き方をしたが,一般の集合に対して定義される概念である.また,空でない閉凸集合に対する支持関数は閉真凸関数になることが示せる.

*10:一見すると制約条件がないような問題に見えるかも知れないが,$x$ が集合 $\mathcal{C}$ に制限されているので,制約を含んだ最適化問題である.

*11:作用素写像と思っていただいて構わない.

*12:凸射影が効率的に計算できるかは凸集合の形状に依存する.

Twitter でアンケートした不等式の問題の解説

みなさま、ご無沙汰しております。みるか(@mirucaaura)です。90 日以上更新が途絶えてしまい申し訳ありません。近況などについてはまた後日にでも...。


Twitterのアンケート機能を利用して、次のような問題を投げてみました。

今回はこの問題の解説を行いたいと思うのですが、最近流行りのMathlogに書きましたので、そちらを参照していただければと存じます。

7月に読んだ本・読んでいる本

こんにちは、みるか(@mirucaaura)です。前回前々回に引き続き、今月に読んだ本について簡単にまとめておきたいと思います。

プログラマが知るべき97のこと

プログラマが知るべき97のこと

プログラマが知るべき97のこと

  • 発売日: 2010/12/18
  • メディア: 単行本(ソフトカバー)

先月、本書の監修者である t_wada さんこと和田卓人さんのご講演を拝聴する機会があり、本書を知りました。ご講演のログについては以下の記事にまとめましたので、ぜひ目を通していただければ幸いです。

mirucacule.hatenablog.com

本書は、題目の通り、プログラマが知っておくべき事柄について、著名なプログラマによる 97 本のエッセイによって構成されています。また、日本語訳版では、Ruby開発者であるまつもとひろゆきさんや t_wada さんによる 10 本のエッセイも加わっています。

内容については本書に譲りますが、ぜひ読んでみたくなるようなエッセイタイトルを以下に列挙しておきます:

  • 関数型プログラミングを学ぶことの重要性(Edward Garson; pp4-5)
  • ハードワークは報われない(Olve Maudal; pp.72-73)
  • 車輪の再発明の効用(Jason P. Sage; pp.138-139)
  • シングルトンパターンの誘惑に負けない(Sam Saariste; pp.140-141)
  • エラーがエラーを相殺してしまう(Allan Kelly; pp.162-163)
  • 正しいアルゴリズムとデータ構造を選ぶ(Jan Christiaan "JC" van Winkel; pp.168-169)
  • WETなシステムはボトルネックが見つかりにくい(Kirk Pepperdine; pp.172-173)

一つひとつのエッセイは見開き 2 ページ程度であり、それぞれが互いに独立した内容なので、隙間時間などに少しずつ読むのに適しています。

エッセンシャル思考

再読しました。前回読んだのが2月だったので、およそ5ヶ月振りとなります。本書のキーメッセージは「より少なく、しかしより良く」という一点に集約されます。色んなことに手を出して全てを中途半端に終わらせるのではなく、自分がすべきことを徹底的に明確にして、そこで最高の結果が出すことが人生のあらゆる場面で重要となります。本書は、本当に重要なことを見極め、それを確実に実行するための方法論について、エッセンシャル思考の人と非エッセンシャル思考の人との比較を通して伝えています。以下の表は両者の《考え方行動結果》に関する比較を表したものです。

非エッセンシャル思考 エッセンシャル思考
やらなくては これをやろう
どれも大事だ 大事なことは少ない
全部こなすには? 何を捨てるべき?
差し迫ったものからやる 本当に重要なことを見定める
反射的に「やります」と言う 大事なこと以外断る
期限が迫ると根性で頑張る1 予め障害を取り除いておく
何もかも中途半端 質の高い仕事ができる
振り回されている コントロールしている
疲れきっている 毎日を楽しんでいる

本書の内容は書かれていることを理解するだけであれば極めて簡単だと思います。しかしながら、それらを日々の生活の中で実践することは一朝一夕には難しいと思います。自身の生活に取り入れたい Tips を一つ選んで実践し、無意識でも実践できるようになったら本書を見返して再び生活に取り入れて...というサイクルを繰り返していくとよいと思います。

シンプルな勉強法

シンプルな勉強法というタイトルの通り、奇を衒ったような内容については一切記載されておらず、正統的な勉強の仕方に関する本です。大学受験に関連した事例や具体例が多く、多少のくどさを感じましたが、これから大学受験を控えている高校生のみならず、大学受験を終えた大学生や社会人が読んでも得るものはあると思いました。幾つか役に立ちそうな内容をメモしておきます:

  • 勉強を通して、何らかの目標を達成したい場合、「どれくらい頑張ったか」と「どの方向に向かって頑張ったのか」の二軸が重要となる。次の逆算的な思考を行うことで、誤った方向に努力してしまうことを避ける:
    • 目標を定め、具体的なゴールを設定する
    • ゴールまでにやりたいことを決める
    • やるべきことをスケジュールに落とし込む
    • 実践する
    • 進み具合を定期的に確認する
  • 動画で何かを学ぶ際は、全体像のメリハリをつけるために、ある程度視聴したら一時停止してそれまでの内容についてメモをする。逐次、情報を頭の中で整理してアウトプットをしていくことが重要。
  • 家の中で勉強に集中ができないときは、スマホを家に置いて、自宅から少し離れたカフェや図書館で勉強をする。スマホを放置することで、勉強以外にできることをなくすことが大事。

デジタルネイチャー

2年ほど放置していましたが重い腰を上げて読んでみました。本書で唱えられている「デジタルネイチャー」というのは、人間を数理的に捉えるウィーナーの「サイバネティクス」と、あらゆるモノにコンピュータ性を付与するワイザーの「ユビキタス」という二つの概念を継承した計算機分野の思想のことだそうです(pp.87)。

AI分野の研究に携わったことがないので知らなかったのですが、今AIの分野で求められている才能は、データとデータの間の関係性に目を向けるセンスであり、必ずしも解析的な発想が求められないということです(pp.84-85)。頭で考えるよりも、データセットと(既存の)解析手法と計算機資源があれば新規性が出せる(可能性がある)という点は理論的な分野に携わっていた自分としては新鮮でした。

本書の内容は機知に富んでいる一方で、敢えて分かりにくい専門用語や衒学的表現を多用している印象を受けました。この文体こそ著者特有の文体であり、そこに楽しみを感じる読者が一定数いることも事実だと思う。しかしながら、個人的には、もっと平易な文体で読みたかったです。

解析入門Ⅰ

軽装版 解析入門〈1〉

軽装版 解析入門〈1〉

第一章:実数を中心に読みました。これまで実数は既知として扱ってきましたが、本書にもあるように、現代数学の立場から見ると高校までに学んだ実数の認識では厳密性に欠ける点があります。そこで、有理数については既知として、それに基づいて論理的に厳密な実数論を構築することが本章の目的でした。補助資料として、YouTube にアップロードされている動画を参考にしながら進めました。議論を進めるに当たって、ε-N論法を用いる場面が多々ありますが、この概念に慣れるためにはε-N論法について考え込むよりも、例題や諸定理の証明を通して慣れていけば良いというのが個人の見解です。

おまけ

余談として、今月やっていたことについて少しだけ触れておきたいと思います。

数学に関しては、前述した通り、解析学の実数論について学びました。補助資料として用いた動画は、古賀さんの動画AKITOさんの動画です。今回に限っては、より厳密な議論について学びたかったのでヨビノリさんの動画は視聴しませんでした1。勉強の進め方としては、学んだ内容を自分で再構成できるレベルを目指しています。

数学以外で時間を割いたこととして、筋トレを継続的に行いました。我流でやっても大した成果は生まれないと思ったので、コチラの動画を参考に、完走できることを目指しました。現在、何とか 3 分を超えることができるようになりましたが、完走には至っていないので、来月も継続して取り組みたいと思います。下図はログです。横軸が回数、縦軸が秒数を表しています。

f:id:mirucacule:20200729112948p:plain
筋トレ精進グラフ

他には、競プロにも時間を割きましたが、ABCのE問題以降を解けるビジョンが見えずに行き詰まっています。より具体的に言うと、AtCoder Problemsにおける緑色上位レベル〜水色下位レベル以上の問題に対する解法を自力で思い付くことができない状態です。圧倒的に演習量が足りていないことが要因の一つであることは間違いないので、典型とされる問題をストックしていく必要がありそうです。

また、4連休(7/23~7/26)で心に余裕があったので、株式や確定拠出年金、税金などといったお金まわりのことについて学びました。それに伴って、会計の知識を身に付けたくなりました。以前、簿記の勉強をしたことがあるのですが、機械的な仕訳の作業に終始してしまい、面白みを見出せませんでした。Twitter2にて、より厳密な立場で会計について学べる書籍について質問したところ、以下の書籍を紹介していただきました。書店で気に入ったものを購入したいと思います。


  1. このやり方はやってしまいがちですが、再現性のない確率的な仕事になってしまうので、気を付けたいです。

  2. ヨビノリさんの動画が厳密性に欠けるという意味ではありません。悪しからず。

  3. 当該ツイートへのリンクです。ご回答して頂いた方々、誠にありがとうございました。

6 月に読んだ本・読んでいる本

こんにちは、みるか(@mirucaaura)です。先月に引き続き、今月に読んだ本・読んでいる本を簡単にまとめておきたいと思います。前回の記事は以下になります。

mirucacule.hatenablog.com

リーダブルコード

再読しました。前回読んだときはMATLAB数値計算を我流で書いていたくらいで、本書に書かれていることは理解できるけど、実践する機会があまりないような状況でした。最近は共同で開発を行うこともあったり、今後もよりそのような機会が増えてくることが考えられるので改めて読んでおこうと思ったことが再読をしようと思った経緯です。本書を読んだからと言ってすぐに良いコードが書けるようになるわけではないことは自明ですが、書かれている内容については実践すべきことばかりなので、脳死レベルで「すべきでないコードの書き方をしない」ことを念頭に日頃からコーディングをしたいです。

SCRUM BOOTCAMP

アジャイル開発手法の一つであるスクラムについてストーリーベースで解説された書籍。スクラムのルールとしては、スクラムガイドで定義されおり、本書の内容は2017年版のスクラムガイドをもとに説明がなされています。当たり前なことですが、書かれている内容を理解することと実現場で実践することの間には大きなギャップがあります。幸いにも、現在アジャイル開発を経験することのできる機会を与えられているので、本書の内容を意識しながら学んでいきたいです。

コンピュータシステムの理論と実践

第2章途中まで。5月末に届いたのですが、全然進んでいません。内容が難しいというよりも、本書で推奨されている「ハードウェアシミュレータを用いて回路をHDL言語で実装を行いながら読み進める」という方針を採用すると非常に時間がかかってしまうことが要因であると思われます。一度ざっと通読してから実装段階に入った方がいいのかもしれません。

初めてのSQL

初めてのSQL

初めてのSQL

基本的な操作をUdemyを受講して学んだので、リファレンスできる本を手元に持っておきたいと思い購入しました。Udemyでは、paiza.ioFiddleを用いることによってローカル環境に実行環境を整えることなく操作することができて楽でした。

からだ図鑑

世界一やさしい! からだ図鑑 キャラでたのしく解剖生理!

世界一やさしい! からだ図鑑 キャラでたのしく解剖生理!

  • 発売日: 2018/02/01
  • メディア: 単行本(ソフトカバー)

Kindle本。生物未履修なので自分の体のことくらい知っておきたいと思って読みました。本書は、人間の体の中で働き続けている細胞や各器官の基本的なメカニズムを理解し、病気の予防や治療への入り口として役立ててもらうことを目的としています。タイトルに図鑑と付いている通り、イラスト豊富で極めて読みやすかったです。パラパラとページを捲るだけで楽しい一冊でした。主な内容を列挙すると、細胞・消化器系・循環器系・泌尿器系・内分泌系・生殖器系・脳神経系・感覚器系・筋骨格系・呼吸器系です。

栄養素図鑑

世界一やさしい! 栄養素図鑑

世界一やさしい! 栄養素図鑑

  • 発売日: 2016/09/15
  • メディア: 単行本

からだ図鑑の栄養素版。こちらもKindle本。筋トレをするようになって、意識的にタンパク質を摂取したり、頭の働きを活発に保つためにどの栄養素が重要でどんな食事を摂ればよいのか、などのことを知りたくて読みました。本書も図鑑よろしく、イラスト・写真・漫画などが豊富で読みやすい構成となっています。主に、三大栄養素・食物繊維・ビタミン・ミネラル・機能性成分について扱われています。

目からウロコのコーチン

チームで作業を行うことが増えてきたし、今後も増えてくることが予想されるので、一度コーチングについて学んでおくことは有益であろうと思って購入しておきました(まだ読んでいない)。コーチングはもともとkobaka7さんのツイートをきっかけに興味を持っていたのですが、具体的にコーチングを受けたり学んだりしたことはありませんでした。他人にコーチングを行うことによって、その人が目標に向かって行動を促すことがよくあるシナリオだと思うのですが、何も他人だけに使える技術ではなく、自分自身のマインドセットの構築にも大きな役割を果たす技術であると思います。

note.com

おわりに

本当は受講していた映像授業についてもまとめておきたかったのですが、このページで行うと煩雑になってしまうと思ったので、別の機会に取り上げたいと思います。