OmniAICreator/Qiita-1.07M huggingface dataset:
Rails4でActive Adminと Carrierwaveを使って管理画面を作った時にみたサイトまとめ

Github
https://github.com/gregbell/active_admin

Active Admin 公式　カスタマイズはここでほぼわかる。けど英語
http://www.activeadmin.info/ 

Official Docs
https://github.com/gregbell/active_admin/tree/master/docs

Active Admin Google Group　登録すると更新メールがすごい
https://groups.google.com/forum/#!forum/activeadmin

ActiveAdminで管理画面をつくるための10のテクニック
http://shakezoomer.com/?p=558

Railsの管理画面を最短時間でつくろう！はじめに見るサイト
http://morizyun.github.io/blog/active-admin-gem-rails/

なんでGemはいらないの？って時に。依存関係でいれられないから下記をみてgithubからgemを持ってきた。
http://zakihaya.hatenablog.com/entry/2013/12/30/200328

導入にみる。すごく丁寧。
http://namakesugi.blog42.fc2.com/blog-entry-100.html

carrierwave
https://github.com/carrierwaveuploader/carrierwave

Railsでcarrier waveを使ってファイルのアップロード
http://www.geekzshu.com/rails/1587

carrirwave 画像アップローダ
Viewの編集
http://www.workabroad.jp/tech/1118

active admin show画面 参考コード
http://shakezoomer.com/?p=558

herokuでの画像アップロード問題
https://github.com/carrierwaveuploader/carrierwave/wiki/How-to%3A-Make-Carrierwave-work-on-Heroku

Showing an uploaded image in the form. showページでの画像アップロード
https://github.com/gregbell/active_admin/wiki/Showing-an-uploaded-image-in-the-form

SystemStackError stack level too deep これやばい。これがなければうごかなかった。
http://qiita.com/eleven_2012/items/eb4099555358b770915b

各ページの日本語化
http://wanna-be-geek.seesaa.net/article/309432110.html
config/locales/ja.yml を利用して読み込みさせた

リスト内の通貨、％指定表示指定
http://blog.mudaimemo.com/2008/08/ruby-on-rails-view.html

CSVアップロード gem 'active_admin_importable'
https://github.com/krhorst/active_admin_importable

ログイン、ログアウト時のDeviseの翻訳エラー修正 
http://stackoverflow.com/questions/11620767/devise-translation-missing-error-with-subclassed-controller

デフォルトをダッシュボードじゃなくて任意のページにする設定
http://stackoverflow.com/questions/17597219/rails-activeadmin-remove-dashboard-page

Createのボタンテキストを変更する方法
http://stackoverflow.com/questions/23536381/how-to-rename-button-new-in-index-active-admin-rails

「sqale ＋ cloudinary ＝ 無料で画像アップもできるRailsアプリ用の環境完成
http://goo.gl/8ixVe0
PHPで現在アクセスされているページのURLを取得する

PHPで現在アクセスされているページのURLを取得する
==========


■about
----------

PHPで現在アクセスされているページのURLを取得する




■code
----------

### 現在のページ自体

```php:php
echo $_SERVER["REQUEST_URI"];
```

### ホスト名も取得する場合

```php:php
echo $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
```

### プロトコルも取得する場合

```php:php
echo (empty($_SERVER["HTTPS"]) ? "http://" : "https://") . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
```



■reference
----------

PHPで現在アクセスされているページのURLを取得する - hoge256ブログ
http://www.hoge256.net/2010/06/519.html

$_SERVER変数｜PHP情報｜株式会社エン・PCサービス
http://www.en-pc.jp/php_server.php

$_SERVER
http://www.php.net//manual/ja/reserved.variables.server.php
【参考】初めてErlangをする人用 #Erlang

# 概要
チームの新人等、初めてErlangを学習する人のために、参考になる書籍とWebサイトURLをまとめた。

# Webサイト
## 公式ドキュメント
* http://www.erlang.org/doc/index.html
* **関数の仕様を確かめる** ために使う
* 英語で書かれている
* 英語力がない筆者でも読めるレベル
* とりあえずここを見ておけば問題がない

## learn you some Erlang for great good!
* http://www.ymotongpoo.com/works/lyse-ja/
* **参考書がわり** に使う
* 元々英語のページを訳したもの
* ~~以降で取り上げる **書籍よりも内容が濃い**~~
* ~~書籍化される（2014/7/4発売）~~
    * ~~http://www.amazon.co.jp/%E3%81%99%E3%81%94%E3%81%84Erlang%E3%82%86%E3%81%8B%E3%81%84%E3%81%AB%E5%AD%A6%E3%81%BC%E3%81%86-Fred-Hebert/dp/4274069125~~
        * ~~amazonでは7/26発売になっている？~~
* 書籍化された。詳しくは 「書籍」 の項目で記す

## コトハジメ
* https://gist.github.com/voluntas/7278561
* **実際に実装する時に必要なノウハウ** がまとめられている
* 更新頻度が高いので **新しい情報** も多い
    * Map コトハジメ
        * https://gist.github.com/voluntas/7218024

# 書籍
## 日本語

### 概要

**すごいEralngゆかいに学ぼう!** が1番新しくて文章的にも読みやすいと思われる。内容も濃い。ただし、内容が濃い分、読むのに時間が掛かる。周りで、「 *1番最初に読む本としては、* **プログラミングErlang** の方が読みやすい」という意見も聞く。Erlangプログラミングはまだ読んだことがない。

### プログラミングErlang

