それでは毛玉諸君、これにて失敬

見習いデータサイエンティストが日々の精進を備忘録的に綴ります。

tmuxを入れてみた

PCを買いたてでテンションが高いので、便利そうなものを色々試しています。
今回は↓の資料で紹介されているtmuxを導入してみました。
vim、fishもこれを見てから使い始めたのでめちゃくちゃ影響うけてます。

speakerdeck.com

開発環境

NAME="Ubuntu"
VERSION="20.04.2 LTS (Focal Fossa)"

導入

これを参考にしながら進めました。

qiita.com

sudo apt install tmux

config

こんな感じにしました。
prefixは押しやすさからCtrl + qにしてます。
デフォルトだと画面を分割したときにアクティブなペインが分かりにくいので、
最後の2行で非アクティブのペインを白っぽく表示するように設定しました。

vim ~/.tmux.conf
# tmuxを256色表示できるようにする
set-option -g default-terminal screen-256color
set -g terminal-overrides 'xterm:colors=256'

# prefixキーをC-qに変更
set -g prefix C-q

# C-bのキーバインドを解除
unbind C-b

# ステータスバーをトップに配置する
set-option -g status-position top

# 左右のステータスバーの長さを決定する 
set-option -g status-left-length 90
set-option -g status-right-length 90

# #P => ペイン番号
# 最左に表示
set-option -g status-left '#H:[#P]'

# Wi-Fi、バッテリー残量、現在時刻
# 最右に表示
set-option -g status-right '#(wifi) #(battery --tmux) [%Y-%m-%d(%a) %H:%M]'

# ステータスバーを1秒毎に描画し直す
set-option -g status-interval 1

# センタライズ(主にウィンドウ番号など)
set-option -g status-justify centre

# ステータスバーの色を設定する
set-option -g status-bg "colour238"

# status line の文字色を指定する。
set-option -g status-fg "colour255"

# vimのキーバインドでペインを移動する
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# vimのキーバインドでペインをリサイズする
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5

# | でペインを縦分割する
bind | split-window -h

# - でペインを縦分割する
bind - split-window -v

# 番号基準値を変更
set-option -g base-index 1

# マウス操作を有効にする
set-option -g mouse on
bind -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -e'"

# コピーモードを設定する
# コピーモードでvimキーバインドを使う
setw -g mode-keys vi

# 'v' で選択を始める
bind -T copy-mode-vi v send -X begin-selection

# 'V' で行選択
bind -T copy-mode-vi V send -X select-line

# 'C-v' で矩形選択
bind -T copy-mode-vi C-v send -X rectangle-toggle

# 'y' でヤンク
bind -T copy-mode-vi y send -X copy-selection

# 'Y' で行ヤンク
bind -T copy-mode-vi Y send -X copy-line

# 'C-p'でペースト
bind-key C-p paste-buffer

# アクティブなペインのみ白っぽく変更(真っ黒は232)
set -g window-style 'bg=colour239'
set -g window-active-style 'bg=colour234'

設定後に

tmux source ~/.tmux.conf

を実行するとすぐに反映されます。

動かす

新たなセッションを作成して動かしてみます。
ショートカットキーは、

prefix(Ctrl + q)を押したあとに入力

で実行されます。記事にも書いていますが見落としてしまい、地味に苦戦しました。

感想

ターミナルウィンドウの管理がしやすくなり、非常に快適です。
分割したターミナルの行き来も簡単に出来るので、並行してコードを修正するときなんかは重宝しそう。
これから使い倒していきます。

PCセットアップメモ

自分用。参考リンクをペタペタ貼っていきます。
時々ポエムもあるのでご注意ください。

買ったもの

これ

jp.ext.hp.com

本格的にkaggleに取り組むために購入しました。
それまではgoogle colabやkaggle notebookでなんとかお金をかけずに試行錯誤していましたが、
作業効率が悪くモチベーションを保つのが難しい状況でした。
クラウド利用も考慮しましたが全くの無知なので手を出せずにいました。
そんなタイミングで普段使いのノートPCが故障したので、2月末に大枚叩いて購入しました。
その後すぐにgoogle colab proが上陸するとも知らずに…

