OmniAICreator/Qiita-1.07M huggingface dataset:
promise - asynchronous process

## What is promise?
非同期処理を抽象化したオブジェクトとそれを操作する仕組みのこと．
複雑な非同期処理等をうまくパターン化できるというのがPromiseの役割

```javascript:promise-workflow.js
var Promise = require('promise');

function asyncFunction () {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      resolve('Async Hello World');
    }, 10000);
  });
}

asyncFunction().then(function (value) {
  console.log(value);
}).catch(function (error) {
  console.log(error);
});
```

###Memo
Javascriptにおける非同期処理といえば，コールバックを利用する場合が多い．

## Sample
```javascript:sample.js
var Promise = require('promise');

function taskA() {
  console.log("Task A");
  return 2;
}
function taskB(value) {
  console.log("Task B");
  return value * 2;
}
function onRejected(error) {
  console.log("Catch Error: A or B", error);
}
function finalTask() {
  console.log("Final Task");
}
function output (value) {
  console.log(value);
}
var promise = Promise.resolve();
promise
  .then(taskA)
  .then(taskB)
  .then(output)
  .catch(onRejected)
  .then(finalTask, onRejected);
```

###Promise.all and Promise.race
Promise.all: Promise の and
渡した全てのpromiseがFulFilled または Rejectedになるまで次の処理を待つ．

Promise.race: Promise の or
どれか一つでもpromiseがFulFilled または Rejectedになったら次の処理を実行する

```javascript:sample.js
var Promise = require('promise');

var winnerPromise = new Promise(function (resolve) {
  setTimeout(function () {
    console.log('this is winner');
    resolve('this is winner');
  }, 4);
});
var loserPromise = new Promise(function (resolve) {
  setTimeout(function () {
    console.log('this is loser');
    resolve('this is loser');
  }, 1000); });
// 一番最初のものがresolveされた時点で終了
Promise.race([winnerPromise, loserPromise]).then(function (value) {
console.log(value);    // => 'this is winner'
});
```
SpritePackerとLive2Dで配置時のポイント

