OmniAICreator/Qiita-1.07M huggingface dataset:
（Windows） Vagrantを使って、PHPやRailsのプロジェクトをgithubからクローンし、ATOMを使って開発する[※ドットインストール参考]


###環境構築　事前準備
>virtualboxのインストール
>vagrantのインストール
>PUTTYのインストール
>(cyberduckのインストール)
>ATOMのインストール





* MyVagrantディレクトリをC:\Users\(ユーザー名)の中に作成
    * これからプロジェクトごとにこのディレクトリ内に新しくvagrant用のディレクトリを作成していく
* 今回はC:\Users\hzori\MyVagrant\MyCentOSという風にMyCentOSディレクトリを作成した
* そのディレクトリ内で、vagrantfailの作成(今回はgit bushでコマンドを打ち込んで切る)
`vagrant init bento/centos-6.8`
* vagrantfile内を修正して、ipアドレスを設定する(下行のコメントを外す)
`config.vm.network "private_network", ip: "192.168.33.10"`
* vagrantfileに以下コード追加
config.ssh.forward_agent = true
* vagrantの立ち上げ
vagrant up　v(MyCentOSディレクトリ)
* vagrantが起動しているかの確認
vagrant status　(runningと表示されていたらOK)
* PUTTYでvagrant内にログインする、PUTTYを開いた後、vagrantfileで指定したipアドレスを設定し接続
* vagrantでサインイン(パスワードもvagrant)
# OSを最新状態にアップデート（時間かかります）
sudo yum -y update

# スクリプトを入手するためのgitをインストール
sudo yum -y install git

# gitを使ってアプリケーション設定用のスクリプトをダウンロード
git clone https://github.com/dotinstallres/centos6.git

# centos6フォルダができるのでそちらに移動
cd centos6

# スクリプトを実行（時間かかります）
./run.sh

# もろもろの設定を反映
exec $SHELL -l
* vagrant@localhost内に新しくディレクトリ作成(今回はphp_project,これが作業ディレクトリになる)
* .sshディレクトリに移動して、キーの作成
cd .ssh
ssh-keygen -b 2048 -f centos63-key
* configファイルの修正
vi config
###configファイルを以下に修正
Host github.com
  HostName github.com
  User git
  Port 22
  IdentityFile ~/.ssh/centos63-key
  TCPKeepAlive yes
  IdentitiesOnly yes


cat centos63-key.pub
* 上記コマンドで表示されたものをgithubのSSH and GPG keysのsshkeysにコピペ
* 作業ディレクトリに戻る
cd ..
* 作業ディレクトリに戻り、
chmod 600 ~/.ssh/config
* プロジェクトをクローンする
git clone　(gitのプロジェクトでコピーしたもの、ただしhttp接続ではなくssh接続)
* mysqlにログイン
mysql -u root
mysql>create database (データベース名、今回はphp_project);
# php_projectデータベースのログイン設定をする
mysql>grant all on php_project(データベース名).*to dbuser(ログインユーザー名)@localhost identified by 'jfnske223(パスワード)';
mysql>exit;
* .envファイルを修正する
cp .env{.example,}
vi .env
* .envファイルのデータベース名、データベースユーザー名、データベースパスワードを先ほど決めたものに変更する
* コンポーザーをインストールする
php ../composer.phar install
※上記コマンドでエラーが出た場合は、
curl -sS https://getcomposer.org/installer | php
* マイグレーションの作成
php artisan migrate
* キーの作成
php artisan key:generate
* サーバーの立ち上げ
php artisan serve --host 192.168.33.10 --port 8000
* atomで接続する
    * vagrantの情報をとっておく、gitbushでC:\Users\hzori\MyVagrant\MyCentOSディレクトリに移動してから下記コマンド
vagrant ssh-config
###ATOM
左上のFile>settings>install>[romote-ftp]と検索してパッケージのインストール
左上のPackages>Remote-FTP>Create SFTP config file>

```json:.ftpconfig
{
    "protocol": "sftp",
    "host": "192.168.33.10",
    "port": 22,
    "user": "vagrant",
    "pass": "vagrant",
    "promptForPass": false,
    "remote": "/home/vagrant/php_project",
    "local": "",
    "agent": "",
    "privatekey": "C:/Users/hzori/MyVagrant/kyosei/.vagrant/machines/default/virtualbox/private_key",
    "passphrase": "",
    "hosthash": "",
    "ignorehost": true,
    "connTimeout": 10000,
    "keepalive": 10000,
    "keyboardInteractive": false,
    "watch": [],
    "watchTimeout": 500
}
```

* .ftpconfigファイルを設定出来たら、connectしvagrant上のファイルと接続する
左上のPackages>Remote-FTP>connect
※もし、接続してもファイルが表示されないときは、一度ATOMを閉じてからもう一度connectしてみる
vimrc

最近自分のvimrcを見直したのでメモ程度に晒しておきます．

```vim:.vimrc
"=============
"   vim設定   
"=============

" エンコード
set encoding=utf8
" ファイルエンコード
set fileencoding=utf-8
" シンタックスハイライト
syntax on
" 行番号を表示
set number
" タブ幅
set tabstop=4
" タブ幅(編集時)
set softtabstop=4
" インデント幅
set shiftwidth=4
" インデントをshiftwidthの倍数に丸める
set shiftround
" 改行時に前の行のインデントを継続する
set autoindent
" □や○文字が崩れる問題を解決
set ambiwidth=double
" 現在の行を強調
set cursorline
" 不可視文字を表示
set list
" 不可視文字を表示
set listchars=tab:»-,trail:-,extends:»,precedes:«,nbsp:%,eol:↲
" compatibleオプションをオフにする
set nocompatible
" 右下に表示される行・列の番号を表示する
set ruler
" .swapファイルを作らない
set noswapfile
" バックアップファイルを作らない
set nowritebackup
" バックアップをしない
set nobackup
" バックスペースで各種消せるようにする
set backspace=start,eol,indent
"ビープ音すべてを無効にする
set visualbell t_vb=
set noerrorbells "エラーメッセージの表示時にビープを鳴らさない
" 対応括弧に<と>のペアを追加
set matchpairs& matchpairs+=<:>
" 対応括弧をハイライト表示する
set showmatch
" 対応括弧の表示秒数を3秒にする
set matchtime=3
" ウィンドウの幅より長い行は折り返され、次の行に続けて表示される
set wrap
" 文章の折り返し地点を見やすくする
set showbreak=↪
" 変更中のファイルでも、保存しないで他のファイルを表示
set hidden
" 新しく開く代わりにすでに開いてあるバッファを開く
set switchbuf=useopen
" 補完の際の大文字小文字の区別しない
set infercase
" 小文字の検索でも大文字も見つかるようにする
set ignorecase
" ただし大文字も含めた検索の場合はその通りに検索する
set smartcase
" インクリメンタルサーチを行う
set incsearch
" 検索結果をハイライト表示
set hlsearch
" ESCキー2度押しでハイライトの切り替え
nnoremap <silent><Esc><Esc> :<C-u>set nohlsearch!<CR>
" マウスモード有効
set mouse=a
" xtermとscreen対応
set ttymouse=xterm2
" コマンドモードの補完
set wildmenu
" コマンド、検索パターンを10000個まで履歴に残す
set history=10000
" ステータスラインを常に表示(0:表示しない、1:2つ以上ウィンドウがある時だけ表示)
set laststatus=2
" 現在のモードを表示
set showmode 
" コマンドを画面最下部に表示する
set showcmd
" 移動コマンドを使ったとき、行頭に移動しない
set nostartofline
" スクロールする時に下が見えるようにする
set scrolloff=5

" ファイルを開いたときに最後にカーソルがあった場所に移動する
augroup vimrcEx
	au BufRead * if line("'\"") > 0 && line("'\"") <= line("$") |
	\ exe "normal g`\"" | endif
augroup END

"-----------
" キー設定
"-----------

" j, k による移動を折り返されたテキストでも自然に振る舞うように変更
nnoremap j gj
nnoremap k gk

" jjでエスケープ
inoremap <silent> jj <ESC>
" 日本語入力で”っj”と入力してもEnterキーで確定させればインサートモードを抜ける
"inoremap <silent> っj <ESC>
inoremap <silent>  ｊｊ <ESC>

" escの代わり
imap <C-j> <esc><jis_eissuu>
noremap! <C-j> <esc>

" Shift + 矢印でウィンドウサイズを変更
nnoremap <S-Left>  <C-w><<CR>
nnoremap <S-Right> <C-w>><CR>
nnoremap <S-Up>    <C-w>-<CR>
nnoremap <S-Down>  <C-w>+<CR>

" TABにて対応ペアにジャンプ
nnoremap <Tab> %
vnoremap <Tab> %

"--------------
" colorscheme
"--------------

autocmd ColorScheme * highlight Normal ctermbg=none
autocmd ColorScheme * highlight LineNr ctermbg=none
```
cowsayコマンドで\n\nとしたら改行できた

hogeとfugaの間に改行を入れたい．

これだとできない

```bash
printf "hoge\nfuga" | cowsay
```
結果

```
 ___________
