OmniAICreator/Qiita-1.07M huggingface dataset:
Webフロントエンドに従事するお前らはいい加減高頻度イベントとレイアウトとスタイリングの付き合い方を考えろ

もうなんかこの際マジで言わせていただくんですけど、知ってるか知らないか分かりませんが世の中にはすごい頻度で呼ばれうるDOMイベントって言うのがいくつかあるわけですよ

例えば

- scroll
- mousemove, touchmove
- devicemotion

辺りですよ。

で、高頻度で呼ばれるって言うことは必然的に処理量が増えるって分かりますよね？？？？？`while(1) {}`じゃないとはいえUIスレッドに十分影響を与えうる頻度で呼ばれる訳です。分かりますよね？？？？？？？？

そうなると当然そのイベント内で重い処理を行えば人間が認識できるレベルでのレスポンス遅延が起きるっていうのはご理解できますよね？

重い処理っていうのはまぁ想像出来るとは思うんですが例えばよくあるのが

- DOMのレイアウトプロパティへのアクセス
    - offsetTop、offsetLeft、offsetWidth、offsetHeight
    - scrollTop、scrollLeft、scrollWidth、scrollHeight
    - clientTop、clientLeft、clientWidth、clientHeight
    - getComputedStyle()
- DOMのスタイルプロパティへのアクセスや変更全般
- DOMツリーへのアクセスや操作

辺りですよ。もちろんこれはjQueryを使っても同じですからね？？？？？？？？？？

そういう訳で以下のようなコードは完全にクソってことになるのはお分かりいただけますよね？？？？？？

```javascript
// 実装内容については完全に適当だが察しろ

document.addEventListener('scroll', function(ev) {
    $('.some-element').css({
        top: $(this).scrollTop() + 'px'
    });
});

document.addEventListener('touchmove', function(ev) {
    $('.some-element').css({
        left: (parseInt($('.some-element').attr('x-offset')) + ev.changedTouches[0].pageX) + 'px'    
    });    
});

window.addEventListener('devicemotion', function(ev) {
    $('.some-element').css({
        left: ev.gamma + 'px'
    });    
});
```

もう目に見えてゴミですよね？？？？？？？？？？？お分かりになります？？？？？？？？？？？？？？？？

iPhoneでは動くから？？？？？？？？？？？？は？？？？？？？？？？Androidは？？？？？？？？？？？？？？？？？？？？？？？？？？

## 高頻度イベントのデータを使う場合は描画ロジックを分けろ

