気ままNote

個人の技術メモ

2017/12/04 アドベントカレンダー閲覧日記

近年アドベントカレンダーが乱立してしまい、とても全部を追うことができない。何を読んだかだけでも整理して後の見返しに役立てたい。

今度こそ絶対あなたに理解させるPaxos

分散合意アルゴリズムの一つ、Paxosの紹介記事。 Python の実装例を動かしながら理解していくといい。Coreos で用いられている Raft と比較してよんでいくと尚可。

分散ファイルシステムはブロックチェーンの夢を見るか

分散ファイルシステムブロックチェーンを利用したプロダクトの紹介とともに、応用を考えていく上でいいキッカケを与えてくれる。個人的に来年は、「分散アプリケーションのためのプラットフォーム」としてのEthereum に関わっていきたいので、とても参考になった。

  • Ethereum, Proof of Work
  • Filecoin, Proof of Storage

cf. Ethereum入門

Chromium のソースコードの歩き方

Chromium プロジェクトのディレクトリ構成やファイル構成を紹介した記事。 ソースコード積ん読がまた増える。いい意味で。

Storybook for Vue 入門

簡易的なStorybook のハンズオン。コンポーネントベースでやり取りをする機会がだんだん定着してきた。

LRU方式とlru_cacheデコレータについて

とあるPython製のOSSを眺めていたら見慣れない書き方があったので調べてみました。 lru_cache は python3.2から functoolsに追加されたデコレータです。

そもそも lru とはIT用語辞典によると、

LRUとは、キャッシュアルゴリズムなどで用いられる、置換対象のデータを定める方式のうち、参照されていない時間が最も長いデータを置換対象にする方式のことである。

例えば、仮想記憶管理におけるページング方式では、主記憶装置(メインメモリ)上で補助記憶装置へ退避させるデータ単位(ページ)を選ぶ方式としてLFUを用いることがある。主記憶装置で扱うことのできる容量には限度があるため、主記憶装置の記憶容量を超えるデータを扱う場合は、データの一部を補助記憶装置へと置換することで空き容量を確保する。このとき、LRUでは、それぞれのデータが参照された時間に基づき、その時間が最も古い(least recently)データを置換対象とする。

と説明されています。
Pythonのドキュメントには、

高価な関数や I/O に束縛されている関数を定期的に同じ引数で呼び出すときに、時間を節約できます。

とあります。

まとめると、 lru はキャッシュアルゴリズムの一種であり、lru_cache は高速化を目的としたときに有効となる手段の一つのようでした。

参考

TRUNCATE したらシーケンスもリセットさせる

PostgreSQL を使っていてテストデータを入れ直したいときに TRUNCATE でテーブルに保存したデータを消していました。
再度データを挿入したときにシーケンスが以前の番号を保持したままになってしまったので、リセットする方法を調べました。

公式ドキュメントに載っていた内容のままですが、TRUNCATE のあとにRESTART IDENTITY を追加すればいいようです。

TRUNCATE bigtable, fattable RESTART IDENTITY;

参考

TRUNCATE

tmuxの設定を整理した

思い出したようにtmux の整理をしていたら昔設定した内容を忘れていたので備忘録として残しておく。

prefix-keyの変更

C-x 派

# prefix
unbind-key C-b
set -g prefix 'C-x'
bind-key 'C-x' send-prefix

設定のリロード

[prefix-key] r

pane内でスクロール

スクロールモード
[prefix-key] [
fn + ↑↓

各ペインの同期操作

:set-window-option synchronize-panes on

キーバインド設定で省略可能

bind e setw synchronize-panes on
bind E setw synchronize-panes off

プラグイン周り

いつ導入したか思い出せないが、tmux-plugins/tpm を利用していた。
[prefix-key] Iでインストールを実行する

set -g @tpm_plugins " \
    tmux-plugins/tpm \
    tmux-plugins/tmux-sidebar \
    tmux-plugins/tmux-copycat \
    tmux-plugins/tmux-open \
    tmux-plugins/tmux-resurrect \
    tmux-yank/tmux-yank \
    tmux-plugins/tmux-battery \
    tmux-plugins/tmux-online-status \
"
# tmux-resurrect
set -g @resurrect-save 'S'
set -g @resurrect-restore 'R'

# Initialize tpm
run-shell ~/.tmux/plugins/tpm/tpm

Vue.jsをif-elseifのように扱う方法

http://cdn-ak.f.st-hatena.com/images/fotolife/i/ie-kau/20150818/20150818232251.png

Vue.js1.0.0

Vue.jsを利用したての頃、複数の条件分岐を求められた際に悩んだことがあります。
例えば、セレクトボックスで選択されたアイテムにごとに表示内容を切り替えたい場合です。

通常LL言語であればif文・elseif文で複数の条件式を組み合わせられますが、Vue.jsのドキュメントを見る限りそのような記法はありませんでした。

対策

そのときは選択肢が少なかったこともあり、
v-modelとvalueを直接指定して条件分岐させました。

var demo = new Vue({
    el: '#demo',
    data: {
        selectItem: null
    }
});
<select v-model="selectItem">
      <option value="aaa">AAA</option>
      <option value="bbb">BBB</option>
      <option value="ccc">CCC</option>
</select>

<div v-if="selectItem === 'aaa'"></div>
<div v-if="selectItem === 'bbb'"></div>
<div v-if="selectItem === 'ccc'"></div>

さらに複雑な条件が求められればこの方法では苦しくなるでしょうが、
手軽に進めたいときは今でもこの方法を使っています。

LinuxでTCPのTIME_WAITコネクションを減らす

サーバーの負荷対策の一つとして、TCPコネクションの設定を修正した。

コネクション数の計測

[user01@web /]# netstat -pan | grep TIME_WAIT | wc -l

設定即時反映

  • echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
  • echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
  • sysctl -p

OSを再起動したときも変更値を適用する

  • /etc/sysctl.conf
# 追記
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30

参考URL

zabbix clientのせいでTIME_WATEが大量に発生する件について | polidog lab++

Linux - ぜんぶTIME_WAITのせいだ! - Qiita

LinuxのTCPコネクション - ITメモ

geo-replicationのdebug設定

  • debugをONにする
# gluster volume geo-replication Volume1 ssh://User@example.com:gluster://localhost:Volume2 config log-level debug
# gluster volume geo-replication Volume1 ssh://User@example.com:gluster://localhost:Volume2 config gluster-log-level debug
  • debugをOFFにする
# gluster volume geo-replication Volume1 ssh://User@example.com:gluster://localhost:Volume2 config '!log-level'
# gluster volume geo-replication Volume1 ssh://User@example.com:gluster://localhost:Volume2 config '!gluster-log-level'

すぐ忘れそうになってしまうのでメモとしておいておきます。