冷めたコーヒー

Weniger, aber besser

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

おわりに

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

t_wada さんの講演メモ ー 技術書の読み方を中心に

はじめに

和田さん(@t_wada)の講演が素晴らしく良かったのでメモを残しておきたいと思います。和田さんと言えば...

f:id:mirucacule:20200623200436j:plain
t_wada

ですね!本講演では、「技術の学び方を学ぶ」ことを目的として二部構成で論が展開されました。「技術の学び方の学び」とは、メタレベルの学びのことを指しています。すなわち、効率的に新しい技術を学ぶためにはどのように学べば良いのかという話です。内容は以下の通りです。

  • 第一部

    • 四半期ごとに技術書を読む
    • 手を動かしながら学ぶ
    • 毎年少なくとも一つの言語を学ぶ
    • 身の回りをプログラミング対象にする
    • アウトプットを行う
  • 第二部

    • 毎日コードを書く
    • 年下から学ぶ
    • 過去から未来を見る
    • 人のつくる渦を見る
    • 大事なことに集中する

いずれも非常に興味深い内容だったのですが、細かい事項については2017年の講演メモのエントリーがありましたので、ぜひそちらをご覧いただければと思います。(記事へのリンク

本エントリーでは、以下の2点について深く取り上げたいと思います。

  • 技術書の読み方
  • アウトプットの仕方

本を読む目的

技術書を読む目的は主に2つ:

  • 自分の脳内にインデックスを作る
  • 書かれている内容について習熟する

「自分の脳内にインデックスを作る」というのは「この本にはこんなことが書いてあったな」というインデックスを脳内に作り、書かれている内容については忘れてしまう(覚えているに越したことはないのですが、人間そんなにうまくできていない)ということです。書かれている内容について習熟することは一般的な本を読む目的として知られていることと思います。

脳内にインデックスを作ることの効用は書くまでもないかもしれませんが、これを作っておくことで、その技術が必要になったときに即座にアクセスできることはもちろん、どの技術を用いてどんなことができるのかを知ることができる点にあります。車輪の再発明を避けることができますね。

本の読み方

先にも述べた通り、本を読む目的は2つありました。インデックスを作ることが目的であれば、短時間でサラッと読めばいいのですが、深く読み込むためにはそれなりに工夫が必要です。本講演で和田さんは「写経」することを勧めていました。写経の手順は以下のツイートの通りです。

いいですね。もちろん、すべての本に対してこの方法をとっていては時間が幾らあっても足りませんので、身に付けたい技術を絞り、本も定番とされているものを一冊決めてじっくり読み込むことを推奨していました。

アウトプットの仕方

インプット型の学びは極めて楽です。しかしながら、受け身で学んだ内容が身に付きにくいことは周知の通りです(Ref:デールの円錐)。新しい技術を学んだのであれば、その技術を全くの初心者に対して理解させることを目指すべきだし、新しいプログラミング言語を学んだのであれば、その言語を用いてまっさらな状態から何かしら自分の困っていることを解決するためのツールを作ることを目指すべきです1

したがって、何らかの方法でアウトプットを行うことが肝要なわけです。手法は様々だと思いますが、既存のサービスを使うのがいいと思いますし、@t_wadaさんも以下のようなサービスをアウトプットのチャネルとしてお勧めされていました。

  • Twitter
  • Qiita
  • GitHub
  • 雑誌記事(Web,紙媒体、電子書籍
  • 書籍(共著、翻訳、監訳、単著)
  • 講演(社内勉強会、社外講演)

ここでの注意点として、文書でアウトプットを行う場合はflow型であるTwitterなどのチャネルよりも、stock型のblogQiitaに投稿した方が良いということです。最大瞬間風速が重要となるflow型のサービス(e.g.,Twitter)は一時的にバズりやすく快感を伴います(?)が、後からその内容を検索することが困難です2。もちろん、まずはTwitterでラフに考えていることを記述しておいて、その後にhatenablogなどでしっかり記述するというやり方はアリだと思います(わたしはよくやります)。

また、初心者には敷居が高いという件に関してですが、もちろん誤った情報を公開してしまうことはなるべき避けたいわけですが、初心者は初心者ならではの価値を提供できます。どういうことかと言うと、初心者は経験者が気付けないようなハマりポイントを取り上げることができます。経験年数が上がれば上がるほど、初心者がどんなことに躓くのかが分からなくなってしまうということは少なくないかと思います。なので、詳細かつ省略をせずに行ったことを記載することから始めていけば良いという意見でした。

最後に、勇気付けられる引用を。

情報発信、blog,発表、公開などは数学の未解決問題の証明ではなく、料理のようなもの

Jenkins 開発者である川口耕介さんの言葉だそうです。私たちが公開しようとしているものは、学術論文ではありません。新規性がなくてもいいのです。査読もありません。気楽にいきましょう。再現性は担保しましょう。

おわりに

(わたしのTwitterをフォローしていただいている方には分かるかと思いますが)学ぶべき事項が多すぎるあまり、気の焦りから様々なことに手を出して全てが中途半端になってしまっているような状況がここ最近ずっと続いていました。何から手を付けたらよいのか、何に焦点を当てればよいのか、何に集中すべきなのか、そういったことが脳内をグルグルし続け、精神が疲弊していました。このことを最後のQ&Aで質問したところ、次のような回答を得られました。

最初の数年のうちは、私はこれでいいと思っています。色んなことに手を出して中途半端になるということは、その内容が自分にとってそこまで気を引かれるものではないからかもしれません。だから、発散フェーズにいるうちは、色んなことに手を出して良いと思っています。今のうちにリッチなWebデザインや機械学習に手を出してみたり、Androidのアプリを作ってみたり、新しい言語に触ってみたり、色んなことに手を伸ばすことは若いうちはいいことだと思います。(対象を絞るのは、)気を引かれる技術があれば、今年はこれをやろうと決めて取り組んでもいいし、Thought WorksTechnology Radarを見たりして、今は興味はないけど、これから流行るであろう言語をやるでもいいと思います。やっていくうちに段々と好きになり習熟度が上がることはよくあることだと思います。


色んなことに手を出して全てが中途半端になることは悪いことではないと思っています。手を出してみたことを例えばブログなどに記録していけばそれも大きな価値を伴います。途中までやったことを数年後に再開することもザラにあります。色んなものを摘み食いしていくうちに、面白いと感じるものや自分が手を動かしているうちに「なるほど、これは面白いな」と思えるような技術が幾つか出てくると思うので、それらを専門性として育てていけば十分だと思います。


また、色々と削減していかなければならないフェーズは、もっとベテランになってきたりライフステージが変わってきたりしたときで、そうなるまでに色んなものを食べておけば、様々な道具が自分の道具箱に入っていると思うのでより生き残りやすくなると思います。

このタイミングで@t_wadaさんの話を伺うことができて本当によかったです。


  1. べき論で言えばそれはそうなのですが、これはなかなかできないですよね…。

  2. 最近になって「from:@userid keyword」のような検索の仕方がユーザによってできなくなっていて困っています…。何かご存知の方がいらっしゃいましたら教えてください。

yukicoder No.1077「Noelちゃんと星々4」in Python

問題

点が $N$ 個あたえられます.点 $i$ の高さは $Y_i$ です.Noel ちゃんは点の高さを自由に動かせます.ある日Noelちゃんは,点の高さが広義単調増加になるように点を動かしたくなりました.Noel ちゃんが動かす必要のある距離の総和の最小値を求めてください.ただし Noel ちゃんは,どの点も整数の距離だけしか高さを変えられないものとします.

要するに,与えられた数列を広義単調増加にしてください,という問題.

制約

  • $1 \leqq N \leqq 10^{3}$
  • $0 \leqq Y_i \leqq 10^{4}$

解法

dpで解く.配列は,$(N + 1) \times (\max\{Y\} + 1)$ の二次元配列として持つ.また,dp 配列の第 $(i, j)$ 要素は次のように定義される.

dp[i][j]:数列 $Y_0,Y_1,\dots,Y_{i-1}$ が広義単調増加となるように点の移動が完了しているとき,$Y_i$ を $j$ にしたときに必要なコストの最小値

※ ある数列 $\{A_i\}$ が広義単調増加であるとき,第 $i$ 番目の要素を $x$ としたとき,それ以前の要素($A_0, A_1, \dots, A_{i-1}$)はすべて $x$ 以下である.

したがって,遷移の仕方は次のように表せる.

$$ \mathrm{dp}[i][j] = \min_{0 \leqq k \leqq j} \{ \mathrm{dp}[i-1][k] \} + | Y_i - j | $$

添字に注意して実装してあげると,以下のようになる.

n = int(input())
Y = list(map(int, input().split())) # 0-index
mx = max(Y)
INF = 10 ** 18
dp = [[INF] * (mx + 1) for _ in range(n)]
# i = 0 のときを埋める
for j in range(mx + 1):
    dp[0][j] = abs(Y[0] - j)
# i >= 1 の場合を埋める
for i in range(1, n):
    mn = 10 ** 18
    for j in range(mx + 1):
        mn = min(mn, dp[i - 1][j])
        dp[i][j] = mn + abs(Y[i] - j)

print(min(dp[-1]))

入力

6
1 2 0 8 6 9

結果(実行後のdp配列)

for v in dp: print(v)
# 以下ターミナル上での出力
[1, 0, 1, 2, 3, 4, 5, 6, 7, 8]
[3, 1, 0, 1, 2, 3, 4, 5, 6, 7]
[3, 2, 2, 3, 4, 5, 6, 7, 8, 9]
[11, 9, 8, 7, 6, 5, 4, 3, 2, 3]
[17, 14, 12, 10, 8, 6, 4, 4, 4, 5]
[26, 22, 19, 16, 13, 10, 7, 6, 5, 4]

VSCode で LaTeX をビルドする際のメモ(TeXLive 2020)

バージョン

  • macOS Catalina バージョン 10.15.3
  • Homebrew 2.3.0
  • pdfTeX 3.14159265-2.6-1.40.21 (TeX Live 2020)

Homebrewのインストール

macOSのターミナルに下記のコードを貼り付けて実行します(Ref: brew.sh)。

$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

インストールが終わったら、以下のコマンドを実行し、versionが表示されるか確認をしておきます。

$ brew --version

LaTeXのインストール

以下のコマンドを実行し、Homebrewを介してLaTeXのインストールを行います。このとき、お手元の回線の状況にもよりますが、30分程度の時間がかかります。

$ brew cask install mactex-no-gui

この時点でtexファイルをpdfにすることができます。例えば次のようなファイルをmain.texとして保存します。

\documentclass[a4j,uplatex]{jsarticle}
\begin{document}
\title{{\LaTeX} build on VSCode}
\author{\texttt{miruca}}
\date{\today}
\maketitle
\section{概要}
これは \LaTeX が Visual Studio Code でビルドできるかどうかのテスト文章です.
\end{document}

作成したmain.texがあるディレクトリにおいて、次のコマンドを実行します。

uplatex main.tex

これによって、texファイルからdviファイルが生成されます。次にdviファイルからpdfを生成するために次のコマンドを実行します。

dvipdfmx main.dvi

すると次のような文字列がターミナルに表示されてpdfファイルが生成されていることが確認できると思います。

main.dvi -> main.pdf
[1]
25701 bytes written

なお、tex dvi pdfファイル以外にも、aux log flsファイルなどが生成されて同じディレクトリ内に生成されていると思いますが、正常に動作しているので問題ありません。

latexmkの作成

上記のように、毎回dviファイルを生成してpdfファイルを生成するのは面倒なので、latexmkコマンドで一括でコンパイルすることを考えます。以下のコマンドを実行して、latexmkrcというファイルをvimで開きます(もちろん、エディタは何でもよいです)。

$ vim ~/.latexmkrc

このとき、ファイルが存在しなければ新規に作成されます。そして、ファイルに以下のコードを書き込んで保存します。

#!/usr/bin/env perl
$pdf_mode=3;
$latex='uplatex -halt-on-error';
$latex_silent='uplatex -halt-on-error -interaction=batchmode';
$bibtex='upbibtex';
$dvipdf='dvipdfmx %O -o %D %S';
$makeindex='mendex %O -o %D %S';

vimの場合、上記のコードを⌘ + Cで保存し、iでインサートモードに入り、⌘ + Vでペーストし、escノーマルモードに入り、:wqで保存して終了します。

ファイルの作成ができたら、latexmkrcの記述をsourceコマンドで反映します。

source ~/.latexmkrc

VSCodeの設定

VSCodeをインストールしていない場合、次のコマンドでインストールします。

$ brew cask install visual-studio-code

LaTeXを編集する上で便利な拡張機能をインストールします。下記のコマンドをターミナルに打ち込んで実行してもいいし、VSCodeからインストールをしてもいいです。

$ code --install-extension James-Yu.latex-workshop

jsonファイルの設定をします。VSCode上で、⌘ + Shipt + Pを入力すると検索窓が出てくるので、「基本設定:設定(JSON)を開く」もしくは「Preferences:Open Stting (JSON)」を選びます。すると、setting.jsonというファイルが開かれるので、下記のコードを追記します。

{
    // ここまで既存のコード(あれば)

    // LaTeX Setup(以下を追記)
    "latex-workshop.latex.recipes": [
        {  
            "name": "latexmk",  
            "tools": [  
              "latexmk"  
            ]  
        },
    ],
    "latex-workshop.latex.tools": [
        {
            "name": "latexmk",
            "command": "latexmk",
            "args": [
                "-interaction=nonstopmode",
            ]
        },
    ],
    "latex-workshop.latex.clean.fileTypes": [
        "*.aux", "*.bbl", "*.blg", "*.idx", "*.ind", "*.lof", "*.lot", "*.out", "*.toc", "*.acn", "*.acr", "*.alg", "*.glg", "*.glo", "*.gls", "*.ist", "*.fls", "*.log", "*.fdb_latexmk", "*.synctex.gz",
        "_minted*", "*.nav", "*.snm", "*.vrb",
        "*.run.xml","*.dvi","*.bcf"
    ],
    "latex-workshop.view.pdf.viewer": "tab",
    "latex-workshop.latex.autoClean.run": "onFailed",
    "latex-workshop.message.update.show": false,
}

編集例

VSCodetexファイルを編集し、⌘ + Sで保存する、もしくは、⌘ + ⌥ + bでビルドが実行されます。以下は表示例です。

参考

Contact

  • Twitter に連絡していただければ素早く対応できるかと存じます
  • DM も解放しておりますが、通知の関係上、確認が遅れることがあります
  • 匿名でご質問されたい方はマシュマロにどうぞ

※ 数学のご質問はお答えできかねますのでご了承ください