orangeProse別館

orangeProse(本ブログ)の補助

WindowsでもVagrantでChefしたい、rbenvも(11.12.4-1版)

f:id:hidex7777:20140512174308p:plain

以前、Chefの導入編の記事を書きましたが、4月に、Ubuntu14.04 LTSのまっさらなVagant Boxをつくったので、Chefのレシピを書いておきたいと思います。

ところで。

心を入れ替えます。

導入編から書きなおしてみます。

方針としては、Chefリポジトリは(1)Git+GitHubで管理する、(2)Vagrantプロジェクトの中に入れる(ディレクトリ構成のはなし)。

「Chefって結局なんなの?」という方は『入門Chef Solo - Infrastructure as Code』を読んで下さい。

  • ChefとChef-Soloを(ひとまず)区別しましょう(ローカル開発環境=Vagrantで使うのはChef-Soloです)
  • 「冪等性(べきとうせい: Idempotence)」「収束(Convergence)」がキーワードですよ
  • NodeのことをClientとよんだりする(厳密にはChefのAPIと通信できるすべての端末のこと、したがってknifeもChef Clientのひとつ)
  • knife-soloとはChef-Soloを扱うにさいして便利なツールです

こう書いてみると当たり前のことばかりですが、Chefの概念図だけ頭にあると、こんがらがってきます。

ぼくはこの本を読んで、Chefライフがすべてうまく行き始めた気がしてきました。不思議なマジックをもった本です。

筆者の環境:

VagrantにはUbuntuサーバ14.04のボックスが登録されている:

>vagrant box list
Trusty      (virtualbox, 0)

Vagrantプラグインvagrant-omunibusは便利ですがknife solo prepareで済むので、個人的には必要ないかな―と思っています。本番環境でVagrant使うかどうかわかんないですし。

あとvagrant-berkshelfは開発が終わるようなので、見送ります。gemでインストールするBerkshelfは終わるわけではないので、gemで入れましょう。

この記事では、rbenvとruby-buildでrubyをインストールするのに使います。

下準備

>pwd
/c/Users/hidex7777

>mkdir mychef3
>cd mychef3
>vagrant init Trusty
>vim Vagrantfile
(Vagrantfileの修正)
 config.vm.network "private_network", ip: "192.168.33.10"

:wq

>vagrant up 
>vagrant ssh
$ exit
>vagrant ssh-config --host mychef3 >> %HOME%\.ssh\config
>ssh mychef3
$ exit

Macとかの場合、ssh-config --hostの出力先は~/.ssh/configにします。

WorkstationにChefとかをインストール

Step 2: Set up your workstationの"Run the Chef installer"の指示に従ってChef Clientをインストールします(前回、WindowsはGemでインストールするべきだと書きましたが、いまのインストーラならそちらを使うべきかと思います。knifeとかのツールもこれで使えるようになります)。

Windows版インストーラ

11.12.4-1がWin7で使える記事執筆時点の最新版みたいです。

インストールが終わったらコンソールを再起動して:

>path
C:\opscode\chef\bin;C:\opscode\chef\embedded\bin;

にパスが通っているのを確認。

knifeの設定:

>knife configure

いろいろ聞かれますがぜんぶYとかEnterでOK。

便利なツールknife-soloは入れておきます:

>gem install knife-solo

Windowsの場合

ちなみに、Windows版だとないと困るgemを、前もってアンインストールしておきましたが:

gem uninstall win32-process
gem uninstall windows-pr

このChefのインストールで、これらも入りました。

さらに、Windowsだとやはりrsyncがないので、cwRsyncのFree Editionをダウンロード、解凍して、中身をぜんぶパスが通っているディレクトリ(ぼくの場合はC:\Users\hidex7777\bin)に入れて、ssh.exeとssh-keygen.exeを削除

以下の環境変数も追記:

chef-repo作成

>pwd
/c/Users/hidex7777/mychef3

>knife solo init chef-repo
  • ~/mychef3/chef-repo/.chef/knife.rb

ができていればたぶんOK。

自作のレシピは、つくられたディレクトリのなかのsite-cookbooksに入れます。

とりあえずGitHubにpush

GitHub側であらかじめchef-repoリポジトリをつくってあるとして:

>cd chef-repo
>git init
>git add .
>git commit -m "first commit"
>git remote add origin https://github.com/hidex7777/chef-repo.git
>git push -u origin master

NodeをChefに対応させる

>knife solo prepare mychef3
  • ~/mychef3/chef-repo/nodes/mychef3.json

というファイルができていれば、たぶんOKです。

defsetというcookbookをつくってみる

>knife cookbook create defset -o site-cookbooks
  • ~/mychef3/chef-repo/site-cookbooks/defset/recipes/default.rb

ができていればたぶんOK。

/chef-repo/.chef/knife.rbに

cookbook_path    ["cookbooks", "site-cookbooks"]

という記述があることを確認します。

(このknife.rbは~/.chef/knife.rbとは別のファイルです)

とりあえずHello Worldをやっておきます。

default.rbをテキストエディタで開いて:

log "hello world"

と記入。

~/mychef3/chef-repo/nodes/mychef3.jsonに:

{
  "run_list":[
    "recipe[defset]"
  ]
}

と記入。

CookbookをNodeに反映

>pwd
/c/Users/hideo64temp/mychef3/chef-repo

>knife solo cook mychef3

  * log[Hello World] action write

ここまででいちおうコミットしておく:

>git status
>git add .
>git commit -m "add defset"
>git push origin master

ここまでは前回と同じです。

今回は、もうちょっと先に進みたいと思います。

ここから先は、すべてdefsetのdefault.rbに追記していきます。

aptitudeupdateしてdist-upgradeする

aptのupgradeはユーザがrecipeで自動化するべきではない、と述べられています。

そのため、これはインストール後、手動でやるべきとされています。

パッケージを最新版にしたければ、packageのリソース内に記述するべきであると。

例:

package "nginx" do
  action :upgrade
end

とはいえ、使い捨てのVagrantにそこまで気を使う必要もない気がするので、次のように書いてしまう:

execute "aptitude-dist-upgrade" do
    command "aptitude dist-upgrade -y"
    action :nothing
end