もう書くのもめんどくさいので[こないだ書いた奴](http://dameleon.hatenablog.com/entry/2014/10/21/171448)をそのまま貼りますけどね？

例えばタッチしはじめてそのまま指の動きに要素をつけたいとかそういう実装で考えると

```javascript
//// touchmoveごとにスタイルを変更したい(適当バージョン)
var fps = 30; // 30fpsに制限
var frameTime = 1000 / fps;
var isAnimated = false;
var lastTouchInfo = null;
var element = document.getElementById('some-element');

document.addEventListener('touchstart', function(ev) {
    // 最初のデータを入れてアニメーションを開始
    lastTouchInfo = ev.changedTouches[0];
    isAnimated = true;
    animation();
});

document.addEventListener('touchmove', function(ev) {
    // touchmoveイベントの中ではデータの更新だけする
    lastTouchInfo = ev.changedTouches[0];
});

document.addEventListener('touchend', function() {
    // アニメーションの終了
    isAnimated = false;
    lastTouchInfo = null;
});

document.addEventListener('touchcancel', function() {
    // アニメーションの終了
    isAnimated = false;
    lastTouchInfo = null;
});

function animation() {
    // isAnimatedフラグが立ってなかったら終了
    if (!isAnimated) {
        return; 
    }

    // 最後のタッチイベントからデータを取得
    var x = lastTouchInfo.pageX;
    var y = lastTouchInfo.pageY;

    // 何かのスタイルを変更したりする
    element.style.top = y + 'px';
    element.style.left = x + 'px';

    // 次のanimationを登録
    setTimeout(animation, frameTime);
}
```

こんな感じに **イベントのデータを何らかの変数にキャッシュして、描画ロジックでそれを参照する** という風に書ける訳です。大体絶対 60fps を出さなきゃいけないなんていうシビアな状況はさほどないわけですよ。

何故こんなことをするかというと、特にスマートフォン、特にAndroidでは簡単にパフォーマンスが悪くなるんですよ、上の上で書いた悪いようなことをしてると！！！！！！！！！！！！！発熱も！！！！！バッテリーも！！！！！！ユーザ体感を損ないますよね！！！！！！！！！  
iPhoneで動きゃ良いって訳じゃねぇんだからな！！！！！！！！！！！！！！！！！！

## 見た目だけで出来たって言う奴は何をやっても駄目

マジで今年はこんなのばっかり相手にして自分の仕事がまったく出来なくなるので今日は本当に頭にきたので書きました。ナメた実装で心が汚れる前にQiitaで発散させていただきます。

クソお世話になりました！！！！！！！！！！本当にありがとうございました！！！！！！！！！！！
[Rails]データベースに保存する処理でNomethoderror undefined methodがでた



Railsで、データを保存しようとしたところ、以下のエラーが（全文ではないです）。

```
NoMethodError in TodosController#add

undefined method `todo&#39; for #&lt;Todo:0x007fc52bfe8830&gt;

Application Trace
app/controllers/todos_controller.rb:20:in `add'
```
この20行目が、以下のコメントした箇所でした。

```lang:todos_controller.rb
class TodosController < ApplicationController
	protect_from_forgery with: :null_session

	def add
		todo_instance = {
			user_id: params[:todos][:user_id],
			completion: params[:todos][:completion],
			content: params[:todos][:content],
		}

	        Todo.create(todo_instance) # ←ここがエラーを起こしていた箇所。
		render json: "success".to_json	
	end
end
```

で、何故実行されないのか色々調べていましたが。。



結論からいうと、モデルに、存在しないカラムのvalidationがはいっていたからでした。

```lang:todo.rb
class Todo < ActiveRecord::Base
  belongs_to :user
  validates :todo, presence: true # ←この１行がエラーを起こしていた・・・。
  validates :user_id, presence: true
end

```

エラー見ると、

```
undefined method `todo&#39; for #&lt;Todo:0x007fc52bfe8830&gt;
```
とあるので、そういうことか、とあとになって気づきました。。

自分以外の人が作ったモデルだったのと、
僕が、人が作った、すでにすべてが揃っているRailsしかさわったことがなかったので、基礎が抜け落ちていました。。

あとエラーをちゃんと見れてない。よく見ようという話でした。
nginxで、オリジナルのリクエストヘッダにアンダーバーを使えるようにするメモ


オリジナルのリクエストヘッダを受け取って、WebAPIでゴニョゴニョしたい…っていうことあると思うんだけど、どうも名前にアンダーバーが入っているものがアプリ側で受け取れないなーと思っていたら、nginxの方でフィルタリングされていたという。

例えば、Railsで`request.env['HTTP_X_HOGE_SIGNATURE']`みたいなのを受け取りたいとするんだけど、一向にやってこない。てもの開発環境だと、`rails s`して確認しているから、余計気が付かなかった。

対処方法は…

```/etc/nginx/nginx.conf
underscores_in_headers on;
```

`underscores_in_headers`を有効にするだけ…！これが分からずハマってしまった…！
nginx + php-fpm socketで接続する

###nginxとphp-fpmとの接続に、UNIX socketを指定する

socket通信を使うとTCPで接続するので、「http://127.0.0.1:9000」でアクセスするより早いのかな？

**php-fpm**
　・www.conf（/etc/php-fpm-5.5.d/www.conf）の「listen」を下記に変更する

```file:php-fpm
listen = /var/run/php-fpm/php-fpm.sock
```

　・再起動する
　　/etc/rc.d/init.d/php-fpm restart

　・再起動すると、「/var/run/php-fpm」に「php-fpm.sock」が作られる

**nginx**
　・confの「fastcgi_path」にphp-fpm.sockを指定する

```file:nginx
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
```

　・再起動する
　　/etc/rc.d/init.d/nginx restart


### アクセス後したら「502 Bad Gateway」になる場合

　・/var/run/php-fpm/php-fpm.sockのOwner情報を確認する
　　・カッコカリ、確認したところ「root」だったことにします。
　・php-fpm：www.confの「listen.ownerとlisten.group」を下記に変更する

```file:php-fpm
listen.owner = nginx
listen.group = nginx
```

　・再起動する
　　/etc/rc.d/init.d/php-fpm restart
UIImageViewに設定している画像の色を変える


以下のようにすると、UIImageViewに設定している画像の色を
UIButton(type=system).tintColorのように変えることができます。

```objectivec:UIImageViewに設定している画像の色を変える
	self.myImageView.image = [[UIImage imageNamed:@"whiteImage"]
                          	imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
    self.myImageView.tintColor = [UIColor blueColor];
```
Laravel4 クイックスタートのルーティング

やっと解決orz
まずはインストール成功の画面が見えている事が前提。
<pre>http://localhost/作業ディレクトリ/public/
or
http://localhost/作業ディレクトリ/public/index.php</pre>

まず、手順通りにやると

app/routes.phpに最後に下記を追加

<pre>Route::get('users', function()
{
    return 'Users!';
});</pre>

んでアクセスすれば、「Users!」と表示されるはず。。。

されない。。。

<pre>http://localhost/作業ディレクトリ/public/users
NotFound?
http://localhost/作業ディレクトリ/users
NotFound??</pre>

この記事を見つける。。。
http://qiita.com/tooooooooomy/items/41867fab58d6b757ca7f

試す。。。

<pre>http://localhost/作業ディレクトリ/public/index.php/users</pre>
「Users!」が表示された！！！

初めはローカルでvagrant+enginxで試し、次にvagrant+apacheで試し、バーチャルボックスがいけないのかと、AWSで試し、結果こんなことってorz

何十時間を費やした事やら。。。。。
Macの⌘キーってWindowsでいうと何？

修飾キーの数はWindowsもMacも3つずつなんですが、機能的には一対一で対応づけられないところあります。

おおまかにこういう理解で。

<table>
<thead><tr><th>Windows</th><th>修飾キー</th><th>Mac</th></tr></thead>
<tr><td rowspan=2><code>Ctrl</code></td><td>ターミナル向けのショートカットキー</td><td><code>Ctrl</code></td></tr>
<tr><td>アプリケーション向けのショートカットキー</td><td rowspan=2>主に <code>&#x2318; Command</code><br>一部 <code>&#x2325; Option/Alt</code></td></tr>
<tr><td>主に <code>Alt</code><br>一部 <code>⊞ Win</code> </td><td>OSシェル向けのショートカットキー</td></tr>
</table>
swiftでカスタムクラスを作ろう

ViewControllerの中にごちゃごちゃ書くとプログラムが見にくくなるので、カスタムクラスを作る。
「[詳細! Objective-C iPhoneアプリ開発 入門ノート](http://www.amazon.co.jp/Objective-C-iPhone%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA-%E5%85%A5%E9%96%80%E3%83%8E%E3%83%BC%E3%83%88-Xcode5-iOS7%E5%AF%BE%E5%BF%9C/dp/4800710227/ref=tmm_hrd_title_0)」のPart4 Chapter4-4学習記録です。

こんな感じになりました。
![アプリ画像](http://i.gyazo.com/78bee4a1b7f21b9754a27b0d46a3443f.png)

学習の手引的なものは下記の感じです。
###カスタムクラスを作ろう
* カスタムクラスを作る
* イニシャライザを作る
* swiftクラスをXcodeのユーティリティから追加する
* ペットの種類推薦アプリを作る
* 乱数を発生させる。

***

```swift:ViewController.swift

class ViewController: UIViewController {

    // テキストボックス：名前
    @IBOutlet weak var MyTextBox: UITextField!
    
    // 提案動物名
    @IBOutlet weak var AnimalPlan: UILabel!
    
    // 提案カウンタ
    var counter: UInt8 = 0
    
    // 選択した動物
    @IBOutlet weak var ResultDisplay: UILabel!
    
    // 自作クラスのオブジェクトを作成
    var cu = CustomUtility()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        
        // 自作クラスの変数にアクセス
        self.cu.mywhere = "梅田"
    }

    // 送信ボタンを押す（名前を送信する）
    @IBAction func SendName(sender: UIButton) {
        // 挨拶文を作成
        var greet = self.cu.getGreet(self.MyTextBox.text)
        // コンソールに挨拶文をプリント
        print(greet)

    }
    
    // 提案を見る
    @IBAction func ShowPlan(sender: UIButton) {
        
        
        var plan = self.cu.getAnimalPlan()
        // 提案をラベルにセット
        self.AnimalPlan.text = plan
        if (self.counter > 2) {
            sender.enabled = false
            
        }
        
        self.counter++
        
    }
    
    // OKボタンを押す
    @IBAction func SelectAnimal(sender: UIButton) {
        self.ResultDisplay.text = self.AnimalPlan.text
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

```

```swift:CustomUtility.swift

class CustomUtility:NSObject {
    
    // 場所
    var mywhere:NSString = "大阪"
    
    // クラスを初期化
    override init() {
        println("初期化")
    }
    
    // 挨拶文を作成する
    func getGreet(who:NSString)-> NSString {
        var msg = " \(mywhere)の\(who)さん、こんにちは "
        return msg
    }
    
    // 提案動物を作成
    func getAnimalPlan()-> NSString {
        // 提案配列
        var plans = ["ヨークシャテリア", "ウサギ", "カピバラ", "ニシキヘビ"]
        // 乱数作成
        var rnd = Int(arc4random()) % plans.count
        var plan = plans[rnd]
        return plan
    }
}

```
ここにソースを置いた。
https://github.com/hanoopy/ios_study1024
* * *

昨日も書いたけど、ストーリーボードに部品をいっぱい置いて
適当に放置してると、実行時エラーになることがある。
メッセージ：「terminating uncaught exception of type NSException」
![エラー](http://i.gyazo.com/27d6c0e26f463c05a60b8ee323a31fbf.png)

原因がよくわからないけど、部品を追加する毎に実行していれば防げるかと。
pythonでフォルダ内のファイル一覧をパス無しで取得する


pythonでフォルダの中を見る時ファイル名、ディレクトリ名は欲しいけどパスは要らないって場合には何が一番よいやり方なのでしょうね...

例えばtestディレクトリに以下の様なファイルが存在するとして

	test.csv
	test.py
	test.sh
	test.txt
	test1
	test2
	test3

`glob`モジュールを使ったとするとこうなりますよね。

```python

>>> import glob
>>> glob.glob('test/*')
['test/test.csv', 'test/test.py', 'test/test.sh', 'test/test.txt', 'test/test1', 'test/test2', 'test/test3']


```

ただ、理想としては

```python

>>> import hoge
>>> hoge.hoge('test/*')
['test.csv', 'test.py', 'test.sh', 'test.txt', 'test1', 'test2', 'test3']


```

このようになって欲しいのです。

　
以下の様な方法もありますが、ワイルドカード指定が出来ないのは辛い。

```python

>>> import os
>>> os.listdir('test/')
['test.csv', 'test.py', 'test.sh', 'test.txt', 'test1', 'test2', 'test3']

```

　
　
　
以上を踏まえて私が思いついたのは以下の3つ
その中でもよく使うのが`commands`を使う方法です。

```python
>>> import commands
>>> commands.getoutput('ls test/* | xargs -n 1 basename').split("\n")
['test.csv', 'test.py', 'test.sh', 'test.txt', 'test1', 'test2', 'test3']
```


　
他にはやはり`glob`モジュールで得たpathのbasenameだけ得るのが正攻法でしょうか。

```python

>>> import glob
>>> [r.split('/')[-1] for r in glob.glob('test/*')]
['test.csv', 'test.py', 'test.sh', 'test.txt', 'test1', 'test2', 'test3']

>>> import glob, os
>>> [os.path.basename(r) for r in glob.glob('test/*')]
['test.csv', 'test.py', 'test.sh', 'test.txt', 'test1', 'test2', 'test3']

```


　
　


皆様はどのようにしているのか気になったのでとりあえず自分の方法を書いてみました。
なにかいい方法があればご教授下さい。
[苦戦中][メモ]chef-container / knife-container

昨日の楽天でのセミナーでchefの中の人に，chef-containerを紹介してもらったんで，早速やってみたら，さっそくハマった話。

そもそもchefを触ったことないヤツが，中途半端な事前知識で突撃する物語。

# chefのインストール
chefDKをダウンロードしてrpmインストール。 (書いてある通りにやる)
今回はcentos6に入れたので，RHELのインストーラを取ってきた。

# Proxy環境下でのgem
毎回ハマるproxy
gemが参照するのは```/etc/environment```らしい。

参考: http://qiita.com/Kentrow@github/items/b5a7dc8819a2e0e0f603

```:/etc/environment
http_proxy="http://USER:PASS@URL:PORT"
https_proxy="http://USER:PASS@URL:PORT"
```

``` " ```で囲うのが特徴的。

(しかし，自分のプロキシの情報が，あっちこっちに記述されてて，メンテできん。。。)

# knife-container/chef-containerインストール

```
chef gem install knife-container
chef gem install chef-container
```

頭にsudoを最初つけていたら，rootのchefにインストールされてしまう模様。注意。
公式にはchef-containerの記述はなかった。knifeだけでいいのかな？(よくわかってない)

# knife-containerやってみる

その前にchef-repoを作っておいた方がいいらしいので，knifeで作る

```
$ chef gem install knife-solo
$ knife solo init chef-repo
$ cd chef-repo
```

いよいよknife-containerを叩く。
公式に記述してあるヤツをそのまま叩く。
https://docs.getchef.com/containers.html

```
$ knife container docker init docker -r 'recipe[apache2]' -z -b
...
Context Created: ./dockerfiles/docker
$ tree dockerfiles/
dockerfiles/
└── docker
    ├── Berksfile
    ├── Dockerfile
    └── chef
        ├── first-boot.json
        └── zero.rb
```

おおお，それっぽい！

```Dockerfile:dockerfiles/docker/Dockerfile
# BASE chef/ubuntu-12.04:latest
FROM docker
ADD chef/ /etc/chef/
RUN chef-init --bootstrap
RUN rm -rf /etc/chef/secure/*
ENTRYPOINT ["chef-init"]
CMD ["--onboot"]
```

Dockerfileもできてる模様。なるほど，chefフォルダを/etc/chefにマウントして，chef-initを叩く，，，と (Dockerfileは読める)

# buildしてみる
このディレクトリでいいのかなーと思ってとりあえず叩いてみる

```
$ knife container docker build docker -z
...
 no Dockerfile found in ./dockerfiles/docker
```

!?

なんか，色々うまくいってそうな雰囲気だったのに＞＜

```
$ tree dockerfiles/
dockerfiles/
└── docker
    ├── Berksfile
    ├── Berksfile.lock
    ├── Dockerfile
    ├── chef
    │   ├── first-boot.json
    │   └── zero.rb
    └── dockerfiles
        └── docker
            └── chef
                └── cookbooks
                    ├── Berksfile.lock
                    ├── apache2
...
33 directories, 244 files
```

なんかフォルダ構成がおかしくなってる。多分カレントディレクトリが```dockerfiles/docker```になったところで，何か構築してしまってるみたい。たしかに```dockerfiles/docker/dockerfiles/docker```にはDockerfileはない模様。


…あと少しだったのに。。。 とりあえずpending...
Drupalの専門用語(随時追加中)


Drupalを始めると、専門用語があれこれでてくるのですが、
それが何を表すのか曖昧で混乱します。これが役に立てば幸いです。


### NodeとEntityの違い
一言で言うと、NodeはEntityの一部です。

Entityはデフォルトでは下記の通りです。

* Node
* Taxonomy
* users
* comments

WordPressのポストに値するのがNodeです。Nodeの中で"Article"や"Basic Page"のようなコンテンツタイプが存在します。

EntityはカスタムEntityを定義する事ができます。
[objc][memo] UIWebViewでDIGEST認証




UIWebViewでダイジェスト認証したい場合、NSURLProtectionSpaceというのを使うらしい。
URLにIDPASSを含んでもいいんだけど、何らかの理由で含められない場合。


AppDelegateの頭とかで呼べば、以降のUIWebViewの認証が通る(?)ようです。
`authenticationMethod`に`NSURLAuthenticationMethodHTTPDigest`を指定。


```objectivec:AppDelegate.m


#define DIGEST_USER_NAME = @"yourname";

#define DIGEST_PASSWORD	= @"yourpassword";

#define DIGEST_HOST		= @"www.hoge.jp"

// realmは、「curl -Iv http://www.hoge.jp/fuga/piyo」等で調べられる
#define DIGEST_REALM	= @"Input ID and Password"　


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

	//------------------------------------
	// ダイジェスト認証
	//------------------------------------

	NSURLCredential *creds = [NSURLCredential 
		credentialWithUser:DIGEST_USER_NAME password:DIGEST_PASSWORD
		persistence:NSURLCredentialPersistenceForSession];

	NSURLCredentialStorage* store = [NSURLCredentialStorage sharedCredentialStorage];
 
	NSURLProtectionSpace* protectionSpace = [[NSURLProtectionSpace alloc] initWithHost:DIGEST_HOST
            port:80
            protocol:@"http"
            realm:DIGEST_REALM
            authenticationMethod:NSURLAuthenticationMethodHTTPDigest];

    [store setCredential:creds forProtectionSpace:protectionSpace];
    return YES;
}
```

##参考
[やっと人類の悲願だった「UIWebView でBasic 認証のかかったサイトを閲覧する方法」がわかった - laiso - iPhoneアプリ開発グループ](http://iphone-dev.g.hatena.ne.jp/laiso/20120301/1330611905)


##さいごに
なにか間違いがありましたらご指摘いただけるとありがたいです
【PHP】（あー、画像をバラバラにしてタイル状に並べて、出力してぇ）

ということがよくあるかと思います。

まず、「[超画像魂コンバイン](https://sites.google.com/site/creatorheaderterminal/soft/chao-hua-xiang-hunkonbain)」というフリーソフトを使って1枚の画像を分割します。

縦横30で分割した場合、ファイルが保存されるときの命名規則は、下記のようになります。

|x0,y0|x1,y0|x2,y0|・・・|x29,y0|
|:--|:--|:--|:--|:--|
|・・・|・・・|・・・|・・・|・・・|
|x0,y29|・・・|・・・|・・・|x29,y29|

名前順でソートすると、左の一列から順にファイルが表示されます。

フリーソフトで画像を出力しようと試みましたが、命名規則の問題で縦横の表示がうまくいかず断念。

phpのfor文を使って表示することに。

```php
<ul>

<?php

for($x = 0;$x < 30; $x++) {

	echo '<li>';

	for($y = 0;$y < 30; $y++) {
		echo '<img src="hoge_x' . $x . '_y' . $y . '.jpg"><br>'  ;
	}

	echo '</li>';
}

?>

</ul>
```

あとは、cssで調整して出力すれば完成。
実家のMacを自宅から画面共有

奥様の実家は両親二人暮らしなので、パソコンのメンテをできる人がいない
なので、自宅から僕が画面共有してパソコンサポートをしてあげるためにやったことの記録

# 目標

Macを奥様の実家にセッティングして、画面共有できるようにして、自宅からいじれるようにする

# Macをセッティング
回線は光で、ひかり電話ルータ（？）のPR-S300SEというものがついていた
TAだけかと思っていたら、それ自体がルータを兼ねていたので、MacのイーサネットケーブルさせばそれだけでネットOK

# グローバルIPの確認手段
[確認くん](http://www.ugtop.com/spill.shtml)をsafariのブックマークに入れておく
ルータのグローバルIPがどのくらいの頻度で変更されるのかわからないけど、固定ではないので、これを使ってIPを電話で教えてもらうことにする

# プライベートIP固定と静的IPルーティング
画面共有をするためには外からの5900番ポートアクセスをルータを経由してMacに運ばなくてはいけない
そのためにはMacのプライベートIPを固定して、そのIPに5900番ポートをルーティングする必要がある
ブラウザから`http://ntt.setup/`もしくは`http://192.168.1.1/`でルータの設定画面にアクセスできる
IDとパスワードを聞かれるので、IDは「user」パスワードは回線のセッティングをしてくれたNTTの人の手書きのメモが残っていたのを入力
ルータのセッティング画面に入れたら「DHCPv4サーバ設定」で「開始IPアドレス」を適当に後にずらして「割当て個数」も減らして、MacのIPの場所を空ける
例えばMacは192.168.1.10で固定ということに決めて、DHCPの開始IPは192.168.1.11〜にしておく
次に「静的IPマスカレード設定」で「優先順位」を10（適当）「接続インターフェース名」は「メインセッション(Internet)」、「宛先アドレス」は先ほど決めた192.168.1.10、変換対象IPアドレスは「自分のWAN側IPアドレス」、変換対象プロトコル「TCP」、「宛先ポート」「変換対象ポート」は5900にする

# Macのネットワーク設定
最初はMacはDHCPでつながっているが、さっき固定のIPにすることに決めたので、「システム環境設定」→「ネットワーク」→「Ethernet」の「DHCPサーバを使用」のところを「手入力」に変更して、「IPアドレス」をさっきの192.168.1.10、「サブネットマスク」を255.255.255.0、「ルーター」を192.168.1.1に設定

# Macのアカウント設定
普段実家の家族が使うアカウント以外に自分用のアカウントを作る
実家の家族はいちいちログインするのにパスワードを使いたくないということだったが、パスワードなしのアカウントを画面共有で世界に開くわけにもいかないので、画面共有できるのは自分のアカウントだけにして、そのアカウントにパスワードをかける

# 共有設定
「システム環境設定」→「共有」→「画面共有」で「次のユーザのみ」の中から「Administrators」を削除して自分のアカウントだけを追加

#画面共有.app
AppleとしてはSafariのURLバーに`vnc://xxx.xxx.xxx.xxx`と打ち込んでアクセスして欲しいようだけど、実際はそうすると画面共有.appという別のアプリを呼び出しているだけである
最近はSafariを使ってないので直接画面共有.appを使うことにする
ターミナルから

```
ln -s /System/Library/CoreServices/Applications/Screen\ Sharing.app /Applications
```

としておけば画面共有.appがローンチパッドに出てきて普通のアプリとして使える
グローバルIPを打ち込んでアクセスしたら、IDとパスワードを入れる
この際にキーチェーンに登録してしまうと、もう自動的にログインしてしまうようになって、別のアカウントでアクセスできないので（まあそれでもいいんだけど）登録しないほうがいいみたい
パスワードが認証されると、現在先方のMacを使ってるユーザーに許可を求めてディスプレイを共有するか、自分のアカウントでログインして仮想ディスプレイを表示するかを聞かれる
現在先方のMacを使ってるアカウントで接続した場合は何も聞かれずそのまま画面が表示される
この辺はさすがApple純正といった感じでよくできている
これで、（奥様の）実家のパソコンサポートの準備は完了

# 画面共有の注意点
いくつか気づいたこと

- 仮想ディスプレイで画面共有してるときに画面共有.appを普通に終了して切断してしまうと、リモートのMacにプロセスがいっぱい残ってしまうようなので、ちゃんと共有画面の中のアップルマークからログアウトしたほうがいいみたい
- 転送情報が減って高速化されるかと思って仮想ディスプレイを使ってるときに「システム環境設定」→「ディスプレイ」で解像度を減らしてみたのだけど、画面が真っ暗になってしまった何度もアクセスしたり切断したりしてみても、真っ暗な画面しか表示されなくなってしまって焦った
結果としては、30分位経ってからちゃんと変更された解像度で表示されたのでよかったのだけど、いじらないほうが無難でしょう
解像度関係のセッティングは他のVNCソフトでも鬼門みたい
Knockout.jsで'touchend'のカスタムバインディング


スマフォ用サイトでclickイベントを使用すると、モサっとした感じになります。
この現象については、clickイベントには待ち時間が存在するからで、スマフォサイトの場合はtouchイベントを使う事で解決する事になると思います。

しかしながら、今のところKnockout.jsには`touchstart`や`touchend`といったバインディングは存在しません。
`touchend`イベントを指定したい場合等は、`event`バインディングを使用します。

```html:event-binding.html
<div data-bind="with: app">
  <button type="button" data-bind="event: {touchend: foo}">TOUCH!!</button>
</div>

<script>
var ViewModel = (function(){
  function ViewModel(){}

  ViewModel.prototype.foo = function(){
    alert('タッチされました。');
  };
})();

ko.applyBindings({
  app: new ViewModel()
});
</script>
```

これで`touchend`イベントを紐付ける事が出来ました。
めでたし・めでたし

###・・・ではありません

`touchend`は画面をタッチしてスクロールした時も、指を離した瞬間に発生してしまいます。
これを防ぐために、`touchstart`と`touchend`の組み合わせで制御したりしますが、上記の様に`event`バインディングで対応するとなると、これはもう大変な作業になってしまいます。

そこで、カスタムバインディングを使用する方法を考えてみます。

```html:touchend-binding.html
<div data-bind="with: app">
  <button type="button" data-bind="touchend: foo">TOUCH!!</button>
</div>

<script>
var ViewModel = (function(){
  function ViewModel(){}

  ViewModel.prototype.foo = function(){
    alert('タッチされました。');
  };
})();

ko.applyBindings({
  app: new ViewModel()
});

// touchendのカスタムバインディング
ko.bindingHandlers['touchend'] = {
  'init': function(element, valueAccessor, allBindings, viewModel, bindingContext){
    var $el = $(element);
    var srcYOffset = null;

    // タッチスタート時に、元々のY座標を取得
    $el.on("touchstart", function(){
      srcYOffset = window.pageYOffset;
    });

    // タッチエンド
    $el.on("touchend", function(){
      var destYOffset = window.pageYOffset;

      if (srcYOffset === destYOffset) {
        var handlerFunction = valueAccessor();

        viewModel = bindingContext['$data'];

        handlerReturnValue = handlerFunction.apply(viewModel, arguments);
      }
    });
  }
};
</script>
```

`touchend`用のカスタムバインディングの中で、スクロールが発生している場合を判断する様に制御を入れました。
これで`data-bind="touchend: foo"`といった様な記述だけで、スクロール制御がされたtouchendイベントが使用できます。

###追記（答えなし）
上記のコードでちょっと気になっているのが、$elに直接イベントをバインディングしているところです。
これだと、イベントの登録数が増える事が想定されるので、改善案を考えたいところです。
AWSソリューションアーキテクトを目指すための備忘録


## IAM role

- インスタンス起動時に割り当てることができる
- インスタンスに一つしか割り当てられない
- 既存インスタンスに割り当てられない
- 割り当て解除できない
- Permission変更は即時反映

## セキュリティグループ

- FWのこと
- インスタンス一つに複数割り当てることができ、ホワイトリスト方式で適応
- 更新すると即時反映するが、起動中のセッション（要確認）には反映しないので再起動が必要なこともある
- EC2-Classicを利用している場合はEC2-Classic用のセキュリティグループを使用しなくてはいけない
- EC2-Classicでは1インスタンスにつき500のグループを割り当てることができる
- EC2-Classicでは1グループにつき100件のルールを記載できる
- EC2-VPCを利用している場合はEC2-VPC用ののセキュリティグループを使用しなくてはいけない
- EC2-VPCでは1インスタンスにつき5のグループを割り当てることができる
- EC2-VPCでは1グループにつき50件のルールを記載できる

## EBS

- ネットワーク接続型のストレージ
- Port全クローズでもアタッチできる
- SnapShotを経由すれば別のAZへ移動できる

## [EC2] Optimized Instance

- EBS用にネットワーク帯域最適化を行う
- 500Mbps ~ 2000Mbps

## [EBS] Provisioned IOPS

- IOPSを指定できる
- EBS Optimized Instanceを使うことが前提
- 合計20TB / 10,000IOPSが上限
- 上限は申請ベースで解除できる

## インスタンスストア

- 別名：エフェメラルディスク（Ephemeral Disk）
- 揮発性ストレージの種類の一つ
- 無料で使える
- t1/t2インスタンスでは利用できない（m3.medium以上）
- 別のインスタンスへアタッチすることはできない
- インスタンスの停止・終了でデータは失われる
- インスタンスの再起動（意図しないものでも）ではデータは失われない

## SnapShot

- S3に保存される
- 2回目以降は差分保存できる
- 他のアカウントと共有可能

## プレイスメントグループ

- グループ化されたインスタンスは物理的に距離が近くなり通信コストが減る
- AZ・サブネットをまたげない
- インスタンスタイプを混在させることができない
vimでコメント行を折り畳む

# コメント行だけを折り畳みたい
configファイルなどを編集していると山ほどコメント行があるけど、実際に設定している部分は数行だけ、ということがよくある
そんなときはコメント行を全部折りたたんでしまいたい

コメント行を表示しないプラグインは見つかったのだけど、プラグインはインスコがめんどくさいなあ…

と思っていたら`set foldexpr`を使った方法を[ここ](http://www.debian-administration.org/article/616/Hiding_comments_in_configuration_files)で見つけました

```
set foldexpr=getline(v:lnum)=~’^\s*[#;]’?1:getline(prevnonblank(v:lnum))=~’^\s*[#;]’?1:getline(nextnonblank(v:lnum))=~’^\s*[#;]’?1:0
```

スクリプトの内容はあまり理解できていないのだけど(^_^;)、このおまじないを.vimrcあたりに書いておく

そしてコメント行が多いファイルをひらいたら

```
set foldmethod=expr
```

とすればコメント行が折り畳まれる

```
set fdm=expr
```

でもOK

`zi`で折り畳みを閉じたり開いたりします

なお対応するコメントの記号は#と;にしました（php.iniだと;がコメント記号なので）
他にも使いたければスクリプト中の`[#;]`の部分に追加すればいけるはず

`set foldmethod=expr`を`.vimrc`に書いてしまってもいいのだけど、普通に折り畳みを使いたい時もあるし、書いちゃうとファイルを開いた瞬間からコメント行が折り畳まれてしまってなにかと困るのでコメントの折り畳みは手動で
boot2docker ホストのディスクサイズを変える

`~/.boot2docker/profile` と言うファイルで設定するらしい。直接編集する。

```conf
DiskSize = 80000
```

と一行書いたら認識される。

```console
$ boot2docker config                                                             
# boot2docker profile filename: /Users/udzura/.boot2docker/profile
Init = false
Verbose = false
Driver = "virtualbox"
SSH = "ssh"
...
DiskSize = 80000
Memory = 2048
SSHPort = 2022
...
Waittime = 300
Retries = 75
```

あとはVMを再作成すれば良いぞ〜

```bash
boot2docker delete && boot2docker init && boot2docker up
```
シンプルなbash zshのプロンプト

# シンプルなプロンプト
普通デフォルトのプロンプトだと

```
[username@servername pwd]$
```

って感じですけど、ちょっと長い
特にローカルで作業してる場合などはサーバ名やユーザーネームなど出る必要も特にない
そこでできるだけシンプルで短いプロンプトにしてみることにしました
# bashの場合
一番シンプルなのがこれ

```
PS1='\[\033[7m\]\W\[\033[0m\]\$ '
```

![ss.jpg](https://qiita-image-store.s3.amazonaws.com/0/31813/de45694c-a4e1-5994-1342-7b4db198ed5c.jpeg)

反転表示のカレントディレクトリと\$マークのみが表示される

外部サーバにログインしているときは、プロンプトにサーバ名やユーザ名が出ていたほうが都合がいいので、こんな感じ

```
PS1='\[\033[7m\]\u\[\033[0m\]\h\[\033[7m\]\W\[\033[0m\]\$ '
```

# zshの場合
bashと表記が違うけど内容は同じで、一番シンプルなのがこちら

```
PROMPT='%S%1~%s%(!.#.%%) '
```

ユーザー名とサーバ名を表示するパターンがこちら

```
PROMPT='%S%n%s%m%S%1~%s%(!.#.%%) '
```

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/31813/26518b04-eaf0-d1c9-88b8-4243fc92be0c.png)

実際はこれにプラスしてoh-my-zshのgitプラグインを利用して画面右側にgitリポジトリの状態を表示して使っていますが、そちらは省略

# 追記（色付きバージョン）
最近色気づいてきたので（？）プロンプトに色をつけてみました

![スクリーンショット 2016-11-10 17.37.48.png](https://qiita-image-store.s3.amazonaws.com/0/31813/d4a320a7-0895-bed9-ea4f-31fc6ec1af43.png)

- bashのシンプル色付きバージョン

```
PS1='\[\e[1;7;32;44m\]\W\[\e[0m\]\[\e[1;32m\]\$\[\e[0m\] '
```

- bashのサーバ名付き色付きバージョン

```
PS1='\[\e[1;7;32;44m\]\u\[\e[0m\]\[\e[1;32m\]\h\[\e[0m\]\[\e[1;7;32;44m\]\W\[\e[0m\]\[\e[1;32m\]\$\[\e[0m\] '
```

表記の中の1;7;32;44というのはbold（1）で反転（7）でフロントカラーがGreen（32）（boldと組み合わさるとLight Green）、バックカラーがBlue（44）、というややこしいものです
色の種類はこんな感じ

|文字色|番号|背景色|番号|bold体文字色|番号|
|:--|--:|:--|--:|:--|--:|
|Black     |30|Black     |40 |Dark Gray   |1;30|
|Blue      |34|Blue      |44 |Light Blue  |1;34|
|Green     |32|Green     |42 |Light Green |1;32|
|Cyan      |36|Cyan      |46 |Light Cyan  |1;36|
|Red       |31|Red       |41 |Light Red   |1;31|
|Purple    |35|Purple    |45 |Light Purple|1;35|
|Brown     |33|Brown     |43 |Yellow      |1;33|
|Light Gray|37|Light Gray|47 |White       |1;37|

|効果|番号|
|:--|--:|
|bold|1|
|下線|4|
|反転|7|


- zshのシンプル色付きバージョン

```
PROMPT='%S%{$fg_bold[green]%}%{$bg[blue]%}%1~%{$reset_color%}%s%{$fg_bold[green]%}%(!.#.%%)%{$reset_color%} '
```

- zshのサーバ名付き色付きバージョン

```
PROMPT='%S%{$fg_bold[green]%}%{$bg[blue]%}%n%{$reset_color%}%s%{$fg_bold[green]%}%m%{$reset_color%}%S%{$fg_bold[green]%}%{$bg[blue]%}%1~%{$reset_color%}%s%{$fg_bold[green]%}%(!.#.%%)%{$reset_color%} '
```

zshでこのような表記で色を使う場合は事前にこのようにcolor機能をロードしておく必要があるみたい

```
autoload -Uz colors && colors
```

oh-my-zshとか使ってるとすでにどこかでロードしてるのか、とくにzshrcに書く必要はありませんでした

使える色名は

|色名|
|:--|
| black  |   
| green  |  
| blue   | 
| cyan   |  
| red    |
| yellow |
| magenta|
| white  |
Rubyで2段階認証(2FA)用のQRコードを生成する流れ


2段階認証について調べる機会があったのでまとめてみます。

## 2段階認証
2段階認証(Two Factor Authentication) とは[Wikipedia](http://en.wikipedia.org/wiki/Two_factor_authentication)によると、「異なる2つのコンポーネントを組み合わせにより、ユーザーの明確な識別を提供する認証」とあります。（以下、2段階認証を2FAと書きます）

会社のVPNにアクセスするためにパスワードと認証用のUSBスティックを使う、というのも2FAになります。
Webサービスの場合はユーザが設定したパスワードに加えて、ワンタイムパスワードを用いる方式が主流となっています。

このワンタイムパスワードの生成にはRFCで仕様が決められている[HOTP(HMAC-based One-time Password Algorithm)](https://tools.ietf.org/html/rfc4226)や[TOTP(Time-based One-time Password Algorithm)](https://tools.ietf.org/html/rfc6238)が用いられます。
よく利用されているのは時間ベースのTOTPなので以下はTOTPにフォーカスしていきたいと思います。

ざっくりとパスワード生成のルールを下記に列挙します。（詳細はRFCをご参照ください）

- クライアントとサーバーは同じsecret（秘密鍵）を共有する
- クライアントとサーバーは同じtime-step（鍵更新のインターバルとなる秒）の値を使う
- クライアントごとにユニークなsecretを持つ
- secretはランダムなアルゴリズムから生成された方がよい

TOTPはこれらのルールとUnixtimeを使ってパスワードを生成することになります。

## Rubyで実装
[rotp](https://github.com/mdp/rotp) (Ruby One Time Password Library) というgemが上で述べた仕様を実装してくれているのでこれを利用します。またGoogle Authenticatorで読み込めるようにQRコードを生成するのでrqrcodeも利用します。

### サンプルコード
```ruby
require 'rotp'
require 'rqrcode'
require 'rqrcode_png'

secret = ROTP::Base32.random_base32
totp   = ROTP::TOTP.new(secret)
uri    = totp.provisioning_uri("qiita.com/mitz")

qr     = RQRCode::QRCode.new(uri, size: 12)
png    = qr.to_img
png.save("2fa.png")
```

処理フローは下記です（簡単ですね！）
1. パスワードを生成
2. TOTPオブジェクトを生成
3. uri形式に
4. 生成したuriをQRコード画像にして保存

実際に生成されたQRコードはこちらです。お手元にGoogle Authenticatorアプリ（もしくは他の2FA認証用アプリ）がある人は読み込めるか試してみてください。

![2fa.png](https://qiita-image-store.s3.amazonaws.com/0/28290/be24d9a0-ba09-20ec-8f35-3a472a6d7fcd.png "2fa.png")

### rotpでできること

パスワード生成用のメソッドが用意されています。

```ruby
ROTP::Base32.random_base32     # デフォルトlengthは16文字
ROTP::Base32.random_base32(32) # length指定できます
```

TOTPまわり

```ruby
totp = ROTP::TOTP.new("secret") 
# 現在のUnixtimeからワンタイムパスワード生成
totp.now
# ワンタイムパスワードの検証
totp.verify("012345")
# KeyUriFormatの出力
# FYI. https://code.google.com/p/google-authenticator/wiki/KeyUriFormat
uri = totp.provisioning_uri("LABEL")

# issuerの付与
totp_with_issuer = ROTP::TOTP.new("secret", :issuer => "multipleDB")

# パスワード更新のインターバル指定（デフォルト30秒)
totp_with_interval = ROTP::TOTP.new("secret", :interval => 60)

# clock driftを考慮したパスワード検証
# ネットワーク遅延などによるGAPを考慮してインターバル+αを指定できる
now = Time.utc(2014,10,24).to_i
totp.verify_with_drift("567890", 30, now)  # この指定だと30秒古いパスワードを通すようになる
```

HOTPも扱えます

```ruby

hotp = ROTP::HOTP.new("secret")
hotp.at(1234) # HOTPは時間ではなくカウンター値でパスワードを生成します
hotp.verify("509997", 1234) # => true
```

## まとめ
ライブラリを使えば、簡単に2FAを導入することができるのでよりセキュアな認証が必要だと考えているサービスは検討しても良いのではないでしょうか！

## 追記
関連するRFCをブログに書いたのでリンク貼っておきます。
[TOTP: Time-Based One-Time Password Algorighm のRFC読んだのでメモ - モノノフ日記](http://mononofu.hatenablog.com/entry/2014/10/21/203004)
OSXでキーボードでアプリケーションの切り替え

# 英数、かなキーを使って切り替える
OSXでキーボードでアプリケーションの切り替えをする場合は`⌘+TAB` `⌘+Shift+TAB`だ

慣れればいいのかもしれないけど、さっと使うには面倒臭い、特にShiftを使った逆順の方はとっさに使えるものではない

`⌘+TAB`を`CTRL+TAB`にマッピングしたりもしてたのだけど、これもやっぱり使いづらい

ってことで、`CTRL+英数` と `CTRL+かな`でアプリケーションを切り替えるようにしてみた

Macの純正キーボードではないPCキーボードを使っている場合は`CTRL+無変換` と `CTRL+変換`

PCキーボードを使う場合はこれ以前にSeil（旧称PCKeyboardHack）でCTRLキーとCapsLockを入れ替えて使っているので、正確に言うと`CapsLock+無変換` と`CapsLock+変換`で使っている

キー変換アプリであるKarabiner-Elementを利用する
```~/.config/karabiner/karabiner.json```の中の```profiles->complex_modifications->rules```に以下を追加

```JSON:karabiner.json
{
    "description": "Change Apps By HENKAN",
    "manipulators": [
        {
            "from": {
                "key_code": "japanese_kana",
                "modifiers": {
                    "mandatory": [
                        "control"
                    ]
                }
            },
            "to": [
                {
                    "key_code": "tab",
                    "modifiers": [
                        "left_command"
                    ]
                }
            ],
            "type": "basic"
        },
        {
            "from": {
                "key_code": "japanese_eisuu",
                "modifiers": {
                    "mandatory": [
                        "control"
                    ]
                }
            },
            "to": [
                {
                    "key_code": "tab",
                    "modifiers": [
                        "left_command",
                        "left_shift"
                    ]
                }
            ],
            "type": "basic"
        }
    ]
},
```
旧情報 ~~Karabiner（旧称KeyRemap4Macbook）のprivate.xml機能を使って以下のように記述~~

```xml:private.xml
<?xml version="1.0"?>
<root>
  <item>
    <name>Change APPs</name>
    <appendix>Change APPs by Eisuu and Kana</appendix>
 <identifier>private.change_apps</identifier>
    <autogen>--KeyToKey-- KeyCode::JIS_KANA, VK_CONTROL, KeyCode::TAB, VK_COMMAND</autogen>
    <autogen>--KeyToKey-- KeyCode::JIS_EISUU, VK_CONTROL, KeyCode::TAB, VK_COMMAND | VK_SHIFT</autogen>
  </item>
</root>
```

とても快適です
~~private.xmlの使い方は省略~~
karabiner.jsonの詳細については[こちら](https://pqrs.org/osx/karabiner/json.html)を参照
rubyの配列からnilと空文字を取り除く

```rb
['a', nil, '', 'b'].compact.reject(&:empty?)
=> ["a", "b"]

['a', nil, '', 'b'].compact.delete_if(&:empty?)
=> ["a", "b"]
```

なにかで便利メソッドが提供されてる気もする...

---

ActiveSupportにString#blank?があった。

```
['a', nil, '', 'b'].reject(&:blank?)
=> ["a", "b"]
```
Mac OSXにPerl + ImageMagick + Image::Magickをインストールする

Mac OSXでImage::Magickをインストールするのにはちょっとコツがいります。
この記事のとおりにやればいけます。

# コツ
* ImageMagickをhomebrewでインストール**しない**
* Image::Magickをcpan/cpanmでインストール**しない**


# 環境
* OSX 10.9.5 (mavericks)
* Perl 5.20.1
* ImageMagick 6.8.9-8 Q16
* Image::Magick 6.89

(たぶん Yosemiteでも同じ手順でいけると思います。どなたか追試していただけると助かります。)

# はじめに：ImageMagickとImage::Magickの違いを知る

![image::magick](http://dqn.sakusakutto.jp/images/suneo-perl.PNG)

[Perl]ImageMagickとImage::Magickの違いについてそろそろ一言いっておくか。
http://dqn.sakusakutto.jp/2011/08/perl-imagemagick-imagemagick.html


# plenvでPerlをインストール

plenvを使って最新のPerlをインストールします。
手順は割愛。

# ImageMagickをインストール

homebrewだとImage::MagickとImageMagickのバージョン齟齬の問題が発生して動かないことが多いのでhomebrewは避けます。

ソースを取得して自分でビルドします。

```
wget ftp://ftp.kddlabs.co.jp/graphics/ImageMagick/ImageMagick-6.8.9-8.tar.gz
tar xvfz ImageMagick-6.8.9-8.tar.gz
cd ImageMagick-6.8.9-8
./configure -enable-shared --with-perl=~/.plenv/shims/perl
make
sudo make install
```
--with-perl=~/.plenv/shims/perl がポイントです。
こうすると、ImageMagickに同梱されているImage::Magickを一緒にビルドしてくれます。


# 動作確認
```
$ perl  -MImage::Magick -E 'say $Image::Magick::Q16::VERSION;'
6.89
```

# リサイズしてみる
in.JPG というファイルを渡してリサイズし、out.JPGというファイルを生成します。

```
$ perl -MImage::Magick -e '$x=Image::Magick->new;$x->Read(shift);$x->Resize(width=>100,height=>100);$x->Write("out.JPG");' in.JPG
```
Error occured at: goaccess.c - main - 832 エラーの対応


```nginx.ltsv
color_scheme 2
date_format %d/%b/%Y:%T %z
log_format host:%h\tuser:%^\ttime:%d\treq:%r\tstatus:%s\tsize:%b\treferer:%R\tua:%u\tforwardedfor:%^\treqtime:%T\tapptime:%^
```

上のdate_format部分を修正する

```nginx.ltsv
color_scheme 2
date_format %d/%b/%Y
log_format host:%h\tuser:%^\ttime:%d\treq:%r\tstatus:%s\tsize:%b\treferer:%R\tua:%u\tforwardedfor:%^\treqtime:%T\tapptime:%^
```

上記以外でもformatがあっていないと832エラーになるようなので、
formatを削りつつ見直します。
PHP からのセキュア接続で POODLE 対応の影響を受けるケース/受けないケース

内容は随時更新します。
突っ込みや、追加の情報あればコメント・編集リクエストいただけれれば幸いです。

このページでは、PHP プログラムから外部のサーバにセキュア接続するケースについてまとめていきます。
クライアントからの接続を待ち受けるケースについては、この記事には記載しません。

POODLE 対応においては、SSL v2, SSL v3 以下による接続を無効化することになるので、そういった対応を行った際に影響を受けるケース/受けないケースについてまとめます。

# 影響を受けるケース

## fsockopen() で ssl://, sslv2://, sslv3:// を使ってホストを指定した場合

[PHP: fsockopen - Manual](http://php.net/manual/ja/function.fsockopen.php)

`fsockopen()` 関数では第一引数の `$hostname` に URL スキームを付加することで、トランスポート方式を選択できます。

トランスポート方式の指定については以下のマニュアルがあります。

[PHP: Internet ドメイン: TCP、UDP、SSL、および TLS - Manual](http://php.net/manual/ja/transports.inet.php)

> ssl:// は SSL V2 での接続を試みます。 あるいはリモートホストの設定によっては SSL V3 での接続を試みます。 sslv2:// および sslv3:// は、SSL V2 と SSL V3 のどちらのプロトコルを 使用するかを明示的に指定します。

というわけで、少なくとも `ssl://`, `sslv2://`, `sslv3://` を使用した場合は確実に影響を受けるようです。
(tls:// なら本当に影響を受けないのか、またシームレスに移行できるのか、については調査中)

## ストリームラッパーで https を指定した場合

[PHP: http:// - Manual](http://php.net/manual/ja/wrappers.http.php "PHP: http:// - Manual")

PHP はファイルシステム関数で https:// を指定することで https で URL にアクセスすることができます。

PHP 5.6 からは、ストリームラッパーのコンテキストオプションで SSL/TLS のバージョンを選択できます。

[PHP: PHP 5.6.x における OpenSSL 関連の変更 - Manual](http://php.net/manual/ja/migration56.openssl.php#migration56.openssl.crypto-method "PHP: PHP 5.6.x における OpenSSL 関連の変更 - Manual")

```php
<?php
stream_context_set_default([
    'ssl' => [
        'crypto_method' => STREAM_CRYPTO_METHOD_TLS_CLIENT,
    ],
]);

echo file_get_contents('https://www.google.com/');
```

以下のようにすると使用された SSL/TLS のバージョンが確認できます。

```php
<?php
stream_context_set_default([
    'ssl' => [
        'crypto_method' => STREAM_CRYPTO_METHOD_TLS_CLIENT,
        'capture_session_meta' => true,
    ],
]);

file_get_contents('https://www.google.com/');

$ctx = stream_context_get_default();
$meta = stream_context_get_options($ctx);
var_dump($meta['ssl']['session_meta']['protocol']);
```

デフォルトでより上位のバージョンが選択されるので、サーバが脆弱でなければ大丈夫です。

---

皆様からの情報をお待ちしてます。
【growlnotify】このコマンドが成功したとき・失敗したときは、これで通知

### シェル準備

/usr/local/bin/gr

```bash
#!/bin/sh
$*
if test $? -eq 0
then
        MESSAGE="complete!"
        P=0
else
        MESSAGE="error..."
        P=1
fi
growlnotify -t $MESSAGE -m "$*" -p $P
exit $P
```

```bash
chmod 744 /usr/local/bin/gr # 管理者以外も使用できるようにするなら755
```

### Growl設定

* Growlの環境設定　＞
  * 一般　＞　ログイン時にGrowlを開始
  * アプリケーション　＞　growlnotifyを有効にする
  * 表示　＞　好みで色分け設定等する
      * 優先度　右端：complete時の色、右端から2番目：error時の色
      * 自分はMusic Video派

### 使用例

```bash
$ gr /path/to/script.rb
  # => scriptが終わったら、成功したときと失敗したときで分けて通知が来る
```

### 参考
* （まるっと参考にしたサイト様あります。発掘次第記載します。）
* aliasしてるコマンドと組み合わせるとうまくいかないこともある。
Java チューニングメモ

option一覧
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html


http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html
http://www.oracle.com/technetwork/java/faq-140837.html

http://www.atmarkit.co.jp/ait/articles/0704/24/news136_2.html
Vagrantのバージョンを指定する


チームでVagrantを利用してると、各環境のバージョンが違って予期せぬトラブルが起きたので対応策を共有しておきます.

これでバージョン違いでチームメンバーからのクレームが少なくなると思います.

## 警告を表示

チームメンバーが複数のプロジェクトを掛け持ちしている場合、
Vagrantのバージョンを固定するのは難しいのでオススメの対策は警告を表示することです.

```ruby:Vagrantfile
if  Gem::Version.new(Vagrant::VERSION) < Gem::Version.new('1.6.5')
  STDERR.puts "\e[33m[ WARNING ]\e[0m Please install vagrant 1.6.5"
  STDERR.puts "\e[33m[ WARNING ]\e[0m Current vagrant version : #{Vagrant::VERSION}"
end
```

## エラーを表示して終了

有無を言わさず指定したバージョン以上のみはメッセージを出して終了させちゃいましょう.

```ruby:Vagrantfile
# 1.6.5以上
Vagrant.require_version(">= 1.6.5")

# 1.3.5以上1.5.6未満
# Vagrant.require_version(">= 1.3.5", "< 1.5.6")

# 1.6.5以上1.7未満
# Vagrant.require_version("~> 1.6.5")
```

エラーメッセージ

```text
This Vagrant environment has specified that it requires the Vagrant
version to satisfy the following version requirements:

  >= 1.6.5

You are running Vagrant 1.6.3, which does not satisfy
these requirements. Please change your Vagrant version or update
the Vagrantfile to allow this Vagrant version. However, be warned
that if the Vagrantfile has specified another version, it probably has
good reason to do so, and changing that may cause the environment to
not function properly.
```
KnockoutJs Tutorial｜ajaxでの送信と受信



# **KnockoutJs Tutorial｜Loading and saving data**

knockout.js tutorial５こめhttp://learn.knockoutjs.com/#/?tutorial=collections ajaxで受信と送信をします。日本語で軽くコメントアウト入れました。

# **HTML**

```
<h3>Tasks</h3>

<form data-bind="submit: addTask">
    Add task: <input data-bind="value: newTaskText" placeholder="What needs to be done?" />
    <button type="submit">Add</button>
</form>

<ul data-bind="foreach: tasks, visible: tasks().length > 0">
    <li>
        <input type="checkbox" data-bind="checked: isDone" />
        <input data-bind="value: title, disable: isDone" />
        <a href="#" data-bind="click: $parent.removeTask">Delete</a>
    </li> 
</ul>

You have <b data-bind="text: incompleteTasks().length">&nbsp;</b> incomplete task(s)
<span data-bind="visible: incompleteTasks().length == 0"> - it's beer time!</span>


<!-- HTML の <form> で post する方法です。これだけでできてしまう。 -->
<form action="/tasks/saveform" method="post">
    <!-- input と textarea は、hiddenかそうでないかの違い -->
    <textarea name="tasks" data-bind="value: ko.toJSON(tasks)"></textarea>
    <input type="hidden" name="tasks" data-bind="value: ko.toJSON(tasks)"/>
    <button type="submit">Save</button>
</form>

<!-- ajax で post する場合はメソッドを書く -->
<button data-bind="click: save">Save</button>
```


# **JS**

```
function Task(data) {
    this.title = ko.observable(data.title);
    this.isDone = ko.observable(data.isDone);
}

function TaskListViewModel() {
    // Data
    var self = this;
    self.tasks = ko.observableArray([]);
    self.newTaskText = ko.observable();
    self.incompleteTasks = ko.computed(function() {
        return ko.utils.arrayFilter(self.tasks(), function(task) { return !task.isDone() && !task._destroy });
    });

    // Operations
    self.addTask = function() {
        self.tasks.push(new Task({ title: this.newTaskText() }));
        self.newTaskText("");
    };
    self.removeTask = function(task) { self.tasks.destroy(task) };
    
    // データベースなどから値を取得しておく用
    $.getJSON("/tasks", function(allData) {
        var mappedTasks = $.map(allData, function(item) { return new Task(item) });
        self.tasks(mappedTasks);
    });
    
    // 保存処理
    self.save = function() {
        $.ajax("/tasks", {
            data: ko.toJSON({ tasks: self.tasks }),
            type: "post", contentType: "application/json",
            success: function(result) { alert(result) }
        });
    }; 
}

ko.applyBindings(new TaskListViewModel());
```
Capturing images with Pupil, python and OpenCV


Pupil is a head-mounted eye tracker, which is very low price (380 Euro~)
See Pupil lab: http://pupil-labs.com/pupil/

Although a good sdk for MacOS and Linux is available officially, I had a try to use this device just for capuring inside/outside views.

```py:capture.py
import cv2
import sys
import numpy as np
import re


def init_camera(id, width, height):
	u'''
	Initializing a camera
	'''
    cap = cv2.VideoCapture(id)
    cap.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, width)
    cap.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, height)

    return cap


def run(ids, width=320, height=180):
	u'''
	Capturing images
	'''
    caps = [init_camera(id, width, height) for id in ids]

    while(True):
        # Capture frame-by-frame
        for id in ids:
            ret, frame = caps[id].read()

            # Our operations on the frame come here

            # Display the resulting frame
            cv2.imshow('cam %d' % id, frame)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    # When everything done, release the capture
    for id in ids:
        caps[id].release()
    cv2.destroyAllWindows()


def parse_argvs(argvs):
    if(len(argvs) == 1):
        print 'Usage: python capture.py --ids [0, 1, ...] --width [width], --height [height]'

    if '--width' in argvs:
        width = np.int(argvs[argvs.index('--width') + 1])
    else:
        width = 320
    if '--height' in argvs:
        height = np.int(argvs[argvs.index('--height') + 1])
    else:
        height = 180
    if '--ids' in argvs:
        ids = []
        idx = argvs.index('--ids') + 1
        while(re.match('--.*', argvs[idx]) is None):
            ids.append(np.int(argvs[idx]))
            idx = idx + 1
    else:
        ids = [0]

    return ids, width, height

if(__name__ == '__main__'):
    ids, width, height = parse_argvs(sys.argv)
    run(ids, width, height)

```

### Example:
```python capture.py --ids 0 1 --width 320 --height 180```
![kobito.1414127169.369296.png](https://qiita-image-store.s3.amazonaws.com/0/69/9106d176-d0de-5ce1-0f2c-65d2a0e2339f.png "kobito.1414127169.369296.png")
AWS Elastic MapReduce CLI メモ

AWS EMR で CLI ツールを使ってジョブを実行するメモ。AWS 自体の CLI ツールもあるけど、EMR は別になっている。~~そのうちサポートされるらしいですが……。~~

*UPDATE*: もうサポートされてました。この記事はobsoleteです。

* クラスタの起動

```
$ elastic-mapreduce --create --alive \
  --name CLUSTER-NAME \
  --instance-group master --instance-type m3.xlarge --instance-count 1 \
  --instance-group core --instance-type m3.xlarge --instance-count 10
```

起動すると jobflow ID を教えてくれる。--alive を指定した場合ユーザが明示的に terminate するまで死なないので注意。

* 各ステップの設定を書いた config ファイル

```json
[
  {
    "Name": "STEP NAME",
    "ActionOnFailure": "CONTINUE",
    "HadoopJarStep": {
      "Jar": "s3://***",
      "Args": [   ]
    }
  },
  {
    "Name": "STEP NAME",
    "ActionOnFailure": "CONTINUE",
    "HadoopJarStep": {
      "Jar": "s3://***",
      "Args": [   ]
    }
  }
]
```

* ステップの実行

```
$ elastic-mapreduce --jobflow JOBFLOW-ID --json CONFIG.json
```

クラスタが死なない限り追加できる（？）

* クラスタの起動時に各ステップも指定する場合

```
$ elastic-mapreduce --create \
  --name CLUSTER-NAME \
  --instance-group master --instance-type m3.xlarge --instance-count 1 \
  --instance-group core --instance-type m3.xlarge --instance-count 10 \
  --json CONFIG.json
```

--alive をつけていないのでこの場合ジョブが終わったらクラスタも終了する。
VirtualBox + CentOS6.5 で接続確認するまで



### CentOS6.5 Minimal
http://ftp.riken.jp/Linux/centos/6.5/isos/x86_64/CentOS-6.5-x86_64-minimal.iso

### VirtualBox上で新規マシンを構築
適当な名前でマシンを作る。
ネットワーク設定でアダプター2を追加してホストオンリーアダプタに設定。
メモリは512MBだとGUIインストールができないので1024MBとかに上げておく。
IDEにisoを設定。

### 仮想マシンを起動してセッティング
ディスクチェックは時間がかかるのでスキップ。
言語は日本語。
キーボード日本語（jp106）。
基本ストレージデバイス。
データは破棄してかまわない。
ネットワークは自動接続チェック入れる。
タイムゾーンはAsia/Tokyo。
rootパス設定。
ディスクは全ての領域を使用する。(仮想環境で違いが出るのか謎)
再起動。

### 接続確認

ホストからssh root@192.168.56.101とかで接続。
繋がらなかったらゲスト側でifconfigとかしてがんばる。
ping example.comとかで外側接続の確認。
CentOS6.5にPHP5.5(+pThreads)をインストールする

# 概要
pThreadsを有効にしたPHPをLinuxにインストールするためには、yumで配布されるパッケージでは無理で、ソースコードからビルドする必要があります。

# インストール手順

## remiリポジトリをインストール

PHP5.4以降をパッケージでインストールするには、remiリポジトリが欠かせません。
本来この手順ではPHPはソースからインストールするので必要ないのですが、yumで入れる事になる関連ライブラリのバージョン不整合が怖いので入れて置いた方が無難だと考えます。

```bash:remiリポジトリの追加手順
$ cd /etc/yum.repos.d
$ sudo wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
$ sudo rpm -Uvh remi-release-6.rpm
```

## 必要パッケージのインストール

必要となるパッケージをインストールします。
なお、この手順ではかなりザックリ入れているため、PHP+pThreadsを動かすという観点においてはおそらく過剰です。
気になる人はブラッシュアップをお願いします。

```bash:インストール手順
$ sudo yum groupinstall -y --enablerepo=remi "Development Tools"
$ sudo yum groupinstall -y --enablerepo=remi "Development Libraries"
$ sudo yum install -y --enablerepo=remi wget ftp gcc make zlib-devel git gcc-c++ readline-devel openssl-devel nkf libxml2-devel
$ sudo yum install -y --enablerepo=remi httpd httpd-devel mod_ssl cronolog
```

## PHP5.5のインストール

お約束通り、`configure`/`make`/`make install`する。
configureオプションに注意。

```bash:インストール手順
$ mkdir ~/src
$ cd ~/src
$ wget http://php.net/distributions/php-5.5.18.tar.gz
$ tar zxvf php-5.5.18.tar.gz
$ cd php-5.5.18

# enable-maintainer-ztsスイッチがpThreadsを使うために必須
$ ./configure --prefix=/usr --with-config-file-path=/etc --enable-maintainer-zts
$ make
$ sudo make install

# サンプルの設定ファイルを設置。この後は各自で編集する。
$ sudo cp php.ini-development /etc/php.ini
```

## pThreadsのインスール

pThreadsはPECLを利用してインストールする。

```bash:インストール手順
$ sudo pecl install pthreads

# php.iniに追記しないと有効化されない
$ sudo echo "extension=pthreads.so" >> /etc/php.ini

#インストール確認。pthreadsと表示されればOK
$ php -m | grep pthreads
pthreads
```

以上です。
WindowsでSonarQube設定とりあえず

以下のURLからSonarQube と SonarQube Runner をダウンロードして解凍する。

http://www.sonarqube.org/downloads/


c:\ 直下に置く。

```
C:\sonarqube-4.5
C:\sonar-runner-2.4
```

以下のURLから無料Javaをダウンロードしてインストールする。

http://java.com/ja/download/

とりあえずポスグレでデータベースsonarを作っておく。

```
c:\Program Files\PostgreSQL\9.3\bin\createdb -U postgres sonar
```

`C:\sonarqube-4.5\conf\sonar.properties` の以下の部分をコメントアウトを外す、もしくは編集。

```
# User credentials.
# Permissions to create tables, indices and triggers must be granted to JDBC user.
# The schema must be created first.
sonar.jdbc.username=postgres
sonar.jdbc.password=password
```

```
#----- PostgreSQL 8.x/9.x
# If you don't use the schema named "public", please refer to http://jira.codehaus.org/browse/SONAR-5000
sonar.jdbc.url=jdbc:postgresql://localhost/sonar
```

`C:\sonar-runner-2.4\conf\sonar-runner.properties`の以下の部分を編集もしくはコメントアウトを外す。

```
#----- PostgreSQL
sonar.jdbc.url=jdbc:postgresql://localhost/sonar
```

```
#----- Global database settings
sonar.jdbc.username=postgres
sonar.jdbc.password=password
```

起動。

```
C:\sonarqube-4.5\bin\windows-x86-64\StartSonar.bat
```

http://localhost:9000

に接続。
admin:admin
でログインしてsettingsからupdate centerを選んでプラグインとかいろいろいれておく。

自分の作成した（調べたい）プロジェクトのディレクトリにcdして、以下のURLのサンプルを参考にsonar-project.propertiesファイルを設置する。

https://github.com/SonarSource/sonar-examples/blob/master/projects/languages/php/php-sonar-runner/sonar-project.properties

そのままプロジェクトのディレクトリ内で、以下を実行。

```
C:\sonar-runner-2.4\bin\sonar-runner.bat
```

ちなみにこの自分のプロジェクトディレクトリに置くsonar-project.propertiesファイルだけど、以下の一行

```
sonar.language=php
```

を消せば、他の言語（jsとかcssとかhtmlとか）もまとめてやってくれる。
jquery.min.jsとかbootstrap.cssとかを除外するには、以下のようなパラメータを追加する。（CakePHPの例）

```
sonar.exclusions=app/webroot/js/lib/*.js,app/webroot/css/bootstrap*css,app/webroot/css/cake.generic.css 
```

あるいは9000画面から設定→除外→Filesへ。
nginxでrefererのチェック


```Nginx
valid_referers server_names ~.;
if ($invalid_referer) {
  return 403;
}
```

## 参考
- [Module ngx_http_referer_module](http://nginx.org/en/docs/http/)
- [nginxで直リンを禁止するやり方](http://taiki.net/2012/11/nginx-notallow-directlink.html)
PHP の array_filter を通すとインデックスに差が生まれる

# 例

```php:
$arr = array(0, 1, 2, 3, 4, 5);
$arr = array_filter($arr, function($var) {
    return $var % 2 === 0;
});
var_dump($arr);
```

配列に 0 ~ 5 までの数字を入れて、奇数のみを array_filter を通してフィルタリングしています。
結果が次のようになります。

```
array(3) {
  [0]=>
  int(0)
  [2]=>
  int(2)
  [4]=>
  int(4)
}
```


# 何が問題か
インデックスと cout($arr) した際の値が異なることになるので、for でループを回すとエラーが発生する。

```php:
for ($i = 0, $l = count($arr); $i < $l; $i++) {
    echo $arr[$i];
}
```

結果が以下

```
Notice (8): Undefined offset: 1 [test.php, line 4]
```


# 解決方法

## array_values() でインデックスを振り直す
**※ コメントにてご指摘いただきましたので追記します。**
渡した配列に数字添字を付けた配列を返すようです。

```php:
$arr = array_values($arr);
```



## array_merge() でインデックスを振り直す
**※ こちらは利用せずに上記の array_values() を利用した方がいいようです**

array_merge() に渡すとインデックスを振り直した配列を返します。

```php:
$arr = array_merge($arr);
```

## foreach を使用する
この場合はインデックスを考える必要がなくなります。

```php:
foreach ($arr as $val) {
    echo $val;
}
```


# 感想
array_filter() がインデックスを振り直さないメリットが思い浮かびません。
UILabelに画像を設定する


UILabelに画像を設定するにはUILabelのattributedTextプロパティに
NSTextAttachmentを設定したNSAttributedStringを設定します。

```objectivec:UILabelに画像を設定する
	NSMutableAttributedString *as = [[NSMutableAttributedString alloc] initWithString:@"message"];
	NSTextAttachment *at = [[NSTextAttachment alloc] init];
    at.image = [UIImage imageNamed:@"sample"];
    at.bounds = CGRectMake(0,
                           1,
                           at.image.size.width/[[UIScreen mainScreen] scale],
                           at.image.size.height/[[UIScreen mainScreen] scale]);

    NSAttributedString *ns = [NSAttributedString attributedStringWithAttachment:at];
    [as insertAttributedString:ns atIndex:0];//画像をinsertするインデックスを指定

	self.myLabel.attributedText = as;
```