OmniAICreator/Qiita-1.07M huggingface dataset:
grep > 空行を取り除く > $ cat prediction_170314.csv  | tr ' ' '\n' | grep . | head > 少数値の時は有効か

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```

以下のような空行が含まれる結果から空行を取り除きたい。

```
$ cat prediction_170314.csv  | tr ' ' '\n' | head
0.52391756

0.10045595

0.68625003

0.92003363

0.60088956

```

思いついたのはgrep -vで空行を取り除くこと。

参考 http://stackoverflow.com/questions/3432555/remove-blank-lines-with-grep


```
$ cat prediction_170314.csv  | tr ' ' '\n' | grep -v -e '^$' | head0.52391756
0.10045595
0.68625003
0.92003363
0.60088956
0.9091081
0.3518199
0.85221744
0.80612224
0.73894775
```

もっと簡単な方法が上記のリンクで紹介されていた。

```
$ cat prediction_170314.csv  | tr ' ' '\n' | grep . | head
0.52391756
0.10045595
0.68625003
0.92003363
0.60088956
0.9091081
0.3518199
0.85221744
0.80612224
0.73894775
```
ルーティングライブラリについて

## Reactでルーティングライブラリって何使えばいいのか？

- 今のプロジェクトでPage.jsを使っている。
- みんなReact Router使ってるので比べた。
- ブラウザのみ、SSRなし。

---

## Page.jsについて
- https://github.com/visionmedia/page.js/
- シンプルなルーティングライブラリ。

```javascript
import page from 'page';

page("/users/", () => {
  console.log("Userページです");
  store.dispatch(/* storeをupdateするAction */);
});

page();
```

---

## React Routerについて
- https://github.com/ReactTraining/react-router
- React専用に作られたルーティングライブラリ。
- ルーターをコンポーネントとして扱ってる。

```javascript
import {
  BrowserRouter as Router,
  Route
} from 'react-router-dom';

export function StartRouters() {
  return (
    <Router>
      <div>
        <Navigation />
        <Route exact path="/" component={Home} />
        <Route exact path="/users" component={Users} />
      </div>
    </Router>
  );
}
```

---

## 実装したコード
- https://github.com/hrnkoji/router-example
- [Rakuten React kit](https://github.com/rakuten-frontend/rakuten-react-kit)を使ってます。

---

## まとめ
- 今のところPage.jsでいいと思った。
    - Page.jsじゃなくて他のルーティングライブラリでもよい。
    - 他のライブラリも調べる。

- React RouterもRouterをコンポーネントにするのは見やすかった。
    - ただコンポーネントに渡す前のデータをいじりたいとか思うと大変そう。
    - React Routerの使い方をもっと調べる。

- [window.history](https://developer.mozilla.org/ja/docs/Web/API/Window/history)または[ReactTraining/history](https://github.com/ReactTraining/history)使って自分で作るのも面白そう。
    - [ReduxとReact Routerの相性が悪いのでrouterを一から書いてみた](http://tech.itandi.co.jp/2016/12/router_for_redux_from_scratch/)
技術英語 > This page intentionally left blank.

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2427 / 12833)

> This page intentionally left blank.

ただの空白ページがあるのと、上記の文言があるのとでは閲覧者にとっての情報が変わってくる。

意図は適切にコメントした方が良い結果を生むことが多いように思う。
Google Cloud Next 17で使われていた楽曲一覧

勉強会とかでそれっぽい曲が始まる前に流れてるとか結構重要だと思うんですよね。
もちろんですがすべての曲をカバーしているわけではありません。

アーティスト名 - 曲名
の形でリストしています。
リンクはYoutubeなどのリンクです。

洋楽をあまり聞かない方でも、Google感溢れる曲が聞けるかとおもいます。
下の方にYouTubeのプレイリストのURLがあります。

#曲一覧

[Galantis - No Money](https://www.youtube.com/watch?v=xUVz4nRmxn4)

[Robin Thicke - Blurred Lines](https://vimeo.com/67508707)

[Galantis & Hook N Sling - Love On Me](https://www.youtube.com/watch?v=8gz9NsNH96Q)

[Christina Aguilera - Ain't No Other Man](https://www.youtube.com/watch?v=8x7Ta89QLo4)

[Dillon Francis - Bruk Bruk (I Need Your Lovin)](https://www.youtube.com/watch?v=uKDgEPvjvR8)

[Dimitri Vegas & Like Mike feat. Ne-Yo - Higher Place](https://www.youtube.com/watch?v=CDLTmBiY3mg)

[DJ Kaos - Love The Night Away (Tiedye mix)](https://www.youtube.com/watch?v=15FPSDreTcs)

[DJ Snake - Middle ft. Bipolar Sunshine](https://www.youtube.com/watch?v=mOKqNxN4jWM)

[DJ Snake, AlunaGeorge - You Know You Like It](https://www.youtube.com/watch?v=aBn7bjy9c4U)

[DJ Geezy - Ribiray Intro](https://www.youtube.com/watch?v=U-BQrY3NClQ)

[Lemaitre - Closer](https://www.youtube.com/watch?v=U5z8ONuMmOU)

[Nico & Vinz - Am I Wrong](https://www.youtube.com/watch?v=bg1sT4ILG0w)

[Imagine Dragons - I Bet My Life](https://www.youtube.com/watch?v=4ht80uzIhNs)

[Mark Ronson - Uptown Funk](https://www.youtube.com/watch?v=OPf0YbXqDm0)

DJ BRUNO WEST - I Need To Know Now (Johnny V Remix)

[Fitz and the Tantrums - HandClap](https://www.youtube.com/watch?v=Y2V6yjjPbX0)

[Clean Bandit - Rockabye](https://www.youtube.com/watch?v=papuvlVeZg8)

[Steve Aoki & Louis Tomlinson - Just Hold On](https://www.youtube.com/watch?v=RJOqJ-RitOg)

[Coldplay - Hymn For The Weekend](https://www.youtube.com/watch?v=YykjpeuMNEk)

[Borgeous - They Don't Know Us](https://www.youtube.com/watch?v=JKwr064-PBY)

[CHVRCHES - Clearest Blue](https://www.youtube.com/watch?v=BZyzX4c1vIs)

[Cold War Kids - Miracle Mile](https://www.youtube.com/watch?v=1F6gAN6MOII)

[Mike Mago & Dragonette - Outlines](https://www.youtube.com/watch?v=03O2yKUgrKw)

[Clean Bandit - Rather Be](https://www.youtube.com/watch?v=m-M1AtrxztU)

#YouTubeのプレイリスト

https://www.youtube.com/playlist?list=PLLiDHQCV0PKBov7my1a0cdXJnFpu8G-yA

###ちなみに
Clean Banditは「清潔な盗賊」らしいです。（Rather BeのPVを参照）
チェックボックスで複数選択されたデータを受け取る方法(PHP)

■HTML

```HTML
<form action="sample.php" method="POST">
    <p>好きな色（複数回答可）: 
        <input type="checkbox" name="colors[]" value="white">白
        <input type="checkbox" name="colors[]" value="black">黒
        <input type="checkbox" name="colors[]" value="red">赤
        <input type="checkbox" name="colors[]" value="blue">青
        <input type="checkbox" name="colors[]" value="green">緑
    </p>
    <p><input type="submit" value="送信"></p>
</form>
```
■PHP

```PHP
<?php
echo '<p>好きな色: ';
if (isset($_POST['colors']) && is_array($_POST['colors'])) {
  foreach( $_POST['colors'] as $value ){
      echo "{$value}, ";
  }
}
echo '</p>';
?>
```

 (参考)
http://alphasis.info/2012/11/php-gyakubiki-form-post-multiple/
pythonの文字列処理 mapとlambda

pythonのmapとlambdaの使い方について、fastqファイルを使って説明します。

以下のテストファイルは、bioinformaticsではおなじみのfastqファイルとよばれるDNAシーケンサーの解析結果のファイルで、@行はheader、次の行がDNAの塩基配列、3行目に+を挟んで、4行目は2行目のDNA塩基配列の一文字一文字に対する品質評価値になっており、品質評価値に33を足した数値がASCII文字で変換された数になっています。  

```text:test.fastq
@test1
GAGCACACGTCTNNANNCNAGTCANNANNNANNNNNNNNNNANNCNNNNNNTNNNNNNNNANNNNTGTCCATTGCNNNCACATCATTGTTTACTTGCGCNT
+
;<<:?@9<?############################################################################################
```

品質評価値をもとの数値に直したい。そこでpythonでごちゃごちゃ書こうとしたのだけれど、とびきり便利なmapとlambdaの組み合わせに出会ったのでメモします。  ちなみに、環境はpython2です。  
[メモ: pythonのversion間の高階関数の使い方の違いについて。](http://qiita.com/croissant1028/items/94c4b7fd360cfcdef0e4)

たとえば、Aという品質評価値を数値に変換するには、pythonではアスキーコードを変換する**ord（反対はchr）**という組み込み関数をつかって、数値に変換し、それから33を引けば元の値になります。

```console
>  python -c 'print ord("A")-33'
32
```

これをtestファイルの品質値の行にある101文字全て変換するには、for文を使うと 

```py:convert_asci.py
asci_string = ";<<:?@9<?############################################################################################"
for baseq in asci_string:
    score = ord(baseq) - 33
    print score,