execute "aptitude-update" do
    command "aptitude update -y"
    notifies :run, "execute[aptitude-dist-upgrade]", :immediately
end

cookのとき、dist-upgradeのほうはaction :nothingなのでスルーされて、updateが実行されたときにnotifiesでdist-upgradeを:runするようになっています。

なお、「この書き方ではaptシステムを使っているディストリビューションでしか有効でなく、普遍性がないではないか」という批判は正しいのですが、「個人的レシピは徐々に育てる」をモットーにしていきたいと思います。

.bashrcファイル中のHISTSIZEとHISTFILESIZEをそれぞれ90000にする

templateリソースを使います。

ぼくはConsole2を使っているので、chef操作をしているタブとは別タブで、sshログインしておきます。

ssh mychef3したコンソールのタブで、

cp /home/vagrant/.bashrc /vagrant/.bashrc.erb

でコピーしておく。

Nodeの/vagrantディレクトリは、WorkstationのVagrantfileがあるディレクトリと共有フォルダになっているので、手元にコピーがきます。

このファイルをおもむろにコピーして、/chef-repo/site-cookbooks/defset/templates/defaultディレクトリにペーストします。

この.bashrc.erbファイルをテキストエディタで開き、以下の部分を次のように書き換えます:

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=<%= node['bashrc']['histsize'] %>
HISTFILESIZE=<%= node['bashrc']['histfilesize'] %>

サイズは変数にしておきます。ファイル名は拡張子.erbをつけて.bashrc.erbとして保存。

/chef-repo/nodes/mychef3.jsonテキストエディタで開き、次のように変数の値(Attribute)を用意しておきます:

{
    "bashrc":{
        "histsize": 90000,
        "histfilesize": 90000
    },
    "run_list":[
        "recipe[defset]"
    ]
}

/chef-repo/site-cookbooks/defset/recipes/default.rbにtemplateリソースの記述をします:

template ".bashrc" do
    path "/home/vagrant/.bashrc"
    source ".bashrc.erb"
    mode 0644
end

コンソールのChef操作タブに戻り、

> knife solo cook mychef3

でNodeに反映させます。

-HISTSIZE=1000
-HISTFILESIZE=2000
+HISTSIZE=90000
+HISTFILESIZE=90000

のようにdiffが表示されればOKのはずです。

Vagrantにログインしているタブに切り替えて、llコマンドで.bashrcファイルのモードが-rw-r--r--(つまり0644)になっているのを確認。

vi .bashrcで、ファイルが適切に書き換えられているのを確認する。

.bash_aliasesファイルにalias eng='export LANG=en_US.UTF-8'alias jpn='export LANG=ja_JP.UTF-8'の行を追記

これはssh接続でなく直接サーバのターミナルを開いたときに、日本語がちゃんと表示されないのを回避するためのエイリアス

ssh接続のときはjpnで日本語表示、ターミナルで直接開いたときはengで英語表示にする。

これもtemplateを使う。

たぶんインストールしたばかりのサーバには.bash_aliasesファイルはないので、Workstation側で作る。

alias eng='export LANG=en_US.UTF-8'
alias jpn='export LANG=ja_JP.UTF-8'

と書いて、.bash_aliases.erbとして/chef-repo/site-cookbooks/hell/templates/defaultに保存する(この時点ではerbにする意味はないのですが)。

/chef-repo/site-cookbooks/defset/recipes/default.rbに追記する:

template ".bash_aliases" do
    path "/home/vagrant/.bash_aliases"
    source ".bash_aliases.erb"
    mode 0644
end

vim-noxをインストールしてデフォルトエディタにする

vim-noxのインストールのnotifiesからupdate-alternativesを呼び出すようにする(default.rbに追記):

execute "update-alternatives-editor" do
    command "update-alternatives --set editor /usr/bin/vim.nox"
    action :nothing
end

package "vim-nox" do
    action :install
    notifies :run, "execute[update-alternatives-editor]", :immediately
end

etckeeperとgitとtigのインストール

Chefで完全管理して冪等性が保たれているのにetckeeperもなにもないだろう、という気もしますが、なければないで不安なので、入れます。

vim-noxのときのように、actionに:nothingを指定しておいて、他から呼び出すように書いてもいいのだけれど、どれかが何かのはずみでインストールされてしまうと、他がインストールされなくってめんどくさいので、個別に書きます:

package "etckeeper" do
     action :install
end

package "tig" do
    action :install
end

package "git" do
    action :install
end

もちろんvim-noxのところでやったように

package "git" do
    action :install
    notifies :install, "package[tig]", :immediately
end

とやってもよいでしょう(tigのactionは:nothingに)。

/etc/etckeeper/etckeeper.confの編集

.bashrcのときと同じように、ssh mychef3したコンソールのタブで、

cp /etc/etckeeper/etckeeper.conf /vagrant/etckeeper.conf.erb

でコピーしておく。

このファイルを/chef-repo/site-cookbooks/defset/templates/defaultディレクトリにペーストします。

次の部分を書き換えます:

# The VCS to use.
#VCS="hg"
VCS="git"
#VCS="bzr"
#VCS="darcs"

これも、この時点ではerbにする意味はないですが(変数の埋め込みがないので)、念の為にerbファイルにしてtemplateとして扱うのがベターかと思います。

伊藤直也本でもそう述べられています。

template "etckeeper.conf" do
  path "/etc/etckeeper/etckeeper.conf"
  source "etckeeper.conf.erb"
  mode 0644
end

ntpをインストール

package "ntp" do
  action :install
end

ntpはサービスですが、Ubuntuは「インストールしたサービスは、常時動いている。止めたきゃアンインストールせよ」という方針のOSなので、基本的にはサービスのスタートを考えなくてよいとも言えます。

時刻が著しくズレていて同期がとれなくなった場合のことを考えて、設定ファイルを書き換えてもよいかもしれません:

service "ntp" do
  supports :status => true, :start => true, :stop => true, :restart => true, :reload => true
  action :nothing
end

execute "ntpdate" do
  command "ntpdate ntp.nict.jp"
  action :nothing
  notifies :start, "service[ntp]", :immediately
end

template "ntp.conf" do
  path "/etc/ntp.conf"
  source "ntp.conf.erb"
  mode 0644
  notifies :stop, "service[ntp]", :immediately
  notifies :run, "execute[ntpdate]", :immediately
