N=1

主にコンピュータ技術関連のことを投稿。 / 投稿は個人の意見であり所属団体の立場を代表するものではありません。

2022年1月の振り返り

月末は自分の進歩を書こうと思っていたのに、前回書いたのは半年前、昨年6月になってしまった。まぁいいだろう。やらないよりはやったほうがましだ。

記録の方法を改善した

以前はピアノ、読書、瞑想など活動ごとに Notion でノートを作っていた。これはなかなか負荷が高く、健康度が高くないと続けられなかった。記録が無ければ進歩も残らない。紆余曲折あったが今はこのような方法で2週間以上継続できている。

Kanban 形式での人生全般の課題整理。習得した習慣もこれで記録

ゲームの実績システムを自分に対して適用したリスト。これのおかげでこの記事がかけているようなものだ。

習慣の連続記録

自動運転最小という記録は、マインドフルネスの逆の、意識が働いていない自動操縦状態をストップウォッチで測っており、これを最小化したくメモしている。

これらは Notion の1ページ分にまとめている。Kanban、DB、テーブルをダッシュボード的に一覧にできるのはとても便利。Notion は仕事以外でも使い出がある。

日記は紙で書くことにした。パソコンで書いても、なかなか言葉が出てこず、Twitter 未満の簡素な記録になってしまう。紙はなぜか感情や関連するアイディアまで絞り出せる。

読了した本

この本。

そもそもなぜ世界史をやっているかというのはこのスレッドに書いた通り、服を買うにも、音楽を聴くにも、先行した人類の営みを吸収する行為であり、その時系列の経緯を知る恩恵が大きすぎるからだ。

https://twitter.com/ishikuro_s/status/1476742130349805570

目的はたくさんあるが、筆頭になるのは作曲や演奏技術の向上のためだ。現代のポップスを作ろうと思ったら、ジャズ、R&B の技法がルーツになる。そうなると、連鎖的にジャズの下地になるクラシックも知らなければならない。ではクラシックとは何かといえば、中世までさかのぼることになる。

そう書くと大げさに見えるが、実は歴史は勉強のコスパがよすぎる。音楽というジャンルだけで言っても人の動き、音楽の位置づけなど歴史から関連付けて鑑賞したり理解する価値はとてつもなく大きい。それだけでなく、絵画、インテリア、服飾、科学技術などにも同じような応用が利く。しかし、それを知るコストは限りなく低い。ピアノを演奏するには数年の練習が必要だが、歴史は1か月でも読むだけで大筋を把握できる。

歴史の学習本の選択は紆余曲折あり、取っ掛かりとしてはこの本が良かった。

冒頭の水色の本は最初は合わなかった。

しかし、長大な「「なぜ?」がわかる世界史」を読んでいるうちに「歴史を読むための脳の機能」のようなものが形成されたようで、合わなかったと思っていた簡素な本も読めるようになっていた。同時代の別地域の進行を思い出す、人物ごとの活動を追う、文化はどうだったのか紐づける、のような処理を瞬時にこなしているらしい。最初はそれができなかったので、「「なぜ?」がわかる世界史」のようになるべく情報量が多い本が必要だったようだ。

古代から現代まで一望できたので、次に着手したいのはアメリカ史、アメリ音楽史、ジャズ史だ。ただし、少し歴史疲れもあるので別のジャンルを経由してリフレッシュしておきたい。

ピアノの進捗

気づいたらバイエルの上巻を終えていた。上巻を終えると、一気に世界が拓ける。(FF7で例えるならミッドガルを抜けたあたりかな...)

まず、譜読みがある程度できてくる。左右の独立も少しだけできるようになってくるし、メトロノームを聞かなければという意識もちょっとだけある。楽典的な、クラシック独特の和声の響きも体感している。

これによって独習でも開ける教本が増えた。新規にこれらを購入して着手している。

これならひとりでマスターできる! 大人のための独習バイエル [下巻]

これならひとりでマスターできる! 大人のための独習バイエル [下巻]

  • 作者:
  • ヤマハミュージックエンタテイメントホールディングス
Amazon

スケール、カデンツはコード進行や転調があるジャズ、ポップスでは必須になると考えて開始した。ハノンは純粋な運指の訓練である。譜読み、相対音感獲得、左右の独立などは引き続きバイエルを使用する。

1月中だけでも以下の習得ができた。

  • C, D, E, F, G, A メジャースケールを1オクターブ+各スケール上のカデンツ
  • ハノン1~3をスムーズに

音楽的素養の訓練としてここ2か月続けけているのがリズム練習だ。

