OmniAICreator/Qiita-1.07M huggingface dataset:
railsでcrawler、botのアクセスを制御する

```ruby:is_crawler.rb
# -*- coding: utf-8 -*-
def crawler? ua
  crawler_ua = [
    "crawler",
    "bot",
    "spider",
    "YahooFeedSeeker",
    "Y!J-(?:BSC|BRO|SRD)/",
    "internal +dummy +connection",
    "libwww",
    "HyperEstraier",
    "curl",
    "wget",
    "facebookexternalhit",
    "ia_archiver",
    "Tumblr"
  ]

  crawler_ua.each{ |reg|
    return true if (/#{reg}/i =~ ua) != nil
  }
  return false
end

p crawler?(request.user_agent)
p crawler?("Y!J-BSC/YATS crawler")
p crawler?('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5')
```
卒論を英語で書けと言われしまったあなたにおすすめの Emacs の設定

もしあなたの指導教員が（その場の気まぐれで）卒論を英語で書くことにしてしまったらどうするでしょうか

そういうときはとりあえず Emacs の設定を考えると思います

ということで Emacs で英語執筆環境を整える特集してみます

.emacs は [init-loader.el と package.el を導入して快適 Emacs ライフ - Qiita](http://qiita.com/catatsuy/items/5f1cd86e2522fd3384a0) これみたいに設定毎にファイルを分割する前提でやっていきます

# ispell-buffer

定番のスペルチェッカです

有名なのでみんな使っていると思いますが，一応紹介します

    # Ubuntu
    sudo apt-get install aspell
    # Mac
    brew install --with-lang-en aspell

で `aspell` をインストールしてから `~/.aspell.conf` に

```.aspell.conf
lang en_US
```
としてから .emacs に以下の設定をします

```cl:30-aspell.el
(setq-default ispell-program-name "aspell")
(eval-after-load "ispell"
  '(add-to-list 'ispell-skip-region-alist '("[^\000-\377]+")))
```

Mac の場合はこれだけでは動かないかもしれないので，その場合は追加で以下の設定もします

```cl:cocoa-emacs-aspell.el
(setq-default ispell-program-name "/usr/local/bin/aspell")
```

これで `M-x ispell-buffer` とやればスペルチェックしてくれます


# flyspell-mode

さっきの `ispell-buffer` とは違って，動的にスペルチェックしてくれます

標準で入っているので `M-x flyspell-mode` とやれば ON/OFF できます

便利だと思ったのですが，私の環境ではなぜか IME との相性が良くないので常用するにはいたっていません


# google-translate

日に日に性能が上がっていく Google 翻訳を頼らない手はありません

ということで Emacs から快適に Google 翻訳を使いましょう

[google-translate.el と popwin.el で翻訳作業が捗った件 - Qiita](http://qiita.com/okonomi/items/f18c9221420eca47ebc6)

の記事を参考にしています

    M-x package-install google-translate
    M-x package-install popwin

これでインストールします（自動インストール設定する方法はさっき紹介した記事に書いてあります）

`popwin.el` の設定を先にやる必要があるので

```cl:21-popwin.el
(require 'popwin)

(setq display-buffer-function 'popwin:display-buffer)
(setq popwin:popup-window-position 'bottom)
```

とまず `popwin.el` の設定をしてから `google-translate.el` を呼び出します

```cl:22-google-translate.el
(require 'google-translate)

(global-set-key "\C-xt" 'google-translate-at-point)
(global-set-key "\C-xT" 'google-translate-query-translate)

;; 翻訳のデフォルト値を設定(ja -> en)（無効化は C-u する）
(custom-set-variables
 '(google-translate-default-source-language "ja")
 '(google-translate-default-target-language "en"))

;; google-translate.elの翻訳バッファをポップアップで表示させる
(push '("*Google Translate*") popwin:special-display-config)
```

キー設定は好みで変えてください

これにより日本語を選択してから `C-x t` とすれば英語に翻訳された結果が表示されます

`popwin.el` のおかげで `C-g` などをすれば結果を出力するウィンドウはすぐに消えるので邪魔になることはありません

英語から日本語など，デフォルト設定以外のものを使いたい場合は `C-u C-x t` のように `C-u` を最初につけることで一時的に無効化されます

また `C-x T` としてから翻訳したい言葉などを入力すれば結果が返ってきますので単語を調べたいときなども便利です


# 最後に

世界は英語化の流れらしいので英語で卒論書きましょう（白目）
veeweeでVirtualBoxのPAEを有効にする方法

vagrantのbox(CentOS6.4)を自作したかったので、veeweeを始めてみた。

* virtualbox ・・・ 4.2.12
* veewee ・・・ 0.3.7
* box template ・・・ CentOS-6.4-i386-minimal

veeweeの使用方法は「veewee」でググればたくさん出るので割愛するが、（僕はRyuzeeさんのサイトを参考にした）
bundle exec veewee vbox build した際に、VirtualBox側で以下のMessageが表示され、buildが止まっていた。

````
Unable to boot - please use a kernel appropriate for your CPU
````

CentOS6系はCPUにPAE機能が必須らしく、VirtualBoxの設定で「PAE/NXを有効化」をONしないと
上記エラーが発生する模様。

veeweeでPAEを有効にする場合は、definitionsディレクトリ以下のdefinition.rbに

````
:pae => 'on',
````

を追加する。PAEが有効になって無事buildが正常終了した。
slideToggle() で「続きを読む」の基本

slideToggleで「続きを読む」の基本。
細かい制御はおいておいて、とりあえず覚書。
li 要素を3つずつ表示するプログラムです。idをつけて制御しているけど、ul の子要素を数えて上からカウントもできるんだろうけどなぁ。
もっと効率の良いというか美しい組み方知っている人がいたら教えて下さい。

```html:
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<style>
li{
    display : none;
}
</style>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<script>
$(function(){
    var toggleCount = 1;  // 総カウント数
    var clickCount  = 3;  // 1回で表示する要素数

    $("#push").click(function() {
        for (var i = 1; i <= clickCount; i++){
            $("#demo" + toggleCount).slideToggle();
            toggleCount++;
        }
        return false;
    })
});
</script>
</head>
<body>
<input id="push" type="button" value="続きを表示" />
<ul>
<li id="demo1">TEST1</li>
<li id="demo2">TEST2</li>
<li id="demo3">TEST3</li>
<li id="demo4">TEST4</li>
<li id="demo5">TEST5</li>
<li id="demo6">TEST6</li>
<li id="demo7">TEST7</li>
<li id="demo8">TEST8</li>
<li id="demo9">TEST9</li>
</ul>
</body>
</html>
```
RubyについてのUpdateを毎週手に入れる方法

![](http://gyazo.com/ca8ee3cc86373c008bdc6f1632653c0f.png)


ruby1.8.7のメンテナンス終了。SSLのセキュリティ、Rails4、ruby2の新しい機能、、
たくさんあるUpdateを一週間に一回まとめて送ってくれるサービスがあります。

これ便利。

http://rubyweekly.com/
他の bundler で管理されているプロジェクトのプログラムを起動する

bundler は Gemfile の場所等を環境変数にセットする。これにより、同じプロジェクト内の Ruby プログラムを起動するときは bundler について考える必要なく `system` 等が使える。

しかし他の bundler で管理されているプロジェクトの Ruby プログラムを起動する場合、そちらの Gemfile を参照しなければならない。このような状況を解決するために `Bundler.with_clean_env` というメソッドが用意されている。

```rb:
Bundler.with_clean_env do
  system 'cd /path/to/other/project; bundle exec bin/foo.rb'
end
```

また、`system` や `exec` 用に `Bundler.clean_system`, `Bundler.clean_exec` というヘルパメソッドも用意されている。

`bundle exec` 時の環境変数の変更については bundle-exec の man に書かれている。
http://bundler.io/v1.3/man/bundle-exec.1.html

このことを知らないと、Gemfile に書かれている gem の require になぜか失敗する、という挙動に悩まされることになる…
Apache IsisをEclipseで使うには（Quickstart Archetypeを動かすまで）

新しいJavaのフレームワークとして「Apache Isis」というものがあることを知ったので、試してみた。
本家サイトの動画でしっかり説明されていますが、日本語の資料というのがほとんどまだないみたいなので、
自分のためのメモの意味も含めて、皆さんに情報共有をば。
ちなみに、本家サイトはこちら　http://isis.apache.org/

なお、この記事は、eclipseの基本的な使い方は理解しており、新しくApache Isisを使い始めようと思っている方を対象に書いております。ご了承ください。

## Step.0 前準備
まず、EclipseでApache Isisを使うためには以下のプラグインが必要です。
・maven
　・参考サイト：　http://d.hatena.ne.jp/kagamihoge/20121228/1356695798
・DataNeucleus
　・参考サイト：　http://www.datanucleus.org/products/datanucleus/jdo/guides/eclipse.html

## Step.1 プロジェクトの作成
上部メニューから、ファイル＞新規＞プロジェクトを選択。
新しく作るプロジェクトの種類は「Mavenプロジェクト」を選択してください。
![pic1.png](https://qiita-image-store.s3.amazonaws.com/0/19589/62443b79-086e-b902-d94c-480a163d58ea.png)

次の画面では特に変更の必要はないです。ワークスペースを変えたければ、変更してください。
![pic2.png](https://qiita-image-store.s3.amazonaws.com/0/19589/37edf490-ff0b-3e20-7d2b-7f4206ca2e32.png)

次の画面では「org.apache.isis.archetype」を検索して選択してください。
（自分は事前にごちゃごちゃいじっていたせいか、簡単に出て来ましたが、もしかしたら、検索しても出てこず、自力で追加する必要がある人もいるかもしれません…）
![pic3.png](https://qiita-image-store.s3.amazonaws.com/0/19589/62fd034e-e023-191d-061e-b3d3d5a376b0.png)

次のページで、アーティファクトIDなどを設定します。
それぞれ、以下のように設定します。
グループID：　org.apache.isis.archetype
アーティファクトID：　quickstart_wicket_restful_jdo-archetype
バージョンとパッケージは特に変更不要です。
このまま完了してください。
![pic4.png](https://qiita-image-store.s3.amazonaws.com/0/19589/1d3fc0ef-8ed2-2971-119e-ea5a564d56f6.png)

すると、以下の画像のように、プロジェクトが６つ生成されると思います。これでプロジェクトの作成は完了です。
![pic5.png](https://qiita-image-store.s3.amazonaws.com/0/19589/fac1bab7-ef9c-9eef-3a23-a352c3a7babf.png)

## Step.2 プロジェクトの設定
まず、quickstart_wicket_restful_jdo-archetype-dom（以下、domプロジェクト）にDataNucleus Supportを加えます。
domプロジェクトを右クリックし、
DataNucleus ＞ Add DataNucleus Support を選択すれば加えられます。
![pic6.png](https://qiita-image-store.s3.amazonaws.com/0/19589/e51c4302-5274-7f50-959c-94bb1971fca7.png)

その上でもう一度、domプロジェクトを右クリックし、
DataNucleus ＞ Enabled Auto-Enhancement を選択してください。
これで、自動的にDataNucleusがクラスに組み込まれるようになります。
![pic7.png](https://qiita-image-store.s3.amazonaws.com/0/19589/575fa0a0-fdd5-4915-a4a7-087b0c7b7b7c.png)

次に、domプロジェクトの中のpersistence.xmlを開きます。
ここに書いてある、persistence-unitのnameプロパティの値を確認しておきます。
（皆、quickstartになってると思いますが）
![pic8.png](https://qiita-image-store.s3.amazonaws.com/0/19589/5e451888-054c-87df-7f0e-1535b27a9fae.png)

この値を、プロジェクトのDataNecleusの設定に使います。
domプロジェクトを右クリックし、プロパティを選択。
DataNecleusという項目を探し、その中のEnhancerという項目を選択します。
そこで、プロジェクト固有の設定にチェックを入れ、Persistence-Unit Nameに先ほどの値を入れます。
これで、DataNecleusの設定は完了です。OKを押してダイアログを閉じてください。
![pic9.png](https://qiita-image-store.s3.amazonaws.com/0/19589/bd8b0429-efba-f54e-3bc6-a8d643f1a265.png)

以上で、プロジェクトの設定は終了です。
ここいらで一度、プロジェクトのクリーンをしておくのがよさそうです。

## Step.3 プロジェクトの実行
quickstart_wicket_restful_jdo-archetype-webappプロジェクトを開き、
ide > eclipse > launch とたどっていきます。
すると、そこにquickstart_wicket_restful_jdo-webapp.launchというファイルがあるので、これを右クリック。
デバッグからquickstart_wicket_restful_jdo-webapp.launchを選択します。
![pic10.png](https://qiita-image-store.s3.amazonaws.com/0/19589/3e4fb6dd-4e11-19da-8025-57dd4d98618e.png)

すると、Jettyが起動し、localhost:8080でサイトにアクセス出来るようになります。

Apache Isisのページが表示された方はおめでとうございます！
お役に立てたようで嬉しいです。

表示されなかった方は…本家サイトを御覧ください。足りない情報はきっとそこにあるでしょう。
よく使う Vim のコマンドまとめ


# ファイル操作

| key       | 内容           |
|-----------|----------------|
| ZZ | 上書き保存し、viを終了
| :w |  内容を保存 |
| :q! | 保存せずに終了 |


# モード

| key       | 内容           |
|-----------|----------------|
| i | 挿入モードへ
| o | 新しい行を追加し挿入モードへ
| R | 上書きモードへ
| v | ビジュアルモードへ
| Ctrl + v | 矩形選択のビジュアルモードへ
| ESC | コマンドモードに戻る
| ctrl + \[ | コマンドモードに戻る
| ctrl + z | vim を一時停止する

# カーソル移動

| key       | 内容           |
|-----------|----------------|
w | 次の単語 (Word)
b | 前の単語
f(文字) | カーソルがある行の(文字)に移動 (Find)
F(文字) | カーソルがある行の(文字)に移動(逆向き)
0 | 行頭
＾ | 行頭
$ | 行末
% | 対応する括弧に移動
Ctrl + u | 半画面上 (Up)
Ctrl + d | 半画面下 (Down)
zz | カーソルが画面中央になるようにスクロール
Ctrl + o | 古いカーソル位置に戻る。 (Old)|
Ctrl + i | 新しいカーソル位置に進む。 |

# 行移動

| key       | 内容           |
|-----------|----------------|
gg | 最初の行
88G | 88行目
G | 最終行
H | 画面上の最初の行 (Home)
M | 画面上の中央の行 (Middle)
L | 画面上の最後の行 (Last)

# 検索と置換

| key       | 内容           |
|-----------|----------------|
| * | カーソル下の単語を検索
| # | カーソル下の単語を検索 (上方向に検索)
:%s/hage/hoge/g | 単語の置換(hageをhogeへ置換)。`%` はファイル全体を表す。


# 編集

| key       | 内容           |
|-----------|----------------|
. | 直前の変更を繰り返す
u | Undo
Ctrl + r | Redo

# コピー&ペースト

| key       | 内容           |
|-----------|----------------|
yy | 今いる行をコピー (yank)
p | カーソルの場所に、ペースト
yy5p | 現在の行をコピーし、下に5行追加する
gv | 直前の選択範囲を再選択

# 特殊文字

key       | 内容           |
-----------|----------------|
Ctrl-v return | 改行文字の入力
Ctrl-v tab | Tab 文字の入力

# ウィンドウ

| key       | 内容           |
|-----------|----------------|
:vsplit | 画面を左右に分割する
:e filename | 今いるWindowにファイルを開く (Edit)
:e test\*.cc | ワイルドカードを指定してファイルを開く
Ctrl +w h | 左のWindowへ移動
Ctrl + w l | 右のWindowへ移動

# バッファ

| key       | 内容           |
|-----------|----------------|
:buffers | 編集中のバッファ一覧を表示
:bn | 次のバッファに移動
:bd[elete] | バッファを削除

# 単語補完

| key       | 内容           |
|-----------|----------------|
Ctrl + p | 単語補完(前方検索)

# マクロ

| key       | 内容           |
|-----------|----------------|
q\<letter\> | マクロの記録開始 |
q           | マクロの記録停止 |
@\<letter\> | マクロの実行     |

# レジスタ

| key | 機能 |
|-------|-------|
| :reg | レジスタの一覧表示 |
| Ctrl + r " | ヤンクした文字列をペースト |

# コマンドの意味

| key       | 意味           |
|-----------|----------------|
| g | 繰り返し |
| c | 1回毎に確認 |

# その他

| key       | 内容           |
|-----------|----------------|
:!command | 外部コマンドの実行
: | 範囲選択中に `:` を入力すると、選択領域の範囲指定( `’<,’>` )が自動で挿入された状態でコマンドモードに入る。これを置換に利用すると便利。 (例: :'<,'>s/old/new/g)
Ctrl + a | 数値のインクリメント
Ctrl + x | 数値のデクリメント

# 参考文献

[Route 477 - Vim覚え書き](http://route477.net/w/?VimMemo)
[Vim 基本操作まとめ - Archiva](http://archiva.jp/web/tool/vim_basic.html)
[検索・置換に便利なヤンク（レジスタ）【Vimコマンド】にさん追加7/3 - YKMbPP](http://d.hatena.ne.jp/ykmbpp/20080527/1211850475)
なんちゃってOptionモナド

Scalaで、値を取得するメソッドから、値の有無を含めた結果としてOption型を返すことが出来ます。

例えば、Scalaだとこうなる

```scala:Configuration.scala
// Option型(Optionモナド)を返す側
class Configuration {
    def get(key : String) : Option[String] = {
        val value = System.getProperty(key)
        if (value == null) {
            None
        } else {
            Some(value)
        }
    }
}
```

```scala:Main.scala
// 受け取り側
val conf = new Configuration()
conf.get("url") match {
    case None => {
        // 値が無い場合
    }
    case Some(f) => {
        // 値がある場合
        println(f)    // fには、System.getProperty("url")の結果と同じものが入っている
    }
}
```

構文そのものの説明は割愛。

こんな感じのものをJavaでもやりたい！！
と思って、考えた結果…

```java:Option.java
public interface Option<T> {
    T get();
     boolean just();
}
```

```java:Some.java
public class Some<T> implements Option<T> {
    private final T value;
    
    public Some(T value) {
        this.value = value;
    }
    public T get() {
        return this.value;
    }

    public boolean just() {
        return true;
    }
}
```

```java:None.java
public class None<T> implements Option<T> {
    public None() {
        // do nothing
    }
    
    public T get() throws UnsupportedOperationException {
        throw new UnsupportedOperationException();
    }

    public boolean just() {
        return false;
    }
}
```

```java:Configuration.java
// Option型(Optionモナド)を返す側
public class Configuration {
    public Option<String> get(String key) {
        final String value = System.getProperty(key);
        if (value == null) {
            return new None<String>();
        } else {
            return new Some<String>(value);
        }
    }
}
```

```java:Main.java
final Configuration config = new Configuration();
final Option<String> opt = config.get("url");
if (opt.just()) {
    System.out.println(opt.get());
} else {
    // 値が無い場合の処理
}
```

と言った具合になる。
悪くないんだけど、Option#just()でいちいち判定を入れてて、
入れ忘れてOption#get()を呼び出すと例外が飛んでくるって時点で、
nullチェックと変わらないといえば変わらない。。。

ぐるぐるしている型…方の、[ブログ](http://bleis-tift.hatenablog.com/entry/20120628/1340893265)の方がタイプセーフでいい…けど、コード量多いのが難点。
でも、ScalaでもNoneが返ってきてるときにget()とか呼び出したら、例外飛んでくる点では同じだから、
判定なりは要るのかなぁ・・・
問題は、それを上手く隠蔽して構文上、絶対に記述しないとならないようにするか否かか…
mp3の音量を調節する

自宅のサーバー機で時報を鳴らしたいと思い、100均のスピーカーを買ってきたのですが、
alsamixerで調節しても聞こえないのでmp3の音量を上げてみた。

```bash:
上げるとき
mp3gain -g 9 jihou.mp3

下げるとき
mp3gain -g -9 jihou.mp3
```

目安：89db±9dbくらい。


ubuntu 17.10だとmp3gainがないため
http://www.mp3louder.com/jp/
を使うと良いかも。
ssh-agent と expect で ssh のパスフレーズ入力を自動化



`ssh-agent` を使えばパスフレーズの入力を自動化できることを教えてもらったのでメモ。
`~/.bash_profile` に以下のコードを書くと、ログイン時に `ssh-agent` が起動され、
さらに `expect` で自動的にキーとパスフレーズが登録される。

```
eval `ssh-agent`

# 秘密鍵ファイル
KEY_FILENAME='id_rsa'
# パスフレーズ
PASSPHRASE='XXXXXXXXXX'

expect -c "
set timeout -1
spawn ssh-add $HOME/.ssh/$KEY_FILENAME
expect {
    \"Enter passphrase for\" {
        send \"$PASSPHRASE\r\"
    }
}
expect {
    \"denied\" { exit 1 }
    eof { exit 0 }
}
"
```

ただ、これで起動した `ssh-agent` はログアウトしてもプロセスが残ったままになるようなので、
`~/.bash_logout` に以下のコードを書いてログアウト時にプロセスを kill するようにする。

```
ssh-agent -k
```
nokogiriとlibxml2とhomebrew

    WARNING: Nokogiri was built against LibXML version 2.7.8, but has dynamically loaded 2.7.3

「nokogiriはlibxml2 2.8.0でビルドされたけど、動的に2.7.8を読み込んでいます」的なメッセージを「rails s」する度に見ている人いませんか。僕は毎回見てました。あまり実害なかったので放置していたのですが、重い腰を上げてこれの解決に取り組みました。

# 結論

    $ brew install libxml2
    $ gem install nokogiri -- --use-system-libraries
Railsで、任意のJavaScriptやCSSだけを読み込む

結論を先に書くと、app/assets/javascripts/application.js.erb を修正します。

```js:application.js.erb
//= require jquery  
//= require jquery_ujs  
//= require_tree .  
```

こんな風になってるはず。
どのページでも共通に読み込みたい JavaScript が以下の二つだった場合。

app/assets/javascripts/hogehoge/fugafuga.js
app/assets/javascripts/areare/korekore.js.erb

 `//= require_tree .  ` を削除してこんな風に修正します。

```js:application.js.erb
//= require jquery  
//= require jquery_ujs  
//= require hogehoge/fugafuga
//= require areare/korekore
```

**でもちょっと待った。**
この状態では、app/assets/javascripts/ 配下に置かれているJSファイル群はAssets Pipeline の対象外になってしまいます。
application.js の一部としてまとめられることはないものの、ダイジェスト化（ファイル名がMD5ハッシュ付きになるアレ）なども行われなくなるので、できれば以下の行を追加しましょう。

```rb:production.rb
config.assets.precompile += ['*.js']
```

JSファイル全部じゃなくて特定のファイルだけAssets Pipelineの対象にしたい場合は、このように書きます。

```rb:production.rb
config.assets.precompile +=  ['admin.js', 'admin.css', 'swfObject.js']
```

特定のディレクトリだけとかだとこうなるみたい（未検証）。

```rb:production.rb
config.assets.precompile += ['directory/*.js']
```

あとは、必要に応じて View で呼ぶとよいでしょう。
その際は、`javascript_include_tag` を使います。

例えば以下のようなJSファイルを View で読み込みたい場合。

app/assets/javascripts/kokohadoko/watashihadare.js.erb

```rb:
<%= javascript_include_tag 'kokohadoko/watashihadare' %>
```

ってのを書けばいいです。MD5ハッシュ付きのアレなJSファイルをちゃんと読み込んでくれます。
細かいことを言うと、位置はerb ファイルの中でもなるべく下の方に書いてください。

CSSでも↑をまるっと読み替えてもらえば対応できます。
JSとCSS両方って場合のproduction.rbはこんな感じ。

```rb:production.rb
config.assets.precompile = ['*.js','*.css']
```

stylesheet_link_tag を使って個別のCSSを読み込むことになりますが、JSと違って位置は上の方にしてください。
SASSを使っている場合、AssetPipelineのコンパイル順の関係でエラーが発生することがあります（コメント参照）。


---------------------------------------

某所で質問に上がっていたので、もしかして需要があるのかな、と記事にしてみました。
app/assets/javascripts 配下にファイルを置くとひとつにまとまるのは Rails3.1 で導入された Assets Pipeline の既定の動作ですが、単にテンプレートがそうなっているだけの話です。
上で書いたように application.js.erb が配下のJSファイルをすべて読み込んでひとつにする記述になっているのと、 `app/views/layouts/application.html.erb` に以下の記述があるってのと。

```rb:app/views/layouts/application.html.erb
<%= javascript_include_tag 'application' %>
```

Assets Pipeline は何気にいろいろ難しいですね。
私も必要に応じてかいつまんで調べているので、間違いなどあったら指摘してください。
manifest ファイルがうんたらとか言い出したらちょっと深みにはまってる気がしないでもないですが、静的ファイルを効率よく提供できるかどうかはサイトのパフォーマンスに結構影響するんですよね。。。

Assets Pipeline。
開発者に負担を強いることなくページの読み込み速度を速くするためのいい仕組みなのは間違いないのですが、やはり何をどうしているのか知っておいた方がよさそうです。
YSLOW などを動かしながら計測すると分かりますが、1ページで読み込むファイル数が多いと表示速度は遅くなりますし、ブラウザのキャッシュの有効利用を考えた場合、あまり細かくページごとの JS ファイル読み込みにこだわるのも却ってパフォーマンスダウンにつながります。
ほんとに一部のページでしか使われていないとか、管理ページで使っている JS ファイルなので一般ページではちょっと・・・とかじゃなければ、素直に application.js にいっしょくたでいい気もしています。 

---------------------------------------

`config.assets.precompile` の設定変更なども、これをやると確実に rake assets:precompile の処理にかな～りの時間がかかるようになります。デフォルトでは application.js.erb と application.css.erb が対象だったのが、すべてに変わるのである意味当然です。
heroku を使っている場合（かつ、manifest ファイルを事前に用意していない場合）は deploy がそれ以前に比べてかなり遅くなると思います。まあ、日本で heroku 使うなら assets_sync も使うだろうし、不可避というか必然ではあるんですけどね。
grunt-contrib-uglifyでsourceMapのファイル名を可変にする方法

忘備録として。
ファイルをコンパクトにする際に使用する[grunt-contrib-uglify](https://github.com/gruntjs/grunt-contrib-uglify).
`sourceMap` オプションでファイル名を指定する場合、公式サイトでは固定ファイル名で出力しているが
実利用では可変ファイル名を扱う場合が多いので、その場合の設定方法を調べてみた。

`sourceMap` にはfunctionも指定できるので、これによってファイル名を可変にできる。

```javascript:Gruntfile.js
    uglify: {
      options: {
          sourceMap: function(name) { return name.replace(/.js/,".map");} 
      },
      build: {
		files: [
				{
				  expand: true,
				  src: ['**/*.js'], 
				  dest: '../build/',
				  ext: '.js',  
				},
			  ],
	  }
    },
```

**2017/04 追記**
記事投稿後、sourceMap まわりのオプションが整理・追加されて、いろいろ変わったようです。
動作確認はしていませんが、 `sourceMap` ではなく `sourceMapName` のオプション名で同様のことができそうです。詳しくは[公式ページ](https://github.com/gruntjs/grunt-contrib-uglify)を見てください。
「第10回オフラインリアルタイムどう書くの問題」をPHPで解く

http://qiita.com/Nabetani/items/55641767510c2f9f235f
http://nabetani.sakura.ne.jp/hena/ord10haniwa/

第10回はハニカム歩きです。
ていうかこれ、第12回の道なりの亀と同じだよな。
http://yuubiseiharukana.blog.shinobi.jp/Entry/1191/
ただし進行方向が6方向と、二次元配列で解くには少々面倒になっています。
ということで手っ取り早く進行先を全部持たせることにします。

```php:
<?php
	class HONEYCOMB{
		// はにかむ構造
		private $next = [
			'A' => 'BCDEFG','B' => 'HICAGS','C' => 'IJKDAB','D' => 'CKLMEA','E' => 'ADMNOF','F' => 'GAEOPQ',
			'G' => 'SBAFQR','H' => 'TUIBSk','I' => 'UVJCBH','J' => 'VWXKCI','K' => 'JXYLDC','L' => 'KYZaMD',
			'M' => 'DLabNE','N' => 'EMbcdO','O' => 'FENdeP','P' => 'QFOefg','Q' => 'RGFPgh','R' => 'jSGQhi',
			'S' => 'kHBGRj','T' => '!!UHk!','U' => '!!VIHT','V' => '!!WJIU','W' => '!!!XJV','X' => 'W!!YKJ',
			'Y' => 'X!!ZLK','Z' => 'Y!!!aL','a' => 'LZ!!bM','b' => 'Ma!!cN','c' => 'Nb!!!d','d' => 'ONc!!e',
			'e' => 'POd!!f','f' => 'gPe!!!','g' => 'hQPf!!','h' => 'iRQg!!','i' => '!jRh!!','j' => '!kSRi!','k' => '!THSj!'
		];
		
		/**
		* はにかむ構造を解いて返す
		* @param String 「135004」みたいな文字列
		* @return String 「ACDABHS」みたいな文字列
		*/
		public function get($route){
			$ret = $now = 'A';
			foreach(str_split($route) as $val){
				$next = $this->next[$now][$val];
				$ret.= $next;
				// !の場合は先に進まない
				if($next !== '!'){
					$now = $next;
				}
			}
			return $ret;
		}
	}
	
	// テスト
	$test = [
		[ '135004', 'ACDABHS' ],
		/* 省略 */
	];

	$honeycomb = new HONEYCOMB();
	foreach($test as $key=>$data){
		$answer = $honeycomb->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
```

今回はえらい簡単でした。
20分くらいで終わった。
もしかしたら第12回もこの方法でやった方が簡単だったかもしれぬ。
うっかりdebug用に署名したapkをリリース用に署名し直す方法

こんな感じのdebug用に署名されたapkがあるとするじゃろ

```shell-session:
$ jarsigner -verify -verbose -certs app.apk.debug_signed

sm    2046796 Thu Jul 04 20:40:04 JST 2013 classes.dex

      X.509, CN=Android Debug, O=Android, C=US
      [certificate is valid from 10/17/12 10:03 AM to 10/10/42 10:03 AM]

       37164 Thu Jul 04 20:40:04 JST 2013 META-INF/MANIFEST.MF
       37217 Thu Jul 04 20:40:04 JST 2013 META-INF/CERT.SF
         776 Thu Jul 04 20:40:04 JST 2013 META-INF/CERT.RSA

  s = signature was verified 
  m = entry is listed in manifest
  k = at least one certificate was found in keystore
  i = at least one certificate was found in identity scope

jar verified.
````

( ＾ω＾)
⊃zipコマンドで…⊂

```shell-session:
$ zip -d app.apk.debug_signed 'META-INF/*'
deleting: META-INF/MANIFEST.MF
deleting: META-INF/CERT.SF
deleting: META-INF/CERT.RSA
```

( ＾ω＾)
≡⊃署名を消すじゃろ⊂≡

```shell-session:
$ jarsigner -verify -verbose -certs app.apk.debug_signed

  s = signature was verified 
  m = entry is listed in manifest
  k = at least one certificate was found in keystore
  i = at least one certificate was found in identity scope

no manifest.
jar is unsigned. (signatures missing or not parsable)
```

( ＾ω＾)
≡⊃こんなkeystoreを使って…⊂≡

```shell-session:
$ keytool -v -list -keystore ~/.android/release.keystore
Enter keystore password:  

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entries

Alias name: release
Creation date: Jan 1, 2013
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=Jhon Doe, OU=App Division, O=Example, L=Suginami, ST=Tokyo, C=81
Issuer: CN=Jhon Doe, OU=App Division, O=Example, L=Suginami, ST=Tokyo, C=81
Serial number: deadbeef
Valid from: Tue Jan 1 11:22:33 JST 2013 until: Sat Jan 1 11:22:33 JST 2050
Certificate fingerprints:
	 MD5:  DE:AD:BE:EF:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
	 SHA1: AB:AD:BA:BE:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
	 Signature algorithm name: SHA1withRSA
	 Version: 3


*******************************************
*******************************************


```

( ＾ω＾)
≡⊃jarsignerで署名して…⊂≡

```shell-session:
$ jarsigner -verbose -keystore ~/.android/release.keystore app.apk.debug_signed release
Enter Passphrase for keystore: 
   adding: META-INF/MANIFEST.MF
   adding: META-INF/XCERT.SF
   adding: META-INF/XCERT.RSA
  signing: assets/anan.m4a
<<snip>>
  signing: res/drawable-xhdpi/icon.png
  signing: res/drawable-xxhdpi/icon.png
  signing: classes.dex
```

( ＾ω＾)
⊃zipalignで整列⊂ 

```shell-session:
$ ~/Applications/android-sdks/tools/zipalign -f -v 4 app.apk.debug_signed app.apk
Verifying alignment of fantasistadoll.apk (4)...
      50 META-INF/MANIFEST.MF (OK - compressed)
   12891 META-INF/XCERT.SF (OK - compressed)
   25965 META-INF/XCERT.RSA (OK - compressed)
   27104 assets/anan.m4a (OK)
<<snip>>
26960572 res/drawable-xhdpi/icon.png (OK)
26982608 res/drawable-xxhdpi/icon.png (OK)
27023811 classes.dex (OK - compressed)
Verification succesful
```

＿人人人人人人人人人人人人＿
＞ リリース用に署名完了！！ ＜
￣^Y^Y^Y^Y^Y^Y^Y^Y^Y^￣
tmlib.jsでCheckbox

tmlib.js でCheckboxをSpliteで実装する。
イメージとサイズは任意。
省略すると　画像->固定名で画像を指定　サイズ->チェックONの画像サイズ　を読む。

[jsdo.itにサンプル置きました。](http://jsdo.it/cupk/8AFDr)

```js:
/**
 * チェックボックスクラス
 */
var Checkbox = tm.createClass({
	superClass: tm.app.Sprite,
	
	trueImage: null,
	falseImage: null,
	disabledImage: null,
	
	disabled: false,
	checked: false,
	
	init: function(x, y, trueImg, falseImg, disabledImg, width, height) {
		// 画像指定無しなら標準のを指定
		this.trueImage = (trueImg == null) ? "checked" : trueImg;
		this.falseImage = (falseImg == null) ? "nochecked" : falseImg;
		this.disabledImage = (falseImg == null) ? "disablechecked" : disabledImg;
		
		// チェックボックスのサイズ指定無しならチェックON画像のサイズを使用
		var img = tm.graphics.TextureManager.get(this.trueImage);
		if (width == null) { width = img.width; }
		if (height == null) { height = img.height; }
		this.superInit(width, height);
		this.setPosition(x, y);
		
		// マウスイベントを有効化
		this.interaction.enabled = true;
		this.interaction.boundingType = "rect";
	},
	
	update: function() {
		this.setCheckImage();
	},
	
	// チェック切り替え
	onpointingend: function() {
		if (this.disabled) return;
		this.checked = !this.checked;
	},
	
	// イメージの切り替え
	setCheckImage: function() {
		if (this.disabled) {
			this.image = this.disabledImage;
			return;
		}
		this.image = this.checked ? this.trueImage : this.falseImage;
	},
	
	setDisabled: function(stat) {
		this.disabled = stat;
	},
	
	setChecked: function(stat) {
		this.checked = stat;
	},
});
```


使用例（Checkboxクラスの定義は省略）

```js:
/*
 * constant
 */
var SCREEN_WIDTH    = 640;
var SCREEN_HEIGHT   = 920;
var SCREEN_CENTER_X = SCREEN_WIDTH / 2;
var SCREEN_CENTER_Y = SCREEN_HEIGHT / 2;

// 画像のプリロード
tm.preload(function(){
	tm.graphics.TextureManager.add("checked", "checked.png");
	tm.graphics.TextureManager.add("nochecked", "nochecked.png");
	tm.graphics.TextureManager.add("disablechecked", "disablechecked.png");
});

/*
 * メイン処理(ページ読み込み後に実行される)
 */
tm.main(function() {
	
	// アプリケーション作成
	var app = tm.app.CanvasApp("#world");
	app.resize(SCREEN_WIDTH, SCREEN_HEIGHT); // リサイズ
	app.fitWindow();    // 自動フィット
	app.background = "white";
	
	// シーンを切り替える
	app.replaceScene(MainScene());
	
	// 実行
	app.run();
});


tm.define("MainScene", {
	superClass: "tm.app.Scene",
	
	init: function() {
		// 親の初期化
		this.superInit();
		
		// チェックボックスの表示
		Checkbox(300, 40).addChildTo(this);                      // nocheck
		Checkbox(300, 110).addChildTo(this).setChecked(true);    // checked
		Checkbox(300, 180).addChildTo(this).setDisabled(true);   // disable
	},
});
```

こうなる。

![cbsample.png](https://qiita-image-store.s3.amazonaws.com/0/25969/7ccaff71-4210-e0e7-5cc2-ea0231800ceb.png)
whitespace-modeを使って、ファイルの保存時に行末のスペースや末尾の改行を削除する

`whitespace-mode`は、スペースやタブなどの不可視文字を見えるようにするモードですが、それだけでなく不要なスペースや改行を削除するための機能もあります。
これを使って、ファイルの保存時に行末のスペースや末尾の改行を削除できるようにします。

不要なスペース・改行の削除
----
`whitespace-mode`の関数`whitespace-cleanup`を呼び出すと不要なスペースなどを削除できます。
だたし、`whitespace-style`に設定した値によって、何を削除対象とするかの挙動が変わってしまうので注意が必要です。

変数（リスト）`whitespace-style`に含めることのできるシンボルと、それが意味する削除対象のうち、主なものは以下の通りです。

| シンボル | 削除対象 |
|:----|:----|
| empty | バッファの先頭と末尾の空行 |
| trailing | 行末のスペース |

その他にも、行頭の余計なスペースを削除したり、インデントに使うタブとスペースの置換も行えるみたいです。
詳しくは、[EmacsWiki: White Space](http://www.emacswiki.org/emacs/WhiteSpace) を参照してください。

保存時に実行
----
`whitespace-cleanup`を`before-save-hook`に登録すれば、ファイルの保存時に実行してくれるようになります。
ただ、実行のオン・オフを切り替えるのが少し面倒なので、もう少し簡単に保存時の実行トリガーを設定することができる、`whitespace-mode`の`whitespace-action`を利用します。

`whitespace-action`は変数（リスト）であり、特定の値を設定しておくと、`whitespace-mode`がオンになったときや、ファイルの保存時などに、`whitespace-mode`に特定の動作をさせることができます。

`whitespace-action`に含めることのできるシンボルと、それが意味する動作のうち、主なものは以下のとおりです。

| シンボル | 動作 |
|:----|:----|
| cleanup | `whitespace-mode`がオンになった時に、削除実行 |
| auto-cleanup | ファイルの保存時に、削除実行 |


設定
----
以下のようになりました。
faceの`whitespace-empty`を大人しめの色などに設定しておかないと、デフォルトだと黄色に表示されるので、かなり見づらいです。

```el
(require 'whitespace)
(setq whitespace-style '(face           ; faceで可視化
                         trailing       ; 行末
                         tabs           ; タブ
                         spaces         ; スペース
                         empty          ; 先頭/末尾の空行
                         space-mark     ; 表示のマッピング
                         tab-mark
                         ))

(setq whitespace-display-mappings
      '((space-mark ?\u3000 [?\u25a1])
        ;; WARNING: the mapping below has a problem.
        ;; When a TAB occupies exactly one column, it will display the
        ;; character ?\xBB at that column followed by a TAB which goes to
        ;; the next TAB column.
        ;; If this is a problem for you, please, comment the line below.
        (tab-mark ?\t [?\u00BB ?\t] [?\\ ?\t])))

;; スペースは全角のみを可視化
(setq whitespace-space-regexp "\\(\u3000+\\)")

;; 保存前に自動でクリーンアップ
(setq whitespace-action '(auto-cleanup))

(global-whitespace-mode 1)

(defvar my/bg-color "#232323")
(set-face-attribute 'whitespace-trailing nil
                    :background my/bg-color
                    :foreground "DeepPink"
                    :underline t)
(set-face-attribute 'whitespace-tab nil
                    :background my/bg-color
                    :foreground "LightSkyBlue"
                    :underline t)
(set-face-attribute 'whitespace-space nil
                    :background my/bg-color
                    :foreground "GreenYellow"
                    :weight 'bold)
(set-face-attribute 'whitespace-empty nil
                    :background my/bg-color)
```

こんな風に表示されます。
![whitespace.png](https://qiita-image-store.s3.amazonaws.com/0/20457/ab9e3984-7e1c-7eef-bbf7-6bf2775759d3.png)

`markdown-mode`などでauto-cleanupを無効にする
----
フックを使って、`whitespace-action`を`nil`に設定してやればいいです。
`whitespace-action`はグローバル変数なので、`make-local-variable`でバッファローカル変数にしています。

```el
(add-hook 'markdown-mode-hook
          '(lambda ()
             (set (make-local-variable 'whitespace-action) nil)))
```
tmuxとvim-rspecとvim-dispatchで快適なRSpec生活


tmuxと

- [vim-rspec](https://github.com/thoughtbot/vim-rspec)
- [vim-dispatch](https://github.com/tpope/vim-dispatch)

この2つを組み合わせて使うとvimからRSpecで書いたexampleを実行するのが超楽になります

とりあえず新しいプラグインを見つけた時に一番最初に気になる**「NANIができんねん!??!?!?!」**

というのは言葉ではなく実際に見てみないとわからないのでgifを貼ります

![](http://gifzo.net/BGq9B2OPS8S.gif)

といった具合に

- RSpecをvimから実行出来る
- 実行処理は™uxの別paneが自動的に開いてそこで
- 実行後vimのquickfixで結果を表示

してくれます。個人的には痒いところに手が届く感じがしてすごいいいです。

もちろんカーソルから一番近いexample1個だけを実行も出来ます

![](http://gifzo.net/hN6xRDRbJT.gif)

## 何が起こったかの流れ

vim-rspecを入れることによって実行できる

```vim
:call RunCurrentSpecFile()
:call RunNearestSpec()
:call RunLastSpec()
:call RunAllSpecs()
```

のコマンドの内どれかを実行

↓

vim-rspec側の設定でvim-dispatchを入れることによって入る`Dispatch`コマンドに`rspec`コマンドを渡して実行

↓

vim-dispatchはtmuxが起動してると自動的に別paneを開いて実行してくれる

↓

vim-dispatchが実行結果をquickfix上で表示してくれる

といった感じになります。

## 設定方法

### インストール

```vim
NeoBundle 'tpope/vim-dispatch'
NeoBundle 'thoughtbot/vim-rspec'
```

僕のように遅延ロードして少しでもvim起動を速くしたい人は

```vim
NeoBundleLazy 'thoughtbot/vim-rspec', {
                \ 'depends'  : 'tpope/vim-dispatch',
                \ 'autoload' : { 'filetypes' : ['ruby'] }
              \ }
```

### 設定

`let g:rspec_command = "Dispatch rspec {spec}"`

とすることによってvim-rspecによって入るコマンドを叩いたら`rspec`コマンドを`Dispatch`コマンドに渡して実行できます。

`NeoBundleLazy`を使用してる方は

```vim
let s:bundle = neobundle#get('vim-rspec')
function! s:bundle.hooks.on_source(bundle)
   let g:rspec_command = 'Dispatch rspec {spec}'
endfunction
```

になります。

ちなみに僕はRSpec 1.Xを使用してるプロジェクトもあるので

```vim
let s:bundle = neobundle#get('vim-rspec')
function! s:bundle.hooks.on_source(bundle)
  if executable('rspec')
    let g:rspec_command = 'Dispatch rspec {spec}'
  elseif executable('spec')
    let g:rspec_command = 'Dispatch spec {spec}'
  endif
endfunction
```

としてます。

#### おまけ

zeusも使ってる人は

`let g:rspec_command = "Dispatch zeus rspec {spec}"`

とすればzeusの恩恵ももちろん受けれます、便利！

### キーバインド

僕は以下のように設定してます

```vim
nmap <silent><leader>c :call RunCurrentSpecFile()<CR>
nmap <silent><leader>n :call RunNearestSpec()<CR>
nmap <silent><leader>l :call RunLastSpec()<CR>
nmap <silent><leader>a :call RunAllSpecs()<CR>
```


## まとめ

guardも使用してるんですが、guardでは個別のexampleを実行するいい方法が見つからず、この方法に行き着きました。

vim-dispatchはvim-rspecと組み合わせて使う以外にも色々と便利な使い道があるので一度[README](https://github.com/tpope/vim-dispatch/blob/master/README.markdown)をみてみるといいかもしれません
PHPステートパターンによるゆゆ式の実装

ソースは[Wikipedia: State パターン](http://ja.wikipedia.org/wiki/State_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)

JAVAで書かれているものをPHPに書き直し、変数を書き換えたりしてみた。

みんなも好きな百合アニメで試してみよう！


```php:
<?php
/*
* PHPによるステートパターンの例

*/

interface State { 
        public function yuyushiki($stateContext);
} 
 
class Yui implements State { 
        public function  yuyushiki($stateContext) { 
                print("唯→"); 
                $stateContext->setState(new Yuzuko()); 
        } 
} 
 
class Yuzuko implements State { 
        private  $count=0; 
        public function yuyushiki($stateContext){ 
                print("ゆずこ→"); 
	            $stateContext->setState(new Yukari()); 
        }
}
class Yukari implements State { 
        public function yuyushiki($stateContext){ 
                print("縁→"); 
                $stateContext->setState(new Yui()); 
        }
}
/*

クライアントクラス
	ここを通してステートクラスにアクセスする

*/
class StateContext {
		//自分の状態をおぼえておく
        private $myState; 
        
        
        /*
        * コンストラクタ。最初は Yui のオブジェクトを自分の状態として保持する。
        */
        public function __construct() { 
                $this->setState(new Yui()); 
        } 
 
        // 通常は、State インタフェースを実装しているクラスによってのみ呼び出される
        public function setState($newState) { 
                $this->myState = $newState; 
        }
 
		/*
		
		自分で生成したオブジェクト、すなわち初めは Yui のインスタンスからメソッドを実行する

			説明しよう。
			
			First Step:
				最初に yuyushiki メソッドが実行されると、
				$this によって自分自身のインスタンスを渡すので、
				Yui に権限を委譲してある setState メソッドを通じ、
				StateContext の状態が Yuzuko へと変化するのだ。
			
			Second Step:
				二回目に yuyushiki メソッドが実行されると、
				こんどは Yui クラスではなく、 Yuzuko クラスに自分のインスタンスが渡される。
				そのため、 Yuzuko に権限を委譲していた setState メソッドが実行され、
				StateContext の状態は Yukari へと変化させられる。

			Third Step:
				三回目に yuyushiki メソッドが実行されると、
				そのため、 Yukari に権限を委譲していた setState メソッドが実行され、
				StateContext の状態は Yui へと変化させられる。
		*/
        public function yuyushiki() { 
                $this->myState->yuyushiki($this); 
        } 
}
/*
*
* 実際に実行してみる
*
*/
$sc = new StateContext(); 
$sc->yuyushiki(); 
$sc->yuyushiki(); 
$sc->yuyushiki(); 
$sc->yuyushiki(); 
$sc->yuyushiki();
$sc->yuyushiki(); 
$sc->yuyushiki(); 
$sc->yuyushiki(); 
$sc->yuyushiki(); 
$sc->yuyushiki(); 
$sc->yuyushiki(); 
$sc->yuyushiki(); 
$sc->yuyushiki(); 
$sc->yuyushiki(); 
$sc->yuyushiki(); 
$sc->yuyushiki(); 
$sc->yuyushiki(); 
$sc->yuyushiki(); 
$sc->yuyushiki(); 
$sc->yuyushiki(); 
$sc->yuyushiki(); 
$sc->yuyushiki(); 
$sc->yuyushiki(); 
$sc->yuyushiki(); 
$sc->yuyushiki();

```

#実行結果
唯→ゆずこ→縁→唯→ゆずこ→縁→唯→ゆずこ→縁→唯→ゆずこ→縁→唯→ゆずこ→縁→唯→ゆずこ→縁→唯→ゆずこ→縁→唯→ゆずこ→縁→唯→
コマンドが「失敗した時」に別のコマンドを実行する方法


コマンド hoge の終了ステータスが成功した場合に別のコマンド piyo を実行したい場合、

```sh:success.sh
if hoge; then
	piyo
fi
```

と書く。逆に hoge が失敗だった場合だけpiyoを実行した場合どうするか。

#|| を使う。
そのものずばりの機能があって、

```sh:pipepipe.sh
hoge || piyo
```

と書けば、hogeが失敗した場合だけpiyoが実行される。||の代わりに&&を使えば、hogeが成功した場合だけpiyoが実行される。

@nise_nabe さん、ありがとうございました。

#! を使う。
!というコマンドがあって、こいつは、

```sh:bikkuri.sh
! hoge
```

とすると、まずhogeが実行されて、hogeの終了ステータスが0だったら1を、0以外だったら0を終了ステータスとして返してくれる。
なので、

```sh:bikkuriif.sh
if ! hoge; then
	piyo
fi
```

と書けば、hogeが失敗した場合だけpiyoが実行される。

@leihcrev さん、ありがとうございました。
PHPによるステートパターン（Wikipediaを参照した）

ソースは [Wikipedia: State パターン](http://ja.wikipedia.org/wiki/State_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)

上記記事の「JAVAによる例」をコピペし、PHPで動作するように書き換えてみました。

ただ読んだだけではわからないので、とりあえず今後いじって理解するためのテンプレと思って作りました。

```php:
<?php
/*
* PHPによるステートパターンの例
* 
*/

interface State { 
        public function writeName($stateContext, $name);
} 
 
class StateA implements State { 
        public function  writeName($stateContext, $name) { 
                print(strtolower($name)); 
                $stateContext->setState(new StateB()); 
        } 
} 
 
class StateB implements State { 
        private  $count=0; 
        public function writeName($stateContext, $name){ 
                print(strtoupper($name)); 
                // StateBのwriteName()が2度呼び出された後に状態を変化させる
                if(++$this->count>1) { 
                        $stateContext->setState(new StateA()); 
                }
        }
}
class StateContext {
        private $myState; 
        public function __construct() { 
                $this->setState(new StateA()); 
        } 
 
        // 通常は、Stateインタフェースを実装しているクラスによってのみ呼び出される
        public function setState($newState) { 
                $this->myState = $newState; 
        }
 
        public function writeName($name) { 
                $this->myState->writeName($this, $name); 
        } 
}

/*
*
* 実際に実行してみる
*
*/
$sc = new StateContext(); 
$sc->writeName("<p>Monday</p>"); 
$sc->writeName("<p>Tuesday</p>"); 
$sc->writeName("<p>Wednesday</p>"); 
$sc->writeName("<p>Thursday</p>"); 
$sc->writeName("<p>Saturday</p>"); 
$sc->writeName("<p>Sunday</p>"); 

```
クリップボードの履歴から検索して再利用する(mac)

シェルスクリプトごりごり書いた(˘ω˘)

![percol_clipBoard.jpg](https://qiita-image-store.s3.amazonaws.com/0/188/be7ad680-f9e7-1131-7b2f-02bdd8edece6.jpeg "percol_clipBoard.jpg")

##概要(できるようになること)
シェル(zsh)上で `alt + c`を押すと上のような画面が表示されて今までのクリップボードの履歴が表示される
↓
検索して行を選び`Enter`を押すとその行が再びクリップボードに入って再利用できる


##導入(3ステップ)
###①インストール

* zsh
* percol(参考: [percol 入れて zsh と組み合わせたら超便利](https://gist.github.com/mitukiii/4234173))
* [ClipMenu](http://www.clipmenu.com/ja/) (macの クリップボードの履歴を管理するアプリ)


###②ClipMenuの設定のGeneral(日本語環境だったら文言違うかも)で
・`max clipboard history size ` を `10000` に変更 (適宜変更可)
・`Autosaving clipboard history ` を ` Every minute ` に変更

###③.zshrcに追加

```bash:.zshrc
#percolでクリップボード検索
function searchClipBoard() {
    clipMenuPath='$HOME/Library/Application Support/ClipMenu'
        plutil -convert xml1 $HOME/Library/Application\ Support/ClipMenu/clips.data -o - |\
        awk '/<string>/,/<\/string>/'|\
        sed -e 's/<string>//g' -e 's/<\/string>//g' -e 's/&lt;/</g' -e 's/&gt;/>/g' |\
        head -5015 |tail -5000 |\
        sed '/^$/d'|cat -n |sort -k 2|uniq -f1 |sort -k 1 |\
        sed -e 's/^ *[0-9]*//g' |\
        awk '{for(i=1;i<NF;i++){printf("%s%s",$i,OFS=" ")}print $NF}' |\
        percol |sed -e "s/\ /\\\ /g" |\
        sed -e 's/\\ / /g' |ruby -pe 'chomp' |pbcopy
    zle reset-prompt
};
zle -N searchClipBoard
bindkey '^[c' searchClipBoard
```


これで  .zshrcを読み直す(`$ source .zshrc`)

快適ヾ(:3ﾉｼヾ)ﾉｼ


##補足
・ショートカットは変更可能
・shellscriptの `head -5015 |tail -5000 `のところで要らない15件を排除して5000件取ってくるようにしてるので、500件だけとりたかったら
 `head -515 |tail -500` に変える
・他のクリップボード管理系のアプリでも履歴一覧さえ取ってこればできる
WEBブラウザからコマンドを実行する君作った

新バージョン作りました。
[WEBブラウザから検索やコマンド実行をする君2](http://qiita.com/tukiyo@github/items/48a66e529d67bbcd164d)

## 実行方法

* main.py を実行して http://localhost:8080/ にアクセスしてください。
* リンクがあるのでクリック。
* コマンドを入力してexecuteを押す。

![wshell.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a8ef5d4b-e194-ab6f-dc9a-b71c33b38478.png)

[download](https://github.com/tukiyo/wshell)
Reflect the deletion of remote branch to local repository

- リモートとローカルのブランチ状況を確認する

```bash
git remote show origin"
```

- リモートで削除されているが、ローカルでトラッキングブランチとして残っているものは"Stale tracking branch"と表示される

- 削除する

```bash
git remote prune origin
```

- "--dry-run"オプションで、削除対象のレポートだけして実際にはしない

```bash
git remote prune origin --dry-run

```
SSHコマンドの引数からsudoを実行する


## エラーになる
リモート端末へSSHコマンドの引数からsudoを実行すると下記のようにエラーになります。

```
> ssh 'user'@'server' sudo /etc/init.d/http restart
sudo: sorry, you must have a tty to run sudo
```
RHEL/CentOS5系のOSでは、セキュリティとしてttyがないとsudoコマンドを実行出来ないように設定されているらしい。

## 仮想端末を割り当てて通す
```
> ssh -t 'user'@'server' sudo /etc/init.d/http restart
```
「-tオプション」を付けることによって、強制的に仮想端末が割り当てられsudoコマンドを実行することが出来る
ランキングで同率順位を加味した順位を取得するロジック


ランキング実装で順位を求める際、「スコア順に降順ソートして何件目にあるか」とかで順位を求めがちだけど、それでは同率順位までは加味できない。
そこで、同率順位も加味できる簡単なロジックがあったのでメモしておきます。

## テーブル（例）
| row | member | score |
|:-----------|------------:|:------------:|
| 1 | user1 | 200 |
| 2 | user2 | 100 |
| 3 | user3 | 300 |
| 4 | user4 | 200 |
| 5 | user5 | 400 |

## 処理の流れ
1. 自分のスコアを取得する
2. 自分のスコア以上の件数をカウントする
3. 自分のスコア以上の件数に+1する

## Redisで書く
1. redis> zscore ranking_key user1 -> 200
ソート済セット型でキー「ranking_key」のメンバー「user1」のスコアを検索、結果200

2. redis> zcount key 201 +inf -> 2
ソート済セット型で 「ranking_key」のスコアが200以上の件数が何件あるかカウントする（200に+1することで200以上とする）、結果2

3. 2 +1 -> 3
2で求めた件数に+1することで順位が求められる

## コマンド
### テストデータ
redis 127.0.0.1:6379> ZADD ranking_key 200 user1
(integer) 1

redis 127.0.0.1:6379> ZADD ranking_key 100 user2
(integer) 1

redis 127.0.0.1:6379> ZADD ranking_key 300 user3
(integer) 1

redis 127.0.0.1:6379> ZADD ranking_key 200 user4
(integer) 1

redis 127.0.0.1:6379> ZADD ranking_key 400 user5
(integer) 1

### 処理
redis 127.0.0.1:6379> ZSCORE ranking_key user1
"200"

redis 127.0.0.1:6379> ZCOUNT ranking_key 201 +inf
(integer) 2

結果+1が順位
ぼくのかんがえたCHEF-3694たいさく

chefを使っていて地味に困るのはCHEF-3694、同一リソースを複数回いじったときのこの警告です。

もちろん、同じリソースを何の考えもなしに複数回いじるのは問題がありますが、意図的に複数回いじる必要があることもあります。そんなときには、この警告は邪魔者以外の何物でも無い。

というわけで、自分がやっているCHEF-3694対策についてまとめます

## 2度目だとわかってて実行するとき
途中までの設定を反映するためにサービス再起動が必要だったりとか、意図的に2回実行したい事があります。こういう時のやりかた。

```ruby:execute_twice
service "httpd" do
  action :restart
end

# いろいろ処理して…

log "httpd-restart-again" do
  level :info
  notifies :restart, "service[httpd]", :immediately
  # notifies(action, resource, timing=:delayed)
end
```

chefのresourceからは基本的にnotifiesで別のアクションを呼ぶことが出来ます。なので、無害なアクションからnotifiesで呼べば問題なく実行できます。デフォルトのタイミングは:delayedなので、最後でもよい場合は3つめの引数は省略できますが、その場で実行したい場合は`:immediately`をつけます。

## 過去にやっているか定かではないけど、決まった処理を実行したいとき
主に複数cookbookを実行する場合だと思いますが、apacheのwelcome.confを削除する等、そのリソースに対する処理が決まりきっていて、とにかく1回実行しちゃえば問題ない時にやるやり方。

```ruby:execute_once_without_warning
resources("file[/tmp/gomi]") rescue file "/tmp/gomi" do
  action :delete
end
```

notifiesで指定するとき同様に、あるはずのresourceを指定します。このとき、`resources()`は指定されたものが見つからないと例外が送出されるので、つまり、みつからなかったらここでresourceを定義すれば良いです。

上記のコードだとすっきりしない、もしくはもうちょっといろいろやりたい場合は、`Chef::Exceptions::ResourceNotFound`に対して処理をすればOKです。

```ruby:begin-rescue
service "rsyslog" do
  action :start
end

begin
  resources("service[rsyslog]").nil?
  Chef::Log::info("rsyslog found")
rescue Chef::Exceptions::ResourceNotFound
  Chef::Log::info("rsyslog not found")
end
# output "rsyslog found"

begin
  resources("service[no-such-resource]").nil?
  Chef::Log::info("no-such-resource found")
rescue Chef::Exceptions::ResourceNotFound
  Chef::Log::info("no-such-resource not found")
end
# output "no-such-resource not found"
```

このやり方だと「xxxを実行済みの場合は、yyyに切り替える」のような処理分岐も出来るようになります。
[PHP] 指定した文字数で文字列を丸める。

 指定した文字数で文字列を丸める場合、mb_strimwidth関数を使うことで実現することが出来ます。


```mb_strimwidth

$text = "123465789012346578901234567890";
$string = mb_strimwidth( $text, 0, 20, "...", "UTF-8" );
echo　$string;
---
12346578901234657...


$text = "あいうえお12345678あいう";
$string = mb_strimwidth( $text, 0, 20, "...", "UTF-8" );
echo　$string;
---
あいうえお1234567...

```
mb_strimwidth関数では、半角を1文字として、全角を2文字として扱われるので、指定した文字数を超えた場合、
それ以降の文字列をカットすることが出来ます。
また、第4パラメータで、文字列末尾に付加する文字列を指定するが出来ます。
注意点としては、例えば上記のように20文字で丸める場合、付加した末尾の文字列も含めて20文字となるため、
17文字までしか表示されません。
実際にありそうなダミーの氏名を作る


ランキング上位の姓とランキング上位の名を組み合わせることで実際にありそうな氏名をつくることができる。

## ランキングデータ

### 姓

全国・都道府県別ランキング　(名字由来net)
http://myoji-yurai.net/prefectureRanking.htm

### 名

名前ランキング (明治安田生命)
http://www.meijiyasuda.co.jp/enjoy/ranking/

「生まれ年別名前ベスト10」を使うと、特定の年齢層でありそうな氏名を作れる。

## 例: 2013年において40歳の男性っぽいダミー氏名を5名分つくる

### 手順1: 日本人の姓のランキング上位5件を調べる

佐藤, 鈴木, 高橋, 田中, 伊藤

### 手順2: 1973年生まれの男性の名前ランキングの上位5件を調べる

誠, 剛, 哲也, 直樹, 健一

### 手順3: それぞれを任意に組み合わせてできあがり

伊藤健一, 高橋哲也, 佐藤誠, 田中直樹, 鈴木剛
Canvas.drawBitmap()で画像を拡大・縮小したときに、ジャギーが目立たないように描画する方法


細い線で描かれたイラスト画像を、解像度の低い端末で表示した際に、線がかすれたようになってしまいました。補間が弱い感じです。
Webを検索してみたら、以下の記事が見つかりました。

[svartalfheim.jp - AndroidでCanvasにキレイに拡大縮小した画像を描画する方法](http://blog.svartalfheim.jp/?p=380 "svartalfheim.jp - AndroidでCanvasにキレイに拡大縮小した画像を描画する方法")

実際に試してみたところ、確かにきれいに表示されました。
しかし、わざわざ`BitmapDrawable`を使うのがしっくりこなかったので、きっと他に方法があると思い、いろいろ試してみました。

結果、`Paint`の`setFilterBitmap()`を`true`にすれば良いということがわかりました。それっぽい名前の`setAntiAlias()`は関係ないようです。
こんなに単純だったとは…。

```java:例
Paint paint = new Paint();
paint.setFilterBitmap(true);

canvas.drawBitmap(bitmap, null, dstRect, paint);
```

英語がもっとちゃんと読めればこんなに苦労しないんでしょうね。
[UITableView]reloadDataの完了後に処理を無理なく行いたい

##やりたかったこと：例
```objectivec

// UITableViewのdataSourceを変更する
……

// dataSource変更後のNSIndexPathを作成する
[NSIndexPath indexPathForRow:row inSection:section];

// 新しいdataSourceに反映させたあとでスクロールさせたい
[_tableView  reloadData]
[_tableView scrollToRowAtIndexPath:indexpath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
```
でやってしまうと、scrollToRowAtIndexPathが呼ばれるときは
reloadDataが完了される前のdataSourceで実行されてしまう。
だからといってNSThreadで待ったり、フラグだNotificationだするのはナンセンス

##解決方法：UITableViewの拡張
```objectivec
@implementation UITableView (UITableViewAddition)

-(void)reloadDataAndWait:(void(^)(void))waitBlock {
    [self reloadData];
    if(waitBlock){
        waitBlock();
    }
}
@end

```


##使用方法：例
```objective-c
NSLog(@"numberofsection%d",_tableView.numberOfSections);

[_tableView  reloadDataAndWait:^{
	NSLog(@"numberofsection%d",_tableView.numberOfSections);
	[_tableView scrollToRowAtIndexPath:indexpath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
}];

```
ちゃんとreload後に処理されていることがわかる。

>参考にしたURL
>http://stackoverflow.com/questions/15218861/call-function-only-after-reloaddata-has-finished
PHPのファイル入出力


## 読込

ファイルを文字列として読み込む
http://php.net/manual/ja/function.file-get-contents.php

````php
// ファイルから読み込む
$string = file_get_contents("hoge.txt");

// URLから読み込む
$string = file_get_contents("http://hoge.com/");
````

ファイルを配列として読み込む
http://php.net/manual/ja/function.file-get-contents.php

````php
// ファイルから読み込む
$array = file("hoge.txt");

// URLから読み込む
$array = file("http://hoge.com/");
````

## 書込
ファイルに書き込む
http://www.php.net/manual/ja/function.file-put-contents.php
 fopen()、 fwrite()、 fclose() を実行するのと等価

````php
 file_put_contents("hoge.txt", "piyo");
 file_put_contents("hoge.txt", $array);

// ファイルに追記
 file_put_contents("hoge.txt", "piyo", FILE_APPEND);

// 排他ロック
 file_put_contents("hoge.txt", "piyo", LOCK_EX);
````
MySQLのcase式で重複排除してカウントする

```sql:
SELECT COUNT(DISTINCT CASE 
        WHEN table.column >= 1 AND table.column <= 10 
        THEN table.id END)
FROM table
```
ポイントは、case式でIDを出力している点です。単純にcase式で数をカウントする例文は以下ですが

```sql:
SELECT SUM(CASE 
        WHEN table.column >= 1 AND table.column <= 10 
        THEN 1 ELSE 0 END)
FROM table
```

これでは重複排除のための情報が落ちてしまっています。case式で特定の条件で絞られたIDの配列を返した後、COUNT DISTINCT を用いることで重複排除したカウントが行えます。

WHERE句を使えば同じ事が実現出来ますが、SELECT文で上記のカウントを行いたい場合に有効です。
Net-snmpをIPv6に対応させる


普通にインストールして起動させるとIPv4しかListenしていない。

```
# netstat -unlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
udp        0      0 0.0.0.0:161             0.0.0.0:*                           32496/snmpd
```

### これをこう

```snmpd.conf
agentaddress udp:161
agentaddress udp6:161
com2sec notConfigUser   localhost  public
com2sec6 notConfigUser   localhost  public
````
上の2行がListenするポートの指定。udp6でもListenさせる。
3行目はもともと設定しているセキュリティ名。
これに6をつけてもうひとつ定義してあげる。
当然だがこれだけだと別の監視サーバからは接続できないので適宜設定しよう。

### 再起動する

```
# /etc/init.d/snmpd reload
 * Reloading network management services:
# netstat -unlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
udp        0      0 0.0.0.0:161             0.0.0.0:*                           30620/snmpd
udp6       0      0 :::161                  :::*                                30620/snmpd
```

完。
gitサーバの構築とクライアントの設定


さくらVPSを利用中で、プライベートgitリポジトリを作成した時のメモ。
個人利用するので、sshを使ってリポジトリを利用する。

##gitサーバの構築
VPSサーバ上でリポジトリを作成。

```sh
# cd [リポジトリ作成ディレクトリ]
# git --bare init --shared
```

###bareオプション

bareオプションを指定することで、作業ファイルがない、管理情報だけのリポジトリが作成できる。
サーバで直接ファイルの更新を行わないので、bareオプションをつけておく。
bareリポジトリには、.gitをつけるのが風習となっている。
@see: http://git-scm.com/book/ja/Git-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E7%94%A8%E3%81%AE-Git-%E3%81%AE%E5%8F%96%E5%BE%97


###sharedオプション
リポジトリに対するグループ書き込みパーミッションが自動で追加される。


##localでの作業

```sh
$ cd [リポジトリ作成ディレクトリ]
$ git init
$ git add .
$ git commit -m "hogehoge"
$ git remote add origin ssh://[username@hostname]/[リポジトリパス]
$ git push origin master
```