OmniAICreator/Qiita-1.07M huggingface dataset:
Gitでcloneしたリポジトリ全てに個人的なファイルのignoreを設定する方法

僕はどうでも良いファイルには、aaa.jsとか付けてコードを試したりするのですが、そういうファイルを設定しておけば、コミット時に選ぶ必要がなくなるので(　・∀・)ｲｲ!!ですね

<font color="Crimson">追記：4/26</font>
コメント欄にて、教えていただいたので追記です。デフォルトの見先は、```~/.config/git/ignore```とのことで、こちらに設定すると良いかと思います。

### デフォルトの置き場所で指定する方法
---

```bash
$ mkdir -p ~/.config/git
$ cat << EOS >> ~/.config/git/ignore
aaa.txt
EOS
```

確認方法

```bash
$ git status --ignored -s
!! aaa.txt
```

<font color="Crimson">※</font>一度でもglobal設定しているとそちらを見てしまうので、デフォルトを見るように戻したい場合、```~/.gitconfig```のcore.excludesfileを削除してください。

### 自分でファイルの置き場を指定する方法
---

自分のホームディレクトリに、.gitignoreファイルを置いておく場合

```bash:
git config --global core.excludesfile ~/.gitignore
```

こちらは、dotfilesをGitHubで管理している人向けでしょうか。

### リポジトリ個別指定もある
---

```bash
.git/info/exclude
```

こちらのリポジトリ個別の方法は知っていたのですが、これだとリポジトリ毎に設定しなければならず辛いなぁと思って使ってませんでした。。。

### その他
---

プロジェクトの.gitignoreを綺麗にしたいという人も少ないと思うので、個人的には、みんな好き勝手に書いても良いと思います。僕は、netbeans使いなので、netbeansのignoreがあるとうれしくなります＾＾

### 色々なignoreサンプル
---

https://github.com/github/gitignore/tree/master/Global

コメントくれた@sakuroさんの記事に書いてあったのですが、こちらもいいですね。全ファイル連結してドカッと指定しておいても良いかもしれませんね。
テキストレイヤーの文字数を取得

