OmniAICreator/Qiita-1.07M huggingface dataset:
Gitのコマンド

初めてGitHubをさわった初心者です。
コマンドの備忘録として作成しました。

## Gitリポジトリの作成

`git init`

## GitにGitHubを追加

`git remote add origin https://github.com/...`

## ステージングエリアにファイルを追加

`git add ファイル名`
`git add .`←”.”で全ファイル

## ローカルリポジトリに変更をコミット

`git commit`

この時、変更の履歴をviで入力。

`git commit -v`←”-v”で変更点がわかる

## ローカルリポジトリの内容をリモートリポジトリ（GitHub）にプッシュ

`git push -u origin master`

## Gitリポジトリのステータス確認

`git status`

## Commitの変更履歴の確認

`git log`

## ローカルとステージング領域の差分を比較

`git diff`

## ステージング領域と最新コミットの差分を比較

`git diff HEAD`

## 特定のファイルをGitの管理から外す場合、

`.gitignore`ファイルに記載する

### 利用例：
プログラムによって自動生成されるファイルや
パスワードが記載されているファイルなどを
`.gitignore`ファイルに記載
以下の例は拡張子がtxtのものを省く例

```conf:.gitignore
*.txt
```


コミットしてしまったファイルを管理外にするには
`git rm`コマンドを使う
ディレクトリの場合は、`-r`をつける

ローカルには残したい場合は、
`git　rm　--cached　ファイル名`
キャッシュを消したあとは`.gitignore`
に追加すること忘れない
追加しないとまた管理されてしまう

`git rm`で削除してしまったファイルを元に戻すには、
`git reset HEAD ファイル名`←リモート上にファイルが戻る
`git checkout sexond.txt`←ローカル上にファイルが戻る
講談社機械学習プロフェッショナルシリーズ『深層学習』の学習 第6章 畳込みニューラルネット

注意：『<a  href="https://www.amazon.co.jp/gp/product/4061529021/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4061529021&linkCode=as2&tag=aokikenichi-22">深層学習 (機械学習プロフェッショナルシリーズ)</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=aokikenichi-22&l=as2&o=9&a=4061529021" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />』
<a  href="https://www.amazon.co.jp/gp/product/4061529021/ref=as_li_qf_sp_asin_il?ie=UTF8&camp=247&creative=1211&creativeASIN=4061529021&linkCode=as2&tag=aokikenichi-22"><img border="0" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4061529021&Format=_SL110_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=aokikenichi-22" ></a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=aokikenichi-22&l=as2&o=9&a=4061529021" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
を読むにあたって、自分が読みたいな、こんな記事があったら参考になるな、という基準で書いております。私は機械学習も数学も専門家ではないので誤っている箇所も多々あるかと思いますが参考となると幸いです。

# 第6章 畳込みニューラルネット
## 6.1 単純型細胞と複雑型細胞

+ 図6.2. 中間層のどれか1つが活性化していれば出力層は活性化するとのことなのだが、(a)も(b)も中間層の1つが活性化しているのに出力層が活性化していないのは何故だろう？

## 6.2 全体の構造
特になし

## 6.3 畳込み
+ 図6.5 まだよく飲み込めてない方は実際に値を計算してみると腑に落ちると思う。
    + 元の画像の左上3x3についてフィルタを作用させると
        + 77*0.01 + 80*0.08 + 82*0.01 +
        + 83*0.08 + 78*0.64 + 80*0.08 +
        + 87*0.01 + 82*0.08 + 81*0.01
        + =79.19≒79で出力の右上の79と一致する
    + 念のため右に1つスライドさせた位置について
        + 80*0.01 + 82*0.08 + 78*0.01 +
        + 78*0.08 + 80*0.64 + 83*0.08 +
        + 82*0.01 + 81*0.08 + 80*0.01
        + =79.69≒80で出力の右上から右に1つスライドさせた80と一致する
    + 以下同様
+ 図6.6 図6.5と同様だがゼロパディングされたのを考慮して
    + 元の画像の右上3x3についてフィルタを作用させると
        + 0*0.01 +  0*0.08 +  0*0.01 +
        + 0*0.08 + 77*0.64 + 80*0.08 +
        + 0*0.01 + 83*0.08 + 78*0.01
        + =63.1≒63でいいはずだが出力の右上は62
    + 念のため右に1つスライドさせた位置について
        + 0*0.01 +  0*0.08 +  0*0.01 +
        + 77*0.08 + 80*0.64 + 82*0.08 +
        + 83*0.01 + 78*0.08 + 80*0.01
        + =71.47≒71で出力の右上から右に1つスライドさせた71と一致する

## 6.4 畳込み層
難しそうに見えますがRGBの3色について6.3節と同じことを繰り返して足しているだけですね。

## 6.5 プーリング層
LpプーリングについてPを∞とすると

```math
z_{abk}を最大値とすると \\
(\lim_{P \to \infty}{\sum{z_{pqk}^P}})^{\frac{1}{P}}=(\lim_{P \to \infty}{z_{abk}^P\sum{\frac{z_{pqk}^P}{z_{abk}^P}}})^{\frac{1}{P}} \\
（z_{abk}以外の項は0となり、） \\
=(\lim_{P \to \infty}{z_{abk}^P})^{\frac{1}{P}} \\
=z_{abk} \\
つまり、z_{pqk}の最大値となる
```

## 6.6 正規化層
特になし

