OmniAICreator/Qiita-1.07M huggingface dataset:
EmacsでPATHの設定が引き継がれない問題をエレガントに解決する

Mac や Ubuntu で Emacs を GUI で立ち上げると PATH の設定が引き継がれません

そのため Emacs から外部プログラムを呼び出す際にうまくいかないという問題が発生します

今までそれを [シェルと Emacsの PATHを共有する - Life is very short](http://d.hatena.ne.jp/syohex/20111117/1321503477) を参考に `.zshrc` 側で設定をしていました

しかし，Emacs の設定に `.zshrc` から書き込むというのは気持ち悪かったので変えたいと思っていました

今回は Emacs で完結する設定方法を 2 つ見つけたので紹介します

[init-loader.el と package.el を導入して快適 Emacs ライフ - Qiita [キータ]](http://qiita.com/catatsuy/items/5f1cd86e2522fd3384a0)

この設定がしてあることを前提に話していきます

# exec-path-from-shell を使う

[exec-path-from-shell](https://github.com/purcell/exec-path-from-shell)

これを使います

`package.el` の設定をしているならそこから簡単にインストール出来ます

そして

```cl:21-exec-path-from-shell.el
(exec-path-from-shell-initialize)
```

と書けば PATH が引き継がれます

簡単ですね


# 自分で書く

適当なファイルに以下の設定をします

```cl:11-path.el
(defun set-exec-path-from-shell-PATH ()
  "Set up Emacs' `exec-path' and PATH environment variable to match that used by the user's shell.

This is particularly useful under Mac OSX, where GUI apps are not started from a shell."
  (interactive)
  (let ((path-from-shell (replace-regexp-in-string "[ \t\n]*$" "" (shell-command-to-string "$SHELL --login -i -c 'echo $PATH'"))))
    (setenv "PATH" path-from-shell)
    (setq exec-path (split-string path-from-shell path-separator))))

(set-exec-path-from-shell-PATH)
```

まあ最初の方の文言は何でもいいのですが，これだけで設定ができます


# まとめ

[年末emacs設定大掃除をして、これは捨てられないと思った設定書いてく - $shibayu36->blog;](http://shibayu36.hatenablog.com/entry/2012/12/29/001418)

> emacsを使っていると一度はPATHなどの設定で死ぬ思いをする気がします

とあるように，私もこの前すごく悩みました

しかし Emacs のみで PATH の設定を完結できることが分かってよかったです
XcodeのArchiveを一括削除する方法

Xcodeでアプリ申請するときなどにArchiveしたデータはアプリの容量と同じだけHDDを圧迫します。
気がついたら数GBも溜まってたりするのでたまに消しちゃいましょう。

/Users/ユーザー名/Library/Developer/Xcode/Archives

にArtiveしたデータが格納されてるので、ふつうにゴミ箱に入れちゃえばOKです。
とりあえず僕の環境ではこれでなんの問題もありませんが、やるときは自己責任でお願いしますm(_ _)m
php で連想配列のキーを指定したarray_popみたいなもの

配列関数にこういうのあったら嬉しかったけど、なかった…。

```php:array_pop_key.php
 public static function array_pop_key(&$array, $key)
  {
    $value = null;
    if(isset($array[$key]))
    {
      $value = $array[$key];
      unset($array[$key]);
    }
    return $value;
  }
```
Redisのソート済みセット型を使ったリアルタイムランキングの実装


![スクリーンショット 2013-07-17 12.06.49.png](https://qiita-image-store.s3.amazonaws.com/0/21212/54edef1a-5852-bbed-f97b-f813e8dc3f75.png "スクリーンショット 2013-07-17 12.06.49.png")
※リアルタイムランキングはランキングの変動を瞬時に表すことと定義します

現在のプロジェクトでは、Redisのソート済みセット型を応用してバッチ処理などの集計が必要ないランキングを実装しています。

* Redis http://redis.shibu.jp/

## Redisのソート済みセット型について

| row | member | score |
|:-----------|------------:|:------------:|
| 1 | user1 | 200 |
| 2 | user2 | 100 |
| 3 | user3 | 300 |
| 4 | user4 | 200 |
| 5 | user5 | 400 |

上記のようなテーブルがあった際にメンバの順位を求めようと思うと、通常なら「スコアを元に並べ替え」をした後に「順位を知りたいユーザが何件目」にあるかという処理の流れになります。
Redisのソート済みセット型では、スコアを用いて並び替えが内部で行われるので、ソート済みセット型を利用した取得（zrank）で順位を求めるだけで、並び替えを意識することなく結果が得られます。
keyとは任意の文字列でランキング1つにつき1つのキーを使います。

zrank key user2 => 4（zrankを使った取得ではインデックスが返ってくる）
rank = 4 + 1（インデックスに+1したものが順位）

同率順位を加味した順位を取得する実装はこちら
http://qiita.com/devhiroki/items/2fe81d691b94b6db795d

## リアルタイムランキング結果の取得実装について

1. 順位を取得する
2. アプリケーションの処理をする（ランキングのスコア加算を含む）
3. 順位を取得する

ソート済みセット型を使うだけで集計を意識する必要は無いので、処理の前後に順位を取得する処理をするだけで、ランキングの変動を表現することが出来ます。

## 中間・最終ランキングに分かれている際の実装について

ランキングが中間・最終の2つに分けたいというアプリケーション要件の際は、下記のようにキーを分けることによって実現できます。
最終は中間までのスコアも含めた状態ということは、中間の時から常に加算しておけば良いという考え方です。

#### 中間ランキング
1. 中間キーの順位を取得する
2. 中間キーに対して加算する、最終キーに対して加算する
3. 中間キーの順位を取得する

#### 最終ランキング
1. 最終キーの順位を取得する
2. 最終キーに対して加算する
3. 最終キーの順位を取得する

## ランキング確定について

よくあるランキングの確定とは、バッチ処理を走らせて処理が終わったタイミングでランキングが確定するというものが一般的だと思います。ランキング確定のためのバッチ処理後は、その後にスコアが加算されてもランキングは変動しません。
しかし、Redisで上記のような実装をする場合はソート済みセット型の性質から、スコアを加算されたら必ずランクが変動してしまいますので、本質的なランキング確定をさせることができません。要件に応じて、他のデータストア等に結果を書き出すことをお勧めしますが、現在のプロジェクトでは、スコアを加算されない時間帯に入ることでランキング確定としています。スコアが加算さえされなければ順位が変動することが無いという考え方です。
(Windows7) コマンドでネットワークIFの有効化、無効化を行う

Windows7で、netshコマンドでネットワーク接続の有効化、無効化を行う。


### コマンド

有効化

```bat:
> netsh interface set interface "ネットワーク名接続名" enable
```

無効化

```bat:
> netsh interface set interface "ネットワーク名接続名" disable
 
```

※interfaceは「int」、enableは「ena」、disableは「dis」に短縮可能

###　例

例）「ローカルエリア 接続」を有効化

```bat:
> netsh interface set interface "ローカル エリア接続" enable
```

例）「ローカルエリア 接続」を無効化

```bat:
> netsh interface set interface "ローカル エリア接続" disalbe
```

例）「ワイヤレス ネットワーク 接続」を有効化

```bat:
> netsh int set int "ワイヤレス ネットワーク 接続" enable
```

例）「ワイヤレス ネットワーク接続」を無効化

```bat:
> netsh int set int "ワイヤレス ネットワーク接続" disable
```

※日本語単語間の「半角スペース」に注意
ranger

* Goで作られた[lf](https://github.com/gokcehan/lf/releases)もある。

## マニュアル

* [ranger - file manager](http://ranger.nongnu.org/)
* [manual](http://ranger.nongnu.org/ranger.1.html)
* man ranger

# インストール

```bash:ubuntu
$ sudo apt-get install ranger atool mediainfo transmission-cli poppler-utils highlight caca-utils w3m
```

```bash:mac
$ brew install ranger atool mediainfo highlight w3m
```

## 設定ファイルの準備

```bash:
ranger --copy-config=rc
```

```diff:$HOME/.config/ranger/rc.conf
- set show_hidden false
+ set show_hidden true
```

## keybind

> '' - 最後にいた場所に移動。ranger終了して、起動した時便利。

> ^D - 下へ移動(半分)
> ^U - 上へ移動(半分)

> i - preview画面を拡大(スクロール可能になる)
> ? - man ranger

> S - shell
> :cd ~ - 移動
> Del - delete

> gn - create new tab
> gt - change tab
> gc - close tab

> dd - cut file 
> pp - paste file 
> Space - file select

## 選択したファイルをshellに渡す

`!`を押すと`:shell`と表示される。

```bash:
:shell scp %s dest:
```
mocha-phantomjsとmochaのヴァージョン


mochaは現在、最新版は1.12.0。

このヴァージョンのmochaは、
そのままhtmlでは呼べない(node.jsでしか動かない)状態になっているようで。
以下のようなエラーが出る。

```
ReferenceError: Can't find variable: process

  mocha-phantomjs/core_extensions.js:21
  mocha-phantomjs/core_extensions.js:82
```

issuesもあった。

- [Cannot Run on CLI (process variable undefined errors) · Issue #58 · metaskills/mocha-phantomjs](https://github.com/metaskills/mocha-phantomjs/issues/58)


原因は、mochaのmocha.jsで「process」にアクセスしちゃってることっぽい。

それらをちゃかちゃかっと消してしまえば、動くようになるかと思ったけど、
けっこうあちこちで使ってるみたいだし、

かといって、mocha.jsがnodeでしか使えないスクリプトになってしまったかと言うとそうでもなく、
冒頭でわざわざrequireの定義とかしてたりするし、

いまひとつ謎ですね。


とりあえずは、mochaのヴァージョン下げて対応している、今日この頃です。
mochaの方のドキュメントまじめに読めば分るかも。

- [fnobi/grunt-init-me](https://github.com/fnobi/grunt-init-me)
composer で入れた phpunit で少し楽をする

最近は phpunit も composer で入れるのが流行っているらしいです。

## Before

composer で phpunit を入れると（標準では）vendor/bin/phpunit に置かれるので次のように実行します。

    $ vendor/bin/phpunit

テストが置いているディレクトリは phpunit.xml.dist や phpunit.xml に記述しているのでこれだけで OK です。

最近はプロジェクトルートに置くファイルが多くなってきたので phpunit.xml はプロジェクト直下ではなく tests/ ディレクトリに置くのがマイブームです。

なので次のようになります。

    $ vendor/bin/phpunit -c tests/

特定のテストだけ実行したいこともあります。その場合は次のようになります。

    $ vendor/bin/phpunit -c tests/ tests/Foo/Bar/BazTest.php

ディレクトリを指定することも出来るので、特定のディレクトリのテストを全部実行したければ次のようになります。

    $ vendor/bin/phpunit -c tests/ tests/Foo/Bar/

特定のディレクトリのテストだけ何度も実行するならそのディレクトリに cd しておいてもいいかもしれません。

    $ cd tests/Foo/Bar/
    $ ../../../vendor/bin/phpunit -c ../../../tests/ .

テストが捗り・・・ます？？

## After

composer で phpunit を入れると（標準では）vendor/bin/phpunit に置かれますが次のように実行します。

    $ phpunit

テストが置いているディレクトリは phpunit.xml.dist や phpunit.xml に記述しているのでこれだけで OK です。

最近はプロジェクトルートに置くファイルが多くなってきたので phpunit.xml はプロジェクト直下ではなく tests/ ディレクトリに置くのがマイブームです。

それでも次のようになります。

    $ phpunit

特定のテストだけ実行したいこともあります。その場合は次のようになります。

    $ phpunit tests/Foo/Bar/Baz.php

ディレクトリを指定することも出来るので、特定のディレクトリのテストを全部実行したければ次のようになります。

    $ phpunit tests/Foo/Bar/

特定のディレクトリのテストだけ何度も実行するならそのディレクトリに cd しておいてもいいかもしれません。

    $ cd tests/Foo/Bar/
    $ phpunit .

テストが捗ります。

## Answer

次のようなシェル関数を定義しています。

```bash
function phpunit
{
    local root="${PWD}"

    while [ -n "${root}" ]; do
        if [ -x "${root}/vendor/bin/phpunit" ]; then
            break
        fi
        root="${root%/*}"
    done

    if [ -z "${root}" ]; then
        command phpunit "$@"
        return $?
    fi

    local cmd=("${root}/vendor/bin/phpunit")

    local dir xml

    for dir in "/tests/" "/" ; do
        for xml in "phpunit.xml.dist" "phpunit.xml"; do
            if [ -e "${root}${dir}${xml}" ]; then
                cmd=("${cmd[@]}" "--configuration=${root}${dir}")
                break 2
            fi
        done
    done

    cmd=("${cmd[@]}" "--colors")

    "${cmd[@]}" "$@" | cat
    return ${PIPESTATUS[0]}
}
```

カレントディレクトリから遡って vendor/bin/phpunit を探して見つかればそれを実行。
なければ PATH の通った phpunit コマンドを実行します。

vendor/bin/phpunit が見つかったときは次の順番でファイルを探し、見つかったらそのディレクトリを --configuration で指定します。

 - tests/phpunit.xml.dist
 - tests/phpunit.xml
 - phpunit.xml.dist
 - phpunit.xml

ついでに色付けのために --colors も追加します（phpunit.xml には書かないポリシー）。

最後の |cat は msysgit で色付けするためのオマジナイです。
inputタグの便利な属性まとめてみた

### はじめに
* HTMLタグはよく使うけど、属性までいちいちどんなのがあるか気にしていなかった
* 今回はinputタグの属性で、へ～使えるなぁコレと思ったものをピックアップしてみた


# パスワード入力欄
 * 入力されたテキスト、ブラウザ上ではアスタリスク（*）などに置き換えられて表示される

```html:
<input type='password'>
```

# 入力文字数制限
 * 以下の例だと9文字以上は入力できない

```html:
<input maxlength='8'>
```

# 入力欄に初期値を表示
 * 何も入力していないときに表示する値を設定できる
 * 文字入力を始めると表示は消える

```html:
<input placeholder='名前を入力してください'>
```

# 入力自動補完
 * 以下の例だと、"スーパー"と入力すると選択肢が表示される
 * また、入力欄をクリックしても選択肢が表示される
 * inputタグのlistとdatalistタグのidは一致している必要がある

```html:
    <input autocomplete="on" list="keywords">
    <datalist id="keywords">
      <option value="スーパーマーケット">
      <option value="スーパーマリオブラザーズ">
      <option value="スーパードライ">
    </datalist>
```

# 入力文字制限
 * 許可された文字以外が入力されていた場合、カーソルをテキストエリアにあてると「入力された値がフィールドに指定された書式と異なります。」と表示される
 * また、許可された文字以外が入力されていた場合、テキストエリア枠が赤くなる
 * 以下の例では半角英数のみの入力を許可する場合

```html:
<input pattern="^[0-9A-Za-z]+$">
```

# 入力必須
 * 入力が必須の場合に使用する
 * 未入力の場合、カーソルをテキストエリアにあてると「このフィールドは入力必須です。」と表示される
 * また、未入力の場合、テキストエリア枠が赤くなる

```html:
<input required>
```

# オートフォーカス
 * ウェブページが表示された際に、指定した入力欄にカーソルが当たって自動的にフォーカスされる
 * 複数autofocusを指定しても最初のほうが優先される

```html:
<input autofocus>
```

----

 * これらの挙動をすぐに見たい方は、HTML書いたんで[こちら](https://gist.github.com/RustyNail/6a61227c6862e56147df/raw/ab02e94e70c3fe49b9c9129c31af5fede1bdaead/input_attribute)をどうぞ！

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
外部からchefのrun_listを利用する

元記事
[http://blog.kenjiskywalker.org/blog/2013/07/17/chef-run_list/](http://blog.kenjiskywalker.org/blog/2013/07/17/chef-run_list/)

run_listを渡してるところを探した。
といってもほとんど[@soh335](https://twitter.com/soh335)が教えてくれた。さすが一流エンジニアだ。



`/chef/lib/chef/run_list.rb`

```
def expansion_for_data_source(environment, data_source, opts={})
  case data_source.to_s
  when 'disk'
    RunListExpansionFromDisk.new(environment, @run_list_items)
  when 'server'
    RunListExpansionFromAPI.new(environment, @run_list_items, opts[:rest])
  end
end
```

ここが怪しかった。


`/chef/spec/unit/run_list_spec.rb`

ここ見たら


```ruby
    describe "from disk" do
      it "should load the role from disk" do
        Chef::Role.should_receive(:from_disk).with("stubby")
        @run_list.expand("_default", "disk")
      end

      it "should log a helpful error if the role is not available" do
        Chef::Role.stub!(:from_disk).and_raise(Chef::Exceptions::RoleNotFound)
        Chef::Log.should_receive(:error).with("Role stubby (included by 'top level') is in the runlist but does not exist. Skipping expand.")
        @run_list.expand("_default", "disk")
      end
    end
```

こんなん書いてあった。



```ruby
#!/usr/bin/env ruby

require 'rubygems'
require 'pp'
require 'json'
require 'chef/run_list'

json_file = "./json/yoshimasa.json"

host_config = JSON.parse(File.read(json_file))

Chef::Config[:cookbook_path] = '/root/chef/cookbook/'
Chef::Config[:role_path] = '/root/chef/json/'

run_list = Chef::RunList.new("recipe[nginx]", "role[hoge]")

p run_list
# #<Chef::RunList:0x7f6fb8732510 @run_list_items=[#<Chef::RunList::RunListItem:0x7f6fb87323d0 @type=:recipe, @version=nil, @name="nginx">, #<Chef::RunList::RunListItem:0x7f6fb87323a8 @type=:role, @version=nil, @name="hoge">]>

pp run_list.expand("_default", "disk")
# #<Chef::RunList::RunListExpansionFromDisk:0x7f6fb8732100
#  @applied_roles={"hage"=>true, "hoge"=>true},
#  @default_attrs={},
#  @environment="_default",
#  @missing_roles_with_including_role=[],
#  @override_attrs={},
#  @recipes=["nginx", "postfix", "yum"],
#  @run_list_items=[],
#  @run_list_trace=
#   {"role[hoge]"=>["role[hage]", "recipe[postfix]", "recipe[yum]"],
#    "top level"=>["recipe[nginx]", "role[hoge]"]},
#  @source=nil>

p run_list.expand("_default", "disk").recipes
# ["nginx", "postfix", "yum"]
```

こんな感じでrun_listを読める。何が便利かっていうと

```hoge.json
{
  "run_list": [
    "role[hage]"
  ]
}
```

```hage.json
{
  "run_list": [
    "recipe[postfix]", "recipe[yum]"
  ]
}
```

```ruby
run_list = Chef::RunList.new("recipe[nginx]", "role[hoge]")

...
p run_list.expand("_default", "disk").recipes
# ["nginx", "postfix", "yum"]
```

という感じにroleの中のrun_listを読み込んでrecipesに突っ込んでくれる。
ufw 設定し直したメモやFailed to fetch 対策

ロクに更新もしてないblogにですが連日スパムが鬱陶しかったのでアクセス自体を弾くことに。

apache上からもallow,deny設定できるがufwやiptablesなどでアクセスを拒否るするのがより正しいらしい。
ubuntuでは基本的にはufwで管理する。
iptablesは分かるがufwは分からない、嫌だという場合は
```sudo vim /lib/ufw/user.rules```
でufwで更新される内容がiptablesの記述方式で保存されているっぽいですが直で編集していいのか不明です。
ルールは上の方の行(number)のものが優先されるらしい。

現在の設定状況は
```sudo ufw status numbered```
で確認できる。削除したいものがあった際には上記コマンド表示結果の[ ]のnumberを指定して(例えば[ 1]だった場合は)
```sudo ufw delete 1```
で削除。
アクセス拒否ルール追加は
```sudo ufw deny from 123.0.0.0/24 to any port 80```
```sudo ufw deny from 123.123.0.0/16 to any port 80```
特定のhost名やドメイン単位で拒否する場合の書き方は分からず。。
拒否ルールを適当に追加した後に特定の拒否以外は基本許可、公開するものなので
```sudo ufw allow 80```
を追記して
```sudo ufw reload```
追記や削除したルールの反映を行う。


###Failed to fetch 対策

ubuntuでapt-get update時にFailed to fetch でエラーになる対策です。

sudo vi /etc/resolv.conf
で

```
# google nameserver
nameserver 8.8.8.8
nameserver 8.8.4.4
```

を追加すれば解決できるようです。

参考先
http://ubuntuforums.org/showthread.php?t=1499512


univers　の取得先は確かにIgnで有効でないようなのですが、今回は弄っていいものかわからずそのままにしました。。


という方法は直接いじるべきではないファイルをいじっているのでよろしくなかったようです。

なので
sudo apt-get install resolvconf
でコレを使うと
sudo vi /etc/network/interfaces
で既存の同等の行を編集か末尾に追加を編集した後に再起動かrestartで反映されて有効になるようです。


```
# DNS Setting
dns-nameservers 8.8.8.8
dns-search google-public-dns-a.google.com
```

編集した後で
sudo /etc/init.d/networking restart
でresolv.confに反映されるはずです。
チームで利用するスクリプトに便利な -c オプション

# git-configで設定されてる値によって結果が変わるようなスクリプトをなんとかしたい！

そんなときはそのコマンドのみ指定したconfigの値で実行する `-c` オプションが便利です。

例えば、git管理下にある日本語のファイルに対してあれやこれや処理をしたい場合、
core.quotepathの設定によってはうまくいかないことがあったりします。

`git ls-files | grep '何か日本語'`
    core.quotepath=true になっている場合うまくいかない！

# そんなときは -c オプション！
`git -c core.quotepath=false ls-files | grep '何か日本語'`
core.quotepath=true になっていてもうまくいく！

# まとめ
チームでの利用など他の人と共有するスクリプトで、configの値に左右されそうなものがあったらとりあえず
`-c hoge` の指定をしておくと無用なトラブルが減らせるかもしれません！

ちなみに `git config hoge` で設定できる書き方であればなんでもいけるらしいです。

### おまけ
`core.quotepath`: trueだとファイル名がquoteされるらしい。多分、falseにするとコンソールに日本語とか表示されると思っておけばおｋ。詳しくは下記
[git-config](https://www.kernel.org/pub/software/scm/git/docs/git-config.html)

-cオプションについて詳しく知りたい方はこちら
[git(1) Manual Page](https://www.kernel.org/pub/software/scm/git/docs/git.html)
vagrant + virtualbox 仮想サーバ構築

## VirtualBoxのインストール

公式サイトからダウンロードします
####VirtualBox
https://www.virtualbox.org/wiki/Downloads

Mac OS X　環境なので以下を使います
####VirtualBox 4.2.16 for OS X hosts  x86/amd64
http://download.virtualbox.org/virtualbox/4.2.16/VirtualBox-4.2.16-86992-OSX.dmg

## Vagrantの導入

Rubyとrubygemsのバージョン確認

```
$ ruby -v
ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-darwin12.4.1]
$ gem -v
1.8.23
```

rubygemsからVagrantをインストールする
（2013/7/17修正）
RubyGems経由だと1.0.7がインストールされてしまうため、
以下サイトから、1.2.2をダウンロードしてインストールした
http://downloads.vagrantup.com/
```
$ gem install vagrant
```


インストール出来ました

```
$ vagrant -v
Vagrant version 1.2.2
```

OSイメージをダウンロードする
Linux　CentOS 6.4　を使います

```
$ vagrant box add centos http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box
```
ダウンロードが終わったら初期化します

```
$　vagrant init
```

初期化が終わるとVagrantfile　が作成されているので、仮想サーバの起動前にネットワークの設定を行います。
IPは適当に。

```
$ vi Vagrantfile
  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  config.vm.network :private_network, ip: "192.168.50.12"　←　コメントアウトを外します
```
仮想サーバを起動します

```
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.
[default] VM booted and ready for use!
[default] Configuring and enabling network interfaces...
[default] Mounting shared folders...
[default] -- /vagrant
```
仮想サーバへsshで接続出来るようにssh設定をします
以下コマンドでssh設定を吐き出してくれるので、

```
$ vagrant ssh-config --host melody
Host melody
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile "/var/root/.vagrant.d/insecure_private_key"
  IdentitiesOnly yes
  LogLevel FATAL
```
リダイレクトで、ssh設定をファイルに書き込みます

```
$ vagrant ssh-config --host melody >> ~/.ssh/config
```

これで、仮想サーバへのsshでログインが行えます

```
$ ssh melody
```

##　参考

入門Chef Solo - Infrastructure as Code　伊藤直也 (著)
http://www.amazon.co.jp/%E5%85%A5%E9%96%80Chef-Solo-Infrastructure-Code-ebook/dp/B00BSPH158
外部サービスのweb hooks対応サービスの疎通を気軽にしたい...

# 外部サービスのweb hooks疎通テストを気軽にしたい...

インターネット上で見えるところにそのhook対象となる
アプリを置かないとだめなことがあるのだけど、
ログとかシステム上から見るのだりーよな〜と思ったのでexpress + socket.ioで簡素なアプリを書いた。

http://helgason.herokuapp.com/

![screen-1.png](https://qiita-image-store.s3.amazonaws.com/0/3985/dde9ed39-ada3-a742-2d8c-46fda067825b.png)

# 疎通の確認

早速疎通の確認をしよう。

```bash
> curl -X POST http://helgason.herokuapp.com/ -d "hello=world" -d "syakai=hukki"
```

![screen-2.png](https://qiita-image-store.s3.amazonaws.com/0/3985/e0193def-0b00-5385-f53e-d016e03ed042.png)

キテる。

# TreasureDataからデータを受け取れるか確認する

Treasure Dataでは、Hive Queryにて作成したJobの集計結果を
Web Application向けにPUT methodで投げつけることが出来る。
試しにやってみよう。

Treasure Dataの[Quick Start Guideまでやっていれば](http://docs.treasure-data.com/articles/quickstart)、
以下のクエリは実行できるようになるはず。

```bash
td query --result 'web://helgason.herokuapp.com/' -w -d testdb "SELECT v['code'] AS code, COUNT(1) AS cnt FROM www_access GROUP BY v['code']";
```

無事登録されていた(map)Jobの集計が終わったようだ(reduce)

![screen-3.png](https://qiita-image-store.s3.amazonaws.com/0/3985/fd1fc156-c784-fe78-4bd9-cd9b0e349aaf.png)

Webアプリのほうを確認してみる。

![screen-4.png](https://qiita-image-store.s3.amazonaws.com/0/3985/accb7281-4e2c-af1c-e3b8-b53656167081.png)

うん、受け取れてる。

# 自前で使いたい場合

[このアプリのリポジトリ](https://github.com/futoase/Helgason)をgit cloneして、
cliにて[heroku createして](https://devcenter.heroku.com/articles/creating-apps)、
git push heroku masterすれば良い。

もしくは、適当にサーバー用意するとか。

# 他

Basic認証に対応とか一応させてるけど使いたい人は適当にソース見てください。
たまーにこういうの欲しくなるけど、探すのだるいから作った感じ。
Qiitaのリーンキャンバスを書いてみた


こんな感じで合ってるかな?

![SS 2013-07-16 22.26.05.png](https://qiita-image-store.s3.amazonaws.com/0/889/14015b2c-0269-639f-15ec-fc0ba87ef138.png "SS 2013-07-16 22.26.05.png")
mysqlの結果をjsonでname,data[array]という形にする方法


結構盲点だったので、メモ。

```@php:

  $sqlJSTST ='
	//適当なSQL
  ';
  
  $resultJSTST = $dbh->query($sqlJSTST);

  //取得したデータを配列に格納
	$JSTST = array();

	while ($rowJSTST = $resultJSTST->fetchObject()){
		$JSTST[] = array(
			'name' => $rowJSTST->name,
			'data' => array(
				$rowJSTST->ほにゃらら（SQLの項目名),
				$rowJSTST->ほにゃらら,
				$rowJSTST->ほにゃらら
			)
		);
	}

