それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

rubyでinは予約語だから注意な

もしかしてinは予約語

 for in で使う予約語だそうです。

forループそのものを使わないrubyにおいて in がいつまでも予約語である必要があるのかというそんな思いはある。

rubyでforループは書かない。eachの発明が偉大すぎた。

IO.pipeを使ってて気づいた

>> IO.pipe #=> [#<IO:0x108791f68>, #<IO:0x108791f18>]
>> in, out =IO.pipe
SyntaxError: compile error
(irb):8: syntax error, unexpected kIN
in, out =IO.pipe
  ^
     from (irb):8     
     from :0
>> a,b=[1,2] #=> [1, 2]

>> input, output = IO.pipe #=> [#<IO:0x108741bd0>, #<IO:0x108741b80>]

inは予約語だから

でも、使うこと無いよね。

RubyはIO.pipeを使えば、パイプを作ることが出来る

IO.pipeを使えば、パイプを作ることが出来る

パイプを作ると楽しい。

o,i = IO.pipe
100.times{ i.puts :test }
100.times{ puts o.gets }

これだけ

Pipeを使うと何が便利か。スレッドをブロック出来る

loop{ p o. gets }

で i.puts を待つことが出来る。

どういうことかというと

IO.pipeはブロックする?

>> input.puts "aaaaaaaaa" #=> nil
>> input.puts "aaaaaaaaa" #=> nil
>> input.puts "aaaaaaaaa" #=> nil
>> out.gets #=> "aaaaaaaaa\n"
>> out.gets #=> "aaaaaaaaa\n"
>> out.gets #=> "aaaaaaaaa\n"
>> out.gets
#待つ

こういうことです。3行書きだしたので、3行読み込める。4行目を読み込んだ時点で、パイプは空。なので、データが来るのを待ちます。

まってると、irb側からは手出しができないです。どうするのか?threadや、drubyをつかいます。threadを使って別スレッドから4行目を書き込んだり、drubyを使って別プロセスから4行目を書き込みます。

o,i = IO.pipe
Thread.start{loop{ i.puts "aaaaaaaaa" }}
100.times{ puts o.gets }
>> out.gets #=> "aaaaaaaaa\n"
>> out.gets #=> "aaaaaaaaa\n"
>> out.gets #=> "aaaaaaaaa\n"
>> out.gets #=> "aaaaaaaaa\n"
#...etc

drubyの場合、なんにつかうの?ネットワークパイプです。

たとえば、drbを読み込んで、druby経由で、ネットワーク越しにIOをやり取りできる。
まともにやると、ncコマンドやポート制御が必要だったりする。
でもRubyならdrubyと、IO.pipeで即決

受信側
o,i = IO.pipe
s =DRb.start_service( "druby://localhost:12345", i)
loop{ p o. gets }
送信側
i= DRbObject.new_with_uri('druby://localhost:12345') 
100.times{ i.puts :test }

IO.pipeとdrb/threadの組み合わせは便利。

これで、スレッドを簡単に扱えるし、IOでパイプを扱うこともできる。そしてネットワークでパイプを扱うこともできる。便利ね。

ちなみに、readについて

o.readは i.closeを待つ

IOなので、readコマンドはEOFを待つ。つまり、i.closeでEOFが送られない限りo.readはブロックされる。


このあたりのブロックの仕組みを見ているとruby のプリエンプションのthreadがどうしてIOでスレッドを切り替える。とされているかなんとなくわかった気がする。

Cygwin環境にRVMを用意する。CygwinでもRVMでRuby使い分けたいよね。

Cygwinでもrvm使えると便利かも。と思いました。i7マシンだとビルドの遅さもそんなに気にならないし。

まず必須なところから。

rvmのインストール
bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)
export PATH=$rvm_path/bin:$PATH
rvm pkg install autoconf

以上は必ずシングルスレッドでやること。

CygwinSSLがエラーを吐くので対策をしておく。
apt-cyg install ncurses
cd /usr/ssl/certs
curl http://curl.haxx.se/ca/cacert.pem \
| awk 'split_after==1{n++;split_after=0}\
 /-----END CERTIFICATE-----/ {split_after=1} {print > "cert" n ".pem"}'
c_rehash

必要なモジュールを入れておく。

各種必要なパッケージを事前に入れておく。これは順不同だからScreenとかBackgroundでパパっとやっちゃえばいいと思う。

必須だけど、順不同なので並行して処理して良い

rvm pkg install readline
rvm pkg install iconv
rvm pkg install openssl
rvm pkg install libxml
rvm pkg install libxslt

たぶん無くてもいけるけど、念のために

apt-cyg install readline
apt-cyg install autoconf
apt-cyg install openssl
apt-cyg install openssl-devel

準備が終わったらインストール

rvm install 1.9.3-head

1.8系はエラーになるので、以下を参考にしてみる。

http://www.mk-mode.com/wordpress/2011/12/04002057/

それでも1.8は無理みたい・・・うーむ。

Cygwinのビルド失敗は追いかけると時間かかるしなぁ。1.9が入った時点でOKとしよう。

Rvmを使ったRubyのインストール管理方法で便利なものをまとめ。

RVMは自分のユーザー環境に、独自のRuby環境を作ることができる。homebrewのように、/usr/localですらない。/home/takuya/.rvmに、バージョンが違うRubyを大量に飼育できるのです。


