OmniAICreator/Qiita-1.07M huggingface dataset:
vimに自作コマンドを実装する


:Qiita というコマンドを自作し、実行すると hello, qiita! と表示するコマンドを作成します。

流れとしましては、
1. コマンドを書き込むファイルを用意する
2. 書式にしたがってコマンドを書く
3. .vimrcに、vimの起動時にそのコマンドファイルを読み込む記述を追加

といった具合です。

# 1. コマンドを書き込むファイルを用意する
私はvimのディレクトリ直下に作成しました。(C:¥vim¥mycommand.vim)

# 2. 書式にしたがってコマンドを書く
1で作成したファイルにコマンドを書き込んでいきます。
> :command[!] [{属性}...] {コマンド名} {実行するコマンド}

この書式にしたがってコマンドを書いていきます。
冒頭で説明したQiitaコマンドのサンプルをのせます。

```vim
command! Qiita echo 'hello, qiita!'
```

Qiitaが{コマンド名}、それ以降( echo 'hello, qiita' )が{実行するコマンド}にあたります。今回は{属性}については記述していません。コマンド名は英大文字で始めなければなりません。
またcommandではなくcommand!にすることで、既に定義されているユーザーコマンドに上書きができ

```vim
command Qiita echo 'hello, qiita!'
command! Qiita echo 'I love qiita!'
```

こうしますと I love qiita! と表示されるようになります。

# 3. .vimrcに、vimの起動時にそのコマンドファイルを読み込む記述を追加
この設定をせずに自作コマンドを適用することもできます。
その場合はvimを開くたびに :source {作成したファイルのディレクトリ} を実行してください。ただ毎回入力するには、面倒です。
上記のコマンドをvimの設定ファイルである.vimrcに追記し、自動で読み込むようにしましょう。(.vimrcがない人はvimrcの末尾でも構いません。詳しい説明は省きます)

```vim
:source c:\vim\.mycommand.vim
```

以上で :Qiita コマンドが有効になっています。コマンド実行時に引数を渡したかったり、もっと複雑な処理をさせたい場合は以下の参考ページを御覧ください。

より良いvim環境を構築しましょう！ありがとうございました。


# 参考
突然のvimコマンドを作った
http://kuchitama.hateblo.jp/entry/2013/02/08/000320

Vimスクリプトの初心者がコマンドを定義してみた
http://d.hatena.ne.jp/Hoshi-KN/20120302/1330658765

Hack #158: ユーザコマンドを定義する
http://vim-jp.org/vim-users-jp/2010/06/29/Hack-158.html
TeX でディラックのブラケットを書く


#braket.sty の紹介
みんな大好きディラックのブラケット記法を便利に書いてくれる braket.sty というものが TeX にはあるのでそれの紹介．
最近の Texlive をインストールしていれば含まれてるはず．なければググって持ってくる．

#使い方
プリアンブル(\begin{document}の前．つまり上のほう) に

```　
\usepackage{braket}
```

と書いておく． bra"c"ketではない．
すると以下の表現が使えるようになる．

```
\bra{}
\ket{}
\braket{||}
```

頭文字を大文字にするとそれらの expanding version つまり大きさを適当にあわせてくれるバージョンが使える．

```
\Bra{}
\Ket{}
\Braket{||}
```

例えば

```
\bra{e^{ik'x}} \\
\ket{e^{ikx}} \\
\braket{e^{ik'x}|V|e^{ikx}}
```

と書けば

<img width="200" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/98718/5b28e633-f18b-ade4-1444-0d3103b8836b.png">

が出力される．
縦に大きさのある式を書く場合，先頭を小文字で

```
\braket{e^{ik'x}|\frac{V}{a}|e^{ikx}}
```

と書くと
<img width="200" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/98718/f5fb2988-c7fa-8be0-3b6a-03474fc1b5b4.png">
こんな感じにブサイクになってしまうのでこういう場合は大文字で expanding version を使って

```
\Braket{e^{ik'x}|\frac{V}{a}|e^{ikx}}
```

と書けば
<img width="200" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/98718/64c1fc1e-1d2f-2797-11e6-0d6e5498b5a3.png">
こんな具合にハンサムになる．

#まとめ
これで量子力学のノート作りが捗る．
CSS transformscaleのhoverで画像拡大


#画像拡大（ブロック固定なし）
##CSS

```
<style type="text/css" media="screen">
.scale img {
transition: all 0.2s linear; //開く速さ
}
.scale img:hover {
-webkit-transform: scale(2.4);
-moz-transform: scale(2.4);
-o-transform: scale(2.4);
-ms-transform: scale(2.4);
transform: scale(2.4); //拡大倍率
z-index: 9999;
}	
</style>
```

#HTML

 ```
<div  class="scale" >
 <img src="画像パス">
</div>
```

#画像拡大（ブロック固定）
##CSS

```
<style type="text/css" media="screen">
.scale{
width:200px;
height:150px;
border:1px solid #ccc;
overflow:hidden;
}
.scale img {
transition: all 0.2s linear; //開く速さ
}
.scale img:hover {
-webkit-transform: scale(2.4);
-moz-transform: scale(2.4);
-o-transform: scale(2.4);
-ms-transform: scale(2.4);
transform: scale(2.4); //拡大倍率
z-index: 9999;
}	
</style>
```

#HTML

 ```
<div  class="scale" >
 <img src="画像パス">
</div>
```
【Rails】CSV/Excelデータを出力機能作成まとめ(View/Controller/Model)


# 下準備

CSVクラスをRailsで使えるようにする必要があります。
## config/application.rb

``` ruby
# config/application.rb
require File.expand_path('../boot', __FILE__)

require 'rails/all'
require 'csv'
```

# View

CSVダウンロード、エクセルダウンロードのリンクを作ります。

```html.erb
# csv_downloadするリンク -> このリンク押すとcsvデータがダウンロードされる。
<%= link_to "CSV", csv_download_path(format: "csv") %>

# excel_downloadするリンク -> このリンク押すとexcelデータがダウンロードされる。
<%= link_to "Excel", excel_download_path(format: "excel") %>
```



# FilesController
リクエストを受け取ったら、CSV/エクセルデータを返します。


```ruby
class FilesController < ApplicationController
  def csv_download
    # 分かりやすいようにインスタンス変数にしておきました。
    @csv_data = FileData.csv_data

    respond_to do |format|
      # .csv
      format.csv { send_data @csv_data }
    end
  end

  def excel_download
    # 分かりやすいようにインスタンス変数にしておきました。
    # なんだかよく分からないoptionが入ります。
    @excel_data = FileData.excel_data(col_sep: "\t")

    respond_to do |format|
      # .xls
      format.xls { send_data @excel_data }
    end
  end
end
```


# FileData Model

CSV/エクセルオブジェクトを作成します。

```ruby
class FileData
  # 引数無し
  def self.csv_data
    csv_data = CSV.generate do |csv|
      # csvに二次元配列を代入
      csv = [
        ['a','a','a','a'],
        ['b','b','b','b'],
        ['c','c','c','c']
      ]
    end
    return csv_data
  end

  # excel_dataの場合はoptionsを渡す。
  # 引数有り!
  def self.excel_data(options = {})
    # 引数有り!
    excel_data = CSV.generate(options) do |csv|
      # csvに二次元配列を代入
      csv = [
        ['a','a','a','a'],
        ['b','b','b','b'],
        ['c','c','c','c']
      ]
    end
    return excel_data
  end
end
```



# Excelデータ出力のその他の処理
# config/initializers/mime_types.rb

これを追加する。

```ruby
Mime::Type.register "application/xls", :xls
```

↓結果

```ruby
# Be sure to restart your server when you modify this file.

# Add new mime types for use in respond_to blocks:
# Mime::Type.register "text/richtext", :rtf

Mime::Type.register "application/xls", :xls
```


# 参考リンク
http://ruby-rails.hatenadiary.com/entry/20141119/1416398472
GitHub-Jenkins 連携とりあえずメモ


## やりたいこと
とりあえず今回やりたいのは、何かブランチをプッシュしたら、そのブランチのテストが実行されるところまで。