```

これでjsondataはこんな形で作れる

```@javascript:json

[{
"name": "Revenue",
"data": [23987, 24784, 25899, 25569, 25897, 25668, 24114, 23899, 24987, 25111, 25899, 23221]
}, {
"name": "Overhead",
"data": [21990, 22365, 21987, 22369, 22558, 22987, 23521, 23003, 22756, 23112, 22987, 22897]
}]

```
nginxのリバースプロキシでexpressに接続するときの注意

### 構成
[nginx] -> [express] -> [connect-ltsv-logger]
### 問題点
connect-ltsv-loggerでhost部を書き出すときに **TypeError: Cannot read property 'address' of null** と出て落ちる
### 解決
proxy_set_header  connection "keep-alive"を追加する。
散らかったデスクトップをとにかく何も考えず日付フォルダにまとめる

絵を描いているとDesktopに近所に落ちてた空き缶を接写でとった写真やラフや統合前データやフィルタや効果を付ける前や縮小前や納品データが死ぬほど貯まります。ので作りました。

例だと最終的にこうなります
![スクリーンショット 2013-08-02 21.51.15.png](https://qiita-image-store.s3.amazonaws.com/0/13135/9a3174f4-6c5f-ed78-8566-9329fa0814c7.png)

```bash
#!/bin/sh