[<img src="http://ecx.images-amazon.com/images/I/51bZh24YhqL._SX258_BO1,204,203,200_.jpg" width="150">](http://www.amazon.co.jp/dp/4274067149)

[プログラミングErlang | amazonページ](http://www.amazon.co.jp/dp/4274067149)

* 英語版だけ、第2版が出ており、こちらの内容はかなり新しい（Mapに対する記述がある…らしい）
    * [Programming Erlang | amazonページ](http://www.amazon.co.jp/dp/193778553X)

[<img src="http://ecx.images-amazon.com/images/I/41aFhM1lHiL._SX258_BO1,204,203,200_.jpg" width="150">](http://www.amazon.co.jp/dp/193778553X)

### Erlangプログラミング

[<img src="http://ecx.images-amazon.com/images/I/51TTb51tU9L._SX258_BO1,204,203,200_.jpg" width="150">](http://www.amazon.co.jp/dp/4873114659)

[Erlangプログラミング | amazonページ](http://www.amazon.co.jp/dp/4873114659)

### すごいErlangゆかいに学ぼう!

1番新しい日本語のErlang本。内容もだいぶ詳しく読みやすい。ただ、内容が詳しい分、量が多くて読むのに時間が掛かる。

[<img src="http://ecx.images-amazon.com/images/I/51lkQxVnXXL._SY344_BO1,204,203,200_.jpg" width="150">](http://www.amazon.co.jp/dp/4274069125)

[すごいErlangゆかいに学ぼう! | amazonページ](http://www.amazon.co.jp/dp/4274069125)

## 英語
TODO
wordpress、Contact Form 7、プレースホルダーテキストを設定する

wordpress、Contact Form 7、プレースホルダーテキストを設定する
==========


■about
----------

wordpress、Contact Form 7、プレースホルダーテキストを設定する




■code
----------
### 記述場所
/プラグイン/Contact Form 7/設定/プロジェクト/フォーム

```php:
[text your-name placeholder "Your name here"]
```




■reference
----------

プレースホルダーテキストを設定する | Contact Form 7 [Japanese]
http://contactform7.com/ja/setting-placeholder-text/
著名なスピーチ


普段 Qiita にアップロードされるものとは違うかもしれませんが気分転換にどうぞ。

# Twitter CEO - Dick Costolo
## Dick Costolo Commencement Speech - University of Michigan

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/Atcky5LgjuY/0.jpg)](http://www.youtube.com/watch?v= Atcky5LgjuY)

http://logmi.jp/9226

# Apple Founder - Steve Jobs
## Commencement address Stanford 2005

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/XQB3H6I8t_4/0.jpg)](http://www.youtube.com/watch?v=XQB3H6I8t_4)

http://www.nikkei.com/article/DGXZZO35455660Y1A001C1000000/

# Dropbox CEO - Drew Houston
## Commencement Address MIT 2013

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/6inri5ggyK4/0.jpg)](http://www.youtube.com/watch?v=6inri5ggyK4)

http://logmi.jp/8845

# Bill and Melinda Gates

## Bill and Melinda Gates' 2014 Stanford Commencement Address

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/wug9n5Atk8c/0.jpg)](http://www.youtube.com/watch?v=wug9n5Atk8c)
peco-docker を作ってみました

[Pecrant](https://github.com/gongo/pecrant) にインスパイアされて、[Docker](http://www.docker.com/) でも [peco](https://github.com/peco/peco) を使いたいと思い、
peco-docker スクリプトを作ってみました。

[YungSang/peco-docker](https://github.com/YungSang/peco-docker)

大別して、
1. `docker search <term> | peco` を使った検索系
2. `docker images | peco` を使ったイメージ操作系
3. `docker ps | peco` を使ったコンテナ操作系
があります。

インストールは、
1. https://github.com/YungSang/peco-docker/releases/latest から `peco-docker` をダウンロードして、
2. `chmod +x peco-docker` で実行可能にし、
3. `$PATH` の通ったディレクトリに配置するだけ。
もちろん、peco、docker は既にインストールされていることが前提です。

私は例によって今回も `alias deco="peco-docker"` で `deco` として使ってますw

```
Usage: peco-docker <command> [OPTIONS]

command:
  search          Search Docker images in the Docker registry
  pull            Search Docker images and download the selected images

  images [-a]     List the selected images in your Docker host ($DOCKER_HOST)
  tag             Tag the FIRST selected image
  push            Push the selected images to the Docker registry
  save > <tar>    Export the FIRST selected image
  rmi [-f]        Remove the selected images
  inspecti [-f]   Show low-level information on the selected images
  history         Show the history of the selected images

  ps [-a]         List the selected containers in your Docker host ($DOCKER_HOST)
  attach          Attach to the FIRST selected running container
  commit [tag]    Create a new image from the FIRST selected running container
  diff            Inspect changes on the FIRST selected container's filesystem
  export > <tar>  Export the contents of the FIRST selected container's filesystem
  start           Start the selected stopped containers
  restart         Restart the selected running containers
  stop            Stop the selected running containers
  kill            Kill the selected running containers
  rm [-f]         Remove the selected containers
  inspect [-f]    Show low-level information on the selected containers
  top             Lookup the processes of the selected running containers
  logs            Fetch the logs of the FIRST selected container

  version         Show the version of peco-docker
  help            Show this message
```
sftpでChrootを利用してOSの大事な所を参照できないようにする設定

#sftpは信頼性の高いファイル転送プロトコルですよね

　FTPSはギガバイトクラスのファイルを転送するとほぼファイルが壊れてしまう。だったらSFTPを使えば良いじゃない。
　だけどデフォルトの設定だとサーバー内のディレクトリが丸見えだし、sshでシェルにログインもできちゃうしこれは良くない！
　なのでOpenSSHの4.9以降から搭載されたChrootの機能を利用してルートのディレクトリを指定してしまおう。

#せっかくだからFTPSっぽく使えるsftpのみの設定を書くよ

* SFTPのみのグループを作成する。ここではsftponly

* SFTPだけにしたいユーザをsftponlyグリープに追加する。

* 共有したいディレクトリを作る。ここでは/media/hdd3tb/share　。その後、オーナー:グループをroot:rootにし、パーミッションを755にする。

* /etc/ssh/sshd_configの設定
元あるsshd_configに追記して保存。

```/etc/ssh/sshd_config
Match Group sftponly
 ChrootDirectory /media/hdd3tb/share 
 ForceCommand internal-sftp -u 002
 AllowTcpForwarding no
 X11Forwarding no
```

* sshdを再起動する。


* 凡ミスが無いかチェックして終了。
EmacsLispでデフォルト値が取れる処理の書き方

Emacs Lispでデフォルト値を有効にする方法がわからなかったのでメモしておく。

デフォルト値付きの関数を`&optional`を使って定義してみる。`&optional`は省略できる引数を定義するためのキーワードになる。例としてはこんな感じのやつ。

```cl
(defun add (&optional (x 2) (y 2))
  (+ x y))
```

ここで`(add 1 1)`を評価すると

```
Debugger entered--Lisp error: (invalid-function (lambda (&optional (x 2) (y 2)) (+ x y)))
  add1(2 3)
  eval((add1 2 3) nil)
  eval-expression((add1 2 3) nil)
  call-interactively(eval-expression nil nil)
```

エラーになる。

[他の人のコード](https://bitbucket.org/phromo/darkroom-mode/src/tip/frame-local-vars.el)を見てたときに、`defun*`を使うとデフォルト値付きで定義することができていた。なので`defun*`を使ってみる。

```cl
(require 'cl)
(defun* add (&optional (x 2) (y 2))
  (+ x y))
```

さてこのコードを実行してみる。

```
(add)
;=> 4
(add 10)
;=> 12
(add 10 20)
;=> 30
```

うまく実行できていることがわかると思う。

この`defun*`は引数部分に書かれたコードの評価ができる関数になる。`let*`と同じ系統の関数になる。

できれば最初から評価ができるようにしてほしいんだけど、どういう歴史的経緯でこうなってるのか。そこはいつか機会があればしらべる。
AngularJS の custom directive まとめ

## directiveとは
* htmlには無い振る舞いを持つ要素を埋め込むことが出来る
 * 例: ng-repeat, ng-model, ng-if などなど
* 特にDOMを操作したい時に便利
* コードを部品ごとに分割できる

### custom directive
* 自分が定義した振る舞いを持つ要素を埋め込むことが出来る
 * たとえばドラッグできる要素を作ったりとか


## custom directiveを作ってみる

### 単純な custom directive
したい処理を以下の形で書いていく。

```js
myModule.directive('sayhogeDirective', function() {
  return function(scope, element, attrs, controller) {
    // メイン処理
    var c = parseInt(attrs["sayhoge-directive"], 10);
    while(c--) {
      console.log("hoge");
    }
  };
});
```

```html
<button sayhoge-directive="10">test</button>
```

※ 補足 module

* パーツの依存関係読み込み
* 起動時の初期化処理

を書くための仕組み

### こうに書くことも出来る

link メソッドをreturnしても、上の記述と同様の意味になる。

```js
myModule.directive('directiveName', function() {
  return {
    link: function(scope, element, attrs, controller) {
      // メイン処理
    }
  };
});
```

directive にはlink等のプロパティ(やメソッド)を指定できる。
以下にそれらを紹介する。

## custom directive に指定できるプロパティ

#### restrict
directiveを、どんな形でhtmlに埋め込むか指定する。
デフォルトは属性名。

* E: 要素 `<directive-name title=Products></directive-name>`  
* C: クラス `<div class=directive-name></div>`
* M: コメント `< !— directive: directive-name Products —>`
* A: 属性 `<div directive-name=Products></div>`

(※ Eは、ブラウザによってはエラーになるので注意)
複数指定可能らしい。EAとか。

#### link
* function(){}を与えて、メイン処理を記述する
* 受け取れる引数は`function(scope, element, attrs, controller){}`

#### compile
* function(){}を与えて、メイン処理を記述する
* linkとの違い
 * scope生成前に実行される
 * 実行回数がng-repeat内でも一度だけ
 * つまり、無駄を省くために使うっぽい

#### scope
* directiveが使うscopeの設定
1. `scope: false` derectiveがある場所のscopeを使う
2. `scope: true`  directiveがある場所のscopeを継承して作られた、新しいscopeを使う
3. `scope: {...}` 独自のscopeを使う

##### "3.独自のscope" の記法

以下の3種類ある。

```js
scope: {
  name: '@', // interpolate（値、string）
  info: '=', // data bind
  cancel: '&' // expression（function）
}
```

* `@(attr)` 属性値を文字列として渡す。{{...}}を使うと、データバインディングする
* `=(attr)` このプロパティとディレクティブにとっての親の$scopeとの間でデータバインディングを行う
 * `=?(attr)` もし親プロパティにattrが存在しなくても、エラーにならない。
* `&(attr)` 関数を親の$scopeから渡す

`(attr)`の部分に文字列を書くと、directiveを使用する側ではscopeのプロパティ名としてその文字列が使える。

#### require
directiveが必要とするコントローラーを指定する
`directiveName:` 普通。
`^directiveName:` 祖先の要素も検索
`?directiveName:` このコントローラがなくても例外が発生しない

### 参考

####
* http://angularjsninja.com/blog/2013/11/20/angularjs-custom-directives/

#### scope関連
* https://docs.angularjs.org/api/ng/service/$compile
* http://stackoverflow.com/questions/20447786/whats-the-meaning-of-in-angularjs-directive-isolate-scope-declaration
* http://stackoverflow.com/questions/12371159/how-to-get-evaluated-attributes-inside-a-custom-directive
C#:Regex:JSONヒアドキュメント




テストコードとかでJSONを埋め込むときとかの対応。　
"_" というラムダを定義して各行のホワイトスペースを抜く。
   
```csharp

    using System;
    using NUnit.Framework;
    using System.Text.RegularExpressions;
    using System.Collections.Generic;
    using System.Linq;
    using System.Linq.Expressions;
```
    
    
```csharp

    namespace ConnectTestIos
    {
    	public class JweAppendixA1 
    	{
    		public static string _re_sp = @"^(\s+)?(.+\S)?(\s+)?$";
    		public static Func<string, string> _ = src => 
    			string.Join("", src.Split('\n').Select(i=> Regex.Replace(i, _re_sp,"$2")));
    
    		public string _jwkstr = _(@"
         {""kty"" : ""RSA"",
          ""n"":""oahUIoWw0K0usKNuOR6H4wkf4oBUXHTxRvgb48E-BVvxkeDNjbC4he8rUW
               cJoZmds2h7M70imEVhRU5djINXtqllXI4DFqcI1DgjT9LewND8MW2Krf3S
               psk_ZkoFnilakGygTwpZ3uesH-PFABNIUYpOiN15dsQRkgr0vEhxN92i2a
               sbOenSZeyaxziK72UwxrrKoExv6kc5twXTq4h-QChLOln0_mtUZwfsRaMS
               tPs6mS6XrgxnxbWhojf663tuEQueGC-FCMfra36C9knDFGzKsNa7LZK2dj
    			YgyD3JR_MB_4NUJW_TqOQtwHYbxevoJArm-L5StowjzGy-_bq6Gw"",
    		""e"":""AQAB"",
    		""d"":""kLdtIj6GbDks_ApCSTYQtelcNttlKiOyPzMrXHeI-yk1F7-kpDxY4-WY5N
               WV5KntaEeXS1j82E375xxhWMHXyvjYecPT9fpwR_M9gV8n9Hrh2anTpTD9
               3Dt62ypW3yDsJzBnTnrYu1iwWRgBKrEYY46qAZIrA2xAwnm2X7uGR1hghk        
               qDp0Vqj3kbSCz1XyfCs6_LehBwtxHIyh8Ripy40p24moOAbgxVw3rxT_vl
               t3UVe4WO3JkJOzlpUf-KTVI2Ptgm-dARxTEtE-id-4OJr0h-K-VFs3VSnd
    		VTIznSxfyrj8ILL6MG_Uv8YAu7VILSB3lOW085-4qE3DzgrTjgyQ""
         }");
         
         public Jose.Jwk PrivateJwk {
    			get{
    				return Jose.Jwk.FromJson (_jwkstr);
    			}
    	 }	
       }
    }
 
```
VMware Fusion で VMXNET3 を使う

## vmware-tools のツリーから binary を削除する

VMwareTools-x.x.x-xxxxxxx.tar.gz を /tmp 以下に展開した場合、
`rm -rf /tmp/vmware-tools-distrib/lib/modules/binary`
ビルド済みのドライバー（カーネルモジュール）を削除しておけば、vmware-toolsのインストール時に勝手に make し直します。

## vmxnet3 を指定してインストール

`perl vmware-install.pl --clobber-kernel-modules=vmxnet3`
あとは通常通りに自分の方法でインストールを進める。

## 仮想マシンの設定ファイル *.vmx ファイルの編集をする

VMware Fusion の仮想マシン設定ファイル *.vmx 内のethernetデバイスを vmxnet3 に変更する。

<pre>
ethernet0.virtualDev = "vmxnet3"
</pre>

マシン再起動すれば NICドライバが vmxnet3 で認識出来る。

## 番外

* ゲストOS内で vmxnet3 が使われているか確認する方法
 * `lspci`コマンドでPCIバスでロードされているドライバを確認できる

## 参照

* [How do I specify Network Adapter to be vmxnet3 in Fusion?|VMware Communities](https://communities.vmware.com/thread/463728)
[小ネタ]pecoでbundler管理下にあるgemのディレクトリに移動する

[peco/peco](https://github.com/peco/peco "peco/peco")のwikiにそれっぽいのが書いてあるのだが、例みたいに別のコマンド作って噛まさなくてもzshだけで行けそうだったので、自分なりに設定書いてみた。

```zsh
function cdgem() {
  local gem_name=$(bundle list | sed -e 's/^ *\* *//g' | peco | cut -d \  -f 1)
  if [ -n "$gem_name" ]; then
    local gem_dir=$(bundle show ${gem_name})
    echo "cd to ${gem_dir}"
    cd ${gem_dir}
  fi
}
```

動作イメージ
http://quick.as/lxxjhxx6
Goで固定長データを取り扱った話


自分がメンテナンスしている昔からあるperlスクリプトがデータの料が増えて処理にかなり時間がかかって体感的に遅いと感じるようになってきた。  
そのスクリプトは標準ライブラリ程度にしか依存していなかったのでGoで書きなおしてみようかと思ってやってみた。

扱うデータのヘッダー部分が16進数の固定長データでperlではunpackして解析していた。 Goでunpackってどうやるの？ってなってその時の対応の備忘録。


Perlのpack/unpackについてはこの記事を参照。
[perlpacktut - pack と unpack のチュートリアル - perldoc.jp](http://perldoc.jp/docs/perl/5.8.8/perlpacktut.pod "perlpacktut - pack と unpack のチュートリアル - perldoc.jp")

```
    while (<>) { 
        my($date, $desc, $income, $expend) = unpack("A10xA27xA7A*", $_);
        ...
    }
```

Goで16進数の固定長データをどう扱ったかというと基本は strconv.ParseUintと hex.DecodeStringだけで問題なかった。

先頭からN byteまとめて10進数に変換するならこう。

```
	s := "ABCDEF"
	ui, _ := strconv.ParseUint(s[:2], 16, 0)
	fmt.Printf("%#V\n", ui)  // %!V(uint64=2748)
```

逆に、2byteずつ変換するならこんな感じ。

```
	s := "ABCDEF"
	bytea, _ := hex.DecodeString(s[0:6])
    fmt.Printf("%#V\n", bytea)  // %!V([]uint8=[171 205 239])
```

これで16進数の固定長のデータが大体変換できるだろう。
strconv.ParseUint の第2引数で8進数でも2進数でも変換は可能となる万能な関数。
個人的に16進数で日付データとか持たせていてそれをデコードして出来たuint8のbyte配列に対してmapで文字列に変換したいと思ったんだけどいい実装が無かったので泥臭くPrintfで処理した。
mapのような関数型なプログラミングが恋しい。


``` go
package main

import "fmt"
import "strconv"
import "encoding/hex"

func main() {
	s := "ABCDEF"

	// Nbyteまとめて変換するならこう
	bytea, _ := hex.DecodeString(s[0:6])
	fmt.Printf("%#V\n", bytea)

	// 先頭から2byteずつ変換するならこう
	ui, _ := strconv.ParseUint(s[:2], 16, 0)
	fmt.Printf("%#V\n", ui)

}

```
Vim起動時に複数のファイルを開く

一度ぐらいは投稿したかったので試しに
何番煎じだよ！なんていわないで...

# 複数ファイルを起動
```
#vim file1 file2 ...

```
vimの後にファイル名をつなげるだけです。
Linuxなどを使用しているなら

```
#vim `find ./ -name "*.html"`
```
などすると編集したいファイルを一気に開けちゃったりします
すごく...便利です...

# ファイルの移動
コマンドラインモード時に

```
 :n
```
で次ファイルへと遷移します。

```
 :N
```
で前ファイルへと遷移します。

# 起動ファイルの確認
コマンドラインモード時に

```
:file
```
とすることで開いているファイルの一覧が表示されます。
nginx の設定で気をつける事（個人用メモ）

# default_server

### 使用例
```nginx.conf
server {
    listen       80 default_server; # ←こいつ
    server_name  example.org  www.example.org;
    ...
}
```

### 解説
http://nginx.org/ja/docs/http/request_processing.html

> もし “Host” ヘッダがどのサーバ名ともマッチしない場合、またはリクエストにこのフィールドがまったく含まれていない場合は、nginxはこのリクエストをデフォルトサーバに振り向けます。上記の設定ではデフォルトサーバは最初のもので、これは nginx の標準的なデフォルトの挙動です。設定内の最初のサーバをデフォルトサーバにしたくない場合は、listen ディレクティブに default_server パラメータを使って明示的に設定することができます:

`server_name` が `host` と一致しない場合は、 **一番最初に**読み込まれた設定を使用。
嫌な場合は `default_server` と記述する。

### 補足

例えば ELB にぶら下がっている EC2 は、ELB から 毎秒(？) `/alive` へのアクセスが来る。
この際に叩かれる `host` はプライベートDNS を使われる。 `e.g. ip-172-31-1-234`
そのため、 `default_server` の設定をキチンとしておかないと、 `/alive` へのアクセスが 200 で返らず ELB に `OutOfService` と解釈される。

# server_tokens

### 使用例
```nginx.conf
http {
    access_log    /var/log/nginx/access.log;

    server_tokens off;　# ←こいつ
    ...
}
```

### 解説

`http` , `server` or `location` のいずれかに記述。
nginx のバージョンや使用している OS を隠蔽したい時に使える。


### 参考

http://www.nginxtips.com/how-to-hide-nginx-version/

# log directory の permission

ログを格納するディレクトリの権限を `755` にしておく必要がある。

```bash
$ ls -la /var/log/
..
drwxr-xr-x  2 www-data  adm         4096 Jul 12 06:38 nginx/
..
```

これはログローテーション時にアクセスログ/エラーログを開き直すために必要。

# 発見があり次第追記します。
Debian Wheezy にPlaggerをインストール

現役で使っているが、昔なつかしいPlaggerをインストールする。
動けば良しの体で行うので、余計なパッケージが入っても気にしない。

```bash
apt-get install unzip tar build-essential
cpan
intall Bundle::CPAN
exit(cpanから抜ける)
apt-get install libxml*
apt-get install libssl*
cpan
install Plagger
```

コンパイルに失敗したので、` reports MIYAGAWA/Plagger-0.7.17.tar.gz`
でエラーを参照。

```bash
Distribution: M/MI/MIYAGAWA/Plagger-0.7.17.tar.gz
CPAN::DistnameInfo not installed; cannot continue
```
CPAN::DistnameInfoが足りないので、インストール
```install CPAN::DistnameInfo```
改めて`install Plagger`すると、
「 XML/Feed/RSS.pmがない」といわれるのでインストール
```install XML::Feed::RSS```
makeには成功するが、testに失敗。
強制インストール
```force install XML::Feed::RSS```
これで`install Plagger`すると成功する。
Unityメモ1 モバイル キーボードから文字列を入力する(Android)

# 編集可能なGUI要素をタップしたとき自動表示される場合

```csharp:InputNameTextField.cs
public class InputNameTextField : MonoBehaviour {

    const int MAX_LENGTH = 4;
    string inputtedName = "Name";

    void OnGUI()
    {
        this.inputtedName = GUI.TextField(new Rect(Screen.width / 2 - 50, Screen.height * 1 / 3, 100, 20), this.inputtedName, MAX_LENGTH);
    }
}

```


# 手動でキーボードを表示させて入力する場合
```csharp:InputName.cs
public class InputName.cs: MonoBehaviour {

    TouchScreenKeyboard keyboard;
    string inputtedName = "Name";
　　
    // アタッチしているGameObjectに子オブジェクトとしてGUITextを作成している
    Transform nameText; 

	void Start () 
    {
        // GUITextを見つける
        this.nameText = gameObject.transform.Find("NameText");

        // キーボードを表示する
        this.keyboard = TouchScreenKeyboard.Open(this.inputtedName, TouchScreenKeyboardType.Default);
	}
	
    void Update()
    {
        if (this.keyboard.done)  // キーボードが閉じた時
        {
            this.inputtedName = this.keyboard.text;
            this.nameText.guiText.text = this.inputtedName;
        }
    }
}
```
nginx + jenkins でユーザログインを設定→アクセスできなくなった

nginx + ubuntu に jenkins をインストール。
したまでは良かったが、ユーザログインを有効にしようとした際にハマったのでメモ。

# ログイン認証をかけてみた
「jenkins ユーザ作成」でググってひっかかった記事を参考に設定をしてみる。
http://blog.ybbo.net/2014/01/11/centos-%E3%81%AB-jenkins%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%83%BB%E3%83%9D%E3%83%BC%E3%83%88%E3%81%A8url%E3%81%AE%E5%A4%89%E6%9B%B4%E3%83%BB%E3%83%A6%E3%83%BC%E3%82%B6/

> 左メニュー > Jenkinsの管理 > グローバルセキュリティの設定
> 「セキュリティを有効化」にチェック

書いてある通りにチェックボックスやラジオボタンを選択し、「保存」をクリック。

ところが。

# アクセスできなくなった
「保存」した瞬間、基本認証をきかれた。
が、設定していた ID/PASS を入力しても、再度基本認証をきかれる。
再度入力し直しても、また聞かれる。。。

にっちもさっちもいかなくなったので Google先生にすがる。
と、公式 Wiki に以下の記載が！
https://wiki.jenkins-ci.org/display/JA/Disable+security

ログインできないのではどうしようもないので、一旦現状復帰を目指す。
早速やってみる。

```
$ cd $JENKINS_HOME
$ sudo vi config.xml
```

以下のように修正。

```config.xml
...
<useSecurity>true</useSecurity>
...
↓
...
<useSecurity>false</useSecurity>
...
```

```
$ sudo service jenkins restart
```

何とか復活。

# 基本認証の設定間違えた？
その後、基本認証を外して同じ設定をしてみた所、問題なくユーザのログイン画面が表示。
``useSecurity`` を `false` にして、再度基本認証かけなおしたら、ちゃんと ID/PASS が通る。

むむむ。
どうやら ``useSecurity`` が `true` だと基本認証のループにハマる模様。
そしてこれは「jenkins管理」 > 「グローバルセキュリティの設定」> 「セキュリティを有効化」をチェックで `true` になる模様。

これチェック入れないとユーザ作成出来ないじゃん。どうすりゃいいの。

# 解決方法

どうやら nginx 側の設定が漏れていたようだ。

http://dev.classmethod.jp/tool/jenkins/jenkins_ssl_and_basic_auth/

> 最後の行にある「proxy_set_header」を忘れないようにします。この記述を忘れるとAuthorizationヘッダがJenkins本体まで通知されてしまい、NginxのBasic認証は通るがJenkinsが401を返すという理不尽な状況に嵌まります

なるほど。Jenkins おじさんに認証が必要だと間違って伝わっていた訳ですね。

という訳で以下のように修正。

```nginx.conf
location / {
  auth_basic "Basic Auth";
  auth_basic_user_file "/etc/nginx/.htpasswd";
  ...
  proxy_set_header Authorization ""; # この一行を追加
}
```

``$ sudo service nginx restart`` でめでたし。
RubyでMeCabを使う


## CentOSにMeCabをインストール

まずは、MeCabをインストールする。

```
$ sudo yum install mecab mecab-ipadic 
No package mecab available.
No package mecab-ipadic available.
```
できない、どうやらレポジトリを追加する必要があるらしい。

### Groongaレポジトリ追加
```
$ sudo rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm
```

### mecab本体と辞書ファイルをインストール
```
$ sudo yum install mecab mecab-ipadic 
```

### 確認
```
$ mecab --version
mecab of 0.996

$ mecab
すもももももももものうち
すもも	名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
うち	名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS
```

## nattoからMeCabをよぶ

### nattoをインストール
```
$ gem install natto
```

### rubyファイルを書いて実行
``` ruby
require 'natto'

text = 'すもももももももものうち'
nm = Natto::MeCab.new
nm.parse(text) do |n|
  puts "#{n.surface}\t#{n.feature}"
end
```

```
$ ruby natto.rb
~/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/ffi-1.9.3/lib/ffi/library.rb:133:in `block in ffi_lib': Could not open library 'mecab': /usr/lib/mecab: cannot read file data: Is a directory. (LoadError)
Could not open library 'libmecab.so': libmecab.so: cannot open shared object file: No such file or directory
```
よく分からんが、libmecab.soが必要で、ちゃんと読み込めていない。

### libmecab.soの場所を探す
```
$ sudo find / -name libmecab.so*
/usr/lib/libmecab.so.2
/usr/lib/libmecab.so.2.0.0
```

### libmecab.soにパスを通す
```
$ echo 'export MECAB_PATH=/usr/lib/libmecab.so.2' >> ~/.bash_profile
$ source ~/.bash_profile
```

### 再度実行する
```
$ ruby natto.rb
すもも	名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
うち	名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
	BOS/EOS,*,*,*,*,*,*,*,*
```
できた！


## 参考URL
- http://groonga.org/ja/docs/install/centos.html
- http://konyu.hatenablog.com/entry/2014/02/08/223053
Twitter4Jで複数の画像をアップロードしてツイートする方法

[CoreTweetの某wikiページ](https://github.com/CoreTweet/CoreTweet/wiki/%E8%A4%87%E6%95%B0%E3%81%AE%E7%94%BB%E5%83%8F%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%81%97%E3%81%A6%E3%83%84%E3%82%A4%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95) の Twitter4J 版です。

Twitter4J は 5 月末に公開された複数画像投稿及びそのエンティティのパースにいち早く対応しました。

詳しくはこちらを参照してください: [Multiple Media Entities in Statuses | Twitter Developers](https://dev.twitter.com/docs/api/multiple-media-extended-entities)

#複数の画像をアップロードしてツイートする

まずは添付したい画像をアップロードしていきます。アップロードには Twitter.uploadMedia を使用します。

```java
UploadedMedia media1 = twitter.uploadMedia(new File(path1));
UploadedMedia media2 = twitter.uploadMedia(new File(path2));
```

画像のアップロードが完了したら、あとはツイートするだけです。なお、アップロードが完了してから 1 時間以内にツイートしないと Twitter 上から削除されてしまうので注意して下さい。

```java
StatusUpdate update = new StatusUpdate("Multiple World!");
update.setMediaIds(new long[2]{media1.getMediaId(), media2.getMediaId()});
Status status = twitter.updateStatus(update);
```

setMediaIds() のパラメータに long 配列を指定すると画像とツイートが関連付けられ、晴れて複数画像投稿ができました！
この方法で 1 - 28<a href="#1">(#1)</a> 枚の画像を添付することができます。

詳しくは[リポジトリのexamples](https://github.com/yusuke/twitter4j/blob/master/twitter4j-examples/src/main/java/twitter4j/examples/tweets/UploadMultipleImages.java)を見てください。

<a name="1">#1</a>: 確かに [ここ](https://dev.twitter.com/docs/api/multiple-media-extended-entities) には "up to a maximum of 28" と書いてあるんですが実際には5枚以上は拒否されたという情報もあります。公式アプリやWeb版Twitterが4枚までしか添付できないのできっとドキュメントが間違ってるのでしょう。


#複数の画像が添付されたツイートを処理する

1つだけ画像が添付されているツイートは、今まで通り status.getMediaEntities で画像の情報を取得することができます。

複数の画像が添付されている場合は、status.getMediaEntities に加え、status.getExtendedMediaEntities に MediaEntity の配列が入っています。
つまり、status.getExtendedMediaEntities の配列の要素数が2以上かどうかで、画像が複数添付されているかどうかが判別できます。

※画像が1枚だけ添付されている場合でも status.getExtendedMediaEntities が設定される場合があるので注意してください。


#Twitter4Jのどのバージョンを使えばいいの？

EntitiySupport#getExtendedMediaEntities と Twitter#uploadMedia は Twitter4J 4.0.2 からサポート ~~されるようです~~ されました。Twitter4J 4.0.2 以降をお使いください。

~~2014/6/23現在は SNAPSHOT 版で対応されていますが複数画像が投稿できないバグがあるので、パッチがマージされるまでは 下記の jar を使ってください。~~

~~https://dl.dropboxusercontent.com/u/166906/twitter4j-core-4.0.2-SNAPSHOT-takke-20140624.zip~~
~~※(2014/6/24) Java SDK 1.5 ビルド版に差し替えました~~
フィボナッチこころぴょんぴょんmagic!

ごちうさが次回で最終回だとか僕は認めないからな。

```go:kokoropyonpyon.go
package main

import "fmt"

func KokoroPyonpyon(n int) string {
	if n < 0 {
		panic("そんなのないよ。ありえない！")	
	}
	switch n {
	case 0:
		return "こころ"
	case 1:
		return "ぴょんぴょん"
	default:
		return KokoroPyonpyon(n - 2) + KokoroPyonpyon(n - 1)
	}
}

func main() {
	fmt.Println(KokoroPyonpyon(30))
}
```

実行結果です。

```console
$ go run kokoropyonpyon.go
こころぴょんぴょんぴょんぴょんこころぴょんぴょんぴょんぴょんこころぴょんぴょんこころぴょんぴょんぴょんぴょんこころぴょんぴょんぴょんぴょんこころぴょんぴょんこころぴょんぴょんぴょんぴょんこころぴょんぴょんこころぴょんぴょんぴょんぴょんこころぴょんぴょんぴょんぴょんこころぴょんぴょんこころぴょんぴょんぴょんぴょんこころぴょんぴょんぴょんぴょんこころぴょんぴょんこころぴょんぴょんぴょんぴょんこころぴょんぴょんこころぴょんぴょんぴょんぴょんこころぴょんぴょんぴょんぴょんこころぴょんぴょんこころぴょんぴょんぴょんぴょんこころぴょんぴょんこころぴょんぴょんぴょんぴょんこころぴょんぴょんぴょんぴょんこころぴょんぴょんこころぴょんぴょんぴょんぴょんこころぴょんぴょんぴょんぴょんこころぴょんぴょんこころぴょんぴょんぴょんぴょんこころぴょんぴょんこころぴょんぴょんぴょんぴょんこころぴょんぴょんぴょんぴょんこころぴょんぴょんこころぴょんぴょんぴょんぴょんこころぴょんぴょん
```

関数`KokoroPyonpyon`に渡す数が大きいと爆発的にこころぴょんぴょんできます。
PHPでLINQ

[Ginq](http://qiita.com/rana_kualu/items/2022739d8559272640bc) / [PHPLinq](http://qiita.com/rana_kualu/items/5f358536b2b7d269a96a)

PHPでLINQを再現するライブラリ、[GINQ](https://github.com/akanehara/ginq)を試してみます。

そもそもLINQって何よ。
http://ja.wikipedia.org/wiki/%E7%B5%B1%E5%90%88%E8%A8%80%E8%AA%9E%E3%82%AF%E3%82%A8%E3%83%AA
> データ集合に対して標準化された方法でデータを問い合わせることを可能にする

http://msdn.microsoft.com/ja-jp/library/bb308959.aspx
> .NET Framework に汎用クエリ機能が追加され、リレーショナル データや XML データだけでなく、あらゆる情報ソースにクエリ機能が適用されます。

何のこっちゃ。
平たく言うと、配列やらオブジェクトやらその他諸々の集合に対してSQL(っぽいもの)でSELECTできちまうぜ、という代物らしい。
さっそく試してみましょう。

```php
<?php
	// Ginq
	require_once('path/to/ginq/Ginq.php');
	
	$sample1 = ['John', 'Peter', 'Joe', 'Patrick', 'Donald', 'Eric', 'Joe'];
	
	// SELECT name FROM sample1 WHERE LENGTH(name) < 5
	$under5 = Ginq::from($sample1)
		->where(function($name){return strlen($name) < 5;})
		->toArray();
	
	// SELECT DISTINCT name FROM sample1 ORDER BY id DESC
	$reverse = Ginq::from($sample1)->reverse()->distinct()->toArray();
	
	// Employee PHPLinqのサンプルのコピペ
	class Employee {
		public $Id, $DepartmentId, $ManagerId, $Name, $Email, $Age;
		public function __construct($id = 0, $departmentId = 0, $managerId = 0, $name = '', $email = '', $age = '') {
			$this->Id				= $id;
			$this->DepartmentId 	= $departmentId;
			$this->ManagerId 		= $managerId;
			$this->Name 			= $name;
			$this->Email 			= $email;
			$this->Age				= $age;
		}
	}
	$employees = [
		new Employee(1, 1, 5, 'Maarten', 'maarten@example.com', 24),
		new Employee(2, 1, 5, 'Paul', 'paul@example.com', 30),
		new Employee(3, 2, 5, 'Bill', 'bill.a@example.com', 29),
		new Employee(4, 3, 5, 'Bill', 'bill.g@example.com', 28),
		new Employee(5, 2, 0, 'Xavier', 'xavier@example.com', 40)
	];
	
	// SELECT Email, SUBSTR(Email, INSTR(Email,'@')+1) FROM employees WHERE LENGTH(Name) = 4 ORDER BY Age DESC LIMIT 2 OFFSET 1
	$result = Ginq::from($employees)
		->where(function($employee){ return strlen($employee->Name) === 4; })
		->orderByDesc(function($employee){ return $employee->Age; })
		->drop(1)->take(2)
		->select(function($employee){ return [
			'EmailAddress' => $employee->Email,
			'Domain' => substr($employee->Email, strpos($employee->Email, "@") + 1)
			]; })
		->toArray();
```

コメントで書かれているSQLとほぼ同じ処理を、メソッドチェーンでSQLっぽく書くことができるようになりました。
SQLそのものではありませんが、同じようなかんじで使えます。
いちいちarray_filter()してforeachで抽出して、といった面倒な処理を書かなくて済みます。

[前回のPHPLinq](http://qiita.com/rana_kualu/items/5f358536b2b7d269a96a)とほぼ同じですが、fromがIteratorに対応しているため、ArrayObjectやSPLなんかも突っ込めます。
また大抵のメソッドがcallableを受け取れるので、文字列で書かなければいけないPHPLinqより楽で汎用性があります。

まあ、[このスライド](http://akanehara.info/phpcon/ginq/)見ればGinqの機能はだいたいわかります。
今回は使ってませんが、集計とかJOINとか他にもたくさん機能があり、また遅延実行にも対応しててパフォーマンスもよさげ。
けっこう使い勝手の良さそうなライブラリです。
mysql 5.7でdb:createするとエラー

MySQL 5.7.4-m14をインストールしてrailsアプリを作成しようとしたらこんなエラーが

```
> rake db:migrate

Mysql2::Error: All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead: CREATE TABLE `tags` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `name` varchar(255), `created_at` datetime, `updated_at` datetime) ENGINE=InnoDB
```

5.7.3からかわってたみたい。
http://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-3.html
主キーは基本的にNOT NULLであるべきなのですが、以前のバージョンだと明示的に指定してやれば主キーの値としてNULL値が使用可能でした。5.7.3からはそれがエラーになるようです。
NULL値を指定したい場合はUNIQUEを指定すれば良いようです。
上記のエラーは、NOT NULLはもう冗長なので…ということのようです。

ActiveRecordのバグになるのかな、と思ってググってみるとcloseされてた。
https://github.com/rails/rails/issues/13203

コードみる限りNOT NULLの記述が消えてます。
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb

現象が起きたrailsのバージョンは4.0.4
4.1.1にアップデートすれば再現しませんでした。
percolを使ってec2にSSHする


先日、「[第22回 AWS User Group - Japan 東京勉強会](http://jawsug-tokyo.doorkeeper.jp/events/11988)」へ参加してきました。

「[「KaizenPlatformでの自動化」KAIZEN platform 伊藤さん](https://speakerdeck.com/naoya/kaizen-platform-inc-niokeruyun-yong-zi-dong-hua)」の発表で、インスタンスへのSSHを、percolを使っていい感じにやるというのが、かなりイケてる感じだったので、自分の環境でもできるようにスクリプトを作ってみました。

https://github.com/sparkgene/ec2-ssh

自分の環境でやる前提なので、あまり汎用的ではないです。。
現状はいくつか制約があります。

- vpc環境で使うことを想定（private ipでsshするので）
- インスタンスのName（タグの）が指定されていること

コマンドを入力するとvpcに含まれるインスタンスが列挙されるので、SSHしたいインスタンスを選んでエンターすると、ログインできます。

![動作](https://raw.githubusercontent.com/sparkgene/ec2-ssh/master/movie.gif)


このエントリーは[こちらのブログ](http://d.hatena.ne.jp/sparkgene/20140622)で公開した情報のクローンです
CentOS6でeth0にアドレスを設定する(CLI)

VMware playerにCentOS6.5をインストール。
簡単インストールでインストールすると
設定がどうなっているかわからない状態になるので
設定を修正するためのメモ。

デフォルトではDHCPからアドレスを取ることになっているので
これを固定IPに変更する。

----------
(0) ifconfig でアドレス確認

アドレス情報が載ってないことを確認。

```
# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:4F:21:48
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
          Interrupt:18 Base address:0x2024
(略)
```

----------
(1) NetworkManagerサービスの停止

CentOS6からの機能のようですが、CLIからネットワーク設定をいじるのに
邪魔になるのでサービスとして停止する。

```
# service NetworkManager stop
Stopping NetworkManager daemon:                            [  OK  ]
```

----------
(2) OS起動時のNetworkManagerサービス起動無効

NetworkManagerはOS起動時に起動する設定になっているので
それも無効にする。

・状態確認

```
# chkconfig --list NetworkManager
NetworkManager  0:off   1:off   2:on    3:on    4:on    5:on    6:off
```

・設定変更

```
# chkconfig NetworkManager off
```

・状態確認

```
# chkconfig --list NetworkManager
NetworkManager  0:off   1:off   2:off   3:off   4:off   5:off   6:off
```

----------
(3) IPアドレス設定

IPアドレスを記載したファイルを編集。

・設定の確認

```
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
```

・設定変更

```
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
```

・設定の確認

```
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
```

ifcfg-ethxのファイルは結構いい加減でも読み込んでくれるので、
全項目が必須ではないですが、個人的にはたいてい以下の項目を設定している。

```
DEVICE="eth0"
BOOTPROTO="none"
HWADDR="00:0C:29:4F:21:48"                    ※
ONBOOT="yes"
TYPE="Ethernet"
UUID="c0ae2334-6404-4c49-b89f-498847xxxxxx"   ※
IPADDR=192.168.101.1
NETMASK=255.255.255.0
BROADCAST=192.168.101.255
```

変更箇所はだいたい以下の通り
・※印の部分は環境によって違うと思いますが、
　最初から記載があると思うのでとりあえずそのままいじらない。
・BOOTPROTOはdhcpになっていると思うのでnoneに変更
・IPADDR、NETMASK、BROADCASTの項目を追加
・ほかに最初から記載のあった項目はいらないので削除

なお、デフォルトゲートウェイとかDNSとかは
ほかのファイルに書くのでここでは書かないものとします。
好みの問題ですが。

----------
(4) networkサービスをリスタート

```
# service network restart
Shutting down interface eth0:                              [  OK  ]
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth0:  Determining if ip address 192.168.101.1 is already in use for device eth0...
                                                           [  OK  ]
```

----------
(5) ifconfig でアドレス確認

eth0 にアドレスが表記されていたらアドレス設定OKです。

```
# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:4F:21:48
          inet addr:192.168.101.1  Bcast:192.168.101.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe4f:2148/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:571 errors:0 dropped:0 overruns:0 frame:0
          TX packets:358 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:58492 (57.1 KiB)  TX bytes:50617 (49.4 KiB)
          Interrupt:18 Base address:0x2024
(略)
```
screen コマンドでシリアル通信 for Mac & Linux

Mac や Linux に基本インストールされている screen コマンドを使ってシリアル通信をやってみましょう。

# 接続の仕方

まず。USB シリアル変換デバイスの名前をチェック

```bash
$ ls /dev/tty.usb*
/dev/tty.usbmodem1422
```

では screen で接続してみよう。ボーレートは `9600bps` に設定

```bash
$ screen /dev/tty.usbmodem1422 9600
```

画面がクリアされて、受信された文字が表示されるはずです！

# screen を終了させるには
screen の画面で `control + a` を押して、次に `k` を押します。
すると画面左下に `Really kill this window [y/n]` と表示されるので、 `y` を押すと screen が終了します。

# mbed の printf 出力を screen で確認する

mbed では `printf` でシリアル通信経由の出力をすることができます。

```c
#include "mbed.h"

AnalogIn analogOutLDO(p19);

int main() {    
    while(1){
        printf("analogOutLDO: %d\n\r", analogOutLDO.read_u16());
        wait(1);
    }
}
```

mbed のシリアル通信は `9600bps` ですので、mbed を接続した状態で以下を入力 (デバイス名は別途調べてください)

```bash
$ screen /dev/tty.usbmodem1422 9600
```

これで mbed からの printf 出力を受信することができます。

もちろん、キーボード入力による mbed へのデータ送信も可能です。
RuboCop | Style/ClassAndModuleChildren EnforcedStyle

# RuboCop | Style/ClassAndModuleChildren EnforcedStyle

## 概要

RuboCopの「Style/ClassAndModuleChildren EnforcedStyle」警告について。

クラス内のクラスなどを定義する際の形式を強制します。

### 設定値一覧

|設定対象|設定値|内容|デフォルト|
|:-------|:-----|:---|:--------:|
|EnforcedStyle|nested|ネスト形式|○|
|EnforcedStyle|compact|ParentClass::ChildClass形式でコンパクトに記述する|--|

## ClassAndModuleChildren EnforcedStyle

各設定値（nested, compact）での検証結果をまとめます。

### 検証プログラム

enforced_style.rb

~~~ruby
# Hoge
class Hoge
  # Hoge::ChildHoge
  class ChildHoge
  end
end

# Hoge::ChildHoge
class Hoge::ChildHoge
end
~~~

### 実行結果 nested の場合

.rubocop.yml

※明示的に設定しているが、デフォルト値なので何も設定しなくてもよい

~~~yaml
ClassAndModuleChildren:
  EnforcedStyle: nested
~~~

compact形式の場合に警告が発生します。

~~~bash
$ rubocop enforced_style.rb
Inspecting 1 file
C

Offenses:

enforced_style.rb:9:7: C: Use nested module/class definitions instead of compact style.
class Hoge::ChildHoge
      ^^^^^^^^^^^^^^^

1 file inspected, 1 offense detected
~~~

### 実行結果 compact の場合

.rubocop.yml

~~~yaml
ClassAndModuleChildren:
  EnforcedStyle: compact
~~~

nested形式の場合に警告が発生します。

~~~bash
$ rubocop enforced_style.rb
Inspecting 1 file
C

Offenses:

enforced_style.rb:2:7: C: Use compact module/class definition instead of nested style.
class Hoge
      ^^^^

1 file inspected, 1 offense detected
~~~
アプリに+1ボタンを設置する

#導入するべき理由
* +1の数が検索結果の順位やランキングに影響する
* Google+上の友達が+1してるとアプリ詳細ページで強調される
* 導入が比較的簡単

#手順
##Google+ APIを使えるようにする
###1.Google APIs Consoleでアプリのプロジェクトを作成
[Google APIs Console](https://console.developers.google.com/)で「Create Project」ボタンを押してプロジェクトを作ります。
PROJECT NAME:アプリの名前
PROJECT ID:自動生成されるのでそのまま

###2.Google+ APIを有効にする
サイドメニューから「APIs」を選択。

一覧の中から「Google+ API」を有効にします。

###3.OAuth2.0のクライアントIDを作成する
サイドメニューから「Credentials」を選択

「Create New Client ID」でIDを作成

[Application Type]
Installed Application

[Installed Application Type]
Android

[Package Name]
アプリのパッケージ名

[SIGNING CERTIFICATE FINGERPRINT (SHA1)]
Kyetoolユーティリティを使って取得したアプリの証明書のSHA-1フィンガープリント

####証明書のSHA-1フィンガープリント取得手順
ターミナルで以下のコマンドを使用する
`keytool -exportcert -alias androiddebugkey -keystore <デバッグ証明書のパス> -list -v`
※ デバッグ キーストアは通常 ~/.android/debug.keystore にある。
※ リリース時はリリース用のClient IDを作成する。

##プロジェクトにGoogle Play Serviceのライブラリを入れる
プロジェクトのbuild.gradleに以下の記述を加えてビルド。
動かなかったら[Set Up Google Play Services SDK](https://developer.android.com/google/play-services/setup.html)を参照してください。

```
dependencies {
    /*
     * 他の記述
     */
    compile 'com.google.android.gms:play-services:4.4.52'
}
```
※上手くビルド出来ない人はSDK MANAGERでGoogle Play servicesとGoogle Repositoryが入っているか確認する

##+1ボタンの設置
####xml
+1ボタンを表示したいレイアウトのxmlに以下のように記述

```xml:sample.xml
<com.google.android.gms.plus.PlusOneButton 
    android:id="@+id/plus_one_button"
    xmlns:plus="http://schemas.android.com/apk/lib.com.google.android.gms.plus"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    plus:annotation="inline"
    plus:size="standard" />
```

####Java
onCreate()内で

```java:MainActivity.java
mPlusOneButton = (PlusOneButton) findViewById(R.id.plus_one_button);
```

onResume()内で

```java:MainActivity.java
String googlePlayUrl = "https://market.android.com/details?id=<PackageName>"
int requestCode = 1;

mPlusOneButton.initialize(googlePlayUrl, requestCode);
```
これで+1ボタンが表示できます。Googleアカウントの選択画面などはライブラリ側に用意されているので、仕込むのはここまでで大丈夫です。
※ GooglePlayのアプリURLのホストはplay.google.comでは正しくGoogle Playのアプリページの+値が増えないので、market.android.comの方を使わないとダメです。

##ダイアログに表示してみた例(DialogテーマのActivity)
![plus_one_image.png](https://qiita-image-store.s3.amazonaws.com/0/20559/596f7012-51cb-0b46-28e6-37f4a951df57.png "plus_one_image.png")
Array.delete と Array.delete_if の返り値に注意

`delete`は消した値を返すんだけど、`delete_if`は配列自体を返す。しらないとハマるかも。

```rb
[91] pry(main)> a = [1,2,3]
=> [1, 2, 3]
[92] pry(main)> a.delete(2)
=> 2
[93] pry(main)> a
=> [1, 3]
[94] pry(main)> a = [1,2,3]
=> [1, 2, 3]
[95] pry(main)> a.delete_if{|v| v == 2}
=> [1, 3]
[96] pry(main)> a
=> [1, 3]
```
ActiveRecord::Enum の使いドコロ

背景
=====

Rails 4.1 より `ActiveRecord::Enum` が利用可能となりました。
これにより以下の様な記述が可能となります。

```
class User < ActiveRecord::Base

  enum role: [:general, :admin]

  ...
end

# role が admin なユーザを取得する
user = User.admin.first!
 
# admin かどうか
user.admin?
 
# role を確認
user.role # => "general"
 
# role を admin に変更
user.admin!
 
# role の取りうる値を確認
User.roles # => {"general"=>0, "admin"=>1}
```

これまで区分値として保持していた値が簡単に管理できるようになってハッピーです。

問題
=====

しかし、これらの値を form 経由で変更しようとするとややこしいことになります。

```
= simple_form_for @user, ... do |f|
  = f.input :role, collection: User.roles
  = f.input :name
```

- submit で `ArgumentError`
- i18n はどうする？

原因
=====

（今のところ）`ActiveRecord::Enum` は内部的に利用する値のために設計されているみたい。


対応案
=====

案1: コアの対応待ち
-----

`ActiveRecord::Enum` は内部で利用する項目にのみ利用し、
ユーザからの変更には使わない。（≒View を通じて変更しない）

使いドコロがちょっと難しいですね。

コアで対応するかも未定なようです。

案2: enum_help を利用する
-----

[enum_help](https://github.com/zmbacker/enum_help) を使うと form の問題も i18n の問題も解決します。


参考
=====

- [ActiveRecord enum: use validation if exists instead of raising ArgumentError · Issue #13971 · rails/rails](https://github.com/rails/rails/issues/13971#issuecomment-34530922)
- [I18n broken for enums? · Issue #1063 · plataformatec/simple_form](https://github.com/plataformatec/simple_form/issues/1063)
- [zmbacker/enum_help](https://github.com/zmbacker/enum_help)
[JavaScript] コナミコマンドのスニペット

Twitterで流行っているようなのでコナミコマンドを実装してみた。

```js

(function(cmd, fire) {
  var keys = [];
  var l = cmd.length, CMD = cmd.join(',');
  $(document).on('keydown', function(event) {
    keys.push(event.which);
    if (keys.length < l) return true;
    if (keys.join(',') === CMD) fire();
    keys = [];
  });
})([38,38,40,40,37,39,37,39,66,65], function(){
  // ここにコナミコマンドのイベントを実装
});
```

第一引数の`cmd`を置き換えれば他のコマンドにも応用可能。

```coffeescript
# 関数化、リトライ対応版
# ほぼTwitterのソースだけど
class CommandWatcher
  constructor: (commands) ->
    @keys = []
    @length = commands.length
    @command = commands.join ','
  watch: (handler) =>
    watcher = @
    $(document).on 'keydown', (event) ->
      watcher.keys.push event.which
      # マッチしたら実行後、即return
      if watcher.keys.length is watcher.length and watcher.keys.join(',') is watcher.command
        handler()
        watcher.keys = []
        return
      # マッチしなかったらリセット
      if watcher.command.indexOf(watcher.keys.join(',')) isnt 0
        watcher.keys = []
        return

new CommandWatcher([38,38,40,40,37,39,37,39,66,65]).watch ->
  # ここにコナミコマンドのイベントを実装
```
Travis-CI で Go の Windows 用バイナリを Github release に登録する


Travis-CI には Github release にファイルを登録する機能があります。 ([参考](http://docs.travis-ci.com/user/deployment/releases/))

この機能と Go のクロスコンパイル機能を使って、 tag に自動的に Windows 向けのバイナリを登録してみます。 成功したリポジトリがこちらにあります。 [methane/localserver](https://github.com/methane/localserver)

## Makefile で Windows 向けバイナリを作る

GOOS と GOARCH を指定してクロスコンパイルし、 Github にアップロードしたい zip ファイルを作ります。ここでは Windows 用の 32bit 版だけ用意しています。この例では `localserver-win32.zip` が生成されます。

```Makefile
.PHONY: all

all:
	GOOS=windows GOARCH=386 go build -o localserver.exe
	zip localserver-win32.zip localserver.exe
```

## Travis CLI を使って準備

`gem install travis` をして、 travis のコマンドラインツールが実行できるようにしておきます。 (gem とか面倒なので Travis の CLI も Go にして欲しいですね)

`travis setup releases` コマンドを実行すると、 Github のユーザー名とパスワードを聞かれるので、それを入力すると、 Travis からアップロードするのに使われる API key を作成し、 `.travis.yml` に必要最低限の `deploy:` のセクションを作ってくれます。

## `.travis.yml` の設定

### クロスコンパイル環境の用意

Travis の Go は gvm を使って管理されていて、クロスコンパイル環境が用意されていません。
クロスコンパイル環境を用意するには [mitchellh/gox](https://github.com/mitchellh/gox) が便利です。

GOPATH が `/home/travis/gopath:/home/travis/.gvm/pkgsets/go1.2/global` になっているので、 `gox` のコマンドがインストールされる `/home/travis/gopath/bin` に PATH も設定しておきます。

`gox -build-toolchain` でクロスコンパイル環境を用意します。今回は windows/386 環境だけ用意できればいいので、 `gox -build-toolchain -osarch=windows/386` としておきます。

```yaml:.travis.yml
language: go
go: 1.3
env: "PATH=/home/travis/gopath/bin:$PATH"
install:
    - go get github.com/mitchellh/gox
    - gox -build-toolchain -osarch=windows/386
# (続く)
```

### Github release へ deploy

script で `make` を実行し、 zip ファイルを作ります。 この zip ファイルが deploy 時に消されないように `deploy: skip_cleanup: true` を設定しておき、 `deploy: file: ` でファイル名を指定します。

`on: tags: true` を設定し、タグが打たれたリビジョンだけ deploy するようにします。
ただし、 [Travis-CI のバグ](https://github.com/travis-ci/travis-ci/issues/1675) があるので、 同時に `deploy: all_branches: true` の設定も必要です。


```yaml:.travis.yml
# (続き)
script: make
deploy:
  provider: releases
  api_key:
    secure: <travis setup releases で生成した暗号化されたAPI Key> 
  file: localserver-win32.zip
  skip_cleanup: true
  all_branches: true  # https://github.com/travis-ci/travis-ci/issues/1675
  on:
    tags: true
```

これで、タグを push すると自動で Windows 版のバイナリを zip で Github release に登録してくれるようになります。
Git(hub)メモ

```git init```

```git add .```　ピリオドを指定すると、そのディレクトリの更新された全ファイルを対象にする。

設定で、自分のメールアドレスと名前を登録。
```git config --global user.email "you@example.com"
git config --global user.name "Your Name"```

```git commit -m "message"```  コミットする。

```git checkout commit番号 ファイル名```

```git remote remove origin
git remote add origin git@github.com:username/projectname.git
git push origin master```


#要勉強
-ブランチ
-ignore
-競合の解消
Open SSLの設定 (windows apache) めも

■Open SSLの設定

1.環境変数（Path）の設定をする
　→　openssl.exeのパスを追加する
　例）C:\Program Files\Apache Software Foundation\Apache2.2\binを追加

2.環境変数（OPENSSL_CONF）の設定をする
　→　新規にOPENSSL_CONFを作成する
　例）C:\Program Files\Apache Software Foundation\Apache2.2\conf\openssl.cnf

3.秘密鍵（server.key）の生成
　# openssl genrsa -des3 -out ./ssl.key/server.key 2048

4.公開鍵（server.csr）の生成
　# openssl req -new -key ./ssl.key/server.key -out ./ssl.key/server.csr

5.証明書（server.crt）の生成
　# openssl x509 -in ./ssl.key/server.csr -out ./ssl.key/server.crt -req -signkey ./ssl.key/server.key -days 365

6.秘密鍵のパスワードを解除する
　→　windows版だとパスワードがついているとapacheが起動できないため
　# openssl rsa -in ./ssl.key/server.key -out ./ssl.key/nopass_server.key

7.httpd.confの修正
　→　以下のモジュールを有効にする
　LoadModule ssl_module modules/mod_ssl.so
　Include conf/extra/httpd-ssl.conf

8.httpd-ssl.confの修正
　→　証明書のファイル名をnopass_server.keyに変更する
　SSLCertificateFile <証明書ファイルの場所>
　SSLCertificateKeyFile <秘密鍵ファイルの場所>
Android StudioでDebugビルドでAPKのインストールに失敗する時

下記のエラーがでたときは、
Installation failed since the APK was either not signed, or signed incorrectly.
If this is a Gradle-based project, then make sure the signing configuration is specified in the Gradle build script.

AndroidStudioの左下の、Build Variantsをクリックし、Build Variantをdebugにしてください。
承認済みAPKを作ったあとに、デバッグビルドしようとすると下記のエラーがでます。
![スクリーンショット 2014-06-23 20.16.53.png](https://qiita-image-store.s3.amazonaws.com/0/6798/554736f0-4b69-4dae-bb41-8e04a38acbe0.png)

![スクリーンショット 2014-06-23 20.17.23.png](https://qiita-image-store.s3.amazonaws.com/0/6798/42e267bc-65df-a6e6-0e21-d7a11bd99e1e.png)
うっかりnpmリポジトリにあげてしまわないように


gruntやkarma,mochaなど様々なJSエコツール使うようになってくると、業務上のアプリケーションも依存ファイルを`package.json`で管理していたりすると思います。
その場合、npmアカウントを作ってモジュールなどを公開している人は簡単に`npm publish`が出来てしまいます。
うっかりパブリッシュは`private:true`設定で防ぐことが出来ます。

```package.json

{
	"private": true,
	//...
}
```
CentOSのキーボード配列を日本語に変更(GUI)

VMware playerにCentOS6.5をインストール。
簡単インストールでインストールすると
設定がどうなっているかわからない状態になるので
設定を修正するためのメモ。

(1) GUIの左上のメニューから「System」>「Preferences」>「Keyboard」を選択

![Win81_000146.jpg](https://qiita-image-store.s3.amazonaws.com/0/45890/cd014eac-5189-7218-4c01-949d4a1d7db9.jpeg)

(2) Layouts タブを選択

![Win81_000148.jpg](https://qiita-image-store.s3.amazonaws.com/0/45890/a8fc6eb2-8d55-1893-6d6d-ad6ceff08514.jpeg)

(3) Layoutのリストの「Add...」ボタンをクリック

![Win81_000149.jpg](https://qiita-image-store.s3.amazonaws.com/0/45890/9da36d0f-6809-396f-b6a8-7d9f8daa993d.jpeg)

(4) Japanの配列を選択し、「Add」ボタンをクリック

![Win81_000150.jpg](https://qiita-image-store.s3.amazonaws.com/0/45890/733edf76-a5b1-d49a-0df5-f0c610b7426a.jpeg)

(5) LayoutのリストにJapaneseが追加されているのを確認し、
    「Default」のラジオボタンを選択、「Close」のボタンをクリック

![Win81_000152.jpg](https://qiita-image-store.s3.amazonaws.com/0/45890/33a47cab-1134-7df9-384b-e2d346ad39c5.jpeg)

この設定が/etc/sysconfig/keyboardに保存されるんだろうなーと思って
catしてみたら特に変わっていなかった。
どこに保存されているんだろうか。わかったら追記する。
*.doc や *.xls のデフォルトエディタを変更する

# 背景
eclipse 上でワードやエクセルを直接開こうとすると、内部のエディタ(OLE Editor とかいうらしい) が開いてしまう。
eclipse とは別に外部のMS製品で開きたい場合、```右クリック -> Open With -> System Editor``` とする必要がある。
面倒なので、これをデフォルトの動作に設定したい。

ググったところ、どうやら拡張子別で指定する必要があるようだった。

# 手順
## Window -> Preferences を開く
![step1.jpg](https://qiita-image-store.s3.amazonaws.com/0/35008/ebb0f056-0274-0478-fe94-792c4d047627.jpeg)


## General -> Editors -> File Associations で例えば下記のように設定する
![Image_000.png](https://qiita-image-store.s3.amazonaws.com/0/35008/382ee491-2cf3-dfe1-cba3-a699f6191a65.png)


# まとめ
このように拡張子別にアプリケーションを指定することで、デフォルトの動作を変更することができた。
めでたしめでたし。
PecoからRakeタスクを実行する

Rakeタスクを先頭から入力するのがダルいのでpecoを組み合わせてみた。

```zsh:.zshrc
pecorake() { local task=$(rake -W | peco | cut -d " " -f 2); rake $task }
```

Escでキャンセルしたときを考慮してないけど、これだけの設定でかなり捗るようになった。peco便利。
cssアニメーションでつまったところ

箇条書きで書いていく.

#chromeはベンダープレフィクスを付けないとアニメーションは使えない.

```css:例
    -webkit-animation: test 1s linear 0s infinite normal;

    @-webkit-keyframes test{
       /*...*/
    }
```

#animation-iteration-countにinfiniteを指定したときの1ループ終了時のイベントはanimationendではなくanimationiteration. 
chromeでは`webkitAnimationIteration`を使う.

#firefoxでanimationのプロパティを一気に指定するとき,animation-delayに0を指定すると動かない.
firefoxのバージョンは30.0
sを付けると解決する.

```css:例
    animation: test 1s linear 0s infinite normal;
```

#IEでrotate3d(0,1,0,0deg)からrotate3d(0,1,0,180deg)までのアニメーションが意図した通りに動かない.
IEのバージョンは11
![ie.gif](https://qiita-image-store.s3.amazonaws.com/0/42193/f7eff41d-a3b8-6503-6ed9-ef861a8cacbc.gif)

rotateYを使うと解決する.

```css:例
    animation: test 1s linear 0s infinite normal;

    @keyframes test{
        0%{transform: rotateY(0deg);}
        100%{transform: rotateY(180deg);}
    }
```
【Android】Animationがカクつく（読み込みに手間取る）際に施した対処メモ


どうやらOS4.0以上はデフォルトでandroid:hardwareAcceleratedがtrueになっているのが弊害になって
アニメーションがカクついたりする場合があったので

http://developer.android.com/guide/topics/graphics/hardware-accel.html

ここにある

```java
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
```

これでアニメーションかけるViewだけhardwareAcceleratedをOffにしてやることで、スムースに動く、ということがあったメモ。