< hoge fuga >
 -----------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

```

改行2つ入れたらできた．仕様なの？

```bash
printf "hoge\n\nfuga" | cowsay
```
結果

```
 ______
/ hoge \
|      |
\ fuga /
 ------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

```
Python で PNG から 透過 GIF を生成する

超Python初心者なんで、ハマり倒したのでメモ

```py
from PIL import Image

im = Image.open("input.png")

alpha = im.split()[3]

im = im.convert('RGB').convert('P', palette=Image.ADAPTIVE, colors=255)

mask = Image.eval(alpha, lambda a: 255 if a <=128 else 0)

im.paste(255, mask)

im.save('export.gif', transparency=255)
```

細かい部分で何しているかわかってないですが、自分と同じことで時間を使ってしまう人が減るように・・
Virtualbox上のKali Linuxの解像度を変更するメモ

# Install
ふつうにインストールします。
私は、

```
kali-linux-2017.1-amd64.iso
```
をインストールしました。

# dist-upgrade

```
apt-get update
apt-get dist-upgrade
```
で更新します。
(ettercapなどのアップグレードで失敗してしまい、しばらく悩んだんですが、会社のfirewallでハッキングツールだって言われてアクセス拒否されてました。仕方なくfirewallにしばらく休んでもらって事なきを得ました。)

# virtualbox-guest-x11

```
apt-get update
apt-get install virtualbox-guest-x11
reboot
```

これで、Virtualboxの表示－仮想スクリーンで解像度を変えることが出来ました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/156294/1d2a42f5-b55d-25a6-ddca-0a1cfd1edb1a.png)
固定長をカンマ区切りに変換する方法(bash)

## はじめに
昔覚えたはずが忘れて無駄な工数を使用してしまったので、
備忘録を兼ねて記事にしました。

なお、タイトルは固定長をカンマ区切りに変換する方法ですが、
同じ方法でタブ区切り等、好きな区切り文字を追加することができます。

## 前提
文字コード：ASCII
改行コード：LF
とする。

## 固定長をカンマ区切りに変換
例えばsample.csvのデータを

20170901130059XXX-XXXX-XXXX000000290
20170903130059XXX-XXXX-XXXX000000290

とする。上記を

20170901,130059,XXX-XXXX-XXXX,000000290
20170903,130059,XXX-XXXX-XXXX,000000290

としたい場合、下記コマンドで可能である。

```cat sample.csv |gawk 'BEGIN{FIELDWIDTHS="8 6 13 9"}{print $1","$2","$3","$4}' >output.csv```

結果をファイル出力したい場合は例のようにリダイレクトすればよい。

FIELDWIDTHSには半角スペース毎に区切りたい文字の「バイト数」を記載する。
上記例の場合は年月日(8バイト)、時分秒(6バイト)、電話番号(13バイト)、金額(9バイト)である。

printには$数字に区切りたい文字が順番に入り、「"」で囲っている場所に
好きな文字(今回だと「,」)を記載するとそれがデリミタ(区切り文字)となる。

例えば「,」を「\t」にすればカンマ区切りではなく、タブ区切りとなる。

```

cat sample.csv |gawk 'BEGIN{FIELDWIDTHS="8 6 13 9"}{print $1"\t"$2"\t"$3"\t"$4}' >output.csv

cat output.csv
20170901	130059	XXX-XXXX-XXXX	000000290
20170903	130059	XXX-XXXX-XXXX	000000290

```

固定長のファイルに対して、カンマ等のデリミタを設定すると、
見やすくなったり、加工に使いやすかったりするので便利です。

## おわりに
今回は備忘録の意味合いが強いので特には無いですが……
今後別の文字コードや改行コードのファイルを編集することがある場合、
追記していこうと思います。
Redmine (3.3.3) に入れるテーマ

[Redmineに入れるテーマ] (http://qiita.com/mihoko_az/items/49a67fcca1642866067e) の バージョン違いとなります。

----

Redmine は 3.3.3 を利用しています。

日本語が変に表示されないようであれば、じゃんじゃん入れます。
Redmine Theme Changer plugin を利用しているので、メンバーに選ぶ楽しさを提供することを優先しています。

- Alternate
- Basecamp-with-icon
- Classic
- Farend fancy
- Flatly light
    - 0.1.1
- Gitmike
    - 1.1.0
- Minimalflat2
    - 1.2.3




もう少し、増やしたい。
Vimで選択範囲をCamelCaseに変換

シェルで、こういう関数を作っておく

```bash:.bashrc
camelcase() {
    perl -pe 's#(_|^)(.)#\u$2#g'
}
```

Fishユーザーはこっち

```php:.config/fish/config.fish
function camelcase
    perl -pe 's#(_|^)(.)#\u$2#g'
end
```

これで、標準入力をCamelCaseに変換できる。

```
~> echo array_map | camelcase
ArrayMap
```

これだけでも結構便利なのだが、思い立ってVimで使ってみたらちょっと感動した。当然なんですが。

![out.gif](https://qiita-image-store.s3.amazonaws.com/0/103885/8b8fbbb7-7124-5199-38e7-a67691037ff0.gif)


# 余談

ちなみにsnake_caseはこうする。

```php
function snakecase
    perl -pe 's#([A-Z])#_\L$1#g' | perl -pe 's#^_##'
end
```
KotlinのコルーチンでFIFOな直列処理キューを実装

# About

KotlinでFIFOな直列処理キューを実装したくなり、せっかくなのでコルーチン([kotlinx-coroutines-core](https://github.com/Kotlin/kotlinx.coroutines/tree/master/kotlinx-coroutines-core))を使って実装してみました。

イメージとしては、main以外のシングルスレッドでEventLoopが回っていて、Queueに溜まった処理を直列に処理していくというものです。

# Channelによる実装

最初、[EventLoop](https://github.com/Kotlin/kotlinx.coroutines/blob/0.18/kotlinx-coroutines-core/src/main/kotlin/kotlinx/coroutines/experimental/EventLoop.kt)という、それらしい`CoroutineDispatcher`を発見したのですが、いまいち使い方が分からず、ゴニョゴニョしているうちに`Channel`を使った実装に落ち着きました。

```kotlin
import kotlinx.coroutines.experimental.*
import kotlinx.coroutines.experimental.channels.Channel

class SerializedOperationQueue(name: String = "EventLoop", capacity: Int = 0) {
    private val singleThreadContext = newSingleThreadContext(name)
    private val queue = Channel<suspend () -> Unit>(capacity).also {
        launch(singleThreadContext) {
            for (operation in it) {
                operation.invoke()
            }
        }
    }

    fun push(operation: suspend () -> Unit) = launch(Unconfined) {
        queue.send(operation)
    }
}
```

# Actorで書き直し

もう少し調べてみると、`Channel`を内包した[Actor](https://github.com/Kotlin/kotlinx.coroutines/blob/0.18/coroutines-guide.md#actors)なるものを発見したので、書き直してみました。

もはやラップする必要も無い程のシンプルさですね。。

```kotlin
import kotlinx.coroutines.experimental.*
import kotlinx.coroutines.experimental.channels.actor

class SerializedOperationQueue(name: String = "EventLoop", capacity: Int = 0) {
    private val singleThreadContext = newSingleThreadContext(name)
    private val actor = actor<suspend () -> Unit>(singleThreadContext, capacity) {
        for (operation in channel) {
            operation.invoke()
        }
    }

    fun push(operation: suspend () -> Unit) = launch(Unconfined) {
        actor.send(operation)
    }
}
```

# 実行

いずれの実装でも、次のような使い方になります。

```kotlin
fun main(args : Array<String>) = runBlocking {
    val operationQueue = SerializedOperationQueue()

    listOf(0, 1, 2, 3, 4).forEach {
        operationQueue.push {
            delay((5 - it) * 1000L)
            println("Job[$it]@${Thread.currentThread().name}")
        }
        println("Push[$it]@${Thread.currentThread().name}")
    }

    delay(20_000L)
}
```

実行してみると、Pushされた順に処理が実行されていることが分かります。

```
Push[0]@main
Push[1]@main
Push[2]@main
Push[3]@main
Push[4]@main
Job[0]@EventLoop
Job[1]@EventLoop
Job[2]@EventLoop
Job[3]@EventLoop
Job[4]@EventLoop
```

知れば知るほど楽しいコルーチンの世界...
AttributeError: 'module' object has no attribute 'MyTestCase' でハマった


テストファイルのファイル名を `test.py`にしてたら以下のエラーでハマった。

```
AttributeError: 'module' object has no attribute 'MyTestCase'
```

ファイル名を`test.py`以外すれば問題なかった。

んーPycharmのバージョンアップ前は大丈夫だったんだけど、Pycharmが絡んでる感じがあんましないんだよな。
PycharmのDocker統合の`/opt`ディレクトリあたりが関係してるのかなー。
Winform の control で、Property データを動的に読み込む

![image.png](https://qiita-image-store.s3.amazonaws.com/0/107324/6067767d-52f4-9aad-b361-f44681581049.png)

```C# 
headerLabel.DataBindings.Add(
 new System.Windows.Forms.Binding(
  propertyName: "Text", 
  dataSource:Properties.Settings.Default, 
  dataMember: "Wis_Project_title", 
  formattingEnabled: true, 
  dataSourceUpdateMode: System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged
 )
);
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/107324/5832a73d-e573-6115-2bed-c80ec2a2ac94.png)
機械学習でイケメン(ブサメン)判定アプリを作ってみる。