RVMを使えば、opensslなどの依存モジュールもRVM側だけで管理できる。
つまり、homebrew に頼らなくてもRVMさえあればRubyの環境を維持管理することが出来る

rvmさえあれば、rubyで困ることが減る。

rubyでハマる色々な罠

ruby 1.9の罠。
ruby のビルドの違いの罠
gemsの罠
gemsのバージョン地獄
gems関連はbundler で解決!!、Rubyそのものは、RVMでそこそこ解決する。

rvmを使ってるよ!っていう人は

  • rvm alias機能
  • rvm コマンド補完機能

あたりを読むと嬉しい気分になれると思います。

RVMのインストール

bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)
. ~/.bash_profile

これで自分のユーザー環境にRVMの準備ができる

依存パッケージのインストール

RVMでインストール出来るビルドパッケージを調べる。

takuya@air:~$ rvm pkg list

Usage:
  'rvm pkg {install,uninstall} {readline,iconv,curl,openssl,zlib,autoconf,ncurses,pkgconfig,gettext,glib,mono,llvm,libxml2,libxslt,libyaml}'
    'ree_dependencies' installs zlib, ncurses, readline, openssl and iconv in this order.
    still need to add ' --with-readline-dir=$rvm_usr_path --with-iconv-dir=$rvm_usr_path --with-zlib-dir=$rvm_usr_path --with-openssl-dir=$rvm_usr_path' to 'rvm install ree’

以上が、rvmがインストール出来るパッケージ。Rubyのインストールに必要なパッケージはRVMが提供してくれる。便利。

まとめて入れるよ。

rvm pkg install readline
rvm pkg install iconv
rvm pkg install openssl
#…etc

って、逐次書くのものめんどくさいわ。

まとめて、ループ処理しよう
for i in autoconf readline openssl iconv zlib libxml2 libxslt libyaml ;do rvm pkg install $i ; done;#これでOK

依存パッケージを使ったRubyのインストール

じゃぁ、早速、いままでの依存モジュールを使ってRuby1.9を入れてみようか。

rvm install ruby-1.9.3 \
--with-libyaml-dir=$rvm_path/usr \
--with-libxml2-dir=$rvm_path/usr \
--with-libxslt-dir=$rvm_path/usr \
--with-readline-dir=$rvm_path/usr \
--with-iconv-dir=$rvm_path/usr \
--with-zlib-dir=$rvm_path/usr \
--with-openssl-dir=$rvm_path/usr

読みやすく改行入れてるから、一行で書いたものがこれ。

rvm install ruby-1.9.3 --with-libyaml-dir=$rvm_path/usr --with-libxml2-dir=$rvm_path/usr --with-libxslt-dir=$rvm_path/usr --with-readline-dir=$rvm_path/usr --with-iconv-dir=$rvm_path/usr --with-zlib-dir=$rvm_path/usr --with-openssl-dir=$rvm_path/usr

このように使う。*1

RVMを使ったRuby切り替え

rvmを使って、一時的にRubyを切り替えることが出来る。

rvm use system #OS標準を使う
rvm use ruby-1.8
rvm use ruby-1.9.3
rvm use ruby-head

これで、いまのシェルは、rvm指定したRubyになる。

指定したRubyをデフォルトにするには

--defaultをつけると、指定したRubyが既定になる。

rvm use system --default #システムを標準で使う

RVMにインストール済みのRubyの一覧は

rvm list で、インストール済みで、使用可能な、Rubyの一覧が見られる。

takuya@air:~$ rvm list

rvm rubies

   jruby-1.6.4 [ x86_64 ]
   macruby-0.10 [ x86_64 ]
=> ruby-1.8.7-p352 [ i686 ]
   ruby-1.9.3-rc1 [ x86_64 ]

RVMでインストール可能なRubyの一覧は

rvm list knownでインストール可能なRubyの一覧が取得できる

takuya@air:~$ rvm list known
# MRI Rubies
[ruby-]1.8.6[-p420]
[ruby-]1.8.6-head
[ruby-]1.8.7[-p352]
[ruby-]1.8.7-head
[ruby-]1.9.1-p378
[ruby-]1.9.1[-p431]
[ruby-]1.9.1-head
[ruby-]1.9.2-p180
[ruby-]1.9.2[-p290]
[ruby-]1.9.2-head
[ruby-]1.9.3-preview1
[ruby-]1.9.3[-rc1]
[ruby-]1.9.3-head
ruby-head

# GoRuby
goruby

# JRuby
jruby-1.2.0
jruby-1.3.1
jruby-1.4.0
jruby-1.6.1
jruby-1.6.2
jruby-1.6.3
jruby[-1.6.4]
jruby-head

# Rubinius
rbx-1.0.1
rbx-1.1.1
rbx-1.2.3
rbx-1.2.4
rbx[-head]
rbx-2.0.0pre

# Ruby Enterprise Edition
ree-1.8.6
ree[-1.8.7][-2011.03]
ree-1.8.6-head
ree-1.8.7-head

# Kiji
kiji

# MagLev
maglev[-26852]
maglev-head

# Mac OS X Snow Leopard Only
macruby[-0.10]
macruby-nightly
macruby-head

# IronRuby -- Not implemented yet.
ironruby-0.9.3
ironruby-1.0-rc2
ironruby-head

いっぱいあって困るね。

RVMでインストール可能なRuby一覧を更新する

rvm get

たとえば安定版を追いかけるなら

