OmniAICreator/Qiita-1.07M huggingface dataset:
JUnit の ExternalResource クラスを継承したクラスの中で Spring Boot の Java Configuration のクラスで定義した DataSource Bean をインジェクションする

複数のテストクラスの共通の前処理、後処理を作成したい場合、JUnit の ExternalResource クラスを継承したクラスを用意すれば実現できますが、ExternalResource クラスを継承したクラスの中で Spring Boot の Java Configuration のクラスで定義した DataSource Bean をインジェクションして使いたいと思い、調査に結構時間がかかったのでそのメモ書きです。

例えば Spring Boot の Webアプリケーションの中で以下のように Java Configuration のクラスで DataSource Bean を定義しているものとします。

```java
@Configuration
public class ApplicationConfig {

    @Bean
    @ConfigurationProperties("spring.datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

}
```

テストクラスの共通処理として ExternalResource クラスを継承したクラスを作成し、その中で以下のように DataSource を @Autowired アノテーションを付加して定義した後、テストクラスの方では TestDataResource を @Rule アノテーションを付加して定義したのですが、テストを実行すると TestDataResource クラスの before メソッド内の dataSource を利用しているところで NullPointerException が出てテストが実行できませんでした。

※TestDataResource クラスの before, after メソッド内で実現しようとしていたのは、DbUnit を利用して既存データのバックアップ取得＆テストデータへの入替、バックアップからのリストアの処理です。

```java
public class TestDataResource extends ExternalResource {

    @Autowired
    private DataSource dataSource;

    @Override
    protected void before() throws Throwable {
        IDatabaseConnection conn = new DatabaseConnection(dataSource.getConnection());
        .....
    }

}
```
```java
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
public class SampleControllerTest {

    @Rule
    public TestDataResource testDataResource = new TestDataResource();

    @Test
    .....

}
```

この後調べて修正したのは以下の２点です。

* そもそもクラス内で @Autowired をフィールドに付加するのにクラスに何もアノテーションを付加していなかったので、@Component アノテーションを付加しました。
* ExternalResource を使う時のサンプルコードとして `public TestDataResource testDataResource = new TestDataResource();` の形式でテストクラスに定義するよう書かれている場合が多かったのですが、`= new TestDataResource()` でインスタンスを生成するのではなく @Autowired アノテーションを付加して Spring のDIコンテナにインスタンスを生成してインジェクションしてもらうようにしました。

修正後のソースは以下のようになります。これで TestDataResource クラスの before, after メソッド内で dataSource を利用できるようになりました。

```java
@Component
public class TestDataResource extends ExternalResource {

    @Autowired
    private DataSource dataSource;

    @Override
    protected void before() throws Throwable {
        IDatabaseConnection conn = new DatabaseConnection(dataSource.getConnection());
        .....
    }

}
```
```java
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
public class SampleControllerTest {

    @Rule
    @Autowired
    public TestDataResource testDataResource;

    @Test
    .....

}
```
安全なスレッドを実装する為に、これだけは意識したい事

今までに見てきたスレッドにまつわるクラッシュ（落ちバグ）で、
特に多いのがクラス定義されたインスタンスのメソッドコールのタイミングです。

例えば、
> std::queue等のメンバー変数を持つクラスのインスタンスに対して、
> スレッド１からpushを行い
> スレッド２からpopを行う

又は、
> std::stringのメンバー変数を持つクラスのインスタンスに対して、
> スレッド１から代入を行い
> スレッド２からc_str()で参照する

これらは、タイミングが合えば、いとも簡単にアプリをクラッシュさせます。

小難しい内容はここでは省きますが、せめてこれだけはちゃんと意識しよう。
と願うのが、
***メンバー変数に影響を与えるクラスメソッドは、ミューテックスで保護する***
という事です。


例えば、以下のコードはすぐにクラッシュします

```cpp:落ちる設計
class crashTestThread
{
public:
    void pushThread(){
        std::mt19937 mt;
        while(1){
            _queue.push( new int(mt()) );
            usleep( 1 );
        }
    }
    void popThread(){
        while(1){
            if( _queue.empty() ){
                usleep( 1 );
            }else{
                const int* var = _queue.front();
                _queue.pop();
                
                delete var;
            }
        }
    }
private:
    std::queue<int*> _queue;
};
static crashTestThread s_crashTestThread;

static void testThread(){
    
    auto t0 = std::thread( std::bind(&crashTestThread::pushThread, &s_crashTestThread) );
    t0.detach();
    auto t1 = std::thread( std::bind(&crashTestThread::popThread, &s_crashTestThread) );
    t1.detach();
}
```

でもこのように、ミューテックスでメソッドコール前後を保護してあげると
少なくともクラッシュはしなくなります。

```cpp:少なくともクラッシュしない設計
class crashTestThread
{
public:
    void pushThread(){
        std::mt19937 mt;
        while(1){
            _mutex.lock();
            _queue.push( new int(mt()) );
            _mutex.unlock();
            usleep( 1 );
        }
    }
    void popThread(){
        while(1){
            _mutex.lock();
            const bool isEmpty = _queue.empty();
            _mutex.unlock();
            
            if( isEmpty ){
                usleep( 1 );
            }else{
                _mutex.lock();
                const int* var = _queue.front();
                _queue.pop();
                _mutex.unlock();
                
                delete var;
            }
        }
    }
private:
    std::mutex _mutex;
    std::queue<int*> _queue;
};
```
jQueryでJSONデータを扱う

##概要
jQueryを用いて、JSONデータのエンコード、デコードを行います。

##下準備:jQuery拡張

```html
<script src="//code.jquery.com/jquery-1.11.2.min.js"></script>
```

```js
jQuery.extend({
	stringify : function stringify(obj) {
		var t = typeof (obj);
		if (t != "object" || obj === null) {
			// simple data type
			if (t == "string") obj = '"' + obj + '"';
			return String(obj);
		} else {
			// recurse array or object
			var n, v, json = [], arr = (obj && obj.constructor == Array);
			
			for (n in obj) {
				v = obj[n];
				t = typeof(v);
				if (obj.hasOwnProperty(n)) {
					if (t == "string") v = '"' + v + '"'; else if (t == "object" && v !== null) v = jQuery.stringify(v);
					json.push((arr ? "" : '"' + n + '":') + String(v));
				}
			}
			return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
		}
	}
});
```

↓コードはこちらからいただきました。
https://gist.github.com/chicagoworks/754454

##エンコードとデコード

```js
//テスト用データ
var testdata = new Object();
testdata.test1 = new Array();
testdata.test1.push("あああ");
testdata.test1.push("いいい");
testdata.test1.push(99);
testdata.test2 = "This is test."
testdata.test3 = new Object();
testdata.test3["表データ"] = true;
testdata.test3["裏データ"] = false;

//JSONエンコード
var jsonstr = $.stringify(testdata);
console.log('---jsonstr---');
console.log(jsonstr);

//JSONデコード
var data = $.parseJSON(jsonstr);
console.log('---data---');
console.log(data);

```

