OmniAICreator/Qiita-1.07M huggingface dataset:
ZendFramework2 でのルーティング設定名にスラッシュ(/)を使ってはいけない

zf2で複数モジュールを使う際にあるモジュール設定(module.config.php)のルーティング設定名で以下のようにスラッシュを使っていました。

``` module.config.php
'router' => [
    'routes' => [
        '/api/test' => [
            'type'    => Segment::class,
            'options' => [
                'route'    => '/api/test[/:action]',
                'defaults' => [
                    'controller' => Controller\TestController::class,
                    'action'     => 'index',
                ],
            ],
        ],
    ],
],
```

ルーティング設定は動作していたのですが、あるControllerのリンク生成で`PhpRenderer::url($name = null, array $params = array(), $options = array(), $reuseMatchedParams = false)`を使ったらうまく動作しませんでした。
デバッグして確認したところ`url()`の第一引数からmodule.config.phpのルーティング設定名(/api/test)を検索するのだけど第一引数を`explode('/')`してから検索していたので引っかからなかったようです。

``` Zend\Mvc\Router\Http\TreeRouteStack.php
public function assemble(array $params = array(), array $options = array())
{
    if (!isset($options['name'])) {
        throw new Exception\InvalidArgumentException('Missing "name" option');
    }

    $names = explode('/', $options['name'], 2);
    $route = $this->routes->get($names[0]);
    ・・・
}
```

ルーティング設定名にスラッシュを使えないことは分かったけど、モジュールによってコンテキストパスを分けたかったのでどんな命名規則にしようか悩んだところそれっぽい例があったのでハイフンでつなぐこととしました。

https://docs.zendframework.com/tutorials/in-depth-guide/understanding-routing/

``` module.config.php
'router' => [
    'routes' => [
        'api-test' => [ // ★修正箇所
            'type'    => Segment::class,
            'options' => [
                'route'    => '/api/test[/:action]',
                'defaults' => [
                    'controller' => Controller\TestController::class,
                    'action'     => 'index',
                ],
            ],
        ],
    ],
],
```
PandasのDataframeのアトリビュート、メソッド一覧

公式ドキュメンテーションにまとめられているアトリビュート、メソッドを日本語でまとめる。

公式ドキュメント: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html

# 基本書式

```python
pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
```

## 引数
### data=None
numpyのndarrayオブジェクト、python dictionary、Dataframeをとる。

ただしdictionaryはSeries、array、定数、リストライクなオブジェクトで構成されているものを受け付けることができる。それぞれの要素がDataFrameの箱の中に入れられると考えれば良い。

### index=None
arrayライクまたはIndexオブジェクトをとる。デフォルトではnp.arrange(n)をとる。

データフレームのindex付けに使われる。

### columns=None
arrayライクまたはIndexオブジェクトをとる。デフォルトではnp.arrange(n)をとる。

データフレームcoluimnの名前付けに使われる。

### dtype=None
dtypeオブジェクトをとる。

データの方を強制する時に使う。一種類の方のみ受け付けることに注意。特に指定しない場合、推論される。

### copy=False
論理値をとる。デフォルトはFalse

入力されたデータをコピーする。これがDataframeまたは2次元のndarrayのみ効果がある。
(ドキュメンテーションの直訳。効果のほどはよくわからない。)


## アトリビュート一覧
よく使うもの順に並べる
### .values
データフレームの要素をnumpyのndarrayの形式で返す。

### .dtypes
DataFrameのcolumnsごとのdtypeをまとめたSeriesを返す

### .loc
ラベルによる選択のための純粋なラベル位置ベースのインデクサー(直訳)

### .iloc
位置による選択のための純粋な整数位置ベースの索引付け(直訳)

### .ndim
アレイの次元数(軸の本数)を返す。

### .shape
データフレームの行列数を表すタプルを返す。(何行何列か)

### .size
データフレームの要素数を返す。(行数*列数)

### .T
行列を入れ替える。(転置行列の取得)

### .at
ラベルベース高速スカラーアクセサー

### .axes
行方向と列方向のラベル情報をまとめたリストを返す。

### .blocks
内部属性、as_blocks()と同義

### .empty
中身が完全に空の時、Trueを返す。軸の長さが0であることを意味する。

### .ftype
このオブジェクトのftypes (疎/密とdtypeの表示)をSeriesの形で返す。(疎密はどういう意味か??)

### .iat
高速な整数位置スカラーアクセサー

### .ix
主にラベル位置ベースのインデクサーで、整数位置のフォールバックをもつ。(直訳)
最近これをJyputer notebook上で使うと、非推奨のwarningが出る。

### .style
DataFrameのスタイル付きHTML表現を構築するためのメソッドを含むStylerオブジェクトを返す(直訳)

## メソッド
以下、現在作成中
nvm, Node.js, package.json, npm, yarn, webpackの違いについて

[株式会社TECH LUCK](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)という会社で代表兼エンジニアをしている齊藤です。

DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。
- プロジェクトでRailsエンジニアが足りなくて困っている
- Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
- オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい

また、Railsエンジニアも募集しておりますので、興味がありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご連絡いただけますと幸いです。

# 前提

`Node.js`を使おうとすると、`nvm`や`npm`、`yarn`、`package.json`など色々な横文字が出てきて大変だったので、それらについてザックリとまとめてみました。
間違いなどがあった場合はコメントいただけると幸いです。


## Node.js
`Node.js`とは、サーバーサイドで動くJavaScriptになります。
詳細は以下の記事を参考にしてみてください。
https://qiita.com/non_cal/items/a8fee0b7ad96e67713eb
https://qiita.com/hshimo/items/1ecb7ed1b567aacbe559

## nvm
`nvm`とは、Node Version Managerの略で、上記のNode.jsのバージョン管理するパッケージになります。
`Node.js`は多くのバージョンがリリースされています。`nvm`で`Node.js`を管理することで、`Node.js`のバージョン管理が簡単になります。

## nodebrew
`nodebrew`もNode.jsのバージョン管理システムになります。nvmでもnodebrewのどちらでもNode.jsのバージョン管理をすることができるということです。
nvmと違って、プラットフォームに依存せず簡単にバージョンが切り替えられるらしいです。（あんまりよく知らない）

## npm
`npm`とは、Node Package Managerの略で、`Node.js`で作られたパッケージやライブラリを管理するツールになります。
パッケージマネージャーとはライブラリやパッケージの管理ツールのことです。 パッケージマネージャを使うことで、使いたいライブラリの導入や削除を簡易にしたり、パッケージ同士の依存関係を管理することができます。

### package.json
`package.json`は、パッケージの依存関係を記述したjsonファイルになります。
このファイルに、プロジェクト毎に必要なパッケージの名前とバージョンを記述すれば、`npm`が自動で必要なパッケージをインストールしてくれます。
インストールしたパッケージが依存しているパッケージや、さらにそれが依存しているパッケージも自動でインストールしてくれるので、開発環境ごとにインストールさえるパッケージが違うということが起こりません。

## yarn
`yarn`とはパッケージマネージャーの`npm`の上位互換のようなツールです。
`yarn`を使うと`npm`の以下の課題を解決することが可能です。

- インストールが遅い
- インストール結果に一貫性がない
- セキュリティ上の懸念がある

`yarn`は`npm`で管理されているパッケージになります。
また、`package.json`に対応しているので、`npm`で`package.json`を使っている場合はすぐに移行できるようです。

## webpack
`webpack`は、Webアプリケーションに必要なリソースの依存関係を解決し、CSSやJavaScriptなどのアセットを生成するビルドツールです。
Webアプリケーションのビルドツールは他にも、`Grunt`や`Gulp`と呼ばれるものが有名です。`Grunt`や`Gulp`などはここでは説明しないので、興味があれば調べてみてください。
`webpack`も`npm`で管理されているパッケージになります。

# 参考にしたサイト
https://qiita.com/hshimo/items/1ecb7ed1b567aacbe559

https://qiita.com/Sekky0905/items/452619651cdd950c2271

https://qiita.com/knjname/items/0cc813622e0121c05723

https://qiita.com/yosisa/items/61cfd3ede598e194813b
Apacheのアクセスログから必要な情報を取り出す

## 概要
Apacheのアクセスログから必要な情報のみ、
取り出して集計する必要があったのでメモしておく。

## awk,gawkコマンドでの加工例

```bash:awk
$ cat access_log.20171227 \
 | grep 'GET /hoge/' \
 | awk 'BEGIN { OFS = "¥t" }{print($1,$2,$3,$4,$5,$6,$7,$8,$9,$10)}'
```

```bash:gawk
$ cat access_log.20171227 \
 | grep 'GET /hoge/' \
 | gawk -v FPAT='([^ ]+)|(\"[^\"]+\")' '{ \
   print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13 \
 }'
```

```bash:gawk
$ cat access_log.20171227 \
 | grep 'GET /hoge/' \
 | gawk 'BEGIN { OFS = "¥t" }{ \
   patsplit($0,arr,"([^ ]+)|(\"[^\"]+\")|(\\[[^\\]]+\\])"); \
   session_id="\""arr[12]"\""; \
   ip="\""arr[1]"\""; \
   time=substr(arr[4],2,(length(arr[4])-2)); \
   url=arr[5]; \
   user_agent=arr[9]; \
   host=arr[10]; \
   print(session_id, time, url, host, ip, user_agent) \
 }'
```