いまのところ、4拍子+裏拍、3拍子、スウィング、16ビート(表拍のみ)は手拍子できるようになった。これはかなりわかりやすい進歩だ。

楽典の勉強もネットと Kindle Unlimited にある数冊の本で進めている。暗記しつつ、スケールを指で覚えつつ。目的は相対音感の獲得。遠回りかもしれないけれど、意味はあるだろう。

1月の感想

「もうn月終わる、はやい」「もうn歳か!」みたいなことを言いたくない。だったらその月にやれることやってしまえばいい、とは思いつつもたいていは体調不良だなんだと言って普通は何もできない日々が続く。しかし、この一年は人生を変えようといろんな模索をしたのが良かったのか、いまごろになってやれることをやりきった月末を迎えることができた気がする。

読書メモ: 西洋音楽史 (4/4) 後期ロマン派~現代

ishikuro.hateblo.jp

open.spotify.com

所感、全部読んだ感想(WIP)

続きを読む

読書メモ: 西洋音楽史 (3/4) ロマン派

ishikuro.hateblo.jp

open.spotify.com

所感

今回はロマン派である。通俗的な音楽と、音楽そのものを探求する音楽とで分離があった時期らしい。私がどうやっても面白味を感じられないのはこの通俗的な方面のようだ。古典派で王をたたえる音楽が終わったかと思えば今度は成金のステータスのための音楽が始まってしまった。お高くとまった雰囲気がどうしても自分のモードではない。

ピアノ教室で習うような教本はこのサロン音楽の時代のものだ。私個人としては教本で弾きたいと思える教材が無いこと、ピアノ教室が育ちのよさをなんとなく醸すお稽古として君臨していることは、この当時の習慣がそのまま継承されているからだろう。

そしてやはり古典派ベートーヴェンに続きドイツの芸術音楽やワーグナーのオペラはまだわかりやすい情熱、力強さがあり面白味が感じられる。

サロン音楽のように、音のみで判断しても自分に合わないものは歴史を知ってなおさら自分に馴染まないのが分かったので、直感はなかなか信用できると思った。一方で、民衆の音楽であったり哲学であったりと、自分の体験に近い音楽は音だけ聞いても心を打つものがあったり、もう少し傾聴してみたいと思えるものであった。

しかしながら、ロマン派を経てもクラシックへの取っ掛かりになりそうなお気に入りの曲を見つけられなかったのが残念だ。

続きを読む

読書メモ: 西洋音楽史(2/4) バロック~古典派

前回の続き。

ishikuro.hateblo.jp

よく知られているであろう言葉には文中で特に説明が無かったので自分で調べなければならなかった。

前回書き忘れたがこれは読書メモであり読み物ではない。参考文献への URL 集といったところだ。

open.spotify.com

所感

バロック堅苦しい宗教曲、貴族のための娯楽であるオペラ、器楽曲というように二つのキャラクターが分かりやすくなった。ただ、どちらも取っつきにくい。これらは教会か宮廷でなければ聞くことができないのだ。市民が親しめるような音楽は次の古典派でチラ見せで、ロマン派までは本格的には登場しないからだ。どうしても権威的な雰囲気が強いから感情移入の隙は無い。

古典派のベートーヴェンがかなりエモーショナルで自分にとっては分かりやすかったのも頷ける。労働者のチャントとしてよく響く感じがする。

ちなみにドンジョバンニは気まぐれでオペラを見に行ったことがある。見た目としてもノリとしてもとても分かりやすく現場では楽しんでいた。しかしモーツァルトは全般的に、ヘッドホンで聞くと古臭い、ダサい感じがしてしまう。やはりオペラは体験する娯楽であって腰を据えて聞くものではないのかもしれない。

私がクラシックを好きになるにはもう一押しが必要だ。

続きを読む

読書メモ: 西洋音楽史 (1/4) グレゴリオ聖歌~ルネサンス

西洋音楽史という本がとても面白かったのだが、まったく音楽に詳しくないので、記載されている作曲家の音楽のプレイリストを作りつつ、用語をまとめながら読んでいる。手元のメモを転記してみる。

まずはグレゴリオ聖歌からルネサンス後期まで。本に記載されたものやそれに近い楽曲を Spotify プレイリストで作った。

open.spotify.com

各用語は検索しやすいように英語圏でのスペルを併記した。

先に所感

正直、聞く音楽としてのクラシックは全然興味が持てない。本を1/3まで読んで"興味が持てない"の解像度が高くなった。バロック以降の貴族、王族の娯楽という傾向が高まったところで非常に退屈に感じられる。よく聞くので既視感で飽きているというのもある。