rvm get stable

最新版を追いかけるなら

rvm get latest


RVMのコマンド補完

.bashrcに次を付加する。すると rvmコマンドが補完される。

takuya@air:~/Desktop$ rvm <TAB><TAB>
debug            gemset           jruby-1.6.4      package          ruby             srcdir           use
default          help             list             rake             ruby-1.8.7-p352  system           version
fetch            implode          macruby-0.10     reload           ruby-1.9.3-rc1   tests            
gem              info             monitor          remove           snapshot         uninstall        
gemdir           install          notes            reset            specs            update          

***.bashrcに追加するもの以下。

>||
[[ -r $rvm_path/scripts/completion ]] && . $rvm_path/scripts/completion

1.8と1.9をもっと手軽に切り分けたい。

1.9系だけでも複数入れてたりすると面倒なので、1.9という名前だけでアクセスしたい

takuya@air:~$ rvm use 1.9
WARN: ruby ruby-1.9 is not installed.
To install do: 'rvm install ruby-1.9'

などとなって不便です。

解決策Aliasを使う
 takuya@air:~$ rvm alias create 1.9 ruby-1.9.3-rc1
 Creating alias 1.9 for ruby-1.9.3-rc1.
 Recording alias 1.9 for ruby-1.9.3-rc1.

1.9とかいたら 1.9.3を指すように指定しました。

 takuya@air:~$ rvm use 1.9
 Using /Users/takuya/.rvm/gems/ruby-1.9.3-rc1
 takuya@air:~$

ね、簡単でしょ



もしreadline が有効にならず、homebrewのreadlineを使うなら、

僕の場合、rvm管理下のreadlineだとうまくいかなった。Macだから?とりあえず、homebrewのreadlineを使ってごまかしてる。

homebrew のライブラリヘッダーのパスを追加しておく。
rvm install 1.8.7 -C "--enable-shared --with-readline-dir=`brew --prefix`
rvm use 1.8.7

→参考そのものズバリなエントリを発見 RVMを用いてreadlineオプションを指定する - kdkk0 の 日記

Macって意外とビルド地獄なんですね。
Linux良く出来てるんだわ・・・

システムデフォルトを使う必要があるときは

RVMで入れたRubyを使用せずにシステムで入れたRubyを使うには,

rvm system

これで標準のRubyが使える

*1:#with-xxx-dir は適当につけけたので。間違ってるかも・・

Macの関連付けの変更方法

ポイントは「すべてを変更」の選択ボタン。

ファイルを右クリック

(スクリーンショット 2012-02-06 2.51.16)

ファイルを開くプログラムを選ぶ

(スクリーンショット 2012-02-06 2.51.04)

出来上がり。

ポイントは、「すべてを変更」をすること。そのままだと、該当ファイルだけの「開く」を変えたに過ぎない。
(197062234c2a61d4dc2732637d733ad7)

ちなみに。

Macは「ディレクトリ内部のアイコンの位置を自由に配置する」がまだ使える。Windowsが7で捨ててしまった、Macはまだ使える。
その違いの理由はWindowsがレジストリだったの対し、Macはフォルダに隠しファイルで表示設定を置いているからだと思う。

wgetは保存せずに、直接展開できるんだよ。

wget でファイルを保存して展開する。いつものパターンだけど。
ファイル保存が、面倒くさいじゃん?

いつものパターンだけど、

wget http://example.com/hoge.tgz
tar zxvf hoge.tgz

面倒くさいじゃん。っていうか何も考えずに、いつものパラメータを書いてるだけでした。

直接展開すればいいじゃん?

wget -O - 'http://sourceforge.jp/frs/redir.php?m=jaist&f=%2Fnkf%2F53171%2Fnkf-2.1.2.tar.gz' | tar zxvf -

標準出入力を経由して、直接展開すればいいじゃん。このほうが楽だよね。

だって、ファイル保存して展開するの面倒くさいじゃん。
これなら一行で終わるし。

解説

wget -O - 

wget のオプションに -O を指定して、出力を - に指定した。

-O
wgetのファイル保存先
- (ハイフン)
標準出力にする。

ということになる。

tar zxvf -
zxvf
gzip を extractしながらverbose して
- (ハイフン)
標準入力からファイルを受け取る


いつものコマンドでも見直すと、ちょっと楽しいですね。

RVMをDebianで使う。

rvm便利ですね。惚れまくりです。

DebianでRVMを使うには

手っ取り早くいく

sudo apt-get install build-essential libssl-dev libreadline5-dev zlib1g-dev checkinstall make curl ruby
bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)
source ~/.bash_profile


RVM管理下のパッケージで、コンパイルをしようとしらけど、エラー。手っ取り早くいくためにAPTパッケージを使った。結局たくさんパッケージをいれないとだめだった。

autoconf パッケージがこける場合

なぜかautoconfがmake エラーになったので。

 export PATH=$rvm_path/bin:$PATH


を実行してからやるとよいようだ。

RubyのMechanizeがSSLエラーになる。

とりあえず、以下を最初にやってからMechanize.newすると大丈夫っぽい*1

 require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

エラーになったやつ。

sora_h のniconico モジュールを使ったらエラーだった

