OmniAICreator/Qiita-1.07M huggingface dataset:
elixirのumbrella projectでmix taskがなぜ再帰的に実行されるのか？

umbrellaのroot directoryでtestを実行して、application directoryの中にあるテストが実行される理由がわかってなかったので調べた。

### 結論

+ apps以下のアプリケーションに対してもmix taskが実行されるかはtask次第
+ task moduleのattributeに@recursive trueがついていたら実行される

###　メモ

+ http://elixir-lang.org/getting-started/mix-otp/dependencies-and-umbrella-apps.html#umbrella-projects
  + 上記を見る限り、mix.exsのproject設定の中にapps_pathがあったらumbrella projectだと認識するらしい
  + ってことはmixが処理する際になんかしてるはず
  + https://github.com/elixir-lang/elixir/blob/939210f98a8fb18d3fcf3fa72213b405ffe0ebc2/lib/mix/lib/mix/project.ex#L227-L229
+ https://github.com/elixir-lang/elixir/blob/939210f98a8fb18d3fcf3fa72213b405ffe0ebc2/lib/mix/lib/mix/task.ex#L28
  + task moduleの@recursive attributeがtrueだった場合、umbrella projectではapps_pathの下のapplicationにも再帰的にtaskを実行しそう
  + https://github.com/elixir-lang/elixir/blob/939210f98a8fb18d3fcf3fa72213b405ffe0ebc2/lib/mix/lib/mix/task.ex#L289
+ mix testも@recursive trueがついてる
  + https://github.com/elixir-lang/elixir/blob/939210f98a8fb18d3fcf3fa72213b405ffe0ebc2/lib/mix/lib/mix/tasks/test.ex#L33
+ 関係ないけど https://github.com/wojtekmach/acme_bank がumbrellaの利用例として理解がはかどった。
「自分の小さな「箱」から脱出する方法」3行まとめ

