OmniAICreator/Qiita-1.07M huggingface dataset:
FacebookのOGPキャッシュを自動でクリアする


ユーザ投稿型サイトとかの場合、OGPのタイトルとか写真とかユーザが更新したタイミングで自動でキャッシュをクリアするようにしたい（手動でやる場合は[debugger](https://developers.facebook.com/tools/debug/)から）。

そのときには下記URLにPOST送信すれば良いそう。

```POST
https://graph.facebook.com/?scrape=true&id=URL
```

参考：http://web-tan.forum.impressrd.jp/e/2013/12/17/16623

2014/7/24時点で有効な事を確認しました。

ユーザがページの内容を変更した際に上記URLにpost送信すると自動でOGPがキャッシュクリアされるようにすると便利ですね。
最初にOGP設定してなくて大量に同じog:titleが残ってしまった場合（あるある）とかに一括で更新したい時も便利。
Hubot-scriptsでHipchatのbotと戯れる


Hipchatのアカウントを作りましたが、自分以外誰もいません。
寂しいので、僕と会話してくれるbotを作ります。
開発環境はCentOS。

### 環境のインストール

ここのへんを参考に。特にハマること無くできました。

* [開発のお手伝いボット Hubot で定期処理を自動化しよう！](http://kray.jp/blog/hubot/)
* [Hubotの導入とHipChat Adapter設定方法](http://kkurahar.github.io/blog/2013/10/03/hubot-hipchat/)



### botを作成

```bash
hubot --create mybot
cd mybot
```


### [hubot-scripts](https://github.com/github/hubot-scripts)を使う

hubotに最初からインストールされているhubot-scriptsを使ってみます。

[hubot-script-catalog](http://hubot-script-catalog.herokuapp.com/)で気になるスクリプトを探す。
依存関係がある場合は、package.jsonに依存関係を記述する。
[animal.json](https://github.com/github/hubot-scripts/blob/master/src/scripts/animal.coffee)の場合、
	
```json:animal-coffee
# Dependencies:
#   "htmlparser": "1.7.6"
#   "soupselect": "0.2.0"
```


の２つが指定されているので、これをpackage.jsonのdependenciesに追記する.

```javascript:package.json
"dependencies": {
 	"hubot": ">= 2.6.0 < 3.0.0",
	"hubot-scripts": ">= 2.5.0 < 3.0.0",
	"hubot-hipchat": "~2.7.5",
	"htmlparser": "1.7.6",
	"soupselect": "0.2.0"
``` 

botに対して「animal me」と投げると動物のgifを返してきます。

![HipChat_-_Web_Chat.png](https://qiita-image-store.s3.amazonaws.com/0/8607/d7027974-3b20-d143-b0f4-555975ba10b6.png "HipChat_-_Web_Chat.png")


もう１つ、[lyrics.coffee](https://github.com/github/hubot-scripts/blob/master/src/scripts/lyrics.coffee)ってのも入れてみた。
"lyrics for '曲名' by 'アーティスト名' " と投げると歌詞を検索してくれる。

![HipChat_-_Web_Chat.png](https://qiita-image-store.s3.amazonaws.com/0/8607/66fbe007-39bd-9460-17cf-f16ab0ad413b.png "HipChat_-_Web_Chat.png")



### 終わり

**これでもう寂しくないね！！**
Salesforceのルックアップアイコンを再現する

![スクリーンショット 2014-07-24 22.10.03.png](https://qiita-image-store.s3.amazonaws.com/0/8407/bfd43c24-36b5-72d2-d50a-0c4e4c6a78db.png)

参照関係や主従関係の項目をinputFieldで表示した際に一緒に表示されるルックアップアイコンですが、次のようにclassを指定することで再現することができます。マウスを当てた時に少し沈む感じも再現できます。

```
<a onclick="alert('Lookup')">
  <img src="/s.gif" title="ルックアップ" class="lookupIcon"
      onfocus="this.className = 'lookupIconOn';"
      onmouseout="this.className = 'lookupIcon';"
      onmouseover="this.className = 'lookupIconOn';"
  />
</a>
```
iOS8 に向けた傾向と対策


※随時できるだけ更新。

# iOSのリリースの傾向

## メジャー version upと製品リリースの関係

新OS発表後にβを提供し、GMリリースとほぼ同時期に新iPhoneを発表。


|  | iOS 4 | iOS 5|iOS 6|iOS 7 |iOS 8|
|:-------|:------:|:------:|:-----:|:------:|:-----:|
|ベータテスト開始|2010/4/9|2011/6/6|2012/6/11|2013/6/11|2014/6/2|
|GM版配布|2010/6/9|2011/10/5|2012/9/12|2013/9/10|2014/9/9|
|新iPhone発表|2010/6/8|2011/10/5|2012/9/13|2013/9/10|2014/9/9|
|一般配布開始|2010/6/22|2011/10/12|2012/9/20|2013/9/18|2014/9/17|
|新iPhone発売|2010/6/24|2011/10/14|2012/9/21|2013/9/20|2014/9/19|

※注意1：ライブラリレベルだとGMと一般配布の内容に差異がある場合も。
※注意2：.1のupdate時はGMを飛ばす場合もある。あくまでメジャーversionの傾向です。


## βリリースの傾向

いくつまで出るかわかりません。GMが出るまでは、これが最終だろうと思わない方が自分のためです。
※2014/09/10時点

|iOS|最終ベータ版|
|:-----:|:-----:|
|iOS 3.0|beta 5|
|iOS 4.0|beta 4|
|iOS 5.0|beta 7|
|iOS 6.0|beta 4|
|iOS 7.0|beta 6|
|iOS 8.0|beta 5|


# 対策案

あくまで私見です。

* GMリリースを見据えて、自アプリに影響ある変更点の確認を事前に。
* GMリリース後にも柔軟に対応＆リリースする準備を。tiny versionくらいはすぐに上がります。

あとは、iOS8専用端末をいかにしてGETできるか[iphone 6 & iPhone 6 Plus]がカギです。watchがいつになるかは不明なのが気がかりです。


# reference

Thx.

* http://www.kototoka.com/entry/2014/03/10/120034
* http://tools4hack.santalab.me/ios7-beta6-release.html
* [iOS (アップル) @wikipedia](http://ja.wikipedia.org/wiki/IOS_(%E3%82%A2%E3%83%83%E3%83%97%E3%83%AB))
standardControllerで取得したレコードに値をセットする

![スクリーンショット 2014-07-24 21.59.29.png](https://qiita-image-store.s3.amazonaws.com/0/8407/701512bd-a175-1640-c760-f44060a051d3.png)

stdControllerのgetRecord()を利用すればオブジェクトの情報を簡単に取得することができます。このgetRecord()で取得できる情報はsObject型です。

なので.put()を利用することで値をセットすることができます。初期値をセットしたいときや画面に表示していない項目に値をセットしたい場合はこれで対応できます。

```Visualforce:ContractEdit.page
<apex:page standardController="Contract" extensions="ContractEditController">
  <apex:form>
    <apex:pageBlock>
      <apex:pageBlockButtons location="bottom" id="button">
        <apex:commandButton value="保存" action="{!Save}" />
        <apex:commandButton value="キャンセル" action="{!Cancel}" />
      </apex:pageBlockButtons>
      <apex:pageBlockSection>
        <apex:inputField value="{!Contract.StartDate}" />
        <apex:inputField value="{!Contract.AccountId}" />
        <apex:inputField value="{!Contract.ContractTerm}" />
        <apex:inputField value="{!Contract.OwnerExpirationNotice}" />
      </apex:pageBlockSection>
    </apex:pageBlock>      
  </apex:form>
</apex:page>
```

```Apex:ContractEditController
public with sharing class ContractEditController {
    
  public ContractEditController(ApexPages.StandardController stdController) {
    sObject sObj = stdController.getRecord();
    sObj.put('Status', 'Draft');
    sObj.put('StartDate', System.today());
    sObj.put('ContractTerm', 1);
  }
}
```
Berkshelf 関連記事まとめ

# Berkshelf 関連記事まとめ

更新日: 2014/07/28 21:41:56

|No.|タイトル|作成日|ストック数|
|--:|:--|:--:|--:|
|1|[Berkshelf 関連記事まとめ](http://qiita.com/tbpgr/items/dc44e5ad0e01cc962a89)|2014/07/24 21:47:15|0|
|2|[Berkshelf3  berks cookbook](http://qiita.com/tbpgr/items/4d421abe629d9b437a2e)|2014/07/24 21:38:04|0|
|3|[Berkshelf3  berks help](http://qiita.com/tbpgr/items/c3e650401fcf87a2938c)|2014/07/28 21:40:26|0|
|4|[Berkshelf3  berks info](http://qiita.com/tbpgr/items/b4463e1f38f897248d32)|2014/07/24 21:34:29|0|
|5|[Berkshelf3  berks init](http://qiita.com/tbpgr/items/aa920da7e7c6ad4c0bef)|2014/07/24 21:33:25|0|
|6|[Berkshelf3  berks list](http://qiita.com/tbpgr/items/48206f2c5f92e6ce7150)|2014/07/24 21:36:22|0|
|7|[Berkshelf3  berks search](http://qiita.com/tbpgr/items/e4b28cdfc52bae03aad0)|2014/07/24 21:44:27|0|
|8|[Berkshelf3  berks shelf](http://qiita.com/tbpgr/items/6ed973da1a76286427e6)|2014/07/24 21:45:51|0|
|9|[Berkshelf3  berks vendor](http://qiita.com/tbpgr/items/24741fad0862b211132c)|2014/07/24 21:43:24|0|
|10|[Berkshelf3  ~/.berkshelf と BERKSHELF_PATH](http://qiita.com/tbpgr/items/b1fb04f0eca6252a5097)|2014/07/28 21:41:25|0|
Berkshelf3 | berks shelf

# Berkshelf3 | berks shelf
## 概要
*berks shelf* コマンドは shelf に保存されているクックブックの
1件表示・リスト表示・アンインストールなどのサブコマンドを利用可能です。

## サンプル
### サブコマンド: list
~~~bash
$ berks shelf list
DL is deprecated, please use Fiddle
Cookbooks in the Berkshelf shelf:
  * build-essential (2.0.4)
  * chef_handler (1.1.6)
  * dmg (2.2.0)
  * git (4.0.2)
  * runit (1.5.10)
  * sudo (2.6.0)
  * windows (1.33.1)
  * yum (3.2.2)
  * yum-epel (0.3.6)
~~~

### サブコマンド: show
~~~bash
$ berks shelf show git
Displaying all versions of 'git' in the Berkshelf shelf:
        Name: git
     Version: 4.0.2
 Description: Installs git and/or sets up a Git server daemon
      Author: Chef Software, Inc.
       Email: cookbooks@opscode.com
     License: Apache 2.0
   Platforms: amazon (>= 0.0.0)
              arch (>= 0.0.0)
              centos (>= 0.0.0)
              debian (>= 0.0.0)
              fedora (>= 0.0.0)
              redhat (>= 0.0.0)
              scientific (>= 0.0.0)
              oracle (>= 0.0.0)
              ubuntu (>= 0.0.0)
              windows (>= 0.0.0)
              mac_os_x (>= 10.6.0)
Dependencies: dmg (>= 0.0.0)
              build-essential (>= 0.0.0)
              windows (>= 0.0.0)
              runit (>= 1.0.0)
              yum (~> 3.0)
              yum-epel (>= 0.0.0)
~~~

### サブコマンド: uninstall
~~~bash
$ berks shelf uninstall git
Successfully uninstalled git (4.0.2)

# git が uninstall されたことを確認
$ berks shelf list
DL is deprecated, please use Fiddle
Cookbooks in the Berkshelf shelf:
  * build-essential (2.0.4)
  * chef_handler (1.1.6)
  * dmg (2.2.0)
  * runit (1.5.10)
  * sudo (2.6.0)
  * windows (1.33.1)
  * yum (3.2.2)
  * yum-epel (0.3.6)
~~~

## ソースがドキュメント
公式リファレンスも、 help コマンドも情報が少ないのでソースコードをみました。

https://github.com/berkshelf/berkshelf/blob/master/lib/berkshelf/commands/shelf.rb

## 公式リファレンス
http://berkshelf.com/
Berkshelf3 | berks search

# Berkshelf3 | berks search
## 概要
*berks search* コマンドは任意の名前のクックブックを検索します。
デフォルトでは https://supermarket.getchef.com から検索します。
検索に指定した名称は、正規表現として処理されます。

## サンプル

~~~bash
# github を含む名前のクックブックを表示
$ berks search github
github (0.3.0)
github-deploys (0.1.2)
github_backup (0.1.0)
github_users (0.1.1)

# githubのクックブックを表示
$ berks search ^github$
github (0.3.0)
~~~

## コードリーディング
処理が気になる方はこちら。
https://github.com/berkshelf/berkshelf/blob/master/lib/berkshelf/source.rb

## 公式リファレンス
http://berkshelf.com/
Berkshelf3 | berks vendor

# Berkshelf3 | berks vendor
## 概要
*berks vendor* コマンドは依存先も含めた *cookbook* をダウンロードしてきて
任意のディレクトリに保存します。
保存先を指定しないと、 *./berks-cookbooks* ディレクトリを作成し、
その中に *cookbook* をダウンロードします。

Berkshelf2 までの *berks install --path cookbooks* が Berkshelf3 の *berks vendor cookbooks* に相当します。

## サンプル

~~~bash
$ knife solo init hoge
$ cd hoge

# 後述の内容に変更
$ vi Berksfile

$ cat <<EOS>metadata.rb
> name             'hoge'
> maintainer       'tbpgr'
> maintainer_email 'sample'
> license          'All rights reserved'
> description      'Installs/Configures createdb'
> long_description 'long_description'
> version          '0.1.0'
>
> depends          'git'
> EOS

$ berks vendor
Resolving cookbook dependencies...
Fetching 'hoge' from source at .
Fetching cookbook index from https://supermarket.getchef.com...
Using build-essential (2.0.4)
Using dmg (2.2.0)
Using hoge (0.1.0) from source at .
Using runit (1.5.10)
Using git (4.0.2)
Using yum (3.2.2)
Using chef_handler (1.1.6)
Using yum-epel (0.3.6)
Using windows (1.33.1)
Vendoring build-essential (2.0.4) to /some_path/hoge/berks-cookbooks/build-essential
Vendoring chef_handler (1.1.6) to /some_path/hoge/berks-cookbooks/chef_handler
Vendoring dmg (2.2.0) to /some_path/hoge/berks-cookbooks/dmg
Vendoring git (4.0.2) to /some_path/hoge/berks-cookbooks/git
Vendoring hoge (0.1.0) to /some_path/hoge/berks-cookbooks/hoge
Vendoring runit (1.5.10) to /some_path/hoge/berks-cookbooks/runit
Vendoring windows (1.33.1) to /some_path/hoge/berks-cookbooks/windows
Vendoring yum (3.2.2) to /some_path/hoge/berks-cookbooks/yum
Vendoring yum-epel (0.3.6) to /some_path/hoge/berks-cookbooks/yum-epel

$ rm Berksfile.lock
# 出力先ディレクトリがあるとエラーになるので事前に削除
$ rm -r cookbooks

# 今度はcookbooks にダウンロードしてみます
DL is deprecated, please use Fiddle
# 略
Vendoring yum-epel (0.3.6) to /some_path/sample/hoge/cookbooks/yum-epel
# 略
~~~

~~~ruby:Berksfile
source "https://supermarket.getchef.com"

metadata

cookbook "git"
~~~

## 公式リファレンス
http://berkshelf.com/
Berkshelf3 | berks cookbook

# Berkshelf3 | berks cookbook
## 概要
*berks cookbook* コマンドは berkshelf の利用を前提とした *cookbook* の
テンプレートを生成します。

役割としては *knife cookbook create* と似ています。

## サンプル

~~~bash
$ berks cookbook hoge
      create  hoge/files/default
      create  hoge/templates/default
      create  hoge/attributes
      create  hoge/libraries
      create  hoge/providers
      create  hoge/recipes
      create  hoge/resources
      create  hoge/recipes/default.rb
      create  hoge/metadata.rb
      create  hoge/LICENSE
      create  hoge/README.md
      create  hoge/CHANGELOG.md
      create  hoge/Berksfile
      create  hoge/Thorfile
      create  hoge/chefignore
      create  hoge/.gitignore
      create  hoge/Gemfile
      create  hoge/Vagrantfile

$ tree -F
.
┗ hoge/
    ┣ attributes/
    ┣ Berksfile
    ┣ CHANGELOG.md
    ┣ chefignore
    ┣ files/
    ┃ ┗ default/
    ┣ Gemfile
    ┣ libraries/
    ┣ LICENSE
    ┣ metadata.rb
    ┣ providers/
    ┣ README.md
    ┣ recipes/
    ┃ ┗ default.rb
    ┣ resources/
    ┣ templates/
    ┃ ┗ default/
    ┣ Thorfile
    ┗ Vagrantfile
~~~

## おまけ：比較用の knife solo init の出力内容

~~~
$ knife cookbook create hige
** Creating cookbook hige
** Creating README for cookbook: hige
** Creating CHANGELOG for cookbook: hige
** Creating metadata for cookbook: hige
$ cd cookbooks/hige
$ tree -F
.
┣ attributes/
┣ CHANGELOG.md
┣ definitions/
┣ files/
┃ ┗ default/
┣ libraries/
┣ metadata.rb
┣ providers/
┣ README.md
┣ recipes/
┃ ┗ default.rb
┣ resources/
┗ templates/
    ┗ default/
~~~

## 公式リファレンス
http://berkshelf.com/
Berkshelf3 | berks list

# Berkshelf3 | berks list
## 概要
*berks list* コマンドは berkshelf でダウンロードした *cookbook* の情報をリスト表示します。
この際表示されるのは、依存先も含めたものです。

## サンプル

~~~bash
$ berks list
Cookbooks installed by your Berksfile:
  * build-essential (2.0.4)
  * chef_handler (1.1.6)
  * dmg (2.2.0)
  * git (4.0.2)
  * runit (1.5.10)
  * windows (1.33.1)
  * yum (3.2.2)
  * yum-epel (0.3.6)
~~~

## 公式リファレンス
http://berkshelf.com/
Windows向けSSHクライントRloginを使用する


#SSH(Secure Shell)クライアントって？

##UNIXライクOSユーザーは特に意識しない
SSHクライアントは、SSH接続を可能にするためのソフトのことを指します。OSXやLinuxでは標準でSSHクライアントソフトが入っており、ターミナルから`ssh`と打つことで起動します。これらのOSのほとんどが実装しているのがOpenSSHというソフトです。

##WindowsユーザーはSSHに恵まれない
ところがどっこい、Windowsはと言うとSSHクライアントソフトは標準で実装されていません。いったいどういう理由でSSHが実装されないのかはわかりませんが、この辺りの背景を調べてみるのも面白そうですが、又の機会に。

###WindowsでもOpenSSHを使えるんだけど
標準で実装されていないだけでインストールすればOpenSSHを使えます。興味のある方はググってみてください。実際に使っている方の少なさに驚くことでしょう。使用者が少ない理由はおそらくコマンドプロンプトの使い勝手の悪さだと思います。

##端末エミュレーターを使います
さて、おそらく上記のような理由からWindowsではコマンドプロンプトからのSSH接続が流行らないものと考えられます。
じゃあみんなどうしてるかというと、端末エミュレーターを使用しています。

###性に合わない端末エミュレーターもある
前述のように端末エミュレーターを使用すれば簡単にSSH接続が可能になります。
ということで、いままでは、TeraTermを使っていました。このソフト、Windows向けではおそらく1番の知名度を誇る端末エミュレーターもといSSHクライアントなのですが、どうも使いこなせないんです。
相性が悪いというか、気がつけば複数のウィンドウが乱立、フォントを変えようと思うとエンコーディングの問題で2バイト文字は文字化け。

設定を煮詰めろというヤジが聞こえてくる気もしますが、その設定がしにくいのなんの、性に合いません。その辺りのUI（ユーザーインターフェース）もソフトを使用する上で重要です。

そうして僕はTeraTermとさよならしました。


#ようこそRLogin
かくしてSSHクライアントを探し始めた僕が行き着いたのが[RLogin](http://nanno.dip.jp/softlib/man/rlogin/)（フリーウェア）です。
しばらく使ってみて、個人的に良いなと思った特徴を挙げてみました。

##タブが使えるよ
こちらのソフトもTeraTermとほとんど同じ機能を持っているのですが、まず特筆すべきはタブ機能。これだけで以前と比べてかなりスッキリとします。

##画面の分割ができる
画面を分割して縦2カラム表示や水平に分割も可能です。これで`screen`の画面分割にチャレンジしなくても良くなりました。

##ログインIDとPWを覚えてくれる
1度SSH接続先の設定を行うとログインIDとPWもそのまま保存可能です。
あれ、でもこれってセキュリティ的にどうなんだろう。と考えたこともありますが、公開鍵認証していると結局パスフレーズ使わなかったりで同じ感覚でよしとしています。
念の為に設定ファイルを確認しましたけど平文ではパスワードを書いていなかったのでこれ以上追求しません。

*このあたりもっとこうした方がいいよという意見をお待ちしております。*

##フォントが見やすい
デフォルトで設定されているフォントがTeraTermに比べてかなり読みやすいです。ただ、これでもまだ不満は残ります。

##実はポータブルです（RLogin.iniを作りましょう）
情報収集している段階で見かけたのが、設定ファイルをレジストリに書くのでどこでも同じように使えないという意見。
そんなことありませんよ。
`RLogin.ini`として、空ファイルをRLoginの本体と同じフォルダに置いておきます。
そうすると設定をレジストリで読み書きせずにこちらの設定ファイルで行うようになります。
したがって、個人用の設定をそのまま持ち歩くことが可能ですのでUSBフラッシュメモリ等で持ち運んでもいいでしょうし、クラウドストレージにおいておくのもいいかもしれません。ただし、その場合パスワードが入力済みであるということに要注意です。

ちなみに設定ファイルと本体を合わせて大体6Mbちょっとです。

##でもここが気になります
以上、1週間ほどRLoginを使ってみた感想です。
イイトコばかり取り上げてもずるいので、気に喰わないところも紹介します。

###色の設定が気になる
いま気になっているのはカラースキームの設定です。
標準で用意されているテーマがしっくりこないので、Solarizedを使用したいのですが、外部設定ファイルの読み込みに対応していないみたいです。
それ故、個別に16色のパレットの設定をしなくてはいけません。これが面倒でまだ出来ていません。

###フォントがやっぱり気になる
あとはフォントです。やはりRictyを入れて変更するのが確実でしょうか。

#最後に
以上、TeraTermの代わりにRLoginを使用して感じた特徴と、気になるポイントでした。
総合的に非常に使いやすいSSHクライアントではないでしょうか。
やはり、もっと使用者が増えて設定例とかが豊富に出てくるといいですね。

###SSHだけじゃないよ
もちろんtelnet, com, pipeなんかも出来ます。
Berkshelf3 | berks info

# Berkshelf3 | berks info
## 概要
*berks info* コマンドは berkshelf でダウンロードした *cookbook* の情報を表示します。
*metadata.json* に定義されている内容を表示します。

## サンプル

~~~bash
$ berks info git
        Name: git
     Version: 4.0.2
 Description: Installs git and/or sets up a Git server daemon
      Author: Chef Software, Inc.
       Email: cookbooks@opscode.com
     License: Apache 2.0
   Platforms: amazon (>= 0.0.0)
              arch (>= 0.0.0)
              centos (>= 0.0.0)
              debian (>= 0.0.0)
              fedora (>= 0.0.0)
              redhat (>= 0.0.0)
              scientific (>= 0.0.0)
              oracle (>= 0.0.0)
              ubuntu (>= 0.0.0)
              windows (>= 0.0.0)
              mac_os_x (>= 10.6.0)
Dependencies: dmg (>= 0.0.0)
              build-essential (>= 0.0.0)
              windows (>= 0.0.0)
              runit (>= 1.0.0)
              yum (~> 3.0)
              yum-epel (>= 0.0.0)
~~~

## 公式リファレンス
http://berkshelf.com/
Berkshelf3 | berks init

# Berkshelf3 | berks init
## 概要
*berks init* コマンドは下記のファイル群のテンプレートを生成します。

* Berksfile
* Thorfile
* chefignore
* .gitignore
* Gemfile
* Vagrantfile

## 前提

*berks init* を実行するには、事前に *metadata.rb* を
作成しておく必要があります。

## 参考手順

~~~bash
# 事前に knife solo で kitchen を作っておきます
$ knife solo init hoge
$ cd hoge

# 事前に metadata.rb を作成しておきます

$ cat <<EOS>metadata.rb
> name             'hoge'
> maintainer       'tbpgr'
> maintainer_email 'sample'
> license          'All rights reserved'
> description      'Installs/Configures createdb'
> long_description 'long_description'
> version          '0.1.0'
>
> depends          'git'
> EOS

# init
$ berks init
    conflict  Berksfile
    Overwrite /some_path/hoge/Berksfile? (enter "h" for help) [Ynaqdh] n
        skip  Berksfile
      create  Thorfile
      create  chefignore
    conflict  .gitignore
Overwrite /some_path/hoge/.gitignore? (enter "h" for help) [Ynaqdh] n
        skip  .gitignore
      create  Gemfile
      create  Vagrantfile
Successfully initialized

# ※出力済みファイルについては、 overwrite するどうか選択する

# 出力ファイル、フォルダを確認する

$ tree
.
┣ Berksfile
┣ chefignore
┣ cookbooks
┣ data_bags
┣ environments
┣ Gemfile
┣ metadata.rb
┣ nodes
┣ README.md
┣ roles
┣ site-cookbooks
┣ Thorfile
┗ Vagrantfile
~~~

## 公式リファレンス
http://berkshelf.com/
findを使ってまとめて何かする


調べるのが面倒なので、自分用のまとめです。

#まとめてリネーム

data01.dat, data02.dat, data03.dat, ...をweight01.dat, weight02.dat, weight03.datにリネームする。

```
find . -name 'data[0-9]*.dat' | sed -e 's/\(.\/data\(.[0-9]*\).dat\)/mv \1 weight\2.dat/g' | sh
```

#ファイルエンコーディングをまとめて変換

./A/weight01.dat, ./A/weight02.dat, ./A/weight03.dat, 
./B/data01.dat, ./B/data02.dat, ./B/data03.dat, 
./C/data01.dat, ./C/data03.dat, ./C/data03.datのdatファイル（A,B,Cの中にある.datファイルはこれで全部） のファイルエンコーディングをsjisからutf8に変換(新しいファイル名は *filename*.utf8.datとする)する。


```
find . -name '*.dat' -exec sh -c 'iconv -f sjis -t utf8 {} > {}.utf8.dat ' \;
```

WindowsのMicrosoft Excelからエクスポートしたcsvファイルなら、sjisをcp932に置換すればよい。
RuboCop | Style/SingleLineBlockParams

# RuboCop | Style/SingleLineBlockParams

## 概要

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

reduce, injectなど1行でブロック呼び出しした場合の変数名の命名規則をチェックする。
デフォルトでは *reduce* ( *inject* ) のみ定義されていて、変数名は ( *a* , *e* ) に設定されている。

## SingleLineBlockParams

### 設定値一覧

|設定対象|対象|内容|デフォルト|
|:-----|:--|:---|:---:|
|Methods|reduce|reduceメソッドを1行で書いた場合の引き数名|a, e|
|Methods|inject|injectメソッドを1行で書いた場合の引き数名|a, e|

### 検証プログラム

~~~ruby:signal_exception.rb
print [*1..5].reduce { |a, e|a += e; a }
print [*1..5].inject { |a, e|a += e; a }
print [*1..5].reduce { |a, v|a += v; a }
print [*1..5].inject { |sum, e|sum += e; sum }
print [*1..5].map { |e|e * 2 }
~~~

### 実行結果 デフォルト の場合

※CollectionMethods/Semicolon/EndOfLine/EachWithObjectは
サンプルの都合上、余計な警告が出ないようにするための設定です。

~~~yaml:.rubocop.yml
SingleLineBlockParams:
  Methods:
    - reduce:
        - a
        - e
    - inject:
        - a
        - e

CollectionMethods:
  Enabled: false

Semicolon:
  Enabled: false

EndOfLine:
  Enabled: false

EachWithObject:
  Enabled: false
~~~

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

Offenses:

semicolon.rb:1:13: C: Do not use semicolons to terminate expressions.
msg = 'hoge'; print msg
            ^

1 file inspected, 1 offense detected
~~~

### 実行結果 mapに関する設定も追加します

※CollectionMethods/Semicolon/EndOfLine/EachWithObjectは
サンプルの都合上、余計な警告が出ないようにするための設定です。

~~~yaml:.rubocop.yml
SingleLineBlockParams:
  Methods:
    - reduce:
        - a
        - e
    - inject:
        - a
        - e
    - map:
        - rubocop_saiko

CollectionMethods:
  Enabled: false

Semicolon:
  Enabled: false

EndOfLine:
  Enabled: false

EachWithObject:
  Enabled: false
~~~

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

Offenses:

single_line_block_params.rb:3:24: C: Name reduce block params |a, e|.
print [*1..5].reduce { |a, v|a += v; a }
                       ^^^^^^
single_line_block_params.rb:4:24: C: Name inject block params |a, e|.
print [*1..5].inject { |sum, e|sum += e; sum }
                       ^^^^^^^^
single_line_block_params.rb:5:21: C: Name map block params |rubocop_saiko|.
print [*1..5].map { |e|e * 2 }
                    ^^^

1 file inspected, 3 offenses detected
~~~

## RuboCopまとめ記事

http://qiita.com/tbpgr/items/edbfecb6a6789dd54f47
GoのSliceもヤバイ

先日[SwiftのArrayがヤバイ](http://qiita.com/koher/items/6f54eafac59793e7c364)という投稿を書きましたが（ただし、[SwiftのArrayはすばらしく生まれかわりました](http://qiita.com/koher/items/47f444200d4e02b6414e)）、実はGoのSliceでもまったく同じことが起きます。

GoのSliceのヤバイ挙動
-------------------

次のコードは[SwiftのArrayがヤバイ](http://qiita.com/koher/items/6f54eafac59793e7c364)で取り上げたコードをGoに書き換えたものです。結果はSwiftのときと同じです。

```go
a := []int{11, 22, 33} // a == [11 22 33]

b := a     // b == [11 22 33]
a[0] = 777 // b[0]も777になる

a = append(a, 44)
a[0] = 888 // b[0]は888にならない
```

appendの結果をaに再代入してるから、そこでSliceの実体が変わってしまってるんだろうと思うかもしれません。しかし、少しだけ変更した次のコードでは、aに再代入しているにも関わらずaとbで実体が共有されています。そして、もう一度appendすると今度は実体が共有されなくなります。

```go
a := make([]int, 3, 4)
a[0], a[1], a[2] = 11, 22, 33 // a == [11 22 33]

b := a     // b == [11 22 33]
a[0] = 777 // b[0]も777になる

a = append(a, 44)
a[0] = 888 // b[0]も888になる（←ここが変わった）

a = append(a, 55)
a[0] = 999 // b[0]は999にならない
```

さらに、GoのSliceでは次のようなおもしろいことも起こります。

```go
a := make([]int, 1, 2)

b := a           // a == [0],   b == [0]
a = append(a, 1) // a == [0 1], b == [0]
b = append(b, 2) // a == [0 2], b == [0 2]（←bにappendするとaの要素が（追加ではなく）変更される）
```

上記のコードでは、最後の行でbにappendしているのにaの要素が変更されています。このコードも少し変更すると次のように結果が変わります（最後の行のaが変わっています）。

```go
a := make([]int, 1)

b := a           // a == [0],   b == [0]
a = append(a, 1) // a == [0 1], b == [0]
b = append(b, 2) // a == [0 1], b == [0 2]（←ここが変わった）
```

雑感
----

このような現象が起こるのは、GoのSliceが値型だけど配列への参照を内部に持っており、append時に必要に応じて参照先を作りなおすからです<sub>\[<a href="#1" name="-1">\*1</a>\]</sub>。GoのSliceは可変長配列としても使われますが、どちらかと言うと名前のとおり配列をスライスしたものとの意味合いが強いのではないかと思います。配列のスライスが基本で、appendは付加的に用意されていると考えるのであれば、本投稿のタイトルはミスリードかもしれません。

ただ、個人的には、あるものを正しく使うのにその実装まで理解していなければならないというのは好みではありません。GoのSliceを使うには、[Sliceや関連する関数の実装](http://blog.golang.org/slices)を（↑の挙動を当然と思えるくらいに）正しく理解していないと痛い目にあいそうです。Goのような低級言語では、利用者が実装まで知っていなければならないのもある程度仕方ないことかもしれませんが。

おまけ
-----

ちなみに、Sliceの参照（ポインタ）をとれば次のような結果になります。これは、可変長配列が参照型である多くの言語と同様の挙動でわかりやすいかと思います。

```go
a := &[]int{0}
	
b := a             // a == &[0],     b == &[0]
*a = append(*a, 1) // a == &[0 1],   b == &[0 1]
*b = append(*b, 2) // a == &[0 1 2], b == &[0 1 2]
```

おまけ2
------

同じことをSwiftでやると、capacityを2になるように確保しても次のようになります。

```swift
a = [0]
a.reserveCapacity(2)

b = a       // a == [0],    b == [0]
a.append(1) // a == [0, 1], b == [0]
b.append(2) // a == [0, 1], b == [0, 2]
```

これは、[SwiftのArrayが値として振る舞う](http://qiita.com/koher/items/47f444200d4e02b6414e)からです。

-----------------------------------------------------

\[<a href="#-1" name="1">\*1</a>\] 値型や参照型というのはGoの用語ではないですが、[SwiftのArrayがヤバイ](http://qiita.com/koher/items/6f54eafac59793e7c364)からの話の流れで、プログラミング言語一般の話としてそのように呼んでいます。
一覧で検索するならListではなくHashSetにしましょう

Javaで一覧に検索(contains)をかけるならListではなくSet使うのですが、
きっとC#も同じだよなーと思い計ってみました。

10万の文字列から重複チェックをしながら新しい一覧を作るのにかかった時間です。

| メソッド | 1回目 | 2回目 | 3回目 |
|:-----------|------------:|------------:|------------:|
| HashSet#Contains | 37ms | 29ms | 22ms |
| List#Contains | 80767ms | 83324ms | 88343ms |
| List#BinarySearch | 267ms | 321ms | 437ms |

結論：
順番を気にしない一覧ならListではなくHashSetを使いましょう。
どうしてもListならBinarySearchにしましょう。
100件くらいなら差はないんでしょうけど。

```csharp:contains.cs
static void Main(string[] args)
{
    Random random = new Random();

    // テストデータ
    List<string> sample = new List<string>();
    for (int i = 0; i < 100000; i++)
    {
        string randomString = Convert.ToBase64String(BitConverter.GetBytes(random.Next()));
        sample.Add(randomString);
    }

    Stopwatch stopwatch;
    Console.WriteLine("===BEGIN===");

    // HashSet#Contains
    stopwatch = Stopwatch.StartNew();
    HashSet<string> set = new HashSet<string>();
    foreach (string str in sample)
        if (!set.Contains(str))
            set.Add(str);
    stopwatch.Stop();
    Console.Write("HashSet#Contains: ");
    Console.WriteLine(stopwatch.ElapsedMilliseconds);

    // List#Contains
    stopwatch = Stopwatch.StartNew();
    List<string> list = new List<string>();
    foreach (string str in sample)
        if (!list.Contains(str))
            list.Add(str);
    stopwatch.Stop();
    Console.Write("List#Contains: ");
    Console.WriteLine(stopwatch.ElapsedMilliseconds);

    // List#BinarySearch
    stopwatch = Stopwatch.StartNew();
    List<string> blist = new List<string>();
    foreach (string str in sample)
        if (blist.BinarySearch(str) < 0)
            blist.Add(str);
    Console.Write("List#BinarySearch: ");
    Console.WriteLine(stopwatch.ElapsedMilliseconds);

    Console.WriteLine("=== END ===");
    Console.Read();

}
```
Vagrant: VMWare Fusionのイメージを.vagrantに作りたくない


環境変数 `VAGRANT_VMWARE_CLONE_DIRECTORY` でVagrantのイメージをどこに作るか指定できる。

```
export VAGRANT_VMWARE_CLONE_DIRECTORY=~/vagrant-vmware-images
```

こうすることで、プロジェクトの .vagrant ディレクトリにイメージが作られなくなり、次のようないいことがある。

* Dockerfileが.vagrantと同じディレクトリにある場合、docker buildが早くなる(.vagrantディレクトリの数GBをコンテキストにアップしないで良くなるため)
* ソースコードをDropboxに入れている場合は、容量節約と同期処理が早くなる

ちなみに、環境変数ではなく、Vagrantfileに書く方法もある

```rb:Vagrantfile
  config.vm.provider "vmware_desktop" do |v|
    v.clone_directory = '~/vagrant-vmware-images'
  end
```

## バージョン情報

vagrant 2.2.4

## 参考

* [Configuration- VMware Provider - Vagrant by HashiCorp](https://www.vagrantup.com/docs/vmware/configuration.html)
Net::HTTP で、「end of file reached (EOFError)」というエラーが出た



自分の場合は、`use_ssl=true`をしたらうまく行った。

```ruby:sample.rb
parsed_url = URI.parse(url)
http = Net::HTTP.new(parsed_url.host, parsed_url.port)
http.use_ssl = true
```


# 参考

http://stackoverflow.com/questions/5244887/eoferror-end-of-file-reached-issue-with-nethttp
gitinspectorを使ってみた

#インストール
公式サイト　https://code.google.com/p/gitinspector/　よりダウンロードして、unzip。
gitとPython2.6以上が必要、CentOS 6.xならyumで多分大丈夫。

#使い方
gitinspector.py [オプション] [gitレポジトリのパス]

分析結果が標準出力されるので、ファイルに保存したい場合はリダイレクトを使う。

`gitinspector.py -f java,conf,css,html,js,properties,sh,vm,xml -F htmlembedded -THmrl /home/mriit/ITRM > /var/www/html/inspector_simple.html`

-fで解析したいファイルの拡張子をカンマ区切りで指定、-Fで出力形式を指定、デフォルトはテキスト形式。html形式はjQueryなどを外部から参照している、htmlembeddedはそれらを埋め込んだもの。公式に各種のサンプルがあり、以下はその一部。

![inspector_sample.png](https://qiita-image-store.s3.amazonaws.com/0/9880/0adee192-f5bd-8d6e-b047-069e6175aa34.png)

authorごとに、コミット数、追加行数、削除行数、変更の割合や、月ごと（-Wで週ごと）の変更行数などが表示される。


#よくわからない事故が・・・
そのまま使ったら、「git blameに eオプションはない」というエラーが出た。git 1.7.1にはblameに-eがないことは確認。
blame.pyにその記述があるので、そこをいじることにした。

##「-e」削るだけではだめなようだ
色々試したところ、-nが正解っぽいようなので、該当箇所を下記のようにする
```lang:blame.py
blame_string = "git blame -n -w {0} ".format("-C -C -M" if hard else "") + \
```


そしたら、authorの名前取得がうまくいかなくなった模様…
下記のメソッドでgit blame で出力されたものからemailをとって、それをもとにauthorの名前をとるようにしている？
```lang:blame.py
@staticmethod
        def get_author_email(string):
                author_email = re.search(" \((.*?)\d\d\d\d-\d\d-\d\d", string)
                return author_email.group(1).strip().lstrip("<").rstrip(">")
```

```lang:changes.py
def get_latest_author_by_email(self, name):
               return self.authors_by_email[name]
```

自分の環境でgit blameをしたら、authorの名前が出ているので、そんなことをしない方がうまくいくのでは思い、上記のメソッドを、もらったnameをそのまま返すように変更したら動くようになった。もっと適切な解決があると思うが、とりあえずはこれで。

#まとめ
やけくそ感満載だけど、とりあえずリポジトリからの情報が得られたので良しとする。gitの方にも問題があったかも。gitで開発する際は、定期的にこれを見てみる。期間が短い場合は、週ごとの表示にした方がよいかも。
jadeとYeoman利用まとめ

# jadeとは

jadeはnodeのテンプレートエンジン。（拡張子.jadeです）
htmlに変換します。

下の左側がjadeです。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/8b5ecb75-a4da-7ec5-3a63-b21e03e2504a.png)
http://jade-lang.com/ 
https://github.com/visionmedia/jade#readme
(本家)

面倒な閉じタグ書く必要がなくなります。
Emmet使えば閉じタグが面倒なことはないのですが。


#インストールの仕方
黒い画面ひらいて、

```
npm install -g jade
jade --version
```

を入力します。
jadeのバージョンがでてきたら、インストール完了です。

#jadeでコードをかく

・ネストはインデントで示すので、閉じタグ書く必要はありません。
・デフォルトのタグはdivです。（idとclassをそのまま書くとdivになります。）
・日本語だからといってクオートで囲まなくていいです。
・CSSのように、idは#、classは、.で書けます。

##変数が使える

### 変数を宣言：

```
・変数名 ＝ 値
・-var 変数名 = 値
```

### 変数の展開：

```
・タグのあとに＝
・#{変数名}
```

### jade：

```
hoge = '今日の天気は晴れだ。'
- var hoge2 = '眠い。'

p= hoge
p 15時になると #{hoge2}
```

↓

### html

```
<p>今日の天気は晴れだ。</p>
<p>15時になると 眠い。</p>
```

になります。ふむ。

ついでに、yeomanで自動でコンパイルするようにしてみようと思います。

# Yeomanでビルドしてみる

jade ⇒　html

Yeomanの中にgruntが入っていて、gruntでファイルの変更を監視してくれるかつ、編集したファイルを自動でコンパイルしてくれます。

## Yeomanインストール

Yeomanには、`yo` `grunt` `bower`が入っています。

yo ひな形作成ツール
grunt-cli ビルドツール
bower ライブラリ管理ツール

一式インストールしてみましょう。

Node.js command prompt開く。
yeoman(yoとgruntとbower)一式をインストール。

```
npm install -g yo grunt-cli bower
```

インストールされているか確認

```
yo --version
```

バージョンが表示されればOKです。

## ひな形を使ってみる

ひな形 ＝　generator とYeomanではいいます。

ひな形形作成もできますが、今回はデフォルトで使えるジェネレータの一つ、webappを使ってみます。
（ generator-webapp : https://github.com/yeoman/generator-webapp ）

※デフォルトで使えるジェネレータのリスト
http://yeoman.io/generators/official.html

```
npm install -g generator-webapp
```

インストールしたら、利用したいディレクトリまで行って、

```
cd (ディレクトリ名)
yo webapp
```

をすると、ヨ―マンおじさんが出てくるはず。

`grunt`とタイプすれば、自動的にコンパイルしてくれるようになります。
（閉じないでくださいね。）


## 関連
<div class="intro-article-wrapper" style="width: 100%; overflow: auto;"><a class="intro-article-img" href="http://qiita.com/rico/items/9ab8aa110e757a13ef37" target="_blank" style="float:left;" rel="nofollow"><img src="http://capture.heartrails.com/150x130/shadow?http://qiita.com/rico/items/9ab8aa110e757a13ef37" align="left" width="150" height="130" alt="ビルドとコンパイルの違い - Qiita"></a><a class="intro-article-title" href="http://qiita.com/rico/items/9ab8aa110e757a13ef37" target="_blank" style="font-size:110%;" rel="nofollow">ビルドとコンパイルの違い - Qiita</a> <img src="http://b.hatena.ne.jp/entry/image/http://qiita.com/rico/items/9ab8aa110e757a13ef37" style="opacity:0.8;"><span style="clear: both;"></span></div>
<div class="intro-article-wrapper" style="width: 100%; overflow: auto;"><a class="intro-article-img" href="http://qiita.com/rico/items/96cd725a6db80bc86f78" target="_blank" style="float:left;" rel="nofollow"><img src="http://capture.heartrails.com/150x130/shadow?http://qiita.com/rico/items/96cd725a6db80bc86f78" align="left" width="150" height="130" alt="bower - 新卒フロントエンジニアが知っておくべき言葉 - Qiita"></a><a class="intro-article-title" href="http://qiita.com/rico/items/96cd725a6db80bc86f78" target="_blank" style="font-size:110%;" rel="nofollow">bower - 新卒フロントエンジニアが知っておくべき言葉 - Qiita</a> <img src="http://b.hatena.ne.jp/entry/image/http://qiita.com/rico/items/96cd725a6db80bc86f78" style="opacity:0.8;"><span style="clear: both;"></span></div>
AndroidのWebViewでgeoloactionを使用する


###位置情報取得用のパーミッションを追加
```xml
 <!-- 位置情報取得 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
```

###WebViewClient,WebChromeClientの設定
```java
import android.webkit.GeolocationPermissions.Callback;

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setConsentView(R.layout.main);
    webView = (WebView)findViewById(R.id.webView);
    webView.setWebViewClient(new WebViewClient(){
        @Override
        public boolean shouldOverrideUrLoading(WebView view, String url){
            return false;
        }
    });
    webView.setWebChromeClient(new WebChromeClient(){
        @Override
        public void onGeolocationPermissionsShowPrompt(String origin, Callback callback){
            callback.invoke(origin, true, false);
        }
    });
    WebViewSettings settings = webView.getSettings();
    settings.setJavaScriptEnabled(true);
    settings.setGeolocationEnabled(true);

    webView.loadUrl("http://~~~");
}
```
iOSアプリから GoogleAnalytics にスクリーン情報を送信する


GooglaAnalytics は画面遷移状況を取得できる機能を提供しており、
SDKを導入することでアプリから情報を送信することができます。

画面情報を送信する方法は「自動送信」と「マニュアル送信」の2種類があり、それぞれ特徴があります。

# 自動送信
計測したい `ViewController` に `GAITrackedViewController` を継承させ、
`viewDidLoad:` 等でスクリーン名を設定することで、自動で送信することができるようになります。

スクリーン名を設定するだけでよいので、コーディングはラクです。

ただし、`TableViewController` などすでに `ViewController` を継承しているクラスは、`GAITrackedViewController` を継承させることができないため適用できません。

# マニュアル送信
マニュアル送信は、`ViewWillAppear` 等に送信する処理を記述することで手動で情報を送信します。
自動送信より記述量は若干増えます。

すでに `ViewController` を継承しているクラスに対しては、マニュアル送信を実装することになりますが、すべてのクラスに一つ一つ実装するのは現実的ではありません。

そこで Aspects というライブラリを使って、`ViewController` の `viewWillAppear:` にアスペクト指向的に実装する方法を紹介します。

### 1. プロジェクトに「Aspects」と「GoogleAnalyticsSDK」を追加する
リンク先からライブラリをゲットして、プロジェクトに追加します。
両方ともファイルの追加でいけます。

* GoogleAnalyticsSDK
https://developers.google.com/analytics/devguides/collection/ios/resources

* Aspects - GitHub
https://github.com/steipete/Aspects

### 2. Aspects を使って ViewController クラスの ViewWillAppear に送信機能を追加する

`AppDelegate.m` の `application:didFinishLaunchingWithOptions:` あたりに記述します。

```Objective-C:AppDelegate.m
#import "AppDelegate.h"
#import "GAI.h"
#import "GAIFields.h"
#import "GAIDictionaryBuilder.h"
#import "Aspects.h"


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    id tracker = [[GAI sharedInstance] defaultTracker];

    // GoogleAnalytics に送信する処理をブロックで記述します
    void (^setScreenName)(id<AspectInfo>, BOOL) = ^(id<AspectInfo> aspectInfo, BOOL animated) {
        UIViewController * vc = [aspectInfo instance];
        // GoogleAnalytics に情報を送信する処理です
        // クラス名をそのままスクリーン名にしています
        [tracker set:kGAIScreenName value:NSStringFromClass([vc class])];
        [tracker send:[[GAIDictionaryBuilder createAppView] build]];
    };

    // viewWillAppear 実行後に usingBlock を実施するようになります
    [UIViewController aspect_hookSelector:@selector(viewWillAppear:)
                              withOptions:AspectPositionAfter
                               usingBlock:setScreenName
                                    error:nil];

    return YES;
}
```

以上の処理を追加することで、`ViewController` を継承したクラスの `viewWillAppear:` 実行時に GoogleAnalytics へのスクリーン情報送信が実施されるようになります。

## 参考URL
GoogleAnalytics - スクリーン送信
https://developers.google.com/analytics/devguides/collection/ios/v3/screens?hl=ja

Objective-CでAOP (アスペクト指向) ができるライブラリ
http://qiita.com/_mpon/items/a08310fa8b777e740372
Xcode6-beta4での@IBOutletなプロパティの定義方法

Xcode6-beta4では@IBOutletなプロパティについての仕様が変更され、以前の記述のままではnon-optional typeであるというエラーになるようになりました。これはbeta3までは@IBOutletを付けたプロパティは自動的に「weakでimplicitly unwrapped optionalなタイプで初期値はnil」に変換されていたのが、beta4の改定でこの特別扱いがなくなったからのようです。

この自動変換については以前の「Using Swift with Cocoa and Objective-C」に記述がありました(今は改定されてなくなっています)。

> When you declare an outlet in Swift, the compiler automatically converts the type to a weak implicitly unwrapped optional and assigns it an initial value of nil. In effect, the compiler replaces @IBOutlet var name: Type with @IBOutlet weak var name: Type! = nil.

optionalではない型は初期化が必須なはずなのに@IBOutletを付けるとなぜか何も言われなくなるという不思議はこのためだったわけです。

今後どのようにすれば良いのかは改定後の「Using Swift with Cocoa and Objective-C」の「[Working with Outlets and Actions](https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/BuildingCocoaApps/WritingSwiftClassesWithObjective-CBehavior.html)」に記述があります。

> When you declare an outlet in Swift, you should make the type of the outlet an implicitly unwrapped optional.

要は自動で変換されていた時のimplicitly unwrapped optionalにしろというだけのようです。

自動変換では更にweakで初期値がnilだったわけですが、weakについては必要かどうか判断して適宜つけるということなのではないかと思います。Release Notesの「Important Changes, Issues Resolved in Xcode 6 Beta 1 - 3」に以下のようにstrongで上書きできるようにしたという記述があるためstrongにすべき場合があるようです。

> • @IBOutlets may be explicitly marked strong to override their implicitly-weak behavior. (16954464)

#と思ったら

ここまで書いて改めて「[Using Swift with Cocoa and Objective-C](https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/BuildingCocoaApps/WritingSwiftClassesWithObjective-CBehavior.html)」を確認したら元の記述に戻っていました。なぜ……
sshでログインした時、localeまわりでエラーが出た場合の対処法

# 今回のエラー
-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): そのようなファイルやディレクトリはありません
↑　sshでログインした際に、このエラーが出た時の対処法を下記に記載していきます。
 
# 解決法
まず始めに、利用できるlocaleを確認します。


``` 
$locale -a | grep ja_JP
locale: Cannot set LC_CTYPE to default locale: No such file or directory
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
```
 
やはり、警告メッセージが出ていますね。
 
解決するために、LC_CTYPEもja_JP.utf8になるように設定すれば
解決するはず。やってみましょう。
 
解決するために触るファイルは、/etc/sysconfig/i18n
最後尾に以下を追加して再起動かければ、警告メッセージは消えているはずです。

```lang:/etc/sysconfig/i18n
#locale
LC_CTYPE="ja_JP.utf8"

LANG=ja_JP.utf8
LC_CTYPE=ja_JP.utf8
LC_NUMERIC="ja_JP.utf8"
LC_TIME="ja_JP.utf8"
LC_COLLATE="ja_JP.utf8"
LC_MONETARY="ja_JP.utf8"
LC_MESSAGES="ja_JP.utf8"
LC_PAPER="ja_JP.utf8"
LC_NAME="ja_JP.utf8"
LC_ADDRESS="ja_JP.utf8"
LC_TELEPHONE="ja_JP.utf8"
LC_MEASUREMENT="ja_JP.utf8"
LC_IDENTIFICATION="ja_JP.utf8"
```
 
 
 
他にも色々試しましたが、これが一番確実だと思います。
httpd.confでよく使いそうな記述をまとめてみる

#はじめに
* 筆者の備忘録も兼ねているので気がついた時に随時更新・追記予定
* 用途別にコピペで使えるようにまとめていく予定~~（いわゆるカンペ）~~


#記述
##htdocs配下以外の場所に設置したwebディレクトリにエイリアスを張る
###Linux
```conf:httpd.conf
<IfModule alias_module>
    Alias /foovar "/usr/local/foovar/develop/web"
</IfModule>

<Directory "/usr/local/foovar/web">
    AllowOverride All
    Options None
    Require all granted
</Directory>
```

###Windows
7/27 18:01修正,windows環境でのパス記述は / \ どちらでも大丈夫でした。
ご指摘感謝です。

```conf:httpd.conf
<IfModule alias_module>
    Alias /foovar "C:/foovar/develop/web"
</IfModule>

<Directory "C:/foovar/develop/web">
    AllowOverride All
    Options None
    Require all granted
</Directory>
```
git logのエイリアス設定


git logにエイリアスを設定して用途によって使い分ける

```ini:.gitconfig
[alias]
  logp = log -p
  logs = log --stat
  logone = log --pretty=oneline
```

logpで変更をdiff表示  
logsで変更したファイル表示  
logoneでコミットだけ表示
Cent6.5 + MySQL5.6 + PHP5.4(PDO接続)でマルチバイトの文字化けに対応

**以下はvagrant等のローカル検証での利用を想定しています。**
----
以下はPDOの内部で動くlibmysqlclient.soがlaten1として認識している文字コードを、サーバに合わせてutf8に変換するもので、SQLインジェクションの危険が増すよろしくない設定です。

状況
----
データベース/テーブル/MySQL設定ファイルで文字コードを正しく設定していてもPDO接続時のみマルチバイト文字が文字化けします。

```lang:mysql
mysql> show variables like "%character%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
```

```lang:PDO接続時
// PDO接続(PHP 5.3.6以降だとcharsetが使えます
$dsn="mysql:dbname=%s;host=%s;charset=utf8";

/**
略
*/

character_set_client | latin1      <--
character_set_connection | latin1　<--
character_set_database | utf8
character_set_filesystem | binary
character_set_results | latin1     <--
character_set_server | utf8
character_set_system | utf8
character_sets_dir | /usr/share/mysql/charsets/
```

対策
----
対策として、MySQLの設定ファイルに以下を記述します。

```lang:/etc/my.cnf
# [client]を入力するとなぜか起動しなくなる為
# [mysqld]セクションに以下を追記

character-set-server = utf8
skip-character-set-client-handshake
```

参考情報）環境について
----
* CentOS6.5
* MySQLは **MySQL公式yumリポジトリ( http://dev.mysql.com/downloads/repo/ )** から新規にインストール
* php5.4等はyumのremiリポジトリから新規インストール
* pdo_mysqlは1.0.2を使用
ICMPの疎通が無くてもPINGしたい

小ネタではあるのですが、最近はICMPでPINGを打てないこともしばしばですよね。
そういう時はどうすればpingすればいいの？って話に対応したのでメモ

## hpingを使う
hping http://www.hping.org/
本来はパケット生成ツールとして使うのですが、セキュリティ系の人の間ではBacktrackに入っていたりしてるので、そっちで使う事の方が多いツールです。
ファイアウォールのルール検証とかにもとても便利に使えます。

### 使い方
ローカルループバックのTCPポート80番にPING
<code>hping3 -S -p 80 127.0.0.1</code>
ビルドとコンパイルの違い

同じ意味だと思っていました。

##IT用語辞典e-wordsより

### コンパイル

```
人間がプログラミング言語を用いて作成したソフトウェアの設計図(ソースコード)を、コンピュータ上で実行可能な形式(オブジェクトコード)に変換すること。
そのためのソフトウェアをコンパイラという。変換のみを一括して行い、生成したオブジェクトコードの実行は行わない。
```

### ビルド

```
ソースコードのコンパイルやライブラリのリンクなどを行い、最終的な実行可能ファイルを作成すること。
また、そのような作業によって生成されたソフトウェアの版。
```


## 違い

ビルドの中にコンパイルがある。

コンパイル：

コンピュータが実行するのに適した形式に変えて、実行可能なファイルに変換する。

ビルド：

コンパイル+使っているライブラリに関連づける（リンク）


## ビルドツールの例

jadeをhtmlへ変換（コンパイル）だけじゃなくリンクする作業もする⇒ビルド
ビルドができるのが、yeoman
サードパーティアプリのメソッドをhookする。メモ

目的のアプリから以下を参考にヘッダーをダンプします。

http://qiita.com/noppefoxwolf/items/314b3e12a32c8f4c6672
```
$class-dump -H binaryname -o gender
```

LogosTweakによるプロジェクトを作成します。
iOSOpenDevや手動で作って下さい。（割愛）

プロジェクト内の
/Package/Library/MobileSubstrate/DynamicLibraries
に存在するFilterディクショナリ内のBundles配列にhookしたいアプリのBundle Identifierを文字列型で書き込みます。

.xmファイルにhookするクラスとメソッドを書き込み、処理も書きます。
```
%hook classname
- (void)method{
   //your action
    %orig;
}
%end
```
％で始まる行はマクロとして扱われ、例えば%orig;であれば通常通りの動作を実行します。
node-sqlite3でプレースホルダ使用時に実際のSQLを確認する


node-sqlite3でプレースホルダを使用している時に、実際に実行されているSQL文を確認したい。
そんな時は"trace"にコールバックを登録する。


```JavaScript:trace.js
var sqlite = require("sqlite3").verbose();
var db = new sqlite.Database("test.db");

db.on("trace", function(sql) {
  console.log(sql);
});

obj = {
	title: "6月に自主制作を行いました！",
	type: "develop"
};

db.all(
	"SELECT * FROM entries where title=? and type=?",
	[obj.title, obj.type],
	function(error, rows) {
		rows.forEach(function(row){
			console.log("title :" + row.title + ", type:" + row.type);
		});
	}
);

```

実行すると

```
SELECT * FROM entries where title='6月に自主制作を行いました！' and type='develop'
title :6月に自主制作を行いました！, type:develop
```
って出力される。上の方がtraceで出してるSQL
PHP-CGIでのベーシック認証のメモ


PHPでの認証処理の実装でcgiに切り替えたとき、下記の処理を追加するとモジュール版と整合性がとれた。

	RewriteCond %{HTTP:Authorization} ^(.*)
	RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]

	<?php
	//set http auth headers for apache+php-cgi work around
	if (isset($_SERVER['HTTP_AUTHORIZATION']) && preg_match('/Basic\s+(.*)$/i', $_SERVER['HTTP_AUTHORIZATION'], $matches)) {
	    list($name, $password) = explode(':', base64_decode($matches[1]));
	    $_SERVER['PHP_AUTH_USER'] = strip_tags($name);
	    $_SERVER['PHP_AUTH_PW'] = strip_tags($password);
	}

	//set http auth headers for apache+php-cgi work around if variable gets renamed by apache
	if (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION']) && preg_match('/Basic\s+(.*)$/i', $_SERVER['REDIRECT_HTTP_AUTHORIZATION'], $matches)) {
	    list($name, $password) = explode(':', base64_decode($matches[1]));
	    $_SERVER['PHP_AUTH_USER'] = strip_tags($name);
	    $_SERVER['PHP_AUTH_PW'] = strip_tags($password);
	}

※追記

FastCgiConfig、FastCgiExternalServerに設定を追加することでも上記可能。タイムアウトの値なども設定できる。

	-pass-header Authorization
	-idle-timeout 300
Rails&grapeで簡単WebAPI

http://intridea.github.io/grape/docs/index.html
の通りに書くとエラー起こしたので覚書。

grapeの使い方というよりは導入の仕方。詳しくはドキュメントかGithubのREADMEを読んでください。

結局GithubのREADMEで解決した。

#grape
grapeを使うと、簡単にWebAPIを作ることができます。

#インストール

gem install grape

or

Gemfileに
gem 'grape'
を書いて bundle install してください

#本体

公式ページで書かれているものの簡易版

**注意**
**ディレクトリやファイルの名前が違うと、**
**uninitialized constant Piyo (NameError)**
**になります**
autoloadの命名規約に従ってるはず。

```app/api/piyo/api.rb
module Piyo
  class API < Grape::API

    format :json

    resource :api do

      desc "Return piyo."
      get :piyo do
        "piyo" #とりあえずテキトーなものを返す
      end

      desc "twice echo."
      params do
        requires :str, type: String, desc: "twice str"
      end
      get :twice do
        params[:str] * 2
      end

    end
  end
end
```

#Railsへの設定

```config/application.rb
module Test
  class Application < Rails::Aplication

    config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb')
    config.autoload_paths += Dir[Rails.root.join('app', 'api', '*')]

  end
end
```

```config/routes.rb
Rails.application.routes.draw do
  mount Piyo::API => '/'
end
```

#curlから呼んでみる

>curl http://localhost:3000/api/piyo
>piyo

>curl http://localhost:3000/api/twice?str=hello
>hellohello

#参考にしたサイト

>-H Content-Type:application/json -v https://github.com/intridea/grape

>File: README — Documentation by YARD 0.8.3 http://intridea.github.io/grape/docs/index.html
スーパーグローバル変数にfilter_input関数を使うときの注意点

ソースから$_POST/$_GETに値を代入した場合、filter_input関数を使っていると値を取得できないため、filter_var関数を使用する。

```lang:php
<?php

//ここで代入
$_POST['hoge']='piyo';

$fInput=filter_input(INPUT_POST,'hoge');
var_dump($fInput);
// NULL

$fVar=filter_var($_POST['hoge']);
var_dump($fVar);
// string(4) "piyo"
```
Docker: MySQLのクエリーログを確認できるようにしたい


mysqldの `--general-log-file` オプションを `/dev/stdout` に設定してコンテナを起動しておく。

```console
$ sudo docker run -p 3306:3306 -d --name mysql -e MYSQL_ROOT_PASSWORD="mypass" mysql /entrypoint.sh mysqld --datadir=/var/lib/mysql --user=root --general-log=true --general-log-file=/dev/stdout
```

こうすることで、`docker logs -f mysql` で標準出力にてクエリーログを確認できるようになる。


ホストとコンテナでログファイルをVOLUMEで共有しなくていいのがこの方法のいいところ。また、ログファイルを確認するためにコンテナに入る必要もない。Dockerfileやmy.confを書き換えないので、プロダクション用のイメージをそのまま開発環境用に使うこともできる。この起動方法はコマンドが長くなるので、スクリプトはMakefileにしておくといい。


## バージョン情報

* docker: 1.1.1
SSHのknown_hostsをスマートに更新する

今時のバージョンのOpenSSHではknown_hostsがハッシュ化されてて手動管理がしにくいし、スマートに決めたいのでコマンドでやってみる。

# コマンド
結論から書くと↓こんな感じでOK。（`target-hostname`のホストキーが変わった場合の例）


```bash:
host="target-hostname"
ssh-keygen -R $host
ssh-keyscan -H $host >> ~/.ssh/known_hosts
```

- `ssh-keygen -R hostname` は `~/.ssh/known_hosts` から対象ホストのホストキーを削除してくれる。
    - 複数あれば全部消してくれるしハッシュ化されてるのもされてないのも全部消してくれるので便利。
    - known_hostsファイルをエディタで開いてエラーメッセージで指摘された行数まで移動して手で削除するのなんかより100倍楽。
- `ssh-keyscan` は対象ホストのホストキー一覧を取得するコマンド。
    - 無言で実行できるから一旦手動でssh試みてプロンプトでyesとかするより使い勝手が良い。
    - `-H`オプションを付けるとホスト名がハッシュ化される、無しなら昔ながらに生のホスト名で出力される。今時はハッシュ化しとけば良いと思う。
- __注意点！__ 追記する為の `>>` を間違えて `>` て書くと既存のキーが全部消えるので気をつけること！

# ちょっと進化系
`HashKnownHosts yes`な環境だとbash-completionのホスト名補完が効かなくなるので~/.ssh/config内で明示的に`no`にしてる人もいそうな気がする。そういう人はssh-keyscanに勝手にハッシュオプション付けられるのは嫌がるだろうから環境チェックしてからオプションの出し入れするように修正してみた。

https://gist.github.com/kawaz/00dd296ffc86506854ae

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

# ssh設定値の取得関数
sshconf() {
  local key=$1 targethost=$2
  local value inhost f k v m
  [[ -z $key ]] && { echo "Usage: $FUNCNAME key [hostname]"; return 1; }
  for f in ~/.ssh/config /etc/ssh_config; do
    [[ -r $f ]] || continue
    inhost=1
    while read k v; do
      if [[ $k == Host ]]; then
        inhost=
        for m in $v; do
          [[ $m =~ ^# ]] && break # skip comment
          m=${m//./\\.}; m=${m//\*/.*}; m=${m//\?/.}; m="^$m$" # wildcard -> regexp
          if [[ $targethost =~ $m ]]; then
            inhost=1
            break
          fi
        done
        continue
      fi
      [[ -z $inhost ]] && continue # 不一致Host内の設定は無視
      if [[ $k == $key ]]; then
        value=$v
      fi
      if [[ -n $value ]]; then
        break # 最初に見つけた設定優先なのでbreak
      fi
    done < <(cat $f | grep -v '^$' | egrep -v '^\s*#')
    if [[ -n $value ]]; then
      break # 最初のファイル優先なのでbreak
    fi
  done
  [[ -z $value ]] && return 1
  printf "%s\n" "$value"
}

# main
[[ -z $1 ]] && { echo "Usage: $0 hostname [hostname...]"; exit 1; }
hashopt=
if [[ $(sshconf HashKnownHosts) == yes ]]; then
  hashopt=-H
fi
for h in "$@"; do
  ssh-keygen -R "$h"
  ssh-keyscan $hashopt "$h" >> ~/.ssh/known_hosts
done
```

現在の環境上でのsshの設定値を取得するコマンドってありそうでないのね…。お陰で`HashKnownHosts`の値が知りたかっただけなのに長大な関数を書いてしまった(^^;

上記 `sshconf` 関数は結構まじめに書いたつもりなので単に指定のホストに対する設定値を取得するコマンドとして独立していても便利に使えそう。→独立した[sshconf.sh](https://gist.github.com/kawaz/00dd296ffc86506854ae#file-sshconf-sh)ってファイルに分けといた。

# ssh -G があったｗ
`ssh -G ホスト名` でそのホスト名にマッチする最終的な ssh_cofig 値が取れるんじゃん！てことに上の関数を作ってから1年以上経過して気がついた…。
アロー関数で自己再帰@ES6

ECMAScirpt6で導入予定のアロー関数とデフォルト引数を組合せた自己再帰関数。

```js
var fact = ((f=n=>n>1?n*f(n-1):1)=>f)();
fact(5); //== 120
```

引用元
http://d.hatena.ne.jp/teramako/20130321/p1
http://www.mail-archive.com/es-discuss@mozilla.org/msg22135.html
pry 0.10.0にてundefined method `pager`が起きたときの暫定対処


## 事象

0.9.12.6 -> 0.10.0にあげたらエーって言うぐらい怒られた。

```ruby
pry> User.all
undefined method `pager'
```

で、実際にissueもまだopen

[pry/pry 0.10.0 - undefined method `pager' for nil:NilClass #1265](https://github.com/pry/pry/issues/1265)

## 環境

ruby 2.0.0p353
rails 4.1.1
pry-byebug 1.3.3
pry-rails 0.3.2
pry-remote 0.1.8


## 原因

詳しく調べてないおち

## 対応策

とりあえず、pagerが原因なら殺しておく。

```bash
$ vi .pryrc

Pry.config.pager = false

```

<https://github.com/pry/pry/wiki/Customization-and-configuration#pager>



これで動作しました。
AtomでMakefileのときは強制的にタブインデントにしたい



「Atom」→「Open Your Init Script」を開く

```coffee:init.coffee
# Your init script
#
# Atom will evaluate this file each time a new window is opened. It is run
# after packages are loaded/activated and after the previous editor state
# has been restored.
#
# An example hack to make opened Markdown files always be soft wrapped:
#
# path = require 'path'
#
# atom.workspaceView.eachEditorView (editorView) ->
#   editor = editorView.getEditor()
#   if path.extname(editor.getPath()) is '.md'
#     editor.setSoftWrap(true)

path = require 'path'

# Set Makefile[.any extension] and '.mk' files to always use hard tabs
atom.workspaceView.eachEditorView (editorView) ->
  editor = editorView.getEditor()
  if path.basename(editor.getPath()) is 'Makefile'
    editor.setSoftTabs(false)
  if path.extname(editor.getPath()) is '.mk'
    editor.setSoftTabs(false)

```

保存してAtomを再起動する。

なお、すでにMakefileがスペースインデントになっているとこの設定を有効にしても、スペースインデントが引き継がれてしまう。一旦他のエディタでタブインデントにしてから開き直すことで解決する。

Makefileがタブインデントにしてほしいというリクエストは [Automatically use hard tabs for Makefile buffers · Issue #3 · atom/language-make](https://github.com/atom/language-make/issues/3) に上がっているので、そのうちデフォルトで対応されるかもしれない。