#イケメンが憎いです。
この世にイケメンが存在する限り、僕がモテることはありません。
なのでイケメンかどうかを判定するアプリをチュートリアルとして作ってみました。
TensorFlowとAndroidのチュートリアルとしていただければ幸いです。
動機と行動が完全にイッてますが、よろしくお願い致します。
(初学による間違い・ご指摘について、できましたらわかりやすくご指導頂ければ幸いです)


###開発環境
+ MacBook Air (13-inch Mid 2012)
+ MacOS 10.12.6
+ TensorFlow 1.3
+ Android Studio 3.0 Beta 5
+ Android NDK


###参考URL
マリオ判定
http://nilhcem.com/android/custom-tensorflow-classifier
そのソースコード
https://github.com/Nilhcem/tensorflow-classifier-android

TensorFlowでうなぎと寿司を判定するAndroidアプリを作ってみた
http://qiita.com/NoriakiOshita/items/4f20114ee7d3713b345f
上記のうなぎと寿司をイケメンとブサメンに変えただけですｗ


##環境構築
###TensorFlow
ここを見てインストール。WinやDockerの方は適宜読み替えてください。
https://www.tensorflow.org/install/install_mac#installing_with_virtualenv
virtualenvってやつが最初に載ってたのでそのまま導入。TensorFlow v1.2以降MacOSで動かす場合はGPUがサポートされないそうです。


###Android
Android Studioをインストール・起動してSDKをダウンロードしておく
https://developer.android.com/studio/preview/
NDKを入れておく
https://developer.android.com/ndk/