end

この場合もあらかじめ

$ cp /etc/ntp.conf /vagrant/ntp.conf.erb

でコピーをもってきて、次のように書き換えるか:

server ntp.nict.jp
#server 0.ubuntu.pool.ntp.org
#server 1.ubuntu.pool.ntp.org
#server 2.ubuntu.pool.ntp.org
#server 3.ubuntu.pool.ntp.org

デフォルトをコメントアウトせずにntp.nict.jpの行を書き加えるだけにするか、どちらでもよいでしょう。

あるいは設定ファイルは書き換えずに、installと同時にstopしてntpdateしてstartする、というだけでもいいかもしれません(ぼくはそうしています)。

パスワード認証の無効化(/etc/ssh/sshd_config)

sshd_configファイルをテンプレート化します。

ssh mychef3してあるタブで:

$ cp /etc/ssh/sshd_config /vagrant/sshd_config.erb

手元にきたコピーを/templates以下にペースト:

#ポート番号を変数化しておく
Port <%= node['sshd_config']['port'] %>

#'#PasswordAuthentication yes'の行を書き換える
<%= node['sshd_config']['passauth'] %>

#'UsePam yes'の行を書き換える
<%= node['sshd_config']['usepam'] %>

mychef3.jsonファイルに変数を追記:

  "sshd_config":{
    "port": 22,
    "passauth": "PasswordAuthentication no",
    "usepam": "UsePam no"
  },

default.rbファイルに追記:

service "ssh" do
  supports :status => true, :start => true, :stop => true, :restart => true, :reload => true
  action :nothing
end

template "sshd_config" do
  path "/etc/ssh/sshd_config"
  source "sshd_config.erb"
  mode 0644
  notifies :restart, "service[ssh]", :immediately
end

UFW有効化、「OpenSSHへのWorkstationからの許可およびそれ以外からのリミット」ルール作成

UFW(Uncomplicated FireWall)をあつかうのに便利なFirewallリソースが公開されているのですが、この記事を書いている時点で、Travis CIのテストがFailしているので、ひとまず避けておくことにします。

ここではより原始的な方法で。

execute "ufw-allow-openssh" do
  command 'ufw insert 1 allow from 192.168.33.0/24 to any app OpenSSH'
  action :nothing
end

execute "ufw-limit-openssh" do
  command 'ufw limit OpenSSH'
  action :nothing
  notifies :run, "execute[ufw-allow-openssh]", :immediately
end

execute "ufw-enable" do
  command 'printf y | ufw enable'
  notifies :run, "execute[ufw-limit-openssh]", :immediately
end

ufw enableしたときに対話的に入力を求められるので(-yオプションがきかない)、printf yで渡しています。

apache2インストール

UbuntuのAPTで配布されているApache2も、バージョンが2.4系統になったようです。

Apacheを入れたらufwにも許可を入れます:

execute "ufw-allow-apache" do
  command 'ufw allow "Apache Full"'
  action :nothing
end

package "apache2" do
  action :install
  notifies :run, "execute[ufw-allow-apache]", :immediately
end

Workstationのブラウザからhttp://192.168.33.10(Vagrantfileで設定したプライベートネットワーク)に接続して"Apache2 Ubuntu Default Page"が表示されれば成功です。

以前の簡素な"It works!"ページからだいぶ様変わりしていてびっくりしました。

ドキュメントルートを/vagrantにしたwwwサイトを作ってa2enable、000-defaultをa2disable

まずデフォルトの設定ファイルをコピー(いつのまにか.confという拡張子が付くようになりました):

$ cp /etc/apache2/sites-available/000-default.conf /vagrant/www.conf.erb
$ echo "from vagrant" > /vagrant/index.html

2.2ではデフォルトのドキュメントルートが/var/wwwでしたが、設定ファイルを開くとわかるように、2.4では/var/www/htmlになっています(Ubuntu)。

また、Directoryディレクティブが書かれていないので(apache2.confに書かれている)、書き加える必要があります。

www.conf.erbファイルをtemplatesディレクトリにペースト、次のように記述:

  DocumentRoot <%= node['wwwconf']['documentroot'] =>

  <Directory <%= node['wwwconf']['directory'] %>>
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
  </Directory>

mychef3.jsonアトリビュートを記述:

  "wwwconf":{
    "documentroot": "/vagrant",
    "directory": "/vagrant"
  },

レシピの記述:

service "apache2" do
  supports :status => true, :start => true, :stop => true, :restart => true, :reload => true
  action :nothing
end

execute "a2dissite-default" do
  command 'a2dissite 000-default'
  action :nothing
  notifies :reload, "service[apache2]", :immediately
end

execute "a2ensite-www" do
  command 'a2ensite www'
  action :nothing
  notifies :run, "execute[a2dissite-default]", :immediately
end

template "www.conf" do
  path "/etc/apache2/sites-available/www.conf"
  source "www.conf.erb"
  mode 0644
  notifies :run, "execute[a2ensite-www]", :immediately
end

新しい設定ファイルwwwをensiteすると同時にデフォルトの000-defaultをdissiteするのがポイントです。

mod_sslをa2enmod、apache2リロード

テンプレート用設定ファイルをコピーします:

$ cp /etc/apache2/sites-available/default-ssl.conf /vagrant/www-ssl.conf.erb

書き換えるところはありませんが(DocumentRootを書き換えたければお好きに)、templates/defaultにコピーします。

レシピ:

execute "a2ensite-ssl" do
  command 'a2ensite www-ssl'
  action :nothing
  notifies :reload, "service[apache2]", :immediately
end

execute "a2enmod-ssl" do
  command 'a2enmod ssl'
  action :nothing
  notifies :run, "execute[a2ensite-ssl]", :immediately
end

template "www-ssl.conf" do
  path "/etc/apache2/sites-available/www-ssl.conf"
  source "www-ssl.conf.erb"
  mode 0644
  notifies :run, "execute[a2ensite-ssl]", :immediately
end

service[apache2]はすでに定義してあるものを使います。

WorkstationのChromehttps://192.168.33.10にアクセスしてデフォルトページが表示されれば成功です(証明書が自己証明なので警告メッセージが出ます)。