## プラグイン
使うプラグインは [GitHub Plugin](https://wiki.jenkins-ci.org/display/JENKINS/GitHub+Plugin)

## 前提
JenkinsのURL: `jenkins.example.com`
GitHubのURL: `github.example.com`

## Github設定
1. 使いたいリポジトリの[Settings]->[Webhook & services] にアクセス
2. [Add services] から [Jenkins (Git plugin)] を選択
3. [Jenkins hook url]を `http://jenkins.example.com/github-webhook/`

## Jenkins設定
自動設定とやらもあるらしいのだが、わからないことがあったので今回はとりあえず手動。

Jenkinsプロジェクトの設定で以下の項目を設定する

- [GitHub project]: `https://github.example.com/org/repo-name/`
- [ソースコード管理]
	- [Git]
		- [Repository URL]: `https://github.example.com/org/repo-name/`
		- [Branches to build]: `**`
		- [リポジトリブラウザ]: `githubweb`
			- [URL]: `https://github.example.com/org/repo-name/`
- [ビルド・トリガ]: [Build when a change is pushed to GitHub] をチェック

とりあえずこれだけで、プッシュされる毎にJenkinsワークスペースに対象のブランチがチェックアウトされてくれるので、 [ビルド] に好きな処理を書けば終わり。

## 以上の手順でできてないこと
- プラグイン設定で [Let Jenkins auto-manage hook URLs] というのを選ぶと色々出来そうなのだが、ここに指定するユーザを誰にしよう問題が未解決。チームで使ってるのに個人のアカウント指定するのが微妙。OrganizationのApplicationのOAuth2が利用できるといいのだが、対応していない気がする。
- [ビルド] および [ビルド後の処理] にある [Set build status to 〜〜] が使いたいのだが、↑の auto-manage の設定しないと使えないっぽい
MATLABでのAngle-Based Outlier Detection(ABOD)法の実装

高次元データに対してもロバストな外れ値検出アルゴリズムである、Angle-Based Outlier Detection法のMATLABでの実装を以下に示します。

ABOD法とはベクトル同士のなす角を利用した外れ値検出手法です。
ある点からすべての組み合わせのある二点へのベクトルのなす角のバラつきを求めています。
したがってその分散の値が小さな値であるほど、その点が外れ値であることになります。

なお、計算量が$O(dn^3)\ \ \ [d=dimension,n=number\ of\ rows]$ となっており、nの値が増えるとかかる時間が激増しますので、あまり大きなデータに対しては適用しにくい感があります。

2015-11-17追記
下記のコードに重大な誤りがある可能性がありますので、使用しないでください。申し訳ありません。
→誤りはありませんでした

```matlab:abod.m
function [abof] = abod(X)
    n = size(X);
    d = n(2);
    n = n(1);
    res = zeros(n,1);
    for i = 1:n
        Y = X - repmat(X(i,:),n,1);
        temp = Y.^2;
        s = sum(temp,2);
        s = repmat(s,1,d);
        Y = Y./s;
        Y(isnan(Y))=0;
        res(i) = compAngvar(Y);
    end
    abof = res;
end

function [anglevar] = compAngvar(Y)
    tmp = Y * Y';
    s  = tril(tmp,-1);
    [r,c,v] = find(s);
    anglevar = var(v);
end
```
viで空行を消すもうひとつの方法



正規表現が使えないエディタではどうやるのかさっぱりわかりませんが簡単にできます。そうviならね。

その簡単な手順はこちら


空行の削除
http://qiita.com/YamasakiKenta/items/ea8d63f7c572b656ba43




そこをあえて正規表現的に書いてみるとこんな感じ。

```vi
:[range]s/^\s*$\n//
```

全体なら

```vi
:%s/^\s*$\n//
```


ビジュアルモードで選択している範囲なら


```vi
:'<,'>s/^\s*$\n//
```

a,bでマークしている範囲なら

```vi
:'a,'bs/^\s*$\n//
```

正規表現とマークがあればあと10年は戦える！
【Android】FragmentTabHostの実装方法&TabChangeListenerの登録方法

FragmentTabHostの実装方法とTabChangeListenerの実装方法のメモ。

```MainActivity.java
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTabHost;
import android.util.Log;
import android.widget.TabHost;

public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FragmentTabHost tabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);
        tabHost.setup(this, getSupportFragmentManager(), R.id.container);

        TabHost.TabSpec tabSpec1, tabSpec2;

        tabSpec1 = tabHost.newTabSpec("tab1");
        tabSpec1.setIndicator("tab1");
        tabHost.addTab(tabSpec1, Fragment1.class, null);

        tabSpec2 = tabHost.newTabSpec("tab2");
        tabSpec2.setIndicator("tab2");
        tabHost.addTab(tabSpec2, Fragment2.class, null);

        tabHost.setOnTabChangedListener(tabChangedListener);
    }

    /* ここでタブ切り替え時の処理を実装 */
    private TabHost.OnTabChangeListener tabChangedListener = new TabHost.OnTabChangeListener() {
        public void onTabChanged(String tabid) {
            Log.d("TAG", tabid);
        }
    };
}
```

```activity_main.xml
<android.support.v4.app.FragmentTabHost
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:layout_weight="0" />

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="0" />

        <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />

    </LinearLayout>

</android.support.v4.app.FragmentTabHost>
```
HttpClientにて自己証明書や、ルート証明書なしでのSSLアクセスを可能とする

単純に証明書のチェックを無効化させる

```Java:DefaultHttpClient
/*
 * 証明書のチェック処理を無効化する
 */
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, new TrustManager[]{new X509TrustManager() {
        
    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }
    
    @Override
    public void checkClientTrusted(X509Certificate[] certs, String authType) {
        // 何もしない
    }
    
    @Override
    public void checkServerTrusted(X509Certificate[] certs, String authType) {
        // 何もしない
    }
}}, new SecureRandom());

Scheme sch = new Scheme("https", new SSLSocketFactory(sslContext), 443);

DefaultHttpClient httpClient = new DefaultHttpClient();
httpClient.getConnectionManager().getSchemeRegistry().register(sch);
```



```Java:HttpsURLConnection
SSLContext sslContext = SSLContext.getInstance("SSL");
TrustManager tm = new X509TrustManager() {

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }

    @Override
    public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
    }

    @Override
    public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
    }
};
sslContext.init(null, new TrustManager[]{tm}, null);
SSLSocketFactory socketFactory = sslContext.getSocketFactory();

HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory);
Client client = Client.create();
```
ionic + Meteorのチュートリアル通してる所感メモ vol.1


Meteorプラットフォーム上で動作するionicアプリケーションを作成チュートリアルが公開されている([ionic + meteor](http://info.meteor.com/blog/whatsapp-with-meteor-angular-and-ionic))。

このページでは、ionicとMeteorを組み合わせたサンプルアプリとして簡単なチャットアプリの作成を９つのステップを通して解説している。


このチュートリアルをさわり始めていて、とりあえず一度コピペしていってサンプルアプリが動作するところまでいったところ。

これから何回かにわけて、感想だったりこのチュートリアプリの作成について解説とかやってみようかなーという心意気です~~完走できるかは知らん~~。

## ionic + Meteor

### ionic
ionic単体で開発を始める時とMeteorと組み合わせて開発を始める時の違いについてメモしておきます。

ionic単体の場合、[ionic公式](http://ionicframework.com/)では`npm install -g cordova ionic`でグローバルインストールし、ionicコマンドの`ionic create [AppName] [option]`を実行すると`[AppName]`に入力した名前のディレクトリが作成され、そのディレクトリ内に`[option]`に指定したアプリの種類にしたがって、デフォルトアプリの構成が用意されます。

あとはhtmlテンプレートやjsファイルなどを適宜作成していくことでionicアプリを作成できました。

### ionic + Meteor
さて、ionic + Meteorの場合です。

#### Meteorの環境設定

まずはMeteorの公式ページに従い、Meteorの開発環境をインストールします。
こちらの[ページ](https://www.meteor.com/install)を参照してください。

Meteorの開発環境インストール後、`meteor create [AppName]`を実行します。
するとカレントディレクトリに`[AppName]`ディレクトリが作成されるので、`cd [AppName]`でそのディレクトリに移動しましょう。以降はこの作成された`[AppName]`ディレクトリで作業を行います。

#### Meteorにionicを導入するには

[AppName]ディレクトリにはMeteorがデフォルトの場合に使用するhtmlやcssが`[AppName].*`の形式で作成されています。

しかしこれらのファイルはionic + Meteorを行う際には必要がないので`rm [AppName].*`コマンドで余計なファイルを削除します。

ここまでを行うと、`.meteor/`ディレクトリだけが残った状態となります。

ionicの開発を行う際には対象となるプラットフォームを設定しなければなりません。
以下のコマンドで対象にしたいプラットフォーム(iOS or Android 両方でもOK)を設定しましょう。

`meteor add-platform android` or `meteor add-platform ios`


次はこの`.meteor/`にデフォルトで存在しているものの中で必要のないものを`meteor remove`コマンドで削除します。

 * `meteor remove blaze-html-templates`
 : デフォルトのテンプレートHTMLを削除します。
 
 * `meteor remove ecmascript`
 : MeteorにはECMAScript2015が`ecmascript`という名称で`.meteor`のパッケージにデフォルトで用意されています。Angular-MeteorではECMAScript2015とAngularJSに依存関係があるみたいなので、その依存関係を解除するためにECMAScript2015をパッケージから削除しているものと思われます~~違ってたらスマン~~。
 
あとは、ionicを導入するためにパッケージなどの追加を行います。
 * `meteor add angular`
 * `meteor add driftyco:ionic`

以上のコマンドで、AngularJSとionicが`.meteor`に追加されました。

### 次回
[vol.2](http://qiita.com/tacksman/items/da101a3f10c81b2ea222)では、ionicとionic + Meteorとのプロジェクト構成の違いについて解説できればと思います。
JAVA ストリーム


##FileReader

```java
import java.io.FileReader;

public class Test11 {
	public static void main(String[] args) throws Exception {
		String filename = "c:\\test.txt";
		FileReader fr = new FileReader(filename);
		char c1 = (char) fr.read();
		char c2 = (char) fr.read();
		fr.close();
	}
}
```

\\は半角の￥マーク

##FileWriter

```java
import java.io.FileWriter;

public class Test11 {
	public static void main(String[] args) throws Exception {
		String filename = "c:\\test.txt";
		FileWriter fw = new FileWriter(filename);
		fw.write('そ');
		fw.write('れ');
		fw.close();
	}
}
```

##URL

```java
import java.io.InputStream;
import java.net.URL;

public class Test12 {
	public static void main(String[] args) throws Exception {
		URL u = new URL("http://www.impressjapan.jp/");
		InputStream is = u.openStream();
		int i = is.read();
		while (i != -1) {
			char c = (char) i;
			System.out.print(c);
			i = is.read();
			// System.out.println("test");
			// break;
		}
	}

}
```

■実行環境
インプレスホームページのソースコードが表示される
︙
Xcode7でcocos2d-xの警告を消す

# cocos2d-xは警告だらけ

バージョンによっては、cocos2d-xはコンパイル時に警告だらけになります。
ほとんどは、
[1] 継承した仮想関数に"override"を書いていない
[2] deprecatedな関数を呼び出している
のどちらかです。

両方の警告を全部消してしまいましょう。


プロジェクトのBuildSettingsを開き、TARGETSを選択（たいていはそのままで大丈夫）
Other C Flags 項目を選択します（検索窓でother とか入れると早いです）
ここに、以下の2行を追加します（先頭のハイフンも必須です）

 -Wno-inconsistent-missing-override
 -Wno-deprecated-declarations

これで、再度ビルドしてみます。
だいぶ減るはずです。



# ライブラリ側も

とはいえ、まだ結構警告が残っているかもしれません。
ライブラリプロジェクト（cocos2d_libs.xcodeproj）にも同じように設定します。
TARGETSがたくさんあるので、自分が使っているもの（わからなければ、末尾が"iOS"になっているもの全部やっておけばまちがいないでしょう）に設定しておきます。


![スクリーンショット 2015-11-17 16.09.07.png](https://qiita-image-store.s3.amazonaws.com/0/98954/78d10e00-59a1-900e-b9f1-bcbbaea58dd4.png)


これですっきりしたと思います。


# 警告オプション

他の警告オプションを設定したい時は
「gcc 警告オプション」でググるといろいろ出てくると思います。
【Android】Layoutを重ねたときに、下のLayoutにタッチイベントを発生させない方法

FrameLayoutやRelativeLayoutの上に別のLayoutを重ねたときに、下のLayoutにタッチイベントを発生させない方法のメモ。


```.java
RelativeLayout parent = new RelativeLayout(getContext());
RelativeLayout child = new RelativeLayout(getContext());

parent.addView(child);

```

例えばこんな感じでRelativeLayoutを重ねると、childをタッチした後にparentのタッチイベントが発生してしまう。
そのため、タッチした座標にparentのButtonなどがあれば反応してしまう。

parentにタッチイベントを発生させたくない時は、以下のようにchildのTouchListenerの戻り値をtrueにしてあげればよい。

```.java
child.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
        return true;
    }
});

```
Google Maps Android API v2 にて、マーカータッチ時にカメラを移動させない方法

Google Maps Android API v2を利用した地図アプリにて、マーカータッチ時にカメラを移動させない方法のメモ。

以下のように、MarkerClickListenerの戻り値をtrueにすればOK。（デフォルトはfalse）
しかし戻り値をtrueにすると、InfoWindowが表示されなくなってしまう。
そこで、```marker.showInfoWindow();```として、明示的に呼んであげる。

```.java
public static GoogleMap mMap;

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
    @Override
    public boolean onMarkerClick(Marker marker) {
    // TODO Auto-generated method stub
        marker.showInfoWindow();
        return true;
    }
});

```


リファレンス
https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap.OnMarkerClickListener
注文APIの証明書の取得対象者について

お世話になります。
注文APIの証明書について質問がございます。
弊社はアプリケーションを提供しているデベロッパーで、弊社アプリケーションを各出店ストア様にご利用いただいております。
デベロッパーネットワークにて弊社のアプリケーションID等の取得は実施済、本番環境の注文APIの利用申請済です。
それと同時に、弊社自身も出店ストア（ストアアカウント）も取得しております。

この場合、
注文APIの認証の証明書を申請するのはアプリケーション提供者である弊社でしょうか。
それともアプリケーションを利用いただいている各出店ストア様がそれぞれ申請するのでしょうか。

各出店ストア様に認可していただいた後に取得するアクセストークンは各出店ストア様に紐付いている認識です。
証明書はアプリケーションIDを取得している弊社で取得すれば「各出店ストア様アクセストークン＋弊社証明書」で注文APIを利用できるのでしょうか。

ご確認の程どうぞ宜しくお願い致します。
AssertJのCustom assertionを作る

## AssertJについてはこの辺参照
- http://joel-costigliola.github.io/assertj/index.html
- http://qiita.com/petitviolet/items/c95255bf3e1ccd9766c3

## Custom assertionを作るにあたってはこちらを参考にさせて頂いた
- http://qiita.com/ikemo/items/165f01740995245f9009

## 作ったもの

```java
public static class ImageViewAssert extends AbstractAssert<ImageViewAssert, ImageView> {
    public ImageViewAssert(ImageView actual) {
        super(actual, ImageViewAssert.class);
    }

    public static ImageViewAssert assertThat(ImageView actual) {
        return new ImageViewAssert(actual);
    }

    public ImageViewAssert hasDrawable(Drawable drawable) {
        isNotNull();
        Drawable actualDrawable = actual.getDrawable();

        if (sameBitmap(actualDrawable, drawable)) {
            failWithMessage("error");
        }

        return this;
    }

    public ImageViewAssert hasDrawable(int resId) {
        isNotNull();
        Context context = InstrumentationRegistry.getTargetContext();
        Drawable drawable = ((BitmapDrawable) context.getResources().getDrawable(resId));
        Drawable actualDrawable = actual.getDrawable();

        if (!sameBitmap(actualDrawable, drawable)) {
            failWithMessage("error");
        }

        return this;
    }

    private boolean sameBitmap(Drawable actual, Drawable expected) {
        Bitmap actualBitmap = ((BitmapDrawable) actual).getBitmap();
        Bitmap expectedBitmap = ((BitmapDrawable) expected).getBitmap();

        return actualBitmap.sameAs(expectedBitmap);
    }
}
```

https://gist.github.com/mapyo/95664309e00aade60770

## その他
もともと、`assertj-android`で`hasDrawable`というメソッドは用意されてたんだけど、xmlのsrcにセットしてて、それを比較する場合に上手く動かなかったので、Bitmapで比較するようにした。
gitを使った開発の流れとgitコマンドの基本操作

gitを使って開発する時の備忘録

# 準備

作業場所の作成

cloneコマンド(svnのcheckoutに相当)で作業場所にソースコード一式をダウンロードする

<pre>
    $ git clone %gitのパス%
</pre>

# gitを使った開発の流れ

1. 作業場所を最新の状態にする
<pre>
   $ git pull
</pre>
2. ブランチを作成する
<pre>
   $ git branch %ブランチ名%
</pre>
3. 作成したブランチに切り替える
<pre>
   $ git checkout %ブランチ名%
</pre>
4. ソースコードを修正する
5. 修正したファイルをブランチに追加する
<pre>
   $ git add %編集したファイル%
</pre>
   ※間違ってaddした場合
<pre>
   $ git reset HEAD %編集したファイル%
</pre>
6. コミットする
<pre>
   $ git commit
</pre>
   ※エディタが開くので修正内容の説明を書く
7. リモートホストへの反映させる
<pre>
   $ git push origin %ブランチ名%
</pre>
8. Pull Requestを作成し、管理者から修正が取り込まれるのを待つ (GitHubやGitBucketなどからの操作)

# gitコマンドの基本操作

## ブランチの作成

<pre>
  $ git branch %ブランチ名%
</pre>

## ブランチの切替

<pre>
  $ git checkout %ブランチ名%
</pre>

## ブランチの一覧を見る

* ローカルブランチの一覧

<pre>
  $ git branch
</pre>
(*)が付いているブランチが選択中のブランチ

* リモートブランチの一覧

<pre>
  $ git branch --remote
</pre>

## ブランチの削除

<pre>
  $ git branch --delete %ブランチ名%
</pre>
※ マージを行っていないブランチを削除しようとすると警告が出て削除できない。マージの有無に関わらず削除したい場合は "--delete" の代わりに "-D" を指定する

## 作業場所で修正したファイルを元に戻す

<pre>
  $ git checkout -- %ファイル名%
</pre>
  ※ addする前に実行

## ファイルを以前のコミットに戻す

<pre>
  $ git checkout %リビジョン% %ファイル名%
</pre>

リビジョンはどの段階の修正に戻すかを示す。git logで履歴を見てcommit項目の値を指定する

## ファイルの変更履歴を見る

<pre>
  $ git log %ファイル名%
</pre>

実行例
<pre>
$ git log testfile.sh

commit 66072466313e95786c5c4de6a805600b51c0bce1
Author: suzutsuki0220
Date:   Wed Aug 3 17:52:00 2016 +0900

    fix setting is not apply

   :
</pre>

## 更新されたファイルの取得  (svnのupdateに相当)

<pre>
  $ git pull
</pre>

## コミット (ローカルリポジトリに保存)

<pre>
  $ git commit
</pre>

## 直前のコミットを修正する

<pre>
  $ git commit --amend
</pre>
単に"commit --amend"を実行すると、コメントの修正
ファイルの追加忘れの場合、"git add ～"を実行してから"commit --amend"を実行
余計なファイルが含まれた場合は、"git reset HEAD ～"を実行してから"commit --amend"を実行する

## リモートホストへの反映

<pre>
  $ git push origin %ブランチ名%
</pre>

## ブランチをマージする

  例) betaの変更をmasterへ適用する場合

  1. betaからmasterへ ブランチを切り替える
<pre>
  $ git checkout master
</pre>

  2. betaの修正をmasterに マージする

<pre>
  $ git merge beta
</pre>

## リモートホストへの反映

<pre>
  $ git push
</pre>

## 作業場所で変更した内容を確認する

<pre>
  $ git diff
</pre>

## ワークツリーと最終コミットの差分を確認する

<pre>
  $ git diff HEAD
</pre>

# 参考サイト

* Subversionのコマンドとの比較
http://www.backlog.jp/git-guide/reference/git-svn.html

* Gitの運用フロー
http://www.slideshare.net/add20/ss-11951387
El capitan の Homebrew で vim が入らない

Mac の Vim でクリップボードの連携が効かないとき， ビルド時のオプションが抜けているのが問題なので， `/usr/bin/vim` ではなく， Homebrew を使ってビルドした Vim に切り替えることで解決しようという記事があったので，`brew install vim`してみるも，うまくいかない．

```zsh
$ brew install vim
Warning: You are using OS X 10.11.
We do not provide support for this pre-release version.
You may encounter build failures or other breakage.
==> Downloading https://mirrors.kernel.org/debian/pool/main/v/vim/vim_7.4.712.orig.tar.gz

curl: (22) The requested URL returned error: 404 Not Found
Error: Failed to download resource "vim"
Download failed: https://mirrors.kernel.org/debian/pool/main/v/vim/vim_7.4.712.orig.tar.gz
```

書いてあるようにサポート外でビルドが通らないとかならまだしも，親に向かって `The requested URL returned error: 404 Not Found` とはなんだ，となる．

実際 404 Not Found なのが原因ではなかった．後輩に聞くと，こういうときはとりあえず　`brew doctor` するらしい．

```zsh
$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry and just ignore them. Thanks!

Warning: The /usr/local is not writable.

You should probably change the ownership and permissions of /usr/local
back to your user account.
  sudo chown -R $(whoami) /usr/local

...
```

El Capitan だと，`/usr/local` が自由にできなくなったとかで，権限を与えてやる必要があるらしい．言われるがままに `sudo chown -R $(whoami) /usr/local` (そのままコピペしてOK) すると，できるようになった．

```
$ brew install vim
==> Downloading https://github.com/vim/vim/archive/v7.4.922.tar.gz
==> Downloading from https://codeload.github.com/vim/vim/tar.gz/v7.4.922
######################################################################## 100.0%
==> ./configure --prefix=/usr/local --mandir=/usr/local/Cellar/vim/7.4.922/share/man --enable-multibyte --with-tlib=ncurses --enable-cscope --with-features=huge --with-compiledby=Homebrew --enable-perlinterp --enable-pythoninterp --enable
==> make
==> make install prefix=/usr/local/Cellar/vim/7.4.922 STRIP=true
🍺  /usr/local/Cellar/vim/7.4.922: 1620 files, 26M, built in 48 seconds
```

（おそらくアーカイブを保存するのも `/usr/local` 以下なのでダウンロードできなかった，みたいな理由だと思ったのだが，何故かしれっとダウンロード元も変わっているのは謎）
React Relay: gulp で ビルドする

# 概要

Relay を gulp でビルドする方法です。


# 環境

* [Relay](https://github.com/facebook/relay) : 0.5.0
* [graphql](https://github.com/graphql/graphql-js) : 0.4.12
* gulp : 3.9.0
* [babel-relay-plugin](https://facebook.github.io/relay/docs/guides-babel-plugin.html) : 0.4.1

# 前提

* schema の定義はできている
* React コンポーネントに GraphQL が記述されている (```Relay.QL```)

# 手順

1. ```schema.json``` を生成
2. GraphQL をコンパイル


# ```schema.json``` を生成

```graphql``` を使って ```schema.js``` から ```schema.json``` を生成します。

```js:gulpfile.babel.js
import { graphql } from 'graphql';
import { introspectionQuery } from 'graphql/utilities';

import { Schema } from '../../web/static/js/schema';

gulp.task('generate-schema', () => {
  return graphql(Schema, introspectionQuery)
    .then(result => {
      if (result.errors)
        return console.error('[schema]: ERROR --', JSON.stringify(result.errors, null, 2));
      fs.writeFileSync(
        path.join(__dirname, '../../web/static/js/schema/schema.json'),
        JSON.stringify(result, null, 2)
      );
      return null;
    });
});

```

# GraphQL をコンパイル

babelify (or babel) のプラグインに Relay のプラグインを指定します。
babelify なら transform の bebelify のかわりに ```babelify.configure( {plugins: [getbabelRelayPlugin(schema.data)]} )``` を指定します。

```js:gulpfile.babel.js
let getbabelRelayPlugin = require('babel-relay-plugin');
let schema = require('../../web/static/js/schema/schema.json');

browserify({
    entries: sourceFile,
    paths: ['.'],
    transform: [babelify.configure( {plugins: [getbabelRelayPlugin(schema.data)]} )]
  })
    .bundle()
    .pipe(source(destJsGraphql))
    .pipe(gulp.dest(dirDestJs));
});
```

# 最後に

GraphQL が普及すれば、JSX のように babel の標準プラグインで対応されるのでしょうか。

# 参考

* [Babel Relay Plugin | Relay Docs](https://facebook.github.io/relay/docs/guides-babel-plugin.html)
* [fortruce/relay-skeleton](https://github.com/fortruce/relay-skeleton)
CakeSchemaクラスのモデル定義の継承

CakePHPでモデル（テーブル）定義をする場合は、CakeSchemaクラスを継承して定義をする場合があります。
基本はモデルごとに定義をしますが、中には以下のような場合があります。

A. マスターデータのインポートのためのテンポラリテーブルで、同じフィールド（カラム）定義の別名のモデル（テーブル）が必要
B. 追加日時、更新日時等、各モデル共通のフィールドが存在する

上記のケースの場合は各モデルのCakeSchemaクラスで各々定義するのではなく、上記の内容を集約したCakeSchemaクラスを継承したほうがスムーズに実装できます。
今回は上記A.を例にその方法を紹介します。

# 1. マスターデータモデルのCakeSchemaクラスを定義
```lang:users.php

class UsersSchema extends CakeSchema {

	public $file = 'users.php';

	public $connection = 'default';

	public function before($event = array()) {
		return true;
	}

	public function after($event = array()) {
	}

	public $users = array(
		'id' => array('type' => 'integer', 'null' => false, 'default' => null, 'unsigned' => true, 'key' => 'primary'),
		'name' => array('type' => 'string', 'null' => true, 'default' => null, 'length' => 60, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
		'phone' => array('type' => 'string', 'null' => true, 'default' => null,'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
		'email' => array('type' => 'string', 'null' => true, 'default' => null,'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
		'birthday' => array('type' => 'datetime', 'null' => true, 'default' => null,'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
	);
}

```

# 2. マスターデータのインポートのためのテンポラリモデルのCakeSchemaクラスを定義

```lang:user_temps.php

App::uses("UsersSchema", "/Config/Schema");
/**
 * 差分だけ定義する
 */
class UserTempsSchema extends UsersSchema {

	public $file = 'user_temps.php';

	public $user_temps = array();

	/**
	 * コンストラクタ
	 * @param array $option
	 */
	public function __construct($option = array()) {
		// テーブル定義が同一のため、内容を反映
		$this->user_temps = $this->users;
		parent::__construct($option);
	}
}
```

# 上記.Bの実装時の注意事項
上記B.の場合は、上記1.と2.の内容を下記の定義のように行い、

1.：各モデル共通のフィールド
2.：各モデル各々のフィールド

2.を定義したクラスで以下のようにして結合することで対応ができます。

```lang:user_temps.php
	public function __construct($option = array()) {
		// 共通定義を追加
		$this->user_temps ＋= $this->users;
		parent::__construct($option);
	}
```

ただし、CakeSchemaクラスをアプリケーション起動時に自動でインポートしているような場合は、1.のクラスはabstractクラスとして定義したほうが良さそうです。
Docker MachineのVirtualBoxストレージ容量を増やす方法

![スクリーンショット 2015-11-17 14.56.27.png](https://qiita-image-store.s3.amazonaws.com/0/1676/1317a321-d481-ea15-358a-e8d5e80d5ef7.png)

Docker Machineの中のデータを全部消してしまっても良い方や、今から作る方用のTipsっていうか抜粋メモです。Docker Imageがバカでかくなってしまった方や、沢山の種類を管理している方に。

1. 古いmachineの削除
2. 新しいmachineの削除
3. バックアップのための参考程度のメモ

### 古いmachineの削除

```
docker-machine rm default
```

`default` はvirtualbox上のイメージ名です。(defaultがデフォルトです。)

### 新しいmachineの作成

```
docker-machine create -d virtualbox --virtualbox-disk-size 40000 default
```

virtualbox-disk-sizeの単位はMBです。上記は40GB指定。デフォルトは20GBだったかと思います。

### バックアップのための参考程度のメモ

`docker images` してpull対象のレポジトリ名、タグなどをメモっておくと良いと思います。
machine作成後、それらを全部pullすれば完了です。

参考:

- http://docs.docker.com/machine/reference/create/
- https://github.com/docker/machine/blob/ae027c355db630b7cda4ed2397df64d45182059a/drivers/virtualbox/virtualbox.go#L98
カンマ区切り重複排除

```ruby:filename.sql
--DROP FUNCTION IF EXISTS DISTINCT_SET;
DELIMITER //
CREATE FUNCTION DISTINCT_SET(instr VARCHAR(65535)) RETURNS VARCHAR(65535) DETERMINISTIC 
BEGIN
  DECLARE i INT Default 0;
  DECLARE part VARCHAR(65535);
  DECLARE ret  VARCHAR(65535) DEFAULT NULL;  
  lp: LOOP
     SET i=i+1;
     SET part=REPLACE(SUBSTRING(SUBSTRING_INDEX(instr, ',', i),LENGTH(SUBSTRING_INDEX(instr, ',', i-1)) + 1),',', '');
     IF NULLIF(part,'') IS NULL THEN
        LEAVE lp;
     END IF;
     IF FIND_IN_SET(part,IFNULL(ret,'')) = 0 THEN
	 	SET ret=CONCAT_WS(',',ret, part);
	 END IF;
   END LOOP lp;
   RETURN ret;
END;
//
DELIMITER ; 
--SELECT DISTINCT_SET('apple,orange,banana,orange');
```

DISTINCT_SET('apple,orange,banana,orange')
apple,orange,banana
Continuation-passing style (継続渡し)、Haskell のリストと差分リストから、あと米田の補題

#はじめに

[前回の投稿](http://qiita.com/bra_cat_ket/items/451dc2977270d686e2ff)から少々考えていたのだが、やや理解が固まったので書いてみる、ただ中身は前回から少しも増えていない。

何を考えていたかというと、リストから差分リストへ変えたことで効率が上がったが、これはたまたまこの場合のみ使えるテクニックなのかあるいは何か背景があるのか？という疑問である。
これの答えはある程度肯定的であって、普通のリストと差分リストの間のような関係がもっと一般的に存在することが分かった、しかもその間を結ぶのが（お気に入りの）米田の補題である、なんと。

つまり、ある種の最適化問題はデータあるいは関数の型を継続渡しスタイルというのに変えるということに帰着していて、かつこれは必ず実行可能である、ということらしい。

元ネタは[これ](http://www.mis.mpg.de/lecture-materials/funk-prog/haskell05.pdf)

多分書いたのはこの人[Dr. Georg Martius](http://www.mis.mpg.de/jjost/members/georg-martius.html)

#継続渡し
CPSと略されるこの形式の一般論には深く立ち入らないことにする、というかよく知らない。
ここでは元ネタからの引用のみにしておく、興味ある人は調べて下さい、知ってる方は教えて下さい。

> CPS is a way to write a function that explicitly tracks what is being done with its return value.

> In CPS every function is tail-recursive and the rest of the computation is handled in the new continuation that is handed to the recursive call.


#米田の補題
圏論の試金石的な大定理、手前味噌的に自分の過去の資料を貼ってみる
[ついでに絵算も宣伝がてら。](http://www.slideshare.net/raysameshima/yoneda-lemma-and-string-diagrams)

つまり以下の同型（一対一写像が存在する）が言えるということだ

```math
Nat(C(A,-),F) \equiv FA
```

左辺は(arrowからarrowへの）arrowで右辺はobjectにあたり、この場合左辺のCPSと右辺の普通のスタイルが一対一に対応してますよ、ということになる。

#リストと差分リスト（おさらい）
リストと差分リストは両方共モノイドである、つまりconcatenationなる二項演算（つまりは積）があって連結できる、がその連結の仕方が微妙に異なるのである、ここがみそ。

普通のリストは

```
"cat"
```

みたいなもので、これの結合は(++)関数。
それに引き換え差分リストは

```
\xs -> "cat" ++ xs
```

という定義でかつ結合はなんと関数適用(.)、念のため定義を書くと

```
g.f = \x -> g (f x)
```

となっている。

さてでは[前回の投稿](http://qiita.com/bra_cat_ket/items/451dc2977270d686e2ff)
から例を拝借して説明してみる、まずは普通のかつ効率のよいリストの結合

```
"cat" ++ ("fish" ++ "burger")
```

諸事情によりこの連結が出来ずに泣く泣く

```
("cat" ++ "fish") ++ "burger"
```

の順番でしか結合できないとする。

さて差分リストは定義からすでに矢印的であり、詳細は[前回の投稿](http://qiita.com/bra_cat_ket/items/451dc2977270d686e2ff)にある通り

```
\xs -> "cat" ++ ("fish" ++ ("burger" ++ xs)
```
となって効率良い連結順になる、というわけである。

しかも差分リストの連結は関数の積であり、これはまさにCPSであると言える、バンザイ。

#間の対応

> Yoneda’s lemma now states that programs in regular style and CPS are isomorphic.

リストと差分リストの間の一対一対応はほとんど見て明らかだが、圏論的に考えればこれは一般的に成り立つ事実である、ということである。

#おわりに
少々尻切れトンボな感じが否めないが、もともとモナドについて調べ物している時の副産物なので平にご容赦を、あと全体的にあまり正誤に自信がないので詳しい方いらしたら教えて下さい。
【Excel】Shift+Spaceで行全体選択できない現象を引き起こさない方法

Excelで、行全体を選択したいとき、
日本語入力時にShift+Spaceで行選択できなくて
イライラしたことがある方、私だけじゃないと思います。
なのでそれの回避方法を共有いたします！

==============================================
▼IME日本語入力を使用している方
1．画面右下のIMEの設定からプロパティを選択
2．編集操作の変更を選択
3．「Shift+Space」の設定が「別幅空白」になっているためいらっとしてしまうので変更。
4．「-」を選択してOK！

==============================================
▼google日本語入力を使用している方
1.画面右下、google日本語入力のレンチのアイコンから、プロパティ選択
2.「一般」タブの、キー設定の選択の「編集」を選択
3.出てきたリストの下の方の、モード「入力文字なし：Shift Space」を選択
4.「編集」メニューの「選択されたエントリーを削除」を実行
 

このように設定するといらっとすることがなくなると思います！
是非ご活用ください。
JAVA 15.10練習問題(P597)


練習15-2 解答

```java

public class Test08 {
	public static void main(String[] args) {

		try {
			String s = null;
			System.out.println(s.length());

		} catch (NullPointerException e) {
			System.out.println("NullPointerException例外をcatchしました");
			System.out.println("――スタックトレース（ここから）――");
			e.printStackTrace();
			System.out.println("――スタックトレース（ここから）――");
		}
	}

}
```

練習問題 15-3 解答

```java
public class Test09 {
	public static void main(String[] args) {
		try {
			int i = Integer.parseInt("三");
		} catch (NumberFormatException e) {
			System.out.println("例外NumberFormatExceptionをcatchしました");

		}
	}
}
```

練習問題15-4 解答

```java
import java.io.IOException;

public class Test10 {
	public static void main(String[] args) throws IOException {
		System.out.println("プログラムが起動");
		throw new IOException("エラー!");
	}
}
```
SQL Server Management Studio(2008 / 2012) のデザインを使用して大きなサイズのテーブルを変更

テーブルのデザインを使って複数の列の桁数を変更しようとした時のメモ

Management Studioの「ツール」ー「オプション」を開いて「デザイナー」を選択

「トランザクションがタイムアウトするまでの時間」を変更する

例）10800：3時間
最大 65535 (秒) らしい
0 は不可なので無制限はなし？

いつまで経っても終わらないのは良くないので、タイムアウトはあったほうが良いとは思いますが。

参考：
https://support.microsoft.com/ja-jp/kb/915849


ちなみに、デザイナー項目にある
「テーブルの再作成を必要とする変更を保存できないようにする」
のチェックを外していなければ「変更の保存が許可されていません」のエラーになる。

参考：
https://support.microsoft.com/ja-jp/kb/956176
arduinoで楽器

#概要
arduino unoで楽器を作る。
右がヴォリューム、左が音階。
#写真
![MVC-001S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/edd8400d-e3f6-1a72-2d51-6ff229d7f9b3.jpeg)
#サンプルコード
```
#define OC2B		 		3
#define VSCALE				128
const byte table[] = {
	58, 58, 65, 69, 69, 77, 77, 86, 92, 92, 103, 103, 115, 115, 129, 137, 137, 154, 154, 173, 183, 183, 206, 206, 231, 231, 259, 274, 274, 308, 308, 346
};
int pitch;
int volume;
uint16_t Acc1;
uint16_t Inc1;
uint16_t Acc2;
uint16_t Inc2;
byte wave;
float gain;
int sawtooth(int phase)
{
	return phase / 2;
}
int triangle(int phase)
{
	return phase > 255 ? 511 - phase : phase;
}
int square(int phase)
{
	return phase > 255 ? 255 : 0;
}
void setup()
{
	pinMode(OC2B, OUTPUT);
	TCCR2A = _BV(COM2B1) | _BV(WGM20);
	TCCR2B = _BV(CS20);
	TIMSK2 = _BV(TOIE2);
	Acc1 = 0;
	Acc2 = 0;
	Serial.begin(9600);
}
void loop()
{
	pitch = analogRead(A0);
	//Serial.println(pitch);
	volume = analogRead(A1);
	if (pitch < 1)
	{
		pitch = 0;
	}
	else if (pitch > 992)
	{
		pitch = 992;
	}
}
SIGNAL(TIMER2_OVF_vect)
{
	//Inc1 = 2 * pitch;
	Inc1 = 2 * table[pitch / 32];
	Inc2 = Inc1 + 1;
	gain = volume / (float) VSCALE;
	if (gain < 0.0)
	{
		gain = 0.0;
	}
	else if (gain > 1.0)
	{
		gain = 1.0;
	}
	Acc1 = (Acc1 + Inc1) % 8192;
	Acc2 = (Acc2 + Inc2) % 8192;
	wave = (byte) ((sawtooth(Acc1 / 16) + triangle(Acc2 / 16)) / 2);
	OCR2B = (int) ((float) wave * gain);
}
```
golangでImageMagickを触りたい

# golangでImageMagickを触りたい

これ使う。
https://github.com/gographics/imagick

debianな人は `libmagickwand-dev` が必要なので入れておく。
redhatな人は `ImageMagick-devel` こっち。

[MagickWand](http://www.imagemagick.org/script/magick-wand.php) の API ラッパーなので基本他と一緒。
なのでいったん他の言語(phpとか)で試してからgolangに書き下すといいかんじ。

## サンプル

* `base.jpg` の上に
* `overlay.png` を `100x100` にリサイズして
* ど真ん中に乗せて
* `png` フォーマットで
* stdout に出力する
* と同時に `out.png` にも出力

```go
package main

import (
	"fmt"
	"os"

	"github.com/gographics/imagick/imagick"
)

func main() {
	imagick.Initialize()
	defer imagick.Terminate()

	// 下地
	mw1 := imagick.NewMagickWand()
	defer mw1.Destroy()
	err := mw1.ReadImage("base.jpg")
	if err != nil {
		panic(err)
	}
	w1 := mw1.GetImageWidth()
	h1 := mw1.GetImageHeight()

	// 上モノ
	mw2 := imagick.NewMagickWand()
	defer mw2.Destroy()
	err = mw2.ReadImage("overlay.png")
	if err != nil {
		panic(err)
	}
	// リサイズして
	err = mw2.ResizeImage(100, 100, imagick.FILTER_POINT, 0)
	if err != nil {
		panic(err)
	}
	w2 := mw2.GetImageWidth()
	h2 := mw2.GetImageHeight()

	// ど真ん中に乗せる
	err = mw1.CompositeImage(mw2, mw2.GetImageCompose(), int((w1-w2)/2), int((h1-h2)/2))
	if err != nil {
		panic(err)
	}

	err = mw1.SetFormat("png")
	if err != nil {
		panic(err)
	}
	// stdoutに吐く
	blob := mw1.GetImageBlob()
	os.Stdout.Write(blob)

	// ファイルにも吐く
	mw1.WriteImage("out.png")

	fmt.Fprintln(os.Stderr, "FINISH!!")
}
```
Qiitaに思うことなど

Qiitaにここ半年ほど持っていた雑感を吐露する雑文。Qiitaに満足している人は読む必要なし。

日頃よく使わせてもらっておいてこんなことを言うのも申し訳ないが、個人的にQiitaはチラシサイトだと思っている。

その時々の最新情報を発信し伝播させるためのサービス。用が済んだ情報は打ち捨てられる。ノウハウの蓄積ではない。ブログの延長のようなサービスだ。しかしQiitaはこれをナレッジベースとして使ってもらいたいらしい。無理だと思う。

Qiitaがナレッジベースになるには欠けているものがある。コンテンツの更新能力とコンテンツの評価機能だ。Qiitaを使っていて一番嫌なのは2年も3年も前の古いチラシが上がってきて、しかもそれが今現在有効なのかわからないことだ。Qiitaにはコンテンツの今の価値を示す、コンテンツの更新機能も評価機能もない（ストックが評価指標として有用でないことは以前にも指摘があったはずだ）。

正確には第三者によるコンテンツのアップデートとアクセス時点でのリアルタイム評価というナレッジベースに必要な利用形態をユーザーのメンタルモデルとして構築する機能と設計がない。当然文化など望むべくもない。

もともとQiita自身がブログや情報発信といった刹那的で成長を前提としない形態の情報を扱うデザインとなっているのだからユーザーもそのような記事を書くし、読者もそれをアップデートしていったり陳腐化して用を成さなくなったことをこれから読む人に伝えようとしたりもしない（これは目立つことを恐れる日本人の気質とそのようにさせた日本の文化のせいでもあるが）。Q&Aでも特定の技術的詳細に焦点を絞ったものでもない（技術的焦点が絞られていれば焦点の陳腐化とそれを扱った情報の陳腐化が同期するので不必要に人の目に触れることもない）、育てていくことを意識してブラッシュアップされていない記事を成長させていけというほうが無理な相談だ。この点フロントランナーたる技術者の書いたチラシはチラシとして死ぬべき時期が設定されておりさすがというべきか。

Qiitaもいい加減この問題に取り組み始めたと見え、最近1年以上更新のない記事に注意書きがでるようになったが、まるで意味がない。個々の機能を場当たり的に放り込んでも生態系の一部となってシナジーを生むものでなければ余計な手間が増えて使いにくくなるだけだ。そして仮にユーザーが自発的に奮起して記事のアップデートに積極的に取り組んだとしてもサービスの設計とのミスマッチに飲み込まれてやがて消える。戦術的成功で戦略的失敗を回復させることはできないの格言どおりである。

Qiitaがナレッジベースを指向しながら自身をユーザーにナレッジベースの利用者としてのメンタルモデルを構築するサービスに刷新できなければ年々増えていくチラシの山にいずれ押し潰されて消えるだろう。Googleのやり手エンジニアがアイデアを引っさげてやってきたそうだがQiitaはどう変わるのだろうか。

---

余談１：失敗したサービスは優れた機能まで無に帰す一方、逆に優れた機能だけを切り出して優れたサービスにすることはできるようで、そうしたベンチャーだかスタートアップだかの成功例もあるようだ。

余談２：Qiitaの1年以上更新のない記事の注意書きはなんら利用モデルのない、ユーザーを困惑させるだけの機能である。そしてユーザーが涙ぐましく更新したとしても設計の欠陥は覆せない不幸の機能である。

---

追記：対案を出せという論調をよく見る昨今なので一応対案も出しておく。

#### A. ナレッジベースの追求

StackOverflowの機能をかいつまんで取り込むだけで日本語版StackOverflow以上の地位は確保できると思う。
同種のナレッジベースである必要はない。
サービス、コンテンツとコミュニティの連続性の維持に配慮が必要。

#### B. パブリックブログとしての改善

古いチラシをうまく隠すだけでサービスの維持はできると思う。
取れるターゲットは取り尽くした感があるので他の商品やサービスで多角展開しないとこれ以上の躍進はなさそう。
ブログ中心に方針を転換すれば別の道もあるだろうか。

#### C. 革新的打開策

見当もつかない。
qRegisterMetaTypeしているにもかかわらずQObject::connectでランタイムエラーが出る場合の回避策


Qt5でシグナルの引数としてユーザー定義型を指定する場合は、`Q_DECLARE_METATYPE`と`qRegisterMetaType()`を使って方の登録を行う必要がある。

参考: http://doc.qt.io/qt-5/qmetatype.html#Q_DECLARE_METATYPE

ただしまれに(`typedef`された型を登録する際？)登録を行っても以下のランタイムエラーが出てしまうことがある。

```
QObject::connect: Cannot queue arguments of type 'SomeUserDefinedType'
(Make sure 'SomeUserDefinedType' is registered using qRegisterMetaType().)
```

このような場合は以下の通り`qRegisterMetaType()`の引数を設定することで回避できることがある。

```cpp
qRegisterMetaType<SomeUserDefinedType>("SomeUserDefinedType");
```
`unzip linux.zip`で`symlink error: File name too long`が発生 -> unzipの古いバージョンでのエラーだった

linux.zipをunzipで解凍しようとしたらエラーが発生したときの対処メモ。

# エラー内容

`unzip linux.zip` とした場合にsymlinkの解凍時にエラーが発生した。

以下のIssueが同様のエラーなので引用する。

[unzip tarball fail on symlink error: File name too long · Issue #34 · raspberrypi/linux:](https://github.com/raspberrypi/linux/issues/34)

```shell-session
$ unzip raspberrypi-linux-b683e89.zip
finishing deferred symbolic links:
raspberrypi-linux-b683e89/arch/microblaze/boot/dts/system.dts -> ../../platform/generic/system.dts
raspberrypi-linux-b683e89/drivers/scsi/aacraid/linit.c -> /^J *^IAdaptec AAC series RAID controller driver^J *^I(c) Copyright 2001 Red Hat Inc.^J *^J * based on the old aacraid driver that is..^J * Adaptec aacraid device driver for Linux.^J *^J * Copyright (c) 2000-2010 Adaptec, Inc.^J * 2010 PMC-Sierra, Inc. 
~ 中略 ~
Adaptec NEMER/ARK Catch All /^J^I{ aac_src_init, "aacraid", "ADAPTEC ", "RAID ", 2 } / Adaptec PMC Catch All /^J};^J^J/^J *^Iaac_queuecommand^I-^Iqueue a SCSI command^J *^I@cmd:^I^ISCSI command to queue^J *^I@done:^I^IFunction to call on command completion^J *^J *^IQueues a command for execution by the associated Host Adapter.^J *^J *^ITODO: unify with aac_scsi_cmd().^J */^J^Jstatic int aac_queuecommand_lck(struct scsi_cmnd *cmd, void (done)(struct scsi_cmnd *)...
symlink error: File name too long
```

symlink の LINK_NAME がファイルの内容になってしまっている。
Issueの中のコメントでもあるが、どうやらunzipの古いバージョン特有のバグらしい。

[git - "git archive" seems to be broken wrt zip files:](http://git.661346.n2.nabble.com/quot-git-archive-quot-seems-to-be-broken-wrt-zip-files-td6780039.html)

上のリンク先でunzipにバグが有ることが言及されている。

# unzipのバージョン

```shell-session
$ unzip --version
UnZip 6.00 of 20 April 2009, by Info-ZIP.  Maintained by C. Spieler.  Send
```

少なくとも ubuntu 12.04 や fedora17 以下では再現すると思われる。

# 対処法

(※あくまでもzipで解凍が必要な場合の対処法。tar.gz等があるならそちらを使えば良い。)

7zipを使う（古いunzip特有のバグのため、unzip以外なら問題ない）


```bash:インストール
# yum
sudo yum install p7zip
# apt
sudo apt-get install p7zip-full
```

```bash:解凍
7za x linux.zip
```

# 参考
[unzip tarball fail on symlink error: File name too long · Issue #34 · raspberrypi/linux:](https://github.com/raspberrypi/linux/issues/34)
[git - "git archive" seems to be broken wrt zip files:](http://git.661346.n2.nabble.com/quot-git-archive-quot-seems-to-be-broken-wrt-zip-files-td6780039.html)
SDKを使わないでSNSに投稿する

Twitter,Facebook,LINEの各SNSに、それぞれのSDKやAPIなどを使用せずに投稿する手段のまとめ。
使うのは主に以下の手段です。

・暗黙的Intent(ACTION_VIEW) + URLスキーマ(Twitter公式、LINE)
・暗黙的Intent(ACTION_SEND) + ExtraDatas(Twitter, Facebook)

#1 公式Twitterアプリへのテキスト投稿

テキストのみ投稿する場合は、Twitterの公式URLスキーマが使えます。
messsage文字列は、URLエンコードが必要です。(特にハッシュタグ#付きにする場合)

```java:ShareWithTwitter1.java
Intent intent = new Intent(Intent.ACTION_VIEW);
String messsage= Uri.encode("テスト ＃コメント");
intent.setData(Uri.parse("twitter://post?message=" + messsage));
startActivity(intent);
```

ただしこの手法は、現在のところ、公式アプリしか起動出来ません。
(上記URLスキーマに対応するアプリがあれば、自動的にアプリ選択画面になるかと思われます)
また、URLスキーマで画像を投稿する手段はありません。

#2 Twitterクライアントへのテキスト及び画像投稿

公式以外のTwitterクライアントにも投稿したい場合や、画像を投稿したい場合は、通常の暗黙的Intentで行います。

```java:ShareWithTwitter2.java

String message="テスト ＃コメント";
String imagePath="任意の画像パス";

ShareCompat.IntentBuilder builder = ShareCompat.IntentBuilder.from(this);

// データをセットする
builder.setChooserTitle("Choose App");
builder.setText(message)
if(imagePath!=null){
  builder.setType("image/png")
  builder.addStream(Uri streamUri)
}else{
  builder.setType("text/plain")
}
// アプリ選択画面を起動
builder.startChooser();
```

注意する点としては、画像のpathは、対象のアプリが読み込める場所になければなりません。つまり、アプリのローカルフォルダなどではダメで、DownloadフォルダやSDカードフォルダ、コンテンツプロバイダのUriなどを渡す必要があります。
また、これだけだと、ACTION_SENDで"text/plain"または"image/*"などに反応するアプリはすべてリストに上がってしまいます。
Twitter関連のアプリに限りたい場合は、Intent.createChooserにEXTRA_INITIAL_INTENTSを指定して選択画面を出すか、独自にフィルタしてアプリ選択画面を自前で表示する必要があります。

尚、Inent.createChooserの方法だと、手持ちの端末ではなぜか"image/png"のときに公式Twitterアプリが出てこないなどしたので、私は自前で選択画面を表示することにしました。
createChooserでやる方法は、こちらが参考になるかと思います。
[TwitterやFacebookに投稿する方法](http://android-note.open-memo.net/sub/system__share_with_sns.html)

すべてのTwitterクライアントを網羅するのは難しいですが、例えば上記ページのメソッドのキーワードを、Listで渡せるようにして、メジャークライアントのパッケージ名(の一部)を入れてやれば実用的な絞り込みリストにはなると思います(マイナーなクライアントを使っているユーザーから「選べない！」とクレームが来る可能性はありますが）

#3 Fackbookへリンクを投稿する

Facebookへは、暗黙的Intentの方法ではリンクしか投稿出来ません。
メッセージや画像を投稿したい場合は、素直にSDKを導入して下さい。

こちら([TwitterやFacebookに投稿する方法](http://android-note.open-memo.net/sub/system__share_with_sns.html))で紹介したページのメソッドを使うならば、"facebook"をキーワードに入れてあげれば簡単です。
なお、それだとメッセンジャーアプリも候補に入ってしまうので、避けたい場合は、キーワードを"facebook.katana"にしてあげればOK。（メッセンジャーアプリは別アプリなのでfacebook.以下が異なる）

#4 LINEへテキストまたは画像を投稿する

LINEはURLスキーマだけでテキストも画像も投稿出来ます。
ああなんて楽ちん。

テキストを投稿する場合

```java:shareWithLineMessage.java
Intent intent = new Intent(Intent.ACTION_VIEW);
String messsage= Uri.encode("テスト ＃コメント");
intent.setData(Uri.parse("line://msg/text/" + messsage));
startActivity(intent);
```

画像を投稿したい場合

```java:shareWithLineImage.java
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("line://msg/image/" + imagePath));
startActivity(intent);
```

messsage文字列は、URLエンコードが必要です。
画像のpathは、LINEアプリが読み込める場所になければなりません。
また、画像は即投稿されます。デバッグ中に変な物を人に送りつけないように注意ｗ

それぞれ、アプリがインストールされていない場合の対処をお忘れなく。
onlineTool > block diagram > www.draw.io

ブロックダイアグラムを書きたくなった。

検索ですぐに見つかったのが以下。

https://www.draw.io/

- google drive / dropboxへ保存可能
- PDFなどのexport可能
- 動作が軽快

まだ使い始めなので、まだ色々あるかもしれない。

<hr>
(追記 2016/02/18)

現在設計中の警報システムのデザインに使ってみたが、結構使いやすい。
設計中のものはこちらで作ってしまうのがよさそう。

設計完了したものをwebなどに公開する時はYUMLを使うのもいい。
python > tupleをlistへ変換 > aList = list(pi_tuple)

Python Programming
https://www.youtube.com/watch?v=N4mEzFDjqtA&list=WL&index=34
の12:40あたりから

http://ideone.com/5qjmpX

```test.py
pi_tuple = (3,1,4,1,5,9)
aList = list(pi_tuple)

print aList[0]
print aList[1]
print aList[2]
```

```txt:結果
Success	time: 0.02 memory: 44632 signal:0
3
1
4
```
【Unity5】uGUIの手前にパーティクル(Particle System)を表示する方法

uGUIでUIを作るとそのままの状態ではUIの後ろにパーティクルが隠れてしまいます。
uGUIの手前にパーティクルを表示する方法でつまづいたので調べて記事にまとめてみました。 
ちなみにこの記事で使っているUnityのバージョンは 5.2.1p3 です。

![image](https://qiita-image-store.s3.amazonaws.com/0/44288/e62a0eec-ce88-358c-0a59-1b5747db6189.png)

#方法1. CanvasのRenderModeを「Screen Space - Camera」にする
CanvasのRenderModeを「Screen Space - Camera」にしてRender Cameraにカメラをアタッチ.
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/c2ca45db-ed27-3258-51b7-b87e194b70ea.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/44288/94a22b32-899e-e28a-c500-14bf5593bbf0.png)
UIの手前にパーティクルが表示されました。

#方法2. CanvasのRenderModeを「World Space」にする
 CanvasのRenderModeを「World Space」にして、UIがパーティクルの後ろにくるようにUIの位置を調整。
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/3c0b3e45-eff9-1e8a-c39e-1fc589968c8e.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/44288/94a22b32-899e-e28a-c500-14bf5593bbf0.png)
UIの手前にパーティクルが表示されました。

#補足 - ParticleSystemとuGUIの描画優先度について

・CanvasのRenderModeが「Screen Space - Overlay」の場合は常に手前にUIが表示されるみたいです。

・ParticleSystem と UI の Order in Layer が同じ場合 
　座標の前後によって描画順が決まります。(UIの手前にパーティクルがあればパーティクルが手前に表示されます。)

・ParticleSystemの Order in LayerがUIの Order in Layer より小さい
　パーティクルがUIの後ろに隠れます

・ParticleSystemの Order in LayerがUIの Order in Layer より大きい
　パーティクルがUIの手前に表示されます


![image](https://qiita-image-store.s3.amazonaws.com/0/44288/d17f6013-9dcd-50b9-ac50-ec59b0a91df3.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/44288/e70c4419-e16e-e42d-a370-b6fc72f134d5.png)
python > all_list = [ grocery_list, other_list]

Python Programming
https://www.youtube.com/watch?v=N4mEzFDjqtA&list=WL&index=34
の10:00頃から

http://ideone.com/78Mn7I

```test.py
grocery_list = [ 'AAA', 'BBB', 'CCC']
other_list = [ '111', '222', '333']
all_list = [ grocery_list, other_list]

print(all_list)
print(all_list[1][1])
```

```txt:結果
Success	time: 0.03 memory: 44632 signal:0
[['AAA', 'BBB', 'CCC'], ['111', '222', '333']]
222
```
改行コード > LF: Unix系OS | CR+LF: Windows | CR: MacOS(バージョン9まで) | LF: Mac OS X

現在作成中のline monitorに関連して、改行コードが気になった。


参考
http://ash.jp/code/return.htm

- LF : UNIX系OS
- CR : マッキントッシュ
- CR+LF : Windows

上記の「マッキントッシュ」はどのOSのことなのだろうか。Mac OS Xでもそうなのか?

http://urashita.com/archives/1296
> CR : MacOS (バージョン9まで)
> LF : ... Mac OS X

MacOSバージョン9までとのこと。

当面、自分が関係しそうなのはLF / CR+LFのようだ。
UITableViewCellの上にあるViewのタップ感度が悪い


わりと何度もこの問題にはぶつかっていて、

```swift
tableView.delaysContentTouches = false
```

だよね。と思っていたんだけど、今回はこれだけではダメだった。

# 解決した方法

```swift
tableView.delaysContentTouches = false

for case let v as UIScrollView in tableView.subviews {
    v.delaysContentTouches = false
}
```

どうやら`subview`の中にも`UIScrollView`がいたらしい。

# 色々調べていて

```swift
tableView.canCancelContentTouches = false
```

とか

```swift
tableView.panGestureRecognizer.delaysTouchesBegan = false
```

で解決するという話も見かけた。

今回は、これらが無くても改善したので一応メモとして残しておく。