OmniAICreator/Qiita-1.07M huggingface dataset:
Railsで使える便利な機能をRails以外で使いたい場合にGuardを使う

## 目的

```js:
//= require foo.js
```

でjavascriptファイルをくっつけて、minifyしたい..

```coffeescript:
class Person
  name: 'foo'
```

Coffeeも書きたい...

sass + compassを使いたい

```css:
@import "compass/css3";
@import "compass/reset";

.foo {
  @include border-radius(4px, 4px);
}
```

これらを使いたい...

しかし、使用しているフレームワークだとあまり対応していなかったり...

というときに、guardでとりあえず適当に使えるようにした。

https://github.com/kengos/guard-sample

### STEP 0

Rubyをインストール

### STEP 1

プロジェクト直下に`Gemfile`を追加

```Gemfile
source 'https://rubygems.org'

group :development do
  gem 'compass'
  gem 'uglifier'
  gem 'guard-sass', require: false
  gem 'guard-sprockets'
  gem 'guard-coffeescript'
  gem 'rb-inotify', require: false
  gem 'rb-fsevent', require: false
  gem 'rb-fchange', require: false
  gem 'growl', require: false
  gem 'terminal-notifier-guard', require: false
  gem 'rb-notifu', require: false
end
```

bundle install !!!

```
bundle install
```

### STEP 2

`Guardfile`を書く

```
bundle exec guard init
```

e.g.)

```Guardfile
guard 'coffeescript', input: 'assets/coffee', output: 'public/javascripts'
guard 'sass', input: 'assets/sass', compass: true, output: 'public/css', compress: true, style: :compressed
guard 'sprockets', destination: 'public/javascripts', asset_paths: ['assets/javascripts'], minify: true do
  watch(%r{^assets/javascripts/([^/]*)\.js$})
end
```

* `assets/coffee`以下の.coffeeが変更されたら、`public/javascripts`以下に設置
* `assets/sass`以下の`.scss` or `.sass`が変更されたら、`public/css`以下に設置
* `aasets/javascripts`以下の`.js`が変更されたら、`public/javascripts`以下に設置

監視するフォルダ、出力するフォルダをプロジェクト構成に合わせて、適切に設定してあげる。

### STEP 3

bundle exec guard !!!

```
bundle exec guard
```

これで`Gaurdfile`の設定に応じて、色々やってくれる。
a()とa.__call__()は等価ではない

タイトル通りです、知らなかったので自分用にメモ。

`a.__call__()` と `a()` は、オーバーライドしてみると実は__挙動が違う__ということが分かる。
`a()` は正確には `type(a).__call__(a)` を呼んでいる、らしい。

```py:
>>> class A(object):
...     def __init__(self):
...         print 'init of A'
...         
...     def __call__(self):
...         print 'call of A'
...         
...     def method(self):
...         print 'method of A'
...         
```

Aというクラスに `__init__` , `__call__`, `method`を定義する。
methodは普通のメンバ関数だから、 `a.method = hoge` などとすればメソッドのオーバーライドが可能。

```py:
# 普通に呼び出した時の処理を確認
>>> a = A()
init of A
>>> a.method()
method of A
>>> a()
call of A

# a.methodを上書きしてみる
>>> a.method = lambda: 'overriding method'
>>> a.method()
'overriding method'

# a.__call__も同じように上書きする
>>> a.__call__ = lambda: 'overriding call'

# a.__call__()の方は確かにオーバーライドされている
>>> a.__call__()
'overriding call'

# a()だとうまく行かない
>>> a()
call of A
>>> type(a).__call__(a)
call of A

# type(a).__call__を無理矢理上書きする
>>> type(a).__call__ = lambda a: 'new __call__'
>>> type(a).__call__(a)
'new __call__'

# うまく行った
>>> a()
'new __call__'

```

参考
=========================
http://www.rakunet.org/tsnet/TSpython/43/1292.html
zshのプロンプトにIPアドレスを表示したい

##必要動作
1. IPアドレスを表示 : 当然ですね
2. 複数OSに対応 : ディストリビューションの違いとかMacとかにも
3. わかりやすい内容 : あとから編集するの面倒だしね

といった動作が必要だなあと。