# デスクトップに何もない場合、終了
if [ ! -e ~/Desktop/* ]; then
	echo "ファイルがありません。"
	exit
fi

#入力を求める
echo "------------------------------"
echo "フォルダ名? / q=中止> "
read dirName

if [ $dirName = "q" ]; then
	exit
fi

# 日付からパスを作る
d=`date '+%Y/%m/%Y%m%d'`
path="~/Pictures/${d}${dirName}"

# pathの末尾に連番をつける
seq=1
fullPath=$path`printf "%02d" $seq`
while [ -d $fullPath ]
do
	seq=`expr $seq + 1`
	fullPath=$path`printf "%02d" $seq`
done

# コマンドを実行
echo "------------------------------"
mkdir -p $fullPath
cp ~/Desktop/* $fullPath
rm ~/Desktop/*
ls $fullPath
echo "------------------------------"
echo "以上のファイルが${fullPath}に移動しました"
```

あなたの使いやすいように13〜14行目を変更して、どうぞ。
間違えて起動してしまった場合はqで中止できます
メモ帳でのプログラムに関する質問です！！

数の入力前に、表示形式を「日本語評価」と「英語評価」を選択可能とし、選択結果に応じた表示ができるようにしたいのですが
うまくできません。 

ちなみに「日本語評価」と「英語評価」のそれぞれのプログラムはできているのですが上記のとおり
数の入力前に、表示形式を「日本語評価」と「英語評価」を選択可能とし、選択結果に応じた表示ができるように
することがどうしてもできないのです。

どうか教えてください
よろしくお願いしますm(_ _)m

以下は「日本語評価」と「英語評価」のそれぞれのプログラムです

「英語評価」
<html>
<body>
<script type="text/javascript">
<!-- 
point = prompt("あなたの点数は何点ですか？");
if (point <= 100 && point >= 90){
alert("評価:S");
} else if (point < 90 && point >= 80){
alert("評価:A");
} else if (point < 80 && point >= 70){
alert("評価:B");
} else if (point < 70 && point >= 60){
alert("評価:C");
} else if (point < 60 && point >= 0){
alert("評価:F (不合格)");
} else if (point == -1){
alert("評価:X (未受験)");
} else {
alert("入力エラー");
}

// -->
</script>
</body>
</html>

「日本語評価」
<html>
<body>
<script type="text/javascript">
<!-- 
point = prompt("あなたの点数は何点ですか？");
if (point <= 100 && point >= 90){
alert("評価:秀");
} else if (point < 90 && point >= 80){
alert("評価:優");
} else if (point < 80 && point >= 70){
alert("評価:良");
} else if (point < 70 && point >= 60){
alert("評価:可");
} else if (point < 60 && point >= 0){
alert("評価:不可");
} else if (point == -1){
alert("評価:無");
} else {
alert("入力に誤りがあります");
}

// -->
</script>
</body>
</html>
新しいデータを挿入したのにテーブルに反映されないとき

CoreDataです。
[context save:&error]でデータを追加して保存したはずなのに、テーブルの見た目は変わらない。
でも再ビルドすると確かにデータは増えてる、というとき。

```objc:
// Save the context.
    NSError *error = nil;
    if (![context save:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
```

そういうときは、NSFetchedResultsControllerのデリゲートメソッドを実装すれば解決します。
ヘッダーに"NSFetchedResultsControllerDelegate"を追加して

```objc:
@interface HogeTableViewController : UITableViewController <NSFetchedResultsControllerDelegate>
```

メソッドも追加します。コピペでOKなはず。

```objc:
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
    [self.tableView beginUpdates];
}

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
           atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{
    switch(type) {
        case NSFetchedResultsChangeInsert:
            [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;
            
        case NSFetchedResultsChangeDelete:
            [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
       atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
      newIndexPath:(NSIndexPath *)newIndexPath
{
    UITableView *tableView = self.tableView;
    
    switch(type) {
        case NSFetchedResultsChangeInsert:
            [tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
            
        case NSFetchedResultsChangeDelete:
            [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
            
        case NSFetchedResultsChangeUpdate:
            [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
            break;
            
        case NSFetchedResultsChangeMove:
            [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
	
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    [self.tableView endUpdates];
}
```

これでおしまい。
データを追加したり消したり、そういうことをしたあとは、NSFetchedResultsControllerのデリゲートメソッドを使うと良い感じにしてくれます。
QuickDialogにNMRangeSliderを組み込む

QuickDialogは簡単に設定画面を作成することができます。ですが、用意されている要素以外使いたい場合があります。

今回は、範囲を設定できるNMRangeSliderをQuickDialogに組み込みます。

近いコントロールであるQFloatElementを参考にして、QLabelElementを継承してQRangeElementを定義します。

```objc:QRangeElement.h
#import <Foundation/Foundation.h>

@class NMRangeSlider;


@interface QRangeElement : QLabelElement
@property(nonatomic, readonly) NMRangeSlider *slider;

- (QRangeElement *)initWithTitle:(NSString *)title lowerValue:(float)lowerValue upperValue:(float)upperValue  min:(float)min max:(float)max;
@end
```

```objc:QRangeElement.m
#import "QRangeElement.h"
#import "NMRangeSlider.h"


@interface QRangeElement()
@property (nonatomic) float sliderLowerValue;
@property (nonatomic) float sliderUpperValue;
@property (nonatomic) float sliderMinimumValue;
@property (nonatomic) float sliderMaximumValue;
@end

@implementation QRangeElement {

}

- (QRangeElement *)initWithTitle:(NSString *)title lowerValue:(float)lowerValue upperValue:(float)upperValue  min:(float)min max:(float)max {
    self = [super initWithTitle:title Value:nil] ;
    if (self) {
        self.enabled = YES;
        self.sliderUpperValue = upperValue;
        self.sliderLowerValue = lowerValue;
        self.sliderMinimumValue = min;
        self.sliderMaximumValue = max;
    }
    return self;
}

- (CGFloat)calculateSliderWidth:(QuickDialogTableView *)view cell:(UITableViewCell *)cell {
    CGFloat width = view.contentSize.width;
    if (_title==nil){
        width -= 95;
    }else{
        width -= [cell.textLabel.text sizeWithFont:[UIFont boldSystemFontOfSize:17]].width + 105;
    }
    return width;
}

- (void)valueChanged:(UISlider *)slider {
    if (self.onValueChanged!=nil)
        self.onValueChanged(self);
}

- (UITableViewCell *)getCellForTableView:(QuickDialogTableView *)tableView controller:(QuickDialogController *)controller {

    UITableViewCell *cell = [super getCellForTableView:tableView controller:controller];
    _slider = [[NMRangeSlider alloc] initWithFrame:CGRectMake(0, 0, [self calculateSliderWidth:tableView cell:cell], 20)];
    self.slider.minimumValue = self.sliderMinimumValue;
    self.slider.maximumValue = self.sliderMaximumValue;
    self.slider.lowerValue = self.sliderLowerValue;
    self.slider.upperValue = self.sliderUpperValue;
    [self.slider addTarget:self action:@selector(valueChanged:) forControlEvents:UIControlEventValueChanged];

    cell.accessoryView = self.slider;
    return cell;
}

@end
```

getCellForTableViewでUIを組み込んだCellを返せば、QuickDialogに組み込むことができます。
ActiveRecord::Associations::CollectionProxy

Rails4では、has_many関連の中身はActiveRecord::Associations::CollectionProxyが入っている。
ドキュメント
http://api.rubyonrails.org/classes/ActiveRecord/Associations/CollectionProxy.html

```ruby:app/model/user.rb
class User < ActiveRecord::Base
  has_many :comments
end
```

```ruby:app/model/comment.rb
class Comment < ActiveRecord::Base
  belongs_to :user
end
```

```ruby:db/schema.rb
create_table "comments", force: true do |t|
  t.integer  "user_id"
  t.datetime "created_at"
  t.datetime "updated_at"
end

create_table "users", force: true do |t|
  t.string   "comment"
  t.datetime "created_at"
  t.datetime "updated_at"
end
```

```ruby
irb(main):001:0> user = User.create
irb(main):002:0> user.comments.create
irb(main):004:0> p user.comments
#<ActiveRecord::Associations::CollectionProxy [#<Comment id: 8, user_id: 2, created_at: "2013-07-16 07:58:18", updated_at: "2013-07-16 07:58:18">]>

#中身を取り出すときはtarget
irb(main):005:0> p user.comments.target
[#<Comment id: 8, user_id: 2, created_at: "2013-07-16 07:58:18", updated_at: "2013-07-16 07:58:18">]
=> [#<Comment id: 8, user_id: 2, created_at: "2013-07-16 07:58:18", updated_at: "2013-07-16 07:58:18">]

#数をかぞえるときはcount。毎回SQLが発行される
irb(main):006:0> p user.comments.count
=> 1

#sizeでも数えられる。sizeは一回ロードすればSQLが発行されないっぽい
irb(main):007:0> p user.comments.size
=> 1
```
HBASE 0.95.1 インストール

起動できないバグがあるとかいってたひとがいたので

|OS|起動|終了|
|:--|:--|:--|
| CentOS 6.x 32bit | OK |   OK |
| CentOS 6.x 64bit | OK |   NG |

### ダウンロード～起動

```bash:コマンド
hbase=hbase-0.95.1
wget http://ftp.riken.jp/net/apache/hbase/${hbase}/${hbase}-hadoop1-bin.tar.gz
tar -zxvf ${hbase}-hadoop1-bin.tar.gz

# 設定 (JAVA_HOMEの設定)
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.25

cd ./${hbase}-hadoop1

./bin/start-hbase.sh
```

### 起動スクリプト

```bash:/etc/init.d/hbase
#!/usr/bin/sh
# 
# chkconfig: 345 44 56
# description: hbase

export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.25/jre
export hbase_home=/usr/local/hbase-0.95.1-hadoop1

case $1 in

start)
    $hbase_home/bin/start-hbase.sh
    ;;
stop)
    $hbase_home/bin/stop-hbase.sh
    ;;
restart)
    $hbase_home/bin/stop-hbase.sh
    $hbase_home/bin/start-hbase.sh
    ;;
*)
    echo "hbase {start|stop|restart}"
    exit 9;
    ;;
esac

exit 0;
```
vimのすごい便利なのにあまり使われていない「タブページ」機能

# vim タブページ

みなさんvimのタブページ機能を使っていますか？

この一番上のバーに出ている、ブラウザなどでよくある「タブ」のことです。↓

![vim-tabpage2.jpg](https://qiita-image-store.s3.amazonaws.com/0/9373/5e38065d-2b82-248c-e9fd-e5a62c270b61.jpeg)

これはvim 7.3から導入された機能なのですが、なぜかあまり使われていません。
[Google検索 vim タブページ](https://www.google.co.jp/search?q=vim+タブページ&oq=vim+タブページ)

　

##### しかし、これはめちゃめちゃ便利です！
##### 今までtmuxでvimを複数個立ち上げており、ちょっと別の作業をするときは別のvimを起動していたのですが、タブページを利用することによって1つのvimで作業することができ、更にヤンクももちろんタブ間で共有されるので開発効率がかなり上がりました。

あまり使われていない原因はおそらく、デフォルトの状態だと、タブ間の移動がかなりめんどくさいからだと思います。

デフォルトはこんな感じ
![Screen Shot 2013-07-16 at 16.15.16.png](https://qiita-image-store.s3.amazonaws.com/0/9373/35af131b-9750-b0cc-3055-cff55e2486cf.png)

右側のタブに移動するたびに `:tabnext`
ラストのタブに移動するには `:tablast` など打っていられません。

また、`:tabnext3` などのコマンドで、左から3番目のタブに移動できるのですが、
デフォルトのタブライン（タブのステータスバー）は番号も書いてないので、簡単には移動出来ません。

　

そこで暗黒美夢王（ダークビムマスター）ことShougoさんの.vimrcを参考に
快適にタブページ機能を使えるよう.vimrcを作りました。

[参考 Shougo/shougo-s-github](https://github.com/Shougo/shougo-s-github/blob/master/vim/.vimrc)

```vim:.vimrc
" Anywhere SID.
function! s:SID_PREFIX()
  return matchstr(expand('<sfile>'), '<SNR>\d\+_\zeSID_PREFIX$')
endfunction

" Set tabline.
function! s:my_tabline()  "{{{
  let s = ''
  for i in range(1, tabpagenr('$'))
    let bufnrs = tabpagebuflist(i)
    let bufnr = bufnrs[tabpagewinnr(i) - 1]  " first window, first appears
    let no = i  " display 0-origin tabpagenr.
    let mod = getbufvar(bufnr, '&modified') ? '!' : ' '
    let title = fnamemodify(bufname(bufnr), ':t')
    let title = '[' . title . ']'
    let s .= '%'.i.'T'
    let s .= '%#' . (i == tabpagenr() ? 'TabLineSel' : 'TabLine') . '#'
    let s .= no . ':' . title
    let s .= mod
    let s .= '%#TabLineFill# '
  endfor
  let s .= '%#TabLineFill#%T%=%#TabLine#'
  return s
endfunction "}}}
let &tabline = '%!'. s:SID_PREFIX() . 'my_tabline()'
set showtabline=2 " 常にタブラインを表示

" The prefix key.
nnoremap    [Tag]   <Nop>
nmap    t [Tag]
" Tab jump
for n in range(1, 9)
  execute 'nnoremap <silent> [Tag]'.n  ':<C-u>tabnext'.n.'<CR>'
endfor
" t1 で1番左のタブ、t2 で1番左から2番目のタブにジャンプ

map <silent> [Tag]c :tablast <bar> tabnew<CR>
" tc 新しいタブを一番右に作る
map <silent> [Tag]x :tabclose<CR>
" tx タブを閉じる
map <silent> [Tag]n :tabnext<CR>
" tn 次のタブ
map <silent> [Tag]p :tabprevious<CR>
" tp 前のタブ
```

これを.vimrcに書き込むことにより、下のような写真の状態になり、

![vim-tabpage2.jpg](https://qiita-image-store.s3.amazonaws.com/0/9373/5e38065d-2b82-248c-e9fd-e5a62c270b61.jpeg)

* `t1`, `t2`,,,`t9` で左からn番目のタブにジャンプ
* `tc` で新しいタブ, `tx`でタブを閉じる

でタブページを効率的に使えます。

tに既にコマンドを割り当てている場合は、[Tag]を別にキーに当てはめれば問題なく使えると思います。

P.S.
[STORYS.JP](http://storys.jp)、 [coincheck](https://coincheck.jp) などのサービスを運営、開発しています。興味のある方はぜひ [和田](http://qiita.com/wadako111)まで連絡を！
RubyMotion で Guard を使って自動的にテストを実行する方法


実行結果に色をつけて、さらに Teminal notifier でデスクトップ通知もします。

bundler を使っている前提で。

```Gemfile
gem 'guard-motion'
gem 'terminal-notifier-guard'
```

で、インストール

```
$ bundle install
```

Rakefile に以下のように書いてください。

```Rakefile
# snip...
require 'bundler/setup'  # この行と
Bundler.require :default # この行を追加

Motion::Project::App.setup do |app|
# snip...
```

Guard の設定をします。

```
$ guard init motion
```

Guardfile を編集します。

```Guardfile
guard 'motion', env: {output: 'colorized'} do # この一行を変更している
  watch(%r{^spec/.+_spec\.rb$})

  # RubyMotion App example
  watch(%r{^app/(.+)\.rb$})     { |m| "spec/#{m[1]}_spec.rb" }

  # RubyMotion gem example
  watch(%r{^lib/[^/]+/(.+)\.rb$})     { |m| "spec/#{m[1]}_spec.rb" }
end
```

実行します。

```
$ guard start
```

以上。


### 追記
Rakefile について追記しました。
katsuyoshi さん、補足ありがとうございます。
Windows版 Chrome拡張 で webkitNotifications の一部が廃止された？

下記内容に関しては、まだ調査中で不明な点が多いので誤りがあるかもしれません、ご注意下さい。

Windows の Chrome を Version 27.x から Version 28.x へ更新したところ、`webkitNotifications.createNotification` や `webkitNotifications.createHTMLNotification` などのメソッドが使用できなくなりました。
(正確にはメソッドそのものがなくなっていました)

訂正:
`webkitNotifications.createNotification`  はまだ残っていました。(見間違いかな)

廃止に関しては詳細な情報がないので、断定はできないのですが、公式サイトには以下のような記述がありました。

>Warning: webKitNotifications.createHTMLNotification() in the [web notifications API](http://www.chromium.org/developers/design-documents/desktop-notifications/api-specification) has been deprecated. The new [web notifications API](http://www.w3.org/TR/notifications/) only allows text. [Chrome notifications API](http://developer.chrome.com/extensions/notifications.html) will be promoted to stable soon and web notifications will be updated to use the new rich notifications format.
>
> via: http://developer.chrome.com/extensions/desktop_notifications.html

また、Chrome独自の新APIに関しても以下のような記述がありました。

> Warning: Currently this API only works on ChromeOS and Windows.
>
> via: http://developer.chrome.com/extensions/notifications.html

新APIに関しては下記ページによると、2013/07/09 から利用できるようになったみたいです。

- [Google Chrome Blog: Richer notifications now available to all Chrome users](http://chrome.blogspot.jp/2013/07/richer-notifications-now-available-to.html)

Windows については、実際に使ってみて正常に動作することが確認できました。

Mac については、新APIを使用することはできたのですが、実装が間に合っておらず見た目 `webkitNotifications.createNotification` を使っているのと変わりませんでした。
テキストしか表示できないので全くリッチじゃないですね。

W3C勧告の新APIに関しは、まだ調べていないので分かりません。
(テキストしか使用できないとのことなので特に興味が沸かなかった…)

今回の変更に関して何が情報をお持ちの方がいらっしゃいましたら、教えていただけると助かります。

# その他の参考情報

- [Google Brings Rich Chrome Notifications to Windows, OS X Version Still In The Works | TechCrunch](http://techcrunch.com/2013/07/09/google-brings-rich-chrome-notifications-to-windows-os-x-version-still-in-the-works/)

- [Using the Notifications API - HTML5 Rocks](http://www.html5rocks.com/en/tutorials/notifications/quick/)

- [Chromium Blog: Rich Notifications in Chrome](http://blog.chromium.org/2013/05/rich-notifications-in-chrome.html)
boost::threadとstd::queueを使ったblocking queueの実装

中身が空っぽだったら待つだけのベーシックな並行キュー。
conditionを正しく使う為に毎回conditionの使い方ググるのが面倒くさいのでここに置いておく。

```cpp:
#ifndef BLOCKING_QUEUE_HPP_
#define BLOCKING_QUEUE_HPP_
#include <boost/thread.hpp>
#include <queue>

template <typename T>
class blocking_queue {
public:
  blocking_queue() {}
  void enqueue(const T& item) {
    {
      boost::mutex::scoped_lock lk(lk_);
      const bool was_empty = queue_.empty();
      queue_.push(item);
      if (was_empty) {
        empty_wait_.notify_all();  // notify_one() may be suitable?
      }
    }
  }

  T dequeue() {
    while (true) {
      boost::mutex::scoped_lock lk(lk_);
      if (queue_.empty()) {  // if empty
        empty_wait_.wait(lk);  // unlock
        //  relock
      }
      if (queue_.empty()) {
        continue;
      }

      T result = queue_.front();
      queue_.pop();
      return result;
    }
  }

  size_t size() const {
    boost::mutex::scoped_lock lk(lk_);
    return queue_.size();
  }

private:
  mutable boost::mutex lk_;
  mutable boost::condition_variable empty_wait_;
  std::queue<T> queue_;
};
#endif  // BLOCKING_QUEUE_HPP_
```

内部をもっとスケーラブルな構造にしたり、このデータ構造を複数使って[Multi Lane](http://www.1024cores.net/home/scalable-architecture/multilane)作るもよし。
Cocoaで日付を扱う

##NSDate型から文字列や数値に変換する。

```objc:
NSDate *now = [NSDate new];

// NSDateFormatterを使ってNSDate型を文字列に変換
NSDateFormatter *formatter = [NSDateFormatter new];
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
formatter.dateFormat = @"yyyy/MM/dd HH:mm:ss";
NSString *formattedString1 = [formatter stringFromDate:now];

// NSCalendarとNSDateComponentsを使ってNSDate型を整数に変換
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSUInteger flags = NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute;
NSDateComponents *components = [gregorian components:flags fromDate:now];
NSString *formattedString2 = [NSString stringWithFormat:@"%02d月%02d日 %02d時%02d分", (int)components.month, (int)components.day, (int)components.hour, (int)components.minute];
```

`NSDateFormatter`の`dateFormat`プロパティにフォーマット文字列を指定する場合は、ロケールに`@"en_US_POSIX"`を指定した方が良いです。
ロケールを指定しない場合、端末設定で24時間表記をOFFにしている場合は「午前」「午後」といった文字列が付加されてしまうため、意図した通りフォーマットされません。`@"en_US_POSIX"`はフォーマット通りの文字列を得ることができる特別なロケールです。
`NSDateFormatter`の使い方は、[こちら](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html#//apple_ref/doc/uid/TP40002369-SW1)にまとめられています。

##文字列や数値からNSDate型に変換する。

```objc:
NSDate *date = nil;

// NSDateFormatterを使ってNSString型からNSDate型に変換
NSDateFormatter *formatter = [NSDateFormatter new];
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
formatter.dateFormat = @"yyyy/MM/dd HH:mm:ss";
date = [formatter dateFromString:@"2013/01/02 11:12:13"];

// NSCalendarとNSDateComponentsを使って整数からNSDate型に変換
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *components = [NSDateComponents new];
components.year = 2013;
components.month = 1;
components.day = 2;
components.hour = 11;
components.minute = 12;
components.second = 13;
date = [gregorian dateFromComponents:components];
```
RedisのGUIクライアントredis-commanderを使ってみる


ブラウザベースのredisクライアントである`redis-commander`が便利だというので使ってみる。

## インストール
npm でインストールする。

````console
$ npm install -g redis-commander
````

## 起動
redisのサービスが実行中であることを確認して、ターミナルで下記コマンドを実行。

````console
$ redis-commander
````
8081番ポートでhttpサーバが立ち上がるので、お好みのブラウザで`http://localhost:8081`にアクセス。

## 画面について

![スクリーンショット 2013-07-16 13.31.08.png](https://qiita-image-store.s3.amazonaws.com/0/6492/a2267c3b-f4fc-ff18-36be-62d73b58e478.png "スクリーンショット 2013-07-16 13.31.08.png")

左側にredis内のdbとキーがツリー形式で表示される。
左側のキーをクリックすると、クリックしたキーで保存されている値が右側に表示される。 画面下部でredisコマンドを実行可能。
Rails 4.0 + Bower + Twitter Bootstrap 2.3

**新しく、[Rails 4 + Bower + Bootstrap 3 + Font Awesome 4](http://qiita.com/milkcocoa/items/afbd62db926db5511c9c) というものを書きました。**

Bower で Twitter Bootstrap を取得すると、css ファイルではなく less ファイルになります。
これを Rails 4.0 のアプリ（3.2 でも同様だと思いますが）で使用するためは、いくつかの設定が必要だったので、記します。

## 前提項目

* bower のインストール等々についてはほかの記事を参照してください。
* bower で管理されるものは `RAILS_ROOT/vendor/assets/bower_components/` 以下に保存されることとします。


## Gem のインストール

less-rails をインストールします。これは less を asset-pipeline で扱うために必要です。
less-rails の依存関係には含まれていませんが、実行時には therubyracer が必要なようなので一緒にインストールします。

```
gem 'therubyracer', platforms: :ruby
gem 'less-rails'
```

## application.rb の設定

このまま `application.css` 等で Bootstrap の less ファイルを読み込もうとすると @import でエラーが発生します。@import 内がそのファイルを基準とした相対 PATH で設定されているためです。
このため `config.less.paths` を設定します。

```ruby:application.rb
class Application < Rails::Application
  config.less.paths << Rails.root.join('vendor/assets/bower_components/bootstrap/less')
end
```

## application.css の設定

上記設定ができてしまえば `RAILS_ROOT/vendor/assets/bower_components/` を基準として、下記のように読み込むことが可能です。

```css:application.css
/*
 *= require_self
 *= require bootstrap/less/bootstrap
 *= require bootstrap/less/responsive
 *= require etc…
 */
```

## application.js の設定

Javascript も同様に読み込むことが可能ですが、とりあえず `app/assets/javascripts/bootstrap.js` というファイルを作成し、下記のようにまとめて読み込むことにしました。
require_tree がうまく行きませんでした。

```javascript:bootstrap.js
//= require bootstrap/js/bootstrap-transition
//= require bootstrap/js/bootstrap-alert
//= require bootstrap/js/bootstrap-modal
//= require bootstrap/js/bootstrap-dropdown
//= require bootstrap/js/bootstrap-scrollspy
//= require bootstrap/js/bootstrap-tab
//= require bootstrap/js/bootstrap-tooltip
//= require bootstrap/js/bootstrap-popover
//= require bootstrap/js/bootstrap-button
//= require bootstrap/js/bootstrap-collapse
//= require bootstrap/js/bootstrap-carousel
//= require bootstrap/js/bootstrap-typeahead
//= require bootstrap/js/bootstrap-affix
```

```javascript:application.js
//= require bootstrap
```
Arch Linux インストール (非EFI)

* [IP設定](http://qiita.com/tukiyo3/items/ffd286684a1c954396af)
* `parted /dev/sda -s mklabel msdos`

## AUR

ubuntuでいうところのPPAがたくさん詰まっている感じ。
これまでwebで別途ダウンロードが必要だった大抵のソフトがここにあります。
（例：pycharm、xnp2、mfiler3、oh-my-zshなど）


CDからboot
=========

[iso download](http://ftp.tsukuba.wide.ad.jp/Linux/archlinux/iso/latest/)

```Bash:sshd開始
passwd root
systemctl start sshd
ip addr
```

パーティション
============

```bash:
fdisk /dev/sda
# 83: swap, 82: Linux filesystem
# sda1・・・boot  (100MB) boot可能フラグをつけること。
# sda2・・・swap  (2GB)
# sda3・・・/     (残り全て) xfs
```

```bash:
mkfs.ext3 /dev/sda1
mkswap /dev/sda2
mkfs.xfs -f /dev/sda3
```

```Bash:mount
mount /dev/sda3 /mnt
mkdir /mnt/{boot,etc}
mount /dev/sda1 /mnt/boot
genfstab -U -p /mnt >> /mnt/etc/fstab
```

```bash:/mnt/etc/fstab例(swapを手で記載する必要がある)
# <file system> <dir>   <type>  <options>       <dump>  <pass>
UUID=9bcfcd1c-7f20-4a2c-9f2a-cc41d4582b5c       /               xfs     defaults       0 0
UUID=c6816610-880b-4007-91bf-f27aae34f4f2       /boot           ext3    defaults       0 0
UUID=ce1e3237-c01b-47a2-a4b9-581a5ed63397       swap            swap    defaults       0  0
```

# bootstrap

```bash:
vi /etc/pacman.d/mirrorlist
```

`Server = http://ftp.tsukuba.wide.ad.jp/Linux/archlinux/$repo/os/$arch`
を先頭に持ってくる。


```bash:
pacstrap /mnt base base-devel openssh
arch-chroot /mnt /bin/bash
```

# chroot環境

```Bash:bootloader
mkinitcpio -p linux
pacman -Sy grub-bios
grub-install --recheck /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg
```

## 一般ユーザー追加

```bash:
useradd -m -g users -G wheel <username>
visudo
```

## ネットワーク設定

```bash:
systemctl enable sshd
```

* [ArchLinuxでネットワーク設定 - Qiita](http://qiita.com/tukiyo3/items/08c8b0180eae29055736)

## yaourt

**yaourtは開発が終了しています。**([Requesting official statement from developers · Issue #382 · archlinuxfr/yaourt](https://github.com/archlinuxfr/yaourt/issues/382))
下記から開発が継続しているパッケージマージャーを使用してください。
[AUR ヘルパー - ArchWiki](https://wiki.archlinux.jp/index.php/AUR_%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC)

```bash:/etc/pacman.conf
[archlinuxfr]
SigLevel = Never
Server = http://repo.archlinux.fr/$arch
```

```bash:インストール
pacman -Sy yaourt
```

```diff:/etc/ssh/sshd_config
- #UseDNS yes
+ UseDNS no
```

```Bash:chroot終了
exit
```

```Bash:reboot
% reboot
```

* [再起動後の設定](http://qiita.com/tukiyo3/items/5b66da8febd9c2535629#1-3)

* [Linux - モニターを閉じるとサスペンドされるのを防止 - Qiita](http://qiita.com/tukiyo3/items/9db97f9ffea8a26b364b)
$(( ))を使っていて”value too great for base”エラーが出る場合のチェックポイント

```bash:test.sh
for i in `seq -w 1 10`;
  do
    echo $(($i+10));
  done
```

`-w`で足りない桁をゼロ埋めすると

```
01 02 03 04 05 06 07 08 09 10
```

と`$i`の値が回ることになるが、$(( ))を使って計算する場合は先頭が`0`で始まる文字が8進数とみなされるので`08`の時点でエラーとなりスクリプトが終了してしまいます。

```
$ bash test.sh
11
12
13
14
15
16
17
test.sh: line 4: 08: value too great for base (error token is "08")
```

## exprのほうがいいかも？
10進数の計算が主の場合は`expr`を使っておいたほうがいいかも。

```bash
for i in `seq -w 1 10`;
  do
    echo `expr $i + 10`;
  done
```

```
$ bash test.sh
11
12
13
14
15
16
17
18
19
20
```

## $(( ))で便利なところ
16進数と10進数を足してみる

```
echo $(( 0x10 + 10 ))

26
```

### exprだと

```
echo `expr 0x10 + 10 `

expr: not a decimal number: '0x10'
```

# 結論？

頭に`0`がつくと8進数として解釈される事があるよと頭の隅に入れておけばなんかの時に助かるかも
Rails関係のコマンドショートハンド（rbenv, bundle exec多用者向け）

```bash:
# ~/.bashrc
#
# Ruby on Rails shorthand definitions
#
# ~/.bashrc
# Ubuntuの人は ~/.bash_profile に書いてね
# http://takuya-1st.hatenablog.jp/entry/20110102/1293970212
# http://kk6.hateblo.jp/entry/20120425/1335363377
#
# rake関係
alias brake='bundle exec rake'
alias bdrop='bundle exec rake db:drop'
alias bcreate='bundle exec rake db:create'
alias bmigrate='bundle exec rake db:migrate'
alias bresethard='bundle exec rake db:drop && bundle exec rake db:create && bundle exec rake db:migrate && bundle exec rake db:seed && bundle exec rake db:fixtures:load'
alias breset='bundle exec rake db:reset && bundle exec rake db:fixtures:load'
alias broutes='bundle exec rake routes'
# rails関係
alias bgen='bundle exec rails generate'
alias bserver='bundle exec rails server --debugger'
alias brc='bundle exec rails console'
# capistrano関係
alias bcap='bundle exec cap'
alias bcaps='bundle exec cap staging'
# ステージング環境にデプロイ（rake db:migrate込み）
alias bcapsdc='bundle exec cap staging deploy:cold'
# ステージング環境にデプロイ
alias bcapsd='bundle exec cap staging deploy'
# 5世代前以降のreleaseを削除する
alias bcapsclean='bundle exec cap staging deploy:cleanup'
```
継続的にパフォーマンスチューニングをするアイデア


一ヶ月くらい前に、[遺伝的アルゴリズム(GA)によるサーバの自動チューニング](http://qiita.com/tumf/items/918ef218eeade512012c)という記事を投稿させて頂きました。本稿はその続編（続報）になります。

遺伝的アルゴリズムを利用したサーバの自動チューニングは手軽で便利な半面、結果を出すためには時間が掛かります。サーバに負荷を長時間掛けなくてはいけないこの方法は、実運用に入ったサーバでの実行は好ましくありません。

そこで、ユーザの比較的少ない早朝に短時間負荷試験をして、その結果を翌日に持ち越し探索を継続するという方法を考案しました。 **継続的パフォーマンスチューニング** という言葉の使い方が正しいか分かりませんが毎日一時間のパフォーマンスチューニングを繰り返し、パフォーマンスの良い組み合わせを探していくことを目標にしています。

    **ご注意**
    サーバソフトウェア再起動が発生する（させる）ものであるため短時間サービスが停止する可能性があることなど、この方法には問題点もあり「アイデア」とさせていただいております。

[前稿の遺伝的アルゴリズム(GA)によるサーバの自動チューニング](http://qiita.com/tumf/items/918ef218eeade512012c)で紹介した拙作の[gargor](https://github.com/tumf/gargor)というソフトウェアに以下のような機能を加えました。

* 世代情報のファイルへの保存
* デプロイ失敗時の復旧
* コマンドラインオプションによる設定

また、これをバージョン`1.0.0`として[リリース](https://github.com/tumf/gargor/releases/tag/v1.0.0)致しました。

インストール方法などは変わっていませんが、CLIを[thor](http://whatisthor.com/)にした関係で実行時にサブコマンドとして`tune`が必要になっています。


#### インストール

```
$ [sudo] gem install gargor
```

#### 実行

```
$ gargor tune [options] [DSL]
```

DSLファイルの書き方は[前稿](http://qiita.com/tumf/items/918ef218eeade512012c)を参照ください


ついでに、実行の経過を表すプログレスバーとチューニング結果見やすくしました

![スクリーンショット_2013_07_16_2_38.png](https://qiita-image-store.s3.amazonaws.com/0/10446/3f54b3a2-8982-1bd3-9d7a-c28280fb5782.png)


この実行コマンドを、`crontab`に書いておけば毎日指定時刻に前日を引き継ぎパフォーマンスチューニングが実行されるという寸法です

```例
0 4 0 0 0 cd /path/to/chef-repo && gargor tune --no-progress-bar -s .gargor.state gargor.rb
```

冒頭に注意を書かせて頂きましたが、私はこの方法を個人的に運営しているサイトで試し始めたところでまだ結果は出ていません。サイトによってはメンテナンス画面への切り替えをしたり、ロードバランサ配下の一部のサーバのみで行う等の工夫が必要かと思います。なにか良いアイデアをお持ちの方は是非コメント欄などでご意見をいただければ幸いです。
直前の出力を使ってコマンド実行する `!!`

find -name 〜 -exec ""{} \;みたいなコマンドがあるかと思いますが、ちょっと覚えられないですよね。
また、条件式を末尾ではなく途中に書くというのが書きづらい。
以下の方法は使いやすいと思いますのでどうぞ。


* ディレクトリ以下のphpファイルを全部vimで開きたい場合

```bash:
$ find . | grep -v vendor | grep -v cache | grep php$
$ vim `!!`
```

* ディレクトリ以下にtest1〜test20までのフォルダを作ったが、やっぱり削除したい

```bash:
$ mkdir $(printf test%d\  `seq 1 20`)
$ find . -type d | grep test
$ rmdir `!!`
```

* 指定したディレクトリの容量を表示したい

```bash:
$ ls test*
$ du -sh `!!`
```

* その他使い方例

```bash:
$ apt-cache search mplayer | cut -d ' ' -f 1
$ printf "[package: %s]\n" `!!`
```
HBase 注意事項！！

version 0.95.1はバグがあって起動しないようです。
stable(0.94.9)は落としてくれば、即使用できました。

openjava SDKでも起動できるっぽいですが、
OracleのJAVAのほうが推奨らしいんで、そっちを使ったほうがいいと思います。

以上！！

[追記]

asahina_devさん、指摘ありがとうございました。

あと、よくよく見たら0.95.xは開発版だよ。商用deployは提供しないよ。みたいなこと書いてたので、0.94系でいいかなって思ってます。まぁ、検証用に(動きゃいいや程度に)動かしただけなんで。

<原文>
The 0.95.x releases are NOT stable. These are "Development" Series releases, a set of "rough cuts" taken from the branch that will eventually become our next stable release. We encourage you to download the 0.95.x bundle and take it for a spin, and pass us feedback. Theses 0.95.x series releases are NOT for production deploy. To learn more about our versioning, see HBase Versioning in our reference guide.