no risk no life

技術、投資、時事など

git rm --cachedした後、他の人が除外commitをgit pullしたときにファイルが消える

概要

emacs .gitignore
git rm --cached file
git commit -m "ignore file"

の後に自分のファイルは残っている。 誰かがこのcommitをpullすると、その人は除外したファイルが消える。

当たり前?

除外commitにファイルの削除が含まれているので当たり前かもしれない。 commitした人自身の環境でも、除外commit以前に戻し、その後除外commitをまたいでpullすると削除される。

要は、消えないで残るのは除外commit後をpullする時。

除外するファイルをバックアップ取っておいて、git除外後に再配置するという原始的な方法で保つことにした。

ISUCON7 予選に参加しました

10/21(土)に、チーム爆アドというチーム名にて、earshttpというハンドルネームで参加させていただきました。

予選概要

予選合計参加者数

  • 合計 407組、1132名

10月21日(土)

  • 204組 , 577名
  • 一般 173組 [2名:28組 , 3名:145組]
  • 学生 31組 [2名:5組 , 3名:26組)

10月22日(日) 

  • 203組 , 559名
  • 一般 165組 [2名:44組,3名:121組]
  • 学生 38組 [2名:6組,3名:32組]

総合順位

  • 145位 26,759点

課題内容

課題はチャットシステムでした。 3台のubuntuサーバ(APPx2、DBx1)を使い、高速化するものでした。

修正内容

当日お腹の調子が悪く、メンバー二人は某所で集まり、自分は自宅から参加しました。 連携方法がチャットしかなかったので、一人で走る感じになってしまいました。

言語はRubyを使用しました。

netdataの導入

やってもらいました。

SQLの見直し

  • select文の取得カラムの見直し
  • Indexの貼り直し
  • レコード取得数の見直し

MySQLのチューニング

知識がなかったので調べながら使用メモリ量のチューニング

Nginxのチューニング

やろうとしたけど知識がなさすぎて手が回りませんでした。

はまったところ

進めていくと、/icons取得時に500エラーが大量に発生するようになりました。 /iconsはDBに入っている画像データをAppが書き出す形になっており、netdataで見るとDBサーバのCPUが張り付いていました。

画像をファイルに書き出してNginxに良しなにしてもらおう、ということは思いつきましたが、私用の都合で途中抜けしたため、時間が足りずにタイムアップ。 18時時点で25000点ほどで離脱しました。 その後メンバーにミドルウェアのチューニングをお願いし、27659点を記録しました。

感想

人生初のプログラミングコンテストでしたが、0点でした、と書かずに済んでホッとしています。

開始時レギュレーションを一切読まずに進めたため、pythonからrubyへの切り替えができずにあたふたしました。 レギュレーションは必ず読むことにします。

また、リモート参加は慣れていないと意思疎通が難しいので、お腹を壊さないようにしようと思います。(:3 」∠ )_

来年も参加します。 お疲れ様でした〜

Ansible 1.9以降のansible.cfgでhostfileを定義すると怒られる

概要

Ansible 2.4.0.0のansible.cfgで、

hostfile = ./hosts

みたいに書いていると、以下のエラーが出力されplaybookを実行できない

[DEPRECATION WARNING]: [defaults]hostfile option, The key is misleading as it can also be a list of hosts, a directory or a list of paths . This feature 
will be removed in version 2.8. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
 [WARNING]: Could not match supplied host pattern, ignoring: all

 [WARNING]: provided hosts list is empty, only localhost is available

解決策

hostfile = ./hosts

inventory = ./hosts

参考

1.9から変更されている模様

hostfile@リファレンス

inventory@リファレンス

おまけ

hostfile自体は/etc/ansible/hostsに定義されていて、ここに書けばグローバルで使用できるっぽい

Vagrantゲスト同士でSSHできるようにする

経緯

WindowsでAnsibleを使いたかったので、VagrantでAnsible用VMを立ててそこからplaybookを流す

vagrant-host-shellを導入

$ vagrant plugin install vagrant-host-shell

insert_keyをfalseにする

Vagrant.configure("2") do |config|

.......
  box = "ubuntu/trusty64"
  vagrant.vm.box = box

  config.ssh.insert_key = false

  vagrant.vm.network "private_network", ip: "192.168.33.254"
  # IPを設定しておく

.........

scpでAnsible用ゲストOSにprivate_keyをぶん投げる


config.vm.provision :host_shell do |host_shell| host_shell.inline = 'scp -i ~/.vagrant.d/insecure_private_key -o "StrictHostKeyChecking no" ~/.vagrant.d/insecure_private_key vagrant@192.168.33.254:/home/vagrant/.ssh/id_rsa' end vagrant.vm.provision "shell", inline: <<-SHELL chmod 600 /home/vagrant/.ssh/id_rsa SHELL end

所感

手動でぶち込むのは避けられたはず... まだWindowsで動作確認はしていないが、insecure_private_keyの場所が違うくらいしか引っかかる場所は無い気がする

追記

Windowsで試したところ、scpがうまくいかなかった(cygwin使用)

ので、cpでvagrantフォルダ内に移動させてmv&chmod。

    config.vm.provision :host_shell do |host_shell|
      host_shell.inline = 'cp ../../.vagrant.d/insecure_private_key ./insecure_private_key'
    end

    vagrant.vm.provision "shell", inline: <<-SHELL
      set -e
      mv /vagrant/insecure_private_key /home/vagrant/.ssh/id_rsa
      chmod 600 /home/vagrant/.ssh/id_rsa
    SHELL
  end

WindowsでもMacでも引っかからずに動作しました。

Vagrantfileを複数ファイルへ分割する

参考サイト

Vagrantfileを分割する

Vagrant的な使い方

./Vagrantfile

Vagrant.configure("2") do |config|

  config.ssh.insert_key = false

  config.vm.define "ansible-main" do |vagrant|

    box = "ubuntu/trusty64"
    vagrant.vm.box = box

    vagrant.vm.network "private_network", ip: "192.168.33.254"
    vagrant.vm.network :forwarded_port, id: "ssh", guest: 22, host: 22254

    vagrant.vm.synced_folder "./ansible", "/home/vagrant/ansible"
    vagrant.vm.provider "virtualbox" do |vb|
      vb.memory = "768"
    end
end


    load "./vagrant/test/Vagrantfile" if File.exist?("./vagrant/test/Vagrantfile")
    load "./vagrant/test2/Vagrantfile" if File.exist?("./vagrant/test2/Vagrantfile")

./vagrant/test/Vagrantfile

Vagrant.configure("2") do |config|

  config.ssh.insert_key = false

  config.vm.define "test" do |vagrant|
    box = "ubuntu/trusty64"
    vagrant.vm.box = box
    vagrant.vm.network "private_network", ip: "192.168.33.15"
    vagrant.vm.network :forwarded_port, id: "ssh", guest: 22, host: 22015
    vagrant.vm.provider "virtualbox" do |vb|
      vb.memory = "768"
    end
  vagrant.vm.provision "shell", inline: <<-SHELL
      set -e
      apt-get update
    SHELL
  end

end

所感

vagrantをまとめて管理できるようになって便利