一方で、このページでまとめているような、いわゆる"クラシック"以前の古楽はとても面白い。着目すべきところがミニマルだし、神へ捧げる儀式、仏教のお経のような効果が目的だから異様な雰囲気がある。アメリカ音楽以降のポップスはカウンターカルチャーの殴り合いになっていくわけだが、自分にとってはこの怪しげな宗教観、怖さが西洋音楽史の中で"お行儀のよいクラシック"へのカウンターになっている(時系列的には巻き戻るが)。それほど新鮮に感じられた。

続きを読む

同じ問題を何度も解く人のための atcoder-cli 補助コマンド

atcoder-cli https://github.com/Tatamo/atcoder-cli の補助コマンドを作って使っているので一応共有します。atcoder-cli は便利です。作者様ありがとうございます。

私は同じ問題を忘却曲線に従って複数回解いたり、手法を変えて複数回解いたりするため、1つの task ディレクトリに対して複数の main.cpp を持ちたいです。main.<リビジョン名>.cpp のようにして管理することにしました。

cpmain

https://github.com/ishikuro-shunsuke/atcoder/blob/main/cpmain

task のディレクトリで cpmain 2 などとすると、main.2.cpp としてテンプレートをコピーしてきます。引数は、ファイル名に使える文字列ならばどんなものでも可能です。cpmain dpmain.dp.cpp とするなど手法に応じて名付けたりするのも便利です。