誰かやってるような気がするけど、まあ初投稿だしこんなもんでいいか(

##OS判定

上の必要動作の順番と違いますが、まあいいです。
2番目のやつを実現するために**os.sh**などというスクリプトを作りました。
内容は非常に単純で、unameからOSを判定するだけです。
で、そのあとIPアドレスを読み込むスクリプトを実行します。

```sh:.os.sh
#!/bin/sh

if [ `uname` = "Darwin" ] 
then
    ~/.zsh.d/ipaddr_m.sh
elif [ `uname` = "Linux" ]
 then
    ~/.zsh.d/ipaddr_l.sh
fi
```

##IPアドレス読込

###Mac OS X

筆者は、Macbook AirとiMacを使っているため、IPアドレスの取得を考えないといかんのですよね。

OS Xでは、ifconfigとうつとNICはen*で表現されるため、それの取得をどちらにするかがまた面倒なのよね。
筆者の環境ではこうなっています。

* iMac  
  * en0 : 有線  
  * en1 : 無線(通常は使わない)
* Macbook Air  
  * en0 : 無線  
  * en2 : 有線(USB Ethernet Adapter)

今回、Thunderbolt Ethernet Adapterは調査してません!
基本的には、有線のほうを優先(笑)しています。
そのため、ifconfig からen2があるかどうかを調査する必要が出てきます。
で、3行目がそれです(これって行番号出せれないの?)。
en2があるなら表示、ないならen0を表示。
iMacについては基本的にはen0のみを利用します。

```sh:ipaddr_m.sh
#!/bin/sh

ifconfig | grep en2 > /dev/null

if [ $? -eq 0 ]
then
	ifconfig en2 | grep -v inet6 | grep inet | cut -f 2 -d':' | cut -d' ' -f 2
 else 
 	ifconfig en0 | grep -v inet6 | grep inet | cut -f 2 -d':' | cut -d' ' -f 2
fi
```

###Linux

Linuxはsshで接続するのみなので、てきとーです。
環境がどうなってるのかわからんので、条件分岐もテキトーです。
わかったら直す予定。あくまで予定

```sh:ipaddr_l.sh
#!/bin/sh

if [ `/sbin/ifconfig | grep eth1`]; then
    /sbin/ifconfig eth1 | grep inet | grep -v inet6 | cut -f 2 -d':' | cut -d' ' -f 1
else 
/sbin/ifconfig eth0 | grep inet | grep -v inet6 | cut -f 2 -d':' | cut -d' ' -f 1
fi
hoge
```

##.zshrc

プロンプト設定は気にせずに…
ipという変数に`./os.sh`の出力結果(`ipaddr_*.sh`の出力結果)を格納して、それを出力します。
簡単ですね。

```sh:.zshrc

ip=`~/.zsh.d/os.sh`

# プロンプト設定
PROMPT="
[%n@%m($ip)] %{${fg[yellow]}%}%~%{${reset_color}%}
%(?.%{$fg[green]%}.%{$fg[blue]%})%(?!ζ*'ヮ'%)ζ <! ζ*;ヮ;%)ζ <)%{${reset_color}%} "

SPROMPT="%{$fg[red]%}%{$suggest%}ζ*'ヮ'%)ζ? < もしかして %B%r%b %{$fg[red]%}ですか? [うっう〜!(y), うっう〜!(n),a,e]:${reset_color} "
```
既存の公開鍵を消してしいまわない Travis CI と Heroku の連携方法

皆さん Travis CI 使ってますか？私は最近使い始めてその簡単さに驚きおののき，なんでもっと早く使ってなかったんだと激しく後悔しております．

テストの自動化が出来るならデプロイも自動化出来る？いやしかしこれはテスト特化のサービスなんじゃ…

そう思ってたのですがどうもデプロイ自動化も出来るらしいんですね．それで昨日早速試してみたら何と当たり前のように出来てしまいました．

Heroku の API Key を隠すこともきちんと出来るので安心っぽいです．

さてその方法に関しては，以下の記事が大変分かりやすいです．自動デプロイそのもののやり方に関しては今回うちでは解説しませんので，こちらを参考にして下さい．

* [Deploying to Heroku with Travis CI | Neil Middleton](http://www.neilmiddleton.com/deploying-to-heroku-from-travis-ci/)
* [Deploying to Heroku from TravisCI](http://metabates.com/2012/10/23/deploying-to-heroku-from-travisci/)
* [Travis CI からHerokuへのデプロイを自動化してみた - sinsokuのブログ](http://sinsoku.hatenablog.com/entry/2013/05/30/003855)

今回うちで改めて解説するのはタイトルにもある通りのことです．

先程の記事をそのまま参考にして自動デプロイを行おうとすると，

```bash
heroku keys:clear
```

というコマンドによって，普段自分が使っている (使っていた) 公開鍵が根こそぎ削除されてしまいます．これはつらぽよです．

なので上記のコマンドは削除して，追加された公開鍵だけを Heroku への push 後に削除すればいいと言えます．

それを行うための変更が以下の通りとなります．

```diff:.travis.yml
  ...
  after_success:
  - wget -qO- https://toolbelt.heroku.com/install-ubuntu.sh | sh
  - git remote add heroku git@heroku.com:HEROKU_APP_NAME.git
  - echo "Host heroku.com" >> ~/.ssh/config
  - echo "   StrictHostKeyChecking no" >> ~/.ssh/config
  - echo "   CheckHostIP no" >> ~/.ssh/config
  - echo "   UserKnownHostsFile=/dev/null" >> ~/.ssh/config
- - heroku keys:clear
  - yes | heroku keys:add
  - yes | git push heroku master
+ - heroku keys:remove $(cat ~/.ssh/id_rsa.pub | awk '{print $3}')
  env:
    global:
    - secure: |-
        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

`cat ~/.ssh/id_rsa.pub` で今回使った公開鍵を表示して，鍵の指定に必要な部分を awk で切り取って表示して，表示したもの `heroku keys:remove` の引数として使ってやる，という流れです．

なんでこんなことしないといけないかというと使われる公開鍵がビルドごとに毎回変わるんですよ Travis CI って．なので `heroku keys:clear` を取り除いただけではどんどん Travis CI の新しい公開鍵が追加されて行ってしまいます．それはそれでつらぽよです．

<del>個人的に，なんでこれがデフォルトじゃないのかが不思議です… (なんでデフォルトで `heroku keys:clear` なんてされてしまうのか…)</del>

すみません travis のデフォルトで `heroku keys:clear` されるんじゃなかったです．after_success で実行されるコマンドが自動生成されたと勝手に勘違いしていた自分が謎 (いや理由は分かってるんですが釈明するほどのことじゃない)．
演算子オーバーロードとドメインオブジェクト

演算子オーバーロードを使うと、何らかの数値情報を扱うようなドメインオブジェクト同士で演算を行う必要がある場合、ドメインオブジェクト自体を数値型のように扱えて便利だと思います。

```scala:Money.scala
case class Money(private val value: BigDecimal) {

  def +(that: Money): Money = new Money(this.value + that.value)

  def -(that: Money): Money = new Money(this.value - that.value)
        
  def >(that: Money): Boolean = this.value > that.value

  def >=(that: Money): Boolean = this.value >= that.value

  def <(that: Money): Boolean = this.value < that.value

  def <=(that: Money): Boolean = this.value <= that.value

  override def toString = this.value.toString
}
```

このようにするとMoneyオブジェクトを使う側からは以下の様な感じで利用可能です。

```scala:MoneySpec.scala
import org.specs2.mutable._

class MoneySpec extends Specification {
  "Money" should {
    "Moneyの加算" in {
      Money(100) + Money(200) must_== Money(300)
    }
    "Moneyの減算" >> {
      Money(200) - Money(100) must_== Money(100)
    }
    "Moneyの比較" >> {
      "==" in {
        val a = Money(100)
        val b = Money(100)
        val c = Money(100)
        a == b must_== true
        b == a must_== true
        b == c must_== true
        a == c must_== true
        a == Money(101) must_== false
      }
      ">" in {
        Money(100) > Money(99) must_== true
        Money(100) > Money(100) must_== false
      }
      ">=" in {
        Money(100) >= Money(99) must_== true
        Money(100) >= Money(100) must_== true
        Money(100) >= Money(101) must_== false
      }
      "<" in {
        Money(100) < Money(100) must_== false
        Money(100) < Money(101)
      }
      ">=" in {
        Money(100) <= Money(101) must_== true
        Money(100) <= Money(100) must_== true
        Money(100) <= Money(99) must_== false
      }
    }
    "Moneyを文字列に変換する" in {
      val Money100 = Money(100)
      Money100.toString must_== "100"
    }
  }
}
```
```scala:Caluculator.scala
object Caluculator extends App {
  val walet:List[Money] = Money(100) :: Money(200) :: Money(300) :: Nil 
  val sum:Money = (Money(0) /: walet) (_ + _)  
  println(sum.toString)
}
```

Moneyオブジェクト同士を+したり-するのは直感的なはず。
複数個前のコミットにさかのぼって履歴を書き換える

git 使うようになってまだ日が浅いけど、
初めてそこそこテクニカルなことをしたように感じたのでメモっておこう。

> コミット3:piyoファイルを修正
> コミット2:fugaファイルを修正
> コミット1:hogeファイルを修正

こんな感じで三回に分けてコミットしていて、
さあmasterにプッシュするぞという直前に
hogeファイルに追加で修正しないといけないものがあったと気づいた。

普通にコミットして

> コミット4:hogeファイルを修正(対応漏れ…)
> コミット3:piyoファイルを修正
> コミット2:fugaファイルを修正
> コミット1:hogeファイルを修正

こういう履歴にしたくなくって、
本来はコミット1でやっておくべきだったのでこれに含めたい。

最後のコミットpiyoへの追加ならgit commit --amendで済むのだけど、
これはちょっと複雑そう。

こんなふうにやるとできる。

- - -

`git rebase -i HEAD~3`
を実行すると、エディタが開いてこう表示される。

> pick <コミット1のhash> hogeファイルを修正
> pick <コミット2のhash> fugaファイルを修正
> pick <コミット3のhash> piyoファイルを修正

さかのぼりたいコミットのpickをeditに変更して保存する。

> edit <コミット1のhash> hogeファイルを修正
> pick <コミット2のhash> fugaファイルを修正
> pick <コミット3のhash> piyoファイルを修正

ワーキングディレクトリがコミット1の状態に戻るので、
本来含めるべきだった修正を行う。

`git add hoge`
`git commit --amend`
でコミット1をやり直す。

その後、
`git rebase --continue`
を実行すると、新しいコミット1の後にコミット2と3が適用された状態になる。

歴史の書き換え完了！

(masterにプッシュ後はやっちゃいけないだろうし、
 コミット2や3でもhogeファイルに対する変更がたくさん入っているとうまくいかないかもしれない。
 今回は、hogeに対する修正はコミット1でやらねば、それが正しい歴史のはず…という思いから
 このような小細工を試してみた。)
SublimeText2でproxy設定

#SublimeText2でproxy設定

とりあえず、設定にて追加をしておきましょう
ツールバーの
"Preferences" -> "Settings" -> "User"
あたり

```json:
{
    "http_proxy": "http://hoge.proxy.host:8080",
    "https_proxy": "http://fuga.proxy.host:8080"
}
```

## PackageControlのインストールが出来ない
プラグインをコマンドパレットでさくさくインストール・アンインストールできると評判のPackageControlですがproxy経由でアクセスしないとインストール出来ない環境では上記Preferences設定ではうまくいかないようだ。
以下のようにして対応してみた（`http://hoge.proxy.host:8080`の部分は適宜書き換えること）。

```
import urllib2,os; pf='Package Control.sublime-package';ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler({'http': 'http://hoge.proxy.host:8080'}))); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print 'Please restart Sublime Text to finish installation'
```

上記コマンドをctrl+`でコンソールを開いて実行。

これでもうまくいかない場合は https://sublime.wbond.net/installation から **Package Control.sublime-package** を直接ダウンロードしてSublime Text 2のメニューのPreference -> Browse Packagesに入れてSublime Text 2を再起動する。

## PackageControlで色々インストールしようとするとproxy効かない


Preferences -> Browse Packages実施後、 一階層上のInstalled Packagesフォルダ
にhttp://sublime.wbond.net/testing/Package%20Control.sublime-packageでDLしたファイルを置く
その後、
Preferences -> Package Settings -> Package Control -> Settings Default 
にてhttp_proxy と https_proxyを自分の環境に合わせて設定
【LDAP環境構築:5】 クライアントインストールから設定まで

###### インストール

```shell-session:
yum install openldap-clients nss-pam-ldapd
```
>
```
Dependencies Resolved
>
================================================================================
 Package               Arch        Version                   Repository    Size
================================================================================
Installing:
 nss-pam-ldapd         x86_64      0.7.5-18.1.el6_4          updates      152 k
 openldap-clients      x86_64      2.4.23-32.el6_4.1         updates      165 k
Installing for dependencies:
 nscd                  x86_64      2.12-1.107.el6            base         212 k
 pam_ldap              x86_64      185-11.el6                base          88 k
Updating for dependencies:
 openldap              x86_64      2.4.23-32.el6_4.1         updates      265 k
>
Transaction Summary
================================================================================
Install       4 Package(s)
Upgrade       1 Package(s)
```

###### 設定ファイルのバックアップ

```shell-session:
cp -av /etc/openldap/ldap.conf /etc/openldap/ldap.conf.org
cp -av /etc/nslcd.conf /etc/nslcd.conf.org
cp -av /etc/pam_ldap.conf /etc/pam_ldap.conf.org
cp -av /etc/nsswitch.conf /etc/nsswitch.conf.org
cp -av /etc/sysconfig/authconfig  /etc/sysconfig/authconfig.org
cp -av /etc/pam.d/system-auth-ac /etc/pam.d/system-auth.org
```

######  /etc/sysconfig/authconfig の FORCELEGACYを 「yes」 に変更

```shell-session:
diff -u /etc/sysconfig/authconfig.org /etc/sysconfig/authconfig
```
>
```
--- /etc/sysconfig/authconfig.org       2013-06-10 14:17:29.709999947 +0900
+++ /etc/sysconfig/authconfig   2013-06-11 06:19:16.210001198 +0900
@@ -6,7 +6,7 @@
 USESHADOW=yes
 USEWINBIND=no
 USEDB=no
-FORCELEGACY=no
+FORCELEGACY=yes
 USEFPRINTD=no
 FORCESMARTCARD=no
 PASSWDALGORITHM=sha512
```

###### authconfigでクライアント用のldap認証の設定変更を行う。

```shell-session:
authconfig --enableldap --enableldapauth --ldapserver=192.168.1.11 --ldapbasedn="dc=example,dc=com" --update
chkconfig nslcd on
```

###### ログイン時にホームディレクトリを作成するようにsystem-authファイルの最後に設定を追加

```shell-session:
echo "session    optional    pam_mkhomedir.so skel=/etc/skel umask=022" >> /etc/pam.d/system-auth
reboot
```

##### 確認

```shell-session:
id testuser
```
>
```
uid=9999(testuser) gid=9999(testgroup) 所属グループ=9999(testgroup)
```
【LDAP環境構築:4】 ユーザーLDIF作成から登録まで

#####LDAP サーバーへのデータの登録

###### ユーザー追加用LDIFファイル作成スクリプトの用意

```shell-session:
touch /etc/openldap/tmp/create_user_ldif.sh
chmod 700 /etc/openldap/tmp/create_user_ldif.sh
vi /etc/openldap/tmp/create_user_ldif.sh
```
>
```bash:create_user_ldif.sh
#!/bin/sh
>
read -p "ベースDN(例:dc=example,dc=com) : " BASE_DN_NAME
read -p "ユーザー名(例:testuser)        : " USER_NAME
read -p "ユーザーID(例:1001)            : " USER_ID
read -p "グループID(例:1001)            : " GROUP_ID
read -p "ユーザーパスワード(例:pass)    : " USER_PASSWORD
read -p "Home Directory(/home/testuser) : " USER_DIRECTORY
>
PASSWORD=$(slappasswd -s "${USER_PASSWORD}")
>
echo "
dn: uid=${USER_NAME},ou=People,${BASE_DN_NAME}
uid: ${USER_NAME}
cn: ${USER_NAME}
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: ${PASSWORD}
shadowLastChange: 15862
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: ${USER_ID}
gidNumber: ${GROUP_ID}
homeDirectory: ${USER_DIRECTORY}
"
```

###### ユーザー追加用LDIFファイル作成

```shell-session:
/etc/openldap/tmp/create_user_ldif.sh > /etc/openldap/tmp/user.ldif
```
>
```
ベースDN(例:dc=example,dc=com) : dc=example,dc=com
ユーザー名(例:testuser)        : testuser
ユーザーID(例:1001)            : 9999
グループID(例:1001)            : 9999
ユーザーパスワード(例:pass)    : pass
Home Directory(/home/testuser) : /home/testuser
```

###### ユーザー追加用LDIFファイルの登録

```shell-session:
ldapadd -x -D "cn=Manager,dc=example,dc=com" -W -f /etc/openldap/tmp/user.ldif
```
>
```
    adding new entry "uid=testuser,ou=People,dc=example,dc=com"
```

###### 確認


```shell-session:
ldapsearch  -x -b 'dc=example,dc=com' 'uid=testuser'
```
>
```
# extended LDIF
#
# LDAPv3
# base <dc=example,dc=com> with scope subtree
# filter: uid=testuser
# requesting: ALL
#
# testuser, People, example.com
dn: uid=testuser,ou=People,dc=example,dc=com
uid: testuser
cn: testuser
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
shadowLastChange: 15862
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 9999
gidNumber: 9999
homeDirectory: /home/testuser
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
```

###### 後片付け


```shell-session:
rm /etc/openldap/tmp/user.ldif
```
【LDAP環境構築:3】 グループLDIF作成から登録まで

##### LDAP サーバーへのデータの登録

######グループ追加用LDIF作成スクリプトを用意する

```shell-session:
touch /etc/openldap/tmp/create_group_ldif.sh
chmod 700 /etc/openldap/tmp/create_group_ldif.sh
vi /etc/openldap/tmp/create_group_ldif.sh
```
>
```bash:create_group_ldif.sh
#!/bin/sh
>
read -p "ベースDN(例:dc=example,dc=com) : " BASE_DN_NAME
read -p "グループ名(例:testgroup)       : " GROUP_NAME
read -p "グループID(例:1001)            : " GROUP_ID
>
echo "
dn: cn=${GROUP_NAME},ou=Group,${BASE_DN_NAME}
objectClass: posixGroup
objectClass: top
cn: ${GROUP_NAME}
gidNumber: ${GROUP_ID}
"
```

###### グループ追加用LDIFファイル作成


```shell-session:
/etc/openldap/tmp/create_group_ldif.sh > /etc/openldap/tmp/group.ldif
```
>
```
ベースDN(例:dc=example,dc=com) : dc=example,dc=com
グループ名(例:testgroup)       : testgroup
グループID(例:1001)            : 9999
```

######  グループ追加LDIFファイルを登録


```shell-session:
ldapadd -x -D "cn=Manager,dc=example,dc=com" -W -f /etc/openldap/tmp/group.ldif
```
>
```
    adding new entry "cn=testgroup,ou=Group,dc=example,dc=com"
```

###### 確認


```shell-session:
ldapsearch  -x -b 'dc=example,dc=com' 'cn=testgroup'
```
>
```
# extended LDIF
#
# LDAPv3
# base <dc=example,dc=com> with scope subtree
# filter: cn=testgroup
# requesting: ALL
#
# testgroup, Group, example.com
dn: cn=testgroup,ou=Group,dc=example,dc=com
objectClass: posixGroup
objectClass: top
cn: testgroup
gidNumber: 9999
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
```

###### 後片付け


```shell-session:
rm /etc/openldap/tmp/group.ldif
```
【LDAP環境構築:2】 ベースLDIFファイル作成から登録まで

##### LDAP サーバーへのデータの登録

###### ベースLDIFファイルの作成


```shell-session:
vi /etc/openldap/tmp/base.ldif
```
>
```text:
#-----------------------------------------------------------
# Domain
#-----------------------------------------------------------
dn: dc=example,dc=com
objectClass: dcObject
objectClass: organization
dc: example
o: Example Inc.
>
#-----------------------------------------------------------
# Manager (管理者エントリ)
#-----------------------------------------------------------
dn: cn=Manager,dc=example,dc=com
objectClass: organizationalRole
cn: Manager
description: Directory Manager
>
#-----------------------------------------------------------
# People (ユーザーエントリ)
#-----------------------------------------------------------
dn: ou=People,dc=example,dc=com
objectClass: organizationalUnit
ou: People
>
#-----------------------------------------------------------
# Group (グループエントリ)
#-----------------------------------------------------------
dn: ou=Group,dc=example,dc=com
objectClass: organizationalUnit
ou: Group
```

###### ベースLDIFファイルを登録する

```shell-session:
ldapadd -x -D "cn=Manager,dc=example,dc=com" -W -f /etc/openldap/tmp/base.ldif
```
>
```
adding new entry "dc=example,dc=com"
>
adding new entry "cn=Manager,dc=example,dc=com"
>
adding new entry "ou=People,dc=example,dc=com"
>
adding new entry "ou=Group,dc=example,dc=com"
```
DNSの更新反映を自動的に定期的にチェックするスクリプト


# 使い方

````shell
$ ruby dns_retry.rb google.com
````

````ruby
require 'net/dns'
require 'nsnotify'

target = ARGV[0]

puts "Start retry..."
puts Net::DNS::Resolver.start(target)

loop do
  print "."

  ans = Net::DNS::Resolver.start(target).answer
  if ans.count > 0
    Nsnotify.notify "Found", ans.join(" / ")
    break
  end

  sleep 60
end
````
この文字列は小数ですか？

```py:

# 事前に[" ", "\t", "\n", "\v", "\f", "\r"]辺りは削除
val = "2.71828"
str.isdigit(val.replace(".", "", 1))  # => True

val = "3.1.4.1.5.9"
str.isdigit(val.replace(".", "", 1))  # => False
```

dotを1つだけ削除してisdigit．
こんなんでいいのかな？なんかないの？みつかりません．
Ruby sort array of numbers

Example:

`[2,1,3].sort! { |a, b| b <=> a } # => [3,2,1]`
 
Use `_` to represent lowest number:

`sort_` of array `[2,1,3] # => [1,2,3]`


```rb:sort-num-arr.rb
def sort_ arr
  arr.sort { |a, b| a <=> b }
end
 
def _sort arr
  arr.sort { |a, b| b <=> a }
end
 
def sort_! arr
  arr.sort! { |a, b| a <=> b }
end
 
def _sort! arr
  arr.sort! { |a, b| b <=> a }
end
```
TypeScriptでのFactoryMethod

普通だ。

```ts:factory_method.ts
interface SlimeStatus {
  name: string;
  hitPoint: number;
  magicPoint: number;
  experiencePoint: number;
  gold: number;
}

var SlimeType = {
  normal: {
    name: "Slime",
    hitPoint: 6,
    magicPoint: 2,
    experiencePoint: 1,
    gold: 1
  },
  she: {
    name: "SheSlime",
    hitPoint: 10,
    magicPoint: 3,
    experiencePoint: 2,
    gold: 1
  },
  metal: {
    name: "MetalSlime",
    hitPoint: 4,
    magicPoint: 999,
    experiencePoint: 2010,
    gold: 14
  },
  liquidMetal: {
    name: "LiquidMetalSlime",
    hitPoint: 8,
    magicPoint: 999,
    experiencePoint: 20100,
    gold: 21
  } 
};

class Slime {
  name: string;
  hitPoint: number;
  magicPoint: number;
  experiencePoint: number;
  gold: number;

  constructor(status: SlimeStatus) {
    this.name = status.name;
    this.hitPoint = status.hitPoint;
    this.magicPoint = status.magicPoint;
    this.experiencePoint = status.experiencePoint;
    this.gold = status.gold; 
  }

  public static makeNormal(): Slime {
    return new Slime(SlimeType.normal);
  }

  public static makeShe(): Slime {
    return new Slime(SlimeType.she);
  }

  public static makeMetal(): Slime {
    return new Slime(SlimeType.metal);
  }

  public static makeLiquidMetal(): Slime {
    return new Slime(SlimeType.liquidMetal);
  }
}

module Runner {
  function viewStatus(slime: Slime): void {
    console.log("Name is: " + slime.name);
    console.log("Hit Point is: " + slime.hitPoint);
    console.log("Magic Point is: " + slime.magicPoint);
    console.log("Experience Point is: " + slime.experiencePoint);
    console.log("Gold is: " + slime.gold);
  }

  export function blame() {
    var slimes: Slime[] = [
      Slime.makeNormal(),
      Slime.makeShe(),
      Slime.makeMetal(),
      Slime.makeLiquidMetal()
    ];

    for(var i = 0; i < slimes.length; i++) { 
      console.log("---------------");
      viewStatus(slimes[i]);
    }
  }
}

Runner.blame();
```

結果

```zsh:
---------------
Name is: Slime
Hit Point is: 6
Magic Point is: 2
Experience Point is: 1
Gold is: 1
---------------
Name is: SheSlime
Hit Point is: 10
Magic Point is: 3
Experience Point is: 2
Gold is: 1
---------------
Name is: MetalSlime
Hit Point is: 4
Magic Point is: 999
Experience Point is: 2010
Gold is: 14
---------------
Name is: LiquidMetalSlime
Hit Point is: 8
Magic Point is: 999
Experience Point is: 20100
Gold is: 21
```

# やはり、

interfaceでアクセス権(public, private)やstaticなどの定義できるといいんだけどな...
抽象クラス書くのめんどうくさいけど本来のTypeScriptを使う目的としては要らない場面なのかも。
(今回はFactoryMethodをもたせているClassはBaseからの継承などしていない)
Ruby の syntax sugar でハマる


昨日の日付の Date object を取ろうとしてこうやった

```
Date.today - 1
```
けれど、Ruby はメソッドの () を省略して引数かけるので、おそらくこれはこう解釈されてる

```
Date.today(-1)
```

やりたいことはこう書けばいけた

```
Date.today() - 1
```

普段 Ruby 使ってないので細かいところでつまづいたのでメモ。
というかZabbixって何

# Zabbixというのは統合監視ソフトの一つです

サーバ落ちたとか、そういうのをメールで教えてくれたりします。

管理画面上ではグラフを描いてくれたりもします。時系列データに強いです。

ソフト自体はオープンソースです。CentOSやUbuntu (12.04 LTS) 等にはふつーにパッケージで入ってます

# Agentとやりとりします。Agentなしの監視もできます

監視対象がLinuxやWindowsならZabbx Agentと呼ばれるものをインストールすることで相手からの情報を積極的に受け取れます。cpuのload averageとかも取得できます。

Agentなしでも外から観測できる範囲で監視できます。pingがかえって来なかったとか、外からhttpdに接続しようとしたけど繋がらなかったよ、とか言ってくれます。

SNMPにも対応してます。

# ほとんどの設定はGUIでできます

phpで書かれたフロントエンド経由でServerとやりとりするのがふつーです。

上記のグラフ等はこのWebページ的な管理コンソールの話です

# Zabbix ServerのバックエンドはSQLです

MySQL中心での開発プロセスだ、と、とある本に書いてあるんですが、2.0.6のリリースノートでテストされた環境ではPostgreSQLとかも含まれています。

大量に監視するとなるとやはりメモリ食います。DB自体の負荷も結構なものです。

# APIがあるので外部から命令出せたりします

JSON形式でデータを取得したり、設定を書き換えたりできます。PHP、Ruby、Perl、Python等でラッパーライブラリが手に入ることが多いです。

1.8ではドラフト段階、2.0で正式APIとなりました。

# オープンソースですが、本家はそれでビジネスやってます

最近増えたビジネスパターンです。オープンソースで出ている範囲でも相当色々出来ますが、お仕事で監視というのはそれだけではありませんものね。
Springのバリデーションメッセージのプロパティファイルにプレフィックスをつける

Springのバリデーションメッセージのプロパティファイルにプレフィックスをつける。

```java:
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
	...
	@Override
	public MessageCodesResolver getMessageCodesResolver() {
		DefaultMessageCodesResolver resolver = new DefaultMessageCodesResolver();
		resolver.setPrefix("validation."); // ここでプレフィックスを指定
		return resolver;
	}
}
```

messages.properties はこんな感じ。

```properties:
# validation
validation.typeMismatch=正しい書式で入力してください
validation.NotNull=入力必須です
```
iOS7対策にとりあえず見ておいたらよさそうなリンク一覧


## ios7のデモビデオとギャラリー

 http://www.apple.com/ios/ios7/

まずは衝撃をうけるために。
既存アプリとかで存在価値が無くなりそうなのがありそう...

## iosデザインリソース

https://developer.apple.com/library/prerelease/ios/design/index.html

- UI移行ガイド
- ヒューマンインターフェースガイドライン
- UIKitユーザーインターフェースカタログ

へのリンクがある。

下の2つは長いので、移行ガイドだけ読めばとりあえず良さそう。

## ios7 UI移行ガイド

https://developer.apple.com/library/prerelease/ios/documentation/UserExperience/Conceptual/TransitionGuide/index.html

とりあえず移行するには何をすればいいかを知ることで、エンジニアは今後の対応策が多少は練れるはず。

クリックしなくても、スクロールで全部が見れるPDF版のほうがいいかも。
https://developer.apple.com/library/prerelease/ios/documentation/UserExperience/Conceptual/MobileHIG/MobileHIG.pdf


## ios7 ディベロッパー用サイト
https://developer.apple.com/ios7/

新しくなった各機能へのリンクがある


* とりあえずxcode5はダウンロードする
 - まずはiOS7のシミュレータを動かすとちょっと勝った気になれる
* 勇気ある人はもう元には戻せないのを覚悟の上で自分のiPhoneをios7 betaにする
 - バックアップ使えば元に戻せるみたいです。完璧に戻るのかよくわかりませんが。とりあえずアップグレードする前にバックアップを取りましょう
 - うちの人柱によると、かっこいいけど重くなる、既存アプリのレイアウトが崩れたり動かなくなったりがあるらしいです
 - 僕はまだ自分の携帯をこれにしようとは思えませんが、ただ、隣で使ってるのを見るとカッコいいので誘惑されます

をやったらいいのでは？

## Xcode5の新機能

https://developer.apple.com/technologies/tools/whats-new.html

iOSもテストに力を入れ始めたらしいw
ブレーク ポイントは現在の設定ではヒットしません

Visual Studio 利用時に、javascript がブレークポイントで停止しないときの対処法

基本は以下でデバッグ可能。

* Web.config で Debug=True
* IE で［スクリプトのデバッグを使用しない (Internet Explorer)] をOFF

うまくブレークしてくれない場合は、javascript のソース内に以下を記述

``` javascript
debugger
```

[debugger Statement (JavaScript)](http://msdn.microsoft.com/en-us/library/ie/0bwt76sk%28v=vs.94%29.aspx)
iOS/Androidブラウザでデバッグ

iOSやAndroid上でJavaScriptが期待したとおりに動いてくれない。
特にAndroid2.3系では毎回つまずいてしまいます。

そこで、リモートで手軽にデバッグ出来る便利なツールを教えてもらいました。

## weinre

このツールを使えばスマホのブラウザやアプリのWebViewのjs, css, DOMやらをPCからリモートで色々できて便利らしい。

インストール（最新版はnode.jsで実装されています。）

```
% npm -g install weinre
```

weinreを起動

```
% weinre --boundHost 192.168.xxx.xxx
```

デフォルト起動だと、ローカルホストからの接続しか受け付けないので--boundHostオプションでIPアドレスを与えます。

ブラウザから`http://192.168.xxx.xxx:8080/`へアクセスして、こんな画面が出たら準備完了です。

![weinre01.png](https://qiita-image-store.s3.amazonaws.com/0/13113/2434eac0-2eea-7761-18c6-b359e97a9c90.png)


あとはスマホからデバッグしたいページを表示して、そのページのHTMLを変更出来るのであれば、スクリプトタグを貼り付けるのが手軽ですが、出来ない場合はブックマークレットを使います。

![weinre02.png](https://qiita-image-store.s3.amazonaws.com/0/13113/5ceb6c27-1599-72d0-2075-9c6e52762ffd.png)


`debug client user interface`のリンクから、見慣れた画面へ。

![weinre03.png](https://qiita-image-store.s3.amazonaws.com/0/13113/13955be6-5073-31fd-003c-7b6841fa53c4.png)

使い方はFireBugやChromeのデベロッパーツールと同じです。
DOMを選択するとブラウザ側の要素にハイライトが出て、本当に同じように使えます。

![weinre04.png](https://qiita-image-store.s3.amazonaws.com/0/13113/84cfb187-4f11-1879-afce-56f9a9a2c94f.png)

めっちゃ便利でした！
Java 8 で累積和等

+ このバージョンは正式リリース前です。

20以上40未満の等差数列和（＋１版）

## いままで

```java:
int i, j = 0, s = 20, e = 40;
for (i = s; i < e; i++) {
	j += i;
}
System.out.println(j);
```

## Java 8

``` java:
System.out.println(java.util.stream.IntStream.range(20, 40).sum());
```

連続する数値なら初期化が楽ですね。

### 応用　
20以上40未満の等差数列和（３の倍数）

```java:
System.out.println(IntStream.range(20, 40).filter(new IntPredicate() {

	@Override
	public boolean test(int arg0) {
		return arg0 % 3 == 0;
	}
}).sum());
```

```java:lamuda
System.out.println(IntStream.range(20, 40)
    .filter(arg0->{ return arg0 % 3 == 0;}).sum());
```
CreateJSのPreloadJSが1つずつしかロードしない爆遅仕様なので、並列ロードさせて速くさせる(maxConnection追記あり)


## 対象: CreateJSやり始めました的なひと。ロード遅いよねと思ってるひと


です。

## 目標: 速くロードできるようになります

です。

## 試したバージョンはPreloadJS 0.3.1

です。

## PreloadJSの現状 = 驚愕の「1つずつロード」


びっくりすることにPreloadJSはデフォルトでは

- 1つずつ

ロードされる。<del>なぜかはわからない。</del>


----

### 追記 setMaxConnectionがあると教えてもらいました！

LoadQueueクラスの最大接続数のデフォルトが1でした。

なので、1つずつしかロードしてませんでした。

----



ブラウザは一つずつ画像をロードしてたらチンタラすぎるので、普通は6つのリクエストを同時に扱えるものである。(適当なサイトを開いてDevToolsのNetworkを見ればわかる)

(HTTP1.1の仕様では同時接続は2つらしいが、そんなの守ってるブラウザはない。**最近のブラウザは「6」**だそうだ。)  
[身につけておきたいWebサイト高速化テクニック #2｜検証ツールとそもそもHTTPって何だ編 ｜ Developers.IO](http://dev.classmethod.jp/server-side/web-acceleration-tools-and-http/)



## スマホでの同時リクエスト数は4か6

調べたらここに書いてあった  
[Why Domain Sharding is Bad News for Mobile Performance and Users | Mobify](http://www.mobify.com/blog/domain-sharding-bad-news-mobile-performance/)

| browser         | connection |
|:---------------:|:----------:|
| Safari mobile   | 6 |
| Android browser | 4 |
| Chrome mobile   | 6 |
| Firefox mobile  | 4 |


どれがAndroidなのかよくわからないけど、まあこんな感じなのだろう。




## Toolkit for CreateJSでの吐き出されるソース

```javascript
	var manifest = [
		{src:"hoge1.png", id:"hoge1"},
		{src:"hoge2.png", id:"hoge2"},
		{src:"hoge3.png", id:"hoge3"},
		{src:"hoge4.png", id:"hoge4"}
	];
	
	var loader = new createjs.LoadQueue(true);
	loader.addEventListener("fileload", handleFileLoad);
	loader.addEventListener("complete", handleComplete);
	loader.loadManifest(manifest);
```


これだと1つずつしかロードできない。

コメントで教えてもらった loader.setMaxConnectionsを追加してみる。

```javascript
	loader.setMaxConnections(6);
```

とすると、ちゃんと並列ロードしてくれました！ヤッター！

というお話でした！わーい！

でもまあ、最終的にSpriteSheetにするんだけどね！←Base64にするかも！
Ubuntu12.04から12.10にアップグレードしたら起動しなくなりました。→起動できました。

## Motivation

 - 12.04版をそろそろ上げてみたい
 - cinnamonを使ってみたい（バージョンにはあまり関係がない）
 - gccのバージョンを上げたい。


## Ubuntuのアップグレード

「ソフトウェアの更新」から「設定」ボタンを押し、「アップデート」タブの「Ubuntuの新バージョンの通知」を「すべての新バージョン」にすると、12.10にアップグレードできます。


## アップグレード後の症状

再起動すると一瞬Ubuntuのロゴ（？）が出て、その後ログイン用の画面が出るところで真っ黒になりました。「ubuntu 12.04 12.10 アップグレード」等でググるとgrubの問題というのが色々出てきましたが、Ubuntuっぽい画面が一瞬見えたということはgrubの問題ではなさそうです。


## HDDの確認

起動時にCTRLキーとかF6キーとか色々と押していたらTextModeで起動しました。ということは少なくともソフトのインストールやカーネルの更新に失敗したということではなさそうです。すかさずログインした後に startx をすると、ドライバがなくて X が起動できないと仰られました。

LiveCD(12.04版)を立ち上げて、 ```mount /dev/sda1 /mnt``` して ```ls /mnt/usr/lib/xorg/modules/drivers``` すると openchrome_drv.so しかありません。 ```ls /usr/lib/xorg/modules/drivers``` すると、20個近くファイルがあります。ユリイカという気分です。


## 原因

ドライバがなく、X が立ち上がらなかったようです。


## 対処

```cmp /usr/lib/xorg/modules/drivers/openchrome_drv.so /mnt/usr/lib/xorg/modules/drivers/optnchrome_drv.so``` で12.04版のものと、12.10版のものを比較し、差分がないことを確認したので、試しに12.04版のモジュールを12.10版のところにコピーしました。マウスドライバ等もなかったので、 /usr/lib/xorg/modules 配下をすべてコピーしました。

再起動後、普通のubuntuのログイン画面が出てログインすることができました。
ソフトウェアの更新を行い、ひとまずは問題なく動いています。


## その後

cinnamonを導入し、快適に過ごしています。
13.04への更新を勧められていますが、ちょっと躊躇しています。
UILabelやUIViewでぴったりのサイズを取得する

UILabelとかに文字を挿入した後に、それがぴったり入るサイズを計算したい場合があります。
このような場合、sizeToFitを実行することでビューのサイズが最適なものに変更されます。

```objc
[_titleLabel sizeToFit];
```

ただ、変更せずにサイズを取得したい場合や、
そのサイズを元に変更を加える場合などが存在します。

このような場合に使えるのがsizeThatFitsで、
自分のサイズを変更せずに、要素がぴったり入るサイズを返してくれます。

```objc
CGSize maxSize = CGSizeMake(parentWidth,parentHeight);
CGSize titleLabelSize = [_titleLabel sizeThatFits:maxSize];
```
WindowsストアアプリでTLS/SSL自己署名証明書を使う

Windowsストアプリでは証明書拡張機能を使ってアプリケーションと一緒にデジタル証明書をインストールする方法が用意されている。
WindowsストアアプリにおいてTLS/SSL自己証明書をインストールする方法について説明する。

## 証明書を準備する
Windowsストアアプリでは通信接続先のサーバホスト名と証明書のCommon Nameが一致しているかチェックされるため、Common NameについてFQDNまたはIPアドレスを正確に指定して自己署名証明書を作成する。
今回はサーバIPアドレスが192.168.1.101の自己署名証明書ファイルserver-crt-192p168p1p101.pemと仮定する。

```bash:秘密鍵の作成
$ openssl genrsa -out server-key-192p168p1p101.pem 2048
```

```bash:証明書署名要求の作成
$ openssl req -new -key server-key-192p168p1p101.pem -out server-csr-192p168p1p101.pem
```

```bash:自己署名証明書の作成
$ openssl x509 -req -days 365 -in server-csr-192p168p1p101.pem -signkey server-key-192p168p1p101.pem -out server-crt-192p168p1p101.pem
```

## アプリに証明書を配置する
準備した証明書ファイルをドラッグ＆ドロップによりWindowsストアプリの適当な場所に配置する（下記例ではAssetディレクトリ以下に証明書ファイルを配置）。
各証明書ファイルのプロパティについて下記の通り設定する。

* ビルドアクション:　コンテンツ
* 出力ディレクトリにコピー:　常にコピーする

![SolutionExplorer_101_80p_check.png](https://qiita-image-store.s3.amazonaws.com/0/16102/a7bfa777-7a37-2ad7-106d-8c355dc08c8f.png "ソリューションエクスプローラー") ![Property_101_80p_check.png](https://qiita-image-store.s3.amazonaws.com/0/16102/6019ccdf-49d3-453a-9e67-45d926cab5d1.png "プロパティ")

## マニフェスト宣言を行う
1. サポートされる宣言について証明書を選択する。
2. 各証明書について、ストア名にはRoot、コンテンツには該当証明書ファイル場所を入力する。
3. 複数の証明書をアプリ側（アプリコンテナ）から自動選択させる場合は、自動選択にチェックを入れる。

![Appmanifest_101_70p_check.png](https://qiita-image-store.s3.amazonaws.com/0/16102/41b1e7e3-bd48-876e-8ab0-51e94efc58d7.png "Package.appxmanifest")
  
Package.appxmanifestファイルに直接XML形式で記述する際は、Extensionsタグ内に記述する。

```xml:Package.appxmanifest一部抜粋
  </Capabilities>
  <Extensions>
    <Extension Category="windows.certificates">
      <Certificates>
        <Certificate StoreName="Root" Content="Assets\server-crt-192p168p1p101.pem" />
        <SelectionCriteria AutoSelect="true" />
      </Certificates>
    </Extension>
  </Extensions>
</Package>
```

　
\[参考URL\]
[How to connect to a Http Rest Service with Self Signed Certificate(in the server side).](http://social.msdn.microsoft.com/Forums/windowsapps/en-US/4a776e8c-0e10-4f03-908f-7f765d914080/how-to-connect-to-a-http-rest-service-with-self-signed-certificatein-the-server-side "Dev Center - Windows Store apps")
multiple-cursorの連番挿入機能の拡張

multiple-cursor.el(ver1.2.1)で連番を挿入できる関数`mc/insert-numbers`は、連番の開始番号しか選択できません。
cua-modeのように問い合わせで増加数や0埋めを指定したかったので走り書きしました。

設定をコピペして反映させ、multiple-cursor使用時に
`M-x my/mc/insert-numbers`を呼び出せば以下のプロンプトが表示されます。

+ Start from (default 0): 開始番号
+ Increment by (default 1): 増加数
+ Padding (default %01d): 0埋め、空白埋めなどのフォーマット(%03d, %5d)

-------------
```el:.emacs.d/init.el
    ;; insert specific serial number
    (defvar my/mc/insert-numbers-hist nil)
    (defvar my/mc/insert-numbers-inc 1)
    (defvar my/mc/insert-numbers-pad "%01d")

    (defun my/mc/insert-numbers (start inc pad)
      "Insert increasing numbers for each cursor specifically."
      (interactive
       (list (read-number "Start from: " 0)
             (read-number "Increment by: " 1)
             (read-string "Padding (%01d): " nil my/mc/insert-numbers-hist "%01d")))
      (setq mc--insert-numbers-number start)
      (setq my/mc/insert-numbers-inc inc)
      (setq my/mc/insert-numbers-pad pad)
      (mc/for-each-cursor-ordered
       (mc/execute-command-for-fake-cursor
        'my/mc--insert-number-and-increase
        cursor)))
    
    (defun my/mc--insert-number-and-increase ()
      (interactive)
      (insert (format my/mc/insert-numbers-pad mc--insert-numbers-number))
      (setq mc--insert-numbers-number (+ mc--insert-numbers-number my/mc/insert-numbers-inc)))
```
Int, Integer, Double


Sometimes, ghc throws following error:

>
<interactive>:7:21:
    Couldn't match expected type `Double' with actual type `Int'
    In the second argument of `(/)', namely `(3 :: Int)'
    In the expression: (10.0 :: Double) / (3 :: Int)
    In an equation for `it': it = (10.0 :: Double) / (3 :: Int)

(/) required to have the same type, which is Fractional type class.

```haskell
Prelude> :t (/)
(/) :: Fractional a => a -> a -> a
```

```haskell
Prelude> :i Int
data Int = GHC.Types.I# GHC.Prim.Int# 	-- Defined in `GHC.Types'
instance Bounded Int -- Defined in `GHC.Enum'
instance Enum Int -- Defined in `GHC.Enum'
instance Eq Int -- Defined in `GHC.Classes'
instance Integral Int -- Defined in `GHC.Real'
instance Num Int -- Defined in `GHC.Num'
instance Ord Int -- Defined in `GHC.Classes'
instance Read Int -- Defined in `GHC.Read'
instance Real Int -- Defined in `GHC.Real'
instance Show Int -- Defined in `GHC.Show'
```

fromIntegral helps to convert Integer or Int to Num.

http://en.wikibooks.org/wiki/File%3aClasses.png

```haskell
Prelude> :t fromIntegral 
fromIntegral :: (Integral a, Num b) => a -> b
```

Still Num is not Fractional.
Mac で必要そうな Homebrew で入れるもの

    brew install --disable-etcdir zsh
    brew install tmux
    brew install reattach-to-user-namespace
    brew install git
    brew install coreutils
    brew install mobile-shell
    brew install nkf
    
    # emacs
    brew install cmigemo
    brew install --with-lang-en aspell

思い出したら書き足そう…
Macの最小音量

F11の音量減少ショートカットを使うと音量0がスピーカーOFFになってしまうが、F10のスピーカーONOFFを使うと音量0の状態で音が出せる。

10.8.4

手順
・F11で音量を0にする（この状態では音はならない）
・F10を押す
gitコマンドメモ

# clone関連

### cloneする時、トップのディレクトリ名を変更する

grit -> mygrit になる

```
git clone git://github.com/schacon/grit.git mygrit
```

# commit関連

### 削除フィルをインデックスに反映する
commitは追加、編集と同様

```
git add -u
```

# branch関連

### remote branchからlocal branchを作成
git checkout -b [new local branch] [remote branch]

```
git checkout -b feature/fixbugremotes/origin/feature/fixbug
```

### masterの修正をbranchにmerge

```
git checkout [branch] 
git merge master
```

# git stash

### 作業内容の一時保存

```
git stash save
```

### stashの一覧
```
git stash list
```

# git-flowの開発

## 初期化

``` 
cd GIT_ROOT
git flow init
```

## 機能用のbranch作成

```
git checkout [devekop_branch]
git flow feature start [branch_name]
```

# tag

## tag設定

### 注釈付き版

```
git tag -a v1.0 -m 'my version 1.0'
```

### 軽量版

```
git tag v1.0
```

## tag確認

### 一覧

```
git tag
```

### 詳細

```
git show v1.0
```
xampp文字化け対策

.phpに
mb_internal_encoding("utf-8");
mysql_query("SET NAMES utf8",$db);

php.ini
260行あたり
output_buffering = 4096
810行あたり
default_charset = "UTF-8"
1870行あたり
;mbstring.http_input = auto
;mbstring.http_output = SJIS
1890行あたり
;mbstring.detect_order =auto
;mbstring.substitute_character = none
と変更
mysql.iniはいじらず。
これで解決しました。
締め上げ暗号分析による秘密鍵パスフレーズ入手の合法性

PGPやPKIでの暗号化や電子署名に使われる公開鍵暗号方式では、暗号文（の鍵)の復号、メッセージダイジェストへの署名、および第三者への信頼の付与に秘密鍵を用いるため、秘密鍵は厳重に管理する必要があります。その一環として、秘密鍵自体を通常パスフレーズによって暗号化し、必要なときだけ、このパスフレーズを入力して秘密鍵を取り出すことになります。

現代では、適切な暗号化方式、パスフレーズを用いている場合、技術的暗号解析は計算量の点から困難です。例えば、2003年にイタリア警察およびFBIが極左テロ組織からPDAを押収したものの、PGPによって暗号化されたファイルを復号することはできなかったそうです。

>In 2003 an incident involving seized Psion PDAs belonging to members of the Red Brigade indicated that neither the Italian police nor the FBI were able to decrypt PGP-encrypted files stored on them.
>https://en.wikipedia.org/wiki/Pretty_Good_Privacy#Security_quality

そこで、ソーシャルエンジニアリングによる暗号解析が、より現実的な解析手段となります。ここでは、刑罰の示唆による締め上げ暗号分析(Rubber-hose cryptanalysis)が、政府機関によって合法的に行えるのかどうか調べてみました。

>Non-violent but highly intimidating methods include such tactics as the threat of harsh legal penalties.
>https://en.wikipedia.org/wiki/Rubber-hose_cryptanalysis

英国では、"Regulation of Investigatory Powers Act 2000"により、政府機関は暗号化を解除するためのキーを要求でき、これを拒否した人物は実刑判決を受けています。

>The Act ... enables certain public bodies to demand that someone hand over keys to protected information
>https://en.wikipedia.org/wiki/Regulation_of_Investigatory_Powers_Act_2000#Summary
>He was charged with ten offences under section 53 of RIPA Part III, reflecting the multiple passphrases needed to decrypt his various implementations of PGP Whole Disk Encryption and PGP containers.
>http://www.theregister.co.uk/2009/11/24/ripa_jfl/page2.html

米国では、[United States v. Boucher](https://en.wikipedia.org/wiki/United_States_v._Boucher)という裁判で、合衆国憲法修正第5条(Fifth Amendment)に基づく、不利益な供述(self-incrimination)を強要されない権利との兼ね合いが争点となったようです。（なお、米国の刑事ドラマによく出てくるYou have the right to remain silentというセリフは、この修正第5条に基づいています)

当初、下級判事の判断はパスフレーズの提供は不利益な供述の強要にあたるとしました。しかし政府の上告後、連邦判事は、復号化されたデータの提供は、不利益な供述の強要には当たらないとの判断を下し、結局被告はデータを開示し実刑を受けました。

特筆すべき点として、このケースでは、デバイスの押収時には違法なデータが目視確認されていました。ただ、押収後の再起動に伴いパスフレーズが必要となったようです。

>Additionally, a judge ruling on the same case in November 2007 has stated that forcing the suspect to reveal his PGP passphrase would violate his Fifth Amendment rights i.e. a suspect's constitutional right not to incriminate himself. The Fifth Amendment issue has been opened again as the case was appealed and the federal judge again ordered the defendant to provide the key.
>https://en.wikipedia.org/wiki/Pretty_Good_Privacy#Security_quality

また、秘密鍵パスフレーズに関するケースかどうかは分かりませんが、次のような判決もありました。

前項と同様に、電話傍受によって違法なデータの存在が確認されていた別のケースでも、修正第5条は適用外とされ、復号が命じられました。

> “I conclude that the Fifth Amendment is not implicated by requiring production of the unencrypted contents of the Toshiba Satellite M305 laptop computer,”
>https://en.wikipedia.org/wiki/Key_disclosure_law#United_States

一方、違法なデータが存在する証拠を検察が得ることができなかったケースでは、復号の強要は、修正第5条違反となるとの判断が下されました。

>In United States v. Doe, the United States Court of Appeals for the Eleventh Circuit ruled on 24 February 2012 that forcing the decryption of one's laptop violates the Fifth Amendment
>https://en.wikipedia.org/wiki/Key_disclosure_law#United_States

*本記事は、ソーシャルエンジニアリングに関する技術的な記事であり、政治的な意図はありません。また、法律用語が不正確かと思いますがご了承ください。*
Java 8 新機能 Map<K,V>#replace(K,V,V)

+ このバージョンは正式リリース前です。

条件に一致するものを削除することためのクラス＋メソッドが追加された

```java:
Map<String, String> map = new LinkedHashMap<>();
map.put("key1", "value");
map.put("key2", "value2");
map.put("key3", "value3");

// key, value ともに一致する
System.out.println(map.replace("key1", "value", "value2"));

// key のみ一致する
System.out.println(map.replace("key1", "value3", "value4"));

map.forEach(new BiConsumer<String, String>(){
	@Override
	public void accept(String key, String value) {
		System.out.printf("key=%s, val=%s %n", key, value);
	}
});

```

#### 実行結果

```
true
false
key=key1, val=value2 
key=key2, val=value2 
key=key3, val=value3 
```

key value ともに一致した場合置き換える、つまり別システム連携でもない限り使わない気がする。
精々 { sex : 1 }.replace("sex", "1", "man") 等？
Java 8 新機能 Collection#removeIf

+ このバージョンは正式リリース前です。
+ 正式リリースされましたが、関連メソッドに変更はない模様


条件に一致するものを削除することためのクラス＋メソッドが追加された

```java:基本
        list =new ArrayList(Arrays.asList(1,2,3,4,5,6,7,8,9,10,11));
        list.removeIf(a->{ return a%3==0;});
        list.forEach(a -> { System.out.printf("consumer1: %5d %n", a);});
```

```java:or
        Predicate<Integer> predicate2 = a->{ return a % 3 == 0;};
        Predicate<Integer> predicate3 = a->{ return a % 5 == 0;};

        list =new ArrayList(Arrays.asList(1,2,3,4,5,6,7,8,9,10,11));
        list.removeIf(predicate2.or(predicate3));
        list.forEach(a -> { System.out.printf("consumer2: %5d %n", a);});
```

```java:and
        Predicate<Integer> predicate2 = a->{ return a % 3 == 0;};
        Predicate<Integer> predicate3 = a->{ return a % 5 == 0;};

        list =new ArrayList(Arrays.asList(1,2,3,4,5,6,7,8,9,10,11));
        list.removeIf(predicate2.and(predicate3));
        list.forEach(a -> { System.out.printf("consumer3: %5d %n", a);});
```



#### 実行結果

```
consumer1:     1 
consumer1:     2 
consumer1:     4 
consumer1:     5 
consumer1:     7 
consumer1:     8 
consumer1:    10 
consumer1:    11 
```

---

```
consumer2:     1 
consumer2:     2 
consumer2:     4 
consumer2:     7 
consumer2:     8 
consumer2:    11 
```

---

```
consumer3:     1 
consumer3:     2 
consumer3:     3 
consumer3:     4 
consumer3:     5 
consumer3:     6 
consumer3:     7 
consumer3:     8 
consumer3:     9 
consumer3:    10 
consumer3:    11 
```
vim-ruby-refactoringで面倒なリファクタリング作業を自動化

vim-ruby-refactoring とは
-------------------------

読んで字のごとく Ruby のリファクタリングを補助する Vim プラグインです。
ちょっと使ってみて便利っぽかったのと、日本語記事がなさそうだったので初 Qiita してみます。


導入方法
--------

Vim に neobundle.vim が入っている場合は ``~/.vimrc`` に以下の設定を追加します。

```
NeoBundle 'tsaleh/vim-matchit'
NeoBundle 'ecomba/vim-ruby-refactoring'
```

あとは ``:NeoBundleInstall`` でインストール完了です。
vim-ruby-refactoring の一部コマンドが vim-matchit に依存するようなので一緒に入れておくのが良さそうです。


機能一覧
--------

主な機能を挙げていきます。


```vim
" メソッドに引数を追加する
:nnoremap <leader>rap  :RAddParameter<cr>

" 一行で書かれた条件文(e.g. "hoge if fuga?" のようなもの)を伝統的な複数行の形式に変換する
:nnoremap <leader>rcpc :RConvertPostConditional<cr>

" 選択部分を RSpec の "let(:hoge) { fuga }" の形式に切り出す
:nnoremap <leader>rel  :RExtractLet<cr>

" 選択部分を定数として切り出す
:vnoremap <leader>rec  :RExtractConstant<cr>

" 選択部分を変数として切り出す
:vnoremap <leader>relv :RExtractLocalVariable<cr>

" 一時変数を取り除く
:nnoremap <leader>rit  :RInlineTemp<cr>

" ローカル変数をリネームする
:vnoremap <leader>rrlv :RRenameLocalVariable<cr>

" インスタンス変数をリネームする
:vnoremap <leader>rriv :RRenameInstanceVariable<cr>

" 選択部分をメソッドに切り出す
:vnoremap <leader>rem  :RExtractMethod<cr>
```

備考:
``<leader>`` のデフォルト値は ``\`` です。
ほかの値に設定されている場合は ``:let mapleader`` で確認できます。



使い方
------


**ローカル変数のリネーム**

この場合は ``<leader>rrlv`` を使います。
text-object のキーバインドと組み合わせると便利です。

たとえば下記のようなメソッドがあったとします。

```ruby
def sample(hoge)
  hoge.foo = 1
  hoge.bar = 2
end
```

適当な ``hoge`` の上にカーソルを置き ``viw`` と入力すると ``hoge`` が選択できます。
続いて ``\rrlv`` と入力すると次のプロンプトが表示されます。

> Rename to:

このプロンプトにリネームしたい変数名を入力します。
試しに ``piyo`` と入力し Enter を押すと次のような結果になります。

```ruby
def sample(piyo)
  piyo.foo = 1
  piyo.bar = 2
end
```

いちいち ``%s`` などの置換コマンドを入力しなくて済むので非常に良い感じです。



**選択範囲をメソッドに切り出す**

個人的にこれが一番感動しました。
ただ単にメソッドに切り出すだけでなく、引数や返り値も自動で設定してくれるんです。こやつ・・・できる・・！


```ruby
def sample2(piyo)
  foo, bar = piyo.split(',')
  return nil if foo.nil? || bar.nil?
  "Foo is #{foo}, Bar is #{bar}."
end
```

3～4行目を選択した状態で ``\rem``と入力すると次のプロンプトが表示されます。

> Method name: 

このプロンプトに適当なメソッド名を入力してやります。
試しに ``hoge`` と入力し Enter を押すと次のような結果になります。

```ruby
def hoge(foo, bar)
  return nil if foo.nil? || bar.nil?
  "Foo is #{foo}, Bar is #{bar}."
end 
def sample2(piyo)
  foo, bar = piyo.split(',')
  hoge(foo, bar)
end 
```

注意点:
切り出す内容によっては必要な値が引数に設定されなかったり、引数にすべきではない値が設定されたりするようです。
また選択の仕方にもクセがあって、切り出したいテキストの「改行文字」まで選択してやる必要があるようです。
（この辺はまだまだ改良の余地あり、といった感じですね）



今後の展望
----------

ざっと使ってみた感じ、少し荒削りな部分が見受けられましたが、十分実用できるレベルだと思いました。
ただちょっともの足りないな・・・と思うところもあったので以下に列挙しておきます。

* Ruby on Rails への対応（モデルに定義した属性のリネームなど）
* ファイルを越えたリネーム
* メソッド切り出しの正確さ向上

ひとまずこのままもう少し使ってみます。


参考文献
--------

* [本家](https://github.com/ecomba/vim-ruby-refactoring)
* [ドキュメント](https://www.relishapp.com/despo/vim-ruby-refactoring/docs) (非常に分かりやすいです)
Java 8 新機能 Iterable#forEach

+ このバージョンは正式リリース前です。

ループ式が追加されていた。

```java:
List<Integer> intList = Arrays.asList(1, 3, 5, 7, 9, 11, 12, 13);
intList.forEach(new Consumer<Integer>() {

	public void accept(Integer arg0) {
		// ここにループ処理
		System.out.println(arg0);
	}

	// default のため記述追加不要
	// public Consumer<Integer> chain(Consumer<? super Integer> arg0)
});
```

### ２種類以上の処理を続けるとき

```java:
List<Integer> intList = Arrays.asList(1, 3, 5, 7, 9, 11, 12, 13);
Consumer<Integer> consumer1 = new Consumer<Integer>() {

	public void accept(Integer arg0) {
		System.out.print("consumer1:");
		System.out.println(arg0);
	}
};
Consumer<Integer> consumer2 = new Consumer<Integer>() {

	public void accept(Integer arg0) {
		System.out.print("consumer2:");
		System.out.println(arg0 * 3);
	}
};
intList.forEach(consumer1.chain(consumer2));
```

#### 実行結果

```
consumer1:1
consumer2:3
consumer1:3
consumer2:9
consumer1:5
consumer2:15
consumer1:7
consumer2:21
consumer1:9
consumer2:27
consumer1:11
consumer2:33
consumer1:12
consumer2:36
consumer1:13
consumer2:39
```

別クラスにすることによって長い処理を書き放題ってことかな。
これは

++ 65535 byte 制約回避のためですね
Play frameworkでMySqlを使う

Play frameworkでMySqlを使うためのメモです。

##前提
例としてMySqlに
データベース名：firstdb
ユーザ名　　　：firstuser
パスワード　　：firstpass
でデータベースを作ってあるとします。

##conf/application.confを編集
conf/application.confを開きます。
36行目あたりの記述をコメントアウトし、新たに追記します。
※すでにコメントアウトされている場合はそのまま追記します。

```sql:application.conf
# db.default.driver=org.h2.Driver
# db.default.url="jdbc:h2:mem:play"
# db.default.user=sa
# db.default.password=""

db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://localhost/firstdb?characterEncoding=UTF8"
db.default.user=firstuser
db.default.password=firstpass
```

##Build.scalaを編集
project/Build.scalaを開きます。
下記を

```scala:Build.scala
  val appDependencies = Seq(
    // Add your project dependencies here,
    javaCore,
    javaJdbc,
    javaEbean
  )
```

下記のように変更します。

```scala:Build.scala
  val appDependencies = Seq(
    // Add your project dependencies here,
    javaCore,
    javaJdbc,
    javaEbean,
    "mysql" % "mysql-connector-java" % "5.1.20"
  )
```

※5.1.21 の部分はドライバのバージョンです。

##アプリケーションを起動し確認
コマンドプロンプトでアプリケーションのディレクトリに移動し play と入力します。
次に run と入力し、アプリケーションを起動します。
http://localhost:9000/ をブラウザで開き、エラーメッセージが表示されなければ成功です。