rbenvとruby-build

rubyのReadline6.3に対応してない問題(https://bugs.ruby-lang.org/issues/9578)があって、rbenvからのインストールが難航していたのですが、この問題に対するパッチが適用されたバージョンならインストール(ビルド)可能です。

最近のものだと:

1.9.3系統はたぶん大丈夫かと……(わかんないですが、ぼくの環境では1.9.3-p392がビルドエラー出ませんでした。Bug#9548をみると1.9.3もRequiredになってますが)。

>gem install berkshelf

Windowsだと死ぬほど時間がかかりますが……。

リポジトリトップに"Berksfile"というファイル名のファイルを作ります:

source "https://api.berkshelf.com"

cookbook 'ruby_build'
cookbook 'rbenv', github: "fnichol/chef-rbenv"

Berkshelfのv0.3系統からBerksfileの書き方も変わったので、注意。

cookbookをインストールします:

>berks vendor

現在のリポジトリにberks-cookbooksというディレクトリがつくられて、そこにインストールされます。

ちなみにv0.2のときみたいにberks installすると、デフォルトでは~/.berkshelf/cookbooksにインストールされます(設定によると思いますが)。

>berks vendor cookbooks

だとcookbooksにインストールしようと試みますが、すでに存在するディレクトリだと怒られます。なので、必要があれば、cookbooksディレクトリを削除してからやりましょう。

/chef-repo/.chef/knife.rbを修正します:

cookbook_path    ["cookbooks", "site-cookbooks", "berks-cookbooks"]

自動的に追加してくれればいいのに……。

mychef3.jsonに追記:

(省略)
  "rbenv": {
    "user_installs": [
      {
        "user": "vagrant",
        "rubies": ["2.1.2"],
        "global": "2.1.2"
      }
    ]
  },
  "run_list":[
    "recipe[defset]",
    "ruby_build",
    "rbenv::user"
  ]
}
>knife solo cook mychef3

必要な依存パッケージも自動的にじゃんじゃかインストールしていってくれます。超楽チン。

>ssh mychef3
$ ruby -v
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]
$ gem -v
2.2.2
$ rbenv versions
  system
* 2.1.2 (set by /home/vagrant/.rbenv/version)

ふう~大変だった。。。(Readline6.3問題を知らなかったので)

ぼくの現時点のrecipe@GitHub

Windows Vagrant ssh問題がなぜか直った話

f:id:hidex7777:20140504011506p:plain

ここ2~3週間、vagrant sshもできなければssh hostnameもできない、という謎現象で苦しんだ。

うまくいきそうになっても、文字化けでどうしようもなかったり。

試したことがあるはずの解決法で、なぜか今日は解決した。

結論をいえば、

C:\Progran Files (x86)\Git\bin

にパスを通したら、すべてうまくいった。

これ、悪戦苦闘してる間に、一度試した方法ではあるはずなのだが……

思い出せる範囲でのプロセス

いろいろ試したけど、思い出せる範囲で記録しておく。

症状の発端

突然、ssh hostnameができなくなった。

具体的にいうと、~.ssh\configをsshが読みに行ってくれなくなった。

ssh-Fオプションをつけてconfigファイルの場所を指定すれば行けたが、簡便のためにconfigファイル作ってるんであって、そんな面倒くさいことをするのは嫌だった。

その直前に行ったこと:

  • cwRsyncのFree Editionに入っているファイルをパスの通っているディレクトリにインストール(この中にssh.exeも入っている)
  • chefとknife-solo、win32-process、windows-prをgemでインストール

ここで、chefを試している間は問題なし。

> vagrant ssh-config --host hostname >> %HOME%\.ssh\config

も問題なく、hostnameでsshログインできる。

ここでssh hostnameができなくなった。

つまりconfigファイルを読みに行ってくれなくなった。

cwRsyncはCygwin版のrsyncsshとDLLが同梱されている。

おそらくCygwinのディレクトリ解釈がうまく行っていないのだろうと考えた(だとすると、なぜそれ以前はうまくいっていたのかが謎)。

cwRsync同梱のsshがうまいこと~/.ssh/configを読んでくれる方法を探ったけれど、「Cygwin環境下ではどうすればいいか」という情報しか見つからない(cwRsyncにおいてsshrsyncのための付属品なので……あまり情報がない)。

これで数日費やした。

次に、cwRsyncで入れたssh.exeを削除。

こんどはvagrant sshすらできなくなった。

ここで「あれ?いままではなんでできてたんだろう?」という疑問が発生した。

  次に、(たぶんここでGit\binにパスを通すのも試したはず)MSYSにあるbinにパスを通した。

文字化けがひどくてダメ。

ゲスト側(Ubuntuサーバ)でLANG変数にen_US.UTF-8を設定すれば、まあ、いけるけど、以前はうまくいってたのに、釈然としない。

それに「ログアウト」の文字はどうしても文字化けする(これはMSYSのssh.exeが吐き出してるのかな)。

Gitを新たにインストール、UNIXツール(msysのコマンドのこと)も使えるパターンでインストールしたけど、やはり文字化け。

次に、使ってるコンソールラッパー(Console2を使っていた)がよくないのかな(シェルがWindowsコマンドプロンプトで、MSYSのsshを使う、という組み合わせが相性が悪いのかな)と考えた。

まずConsole2のシェルをmsysのbashに変えてみた。

文字化けがひどいのは変わらない。

他のものに変えてみよう、というわけで、Console2の後継であるConsoleZに変えた。

Chocolatayを使ってインストール。

変化なし。

minttyに変えてみる。変化なし。

MSYSを新しい(去年出たのかな?)mingw-getのGUIを使って改めてインストールしてみたりしたけど変化なし。

他にもVirtualPCVistaを入れて、そこにVirtualBoxをインストールして試そうとしたけど、これは32bit OSでは64bit OSを扱えないという壁に阻まれて断念(Vistaのインストールがちゃんと完了するまで3日ぐらいかかった)。

フォントがマズいのかも、と考えていろいろいじったけど変化なし。

で、「MSYSで文字化けするのにGitのssh使って文字化けしないなんてことはないでしょう(だってWindows版GitはmsysGitだもの)」と思いつつ、C:\Program Files (x86)\Git\binにパスを通してみる。