osはwindowsが入っていましたが、すぐにubuntuに書き換えました。
WSLは設定がややこしいのと、なるべく環境をシンプルにしたかったので…

ちなみに予約後1ヶ月に到着→
初期不良で再起動ループ止まらず、サポートに交換依頼→
さらに1ヶ月後に交換
なので手元で動かせるまで2ヶ月かかりました。。。

スペック

Ubuntu 20.04.2 LTS
linuxは初めて触るのでドキドキしてます。
起動がメチャ早で快適ですね。

やったこと

日本語入力

kledgeb.blogspot.com

jun-networks.hatenablog.com

fish

今回のセットアップで入れてよかったものNo.1
タブ補完最高ですね

qiita.com

qiita.com

git ssh接続

qiita.com

ffmpeg

動画 ⇔ 連番画像 の変換に使います。

qiita.com

trac.ffmpeg.org

python

Python 3.8.5 がデフォルトで入ってました

docker

docker-ceというのを入れました。

www.digitalocean.com

GPU

GPU環境はdocker、CPU環境はpipenvで管理、というのを誰かが言っていたので従うことにします。
(最初ローカルに用意しようとしましたが普通に詰みました)
docker内でGPUを使うための設定はこちらを参考にしました。

qiita.com

.vimrc

" tabでスペースを挿入 
set expandtab 
" tabで挿入される文字幅 
set softtabstop=4
" インデント幅 
set shiftwidth=4 
" yコピーがクリップボードに入る 
set guioptions+=a 
" 対応するかっこを強調表示 
set showmatch 
" 行末のスペースを可視化 
set listchars=tab:^\ ,trail:~ 
" 対応するかっこ、ブレースを表示 
set showmatch matchtime=1 
" 大文字小文字を区別せず検索 
set ignorecase 
" 検索コマンドで、打ち込んだところまでのパターンのテキストを表示 
set incsearch 
" 大文字を含む検索をしたらignorecaseを上書き 
set smartcase 

" 下にステータスバーを常に表示
set laststatus=2 
" 改行時にインデントを引き継ぐ
set autoindent 
" 挿入モードからノーマルモードに移行
inoremap <silent> jj <ESC>

" カラースキーム
colorscheme ron

終わりに

まだ何もわからんマンなのでオススメツール教えてください!!!

言語処理100本ノック 2020 【第2章】

ユニクロのマスクがお気に入り。ko_ya346です。
言語処理100本ノック2020(Rev 2)を始めたので解法をまとめていきます。
今回は第2章です。
確認のためのUNIXコマンドの方に苦戦しました。

  • 10. 行数のカウント
  • 11. タブをスペースに置換
  • 12. 1列目をcol1.txtに,2列目をcol2.txtに保存
  • 13. col1.txtとcol2.txtをマージ
  • 14. 先頭からN行を出力
  • 15. 末尾のN行を出力
  • 16. ファイルをN分割する
  • 17. 1列目の文字列の異なり
  • 18. 各行を3コラム目の数値の降順にソート
  • 19. 各行の1コラム目の文字列の出現頻度を求め,出現頻度の高い順に並べる
続きを読む

言語処理100本ノック 2020 【第1章】

親知らずを抜いたら血が止まらなくなりました。ko_ya346です。
言語処理100本ノック2020(Rev 2)を始めたので解法をまとめていきます。

  • 00. 文字列の逆順
  • 01. 「パタトクカシーー」
  • 02. 「パトカー」+「タクシー」=「パタトクカシーー」
  • 03. 円周率
  • 04. 元素記号
  • 05. n-gram
  • 06. 集合
  • 07. テンプレートによる文生成
  • 08. 暗号文
  • 09. Typoglycemia
続きを読む

【読書感想文】 失敗の科学

明けましておめでとうございます。
寝正月を過ごしてます。ko_ya346です。

僕は失敗が大嫌いなプライド激高人間なのですが、この本を読んで色々思う所があったので、備忘録として要点をまとめてみました。

www.amazon.co.jp


失敗の価値

