OmniAICreator/Qiita-1.07M huggingface dataset:
jQueryを使ってニコニコっぽいコメント表示機能を実現

社内ツールで、webページにコメントを付ける機能が欲しくなったのでjQueryプラグインを作りました。
![demo](https://raw.githubusercontent.com/wmoai/jquery.nncomment/master/demo.gif)

デモ：http://wmoai.github.io/nncomment/
ソース：https://github.com/wmoai/jquery.nncomment

# 使い方

* jQueryと、nncomment.jsおよびnncomment.cssを読み込む
* コメントを表示したい要素に対して、comment()で文字列を渡す
* 流れるコメント要素はncc-comment-customクラスを持っているので、このスタイルを記述することでコメントのデザインを変更

```sample.html
<html>
  <head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
    <script src="nncomment.js"></script>
    <link rel="stylesheet" type="text/css" href="nncomment.css" />
    <script>
      $(function() {
        $('#comment').on('submit', function() {
          var message = $('#message').val();
          $('#message').val('');
          // 表示したい要素に対してコメント
          $('#screen').comment(message);
          return false;
        });
      });
    </script>
    <style>
      .nnc-comment-custom {
        font-size: 1.2em;
        font-weight: bold;
      }
    </style>
  </head>
  <body>
    <div>
      <form id="comment" action="#">
        <div id="screen" class="nnc-screen" style="width:400px;height:200px;background-color:whitesmoke;" >
        </div>
        <input id="message" />
      </form>
    </div>
  </body>
</html>
```

# 実装の方針

* jQueryプラグインとして作成
* コメント要素を生成・追加して、アニメーションで流す
* コメント表示時間はとりあえず一律10秒
* なるべくコメントが重ならないように、相対速度計算して表示する行を選択
* 表示を終えたらコメント要素は消す
* （コマンド機能っぽいものは無い）
staticメンバ変数は使わないこと！

staticメンバ変数は、初期化前に使用されてしまう可能性がある。

```
struct foo
{
  foo() { std::puts("foo"); }
  void f() { std::puts("f"); }
};

struct sth
{
  static foo foo_;
  sth() { foo_.f(); }
};

sth s; // oops!
foo sth::foo_;
```

これを回避し、確実にstaticメンバ変数を使用前に初期化するには、以下のようにする。

```
struct sth
{
  static foo& foo_()
  {
    static foo f;
    return (f);
  }

  sth() { foo_().f(); }
};
```

staticメンバ関数で包んだだけだが、これで確実に初期化されることが保証される。
加えて、c++11からはスレッドセーフである。(visual studioでは2015からスレッドセーフが保証されたはず)

出展: [c++ more idioms Construct On First Use](https://en.m.wikibooks.org/wiki/More_C%2B%2B_Idioms/Construct_On_First_Use)
aufsがlinux kernelに取り込まれない理由を調べたい時の最初のステップ

# 概要

aufsがkernelの本家に取り込まれていない理由を数カ月に一度議論になるので、
忘れないように、いつもみるところを書いておく

# 結論

かならず、[aufsのサイト](http://aufs.sourceforge.net/)の
***0. Introduction*** の内容をチェックする。

2016-03-04の時点では以下のように書いてある。
(上記サイトより引用)

```
Note: it becomes clear that "Aufs was rejected. Let's give it up."
      According to Christoph Hellwig, linux rejects all union-type
      filesystems but UnionMount.
<http://marc.info/?l=linux-kernel&m=123938533724484&w=2>

PS. Al Viro seems have a plan to merge aufs as well as overlayfs and
    UnionMount, and he pointed out an issue around a directory mutex
    lock and aufs addressed it. But it is still unsure whether aufs will
    be merged (or any other union solution).
<http://marc.info/?l=linux-kernel&m=136312705029295&w=1>
```

# その他

そのほかの情報もあるのかもしれないが、調べきれてはいない。
情勢がかわるかもしれないので、気になったら、きちんとしらべたほうがよい。
エクセルを開くライブラリ検証メモ



エクセルを開くライブラリを検証したのでメモ


##[OpenXML](https://www.microsoft.com/en-us/download/details.aspx?id=30425)
・通常ファイル（xlsx）の読込み：OK
・マクロ付き（xlsm）ファイルの読込：NG

##[ClosedXML](https://closedxml.codeplex.com/)
・通常ファイル（xlsx）の読込み：OK
・マクロ付き（xlsm）ファイルの読込：NG

##[ExcelCreator](http://www.adv.co.jp/product/product_excelcreator2016.htm)
・通常ファイル（xlsx）の読込み：OK
・マクロ付き（xlsm）ファイルの読込：OK
Vagrant+ansibleでLAMP環境構築（２）

[前回](http://qiita.com/k-serenade/items/853c14c28218f781ce28)の続き

今回は、ansible で Vagrant イメージに対して簡単な playbook を実行するところまで

## Vagrant イメージの情報
* OS：CentOS7
* IP：10.0.0.5

## ansible バージョン確認

```sh
$ ansible --version
ansible 2.0.0.2
  config file = 
  configured module search path = Default w/o overrides
```

## ansible で ping する

とりあえず、[チュートリアル](http://yteraoka.github.io/ansible-tutorial/)通りに、pingしてみる

```sh
$ ansible 10.0.0.5 -m ping
 [WARNING]: provided hosts list is empty, only localhost is available
$ echo 10.0.0.5 > hosts  ## ここでカレントディレクトリに hosts ファイルを作成する
$ ansible -i hosts 10.0.0.5 -m ping
The authenticity of host '10.0.0.5 (10.0.0.5)' can't be established.
ECDSA key fingerprint is SHA256:0ybr41VsIkCo7+PFfVmvBN1M5mVraiVhkGTn7yhloV4.
Are you sure you want to continue connecting (yes/no)? yes
10.0.0.5 | UNREACHABLE! => {
    "changed": false, 
    "msg": "ERROR! SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue", 
    "unreachable": true
}
```

UNREACHABLE! って言われる。。。
`~/.ssh/config`に、Vagrant イメージの SSH 接続設定が必要だそうなので、以下のように作成してみる

```sh
$ vagrant ssh-config --host 10.0.0.5 >> ~/.ssh/config
$ ansible -i hosts 10.0.0.5 -m ping
10.0.0.5 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
```

繋がった！
~/.ssh/config の内容抜粋は以下

```:~/.ssh/config
Host 10.0.0.5
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile "/Users/koga/hobby_src/ansibleplaybook/.vagrant/machines/default/virtualbox/private_key"
  IdentitiesOnly yes
  LogLevel FATAL
```

## 簡単な playbook を作成して実行してみる

簡単な playbook を作成して実行してみた。

```yaml:playbook.yml
- hosts: DevServer1
  become: yes
  tasks:
    - ping:
```

playbook の hosts を DevServer1 にしたので、 hosts を書き直す

```text:hosts
[DevServer1]
10.0.0.5
```

```sh
$ ansible-playbook -i hosts playbook.yml

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [10.0.0.5]

TASK [ping] ********************************************************************
ok: [10.0.0.5]

PLAY RECAP *********************************************************************
10.0.0.5                   : ok=2    changed=0    unreachable=0    failed=0   
```

成功した！

次回はいよいよ LAMP 環境構築する！
【Swift】 WKWebViewのAppStoreのリンクをストアアプリで開く

# WKWebViewのAppStoreのリンクをストアアプリで開く

UIWebViewでAppStoreのリンクをタップすると自動でストアアプリで開いてくれましたが
WKWebViewでは自前で実装する必要があるようです。

やることは以下
1. WkWebViewの画面遷移をフック
2. 正規表現でURLがストアへのリンクかチェック
3. AppStoreのリンクなら、ストアアプリで開く

↓ソースです

```lang:swift2.0以降
override func viewDidLoad() {
　　super.viewDidLoad()
　　// WkWebViewをViewに貼り付け
　　self.wkWebView = WKWebView()
　　self.view = self.wkWebView!
　　var url = NSURL(string:"http://www.yahoo.co.jp/")
　　var req = NSURLRequest(URL:url)
　　self.wkWebView!.loadRequest(req)
　　self.wkWebView.navigationDelegate = self
}

// MARK: - WkWebViewの画面遷移をフック
func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) {
    let url = navigationAction.request.URL
    let urlString = ((url) != nil) ? url!.absoluteString : ""
    
    if isMatch(urlString,pattern: "\\/\\/itunes\\.apple\\.com\\/") {
        // AppStoreのリンクなら、ストアアプリで開く
        UIApplication.sharedApplication().openURL(url!)
        decisionHandler(WKNavigationActionPolicy.Cancel)
    }
    decisionHandler(WKNavigationActionPolicy.Allow)
}

// MARK: - 正規表現でマッチング
func isMatch(input: String, pattern:String) -> Bool {
    let regex = try! NSRegularExpression( pattern: pattern, options: NSRegularExpressionOptions.CaseInsensitive)
    let matches = regex.matchesInString( input, options: [], range:NSMakeRange(0, input.characters.count) )
    return matches.count > 0
}
```
【git】自分がよくやる「あれってどうやるんだっけ？」なコマンド。

鳥頭なもんで、*あれ、こういう時何を打てばいいんだっけ？*ってよくなるので、備忘録的な。

## さーてリモートリポジトリ作ったし今のやつ`push`するぞー
```
git init
git add .
git commit -m "First commit."
git remote https://github.com/[UserName]/[Repository].git
git push -u origin master
```
ローカルリポジトリを作成してからリモートに`push`するまでの一連の流れ。
githubなんかに書いてますよね。

## やっべ、そのコミット間違ってる！！
```
git reset --hard HEAD^
```
よくやらかすやつ。
HEAD(直前のコミット)のひとつ前に戻る、というやつですね。

## あー、今の`add`ちょっと微妙だな。取り消そう
```
git reset HEAD
```
変更内容のリセットではなく、ステージングをしていない状態にするやつ。

## 一気に編集しすぎたな…小分けにして`add`しよう
```
git add -p
```
全て一気に`add`するのではなく、部分的に確認しながら`add`するかどうか決定できる。
`diff`時の画面が出てきて`Stage this hunk [y,n,q,a,d,/,s,e,?]?`と聞かれるので、ここで`add`するかどうかをコマンドで決定する。

- `y`: 今みている部分を`add`
- `n`: 今見ている部分はスキップ
- `q`: `git add -p`する直前に戻る
- `a`: ここから先ぜんぶ`add`
- `d`: ここから先ぜんぶスキップ
- `s`: 今見ている部分をさらに小分けにする

よく使うのはこのあたりでしょうか。

## マージめんどくさい…一旦マージ前まで戻そう
```
git merge --abort
```
`pull`とかしたは良いものの何故かコンフリクトが出てマージしろって言われた時に。

## コンフリクト？うるせえリモートが絶対的に正しいんだよ黙ってよこせ！
```
git fetch
git reset -- hard origin/master
```
手元でいろいろいじくり回した結果「いややっぱりリモートの状態に戻そう」って時、ありません？

## 貴様(ブランチ)はもう用済みだ…何、コミットしていない内容？知らんがな
```
git branch -D dev01
```
ブランチを消去したいが`git branch -d dev01`ってやると、コミットしていない内容がある時に削除できないんですよね。
強制的に消したい場合は、`-d`を大文字で。

## `git log --all` じゃ見づらいんだけど！！
```
git log --graph --all --decorate
```
`git log`だと、ブランチが増えてきた時に見づらくなるのでわりと見やすくなるオプションを追加。
`gitk -a`使えばいいじゃんってツッコミはなしの方向で。

## `git chekout master`…`git checkotu master`…タイプミスううう！！！
```
vi ~/.gitconfig

[alias]
        co = checkout
        br = branch
        graph = log --graph --all --decorate
```
`checkout`とかよくタイプミスするんですよね、長いし。
ユーザーホームにある .gitconfig を編集することで、短縮コマンドを登録することができます。
ひとつ上にある`git log --graph --all --decorate`とかものっそい長いので、こうやって登録しておくと`git graph`だけで表示できるので、とっても楽。
`gitk -a`使えばいいｊ（ｒｙ

他にも何か「こういうの便利よ！」とかありましたら是非コメントしてみてください。
Heroku にローカルの postgreSQL で dump したデータをインポートする

Heroku を使っていてローカルで開発していると、ローカルで開発しているデータを
そのまま本番に移したいときがあった。
Herokuのチュートリアルを読むと、postgres のダンプファイルをS3に移してそれを`pg_restore` を使ってコピーしろと書いてあったが、S3のアカウントをつくるのがめんどくさいので、できればS3を経由せずにローカルdumpできるか試してみると、できたのでメモ

まずはdump

```shell-session
$ pg_dump  --no-acl --no-owner -h localhost -U user mydb > mydb.dump
```

そしてローカルにできたDBをherokuコマンドを使ってそのまま流しこむ

```shell-session
$ heroku pg:psql --app my-heroku-app HEROKU_POSTGRESQL_MYCOLOR < mydb.dump 
---> Connecting to HEROKU_POSTGRESQL_AQUA_URL (DATABASE_URL)
SET
SET
SET
SET
SET
SET
CREATE EXTENSION
=====
中略
=====
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
COPY 746
 setval 
--------
      2
(1 row)

COPY 378
 setval 
--------
      1
(1 row)

COPY 731
 setval 
--------
      1
(1 row)
COPY 4718
COPY 1320
ALTER TABLE
CREATE INDEX
CREATE INDEX
=====
中略
=====
```
上記のようにテーブルがクリエイトされ、データが流し込まれていれば成功

参考(heroku公式)
[Importing and Exporting Heroku Postgres Databases with PG Backups](https://devcenter.heroku.com/articles/heroku-postgres-import-export)
RxJava/RxAndroid でバックグランドで何かして結果を受け取るコード例


```java:
rx.Observable.create(subscriber -> {
    // バックグラウンドスレッドで何か
    // ...
    subscriber.onNext("something"); // 結果を返す。結果の型は任意
    subscriber.onCompleted();
})
        .subscribeOn(Schedulers.io()) // バックグランドスレッドを指定
        .observeOn(AndroidSchedulers.mainThread()) // メインスレッドを指定
        .subscribe(res -> {
            // 結果を受け取ってメインスレッドで何か
            // ...
        });
```

> Java 8 と [Retrolambda](https://github.com/orfjackal/retrolambda) を利用しています。
naming > m_offset.offset_min > offsetがかぶる / offset_min: 最小と勘違いするかも

```txt:動作環境
C++
```

時間計測する処理にオフセットを追加した。
オフセットは、たとえば 3時間ごとに処理する場合、xx時12分に処理したいという「12分」のこととする。

```cpp
private:
	typedef struct tag_offset {
		uint8_t offset_min; // HOUR: 例 30分
		uint8_t offset_sec; // MIN:  例 45秒
	} Offset_t;
	Offset_t m_offset;
```

上記の問題は以下のように「offset」というキーワードが被ること。

```
m_offset.offset_min = 12;
```

以下のようにする例もあるが、個人的にはこれをしない。

```
m_offset.min = 12;
```

".min"では検索しにくくなりソースリーディング時に苦労しそうなため。
例として ".min"検索時に `m_intvl.min` と `m_offset.min`が検索結果に出てくると混乱する。

m_offsetの代替案は思いついていない。

---

[goのコード](https://github.com/tjrivera/go-cap/blob/f9dbcc0a22945611cf8b3fb6794cf15b51bd96be/redcap/event.go)にメンバ変数Offset_minがある。ただし、structの名前はRedcapEvent なのでかぶらない。

こちらのoffset_minは「分」ではなく、「最小」の方だった。

`offset_minute`や`offset_minutes`の方が混乱を減らせるかもしれないが、保留。

---

`m_shiftTime.offset_minute = 12;`

offset以外のシフトは何かあったか。
とっても小ネタ Elixirで、StringがKeyのMap を AtomがKeyのMap に変換してみた！

小ネタです。

[HTTPoison](https://github.com/edgurgel/httpoison)を利用している際に、encode, decodeでごにょごにょとJsonとStructを行ったり来たりしている時に、おや、となったのでメモとして残します。

## 0. 利用したリポジトリ

* https://github.com/letusfly85/github_stalking

## 1. おやっとなった事象

structから、mapにdecodeすると、keyに不要なバックスラッシュがつく。。

元のstruct

```json
Issue{is_notified: false, number: 1512, owner: nil, repo: nil, title: "wait / block plugin for others builds or jobs", updated_at: "2016-03-02T19:55:10Z"}
```

`Poison.encode!(issue)`するとこうなる

```json
"{\"updated_at\":\"2016-03-02T19:55:10Z\",\"title\":\"wait / block plugin for others builds or jobs\",\"repo\":null,\"owner\":null,\"number\":1512,\"is_notified\":false}"
```

バックスラッシュいらない。。


## 2. 対応

いったん、`Map.from_struct(issue)`して、さらに下記のような対応をしてあげた。

```ex
string_key_map = for {key, val} <- atom_key_map , into: %{}, do: {Atom.to_string(key), val}
```

め、めんどい。。。
PoisonのAPIの呼び方とか間違っているのかも。。
ここら辺の変換をうまいことやる方法をご存知の方いましたらご教示いただきたくm(_ _)m

## 3. 参考

* [stackoverflow: how to convert strings to atoms in Elixir](http://stackoverflow.com/questions/31990134/how-to-convert-map-keys-from-strings-to-atoms-in-elixir)

## 4. 所感

それにしても`Enum.reduce`ばかり使ってましたが、`comprehensions`普通に使えるんですね。。

下記とかをもう一度見直してみようと思います！

* http://elixir-lang.org/docs/stable/elixir/List.html
* http://elixir-lang.org/docs/stable/elixir/Map.html
jQueryのclass前方一致で詰まった

# おさらい

前方一致：[属性名^="値"]	属性値が指定された値で始まる要素を取得
後方一致：[属性名$="値"]	属性値が指定された値で終わる要素を取得
部分一致：[属性名*="値"]	属性値に指定された値が含まれる要素を取得
単語の完全一致：[属性名~="値"]	属性値に指定された値が1単語として含まれる要素を取得

# つまった

classのように、複数値を持つ属性の前方一致がうまくいかない。

# 結論
前方一致させたい値は先頭に配置する。

# 例

- classで"fuga_"の値で前方一致をさせたい。

```js
var fugacols= $("[class^='fuga']");
```

```html
//　×取得できない
<span class="hoge_A fuga_1">いち</pan>
<span class="hoge_A fuga_2">に</span>
<span class="piyo_A fuga_3">さん</span>
<span class="piyo_A fuga_4">よん</span>
//　→ fugacols.length:0 
```

```html
//　〇取得できる
<span class="fuga_1　hoge_A">いち</pan>
<span class="fuga_2　hoge_A">に</span>
<span class="fuga_3　piyo_A">さん</span>
<span class="fuga_4　piyo_A ">よん</span>
//　→ fugacols.length:3 
```


気が付くまで時間がかかった…常識なのかな？

ちなみに後方一致なら逆に最後に配置すると取得できます。


- classで"_A"の値で後方一致をさせたい。

```js
var lastAcols= $("[class$='_A']");
```


```html
//　×取得できない
<span class="hoge_A fuga_1">いち</pan>
<span class="hoge_A fuga_2">に</span>
<span class="piyo_A fuga_3">さん</span>
<span class="piyo_A fuga_4">よん</span>
//　→ lastAcols.length:0 
```

```html
//　〇取得できる
<span class="fuga_1　hoge_A">いち</pan>
<span class="fuga_2　hoge_A">に</span>
<span class="fuga_3　piyo_A">さん</span>
<span class="fuga_4　piyo_A ">よん</span>
//　→ lastAcols.length:3 
```

部分一致/単語の完全一致なら、配置順序関係なく取得できました。
SVGチャートをエレガントにするポイント

# SVGチャートが・・・

SVGチャート作ったけど、なんとなく洗練されていないなって思ったあなた。


## これをどうぞ

```lang:main.css
body{
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}
```
これでSVGに限らずWEB全体がエレガントになります。
[CSSのfont-smoothingでフォントをキレイに見せる](http://delaymania.com/201508/web/css-font-smoothing/)


## これもどうぞ

```lang:main.css
.axis path,
.axis line {
    shape-rendering: crispEdges;
}
```

軸線のボヤけがなくなり、シャープになります。
[shape-rendering](http://blog.goo.ne.jp/cr0810/e/929adeb99357c26fed9a8b594622cac3)

※
ポイントは直線にのみ適用する事です。
円などの曲線に対して適用すると、アンチエイリアス処理がかからなくなり見た目が劣化してしまいます。


## お好きであればこれもどうぞ
```lang:main.css
.axis path,
.axis line {
    stroke-opacity: .5;
    stroke-dasharray: 3, 3;
    stroke-width: 0.5px;
}
```
軸線の印象を下げる事でデータに意識がフォーカスされるようになり、わかりやすくなります。


# 参考になるチャート
[年収でこんなに違う　所得・消費税、あなたの負担は](http://vdata.nikkei.com/prj2/tax-annualIncome)
[原発事故 避難者の声](http://www3.nhk.or.jp/news/fukushimawordcloud/)
[ビッグデータで知る防災](http://fukko.yahoo.co.jp/bigdata/)
AWS RDS MySQL で create function できるようにする

Amazon Web Service の RDS 上でのデフォルトでは、root であっても `CREATE FUNCTION ...` すると

```
You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
```
となり、CREATE FUNCTION ができない。

エラーメッセージに書いてある通り、`log_bin_trust_function_creators` を設定する。

## 設定値の確認

```
mysql> SHOW VARIABLES LIKE 'log_bin_trust_function_creators';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | OFF   |
+---------------------------------+-------+
```

## 設定

RDSダッシュボードにログイン

https://ap-northeast-1.console.aws.amazon.com/rds/home?region=ap-northeast-1#parameter-groups:

log_bin_trust_function_creators で検索

![スクリーンショット 2016-03-04 10.02.53.png](https://qiita-image-store.s3.amazonaws.com/0/68302/4609ab82-3daa-24c5-edfe-709d5e49ad37.png)

「<エンジンのデフォルト>」となっているので、プルダウンで 「1」に変更

「変更のプレビュー」で内容を確認

![スクリーンショット 2016-03-04 9.48.07.png](https://qiita-image-store.s3.amazonaws.com/0/68302/f57351e5-a210-1c77-13c9-e28986d0c9ce.png)

問題なければ、「閉じる」→「変更の保存」

RDSのリブートは不要、即時反映される

```
mysql> SHOW VARIABLES LIKE 'log_bin_trust_function_creators';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | ON    |
+---------------------------------+-------+
```
Mac 接続するWifiスポットの優先順位を変える

なんか今日はネットが遅いな...と思ってふとチェックすると
そこじゃないよ！という想定外のスポットに接続しちゃってる場合ありませんか？
私はあります。

そんな時は接続するSSIDの優先順位を変えると幸せになれるかもしれません。


## Macで接続するSSIDの優先順位の変更方法

1. Wi-FiのNetwork設定を開く
![Screen Shot 2016-03-04 at 09.41.09.png](https://qiita-image-store.s3.amazonaws.com/0/74328/0947b7c3-02f5-c334-f771-2d2e042490a9.png)



2. Advanced...をクリックする
![Screen Shot 2016-03-04 at 09.40.43.png](https://qiita-image-store.s3.amazonaws.com/0/74328/f1a1714d-2b92-a47e-6981-9c414630e9b6.png)


3. Preferred Networksで接続したいSSIDをドラックして上に持っていく
![Screen Shot 2016-03-04 at 09.40.53.png](https://qiita-image-store.s3.amazonaws.com/0/74328/120ec95a-2ac5-6960-c3ea-b782abea6ebd.png)





以上！
一旦ここまでに登場した（僕が知っている）SwiftのWebフレームワークをまとめる

SwiftがOSS化してから一定期間たったので、ここのところボコボコとSwiftフレームワークが誕生していってて、そろそろ追いかけるのもキツくなってきたし、最初の頃に登場したのはもう忘れたしみたいになってきたお年寄りなもんで、ここらでちょっとまとめておこうと思い立ちました。
なんか忘れてるのあったら教えていただけるとありがたいです！

それでは早速。


# Perfect

https://github.com/PerfectlySoft/Perfect

たぶん最初に登場したサーバーサイドのSwiftフレームワークなんじゃなかろうか？
当初はこれがサーバーサイドSwiftの大本命だと目されていましたが、Kituraに話題を持ってかれた感ありますね、、、


# Kitura

https://github.com/IBM-Swift/Kitura

その話題を持ってった側。なんといってもIBM製という話題が大きいですね。
まだ導入手順がやや煩雑な感はありますが、フレームワーク自体はシンプルでスリムな印象。
ライブラリとか整ってくると発展しそうな気がします。
現時点ではこれが本命になってきたのかな。


# Swifton

https://github.com/necolt/Swifton

自分の記事でも書きましたが、Swift on Railsを標榜しているフレームワーク。
他のSwiftフレームワークと違って、MVCフレームワークです。
ただ、まだフルスタックして切れていない感じで（migrationなかったり、Gemfileに代替されるものもなかったり）これからって感じです。
個人的には他言語から流入しやすくなるので、フルスタックなフレームワークも一個ぐらい発展してほしいなと思ってます。


# Express

http://swiftexpress.io/

名前の通り軽量フレームワークです。
現状Linuxへの簡単なインストール手順がなく、公式上にも「OK、1〜2行でインストールできる方法を開発するよ！」って書いてあるだけ状態です。
Swiftの純粋な処理速度限界まで速度を追求したいっぽいフレームワークです。


- - -

こんな感じで、まだまだこれから色々出てきては淘汰されていくんだろうな〜という感じはしますが、一旦まとめてみました！
また増えたり変わったりしたら適宜修正加えていこうと思います！
Azure DevOps

# 概要
AzureDevOps(旧名：Visual Stuido Team Services）を導入するために必要となる資料等をまとめてみた。
記事の内容は、随時更新していきます。

# AzureDevOpsの申し込み
https://azure.microsoft.com/ja-jp/services/visual-studio-team-services/
https://www.visualstudio.com/ja-jp

# 製品概要、セキュリティ等について
##セキュリティやデータの保護について書いてあります。
https://www.visualstudio.com/articles/vso-security-whitepaper

## VSTSのSLAについて

[日本語](https://azure.microsoft.com/ja-jp/support/legal/sla/visual-studio-team-services/v1_2/)
[英語](https://azure.microsoft.com/en-us/support/legal/sla/visual-studio-team-services/v1_2/)

# Microsoft Azure のデータ セキュリティ
- データ クレンジングおよびデータの漏えい)
https://blogs.msdn.microsoft.com/windowsazurej/2014/05/14/microsoft-azure-12/
 完全に消えることはないが、不正アクセスから保護し、物理領域が再利用される場合には、物理的に上書きしているようです。
「一定の有効期限はなく、むしろ「半減期」に似ており、X 日後もディスク上に残っている確率は 50%、2X 日後は 25%、というように減っていきます。確率がゼロになることはなく、また特定のデータが削除されるという保証もありませんが、マイクロソフトは利用者のデータを不正なアクセスから保護することを約束しています。」

## 10 Things to know about Azure Security
- Azureのセキュリティについて知るための10項目
↓これにも同じことが書いている。データを上書きしてアクセスできないようにしている。
https://technet.microsoft.com/en-us/cloud/gg663906.aspx
10. Deletion of Data

## Microsoft Azure のトラスト センター
https://azure.microsoft.com/ja-jp/support/trust-center/

## Visual Studio Team Services Data Protection Overview
- （データの保護について）※英語　内容がまとまっている
https://www.visualstudio.com/articles/vso-security-whitepaper


# VSTSの使い方
## Visual Studio Azure AD連携
[Manage Team Services account access with Azure Active Directory](https://www.visualstudio.com/en-us/get-started/setup/manage-organization-access-for-your-account-vs)

## クライアントツール
Soruce Tree
[TortoiseGit](https://tortoisegit.org/) 

## 設定インストール
### クライアントの設定
1. AzureADでのアカウント作成
2. [AzureDevOpsへのログイン](https://qiita.com/gogosub77/items/a1c3092cbfa734897def)
3. クライアントツールのインストールと設定
4. 最初のcommit

## リモートのユーザーとパスワードを記憶する
「リモート」の「URL:」に以下のように入力する。


## 認証情報を平文で保存する。

git-credential-store
使い方

git-credential-storeを利用するように設定する。
git config --global credential.helper store
クローンしてみる。初回は、ユーザ名(ここではuserhoge)とパスワードを聞かれる

```
$ git clone https://example.jp/repos/git/sample.git
Cloning into 'sample'...
Username for 'https://example.jp': userhoge
Password for 'https://userhoge@example.jp': *******
```

いったんクローンしたリポジトリを削除して、再度クローンすると次は、認証情報を聞かれずにクローンできる。

cloneが終わると、$HOME/.git-credentialsというファイルが生成される。
中身はリポジトリホスト名とユーザ名・パスワードが平文で保存されている。

```
$ cat ~/.git-credentials
https://userhoge:********@example.jp
```

- エラー対応
```
github - Git, fatal: The remote end hung up unexpectedly - Stack Overflow と調べてみた。

git config http.postBuffer 524288000

http://shinriyo.hateblo.jp/entry/2015/05/07/git%E3%81%A7%E3%81%AE_fatal%3A_The_remote_end_hung_up_unexpectedly
```

# VSTS agents
http://www.slideshare.net/masakit/visual-studio-2015-team-foundation-server-2015-visual-studio-team-services

# 参考ブログ
[Visual Studio Team Servicesを構築する(1日目)](http://kkamegawa.hatenablog.jp/entry/2016/12/01/000000)
[Visual Studio Team Services ひとり Advent Calendar 2016]
(http://qiita.com/advent-calendar/2016/vsts)
## changeworld Takashi Takebayashi
http://www.slideshare.net/changeworlds/presentations
http://changesworlds.com/2016/03/33th-tfsug-done/
eclipse4.5(mars)以降でdjunitプラグインを使う方法 

あいかわらずマニアックなネタですが。

# 概要
* eclipse4.5以降では「jp.co.dgic.eclipse.jdt.djunit_3.5.x_0.8.6.zip」がそのまま使えないため、対応方法について説明します。

# 対象環境
* "Eclipse IDE for Java Developers 4.5.2" or "pleiades-e4.5-java_20160229.zip(eclise 4.5.2)* 
* jp.co.dgic.eclipse.jdt.djunit_3.5.x_0.8.6

# 簡単な原因/対応説明
* Eclipse 2.0 Styple pluginのため。
 * 「Eclipse 2.0 Style Plugin Support」プラグインを入れる。
 * Eclipse 3.0 以降の plugin styleに修正する。
* eclipse4.5.2では「org.eclipse.core.boot」プラグインが削除さているため。
 * 「plugin.xml」から「\<import plugin="org.eclipse.core.boot"/\>」を削除する。

# 詳細な対応説明
* 「Eclipse 2.0 Style Plugin Support」プラグインを入れる。
 * 「pleades 4.5 java」を使う。（一番楽）  
(配置後、eclipse -cleanを行ってください）
 * eclipse updateを使う。  
ecilpse 4.5のアップデートサイトでは手にはいらないため、  
4.4のアップデートサイトから落とす。（[luna update site](http://download.eclipse.org/eclipse/updates/4.4)）  
依存関係の兼ね合いでインストールがかなりややこしいです。
 * 直接ダウンロードする。  
[feature](http://download.eclipse.org/eclipse/updates/4.4/R-4.4.2-201502041700/features/org.eclipse.osgi.compatibility.plugins.feature_1.0.0.v20140416-1648.jar)  
[plugin](http://download.eclipse.org/eclipse/updates/4.4/R-4.4.2-201502041700/plugins/org.eclipse.osgi.compatibility.plugins_1.0.0.v20131023-1243.jar)  


* 「plugin.xml」から「\<import plugin="org.eclipse.core.boot"/\>」を削除する。
 * 「jp.co.dgic.eclipse.jdt.djunit_3.5.x_0.8.6.zip」を解凍し対象の行を削除。


# 修正済み版のダウンロードについて
* githubで公開しています。    
[plugin.xml修正済み版](https://github.com/umed0025/djunit-0.8.6)
* 試験的に 「Eclipse 2.0 Style Plugin Support」Plugin 不要版を公開しています。  
[「Eclipse 2.0 Style Plugin Support」Plugin 不要版](https://github.com/umed0025/djunit-0.8.6/tree/ec452osgi-release-20160305)
PowerShellで書いたWebサーバを他のPCからもアクセス許可する

## 参考

* [街角のリブロガー: .NETを使った簡易HTTPサーバーの実装](http://ivis-mynikki.blogspot.jp/2011/02/nethttp.html)

## 設定

* コマンドプロンプトを管理者権限で実行し以下

```bash:8080portでListenすることを許可
netsh http add urlacl url=http://*:18080/ user=everyone
```

* 追加：`netsh http add`
* 削除：`netsh http delete`
* 一覧：`netsh http show urlacl`

## Webサーバ起動

* [PowerShellでHTTPサーバー的なものを作る - Qiita](http://qiita.com/kikuchi/items/785631cb24dfe5fa8d52)

```diff:httpListener.ps1
  param($Port=18080, $HomePage='mdwiki.html', $DefaultPage=$HomePage)
- $urlRoot = "http://localhost:$Port/"
- $urlMain = $urlRoot+$HomePage
+ $urlRoot = "http://+:$Port/"
+ $urlMain = "http://localhost/"+$HomePage
  $parentPath = [IO.Path]::GetDirectoryName($MyInvocation.InvocationName)
  
  $listener = New-Object Net.HttpListener
  $listener.Prefixes.add($urlRoot)
  
  try{
-     "localhostで簡易httpサーバーを作動させます。"|oh
+     $urlRoot+"で簡易httpサーバーを作動させます。"|oh
      try {
          $listener.Start()
      } finally {
          #起動ついでにブラウザで開いてやる
          #Start()に失敗するケースでも既にHttpサーバーが動いているケースを期待してURLは開く
          "$urlMain を開きます。"|oh
          start $urlMain
      }
  
      $running = $true
      while($running){
          $context = $listener.GetContext()
          $request = $context.Request
          $response = $context.Response
  
          ($url = $request.RawUrl)|oh
          $path = $url.TrimStart('/').split("?")[0]
          if(!$path) {
              "def:"+$DefaultPage|oh
              $path = $DefaultPage
          }
  
          $fullPath = [IO.Path]::Combine($parentPath, $path)
          $content = [byte[]]@()
          if( [IO.File]::Exists($fullPath) ){
              $content = [IO.File]::ReadAllBytes($fullPath)
          } else {
              $response.StatusCode = 404
          }
  
          $response.OutputStream.Write($content, 0, $content.Length)
          $response.Close()
      }
  } finally {
      #スクリプトではあまり真面目にリソース管理しようとは思わないけれども一応
      $listener.Dispose()
  }
  '終了します。'|oh
  pause
```

```bash:起動
powershell -ExecutionPolicy RemoteSigned -File httpListener.ps1
```
Raspberry Pi3 > 32bit OS / ヒートシンク / 電源:2.5A

スイッチサイエンスさんの動画でPi3のことが出ていた。

https://www.youtube.com/watch?v=e2S_32nkonM

以下の点が気になった。

- 64bit を積んでいるが、raspbian は 32bit でいくとのこと
- CPUをがんがんまわすと85度などになり、ヒートシンクが必要とのこと
- 電源は 2.5A が必要になりそう
  - 多くのUSBケーブルは 2.0A まで

Pine64のような64bit製品に対抗するため 64bit を選んだと思ったが、OSが対応してないとは。
技術英語 > Without the darkness, how would we recognize the light? / looking on the bright side / looking on the dark side

@ Star Trek Voyager > COLD FIRE

ケスが制御しきれない自分の能力の欠点について話しているとTuvokが

> Without the darkness, how would we recognize the light?

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

> looking on the bright side

http://dictionary.goo.ne.jp/ej/595443/meaning/m0u/

その反対が

> looking on the dark side

http://cpx.sagepub.com/content/early/2014/04/10/2167702614529111

リンクのabstractはいまいち分からない。　

complete ruminative fragments の早さに変化があったというが、この用語が不明。
関心圏の内容なのでここでやめておく。
ParticleSystemをシューティングの弾に利用する

###ParticleSystemをシューティングゲーム等の弾に利用した時の方法をメモ

##ParticleSystemのCollisionモジュールを使う
###Collisionモジュールの設定
・World
・Send Collision Messagesを有効
他は適宜で設定

##当たる側の判定
Colliderを持つGameObjectのスクリプトに下記のメソッドを追加する
####OnParticleCollision(GameObject Obj)
引数にはParticleSystemがあるGameObjectが入ってくる
データバインディングを使ってUIとUIを結びつける

UIの要素を指定するとき、数値や文字列ではなく`x:Bind`[^1]や`Binding`を指定すると、
そのUIの要素の値をコードの変数や他のUIと結び付けられるようだ。

`x:Name`要素でUIに固有の名前を付けることで`x:Bind`ができるようになる。

```xml:MainPage.xaml
<Page
    ...
    <StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Slider x:Name="SliderA" Value="{x:Bind SliderB.Value, Mode=OneWay}" />
        <Slider x:Name="SliderB" Value="{x:Bind SliderA.Value, Mode=OneWay}" />
    </StackPanel>
</Page>
```

![dataBindSlider.gif](https://qiita-image-store.s3.amazonaws.com/0/115898/5c5d6845-2836-b788-9f76-a749ef10407e.gif)

スライダーを動かすともう片方も動く。どちらでも動く。

---
また

```xml:MainPage.xaml
<Page
    ...
    <StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Slider x:Name="SliderA" Value="{x:Bind SliderB.Value, Mode=TwoWay}" />
        <Slider x:Name="SliderB" />
    </StackPanel>
</Page>
```

としても同様の結果になる。
`Mode`プロパティは`OneTime`, `OneWay`, `TwoWay`と三つある。
長くなるのでこのくらいで。

---

参考:**Windowsフォーム開発者のためのWindows 10 UWPアプリ開発入門（後編） (1/5)**
http://www.atmarkit.co.jp/ait/articles/1510/06/news017.html
**データ バインディングの概要**
https://msdn.microsoft.com/ja-jp/library/windows/apps/xaml/mt269383.aspx


[^1]: x:BindはWindows10上でしか**使えない**らしい。その代わりパフォーマンスがいいんだとか。逆にBindingはWindows8, 8.1でも使える代わりにパフォーマンスに劣るのだとか。
【bat】外部ファイルの変数と値を読み込んで使用する


備忘録。
バッチファイル書いてるとき、よく外部ファイルから設定を読み込みたくなる瞬間があると思うんですけども。
そういう時にやる方法。

```setting.ini
; IP Address
IPAddress=192.168.11.1
; My Name
Name=mikaze
; Text Path
TextPath=C:\Users\mikaze\Desktop\text.txt
```

```bat:main.bat
@echo off
title Main
setlocal enabledelayedexpansion

for /f "tokens=1,* delims==" %%a in (setting.ini) do (
    set %%a=%%b
)

rem 処理
```

こうしておくと、*setting.ini*の`=`の左側を変数名、右側を値として扱うことが出来ます。
便利。
grep系ツール6種のベンチマークテスト

# はじめに
先日、[自作の検索・置換ツール](http://qiita.com/dalance/items/228b954f8f8021518ef5)を作った際に`grep`や他の検索ツールとのベンチマークをいろいろ取ってみたので結果を公開します。
当然ですが、検索文字列や検索対象、実行環境によって結果は異なりますので参考程度にどうぞ。
（ちなみに[`ack`](http://beyondgrep.com/)も取ったのですが全ケースで他より50倍～100倍程度遅い結果になったので比較からは外しました。`ack`は超多機能という感じなので`grep`代替というより違うジャンルのツールと思ったほうがいいかもしれません）

# 前提

## 実行環境

- CPU: Xeon E5-2690 @ 2.90GHz × 2
- MEM: 256GB
- OS: CentOS 7.2

## ツールのバージョン・オプション

基本的に各ツールともデフォルト設定重視で表示結果を揃える程度の調整です。
また、`hw`についてはXFSファイルシステム上で検索出来ない不具合があったため手元で暫定的に修正したバージョン（[こちら](https://github.com/dalance/highway)）を使っています。そのため本来の速度が出ていない可能性がありますので、ご注意ください。

|tool|version|option|
|----|-------|------|
|[`grep`](https://www.gnu.org/software/grep/)|2.20|`--binary-files=without-match --color=auto -r`|
|[`ag`](http://geoff.greer.fm/ag/)|0.30.0|`--nogroup`|
|[`pt`](https://github.com/monochromegane/the_platinum_searcher)|2.1.0|`--nogroup`|
|[`hw`](https://github.com/tkengo/highway)|1.1.0|`--no-group`|
|[`sift`](https://sift-tool.org/)|0.7.1||
|[`ambs`](https://github.com/dalance/amber)|0.2.1||

## 測定方法

時間測定には`/usr/bin/time`を使い、10回測定した平均を取っています。検索結果は`/dev/null`に捨てたりせず、実際に表示させています。また、ディスクI/Oに影響されないよう検索対象はディスクキャッシュに乗った状態で測定しています。

# 結果

## Linuxカーネルソース
[linux](https://github.com/torvalds/linux)をクローン直後（ファイル総数約5万、2.2GB）のディレクトリ検索です。検索結果の多いキーワード（`EXPORT_SYMBOL_GPL`）と少ないキーワード（`irq_bypass_register_producer`）の2通りの結果になります。

![image](https://qiita-image-store.s3.amazonaws.com/0/84296/641baee7-63cd-1ee0-1ee8-bd022310287c.png)

## Linuxカーネルソース（ビルド済み）
↑と同じですが、カーネルビルドを行いバイナリが生成された状態（ファイル総数約9万、9.3GB）での検索結果です。生成されたバイナリは`.gitignore`で無視されるので、そのあたりを考慮したツールが有利になる条件です。

![image](https://qiita-image-store.s3.amazonaws.com/0/84296/46bff821-ca97-aa6c-c0d3-de8d6b7ed46d.png)

## Wikipedia XML
[日本語WikipediaのXML](https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2)（ファイル数1、8.5GB）からの検索です。こちらも検索結果の多いキーワード（`検索結果`）と少ないキーワード（`Quick Search`）の2通り行っています。

![image](https://qiita-image-store.s3.amazonaws.com/0/84296/3f4760ba-a1c6-9f42-9e1e-e95c933f6f88.png)

# まとめ（感想）
特に結論めいたものはありませんので、特に気になったツールについてざっくりとコメントを。

## `grep`
シングルスレッドとは思えない速さです。32スレッドのマシンなので他のマルチスレッド系ツールが圧倒するかと思っていましたが、そうでもないようです。この結果だけを見るなら`grep`で十分かなぁという気もします。もちろん`.gitignore`無視とか日本語周りとか機能面で新しいツールを使う動機はあるのですが。

## `pt`
CPUの使用率がすごいです（32スレッド中22スレッド程度使い切っていました）。さすがGoroutineという感じで速いのですが、個人的には検索結果の表示順序が一定しないのは少し使いづらいかなぁと感じてしまいます。

## `hw`
結構安定して速いしEUC-JP/Shift-JIS検索も対応ということで良い感じなのですが、若干不安定です。ベンチマークのためにいろいろ試しているとSEGVで落ちたり`.gitignore`周りで無限再帰に陥ったりしました。いろいろパターンは発見したので、時間ができたらIssue/PRなど投げてみたいと思います。

## `ambs`
（自分でそう作ったから、という話ではありますが）巨大ファイル検索は速いです。ファイル数が多い場合の検索は当初今の10倍くらいは遅かったのですが、ベンチマーク取っているうちに最適化したくなってしまい、1か月くらい試行錯誤しました。最終的にはだいたいのパターンで他のツールと同等の速度が出るようになったと思います。
JustinmindのDataListで実際にデータが増える動きを表現するモックアップを作成する

## <i class="fa fa-cubes" style="font-size:1em;"></i> 設定手順
### <i class="fa fa-list" style="font-size:1em;"></i> 一覧画面
DataListを配置します。  
DataMasterは以下の様な内容で登録します。

|column|type|
|:--|:--|
|name|text|
|age|text|

![data_master.png](https://qiita-image-store.s3.amazonaws.com/0/43480/f3391f3d-d037-0d13-5d94-df0f92ecdc03.png)

サンプルデータも登録しておきます

![users_samples.jpg](https://qiita-image-store.s3.amazonaws.com/0/43480/d649ec0a-497c-77f5-1675-8b67eee96463.jpeg)

一覧画面ができました

![list.jpg](https://qiita-image-store.s3.amazonaws.com/0/43480/be48456a-7641-493d-c048-b6d878e4102b.jpeg)

### <i class="fa fa-plus-circle" style="font-size:1em;"></i> 登録画面
name, age を入力して登録ボタンを押す画面をつくります。  
+ボタンのAdd Eventで、データの追加処理を設定します。

![create.jpg](https://qiita-image-store.s3.amazonaws.com/0/43480/1fea11bf-183e-78ec-346d-f7e22c9eb4ae.jpeg)

クリック時にデータリストに新規レコードを追加することを設定します。

![create1.jpg](https://qiita-image-store.s3.amazonaws.com/0/43480/143fb529-7554-a84b-4bf5-1c664dc7c359.jpeg)

登録画面の各項目をusersのカラムへ割り当てます

![create2.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/fd2c4c77-384a-2e76-e33b-de6db6801acb.gif)

### <i class="fa fa-play" style="font-size:1em;"></i> デモ
1. データ登録
2. 一覧ページで追加されたデータを確認

を試します。

![create_list.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/e21c2f7d-1149-b4cd-dde1-3a1f53281a0b.gif)

## <i class="fa fa-cube" style="font-size:1em;"></i> 資料
[Add records to a Data List using input forms](http://www.justinmind.com/support/create-forms/)
JavaScriptのチョット便利な代入方法


いきなりコードを。

```javascript:tips
var hoge = hage || mage;
```

これは下記のコードと等価です。


```javascript:normal
var hoge = '';
if (hage) {
  hoge = hage;
} else {
  hoge = mage;
}
```

こんな事はしなくて下記のように書くか三項演算子を使って書くと思いますが、わかりやすさのために上記のように書きました。

```javascript:normal
var hoge = mage;
if (hage) {
  hoge = hage;
}
```

これは「||（OR演算子）」の、左辺が評価されてtrue（とみなせる）の場合は左辺、それ以外は右辺の値を返すという仕様を利用しています。

hageがundefinedや空文字、null、etc.といったfalseとみなせる値の時に、mageを代入するという時によく使うと思います。
mageが定数だったり、mageの代わりにリテラルを指定してデフォルト値のように指定するような場面でも便利です。

```javascript:tips
var hoge = hage || "not hage";
```


これは、書籍「[JavaScript: The Good Parts](https://www.oreilly.co.jp/books/9784873113913/)」で初めて知って時々使っていますが、なぜかよく忘れるのでメモ。
（多分、知識のある人が少ないプロジェクトが多いからです）

「JavaScript: The Good Parts」は、個人的には少し変わった本だと思っていて、初級者にはオススメしませんが、自称中級者の人に特にオススメします。中級者もしくは上級者になって、コードが飛躍的にJavaScriptらしくなると思います。
継承とスコープ定義演算子の影響について

```php:php

<?php

class First
{
  const test = 'first';
  protected static $_test = 'first';

  public static function getConst()
  {
    return static::test;
  }

  public static function getVar()
  {
    return static::$_test;
  }
}

class Second extends First
{
  const test = 'second';
  protected static $_test = 'second';
}

class Third extends Second
{
}

var_dump(First::getConst());
var_dump(Second::getConst());
var_dump(Third::getConst());

var_dump(First::getVar());
var_dump(Second::getVar());
var_dump(Third::getVar());

```

```php:実行結果

string(5) "first"
string(6) "second"
string(6) "second"
string(5) "first"
string(6) "second"
string(6) "second"

```

`Third`がどういう出力になるのかが分からなかったので備忘録
ハンバーガーボタンを作る

`Segoe MDL2 Assets`フォント文字コード`U+E700`が例のハンバーガーになる。
下のようにしてあげると使える。

```xml:MainPage.xaml
...
<ToggleButton VerticalAlignment="Top">
    <ToggleButton.Content>
        <FontIcon FontFamily="Segoe MDL2 Assets" Glyph="&#xE700;" />
    </ToggleButton.Content>
</ToggleButton>
...
```
もちろんトグルボタン以外でも使用可能
↓が実行例
![Humberger.gif](https://qiita-image-store.s3.amazonaws.com/0/115898/b139280e-b6d5-4c15-02d1-762dd8fcc916.gif)

---
一部のアイコンは`Symbol`要素で簡単に指定できる。

```xml:
<Button VerticalAlignment="Top">
    <SymbolIcon Symbol="Save" />
</Button>
```

![save.gif](https://qiita-image-store.s3.amazonaws.com/0/115898/806b57f1-9465-824d-e8f4-847e5e41a91a.gif)

このページは要ブクマ。
**Segoe MDL2 アイコンのガイドライン**
https://msdn.microsoft.com/ja-jp/library/windows/apps/jj841126.aspx

---

参考：**ハンバーガーボタンを実装するには？［Windows 10 UWPアプリ開発］**
http://www.atmarkit.co.jp/ait/articles/1508/19/news023.html
AppDelegateはダイエットしましょう

自分が他人のソースを解析した時に
たまに画面を叩き割りたくなるパターンのひとつが

**「AppDelegateがでかすぎる」**

です

`AppDelegate`は、Xcodeで新規でプロジェクトを立ち上げると、既に作られているものですから
どんなプロジェクトにも必ずと言っていいほどあるクラスです

責務はその名のとおり、アプリケーション全体の主たるイベントをハンドルして
その委譲を受け付けるクラスです


しかしながら、

これが数千行にわたって実装が書かれていることがあります
そんなプロジェクトを何度も見てきました
おそらくアプリ共通の処理はすべて載せとけーてな感じでそんなことになるのでしょう

(-_-) ooO (正直言うと開発初心者の頃の自分もそんな感じだったかも・・・)



これを「Fat AppDelegate」アンチパターンと名づけておきます
許しがたきアンチパターンといえます
もし自分の作ってるアプリがそんなことになっていれば猛省しましょう


では、こんな「太ったAppDelegate」をどうやってダイエットさせましょう?

たとえば

```swift
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        
        // 起動時何かさせたーい
        
        // プッシュ通知から呼ばれたら何かしたーい
        
        // データを初期化したーい
        
        // 初回起動かどうかを判定して、何かしたーい
        
        // データベースを初期化したーい
        
        // ベンチマーク取りたーい
        
        // 最初の画面のUIを切り替えたーい

        // 他にも何かしたーい

        // エトセトラ・・・エトセトラ・・・
        
        return true
    }
}
```

`didFinishLaunchingWithOptions`のメソッドは大混雑です
下手すりゃ、ここにそのすべてを書いてる人もいます

しかしこれでは、メソッドの責務が巨大すぎます
起動時になにかやりたいのはやまやまですが
上記にコメントしたすべてを根こそぎ別々のクラスでやりましょう


AppDelegateの役割は
「アプリのイベントを受け取ること」と
「そのイベントを受けて各クラスに連絡すること」だけに注力させる

そんな設計にすることで
このクラス自体はだいぶすっきりします

「いろいろな処理をやらないといかんのです」という要件であっても
`NSNotification`の仕組みを使うなどの工夫で
少なくとも100行を超えたファイルにはならないはずです

軽く100行越えてたら、
ダイエットの余地ありです
10人の点数と偏差値を良い順に表示し、平均点で区切り線

10人の点数を入力すると、
点数が良い順に並べかえ、素点と偏差値を表示する。
また平均点で区切り線を入れる。

>
1人目の点数は？10
2人目の点数は？100
3人目の点数は？20
4人目の点数は？90
5人目の点数は？30
6人目の点数は？80
7人目の点数は？40
8人目の点数は？70
9人目の点数は？50
10人目の点数は？60
素点100点  偏差値65.66698903601281
素点90点  偏差値62.18543591689885
素点80点  偏差値58.70388279778489
素点70点  偏差値55.22232967867093
素点60点  偏差値51.74077655955698
--------平均点55.0---------
素点50点  偏差値48.25922344044302
素点40点  偏差値44.77767032132907
素点30点  偏差値41.29611720221511
素点20点  偏差値37.81456408310115
素点10点  偏差値34.33301096398719

```java:Sortscore.java
import java.util.Scanner;
class Sortscore {
	public static void main(String[] args){
		Scanner scan = new Scanner(System.in);
		int i,n[]=new int[10];

		for(i=0;i<n.length;i++){
			System.out.print(i+1 +"人目の点数は？");
			n[i]= scan.nextInt();
		}

		int j,k;

		for(i=0;i<n.length-1;i++){
			j=n.length-2-i;
			
			for(k=0;k<j+1;k++){
				if(n[k] >= n[k+1]){
				}else{
				int l=0;
				l = n[k];
				n[k] = n[k+1];
				n[k+1] = l;
				}
			}
		} 
		
		double average = Ave(n);
		double bunsan = Bunsan(n);
		double hensachi = 0;

		for(i=0;i<n.length;i++){
			if(bunsan == 0){
				hensachi = 50.0;
			}else{ 
				hensachi = (double)(n[i] - average)/Math.sqrt(bunsan) * 10 + 50; 
			}

			if(n[i] >= average){
				System.out.println("素点"+ n[i] + "点  偏差値" + hensachi);				
			}
		}

		System.out.println("--------平均点" + average + "---------");

		for(i=0;i<n.length;i++){
			if(bunsan == 0){
				hensachi = 50.0;
			}else{ 
				hensachi = (double)(n[i] - average)/Math.sqrt(bunsan) * 10 + 50; 
			}

			if(n[i] < average){
				System.out.println("素点"+ n[i] + "点  偏差値" + hensachi);				
			}
		}
	}
	
	private static double Ave(int[] n){
		int total=0,i;
		for(i=0;i<n.length;i++){
			total = total + n[i];
		}
		return (double)total/n.length;
	}

	private static double Bunsan(int[] n){
		int j=0,i;
		for(i=0;i<n.length;i++){
			j = j + (int)Math.pow(n[i],2);
		}
		return (double)j/n.length - Math.pow(Ave(n),2);
	}
}
```
とりあえずどうにかできるようにした。
並べ替えはバブルソートです。

平均点での区切り線。とても冗長な内容を記述してしまっていると思います。
手直し予定。
CSSのbackground-imageで指定した画像をプリロードする方法

例えばこんなCSSがあって

```css
.kawaiiButton{
	background-image: url("/path/to/cho-kawaii.png");
}
.kawaiiButton:hover{
	background-image: url("/path/to/cho-kawaii_on.png");
}
.kawaiiButton.current{
	background-image: url("/path/to/cho-kawaii_cr.png");
}
.kawaiiButton.current:hover{
	background-image: url("/path/to/cho-kawaii_cr_on.png");
}
```

このままフツーに作ると、マウスオーバーやcurrentに切り替えたタイミングでロードが走るのでボタンがチラつきますよね。
CSSスプライトすりゃいいんですけど、結構手間だったりする。

背景画像じゃなくてimg要素だったらプリロードするスクリプトはゴマンと転がってますけど、CSSの場合は手段が見当たらなかったので適当に作ってみた。

```js
function getBackgroundImageByCSS(fileRegExp, selectorRegExp) {
	var results = [];
	var sheets = document.styleSheets;
	for(var i = 0; i < sheets.length; i++) {
		if(String(sheets[i].href).match(fileRegExp)){
			var rules = sheets[i].cssRules;
			for(var j = 0; j < rules.length; j++) {
				var url = rules[j].style['background-image'].match(/^url\("(.+?)"\)$/);
				if(rules[j].selectorText.match(selectorRegExp) && url) {
					results.push(url[1])
				}
			}
		}
	}
	return results;
}
```

CSSファイルのスタイル指定を精査して、特定のセレクタのbackground-imageで指定しているurlの中身（画像パス）を取ってきます。

引数`fileRegExp`はCSSファイルパスをフィルタリングするためのRegExp
引数`selectorRegExp`は目的のセレクタのRegExp

使い方はこちら。

```js
var hoverImages = getBackgroundImageByCSS(/main.css/, /:hover|\.current/);
for(var i = 0; i < hoverImages.length; i++){
	var img = new Image();
	img.src = hoverImages[i];
}
```

`DOMContentLoaded`かなんかで実行すれば動くんじゃないかと思います
文字列中の変数展開（およびヒア・ドキュメント）

こんにちは。
プログラミング言語の文字列中の変数展開とヒア・ドキュメントを調べました。Wikipedia に少しまとまっていました。

  - [文字列中の変数展開](https://en.wikipedia.org/wiki/String_interpolation) (string interpolation, string template)
  - [ヒア・ドキュメント](https://en.wikipedia.org/wiki/Here_document) (here document, multiline string literals)

また各言語の導入状況を調べてみました。両方とも可能なものも多いようです。

- JavaScript ES6 の例

```js
var x = 222;
var mstr = `
111
${x}
`;
```

- シェルスクリプトの例（```<<```で標準入力を作れる）

```bash
LINEBREAK="\\r\\n"
cat << EOS
LINEBREAK='$LINEBREAK'
EOS
```

- Ruby の例

```ruby
lang = 'language'
RUBY = 'Ruby'
json = <<EOS
{
  "#{lang}": "#{RUBY}"
}
EOS
```

- Python は、format() を介して変数展開とほぼ同等なことができるようです。
 * ヒア・ドキュメントは docstring にも使われています。

```python
dict={"x":222}
mstr ="""\
111
{x}\
""".format(**dict)
```

 * python 3.6 では "literal string interpolation (f-strings)" が導入されました[^1]
 
[^1]: 「[Python3.6 から追加された文法機能](http://qiita.com/shirakiya/items/2767b30fd4f9c05d930b)」

```python
value = 7
print(f"The value is {value}.")
```

- Kotlin

```kotlin
val text = """
x is ${x}
user name is ${user.name}
"""
```

- Scala

```Scala
val text = s"""
x is ${x}
user name is ${user.name}
"""
```

- Swift は変数展開に加えて v.4.0 でヒアドキュメントが導入されました

```swift
let text = """
x is \(x)
user name is \(user.name)
"""
```

- C はヒアドキュメント相当を持っています

```C
const char *str = "a"
                  " b";
```

- Javaは、ヒア・ドキュメントも変数展開も持っていないようですね。
 - "[Multiline](https://github.com/benelog/multiline)" (GitHub) というものもあるようですが、クラスに記述する必要があり、local変数にはダメです
（下記）。

```java
/**
DELETE
FROM post
*/
@Multiline static String deleteFromPost;
```

- PowerShell では、

```ps1
$x = "222"
$mstr = @"
111
$($x)
"@
```
もしXXだったら~~する (if文，bool値)

# if文
例: もしaの値が0よりも大きければ，コンソールに*Hello!*と表示する.


```csharp:ex1
int a = 1;  //aは1
void Start(){
    if( a > 0 ){  //a>0の条件を満たしている．
        Debug.Log("Hello!");
    }
}
```
ex1のスクリプトを実行すると，コンソールに *Hello!* と表示されます．
しかし，

```csharp:ex2
int a = -1;  //aは-1
void Start(){
    if( a > 0 ){  //a>0の条件を満たしていない．
        Debug.Log("Hello!");
    }
}
```
ex2ではコンソールには何も表示されません．

if文では，このように「*ある条件を満たした時に処理を行う*」ことができます．
if文は次のような書き方で書きます．

```csharp
if(/*条件*/){
     //条件を満たしていたら行いたい処理
}
```

ex1では条件がa>0であり，aの値が1だったため条件を満たしているといえます．
そのため，Debug.Log("Hello")の処理が実行され，コンソールに*Hello*と表示されます．

# いろいろな条件の例
Spaceキーを押したとき

```csharp
if(Input.GetKeyDown(KeyCode.Space))
```

aがbと等しいとき

```csharp
if(a==b)
```

aが0以上のとき

```csharp
if(a>=0)
```

aが0以上かつ3未満のとき

```csharp
if(a>=0 && a<3)
```

aが1または3のとき

```csharp
if(a==1 || a==3)
```

オブジェクトのy座標が0より大きいとき

```csharp
if(this.transform.position.y > 0)
```
#tryswiftconf で出てきたポケモンの例題をRustでやってみる

[型消去の話で出てきたポケモンの例題を理解する #tryswiftconf](http://qiita.com/S_Shimotori/items/458a50d8f8e54e39de59)で出てきた例をRustに移植してみます。

- [Gistでコードを見る](https://gist.github.com/mandel59/e4b6a4200ec8c8920fc0)
- [Rust Playgroundで実行する](https://play.rust-lang.org/?gist=e4b6a4200ec8c8920fc0&version=nightly)

# `trait Pokemon`

Swiftの`protocol`に相当するものとして、Rustには`trait`があります。

```rust
trait Pokemon {
    type PokemonType;
    fn attack(&mut self, move_: Self::PokemonType);
}
```

関連型 (Associated Types) が使える点を含めて、Swiftの例とほとんど一緒ですね! ですが、以下の相違点があります。

- `protocol`→`trait`
- `typealias`→`type`
- `func`→`fn`
- `Void`→`()` ですが、関数の返り値の型では省略できます。
- Rustでは行末にセミコロンが要ります。
- Rustではレシーバー`&mut self`を明示的に書きます。
- Rustでは`move`が予約語なので、代わりに`move_`としています。
- Rustでは`PokemonType`の名前空間を指定するためにキーワード`Self`が要ります。

# `struct Pikachu`

重要な点として、Rustにはクラスが存在せず、データ定義とメソッド実装は必ず別に書かれます。

```rust
struct Thunder;

struct Pikachu;

impl Pokemon for Pikachu {
    type PokemonType = Thunder;
    fn attack(&mut self, _move_: Thunder) {
        println!("Pikachu attacks ⚡️")
    }
}
```

`struct Thunder;`のように書くと、フィールドを持たない構造体が定義できます。このような構造体を_unit-like structs_と呼びます。（unitは`()`の呼び名です。）

`impl Pokemon for Pikachu`の部分で、`Pokemon`トレイトを`Pikachu`型に実装しています。この`Pikachu`型の実装を使うには、次のように書けばいいです。

```rust
let mut pikachu = Pikachu;
pikachu.attack(Thunder);
```

同様に`Raichu`も定義してしまいます。

```rust
struct Raichu;

impl Pokemon for Raichu {
    type PokemonType = Thunder;
    fn attack(&mut self, _move_: Thunder) {
        println!("Raichu attacks ⚡️")
    }
}
```

`Pikachu`と`Raichu`はそれぞれ別の型のデータですが、同じ型のデータとして取り扱うことはできるのでしょうか?

# `&mut Pokemon<PokemonType=Thunder>`

Swiftでは`class AnyPokemon<PokemonType>: Pokemon`を定義することで問題を解決していましたが、Rustではその必要がありません。関連型がある場合にも[trait object](http://qiita.com/mandel59/items/e9a5438f4c1d70cffb7a#%E3%83%88%E3%83%AC%E3%82%A4%E3%83%88%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88)が使えます。ただし、関連型がある場合のtrait objectの型は`&mut Pokemon<PokemonType=Thunder>`のような記法で、関連型を具体的に指定します。

```rust
let electric_pokemon: Vec<&mut Pokemon<PokemonType=Thunder>>
            = vec![&mut pikachu, &mut raichu];
for mut pokemon in electric_pokemon {
    pokemon.attack(Thunder);
}
```
dockerをWebで管理できるshipyardが想像以上に便利だった件

## 2018/07/06追記

便利だったんですが、どうやら開発を[断念された](https://github.com/shipyard/shipyard)ようです…
代替サービスとして[portainer](https://hub.docker.com/r/portainer/portainer/)があるとのこと。
使用してみた感じほぼ同等に使えるのそのうち記事書くかも

(以下、古い情報です）


## shipyardとは

[shipyard · shipyard](http://shipyard-project.com/)

- dockerのcontainer、images等をWebで管理できちゃう
- ログインアカウントを作れる（読み取りのみ権限とかもOK）
- Registriesにも対応しているがまだv1のみの対応（プルリク来てたのでそのうち更新されるかも？）


## 検証環境（ホスト側）
- CentOS 7.2.1511
- docker 1.10.2


## インストール

```
curl -s https://shipyard-project.com/deploy | bash -s
```
shipyardのdockerコンテナができあがる
（[こまかいオプションつけたい方用](http://shipyard-project.com/docs/deploy/automated/)）

```
http://{ホストOSのIPアドレス}:8080/
```
にアクセス

## すばらしいところ

直感的なボタン
![image](https://qiita-image-store.s3.amazonaws.com/0/109466/9ec2c23a-6c41-1181-0d43-2cea08785ee7.png)

Web上でConsole
![image](https://qiita-image-store.s3.amazonaws.com/0/109466/d13dbb51-49d5-8cea-33d9-22feb8766927.png)

imageの管理も
![image](https://qiita-image-store.s3.amazonaws.com/0/109466/c977fd31-6096-7846-be57-fab4c3b4f507.png)

リソースもみれちゃう
![image](https://qiita-image-store.s3.amazonaws.com/0/109466/0f036e82-b195-d045-7f25-7334a9d61341.png)


## おしいところ

- Docker registry v1のみ対応
- Pull Request来てたのでそのうち対応されそう？
[Registry v2 by computerlyrik · Pull Request #716 · shipyard/shipyard](https://github.com/shipyard/shipyard/pull/716)


## まとめ

- WebでGUI操作ができるので、docker初心者にも上級者にも使いやすそう
- registry v2に対応したらいいな
ELB x EC2のステージング環境でのApacheでBasic認証をかける場合

基礎的なことですが、ハマってしまったので振り返りメモとして残します

## 環境
ELB
EC2
Apache 2.4

## 用途
CakePHPのステージング環境

## その他
ELBのヘルスチェックは`/favicon.ico`

## やりたかったこと
Basic認証をかける
`app/webroot`配下の.htaccessには追記したくない
=> ansibleで構成管理してるのでステージング環境だけconf.d配下にbasic認証用の設定をfileモジュールで追加したい

## ハマったこと
ELBのヘルスチェックもbasic認証にひっかかる
それに気づかず設定に苦戦する
（´-`）.｡oO（よく見たらaccess_logにHTTP 401が沢山吐かれてた・・）

# 最終的な設定
EBLのヘルスチェック回避する為に`Satisfy Any`を利用するようconf.d配下に以下の設定ファイルを追加

```:/etc/httpd/conf.d/auth_basic.conf
<Directory /var/www/hoge/current/app/webroot>
    Satisfy Any

    AuthType Basic
    AuthName "Basic Auth"
    AuthUserFile /etc/httpd/.htpasswd
    Require valid-user

    SetEnvIf Request_URI "/favicon.ico" healthcheck
    Order Deny,Allow
    Deny from all
    Allow from env=healthcheck
</Directory>
```

htpasswd作成

```
sudo htpasswd -c /etc/httpd/.htpasswd username
```

Apacheの再起動

```
sudo service httpd restart
```

# 所感
ちゃんとSSL証明書をELBに入れて本番環境とほぼ一緒の構成にしてたので、普段のようにステージング環境にさくっとBasic認証かけてーというところでハマりましたが、振り返るとそりゃそうだよね・・
（´-`）.｡oO（Nginx x PHP-FPMに載せ換えたいなぁ・・）
RailsでMySQL serverでsocketのerrorが出た時


僕の場合は、Mac上のdevelopment環境で、複数DB serverを立ち上げて、Railsから複数DBに接続しようとした場合に発生したのですが、
 Railsでdatabaseとのconnecing時に、
`Can't connect to local MySQL server through socket`
のようなsocket fileに関連するErrorが発生しました。

例えば`Can't connect to local MySQL server through socket '/tmp/mysql.sock1'`というErrorが発生したとき，Railsは`/tmp/mysql.sock1`に接続しにいこうとしたけど，接続できなかったということです。

`my.cnf`で指定したsocket fileをrailsで指定してるのになと思ってたのですが、Error messageから推察するに、mysqlのsocketがRailsで指定した`/tmp/mysql.sock1`ではない可能性が高いです。

なので、`mysql`のsocketがまずどこにあるか調べてみます。

```
sudo mysqladmin -p version
```
と打つと、mysql serverに関する情報が表示されます。


```
mysqladmin  Ver 8.42 Distrib 5.6.26, for osx10.10 on x86_64
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Server version		5.6.26
Protocol version	10
Connection		Localhost via UNIX socket
UNIX socket		/tmp/mysql.sock
Uptime:			12 hours 7 min 9 sec
```

`UNIX socket`の部分を見ると、mysql serverのsocket fileがpathがわかります。

なので、`database.yml`の中身を
`socket: /tmp/mysql.sock`と指定し直してあげると
workします。
windowsでpython環境構築

# WindowsでLinuxやMac環境のようにpythonを使うための手順

### 参考
http://rinor.hatenablog.com/entry/2015/07/11/105210

## コマンドプロンプトからの脱却
### cmder インストール
- http://cmder.net/ でDownload Fullからダウンロード
- これでgitとかsshとかcdとかlsとか．．．使えるようになる

### chocolatey インストール
- cmderで以下実行

```
@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin
```
- これでchoco install ~ で色々インストールできるようになる
- 注： 一旦，cmderを閉じてから使う必要があります

## python周りのインストール

### python インストール
- choco install python -version 2.7.2
- 今回は2.7.2をインストールしました

### pip インストール
- choco install pip
- 何度か失敗しましたがcmderを閉じてもう一度ってしてたらインストール完了
- おそらく関連パッケージをインストールしてるが，それを有効化するために一旦閉じる必要があるため

### 各種pythonライブラリインストール
- pip install numpy
- これでOK
- 失敗する場合は，VC++のコンパイラ関連の可能性あり
- その場合はhttps://www.microsoft.com/en-us/download/confirmation.aspx?id=44266からダウンロードすれば解決する