OmniAICreator/Qiita-1.07M huggingface dataset:
IonicアプリのiOS10対応メモ

[iOS 10 で Cordova/Phonegap アプリが動かなくなった](http://qiita.com/s_of_p/items/925f512f8bec2e5959db) の記事を見かけてIonicアプリをアップデートして審査に出すまでに起きた事柄のメモです。


## iOS10でCordovaアプリが起動しない？

deviceready イベントが発火しなくなった、ということなので記事とその参照先を参考にindex.htmlにmetaタグを追加した。

```index.html
<meta http-equiv="Content-Security-Policy" content="default-src * gap://ready file:; style-src 'self' 'unsafe-inline'; img-src 'self' data:; script-src * 'unsafe-inline' 'unsafe-eval'">
```


## Provisioning Profileが上手く認識されない

ちょうどApple Developer Programの更新時期を迎えていたので更新したつもりだったけど新しいProvisioning Profileが認識されず、実機にインストールできなくなった。

Xcode 8で追加された Automatically manage signing にチェックを入れるとよしなにやってくれた。


## XcodeでArchiveしてストアにアップロードするときに弾かれる

実機で動作確認をしてようやくアップロード、というところでこんなメールが来た。

```
Dear developer,

We have discovered one or more issues with your recent delivery for "アプリ名". To process your delivery, the following issues must be corrected:

This app attempts to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.

Once these issues have been corrected, you can then redeliver the corrected binary.

Regards,

The App Store team
```

[[iOS 10] 各種ユーザーデータへアクセスする目的を記述することが必須になるようです](http://dev.classmethod.jp/smartphone/iphone/ios10-privacy-data-purpose-description/)

QRコード読み取り用のプラグインがフォトライブラリへのアクセスを要求していると思われる。
Ionic/CordovaではiOS向けのInfo.plistはビルド時に生成されるので直接書き換えるのはよろしくない。

[cordova-plugin-settings-hook](https://www.npmjs.com/package/cordova-plugin-settings-hook) を使うとconfig.xmlに書いたiOS向けの設定をInfo.plistに反映できるので、プラグインを追加してconfig.xmlに必要な設定を書く。

```
$ ionic plugin add cordova-plugin-settings-hook
```

```config.xml
  <platform name="ios">
    <config-file platform="ios" target="*-Info.plist" parent="NSPhotoLibraryUsageDescription">
      <string>for QR Code reading</string>
    </config-file>
    ...
```

```
$ ionic build ios
```

ビルドしてみて``アプリ名-Info.plist``に NSPhotoLibraryUsageDescription の記述が追加されていたらOK。


## iPad Pro向けのスクリーンショットを追加

5ヶ月ぶりにアップデートしたのでサポート端末にiPad Proが追加されており、そのスクリーンショットを要求された。
XcodeでiPad Proのエミュレータを起動してスクリーンショットを撮って貼り付け。

めでたく審査待ちに。
↓
翌日リリースできました。
Custom Field Templateプラグインで固定ページのテンプレート選択がプレビューに適用されない件

WordPressの人気プラグインで、カスタムフィールドを簡単に実装できる「カスタムフィールドテンプレート（Custom Field Template）」というものがあります。
↓これ
https://ja.wordpress.org/plugins/custom-field-template/

## 以下の出来事があり困ったので、報告と解決方法を。

1. WordPress 4.6.1を使用中（ここは検証していないので、他のバージョンでもそうなるかもだし、同じ環境でもならないかも）
2. カスタムフィールドテンプレート（Custom Field Template）プラグインをインストール
3. 固定ページの編集画面でページテンプレートを「デフォルト以外のテンプレート」を選択している
4. 上記の状態で「プレビュー」をクリックしてページを開くと、上記３.で選択したテンプレートが適用されずに開いてしまう。

という困ったことが起きて泣きそうに・・・

## 解決方法

functions.phpに以下のコードを書くことで解決しました。

```php:functions.php
add_filter('get_post_metadata',function($return, $post_id, $meta_key, $single){
  global $post;
  $page_template_key='_wp_page_template';
  if (($meta_key==$page_template_key) && isset($post) && $post->ID == $post_id && is_preview()){
    //プレビュー状態のとき
    global $wpdb;
    $return=$wpdb->get_var($wpdb->prepare('SELECT meta_value FROM $wpdb->postmeta WHERE `meta_key` = %s AND `post_id` = %d',$page_template_key,$post_id));
  }
  return $return;
},20,4);
```

### やっていること

カスタムフィールドテンプレートの機能として、固定ページの編集中に「プレビュー」したときにも、カスタムフィールド入力値がプレビュー画面に反映されるように、get_post_metaにフィルターかけているのですが、どうやら、その処理のなかで、固定ページで選択されているページテンプレートの値も一緒に処理されちゃうみたいなのです。
なので、そのフィルターの後から、無理やりデフォルトテンプレートを書き戻す処理を書きました。

正直、こちらのプラグインを普段あまり使わないもので、これが正しい解決方法なのか自信ありません。

ひょっとしたらプラグインの設定レベルで解決できたりするのでは・・・とか思いつつ、とりあえずシェアさせていただきました。

あと、かなり強引な処理なので使用できる局面は限定的だと思います。
例えば、固定ページ選択を変更して保存前にプレビューしたいなどのときは、うまく動作しないかも。

##補足

PHPのバージョンが古い(5.3以前かな？)人は以下のコードを

```php:functions.php
function my_get_preview_postmeta($return, $post_id, $meta_key, $single){
  global $post;
  $page_template_key='_wp_page_template';
  if (($meta_key==$page_template_key) && isset($post) && $post->ID == $post_id && is_preview()){
    //プレビュー状態のとき
    global $wpdb;
    $return=$wpdb->get_var($wpdb->prepare('SELECT meta_value FROM $wpdb->postmeta WHERE `meta_key` = %s AND `post_id` = %d',$page_template_key,$post_id));
  }
  return $return;
}
add_filter('get_post_metadata','my_get_preview_postmeta',20,4);
```
Mecabとjsバインディングのインストール

##1. Mecabと辞書をインストール、文字コードをUTF-８に設定する
  [参考](http://qiita.com/betahikaru/items/8d2867fb39624e1fa48a)
##2. Node.jsとnpmをインストール
  [参考](http://blog.teamtreehouse.com/install-node-js-npm-mac)
##3. Githubで[node-mecab-lite](https://github.com/kujirahand/node-mecab-lite)のソースコードをダウンロード
##4. node-mecab-lite/Package.jsonの中で一行追加
![image](https://qiita-image-store.s3.amazonaws.com/0/137200/4de9ef5c-2f56-d665-0b41-7a7a536c0e8b.png)
##5. node-mecab-liteのルートディレクトリーでコマンドラインを開け、「npm install」を実行する
#動作確認
node-mecab-lite/sampleでコマンドラインを開け、「node sync-test.js」を実行する 。 もし環境が正確に設定されたら、結果は以下になります。
![image](https://qiita-image-store.s3.amazonaws.com/0/137200/d5b1d555-00e3-eebf-2bf8-c7cbd5f79060.png)
porcelainオプションでgit statusの出力をmachine-readableにする



以下のような見慣れた出力を、他の処理の入力として使いたいとする。

```
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   first
        new file:   second

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   first

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        third
```

`porcelain`オプションを使うとファイルごとの出力になる。


```
$ git status --porcelain
MM first
A  second
?? third
```


フォーマットの詳細は

```
$ man git-status
```
## 補足

porcelainとは磁器のことで、gitのコマンドのうち比較的ユーザーフレンドリーな部分をporcelainと呼ぶ。



- [10.1 Gitの内側 - 配管（Plumbing）と磁器（Porcelain)](
https://git-scm.com/book/ja/v2/Git%E3%81%AE%E5%86%85%E5%81%B4-%E9%85%8D%E7%AE%A1%EF%BC%88Plumbing%EF%BC%89%E3%81%A8%E7%A3%81%E5%99%A8%EF%BC%88Porcelain%EF%BC%89)

ただし`--porcelain`オプションの機能は、porcelainコマンドを実行することというよりはmachine-readableな出力をさせることのようである。
CocoaPodsのインストール

今更ながらCocoaPodsをインストールした。gem install cocoapodsでインストールできるとの情報が多かったが、依存関係でエラーになってしまったので、うまく行った手順を示す。

#環境

- OS X 10.11.6
- Xcode 8

#手順

以下のコマンドでインストールする。

    sudo gem install activesupport -v 4.2.6
    sudo gem install cocoapods 

以下のコマンドでセットアップしておくとよい。（少し時間がかかります）

    pod setup


#失敗時の状況

cocoapodを普通にインストールしようとするとactivesupportの最新版をインストールしようとして失敗する。古いバージョンのactivesupportをインストールしておくことで、エラーを回避できる。

    sudo gem install cocoapods
    Password:
    Fetching: concurrent-ruby-1.0.2.gem (100%)
    Successfully installed concurrent-ruby-1.0.2
    Fetching: activesupport-5.0.0.1.gem (100%)
    ERROR:  Error installing cocoapods:
    	activesupport requires Ruby version >= 2.2.2.
Larave 5.3と5.2でphp artisan make:authした時に生成される認証関連機能のControllerにだいぶ差異があって困惑した話


## 発端

### やりたかったこと
* ログアウト後のリダイレクト先URLを指定したい。

### 設定方法
#### L5.2の場合

* ログアウト後のリダイレクト処理は、AuthenticatesUsersクラスで以下のように実装されている。

	``` vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php
	<?php
	namespace Illuminate\Foundation\Auth;
	
	//...
	
	trait AuthenticatesUsers
	{
	    use RedirectsUsers;
	    
	    /**
	     * Log the user out of the application.
	     *
	     * @return \Illuminate\Http\Response
	     */
	    public function logout()
	    {
	        Auth::guard($this->getGuard())->logout();
	
	        return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : '/');
	    }
	    
	    //...
	
	}
	```

* app/Http/Controllers/Authの中のAuthControllerクラスで$redirectAfterLogoutプロパティを設定する。

	```app/Http/Controllers/Auth/AuthController.php
	<?php
	
	namespace App\Http\Controllers\Auth;
	
	//...
	
	class AuthController extends Controller
	{
		//...
		use AuthenticatesAndRegistersUsers, ThrottlesLogins;
		//...
		protected $redirectAfterLogout = 'your/redirect/point/after/logout';
		//...
	}
	```
* 実現できた。

#### L5.3の場合

* ログアウト後のリダイレクト処理は、AuthenticatesUsersクラスで以下のように実装されている。

	``` vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php
	<?php
	namespace Illuminate\Foundation\Auth;
	
	//...
	
	trait AuthenticatesUsers
	{
	    use RedirectsUsers, ThrottlesLogins;
	    
	    //...

	    public function logout(Request $request)
	    {
	        $this->guard()->logout();
	
	        $request->session()->flush();
	
	        $request->session()->regenerate();
	
	        return redirect('/');
	    }
	    //...
	}
	```
	
	* リテラルだけっすか…。変更できないじゃん！
	
* LoginControllerでlogoutメソッドをオーバーライトする。
	
	``` app/Http/Controllers/Auth/LoginController.php
	<?php
	
	//...
	
	use Illuminate\Http\Request;
	
	class LoginController extends Controller
	{
		//...
		
		use AuthenticatesUsers;
		
		//...
		
		public function logout(Request $request)
		{
			$this->guard()->logout();
	
			$request->session()->flush();
	
			$request->session()->regenerate();
	
			return redirect('your/redirect/point/after/logout');
		}
	
		//...
	}
	```
	
* 実現できた。
	* が、L5.2と比べてカッコワルイな。。。


## 調査

* そもそも、どのくらい差異があるのかみてみようかと。

### 準備

* 5.2と5.3のプロジェクトを用意してphp artisan make:auth

	``` console
	mkdir laravel
	cd laravel
	
	composer create-project --prefer-dist "laravel/laravel=5.2.*" laravel52
	cd laravel52
	php artisan make:auth
	cd ..
	
	composer create-project --prefer-dist "laravel/laravel=5.3.*" laravel53
	cd laravel53
	php artisan make:auth
	cd ..
	```


* 認証関連機能Controllerファイル一覧を表示
	
	``` console
	[L5.2]
	tree laravel52/app/Http/Controllers/Auth/
	laravel52/app/Http/Controllers/Auth/
	├── AuthController.php
	└── PasswordController.php
	
	0 directories, 2 files
	
	[L5.3]
	tree laravel53/app/Http/Controllers/Auth/
	laravel53/app/Http/Controllers/Auth/
	├── ForgotPasswordController.php
	├── LoginController.php
	├── RegisterController.php
	└── ResetPasswordController.php
	
	0 directories, 4 files
	```

	* ほぉ…。L5.3触ってるとき、「あれ？こんなだったっけ？」とは思っていたけれど…。
FirefoxのセッションストアAPIから、開いているタブのタイトルを得る

Firefoxって、特に古いAPIまわりは、かなりドキュメント雑ですね。嫌になりますね。

##Firefoxアドオン作ってます
大量のタブやらウィンドウを開くのが趣味な人には便利かもしれないアドオン作ってます。
もともと、小さいディスプレイでもタブを別のウィンドウに移動する動作をやりやすくするために作ったのですが。いろいろ開きすぎて「あれ？　あのタブどこだっけ？」って時にも便利です。
https://addons.mozilla.org/ja/firefox/addon/move-to-window/
https://github.com/gyu-don/move-to-window

で。このアドオンのために、各タブのタイトルを得る必要があるのですが。起動時に前回のセッションを復元する設定にしている場合、起動した後は、前回のセッションが残ってはいるものの、ページ自体の読み込みはまだされていません。タブを切り替えた時点で、読み込みが始まります。
(たしか、大昔のFirefoxは、起動時に全タブ再読み込みがかかったけれど、それじゃ重いよねってなったのか、いつの間にか、そういう挙動になりました)

そうすると、それっぽく、タブのAPIを叩いてみても、ページのタイトルを取得できません。(まだ読み込みを初めてすらいないわけですから)
けれど、タブバーにはタイトルが表示されているので、タイトルを得る方法はあるはずだ、と調べてたら、セッションストアに行き着きました。

##古臭いAPI叩く準備
昔のドキュメントでは`Components.Class[...]`とか`Components.Interface`とか出てきますけど。最近のは、それ使えません。次のように書いて、`Components.Class`は`Cc`に、`Components.Interface`は`Ci`に読み替えます。

```js:CcとCiを使う
var { Cc, Ci } = require('chrome');
```

##SessionStoreのAPIを得る

```js:SessionStoreのAPIを得る
var sessionstore = Cc["@mozilla.org/browser/sessionstore;1"]
                      .getService(Ci.nsISessionStore);
```

で、使い方のドキュメントがこちら
https://developer.mozilla.org/ja/docs/XPCOM_Interface_Reference/nsISessionStore

うわ、めっちゃ雑。どんな引数渡したらどんなデータが返ってくるか、全然イメージつかへん・・・・

##どんなデータが返ってくるのか
プロファイルのディレクトリを開いて下さい。
そこに、sessionstore-backupsってディレクトリがあると思います。
そこに、previous.jsがあると思います。
このJSON形式が、セッションストアの全貌のようです。

このJSONを`getBrowserState()`, `getWindowState(aWindow)`, `getTabState(aTab)`で拾えます。`JSON.parse`などに食わせましょう。
`getBrowserState()`だけ知ってれば、いいっちゃいいんですが。指定したウィンドウだけ、あるいは指定したタブだけのJSONが欲しい場合、`getWindowState(aWindow)`, `getTabState(aTab)`が必要になります。

ちなみに、引数に指定するウィンドウやタブは、例えば次のようにして得られます。

```js:ウィンドウやタブを得る
// 低レベルAPI。高レベルAPIと比べて互換性のない変更が将来起こりやすいとされている。
var Window = require("sdk/window/utils");
var Tabs = require("sdk/tabs/utils");

var idomactivewindow = Window.getMostRecentBrowserWindow();  // アクティブなウィンドウ
var idomwindows = Window.windows("navigator:browser");  // ウィンドウ全部
idomwindows.forEach(function(win){
  // winがウィンドウ
  var activetab = Tabs.getActiveTab(win);  // ウィンドウ内のアクティブなタブ
  var tabs = Tabs.getTabs(win);  // ウィンドウ内のタブ全部
}
```

##タブのタイトルを得る
JSONを変数`json`に読み込んだ、と仮定して話を進めます。
`json.windows[windowIdx].tabs[tabIdx].entries` のリストには、各タブの履歴(戻る・進む)が保持されています。`json.windows[windowIdx].tabs[tabIdx].index` が、履歴の中のどこにいるかを示すようですが、どういう経緯かしらないですが、このindexは1はじまりになっています。なので、現在のページは
`json.windows[windowIdx].tabs[tabIdx].entries[json.windows[windowIdx].tabs[tabIdx].index - 1]`
となります。
タイトルは、後ろに`.title`とつけるだけです。すなわち
`json.windows[windowIdx].tabs[tabIdx].entries[json.windows[windowIdx].tabs[tabIdx].index - 1].title`
やっと、タイトルが得られました。

##まとめ
Firefoxアドオン作りは、Mozilla公式のよくわからないドキュメントとグーグル検索とトライアンドエラーでなんとかやりたいことをやる方法を見つける苦行の連続です。
みなさん、よいFirefoxライフを！
iperfの出力をCSV化する方法

# ipef
お馴染みネットワークテストツール。
現在２系統のverがサポートされています。
[iperf](https://iperf.fr/iperf-doc.php)

* ver2系

``` shell:macOS
brew install iperf
```

``` shell:ubuntu16.04
sudo apt install iperf
```


* ver3系

``` shell:macOS
brew install iperf
```

``` shell:ubuntu16.04
sudo apt install iperf
```

# コマンド

* ver2系

```
-yc
```

``` shell:~/
iperf -c サーバーのIP -u -i 1 -yc                                                                                                  [~]

20161006082657,192.168.0.3,65472,サーバーのIP,5001,4,0.0-1.0,132300,1058400
20161006082658,192.168.0.3,65472,サーバーのIP,5001,4,1.0-2.0,130830,1046640
20161006082659,192.168.0.3,65472,サーバーのIP,5001,4,0.0-2.3,296940,1047658
20161006082659,サーバーのIP,5001,192.168.0.3,65472,4,0.0-2.3,296940,1048896,1.547,0,202,0.000,0
```

こんな感じでCSVフォーマットで標準出力してくれます。

* ver3系

ver3系ではCSV出力の機能がオミットされました。
代わりにJSONで吐き出すコマンドが実装されました。何も消すコト無いのに...

```
-J
```

ちなみにCSVで出力してくれるpythonのスクリプトが公式に落ちてました。
が、これはサーバーのログを出力するスクリプトっぽいので上の用途とは異なります。
[iperf3protect](https://github.com/kgersen/iperf3protect)
ちなみにこんな感じになります。

```shell:ubuntu16.04
yas-nyan:~$ iperf3 -s -J | python -u iperf3tocsv.py
date,ip,localport,remoteport,duration,protocol,num_streams,cookie,sent,sent_mbps,rcvd,rcvd_mbps,totalsent,totalreceived
"Wed, 05 Oct 2016 23:45:35 GMT",クライアントのIPアドレスだよ,5201,58957,5,TCP,1,MacBook-Air.local.くっきーだよ,0,0,43813584,69.9104,0,43813584
```

気が向いたらクライアント側でいい感じにCSV化してくれるスクリプトを書きます。
goのinterfaceのstub生成する君

## 本題

[ATOMのパッケージ](https://atom.io/packages/go-impl)作ったよ！（宣伝）

![](https://raw.githubusercontent.com/kyoh86/go-impl/master/image/go-impl.gif)

## 何のために？

`Go`でDIとかゴニョゴニョしてると、しばしば`interface`の実装を書くシーンに直面しますが、
`interface`が大きく複雑になってくるとだいぶつらたんですよね。

大きい`interface`を書くな、小さい`interface`の組み合わせにしろ、って話は踏まえてもやっぱり辛いんじゃないかなと。

なので、`interface`を指定したらば実装のスタブを自動で生成して、スニペットのように貼り付けられるパッケージを作ってみました。

## 何ができるの？

### 1. スタブの生成  

コマンドパレットから`Go Impl: Find Declaration`、またはキーバインド`ctrl-i`で、カーソルの当たっているinterfaceから、スタブを生成できます。  

![go-impl-01.gif](https://qiita-image-store.s3.amazonaws.com/0/31053/6125d926-4dfa-aa13-6d0d-15172ec96704.gif)

### 2. スタブの貼付け

コマンドパレットから`Go Impl: Put Declaration`、またはキーバインド`ctrl-shift-i`で、カーソル位置に最後に生成したスタブをスニペットのように貼り付けられます。
貼り付けると自動で各メソッドのレシーバを選択した状態になるので、そのままレシーバを書き換えられます。

![go-impl-02.gif](https://qiita-image-store.s3.amazonaws.com/0/31053/166875d6-ae89-8a9d-264f-db46ec7e3441.gif)

### 3. 履歴から選んで貼付け

コマンドパレットから`Go Impl: Toggle`、またはキーバインド`ctrl-alt-i`で、生成されたスタブの履歴から選択して、スニペットのように貼り付けられます。

![go-impl-03.gif](https://qiita-image-store.s3.amazonaws.com/0/31053/5fd1e86c-b72a-718e-79cf-0d1a71a72bf2.gif)

## 改善点

### ゴミが残る危険性

動画内だと、さも当然のように`struct`内に`interface`を埋め込み表記してますが、これ自体に`interface`を実装するという宣言のような意味はありません。`golang`の`interface`実装はダックタイピングですし。
言語仕様通り「埋め込まれる」だけなので、邪魔にしかなりません。ゴミです。消しましょう。

ソース中にゴミを（一時的とは言え）置かざるを得ない実装は少々不本意です。

だので`Go Impl: Toggle`では、履歴を検索するだけでなく、入力された値からそのままinterfaceを検索して、スタブを生成する機能を付け加えたいところです。

### 少しばかり重い

さらに言えば、すべての`interface`を内部でキャッシュしているわけではないので、毎度`gopath`以下を検索しています。
これは使用している[Impl](https://github.com/josharian/impl)における制約ですが、こちらもなんとかしたいところ。
[autocomplete-go](https://atom.io/packages/autocomplete-go)の持ってる内部キャッシュなど上手いこと<del>掠め取</del>流用すれば、ある程度平易に実装できる気がしています。
CUDA > Link > Deferred allocation of shared memory

AccelewareによるCUDAに関するビデオ。
https://www.youtube.com/watch?v=W0WSx4toOLc

36:40頃に出てくるのが
Deferred allocation of shared memory

コードを写経すると

```c
// Deferred allocation of shared memory

__global__ void kernel(int sizeA, ..)
{
  ..
  extern __shared__ float sData[];
  float* a, float* b;

  a = sData;
  b = &a[sizeA];
  ..
}

int main(void)
{
  int sizeA = 64;
  int sizeB = 16;
  int smBytes = (sizeA + sizeB) * sizeof(float);

  kernel<<<nBlocks, bSize, smBytes>>>(...);
  ...
}
```

http://ejje.weblio.jp/content/Deferred+
> 延期した、据え置きの

kernel launch前に割当てせず、kernel内部でデータを割当てしているということだろうか。
【メモ】Node.js? io.js? なんのことです？

（勝手に）割と衝撃を受けたのでメモ。

## 元ネタ

[知らないうちにMacがシステム標準でJavaScriptで操作できるようになってた (JXA)](http://qiita.com/zakuroishikuro/items/1b02378bf9e940602d87)
[GoでOSXのアプリを書く #golang](http://qiita.com/tenntenn/items/4b9587120176c2d4b454)

OSXなら、別にNode動かさんでもJavaScriptでそこそこのことができる。

```js
#!/usr/bin/osascript -l JavaScript
console.log("baz");
```

こんな感じで書いて、適当なファイル名で保存して、`chmod +x foobar`で実行権限与えとけば、`foobar`で実行できる。
所謂AppleScriptのエンジンがJavaScriptも解する様になったことで、いい感じにやってくれてる。
Yosemiteからだよ〜とか、もうそれ１年前の話やよ〜、って事実にも衝撃を受けてる。

もちろん、Node.jsは標準ライブラリの強力さが魅力の一つだし、これで何かやろうと思うのは割と苦行だと思うが、逆にNode.jsだとOSXのAPI叩くのつらたんだし、簡単なスクリプトをシェルじゃなくてJavaScriptで書けるとしたらそこそこ嬉しいんじゃないかななんて。
Golangで〜のエントリはネタとしても（ネタですよね？）、golangなりなんなりOSXのAPIとは縁遠い言語とのグルーとして使えば結構クールなんじゃないかなぁなんて。

あ、全然？ですよねー。

でもこれ、tsd書いてtypescript -> (webpack) -> osascript ‥いや、辞めておこう

## 幻

え？WindowsならJScriptがある？VBScript？
![b0218806_202339.png](https://qiita-image-store.s3.amazonaws.com/0/31053/a130459f-7729-e2ab-6d2d-e66a5201e699.png)
LINE BOTを使用してユーザー情報を取得する

##このBOTについて

この投稿はDeveloper Trialの内容です。
正式版として公開されたLINE MESSAGE APIを使用した実装は
[**LINE MESSAGE APIを使用してユーザー情報を取得する**](http://qiita.com/yusuke-asaoka/items/0dc9712c73bebcce75e3)に公開致しました。

**無料で使えるLINE BOTを使ってユーザー情報を取り出す必要があったので、その際のメモです。**

事前に[LINE BUSINESS CENTER](https://business.line.me/ja/services/bot)で登録を完了しておいてください。
コールバックURLにはsslが必須のようですが無料で使えるレンタルサーバー共有sslやHerokuでもできました。

##ユーザー名を取得して送り返すbot

```php

new Bot;

class Bot{
  private $channel_id = "[ユーザーのCHANNEL ID]";
  private $channel_secret = "[ユーザーのCHANNEL SECRET]";
  private $mid = "[ユーザーのMID]";
  private $header;

  private $from;
  private $text;
  private $content_type;

  private $name;

  public function __construct(){

    $json_string = file_get_contents('php://input');
    $receive = json_decode($json_string);
    $this->from = $receive->result{0}->content->from;
    $this->text = $receive->result{0}->content->text;
    $this->content_type = $receive->result[0]->content->contentType;
   
    $this->header = array(
      "Content-Type: application/json; charser=UTF-8",
      "X-Line-ChannelID:" . $this->channel_id,
      "X-Line-ChannelSecret:" . $this->channel_secret,
      "X-Line-Trusted-User-With-ACL:" . $this->mid,
    );

    $this->getting_user_profile_rinformation($this->from);
    $this->sending_messages($this->name);

  }

  private function sending_messages($message){
    $url = "https://trialbot-api.line.me/v1/events";

    $data = array("to" => array($this->from), "toChannel" => 1383378250, "eventType" => "138311608800106203", "content" => array("contentType" => 1, "toType" => 1, "text" => $message));
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
    curl_setopt($ch, CURLOPT_HTTPHEADER, $this->header);
    $result = curl_exec($ch);
    curl_close($ch);
  }

  private function getting_user_profile_rinformation($mid) {
    $url = "https://trialbot-api.line.me/v1/profiles?mids={$mid}";

    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $this->header);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    $output = curl_exec($curl);
    $receive = json_decode($output);
    error_log($output);

    $this->name = $receive->contacts[0]->displayName; //displayName=>名前 pictureUrl=>プロフィール画像 statusMessage=>自己紹介文
    $this->name .= "さんこんにちは！";

    file_put_contents("json.php", $output);
  }
}

```
Docker for mac で 別ディレクトリにVMを割り当てる

[Docker for Mac](https://docs.docker.com/docker-for-mac/) は、 boot2dockerがなくてもインストールするだけで簡単にDockerが使えるようになるツールです。Docker for Macは、内部でxhyveを使っています。

## VMの場所
```
~/Library/Containers/com.docker.docker
```
VMはここに置いてあります。Dockerを完全に終了した状態で、このディレクトリをいったん削除し(起動していると復活します)

```
ln -s /Volumes/SSD/Containers/com.docker.docker com.docker.docker
```
こんな感じに、シンボリックリンクを作成します。
後は、Dockerを起動するだけです。

## 最後に
MacがHDDなので、外付けのSSDに移動出来てかなり快適になりました。
将来的にDocker for Macの仕様変更等により、この挙動がうまくいかなくなる場合があります。Productionでの利用は控え自己責任でお願いします。

## 追記

ストレージの場所を、Advanced設定画面から変更出来るようになっています。

![image](https://qiita-image-store.s3.amazonaws.com/0/23900/f9006e2c-c1c7-9fe4-41ce-3c3fb86dda61.png)
ESP8266 / Arduino IDE > Error > xtensa-lx106-elf-gcc: error: libraries\Bridge\Bridge.a: No such file or directory > 勝手にヘッダincludeが追加されていた

```txt:動作環境
Arduino IDE 1.6.6
ESP-WROOM-02
Windows 8.1 pro (64bit)
```

MSC-MOD20というmicroSDモジュールを動かすコードを実装中、Verify/CompileにてArduino IDEが以下のエラーを出力するようになった。

`
xtensa-lx106-elf-gcc: error: libraries\Bridge\Bridge.a: No such file or directory
`

以下を見ると自分のコードの問題というよりはArduinoIDE側で何かのバグに出くわしたようだ。
https://github.com/esp8266/Arduino/issues/1631

対応方法を調査中。


http://community.blynk.cc/t/esp8266-nodmcu-v3/6998/3
> This report would have more information with
"Show verbose output during compilation"
enabled in File > Preferences.

<hr>
(追記 2016/10/07)

ソースを見直していると、ソースの先頭に以下のincludeがいつの間にか追加されていた。

```
#include <Bridge.h>
#include <BridgeClient.h>
#include <BridgeServer.h>
#include <BridgeUdp.h>
#include <Console.h>
#include <FileIO.h>
#include <HttpClient.h>
#include <Mailbox.h>
#include <Process.h>
#include <YunClient.h>
#include <YunServer.h>
```

コメントアウトしたらエラーが出なくなった。

環境設定にて「外部のエディタを使用する」にチェックをつけていたが、この状態で上記のヘッダーが勝手に追加される場合があるのだろうか。
gitのdiffで見ても上記がここ最近の作業で追加されている。

Arduino Yun関連のものが入っている。

設定も特に変更してないのだが。
技術英語 > If your environment provides [ready-made] key transformations, use them. /  Built-in Functions

@ Code Complete (No. 13955 / 36077)

> If your environment provides <font color=red>ready-made</font> key transformations, use them.

http://ejje.weblio.jp/content/ready-made
> でき合いの、既製品の、レディーメードの、きわめて便利な、おあつらえ向きの、受け売りの、独創的でない

<hr>
関連して思い出したのは

https://docs.python.org/3/library/functions.html
>  Built-in Functions
FFmpegのAPIを使う～AACデコーダ出力フォーマットfltpを調べてみる

# はじめに
FFmpegではAACのsample_fmtがデフォルトでfltpになっています。
ソースコードやメーリングリストを調べてみました。

# ffmpeg-3.0.3
[ffmpeg-3.0.3](https://ffmpeg.org/releases/)のソースコードを見てみます。

## libavcodec/aacdec.c

```c:aacdec.c
AVCodec ff_aac_decoder = {
    .name            = "aac",
    .long_name       = NULL_IF_CONFIG_SMALL("AAC (Advanced Audio Coding)"),
    .type            = AVMEDIA_TYPE_AUDIO,
    .id              = AV_CODEC_ID_AAC,
    .priv_data_size  = sizeof(AACContext),
    .init            = aac_decode_init,
    .close           = aac_decode_close,
    .decode          = aac_decode_frame,
    .sample_fmts     = (const enum AVSampleFormat[]) {
        AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE
    },
    .capabilities    = AV_CODEC_CAP_CHANNEL_CONF | AV_CODEC_CAP_DR1,
    .caps_internal   = FF_CODEC_CAP_INIT_THREADSAFE,
    .channel_layouts = aac_channel_layout,
    .flush = flush,
    .priv_class      = &aac_decoder_class,
    .profiles        = NULL_IF_CONFIG_SMALL(ff_aac_profiles),
};
```

以下の通り、AV_SAMPLE_FMT_FLTPしか受け付けられなくなっていました。

```c
    .sample_fmts     = (const enum AVSampleFormat[]) {
        AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE
    },
```

## aacdec_template.c
デコード初期化aac_decode_initはaacdec_template.cにあります。

```c:aacdec_template.c
static av_cold int aac_decode_init(AVCodecContext *avctx)
{
    AACContext *ac = avctx->priv_data;
    int ret;

    ret = ff_thread_once(&aac_table_init, &aac_static_table_init);
    if (ret != 0)
        return AVERROR_UNKNOWN;

    ac->avctx = avctx;
    ac->oc[1].m4ac.sample_rate = avctx->sample_rate;

    aacdec_init(ac);
#if USE_FIXED
    avctx->sample_fmt = AV_SAMPLE_FMT_S32P;
#else
    avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
#endif /* USE_FIXED */
```

以下の通り、USE_FIXEDがdefineされていなければ固定でAV_SAMPLE_FMT_FLTPになります。

```c:
#if USE_FIXED
    avctx->sample_fmt = AV_SAMPLE_FMT_S32P;
#else
    avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
#endif /* USE_FIXED */
```

オプション指定でs16にできないものかと思っていましたがソースコード上で固定でfltpになっていることが分かりました。

# git上の修正
fltp固定に変更したときの修正は以下です。

> aacdec: use float planar sample format for output
> https://github.com/FFmpeg/FFmpeg/commit/3d3cf6745e2a5dc9c377244454c3186d75b177fa

# 変更した理由

[[FFmpeg-user] what is "fltp" for audio when using ffmpeg](https://lists.ffmpeg.org/pipermail/ffmpeg-user/2013-July/016540.html)

メーリングリストの記載によるとfltpにした目的は以下とのこと。
> The main target is to eliminate extra processing in audio decoders and move
> out it to dedicated re-sampling library.
【Swift】if式を実装

Haskell等の関数型言語のif式に憧れ、Swiftで実装してみました。

```swift
// 値を返すif文
func `if`<A>(_ condition: () -> Bool, then: () -> A, else: () -> A) -> A {
    if condition() {
       return then()
    } else {
        return `else`()
    }
}
```

使用例

```swift
let result = `if`({ true },
                  then: { 1 },
                  else: { 2 })
// result = 1
```

ジェネリクスのおかげで以下はエラーになります。

```swift
let result2 = `if`({ false },
                   then: { 0 },
                   else: { "1" }) // 戻り値の型が一致しない
```

# 追記08/10/16
三項演算子を使ってスッキリさせました。
また @rizumita さんのコメントを受け@autoclosureを使ってみました。

```swift
func `if`<A>(_ condition: () -> Bool,
          then: @autoclosure () -> A,
          else: @autoclosure () -> A) -> A {
    return condition() ? then() : `else`()
}
```
プログラム内からrequire可能なライブラリの一覧を表示する

プログラム内から`require`可能なライブラリの一覧を表示するだけのコードです．

```rb
puts `find #{$:*" "} -type f -name "*.rb"`
```

`find`コマンドを呼んでいるので，ない場合は適宜別のコマンドを指定してやってください．

参考：[PerlとRubyでのロードできるライブラリを確認する方法 - Bouldering & Com.
](http://shrkw.hatenablog.com/entry/20070128/1169980608)
Swift2.3/Swift3でCocoaPodsを使い始めようとしてハマったことメモ

そろそろSwift3移行やろうと思ったら開幕で一ハマりしたのでメモ。確認してないけどSwift2.3でも同様のはず。

# ハマったこと。

コンパイルエラー。
> “Use Legacy Swift Language Version” (SWIFT_VERSION) is required to be configured correctly for targets which use Swift. Use the [Edit > Convert > To Current Swift Syntax…] menu to choose a Swift version or use the Build Settings editor to configure the build setting directly.

# 結論。

CocoaPodsを1.1にあげてPodfileに`swift_version= '3.0'`と書く。

# 以下詳細。

## 経緯

1. 既存のSwift2.2@Xcode7プロジェクトのSwift3移行を画策
2. Xcode8で`.xcworkspace`を開くとswiftのバージョンを2.3にするか3.0にするか聞かれるので3.0を選ぶ
3. 自動migrateの対象を聞かれるので、Podsのターゲットは外してmigrate実行（注意：言うまでもなくバージョン管理必須
    - Build Settingsの"Use Legacy Swift Language Version"が`NO`になるのが分岐点
    - (.xcodeproj/project.pbxファイル中での書かれ方は`SWIFT_VERSION=3.0`)
4. migrate後、Podsターゲットでエラーが発生しまくっているので、次にPodsをSwift3対応バージョンにアップデート
    - 単純に最新stableバージョンがSwift3対応していれば単純に最新バージョンに上げればよかったり
    - まだswift3対応版はbeta版で `~> 3.0.beta` とか書いてあり
    - 別ブランチ状態で `git: => '****', branch: => 'swift3'`って書いたり。
5. pod update後、ビルドしようとしたら

>
“Use Legacy Swift Language Version” (SWIFT_VERSION) is required to be configured correctly for targets which use Swift. Use the [Edit > Convert > To Current Swift Syntax…] menu to choose a Swift version or use the Build Settings editor to configure the build setting directly.

## 原因

自分の本体のプロジェクトで “Use Legacy Swift Language Version” (SWIFT_VERSION) をSwift3に設定したように、Podsターゲットでも設定を記述することを求められている。

## 対策

CocoaPodsを1.1にあげてPodfileに`swift_version= '3.0'`と書くと、Podsのプロジェクトを生成するときによしなに設定してくれるようになる。

```:Podfile
platform :ios, '9.0'
swift_version = '3.0'   <=== 追加
use_frameworks!

target 'PROJECT_NAME' do
  pod '***'
  pod '***'
...
```

10/6現在、まだ1.1.がRC2なので、`--pre`が必要。


```
gem update cocoapods --pre
pod update
```

## 補足

このPRでサポートが追加された。感謝。

[[Installer] Use user defined swift version by DanToml · Pull Request #5540 · CocoaPods/CocoaPods](https://github.com/CocoaPods/CocoaPods/pull/5540)

CocoaPodsがサポートする以前の対策として

```:Podfile
post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['SWIFT_VERSION'] = '3.0'
    end
  end
End
```

と書く、という情報の方がよく検索に引っかかる気がするけど、(まだRCだけど)CocoaPods側でサポートされたのでそちらを使っていく方がスマート。
Pythonを始めよう！ 〜①環境構築編〜

# 概要

時代はPythonだと思います。
普段はJS大好きですが(React大好き)、これから機械学習やデータ系の処理などはPythonが先陣を切ると思います。(AWS LambdaもPythonで書きたい！)

表はReact、裏はAWS(LambdaはPython)の理想を目指して勉強します。
(1年前にちょろっと触っただけで覚えてない。)

また、2.Xか3.Xかどちらのバージョンにしようか悩んでいましたが、
尊敬する方から両方必要とご教示頂いたので、違いも見比べながら再入門できたらと思います。

# Pythonの環境構築

3.xは今がんがん開発されています。
2.xは開発が止まっています。
ただし、現状あるPythonのフレームワーク類は2.xは使えるが、
3.xは使えないという悲しい事態に陥っています。

Pythonのバージョンはさくさく切り替えれた方がいいと思い、何かいい方法が無いかと調査したところ、普通にありました。

pyenvというPythonのバージョンを管理できるものがありました。
Node.jsのバージョンを切り替えるnvmに似ていますね。

## pyenv導入手順

すごく簡単で、GitHubからcloneするだけです。

```
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
```

cloneが終わったら、.bash_profileに実行コマンドを書き込みましょう。
下記を追加すればOKです。

```
export PYENV_ROOT=$HOME/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"
```

これでPythonのバージョン切り替えの準備は完了です。

## pyenvからPythonをインストールする。

pyenvからPythonをインストールします。
とは言っても簡単で、下記のコマンドで一発でインストールできます。

```
pyenv isntall 3.5.1
```

上記のコマンドで、Pythonの最新バージョンである、3.5.1がインストールできました。
(pipは3.4.xから標準搭載なのでこのままでOKです。)

## pyenvで利用するPythonのバージョンを指定する。

pyenvには3通りの指定方法があります。

### ① システム全体に反映する。

```
pyenv global 3.5.1
```

### ② カレントディレクトリのみに反映する。

```
pyenv local 3.5.1
```

### ③ 特定のshellでのみ反映する。

```
pyenv shell 3.5.1
```

①はシステム全体、②はカレントディレクトリのみに反映します。
③は一時的に利用したいshellなどで指定します。

だいたいは3.xを使うけど、この案件は2.xとかの切り分けもスムーズに行えます。

また、ターミナルを終了しても、この反映は生き続けます。
ものすごく便利ですね。

Macの初期設定のPythonに戻したい場合は、下記でOKです。

```
pyenv global system
```

これで好きな時にバージョンを切り替えることができる様になりました。

何かモジュールが欲しい時は、

```
pip install XXXX
```

でインストールして使いましょう。

# まとめ

まだまだ復習し始めたばかりですが、
バージョン違いでつんでしまうのが一番もったいないと思います。
初期からバージョン切り替えはスムーズにできる様に、pyenvでPythonのバージョン管理は徹底しましょう。

[次回](http://qiita.com/gcfuji/items/bf526e7b4fa052a9142e)からは文法編に入ります。
【R】【MeCab】RMeCabのインストールと形態素解析

Rで形態素解析をしてみたので、インストールから簡単なデモまで一通り説明します。
Rを使って形態素解析をすると、いろんなソフトを行ったり来たりせずに一貫して、分析が進められるのでなかなか便利です。

#設定した環境
- iMac (27-inch, Mid 2010)
- プロセッサ： 2.8 GHz Intel Core i5
- メモリ： 12 GB 1333 MHz DDR3
- R : 3.3.0

#準備

##Homebrewを入れる
MacにMeCabを入れるにはいくつか方法がありましたが、
Homebrewで入れるのが比較的簡単だったので、今回はHomebrewでMeCabをインストールします。

まずはHomebrewを入れていない人向けに簡単にHomebrewのインストールからしていきましょう。
以下のサイトに行くと指定のコマンドがあるのでそれをターミナルから実行します。

http://brew.sh/index_ja.html

インストールが完了したら、以下のコマンドを入れて正しくインストールされているか確認してみましょう。

```sh
$ brew doctor
```

何も問題がない場合は以下が表示されます。

```sh
$ brew doctor
Your system is ready to brew.
```

ちょっと問題があって、warningが表示されていても最初に以下のような表示であればとりあえず動きます。

```sh
$ 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!
```

##MeCabのインストール
MeCabをhomebrewでインストールしていきます。
ここでは、MeCabの辞書であるmecab-ipadicもまとめてインストールします。

```sh
$ brew install mecab
$ brew install mecab-ipadic
```

この2つが問題無くインストールできれば、MeCabの準備は完了です。

###windowsの方へ
バイナリパッケージがあるので、以下のURLからダウンロードします。
インストールしたら、MeCabの準備は完了です。
http://taku910.github.io/mecab/#download

##RMeCabのインストール
ここまできたらいよいよRでMeCabを使えるようにするステップです。
Rを起動して以下を実行します。

```r
install.packages("RMeCab", repos = "http://rmecab.jp/R")
```

自動でRMeCabがインストールされます。
インストールが完了したら、早速試してみましょう！

#RMeCabで簡単な形態素解析を実行する
##単文で形態素解析ができるかテスト
それでは以下のようなスクリプトを実行してみましょう。


```r
library(RMeCab)
res <- RMeCabC("すもももももももものうち")
unlist (res)
```

上記を実施すると以下のような結果が得ることができます。

```r
    名詞     助詞     名詞     助詞     名詞     助詞     名詞 
"すもも"     "も"   "もも"     "も"   "もも"     "の"   "うち"
``` 

また、docDF()関数を使うと、結果を行列として取得することも可能。

```r
> (docDF(target = data.frame(X = "すもももももももものうち"), column = "X", type = 1))

number of extracted terms = 5
now making a data frame. wait a while!

    TERM POS1   POS2 Row1
1   うち 名詞 非自立    1
2 すもも 名詞   一般    1
3     の 助詞 連体化    1
4     も 助詞 係助詞    2
5   もも 名詞   一般    2
```

指定可能な引数に関する詳細はこちら
http://rmecab.jp/wiki/index.php?RMeCabFunctions

##長文を形態素解析して名詞の個数をカウント
少し発展して次はちょっと長めの文章を形態素解析して、登場する名詞の個数を数えるコードを作ってみようと思います。

今回は日本語訳のスティーブ・ジョブス氏の演説を使ってみようと思います。


RMeCabでデータを読み込むにはテキストファイルになっている必要があるので、
まずは、テキストファイルにして作業ディレクトリに保存しておきます。

```r
library(RMeCab)
library(ggplot2)

# 解析対象となるデータの読み込み
res <- RMeCabFreq("steve-jobs-speech.txt")

# 名詞だけを取り出してデータフレームres_nounへ
res_noun <- res[res[,2]=="名詞",]

# 2回以上登場する名詞の数。res[,4]で"Freq"列を参照
nrow(res_noun <- res[res[,2]=="名詞" & res[,4] > 1,])

# res_nounをFreqで降順ソート
res_noun[rev(order(res_noun$Freq)),]
```

さらに以下のコードで上位25位の頻出名詞を棒グラフで表します。


```r
# 1列目と4列目を抜き出してデータフレームを作成する
res_noun2 <- data.frame(word=as.character(res_noun[,1]),
                        freq=res_noun[,4])

# 上位25位に絞り込む
res_noun2 <- subset(res_noun2, rank(-freq)<25)

# ggplotでグラフを描画する
ggplot(res_noun2, aes(x=reorder(word,freq), y=freq)) +
  geom_bar(stat = "identity", fill="grey") +
  theme_bw(base_size = 10, base_family = "HiraKakuProN-W3") +
  coord_flip()
```

![speech.png](https://qiita-image-store.s3.amazonaws.com/0/8222/e4d5d140-33f0-2b20-96b7-457d15f12fe0.png)

こうしてみると”私”や”人生”、”Apple”といった単語が多く、
この演説がいかに自分の体験や経験に基づいて構成されているのかがよく分かります。
iOS 9.3.1を使ってる時に、Xcode 7.2.1にアップデートする方法

https://medium.com/@katopz/heres-how-to-debug-ios-9-3-1-via-xcode-7-2-1-dc3a099d54cf#.vutx4m66l

iOS 9.3.1を使ってる時に、Xcode 7.2.1にアップデートする方法です

Apple公式からXcode7.2.1をアップデートしてください
https://developer.apple.com/xcode/download/

(ここまで最上部URLから日本語翻訳して要約引用)
-----------
シンプルな話ですね


【補足】
（１）Xcodeのアップフレードについて、Mac側のApp Storeにバッジアイコンなどで通知されていません

（２）これをやらないと、XcodeでiPhoneの実機で無料でシュミレート（Xcode7からの新機能）しようとした時に
「Could not find Developer Disk Image」というエラーメッセージが出てきます

（３）iPhoneのバージョンは機能＞＞About（概要）で見られます

（４）Xcodeをアップグレードする時は、アプリケーションフォルダから、古いXcodeを削除しないといけません（そうしないと待機状態から進まない）

（５）さらにXcode7.3にアップグレードするにはMacOSXのアップグレードが必要です


-----------
Xcodeのアップデートって通知こないのね
（MacOSXのアップグレードが必要だったからかな、YosemiteからSierraは無料なんだけどね、ただアップデートに１時間くらいかかったわ）
PostgreSQLで外部キー(FK)をすべて削除する方法

## 環境
- OS: Windows10
- PostgreSQL:9.5

## FKをすべて削除する方法
データ投入時等で、一旦制約を削除したい場合ってあると思います。
テーブル等が大量にある場合はとても大変な作業です。
一括で削除する方法を紹介します。

```sql
SELECT 'ALTER TABLE "'||nspname||'"."'||relname||'" DROP CONSTRAINT "'||conname||'";'
 FROM pg_constraint 
 INNER JOIN pg_class ON conrelid=pg_class.oid 
 INNER JOIN pg_namespace ON pg_namespace.oid=pg_class.relnamespace 
 WHERE contype='f' 
 ORDER BY CASE WHEN contype='f' THEN 0 ELSE 1 END,contype,nspname,relname,conname
```

## 補足
以下のコマンドで出力をファイルに変更することができます。

```shell-session
\o [ファイル名]
```
標準出力に戻す方法は以下を以下を実行するだけです。

```shell-session
\o
```

## 参考
Automatically dropping and creating constraints
https://www.hagander.net/blog/automatically-dropping-and-creating-constraints-131/
【GAS】QUERY関数を使って複数シートの情報を統合する

　いまいち具体例がイケていないんですが、いまAさん、Bさんの1年間の昼食、夕食のカテゴリ（和洋中）を元データとし、QUERY関数でデータを統合する例として、複数の同型シートを和結合したうえでピボットで集計というのをやってみたいと思います。

　QUERY関数の基本的な使い方は[Google スプレッドシートからデータをSQLライクに取得してグラフを描く](http://qiita.com/atsaki/items/6d2027c3bcb50b03fa18)が参考になるかと思います。また類似の記事として[複数の Google スプレッドシートのデータを集約する](http://qiita.com/kz_takatsu/items/a89e89a4c5e82414ae3f)も挙げておきます（こちらはスクリプトを使用した例です）。

　具体例ですがスクリーンショットを見てもらった方が早いですね。こんな感じのシートが2枚（「Aさん」シート、「Bさん」シート）あるということです。

　![スクリーンショット 2016-10-05 23.10.27.png](https://qiita-image-store.s3.amazonaws.com/0/139134/bd90aab0-6632-48fd-bf90-79550e65a05f.png)


#単純和結合

　単純に2枚のシートを縦に結合します。具体的には範囲を;（セミコロン）でつなぎ、全体を{}で包めばよいだけです。「A2:C」とC列は具体的な番号を指定せず、行の増加に対応できるようにしつつ、where句で空白行は除くという処理をやっています。これをしないと縦に結合はできるんですがテーブルとテーブルの間に大きな空白ができてしまいます。

　また、カラム指定は通常のA,B,Cといった具体的な列番号ではなく、Col1,Col2,Col3のようにします。なお、全カラム抽出の場合、select句は省略できます。

```
=QUERY({'Aさん'!A2:C;'Bさん'!A2:C},"where Col1 is not null")

Col1が文字列なら
where Col1 != ''
です。上記はCo1が数値の場合で使い分けに注意しましょう。

```
　

　範囲が固定されているのであれば、実はQUERY関数を使わなくても、下記のような書き方で結合できます。

```
={'Aさん'!A2:C367;'Bさん'!A2:C367}
```

#セルフ結合

　同じテーブルを和結合することもできます。いま、Aさんの昼食と夕食を1列に並べるとするならば、以下のようにします。式は見やすくするために改行しています。

```
=QUERY({
QUERY('Aさん'!A2:C,"select A,B");
QUERY('Aさん'!A2:C,"select A,C")},
"where Col1 is not null order by Col1")
```

　セルフ結合と言いましたが、別の観点から見ると、範囲自体にQUERY式が入っており、一種のインラインビューのようなこともできるということが分かるでしょう。SQLでよくFROM句に他のテーブルを加工したもの持ってきたりしますよね。あれと同じです。なお、order by句で日付順に並べています。

　また、内側（結合前の範囲）のQUERY関数ではselect A,Bのように具体的な列番号をしていますが外側（結合後）のQUERYではCol1,Col2のようにする点にも注意しましょう。よくよく考えてみれば当然で結合後はそれがアルファベットの何列目かをそもそも定義することが困難です（シート1のA〜C列、シート2のD〜F列を結合する例を思い浮かべれば分かるでしょう）。

　結果はこうなります。

![スクリーンショット 2016-10-05 23.26.43.png](https://qiita-image-store.s3.amazonaws.com/0/139134/18aa3fe1-3df8-8f12-682b-d97a29825a72.png)

#ピボット
 
　最後にピボットを織り交ぜてみます。ここでは縦軸にカテゴリ、横軸に月をとってやってみます。Aさん、Bさんの昼食と夕食を和結合し、月ごとに合計何食になっているかどうかを集計します。

```
=QUERY({
QUERY('Aさん'!A2:C,"select 'Aさん',A,B");
QUERY('Aさん'!A2:C,"select 'Aさん',A,C");
QUERY('Bさん'!A2:C,"select 'Bさん',A,B");
QUERY('Bさん'!A2:C,"select 'Bさん',A,C")},
"select Col3,count(Col1) 
where Col1 is not null and Col2 is not null 
group by Col3 
pivot month(Col2)+1")
```

　結果はこうなります。12ヶ月ありますが、横に長すぎなのでスクリーンショットでは6月まで収めています。

　<font color="red">注意したいのは横軸に１，２，３・・・と月が出力されていますがこれは「文字列」だということです。</font>えー？っと思うかもしれませんがこれを知らないと後々この表をもとにHLOOKUPなどでこの表から特定の値なり範囲なりを取得するときにハマるかもしれません（かくいう私も2，3回同じことでハマりました）。

![スクリーンショット 2016-10-05 23.33.19.png](https://qiita-image-store.s3.amazonaws.com/0/139134/9537c911-8035-3362-f3a6-ff85d2dcead3.png)

#他のスプレッドシートのシートも統合できる
　IMPORTRANGE関数を混ぜるとできます。すなわち、下記のような形でできるということです。具体例は割愛します（すみません、正直な話、ちょっと力尽きてきました）。

```
=QUERY({
QUERY(IMPORTRANGE("スプレッドシートキー",範囲),"select文");
QUERY(IMPORTRANGE("スプレッドシートキー",範囲),"select文")
},"select文")
```

#余談
　まだまだQUERY関数は応用範囲が広く、ほんの一部しか紹介できませんでした。本当にキリがないので。ところで私がGASに興味を持つきっかけとなったのも実はこのQUERY関数で、特に今回紹介した結合やピボットを知って「シート上でこんなSQLライクなことができるのか！」と感動したものです。

#結局アマゾン電子書籍化（Kindle出版）しました
　というわけで遂に[「QUERY関数：最強の関数を使いこなそう！」](https://www.amazon.co.jp/dp/B07PDFSMNN/)というタイトルでKindle出版しました。QUERY関数を自分なりに体系的にまとめてみました。ここに投稿してから2年半があっという間に過ぎていますがその間いろいろ熟成してきたのでまとめてみたといったところです。まあその間も出したいなあとは思っていたのですけど。。
機械学習の勉強

#記事について
普段は大学では全く異なった分野について研究活動をしています。ITに携わるものとして、近年話題の機械学習を知らないままではよくないと思い勉強を始めました。といってもライブラリを使うくらいならできます。。それでは面白くないので基礎の基礎から勉強を始めましたので復習も兼ねてログを書いていこうと思います。なお情報源はできるだけ信頼できそうな記事を使おうと思います。もし間違ったことを書いていたらご指摘をお願いいたします。研究の合間にゆっくり書いていきます。

#パターン入力から出力までの流れ
機械学習の基礎の基礎は入力のパターンを分析して適切な出力を得ることである。簡単な例では紙に数をかいて(入力パターン)、その数字が1~9のどれかを当てる(出力)というもの。
入力に対して特徴量を抽出して、識別演算、辞書との照らし合わせをして出力を得る。この流れは複雑そうな処理でも変わらないみたい。ここでいう特徴量とは特徴ベクトルとも言える。

##特徴ベクトル
ここからは捕捉だけどここでいう特徴量ベクトルとは最も重要な部分であると言える。例えば紙に書いた1~9までの数字を認識して当てる場合、これらを50 × 50の空間に分けて、もし色がついていたら1、色がなかったら(白い部分)　0を入力とする。つまり50 × 50 次元のベクトルが特徴ベクトルとなる(はず)。

##識別演算
どのような入力がきたらどのような出力を返すのかは識別演算が担当する。簡単な例ではあらかじめどのような特徴ベクトルがきたらどのような出力をするのかを辞書として持っておけばいい。

##NN法
これが入力から出力までの流れである。
ここで問題になるのが入力の特徴ベクトルのパターンの膨大さである。もし紙に書いた数字を認識する例だと人間ごとの筆跡の差や数字の許容範囲など様々なパターンが考えられてしまう。これを全て辞書型の一致で照らしあわせて出力を決定する方式だと対応ができなくなる。そこで特定の正解パターン(プロトタイプ)を辞書に登録し、入力ベクトルはこのどれに近いかで出力を決める。つまり1~9の数字の場合どのような特徴ベクトルになるのかを大雑把に入力しておいて、入力がどれに近いかを計算してそのあと出力をきめる。といっても一番近いものに...となると精度を落とすことになる。例えばアルファベットのTが1に近いと判断して1にするのは認識としては良いとは言えないと感覚的にわかる。
これを回避するために特徴ベクトル間に"距離"を定義し、ある程度の距離以上はふさわしくない入力として排除する必要がある(ユークリッド距離が使われることが多いらしい)。これが有名なk-NN法と呼ばれるものらしい。
プロトタイプは複数のクラスが存在し、各クラスごとにさらに複数のプロトタイプがある(複数のクラスとは上の例だと1~9の数字を分割することを表し、複数のプロトタイプは個人差のある数字の書き方への対応を表すとおもう)。これらのプロトタイプはクラスごとに区切る必要がある。区切りかたは各クラスの分布範囲の重心をもとめ、その重心間の垂直二等分線をとって境界線とする方式があるらしい。


#感想
第一回目はパターンの認識の基礎について
次はいよいよ学習について...
CentOS7にjulia-0.5.0をインストールしてMySQL（MariaDB）でごにょごにょする

#うへぇ、行列の計算させられる…
って時にjuliaだとさくっと書けます。
行列以外もいろいろ得意なんですが、まだそこまで使い込んでいないし、実は私自身数学が苦手なので、よくわかんないです。
使い方は数学好きの方におまかせします。

##こんな方にはjuliaをおすすめします。
* なんか計算っぽいことしないとならなくなった
* 本当はしたくない。さっさと終わらせたい
* 早く終わらせたいけど、計算のたびにコンパイルとかしたくない
* ライブラリとかリンクとかめんどくさい
* エクセレントに書きたい
* コマンドラインが好き
* 新しいものが好き
* 人と違うものが好き
* 女の子っぽい名前が好き
* 新言語投入で会社を困らせたい

というわけで上記に当てはまった私はjuliaを使うことにしました。

##CentOS向けの情報が少ない
そもそもjuliaは主要なOSに対応しています。
* Windows → インストーラがあります。
* Mac → インストーラがあります。
* Linux（Ubuntu）→ apt-get でいけたと思います。
他のLinux用にも一応バイナリはあるようなのですが、OSが新しすぎると動かないとの情報もあり、ソースからコンパイルすることにしました。
コンパイルとか面倒くさいですが、最初の1回だけなので我慢します。
epelでいけるとの情報もありましたが、epelを有効にしてyumってみても見つかりませんでした。

juliaは日本語の情報が少ないです。
ユーザが多いはずのRedHat系ディストリビュージョンへのインストール情報も少ないです。
ありがちな名前なので英語での検索も面倒です。

#CentOS7へのインストール
[julia公式サイト](http://julialang.org/)
まずは素直にソースコードを持ってきます。

juliaのmakeはコンパイルだけで/usrディレクトリなどへのインストールは行なってくれません。
まぁ、あとでどうにでも移動できますのでお好みのディレクトリにダウンロードして大丈夫です。
移動を考えて root で作業しています。

```
wget https://github.com/JuliaLang/julia/releases/download/v0.5.0/julia-0.5.0.tar.gz
```
さすがにNighty Buildを使う度胸はありません。

本格的にコンパイルする前に、必要なパッケージをyumでインストールしておきます。

* git
* cmake

は必須です。
他にも必要なものがあったかもしれませんが、ある程度開発環境をととのえたPCでしたので、正確に何が必要なのかわかっていません。
私の場合、make中に「cmakeがない」と言って止まったので、「cmake」を入れて再コンパイルしました。

また、

* blas, blas-devel
* blas64, blas64-devel
* openblas, openblas-devel
* lapack, lapack-devel

があればどれか使うかもしれませんし無駄かもしれません。検証していません。別になくてもインストールできます。

さて、ソース本体を解凍してコンパイルします。

バージョン0.5.0では、configure など気の利いたものはありません。
いきなり make です。
コンパイルには1時間ぐらいかかりますので、覚悟しておきましょう。
make だけ叩いておやつを食べててもいいですが、エラーで止まってる場合もありますので時々覗くようにしましょう。

```
tar xzvf julia-0.5.0.tar.gz
cd julia-0.5.0
make
```
これで放置します。
なんかエラーが出たら、エラー文を読んで考えましょう。

コンパイルが終わったら、お好みのディレクトリに配置します。
私は、面倒くさかったので /usr/local 以下にごっそり移動して実行ファイルにシンボリックリンクを貼りました。

```
cd ../
mv julia-0.5.0 /usr/local/
ln -s /usr/local/julia-0.5.0/usr/bin/julia /usr/local/bin/julia
```
これで、本体のインストールは完了です。
ユーザ権限で初回起動する時に、~/.julia が生成されます。

##MySQL（MariaDB）への接続
ついでなので、MySQL（MariaDB）に接続できるようにしてみます。
時期によるのかもしれませんが、標準的な「Pkg.add("MySQL")」では、「using MySQL」時にエラーが出ましたので「Pkg.clone」しています。

コマンドプロンプトは、「$」がシェル、「>」がjuliaのREPLです。

```
$ julia
...
ウェルカムメッセージ
...
> Pkg.clone("https://github.com/JuliaDB/MySQL.jl")
```

「Pkg.clone()」や「Pkg.add()」のあとは少し時間がかかります。
普通にgitを叩いているつもりで待ちましょう。

最後に簡単なサンプルを書いておきます。

「販売履歴テーブルのようなものから販売間隔の平均（秒）を取得」してみます。
REPLならば、1行目の「#!〜」は不要です。
最後の行も「mean(b-a)」で結果が表示されます。
なれるまではREPLで1行ずつ動作を確認していくのがいいと思います。

```
#!/usr/local/bin/julia
using MySQL
con = mysql_connect("127.0.0.1", "user", "password", "dbname")
df = mysql_execute(con, """
SELECT
    UNIX_TIMESTAMP(order_datetime) AS sec
FROM
    orders
ORDER BY
    order_daretime
"""
a = convert(Array, df[:sec])
b = copy(a)
pop!(a)
shift!(b)
println(mean(b-a))
```
実行は 「chmod +x ファイル名」で権限をつけて「./ファイル名」で結果が表示されます。

説明不要な簡単さでしょう？

ただ、以前より改善されたとはいえ、julia本体のVMの起動にかかるオーバーヘッドが気になります。

**起動が遅ければ起動させたままならいいじゃない**
などと企んでいるところです。

[juliaでソケットサーバを作って高速化する](http://qiita.com/y_irabu/items/ba68a952b3100f3a01c4)
[数学] 3D空間にベジェ曲線を描く


ただのベジェ曲線のメモですｗ
個人的にはこの記事（[中学生でもわかるベジェ曲線](http://blog.sigbus.info/2011/10/bezier.html)）が一番分かりやすい解説だと思います。

2次、3次のベジェ曲線についてアニメーションを使って解説してくれているサイトです。
イメージをするだけなら、この記事を読むのが一番早いのではないかなと思ってます。

## 概要

ということで概要。
[ベジェ曲線をWikipedia](https://ja.wikipedia.org/wiki/%E3%83%99%E3%82%B8%E3%82%A7%E6%9B%B2%E7%B7%9A)で調べると以下のように記載があります。

>ベジェ曲線（ベジェきょくせん、Bézier Curve）またはベジエ曲線とは、N 個の制御点から得られる N - 1 次曲線である。フランスの自動車メーカー、シトロエン社のド・カステリョ (Paul de Casteljau) とルノー社のピエール・ベジェ (Pierre Bézier) により別々に考案された。ド・カステリョの方が先んじていたが、その論文が公知とならなかったためベジェの名が冠されている[1]。コンピューター上で滑らかな曲線を描くのに2次ベジェ曲線 (Quadratic Bézier curve) や 3次ベジェ曲線 (Cubic Bézier curve) などが広く利用されている。

さらに引用になりますが、定義としては以下のようになります。

>制御点を $B0, B1, ..., B_{N-1}$ とすると、ベジェ曲線は、

```math
{\mathbf  {P}}(t)=\sum _{{i=0}}^{{N-1}}{\mathbf  {B}}_{i}J_{{(N-1)i}}(t)
```

式としては計算したい対象となる制御点 $1 ～ (N - 1)$ の範囲についての合計（$\sum$）として、$t$ を媒介変数の関数として表すことができることを示しています。

ちなみにこの $J_{ni}(t)$ は「[バーンスタイン基底関数](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%BC%E3%83%B3%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%B3%E5%A4%9A%E9%A0%85%E5%BC%8F)」と呼ばれる「ブレンディング関数」です。

これを式にすると、

```math
J_{ni}(t) = {n \choose i}t^i(1 - t)^{n-i}
```

*ここで $t$ の値は $0 - 1$ の間で変化するとき、両端点は $B_0, B_{N-1}$ を通り、それ以外の制御点が通らないのが一般的となります。*

なお、${n \choose i}$ は「[二項係数](https://ja.wikipedia.org/wiki/%E4%BA%8C%E9%A0%85%E4%BF%82%E6%95%B0)」と呼ばれる項となります。

この「二項係数」を計算する方法はいくつかあるようですが、読んでいても書いても一番簡単なのは以下の式でしょう。

```math
\textstyle \binom{n}{k} = \frac{n!}{k!\,(n-k)!}
```

Wikipediaには

>最後に、計算論的には不利だが、短く書けるのでしばしば証明や導出に用いられるよく知られた階乗函数を用いた式は

と記載があります。

それ以外は特にむずかしいものはないでしょう。
ただとはいえ、数式だけだとプログラムに持ち込むのに戸惑うかもしれないので、具体的なプログラムコードを示しておこうと思います。

```csharp
using System.Collections;

namespace Utility
{
    /// <summary>
    /// ベジェ曲線を描く
    /// </summary>
    public class BezierCurve
    {
        public Vector3[] ControlPoints { get; set; }

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public BezierCurve(Vector3[] controlPoints)
        {
            ControlPoints = controlPoints;
        }

        /// <summary>
        /// ベジェ曲線関数
        /// </summary>
        public Vector3 Evaluate(float t)
        {
            if (ControlPoints == null)
            {
                return Vector3.zero;
            }

            Vector3 result = Vector3.zero;
            int n = ControlPoints.Length;
            for (int i = 0; i < n; i++)
            {
                result += ControlPoints[i] * Bernstein(n - 1, i, t);
            }

            return result;
        }

        /// <summary>
        /// バーンスタイン基底関数
        /// </summary>
        static float Bernstein(int n, int i, float t)
        {
            return Binomial(n, i) * Mathf.Pow(t, i) * Mathf.Pow(1 - t, n - i);
        }

        /// <summary>
        /// 二項係数を計算する
        /// </summary>
        static float Binomial(int n, int k)
        {
            return Factorial(n) / (Factorial(k) * Factorial(n - k));
        }

        /// <summary>
        /// 階乗を計算する
        /// </summary>
        static float Factorial(int a)
        {
            float result = 1f;
            for (int i = 2; i <= a; i++)
            {
                result *= i;
            }

            return result;
        }
    }
}
```
Ubuntu 16.04 + CUDA7.5 + cuDNN5でTensorFlowをソースからビルドした際にハマった点

基本的に[公式の手順](https://www.tensorflow.org/versions/r0.11/get_started/os_setup.html#installing-from-sources)に従ってビルドした際にハマった点のメモ。
Docker使おう。

***identifier "__builtin_ia32_mwaitx" is undefined.* というエラーが出る**
gccのバージョンが高いため？
対策：third_party/gpus/crosstool/CROSSTOOLに下記のフラグを追加する
`cxx_flag: "-D_MWAITXINTRIN_H_INCLUDED" cxx_flag: "-D_FORCE_INLINES"`
https://github.com/tensorflow/tensorflow/issues/1066
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/g3doc/get_started/os_setup.md


***Couldn't open CUDA library libcudnn.so.* というエラーが出る**
`sudo apt-get install nvidia-cuda-toolkit`でCUDAをインストールすると、/usr/lib/x86_64-linux-gnu/にライブラリがインストールされるが、TensorFlowが[CUDA_ROOT]/lib64にライブラリがある想定となっているために起きる。
対策：
https://devtalk.nvidia.com/default/topic/936212/tensorflow-cannot-find-cudnn-ubuntu-16-04-cuda7-5-/
に記載されているように、シンボリックリンクを貼ると解決するが非常に気持ち悪い。

```
$ sudo mkdir /usr/local/cuda
$ cd /usr/local/cuda
$ sudo ln -s  /usr/lib/x86_64-linux-gnu/ lib64
$ sudo ln -s  /usr/include/ include
$ sudo ln -s  /usr/bin/ bin
$ sudo ln -s  /usr/lib/x86_64-linux-gnu/ nvvm
$ sudo mkdir -p extras/CUPTI
$ cd extras/CUPTI
$ sudo ln -s  /usr/lib/x86_64-linux-gnu/ lib64
$ sudo ln -s  /usr/include/ include
```