#!/bin/bash
if [ $# -ne 1 ]; then
  echo "usage: cpmain <revision-name>" 1>&2
  exit 1
fi

cp `acc config-dir`/cpp/main.cpp main.${1}.cpp
echo -e "\n// STARTED: $(date '+%Y/%m/%d %H:%M:%S')" >> $_

最後に exec code main.${1}.cpp など追加してやると自動でエディタも開いてくれるのでいいのではないかと思います。

cts

task のディレクトリで、 cts 2 とするとcpmain の規則の名前の main.2.cpp の Compile, Test, Submit を自動的にやってくれます。cpmain と対になって使うものなので、もちろんこちらも 2 以外にも dp など自由な文字列を使用できます。

https://github.com/ishikuro-shunsuke/atcoder/blob/main/cts

#!/bin/bash
if [ $# -ne 1 ]; then
  echo "usage: cts <revision-name>" 1>&2
  exit 1
fi

g++ main.${1}.cpp &&
  oj t -d tests &&
  echo -e "// PASSED : $(date '+%Y/%m/%d %H:%M:%S')" >> main.${1}.cpp  &&
  acc s main.${1}.cpp

それぞれ問題を開始した時間、ローカルのテストをパスした時間を追記するようにしてあります。

コンテストは全然出ていなくて、これから頑張ります。おわり。

プログラミングの勉強を始めた

コンピュータエンジニアとしての幅を広げるためにプログラミングを勉強することにした。コンピュータサイエンス修士まで取ったし新卒最初のキャリアがサポートエンジニアという過酷な走り出しだったので、そこそこシステムを俯瞰した考え方はできているのかもしれないが、コードが書けないので受けられる案件がかなりニッチになってしまう。それで、猫も杓子もやっているという競技プログラミングプログラマにとっての知の高速道路(ただしその先が大渋滞)になっているらしいので私も渋滞するまでやってみようと思った。

私と競技プログラミングについて前置きしておく。大学生のころ、ICPC、AOJなどはあったけれど問題が堅くてあまり積極的に続ける気持ちにならなかった。複雑なアルゴリズムはほとんど定着しておらず、低レイヤー族なのでデータ構造だけは結構覚えている程度。唯一出ていた教材(蟻本)も最初からいきなり難しくてほとんど読まずにほこりをかぶっていた。そして、当時は ICPC に行ける天井人でなければ自分がどれくらいできるのかよくわからなかったから、参入障壁が高かったのだ(当然だが、そんな私たちでも勉強できる AOJ をメンテして指導してくださっていた渡部先生には感謝しかない)。コードを書かない今となってはほとんど、"はじめてのプログラミング"くらいの感じになってしまったのである。

当時と比べて今は教本も豊富で、AtCoder のおかげで日本の常識的な時間帯にコンテストに参加できる上に、実力も細かく刻まれていてモチベーションも保ちやすくなっていた。なにより、AtCoder の問題はなぜだか緩くて熱中できる。

勉強方法の調査

AtCoder は参加者全体のコンテスト結果の相対的な実力でレーティングがされており、レーティング帯で色分けがある。

chokudai.hatenablog.com

400ごとに色がついていて、赤・橙・黄・青・水・緑・茶・灰・黒、という順番になってます

とりあえず水色くらいまで行けばいろいろと安心らしい。それでも平均的に半年以上はかかるようだ。勉強時間的に、TOEIC 900 程度になるのと同じくらいの険しさかなぁと思う。

qiita.com

水色なるとみんな体験談を書きたくなるらしく、ネットには先人の記録が無数にある。

  • 毎週、AtCoder Beginners Contest(ABC) に参加するといいらしい
  • ABCDE と難易度順で問題があるのでD, E くらいまで粘れるようになると 緑、水色に差し掛かるらしい
  • 過去問を埋めるにしても A B C D と順にやっていき最初に解けなかった難易度を理解するというのを繰り返すといいらしい

なるほど、なるほど。

C++ 全く知らないレベルだったので先にこれをざっと読んだ。分量が多いのに対して例題は簡単すぎるので深追いはしなくてよい。

atcoder.jp

それから、この初級問題集をすべてやった。これで ABC の C までの感覚がわかる。

atcoder.jp

私はだいたいABCの過去問の C~D で完全に分からない問題が出てくる。これがアルゴリズムの理解の壁なので、教本で主要なものを拾うと良さそうだ。

大人なので主要な本をすべて買ってしまった。

ざっくり読んだところ、新しいだけあって AtCoder に特化して最短で勉強できそうなのが3冊目だった。基本はそれで進めて、わからなくなったらアルゴリズムイントロダクションと並んでこれらを横断的にやるのが効率が良さそう。

環境構築

ここが実は本題。

AtCoder を解くに当たって非常に有用なユーティリティがあったので利用させてもらう。CLI で問題のURLの確認、ディレクトリとファイルの整理、テンプレート使用、テスト、送信などができる。

github.com

github.com


インストール

$ npm install -g atcoder-cli
$ pip3 install online-judge-tools

C++ 用の環境設定

$ mkdir -p `acc config-dir`/cpp
$ confd=$_
$ cat  > $confd/template.json <<EOF
{
  "task":{
    "program": ["main.cpp"],
    "submit": "main.cpp"
  }
}
EOF
$ cat  > $confd/main.cpp <<EOF
#include<bits/stdc++.h>
using namespace std;
int main() {

}
EOF
$ acc config default-template cpp
$ mkdir -p ~/.local/include/bits
$ cat > $_/stdc++.h << EOF
#include <iostream> // cout, endl, cin
#include <string> // string, to_string, stoi
#include <vector> // vector
#include <algorithm> // min, max, swap, sort, reverse, lower_bound, upper_bound
#include <utility> // pair, make_pair
#include <tuple> // tuple, make_tuple
#include <cstdint> // int64_t, int*_t
#include <cstdio> // printf
#include <map> // map
#include <queue> // queue, priority_queue
#include <set> // set
#include <stack> // stack
#include <deque> // deque
#include <unordered_map> // unordered_map
#include <unordered_set> // unordered_set
#include <bitset> // bitset
#include <cctype> // isupper, islower, isdigit, toupper, tolower
EOF
$ echo 'export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:~/.local/include/' >> ~/.bashrc


ログイン

$ acc login
$ oj login https://atcoder.jp

新しいコンテストへの参加

$ acc new <contest name (e.g. abs)>

ローカルでのテストをパスしたら提出

# タスクのディレクトリで
$ g++ main.cpp && oj t -d tests && acc s

次の問題の準備

# コンテストのディレクトリで
$ acc add

初めてのコンテスト

というわけで先ほど初めてのコンテストに参加してみた。目標の3問(A, B, C 問題)完了が達成できたのでよかった。ここまではアルゴリズム自体の勉強をしなくても落ち着いて考えれば解ける。

少し残念だったのが D 問題。これは動的計画法かメモ化再帰という技が使えれば解ける。私は直前までそれらを勉強していたのに、時間が足りなくなってしまったのと、アウトプットできるレベルまで定着してなかったので解けなかった。理解することと使えることは違うのだ。これは英語の勉強と似ている。

atcoder.jp

解説がすぐ上がってくるのは良い。(この解説の雰囲気、懐かしい...)

www.youtube.com

勉強は github で管理することにした。

github.com

コンテストとか勉強した分野ごとにコミットすると自分でも振り返りやすい。

github.com



無色からついに灰色(1回参加)になった...!

f:id:ishn:20210516001537p:plain

f:id:ishn:20210516001617p:plain

一年以内には水色になれるよう頑張ろうと思う。