なぜか文字化けしない。

は?

どういうことなんでしょう????

.ssh/configも読みに行っている。

どういうことなんでしょう????

そもそもGitのbinにパスを通していない期間に、なぜvagrant sshができていたのかが謎。

ssh hostnameができたのはcwRsync同梱版を入れたからかな、と思っていたけど、それもconfigファイルを読みに行ってくれていた理由がわからない。

Windowsを窓からぶん投げたくなりました。

↓が出る頃には間に合いそう。

最近調子が悪くなったのでConsole2を改めて。

f:id:hidex7777:20140425235905p:plain

Vagrantが1.5.3になったり1.5.4になったりしているうちにvagrant sshすらできなくなったうえに日本語表示もおかしくなってきて、こういうときは気が滅入ってくるので、基本に立ち返ってConsole2をちゃんとインストールするところから始めたい。

筆者環境

手順

「いい感じのconsole.xml」を別名で保存。

Console-2.00b148-Beta_64bit.zipをダウンロード、解凍。

%HOME%\tools\Console2に配置。

日本語IME対応パッチをダウンロード。解凍してできたConsole.exeを先のディレクトリに上書き。

Console.exeをダブルクリック、起動したらクイック起動バーにピン止め。

exit

%HOME%\AppData\Roaming\Consoleに「いい感じのconsole.xml」を上書き。

Console2を起動。

右クリック>Edit>Settings>AppearanceでFontにBitstream Vera Sans Monoをセット。

右クリック>View>Console Windowのタイトルバーを右クリック>プロパティ>フォントでMS ゴシックを選択、OKで閉じる。

Console Windowのタイトルバーを右クリック>閉じる。

Win+RregeditHKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionFontLinkSystemLink

「編集」>「新規」>「複数行文字列値」

「名前」を「Bitstream Vera Sans Mono」にして、ダブルクリック>「値のデータ」に「meiryoKe_602r1.ttc,MeiryoKe_Console」でOK。

いったんログオフしてから再度ログイン。

Ubuntu14.04のVagrant Base boxをつくる

f:id:hidex7777:20140419000611p:plain

先月、Ubuntuサーバ12.04 LTSのVagrant Boxをつくる記事を書きましたが14.04 LTSが出たので、あらためてUbuntuサーバーのBoxをつくってみたいと思います。

Chefの記事が書きかけだった気がしますが、次回辺りに続きを書きます。

筆者の環境:

ISOをダウンロード

公式サイトからダウンロードしておきます。

このリリースは64bit版のみですね。

564MBなのでCD-ROMにおさまります。

VirtualBoxGuestAdditionsのISOもダウンロードします。

VirtualBox(4.3.10時点)添付のGuestAdditionsはうまくインストールされません。

https://www.virtualbox.org/download/testcase/VBoxGuestAdditions_4.3.11-93070.iso‌

(Stackoverflowを参照)

VirtualBoxにインストール

VirtualBoxを起動。

「新規作成」>「メモリ・HDD」はデフォルト>ドライブはVMDKの可変サイズ。

設定:

  • 一般:高度:クリップボードの共有「双方向」、ドラッグ&ドロップ「双方向」
  • システム:ポインティングデバイスPS/2マウス」
  • ストレージ:CD/DVDドライブにISOファイル(いまダウンロードしてきたUbuntuのイメージファイル)をマウント
  • オーディオ:オーディオを有効化のチェックをはずす
  • ネットワーク:NAT
  • USB:USBコントローラを有効化のチェックをはずす

「標準インストール」をする(ミニマルインストールではない)。

ユーザ名:vagrant
パスワード:vagrant

コンソール

標準インストールしたUbuntu 14.04のコンソールがVirtualBoxで開いている状態で:

$ sudo su
# export LANG=en_US.UTF-8
# echo $LANG
# aptitude update
# echo $?
# aptitude dist-upgrade
# echo $?

echo $?で返り値が0なら、直前のコマンドは成功しています。

sudoersの編集

vagrantユーザのsudoはパスワードなしにします:

# visudo

%sudo ALL=(ALL:ALL) ALL

と書いてある次の行に追記します:

vagrant ALL=(ALL) NOPASSWD: ALL

Ctrl+Xで編集完了、yで保存。

終わったらsuからexitします:

# exit
$ cd (ホームディレクトリに戻ります)

Guest Additionsのインストール

DKMSをインストールします:

$ export LANG=en_US.UTF-8
$ echo $LANG
$ sudo aptitude install dkms
$ echo $?

VirtualBoxの「デバイス」>「Guest AdditionsのCDイメージを挿入」を選択します。

VirtualBoxの「デバイス」>「CD/DVDデバイス」>「仮想CD/DVDディスクファイル選択」で、さきにダウンロードしておいたVBoxGuestAdditions_4.3.11-93070.iso‌を選択します。

ディレクトリをつくって:

$ mkdir /mnt/cdrom

マウントします:

$ sudo mount /dev/cdrom /mnt/cdrom

または:

$ sudo mount /dev/sr0 /mnt/cdrom

スクリプトを実行します:

$ cd /mnt/cdrom
$ ls (↓で実行するスクリプトファイルが表示されるのを確認)
$ sudo sh ./VBoxLinuxAdditions.run

デスクトップ環境をインストールしていないServerだとWindow Systemのインストールがスキップされますが、無視します。

$ ls /usr/lib

/opt/VBoxGuestAdditions-4.3.11/lib/VBoxGuestAdditionsへのVBoxGuestAdditionsというディレクトリシンボリックリンクがつくられていればOKです(ISOをダウンロードしなくともシンボリックリンクをつくればOKということでもあります)。

openssh-serverのインストール

$ sudo aptitude install openssh-server
$ echo $?
$ sudo service ssh status (runningを確認します)

Vagrantで共通して使われるインセキュア・キーを登録します:

$ mkdir .ssh
$ cd .ssh
$ wget https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub
$ mv vagrant.pub authorized_keys
$ chmod 600 authorized_keys
$ cd ..
$ chmod 700 .ssh

ここまでで、たぶん、Vagrant Boxをつくる条件は整っていると思います。

ここ以降は、ホストOS(Windowsとか)のコンソールで作業します。

パッケージング