失敗からよく学ぶ業界として最も有名なのは航空業界でしょう。
航空機には「ブラックボックス」という、飛行データとコックピット内の音声データを保存する箱が搭載されています。事故が発生すると、この箱を調べて原因を追求し、二度と同じ失敗が起こらないように対策が取られます。
これにより、かつてはパイロットの死亡率は50%に及んでいましたが、今ではフライト100万回につき0.41回まで減少したそうです。これらを比較できるかは謎ですがとにかく事故が減ったようです。

逆に、失敗をあまり活用しない業界の例として医療業界が挙げられています。
2013年の米国内による調査によると回避可能な医療過誤による死亡者数は年間40万人以上と算出されました。さらに調査すると、このような医療過誤を起こす医師は、やる気のない人でも悪意があるわけでもなく、真面目に仕事に取り組む医師が起こしていることが分かりました。

では、航空業界と同様に医療業界も失敗から学ぶことは出来ないでしょうか?
答えはNO。なぜなら医療業界には「完璧でないことは無能に等しい」という考え方があり、失敗を失敗と認めないからです。
この状況は、暗闇で行うゴルフと例えられています。暗闇で球を打っても、自分の打球がどこに行ったか分かりません。そのためスイングの改善点が見つからず、いくら打っても上達しません。
現在は医療過誤を共有するような取り組みが数多く行われており、徐々に医療過誤は減少しているそうです。

かつて米第32代大統領夫人、エレノア・ルーズベルトはこんな言葉を残しています。

「人の失敗から学びましょう。自分で全部経験するには、人生は短すぎます」


なぜ失敗から学べないのか

人は自分の信念と相反する事実を突きつけられた時、2種類の解決法があります。

1つは、自分の信念が間違っていたと認める方法。しかし、自分が思った程有能でなかったと認めることになるため、この方法は難しい。
2つめは、事実をあるがままに受け入れず、自分に都合のいい解釈を付ける方法。あるいは事実を完全に無視したり、忘れてしまうこと。

皆さんもテストの結果が悪い時、「体調が悪かったから」「寝不足だったから」「問題が悪い」などの言い訳をしたことはないでしょうか?
自分の実力はテスト結果として如実に現れているので、この事実を受け入れないという2つめの解決法を取っていることになります。

自分の信念と事実とが矛盾している状態を「認知的不協和」と言います。
認知的不協和が恐ろしいのは、自分が認知的不協和に陥っていることにめったに気付けないことです。自分自身を欺いているため、ほとんど自覚することが出来ません。

失敗から学ぶためには、失敗を恐れないことが大切です。
例として、

2, 4, 6

という数字を見たらどんなルールで並んでいると思うでしょうか?
「上の数字と同じルールで並んでいると思う3つの数字を好きなだけ答えて、正解を見つけ出して下さい」と言われたら、あなたはどうしますか?
下の3つの箱に数字を入れ、判定ボタンを押すとそのルールを満たすか判定してくれます。
ぜひとも法則を見つけてみてください。

, ,





パッと見てすぐにいくつかの仮説が立てられます。

  • 偶数が並んでいる
  • 3番目の数字は、前の2つの数字の和

重要なのは、その仮説をいかに証明するか。
「偶数が昇順に並んでいる」という仮説なら、「10, 12, 14」や「100, 102, 104」で仮説を確認する方法が考えられる。
しかし、もっとも手っ取り早い方法は「仮説が間違っているかどうかを確認すること」です。「6, 4, 11」と仮説に合わない数列を与えてルールに当てはまっているようなら、仮説は間違いだと分かります。
ちなみに前述の問題の答えは

昇順に並んだ数字

です。


間違った仮説から抜け出す唯一の方法は、失敗することです。
失敗をすることは、正解を導き出すのに一番手っ取り早い方法というばかりでなく、唯一の方法であることもあります。

失敗と向き合うために

失敗に直面した時の思考傾向は下の2種類に分けられます。

固定型マインドセット

知性や才能はほぼ固定的な性質と捉えている

成長型マインドセット

知性も才能も努力によって伸びると考えている考えている

失敗に直面すると、前者の思考傾向の人は「自分に才能がない証拠」と受け止め、後者の人は「自分の力を伸ばす上で欠かせないもの」としてごく自然に受け止めるという違いがあります。

