OmniAICreator/Qiita-1.07M huggingface dataset:
Vim で +job とか +channel を使ってるっぽいプラグイン

Github で [`ch_open`](https://github.com/search?l=vim&o=desc&q=ch_open&s=&type=Code&utf8=%E2%9C%93) とか [`job_start`](https://github.com/search?l=vim&q=job_start&ref=searchresults&type=Code&utf8=%E2%9C%93) で検索をかけて引っかかってきたのの簡単なまとめ．そういうわけなのでいろいろ抜けがあると思います（ので編集リクエストとか投げていただければ喜びます）．またあれば `+job` 使うけど必須でないのも入っています．


* [miyakogi/flyjedi.vim: Asynchronous Jedi auto-completion plugin for vim, using job and channel feature](https://github.com/miyakogi/flyjedi.vim)
* [miyakogi/livemark.vim: Real time markdown preview plugin for vim](https://github.com/miyakogi/livemark.vim)
* [miyakogi/vim-quickrun-job: job runner module for vim-quickrun](https://github.com/miyakogi/vim-quickrun-job)
* [mattn/vim-soundcloud](https://github.com/mattn/vim-soundcloud)
* [mattn/vim-terminal](https://github.com/mattn/vim-terminal)
* [aiya000/aref-web.vim: aref-web.vim can open web dictionaries on the vim async.](https://github.com/aiya000/aref-web.vim)
* [bbchung/clighter8: VIM 8 plugin to improve c-family development environment based on Clang](https://github.com/bbchung/clighter8)
* [chemzqm/macdown.vim: Live preview markdown in Chrome using applescript](https://github.com/chemzqm/macdown.vim)
* [eagletmt/neco-ghc: A completion plugin for Haskell, using ghc-mod](https://github.com/eagletmt/neco-ghc)
* [fourjay/vim-keeper: Integrate documentation search into vim](https://github.com/fourjay/vim-keeper)
* [jsfaint/gen_tags.vim: A simple plugin generate ctags and gtags database for vim.](https://github.com/jsfaint/gen_tags.vim)
* [metakirby5/codi.vim: The interactive scratchpad for hackers.](https://github.com/metakirby5/codi.vim)
* [kana/vim-pixivision: P <P](https://github.com/kana/vim-pixivision)
* [mhinz/vim-grepper: Helps you win at grep.](https://github.com/mhinz/vim-grepper)
* [nhooyr/fasd.vim: fasd plugin for vim!](https://github.com/nhooyr/fasd.vim)
* [osyo-manga/vim-agrep: Async grep.](https://github.com/osyo-manga/vim-agrep)
* [prabirshrestha/async.vim: normalize async job control api for vim and neovim](https://github.com/prabirshrestha/async.vim)
* [ramele/agrep: Asynchronous grep plugin for Vim](https://github.com/ramele/agrep)
* [runoshun/tscompletejob: Vim plugin for typescript code complete](https://github.com/runoshun/tscompletejob)
* [ShadowKyogre/vim-wailing: Have vim yell at you when you aren't typing](https://github.com/ShadowKyogre/vim-wailing)
* [Shougo/dein.vim: Dark powered Vim/Neovim plugin manager](https://github.com/Shougo/dein.vim)
* [thinca/vim-quickrun: Run commands quickly.](https://github.com/thinca/vim-quickrun)
* [tyru/jobby.vim: Simple process management plugin in Vim](https://github.com/tyru/jobby.vim)
* [wincent/ferret: Enhanced multi-file search for Vim](https://github.com/wincent/ferret)

検索系とプレビュー系が多いように思います．これからしばらくかけてプラグイン界がちょっとずつ塗り替わっていくのかなあとおもってちょっと楽しみ．

なお，`+job` や `+channel` と外部コマンドの連携については [mattn/slck](https://github.com/mattn/slck#for-vimmer)の readme や[Big Sky :: Vim の channel を使って非同期 twitter タイムライン](http://mattn.kaoriya.net/software/vim/20160129195137.htm)も参考になります．
Circle CIからElastic BeanstalkにPythonアプリケーションをデプロイしてSlackに通知したメモ


# 準備

## Circle CIにリポジトリ登録する

Circle CIにサインアップした時点でリポジトリがいくつか表示されているのでポチポチ選ぶ。
選択するとビルドが走る。

## AWSのアクセスキーを設定する

BUILDSから登録されたリポジトリを選択し、右上のProject Settingsを選択。
PERMISSIONS → AWS Permissionsと進み、Access Key IDとSecret Access Key IDを登録。
これはビルド時内部的に `~/.aws/config` と `~/.aws/credentials` に書き出される。
プロファイル名は `[default]` になるので、すでに別のプロファイル名で.elasticbeanstalkディレクトリ以下の.configファイルを編集されていたら注意。

## Slackを設定する

WebHook URLを取得してCircle CIにぺたり。
Test Hookで確認。

# circle.ymlを追加、編集する

たぶんリポジトリルートディレクトリ直下に置かないといけなかったはず。

## ディレクトリを指定する

リポジトリのルートディレクトリにソースコードがあれば不要。

```
general:
  build_dir: src
```

## machineの指定

現在Elastic Beanstalkで作成できるPython3環境に合わせて以下のように。

```
machine:
  python:
    version: 3.4.3
```

## awsebcliを入れる設定

依存ライブラリもここで入れる。

```
dependencies:
  pre:
    - pip install -r requirements.txt
    - pip install awsebcli
```

## 同時にテストも走らせたい時

以下のように

```
test:
  override:
    - python test.py
```

## デプロイする設定

ブランチ名とElastic Beanstalk上の環境名を。

```
deployment:
  staging:
    branch: develop
    commands:
      - eb deploy eb-environment-name
```

# Elastic Beanstalkの設定ファイルを追加編集

デプロイするディレクトリ（今回はsrc）に `.elasticbeanstalk/config.yml` を追加。
以下のように編集。
前述した通りプロファイル名は `default` で。

```
branch-defaults:
  default:
    environment: eb-environment-name
global:
  application_name: eb-app-name
  default_ec2_keyname: null
  default_platform: 64bit Amazon Linux 2016.03 v2.1.0 running Python 3.4
  default_region: ap-northeast-1
  profile: default
  sc: null
```

### すでにプロファイル名をdefault以外で設定してしまっている場合

`circle.yml` の `pre` で `~/.aws/credentials` を上書きしてしまえばいい。
最初Circle CI側で `~/.aws/credentials` が書き出されることに気づかずに自前で書き出してしまって成功したのでこの手法で大丈夫なはず。

# デプロイしてみる

`circle.yml` と `.elasticbeanstalk/config.yml` をプッシュ。
しばらく待つとデプロイされるはず。
Alamofireで配列のパラメータから括弧の文字列を取り除く方法

Alamofireで配列をパラメータやPOSTのボディに含めると、デフォルトでは以下のようにパラメータの名前の末尾に括弧が付きますが、APIの仕様によっては括弧のないフォーマットで送りたい場合があります。

`foo[]=bar1&foo[]=bar2`

この投稿では以下のように括弧が無いフォーマットで送る方法を紹介します。

`foo=bar1&foo=bar2`

## 解決方法

ParameterEncodingを利用して、リクエストURLに含まれる括弧の文字を置換することで解決できます。

``` swift:GETの場合
let parameterEncoding = ParameterEncoding.Custom { requestConvertible, parameters in
    let (mutableRequest, error) = ParameterEncoding.URL.encode(requestConvertible, parameters: parameters)
    mutableRequest.URL = NSURL(string: mutableRequest.URLString.stringByReplacingOccurrencesOfString("%5B%5D=", withString: "="))
    return (mutableRequest, error)
}

Alamofire.request(.GET, "http://example.com", parameters: ["foo": ["bar1", "bar2"]], encoding: parameterEncoding)
```

``` swift:POSTの場合
let parameterEncoding = ParameterEncoding.Custom { requestConvertible, parameters in
    let (mutableRequest, error) = ParameterEncoding.URL.encode(requestConvertible, parameters: parameters)
    let httpBody = NSString(data: mutableRequest.HTTPBody!, encoding: NSUTF8StringEncoding)!
    mutableRequest.HTTPBody = httpBody.stringByReplacingOccurrencesOfString("%5B%5D=", withString: "=").dataUsingEncoding(NSUTF8StringEncoding)
    return (mutableRequest, error)
}

Alamofire.request(.POST, "http://example.com", parameters: ["foo": ["bar1", "bar2"]], encoding: parameterEncoding)
```

## 括弧が付く場合と付かない場合がある背景

これはRFCで配列のパラメータに対するフォーマットが定められていないからです。Alamofireの[README](https://github.com/Alamofire/Alamofire/blob/dae3ed1b22d33c28de0f50e1271fb4e0d54ad44a/README.md)にも以下のように記載があり、Alamofireは`[]`を付ける方針をとっています。

>Since there is no published specification for how to encode collection types, Alamofire follows the convention of appending [] to the key for array values (foo[]=1&foo[]=2), and appending the key surrounded by square brackets for nested dictionary values (foo[bar]=baz).

## 参考

https://github.com/Alamofire/Alamofire/issues/965
SpineをStarling1.7で使う:個別パーツとのあたり判定

前の投稿に書いたように、Spine-StarlingランタイムのSkeletonAnimationに対するタッチ判定は、全体のバウンディングBOXに対して行われます。これは実際にパーツがない部分でもタッチ判定される事がある事を意味します。
個々のパーツ(=スロット＝アタッチメント)とのあたり判定の仕組みは公式ランタイムでは用意されていないようです。(海外のフォーラムなどをみても困っている人がいる模様。)探せば誰かが作ったものも見つかるかもしれませんが、各種アタッチメントとの汎用的に使える当たり判定のコードを書いてみたので、紹介しておきます。

#動作サンプル
<img width="430" src="https://qiita-image-store.s3.amazonaws.com/0/8302/eabac62f-95fb-49fd-8496-8c3cf44355d1.png">
http://harayoki.github.io/qiita_demo/HitTestDemo1/
BODY、両目、両腕、ネクタイ、リボン？それぞれタッチを判別して謎のキャラが動きます。キャラクターの外をタッチするとキャラクターが移動します。回転したり、位置が変わっても正しくパーツ別にタッチ判定できている事が確認できます。

#使い方
Staticなメソッドを持つUtilクラスとして作成しました。
[SpineHittestUtil.as](https://github.com/harayoki/SpineTest1/blob/hittest1/src/harayoki/spine/starling/SpineHittestUtil.as
)

```sample.as
var isHit:Boolean;

// グローバル座標の場合
var posGrobal:Point = new Point(100, 100);
isHit = SpineHitTestUtil.hitTestWithAttachmentByGlobalPoint(
  skeletonSprite, "slot名", posGrobal);

// ローカル座標の場合
var posSpriteLocal:Point = new Point(10,10);
isHit = SpineHitTestUtil.hitTestWithAttachmentByLocalPoint(
  skeletonSprite, "slot名", posSpriteLocal);
```
非常に簡単です。SkeletonAnimationの外部で使う事を想定していますが、SkeletonSprite(もしくはSkeletonAnimation)を継承したhitTestクラスで後者を呼び出せば、一部にしかタッチ反応しないSkeletonAnimationも作れるでしょう。

当たり判定をするスロット内のアタッチメントの種類によって挙動が変わります。対応しているアタッチメントは以下です。

* Region Attachment
訳すと"領域"ですが、画像パーツの事です。画像の矩形で当たり判定をします。全体の矩形当たり判定と異なり、矩形の回転にも対応しますが、色が透明であるかどうかは判別しません。これが一番お手軽です。

* BoundingBox Attachment
訳すと"境界ボックス"で、一般的には全体を覆い囲む矩形を示すのですが、Spineではややこしいことに、自由な多角形領域の事を指します。通常はこれをメインに使う事になると思います。

* Mesh Attachment
Spineの売り、Mesh画像との当たり判定です。全てのメッシュと真面目に当たり判定する事も出きそうですが、処理が重くなりそうなので、対象メッシュに対するBoundingBox(一般的な意味)で判定しています。

* WeightedMeshAttachment Attachment
追従の重みをつけたMesh Attachmentで、Mesh Attachmentと同様の処理をします。(動作未確認ですが、公式のソースの似たような処理部分を移植したので動くかと。)

くりかえしですが、通常はRegionかBoundingBoxで当たり判定する事を推奨します。

BoundingBox Attachmentについては、公式こちらのページに日本語の解説があります。 http://ja.esotericsoftware.com/spine-bounding-boxes

#デモの詳細

右腕、左腕とネクタイがRegion Attachment、両目と体全体がBoundingBox Attachment(下のキャプチャ画像を参照)、リボン部分がMeshです。

<img width="284" src="https://qiita-image-store.s3.amazonaws.com/0/8302/2868aa77-bb37-8c45-94ed-9b6f28948be0.png">
_目との判定部分_

<img src="https://qiita-image-store.s3.amazonaws.com/0/8302/37051972-4b63-e32c-85ec-0905ff862b7d.png">
_体との判定部分(ラフですが)_

デモの主なソースはここにあります。
https://github.com/harayoki/SpineTest1/blob/hittest1/src/demos/HitTestDemo1.as

#その他

この原稿を書いている時点でのSpine-Starlingランタイムはデータバージョン3.1.0８までをサポートするバージョンです。

RegionとBoundingBoxそれぞれとの当たり判定のアルゴリズムはCrossing Number Algorithmというもので、次のページを参考にしました。
[技術者が紹介するテクノロジー 【第2回】点の多角形に対する内外判定](http://www.nttpc.co.jp/technology/number_algorithm.html)

Crossing Number Algorithmは正確な判定ができるものの、そこそこの計算負荷が発生しますので、あるボーンからの距離判定でざっくり代用できるなら、その方が良いですね。

#おわりに
自分もこれから、SpineHittestUtilを使って、いろいろ作ってみようと思います。
Meshの正確な当たり判定は、個人的に必要になったら追加で実装する予定です。では。
subversionを使わないで(gitで)word2vecをインストール


いまさらながらword2vecをインストールしようとしたら、すんなり行きませんでした。[公式](https://code.google.com/archive/p/word2vec/)含め各種情報記事にはSubversionをインストールし、

```
svn checkout http://word2vec.googlecode.com/svn/trunk/
```

を実行すればソースコードをダウンロードできるとあるのですが、何度実行しても、"URL not found"　になってしまいました。ブラウザで見ても404・・・リモートリポジトリが死んでるっぽいですね。

どうしたものかと思っていたら、普通にgithubのリポジトリがありました。

https://github.com/svn2github/word2vec

```
git clone https://github.com/svn2github/word2vec.git
```

あとの流れは公式のQuick startと同じです。任意のフォルダでcloneしたあとで、

```
cd word2vec
make
./demo-word.sh
```

これで動作確認まで完了できました。

ちなみに、Google Code Archiveからもzipでダウンロード可能です。

https://storage.googleapis.com/google-code-archive-source/v2/code.google.com/word2vec/source-archive.zip
Ansibleのget_urlモジュールでOracle Java:JDKをインストールする @ AWS EC2

## ■ Ansibleとは
+ **Ansibleの特徴**
    - エージェントレスでサーバ構築を自動化してくれるツールです。
    - sshdが動作しているマシンにSSHで接続し環境を構築してくれます。
    - 設定ファイルはYAMLで書きます。プログラムの知識（Ruby、Python、etc.）は不要です。
    - 数台～数十台規模のサーバ構築だったらchefよりも簡単です。

    　  
+ **環境の準備**
前回の記事を参照してください。
[Ansible 最初の一歩](http://qiita.com/olympic2020/items/9c21d53066c9c6e5357f)


## ■ Oracle Java:JDKのインストール
gpw_e24を指定しないと、完全にダウンロードが完了していなくrpmファイルが不完全なため、その先の処理が失敗してしまいます。  

+ **playbook**
    (1) softディレクトリを作成
    (2) JDKをsoftディレクトリにダウンロード
    (3) ローカルのrpmを使ってJDKをインストール
    の流れです。
    Oracleのサイトから直接ダウンロードするには、ちょっとしたコツがありました。

    ```playbook.yml
    - hosts: ec2_client01
      remote_user: ec2-user
      become: true
      tasks:
        - name: make download soft dir
          file: path=/root/soft state=directory owner=root group=root mode=666
        - name: download Oracle JDK 8
          get_url: url=http://download.oracle.com/otn-pub/java/jdk/8u92-b14/jdk-8u92-linux-x64.rpm dest=/root/soft/jdk-8u92-linux-x64.rpm headers="Cookie:' gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie'" validate_certs=no owner=root group=root mode=744
        - name: install JDK 8 from a local file
          yum: name=/root/soft/jdk-8u92-linux-x64.rpm state=present
    ```
    ※ 全マシンにインストールしたい場合は、`hosts: all` です。
    　  

+ **ansible-playbook**
    実行してみます。

    ```Bash
    $ ansible-playbook playbook.yml
    ec2_client01               : ok=4    changed=3    unreachable=0    failed=0
    ```

## ■ 確認
+ **playbook実行前**

    ```Bash
    [ec2-user@ip-172-31-21-132 ~]$ java -version
    java version "1.7.0_101"
    OpenJDK Runtime Environment (amzn-2.6.6.1.67.amzn1-x86_64 u101-b00)
    OpenJDK 64-Bit Server VM (build 24.95-b01, mixed mode)
    ```

+ **playbook実行後**

    ```Bash
    [ec2-user@ip-172-31-21-132 ~]$ java -version
    java version "1.8.0_92"
    Java(TM) SE Runtime Environment (build 1.8.0_92-b14)
    Java HotSpot(TM) 64-Bit Server VM (build 25.92-b14, mixed mode)
    ```

    簡単でした(^^)v
    　  
## Next Step
次は、AnsibleでAmazon Linuxのロケールをニッポンに変更してみます。
　　[AnsibleでAmazon Linuxのロケールをニッポンに変更する](http://qiita.com/olympic2020/items/0b081ae9f042bd4ec7e3)
AtomでShellCheckする

先日、「Shellcheckを使おう」という以下のLTをしてきました。
http://www.slideshare.net/cottondesu/shell-01-shellcheck

その後に、とある人から毎回毎回コマンドを実行するのは辛いから
使っているエディタでリアルタイムか保存時にcheckして欲しいよねと
言われて・・・・・・・・・・・・。

今に至ります。さて、私はAtomを使っているので、AtomでShellcheckが
動作するようにします。

#目的
AtomでshellをリアルタイムでShellcheckされるようにします

#環境
* Mac
* Shellcheck
* Atom
  * linter
  * linter-shellcheck 

#Shellcheckのインストール
まずはShellcheckをインストールしないと始まりません。
公式サイト：[Shellcheck](https://github.com/koalaman/shellcheck "Shellcheck")

今回はMacですのでターミナルから以下のHomebrewコマンドを実行します。

```
brew install shellcheck
```

Homebrewがインストールされていない場合はPortからでもインストールできます。

```
port install shellcheck
```

#linterのインストール
Atomでlinter-shellcheckを動作させるために、母体となるlinterを
Atomにインストールします。
同様のパッケージにatom-lintがあるみたいですが、今回はlinterにします。

1. メニューバーのAtom -> Preferences.. でSettingsを開く
2. SettingのInstallを開く
3. Search packagesに linter を入力し　Packagesボタンを押下する
4. 検索結果から linter を見つけてInstallボタンを押下する

#linter-shellcheckのインストール

1. メニューバーのAtom -> Preferences.. でSettingsを開く
2. SettingのInstallを開く
3. Search packagesに linter-shellcheck を入力し　Packagesボタンを押下する
4. 検索結果から linter-shellcheck を見つけてInstallボタンを押下する

以上、導入が完了しました。後はAtomでshellファイルを開くだけです。

1点解せぬ点があります。
Shellcheckコマンド使った場合、noteも表示されます。

```
shellcheck -f gcc .bashrc
.bashrc:1:1: error: Tips depend on target shell and yours is unknown. Add a shebang. [SC2148]
.bashrc:3:9: note: Double quote to prevent globbing and word splitting. [SC2086]
```

私が設定方法を知らないのかAtomのlinter-shellcheckではnoteが
表示されない。なんとかして表示させて指摘内容を全て直したい。
もしnoteの表示方法を知っている方がいましたら教えて下さい。

#6/27 追記
noteも表示する方法がわかりました。
Defaultの設定だとwarning、errorのみがcheck対象となります。
noteもcheck対象にするには以下の設定を変更します。

1. メニューバーのAtom -> Preferences.. でSettingsを開く
2. SettingのInstallを開く
3. Search packagesに linter-shellcheck を入力し　Packagesボタンを押下する
4. 検索結果から linter-shellcheck を見つけてSettingsボタンを押下する
5. Settingsの Enable Notice Messages チェックボックスにチェックを入れる

上記を行うことによってnoteもチェックされるようになります。

#参考にした記事
[Atom でインストールしている package 一覧](http://qiita.com/iorionda/items/b108e73e51ff40049c60
 "Atom でインストールしている package 一覧")
[ShellCheckをMacに導入してシェルスクリプトの文法チェックをしてみた](http://qiita.com/ume3_/items/28ec24aaa55729e030c5
 "ShellCheckをMacに導入してシェルスクリプトの文法チェックをしてみた")
mapと条件演算子(三項演算子)でシンプルに配列の中身を編集する

一桁の数字の前に0を付けたい。文字列になってしまうけど。

```test.rb
array = [1,2,35,51,2]
array = array.map {|m|
  if m < 10
    m = "0#{m}"
  else
    m
  end
}
p array
#=> ["01", "02", 35, 51, "02"]
```
こうすればできるけど長い。

```test.rb
array = [1,2,35,51,2]
array = array.map{|m| m < 10  ? m = "0#{m}" : m}
p array
#=> ["01", "02", 35, 51, "02"]
```

条件演算子初めて使ったけど、シンプルに書けた。
Realmであったら更新、なければ追加

Realmでデータがあったら更新、なければ追加をしたい時のメソッドが変更になってたためメモ。


前までは

```swift
try! realm.write() {
    realm.addOrUpdateObject(entry)
}
```

けど今は

```swift
try! realm.write() {
    realm.add(item, update: true)
}
```
※true:なければ更新する

と書けば良いようです。

```override class func primaryKey() -> String```でPK指定してる前提っぽいです。
MacのTerminalでafconvertを使ってm4aをwavに変換する

iPhoneのボイスメモをDropboxに送るとmp4だった。wavにしたい。解答は、

* afconvert -f WAVE -d LEI24 hairdryer.m4a hairdryer.wav

fオプションには出力ファイル形式、dオプションには出力データフォーマットを指定する。それを知るにはTerminalで

* afconvert -hf

![Dropbox — -bash — 151×54 2016-06-26 23-26-11.png](https://qiita-image-store.s3.amazonaws.com/0/12309/2a3c5e0e-3ee2-e2b1-b89c-770d70bd5c08.png)

このようにずらっと表示されるので、出力形式に合わせてf, dオプションを書き換えれば他の形式変換もできる。
Swift2でMMDrawerContrllerを使って画面遷移する

Swift2でMMDrawerControllerを使うサンプルは探せばいろいろ出てくるんですが、
サイドメニューから画面遷移を実装するサンプルがなく、探すのに少し手間取ったので、
記事にしておきます。

実際にコードを見たい方はこちら
[サンプルコード] (https://github.com/Synashida/MMDrawerSampleSwift2)

画面の構成
![スクリーンショット 2016-06-26 22.12.07.png](https://qiita-image-store.s3.amazonaws.com/0/57579/ae007d57-059f-fcf3-d860-ce5b8811412a.png)
MainViewControllerから画面１・画面２へのSegueのId
画面1 = toView1
画面2 = toView2 
となっています。

コードの要点は
AppDelegate.swift
LeftDrawerViewController.swiftの２点です。
AppDelegateはMMDrawerの実装が記述されています。

LeftDrawerViewControllerはMainViewのSegueを使うためのコードが記述されています。
以下はLeftDrawerViewControllerのコードの抜粋です。

``` LeftDrawerViewController.swift
@IBAction func toView1(sender: UIButton) {
        toView("toView1")
}

@IBAction func toView2(sender: UIButton) {
        toView("toView2")
}

func toView(segueId: String) {
        let mainView = (self.mm_drawerController.centerViewController as! UINavigationController).childViewControllers[0] as! MainViewController
        mainView.performSegueWithIdentifier(segueId,sender: nil)
        let appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        appDelegate.centerContainer!.toggleDrawerSide(MMDrawerSide.Left,animated: true, completion:nil)
}
```

まず
`let mainView = (self.mm_drawerController.centerViewController as! UINavigationController).childViewControllers[0] as! MainViewController`
ここで、MainViewControllerを取得しています。

次に
`mainView.performSegueWithIdentifier(segueId,sender: nil)`
MainViewのperformSegueWithIdentifierを呼び出して、MainViewのSegueを利用します。
C#で.NET Frameworkを使用するときのstring型とString型の違い

# 概要
文字列を扱うときに、```string```型と```String```型どちらも扱えてしまえてどちらを使用すればいいんでしょう…となって調べました。

* 結論どちらを使用しても一緒です。
* ```int```型は```Int32```でなくて```int```って宣言してるので```string```って宣言した方が統一感ありそうです。

# 本題
## 共通型システム
* .NET Frameworkには共通ランタイム（Common Language Runtime、CLR）という実行環境があります。
* CLRはC#をはじめとする.NET Framework対応の言語で書かれたプログラム[^1]を動かすための環境です。

[^1]: C#の他にはF#、Visual Basic等。


* CLRの機能の1つに共通型システム（CTS）があり、型と演算をサポートしています。

## CTSとC♯
* C#が用意している基本データ型はCTSが提供するデータ型のエイリアスになっています。
* 下表の様な対応関係になっています。

| C#の型 | CTSの型 | 型の種類 |
|:-------|:---------------|:------|
| object | System.Object  | クラス |
| bool   | System.Boolean | 構造体 |
| char   | System.Char    | 構造体 |
| ushort | System.UInt16  | 構造体 |
| int    | System.Int32   | 構造体 |
| long   | System.Int64   | 構造体 |
| double | System.Double  | 構造体 |
| string | System.String  | クラス |

* 同じ意味

```csharp
int num = 123;
System.Int32 num = 123;
```

#　参考
* [『C#プログラミング入門』](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80%E2%80%95%E3%80%8C%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%80%8D%E3%81%AE%E3%80%8C%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E6%89%8B%E6%B3%95%E3%80%8D%E3%82%92%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E8%A7%A3%E8%AA%AC-I%E3%83%BBO-BOOKS-%E5%87%BA%E4%BA%95-%E7%A7%80%E8%A1%8C/dp/4777515982/ref=sr_1_2?ie=UTF8&qid=1466349829&sr=8-2&keywords=C%23%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80)
* MSDN: [.NET](https://msdn.microsoft.com/ja-jp/vstudio/aa496123.aspx)
【Eclipse】Javaソースコードを解析するプラグインを自作し、Eclipseに導入するまでの流れ

Javaソースコードを解析するプラグインを自作し、Eclipseに導入するまでの流れを書き残す。

①PDE(Plug-in Development Environment)をインストールして再起動する。
②プラグインプロジェクトを作成する（テンプレートはHello, World Command）。
③依存プラグインにorg.eclipse.core.runtime、org.eclipse.jdt.coreを追加する。
④SampleHandler.javaを以下のように書き換える。

```java:SampleHandler.java

package aaaproject.handlers;

import java.util.Optional;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.ui.handlers.HandlerUtil;

public class SampleHandler extends AbstractHandler {
    public SampleHandler() {
    }

    public Object execute(ExecutionEvent event) throws ExecutionException {
        ICompilationUnit source = Optional.of(event)
            .map(HandlerUtil::getActiveEditorInput)
            .map(input -> (ICompilationUnit)input.getAdapter(IJavaElement.class))
            .orElse(null);
        
        if (source == null) {
            return null;
        }
        
        ASTParser parser = ASTParser.newParser(AST.JLS8);
        parser.setSource(source);
        CompilationUnit root = (CompilationUnit)parser.createAST(null);
        
        // ここで解析を行う
        
        return null;
    }
}
```

⑤解析の処理を記述する。解析には`ASTVisitor`クラスと`CompilationUnit#accept(ASTVisitor)`を使用する。
⑥解析の処理を記述し終えたら、plugin.xmlを開く。
⑦Overviewの右下にExportingというのがあるので、ここからエクスポートしてJARファイルを作成する。
⑧作成したJARファイルを、Eclipseのpluginsフォルダに格納する。

Eclipseを起動すると、上部メニューにSample Menuというのが追加され、その中のSample Commandを選択すると解析が行われる。Javaソースファイルをエディタで開いていないと何も起きないので注意（`source == null`のチェックに引っかかって途中で処理が終了する）。
Rails:Modelに代入したらcounter cacheが倍になった

# 経緯

既存のFugaモデル全てに新しく作ったHogeモデルを持たせたい。

fuga.rb

```rb
class Fuga < ActiveRecord::Base
  belongs_to :hoge, counter_cache: true
end
```

hoge.rb

```rb
class Hoge < ActiveRecord::Base
  has_many :fugas
end
```

db/migrate/add_fugas_counter_to_hoge.rb

```rb
class AddFugasCounterToHoge < ActiveRecord::Migration
  def change
    add_column :fugas, :hoge_id, :integer
    add_column :hoges, :fugas_count, :integer, default: 0, null: false
  end
end
```

こんなscriptを書いた
bin/add_hoge_to_exist_fugas.rb

```rb
hoge = Hoge.new()
fugas = Fuga.all

fugas.each{|fuga|
  fuga.hoge = hoge
  fuga.save!
}
```
結果、hoge.fugas_countがfugas.sizeの2倍になった。

# 解決法

```rb
hoge = Hoge.new()
fugas = Fuga.all

fugas.each{|fuga|
  fuga.hoge_id = hoge.id
  fuga.save!
}
```

で正常にカウントされた。

また、正常にカウントされていないものは
bin/fix_fugas_counter_of_hoge.rb

```rb
Hoge.find_each{|hoge|
  Hoge.reset_counters(hoge.id, :fugas)
}
```

を実行することで直った。

どうして2倍になったのかはわからずじまいなので知っている方教えて下さい。
黄金比や白銀比を手軽に使うためのSCSSスニペット

レイアウトで黄金比や白銀比を使いたい時がときどきある。ただ、いざ使うとなると

* 近似値いくつだったっけ?
* この短辺に対して長辺何pxになるんだっけ?

とかをぱっと計算できなかったりする低数学力なので、何も考えずに使えるようスニペット化してみた。

Gistはこちら：[黄金比・白銀比・その他の比率を手軽に扱うためのSCSS](https://gist.github.com/hokkey/29209bbc522070782dbe646cc076fee4)

# 変数

* `$ratio-*`でIDEが候補を出してくれる使用イメージ
* `-rev`付きは逆比

```scss
// 黄金比((1+√5)/2)
$ratio-golden: 1.618;
// 黄金比・逆比
$ratio-golden-rev: 1/$ratio-golden;
// 白銀比(√2)
$ratio-silver: 1.41421356237;
// 白銀比・逆比
$ratio-silver-rev: 1/$ratio-silver;
```

# 関数

* 数値に比率を適用して返す
* $roundをtrueにすると、小数点以下を四捨五入。デフォルトはfalse

```scss
@function val-times-ratio($val, $ratio, $round: false) {
    $result: $val * $ratio;
    @if $round == true {
        $result: round($result);
    }
    @return $result;
}
```

## 使い方の例

px値なので四捨五入で整数値に丸めている。

### 分かっている長さを1として、(1+√5)/2の方の長さを求める

![スクリーンショット 2016-06-26 22.52.35.png](https://qiita-image-store.s3.amazonaws.com/0/48238/8d37b5db-c56e-975a-f5a7-5ad7ddaf0d67.png)

```scss
.short {
  width: 38px;
}
.long {
  width: val-times-ratio(38px, $ratio-golden, true);
  // width: 61px;
}
```

### 分かっている長さを(1+√5)/2として、1の方の長さを求める

![スクリーンショット 2016-06-26 22.52.48.png](https://qiita-image-store.s3.amazonaws.com/0/48238/82f5b2d7-cf9d-8d59-a301-55888b2a81f5.png)

```scss
.long {
  width: 38px;
}
.short {
  width: val-times-ratio(38px, $ratio-golden-rev, true);
  // width: 23px;
}
```

# ミックスイン

前項の関数に依存。

* 横幅から高さを決める

```scss
@mixin set-absolute-height-by-ratio($width, $ratio) {
    width: $width;
    height: val-times-ratio($width);
}
```

* 現在の横幅から比率に応じて高さを相対的に決める
* 手法は"[縦横の比率維持で迷うのはもうやめよう！ - Qiita](http://qiita.com/fukamiiiiinmin/items/b8c8c190f2de492064de)"と一緒

```scss
@mixin set-relative-height-by-ratio($ratio) {
    &:before {
        content: '';
        display: block;
        padding-top: 100% * $ratio;
    }
}
```
Google Maps API でロード時にユーザーの現在地（GeoIP風）にしたい

Google Maps API で地図ロード時に表示する場所、迷いませんかね。
そうでもないですかね。

サーバーサイドでやるなら [Maxmind の GeoIP](https://www.maxmind.com/en/geoip2-services-and-databases) 入れたり [freegeoip](https://freegeoip.net/) 使ったり（これは実態はMaxmind）が必要だけど、Google Maps API に限っては良い方法があったのでメモ。

条件としては **[Google Loader](https://developers.google.com/loader/) を使う**こと。
このローダーに **`google.loader.ClientLocation`** という GeoIP ぽい値が入ってたので、それを使う。

```html:まずはロード。headタグ内が良いと思う
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
// ※ 2016/06/25 からはAPIキーが必須に
google.load('maps', '3', {
  other_params: 'key=XXXXXXXXXXXXXXXXXXXXXXXXXX'
});
</script>
````

```js:マップ表示部分
var map = new google.maps.Map(document.getElementById('map'), {
  center: new google.maps.LatLng( // ↓ここで使用
    google.loader.ClientLocation.latitude,
    google.loader.ClientLocation.longitude
  ),
  zoom: 14
});
```
Pythonで標準偏差と相関係数の計算

標準偏差と相関係数をいくつかの方法で計算してみた。

```py3
Python 3.5.2rc1 (default, Jun 13 2016, 09:33:26) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> x = [1, 2, 3, 4, 5]
>>> y = [0, 2, 4, 5, 8]
```
statisticsライブラリを使う。Python-3.4(?)から組み込み。

```py3
>>> import statistics
>>> statistics.pstdev(x), statistics.stdev(x)
(1.4142135623730951, 1.5811388300841898)
```
numpy

```py3
>>> import numpy
>>> numpy.std(x), numpy.std(x, ddof=1)
(1.4142135623730951, 1.5811388300841898)
```
scipyはnumpyと同じ?

```py3
>>> import scipy
>>> scipy.std(x), scipy.std(x, ddof=1)
(1.4142135623730951, 1.5811388300841898)
```
相関係数をnumpyで計算。

```py3
>>> numpy.corrcoef(x, y)[0, 1]
0.99044346677110506
```
次にscipy。

```py3
>>> import scipy.stats
>>> scipy.stats.pearsonr(x, y)
(0.99044346677110517, 0.0011198526620164956)
```

scipyが一番便利かな。
Parslet で SystemVerilog のパーサを作るまでの道のり (2)

[前回](http://qiita.com/trairia/items/0b6234965a24829f3bb1)は2進数リテラルのパーサを書いた。
今回はそれを拡張して整数型をパースするパーサを書いてみる。

## 8進型と16進型
この２種類については 2 進数と digit の種類及び base 識別子が変わるのみで
ほかは変わりが無い。そこで、2進数の定義部分を関数にして一括で定義してみる。

```rb
# 前回見落としていた、不定値とHi-Zのリテラル
rule(:x_digit){ match('[xX]') }
rule(:z_digit){ match('[zZ?]') }
rule(:underscore){ str('_') }
  
rule(:nz_dec_digit){ match('[0-9]') }
rule(:dec_digit) { str('0') | nz_dec_digit }
rule(:nz_uint) { nz_dec_digit >> (underscore | dec_digit).repeat }

# よく使うルールを先に定義
rule(:size?) { nz_uint.maybe.as(:size) }
rule(:signed_base) { match('[sS]') }
rule(:quote) { str('\'') }

# 2, 8, 16 進数のルールを定義する関数
def self.num_rule(define)
  define.each do |d|
    rule("#{d[:name]}_digit") { x_digit | z_digit | match(d[:digit]) }
    rule("#{d[:name]}_val") {
      eval("#{d[:name]}_digit") >> (underscore | eval("#{d[:name]}_digit")).repeat
    }
    rule("#{d[:name]}_base") {
      signed_base.maybe >> match(d[:base])
    }
    rule("#{d[:name]}_number") {
      size? >> quote >>
        self.instance_eval("#{d[:name]}_base").as(:base) >>
        self.instance_eval("#{d[:name]}_val").as(:value)
    }
  end
end
```

途中で定義したルールを呼び出す際に `eval` している。digit 部分を `rule` で定義せずに

```rb
digits = x_digit | z_digit | match(d[:digit])
```

と出来ないかと試してみたが、`x_digit`が`undefined local variable`と怒らたために上記のように
定義した。

## 10進数のルール
Verilog で 10進数の定義は2種類あり、

```verilog
10'd1023; //10bitの整数 1023
1023;     //32bitの整数 1023
4'dx__;   //4bitの不定値
4'dz_;    //4bitのHi-Z
```

なので、bit幅とbase指示子の無い場合も考慮する必要がある。また、数値部分も10進数では
数値と `x`, `z` の文字が混ざる事が無い。とりあえず以下の用に定義。
どうやら `rule` ブロックの中では代入演算が可能なようだ。

```rb
rule(:unsigned_number){ dec_digit >> (underscore | dec_digit).repeat }
rule(:decimal_base) { signed_base.maybe >> match('[dD]') }
rule(:decimal_number) {
  dec_number = unsigned_number.as(:value)
  dec_number = dec_number | size? >> quote >> decimal_base >> unsigned_number.as(:value)
  dec_number = dec_number | size? >> quote >> decimal_base >>
                            x_digit.as(:value) >> underscore.repeat
  dec_number = dec_number | size? >> quote >> decimal_base >> z_digit >> underscore.repeat
  dec_number
}
```

## 整数型のルールをまとめる
これで出来た2,8,10,16進を一つの `:integral_number`としてルールにする。

```
rule(:integral_number){
  hex_number | decimal_number | octal_number | binary_number
}
```

## 今回作った整数パーサ

今回作った Verilog の整数パーサのソースを [gist](https://gist.github.com/trairia/daba80eeb8cbba00705a655641eb3f56)に載せておく。
3.0系のインストール方法。。。

はじめまして。
現在のEC-CUBEの最新版3.0.10(zip）をダウンロードして、手順通りにインストールしたのですが、管理画面も表示されず、トップページしか表示されない状態です。画面上のすべてのリンクもページありませんととエラーになります。htmlフォルダの中にストアらしきフォルダらは全くできていないようです。どこか間違ったりしたのでしょうか。ご存知の方ご教授をお願いいたします。
Unityからxcodeに書き出しアプリを実行したらdouble型の値が不正になってしまったケース

アプリ開発で意外にハマってしまったのでメモ

#開発環境
Unity 5.3.4
Xcode V7.2
実行端末 iphone6(64bit端末)

#概要
Unityからxcodeに書き出しアプリを実行した。
「10.23456」の様な文字列をdouble型に変換したら
「2.00530492517596E-300」の様に非常に小さい値（不正な値）に
なってしまった。

さらにその値をfloat型の変数に変換(cast)したらNaNになってしまった。
その状態でTransform.localPosition
に代入したら、以下の様なエラーが発生した。

```
Infinity or NaN floating point numbers appear when calculating the transform matrix for a Collider.
```

#原因
64bit端末に、32bit設定でビルドしたアプリを起動させたため。

現象発生時の手順
(1)UnityのIOSの書き出し設定
「Script Backend」を「Mono2x」にした。

(2)Xcodeに書き出す
Xcodeに書き出す

(3)xcodeでビルド
xcodeでビルドしてアプリを機動する。
その結果、「10.23456」の様な文字列がdouble型にしたら、
「2.00530492517596E-300」の様に非常に小さい値になってしまった。

#解決手段
64bitの端末でアプリを動かすなら「Script Backend」を「LI2CPP」
32bitの端末でアプリを動かすなら「Script Backend」を「Mono2x」
にする。

端末に関して役立つ情報があったので記載
[iOS デバイス一覧表](http://serennz.sakura.ne.jp/sb/log/eid225.html "iOS デバイス一覧表")
Swift：メソッド　個人メモ

個人メモです。
もし間違いがあれば指摘いただけると助かります。

---

# メソッド

## クラスだけでなく構造体や列挙型にもメソッドを持たせることができる

```swift
/* 動物 */
enum Pet {
    case Cat, Dog, Bird
    
    func japaneaseName() -> String {
        switch self {
        case .Cat:
            return "猫"
        case .Dog:
            return "犬"
        case .Bird:
            return "鳥"
        }
    }
}

/* ファミリー */
class Family {
    var familyNumber: Int
    var pet: Pet
    
    init(familyNumber: Int, pet: Pet) {
        self.familyNumber = familyNumber
        self.pet = pet
    }
    
    func getAllMember() -> String {
        return "家族が\(familyNumber)人と、ペットに\(pet.japaneaseName())がいます。"
    }
}

// 呼び出し
let family = Family(familyNumber: 4, pet: .Bird)
print(family.getAllMember())
```

## いろんなメソッドの制約

- メソッドに引数をもつと、第二引数以降は関数と同じようにラベルが必要になる
- ~~第一引数には不要だが、つける場合は引数名の前に「#」をつける~~
- swift2.xから#は廃止
- また、swift3.0からは第一引数も第二引数以降と同様にラベルをつけて呼び出すようになる
- 第二引数以降のラベルも関数と同じように「_」で省略できる

## 破壊的メソッド

- 構造体、列挙型のメソッドはプロパティを変更することはできない
- mutatingをfuncの前につけて宣言することで属性値を変更できる
- 定数の構造体、列挙型ではmutatingメソッドを呼び出すことはできない
- クラスの場合は変更可能

## 型メソッド

- クラスや構造体のインスタンスではなく型自体に属するメソッド
- プロパティと同じように構造体と列挙型は**static**
- 呼び出すときは**型.メソッド**形式で呼び出す
- staticメソッドからはstaticプロパティに直接アクセスできる

### 列挙型

```swift
/* 鳴き声 */
enum Animal {
    case Cat, Dog, Mouse
    static func cry(animal: Animal) -> String {
        switch animal {
        case .Cat:
            return "meow"
        case .Dog:
            return "Bow-wow"
        case .Mouse:
            return "squeak"
        }
    }
}

print(Animal.cry(Animal.Dog))
```

### クラス

```swift
/* 本クラス */
class Book {
    static var bookName: String = "Swift"
    static func getBookName() -> String {
        return "この本の名前は\(bookName)です"
    }
    
    var price: Int
    init(price: Int) {
        self.price = price
    }
}

print(Book.getBookName())
```
カンマ区切り出力時の末尾カンマ削除


# はじめに
カンマ区切りで出力するプログラムは、プログラミングの入門者に対してロジックを考える訓練の一歩目となる課題だと思います。
参照:[ひと区切りつけましょう](http://blogs.wankuma.com/nagise/archive/2007/10/28/104569.aspx)

```csharp
string[] data = {"A","B","C"};
string csv = "";
for(int i=0; i<data.Length; i++)
    csv += data[i] + ",";
Console.Write(csv);
//A,B,C,
```
これだと余分なカンマが出力されてしまいます。

# 末尾カンマを削除
末尾カンマを削除する方法は幾つかあります。

```csharp
//ループ内でカンマ追記判定
string[] data = {"A","B","C"};
string csv = "";
for(int i=0; i<data.Length; i++){
    if(i!=0) csv += ",";
    csv += data[i];
}
Console.Write(csv);
//A,B,C
```
```csharp
//ループ後にカンマ削除
string[] data = {"A","B","C"};
string csv = "";
for(int i=0; i<data.Length; i++){
    csv += data[i] + ",";
}
csv = csv.Substring(0, csv.Length-1);
//csv = csv.TrimEnd(','); //C#ならTrimEndでもいい
Console.Write(csv);
//A,B,C
```
```csharp
//ループ中にカンマ文字列定義
string[] data = {"A","B","C"};
string csv = "";
string delimiter = "";
for(int i=0; i<data.Length; i++){
    csv += delimiter + data[i];
    delimiter = ",";
}
Console.Write(csv);
//A,B,C
```
```csharp
//先に先頭の値をセット
string[] data = {"A","B","C"};
string csv = data[0];
for(int i=1; i<data.Length; i++){
    csv += "," + data[i];
}
Console.Write(csv);
//A,B,C
```

ライブラリを活用する場合

```csharp
//String.Joinメソッド
string[] data = {"A","B","C"};
string csv = String.Join(",",data);
Console.Write(csv);
//A,B,C
```
# CSVについて
CSV は「comma-separated values」だからカンマ区切りであり、タブ区切りなら 「tab-separated values」で TSV で拡張子は .tsvだろとかって知ったかぶりをすると微妙な空気になるかも知れません。

[Comma-Separated Values – Wikipedia](https://ja.wikipedia.org/wiki/Comma-Separated_Values)
>タブ区切りされた tab-separated values (TSV)や、半角スペース区切りされた space-separated values (SSV) などがあり、これらをまとめて character-separated values (CSV)、delimiter-separated values とも呼ばれることも多い。
chrome拓展修改navigator

http://www.fkgfw.ga/2015/11/02/chrome%E6%89%A9%E5%B1%95%E4%BF%AE%E6%94%B9navigator%E8%BF%87%E5%B9%B3%E5%8F%B0%E6%A3%80%E6%B5%8B/

https://github.com/chrispederick/user-agent-switcher
BLE Nano でLED制御 ～NeoPixel の LED を光らす～

# BLE Nano の開発環境

[BLE Nano](http://redbearlab.com/blenano/) の開発環境は、次の3つがあるそうです。

・Nordic nRF BLE SDK
・mbed Bluetooth Low Energy API
・Arduino Library for nRF51182

導入が手軽ということで、2つ目の mbed の開発環境を利用することにしました。

環境のセットアップ方法は、こちらを参考にしました。

http://redbearlab.com/getting-started-nrf51822

# NeoPixels 制御用プログラムを書き込む

NeoPixels の LED を制御する mbed 向けライブラリがいくつかあります。それを利用します。

「インポート」から「neopixel」でプログラムを検索します。

![mbed_neopixel.PNG](https://qiita-image-store.s3.amazonaws.com/0/129898/62cd07c7-c014-9c99-5990-76cbb181b917.png)

今回は、「[RedBearNano_NeoPixels_Example](https://developer.mbed.org/teams/Bluetooth-Low-Energy/code/BLE_GATT_Example/)」を利用しました。

インポートしたプログラムをコンパイルしてバイナリをダウンロードします。
ダウンロードしたバイナリを、BLE Nano に書き込みます。

(コンパイルなどの手順は、http://redbearlab.com/getting-started-nrf51822 を参考にしています)

# BLE Nano と NeoPixels の接続

![Fig1.png](https://qiita-image-store.s3.amazonaws.com/0/129898/fc9816d9-c48d-5531-9546-f5000dc6c58b.png)

5Vの電源は、手軽な USB を利用します。
秋月電子の[マイクロBメスUSB電源コネクタDIP化キット](http://akizukidenshi.com/catalog/g/gK-06656/)を利用すると、簡単にブレッドボードに給電できます。
スライド・スイッチを介して、上下の電源ラインに供給しておきます。

そして、BLE Nano を配置して、GND と VIN に電源を供給します。
そして、サンプル・コードでは、BLE Nano の P0_8ピンから制御信号が出力されるので、この信号を NeoPixels の LED に接続します。
(BLE Nano のピン配置は http://redbearlab.com/blenano/ で調べることができます。右下のGNDの1つ左になります)

なお、BLE Nano は、3.3V出力ですが、NeoPixels は 5V 駆動なので、レベルコンバータ([TXB0104](https://www.switch-science.com/catalog/1466/))を介して接続しています。
レベル・コンバータ向けに BLE Nano の3.3V出力(VDDピン)を TXB0104 の VccA に接続し、USBからの5V電源を VccB に接続しています。

LED は[マイコン内蔵RGB 8LEDスティック](http://akizukidenshi.com/catalog/g/gM-08435/)を利用しています。
DIN, 5VDC, GND ピンに L型ピンヘッダをハンダ付けし、ブレッドボードに接続しています。

とりあえず、点灯しました。

![P6250016.JPG](https://qiita-image-store.s3.amazonaws.com/0/129898/37635cf8-2f1f-568e-ca55-89442da7c156.jpeg)

# レベルコンバータを省略

思いついて、レベルコンパータをスキップして接続してみました。
ちゃんと点きました。

![P6250024.JPG](https://qiita-image-store.s3.amazonaws.com/0/129898/4c868f8b-52af-6ccc-80d6-a085d864dd98.jpeg)

データシートを見ると、ギリギリアウトっぽいのですが、とりあえず動いているのでOKとしています :sweat: 

http://akizukidenshi.com/download/ds/adafruit/WS2812B.pdf
BLE Nano でLED制御 ～パーツ選定～

# 作りたいもの

音楽に連動して光るモノ。
特定の色を特定のタイミングで。
同時に7個の色を出す。

## なんで?

あるアイドル・グループさんが気になりはじめ、曲を聞いているうちにこのパートを歌ってるのは誰?を知りたくなってきました。
いちいち調べるのはめんどくさいしですし、覚えていられません。ということで、曲の再生に連動して誰が歌っているかを表示をしたいなぁと思うようになりました。

グループのメンバーごとにイメージ・カラーが決まっているので、その色のLEDを光らてみよう :exclamation: 
ということで、電子工作で作ることにしました。

# どう作る?

で、どう作ろうか考えてみました。
結論から言うと、こんな感じです。

・音楽再生 → スマートフォン上の音楽再生アプリ
・パート表示 → 7個のフルカラーLED ([NeoPixels](https://www.adafruit.com/category/168))
・スマートフォンとの通信 → Bluetooth Low Energy
・LEDコントローラ → [BLE Nano](http://redbearlab.com/blenano/)

まず、音楽再生ですが、普段使いにもしたいので、スキップやプレイリスト、シャッフルなど基本的な機能は欲しくなります。ということで、ここはマイコン制御だと荷が重そうなので、スマートフォンのアプリとして実現することにしました。

次に、表示はLED、特に色の調整なども楽そうなのでフルカラーLEDにしました。
表示や色の組み合わせを自由に制御できるようにしたいと思います。
また、Arduinoなどマイコンから制御しやすいNoePixelsのフルカラーLEDを使うことにしました。

そして、スマートフォンとLED制御マイコンとの連携には、低消費電力なのとスマートフォンに何も追加せずに使いたいということで、Bluetooth Low Energy (BLE) を使いたいと思います。

そして、BLE が使えてフルカラーLED を制御しやすいマイコンということで見つけたのが、BLE Nano になります。
mbed の開発環境で sample も多く、使いやすそうですし、小さいので小型化もしやすそう、ということでこれにしました。

ということで、次から少しずつ開発の話を書いていきます。
BLE Nano でLED制御

音楽と同期してLEDを光らせたいということで始めた電子工作。 その経過の記録です。

こんなものです↓

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">音楽 x LED のサンプル。白鳥の湖から。楽器のパートを表示してみました。<a href="https://t.co/fs9ljPtGzS">pic.twitter.com/fs9ljPtGzS</a></p>&mdash; maki02 (@maki02dev) <a href="https://twitter.com/maki02dev/status/762898711689043968">2016年8月9日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

1. [パーツを選定する](http://qiita.com/maki02/items/f26b70f5f75e12a04bee)
2. [BLE Nano で NeoPixel の LED を光らす](http://qiita.com/maki02/items/b965331129a959588ce7)
3. [BLE Nano と Android 端末で通信する](http://qiita.com/maki02/items/a3254a9a24bd6911df78)
4. [BLE Nano + NeoPixel + Android](http://qiita.com/maki02/items/86e4b9348755a6d5bb41)
5. [Android で GATT 通信アプリを作ってみる](http://qiita.com/maki02/items/27d5a6f50016097875ae)
6. [Android で音楽再生のアプリを作ってみる](http://qiita.com/maki02/items/a4ef82b682e7190357c4) 
7. [Android の音楽再生とLED表示を連携させてみる](http://qiita.com/maki02/items/2bf93e043842ef54a056)
8. [ユニバーサル基板で小型化してみる](http://qiita.com/maki02/items/8fe8466b697783876932)
9. [コの字アクリルパイプでケースを作ってみる](http://qiita.com/maki02/items/2f056cc28f740b7f8ff5)(← ここまで、以下記事作成中)
10. 無印良品の石鹸ケースをケースにしてみる
11. PAPER BOX をケースにしてみる

上のデモは、9.のコの字アクリルパイプでケースを作ってみる、の16LED版です。

こちらは、PAPER  BOX をケースにしたもので、7LED版になります。

![P6140022.JPG](https://qiita-image-store.s3.amazonaws.com/0/129898/e582bfb8-49f8-27be-155b-960982eb0e4f.jpeg)

![P6140020.JPG](https://qiita-image-store.s3.amazonaws.com/0/129898/fbb81120-fdf9-b584-0bcc-9b3f42b645e8.jpeg)

![P6140025.JPG](https://qiita-image-store.s3.amazonaws.com/0/129898/0aac942a-5e1b-5df7-0e6d-e5976f2720a2.jpeg)
[3D Animation] DirectX8の時代にゼロから創ったMeshのロードから3Dアニメーションエンジンのエンジン開発した際のノウハウやTips まとめ Part1


これからVRの時代に突入し、3Dアニメーションもより楽に導入できる時代になったのかなと感じています。
ただ、ロジックについては過去の遺物で触らない領域としてあまり目にする機会が減ったのではないかと感じ、
私はここに学生時代に創ったコードをまぜつつ3Dアニメーションの技術解説として残すものとします。

まずは、第一弾として概要から説明します。

以下の構成で載せます。
  ・Direct 8.0時代の3Dエンジン環境
　・作成した3Dアニメーション エンジンの構成
　・X Fileの構成

# Direct 8.0時代の3Dエンジン環境
 私が、学生時代に開発していたころのDirect Xの話をします。
 学生時代にリリースされたのは、Direct X 7.0 ～ Direct X 9.0です。

 DirectX 7.0ではDirectDraw (2D)とDirect3Dが分離しており、Direct3Dとしては、Hardware T&Lのサポートが大きな変更でした。
 DirectX 8.0では、DirectDraw (2D)がDirect 3Dに吸収されDirect Graphicsになった。
 DirectX 9.0で3D AnimationもサポートしたAPIが公開された。

 学生時代のゼミナールでは、Direct X 8.0を使って3Dアクションゲームを一人で開発しました。
 その際に、アニメーションをさせるというテーマを貰っていたので、研究テーマとして取り入れました。

 今回は、この時に作成した3Dアニメーションのノウハウを共有しようと思います。
 前提知識としては、3次元行列と線形補間などがあれば十分だと思います。

# 作成した3Dアニメーション エンジンの構成
 では、私が学生時代に作成した3Dアニメーション エンジンの構成について説明します。
 
 XFile … Meshファイル(X File)のロード及びフレームの管理
 Frame … アニメーションフレームクラス (1キャラクター)
 Mesh … メッシュ情報クラス (マテリアル・頂点・法泉)
 Animation … アニメーション情報クラス

 構成イメージは、以下の通りです。
![アニメーションエンジンの構図.png](https://qiita-image-store.s3.amazonaws.com/0/107688/a684bd52-61d9-8db9-8b21-193adbd512f3.png)

X FileをCMeshManagerクラスを介してロードしてCFrameManagerを作成する。
CFrameManagerでは、X File内部のメッシュ情報やFrame情報,アニメーションフレームなどに
分割し、それぞれのクラスに格納する。
また、Frameクラスでは、Frameに関連しているメッシュとアニメーションフレームを関連付ける
ため、関連するデータのアドレスをリストで参照する形とすることで、重複するオブジェクトも
実体はひとつのみと出来るように工夫した。


# X Fileの構成
 エンジンの構成の説明を終えたので、X Fileのフォーマットについて説明を始めます。
 メッシュファイルを自作したいとか考えている方には最適です。
 大雑把な構成としては、以下の画像の通りです。

 ![X File構成.png](https://qiita-image-store.s3.amazonaws.com/0/107688/f385505c-4dc4-98bb-260c-1dee146a931e.png)

 - template
 　Frame, Mesh, AnimationSetなどのフォーマットの定義が書かれているヘッダー部分なので、
   X Fileのロードの際に気にする箇所です。

 - Frame
   Mesh情報をレイヤー別に格納する領域です。
   - Layer (レイヤー[関節]の数だけ存在する)
     Layerには、Layer内の頂点座標、頂点インデックス、マテリアル情報などが格納されます。

 - AnimationSet
   アニメーションの定義が入っている領域になります。
   [Animation Name]に、Lightwaveで作ったAnimation名が入っています。
   **※私のエンジンは、ここの名前を使って再生するAnimationを指定出来る形にしています。**

   構成は、時間と、関節の位置及び向きが書かれています。
   ``480;3;-2.288272,2.829617,0.000000;;,``
   時間:行列の数;X,Y,Z;(不明);(不明),
　 [公式](https://msdn.microsoft.com/en-us/library/windows/desktop/bb172260(v=vs.85).aspx)見ても特に記載が無かったため、不明としました。


入り口となる『概要』としては、以上です。
次回は、もう少し踏み入った話を書いていきます。
プログラミング言語 Ruby と LibreSSL

プログラミング言語 Ruby では OpenSSL の API が呼び出せるようになっています。通常配布されているバイナリパッケージの Ruby は OpenSSL とリンクされていますが、LibreSSL とリンクすることもできます。

---

# はじめに
今回の評価環境と Ruby および OpenSSL のバージョンを確認しておきます。

## 環境
Ubuntu 16.04 (x86_64) で動作確認をしました。
デフォルトでインストールされている Ruby のバージョンは 2.3.0p0 でした。
また OpenSSL 1.0.2g とリンクされていることを確認しました。

```shell-session
$ which ruby
/usr/bin/ruby
$ ruby -v
ruby 2.3.0p0 (2015-12-25) [x86_64-linux-gnu]
$ irb
irb(main):001:0> require 'openssl'
=> true
irb(main):002:0> OpenSSL::OPENSSL_VERSION
=> "OpenSSL 1.0.2g  1 Mar 2016"
irb(main):003:0> exit
$
```

# Ruby を LibreSSL でビルドする
Ruby を LibreSSL とリンクして動作確認してみます。

## LibreSSL のインストール
最新の安定版 2.3.6 を /usr/local/libressl-2.3.6/ 以下にインストールします。

```shell-session
$ wget http://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.3.6.tar.gz
$ tar xf libressl-2.3.6.tar.gz
$ cd libressl-2.3.6/
$ ./configure --prefix=/usr/local/libressl-2.3.6
$ make check
$ sudo make install
```

## Ruby のビルドとインストール
GitHub から最新のレポジトリをクローンして、LibreSSL を指定してビルドを行います。

```shell-session
$ git clone https://github.com/ruby/ruby.git
$ cd ruby/
$ autoconf
$ ./configure --with-openssl-dir=/usr/local/libressl-2.3.6
$ make
$ make install
```

新しくビルドしてインストールしたRuby のバージョンとリンクされた LibreSSL のバージョンを確認してみます。

```shell-session
$ which ruby
/usr/local/bin/ruby
$ which irb
/usr/local/bin/irb
$ which ruby
/usr/local/bin/ruby
$ ruby -v
ruby 2.4.0dev (2016-06-26 trunk 55508) [x86_64-linux]
$ irb
irb(main):001:0> require 'openssl'
=> true
irb(main):002:0> OpenSSL::OPENSSL_VERSION
=> "LibreSSL 2.3.6"
irb(main):003:0> exit
$
```

Ruby 2.4.0dev が LibreSSL 2.3.6 とリンクされて /usr/local 配下にインストールされていることが確認できました。

## Ruby の openssl テストの実行
Ruby は OpenSSL/LibreSSL 用のテストを用意しています。このテストを実行して LibreSSL の Ruby への適合性を確認してみます。
以下のコマンドを Ruby をビルドしたディレクトリで実行すると、OpenSSL/LibreSSL 用のテストのみを実行してくれます。

```shell-session
$ make test-all TESTS=openssl TESTOPTS="--show-skip"
...
# Running tests:

  1) Skipped:
OpenSSL::TestOCSP#test_basic_response_der [/home/inoguchi/ruby/ruby/test/openssl/test_ocsp.rb:145]:
OCSP_basic_sign() is broken

  2) Skipped:
OpenSSL::TestOCSP#test_single_response_check_validity [/home/inoguchi/ruby/ruby/test/openssl/test_ocsp.rb:216]:
OCSP_check_validity() is broken

Finished tests in 18.924345s, 20.7669 tests/s, 377.3446 assertions/s.
393 tests, 7141 assertions, 0 failures, 0 errors, 2 skips

ruby -v: ruby 2.4.0dev (2016-06-26 trunk 55508) [x86_64-linux]
```

全部で 393 のテストがあり、失敗やエラーは 0 であることを確認できましたが、2つのテストがスキップされています。
このOCSPに関する2つのテストは現時点の LibreSSL のバグによりエラーとなることが分かっています。
http://permalink.gmane.org/gmane.comp.lang.ruby.cvs/58647

OpenBSD プロジェクトではこの LibreSSL の OCSP バグを fix しており、[GitHub のソースコード](https://github.com/libressl-portable)も修正がなされています。次にリリースされるバージョンでは解決されるでしょう。

# libtls for Ruby について
libtls は、LibreSSL に含まれる TLS通信プログラミングのためのより簡易な API ですが、この libtls の RubyGems がありました。

https://rubygems.org/gems/libtls/versions/0.0.1
https://github.com/mike-burns/libtls.rb

ただし、最終更新が 0.0.1 - July 5, 2015 と古いので動作確認は必要でしょう。

# まとめ
プログラミング言語 Ruby は LibreSSL とリンクして使えることを確認しました。
OpenSSL の良き代替として LibreSSL とリンクする動きは今後もフォローしていきます。
purgeコマンドでMacのメモリを確保する

Macのメモリが足りなくなって困っていたので、対処としてpurgeコマンドを使ってみました。

## 環境

```console
$ sw_vers 
ProductName:	Mac OS X
ProductVersion:	10.11.4
BuildVersion:	15E65
```

## purgeコマンド


```console
$ man purge | cat

purge(8)                  BSD System Manager's Manual                 purge(8)

NAME
     purge -- force disk cache to be purged (flushed and emptied)

SYNOPSIS
     purge

DESCRIPTION
     Purge can be used to approximate initial boot conditions with a cold disk
     buffer cache for performance analysis. It does not affect anonymous mem-
     ory that has been allocated through malloc, vm_allocate, etc.

SEE ALSO
     sync(8), malloc(3)

                              September 20, 2005
```

>force disk cache to be purged

ディスクキャッシュを一掃してくれるそうです。

実際にターミナルを開いて `sudo purge` すると、使用済みメモリが1GBほど減ったのを確認できました。

```console
$ vm_stat | grep free
Pages free:                               73862.
$ sudo purge
$ vm_stat | grep free
Pages free:                              323166.
```


### purgeコマンドをアプリケーションにする

スクリプトエディタで下記を貼り付け、JXA(JavaScript for Automation)でアプリケーション化できます。

```js
var app = Application.currentApplication();
app.includeStandardAdditions = true;
app.doShellScript("purge", {administratorPrivileges:true, withPrompt:"$ sudo purge"});
app.displayDialog("purged");
```

## 参考

- [もうメモリ解放アプリはいらない！ターミナルからメモリ解放する方法 | あなたのスイッチを押すブログ](http://bamka.info/sudo-purge)
マルチバイト文字列を考慮した wc を Perl で書く

`wc` コマンドは通常1バイト1文字として文字数を数えます。

最近の `wc` だと `wc -m` でマルチバイト文字を考慮することができるようですが、もっと自由にわかりやすく自分なりにカスタマイズできたらいいなとも思います。

Qiita で検索すると人口が多いプログラミング言語の書き方が出てきますが、ここでは Perl で書いてみたいと思います。

# Perl で書くマルチバイト版 `wc` の `mbwc`

説明するよりまず実例を書いてみます。わかりやすく必要最小限で。

```pl:mbwc
#!/usr/bin/perl

use strict;
use warnings;

use Encode;

my $buffer = do { local $/; <>; };

my $strings = decode("utf-8", $buffer);

my $lines = $strings =~ s/\n/\n/g || 1;
my $chars = length($strings);
my $bytes = length($buffer);

print "lines: $lines\n";
print "chars: $chars\n";
print "bytes: $bytes\n";
```

`readline` である `<>` が標準入力であるか第1引数にファイルパス指定をしているのかを吸収してくれるので楽です。

`Encode` モジュールを使って、`decode` 関数で UTF-8 バイト列を UTF-8 文字列にしてから文字数を数える `length` で数えています。バイト列を `length` に与えればバイト数を数えます。

Perl で文字の数を数える方法はいくつもありますが、グローバル置換 `s///g` が左辺に置換回数を返すことを利用して、改行文字を同じ改行文字に置換する回数を数えることで行数を数えています。改行の数を数える実装は `wc` でも同様のようです。

# さらに機能追加をする指針

* `wc` にあった単語を数える方法
  * 日本語に限定しても、英語のように空白で句切られたものを数えるようにはいきません。MeCab などの形態素解析エンジンを使って単語数を数えるとよさそうです
  * 日本語以外の任意の自然言語を対象とするのは相当骨が折れることでしょう（そういうライブラリはあるのかな）
* UTF-8 以外の文字コード
  * `decode` 関数には多くの文字コードを与えることができるので、これをコマンドライン引数で取得して…というのが良さそうです（コマンドライン引数は `Getopt::Long` モジュールなどで簡単に扱えます）
  * 文字コードの自動判定は難しい題材なので、Perl であれば `perldoc Encode::Guess` などしてみるとよいでしょう。
* コマンドライン引数に複数のファイルを指定する
  * 上記の適当丸呑みバージョンでは複数のファイルをコマンドライン引数に指定する方法にはうまく対応できていません。この場合は自前で `for` などで回してわかりやすく表示することになるでしょう
mruby-inlineドキュメント

mrubyでメソッドをインライン化を実現するためのmrbgemです。
ソースはここにあります。
https://github.com/miura1729/mruby-inline
効果は、速くなったり、遅くなったり、場合によります。でも、将来的にはメソッドのインライン化は避けて通れない最適化だと思っています。
はっきり言ってmruby-inlineは単独では無意味ですが、色々知見を得るのに有意義だと考えています。

#使い方
インライン化したいメソッドがあるクラスにInlineモジュールをincludeします。
クラス定義のメソッド定義後に、インライン化したいメソッドに対して、

```rb
make_inline_method :メソッド名
```
とします。これで、そのメソッドを呼び出すときにインライン化します。
たとえば、こんな感じのコードになります。

```rb
class Vec
  include Inline

  def initialize(x, y, z)
    @x = x
    @y = y
    @z = z
  end

  def vlength
    Math.sqrt(@x * @x + @y * @y + @z * @z)
  end
  make_inline_method  :vlength
end
```

#仕組み

このmrbgemの仕組みを簡単に説明します。
make_inline_methodで指定されたメソッドは、

+ メソッドの実体(Procオブジェクト)がメソッド名をキーにしたハッシュ(__inline_method_list__)に格納されます
+ メソッドそのものはundefされ未定義になります

そのメソッドが呼ばれた場合、未定義になっていますので、当然method_missingが呼ばれます。method_missingメソッドでは、

+ __inline_method_list__からメソッド実体のProcオブジェクトを取り出し
+ そのProcオブジェクトからirep(callee_irep)を取り出します。
+ 呼び出し元のirep(caller_irep)をcallinfoから取り出します。
+ caller_irepのiseqをcallee_irepが足せるくらい大きく拡張した後で、callee_irepを後にくっつけます。この際、レジスタの番号とかをインライン化に合わせて変えます。この辺のパッチの当て方は章を代えて説明します。
+ 最後にこのメソッドを呼び出したsend命令をiseqの後ろにくっつけた命令列にjumpするようにパッチを当てます。

## 命令のパッチ当て

当然のことながらそのままインライン化したい命令列をくっつけただけではうまくいきません。メソッドはR0にselfが入り、続いて引数・ブロック・ローカル変数・作業レジスタと続いています。
しかし、メソッド呼び出しのお膳立てをする前は当然そうなっていません。ただ、規則性があり、R0がOP_SENDのAオペコードで示されるレジスタ番号(vm.cではaまたはaccで参照されます)になっています。そこで、regsの値をいじる代わりにR0をRaにR1をRa+1に書き換えるわけです。
書き換えるのは簡単ですが、命令によってオペランドのどこがレジスタか不規則です。そのため、命令のオペランドの型を示すデータベースを配列で持つことにしました。その配列が、opinfo.h( https://github.com/miura1729/mruby-inline/blob/master/src/opinfo.h )で定義されています。

大まかにはこれでいいのですが、これでは駄目な場合があります。命令毎に細かくパッチを当てていきます。たとえば、こんな命令です。

+ OP_RETURN
 OP_SENDで呼び出したわけではないので、OP_RETURNを呼び出すとおかしくなります。これはJMP命令に書き換えます。

+ OP_ENTER
 この命令はOP_SENDでおぜん立てされた新鮮なフレームじゃないと動かない命令です。大部分はNOPに変えても大丈夫です。大丈夫じゃない時はインライン化はあきらめてください。

+
JavaのコアAPI 

　忘れないようにまとめておく。
　
#Java8 API
##モジュール
###rt.jar
 Java8 APIのランタイムコア（モジュール）。
 `JAVA_HOME/jre/lib`に置いてある。
 ソースファイルは`JAVA_HOME/src.zip`。
###jfxrt.jar
 JavaFXのランタイムコア
 `JAVA_HOME/jre/lib/ext`に置いてある。
 ソースファイルは`JAVA_HOME/javafx-src.zip`
 
##ファイル階層

<ul>
	<li>jdk1.8.xxx
		<ul>
			<li>bin</li>
				<ul>
					<li>java</li>
					<li>javac</li>
					<li>javap</li>
					<li>javah</li>
					<li>javadoc</li>
				</ul>
			<li>lib</li>
				<ul>
					<li>tools.jar</li>
					<li>dt.jar</li>
				</ul>
			<li>jre</li>
				<ul>
					<li>bin</li>
						<ul>java</ul>
					<li>lib</lin>
						<ul>
							<li>applet</li>
							<li>ext</li>
								<ul>
									<li>jfxrt.jar</li>
									<li>localdata.jar</li>
								</ul>
							<li>fonts</li>
							<li>security</li>
							<li>sqarc</li>
								<ul>
									<li>server</li>
									<li>client</li>
								</ul>
							<li>rt.jar</li>
							<li>charsets.jar</li>
						</ul>
				</ul>
		</ul>

</ul>
	
###jdk1.8.xxx
 JDKソフトウェアがインストールされているルートディレクトリ。ライセンスやAPIソースコードなど。
###jdk1.8.xxx/bin
JDKに含まれるすべての開発ツールの実行ファイルディレクトリ。
###jdk1.8.xxx/lib
開発ツールによって使用されるファイル用のディレクトリ。JDKツールとユーティリティーをサポートするクラスが置かれている
###jdk1.8.xxx/jre
JDK開発ツールで使用される`Java Runntime Environment`のルートディレクトリ。JREの本体。