```js
#target aftereffects
var myComp = app.project.activeItem;  
var myLayer = myComp.selectedLayers[0];  
var myText=myLayer.property("ADBE Text Properties").property("ADBE Text Document").value;
var Text=myText.toString (myText);
alert(Text.length)
```
![bandicam 2017-04-25 14-28-13-405.jpg](https://qiita-image-store.s3.amazonaws.com/0/178061/2271c97b-66c7-d0af-81b1-fed0bd6d9229.jpeg)
PhpStormでVirtualBox：CentOS7開発環境のリモートデバッグ！

※備忘録的な記事なので詳細省いてます。すんません。

## こんな方向け

プログラムをローカル環境で書いて、それをVM開発環境にアップして動作確認している方

## 環境

### ローカル

* Mac OS X Yosemite（10.10.5）
* PhpStorm 2016.2.1

### VM開発環境

* VirtualBox 4.3.28
* CentOS 7.3.1611
* PHP 5.4
* Xdebug 2.2.0

## 設定

### まずは開発環境の設定

#### VM環境にて必要なパッケージのインストールを行なう

```bash:bash
$ sudo yum install php-pear
$ sudo yum install php-devel
$ sudo yum install gcc gcc-c++ autoconf automake
$ sudo pecl install xdebug-2.2.0 （バージョン指定しないと最新版をインストールしようとするが、最新版はPHP5.4に対応していないのでエラーとなる）
```

#### php.iniに追記

```php.ini:php.ini
...

[Xdebug]
zend_extension=/usr/lib64/php/modules/xdebug.so
xdebug.defaul_enable=1
xdebug.remote_enable=1
xdebug.remote_host='127.0.0.1' ## ローカルを指定している
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
xdebug.remote_autostart=1
xdebug.remote_connect_back=1
xdebug.max_nesting_level=1000
xdebug.idekey='PHPSTORM'
```

※たぶん重複してるのとか、要らない設定書いてる気がします。。。

#### サーバー再起動

```bash:bash
sudo systemctl restart httpd.service
```

### 次にローカルのPhpStorm上での設定

PhpStormメニュー > Preferences にて、

- Languages $ Frameworks > PHP
    - Debug メニュー
        - XdebugエリアのDebug port のポート番号を、先ほどVMで設定した番号と同じものにする（デフォルトで9000）
    - Servers メニュー
        1. + ボタンで追加
        2. Name: にて好きな名前を入力
        3. Host にVM開発環境のIPアドレスを入力
        4. Debugger セレクトメニューで Xdebug を選択
        5. File/Directory にてローカルのプロジェクトフォルダを指定
        6. Absolute path on the server にてVM開発環境のプロジェクト絶対パスを入力
        7. Apply ボタン、OK ボタンをクリックして追加完了
- Run メニュー > Edit Configurations... にて
    1. + ボタンで設定追加
        - Add New Configuration として小さなウィンドウが開くので、そこから PHP Remote Debug を選択
    2. Name: に好きな名前を入力
    3. Servers: に先ほどPreferences にて追加したサーバーを選択する
    4. Ide Key（session id）: に、VM開発環境のphp.iniに記載したideKey（この例の場合はPHPSTORM）と同じものを入力
    5. Apply ボタン、OK ボタンをクリックし追加完了

## デバッグ実行

1. 好きなブラウザでVM開発環境の該当ページにアクセスしておく
2. PhpStormにて、1.に該当するプロジェクトファイルを開いておく
3. 2.のファイルでブレークポイントを設定する
4. PhpStorm の Run メニュー > Start Listening for PHP Debug Connections（もしくはエディタ画面右上にある電話機のようなマーク）をクリック
5. 1.のページをリロードする
6. PhpStorm画面下部でDebug画面が開き、デバッグ詳細を確認できる

## あとがき

時間が出来たら詳細記載・修正追記します。
CLIでjsonをエンコードしてくれるjqコマンド

# 内容

1. curlコマンドでAPI叩いてもレスポンスが文字化けしてつらい
2. jqコマンドっていう便利なツールがあるらしい


## 課題 : ターミナルでcurlコマンドでAPI叩いた時にレスポンスが文字化けする

```zsh

$ curl http://weather.livedoor.com/forecast/webservice/json/v1\?city=130010 | python -m json.tool
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  8249    0  8249    0     0   207k      0 --:--:-- --:--:-- --:--:--  211k
{
    "pinpointLocations": [
        {
            "link": "http://weather.livedoor.com/area/forecast/1310100",
            "name": "\u5343\u4ee3\u7530\u533a"
        },
        {
            "link": "http://weather.livedoor.com/area/forecast/1310200",
            "name": "\u4e2d\u592e\u533a"
        },
        {
            "link": "http://weather.livedoor.com/area/forecast/1310300",
            "name": "\u6e2f\u533a"
        },
        {
            "link": "http://weather.livedoor.com/area/forecast/1310400",
            "name": "\u65b0\u5bbf\u533a"
        },
        {
            "link": "http://weather.livedoor.com/area/forecast/1310500",
            "name": "\u6587\u4eac\u533a"
        },
        {
            "link": "http://weather.livedoor.com/area/forecast/1310600",
            "name": "\u53f0\u6771\u533a"
        },
# 略
```
ぐぬぬ... :thinking: 

# jqというツールを使う

```zsh

$ brew install jq
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> Updated Formulae
kobalt                                                                                                                               makeself

==> Installing dependencies for jq: oniguruma
==> Installing jq dependency: oniguruma
==> Downloading https://homebrew.bintray.com/bottles/oniguruma-6.1.3.sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring oniguruma-6.1.3.sierra.bottle.tar.gz
🍺  /usr/local/Cellar/oniguruma/6.1.3: 17 files, 1.3M
==> Installing jq
==> Downloading https://homebrew.bintray.com/bottles/jq-1.5_2.sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring jq-1.5_2.sierra.bottle.tar.gz
🍺  /usr/local/Cellar/jq/1.5_2: 18 files, 957.9K
➜  ~ which jq
/usr/local/bin/jq
```

もう一回叩く


```zsh

curl http://weather.livedoor.com/forecast/webservice/json/v1\?city=130010 | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  8249    0  8249    0     0   184k      0 --:--:-- --:--:-- --:--:--  187k
{
  "pinpointLocations": [
    {
      "link": "http://weather.livedoor.com/area/forecast/1310100",
      "name": "千代田区"
    },
    {
      "link": "http://weather.livedoor.com/area/forecast/1310200",
      "name": "中央区"
    },
    {
      "link": "http://weather.livedoor.com/area/forecast/1310300",
      "name": "港区"
    },
    {
      "link": "http://weather.livedoor.com/area/forecast/1310400",
      "name": "新宿区"
    }
# 略
```

うん、大丈夫そう。
fishでlistのindexを確認するtestにはcontainsが使える

PHPで言うところの`isset($array[$index])`をfishでどうやるか。

stack overflowなどにはいろいろな方法が載っているが、複雑すぎて理解できないし、書きたくなかった。

# <i class="fa fa-cube"></i> ループでのやりかた

思いつくけどやりたくないやり方

```sh
set list one two three
for value in $list
    if test $value = $argv[1]
        echo "Hit!"
        break
    end
end

```


# <i class="fa fa-cube"></i> containsでのやりかた


[contains:【条件式】単語がリストに入っているかをテスト]

このサイトのリストらへんを見てたんですが、containsへの言及がなく、サイト内をargvで検索したときにたまたま見つけた。
Googleでの検索は厳しいよお。

```sh
set list one two three can
if contains $argv[1] $list
    echo "Hit!"
end
```


# <i class="fa fa-cube"></i> できればこれがしたい

[zsh の配列操作の基本から応用まで - Qiita]

>`${配列名[(r)条件]}`、 `${配列名[(i)条件]}` という形式も使える。
1つ目の方は「条件にマッチした最初の要素を返す」、2つ目の方は「条件にマッチした最初の要素番号を返す」という意味になる。

>
```zsh
arr3=(aaa bbb1 ccc aaa1 bbb2 aaa33)
# bbb で始まる最初の要素を取得する
echo ${arr3[(r)bbb*]} #=> bbb1
# bbb で始まる最初の要素の要素番号を取得する
echo ${arr3[(i)bbb*]} #=> 2
# 見つからなかった場合は最後の要素番号+1になる
echo ${arr3[(i)xxx*]} #=> 7
```

オプションなどの指定は、

[Crystalのコマンドが完全一致で入力しなくても実行されるので中を見た - Qiita]

を見てから前方一致が気に入っているので、できればよかった。



# <i class="fa fa-cube"></i> よくわかんないの

[bash - Easiest way to check for an index or a key in an array? - Stack Overflow]

`[ $array[$key]+abc ]`はfishだと`Invalid index value`でダメだった。

[シェルスクリプトで、配列内の文字列と一致しない場合の処理を記述する | 俺的備忘録 〜なんかいろいろ〜]

なんか違う


[シェルスクリプトで、配列内の文字列と一致しない場合の処理を記述する | 俺的備忘録 〜なんかいろいろ〜]:https://orebibou.com/2015/09/%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%A7%E3%80%81%E9%85%8D%E5%88%97%E5%86%85%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E3%81%A8%E4%B8%80%E8%87%B4%E3%81%97%E3%81%AA/

[bash - Easiest way to check for an index or a key in an array? - Stack Overflow]:http://stackoverflow.com/questions/13219634/easiest-way-to-check-for-an-index-or-a-key-in-an-array

[Crystalのコマンドが完全一致で入力しなくても実行されるので中を見た - Qiita]:http://qiita.com/tbpgr/items/388ce53f6dd091c0b828

[zsh の配列操作の基本から応用まで - Qiita]:http://qiita.com/mollifier/items/f897b3fddd2d10369333#%E6%A4%9C%E7%B4%A2

[contains:【条件式】単語がリストに入っているかをテスト]:http://fish.rubikitch.com/contains/
[Android] dp, px まわりの便利関数

```java:LayoutUtils.java
public abstract class LayoutUtils {

    public static int getDisplayWidthPx() {
        return Resources.getSystem().getDisplayMetrics().widthPixels;
    }

    public static int getDisplayHeightPx() {
        return Resources.getSystem().getDisplayMetrics().heightPixels;
    }

    public static int getDisplayWidthDp() {
        return px2dp(Resources.getSystem().getDisplayMetrics().widthPixels);
    }

    public static int getDisplayHeightDp() {
        return px2dp(Resources.getSystem().getDisplayMetrics().heightPixels);
    }

    public static int dp2px(int dp){
        return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
    }

    public static int px2dp(int px){
        return (int) (px / Resources.getSystem().getDisplayMetrics().density);
    }

    public static int getPxFromDimension(Context context, @DimenRes int resource) {
        return context.getResources().getDimensionPixelSize(resource);
    }

    public static int getDpFromDimension(Context context, @DimenRes int resource) {
        return px2dp(context.getResources().getDimensionPixelSize(resource));
    }
}
```
Realm-cocoa 2.6.2の警告を消す

#はじめに
Realm-cocoa 2.6.2をビルドしようとすると、警告がたくさん出ます。
例えば、

```buffer.hpp
/Users/userName/productName/Pods/Realm/Realm/ObjectStore/src/impl/apple/external_commit_helper.cpp:21:10: In file included from /Users/userName/productName/Pods/Realm/Realm/ObjectStore/src/impl/apple/external_commit_helper.cpp:21:
```

のような警告です。

これらを一気に消す方法について。

#消し方
Build Settingsの"CLANG_WARN_DOCUMENTATION_COMMENTS"をNoに変更します。

(CocoaPodsで導入している場合、Pods > Targets > Realm > Build Settings > 検索窓にCLANG_WARN_DOCUMENTATION_COMMENTSと入れてフィルタして、Yes→Noにします。)

これで出なくなります。

#リンク
https://realm-public.slack.com/archives/C03V755FS/p1492589463388158
Gitのブランチ名をコンソールに表示する方法

いろいろな人が書いているので、再録感満載ですが個人的にも書いておこうかと思います。

[Git本家のセットアップシェル](https://github.com/git/git/tree/master/contrib/completion)

bashとかzshとかあるので、自分の環境に合うものを選んでください。試した環境は、LinuxMintとMacです。

### LinuxMint（Ubuntu）のaptでGitインストールした場合
---

下記をコピペで叩いて、新しくコンソールを開けば適用されてます。

```bash
cat << EOS >> .bashrc

# setup git branch view
PS1='\[\033[1;32m\]\u@\h\[\033[00m\]:\[\033[1;34m\]\w\[\033[00m\]\[\033[1;31m\]$(__git_ps1)\[\033[00m\]\$ '

EOS
```


### 素の環境の場合（Macなど）
---

下記をコピペで実行する場合、.bashrcを読み込んでいる必要があります。
やっていない場合、.bashrcを.bash_profileに置き換えてください。

MacとLinux環境の違いは、 `git-prompt.sh` を呼ぶ必要があるかどうか？です。
linux環境でaptでgit入れてない場合でも、下記のコマンドで動きます。

```bash

cd
wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh
wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash
### zshの場合 wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.zsh

chmod 755 git-prompt.sh
chmod 755 git-completion.bash

cat << EOS >> .bashrc

# setup git branch view
source ~/git-prompt.sh
source ~/git-completion.bash
GIT_PS1_SHOWDIRTYSTATE=true
export PS1='\[\033[1;32m\]\u@\h\[\033[00m\]:\[\033[1;34m\]\w\[\033[00m\]\[\033[1;31m\]$(__git_ps1)\[\033[00m\]\$ '
EOS

```

※追記：2017-06-06　実行権限が付加されてないと色が付かなかったので権限変更追記です。

### コンソールに表示される文字カラーを変えたい場合
---

下記の部分を読んで、カラーコードを変更してください。

- ``` \[\033[1;32m\] ``` ライトグリーン指定のヘッダ（1;32の部分がカラーコード）
- ``` \[\033[00m\] ``` 閉じタグ

http://archive.linux.or.jp/JF/JFdocs/Bash-Prompt-HOWTO-5.html

### かんたんに説明
---
使い方的には、中に書いてあります。↑は説明通りに設定した形となりますね。

```bash
# To use these routines:
#
#    1) Copy this file to somewhere (e.g. ~/.git-completion.bash).
#    2) Add the following line to your .bashrc/.zshrc:
#        source ~/.git-completion.bash
#    3) Consider changing your PS1 to also show the current branch,
#       see git-prompt.sh for details.
```

### Windowsユーザ
---

Windowsは、「Git for Windows」使えばデフォルト表示されるので、そちらを使ってほしいです。bash on windowsがあれば上記手順が使えるかもしれないですが。。。
JOINの前処理のチェック関数

# JOINをするときに気をつけるべき点を返してくれる関数
よく詳細がわからないデータフレームを貰ったときに、
データフレーム内のこの変数を使えば繋がりそうというのは判断できても、
本当にその変数を使って繋げても大丈夫なのか？
ということを判断するために必要そうな情報を返してくれる関数を作ろうと思っています。

## 変数の投入方法
join_check(x側のjoin_key, y側のjoin_key)

## 帰ってくる値
なし
現在は関数内でprint関数で結果を表示しています。
それぞれkey値がユニークかユニークじゃないかを使って、
one by one relation なのか（一対一関係）
one by multi relation なのか（一対多関係）
multi by one relation なのか（多対一関係）
multi by multi relation なのか（多対多関係）
という回答と、ｘ，ｙそれぞれのキー値の内何％が使用されるのかを返します。

## 関数の中身

```r

join_check <- function(x, y ){
  require(dplyr)
  x <- as.character(x)
  y <- as.character(y)
  
  
  x <- data.frame(key = x, x_num = rep(1), stringsAsFactors = F)
  y <- data.frame(key = y, y_num = rep(1), stringsAsFactors = F)
  
  x_nrow <- nrow(x) #x側母数
  y_nrow <- nrow(y) #y側母数
  
  distinct_x_key <- nrow(distinct(x,key))
  distinct_y_key <- nrow(distinct(y,key))
  
  left_unique_flag <- ifelse(x_nrow == distinct_x_key, "Unique","Not Unique")
  right_unique_flag <- ifelse(y_nrow == distinct_y_key, "Unique","Not Unique")
  
  # UNIQUE 対 UNIQUEであれば、一対一になる。
  # 片方がUNIQUEでなければ、そちらを軸にした多対一の関係となる
  # 両方ともUNIQUEでなければ、多対多となる
  
  if (left_unique_flag == "Unique" & right_unique_flag == "Unique"){
    relation_type = "one by one relation"
    a = 1
    # INNER JOIN した結果を左右それぞれの数字比較すれば％が出てくる
    inner_ans <- inner_join(x,y, by = "key", match = all)
    left_percent <- round(nrow(inner_ans)/x_nrow,2)*100
    right_percent <- round(nrow(inner_ans)/y_nrow,2)*100
    
  } else if (left_unique_flag == "Unique" & right_unique_flag == "Not Unique") {
    relation_type = "one by multi relation"
    a = 2
    # left_percent <- right_join して、KEYのユニークな値をカウントすると左の％が出て来る
    # left_percent <- inner_join して、繋がった件数が、rightの接続率になる
    right_ans <- right_join(x,y, by = "key", match = all)
    inner_ans <- inner_join(x,y, by = "key", match = all)
    left_percent <- round(length(unique(right_ans$key)) / x_nrow,2)*100
    right_percent <- round(nrow(inner_ans)/y_nrow,2)*100
    
  } else if (left_unique_flag == "Not Unique" & right_unique_flag == "Unique"){
    relation_type = "multi by one relation"
    a = 3
    # left_percent <- inner_join して、繋がった件数が、rightの接続率になる
    # right_percent <- left_join して、KEYのユニークな値をカウントすると左の％が出て来る
    left_ans <- right_join(x,y, by = "key", match = all)
    inner_ans <- inner_join(x,y, by = "key", match = all)
    left_percent <- round(nrow(inner_ans)/y_nrow,2)*100
    right_percent <- round(length(unique(left_ans$key)) / x_nrow,2)*100
    
  } else if (left_unique_flag == "Not Unique" & right_unique_flag == "Not Unique") {
    relation_type = "multi by multi relation"
    a = 4
　　　　　　　　left_percent <- "検証中"
　　　　　　　　right_percent <- "検証中"
    
  }
  
  print(relation_type)
  print(paste("x側のデータは", left_percent, "%が繋がりました"))
  print(paste("y側のデータは", right_percent, "%が繋がりました"))
}

``` 

これをもとに出してみた結果が下記のものになります。
様々なテーブルで正しいデータが出るか検証予定です。

```r

data_x <- read.csv("あるテーブル1.csv")
data_y <- read.csv("あるテーブル2.csv")

join_check(data_x$join_key, data_y$join_key)
[1] "one by one relation"
[1] "x側のデータは 99 %が繋がりました"
[1] "y側のデータは 39 %が繋がりました"

```
Power BI で "YYYYMMDDHHMMSS"型の日付文字列をdatetimeに変換する

データを入手したときに、型変換で一番最初にやらないといけないのが、日付データです。
この形式が直接変換できる環境も多いですが、PowerBIではデフォルトでは対応していません。

いちいちMスクリプトを書くのは若干面倒ですが、以下のスニペットを使って、さっくり終わらせましょう。

### 変換方法

TextDateTimeという"YYYYMMDDHHMMSS"形式の文字列フィールドがあった場合に以下のようにします。

* 日付へ変換

カスタム列にする場合

```R
Text.Combine({Text.Middle(Text.From([TextDateTime Datetime], "ja-JP"), 0, 4) ,"/" , Text.Middle(Text.From([TextDateTime Datetime], "ja-JP"), 4, 2),"/", Text.Middle(Text.From([TextDateTime Datetime], "ja-JP"), 6, 2) })
```

詳細エディタで直接書く場合

```R
Table.AddColumn(Previous, "date", each Text.Combine({Text.Middle(Text.From([TextDateTime Datetime], "ja-JP"), 0, 4) ,"/" , Text.Middle(Text.From([TextDateTime Datetime], "ja-JP"), 4, 2),"/", Text.Middle(Text.From([TextDateTime Datetime], "ja-JP"), 6, 2) }) , type date)
```

* 時刻へ変換

カスタム列にする場合

```R
Text.Combine({Text.Middle(Text.From([TextDateTime Datetime], "ja-JP"), 8, 2) ,":" , Text.Middle(Text.From([TextDateTime Datetime], "ja-JP"), 10, 2),":", Text.Middle(Text.From([TextDateTime Datetime], "ja-JP"), 12, 2)})
```

詳細エディタで直接書く場合

```R
Table.AddColumn(Previous, "date", each Text.Combine({Text.Middle(Text.From([TextDateTime Datetime], "ja-JP"), 8, 2) ,":" , Text.Middle(Text.From([TextDateTime Datetime], "ja-JP"), 10, 2),":", Text.Middle(Text.From([TextDateTime Datetime], "ja-JP"), 12, 2)}) , type date)
```

カスタム列の場合は次のステップで型変換を行います。詳細エディタで直接M functionを書く場合は型変換まで行われます。

### 参考

[Text.Combine](https://msdn.microsoft.com/en-us/library/mt253358.aspx) 文字列結合M Function

[Text.Middle](https://msdn.microsoft.com/en-us/library/mt637154.aspx) 文字列抽出M Function
任意のオブジェクトの配列をDataTableに変換する

##本題

EntityFrameworkの返り値って配列ですよね。
DataGridViewのDataSourceはDataTableであってほしいですよね。ソートしたいし。

というわけで変換します。

```csharp:IEnumerableExtention.cs
public static class IEnumerableExtention
{
    public static DataTable ConvertDataTable<T>(this IEnumerable<T> items)
    {
        var properties = typeof(T).GetProperties();
        var result = new DataTable();

        // テーブルレイアウトの作成
        foreach (var prop in properties)
        {
            result.Columns.Add(prop.Name, prop.PropertyType);
        }

        // 値の投げ込み
        foreach (var item in items)
        {
            var row = result.NewRow();
            foreach (var prop in properties)
            {
                var itemValue = prop.GetValue(item, new object[] { });
                row[prop.Name] = itemValue;
            }
            result.Rows.Add(row);
        }
        return result;
    }
}
```

##使い方

適当にModelの配列作って実行するだけ。
余計なプロパティが入ってるとよろしくない動きをするかもしれない。

```csharp
// その1 単純に変換
var table1 = default(DataTable)
using (var context = new DataContext())
{
    var tmp = context.Model1.ToArray();
    table = tmp.ConvertDataTable();
}

// その2 匿名型
// もちろんJoinとかの結果でも大丈夫
var table2 = default(DataTable)
using (var context = new DataContext())
{
    var tmp = context.Model2
            .Select(m => new { Column1 = m.Prop1, Column2 = m.Prop2 }).ToArray();
    table = tmp.ConvertDataTable();
}
```

##後書き
リフレクションばりばりなので、実行効率はよくないと思います。
EntityFrameworkの返り値をDataGridViewに投げ込む時に一々変換処理書くのが面倒だっただけですしね。
ただ、匿名型でもしっかり変換かけられるのは地味に楽です。コーディング的な意味で。
~~そもそもWindowsFormでEntityFrameworkっていうのが多分ミスマッチ~~
とはいえ基本的にリテラル書かなくていい、だいたいLinqで済む、というのは素晴らしいですよね。
MySQL コマンドメモ

- 使用するDBを選択
```use データベース名 ```

- DB内のテーブル一覧
```show tables;```
もしくは
```show tables from データベース名;```

- テーブル内のカラム型やデフォルト値等を確認
```desc テーブル名;```

- カラムの追加
```alter table テーブル名 add 新カラム名 カラム型;```

- カラムの削除
```alter table テーブル名 drop column カラム名;```

- カラムを指定した位置に移動
(カラムAのうしろにカラムBを移動)
```alter table テーブル名 modify カラムB カラム型 after カラムA;```

- カラム型の変更
```alter table テーブル名 modify カラム名 データ型;```

- 結合された2つのDBの差分抽出
```select * from テーブル1 as w right join テーブル2 as t on w.カラム名 == t.カラム名;```
レガシーじゃない Slack API のたたきかた

**追記**
Bot user 作るだけならわざわざアプリケーション作らずに [Bot](https://slack.com/apps/new/A0F7YS25R-bots) で十分とコメントもらいましたので追記致します。
他の人の投稿したファイルを削除したい、とか細かい権限が必要なときは App がよいかと思います。

**org**
前の Generate test tokens から作る bot がレガシーレガシー言われて久しいです。
なので新しいやり方はじめました。
簡単でした。

まず Create an App から新しい Slack アプリケーションを作成します。

[Slack API: Applications | Slack](https://api.slack.com/apps?new_app=1)

![スクリーンショット 2017-04-25 10.47.04.png](https://qiita-image-store.s3.amazonaws.com/0/34022/76976ba7-6783-505e-b252-e10e7af412a7.png)

↑
適宜入力。

![２＿スクリーンショット_2017-04-25_10_47_40.png](https://qiita-image-store.s3.amazonaws.com/0/34022/3916e7c1-8583-7054-bc9e-db3b5ffcb2f1.png)

↑
追加されます。

そのあと該当アプリケーションをクリックして、左のメニューから OAuth & Permissions を選択。
Permission Scopes をいくつか選びます。
なんか bot ってのしたらダメだったのでとりあえずメッセージおくれれば良いので、 `chat:write:bot` を追加。↓
※ちゃんとした bot Permission の使い方は公式ドキュメントには書いてる

![スクリーンショット 2017-04-25 10.49.35.png](https://qiita-image-store.s3.amazonaws.com/0/34022/35f00174-7440-c78f-d6b2-305de1d8932c.png)

上の方に Install Team 的なのあるのでそこから Install、Authentication します。
すると、Tokens for Your Team として OAuth Access Token が発行されます。
あとはこれで API を利用して好きなことします。

## golang sample code
```
package main

import (
	"strings"
	"net/http"
	"net/url"
)

/*
	Slack にメッセージを送信します。
*/
func sendSlack(title, msg string) bool {
	requestUrl := "https://slack.com/api/chat.postMessage"
	postData := map[string]string{
		"token":   "xoxp-XXX-XXX-XXXXXX-XXXXXXXXX",
		"channel": "err_replication_bot",
		"text":    title + "\n```" + msg + "```",
	}
	_, err := requestHttp(requestUrl, "post", nil, postData, nil, "")
	if err != nil {
		return false
	}
	return true
}

func requestHttp(requestUrl string, method string, getParam map[string]string, postParam map[string]string, cookie *http.Cookie, userAgent string) (*http.Response, error) {
	var req *http.Request
	var err error
	if strings.ToLower(method) == "post" {
		values := url.Values{}
		if postParam != nil {
			for key, val := range postParam {
				values.Add(key, val)
			}
		}
		req, err = http.NewRequest("POST", requestUrl, strings.NewReader(values.Encode()))
		if err != nil {
			return nil, err
		}
	} else if strings.ToLower(method) == "get" {
		req, err = http.NewRequest("GET", requestUrl, nil)
		if err != nil {
			return nil, err
		}
	}
	// GET parameter
	if getParam != nil {
		values2 := url.Values{}
		for key, val := range getParam {
			values2.Add(key, val)
		}
		req.URL.RawQuery = values2.Encode()
	}
	// Request Header
	if strings.ToLower(method) == "post" {
		req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
	}
	if userAgent != "" {
		req.Header.Add("User-Agent", userAgent)
	} else {
		req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; MAFSJS; rv:11.0) like Gecko")
	}
	if cookie != nil {
		req.AddCookie(cookie)
	}
	// 自動リダイレクトのオフ
	client := http.Client{
		// Go HTTP Client NOT Follow Redirects Automatically.
		CheckRedirect: func(req *http.Request, via []*http.Request) error {
			return http.ErrUseLastResponse
		},
	}
	return client.Do(req)
}
```


おわり。
pandasのdataframeでindexを振り直す方法

dataframeを行削除や結合など操作しているうちにindexが乱れる場合がある．
この場合にindexを0から振り直したい場合はreset_index(drop=True)を使う．


```python:reset_index.py
    rssi_data = rssi_data.reset_index(drop=True)
```

例

```python:before.py
 print window_data.head()
```

```text
               t   dist(8)   dist(9)  dist(10)  dist(11)  dist(12)
13  12:55:26.600  2.362109  2.369736  2.031889  1.240509  0.860399
14  12:55:26.800  2.336146  2.385064  1.986095  1.210598  0.847227
15  12:55:27.000  2.312065  2.412682  1.936422  1.180321  0.835603
16  12:55:27.200  2.289813  2.441181  1.891472  1.154516  0.823569
17  12:55:27.400  2.269342  2.470586  1.850973  1.132922  0.811148
```

index振り直し

```python:after.py
 window_data = window_data.reset_index(drop=True)
 print window_data.head()
```

```text
              t   dist(8)   dist(9)  dist(10)  dist(11)  dist(12)
0  12:55:26.600  2.362109  2.369736  2.031889  1.240509  0.860399
1  12:55:26.800  2.336146  2.385064  1.986095  1.210598  0.847227
2  12:55:27.000  2.312065  2.412682  1.936422  1.180321  0.835603
3  12:55:27.200  2.289813  2.441181  1.891472  1.154516  0.823569
4  12:55:27.400  2.269342  2.470586  1.850973  1.132922  0.811148
```
【C#】intをenumにキャストする方法

今回も備忘録投稿
「intをenumにキャストして」なんて言われて、なんだそりゃ？ってなってたところ先輩が参考になるサイトを教えてくれました。

参考にさせていただいたサイト↓
https://garafu.blogspot.jp/2015/07/c-enum.html
こういうのって忘れた頃にまた使うんですよね。

##intをenumに変換

```animal.cs
public enum animal
{
   cat,
   dog,
   rabbit,
}

var intVal = 2;
var enmVal = (animal)Enum.ToObject(typeof(animal), intVal);
```
zshでdotを打った分だけ上の階層に行くもう一つの方法

`cd`で複数階層上へ移動するために、

```shell-session
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
```

みたいな設定をしている方を見かけますが、個人的には以下の理由で使っていませんでした。

- AUTO_CDを使ってないので、階層を上るときだけ`cd`で始まらないから手に馴染まない。
- `cd ../../../hoge` みたいなのをどうにかはできない。
- ドットの数が増える分だけエイリアスを登録しないといけない。

ただ、やっぱり`cd ../../..`…って毎度やるのは面倒なわけです。

そこで用意したのがこちら。

```zsh
function replace_multiple_dots() {
  local dots=$LBUFFER[-2,-1]
  if [[ $dots == ".." ]]; then
    LBUFFER=$LBUFFER[1,-3]'../.'
  fi
  zle self-insert
}

zle -N replace_multiple_dots
bindkey "." replace_multiple_dots
```

やっていることはZLEを利用して`...`と、3回dotを入力した時点で、`../..`に変換しているだけです。これなら、上記で上げていた不満点はすべて解消してくれます。
<kbd>.</kbd>を打つたびに`../../../..`…って階層をさかのぼってくれるのは結構気持ちいいです。さらに、`cd`以外のコマンドで使用できるのもポイント高いです。
って書いたところで、global aliasを使う手があったかもと気付いたのですが、有効なパス表示に変換しているので<kbd>Tab</kbd>で入力補完ができる分、こちらの方がよさそうです。

zplugから使えるようにプラグイン化もしてあるので、こちらもご利用ください。READMEは後で書きます。
試せていないですが他のプラグインマネージャでも動作すると思います。

[momo-lab/zsh-replace-multiple-dots](https://github.com/momo-lab/zsh-replace-multiple-dots)

```zsh:using_zplug
zplug "momo-lab/zsh-replace-multiple-dots"
```
技術書読書会 #8 Infrastructure as Code

# 技術書読書会 #8 Infrastructure as Code

## 読書会とは
「本は人に貸してはならない。貸せば戻ってこないからだ。私の書斎に残っている本といったら、そうやって人から借りたものばかりだ。」とフランスの詩人が言っていました。( ﾟДﾟ)

本日より参考書は人に貸さないことにしました。

技術書を最後まで読み切る事は意外と大変です。一人なら無理だけどみんなの力があればできるかも・・・。
そんなことを誰が思たのか、ともあれそんな気持ちに賛同したメンバーが１冊の技術書を読み込むという結構ハードルの高いことにチャレンジをしていきます。

## 技術書読書会の進め方
eXtreme Readingの方式で進めていきます。

### 実施方法
以下の流れで読書をしていきます。

```
1. 0分～5分間で、今回読み進める章/節を発表する
2. 15分～30分間で、読書
3. 5分～10分間で、ディスカッション
4. 1～3を時間分繰り返す
5. まとめ
```

今回の読書会は、所要時間30分で以下の配分で行いました。

```
1. 5分間で、今回読み進める章/節を発表する
2. 15分間、読書
3. 5分間、ディスカッション
4. 10分間、まとめ
```

### 利点
eXtreme Readingの利点です。

- 事前の準備がいらない。
- ディカッションをすることにより理解を深める事ができる。参加者全体の理解度の底上げが期待できる。
- 時間を区切って進行するので、読書の進捗が一定となり本の読み終わり時期を予測することができる
- みんなでやればなんとかなる


## 今回読む書籍
[Infrastructure as Code ―クラウドにおけるサーバ管理の原則とプラクティス](
https://www.amazon.co.jp/Infrastructure-Code-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%B5%E3%83%BC%E3%83%90%E7%AE%A1%E7%90%86%E3%81%AE%E5%8E%9F%E5%89%87%E3%81%A8%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9-Kief-Morris/dp/4873117968/ref=sr_1_1?ie=UTF8&qid=1491455639&sr=8-1&keywords=Infrastructure+as+Code)

## 参加人数
6人

## 所要時間
30分

## 進捗
4 - 4.2.3

## ディスカッション

### 4.1 自動化されたサーバー管理の目標
岡　インフラストラクチャ定義ツールと同じような目標
峯　まあ、そうなるよね。

### 4.2 さまざまなサーバー管理機能に対応するツール
峯　サーバーテンプレートをパッケージングしてあらかじめ作ったほうが良いのか？今のところCloudformationにゴリゴリ書いている

### 4.2.2 サーバーの構成/設定のためのツール
峯　全部次の章では・・・。
岡　AnsibleのPush型は、セキュリティーが犠牲になっているという部分が気にはなりました。ただ詳しくは8章へ・・・。
峯　サソリのマークの部分で、プルモデルならセキュリティーは単純化されるが、悪用のチャンスはあるってあるんだよね。
峯　多分筆者は、どちらが良いとは言いたくないんだと思う。
飯　つまり、頑張れと！

### 4.2.３ サーバーテンプレートのパッケージングのためのツール
岡　packerって何？

```
Build Automated Machine Images
https://www.packer.io/

様々なプラットフォーム向けの仮想マシンイメージを、１つのイメージから自動的に変換するツールです。
軽量でありながら並列にイメージを生成できます。新しいマシンイメージを作成した後の定型作業を自動化もできます。
https://www.creationline.com/hashicorp/products
```

峯　AWSでいうとAMIを作るツール。4.2のサーバーテンプレートをパッケージングするという部分
岡　packerの定義ファイルもバージョン管理するということになるのか。
峯　タグ付けをして全部引っ張れるようにって、前にあった気がするんだけど、こういったツールを色々使った場合、各ツールの定義ファイルがどのバージョンだったかをひもつけするのが大事なんだと
飯　タグ重要ですね。

## 気づき

## まとめ
本日の部分は、サマリー的な内容のため、詳しい内容は書かれていなかった。
なので、さらっと終わった。
対数(log)を利用する理由


##目的
Kaggleのサイトで、[とある方のソースコード](https://www.kaggle.com/currie32/d/dalpozz/creditcardfraud/predicting-fraud-with-tensorflow/discussion)を参照し、それの見方を私なりに理解しようと思いまして、ここに記録致します。

環境はPython 3、matplotlibとpandasを利用しています。

今回は対数(log)について私なりに理解しようと思います。
対数(log)を社会人になって10年1度も使ったことがありません。
学生のときに勉強した薄い記憶だけはあります。

そこでなぜ対数(log)が必要かを調べてみました。
[地震の震度とマグニチュードの違い？単純明快に！](http://kenyu.red/archives/2719.html)を読みました。

数値が、あまりに大きくて扱いにくいときに対数(log)を使って扱いやすくするそうです。


##対数（log）を使わない状態

対数(log)を使わないとこのような形になります。
ヒストグラムの大半が表示されておらず、何が何だかよく分かりません。
※このソースコードは[こちら](https://www.kaggle.com/currie32/d/dalpozz/creditcardfraud/predicting-fraud-with-tensorflow/discussion)を参考にしております。

```python:
import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_csv("./creditcard.csv")

f, (ax1, ax2 ) = plt.subplots(2, 1, sharex=True, figsize=(12,4))

bins = 30

ax1.hist(df.Amount[df.Class == 1], bins = bins)
ax1.set_title('Fraud')

ax2.hist(df.Amount[df.Class == 0], bins = bins)
ax2.set_title('Normal')

plt.xlabel('Amount ($)')
plt.ylabel('Number of Transactions')

plt.show()
```

![image](https://qiita-image-store.s3.amazonaws.com/0/177123/6f49b803-4226-60b0-33dd-292667a0ba5d.png)


##対数（log）を使った状態
対数(log)を使わないときのソースコードに対して以下を付与します。

>plt.yscale('log')



```python:
import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_csv("./creditcard.csv")

f, (ax1, ax2 ) = plt.subplots(2, 1, sharex=True, figsize=(12,4))

bins = 30

ax1.hist(df.Amount[df.Class == 1], bins = bins)
ax1.set_title('Fraud')

ax2.hist(df.Amount[df.Class == 0], bins = bins)
ax2.set_title('Normal')

plt.xlabel('Amount ($)')
plt.ylabel('Number of Transactions')
plt.yscale('log')
plt.show()
```

![image](https://qiita-image-store.s3.amazonaws.com/0/177123/f1cc64c5-8a3a-46bf-6b8f-d8202b82c3a7.png)


対数(log)を使わないときよりも、使っているときの方がどことなく全体の傾向が見えることが、これで分かりました。
最新版のLinuxカーネルをコンパイルしてインストールする for CentOS7.3


細心のカーネルモジュールをインストールする方法です。
CentOS7.3に4.10.12のカーネルをソースからコンパイルしてインストールする方法をお伝えします。

カーネルのソースは以下から確認可能です。
http://www.kernel.org/

##バージョン情報
| 製品 | バージョン |
|:-:|:-:|
| ディストリビューション  | CentOS7  |
| インストールカーネル  | 4.10.12  |

##事前準備
make menuconfigを実行するために、あらかじめ以下をインストールしておく
また、OpenSSLも状況によっては必要なのでインストールしておく

```
rpm -ivh ncurses-devel-5.9-13.20130511.el7.x86_64.rpm
```

[OpenSSL(1.0.x)をインストールする（ソースからコンパイル）for CentOS 7.2](http://qiita.com/shadowhat/items/68fd55b532c04b13acf5)


##カーネルモジュールのインストール

```bash:
cd /usr/local/src
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.10.12.tar.xz
tar Jxvf linux-4.10.12.tar.xz
cd linux-4.10.12
```

既存のカーネルコンパイル情報をコピーする

```bash:
cp /usr/src/kernels/3.10.0-514.el7.x86_64/.config .
```

カーネルパラメーターを変更したい場合は、menuconfigを実行しパラメーターを変更する

```bash:
make mrproper
make menuconfig
```

インストール

```bash:
make -j 4
make modules_install
make install
```

※昔は以下をやる必要があったが、いまは自動でやってくれる。

```bash:
make bzImage
mkinitrd /boot/initramfs-4.10.12.img 4.10.12
```

##確認と起動確認

/bootを確認する

```bash:
[root@localhost boot]# ls
System.map
System.map-3.10.0-514.el7.x86_64
System.map-4.10.12
config-3.10.0-514.el7.x86_64
grub
grub2
initramfs-0-rescue-67735d0e0a0f4a088d2270b1605cc7c9.img
initramfs-3.10.0-514.el7.x86_64.img
initramfs-3.10.0-514.el7.x86_64kdump.img
initramfs-4.10.12.img
initrd-plymouth.img
symvers-3.10.0-514.el7.x86_64.gz
vmlinuz
vmlinuz-0-rescue-67735d0e0a0f4a088d2270b1605cc7c9
vmlinuz-3.10.0-514.el7.x86_64
vmlinuz-4.10.12
```

「vmlinuz-4.10.12」と「initramfs-4.10.12.img」が存在することを確認する。


##自動起動するカーネルジュールを選択する。

現行の自動起動設定を確認する

```bash:
grub2-editenv list
#出力結果↓
saved_entry=CentOS Linux (3.10-0-514.el7.x86_64) 7 (Core)
```

一度再起動して起動メニューを確認する
![image](https://qiita-image-store.s3.amazonaws.com/0/85495/4943eb31-5218-e463-dd83-82d9a69e7cb2.png)

今回は、1番上のカーネルモジュールから起動したい。
一番上は、番号「0」になるため、パラメーターは0を投入

```bash:
grub2-set-default 0
```



```bash:
grub2-editenv list
#出力結果↓
saved_entry=0
```

尚、「/etc/grub2.cfg」ファイルを操作することはない。


##参考
http://enakai00.hatenablog.com/entry/2015/11/27/152442
Github | PR を作らずにブランチの差分を共有する

# 「New pull request」 から比較したいブランチ同士を選ぶ

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/9d8137ff-29d7-5ce3-f148-61eba8b35ac0.png)

# 特定のURLが付く

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/080186c3-1194-cbfe-b550-c5e7447e1c67.png)

# これを共有すれば良い

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/ae9d6455-76b3-c955-355d-79ebc5133d88.png)

# 余談

「こんなのあればいいな」と思っていた機能が、既にあった。
2年ほどまったく気付かなかった。

# メリット

- URL指定で簡単に共有できる。
- PRを作らずに作業状況だけを伝えることが出来る。
- 他のどんなツールより見やすいGithubの差分表示を使える。








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Visual Studio / WPF > Error: 'ObservableCollection<>' が見つかりませんでした > using System.Collections.ObjectModel; を追加する

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

```csharp
            var data = new ObservableCollection<Member>(
                Enumerable.Range(1, 5).Select(i => new Member
                {
                    Name = "A",
                    Species = 0,
                    Age = 20,
                    comment = "TEST",
                }));
```

> 重大度レベル	コード	説明	プロジェクト	ファイル	行	抑制状態
エラー	CS0246	型または名前空間の名前 'ObservableCollection<>' が見つかりませんでした (using ディレクティブまたはアセンブリ参照が指定されていることを確認してください)。	

上記のエラーに対しては`using　System.Collections.ObjectModel;`を追加することで対応できる。
php7.1のインストール


brewを使って入れることも可能みたいですが、その場合は必要なモジュールがかけてしまっていたりするそう。
なので、下のサイトに従って入れる方が賢明。

https://php-osx.liip.ch/

```
curl -s https://php-osx.liip.ch/install.sh | bash -s 7.1
```
VirtualBoxトラブルシュート(Windows10Pro)　メモ

サーバー側からもらったVirtualBox用のファイルが起動せず、ブルーバックになったので
やった事をづらづらメモる

## １．アンインストールしてからインストール

　結果：**VirtualBoxを起動させるとブルーバック**

## ２．レジストリやライブラリを削除
　
　■ライブラリ
　　下記、パスからVirtualBox関係の削除ファイルを削除する
　　●パス：C:\Windows\system32\drivers\
　　●削除ファイル：
　　　▼**vboxdrv.sys**
　　　▼**vboxnetadp.sys**
　　　▼**vboxnetflt.sys**
　　　▼**vboxusbmon.sys**
　　　▼**vboxusb.sys**

　■レジストリ
　　●Windowsボタンを押して、「プログラムとファイルの検索」の入力欄に**regedit** と入力すると
　　　**regedit.exe**が表示されるので、実行する。

　　●HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\　までフォルダのツリー開き、
　　　その中にある下記フォルダを削除（※自己責任でお願いします。）
　　　▼**VBoxDrv**
　　　▼**VBoxNetAdp**
　　　▼**VBoxNetFlt**
　　　▼**VBoxUSBMon**
　　　▼**VBoxUSB**

　参照：https://dottech.org/101997/how-to-uninstall-virtualbox-drivers-on-windows/

　結果：**VirtualBoxを起動させるとブルーバック**

## ３．ログ等の検索
   ホームフォルダ（自分のユーザーフォルダ）内にある.VirtualBoxフォルダ内をチェック or
   VirtualBox VMsフォルダ内にある起動するファイル名のフォルダ内にあるログを見る。

　結果：特に何もなし
　
## ４．ネットワークアダプターを削除
　　手順：
　　　　１．「コントロールパネル」→「システム」→左にある「デバイスマネージャー」をクリック
　　　　２．「ネットワークアダプター」→VirtualBoxが使用しているアダプターを選択して右クリック
　　　　　　→「削除」をクリック

　
　結果：**VirtualBoxを起動させるとブルーバック**

## ５．VirtualBoxをアンインストール上記２~４を試す

　結果：**VirtualBoxを起動させるとブルーバック**

## ６．Hyper-Vのサービスを使用しないようにする。
　「コントロールパネル」→「プログラムと機能」→左側にある「Windowsの機能の有効化または無効化」→
　「Hyper-V」のチェックボックスをはずす→「OK」をクリック
　（再起動を促されるかもしれないので他のアプリを落としてください）

　参照：http://stackoverflow.com/questions/20019231/vt-not-supported-when-installing-haxm

　![Hyper-V停止.png](https://qiita-image-store.s3.amazonaws.com/0/17904/3519ba14-0a0d-e465-0222-04b47340e16f.png)


　結果：**VirtualBox起動成功**
(自分メモ)Linux 検索コマンド　修正中

# よく使う検索コマンド

grep -R -e -i edit *
grep -R -e 'メール送信'
-R
各ディレクトリの下にあるすべてのファイルを再帰的に読み込みます。
これは -d recurse オプションと等価です。

-e
PATTERN  をパターンとして指定します。 - で始まるパターンを保護するために有効です。

-i
アルファベットの大文字、小文字を区別しない

find / | grep edit
「/」直下でeditを検索する
AndroidでreleaseビルドなのにBuildConfig.DEBUGがtrueになってハマった


こんにちはsekitakaです。

# ハマったこと
開発中のアプリのrelease用のビルドでログを出力して調査をする必要がありました。
そこでappモジュールの`build.gradle`でreleaseビルドタイプの`debuggable`を`true` にしました。

```build.gradle
buildTypes {
    release {
        debuggable true
        // 他略
    }
}
```

するとログは出力されるようになりましたが、一部の設定値だけdebug用のものが使われるようになってしまいました。
色々調べたところ、影響を受けた設定値の出し分けには `BuildConfig.DEBUG`が使用されていました。
今考えると当然なのですが、`debuggable`を`true`にすると`Build.DEBUG`が`true`になります。
その結果期待した出し分けになっていませんでした。

# 結論
サーバーの接続先などの情報はデバッグかどうかに関わらず、BuildConfig.BUILD_TYPE と BuildConfig.Flavor によって出し分ける方がよいでしょう。

Build Variant を `release`と`build`の二種類しか使っていないと混同しがちですが、BuildConfig.BUILD_TYPEとBuildConfig.DEBUGは正しく使い分けましょうというお話でした。
(PostgreSQL)　テーブル情報を取得するSQL　等

たまに使う構文・ＳＱＬいろいろ

pg_hba.conf の場所を調べる

```
psql -U postgres -c 'SHOW hba_file;';
```

```SQL
SELECT 
        * 
FROM 
        information_schema.columns 
WHERE 
        table_name = 'テーブル名' 
ORDER BY 
        ordinal_position;
```

クライアントエンコーディングを指定してcsv出力

```SQL
SET CLIENT_ENCODING TO 'euc_jp';
copy (select * from hoge where ...) to '/tmp/dump.csv' (format csv);
```

タイムゾーン変換

```SQL
select current_date at time zone 'Asia/Tokyo'
```

時間のかかっている実行中クエリーをすべてキャンセル

```SQL
psql -c "SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE state='active' and query_start < current_timestamp - interval '1 minutes';"
```
TPI NEXT®導入による品質管理のプロセス改善の成果

こんにちは、ノハナで品質管理を担当している田井です。

今回は、弊社の品質管理グループで2016年10月から2017年3月までの半期で取り組んできましたTPI NEXT®について、ご報告を行いたいと思います。

## TPI NEXT®とは？
まず、簡単にTPI NEXT®とは何かをご説明したいと思います。
TPI NEXT®とは品質管理の一環で、オランダのSogeti社が提案したテストプロセス改善モデルです。日本語訳の本も発売されており、日本でも認知度が徐々に高まっているモデルです。
弊社では昨年の「JaSST'16 Tokyo」というイベントでTPI NEXT®を知り、プロセスを改善することでアプリの品質を高めることができるのではないかということで導入しました。
レベルが初期レベル、コントロールレベル、効率化レベル、最適化レベルと4つあり、グループが「利害関係者との関係」、「テスト管理」、「テスト業務の専門性」の3つあります。この3つのグループの中にキーエリアというものが合計16個あります。各キーエリアにはチェックポイントが幾つかあり、チェックポイントに答えていくことにより、各キーエリアごとにどのレベルにいるのかがわかります。
![スクリーンショット-2017-04-12-11.38.10-1024x362.png](https://qiita-image-store.s3.amazonaws.com/0/151058/f641a494-aca1-ac78-6ad9-c6b83602396e.png)

TPI NEXT®の詳細は[「TPI NEXT®導入による品質管理のプロセス改善について」](http://qiita.com/taikohei/items/7ea2b8e15d7c13348055)もご覧ください。

## 目標設定
2016年下期(2016年10月から2017年3月までの6ヶ月間)は、テスト業務に密接である「テスト管理」と「テスト業務の専門性」をすべてコントロールレベルにするという目標を立てました。対象となるキーエリアは全部で10個(2個はコントロールレベル達成済)あり、各チェックポイントに対して優先度をつけ、コントロールレベルに到達するにはどのような施策を行えばよいかをグループ内で検討し、実際に施策を1つずつ実施していきました。
![スクリーンショット-2017-04-06-17.02.30-1024x532.png](https://qiita-image-store.s3.amazonaws.com/0/151058/d8495d9d-2a32-f496-a1c9-b1d05b33e0b2.png)


## 改善前
改善前の弊社の状況を見ていただきましょう。下のレーダーチャートにはキーエリアが16個ありますが、今回対象となるのは、「テストプロセス管理」から「テスト環境」までの10個です。
ご覧の通り、到達レベルに大きな差があることが分かると思います。特にメトリクスに関しては初期レベルにも達してないという状況(0%)でした。
![2016H2実施前-1024x652.png](https://qiita-image-store.s3.amazonaws.com/0/151058/2247c7e1-d12a-4f5e-8367-7b353d612e37.png)

## 改善後
細かい施策についてはここでは省略しますが、結果としてすべての施策を実施することができました。
下のレーダーチャートが2017年3月末の状況です。改善前と比較していただくとわかると思いますが、「テストプロセス管理」から「テスト環境」までが、すべてコントロールレベルに到達したことがわかります。
![2016H2実施後-1024x652.png](https://qiita-image-store.s3.amazonaws.com/0/151058/7f233b5d-f124-be8c-9e14-348541b72f5e.png)


## 終わりに
2016年下期は目標を達成することができました。しかし、TPI NEXT®は継続的な作業です。2017年上期の目標については、チェックポイントの再チックを行い、2016年下期に実施した改善施策を実施し、成果を出すことを目標としています。
また、注意しておかなくてはいけないことは、TPI NEXT®を達成することを目標としてはいけないということです。
そういった点を踏まえながら、今後もテストプロセス改善に取り組んでいきたいと考えております。
FLOCSS のコンポーネントを作ってみた


2017/04/26追記
[GitHub](https://github.com/DesignChips/FLOCSS-Component)に公開しました。

## コンポーネントに含める要素

- margin, padding(mb10など)
- flex関連
- absolute関連
- clearfix
- background-image
- 横スクロールする要素

## margin, padding
0pxのpxは不要なのでfor文の外で書いてます。

```scss:_space.scss
.mt0 { margin-top: 0 !important; }
.mb0 { margin-bottom: 0 !important; }
.pt0 { padding-top: 0 !important; }
.pb0 { padding-bottom: 0 !important; }

@for $i from 1 through 6 {
	.mt#{$i * 5} { margin-top: 5px * $i !important; }
	.mb#{$i * 5} { margin-bottom: 5px * $i !important; }
	.pt#{$i * 5} { padding-top: 5px * $i !important; }
	.pb#{$i * 5} { padding-bottom: 5px * $i !important; }
}
```

## flex
```scss:_flex.scss
.flex {
	display: flex;
	flex-wrap: nowrap;
	justify-content: space-between;
	align-items: center;
}
.flex-center {
	display: flex;
	flex-wrap: nowrap;
	justify-content: center;
	align-items: center;
}
.flex-start {
	display: flex;
	flex-wrap: nowrap;
	justify-content: flex-start;
	align-items: center;
}
.flex-end {
	display: flex;
	flex-wrap: nowrap;
	justify-content: flex-end;
	align-items: center;
}
.flex-vertical {
	flex-flow: column;
	align-items: flex-start;
}

```

## absolute
topとbottomは、実際はrelativeになっているdivの余白に合わせて調整することが多いので必要ないかもしれません。

```scss:_absolute.scss
.relative {
	position: relative;
}
.absolute {
	position: absolute;
}
.absolute-center {
	width: 100%;
	height: 100%;
	margin: auto;
	position: absolute;
	top: 0;
	right: 0;
	left: 0;
	bottom: 0;
}
.absolute-left {
	position: absolute;
	left: 0;
}
.absolute-left-top {
	position: absolute;
	top: 0;
	left: 0;
}
.absolute-left-bottom {
	position: absolute;
	left: 0;
	bottom: 0;
}
.absolute-right {
	position: absolute;
	right: 0;
}
.absolute-right-top {
	position: absolute;
	top: 0;
	right: 0;
}
.absolute-right-bottom {
	position: absolute;
	right: 0;
	bottom: 0;
}
.absolute-top {
	position: absolute;
	top: 0;
}
.absolute-bottom {
	position: absolute;
	bottom: 0;
}
```

## clearfix
```scss:_float.scss
.left {
	float: left;
}
.right {
	float: right;
}
.clearfix:before,
.clearfix:after {
	content: '';
	display: block;
	clear: both;
}
```

## background-image
positionを上書きする可能性があるので、ショートハンドにはしない方がいいと思いました。

```scss:_bg-image.scss
.bg-image {
	width: 100%;
	height: 100%;
	background-position: center;
	background-repeat: no-repeat;
	background-size: cover;
}
```

## 横スクロール
```scss:_scroll.scss
.scroll {
	white-space: nowrap;
	overflow-x: scroll;
	overflow-y: hidden;
	-webkit-overflow-scrolling: touch;
}
.scroll-vertical {
	white-space: nowrap;
	overflow-x: hidden;
	overflow-y: scroll;
	-webkit-overflow-scrolling: touch;
}
```

## 参考

[レイアウト・パーツで使える | Web制作者のためのSassの教科書 - 公式サポートサイト](http://book.scss.jp/code/c5/03.html)
jupyter notebookのJSONバージョンを下げてipython notebookで読み込み

新しいjupyter-notebookで作成したnotebook（json4）は，
古いipython notebook（json3のみ）では読み込めません．

そこで変換します．

```bash:ipython版
ipython nbconvert --to notebook --nbformat=3 foo.ipynb
```

```bash:jupyter版
jupyter-nbconvert --to notebook --nbformat=3 foo.ipynb
```

これで`foo.v3.ipynb`が作成されるので，ipython notebookで読み込めます．
SQLServer: テーブルの各インデックスの最新アクセスが、どのクエリによって行われたか推定する

特定のテーブルに張ってある各インデックスって、どんなクエリ実行によってアクセスされているのか分からないことがあると思います。
そういうときに、どうにかDMVを使ってインデックスとクエリを紐付けられないかなと試行錯誤してみました。

インデックスの最新のアクセス日時と、クエリの最新の実行時間をjoinでくっつけることで、それなりの精度で取得できるクエリがつくれました。

```sql
declare @TableName varchar(100)
set @TableName = 'テーブル名'

select
  *
into
  #TmpStats
from
(
  select
     OBJECT_NAME(i.object_id) as tableName
    ,i.name as indexName
    ,ps.row_count as rowCnt
    ,ps.reserved_page_count * 8.0 / 1024 as 'size(MB)'
    ,type_desc
    ,us.*
  from
    sys.dm_db_partition_stats as ps
  left join sys.indexes as i on ps.object_id = i.object_id and ps.index_id = i.index_id
  left join sys.dm_db_index_usage_stats as us on ps.object_id = us.object_id and ps.index_id = us.index_id
  where
    OBJECT_NAME(i.object_id) = @TableName
    --last_execution_timeとテーブルへのアクセス日時でぶつける。完璧な精度ではないけど
) as A
join
(
  select
     total_worker_time / qs.execution_count / 1000 as 'Average CPU used(ms)'
    ,total_worker_time / 1000 as 'Total CPU used(ms)'
    ,qs.execution_count as 'Execution count'
    ,SUBSTRING(qt.text, qs.statement_start_offset / 2, (
        case 
          when qs.statement_end_offset = - 1
            then LEN(CONVERT(nvarchar(MAX), qt.text)) * 2
          else qs.statement_end_offset
          end - qs.statement_start_offset
        ) / 2) as 'Individual Query'
    ,qt.text as 'Parent Query'
    ,DB_NAME(qt.dbid) as 'DatabaseName'
    ,last_execution_time
    ,creation_time
    ,total_elapsed_time / 1000 as 'Total Duration(ms)'
    ,total_elapsed_time / qs.execution_count / 1000 as 'Average Duration(ms)'
    ,plan_handle
  from
    sys.dm_exec_query_stats qs
  cross apply sys.dm_exec_sql_text(qs.sql_handle) as qt
  where
    qt.text like '%' + @TableName + '%'
) as b on a.last_user_seek = b.last_execution_time
       or a.last_user_scan = b.last_execution_time
       or a.last_user_lookup = b.last_execution_time

select
  *
from
  #TmpStats
cross apply sys.dm_exec_query_plan(plan_handle) as qp

drop table #TmpStats
```

間違ったレコードも取れてきちゃいますが、、もっと良い方法をご存知の方がいれば教えていただけると嬉しいです。
JSXのコンポーネントを分割してコードをスッキリさせる

React+Reduxでの開発をしていて気づいたらコンポーネントが肥大化してるので、これを分割してスッキリさせたい。

# コンポーネントの例
こんな感じで書かれたコンポーネントがあるとする。
`aaa` と `bbb` を分割してやりたい。

```
const Hoge = () => (
  <div>
    <div>
      aaa
    </div>
    <div>
      bbb
    </div>
  </div>
)
```

# 分割方法
こんな感じにすれば `Hoge` がスッキリする。

```
const RenderA = () => (
  <div>
    aaa
  </div>
);

const RenderB = () => (
  <div>
    bbb
  </div>
);

const Hoge = () => (
  <div>
    <RenderA />
    <RenderB />
  </div>
)
```

# まとめ
コンポーネントを分割してコードを読みやすく保ちましょう。

# 変更履歴
1. 関数で書くよりもタグを使うほうが良いというコメント頂いたので修正しました。 2017/04/26
最近のLinuxでよく使う小技 for CentOS7.3

CentOSも7になり、だいぶ昔のコマンドが使えなくなってきました。
また、新しい操作も増えてきているので、ジャンルに関係なく最近よく使うコマンドをまとめたメモを置いておきます。

##tar.xzファイルを解凍する

```bash:
tar Jxfv ファイル名.tar.xz
```

※tar1.22以降で対応

もしくは、

```bash:
xz -dc xxx.tar.xz | tar xfv -
```

##キーボードのマッピングを変更する

```bash:
localectl set-keymap jp106
```

##キーボードマッピングを確認する

```bash:
localectl status
```

##XWindowを日本語で表示する

```
vi /bin/startx
```

上部に以下を追加

```
export LANG=ja_JP.UTF-8
```
NTPサーバ起動コマンド

# NTPサーバ起動コマンド

■現状確認
ss -antup | grep  123
ps ax | grep ntp
ps -ef | grep ntp

■grepしかない場合は起動していない
25705 pts/1    S+     0:00 grep --color=auto ntp

■起動コマンド
systemctl start ntpd

■確認
[root@localhost ~]# ps ax | grep ntp
25799 ?        Ss     0:00 /usr/sbin/ntpd -u ntp:ntp -g
25884 pts/1    S+     0:00 grep --color=auto ntp
[root@localhost ~]# ss -antup | grep  123
udp    UNCONN     0      0      192.168.122.1:123                   *:*                   users:(("ntpd",pid=25799,fd=20))
udp    UNCONN     0      0      192.168.100.2:123                   *:*                   users:(("ntpd",pid=25799,fd=19))
udp    UNCONN     0      0      127.0.0.1:123                   *:*                   users:(("ntpd",pid=25799,fd=18))
udp    UNCONN     0      0         *:123                   *:*                   users:(("ntpd",pid=25799,fd=16))
udp    UNCONN     0      0      fe80::20c:29ff:febf:a94d%eno16777984:123                  :::*                   users:(("ntpd",pid=25799,fd=22))
udp    UNCONN     0      0       ::1:123                  :::*                   users:(("ntpd",pid=25799,fd=21))
udp    UNCONN     0      0        :::123                  :::*                   users:(("ntpd",pid=25799,fd=17))

■サーバ起動後、サービス起動
systemctl enable ntpd

■サービスステータス確認
systemctl status ntpd
Laravel5系blade中でassetファイルのlastModified追加


タイトルまんまですがmix（elixir）などでapp.cssやapp.jsを更新してもデフォルトのテンプレートではキャッシュを読んでしまったりします。


```html
<link href="{{ asset('css/app.css') }}?ver={{ File::lastModified('css/app.css') }}" rel="stylesheet">
```

```html
<script src="{{ asset('js/app.js') }}?ver={{ File::lastModified('js/app.js') }}"></script>
```

ファサードが使えることが前提だしもっといい他の方法があるのかもしれないですがとりあえずこれで解決してます。
Visual Studio / WPF > IDE > イベントハンドラーへ移動

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

@ WPF 4.5入門 by 大田一希さん
No.2935 / 9985

> XAMLでClickイベントに任意のメソッド名を入力して右クリックメニューの「イベントハンドラーへ移動」を選択することでもイベントハンドラーを作成できます。

```xml:XAML
<Window x:Class="_170425_t0714_width_various.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_170425_t0714_width_various"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <Button Width="100" Content="Button100" Click="Button_Click"/>
            <Button Width="3in" Content="Button3in"/>
            <Button Width="10cm" Content="Button10cm"/>
            <Button Width="50pt" Content="Button50pt"/>
            <Button Width="Auto" Content="ButtonAuto"/>
        </StackPanel>
    </Grid>
</Window>
```

上記にて`<Button Width="100" Content="Button100" Click="Button_Click"/>`の`Click="Button_Click"`を足して右クリックメニューの「イベントハンドラーへ移動」で該当のCSに移動できた。
`F12`でも移動可能。

IDEのポップアップヒントでも移動できる旨が表示されたが、それが表示されるトリガ条件は不明。
再度試したらポップアップヒントは表示されない。
Visual Studio / WPF > コントロール > レイアウト > Widthの指定の仕方 > 100 | 3in | 10cm | 50pt | Auto | 比率指定:"2*"

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

@ WPF 4.5入門 by 大田一希さん
No.2764 / 9985

WidthやHeightなどでの値の指定の仕方を色々紹介されている。

Buttonで試してみた。

````xml:XAML
<Window x:Class="_170425_t0714_width_various.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_170425_t0714_width_various"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <Button Width="100" Content="Button100"/>
            <Button Width="3in" Content="Button3in"/>
            <Button Width="10cm" Content="Button10cm"/>
            <Button Width="50pt" Content="Button50pt"/>
            <Button Width="Auto" Content="ButtonAuto"/>
        </StackPanel>
    </Grid>
</Window>
```


![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/4cc6b6f9-4a77-407f-73a0-b02da1c56ad8.png)

@ WPF 4.5入門 by 大田一希さん
No.2891 / 9985
> WPFでのピクセルは、物理的なピクセルではなくデバイス非依存ピクセルになりｍす。デバイス非依存ピクセルとは、dpi(1インチあたりのドット数)にかかわらず1ピクセルが1/96インチになります。

<hr>
(追記 2017/06/14)

http://www.atmarkit.co.jp/ait/articles/1011/30/news116_2.html
に比率指定 `Width="2*"`が紹介されている。