Unity5で解禁になった元Pro版機能の1つ、[SpritePacker](http://docs.unity3d.com/ja/current/Manual/SpritePacker.html)を触っていてちょっとハマッたのでそのメモです。
SpritePackerは、複数の画像を1つにしドローコール(SetPass calls)を減らす機能です。

#SpritePackerの使い方
１）画像ファイルを複数選択し、Sprite画像を作ります。この時必ずPacking Tagを付けます
**　※　Texture TypeはAdvancedでもSprite ModeをNone以外にすればPacking Tagが表示されます**
![001.png](https://qiita-image-store.s3.amazonaws.com/0/15028/013daabc-8b7b-532e-90a6-46028e255263.png)

２）Packing Tagを付ける事で実行時に自動的にPackingしてくれます。
　今回は分かりやすく手動でやるので[Window]-[Sprite Packer]を選択しウィンドウを表示します

３）画像を複数選択した状態でPackボタン押下すると、Packingされます
![002.png](https://qiita-image-store.s3.amazonaws.com/0/15028/0bab30b9-439a-9b9b-100e-e5270fc619b9.png)

TightPackerPolicyにしてPackすると余白の無駄を少なく最適化してくれます
![003_.png](https://qiita-image-store.s3.amazonaws.com/0/15028/5bc852eb-f07c-b243-19f3-cd531c2ab6bd.png)
※　ちなみにSprite Packer上の配置はドラッグして移動したりできません

４）Sceneに配置して実行してみるとPackingされてる事がわかります。
　SetPass callsの1つはCameraだと思います。あと実行前はSetPass callsが4になってました
![005.png](https://qiita-image-store.s3.amazonaws.com/0/15028/c90aab32-d13f-261c-4985-508b0eca259f.png)

#SpritePackerのイマイチな点
標準機能でPakingしてくれるのはありがたいのですが、イマイチな点もありました。

####１）Resourcesフォルダ配下だとPakingしてくれない
[Unity Forums](http://forum.unity3d.com/threads/unity-4-5-sprite-packer-does-not-pack-images-inside-resources-folder.248349/)でも同じ事で詰まってる人いました。どうやら仕様っぽいですが、SpritePackerを初めて触った時「あれ？Pakingしてくれなんだけど？？」って1hぐらいハマった・・・。

####２）jpgとpngで同じグループにしてくれない
先ほどのボタン(png)グループに、背景画像(jpg)も追加してPakingしてみました。
![006.png](https://qiita-image-store.s3.amazonaws.com/0/15028/bbf22168-2b67-5398-3f1a-de46a1977084.png)
画像サイズのせいかと思ってボタン画像をjpg保存して、Pakingしても同様にグループ分けされました。
同じグループでないので当然SetPass callsも1つ増えました。


NGUIなどでお馴染みのAtlas化すればpngもjpgもまとめて1つになり、SetPass callsもCamera分と合わせて2になりました。
Atlas確認は[ケットシーウェアさんの簡易SpritePacker](http://caitsithware.com/wordpress/archives/263)を使わせていただきました。
![007.png](https://qiita-image-store.s3.amazonaws.com/0/15028/fcc0f6b2-7f2b-f973-9773-6f32547b09da.png)

現状としては、Atlas化した方がいいかな～っと思います。

#SpriteをLive2Dに配置する時の注意点
Live2Dを使う時にSpriteを配置すると、Live2Dモデルが前面に表示されメッセージウィンドウなどが奥に表示されてしまいます。
![2015-04-09_14h40_35.png](https://qiita-image-store.s3.amazonaws.com/0/15028/164ff846-27a5-2787-52d0-a2c10eae5472.png)
これはLive2Dの描画がOnRenderObject()で行われるため、LayerやSorting Layerを変更しても効果はありません。

解決法としては、UGUIのImageを使うと解決できます。
[Hierarchy]-[Create]-[UI]-[Image]で追加するとこんな感じにメッセージウィンドウなどが前面に表示されます。
![008.png](https://qiita-image-store.s3.amazonaws.com/0/15028/66dcb907-26f2-6576-ffc5-c4b43a428391.png)
ただ、UGUIのCanvasがOverlayでないと全面に表示されないので注意して下さいね。
![009.png](https://qiita-image-store.s3.amazonaws.com/0/15028/2ecc459d-96e7-c913-d18b-b40e057d2523.png)
Babelをローカルにインストールしてみる

https://babeljs.io/docs/learn-es6/ のコードを試してたら http://www.es6fiddle.net/ で試せない例が出てきたのでローカル環境にBabelを入れることにしました。

#Using Babel
https://babeljs.io/docs/using-babel/
Node.js・npmが必要です。
`npm install babel -g` を実行。

テストファイル作成

``` script.js
console.log("Hello Babel");
```
https://babeljs.io/docs/usage/cli/#babel-node
babel-nodeを実行

```
C:\workspace\babel>babel-node script.js
Hello Babel
```

簡単！

#コンパイルする場合
https://babeljs.io/docs/usage/cli/#compile-directories
ソースディレクトリをコンパイルします

```
C:\workspace\babel>babel src --out-dir dest
src\lib\math.js -> dest\lib\math.js
src\script.js -> dest\script.js

C:\workspace\babel>
```
Reserved Instances が expire される前に通知する

そういう機能がある気もしますが、bash で書けたので晒してみます。
*cron* などで日次で動かすことを想定しています。

この内容だと、30/15/7日前に通知メールを送信するようになっています。

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

# Reserved Instance expire checker

from_address="_from_mail_address_"
to_address="_to_mail_address_"

notification()
{
    MAILBODY="""
ReservedInstances will expire ${d} days after.
please consider buying.

AZ : ${AZ}
InstanceType : ${INSTANCE_TYPE}
InstanceCount : ${INSTANCE_COUNT}
"""

    echo "${MAILBODY}" | mail -s "ReservedInstances Notification" -r ${from_address} ${to_address}

}

check_ri()
{
    ACTIVE_RIS=$(aws --region ap-northeast-1 ec2 describe-reserved-instances \
        --query 'ReservedInstances[?State!==\`Retired\`].[End,AvailabilityZone,InstanceType,InstanceCount,State]' \
        --output text)

    echo "${ACTIVE_RIS}" | while read line
    do
        AZ=$(echo "${line}" | awk {'print $2'})
        INSTANCE_TYPE=`echo "${line}" | awk {'print $3'}`
        INSTANCE_COUNT=`echo "${line}" | awk {'print $4'}`

        TODAY=$(date +'%Y%m%d')
        END_DATE=$(echo "${line}" | awk {'print $1'} | cut -d T -f 1)
        CHECK_DATE_1=`date -d "${END_DATE} - 30 days" +'%Y%m%d'`
        CHECK_DATE_2=`date -d "${END_DATE} - 15 days" +'%Y%m%d'`
        CHECK_DATE_3=`date -d "${END_DATE} - 7 days" +'%Y%m%d'`

        if [ ${TODAY} -eq ${CHECK_DATE_1} ]; then
            d="30"
            notification
        elif [ ${TODAY} -eq ${CHECK_DATE_2} ]; then
            d="15"
            notification
        elif [ ${TODAY} -eq ${CHECK_DATE_3} ]; then
            d="7"
            notification
        fi
    done
}

check_ri && exit 0
```


元記事は[こちら](http://rriifftt.hatenablog.com/entry/2015/04/09/115925)
printf() > size_t型の書式指定子 > %zu

[SO](http://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct-equal-to-the-sum-of-sizeof-of-each-member)のやり取りを見ている中で、「Don't print size_t with the %d format specifier, it invokes undefined behavior」という記載があった。 知らなかった。

元々の質問では以下のような部分で`%zu`でなく`%d`を使っていたのだろう。
```
printf("oneInt=%zu\n",sizeof(struct oneInt));
```


また、`%zu`でなく`%u`の場合の問題としては、64bit machineでコンパイル時に警告がでるとのこと
[SO: How to print size_t variable portably?](http://stackoverflow.com/questions/2524611/how-to-print-size-t-variable-portably)

32bit, 64bitで共通のコードとする場合は`%zu`を使っておく方が無難であるようだ。

長さ修飾子`z`はC99から導入されたようだ [Wikipedia](http://ja.wikipedia.org/wiki/Printf#.E9.95.B7.E3.81.95.E4.BF.AE.E9.A3.BE.E5.AD.90)
マウスオーバ時に出るプルダウンリスト

めもーん。
★jQuery読み込む。
★２つあるtest__categoryLink aタグ中の文言は同じにする。（以下だと、「リンク」という文言のこと）

```html

<div class="test" data-hoge-hoge="block"><span class="test__categoryLink"><a href="#" data-hoge-hoge="button">リンク</a></span>&nbsp;
	<div class="test__categoryBlock" data-hoge-hoge="button">
	<p class="test__categoryLink"><a href="#">リンク</a></p>
	<ul class="test__categoryBlock__list">
		<li><a href="#">リスト１</a></li>
		<li><a href="#">リスト２</a></li>
		<li><a href="#">リスト３</a></li>
	</ul>
	</div>
</div>
```

```css
/* reset */
html,body,div,span,
p,img,ul,li {
  background: transparent;
  border: 0;
  font-size: 100%;
  margin: 0;
  outline: 0;
  padding: 0;
  vertical-align: baseline;
}
ul li {
  list-style: none;
}
a {
  margin: 0;
  padding: 0;
  background: transparent;
  font-size: 100%;
  vertical-align: baseline;
  text-decoration: none;
  color: #fd1e69;
}
a:hover {
  color: #333;
}

.test {
  position: relative;
  margin: 40px;
}
.test .test__categoryLink a {
  padding: 0 15px 0 0;
  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAGBAMAAADj6an2AAAALVBMVEUAAABmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmaTgChpAAAAD3RSTlMA+/Psw7Oij1VDNSgKxCHshRGqAAAAKElEQVQI12MoYGAAYjEGBjYBhsYYnsAGBk6Vt5pAwcXCC4AktzcDAwBmDQW2A333EQAAAABJRU5ErkJggg==) right 6px no-repeat;
}
.test.on .test__categoryLink a {
  padding: 0 15px 0 0;
  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAGCAMAAAAmGUT3AAAAM1BMVEUAAABmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZwOlLNAAAAEXRSTlMA++8HxEM1KLSzpKOQj1VUItzUG5EAAAAxSURBVAjXJcGHEQAhDASxPdvAB1L/1cKAxFaicGSTZbZkMcMSdL2OPxrod8A/0bjqAhPEALbnEC5FAAAAAElFTkSuQmCC) right 6px no-repeat;
}
.test .test__categoryBlock__list > li {
  margin-bottom: 5px;
  text-indent: -8px;
  padding-left: 8px;
}
.test.on .test__categoryBlock__list a {
  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAHAQMAAAAVq36TAAAABlBMVEW/v78AS7E2lsyyAAAAAXRSTlMAQObYZgAAABJJREFUGBljbmBmAEMJZgPmBAAIngE+HFgy7QAAAABJRU5ErkJggg==) 0px 4px no-repeat;
  padding: 0px 0px 0px 10px;
  float: none;
}
.test.on .test__categoryBlock {
  position: absolute;
  top: -8px;
  left: -12px;
  display: block;
  padding: 6px 10px 6px 10px;
  border: 2px solid #67a5dd;
  border-radius: 2px;
  background-color: #fff;
}
.test.on .test__categoryBlock__list {
  margin-top: 6px;
  padding-top: 6px;
  border-top: 1px dotted #bfbfbf;
}
.test .test__categoryBlock {
  display: none;
}
```

```js

$(function() {
  $('[data-hoge-hoge="button"]').on('mouseenter mouseleave',function(){
    $('[data-hoge-hoge="block"]').toggleClass('on');
  });
});

```

## こんな感じになる。
![キャプチャ0.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/6bb66595-6118-94c3-d3b4-0250cbbabcce.png)
　　↓
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/88bb56ed-da99-0e8c-12f0-09eac091b72c.png)

動いているものはこちら
https://jsfiddle.net/Ricoliz/o3xo1mfj/3/embedded/result/
はじめての Go 言語 (on Windows)

- [The Go Programming Language](https://golang.org/)
- [golang.jp - プログラミング言語Goの情報サイト](http://golang.jp/)

## まずはインストールと動作確認

Go言語はコンパイル言語である。プラットフォームとして FreeBSD, Lunux, Mac OS X, Windows などがある。コンパイラの実装としてはネイティブの gc コンパイラと gcc 版 go コンパイラ（gccgo）が存在する（当然ネイティブのほうが安定している、らしい）。 Windows 用には MinGW 版の gccgo がある（ただし MSYS 等の周辺ツールは必要ない）。

現時点（2015-04-09）での最新版は 1.4.2。 Windows 版では[ダウンロードページ](https://golang.org/dl/)にパッケージが用意されているのでダウンロードしてインストールすればよい。

Windows 版の場合、ルート直下の `C:\Go` フォルダとかとんでもないところにインストールしようとする。これが嫌なら、インストール時に任意のフォルダを指定すること。

インストールしたら環境変数 `GOROOT` にインストールフォルダ（例：`C:\Go`）をセットする。また環境変数 `PATH` に実行モジュールのあるフォルダ（例：`C:\Go\bin`）を追記しておく。（ただし、 `*.msi` のインストールパッケージでインストールする際はインストーラが環境変数を正しくセットしてくれる）

セットアップできたら動作確認する。

```shell
C:>go version
go version go1.4.2 windows/amd64
```

まずは、みんな大好き Hello World。

```go:hello.go
package main

import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}
```

このソースコード hello.go を compile and run。

```shell
C:>go run hello.go
hello, world
```

おおっ、動いた動いた。じゃあ、これを build して、実行モジュールを起動してみる。

```shell
C:>go build hello.go

C:>hello.exe
hello, world
```

よし。ちゃんと動くようだな。では、[次回](http://qiita.com/spiegel-im-spiegel/items/047a9bd6436e6391ddd4)へ続く。

## 目次

[目次はこちら](http://qiita.com/spiegel-im-spiegel/items/98d49ac456485b007a15#%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AE-go-%E8%A8%80%E8%AA%9E-on-windows)に移動。
FirstResponderを見つける

# はじめに
TextFieldを選択した時にキーボードで隠れないようにする際の事。

複数のTextFieldがある場合に、選択したTextFieldの下に調度良くキーボードが表示されるよう調整したかったため、どのコントロールがFirstResponderか取得する必要がありました。

調べた結果、こんな実装で取得できました。

# FirstResponder取得メソッド

```objc
+ (UIView *)findFirstResponder:(UIView *)view
{
    if (view.isFirstResponder) {
        return view;
    }
    
    for (UIView *subView in view.subviews) {
        
        if ([subView isFirstResponder]) {
            return subView;
        }
        
        UIView *responder = [self findFirstResponder:subView];
        if (responder) {
            return responder;
        }
    }
    
    return nil;
}
```

ユーティリティクラスのクラスメソッドとして実装しました。
UIViewのカテゴリにするのも良いと思います。

## 使い方

```objc
    UIView *control = [Utils findFirstResponder:self.view];
    
    // nilではない場合、FirstResponderが存在
    
    if ([control isKindOfClass:[UITextField class]]) {
        NSLog(@"%@", control.description);
    }

```

# おわりに
参考になりましたら幸いです。

# 参考
[Get the current first responder without using a private API](http://stackoverflow.com/questions/1823317/get-the-current-first-responder-without-using-a-private-api)
aws cli install mac


色んな所に手順ありすぎて無駄すぎですけどメモ

公式のドキュメントはこちらです。
http://docs.aws.amazon.com/ja_jp/cli/latest/userguide/tutorial-ec2-ubuntu.html#install-cli

でもpythonとかpipとか入れるのだるいのでhomebrew一択です。依存関係もだるい。

# homebrewをインストールする
## 事前準備
sudo できるパスワードいるので注意
## 事前準備2
事前準備はこちらを参考にXcodeのインストール含め
http://qiita.com/_daisuke/items/d3b2477d15ed2611a058

## homebrewインストール
http://brew.sh/index_ja.html
から以下の部分コピペしてシェルで実行

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

### 確認

	brew -v
	Homebrew 0.9.5

でたらOK

# aws cli のインストール

## installする
	brew install awscli
	
## 確認
	
	aws --version
	aws-cli/1.7.18 Python/2.7.6 Darwin/14.1.0
	
でたらOK


## 使えるようにプロファイル設定

	aws configure --profile システム名とか

キー名を聞かれるので入力	

	AWS Access Key ID []: 

シークレットキーを聞かれるので入力	

	AWS Secret Access Key []: 

利用するリージョンを聞かれるので入力（ap-northeast-1は東京リージョン）
	
	Default region name []: 

出力する結果形式を指定（defaultはjsonなので何もいれないでEnter）

	Default output format [None]: 


終わり
Python+OpenCVで画像類似度機能を作ってみた


## 概要
ある画像を複数の画像とグレースケールのヒストグラムで比較する機能をPythonで作ってみた時のメモ

## 環境
- Python 2.7.9

- Pyenv anaconda-2.1.0

- opencv 2.4.8 ( condaにてインストール )


## 実装

```python:image_compare.py

import cv2

def matching(self):

    im = cv2.imread('/to/image/path/image.jpg', cv2.IMREAD_GRAYSCALE) # 比較するImageFile
    image_hist = cv2.calcHist([im], [0], None, [256], [0, 256])

    target = self.compare_target_hist(image_hist)

    result = []

    while True:
        try:
            result.append(target.next())

        except StopIteration:
            break

    result.sort(reverse=True)

    return result[0][1]

# 比較されるImageFile
def gen_target(self):
    yield "to/image/path/4.jpg"
    yield "to/image/path/3.jpg"
    yield "to/image/path/5.jpg"
    yield "to/image/path/2.jpg"
    yield "to/image/path/1.jpg"

def compare_target_hist(self, image_hist):

    target_files = self.gen_target()

    while True:
        try:
            target_file = target_files.next()
            im = cv2.imread(target_file, cv2.IMREAD_GRAYSCALE)
            target_hist = cv2.calcHist([im], [0], None, [256], [0, 256])
            yield (self.compare_hist(image_hist, target_hist), target_file)

        except StopIteration:
            break

# ヒストグラムを比較の計算をしている
def compare_hist(self, hist1, hist2):
    total = 0
    for i in range(len(hist1)):
        total += min(hist1[i], hist2[i])
    return float(total) / sum(hist1)


if __name__ == '__main__':
    matching()
```
Qualys SSL LabsでスコアAがとれるnginxのTLS/SSLの設定方法

この記事は
http://mkuma.hatenablog.com/entry/2015/04/07/142649
のコピペです。

#この記事は

この記事は、2015/4/7現在、Qualys SSL LabsでスコアAがとれる、nginxのTLS/SSLの設定方法について説明するものです。   
TLS/SSLと書いていますが、後述しますがSSLは使用しません。   
また、TLS/SSLとはなにか、といった話題については触れません。細かい解説もしません。細かい解説は参考文献を参照してください。   

#具体的なconfファイルの記述例

```
server {
  listen 443 ssl;

  #実際の設定方法に合わせる
  server_name localhost;

  #nginxのバージョンを表示しないようにする
  server_tokens off;

  ssl on;

  #中間証明書とbindingしたものを指定する
  ssl_certificate /path/to/server.crt;

  #openssl req -nodes -newkey rsa:2048 -keyout YOURDOMAIN.key -out YOURDOMAIN.csr こんなかんじでkeyとcsrを作成した
  ssl_certificate_key /path/to/server.key;

  #SSLセッションを10分保持する
  ssl_session_cache builtin:1000 shared:SSL:10m;

  #もうSSLはv3も含めて使わない
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

  #古いcipherは使わない
  ssl_ciphers 'kEECDH+ECDSA+AES128 kEECDH+ECDSA+AES256 kEECDH+AES128 kEECDH+AES256 kEDH+AES128 kEDH+AES256 DES-CBC3-SHA +SHA !aNULL !eNULL !LOW !kECDH !DSS !MD5 !EXP !PSK !SRP !CAMELLIA !SEED';

  #ブラウザ側にcipherを選ばせないようにする
  ssl_prefer_server_ciphers on;

  #2048bitで生成したPFS cipherを使用する
  ssl_dhparam /path/to/pfs2048.pem;

  location / {
    #書きたいことを書く
  }
}
```

#注意

上記設定を行うと、IE6とJava1.6に影響が出ます。出ますが…古いしきっと誰も使っていないでしょう。

#次のステップ

HSTSを有効にすべき

```
add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains;'
```

それ用のヘッダを差し込むようにすればできる。
これでスコアA+を獲得することが可能。

#参考文献

[https://www.ssllabs.com/projects/best-practices/index.html]
WgetやCurlでGitHubのSSLが怒られた時

msysにzshいれて、いつもどおりCurlでGitHubからOh-my-zshのインストールシェル実行しようとしたら、証明書エラーとかいわれてできなかった

登録されている確認してみたら認証局の情報が空 

```
# cat /usr/ssl/certs/ca-bundle.crt


```
しかたがないので、認証局の証明書をもってきて追加しておく

```
# wget https://www.digicert.com/testroot/DigiCertHighAssuranceEVRootCA.crt --no-check-certificate
# cat DigiCertHighAssuranceEVRootCA.crt >> /usr/ssl/certs/ca-bundle.crt
```

たぶん、GitHubに限らず証明書系のエラーがでるときは使える
GRUB2のバグ対処まとめ

筆者の環境は以下のとおりである。
Lightning AM
CPU:AMD A8-7600 MPK

OSなしのモデルにfedora21をインストールした

すると起動すると
fedoraXXXXXXXXXXXXXXXXX
fedoraXXXXXXXXXXXXXXXXxxxxxのように複数選べるブートメニューのようなものが出てきた。

これはgrubと呼ばれるものらしい。
wikiには”GNUにて開発されている高機能なブートローダである”と書かれている。

ブートを知らない人はまずこの記事を見ないであろうので割愛する。

ブートするOSを管理するものだと思ってもらえばそれでいい。

grubとgrub2ではこの表示を消したりするやり方が異なる。
今回はgrub2を中心に書いていく。

ルート（sudo su）になってvim で /etc/default/grubを開く。
grub2以前ではgrub.cfgというファイルを編集するようだったらしいがgrub2からは/etc/default/grubを編集して最後にそれをBuild実行ファイルにするという流れらしい。
まだ新しいものでいろいろなバグがあるがfedoraを使った運命だろうｗ

そして以下の部分を編集する。

`GRUB_TIMEOUT=5（修正前） ` とデフォルトではなっているのでここを１にする。

`GRUB_TIMEOUT=1　（修正後） ` とする。
これは秒単位で５秒経てばタイムアウトして、`GRUB_DEFAULT`に設定されているOSを起動するというもの。

GRUB_DEFAULT=savedは以前起動したOSを起動するというオプション
GRUB_DEFAULT=0とすれば一番最初に登録されていたOSを起動する。次には１その次は２という流れで指定できる。


以下、私の環境の設定です。

##*/etc/default/grub*

```

GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
#最初に登録されたOSを起動する
GRUB_DEFAULT=0
#0にしたいところだがバグったりうまくいかないので１にする
GRUB_TIMEOUT=1
#0にしたいところだがバグったりうまくいかないので１にする
#メニューを非表示にして、一秒後にDEFAULTのOSを起動するという流れ
GRUB_HIDDEN_TIMEOUT=1
#これを追加しとくとバグが出なくなってうまくいく。
#trueだとカウントダウンされている間もメニューは非表示にするということ
GRUB_HIDDEN_TIMEOUT_QUIET=true
#サブメニューの非表示
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.lvm.lv=fedora/swap rd.lvm.lv=fedora/root rhgb quiet"
GRUB_DISABLE_RECOVERY="true"　

```

そして最後が一番重要。

grub-mkconfigしてbuildすると書いてあるサイトもあるが、これでは私の環境ではうまくいかなかった

なのでいかに修正して実行する

`grub2-mkconfig -o /boot/grub2/grub.cfg `


以上で私の環境ではうまくいった。
grub2は絶賛開発中らしいのでこれから仕様はどんどん変わっていくと思う。。

(2015/04/09)
aws-cli複数環境を扱う時のルール


aws cli 便利ですが複数環境使うときルール決めとかないと他の環境ところを触って壊すってのがあるので、自分のルールまとめてみました。

## AWSのアカウントごとにシステム名を決める。

- ad_system
- click_system
- etc...

など。重複しない名前に。-で単語区切りをやるとterminalでコピペしにくいから_区切りに

## システム名で分離できない時は、開発環境とか本番環境とかのsuffixつける

- ad_system_prod
- ad_system_dev
- click_system_prod
- click_system_dev
- etc...


## IAMユーザーは、組織内のメールの名前の部分+システム名にする

自分だと、、、

- my.name@ad_system_prod
- my.name@click_system_prod
- my.name@click_system_dev
- etc...

AWS Webのコンソールにログインした時、自分の名前が右上にでるんだけど環境の名前がついてないと、今どこにいるのか一切わからないワロス状態になるから。

## configureするときは、profileを必ずシステム名指定する。
configureでprofile指定しないで作るとそれがdefaultになるのでdefaultは設定しない。
default設定しないでおくと、--profile .... って必ずつけるくせがつくのと、うっかりプロファイル付けないで実行してもエラーになるから安心。
どこの環境を操作してるのかも明示的になるし。

## 作業用のshell作るとき必ず引数profile渡すように作る

だいたい、--profile $profile ってしてるんですが、引数渡さないで実行してもエラーになるから安心。


## configureのawsのcredensialは、自分専用のにする。
みんなで共用にするのではなくて、自分専用のにする。
CloudTrailとかの意味がなくなっちゃうから。

とりあえず。また何かあったら足します。

profileについては、こちらみとけばいいのでは。
http://qiita.com/kwsmkn/items/ce72d8e4cc35f1fc01b5

まとまってる
http://www.task-notes.com/entry/20141026/1414322858
LinuxでRPS/RFS/XPSを使いたい方へのシェルスクリプト

bcを使いますので、yum/aptなどで導入しておく必要があります。
CPUコア数は自動的に判定し、適切(全てのコアへ分散する)な設定を行います。

```shell-session:/etc/init.d/rpsxps
#!/bin/sh

# chkconfig: - 85 15

### BEGIN INIT INFO
# Provides:          rpsxps
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: rpsxps 
# Description:       rpsxps
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

### Environment variables
action="$1"
prog=$(basename $0)
fullbit=32

# Feel free to change any of the following variables for your app:
start(){
  echo -n $"Starting $prog: "
  for if in `ls /sys/class/net| grep -v lo`; do
    I=0
    for q in `ls /sys/class/net/${if}/queues/tx-*/xps_cpus`;do
      echo 2^${I}|bc > ${q}
      I=$(( ${I}+1 ))
    done
    for q in `ls -dF /sys/class/net/${if}/queues/rx-*`;do
      n=$(cat /proc/cpuinfo | grep ^processor|wc -l)
      if [ ${n} -ge ${fullbit} ]; then n=${fullbit}; fi
      echo "obase=16;2^${n}-1"| bc > ${q}/rps_cpus
      echo 4096 > ${q}/rps_flow_cnt
    done
  done

  echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
  echo
}

stop(){
  echo
}

case $action in
start)
  start
  ;;
stop)
  stop
  ;;
*)
  echo >&2 "Usage: $0 <start|stop>"
  exit 1
  ;;
esac
exit 0```
閉じるボタンを押したら確認してくれるメモ帳を作るワンライナー

「[全部知ってる？ Chromeアドレスバーの裏技まとめ : ギズモード・ジャパン](http://www.gizmodo.jp/2014/11/chrome_6.html)」という記事に載っていた、アドレスバーに`data:text/html, <html contenteditable>`と入力するとブラウザがメモ帳になる、というTipsを拡張し、
**タブを閉じようとした時に確認用のダイアログ**を出すようにしました。
これなら、ちょっとしたメモを書いた時に失うリスクも減りますね！

以下、ソースです。お使いのブラウザ（今のところIE 11, Firefox 37, Chrome41で試しましたがChromeでしか動きませんでした...）のアドレスバーに貼り付け、適当な名前でブックマークしましょう。

```html
data:text/html,<html contenteditable><script>window.onbeforeunload = function(){ return 'Close window?'; }</script>
```

余談ですが`onbeforeunload`なんてイベント初めて知りました。
イベントハンドラが返す値をそのまま確認用ダイアログの見出しにするというのも面白いですねー。
以前この手の機能を実装する時は`onunload`を使ってたっけ...。

# おまけ

等幅フォントの方がお好みの方はこちら

```html
data:text/html,<html contenteditable  style="font-family: monospace;"><script>window.onbeforeunload = function(){ return 'Close window?'; }</script>
```
Androidの画面を縦or横に固定したい場合

自分用メモ

Androidの画面を固定したい場合
Androidの画面を縦や、横に固定したい場合は、AndroidManifest.xmlに以下のどちらかを追記する。

横画面に固定したい場合


```
<activity android:screenOrientation="landscape">

```
縦画面に追記したい場合

```
<activity android:screenOrientation="portrait">
```
Docker+Fluentd+ElasticSearch+KibanaでNginxのログを収集しビジュアルするイメージを作りました。

Dockerイメージは2つあります。ひとつはNginx側に動くセンサーfluentd-agent（　https://github.com/liubin/fluentd-agent ）です。もひとっつはローグを集約するElasticSearchとデータ可視化するKibanaのかたまりes-dashboard（ https://github.com/liubin/es-dashboard ）です。

なおDockerHubにて公式イメージも用意されているので、下記のコマンドはそのまま実行できます（はずです）。

環境：

- CentOS 7
- Fluentd 0.10.61
- JDK 1.7.0
- ElasticSearch 1.5.0
- Kibana 4.0.2


## １．Dashboardの起動

es-dashboardは１つのコンテナに動けます。また、コンテナが使えるリソースが制限されている場合、ElasticSearchとKibana用の２つのコンテナに動作できます。

## 1.1. ひとつのコンテナで起動

これは一番簡単の方法です、起動するのはコマンド一発のみ。

```
$ sudo docker run -p 9200:9200 -p 9300:9300 -p 5601:5601 liubin/es-dashboard
```

5601はKibanaのポートで、9200と9300はElasticSearch用のポートです。


## 1.2. ふたつのコンテナを分けてで起動

まずは、ElasticSearchを起動する。

```
$ sudo docker run -p 9200:9200 -p 9300:9300 liubin/es-dashboard --name es /tmp/start.sh es
```
起動ができたら、ElasticSearchのIPとPortを取得しKibanaのコンテナに渡し起動します。

```
$ sudo docker run -p 5601:5601 -e ELASTIC_URl=192.168.33.121:9200 --name kibana liubin/es-dashboard /tmp/start.sh kibana
```

2. Nginx側にAgentを起動します

ESのIpとPortを知る必要があります。

```
$ sudo docker run -e ELASTIC_HOST=172.17.0.92 -e ELASTIC_PORT=9200 -v /var/log:/var/log --name agent liubin/fluentd-agent
```

また、Nginxのログは/var/log/に格納されていると想定されています。


これでBrowserでKinabanの画面を確認でします、URLはHTTP://＜KinbanaのIP＞:＜KibanaのPort＞。

# 3. セキュリティ面

デフォルトではセキュリティに大問題があります、そればユーザ認証とアクセス制限機能はないですので、おおむけに公表するサービスに向いてないです。

くわしいはかきのURLをご参考。

- https://www.elastic.co/blog/scripting-security/
- https://www.elastic.co/products/shield
- http://www.elastic.co/guide/en/kibana/current/production.html
Xcodeで色付きログのライブラリ(ColorLogger.swift)を作った

Swiftプロジェクトで色付きのログを出すシンプルなライブラリを作りましたので、よかったら使ってください。

https://github.com/nishiyamaosamu/ColorLogger

# 準備

-  まず[XcodeColors](https://github.com/robbiehanson/XcodeColors) をインストールする必要があります。XcodeColorsをダウンロードしてください。
- XcodeColorsのプロジェクト(XcodeColors.xcodeproj)を開き、XcodeColors targetをコンパイルします。
- そうすると、"~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/XcodeColors.xcplugin"が生成されるはずです。
- Xcodeを再起動します。再度XcodeColorsのプロジェクトを開いてください。
- TestXcodeColors targetを実行させて、ログに色がついていればXcodeColorsは有効です。

# 使い方

1 - ColorLogger.swiftをプロジェクトにいれてください。

2 - AppDelegate.swiftのグローバルなところに以下のようにインスタンスを定義しましょう。

```swift
let log = ColorLogger.defaultInstance
```

つまりこんな感じ

```swift

import UIKit

let log = ColorLogger.defaultInstance

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
```
3 - あとは好きなところで、ログを書きます。

```swift
log.verbose("This is Verbose Log")
log.debug("This is Debug Log")
log.info("This is Info Log")
log.warning("This is Warning Log")
log.error("This is Error Log")
```

4 - コンソールに以下のように表示されます。

![screenshot](https://raw.githubusercontent.com/nishiyamaosamu/ColorLogger/master/screenshot.png)

# 追加設定

ログレベルを調整できます。デフォルトは.Debugです。

```swift
log.outputLogLevel = .Warning
```

いくつかのメッセージを出し分けできます。デフォルトは全てtrueです。

```swift
log.showLogLevel = true
log.showFileInfo = false
log.showDate = false
log.showFunctionName = true
```

ログを止めたいときは、outputLogLevelを.Noneにしてください。

```swift
log.outputLogLevel = .None
```

# 最後に

最低限の要素で作りました。個人的に時間やファイル情報などは後ろで、グレーアウトしてたほうが見やすかったので、そんな感じになってますが、ご自身でカスタマイズされても良いと思います。
もちろんプルリクエストも歓迎です。

https://github.com/nishiyamaosamu/ColorLogger
MacにComposer + Laravelを入れる


---
###下準備
composerのインストールにphp-mcryptが必要だが、Mac標準のPHPにはphp-mcryptが入っていない。これを解決する方法は、

1.php-mcryptをインストールする。
2.MAMP等のPHPを使う。

の２つ。

###php-mcryptをインストール

```
brew install mcrypt
```

でphp-mcryptもインストールされるらしい（試していない）。

###MAMPのPHPを使う

プリインストールのPHPは/usr/bin/phpにあるので、それより手前にMAMPのPHPのPATHを設定する。

```.bash_profile
export PATH=/Applications/MAMP/bin/php/php5.4.4/bin:$PATH
```

等とする。phpのバージョンは、利用しているPHP環境に応じて変更する。


###Composerのインストール

```
curl -s https://getcomposer.org/installer | php
```

めんどいので改名して/usr/local/binに移す。

```
sudo mv composer.phar /usr/local/bin/composer
```

確認

```
composer --version
```

###Laravelのインストール

LaravelのインストールはComposerで行うことが一般的らしい。依存コンポーネントが多いのでまあ、そうだろう。

```
composer create-project laravel/laravel project_name --prefer-dist
```

###設定

特に必要ないが、app/storageを

```
sudo chmod -R 777 storage
```

として、書き込み可にしておく。
あとは、config/database.phpのMySQLのdatabase nameやログインID,PWを設定しておけばとりあえず動く。


###動作確認

MAMPのhtdocsで上記コマンドを実行した場合、htdocs/project_nameフォルダができ、その下のpublicがrootとなる。


http://localhost/project_name/public


となる。
Sublime Text のVim化

###やりたいこと

sublime text3をvim化する。これには、Vintageモードをignoreしないようにするだけでいいのだが、Package Controllでvintageousをインストールする方が完成度が高いのでそうする。

###前提

ネットで検索すると、Vintage ModeとVintageousを併用する記述が多く見られるが、両者を併用するといろいろおかしいことになる。Vintageousのページを見ると、Vintageモードになってないことを確認しろ！的な記述があるので、Vintageモードにすることなくそのままインストールして使う。

###調整

Vintageousはインストールしただけでほぼ問題なく動くのだが、気づいている範囲で２つの調整が必要なようだ。

１）ctrl + * が効かない。
２）ctrl + [ でノーマルモードにならない。

１）は、setting -> usersに

```
"vintageous_use_ctrl_keys": true
```
と設定することで解決される（注意が必要なのは、vintageous専用のパラメータということ）。

２）は、keybinds -> usersに、

```
{ 
		"keys": ["ctrl+["],
		"command": "_enter_normal_mode",
		"args": {"mode": "mode_insert"},
		"context": [{"key": "vi_insert_mode_aware"}] 
}
```

とすることで解決される。
Laravel5でDB操作の基本


フォームから値を受けっとってDBの保存、表示までの簡単なサンプル。
Laravelでデータを扱う方法はQueryBuilder(DB::*)を使う方法と、Eloquent ORMを使う方法があるが、とりあえず、QueryBuilderを使う。QueryBuilderはモデルの定義無く使えるので便利である。
なお、ここでは、すでにmembersテーブルが存在することを前提に進める。

いちおうマスターレイアウト。

####Formの用意

```resources/views/master.blade.php
<!doctype>
<html>
<head>
	<meta charset="utf-8">
	<title>
		@yield('title')
	</title>
</head>
<body>
 @yield('body')
</body>
</html>
```

ポイントは、普通のフォームでもname='_token'でcsrf_token()を送るところ。


```resources/views/input.blade.php
@extends('master')

@section('title')
input
@stop

@section('body')
<form action="res" method="post">
<input type="input" name="name">
<input type="input" name="email">
<input type="submit" value="SEND">
<input type="hidden" name="_token" value="{{csrf_token()}}">
</form>
@stop
```

####受取と保存

受取については、Laravel5からはFormRequestを使うのが良いのだろうけど、とりあえずInputで受け取る。Inputを利用するには、use Input;とする必要がある。
ここでは、/inputでFormを表示、/resで値を受け取ってDBに保存する。
DBを使うためには、use DB;とする。

```app/Http/Controllers/HogeController.php
<?php namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Input;
use DB;

class HogeController extends Controller{

	//form表示
	public function input(){
		return view('input');
	}
	
	//受取と保存
	public function res(){

		$name = Input::get('name');
		$email = Input::get('email');

		DB::table('members')->insert([
				'name'=>$name,
				'email'=>$email
			]);

		return "Saved";
	}

	//一覧表示
	public function select(){
		
		$members = DB::table('members')->get();
		return view('select')->with('members',$members);
	}
}
```

####表示

```
@extends('master')

@section('title')
select
@stop

@section('body')

<h3>list</h3>
@foreach($members as $member)
	{{$member->name." ".$member->email}}<br>
@endforeach

@stop
```

ここでは、Controllerのselect()で一覧を取得しているが、

```
$members = DB::select(DB::raw('select * from members'));
```
などとして、DB::raw()により生クエリを実行することもできる（rawを利用しない書き方もある）。

####Route

一応Routeも。

```app/Http/route.php
Route::get('input','HogeController@input');

Route::post('res','HogeController@res');

Route::get('select','HogeController@select');
```
Laravel5でDB操作の基本（Eloquent ORM編）


フォームから値を受けっとってDBの保存、表示までの簡単なサンプル。
Laravelでデータを扱う方法はQueryBuilder(DB::*)を使う方法と、Eloquent ORMを使う方法があるが、今回はEloquent ORMを利用してみる。
なお、ここでは、すでにmembersテーブルが存在することを前提に進める。

####モデルの作成
Eloquent ORMを利用するためには、モデルを定義する必要がある。Laravel5からは、Modelディレクトリが無くなったので、とりあえず、App直下に作成する（Namespaceを変えればどこでも）。

```
<?php namespace App;

use Illuminate\Database\Eloquent\Model;


class Member extends Model{

	protected $table = 'members';

	public $timestamps = false;

}
```
今回は、timestampが定義されていない既存テーブルを使うので、テーブル名の指定に加え、$timestampsプロパティをfalseに設定している。

いちおうマスターレイアウト。

####Formの用意

```resources/views/master.blade.php
<!doctype>
<html>
<head>
	<meta charset="utf-8">
	<title>
		@yield('title')
	</title>
</head>
<body>
 @yield('body')
</body>
</html>
```

ポイントは、普通のフォームでもname='_token'でcsrf_token()を送るところ。


```resources/views/input.blade.php
@extends('master')

@section('title')
input
@stop

@section('body')
<form action="res" method="post">
<input type="input" name="name">
<input type="input" name="email">
<input type="submit" value="SEND">
<input type="hidden" name="_token" value="{{csrf_token()}}">
</form>
@stop
```

####受取と保存（そして一覧表示）

受取については、Laravel5からはFormRequestを使うのが良いのだろうけど、とりあえずInputで受け取る。Inputを利用するには、use Input;とする必要がある。また、定義したModelを利用するために、use App/Members;を指定している。
ここでは、/inputでFormを表示、/resで値を受け取ってDBに保存する（select()で一覧表示）。
保存はDB::insertに比べ、オブジェクト指向っぽく直感的に書くことができる。

```app/Http/Controllers/HogeController.php
<?php namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Input;
use App\Member;

class HogeController extends Controller{

	//form表示
	public function input(){
		return view('input');
	}
	
	//値を受けて保存
	public function res(){

		$name = Input::get('name');
		$email = Input::get('email');

		//インスタンス生成
		$member = new Member;

		$member->name = $name;
		$member->email = $email;

		//保存
		$member->save();

		return "Saved via Eloquent";
	}

	//一覧表示
	public function select(){
		
		$members = Member::all();
		return view('select')->with('members',$members);
	}
}
```

####表示

表示は、QueryBuilderもEloquent ORMも変わらない。

```
@extends('master')

@section('title')
select
@stop

@section('body')

<h3>list</h3>
@foreach($members as $member)
	{{$member->name." ".$member->email}}<br>
@endforeach

@stop
```


####Route

一応Routeも。

```app/Http/route.php
Route::get('input','HogeController@input');

Route::post('res','HogeController@res');

Route::get('select','HogeController@select');
```

####まとめ
後は、Laravel.comのDocumentsを見て、Eloquentの書き方を随時調べて利用すれば良い。
Laravel5 Bladeのメモ


###基本レイアウトを作る
resources/views/master.blade.php

```html
<!doctype>
<html>
<head>
	<meta charset="utf-8">
	<title>
		@yield('title')
	</title>
</head>
<body>
 @yield('body')
</body>
</html>
```

###各レイアウトを作る

普通は、Controller名のフォルダを作るが、めんどいのでmasterと同じ階層に作る。レイアウトを変えたいときは、@extends('master2')などとすれば良い。

resources/views/hoge3.blade.php

```html
@extends('master')

@section('title')
hoge3
@stop

@section('body')
<h3>hoge3 from blade</h3>
@stop
```

###Routing

これだけを表示するだけなら、とりあえず。

```php
Route::get('hoge3',function(){
	return view('hoge3');
});
```
などとする。

###デリミタ{{}}

Laravel4は、{{hoge}}でエスケープ無し。{{{hoge}}}でエスケープ有りだったが、Laravel5では、両方エスケープ有りとなった。
無しにするには{!!hoge!!}とする。

```html
@extends('master')

@section('body')
{{$str}}<br>
{{{$str}}}<br>
{!!$str!!}<br>
@{{}}
@endsection
```
は、

```html
<b>HOGE</b>
<b>HOGE</b>
HOGE
@{{}}
```

と表示される。ちなみに、{と表示したい場合は@をつける。
Laravel5 Routingと簡単表示のメモ


###匿名関数でその場で返す

####基本形

```
Route::get('hoge1',function(){
	return "hoge1";
});
```

####パラメータ受取（単数）

```
Route::get('hoge1/{id}',function($id){
	return "hoge1" ."+".$id;
});
```

####パラメータ受取（複数）
```
Route::get('hoge1/{id}/{id2}',function($id,$id2){
	return "hoge1" ."+".$id."+".$id2;
});
```

####条件付き

idが数字じゃ無かった場合の対応など。

```
Route::get('hoge1/{id}',function($id){
	return "number" ."+".$id;
})->where('id','[0-9]{2}');

Route::get('hoge1/{name}',function($id){
	return "string" ."+".$id;
})->where('id','[^0-9]{2}');
```

###コントローラで返す

####基本形

````
Route::get('hoge2','HogeController@index');
````

```app/Http/Controllers/HogeController.php
<?php namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class HogeController extends Controller{

	public function index(){
		return "hoge from controller";
	}

}
```

####パラメータ受取

めんどくさいので単数の時のみ

```
Route::get('hoge2/{id}','HogeController@index');
```

```HogeController.php
<?php namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class HogeController extends Controller{

	public function index($id){
		return "hoge from controller"."+".$id;
	}

}
```

###Viewで返す

####匿名関数でview指定

```
Route::get('hoge3',function(){
	return view('hoge3');
});
```

```resources/views/hoge3.php
<h3>hoge3 from view</h3>
```

####コントローラーでview指定

```
Route::get('hoge3','HogeController@index');
```
コントローラーでView指定。ついでにパラメーター渡す。

```
<?php namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class HogeController extends Controller{

	public function index(){
		$name = "foo";
		return view('hoge3')->with('name',$name);
	}

}
```
パラメーターの表示。とりあえずbladeじゃなくて生のphp。

```
<h3>hoge3 from view</h3>
<?php
	echo $name;
?>
```

###その他、重要な書き方

どんなRouteができるかは、

```
php artisan route:list
```
で確認。

####Route::controller

```
Route::controller('hoge','HogeController');
```

####Route::resource

```
Route::resource('hoge','HogeController');
```
DockerのRUNとCMDの違い

Dockerfileに

```
RUN service mysqld start
```

と書いたのに実際にコンテナの中に入ってみるとmysqlが立ち上がってないので、へんだなと思い、調べてみたのですが、ここはRUNでなくCMDを使うべきだったみたいです。

![スクリーンショット 2015-04-09 10.56.59.png](https://qiita-image-store.s3.amazonaws.com/0/34879/2d3dacb3-600b-1971-feae-db0f5e53f0a2.png)

上記の図に書いたのですが、
* RUN：ビルド時にコンテナ内で実行される
* CMD：完成したイメージからコンテナを作成するときに実行される

です。
【メモ】Vagrantで作ったローカル環境(Mac)をスマホ実機から見れるようにする

# 条件
固定プライベートIPを使うので、会社によってはNGかも

# Vagrantの設定
wifiをpublic_networkに設定してIPを固定する。
他の人と被らないようにしないと社内のシステム担当者に怒られる可能性あるので、
ちゃんと管理者に確認する。

この例だとwapサーバにはapacheがインストールされていて、ホスト側の~/Vagrant/data/wap/にphpのファイルが置いてある前提。

使っているBoxはCentOS7.0

wapのSELinuxとかfirewallはオフにしちゃってます。
オフにしちゃうのが気になる場合は適切に設定する。

```rb:~/Vagrant/Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.ssh.insert_key = false
  config.vm.box = "centos70"

  config.vm.define 'wap01' do |wap01|
      wap01.vm.hostname = 'wap01'
      wap01.vm.network "private_network", ip: "172.31.41.21"
      wap01.vm.network :public_network, ip: "192.168.1.200", :bridge => "en0: Wi-Fi (AirPort)" ,:use_dhcp_assigned_default_route => true
      wap01.vm.synced_folder "~/Vagrant/data/wap/", "/host_mount", :nfs => { mount_options: ['dmode=777', 'fmode=777'] }
      wap01.bindfs.bind_folder "/host_mount","/var/apps", :owner => "vagrant", :group => "vagrant", :'create-as-user' => true, :perms => "u=rwx:g=rwx:o=rwx", :'create-with-perms' => "u=rwx:g=rwx:o=rwx", :'chown-ignore' => true, :'chgrp-ignore' => true, :'chmod-ignore' => true
  end

  config.vm.define 'master01' do |master01|
      master01.vm.hostname = 'master01'
      master01.vm.network "private_network", ip: "172.31.41.11"
      master01.vm.synced_folder "~/Vagrant/data/master/", "/host_mount", :nfs => { mount_options: ['dmode=777', 'fmode=777'] }
      master01.bindfs.bind_folder "/host_mount","/var/apps", :owner => "vagrant", :group => "vagrant", :'create-as-user' => true, :perms => "u=rwx:g=rwx:o=rwx", :'create-with-perms' => "u=rwx:g=rwx:o=rwx", :'chown-ignore' => true, :'chgrp-ignore' => true, :'chmod-ignore' => true
  end
end
```

# dnsmasq
ドメイン名でアクセスできるようにする
※ これやらなくても、おそらく同じネットワーク内にスマホをwifi接続していれば、http://192.168.1.200 でつながる。

## インストール(Mac)

```bash
brew install dnsmasq
sudo vim /etc/resolv.dnsmasq.conf
sudo echo “address=/local.hoge.jp/192.168.1.200” > /usr/local/etc/dnsmasq.conf 
sudo echo "resolv-file=/etc/resolv.dnsmasq.conf" >> /usr/local/etc/dnsmasq.conf
# Mac起動時に自動でdnsmasqも起動するようにする
sudo cp `brew --prefix dnsmasq`/homebrew.mxcl.dnsmasq.plist /Library/LaunchDaemons
# 設定を読み込み
sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
# アンロードは以下のコマンド
sudo launchctl unload -w /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
```

```apache:/etc/resolv.dnsmasq.conf
# local.hoge.jp以外を解決するDNSサーバ
nameserver 192.168.1.1
```

# スマホの設定
スマホを同じネットワークにあるルーターに接続する

接続しているWifiの設定のDNSを192.168.1.200(自分のIP)に変更する
NinjaFramework

PlayFramework 1.x の流れを組む（らしい）javaのwebフレームワーク、Ninja。

http://www.ninjaframework.org/

playと違って、java only、stateful。
でも、RESTful、scalable、スタンドアローンもwarでのデプロイも可能、といったところは同じ。

公式ページの内容もよく、バッチ処理やメール送信も含め、やりたいことが大体書かれているし、コードの記述も簡潔。
経験が浅いなら、このフレームワークをやることで一通り学べそう。

playかspringのどちらかの経験があれば、すぐに使いこなせそう。

実際使ってないが、フレームワークの選択肢のひとつとして。
匿名IP（月10ドル）でガシガシScraping、Ruby+Nokogiriソース付

# あいさつ

匿名IPをローテさせてアクセス制限を気にせずガシガシScrapingする方法を紹介します.

今回はRuby+Nokogiriで済む簡単なモノを紹介しますが、PhantomJSやSeleniumにプロキシをかましても同じような事が出来ます.

* 悪用は良くない

# http://proxymesh.com/

http://proxymesh.com/  まずはここで会員登録.

無料版もあるのでそれで済むならそれでいいかも.

ここで登録した`username`①と`password`②は後で使うので控えておく.

![Screen Shot 2015-04-08 at 6.04.09 PM.png](https://qiita-image-store.s3.amazonaws.com/0/30440/63bffbf1-9ad8-af87-2f34-5a37544f4d5a.png)

ダッシュボードに表示されているAuthorized済みのProxyのHost③とPort④を控えておく.


# NokogiriでGogo

`#open` の`proxy_http_basic_authentication`オプションを使えばおk 

```rb
require "open-uri"
class OpenWithProxy
  def initialize(proxy_host, proxy_port, username, pass)
    @proxy_uri = URI.parse("#{proxy_host}:#{proxy_port}")
    @username  = username
    @pass      = pass
  end

  def open(url)
    Kernel.open(url, proxy_http_basic_authentication: [@proxy_uri, @username, @pass])
  end
end
```

```rb
owp = OpenWithProxy.new('③で控えたやつ', '④で控えたやつ', '①で控えたやつ', '②で控えたやつ')
# こんな感じ. owp = OpenWithProxy.new('http://us.proxymesh.com', '31280', 'username', 'password')
```
 
## ちゃんとプロキシを噛んでるか確認

http://api.ipify.org?format=json

を使うとIPが確認できる.

```rb
require 'json'
check_ip = -> { JSON.parse(owp.open('http://api.ipify.org?format=json').read)['ip'] }

check_ip.call
#=> "166.78.113.337"

check_ip.call
#=> "166.28.153.347"

check_ip.call
#=> "192.237.163.323"

...
```

おお、10個のIPの内から毎回ランダムで選ばれるぽい、いいね

# Nokogiriに渡してガシガシ

```rb
require 'nokogiri'

doc = Nokogiri::HTML owp.open('https://www.google.com')

doc.title
#=> "Google"
```

いいね！
BabelのLearn ES6を学んでいく（１

https://babeljs.io/docs/learn-es6/
Aurelia のチュートリアルで触る機会があり、気になったので勉強していきます。http://www.es6fiddle.net/ で動かせるみたいなんで実際にやりながら見ていきます。

#Learn ES6
##Introduction
ECMAScript6は次のECMAScriptのスタンダードであり、2015/6に裁可の予定です。2009年のES5以降の大幅なアップデートになります。メジャーなJavascriptエンジンでは実装が[進んでいます](http://kangax.github.io/es5-compat-table/es6/)。

##ECMAScript 6 Features
###Arrows
* `=>`はfunctionのショートカットです。
* C#,JAVA8,CoffeeScriptなどと似ています。
* 式とステートメントの両方をサポートしています。
* functionと異なり、thisは定義したオブジェクトと同じになります。
* 例：http://www.es6fiddle.net/i89eeoyf/

###Classes
* class宣言が用意されました
* 継承がサポートされsuperが使えます
* staticメソッドがサポートされます
* 例：http://www.es6fiddle.net/i89f4ngk/

###Enhanced Object Literals
* Objectリテラルの文法が更新されました
* プロトタイプ`__proto__`がサポートされました
* ショートカットが追加されました
* `foo: foo`を`foo`のみで定義できます
* `foo: function(){}`を`foo(){}`のみで定義できます
* プロパティ名を[]で囲むことで動的に定義できるようになりました
* 例：http://www.es6fiddle.net/i89g5jq0/

###Template Strings
* 埋め込み文字がサポートされました
* バッククォートで文字列を囲みます
* 改行可能です
* 変数を埋め込む場合`${foo}`のようにします
* 例：http://www.es6fiddle.net/i89gnp7f/

###Destructuring
* 分解代入`var [a, , b] = [1,2,3];`がサポートされました
* デフォルト値の指定`var [a = 1] = [];`が可能です
* オブジェクトの分解`var { op: a, lhs: { op: b }, rhs: c } = getASTNode()`も可能です
* 関数の引数`function g({name: x}) {`にも適応可能です。
* 例：http://www.es6fiddle.net/i89h7790/

今回はここまで。全体の3分の1くらいですね。[次回](http://qiita.com/kazusa-qooq/items/1566aeaa34eaff7ad402)
htmlタグに独自の属性をマークアップする


data属性は「data-」以降に文字列を指定することで設定できる。たとえば「data-hoge」に「fuga」という値を設定する場合はマークアップは次のようになる。

# 基本的な使い方

```html:
<div data-hoge="fuga">テスト</div>
```

jQueryでこの「fuga」という値を取り出すには、dataメソッドの引数に「data-」以降に設定した文字列を指定する。

```javascript:
$('div').data('hoge');
```


# 複数のdata属性を設定

data属性は同じタグに複数設定することもできる。

```html:
<div data-hoge="fuga" data-yasai="にんじん" data-number="1">太郎</div>
```

```javascript:
$('div').data('hoge');
$('div').data('yasai');
$('div').data('number');
```

# 一つのdata属性に複数の値を設定

オブジェクトを入れれば一つのdata属性に複数の値を設定できる。

```html:
<div data-hoge='{"yasai":"にんじん", "number":"1"}'>太郎</div>
```

jQueryではdata属性の後にオブジェクト名を指定する。

```javascript:
$('div').data('hoge').yasai; //にんじん
$('div').data('role').number; //1
```

# jQueryでdata属性を設定する

逆にjQueryからdata属性を設定する場合は普通に「attr」メソッドを使用する。

```html:
<div>ほげほげ</div>
```

```javascript:
$('div').attr({ 
    'data-hoge': 'fuga',
    'data-option': '{"yasai":"にんじん", "number":"1"}'
});
```
synced folder の所有者が変わってしまう

OSX NFS + vagrant(ubuntu) していて、ホストOS側(OSX)が異常終了してしまいました。
その後、いつもどおり起動してvagrantへログインしたところ、
共有フォルダの所有者が id: 501 group: dialout になっていてファイルの書き込みがまったくできなくなっていました。
vagrantのユーザIDは 900。異常終了前から変わってしまったのかどうかは不明です。

確認したところ ホストOS側の自分のユーザIDが501で、/etc/exports内のvagrantが自動生成した設定にも 501が指定されていたので、実際には vagrantユーザのユーザIDが変更されてしまったのかもしれません。
(ゲストOSはubuntu14.04)

```
$ sudo vipw
```
上記実行して、vagrantのユーザIDを501にした上で

```
$ sudo find ~/. -uid 900 | xargs sudo chown vagrant
```
で所有者を強制変更しました。
vagrantの ユーザIDを 501にしたのは ホストOS上の 自分のユーザIDと一致させる為です(/etc/exportsにも501で指定されている為)


良い解決策があれば教えてください。


(追記)
時間ができたら、destroyして作りなおしたいと思います。

(追記)
$HOME/.ssh以下の所有者が変更できていなかったので、vagrant ssh時にパスワードを毎回聞かれました。わすれずに所有者変更してください。

(追記) パーミッションが 700になっているディレクトリ中のファイル所有者が変更できていなかったので、findコマンド実行時にsudoするようにしました。
#defineされた値の確認 > #if DBG_MINIMIZE == 0

動作環境

    Xilinx XSDK v2014.4

Cのコードにおいて#defineされた値を確認するため、以下のコードを用いた

```
#if DBG_MINIMIZE == 1
#error "dbg:is 1"
#else
#error "dbg:not 1"
#endif
```

もしDBG_MINIMIZEが1としてdefineされていたら"dbg:is 1"の所でエラーとなる。
1以外の値だったら、"dbg:not 1"の所でエラーとなる。

`#error`でなく`#message`のようなものがあったかと思うが、失念したので割愛。
Win32APIにおけるメッセージとウィンドウプロシージャについてのメモ

# 前置き
ウィンドウプロシージャおよびメッセージとはいったい何か気になったので調べた。
ここでは、ウィンドウプロシージャとは何か。メッセージとは何かまでを記述する。
理解していると思うが、もしかすると間違ってるかもしれない(ﾃﾍﾍﾟﾛ

# Win32API
Win32APIとは、Windowsが提供しているOSのAPI。
ウィンドウの作成、表示、描画、スレッドの実行などなどが行える。
Win32APIの32は32ビットの意味。
64ビットだとWin64APIになり、16ビットだとWin16APIになる。

# Windowsアプリケーションを作成するには
Windowsアプリケーションを作成するには下記の手順が必要である。

1. ウィンドウの作成
2. メッセージループ
3. ウィンドウプロシージャの定義

ここで、メッセージループおよびウインドウプロシージャが出てくる。
ウィンドウの作成、メッセージループ、ウィンドウプロシージャの定義の方法およびコードは、参考文献に任せるとして、ここでは、メッセージループおよびウィンドウプロシージャが何かを説明していく。

# メッセージループ
メッセージループとは、メッセージキューに格納されたメッセージを取り出し、ウインドウプロシージャに渡す処理である。

メッセージとウィンドウプロシージャについて説明する。
## メッセージ
メッセージとは、発生したイベント内容を記述した変数である。

ウィンドウ上でイベントが発生した時、そのイベント内容を記述したメッセージが生成される。
例えば、メモ帳のウィンドウ上で右クリックした場合、WM_RBUTTONDOWN というメッセージが生成される。
メモ帳は WM_RBUTTONDOWN のメッセージを受け取り、右クリックのメニューを生成している。

## ウィンドウプロシージャ
ウィンドウプロシージャとは、受け取ったメッセージを処理する関数である。

コードで表すと下記のようになる。
WndProc()がウィンドウプロシージャである。(WndProcはWindowProcudureの略)
ここでは、左クリックした時に何かしらの処理を行っている。

```c:
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
	switch (msg) { // メッセージを判定
	case WM_LBUTTONDOWN: // 左クリックされた時
		DoAnything(); // なんでもしますから！
		return 0;
	return DefWindowProc(hwnd , msg , wp , lp);
}
```

このように、開発者はウィンドウプロシージャに、受け取ったメッセージを判定した処理内容を記述していく。

# メッセージループについてもう少し詳しく
Windowsのシステムは、ウィンドウが属するアプリケーション毎にメッセージキューを持っている。メッセージキューとはメッセージが格納されているキューの事である。(まんまやね)

ウィンドウ上でイベントが発生すると、メッセージが生成され、メッセージキューに格納される。
そのメッセージキューに格納されたメッセージを取り出し、ウィンドウプロシージャに渡すのがメッセージループの役割である。

具体的には、
メッセージキューからメッセージを取り出す GetMessage() と、
メッセージをウィンドウプロシージャに渡す DispatchMessage() を使う。

```c:
	// メッセージを取り出して、ウィンドウプロシージャに渡している
	while (GetMessage(&msg , NULL , 0 , 0)) DispatchMessage(&msg);
```

# まとめ
つまり、

* メッセージ：イベント内容
* メッセージループ：メッセージを取り出して、ウィンドウプロシージャに渡す処理
* ウィンドウプロシージャ：メッセージを受け取り、イベントごとの処理を記述するもの
 
である。

# 参考文献
[標準 Windows API](http://wisdom.sakura.ne.jp/system/winapi/win32/index.html)
[プログラミング入門サイト～bituse～](http://bituse.info/winapi/)
[EternalWindows](http://eternalwindows.jp/winbase/window/window04.html)
PythonでKindle用自炊PDFを作ろうと実験

スキャナとかで取り込んだjpgファイルをPythonを使って何とか出来ないかと。
まずは必要なモジュールをインポート。

```
$ pip install reportlab
```

あとPILも必要なのでインストール。

```
$ brew install libjpeg
```

http://www.pythonware.com/products/pil/
上記URLからPILをダウンロード。
解凍後、cdでディレクトリを移動。

```
$ cd Imaging-1.1.7
$ sudo python setup.py install
```


とりあえず現時点で思いつきで出来たスクリプトが以下。

```python:pdf.py

#!/user/bin/env python
# -*- coding: utf-8 -*-
from reportlab.pdfgen import canvas
from reportlab.rl_config import defaultPageSize

canvas = canvas.Canvas("sample.pdf")
PAGE_WIDTH = defaultPageSize[0]
PAGE_HEIGHT = defaultPageSize[1]
canvas.drawInlineImage("test.jpg", 0, 0, PAGE_WIDTH, PAGE_HEIGHT)

canvas.save()
print ("Success")

```

PAGE_HEIGHT = defaultPageSize[1]
でページサイズをA4に指定。

実行ファイルであるpdf.pyと同一ディレクトリのtest.jpgを読み込んでPDFにする。
ただそれだけ。
もっと大きいファイルを変換したらどうなるかとかはやってみないとわからない。
840×1200のjpgファイルはA4に収まることを確認済み。
_WIN32マクロ > Win32とWin64用application | ARMの記載もある

Visual Studioで_WIN32マクロというのがある。

名前からすると32ビットアプリにはこのマクロを使えばいいように思える。

[SO](http://stackoverflow.com/questions/6679396/should-i-define-both-win32-and-win64-in-64bit-build)によると以下のことらしい。

_WIN32: Defined for applications <font color=red>for Win32 and Win64</font>. Always defined.

_WIN64: Defined for applications for Win64.

64ビットアプリのソースに_WIN64がdefineされてなく_WIN32のみdefineされていても気にしなくていいようだ。

[Microsoft Developer Network](https://msdn.microsoft.com/en-us/library/b0084kay.aspx)

<hr>
(追記 2016/10/03)

MSDNを見直すと

> _WIN32 Defined as 1 when the compilation target is 32-bit ARM, 64-bit ARM, x86, or x64. Otherwise, undefined.

ARMの記載も入っていた。
PIL(Python Imaging Library)インストール覚書

なんかインストールに手順？
順番ぽいのがあったので覚書。

PILをインストールする前に、Homebrewでlibjpegをインストール。

```
$ brew install libjpeg
```

http://www.pythonware.com/products/pil/
上記URLからPILをダウンロード。
解凍後、cdでディレクトリを移動。

```
$ cd Imaging-1.1.7
$ sudo python setup.py install
```

インストールしておしまい。
Three.jsで動的に生成したパターンをテクスチャーにするには

# 背景

Three.jsのデモでOceanを理解しようと[runstant](http://phi-jp.github.io/runstant/release/alpha/)で動かそうとしたら、
空と海の2箇所をテクスチャファイルとして参照していたので、
これの代わりに適当に動的にパターンを生成すれば、あれこれ試せそうと
思った。

# 多くの場合

```js
waterNormals = new THREE.ImageUtils.loadTexture( 'textures/waternormals.jpg' );
```

や

```js
var loader = new THREE.ImageLoader();
loader.load( 'textures/skyboxsun25degtest.png', function ( image ) {
```

のようにファイルからテクスチャを生成している。

これを、動的にやるにはどうするのかということで
調べたら見つかった。

- https://github.com/mrdoob/three.js/issues/804

canvasを指定してTHREE.Textureを生成すれば良かった。
Oceanのようにテクスチャを時間変化される場合、
Texture#needsUpdateをtrueにしておく。

```js
tex = new THREE.Texture(canvas);
tex.needsUpdate = ture;
```