package --baseに渡す引数は、VMの名称(VirtualBoxGUIに表示されている名称)を与えます(ここでは"Ubuntu1404")。大文字小文字が区別されます。

vagrant package --base Ubuntu1404

package.boxがカレントディレクトリにつくられます。

テスト

box addに渡す引数は、そのBoxに自分が付けたい名前を与えます。ここでは"Trusty"とします:

vagrant box add Trusty package.box
vagrant box list

これで"Trusty"がリストにあればOKです。

ホームの.vagrant.d/boxes/Trusty/0/virtualboxにmetadata.jsonとともに展開されているのを確認します。

新たに新規プロジェクト用ディレクトリをつくり、そこで立ち上げてみます:

> mkdir mytrusty1
> cd mytrusty1
> vagrant init Trusty
> vagrant up

VirtualBoxが立ち上がったままであれば、新たなVMがつくられて「実行中」となっているはずです。

プライベートネットワーク接続を加える

Vagrantfileの次の行のコメントをはずします:

config.vm.network :private_network, ip: "192.168.33.10"

Vagrantfileを再読み込みして、再起動、ログインします:

> vagrant reload
> vagrant ssh

Hagex『ネット釣り師』は半分詐欺だ!(だから買え)

f:id:hidex7777:20140411210444j:plain

これから書くことは、釣りのように見えるかもしれませんが、私にとってはのっぴきならない問題になっておりますので、いい解決方法がありましたら、アドバイスお願いします。

私は現在40代の女性ですが、独身です。

見た目はわりと良い方なので、若い頃から、お付き合いする相手には困ることがありませんでした。

結婚も30代後半ぐらいで、なんとなく決まってしまうのかな、と考えておりました。

ですが、仕事に熱中しているあいだに、30代に突入したころには年収も1000万円を超えるようになりました。

そのころから、「結婚するならば、私の仕事を邪魔することなく、可能なかぎり育児や家事を負担してくれる相手がいいな」と考えるようになりました。

問題は、出会う男性が、「私の年収に注目して近づいているようだ」と思えること、なおかつ「かといって育児や家事を積極的にやろうという意志があるように見えない」ということです。

これっておかしくありませんか?

もし、私よりもはるかに年収が高いのであれば、「養ってあげるから、家庭に入って欲しい」というのも理解できます(それでも、そういう男性と結婚するのは嫌ですが)。

ですが、30代に入ってから出会ったすべての男性が、私と同程度の年収しか稼いでいないのです。

私も年齢を重ねるにしたがって、年収も上がっていますので、「私と同程度の年収」を稼いでいて、なおかつ独身という男性と出会う確率も減ってきました。

私に近づく男性は、私を、自分の稼ぎがなくなったときのための「保険」としてしか見ていないようなのです。

なかには、あからさまに「稼いでくれないと困る」とひどいことをいう人もいました。

私もいわゆる「プレ更年期」に入り、精神的に少し疲れた時期もあったのです。

そのような時期に、「疲れた。仕事やめようかな」とこぼすこともあったのですが、そんな私を優しく包んでくれるような相手でなければ、安心して結婚などできません。

「もう、結婚はあきらめようかな」と考える日が、しばらく続きました。

そんなある日、面白いブログ記事を見かけました。

【明日発売】ネットの釣りテクニックについて解説した本を書きました【買え】

Hagexさんという方が『ネット釣り師が人々をとりこにする手口はこんなに凄い』という本を出版した、という記事です。

この記事を書いているid:hagexさんによれば、

釣りの本質は「いかに人の心を揺さぶるか?」です。

この本では「釣り師はこんなテクニックを使って、人を騙す」というテクニックをいろいろと書いています。釣り師志望の方にも役に立ちますが、これって、「インターネットで注目を集める、バズる文章」の技術と同じなんですよね。この事実に本を書き終わって気がつきました。もっと早くわかっていれば、帯の文章にいろいろと書けたのに!

とのこと。

この宣伝文句は魅力的に感じられました。

この本を読めば、私にも、人から注目される文章を、ネットで発表できるかもしれない!

そう考え、とてもワクワクして本屋さんに行きました。

「結婚のことなどで悩んでいる暇もないくらい、たくさんの人に注目される有名ブロガーの仲間入りができるかもしれない!」

と、私はHagexさんの本が私の悩みをすべて解決してくれるのではないかと期待してしまったのです。

結論から言いますと、期待は裏切られました。

半分、詐欺にあったような気分です。

なぜ「半分」かというと、そもそもこの本は「バズる文章を書くためのテクニック」を紹介するのが目的ではなく、「バズる可能性がある釣りの文章が釣りであることを見抜くためのテクニック」を紹介することを目的として書かれたものです。

その意味では、嘘は書いていないのです。

ですが、タイトルにも「人々をとりこにする手口」とあるように、この本の中には「こういう話題をこういう書き方で提示すれば、人をとりこにできる」というノウハウが書いてあると期待してしまうのも、間違ってはいないのではないでしょうか?

私が間違っているのでしょうか?

具体的に、どのへんに「詐欺」っぽさを感じたのかを、書いてみます。

これを読んでも「爆釣り」の文章が書けるような気がしない

これが中心的な問題ですね。

本書には「よくある(対立)トピック」が表になって掲載されています。

「男女対立」とか「喫煙・非喫煙者」とか「学歴」とか「DQNネーム」とかですね。

「多くの人が何か一言言いたくなる」話題を、「対立」を煽るように書けば「釣れる」というわけです。

それは理解できるのですが、私はなにも、わざわざ対立を煽って注目されたいわけではないのです。

私は慶応大学大学院の博士課程を出ていますが、学歴の問題にあまり関心はありません。

私がやりたいのは、多くの人に文章を読んでもらって、ためになったとか、役に立ったとか、面白かったと思ってもらうことです(そしてそういう反応が欲しいのです)。あるいは真面目に反論してくれるとか。

はてなブックマークのホットエントリに、私が過去に書いたことがあるブログ記事とほとんど同じ内容の記事が入ることがあります。

たぶん元ネタにした(その記事を書くために勉強した)ソースが同じだったというだけなのでしょうが、私のブログ記事には1ブックマークもつかないのに、どうしてその記事はホットエントリなのでしょう。

