OmniAICreator/Qiita-1.07M huggingface dataset:
Sorting Japanese Words in Indexes (1)

Japanese Writing System requires a number of characters, such as _hiragana_, _katakana_, _kanji_, punctuation marks, mathematical signs, numerals, leads for tables, general signs, Latin alphabets, Greek alphabets, and Cyrillic alphabets.  The above statement is well-known among Japanese-speaking people because widely used _JIS X 0208_ (_JIS_ stands for Japanese Industrial Standards) were defined as such.  However, in the context of sorting Japanese words in the back-of-the-book indexes, the main part is sorting _hiragana_, _katakana_, and _kanji_.

For the purpose of back-of-the-book indexes, we usually sort Japanese words by pronunciation basically.  Japanese pronunciation can be written down using _hiragana_ or _katakana_, which represent Japanese syllables.  A set of _hiragana_ and that of _katakana_ are almost the same in the meaning of representing syllables, which means there are one-to-one mapping between _hiragana_ and _katakana_, except that one character 'ヴ' (vu) is only defined in _katakana_.  In this series, we choose _hiragana_ to normalize syllables.

How to pronounce _kanji_ is the difficult problem for non-Japanese-speaking people.  It requires much of knowledge about Japanese grammars and many of memories matching (a combination of) _kanji_ to its pronunciation.  'Kakasi' (Kanji Kana Simple Inverter) is an example of the tools to assist the matching, but it fails in some cases.  Ultimately, proof-readers should check the result before the publishing.  In this series, we assume that all of the pronunciation for _kanji_ are given by the users (i.e., authors, editors, or indexers) correctly.

If we assume the above, we need to illustrate a lot of things, we will follow the indications in _JIS X 4061_ titled "Collation of Japanese Character String".  Rough translation limited to the basic collation rules between pronunciation and appearance in _JIS X 4061_ will be convenient to implement the first version of indexing program. 

Since _JIS X 4061_ is related to _JIS X 0208_, it includes the rules of sorting among many kinds of characters or letters rather than _hiragana_, _katakana_, and _kanji_.  However, I think that different language's script should be ordered by the language's rule.  For example, in Español, 'ch' should be separated from the 'c' entries, and 'll' from 'l'.  Then, I will skip the details for the points.
Chocolatey + VirtualBox + Vagrant Shareを使ってみた（Windows）

## 10分でセットアップできる簡単手順
### Vagrant Shareとは
仮想環境として構築したVagrantを外部（インターネット）で簡単に公開できる仕組みです。ロケフリみたいな仕組みっていえばピンとくるかもね。