?> require 'niconico' #=> true
>> a=Niconico.new 'takuya***@gmail.com' , ‘****' #=> #<Niconico: takuy****@gmail.com (not logined)
?>
>> a.login
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
        from /Users/takuya/.rvm/gems/ruby-1.9.3-rc1/gems/net-http-persistent-2.3.3/lib/net/http/persistent/ssl_reuse.rb:70:in `connect'
        from /Users/takuya/.rvm/gems/ruby-1.9.3-rc1/gems/net-http-persistent-2.3.3/lib/net/http/persistent/ssl_reuse.rb:70:in `block in connect'
        from /Users/takuya/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/timeout.rb:54:in `timeout'
        from /Users/takuya/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/timeout.rb:99:in `timeout'
        from /Users/takuya/.rvm/gems/ruby-1.9.3-rc1/gems/net-http-persistent-2.3.3/lib/net/http/persistent/ssl_reuse.rb:70:in `connect'
        from /Users/takuya/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/net/http.rb:755:in `do_start'
        from /Users/takuya/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/net/http.rb:750:in `start'
        from /Users/takuya/.rvm/gems/ruby-1.9.3-rc1/gems/net-http-persistent-2.3.3/lib/net/http/persistent.rb:405:in `connection_for'
        from /Users/takuya/.rvm/gems/ruby-1.9.3-rc1/gems/net-http-persistent-2.3.3/lib/net/http/persistent.rb:616:in `request'
        from /Users/takuya/.rvm/gems/ruby-1.9.3-rc1/gems/mechanize-2.1/lib/mechanize/http/agent.rb:264:in `fetch'
        from /Users/takuya/.rvm/gems/ruby-1.9.3-rc1/gems/mechanize-2.1/lib/mechanize.rb:1036:in `post_form'
        from /Users/takuya/.rvm/gems/ruby-1.9.3-rc1/gems/mechanize-2.1/lib/mechanize.rb:380:in `post'
        from /Users/takuya/.rvm/gems/ruby-1.9.3-rc1/gems/niconico-1.1.3/lib/niconico.rb:30:in `login'
        from (irb):6
        from /Users/takuya/.rvm/gems/ruby-1.9.3-rc1/gems/irb_rocket-0.2.0/lib/irb_rocket.rb:65:in `block in signal_status'
        from /Users/takuya/.rvm/gems/ruby-1.9.3-rc1/gems/irb_rocket-0.2.0/lib/irb_rocket.rb:26:in `call'
        from /Users/takuya/.rvm/gems/ruby-1.9.3-rc1/gems/irb_rocket-0.2.0/lib/irb_rocket.rb:26:in `capture'
        from /Users/takuya/.rvm/gems/ruby-1.9.3-rc1/gems/irb_rocket-0.2.0/lib/irb_rocket.rb:64:in `signal_status'
        from /Users/takuya/.rvm/rubies/ruby-1.9.3-rc1/bin/irb:16:in `<main>'>>
?>

MechanizeはSSL関係で、証明書関連でエラーになる。ってことらしい。

対処法

・証明書を入れる
・証明書エラーは無視する。

自分で使うなら後者

require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
require 'mechanize'

これで、とりあえず、しばらく使えるようになるみたいですね。

*1:あくまでとりあえずですからね。

HTC bravo の着信音を設定する

HTCのホームアプリなら全部に共通っぽいので、改めてエントリに。

多分Android全般じゃなくてHTCSenseに限るんじゃないかと思うんだけど。

着信音を変えると便利そうなのです。

アプリを使って探して設定

こちらで紹介したアプリでダウンロード&設定ができます。このアプリを使って設定した場合、アプリをアンインストールした後は再設定できないのでご注意ください。

直接放り込む

着信音・アラーム音・通知音とありますが、ファイルは同じMP3で問題ないです。違うのは、置いておく場所です。

SDカードに「media」というフォルダを作り、その中に「audio」というフォルダを作ります。その中に以下のフォルダを作ります。(「/sdcard/media/audio/」に作るという事)
「alarms」アラーム音用のフォルダ
「notifications」通知音用のフォルダ
「ringtones」着信音用のフォルダ

あとは、MP3を放りこめばOK。普通に設定できます。ただし、SDカード上のファイル検索が行われるタイミングが、電源投入時とSDをマウントしたタイミングだけなのでご注意ください。

HTC Desire(X06HT)の着信音 | さぼりーまんって


とりあえず、ノブレス携帯の着信音を設定しました。

ノブレス・オブリージュ、あなたが最高の救世主たらんことを。

JScriptだと?。CygwinでRails動かしたらこうなった。

(スクリーンショット 2012-01-25 16.04.02)


JScriptですよ。マジすか。

手順

cygwinをインストール

setup.exeでホームディレクトリ以下にでも。

rubyのインストール

setup.exeでついでに入れる。apt-cyg でも


rubygemsはcygportsにおいてある。

apt-cyg update -m ftp://ftp.cygwinports.org/pub/cygwinports
apt-cyg install rubygems

railsをインストール

sqlite3

apt-cyg update -m ftp://ftp.jaist.ac.jp/pub/cygwin/
apt-cyg install libsqlite3-devel
gem install rails

起動

rails new test
cd test
bundle install #←念のため
rails -s


出来上がり。

簡単だけど使い道は。。。

そうですね。せっかくのCore i7をサーバー専用でつかうのが もったいない。なのでCygwinで使えるってことでしょうか。
Corei7速い。Cygwinでビルドしても我慢できるレベル。

ときどきForkでエラーになる場合は

CygwinがFork云々でエラーになる場合ば