そこにはなにか、タイトルのつけかたとか、フックとなる言葉使いとか、「何か違う」要素があるのだろう、と考えていました。

そして、この本に、その「違い」が書いてあるものだとばかり期待してしまったのです。

この本では「釣り」の見分け方を「マクロ視点」と「ミクロ視点」とに分けて解説していますが、「バズる言葉使い」というニーズは「ミクロ」に分類されるのでしょう。

ですが、この本の「ミクロ視点」にあるのは、「表記ゆれ」とか「常用漢字以外を使っているか」とか「誤字脱字」とかをヒントに、釣り師のIDを見破るテクニックなどでした。

釣り師といえども、IMEの変換を信用するので、別の書き込みをするさいにも「表記ゆれ」が生じないという痕跡を残すという理屈でしょう。

また釣り師は文章がうまいので、常用漢字以外の漢字使用は避ける傾向にあるとのこと。

小見出しをこういう風に書けば、人の心をゆさぶる」という書き方はされていませんでした。

誤字脱字が釣りのように見える

この本には、誤字脱字がとても多く含まれています。

いわゆる「名著」とよばれる本の中にも、誤字脱字が異様に多い本はありますので、意味がわかりさえすれば、それじたいは気になりません。

ですが、この本には、「釣り師は文章がうまく、用意周到である」「だから誤字脱字が少ないはずだ(素人の文章には誤字脱字が多い)」「しかしその裏をかく釣り師もいる」(大意)ということが書かれています。

こういうことを読んでしまうと、この本を読んでいて誤字脱字を発見すると、「これはわざとなのか? 突っ込んだら釣られたということなのか?」などと考えてしまいます。

そういうところでつまづいてしまうので、読んでいてストレスになりました。

たとえば93ページには「用字用語」(ようじようご)という単語が3回出てきますが、「用事用語」という誤字があります。

これが「用字用語を統一する」という解説の中で出てくるので、「これは『こういうのが統一されていないということなんですよ』というメッセージなのだろうか?」「ツッコミを待っていて、ツッコんだとたんに『はい釣りでした』ということなのだろうか?」「誤字脱字を作って『用意周到に書いたのではなく誠実に書いたのですよ』という見せかけを作りつつ、実はその裏が真実なのだ、と言いたいのだろうか?」などなど、考えこんでしまって、混乱しております。

また、97ページには「誤字の例」のリストがあって、そのうちのひとつが

  • ×「負けず嫌い」→○「負け嫌ぎらい」

なのだそうですが、「負け嫌ぎらい」ってなんて読むんですか?

もしかして、「負けず嫌い」は「負け嫌い」の誤用だ、ということが言いたいのでしょうか?

そういえば、表には掲載されていませんでしたが、この手の「正しい日本語ファシズム」みたいなのも、「爆釣りトピック」のひとつですよね?

「負けず嫌い」の語源は確かに「負け嫌い」ですが、いまではどちらも正式な用法として辞書にも掲載されていますよね?!

これは釣りなんでしょうか?! どうなんでしょうか?!

無意識に釣ってしまうようになる

これは上に書いた、「爆釣り文章が書けるようにならない」と矛盾するような点ですが、私は今日、「プチ釣り」のようなことを無意識的にやってしまいました。

経緯はこうです。

いま、目下の話題といえば何でしょう? STAP細胞

いいえ、違います。そんなことよりも、もっと多くの人にとって関係があり、深刻な、重大な問題があります。

そう、OpenSSL脆弱性の問題です。

はてな界隈には「情強」の皆さんがそろっているので、「ああ、話題になっているねえ」とピンとくると思うのですが、少なくとも私のFacebookのタイムラインがこの話題でもちきり、ということはありません。

これほど大規模に影響を与える問題なのに、なんで話題にしないのでしょうか?

私は、「OpenSSL」という単語を見た時点で「自分とは関係ない」と思ってしまう人が多いからだろうと推察しています。

周囲の人達への注意喚起のために、最近話題のWebサービス「note」に「これだけ多くのサイトでパスワードとかが漏れていた可能性がありますよ」というテキスト記事を投稿しました。

内容は「Mashable」の記事を丸写ししただけですが。

タイトルは「OpenSSL脆弱性の影響を受けるサイト一覧(随時更新中)」というものです。ここには「釣り」の要素はひとつもありませんね?

そしてこれをTweetしました。「note書いた」とだけ記入して。ここにも釣り要素はありませんね?

そもそもTwitterのフォロワーさんは、Heartbleed脆弱性など、知り尽くしているだろうから、あまり私ごときが注意喚起を付け加える必要性はないのです。

注意喚起すべきなのは、Facebookのフレンドなので(FacebookはHearbleed脆弱性にさらされていたサイトのひとつなので、当然みなさん知らなくてはならない情報です)、Facebookにもポストしました。

そのとき、

OpenSSL脆弱性について、技術的な話はナシにしてまとめました。

Facebookは「漏れていた」ことが確定しているので、みなさん対策してくださいね。

と記入してポストしました。これはあとで考えると「やや釣り」ですね。FacebookがHeartbleed脆弱性にさらされていたのは事実で、ユーザは必ず対処しなければならないのは当然ですが、「漏れていた」という断言からは、「あなたのパスワードが攻撃者の手に渡ったのは確実ですよ」という(意図しない)強いメッセージとして読まれてしまう危険性があります。

ですが、「漏れたのは確実だ」という想定で(安全側に倒し)対処することは良いことなので、そのままポストしています(ポストの時点ではこれが「やや釣り」だということに気づいていませんでしたが)。

この記事を書いている時点で、Facebookのこのポストに「イイネ」はひとつもついていません。

せっかく注意喚起したのに、だれも関心を持たなかったのでしょう。

予想外なのはここからです。

先のnoteへポストした報告Tweetは1RTも1Favもありませんでした。

ところが、FacebookTwitterの連携設定のせいで、Facebookへの投稿がTwitterにも流れてしまったのです。

この「流れることが念頭になかったポスト」が、これを書いている時点で、188RT・100Favされています。

(あ、この文章は、40歳独身女性の設定で書いていますが、中の人はおっさんです)

これが「プチ釣り」です。