```

と書くことができます。

```text:convert_asci.py実行結果
26 27 27 25 30 31 24 27 30 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
```

この値は大きいほど品質が良いことを示しますので、"#"の品質値の塩基はとても品質が悪いことがわかります。さて、このASCIコードの変換プログラムの書き方はfor文を使っていて、プログラムが長くなるにつれて縦に長いコードになるのは辛いですし、実行速度も遅そうです。そこで、mapを使って表現してみます。

```py:convert_asci.2.py
asci_string = ";<<:?@9<?############################################################################################"

def convert_func(x):
    score = ord(x) - 33
    return score

res_score = map(convert_func, asci_string)
print res_score
```

```text:convert_asci.2.py実行結果
[26, 27, 27, 25, 30, 31, 24, 27, 30, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
```

このようにfor文を回避しても関数を定義する行の文長くなってしまいます。
そこで、**lambdaという無名関数**を使って、mapの中に"convert_func"関数に相当する処理を書いてしまえるということを知りました（いままで知らなかったんかい！）。次のようになります。


```py:convert_asci.3.py修正後のスクリプト
asci_string = ";<<:?@9<?############################################################################################"
res_score = map(lambda x:ord(x) - 33, asci_string)
print res_score  
```



**文字列は、for文やmapでは内部で１文字に分割されてイテレートされる。という情報をいただきました。ありがとうございます、修正させていただきました。**

```py:convert_asci.3.py修正前のスクリプト
asci_string = ";<<:?@9<?############################################################################################"
asci_list = list(asci_string) #この処理（リスト化）を行う必要がありませんでした。

res_score = map(lambda x:ord(x) - 33, asci_list)
print res_score
```

どうでしょう。一行でかけてしまいました。mapはリストを返してくれるので結果は同じです。無名関数は、一度だけしか使われない使い捨ての関数のことです。一度きり使うだけなので、名前をつける必要がないため無名関数と呼ばれています。lambda式を使って無名関数を作る書式は次のようになります。

```
lambda 引数(例ではx):返り値 (例では、ord(x) - 33)
```


例では、xが引数でmapからasci_listの値を一つ一つ受け取り、指定した処理を実行してから返り値を返してくれます。これはとても便利ですね！
Git管理外のgitignoreで除外されたファイルは-x指定なしのcleanでも削除される

## 2022/7/10訂正

未コミットの.gitignoreでも `-fd` オプションの対象になる挙動をするという旨をコメントでご指摘いただきました。
私も手元で試してみたのですが、指摘の通りの挙動でした。
ということで、この記事の内容は古いバージョンでのみ適用される話か、あるいは私の記憶違いであるようです。

## TL;DR
Gitで管理していない.gitignoreによって除外されたファイルは、 `-x` 指定なしの `git clean` によって削除される。
例えば、以下のルートディレクトリで`git clean -fd`(※`git clean -fdx`ではない)を実行するとlocalディレクトも消えてしまう。

```
+.git
+src/
  +[ここにたくさんのファイル]
  +local/
    + *.gitignore (※自身を含め、ディレクトリ内すべて無視するように記述)
    + *foo.md
    + *bar.md
     [ローカル環境で保持するけどgit管理しないファイル群]
```

## 前置き
`git clean`はgitで追跡していないファイルを削除するコマンドである。
ただし、通常、`-x`オプションを付けない限り、.gitignoreで除外されたファイルを削除することはない。

例えば、このような.gitignoreがあるとき、

```.gitignore:.gitignore
/sample/foo.md
```

このルートディレクトリで、`git clean -fd`を実行すると(※以下、`*`の付いたファイルは未コミットを示す)、

```
+.git
+.gitgnore
+sample/
  + *foo.md
  + *bar.md
```

このように、sample/bar.mdだけが削除される。

```
+.git
+.gitgnore
+sample/
  + *foo.md
```

なお、このsample/foo.mdのように.gitignoreで除外されているファイルを削除するには、`git clean -fdx`を実行する。
実行後はこうなる。

```
+.git
+.gitgnore
```


## 本編
ところが、このような未コミットの.gitignoreがあり、

```.gitignore:.gitignore
*
```

下記のように配置されている場合、

```
+.git
+sample.md
+tmp/
  + *.gitignore
  + *foo.md
  + *bar.md
```

このルートディレクトリで、`git clean -fd`を実行すると、

```
+.git
+sample.md
```

このように、未コミットの.gitignoreによって除外されたファイルも削除される。

## まとめ
- `git clean`は`-x`を付けない場合に、.gitignoreで除外されたファイルは削除しない。
- ただし、この場合の.gitignoreはコミットされた(gitで管理された)ものである必要がある。
- つまり、`-x`オプションなしでも、git管理されていない.gitignoreで除外されたファイルは削除される。

## 補足
これがどんな問題になるのは次のようなケース。
以下のようにローカルでGit管理しないファイルを保持している場合に、

```
+.git
+src/
  +[ここにたくさんのファイル]
  +local/
    + *.gitignore
    + *foo.md
    + *bar.md
     [ローカル環境で保持するけどgit管理しないファイル群]
```

うっかり、`git clean -fd`を実行すると、localディレクトリも全部消えてしまう。
Stripeのnode SDKを使って、テスト・本番それぞれのAPIにアクセスする


Stripeのnode SDKまわりをいろいろ触ってみたので覚書としてまとめました。

## SDKの準備
npmで配布されているので、以下のコマンドでインストールできます。

```
$ npm install --save stripe
```

## Stripeオブジェクトの作成
StripeのAPIと接続するためのオブジェクトを以下のように生成します。
`sk_YOUR_STRIPE_SECRET_KEY`は、Stripeダッシュボードの`API`から見れる「Secret Key」を使用します。

```index.js
var stripe = require("stripe")(
  "sk_YOUR_STRIPE_SECRET_KEY"
);

```

## テストと本番を切り替える
Stripeはデフォルトでテストと本番の２環境が用意されています。
それぞれAPIキーも異なりますので、環境変数を使ってテスト環境と本番環境の切り分けすることができます。

```.envrc
export STRIPE_ENV='test'
```

```index.js
let stripe_secret = "sk_test_STRIPE_SECRET_KEY"
if (process.env.STRIPE_ENV === undefined){
  console.log('STRIPE_ENV is not defined')
  return
} else if (process.env.STRIPE_ENV == 'prod') {
  stripe_secret = "sk_live_STRIPE_SECRET_KEY"
}
var stripe = require("stripe")(
  stripe_secret
);

// せっかくなので、アカウント情報を取得して違いを見てみる
stripe.customers.list(
  function(err, account) {
    // asynchronously called
    if(err) {
      console.log(err)
    }
    console.log(account)
  }
);

```

## 実行結果を比較する

先程のindex.jsを実行すると、以下のように環境変数によってとれるデータが異なるのがわかります。

### 実行結果(STRIPE_ENV = test)

```
{ object: 'list',
  data: 
   [ { id: 'cus_XXXXXXXXXXXXXXX',
       object: 'customer',
       account_balance: 0,
       created: 1488767648,
       currency: null,
       default_source: null,
       delinquent: false,
       description: null,
       discount: null,
       email: 'hoge@example.com',
       livemode: false,
       metadata: {},
       shipping: null,
       sources: [Object],
       subscriptions: [Object] },
  ],
  has_more: false,
  url: '/v1/customers' }
```

### 実行結果(STRIPE_ENV = prod)
```
{ object: 'list',
  data: [],
  has_more: false,
  url: '/v1/customers' }
```
ページ遷移時にjQueryが読み込まれないとき

# 環境
Ruby 2.2.6
Rails 5.0.2

# 悩み
リロードをするとjQueryが読み込まれない

## From
```coffeescript
$(document).on 'pages:load', ->
  func()
```

## To
```coffeescript
$(document).on 'turbolinks:load', ->
  func()
```
【備忘録】初心者がenum使ったf.check_boxで見事につまづいた話

[rails f.check_box](http://railsdoc.com/references/check_box_tag)の妖艶な動きに騙されるな！
---
checkboxを生成してくれるrailsのヘルパーがあるのだが、けっこうハマったのでメモ。

見積もりを1時間ほどとしていた軽めのバグタスクがあったのだが、手を付け始めてから結構長い間プルリクをオープン状態のまま放置していた。というのも、バグっている箇所とほぼ同じコードを書いているはずの箇所がちゃんと動いてしまっており、「これもしかしたらハマるかも」と思ったからだ(実際結構ハマった)。何でハマったか、ちゃんと残しておこうb
結論から言うと、**「f.check_boxのchecked_value、unchecked_valueにはシンボルではなくstringを入れておこう」**ということ。
バグってたのは以下のコード。

```rails:app/models/hoge.rb
# == Schema Information
#
# Table name: hoges
#
#  id         :integer          not null, primary key
#  foo        :integer          default(0), not null
#  created_at :datetime         not null
#  updated_at :datetime         not null
#

class Hoge < ActiveRecord::Base
  enum foo: %i(foo_ng foo_ok)
end
```

```rails:app/views/hoge.html.erb
〜〜〜
<%= f.label :foo do %>
  <%= f.check_box :foo, {}, :foo_ok, :foo_ng %>
  <%= label_tag 'hoge_foo', '' %>
  <%= f.label :foo, 'fooはokです' %>
<% end %>
〜〜〜
```
[f.check_boxのドキュメント](http://railsdoc.com/references/check_box_tag)を見ると、引数は以下の順番。
1. プロパティ名 
2. オプション
3. checked_value (default: "1")
4. unchecked_value (default: "0")

上記のコードでは、チェックを入れればfoo_ok(つまり0)がsubmitされる。だから、チェックしてsubmit後そのページに戻ってきたときは、デフォでチェックされてるはず...なのだが、チェックされてなかった、というのが直すべきバグ内容。なんでだろ？？
同じようなコードを書いているところとの違いは、enumを使ってなんかゴチャゴチャやってるかどうかくらい。でもそれしか違いがないんだから、多分それがバグの要因なんだろう。ここまでは分かった。でもその先どう解決すべきかがよく分からなくて結構時間をとられた。以下、解決までの流れ。

- 「rails check box enum」でググってみた
  -  が、それらしきものが見当たらず...
- とりあえずあまり得策ではないものの、オプションのcheckedをvalue見て変える形で実装
  - まぁそりゃあ...動くっちゃあ動く
  - でも、やっぱりコレジャナイ感がすごい
  - そもそもf.check_boxならformの要素渡ってるはず
  - checked渡さずとも、正しい挙動ならデフォでチェックが入るはず
  - **ということは...？**
- formを作るところで間違っている(ヘルパーに渡すものが違う)のかも
  - なんか怪しいのは、やはり引数の3番目と4番目のchecked_value & unchecked_value
  - 試しにフォーム要素`@hoge`から`@hoge.foos.key[0]`みたいな感じで取ってくると、動いた
  - 動かなかったやつと動いたやつで、生成されたhtmlを確認してみる
  - **checked="checked" 以外同じやんけ！！！！！！**
  - **ということは...？**
- 謎
  - 別に`@hoge.foos.key[0]`でなくてもいいよね、これって別にフォーム要素関係ないし(どちらかというとクラスの話)
  - 試しに 'foo_ok' とか文字列ブチ込んだろ
  - 動いた
- **動いた**
    - ということは...？
- これ文字列じゃないとだめなやつじゃね...？
    - 多分そうなんだ、そうなんだけど、どういうわけで文字列じゃないとだめなんだべ？
    - [f.check_boxのソースコード](https://github.com/rails/rails/blob/477fae3eb3d3b3bfdbe28586fecb8578c0be4721/actionview/lib/action_view/helpers/form_helper.rb#L1708)を辿ってみる
    - ほう、[check_boxはTag::CheckBox.newでつくってるらしい](https://github.com/rails/rails/blob/477fae3eb3d3b3bfdbe28586fecb8578c0be4721/actionview/lib/action_view/helpers/form_helper.rb#L946)
    - Tag::CheckBoxのソースコードを辿ってみる
    - ほう、Tag::CheckBoxは[ここ](https://github.com/rails/rails/blob/92703a9ea5d8b96f30e0b706b801c9185ef14f0e/actionview/lib/action_view/helpers/tags/check_box.rb)かぁ〜
    - [この辺](https://github.com/rails/rails/blob/92703a9ea5d8b96f30e0b706b801c9185ef14f0e/actionview/lib/action_view/helpers/tags/check_box.rb#L41)
    - なるほど、文字列とシンボルの比較をやってたからここがfalseになってたんや...！

ということでした。つまるところ、

```
[1] pry(main)> 'aaa' == :aaa
=> false
```
やで！ということです。

今回の学び
---
- **「どうなってるのかよく分からんけど、動いた」は危ない**
    - この場合はうまくいくかもしれないけど、次にもし、同じようで同じじゃない、少し同じバグが出てきたときに対処できない可能性がある
    - なんで動かなかったのか？なんで動いたのか？を理解することを心がける
- **ソースコードともっと仲良くなる**
    - なんか謎な動き方してると思ったら、ソースコードをあたってみること。大抵書いてある
MsBuild.exeでビルドエラー


VisualStudioではビルドできるのに、MsBuildでプロジェクトファイルを指定してビルドしようとすると失敗する。「C1083: include ファイルを開けません」
内容を見てみると、プロジェクトファイル内で`$(SolutionDir)`で指定されている箇所で失敗しているようだ。

MsBuildにはプロジェクトファイルしか渡していないので`$(SolutionDir)`が解決できないのか。
ググると似たような質問があった。

[msbuild - How to "get rid of " $(SolutionDir) when building vs project from outside visual studio - Stack Overflow](http://stackoverflow.com/questions/15053915/how-to-get-rid-of-solutiondir-when-building-vs-project-from-outside-visual)

「MsBuildで`$(SolutionDir)`柔軟に指定したい場合は`/p:SolutionDir=path`を使えばいいぜ！」とのこと。

試してみた。気づいた注意点を書いておく:

- 相対パスで指定するならvcxprojファイルからの相対パス
- 元々の`$(SolutionDir)`は末尾`\`付きなのでそれにならう
- ディレクトリの区切り文字は`/`可
- MsBuildのオプション指定の`/p`は`-p`でもよい

例えば以下のような構成:

```
./                              # カレントディレクトリ
 `- solution/                   # $(SolutionDir)
     |- MySolution.sln          # ソリューションファイル
     `- project/                # $(ProjectDir)
         `- MyProject.vcxproj   # プロジェクトファイル
```

であればこんな感じに書ける筈:

```
MsBuild ./solution/project/MyProject.vcxproj -p:SolutionDir=../
```

----

プロジェクトファイル中で`$(SolutionDir)`を使わないようにしてもよい。
`$(ProjectDir)`でがんばろう。

そもそもプロジェクトファイルなのだから`$(SolutionDir)`に依存しない方が健全に思える。
MySQL Cloud Service に MySQL Enterprise Monitor を構成してみた


[Oracle MySQL Cloud Service](https://cloud.oracle.com/en_US/mysql) のインスタンス作成を簡略化するシェルを **「[Oracle MySQL Cloud Service のインスタンスを簡単に作れるようにしてみた](http://qiita.com/shinyay/items/845572b0b5e0da3c53dc)」** で作成しました。そこではデータベース本体のみでしたが、今回は **MySQL Enterprise Monitor** も合わせて構成します。

## 説明

[MySQL Enterprise Monitor](https://www-jp.mysql.com/products/enterprise/monitor.html) は、MySQL データベースの性能とと可用性をリアルタイムで可視化する管理ツールです。この管理ツールは、Enterprise Edition で使用できる付属ツールであり、Community Edition では使用できません。

MySQL Enterprise Monitor は、以下のような機能を提供します:

- MySQL サーバーの視覚的管理
- 視覚的にクエリーを解析
- リモート監視
- パフォーマンスのリアルタイム監視
- 可用性に関するリアルタイム監視
- アクセス制御リスト (ACLs)
- バックアップ・ダッシュボード
- レプリケーション・ダッシュボード
- など

**「[Oracle MySQL Cloud Service のインスタンスを簡単に作れるようにしてみた](http://qiita.com/shinyay/items/845572b0b5e0da3c53dc)」** では、データベース本体を構成する際に、JSON ファイルに情報を定義しておきましたが、同様に MySQL Enterprise Monitor に関する情報を定義しておく事で簡単に構成する事ができます。

### MySQL Enterprise Monitor に関する情報定義

テンプレートファイル(*mysqlcs-entry-with-monitor-template.json*)内に MySQL Enterprise Monitor が導入されるデフォルト値を定義し、ユーザ名はMySQL ユーザ名と同一にしています。

|項目名|説明|
|---|---|
|enterpriseMonitor|MySQL Enterprise Monitor 構成の有無 [Yes or No]<br>デフォルト: No|
|enterpriseMonitorAgentUser|エージェント・ユーザ名<br>現状、定義してもエージェントモジュールは導入されない<br>(as of 2017.3.13)|
|enterpriseMonitorAgentPassword|エージェント・パスワード|
|enterpriseMonitorManagerUser|マネージャ・ユーザ名|
|enterpriseMonitorManagerPassword|マネージャ・パスワード|
|mysqlEMPort|MySQL Enterprise Monitor のリスニング・ポート<br>デフォルト: 18443<br>**ora_p2admin_em** を有効化する必要あり|

この JSON ファイルにを用いて、MySQL Cloud Service インスタンスを作成します。

## 動作イメージ

![MySQL Enterprise Monitor](https://raw.githubusercontent.com/shinyay/mysqlcs-create-shell/1.1.0/docs/images/mysql-em.gif)

## 前提

- [PaaS Service Manager Command Line](https://docs.oracle.com/en/cloud/paas/java-cloud/pscli/index.html) が導入されている事

## 導入手順

次のような構成でシェルとテンプレートの JSON ファイルを配置します:

psm-mysqlcs-create-entry.sh

```
.
├── psm-mysqlcs-create-entry.sh
└── template
    ├── mysqlcs-entry-template.json
    └── mysqlcs-entry-with-monitor-template.json
```

## 使用方法

- `psm-mysqlcs-create-entry.sh [-t TEMPLATE] SERVICE-NAME MYSQL-PWD [DESCRIPTION]`
  - **TEMPLATE**: MySQL Cloud Service 用のテンプレートファイルを指定します
    - 1: (DEFAULT) Just Database
    - 2: Database with Enterprise Monitor
  - **SERVICE-NAME**: MySQL Cloud Service のインスタンス名 (スキーマ名ではない)
    - ※ スキーマはデフォルト値の `mydatabase` にシェルの中でハードコーディングしています
  - **MYSQL-PWD**: MySQL のパスワード
    - ※ ユーザはデフォルト値の `root` にシェルの中でハードコーディングしています

MySQL CS インスタンスが正常作成終了後に、MySQL Enterprise Monitor のリスニング・ポートのアクセス・ルールを有効化します。デフォルトでは、無効化されているためにアクセスが行えなくなっています。

- ` psm mysqlca enable-access-rule -s <MYSQLCS_SERVICE-NAME> -r ora_p2admin_em`
    - `ora_p2admin_em` が118443ポートへのアクセスを定義したアクセス・ルールです。
GitbucketをUbuntu14.04で動かす

GitbucketをUbuntu14.04でTomcat上で動かす話．

# Java8をインストール

```
# add-apt-repository ppa:webupd8team/java
# apt-get update
# apt-get install oracle-java8-installer
```

環境変数も変える

```
# apt-get install oracle-java8-set-default
```

# Tomcatをインストール
```
# apt-get install tomcat7
```

# Tomcatの設定を変える

`/etc/default/tomcat7`に以下の行を追加．
java8を使う設定と，gitbucketの設定を保存するフォルダを指定

```
JAVA_HOME=/usr/lib/jvm/java-8-oracle
GITBUCKET_HOME=/usr/share/tomcat7/.gitbucket
```

`/usr/share/tomcat7/.gitbucket`フォルダを作成．
所有者を`tomcat7`にしないとパーミッションエラーになる．

```
# mkdir /usr/share/tomcat7/.gitbucket
# chown tomcat7: /usr/share/tomcat7/.gitbucket
```

# Gitbucketを設置

```
$ wget https://github.com/gitbucket/gitbucket/releases/download/*.**/gitbucket.war -O gitbucket.war
# cp gitbucket.war /var/lib/tomcat7/webapps/
```

# 完成
`http://***:8080/gitbucket`にアクセス．

# gitbucket
- https://github.com/gitbucket/gitbucket
Object.assign up to ES6

```js
if (typeof Object.assign != 'function') {
  (function () {
    Object.assign = function (target) {
      'use strict';
      if (target === undefined || target === null) {
        throw new TypeError('Cannot convert undefined or null to object');
      }

      var output = Object(target);
      for (var index = 1; index < arguments.length; index++) {
        var source = arguments[index];
        if (source !== undefined && source !== null) {
          for (var nextKey in source) {
            if (Object.prototype.hasOwnProperty.call(source, nextKey)) {
              output[nextKey] = source[nextKey];
            }
          }
        }
      }
      return output;
    };
  })();
}
```
Softether VPNをUbuntu16.04LTSに導入

# Softether VPN ダウンロード

ソースをダウンロード

http://www.softether-download.com/ja.aspx?product=softether

wgetを使うか，ブラウザでダウンロードしてscpでサーバに送る．


# 展開，make

```
$ tar xzf vpnserver-****-rtm-linux-x86.tar.gz
# mv vpnserver /usr/local/
# cd /usr/local/vpnserver
# make
```

`make`コマンドの後，Licenseの同意を選択する．

実行ファイルのパーミッションを変える．

```
# chmod 0700 vpnserver
# chmod 0700 vpncmd
```

# VPNサーバの設定(Windowsから)

サーバサイドではコマンドラインで設定できる...が，ゆとりなのでWindowsからGUIで設定．
参考URL 2.の通りに設定．

# VPN Serverのデーモン化

`/etc/systemd/system/vpnserver.service`に以下の通りに記述．

```[vpnserver.service]
[Unit]
Description=SoftEther VPN Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop

[Install]
WantedBy=multi-user.target
```

`vpnserver.service`を置いたら，vpnserverの起動

```
# systemctl start vpnserver
```

vpnserverを自動起動設定

```
# systemctl enable vpnserver
```

# 参考URL

1. http://ja.softether.org/4-docs/1-manual/7/7.3
1. http://vhh.gatsu-neko.mydns.jp/2014/05/ubuntu-serverut-vpn%E3%81%AB%E3%82%88%E3%82%8Bl2tpipsec%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E6%A7%8B%E7%AF%89/
1. http://blog.204504byse.info/wiki.cgi?page=Systemd%CD%D1SoftEther%C0%DF%C4%EA%A5%D5%A5%A1%A5%A4%A5%EB
dockerでdnsサーバを立てる

さくらのVPSで動かしてたイメージを自宅サーバへ移動したので，宅内からでも名前で引けるようにDNSサーバを立てる．
[こちらのイメージ](https://hub.docker.com/r/andyshinn/dnsmasq/)でdnsmasqをコンテナで動かす．

```docker:docker-compose.yml
version: '2'
services:
  dnsmasq:
    restart: always
    image: andyshinn/dnsmasq
    container_name: dnsmasq
    ports:
      - "53:53/udp"
      - "53:53/tcp"
    extra_hosts:
      - "hoge.tac42.net:192.168.11.200"
      - "test.tac42.net:192.168.11.200"
    cap_add:
      - NET_ADMIN
```

`extra_hosts` に名前解決したいホスト名とIPアドレスを書くだけ．

```
$ sudo systemctl stop systemd-resolved.service
$ sudo systemctl disable systemd-resolved.service
$ sudo docker-compose up -d
```
[Swift]closureで引数名の定義を省略する

 - Swiftのclosureでは、内部引数名を省略することができる
（外部引数名は元々指定できない、_で省略されている状態と同様）

 - 省略した引数は内部で\$0（第1引数）、\$1（第2引数）のようにアクセスする

```swift
// 内部引数名あり
let distance1 = { (a: Int, b: Int) -> Int in
    return abs(a - b)
}

// 内部引数名なし 
let distance2: (Int, Int) -> Int = {
    return abs($0 - $1)
}

distance1(2, 3) //1
distance2(2, 3) //1
```

内部引数名を省略し、型推論ができない場合はコンパイルエラーとなる

```swift
let plus = {
    return $0 + $1
}

plus(2, 3) //コンパイルエラー
```

（応用例）mapやfilterメソッド

```swift
// 3の倍数
let array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let newArray = array.filter { $0 % 3 == 0 }
newArray // [3, 6, 9]

// 120円以上の果物の名前（$0.0はkey、$0.1はvalueを示す）
let price = ["りんご": 100, "ばなな": 150, "みかん": 200]
let fruits = price.filter { $0.1 > 120 }.map { $0.0 }
fruits // ["ばなな", "みかん"]
```
unity側からUWP側の機能をつかう(改訂版)とデバッグのちょっと便利な方法（備忘録）

#UWPのライブラリを使った時のUnityのデバッグ
UWPのライブラリを利用してUnityのアプリを作った場合、動作確認するためにはUWP側までビルドして実行しない限り動作してるのかがわからない状況になります。
私自身がUnityに慣れていないので、Unity上での動きを確認するためにデバッグしたいことがあります。ですがUWP側と連携しておりかつ、データをUWP側からデータもらう仕様の場合、確認が難しくなる状況になりました。
今回、そのあたり解決する方法を紹介したいと思います。と言ってもよくあるスタブを利用する一般的な方法です。Unity側でデバッグ中はスタブ利用して、実際のアプリではちゃんとしたクラスを利用できるようにする形で、主に自分の備忘録として残しています。

## 環境
今回使用した環境は以下の通りです。
Visual Studio 2015 Community Edition update 3
Unity 5.5.0P2 Personal

## UWP側のライブラリを使う方法
[前回](http://qiita.com/miyaura/items/812b001157c8fc27da1e)Unity側でUWPのライブラリを使う方法を整理したのですが、少し見直しました。
前回作ったものはUnity自体をあまり使ったことがなかったため管理クラスをmonobehaviourと空のオブジェクトでわざわざPrefabつくっていました。
でも本当はそんなことしなくても普通にStaticクラス作ればよかったということを知りました。
修正時にインターフェース周りも変更していますが、概念は全く同じものを作っています。

修正版のソースコードはgithubに公開しています。
https://github.com/TakahiroMiyaura/UWPBridgeSamples

## やり方
簡単で#ifディレクティブとスタブクラスを用意すれば解決します。
今回作っているUWP側のライブラリを利用する方法については、IUWPBridgeServiceインターフェースを実装したサービス適用クラスを実装するつくりにしています。
ですのでこのインターフェースを実装したスタブクラスをUnity側に実装し、Unityのエディタ上ではスタブクラスをサービスとして取得するようにするだけです。
以下のように「#if UNITY_EDITOR」で振り分けるだけです。
最終的にUWPアプリケーションとして動作する際にはelse側のロジックで動作するので、一度このような形で実装しておけば少しだけデバッグが楽になるかもです。
特に分業する際にUnity側が得意な人と、UWPでモジュール作る人を分けたりなどもやりやすくなると思います。

```csharp
// Copyright(c) 2017 Takahiro Miyaura
// Released under the MIT license
// http://opensource.org/licenses/mit-license.php
private void Update()
{
    if (Service == null)
    {
#if UNITY_EDITOR
        // For Debug.when this application execute by unity,call this. 
        Service = new SampleStub();
#else
        // execute For HoloLens. 
        Service = UWPBridgeServiceManager.Instance.GetService<ISampleService>();
#endif
        Service.OnDetected = SetFaceObject;
    }
    Service.DetectFace();
}
```
[めも]Issue 223100: Emulator(AVD)がCrashする問題 (Android SDK Tools: ～25.2.2) [Android 開発環境]

#概要
Androidの開発環境をアップデートする時用のメモです。
(アップデート時の障害回避用に検索したので、実際の現象は確認していません。)

検索キーワード：「Android sdk bug 25.2」

###現象：Emulator(AVD)がクラッシュする。

###影響を受けるバージョン：Android SDK Tools: ～25.2.2
※25.3.xは、別の問題が起きている模様。

###影響を受けないと思われるバージョン：
Android SDK Tools: 25.2.3 (？)
※25.2.3で再現しないという報告があった。
ただし、リリースノートでは、25.2.4、25.2.5にもエミュレータのバグフィックスが入っている。
また、25.3.0で、エミュレータ関連の大きな変更があったので、かなり注意した方が良さそうです。(「Android sdk bug 25.3」で検索すると、色々あるようなので。)


#参考資料
###Android Studio 2.3 関連は、別ページで。
[[めも]Android Studio 2.3 関連のIssue[Android 開発環境]](http://qiita.com/toris-birds/items/8f4201865ee8dc80bef8)

###資料1　[SDK Tools Release Notes](https://developer.android.com/studio/releases/sdk-tools.html)
> SDK Tools, Revision 25.3.0 (March 2017)
> Changes:
Android Emulator is removed from this package and moved to a different SDK directory. See the new Android Emulator Release Notes. This change is backward compatible with older Android Studio versions.


###資料2 [Emulator Release Notes](https://developer.android.com/studio/releases/emulator.html)
> Revision 25.3.0 (March 2017)
> Minor revision 25.3.1 (March 2017)
>
Fixed a crash occurring on some GPU configurations by disabling GLAsyncSwap by default. This feature was added in 25.3.0 to improve frame timing and frames per second for games and video, but causes the emulator to fail on some unknown machine configurations. You can manually enable it by opening the android_sdk/emulator/lib/advancedFeatures.ini file and setting GLAsyncSwap = on. 

###資料3　[Stackoverflow - Emulator on Android Studio doesn't start after SDK tools update to 25.3.1](http://stackoverflow.com/questions/42659272/emulator-on-android-studio-doesnt-start-after-sdk-tools-update-to-25-3-1)

Q: 
> After updating my Android SDK tools today to 25.3.1, the emulator won't run anymore.

A:
> ・・・Finally as a workaround, I just copied all of the system files from the SDK system images directory into the AVD directory:
> ・・・After that the emulator started right up. It's not ideal, but this was blocking my development so I had to get the emulator up and running again. I hope someone else will be able to figure out what broke in the configuration.


###資料4　[Issue 223100:](https://code.google.com/p/android/issues/detail?id=223100) Emulator Crashes on Start using version 25.2.2

> Emulator Version: 25.2.2.0
Android SDK Tools: 25.2.2

>Steps to Reproduce Bug:
1. Create new avd
2. Start emulator with: tools\emulator @test
3. Observe that qemu has crashed.

>Observed Behavior:
Qemu crashes on start with the below output. This behavior is a regression from 24.4.1 as the emulator reproducibly crashes with 25.2.2 and works great with SDK Tools 24.4.1.

> \#12
The bug is not repros. with Emulator Version: 25.2.3-3339993 and Android SDK Tools: 25.2.3. Below is the studio config:
[Algorithm入門]最短経路を探す[Python3]

##テーマ
地形コストを情報として持つマップにおいて、スタート地点とゴール地点までを最低コストで結ぶルートを探す。(例えば、SRPG系のゲームでは、平地、家屋、森、山へ移動するときに地形コストが考慮されている)

##アルゴリズム
1) 座標と地形コストが対応した配列を用意(cost_map)
2) ゴール地点を始点として、各地点まで移動にかかるコストを求め、配列を作成(rout_cost)
3) 各地点の移動コスト(rout_cost)をもとに、スタート地点からコストの小さい点をたどる

注) 補足(プログラムを書く上で用いるテクニック)
再帰関数を用います。

##実践
1) 例えば以下のような地形コストを持つマップにおいてスタート ( x3, y0 ) からゴール ( x1, y6 ) への最短経路を考える。

|    | y0 | y1 | y2 | y3 | y4 | y5 | y6 |
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
| x0 | 4  | 3  | 1  | 1  | 1  | 2  | 3  |
| x1 | 3  | 2  | 1  | 2  | 1  | 1  | 1  |
| x2 | 2  | 1  | 3  | 3  | 2  | 3  | 2  |
| x3 | 2  | 3  | 5  | 3  | 2  | 4  | 3  |

地形コストを要素に持つ配列cost_map、さらに無限値を要素に持つ配列rout_costを用意する。

```py3:alg_01.py
s = [3,0]; g = [1,6]  ## start and goal position
cost_map = [[4,3,1,1,1,2,3],\
            [3,2,1,2,1,1,1],\
            [2,1,3,3,2,3,2],\
            [2,3,5,3,2,4,3]]
m = len(cost_map)
n = len(cost_map[0])
rout_cost = [[float("inf") for j in range(n)] for i in range(m)]
```


2) ゴール地点を始点として各地点までの移動コストを計算し、計算結果に基づいて上で用意したrout_costを更新する。

```py3:alg_02.py
def calc_rout_cost(x,y,cost_tmp):
    cost_tmp += cost_map[x][y]
    if cost_tmp < rout_cost[x][y]:
        rout_cost[x][y] = cost_tmp
        if y < n-1:
            calc_rout_cost(x,y+1,cost_tmp)
        if y > 0:
            calc_rout_cost(x,y-1,cost_tmp)
        if x < m-1:
            calc_rout_cost(x+1,y,cost_tmp)
        if x > 0:
            calc_rout_cost(x-1,y,cost_tmp)
calc_rout_cost(g[0],g[1],-cost_map[g[0]][g[1]])
```
出来上がったrout_costは以下の通り。ゴール地点(x6,y1)はゼロになることに注意。

|    | x0 | x1 | x2 | x3 | x4 | x5 | x6 |
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
| y0 | 12 | 8  | 5  | 4  | 3  | 3  | 3  |
| y1 | 10 | 7  | 5  | 4  | 2  | 1  | 0  |
| y2 | 10 | 8  | 8  | 7  | 4  | 4  | 2  |
| y3 | 12 | 11 | 13 | 9  | 6  | 8  | 5  |



3) 最後に、スタートからゴールまでの最短経路を探す。

```py3:alg_03.py
def search_rout(x,y):
    tmp = rout_cost[x][y]
    tmp_x, tmp_y = x, y
    if x > 0 and rout_cost[x-1][y] < tmp :
        tmp_x, tmp_y = x-1, y
        tmp = rout_cost[tmp_x][tmp_y]
    if x < m-1 and rout_cost[x+1][y] < tmp :
        tmp_x, tmp_y = x+1, y
        tmp = rout_cost[tmp_x][tmp_y]
    if y > 0 and rout_cost[x][y-1] < tmp :
        tmp_x, tmp_y = x, y-1
        tmp = rout_cost[tmp_x][tmp_y]
    if y < n-1 and rout_cost[x][y+1] < tmp :
        tmp_x, tmp_y = x, y+1
        tmp = rout_cost[tmp_x][tmp_y]
    if rout_cost[x][y] == 0: return;
    rout_list.append([tmp_x,tmp_y])
    search_rout(tmp_x,tmp_y)

rout_list = []
rout_list.append(s)
search_rout(s[0],s[1])
```

最短経路は

```py3:result.py
print(rout_list)
## [[3, 0], [2, 0], [2, 1], [1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6]]
```

となる。



##参考文献
柳井政和「プログラマのためのコードパズル」技術評論社 (2014)
詳しい説明は文献をあたってください。Javascriptで記述してあります。
【初心者投稿-1】未経験エンジニア成長の軌跡

みなさんこんばんは！

プログラミングの勉強を始めようと思ってます！
大学受験の時の数学ⅡB14点！文系大卒！社会人2年目営業！そう…この我こそは〜…

パソコンをいじるよりも人と話してる方が好き！仕事はとある人材紹介会社の営業！そう…この我こそは…

未経験でどこまでプログラミングを学べるのか、独学でやってみたいと思ってます。

主に使う学習教材は、Progate!

この仕事をしていてエンジニアってすごいなあ、かっこいいなあって思うのでやってみます！

そんな甘っちょろくないと思うけど、日々学習記録をしていこうかと…

よろしくお願いします！
特定 の program からの log出力 を 無効化 (filter) 〜 wpa_supplicant の log を 停止 例 〜

# Overview

特定 の program からの log出力 を 無効化 (filter)する例として、wpa_supplicant の log出力を止めてみます

wpa_supplicant が /var/log/syslog に

```
wpa_supplicant[962]: wlan0: Failed to initiate sched scan
wpa_supplicant[962]: wlan0: Failed to initiate sched scan
wpa_supplicant[962]: wlan0: Failed to initiate sched scan
wpa_supplicant[962]: wlan0: Failed to initiate sched scan
wpa_supplicant[962]: wlan0: Failed to initiate sched scan
wpa_supplicant[962]: message repeated 5 times: [ wlan0: Failed to initiate sched scan]
```

みたいに定期的に /var/syslogに書き続けるのを 抑制(フィルター) する例です

```/etc/rsyslog.d/filter.conf
if $programname == 'wpa_supplicant' then ~
```

```~``` は、捨てるの意味です。
その代わりに、```/tmp/wpa_log``` みたいにして、特定のファイルに書き出すことも可能です.

詳しくは、 ```$ man rsyslog``` 参照のこと。


```
$ sudo systemctl restart rsyslog
$ sudo systemctl status rsyslog
```

みたいにして、再起動および確認しておきましょう。

みたいにすればできます。
急にドメインが使えなくなってしまった話

# はじめに
お名前.comでドメインを取得して、Route53に登録。
その後、取得したドメインでサービスインするが、急にドメインでWebページにアクセスできなくなった・・・！
ブラウザ上では、DNSエラーと出ていますが、AWSに問い合わせても障害等は発生していない、とのこと。

# 原因
ドメインのステータスが「clientHold」になっていました。。。。
https://help.onamae.com/app/answers/detail/a_id/015333

認証依頼メールに対応していない、というのが原因でした。

AWSでドメインを取得した場合でも、
認証依頼メールが英語で送られてくるはずなので、送られてきたメールに書いてあるURLにアクセスして、認証を完了させましょう。

この対応をしないと、ドメインがロックされてしまいます。
**登録するメールアドレスを間違えても、この事象は発生してしまいます、、、**


# WHOIS検索
下記URLにて、WHOIS検索を実施可能です。
ドメインの状態を検索することができます。
https://www.onamae.com/domain/whois/
mobx を ReactNative にセットアップ

- https://medium.com/react-native-training/react-native-with-mobx-getting-started-ba7e18d8ff44#.hu4txnodw

に書かれた通りなのだけど、2017年3月時点ではもうちょっと追加する項目が少なくて済む。

```
yarn add mobx mobx-react
yarn add babel-plugin-transform-decorators-legacy --dev
```

あとは .babelrc を変更

```
{
 'presets': ['react-native'],
 'plugins': ['transform-decorators-legacy']
}
```

It works!

もちろん decorator の syntax 使わなければ特に何もすることは無い。
MyBatisで取得するカラム名を動的に変更する方法

# MyBatisで取得するカラム名を動的に変更する方法
MyBatisでwhere句の条件値を動的に渡すには、下記のように「#」を使用してプリペアードステートメントとして扱われるのは一般的だと思います。

```SQL定義ファイル.xml
<select id="getHogeValue" resultType="java.util.Map">
select * 
form hoge_table
where foo_1 = #{foovalue}
</select>
```
ここでは、取得するカラムを動的に変更する方法を説明します。
つまり、select句で指定するカラムが不定の時に役立ちます。

## 環境
Java：JDK1.7
MyBatis：mybatis-3.2.5.jar

## 実装方法
プリペアードステートメントの値として渡すのではなく、
文字列として渡すには、「$」を使用します。

以下、例になります。

```データアクセスクラス.java
    //カラム名の動的部分をListに定義
    List<Integer> columnIdList = Arrays.asList(1,2,3,4);
    
    //Mapとしてカラム名動的部分のListを設定
    Map params = new HashMap();
    params.put("column_id_list", columnIdList);
    
    //Hogeテーブルから FOO_1, FOO_2, FOO_3, FOO_4, BAR_1, BAR_2, BAR_3, BAR_4 を取得する
    List<Map> hogeValueLsit = hogeTableMapper.getHogeValue(params);
    
    //取得した中身を確認する
    for (Map elm : hogeValueLsit) {
      int idx = 0;
      for (Integer columnId : columnIdList) {
        
        String foo = (String)elm.get("FOO_"+columnId);
        System.out.println("FOO_" + idx + "番目は" + foo + "です。");
        
        String bar = (String)elm.get("BAR_"+columnId);
        System.out.println("BAR_" + idx + "番目は" + bar + "です。");
        
      }
    }
```

```SQL定義ファイル.xml
    <select id="getHogeValue" resultType="java.util.Map">
    select 
      <foreach item="column_id" collection="column_id_list">
         foo_${column_id}
        ,bar_${column_id}
      </foreach>
    from hoge_table 
    </select>
```

## 注意点
Java側で取得する時、カラム名は「大文字」であることに注意
SQL定義ファイル側で「foo_」と小文字にしていても、
Java側のMapキーは「FOO_」と大文字でないと取得できません。

以上です。
sympyで線分と線分の交点

```python
#sympyで線分と線分の交点
from sympy import *
sg1,sg2 = Segment( Point(0,0), Point(1,1)),Segment( Point(0,1), Point(1,0))
ls = intersection(sg1,sg2)
print(ls)

ls = intersection(sg1,sg2)[0]
print(ls,ls.x,ls.y)

sg1,sg2 = Segment( Point(0,0), Point(0.3,0.3)), Segment( Point(0,1), Point(1,0))
ls = intersection(sg1,sg2)
print(ls)
#
# [Point2D(1/2, 1/2)]
# Point2D(1/2, 1/2) 1/2 1/2
# []
```
【Windows】MySQL Server5.7 のmy.cnfファイルの場所

C:\\**ProgramData**\MySQL\MySQL Server 5.7\\**my.ini**
上記のファイルが設定ファイルだった

■迷ったポイント
・Linuxの場合は「my.cnf」だが
　windowsの場合は「my.ini」が設定ファイル

・ProgramDataは隠しフォルダ
Laravel 5.4 と Vue.js 2.2 と JWTAuth で、ログインできる SPA なTODOアプリを作ってみた

Laravel 5.4 と Vue.js 2.2 と JWTAuth で、ログインできる SPA なTODOアプリを作ってみました。

https://powerful-temple-39976.herokuapp.com/

ソースコードはこれです。

https://github.com/acro5piano/laravel-vue-jwtauth-spa-todo-app

Herokuで動かしているのですが、最初の読み込みさえ終わってしまえば、さくさく動きます。

# スクリーンショット

![powerful-temple-39976.herokuapp.com-(iPhone 6).png](https://qiita-image-store.s3.amazonaws.com/0/103885/8a07fbea-5b64-35bf-f813-cec081af537a.png)

![powerful-temple-39976.herokuapp.com-(iPhone 6) (1).png](https://qiita-image-store.s3.amazonaws.com/0/103885/1dfccb22-fdce-179d-8e85-f52a502662c2.png)

# 仕組み

Laravel は、最初にビューを返した後、そこからはJSONのみやり取りして、そこからの描画は Vue.js が全部やってます。

`Axios` でリクエスト飛ばしています。

[koel](https://github.com/phanan/koel) をかなり参考にしました。

認証にはOAuthではなくJWTAuth。Laravelの場合、導入は非常に簡単です。

状態管理には `State` パターンを使っていて、 `Vuex` は使っていません。
この規模であれば十分でしょう。

https://vuejs.org/v2/guide/state-management.html

# 所感

Vue.js超楽しい。

Qiitaにアウトプットすると、定着率が上がるので、そのうちチュートリアルとか書いてみようかと思ってます。

↓

チュートリアル作ってみました
http://qiita.com/acro5piano/items/908cd751b2ea97e19be1
Microsoft Azure CLI 2.0 で サービス プリンシパルを登録する

# 目的
仕事柄、 Azure xx への操作をするアプリケーション・サービスを触る機会があります。
最近は、構成管理ツールを使って、デモ環境をかんたんに作って、使用しないときには、クリーンにしたいと思い、以前利用していた Terraform で構築しようと思いつきました。
先駆者の情報を参考にアプリ登録をしていましたが、Azure CLI 2.0 (Preview) での情報がなかったので、自分メモ代わりにまとめることにしました。

# 環境
- Mac
- Microsoft Azure (以降、Azure)

# 準備
Azure CLI 2.0 を[インストール ガイド](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli)を参考にインストールします。ここでは、割愛します。

# サービス プリンシパル登録
## ログイン
ターミナルを起動し、以下のコマンドを実行して Azure へログインします。

```
$ az login
To sign in, use a web browser to open the page https://aka.ms/devicelogin and enter the code XXXXXXXXX to authenticate.
```

そうすると、`https://aka.ms/devicelogin` にアクセスして、コード`XXXXXXXXX` を入力するよう、メッセージが出力されますので、指定された URL にアクセスします。

<img width="954" alt="スクリーンショット 2017-03-15 21.34.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/107794/f410e189-f4f0-dbcd-3361-63a7587dd246.png">
上図のような画面が表示されますので、ターミナルで表示されているコード `XXXXXXXXX` を入力します。入力コードが正しいと、自動で画面遷移します。
<img width="953" alt="スクリーンショット 2017-03-15 21.34.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/107794/de594d31-e243-1481-bf36-aaddc8313dfa.png">
コードが正しければ`続行`ボタンをクリックします。 (上図のコードは、既に処理済みなので、無効です。。。)
<img width="953" alt="スクリーンショット 2017-03-15 21.35.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/107794/d6585c85-41bb-d9fb-49b5-087fcae9800e.png">

Azure へのログイン画面が表示されたら、ご自身が利用されている ID とパスワードを入力してログインしましょう。
<img width="936" alt="スクリーンショット 2017-03-15 21.35.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/107794/762d1a48-b186-872b-6905-b693c51e0078.png">
ログイン完了したら、画面を閉じても大丈夫です。ターミナルでは、しばらくすると、サブスクリプション一覧が JSON で返ってきているはずです。

# サービス プリンシパル登録
`az ad sp create-for-rbac` コマンドを実行します。

```
$ az ad sp create-for-rbac -n "TEST1" --role Contributor
{
  "appId": "0d2a0c30-e8fe-47fd-80d7-xxxxxxxxxxxx",
  "displayName": "TEST1",
  "name": "http://TEST1",
  "password": "ac52783a-488c-45e6-8504-xxxxxxxxxxxx",
  "tenant": "1686c04e-9f16-487f-bf89-xxxxxxxxxxxx"
}
```

Azure 管理ポータルで確認すると、アプリの登録も完了していました。
<img width="814" alt="スクリーンショット 2017-03-15 22.01.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/107794/528afdf7-34cc-d196-9640-e6704fc351cf.png">

サービス プリンシパルでログインできるか、ターミナルで確認してみます。

```
$ az login --service-principal -u "http://TEST1" -p <password> --tenant <tenant>
[
  {
    "cloudName": "AzureCloud",
    "id": "140b7311-XXXXXXX-43d7-a119-XXXXXXX",
    "isDefault": true,
    "name": "Microsoft Azure",
    "state": "Enabled",
    "tenantId": "1686c04e-XXXX-487f-bf89-XXXXXXXX",
    "user": {
      "name": "http://TEST1",
      "type": "servicePrincipal"
    }
  }
]
```

という具合にログインできました。

# 参考
この記事を書くにあたり、参考にしたページをまとめました。
- [Azure CLI 2.0 でサービスプリンシパルが簡単に作れるようになっていた](http://blog.shibayan.jp/entry/20170123/1485154436)
- [バーチャルマシンを ARM対応の Terraform を使ってプロビジョンしてみる](http://qiita.com/TsuyoshiUshio@github/items/4a4393b92ba65c8012ae)
クラスブラウザに日本語翻訳機能を追加する

やっつけ仕事だけどまあまあ便利
やったことは翻訳機能を作って、メニューへの追加の方法を調べてそこに翻訳機能を追加した。

# google translate apiを使った翻訳機能
下のスクリーンショットのワークスペースにかかれてあるコードをDoItすれば翻訳された言葉が内容のワークスペースを開くようなクラスを書いた。翻訳の仕方はZnClientを使って、google translate apiを使っているだけ。
![スクリーンショット 2017-03-15 20.52.40.png](https://qiita-image-store.s3.amazonaws.com/0/27218/b171c956-27bc-446c-919d-893e811f3cd0.png "スクリーンショット 2017-03-15 20.52.40.png")

# クラスブラウザのメニューへの追加方法を調べる
どこにコードを追加いいかわからないので調べる。
クラスブラウザを開いて、適当な文字列を選択し右クリックでメニューを開く。とりあえずCopyの項目ののHaloを開いてインスペクトする。
Macの場合はOption+Shift+右クリックでHaloは開ける。

![スクリーンショット 2017-03-15 21.04.11.png](https://qiita-image-store.s3.amazonaws.com/0/27218/3931dff2-a6ab-3e5d-aa81-c0132080caec.png "スクリーンショット 2017-03-15 21.04.11.png")

ボタンやなんかのアクションをするオブジェクトは大体インスタンス変数でselectorを持っていて、アクションをする必要があるときは。selectorの内容を実行するのでselectorを見てみる。
![スクリーンショット 2017-03-15 21.12.17.png](https://qiita-image-store.s3.amazonaws.com/0/27218/01464793-42f3-db6e-0ac7-a72843884dd3.png "スクリーンショット 2017-03-15 21.12.17.png")

selectorの内容が#perform:orSendTo:となっていてあんまり役にたたなさそうなのでインスタンス変数を眺めているとarugumentsがあったので覗いてみる。

![スクリーンショット 2017-03-15 21.14.56.png](https://qiita-image-store.s3.amazonaws.com/0/27218/973b162b-27a1-3587-73a5-40faa6d36841.png "スクリーンショット 2017-03-15 21.14.56.png")
多分#perform:orSendTo:と組み合わせて、RubSmalltalkEditor>>copySelectionが呼ばれるんだろうと想像して、copySelectionが呼ばれている場所を調べる。
![スクリーンショット 2017-03-15 21.26.47.png](https://qiita-image-store.s3.amazonaws.com/0/27218/812e93af-fd1a-e34f-e392-f6362447dcaa.png "スクリーンショット 2017-03-15 21.26.47.png")

少し調べてRubSmalltalkCodeMode class>>menuOn:がクラスブラウザの右クリックで呼ばれることがわかった。
Copyのメニューを２つに増やして試してみる。
![スクリーンショット 2017-03-15 21.32.43.png](https://qiita-image-store.s3.amazonaws.com/0/27218/26f3c4c3-75ac-cdf6-3da6-d84df92b54b9.png "スクリーンショット 2017-03-15 21.32.43.png")

ちゃんとCopyの項目が２つに増えたみたいなのでここで良いようだ。

# メニューに翻訳機能を追加する
コピーの機能を参考にしてitem,keyText,selectorをそれらしく書き換える。おそらくメニューの項目が押されればselectorで指定されたメソッドが起動するはずだ。今追加したTranslateの項目を押して見る。
![スクリーンショット 2017-03-15 21.42.55.png](https://qiita-image-store.s3.amazonaws.com/0/27218/acbfc006-d7de-fc24-0704-36bbfecf3b7a.png "スクリーンショット 2017-03-15 21.42.55.png")

まだここで設定したtranslateSelectionは実装していないからデバッガーが立ち上がるはずだ。
![スクリーンショット 2017-03-15 21.44.31.png](https://qiita-image-store.s3.amazonaws.com/0/27218/ef48fd52-d7d2-f84a-676b-c132daed18a7.png "スクリーンショット 2017-03-15 21.44.31.png")
デバッガーが立ち上がった。デバッガーからtranslateSelection実装しよう。
RubSmalltalkEditor>>copySelectionを見ながら下の様に実装する。
![スクリーンショット 2017-03-15 21.48.16.png](https://qiita-image-store.s3.amazonaws.com/0/27218/1e282989-7274-185c-8121-cc3d104f5440.png "スクリーンショット 2017-03-15 21.48.16.png")

適当な文字列を選択して翻訳してみよう。
![スクリーンショット 2017-03-15 21.54.02.png](https://qiita-image-store.s3.amazonaws.com/0/27218/0b71ee7b-a01c-53ba-eb25-0dc0988489a2.png "スクリーンショット 2017-03-15 21.54.02.png")

動いてるようだ。もう少し弄ればsmalltalkのコードを英語風に変換して翻訳するような機能も追加できると思う。
type: :requestのテストでsign_in/sign_outする

コントローラのテストを書いていて、リクエストの前にユーザログイン状態にしたいとうことはよくあると思います。
type: :controllerでは以下のようにDevise::TestHelpersを読み込むことでテスト内でログインさせることができます。

```ruby:rails-helper.rb
RSpec.configure do |config|
  ...
  config.include Devise::TestHelpers, :type => :controller
end
```

```ruby:some_controller_spec.rb
require 'rails_helper'
RSpec.describe SomeController, type: :controller do
  before do
    user = create(:user) #FactoryGirl
    sign_in user
  end
end
```

しかしながら、[type: :requestではDevise::TestHelpersは使えない](https://github.com/plataformatec/devise/issues/1114)ので独自にsupport内にHelperを書いて読み込むようにすれば上手くいきました。

```ruby:spec/support/request_spec_helper.rb
module RequestSpecHelper

  include Warden::Test::Helpers

  def self.included(base)
    base.before(:each) { Warden.test_mode! }
    base.after(:each) { Warden.test_reset! }
  end

  def sign_in(resource)
    login_as(resource, scope: warden_scope(resource))
  end

  def sign_out(resource)
    logout(warden_scope(resource))
  end

  private

  def warden_scope(resource)
    resource.class.name.underscore.to_sym
  end

end
```

```ruby:rails-helper.rb
RSpec.configure do |config|
  ...
  Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f } #support directoryをrequire
  config.include RequestSpecHelper, type: :request #type: :requestのときにRequestHelperをinclude
end
```

```ruby:some_controller_spec.rb
require 'rails_helper'
RSpec.describe SomeController, type: :request do
  before do
    user = create(:user) #FactoryGirl
    sign_in user #Success!!
  end
end
```
RaspberryPiにraspbian（導入編

# はじめに

インストールOSは RASPBIAN JESSIE LITE とします
最終目標はネットラジオを録音サーバにすること

本家サイト: [Raspberry Pi Foundation](https://www.raspberrypi.org/)

---

# 準備

## ハードウェア

**RaspberryPi3本体**: これが無いと話しにならん(Amazonで買いました)
**microSD card**: Class10を推奨32G(これもAmazonで買った)
**microUSB cable**: 公証2.5Aなので細いと発熱するので注意かもしれん
**LAN cable**: OSがインストールされ無線LANが使用できるまでは必要
**USB keyboard**: OSがインストールされるまでは必要
**HDIM cable**: OSがインストールされるまでは必要

## ソフトウェア

**OSイメージ**: [本家ダウンロードサイトより入手](https://www.raspberrypi.org/downloads/)
**xz utile**: イメージファイルを解凍するのに必要。[ココ](http://tukaani.org/xz/)から手に入れた
**DDwin32imager**: OSイメージをSDカードへ書き込みに使用

## OSイメージの書き込み

- OSイメージをダウンロード  
- イメージを展開

```shell-session:xzコマンド
    DOS> xz.exe -d xxx.img.xz
```

- DDwin32を使ってmicroSD cardにイメージを書き込む

# インストール

ケーブル類を刺す→イメージを書き込んだmicroSDを刺す→電源入れる
だけでインストールは完了

- login: pi
- password: raspberry

★sshdは立ち上がってないので注意!!  

# 設定

## まずはやっておけ

すべて、raspi-configで出来る

- Hostnameの変更
- Localeの変更 ja_JP.UTF-8 UTF-8
- Timezoneの変更 ASIA/Tokyo
- sshdの立ち上げ

多分ここでrebootするはず…

## ユーザー追加

piアカウントでは心許ないのでユーザーを追加しておきましょう

新たにユーザーを追加します

```shell-session:ユーザー追加
raspberry$ sudo adduser --home /home/hoge --uid 1001 --gid 100 hoge
```

作成したユーザーにsudo権限を与えます

```shell-session:sudo権限の付与
raspberry$ gpasswd -a hoge sudo
```

ログインしてみる

```shell-session:新規ユーザーでのログイン
raspberry$ ssh hoge@localhost
```
sudoが使えるか確認

```shell-session:sudoを試す
raspberry$ sudo ls
```

新規ユーザーでログインし直し、piアカウントの無効化します

```shell-session:アカウントの無効化
raspberry$ sudo passwd -l pi
```

| オプション | 機能 |
| ---- | ---- |
| -l | ユーザーをロック |
| -u | ユーザーのロック解除 |
| -S | ユーザーの状態確認 |

## 固定IP化  

/etc/network/interfaceの書き換えでは無いので注意…

/etc/dhcpcd.confに以下を追加

```:dhcpcd.conf
# Add StaticIP on eth0
#
interface eth0
static ip_address=192.168.10.51/24
static routers=192.168.10.1
static domain_name_servers=192.168.10.1
```

設定変更は

```shell-session:dhcpcd設定反映
raspberry$ sudo service dhcpcd reload
```

以下のコマンドでeth0が設定IPになっているかを確認

```shell-session:IPアドレスの確認
raspberry$ ip a
```
ここまでくればモニターやキーボードは必要なくなるはずです…

## OSのアップデート

アップデートをかけましょう…

```shell-session:アップデート
raspberry$ sudo apt-get update  
raspberry$ sudo apt-get upgrade
```

# おわり

これで最低限の設定が終了…
以降は、ネットラジオ録音環境の構築です
Jupyterで文字列から画像を生成する

## インストールされているフォントの確認

#### in[1]
```py3:JupyterNotebook

import matplotlib.font_manager as fm

fonts = fm.findSystemFonts()
for f in fonts:
    font = fm.FontProperties(fname=f)
    print(f, font.get_name())
```
#### out[1]
```text
/usr/share/fonts/truetype/dejavu/DejaVuSansMono-Bold.ttf DejaVu Sans Mono
/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf DejaVu Sans
/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf DejaVu Sans Mono
/usr/share/fonts/truetype/dejavu/DejaVuSerif-Bold.ttf DejaVu Serif
/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf DejaVu Sans
/usr/share/fonts/xkcd.otf xkcd
/usr/share/fonts/truetype/dejavu/DejaVuSerif.ttf DejaVu Serif
```
この出力はPynqでの実行結果なのでインストールされているフォントが少ないです．

## 文字列から画像に変換

#### in[2]
```py3:JupyterNotebook
import IPython
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

import numpy

text = "Helo, world!"

image = Image.new("RGBA", (400, 300))
draw = ImageDraw.Draw(image)
draw.font = ImageFont.truetype("/usr/share/fonts/truetype/DejaVuSans.ttf", 48)

image_size = numpy.array(image.size)
text_size = numpy.array(draw.font.getsize(text))
position = (image_size - text_size) / 2

draw.text(position, text, (0, 0, 0))
```

## 表示

#### in[3]
```py3:JupyterNotebook
image.save("image.png")
IPython.display.Image("image.png")
```

#### out[3]
![Hello.png](https://qiita-image-store.s3.amazonaws.com/0/2448/0d8d93d5-47a0-cb21-049e-684519e9d2e4.png)