なんもわからんな

LookOne について

※メモのために書いているので、文章のアレコレは気にしていません

ここ最近分散システムの勉強をしていましたが、各ノードのパフォーマンスを最大まで上げないと分散させる意味あんまりないのでは?って思い並列コンピューティングの勉強をしています。

使っている本はこちら www.amazon.co.jp

現在、相互排他の章のLockOneのところが終わったので忘れぬように纏めます

#共有カウンタ
class Counter{
  private int value;
  public Counter(int c){
    value = c;
  }

  public int getAndIncrement(){
    int temp = value; # やばいところ
    value = temp + 1; # やばいところ
    return temp;
  }

シングルスレッドで上記のインクリメントを読んでも問題ないが、複数スレッドで上記のインクリメントを呼ぶとやばいところ がやばくなるのである。
それを回避するためにクリティカルセッションやばいところ を守る。
(読み込み/書き込みのシーケンスを一度に1つのスレッドが行う)

//interface 

public interface Lock{
  public void lock;
  public void unlock();
}

class Counter{
  private int value;
  public Counter(int c){
    value = c;
  }

  public int getAndIncrement(){
    lock.lock();
    try{
      int temp = value; # クリティカルセッション
      value = temp + 1; # クリティカルセッション
      return temp;
    }finally{
      lock.unlock();
    }
  }

lockでスレッドはデータをクリティカルセッションに入れるまで待つ。
クリティカルセッションに入れたら、ロックをかけデータの見出し及び書き込みをする。
上記が成功/失敗したらロックを解除する。

あるスレッドが無限に占有することがないことからスターベーションフリーである。
またスレッドがロックを試み取得でき、ロックを取得できる。スレッド1がロック取得できないとしたら、スレッド2がクリティカルセッションをこなしていることから、デットロックフリーとなる。

LockOne

LockOneアルゴリズムでは2つのスレッドの環境で考える。 またスレッドがロックを確保している|しようとしている のステートを表すためサイズ2のbooleanの配列を用意する。

下記ではスレッドAがスレッドBに邪魔されずにロックを確保できる例を示す。

f:id:yakuta55:20190225230638p:plain

スレッドAはクリティカルセッションに入るために、ロックを確保しようとする。

f:id:yakuta55:20190225230829p:plain

f:id:yakuta55:20190225231055p:plain

f:id:yakuta55:20190225231143p:plain

下記ではスレッドBがスレッドAに邪魔されロックの確保を待たされる例を示す。 f:id:yakuta55:20190225231420p:plain

f:id:yakuta55:20190225231458p:plain

下記では、スレッドA,Bが同時にロックをかけようとしてスターベーションの状態を示す f:id:yakuta55:20190225231547p:plain

writeA(flag[A] = true)とwriteB(flag[B])がreadA(flag[B])とreadB(flag[A])よりも先に起こるためおきる。

LockOneではどちらかのスレッドがもう一方のスレッドよりも前に実行さえすればデッドロックは起こらない。

(Neo)Vimで気持ち良い環境を構築する

前置き的な

今までVimを適当に使ってきた私ですが、一度自分の環境を見直すことにしてみました(1月末くらいから)。
その理由として、プラグインを入れすぎてテキストエディタとしてのシンプルさを失ったVimに疑問を持ったこと、
純粋にVim本来の力を忘れいたこと...などがあります。

ということで本記事では、最低限vimで欲しいプラグインたちを紹介します

プラグイン管理

Shougoさんが開発しているdein.vimを使用しています こちらは以前から使っていますが、パッケージをtomlで管理できるところが良いです

github.com

補完系

補完系はdeoplete.nvimとLSPクライアント(LanguageClient-neovim)を使用しています。
LSPを導入することで、補完系のプラグインを減らせました。
Ruby,PythonだとLanguageClient-neovimの設定は、こんな感じです。

[[plugins]]
repo = 'autozimu/LanguageClient-neovim'
rev = 'next'
build = 'source install.sh'
hook_source = '''
set hidden
let g:LanguageClient_serverCommands = {
    \ 'python': ['pyls'],
    \ 'ruby': ['solargraph', 'stdio']
    \}
nnoremap <silent> K :call LanguageClient#textDocument_hover()<CR>
nnoremap <silent> gd :call LanguageClient#textDocument_definition()<CR>
nnoremap <silent> <F2> :call LanguageClient#textDocument_rename()<CR>

pylsと組み合わせるとこんな感じです。

github.com

github.com

その他

ステータスバーのカスタムはvim-airlineとvim-airline-themeを使っています
設定はこんな感じ、<Cntl-n>, <Cntl-p>でbufferを切り替えれるようにしてます

[[plugins]]
repo = 'vim-airline/vim-airline'
hook_add='''
let g:airline_powerline_fonts=1
let g:airline#extensions#tabline#enabled = 1
nmap <C-p> <Plug>AirlineSelectPrevTab
nmap <C-n> <Plug>AirlineSelectNextTab
let g:airline#extensions#tabline#buffer_idx_mode = 1
if !exists('g:airline_symbols')
  let g:airline_symbols = {}
endif
'''

[[plugins]]
repo = 'vim-airline/vim-airline-themes'
hook_add='''
let g:airline_theme='minimalist'

行末の不要な空白を可視化するためにvim-trailing-whitespaceを入れています

f:id:yakuta55:20190210141842p:plain

github.com

インデントを可視化するためにvim-indent-lineを入れています
デフォルトだとでインデントが可視化されるのですが、好みではなかったので·で置き換えています

[[plugins]]
repo = 'Yggdroot/indentLine'
hook_add='''
let g:indentLine_enabled = 0
let g:indentLine_char = '|'
let g:indentLine_leadingSpaceEnabled = 1
let g:indentLine_leadingSpaceChar = '·'
'''

github.com

windowサイズの変更を楽にするためwinresizerを使用しています
<Cntl-e>でリサイズが始まりh,j,k,lでサイズを変えることができます
もう<Cntl-w>> とかには戻れない....

github.com

最後にカラースキームですがicebergを使用しています
ここら辺は好みなので、好きなのを入れましょう

github.com

基本的に私が中心に使っているのは、上記のプラグインたちです。
他にもオススメがぜひ教えてください!

最後まで見ていただき、ありがとうございました。