はじめは「あれ? なんでこれそんなにRTされてんだろ?」と疑問に思ったものですが(繰り返しますが、noteに投稿した事じたいは、すでに別個にTweetしているのです)、よくよく考えてみると、

Facebookは「漏れていた」ことが確定しているので、みなさん対策してくださいね。

というのは、読みようによっては「デマ」です。

「パスワードなどが攻撃者の手に渡った」ことまでは「確定」していません。

ポストした時点では、「Heartbleedへのアタックが可能だったという意味で、漏れていた」ぐらいの気持ちで書いたのですが、うーん、「あなたのパスワード、外部に知られましたよ」というメッセージとして読めなくもないですね。

恐ろしい!

私は、この本を読んだせいで、無意識的に「釣り」の文章を書いてしまったのです!

私がしたいのは釣りではありません!

役に立ったとか面白かったとかイイネとか、あるいは真面目に反論してくれるとか、そういう反応が欲しいだけなのです!

Hagexさんは私を洗脳しているのです!

そもそも「釣り師」とはあなたの妄想の存在なのではないでしょうか

あるいは、「釣り師ウォッチャー」とか「釣り師判定」など、そんな市場はあまりにもニッチではないですか?

「釣り」にそんなに関心がある人など、いるのでしょうか?

と思ったら、いた!

角川本社ビルでHagexさんのインタビューを受けてきました

うーん。

「市場が存在しないのに、あたかも『心をつかむ文章の書き方ノウハウ』の本と見せかけて売る、不届き者の商売」だと批判したくなってきた終盤、トピシュさんの対談が出てきて(第7章)、私は「やりこめられた」気分になりました。

私への誹謗中傷のレスはご遠慮ください。

2ch発言小町はてな、ヤフトピ ネット釣り師が人々をとりこにする手口はこんなに凄い (アスキー新書)

ボイスメトリーのやり方(声のトーンで所有者を当てる)

ボイスメトリーとは

サイコメトリー」といえば、物体に残る「残留思念」を読み取る超能力のこと。

元メンタリストのDaiGoが「声のトーン」で、その物体の所有者が誰かを当てるパフォーマンスを、「ボイスメトリー」と呼んでいる。

手順

  1. パフォーマーは、参加者全員に、「これから、どなたかに、なにか私物をひとつだけ出してもらいます。何でもいいのですが、私には誰のものかわからないようなものを出して下さい。私はこれから後ろを向いていますので、その間に、どなたかおひとりだけ、私物をひとつ、出して下さい。携帯電話でも、ボールペンでも、あるいはコインでも、なんでもかまいません。そのあと、私はみなさんに『これはあなたのものですか?』とおひとりずつ、聞いていきますが、みなさん、『いいえ』で答えて下さい。私は、声のトーンで、その所有者が誰か、当てます。では、後ろを向いていますので、私にわからないように、どなたか、私物のものを、ひとつだけ出してくださいね」と言い、後ろを向く。
  2. 参加者は、今の説明がよくわからない可能性があるので、パフォーマーは、ひとつずつ手順を指示していく。「では、どなたでもかまいませんが、私物をひとつだけ、出して下さい」と後ろを向いたまま言う。
  3. 後ろを向いたまま「ものが決まったら、OKと言ってくださいね」と指示。参加者が「OK」と言ったら振り返る。
  4. 出されたものがiPhoneだったら、「このiPhoneですね」と確認。それが確かに、誰のものか分らないものであれば、「いいでしょう」と言う。もし見覚えがあって、誰のものかわかってしまった場合は「スミマセン、これは○○さんのものだと知っているので、別のものにしてください」とやり直しさせる。
  5. あらためてこれからすることを説明する。「では、おひとりおひとりに、『これはあなたのものですか?』と聞いていきますので、みなさん『いいえ』で答えて下さい。私は声のトーンで、誰のものか、当てます」。
  6. 一人ひとりに、「このiPhoneは、あなたのものですか?」と聞いていく。参加者は「いいえ」で答える。
  7. すべての人に聞き終わったら、「わかりました」と言い、その所有者に向かって「これはあなたのものです」と断言する。間があったら、「間違いましたか?」と。

仕組み

ポイントは「声のトーンから所有者を当てます」という点を強調して、「声のトーン」に参加者の意識を集中させること。

ここでパフォーマーが行うのは、声のトーンから所有者を当てることではなく、マッスルリーディング(筋肉の動きから心の状態を読み取る)に近い。

もし「これはあなたのものですか?」と聞かれた参加者が、本当に自分のものでなければ、余裕を持って「いいえ」と答えられる。答えたあとの態度も余裕のあるものである。

さらに、自分のものでないとわかっているので、意識は次の参加者に向く。つまりパフォーマーは聞いたあとの、その参加者の態度に注目する。

仮にその参加者が、パフォーマーを欺こうと、わざと自信なさげに「い、いいえ、ち、ちがいます」などと演技したとしても、その演技自体が余裕を持ってなされる。

もし「これはあなたのものですか?」と聞かれた参加者が、自分のものだったとしたら、【声のトーンから】読み取られないように、細心の注意を払って、「いいえ」と答える。しかしパフォーマーは、そもそも声のトーンからはなにごとも読み取ろうとしていないので(そのために「声のトーン」という前振りで、参加者の意識を声のトーンに注意するように誘導する)、その他の態度全体に注意を向ける。

この「嘘をついた参加者」は、答えた後に、次の参加者に意識を向けることはなく、バレないように注意を払い、緊張する。場合によっては下を向く。目を合わせようとしないか、逆に目を注視してくる。

ポイントとしては、全員の、答えたあとの視線の動きに注意する。嘘をついていなければ視線は横(次の参加者)に移動し、嘘をついていれば動かないか、下に移動する。この視線移動を誘導するために、「これはあなたのものですか」「いいえ」のルーチンを流れるようにスムーズにやる。

すき家の連鎖的閉店はどのようにして起こったか? - 仕事にゅうす(仮) ほか

今日のひとこと

面倒なことリストを少しずつ片付けた。

今日のはてブ

記憶力皆無の人用英単語の覚え方:哲学ニュースnwk[English]

文型が有用なのは確かだけどDUO買ってパターンでわかるものは覚えなくていいから消して、って作業で全ページ読むことになるじゃん。それができないから困るわけで。