# 読んだ本
[自分の小さな「箱」から脱出する方法](https://www.amazon.co.jp/%E8%87%AA%E5%88%86%E3%81%AE%E5%B0%8F%E3%81%95%E3%81%AA%E3%80%8C%E7%AE%B1%E3%80%8D%E3%81%8B%E3%82%89%E8%84%B1%E5%87%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95-%E3%82%A2%E3%83%BC%E3%83%93%E3%83%B3%E3%82%B8%E3%83%A3%E3%83%BC-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%86%E3%82%A3%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88/dp/4479791779)

## ３行まとめ
- 箱とは自己正当化の比喩
- 自己正当化が本来の目的を見失い様々な問題を起こす
- 自己正当化しないためには抵抗しない
Sassのファイル構成

Sassではパーシャルを使うことでscssファイルを分割して管理できる。役割ごとにファイルを作成したり、同じ役割のファイルをフォルダにまとめることでより管理がしやすくなる。

##Saasを使用するフォルダ構成例##
![1.png](https://qiita-image-store.s3.amazonaws.com/0/169530/cb3683f8-d911-f3bb-e0c8-7deaabe2fa22.png "1.png")

###index.html###

HTMLを記述するファイル。
このファイルに書かれたものが実際にブラウザに表示される。

###style.css###

style.cssは、htmlファイルでこのファイルを読み込むことでスタイルを適用させる。
style.cssファイルを直接編集するのではなく、sassコマンドを実行することでstyle.cssファイルを作成・更新する。

###stylesheetsフォルダ###

stylesheetsフォルダは、すべてのscssファイルを管理するフォルダ。
scssファイルを追加する場合は、styelsheetsフォルダ内に作成。

###style.scss###

このファイルですべてのscssファイルを@importで読み込むことで、一つのsassファイルに統合できる。

###_reset.scss###

ブラウザによって初めからcssがそれぞれのhtmlに設定される。
そのCSSによって、意図しないデザインになってしまうことがある。
そのようなことを防ぐために、初めにブラウザごとのCSSをすべてリセットする。
このようにブラウザごとのCSSを打ち消すCSSのことをリセットCSSとう。

有名なリセットファイルは以下のようなものがある。

- [YUI 3](https://gist.github.com/sa-inu/d571c372887773eec8e3efff757de276)
- [Eric Meyer’s](http://meyerweb.com/eric/tools/css/reset/)
- [HTML5 Doctor](http://html5doctor.com/html-5-reset-stylesheet/)
- [normalize.css](https://github.com/necolas/normalize.css/blob/master/normalize.css)

###configフォルダ###

configフォルダは、プロジェクトの設定ファイルや、scssで使用する変数を定義するファイルなどを管理するフォルダ。

###mixinフォルダ###

mixinフォルダは、scss内で使用するmixinファイルを管理するフォルダ。

###modulesフォルダ###

modulesフォルダはモジュールを管理するためのフォルダ。
モジュールとは、いくつかの要素をまとめた部品の集合という意味。
ヘッダー、フッターのような用途ごとに分けることができる。
モジュールを使うことでまとまったCSSを独立したものとして管理することができる。

####vendorフォルダ###

vendorフォルダは、ライブラリのファイルを管理するフォルダ。
cssにはライブラリと呼ばれるものがある。
ライブラリとはあらかじめCSSが書かれたファイル。
有名なCSSのライブラリでは、bootstrapがあげられる。
ライブラリを効率よく利用することで、コーディングのスピードが格段に上がる。

###overrideフォルダ###

overrideフォルダは、vendorフォルダに格納してある外部のライブラリを上書きするためのscssファイルを管理するフォルダ。
スクリーンショットのデフォルトの保存先を変更する(Mac)

スクリーンショットのデフォルトの保存先は~/Desktop/ですが、
保存先を任意の場所に変更することができます。
手順書などの資料を作成するときなど、連続してスクリーンショットを撮って後からまとめて利用したいときは、**関連性のあるキャプチャ画像が一箇所にまとまっている便利**ですよね。
なので、今回はMacでスクリーンショットの保存先を変更する方法を紹介します。
ターミナルで**二個コマンドを叩くだけ**です。

# :writing_hand_tone2:保存先ディレクトリを変更
1.デスクトップから「~/Pictures」ディレクトリに変更
下記のコマンドをターミナルで実行
```$ defaults write com.apple.screencapture location ~/Pictures/```
実際に使うときは `~/Pictures/`に任意のフォルダを指定して下さい

2.SystemUIServerを再起動し、設定を反映
```$ killall SystemUIServer```

# :point_left_tone2:保存先ディレクトリを元に戻す
1.下記のコマンドをターミナルで実行
```$ defaults delete com.apple.screencapture location```

2.SystemUIServerを再起動し、設定を反映
```$ killall SystemUIServer```

実際にスクリーンショットを撮って保存先が変わっているかどうか確かめてみましょう。
どうです？できましたか？

## :pushpin:スクリーンショット保存のショートカットキー
ちなみにMacでスクリーンショットを取るときのショートカットは
`⌘`+`⇧`+`4` (`command`+`shift`+`4`)
任意の場所を矩形選択して保存できるので、覚えておくと便利です。

##おすすめ
こちらの方がよくまとまっています:open_hands:
[OSXのスクリーンショットについてのまとめ](http://qiita.com/repli/items/8bcdc0558561e706d562)
おまけ
[Macの特殊キー記号を覚えてしまおう！](http://labs.torques.jp/2011/01/21/1610/)
Flask + Hamlish で Hello World

# 概要

[Flask](http://flask.pocoo.org/) は Python のシンプルなウェブフレームワークです。Ruby では Sinatra がそれに近いのではないかと思います。

Flask は、jinja2 というテンプレートエンジンを使うのですが、それだと HTML を素で書くような感じになってしまいます。私は、HAML に慣れているので、Flask で HAML 風のビューテンプレートを書ける [hamlish-jinja](https://github.com/Pitmairen/hamlish-jinja)を使ってみました。

## 準備
```
$ pip install Flask
$ pip install Hamlish-Jinja
```

## ファイル構成
```
.
├── app.py
└── templates
    └── index.haml
```

```python:app.py
from flask import Flask, render_template
from werkzeug import ImmutableDict

class FlaskWithHamlish(Flask):
    jinja_options = ImmutableDict(
        extensions=['jinja2.ext.autoescape', 'jinja2.ext.with_', 'hamlish_jinja.HamlishExtension']
    )
app = FlaskWithHamlish(__name__)
app.jinja_env.hamlish_mode = 'indented'
app.jinja_env.hamlish_enable_div_shortcut = True

@app.route('/')
def index():
    return render_template('index.haml')

if __name__ == '__main__':
    app.run()
```
```haml:index.haml
%html
  %head
    %meta charset="utf-8"
    %title
      Hello World!
  %body
    %h1
      Hello World!
```
#実行
```shell-session
$ python app.py
```
これでウェブブラウザ上で、`localhost:5000` にアクセス。`Hello World!`と表示されていると思います。
Flask では、テンプレートはデフォルトで `templates` という名前のディレクトリに置くことになっているようです。

#本家HAMLとの違い

Hamlish は名前の通りあくまでも「HAML風」であって、HAMLそのものではありません。違いを知るのに、[この記事](http://shinespark.hatenablog.com/entry/2015/12/07/083000)が参考になりました。

上の例でも、HAML なら `%meta{charset: "utf-8"}` となるべきところが、Hamlish だと `%meta charset="utf-8"`となっています。

#オプション指定
```
app.jinja_env.hamlish_mode = 'indented'
app.jinja_env.hamlish_enable_div_shortcut = True
```
Hamlish へのオプションの指定です。オプションにどのようなものがあるかは、[hamlish-jinja本家](https://github.com/Pitmairen/hamlish-jinja)をのぞいてみてください。

#感想
Flask はとてもコンパクトで良いと思いました。加えて、Hamlish を使うことで、ウェブサイトを楽しくサクサク作れそうです。

#参考文献
[ウェブアプリケーションフレームワーク Flask を使ってみる](http://qiita.com/ynakayama/items/2cc0b1d3cf1a2da612e4)
たいへん勉強になりました。これを読むだけで小さなウェブサイトならすぐに作り始められそうです。

#追記
いつも忘れるので。
ビューファイルの変更がサーバー再起動なしで反映されるようにするには、

```bash
$ FLASK_DEBUG=1 python app.py
```
とする。
Githubのwikiページを編集するのに便利なツールのご紹介

githubのwikiページに仕様をまとめて、それをPDFにして納品したりするときにちょっと便利になるツールがあるのでご紹介します。

いろいろ試した結果これが一番いいかなって結果に落ち着きました。

# Grip
これを使うとgithubのwikiがとても便利に使えます。
基本はウェブブラウザで使います。
更新したりすると、リアルタイムで変更を反映してくれるところが嬉しいところです。

では早速使い方について

## インストール
pipでサクッとインストールできます。

```
$ pip install grip
```

## 使い方
githubのwikiをcloneしてきてください。
.mdファイルがあるところで、

```
$ grip
　* Running on http://localhost:6419/ (Press CTRL+C to quit)
```

これですぐ使えるようになります。
あとはブラウザでURLを確認するだけ！

## 応用編

```
$ grip xxxxx.md
```

何も指定しないでコマンドだけ打つとhome.mdが表示されますが、mdファイルを指定してあげるとそのファイルの表示がされるようになります。
こちらで１ファイルづつ確認しながら修正していく方がよろしいかと。

githubのwikiページを上手に使って無駄な作業を減らしていきましょう！
自分用Haskellメモ

# 演算子で間違いそうなもの
```hs
True
False

not True
! True
1 == 1
1 /= 1
```

# if式にはelse節が必須
Haskellのifは、「文」ではなく「式」
必ず何らかの値を返す必要がある。そのためelse節は必須。
Haskellは関数型言語であり、関数の組み合わせでプログラムを作る。
関数とは、あるデータ値を結果の値に変換するもの。
つまり、必ず値を返すものでなければならず、命令形言語のif文のようにelseのない条件分岐はNG。

# 関数名
* 小文字で始める
* アポストロフィーも使える。ただし、慣例的に、正格（遅延でない）版の関数 or 少し更新したバージョンの関数に似た名前をつけるために使われる

# 引数を取らない関数：名前 or 定義
とよぶ

# ghciで名前を定義するときは let を使う
ghciはHaskellコンパイラの対話モード。
GHCIでの ```let a = 1``` は、スクリプトに ```a = 1``` と書くこととおなじ
CentOS7 上の仮想マシンで liveGNOME を起動する

# CentOS7 上の仮想マシンで liveGNOME を起動する

# はじめに

OpenStack Ocata 版の all-in-one で構築するための仮想マシンを CentOS7 上に作成するのが目標なのだが、その前に仮想マシンをどうやって作成すればよいのか確認する。仮想マシンで動作させてみるのは CentOS7 の liveGNOME、DVD のみで動作する。

# 環境

ホスト OS 側
* CentOS7.3
* Core i3-4020U(1.9GHz)
* メモリ16GB

ゲスト OS 側
* CentOS7.3
* CPU: 2
* メモリ 8GB
* HDD 10GB

# インストール

virt-install などがインストールしていなければインストールしておく。

```
# yum -y install virt-install virt-viewer virt-manager
```

次に liveGNOME をダウンロードして保存しておく。保存先はどこでもよい。

```
# mkdir -p /data/iso
# cd /data/iso
# wget http://ftp.iij.ad.jp/pub/linux/centos/7/isos/x86_64/CentOS-7-x86_64-LiveGNOME-1611.iso
```

HDD は不要なのだが、仮想マシンから認識することを確認するために HDD のイメージを作成する。保存先はどこでもよい。

```
# mkdir -p /data/hdd
# qemu-img create -f qcow2 /data/hdd/host01.qcow2 10G
```

次に仮想マシンを作成する。ネットワークは以下で設定したものを使用する。

* [仮想ネットワークを作成する。](http://qiita.com/syunasin/items/71ce29038e6fe22ab49b)

仮想マシンのスペックは以下のとおり。

| | |  
|---|---|
| CPU | 2 |
| MEMORY | 8GB |
| HDD| 10GB |
| ホスト名| host01 |

```
# virt-install \
    --virt-type kvm \
    --name host01 \
    --vcpus 2 \
    --ram 8192 \
    --cdrom=/data/iso/CentOS-7-x86_64-LiveGNOME-1611.iso \
    --disk path=/data/hdd/host01.qcow2 \
    --network network:public1 \
    --network network:private1 \
    --graphics vnc \
    --os-type linux \
    --os-variant rhel7 \
    --boot cdrom 
```

Virt Viewer が起動して live GNOME が起動する。CPU,メモリなどが設定されていることを確認する。Virt Viewer 上(live GNOME上)で実行する。

```
$ cat /proc/cpuinfo | grep processor
(プロセッサ 2 つ)
$ cat /proc/meminfo | grep MemTotal
(メモリ 8GB)
$ lsblk
(HDD 10GB)
$ nmcli d
(ネットワーク 2 つ)
```

# 最後に

次は仮想HDDに CentOS7.3 をインストールしてみる。
複数の ifame の読み込み（ load ）を待つ方法

# 背景

複数の iframe をページ内に配置して、各々の iframe のコンテンツをごにょごにょする場合、 全ての iframe の読み込み（ load ）が終わるのを待ってから処理を行わないとタイミングによって、 iframe の DOM を JavaScript でつかめたり、つかめなかったりして動作が安定しません。

jQuery の Deffered を使って全ての iframe の読み込みを待つことで、この問題をクリアできます。

# コード

## HTML

```html
<div id="mainContents">
  <div id="frameAContainer">
  </div>
  <div id="frameBContainer">
  </div>
  <div id="frameCContainer">
  </div>
</div>
```

## JavaScript

### 共通関数

```js
function iFrameLoaded(id, src) {
  var deferred = $.Deferred(),
    iframe = $("<iframe></iframe>").attr({
      "id": id,
      "src": src
    });

  iframe.on('load', deferred.resolve);
  iframe.appendTo("#" + id + "Container");

  deferred.done(function() {
    console.log("iframe loaded: " + id);
  });

  return deferred.promise();
}
```

### main

```js
$(function() {
  $.when(iFrameLoaded("frameA", "./framea.html"), iFrameLoaded("frameB", "./frameb.html"), iFrameLoaded("frameC", "./framec.html")).then(function() {
    console.log("All iframes loaded");

    // OK, Ready! Do Something!!
  });
});
```

## 少しだけ解説

iframe を 最初から HTML 上に配置するのではなく、 iframe を格納するコンテナ（ frameAContainer
 〜 frameCContainer ）だけ用意しておき、 iframe は JavaScript で動的に生成して load を待つように Deffered でセットしています。 最初から HTML 上に配置する方法では私の環境（ MacOSX ）では、load をつかめない場合がありました。

このコードは MacOSX の環境で Safari 、 FireFox 、 Chrome　で動作確認済です。

# 参考サイト

[jQuery.Deferred to Tell When Certain iframes Are Loaded · Elijah Manor](http://elijahmanor.com/jquery-deferred-to-tell-when-certain-iframes-are-loaded/)
SwiftのStringを行儀よく使ったHex文字列byte配列変換


SwiftのStringは生半可な知識で挑むといろいろ面食らいます。
度々「そもそも文字とは何か」という概念的な問いまで遡っては、「今はそんなことを考えたいわけではないんだ！」と我に帰ったりしがちです。（Swiftあるある）

練習としてStringの流儀に沿った形での16進数文字列 -> Data変換を考えてみました。

ポイントは

- 全体的にUnicodeScalarViewを扱う
	- Swiftの文字列の内部表現に一番近い（低コスト）
	- スペースや改行のスキップ判定にCharacterSetを使いやすい
- 全体の文字数をカウントしたり、毎回先頭からのオフセットをとるなどコストの高い計算を避ける
- 末尾再帰による最適化（を期待）
- 1byte16進数のパースはUInt8(_:string, radix:int)におまかせしている
	- さらに最適化をめざすならここを自作してstringを経由しない形にしてもいいかも

https://gist.github.com/gamako/94c8cb8873cabb97291b5a839ead50ca

```String+hex.swift

import Foundation

//    "".hexData.hexString                //
//    "01".hexData.hexString              // 01
//    "ab".hexData.hexString              // ab
//    "abff 99".hexData.hexString         // abff99
//    "abff\n99".hexData.hexString        // abff99
//    "abzff 99".hexData.hexString        // ab
//    "abf ff 99".hexData.hexString       // ab
//    "abf".hexData.hexString             // ab

fileprivate func convertHex(_ s: String.UnicodeScalarView, i: String.UnicodeScalarIndex, appendTo d: [UInt8]) -> [UInt8] {

    let skipChars = CharacterSet.whitespacesAndNewlines

    guard i != s.endIndex else { return d }

    let next1 = s.index(after: i)
    
    if skipChars.contains(s[i]) {
        return convertHex(s, i: next1, appendTo: d)
    } else {
        guard next1 != s.endIndex else { return d }
        let next2 = s.index(after: next1)

        let sub = String(s[i..<next2])
        
        guard let v = UInt8(sub, radix: 16) else { return d }
        
        return convertHex(s, i: next2, appendTo: d + [ v ])
    }
}

extension String {
    
    /// Convert Hexadecimal String to Array<UInt>
    ///     "0123".hex                // [1, 35]
    ///     "aabbccdd 00112233".hex   // 170, 187, 204, 221, 0, 17, 34, 51]
    var hex : [UInt8] {
        return convertHex(self.unicodeScalars, i: self.unicodeScalars.startIndex, appendTo: [])
    }
    
    /// Convert Hexadecimal String to Data
    ///     "0123".hexData                    /// 0123
    ///     "aa bb cc dd 00 11 22 33".hexData /// aabbccdd 00112233
    var hexData : Data {
        return Data(convertHex(self.unicodeScalars, i: self.unicodeScalars.startIndex, appendTo: []))
    }
}

extension Data {
    var hexString : String {
        return self.reduce("") { (a : String, v : UInt8) -> String in
            return a + String(format: "%02x", v)
        }
    }
}

```

# 参考

なぜSwiftの文字列APIは難しいのか | プログラミング | POSTD
http://postd.cc/why-is-swifts-string-api-so-hard/

String - Swift Standard Library | Apple Developer Documentation
https://developer.apple.com/reference/swift/string
技術英語 > takes the guess work out of ...

https://www.digikey.jp/en/product-highlight/i/idt/p9242-r-evk-and-p9221-r-evk-wireless-power-reference-kits

> An associated layout module allows for direct copy to a system board, while an optimized and fully-tested BOM **takes the guess work out of** component selection.

https://www.digikey.jp/ja/product-highlight/i/idt/p9242-r-evk-and-p9221-r-evk-wireless-power-reference-kits
> 関連付けられたレイアウトモジュールにより、システムボードに直接コピーでき、最適化され完全にテストされたBOMにより、コンポーネントの選択**で当てずっぽうの作業が不要になります**。

一文が長く冗長であるため、意味が取りにくい。
自分だったら以下のように訳すだろう。

「関連付けられたレイアウトモジュールにより、システムボードに直接コピーできます。一方で、最適化され完全にテストされたBOMにより、**当てずっぽうの**コンポーネント選択**が不要になります**。」
MacでAWS CLIをインストール


```bash
sudo easy_install pip
sudo -H pip install awscli --upgrade --ignore-installed six #参考[1]

aws --version
# versionが表示されればOK- aws-cli/1.11.75 Python/2.7.10 Darwin/16.4.0 botocore/1.5.38

aws configure #認証情報を対話的に設定する[2]

AWS Access Key ID [None]: XXXX
AWS Secret Access Key [None]: XXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: text
```

[1][OSX El Capitanでawscliのインストールに失敗する場合の対処方法 \- Qiita](http://qiita.com/szk3/items/758201285ec01d5283ac)

[2][【初心者向け】MacユーザがAWS CLIを最速で試す方法 ｜ Developers\.IO](http://dev.classmethod.jp/cloud/aws/mac-aws-cli/)
GitHub OrganizationのページをGitHub Pages + 独自ドメインで無料で作成する方法メモ



雑な自分用メモ


## まず組織を作る

WIP

## 組織の下にドメイン用サイトのレポジトリを作る

* index.htmlとか入れる
* GitHub自体が静的サイトジェネレーターのjekyllのテーマを提供してる?


## 設定する

* 組織じゃなくて、レポジトリのSettingsに行く
* GitHub Pagesの項目の下のSourceで、どのブランチにするか選んで Save
* Theme chooserは、無視
* Custom domainのところにドメイン名を入れて Save


## レポジトリ内にCNAMEファイルの作成

* レポジトリのトップにCNAMEというファイルを作成
* その中にドメイン名を入れる


## DNSを向ける

[Adding or removing a custom domain for your GitHub Pages site - User Documentation](https://help.github.com/articles/adding-or-removing-a-custom-domain-for-your-github-pages-site/)

自分は、Aレコードを2つ追加しただけでOKだった。



## 参考


[GitHub Pagesにカスタムドメインを設定する - Qiita](http://qiita.com/moutend/items/6f6a94c232c2cce40242)
Bash on Ubuntu on Windowsを使ってnodebrewとnodejsをインストール

だいぶ時代に置いて行かれてしまったので、少しでも時代に追いつくためにせめてnode.jsの開発環境とかを自分の端末に構築して何かしてみたいのです。。。

なお、VisualStudioCodeでのデバッグのため、最終的には普通にWindowsにnodist入れてNode.jsを入れてます。もはやBash on Ubuntu on Windowsもnodebrewも関係ないです。。

# インストールと設定

## Bash on Ubuntu on Windows
Windows10でBashが使えるようになったと聞いたので、さっそく使ってみます。インストール方法は割愛。

### 日本語フォントの設定
日本語が文字化ける場合は、シェルのデフォルト設定をラスターフォントからMSゴシック等に変更しましょう。
![image](https://qiita-image-store.s3.amazonaws.com/0/174324/d6bf5b8a-e8f3-9f54-fbfe-5275efe39aad.png)

## VisualStudioCode
個人的に使いやすいので、こいつを使います。インストーラをダウンロードしてきてインストール。

### Bashの設定
`Ctrl+,`を押して出る設定の右側に以下を追記すると、シェルでBashを使用できます。ちなみにシェルは「表示」メニューの「統合ターミナル」を選択するか、`Ctrl+@`で表示できます。
![image](https://qiita-image-store.s3.amazonaws.com/0/174324/b7ade5d2-a7f0-983e-2e46-27ad0e986efd.png)

```json
{
    "terminal.integrated.shell.windows": "C:\\WINDOWS\\sysnative\\bash.exe"
}
```

## nodebrewのインストール
ここからはBashで作業します。[nodebrewのリポジトリ](https://github.com/hokaccha/nodebrew)のreadmeに書いてある通りに作業すればよいかと思います。

```bash
$ curl -L git.io/nodebrew | perl - setup
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:03 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:04 --:--:--     0
100 24340  100 24340    0     0   5300      0  0:00:04  0:00:04 --:--:-- 1215k
Fetching nodebrew...
Installed nodebrew in $HOME/.nodebrew

========================================
Export a path to nodebrew:

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================
$ export PATH=$HOME/.nodebrew/current/bin:$PATH
$ source ~/.bashrc
```

最後に`$ nodebrew help`を実行して何か出ればOK。

## node.jsのインストール
ここまで来れば簡単ですね。たった今インストールしたnodebrewを使ってnode.jsをインストールします。

```bash
$ nodebrew install-binary stable
Fetching: https://nodejs.org/dist/v7.8.0/node-v7.8.0-linux-x64.tar.gz
######################################################################## 100.0%
Installed successfully
$ nodebrew use latest
use v7.8.0
$ node -v
v7.8.0
```

終わりました。

# Hello World
せっかく環境を作ったのでHello Worldくらいやってから寝ます。
[Node.js](https://nodejs.org/ja/)のサイトにあるサンプルをそのままコピーし、`app.js`として保存していざ実行。
![image](https://qiita-image-store.s3.amazonaws.com/0/174324/8fae7121-fe40-bd8a-9b4b-d280d409cfa5.png)


エラー出ました。何だこれ…？

よくわかりませんが、2日前から出ている模様。
仕方ないからBash上で`$ node app.js`を実行しましょう。。

```bash
$ node app.js
Server running at http://127.0.0.1:3000/
```

今日はこのくらいで勘弁したるわ。
VisualStudioCode上でデバッグできないのはよくわかりませんが、ちょっと様子見。

### 2017/04/09追記
そもそもbashのほうにnode入れたところで、VSCodeでnodejsをデバッグするときはそっちのnodeが使われないみたいですね。
というわけで、おとなしくWindows用のnodist入れることにします。
Laravelのmigrationファイルを消してしまったら起きたこと

# マイグレーションファイルを消した

```
$ php artisan make:migration create_users_table --create=users
```

的な感じで、あるテーブルのマイグレーションファイルを作り(実際のテーブル名は違いますが)、Atomで編集後、

```
$ php artisan migrate
```

しました。しかし、テーブル名が間違っていることに気づいたので、正しいテーブル名のマイグレーションファイルを再度作成しました。間違ってる方はどうしようかなーと0.2秒くらい考え、ファイルを消しました。

# 何が起きたか
mysqlに変な名前のテーブル入っちゃったから消さないとなと思い、[公式ドキュメントのマイグレーションのページ](https://readouble.com/laravel/5.4/ja/migrations.html)を見たところ、

```
$ php artisan migrate:refresh
```

なるコマンドがデータベース全体を作り直すのに便利ですよとのことだったので実行してみたところ

```
[ErrorException]                                      
  Undefined index: 削除したマイグレーションファイル名
```

という例外が発生しました。直接間違ったテーブル名のテーブルを消しても同じ例外が発生し、マイグレーションがきちんと進みません。[Stackoverflow](http://stackoverflow.com/questions/39616952/laravel-migration-undefined-index)にそれっぽい質問があったので、これに従い、

```
$ composer dump-autoload
```

としてみましたが、やはり同じ例外が発生します。

# 結局

[同じStackoverflowの質問](http://stackoverflow.com/questions/39616952/laravel-migration-undefined-index)の別の回答で解決しました。一旦データベースを削除して再度データベースを作り、

```
$ php artisan migrate
```

するだけです。一応解決はしましたが、データベースを消さなければならないというのがちょっと、、、という感じですね。

# 結論
マイグレーションファイルは消さず、ロールバックするのが賢明かなと思います。

# 2017/04/08 追記
マイグレーションファイルを消してしまった場合はデータベース内のmigrationsテーブルから消してしまったファイル名を削除することで例外が発生しなくなります。作ってしまったテーブルは勝手に消えないので、手動で消しましょう。

[nunulk](http://qiita.com/nunulk)さんコメントありがとうございました。
配列の初期化

```cpp
const int MAX_SIZE = 5;

// サイズを指定する場合
string fruits[MAX_SIZE] = {"apple", "banana", "lemon"};

// サイズを指定しない場合
string fruits[] = {"apple", "banana", "lemon"}

// 配列の配列（二次元配列）の場合
const int ROW = 3;
const int COL = 4; // ROW == COL である必要は無い
int map[ROW][COL] = { { 1, 2, 3, 4 },
                      { 5, 6, 7, 8 },
                      { 9, 10, 11, 12} };

```
[Unity]Linqとforとforeachで負荷計測してみる

# ○経緯
「業務でシーン上にあるオブジェクトの中から最も近いオブジェクトを探す」といった処理を実装した。
しかしその処理は多用されることが想定され出来る限り負荷のかからない処理に置き換えられないかを検討する必要が出てきました。
設計レベルにも問題があるにはありましたが、そもそもしょうもない勘違いで負荷が掛かっているのでは…と初心に戻り最適解が何なのか検証することにしました。

# ○検証内容
[成果物](https://github.com/cyber1496/LoopTimeCheck.git)はこちらです。

### ■比較したパターン
 - 1. Linq を用いて ToList
 - 2. for を用いて if分岐し ListへAdd
 - 3. foreach を用いて if分岐し ListへAdd

### 1.Linq を用いて ToList
```
var hogeList = (from x in HogeAllList
                where /* 条件 */
                select x).ToList();
```

### 2. for を用いて if分岐し ListへAdd
```
var hogeList = new List<Hoge>();
for (int i = 0; i < HogeAllList.Count; i++)
{
    var x = HogeAllList[i];
    if (/* 条件 */)
    {
        hogeList.Add(x);
    }
}
```

### 3. foreach を用いて if分岐し ListへAdd
```
var hogeList = new List<Hoge>();
foreach (var x in HogeAllList)
{
    var x = HogeAllList[i];
    if (/* 条件 */)
    {
        hogeList.Add(x);
    }
}
```

この上記３つのパターンでは 2<3<1 の順で処理時間に差ができました。
いやちょい待てよと。1.は別の理由で遅くなってるやろ。
無理にListにしなくても IEnumerable 直接受け取れば良い。
ということで次のパターンを追加し、再検証しました。
### 4.Linq を用いて IEnumerable を扱う
```
IEnumerable<Hoge> hoges = (from x in HogeAllList
                           where /* 条件 */
                           select x);
```
そしたら 4< "越えられない壁" <2<3<1 という結果になりました。
そうだよね―Toなんちゃら系重いﾃﾞｽﾖﾈ―
雑にToArrayとかToListしがちだった検証前の自分をひっぱたきたくなりました。
GC使用量も抑えられていてホントなんで素直にこのやり方をせずに
Toなんちゃらしてたのか悔やむばかりです。

※もちろんメリットもありますので設計に合わせて正しくお使いください。

# ○結論
ToArray, ToList 本当に必要ですか？ IEnumerable で良くないですか？ と言う視点を持つ。
へんな習慣が身に着いてしまい、より良いコードへの探求心が薄れていたなと感じました。

# ○追記
Linqの遅延評価を考慮していなかったため
負荷計測のタイミングを見直し再計測を行いました。
（コメント頂きありがとうございました）

以下の foreach をそれぞれの計測タイミングの前に追加しています。

```
foreach (var hoge in hogeList)
{
}
Debug.LogFormat("Result:{0}", hogeList.Count);
```

```
foreach (var hoge in hogeEnum)
{
}
Debug.LogFormat("Result:{0}", hogeEnum.Count());
```

## ○再計測の結果
4<2<3<1 という差は変わらないものの、差がわずかに縮まることが確認できました。
ただ、検証を行った状況では低負荷(高速、GC抑制)であることには変わらないようです。

どういったオブジェクトをいくつ生成して回しているか…などはGithubを見て頂ければと思います。

大まかな計測結果は以下の通りでした。
※計測値にバラツキが発生するので同じ処理を複数回回した計測値になっております。

| 処理 | 処理時間 | GC | 
|:-----------|------------:|------------:|
| 1. Linq で ListへToList (foreachで中身を確認) | 69msec | 2228224byte |
| 2. for で ListへAdd (foreachで中身を確認) | 50msec | 2027520byte |
| 3. foreach で ListへAdd (foreachで中身を確認) | 52msec | 1773568byte |
| 4. Linq で IEnumerable (foreachで中身を確認) | 16msec | 36864byte |

しかし…コメント頂き計測の妥当性などを思い返してみれば、
この検証はEditor上でしか行っておりませんでした…。

ですのでAndroidやiOSで動かす場合結果が異なる可能性があります。
特にiOSはLinqで死ぬこと有りますしそのあたりはおいおいと…。
OPEG 標準コーディング規則


# 本文について

1. OPEG 文法開発者向けの規則集(案2017,内部情報)をまとめてある
2. 今後、OPEG/IDE の整備により、改訂される可能性がある
3. あいまいな点は、公開 OPEGファイルを参考にして欲しい

# 非終端記号に関する名前慣習

OPEGは、宣言的な構文木構築記法をサポートしており、非終端記号は、名前から構文木の操作がわかるように区別する。

## 解析表現のみ

（構文木の構築をともなわない）解析表現は、英大文字からなる名前を用いる。

```opeg:よい例
_ = [ \t]*
COMMENT = _ '#' ( !'\n' . )*
DIGIT = [0-9]
```

慣習として、空白系は _ アンダスコア名を用いる。

## 構文木のノード生成

構文木のノードを生成するときは、英大文字で始まるキャメルスタイルの名前をつける。

```opeg:よい例
FuncDef = {
	"def" __ 
	$name(Name) __ 
	'(' <on InParentheses ( __ $(ParameterList)? __ )> ')' 
	( _ '->' _ $type(Test) )?  __ 
	':' __ $body(Suite) 
	#FuncDecl 
}
```

## 構文木の操作

構文木のノードを生成をともなわない構文木の操作は、アンダスコアで始まる名前をつける。

```opeg:よい例
_Assign = 
	'+=' #AddAssign
	/ '-=' #SubAssign
	/ '*=' #MulAssign
	/ '/=' #DivAssign
	/ '%=' #ModAssign
```

# 解析表現文法

## 構文規則

構文規則の定義は、非終端記号の名前、空白(1文字), = まで同じ行で書く。 (この理由は、OPEGのIDEが未整備で、構文定義を検索しやすくため)

```opeg:良い例
DIGIT = [0-9]
Digit = {
	[0-9]
	#Digit
}
```

```opeg:望ましくない例
INTEGER 
	= [0]
	/ [1-9] [0-9]*
```

次のように空白を揃えるのは、見た目が美しいが、構文定義を検索しやすくないのであまり望ましくない。

```opeg:望ましくない例
NON_ZERO_DIGIT = [1-9]
DIGIT          = [0-9]
OCT_DIGIT      = [0-7]
HEX_DIGIT      = [0-9a-fA-F]
BIN_DIGIT      = [01]
```

## 選択

選択は、構文規則として抽出し、各解析表現ごとに改行することが望ましい。

```opeg:よい例
EOS = 
	';'
	/ NEWLINE
	/ COMMENT
```

もしインラインで選択を用いるときは、() で囲む。

```opeg
EOS = (';' / NEWLINE / COMMENT)
```

## ノード生成


ノード生成は、適切な解析表現で区切り、複数行にわけてインデントして記述する。

```opeg
Integer = {
	(OCT_INTEGER / HEX_INTEGER / BIN_INTEGER / DECIMAL_INTEGER)
	 #IntExpr
} [lL]? 
```

ノード生成がシンプルな場合は、１行で書いてもよい。

```opeg
FloatNumber = { EXPONENT_FLOAT #DoubleExpr }
```

## 右折りたたみ(left-folding)

右折りたたみは、折りたたみ箇所で複数行にわけて書くのがよい。

```opeg
Sum     = 
        Product 
        {$left ( "+" #AddExpr / "-" #SubExpr ) $right(Product) }*
```

## タグ付け

タグ付けは、ノード生成の最後に書く。

```opeg
FloatNumber = { EXPONENT_FLOAT #DoubleExpr }
```

パターンによってタグ付けが変わるときはこの限りではない。

```opeg
Sum     = 
        Product 
        {$left ( "+" #AddExpr / "-" #SubExpr ) $right(Product) }*
```

また無理にタグを付ける必要はない。

# OPEG ファイル

OPEG ファイルは、 スタート地点となる構文定義に始まり、トップダウンで構文規則を定義する。

一般的には、次のようなファイル構成となる。

1. ライセンス、著作権表記、連絡先
2. スタート解析表現
3. (必要なら)ORIGAMI 定義
3. コードレイアウト (空白や改行などの字句規則)
4. 構文規則
  - トップレベル
  - ステートメント
  - 式
  - 型
  - リテラル

## example 文

可読性があがるので、構文定義の前に example は必ず入れる。

```opeg
example FuncDef '''
def sum_and_stringify(nums: List[int]) -> str:  
    """Adds up the numbers in a list and returns the result as a string."""
    return str(sum(nums))
'''

FuncDef = {
	"def" __ 
	$name(Name) __ 
	'(' <on InParentheses ( __ $(ParameterList)? __ )> ')' 
	( _ '->' _ $type(Test) )?  __ 
	':' __ $body(Suite) 
	#FuncDecl 
}
```

注意： 個々の構文定義ごとに example を入れる必要はない。 origami test コマンドでカバーされるようにexampleをいれる。

## 共有する

OPEG ファイルは、オープン文法の思想にもとづけば、公開して共有することが望ましい。
node jsインストール時に SyntaxError: Missing parentheses in call to 'print'

# node.jsがインストールできない

下記記事を参考にnode.jsをインストールしようとすると、なんかErrorが出てインストールできなかった
[node.jsのversionを管理するためにnodebrewを利用する](http://qiita.com/sinmetal/items/154e81823f386279b33c)

```
YourMacBookAir:work KTakata$ nodebrew install v0.12.18
Fetching: https://nodejs.org/dist/v0.12.18/node-v0.12.18.tar.gz
######################################################################## 100.0%
  File "./configure", line 367
    '''
      ^
SyntaxError: Missing parentheses in call to 'print'
```

SyntaxErrorのエラーメッセージで検索をかけるとpythonのErrorであるっぽい...

そんなわけで、次から躓かないようにインストールできるまでの手順をばまとめる


## pythonのバージョンを確認する

```
YourMacBookAir:~ KTakata$ python -V
Python 3.5.0
```

3系だった...

## Pythonを2系にして再インストールする。(pyenv)

pyenvの使い方は[pyenvを使ってMacにPythonの環境を構築する](http://qiita.com/1000ch/items/93841f76ea52551b6a97)とかを参照

```
YourMacBookAir:~ KTakata$ pyenv install 2.7.9
Downloading Python-2.7.9.tar.xz...
-> https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tar.xz
Installing Python-2.7.9...
patching file ./Lib/site.py
patching file ./Lib/ssl.py
Installed Python-2.7.9 to /Users/KTakata/.pyenv/versions/2.7.9

YourMacBookAir:~ KTakata$ pyenv global 2.7.9
YourMacBookAir:~ KTakata$ pyenv rehash
YourMacBookAir:~ KTakata$ python -V
Python 2.7.9
```

## 再チャレンジ
```
YourMacBookAir:~ KTakata$ nodebrew install-binary v0.12.18
Fetching: https://nodejs.org/dist/v0.12.18/node-v0.12.18-darwin-x64.tar.gz
######################################################################## 100.0%
Installed successfully
YourMacBookAir:~ KTakata$ nodebrew ls
v0.12.18

current: none
YourMacBookAir:~ KTakata$ nodebrew use v0.12.18
use v0.12.18
YourMacBookAir:~ KTakata$ node -v
v0.12.18
```
よし、インストールできた。
Basic JavaScript FCC barkinet 

Menulearn to code javascript at Free Code Camp logo
Comment your JavaScript Code 
Comments are lines of code that JavaScript will intentionally ignore. Comments are a great way to leave notes to yourself and to other people who will later need to figure out what that code does.

There are two ways to write comments in JavaScript:

Using // will tell JavaScript to ignore the remainder of the text on the current line:

// This is an in-line comment.
You can make a multi-line comment beginning with /* and ending with */:

/* This is a 
   multi-line comment */
Best Practice
As you write code, you should regularly add comments to clarify the function of parts of your code. Good commenting can help communicate the intent of your code—both for others and for your future self.

Instructions
Try creating one of each type of comment.

Run tests (ctrl + enter)
Reset	Help	Bug
/**
  * Your output will go here.
  * Any console.log() -type
  * statements will appear in
  * your browser's DevTools
  * JavaScript console as well.
  */

Create a // style comment that contains at least five letters.
Create a /* */ style comment that contains at least five letters.
Make sure that you close the comment with a */.

1
 
2
// This is an in-line comment.
3
/* This is a 
4
   multi-line comment */
5
もう Deep Learning で学習させる画像収集に時間を使いたくないのよ私

検証の際、画像データセットを収集するのは結構な悩みではないだろうか。もちろん既に社内で画像データセットが整っている場合は別だが出来る限り時間をかけたくない作業だろう。

例えば、以下のサイトではあらかじめ利用できる公開データセットが提供されいている。
https://deeplearning4j.org/opendata
http://deeplearning.net/datasets/
 
便利だが種類や枚数等に制限があるため場合によってはオレオレデータセットを作成したいケースもあるだろう。そんな時に便利なのが**[Bing Image Search API](https://www.microsoft.com/cognitive-services/en-us/bing-image-search-api/documentation, "Bing Image Search API")**だ。Azure でBing Image Search APIを利用する場合はAPI Typeに**Bing Search API**を指定する（下図参照）。お値段は*1000calls/$3*からでもちろん日本リージョンの選択も可能だ。



<img src="https://qiita-image-store.s3.amazonaws.com/0/33998/d94a7d90-cd0c-326b-b1d3-4dbcc3173785.png">

　
サーチエンジンでBing Image Search APIのコードを調べると少し古い記事が出てくるので新しいバージョン（2014/04/07時点）に対応したサンプルコードをのせておく。
sushiでヒットした200枚の画像を非同期でダウロードして指定フォルダに保存することができる。

```csharp
using System;
using System.Net.Http;
using System.Web;
using Newtonsoft.Json.Linq;
using System.Net;

namespace DLImageWithBingSearch
{
    static class Program
    {
        static void Main()
        {
            MakeRequest();
            Console.WriteLine("Hit ENTER to exit...");
            Console.ReadLine();
        }

        static async void MakeRequest()
        {
            var client = new HttpClient();
            var queryString = HttpUtility.ParseQueryString(string.Empty);

            // Request Header
            client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "[作成したCognitive ServicesのKeyを指定]);

            // Request parameters (Please update here)
            string keyword = "sushi"; 
            string path = "C:\\temp\\";      
            queryString["q"] = keyword;     
            queryString["count"] = "200";
            queryString["offset"] = "0";
            queryString["mkt"] = "en-us";
            queryString["safeSearch"] = "Moderate";

            // Generate URI
            var uri = "https://api.cognitive.microsoft.com/bing/v5.0/images/search?" + queryString;

            // Request
            var response = await client.GetAsync(uri);
            response.EnsureSuccessStatusCode();
            var json = await response.Content.ReadAsStringAsync();

            var values = JObject.Parse(json).SelectTokens("value[*].contentUrl");

            // Store Image
            foreach (var url in values)
            {
                Console.WriteLine(url);
                Guid guidValue = Guid.NewGuid();
                path = path + keyword + "_" + guidValue.ToString() + ".jpeg";
                Console.WriteLine(path);            
                WebClient wc = new WebClient();
                wc.DownloadFileAsync(new Uri((string)url), path);
            }
        }
    }
}

```
 
Qiita初投稿だが時間をかけるとまた筆不精になる自分がいるので、短時間でPOSTしてフィードバックを頂いて改善していくサイクルにしたいと思う。何かあれば「編集リスクスト」を頂ければ幸いである。（まだ使い方がよくわかっていませんがｗ）
Macのホームディレクトリを変更したらDropboxが同期しなくなった（その解決方法）

Macのホームディレクトリを変更したらDropboxが同期しなくなったので、この問題を解決する方法を問い合わせた。その結果、うまく同期できるようになったので、メモとして残しておく。

**問題が発生した原因**
1.　「システム環境設定」を開く
2.　「ユーザとグループ」を選択
3.　左上の鍵を解除
4.　ホームディレクトリを変更したいアカウントを右クリックして「詳細オプション...」を開く
5.　「アカウント名：hoge」及び「ホームディレクトリ:/Users/hoge」のhogeの部分を変更
6.　macを再起動

**生じた問題**
・Dropboxが起動できなくなった。あるいはDropboxが同期できなくなった。
・変更前のhogeのアカウントを再び作れば、Dropboxは正常に動作する。

**解決方法**
新しいアカウントでDropboxを引き続き正常に使いたい場合は、ターミナルで以下のコマンドを入力する。（コピペ推奨）

sudo mv ~/.dropbox ~/.Trash/dropbox.old

この時、アカウントにログインする用のパスワードを求められるので、入力する。
その後、macを再起動すれば、元どおりになった。
MacにJavaをインストールする


## brewをインストールする
brewはMacのパッケージ管理システムの一つです。
コマンド一つでいろんなソフトをインストールできて、
バージョンアップやアンインストールも簡単

``` ターミナル.app
%> /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

```


## java をインストールする
brewを使って早速java8をインストール

``` ターミナル.app
%> brew install Caskroom/cask/java
```

## jenv をインストールする
jenvは複数のjavaのバージョンを管理できるソフト
とりあえず入れとけ

``` ターミナル.app
%> echo -e 'if which jenv > /dev/null; then \n   export JENV_ROOT=/usr/local/var/jenv \n  eval "$(jenv init -)" \nfi' >> ~/.bashrc

%> source ~/.bashrc
```

## jenvでシステムで使うデフォルトのjavaを指定する

jenv versionsで今インストールされてるjavaを全て表示できる。
Macにデフォルトインストールされてるjavaが使われてる。

``` ターミナル.app
%> jenv versions
* system
  1.8
  1.8.0.112 
  oracle64-1.8.0.112
```

システムで使うjavaを1.8.0.112に変更

``` ターミナル.app
%> jenv global 1.8.0.112
```

確認！

``` ターミナル.app
%> jenv versions
  system
  1.8
* 1.8.0.112 
  oracle64-1.8.0.112
```

## eclipseをインストールする
java開発する上で必須な統合開発環境を入れる

``` ターミナル.app
brew cask install eclipse-jee
```

ひとまずこれで終わり。
お疲れちゃん
"㌠"はどこから来たか

UnicodeのCJK互換文字領域、U+3300からU+3357にかけてカタカナ組文字、そう、あの"**㌠**"なんかを含む文字の一群が並んでいます。。
これらの文字、カタカナですし明らかに日本由来なのですが、JIS文字集合（JIS X 0213）にはないものです。JISからの採用でないということは、Unicodeのために新たに作られた文字？　そんなわけはありません。だって「互換文字」なのです。
互換文字とは、**新規の文書では使うべきではないが、既存文書からの変換のときだけ使い、できればUnicodeの（互換文字でない）文字に正規化すべき**文字です。つまり、由来がどこかにあるはずなのです。
JISでないといっても、IBM拡張漢字でもMacJapaneseでもなく、一体どこから来たのでしょう？

新聞社向けの文字集合
--
カタカナの組文字をよく見かけるといったら新聞記事、そうなんです、新聞社向けの文字集合というのがありました。
共同通信社が制定して新聞各社共通となったK-JISという文字コードです。K-JISの歴史は古く、なんとJIS78制定と同時にその外字として誕生しました。

さて論より証拠、文字コード表をご覧あれ。
http://www.iwatafont.co.jp/format/gaiji_pdf/kjis095-120w.pdf
107区から108区にかけてずらっとあの組文字が並んでいます。Unicodeのものとは順が違いますが、同じ集合です。カタカナ組文字の由来はK-JISでした。

そして102区から103区ご覧ください、ウッ、なんとこれら組文字の縦書きグリフが別コードで！
そのほか"。"と"』"の合字とかその縦書きグリフとか、現代的にはかなり困った文字も大量に含まれております。99区にあるカッコと漢数字（または「つ」）の組文字、これなんだと思います？　これ新聞紙上で年齢を表記するときに使う文字ですよね。「つ」は"（六つ）"とか表記するときのですよ。

こんな厳しい文字集合から採用文字を取捨選択したUnicode関係者の皆様ほんとお疲れ様でした。
gitの差分比較をWinMergeでしたい！

~/.gitconfig に、以下を追加。どこぞからの拾い物。

```
[diff]
    tool = WinMerge

[difftool]
    prompt = false

[difftool "WinMerge"]
    path = C:/Program Files/WinMerge/WinMergeU.exe
    cmd = \"C:/Program Files/WinMerge/WinMergeU.exe\" -e -r -u -x -wl -wr -dl \"a/$MERGED\" -dr \"b/$MERGED\" \"$LOCAL\" \"$REMOTE\"
    trustExitCode = false

[merge]
    tool = WinMerge

[mergetool]
    prompt = false
    keepBackup = false

[mergetool "WinMerge"]
    cmd = \"C:/Program Files/WinMerge/WinMergeU.exe\" \"$MERGED\"
    trustExitCode = false

[alias]
    windiff = difftool -y -d -t WinMerge
    winmerge = mergetool -y -t WinMerge
```

そして、git bashとかのコマンドラインから、

```
git windiff
```

で、最新コミットとローカルで編集したファイルとの比較

```
git windiff HEAD HEAD^
```

で、最新コミットとその1つ前の比較

をWinMergeが立ち上がってきて、ディレクトリ単位でやってくれる。
-d をオプションに付けないと、ファイル1個毎にWinMergeが立ちあがってくるブラクラ状態になるので注意(笑)
IndexedDBの使い方


IndexedDBを使うと、ブラウザ内にWebStorageより大量のデータを保存できます。

ただし、ブラウザのプライバシーモードでは使えない場合があります。
2019年1月現在、主要ブラウザでプライバシーモードでも使えるのはChromeのみです。([ブラウザ実装状況](https://developer.mozilla.org/ja/docs/Web/API/IndexedDB_API#Browser_compatibility))

IE11では、ローカルにファイルを置いてfile://urlにアクセスしても使えませんが、webサーバー上に置けば使えます。

IndexedDBを扱う処理は非同期です。
データベースへの接続やデータの挿入、取得などのリクエストが、成功したときにはonsuccess、失敗した時にはonerrorが呼び出されます。

## データベース新規作成・接続
```js
var dbName = 'sampleDB';

var openReq  = indexedDB.open(dbName);
//　DB名を指定して接続。DBがなければ新規作成される。

  openReq.onupgradeneeded = function(event){
  //onupgradeneededは、DBのバージョン更新(DBの新規作成も含む)時のみ実行
    console.log('db upgrade');
  }
  openReq.onsuccess = function(event){
  //onupgradeneededの後に実行。更新がない場合はこれだけ実行
    console.log('db open success');
    var db = event.target.result;
    // 接続を解除する
    db.close();
  }
  openReq.onerror = function(event){
  // 接続に失敗
    console.log('db open error');
  }
```


db.close()しないままでも、indexedDB.open(dbName)はできる。
しかし、DBの更新や削除は、closeしてからでないとできない(onupgradeneeded, onsuccess, onerrorのどれも実行されない)。


## データベース削除
```js
var deleteReq = indexedDB.deleteDatabase(dbName);

  deleteReq.onsuccess = function(event){
    console.log('db delete success');
    // 存在しないDB名を指定してもこっちが実行される
  }

  deleteReq.onerror = function(){
    console.log('db delete error');
  }
```


## オブジェクトストア作成
オブジェクトストアは、RDBでいうテーブル。

```js
var storeName  = 'sampleStore';

var openReq = indexedDB.open(dbName, dbVersion);
// オブジェクトストアの作成・削除はDBの更新時しかできないので、バージョンを指定して更新

  openReq.onupgradeneeded = function(event){
    var db = event.target.result;
    db.createObjectStore(storeName, {keyPath : 'id'})
  }

```
オブジェクトストアの作成、削除はDBの更新時に実行されるonupgradeneededの中でしかできない。
DBの新規作成時以外でDBを更新するには、open()のときにDBの新しいバージョンを指定する。
現在のバージョンは、以下のように取得できる。

```js
var dbVersion;
openReq.onsuccess = function(event){
  var db = event.target.result;
  dbVersion = db.version;
}

```


## データ挿入
```js
var data = {id : 'A1', name : 'test'};

var openReq = indexedDB.open(dbName);

openReq.onsuccess = function(event){
    var db = event.target.result;
    var trans = db.transaction(storeName, 'readwrite');
    var store = trans.objectStore(storeName);
    var putReq = store.put(data);

    putReq.onsuccess = function(){
      console.log('put data success');
    }

    trans.oncomplete = function(){
    // トランザクション完了時(putReq.onsuccessの後)に実行
      console.log('transaction complete');
    }
  
 }
```
putの他にaddもある。putはデータの挿入または更新で、addは挿入だけ。keyの値が重複したデータをaddしようとするとエラーになるが、putでは上書きする。


## データ取得
```js
var keyValue = 'A1';

var openReq = indexedDB.open(dbName);

  openReq.onsuccess = function(event){
    var db = event.target.result;
    var trans = db.transaction(storeName, 'readonly');
    var store = trans.objectStore(storeName);
    var getReq = store.get(keyValue);

    getReq.onsuccess = function(event){
      console.log(event.target.result); // {id : 'A1', name : 'test'}
    }
  }
```

そのままだと使いにくいと思われる方は、[dexie.js](https://dexie.org/)などのラッパーも用意されているので試してみるといいかもしれません。
pipをアップグレードしようとすると、失敗した後にアップグレードを求められ無限ループする件

#環境
OS: Ubuntu16.04(Xenial Xerus)

#状況
pip3を利用しようとした際に「バージョンが古いので、アップグレードしてください」というエラーが出る。エラーの中に「pip install --install pip」を利用すると良いと書いてあるが、このコマンドを打っても、
古いバージョンをインストールし、挙句のはてに「アップグレードしてください」とエラーが出ます。

要するにpipでアップグレードしようとしているのに、「古いバージョンだからアップグレードできません
」という謎エラーが出る状態です。

#具体的なエラー内容

```
You are using pip version 8.1.1, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command
```

#エラーに対する対処

1)素直に指示に従う。

```
pip install --upgrade pip
→　なぜかpip8.1.1がインストールされて同じエラーが出る
```

2)pip3で実施してみる

```
pip3 install -U pip
→ [Error]
  Not uninstalling pip at /usr/lib/python3/dist-packages, outside environment /usr
```

既存のpipをアンインストールできなかったために、何か問題が起きたのか？

3)pip自体をアンインストールしてみる

```
sudo apt-get remove python-pip
sudo apt-get remove python3-pip
```

↓
「pip --version」 や「pip3 --version」を実施してみるものの8.1.1のバージョンが出力される。

4)別の方法でアンインストールしてみる

```
sudo python -m pip uninstall pip setuptools
sudo apt-get remove python3-pip
```

↓
```
pip3 --version
> pip 9.0.1
pip --version
> pip 9.0.1
```

今回はなぜかできました。しかも削除されるだけかと思ったら９．０．１とお目当てのバージョンがインストールされてました。これにてpipのバージョンアップが無事完了しました。

バージョンアップが完了しないと、バージョンアップを促すエラーが出続けるので、pip自体が使えない状態でした。無事バージョンアップできて良かったです。
[メモ] Apacheモジュール版PHPからFastCGI版PHPに切り替えた時にはまった(filter_input)

とあるアプリケーションをApache+PHPからnginx+php-fpmに移行中にはまったのでメモ。

\$\_GETや\$\_POSTを使うより`filter_input`が良いと言われているので、該当アプリケーションではfilter_inputのラッパークラスをつくって使っていた。

しかし、php-fpm使用時の`filter_input`では`INPUT_SERVER`、`INPUT_ENV`を使うと、値が必ずnullとなるらしく、`PATH_INFO`の解析部分で不具合が発生していた。

## 抜粋

```php:変更前
class Filter
{
    static protected function applyFilter($type, $name, $default = null, $filter = FILTER_DEFAULT, $options = null)
    {
        $value = filter_input($type, $name, $filter, $options);
        if (is_null($value)) {
            return $default;
        } else if ($value === false) {
            return false;
        }

        return $value;
    }

    static public function getServer($name, $default = null, $filter = FILTER_DEFAULT, $options = null)
    {
        return self::applyFilter(INPUT_SERVER, $name, $default, $filter, $options);
    }

    static public function getEnv($name, $default = null, $filter = FILTER_DEFAULT, $options = null)
    {
        return self::applyFilter(INPUT_ENV, $name, $default, $filter, $options);
    }

    // ...snip...
}
```

```php:変更後
class Filter
{
    static protected function applyFilter($type, $name, $default = null, $filter = FILTER_DEFAULT, $options = null)
    {
        $value = filter_input($type, $name, $filter, $options);
        if (is_null($value)) {
            return $default;
        } else if ($value === false) {
            return false;
        }

        return $value;
    }

    static public function getServer($name, $default = null, $filter = FILTER_DEFAULT, $options = null)
    {
        if (isset($_SERVER[$name]) && !empty($_SERVER[$name])) {
            return $_SERVER[$name];
        } else {
            return $default;
        }
    }

    static public function getEnv($name, $default = null, $filter = FILTER_DEFAULT, $options = null)
    {
        if (isset($_ENV[$name]) && !empty($_ENV[$name])) {
            return $_ENV[$name];
        } else {
            return $default;
        }
    }

    // ...snip...
}
```

本当であればフィルターのタイプやらオプションの処理を書くのが良いのだろうが、アプリが動けば良いので`$_SERVER`、`$_ENV`を利用する様にしただけ。

これでなおった。
macOS Sierra で GNU gcc + MPI + OpenMP を使う. 

漢なら macOS でも MPI + OpenMP プログラミングしたいですね!

C++11 になり `std::thread` でスレッドプログラミングが主流になりつつある予感もしますが, まだまだ HPC 系プログラムで OpenMP 使いたいときがありますね.

XCode 付属の Apple gcc(clang) はかたくなに OpenMP のサポートをしないので, 新しく GNU gcc(or clang も 3.8 くらいから OpenMP 対応されていますね)をインストールすることになります.

今回は brew で gcc についてあつかいます.

## GNU gcc のインストール

2017 年 4 月 7 日時点の最新は以下の通りです.

```
macOS : 10.12.4
XCode : 8.3
Apple gcc: Apple LLVM version 8.1.0 (clang-802.0.38)
gcc-6: version 6.3.0 (Homebrew GCC 6.3.0_1) 
gcc-5: version 5.4.0 (Homebrew GCC 5.4.0_1) 
```

macOS Sierra(OSX 10.12 SDK)では, より Apple 拡張がヘッダファイルに入ったようで, gcc だとヘッダがパースできなかったりするので, 上より古い gcc が homebrew で入っていたらアップデートしておきましょう(とはいえまだまだ一部 OSX のヘッダは GNU gcc で扱えないものもある)

また, binutils 周りは XCode で入る binutils を使わざえるを得ません. 
そのため gcc-5.4 では C/C++ プログラムのリンク時に以下のようなワーニングが出る時があります.

```
/var/folders/pm/_61jgqgn0qdf1s6_pd1mzztc0000gn/T//ccYb1AdB.s:167:11: note: change section name to "__text"
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
                 ^      ~~~~~~~~~~~~~
```

gcc 5.5 が出たら治るでしょうか...? なにやらあやしいので, gcc-6 を使うことにします.

普通に homebrew で gcc-6 を入れます

```
$ brew install gcc@6
```

## OpenMPI のインストール

brew でコンパイラを指定して openmpi をビルドもできるようですが, 今回はソースからコンパイルすることにします.

2.0.2 をコンパイルします. 2.1 の最新版も同様にして動くかもしれません.

https://www.open-mpi.org/software/ompi/v2.0/

`CC` と `CXX` に gcc6 を指定して configure でいけます. `$HOME/local/openmpi` にインストールします.

configure には, `--enable-mpi-cxx` (MPI C++ binding を有効)をお好みで添えて.

```
$ cd /path/to/openmpi-2.0.2
$ CC=gcc-6 CXX=g++-6 ./configure --prefix=$HOME/local/openmpi 
$ make && make
```

`$HOME/local/openmpi/bin` を `PATH` に, `$HOME/local/openmpi/lib` を `DYLD_LIBRARY_PATH` に追加しておきます(`DYLD_LIBRARY_PATH` は設定しないでも OK かも)

mpicc で gcc-6 が使われていることを確認します.

```
$ mpicc -v
...
gcc version 6.3.0 (Homebrew GCC 6.3.0_1)
```

テストコードをコンパイルして実行してみます.

```
// test.cc
#include <cstdio>
#include <cstdlib>

#include <mpi.h>
#include <omp.h>

int
main(int argc, char **argv)
{
  MPI_Init(&argc, &argv);

  int rank;
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);

  printf("rank %d, omp_get_max_threads %d\n", rank, omp_get_max_threads());

  MPI_Finalize();

  return 0;
}
```

```
$ mpicxx -fopenmp test.cc
$ mpirun -np 4 ./a.out 
rank 1, omp_get_max_threads 4
rank 2, omp_get_max_threads 4
rank 3, omp_get_max_threads 4
rank 0, omp_get_max_threads 4
```

Cool!

Happy MPI + OpenMP programming!

## TODO

aobench MPI 版を作って, MPI + OpenMP の動作確認とベンチマークをやりやすくしたい.

## References

MacにMPI+OpenMPハイブリッド並列環境を構築する
http://qiita.com/kaityo256/items/ae9329dae24ea8828ae0
Google Cloud PlatformがGPUのみならずTPUをも提供しようとしている

#…タブンネ！

#元記事はこちら
[Quantifying the performance of the TPU, our first machine learning chip](https://cloudplatform.googleblog.com/2017/04/quantifying-the-performance-of-the-TPU-our-first-machine-learning-chip.html)
> *私たちは、最高のインフラを構築し、その恩恵をみなさまと分かち合うことに尽力しております。今後数週間、数ヶ月で更なるアップデートをお届けする予定です。*

これってつまりTPUクル━━━━(ﾟ∀ﾟ)━━━━!?
（注：[CloudML API群](https://cloud.google.com/products/machine-learning/)の裏では既に使われている）

[TechCrunchの記事](http://jp.techcrunch.com/2017/04/06/20170405google-says-its-custom-machine-learning-chips-are-often-15-30x-faster-than-gpus-and-cpus/)では提供しないだろうと書かれているが，論文の最後の文の誤解釈じゃなかろうか（少なくともGoogleが明言したわけではなさそう）．
> *商用製品間の桁違いな差異はコンピュータアーキテクチャでは珍しく、TPUが特定分野アーキテクチャの原型となる可能性があります。私たちは多くの人がレベルをさらに高める後継者を育成することを期待しています。*

論文内で自社プロダクトの今後を示唆するとも考えにくいし，提供されればAWS等競合他社に対する大きな強みにもなるだろう．提供しないメリットはないんじゃなかろうか．
他所の日本メディアでは触れさえしてないけどね…

#TPUは；

- GPUやCPUより15-30倍速い
- 30-80のエネルギー効率
- たった100-1500行のコードで動く（[TensorFlow]
(https://www.tensorflow.org/)）

![Performance/Watt](http://3.bp.blogspot.com/-j7Bg9Ppi_H0/WOUyntxuE7I/AAAAAAAADyY/SpGx5Alk8TUC6yyunClJEhb81Fd2C4WsACLcB/s1600/tpu-2.png)


#TPUについて詳細
[Googleは機械学習アルゴリズム専用の高速チップを内製、なんと、８ビット機だ](http://jp.techcrunch.com/2016/05/19/20160518google-built-its-own-chips-to-expedite-its-machine-learning-algorithms/)
[tensorflow 勉強会 #4 > TPU](http://qiita.com/tora470/items/44d4c17dbc76eb18941f#tpu)
Photonを使ってMac風UIをElectronで作る


「Photon」はHTML/CSSでMac風のUIを忠実に再現したUi Kitです。
HTMLを配置していくだけで簡単にMac風UIをElectrnで実現出来ますし、少し手を加える必要がありますが、ネイティブアプリケーションと間違える様な出来です。

![スクリーンショット 2017-04-07 22.36.25.png](https://qiita-image-store.s3.amazonaws.com/0/33673/76d399d1-1501-43c7-6237-2de4b8979eb1.png "スクリーンショット 2017-04-07 22.36.25.png")


#Photonの使い方

http://photonkit.com/

Kitをダウンロードすると`css/photon.css`がありますので、これを読み込むだけです。

JavaScript等は使わないタイプのUiKitです。


#Photonの欠点

あくまでもCSSとWebfont等を使ったUIなのでElectron周りのサポートはされていませんので手動でその辺りの設定をする必要があります。

##Window周りの設定をする
通常の様にPhotonを使うと、Electronが生成するヘッダーバーとPhotonのヘッダーバーが二重に表示されます。
![スクリーンショット 2017-04-09 20.38.14.png](https://qiita-image-store.s3.amazonaws.com/0/33673/62c10639-af3b-783b-d2d8-bc6904e8c1d5.png)
次の様にしてElectronが生成するヘッダーバーを非表示にします。


```main.js
  win = new BrowserWindow({
    width: 900,
    height: 500,
    'titleBarStyle': 'hidden', //ヘッダーバーを透明にし、ボタンだけ表示
    'acceptFirstMouse': true
  });
```

この様にする事でPhotonのヘッダーバーのみが表示されます。ただこれだとウィンドウ移動の操作は無効化されてしまうので、ヘッダーバーに次ぎのCSSを追加します。

```style.css
      header {
        -webkit-app-region: drag; /* ドラッグ可能に */
        -webkit-user-select: none; /* ドラッグはテキスト選択と競合するので禁止 */
      }
```

これでヘッダーバーをドラッグ＆ドロップで移動出来る様になりよりネイティブアプリに近づけた気がします。
WordPressのパーマリンクをページごとに書き換える『Custom Permalinks』

WordPressの固定ページのパーマリンクは、親子関係とページスラッグによって決まります。しかし、旧サイトのリニューアルなどで URLを WordPressの構造とは関係ないものにしたいとか、拡張子に「.html」とつけたいなどのリクエストがある場合、標準の設定では不足することがあります。

そこで使えるプラグインが『Custom Permalinks』です。

- [Custom Permalinks — WordPress Plugins](https://ja.wordpress.org/plugins/custom-permalinks/)

使い方は非常に簡単で、インストールすると固定ページのスラッグ設定箇所が、図のようにディレクトリや拡張子なども自由に入れられるようになります。

![2017-04-07_22-19-49.png](https://qiita-image-store.s3.amazonaws.com/0/3977/a5c1db97-26de-60fc-684a-c2126d11bd35.png)
uniqコマンドの現実

```shell-session
$ wc -l ok.csv
13773
```
のok.csvを

```
$ uniq ok.csv > ok_uniq.csv
$ wc -l ok_uniq.csv
13562

$ uniq -d ok.csv > ok_repeated.csv
$ wc -l ok_repeated.csv
197
```

13773 - 13562 = 211
211 - 197 = 14

14行はどこへ行った？
結論から言うとダブりが３行あると１行はどちらにも入らずに消えているみたいですね。
~~3行ダブりが14回ほど~~3行ダブりが12回、4行ダブりが1回あったみたいです。

2行ダブりはuniq.csv, repeated.csvのどちらにも1行入るように振り分けられ、
3行ダブりはどちらにも１行入って、どちらにも入らずに１行が消えていく。
4行ダブりでも、~~１行がどちらにも入らずに消えているようで、１行がuniqとして、２行が~~2行がどちらにも入らずに消えて、1行がuniq.csvへ入り、1行がrepeat.csvへ入ります。
brakeman gem勉強

静的**脆弱性診断**ツールです。

github: https://github.com/presidentbeef/brakeman

診断できる項目：http://brakemanscanner.org/docs/warning_types/

* install

```
gem install brakeman
```

* bundler
Gemfile設定
コマンドツールとして使う時、*:require => false*を付けておく。

```rb
gem "brakeman", :require => false
```

* 分析を行うコマンド

```
brakeman -A
```