## 参考サイト
* https://bi.biopapyrus.jp/os/linux/awk.html
* https://codezine.jp/article/detail/8323
Xcode9をVimキーバインドで使う手順

Xcode9に[XVim2](https://github.com/XVimProject/XVim2)を入れてVimキーバインドで使えるようにする手順です。

1. 証明書の作成  
XVim2を利用するには証明書が必要になります。  
Xcodeを終了した状態でキーチェーンアクセスを開き、  
[キーチェーンアクセス]->[証明書アシスタント]->[証明書を作成]  
証明書は自己署名ルート、コード署名で作成します。  
![sample.png](https://qiita-image-store.s3.amazonaws.com/0/117503/3b14a977-84b1-af98-4ec3-65b8b26515cb.png)  
証明書名はなんでもOKなので、ここではXcodeSignerとしておきます。  
作成した証明書をXcodeに紐付けます。  
```
$ sudo codesign -f -s XcodeSigner /Applications/Xcode.app
```
<br/>
<br/>
1. ソースコードの入手  
GitHubよりソースコードをCloneします。    
```
$ git clone https://github.com/XVimProject/XVim2
```
<br/>
<br/>
1. Xcodeのパスを確認  
```
$ xcode-select -p  
```  
`/Applications/Xcode.app/Contents/Developer`と出力されればOKです。  
パスがセットされていない場合は、`xcode-select -s`を使ってセットします。
<br/>
<br/>
1. ビルド  
XVim2のルートディレクトリでmakeします。  
```
$ make
```
<br/>
<br/>
1. XCodeの起動  
XVim2をロードするかのダイアログが表示されるので、Load Bundleを選択します。  
Vimのキーバインドによる操作が可能になればインストール完了です。
as_strided method sample in multi dimentional matrix

```python
Z = np.random.randint(0,5,(10,10))
print(Z)
n = 3
i = 1 + (Z.shape[0]-3)
j = 1 + (Z.shape[1]-3)
print("i:"+str(i)+",j:"+str(j))
print(Z.strides)
strides = Z.strides + Z.strides
print(strides)
C = stride_tricks.as_strided(Z, shape=(i, j, n, n), strides=strides)
print(C)
```
* e.g.

```
[[1 0 2 2 2 4 1 2 1 1]
 [0 0 1 2 1 1 3 4 3 3]
 [4 3 0 3 1 4 3 2 3 3]
 [3 3 4 1 4 4 2 0 4 4]
 [1 1 0 4 2 2 3 3 1 4]
 [4 3 0 0 0 1 3 4 2 3]
 [3 4 1 3 0 2 2 4 2 3]
 [3 0 3 4 4 1 2 1 3 0]
 [1 4 1 2 2 1 2 2 0 2]
 [3 2 0 0 0 3 2 4 2 4]]
i:8,j:8
(80, 8)
(80, 8, 80, 8)
[[[[1 0 2]
   [0 0 1]
   [4 3 0]]

  [[0 2 2]
   [0 1 2]
   [3 0 3]]

  [[2 2 2]
   [1 2 1]
   [0 3 1]]

  [[2 2 4]
   [2 1 1]
   [3 1 4]]

  [[2 4 1]
   [1 1 3]
   [1 4 3]]

  [[4 1 2]
   [1 3 4]
   [4 3 2]]

  [[1 2 1]
   [3 4 3]
   [3 2 3]]

  [[2 1 1]
   [4 3 3]
   [2 3 3]]]


 [[[0 0 1]
   [4 3 0]
   [3 3 4]]

  [[0 1 2]
   [3 0 3]
   [3 4 1]]

  [[1 2 1]
   [0 3 1]
   [4 1 4]]

  [[2 1 1]
   [3 1 4]
   [1 4 4]]

  [[1 1 3]
   [1 4 3]
   [4 4 2]]

  [[1 3 4]
   [4 3 2]
   [4 2 0]]

  [[3 4 3]
   [3 2 3]
   [2 0 4]]

  [[4 3 3]
   [2 3 3]
   [0 4 4]]]


 [[[4 3 0]
   [3 3 4]
   [1 1 0]]

  [[3 0 3]
   [3 4 1]
   [1 0 4]]

  [[0 3 1]
   [4 1 4]
   [0 4 2]]

  [[3 1 4]
   [1 4 4]
   [4 2 2]]

  [[1 4 3]
   [4 4 2]
   [2 2 3]]

  [[4 3 2]
   [4 2 0]
   [2 3 3]]

  [[3 2 3]
   [2 0 4]
   [3 3 1]]

  [[2 3 3]
   [0 4 4]
   [3 1 4]]]


 [[[3 3 4]
   [1 1 0]
   [4 3 0]]

  [[3 4 1]
   [1 0 4]
   [3 0 0]]

  [[4 1 4]
   [0 4 2]
   [0 0 0]]

  [[1 4 4]
   [4 2 2]
   [0 0 1]]

  [[4 4 2]
   [2 2 3]
   [0 1 3]]

  [[4 2 0]
   [2 3 3]
   [1 3 4]]

  [[2 0 4]
   [3 3 1]
   [3 4 2]]

  [[0 4 4]
   [3 1 4]
   [4 2 3]]]


 [[[1 1 0]
   [4 3 0]
   [3 4 1]]

  [[1 0 4]
   [3 0 0]
   [4 1 3]]

  [[0 4 2]
   [0 0 0]
   [1 3 0]]

  [[4 2 2]
   [0 0 1]
   [3 0 2]]

  [[2 2 3]
   [0 1 3]
   [0 2 2]]

  [[2 3 3]
   [1 3 4]
   [2 2 4]]

  [[3 3 1]
   [3 4 2]
   [2 4 2]]

  [[3 1 4]
   [4 2 3]
   [4 2 3]]]


 [[[4 3 0]
   [3 4 1]
   [3 0 3]]

  [[3 0 0]
   [4 1 3]
   [0 3 4]]

  [[0 0 0]
   [1 3 0]
   [3 4 4]]

  [[0 0 1]
   [3 0 2]
   [4 4 1]]

  [[0 1 3]
   [0 2 2]
   [4 1 2]]

  [[1 3 4]
   [2 2 4]
   [1 2 1]]

  [[3 4 2]
   [2 4 2]
   [2 1 3]]

  [[4 2 3]
   [4 2 3]
   [1 3 0]]]


 [[[3 4 1]
   [3 0 3]
   [1 4 1]]

  [[4 1 3]
   [0 3 4]
   [4 1 2]]

  [[1 3 0]
   [3 4 4]
   [1 2 2]]

  [[3 0 2]
   [4 4 1]
   [2 2 1]]

  [[0 2 2]
   [4 1 2]
   [2 1 2]]

  [[2 2 4]
   [1 2 1]
   [1 2 2]]

  [[2 4 2]
   [2 1 3]
   [2 2 0]]

  [[4 2 3]
   [1 3 0]
   [2 0 2]]]


 [[[3 0 3]
   [1 4 1]
   [3 2 0]]

  [[0 3 4]
   [4 1 2]
   [2 0 0]]

  [[3 4 4]
   [1 2 2]
   [0 0 0]]

  [[4 4 1]
   [2 2 1]
   [0 0 3]]

  [[4 1 2]
   [2 1 2]
   [0 3 2]]

  [[1 2 1]
   [1 2 2]
   [3 2 4]]

  [[2 1 3]
   [2 2 0]
   [2 4 2]]

  [[1 3 0]
   [2 0 2]
   [4 2 4]]]]
```
numpy.argmax sample

```python
Z = np.random.randint(0,10,50)
b = np.bincount(Z)
print(b)
print(b.argmax())
```
* e.g.

```
[ 3  4  8  9  2  3  3  4 11  3]
8
```
# Refs.
* [配列の最大要素のインデックスを返すNumPyのargmax関数の使い方](https://deepage.net/features/numpy-argmax.html)
Getting SVD(Singular Value Decomposition) and matrix rank using numpy

```python
print("====intro.=====")
a = np.array([0,1,2,3,4,50,60,80]).reshape(4,2)
print(a)
print(np.sum(a),np.sum(a>13))
print("========")
Z = np.random.uniform(0,1,(10,10))
U, S, V = np.linalg.svd(Z) # Singular Value Decomposition
print(S)
rank = np.sum(S > 1e-10)
print(rank)
```
* e.g.

```
====intro.=====
[[ 0  1]
 [ 2  3]
 [ 4 50]
 [60 80]]
200 3
========
[ 5.28731693  1.31819778  1.19504862  1.11548368  0.94603427  0.66193219
  0.5811124   0.42465448  0.23343598  0.07688183]
10
```
# Refs.
* [numpy.linalg.svd](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.linalg.svd.html)
* [特異値分解](https://mathtrain.jp/svd)
* [直交行列](https://ja.wikipedia.org/wiki/%E7%9B%B4%E4%BA%A4%E8%A1%8C%E5%88%97)
* [行列の階数](https://ja.wikipedia.org/wiki/%E8%A1%8C%E5%88%97%E3%81%AE%E9%9A%8E%E6%95%B0)
* [浮動小数点表記法](http://aoki2.si.gunma-u.ac.jp/Hanasi/StatTalk/fudoushousuu.html)
* [rank](http://senkei.nomaki.jp/rank.html)
swift 中怎么安装使用Pod

第一步，安装Pod 
打开mac 的终端，如图![Snip20180103_1.png](https://qiita-image-store.s3.amazonaws.com/0/227685/fd9a76cd-01cb-a77a-e659-e3b800d002fa.png)
，然后在里面输入  sudo gem install cocoapods 
这一行命令在您的系統上安裝CocoaPods gem 您可能會被提示輸入您的root密碼，然後按回車。請注意，密碼不會顯示在屏幕上，因為終端不顯示密碼。
再输入 pod setup  进行安装
第二步  使用CocoaPods运行Xcode项目

首先新建一个Xcode项目，关闭项目，打开终端，假如你把项目保存在了桌面Desktop
就输入cd ~/Desktop/CocoapodsTest ，  CocoapodsTest是你的项目名。换言之，也就是cd 后面跟的是你的项目路径，（Xcode工程文件上一级的目录文件夹）
要创建一个Podfile，在终端里输入  pod  init  打开你的项目文件夹后，在里面会多几个文件，如图![Snip20180103_3.png](https://qiita-image-store.s3.amazonaws.com/0/227685/6dcbd652-9bda-c0d0-c1a7-c8fcb716a119.png)
打开Podfile 
如下所示：
1| # Uncomment this line to define a global platform for your project |
2| # platform :ios, '9.0' |
3|   |
4| target 'CocoapodsTest' do |
5|   # Comment this line if you're not using Swift and don't want to use dynamic frameworks |
6|   use_frameworks! |
7|   |
8|   # Pods for CocoapodsTest |
9|   pod 'Firebase' |
10| end |

把第2行代码前面的#去掉，在第九行，加入一个 pod 'Firebase' ，'Firebase'是你需要的第三方库的名字
之后保存并关闭Podfile，打开终端，在里面输入 pod install。这样就把你需要的库导进去了。
Railsで星の評価を機能をつける

###環境

rails 5.0.0.1

###やりたいこと
railsで星評価をつける![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/167576/3c4976dc-962f-adcf-87dd-2606857a9d20.png)

###imagesをつける

　https://github.com/wbotelhos/raty/tree/master/lib/images

ここのgithubからstar画像を持ってくる。
assets/imagesにフォルダの中に入れる



###javascrpitをつける

https://github.com/wbotelhos/raty/blob/master/lib/jquery.raty.js

上の jsをコピーする

　assets/javascript/application.jsに書く


###コード



```html+erb:new.html.rb
<%= form_for [@ticket, @review] do |f| %>

 <%= f.hidden_field :ticket_id, value: @ticket.id %>
<div class="col-md-6 col-md-offset-3">
		
		<div class="field" id="star">
		    <%= f.label :star %>
		    <%= f.hidden_field :star, id: :review_star %>
		  </div>

		 <%= f.text_area :impression, :class => "form-control", :size => "50x20"  %><br>
		 <%= f.submit "レビュー評価", :class => "btn btn-primary" %>

 </div>

 
 


<% end %>

<script>
$('#star').raty({
  size     : 36,
  starOff:  '<%= asset_path('star-off.png') %>',
  starOn : '<%= asset_path('star-on.png') %>',
  scoreName: 'review[star]' 
});
</script>

```



##参考

[Ruby - RailsでjQuery ratyを使いたい。(81246)｜teratail](https://teratail.com/questions/81246)
[Railsで星型レビューRatyを使う - Qiita](https://qiita.com/nekonoprotocol/items/4bc5bd9c64dc3f181016)
[jQuery Raty | A Star Rating Plugin - Washington Botelho](http://wbotelhos.com/raty)
kerasでbackend その3

#概要
kerasのbackendだけで、学習して分類してみた。

#写真
![backend12.png](https://qiita-image-store.s3.amazonaws.com/0/18104/95f96158-0c54-cbd0-4f38-64cf11c62036.png)


#サンプルコード

```
from tensorflow.contrib.keras.python.keras import backend as K
from tensorflow.contrib.keras.python.keras.optimizers import SGD
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons

np.random.seed(0)
dx, dy = make_moons(200, noise = 0.20)
input_dim = 2
output_dim = 1
hidden_dim = 8
x = K.placeholder(shape = (None, input_dim), name = "x")
ytrue = K.placeholder(shape = (None, output_dim), name = "y")
W1 = K.random_uniform_variable((input_dim, hidden_dim), 0, 1, name = "W1")
W2 = K.random_uniform_variable((hidden_dim, output_dim), 0, 1, name = "W2")
b1 = K.random_uniform_variable((hidden_dim, ), 0, 1, name = "b1")
b2 = K.random_uniform_variable((output_dim, ), 0, 1, name = "b2")
params = [W1, b1, W2, b2]
hidden = K.tanh(K.dot(x, W1) + b1)
ypred = K.tanh(K.dot(hidden, W2) + b2)
loss = K.mean(K.square(ypred - ytrue), axis = -1)
opt = SGD()
updates = opt.get_updates(params, [], loss)
train = K.function(inputs = [x, ytrue], outputs = [loss], updates = updates)
for ep in range(1000):
	for i in range(200):
		c3 = train([[dx[i]], [[dy[i]]]])
	if ep % 100 == 0:
		print (ep, c3[0])
pred = K.function(inputs = [x], outputs = [ypred])
x_min, x_max = dx[ : , 0].min() - .5, dx[ : , 0].max() + .5
y_min, y_max = dx[ : , 1].min() - .5, dx[ : , 1].max() + .5
h = 0.01
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
zz = np.c_[xx.ravel(), yy.ravel()]
p = []
for i in range(151208):
	preds = pred([[zz[i, : ]]])
	p.append(preds[0][0])
p = np.array(p)
Z = p.reshape(328, 461)
plt.contourf(xx, yy, Z, cmap = plt.cm.Spectral)
plt.scatter(dx[ : , 0], dx[ : , 1], c = dy, cmap = plt.cm.Spectral)
plt.savefig("backend12.png")
plt.show()

```

以上。
Cognitoの説明に使われている言葉を整理する

# はじめに
Cognitoを使ってみようと思って色々読んだけど、認証周りは全くど素人なのでわからない言葉を調べてみたメモです。

## 追記
[こちらのAWSの中の人がアップしていたslide share](https://www.slideshare.net/AmazonWebServicesJapan/20170517awsblackbeltamazoncognito) を見たほうがわかるかもしれないのでどうぞ。

# Cognitoとは何か
[AWSのAmazon Cognito とは](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/what-is-amazon-cognito.html)に書いてある通り。この中で

- Amazon Cognito とは
- Amazon Cognito の機能

に書いてある言葉でわからなかったものを整理する。[こちら](https://qiita.com/aki/items/e35e1bea8c27cfab5e9e)も参考にさせていただきました。

# ユーザディレクトリとは何か
大きめな会社でWindowsを使ったりしていると「Active Directory」という名前を聞いたことがあるかもしれないが、似たようなもの、と理解した。前述の[AWSのAmazon Cognito とは](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/what-is-amazon-cognito.html)にもあるが、ユーザディレクトリは以下の機能を提供、管理する。

- ユーザの追加方法を提供する（サインアップ）
- サインアップに必要な情報、ステップを定義できる
- ユーザの認証方法を定義できる（サインイン）
- サインアップ／サインイン処理の代替をさせるCognito以外のサービスを設定できる（外部IDプロバイダー）

# Amazon Cognito User Poolとは何か
ユーザディレクトリを実現するための機能の名称。Connection Poolとかと同じ、ユーザをpoolする。コンソールでUserPoolを作ってみるとわかるが、作成時に上記のユーザディレクトリで提供、管理するパラメタの設定を行う。あとから編集も可能。

# 外部IDプロバイダとは何か
これも前述のCognitoの説明ページにある通り、FacebookやTwitterやAmazonなどのCognitoの外部にあるアカウント情報を提供するサービスをAWSの説明ではこう呼んでいる様子。自社システムですでにアカウント管理を実装済みの場合、それも「Cognitoからみたら外」になるので外部IDプロバイダになるが、SAMLに対応していないと外部IDプロバイダーとして登録できない。

移行したいときどうするんだろう？要調査。

## 注意
CognitoコンソールでUser Poolの設定画面に「フェデレーション」メニューと「IDプロバイダー」という項目があるが、後述の「Amazon Cognito フェデレーテッドアイデンティティ」とは別もの。「外部IDプロバイダー」を設定するだけであり、フェデレーテッドアイデンティティ側の設定には何も影響しない。（はず）

<img width="30%" alt="スクリーンショット 2018-01-03 13.06.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/60457/aed43358-faff-b610-90d1-b22204972885.png">

# Amazon Cognito フェデレーテッドアイデンティティとは何か
ふぇでれーてっどって何？？ということでアルクで調べた。

> [federation](https://eow.alc.co.jp/search?q=federation) 【名】
連邦［連合・連盟］化［加入］◆【用法】不可算名詞
連邦、連合、連盟◆国家や組合などが独自の組織を維持しながら構成する連合体。
> [federated](https://eow.alc.co.jp/search?q=federated) 【形】
連合［連盟］した、連邦制になった

ふむ。JAFのFやFIFAの最初のFの「Federation」の形容詞か。

で、これはCognito UserPoolまたは外部のアカウント情報を提供するサービス(FBやTwitterなど)の認証情報を使い、一意なIDを割り当てる＆そのID任意のアクセス権限(=IAMロール)を付与することができる機能の様子。認証前と後で異なるアクセス権限を割り当てることができる。
Federated Identityの１つ１つを管理する器を「ID Pool」と呼んでおり、ID pool単位で以下を提供、管理する。

- 認証前後に与えるロールの設定
- 「認証済／未済」をどの「認証プロバイダー」に提供してもらうかの設定
- 「プッシュ型」データ同期の要否（未対応言語あり。注意。）
- Kinesisストリームとの連携（Cognitoストリーム。よくわかってない）
- Sync Trigger時のLambdaの呼び出し設定

## 注意
Federated IDの認証プロバイダーはUser Poolの外部IDプロバイダーよりも選択肢が広い。こちらの場合、自社サービスの認証情報を流用するにあたってSAMLなどに対応する必要はない。（「カスタム」認証プロバイダーでは、クライアントアプリ側の実装で責任を持ってtoken発行を行うのでSAML対応などは不要になる）

# Amazon Cognito Syncとは何か
**Federated IDに紐づいた** データの同期を行える機能。UserPoolのユーザ単位ではない。AWSのCognito Syncの説明ではFederated ID=Cognito IDとして書かれているので注意！ :(
  
key-value型のデータセットを同期させることができ、1セット1MB, 20個まで1つのFederated IDに紐づけることができる。AWSのCognitoサービスをマスターとし、インターネットに繋がっているクライアント同士でデータ同期することができる。同期トリガーは同期メソッドを各クライアントから呼び出す。AWS側からプッシュするパターンの同期もID Poolの設定によっては可能だが、対応していない言語があるので注意。オフライン時のデータ更新も考慮されている。

## よもやま
名前分かりにくいなぁ

名前 | 意味 
---|---
外部IDプロバイダー  |  **Cognito User Pool** においてCognito以外で認証機能を提供するサービス
Federated Identity (Federated ID)  |  前述の機能名、またはそれで発行したID１つ１つ
ID pool  |  Federated IDを管理、設定するPool
認証プロバイダー  |  Federated IDの付与に使われる「認証済／未済」を提供するサービス
2017 年の集大成 - Vue.js でアプリを開発

## 2017年を振り返って
2017年の目標はオリジナルのアプリを最低1本開発して公開することでした。
しかし実際のところ、開発はしていましたが全然すすまず、目新しい技術が気になりそれらのサンプルを触ったりして満足する毎日でした。

そんなこんなで気づくと12月29日、今年もあと3日というところになってしまいました。
その状況になってはじめて焦りだした私は、「3日間チャレンジ」として1本アプリを作成して公開することにしました。

## 3日間チャレンジ
29日は飲みに行ってつぶれて、30日は眠気にまけて潰れ、実質31日の朝と夕方(笑ってはいけないが始まるまで)の2時間ほどで完成させました。
[https://github.com/yusei-wy/imethod](https://github.com/yusei-wy/imethod)
これは「アイビー・リー・メソッド」という仕事の効率を向上させるための TODO リストです。
詳しくはご自身でお調べください。

## 挑戦した感想
プログラマとして働いて4年になりますが、今までプライベートで何かを作っても公開までしたことがありませんでした。
デザインは Bulma を使い、Vue.js でパパっと仕上げました。
とても良い出来とはいえませんが、今回はようやくひとつの成果物を公開することができ、また限られた期間内で完成させられたことがとても楽しく感じられました。

今年はアウトプットの年として、週1本のペースで何らかの成果物を公開していきたいと思います。

----------
Vue.js めっちゃいいですね！
短期間で完成出来たはのは Vue.js のおかげですし、開発がとても楽しく感じます。
今までは Riot.js を触っていて、シンプルでいいなぁとは思っていましたがどうにもかゆいところに手が届かない感じがあって、でも React は触りたくないしなぁと思っていた時に Vue.js 出会いそれからは毎日ように触って遊んでいます。
機械学習を体系的に学ぶために何をやればいいか?がわかる記事まとめ

- **[Machine Learning | Coursera](https://www.coursera.org/learn/machine-learning)**
  - [数学を避けてきた社会人プログラマが機械学習の勉強を始める際の最短経路 - Qiita](https://goo.gl/YiAsbQ)
  - [数学の苦手なバイオの学生がCourseraの機械学習コースを修了して気づいたこと - Qiita](https://goo.gl/nKJv5k)
  - [機械学習素人が2か月半で機械学習を入門したことまとめ - あさのひとりごと](http://dr-asa.hatenablog.com/entry/2017/03/15/064354)
- **Obey Your MATHEMATICS.**
  - [数学しか知らなかった機械学習エンジニアの生存戦略](http://mathetake.hatenablog.com/entry/2017/11/18/001047)
  - [ただの微分幾何学徒だった僕がデータサイエンスを何故/どのように勉強したのか](https://goo.gl/qyx7yz)
- **六本木で働くデータサイエンティストのブログ**
  - [データサイエンティストというかデータ分析職に就くための最低限のスキル要件とは](http://tjo.hatenablog.com/entry/2015/03/13/190000)
  - [データサイエンティストもしくは機械学習エンジニアを目指すならお薦めの初級者向け6冊＆中級者向け15冊（2017年春版）](https://goo.gl/PUWHTK)
- [機械学習に本気で取り組むためにやった数学周り 前半戦結果 | きのこる庭](http://kinokoru.jp/archives/1289)
- [機械学習を初めて勉強する人におすすめの入門書 - old school magic](http://breakbee.hatenablog.jp/entry/2014/08/16/090556)
- [結局、機械学習に必要な数学ってなに？ | Futurismo](http://futurismo.biz/archives/6106)
- [オライリーから「仕事ではじめる機械学習」が出版されます – Aki Ariga – Medium](https://goo.gl/6nTJkM)
- [機械学習はじめの一歩に役立つ記事のまとめ - Qiita](https://qiita.com/shu223/items/9cbde46c0690f1952750)
- [ベイズ学習の勉強に参考になる資料 - 作って遊ぶ機械学習。](http://machine-learning.hatenablog.com/entry/2017/05/14/195723)
- [dformoso/machine-learning-mindmap](https://github.com/dformoso/machine-learning-mindmap)
  - A mindmap summarising Machine Learning concepts, from Data Analysis to Deep Learning.
- [ZuzooVn/machine-learning-for-software-engineers](https://github.com/ZuzooVn/machine-learning-for-software-engineers)
  - A complete daily plan for studying to become a machine learning engineer.
- [5 Techniques To Understand Machine Learning Algorithms Without the Background in Mathematics - Machine Learning Mastery](https://goo.gl/Mv2BFU)
- [ディープラーニングの有名ライブラリ5種を最短距離で試す半日コース（TensorFlow, Chainer, Caffe, DeepDream, 画風変換） - Qiita](https://goo.gl/UQkrfq)
- [機械学習の超初心者が、みんなが良いと言う記事を読んでまとめてみた - Qiita](https://goo.gl/d2ELoj)
[ESP8266]HUZZAHと遊び。その01

明けましておめでとうございます。

ESP8266 BOARD 使っている方沢山いると思います。
ESP-01を使っていましたが、esp-12が使用されている[HUZZAH](https://www.adafruit.com/product/2471)を買って時間あるとき、これと遊びたいと思って買ってみました。

#ESPについて

ESPは中国の社[Espressif System](http://espressif.com)で開発して世界で販売されている。
メリットは値段ですね。

moduleの情報はこちらを
http://www.esp8266.com/wiki/doku.php?id=start

#？？
![20180102_184750.jpg](https://qiita-image-store.s3.amazonaws.com/0/137182/3ee76ec1-7e2f-4078-d471-573a471e1c12.jpeg)

![20180102_184759(0).jpg](https://qiita-image-store.s3.amazonaws.com/0/137182/624ae1f6-5d5d-033e-cda2-ac974f37403a.jpeg)

![20180102_190641.jpg](https://qiita-image-store.s3.amazonaws.com/0/137182/b3439e1b-489f-9391-5349-384dd8344a5c.jpeg)

#電源について
ESP Moduleは電流を500mAくらい使います。
それで、ESPための電源を追加して使うことにしました。

![20180103_115918.jpg](https://qiita-image-store.s3.amazonaws.com/0/137182/8c06e4a9-1137-f632-970b-20966ccac9f0.jpeg)
node=v8.9.3, npm=v5.5.1でnpm ERR! Cannot find module 'node-fetch-npm'

# node=v8.9.3, npm=v5.5.1でnpm ERR! Cannot find module 'node-fetch-npm'


## Issue
年が明けたので2018-01-01時点で最新のLTSにnpmをupdateしたところ、`node-fetch-npm`が見つからないと怒られた...

## Solution
- nodeのメジャーバージョンを9にする（2018-01-01時点で最新のv9.3.0で確認済み）
or
- npmのバージョンをv5.6.0にする（2018-01-01時点での最新）

## Backgronud
c.f.
https://github.com/coala/docker-coala-base/issues/182
ランダムな値を被らないように出力したい

`rand`で出力した場合、一回出た値がもう一度でる可能性がある

```rb
array_nums = [*1..1000] # 1~1000の数字の配列
array_nums.count.times do |t|
  puts array_nums.delete_at(rand(array_nums.count)) # array_numsからランダムに一つ値が削除されるため一度出力した値が出力されない
end
```
sequelizeでtoStringエラー

sequelizeを使って`db:migrate`した時に，エラーが出て困った

>ERROR: Cannot read property 'toString' of undefined


ファイル名も行数も出てなかったので地道に調べてた結果，migrate用のjsファイルのtypeがおかしいことが判明．

```javascript
'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('orders', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      name: {
        type: Sequelize.STRING
      },
      user_id: {
        type: Sequelize.INT
      },
      created_at: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updated_at: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('orders');
  }
};
```


`Sequelize.INT`は存在しなく，`Sequelize.INTEGER`と書かなければいけないらしい
sequelize-cliを使ってgenerateしたときにエラーチェックで弾いてほしかった・・・

ほかにも，`Sequelize.FLOAT`や`Sequelize.DOUBLE`は存在しないようなので注意が必要
Ubuntu17.04でEmacs25を設定する

# 背景

自宅でもディープラーニングがしたいのでデスクトップPCを買った。昔からエディタはEmacsだったが、整理の意味も込めて一からinit.elを書くことにした。

# 環境

- Ubuntu 17.04（リモートデスクトップが簡単と聞いたので）
- Emacs25.1.1（apt-getで入れられる新しい方くらいの感覚）

# 作成したinit.elなど

今回作成したinit.el等は[github](https://github.com/ka10ryu1/Emacs)で公開しているが利用は自己責任で。基本的には末尾に記載したURLに従っているが、そのままでは動かなかったりしたので逐次いじっている。

# 作成にあたってのポイント

## init.elの分割

init.elが大きくなると管理が大変になるので分割した。分割は以下のように記述。

```emacs-lisp

(add-to-list 'load-path "~/.emacs.d/custom")
(load "hoge.el")
```

そんなにファイル数ないしこれで十分。

## パッケージのインストール
今後の使いやすさとかも考慮して以下を記述している。

```emacs-lisp

(package-install 'hogehoge)
```

手動で入力するのも探すのも面倒だし、既にインストールされている場合はそのままスキップされるし、どうせ起動したらそうそう閉じないしこれでいい。

## パッケージの説明

### sequential

C-a、C-eの改良。連打するだけで行頭（行末）、バッファの先頭（末尾）に移動できるので便利。

### py-autopep8、flymake

PythonのPEP8準拠やエラー解析は必要

### counsel

M-xやC-x C-dでの候補検索の絞り込みを強化してくれる。

### swoop

C-sを強化してくれる。行数表示や一覧表示が便利。

### auto-complete

companyにしようと思ったけど設定がうまくいかず、別に遅くもないしPython書ければいいからこれにした。

### jedi

自動補完パッケージ。OpenCVとかの補完もできるみたいなので採用。

### neotree

ファイル構成をツリー形式で表示してくれる機能。

### yasnipett

テンプレートを簡単に呼び出せる。


# 参考にしたサイト
- [Emacsの補完&検索を超強化する](https://qiita.com/blue0513/items/c0dc35a880170997c3f5)
AWSソリューションアーキテクト – アソシエイトに合格したので、勉強方法を書き残しておく

# はじめに
　会社でもクラウドに対応する人材を育成したいとのことで、AWSの研修を募集していたため、のっかりました。約３ケ月の勉強で合格できたため、備忘録として残す。

#スペック
AWSの経験はまったくない。
普段はオンプレで仮想アプリの基盤、ミドルウェアの構築、運用をやっている

#受験までの流れ
## 情報収集
まずは先人達の勉強方法を確認するため、Webで情報収集をやった。
「aws アソシエイト」でGoogle検索した内容を主に確認する。
会社からは試験対策本を支給されたが、さすがにまったくサービスに触ったこと
がないまま、試験には望めないと思い、Webの内容を参考に、参考書籍を選び
今回はAmazon Web Services実践入門を購入した。
[Amazon Web Services実践入門](https://www.amazon.co.jp/Amazon-Web-Services%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-PRESS-plus/dp/4774176737/ref=pd_bxgy_14_img_2?_encoding=UTF8&psc=1&refRID=7KCNYT0FJYPXCHBF047Q)
以下、二つも有用な書籍ではあるが、ある程度AWSを分かっている人が問題を解決する際に
読むべきものだと感じ、今回ははずしました。
[Amazon Web Servicesクラウドデザインパターン設計ガイド](https://www.amazon.co.jp/dp/B0126HZGP8/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
[Amazon Web Services パターン別構築・運用ガイド](https://www.amazon.co.jp/dp/4797382570?tag=realab-22)


##環境構築・試験勉強
Amazon Web Services実践入門を参考に、環境を構築していく。AWSの主要サービスである
EC2、VPC、S3、IAM、Auto Scaling等の挙動を確認できたのは非常に大きかった。
併せて、会社支給の試験対策本で頻出箇所の確認を行っていく。下記の本は、頻出箇所がよくまとまっているため、効率良く勉強するためにはかなり使える。AWSのサービスをある程度使用した後に読むと理解がさらに進みやすい。
[合格対策 AWS認定ソリューションアーキテクト －アソシエイト](https://www.amazon.co.jp/dp/B01LZ2CBKB/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
上記の本ではカバーできない細かい部分や最新情報、設計の考え方などは、AWSのBlackBeltセミナーの資料、ホワイトペーパーをKindleに格納し、通勤中に読んでいた。

##模擬試験
「Architect on AWS」研修受講後、どの程度理解しているかを確認のため模擬試験を受けた。
合格点に達していたため、忘れないうちに受験しようとその週末に本試験を予約。
AWSの試験問題の形式や基礎的ではあるが見逃していた項目（スポットインスタンスの課金体系など）
が確認できたので、本試験までは弱点箇所を中心に見直す。
１回2000円と安いため受講することを推奨。

| 項目| 得点  |
|:------------:|:------------:|
| 高可用性、コスト効率、耐障害性、スケーラブルなシステムの設計|        66% |     
| 実装/デプロイ     |      100% |  
| セキュリティ       |        75% |  
| トラブルシューティング         |          100% |  
| 総計       |       75% |  


##本試験
実際に受験すると時間がない中、見たことがない問題ばかりで焦る。一度見直して
サブミットすると以下の結果で合格

| 項目| 得点  |
|:------------:|:------------:|
| 高可用性、コスト効率、耐障害性、スケーラブルなシステムの設計|        72% |     
| 実装/デプロイ     |      66% |  
| セキュリティ       |        81% |  
| トラブルシューティング         |          75% |  
| 総計       |       74% |  

#感想

今回、研修に参加する前にがっつりサービスを触っていたので研修が復習となっていたが
それがよかったと思う。あと、模擬試験で合格点を取れていればとっとと受験した方が良い。
次回は「Advanced　Architect on AWS」を受講するのでプロフェッショナルも目指していきたい。
list, minimum, maximum, tolist, slice, zip method sample in numpy

```python
Z = np.random.randint(0,10,(10,10))
shape = (5,5)
fill  = 0
position = (1,1)
lp = list(position)
print(lp)

R = np.ones(shape, dtype=Z.dtype)*fill
P  = np.array(lp).astype(int)
Rs = np.array(list(R.shape)).astype(int)
Zs = np.array(list(Z.shape)).astype(int)
print(Z,R)
print("==P,Rs,Zs==")
print(P)
print(Rs)
print(Zs)
print("====")
ls = len(shape)
print(ls)
R_start = np.zeros((ls,)).astype(int)
R_stop  = np.array(list(shape)).astype(int)
Z_start = (P-Rs//2)
Z_stop  = (P+Rs//2)+Rs%2
print(R_start,R_stop,Z_start,Z_stop)
print("====")
#print(np.minimum((3,4,-4),(6,-2))) # invalid
print(np.minimum((4,-4),(6,-2))) # invalid
print(np.minimum((4,-4,8),(-2))) # invalid
print("==minZ,maxZ==")
minZstart = np.minimum(Z_start,0)
maxZstart = np.maximum(Z_start,0)
minZstop = np.minimum(Z_stop,Zs)
maxZstop = np.maximum(Z_stop-Zs,0)
print(minZstart,maxZstart,minZstop,maxZstop)

print("====R,Z====")
R_start = (R_start - minZstart).tolist()
Z_start = (maxZstart).tolist()
R_stop = np.maximum(R_start, (R_stop - maxZstop)).tolist()
Z_stop = (minZstop).tolist()
print(R_start,Z_start,R_stop,Z_stop)
r = [slice(start,stop) for start,stop in zip(R_start,R_stop)]
z = [slice(start,stop) for start,stop in zip(Z_start,Z_stop)]
print("==r,z==")
print(r,z)
R[r] = Z[z]
print(Z)
print(R)
```
* e.g.

```
[1, 1]
[[0 7 9 5 0 7 0 4 7 2]
 [6 0 2 1 0 7 6 5 0 0]
 [0 1 4 7 9 3 4 3 1 5]
 [6 7 4 5 2 5 4 4 9 0]
 [5 3 6 5 4 8 4 4 5 1]
 [5 1 9 3 8 3 4 3 7 3]
 [1 5 8 8 2 0 3 5 8 8]
 [7 6 0 6 4 8 2 1 6 2]
 [2 3 8 5 4 3 9 1 2 1]
 [6 8 1 5 6 8 6 6 5 2]] [[0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]]
==P,Rs,Zs==
[1 1]
[5 5]
[10 10]
====
2
[0 0] [5 5] [-1 -1] [4 4]
====
[ 4 -4]
[-2 -4 -2]
==minZ,maxZ==
[-1 -1] [0 0] [4 4] [0 0]
====R,Z====
[1, 1] [0, 0] [5, 5] [4, 4]
==r,z==
[slice(1, 5, None), slice(1, 5, None)] [slice(0, 4, None), slice(0, 4, None)]
[[0 7 9 5 0 7 0 4 7 2]
 [6 0 2 1 0 7 6 5 0 0]
 [0 1 4 7 9 3 4 3 1 5]
 [6 7 4 5 2 5 4 4 9 0]
 [5 3 6 5 4 8 4 4 5 1]
 [5 1 9 3 8 3 4 3 7 3]
 [1 5 8 8 2 0 3 5 8 8]
 [7 6 0 6 4 8 2 1 6 2]
 [2 3 8 5 4 3 9 1 2 1]
 [6 8 1 5 6 8 6 6 5 2]]
[[0 0 0 0 0]
 [0 0 7 9 5]
 [0 6 0 2 1]
 [0 0 1 4 7]
 [0 6 7 4 5]]
```
# Refs.
* [list](http://www.tohoho-web.com/python/list.html)
* [minimum](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.minimum.html)
* [tolist](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.ndarray.tolist.html)
* [zip](https://python.civic-apps.com/zip-enumerate/)
* [slice](https://docs.python.jp/3/library/functions.html#slice)
Kobito OSSからの投稿をしてみます。

## はじめに
メモ的なものばかりですが、色々お世話になっているQiita。
普段はKobitoを使ってメモを書いたり記事をアップしていたのですが、昨年末に[Kobitoのサポートが終了](http://blog.qiita.com/post/168180042619/kobito-for-mac-windowsの提供及びユーザーサポートを終了します)してしまいました...。
（アイコンも可愛らしくて好きでした、いままでありがとうございます！）

なにかしら代替手段を考え中ですが、とりあえず公式で案内のあった[Kobito for OSS](https://github.com/increments/kobito-oss) から記事の投稿ができるかを試してみます。
あまりテクニカルな内容ではなく、設定の覚書と確認用の投稿になります_ _

### ビルド＆起動手順

動作環境はMacです。
アプリケーションを動かすためのElectronは別途インストール済みです。
やってみた流れとしては、以下の通りです。

- https://github.com/increments/kobito-oss からcloneする
- yarn が必要なので、brew install yarn する
- READMEに従ってelectronアプリケーションとして起動
- その他は [kobito-oss のソースの読み方](https://qiita.com/mizchi/items/8b676d598325cedaa3f2) を参考にさせていただく

```bash
# node.jsはインストール済みの前提 / electronも追加しておく
$ node -v
$npm install electron -g

$ git clone https://github.com/increments/kobito-oss
$ cd kobito-oss
$ brew install yarn
$ script/build 

# あとでQiitaのアプリケーションの画面から取得したclient id / client secretを設定
$ cp config.json.example config.json
$ electron electron-packager/browser &
```

### とりあえずの確認

Windowsユーザの方はこちらを使っていらしたのでしょうか。
とりあえずMacでも起動しました。（ちょっと感激）

![start-kobito-oss.png](https://qiita-image-store.s3.amazonaws.com/0/27976/9880f8c2-9291-b4e4-f106-e543aee327d7.png)

ただ、そのままでは上手く行かない点がいくつか。

- 「Qiitaへのログイン」ボタンは押してもNot Foundになってしまう
- 認証連携が取れていない段階では、記事作成は「Inbox」のみ
  - ローカルに記事を保存する感じ？（でもこれはこれで良い気がする）

ローカルでMarkdownを使ってメモ・ストックしておくだけなら、これはこれで良いかもと思いました。
次に、KobitoからQiitaに投稿できるかの確認。
上記のとおり、「Qiitaへのログイン」は上手くいかないので、 [kobito-oss のソースの読み方](https://qiita.com/mizchi/items/8b676d598325cedaa3f2) の通りにconfig.jsonに認証情報を設定することにしました。

- Qiitaのアプリケーション連携の画面からClientID, ClientSecretを取得
  - config.jsonに設定してElectronアプリ再起動

ClientID, Secret設定後は、Inboxに加えてQiitaの投稿用のメニューも出ました。
また、Qiita側のデータも一応取得、ローカルにも同期？してくれた模様。
（あとでデータを確認します....）

![after-setting.png](https://qiita-image-store.s3.amazonaws.com/0/27976/a6736b87-a5c5-ab74-45a6-06ea7088838c.png)

### 投稿のテスト

記事の「アップロード」というボタンで、Qiitaに投稿されました。
ひとまず安心。
気が付いた点は以下の通りです。

- Inboxで書いた記事は、ローカルでの確認のみで、「保存」はできるけど「Qiitaに投稿」はできない
- Qiitaのメニュー側に書いて作成
 - タグを1つでも付けておかないと投稿ができなかった
 - 1回目の投稿では、「限定投稿」「公開に同意する」といった確認項目がなかったので、この辺注意すること

OSS、Electronなので、自分で修正できればいいのですが...。
ひとまず学習しつつそのほかの手段も探してみようと思います。

### 今回のメモ

パッケージの依存関係の管理にnpmではなくyarnを使っているので、メモしておきます。

**yarn**

- npmに変わるJavaScriptのパッケージ管理用のツール
- パッケージのインストールのタスクを平行で実施するので早いらしい
- node_modules/ 以下にパッケージが配置されるのは同じ

 **ToDo**
 
 -  データはどこに配置されているか確認
 -  アプリケーションとしてビルドして動かす
 -  ちょっとメッセージを変えてみる、など
Redux Persistでローカルのストレージエンジンにstoreを永続化する



## 概要

Redux Persistは、Reduxのstore永続化を簡単に行うことができるライブラリだ。アプリなどで、手軽にオフラインへのデータ保持を実装できる。

今回はその特徴を軽く紹介してみようと思う。

## 設定が容易

Redux Persistを使うと、storeの保持についての設計を考える必要がない。以下はほぼREADMEのサンプルだが、簡単な設定でReduxに組み込むことができる。

```js
import { persistStore, persistCombineReducers } from 'redux-persist'
import storage from 'redux-persist/es/storage'
import reducers from './reducers'

const config = {
  key: 'root',
  storage,
}

const reducer = persistCombineReducers(config, reducers)

function configureStore () {
  // ...
  let store = createStore(reducer)
  let persistor = persistStore(store)

  return { persistor, store }
}
```

これだけでstoreがローカル環境に保持される。

## クロスプラットフォーム

Redux Persistは各環境に合わせて、storeを保持する仕組みを変えることができる。

例えば、Webではデフォルトで`localStorage`、iOS(React Native)だとデフォルトで`AsyncStorage`が使用される。他にも、以下のようなストレージが使用可能だ。

- [Storage Engines](https://github.com/rt2zz/redux-persist#storage-engines)

## 細かいカスタマイズ

各stateによって、どのキーを保持するか/しないかなどを設定したいときがある(例えば、データをロード中、などの一時的な状態は保持したくない)。

そんなときは、`blacklist`や`whitelist`、`stateReconciler`などで細かい調整ができる。

- [Redux Persist API](https://github.com/rt2zz/redux-persist/blob/master/docs/api.md)

## storeの構造を変えたい時

store構造の変更により、心当たりのないバグを生む場合がある。そういう時は、`version`を指定しておいて、store構造を変えた際にアップデートすれば良い。

```js
const reducerVersion = persistConfig.version;

AsyncStorage.getItem('reducerVersion').then((localVersion) => {
  const reducerUpdated = localVersion !== reducerVersion;
  if (reducerUpdated) {
    // ここで永続化したstoreをリセットしている。
    persistStore(store, config, callback).purge();
    AsyncStorage.setItem('reducerVersion', reducerVersion);
    return;
  }
  persistStore(store, config, callback);
}).catch(() => {
  persistStore(store, config, callback);
  AsyncStorage.setItem('reducerVersion', reducerVersion);
});
```

## 参考

- [rt2zz/redux-persist: persist and rehydrate a redux store](https://github.com/rt2zz/redux-persist)
- [Redux Persistのススメ - Qiita](https://qiita.com/_mk2/items/47deb8b77a30472aae05)
40代後半のソフト開発エンジニアが、AI/ML（機械学習）のスキルを身につける際に感じたこと

# はじめに
　40代後半でソフト開発のエンジニアが、AI/ML(機械学習)のスキルを身につける際に感じたことをとりとめもなく書いていきます。あくまでも個人的感想です。

# スキル
## 数学
　AI/MLの書籍や文献など読むため、どうしても最低限の数学の知識は必要になります。確率統計、ベクトル、微分あたり。高校か大学1,2年ぐらいのレベルかと思います。私の場合は、エンジニアとして働きながら、大学院でコンピュータサイエンスコースでも学んでいたため、ある意味強制的に数学をやり直しできました。40代エンジニアだと、数学のスキルが錆びついている方も多いかと推測しますが、ここが一番ハードルが高いと思います。

## プログラミング言語
　言語はPython一択と思います。Javaなど手続き型言語に慣れていれば、敷居は低いと思います。オライリーはじめ、複数の出版社から数多くの書籍が出ています。

## フレームワーク
　日本では、tensorflow/kerasかchainerが多く使われている印象です。私はkerasを使ってます。

## 開発環境
　Anacondaをインストールして環境構築し、Jupyter Notebookを使って開発するのがもっとも簡単、かつ、デファクトになっているように思います。

## 英語
　論文読むには英語が必須になります。ただ、今（2018年初頭）では日本語の書籍、ネット上の情報を増えてきたので、最新の論文を読む必要がなければ、日本語の情報だけで、ほとんど困ることはなくなりつつあるように思います。

## 勉強会
　勉強会でネットワーキングもオススメです。一人だとどうしても怠けてしまうので。connpassで見つけられます。
https://connpass.com/

# 最後に
同世代のエンジニアの参考になれば幸いです。コメント、質問いただければ、ベストエフォートになりますが、回答させていただきます。
Amazon Echoに「アレクサ、NHK」、「アレクサ、日テレ」と呼び掛けてテレビのチャンネルを変える

Google Homeでは、IFTTT連携とショートカットを使うことで任意のフレーズでテレビを操作できるのですが、Amazon EchoではIFTTTを呼び出す際に「○○をトリガー」と言う必要があったり、スマートホームスキルがテレビに対応していなかったりと、まだすんなり使うには制約がありました。

前回の記事ではNode-RED Alexa Home Skill Bridgeを使うことで、現状の制約のなかでも「アレクサ、テレビをつけて」、「アレクサ、テレビを4にして」という自然な呼びかけでテレビを操作できるようにしました。

前回: [Amazon Echoで「○○をつけて」と言って家電を操作する - Qiita](https://qiita.com/machu/items/122c8403b35748bd5f4c)

今回はさらに、Amazon Alexaアプリの定型アクションを組み合わせることで、「アレクサ、NHK」、「アレクサ、日テレ」と呼び掛けることで、テレビのチャンネルを変えられるようにします。NHKや日テレの部分は任意のフレーズが使えます。

<img width="375" alt="IMG_4465.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/15802/c92325f3-8530-73b5-a4f5-9a1f07fe180f.png">

定型アクションは本来、複数のアクションをまとめて実行するための仕組みです。実行できるアクションは現時点ではスマートホームスキル、ニュースの読み上げ、天気の読み上げに限定されています。カスタムスキルの実行には対応していません。任意のフレーズで実行できる特徴を利用して、チャンネル名とスマートホームスキルのアクションを関連付けます。

<img width="375" alt="IMG_8C2A15E61C70-1.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/15802/46b49f94-144e-0a62-110c-599fe76e4a45.jpeg">

## 環境
 * Amazon Echo
 * Node-REDが動く環境 (Macbook ProやRaspberry Pi)
 * スマートリモコン (Nature Remo)

## 手順
Amazon Alexaアプリを使って定型アクションを登録します。

1. 左上のハンバーガーメニューから定型アクションを選択
2. 右上の+ボタンを選択
3. 実行条件にチャンネル名 (NHK, 日テレなど) を指定
4. アクションにスマートホーム→テレビを指定
5. パーセントにテレビのチャンネルに対応する番号を指定 (4チャンネルなら4%)
6. テレビのチャンネルの数だけ2~5を繰り返す

ポイントは手順5です。日本語のスマートホームスキルはテレビに対応していないので、照明の明るさ指定でチャンネル設定を代用しています。

<img width="375" alt="IMG_4466.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/15802/d3901383-b904-2602-a3c6-ac76162784ae.png">


スマートホームスキルはNode-RED Alexa Home Skill Bridgeを使っています。Node-RED側にはSetPercentageRequestとともに設定した数値 (上記の例では4) が送られてきます。スマートホームスキルに対応したスマートリモコン (eRemote mini) を使っても同様のことはできるでしょう。

これで、「アレクサ、NHK」、「アレクサ、日テレ」と呼び掛けるとテレビのチャンネルを変えられるようになりました。

## まとめ
発展途上のAmazon Echoでも、スマートホームスキルを工夫すれば自然な呼びかけでテレビを操作できました。

スマートスピーカーで家電を操作したい場合、現状ではお手軽さでいくとGoogle Home + IFTTTがベストで、次いでAmazon Echo + スマートホームスキル対応のスマートリモコン (eRemote mini) です。スマートホームスキルでテレビが日本語に未対応というAlexa側の制約もありますが、スマートホームスキルに対応したスマートリモコンが増えてほしいです。

参考

 * [Google HomeはAmazon Echoよりも優秀(いまのところ) | N-Styles](http://n-styles.com/main/archives/2017/12/27-070000.php)
 * [学習リモコンの「eRemote mini」をAlexaから利用してみた ｜ Developers.IO](https://dev.classmethod.jp/voice-assistant/alexa-eremote-mini/)
xcprettyをさらに活用する

iOSアプリ開発では欠かすことができないxcodebuildですが、そのままのログ出力は非常に読みづらいです。

そんなログを見やすくするものに、[fastlane](https://github.com/fastlane/fastlane)など色々な箇所で利用されている[xcpretty](https://github.com/supermarin/xcpretty)があります。

このxcprettyですが、自身で拡張をすることができます。
拡張することにより、ログの見せ方を変えたりエラーなどの情報をファイルに出力させたりすることもできます。
このファイルをもちいてPRへのコメントやCIで通知させるといったこともできます。


その拡張方法と利用方法について以下に簡単に説明したいと思います。


## Custom Formatterの例
まずはサンプルになる既存のgemについて紹介します。

例えば、Travis CIでは以下のCustom formatterを使用しています。

 - [xcpretty-travis-formatter](https://github.com/kattrali/xcpretty-travis-formatter)


他にもJSON形式で出力してくれるCustom formatterがあります。

 - [xcpretty-json-formatter](https://github.com/marcelofabri/xcpretty-json-formatter)

これを使えば、errors, warningsなどをJSON形式で出力してくれます。


### 呼び出し方
これらの公開されているgemの場合はまずgemをインストールし、以下のような形式で呼び出すことができます。

```shell
xcodebuild | xcpretty -f `xcpretty-json-formatter`
```

また、fastlaneを利用している場合、gymだとオプションとしてxcpretty_formatterが定義されています。
ここに上記のように `xcpretty-json-formatter` を指定すれば利用することができます。

```shell:サンプル
 gym(
   scheme: "MyApp",
   xcpretty_formatter: `xcpretty-json-formatter`
 )
```

参考

 -  https://github.com/fastlane/fastlane/blob/master/gym/lib/gym/options.rb


## オリジナルのCustom Formatterの作り方
xcprettyのREADMEに多少情報が書いています。

### XCPretty::Formatterのsubclass
通常以下のようなログが出てるかと思いますが、このログをそのまま出しておくなら `XCPretty::Simple` にするのが良いです。

```
▸ Check Dependencies
▸ Running script '[CP] Embed Pods Frameworks'
▸ Build Succeeded
```

### format_*のメソッドをoverrideして利用
これらの該当となるメソッドは以下にあります。

 - https://github.com/supermarin/xcpretty/blob/master/lib/xcpretty/formatters/formatter.rb

例を出すと以下のようなものがあります。
名前からだいたい想像がつくかと思います。

```
format_compile_error
format_passing_test
```

### サンプルプロジェクト
xcpretty-sample-formatterというのを作った場合の例は以下のとおりです。

```shell:dir構成例
 - bin/
   - xcpretty-sample-formatter
 - lib/
   - sample_formatter.rb
 - spec/
 - Gemfile
 - Gemfile.lock
 - README.md
 - Rakefile 
 - xcpretty-sample-formatter.gemspec
```

bin以下にあるファイルは以下のような感じになります。

```ruby:bin/xcpretty-sample-formatter
#!/usr/bin/env ruby

print File.expand_path('../../lib/sample_formatter.rb', __FILE__)
```

メインとなるのは `sample_formatter.rb` になります。
単にwarningがあるファイルを出力するだけの簡単なものです。

```ruby:lib/sample_formatter.rb
class SampleFormatter < XCPretty::Simple
  def initialize(use_unicode, colorize)
    super
  end

  def format_compile_warning(file, file_path, reason, line, cursor)
    super
    "warning_file:#{file}"
  end
end

SampleFormatter
```

自前で作っている場合の呼び出し方は以下のとおりです。

```shell
xcodebuild | xcpretty -f `#{your_path}/bin/xcpretty-sample-formatter`
```

このような感じで簡単に色々とログ周りをいじることができます。



## 参考資料
 - [xcpretty](https://github.com/supermarin/xcpretty)
 - [xcprettyのformat_**](https://github.com/supermarin/xcpretty/blob/master/lib/xcpretty/formatters/formatter.rb)
 - [fastlane](https://github.com/fastlane/fastlane)
Webdis の使い方

[Webdis](http://webd.is/) の使い方です。
Webdis は、Redis の HTTP クライアントです。

## インストール

Arch Linux

```bash
yay -S webdis
```

Ubuntu

```bash
sudo apt install webdis
```

## 起動

```bash
sudo systemctl start webdis
```

## クライアントからアクセス

redis に保存されている キーが id0001 のデータを取得

```bash
curl http://localhost:7379/GET/id0001
```

redis に保存されている キーの一覧を取得

```bash
curl http://localhost:7379/KEYS/*
```

idで始まるキーの一覧を取得

```bash
curl http://localhost:7379/KEYS/id*
```

実行の様子
![webdis_jan0301.png](https://qiita-image-store.s3.amazonaws.com/0/179446/e26bd658-78c6-273d-9a02-8183917a6ef8.png)

## Webdis を使った応用例
[Webdis を使った 在席表](https://qiita.com/ekzemplaro/items/6cfa93d40c9308fc7f7c)

## トラブルシューティング

webdis が起動できない時

Unit ファイルを確認

```bash
systemctl cat webdis
```

User
Group
が存在しないと起動できません。

次のようになっていて起動しませんでした。

```text:/usr/lib/systemd/system/webdis.service
（省略）
User=webdis
Group=webdis
（省略）
```

次のように変更したところ起動しました。

```text:/usr/lib/systemd/system/webdis.service
（省略）
User=redis
Group=redis
（省略）
```
Unity(C#) 演算や型の挙動＆上限メモ



```
Debug.Log("1:" + (2 ^ 32).ToString());
```
結果→　34

```
Debug.Log("2:" + (Math.Pow(2, 32)).ToString());
```
結果→　4294967296　
(intの上限を越えてもOK)

```
Debug.Log("3:" + ((int)Math.Pow(2, 32)).ToString());
```
結果→　-2147483648
（intでキャストするとやっぱり型上限をこえてマイナスに）


>intの範囲
-2,147,483,648 ～ 2,147,483,647 



```
Debug.Log("4:" + ((long)Math.Pow(2, 32)).ToString());
```
結果→　4294967296

>longの範囲 -9,223,372,036,854,775,808 〜 9,223,372,036,854,775,807
Error reading existing Xauthority

# Error reading existing Xauthority: Failed to open file が発生したら

あるとき、Ubuntuのログインができなくなった。/var/log/syslog を見てみると、`Error reading existing Xauthority: Failed to open file`が発生している。

どうも、何かの拍子に、.Xauthority の権限を変えてしまった模様。

```
$ sudo chown username:username .Xauthority
```

で解決。

参考：
https://askubuntu.com/questions/462582/xauthority-error
Android Studioで予測変換が出ない時

Android Studioで何か設定など行わなくても
コードの予測変換が出るはずなのですが
出ない状態で調べても分からない状態でしばらくそのままになっていて
解決したのでメモ書きしておきます。

Power Save Mode　が　Onになっていなかっただけでした。
Event Log　にて確認することができます。

![スクリーンショット 2018-01-02 15.22.54.png](https://qiita-image-store.s3.amazonaws.com/0/148394/30d3d4ab-9c33-6b46-e30e-d0be7c1fe15b.png)

Power save mode is on
Code insight and other background tasks are disablesd.

パワーセーブモードがオン
コードの見識やその他のバックグラウンドタスクは無効になっています。

これですいすい書けます！

#参考
Android Studio最速入門～効率的にコーディングするための使い方
http://gihyo.jp/dev/serial/01/android_studio/0014
RaspberryPi3でUSBカメラを扱う (Python3、OpenCV3)

# はじめに
OpenCV2系と3系ではビデオキャプチャ周りのAPIが大きく変わったようです。3系にバージョンアップした際に、2系のコードが動作しなくなり手間取ったため簡単にまとめておきます。

# 環境
以下の環境で動作確認しています。

| デバイス等 | バージョン |
| --- | --- |
| Raspberry Pi3 Model B | - |
| RASPBIAN STRETCH WITH DESKTOP | November 2017 |
| Python3 | 3.5.3 |
| OpenCV3 | 3.3.1 |
| [Logicool HD Webcam C270](https://www.logicool.co.jp/ja-jp/product/hd-webcam-c270) | - |


# Python3系+OpenCV3系でUSBカメラを扱う
OpenCV3系を使ってUSBカメラの動画を表示する処理は以下のような感じになります。

```py
import cv2
import time

capture = cv2.VideoCapture(0)

capture.set(3,320) # 幅
capture.set(4,240) # 高さ
capture.set(5,30)  # FPS

while True:
  ret, image = capture.read()
  cv2.imshow("camera",image)
  if cv2.waitKey(10) > 0:
    break

capture.release()
cv2.destroyAllWindows()
```

# Python3系+OpenCV2系でUSBカメラを扱う
ちなみにOpenCV2系では以下のようなコードを使用していました。

```py
import cv2.cv as cv
import time

cv.NamedWindow("camera",1)

capture = cv.CaptureFromCAM(0)

cv.SetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_WIDTH,320)
cv.SetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_HEIGHT,240)

while True:
  img = cv.QueryFrame(capture)
  cv.ShowImage("camera",img)
  if cv.WaitKey(10) > 0:
    break

cv.DestroyAllWindows()
```

# 参考
以下のサイトを参考にさせて頂きました。ありがとうございます。
[OpenCV 2系からOpenCV 3系に乗り換えた時に引っかかる"CV_CAP_PROP_XXX（propId）"の対応表](https://qiita.com/DoChi_72/items/a9fd82c1870b45aaf136)
Cloud Datalabで手軽にディープラーニングを始める

Google Cloud PlatformのDatalabを使えば、15分位でMacやChromebookなどのブラウザだけでDeep Learningを始められます。

![スクリーンショット 2018-01-08 11.45.41.png](https://qiita-image-store.s3.amazonaws.com/0/36973/61c593fd-4b4f-07eb-c35c-31213530f232.png)

# datalab コマンドのインストール

GCPのCloud Shellを使う場合は、最初から `datalab` コマンドが使えます。
Macに `datalab` コマンドをインストールするなら

    brew cask install google-cloud-sdk
    gcloud components install datalab

# Datalabインスタンスを作成

Datalabインスタンスmylabを作成します。

    datalab create --zone asia-northeast1-a mylab --port 8080

数分でインスタンスの起動が終わり、接続ができる状態になると、

- Cloud Shellでは
`Click on the *Web Preview* (square button at top-right), select *Change port > Port 8081*, and start using Datalab.`
というようなメッセージがコンソールに表示されるので、その通りに画面右上の四角い`Web Preview`ボタンから*Change port > Port 8081*を選ぶと、Datalabの画面が出てきます。
- Macなら、
`You can connect to Datalab at http://localhost:8081/`
というようなメッセージが表示され、ブラウザが自動的に開きます。

# Datalabインスタンスへの接続

Datalabインスタンスへの接続を切断するには、単純にCloud Shellで`Ctrl-C`すればOKです。

Datalabインスタンスをしばらく使っていないと、自動的に止まるようですが、明示的に停止するには

    datalab stop mylab

次回Datalabインスタンスを立ち上げて利用するには

    datalab connect mylab

# 必要なライブラリのインストール

DatalabにはデフォルトでTensorFlowがデフォルトでインストールされています。必要なものを追加できます。例えば、Kerasをインストールするにはノートブックで

    !pip3 install keras

それだと、Datalabインスタンスを再起動するたびにやり直さないと行かないんで、スタートアップスクリプトに登録しておくと便利です。次をノートブックのセルで実行します。

    %%bash
    echo "pip3 install keras" >> /content/datalab/.config/startup.sh
    cat /content/datalab/.config/startup.sh

![Screenshot 2018-01-04 at 00.15.37.png](https://qiita-image-store.s3.amazonaws.com/0/36973/cabc5a2b-6b97-d5da-79a5-295485b96a0e.png)

# ソースコードの管理

Datalabにはコマンドラインで使うgitとブラウザで使うungitがデフォルトでインストールされています。パブリックなGitHubレポジトリならungitでsubmoduleとして数クリックで追加できます。

![Screenshot 2018-01-04 at 00.19.34.png](https://qiita-image-store.s3.amazonaws.com/0/36973/5863f30e-404a-9223-9349-a7183bd94258.png)

# データの配置

ノートブックはDatalab VMの`/mnt/disks/datalab-pd/content/datalab/notebooks`フォルダに格納されています。このフォルダがDockerコンテナーにマウントされて利用されるので、デフォルトではrootユーザの所有になっています。そこで、データを`scp`で配置するためにはまずフォルダの所有者を`datalab`に変更してからデータをコピーします。

    gcloud compute ssh mylab --command='sudo chown -R datalab /mnt/disks/datalab-pd/content/datalab/notebooks'

    gcloud compute scp --recurse [LOCAL_DATA_FOLDER] \
    datalab@mylab:/mnt/disks/datalab-pd/content/datalab/notebooks/

# チームでDatalabを使う

Cloud Datalab インスタンスはシングルユーザー環境であるため、チームのメンバーごとに独自のインスタンスが必要です。Datalabインスタンス名を`mylab-{USERNAME}`などにすると区別し易くなります。

GCPプロジェクト内で作成された各 Cloud Datalab インスタンスは、プロジェクト内の同じdatalab-notebooks git レポジトリのクローンを datalab/notebooks ディレクトリに作成するため、これでノートブックをメンバー間で共有できます。

# 参考
- [Datalabクイックスタート](https://cloud.google.com/datalab/docs/quickstart)
- [Chromebook での Cloud Datalab の起動](https://cloud.google.com/datalab/docs/how-to/datalab-using-shell)
- [Cloud Datalab インスタンスに Python ライブラリを追加する](https://cloud.google.com/datalab/docs/how-to/adding-libraries)
- [Cloud Datalabでノートブックのソース管理](https://cloud.google.com/datalab/docs/how-to/working-with-notebooks#source_control)
- [チーム環境で Cloud Datalab を使用する](https://cloud.google.com/datalab/docs/how-to/datalab-team)