失敗は悪いことではなく、成長に欠かせないもの。
失敗に対する認識を改めることが、失敗から学ぶ為の第一歩と言えます。

感想

失敗はとても悪いことだと思っていました。おそらく環境の問題かと思いますが、こと日本において失敗は非難すべきものという認識があると思います。
自分でも気付かないうちに、失敗しないための努力をしていた気がします。仕事においても作ったシステムに不具合がないか時間をかけてチェックしていました。それでもバグは発生しますが。
重要なのは「失敗との向き合い方」。失敗をむしろ喜べるようなマインドセットを持ちたいです。
このブログも完璧を求めるが故に書くことを恐れていましたが、失敗するために積極的に書いてみようと思いました。

最後に、世界最高のフリーキッカーであるデビット・ベッカムの言葉で締めようと思います。彼は幼少期からフリーキックの練習を行っており、沢山の失敗の経験からインタビューにこんな事を言っていたそうです。

私のフリーキックというと、みんなゴールが決まったところばかりイメージするようです。
でも私の頭には、数えきれないほどの失敗したシュートが浮かびます。

失敗を恐れない、いい1年にしましょう。

pythonでスペクトルアナライザを自作する

夏バテで酸っぱいものばかり食べてます。ko_ya346です。
最近はもずく酢がお気に入り。

f:id:ko_ya346:20200815193835p:plain

再生中の楽曲に合わせてスペクトルがうねうねするあれ。
フーリエ変換の勉強の息抜きにpythonで作ってみました。
コードは下の参考記事そのまんまです。

yukara-13.hatenablog.com

aidiary.hatenablog.com

import wave
import numpy as np
import pyaudio

import pyqtgraph as pg
from pyqtgraph.Qt import QtGui, QtCore

def spectrumAnalyzer(filename):
    chunk = 1024
    signal_scale = 1

    #wavファイル読み込み
    wf = wave.open(filename, "r")
    fs = wf.getframerate()
    #ハミング窓設定(なぜかchunkを2倍にしないとエラーが出た)
    hammingWindow = np.hamming(chunk*2)

    #再生用
    p = pyaudio.PyAudio()
    stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                    channels=wf.getnchannels(),
                    rate=wf.getframerate(),
                    output=True)

    # ========
    #  Layout
    # ========

    ### アプリケーション作成
    app = QtGui.QApplication([])
    app.quitOnLastWindowClosed()
    ### メインウィンドウ
    mainWindow = QtGui.QMainWindow()
    mainWindow.setWindowTitle("Spectrum Analyzer") # Title
    mainWindow.resize(800, 300) # Size
    ### キャンパス
    centralWid = QtGui.QWidget()
    mainWindow.setCentralWidget(centralWid)
    ### レイアウト!!
    lay = QtGui.QVBoxLayout()
    centralWid.setLayout(lay)
    
    ### スペクトル表示用ウィジット
    specWid = pg.PlotWidget(name="spectrum")
    specItem = specWid.getPlotItem()
    specItem.setMouseEnabled(y=True) # y軸方向に動かせなくする
    specItem.setYRange(0, 200)
    specItem.setXRange(0, chunk/2, padding=0)
    ### Axis
    specAxis = specItem.getAxis("bottom")
    specAxis.setLabel("Frequency [Hz]")
    specAxis.setScale(fs/2./(chunk/2+1))
    hz_interval = 1000
    newXAxis = (np.arange(int(fs/2/hz_interval))+1) * hz_interval
    oriXAxis = newXAxis/(fs/2./(chunk/2+1))
    specAxis.setTicks([zip(oriXAxis, newXAxis)])
    ### キャンパスにのせる
    lay.addWidget(specWid)
    
    ### ウィンドウ表示
    mainWindow.show()
    
    #chunk単位でサンプリング
    x = wf.readframes(chunk)

    while True:
        #再生
        stream.write(x)
        data = np.frombuffer(x, dtype="int16")/32768.0
        if len(data) < chunk*2:
            exit()
        #切り出した波形データ
        wind_data = hammingWindow*data
        #FFT変換
        fftspec = np.fft.fft(wind_data)

        #グラフ出力
        specItem.plot(abs(fftspec*signal_scale), clear=True)
        QtGui.QApplication.processEvents()
        #次のchunkを読み込む
        x = wf.readframes(chunk)

    stream.close()
    p.terminate()