*** fatal error - unable to remap to same address as parent : Cygwin, Ruby on Rails, System calls

http://www.mylifestartingup.com/2009/04/fatal-error-unable-to-remap-to-same.html

を参考にすると治った。

Macでlha/lzhを展開する

mac でlzh を展開するには、コマンドが、実は手っ取り早い。

インストール

brew install lha

コマンドオプション。

takuya@air:~/Desktop$ lha
LHarc    for UNIX  V 1.02  Copyright(C) 1989  Y.Tagawa
LHx      for MSDOS V C2.01 Copyright(C) 1990  H.Yoshizaki
LHx(arc) for OSK   V 2.01  Modified     1990  Momozou
LHa      for UNIX  V 1.00  Copyright(C) 1992  Masaru Oki
LHa      for UNIX  V 1.14  Modified     1995  Nobutaka Watazaki
LHa      for UNIX  V 1.14i Modified     2000  Tsugio Okamoto
                   Autoconfiscated 2001-2005  Koji Arai
usage: lha [-]<commands>[<options>] [-<options> ...] archive_file [file...]
  commands:  [axelvudmcpt]
  options:   [q[012]vnfto[567]dizg012e[w=<dir>|x=<pattern>]]
  long options: --system-kanji-code={euc,sjis,utf8,cap}
                --archive-kanji-code={euc,sjis,utf8,cap}
                --extract-broken-archive
                --help
                --version
commands:                           options:
 a   Add(or replace) to archive      q{num} quiet (num:quiet mode)
 x,e EXtract from archive            v  verbose
 l,v List / Verbose List             n  not execute
 u   Update newer files to archive   f  force (over write at extract)
 d   Delete from archive             t  FILES are TEXT file
 m   Move to archive (means 'ad')    o[567] compression method (a/u/c)
 c   re-Construct new archive        d  delete FILES after (a/u/c)
 p   Print to STDOUT from archive    i  ignore directory path (x/e)
 t   Test file CRC in archive        z  files not compress (a/u/c)
                                     g  Generic format (for compatibility)
                                        or not convert case when extracting
                                     0/1/2 header level (a/u/c)
                                     e  TEXT code convert from/to EUC
                                     w=<dir> specify extract directory (x/e)
                                     x=<pattern>  eXclude files (a/u/c)

使ってみた

takuya@air:~/Desktop$ lha x ktrans019.lzh
ktrans.exe      - Melted   :  oooooooooooooooooooooooooooooooooooooooooooooo
ktrans.ini      - Melted   :  o
ktrans.txt      - Melted   :  o
takuya@air:~/Desktop$ lha
LHarc    for UNIX  V 1.02  Copyright(C) 1989  Y.Tagawa

lzh圧縮は、新規圧縮には使っちゃダメですよ。メンテされてない上に、脆弱性あるからね。

puppetで構成管理で困ったときに最初に見るまとめ。

puppetで構成管理をする。なれると楽と言うか、安心していられる。なんせ台数が増えるとこれがないと安心できない。

一番参考になる puppet 資料

http://www.sssg.org/~naoya/puppet/project.html

puppetで設定を適用する

とりあえず設定を反映したりテストする。

$>puppetd --server debian00.local --no-daemonize --verbose  --onetime

オプションの説明はこれ

--sever
puppetmasterサーバー指定
--no-daemonize --onetime
この一回だけを実行する。
--verbose
進捗表示

これでクライアントが、サーバーに設定を取りにいく。


puppet masterサーバーをフロントで起動して状況を見る

進捗状況が表示されながら、クライアントの接続状況がみえる。

sudo /usr/sbin/puppetmasterd  --no-daemonize  --verbose
--no-daemonize
デーモン化せずに、フロントで起動
--verbose
進捗表示

puppet 設定ディレクトリ

debianの場合はこんな感じになっていた。

/etc/puppet/
├── auth.conf                   -------------------------------  マスターに接続許可するネットマスク
├── autosign.conf             ---------------------------       SSL通信をするクライアント設定
├── files                            --------------------------  同期用ファイル
│   ├── etc
│   │   ├── apt
│   │   │   ├── sources.list
│   │   │   └── sources.list.d
│   │   │       ├── hadoop.list
│   │   │       └── virtualbox.list
│   │   ├── hosts
│   │   ├── ntp.conf
│   │   ├── resolv.conf
│   │   ├── ssh
│   │   │   └── sshd_config
│   │   └── sudoers
│   ├── home
│   │   └── takuya
│   └── var
│       └── cache
│           └── debconf
│               └── jre6.seeds 
├── fileserver.conf        --------------------------------------  同期用ファイルの設置場所など
├── manifests
│   └── site.pp              --------------------------------------   puppetの同期設定。一番大事
├── modules
├── puppet.conf            ---------------------------------------   puppet自体の設定
└── templates    

puppet 設定の自動生成

Syntaxエラーなしに設定書くのがしんどい。その上、どう書いていいかわからない。サンプルもよくわからない。
そこで、Generatorを活用する。

ralsh を使う

ユーザー設定の作成

takuya@debian00:~$ ralsh user takuya
user { 'takuya':
    ensure => 'present',
    shell => '/bin/bash',
    uid => '1000',
    gid => '1000',
    comment => 'here,i am ',
    home => '/home/takuya',
    groups => ['takuya','admin']
}

パッケージ設定の作成

