OmniAICreator/Qiita-1.07M huggingface dataset:
コマンドプロンプト、Powershell の文字コードを変更する

Windows でコマンドプロンプトを起動すると、日本語環境の場合の文字コードは CP932 (Shift_JIS)になります。
Windows でも Shift_JIS ではなく UTF-8 を使いたいことは多々あります。

そんな時は次のコマンドを実行しましょう。

```ps1
chcp 65001
```

chcp は CHange Code Page の略で、コマンドプロンプトまたは PowerShell のコードページを確認したり変更するコマンドです。

引数なしで実行すると、設定されているコードページを表示します。
引数付きで実行すると、指定されたコードページに変更します。

参考: [Code Page Identifier](http://msdn.microsoft.com/en-us/library/dd317756%28VS.85%29.aspx "Code Page Identifier")
OAuth2


### フグ本

+ MAC認証について
MAC鍵はhmac-sha-1 か hmac-sha256のアルゴリズムで生成されたものでなければいけない
署名が必須なOAuht対応APIへの接続では全てのAPIリクエストのAuthorizationヘッダにMAC署名が含まれていなければいなけない




### webの情報

+ OAuthプロトコルとは  
2つのアプリケーションをマッシュアップさせたい「ユーザ」がリソースを管理するサイト「サービスプロバイダ」が提供する
APIの接続許可証「トークン」をサービスプロバイダを通じて、リソースを利用したサービスを提供する別のサイト「コンシューマ」
へ発行し、IDとパスワードの代わりにトークンを渡してサービスプロバイダ上のリソースへアクセスさせる仕組み

+ 詳細
http://www.atmarkit.co.jp/fsecurity/special/106oauth/oauth02.html



+ 読んでおいたほうが良さ気
http://d.hatena.ne.jp/hsksnote/20110807/1312685462
http://www.atmarkit.co.jp/fsmart/articles/oauth2/01.html
http://d.hatena.ne.jp/shibason/20090809/1249764381


#### OAuth 用語系
+ 保護リソース
    Accessが制限されたリソース、OAuth認証済みリクエストを利用して取得可能

+ リソースサーバ
    保護リソースに対するリクエスト受け付け、レスポンスを返すサーバー

+ クライアント
    認可を取得し、保護リソースにたいするリクエストを行うアプリケーション

+ エンドユーザ
    リソースオーナー

+ トークン
    クライントに対し発行されたアクセス許可を表す文字列。  
    通常はクライアンにとって不透明な値、トークンは特定の範囲とアクセス期間を表し、それらはリソースオーナによって許可されリソースサーバーと認可サーバーによって強制される。トークンは認可情報を取り出すための識別子を意味してもいい。またはそれ自身に検証可能な方法で認可情報を含んでもいい(データと署名を含むトークンなど)トークンはpure capabilitiesでもいい。クライアントがトークンを利用するために特別に追加の認証クレデンシャルを要求してもいい

+ アクセストークン
    クライアントがリソースをー何変わって認証済みリクエストを行うために使われるトークン

+ リフレシュトークン
    クライアントがリソースオーナーの関与なく新しいアクセストークンを得るために使われるトークン

+ 認可コード
    生存期間の短いトークン、エンドユーザによって提供されたアクセス許可を表す。

+ 認可サーバ
    リソースオーナーの認証とリソースオーナーからの認可取得が成功したあと、トークンを発行するサーバー、認可サーバーとリソースサーバーは同じサーバでもいい

+ エンドユーザー認可エンドポイント
    認可サーバーのHTTPエンドポイントで、エンドユーザの認証と認可の取得を行う。

+ トークンエンドポイント
    認可サーバーのHTTPエンドポイントで、トークンの発行と期限切れのトークンリフレッシュを行う。

+ クライアント識別子
    認可サーバーがクライアント自身を識別するために発行される一意な識別子。

### 概要
リソースオーナーの代わりに保護リソースにアクセスする方法を提供する。
クライアントは初めに、リソースオーナーの認可を取得し、アクセスと訓を交換する
クライアントはサーバーにトークンを渡すことでアクセスが可能となる。
フグ本OAuth2について(第六章/第七章)


## ６章
モバイルアプリケーションによるOAuth認証についてのため、まとめない。


## 7章

### OpenID Connect認証
OpenIDを使えば、１つのIDで複数のwebアプリケーションの認証を受けることができる。IDプロバイダに対して、プロファイル情報の保管、アプリケーション側はユーザ認証の代行で認証処理を委ねる
フグ本OAuth2について(第五章)


## ５章

### クライアントクレデンシャルフロー
クライアント自身がデータを所有していて、リソース所有者からのアクセス譲渡が不要な場合に使われるフロー
このフローはOAuht1.0の2-leggedフローと同じような事例に適合するフロー。

### クライアントクレデンシャルフローを使いべきケース
リソース所有者がアプリケーションに対して通常OAuthフロー以外の手段で自分のリソースにアクセス権限を与えている場合。

### クライアント認証の方法
「クライアントが認可サーバによって適切に認証できるとこ」「認証クレデンシャルの機密性が守られていること」の２点が重要。クライアントが認証を受けるには、認可サーバにclient_idとclient_secretを送ればいいが、アクセストークン要求時にPOSTパラメータとして送る方法とHTTP Basic認証のAuthenticationヘッダを使って送る方法がある。その他にも 公開鍵/秘密鍵のペアを使う方法やSSL/TLSクライアント認証による方法などもある。

### セキュリティ特性
クライアントクレデンシャルフローでは一組のクライアントクレデンシャルで大量のデータにアクセスできる。一組のクライアントクレデンシャルからアクセスできるデータ量が大きくなるほど、漏洩のリスクは高まる。なので、クライアントの認証用のクレデンシャルは漏洩しないように管理することが重要。

### 認証ステップ
ex.facebookのApp Login機能

#### ステップ１ アプリケーションのクレデンシャルをアクセストークンへ交換
アプリケーションから認可サーバへアクセストークンリクエストを送る。このリクエストにはクライアントクレデンシャルによる認証が必要。
POSTパラメータに必要なもの

+ grant_type
client_credentialsを指定

+ client_id
アプリケーションを登録した時に割り当てたれた値

+ cliet_secret
アプリケーション登録時に割り当てられた値

クライアントクレデンシャルにおる認証が終わると、クライアントにアクセストークンが返される。Facebookでは、access_tokenがURLエンコードされ、レスポンスボディに含まれた形で返される。

#### ステップ２ API呼び出し
クライアントクレデンシャルフローで発行されるOAuthアクセストークンは、その他のフローで発行されるものと同じなので、使用方法も同じ。APIのプロバイダのサポート状況にあわせて、HTTP Authoraizationヘッダ、またはクエリパラメータの値としてアクセストークンを渡す。

### アクセストークンの有効期限
クライアントクレデンシャルでは、有効期限の**長い**アクセストークンが発行される。仕様ではリフレッシュトークンの発行はサポートされていないなので、有効期限が切れた場合は新しくアクセストークンを要求し直す。
フグ本OAuth2について(第四章)


## 4章

### リソース所有者パスワードクレデンシャルフロー
ユーザ名とパスワードをアクセストークン/リフレッシュトークン(オプション)と交換して使う。セキュリティ上このフローは他のOAuthフローとは異なる性質を持つ。大きな違いは、アプリケーションからユーザのパスワードにアクセスできるということ。そのため、このフローではアプリケーションに対する信頼が必要。

### リソース所有者パスワードクレデンシャルフローを使うケース
APIプロバイダが自社でリリースするオフィシャルアプリ内のみで使うことが推奨されている。通常はサードパーティでの使用は認められていない。

### セキュリティ特性
アプリケーションからリソース所有者のパスワードにアクセスはできるが、ユーザ名とパスワードを直接使って(HTTP Basic認証など)API呼び出しを行うよりは、このフローを使ったほうが多少はセキュリティ上優れている。Basicい認証の場合はAPIを呼び出すたびに、アプリケーションが毎回ユーザのパスワードにアクセスする必要があり、１つのアプリケーションのユーザデータがアクセスを取り消したい場合、パスワードを変更して他のすべてのアプリケーションに新しいパスワードを設定しなければならない。
リソース所有者パスワードクレデンシャルフローを使えば、アプリケーションがユーザクレデンシャルにアクセスするのは一度だけで十分で、その１回でアクセストークンに交換されるのでクレデンシャルをアプリケーションないで保存する必要もない。

### ユーザエクスペリエンス
このフローはパスワードを使ったアクセス要求方法と同じ。アプリケーションがユーザ名とパスワードを要求し、ユーザが入力。次にアプリケーションがサーバサイドまたはクライアントサイドでAPIプロバイダの認可サーバに対するリクエストを生成。
フグ本OAuth2について(第三章)


## 3章

### インプリシットグラントフロー
ユーザが認可要求を承認すると、即座にアプリケーションにアクセストークンが返される。

### インプリシットグラントフローを使うべきケース

+ 一時的なアクセスのみ

+ ユーザが日常的にAPIプロバイダにログインしている時

+ OAuthクライアントがブラウザで実行されている時(JSとかFlashとか)

+ ぶらず兄対する信用度が高く、アクセストークンが信頼出来ないユーザやアプリケーションに流出する期限が限定されている時

### インプリシットグラントフローの制限
このフローではリフレッシュトークンは使われない。認可サーバがアクセストークンの期限を短く設定している場合、アプリケーションは都度都度認可フローを実施しなければならない。
プロバイダの中には過去に同じスコープを承認したことがあれば、承認画面を表示しないプロバイダもある。

### セキュリティ特性
アプリケーションが有効期限の長いリフレッシュトークンをサーバに保存することがないので、サーバに侵入されてもリスクが限定的。また、クライアントのアクセストークンを更新するにはAPiプロバイダの認可サーバにてユーザ認証を受ける必要があるので、アクセストークンが流出した際にOAuht実装に応じた有効期限で失効することが保証されている。
ただ、アクセストークンがユーザのwebブラウザに直接送られるので、認可コードフローに比べアカウンタビリティの面で劣る。また、サードパーティのアプリケーションいよって生成されたようみ見えているAPI呼び出しが実際はリソース所有者によって直接生成された可能性もある。

### ユーザエクスペリエンス
ユーザエクスペリエンスはサーバサイドアプリケーションと全く同じ

### アクセス権限の取り消し
インプリシットグラントフローでもサーバサイドwebアプリケーションと同様のフロー
読み込みに失敗した画像に代替画像を読み込ませる

```js
$('img').error(function(){
    $(this).attr('src', 'error.png');
});
```

IE、Safari、Firefoxでは、さらに設定した src が読み込めない場合、再度 error イベントが発生しますが、Chrome では一度しか発生しないです。
Chrome でも毎回イベントを発生させたい場合は setTimeout を使います。

```js
$('img').error(function(){
    setTimeout(function() {
        $(this).attr('src', 'error.png');
    }, 0);
});
```
経緯度と球面メルカトル座標値

簡単なのによく忘れるのでメモ。

# EPSG:3857

```
+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +a=6378137 +b=6378137 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs 
```

であるので…

# メルカトル座標最大値

```js
> 6378137 * Math.PI
20037508.342789244
```

# 経度x°の際の、メルカトルX座標

```js
> var x = 135.0
undefined
> 6378137 * x * Math.PI / 180
15028131.257091932
```

# 緯度y°の際の、メルカトルY座標

```js
> var y = 35
undefined
> 6378137 * Math.log(Math.tan(Math.PI / 360 * (90 + y)))
4163881.144064294
```

# メルカトルY座標最大値を取る緯度

```js
> 360 / Math.PI * Math.atan(Math.exp(Math.PI)) - 90
85.05112877980659
```
末尾にマイクロタイムでサーバーの処理時間が入ってるアクセスログを集計して直近3件分出すワンライナー

```
cat /var/log/httpd/[ログファイル名] | grep "GET [URL]"| perl -anle 'printf "cnt:%7d avg:%.3f\n" , ++$i, ($x += $F[$#F]) / $i / 1000000' | tail -3
```
link_toメソッドでブロック使おうとしたら"undefined method `stringify_keys' for"ってエラーが出る

```rb
link_to 'hoge', fuga_path, class: 'foo' do
  %span.bar
end
```

みたいに書いたら"undefined method `stringify_keys' for"ってエラーが出た

結論としては以下のように書くと解決

```rb
link_to fuga_path, class: 'foo' do
  %span.bar
end
```

http://api.rubyonrails.org/のlink_toのページに

```rb
link_to(name = nil, options = nil, html_options = nil, &block)

link_to(body, url, html_options = {})
  # url is a String; you can use URL helpers like
  # posts_path

link_to(body, url_options = {}, html_options = {})
  # url_options, except :method, is passed to url_for

link_to(options = {}, html_options = {}) do
  # name
end

link_to(url, html_options = {}) do
  # name
end
```

って書いてあって、nameとurlを両方使ってる場合はブロックは取れないっぽい。

> You can use a block as well if your link target is hard to fit into the name parameter.

ってリファレンスに書いてあるし、nameの代用としてブロックを使っているので当然っちゃ当然なのか
MacでUbuntuのインストールUSBディスクを作成する

通常ならCDやDVDにダウンロードしたisoファイルを焼いてインストールすると思うのですが、
もはやDVDドライブがついていないコンピュータが昨今増えてきました。

というわけで、ubuntuのインストールUSBを作成する手順についてまとめたいと思います。

#準備
必要な物を揃えましょう

* USBスティック 2GB程度で十分です
* isoファイル
	* 今回はこちらを使います [Ubuntu Server 12.04LTS](http://www.ubuntu.com/start-download?distro=desktop&bits=64&release=lts)

2015/1/19追記
ubuntu14.04LTSでも動作しました
2016/7/11追記
ubuntu16.04LTSでも動作しました

#インストールUSBを作成する

1. USBスティックをMacに接続する
2. Terminalを開く (/Applications/Utilities/Terminal.app)
3. hdiutilを使って.isoファイルを.imgファイルに変換する
	* `hdiutil convert -format UDRW -o /path/to/save/name.img /path/to/ubuntu.iso` みたいなかんじ
	* 新しいMacでやると、拡張子に.dmgがつくので `mv /path/to/name.img.dmg /path/to/name.img` をする
4. `diskutil list`でUSBディスクのデバイスノードを確認する
	* ここでは `/dev/DiskN`だったとします。Nには本来数字が入るはずです
5. `diskutil unMountDisk /dev/diskN` を実行してUSBディスクをマウント解除する
6. `sudo dd if=/path/to/save/name.img of=/dev/rdiskN bs=1m`をしてUSBスティックにubuntuのインストールディスクを書き込む。しばらく時間がかかる
7. 完了！

【2017/8追記】
なぜ `of=/dev/diskN`　**ではなく**　`of=/dev/rdiskN` なのか気になる方は、
こちらをご覧ください https://www.junk-works.science/disk-and-rdisk/

#エラー集
##error dd: /dev/diskN: Resource busy
USBスティックをマウント解除しているかどうかを確認しましょう

##error dd: Invalid number '1m'
`bs=1m`を`bs=1M`に変更して実行してみましょう
StyledoccoがChromeでiframe部分見えねーよ!という場合の当座の解決法

[Node.js - styledoccoでstylusのスタイルガイド作った結果www - Qiita [キータ]](http://qiita.com/Layzie/items/1ada68c66838573a12e3)

これにも書きましたが、現在Chromeではstyledoccoのiframe部分がエラー吐いて見れなくなってます。

[Preview iframe can't render in Chrome 33 · Issue #111 · jacobrask/styledocco](https://github.com/jacobrask/styledocco/issues/111)

ここで自分も報告したんですが、この時勘違いしていて、npmに上がってるバージョンで既に対策してたのにまだこのバグが出てるんだと思ってましたが、実は対策したバージョンがnpmに上がってないということでした。

で、GitHubのHEADを適用してみるとちゃんとiframeが表示されるので、npmのstyledoccoのバージョンが上がるまでは以下のように`package.json`に書いておくと良いと思います。

```json
"devDependencies": {
  "styledocco": "git://github.com/jacobrask/styledocco.git"
}
```

これで再度`npm install`をするとGitHubのHEADからインストールするようになって、対策済みのstyledoccoが落とされるようになります。

早くnpmの方もバージョン上げてくれれば良いんですけどね…。
データをCSVファイルにexportする

取り急ぎ必要最低限だけだけど。

Bashから実行する場合。

```
db2 export ファイル名 of DEL "SELECT文"
```

`of DEL`は、CSV形式を意味します。
あと、出力文字列内に「,」が入ってる場合は、出力後に崩れてしまうので、列に区切り文字をくっつける。
こんな感じ。

```
db2 export ファイル名 of DEL MODIFIED BY chardel "SELECT文"
```

実行すると、処理ログは標準出力に出てきます。

```
SQL3104N  エクスポート・ユーティリティーが、 ファイル
"/tmp/all_sales.dat"
へのデータのエクスポートを開始しています。

SQL3105N  エクスポート・ユーティリティーが、"128813"
行のエクスポートを完了しました。


エクスポートされた行数:  128813
```

あとは煮るなり焼くなりawkなり。
C#でDLLの作成(Mac)

#### コンパイル ####
DLLを作成
( Mono C#コンパイラを使用 )

``` 
mcs /target:library /out:MathLibrary.DLL Add.cs Mult.cs
```

実行ファイル TestCode.exe を作成

```
mcs /out:TestCode.exe /reference:MathLibrary.DLL TestCode.cs
```

#### コード ####

```csharp:Add.cs
// File: Add.cs 
namespace UtilityMethods
{
    public class AddClass 
    {
        public static long Add(long i, long j) 
        { 
            return (i + j);
        }
    }
}

```

```csharp:Mult.cs
// File: Mult.cs
namespace UtilityMethods 
{
    public class MultiplyClass
    {
        public static long Multiply(long x, long y) 
        {
            return (x * y); 
        }
    }
}
```

```csharp:TestCode.cs
// File: TestCode.cs

using UtilityMethods;

class TestCode
{
    static void Main(string[] args) 
    {
        System.Console.WriteLine("Calling methods from MathLibrary.DLL:");

        if (args.Length != 2)
        {
            System.Console.WriteLine("Usage: TestCode <num1> <num2>");
            return;
        }

        long num1 = long.Parse(args[0]);
        long num2 = long.Parse(args[1]);

        long sum = AddClass.Add(num1, num2);
        long product = MultiplyClass.Multiply(num1, num2);

        System.Console.WriteLine("{0} + {1} = {2}", num1, num2, sum);
        System.Console.WriteLine("{0} * {1} = {2}", num1, num2, product);
    }
}
/* Output (assuming 1234 and 5678 are entered as command line args):
    Calling methods from MathLibrary.DLL:
    1234 + 5678 = 6912
    1234 * 5678 = 7006652        
*/
```

#### 実行コード ####

usingディレクティブを指定することで、コンパイル中に非修飾クラスを使ってDLLメソッドを参照できる.

```csharp:C#
using UtilityMethod;
MultiplyClass.Multiply( num1, num2 );
```

```csharp:C#
UtilityMethod.MultiplyClass.Multiply( num1, num2 );
```
WordPressの環境設定

MANPを使います。

###MANPのインストール
http://www.mamp.info/en/downloads/index.html
インストールして起動する(MANPのほう。PROでなく。)

###WordPressのインストール
http://ja.wordpress.org/
解凍する

Finder➡アプリケーション➡MANP➡htdocsの中に解凍したwordpressコピーして入れる

###データベースを作る
MANPの
サーバを起動
スタートページを開く
Webサイトが開く
phpMyAdmin
データベース

データベースを作成するのところに好きな名前を入れて作成

###WordPressをインストール
localhost:8888/wordpressにアクセス

![スクリーンショット 2014-01-27 10.48.11.png](https://qiita-image-store.s3.amazonaws.com/0/34634/7de9b11c-47cf-c59e-f7aa-22534072c4ac.png)

設定ファイルを作成する

![スクリーンショット 2014-01-27 10.48.26.png](https://qiita-image-store.s3.amazonaws.com/0/34634/46588166-9bca-2fcc-514c-6411c4f44b23.png)

さあ、始めましょう！

![スクリーンショット 2014-01-27 10.51.24.png](https://qiita-image-store.s3.amazonaws.com/0/34634/e11fbae1-fa9c-a865-0f75-bbe718d03453.png)

データベース名は、先作ったもの
ユーザ名パスワードなど控えておく
送信

![スクリーンショット 2014-01-27 10.53.29.png](https://qiita-image-store.s3.amazonaws.com/0/34634/32dc750e-fd5a-56f0-8ce4-63486f3e3a18.png)

インストール実行

![スクリーンショット 2014-01-27 10.54.59.png](https://qiita-image-store.s3.amazonaws.com/0/34634/22846a8b-5dd9-582e-a8ef-53891c3636fd.png)

サイトのタイトルユーザ名パスワードメールアドレスなど入力し控える
WordPressをインストール

![スクリーンショット 2014-01-27 10.58.45.png](https://qiita-image-store.s3.amazonaws.com/0/34634/2f6c48dd-53df-b00a-0f97-9cdddb1e038b.png)

ログイン

![スクリーンショット 2014-01-27 10.59.19.png](https://qiita-image-store.s3.amazonaws.com/0/34634/c9d243b7-13d7-bbb6-36fd-07b95487cbac.png)

ログインする


WordPressの管理画面が開く
サイト名の所をクリックすると、サイト⇔管理画面を行き来することができる。
twitterbootstrapでスマホ対応が正常に反映されないときに最初に確認すること

htmlのheadに、以下のmetaタグが抜けていないかチェック。

```
<meta name="viewport" content="width=device-width, initial-scale=1.0">
```

PC上でブラウザの幅を動かすと正常に表示が切り替わってる場合でもスマホから見ると切り替わってない場合があるので注意！
Pythonメモ（自分用）：配列

配列にデータを入れるときのメソッドがごっちゃになっていたみたいなのでメモしとく。

### List

> ###### .append(data)
dataを最後尾に加える。pushと同じ。


> ###### .insert(index,data)
indexの位置にdataを挿入。
なお、 **indexの値が配列の長さを超えてもエラーにはならず、そのまま最後尾に入れてしまう** みたいなので注意が必要。

###### 例：

```py
hoge = list([1,2,3])

hoge.insert(1,4)    # 1,4,2,3
hoge.insert(5000,5) # 1,4,2,3,5
```

### Set

> ###### .add(data)
dataを加える。 **自動的にソートされた順番になる模様。**

###### 例：

```py
hoge = set([1,2,3])

hoge.add(0)    # 0,1,2,3
hoge.add(4)    # 0,1,2,3,4
```
Block引数の安全な呼び出し方

Objective Cのブロックは非常に強力ですが、nilのブロック呼び出しを行うとEXC_BAD_ACCESSで落ちるという厄介な問題があります。blockにnilを与えること自体が不正に見えるかもしれませんが、Objective Cは言語仕様的にnilを許容するケースが多いので、nilを与えても落ちないように設計するべきだと思います。

チェックの方法にはいくつかのアプローチがあるのでサンプルを書いてみました。詳細はコメントをご覧下さい。

```objc
@interface BTKBlockNilCheck : NSObject

- (void) runBlockSample1 : (void (^)(NSError *error))block;
- (void) runBlockSample2 : (void (^)(NSError *error))block;
- (void) runBlockSample3 : (void (^)(NSError *error))block;
- (void) runBlockSample4 : (void (^)(NSError *error))block;

@end

@implementation BTKBlockNilCheck

- (void) runBlockSample1 : (void (^)(NSError *error))block
{
    // チェックなしで呼び出し。ダメ、絶対。
    block(nil);
}

- (void) runBlockSample2 : (void (^)(NSError *error))block
{
    // 呼び出し前にチェック。
    // シンプルな関数だと見通しが良い
    if(block){
        block(nil);
    }
}

- (void) runBlockSample3 : (void (^)(NSError *error))block
{
    // nilの場合にはdummyで置換
    // 何度でも安全に呼び出せるので、一番オススメ。
    if(!block){
        block = ^(NSError *error){};
    }
    block(nil);
}

- (void) runBlockSample4 : (void (^)(NSError *error))block
{
    // 常に独自のblockで置換
    // 安全なだけでなく、block実行前後に処理を入れることができる
    // 便利だが、常にblockが生成されてしまう。
    block = ^(NSError *error){
        if(block){
            block(error);
        }
    };
    block(nil);
}

@end
```
UbuntuにRails環境をインストールするメモ

### RVM インストール

```
curl -L get.rvm.io | bash -s stable
source ~/.rvm/scripts/rvm
rvm requirements
```

### MySQL インストール

http://ledsun.hatenablog.com/entry/2013/06/26/184850

```
mkdir opt
cd opt
wget http://jaist.dl.sourceforge.net/project/mysql.mirror/MySQL%205.6.15/mysql-5.6.15-debian6.0-x86_64.deb

sudo dpkg -i mysql-5.6.15-debian6.0-x86_64.deb
sudo apt-get upgrade
sudo apt-get install libaio1

sudo groupadd mysql
sudo useradd -r -g mysql mysql
sudo chown -R root:root /opt/mysql
sudo chown -R mysql:mysql /opt/mysql/server-5.6

sudo install -o mysql -g mysql -d /data/mysql
sudo -u mysql /opt/mysql/server-5.6/scripts/mysql_install_db --user=mysql --datadir=/data/mysql

sudo vi /etc/my.cnf
  [mysqld]
  basedir = /opt/mysql/server-5.6
  datadir = /data/mysql


sudo cp /opt/mysql/server-5.6/support-files/mysql.server /etc/init.d/mysql
sudo update-rc.d mysql defaults
sudo /etc/init.d/mysql start

sudo vi /etc/profile.d/mysql.sh
  PATH="/opt/mysql/server-5.6/bin:$PATH"
  MANPATH="/opt/mysql/server-5.6/man:$MANPATH"

sudo chmod 755 /etc/profile.d/mysql.sh

[ログインし直してから]
mysql_secure_installation
```
/etc/mysql/my.cnf がある場合は mv /etc/mysql/my.cnf /etc/mysql.my.conf.bk

### Apache Passenger インストール

```
sudo apt-get update
sudo apt-get install apache2
gem install passenger

sudo apt-get install libcurl4-openssl-dev apache2-threaded-dev libapr1-dev libaprutil1-dev
passenger-install-apache2-module

  Please edit your Apache configuration file, and add these lines:
     LoadModule passenger_module /home/ubuntu/.rvm/gems/ruby-2.1.0/gems/passenger-4.0.35/buildout/apache2/mod_passenger.so
     <IfModule mod_passenger.c>
       PassengerRoot /home/ubuntu/.rvm/gems/ruby-2.1.0/gems/passenger-4.0.35
       PassengerDefaultRuby /home/ubuntu/.rvm/gems/ruby-2.1.0/wrappers/ruby
     </IfModule>

  Deploying a web application: an example

  Suppose you have a web application in /somewhere. Add a virtual host to your
  Apache configuration file and set its DocumentRoot to /somewhere/public:

     <VirtualHost *:80>
        ServerName www.yourhost.com
        # !!! Be sure to point DocumentRoot to 'public'!
        DocumentRoot /somewhere/public
        <Directory /somewhere/public>
           # This relaxes Apache security settings.
           AllowOverride all
           # MultiViews must be turned off.
           Options -MultiViews
           Require all granted
        </Directory>
     </VirtualHost>

  And that's it! You may also want to check the Users Guide for security and
  optimization tips, troubleshooting and other useful information:
```

### Git インストール

```
sudo apt-get install git
```

### Java インストール

```
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java7-installer

sudo update-alternatives --config java
```

### Jenkins インストール

http://d.hatena.ne.jp/komiyak/20130713/1373703426

```
wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins
```
Goでmultipart/form-dataをparseする

FormFile を使えばおｋ。

```go
func handler(w http.ResponseWriter, r *http.Request) {
	file, reader, err := r.FormFile("パラメータ名")
	...
}
```
file にmultipart.File型でopenされたものが入ります。こいつから読み込んでやればOK
詳細は以下当たりを参照

* http://golang.org/src/pkg/net/http/request.go?s=23786:23871#L820


## 例
例として、wavファイル受け取ってparseするコード書いた。wavの読み込みに使うライブラリは予めインストールしておく。

```bash
$ go get github.com/mjibson/go-dsp/wav
```

```go:audioHandler.go
package main

import (
	"encoding/json"
	"net/http"
	"github.com/mjibson/go-dsp/wav"
)

type AudioInfo struct {
	Filename string
	SampleRate int
	NumChannels int
	Duration float64
}

func audiohandler(w http.ResponseWriter, r *http.Request) {
	file, reader, err := r.FormFile("audio")
	if err != nil {
		http.Error(w, err.Error(), http.StatusBadRequest)
		return
	}
	defer file.Close()
	
	wav, werr := wav.ReadWav(file)
	if werr != nil {
		http.Error(w, werr.Error(), http.StatusInternalServerError)
		return
	}

	audio := AudioInfo{
		reader.Filename, 
		int(wav.SampleRate), 
		int(wav.NumChannels),
		float64(len(wav.Data[0]))/float64(wav.SampleRate)}

	js, jerr := json.Marshal(audio)
	if jerr != nil {
		http.Error(w, jerr.Error(), http.StatusInternalServerError)
		return		
	}

	w.Header().Set("Content-Type", "application/json")
	w.Write(js)
}

func main() {
	http.HandleFunc("/file", audiohandler)
	http.ListenAndServe(":9999", nil)
}
```

## 試す

### Server

```bash
$ go run audioHandler.go
```

### Client

```bash
$ curl -i -X POST -F 'audio=@/path/to/file.wav' localhost:9999/file
```

### 結果

```
HTTP/1.1 100 Continue

HTTP/1.1 200 OK
Content-Type: application/json
Date: Sun, 26 Jan 2014 15:21:20 GMT
Content-Length: 79

{"Filename":"ファイル名.wav","SampleRate":44100,"NumChannels":2,"Duration":29.0765} 
```

簡単ですね。C++捨ててGoerになる
青空文庫のルビを消しUTF-8にする

#はじめに
大量の文章が置いてある青空文庫は色々と遊べて楽しいのですが、サイトから直接手に入るテキストはutf-8ではなくまた《》でルビが振ってあるためすこし使いづらいです。
なのでルビを消しutf-8に変化するスクリプトを作りました。

#スクリプト

```aozoraEncoder.sh
#!/bin/sh
nkf -w -Lu $1 > m.txt
cat m.txt | ruby -e 'puts ARGF.read.gsub(/｜/, "").gsub(/《.+?》/,"").gsub(/［.+?］/,"")'
rm -f m.txt
```

作成後以下を実行してください。

```Terminal
chmod u+x aozoraEncoder.sh
```

#使い方

```Terminal
aozoraEncoder.sh input.txt > output.txt
```
pukiwiki-1.4.7はPHP5.4だと動作しないっぽい

とりあえず以後ハマらないようにメモ。

# 原因
* [http://pukiwiki.sourceforge.jp/dev/?BugTrack2%2F349#bab61500](http://pukiwiki.sourceforge.jp/dev/?BugTrack2%2F349#bab61500)

# 対策
* PHPのバージョンを5.3系に変更（これでFrontPageの表示はできた）
QboxというエンジニアのためのiPhoneアプリを作りました


## Qboxとは
エンジニアのための技術情報共有サービス「Qiita」のクライアントアプリです。
無料なのでダウンロードしてレビューとかコメント頂けると嬉しいです。
新着人気エントリーや週間注目エントリーをチェックして今日からキャッチアップしていきましょう!
[Qbox紹介ページ](http://tamazawa.net/apps/qbox.html)
[Qboxダウンロード](https://itunes.apple.com/ja/app/qbox-for-qiita/id806700843?l=ja&ls=1&mt=8)

![AppIcon76x76.png](https://qiita-image-store.s3.amazonaws.com/0/1901/72ef893b-db47-a0a4-a1e6-070488a59dcc.png "AppIcon76x76.png")

※事前にQiitaから許可を得た上で開発,公開しております。

## なんで作ろうと思ったか

+ プライベートでアプリ公開したことが無かった([一度失敗](http://php6.tumblr.com/post/47699941366))

iOS Developer Programはもうすぐ３年目になる。

+ iOSアプリ界隈仲間入りのきっかけ作りにと

情報交換したいなーとか

+ アウトプット大事

口じゃなくて手を動かしていこうと。

+ Qiitaが大好き (Kobitoもね)

## 爆速開発するのに使ったサービス一覧

+ [pttrns](http://pttrns.com/)

良いUIを持ったアプリがたくさん紹介されていて参考になります。

+ [CocoaPods](http://cocoapods.org/) 

ライブラリ管理やってくれる
※これがないと生きていけない

+ [CocoaControls](https://www.cocoacontrols.com/) 

ライブラリ色々紹介されてる
※良いと思ったライブラリは必ずFavorite

+ [Parse.com](http://parse.com) 

100万プッシュ/月まで無料というのはありがたいです。

+ [App Icon Template](http://appicontemplate.com/ios7#)

デザイナーじゃない人とってはかなり嬉しいテンプレートです。

+ [Photoshop CC 30日体験版](http://www.adobe.com/jp/products/photoshop.html) 

１個前で紹介したAppIconTemplateはPSDなので、これがないと開けません。
無料でPSD編集が可能なソフトがあったら教えて欲しい！

+ [StackOverFlow](http://stackoverflow.com/) 

アプリ開発で起きた問題は、殆どの場合誰かが質問して解決済みだったりします。
解決につながった質問は必ずスター付けてます

+ [Crittercism](https://crittercism.com/)

クラッシュレポートのために

+ [さくらレンタルサーバー](http://www.sakura.ne.jp/)

手軽にCRONやDBが使えるので、今回契約しました。


+ [Google Analytics](https://www.google.com/analytics/)

どの画面が見られてるとか知ることで仮説の材料になる。

+ [JekyllBootstrap](http://jekyllbootstrap.com)

アプリと直接関係ないですが、アプリ紹介ページを作るのに使ってみました。
Markdownでどんどんページが作れちゃうのは手軽で良かったです。

+ [BitBucket](https://bitbucket.org)

無料で非公開リポジトリが作れるので愛用しています。
最初はGithubのMicroプラン($7/月)にしてましたが、
ランニングコストを抑えたかったのですぐダウングレードしました。

## 時間がない中、意識した5つのこと
#### 1.ふと思ったことはすぐメモ。そして忘れる。
```
仕事が忙しいので週末しか作業できません。
覚えていられないのでメモ帳に殴り書きしておいて、
週末見返して一気にやりました。
```
#### 2.綺麗なプログラムを書こうと思わない
```
まずは出すこと優先で。
```
#### 3.作り始めたからには必ず公開する気持ち
```
iPhoneアプリは審査があって、アプリを申請してから審査に入る間で１週間ほど掛かるので意外と時間がかかります。
このアプリも開発自体は丸２日掛からないくらいでしたが、一度リジェクトにあってしまい、時間が取れないこともあり、公開に１ヶ月弱掛かってしまいました。
正直、リジェクトされるとやる気失います。
でも、そこを乗り越えなきゃアプリは出せません。
```
#### 4.良いと思ったことは何でもする (個人アプリだし)
```
良いと思ったことは実験で色々やっていきたいし、やるべきだと思います。
個人だからこそやりやすい！
それが仕事でも生かせれば一石二鳥！
```
#### 5.開発を楽しむ
```
不思議ですが、Qboxを作ってる時が楽しくてリフレッシュできました。
```
XCTestの中でNSBundleにアクセスする


```objectivec:SampleTest.m
- (void)testExample
{
	XCTAssertNil([[NSBundle mainBundle] pathForResource:@"hoge" ofType:@"txt"],); // ない
	XCTAssert([[NSBundle bundleForClass:[self class]] pathForResource:@"hoge" ofType:@"txt"],); // ある
}
```
JavaEE (JPA javax.persistence-api ) で hibernate 接続

メモ

# 設定ファイル

```xml:src/java/resources/META-INF/persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<p:persistence
	version="2.0"
	xmlns:p="http://java.sun.com/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd ">

	<p:persistence-unit
		name="persistenceUnit"
		transaction-type="JTA">
		
		<p:description>MySQL:app01</p:description>
		
		<p:provider>org.hibernate.ejb.HibernatePersistence</p:provider>
		<p:exclude-unlisted-classes>false</p:exclude-unlisted-classes>
		<p:shared-cache-mode>ALL</p:shared-cache-mode>
		<p:validation-mode>AUTO</p:validation-mode>

		<p:properties>
			<p:property
				name="hibernate.dialect"
				value="org.hibernate.dialect.MySQLDialect" />
			<p:property
				name="hibernate.connection.url"
				value="jdbc:mysql://localhost/app01" />
			<p:property
				name="hibernate.connection.driver_class"
				value="com.mysql.jdbc.Driver" />
			<p:property
				name="hibernate.connection.password"
				value="app01" />
			<p:property
				name="hibernate.connection.username"
				value="app01" />
			<p:property
				name="hibernate.connection.pool_size"
				value="10" />

			<p:property
				name="hibernate.transaction.factory_class"
				value="org.hibernate.transaction.JDBCTransactionFactory" />
		</p:properties>
	</p:persistence-unit>

</p:persistence>
```

# EntityManager 作成

```java:ConnectionUtil.java
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

final class ConnectionUtil {

	protected final EntityManager manager;

	public ConnectionUtil() {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("persistenceUnit");

		manager = factory.createEntityManager();

	}

	public void init() {
		manager.getTransaction().begin();
	}

	public void commit() {
		commit(true);
	}

	public void commit(boolean close) {
		manager.getTransaction().commit();
		if (close)
			manager.close();
	}

	public void roleback() {
		roleback(true);
	}

	public void roleback(boolean close) {
		manager.getTransaction().rollback();
		if (close)
			manager.close();
	}

}
```

# テスト

```java:ConnectionUtilTest.java

import org.junit.Test;

public class ConnectionUtilTest {

	@Test
	public void testConnectionUtil1() {

		ConnectionUtil util = new ConnectionUtil();

		util.init();
		util.commit();
	}

	@Test
	public void testConnectionUtil2() {

		ConnectionUtil util = new ConnectionUtil();

		util.init();
		util.roleback();
	}

}
```
# pom.xml

```xml
<dependencies>
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.1.29</version>
	</dependency>
	<dependency>
		<groupId>org.hibernate</groupId>
		<artifactId>hibernate-entitymanager</artifactId>
		<version>4.3.1.Final</version>
	</dependency>
</dependencies>
```
論文のための句読点変換スクリプト


```sh:paper
#!/usr/local/bin/zsh
find . -name '*.tex' -print0 | xargs -0 sed -i '' -e 's/、/，/g'
find . -name '*.tex' -print0 | xargs -0 sed -i '' -e 's/。/．/g'
```

そして

```zsh
chmod +x paper
sudo mv paper /usr/local/bin
```

これでどこでも

```zsh
paper
```

とコマンドを打てば句読点が論文用になります！
BareリポジトリをGitHubやBitBucketに移す方法

前に[Git Repository on Cloud Storage Services](http://qiita.com/Go-zen-chu/items/1a624cab8426b9bc6ebc)という投稿をしたのですが、今回はDropboxなどに作成したBareリポジトリをGitHubやBitbucketのようなGit Hosting Serviceに移行する方法を書きたいと思います。
その前に、Gitリポジトリの管理方法によって、使い方や公開度が変わってくるので、個人的にどう使い分けているかを書きます。

* [公開度 public] GitHub, 誰に見られてもよいコードをアップしています。
* [公開度 internal] Bitbucket, そのうち公開予定であったり、研究で書いているプログラムをアップしてます。
* [公開度 private] DropboxやGoogle Drive, 誰にも見せる予定のないプログラムや書きかけの記事などを保存しています。

「Bitbucketならprivateリポジトリを作れるし、別に全部 Bitbucketでよくない？」という考えもあると思いますが、僕の意見としては、Bitbucketもそのうち制限をかけるかもしれませんし、Dropboxならチームでの共有も無料で行えるなどの利点があると考えているため、複数の公開度で使い分けています。

前置きが長くなりましたが、ローカルやDropbox上（これもローカルですが...）に作ったBareリポジトリをGit Hosting Serviceにアップするには、以下のステップを行います。

1. ローカルにあるBareリポジトリからまずデスクトップなどにプロジェクトをcloneし、non-Bareリポジトリを作成する
(注：すでに存在しているnon-Bareリポジトリを使う場合は、pullなどして必ず最新の状態にしておいてください)

2. GitHubあるいはBitbucketに新しいリポジトリを作成する（名前は自由ですが、Bareリポジトリの名前が良）
3. GitHubやBitbucketのプロフィールにあるSSH Keys画面から、ssh public keyを登録する。登録方法は検索すれば色々ありますが、Putty Genなどで作成した公開鍵をコピペするのが簡単です。すでに登録している人はこの作業は要りません
4. non-BareリポジトリのoriginのURLが、Bareリポジトリへのパス（Dropboxにアップしているなら、C:/User/Go_zen_chu/Dropbox/Git/Projectなど）になっているので、これをGitHubやBitbucketに新規作成したリポジトリへのURLに変えます。
> GitHubならURLは、git@github.com:UserName/Project.git
> BitbucketならURLは、git@bitbucket.org:UserName/Project.git
> 例：git@github.com:Go-zen-chu/HogeProject.git (HogeProjectが2.で新規作成したリポジトリ)

5. originのパスを上のように変更したら、non-Bareリポジトリをpushします。すると、今までの更新履歴を保ったまま、GitHubやBitbucketにアップロードできます。

これで、次からはGitHubやBitbucketからpullやcloneができるようになります。失敗したときのことを考えて、予めバックアップなどは取っておきましょう。
Vimで、文字列を別のところに「持って行って置換する」効率的な方法は？

Vimで、文字列を別のところに「持って行って置換する」効率的な方法は？

##前置き
これは私が答えを知っているパズルではなく、Vimmer諸氏への純粋な質問です。

「Vimで文字列を別のところに「持って行って置換する」効率的な方法は？」

意味がよく伝わるように例で説明します。


## 例

たとえば、以下のような文章を書いているとき。

> **BEFORE:**
>  Lorem ipsum dolor sit amet, consectetur adipisicing elit,
  sed do eiusmod tempor incididunt **ut labore et dolore** magna
  aliqua. Ut enim ad minim veniam, quis nostrud exercitation
  ullamco laboris nisi ut aliquip ex ea commodo consequat.
  Duis aute irure **dolor in reprehenderit** in voluptate velit
  esse cillum dolore eu fugiat nulla pariatur. Excepteur
  sint occaecat cupidatat non proident, sunt in  culpa qui
  officia deserunt mollit anim id est laborum.

カーソルは現在 **BEFORE:**の **dolor in reprehenderit** の初めの **d** にあるとし、モードはノーマルモードだとします。

**BEFORE:** で太字にした中ほどの **dolor in reprehenderit** を、三行上の **ut labore et dolore**の箇所に「持って行って置換する」ということをやりたいのです。つまり編集後は以下の **AFTER:** のようになっていてほしいということです。


>  **AFTER:**
Lorem ipsum dolor sit amet, consectetur adipisicing elit,
  sed do eiusmod tempor incididunt **dolor in reprehenderit** magna
  aliqua. Ut enim ad minim veniam, quis nostrud exercitation
  ullamco laboris nisi ut aliquip ex ea commodo consequat.
  Duis aute irure **dolor in reprehenderit** in voluptate velit
  esse cillum dolore eu fugiat nulla pariatur. Excepteur
  sint occaecat cupidatat non proident, sunt in culpa qui
  officia deserunt mollit anim id est laborum.

どのようなキーシーケンスで編集するのが効率的かという問題です。終了時のカーソル位置はどこにあってもかまいません。

##素朴な解答例

素朴な解答例としては

* 3yw（持って行く文字列をコピーする）
* 3k2w（目的地に移動する）
* P（ペーストする）
* 4de（不要な部分を削除）

という11キーが考えられますが、もっと短くならないのかなと思っています。

ご教示いただければありがたいです。

## 追記1. 説明補足

上に書いた「例」はあくまで例でして、私が特に疑問に思っているのは P や p でペーストして d でデリートするしかないのかな、ということでした。言葉足らずだったので補足します。

テキストを編集していてよく出会う状況なので何か改善の余地はないかなと思って書いています。

## 追記2. コメント欄で紹介された各種方法

コメント欄でいろんな方法やTipsをご教示くださり、ありがとうございます。

* `3k2w` で目的地に行く代わりに、`g#` の「現在の単語を含む文字列を上方向に検索」で "dolor" から "dolore" まで行ける。
* `4cw` で挿入モードに入り、`<Ctrl-R>0<ESC>` で「レジスタ0からペースト」を使う手がある。ピリオドキーでの反復ができる。
* 「ヴィジュアルモードで `p` を打つとヤンクした文字列で選択範囲が置換される」
* `"_d4wP` を使うと、削除時に消去専用レジスタ `"_` が使われるので、ペーストがうまくいく。

なぜか結城の環境では「ヴィジュアルモードで `p` を打つとヤンクした文字列で選択範囲が置換される」が効かなかったです。実は私が求めていたものはこの機能のような気がします。何か設定があるのかしら。→解決。以下の追記3.を参照。

プラグインの紹介もありがとうございます。

* プラグイン: vim-operator-replace
* プラグイン: vim-visualstar

「カーソル下の一単語とヤンクしてきた文字列を置き換える」キーシーケンスを割り当てる。

```
nnoremap ciy ciw<C-r>0<ESC>
```

## 追記3. 自分の環境で `v_p` が効かなかった理由

結城の環境で「ヴィジュアルモードで `p` を打つとヤンクした文字列で選択範囲が置換される」機能が効かなかったのは、~/.vimrc

```
set clipboard=unnamed,autoselect
```

していたためでした。この設定だとヴィジュアルモードでの選択内容がすぐクリップボードと無名レジスタにヤンクされてしまいます。

```
set clipboard=unnamed
```

に修正したところビジュアルモードでの `p` による置換が効くようになりました。

<a href="https://twitter.com/kanno_kanno/status/435064845403058177">@kanno_kanno</a>さんにご指摘いただきました。感謝。
zabbixのcookbookで`could not find recipe database for cookbook zabbix`といわれる


https://github.com/laradji/zabbix

ここに書いてあるとおり以下のように書くとうまく動かない

```
"recipe[database::mysql]",
"recipe[mysql::server]",
"recipe[zabbix]",
"recipe[zabbix::database]",
"recipe[zabbix::server]"
```

こんなエラーがでる。

```
Chef::Exceptions::RecipeNotFound
--------------------------------
could not find recipe database for cookbook zabbix
```


これはドキュメントが古くて、`zabbix::database`を`zabbix::mysql_setup`とすればうごくようになる


また、db関連の設定もdatabase以下ではなくserver以下にかく

```
{
    "recipes":[
        "database::mysql",
        "mysql::server",
        "mysql::client",
        "zabbix",
        "zabbix::mysql_setup",
        "zabbix::server",
        "zabbix::web"

    ],
    "zabbix": {
        "agent": {
            "branch": "ZABBIX%20Latest%20Stable",
            "version": "2.2.1",
            "source_url": null,
            "install": true,
            "install_method": "prebuild",

            "servers":  ["localhost"]
        },
        "server": {
            "branch": "ZABBIX%20Latest%20Stable",
            "version": "2.2.1",
            "source_url": null,
            "install": true,
            "install_method": "source",
            "db_install_method": "mysql",
            "dbname": "zabbix",
            "dbuser": "zabbix",
            "dbhost": "localhost",
            "dbpassword": "zabbixpass",
            "dbport": "3306"
        },
        "web": {
            "install": true,
            "fqdn":  "localhost"
        }
    },
    "mysql": {
        "server_root_password": "iloverandompasswordsbutthiswilldo",
        "server_repl_password": "iloverandompasswordsbutthiswilldo",
        "server_debian_password": "iloverandompasswordsbutthiswilldo"
    }
}
```
Visual Studio 2013で可変長テンプレートが対応されたのでdelegateのようなものを作ってみた

カッとなってやった。

```cpp:Delegate.h
template <class T, typename... Args>
class Delegate {
private:
    typedef void (T::*Func)(Args... args);
    std::list<std::tuple<T*, Func> > _funcs;

public:
    void add(T* pObj, Func func) {
        assert(!isExists(pObj, func));
        _funcs.push_back(std::make_tuple(pObj, func));
    }

    void remove(T* pObj, Func func) {
        for (auto it = _funcs.begin(); it != _funcs.end(); ++it) {
            if (pObj == std::get<0>(*it) && func == std::get<1>(*it)) {
                _funcs.erase(it);
                break;
            }
        }
    }

    void clear() {
        _funcs.clear();
    }

    bool isExists(T* pObj, Func func) {
        for (auto it = _funcs.begin(); it != _funcs.end(); ++it) {
            if (pObj == std::get<0>(*it) && func == std::get<1>(*it)) {
                return true;
            }
        }
        return false;
    }

    void call(Args... args) {
        for (auto it = _funcs.begin(); it != _funcs.end(); ++it) {
            auto pObj = std::get<0>(*it);
            auto func = std::get<1>(*it);
            (pObj->*func)(args...);
        }
    }
};
```

こんな感じに使う。

```cpp
class Test {
public:
    void foo(int v1, float v2) {}
    void bar(int v1, float v2) {}
};

Test t;
Delegate<Test, int, float> d;
d.add(&t, &Test::foo);
d.add(&t, &Test::bar);
d.call(1, 2.0f);
```

同じインスタンスの同じメンバ関数は同時に登録できない。
リストの中身はタプルにしたけどもっと良い方法は無いかな？
もちろんお仕事では使えない。（コンパイラが云々かんぬん）
cmd.exeでbashのバックティックのようにコマンドの出力を埋め込む

npmは`npm bin`とすることで現在のnode_modulesの実行ファイルが置かれているディレクトリへのパスを出力できるのですが、

```bat
> npm bin
d:\src\js\node_modules\.bin
```

cmd.exeだとこれをどうやって利用すればいいのか分からなかったので調べてみました。

(例えばbashなんかだとバックティックを使って、

```
> `npm bin`/mocha
```

のようにしてローカル(`-g`を付けてインストールしたわけではない)のコマンドを実行できるのですけど…)

結論からすると、次のようにすればいいようです。

```bat
> for /F "tokens=*" %a in ('出力を利用するコマンド') do %aに出力が入っているのでそれを利用する
```

さきほどのbashのnpmの例を書き直してみると、

```bat
> for /F "tokens=*" %a in ('npm bin') do %a\mocha
```

のようになります。

##解説

`for`というのはcmd.exeに元から組み込まれている(？)コマンドの一つで、ヘルプ(`/?`)には次のように書かれています。

> 指定されたコマンドをファイル セットの各ファイルに対して実行します。
>
> FOR %変数 IN (セット) DO コマンド [コマンドパラメーター]

ようするに、`セット`という部分に入ったファイルセット(ファイル名のリストみたいなもの、ワイルドカードを展開したりする)を一つずつ`%変数`という変数に代入して`DO`以下のコマンドを実行します。
PythonやJavaScriptの`for in`によるループをイメージしてもらうといいかもしれません。

で、なぜそのループ用のコマンドがbashのバックティックの代わりになるのかと言うと、`/F`というオプションに秘密があります。
`/F`を付けると、ファイルセットの中にあるシングルクオートに囲まれた文字列をコマンドとして解釈し、その出力を解析して%変数に渡す、という機能が追加されます。(他にも色々追加されます)
今やりたいことにうってつけの機能ですね。

ただ、そのままに`/F`を付けると少々厄介な問題が生じます。
具体的には、`npm bin`が`c:\Program Files\node\node_modules`のように空白を含むパスを返したとします。すると素の`/F`では、

```bat
> for /F %a in ('npm bin') do @echo %a
c:\Program
```

のように、空白で区切られてしまい、途中までしか取得することができません。

そこで、`"tokens=*"`というオプションを付けます。
すると、空白で区切られたものも取得することができるようになります。どういう原理なのかは説明するのが面倒なので`for /?`を実行するか[ここらへん](http://pf-j.sakura.ne.jp/program/dos/doscmd/for.htm)を参照してください。

最後に注意事項ですが、出力が複数行に及ぶ場合は行ごとに勝手に分けられてしまうのでご注意を。
Xcodeコードひな形のヘッダコメントを削除する

# やること
Xcodeでソースを新規作成する際、デフォルトのヘッダのコメントを変更する。
テンプレートの変更というと難しいイメージがあるが、けっこう簡単にできる。

# 最初に
iOS用のテンプレートは下記に存在している。

```
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File Templates
```

これを元に、自分用のテンプレートを作成する。

# 手順

## 既存のテンプレートを複製

下記のフォルダがあるかチェックする。

```
$ ls -l "$HOME/Library/Developer/Xcode/Templates/File Templates”
```

存在しない場合は、フォルダを作成する。

```
$ mkdir -p "$HOME/Library/Developer/Xcode/Templates/File Templates”
```

## 既存のテンプレートをコピーする。  
※ここでは「CoCoa Touch」をコピーして「Custom」とする。

```
$ cp -pr "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File Templates/Cocoa Touch" "$HOME/Library/Developer/Xcode/Templates/File Templates/Custom"
```

Xcodeを再起動する。

以上で、ファイル作成時に新規テンプレートが選択できるようになる。

## テンプレートの編集

個々のテンプレートは、下記のファイルを編集することによって、テンプレートを編集できる。

Templates/File Templates/Custom 配下

例えば、NSObjectを継承するクラスを作成するテンプレートは

```
Objective-C class.xctemplate/  
___FILEBASENAME___.h  
___FILEBASENAME___.m
```

この中のファイル先頭のコメントを削除すれば、新規作成時にコメント行が表示されなくなる。
vagrant で centosを使ってみる

# vagrant で cenotsを使ってみる

色々とサーバで遊ぶ為にvagrantでcentosを起動できるようにしておく


## vagrantのインストール

以下のダウンロードページからダウンロードしてインストール
[http://www.vagrantup.com/downloads.html](http://www.vagrantup.com/downloads.html)

## box

以下のページで探します
[http://www.vagrantbox.es/](http://www.vagrantbox.es/)

今回はcentosという名前でcentos6.5の64bitを使います

```
$ vagrant box add centos http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.5-x86_64-v20140110.box
```

## 初期設定
適当なディレクトリを作って、初期化処理と設定ファイルの変更をします

```
$ mkdir centos
$ cd centos
$ vagrant init centos
$ vi Vagrantfile
```

HOSTからアクセスしたいので、IPアドレスを振ります
Vagrantfileに次の一行を追加

```
config.vm.network :public_network, ip:"<割り振りたいIPアドレス>"
```

## サーバの起動

```
$ vagrant up
```

この時にNetwork Interfaceを聞かれたら普段使っている物を選択して下さい

## サーバへ接続

```
$ vagrant ssh
```
Camelを使ったJavaスクレイピング

スクレイピングな記事をみて、camelでもパラっとできそうだったので書いてみた。
書いてみたら色々前処理が必要だったけど、主要な部分はここ。

```java
 from("direct:start")
 .to("http://dummy") // HTTPアクセス（HTTP_URI先にアクセスしている）
 .unmarshal().tidyMarkup() // HTML-> XMLに変換
 .setHeader("title_data").xpath("//title/text()");// XMLからtitleを取り出して保存
```

ここだけで、httpアクセスしてtitleのテキスト部分を取り出す処理が完了。

# Webスクレイピング
http(s)アクセスして、情報を取得。必要なデータを読み込むという処理だそうだ。

# camelとは？
色々なものにつながるライブラリ。
ルートと呼ばれる処理のストーリーっぽいのも書ける。RouteBuilderって所がそれ。
たくさんのコンポーネントがあって、コンポーネントを使って接続する。
今回使ったコンポーネントはhttpとtagsoup。

# サンプルの内容

* 起動時に１回限り取ってくる
* https://www.google.co.jp　にアクセス
* タイトルの内容を取って"title_data"に保存
* 保存されたtitle_dataを標準出力
* httpコンポーネントは動的にURLを変更してアクセスしている

```java:Hello
package test.scraping;

import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.impl.DefaultExchange;
import org.apache.camel.main.Main;

public class Hello {
	
	public static void main(String[] args) throws Exception {
		// camelの設定と起動
		Main camel = new Main();
		camel.addRouteBuilder(getTitleRoute);
		camel.start();
		
		// camelのルートに送るデータを作成
		Exchange exchange = new DefaultExchange(new DefaultCamelContext());
		exchange.getIn().setHeader(Exchange.HTTP_URI, "https://www.google.co.jp");
		
		// camelのルートにデータを送る
		camel.getCamelTemplate().send("direct:start", exchange);
		
		// 結果を取得・表示
		String title = exchange.getIn().getHeader("title_data", String.class);
		System.out.println(title);
	}
	
	/** HTTP(s)アクセスしてタイトルを取ってくるシナリオ */
	public static RouteBuilder getTitleRoute = new RouteBuilder() {
		
		@Override
		public void configure() throws Exception {
			from("direct:start")
			.to("http://dummy")
			.unmarshal().tidyMarkup() // HTML-> XMLに変換
			.setHeader("title_data").xpath("//title/text()"); // XMLからtitleを取り出して保存
		}
	};
}
```

できたpomもついでに載っけておきます

```xml:pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>test</groupId>
  <artifactId>test.scraping</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <properties>
  	<camel-ver>2.12.2</camel-ver>
  </properties>
  <dependencies>
  	<dependency>
  		<groupId>org.apache.camel</groupId>
  		<artifactId>camel-core</artifactId>
  		<version>${camel-ver}</version>
  	</dependency>
  	<dependency>
  		<groupId>org.apache.camel</groupId>
  		<artifactId>camel-http</artifactId>
  		<version>${camel-ver}</version>
  	</dependency>
  	<dependency>
  		<groupId>org.apache.camel</groupId>
  		<artifactId>camel-tagsoup</artifactId>
  		<version>${camel-ver}</version>
  	</dependency>
  </dependencies>
</project>
```
ELPAのpackage-install時に"Error during download request: Not Found"がでたとき

Emacsのelisp管理でEmacs Lisp Package Archive(ELPA)を使って新しいパッケージをインストールしようとする時に、

>package-handle-response: Error during download request: Not Found

とエラーが出ることがあります。このエラーがでた時は、

`M-x package-refresh-contents`

としてパッケージ情報をリフレッシュしたあとに改めてパッケージをインストールすれば良いっぽいです。
[Error during download request: Not Found #92](https://github.com/purcell/emacs.d/issues/92)を参照しました。

----
ELPAでelisp管理がむっちゃ簡単になりましたね。
15年くらい前から地味に使いやすく育ててきた「オレ専用elispディレクトリ」を見直す時期になってきました。
そして、.emacs(今風には"~/.emacs.d/init.el") もELPAのおかげ(せい?)でかなりシンプルになってきています。
OpenCV開発 コンパイルから動作確認まで

## はじめに

OpenCVのインストール後に、web上に上がっているサンプルコードがコンパイルできずにハマったので書きました。インストール後に`gcc/g++`でうまくコンパイルできない人・動作確認をできずに困っている人が対象読者です。インストール手順は詳しく書きませんので、ご了承下さい。

### インストール

```bash
$ git clone git://github.com/Itseez/opencv.git
$ cd opencv/
$ sudo cmake .
$ sudo make
$ sudo make install
$ sudo ldconfig
```

必要なライブラリはググれば出まので、調べてみて下さい。

## コンパイル

### 通らない

```bash
$ g++ `pkg-config --libs opencv` `pkg-config --cflags opencv` sample.cpp
```

ググると上記のようなオプションが示されているのですが、コンパイルが通らず下記のようなエラーが出ます。

```shell-session
/tmp/ccBfZH07.o: In function `main':
sample.cpp:(.text+0x9e): undefined reference to `cv::imread(cv::String const&, int)'
sample.cpp:(.text+0xee): undefined reference to `cv::HOGDescriptor::getDefaultPeopleDetector()'
#以下略
```

### 解決策

CMakeLists.txtやら散々調べましたが、単純に **オプションの渡し方** が違ったみたいです。OpenCVのディレクトリ内`opencv/samples/c/build_all.sh`を参考にするとオプションの書き方(エイリアス)は以下になるようです。

```bash:.bashrc
alias gcv='gcvgcv'
function gcvgcv() {
    g++ -ggdb `pkg-config --cflags opencv` $@ `pkg-config --libs opencv`
}
```
sublime textでrubyの構文チェックをする

# sublime textのpackageフォルダにcloneする(mac)
```bash
cd ~/Library/Application\ Support/Sublime\ Text\ 2/Packages/
git clone git@github.com:pderichs/sublime_rubocop.git "RuboCop"
```

# 設定
- Rubocop: Toggle auto checkを実行するとsaveした際に規約に沿っているかチェックが実行され、好ましくない構文などがある行が赤くなる。
- Rubocop: Check current projectでプロジェクト全体をチェックできる。
コンソールを見るとNSLogでWarningが出る。

普段からObjective-Cを書いている時は、NSLogでデバッグ出力していました。
しかし、NSLogを使うと、Organizerのコンソールでwarningが発生します。

AngryBirdでも以下のような感じで出ます。

```
AngryBirds[15177] <Warning>: --> activateCrystalSetting: [set 2][val YES]
AngryBirds[15177] <Warning>: --> activateCrystalSetting: [set 2][val NO]
AngryBirds[15177] <Warning>: --> activateCrystalSetting: [set 2][val YES]
AngryBirds[15177] <Warning>: --> activateCrystalSetting: [set 2][val NO]
```

そこで、ash_logを使いましょう。

```objc
#import <asl.h>
asl_log(NULL, NULL, ASL_LEVEL_DEBUG, "%s", [message UTF8String]);
```

こんな感じで出力できます。
リリースビルドの場合、ASL_LEVEL_NOTICE以上のレベルしか出力されません。

ただ、残念ながらXcodeのコーディングしている時の下のウィンドウには出力されません。

* 基本的にコーディング時は、NSLogを使う
* リリース時には、NSLogは全部消す。
* リリースした後も見せたい情報のみ、asl_logで出力。

というのが、いいのではないでしょうか？

参考
http://doing-it-wrong.mikeweller.com/2012/07/youre-doing-it-wrong-1-nslogdebug-ios.html
docker 0.8〜をBoxenでインストールする

docker0.8でMacOSに正式に対応したということで、Boxenを使ってインストールできたのでそのメモ。

■Puppetfileに以下を追加する。

```
github "virtualbox", "1.0.10"
github "docker",     "1.0.3", :repo => "morgante/puppet-docker"
```

■自分のGithubアカウントのppファイルに以下を追記する
(例 : modules/people/manifests/kuozumijp.pp)

```
include virtualbox
include docker
```

■インストール(１回目は失敗するかもしれない。自分は２回目で成功した。)

```
$ script/boxen --no-fde
Notice: Compiled catalog for macbookair.local in environment production in 4.49 seconds
Notice: /Stage[main]/Docker/Package[docker]/ensure: created
Notice: Package[mosh](provider=homebrew): Updating homebrew formulas
Notice: /Stage[main]/People::Kuozumijp/Package[mosh]/ensure: created
```

■boot2docker-vmを起動

```
$ boot2docker up
[2014-02-14 03:42:59] Starting boot2docker-vm...
[2014-02-14 03:43:20] Started.
```

■SSHで入る(パスワードは　『tcuser』です。)

```
$ boot2docker ssh
Warning: Permanently added '[localhost]:2022' (RSA) to the list of known hosts.
docker@localhost's password:
                        ##        .
                  ## ## ##       ==
               ## ## ## ##      ===
           /""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
           \______ o          __/
             \    \        __/
              \____\______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
boot2docker: 0.5.4
docker@boot2docker:~$
```

■環境変数を設定しておく

```
$ export DOCKER_HOST=tcp://
```
define一括定義クラス


PHPリハビリ中


![sc1.png](https://qiita-image-store.s3.amazonaws.com/0/5472/7167f47e-f047-34bd-661a-de48f4802cbe.png "sc1.png")




```php:DefineClass
<?php

// 使い方
print '<pre>';


// 配列形式でkeyとvalueにそれぞれ、
// 定義する名前とテキストを入れる
MyDefine::define(array(
        array('__test1' => 'test1'),
        array('__test2' => 'test2'),
        array('__test3' => 'test3'),
    ));



$arrMyDefine = MyDefine::check();

echo 'Check ↓'.PHP_EOL;
var_dump($arrMyDefine);

print '</pre>';





Class MyDefine {
    // 配列形式でkeyとvalueにそれぞれ、
    // 定義する名前とテキストを入れる
    static function define($arrDefine)
    {
        // 配列から宣言用の 連想配列を取得する
        foreach($arrDefine as $arr) {

            // 連想配列から宣言名と宣言テキストに分けて宣言済み確認しつつ宣言してく。
            foreach($arr as $key => $val) {

                // defineされていなければ定義する
                if ( !defined($key) ) {
                    define($key, $val);
                    define('__MY'.$key, $val);
                }
                else {
                    print("{$key} => {$val}はすてに宣言されています。");
                }
            }
        }
    }

    // 宣言済みの定数を取得する
    static function check()
    {
        $arrConst    = get_defined_constants() ;
        $arrMyDefine = array();
        foreach($arrConst as $k => $v) {

            if (substr($k, 0, 4) === '__MY') {
                $arrMyDefine[substr($k, 4)] = $v;
            }
        }
        return $arrMyDefine;
    }
}




```
スクラッチからのHello, ASP.NET & AngularJS コントローラ編

ASP.NET Web APIを使ってHTTPサービスAPIを公開するコントローラを作成します。
ASP.NET Web APIを使うとRESTfulなAPIを簡単に作成できます。

## TodosControllerの作成

ControllersフォルダにTodosControllerクラスを作成します。

![ApiControllerの作成](http://blog.mochaware.jp/wp-content/uploads/2014/02/create_api_controller.png)

Todoアプリのビューが利用するAPIを実装します。
ApiControllerのポイントは、以下のとおり。

* メソッド名をGet()、Post()、Put()、Delete()にするとAPIとして公開してくれる
* Route属性を使って独自のルートも簡単に設定できる
* 引数や戻り値は自動的にC#オブジェクト<=>JSONの変換をしてくれる

```csharp
public class TodosController : ApiController
{
    // GET api/todos
    public IEnumerable<Todo> Get()
    {
        using (var context = new TodoContext())
        {
            return context.Todos.ToArray();
        }
    }

    // POST api/todos
    public int Post(Todo todo)
    {
        using (var context = new TodoContext())
        {
            context.Todos.Add(todo);
            context.SaveChanges();
            return todo.Id;
        }
    }

    // PUT api/todos
    public void Put(Todo todo)
    {
        using (var context = new TodoContext())
        {
            context.Entry(todo).State = EntityState.Modified;
            context.SaveChanges();
        }
    }

    // DELETE api/todos/archive
    [HttpDelete, Route("api/todos/archive")]
    public void Archive()
    {
        using (var context = new TodoContext())
        {
            var query = context.Todos.Where(t => t.IsDone);
            var todos = query.ToArray();
            foreach (var todo in todos)
            {
                context.Todos.Remove(todo);
            }
            context.SaveChanges();
        }
    }
}
```
スマホサイトでの画面タテ/ヨコ変更の検出方法

モバイルサイトを作っていて、JavaScriptで画面の縦横変更を検知したい場合。
ちょっと前までは`window.resize`を使う例を良く見たけど、最近は`orientationChange`を使うのが良いみたい。(Androidは2.2以上)

```js
$(window).on('orientationchange', function(){
	if(Number(window.orientation) == 90) {
		//ヨコ向き
	} else {
		//タテ向き
	}
});
```

でもこれ、例えばデスクトップのChromeとかで開発中の場合は`orientationChange`が動かない。
なので、MediaQueryListオブジェクトのイベントリスナで代用してる。

```js
(window.matchMedia("(orientation: portrait)")).addListener(function(e) {
	if(e.matches){
		// タテ向き
	} else {
		// ヨコ向き
	}
});
```

初投稿だけどこんな自分用メモでいいのだろうか。
自分の.emacs.dをgitへ出しておく


他のPCへ設定をいち早く入れたかったので、とりあえず上げておいた。
https://github.com/numechef/.emacs.d

工夫したところ
------


* color-themeなどの更新が止まっていて、そこまで最新性を問わないものは、.emacs.d/site-lisp/の中にインストール。


* jediなどの更新を反映して欲しいものは、submoduleで取り込み。
submoduleについては[こちら](http://qiita.com/sotarok/items/0d525e568a6088f6f6bb)で勉強しました。


* 機種固有の設定（window-sizeとか）をどうしようか迷いました。しかし、まあ変わってもすぐ直せるし〜ってことで、ファイルを分けて、ファイルに「pushするな！」って書いといた。