##学習用画像収集
下記を参考に画像収集します。
[まずは分類したいものの画像を集めましょう！](http://qiita.com/NoriakiOshita/items/4f20114ee7d3713b345f#%E3%81%BE%E3%81%9A%E3%81%AF%E5%88%86%E9%A1%9E%E3%81%97%E3%81%9F%E3%81%84%E3%82%82%E3%81%AE%E3%81%AE%E7%94%BB%E5%83%8F%E3%82%92%E9%9B%86%E3%82%81%E3%81%BE%E3%81%97%E3%82%87%E3%81%86)

保存します
```~/tf_files/men/ikemen # イケメンの画像
~/tf_files/men/busamen # ブサメンの画像
```
画像検索して
イケメン300枚
ブサメン100枚(コラージュが多く間引きしたので枚数少ないです)
を用意しました。

参考ページをもとに学習します。

補足：著作権まわりについて。[情報解析の為に他人の著作物を営利目的でコンピュータに入力することが日本では自由・合法(著作権法４７条の７)](http://rclip.jp/2017/09/09/201708column/)とありました。


##スマホ用にパッケージング
マリオ判定のソースコードを使ってビルドします。
https://github.com/Nilhcem/tensorflow-classifier-android


##完成・備考
試しにどれくらいのものかは下記動画を参照ください。
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/R7LPGI3bDig/0.jpg)](https://www.youtube.com/watch?v=R7LPGI3bDig)

バナー付けてデモ用カテゴリーでストアに並べてみました。
(2018/6/8 delete)

2020/02/03追加
当時ストアに並べていたAPKです。自己責任でお願い致します。
https://drive.google.com/file/d/1xlwSPARkThao3rwloyQ-YAfhTU5ff7r-/view

ソースコード
https://github.com/believe2200/ikemen


#あとがき
自分を判定する勇気はありませんでした
CircleCIで"Container ID xxxxxx cannot be mapped to a host ID"なエラーが出た場合、Dockerイメージ側でtarコマンドを使っていないか確認すると問題が解決するかも

1. CircleCIでDockerのホストマシンとコンテナのUID/GIDのマッピングにはマッピング可能な範囲がある。マッピング可能な範囲外のUID/GIDがDockerイメージ内にあると`Container ID xxxxxx cannot be mapped to a host ID`なエラーになる ( 参考URL: [Debugging Container ID Cannot Be Mapped to Host ID Error](https://circleci.com/docs/2.0/high-uid-error/) )
2. ところで、Dockerイメージを作るときは（大抵普段は使わない）rootでの操作をすることが多い。
3. rootでtarコマンドで解凍するとパーミッションだけでなくUID/GIDも保持される ( 参考URL: [superuser権限でtarコマンドで解凍すると何も考えなくてもパーミッションと所有者が保持される](http://sugargoodman.hatenablog.com/entry/2013/03/29/225444) )
4. どこかから取得したtarballをrootで解凍してたりすると想定外のUID/GIDが。。。


私はgitを本家のtarballからインストールする処理を書いていてエラーになりました。
Git バンドルファイル作成

# バンドルファイル

参考
https://git-scm.com/book/ja/v2/Git-のさまざまなツール-バンドルファイルの作成

>Git では、データを「バンドルファイル」という1つのファイルにまとめられます。

# 作り方

```
$ git bundle create commits.bundle master ^9a466c5
```

* masterブランチの
* 9a466c5より後のコミットを
* commits.bundleという名前のバンドルファイルにまとめる。

# 利用するシチュエーション

>これが便利な場面はいくつもあるでしょう。例えば、ネットワークが落ちていて同僚に変更を送れないような場合。あるいは、いつもとは違う場所で仕事をしていて、セキュリティ上の理由によってネットワークへのアクセスが禁止されているのかもしれません。無線/有線LAN用のカードが壊れてしまったとか。もしくは、共有サーバーにはアクセス出来ないので作業内容をメールで送りたいけれど、かといって40ものコミットを format-patch を使って送りたくはない、ということかもしれません。

基本、イレギュラーな状況に対応するために利用するという風に読める。

が、今の職場は、二拠点の開発でリモートリポジトリがそれぞれに存在して、日常的にバンドルを送り合って同期を取っているという謎めんどくさい状況である…。
理由は不明。
gitホスティングサービスの比較表(中小企業向け)

gitホスティングサービスのプランを比較しました。
チームで使えて料金が安め(月額1万以内)のプランのみ記載しています。

(2020年04月23日更新)

　　　　　|Github|Bitbucket|GitLab.com | backlog
---|-------|------|----------|-------|-----
プラン|Team|スタンダード|Bronze|スタンダード
料金|$4/ユーザー/月|$3/ユーザー/月|$4/ユーザー/月|¥11,800/月
プライベートリポジトリ数|無制限|無制限|無制限|100
ユーザー数|無制限|無制限|無制限|無制限
ストレージ制限|1ファイル: 100MBまで|1リポジトリ: 2GBまで|不明|合計: 30GBまで
料金表|https://github.com/pricing|https://ja.atlassian.com/software/bitbucket/pricing?tab=cloud|https://about.gitlab.com/gitlab-com/|https://www.backlog.jp/license

## 更新情報

- 2019/X/X: bitbucketが `$2` から `$3` に値上げしました。
- 2020/4/15: githubが `$9` から `$4` に値下げしました。
Cromeでa11yをチェックする方法

a11y(アクセシビリティ)は常にチェックしないと、すぐに落ちてしまいますよね。
というわけで google cromeのデバックツールを使っていつでもチェックしましょう

# SPページのチェック方法
デバックツール・Auditsを使います
こちらはSPページでしか実行することができません

## 1: Auditsの出し方
もしデバックツールに出ていなかったら以下で出してください
デバックツールを開いた状態で `Command + Shift + P`
すると検索が出てきますので　 `show audits` と打ち込んで出てきたものをクリック
<img width="1028" alt="スクリーンショット 2017-09-12 午前10.54.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/80770/875eeee8-43a1-68e0-2337-e77a6f0a163f.png">

## 2: a11yの達成状況を調べる
今回はa11yを調べたいだけなので
Accessibilityのみにチェックをいれて`Run`

<img width="539" alt="スクリーンショット 2017-09-12 午前10.56.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/80770/74e2923b-ae21-6c77-838d-56348f5bde83.png">

しばらくすると、以下のように結果が出てきますので、warming以上は治しましょ

<img width="742" alt="スクリーンショット 2017-09-12 午前10.57.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/80770/ebe53e36-64da-270c-7861-990cac542f92.png">


# PC/SPページのチェック方法

Legacy Auditsを使います
SPの方法よりは精度が落ちてしまうので、SPはなるべくこちらを使わないようにしましょう

## 1: Legacy Auditsの出し方
デバックツールを開いた状態で `Command + Shift + P`
すると検索が出てきますので　 `show legacy audits` と打ち込んで出てきたものをクリック

## 2: a11yの達成状況を調べる
今回はa11yを調べたいだけなので
Accessibilityのみにチェックをいれて`Run`

<img width="748" alt="スクリーンショット 2017-09-12 午前10.50.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/80770/8ac0eb0e-775c-bee6-920b-ea177847533e.png">

しばらくすると、以下のように結果が出てきますので、warming以上は治しましょ
<img width="748" alt="スクリーンショット 2017-09-12 午前10.51.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/80770/9c1cb2c9-c944-8b73-bc11-a26d43fa7003.png">


---

細かく調べて細かく治して、素晴らしいwebページを作りましょう◎
エラー：The error message PGOConnectionDead could not be found in the en-US locale.

タブローのカスタムSQL構文を入力してOKを押すと発生
レッドシフトのODBCドライバアンインストール→インストールで治った

http://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/install-odbc-driver-windows.html
正規表現でMatch groupsごとにさらにグループができる場合について

メモのためにまとめ

`123--abc,123--abc,123--abc`を`(\d*)--([a-z]*)`でマッチするとこうなる。

```

Match 1
1.	123
2.	abc
	
Match 2
1.	123
2.	abc

Match 3
1.	123
2.	abc

```

https://stackoverflow.com/questions/4692437/regex-with-named-capture-groups-getting-all-matches-in-ruby
http://rubular.com/r/tVl3A1RZSI
MySQLのJSONを複数検索

MySQLのJSONの中を検索したくて
`where {col} IN `
みたいな感じで一発でできないか探したけど見つからなかった。。。

やったのはjsonのカラムが

| id       |       json_col |
|:-----------------|------------------:|
| 1             |              ["1","2","4"] |
| 2           |            ["1","5","7"] |

上記のようなテーブルデータでjsonの中を検索したい時

```
SELECT json_col FROM TBL 
WHERE ( JSON_SEARCH(json_col, 'ALL', '2')>0 ) OR ( JSON_SEARCH(json_col, 'ALL', '7')>0 )
```

みたいに`JSON_SEARCH`を並べる

がとりあえず。




`JSON_SEARCH(json_col, 'ALL', '["2","4"]')>0`
みたいにして検索できないもんですかね。
python を mysql 繋ぐ

pythonを mysql に繋ごうとした時に、 pip が必要なことが判明した。

```
>curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python
```
と叩いても

```
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100   260  100   260    0     0    674      0 --:--:-- --:--:-- --:--:--   674
You're using an outdated location for the get-pip.py script, please use the one available from https://bootstrap.pypa.io/get-pip.py
```

とエラーが出てしまう時、叩くコマンドが古いっぽい

```
curl -kL https://bootstrap.pypa.io/get-pip.py | sudo python
```

と叩けば、大丈夫。インストールできたら確認をする

```
> pip -V
pip 9.0.1 from /Library/Python/2.7/site-packages (python 2.7)
```
CA.io #1 - マッチングサービスを支えるElasticsearchメモ


# event URL
https://cyberagent.connpass.com/event/65002/

# Speak


## Elasticsearch 6.0 is coming  
@jotani elastic 


* Elatic Pioneer Program
	* バグ出ししてGuthub issueを。
* アップグレード
	* 6系になってクラスタを1台ずつアップグレードすることでできるようになったので簡単になった。
	* Upgrade Assistant(UI & API)



* 内部のLuceneが7にアップデート、空要素が多い項目もつかいやすくなった。ディスク容量も少なく。
* sort条件をindexのタイミングで設定できる。index速度は落ちるが、検索速度は上げれる。
* Replicationの速度が速くなった。
* _typeが無くなった。
	* 6では_typeはDeprecared、ただし5系のindex使うためだけに残っているため、新規では作れない。
* curlとかで投げる時にContent-Typeはrequest headerにつける。
* Java High Level Rest Client (at.5.6.0)


## タップル誕生がESを導入した3つの理由
Antonio Valverde　@toniov - github 株式会社マッチングエージェント

* 1. 検索の速度向上
	* MongoDB
		* ave 1,250ms
		* ES 231ms
	* 絞り込み項目が多い
		* MongoDBはこういった検索には向かなかったという結論
* 2. より複雑な検索を実現する
	* タップルショップ
		* モテタイマー
		* ドリームマシーン
	* Multi search API
		* パフォーマンスに余裕が出たのでマルチサーチができるようになった
			* 並び順 新規60% 既存40%
	* Full text searchを実装中
* 3. 他の検索エンジンよりタップルに合っていた
	* EoD
	* JSON-based
	* Designed for the Cloud
	* 社内である程度使われていた
	* トレンド

## 位置情報を用いたElasticsaerchの活用事例(CROSSME)
川田 浩史　株式会社プレイモーション

* すれ違いの定義
	* 特定の時間内で特定の距離にいた場合
		* ユーザーごとに緯度経度・更新時間を持つ
		* 一定時間、一定期間内に異性ユーザがいるかどうかを取得
* 逆Geocoding
	* 緯度経度から住所を検索するAPI
		* リクエスト数では非常に高価
	* 国土交通省が出してるcsvをESに突っ込む。
		* パラメータは全部stringで持つ。
* Geo Shape
	* 指定した区間の中で特定地域にいるのを出す。(六本木ヒルズとか。)
	* 左回りで検索するか、右回りで検索するかで動きが変わる。

## mimiのElasticsearch活用事例
矢崎 亮太　株式会社シーエー・モバイル

* 好きな顔で検索できる
	* カスタムタイプでさらに絞れる
	* 男女で検索が違う
* 検索条件
	* 必須項目
		* 年齢
		* 住み
		* 加工画像
	* optional
		* タバコとか
* データはMySQLで検索だけESに。
* インデックス再構築事例
	* 再定義はできないので、切り替えを考える
	* indexをstringで置いて苦労した
* 自分に合った相手を並び替える
	* マッチングサービスにとってこれが大事！


## Torteが実践したマッチしたユーザを除く3つの方法
中川 武憲　株式会社トルテ	@ww24 github

* レディーファーストの恋アプリ
* マッチしたユーザを除く3つの方法
	* documentに持たせる
		* exclued_usersに持たせる。
			* マッチ済み、ブロックなどの都度更新
			* こいつが肥大して重くなるというデメリットもある。
	* queryに持たせる
		* シンプルで更新速度が速いが、検索が遅くなる
	* Parent-childに持たせる
		* childにユーザIDをもたせて子に自分を持たないものを検索
UIWebViewのUAのこと

# ユーザーエージェント(User Agent:UA)とは？
PCやアプリからどこかのWebページを表示する時に使う「自分はどんなやつですよ（こんなブラウザから見てる人ですよ）」という名札のこと

たとえばこういうの
**Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Mobile/14G60**

サイト側はユーザーエージェントを判定して、PC用のサイトとモバイル用のサイトを切り替えたりする
ただし、UAは偽装することもできるので、完全に信頼してはいけない


# WebViewのUAをカスタマイズする
NSUserDefaultsの"UserAgent"キーで値を登録すると、UAをカスタマイズできる。
★実際に使うUIWebViewのインスタンスを生成するよりも前に行うこと(didFinishLaunchingWithOptionsなど)

```objc++
// デフォルトのUserAgentを取得する
UIWebView *webview = [[UIWebView alloc] init];
NSString *originalUA = [webview stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];

// デフォルトのUAに独自の文字列を追加する
NSString *customUA = [NSString stringWithFormat:@"%@ %@", originalUA, @"追加したい文字列"];

// UserAgentをキーに辞書を作成
NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:customUA , @"UserAgent", nil];

// UserDefaultsにカスタムUAを登録する
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
```
ちなみに
registerDefaultsで登録した内容は、アプリを終了すると消える
setObjectで登録した内容は、アプリを終了しても消えない（アプリ削除しない限り）

# 参考
「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
http://wa3.i-3-i.info/word1452.html

WebViewのユーザーエージェントをカスタマイズする (iOS)
http://docs.repro.io/ja/dev/sdk/webview/custom-ua-ios.html#webview-ios
PBXCp Error でビルドが通らないのでやったこと

# はじめに

共同開発でiOSライブラリをアップデートしようと思ったところ、**PBXCp Error**が発生しビルドが通りませんでした。
<img width="257" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/129900/f825e7a5-e5a7-ee60-a2a5-a6ff685ed139.png">

<img width="1139" alt="DAAA15E7-135A-4FDC-AC63-FEEC98172F79.png" src="https://qiita-image-store.s3.amazonaws.com/0/129900/1f0d9922-89a4-d381-ec7c-c18de7797d45.png">


こちらのファイルがないって言われています


# やったこと
## DerivedData の確認・削除
```
$ ls ~/Library/Developer/Xcode/DerivedData
...
SYBlinkAnimationKit-ber*************************
SYBlinkAnimationKit-bhx*************************
...
```

ビルド時に要求されているパスは、`SYBlinkAnimationKit-bey*************************` なので、すであるものとは別でした。
（上記のDerivedDataは、Xcode 8, Xcode 9でそれぞれビルドを実行した際に生成されたものです。）

とりあえず、これらを削除して再度ビルドを実行してみましたが同じパス（DerivedData）が生成されるだけでした。
`~/Library/Developer/Xcode/DerivedData` ごと削除するのも試しましたが、残念


DerivedDataについては以下を参考にしました
* [Xcode 8.2 年末なので Xcode まわりの不要ファイルを一掃してみた ｜ Developers.IO](http://dev.classmethod.jp/smartphone/remove-xcode8-related-unnecessary-files/#data) 
* [Xcode で Derived Data を簡単に削除する方法](https://ez-net.jp/article/C9/qUKZiJ9B/vI-nxInyf79k/)

## Copy Bundle Resources の確認

* [ファイルが見つからない PBXCp Error が出た時の対処法 - Qiita](http://qiita.com/mop/items/3d7c79bd92e5f356e1b7)
* [XcodeのPBXCp Error – 寝坊した](http://oversleptabit.com/?p=1210)

これらに従い、Build Phases ＞ Copy Bundle Resources の赤くなっているファイルを削除しようと思いましたが、ありませんでした。

<img width="981" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/129900/825f72a5-8f07-0278-b660-58daad0ab5ac.png">


# 解決
Build Phases ＞ Embed Frameworks にあるファイルを-で削除しました
これでビルドがうまく通りました！

<img width="1007" alt="E505DA0D-3844-4C2E-B76B-28BA25DB3118.png" src="https://qiita-image-store.s3.amazonaws.com/0/129900/f81494f5-8eeb-b7f4-bb9a-00fdf1fced47.png">

参照先が手元に存在しない`SYBlinkAnimationKit-bey*************************` であったのを解除したということでしょうか（あまり理解していません）
C#のメモ帳　SqlDataReaderの変数の使いまわし

.ExecuteReader()の戻り値を格納する変数の使いまわし。
readerを一旦クローズして、改めて.ExecuteReader()の戻り値を格納してます。
見かけない書き方ですが…メモリーリークとか将来の障害とか…問題あるんでしょうかねぇ。


```csharp:readerを使いまわす！
	private void button1_Click(object sender, EventArgs e)
        {

            SqlConnection conn = new SqlConnection();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader;

            conn.ConnectionString = @"Data Source=　…　接続文字列　…";
            conn.Open();
            command.Connection = conn;

            //1回目----------------------------------------------------------------------
            command.CommandText = "select 氏名, 所属 from ユーザマスタ where 社員番号 = '123123'";
            reader = command.ExecuteReader();

            while (reader.Read())
            {
                Console.WriteLine("氏名: {0}  所属: {1}", reader["氏名"], reader["所属"]);
            }


            reader.Close();         //<------一旦クローズ!!!


            //2回目----------------------------------------------------------------------
            command.CommandText = "select 氏名, 所属 from ユーザマスタ where 社員番号 = '456456'";
            reader = command.ExecuteReader();

            while (reader.Read())
            {
                Console.WriteLine("氏名: {0}  所属: {1}", reader["氏名"], reader["所属"]);
            }

            conn.Close();

	}

```
GPSカー　シュミレータ

#概要
GPSで自動走行する、コンテストがある。
実機を借りて、アプリから操作する部門がある。
実機は無いので、シュミレータを作ってみた。

#環境
windows xp
visualstudio 2010
Android 4.2.2

#動画

https://www.youtube.com/watch?v=6FnP8Njgm-Y

#写真

![sim.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/7bb0f99e-fb67-d8d2-7141-17f491223ada.jpeg)


#Bluetoothの準備
amazonから、以下のモジュールを調達。
![](https://images-na.ssl-images-amazon.com/images/I/613uQU8AbRL._SY355_.jpg)
パターンが狭くて、半田付けに苦労したが、何とか電源は供給できた。
Nexus7（2012）とペアリングは、「202SH」と表示はでるが、できなかった。

#Bluetoohの準備２
上のモジュール、見たことあるなと思っていたら、OBDスキャナのELM327についてた。
Nexus7でペアリング、できてた。
ELM327をばらして、モジュールを取り出したが、電源ラインがショートしてる。

#Bluetoothの準備３
USBのbluetoothトングルを使う。バージョンは2.0
シリアルポートがある。IVT　BLUESOLEILを使う。バージョンは１．４
COM14で認識した。

#シュミレータのプログラム
ｃ＃を使いました。
シリアルポートから、コマンドを読み込んで、画面の表示と１００ｍｓ毎の通信を行います。

#アンドロイド、アプリ
ペアリングされた、デバイスをスピナーで選択させます。
スタートを押せば、「ｗ」「ｇ」を送って、位置情報をパースしながら、
ステートマシンでウェイポイントを切り替えて、自動操縦します。

#嵌まった点

arduinoの精度がfloatなので、最初、floatで作成したが、位置がずれるので、doubleに書き換えた。


以上
【Unity】オブジェクトをJsonにシリアライズしてテキストに保存・読み込みする

ゲームのセーブデータをJsonとしてテキストに保存して読み込むために、その方法を調べたメモとサンプルです。

```c#:SaveManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System; // UnityJsonを使う場合に必要
using System.IO; // ファイル書き込みに必要

// [Serializable] をつけないとシリアライズできない
[Serializable]
public struct SaveData {
  public int x;
  public int y;

  public void Dump() {
    Debug.Log("x = " + x);
    Debug.Log("y = " + y);
  }
}

/// <summary>
/// セーブデータ管理
/// </summary>
public class SaveManager : MonoBehaviour {

  // 保存するファイル
  const string SAVE_FILE_PATH = "save.txt";

  void Update () {
    if (Input.GetKeyDown (KeyCode.S)) {
      // Sキーでセーブ実行
      var data = new SaveData ();
      data.x = 5;
      data.y = 7;
      // JSONにシリアライズ
      var json = JsonUtility.ToJson (data);
      // Assetsフォルダに保存する
      var path = Application.dataPath + "/" + SAVE_FILE_PATH;
      var writer = new StreamWriter (path, false); // 上書き
      writer.WriteLine (json);
      writer.Flush ();
      writer.Close ();
    } else if (Input.GetKeyDown (KeyCode.L)) {
      // Lキーでロード実行
      // Assetsフォルダからロード
      var info = new FileInfo(Application.dataPath + "/" + SAVE_FILE_PATH);
      var reader = new StreamReader (info.OpenRead ());
      var json = reader.ReadToEnd ();
      var data = JsonUtility.FromJson<SaveData>(json);
      data.Dump();
    }
  }
}
```

"S"キーを押すと、テキストに保存、"L"キーを押すと、テキストから読み込み、となっています。

```json:"S"キーで保存したテキスト
{"x":5,"y":7}
```

"L"キーでJsonテキスト読み込み
![Unity_2017_1_0f3_Personal__64bit__-_Main_unity_-_UnityRL_-_PC__Mac___Linux_Standalone__Personal___OpenGL_3_3_.png](https://qiita-image-store.s3.amazonaws.com/0/43772/782a355e-ec82-0dba-6e04-5eafbf14cba2.png)


注意点は

* `using System;` しないと UnityJson が使えない(`[Serializable]`も使えない)
* `using System.IO` がファイル書き込みに必要

ですね

## 参考

* [Unity マニュアル - JSON 形式にシリアライズ](https://docs.unity3d.com/ja/540/Manual/JSONSerialization.html)
* [【Unity】文字列をファイルに書き出す【Log出力】](http://chroske.hatenablog.com/entry/2015/06/29/175830)
* [Unityで外部データ読み込み](http://qiita.com/WassyPG/items/5e4d3df219bba2a14f81)
terminalからVisual Studio Codeを開く超簡単な設定

## VSCodeにcodeコマンドが使えるようにする設定をする
1. `command + Shift + p`で、コマンドパレットを開く
2. shellと入力し、```Shell Command: Install `code` command in PATH```を選択し、code commandをインストール
![スクリーンショット 2017-09-12 8.25.27.png](https://qiita-image-store.s3.amazonaws.com/0/32982/1286c403-31c4-b8db-d3ac-7bf3d73f828d.png)

![スクリーンショット 2017-09-12 8.39.41.png](https://qiita-image-store.s3.amazonaws.com/0/32982/c8db6340-87d9-32d1-88f7-f3155f13d818.png)


## terminalでコマンドを打ち込む
code [ファイル名]で、vscodeが立ち上がり、ファイルを編集できるようになる。
![スクリーンショット 2017-09-12 8.27.53.png](https://qiita-image-store.s3.amazonaws.com/0/32982/26eee2d7-b657-6b70-42b9-18fc49d95b3a.png)

![スクリーンショット 2017-09-12 8.28.17.png](https://qiita-image-store.s3.amazonaws.com/0/32982/e5d850c1-c9bd-b2df-71f7-80c92f310da3.png)

## 以上
私は、Atomを使用していましたが、めっちゃ重いと感じ、VSCodeに移りました。
VSCodeは、結構プラグインが豊富で、その上軽く、愛用しています。

[Visual Studio Code](https://code.visualstudio.com)
Node-REDからデータベースをアクセスする

Node-REDとMySQLを使ってシンプルなウェブサイトを作ってみます。
 
#1. Node−REDフローでMySQLの表からデータを読む
- Node-REDに下記のフローをコピペします

```:Node-REDでMySQLから読む
[{"id":"46a32e78.28b46","type":"mysql","z":"364c8480.a7f89c","mydb":"9758a03.7a54be","name":"","x":450,"y":100,"wires":[["4e5306bc.5d605"]]},{"id":"50452e49.b6781","type":"inject","z":"364c8480.a7f89c","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":100,"y":100,"wires":[["fbe438e7.e32b28"]]},{"id":"4e5306bc.5d605","type":"debug","z":"364c8480.a7f89c","name":"","active":true,"console":"false","complete":"false","x":610,"y":100,"wires":[]},{"id":"fbe438e7.e32b28","type":"function","z":"364c8480.a7f89c","name":"select文を準備","func":"msg.topic = \"select * from table01;\";\nreturn msg;","outputs":1,"noerr":0,"x":280,"y":100,"wires":[["46a32e78.28b46"]]},{"id":"9758a03.7a54be","type":"MySQLdatabase","z":"","host":"127.0.0.1","port":"3306","db":"DB01","tz":""}]

```

<img width="966" alt="スクリーンショット 2017-09-11 17.27.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/58968766-8419-b5f0-64f0-4fef0ff4c79b.png">

- 「DB01」と書かれているMySQLノード（オレンジ色）をダブルクリックで開きます
- 「mysqlノードを編集」画面で、「Database:DB01」の右にある鉛筆マークを選択して編集モードにします

<img width="511" alt="スクリーンショット 2017-09-11 17.27.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/cddf1184-59eb-3324-4052-275da5689dec.png">

- 「MySQLdatabaseノードを編集」画面で、MySQLのユーザー名とパスワードを指定します。デフォルトでデータベース名として「DB01」を指定してあるので、使用しているデータベースに合わせて適宜データベース名を変更します。

<img width="504" alt="スクリーンショット 2017-09-11 17.27.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/93d6b120-40cf-f073-422a-13692361cb29.png">

- 「更新」→「完了」で保存します
- 「デプロイ」を押してNode-REDへ反映させます
- 「DB01」の下に「connected」と表示され、MySQLへ接続していることがわかります

<img width="1675" alt="スクリーンショット 2017-09-11 17.33.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/8428fc34-3871-60ec-2976-381f7bd26673.png">

- フロー右端の緑の「Debug」ノード（「msg.payload」と記載）のタブが引き出されていること、画面右端の「デバッグ」タブが選択されていることを確認し、フロー左端の「Timestamp」と表示されているInjectノード（灰色）の左側のタブをクリックしてリクエストを送付し、MySQLの表からデータが読み出されることを確認します。デバッグ出力に出力された「Object」と表示された項目をクリックして展開することでデータが表示されます。

<img width="1680" alt="スクリーンショット 2017-09-11 17.34.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/0df7f688-2cc7-2adc-4b2c-b38a0f62f9e7.png">
Node-REDにMySQLノードを追加する

Node-REDとMySQLでシンプルなウェブサイトを作ってみます。
 
#1. Node-REDにMySQLノードを追加する 
- Node-REDが停止していることを確認します。Node-REDは[Cntl]+Cで停止します
-[npm node-red-node-mysql](https://www.npmjs.com/package/node-red-node-mysql)を参照し、`npm install node-red-node-mysql`でNode-REDにMySQLノードを追加します

```:Node-REDにMySQLノードを追加
MacBook-Pro:tigergate tohru$ npm install node-red-node-mysql
node-red-project@0.0.1 /Users/tohru/Desktop/tigergate
└─┬ node-red-node-mysql@0.0.16 
  └─┬ mysql@2.14.1 
    ├── bignumber.js@4.0.2 
    ├─┬ readable-stream@2.3.3 
    │ ├── core-util-is@1.0.2 
    │ ├── inherits@2.0.3 
    │ ├── isarray@1.0.0 
    │ ├── process-nextick-args@1.0.7 
    │ ├── string_decoder@1.0.3 
    │ └── util-deprecate@1.0.2 
    ├── safe-buffer@5.1.1 
    └── sqlstring@2.2.0 

npm WARN node-red-project@0.0.1 No repository field.
npm WARN node-red-project@0.0.1 No license field.
MacBook-Pro:tigergate tohru$ 

```

- Node-redを起動し、MySQLノードが追加されていることを確認します

<img width="203" alt="スクリーンショット 2017-09-11 17.15.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/687e5a0f-c3d7-5583-4b88-6e3cafa1e6bd.png">
Rails5でJSON APIのテストする際、POSTのパラメーターとして渡した２次元配列が展開されてしまう問題の対処法

ActionController::TestCaseの仕様なのでRspecに限らないが、例えばRspecを使用した場合。

```ruby
it 'POSTでリソースが作成できる' do
  params = { paris: [[1, 2], [3, 4]] }
  post '/resources', params
  expect(response).to have_http_status :created
end
```

ブラウザからは問題なくリソースの作成が行えるがテストはコケる。

原因を調べるためにコントローラー側で`binding.pry`すると
以下のようにparamsが展開されてしまっていることが分かった。

```ruby
params[:paris] # => ["1", "2", "3", "4"]
```


解決するには`post`に`as: :json`オプションを渡してあげればいい。

```ruby
it 'POSTでリソースが作成できる' do
  params = { paris: [[1, 2], [3, 4]] }
  post '/resources', params, as: :json
  expect(response).to have_http_status :created
end
```
参考：
[Allow setting of request CONTENT-TYPE with as: in controller tests](https://github.com/rails/rails/pull/26212)

問題が起きた原因はテスト時のデフォルトのContent-Typeが`application/x-www-form-urlencoded`であること。
ネストされていない配列だったら問題ないがネストされた配列だと、パラメーターのparse時に構造が失われてしまう。

JSON形式で送ればパラメータの構造は維持されるので問題は起きない。
pythonにおける「==」と「is」の違いについて

#　はじめに
オブジェクト同士を比較する方法として「==」と「is」があるが使い分けがイマイチ分からなかったので違いをまとめてみた。

# 「==」について
オブジェクト１とオブジェクト２が等価か比較する。等価とは「同じ値を持っているか」と言う意味。

```test01.py
object1=100
object2=100

if object1 == object2 :
    print("等価である")
else :
    print("等価ではない")

#出力：等価である
```
test01.pyではobject1とobject2は同じ値（int型の100）を持っているためif文はTrueと評価。
<br>

```test02.py
object1=100    #int型の100
object2="100"  #str型の100

if object1 == object2 :
    print("等価")
else :
    print("等価ではない")

#出力：等価ではない
```
test02.pyでは「int型の100」と「str型の100」を比較しているためif文はFalseと評価。


# 「is」について
「is」は比較したオブジェクトが「同一のオブジェクトかどうか」を調べる。

```test3.py
object1=[1,2,3]
object2=[1,2,3]

print(object1 is object2)
print(object1 is object1)

#出力
#False
#True

```
オブジェクトを生成するとそのオブジェクトにid番号(ユニークな番号)が振られる。「is」はこのidを比較して同一のオブジェクトかを調べている。id番号はidメソッドで調べられる。

```test04.py
object1=[1,2,3]
object2=[1,2,3]

print(id(object1))    #id()でそのオブジェクトのid番号調べる
print(id(object2))

print(object1 is object2)
print(object1 is object1)

#出力
#4488767496    (object1のid番号)
#4488768392    (object2のid番号)
#False
#True
```
※id番号は環境によって異なる。

#まとめ
「==」は比較されたオブジェクトが等価か調べる。
「is」は比較されたオブジェクトのidが等価か調べる。
react-native, android, circleCI2.0, fastlaneでdeploy gateへのテスト版自動配信

ブログにも記事をうつしました。[react-native, android, circleCI2.0, fastlaneでdeploy gateへのテスト版自動配信](http://u-kan.hatenadiary.jp//entry/rn-deploy-auto)

情報が足りなくてとても辛かったので、情報共有に。

## システムの作動順序

1. githubのstagingにPR
2. merge
3. circleCIでbuild用に必要な環境構築
4. fastlane経由ででdeploygateへのビルド&デプロイコマンド叩く

書くことが増えるのも嫌なので、ここでは3.のcircleCIの設定だけにフォーカスする。


## 設定ファイル

諸々の説明は公式ドキュメントを参考にした。

```.circleci/config.yml
version: 2
jobs:
  build:
    docker:
      - image: circleci/android:api-25-alpha

    working_directory: ~/client

    environment:
      JVM_OPTS: -Xmx3200m
      ANDROID_HOME: /opt/android/sdk
    branches:
      only:
        - staging
    steps:
      - checkout
      - run:
          name: install android ndk
          command: |
            wget https://dl.google.com/android/repository/android-ndk-r10e-linux-x86_64.zip
            sudo apt-get install p7zip-full
            7z x android-ndk-r10e-linux-x86_64.zip
            rm android-ndk-r10e-linux-x86_64.zip
            sudo mv android-ndk-r10e /opt/android
            export ANDROID_NDK_HOME=/opt/android/android-ndk-r10e
            export PATH=${PATH}:$ANDROID_NDK_HOME
            curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash -
            sudo apt-get install -y nodejs
            npm install
            sudo apt-get install ruby2.3 ruby-dev make g++
            sudo gem install fastlane
            cd $HOME/client/android && fastlane android dg
      - store_artifacts:
          path: app/build/reports
          destination: reports

```

はまりポイントは、次の点くらいかな、、と思います。

- nodejsをdebian環境にインストールする
- android ndkのパッケージをどこからダウンロードするか


あれ、だいぶ薄い記事になったな。。
[Rails5.1][Vue.js] 動かそうとするとコンポネントエラーになる問題

Rails5〜から、Webpackerが使いやすくなったのですが
Vue.jsを載せて動かそうとすると以下エラーが発生します。

>
[Vue warn]: You are using the runtime-only build of Vue where the template compiler is not available. Either pre-compile the templates into render functions, or use the compiler-included build.

## 解決法

この問題の解決法は、以下の記事で紹介されています。
http://qiita.com/magaya0403/items/3fbe9aa20c6a66b76662

紹介されている通りWebpackのconfigファイルに "aliasを追加する" ことで解決できるのですが、自分のProjectには`config/webpack/shared.js`が見当たりませんでした。

なので今回は他のconfigファイルにaliasを追加し、このエラーを回避する方法を見つけたので紹介させていただきます。

```config/webpack/production.js
const environment = require('./environment')

module.exports = Object.assign({}, environment.toWebpackConfig(), {
  resolve: {
    alias: {
      'vue$': 'vue/dist/vue.esm.js'
    }
  }
})
```


```config/webpack/development.js
const environment = require('./environment')

module.exports = Object.assign({}, environment.toWebpackConfig(), {
  resolve: {
    alias: {
      'vue$': 'vue/dist/vue.esm.js'
    }
  }
})
```


```config/webpack/test.js
const environment = require('./environment')

module.exports = Object.assign({}, environment.toWebpackConfig(), {
  resolve: {
    alias: {
      'vue$': 'vue/dist/vue.esm.js'
    }
  }
})
```

それぞれの環境のconfigファイルにObject.assignを使ってあげれば動作します。
JPQLからデータベースのユーザー定義関数を利用する

# 概要

Spring BootとSpring Data JPA(ORMはHibernate)で実装したアプリケーションで、JPQLからデータベースのユーザー定義関数(`create function xxx ...`)を利用するサンプルコードです。

**環境**

* Windows10 Professional
* Java 1.8.0_144
* Spring Boot 1.5.6
    * Spring Data JPA 1.11.6
    * Hibernate 5.0.1
* MySQL 5.6.25


**参考**

* [How to call custom database functions with JPA and Hibernate] (https://www.thoughts-on-java.org/database-functions/)
* [How to use a custom function in a jpa query?] (https://stackoverflow.com/questions/42484199/how-to-use-a-custom-function-in-a-jpa-query)
* [MySQL 5.6 リファレンスマニュアル / 13.1.15 CREATE PROCEDURE および CREATE FUNCTION 構文] (https://dev.mysql.com/doc/refman/5.6/ja/create-procedure.html)

# サンプルコード

## データベースのユーザー定義関数

サンプルのJPQLで利用するユーザー定義関数です。2つの引数の合計を返します。

```sql
DELIMITER //

DROP FUNCTION IF EXISTS calculate//

CREATE FUNCTION calculate(x INT, y INT) RETURNS INT
DETERMINISTIC
CONTAINS SQL
BEGIN
    RETURN x + y;
END
//

SHOW WARNINGS//

DELIMITER ;
```

```sql
select calculate(1,1);
+----------------+
| calculate(1,1) |
+----------------+
|              2 |
+----------------+
1 row in set (0.00 sec)
```

## Dialect

Dialectをカスタマイズしてユーザー定義関数を登録します。
この実装はユーザー定義関数をselect句で使用する場合に必要です。where句で使う分には必要ありません。

```java
package com.example.domain.datasource;

import org.hibernate.dialect.MySQL5Dialect;
import org.hibernate.dialect.function.StandardSQLFunction;
import org.hibernate.type.IntegerType;

public class CustomMySQLDialect extends MySQL5Dialect {
    public CustomMySQLDialect() {
        super();
        registerFunction("calculate",
                new StandardSQLFunction("calculate", new IntegerType()));
    }
}
```

### application.yml

カスタマイズしたDialectを使用するようにapplication.ymlで指定します。

```yaml
spring:
  jpa:
    properties:
      hibernate:
        dialect: com.example.domain.datasource.CustomMySQLDialect
```

## JPQLでユーザー定義関数を使う

ユーザー定義関数を使用するには`FUNCTION('関数名', 引数1, 引数2, ...)`と記述します。

```java
Integer result = (Integer) entityManager.createQuery("SELECT FUNCTION('calculate', i.price, 100) FROM Item AS i WHERE i.id=:id")
        .setParameter("id", 1L)
        .getSingleResult();
System.out.println(result);
// → 300
```

発行されるSQL

```sql
select
    calculate(item0_.price,
    100) as col_0_0_ 
from
    item item0_ 
where
    item0_.id=?
```

ちなみに、サンプルコードにはありませんがItemエンティティのID=1のpriceは200です。

```sql
select price from item where id = 1;
+-------+
| price |
+-------+
|   200 |
+-------+
1 row in set (0.00 sec)
```
OpenAI GymをJupyter notebookで動かすときの注意点一覧

# Jupyter notebookでOpenAI Gymを動かすために，やったこと．

## 環境
CentOS7, Jupyter notebook(サーバー上,anaconda),notebookはssh接続でクライアントから操作．

##目的
- OpenAI GymのCartPole-v0を動作させ，アニメーション化する．

## やったこと
- Nvidiaのドライバを「./NVIDIA-Linux-x86_64-XXX.XX.run --silent --no-opengl-files --no-libglx-indirect --dkms」でインストールする．（再インストールした，reboot必要）
- xvfbをインストールする(yum)
- pygletを導入する(pip) (100%必要かは不明)
- pipでインストールしたpygletで，pyglet/gl/__init__.pyの"del base"がNameErrorになるので削除(削除した影響については未調査だがせいぜいメモリ圧迫するぐらい？)
- Jupyterの起動を「nohup xvfb-run -s "-screen 0 1400x900x24" jupyter notebook &」とする
- あとは，OpenAI Gymの公式サイトのインストール方法に従う．

## 必要なかったこと
- (sshクライアント側)Xmingのインストール(GLXがないとかXを使うやらのエラーメッセージに騙されたが，そもそも必要ない)

## OpenAI Gym(CartPole-v0)を動かすのにかかった時間
約7時間

## 動いたサンプルコード(CartPole-v0)
```py3:sample.py
import gym
from matplotlib import animation
from matplotlib import pyplot as plt
%matplotlib nbagg

env = gym.make('CartPole-v0')

# Run a demo of the environment
observation = env.reset()
cum_reward = 0
frames = []
for t in range(5000):
    # Render into buffer. 
    frames.append(env.render(mode = 'rgb_array'))
    action = env.action_space.sample()
    observation, reward, done, info = env.step(action)
    if done:
        break
env.render(close=True)

fig = plt.gcf()
patch = plt.imshow(frames[0])
plt.axis('off')

def animate(i):
    patch.set_data(frames[i])

anim = animation.FuncAnimation(fig, animate, frames = len(frames), interval=50)
anim
```

以上
Atomの認証proxy設定（ドメイン有りの場合）


## 概要

proxyの設定に関しては下記サイトを参考にします。

[ATOMエディタのproxy設定](http://qiita.com/tsukamoto/items/cef0f2d7e2b33a26a9e5)

それでも、proxyを通すことができなかった経緯と、解決策について記載します。

## 経緯

転職先の会社でAtomをインストールしようとしたところ、proxyが全く通らない。
色々試していくうちに、proxyのユーザー名の先頭に必要な **ドメイン** が悪いらしい
（転職先の会社はどうやらシンクライアント？）。

つまり、proxyを通してインターネットに接続する際、

	ユーザー名: DOMAIN¥USERNAME

というように、「ドメイン名＋バックスラッシュ＋ユーザー名」という形式になっていました。


## 解決策（認証proxy記述方法）

`apm`コマンドで登録するか、`.apmrc`に設定を記述します。

### ドメイン無し
```
http-proxy http://username:password@proxy-host:port
https-proxy http://username:password@proxy-host:port
```
※ https-proxyでも、値は「http://」

### ドメイン有り
```
http-proxy http://domain%5Cusername:password@proxy-host:port
https-proxy http://domain%5Cusername:password@proxy-host:port
```

### 説明

ドメイン無しと比較すると、`domain%5C`を追加しています。

|形式|内容|
|:--|:--|
|domain|ドメイン名（ネットワークに接続する際のバックスラッシュの前部分）|
|%5C|バックスラッシュの[URLエンコードの記述](http://manual.iij.jp/cac/cacapi/753744.html)|
|username|proxy認証ユーザー名|
|password|proxy認証パスワード|
|proxy-host|proxyのホスト（e.g. `proxy.company.co.jp`）|
|port|10080や、8080など、設定による|

## その他（SublimeText3の場合）

Atomが重くて動かなくなったので、SublimeText3でも同様にproxy設定を行いました。
その際にも若干ハマったので、備忘録として記載します。

基本は以下を参考にしました。

[認証付きプロキシの環境でPackage Controlを導入する方法](http://qiita.com/nomadmonad/items/ed172b595bb300727340)


### PackageControlのインストール
コンソール経由でPackageControlを入れる際のドメイン付きプロキシ設定は以下の通りです。

```
...
urllib.request.ProxyHandler({"http": "http://[domain]%5C[username]:[password]@[proxy_server]:[port]", "https": "https://[domain]%5C[username]:[password]@[proxy_address]:[port]"})) );
...
```
※ 抜粋しています。全文は公式ページで取得を推奨。

つまり、[username]の前に、`[domain]%5C`を挿入します。

### PackageControlの設定

インストール後、各パッケージをインストールする際にもproxyを通さないといけないので、その設定を行います。

上記参考サイトに従って、ユーザーの設定に以下を追記します。

```json:
{
    "http_proxy": "http://[proxy_server]:[port]",
    "https_proxy": "https://[proxy_server]:[port]",
    "proxy_username": "[domain]¥¥username",
    "proxy_password": "password"
}
```

変更点は、`proxy_username`のユーザー名にドメイン（[domain]）を挿入していますが、ドメイン名とユーザー名の繋ぎは、今回はURLエンコードではなく、バックスラッシュをエスケープする形で、「¥¥」が正解です（1個じゃだめ）。
VMwareの仮想イメージがどっかいった時の復旧(Ubuntu on VMware Workstation on Windows 7)

##■要約
・いろいろあって、VMwareの仮想イメージがどこかにいってしまたので、その捜索と復旧についての手順



##■背景（読まなくてよい）
・Windows7がブート段階でクラッシュ、HDDデータは無事だがOSが起動しない
・Windows7を再インストール
・基本的にデータは無事だったけど、C:\Windowsはまっさらになっていた
・と思いきや、Cドライブ上にC:\Windows.oldとしてバックアップされていた



##■マシン
物理　Windows 7 Home Premium SP1 64bit /16GB Memory
ＨＶ　VMware Workstation 12 Player
仮想　Ubuntu 14.04.3 x32 / 2GB Memory



##■手順
**手順１：**VMwareの仮想OSイメージファイルとなる、構成ファイル (.vmx)のディレクトリに移動
・デフォルト　```C:\Users\[ユーザ名]\Documents\Virtual Machines\Ubuntu```
・OS再インストールしちゃった場合は　```C:\Windows.old\Users\[ユーザ名]\Documents\Virtual Machines\Ubuntu```
・もうわかんなくなっちゃった場合（コマンドプロンプトでCドライブを捜索）

```batchfile:searchVmx.bat
dir C:\*.vmx /s/p
```


<br>
**手順２：**上記ディレクトリの全ファイルを任意ディレクトリにコピー
（この任意ディレクトリが今後のVMware Workstationにて利用されるディレクトリになる）
（ログとかバックアップファイルとか結構吐かれる）


<br>
**手順３：**VMware Workstationの「仮想マシンを開く(O)」にて、手順のディレクトリを参照し、「.vmx」ファイルを選択する

![Image.png](https://qiita-image-store.s3.amazonaws.com/0/201787/f5da46fd-e079-1149-6936-f24f9816384d.png)

![Image.png](https://qiita-image-store.s3.amazonaws.com/0/201787/52fa852f-24a3-8db2-676d-0c9ff588eec4.png)

![Image.png](https://qiita-image-store.s3.amazonaws.com/0/201787/a8867564-f962-4dd6-78d9-847e468eb26d.png)


<br>
**手順４：**VMwareの「仮想マシンの再生(L)」を押下し、しばらく待つ

![Image.png](https://qiita-image-store.s3.amazonaws.com/0/201787/9f467ce4-e4ea-a659-c227-7476b2a0fca6.png)

![Image.png](https://qiita-image-store.s3.amazonaws.com/0/201787/3201b60f-b888-473f-90b0-298de4d1cf0d.png)



<br>
**手順５：**完了

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201787/bf0f63ce-c21a-0ee3-e87d-2fcd002c81c5.png)




##■参考
WindowsマシンにVMware Playerを使ってUbuntuの仮想環境を構築する
https://okuzawats.com/ubuntu-on-vmware-20150605/

Windows 10 でVMware Workstation Player With Ubuntu
http://www.aise.ics.saitama-u.ac.jp/~gotoh/VMWorkstationPlayerIntoWindows10.html

ホスト型仮想マシンのファイルを探す (2078496)
https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2078496
termbox-go の基本的な使い方


`termboxg-go` および `termbox` は開発が終了したため、代替である [tcell](https://github.com/gdamore/tcell) ライブラリを使った方が良いでしょう。

----

Go でTUI(Text User Interface) を作るための [termbox-go](https://github.com/nsf/termbox-go) の基本的な使い方のメモ

## 基本的な考え方

1. メインループを作る
2. イベントハンドリングを定義する
3. 描画関数を定義する
4. メインループ内で描画関数を呼び出す


```go
package main

import (
	"math/rand"

	log "github.com/Sirupsen/logrus"
	"github.com/nsf/termbox-go"
)

const coldef = termbox.ColorDefault

// (3) 描画関数の定義
// (x, y)座標に四角を表示するだけの関数
func drawBox(x, y int) {
	termbox.Clear(coldef, coldef)
	termbox.SetCell(x, y, '┏', coldef, coldef)
	termbox.SetCell(x+1, y, '┓', coldef, coldef)
	termbox.SetCell(x, y+1, '┗', coldef, coldef)
	termbox.SetCell(x+1, y+1, '┛', coldef, coldef)
	termbox.Flush() // Flushを呼ばないと描画されない
}

func main() {
	if err := termbox.Init(); err != nil {
		log.Fatal(err)
	}
	defer termbox.Close()

	drawBox(0, 0)
	// (1) メインループ
MAINLOOP:
	for {
		w, h := termbox.Size()
		// (2) イベントハンドリング
		switch ev := termbox.PollEvent(); ev.Type {
		case termbox.EventKey:
			switch ev.Key {
			case termbox.KeyEsc:
				break MAINLOOP
			}
		}
		drawBox(rand.Intn(w), rand.Intn(h)) // (4) メインループ内で描画関数を呼び出す
	}
}
```

- 描画の基本は `termbox.SetCell(x座標, y座標, '表示したいrune', 前景色, 背景色)` 関数
	- 指定した座標に1文字表示する関数
	- 極端な話、1座標ずつこれを呼び出せば好きな画面を構築できる

### バッファを直接変更して画面に表示する方法

`termbox-go` はターミナル画面に表示される領域を `termbox.Cell` 構造体の配列として保持している。
`back buffer` とも呼ぶもよう。
この配列を直接指定して値を設定しても、同様に画面を操作可能。ただし、1次元配列なので画面幅と高さを取得してオフセット計算を行う必要がある。

```go
package main

import (
	log "github.com/Sirupsen/logrus"
	"github.com/nsf/termbox-go"
)

const coldef = termbox.ColorDefault

func drawBox() {
	w, _ := termbox.Size()
	termbox.Clear(coldef, coldef)

	buf := termbox.CellBuffer()

	buf[0].Ch = '┏'
	buf[0].Bg = coldef
	buf[0].Fg = termbox.ColorRed

	buf[1].Ch = '┓'
	buf[1].Bg = termbox.ColorRed
	buf[1].Fg = coldef

	buf[w].Ch = '┗'
	buf[w].Bg = coldef
	buf[w].Fg = coldef

	buf[w+1].Ch = '┛'
	buf[w+1].Bg = coldef
	buf[w+1].Fg = coldef

	termbox.Flush() // Flushを呼ばないと描画されない
}

func main() {
	if err := termbox.Init(); err != nil {
		log.Fatal(err)
	}
	defer termbox.Close()

	drawBox()
MAINLOOP:
	for {
		switch ev := termbox.PollEvent(); ev.Type {
		case termbox.EventKey:
			switch ev.Key {
			case termbox.KeyEsc:
				break MAINLOOP
			}
		default:
			drawBox()
		}
	}
}
```


## 参考文献
- [termbox-go 使い方まとめ](http://nirasan.hatenablog.com/entry/2016/05/28/094014)
	- 使い方はこちらの記事のほうが詳しいです。