### Chocolatey の導入
[Chocolatey](https://chocolatey.org/)は、Windows版 yum っていう感じのコマンドラインからアプリをインストールできるパッケージ管理システムです。これを導入しておくといちいちアプリをぐぐったりしなくていいのとバージョンアップも簡単ですのでまずはインストールします。

1. [https://chocolatey.org/](https://chocolatey.org/)サイトに行き、dos窓用(C:\> のやつ)をコピーする。
2. dos窓を表示する。
3. ペーストしてコマンドを実行する。

### VirtualBox と Vagrant の導入
導入した[Chocolatey](https://chocolatey.org/)で VirtualBox と Vagrant をインストールします。バージョンについては、特に気になければChocolateyのライブラリにある最新パッケージが適用されます。
dos窓を開いて、下記のコマンドを叩くだけ。

```lang:text
C:\> cinst virtualbox
C:\> cinst vagrant
```

### Vagrant Share
Vagrant Shareを使えるのは、1.5以上らしいので。念のためバージョンを確認してみます

```lang:text
C:\> vagrant -v
Vagrant 1.5.4
```

### Vagrant Cloudにユーザ登録
[Vagrant Cloud](https://vagrantcloud.com/)のページにアクセスしユーザ登録します。

### Vagrantfile 
Vagrant Shareを試す場合、httpサービスが起動していないとだめなので、下記のようにさらっとhttpdをインストールして起動するまでをコマンドラインで実行するようにしてみます。あとCentOSが好きなのでそこらへんよろしくｗ

```lang:ruby
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos65"
  config.vm.box_url = "https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box"

  config.vm.network :forwarded_port, guest: 80, host: 8080
  config.vm.provision "shell", inline: <<-EOT
    yum -y update
    yum install -y httpd
    rm -rf /var/www
    ln -fs /vagrant /var/www
    mkdir /var/www/html
    echo "<h1>Hello, Vagrant Cloud.</h1>" > /vagrant/html/index.html
    service httpd start
  EOT
end
```

あとは、いつものup

```lang:text
C:\> vagrant up
```

### Vagrant login
Vagrant Cloudに登録した情報で、login します。

```
C:\> vagrant login
...
If you don't have a Vagrant Cloud account, sign up at vagrantcloud.com

Username or Email: 
Password (will be hidden):
You're now logged in!
```

### Vagrant Share
Vagrant Shareで公開をします。このとき構築したVagrantでhttpサービスが起動していないと怒られるの注意が必要ですわ。

```lang:text
C:\> vagrant share
```

うまくいくと、ずらずら…って

```
==> default: Your Vagrant Share is running! Name: delicate-lion-6691
==> default: URL: http://delicate-lion-6691.vagrantshare.com
```

一時URLが発行されるのでそれをシェアしたい人に送ればok、このURLは固定ではないので毎回URLが変更されるので注意が必要です。
で、公開しっぱなしだとアレなので（ほっといても１時間？で切れるらしいけど）、ctrl+c で中断すればシェアが解除されるっていう仕組み。

### ここまで10分…とはいわないけど
Chocolatey の導入とVagrant Cloudに登録する手間があるので10分では無理かもしれないけど、20分あれば簡単に作れると思います。
【Rails4】複数選択チェックボックス(check_box_tag)


check_boxは真偽値のカラム用になっているため、check_box_tagを使います。

```erb
check_box_tag(name, value = "1", checked = false, options = {})
```

配列で受け取るためのモデル名つきname属性を指定します
hidden要素は全てチェックなしでの更新をするために必要です

```erb
<%= form_for @user do |f| %>
  <%= hidden_field_tag 'image[id][]' %>
  <% @image.each do |i| %>
    <%= check_box_tag 'image[id][]', i.id, checked = false, :id => "image_#{i.id}" %>
  <% end %>
<% end %>
```

checkedの判定を反映させたい場合は、以下のようにやるといいらしいです

```erb
<%= check_box_tag 'image[id][]', i.id, @user.images.include?(i.id), :id => "image_#{i.id}" %>
```
シェルスクリプト上のループ処理について

# シェルスクリプト上のループ処理について

Bourne Shell系列での話です。

## for
### 概要
リストの値を順番に処理する。
私の場合は、処理する対象が事前に決まっている場合はforを使う傾向が多いです。


### 構文

```bash
for 変数 in 変数に渡す値のリスト
do
  処理
done
```


### 例
#### 順番に表示

```bash
$ for VAL in 1 2 3
> do
>   echo $VAL
> done
1
2
3
```


#### カレントディレクトリのテキストファイルをEUCに変換する

```bash
$ for FILE in `ls *.txt`
> do
>   nkf -e ${FILE} > ${FILE}.euc
> done
```

#### カウントダウン
Linuxで確認しています。BSDは`jot`を使ってください。

```bash
$ for CNT in `seq 10 -1 1`
> do
>   echo $CNT
>   sleep 1
> done
10
9
8
7
6
5
4
3
2
1
```


## while
### 概要
ある条件の間ループする。
ファイルから値を読み込むときに使うことが多いです。他には、ファイルが作成されたかを監視するときに無限ループさせるのに使ったりします。

### 構文

```bash
while 条件
do
  処理
done
```

### 例
#### ファイル読み込み

```bash
while read COL1 COL2 COL3
do
  COL=`expr $COL1 + $COL2 * $COL3`
  echo $COL
done < data.tsv
```

この例だとTSVファイルですが、`IFS`を変更することで、CSVファイルを読み込むことができます。

```bash
OLD_IFS=$IFS
IFS=","
while read COL1 COL2 COL3
do
  COL=`expr $COL1 + $COL2 * $COL3`
  echo $COL
done < data.csv
IFS=$OLD_IFS
```

使ったら元に戻しておきます。


#### 無限ループ
CSVファイルを出力するあるバッチ処理の処理状況を確認したいとき、よくこんな感じで監視します。
Ctrl-Cで止めます。

```bash
while true
do
  date
  ls -ltr result_*.csv
  sleep 10
done
```

## find
### 概要
あるディレクトリ配下のファイル／ディレクトリのうち、条件にマッチしたものを抽出するのが`find`です。

#### `grep`する
例えばカレントディレクトリ配下にある`*.c`ファイルを対象に`grep`するとき

```bash
find ./ -type f -name '*.c' -exec grep -n GREP_WORD /dev/null {} \;
```

とやったりします。
でも、カレントディレクトリ配下のディレクトリ名、ファイル名にスペースがないことが分かっているなら、こっちの方が速いです。

```bash
find ./ -type f -name '*.c' | xargs grep -n GREP_WORD
```

CYGWINを使っている場合、Program Files配下のファイルを取得しようとするとディレクトリ名にスペースが入っているため、`xargs`にうまく情報を渡すことができない場合があります。そういうときは`find`の`exec`アクションを使いましょう。

#### `for`の対象を抽出する
あるディレクトリ配下のファイルを抽出し、`for`で処理したいときに`find`を使ったりします。

```bash
for FILE in `find ./ -type f -name '*.c*'`
do
  nkf -e ${FILE} > ${FILE}.euc
done
```
Sublime Text にJS build-systemを加える

(1) install node.js from http://nodejs.org/

(2) Go to Tools -> Build System -> New Build System

(3) Name the file it to "Node.sublime-build" and change the default content to 

{
"cmd": ["/usr/local/bin/node", "$file", "$file_base_name"],
"working_dir": "${project_path:${folder}}",
"selector": "*.js"
}

and save.

(4) Restart your sublime text, go to Tools -> Build System and select "Node" for your build system.

(5) Hit "Command + b" for building your file.
Homebrewをインストール！ついでにNginx, PHP-FPM, MySQLも！

## コメント

### この記事は今後更新しません

初稿から時間が経過し、開発環境の構築方法も少し変わってきました。同様の記事については、また機会があれば書いてみようと思いますが、この記事については更新を行いませんので、他の情報をご参照ください。

### 改版履歴

- 初稿（2014/05/25）
- こんなに多くの方に見ていただくとは思いもしなかったので、2015年5月末現在の内容で書き直しました。（2015/06/04）
- El Capitanについて補足。内容も少々見直しました。（2015/12/31）
- 当記事更新終了の旨、追記しました。（2017/01/27）

### El Capitan（OSX 10.11）ご利用の皆さま

El CapitanからRootlessというシステム保護機能が導入されたため、“/usr/local/”ディレクトリがない状態からのHomebrewの導入が少し難しくなっております。詳細は下記ページをご参照ください。

[MacをOS X 10.11 El Capitanにアップデートし"/usr/local"ディレクトリを消してしまった場合、Homebrewをどの様にインストールすればよいのか？](http://applech2.com/archives/46442082.html)


## Homebrewをインストール

詳しくは[Homebrew公式ページ](http://brew.sh/index_ja.html)をご覧ください。でも、基本的にはターミナルを起動して、下記のコマンドを実行するだけです。

```Bash
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

### .bash_profileにパスを追加

```bash
export PATH="/usr/local/bin:/usr/local/sbin:/usr/local/git/bin:/usr/local/mysql/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/MYNAME/bin:$PATH"
```

MYNAMEはご自分のユーザー名に変えてください。わかる方はお好みで評価順を変えてください。

### Xcode Command Line Toolsのインストール

Xcodeをインストールしていない場合はApp Storeからダウンロードしてください。

```bash
$ xcode-select --install
```

ライセンスへの同意を求められる場合は、CLIでも出来たはずですが、手元にコードがないので、ひとまずGUIのXcode.appを起動してライセンスに同意して、Xcodeを終了させてください。

### 新しいバージョンのgitをインストール（お好みで）
    
```Bash
$ brew install git
（中略）
$ which git
/usr/local/bin/git
```
    
## nginxのインストール
    
```Bash
$ brew install nginx
（中略）
$ which nginx
/usr/local/bin/nginx
```

なお、上記でインストールされるのは安定版（stable）です。Mainline versionを使いたい場合は、--HEADオプションを付けます。

```bash
$ brew install nginx --HEAD
```

### nginxを起動させる
    
```Bash
$ ln -sfv /usr/local/opt/nginx/*.plist ~/Library/LaunchAgents
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist
```

初期状態では8080番ポートをlistenしていますので、http://127.0.0.1:8080/ と適当なブラウザに入力して動作を確認します。デフォルトのドキュメントルートは /usr/local/var/www です。終了する時はlaunchctlでunloadします。

```Bash
$ launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist
```

## PHPをインストール

### 事前にtapでリポジトリを増やしておく

```Bash
$ brew tap homebrew/dupes
$ brew tap homebrew/php
```

### PHPをインストールして、PHP-FPMを起動
    
```Bash
$ brew install php56
（中略）
$ cp /usr/local/opt/php56/homebrew.mxcl.php56.plist ~/Library/LaunchAgents/
$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php56.plist
$ php-fpm -v
```

終了するときは、上記と同じくlaunchctlでunloadします。

```Bash
$ launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.php56.plist
```

PHP 7をインストールしたい場合は、“php56”を“php70”と置き換えます。

## MySQLをインストール
    
```Bash
$ brew install mysql
$ ln -sfv /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
```

### mysql_secure_installationを実行

```bash
$ mysql_secure_installation
```

初期状態では、rootユーザーにパスワードが設定されていませんので、パスワードの設定やネットワーク外からのrootアクセス禁止、テストDBとユーザーの削除を行います。

## 次にすると便利なこと

1. Nginxの各種設定
  - port80で動かすことも設定次第で出来ます！
2. PHP-FPMの設定
  - Nginxの設定ファイルにPHP-FPMをlistenするよう書き加えます。
phpserialize: DjangoからXoopsのセッションテーブルを読む




DjangoのプロジェクトをつくってMySQLでxoopsを読めるようにする:

xoopsアプリをつくって INSTALLED_APPS に追加する

```py

    $ python manage.py startapp xoops
    
    $ echo "INSTALLED_APPS += ('xoops',)" >> app/settings.py
```
    
inspectdb する


    $ python manage.py inspectdb > xoops/models.py
    
    
PHPにSuhoshinが使われていたらencrytをoffにする

    $ grep encrypt /etc/php5/apache2/conf.d/suhosin.ini 

    suhosin.session.encrypt = off
    suhosin.cookie.encrypt = off
    
    $ sudo /etc/init.d/apache2 restart


PHPSESSIONID でクエリしてみる

```py

    >>> from xoops.models import XoopsSession
    >>> s = XoopsSession.objects.get(sess_id='5330d6965894abba386fbd35543e5792')
    >>> s.sess_data
    u'xoopsUserId|s:1:"1";xoopsUserGroups|a:2:{i:0;s:1:"1";i:1;s:1:"2";}protector_last_ip|s:13:"155.174.42.85";'

```
    

[unserialize_session](https://gist.github.com/scragg0x/3894835) を通してdict化する

```py

    >>> sd = unserialize_session(s.sess_data)
    >>> for k, v in sd.items():
    ...    print k, "=>", v
    ... 
    xoopsUserId => 1
    protector_last_ip => 155.174.42.85
    xoopsUserGroups => {0: u'1', 1: u'2'}

```

ユーザーを探す

```py

    >>> from xoops.models import XoopsUsers
    >>> xu = XoopsUsers.objects.get(uid=sd['xoopsUserId'])
    >>> xu.uname
    u'webadmin'
```
Selenium2 WebDriverを使ってみる

FirefoxDriverの代わりに、HtmlUnitDriverやChromeDriverなどなど、setUp内で生成しているWebDriverの実装を替えることで、他のブラウザーでも動くはずです。（もしかすると、CSSセレクターとか違う場合がありますが…）
あと、GoogleのサイトのDOM構成が変わったらテストが通らなくなるのでご了承下さい。

```java
package com.github.poad.example.selenium;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;

/**
 * Google検索してみるサンプル
 *
 */
public class TestMain {
    
    private WebDriver driver;
    
    @Before
    public void setUp() {
        // Firefoxを起動
        this.driver = new FirefoxDriver();
    }
    
    @Test
    public void test() {
        // google.co.jp を開く
        this.driver.get("http://google.co.jp/");
        // 検索フォームの要素を取得
        WebElement searchForm = this.driver.findElement(By.id("lst-ib"));
        Assert.assertNotNull(searchForm);
        // 検索フォームに google と入力する
        searchForm.sendKeys("google");
        // 検索ボタン要素を取得
        WebElement searchBtn = this.driver.findElement(By.cssSelector(".jsb > center:nth-child(1) > input:nth-child(1)"));
        // 検索を実行する
        searchBtn.click();
        // 検索結果ページからGoogleのロゴ要素(のホームへのリンク要素)を取得
        WebElement homeLink = this.driver.findElement(By.cssSelector("a#logo"));
        Assert.assertEquals("a", homeLink.getTagName());
        
    }
    
    @After
    public void tearDown() {
        // Firefoxを終了
        this.driver.quit();
    }
}
```
【Rails4】find_by_sqlを使った時に、kaminariを使う

find_by_sqlを使った時に、kaminariでpaginateする方法です。

```rb
    @images = Image.find_by_sql(['SELECT i.*, u.email, FROM images i, users u WHERE i.user_id = u.id AND i.user_id = ?', current_user.id])
    @images = Kaminari.paginate_array(@images).page(params[:page]).per(30)
```

参考URL
https://github.com/amatsuda/kaminari/blob/master/README.rdoc#paginating-a-generic-array-object
Homebrewでインストールするパッケージ一覧


## Homebrew のインストールと操作方法

Homebrewのインストールと操作方法はこちらがわかりやすいです！
[Homebrew - Qiita](http://qiita.com/yoshi-naoyuki/items/503338f0b975a3b43f18)


## 基本コマンド系

問答無用でインストールするコマンド

```sh
## vim
brew install vim

## zsh
brew install zsh
brew install zsh-completions
# zsh で dircolor を使っている場合必要
brew install coreutils

## htop:メモリやプロセスの確認
brew install htop-osx

## マルチバイトなビューアー
brew install lv

## 賢いgrep
brew install ack

## ディレクトリ構成をわかり易く表示
brew install tree

## コマンド実行結果の監視
brew install watch
```

## Git系

```sh
brew install git
brew install tig
```

## Web開発系

```sh
## WebServer
brew install httpd
brew install nginx

## JSON の表示をわかりやすく
brew install jq

## Node.js
brew install node

## MySQL
brew install mysql

## PHP
brew tap josegonzalez/php  
brew install php-build
brew install php-version
brew install php54
brew install composer
```
AngularJsにもあったスマホに最適化されたMobile Angular UI

angularJSで構築したPCサイトのスマホ版を作成しようと考えてて、 angularJSを使っているのにもかかわらず、 JQuery Mobileで実装するしかないかなと、半ば諦めかけていたところ、ありました、  **Mobile Angular UI** というangularJS用のスマホ向けライブラリが。

# 本家サイト
[Mobile Angular UI](http://mobileangularui.com/)

# 使い方
* Downloadボタンからソースファイルとデモを一式ダウンロードする(git hubもありました)
* demoフォルダのindex.htmlを開く
* おそらく、いくつかリンク切れのエラーが出るので、その辺りを自分の環境に合わせて、修正していく。(ブラウザのコンソールログに404になっているファイルが出てくるので、それで大体確認できます)
* 自分の好みに合わせてファイルを修正する。

ただそれだけ。

# ポイント
参考になるかどうかわかりませんが、自分がはまった箇所を記載。

1. ファイルのパス、リンクが間違っていて、うまく動かないときにわかりづらい。(angularJSそのものの習性かもしれません)
2. 利用できるiconの種類がわからなかった。→ドキュメントはもちろん英語で、シンプルです。ものたりないかもしれません。(が、多すぎて読む気をなくすよりはいいです)

アイコンの種類を調べるために、一覧を作成しました。参考にしてください。(cssファイルからの逆引き)
[Mobile Angular UIのアイコン一覧](http://damp-ocean-5870.herokuapp.com/icon_sample.html)

# 感想
demoがものすごくシンプルで、変更が入れやすく、非常に使いやすいです。
既存のangularJSで実装した、Service,Controller類も何の変更も加えず流用できます。
しかも、 前人未到、未知への領域によくある **はまる** ということがほぼありません。
JQuery Mobileは、相当はまりましたけどね。
自分の実力が上がったという説もあります。
待機中アプリ終了方法

## 使用するクラス・メソッド
ActivityManagerクラスには、Android OS 2.2(API level 8)から
ActivityManager#killBackgroundProcesses
というメソッドが追加されました。
http://developer.android.com/reference/android/app/ActivityManager.html#killBackgroundProcesses(java.lang.String)

引数に渡したpackageName(String)のアプリケーションをkillする処理を行ってくれるようです。
ただ実行しているアプリ自身は終了できません。  

## アプリのパッケージ名取得
端末にインストールされたアプリのパッケージ名を取得してみましょう。

```java
PackageManager pm = getPackageManager();
List<ApplicationInfo> list = pm.getInstalledApplications(0);

for (int i = 0; i < appList.size(); i++) {
	Log.d("installApp",appListSize.get(i).packageName);
}
```

LogCatを確認
![スクリーンショット 2014-05-25 0.24.04.png](https://qiita-image-store.s3.amazonaws.com/0/30138/d20d841e-d59c-ac76-1409-838b22fd4548.png)

取得できているようです

## アプリのパッケージ名を指定してアプリをkillさせる

ActivityManager#killBackgroundProcessesにpackageNameを渡して実際に使ってみます。

```xml
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
```

```java
ActivityManager activityManager = ((ActivityManager) getSystemService(ACTIVITY_SERVICE));
PackageManager pm = getPackageManager();
List<ApplicationInfo> appList = pm.getInstalledApplications(0);

for (int i = 0; i < appList.size(); i++){
	activityManager.killBackgroundProcesses(appList.get(i).packageName);
}
```

## 終了されたか確認する

実行前に色んなアプリを起動してHomeボタンを押してサスペンドしておいてください。
その後、アプリを実行してバックグラウンドで待機状態にしてあったアプリを立ち上げてみてください。

新たにアプリが立ち上がり、killされていることが確認できたでしょうか？
Macのマウスカーソルを爆速にする方法

Macのマウスカーソルの速度はシステム環境設定で最大にしてもあんまり速くないです。
ですが、以下のコマンドで限界を突破することができます。

```bash
$ defaults write "Apple Global Domain" com.apple.mouse.scaling 17.0
```

コマンド実行後に再起動が必要です。

システム環境設定で設定できる値の最大値は1.7なので、これだと10倍速ですね。
私はこのくらいがちょうどいいです。
knife-solo 使ってみる

#前提
vagrant, chef-soloがインストールされていること
参考 ➡ http://qiita.com/pollseed/items/2105166203d8b1f5e9f4

#手順
##knifeのいんすとーる
<pre>$ gem install knife-solo
$ gem install berkshelf 他の人のクックブックを管理するために使います
$ knife solo init .
$ knife solo bootstrap hostname</pre>
run_listを編集して、レシピのリストを変更 nodes/hostname.json
##実行
<pre>$ knife solo cook hostname</pre>
knife solo cookコマンドにより、rsyncでローカルからリモートにクックブックが転送されます
SSH経由でコマンドが実行されていた

あとは、必要なサービスをインストールしてみるのがいいでしょう

やり方は簡単で、
<pre>$ knife cookbook create サービス名 -o セットアップしたknife soloのコマンドでできたファイル</pre>
こういう形でインストールするためのknifeのcookbookを作ります
その後、レシピを編集し、actionにinstallを設定します

#最後にめも
今回はあまりChefを触っていませんが、使ってみた感じではこれから自分のサービスに活かして行きたいと思いました

最後に、Chefの思想を少しめもります
##冪等性
「べきとうせい」と読みますが、これは何度適用してもサーバの状態が同じになることをさしています
実際に、destroyして再度サーバをChefのレシピによって作り直してみましたがapacheや他のインストールしたミドルウェアも全て同じ状態が再現されました
逆に言えば、Chefがサポってくれるところ以外は、冪等性を意識したシェルを書く必要があるということにもなります
我々が意識するところとしては、トップダウンのコードを書くことではなく、サーバが「こうあるべき」姿を書くことにあります
作業を単純化して自動化するツールはたくさんありますので、Chefと組み合わせて使うことが非常に有効であると思います

ざっと動かして壊して、再生させて、色々サービスに割り当てて遊んだので、次はソースコードでも読もうかな

##さんぷるそおーす
https://github.com/pollseed/chef-common
全部公開してませんが、気が向いたら参考にして下さい
プログラムでシダを描画する

　概要と元ネタです。

> [プログラムでシダを描画する - 強火で進め](http://d.hatena.ne.jp/nakamura001/20140505/1399316565)

> [「プログラムでシダを描画する」をDartで描画する - Qiita](http://qiita.com/zukkun/items/08b72c9934d3c0c09936)

> [「プログラムでシダを描画する」をGoで描画する - Qiita](http://qiita.com/qt-luigi/items/ec6cd349259fe6cc29eb)

```clj
(ns fern
  (:require [incanter.core :refer [$=]])
  (:require [quil.core :refer :all]))

(def ^:dynamic *width* 500)
(def ^:dynamic *height* 500)

(defn W1x [x y]
  ($= 0.836 * x + 0.044 * y))

(defn W1y [x y]
  ($= -0.044 * x + 0.836 * y + 0.169))

(defn W2x [x y]
  ($= -0.141 * x + 0.302 * y))

(defn W2y [x y]
  ($= 0.302 * x + 0.141 * y + 0.127))

(defn W3x [x y]
  ($= 0.141 * x - 0.302 * y))

(defn W3y [x y]
  ($= 0.302 * x + 0.141 * y + 0.169))

(defn W4x [x y]
  0)

(defn W4y [x y]
  ($= 0.175337 * y))

(defn draw [n x y]
  (if (pos? n)
    (do
      (draw (dec n) (W1x x y) (W1y x y))
      (when (< (rand) 0.3) (draw (dec n) (W2x x y) (W2y x y)))
      (when (< (rand) 0.3) (draw (dec n) (W3x x y) (W3y x y)))
      (when (< (rand) 0.3) (draw (dec n) (W4x x y) (W4y x y))))
    (let [u ($= *width* - 10)
          v ($= *height* - 10)]
      (point ($= x * u + *width* * 0.5) ($= *height* - y * v)))))

(defn setup []
  (smooth)
  (stroke 32 128 32)
  (stroke-weight 1)
  (background 255)
  (draw 20 0 0))

(defsketch fern
  :title "fern"
  :setup setup
  :size [*width* *height*])
```

![fern](https://qiita-image-store.s3.amazonaws.com/0/4250/2ed5db0d-2e35-d886-3479-f01b984ba2b1.png)

楽しい！ ✌(’ω’✌ )三✌(’ω’)✌三( ✌’ω’)✌

> [quil/quil - GitHub](https://github.com/quil/quil)

> [Incanter](http://incanter.org/)
PowerShellでwhichコマンド

最近Windowsを触る割合が減ったのでよく忘れる。。

UNIXのwhichコマンドのように、コマンドレットの詳細を調べるのはGet-Command(エイリアス: gcm)である。しかしそのままでは表示がわかりにくい。。

```ps1
> gcm notepad

CommandType     Name                                               ModuleName
-----------     ----                                               ----------
Application     notepad.exe
```

notepad.exeが、どのパスに存在しているのかが知りたいからコマンドを調べてるのに！！肝心の情報が表示されていない。

Format-List(エイリアス: fl)をかませると、いい感じの表示になる。

```
> gcm notepad | fl


Name            : notepad.exe
CommandType     : Application
Definition      : C:\Windows\System32\notepad.exe
Extension       : .exe
Path            : C:\Windows\System32\notepad.exe
FileVersionInfo : File:             C:\Windows\System32\notepad.exe
                  InternalName:     Notepad
                  OriginalFilename: NOTEPAD.EXE.MUI
                  FileVersion:      6.3.9600.16384 (winblue_rtm.130821-1623)
                  FileDescription:  メモ帳
                  Product:          Microsoft® Windows® Operating System
                  ProductVersion:   6.3.9600.16384
                  Debug:            False
                  Patched:          False
                  PreRelease:       False
                  PrivateBuild:     False
                  SpecialBuild:     False
                  Language:         日本語 (日本)
```

もしくは

```ps1
> (gcm notepad).Definition
```

でもファイルパスが得られる。でも長くて覚えられないので、Format-Listを使うことにする。
HttpSocketResponseのHTTP Statusが0になる

## 環境

PHP: 5.3.3(RHEL)
CakePHP: 2.4.10

## HTTP Statusが0になる

HTTPステータスが200のときは問題ないが、reasonPhraseが二個以上の単語で返ってくると、codeが設定されず0になる現象があります。

例えば、以下のようなレスポンスがあったとします。

```
HTTP/1.1 503 Service Temporarily Unavailable\r\n
```

HttpSockeResponseは以下のようになってしまいます。
Versoinが正しく設定されているのは、デフォルト文字列のようです。

```
[httpVersion] => HTTP/1.1
[code] => 0
[reasonPhrase] => 
```

どうも、ここのpreg_matchがまずいのではないだろうか。

lib/cake/Network/Http/HttpSocketResponse.php:L155

```php:HttpSocketResponse.php
if (preg_match("/(.+) ([0-9]{3})\s*([^ ]*)\r\n/DU", $statusLine, $match)) {
  $response->httpVersion = $match[1];
  $response->code = $match[2];
  $response->reasonPhrase = $match[3];
}
```

以下のように修正してやると、正しく設定されます。

```php:HttpSocketResponse.php
if (preg_match("/(.+) ([0-9]{3})\s*([^ ]+.*)\r\n/DU", $statusLine, $match) {
  $response->httpVersion = $match[1];
  $response->code = $match[2];
  $response->reasonPhrase = $match[3];
}
```
MYSQLへの接続時にハマったこと

# 環境
* AWS
* Ubuntu 14.04

# 問題
AWS上のUbuntuにmysqlをインストールし、ローカル環境のplayframeworkアプリからアクセスしようとしたが、アクセス出来ない。

# 試したこと

* Aws の Security Group で ポート3306 を許可する。
* iptableの確認。

。。。でもダメ
# 原因

```text:/etc/mysql/my.cnf
bind-address = 127.0.0.1
```

# 解決方法
原因となっている行をコメントアウトし、再起動。

```sudo service mysql restart```

（本当はちゃんとIPアドレス指定してあげるのがいいのでしょうが。とりあえず。）
SpriteKit入門 -27-


こちらからコリジョンに衝突したときの実装についてのサンプルコードがありました。
[SpriteKit Physics Collisions](https://developer.apple.com/library/mac/samplecode/SpriteKit_Physics_Collisions/Introduction/Intro.html "SpriteKit Physics Collisions")

こういう感じのゲーム作るときの参考になります。

![spritekit_27_01.png](https://qiita-image-store.s3.amazonaws.com/0/30731/dfc66b6e-b90a-1a5e-6ca1-c2d257c26f53.png "spritekit_27_01.png")

ということで、SpriteKit入門はここまで。
PlayFramework2 (Java) Viewsでのメモ書き

・scala.htmlから別のscala.htmlを参照する事ができる
例（
```index.scala.html
<form action="/" method="get">
@formInputText("てすと","inputname",”初期値”)
@formInputText("おためし","otamesi",”最初に入力されてる文字だよ”)
</form>
```
```formInputText.scala.html
@(title:String,name:String,default:String)
@title<input type="text" name="@name" value="@default">
```
これで、表示するとテキストフォームが２つ表示される
）
・viewでの配列の設定方法
scala.htmlはScalaでコンパイルされるから、Javaの文法で書くとエラーが出る
特に、配列の書き方がJavaと違うから注意する
引数としての設定方法
```scala.html 
@(options:Array[String])
@for(option <- options){
option
}
```
each-for文も少し違うから注意する

もし上記のファイルにviewが配列を送りたい場合は
Array("A","B","C")
のように書く（Javaと違うのはカッコが{}→()なのと"Array"を前につけるの必須）
homebrew で docker を upgrade した時にやること

Homebrew で docker と boot2docker を upgrade したところ、docker が使えなくなってしまった。

```
% docker images
2014/05/24 17:49:42 Error: client and server don't have same 
version (client : 1.11, server: 1.10)
```

client (Mac OS 上のプロセス) と server (専用 VM 上のプロセス) のバージョンが違うと言っている。

そこで次のように upgrade する。ただし、`delete` した段階で、今まで `docker pull` したディスクイメージなどは消えることになる。

```
$ boot2docker stop
$ boot2docker delete
$ boot2docker download
$ boot2docker init
$ boot2docker up
```

server は boot2docker
ps コマンドから引数(パスワードなど)を隠ぺいする

## 引数にパスワードを取るようなコマンドで困ること

ps コマンドの出力や /proc/\<pid\>/cmdline でパスワードがそのまま見えてしまう。
curl のようにパスワードを隠してくれるものはいいが、そうでないものを使うときに困る。(curl も長さは分かるけど)

## 回避策
※ ARG_MAX が PAGE_SIZE より充分大きい環境が前提。

引数を無関係な文字列で埋める。
どれくらい長さがいるかは、PAGE_SIZE を調べれば良さそう。

http://stackoverflow.com/questions/199130/how-do-i-increase-the-proc-pid-cmdline-4096-byte-limit

でも ps コマンドを叩くと出力が鬱陶しいことになるので、なるべく使わない。

```console
$# 通常の実行
$ wget -q --user=foo --password=bar http://example.com/ &
$ ps auxww | grep wge[t]
hoge     23277  0.0  0.1 134300  2212 pts/0    S    00:17   0:00 wget -q --user=foo --password=bar http://example.com/

$# パディングして実行
$ s=$(getconf PAGE_SIZE)
$ pad=$(perl -e "print 'x' x $s")
$ wget -q --user=$pad --user=foo --password=bar http://example.com/ &
$ ps auxww | grep wge[t]
hoge     23281  0.0  0.1 134304  2212 pts/0    S    00:18   0:00 wget -q --user=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(以下略)
```

上記の例 (wget) だと後から指定した --user=foo の方だけが有効になる
引数の処理方法は実装に依存するので、コマンドによって適切な方法を使う。
java なら java -cp $pad -cp \<true_class_path\> class のようにする


## 参考: curl の引数隠ぺい

```c:src/tool_getparam.c
    case 'u':
      /* user:password */
      GetStr(&config->userpwd, nextarg);
      cleanarg(nextarg);
      break;
```

```c:src/tool_paramhlp.c
void cleanarg(char *str)
{
#ifdef HAVE_WRITABLE_ARGV
  /* now that GetStr has copied the contents of nextarg, wipe the next
* argument out so that the username:password isn't displayed in the
* system process list */
  if(str) {
    size_t len = strlen(str);
    memset(str, ' ', len);
  }
#else
  (void)str;
#endif
}
```
Google Cloud Storage をバックエンドにした Docker Registry をセットアップ


Docker を本気で使うなら private docker registry の構築は必須です。Google Compute Engine (GCE) を使い始めたので、GCE 上に docker registry をセットアップすることにしました。

docker registry 自体を docker コンテナで動かすのは簡単ですが、ローカルディスクを使ってしまうと運用が面倒です。少しぐぐれば Amazon S3 を使った例がでてきますが、GCE を使うのでどうせなら Google Cloud Storage (GCS) を使いたい！

試してみたらあっさり成功したので、記録しておきます。

## GCS のバケットを作成
docker イメージを格納する用のバケットを作成します。仮に名前を docker-bucket としますので、各自読み替えてください。バケット名は全ユーザで共有するリソースなので、名前が取られていたら諦めて別の名前にしましょう。

```bash
$ gsutil mb -l ASIA gs://docker-bucket
```

ASIA リージョンに作るよう指定しています。これを忘れると US リージョンに作成されてしまいますのでご注意ください。

## GCE にインスタンスを追加
```bash
$ gcutil addinstance docker-registry
```

起動する OS イメージを聞かれるので、backports-debian-7 を選択します。

起動したら ssh して docker をインストールします。

```bash
$ gcutil ssh docker-registry
```

```bash
$ curl get.docker.io | bash
$ sudo update-rc.d docker defaults
```

## 認証用のコンテナを実行
Google Cloud Platform へアクセスするための認証情報を保持するためのコンテナが提供されているので、まずこれを実行します。

```bash
$ sudo docker run -ti --name gcloud-config google/cloud-sdk gcloud auth login
```

OAuth 認証のための URL が表示されるので、認証して verification code を入力します。

## Docker Registry を実行
```bash
$ sudo docker run -d -e GCS_BUCKET=docker-bucket -e BOTO_PATH='/.config/gcloud/legacy_credentials/<email>/.boto' -p 5000:5000 --volumes-from gcloud-config google/docker-registry
```

`<email>` には Google アカウントのメールアドレスを入れてください。

以上で完了です。驚くほど簡単ですね。

## docker push してみる
以下のようにイメージを push できます。

```bash
$ sudo docker tag <image_id> localhost:5000/<name>[:<tag>]
$ sudo docker push localhost:5000/<name>[:<tag>]
```

## おわり
余談ですが、イメージ名の localhost:5000 の部分は push されるデータには含まれません。単に docker registry のアドレスを示しているだけです。なので、バックエンドを共有する複数の docker registry を構築して同時に運用することができます。

別に GCE 上の docker ホストである必要はありません。GCS にだけアクセスできればいいので、環境を問わないのがいいですね。
幅優先探索の勉強@Java修正版



基本、私が今勉強している内容についてコードを載っけたりしていきます。今回は、(BFS)について、エアコンの温度を変化させる問題(http://arc001.contest.atcoder.jp/tasks/arc001_2)
について検証します。
まだ学校でHashMapを習っていないので、ぼんやりとしか分からないのですが、コメントアウトで分からない点をまとめてみました。
また、DPの練習が足りていないので、もしDPの問題についてご存知の方がいらっしゃいましたら、教えて頂けると幸いです。
コード：

```java:air_conditioner
package my_practice;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class AtCoder_145133 {
void doIt() {
Scanner stdIn = new Scanner(System.in);
int a = stdIn.nextInt();
int b = stdIn.nextInt();

    //幅優先探索の準備
    Queue<Integer> q = new LinkedList<Integer>();
    q.add(a);

    //遷移回数を入れるMapを用意する
    HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
    hm.put(a, 0);

    //遷移先６カ所を配列にしておく
    int[] v = new int[]{-10, -5, -1, 1, 5, 10};

    while(!q.isEmpty() && !hm.containsKey(b)) {
        int now = q.poll();
        //６種類の遷移先を調べる
        for(int r = 0; r < v.length; r++) {
            int next = now + v[r];

            //もし既にnextが発見されていたらcontinue
            if(hm.containsKey(next)) continue;

            //そうでなければ、nextをキューに追加
            q.add(next);
            //遷移回数も追加
            hm.put(next,  hm.get(now) + 1);
        }
    }
    System.out.println(hm.get(b));
}
public static void main(String[] args) {
    // TODO Auto-generated method stub
    new AtCoder_145133().doIt4();
}


void doIt4() {
    Scanner stdIn = new Scanner(System.in);
    int a = stdIn.nextInt();
    int b = stdIn.nextInt();

    Queue<Integer> q = new LinkedList<Integer>();
    q.add(a);

    HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
    hm.put(a, 0);

    int[] v = new int[]{-10, -5, -1, 1, 5, 10};

    while(!q.isEmpty() && !hm.containsKey(b)) {
        int now = q.poll(); //探索中の温度を保持する
        System.out.println("now = " + now); 
        for(int r = 0; r < v.length; r++) { //あり得る変化温度を試行していく
            int next = now + v[r]; //次に現在の値となる温度。（次と言っているのにここ（今）にあるのが感覚的に納得いっていない）
            System.out.println("next = " + next + "(" + now + "+" + v[r] + ")");
            if(hm.containsKey(next)) continue; //hmが既にnextを持っていたら以下の処理を無視
                                               //hmがnextを持っていたら、そこを見る必要が無いという意味だと解釈したが、どうして無視出来るのかまでは分からない。

            q.add(next); //キューにnextを保持させておく。qは、逐次要素１の温度を保持しておくための連結リストなのだろうか？
            System.out.println("hm.get(now) + 1 = " + hm.get(now) + 1);
            hm.put(next, hm.get(now) + 1); //hm.get(now) + 1はどういった意味が有るのか？
        }
    }
    System.out.println(hm.get(b));
}
```
MacVim に VimShell をインストールする。


VimProcを併せてインストールする必要がある。

[環境]
- OS X Mavericks 10.9.3
- MacVim Custom Version 7.4 (KaoriYa 20140501)

```スクリプトinstall_vimshell
# リソースを取得する
mkdir hoge
cd hoge
git clone https://github.com/Shougo/vimproc.vim
git clone https://github.com/Shougo/vimshell.vim

# vimprocをmakeする
cd vimproc.vim
make
cd ..

# vimprocのインストール
cp -r vimproc.vim/autoload ~/.vim
cp -r vimproc.vim/plugin ~/.vim

# vimshellのインストール
cp -r vimshell.vim/autoload ~/.vim
cp -r vimshell.vim/plugin ~/.vim
```


```実行結果
$
$ ./install_vimshell
Cloning into 'vimproc.vim'...
remote: Reusing existing pack: 4197, done.        
remote: Counting objects: 99, done.        
remote: Compressing objects: 100% (73/73), done.        
remote: Total 4296 (delta 61), reused 23 (delta 21)        
Receiving objects: 100% (4296/4296), 1.10 MiB | 543.00 KiB/s, done.
Resolving deltas: 100% (2305/2305), done.
Checking connectivity... done.
Cloning into 'vimshell.vim'...
remote: Reusing existing pack: 12345, done.        
remote: Counting objects: 20, done.        
remote: Compressing objects: 100% (20/20), done.        
remote: Total 12365 (delta 11), reused 0 (delta 0)        
Receiving objects: 100% (12365/12365), 4.65 MiB | 1005.00 KiB/s, done.
Resolving deltas: 100% (5736/5736), done.
Checking connectivity... done.
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f make_mac.mak
clang -O2 -W -Wall -Wno-unused -Wno-unused-parameter -bundle -fPIC  -o autoload/vimproc_mac.so autoload/proc.c 
$
$
```
nginx-buildでnginxにサードパーティモジュールを組み込む

# nginxのサードパーティモジュール

nginxにサードパーティのモジュールを組み込むにはnginx本体のビルド時に静的に組み込む必要がある。これはApacheと比べてnginxの数少ないめんどくさい点のうちの一つだ。具体的には`--add-module`で組み込みたいモジュールのパスを指定する。

```
$ ./configure --add-module=サードパーティモジュールのパス
```

nginxに依存ライブラリを静的に組み込むのと同様にこれも少々めんどくさい。[nginx-build](https://github.com/cubicdaiya/nginx-build)にはこの作業を自動化するための仕組みがある。

# nginx-buildでnginxにサードパーティモジュールを組み込む

nginx-buildでサードパーティモジュールを組み込むには以下のようなiniファイルを用意する。

```ini:modules3rd.ini
[echo-nginx-module]
form=git
url=https://github.com/openresty/echo-nginx-module.git
rev=v0.58
 
[headers-more-nginx-module]
form=git
url=https://github.com/openresty/headers-more-nginx-module.git
rev=v0.28
```

あとはこのファイルを`-m`オプションで指定して実行。

```
$ nginx-build -v 1.7.0 -d work -m modules3rd.ini
nginx-build: 0.6.2
Compiler: gc go1.5.2
2015/12/08 04:52:49 Download headers-more-nginx-module-v0.28.....
2015/12/08 04:52:49 Download nginx-1.9.7.....
2015/12/08 04:52:49 Download echo-nginx-module-v0.58.....
2015/12/08 04:53:03 Extract nginx-1.9.7.tar.gz.....
2015/12/08 04:53:03 Generate configure script for nginx-1.9.7.....
2015/12/08 04:53:03 Configure nginx-1.9.7.....
2015/12/08 04:53:10 Build nginx-1.9.7.....
2015/12/08 04:53:15 Complete building nginx!

nginx version: nginx/1.9.7
built by clang 7.0.0 (clang-700.1.76)
configure arguments: --with-cc-opt=-Wno-deprecated-declarations --add-module=../echo-nginx-module --add-module=../headers-more-nginx-module

2015/12/08 04:53:15 Enter the following command for install nginx.

   $ cd work/nginx/1.9.7/nginx-1.9.7
   $ sudo make install
```

という風に指定したURLから`git clone`でダウンロードしてそのままnginxに組み込んでくれる。今のところ`git clone`以外でダウンロードできない場合については対応していない。
apt-get updateでタイムアウトしてくれるときの設定

apt-getやaptitudeで以下のように出力されて、パッケージリストの更新が上手く行かないときの設定。

```bash
Err http://security.ubuntu.com trusty-security InRelease
Err http://security.ubuntu.com trusty-security Release.gpg
'security.ubuntu.com' を解決できませんでした
```

そもそもが…apt-getとかaptitudeって、複数のリポジトリに並列アクセスしているみたいなんだけど、
これやると、ネットワーク負荷が高くてタイムアウトしているように見える。
そこで、各リポジトリへのアクセスを直列化してしまうことで、全体の時間はかかるが、パッケージリストの更新に失敗することはなくなる（当然ながら、根本的にネットワークがダメだったり、リポジトリ側が落ちていたりするのは別）

http://askubuntu.com/questions/88731/can-the-update-manager-download-only-a-single-package-at-a-time
を参考に
/etc/apt/apt.conf.d/75download
に

```/etc/apt/apt.conf.d/75download
Acquire::Queue-Mode "access";
Acquire::http::Dl-Limit "70";
```

とすることで解決した。
他にも設定を入れてあげたら、結構よくなりそうな気がする。
nginx-buildでnginxの依存ライブラリを静的に組み込む

# nginxの依存ライブラリ

nginxにはいくつか依存ライブラリがあって代表的なものは以下の3つだ。

* zlib
* PCRE
* OpenSSL

実はGDも依存ライブラリの一つだが、これは特定のモジュール(ImageFilter)を組み込むときにしか必要ないのと、そもそもnginxに静的に組み込むための仕組みをnginxが提供していないので除外する。

# nginx-buildで依存ライブラリを静的に組み込む

[nginx-build](https://github.com/cubicdaiya/nginx-build)はこれらの依存ライブラリを静的に組み込む作業を自動化するための仕組みを提供している。手動でやるとこんな感じだ。

* 各ライブラリのアーカイブをダウンロードする(e.g. wget http://...)
* アーカイブを解凍する(e.g. tar zxf ...)
* nginxのconfigureオプションにパスを指定する(e.g. --with-pcre=解凍したライブラリのパス)

これはかなりめんどくさい。nginx-buildを使えばこのあたりを自動化できる。PCREなら`-pcre`オプションを使う。

```bash
$ nginx-build -d work -pcre
nginx-build: 0.6.2
Compiler: gc go1.5.2
2015/12/08 04:49:37 Download nginx-1.9.7.....
2015/12/08 04:49:37 Download pcre-8.38.....
2015/12/08 04:49:40 Extract nginx-1.9.7.tar.gz.....
2015/12/08 04:49:49 Extract pcre-8.38.tar.gz.....
2015/12/08 04:49:49 Generate configure script for nginx-1.9.7.....
2015/12/08 04:49:49 Configure nginx-1.9.7.....
2015/12/08 04:49:56 Build nginx-1.9.7.....
2015/12/08 04:50:09 Complete building nginx!

nginx version: nginx/1.9.7
built by clang 7.0.0 (clang-700.1.76)
configure arguments: --with-cc-opt=-Wno-deprecated-declarations --with-pcre=../pcre-8.38

2015/12/08 04:50:09 Enter the following command for install nginx.

   $ cd work/nginx/1.9.7/nginx-1.9.7
   $ sudo make install
```

特定のバージョンを指定したいなら`-pcreversion`が利用可能だ。

```bash
$ nginx-build -d work -pcre -pcreversion=8.38
```

zlibなら`-zlib`と`-zibversion`、OpeonSSLなら`-openssl`と`-opensslversion`で同様のことが可能だ。
nginx-buildでnginxをビルドする

https://github.com/cubicdaiya/nginx-build

[mysql-build](https://github.com/kamipo/mysql-build)や[xbuild](https://github.com/tagomoris/xbuild)のnginx版みたいなものをGoで書いてみた。

nginx単体のビルドは大して難しいものではないんだけど、
サードパーティモジュールやzlib、PCRE、OpenSSLといった依存ライブラリを静的に組み込もうとすると色々と面倒になってくるので、そのあたりを自動化したいと思ったのが開発の動機。言語がGoなのは完全に趣味。最初は頑張ってシェルスクリプトで書こうとしたが、完成形が定まっていないプロトタイピングの段階で生産性の低いツールを使うのはしんどかったのでやめた。

# インストール

nginx-buildはGoで書かれているのでまずはGoが必要。Goがインストールされていれば以下のコマンドでインストールは完了する。

```bash
$ go get -u github.com/cubicdaiya/nginx-build  
```

# nginx-buildでnginxをビルドする

では早速nginx-buildでnginxをビルドしてみよう。

```
$ uname
Darwin
$ nginx-build -v 1.9.7 -d work
nginx-build: 0.6.2
Compiler: gc go1.5.2
2015/12/08 04:55:03 Download nginx-1.9.7.....
2015/12/08 04:55:05 Extract nginx-1.9.7.tar.gz.....
2015/12/08 04:55:05 Generate configure script for nginx-1.9.7.....
2015/12/08 04:55:05 Configure nginx-1.9.7.....
2015/12/08 04:55:12 Build nginx-1.9.7.....
2015/12/08 04:55:16 Complete building nginx!

nginx version: nginx/1.9.7
built by clang 7.0.0 (clang-700.1.76)
configure arguments: --with-cc-opt=-Wno-deprecated-declarations

2015/12/08 04:55:16 Enter the following command for install nginx.

   $ cd work/nginx/1.9.7/nginx-1.9.7
   $ sudo make install

```

実行経過を詳細に出力するには`-verbose`オプションを使う。

```bash
nginx-build -v 1.9.7 -d work -verbose
```

# nginx-buildでnginxのビルドオプションを指定する

`nginx-build`でnginxの`configure`に付加するオプションを変更するにはまず自前の`configure`を実行するシェルスクリプトファイルを用意する。

```bash:myconfigure.sh
#!/bin/sh                                                                                                                                                     

./configure \
--with-http_gunzip_module \
```

`-c`でこのファイルを指定して再度実行する。

```bash
nginx-build -v 1.9.7 -d work -c myconfigure.sh
nginx-build: 0.6.2
Compiler: gc go1.5.2
2015/12/08 04:57:52 Download nginx-1.9.7.....
2015/12/08 04:57:54 Extract nginx-1.9.7.tar.gz.....
2015/12/08 04:57:54 Generate configure script for nginx-1.9.7.....
2015/12/08 04:57:54 Configure nginx-1.9.7.....
2015/12/08 04:58:01 Build nginx-1.9.7.....
2015/12/08 04:58:05 Complete building nginx!

nginx version: nginx/1.9.7
built by clang 7.0.0 (clang-700.1.76)
configure arguments: --with-http_gunzip_module

2015/12/08 04:58:05 Enter the following command for install nginx.

   $ cd work/nginx/1.9.7/nginx-1.9.7
   $ sudo make install

```

ゆくゆくはこれをベースにnginxenvとか作れるといいのかもしれない。
Rails4で、IEのみ特定のjsとCSSを読み込ませる。

Rails2以降触ってなかったので久しぶりにRails4を使ってみたらハマりました。

**2014/05/25 更新: コメントで教えて頂いた本来の正しい使い方を行うように内容を更新しました。**

# Assetsという仕組みが導入されてた。
Rails3辺りから、Assetsという仕組みが導入されたようです。

これは、jsやCSS(Scss)等を自動的にコンパイルや圧縮して一つのファイルとして参照できるようにしてしまおう！というものみたいです。
非常に便利なのですが、困ったことに`app/assets`配下にあるファイル全てを問答無用で対象としてしまうらしく、
それらが結果的に一つのjsやCSSになってしまう為、例えばHTML上に

```html
<!--[if lt IE 9.0]>
   ここにIE9未満で読み込ませたいjsやCSSを記述
<![endif]-->
```

のような条件付きコメントを使って「IE8以下でのみ読み込ませたいCSSやjs類」等があった場合に
どうして良いのか分からずハマってしまいました。

# 解決方法

正しいやり方を @youcune さんにコメントで教えて頂きました！
ありがとうございました！

## application.js/css に stub を追加

application.css や application.js には、冒頭のコメント行の中に以下のような行があります。

```js:application.js
//= require_tree .
```

```text:application.css
*= require_tree .
```

これは、Railsの Assets Pipeline の機能の一つらしく、
コメント行の先頭が`=`で始まる場合、それは directive と呼ばれるものの扱いになるそうです。

ディレクティブについては以下のページが詳しかったです。

http://d.hatena.ne.jp/tashen/20120624/p1

で、その中には stub ディレクティブというものが存在していて、
これを利用することで、特定のファイルのみをこの`application.css/js`に含まないよう除外設定を行う事ができるようです。

今回は、IE9以下専用に読み込ませたい1つのCSSと2つのjsファイルをそれぞれ定義してみます。

```js:application.js
//= stub externals/html5shiv
//= stub externals/respond.min
```

```text:application.css
*= stub ignore/ie
```

これで、コンパイル時にこれらの3つのファイルは`application.css/js`に含まれなくなりました。

## precompileに設定を追加

さて、これだけですとこれらのcss及びjsは、プリコンパイルされなくなってしまいますので、そのままでは`javascript_include_tag`等を使って呼び出す事ができなくなってしまいます。また、開発中にファイル名の後ろに付くダイジェスト等も生成されなくなってしまいちょっと不便です。

そこで、`config/initialize/assets.rb`というファイルを作成し、
precompileに追加してみます。

ちなみに、環境ごとにこの設定を変えたい場合は、`production.rb`等に書いたりすることもできるみたいです。

```rb:config/initialize/assets.rb
assets = Rails.application.config.assets
assets.precompile += %w(ignore/*.css)
assets.precompile += %w(externals/*.js)
```

これで以下のように、IE9未満でのみ読み込まれるjsとcssが`application.html.erb`に記述できました。

```html+erb:application.html.erb
<!--[if (lt IE 9) & (!IEMobile)]>
  <%= stylesheet_link_tag 'ignore/ie', media: 'all', 'data-turbolinks-track' => true %>
  <%= javascript_include_tag 'externals/html5shiv', 'data-turbolinks-track' => true %>
  <%= javascript_include_tag 'externals/renspond.min', 'data-turbolinks-track' => true %>
<![endif]-->
```

これで期待通り、IE9未満でのみ特定のjs及びCSSを読み込ませる事ができました♪
PyPIにパッケージ登録する


初めてPyPIにパッケージを登録したので、やったことをまとめておく。

* https://github.com/edvakf/nbupload
* https://pypi.python.org/pypi/nbupload

## setup.pyできるようにする

ディレクトリ構造はこれ以上ないぐらい簡単。

```
.
├── LICENSE.txt
├── README.md
├── nbupload
│   ├── FileUploaderView.js
│   ├── FileUploaderWidget.py
│   └── __init__.py
└── setup.py
```

git管理するので[Python用.gitignore](https://github.com/github/gitignore/blob/master/Python.gitignore)も入れておく。

最低限のsetup.pyを書く。`packages=['nbupload']`というのが、ディレクトリ名をパッケージにする書き方。詳しくは[ドキュメント](http://docs.python.jp/2/distutils/setupscript.html)を参照。

```python
from setuptools import setup

setup(
    name = "nbupload",
    version = "0.0.1",
    packages=['nbupload'],
)
```

これで、

```bash
python setup.py develop
```

と打つと、develop用にインストールされ、普通にimportすることができる。実体としては、pythonのsite-packagesディレクトリにnbupload.egg-linkというファイルがあり、この中にパッケージのディレクトリへのパスが書いてあった。

アンインストールするには

```bash
python setup.py develop -u
```

でよい。

## pypiに登録する

setup.pyは上のだと寂しいので[いろいろ追加する](https://github.com/edvakf/nbupload/blob/master/setup.py)。

pypiのアカウントが無い場合はアカウントを取得する。パッケージ登録テスト用のtestpypiというのもあるので、そちらにも同様の手順でアカウント登録する。登録するパスワードはプレーンテキストでホームディレクトリに置く必要がある（すぐ消してもいいけど）ので注意。

 * https://pypi.python.org/
 * https://testpypi.python.org/

パスワードは16文字以上で大文字小文字数字が無いとダメだった気がする。GoogleのOpenIDはGoogleが新規登録をサポートしなくなったので使えない。

ホームディレクトリに.pypircを作る。（pypiにだけ登録するのであればこれを置かなくても良いっぽい(?)けど、testpypiがあるとこれを置かないといけない）

[ここ](http://peterdowns.com/posts/first-time-with-pypi.html)を参考にした。

```ini
[distutils]
index-servers =
    pypi
    pypitest

[pypi]
repository: https://pypi.python.org/pypi
username: {{your_username}}
password: {{your_password}}

[pypitest]
repository: https://testpypi.python.org/pypi
username: {{your_username}}
password: {{your_password}}
```

testpypiに登録。

```
python setup.py register -r https://testpypi.python.org/pypi
```

これでpypiに項目ができ、`pip search --index https://testpypi.python.org/pypi nbupload`でも出るようになる。

ただ、このままだとまだどこにもパッケージの実体が無い状態なので、gzipをアップロードしないといけない。setup.pyにdownload_urlと書いてgithubのtagのgzipを指定することもできるが、デフォルトでは`pip install`はpypi以外のURLを無視するので（`--allow-external`をつければ通る）、pypi自体にアップロードするのが良い。それをするのが次のコマンド。

```
python setup.py sdist upload -r https://testpypi.python.org/pypi
```

これで`pip install --index-url https://testpypi.python.org/simple/ nbupload`でインストールできるようになる。

ここまでできればあとは本番pypiに登録するだけ。

```
python setup.py register
python setup.py sdist upload
```

で終了。

## おまけ: python以外のファイルをパッケージに含める

今回はJSをパッケージに含めて配布する必要があるため、setup.pyにこう書かないといけなかった。

```python
    package_data = {
        'nbupload': ['FileUploaderView.js'],
    },
```

これをしないと、デフォルトでは`python setup.py sdist upload`でパッケージングするときにpython以外のファイルが含まれない。

 * [パッケージデータをインストールする](http://docs.python.jp/2/distutils/setupscript.html#distutils-installing-package-data)
MacBookPro のディスプレイのメーカを調べる


```
ioreg -lw0 | grep \"EDID\" | sed "/[^<]*</s///" | xxd -p -r | strings -6
```

実行結果（3行目に出力されるシリアル番号っぽいのは割愛）

>Color LCD
LP154WT1-SJA1

LG製のようだ。
ディスプレイのゴースト現象が報告されている文字列と一致した。

2行目先頭の文字列とメーカーの対応は次の通り：
- LP なら LG
- LSN なら Samsung
Boxerがおもしろい(BoxenやBoxが流行りの中で)

Boxerとは？
==========
Mac用のDOSゲームのエミュレータです。

## 流行りのBoxenやBoxとは何が違うのか？
全く違います。
BoxenはGitHubが開発したディベロッパーの開発環境を自動構成するツールです。
Boxはクラウドストレージサービスで、最近企業向け日本語版サービスを開始すると発表しました。

## なぜ全く違うものを列挙したのか？
字面が(ry

## Boxerのインストールしてみる？
1. 公式サイトからzipをダウンロードして展開します。 http://boxerapp.com/
2. Boxer.appをアプリケーションディレクトリに移動します。
3. Boxer.appを起動します。

## DOSレトロゲームをダウンロードしてみる？
1. 例えばMy Abandonwareというサイトを覗きます。 http://www.myabandonware.com/
2. おもむろに懐かしのゲームを探してダウンロードします。  
PRINCE OF PERSIA http://www.myabandonware.com/game/4d-prince-of-persia-1mr
3. ダウンロードしたゲームのzipを展開します。

## DOSレトロゲームをプレイしてみる？
1. 起動したBoxerで"Import a new game"を選択します。  
![スクリーンショット 2014-05-24 18.10.43.png](https://qiita-image-store.s3.amazonaws.com/0/11757/00688107-c71d-d6a3-7103-93d1dfc03159.png)
2. 先ほどゲームのzipを展開して生成されたディレクトリをBoxerのウィンドウにドラッグアンドドロップします。  
![スクリーンショット 2014-05-24 18.12.42.png](https://qiita-image-store.s3.amazonaws.com/0/11757/e51f1952-ee2a-6aef-798d-9af560e9125b.png)
3. "Launch game"を選択してDOSのエミュレータを起動します。
4. "Click a program to launch:"で表示されているexeを選択します。  
![スクリーンショット 2014-05-24 18.13.30.png](https://qiita-image-store.s3.amazonaws.com/0/11757/3e88ac50-def7-903a-b5fc-a2f5d7232594.png)
5. 楽しいゲームの世界が始まります。操作方法は覚えているでしょう？  
![スクリーンショット 2014-05-24 18.22.38.png](https://qiita-image-store.s3.amazonaws.com/0/11757/6e1d4849-5975-8bd6-5150-fe98b0558878.png)
6. ゲームから抜け出したくなったなら、Cmdキーを押しながらクリックでマウスカーソルが復帰します。

## Have a nice game !
:-D
.gvimrc に追加したもの


```.gvimrc
set number
set list
set cursorline
set colorscheme evening
```

**[注意].vimrcに追加せずに、.gvimrcに追加すること。以下理由：**

https://code.google.com/p/macvim-kaoriya/wiki/Readme
>GUIに関係しない設定、たとえば tabstop, shiftwidth, expandtab, wrap, showmatch などの設定はホームフォルダ/.vimrc(~/.vimrc)にて設定します。

>GUIに関する設定、たとえば columns, lines, guioptions, transparency, antialias, colorscheme などの設定は ホームフォルダ/.gvimrc(~/.gvimrc)にて設定します。
Eclipseを最小で

Eclipseを最小限で導入したい場合、時間がかかるがJDT(plugin)などを追加インストールしてくことで実現出来る（と思われる）
以前は、Eclipse classicというパッケージが存在したが、最近ではJDTを含む形でEclipse Standardとなってるようで、Eclipse Pluguin SDKがデフォルトで付いてくるようである。
（微々たるサイズなので、普通はこれか、Java Developersを使うといいと思う）

そこで、今回は最小構成からそれぞれのプラグインを追加していくための、最小構成（Eclipse StandardにはPlugin SDKなどが入っているから最小構成ではないとする）を導入する手順をメモしておく。
基本的に、ダウンロードページが違うだけ。

以下のサイトから「<version [ex) 4.3.2]>」->「Download now: Eclipse SDK,」とたどり、「Platform Runtime Binary」にあるEclipseを動作させるプラットフォーム向けのバイナリをダウンロードする。
http://download.eclipse.org/eclipse/downloads/

あとは、任意の場所に展開して、アップデートサイトなりを使って色々と必要な物を導入していく。
Cocos2dx-3.0ではまったところ備忘録（Android)（Win7)

環境構築はココ
http://wiki.xsqi.net/index.php?%A5%D7%A5%ED%A5%B0%A5%E9%A5%E0%2FCocos2d-x%2FCocos2d-x%B3%AB%C8%AF%B4%C4%B6%AD%A4%CE%B9%BD%C3%DB

EclipseでAndroid開発していた人は，NDKの設定を忘れないように．
画像はプロジェクトフォルダー内のResourcesに入れましょう．
（Eclipse内のsrc>drawable-hogehogeフォルダじゃありません！）

コンパイルはコマンドプロンプトからbuild_native.pyでコンパイル．
Eclipseで一度クリーンしてから
デバッグ>Androidアプリケーション

私はこれでできました．
Symfonyのセットアップ

１. インストール時にやること

(1)web/app_dev.phpの下記の行をコメントアウト。

```php
if (isset($_SERVER['HTTP_CLIENT_IP'])
    || isset($_SERVER['HTTP_X_FORWARDED_FOR'])
    || !in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', 'fe80::1', '::1'))
) {
    header('HTTP/1.0 403 Forbidden');
    exit('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.');
}
```
(2)app/autoload.phpに下記を追加

```php
<?php
umask(0000);
```
(3)バンドルを作成する

`app/console generate:bundle`



２. 不要なバンドルの削除

AcmeDemoBundleというサンプル用のバンドルが用意されているのでこれを削除する。
(1)app/AppKernel.phpから下記の行を削除

```php        
if (in_array($this->getEnvironment(), array('dev', 'test'))) {
            $bundles[] = new Acme\DemoBundle\AcmeDemoBundle();
        }
```
(2)app/config/routing_dev.ymlからAcmeDemoBundleへのルーティングを削除する
(3)`rm -rf src/Acme/`する

３. Entityの作成
DBを作成後Entityを自動生成する。最初にparameter.ymlでDBの設定を忘れずに。
（下記URL参照）
http://docs.symfony.gr.jp/symfony2/cookbook/doctrine/reverse_engineering.html

４. カスタムリポジトリの作成
http://tutorial.symblog.co.uk/docs/extending-the-model-blog-comments.html
Vagrant(CentOS6.5)にRuby2.1.2 Rails4.1をインストール


何番煎じかわかりませんが、自分への忘備録を兼ねて載せておきます。

## Vagrant
1. 作業ディレクトリの作成
<code>$ mkdir -p path/to/rails && cd path/to/rails</code>

1. Boxをダウンロード
<code>$ vagrant box add centos65box https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box</code>


1. マシンの初期化
<code>$ vagrant init centos65box  
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
</code>

1. マシンの起動
<code>$ vagrant up</code>

## Ruby 2.1.2
1. rbenvのインストール
[anyenv](https://github.com/riywo/anyenv)を利用してインストールします。
<code>$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(anyenv init -)"' >> ~/.bash_profile
$ exec $SHELL -l
$ anyenv install rbenv
$ exec $SHELL -l</code>

1. Ruby 2.1.2のインストール
<code>$ rbenv install -v 2.1.2</code>
OpenSSLが入っていないと言われるのでインストール
<code>$ sudo yum -y install openssl openssl-devel</code>
ruby 2.1.2を標準に
<code>$ rbenv global 2.1.2</code>

## Rails 4.1
1. gemを最新に
<code>$ gem update --system</code>
1. Railsのインストール
<code>$ gem install rails --no-ri --no-rdoc -V</code>
1. 反映
<code>$ rbenv rehash</code>
1. version確認
<code>$ rails -v  
Rails 4.1.1 
</code>