## 6.7 勾配の計算
p51 [4.4.2 順伝播と逆伝播の行列計算](http://qiita.com/aokikenichi/items/9d35d62b56955c9887af#442-%E9%A0%86%E4%BC%9D%E6%92%AD%E3%81%A8%E9%80%86%E4%BC%9D%E6%90%AC%E3%81%AE%E8%A1%8C%E5%88%97%E8%A8%88%E7%AE%97)と同じ。

## 6.8 実例：物体カテゴリ認識
特になし

⇒次は、[講談社機械学習プロフェッショナルシリーズ『深層学習』の学習 第7章 再帰型ニューラルネット](http://qiita.com/aokikenichi/items/3a71ddcb8ac4d6502e11) へ
Raspberry Pi (Zero (W)) 上で OpenCV を動かして USB Camera からの画像をJPEG保存してみる

# Overview

[Raspberry Pi Zero (W)](http://qiita.com/hidenorly/items/142590ff594b6e083092) の setup を しました。

ほとんどのことは、ESP8266やESP32でできますが、難しいことがあります。それは、USB.
というわけで、せっかくなので、Raspberry Pi Zero (W) に USB Cameraを接続して、キャプチャーできるようにします。

# 用意するもの

* Raspberry Pi (Zero (W))
* micro USB - USB A アダプタ (最近は１００均ショップでも購入できますね。)
* USB Camera (私は余っていた Logitech, Inc. Webcam C600)


# Setup

まずは、USBとして認識しているかどうかを確認しましょう

```
$ lsusb
lsusb
Bus 001 Device 006: ID 046d:0808 Logitech, Inc. Webcam C600
..snip..

$ ls /dev/video*
/dev/video0
```

こんな風に認識していればOkです。

# とりあえず、fswebcam でキャプチャーしてみる

```
$ sudo apt-get install fswebcam
```

で

```
$ fswebcam -r 1280x720 -S 3 -F 1 hoge.jpg
```

みたいにして、キャプチャーできればOkです。

* ```-F``` は、キャプチャーするフレーム (どうも合成してくれる模様)
* ```-S``` は、最初にスキップするフレーム (最初に変なフレームが出る場合向け)

# OpenCV で キャプチャーしてみる

## OpenCV with python の　setup

```
$ sudo apt-get install libopencv-dev python-opencv
```

## OpenCV で キャプチャーしてみる

```simpleCvCap.py
# coding: utf-8

import cv2

def captureImage(filename):
	cap = cv2.VideoCapture(0)

	ret, frame = cap.read()
	cv2.imwrite(filename,frame)

	cap.release()

if __name__ == '__main__':
	captureImage("tmp.jpg")
	cv2.destroyAllWindows()
```

```
$ python simpleCvCap.py
```

的な。

ちゃんと、解像度とか設定できるようにしたものを、 https://github.com/hidenorly/opencv-cap においておきました。


# Mac側 の OpenCV の 環境構築

Mac側も同じように環境構築しておくと、デバッグ効率が上がります。
主にパフォーマンの違いから・・・。

```
$ brew update
$ brew tap homebrew/science
$ brew install cmake pkg-config jpeg libpng libtiff eigen openexr numpy
$ brew install tbb
$ brew install ffmpeg
$ brew install opencv3 --with-ffmpeg --with-tbb --with-python
$ echo 'export PATH="/usr/local/opt/opencv3/bin:$PATH"' >> ~/.bash_profile
$ brew link opencv3 --force
```

で、とりあえず、環境構築した上で、上のpython (githubにあるもの) で動くことを確認しました。
[Sails.js v1.0] sails.getUrlForがパラメーターを受け付けてくれないのでhelperを作った

# sails.getUrlFor
Sails.jsでもRuby on Railsのようにパラメーター付きのルーティングを定義できます。
例えば、新規登録ユーザーのEmailを認証してアカウントを有効化するために以下のようなルーティングを作ったとします。

```javascript:config/routes.js
  'get /user/confirm/:id/:token': 'UserController.confirm',
```

アクション名からURLを取得するためにsails.getUrlForという関数が用意されていますが、[Sails.jsのドキュメント](http://next.sailsjs.com/documentation/reference/application/advanced-usage/sails-get-route-for)によると、これ引数が一つ（target）しか定義されていません。すなわち、上記のようなルーティグに対しては、idやtokenを引数で渡すことができず、

```javescript
sails.log(sails.getUrlFor('UserController.confirm'))
// => '/user/confirm/:id/:token'
```

と返ってきます。これでは不便なので、簡単なHelperを作りました。

# generate-route-for.js

```javascript:api/helpers/generate-route-for.js
module.exports = {
  friendlyName: 'GenerateRouteFor',

  description: 'Wraps sails.getRouteFor to accept params',

  sync: true,

  inputs: {
    action: {
      friendlyName: 'Route name',
      description: 'Route name',
      type: 'string',
      required: true
    },
    params: {
      friendlyName: 'Prams',
      description: 'Params for the route. A dictionaly of param names and values.',
      type: 'ref'
    }
  },

  fn: function (inputs, exits) {
    var url = sails.getUrlFor(inputs.action);
    url = _.reduce(inputs.params, function (memo, val, key) {
      // replace param names with values
      return memo.replace(':'+key, val);
    }, url);
    exits.success(url);
  }
};
```

こんな感じで使います。

```javascript
var confirmUrl = sails.helpers.generateUrlFor({ 
  action: 'UserController.confirm', 
  params: {
    id: newUser.id, 
    token: newUser.token
  }
}).execSync()
```

# sails.getRouteFor
Sailsは、getUrlForとは別に[getRouteFor](http://next.sailsjs.com/documentation/reference/application/advanced-usage/sails-get-route-for)という関数も用意している。違いは何かというと、
- getUrlForはURLの文字列を返す
- getRouteForはrouteオブジェクトを返す（ex.{method: 'get', url: '/hoge/piyo'}）
mobx injectを使ったobservableがreactしない場合の解決方法

# 問題

参考: https://github.com/mobxjs/mobx-react/issues/124

`Provider`に渡すストアを`observable`にしていても、これは`inject`で引き渡すとそのprop自体は`observable`にならず、reactしない

```js:テストはしてません.jsx

import ReactDOM from 'react-dom'
import React, { Component } from 'react';
import {observable} from "mobx";
import {observer, inject, Provider} from "mobx-react";

//storeとしてオブジェクトをそのままobservableにしている場合
const store = observable({
  time: new Date()
})

@inject("providerStore")
@observer
class InjectTest extends Component {
  click = () => {
    this.props.providerStore.time = new Date()
  }

  render(){
    return(
      <div>
        <p>{this.props.providerStore.time.getTime()}</p>
        <button onClick={this.click}>クリック</button>
      </div>
    )
  }
}

class App extends Component {
  render(){
    return(
      <Provider providerStore={store}>
        <InjectTest />
      </Provider>
    )
  }
}

ReactDOM.render(
  <App />,
  document.body.appendChild(div),
)
```

「クリック」ボタンを押しても表示に変化なし

## 原因
そもそも`this.props.providerStore.time`が`observable`ではないので



# 解決法

一端クラスを作り、その内部で`observable`を持つようにする
ストアするオブジェクトの要素にこのクラスを追加すれば`observable`は保持される

またはクラスを必要としなければ、ストアを`observable`にして、要素それぞれをオブジェクトにする

```js:テストはしてません.jsx
import ReactDOM from 'react-dom'
import React, { Component } from 'react';
import {Provider} from "mobx-react"
import {observable} from "mobx";
import {observer, inject} from "mobx-react";

//objectを作り、その中でobservableを持つとinjectで渡してもこのobservableは保持される
class Time{
  @observable time = new Date()
}

//クラスを作った場合、store自体はobservableでなくていい
const store = {
  timeObject: new Time()
}

//クラスを作らない場合は全体をobservableにして、要素をオブジェクトにする
//const store = observable({
//  timeObject: {
//    time: new Time()
//  }
//})

@inject("providerStore")
@observer
class InjectTest extends Component {
  click = () => {
    this.props.providerStore.timeObject.time = new Date()
  }

  render(){
    return(
      <div>
        <p>{this.props.providerStore.timeObject.time.getTime()}</p>
        <button onClick={this.click}>クリック</button>
      </div>
    )
  }
}

class App extends Component {
  render(){
    return(
      <Provider providerStore={store}>
        <InjectTest />
      </Provider>
    )
  }
}

ReactDOM.render(
  <App />,
  document.body.appendChild(div),
)
```
GCSのPubSub通知対応を試してみる

以下の記事に記載されているGCSのPuSubサポートを試してみたときのメモ。

https://cloudplatform-jp.googleblog.com/2017/04/Cloud-Storage-introduces-Cloud-Pub-Sub-notifications.html

設定は以下のコマンドを実行し、オブジェクトの変更通知を行いたいバケットを設定する。

```
$ gsutil notification create -f json -t {サブスクリプション名} gs://{バケット名}
```

これでファイルを該当のバケットにアップロードすると、PubSubにメッセージ通知されるので、以下のコマンドでメッセージをサブスクリプションから取得する。

```
$ gcloud beta pubsub subscriptions pull {サブスクリプション名}
```

取得したメッセージには以下の内容が含まれている。

| 項目 | 内容 |
|:--|:--|
| kind  | 種類。オブジェクトの場合はstorage#object  |
| id  | オブジェクトID  |
| selfLink  | オブジェクトへのリンク   |
| name  | ファイル名  |
| bucket  | バケット名  |
| generation  | 世代  |
| metageneration  | メタデータの世代  |
| contentType  | ファイルの種類  |
| timeCreated  | ファイル作成日時（GCSにアップロードされた日時）  |
| updated  | ファイル更新日時  |
| storageClass |STANDARDなど、ストレージクラス |
| timeStorageClassUpdated|オブジェクトストレージクラスが変更された日付 |
| size | ファイルのサイズ(bytes)|
| md5hash |md5ハッシュ値 |
| mediaLink |メディアリンク |
| crc32c |巡回冗長検査 |
| etag | エンティティタグ|

これらの項目は以下に記載されている項目と同じであった。
https://cloud.google.com/storage/docs/json_api/v1/objects
AWSホワイトペーパー(日本語)

AWSホワイトペーパーで日本語化されているものだけのリンク集を作った

1. [AWSの概要 21pages](https://media.amazonwebservices.com/jp/wp/AWS_Overview.pdf)
1. [セキュリティプロセスの概要 82pages](https://d0.awsstatic.com/International/ja_JP/Whitepapers/AWS%20Security%20Whitepaper.pdf)
1. [セキュリティのベストプラクティス 116pages](https://d0.awsstatic.com/International/ja_JP/Whitepapers/AWS_Security_Best_Practices.pdf)
1. [リスクとコンプライアンス 164pages](http://d0.awsstatic.com/whitepapers/International/jp/AWS_Risk_Compliance_Whitepaper_Aug_2015.pdf)
1. [DDosに対するベストプラクティス 26pages](https://d0.awsstatic.com/International/ja_JP/Whitepapers/DDoS%20White%20Paper.pdf)
1. [耐障害性の高いアプリケーションの構築 14pages](http://d36cz9buwru1tt.cloudfront.net/jp/wp/AWS_WP_Fault_Tolerant_JP_v20110517.pdf)
1. [EMRのベストプラクティス 39pages](http://media.amazonwebservices.com/jp/wp/AWS_Amazon_EMR_Best_Practices.pdf)
1. [新しいリージョンへのリソースの移行 26pages](http://media.amazonwebservices.com/jp/wp/AWS_Migrate_Resources_To_New_Region.pdf)
1. [御社のITインフラをVPCで拡張 15pages](http://media.amazonwebservices.com/jp/wp/Extend_your_IT_infrastructure_with_Amazon_VPC.pdf)
1. [障害復旧を目的としたAWSの利用 22pages](https://media.amazonwebservices.com/jp/AWS_Disaster_Recovery_01242012.pdf)
1. [SES Eメール送信のベストプラクティス 16pages](http://d36cz9buwru1tt.cloudfront.net/jp/wp/AWS_Amazon_SES_Best_Practices.pdf)
macOS Sierra の Rails 開発環境をアップデートする

## 環境

- macOS Catalina 10.15.6
- Ruby 2.7.1
- Ruby on Rails 6.0.3.2

## ローカルの環境をアップデート

```zsh
# Homewbrew アップデート
% brew update & brew upgrade
% brew cleanup
% brew doctor

# rbenv アップデート
## https://github.com/znz/anyenv-update
% anyenv update

# Ruby インストール
% rbenv versions
% rbenv install -l
% rbenv install 2.7.1
% rbenv rehash
% rbenv global 2.7.1
% rbenv versions
ruby -v

# gem アップデート
% gem update --system

# Rails のインストール
% gem search -l rails                # ローカル gems の確認
% gem search rails | grep "^rails (" #ダウンロード可能な Rails バージョンの確認
% gem install rails -N               # ドキュメント無しでダウンロードするため高速
# % gem update rails -N              # インストール済みの場合はアップデート

# 一度ターミナルを開き直す
% rails -v
Rails 6.0.3.2
```
Sambaを使ってUbuntuのディレクトリをネットワーク共有する

# はじめに
UbuntuとWindowsをsamba共有する方法を記載します。

Ubuntuに共有ディレクトリを作成してWindowsからここにアクセスします。
Ubuntuのuser名をuserとします。
Windowsからネットワークでuserでユーザ認証してアクセスします。

# samba install

```
sudo apt-get install -y samba
```

# ユーザ設定
userというUbuntu userはすでに存在しているとします。
samba userを作成します。

```bash:console
sudo pdbedit -a user  # samba userを追加します
sudo smbpasswd user   # passwordを設定します
sudo pdbedit -L       # samba user一覧を表示します
```

# 共有設定
共有するディレクトリパスなどを設定します
/etc/samba/smb.conf
を編集します。

```
[Share]
   path = /home/user
   writable = yes
   create mode = 0664
   directory mode = 0755
   share modes = yes
   guest ok = no
   valid users = @user 
```

smbを再起動します

```
sudo /etc/init.d/smbd restart
```

# 接続確認

Ubuntuにてifconfigコマンドを入力してIPアドレスを取得します。
WindowsにてIPアドレス指定アクセスします。Shareディレクトリが閲覧できれば接続OKです。

接続がうまくいかない場合は/var/log/samba以下のファイルを調査してください。
Semi-Supervised Classification with Graph Convolutional Networksのまとめ

Semi-Supervised Classification with Graph Convolutional Networks
https://arxiv.org/pdf/1609.02907.pdf
について簡単にまとめる。

#概要

- グラフ構造の半教師付き学習。
- グラフを直接操作するようにCNNを効果的に変形したものを用いて学習する。
- グラフの局所的な構造とノードの特徴をエンコードするよう隠れ層を学習する。

#Graph Convolutional Networks(GCNs)とは
画像を入力できるのがConvolutional Neural Networkなら、グラフをそのまま入力できるネットワークがGraph Convolutional Networkです。


#手法
以下の規則に従ったmulti-layer Graph Convolutional Networksを考える。

```math
H^{(l+1)}=\sigma\bigl(\tilde D^{-\frac{1}{2}}\tilde A\tilde D^{-\frac{1}{2}}H^{(l)}W^{(l)}\bigr)
```
ここで $\tilde A=A+I_{N},\quad A\in \mathbb R^{N\times N}$はグラフの隣接行列,　$I_{N}$は単位行列,　
$\tilde D_{ii}=\sum_{j}\tilde A_{ij}$,　$W^{(l)}$は各層に固有の重み行列で学習可能,　$H^{(l)}\in \mathbb R^{N\times D}$はl番目の隠れ層の出力,　$H^{(0)}$は入力。

このネットワークを用いてグラフのノードの分類を行う。

論文では２層のGCNsを用いている。

実験に用いたネットワークの構成はXを入力, Zを出力として、以下の通り。

```math
Z=softmax\bigl(\tilde A\,ReLU(\tilde AXW^{(0)})W^{(1)}\bigr)
```
ラベルが付いているデータに対してsoftmax cross entropyを用いて学習する。
###画像
論文よりhttps://arxiv.org/pdf/1609.02907.pdf
<img width="370" alt="スクリーンショット 2017-05-03 19.15.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/178228/4bae9a25-3600-2277-564c-a8588e2e7977.png">
一番左が入力層でCチャンネル、一番右が出力層でFチャンネル、Yはラベルがついているデータによる教師ラベル。

#結果
4つのデータセットについて実験を行なっている。(データの詳細は論文を参照https://arxiv.org/pdf/1609.02907.pdf)


<img width="436" alt="スクリーンショット 2017-05-03 18.40.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/178228/c6ef095d-46b6-2b36-ee26-e5fb65d3bd20.png">

他のベースラインと比較して分類精度・訓練時間で優れている。

参考記事　https://tkipf.github.io/graph-convolutional-networks/
カメラからの画像に直接フィルターをかける



他にやりたいことがあったんだけど、副産物として生まれたやつ。下記参考ページのソースをほぼコピペして合体させただけです。
CIFilterのCIColorCubeを使ってます。


元画像(カメラからの画像）
![写真 2017-05-03 11 14 43.png](https://qiita-image-store.s3.amazonaws.com/0/40693/ccf88dc7-4f31-0175-9e06-3e9cd547deaa.png "写真 2017-05-03 11 14 43.png")
フィルターON
![写真 2017-05-03 11 14 46.png](https://qiita-image-store.s3.amazonaws.com/0/40693/411d2d8a-40bc-5428-f097-24869438fb8a.png "写真 2017-05-03 11 14 46.png")

スライダーを右に動かす
![写真 2017-05-03 11 14 53.png](https://qiita-image-store.s3.amazonaws.com/0/40693/3e908510-8035-5d83-de5e-f58514c6900c.png "写真 2017-05-03 11 14 53.png")

CIFilter系はパラメーターの数が多いのでテスト用に値をすぐに弄れるやつを作っておくと楽ですね。

##### 参考

[[Swift]iPhoneのカメラに映ってる画像にカスタムフィルタかけてみる(前編)](http://dev.classmethod.jp/smartphone/iphone/swiftiphone-camera-filter/)

[[Swift]iPhoneのカメラに映ってる画像にカスタムフィルタかけてみる(後編)](http://dev.classmethod.jp/smartphone/iphone/swift-ios8-cikernel/)

[TMReplaceColorHue](https://github.com/dstarsboy/TMReplaceColorHue)


##### ポインタ

CIFilterを触ろうとすると、ポインタと無関係で要られないがはっきり言ってswiftのポインタ周りは理解が追いつていないが、こればっかりはすぐにどうこう出来ないので（でも無視も出来ないので）ゆっくりでも理解していきたいものです。

##### ポインタ周りの参考

[Swift 3 の Data とポインタ使いこなし術](http://developer.hatenastaff.com/entry/swift-3-foundation-data-and-pointer)

[Using Swift with Cocoa and Objective-Cのメモ（その1）](http://seeku.hateblo.jp/entry/2014/06/20/205708)
後半のUnmanaged Objectsに関するところが有難かった。
bundle execを省略してみる

Railsのバージョンを４と５で共存させたいので基本的にはgemをプロジェクトごとに管理してますが、いちいちbundle execをつけるのは面倒です。

探してると、それを省略できるやり方があるのを見つけました。
MacOSX Sierraでやる場合とrailsコマンドのエイリアスがなかったので、少し自分用に変えたやり方です。

### bundle-exec.shを使う
```
$ curl -L https://github.com/gma/bundler-exec/raw/master/bundler-exec.sh > ~/.bundler-exec.sh
$ vi ~/.bundler-exec.sh
//最後の方の'BUNDLED_COMMANDS="${BUNDLED_COMMANDS:-'以下のコマンドが書かれた箇所にrailsを追加します。
$ echo "[ -f ~/.bundler-exec.sh ] && source ~/.bundler-exec.sh" >> ~/.bash_profile
$ source .bash_profile
$ type ruby
ruby is aliased to `run-with-bundler ruby'
```

上記のようになればOK

rubyとかrailsとかのコマンドにエイリアスをつけて、プロジェクトディレクトリ内で実行した場合には、自動的にbundle execをつけて実行してくれるようです。

便利。
ターミナルメモ

# プロンプトの前の表示をいじりたい

[シェル上のプロンプトの確認や設定](http://pocketstudio.jp/linux/?%A5%D7%A5%ED%A5%F3%A5%D7%A5%C8%A4%CE%B3%CE%C7%A7%A4%E4%C0%DF%C4%EA)

# ターミナルからアプリを開く
.bash_profileに以下を追記

```bash
#command alias
alias xcode = 'open -a "Xcode"'
```
http://webkaru.net/dev/mac-terminal-app-alias/

# 2つ上のディレクトリに移動したい

```bash
$ cd ../../
```

ちなみに
`$ cd ../../../`
で3つ上

# テキストを末尾に追加する

```bash
$ echo (追加したい文字列) >> (追加する先のファイル)
```

http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231093/

# chmodコマンドの使い方

http://motw.mods.jp/UNIX/chmod.html

# ディレクトリを削除

```bash
$ rm -r (ディレクトリ名)
```

# 特定のディレクトリ名で検索して削除する

例：Fooディレクトリ以下にある`.git`ディレクトリをすべて削除する

```bash
find Foo -name ".git" | xargs rm -r
```

[Linuxターミナル、コマンドtips その2: ファイルを見つける(locate, find)、ファイルの中身を調べる(grep) - 百日半狂乱](http://doi-t.hatenablog.com/entry/2015/03/28/075049)
ElixirでSleep Sort書いてみた

# Sleep Sortとは
http://qiita.com/snsk/items/33c01951ef27bbd2b093

# コード
```elixir:sleep_sort.exs
defmodule SleepSort do
  def order(list, order\\:assending) when is_list(list) do
    collector_pid = spawn(SleepSort, :collector, [[], self()])
    spawn(SleepSort, :order_element, [list, 0, collector_pid])

    list = receive do
      {:result, result} ->
        result
    end

    {:ok, list}
  end

  def order_element([], time, collector) do
    Process.sleep(time + 1)
    send collector, { :terminate }
  end

  def order_element([ head | tail ], max_time, collector) do
    time = head * 2
    spawn(SleepSort, :launch, [head, time, collector])
    order_element(tail, max(max_time, time), collector)
  end

  def launch(element, msec, collector) when is_integer(msec) do
    Process.sleep(msec)
    send collector, {:append, element}
  end

  def collector(list, result_receiver) when is_list(list) and is_pid(result_receiver) do
    receive do
      {:append, element} ->
        collector([element | list], result_receiver)
      {:terminate} ->
        send result_receiver, {:result, Enum.reverse(list)}
    end
  end
end


list = (0..100)
        |> (fn (a) -> fn -> Enum.random(a) end end).()
        |> Stream.repeatedly()
        |> Enum.take(20)
{:ok, result} = list |> SleepSort.order()
IO.inspect result
```

Concurrent Programmingの練習になるのかもしれないと思って書いてみた。やってることは割とシンプルな気がする、こういうのが書きやすいのは良いなって思いました。
とりあえずOrderが並び替えるものの最大値の倍になる(`O(Nmax * 2)`?)のでなんとかしたいなぁとか
なんで倍にしてるかと言うと数値分だけ`Process.sleep()`させたときに順番が前後したりしたからです。プロセスの生成にかかる時間とかで誤差が出るのかなと。`2`に根拠はないですが…
うまくSleepの時間をバラけさせつつ全体としてあんまり時間のかからない方法が思いつけばなー

# こっちのが簡潔だった
>```elixir
>defmodule SleepSort do
>  def sort(collection) do
>    me = self
>    collection
>    |> Enum.map(fn (n) ->
>        spawn_link fn -> (send me, { :timer.sleep(n * 10) && n }) end
>      end)
>    |> Enum.map(fn (_pid) ->
>        receive do { result } -> result end
>      end)
>  end
>end
>```

[Elixir で Sleep Sort を実装する http://sinsoku.hatenablog.com/entry/2016/11/13/225019](http://sinsoku.hatenablog.com/entry/2016/11/13/225019)

~~ただ、すべてを`spawn_link`し終わってから回数分のrecieveを始めているので、あまりにも戻ってくるのが早いと(もしくはListがめっっちゃ長いと)キャッチしそこねそうな気がする。どうなんでしょう。
(その不安から自分の実装では受取用のプロセスを先にspawnしている)~~


これProgramming Elixirにある例(Parallel Map)とほぼ同じなんですね。てことはいいのか
Polymerのエディタープラグイン紹介(Atom/Visual Studio Code向け)

Polymerのリントチェックやオートコンプリートをサポートするエディターのプラグイン`polymer-editor-service`を開発環境に導入しましょう。

(2017年5/3現在、サポートはAtomとVisual Studio Codeだけですが、今後Sublimeもサポートされるようです。最新の状況は、[GitHubページ](https://github.com/Polymer/polymer-editor-service)で確認できます。)

## 何ができるか
- インポートした要素のオートコンプリート入力(ドキュメント付)
- カスタム要素の属性のオートコンプリート入力(ドキュメント付)
- エラー箇所をアンダーバーで表示
- マウスでホバーするとカスタム要素やその属性のドキュメントをエディター上で表示

## どうやって入れるか



~~~:Atomの場合(Mac)
apm install polymer-ide
apm install linter # (任意オプション)エラー箇所に赤のアンダーライン
# コマンドパレットでWindow: reloadを実行するか、エディターを再起動
~~~

~~~:Visual_Studio_Editorの場合(Mac)
ext install polymer-ide
~~~

## 試すには
インストール後、以下コマンドでサンプルプロジェクト上でプラグインの動作を確認できます。

~~~:Atomの場合(Mac)
git clone https://github.com/Polymer/atom-plugin
cd atom-plugin/example_project
bower install
atom ./
~~~

~~~:Visual_Studio_Editorの場合(Mac)
git clone git@github.com:Polymer/vscode-plugin.git
cd vscode-plugin/example_project
bower install
code ./
~~~

## おまけ
Polymer 2.0のシンタクスには対応していないようですが、[PolymerSnippets](https://github.com/robdodson/PolymerSnippets)も併せて入れておくと便利だと思います。

## 詳しい情報
- [Atomのプラグインページ](https://atom.io/packages/polymer-ide)
- [Visual Studio Codeのプラグインページ](https://marketplace.visualstudio.com/items?itemName=polymer.polymer-ide)
- [プラグインのGitHubページ](https://github.com/Polymer/polymer-editor-service)
- [動画解説(英語) Polymer Summit 2016 What's New in Polymer Tools](https://youtu.be/guYHn0P8bKQ?t=35m51s)
Use Cases of Data Visualization Software

（JSやPythonを知らなくても使える） データ可視化ソフトの活用事例ページをまとめました。

## Map
1. [ArcGIS](https://www.esrij.com/case-studies/)
1. [Story Map Cascade](https://storymaps.arcgis.com/ja/gallery/)
1. [Carto](https://carto.com/gallery/)
1. [QGIS](http://qgis.org/ja/site/about/screenshots.html)

## Tree・Network
1. [Cytoscape](http://cytoscape-publications.tumblr.com/)
1. [Gephi](https://gephi.org/screenshots/)
1. [NodeBox](https://www.nodebox.net/gallery/)

## Chart
1. [Tableau] (https://public.tableau.com/ja-jp/s/gallery)
1. [Plotly] (https://plot.ly/feed/)
1. [Raw](http://rawgraphs.io/gallery/)
1. [iCharts](http://chartchannel.icharts.net/chart-center)

## Infographic
1. [Timeline](http://www.simile-widgets.org/timeline/examples/index.html)
2. [Visualize Free](https://www.visualizefree.com/#works)
1. [Infogram](https://infogr.am/examples)
1. [Visualy](https://visual.ly/m/design-portfolio/?type=infographics)
【エクスプレッション】２次元のプロパティとvalueの関係

#今日はエクスプレッションのお話
エクスプレッションで二次元の要素を持ったプロパティの時のvalueの変化

#やりたい事
補間を使って自動で処理をします。
※とりあえず一次元の場合の話をします。

```js
linear ( 変数 , 入力最小値 , 入力最大値 , minに対する出力値 , maxに対する出力値 )
```


下のコードではレイヤーの不透明度をレイヤーのインポイントから１秒にかけて0～100％に変化します。

```js
linear(time,inPoint,inPoint+1,0,100)
```


#これに設定値のvalueを使用して変化させます。
linear(time,inPoint,inPoint+1,<font color="red">0</font>,100)
赤字の0をレイヤーのトランスフォームパネルの不透明度から値を受け取りたいのでvalueを使用します。

linear(time,inPoint,inPoint+1,<font color="red">value</font>,100)
に変更しました。
これは問題なく動作します。

![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/178061/b85302c8-1572-2438-0629-3cfcf4fdffa6.jpeg)

#さてここからが2次元プロパティの場合の話
プロパティが２次元の要素を持った場合、例）アンカーポイント・位置・スケールなど

図）二次元の要素を持ったプロパティ
![002.JPG](https://qiita-image-store.s3.amazonaws.com/0/178061/cfee9e9d-f91b-dfdc-87b5-07dac788d11c.jpeg)

この二次元の要素を持ったプロパティの場合補間のエクスプレッションはこうなります。

```js
linear ( 変数 , 入力最小値 , 入力最大値 , minに対する出力値[Num,Num] , maxに対する出力値[Num,Num] )
```

例えばこんな感じです。

```js
linear(time,inPoint,inPoint+1,[0,0],[100,100])
```
minに対する出力値 , maxに対する出力値が二次元になります。

###てっ事で適当にvalueを入れてみる。
```js
linear(time,inPoint,inPoint+1,[value,value],[100,100])
```
まずこれでやってもエラーになるだけです。

###valueで扱いたい場合・・・
二次元の場合にvalueは二次元の配列になっています。
配列は
value[0] //xのvalue
value[1] //yのvalue
になります
という事ですので、正しくはこうなります。

#それではコードです。

```js
linear(time,inPoint,inPoint+1,[value[0],value[1]],[100,100]);
```
これが正しいコードになります。
[WordPress]記事タイトルにショートコードを利用する場合の注意点

過去記事の修正→再掲なので現バージョンでは事情が違うかも。

タイトル部分にショートコードを使うと、ショートコードが丸見えになってしまうという問題がありました。

# サイトに表示する分

テンプレートを編集

```php
<?php echo do_shortcode(get_the_title()); ?>
```

# RSSに流れる分

## ショートコード処理をする

function.phpに以下の内容を追記。

```php
function my_feeds($content) {
    global $post;
    $content = str_replace('&quot;','"', $content);
    $content = do_shortcode($content);
    return $content;
}
add_filter('the_title_rss', 'my_feeds');
```

ポイントは、4行目。どうも**RSSに流れる時にはダブルクォーテーションがエスケープされる**ので、半角スペースの所でショートコードの変数が終わりだと認識されてしまうみたいです。
エスケープ前の文字に戻してからショートコード処理をすればOKでした。

## ショートコード部分を削除する

特殊な事例だと思いますが、私の場合サイトの多言語化を

```php
[trans en="日本語以外の環境で表示する文字列"]日本語環境で表示する文字列[/trans]
```

というショートコードで実現していたため、上記の方法ではFeedburnerに転送する時点で強制的に英語翻訳されてしまっていました。

当時RSSは日本語で流したかったので、ショートコード部分を削除する事で対応。

```php
function my_feeds($content) {
    global $post;
    $content = preg_replace('/ en=&quot;.*&quot;/', '', $content);
    $content = str_replace(array('[trans]','[/trans]'),'', $content);
    return $content;
}
add_filter('the_title_rss', 'my_feeds');
```

英語（変数部分）も削除していますが、残しておきたい方は適宜修正してください。
Visual StudioでPython使う人（オレ）へのメモ

# 必要なパッケージをインストールする
普段C#で利用しているVisualStudioですが、最近のはPythonもしっかり対応して
くれてるので、UIに見慣れているVSを使ってます。

●使用バージョン
　Microsoft Viusual Studio Community 2015

Pythonはライブラリがある程度そろっているので、インストールして取り込んで
ごにょごにょって流れで色々実現できるんです。

ただ、VSはどうもpipでインストールしたライブラリを読み込んでないようで…

##~~インストール先の違いを発見~~
自分はコンソールでぽちぽち動かしてた程度だったので、Pythonの元ディレクトリに
ライブラリがインストールされるイメージでした。

VisualStudioでは、~~プロジェクトフォルダごとにインストールするようで、~~
※修正：VSがユーザーフォルダに作ってくれてました。
![2017-05-03 (4).png](https://qiita-image-store.s3.amazonaws.com/0/113090/cbf2889a-75d3-759a-4623-d6c0a409f19c.png)
こんな感じですね。

いずれにしてもVSでインストールする方法を、メモ程度に残します。

##VS上でpipを使う

ウィンドウレイアウトがデフォルトな人ならば、右上にソリューションエクスプローラが
表示されているはずです。そこで、プロジェクト名の下にある
Python X.Xを右クリックします。（バージョンはお使いの環境により…）
![pip_dev.PNG](https://qiita-image-store.s3.amazonaws.com/0/113090/10b3251a-e434-adf6-f0cf-969b35e3bc55.png)

![pip_dev_click.PNG](https://qiita-image-store.s3.amazonaws.com/0/113090/89d478c9-6bac-fca8-86d8-77c8a7a7facb.png)

赤線部のメニューが現れます。これがまさに、ライブラリのインストールです。
自分、気づかなかったっす…

赤線部をクリックすると、パッケージインストールウィンドウが表示される。
![2017-05-03 (2).png](https://qiita-image-store.s3.amazonaws.com/0/113090/f4fe74dd-e63a-5354-3216-2dbb0f264cad.png)
上図はテンプレートエンジンのjinja2をインストールする場合です。
パッケージ名入力してOKボタンをクリックすれば、インストール開始です。


![2017-05-03 (3).png](https://qiita-image-store.s3.amazonaws.com/0/113090/422463c1-1932-4da7-325b-ce80d2fde7da.png)
インストール完了後、パッケージ名が追加されています。
　
　
ちなみにpipのアップグレードする場合は以下のように入力すればOKです。

![2017-05-03 (1).png](https://qiita-image-store.s3.amazonaws.com/0/113090/1c4215e9-2d9c-62a9-f84c-823a4903e44c.png)


VisualStudioでパッケージインストールする方法を書置きしました。
fenrirのコマンド設定ファイル(.txt)をiniファイルとして編集する


## 動機
- fenrirのcmdフォルダ以下の設定ファイルは拡張子が.txt
- 構文はほぼiniに準拠
- 編集する時、自動的にiniファイルとしてシンタックスハイライトしてほしい

## 対象ソフト
今後試したら増えるかも

- Visual Studio Code

## Visual Studio Code
### ワークスペースの設定

- [特集：Visual Studio Code早分かりガイド：Visual Studio Codeの使い方、基本の「キ」 \(5/6\) \- ＠IT](http://www.atmarkit.co.jp/ait/articles/1507/10/news028_5.html)

fenrir\cmdをVSCodeで開いている状態で、ワークスペースの設定に以下を追記：

```json
"files.associations": {
    "*.txt": "ini",
}
```

この場合、設定はfenrir\cmd\.vscode\settings.jsonに保存される。

### ユーザー設定
`/cmddir=`オプションで利用する複数のコマンドフォルダがあり、いちいちワークスペースの設定をしたくない場合など。

- [Overview \- vscode\-docs](http://vscode-docs.readthedocs.io/en/latest/languages/overview/)

ファイル名のglobパターンで指定する。

```json
"files.associations": {
    "**/fenrir/cmd/*.txt": "ini",
},
```

ここで詰まったのが、**Windowsでもディレクトリ区切りはバックスラッシュ（`\`）ではなくスラッシュ（`/`）で記述すること。**globパターンというのはそういうもんらしい。
Install XAMPP on CentOS deployed by OSX's docker

# Goal 
Install XAMPP on CentOS deployed by OSX's docker.

# Deploy Cent OS

 `$ docker pull centos:6`
 `$ docker run -it --name share_app -p 8080:80 -v /Users/xxx/share:/share centos:latest`

Go to CentOS's shell
 `$ yum install wget`
 `$ wget $url_of_xampp_refereing_xampp's_download_site`
 `$ chmod 755 xampp-linux-x64-5.6.30-0-installer.run`
 `$ xampp-linux-x64-5.6.30-0-installer.run`
 
Access httpd server from OSX's server.

Congrats to access the server!
CUDA8.0インストール後のメモ

CUDA8.0インストール後サンプルを実行しようとした時にエラーが出たのでメモ。

cudaDecodeGLでエラーを吐いたので

samples/3_Imaging/cudaDecodeGL/findgllib.mk

のUBUNTU_PKG_NAME=""をインストールしたドライバと同じ名前にしたら動いた。
Git 設定メモ


めったにやらないことで覚えてられないのでメモ。

## 名前とメールアドレスの設定

コミットメッセージに名前とメールアドレスを記録するために次の設定を行う。

```bash
$ git config --global user.name "hogehoge tarou"
$ git config --global user.email "tarou@hogehoge.net"
```

## 日本語のファイル名を表示する

次を設定すると、エスケープされずに表示できる

```bash
$ git config --global core.quotepath false
```

## Postバッファを大きくする
HTTP/HTTPSでpushする場合にバッファが小さいと失敗する。
大きいファイル、大量のファイルをpushしようとしてエラーとなる場合はバッファ不足も疑ってみる。
とりあえず100MBぐらい設定しておけば大概大丈夫。次のように設定する。

```bash
$ git config http.postBuffer 104857600
```

上記だとひとつのリポジトリでの設定になる。グローバルに設定するには次のようにする。

```bash
$ git config --global http.postBuffer 104857600
```

## グローバルな gitignore を設定する

次を実行して、~/.gitignore_global を作成して設定する。

```bash
$ git config --global core.excludesfile ~/.gitignore_global
```
company-dabbrevで日本語を補完しない

# やりたいこと
日本語文字と英数字(特に日付，人名)が混ざった文章を書いているときにcompany-dabbrevにより動的補完をすると，画像のように日本語部分まで補完候補に入れられてしまいます．
(ちょっと分かりにくいですが、`201`が現在入力している文字で、その下の3行が補完候補です)
![default.png](https://qiita-image-store.s3.amazonaws.com/0/154104/3744b4a5-38df-6aae-bdf3-d577f389e7a6.png)
これを下図のように、日本語文字が補完候補に含まれないように修正します。
![modified.png](https://qiita-image-store.s3.amazonaws.com/0/154104/10b6f0eb-1035-78c3-a799-931576ff610d.png)
(候補の順番が変わっていますが，多分これは補完履歴の影響なので気にしないで下さい．)


# 結論
`init.el`などの設定ファイルに以下のような記述をすれば，ASCII文字のみが補完候補に含まれるようになります．

```el:init.el
(defun edit-category-table-for-company-dabbrev (&optional table)
  (define-category ?s "word constituents for company-dabbrev" table)
  (let ((i 0))
    (while (< i 128)
      (if (equal ?w (char-syntax i))
	  (modify-category-entry i ?s table)
	(modify-category-entry i ?s table t))
      (setq i (1+ i)))))
(edit-category-table-for-company-dabbrev)
;; (add-hook 'TeX-mode-hook 'edit-category-table-for-company-dabbrev) ; 下の追記参照
(setq company-dabbrev-char-regexp "\\cs")
```
(2017/10/30 追記)
`edit-category-table-for-company-dabbrev` をEmacs起動時に実行してしまうと，ドル記号`$`にもcategory`s`が設定されてしまうようです．TeXモードで使用する場合にはこれでは色々と不都合があるので，`add-hook`を用いてTeXモード開始後に実行します．(当然ですが，モード名については各々の環境に合わせて修正して下さい)


# 解説
変数 `comapny-dabbrev-char-regexp` は，company-dabbrevで補完対象となる文字(文字列ではないことに注意)を指定する正規表現．
デフォルト値は `"\\sw"` で，これは「単語構成文字」にマッチする．
問題なのは，アルファベットだけでなくひらがなや漢字もこれにマッチしてしまうこと．
というわけで，ASCII文字でかつ単語構成文字のみにマッチするようなcategoryを自作して，それを正規表現で指定しました[^1]．
[^1]: 本当は 「`"\\sw"` かつ `"\\ca"`」 を表す正規表現があれば一番良いのでしょうが，どうやらそれはなさそう．
syntax table や category table の詳細については，[るびきち氏のページ](http://emacs.rubikitch.com/syntax-table-beginner/)や[マニュアル](https://www.gnu.org/software/emacs/manual/html_node/elisp/Syntax-Tables.html)あたりを参考にして下さい．

# コメント
- company-dabbrev-code の方はちょっと仕組みが違うようで，今のところは上手くいっていませんが，
  僕はこちらについては必要性を感じていないのでひとまず保留とします．
- 別の方法や，より良い方法などがあれば，教えてもらえると嬉しいです．
【karma】SourceMapから元ソースのカバレッジレポートを出力する

webpack・babel等で生成したソースに対してkarmaでテストを回し、
source mapを元にして、元ソースベースにカバレッジレポートを出力する方法を書きます。

結論を言うと[karma-remap-istanbul](https://github.com/marcules/karma-remap-istanbul)を使います。
公式を読んで満足できればこちらの記事を読む必要はないです。



サンプルプロジェクトも作成したので参考にしてください。
https://github.com/ota-meshi/karma-remap-istanbul-sample


# 設定

※すでにkarmaでカバレッジレポートが出力できる状態からの差分で記載します。

## [karma-remap-istanbul](https://github.com/marcules/karma-remap-istanbul)のインストール

npmでインストールします。

```bash
npm install -D karma-remap-istanbul
```
## karma.conf.js設定

下記を参考に必要箇所を追記、修正してください。

```js
		//・・・

		files: [
			'dist/*.js',//テスト対象にbundleしたjsファイルを指定する
			//・・・
			//spec.jsを指定
		],

		//・・・

		preprocessors: {
			'dist/*.js': ['coverage'],//bundleしたjsファイルをカバレッジの対象にする
		},

		//・・・

		//reportersに'karma-remap-istanbul'を追記
		reporters: ['coverage', 'karma-remap-istanbul'],

		//・・・

		//remapIstanbulReporterの設定を追記
		remapIstanbulReporter: {
			remapOptions: {}, //additional remap options
			reportOptions: {}, //additional report options
			//出力形式や、出力先を指定する
			reports: {
				lcovonly: 'coverage/remap/lcov/lcov.info',
				html: 'coverage/remap/html',
				cobertura: 'coverage/remap/cobertura/cobertura.xml'
			}
		},

		//・・・
```

## webpack設定

SourceMap内で指定されるpathが`webpack://`になってしまうと
カバレッジレポートファイルがうまく出力できないので変更します。

下記の記事を参考に、`devtoolModuleFilenameTemplate`を指定してくださ。
[【webpack】source mapに指定されるdomainやpathを変更する](http://qiita.com/ota-meshi/items/2e8e8ef8e6e6d21ea053)

（webpack以外の設定方法や動作はわからないです。。。）

# カバレッジ確認

## karmaのテスト実行

bundleしてkarmaのテスト実行します

[サンプルプロジェクト](https://github.com/ota-meshi/karma-remap-istanbul-sample)では、以下のコマンドを実行します。

```bash
npm run build
npm run test
```

実行される中身は下のscriptsです

```json
  "scripts": {
    "test": "karma start",
    "build": "webpack"
  },
```

## レポート確認

[サンプルプロジェクト](https://github.com/ota-meshi/karma-remap-istanbul-sample)では、`./coverage/remap`以下に出力されるので確認しましょう。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/84259/106c32cb-be2f-bd09-c7a4-2a83eb744e3a.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/84259/e0113162-ceaa-6916-353b-5725b8fac808.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/84259/3674f31f-d6c4-d179-4678-eef5e7ba9fe0.png)



## ちなみにremap前のレポート

見ても何の参考にもならないカバレッジレポート

![image.png](https://qiita-image-store.s3.amazonaws.com/0/84259/fa6daf0c-ab73-377e-ecf4-5fc39ae8ea9a.png)
[Rails] 部分テンプレート使用時のrenderの書き方

部分テンプレートにインスタンス変数を渡すときに、renderの書き方がいくつかあって迷ったのでまとめてみました。


version```Rails 5.0.2```

[こちらのサイト](https://blog.scimpr.com/2012/09/06/rails3%E9%83%A8%E5%88%86%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%81%A8ajax%E5%8C%96%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81/)を参照しました。

### 単数形のインスタンスを渡す場合
- 基本形

```_group.haml
= render partial: 'groups/group', locals: { group: @group }
```
groupsフォルダ内の_group.hamlを呼び出します。
@groupを部分テンプレート内で変数groupとして使用します。

- 省略形

```_group.haml
= render 'groups/group', group: @group
```
partialとlocalは省略可。どちらかのみの省略も可でした。

```_group.haml
= render partial: 'groups/group', object: @group
```
部分テンプレートと同じ名前の変数はオブジェクトとして渡すことも可能。
この場合、partialは省略不可でした。

- さらに省略形

```_group.haml
= render @group
```
オブジェクトのインスタンス変数と部分テンプレートが同じ名前のとき。
これだけで上記と同じ処理になります。
※この場合、groupsコントローラーのインスタンスをオブジェクトとしているため、'_group.haml'は'views/groups'の中に置かなくてはなりません。

### 複数形のインスタンスを渡す場合
- 省略形

```_group.haml
= render 'groups/group', groups: @groups
```
単数形の時と同様に、@groupsを渡します。

```_group.haml
= render partial: 'groups/group', collection: @groups
```
複数形の時はオブジェクトではなく、コレクションになります。

- さらに省略形

```_group.haml
= render @groups
```
複数形の時もこれで'groups/_group.haml'を呼べます。
また、複数形の場合、コレクションの中の個別のインスタンスが部分テンプレートに呼ばれる変数となるため、each文を使用せずに繰り返しの処理ができます。
この場合、@groupsの中の個別のインスタンスが、部分テンプレート内の変数groupとして使用できます。

以上、ご指摘等ありましたらコメントお願いします！
コマンドラインからSublimeTextを使うメモ

SublimeTextは普通にコマンドラインから操作できるのを最近知ったので、メモ兼共有しておきます。

# とりあえず開く
```
subl
```

`sl` とかにエイリアスしておくとより便利です。 `sl` だね。

# カレントディレクトリで開く
```
subl .
```

# 今あるウィンドウにカレントディレクトリを追加する
```
subl -a .
```

これ知らなくて、今まで「プロジェクト」→「プロジェクトにディレクトリを追加」ってしてた皆さんへ。
Doxygenでprotectedなメンバを出力しないようにする

Doxygenの設定ファイルに以下を記述。

```:Doxyfile
EXTRACT_PRIVATE        = NO
ENABLE_PREPROCESSING   = YES
MACRO_EXPANSION        = YES
EXPAND_ONLY_PREDEF     = YES
PREDEFINED             = protected=private

```

## 参考

http://stackoverflow.com/questions/11316663/is-it-possible-to-prevent-doxygen-from-outputting-protected-members
windowsでTensorFlow その9

#概要
windowsのTensorFlowの環境で、OpenAiやってみた。
不具合、修正してみた。

#写真
![gg.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/e70e489a-a2ed-69ae-8d78-9113e80cd919.jpeg)


#環境
windows 7 sp1 64bit
anaconda3
tensorflow 1.0
pyqt5

#修正した不具合
##wrappers.Monitorが動かない。
ffmpegをインストールした。

##uploadできない。
wrappers.Monitorが動いたため、OKとなった。
https://gym.openai.com/evaluations/eval_zDpVXHByT62n16aZxrrzQ#reproducibility
vagrant ssh でPermission denied の原因と対策

vagrant ssh でPermission denied の原因と対策

vagrant環境でごにょごにょやった後、exitしてから再度vagrant sshしようとした時にPermission deniedになって入れなくなると絶望します。
二度とこういうことを起こさないためにPermission deniedの原因と対策をメモ

大変参考になったサイト
http://qiita.com/youcune/items/2f427979403771f2e03a

このサイトの
`パーミッションは適切か`の部分が該当しました。

いろいろな問題があってhomeディレクトリ以下のパーミッションをすべて777にしていたのでまずかったようです。
/home/user/.ssh は 0700
/home/user/.ssh/authorized_keys は 0600
でないといけないらしく、パーミションを変更した際はssh関連のパーミッションが変更されていないか確認しましょう。


#再現

##sshログインする

```
$ vagrant ssh
```

入れる。

##ホームディレクトリ以下のパーミッションを変える

```
$ chmod -R 777 /home/vagrant
```

##exitする

```
$ exit
```

##再度sshログイン

```
$ vagrant ssh 
Permission denied
```

死んだ。

死んでしまったvagrantはもうどうにもすることができない?
saharaプラグイン等を使ってrollbackできるようにしておいたほうが良いです。
Visual C++で作成したEXEを、ランタイムDLL無しに単体で起動できるようにするには

#Visual C++で作成したEXEが、他の環境だと動かない時
Visual C++ 2015等でWin32なEXEやDLLを作るとき、デフォルトでは作成したEXEやDLLは単体では動かず、CランタイムのDLLが必要になり、VC++インストールディレクトリのredistフォルダ内のファイルを同梱しないと他の環境では動かなくなります（vcruntime140.dllとかmsvcp140.dllとか）。
作成したプログラムを他の人へメールで渡すと「起動しない」と言われたりするのは、これが理由の場合が多いです。

#解決策
Visual C++の場合、プロジェクトのプロパティから、C/C++のCode GenerationのRuntime Libraryを、Releaseビルドでは/MTにすることで、EXEにランタイムがスタティックリンクされます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/58680/7fcd6b2c-5586-559f-4b4c-5a7344581f1c.png)

ちょっとしたデモ用だったり、Unityの中で呼び出されるDLLにする場合等には依存関係が面倒ですので、スタティックリンクしてしまう方が良い場合が有ります。
良かったら試してみてね。
【C#】doubleをvolatileにする

`long` や `double` に `volatile` 修飾子をつけることはできない。
`volatile` が必要な場合、次のように `Thread.VolatileRead` および `Thread.VolatileWrite` を使う。

```csharp:Sample.cs
double _Property;
public double Property
{
    get => Thread.VolatileRead(ref _Property);
    set => Thread.VolatileWrite(ref _Property, value);
}
```
janus gatewayのdocker imageを作成した

# Introduction
webrtc sfuの有力な選択肢としてJanus Webrtc Gatewayがあると思う。最近名前変わった？　自分は使用している。
その中でも、自分はwebrtcからのtranscodingの実験をしたかった。FFmpegを使って、webrtc->rtmp,dash,hlsなどを行うとこと。
GitHubのレポジトリを探してもjanusのDockerfileで良いのが見つからなかったので作成した。
現在janus絡みの不具合修正のために必要なlibraryは全部盛り込んだつもり。

# How to use 
レポジトリは　https://github.com/atyenoria/janus-gateway-docker にある。
(面白かったらstarしてくれると喜びます)
```
git clone https://github.com/atyenoria/janus-gateway-docker
docker build -t atyenoria/janus-gateway-docker .
```


# Resource
resoucesのページに乗っけてもらった。
https://janus.conf.meetecho.com/docs/resources.html
*Akinori Nakajima / janus-gateway-docker / Janus WebRTC Gateway Docker Image for Media Streaming Expert User*

# Promotion
趣味で３人で音声通話可能なボイスチャットアプリを作っている（未完成）。
https://jp.tamuro.org/
Node-REDでシンプルなウェブサイト - Tips

初めてWatson IoT Platformを使ってみよう、というかたのためのガイドです。
[Watson IoT Platformを使ってみる](http://qiita.com/egplnt/items/af867711a7191923b2ff)でIoTアプリを使ってみました。

- [Node-REDでシンプルなウェブサイト - 1.シンプルなhtmlを送ってみる / 2. 色を付けてみる](http://qiita.com/egplnt/items/e8eeed3432900945c084)でNode-REDを使ってシンプルなウェブサイトを作ってみています。
- ここではNode-REDを使ってシンプルなウェブサイトを作る際のいくつかのtipsをご紹介します。

# 1. 経路を変更する
- BluemixのNode-REDアプリの「概要」ページの「経路」ボタンから、経路を追加・変更することが可能です。
![スクリーンショット 2017-05-03 14.57.06.png](https://qiita-image-store.s3.amazonaws.com/0/125842/c45453b4-ca0b-6086-823a-c9990390e81e.png)

# 2. URLをスマホ用にQRコード化する
- QRコードを生成するサイト（例：[QRコード生成](http://qr.quel.jp/form_bsc_url.php)など）から、Node-REDで作成したウェブサイトのURLをQRコード化することでスマホからのアクセスを容易にします。
AngularのXSS（クロスサイトスクリプティング）対策

# はじめに
AngularのXSS対策について調査してみました。
+ 調査環境：4.0.0-beta.8

# 種類に応じたサニタイジング
Angularは、HTML, STYLE, URL, RESOUCE_URL, SCRIPT, NONEの６種類のサニタイジングを行うことができるように設計されています。

各分類は以下のようになっています。

|Schema|Context|
|:---|:---|
|HTML|iframe:srcdoc, *:innerHTML, *:outerHTML|
|STYLE|*:style|
|URL|*:formAction, area:href, area:ping, audio:src, a:href, a:ping, blockquote:cite, body:background, del:cite, form:action, img:src, img:srcset, input:src, ins:cite, q:cite, source:src, source:srcset, track:src, video:poster, video:src|
|RESOURCE_URL|applet:code', applet:codebase', base:href', embed:src', frame:src', head:profile', html:manifest', iframe:src', link:href', media:src', object:codebase', object:data', script:src'|

#### サニタイジング漏れのエラーメッセージ
適切にサニタイジングされていない場合、HTMLとSTYLEとURLは自動でサニタイジングされます。SCRIPTとRESOURCE_URLはエラーになり処理を中断します。

SCRIPTは以下のエラーメッセージになります。

```
unsafe value used in a script context
```

RESOURCE_URLは以下のエラーメッセージになります。

```
unsafe value used in a resource URL context (see http://g.co/ng/security#xss)
```

サニタイジングされているものの、その方式に誤りがある場合は、次のエラーメッセージを出力します。
```
Required a safe ${expectedType}, got a ${value.getTypeName()} (see http://g.co/ng/security#xss)
```
ただし、URLはSafeUrlとSafeResourceUrlの両方を許可していため、SafeResourceUrlはRESOURE_URLとURLの両方のチェックを通過します。

# URLのサニタイジング
URLのサニタイジング処理はチェックのみ行います。
以下のどれかの正規表現にマッチすれば有効なURLと判断します。

```
/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi
/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+\/]+=*$/i
```
URLは、複数のURLを指定する `srcset` にも対応しています。

#### URLのエラーメッセージ
適切にサニタイジングされていない場合、以下のエラーメッセージが表示され、先頭に `unsafe:` が追加されたURLに置換されます。

```
WARNING: sanitizing unsafe URL value ${url} (see http://g.co/ng/security#xss)
```

# Styleのサニタイジング
予め定義されたスタイルのキーワードとマッチするか、クォート（"と'）の整合性がとれているかのチェックを行います。
URLでスタイルシートを指定した場合は、URLのサニタイジングチェックを行います。

予め定義されたスタイルのキーワードは以下です。

|種別|定義|
|:---|:---|
|値|[-,."\'%_!# a-zA-Z0-9]+|
|変形|(?:matrix&#124;translate&#124;scale&#124;rotate&#124;skew&#124;perspective)(?:X&#124;Y&#124;3d)?|
|色|(?:rgb&#124;hsl)a?|
|グラデーション|(?:repeating-)?(?:linear&#124;radial)-gradient|
|CSS3|(?:calc&#124;attr)|
|引数|\\\\([-0-9.%, #a-zA-Z]+\\\\)|


#### Styleのエラーメッセージ
適切にサニタイジングされていない場合、以下のエラーメッセージが表示され、Styleは 'unsafe' に置換されます。

```
WARNING: sanitizing unsafe style value ${value} (see http://g.co/ng/security#xss).
```

# HTMLのサニタイジング
DOMを分解し、URLとvalueをサニタイジングします。
valueは、以下の置換が行われます。

|置換前|置換後|
|:---|:---|
|&|&#x0026;amp;|
|[\uD800-\uDBFF][\uDC00-\uDFFF]|&#x0026;#(Unicode)|
|[^\#-~ &#124;!]|&#x0026;#(Unicode)|
|<|&#x0026;lt;|
|>|&#x0026;gt;|

# 参考
+ スキーマの定義
    - モジュール：@angular/compiler
    - ソース：schema/dom_security_schema.ts

+ セキュリティ分類
    - モジュール：@angular\core
    - ソース：security.ts

+ URLのサニタイジング
    - モジュール：@angular\platform-browser
    - ソース：security\url_sanitizer.ts

+ Styleのサニタイジング
    - モジュール：@angular\platform-browser
    - ソース：security\style_sanitizer.ts

+ HTMLのサニタイジング
    - モジュール：@angular\platform-browser
    - ソース：security\html_sanitizer.ts
windowsでTensorFlow その8

#概要
windowsのTensorFlowの環境で、OpenAiやってみた。
tensorflowでやってみた。

#写真
![hh.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/d6ee6f01-0ef6-30a2-bc62-95f912a1fbe4.jpeg)


#環境
windows 7 sp1 64bit
anaconda3
tensorflow 1.0
pyqt5

#動作した環境 gym.Env
Classic
'CartPole-v0'
'CartPole-v1'
'MountainCar-v0'
'MountainCarContinuous-v0'
'Pendulum-v0'
'Acrobot-v1'

#不具合
##その1 環境が動かない。
Box2Dは、pipでインストール試したが、visual c++が必要。
swigは、anacondaでインストールできた。

##その2 wrappers.Monitorが動かない。
ffmpegが必要。
なので、ビデオで撮った。
https://www.youtube.com/watch?v=dTSpFR3qpNY

##その3 uploadできない。
wrappers.Monitorが動かないため。
MacとWindowsのCapslockの挙動差異が気になる

# 前提
- MacとWindowsが英字配列
- Windows側にOffice製品（2007以上）がインストールされている

## バージョン情報
- Mac：10.11.16
- Karabiner : 10.22.0
- Seil : 12.1.0

# やりたいこと
1. Macを操作する際にもShift+Capslockで全角半角を切り替えたい
2. Capslock単体はCapslockの役割を担って欲しい

## 設定内容
### Seilをインストール
Capslockの挙動を帰る場合はこちらが必要です。
今回は下記にチェックを付けて、F19にしてみます。
※最も使わないと判断したキー、という理由しかありません

    Change the caps lock key    [80]

### private.xml への追記

```xml
  <!-- 全角・半角の切り替え5 ※SeilでCapslockをF19に割当-->
  <item>
    <name>Shift_L+Capslock(F19) to Eisuu/Kana (toggle)</name>
    <identifier>private.for_shift_l_capslock_F19_to_toggle</identifier>
    <autogen>
      __KeyToKey__
      KeyCode::F19, ModifierFlag::SHIFT_L | ModifierFlag::NONE,
      KeyCode::VK_JIS_TOGGLE_EISUU_KANA
    </autogen>
  </item>

  <!-- Capslock単体をCapslockとして扱う ※SeilでCapslockをF19に割当-->
  <item>
    <name>Capslock(F19) to Capslock</name>
    <identifier>private.for_capslock_F19_to_capslock</identifier>
    <autogen>
      __KeyToKey__
      KeyCode::F19,
      KeyCode::CAPSLOCK
    </autogen>
  </item>
```

### 追記した設定の有効化
1. KarabinerのChange KeyタブのReload XMLでprivate.xmlを読み込む
2. 下記にチェックを付ける
	- Shift_L+Capslock(F19) to Eisuu/Kana (toggle)
	- Capslock(F19) to Capslock

## 結論
Macで作業を続けている場合は特に気になりませんが、仕事（Windows）から帰って来てMacを触るタイミングや、RDPを利用して作業している際にチカチカとCapslockが点かないのは非常に良くなったかと思います。

# 最後に
Githubで公開状態にしてみました。
[個人的な設定ファイル](https://github.com/y-kishibata/karabiner) ※前回分を含む

## 前回
[RDPでMacとWindowsのキー配列を切り替えたく](http://qiita.com/y-kishibata/items/444e192a9afdf6edd112)
Naive Bayes classifier（単純ベイズ分類器）の仕組み（導入）

# Naive Bayes classifier（単純ベイズ分類器）の仕組み

Naive Bayes Classifierの原理を解説します．
この記事では，その導入部分だけを書き，Naive Bayesそのものまでは書きません．Naive Bayesそのものについては，次の記事で書くつもりです．

## 概要
Naive Bayes Classifierは，機械学習の，分類アルゴリズムの一つです．
古くから，特にテキストの分類に使われてきました．
Apache Spark MLlibや，python nltkで使ってみることができます．

## アルゴリズム

### Naive Bayes以前
#### 例
次のような，10件の学習データがあったとします．

```
おもしろい #モンスターハンター
おもしろい #モンスターハンター
おもしろい #モンスターハンター
おもしろくない #モンスターハンター
おもしろくない #モンスターハンター
おもしろい #たけしの挑戦状
おもしろくない #たけしの挑戦状
おもしろくない #たけしの挑戦状
おもしろくない #たけしの挑戦状
おもしろくない #たけしの挑戦状
```
ここで，さらに

```
おもしろくない
```
という入力があったとします．この入力の次に続くのは，#モンスターハンター か 　#たけしの挑戦状 のどちらが適切でしょうか？
学習データを集計すると，以下のような表を作ることができます．

||モンスターハンター|たけしの挑戦状|
|:--|--:|--:|
|おもしろい|3件|1件|
|おもしろくない|2件|4件|
いま，入力は「おもしろくない」なので，表の2行目を見ます．

||モンスターハンター|たけしの挑戦状|
|:--|--:|--:|
||||
|おもしろくない|2件|4件|
ここで，「おもしろくない」に，「モンスターハンター」と「たけしの挑戦状」のそれぞれが続く確率を計算してみると，以下のようになります．
まず，「モンスターハンター」については，

```math
P(モンスターハンター|おもしろくない)=\frac{P(おもしろくない and モンスターハンター)}{P(おもしろくない)}=\frac{2}{2+4}=\frac{1}{3}
```
となります．ここで，条件付き確率の定義

```math
P(B|A)=\frac{P(A\cap B)}{P(A)}
```
を用いました．
同様に，「たけしの挑戦状」については

```math
P(たけしの挑戦状|おもしろくない)=\frac{2}{3}
```
となります．
以上の計算から，「おもしろくない」に続くのは，「モンスターハンター」の確率が1/3, 「たけしの挑戦状」である確率が2/3であることが，学習データを使ってわかりました．

#### つまり
入力データXと，正解ラベルYの組からなる，学習データを用意します．
この学習データから，X×Y上の確率分布が計算できます．
この確率分布を使って，分類器を以下のように作ることができます．

いま，入力X=xがあったとき，この入力に対応する出力がY=yである確率P(Y=y| X=x)は，

```math
P(Y=y|X=x)=\frac{P(X=x, Y=y)}{P(X=x)}
```
で計算できます．この確率の最大値を与えるY=yが，最尤の出力です．

ところで，いま，P(X=x)はxを一つ与えるごとに固定されるので，最大値を与えるY=yを探すときには，分母のP(X=x)は気にせず，P(X=x, Y=y)だけを考えればよいです．
WindowsのDockerでボリュームマウントしようとするとfirewall is bloking

こんなエラーが出たので

```
ERROR: for client  Cannot create container for service client: C: drive is not shared. Please share it in Docker for Windows Settings
ERROR: Encountered errors while bringing up the project.
```

DockerのShared Drivesの設定をしに行ったら、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/51402/86b22e90-2254-679c-bb75-a6aa71b11930.png)

こんなエラーが出ました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/51402/46c70556-13b2-9ec8-0b69-5ee6eaaa9c23.png)

# ファイアウォール無効にしてもつながらないじゃん

いろいろ頑張って使えるようになったんですが、なんかどうでもいいところでつまずいて何やってんだろ感がすごい。WindowsはこういうのがMacに比べて多い気がするのがつらい...
再発したときに絶対忘れてると思うので、自分のためにメモしときます。

OS: Winsows10 Pro 1703 15063.138
Docker: Version 17.03.1-ce-win5 (10743)


# やったこと
1. ファイアウォール無効 (Mcafee&Windows) -> 変わらず
2. Mcafeeアンインストール -> 変わらず
3. CドライブやめてDドライブに変更 -> 変わらず
4. Dドライブを共有設定 -> 変わらず
5. DockerNATのプロパティから`Microsoftネットワーク用ファイルとプリンター共有`を一度OFFにしてOKしてから再度ONに -> 解決

## 問題の箇所

![image.png](https://qiita-image-store.s3.amazonaws.com/0/51402/4948abbc-ed17-fc41-5854-1c2b8af834cb.png)

## 気になること
もしかして再起動のたびにつながらなくなる?
Ruby on Rails | Rails5.1 で rspec + capybara を動かす最小手順

# Rails プロジェクトを作成

```
rails new capybara-example
```

```
cd capybara-example
```

# 適当にアクセス可能なページを作る

```
bundle exec rails generate scaffold User name:string
```

```
RAILS_ENV=test bundle exec rake db:migrate
```

# Rspec を追加する

```diff:Gemfile
gem 'rspec-rails'
```

```
bundle install
```

```
bundle exec rails generate rspec:install
```

# Capybaraのテストを作る

```spec/example_spec.rb
require "rails_helper"

RSpec.feature "users" do
  scenario "access to index" do
    visit "/users"
    expect(page).to have_text("Users")
  end
end
```

# 実行

成功。

```
bundle exec rspec -fd spec/example_spec.rb
```

```
users
  access to index

1 example, 0 failures
```

# 感想

rspec や capybara の世界は割りと複雑である。

- どの gem をインストールして何を generate すれば良いのか。
- どこの config に何を書けば良いのか。
- 何を require すれば良いのか。
- どの driver を使えば良いのか。
- どんな記法で何を書けば良いのか。
- それぞれにバージョンの微妙な違いもがある。

だが少なくとも Rails5.1 では、上の例ですんなり動くっぽい。

# 環境

- capybara (2.13.0)
- rspec-rails (3.5.2)
- Rails 5.1.0
- Mac OS 10.11.6








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->