↓実行結果
![json_console.PNG](https://qiita-image-store.s3.amazonaws.com/0/24420/574cc6d1-6d69-0dfc-6511-9b87980d01a3.png)


↓js do it にかいてみました。
http://jsdo.it/tsunet111/A33V
cocoapods使用環境でsynxすると動かなくなる



## 理由
Project > プロジェクト名 > Info > Configurations が
PodsのPods.debug,Pods.releaseを認識できなくなるため。

## 対処

1. 一度pod関係を削除してからsynxする。

cocoapods関係を削除 > synx > podをインストール

Xcodeを閉じてから以下を実行
xxxにはプロジェクトのファイル名を入れてください。

```
rm -rf Pods Podfile.lock
synx -p xxx.xcodeproj/
pod install
```

2. xxx.xcworkspace を開いて設定し直す。

左上のフォルダアイコンを選択
プロジェクトを選択 > プロジェクト名 > Info > Configurationsで以下の２つを指定する。

* debug : Pods/Target Support Files/Pods/Pods.debug.xcconfig
* release : Pods/Target Support Files/PodsPods.release.xcconfig

これでビルドすると元通り動くようになっていると思います。

## 追記

`synx_pod プロジェクト名`で上記の流れを実行するエイリアス書きました。

```.bashrc
function synx_pod() {
  rm -rf Pods Podfile.lock;
  synx -p $1.xcodeproj/;
  pod install;
  open $1.xcworkspace;
}
```
FuelPHPのformatクラスの改行判定でハマった


## やりたかったこと
csvのファイルを読み込んで内容を配列に入れる

```
aaa,bbb,ccc
aaa,bbb,ccc
```
を

```
array(
   0 => array(
       0 => "aaa",
       1 => "bbb",
       2 => "ccc"
   ),
   1 => array(
       0 => "aaa",
       1 => "bbb",
       2 => "ccc"
   )
)
```
にする。

## やったこと
```
Format::forge(File::read('test.csv', true), 'csv')->to_array();
```
みたいな感じ。

## ハマったこと
ファイル内の改行が改行と判断されたりされなかったりする

__期待通りの配列ができた例__

```
test11,test12,test13
test21,test22,test23
```


```
array(
   0 => array(
       0 => "test11",
       1 => "test12",
       2 => "test13"
   ),
   1 => array(
       0 => "test21",
       1 => "test22",
       2 => "test23"
   )
)
```
__期待通りの配列ができなかった例__

```
test11,test12,aaa
test21,test22,bbb
```
```
array(
    0 => array(
        0 => "test11",
        1 => "test12",
        2 => "aaa
test21",
        3 => "test21",
        4 => "test22",
        5 => "bbb"
    )
)
```

## csvフォーマットのデフォルト設定を確認
|項目|値|
|:--|:--|
|区切り文字|,|
|囲い込み文字|"|
|改行|\n|
|エスケープ文字|\|

https://github.com/fuel/core/blob/1.7/master/config/format.php

```
'csv' => array(
        'import' => array(
                'delimiter' => ',',
                'enclosure' => '"',
                'newline'   => "\n",
                'escape'    => '\\',
        ),
        'export' => array(
                'delimiter' => ',',
                'enclosure' => '"',
                'newline'   => "\n",
                'escape'    => '\\',
        ),
        'regex_newline'   => "\n",
        'enclose_numbers' => true,
),
```
デフォルトだと、csvの値を「"」で囲まないとダメ？
でも想定通りの配列ができる場合もある。。


## 仕方なくソースを読む
https://github.com/fuel/core/blob/1.7/master/classes/format.php#L467-L474

```
if (empty($enclosure))
{
	$rows = preg_split('/(['.$newline.'])/m', trim($string), -1,　PREG_SPLIT_NO_EMPTY);
}
else
{
	$rows = preg_split('/(?<=[0-9'.preg_quote($enclosure).'])'.$newline.'/', trim($string));
}
```

どうやら「" or 0-9の数字」+「\n」を改行する場所として判断してるみたい。。

enclosureを空に設定することで以下も期待通りの配列にできた。

```
test11,test12,aaa
test21,test22,bbb
```

## まとめ
* enclosureを空文字に設定することで解決した
* フレームワークの動作を予想してはいけない(予想通りになることをテストする)
* 予想通りにならなかったらソースを読む
* 正規表現に0-9を入れている不思議
クライアントアプリからアクセストークンを取得する方法について

YahooショッピングAPIをローカルから利用したいと思うのですが、Yahoo!ID連携についてご質問がございます。

http://developer.yahoo.co.jp/yconnect/server_app/explicit/authorization.html
上記のAPIにて、redirect_uriが必須パラメータとなっておりますが、ローカルからの利用のためリダイレクト先がございません。
このような場合はいかがするべきでしょうか？
そもそもにローカルからのアクセストークンを取得することは可能なのでしょうか？

お手数をおかけしますが、ご回答をお待ちしております。
sublime text3のショートカット(Mac)


sublime text3(Mac)のショートカットで、
個人的によく使いそうなものをまとめる


##**画面分割(2,3)、分割解除(1)**
・alt+command+1,2,3


##**ファイル選択(移動)**
・command+P
→文字入力でインクリメンタルサーチしてくれる

##**コマンドパレット**
・command+shift+P
→パッケージコントロールとか

##**メソッド飛び**
・command+P,@
・command+R

##**行飛び**
・command+P,:
・ctrl+G

##**検索**
・command+F
→ファイル内検索

・command+shift+F
→ファイル横断検索

・command+i
→ファイル内インクリメンタル検索

##**選択**
・command+D
→同じ文字列を複数選択

・ctrl+command+G
→一気に全て選択

・command+A,command+shift+L,left
→各行の行頭を複数選択


##**Alignment(package)**
・command+ctrl+A
→イコールとかの位置をあわせてくれる


##**Sublime Files**
・ctrl+command+N
→サイドバーをコマンドで移動

SublimeLinterのキーとかぶってるので、Linterの方を変更(使わないので)

```javascript:ユーザのキーバインド設定
	{ "keys": ["ctrl+super+shift+a"], "command": "sublimelinter_show_all_errors" }
```


##**宣言飛び(飛び元に戻る)**
・F12
→標準のやつ

・ctrl+click
→CondeIntel(package)のやつ

・alt+left
→スタックから前に開いてたファイルに飛ぶ

・alt+right
→スタックから先に開いてたファイルに飛ぶ

・ctrl+-
→スタックから前にいた位置に飛ぶ

・ctrl+shift+-
→スタックから先にいた位置に飛ぶ

※F12で飛ぶ→alt+leftで飛ぶ前のファイルに戻る、って感じ使う


```javascript:ユーザのキーバインド設定
	{ "keys": ["alt+left"], "command": "next_view_in_stack" },
	{ "keys": ["alt+right"], "command": "prev_view_in_stack" },
	{ "keys": ["ctrl+minus"], "command": "jump_back" },
	{ "keys": ["ctrl+shift+minus"], "command": "jump_forward" },"sublimelinter_show_all_errors" }
```

##**ペースト**
・command+V
→ペーストとインデント
デフォルト設定は別なので

```javascript:ユーザのキーバインド設定
	{ "keys": ["super+v"], "command": "paste_and_indent" },
	{ "keys": ["super+shift+v"], "command": "paste" },
```

・command+alt+V
→コピー履歴から選択してペースト

##**codeIntel(package)**

・ctrl+shift+space
→補完

※ドットとかをいれれば自動で補完候補でるが、強制的に出す場合
why-run 時に ruby_block リソースを実行する whyrun_safe_ruby_block

実は `whyrun_safe_ruby_block` というドキュメントには書かれていないリソースがあって、そちらを使うと why-run の時も走る。

```rb:recipes/test.rb
whyrun_safe_ruby_block "foobar" do
  block do
    puts 'foobar'
  end
end
```

さらに `if Chef::Config[:why_run]` とかすれば why-run の時だけ走らせるなんてことも実現できる。

```rb:recipes/test.rb
if Chef::Config[:why_run]
  whyrun_safe_ruby_block "foobar" do
    block do
      puts 'foobar'
    end
  end
end
```
みんなの為のMySQLまとめ（５）

参考
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/mysql_10.htm
###■件数指定 LIMIT

  ・先頭から 3 件問い合わせるには、次のようにする。
    access の top と同じことができる。
    (TOP 10 取得、表示行制限、レコード数限定、件数指定、表示件数)
    (1 レコード取得、1 件取得)
  >  select * from testm
  order by key1
  limit 0, 3
;
![kobito.1423327482.730568.png](https://qiita-image-store.s3.amazonaws.com/0/59354/997b54f9-ab33-08d4-332e-b1a84d4bc98f.png "kobito.1423327482.730568.png")

・先頭レコードを問い合わせるには、次のようにする。
>select * from testm
  where key1 like 'a%'
  order by key1
  limit 0, 1
;
![kobito.1423327701.873612.png](https://qiita-image-store.s3.amazonaws.com/0/59354/075a4c39-fed5-c94e-a0f0-4172d75cbdfd.png "kobito.1423327701.873612.png")

・最後から 3 件問い合わせるには、ソートオーダを逆にすれば良い。
>select * from testm
  order by key1 desc
  limit 0, 3
;
![kobito.1423327793.463747.png](https://qiita-image-store.s3.amazonaws.com/0/59354/037ec8ed-eebd-abbf-aa41-ea4f65c0963d.png "kobito.1423327793.463747.png")
　

###■HAVING

  ・集計結果に対する問い合わせ条件を指定する。

>select key1, count(*), sum(data1), avg(data1) from testm
  group by key1
  having sum(data1) > 10;
  ![kobito.1423327998.945069.png](https://qiita-image-store.s3.amazonaws.com/0/59354/3ad0c3db-55a7-f4ba-6288-91e6110a7dc2.png "kobito.1423327998.945069.png")

###■CROSS JOIN
・Oracle の「,」標記と同じ。(クロス結合、クロスジョイン)
>select * from test2m cross join testm
  where test2m.code1 = testm.key1;
![kobito.1423328475.028625.png](https://qiita-image-store.s3.amazonaws.com/0/59354/5ff9a1e0-9d18-c8ae-638b-64a76507b966.png "kobito.1423328475.028625.png")

###■NATURAL JOIN

  ・同じ名前の列を自然結合する。(ナチュラルジョイン)
    (この例は悪い。)

>select * from test2m natural left join testm;
![kobito.1423328540.133249.png](https://qiita-image-store.s3.amazonaws.com/0/59354/7dc5dd32-cf96-270f-a237-a45b6710e5c7.png "kobito.1423328540.133249.png")
Rails + Grape + API Keyの認証


RailsでのAPI開発にGrapeを使っていて、シンプルな認証処理を実装してみました。
https://mikecoutermarsh.com/rails-grape-api-key-authentication/
自分で解釈する為に一部コードを変更したものをまとめてます。

## How do works
- ユーザー登録時は、Username/PasswordをAPIにPOSTする
- ユーザー認証し、API Keyを返却する
- その後の全てのAPIリクエストは、API Keyと一緒にリクエストする。

## How do it

### API Keyモデルを作る
モデルを作成してカラムは下記のようにします。

- access_token
- expires_at
- user_id

```
rails g model api_key access_token:string expires_at:datetime user_id:integer active:boolean
```

### インデックスを追加
migrationファイルが作成されていると思うので、 __api_key__ と __user_id__ にインデックスを追加します。

```rb
class CreateApiKeys < ActiveRecord::Migration  
  def change
    create_table :api_keys do |t|
      t.string :access_token,      null: false
      t.integer :user_id,          null: false
      t.datetime :expires_at

      t.timestamps
    end

    add_index :api_keys, ["user_id"], name: "index_api_keys_on_user_id", unique: false
    add_index :api_keys, ["access_token"], name: "index_api_keys_on_access_token", unique: true
  end
end
```

migrationを走らせて実際に適用されているかを確認して下さい。

```
rake db:migrate
```

### Tokenの作成
api_key.rbを開いて、下記のように書き換えます。

```rb
class ApiKey < ActiveRecord::Base  
  attr_accessible :access_token, :expires_at, :user_id
  before_create :generate_access_token
  before_create :set_expiration
  belongs_to :user

  def expired?
    DateTime.now >= self.expires_at
  end

  private
  def generate_access_token
    begin
      self.access_token = SecureRandom.hex
    end while self.class.exists?(access_token: access_token)
  end

  def set_expiration
    self.expires_at = DateTime.now+30
  end
end
```

これでAPI Keyの作成時にaccess_tokenが作成され、expires_atが設定されます。

### Authentication helpersをGrapeに追加
APIが呼ばれた際にユーザー認証をする処理をGrapeのhelperに書き足します。

```rb
helpers do  
    def authenticate!
      error!('Unauthorized. Invalid or expired token.', 401) unless current_user
    end

    def current_user
      # トークンを検索
      token = ApiKey.where(access_token: params[:token]).first
      if token && !token.expired?
        @current_user = User.find(token.user_id)
      else
        false
      end
    end
end
```

### GrapeにAPI Key作成処理を追加
__POST /api/auth__ で認証します。
__GET /api/ping__ でAPI Keyが正しいかどうかを返します。

```rb
# /api/auth
resource :auth do

  desc "Creates and returns access_token if valid login"
  params do
    requires :email, type: String, desc: "Email address"
    requires :password, type: String, desc: "Password"
  end
  post :login do
    user = User.where(email: params[:email]).first

    if user && user.authenticate(params[:password])
      key = ApiKey.create(user_id: user.id)
      {token: key.access_token}
    else
      error!('Unauthorized.', 401)
    end
  end

  desc "Returns pong if logged in correctly"
  params do
    requires :token, type: String, desc: "Access token."
  end
  get :ping do
    authenticate!
    { message: "pong" }
  end
end
```
gulp watchコマンドでファイル追加を検知しない場合の対処方

これまでgulp-watchプラグインを使っているもりで、こんなタスクを書いていました。

```js
var watch = require("gulp-watch");

gulp.task("watch", function () {
    gulp.watch(["./css/**", "./js/**"], "task_name");
});
```

これをgulp watchで監視させていました。
しかし、gulp-watchプラグインを使っているもりで、使っていなかったのが原因でした。

gulp.watch機能はgulpの機能

正しくは

```js
var watch = require("gulp-watch");

gulp.task("watch", function () {
    watch(["./css/**", "./js/**"], function(event){
        gulp.start("task_name");
    });
});
```

これで実行！

```bash
$ gulp watch
```

動く！
Unityエディタ上からGameビューのスクリーンショットを撮るEditor拡張

### 2018/08/23追記

気づいたら `Application.ScreenShot` が使えなくなっていたので `ScreenCapture.ScreenShot` に変更しました。 Unity 2018.2.5f1 で動作確認。
[困っている方](https://qiita.com/su10/items/a8f3f825155835de3d2a) がいらしたのに気づかず申し訳ない。。

----


Unityで開発していると、Gameビューの画面をそのままスクショして共有したい時があるんですが、標準でその機能が無かったりするのでEditor拡張で書いてみました。
(GitHub Gistにスクリプトファイルがあります → https://gist.github.com/dj-kusuha/a24e17a2d13e37e71214 )

```csharp:CaptureScreenshotFromEditor.cs
using UnityEditor;
using UnityEngine;

namespace djkusuha.Utility
{
    /// <summary>
    /// Unityエディタ上からGameビューのスクリーンショットを撮るEditor拡張
    /// </summary>
    public class CaptureScreenshotFromEditor : Editor
    {
        /// <summary>
        /// キャプチャを撮る
        /// </summary>
        /// <remarks>
        /// Edit > CaptureScreenshot に追加。
        /// HotKeyは Ctrl + Shift + F12。
        /// </remarks>
        [MenuItem("Edit/CaptureScreenshot #%F12")]
        private static void CaptureScreenshot()
        {
            // 現在時刻からファイル名を決定
            var filename = System.DateTime.Now.ToString("yyyyMMdd-HHmmss") + ".png";
            // キャプチャを撮る
#if UNITY_2017_1_OR_NEWER
            ScreenCapture.CaptureScreenshot(filename); // ← GameViewにフォーカスがない場合、この時点では撮られない
#else
            Application.CaptureScreenshot(filename); // ← GameViewにフォーカスがない場合、この時点では撮られない
#endif
            // GameViewを取得してくる
            var assembly = typeof(EditorWindow).Assembly;
            var type = assembly.GetType("UnityEditor.GameView");
            var gameview = EditorWindow.GetWindow(type);
            // GameViewを再描画
            gameview.Repaint();

            Debug.Log("ScreenShot: " + filename);
        }
    }
}
```

なんかあっさり書けたな？

やってることは普段良く使われている(はずの) `Application.CaptureScreenshot` が全てですが、それ以降にGameビューを再描画する処理を書いています。
なんでこんなものがあるのかと言いますと、 `Application.CaptureScreenshot` を呼んだだけではスクショのファイルが保存されなかったんですが、Gameビューが再描画された時（フォーカス合わせたりとか）に保存されていたので、スクリプトから強制的に再描画させるために追加してあります。


ちなみに `MenuItem` に `#%F12` と指定することで `Ctrl + Shift + F12` で `CaptureScreenshot` が呼ばれるようになります。
このあたりは [公式リファレンス](http://docs.unity3d.com/ScriptReference/MenuItem.html) をどうぞ。


----

参考:

* [How to manually update GameView? - Unity Answers](http://answers.unity3d.com/questions/449407/how-to-manually-update-gameview.html)
* [Unity - Scripting API: MenuItem](http://docs.unity3d.com/ScriptReference/MenuItem.html)
vim様でクリップボードにコピーできるようにする

# vim様でクリップボードにコピーできるようにする

vim様は通常だとヤンクしてもクリップボードにコピーができない。
他のテキストファイルにコピペできない。僕みたいなvim初心者にも厳しい。
でも嫌いじゃないよ。

色々トラブルあって大変だったけど、クリップボードへコピーできるようになったのでメモ。
ちなみに設定した環境は以下のとおり。

- vim 7.4
- Mac OSX Yosemite 10.10.1

## .vimrcの設定

- .vimrcに以下を追加

```.vimrc
set clipboard=unnamed,autoselect
```

## clipboard設定の確認

- vimでclipboardが使用できる設定になっているかを確認する

```terminal
vim --version | grep clipboard

-clientserver +clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments
 -xterm_clipboard -xterm_save
```

出力内容に`+clipboard`があれば設定完了。`-clipboard`の場合は以下の設定を行う。

### MacPortsのインストール

- 既にインストール済み（ターミナルでportコマンドが有効）の場合は対応不要
- [MacPorts](https://www.macports.org/install.php)からインストーラ取得してインストール
- インストールが完了したら環境変数を設定
 - Macの場合は`~/.bashrc`に追記

```terminal
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
export MANPATH=/opt/local/man:$MANPATH
```

- MacPortsを最新にアップデートする

```terminal
sudo port selfupdate
```

ちなみに自分の場合は.bashrcが読み込まれておらず、portコマンドがnot findになりました。
なので、`~/.bash_profile`に以下を追記

```.bash_profile
if [-f ~/.bashrc];
then source ~/.bashrc
fi
```

### +clipboardに変更

- ターミナルで以下のコマンドを実行

```terminal
sudo port deactivate vim
sudo port install vim +clipboard
```
インストールに少し時間がかかります。

- インストールが完了したら確認

```terminal
vim --version | grep clipboard
```

`+clipboard`があれば設定完了。

## 最後にvimで確認

- 何でも良いのでテキストをvimで開く
- visualモードで適当に選択してヤンク
- 他のエディタにCtrl+vで貼り付けられたらOK。
YAHOO API (ストアカテゴリ参照API )カテゴリー以下の商品コード取得について

はじめまして、YAHOOショッピングAPIに関する説明文書がネット上でも少ないため
こちらに書かせていただきました。
基本的なデータ取得（YAHOOID連携など）はすでに済んでいることを前提としまして
ストアカテゴリ参照API の取得情報で確認したいことがありました。

ストアにおけるカテゴリ層以下の商品コード取得に関する内容です。
YAHOOショッピングAPIを使った仕事をすることになり感じたのは
ストアクリエイターPro上でできることが可能になるということでした。

ストアクリエイターProの商品管理メニューで各カテゴリ層以下での商品の表示順序を変更する仕組みが
あります。その各カテゴリー内にどの商品が含まれているか、どのカテゴリーにどの商品が紐付けされているのか

おそらく「ストアカテゴリ参照API」のレスポンス内容を見るとそれに関するデータが取得できるのではと
勝手に想像しました。

しかししかるべきパラメータをセットし実際データを取得してみてレスポンスデータをそのままダンプしてもほしい内容（カテゴリ内に紐付けされている商品コード）は返ってきませんでした。（カテゴリ名やその他数箇所のレスポンスのみ）

やり方がおかしいのではないかとおもってはいるのですが、ダンプした内容がそうなので
もともとそれだけのレスポンスデータなのか、いまだにはっきりしません。

参考になるサイトなど教えていただけたら幸いですが、どなたかご存知の方がいらっしゃればコメントをお待ちしております。
macでpython

# python

　macには入っている。

```bash
$ python --version
Python 2.7.6
```

# pip

　pipをインストールする。

```bash
$ curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | sudo python
Collecting pip
  Downloading pip-6.0.8-py2.py3-none-any.whl (1.3MB)
    100% |################################| 1.3MB 330kB/s
Installing collected packages: pip

Successfully installed pip-6.0.8
```

# virtualenvwrapper

　開発環境をパックするため、virtualenvwrapperを入れて使っていく。

```bash
$ sudo pip install virtualenv virtualenvwrapper
  Running setup.py install for virtualenv-clone
    Installing virtualenv-clone script to /usr/local/bin


Successfully installed argparse-1.3.0 pbr-0.10.7 six-1.9.0 stevedore-1.2.0 virtualenv-12.0.7 virtualenv-clone-0.2.5 virtualenvwrapper-4.3.2
```

　シェル起動時に環境変数の設定とvirtualenvwapperのシェルを叩くように書いておく。

```bash:.bashrc
if [ -f /usr/local/bin/virtualenvwrapper.sh ]; then
    export WORKON_HOME=$HOME/.virtualenvs
    source /usr/local/bin/virtualenvwrapper.sh
fi
```

　即反映しておく。

```bash
$ . ~/.bashrc
```

　１つ作業場を作ってみる。

```bash
$ mkvirtualenv work
New python executable in work/bin/python
Installing setuptools, pip...done.
```

　環境を抜ける、入る。

```bash
$ deactivate
$ workon work
```

# ipython

　ipythonとその他もろもろをインストールして、notebookを起動。emacs+ipythonかnotebookか迷ってるけど、notebookも起動できるように。

```bash
$ pip install ipython
Successfully installed gnureadline-6.3.3 ipython-2.4.0
$ pip install pyzmq
Successfully installed pyzmq-14.5.0
$ pip install jinja2
Successfully installed jinja2-2.7.3 markupsafe-0.23
$ pip install tornado
Successfully installed backports.ssl-match-hostname-3.4.0.2 certifi-14.5.14 tornado-4.0.2
$ ipthon notebook
```
AWS LambdaでSQSのコンシューマを作る

AWS Lambdaの無限ループパターンで何かできないかなと考えてたら思いついたので試してみた話。

# 構成

![](https://qiita-image-store.s3.amazonaws.com/0/5522/35620806-107a-badd-6135-886ac2f5acac.png)

KinesisのストリームからAWS Lambdaを起動して、処理が完了したら再度AWS Kinesisにプッシュすることで無限ループを行います。
この無限ループ中でSQSからメッセージを受け取り、メッセージ処理用のAWS Lambdaを起動して、メッセージを処理できたらSQSからメッセージを削除するという動きになります。
もし、失敗した場合はメッセージがそのままSQSに残るので、Dead Letter Queueに入るまでは何度でもリトライ可能になります。

# コード

```js:consumer.js
// require
var Promise = require('bluebird');
var AWS     = require('aws-sdk');
var config  = require('config');
var uuid    = require('node-uuid');
var sqs     = Promise.promisifyAll(new AWS.SQS());
var lambda  = Promise.promisifyAll(new AWS.Lambda());
var kinesis = Promise.promisifyAll(new AWS.Kinesis());
/**
 * AWS Lambda entry point
 *
 * @param {Object} event lambda event object
 * @param {Object} context lambda context
 */
exports.handler = function(event, context) {
  // 
  Promise.resolve().then(function() {
    // receive messages from SQS
    var params = {
      QueueUrl: config.get('sqs.url'),
      MaxNumberOfMessages: config.get('sqs.max_number_of_messages'),
      VisibilityTimeout: config.get('sqs.visiblity_timeout'),
      WaitTimeSeconds: config.get('sqs.wait_time_seconds')
    };
    return sqs.receiveMessageAsync(params).then(function(data) {
      return data.Messages || [];
    });

  }).each(function(data) {
    // invoke lambda
    var args = {Records: [
      {
        sqs: {
          QueueUrl: config.get('sqs.url'),
          MessageId: data.MessageId,
          ReceiptHandle: data.ReceiptHandle,
          MD5OfBody: data.MD5OfBody,
          Body: data.Body
        }
      }
    ]};
    var params = {
      FunctionName: config.get('lambda.function_name'),
      InvokeArgs: JSON.stringify(args)
    };
    return lambda.invokeAsyncAsync(params);

  }).then(function() {
    // put to kinesis stream for retry
    var params = {
      Records: [
        {
          PartitionKey: uuid.v4(),
          Data: ''
        }
      ],
      StreamName: config.get('kinesis.stream_name')
    };
    return kinesis.putRecordsAsync(params);

  }).then(function() {
    context.done(null, 'success consumer.');

  }).catch(function(err) {
    context.done(err);

  });

};
```

コード自体も簡単で、SQSからメッセージを受けとって、AWS Lambdaを起動して、Kinesisnに再プッシュしているだけになります。

ネットワーク障害とかで処理に失敗した場合はAWS Lambda自体のリトライ機能を使って、再実行を行います。
Kinesisをイベントソースにしているためリトライが10回できるので、それで十分かなという感じです。

あとはCloudWatchとかでSQSのMessagesVisibleを見て閾値を超えてたらKinesisに2回プッシュするとかすると、SQSの詰まり具合に合わせてスケールできて良いかもですね。

# 停止方法

AWS Lambda functionを削除するかKinesisのストリームを削除したら止まります。

# 感想

パターンとしてはおもしろいですが、Kinesis-Lambdaで安定的に無限ループさせるのが難しそうな雰囲気です。
監視とかパフォーマンスとかスケールとか考えだすと1年間安定運用させる自信がないです。

ちょっと誰か実運用に載せて感想文書いて欲しいです。
NSImage/UIImage からビットマップデータを取り出す

NSImage または UIImage からビットマップに変換する要件はわりとありそうだけど OSX/iOS がもつ API の柔軟性の高さと複雑さゆえに毎回調べて書いてる気がするので。

## OSX (AppKit) の場合

以下のプロセスをたどって変換する。8bits の RGBA 画像を前提としている。MRC で書いてるが ARC を有効にする際は `[nsImage release]` を消すこと

 - NSImage を使って画像を読み込み
 - ピクセルデータを格納するバッファを確保
 - CGContext を作成
 - NSImage を CGContext に書き込み
 - ピクセルデータを処理
 - 後片付け

```objc

NSString *path = /* Take a path to load the file ... */
NSImage *nsImage = [[NSImage alloc] initWithContentsOfFile:path];
if (nsImage != nil) {
    NSSize size = [nsImage size];
    uint32_t width = (uint32_t) size.width, height = (uint32_t) size.height, components = 4;
    uint8_t *pixels = (uint8_t *) malloc(size.width * size.height * components);
    if (pixels) {
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
        CGContextRef bitmapContext = CGBitmapContextCreate(pixels, width, height, 8, components * width, colorSpace, kCGImageAlphaPremultipliedLast);
        NSRect rect = NSMakeRect(0, 0, width, height);
        NSGraphicsContext *graphicsContext = (NSGraphicsContext *) [[NSGraphicsContext currentContext] graphicsPort];
        CGImageRef cgImage = [nsImage CGImageForProposedRect:&rect context:graphicsContext hints:nil];
        CGContextDrawImage(bitmapContext, NSRectToCGRect(rect), cgImage);
        CGContextRelease(bitmapContext);
        CGColorSpaceRelease(colorSpace);
        /* Handle pixels ... */
        free(pixels);
    }
}
[nsImage release];
```

## iOS (UIKit) の場合

OSX の場合とほとんど同じだが UIImage から直接 CGImage を取り出す API があるため記述量が少し減る

```objc

NSString *path = /* Take a path to load the file ... */
UIImage *uiImage = [[UIImage alloc] initWithContentsOfFile:path];
if (uiImage != nil) {
    CGSize size = [uiImage size];
    uint32_t width = (uint32_t) size.width, height = (uint32_t) size.height, components = 4;
    uint8_t *pixels = (uint8_t *) malloc(size.width * size.height * components);
    if (pixels) {
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
        CGContextRef bitmapContext = CGBitmapContextCreate(pixels, width, height, 8, components * width, colorSpace, kCGImageAlphaPremultipliedLast);
        CGContextDrawImage(bitmapContext, CGRectMake(0, 0, width, height), [uiImage CGImage]);
        CGContextRelease(bitmapContext);
        CGColorSpaceRelease(colorSpace);
        /* Handle pixels ... */
        free(pixels);
    }
}
[uiImage release];
```
BeagleBone BlackとHP Chromebook 11 - Part1: USBで接続する

* Update: [BeagleBone BlackとHP Chromebook 11 - Part2: インターネットに接続する](http://qiita.com/masato/items/3554d0ec2c8a1f813ba9)

BeagleBone Blackの開発用端末としてChromebookを使うためにUSBケーブルで接続できるようにします。USB-Ethernet接続はケーブルをつなぐだけです。USB-Serial接続をする場合は、ドライバのインストールとscreenコマンドが必要なのでChromeOSからは直接使えません。


## USB-Ethernet接続

Chromeブラウザから`ctrl + alt + t`をタイプしてshellを実行します。

``` bash
crosh> shell
chronos@localhost / $ 
```

BeagleBone BlackのeMMCにインストールしたDebianは、ChromebookとUSBで接続すればそのまま使えます。

``` bash
crosh> shell
chronos@localhost / $ ssh debian@192.168.7.2
Debian GNU/Linux 7
```

SDカードからブートしたUbuntuも[カーネルを更新](http://qiita.com/masato/items/aa0577448f0c44641de3)しているので、USBケーブルを接続するだけSSH接続ができした。

``` bash
crosh> shell
chronos@localhost / $ ssh debian@192.168.7.2
Ubuntu 14.04.1 LTS

rcn-ee.net console Ubuntu Image 2015-01-06
```

## USB-Serial接続

USB-Serial接続する場合、[Getting Started](http://beagleboard.org/getting-started)のインストール手順に従ってLinux用ドライバをインストールします。


### croshからはインストールできない

Chromeブラウザから`ctrl + alt + t`をタイプしてshellを実行します。

``` bash
crosh> shell
chronos@localhost / $ 
```

ChromeOSのファイルシステムがRead-onlyなので、直接ChromeOSにはドライバをインストールできません。

``` bash
$ cd ~/Downloads
$ wget http://beagleboard.org/static/Drivers/Linux/FTDI/mkudevrule.sh
$ sudo sh -e mkudevrule.sh 
mkudevrule.sh: 2: cannot create /etc/udev/rules.d/73-beaglebone.rules: Read-only file system
```

### chrootしてインストールする 

[crouton](https://github.com/dnschneid/crouton)で[chrootにUbuntuをインストール](http://qiita.com/masato/items/219b09c948fa2d8ecaba)しておきます。croshからenter-chrootします。

``` bash
$ sudo enter-chroot
$ cd ~/Downloads
$ sudo sh -e mkudevrule.sh 
```

USBドライバがインストールできたようです。

``` bash
$ cat /etc/udev/rules.d/73-beaglebone.rules
ACTION=="add", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_interface",         ATTRS{idVendor}=="0403", ATTRS{idProduct}=="a6d0",         DRIVER=="", RUN+="/sbin/modprobe -b ftdi_sio"
...
```

USB-Serial接続する場合はsceenを使います。

``` bash
$ sudo apt-get update
$ sudo apt-get install screen
```

SDカードからブートしたUbuntuにscreenでシリアル通信ができようになりました。

``` bash
$ sudo screen /dev/ttyUSB0 115200
Ubuntu 14.04.1 LTS arm ttyO0

rcn-ee.net console Ubuntu Image 2015-01-06
```
みんなの為のMySQLまとめ（３）


参考
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/mysql_08.htm

###■データベース問い合わせ

  ・リレーショナルデータベース(RDB) では、select 文を用いて、実に様々な
    問い合わせが可能である。

  ・特定のデータを抜き出す指定は次のようにする。
    この例では、key1 の先頭が「a」で始まるものだけが問い合わされる。
    like は、部分一致を行う。

 ・複数条件で抽出するには、次のようにする。
    この例では、key1 が「a001」と「b002」のものが問い合わされる。
    where 句には、and、or を複合条件指定できる。
    () で囲まれた条件ほど優先順位が高い。
![kobito.1423318774.747088.png](https://qiita-image-store.s3.amazonaws.com/0/59354/f98757ab-1fee-c03e-f5c1-774ae828825c.png "kobito.1423318774.747088.png")

（）を付けたとき。
>select
  key1,
  data1,
  data2,
  data3
from testm
where (key1 = 'a001' or key1 = 'b002') and data1 > 0
order by key1
;

  ・項目指定に「*」を指定すると、全ての項目が含まれる。

>select
  *
from testm
where key1 like 'a%'
order by key1
;

 ・特定の項目を見せたくないときは次のようにする。
    この例では、data2 と言う項目がなくなる。

>select
  key1,
  data1,
  data3
from testm
order by key1
;

 ・項目名を異なった項目名に変更する場合は、次のようにする。
    この例では、data1 と言う項目名が「abc」と言う項目名に変更されている。

>select
  key1,
  data1 as abc,
  data3
from testm
order by key1
;
![kobito.1423319456.037350.png](https://qiita-image-store.s3.amazonaws.com/0/59354/f53b51a2-865d-5301-f737-a81bdf24b150.png "kobito.1423319456.037350.png")
　

・計算項目を作る場合は、次のようにする。
    この例では、data1 + data2 の合計が「total」と言う項目名で追加される。
    様々な SQL 関数を用いた計算項目が作成できる。

>select
  key1,
  data1 + data2 as total,
  data3
from testm
order by key1
;

 ・文字列の結合項目を作る場合は、次のようにする。
    この例では、data1 と data2 の結合文字が「stritem」と言う項目名で追加
    される。SQL 関数を用いたフォーマットなども可能である。
    MySQL では「||」による結合はできないようである。concat() を使用する。

>select
  key1,
  concat(data1, data2) as stritem,
  data3
from testm
order by key1
;
![kobito.1423319685.442953.png](https://qiita-image-store.s3.amazonaws.com/0/59354/3813bb0d-8956-2146-2b7c-53d5fa4131ab.png "kobito.1423319685.442953.png")
　
　
>select concat('123', 4);
select concat('123', '4');
select concat('123', cast(4 as char));
select concat('123', convert(4, char));![kobito.1423319982.774058.png](https://qiita-image-store.s3.amazonaws.com/0/59354/aded368a-3fde-a0c5-395f-dbf96f748919.png "kobito.1423319982.774058.png")

・「+」では、次のように数値計算となる。
>select '123' + 4;
select '123' + '4';
![kobito.1423320161.978382.png](https://qiita-image-store.s3.amazonaws.com/0/59354/08e8fbf0-e772-fd74-2b08-6ebf90c58001.png "kobito.1423320161.978382.png")　

・strcmp() で文字列の大小比較が次のようにできる。
>select strcmp('123', '456');
select strcmp('456', '123');
select strcmp('123', '123');
![kobito.1423320316.687005.png](https://qiita-image-store.s3.amazonaws.com/0/59354/22f6b91a-ac6c-5805-095b-0e602151483e.png "kobito.1423320316.687005.png")
Git のコミットメッセージをテンプレート化する

# コミットテンプレート
* git のコミットメッセージをある程度フォーマット化したい場合、コミットテンプレートを用意できる
* プロジェクト内でコミットメッセージの書き方を統一したい場合に便利

# テンプレートファイルの用意

* 任意の場所にテンプレートファイルを用意し、git config でそのファイルをセットする

```bash
$ touch ~/.gitmessage.txt
$ git config --global commit.template ~/.gitmessage.txt
```

```:.gitmessage.txt
[ticket: #xxxx][Task/Bug] Subject line

what happened
ref : ticket link
```


# 使用例

```
$ git commit

[ticket: #xxxx][Task/Bug] Subject line

what happened
ref : ticket link

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
# modified:   hoge/test.txt
#
```
CIでDockerイメージをつくった上でテストしている場合のCoverallsの設定



`-e CI=true` をつける

参考: https://github.com/lemurheavy/coveralls-ruby/blob/v0.7.9/lib/coveralls.rb#L94

### もっと詳しく

CircleCIで`docker build`して作成したimageをつかって

```
docker run -it eiel/hogehoge rake spec
```

みたいにテストしている。
しかし、

```
[Coveralls] Outside the Travis environment, not sending data.
```

と、でていて実行結果を送信できてない。
環境変数CIが定義されていれば、良いようだったので


```
docker run -it -e CI=true eiel/hogehoge rake spec
```

とした。
AndroidでYouTubeのサムネイルをアス比を直して表示する｡

#何をするのか

`YouTube Data API v3`でYouTubeのサムネイルを表示しようとした時に取得可能な画像サイズ(`Small:120×90`, `Medium:320×120`, `High:480×360`) しかし､SmallとMediumはアスペクト比が**16:9**なのに対し､最も肝心で､最も使いたい､Highの画像のアスペクト比が**4:3**なのです｡  そのためそのまま`ImageView`に組み込むと､画像の上下に黒い帯が入ってしまいます｡
今回はこの問題をAndroidの画像表示用オープンソースライブラリ`Picasso`を使って解決しましたので､書き残したいと思います｡  例として動画の検索結果をリスト表示するときに使えるように､`ArrayAdapter`を継承したクラス内に`Picasso`を使った画像取得処理を導入しました｡

##ソース
```lang:CustomAdapter.java
public class CustomAdapter extends ArrayAdapter<VideoItems> {
    private LayoutInflater layoutInflater;
    private Context context;

    public CustomAdapter(Context context, int textViewResourceId, List<VideoItems> objects, RequestQueue queue) {
        super(context, textViewResourceId, objects);
        layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.context = context;
    }

    static class ViewHolder {
        ImageView image;
        TextView numView;
    }

    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        VideoItems videoItems = getItem(position);
        String thumbnailurl = videoItems.snippet.thumbnails.high.url;

        if (convertView == null) {
            convertView = layoutInflater.inflate(R.layout.list_search, parent, false);

            holder = new ViewHolder();
            holder.image = (ImageView) convertView.findViewById(R.id.iv_thumbnail);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        
        //Picassoはこの1行で実装できます｡
        Picasso.with(context).load(thumbnailurl).transform(new CropTransformer()).placeholder(R.drawable.thumback).error(android.R.drawable.ic_dialog_alert).into(holder.image);

        return convertView;
    }

    private class CropTransformer implements Transformation{
        @Override
        public Bitmap transform(Bitmap source){
            int width = source.getWidth();
            int height = source.getHeight();
            //width, height = (480, 360)

            int x = 0;

            //y座標の始点をセットする｡
            int y = (height-width*9/16)/2;
            
            //幅をそのままに､高さを計算する｡
            height = width*9/16;

            Bitmap result = Bitmap.createBitmap(source, x, y, width, height);
            if(result!=source){
                source.recycle();
            }
            return result;
        }

        @Override
        public String key(){
            return "Custom()";
        }

    }
```

これで無事黒い線を除去することができ高画質なサムネイルを表示することができます｡
Dockerを使って新鮮なバイナリを作る


自分が普段使うディストリビューション向けのコンパイル済みのバイナリを欲しいときがあります．
Rubyをrbenvなどでコンパイルしてインストールしているとかfffmpegとかimagemagickとかのディストリビューション標準のリポジトリから入るものを使いたくない場合などです．こういったときにJenkinsを使えばいいという方がいるかもしれませんが，バージョンを固定するのが難しかったり依存関係を全て追うのが困難だったりと色々悩みがあります．依存関係に悩まされないまっさらな環境が欲しいです．
こういうときにはVagrantを使う手もありますが，VirtualBoxはかなり遅いので気軽に使えません．もっとサクッとやりたいです．

ということでDockerを使います．

## 今回やること

rbenvとruby-buildでRubyをコンパイルしてそのコンパイル結果をtarで固めてみます．
以下のやり方はこれ以外の用途にも色々使えると思います（テストとか）．

## やること

まず最新のDebianのDockerのイメージを手に入れます．やり方は以下に書きました．

[DockerでDebianを使いたい - Qiita](http://qiita.com/catatsuy/items/4245e49903252d4ba54c)

これで作ったDockerのイメージをベースにしてDockerfileを作ります．

```:Dockerfile
FROM catatsuy/wheezy

ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update && apt-get upgrade -y && apt-get clean && rm -rf /var/cache/apt/archives/* && \
  apt-get install -y --no-install-recommends \
    ca-certificates \
    git \
    build-essential \
    curl \
    libssl-dev \
    libffi-dev \
    libreadline5 \
    libreadline-gplv2-dev \
    zlib1g \
    zlib1g-dev && \
  rm -rf /var/lib/apt/lists/*

ENV RBENV_ROOT="/usr/local/rbenv"

RUN git clone git://github.com/sstephenson/ruby-build.git /usr/local/src/ruby-build && \
  cd  /usr/local/src/ruby-build && \
  ./install.sh
```

これで `docker build -t rbenv --no-cache .` とやればRubyのコンパイルに必要なパッケージがインストールされているDockerイメージを作ることができます．これを使ってお目当てのRubyをコンパイルしてみます．

```bash
docker run \
  --name ruby_build \
  -v "/tmp/rbenv:/usr/local/rbenv" \
  rbenv \
  sh -c "git clone git://github.com/sstephenson/rbenv.git /usr/local/rbenv; mkdir -p /usr/local/rbenv/shims; mkdir -p /usr/local/rbenv/versions; CONFIGURE_OPTS='--disable-install-rdoc' /usr/local/rbenv/bin/rbenv install ${TARGET_VER} -v; /usr/local/rbenv/bin/rbenv rehash"
```

docker run でディレクトリをマウントした上でコンパイルするためのコマンドを実行するだけです．こうすればコンパイル済みのバイナリが手に入ります．
Jenkinsを使っているならあとはこれを成果物としてダウンロードできるようにするだけです．

## 注意点

Dockerが出力するコンパイル済みのバイナリなどはファイルの所有者がroot:rootになるので削除とかが難しいです．

それとこれをやっている最中に突然Dockerコンテナが外部に通信できなくなりました．`docker rm $(docker ps -a -q)`してコンテナのプロセスを全部殺してもダメで，何回か`sudo service docker restart`してたら直りました．
アホみたいなWeb MIDI APIのラッパー



> 2015.09.06 更新
> Control Changeの送信やチャンネル指定が可能になりました。従来通り手抜きな使い方も相変わらずできますｗ
> また、[Meteor](https://www.meteor.com/)のパッケージにも登録しました。[tadfmac/poormidi](https://atmospherejs.com/tadfmac/poormidi)
> という変更にあわせ、記事更新しました。


[「ち〜ん」](http://qiita.com/tadfmac/items/702e74efad1dd606166a)を公開して後に引けなくなったので、今までサボってたJavaScript側のコード見直しをはじめた。
とにかく、いろいろヒドくて先は長そうなのだが、手始めに簡単そうなMIDI周りを切り出してみた。
これを使えば、かなり簡単にWeb MIDI APIを触ってみることができると思う。
~~「ち〜ん」みたいな単純なことしか出来ないけどw~~ 

## リポジトリ

[poormidi](https://github.com/tadfmac/poormidi)

## Meteor

Meteorパッケージ化しました。
下記コマンドでインストールできます。

> $ meteor add tadfmac:poormidi

## 特長

- Note On, Note Off, Control Changeの送信に対応
- パラメータが省略しまくれる。MIDIチャンネルすら省略可能
- MIDIデバイスの選択機能が無い。すべてのデバイスから受信、すべてのデバイスへ送信

## 使い方

### 動作環境

Web MIDI APIのラッパーですので、Web MIDI APIをサポートするブラウザでのみ動作します。
2015.09.06現在、下記ブラウザで動作します。

- Google Chrome の最新版 (Mac版、Windows版、Android版）※Linux版も対応してそうですが未確認
- Opera の最新版（Mac版）※Windows版にも対応してそう。

### 準備

~~Google Chromeのアドレスバーに`chrome://flags/#enable-web-midi`と入力して、Web MIDI APIを有効にしてください。~~ （Chrome 最新版では不要になりました）

### 初期化

```index.html
<script src="poormidi.js"></script>
```

```js
var midi = new poormidi();
```

### MIDI INを受ける

```js
midi.setHandler(onMIDIEvent);

function onMIDIEvent(e){
  var message = e.data[0] & 0xf0;
  if(message === 0x90){  // Note ON?
    // 好きな処理
  }
}
```

### Note On送信

チャンネル1固定で送るには下記のように書きます。

```js
// Note No.= 40, Velocity = 127
midi.sendNoteOn(40,127);
```

ベロシティすら省略可能ｗ
※省略すると100固定になります。

```js
// Note No.= 40, Velocity = 100
midi.sendNoteOn(40);
```

チャンネル指定も出来ます。
1～16を 0～15で指定します。

```js
// CH.1 Note No.= 40, Velocity = 80
midi.sendNoteOn(0,40,80);
```

### Note Off送信

チャンネル1固定の場合。

```js
// Note No.= 40
midi.sendNoteOff(40);
```

チャンネル指定も出来ます。
1～16を 0～15で指定します。

```js
// CH.1 Note No.= 40
midi.sendNoteOff(0,40);
```

### Control Change送信

チャンネル1固定の場合。

```js
// Control No.= 40, Control Value = 10
midi.sendCtlChange(40,10);
```

チャンネル指定も出来ます。
1～16を 0～15で指定します。

```js
// CH.10 Control No.= 40, Control Value = 10
midi.sendCtlChange(9,40,10);
```

~~### プラグアンドプレイ対応（途中で刺したMIDIデバイスを認識させる）<Chrome Canaryのみ対応>~~~

~~```js
setInterval(function(){
	midi.refreshPorts();
},4000);
```~~

### 注意

```js
var midi = new poormidi();
midi.sendNoteOn(40);
```

と書いてもノートオンは送れません。
`new poormidi()`の内部で呼び出している`navigator.requestMIDIAccess()`の成功時に呼び出されるsuccess callbackの処理が非同期となるためです。
しばらく待ってから`midi.sendNoteOn()`を呼び出すようお願いします。

## というわけで

Web MIDI APIで遊ぼう！

[参考](http://qiita.com/tadfmac/items/e26fdf1034ad6dad4504)
WikipediaのAPIをPHPから叩いてみる

# やってみたこと
PHPを使ってWikipediaのAPIを叩いて、
「親の文字体系」という文字列を含むWikipedia日本語版の記事のタイトル一覧を取得した。

# 参考にした記事
[MediaWiki APIを使ってWikipediaの情報を取得](http://qiita.com/yubessy/items/16d2a074be84ee67c01f)

# コード

```php:wtest1.php
<html>
<head><title>「親の文字体系」という文字列を含むWikipedia日本語版の記事一覧</title></head>
<body>
<?php
$url='http://ja.wikipedia.org/w/api.php?format=xml&action=query&list=search&srlimit=50&srsearch=';
$url.=urlencode('親の文字体系');

$array_title = array();
$i=0;
while(true){
	//結果が0になるまで50件ずつtitleを取得して配列に入れる
	$xml_string=file_get_contents($url.'&sroffset='.strval($i*50));
	$xml_obj=simplexml_load_string($xml_string);
	if(count($xml_obj->query->search->p)==0){
		$totalhits=$xml_obj->query->searchinfo['totalhits'];
		break;
	}else{
		foreach($xml_obj->query->search->p as $p){
			array_push($array_title,$p['title']);
		}
	}
	$i+=1;
}

//結果出力
print('<p>totalhitsは'.$totalhits.'件</p>');
$num=1;
print('<table border=1>');
foreach($array_title as $title){
	print('<tr>');
	print('<td>');
	print($num);
	print('</td>');
	print('<td>');
	print($title);
	print('</td>');
	print('</tr>');
	$num+=1;
}
print('</table>');
?>
</body>
</html>
```
ChromebookでOCaml使えた

Chromebookでも以下のURLに書かれている各バージョンのOCamlがJavaScriptベースで
使える。

最近の関数型の記事をChromebookで読みながら試せるかも。

- https://andrewray.github.io/iocamljs/

# 関連記事

- [Mavericksにしたからかutopが動かなくなっていた #OCaml #opam #solved](https://abrakatabura.hatenablog.com/entry/2013/12/23/220415)
- [OCaml(OpenGL)で「プログラムでシダを描画する」を通して学んだことのまとめ](https://abrakatabura.hatenablog.com/entry/2014/07/03/064416)
- [OSXで最速でOCamlでPostgresqlに接続するには](https://abrakatabura.hatenablog.com/entry/2013/06/27/064038)
- [WindowsにOCaml入れようとしてocamlfindが動かない件](https://abrakatabura.hatenablog.com/entry/2017/05/02/072551)
- [Windowsで公式のOCamlをいれて、utop動かすところまで出来た](https://abrakatabura.hatenablog.com/entry/2017/05/04/074542)
- [Windowsでlablglを使う](https://abrakatabura.hatenablog.com/entry/2017/05/27/072722)
Storyboard上のフォントを一撃のもと全置換してしまう

アプリの画面全体のフォントを統一したいということはよくあると思いますが、appearance等で指定するときには、フォントに加えフォントサイズもしていしないといけないので、ところどころでフォントの大きさを変えているアプリケーションでは何かと面倒です。

で、「あ、そういえばStoryboardってXMLじゃん、置換の出番じゃん」ということで黒い画面をいじるだけで、全部のフォントを統一できました。

怖いのでやる前はちゃんとコミットしておきましょう。

で、Storybord上でフォントを変更すると差分がわかると思うので、その差分を元にフォント名を把握して、あとは置換ですね。

以下は例です。

```pl
perl -p -i -e 's/(type="boldSystem"|type="system")/name="Hoge-Regular" 
family="Hoge"/g' ./**/*.storyboard
```

これでStoryboardを見ると見事にすべてのフォントが変わっていることがわかると思います。

やる際は自己責任でよろしくお願いしますm(_ _)m

超便利!!
ArchLinuxインストールスクリプト作った

## 作った

[tukiyo/archlinux-autonistaller](https://github.com/tukiyo/archlinux-autonistaller)

## 説明

[mac mini 2014 (FusionDrive)にArchLinuxインストール - Qiita](http://qiita.com/tukiyo3/items/507d5f4ed10d7907fd97)がダルかったので自動化させた。

インターネットに接続できること。 
USBメモリからarchlinuxを起動させて実行するだけ。

```bash:
sh core.sh
sh add_packages.sh
```

途中rootユーザのパスワード設定する入力があるので入力。 全部終わったら再起動で完了。

## ネットワーク設定

core.sh 先頭で固定IP設定しているので、IPを適宜変更のこと。
xNormalの導入

#【前提】
__・ハイポリモデル等から法線マップ、アンビエントオクルージョンマップを比較的簡単に作りたい人向け__
__・無料ツールXNormalを使いたい人向け__
__・うそを書くつもりはありませんが。経験に基づいて記述しているため、間違いが多分にある可能性があります。__
__・Windowsを使用しているため、説明文の特殊キーやマウスは、他の環境の場合は読み替えてください。__
__・xNormalの導入は自己責任で行ってください。__
#【目的】
xNormalを導入して、日本語化するまでの手順の説明。

#【ダウンロード】

以下のURLのxNormal配布サイトに行きます。（右クリックの「新しいタブで開く」で開いてください）
http://www.xnormal.net/

---
以下のような画面がブラウザ上に表示されるので、赤枠のダウンロード(DOWNLOAD)をクリックします。
__※注意　広告に関係ないダウンロードがたまに現れますが騙されないように。__
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/70fd7fb0-b1a8-fbcc-992e-2252404cc440.jpeg)

---
次に以下のような画面が現れます。
最新版は、常に一番上に現れるようなので、一番上のものをクリックします。
__一番上が開かない場合は(mirror)でも可__
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/38567957-b460-e145-b49a-7e0adfb8573e.jpeg)

---

次の画面が開くので、xnormal_3.??.??installer.exe の方をダウンロードするためクリックします
__注意：※SDKではありません__
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/51e495f5-7c22-1568-2e7b-db704bce377d.jpeg)

__ダウンロードが完了したら、ダウンロードしたファイルを必ずセキュリティツールなどでウィルス等のスキャンを行ってから実行してください。__
#【インストール】
ダウンロードが完了したら、xnormal?????installer.exeを管理者として実行します。

---

__利用規約の確認__　
利用規約を読みチェックを入れNextをクリックします。![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/a09e31cd-994e-4488-cafd-21d868319182.jpeg)

----

__インストールオプション__
インストールするコンポーネントを選択します。基本はすべてインストールしてしまっても構わないと思いますが。Special pluginsは各ソフト(3dsmax,Maya等）を持っている場合だけでいいと思います。また、Video codecsは必要無ければ外しましょう。
![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/8da73896-474c-91e6-631a-1ae197dfed7f.jpeg)

----
__インストールフォルダ選択__
インストールする場所を変える場合にはここで設定します。Ｃドライブなどが容量が少ない場合は他のドライブに変更します。
![6.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/c42393f8-3cc7-8df0-01d6-501438fefecd.jpeg)

インストール(Install)をクリックするとインストールが始まります
![7.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/50daa3e8-cbba-ad24-d2b7-81a4212419ee.jpeg)
以下の画面(Completed)が出力されればインストール成功です。
![8.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/602fb267-5a0f-e54b-e4a2-79865a9a0c76.jpeg)

__※注意：インストール完了後にシステムの再起動を要求されるので再起動します__
#【日本語化】
xNoramalを起動します。下図のような画面が出力されるので赤枠をクリックし、プラグインマネージャを開きます。

![10.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/72cdfb5d-bc4f-d7c0-21f0-186e9f68d0a1.jpeg)

----
プラグインマネージャが開いたら赤枠の（ランゲージ）で日本語を選択します

![11.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/1cbe526f-fdcc-0a22-72c8-1258b8069d7a.jpeg)

---
日本語化に成功すると下記のようになります。
![12.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/f32c1c7d-e4d3-500e-15e9-36c0f977896d.jpeg)
---
__xNormalも日本語化されます。__
![13.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/08fb4fba-c6d0-2840-1768-a5e57f893e66.jpeg)

これ導入完了です。

#【最後に】
xNormalの使い方については、ここでは説明しません。（私が説明とかおこがましいので）
比較的メジャーなツールであり、使用方法の日本語ドキュメント、ビデオチュートリアルはネットに沢山あります。

無料にしては便利なツールですので、使用方法、手順を検索エンジン等で探してみて下さい。

最後まで読んでいただいてありがとございます。
プロパティシートの便利な書き方

#プロパティシートの便利な書き方
##プロパティのマクロ
プロパティシートに絶対パスを書かなくていい方法があるので紹介
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/66029/c54425d0-c824-16e8-c3b2-0536bfa3abd9.png)
こちらの出力パスを絶対パスで下記のように書くと、プロジェクトを移動した時に出力場所も設定しなおさなければ行けなくなってしまう。
```
C:\Project\lib\
```
そこでマクロを使って、プロジェクト依存のパスに変更する
”出力ディレクトリ”の▼から”<編集...>”を選択。”マクロ(M)<<”を選択すると下の画面が出てくる
![無題1.png](https://qiita-image-store.s3.amazonaws.com/0/66029/8689671d-220f-3935-4bda-9b817d77d858.png)
下の表が左の名前を使うと右の値に置き換えてくれる便利なマクロ定数です。一覧から欲しい機能を探して上に書くとプラットフォームごとにフォルダを変えれたりします。

下記は私がライブラリに使っている例です。
```
$(SolutionDir)lib\$(PlatformToolset)\$(Platform)\$(Configuration)\
```
上記の設定が使うときには下記のように変換されます。
ビルド構成によって自動的に切り替わるので大変便利です
```
C:\Project\lib\v120\x64\Debug\
```

こちらは、マクロの一覧です
https://msdn.microsoft.com/ja-jp/library/c02as0cs.aspx
OSXのSafariでproxy.pacが読めなくなってた話


いつからだかSafariではfile://上にあるproxy.pacが読めなくて、http://localhost に置いて読ませていたんだけど、これまでもが読めなくなってた。おそらくYosemiteになった時から。

/var/log/system.log眺めてたら

```networkd[221]: -[NETProxyLookup pacLookupComplete:proxies:error:] PAC evaluation error: Error Domain=NSPOSIXErrorDomain Code=61 "The operation couldn’t\
 be completed. Connection refused"```
 
っていうメッセージが出でてたから気づいた。

原因がよくわかっていないんだけど、対症療法的にlocalhostをhttp://127.0.0.1 に書き換えたら解決した。

ちなみにChromeではlocalhostでも問題なく読める模様。