OmniAICreator/Qiita-1.07M huggingface dataset:
SwiftでカスタマイズしたImageViewを追加する方法


今回は、UIImageViewを継承したカスタマイズしたViewクラスを追加してみた。

***ViewController***

```ViewController.swift
class ViewController: UIViewController {
                            
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //UIViewController.viewの座標取得
        var x:CGFloat = self.view.bounds.origin.x
        var y:CGFloat = self.view.bounds.origin.y
        
        //UIViewController.viewの幅と高さを取得
        var width:CGFloat = self.view.bounds.width;
        var height:CGFloat = self.view.bounds.height
        
        //上記よりフレームを生成する
        var frame:CGRect = CGRect(x: x, y: y, width: width, height: height)
        
        //カスタマイズImageViewを生成
        var myView:SampleImageView = SampleImageView(frame: frame)
        //var myView:SampleView = SampleView(frame: frame)
        
        //カスタマイズViewを追加
        self.view.addSubview(myView)
    }

}
```

***画像のインポート***

読み込む画像は、Images.xcassetsファイルにインポートしておく。

![スクリーンショット 2014-07-23 18.28.26.png](https://qiita-image-store.s3.amazonaws.com/0/3184/22388036-8fd1-a8dd-c951-c69df0014ed6.png "スクリーンショット 2014-07-23 18.28.26.png")


***カスタマイズしたImageView***

```SampleImageView.swift
import Foundation
import UIKit

class SampleImageView : UIImageView{
    init(frame: CGRect) {
        super.init(frame: frame)
        
        self.backgroundColor = UIColor.blueColor()
        var img:UIImage = UIImage(named: "snowman")
        self.image = img
        self.contentMode = UIViewContentMode.Center
    }
}
```



***出力結果***
![スクリーンショット 2014-07-23 18.29.17.png](https://qiita-image-store.s3.amazonaws.com/0/3184/d135140b-0f1a-32f0-4a59-4c4afbba24aa.png "スクリーンショット 2014-07-23 18.29.17.png")
ElasticSearch 1.x インストール (kuromojiも添えて)


ふと[マルコフ連鎖](http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%82%B3%E3%83%95%E9%80%A3%E9%8E%96)で一人で語れるおっさん作りたくなったので、elasticsearchをインスコしてみた。
elasticsearch1.xで入れています。


## 環境 

* CentOS


## 注意事項


## 参考にしたサイト

* [ElasticSearch を yum でインストールする](http://qiita.com/kakipo/items/5ccaab8581a3158dfcff)
* [elasticsearch-1.0.0正式版がリリースされたので、0.9.xからのアップグレード手順をまとめました（追記あり）](http://y-ken.hatenablog.com/entry/how-to-upgrade-elasticsearch-1.0.0)

## yumで入れれるようにreposを追加する

```/etc/yum.repos.d/elasticsearch.repo
[elasticsearch-1.0]
name=Elasticsearch repository for 1.0.x packages
baseurl=http://packages.elasticsearch.org/elasticsearch/1.0/centos
gpgcheck=1
gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
enabled=1
```

## インスコ

```bash:
sudo yum install elasticsearch
```

## kuromoji head pluginのインストール

日本人なので日本語使いたいので[kuromoji](http://www.atilika.org/)使う

```bash:/usr/share/elasticsearch/bin
sudo /usr/share/elasticsearch/bin/plugin -install elasticsearch/elasticsearch-analysis-kuromoji/2.0.0.RC1
sudo /usr/share/elasticsearch/bin/plugin -install head
```

## elasticsearch 起動

```bash:
sudo /etc/init.d/elasticsearch start
```

## 動作確認

```bash
curl -XGET localhost:9200

{
  "status" : 200,
  "name" : "Silver Samurai",
  "version" : {
    "number" : "1.0.3",
    "build_hash" : "61bfb72d845a59a58cd9910e47515665f6478a5c",
    "build_timestamp" : "2014-04-16T14:43:11Z",
    "build_snapshot" : false,
    "lucene_version" : "4.6"
  },
  "tagline" : "You Know, for Search"
}	
```

## index 作ってみる

```bash
curl -X PUT localhost:9200/test -d '
{
  "mappings": {
    "entry": {
      "properties": {
        "title": {
          "type": "string",
          "analyzer": "kuromoji"
        },
        "body": {
          "type": "string",
          "analyzer": "kuromoji"
        },
        "url": {
          "type": "string"
        }
      }
    }
  }
}'

# これが帰ってくればOK!!
{"acknowledged":true}
```

## 分かち書きの確認

```bash
curl -XGET 'localhost:9200/test/_analyze?analyzer=kuromoji&pretty' -d '関西国際空港'

{
  "tokens" : [ {
    "token" : "関西",
    "start_offset" : 0,
    "end_offset" : 2,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "関西国際空港",
    "start_offset" : 0,
    "end_offset" : 6,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "国際",
    "start_offset" : 2,
    "end_offset" : 4,
    "type" : "word",
    "position" : 2
  }, {
    "token" : "空港",
    "start_offset" : 4,
    "end_offset" : 6,
    "type" : "word",
    "position" : 3
  } ]
}

```

elasticsearch　インストールでググると0.x系のネタが多くes1.x系入れようとすると
kuromojiがうまく動作しなかったのでメモ程度に
【mysql】create table時のデフォルトのストレージエンジンの設定方法

create table時にストレージエンジンを明示的に記述しない場合は、ストレージエンジンはMyISAMになる。デフォルトのストレージエンジンをInnoDBにしたかったので設定を行う。

設定はmysqlの設定ファイルに行う。
mysqlの設定ファイルは環境によってさまざまだが、自分の環境では/etc/my.cnfになる。

[mysqld]の下にdefault-storage-engine=ストレージエンジンで指定する。
よって、デフォルトのストレージエンジンをInnoDBにする場合は以下のように記述して、mysqlの再起動を行えばよい。

```mysql:設定ファイル
[mysqld]
default-storage-engine=InnoDB
```

参考：[デフォルトストレージエンジンの設定](http://www.dbonline.jp/mysql/myini/index4.html)
[Groovy]with句を使ってオブジェクトの初期化をちょっと簡略化する

#概要
以下のような普通のクラスを用意します。

```groovy
class Hello{
    String name
    Integer age
    String message
    
    def createMessage(String name, Integer age) {
       this.message = """Hello! I am ${name}(${age})"""
    }
    
    def setAge(Integer age) {
        this.age = age + 100
    }
}
```

特になんの変哲もないクラス。
少しJavaと違うのが、メンバ変数のセッタが宣言されている場合、Groovyの場合、直接プロパティにアクセスしようとすると、自動的にその変数用のセッタが呼ばれるということぐらいでしょうか？
例えば`helloObject.age = 100`を実行すると、プロパティのアクセスではなく、setAgeが実行されます。

このオブジェクトを操作しようとすると、以下のような形になります。

```groovy
def helloObject = new Hello()

helloObject.name = "koji"
helloObject.age = 29
helloObject.createMessage("koji", 29)

assert helloObject.name == "koji"
assert helloObject.age == 129
assert helloObject.message == 'Hello! I am koji(29)'
```
すごく普通です。
でもhelloObjectって毎回書くのって面倒くさくない？タイプミスとかあるとイライラするし。。。
ということで、with句の出番です。

#with句を使って簡略化

```groovy
def helloObject = new Hello()
helloObject.with {

    def hoge = 29
    
    name = "koji"
    age = hoge
    createMessage("koji", 29)

    //メソッドは以下の呼び方でも当然OK
    //createMessage "koji", 29
}

assert helloObject.name == "koji"
assert helloObject.age == 129
assert helloObject.message == 'Hello! I am koji(29)'

//with句内で宣言したローカル変数は外部で当然参照できない！素敵！
try {
    println hoge
} catch (groovy.lang.MissingPropertyException e){
    println e.toString()
}
```

オブジェクトに備わっている`with`というメソッドに、そのオブジェクトに対して行いたい操作をクロージャとして渡してあげるだけです。
そのため、自身の変数名（helloObject）をわざわざ書かなくても良くなります。

#メリット
当然オブジェクトの格納された変数名をwith句の中では書かなくていいのでソースがスッキリします。
また、オブジェクトに渡したい値などを計算したりする際に利用する一時変数がwith句外では参照できないのでwith句の外の世界を汚しません。今回の例だと`hoge変数`がそうですね。（個人的にはコレがすごくありがたい！）

#デメリット
思いつきません。。。
強いて言うならインデントがあるくらい？
slコマンドはオプションの組み合わせも可能だった

今まで知らなかったし今後も知る必要はないが、slコマンドにはオプションがあり、`man sl`を実行すると下記のオプションが出てくる。

       sl は、高度に発展した、キータイプ矯正を目的とするアニメーションプログラムです。SLは蒸気機関車のことです。

       次のようなオプションがあります。

       -a     なにかアクシデントがあったようですね。助けを求める人々が悲痛です。

       -l     小さくなります。

       -F     飛びます。

       -e     Ctrl+C で途中で止めることを許します。

さらに`sl -lF`や`sl -alF`などオプションの組み合わせも可能。
ただしこのバージョンは、2001/01/24時点のモノなので最新のコードでは動作が異なるかもしれない。

最新は、[mtoyoda/sl](https://github.com/mtoyoda/sl)からダウンロード可能。GitHubなのでcloneもできる。

Enjoy sl Life!
「いかがわしい」サイトを避ける Prefer: Safe HTTPヘッダ

# 経緯

Firefox 31 がリリースされた
http://sourceforge.jp/magazine/14/07/24/103300

その中に見慣れないHTTPヘッダ `Prefer: Safe` というものがあったので調べることにした

## 調べてみた

検索してみたが、日本語の情報が全くない

仕方ないので

- http://browsernative.com/prefer-safe-http-header-parental-control-333/
- http://support.microsoft.com/kb/2980016
- http://tools.ietf.org/html/draft-nottingham-safe-hint-02

あたりを読んでみた。

# `Prefer: Safe` の概要

（英語が平気な人は直接 [IETFのドラフト](http://tools.ietf.org/html/draft-nottingham-safe-hint-02) を読んでほしい）

世の中のWebサービスには いかがわしい（objectionable）情報を避けるためにセーフモードという仕組がある。
例えばGoogle検索などがそうで、BingやYahoo、YouTubeも対応しているそうだ。

この機能は親が子供にいかがわしい情報を見てほしくないときに利用する（したい）。
しかしセーフモードを利用するにはそのサイトに行き設定する必要があり、
子供が持つ各デバイスで各サイトに対して設定を行うのは現実的じゃない。

そこで `Prefer: Safe` HTTPヘッダを定義することにした。
HTTPリクエストにこのヘッダを含む場合、サーバーは「セーフモードだと思って」コンテンツを返す。
つまりブラウザがこのHTTPヘッダを送るようにすることで、設定なしに自動的にセーフモードが利用できる。（もちろんそのサイトが`Prefer: Safe`ヘッダに対応している場合だけだが）
よって、親は各サイト毎にわざわざセーフモードの設定をする必要がなくなる。

今回のリリースでFirefoxはこのヘッダに対応し、さらに、OSがペアレンタルコントロール下にあるかどうかの情報から自動的にこのヘッダを付加するようにしたそうだ。
これによって親はPCやスマホをペアレンタルコントロール状態にするだけで、自動的にGoogle検索にセーフモードが利用されるようにできる。

## 注意点（セーフモードの限界）

まずこの機能は「セーフモードがあればそっちを優先で」というHTTPヘッダだ。つまりセーフモードが無いサイトには影響がない（もちろん実装次第）
また、セーフモードが存在していても`Prefer: Safe`ヘッダに対応していないこともある。

また、問題になるのはこの「いかがわしい（objectionable）」の定義が無いことだ。
GoogleにはGoogleの、YahooにはYahooのセーフモード（つまり、いかがわしさの基準）があることに注意してほしい。

## 現状の対応

まずブラウザは今のところIEとFirefoxしか対応してないようだ。
またどの検索エンジン、あるいはほかのWebサイトがこのヘッダに対応しているかはよくわからない。
（IEに実装済である以上、Bingは対応しているだろう。逆にChromeはまだだからGoogleは未対応かも。誰か代わりに調べてー）

# 最後に

ざっくり紹介しただけなので、間違いがあればコメントか編集リクエストお願いします。
Blenderで平面（Plane）に穴をあける方法


Blenderで平面（Plane）に、指定したサイズの穴（孔）を開ける方法の考察。

##目的
* 指定したサイズの穴を平面（Plane）に開けたい
* 1つだけでなく、複数の穴を開けたい
* ポリゴンは三角または四角で、必要最低限のみ（不必要に増やさない）
* 穴のサイズや位置は後で調整可能にしたい

## 手順
### shift+A で平面（Plane）を追加
### N キーを押し、［トランスフォーム＞拡大縮小］で任意のサイズにしておく
### 右クリックで、平面（Plane）を選択し、tab キーで編集モードに
### 編集モードのまま、shift+A でさらに平面（Plane）を追加し、任意のサイズにする
![スクリーンショット 2014-07-23 17.09.48.png](https://qiita-image-store.s3.amazonaws.com/0/38742/72649fe3-6a98-a815-5dcc-6b49069d2822.png "スクリーンショット 2014-07-23 17.09.48.png")



### 新しい平面（Plane）のサイズを変更
S キーを押してからドラッグ開始、Tキーを押して画面左下の「拡大縮小」でサイズ変更。
例えば、元の平面（Plane）の半分のサイズにしたいなら X,Y,Z をそれぞれ 0.5 に。
![スクリーンショット 2014-07-23 17.15.41.png](https://qiita-image-store.s3.amazonaws.com/0/38742/c4a0528a-acf6-532b-3353-a764093920c4.png "スクリーンショット 2014-07-23 17.15.41.png")


### 面だけ削除
A キーを2回押してすべて選択、X キーを押し、「面だけ」削除

### 頂点選択し、辺を作成
頂点選択モードにし、shift キーを押しながら2つの頂点（外側の平面と、対応する内側の平面）を右クリックで選択、F キーで辺を作成。
他の辺も同様に作成。
![スクリーンショット 2014-07-23 17.21.21.png](https://qiita-image-store.s3.amazonaws.com/0/38742/5fd9bb4d-2b1b-175e-dcb5-d0a68bde2a93.png "スクリーンショット 2014-07-23 17.21.21.png")


### 面を作成
A キーで全て選択し、F キーで面を作成
![スクリーンショット 2014-07-23 17.22.38.png](https://qiita-image-store.s3.amazonaws.com/0/38742/1b31dedb-382e-82d1-f5cf-f0a661a3d971.png "スクリーンショット 2014-07-23 17.22.38.png")


### 面を削除
面選択で平面（Plane）の中心付近を右クリックし、「面だけ」削除。
もう一度平面（Plane）の中心付近を右クリックし、さらに「面だけ」削除。
これで完成
![スクリーンショット 2014-07-23 17.24.05.png](https://qiita-image-store.s3.amazonaws.com/0/38742/38a37d29-a484-151c-c84c-be4a3ca12a12.png "スクリーンショット 2014-07-23 17.24.05.png")

## この手順の問題
* 手順が多くて面倒
* 内側の平面（Plane）が、比率でしかサイズ指定できない。「150cm」とか、「1.5BU」のように直接サイズを指定したい

もし、より良い方法をご存じの方はコメントか、Twitter @Stocker_jp まで教えて頂けると幸いです。

## [追記] 編集モードで i キーを使う方法

<blockquote><p><a href="https://twitter.com/Stocker_jp">@stocker_jp</a> blenderの平面穴あけですけど、編集モードでポリ選択して「i」押してドラッグでどうでしょうか？減らしたければ内側の頂点マージ、増やしたければナイフで。</p>&mdash; nzk (@g_design) <a href="https://twitter.com/g_design/statuses/492917269098291201">2014, 7月 26</a></blockquote>

Twitterで @g_design さんに教えていただいたのですが、編集モード（Edit mode）で i キーを押すと、そのまま縮小することができます。

![スクリーンショット 2014-07-26 18.55.17.png](https://qiita-image-store.s3.amazonaws.com/0/38742/e33457a0-00d3-1c75-649e-08b0c7e40a88.png)

i キーの後ドラッグするか、0.5 のように数値を入力すると、その比率で縮小できます。

<blockquote class="twitter-tweet" data-conversation="none" lang="ja"><p><a href="https://twitter.com/Stocker_jp">@Stocker_jp</a> <a href="https://twitter.com/12funkeys">@12funkeys</a> 使えるケースは限られますけど、Pivot Pointのモードの変更を使って対応できることも。ご参考まで。 <a href="http://t.co/HHI8BvRKw1">pic.twitter.com/HHI8BvRKw1</a></p>&mdash; BLUG.jp (@blug_jp) <a href="https://twitter.com/blug_jp/statuses/491873930160775168">2014, 7月 23</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

また、@blug_jp さんからは、グリッドを使う方法を教えて頂きました。

shift+A ［追加＞メッシュ＞グリッド］を追加し、編集モードで1つの面を選択して X キーで面のみ削除できます。
場合によってはこちらも便利そうです。
CentOS6でSSL対応HAProxy 1.5.2のrpmを作成する


```bash:SSL対応HAProxyのRPMを作成
rpmdev-setuptree
sudo yum -y install pcre-devel openssl-devel
cd ~/rpmbuild/SOURCES
curl -L -O http://www.haproxy.org/download/1.5/src/haproxy-1.5.2.tar.gz
tar zxf haproxy-1.5.2.tar.gz
cp -p haproxy-1.5.2/examples/haproxy.spec ../SPECS/haproxy152.spec
sed -i 's/USE_PCRE=1 /USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 /' ../SPECS/haproxy152.spec
rpmbuild -bb ../SPECS/haproxy152.spec
```

```bash:HAProxyをインストール
sudo rpm -ivh ~/rpmbuild/RPMS/x86_64/haproxy-1.5.2-1.x86_64.rpm
```
Mac OS X 版 IntelliJ IDEA の Emacs キーマップで Option+W とかが効かないアレを解消する

## はじめに

いままで Windows 版の IntelliJ IDEA を Emacs キーマップで使っていたのですが、諸事情により Mac OS X で IntelliJ IDEA を使う必要が出てきたので、``Option-W`` とかのキーストロークで Σ などの特殊文字が入力されてしまう Mac 特有の問題にちゃんと対処することにしたときのメモです。

## Mac & IntelliJ & Emacs キーバインドでよくある問題

Emacs のキーマップに設定した IntelliJ IDEA のエディタ上で、

- リージョンコピー : ``M-w`` ( ``Option-W`` )
- スクロールダウン (ページアップ) : ``M-v`` ( ``Option-v`` )

上記の操作をしようとすると、これらはそれぞれ

- ∑
- √

と入力されてしまうかと思います。普段 Emacs でテキストをいじっている人にとってはどちらもわりと多用するキーストロークだと思いますので、変な記号が入力されちゃったりすると萎えてしまいますよね。この問題は生産性に関わるものなので、ぜひ解消したいものです。

## この問題を解消するには？

基本的には、キーリマップをするソフトウェアを導入し、また IntelliJ 側の設定を調整すれば OK, です。

### 必要なもの

キーリマップを実現するソフトウェアとして、[Karabiner](https://pqrs.org/osx/karabiner/index.html.ja) (以前、KeyRemap4MacBook と呼ばれていたもの) を利用します。あらかじめインストールを済ませておいてください。

### 設定手順その 1 : Karabiner

1. Karabiner の Preferences 画面を表示します
2. "Change Key" タブを表示し、以下の 2 つの項目のチェックをオンにします
    - "Emacs Mode" → "Option+V to PageUp"
    - "Emacs Mode" → "Option+W to Command+C"

![karabiner-pref.png](https://qiita-image-store.s3.amazonaws.com/0/11734/eaa9d8d0-2652-0764-2fea-1f6365b05e0f.png)

以上で Karabiner での設定は完了です。

### 設定手順その 2 : IntelliJ IDEA

続いて IntelliJ IDEA での設定となります。

1. IntelliJ IDEA の Prefences 画面を表示します
2. "IDE Settings" のセクションにある "Keymap" を選択し、キーマップ編集の画面を表示します
3. キーマップ設定の一覧より、以下のアクションに対して示されたキーストロークを割り当てます
    - "Main menu" → "Edit" → "Copy" : ``⌘C`` (コピー操作)
    - スクロールダウン操作については、特に設定する必要はありません

以上ですべての設定が完了となります。

## 補足

今回はリージョンコピーとスクロールダウンの操作についてのみ設定手順を明示しましたが、 ``M-b`` (backword-word) などの操作についても同様の手順で対処できる見込みです。
GAE/Pythonのローカル環境でfull text searchが動かない場合のpatch


こんなエラーが。

```
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/search/search.py", line 1121, in _DecodeUTF8
    return pb_value.decode('utf-8')
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 158-159: invalid continuation byte
```

unicode周りのバグっぽいけどデプロイするとなぜか動く。

これを参考
https://code.google.com/p/googleappengine/issues/detail?id=9335
にしたけど、このリンク先のままだと動かなかくて以下なような感じに（ライブラリ直接さわってしまってるので注意）。


```/google_appengine/google/appengine/_internal/antlr3/streams.py
 335   >.# The data being scanned
 336         data = data.encode("utf-8") # これを追加
 337         self.strdata = unicode(data, errors="replace")
 338         self.data = [ord(c) for c in self.strdata]
```


```/usr/local/google_appengine/google/appengine/api/search/search.py
 1118   #def _DecodeUTF8(pb_value):
 1119   #  """Decodes a UTF-8 encoded string into unicode."""
 1120   #  if pb_value is not None:
 1121   #    return pb_value.decode('utf-8')
 1122   #  return None
 1123   
 1124   def _DecodeUTF8(pb_value): #これを置き換え
 1125     """Decodes a UTF-8 encoded string into unicode."""
 1126     if pb_value is not None:
 1127       return pb_value.decode('utf-8', errors='replace') if not isinstance(pb_value, unicode) else pb_value
```

とりあえず。
devise で cookie からログインしたかどうかを判定する


### devise

Rails で認証の仕組みを実装する時に利用する [devise](https://github.com/plataformatec/devise)、便利ですよね。

細かいことですが、掲題の件をどのように実装するか確認したので、自分用のメモ。

`Devise::Strategies::Rememberable` の `authenticate!` メソッドで cookie の内容を確認して認証しているので、その中で `session` にフラグを立てる実装にしました。

用途としては、ユーザー情報変更等の処理の前に、このフラグが立っていたら、パスワードを再入力してもらう、ということが考えられます。

```ruby:lib/rememberable_decorator.rb
require "devise/strategies/rememberable"
class Devise::Strategies::Rememberable < Devise::Strategies::Authenticatable
  def authenticate!                                                             
    resource = mapping.to.serialize_from_cookie(*remember_cookie)

    unless resource
      cookies.delete(remember_key)
      return pass
    end
                                         
    if validate(resource)
      session[:login_via_cookie] = true
      success!(resource)
    end
  end
end                                          
Warden::Strategies.add :rememberable, Devise::Strategies::Rememberable
```

このファイルを initilaizer 辺りで `require` してオーバーライドすればOK。

devise 3.2.4 で確認済みです。
無名関数内でのreturnをいい感じに書く

CoffeeScriptを書いていて、無名関数内で値を返したいときに、

```coffeescript
$(...).click ->
  $(this).hoge().piyo()
  return false
```

という風に書くが、どうせなら1行にしたかったので引数の値をそのまま返すjQueryのプラグインを作ってみた。

```js
(function ($) {
  $.fn.return = function(val) {
    return val;
  };
})(jQuery);
```

実装はこれだけだ。これで最初の例は

```coffeescript
$(...).click -> $(this).hoge().piyo().return(false)
```

と書くことが出来る(JavaScriptへのコンパイル結果が微妙だが…)
Twitter の AccessToken と AccessTokenSecret を Ruby で取得する

```rb
require "oauth"

consumer_key = "YOUR_KEY"
consumer_secret = "YOUR_SECRET"
consumer = OAuth::Consumer.new consumer_key, consumer_secret, site: "https://api.twitter.com"

request_token = consumer.get_request_token

puts "Please visit here: #{request_token.authorize_url}"
STDERR.print "Then put your PIN: "

access_token = request_token.get_access_token oauth_verifier: gets.chomp
puts "Token: #{access_token.token}"
puts "Secret: #{access_token.secret}"
```
Ruby を使って、特定の ELB 下の EC2 インスタンスの IPアドレスを取得する

```rb
require "aws-sdk"
def get_ec2_instances elb_name, region
  client = AWS::ELB.new region: region,
  access_key_id: ENV["AWS_ACCESS_KEY_ID"],
  secret_access_key: ENV["AWS_SECRET_ACCESS_KEY"]
  elb = client.load_balancers.find{|lb| lb.name == elb_name}
  Array.new.tap do |ip_addrs|
    elb.instances.each do |instance|
    ip_addrs << instance.private_ip_address
  end
end

ip_addrs = get_ec2_instances "YOUR_ELB_NAME", "YOUR_REGION"
p ip_addrs
```
【Jenkins】シェルの実行で定義した変数を下流ジョブに渡すパラメータに設定する(Parameterized Trigger plugin)

## 背景

シェルの実行で定義した変数を下流ジョブに流すパラメータに設定したい。
が、変数はシェル実行が終わると消えてしまう。

パラメータの設定使用しているプラグインは[Parameterized Trigger plugin](http://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Trigger+Plugin)。

## 結論

上記プラグインにファイルからパラメータを設定する機能を使う

 * Parameters from properties file

## やったこと

 1. シェルの実行で、ワークスペースにファイルを書き出す。
  * 形式は、KEY=value
  * 一行につきパラメータ一つ
 2. ビルド後の処理に「Trigger parameterized build on other projects」を追加
  1. Add Parametersから「Parameters from properties file」を選択
  2. 「Use properties from file」に1で書き出したファイルを指定

## 他のパラメータとの食い合わせ

プラグインの設定を複数して、同じパラメータがあった場合にどうなるか?

 * Current build parameters設定の後に、Parameters from properties fileを設定した場合
 * Parameters from properties file設定の後に、Current build parametersを設定した場合

**結論 : 最後に設定した値で上書きされる**
[環境構築] rpmdb: PANIC: fatal region error detected が出たら。

# エラー

vagrant(centos64)にyumで色々入れていたら、こんな感じのエラーが出ました。

```rb
rpmdb: PANIC: fatal region error detected; run recovery
error: db3 error(-30974) from dbenv->open: DB_RUNRECOVERY: Fatal error, run database recovery
error: cannot open Packages index using db3 -  (-30974)
error: cannot open Packages database in /var/lib/rpm
```

# 対応

```shell-session
$ sudo rpm --rebuilddb
```

これでも直らない時は、対象dbを削除します。

```shell-session
$ cd /var/lib/rpm/
$ mv __db.001 /tmp/ #バックアップを取ってもいい
$ sudo rm -rf __db.001 __db.002 __db.003
```

以下のようなコマンドで、エラーが出ず、うまく出力されたらOK。

```shell-session
# rpm -qa
# yum list
```
vsftpd をインストールする

## vsftpd のインストール

** 前提 **
* OS: Ubuntu 12.04 LTS
* ユーザー名: ftp_user

```bash
add-apt-repository ppa:thefrontiergroup/vsftpd
apt-get update
apt-get install vsftpd
mkdir -p /var/www/html
chmod 2775 /var/www/html
adduser ftp_user
groupadd www-data
usermod -G www-data ftp_user
chown ftp_user:www-data /var/www/html
vi /etc/vsftpd.conf # pasv_address にサーバのIPアドレスを設定する
sh -c 'echo "ftp_user" > /etc/vsftpd.chroot_list'
sh -c 'echo "ftp_user" > /etc/vsftpd.user_list'
service vsftpd restart
```
Scala で Stream を使った日付シーケンスの取得

システムの傾向調査、問題分析などを行っておりますと期間指定で集計処理を行うことがよくあります。期間の開始日から終了日まで `Calendar#add()` しながら `while` で回してもいいんですけど、Scala なら `Stream` を使えばソレっぽく書けます。

```scala
import java.util.{Calendar, Date}
def days(begin:Date):Stream[Date] = {
  val cal = Calendar.getInstance
  cal.setTime(begin)
  cal.add(Calendar.DAY_OF_MONTH, 1)
  begin #:: days(cal.getTime)
}

// from から to までの全ての日で処理を実行
val from:Date = ...
val to:Date = ...
days(from).takeWhile{ ! _.after(to) }.foreach{ date =>
  // ...
}
```

`Stream` の使用例を見ているとフィボナッチ数列的なものばかりなのでもう少し実用的な例としてメモしておきます。
Rails で使う CoffeeScript のバージョンを指定する

`coffee-rails` -> `ruby-coffee-script` -> `coffee-script-source` という依存関係になっているのですが、実は `ruby-coffee-script` では `coffee-script-source` のバージョンは指定されていません。

なので、`coffee-rails` はそのままで CoffeeScript だけバージョンを更新できます。

```
bundle update coffee-script-source
```

また、もし特定のバージョンを使いたければ Gemfile で好きに指定できます。

```Gemfile
gem 'coffee-rails'
gem 'coffee-script-source', '1.6.3'
```
Rails4でEngineのcontroller specで必ずuse_routeする

## 問題
Rails::Engineをmountして、そのルートへのリクエストのcontroller specを書きたい場合、

```rb
get :index
```

みたいにやると`No route matches`と言われてしまう。  
そのため、毎度

```rb
get :index, use_route: :my_engine
```

みたいに書かないといけないのだけれど、これが死ぬほどめんどくさい。

## 解決策
[Rails3.2Engineのコントローラーのspecについて](http://qiita.com/y_matsuwitter/items/b845691b122a25260c08) のように、
get, post, put, deleteをしたときに`ActionController::TestCase::Behavior.process`に渡されるパラメータに`use_route: :my_engine`を含めてやればよい。

rails4だとpatchもあるわけで、process自体をオーバーライドしてしまったほうがシンプルに書けるし良いと思われる。
processの定義は[ここ](https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/test_case.rb#L575)なんだけど、今はメソッドのシグネチャが違う気がする。
以上を鑑みて、以下のようにspec_helperをいじるなりspecのsupportファイルを書く。

```rb
module ControllerSpecHelper
  def process(action, http_method = 'GET', *args)
    parameters, session, flash = args
    super(action, http_method, (parameters || {}).merge(use_route: :my_engine), session, flash)
  end
end

RSpec.configure do |config|
  config.include ControllerSpecHelper, type: :controller
end
```
連想Keyを使ったArrayの代わりにstdClassを利用する

stdClassの名前が出てこずストラクトクラスとかでググって出てこなくて泣いたので忘れないうちにメモ
#stdClassとは
* PHPデフォルトのクラス
* 親クラスなどは無い
* プロパティが無い
* メソッドが無い
* マジックメソッドが無い
* インターフェイスが無い

PHPマニュアルのノート部分に英語でそれとなく書かれてます。
http://php.net/manual/ja/language.oop5.basic.php

###普通のクラスと何が違う？
上記に挙げた特性を見ると、ほとんど空っぽのクラスみたいなstdClassですが、一旦インスタンスを生成すると存在しないプロパティに自由にアクセスできるようになります。

#どう使う
上に説明した特性を使いとりあえず何でも連想配列に格納するみたいな悪習(※1)を少しだけ減らすのに使用します。
##ArrayをstdClassで代替

```php:Arrayで実装

  $member = array();
  $member['name'] = 'Qii太';
  echo $member['name'];
```

```php:stdClassで実装
  $member = new stdClass():
  $member->name = 'Qii太';
  echo $member->name;
```
これだけです。
特にプロパティを定義する必要はありません。
ただし存在しない(一度も代入してない)プロパティにアクセスするとNoticeエラーが発生します。

```php
php > $a = new stdClass();
php > echo $a->test;
PHP Notice:  Undefined property: stdClass::$test in php shell code on line 1
```


#####(※1)主観に基づきます。
実務的なメリットを挙げるとすると揺るぎないアクセス子として使えます。
例えば連想配列を使うと`["name"]`と`['name']`は等しくアクセス可能ですが、一括置換するときには2度手間、文章検索するときも2度手間or長大な検索ワードを構築する必要があったり大変面倒です。
##理想
MVCモデルを達成するため(MVCモデルにかぎらず)に各要素間でやりとりするEntityクラスを作るのが理想である。
例えばゲッター セッターを実装したEntityクラスとか

```php:Member.php
class Member{
  private $_name;
  public function getName(){
    return $this->_name;
  }
  public function setName($name){
    $this->_name = $name;
  }
}
```

こんなclassを用意し

```php:EntityClassを受け取る
<?php
//戻りはMemberClass
$member = findMember();
?>
<?= $member->getName(); ?>

```

こんなふうに使いたい

##現実

しかし時間に追われている時は手が回らないことが多くDBの問い合わせ結果などEntityクラスを作る暇も惜しい(ゲッター セッター ジェネレータがあったとしても)なんて珍しくない。
すると

```php:Arrayで受け取る
<?php
//戻りはArray
$member = findMember();
?>
<?= $members['name'] ?>

```

するとこんなコードになる。

##stdClassにする
ちょっとだけ見栄えが良くなる（と思う）

```php:stdClassで受け取る
<?php
//戻りはstdClass
$member = findMember();
?>
<?= $members->name ?>

```

以上
redisデータバックアップとリストア

# 前置き
この記事は備忘録的に書いておりますので、自己責任で実行してください。

# ばっくあっぷとりすとあしてみる
## データファイルの置き場
redis.conf ファイルのdirを参照

## データファイル名
redis.conf ファイルのdbfilenameを参照

## バックアップコマンド
`save`
すべてのデータセットをディスクに保存する。
保存が終わるまでアクセスできない！

`bgsave`
バックグラウンドで保存する。
保存終了の確認は`lastsave`で行う。

`lastsave`
bgsaveが成功したか確認できる。
bgsaveの最終timestampを返却する。

## バックアップ手順

1.現状データのキーの数を参照

```
/path/to/redis-cli dbsize
```
2.バックアップコマンド実行

```
/path/to/redis-cli bgsave
```

3.バックアップ進捗確認

```
/path/to/redis-cli lastsave
```

4.最終編集日時timestampを変換して、バックアップ終了を確認する

```
date --date "@`/path/to/redis-cli lastsave`" +"%Y/%m/%d %H:%M"
```

5.データファイル名をリネームする

```
mv /path/to/redis_data/dump.rdb /var/lib/redis_data/backup.rdb
```


6.redisを再起動する

```
/etc/init.d/redis restart
```


7.データないことを確認する

```
/path/to/redis-cli dbsize
```

8.データファイルを戻す

```
mv /path/to/redis_data/backup.rdb /var/lib/redis_data/dump.rdb
```

9.redisを再起動する

```
/etc/init.d/redis restart
```

10.データが戻っていることを確認する

```
/path/to/redis-cli dbsize
```
「error: using bridging headers with framework targets is unsupported」←これの対処方法

Xcode6のbeta3からbeta4に移行した際に出たエラー。
これに苦しんでいる人がいるかもしれないのでメモ。

##原因
beta4から、Frameworkの中でbridging-headerが使えなくなったため。

##対処方法
1. <フレームワーク名>.hの中に、bridging-headerで書いていた内容を移す
2. bridging-headerファイルを消す
3. フレームワークのBuild Settingsの中の「Objective-C Bridging Header」の項目を空にする
4. フレームワークのBuild Phases > Headersの中の関連するheaderファイル（上記１で<フレームワーク名>.hに記載したファイル）をPublicに移す
5. Cleanして実行

これで恐らく大丈夫です

参考:
[stackoverflow: Xcode 6 / Beta 4: using bridging headers with framework targets is unsupported](http://stackoverflow.com/questions/24875745/xcode-6-beta-4-using-bridging-headers-with-framework-targets-is-unsupported)
文字列のハッシュ値を取得

```java
String source = "source string";

try {
    MessageDigest md = MessageDigest.getInstance("SHA-512");
    md.update(source.getBytes());
    byte[] hash = md.digest();
    StringBuilder sb = new StringBuilder();
    for (byte b : hash) {
        sb.append(String.format("%02x", b));
    }
} catch (NoSuchAlgorithmException e) {
    System.out.printf(
        "Exception: %s, Source string: %s",
        e.getMessage(),
        source);
}
```

<a href="http://docs.oracle.com/javase/jp/7/technotes/guides/security/StandardNames.html#MessageDigest" target="_blank">標準アルゴリズム名のドキュメント</a>
SwiftでカスタマイズしたViewを追加する方法


UIViewControllerのviewのx座標とy座標と高さと幅を、カスタマイズしたViewにパラメータとして渡してViewを生成する方法の覚え書き。

***ViewController***

```ViewController.swift
import UIKit

class ViewController: UIViewController {
                            
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //UIViewController.viewの座標取得
        var x:CGFloat = self.view.bounds.origin.x
        var y:CGFloat = self.view.bounds.origin.y
        
        //UIViewController.viewの幅と高さを取得
        var width:CGFloat = self.view.bounds.width;
        var height:CGFloat = self.view.bounds.height
        
        //上記より画面ぴったりサイズのフレームを生成する
        var frame:CGRect = CGRect(x: x, y: y, width: width, height: height)
        
        //カスタマイズViewを生成
        var myVeiw:SampleView = SampleView(frame: frame)
        
        //カスタマイズViewを追加
        self.view.addSubview(myVeiw)
    }
}
```

***カスタマイズしたView***

```SampleView.swift
import Foundation
import UIKit

class SampleView :UIView{
    init(frame: CGRect) {
        super.init(frame: frame)
        self.backgroundColor = UIColor.greenColor()
        
    }
}
```


余談だが、パラメータの渡し方（パラメータ名を付けたり付けなかったり）に、自分はどうしても慣れない。
chronyで時刻の同期をとる

[Features/ChronyDefaultNTP](http://fedoraproject.org/wiki/Features/ChronyDefaultNTP)
ちょっと前のFedoraからNTPクライアントがntpdからchronyへ変更された。

のはいいとして、最小インストールしたらこれがインストールされてなくて時刻同期がされず、出社していきなり西海岸辺りに左遷されたので、日本に帰国するべくセットアップする。環境はFedora 20。OSインストール時にlocaleはAsia/Tokyoにしてあるものとする。

```
root$ yum install chrony
root$ systemctl start chronyd
root$ timedatectl status
      Local time: 水 2014-07-23 11:10:23 JST
  Universal time: 水 2014-07-23 02:10:23 UTC
        Timezone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
root$ systemctl enable chronyd
```
Swiftのprotocolの作成および使用するときに気をつけることのメモ

Swiftのprotocolの作成および使用するときに気をつけることのメモ

#protocolでoptionalな変数やメソッドを設定する場合

protocolでoptionalな変数やメソッドを設定する場合には、@objをプロトコル名につけて、変数名、メソッド名にoptionalをつける

```swift:TestProtocol.swift
@objc protocol TestProtocol {
    optional var optionalVar:String {get set}
    optional func optionalFunc() -> String
}
```

beta3までは@optionalと「@」が必要でしたが、beta4からは「@」が不要になりました。

#複数の複数のprotocolを実装した型を指定する場合

複数の複数のprotocolを実装した型を指定する場合は、型名をprotocol<型名,型名,...>とする

```swift:UseProtocol.swift
protocol ProtocolA { func funcA() }
protocol ProtocolB { func funcB() }

var hasProtocolAB: protocol<ProtocolA, ProtocolB>?
hasProtocolAB?.funcA()
hasProtocolAB?.funcB()
```

[追記]
typealiasを使って、複数のprotocolを実装した型のエイリアスを作成しておくと便利かもです。

```swift:UseProtocol.swift
protocol ProtocolA { func funcA() }
protocol ProtocolB { func funcB() }

//var hasProtocolAB: protocol<ProtocolA, ProtocolB>?
typealias ProtocolAB = protocol<ProtocolA, ProtocolB>
var hasProtocolAB: ProtocolAB?
hasProtocolAB?.funcA()
hasProtocolAB?.funcB()
```
また気づいたことあったら投稿しますね。
learning-spark on Mac OS X Mavericks


## set up Spark
```sh:shell
$ cd /usr/local/Cellar
$ git clone git@github.com:apache/spark.git
$ cd spark
$ sbt/sbt assembly
$ sbt/sbt publish-local
```
## configure SPARK_HOME
```sh:shell
$ vi ~/.xxxrc
export SPARK_HOME=/usr/local/Cellar/spark
```
## spark-shell
```sh:shell
$ cd $SPARK_HOME
$ ./bin/spark-shell
```
## build
```sh:shell
$ git clone git@github.com:databricks/learning-spark.git
$ cd learning-spark
$ sbt/sbt compile
```
## run
```sh:shell
$ sbt/sbt run
Multiple main classes detected, select one to run:
```
```sh:shell
$ sbt/sbt 'run-main com.oreilly.learningsparkexamples.scala.BasicAvgFromFile local[4] inputfile'
```
```sh:shell
$ sbt/sbt assembly
$ cp target/scala-2.10/learning-spark-examples-assembly-0.0.1.jar ~/.
$ cd ~
$ CLASSPATH=./learning-spark-examples-assembly-0.0.1.jar
$ java -cp $CLASSPATH com.oreilly.learningsparkexamples.scala.BasicAvgFromFile local[4] inputfile
```
Linux の GUI アプリでソケットはノンブロッキングにしておくに越したことはない

僕は GUI アプリばかり書いているのでサーバのプログラミングはわかりませんが、Linux の GUI アプリではソケットはノンブロッキングにしておくに越したことはないと思います。

その理由は [Man page of SELECT のバグの記述](http://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/select.2.html#lbAM)にあります。

> Linux では、 select() がソケットファイルディスクリプタで"読み込みの準備ができた" と報告した場合でも、この後で read を行うと停止 (block) することがある。このような状況は、 例えば、データが到着したが、検査でチェックサム異常が見つかり廃棄された時などに起こりえる。他にもファイルディスクリプタが準備できたと間違って報告される状況が起こるかもしれない。したがって、停止すべきではないソケットに対しては O_NONBLOCK を使うとより安全であろう。

システムのマニュアルに注意事項が記されている以上、GUI アプリのメインスレッドでブロックするわけにはいきませんから、ソケットはノンブロッキングにしておくに越したことはないと思います。
Ruby 2.1 環境での fzf 利用

初回起動時も一瞬でファイルをロードしてくれる fzf がお気に入りなのですが、これは実際の処理が Vimscript ではなく Ruby で出来ています。

Ruby 2.1 以前では何となく `:NeoBundleInstall` するだけで動いたので、ろくに README も読まずにそのまま使っていたのですが、Ruby 2.1.0 以降で使用しようとすると vim を起動しているターミナルの裏側でこのようなエラーが発生して実行できず。

```
/usr/local/var/rbenv/versions/2.1.1/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- curses (LoadError)
  from /usr/local/var/rbenv/versions/2.1.1/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
  from /Users/k-sera/.vim/bundle/fzf/fzf:40:in `<main>'
```

これは fzf が依存している curses というモジュールが Ruby 2.1 で標準ライブラリから外れたことが原因のようです。

https://github.com/junegunn/fzf/issues/14

https://github.com/junegunn/fzf/blob/0.8.6/fzf#L40

これだけをすぐに解決するなら `gem install curses` とやれば OK ですが、そもそも fzf の README を読むと install スクリプトを使えとあります。

https://github.com/junegunn/fzf

ということで実行するとこちらの件もうまく解決してくれます。

```bash
$HOME/.vim/bundle/fzf/install
```
this.transformを計測してみた

#this.transformがGetComponentを行なっており重いと聞いたので、実際に計測してみた

>テストした際のスクリプト

```
// キャッシュしたtransformを取得するプロパティ
protected Transform mTrans;
public Transform cachedTransform { get { if (mTrans == null)		mTrans = transform; return mTrans; } }
public Transform cachedTransform2 { get { return mTrans; } }

// 01	普通にtransformを取得
for (int i = 0; i < number_of_tests; i++)
{
	Transform test = this.transform;
	//yield return 0;
}

// 02	キャッシュしておくプロパティから取得
for (int i = 0; i < number_of_tests; i++)
{
	Transform test = this.cachedTransform;
	//yield return 0;
}

// 03	ローカル変数にキャッシュしてそれを参照する
Transform cache = this.transform;
for (int i = 0; i < number_of_tests; i++)
{
	Transform test = cache;
	//yield return 0;
}

// 04	cachedTransformプロパティ内の処理を抜き出した版（プロパティのオーバーヘッドをみてみた）
mTrans = null;
for (int i = 0; i < number_of_tests; i++)
{
	if (mTrans == null)
		mTrans = transform;
	Transform test = mTrans;
	//yield return 0;
}

// 05	cachedTransformのifで存在チェックをしない版（プロパティ内の処理負荷の違いをみてみた）
mTrans = this.transform;
for (int i = 0; i < number_of_tests; i++)
{
	Transform test = cachedTransform2;
	//yield return 0;
}

```

##計測結果

>number_of_tests = 100

```
00: 0.01573563(ms)
01: 0.08511543(ms)
02: 0.005483627(ms)
03: 0.010252(ms)
04: 0.03743172(ms)
```

>number_of_tests = 1000

```
00: 0.1368523(ms)
01: 0.223875(ms)
02: 0.1990795(ms)
03: 0.1330376(ms)
04: 0.1192093(ms)
```

> number_of_tests = 100(yield return あり)

```
00: 0.1575947(ms)
01: 0.3004074(ms)
02: 0.01096725(ms)
03: 0.09155273(ms)
04: 0.1583099(ms)
```

>number_of_tests = 1000(yield return あり)

```
00: 1.351833(ms)
01: 0.9250641(ms)
02: 0.05340576(ms)
03: 0.6370544(ms)
04: 0.4959106(ms)
```

##計測してみて

・メモリキャッシュにのっている状態であれば、`this.transform`でもそこそこ早いがローカル変数にキャッシュした方が無難

・ローカル変数でも、キャッシュから外れると重い

・プロパティでもオーバーヘッドが重いようなので、変数にキャッシュしておいた方が軽い

・`cachedTransform`とローカル変数にキャッシュしたものを使うのを場合によって併用するのが作りやすそうか
[Vagrant 1.5] vagrant provisionしたら、SSL validation of HTTPS requests is disabled とエラーがでたら。

# エラー

vagrant provisionをしたしたところ、以下のエラーが出ました。

```rb
SSL validation of HTTPS requests is disabled. HTTPS connections are still
encrypted, but chef is not able to detect forged replies or man in the middle
attacks.

To fix this issue add an entry like this to your configuration file:

  # Verify all HTTPS connections (recommended)
  ssl_verify_mode :verify_peer

  # OR, Verify only connections to chef-server
  verify_api_cert true
```

この通りに対応すれば直りますが、私にはよくわからなかったので調べてみました。


# 対応

とりあえず、Vagrantfileをいじります。

```rb
Vagrant.configure("2") do |config|
  config.vm.provision "chef_solo" do |chef|
　　　・
　　　・
    # 以下を追加
    chef.custom_config_path = "Vagrantfile.chef"
　　　・
　　　・
  end
end
```

次に、Vagrantfileと同じ階層
にVagrantfile.chefというファイルを作成します。


```rb
$ vim Vagrantfile.chef
----

#以下を記述
Chef::Config.ssl_verify_mode = :verify_peer
```

その後

```shell-session
$ vagrant reload
$ vagrant provision
```

で解決しました。


# 参考

http://mistymagich.wordpress.com/2014/04/11/vagrant%E3%81%AEchef-solo%E3%81%AEprovision%E4%B8%AD%E3%81%AB%E3%80%8Cssl-validation-of-https-requests-is-disabled-%E3%80%8D%E3%81%A8%E8%AD%A6%E5%91%8A%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C/
[Vagrant 1.5] vagrant provisionして、chef binary was not found と出たら。

# エラー

Vagrant + Chef soloで環境を作っていて、vagrant provision時にエラーがでました。

```shell-session
$ vagrant provision 
```

```rb
==> default: Running provisioner: chef_solo...
The chef binary (either `chef-solo` or `chef-client`) was not found on
the VM and is required for chef provisioning. Please verify that chef
is installed and that the binary is available on the PATH.
```

# 対応

これは

```shell-session
$ vagrant plugin install vagrant-omnibus
```

をして、プラグインを追加。

その後、Vagrantfileに一行追加します。

```rb
config.omnibus.chef_version = :latest
```

そして、

```shell-session
$ vagrant reload
$ vagrant provision
```

とりあえず、これでこの問題は解決します。

# 他のエラー

でも、
SSL validation of HTTPS requests is disabled....
なるエラーも出ることもありますので、それは[こちら](http://qiita.com/tsumekoara/items/4d725c261a65a95b5712)で対応みています。


# 参考

http://stackoverflow.com/questions/21274437/vagrant-install-chef-client-on-top-of-base-image
Rubyでデフォルト引数が複数の場合のちょっとしたTips


## 概要
Rubyのデフォルト引数は、かなり便利なものだか、
複数個デフォルト引数がある場合、どうしたらよいのかをまとめてみた。

## 結論
ハッシュを使って渡そう

```
def hoge(args = {})
  args = {var1: "foo", var2: "fuga"}.merge(args)
end
```

## 内容
### 基本的なデフォルト引数
```rb
def hoge(var = "foo")
 p "#{var}"	
end
```

指定しない時はデフォルトの値を使い

```rb
hoge
=> "foo"
```

引数指定した場合は、その値を使う

```rb
hoge("fuga")
=> "fufa"
```

### 引数が複数ある場合
```rb
def hoge(var1 = "foo", var2 = "fuga")
 p "#{var1}_#{var2}"	
end
```

指定しない場合はこれでよいが…

```rb
hoge
=> "foo_fuga"
```

``"foo_foo"``と出力したい(第2引数だけ変更したい)場合

```rb
hoge("foo", "foo")
=> "foo"
```
デフォルト引数の恩恵が受けられない

### なのでハッシュで渡す
こうしておけば

```rb
def hoge(args = {})
  args = {var1: "foo", var2: "fuga"}.merge(args)
  p "#{args[:var1]}_#{args[:var2]}"
end
```

指定しない場合でも。

```rb
hoge
=> "foo_fuga"
```

変えたい引数だけをハッシュで渡せば、
全部を指定しなくても…

```rb
hoge({var2: "foo"})
=> "foo_foo"
```

```rb
hoge({var1: "fuga"})
=> "fuga_fuga"
```

デフォルト引数が使える！

## まとめ
外部API周りなど、
いろいろな引数が想定される場合には、使えるかと思います。
heroku create のエラー

`$ heroku create　`
 !    You've reached the limit of 5 apps for unverified accounts.
 !    Add a credit card to verify your account.

どうやら、5つ以上作れないらしい（無料分では）
作成済みappの表示

`$ heroku apps`
=== My Apps
desolate-harbor-9190
evening-earth-3373
obscure-dawn-8322
still-escarpment-3902
tranquil-sea-3272

確かに5こ
古いappを削除しよう
`$ heroku destroy --app desolate-harbor-9190`

 !    WARNING: Potentially Destructive Action
 !    This command will destroy desolate-harbor-9190 (including all add-ons).
 !    To proceed, type "desolate-harbor-9190" or re-run this command with --confirm desolate-harbor-9190

もう一度、appIDの入力を求められたので入力して実行

> desolate-harbor-9190
Destroying desolate-harbor-9190 (including all add-ons)... done


完了した

`$ heroku create　`
Creating radiant-caverns-9976... done, stack is cedar
http://radiant-caverns-9976.herokuapp.com/ | git@heroku.com:radiant-caverns-9976.git
Git remote heroku added

できた〜☆
JIRAで特定のラベルが付与されているチケットを含まないフィルターを作る

## やりたいこと

特定のラベルが付与されているチケットを**含まない**フィルターを作りたい。

## やりかた

JQLをこんな感じに書く。

```sql
project = PRJ_NAME AND (labels not in (EXCLUDE_LABEL_NAME) OR labels is EMPTY) ORDER BY Rank ASC
```

この時、`not in(EXCLUDE_LABEL_NAME)`だけだとエラーが出るので、`OR labels is EMPTY`を組み合わせて使わなければならない。

## 参考
[JQL - When using 'NOT IN()' for custom fields and labels results should include EMPTY](https://jira.atlassian.com/browse/JRA-24511)
自己証明書のhttpsサイトで証明書エラーを非表示にする手順

[Apache+OpenSSLで簡単に自己認証したい - Qiita](http://qiita.com/cs_sonar/items/81b30c7a1d86d729c7fc)を元にやってみた。

あと以前書いた記事: [クライアント証明書を要求するサイトの構築（Apache+OpenSSL）その1 - Qiita](http://qiita.com/tukiyo3/items/b5e8b3efce800b0fd269)


```bash:
yum install -y httpd mod_ssl
cd /opt
```

# 鍵の生成

## 秘密鍵(key)の生成

```bash:
openssl genrsa \
  -out server.key 2048
```

## 証明書 署名要求(csr)の生成

```bash:csrの生成
openssl req \
  -new \
  -key server.key \
  -out server.csr \
  -subj "/C=JP/ST=Tokyo/L=Tokyo/O=super_office.jp/OU=Web/CN=$(hostname)"
```

## csrに署名しサーバ証明書(crt)を生成

```bash:有効期間3650日
openssl x509 \
  -in server.csr \
  -days 3650 \
  -req  \
  -signkey server.key > server.crt
```

# httpdの設定

httpsは公開鍵(csr)と証明書(crt)にて動作する。

```diff:/etc/httpd/conf.d/ssl.conf
- SSLCertificateFile /etc/pki/tls/certs/localhost.crt
- SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
+ SSLCertificateFile /opt/server.crt
+ SSLCertificateKeyFile /opt/server.key
```


# IEで証明書エラーを非表示にする

* いわゆるこいつ

![スクリーンショット 2014-07-23 13.52.32.png](https://qiita-image-store.s3.amazonaws.com/0/25728/cc9ffb97-6a0a-661d-f3c3-19d74d0e84df.png)


* webサーバから持ってきた「server.crt」をwindowsでダブルクリック

![スクリーンショット 2014-07-23 13.52.07.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a0231d2f-c8ab-038c-6bb4-18234081634f.png)

* ルート証明書のインストール時、次へ次へと進むと「中間証明機関」に入ってしまうので手動で指定。

![スクリーンショット 2014-07-23 13.53.27.png](https://qiita-image-store.s3.amazonaws.com/0/25728/e57b1d5f-c773-c398-00de-1c7cc41a2b70.png)

![スクリーンショット 2014-07-23 13.53.34.png](https://qiita-image-store.s3.amazonaws.com/0/25728/2c9eb636-53bb-48dd-3872-9131116cd00d.png)

## 画面確認

* 警告無く表示できることを確認。

![スクリーンショット 2014-07-23 13.53.51.png](https://qiita-image-store.s3.amazonaws.com/0/25728/4671e983-6678-21bc-307f-e74746e900e0.png)
気軽にプログラミングを始められるWebエディタ『runstant』作りました

7月19日. 久しぶりの３連休.
予定はぎっしりだった.

だが神からのお告げがあった. なんか作れと.
気づいたらオレの指は Macbook Air の薄いキーボードの上だった.

ってことで連休中にちょっとしたツール作りました.
気軽にプログラミングを始められるWebエディタです.

名前は [runstant](http://phi-jp.github.io/runstant/release/alpha/).
run + instant の略で, インスタントラーメンのように一瞬で気軽に実行できるよって意味です.

ログイン不要, サーバー通信なしで一瞬で
プログラミングを始めることができます!!

一応, [tmlib.js](http://phi-jp.github.io/tmlib.js/) 公式エディタ的な
位置づけなのでデフォルトで [tmlib.js](http://phi-jp.github.io/tmlib.js/) のサンプルが入ってます.

とりあえず触ってみてください ->  **[こちら](http://phi-jp.github.io/runstant/release/alpha/)**

![runstant-black.png](https://qiita-image-store.s3.amazonaws.com/0/7756/8b283b34-ea03-9487-403e-96782e565750.png)


## 特徴

- ログインの必要ないよ
- 状態を hash で保存するのでサーバー通信しないよ
- html/css/javascript が書けるよ
- ちょっと工夫すれば coffeescript や typescript とかも書けるよ
- すぐに実行して確認できるよ
- タイトルと詳細も設定できるよ
- share ボタン押せば短縮URL取得したり tweet, facebook シェアしたりできるよ
- ブラウザの履歴に全部残るから保存忘れの心配もないしバージョン管理とか知らずにできてるよ

## 使い方

1. 右側にコードを書く
2.  `save` ボタン(Command+S) を押す
3. 左側に実行画面が表示されます
4. URL にコード情報が保存されます
5. share ボタンを押してみんなにシェアしよう!!

## テンプレート

- [tmlib.js](http://phi-jp.github.io/runstant/release/alpha/)
- [TypeScript](http://goo.gl/ZuMfgl)
- [CoffeeScript](http://goo.gl/GQcxKC)
- [ECMAScript 6](http://goo.gl/hqZqbW)

## 運営

@[phi_jp](https://twitter.com/phi_jp) が開発, 運営してます.
要望などありましたらご連絡ください.

## 技術的なお話(蛇足)

とにかくサーバーを使わないってことにこだわりました.
保存は Object を JSON.stringify して, それを zip 圧縮して url の hash に
ぶちこむという荒業使ってますw

なのでサーバー通信せずに全ての情報を保存しています.
我ながら良い方法思いついたなと自画自賛^^

あと, download に関しても a タグの href に, 編集したコードを base64 に変換したものを
入れておくことでローカルで完結するダウンロード機能を実装しました.

他にも share ボタンは, あえてページ内でやるのではなく url でそれぞれの
シェアページに飛ばすようにすることで通信量を減らしました.(勝手に iframe 作られたりするの好きじゃないので...)

pushState, popState 使ってたり, ace ネタとかもかなり溜まったりしてるので,
近々それぞれ技術エントリーでも書こうと思います.


なんか久々に家でがっつりプログラミングしました.
やっぱり自分が欲しいもの作るのが一番ですね♪

[runstant](http://phi-jp.github.io/runstant/release/alpha/), [tmlib.js](http://phi-jp.github.io/tmlib.js/) ともども今後共よろしくお願いします.
未経験からWebエンジニアになりたい人に見ておいてほしいドットインストール


ドットインストール見ておくといいものまとめです。この流れで進めると良いと思います。ドットインストールを見るときには自分でもちゃんと「書く」ようにしましょう。

### 1. エディタの使い方を学ぶ

vimかsublimeのどちらか。初心者はSublimeの方が良いかと。

* [vim入門（全18回）](http://dotinstall.com/lessons/basic_vim) 
* [Sublime Text 2入門（全14回）](http://dotinstall.com/lessons/basic_sublimetext)

### 2. HTML、CSS、jQueryを学ぶ

王道3スキル。

* [HTML入門（全16回）](http://dotinstall.com/lessons/basic_html_v2)
* [CSS入門（全18回）](http://dotinstall.com/lessons/basic_css_v2)
* [jQuery入門（全20回）](http://dotinstall.com/lessons/basic_javascript_v2)

### 3. Bootstrapを使う

Bootstrapを使うとテンション上がります。逆に使わないとテンション下がります。

* [Bootstrap 3.0入門 (全18回)](http://dotinstall.com/lessons/basic_twitter_bootstrap_v4)

### 4. DeveloperToolsは必須スキル

* [Chrome Developer Tools入門 (全10回)](http://dotinstall.com/lessons/basic_chrome_dev_v2)

### 5. コマンドで生産性を高める

* [UNIXコマンド入門 (一般ユーザー編) (全16回)](http://dotinstall.com/lessons/basic_unix)

### 6. Gitでコード管理とチーム開発

* [git入門 (全22回)
](http://dotinstall.com/lessons/basic_git)

### 7. CSSを便利に使う


* [Sass/SCSS入門 (全15回)](http://dotinstall.com/lessons/basic_sass)
* [Compass入門 (全7回)](http://dotinstall.com/lessons/basic_compass)

### 8. Javascriptを便利に使う


* [AngularJS入門 (全12回)](http://dotinstall.com/lessons/basic_angularjs)
* [Backbone.js入門 (全22回)](http://dotinstall.com/lessons/basic_backbonejs)



このあたり抑えとくと良いと思います。ドットインストールいいサービスですね。
PhotonCloud + Unityでオンラインゲーム開発 その2 ~プレイヤーの同期~

前回の記事
http://qiita.com/yuya-okada/items/f90debb5ba994790f6fe

<h1>1.下準備</h1>
まず、プレイヤーのオブジェクトを用意しなくては何も始まりません。
今回は手間を省くために、Unityのスタンダードアセットに付属の既存のオブジェクトを使用します。
[Assets]>[Import Package]>[Character Controller]
を選択し、スタンダードアセットをインポートします。
インポートが完了したら、Projectビューから、
[Standard Assets]>[Character Controller]>[First Person Controller]
を好きな場所に配置してください。このオブジェクトの名前を"Player"に変更します。
また、
[GameObject]>[Create Other]>[Cube]
から、立方体を出して、適当に拡大して地面を作ります。
さらに、
[GameObject]>[Create Other]>[Directional Light]
から照明も配置しておきましょう。
![スクリーンショット 2014-07-23 12.52.13.png](https://qiita-image-store.s3.amazonaws.com/0/28813/5a599b5c-c1e6-8e11-9778-b305eb23f3fd.png)

この状態で実行すると、一人称視点のゲーム画面になります。
WASDもしくは矢印キーで移動して、マウスで視点変更ができます。

<h1>2.プレイヤーにPhotonViewを追加する</h1>
このプレイヤーをPhotonで同期し、ネットワーク通信プレイができるようにしていきます。

PhotonCloudで同期するGameObjectにはPhotonViewというコンポーネントをアタッチする必要があります。
このコンポーネントはアタッチしたオブジェクトに関するデータをサーバーに送信します。


PlayerオブジェクトのInspectorビューから、
[Add Component]>"PhotonView"で検索>"PhotonView"をアタッチ
![スクリーンショット 2014-07-23 12.56.45.png](https://qiita-image-store.s3.amazonaws.com/0/28813/9111e77b-a1e3-61e8-d9c0-ae44fd4ac10c.png)


<h1>3.プレイヤーをインスタンス化する</h3>

先ほどのPlayerオブジェクトをProjectビューにドラッグ&ドロップして、Playerをプレファブ化します。
そうしたら、もうHierarchyビューのPlayerオブジェクトはいらないので消してしまいましょう。
さらに、Projectビューを
右クリック>[Create]>[Folder]
より、"Resources"フォルダを作り、Playerプレファブをその中に入れましょう。Photonで同期させるプレファブはResourcesフォルダの中にある必要があります。

[GameObject]>[Create Empty]
から、空のゲームオブジェクトを作成して名前を"Manager"とします。
このゲームオブジェクトにはゲーム全体を管理するスクリプトをアタッチします。
Projectビューを
右クリック>[Create]>[C# Script]
から、"NetworkManager"スクリプトを作成します。

```csharp:NetworkManager.cs
using UnityEngine;
using System.Collections;
//Photon.MonoBehaviourであることに注意
public class NetworkManager : Photon.MonoBehaviour {

	void Awake () {
	    PhotonNetwork.Instantiate("Player", new Vector3(0,2,0), Quaternion.identity ,0); //プレイヤーをインスタンス化
	}
	
}

```

Photonでゲームオブジェクトを同期させるときは、通常のInstantiateでなく、PhotonNetwork.Instantiateを使用します。
引数は、
(String プレファブ名,Vector3 生成位置,Quaternion 角度,int グループ)
となっています。最初の３つは通常のInstantiateと同じです。最後のグループには、プレファブにアタッチされているPhotonViewのプロパティにあるgroupと同じ数字をいれます。
初期設定は0です。

[File]>[BuildSettings]>[Scenes In Build]
で、前回作ったメニュー画面のシーンが0、今作ったゲーム画面1になっていることを確認したら、ビルドします。
ビルドしたものを起動して、Create Roomで新しいルームを作ります。
さらに、Unityの画面でもう一つ通常通りに実行し、Join Roomで一つ目と同じルーム名を入力します。

![スクリーンショット 2014-07-23 13.30.39.png](https://qiita-image-store.s3.amazonaws.com/0/28813/61728aaa-8c51-5d10-d88e-e0f172e494a4.png)

<h4>すると、このようにHierarchyビューでは同期された２つのPlayerが表示されます。</h4>
しかし、現在の状態では問題があります。
移動してみると分かるのですが、一人が移動すると他の人も全員おなじようにうごいてしまうのです。

次回はこの問題を解決していきたいと思います。

次回の記事は近日中に書く予定です。
Export Kobito.app markdown to YAML

```js
var util = require('util')
  , sqlite3 = require('sqlite3').verbose()
  , fs = require('fs')
  , mkdirp = require('mkdirp')

var Kobito = function(path) {
  this.db = new sqlite3.Database(path)
}
Kobito.prototype = {
  execAll: function(sql, callback) {
    if (typeof callback !== "function") return
    this.db.serialize((function() {
      this.db.all(sql, function(err, rows) {
        if (err) { return console.log(err) }
        callback.apply(this, Array.prototype.slice.call(arguments, 0))
      })
    }).bind(this))
  },
  fetchAllArticles: function(callback) {
    this.execAll("SELECT Z_PK AS id, ZTITLE AS title, ZRAW_BODY AS raw_body FROM ZITEM", callback)
  },
  fetchOneArticle: function(id, callback) {
    this.execAll("SELECT ZTITLE AS title, ZRAW_BODY AS raw_body FROM ZITEM WHERE Z_PK = " + id, callback)
  },
  fetchTagsByArticle: function(id, callback) {
    this.execAll("SELECT Z_1TAGS.Z_2TAGS AS id, ZTAG.ZNAME AS name FROM Z_1TAGS INNER JOIN ZTAG ON Z_1TAGS.Z_2TAGS = ZTAG.Z_PK WHERE Z_1TAGS.Z_1ITEMS = " + id, callback)
  },
  fetchAllTags: function(callback) {
    this.execAll("SELECT Z_PK AS id FROM ZTAG", callback)
  },
  fetchOneTag: function(id, callback) {
    this.execAll("SELECT Z_PK AS id, ZNAME AS name FROM ZTAG WHERE Z_PK = " + id, callback)
  },
  fetchArticlesByTag: function(id, callback) {
    this.execAll("SELECT Z_1TAGS.Z_1ITEMS AS id, ZITEM.ZTITLE AS title FROM Z_1TAGS INNER JOIN ZITEM ON Z_1TAGS.Z_1ITEMS = ZITEM.Z_PK WHERE Z_1TAGS.Z_2TAGS = " + id, callback)
  },
  fetchArticle: function(id, callback) {
    var self = this
    this.fetchOneArticle(id, function(err, article) {
      self.fetchTagsByArticle(id, function(err, tags) {
        article[0].tags = (function() {
          var ret = []
          tags.forEach(function(tag) {
            ret.push(tag.name)
          })
          return ret
        })()
        article[0].id = id
        callback(err, article[0])
      })
    })
  },
  fetchTag: function(id, callback) {
    var self = this
    this.fetchOneTag(id, function(err, tag) {
      self.fetchArticlesByTag(id, function(err, articles) {
        tag[0].articles = articles
        callback(err, tag)
      })
    })
  }
}

var kobito = new Kobito( util.format('%s/Library/Kobito/Kobito.db', process.env.HOME) )

kobito.fetchAllArticles(function(err, articles) {
  mkdirp.sync('src')
  articles.forEach(function(article) {
    kobito.fetchArticle(article.id, function(err, article) {

      // export to yaml for metalsmith/jekyll
      var content = '---\n' +
                    'title: ' + article.title.replace(':', '') + '\n' +
                    'tags: ' + article.tags.join(',') + '\n' +
                    'template: index.html\n' +
                    '---\n\n' +
                    article.raw_body
      fs.writeFile('src/' + article.id + '.md', content, function(err) {
        if (err) { return console.log(err) }
      })

    })
  })
})
```

run `npm install sqlite3, mkdirp` first.



https://gist.github.com/NdYAG/ecf73ff96cf125f0d72d
.NET Framework V2.0～V4.0に対応するCOMコンポーネント

レジストリに以下の要素を追加することで、V2.0～V4.0の.NET Framework環境で実行できるCOMコンポーネントを登録できる。

パス
`[HKEY_CLASSES_ROOT\CLSID\{...COMコンポーネントのCLSID}\InprocServer32\{COMコンポーネントのバージョン}]`
例)
`HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{76E587C3-003E-3887-8017-398552013CFA}\InprocServer32\1.1.424.0`

要素
`"SupportedRuntimeVersions"="v2.0.50727;v4.0"`