この関数にwavファイルを渡すと実行できます。
pyaudiopython 3.7以降では使用出来ない?ようなのでご注意ください。知らなかったので環境構築時にかなり時間を溶かしました。

while内では
・wavファイルをchunk単位で呼び出す
・データを再生用の関数に渡す
・データを窓関数を通してFFT変換
・スペクトルを出力
の4つの仕事をしています。
numpyの機能を呼び出すだけなのでむっちゃ楽ですね。
とりあえず動いたんですが、肝心のFFTはイマイチ理解出来てないのでもう少し勉強します…
下の資料がとても分かりやすい。
www.ic.is.tohoku.ac.jp あとオススメの参考書があれば是非教えてください。

【読書感想文】夢を叶えるゾウ4

www.amazon.co.jp

超人気自己啓発シリーズの最新作を読んでみました。

シリーズ最初の本はたしか僕が大学生くらいの頃に流行っていて、
当時付き合っていた女性から勧められて読んだ記憶があります。
自己啓発本の類はどこか胡散臭くてい敬遠していましたが、
ストーリー調で主人公の成長が見届けられること、
格言を歴代の偉人のエピソードを交えて紹介するなどの工夫ですんなり受け入れられました。
決してお付き合いしていた方の影響ではないです。(決して)

一応このシリーズは全て目を通してまして、
1はダメ社員が諦めかけた夢を目指す物語、
2は貧乏神がお金の大切さを教えてくれたりする話(うろ覚え)
3は恋するOLが自分らしい生き方を見つけるためのお話、
って感じです。
ここまで共通しているのは、一貫して「夢を叶えるため」「理想の自分を目指すため」の方法論を提供していることです。

そして満を持して4の内容ですが、「夢を諦める方法」が書かれています。シリーズ中でもかなり異質な内容です。
決して叶うことが出来ない夢に対し、気持ちの整理の付け方を教えてくれます。

夢に向かって努力することはとても大変なことです。
有限の人生の中で、多くの時間をかける必要があり、絶対に叶うものでもありません。
自分が勉強に時間を使っているうちに、家族と過ごす時間、友人と遊ぶ時間は確実に減っていきます。
それでも叶えたい夢なのか?叶えなくても幸せな人生は送れるのではないか?
色々考えさせられます。

なんか…すごく刺さりました…

自分の話で恐縮ですが、私は今年の4月から未経験で受託分析の企業に転職しました。
いわゆるデータサイエンスと呼ばれる畑で、一流の人材になるためには途方もない努力が必要です。
転職前は「年収○○万円目指して頑張るぜ!ブヒブヒ!」みたいにほざいていましたが、
入社後は決して追いつくことが出来ない人材が山ほどいることに気付き、絶望に打ちひしがれました。
追いつこうと必死になり、専門書を読み漁り、kaggleに取り組むなどもしましたが、どれも中途半端に終わってしまいました。
そして自分には、人一倍努力する気概もなく、人脈を広げ情報をキャッチアップするコミュ力もありません。
当然業界で活かせるスキルもなく、八方塞がりです。/(^o^)\オワタ

ただ、お仕事は無理なく続けられているので、なんとか生活は出来ています。

ちょっと関係ないかも知れないですが、Qiitaで劣等感との付き合い方の記事が上がっていました 。

qiita.com


SNSではつよつよのエンジニア達が活躍する姿がたくさん見られます。
私はそれを目にする度に自分と比較してしまい、胸が苦しくなるような思いになりました。
そのせいか最近はTwitterをあまり見ることが出来なくなりました(SNS向いてない)。
ただ、別に強いエンジニアになれば自分が幸せになれるかは分かりません(年収は上がりそうですが)。
そもそも今不幸せかと聞かれると、不自由もなくそこそこ幸せです。

自分が求める本当の幸せってなんだろう、
そんなことを考えさせられました。