OmniAICreator/Qiita-1.07M huggingface dataset:
ある配列を任意の要素数の配列に分割したい

### 概要

ある配列を任意の長さ n ずつ分解したいです。
例えば、
`[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]` を
`[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10]]` にしたいということです。

簡単にできるんです。そう [Enumerable#each_slice](https://docs.ruby-lang.org/ja/2.4.0/method/Enumerable/i/each_slice.html) ならね。

```ruby
array = (0..10).to_a
#=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

array.each_slice(3).to_a
#=> [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10]]
```

`Enumerable#each_slice` メソッドは `Enumerator` オブジェクトを返すので、
`to_a` で Array に変換して完成です :tada:

### 追記

[Active Support コア拡張機能](https://railsguides.jp/active_support_core_extensions.html) の [Array#in_groups_of](http://api.rubyonrails.org/classes/Array.html#method-i-in_groups_of) でも同様のことができました。

```
$ gem install activesupport
```
```ruby
require 'active_support/core_ext/array/grouping'

array = (0..10).to_a
#=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 第 1 引数のみの場合、余りが nil で埋められる。
array.in_groups_of(3)
#=> [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, nil]]

# 第 2 引数に false を指定した場合、
# 前述の Enumerable#each_slice を使用した方法と同じ結果になる。
array.in_groups_of(3, false)
#=> [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10]]
```
SQLAlchemyとmultiprocessingを使う


Pythonの便利なマルチプロセスライブラリであるmultiprocessingとSQLAlchemyを組み合わせて使用するサンプル
プロセス間のデータのやり取りはQueueで行い、DBにはSQLALchemyのsessionを使ってアクセスする

```py
from multiprocessing import (Process, Queue)
from sqlalchemy import (create_engine, MetaData)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import (sessionmaker, scoped_session)


engine = create_engine("mysql://{user}:{passwd}@{host}/{db}")
# _Session = scoped_session(sessionmaker())
Session = sessionmaker()
metadata = MetaData(engine)
Base = declarative_base()
# Base.query = _Session.query_property()

####################
# テーブル定義は省略(Itemテーブル)
####################

class Hoge(object):
    def __init__(self):
        '''マルチプロセスに食わせるキューと吐き出す先のキュー'''
        self.in_queue = Queue()
        self.out_queue = Queue()
        self.session = Session()

    def __del__(self):
        self.session.commit()
        self.session.close()

    def get_items(self, worker_num=4):
        '''マルチプロセスでDBからデータを取得する
        キューに取得したいidを格納してマルチプロセスでDBにアクセスし、取り出す
        '''
        item_ids = self.session.query(Item.id).all()

        for item_id in item_ids:
            self.in_queue.put(item_id[0])

        jobs = []
        for i in xrange(worker_num):           
            p = Process(target=self.worker, args=[])
            p.daemon = True
            jobs.append(p)
            p.start()

        for job in jobs:
            job.join()
            # プロセス終了メッセージ
            print '{name}.exitcode = {code}'.format(name=job.name, code=job.exitcode)

        return True

    def worker(self):
        '''マルチプロセス用ワーカー
        self.in_queueからidを取り出し、DBからそのデータを取得してself.out_queueに格納する
        '''
        while not self.in_queue.empty():
            id = self.in_queue.get()
            print id,
            try:
                item = self.session.query(Item).filter(Item.id == id).first()
            except Exception as e:
                print 'error =>', e
                continue
            self.out_queue.put(item.name)
            print 'in_queue: {0} (out_queue: {1})'\
                    .format(self.in_queue.qsize(), self.out_queue.qsize())
        return True  # これがないと終わらない
```

## 注意点

ここでscoped_sessionでSessionを作成すると

>Could not locate column in row for column …


といったエラーが吐かれてしまうことがあるので注意

また、
> Traceback (most recent call last):
>   File "/usr/lib/python2.7/multiprocessing/queues.py", line 266, in _feed
>     send(obj)
> IOError: [Errno 32] Broken pipe

というエラーも出たりしましたが、再現されなかったのでよく分かりませんでした…。
jquerymobileのform送信がデフォルトでajaxだったから止めた

デフォルトでajax送信されると色々と不便で、さくっと作りたいから止めてみた。

ググると色んな人が停止していたが、方法としては2つあるらしい。

1. javascriptで停止
2. formにdata-ajax=falseを記入

まずは全体止めたいので1を試してみましたが出来ず！
なので「らしい」と言う表記にしました。

残りは2ですが、いちいちform_forに書くのもめんどくさいので、
config/initializersの下にform_helper.rbって名前でファイル作って
form_forをoverrideしました。

```rb
def form_for
  #-----省略
  html_options["data-ajax"] = :false
  #-----省略
end
```

こう書いておけば意識しなくてもdata-ajax=falseがついてくれるので
ajax送信されなくてすみます！
grepとackとagの検索速度

なんか巷の記事によると速度は

```math
ag > ack > grep
```

の順に速いって風潮だけども、実感としてgrepがそんなに遅くない思っていたので調べてみました...

# 結果

詳しい話は後にして、結果は

|                       |GNU grep  |BSD grep     |ag            |ack     |
|:----------------------|:--------:|:-----------:|:------------:|:------:|
|Linux                  | 0.56s    |  NaN        |0.96s         | 18.64s |
|Linux 再起動直後       |  23.50s  |  NaN        | 22.31s       | 41.81s |
|Mac book air           |  1.26s   | 12.50s      | 3.47s        | 23.64s |
|Mac book air 再起動直後|  24.15s  | 43.86s      | 8.56s        | 72.21s |

キャッシュってめっちゃ効いてる！！！！
あれ、ack遅い...
検索しないようなファイルが増えたら、早く感じるのかな...？

# 調べ方等
調べ方はgithubにあるlinux kernelのrepositoryで検索してかかった時間！
repositoryのtop directoryで検索した結果...

```shell-session
$ time -p ag clock  >/dev/null
real 0.96
user 1.72
sys 1.60

$ time -p grep -r  clock * > /dev/null
real 0.56
user 0.39
sys 0.17

$ time -p ack clock * > /dev/null
real 18.64
user 18.14
sys 0.47
```

という結果が得られました！
ファイルシステムのキャッシュが効いてるかもしれないので、各コマンドを再起動後やってみた...

```shell-session
$ time -p ag clock  >/dev/null
real 22.31
user 1.05
sys 0.87

$ time -p grep -r  clock * > /dev/null
real 23.50
user 1.26
sys 1.45

$ time -p ack clock * > /dev/null
real 41.81
user 20.36
sys 1.47
```

巷の記事はMacでやってるのが多いので... grepが遅いってのはBSDのgrepだからか！？ということでMacでも試してみた。


```shell-session
$ time -p ag clock  >/dev/null
real 3.47
user 5.35
sys 1.43

$ time -p grep -r  clock * > /dev/null
real 12.50
user 12.35
sys 0.48

$ time -p ack clock * > /dev/null
real 23.64
user 22.15
sys 1.48
```

ということでGNU grepでも試してみた!

```shell-session
$ time -p ggrep -r clock * > /dev/null
real 1.26
user 0.66
sys  0.59
```

macでも再起動後試してみた！

```shell-session
$ time -p ag clock  >/dev/null
real 8.56
user 6.25
sys 6.84

$ time -p grep -r  clock * > /dev/null
real 43.86
user 23.00
sys 6.37

$ time -p ggrep -r  clock * > /dev/null
real 24.15
user 2.04
sys 8.57

$ time -p ack clock * > /dev/null
real 72.21
user 46.07
sys 10.14
```

# まとめとか

```
ag ~ GNU grep > BSD grep > ack
```
って感じだった。

コンパイル等で検索したくないファイルが増えたら、agとackは早く感じるかもしれない...

概ね再起動後の速度は20秒くらい遅くなってるからファイル読み込みにそれくらいかかってるって事かな？

再起動後のMac book airでのagの速度だけ何かおかしいが、SSDなことが関係してるのだろうか？


とりあえず、BSD grepとack使わない方がよさげ。
GNU grepか、機能豊富なのがいいならagにしとけって事かな？
エラトステネスの篩で素数を求める

[エラトステネスの篩](http://qiita.com/rana_kualu/items/04cb330a0949f48cb7ab) / [標準関数](http://qiita.com/rana_kualu/items/8b4e09f0410605f8180c)

[素数出力プログラミング大会](http://person-link.co.jp/blog/detail/32)

1時間でやるならまだしも、一週間も期間があるのに誰もエラトステネスの篩書いてないとかどういうことだよ。

```php
<?php
	// ArrayIteratorを使ったエラトステネスの篩

	// 初期値
	$max = 1000000;
	$arr = new ArrayIterator(array_flip(range(3, $max, 2)));
	$loopmax = ceil(sqrt($max));

	// 篩
	foreach($arr as $key=>$val){
		if($key > $loopmax ){ break; }
		if(!isset($arr[$key])){ continue; }
		$loop=2;
		$now = $key*2;
		while($now <= $max){
			if(isset($arr[$now])){unset($arr[$now]);}
			$loop++;
			$now = $key*$loop;
		}
	}

	// 出力
	echo 2, PHP_EOL, implode(PHP_EOL, array_keys($arr->getArrayCopy())) , PHP_EOL;
```

```php
<?php
	// 文字列を使ったエラトステネスの篩
	
	// 初期値
	$max = 1000000;
	$str = str_repeat('01', $max/2+1);
	$loopmax = ceil(sqrt($max));

	// 篩
	for($key=3; $key<=$loopmax; $key+=2){
		if($str[$key] === '0'){continue;}
		$loop=2;
		$now = $key*2;
		while($now <= $max){
			$str[$now] = '0';
			$loop++;
			$now = $key*$loop;
		}
	}

	// 出力
	$sosuu = '2'.PHP_EOL;
	for($key=3; $key<=$max; $key+=2){
		if($str[$key]==='1'){
			$sosuu .= $key.PHP_EOL;
		}
	}
	echo $sosuu;
```

10000まで、および1000000までの素数を求めるのにかかった時間とメモリ使用量です。
計測方法は2回計った平均値というかなり意味のない値なので、オーダー程度に見てください。


| ファイル名               | 10000件時間(秒) | 1000件メモリ(kb) | 1000000件時間(秒) | 1000000件メモリ(kb) |
|:-------------------------|:----------------|:-----------------|:------------------|:--------------------|
| katsurayama_sosu.php     | 0.00400043      | 134.38           | 1.78117800        | 1362.41             |
| maeda_sosu.php           | 0.30502999      | 991.88           | 180 seconds exceeded                    |
| sosu_sample.php          | 2.81178141      | 992.17           | 180 seconds exceeded                    |
| tanaka_sosu.php          | 0.00449991      | 248.15           | 0.99830055        | 8166.82             |
| NurseAngel ArrayIterator | 0.00450063      | 993.30           | 0.48954952        | 84322.09            |
| NurseAngel str_repeat    | 0.00250053      | 145.05           | 0.19101894        | 2363.26             |

2番目と3番目ひどいな。
10000件の時点で既に他と100倍～1000倍の差があります。
毎回echoしているせいかと最後にまとめて出力してみたのですが変わりませんでした。
何故ここまで違うんだろう。

篩のほうは値が大きくなるほど処理対象が少なくなるため、10000件程度ではtanaka_sosu.phpとあまりかわりませんが、1000000件まで行くと相対的に処理時間が減っていきます。

はじめ何も考えずにArrayIteratorで書いたのですが、最初に50万件のArrayIteratorをががっと作ってしまうので、使用メモリがえらいことになってます。
1000万件を処理しようとしたら死にます。
あまりに残念だったので書き直してみたのがstr_repeat()を使う方。
メモリ使用量が激減したのは想定通りですが、実行時間まで半分以下になるとは正直思ってなかった。
やってることは単純に、最初に'1111111111'という文字列を作り、篩に当たったところを0にしていくだけです。

ちなみに偶数の素数は2だけなので、予め処理対象から外しておいて計算量を減らしています。
まあ対照実験やってないので本当に減ってるかどうかは不明ですが。

ググってみた限りでは、PHPでエラトステネスの篩を使うソースは全て配列での実装を行っており、文字列の実装をしている人は見当たりませんでした。
アプリケーションサーバのユニットテストする

お気に入りのThinkPadキーボードが壊れて不服な気持ちのうみさまです。
新しいX1Carbonを見てThinkPadへの忠誠心も切れかかっていた所だったので、今度はHHKBでも買います。

さて、golangにはアプリケーションサーバをユニットテストするため、net/http/httptestというパッケージが用意されています。

# ハンドラのユニットテスト
例えば、こんな感じのアプリケーションがあったとしてHander()を試験したい場合、

```go:handler.go
package main

import (
        "net/http"
        "fmt"
)

func Handler( w http.ResponseWriter, r *http.Request ) {
        fmt.Fprintf(w, "hello world")
}

func main() {
        http.HandleFunc("/", Handler)
        http.ListenAndServe(":8080", nil)
}
```

こんな感じでhttptest.NewServer()を用いてHandler()を単独起動し、試験できます。

```go:handler_test.go
package main

import (
        "testing"
        "net/http"
        "net/http/httptest"
)

func TestHandler(t *testing.T) {
        ts := httptest.NewServer( http.HandlerFunc( Handler ) )
        defer ts.Close()

        res, err := http.Get( ts.URL )
        if err != nil {
                t.Error("unexpected")
                return
        }

        if res.StatusCode != 200 {
                t.Error("Status code error")
                return
        }
}
```

# ちなみに
クライアントアプリでは、サービスのMockをこのオブジェクトで起動して、試験することもできます。

# 参考情報
https://groups.google.com/forum/#!topic/golang-nuts/h3WHAhW4xcU
Rubyで「スレッドの同時実行数を制限する」シンプルな方法

Rubyでスレッドの同時実行数を制限します。
カウンティングセマフォを使えば良いのですが、標準添付ライブラリには入ってない（多分）ので、実装します。

素直にやるとこういう感じ -> [rubyでカウンティングセマフォ](http://qiita.com/long_long_float/items/eea0a0f6ca9eb5eb16dc "Qiita")
カウンタとMutexを用意して、カウンタが0の時に待つ機構を作って…と、割とめんどくさいことをしないといけません。

## シンプルに

標準添付ライブラリの[Queue](http://docs.ruby-lang.org/ja/2.0.0/class/Queue.html)を使えばこれらの処理がサクッと実装できちゃいます。

```ruby:counting.rb
require 'thread'

locks = Queue.new
2.times { locks.push :lock }

Array.new(10) do |i|
  Thread.new do
    lock = locks.pop
    print "#{i}\n" 
    sleep 2 
    locks.push lock 
  end
end.each(&:join)
```

このコードでは10スレッド生成して2スレッドずつ実行されます。
## なぜ動く？
[Queue](http://docs.ruby-lang.org/ja/2.0.0/class/Queue.html)はスレッド間通信のために用意されたクラスなので、push/pop操作はatomicです。(自分でMutexを用意する必要が無い。）
また、

> 空のキューを読み出そうとするとスレッドが停止します

っていう素敵な仕様により、waitの実装も必要無くなります。

ただし、本来カウンタ一つで済むところで配列が用意されたりと、無駄が多い。あと、一見して何してるのかわからない。

## つまり？

簡単なスクリプトでサクッと実装したいときにどうぞ！
ruby 2.1.0 にできない

http://qiita.com/shu_0115/items/ba33b692373f002cc568

こちらの記事を参考に ruby 2.1.0 にすることを試みたのですが、何故かバージョンの切り替えができません

```
$ rbenv versions
  system
* 2.1.0 (set by /Users/****/.rbenv/version)
$ rbenv global 2.1.0
$ ruby -v
ruby 2.0.0p247
```
homesick を使って dotfiles を管理する！

## install homesick

```
$ gem install homesick
```

## GitHub に dotfiles リポジトリ作成

+ GitHub で dotfiles リポジトリを作成してください。

+ ローカルに dotfiles を作成します。
 
```
$ mkdir ~/dotfiles 
$ cd ~/dotfiles
$ git init
Initialized empty Git repository in /Users/user_name/dotfiles/.git/

$ mkdir home 
$ cd home
$ cp ~/.vimrc . 
$ cp ~/.zshrc .
```

+ 作った dotfiles リポジトリに push

```
$ git add .
$ git commit -m 'Initial commit'
$ git push -u origin master
```

## 作った dotfiles を homesick で設置する

+ 作ったリポジトリを homesick clone で GitHub から clone

```
$ homesick clone user_name/dotfiles
git clone  https://github.com/user_name/dotfiles.git to /Users/user_name/.homesick/repos/dotfiles
```

+ シンボリックリンクを貼る

```
$ cd ~ 
$ homesick symlink dotfiles 
```

+ こんな感じになれば OK !!

```
$ ls -al
*** .agignore -> /home/webuser/.homesick/repos/dotfiles/home/.agignore
*** .bashrc -> /home/webuser/.homesick/repos/dotfiles/home/.bashrc
*** .gitconfig -> /home/webuser/.homesick/repos/dotfiles/home/.gitconfig
*** .vimrc -> /home/webuser/.homesick/repos/dotfiles/home/.vimrc
*
*
*
```

## dotfiles を 更新した時！！

```
$ homesick pull dotfiles
$ homesick symlink dotfiles
```

おしゃんてぃ。。

もし下記のエラーメッセージを言われたら。。。

```
Cannot pull with rebase: You have unstaged changes.
Please commit or stash them.
```

こんな感じで対処してください。

```
cd ~/.homesick/repos/dotfiles
git add .
git stash save
homesick pull dotfiles
homesick symlink dotfiles
git stash pop
```
ROSチュートリアル第四回 — ROSをインストールしてみる


## ROSが走るOS
ROSをインストールする前に、どのOS(distribution)でROSを使うべきか、という話題があるが…現状Ubuntu一択であろう。

[Mac OS X](http://wiki.ros.org/ROS/Installation)なども動くらしいが、完璧に動く状態にもっていけた経験がないので、Ubuntuを使うことを強く勧める。

他のOSユーザは[vmware](http://www.vmware.com/jp/)や[virtualbox](https://www.virtualbox.org/)でubuntuを入れてみるのが良いかと思う。

ちなみに、著者のおすすめはUbuntu 12.04である(LTS最高)。

以下ではUbuntu 12.04を対象に説明していく

## ROSのインストール
ROSをUbuntuにインストールするには、aptを利用してパッケージを入れるのと、ソースから全部頑張ってコンパイルするという二つの方法がある。

ソースコードから全部コンパイルすると、とてつもなく時間が掛かるので、aptで入れることを勧める。
aptで入れたソフトウェアに対してソースコードを弄りたいという要望があるだろうが、その場合はそのソフトウェアだけソースコードからコンパイルするという方法を取るのが得策である。

ROSのインストールは以下のステップで進める。
1. aptである程度パッケージをどかんといれる。
2. catkinを設定する
3. rosbuildを設定する

### aptでROSのパッケージを入れる
では早速aptでパッケージを入れてみよう。Ubuntu公式のaptにはrosは含まれていないので、sources.listを更新する必要がある。

```sh
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu precise main" > /etc/apt/sources.list.d/ros-latest.list'

wget http://packages.ros.org/ros.key -O - | sudo apt-key add -
sudo apt-get update
```

上で書いたものは12.04用のため、その他のversionに関しては[ここ](http://wiki.ros.org/hydro/Installation/Ubuntu)を参照されたい。

rosのaptパッケージは基本的に`ros-{distro}-awesome-package-name`の命名則に従う。
例えばgroovyを利用していれば`ros-groovy-foo`, hydroの場合は`ros-hydro-bar`という形である。

aptからインストールしたrosのパッケージは`/opt/ros/{distro}`に入れられる。hydroの場合は`/opt/ros/hydro/foo/bar`という形になる。

現在サポートされているrosのバージョンはgroovyとhydroの二つがある。hydroの方が新しいので、このチュートリアルではhydroを利用する。ただし、まだgroovyでしか動かないパッケージなどもあるので注意されたい。

```sh sudo apt-get install ros-hydro-desktop-full
```

`ros-hydro-desktop-full`にはたくさんのパッケージが含まれており、大抵の基本的なものはこれで揃う。

インストールが終わったらbashrcを設定しよう.

```sh:.bashrc
source /opt/ros/hydro/setup.bash
```

zshを使っているなら

```sh:.zshrc
source /opt/ros/hydro/setup.zsh
```

### catkinのworkspaceを設定する
ソースコードからcatkinのパッケージをコンパイルするために、catkinのworkspaceを作成する。

```sh
sudo apt-get install python-wstool
mkdir -p ros_catkin_ws/hydro/src
cd ros_catkin_ws/hydro/src
wstool init .
cd ..
catkin_make
```

.bashrcに以下を追記

```sh:.bashrc
# source /opt/ros/hydro/setup.bash #これはもういらない
source $HOME/ros_catkin_ws/hydro/devel/setup.bash
```

zshなら

```sh:.zshrc
# source /opt/ros/hydro/setup.zsh #これはもういらない
source $HOME/ros_catkin_ws/hydro/devel/setup.zsh
```

### rosbuildのworkspaceを設定する
ソースコードからrosbuildのパッケージをコンパイルするために、rosbuildのworkspaceを作成する。

```sh
sudo apt-get install python-rosinstall
mkdir -p ros/hydro
cd ros/hydro
rosws init . ~/ros_catkin_ws/hydro/devel
```

.bashrcを以下の用に編集

```sh:.bashrc
# source /opt/ros/hydro/setup.bash #これはもういらない
# source $HOME/ros_catkin_ws/hydro/devel/setup.bash #これもいらない
source $HOME/ros/hydro/setup.bash
```

zshなら

```sh:.zshrc
# source /opt/ros/hydro/setup.zsh #これはもういらない
# source $HOME/ros_catkin_ws/hydro/devel/setup.zsh #これもいらない
source $HOME/ros/hydro/setup.zsh
```

以上で設定はおしまい。
以下のコマンドでインストールされているパッケージ一覧が見られる。

```sh
rospack list
```


次回から実際にパッケージを作ったりコンパイルしたり。
VMWare Fusion6で，シリアルコンソールを使えるようにする

ゲストOSの起動メッセージをホストOS（Mac）のターミナルに出力させたかった．

# VMware Fusion6の設定
.vmxファイルをエディタで開き，下記を部分を書き換える．
.vmxファイルはいわゆる仮想マシンファイル（実体はディレクトリ）の中にあるので，
Finderから"右クリックで内容を開く"とか，ターミナルで開くなどする必要がある．
```
serial0.fileType = "pipe"
serial0.fileName = "/tmp/serial0"
serial0.present = "TRUE"
```
この後にVMwareのGUIからシリアル接続設定を保存したりすると，変な風に書き換えられてしまうので注意．

これでゲストOSに見えるttyS0と，ホストOSのunix domain socketが通信できるようになる．

# Mac側の設定
unix domain socketの読み書きにはsocatを使う．OS X 10.9 Mavericksだとデフォルトで1.7.2.2が入ってるので，それを使えばよし．
```shell-session
socat -d -d unix-connect:/tmp/serial0 stdio
```
これでOK．

# ゲストOSの設定
とりあえず，ゲストカーネルが起動したらもう準備OK
```shell-session
\#echo "nekonekonya-" >/dev/ttyS0
```
的な感じでsocatで開いているsocketに書き込める．

ブート時のコンソールとして利用したかったので，ブートオプションを変更．
grub2の場合は/etc/grub2/defaultを変更する．grub2の起動時にオプションとして直接打ち込んでもOK．

```
GRUB_CMDLINE_LINUX='(省略) console=ttyS0,9600n8'

```

#参考リンク
https://gist.github.com/kuenishi/3825178
http://www.cyberciti.biz/faq/howto-setup-serial-console-on-debian-linux/
HTML の要素は何種類?

```jq
$ curl "https://raw.github.com/manakai/data-web-defs/master/data/elements.json" | jq '.elements["http://www.w3.org/1999/xhtml"] | to_entries | map (select ("1" == (.value.conforming | tostring))) | map(.key) | length'
112
```

HTML の要素は今112種類あります (廃止されたものを除く)。

(一覧はこちら → http://www.whatwg.org/specs/web-apps/current-work/multipage/section-index.html#elements-1 )

```jq
$ curl "https://raw.github.com/manakai/data-web-defs/master/data/elements.json" | jq '[.elements["http://www.w3.org/1999/xhtml"][].attrs[] | to_entries | map(select(.value.conforming | tostring == "1")) | map(.value.id) | map(select(. != null)) ] | map(.[]) | unique | length'
277
```

属性の数を数えるのはちょっと難しい (違う要素の同名の属性のどれを同じとみなすかによって変わる) のですけど、277種類 (+ ARIA 36種類) くらいあるようです (廃止されたものを除く)。

(ちなみにイベントハンドラー属性が73種類、全要素共通の属性が82+36=118種類、 input 要素の属性が82+33-1+36=150種類あります。)
CentOS6.4に yumで gitの新しいバージョンいれたい！

## yumのリポジトリにRPM Forgeを追加
+ RPM Forgeのrpmをダウンロード

```
$ cd /usr/local/src/
$ sudo wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm 
```

+ rpmをインストール

```
$ sudo rpm -i rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
```

+ 追加した yumリポジトリでgitをインストール

```
$ sudo yum install --enablerepo=rpmforge-extras git 
```

+ き た ！

```
$ git --version
$ git version 1.7.12.4
```
【jQueryプラグイン】iPhoneでslidesjsでスワイプしていると不具合が起こる

iPhoneで[slidesjs](http://www.slidesjs.com/ "slidesjs")をスワイプしていると、スワイプできなくなったりなにもスライドされてこないことがある。
英語でぐぐると出てくるけど、日本語では出てこなかったのでメモ。

#やんわりほんやく
https://groups.google.com/forum/#!topic/slidesjs/jKs7OAfg5kY
jsの88行目の
webkitBackfaceVisibility: "hidden"
を削除するか、
webkitBackfaceVisibility: "visible"
を設定しよう。
Mojoliciousでログイン認証をやってみた

IDとパスワードでログインして、ユーザの権限で画面が違ったりするっていう感じのことをしなくてはいけなくなったので、考えてみました。

## ファイル構成

```
/my_app

/my_app/lib
/my_app/lib/MyApp.pm
/my_app/lib/MyApp/Admin.pm
/my_app/lib/MyApp/Model/Login.pm

/my_app/log

/my_app/public

/my_app/script
/my_app/script/my_app
/my_app/script/my_app.psgi

/my_app/session  --ここにセッションファイルが溜まる

/my_app/t

/my_app/templates
/my_app/templates/layout
/my_app/templates/admin/login.html.ep
/my_app/templates/admin/logout.html.ep
/my_app/templates/admin/mainpage.html.ep

```

だいたいこんな感じです。
本番ではもう少し変える（し、かなり増える）と思います。


## 肝になるファイルの内容

```pl:/my_app/script/my_app.psgi
use strict;
use warnings;
use Mojo::Server::PSGI;
use Plack::Builder;
use Plack::Session::Store::File;
use Plack::Session::State::Cookie;
use YAML;
use FindBin;
BEGIN { unshift @INC, "$FindBin::Bin/../lib" }
use MyApp;

my $psgi = Mojo::Server::PSGI->new( app => MyApp->new );
my $app = $psgi->to_psgi_app;


builder {
	enable 'Session',
		state => Plack::Session::State::Cookie->new(
			#secure		=> 1,	SSL通信する場合は必要だけど、今回は試してみただけなのでコメントアウト
			httponly	=> 1
		),
		store => Plack::Session::Store::File->new(
			dir				=> '../session',	#指定しないと /tmp 直下に保存されちゃう。
			serializer		=> sub { YAML::DumpFile( reverse @_ ) },
			deserializer	=> sub { YAML::LoadFile( @_ ) },
		);
	$app;
};
```


```pl:/my_app/lib/MyApp.pm
package MyApp;
use Mojo::Base 'Mojolicious';

sub startup {
	my $self = shift;
	
	$self->helper(testsession => sub {
		my $self = shift;
		my $env = $self->req->env;
		return $env->{'psgix.session'};
	});
	#↑のhelperを使うと、コントローラーで受け取る$selfにメソッド追加できる
	#ので、Plackで持っている（？）セッションにアクセスできるようにしておく
	
	
	# Router
	my $r = $self->routes;
	my $logged_in = $r->bridge->to('admin#login');
	#↑で作ったbridgeは、権限が係るすべてのページで使う
	#誰でも見ていいページの場合は、$r->get('/hoge')->to('hoge#piyo')とかで
	
	$logged_in->get('/')->to('admin#mainpage');
}

1;
```


```pl:/my_app/lib/MyApp/Admin.pm
package MyApp::Admin;
use Mojo::Base 'Mojolicious::Controller';
use MyApp::Model::Login;

sub mainpage {
	my $self = shift;

	$self->render();
}

sub login {
	my $self = shift;
	
	#Modelのログインがらみの部分を呼び出してログイン状態の判定をさせる感じ
	#そっちの処理はセッション確認したりDBと照合したりするかんじ。今回はどうでもいい
	
	my $login = MyApp::Model::Login->new();
	my $params = {};
	$params->{user_id} = $self->param('user_id') if( $self->param('user_id') && $self->param('user_id') =~ /^[a-zA-Z0-9]+$/ );
	$params->{password} = $self->param('password') if( $self->param('password') && $self->param('password') =~ /^[a-zA-Z0-9]+$/ );
	
	my $login_status = $login->proc_login($params);
	
	$self->rendar( error_msg => $login_status->{error} ) if ( $login_status->{error} );
	
	return $login_status->{status};
}

sub logout{
	my $self = shift;
	
	#ログアウトしたら、セッション書き換えて終了
	#ほんとはもう少しちゃんとした処理が入ると思う
	
	$self->testsession->{'login_status'} = 'logout';
	return 1;
}

1;
```


## という雰囲気でできそうです。

細かいネーミングとかはかなりテキトーです。
その他含めてベストかどうかはわかりませんが、なんとかできそうなので安心しました。
AndroidStudioで"serialVersionUID"を生成する


デフォルトではWarningも出ないし、自動生成するにはプラグインを入れないとダメだったので手順をメモします。

serialVersionUIDについては、以下がよくまとまっていました。
[[Java]serialVersionUIDの意味と付け方(ITめもりーにょ)](http://itblog.posifeel.com/2012/08/08/java_/)

1. AndroidStudio -> Preferences -> Inspections -> Serialization issues -> “Serializable class without ‘serialVersionUID” にチェックを入れる
2. AndroidStudio -> Preferences -> Plugins -> Browse repositories… -> GenerateSerialVersionUID をインストール
3. Code -> Genarate… -> SerialVersionUID で生成される
git "今日のコミット数"が知りたいときのワンライナー

一日の終わりに「今日俺がんばったなー！」と満足感に浸りたいときに。

```
git shortlog --since="$(date +"%Y-%m-%d") 00:00:00" --no-merges -sn
```

----
### 解説

```git shortlog```の```--since```オプションに、```date```コマンドで”今日の00:00:00”を渡してやります。
```--no-merges```オプションでマージコミットを除き、```-s```オプションでコミッター毎にまとめて、```-n```オプションでコミット数順に並びます。
同順を考慮したランキングを取得するSQLメモ

ランキング取得

```sql:select
SET @placing := 0;
SET @placing_t := 0;
SET @ref_score := NULL;

SELECT @placing_t := IF(basic_data.ref_score <=> basic_data.score, @placing_t, basic_data.placing) AS placing_t,basic_data.* 
FROM (
	SELECT 
	@placing := @placing + 1 AS placing,
	@ref_score AS ref_score, 
	@ref_score := score ,
	weekly_high_scores.* 
	FROM weekly_high_scores
	ORDER BY  weekly_high_scores.score DESC, weekly_high_scores.modified ASC
) AS basic_data
LIMIT 50;
```

使用テーブル

```sql:create
CREATE TABLE `weekly_high_scores` (
  `stage_id` int(10) unsigned NOT NULL COMMENT 'stage_id',
  `start_date` date NOT NULL COMMENT '週開始日',
  `user_id` int(10) unsigned NOT NULL COMMENT 'user_id',
  `score` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'スコア',
  `modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '更新日時',
  PRIMARY KEY (`stage_id`,`start_date`,`user_id`),
  KEY `weekly_high_scores_IX1` (`user_id`),
  KEY `weekly_high_scores_IX2` (`score`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='週間ハイスコア';
```
ag(The Silver Searcher)をインストール

## agをインストール

+ homebrew

```
$ brew install ag
```

+ ports 

```
$ port install the_silver_searcher
```

+ Centos6

```
$ sudo rpm -ivh http://swiftsignal.com/packages/centos/6/x86_64/the-silver-searcher-0.13.1-1.el6.x86_64.rpm
```

+ Ubuntu 13.04

```
$ apt-get install software-properties-common # (if required)
$ apt-add-repository ppa:mizuno-as/silversearcher-ag
$ apt-get update
$ apt-get install silversearcher-ag
```

+ FreeBSD

```
$ pkg add the_silver_searcher
```

+ ソースからインストール

```
$ git clone https://github.com/ggreer/the_silver_searcher
$ cd the_silver_searcher 
$ ./build.sh && install
```

## .agignore で除外設定
これを設定するだけで、お邪魔なやつが引っかからなくなるので設定をオススメします。

検索してほしくない対象を以下のように書いておくと、除外して検索してくれます。

```~/.agignore
log
logs
tmp
vendor
.vim/bundle
.vim/dict
.git
lib
libs
jquery-*.js
*.swp
*.sql
*.tags*
*.gemtags*
*.csv
*.tsv
*.tmp*
*.js
*.css
*.old
*.json
*.xml
*.pdf
*.md
*.log
```
CentOS6.4にgit tigインストールと使い方

## tigって？

Gitのためのテキストユーザインタフェース。
Gitリポジトリ内の変更内容を、見やすくてしかもVimライクな操作で見れます。

## tigをインストール

+ パッケージをインストール

```
$ sudo rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
```

+ tigインストール

```
$ sudo yum install -y tig
```

## tigの使い方

gitリポジトリ内でtigって打つだけです。

```
$ tig
```

![スクリーンショット 2014-01-17 15.06.56.jpg](https://qiita-image-store.s3.amazonaws.com/0/1698/bc4f389a-12f4-773c-c4a5-f320b3a6694d.jpeg)

こんな感じでコミットログがみれます。

キーバインドはvimと同じ。
対象のコミットでenterを押せばその コミットの詳細 が見れます。

引数 で表示の仕方を変えられるようです。
ブランチ間の差とか複数のブランチを表示したり特定のリビジョンを表示したりできるようです。
詳しくは man tigで。
centOS6.4にtmuxインストール

### メモ

```
sudo yum -y install ncurses ncurses-devel make gcc wget

cd /usr/local/src
sudo wget http://pkgs.repoforge.org/tmux/tmux-1.6-1.el6.rf.x86_64.rpm

sudo yum -y install tmux-1.6-1.el6.rf.x86_64.rpm
```
「折って切る」をErlangとRubyで(横へな17)

「[折って切る](http://nabetani.sakura.ne.jp/hena/ord17foldcut/)」をErlangとRubyでやってみました。他の皆様による実装は [第17回オフラインリアルタイムどう書くの問題](http://qiita.com/Nabetani/items/ebd9d7deb30c57447806) から辿れます。

```rb:foldcut.rb
def solve(data)
  d = data.upcase.split("-")
  [/T|B/, /L|R/].zip(d[1].split(//)).inject(1) { | acc, rc | acc *
    holenum(d[0].split(//).select { |c| c.match(rc[0]) }.join, rc[1]) }
end

def holenum(s, c)
  (s == "") ? 0 : 2 ** (s.length - 1) - (s[-1] == c ? 0 : 1)
end
```

```erlang:foldcut.erl
-module(foldcut).
-compile(export_all).

solve(Data) ->
  integer_to_list(solve2(string:tokens(string:to_upper(Data), "-"))).

solve2([S, [AY, AX]]) ->
  trunc(holenum(filter("LR", S), AX) * holenum(filter("TB", S), AY)).

filter([C1, C2], L) -> lists:filter(fun(X) -> (X =:= C1) or (X =:= C2) end, L).

holenum("", _) -> 0;
holenum(S, C) -> case lists:last(S) of
  C -> math:pow(2, length(S) - 1);
  _ -> math:pow(2, length(S) - 1) - 1
end.

test(Data, Expected) -> test(Data, solve(Data), Expected).
test(Data, Result, Expected) -> io:fwrite("~s: ~s -> ~s~n",
  [case Result =:= Expected of true -> ok; false -> ng end,
    Data, Result]).

tests() ->
  test("RRTRB-bl", "6"), %0
  test("R-tr", "0"), %1
  test("L-br", "0"), %2
  test("T-tl", "0"), %3
  test("B-tl", "0"), %4
  test("BL-br", "0"), %5
  test("LB-tl", "0"), %6
  test("RL-tl", "0"), %7
  test("BL-tl", "0"), %8
  test("TL-bl", "0"), %9
  test("RT-tr", "1"), %10
  test("TRB-tl", "0"), %11
  test("TRL-bl", "0"), %12
  test("TRB-br", "2"), %13
  test("LLB-bl", "2"), %14
  test("RTL-tr", "1"), %15
  test("LBB-tr", "0"), %16
  test("TLL-tl", "2"), %17
  test("RLRR-tr", "0"), %18
  test("BBTL-tl", "4"), %19
  test("TBBT-tr", "0"), %20
  test("LLBR-tl", "0"), %21
  test("LBRT-tl", "2"), %22
  test("RLBL-bl", "4"), %23
  test("BRRL-br", "3"), %24
  test("TBBTL-tl", "8"), %25
  test("TLBBT-br", "0"), %26
  test("LRBLL-br", "7"), %27
  test("TRRTT-br", "6"), %28
  test("BBBLB-br", "0"), %29
  test("RTTTR-tl", "4"), %30
  test("BBLLL-br", "6"), %31
  test("RRLLTR-tr", "16"), %32
  test("TTRBLB-br", "8"), %33
  test("LRBRBR-bl", "14"), %34
  test("RBBLRL-tl", "8"), %35
  test("RTRLTB-tl", "12"), %36
  test("LBLRTR-tl", "14"), %37
  test("RRLTRL-tl", "16"), %38
  test("TBLTRR-br", "12"), %39
  test("TTTRLTT-bl", "30"), %40
  test("TBBRTBL-tr", "15"), %41
  test("TRTRTLL-tr", "28"), %42
  test("TLLRTRB-tr", "24"), %43
  test("RLLBRLB-tr", "15"), %44
  test("LTLRRBT-tr", "32"), %45
  test("RBBRBLT-br", "21"), %46
  test("LLRLRLR-tr", "0"). %47
```

Rubyの方はテストケースを割愛しています。

次のような考え方でプログラミングしました。

1. 特定の方向にN回折ったとき、折り線は2^N-1本になる。
2. 切ったときの穴は、隣り合う折り線のどちらか一方にしか開かない。(互い違いに穴が開く。)
3. N回折って切ったとき、穴の数は次のどちらかである。
    1. 紙の中心にある折り線に穴がない場合 … 2^(N-1)
    2. 紙の中心にある折り線に穴がある場合 … 2^(N-1)-1
4. 紙の中心にある折り線の位置は、最後に折った方向の反対側になる (*！*)
5. 折り線の数と、最後に折った方向、切る方向から穴の数が求まる。
cakephp2の$validateは方の比較も行う?


例えば、こんなバリテーションルールを設定したとする。

```
var $validate = array(
  'rate' => array(
    array(
      'rule' => array('inList', array(-1,0,1)),
      'allowEmpty' => false,
      'on' => 'update',
    )
  ),
);
```

そして下記のように取得したデータの一部を加工し、saveしようとする。
注意すべき点はこの時点で`$data['Hoge']['rate']`がString型ということ。

```
$data = $this->Hoge->findById($id);
d($data['Hoge']['rate']); // String型
```

結果、`$data`をsaveしようとするとバリテーションエラーとなる。

# 対策方法

```
$data = $this->Hoge->findById($id);	
$data['Hoge']['rate'] = (int)$data['Hoge']['rate'];
$this->Hoge->save($data);
```

キャストすれば大丈夫。これって解決方法としてどうなの？
配列使わないでオブジェクトで扱えってこと？
というかcake2ってモデル周りオブジェクトきっちり対応してるっけ？
deviseをユーザー名で登録・ログインできるように修正する


環境は rails4.0.2 devise3.2.2 です。

deviseはデフォルトでメールアドレスとパスワードでの登録となっているのですが、
今回はメールアドレスではなくユーザー名で登録・ログインできるように修正します。
rails g devise userでリソースを作成し、まずは登録機能の修正をします。
userテーブルの修正とview側の修正は適宜行っておいてください。

始めに、POSTしたusernameを登録できるように、application_controller.rbを修正しstrong parameterを設定します。

```ruby:application_controller.rb
  #before_filterを設定
  before_filter :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    #strong parametersを設定し、usernameを許可
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :password, :password_confirmation) }
  end  
```
次にモデル側を修正します。

```ruby:user.rb
class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  #usernameを必須・一意とする
  validates_uniqueness_of :username
  validates_presence_of :username

  #登録時にemailを不要とする
  def email_required?
    false
  end

  def email_changed?
    false
  end

end
```

ポイントはemail_required?とemail_changed?をオーバーライドし、falseを返却するようにしておく点です。
これをしておかないと、登録時にemailが必須になります。

これで登録はできるようになったので、次はログインできるように修正します。

application_controller.rbのconfigure_permitted_parametersに下記を追加します。

```ruby:application_controller.rb
    devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:username, :password, :remember_me) }
```

これでログイン時にPOSTしたusernameを利用できるようになります。
次はモデルです。

```ruby:user.rb
class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :authentication_keys => [:username]

  #usernameを必須とする
  validates_uniqueness_of :username
  validates_presence_of :username

  #usernameを利用してログインするようにオーバーライド
  def self.find_first_by_auth_conditions(warden_conditions)
    conditions = warden_conditions.dup
    if login = conditions.delete(:login)
      #認証の条件式を変更する
      where(conditions).where(["username = :value", { :value => username }]).first
    else
      where(conditions).first
    end
  end

  #emailを不要とする
  def email_required?
    false
  end

  def email_changed?
    false
  end

end
```


まず:authentication_keys => [:username]を追加して、認証キーをusernameにするよう設定します。
次にdeviseのfind_first_by_auth_conditionをオーバーライドして認証の条件式を変更します。

今回はusernameのみでログインするようにしましたが、メールアドレスかユーザー名どちらでもログイン可能なように変更する事も可能です。
awkメモ


# 基本的な文法

```bash
$ awk '条件文 {実行文}' 対象ファイル名
```

例) 行番号が5未満のレコードの第1フィールドを出力

```bash
awk 'NR < 5 {print $1}' /etc/resolv.conf
```


条件文は省略可能

例) 条件文を省略した例

```bash
$ awk '{print $1}' /etc/resolv.conf
```




# 変数

## 1. 特殊変数

### $0

処理中のレコード全部が入る

### $1, $2, $3 …

各フィールドが 1から順に $1 $2 $3 … に割り当てられる
フィールドはデフォルトではスペース区切り

```bash
$ awk '{print $1}' /etc/resolv.conf
```

## 2. 組み込み変数

| 変数名 | 説明 |デフォルト値|
|:-----------|------------:|------------:|
| NF         |  現在のレコードのフィールド数 | |
| NR         |  現在のレコード数  | |
| FS  (Field Separator)     | フィールドの区切り文字   | スペース |
| RS  (Record Separator)     | レコードの区切り文字   | 改行 |
doit.imのchrome拡張の仕様がいまいちなのをどうにかする

doit.imのchrome拡張でコンテクストメニューから
文字列を選択せずタスクを追加すると

タスク名：ページのURL
タスクノート：
という残念なタスクが登録されてしまう。

タスク名：ページのタイトル
タスクノート：ページのURL
となるようにしたい。


```Javascript:right_click.js.old
var title_page =  _L("background_add_page_url");
var id_page = chrome.contextMenus.create({
    'title': title_page, 'contexts':['page'], 'onclick': function(OnClickData){
        var tmp = $.trim(OnClickData.pageUrl);
        if(tmp.length > 225){
            alert(_L('TASK_VALI_TITLE_TOO_LONG'));
            return;
        }else{
            var task = {
                uuid:makeUUID(),
                title : tmp,
                notes : '',
                start_at : null,//要拼凑
                completed : null,
                all_day : true,
                attribute: 'inbox'
            }
            postTask(task,function(t){
                alert(_L('Success'));
            });
        }
        //alert('page '+OnClickData.pageUrl);
    }
});
```

onclickのコールバックの引数にtabを追加するだけで、
titleを取得することができます。

```Javascript:right_click.js.new
var title_page =  _L("background_add_page_url");
var id_page = chrome.contextMenus.create({
    'title': title_page, 'contexts':['page'], 'onclick': function(OnClickData,tab){
        var tmp = $.trim(OnClickData.pageUrl);
        if(tmp.length > 225){
            alert(_L('TASK_VALI_TITLE_TOO_LONG'));
            return;
        }else{
            var task = {
                uuid:makeUUID(),
                title : tab.title,
                notes : tmp,
                start_at : null,//要拼凑
                completed : null,
                all_day : true,
                attribute: 'inbox'
            }
            postTask(task,function(t){
                alert(_L('Success'));
            });
        }
        //alert('page '+OnClickData.pageUrl);
    }
});
```
Berksfileで拾ってきたCookbookがコケた時の対処（attributesが読み込まれない編）


# 事象

Berksfileで拾ってきたレシピを使いたいが、include_recipeの最中にChefがコケる。

```Berksfile
cookbook 'java',
  :git => 'git://github.com/opscode-cookbooks/java.git', :branch => 'master'
```

```
% berks install --path vendor/cookbooks
```

```site-cookbooks/hoge/recipe/default.rb
...
include_recipe 'java'
...
```

```
% knife solo cook hoge
...
================================================================================
Recipe Compile Error in /tmp/vagrant-chef-1/chef-solo-1/cookbooks/hoge/recipes/default.rb
================================================================================


NoMethodError
-------------
undefined method `[]' for nil:NilClass


Cookbook Trace:
---------------
  /tmp/vagrant-chef-1/chef-solo-2/cookbooks/java/recipes/oracle.rb:31:in `from_file'
  /tmp/vagrant-chef-1/chef-solo-2/cookbooks/java/recipes/default.rb:21:in `from_file'
  /tmp/vagrant-chef-1/chef-solo-1/cookbooks/cdh-node/recipes/default.rb:10:in `from_file'


Relevant File Content:
----------------------
/tmp/vagrant-chef-1/chef-solo-2/cookbooks/java/recipes/oracle.rb:

 24:  #convert version number to a string if it isn't already
 25:  if jdk_version.instance_of? Fixnum
 26:    jdk_version = jdk_version.to_s
 27:  end
 28:
 29:  case jdk_version
 30:  when "6"
 31>>   tarball_url = node['java']['jdk']['6'][arch]['url']
 32:    tarball_checksum = node['java']['jdk']['6'][arch]['checksum']
 33:    bin_cmds = node['java']['jdk']['6']['bin_cmds']
 34:  when "7"
 35:    tarball_url = node['java']['jdk']['7'][arch]['url']
 36:    tarball_checksum = node['java']['jdk']['7'][arch]['checksum']
 37:    bin_cmds = node['java']['jdk']['7']['bin_cmds']
 38:  end
 39:
 40:  if tarball_url =~ /example.com/
```

# 原因

拾ってきたレシピのattributes/default.rbが読み込まれていない。

```vendor/cookbooks/java/attributes.default.rb
…
# default jdk attributes
default['java']['install_flavor'] = "openjdk"
default['java']['jdk_version'] = '6'
default['java']['arch'] = kernel['machine'] =~ /x86_64/ ? "x86_64" : "i586" # <= ここの設定読み込みが必要
default['java']['openjdk_packages'] = []
...
```

# 解決策

拾ってきたレシピのattributesが読み込まれるようにする。
metadata.rbにdependsで利用するcookbookを指定することでattributesの値が読み込まれるようになる。

```site-cookbooks/hoge/metadata.rb
...
depends          'java'
...
```

```
% knife solo cook hoge
…
[2014-01-17T14:45:07+09:00] INFO: Chef Run complete in 38.748854677 seconds
[2014-01-17T14:45:07+09:00] INFO: Running report handlers
[2014-01-17T14:45:07+09:00] INFO: Report handlers complete
[2014-01-17T14:44:28+09:00] INFO: Forking chef instance to converge...
[2014-01-17T14:44:28+09:00] DEBUG: Fork successful. Waiting for new chef pid: 14321
[2014-01-17T14:45:07+09:00] DEBUG: Forked instance successfully reaped (pid: 14321)
[2014-01-17T14:45:07+09:00] DEBUG: Exiting
```

# 余談

* metadata.rbの中でdependsしなくてもレシピの使用は可能で、呼出す側のattributesに値を定義しておけばそれが適用される。
* attributesの中だとkernel変数が存在しているがrecipe側で使おうとすると使えなかった。
第三者品質管理事業

中国オフショア開発向けて、第三者品質管理事業を立てようかと思いまして、行けそうでしょうか。

下記管理の項目有無で見積もりを出します。

(1) 進捗の確保
(2) 機能検証(ブラックボックス)
(3) アプリのセキュリティ脆弱性検出
(4) 成果物の品質(ドキュメント、ソースコード)
(5) プロセス改善
(6) アジャイル開発コンサルタント
(7) メモリリーク検出
WP-CLIまとめ


[wp-cli](http://wp-cli.org/)でできること

- WordPressのインストール、アップグレード
- テーマのインストール、アップグレード
- プラグインのインストール、アップグレード
- DB操作
- 投稿やページの作成や編集

# インストール

## 必要条件

- PHP5.3以上
- Wordpress3.4以上

```bash
$ curl https://raw.github.com/wp-cli/wp-cli.github.com/master/installer.sh | bash
```

確認

```bash
$ ~/.wp-cli/bin/wp —info
```

パスを通す
以下を.bash_profile等に追加

```bash
source $HOME/.wp-cli/vendor/wp-cli/wp-cli/utils/wp-completion.bash
```

WPコマンドでWordpressをセットアップ

- Wordpressのインストール

```bash
$ wp core download --locale=ja --path={Wordpressのインストールディレクトリ}
```
- Databaseのセットアップ

```bash
$ mysql -u root -p

mysql> CREATE DATABASE IF NOT EXISTS {DB_NAME} CHARACTER SET UTF8;
mysql> GRANT ALL PRIVILEGES ON {DB_NAME}.* TO {DB_USER_ANEM}@LOCALHOST IDENTIFIED BY 'XXXX';
mysql> FLUSH PRIVILEGES;
```

- configファイルの作成

```bash
$ wp core config --dbname={DB_NAME} --dbuser={DB_USER} --dbpass={DB_PASSWORD}
```

```bash
$ wp core install --url={公開するURL} --title="{サイトのタイトル}" --admin_name={アドミンユーザー名} --admin_email={アドミンメールアドレス} --admin_password={アドミンパスワード}
$ wp plugin install contact-form-7 all-in-one-seo-pack wp-multibyte-patch better-wp-security ewww-image-optimizer wp-super-cache wp-basic-auth flamingo wp-clone-by-wp-academy --activate
```
作業中にブランチを切り替えたい場合

作業途中とかに中途半端にコミットしたくなくて別ブランチに切り替えたい、
現在の作業を一旦中断して同ブランチで取り急ぎの作業をする場合とかに使う。

## 作業を一旦退避させる

```bash
$ git stash save 'message'
```

## 保存した作業の一覧を確認する

```bash
$ git stash list
```

## 作業を復元する

```bash
# 最新の状態に戻す場合
$ git stash pop

# 指定の状態に戻す場合
$ git stash pop stash@{n}
```

## 参考リンク

http://kotazi.com/archives/1162/
http://transitive.info/article/git/command/stash/
http://git-scm.com/book/ja/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E4%BD%9C%E6%A5%AD%E3%82%92%E9%9A%A0%E3%81%99
PHPのリソースに対する認識、間違っていませんか…？

# 解放されたリソースの扱い

## 検証

次のコードを試してみてください。

```php
<?php
function resource_test($resource, $name) {
    echo 
        '[' . $name. ']',
        PHP_EOL,
        '(bool)$resource => ',
        $resource ? 'TRUE' : 'FALSE',
        PHP_EOL,
        'get_resource_type($resource) => ',
        get_resource_type($resource) ?: 'FALSE',
        PHP_EOL,
        'is_resoruce($resource) => ',
        is_resource($resource) ? 'TRUE' : 'FALSE',
        PHP_EOL,
        PHP_EOL
    ;
}
 
$resource = tmpfile();
resource_test($resource, 'Check Valid Resource');
 
fclose($resource);
resource_test($resource, 'Check Released Resource');
 
$resource = null;
resource_test($resource, 'Check NULL');
```

実行結果は以下のようになるでしょう。

```php
[Check Valid Resource]
(bool)$resource => TRUE
get_resource_type($resource) => stream
is_resoruce($resource) => TRUE

[Check Released Resource]
(bool)$resource => TRUE
get_resource_type($resource) => Unknown
is_resoruce($resource) => FALSE

[Check NULL]
(bool)$resource => FALSE
get_resource_type($resource) => FALSE
Warning:  get_resource_type() expects parameter 1 to be resource, null given in ... on line 10
is_resoruce($resource) => FALSE
```

## ポイント

- リソース型の値は論理型にキャストしたとき必ず`True`になる。
- リソースは解放されるとリソースタイプが`"Unknown"`に変化する。`is_resource`関数はリソース型であるかどうかのチェックの後、<ins>リソースタイプが</ins>**`"Unknown"`**<ins>でないかどうか</ins>のチェックも行う。
- `is_resource`関数は全ての値を受け付けるが、 **`get_resource_type`**<ins>関数はリソース型の値しか受け付けない</ins>。
いろいろProxy設定メモ

Proxyありの環境で必要になった各種設定のメモ

### cygwin
setup時のダイアログで選択または入力

### apt-cyg
wgetの設定でOK

### wget
下記設定ファイルに例を参考にして追記

```:/etc/wgetrc
# You can set the default proxies for Wget to use for http, https, and ftp.
# They will override the value in the environment.
#https_proxy = http://proxy.yoyodyne.com:18023/
#http_proxy = http://proxy.yoyodyne.com:18023/
#ftp_proxy = http://proxy.yoyodyne.com:18023/

http_proxy = http://proxy.xxx.yyy.zzz.jp:8080/
https_proxy = http://proxy.xxx.yyy.zzz.jp:8080/
ftp_proxy = http://proxy.xxx.yyy.zzz.jp:8080/
```

### svn
下記設定ファイルに例を参考にして追記

```:~/.subversion/servers
[global]
# http-proxy-exceptions = *.exception.com, www.internal-site.org
# http-proxy-host = defaultproxy.whatever.com
# http-proxy-port = 7000
# http-proxy-username = defaultusername
# http-proxy-password = defaultpassword
# http-compression = no
# No http-timeout, so just use the builtin default.
# No neon-debug-mask, so neon debugging is disabled.
# ssl-authority-files = /path/to/CAcert.pem;/path/to/CAcert2.pem
#
# Password / passphrase caching parameters:
# store-passwords = no
# store-ssl-client-cert-pp = no
# store-plaintext-passwords = no
# store-ssl-client-cert-pp-plaintext = no

http-proxy-host = proxy.xxx.yyy.zzz.jp
http-proxy-port = 8080
```

### ssh
下記設定ファイルで管理するのがラクらしい
(すべての接続にプロキシを使用してローカル接続では使用しない例)

```:~/.ssh/config
Host *
  ProxyCommand /usr/local/bin/connect -H proxy.xxx.yyy.zzz.jp:8080 %h %p

Host localhost 127.0.0.1
  ProxyCommand none
```

```:メモ
connect - ソケットの接続を行う
usage: /usr/local/bin/connect [-dnhst45] [-p local-port][-R resolve] [-w timeout]
          [-H proxy-server[:port]] [-S [user@]socks-server[:port]]
          [-T proxy-server[:port]]
          [-c telnet-proxy-command]
          host port
```

### git
下記設定ファイルに例を参考にして追記、またはコマンドから設定

```:~/.gitconfig
[http]
    proxy=proxy.xxx.yyy.zzz.jp:8080
[https]
    proxy=proxy.xxx.yyy.zzz.jp:8080
```

### eclipse
『Preferences ＞ Gernal ＞ Network Connectios』に設定する場所があるので適宜追加
【Koding.com】nodejsを勉強するために、練習環境を構築

## 背景
* 初心者として、nodejs言語を勉強する
* 各場所に勉強できるようにしたい

## 参照
* [koding](https://koding.com)(ブラウザでubuntu上に軽く開発できるサイト)
* [npmでnode.jsのアップグレード](http://qiita.com/_shimizu/items/26589028ed3ea7e5b359)

## 環境構築
* kodingにログインして、https://koding.com/Terminal でterminalを使えるように

* kodingのVMに、nodejsがインストールされているけど、確認

```bash
$ node -v
v0.10.18
```

* [npmでnode.jsのアップグレード](http://qiita.com/_shimizu/items/26589028ed3ea7e5b359)

```bash
$ sudo npm cache clean -f        
npm WARN using --force I sure hope you know what you are doing.

$ sudo npm install -g n
npm http GET https://registry.npmjs.org/n
npm http 200 https://registry.npmjs.org/n
npm http GET https://registry.npmjs.org/n/-/n-1.1.0.tgz
npm http 200 https://registry.npmjs.org/n/-/n-1.1.0.tgz
/usr/bin/n -> /usr/lib/node_modules/n/bin/n
npm WARN unmet dependency /usr/lib/node_modules/kd/node_modules/kite-amqp requires redis@'latest' 
but will load
npm WARN unmet dependency /usr/lib/node_modules/kd/node_modules/redis,
npm WARN unmet dependency which is version 0.9.1
npm WARN unmet dependency /usr/lib/node_modules/kd/node_modules/kite-amqp requires underscore@'lat
est' but will load
npm WARN unmet dependency /usr/lib/node_modules/kd/node_modules/underscore,
npm WARN unmet dependency which is version 1.5.2
npm WARN unmet dependency /usr/lib/node_modules/kd/node_modules/kite-amqp requires coffee-script@'
latest' but will load
npm WARN unmet dependency /usr/lib/node_modules/kd/node_modules/coffee-script,
npm WARN unmet dependency which is version 1.6.3
npm WARN unmet dependency /usr/lib/node_modules/kd/node_modules/kite-amqp requires hat@'latest' bu
t will load
npm WARN unmet dependency /usr/lib/node_modules/kd/node_modules/hat,
npm WARN unmet dependency which is version 0.0.3
npm WARN unmet dependency /usr/lib/node_modules/kd/node_modules/kite-amqp requires optimist@'lates
t' but will load
npm WARN unmet dependency /usr/lib/node_modules/kd/node_modules/optimist,
npm WARN unmet dependency which is version 0.6.0
n@1.1.0 /usr/lib/node_modules/n

$ sudo n stable

     install : 0.10.24
       mkdir : /usr/local/n/versions/0.10.24
       fetch : http://nodejs.org/dist/v0.10.24/node-v0.10.24-linux-x64.tar.gz
/usr/bin/node                                                                                     
   installed : v0.10.24

/* 再ログインする */

$ node -v
v0.10.24
```

* SingleCompileのインストール
 * 参照： [C++勉強のために、koding上に簡単的に環境構築する](http://qiita.com/alingogo@github/items/e5db406bfe24c463e2ae)

* hello node.js

```js
console.log("hello node.js!")  
```

* 「:SCCompileRun」を実行して、結果が表示された
sshの接続先毎にメモを表示させる

凄くニッチな需要だと思うメモ。

ssh接続自体は公開鍵認証で楽ちんログインしてるんだけど…

- 接続先サーバで`su`する際のパスワードを覚えてられない
- パスワードを変更する権限が自分にないし、NOPASSWORDでsudoする設定も禁止
- 接続先サーバ上にpassword.txtとかっていうあからさまなメモを置くのもはばかられる

などという理由で仕方なく毎回自分の手元にあるパスワードメモファイルを探して開いてコピペするという作業をしてる人用の設定。

```text:~/.ssh/config
Host example.jp
  User oreore
  PermitLocalCommand yes
  LocalCommand echo 'rootの成り方: sudo su #pass:xyzabc'
```

こんな風にしておけばログインした時に、コピペ用のパスワードがぶっちゃけ表示されますｗ
もちろんセキュリティ的にはアレなので、ローカルの~/.ssh/configの管理をしっかりした上に、ショルダーハックされないような状況でしか使うべきではないので、多用厳禁ですよ！
でも年に1度入るかどうかていうサーバのパスワードとか正直覚えてないし、そのサーバ情報の資料を探すのも大変な時があるのでね、うん…。


ちなみに oreore でログイン後、oreore_admin に一度`su`して、更にoreore_admin状態で`sudo su`する必要があるような場合は↓こんなふうにすれば一発でsuとsudo suが出来るのでこれをechoしとくもよし。

```bash:
su oreore_admin --session-command "exec sudo su" #pass:xyzabc
```

suでコマンド実行するときは -c てオプションもあるけどsudoの場合は普通ttyを要求されるので --session-command オプションの方を使うのが良い。
フォントサイズを速攻変えるキーバインド

大抵のアプリが Command + (+|-|0) でズームイン/アウトできるので、
Emacs でも同じことがしたい。出来ないのは悔しい。

コードレビュー時とか、深夜残業で目がショボショボしてきた時とか、
コンタクトレンズを洗面所でうっかり流した時とか。

そこで以下のような設定。

```el:init.el
;;; この辺は OSX 専用の設定
; OSXのIMEを使う
(setq default-input-method "MacOSX")
; option キーを Meta として扱う
(setq ns-option-modifier 'meta)
; command キーを Ctrl として扱う
(setq ns-command-modifier 'control)

;;; ここからフォントサイズ変更の設定
; \C-+ で拡大
(global-set-key [(control ?+)] (lambda () (interactive) (text-scale-increase 1)))
; \C-- で縮小
(global-set-key [(control ?-)] (lambda () (interactive) (text-scale-decrease 1)))
; \C-0 でデフォルトに戻す
(global-set-key [(control ?0)] (lambda () (interactive) (text-scale-increase 0)))
```

拡大.縮小の数値はお好みで。

実際には `\C +`, `\C =`, `\C 0` なんだが、 `ns-command-modifier` の設定との組合せによって、
他のアプリと同じように Command + (+|-|0) でフォントの拡大/縮小が出来るようになる。
C++で処理時間を計測

実装した処理のパフォーマンスチューニングをする際に時間計測は必須です。
毎回調べているので、書き留めておきます。

```time_count.cpp
#include <iostream>
#include <atltime.h>

int test(void){
	CFileTime cTimeStart, cTimeEnd;
	CFileTimeSpan cTimeSpan;
	cTimeStart = CFileTime::GetCurrentTime();           // 現在時刻

	//TOOD:ここに計測したい処理を記述

	cTimeEnd = CFileTime::GetCurrentTime();           // 現在時刻
	cTimeSpan = cTimeEnd - cTimeStart;
	std::cout<< "処理時間:" << cTimeSpan.GetTimeSpan()/10000 << "[ms]" << std::endl;
}
```
FPS60を目指す施策について

## 参考リンク
https://www.youtube.com/watch?v=n8ep4leoN9A
http://www.smashingmagazine.com/2013/06/10/pinterest-paint-performance-case-study/
http://engineering.wingify.com/posts/getting-60fps-using-devtools/
http://www.html5rocks.com/en/tutorials/speed/animations/
http://www.thecssninja.com/javascript/pointer-events-60fps
https://plus.google.com/+PaulIrish/posts/Ee53Gg6VCck
http://blog.cacoo.com/ja/2013/06/03/web-paint-performance/
http://www.smashingmagazine.com/2013/06/10/pinterest-paint-performance-case-study/
ターミナル上で高速に起動するemacsclientを使う

## emacsclient

起動中の Emacs (GUI) か daemon を利用する形になるので、
起動時の長ったらしい elisp package や設定の読み込みが省け、かなり高速。

ターミナルで Emacs (CUI) を使いたい場合が多々ある人にはオススメ。

15年も使ってるのに、実は2年ほど前に初めて知った...

## 設定

ここでは、普段使っている起動中の Emacs (GUI) を利用する方法について記述。
いずれ daemon を利用する方法についても記述したい。

設定は至って簡単。
GUI での起動時のみ有効にする設定は、既に使っていると思われる（なければぐぐるか、コピペ...）
ので、そこに `(server-start)` を記述してやるだけ。

```el:init.el
(if (eq window-system 'ns)
  (progn

    ; ここにGUIアプリとして起動した時の設定があるはず

    (server-start) ; ← こいつで server 起動
    ))
```

で、ターミナルから
`$ emacsclient -nw hogefile`
とすれば良い。

ここで、
`$ emacsclient hogefile`
とすると、 GUI 側でファイルを開く。これも便利。

ちなみに、 Emacs (GUI) を起動していない状態で emacsclient を起動しようとすると
`can't find socket; have you started the server?`
みたいなのが出る。

---
以下は主に OSX で、 Emacs を自力ビルドしている猛者向け。

.zprofile (bash な方は .bash_profile ？)に

```zsh:.zprofile
export EDITOR=/Applications/Emacs.app/Contents/MacOS/bin/emacsclient
```

.zshrc (bash な方は .bashrc ？)に

```zsh:.zshrc
alias emacsclient='/Applications/Emacs.app/Contents/MacOS/bin/emacsclient'
```

と書いておけば、前述のコマンドのまま使用可能。
自力ビルドしている猛者には、蛇足かも。

環境変数 EDITOR の後ろに -nw を付ける/付けないはお好みで。
tsdの0.5-alphaを導入する

TSDはTypeScriptの型定義のパッケージマネージャーとして有名ですが、
Githubから次期バージョンのプレリリース版を取得できます。

最新の型定義はこちら向けに書かれている（らしい？）ので、使ってみました。

ローカルにインストールします。

```js:package.json
...
  "devDependencies": {
    ...
    "tsd": "git://github.com/DefinitelyTyped/tsd/#0.5.2-alpha.11"
  }
...
```

```shell-session
> npm install
```

プレリリース版はコマンドオプションが大きく変わっているので注意が必要です。
例えば、パッケージのインストールは以下のようになります。

```shell-session
> tsd query bootstrap -a install
```

[DefinitelyTyped/tsd](https://github.com/DefinitelyTyped/tsd)
(Mac)Aptanaキーボードカット 種類別まとめ


# 表示切り替え

### 編集するファイルを切り替える

* command + F6
* control + tab
* shift + control + tab  
* option + command + 矢印キー左右

### ビューを切り替える

* command + F7

# テキストエディタ
## カーソル移動

### 単語単位
* option + 矢印キー左右

### 行番号指定

* command + L

## 編集

### 行削除

* command + D

### 行を上下に移動

* option + Up Arrow
* option + Down Arrow

### 複数行まとめてインデント

* 行を選択した状態で tab
* 行を選択した状態で shift + tab