takuya@debian00:~$ ralsh package openssh-server
package { 'openssh-server':
    ensure => '1:5.5p1-6+squeeze1'
}

基本設定のジェネレーター

  • ralsh user
  • ralsh package

これで、現在の設定をすべて取り出せる。

設定の連鎖についての設定

ある設定が書き換わったら、まとめて更新する という設定。

たとえば、ntpdサーバー設定が変わったら、ntpdを再起動するみたいな

 19 class ntp {
 20   package { 'ntp' : ensure => latest
 21   file { '/etc/ntp.conf':
 22     source  => 'puppet://debian00.loc
 23     require => Package['ntp'],
 24   }
 25   service { 'ntp':
 26     ensure  => running,
 27     enable  => true,
 28     subscribe => [ File['/etc/ntp.con
 29   }
 30 }

こういう依存関係を記述できる所がPuppetの強みです。

a subscribe b
AはBが書き換わったら更新する
b notify a
Bが書き換わったらAを更新する
B require A
AのインストールにはBが必要

設定を有効にする

class A{
##ほげほげ
}
#作ったクラスを有効に
include A 


include を書かないとClassは有効にならないので注意。
逆に、Classは残すけど、無効化するときは、include をコメントする。

ファイルが書き換わったらコマンドを実行する

ファイルが書き換わったら、◯◯コマンドを実行する。

300   }
301   exec{ "hadoop_restart":
302     command =>  'for service in /etc/init.d/hadoop-0.20-*;do sudo $service restart;done;',
303     refreshonly => true,
304     path =>  '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin',
305     subscribe => [
306             File['/etc/hadoop/conf.my_cluster/slaves'],
307             File['/etc/hadoop/conf.my_cluster/masters'],
308             File['/etc/hadoop/conf.my_cluster/mapred-site.xml'],
309             File['/etc/hadoop/conf.my_cluster/log4j.properties'],
310             File['/etc/hadoop/conf.my_cluster/hdfs-site.xml'],
311             File['/etc/hadoop/conf.my_cluster/hadoop-policy.xml'],
312             File['/etc/hadoop/conf.my_cluster/hadoop-metrics.properties'],
313             File['/etc/hadoop/conf.my_cluster/hadoop-env.sh'],
314             File['/etc/hadoop/conf.my_cluster/fair-scheduler.xml'],
315             File['/etc/hadoop/conf.my_cluster/core-site.xml'],
316             File['/etc/hadoop/conf.my_cluster/configuration.xsl'],
317             File['/etc/hadoop/conf.my_cluster/capacity-scheduler.xml']],
318   }
319   exec { "hadoop_enable_my_conf":
320     command =>  'update-alternatives --install /etc/hadoop-0.20/conf hadoop-0.20-conf /etc/hadoop-0.20/conf.my_cluster 50',
321     refreshonly => true,
322     path =>  '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin',
323     subscribe => File['/etc/hadoop/conf.my_cluster']
324   }

証明書がおかしくなったら、クライアント側の証明書を消す

PuppetサーバーとPuppetクライアントの間は、証明書でお互いを確認しているが、それが時々壊れるので。一旦、証明書を破棄する。

sudo su 
cd /var/lib/puppet/ssl
find -name "*.pem" | xargs -I@ rm @

そしておもむろに、再接続。

サーバー側でautosign.confに指定されているドメインなら一瞬で終わるよ

puppetでpuppetがインストールできない。

問題は、puppet がインストールされている環境を作り込むことです

どうやってもpuppetで管理できないもの

resolv.conf ---puppet はresolv.confのエラーを修正できないことがる。これが壊れると証明書関連のエラーになってファイルを受信できないのでresolv.confの破壊後はresolv.confを使うPuppetはエラーになる。

次の失敗はpuppetが壊れるので再起不能になる。

puppet自身の更新失敗
rubyの動作不良
rubygemsの破壊

なのでシステムRubyの更新は慎重に。被害甚大です。

わかりやすいドキュメント(オススメ)

http://www.sssg.org/~naoya/puppet/project.html

hgwebの作り方。自分だけのレポジトリを使って楽をする。

gitもいいけどhgもかなり良いです。最近のhg は文字化け知らずですね。

hgweb で自分だけのhgハブサイトを作る。

(aa807be00ee84c05b6eaf6df83e136d0)


githubも良いんだけど、公開・非公開の管理が面倒だし。あれはgit cloneするためにあるようなもので不便。
自分で使うにはhgwebは超便利。hg であるていどたまったらgithubに出すのが理想。

hgweb のインストールと設定をする。

mercurialを入れる

これはインストール済前提で。

もしmercurialをeasy_installから入れるときは
sudo aptitude install python-setuptools #easy_install のインストール
sudo easy_install -U mercurial

hgwebのソースコードの場所を探す。hgをインストール済なら、どこかにあるはず。

hgwebを探す

sudo updatedb
sudo locate hgweb | grep cgi
/usr/share/doc/mercurial-common/examples/hgweb.fcgi
/usr/share/doc/mercurial-common/examples/hgweb.cgi
見つかったhgweb.cgi を動作させたいディレクトリにコピー
cp /usr/share/doc/mercurial-common/examples/hgweb.cgi /var/www/repos 
cp /usr/share/doc/mercurial-common/examples/hgweb.fcgi /var/www/repos # fcgiを使う場合

/var/www/reposで公開する。

/var/www/reposをhgwebのディレクトリにする。このディレクトリでhgwebを使う。

.htaccess
#起動設定
Options +ExecCGIAddHandler cgi-script .cgi
#AddHandler fcgid-script .fcgi #fcgi用
Order Allow,Deny
Allow from all

DirectoryIndex ./hgweb.cgi
#DirectoryIndex ./hgweb.fcgi # fcgi用

必要なら、httpd.confで /var/www/reposに allow override all または、execcgiをつけておく

fcgiを動かすときは

cgiはたいてい入ってるけど、fcgidはインストールが必要

sudo a2enmode fcgid
sudo service apache2 reload

hgweb.cgi の設定。(fcgiも同じ)

  5 # Path to repo or hgweb config to serve (see 'hg help hgweb') 
  6 config = "/var/www/repos/hgweb.config"  # 設定ファイルのパスを書く
  7

fcgiの場合は、hgweb.fcgiが編集対象

hgweb.config

先ほど指定した設定ファイルを編集する

[paths]
trunk = /var/www/repos/*
[web]
encoding = “UTF-8”

* を使うと該当ディレクトリ以下が全部対象になる。

スタイルを変えたい

スタイルを変えて遊ぶことが出来る

[web]
style=coal

各スタイルの見栄えについては、次を参照すると良い。 Logwatch for santa » hgweb の見た目を変更する


もっとスタイルを変えたい。

debianの場合は、次の場所にテンプレートの実体があった。

     locate mercurial | grep templates
     /usr/share/mercurial/templates


easy_install の場合は

/usr/local/lib/python2.6/dist-packages/mercurial-2.0.2-py2.6-linux-i686.egg/mercurial/templates/

にテンプレートファイルがあった。

それぞれ、templatesディレクトリにスタイル一式がある。

もし別のスタイルを作って使うなら、

/path/to/template/${style_name}

${style_name}で名前を決めてスタイルを作る。

これを hgweb.configに書く。

[web]
templates = /path/to/template/
styple = style_name


または、標準templatesのディレクトリで、コピーして、別名で作る。

参考資料:さらに認証するなど

参考資料。本家

HgWebDirStepByStep - Mercurial


eneloopの違いまとめ。種類を調べた。比較した。

エネループが種類多すぎてよく分からないので調べてみた。エネループには種類が多すぎる。








気にするべきポイント

エネループ世代別
発売時期によって異なる、市場には旧バージョンがあふれている
最新版はマイナーチェンジ版がおおい
さらに種類が増えた
充電器との組み合わせ
充電器にも旧版新版がある。

(1)エネループには世代別に3種類ある。

最古版エネループ 旧版エネループ 最新版エネループ

発売時期で細かい差異がある。互換性はある、性能も大きく変わらないので、神経質でなければ気にすることではない。


見分け方のポイントは回数。最新版と旧版は充電回数の表記が違う

1500回と書いてる物は古い。現行は1800回。

旧版の方が安い。だからその辺は随意に。次回からパナソニック版になる。だからまた新旧の差で混迷を極める。

ポイント
1800回と書いてあったら最新版。それ以外は旧版。ただし旧版の方が安く買えることが多い。

(2)最新版エネループには3種類が充電容量別にある。

見た目でぱっと違いが分かる3種類。

3種類あります。

eneloop
現行通常版
lite
価格を下げたもの。その分容量少ない
pro
容量を大きくした。その分値上がる

これらは、通常版をベースに用途に応じた使い分けが出来るようになっている。

これはそれぞれに単3・単4がある。

見た目での区別。
eneloop eneloop-lite eneloop pro
eneloop eneloop-lite eneloop pro
1900mAh 950mAh 2400mAh
1800回 2000回 500回
基本のeneloop eneloop lite
Liteは容量50%ダウン。
その分安価。
繰り返し性能10%UP
eneloop pro
Proは容量25%アップ、
その分高価
繰り返し性能75%ダウン
USB出力で使うと便利そう


用途別になっているので、用途が分からなければ通常版を買うのがよい。

(3)ただし色はアテにならない

http://ec2.images-amazon.com/images/I/61uXQW60PJL._AA1095_.jpg
http://ec2.images-amazon.com/images/I/811sjHNAY0L._AA1500_.jpg
http://ec2.images-amazon.com/images/I/81-FuL0P6eL._AA1500_.jpg


限定カラーとかあるから、基本色以外の色はアテに出来ない。


基本色以外を買うと、色で区別できなくなるよ!

(4)マイナーチェンジ版のplus


eneloop-plus

特殊マイナーバージョンとしてのPlus


性能は通常のエネループと変わらない

eneloop plus は 通常のeneloopをより安全性を高めた商品。正直なはなし、存在価値が分からない。Appleみたいに従来品を廃止してEneloopを全部Plusに置き換えたら良いのに。

充電池についてのまとめ

eneloop基本バージョン
1800回 1900mAh
eneloop 旧バージョン
 1500回
eneloop 最古バージョン
 1000回
eneloop plus
より安全性を高めた付加価値商品。
eneloop lite
容量さげて、手軽に買える。廉価版
eneloop pro
容量がほしい人向け。ただし充電回数少なめ。

(5)充電器について

充電器についても知っておく必要がある。

充電器も種類が多い。


三洋電機カタログより)
これにさらに旧バージョンや特殊形状が存在する。

(6)エネループ充電器には標準充電器がある。

NC-TGN01
これがエネループの充電器の比較の基本

今のところこの型番を基準に考えればいいみたいですね。

(7)値段と機能の違い

NC-TGR01とNC-TGL01の違い。

(廉価版)


安い方を買ったときには、性能が50%ダウン、だから値段も50%ダウン。

  • 充電時間が2倍以上かかる。
  • 1本で充電できない。
  • その分価格は安い(50%オフ)

充電時間は2倍時間がかかる、2本ペアになる、だから価格も50%オフ。

高い物はドコが違うのか
  • 1本ごとに充電完了が分かるモニタ搭載。
  • バッテリーチェッカーが一本分搭載。
  • 3倍速充電対応。

高い価格帯の商品にがついています。*1


(エネループ2倍速三倍速充電器)

(8)急速・高速充電対応

3倍速と2倍速があるです


(ハイーチェッカ)
(ハイー高速充電)

これらは3倍速対応

「急速」充電対応

(急速充電器ポータブル)

急速充電対応と書かれた物は基本的に2倍速。三倍速があるけれど「2倍速が急速充電器です。」

(9)エネループプロ充電器は?

エネループプロ充電器は通常の物です。色違い。型番はすべてNC-TGR01です。


(エネループプロ充電器)

(エネループプラス充電器)



(エネループ2倍速三倍速充電器)

プラス専用とプロ用と書いてあるけど、通常のエネループ充電器と同じ型番です。

充電器のまとめ

廉価版=基本版 - 急速充電機能なし = 1000円
高価版=基本版+充電チェッカー + 一本単位での充電チェック
携帯版=基本版  の半分サイズ、充電は2本単位

プロ用やプラス専用はその色だけ。中身は同じらしい

エネループ買おうと思ったけどありすぎて迷う

ヨドバシカメラの店頭でも、店員に説明を受けている人が多い。僕も正直よく分からない。

鉄則
最新版のセットを買う。

ライトは安いけど充電時間かかりすぎて使えない。

最後に挿したのどれだっけ?

継ぎ足し充電ができるeneloopの特性上使い終わったら、とりあえず挿しておく。おわったら取り替えるとい
カジュアルな使い方が便利。

・充電しておく。
・取り出す。
・なんとなく不安だから充電しておく
・とりあえず満タンにしておく。

などのカジュアルな用途を満たすには、4本が個別に充電できて、充電済が一目で分かった方が良い。それもどれが充電済みで、まだかが一目で分かった方が便利。

なので充電済ライトが個別に光る物を選ぶべきです。


Amazonでは、デザインが似過ぎて分からない

Amazonの写真では、形が似ていて一目で区別がつかない。

充電回数
1800回が最新版
型番
充電器の型番で種類が分かる。

(11)エネループ一覧表

これだけ見ても分かるように,種類は数限りなく存在する。

(エネループ一覧表)


しかも、三洋電機からパナソニックになったので、パナソニックエネループとかあってもう、手がつけられない。






感想:エネループは。なんでこんなことになったのか。

ブランドイメージの確立には成功した。エネループは成功。ブランドの確立とコンセプトの確率には成功した。
でも、成長を維持するのに失敗している。

顧客ニーズに応えるコトがサービスではない。好例

ラインナップの迷走、コンセプトの迷走。増え続ける種類。
顧客ニーズに応えたつもりかもしれないけれど、顧客ニーズに応えることが正しくない好例だとおもう。顧客ニーズに応えたつもりだろうけど、むしろ分かりづらいラインナップ。色もわかりにくい。

迷走するラインナップ

Lite/Pro/Plusの区別に、バージョンの違いはもはや迷走と断言する。
唯一の救いは互換性が保たれていること。しかし互換性は電池そのものの形状と電圧基準のおかげであって、三洋電機関係ないので。
「手軽に使える」という当初コンセプトが「種類多すぎて、使い分けが大変」になって崩壊してるよね。。。

モバイルブースターとエネループの充電が一カ所ですむようにしてほしいです。Qiはちょっと初期投資多すぎて困るし。電力も無駄になりそう。携帯電話が対応してたら使うのにね。エネループは「捨てない」という新しいlifestyleの提案だった。その新しさを取り戻してほしいです。



エネループの魅力が死んでしまう。こんなにラインナップがあると管理が面倒で。エネループの魅力が死んでしまう。



ジョブズなら、「もっとわかりやすく、2種類にしろ」と言ったに違いない。

もっとシンプルにやりましょう。

AmazonのAA

もしよかったら踏んでください。オススメです。





eneloop3倍速対応急速充電器セット(単4形4本付)

感謝です。

AA踏んでくださった方!感謝です!!

徹夜でエネループ調べて、その甲斐がありました。お役に立ててうれしいです。

僕の徹夜が報われた気がします。

2012-01-20追記。

色で区別とか言われたので、色を適当に買うと、区別に使えないことを明記するなど。

2012-01-25追記

なんかたくさん買っていただいたみたいです。みなさんの優しさに感謝です。

ありがとうございます。

2012-01-26 追記

更にたくさんの人に買っていただいたみたいです!!!

皆さんのお役に立てて嬉しいです。みなさんの優しさに嬉しいです。

BEAMSモデルのエネループ

人と同じじゃ嫌だ!って人向け。変わり者のエネループミッキーマウス・モデルに負けないくらいのイロモノ


*1:ただし上記の三種類の機能が全部ついた物はないみたい