OmniAICreator/Qiita-1.07M huggingface dataset:
Unity2Dでタイルマップを敷き詰めてスクロールさせようぜ

Qiitaには画像アップロード上限があるんで　古い記事をまとめ直す。

ちらつきの解消については　次のサイトの記事が参考になる。

「SpriteRenderer、とりあえずの隣接ドット対策」Unity / VRゲーム開発日記＠長崎
http://icoc-dev.hatenablog.com/entry/2014/09/29/111645

----

# Unity2Dでタイルマップを敷き詰めてスクロールさせようぜ

前回： http://qiita.com/muzudho1/items/86fedc87b4b9e5731bfb

![20170605k2.png](https://qiita-image-store.s3.amazonaws.com/0/159417/16c67b6a-19e3-2f0b-9f88-d2a711e3b7c3.png)

後ろは　だいたい　こうなっている。

- **画面**　見えているところ
- **ステージ**　カメラが動いてくる。カメラに映ってないところも作っている。Unity では **シーン** と考える
- **3D空間**　何も置いてなくても、えんえんと空間は在る
- **ステージデータ**　木とかコピーして増やせるんで、コピー元になるのを置いている。Unity では **アセット** と考える

**撮影されてるところ** は、コンピューターで計算する対象になるが、映ってないところは計算を省いてくれる。「**カリング**」でググろう。

じゃあ、Unityの３Ｄ空間に　バンバン　山とか　木とかを置いていこう、となるんだが、木を１本１本　作っていては　コンピューターの計算対象になる。
木とか　コピーで水増しして映しておけばいいケースもある。計算を省こう。「**プレファブ**」でググろう。

Unityの　シーン　が、ステージ・データ　そのものだ。

じゃあ、上図の　ステージデータ　って何か？
ゲーム開発受注の案件によっては

- JSON形式にしてステージを送受信したい、
- ステージは　方眼紙（配列）のイメージをしている

といったことがある。

Unityの　シーン　を直せず　いじらず、テキストエディターで編集したい、ということだ。
これを　とりあえず　ステージデータ　と呼ぶことにした。

このように　ステージデータを編集するためのツールは **マップエディタ**
 などと呼ばれ、アセットストアに　いろいろ売ってるようだ。
調査予算とかないんで、無料で使える Tiled Map Editor で補うことにした。

「Tiled Map Editor」
http://www.mapeditor.org/


# 容量の面での問題

ステージをタイル形式にして JSON で送るのだから、転送容量は　でかくなる。

ステージのデータが　テキストで　１メガバイトを超えそう……、ということは「気にしなくていい」案件なら　このまま進んで問題ない。

気にする場合は　別に対策を取ること。


# スクロール機能

ランゲーだと　横に延々と走っていくわけだが、ステージ全部を最初にローディングするというのは　非現実的だ。

ステージの初めの方で　すぐに死んでしまうプレイヤーもいるだろう。遊ばな後ろの方のステージを　ローディング　するのもおかしい。

![20170605k3.png](https://qiita-image-store.s3.amazonaws.com/0/159417/890a6997-3f14-6c02-ac94-d74d29881a15.png)

まずは短いステージでやってみる。

上図の黒い枠を　０プレースホルダ―、１プレースホルダ―、２プレースホルダーと名付けるとする。

![20170605k4.png](https://qiita-image-store.s3.amazonaws.com/0/159417/1a17702e-42c9-5ddf-db36-fb1f43baa1c0.png)

画面が上に行ってしまえば、０プレースホルダーを　２プレースホルダーの後ろに移動させるという仕組みだ。

```C#
// 多分こんな感じで 上に行く
transform.Translate( 0, 200f, 0 );
```

プレースホルダーの長さは　設定で伸ばせるようにしておこう。
どれぐらいの大きさが　ゲームプレイに影響を与えない通信に収まるのか　設計フェーズでは分からない。

![20170605m1.png](https://qiita-image-store.s3.amazonaws.com/0/159417/fb049bc3-1be4-af76-2284-bd5e7fafd78a.png)


プレースホルダーの中は、左上から　０セル、１セル、２セル……　とする。

そして　その場所に　セル・ゲーム・オブジェクト　を置いておく。

ステージ・データの　タイル・データによって、
セルの　スプライト画像を貼り換えたり、コライダー（BoxCollider2D）をＯＮ／ＯＦＦ　したりすればいいのではないか。

ただ、別々に　３つのプレース・ホルダーが動くプログラムを書くのが難だったので　プレース・ホルダー・チェイン　という名前の１つのクラス、１つのゲーム・オブジェクトにして　実装してみた。

```C#
// スクリプトで　コライダーを追加する例

GameObject go = new GameObject("Cell0", typeof(SpriteRenderer), typeof(BoxCollider2D));
BoxCollider2D col = go.GetComponent<BoxCollider2D>();
col.size = new Vector2( 0.4f, 0.4f);
```

例えば、GameObject のコンストラクタは可変長引数になっていて、コンポーネントを追加していくことができる。
BabelなしでFlowを使う

基本的にFlowを使うときは、Babelを用いてコンパイルを前提していると思うが、簡易的なスクリプトを書くときでもFlowは有効だ。

Flowには、Comment Typesと呼ばれる機能があり、コメントベースのシンタックスが用意されている。

[Comment Types | Flow](https://flow.org/en/docs/types/comments/)

```js
// @flow
function sum(a /*: number */ , b /*: number */) {
	return a + b
}

sum('hello', 2)
```

基本的には、`/*: 型 */`と書くだけ。
型チェックによって思わぬバグを防げるし、ESDocやJSDocなどでコメントをつけるより気軽である。

![スクリーンショット 2017-06-05 16.13.02.png](https://qiita-image-store.s3.amazonaws.com/0/15319/cf2d4920-ecb9-1bb6-c9e1-110d2975c982.png)



また、エディタの支援により、補完されるのも嬉しい。

![スクリーンショット 2017-06-05 16.12.47.png](https://qiita-image-store.s3.amazonaws.com/0/15319/79e2b74f-a0b3-89b7-716d-cbaad6c4070f.png)


このコメント形式のFlowを採用しているライブラリをいくつか挙げておく。

[ast-pretty-print/index.js at master · babel-utils/ast-pretty-print](https://github.com/babel-utils/ast-pretty-print/blob/master/index.js)

[babel-flow-scope/index.js at master · babel-utils/babel-flow-scope](https://github.com/babel-utils/babel-flow-scope/blob/master/index.js)

[thejameskyle/read-file-async: Typed async readFile function](https://github.com/thejameskyle/read-file-async)
Visual Studio / WPF > 「scm:」プレフィックス付きのXML名前空間 > IDEでの入力

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

http://gushwell.ldblog.jp/archives/52306210.html
を元に学習中。

気になった部分は以下。

```
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
```

CollectionViewSourceのSortDescriptionの記述で使われている。

このXML名前空間をどのように追加するのか不明だった。

以下のようにすればできた。

XAMLファイルのWindowの定義にて`xmlns:scm=""`まで入力する。
以下のリストが表示される。

![2017-06-05_16h01_10.png](https://qiita-image-store.s3.amazonaws.com/0/32870/723cadf6-6c1e-b4d3-c701-eb4b6f64d6a6.png)

`compone`まで入力し表示されるリストから`System.ComponentModel(WindowsBase)`を選択する。

![2017-06-05_16h03_00.png](https://qiita-image-store.s3.amazonaws.com/0/32870/6e16d359-5816-1261-fe74-763105296691.png)

以下のようになる。

```
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
```
チームでVSCodeを使用する際にインストールすべき拡張機能を設定する

# tl;dr
* コマンドパレットを開き、`Extensions: Open Extensions File`（拡張機能: お勧めの拡張機能の構成（ワークスペース））を選択してチームで使用したい拡張機能を指定して保存する。
* 作成したjsonファイル（`.vscode/extensions.json`）をGitなどで共有する。
* VSCode上でワークスペースが推奨する拡張機能が表示されるようになるので、各開発者はそれに基づいてインストールを行う。

# 背景
VSCodeをプロジェクトで使用する際、各開発メンバーにインストールして欲しい拡張機能を指定するのに便利な機能があったのでメモ。
割と常識だったりするかもしれません・・・

# 前提
VSCode バージョン1.12.2で確認しています。

# 公式による説明
https://code.visualstudio.com/docs/editor/extension-gallery#_workspace-recommended-extensions

# 設定手順
## .vscode/extensions.jsonの作成
だいたい公式サイトに書いてありますが、コマンドパレットから`Extensions: Open Extensions File`（拡張機能: お勧めの拡張機能の構成（ワークスペース））を選択すると.vscodeディレクトリ配下にextensions.jsonが作成されます。
以下が設定例となります。

```.vscode/extensions.json
{
	// See http://go.microsoft.com/fwlink/?LinkId=827846
	// for the documentation about the extensions.json format
	"recommendations": [
		// Extension identifier format: ${publisher}.${name}. Example: vscode.csharp
		"EditorConfig.editorconfig",
		"HookyQR.beautify"
	]
}
```

上記の例ではEditorcondigとBeautifyの拡張機能をリコメンドするように設定しています。
拡張機能のID（例だと`"EditorConfig.editorconfig"`の部分）はMarketplaceにて確認できます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/184908/9836519a-2084-be77-2523-29dbcab6b950.png" width=70%>

## 作成したjsonファイルを共有する
そのままレポジトリにコミットしてしまうのが一番手っ取り早いです。
`.vscode`ディレクトリには他の設定ファイルも保存されているので、Gitであれば以下のようにextensions.jsonを例外的にコミット対象にする設定をすると良いかもしれません。

```.gitignore
.vscode/*
!.vscode/extensions.json
```

## 設定した拡張機能をインストールする
ここからはチーム内の各開発者が行うべき手順となります。

jsonを配置してもVSCodeが勝手に拡張機能をインストールしてくれるわけではないため、各開発者は手動で拡張機能をインストールする必要があります。

`.vscode/extensions.json`がワークスペースに存在しており、`"recommendations"`に拡張機能の指定があると起動時に以下のようなプロンプトが表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184908/210d0e88-f6d9-4404-7c51-ea538bdfd044.png)

`推奨事項を表示`をクリックすると設定した拡張機能が表示されるのでインストールします。

<img src="https://qiita-image-store.s3.amazonaws.com/0/184908/1f09b59d-38f7-565a-8a5d-406807e3c275.png" width=50%>

既にインストール済みの拡張機能についてはインストールボタンが表示されません。
（上記の画像ではEditorconfigの拡張機能はインストール済み）

起動時のプロンプト以外にも拡張機能タブから3点リーダのメニューを表示して`ワークスペースのおすすめの拡張機能を表示`を選択すると表示できます。

以上です。
mysql コマンドオプション

#### -u
ユーザ名指定
#### -p
パスワード指定
#### -D
データベース名指定
#### -h
ホスト名の値を指定
#### -e
コマンドラインから直接 sql を実行

### 例
mysql -uユーザ名 -p -Dデータベース名 -hホスト -e" select 文とか" > ファイル名.tsv
cat/TYPE の代替としての StreamRelay.NET.exe (NTFS代替ストリーム)

C#/.NET Framework のファイルストリームは、NTFS代替ストリームに対応していない。
という事で、VisualC++/CLR にて、代替ストリームを読み書きするストリームをプラグインとして、作った。

---
### プラグイン

VisualC++/CLR には「AnyCPU」というコンパイルができないので、

- Plugins\Win32\stdioFileC32.dll
- Plugins\Win64\stdioFileC64.dll

が実体だ

---
### cat/TYPE コマンドの代替(代替ストリーム)

通常のファイル読み書きと同じで、ストリームの実体(ソース)を「コンソール(-LocalPort=0 or -RemotePort=0)」にして

- -LocalInputFileC
- -RemoteInputFileC
- -LocalOutputFileC
- -RemoteOutputFileC

を指定する

`C:\>echo Hello > a.txt:hehehe
C:\>dir a.txt
2017/06/05  15:56                 0 a.txt
               1 個のファイル                   0 バイト
C:\>type a.txt
　
C:\>StreamRelay.NET.exe -LocalPort 0 -RemotePort 0 -LocalInputFileC a.txt:hehehe
Hello`

---
### cat/TYPE の代替としての StreamRelay.NET.exe

[cat/TYPE の代替としての StreamRelay.NET.exe](http://qiita.com/tomoki0sanaki/items/5ee9a40d5cccd1e08a27)

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
Viaual Studio 2017 のエディション比較　メモ

# Viaual Studio 2017 のエディション比較サイトが探しにくいので自分用のメモ


## Visual Studio エディション主要比較
https://www.microsoft.com/ja-jp/dev/products/community.aspx
ザックリと機能比較したい場合はこちら。
CommunityとProfessionalの大きな差は Codelens ですね

特に Visual Studio Communityを利用可能な人、団体が細かく書かれていますね
•個人開発者
•学習、学術調査目的の開発者
•オープン ソース開発者
•中小規模の企業や団体　－＞　**PC 台数 250 台未満かつ年商 1 億円未満の企業や団体。当該組織は 5 名まで利用可能。**

Visual Studio のバージョンが書いていませんが、2017のものとCommunityの制限が一致していますので、2017と思われます

---
Codelens のないコードのイメージ
![Codelensなし.PNG](https://qiita-image-store.s3.amazonaws.com/0/58634/c4a9f051-d62f-90bb-9728-011a08972e00.png)


Codelens のあるコードのイメージ
参照関係が参照できまくる
![Codelensあり.PNG](https://qiita-image-store.s3.amazonaws.com/0/58634/b95218c7-92eb-9576-c29d-52fccfb39360.png)
１人でも過去のアクティビティを振り返ることができる
![Codelensあり2.PNG](https://qiita-image-store.s3.amazonaws.com/0/58634/a310a0ff-9e9f-d833-7e12-cdb510d1bafe.png)
１人でもコードの変更履歴が堪能できる
![Codelensあり3.PNG](https://qiita-image-store.s3.amazonaws.com/0/58634/49008e5b-c8c4-3be8-a087-f681a8c6b134.png)
けっこうすごいですね

MSDNでの詳細解説はこちら
CodeLens によるコード変更とその他の履歴の検索
https://msdn.microsoft.com/ja-jp/library/dn269218.aspx

--

## Viaual Studio 2017 製品の比較
https://www.visualstudio.com/ja/vs/compare/
一見、●●●○　と書かれていて意味がわからないが、展開するとよくわかります
Visual Studio Communityを利用可能な人、団体
•個人の開発者
•クラスルーム学習
•アカデミックな研究
•オープン ソース プロジェクトへの貢献
•非エンタープライズ組織  最大 5 ユーザーまで -> **エンタープライズ組織とは、PC 250 台超、または年間収入 100 万米ドル超の組織です。**

$1 = 100円　換算なのかな・・・ｗ

---
なお、Visual Studio 2017 は更新がかなり激しいので常に最新版をチェックするとよいです

## Visual Studio 2017 (バージョン 15.2) リリース ノート
https://www.visualstudio.com/ja-jp/news/releasenotes/vs2017-relnotes
seq scan or index scan - PostgreSQL random_page_cost

### SQL Performance tuning - **random_page_cost** 
 cf. effective_cache_size


  same as *effective_cache_size*, random_page_cost parameter controls PostgreSQL sql
cost planning behavior...

  https://www.postgresql.org/docs/9.6/static/runtime-config-query.html
 
###　a little experiment

As an experiment, temporarily decrease effective_cache_size value and rerun the same sql...

```sql
SET random_page_cost to 2;
```

```
                         ->  Index Scan using users_pkey on control.users us  (cost=0.29..1.31 rows=1 width=10) (actual time=0.006..0.006 rows=1 loops=24)
                                Output: us.user_id, us.group_id, us.description, us.password, us.person_id, us.department, us.regist_time, us.modified_time, us.password_expire_time, us.available_from, us.available_to, us.trace_queue, us.available, us.user_name, us.agency_id, us.location, us.last_login_time
                                Index Cond: (us.user_id = ht.operator)
                                Buffers: shared hit=71 read=1
```


Now, restore to the default value = 4 

```sql
SET random_page_cost to 4;
```

```
                                ->  Seq Scan on control.users us  (cost=0.00..571.08 rows=21708 width=10) (actual time=0.010..8.800 rows=21708 loops=1)
                                      Output: us.user_name, us.user_id
                                      Buffers: shared hit=354
```

  index scan　-> seq scan  :cry:
Swift3で12時を起点に時計をドラッグで回転させる

![time.gif](https://qiita-image-store.s3.amazonaws.com/0/135794/2f7c4e20-1d33-bb2a-b40b-b748713e2ae6.gif)




以前、僕は[Swift3で9時を起点に時計をドラッグで回転させる](http://qiita.com/Ryosuke-Hujisawa/items/f460a565a300d65a36a5)という記事を書きました。文字通り、9時を起点に時計をドラッグで回転させるというものです。なぜ9時なのか、起点を別の位置に変える方法がわかりかねたからです。実装では回転の起点をちょうど１２時の場所に持って来なきゃいけなくて、僕の数学の知識がウスラトンカチだったのでかなり悩みました。

# おかしくなる原因

おかしくなる原因はatan2で割り出した回転軸xとyの軸が現実世界だと中心から始まるのに対して、ウェブのの世界では左上から始まるからです。

![bad.gif](https://qiita-image-store.s3.amazonaws.com/0/135794/d35f4931-698f-a31d-0def-b80212ee26c3.gif)


# 考え方

考え方として、時計の針の起点が９時の部分にあったとして、それを１２時の部分に持ってきたいのだから`-90`すればいいんじゃないかと思った訳ですが、単純に９０引き算してもおかしな挙動をします。atan2で求めた角度は度数法ではなくラジアンなので、90を引くのにもラジアンで引かなければいけないってことでした。頭が悪いと苦労します...orz

![good.gif](https://qiita-image-store.s3.amazonaws.com/0/135794/8243eee8-fe06-6332-4bf2-a634fb8c49b7.gif)


# ポイント

atan2で求めたangleが「ビューの中心からみたpositionの方向」であり、方向はX軸の正の方向（左上を軸とした起点）を0として左回りにラジアンで求めています。

```swift
let angle = atan2f(Float(target.y-position.y), Float(target.x-position.x)) 
```

この実装に度数法ではなくアラジンで-90を引き算します。`M_PI2`というのは円周360なので、その半分で`M_PI`180を2引き算します。

```swift
- Float(M_PI) / Float(2)
```

# 全実装

```swift

import UIKit

class ViewController: UIViewController {
    


    var myView: UIView!
    override func viewDidLoad() {
        super.viewDidLoad()
        myView = UIView(frame: CGRect(x: 0, y: 0, width: 20, height: 100))
        myView.center = self.view.center
        myView.backgroundColor = UIColor.red;
        self.view.addSubview(myView)
        
        myView.layer.anchorPoint = CGPoint(x: 0.5, y: 1.0)
        
        let box = UIView(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
        box.backgroundColor = UIColor.blue
        myView.addSubview(box)
    }
    
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent!) {
        
        let touch = touches.first!
        if touch.view === myView.subviews[0] {
            let position = touch.location(in: self.view)
            let target = myView.center
            
            let angle = atan2f(Float(target.y-position.y), Float(target.x-position.x)) - Float(M_PI) / Float(2)
            
            myView.transform = CGAffineTransform(rotationAngle: CGFloat(angle))
        }
}

}

```

# 参考

[Swift3でタップした位置が何故か左になる](https://teratail.com/questions/78919)
[binary operator '/' cannot be applied to two 'Double' operands](https://stackoverflow.com/questions/40813786/binary-operator-cannot-be-applied-to-two-double-operands)
[Swift3で9時を起点に時計をドラッグで回転させる](http://qiita.com/Ryosuke-Hujisawa/items/f460a565a300d65a36a5)
[Swift3で12時を起点に時計をドラッグで回転させる](http://off.tokyo/blog/2017/06/05/swift3%E3%81%A712%E6%99%82%E3%82%92%E8%B5%B7%E7%82%B9%E3%81%AB%E6%99%82%E8%A8%88%E3%82%92%E3%83%89%E3%83%A9%E3%83%83%E3%82%B0%E3%81%A7%E5%9B%9E%E8%BB%A2%E3%81%95%E3%81%9B%E3%82%8B/)
柔らか層外伝 Firewall編

#Bluemix Infrastructure（旧称SoftLayer）と Firewall について
インターネットに露出した環境を守るのに最低限必要な道具は何でしょうか？それは Firewall でしょう。もちろん、Firewall があれば万全だという意味ではありませんが、外からの攻撃を効率よく防ぐには最も効果的なものが Firewall ですね。
そんなFirewallですが、Bluemix Infraには、たくさんの選択肢があります。

#転ばぬ先の杖 :coffee: 

## 杖１：Bluemix Infraで選択できる Firewallラインナップ

用途や保護したい対象に応じて豊富な選択肢があります。
多くのクラウドにおいて、専有型の Firewall があるのも特徴です。
専有型は、in/out の双方を監視対象にできるため、企業用のシステムや、厳しい管理対象としなければならないシステムの Firewall として選ばれています。

| 特徴 | OS<br>Firewall | Hardware<br>Firewall<br>共用型 | Hardware<br>Firewall<br>専有型 | Fortigate<br>Security<br>Appliance | Vyatta<br>Gateway<br>Appliance | WAF<br>Netscaler<br>VPX Plemium |
|:-----------|:------------|:------------|:------------|:------------|:------------|:------------|
|適用範囲|OS|サーバーの<br>IPアドレス1個|パブリック<br>VLAN1個|パブリック<br>VLAN1個|パブリック,<br>プライベート<br>VLAN N個|パブリック,<br>プライベート<br>VLAN 1個|
|共用・専用|専用|共用|専用|専用|専用|専用|
|HA構成|n/a|コールド<br>スタンバイ|可能|可能|可能|可能|
|管理方法|CLI, GUI|カスタマー<br>ポータル|カスタマー<br>ポータル|Web-GUI, CLI|主にCLI, Web-GUIも有|Web-GUI, CLI|
|保護対象|L4(TCP)|L4(TCP)|L4(TCP)|L4(TCP)|L4(TCP)|L7(アプリ)|
|複数VLAN<br>保護|不可|不可|不可|不可|可能|不可|
|性能|サーバー<br>性能に<br>依存|10～<br>2000Mbps|1Gbps<br>(NICリンク速度)|1Gbps<br>(NICリンク速度)|10Mbps～<br>10Gbps|10Mbps～<br>1Gbps|
|そのほか|OSバンドルFW<br>またはAPF|サーバー単位|VLAN単位|Outbound保護<br>FortiGuardAV, NGFW, Web filtering|VPN, NAT, VLAN トランク対応, VyOS（サポート有）|アプリ脆弱性対応|

ちなみに、Hardware Firewall はアプライアンス型としても選択できる Fortigate です。
また、Vyattaの10Gbpsを選択するには、一番最初のオーダー時に10Gbpsまで拡張できるものを選択しておかないと最大1Gbps（Redundant構成で2Gbps）となります。ご注意を。

## 杖２：Firewallあるある
Firewallはオーダーするだけでは何の防御もしてくれません。ルールを追加し、必要な Filter などの設定をして始めてシステムが安全になります。またログも定期的に監視し、ルールが適切かどうかなどの確認をするようにしておくとより安心です。

## 杖３：Fortigateのあるある
Dedicated Hardware Firewall（Fortigate）を使っていてHA構成を組んでいるユーザーは注意が必要です。
Fortigateの仕様（バグというべき？）で、497日間連続稼動すると、Heartbeatが失敗し、意図しないFailoverが起きてしまいます。

対象：
- FortiOS 4.3 系: 4.3.16 と、それ以降の全て
- FortiOS 5.0 系: 5.0.5 と、それ以降の全て
- FortiOS 5.2 系: 5.2.0 と、それ以降の全て

暫定対応：　497日前に再起動する
恒久対応：　FortiOS 5.2.5以降にバージョンアップ

get system performance status　で何日間起動していたか、get system status　でバージョンを確認できます。ご注意を。
ランク2多相の、ふたつの側面

# ランク2多相の、ふたつの側面

## はじめに

この記事はhaskell-jpというslack上での、やりとりのなかで、気づいたことをまとめたものです。ランク2多相には、「できることを、ふやす」という側面と「できることを、明示的に制限する」という側面とがあるということに、気づかせてもらいました。とりあえず、いそいで書いたので、読みぐるしい点や、誤りなどあると思います。

## ランク2多相の、かんたんな説明

ランク2多相について、かんたんに説明します。以下の記事も参考にしてください。

[Higher Rank Type とは](http://qiita.com/hyone/items/a1a300325253e3c5b7d1)

### ふたつの木の要素の数、または高さを足し合わせる

ランク2多相が必要で、なおかつ、かんたんで意味のある例というのは、なかなか思いつきません。すこし作為的ですが、ふたつの木の要素の数を足しあわせる関数と、ふたつの木の高さを足しあわせる関数とを、一般化した関数の例を、みてみましょう。

まず、木の要素数を求める関数も、高さを求める関数も、つぎのような型になります。

```haskell
length :: Tree a -> Int
height :: Tree a -> Int
```

これらの関数を、第1引数としてとる関数であれば、2種類の操作を一般化したものとなります。また、ふたつの木の、それぞれの要素の型は異なっていても良いものとします。すると、求める関数の型は、つぎのようになります。

```haskell
foo :: (Tree a -> Int) -> Tree b -> Tree c -> Int
```

しかし、このような型付けで、求める関数を定義することはできません。このように型付けされた関数fooは、つぎのような型の関数をまとめて定義したのとおなじことです。

```haskell
foo1 :: (Tree Double -> Int) -> Tree Char -> Tree Bool -> Int
foo2 :: (Tree String -> Int) -> Tree [Int] -> Tree (Maybe Char) -> Int
foo3 :: (Tree (Int, Char) -> Int) -> Tree () -> Tree Double -> Int
foo4 :: (Tree () -> Int) -> Tree Double -> Tree () -> Int
.
.
.
```

つまり、それぞれの最終的に適用される段階でのかたちには、多相性はなく、型変数にはいる型はひとつに定まっている必要があります。最終的に適用される段階でのかたちに、多相的な関数を含ませるためには、2階の多相性、つまりランク2多相が必要になります。正しくは、つぎのようになります。

```haskell
bar :: (forall a . Tree a -> Int) -> Tree b -> Tree c -> Int
```

このように、予約語forallを使うことによって、第1引数について「どのような型の値を要素として持つ木でも、引数としてとれる関数」として、適切に型づけすることができます。

ランク2多相を使うと、関数の多相性を保ったまま、引数として、とることができます。実際に試すことのできる、関数の定義を載せておきます。

```haskell
bar :: (forall a . Tree a -> Int) -> Tree b -> Tree c -> Int
bar f t1 t2 = f t1 + f t2

height :: Tree a -> Int
height (Node _ []) = 1
height (Node _ ts) = 1 + maximum (map height ts)
```

このファイルを読み込んで、つぎのように試してみます。

```haskell
> bar length (Node 1 [Node 2 []]) (Node 'a' [Node 'b' [], Node 'c' []])
5
> bar height (Node 1 [Node 2 []]) (Node 'a' [Node 'b' [], Node 'c' []])
4
```

## できることが、ふえる

上記の例で、ランク2多相を使うことで、できることが、ふえているのがわかります。ひとつの多相関数を使って、複数の、それぞれ型のちがう、値を処理することは、ランク2多相を使わなければできません。

## できることが、制限される

forallを明示して、ランク2多相としたことで、できなくなることもあります。上記の例では、第1引数の関数fには、「多相関数でなければならない」という制限がつきます。つぎの、ふたつの型付けをくらべてみてください。

```haskell
hoge :: (Tree a -> Int) -> Tree a -> Int
piyo :: (forall a . Tree a -> Int) -> Tree b -> Int
```

関数piyoの第1引数には、前述の関数lengthやheightのような、多相関数しかとることができません。しかし、関数hogeでは、たとえば、Tree Integer -> Intのような関数を、第1引数にすることができます。その結果、つぎのようなことも可能になります。

```haskell
> hoge sum (Node 1 [Node 2 []])
3
```

しかし、つぎのようなことは、できません。

```haskell
> piyo sum (Node 1 [Node 2 []])
(型エラーとなる)
```

## できることを制限するという使いかた

ランク2多相には、「できることを制限する」という使いかたもあります。

https://hackage.haskell.org/package/mmorph-1.1.0/docs/Control-Monad-Morph.html

mmorphパッケージのMFunctorでは、クラス関数のhoistの型は、つぎのように定義されています。

```haskell
hoist :: (forall a . m a -> n a) -> t m a -> t n a
```

このようにすることで、第1引数である関数が、型aについて多相的であることを、明示的に要求しています。これは、型aに具体的な型をとることで可能となる演算を禁止しているとも考えられます。たとえば、

```haskell
f :: [a] -> Maybe a
```

では、a型の値について、何らかの処理をすることはできません。しかし、

```haskell
g :: [Int] -> Maybe Int
```

このような型の関数gでは、たとえば数を2倍することもできるし、総和をとることもできます。

引数が多相関数であることを要求することによって、その関数が構造に対してだけ作用する関数であり、なかみの値については、いじることがないということを保証していると考えることができます。

## 最後に

ざっと、書いてきました。ランク2多相について、こういう見方もできるよ、という話でした。
アーカイバコマンドの代替としての StreamRelay.jar のサポートプログラム

複数のファイルをまとめるようなアーカイバとなると、(ファイルごとにストリームとなるので)複数のストリームに対応する必要がある。
よって、StreamRelay.jar とは相性が悪い。
StreamRelay.jar 内部にまとめてしまってよかったのか知れないけど、サポートプログラムとして独立させることにした。

### ZipStream.class

StreamRelay.jar のあるディレクトリの下の「ZipStream」というディレクトリに存在していると思う

`java.exe ZipStream`
でヘルプが出る

`java.exe ZipStream list "zipfile"`
で zip ファイル内部のエントリー(zipに格納されたファイル)の一覧が表示される

`java.exe ZipStream read "zipfile" "file1" > "file2"`
「zipfile」というzipファイル内部の「file1」というエントリー(ファイル名)の内容を読み出して、(シェルのリダイレクト機能で)「file2」というファイルとして保存する

例えば "file1" が「..\filename」のような通常の zip 展開ツールがエラーとなるような場合でも内容を確認できるよ。
(ZipStream.class はzipファイルに格納されたファイル名ではなくて、ただのエントリ名(文字列)として認識しているため)

`type "file3" | java.exe ZipStream write "zipfile" "file4"`
または
`java.exe ZipStream write "zipfile" "file4" < "file"`

とすると、ファイル「file3」の内容を「zipfile」というzipファイル内の「file4」というエントリで圧縮保存するよ。

### ArchiveStream.jar

ZipStream.classを拡張し、いろんな圧縮アーカイバに対応

`java.exe -jar ArchiveStream.jar`
⇔
`ArchiveStream.bat`

`ArchiveStream.bat`
でヘルプが出る

基本的には、ZipStream.class と使い方は一緒だけど、アルゴリズム名を指定するオプションがあるという点だけが異なる

`java.exe -jar ArchiveStream.jar "arctype" list "ArcFile"
java.exe -jar ArchiveStream.jar "arctype" read "ArcFile" "File" > "File"
type "File" | java.exe -jar ArchiveStream.jar "arctype" write "ArcFile" "File"
java.exe -jar ArchiveStream.jar "arctype" write "ArcFile" "File" < "File"`

「arctype」に指定てきるオプションは
- cpio
- ar
- tar
- zip
- arj
- 7z
- lha

---
### 圧縮コマンドの代替としての StreamRelay.jar

- [圧縮コマンドの代替としての StreamRelay.jar](http://qiita.com/tomoki0sanaki/items/079dd9302af4333257c1)

---
### リンク

- [アーカイバ内部のLog4jのバージョンを調べる](https://qiita.com/tomoki0sanaki/items/e3b435fa19c84d3735a0)

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
コマンドラインからsdkmanagerを使ってAndroidSDKを引っ張る



# SDKどこ？

久しぶりにAndroidアプリ作るのチャレンジしようと思ってAndroidStudioをダウンロードしよう
→やたらデカイしスペックきつそうなのでIntelliJ IDEA + AndroidSDKにしよ→単体でSDKが無いぞ!

で地味にハマったのでメモとして残しておく

#SDKManagerでゲットする
色んな所調べてみると、以前はtoolsからSDKManagerのGUIを立ち上げるのが
可能だった模様だが今(2017/06/05現在)はGUIがない。
なので、コンソールからsdkmanagerを使ってSDKを引っ張りましょう。

#手順
##1.SDKツールをゲット
この辺から環境に合うのをダウンロード
AndroidSDKとか適当なフォルダの中に展開して、展開したパスを環境変数PATHに設定した。
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/98378/8bd9a301-5a65-f81e-a6b4-465fdf4f8a99.jpeg)

##2.パッケージをインストール
コマンドラインからsdkmanagerを使ってパッケージをインストールする。

・SDK全部引っ張りたい場合
`sdkmanager --update`

・任意のパッケージのみ
`sdkmanager "パッケージ名"`

・いやパッケージ名とか知らないんだけど
`sdkmanager --list`
でリスト表示される。

完了したらtoolsと同階層にパッケージがダウンロードされているので
一階層上のパスをIDEからSDKのパスに指定してあげればOK。

#3.参考
https://developer.android.com/studio/command-line/sdkmanager.html?hl=ja
seq scan or index scan - postgres effective_cache_size

### SQL Performance tuning - **effective_cache_size** mystery ?!
 cf. random_page_cost
　cf. <font color=green>SET  join_collapse_limit to 10;</font>

 
- improper **effective_cache_size** setting causes table full scan even if target table has an index... <- Postgres Cost Estimation Error ???

- cf: http://www.cybertec.at/effective_cache_size-better-set-it-right/
```
Sets the planner's assumption about the effective size of the disk cache that is available to a single query. 
This is factored into estimates of the cost of using an index;
 a higher value makes it more likely index scans will be used,
 a lower value makes it more likely sequential scans will be used.
```


### performance trouble happened

- With the exact same SQL, the plan behaves quite differently depending on PostgreSQL host
- all same Postgresql version 9.4.5
- cannot figure out what causes this ...???

### effective_cache_size  :interrobang:

| host       |       effective_cache_size |   scan plan    |
|:-----------------|:-----------------:|:------------------:|
| a             |  <font color=red>1048576</font> x 8Kb |<font color=red>seq scan</red> |
| b           |  <font color=red>1048576</font> x 8Kb | <font color=red>seq scan</red> |
| c             | <font color=blue>4194304</font> x 8Kb |   <font color=blue>index scan</blue>  |

 
###　Let's confirm 

As an experiment, temporarily decrease effective_cache_size value and rerun the same sql...

```sql
SET effective_cache_size TO '1000 MB';
```

```
 ->  Seq Scan on control.users us  (cost=0.00..581.03 rows=21803 width=10) (actual time=0.004..15.029 rows=21803 loops=1)
           Output: us.user_name, us.user_id
           Buffers: shared hit=363
```

Got cha ! index scan -> seq scan　
 

Now, restore to the original effective_cache_size

```sql
SET effective_cache_size TO '4194304';
```

```
->  Index Scan using users_pkey on control.users us  (cost=0.29..0.31 rows=1 width=10) (actual time=0.003..0.004 rows=1 loops=144)
    Output: us.user_id, us.group_id, us.description, us.password, us.person_id, us.department, us.regist_time, us.modified_time, us.password_expire_time, us.available_from, us.available_to, us.trace_queue, us.available, us.user_name, us.agency_id, us.location, us.last_login_time
　   Index Cond: (us.user_id = ht.operator)
    Buffers: shared hit=432
```

  seq scan　-> index scan  :hugging:
機械学習について

機械学習について書きます
====

これから機械学習やその他色々について得た知識を
復習and記事作成の練習and個人の備忘録としてまとめていきたいと思います！

記念すべき第一回として、
まずはメインの内容である「機械学習とは」といったところから始めます！


⚠︎※※注意※※⚠︎  

・出来るだけ専門知識のあまりない人に対して、分かりやすく書くことを目標にしています。
　そのため、厳密に言うと間違っている部分があると思いますがご容赦ください。

・また、ネットで調べたレベルの知識がほとんどなので、
　"厳密に言うと"レベルではなく間違っている箇所があるかもしれません。。
　その場合は非常に申し訳ないです。指摘していただけると幸いです！

機械学習とは？
---

wikipedia曰く、

> 械学習（きかいがくしゅう、英: machine learning）とは、人工知能における研究課題の一つで、
> 人間が自然に行っている学習能力と同様の機能をコンピュータで実現しようとする技術・手法のことである。

らしいです。
つまり、

"人工知能という大きな枠組みの中の一部分で、人間が自然に行なっている学習の機能を、
コンピュータの圧倒的な情報処理能力を利用し、複雑かつ膨大なデータでも可能にしたもの"

と僕は解釈してます！  

基本的に人間で出来ることは人間でやるほうがいい場合も多くあると思います。  

例えば画像認識。
"その写真が人物像であるかどうか"など、人が目で判断するとかなり特殊な場合を除いて、間違えることではありません。
が、機械が判定するとなるとそうはいきません。  

人間だと当たり前にできてしまうことでも、
機械にとってはただの色の集合、もっと言うと数字の集合としか認識できないため、間違えてしまうことも大いにありえることなのです。  

では何故機械でしようとするのか。
その理由は至極単純で、"膨大な量のデータでも疲れることなく自動でやってくれるから"です。  

数百枚~数千枚程度の画像なら、なんとか人間でも全部見て、一つ一つを判別することができます。
かなりしんどいですが。笑

しかし、数万枚やそれ以上の画像となると、人手で行うのは実質不可能だと思います。
そういう時に、一切疲れることなく大量の処理を行ってくれる"機械学習"が非常に役に立つ、というわけです。

その他にも、データを偏見なく純粋に数字として見るため、人間では気づきにくい何かを気づかせてくれたりもします。  

"機械学習"という単語だけで、"何でもできそう"という幻想は抱かず、
良いところ悪いところを十分理解した上で、
人が出来ないことを上手に機械学習を利用して解決していく、ということが求められていきます。  

機械学習の種類
---

機械学習には種類があります。
よく知られているのは、"教師あり学習"と"教師なし学習"ですかね。  

その他にも、"半教師あり学習"や"強化学習"などが存在しますが、
世間で言われている機械学習の多くは、初めの2種類、特に"教師あり学習"だと思って問題ないと思います。  

### 教師あり学習

教師あり学習は、その名の通り教師がいる学習です。  
大体の場合、教師は人間です。

機械に対して人間が、
「これが正解で、これが間違い、・・」
「この場合の値は○○で、こっちの場合は××、・・」
と教えてあげることで、
答えの分からないデータに対しても、何らか答えを推測できるようになります。  

これが"教師あり学習"です。  

雰囲気を掴むために図で説明すると、  

<img width="400" alt="スクリーンショット 2017-06-05 10.23.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/185346/7d80891b-ca24-07bd-0ed9-f78154a14912.png">

このような教師データがあって、
新しく、ラベルが不明（Aに所属するのかBに所属するのか不明）なデータが入って来た時に、
所属するラベルを判定する、というのが教師あり学習です。

<img width="400" alt="スクリーンショット 2017-06-05 10.25.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/185346/82280c5a-2787-13c2-0236-be7a875a2703.png">

今回の場合、新しいデータは、ラベル"A"に所属すると予想されます！  

"教師あり学習"の中でも種類に分けられ、
主に、
求める答えが数値である"回帰"と、
求める答えがラベルである"分類"の二つがあります。
上記の図の話は"分類"になります。

### 教師なし学習

それに対して、教師なし学習とは、
答えがないデータから何かしらの法則を見つける、といった感じのものです。  

前述の、
"データを偏見なく純粋に数字として見るため、人間では気づきにくい何かを気づかせてくれたり"
というのは教師なし学習にあたります。  

これも図で説明すると、

<img width="400" alt="スクリーンショット 2017-06-05 14.25.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/185346/968f6833-9252-7816-bdd1-0826ee7424c9.png">

ラベルのついていないデータを

<img width="400" alt="スクリーンショット 2017-06-05 14.25.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/185346/a9cd2f47-9869-7d71-9363-28df060d74a0.png">

のように、近いものを一つの集合とみなすのが、"教師なし学習"です。（画像使いまわしですみません。。）

教師あり学習と違って、「これがAだ、Bだ」というような答えは与えられておらず、
分けられたデータを見て、人間がラベルをつけます。

機械がデータをただ分けただけなので、後で人間が見た時に、
その集合を表すラベルをつけることが出来ない場合も存在します。

"教師なし学習"は、何らかの基準で"似たもの"を集める技術と言えます。

"教師なし学習"にも"クラスタリング"や"異状検知"などといった種類があります。  

まとめ
---

・機械学習は、人工知能の一分野で、"人間が自然に行っていること"を機械で実現しようとしたもの。

・人間で出来ることは人間でやったほうがいい場合も多い。

・大きく分けて、"教師あり学習"と"教師なし学習"がある。

・"教師あり学習"は、機械に答えを与えることで予測を可能にしたもの。

・"教師なし学習"は、何らかの基準でデータの中の"似たもの"を集めるもの。

あとがき
---

いかがだったでしょうか？？  

あまり詰め込みすぎるのはどうかと思うので、
第一回はこれで終わりたいと思います！

次回からは更に詳しく、手法について一つずつ説明していきたいと思います。
ここまで読んでいただきありがとうございました！
Visual Studio / WPF > binding > Path=CompanyList/WebSiteとしてのバインディング例

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

http://gushwell.ldblog.jp/archives/52305764.html
を元に学習中。

気になったコード部分。

```
<TextBlock HorizontalAlignment="Stretch" Height="27" Margin="10,5"
15
                   TextWrapping="Wrap" VerticalAlignment="Top"
16
                   Text="{Binding Path=CompanyList/WebSite}"  />

```

>この時に、TextプロパティのBinding指定は、以下のように書きます。
>
>　　 Text="{Binding Path=CompanyList/WebSite}"
>
>プロパティ名をスラッシュで区切って記述することで、階層的なデータ構造にアクセスすることが できます。

かずきさんのblogでも同様の表記を見つけた。
http://blog.okazuki.jp/entry/2014/10/29/220236

> この”/”を使ったバインディングは、親子だけでなく孫やその先までコレクションがある限り指定できます。例えば、Peopleコレクションの選択中の項目のChildrenプロパティ（これもコレクション）の選択中の項目のNameプロパティは“People/Children/Name”のように指定できます。

...

> 選択項目をバインドするためにPeople/NameのようにPathを指定してデータバインディングを行います。

```
<!-- 現在選択中の項目をバインドする -->
<Label Content="名前"/>
<TextBox TextWrapping="Wrap" Text="{Binding People/Name}"/>
<Label Content="年齢"/>
<TextBox TextWrapping="Wrap" Text="{Binding People/Age}"/>
```
カウンターパーティでヤギコインを発行してみたよ、メェー。

#はじめに
自分で作成したiPhoneアプリで遊んでもらった報酬として、
ゲームのオリジナルのコインを発行してみようと思い、カウンターパーティの仕組みを試してみることにしました。名前を「ヤギコイン」にしました。
![yagi.jpg](https://qiita-image-store.s3.amazonaws.com/0/43766/f448d539-1476-e930-9b30-bc9aa7d175fa.jpeg)

#カウンターパーティーとは、
ビットコインのブロックチェーンで作られたプラットフォームのことで、
これを利用することで自分のオレオレ通貨などを発行することができるようになります。
カウンターパーティを利用するためにはXCPという通貨を購入する必要があります。
カウンターパーティーを利用する目的は
独自通貨の発行、または独自通貨の売買となります。

#オリジナル通貨の作成にはBITCOINとXCPが必要
カウンターパーティーの仕組みはビットコインの仕組みを間借りすることで
行われているために、BITCOINが必要になります。
また、カウンターパーティーのプラットフォームを利用するためにはXCPという通貨が必要になるため2種類の通貨を用意します。

#手順

##1.BITCOINを用意する
BITCOINを用意するためには、まずは日本円をビットコインにexchangeする必要があります。
日本円とBITCOINのexchangeは、取引所を介する必要があるため、
bitflyerなどの取引所のアカウントを作成し、ビットコインに変換します。
(ビットコインの購入についてはここでは省きます)

##2.XCPを用意する(BITCOIN->XCPに変換する)
XCPを用意するために、BITCOINをXCPにexchangeします。

###取引所にログインする。今回はpoloniexという取引所を使いました。
https://poloniex.com/balances
###手順1で用意したビットコインをpoloniexに送金する
DEPOSITS & WITHDRAWALSメニューを押下する
![1.png](https://qiita-image-store.s3.amazonaws.com/0/43766/c8b93e2c-2193-f2ea-4f8a-63f29bcb5de8.png)

###BTCと検索するとビットコインが出て来るので、Depositを押下する
![2.png](https://qiita-image-store.s3.amazonaws.com/0/43766/4ab75073-02a6-3496-cbb3-d528d023b9fe.png)

###送金アドレスが出て来るのでここに送金する
![3.png](https://qiita-image-store.s3.amazonaws.com/0/43766/e6164a77-aa53-cfce-a47e-1c998e415089.png)

###同様にしてXCPで検索してXCPを押下すると取引画面に遷移します
![4.png](https://qiita-image-store.s3.amazonaws.com/0/43766/96b1fab7-34f1-a011-1535-a1e1d097ab89.png)

###購入したいXCPの量やレートなどを入力します。
ここでは、1XCPが0.00402BTC(この時のレートで¥1,192)のレートで、0.7XCP分注文、トータルで0.00281BTC(この時のレートで¥833)分買うという感じの注文になります。
![6.png](https://qiita-image-store.s3.amazonaws.com/0/43766/f56ebb02-3e78-7f03-75c7-537326351144.png)

###実行後、登録したアドレスに確認メールが来るので、メールにて確認ボタンを押すと取引が進みます。

##3.indiesquareで新規トークン発行の準備
https://wallet.indiesquare.me/

###indiesquareのウォレットにBITCOINとXCPを送金します。
一律で0.2XCPの振込手数料がかかります。(1XCP=0.042BTC=¥1192なので、0.2XCPは¥238くらい)
1XCPを設定すると、-0.2XCPがマイナスされ、実際には0.8XCPが振り込まれます。
![9.png](https://qiita-image-store.s3.amazonaws.com/0/43766/eb4b84fd-4244-f43e-add6-6ebfafa5fe97.png)

###indiesquareのアプリから新規トークン作成を行います。
<img width="414" alt="IMG_0553.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/43766/b5f0ec55-ebc8-2741-acea-6ead168ab56b.png">

###トークン名を指定、また小数点以下の単位のやりとり可否を設定
<img width="414" alt="IMG_0554.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/43766/db86b74e-840f-c8f3-c7f8-06b7824974eb.png">

###完成!
<img width="414" alt="Image uploaded from iOS (3).jpg" src="https://qiita-image-store.s3.amazonaws.com/0/43766/8b824fc7-6d98-633a-00b8-a7114574123d.jpeg">

###URLを発行して寄付ボタンを作成することもできます。

こんな感じ！
<p><div align="center"><p><a class="indiesquare-tip-button" href="//widget.indiesquare.me/tip/6937f5e9c7309748" target="_blank" data-vid="6937f5e9c7309748" data-domain="indiesquare.me">Donate with IndieSquare</a><script src="//widget.indiesquare.me/tip/buttonjs" async="" type="text/javascript"></script></p></div></p>

(参考)

YAGIの情報
https://counterpartychain.io/asset/YAGI

CounterPartyのAPI一覧
https://counterpartychain.io/api

ネタトークンのやりとり掲示板
https://docs.google.com/spreadsheets/d/17NoZCoLykkGK37aHYMkSNPQ7Epcm0XJuXVLnIF5VPCo/edit#gid=0
PepperやNao内にHTMLを配置して外部からアクセスする方法

PepperやNaoには標準でWebサーバ(nginx)が組み込まれており、ビヘイビア内にコンテンツ(HTML等)を配置してブラウザ等でアクセス可能となっている。
(ちなみに、Pepperのタブレットに表示するコンテンツ(HTML等)はこの仕組みを使用)

但し、その他の仮想ディレクトリ(ビヘイビア内以外)に設定されている物理ディレクトリへのアクセスはroot権限が必要なため、事実上使用できないものと考えた方が良いと思われる。
(Pepperだけは何故かアクセス可能なディレクトリが用意されているようなので後述する)

## 外部からのアクセス方法

HTMLを入れたビヘイビアをPepper(NAO)にインストールした後、以下のURLをPC等のブラウザでアクセスする

```
http://<pepepr or nao ip>/apps/<アプリケーションID>/<htmlファイル名>
※ビヘイビア内の"html"はパスに含まれません
```

## (おまけ)PepperとNAOのnginxの設定ファイルの違いについて

PepperとNAOのnginx.confの設定ファイルを確認したところPepperだけが「/ota_files/」という仮想ディレクトリに「/home/nao/.local/share/ota」が設定されており、root権限が無くてもアクセス可能となっていた(※動作確認済み)。
アプリで出力したコンテンツを配置したりする場合等に使えるかもしれません。

```Pepperの/etc/nginx/ngix.conf抜粋
        location / {
            root /opt/aldebaran/var/www/robotsgate;
        }
        location ^~ /advanced {
            alias /opt/aldebaran/var/www/apps/robots_advanced/html;
        }
        location ^~ /licenses {
            alias /opt/aldebaran/var/www/licenses;
        }
        location /libs {
            root /opt/aldebaran/var/www;
        }
        location ~* /libs/qimessaging/.*/qimessaging.js {
            auth_pam              "Secure Zone";
            auth_pam_service_name "nginx";
        }
        location ~* /libs/qimessaging/.*/socket.io/ {
            rewrite /libs/qimessaging/(.*)/socket.io/(.*) /$1/$2 break;
            proxy_pass http://127.0.0.1:8002;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
        }
        location ~ /apps/.*/html/?.* {
            root /opt/aldebaran/var/www;
        }
        location ^~ /apps {
            rewrite ^(/apps/[a-zA-Z0-9_\.-]*)(/.*)$ /$1/html$2 break;
        }
        location /ota_files/ {
          alias /home/nao/.local/share/ota/;
        }
        location /version {
          root /opt/aldebaran/etc;
        }
```

```Naoの/etc/nginx/ngix.conf抜粋
        location / {
            root /var/www/robotsgate;
        }
        location ^~ /advanced {
            alias /var/www/oldrobotwebpage;
        }
        location /libs {
            root /var/www;
        }
        location ^~ /libs/qimessaging/1.0/qimessaging.js {
            auth_pam              "Secure Zone";
            auth_pam_service_name "nginx";
        }
        location ^~ /libs/qimessaging/1.0/socket.io/ {
            rewrite /libs/qimessaging/1.0/socket.io/(.*) /socket.io/$1 break;
            proxy_pass http://127.0.0.1:8002;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
        }
        location ~ /apps/.*/html/?.* {
            root /var/www;
        }
        location ^~ /apps {
            rewrite ^(/apps/[a-zA-Z0-9_\.-]*)(/.*)$ /$1/html$2 break;
        }
        location ^~ /services {
            include /etc/nginx/fastcgi_params;
            fastcgi_pass unix:/var/run/fcgi-nao.sock;
            fastcgi_param SCRIPT_NAME /django-fcgi;
        }
```

以上
テーブル一覧や、モデルから has_many, belongs_to, foreign_key を取得する方法

モデル構成はこんな感じになっているとします。

![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/45822/b9ccb3e4-ca84-dfc9-4714-9165f65d3028.png)

テーブル一覧

```rb:all_tables
ActiveRecord::Base.connection.tables
   (0.6ms)  SET NAMES utf8,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
=> ["ar_internal_metadata", "articles", "companies", "schema_migrations", "users"]
```

あるテーブルのカラム一覧

```rb:columns_of_a_table
User.column_names
=> ["id", "name", "company_id", "created_at", "updated_at"]
```

has_many で持っているテーブル名

```rb:has_many
User.reflect_on_all_associations(:has_many).map(&:name)
=> [:articles]
```

belongs_to で上にあるテーブル名

```rb:belongs_to
User.reflect_on_all_associations(:belongs_to).map(&:name)
=> [:company]
```

foreign_key を調べる（カラム名は知っている前提）

```rb
User.reflections['company'].foreign_key
=> "company_id"

Article.reflections.values.map(&:foreign_key)
=> ["user_id", "category_id"]
```



**おまけ**

クラス名文字列をクラスにする方法

```rb
"users".classify.constantize
=> User(id: integer, name: string, company_id: integer, created_at: datetime, updated_at: datetime)
```

これを用いて最初のテーブル一覧の書き方を工夫してみますと。

```rb
ActiveRecord::Base.connection.tables.select{|s| s.classify.constantize rescue false}
=> ["articles", "companies", "users"]
```

以上です。 :walking_tone1:
lizardでMcCabeの循環的複雑度を測る

## 動機

Javaの循環的複雑度を測るにあたって、Eclipseプラグインを利用してきた方法がIntelliJが主な開発IDEとなった最近では気軽に実施しづらい。
計測のためだけに、Eclipse立ち上げるのもなあと思っていたところに lizardを見つけたのでメモ。

## 循環的複雑度

英語で言うと、Cyclomatic complexity。
簡単に言うとプログラムの複雑度を数値化したもの。
if分岐などが多いと数値が高くなるため、数値が低いほど複雑度が少ないとされる。

詳しくは Wikipediaをどうぞ
https://ja.wikipedia.org/wiki/%E5%BE%AA%E7%92%B0%E7%9A%84%E8%A4%87%E9%9B%91%E5%BA%A6

開発プロジェクトによっては「各クラスの複雑度を○○以下にすること」などと決まっていたりする。


## lizard

https://github.com/terryyin/lizard

対象言語として以下のようなものがある(抜粋)

- Java
- Swift
- Objective-C
- C/C++ (works with C++14)
- C#
- Scala
- JavaScript
- Python
- Ruby
- PHP
- Golang
- Lua

色々対応しているのでうれしい。特にSwiftに対応しているのがGood
(Kotlinへの対応は難しいらしい...  https://github.com/terryyin/lizard/issues/222)

### インストール

pipがインストールされていれば下記でインストール可能。

```
pip install lizard
```

### 実行サンプル

オプションが色々あるが、とりあえず言語を指定する `-l`を利用してlizard自体のコードを解析してみた。

```
$ lizard -l python
================================================
  NLOC    CCN   token  PARAM  length  location  
------------------------------------------------
       3      1     25      3       3 print_xml@10-12@./lizard_ext/__init__.py
       2      1     21      3       2 print_csv@15-16@./lizard_ext/__init__.py
       7      2     82      2      20 auto_open@7-26@./lizard_ext/auto_open.py
--- 中略 --- 
      11      4     62      1      11 get_extensions.expand_extensions@939-949@./lizard.py
      10      1     29      1      22 get_extensions@936-957@./lizard.py
      19      6    124      1      24 main@963-986@./lizard.py
88 file analyzed.
==============================================================
NLOC    Avg.NLOC  AvgCCN  Avg.token  function_cnt    file
--------------------------------------------------------------
     11       2.5     1.0       23.0         2     ./lizard_ext/__init__.py
     16       6.0     2.0       60.5         2     ./lizard_ext/auto_open.py
     41      24.0     6.0      103.0         1     ./lizard_ext/csvoutput.py
--- 中略 --- 
    804       8.0     2.5       49.7        89     ./lizard.py
     13       0.0     0.0        0.0         0     ./profile.py
     42       0.0     0.0        0.0         0     ./setup.py

=============================================================================================
No thresholds exceeded (cyclomatic_complexity > 15 or length > 1000 or parameter_count > 100)
==========================================================================================
Total nloc   Avg.NLOC  AvgCCN  Avg.token   Fun Cnt  Warning cnt   Fun Rt   nloc Rt
------------------------------------------------------------------------------------------
      6967       6.2     1.5       37.0      947            0      0.00    0.00
```

`print_xml@10-12@./lizard_ext/__init__.py`　のように最初はメソッドごとの集計を実施
`./lizard_ext/__init__.py` のような次の集計はファイルごとの集計を実施

どちらも 

- NLOC：コード行数
- CCN：循環的複雑度

は出力されている

## 所感

コマンドラインでの実行は慣れれば楽。
ビルドパイプラインとも結合し易いのでCIと連携して定期的にチェックすることもできそうだ。
[郵便番号API] FileMaker16でJSONデータを取り扱う


ファイルメーカーの最新バージョン16がリリースされ、標準としてJSON関連関数が用意されました。
それにあわせて、以前に紹介したREST APIによる郵便番号検索のサンプルを変更したみました。

カスタム関数が不要になり、かなりシンプルなスクリプトで実装可能になっています。

今回利用させていただいたサイトは前回と同じくこちらです。
[郵便番号-住所検索API](http://zipaddress.net)


GETリクエストで郵便番号を渡すと、JSON形式で住所データを返して来てくれます。

サンプルファイルをダウンロード後、解凍して実行すると以下のような画面が表示されますので、郵便番号を入力して検索ボタンを押すと住所が補完されます。

![FM_JSON.png](https://qiita-image-store.s3.amazonaws.com/0/68589/035c7876-622d-ccae-7339-9b7b1a097381.png)


郵便番号はハイフン有りでも無しでも検索可能です。
作成した処理は検索ボタンを押した時用のスクリプトのみです。
![郵便番号検索スクリプト](https://qiita-image-store.s3.amazonaws.com/0/68589/fc0bbc72-07fd-f00f-271c-f29c37b0d050.png "郵便番号検索スクリプト.png")



サンプルファイルを用紙しましたので、ご興味がありましたら参考にしてみてください。
[サンプルファイル](http://it-komons.jp/filemaker/samples/ZipSearchJSON_2.zip)
※要 FileMaker pro 16以上


【過去の記事はこちら】
[[郵便番号検索] FileMakerでJSONデータを取り扱う](http://qiita.com/hajisan/items/61cc281a1b410c8cb179)
Visual Studio / IDE > Error:作成しようとしているソリューション、プロジェクトまたはアイテムの絶対パスの長さが、システムで許可されている長さの最大値を超えました。名前または場所の長さを短くしてください。

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

Visual Studio / WPFの学習中。

http://gushwell.ldblog.jp/archives/52305764.html
を参考に写経しようとしていた。

プロジェクト名は学習用のものとして、以下の形式にしている。
```
<日時>_<機能が分かる文字列>
```

IsSynchronizedWithCurrentItemプロパティを試そうとして、以下の文字列を入力していた。

170605_t1346_IsSynchronizedWithCurrentI

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/32870/63f6e7fa-0fa9-3309-c5f9-9aca2627bc78.png)

> 作成しようとしているソリューション、プロジェクトまたはアイテムの絶対パスの長さが、システムで許可されている長さの最大値を超えました。名前または場所の長さを短くしてください。

`C:\`から数えて90文字だが、長さの数え方は別のようだ。

https://stackoverflow.com/questions/10581784/error-adding-new-project-to-solution-in-visual-studio-2010-path-length
の質問にあるリンクが参考になるようだ。
WSLでmacのopenコマンドみたいなこと

Windows10標準の仮想Linux環境**Windows Subsystem for Linux**[^1]（以下**WSL**と表記） が着実に進化しています。Unix系のコマンドの豊富な資産がほぼそのまま利用可能な上に（いくつか正常に動作しないものもありますが）、Windows側のファイルシステムの読み書きが可能でWindowsコマンドも呼び出せます。

今回小ネタで、macOSのopenコマンドのようにWSLからファイルを引数として指定してWindows上で開くようなエイリアスを定義してみました。

```shell-session
alias open="cmd.exe /c start"
```

これを .bashrc 等に定義しておけば、

```shell-session
$ open file-path
```

で指定したファイルをWindows上で開いてくれます。WSL上のパスを指定してもちゃんとWindowsのパスに変換されます。ただし、Windowsから見えないWSL固有のファイルシステム上のファイルは当然開けません。

[^1]: もともと Bash on Windowsという名前でしたが、変更されています。それにあわせて記事の表現を若干変更しています。
Vuexが使えない場合に 確認すべき初歩的な箇所

# <i class="fa fa-graduation-cap" aria-hidden="true"></i> 結論

`import`するときのモジュール名は、大文字小文字のCaseを合わせよう。


# <i class="fa fa-cogs"></i> 検証環境

package.jsonをコピペしただけなので無駄なものマシマシ。

```json:無駄なもの入っています！
{
  "dependencies": {
    "electron": "^1.6.8",
    "vue": "^2.3.3",
    "vue-loader": "^12.1.0",
    "vue-material": "^0.7.1",
    "vue-router": "^2.5.3",
    "vuex": "^2.3.1",
    "vuex-router-sync": "^4.1.2",
    "yarn": "^0.24.5"
  },
  "devDependencies": {
    "babel-core": "^6.24.1",
    "babel-loader": "^7.0.0",
    "babel-preset-stage-2": "^6.24.1",
    "css-loader": "^0.28.4",
    "electron-packager": "^8.7.0",
    "style-loader": "^0.18.1",
    "vue-template-compiler": "^2.3.3",
    "webpack": "^2.6.0"
  }
}

```

# <i class="fa fa-cube"></i> 症状

弄りすぎてどのときにどの症状、とは記録していないのですが、

* コンポーネントから`store`が参照できない
 *  `this.$store`
 *  結果、コンポーネント自体が表示できなかったりする
* コンポーネントから`Vuex`？`store`？のプロパティが参照できない
 * `...mapGetters`を使うと`getters`プロパティが無いと言われる
* コンポーネントも`state`も表示されるが、`state`の変更が反映されず、再描画時にしか更新されない(これは特殊かも)


# <i class="fa fa-code"></i> コード

かなり簡略化したもの

```js:main.js

import Vue from 'vue';
import store from './store.js';
new Vue({
  store,
});

```

```js:store.js

import Vue from 'Vue';
import Vuex from 'Vuex';
Vue.use(Vuex);

// 各オブジェクト定義

export default new Vuex.Store({
    state,
    mutations,
    actions,
    getters,
});

```

```html:test.vue

<template>
<div id="app">
  <p>{{ hoge}}</p>
  <p>
    <button @click="huga">huga</button>
  </p>
</div>
</template>
 
<script>

import { mapState, mapGetters, mapActions } from 'vuex'
 
export default {
  computed: {
    ...mapGetters(['hoge']),
  },
  methods: {
    ...mapActions(['huga']),
  }
}
</script>

```

## <i class="fa fa-cube"></i> 原因


```js
import Vue from 'vue';
import Vue from 'Vue';
```

同一パッケージを別々に読み込むときのこの表記ゆれ。
どちらかに合わすこと。

Webpackに起因するものかは不明。
Visual Studio / WPF > ListBox | DataGrid > DisplayMemberPathの使用例

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

ListBoxやDataGridで使うDisplayMemberPathの使い方の整理。

参考: http://gushwell.ldblog.jp/archives/52305448.html
参考: http://iyemon018.hatenablog.com/entry/2015/10/17/203939

> DisplayMemberPath
> 表示するデータの名称
ItemsSource にバインドしたコレクション単体の型のプロパティ名でなければならない。

実装してみた。

```MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
//
using System.Collections.ObjectModel;

namespace _170605_t1315_DisplayMemberPath
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }

    public class MyData
    {
        public string Name { get; set; }
        public Nullable<bool> IsMale { get; set; }
        public string WhatIsCalled { get; set; }
    }
    public class MemberList
    {
        public MemberList()
        {
            MyItems = new ObservableCollection<MyData>
            {
                new MyData{ Name="7of9", IsMale=false, WhatIsCalled="seven"},
                new MyData{ Name="Chakotey", IsMale=true, WhatIsCalled="Number 1"},
                new MyData{ Name="Janeway", IsMale=true, WhatIsCalled="Captain"},
            };
        }
        public ObservableCollection<MyData> MyItems { get; set; }
    }
}
```

```MainWindow.xaml
<Window x:Class="_170605_t1315_DisplayMemberPath.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_170605_t1315_DisplayMemberPath"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <local:MemberList/>
    </Window.DataContext>
    <Grid>
        <ListBox Height="165" Width="300"
            ItemsSource="{Binding Path=MyItems}" DisplayMemberPath="WhatIsCalled"/>
    </Grid>
</Window>
```

![2017-06-05_13h36_00.png](https://qiita-image-store.s3.amazonaws.com/0/32870/7dc30524-bd99-4ccf-c61e-c2334bb583fb.png)
MacでPHPをビルドした

転職してMagento2というプロダクトをつかうことになった。  
それに合わせてPHPをビルドした。

```
# opensslを入れる。./configとかをつかうとsoファイルができなくて死ぬ
cd /path/to/openssl_src/
./Configure --prefix=/usr/local/openssl shared darwin64-x86_64-cc
make;
sudo make install;

# zlibが古い
cd /path/to/zlib_src
./configure --with-zlib=/usr/local/src/zlib-1.2.11
make;sudo make install;

# GDをつかうのにlibjpegがいる
curl http://www.ijg.org/files/jpegsrc.v9.tar.gz > jpegsrc.v9.tar.gz
tar vxzf jpegsrc.v9.tar.gz
cd jpeg-9/
./configure --enable-shared
make;
sudo make install;

# CAPTCHAのためにFreetypeを入れて、GDにライブラリを食わせる
cd /path/to/freetype_src/
./configure
make
sudo make install

# libicuが必要だったので入れる
brew install icu4c
brew link icu4c --force

# GD入れる
curl https://github.com/libgd/libgd/releases/download/gd-2.2.4/libgd-2.2.4.tar.gz > libgd-2.2.4.tar.gz
tar vxzf libgd-2.2.4.tar.gz
cd libgd-2.2.4/

./configure --enable-shared --with-freetype=/usr/local/ 

# GDでのライブラリ使用はこんな感じ。
#   Support for Zlib:                 yes
#   Support for PNG library:          no
#   Support for JPEG library:         yes
#   Support for WebP library:         no
#   Support for TIFF library:         yes
#   Support for Freetype 2.x library: yes
#   Support for Fontconfig library:   yes
#   Support for Xpm library:          no
#   Support for liq library:          no
#   Support for pthreads:             yes

make
sudo make install



# php入れる
cd /path/to/php_src/
# magento2用。with-jpeg-dirはGDにリンクさせててもこっちでも必要。
./configure --prefix=/usr/local/ --with-openssl=/usr/local/openssl --with-gd --with-mcrypt --with-curl --enable-intl=/usr/local/Cellar/gettext/0.19.8.1 --with-xsl --enable-mbstring --enable-zip --with-pdo_mysql --with-jpeg-dir=/usr/local/lib --enable-fpm --enable-bcmath --enable-sockets --with-gettext --with-gd --with-mysqli --with-freetype-dir=/usr/local/ --with-zlib
make
make install

cd /path/to/magento/
php -S localhost:5000
open http://localhost:5000

```
npm v5でnpm iしたらnpm ERR! Cannot read property 'find' of undefined

npm v5がリリースされました。
様々な機能が追加され、より使いやすくなった印象があります。　

- [The npm Blog — v5.0.0](http://blog.npmjs.org/post/161081169345/v500)
- [npm v5 がリリースされた - from scratch](http://yosuke-furukawa.hatenablog.com/entry/2017/05/30/090602)　　

2017年5月25日に最初のv5.0.0が発表されてから一週間、6月2日現在ではv5.0.2がリリースされています。

さて、私も早速npmをv5にアップデートして、いつものようにターミナルに `npm i`と打ち込みプロジェクトの環境構築をしようとしたところ、 `npm ERR! Cannot read property 'find' of undefined`という表題のエラーが出てしまいました。
npmのイシューをググったところ古いバージョンのキャッシュが悪さをしているのが原因という回答を発見。

- [npm5 Error: "Cannot read property 'find' of undefined"](https://github.com/npm/npm/issues/16677)

###npm cache verify

ターミナルに**`npm cache verify`**とコマンドを打ち込むと問題は解決し、その後いつもの通り`npm i`でnode_modulesにパッケージをインストールし、環境構築をすることができました！
<img width="571" alt="スクリーンショット 2017-06-05 13.23.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/119598/2bd742ab-b13c-97d1-6464-64057b18f55c.png">

###参考
- [npm-cache](https://docs.npmjs.com/cli/cache)

## それでもダメなら

上記のキャッシュクリアでもダメな時の最終手段は、 
1. `node_modules`フォルダと、`package-lock.json`を削除
2. ターミナルで`$ npm i`で全体を再インストール
でOKです。