OmniAICreator/Qiita-1.07M huggingface dataset:
SAS Viyaを使った決定木の実行法

SAS Viyaで決定木を体験する方法です。今回はタイタニックの生存者データを使います。データは[pcsanwald/kaggle-titanic: A clojure implementation of Kaggle.com's titanic project](https://github.com/pcsanwald/kaggle-titanic)で公開されているものを利用しています。

アクションセットとして決定木を使います。

```python
sess.loadactionset("decisionTree")
```

トレーニングデータを実行します。

```python
dtree_train = sess.decisionTree.dtreeTrain(
 table={'name':'train'},
 target="survived",
 inputs={'pclass','sex','age','sibsp','parch','fare','embarked'},
 nominals={'sex', 'embarked', 'survived'},
 casOut={"name":"titanic_dtree_scoremodel", "replace":True}
)
```

決定木のデータを確認します。

```python
dtree_train
``` 

以下のような結果が返ってきます。

| | Descr | Value
|---|---|---|
| 0 | Number of Tree Nodes | 47.000000
| 1 | Max Number of Branches | 2.000000
| 2 | Number of Levels | 6.000000
| 3 | Number of Leaves | 24.000000
| 4 | Number of Bins | 20.000000
| 5 | Minimum Size of Leaves | 5.000000
| 6 | Maximum Size of Leaves | 368.000000
| 7 | Number of Variables | 7.000000
| 8 | Confidence Level for Pruning | 0.250000
| 9 | Number of Observations Used | 891.000000
| 10 | Misclassification Error (%) | 16.386083


モデルを評価します。

```python
rf_score = sess.decisionTree.forestScore(
 table={'name':'titanic_test'},
 modelTable={"name":"titanic_dtree_scoremodel"},
 casOut={"name":"titanic_rf_score", "replace":True},
 copyVars="survived",
 vote="PACB",
 assessOneRow=True
)
```

スコアは以下のようになります。

| | _RF_PredName_ | _RF_PredP_ | _RF_PredLevel_ | _MissIt_ | _Vote_ | _RF_P_ 1 | _RF_P_ 0
|---|---|---|---|---|---|---|---
| 0 | 0 | 0.894022 | 1.0 | NaN | 0.894022 | 0.105978 | 0.894022
| 1 | 0 | 0.857143 | 1.0 | NaN | 0.857143 | 0.142857 | 0.857143
| 2 | 0 | 0.894022 | 1.0 | NaN | 0.894022 | 0.105978 | 0.894022
| 3 | 0 | 0.894022 | 1.0 | NaN | 0.894022 | 0.105978 | 0.894022
| 4 | 1 | 0.609091 | 0.0 | NaN | 0.609091 | 0.609091 | 0.390909
react 전화번호 등록 기능 앱 만들기

```react:PhoneForm.js
import React, {Component} from 'react';

class PhoneForm extends Component {
  state = {
    name:'',
    phone:''
  }
  handleChange = (e) => {
    this.setState({
      //이벤트 입력값을 name 값을 통해서 가져온다
      [e.target.name]: e.target.value
    });
  }

  handleSubmit = (e) => {
    //페이지 리로딩 방지
    e.preventDefault();
    this.props.onCreate(this.state)

    this.setState({
      name:'',
      phone:''
    })
  }

  render() {
    return (
      <form>
        <input
          placeholder="name"
          value={this.state.name}
          onChange={this.handleChange}
          name="name"
        />

        <input
          placeholder="phone number"
          value= {this.state.phone}
          onChange= {this.handleChange}
          name="phone"
        />
        <div>{this.state.name}{this.state.phone}</div>
        <button type="submit">reg</button>
      </form>

      )
  }
}

export default PhoneForm;
```
タスクスケジューラー

# タスクの作成
* 「Windowsのタスクスケジューラーで数分おきにプログラムを繰り返し実行する」
　http://www.atmarkit.co.jp/ait/articles/1007/30/news111.html
 
 # バッチコマンド
* 「>」と「>>」の違い
 　https://jj-blues.com/cms/column-differencekagikakko/

* Windowsのバッチファイル中で日付をファイル名に使用する 
　 http://www.atmarkit.co.jp/ait/articles/0405/01/news002.html

* 「%~dp0」を理解すれば、Windowsバッチ中でディレクトリ名やファイル名を自由に使えるから便利
 　https://web.plus-idea.net/2016/09/know-dp0-windows-meaning/

* 日時のファイルを作成

```bat:
 @echo off
cd %~dp0
set dt=%date:/=%
set tm=%time: =0%
set fn=%dt%-%tm:~0,2%%tm:~3,2%%tm:~6,2%.txt
echo hello, world. > %fn%
```
Webスクレイピングするなら何言語？Python、Ruby、またはJavaScript？

元記事：https://www.octoparse.jp/blog/which-language-is-better-for-web-scraping-python-ruby-or-javascript/

昨日、あるQ&Aサイトで「[Webスクレイピング](https://www.octoparse.jp/blog/web-scraping/)するなら何言語？Python、Ruby、またはJavaScript？」という質問を見ました。

確かに、Python、Ruby、JavaScriptなど、その言語でもスクレイピングはできますが、各方法のメリットデメリットがいまいちわからず選ぶのに困るでしょう。

というわけで、今日はそれぞれ、私なりの見解とおすすめの本を挙げておきます。


#Python

この中でも最もスクレイピングに適したプログラミング言語はPythonだと思います。なぜなら、Pythonにはスクレピングに適したライブラリが多数揃っているためです。コードの中にスクレイピングのライブラリを読み込ませコードを書きます。ライブラリを使うことにより全くの1からコードを書く必要がなく、効率的にコーディングできます。また、スクレイピング関連の新し目の情報やライブラリに関してはpythonの方が充実しています。

おすすめの本：「Pythonクローリング&スクレイピング -データ収集・解析のための実践開発ガイド」

 

#Ruby

非常にお勧め出来る言語です。Pythonと同様スクレイピングするのに使えるライブラリが一通り揃っております。Pythonを比較して、軽量なライブラリのみで実装出来るのがメリットです。また、Nokogiriというライブラリが非常に秀逸で、Pythonの同等のライブラリよりもずっと使いやすいです。

おすすめの本：「Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例」

 


#JavaScript

スクレイピングするのに使えるライブラリがいくつかあります。垂直Webサイトをクローリングすることができます。動的 Web サイトをスクレイピングすることができます。しかし、環境を揃えるのにかなり手間がかかります。Webページにスクレイピング結果を乗せたいなど、特段の事情が無ければ、PythonかRubyにしておいたほうが明らかに無難でしょう。

おすすめの本：「JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック」


#その他

プログラミング言語を使えるならスクレイピングは簡単ですが、プログラミング知識がない人はどうでしょう？心配しないで、[Webスクレイピング用のソフト](https://www.octoparse.jp/blog/top-30-free-web-scraping-software/)を使ったり、Excelの機能を使ったり、[Googleのスプレッドシート](https://qiita.com/Octoparse_Japan/items/324d53841e286e3ac7d3)を使ったり、非プログラマーの方が使える技も多々あります。ここではOctoparseをお勧めます。

[Octoparse](https://www.octoparse.jp/)は、視覚的に分かりやすくWebサイトからデータを自動で取得できる無料[Webスクレイピングツール](https://qiita.com/Octoparse_Japan/items/326c3e307624e1edd263)／[Webクローラー](https://qiita.com/Octoparse_Japan/items/b370e07815fe613d8a1c)です。コードを書くことなく、スクレイピングの初心者でも、Webサイトから大量の情報を手軽に抽出できます。取得ができるデータは、HTML、テキスト、PNGやGIFをはじめとした画像など幅広く対応できます。ビジネスシーンにあわせて、CSV、EXCEL、HTML、JSON、データベース（MySQL、SQL Server、Oracle）などさまざまな出力形式があります。WindowsアプリケーションであるOctoparseは、Ajaxを使うWebページを含む静的および動的Webサイトに対応し、フォームを記入したり、テキストボックスに検索語を入力したりするなどで、人間の操作をシミュレートしてWebページとやり取りできます。

#まとめ

Webスクレイピングにより、効率良く情報を集め、加工する技術を身に付けることが出来ます。この技術は、ニュースポータル、人工知能、フォーラム、Eコマースサイト、ソーシャルメディア、不動産、財務報告などさまざまな分野で広く使われています。職業プログラマのみならず、非プログラマーにとっても重宝すると思います。ぜひご活用ください。
docker-composeの最新Verでインストール

# 問題
docker-composeのインストールマニュアルには大体↓のような感じでインストールせよと書いてある。

```
curl -L https://github.com/docker/compose/releases/download/1.6.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
```
http://docs.docker.jp/compose/install.html

この[1.6.2]の部分がVersionなのだが、最新がどれなのかわからず、わざわざgithubのサイトにアクセスして探さなきゃならなくて、意外と面倒だったので解決策を探していた。dockerはyumで最新版とればいいが、docker-composeだとyum使えないし、このためだけにpip installするのもめんどくさいし…。

# 解決策
検索したところ
https://stackoverflow.com/questions/49839028/how-to-upgrade-docker-compose-to-latest-version

にあり、ここからパクったシェル。超便利。

```docker-compose-update
#!/bin/bash
compose_version=$(curl https://api.github.com/repos/docker/compose/releases/latest | jq .name -r)
output='/usr/local/bin/docker-compose'
curl -L https://github.com/docker/compose/releases/download/$compose_version/docker-compose-$(uname -s)-$(uname -m) -o $output
chmod +x $output
echo $(docker-compose --version)
```
SAS Viyaの体験版で独自のデータを使う方法

SAS Viyaでは14日間の体験版を用意しています。サンプルデータもあらかじめ用意されているのですが、自分のデータを使ってみたいと考える方も多いでしょう。しかし体験版ではネットワークアクセスなどはブロックされています。

そこで使うのが Data Explorer になります。

SAS Viyaのデモが `https://pdcesx9999.sas.com/` のようなURLだった場合、 `SASDataExplorer` というパスを追加すると Data Explorer にアクセスできます。例えば以下のようなURLです。

https://pdcesx9999.sas.com/SASDataExplorer/

そして、インポートタブでファイル（CSVファイルなど）を指定します。さらにターゲットの宛先で `cas-shared-default/CASUSER(自分のメールアドレス)` を指定します。これでインポートを実行すればOKです。

![Screenshot_ 2018-08-17 11.39.03.png](https://qiita-image-store.s3.amazonaws.com/0/274479/d235a660-e6cd-ab29-929c-6cf4dba7bd25.png)

取り込んだデータはすでにテーブルになっていますので、 `CASTable` メソッドで開けます。`caslib="casuser"` を忘れずに指定してください。

```
table = sess.CASTable('CARS', caslib="casuser")
```

これでテーブルを開けたのでデータの確認もできます。

```
table.head()
```

| Make | Model | Type | Origin | DriveTrain | MSRP | Invoice | EngineSize | Cylinders | Horsepower | MPG_City | MPG_Highway | Weight | Wheelbase | Length
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---
| 0 | Acura | MDX | SUV | Asia | All | 36945.0 | 33337.0 | 3.5 | 6.0 | 265.0 | 17.0 | 23.0 | 4451.0 | 106.0 | 189.0
| 1 | Acura | RSX Type S 2dr | Sedan | Asia | Front | 23820.0 | 21761.0 | 2.0 | 4.0 | 200.0 | 24.0 | 31.0 | 2778.0 | 101.0 | 172.0
| 2 | Acura | TSX 4dr | Sedan | Asia | Front | 26990.0 | 24647.0 | 2.4 | 4.0 | 200.0 | 22.0 | 29.0 | 3230.0 | 105.0 | 183.0
| 3 | Acura | TL 4dr | Sedan | Asia | Front | 33195.0 | 30299.0 | 3.2 | 6.0 | 270.0 | 20.0 | 28.0 | 3575.0 | 108.0 | 186.0
| 4 | Acura | 3.5 RL 4dr | Sedan | Asia | Front | 43755.0 | 39014.0 | 3.5 | 6.0 | 225.0 | 18.0 | 24.0 | 3880.0 | 115.0 | 197.0

体験は14日間で短いですが、繰り返しデモ申請できます。ぜひSAS Viyaを体験してください。

[SAS for Developers | SAS](https://developer.sas.com/home.html)
tmuxのキーバインド一覧の表示方法

# tl;dr
チートシート探すのに疲れたので

# キーバインド一覧の表示方法

以上のキーバインドで一覧画面が表示される。
矢印キーやVimのキーバインドで移動できる。

```
# 順番に押す
# PREFIXは通常だと"ctrl + b"
PREFIX + ?
```
<img width="1440" alt="全画面_2018_08_17_11_27.png" src="https://qiita-image-store.s3.amazonaws.com/0/55873/ff656808-3a46-87e9-0429-da0491e5c268.png">

以下のキーバインドで検索できる。（コピーモードでも使える）

```
順番に押す
PREFIX + / + /
```
<img width="1440" alt="全画面_2018_08_17_11_32.png" src="https://qiita-image-store.s3.amazonaws.com/0/55873/96ae9b06-b493-c35d-de67-a99ff96419c3.png">

例えばrenameで検索すると以下の様になる。
`n`で次へ移動する。`shift + n`で前へ移動する。
<img width="1440" alt="全画面_2018_08_17_11_33.png" src="https://qiita-image-store.s3.amazonaws.com/0/55873/5aaf1cd6-7b4b-ac18-0af4-7205d85a68b7.png">
【Git】誤ってmasterにプッシュしたときの対処法メモ

## 対処法
1. Githubのリポジトリ設定でmasterブランチが保護されていないか確認する．

2. 保護されていたら一時的に保護を解除する．

3. ローカルのmasterを`git reset --hard HEAD^`で1つ前に戻す．

4. `git push -f origin master`で強制プッシュする．
TensorFlow に関する整理 by シニアエンジニア

# 大手ＳＩｅｒで、ＡＩエンジニアを目指すシニア・エンジニアによる”Tensorflow”に取り組んだ際の知識の備忘録。

##１．様々な記述方法
TensorFlowは、非常に変化が激しいフレームワークであり、使いやすいもの・すぐれたものを随時吸収していく。その際、基本的な記述方法（生TensorFlow）ではない、記述方法によるコーディングが可能である為、その当たりを整理する。
https://qiita.com/rindai87/items/546991f5ecae0ef7cde3

記述中！
に加え、Eager execution も整理する。

オリジナル、ラッパー、define-by-run　の違い

###１．１．　基本的な記載方法
###・セッション・オペレーションによる計算
　プログラム　－　演算グラフ（Session）　－　操作（オペレーション；コマンド）で処理が構成

###・項目等
　項目としては、定数（constant）、変数（variables）、外部参照（placeholder）

###・記述例
```python
import tensorflow as tf
```
#### 定義
```python
inc = tf.constant(1, name="inc")                 # 定数
cnt = tf.Variable(0, name="cnt")                 # 変数
y = tf.placeholder(tf.int32, name="y")           # プレースホルダー（箱）
```
#### 処理（オペレーション）の記述
```python
add_opv = tf.add(cnt, inc)                        # 加算
up_op = tf.assign(cnt, add_opv)                   # 値の更新
add_opp = tf.add(cnt, y)                          # 値を代入して加算
```
#### 実行環境（セッション）の記述（＆実行）    
```python
with tf.Session() as sess:                        # セッション開始
    sess.run(tf.global_variables_initializer())   # 変数の初期化

    print(sess.run(up_op))                        # 値の更新を実行
    print(sess.run(up_op))                        #   〃
    print(sess.run(up_op))                        #   〃

    print(sess.run(add_opp, feed_dict={y:1}))     # 値を代入しての加算
    print(sess.run(add_opp, feed_dict={y:3}))     # 　〃
```
#### 処理結果
```python
1
2
3
4
6
```


###１．２．　グラフ・レスな記載方法（contrib.learn）



　プログラム　－　演算グラフ（Session）　－　操作（オペレーション；コマンド）で処理が構成
bootstrapVueでnavbarにvue-routerのリンクを付けたいとき

#bootstrapVueのNavbarを入れたいとき

##[ドキュメントを見るとリンクの部分が省かれている](https://bootstrap-vue.js.org/docs/components/navbar/)

```
<b-navbar toggleable="md" type="dark" variant="info">

  <b-navbar-toggle target="nav_collapse"></b-navbar-toggle>

  <b-navbar-brand href="#">NavBar</b-navbar-brand>

  <b-collapse is-nav id="nav_collapse">

    <b-navbar-nav>
      <b-nav-item href="#">Link</b-nav-item>
      <b-nav-item href="#" disabled>Disabled</b-nav-item>
    </b-navbar-nav>

    <!-- Right aligned nav items -->
    <b-navbar-nav class="ml-auto">

      <b-nav-form>
        <b-form-input size="sm" class="mr-sm-2" type="text" placeholder="Search"/>
        <b-button size="sm" class="my-2 my-sm-0" type="submit">Search</b-button>
      </b-nav-form>

      <b-nav-item-dropdown text="Lang" right>
        <b-dropdown-item href="#">EN</b-dropdown-item>
        <b-dropdown-item href="#">ES</b-dropdown-item>
        <b-dropdown-item href="#">RU</b-dropdown-item>
        <b-dropdown-item href="#">FA</b-dropdown-item>
      </b-nav-item-dropdown>

      <b-nav-item-dropdown right>
        <!-- Using button-content slot -->
        <template slot="button-content">
          <em>User</em>
        </template>
        <b-dropdown-item href="#">Profile</b-dropdown-item>
        <b-dropdown-item href="#">Signout</b-dropdown-item>
      </b-nav-item-dropdown>
    </b-navbar-nav>

  </b-collapse>
</b-navbar>

<!-- navbar-1.vue -->

```
この例に書いてあるリンクの設定を見ると

```
href="#"
```

となってるけどhrefにvue-routerで設定したリンク(/hogehogeとか)を設定しても動かない。:frowning2:

```
href="/hogehoge"
```
じゃあ、どうするか・・・。
こんなときは、toプロパティで設定できます。:point_up:

つまり、

```
to="/hogehoge
```

これに変えたらリンクが出来ます。

上のコードの例をあげると、

```
<b-nav-item href="#">Link</b-nav-item>
これを
<b-nav-item to="/link">Link</b-nav-item>
こうする
```

toプロパティ便利です。
突然vagrant upが失敗するようになるやつ

#エラー内容

```:/vagrant
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=500,gid=500 vagrant /vagrant

The error output from the command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device
```

#原因
hostOSとguestOSのバージョンが一致しない


#vbguestプラグインをインストール
http://www.task-notes.com/entry/20150714/1436842800

```
vagrant plugin install vagrant-vbguest
```

#バージョン情報を確認
```
vagrant vbguest --status

[default] GuestAdditions versions on your host (5.2.4) and guest (4.3.30) do not match.
```
上記の場合、GuestOSのバージョンが古いことが確認できる

#guestOSを更新する場合
```
vagrant vbguest
```

実行結果例

```
[default] GuestAdditions versions on your host (5.2.4) and guest (4.3.30) do not match.
Loaded plugins: fastestmirror
Setting up Install Process
Loading mirror speeds from cached hostfile
 * base: mirrors.cat.net
 * epel: repo.ugm.ac.id
 * extras: mirrors.cat.net
 * remi-safe: ftp.riken.jp
 * updates: mirrors.cat.net
Package kernel-devel-2.6.32-754.2.1.el6.x86_64 already installed and latest version
Package kernel-devel-2.6.32-754.2.1.el6.x86_64 already installed and latest version
Package gcc-4.4.7-23.el6.x86_64 already installed and latest version
Package binutils-2.20.51.0.2-5.48.el6.x86_64 already installed and latest version
Package 1:make-3.81-23.el6.x86_64 already installed and latest version
Package 4:perl-5.10.1-144.el6.x86_64 already installed and latest version
Package bzip2-1.0.5-7.el6_0.x86_64 already installed and latest version
Nothing to do
Copy iso file /Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso into the box /tmp/VBoxGuestAdditions.iso
Mounting Virtualbox Guest Additions ISO to: /mnt
Installing Virtualbox Guest Additions 5.2.4 - guest version is 4.3.30
Verifying archive integrity... All good.
Uncompressing VirtualBox 5.2.4 Guest Additions for Linux........
VirtualBox Guest Additions installer
Removing installed version 4.3.30 of VirtualBox Guest Additions...
Copying additional installer modules ...
Installing additional modules ...
VirtualBox Guest Additions: Building the VirtualBox Guest Additions kernel modules.
VirtualBox Guest Additions: Starting.
VirtualBox Guest Additions: Starting.
/etc/init.d/vboxadd: line 256: : No such file or directory
Unmounting Virtualbox Guest Additions ISO from: /mnt
AttelanoMini:vagrant attela$ vagrant vbguest --status
[default] GuestAdditions 5.2.4 running --- OK.
```

#hostOSを更新する場合
https://www.virtualbox.org/wiki/Downloads で最新版をインストール

#vagrantを再起動
```
vagrant reload
```
eb deploy の完了を待ちたくない

<img src="https://i.gyazo.com/2972201ada9601f6e8fc1e69d069eb7e.png" width="400x">
# 課題

CI から　```eb deploy``` コマンドを使ってデプロイしたいが、同コマンドはデプロイの成功まで見届けないと終了しないため、ジョブを長時間占有してしまう。

# 解決策
0分タイムアウトで解決。アーカイブの作成、アプリケーションのアップロード、デプロイスタートまでやってくれる。

タイムアウト引数が0より大きい数値だと、指定時間経過後にタイムアウトエラーが吐かれるのでご注意を。

```bash
eb deploy --timeout 0
```
[Tensorflow] GPU版で実行時にCUBLAS_STATUS_ALLOC_FAILEDエラーが出たときの対処

# 環境
Windows 10
Python 3.6.2
Tensorflow 1.6.0(GPU版)

# エラー内容
実行時にエラーが表示され、その先頭の方に以下のようなメッセージが表示された場合。

```
failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED
```

# 対処
GPUにてメモリ割り当てに失敗している可能性があるため、メモリ割り当ての最大量を指定することで解決することがあります。

```python:alloc.py
import tensorflow as tf

# GPU搭載メモリが4GBだとすると、その0.5倍の2GBまでを割り当てるよう指定する
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.5)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
```

`per_process_gpu_memory_fraction`の値を0から1の間の数値で指定します。
この値が高すぎるとメモリ割り当てに失敗することがあります。そのため0.5や0.8など、全メモリではなく、一部のメモリを使用するようにするとエラー発生の頻度を下げられるようです。
capybaraで非表示のタグのテキスト内容を表示する方法

## こう言うHTMLだったとして

```html
<span style="display:none" class="some-class-name">非表示なテキスト</span>
```

```rb
session.find("span.some-class-name") # ではデフォルト設定だと見つからない
session.find("span.some-class-name", visible: false) # だと非表示の物を含めて見つける
```

それにしても

```rb
# elementを見つけても通常通りのやり方だと空文字になる
session.find("span.some-class-name", visible: false).text # => "" ????
```

## 解決方法

element#textに`:all`をさらに加えて呼び出す

```rb
session.find("span.some-class-name", visible: false).text(:all) # => 非表示なテキスト
```

- https://www.rubydoc.info/github/jnicklas/capybara/Capybara/Node/Element#text-instance_method
CentOSでyumコマンドがCouldn't resolve hostエラーで使えなくなった時の対処方法

# 概要

Windows版のDockerを使っていてCentOSのDockerイメージをビルドしようとしたときDockerfileに記載している `yum install` コマンドで以下のエラーが発生するようになりました。

```
Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os&infra=container error was
14: PYCURL ERROR 6 - "Couldn't resolve host 'mirrorlist.centos.org'"
Error: Cannot retrieve repository metadata (repomd.xml) for repository: base. Please verify its path and try again
ERROR: Service 'sample' failed to build: The command '/bin/sh -c yum install -y epel-release' returned a non-zero code: 1
```

`Couldn't resolve host` となっているので、どうやら名前解決ができていないようです。
DNSまわりの設定を見直せば解決するだろうと思っていましたが、少しはまったので対処方法をメモしておきます。
それにしても今までDockerイメージのビルドが普通にできていて突然エラーとなるのは謎です。

# 対象

* Windows版のDockerを利用している。
* ホストマシンがドメインに参加している。
* CentOSのDockerイメージをビルドしている。
* yum installでCouldn't resolve hostエラーになる。

# 試したこと

## (1) インターフェース設定ファイルの更新

インターフェースファイル `/etc/sysconfig/network-scripts/ifcfg-eth0` が `ONBOOT=no` になっていると通信ができないようなので `ONBOOT=yes` になるように設定してみます。

```Dockerfile:Dockerfile
sed -ri 's/ONBOOT=no/ONBOOT=yes/' /etc/sysconfig/network-scripts/ifcfg-eth0
```

**結果**
そもそもCentOSのDockerイメージにはインターフェースファイルが存在していませんでした。
今までDockerイメージのビルドはできていたのでこのファイルは関係ないようです。

## (2) レゾルバ設定ファイルの更新

DNSがうまく参照できなくなった可能性もあるので、レゾルバ設定ファイルにGoogle Public DNSを設定してみます。

```Dockerfile:Dockerfile
echo 'nameserver 8.8.8.8' >> /etc/resolv.conf
```

**結果**
変わらず `yum install` コマンドでエラーになります。

## (3) docker-compose.yml ファイルの更新

docker-composeを利用しているので `docker-compose.yml` ファイルからもGoogle Public DNSを設定してみます。

```:docker-compose.yml
services:
  sample:
    dns:
      - 8.8.8.8
```

**結果**
変わらず `yum install` コマンドでエラーになります。
(2)、(3)でDNSを設定しているにもかかわらず名前解決ができていないので、Dockerデーモン自体に問題があるようです。

## (4) Docker デーモンの設定の更新

タスクトレイから Docker のアイコンを右クリックして Settings を開きます。
Daemon メニューをクリックしてDocker デーモンの設定を表示します。

![daemon.png](https://qiita-image-store.s3.amazonaws.com/0/278145/8cd5801e-b715-8a81-d51e-1bb86ba26ec5.png)

`Basic` を `Advanced` に切り替えてから `dns` の設定を追加します。

```
"dns": [
  "8.8.8.8"
]
```

設定を追加したら `Apply` ボタンで適用します。
適用後は Reset メニューから `Restart Docker...` で Docker デーモンの再起動を行います。

**結果**
この設定変更で解決しました。
今までどおり `yum install` コマンドが使えるようになり、Dockerイメージのビルドが成功しました。

# まとめ

ホストマシンがドメインに参加している場合、Dockerイメージのビルドで `yum install` が突然エラーになることがあります。その場合はDocker デーモンの設定からDNSを追加することで対処できます。
gitを使って特定のブランチをローカルで動かしたいとき

# 背景

すでにプロジェクトを `git clone` していて、特定のブランチのコードをゴニョゴニョしたいときのメモ。

# 手順

特定のブランチ名を指定して`git checkout`

```bash
git checkout ブランチ名
```

こうすれば、基本的に特定のブランチをローカルで見れます。これだけでは記事として味気ないので、追記します。

例えば、最新のリモートブランチと　クローンしたときのブランチで差分があったときの対応を説明します。

そんなときは、`git fetch`して、リモート・リポジトリのデータを取得します。この時点ではまだ、コードは変更されません。

```bash
git fetch
```

ローカル上のコードに反映したい場合は、`git merge`すれば反映されます。

```bash
git merge
```

ブランチ名を指定しない場合、リモートトラッキングと言って、現状のブランチ名のリモートの奴をマージします。
ちなみに、`pull = fetch + merge`なので、`git pull`でも大丈夫です。

ありがとうございました。

# 参考

- https://qiita.com/osamu1203/items/cb94ef9da02e1ec3e921
- https://qiita.com/uasi/items/69368c17c79e99aaddbf
- https://eng-entrance.com/git-fetch
docker-composeでdownしきれなかった場合の対処

# 事象
Docker-composeを用いて頻繁にコンテナの上げ下げをしていると、たまに以下のようなエラーが出て、docker-composeが動作しないことがある。この場合、docker stopやdocker rmも動作しない。

```
ERROR: An HTTP request took too long to complete. Retry with --verbose to obtain debug information.
If you encounter this issue regularly because of slow network conditions, consider setting COMPOSE_HTTP_TIMEOUT to a higher value (current value: 60).
```
# Ver
* OS･･･CentOS 6.9
* docker･･･18.01.0-ce
* docker-compose･･･1.16.0

# 対処法
* systemctl stop dockerでdockerdを止める。 
* 大体dockerの変なプロセスが残っているのでこれをkillする。 (これは必須)

`root     10792 30057  0 14:45 ?        00:00:00 docker-containerd-shim -namespace moby -workdir (省略) -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc`

* systemctl start dockerでdockerdを再起動

# 原因
今のところ不明。
"git pull origin master" の正体

# 素晴らしい記事を見つけた
[こちら](http://kray.jp/blog/git-pull-rebase/)の記事がとてもわかりやすくローカルリポジトリがリモートについてまとめておられたので、これをみて自分の頭を整理するついでに"git pull origin master"は何をしているのかを理解するための要点をまとめて見る。
対象は、ローカルで使うgitコマンド(commit, branch, checkout, mergeなど)は使えているけど、　リモートリポジトリに対してのgitコマンド(pull, push, fetchなど)が不安という人だ。

# git pull origin masterの正体
この記事のまとめはこうだ
**`git pull origin master` は `git fetch` +`git merge origin/master` の合体コマンドである**
では`git fetch` と `git merge origin/master`は何をしているのか
一つずつ見ていこう

# `git fetch` とは
`git fetch`はリモートリポジトリとローカルリポジトリの同期をするコマンドだ。
ローカルリポジトリがリモートリポジトリの状態をどのように表しているのかが理解できると同期の仕方が詳しく理解できる。
これを理解するとローカルリポジトリとリモートリポジトリのやり取りの全体像が見えてくる。
ではローカルリポジトリはリモートリポジトリの状態をどのように表しているのか？

## ローカルリポジトリでのリモートリポジトリの表され方
### リモート追跡ブランチというものが存在する
リモート追跡ブランチとは、**リモートリポジトリの「あるブランチの状態」をそのまま表しているブランチ**である
例えば、リモート追跡ブランチの一つである`origin/master`ブランチは、**リモートリポジトリの「masterブランチの状態」をそのまま表すブランチ**ということだ
また、**リモート追跡ブランチは`origin/ブランチ名`のように表される**。
つまり、`origin/develop`はリモートリポジトリのdevelopブランチの状態、`origin/hoge`はリモートリポジトリのhogeブランチの状態をそのまま表すブランチになる。
ただ、ここで問題なのが、追跡ブランチは**リモートの状態は自動的に反映されるわけではない**ということだ
では、どのようにして追跡ブランチにリモートの状態を反映させればいいのだろうか？

### `git fetch`は追跡ブランチにリモートの状態を反映させるコマンド！
`git fetch`というコマンドを実行すると、全ての追跡ブランチがアップデートされ、現在のリモートの状態が反映される。
つまり、`git fetch`を行うことで、追跡ブランチは現在のリモートリポジトリの状態を忠実に表すブランチになれるということだ。

## `git fetch` まとめ
**`git fetch`とは、リモートリポジトリの状態を、ローカルの追跡ブランチに反映させるためのコマンドである**

# `git merge origin/master`とは
このコマンドを実行した時にいたブランチに、リモートリポジトリのmasterブランチの状態を表したorigin/masterブランチをマージするコマンドである(基本的にはマスターブランチで行うであろう)
もしリモートのdevelopブランチの状態を持ってきたいとなったらdevelopブランチに移って`git merge origin/develop`を実行すればいい。そうするとリモートのdevelopブランチの状態を表したorigin/developブランチがマージできる。

# まとめ
`git pull origin master`とは、「ローカルリポジトリの状態を追跡ブランチであるorigin/masterとかにコピーしてきて(git fetch)、masterブランチの追跡ブランチ(origin/master)をローカルのmasterブランチにマージしてきて！」という意味のコマンドであった。
cf.) `git pull origin develop`は「ローカルリポジトリの状態を追跡ブランチであるorigin/masterとかにコピーしてきて
(origin/〇〇のブランチに全てにコピーされるからmasterもdevelopもコピーされる)、developブランチの追跡ブランチ(origin/develop)をローカルのdevelopブランチにマージしてきて！」という意味
Vue.js PascalCase・camelCase・kebab-caseの使い分け

[Style Guide](https://vuejs.org/v2/style-guide/)に命名規約が記載されている。casingに関する項目は以下の4箇所。

#### [Single-file component filename casing](https://vuejs.org/v2/style-guide/#Single-file-component-filename-casing-strongly-recommended)

* vueファイルのファイル名はPascalCaseもしくはkebab-caseで統一すること。

```text
MyComponent.vue  // Good
myComponent.vue  // Bad
my-component.vue  // Good
```

#### [Component name casing in templates](https://vuejs.org/v2/style-guide/#Component-name-casing-in-templates-strongly-recommended)

* コンポーネント名はvueファイルや文字列テンプレートではPascalCase、DOMテンプレートではkebab-caseとすべき。（DOMテンプレートではHTMLの規約上kebab-caseが強制される。）
* ただし、既にkebab-caseで統一されているプロジェクトではkebab-caseも許容される。

```html
<!-- vueファイルもしくは文字列テンプレート -->
<MyComponent/>  // Good
<myComponent/>  // Bad
```

#### [Component name casing in JS/JSX](https://vuejs.org/v2/style-guide/#Component-name-casing-in-JS-JSX-strongly-recommended)

* コンポーネント名はJS/JSXではPascalCaseとすること。
* ただし、グローバルコンポーネントの登録のみを使うシンプルなアプリではkebab-caseを使ってもよい。（JSからグローバルコンポーネントを参照することは稀で、DOMテンプレートに多く記述されるため。）

```javascript
import MyComponent from './MyComponent.vue'  // Good
import myComponent from './MyComponent.vue'  // Bad
```

```javascript
export default {
  name: 'MyComponent',  // Good
  name: 'my-component',  // Bad
```

#### [Prop name casing](https://vuejs.org/v2/style-guide/#Prop-name-casing-strongly-recommended)

* 属性（props）名は宣言（JSでのコンポーネント定義）時はcamelCase、HTMLではkebab-caseとすること。

```javascript
props: {
  myProp: String,  // Good
  'my-prop': String,  // Bad
```

```html
<MyComponent my-prop="value"/>  // Good
<MyComponent myProp="value"/>  // Bad
```
チートシート ibmcloud vs CF コマンド対応表

# はじめに
今、WatsonをはじめとするIBM Cloudのサービスは、従来型のサービスからIAMベースのものに移行しつつあります。
新しいIAMベースのWatsonサービスではCFコマンドが使えないので、新しいコマンドラインであるibmcloudコマンドに移行する必要があります。
しかし、この新しいコマンドの解説が非常に少なく。。。
ということで対応表を作ってみました。

| 意味                  | IBM Cloudコマンド       |CFコマンド (省略形)        |
|:---------------------|:------------------|:-------------------|
| リソースの一覧表示|ibmcloud resource service-instances|(N/A)|
| アプリケーションの一覧表示|ibmcloud app list|cf apps (a)|
| サービスの一覧表示 |ibmcloud service list|cf services (s)|
| | |
| サービスの作成|ibmcloud service create \<OFFERING_NANE\> \<PLAN_NAME\> \<SVC_NAME\>|cf create-service (cs) \<OFFERING_NANE\> \<PLAN_NAME\> \<SVC_NAME\>|
| サービスのエイリアス定義|ibmcloud resource service-alias-create \<ALIAS_NAME\> --instance-name \<INST_NAME\>|(N/A)|
| アプリケーションの配置・更新|ibmcloud app push  \<APP_NAME\>|cf push|
| サービスのバインド|ibmcloud service bind \<APP_NAME\> \<SVC_NAME\>|cf bind-service (bs) \<APP_NAME\> \<SVC_NAME\>|
| 環境変数の設定|ibmcloud app env-set  \<APP_NAME \>  \<ENV_NAME \>  \<ENV_VALUE \>|app set-env (se) \<APP_NAME\> \<ENV_NAME\> \<ENV_VALUE\>|
| アプリケーションの再構成|ibmcloud app restage \<APP_NAME\>|cf restage (rg) \<APP_NAME\>|

Offering Nameの一覧

| Offering Name                 | API Name       |
|:---------------------|:------------------|
|personality_insights|Personality Insights|
|pm-20|Watson Machine Learning|
|watson_vision_combined|Visual Recognition|
|language_translator|Language Translator|
|natural-language-understanding|Natural Language Understanding|
|natural_language_classifier|Natural Language Classifier|
|speech_to_text|Speech to Text|
|text_to_speech|Text to Speech|
|conversation|Watson Assistant|
|discovery|Watson Discovery|
|tone_analyzer|Tone Analyser|


# 参考
下記書き込みも参考にして下さい。

[IBM Cloud IAM対応のためのtips](https://qiita.com/makaishi2/items/ab2290e471fbff245b6a)
地球温暖化２

#目的
　地球温暖化のデータはg-portalにもあるんだが、もっとシンプルなリモートセンシングhttp://www.remss.com/missions/amsr/
　のデータの活用方法

#経緯
　なんだが、３日もかかってしまった

#ダウンロード
　webの右のhttp AMSR-2からダウンロードできます。
  1日のやつは、データが欠けているので d3dのデータが３日分なのでおすすめ
　このformatの解析で３日かかってしまいました。
　http://data.remss.com/amsr2/support/python27/ にもあった！

#format
 単純に6x720x1440の１バイトのデータ列です。
 次のpythonでgray-scaleのtiffに変換できます。

```python:
import numpy as np
from PIL import Image

f=open('f34.h5','rb')

dt = np.fromfile(f,dtype="u1").reshape(6,720,1440)

im = Image.fromarray(dt[1,::-1,:])
im.save("xx0.tif")
```

この６というのは、
SST = Sea Surface Temperature 海面温度
WSPD-LF = 10 meter Surface Wind Speed　海上風速
WSPD-MF = 10 meter Surface Wind Speed　海上風速
VAPOR = atmospheric water vapor　大気水蒸気
CLOUD = cloud liquid water　雲
RAIN = Rain rate　雨
という測定結果で、１バイトのデータの意味は
SSTの場合はscale=0.15,offset=-3.0を計算すると
海面温度に変換できるということになります。
[Swift]Remove border from bottom of Navigation bar

Memorandum

Delete border from bottom of Navigation bar.
ナビゲーションバーの境界線（下線）を消す

This is useful when put same color UI part below navigation bar.


```Swift 
 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        
// Add bellow lines at didFinishLaunchingWithOptions
  UINavigationBar.appearance().setBackgroundImage(UIImage(), for: UIBarMetrics.default)
        UINavigationBar.appearance().shadowImage = UIImage()
        
        return true
    }
````



Before
<img width="427" alt="Screen Shot 2018-08-17 at 9.17.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/36475/8d3994bc-0622-30e4-aa3e-3fabcf02b37e.png">


After
<img width="424" alt="Screen Shot 2018-08-17 at 9.16.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/36475/5aae6f7a-11b9-be23-0507-01af5c0a540e.png">
第30話 Totative数

この記事は[仮面ライダービルドの数式](https://qiita.com/izmktr/items/e26a624e79bce3edccc9)の第30話です。

```math
arg\max_n
[\{totative\ of\ n\} ⊂ \{prime\}] = 30
```

totative とは、その数以下でその数と互いに素な数、という意味です。
例えば、6 なら1,3,5 が該当しますし、7 なら素数なので1～6 すべてが該当します。
そして、そういう数がすべて素数の数の最大は30 である、という意味です。
1 は本来素数ではないのですが、今回は例外ですね。

n 以下で互いに素な数はすべて素数である数というのは、
特に名前もないようなので、今回はTotative 数と名付けます。

互いに素の意味は、最大公約数が1 になる数の組み合わせです。
例えば、25 と36 は互いに素です。
28 と36 はどちらも4 で割れるので互いに素ではありません。

互いに素、というのは背理法でよく使われます。
a,b を互いに素な数と仮定して計算を進めていき、
a もb もなにかの倍数なので互いに素ではない、
よって、この式を満たす自然数a,b は存在しない、という感じです。

Totative 数の最大は本当に30 なのか、考えてみましょう。

30 は素因数分解すると2×3×5 ですから、
2,3,5 を素因数に含まない最大の合成数は7×7 の49 です。
ですから、全て素数であることがわかります。

表にして考えてみます。

|範囲 |Totative 数 |Totative 数の候補|
|:-:|:-:|:-:|
|1～3 |1,2,3| すべての数|
|4～8 |4,6,8 |2 の倍数|
|9～24| 12,18,24| 6(2×3)の倍数|
|25～48| 30| 30(2×3×5)の倍数|
|49～120| なし| 210(2×3×5×7)の倍数|

30 の次のTotative  数の候補は60 ですが、7×7 の49 が素数ではありません。
そこで、49を約数とするために7 を30 にかけた210 を考えます。
ですが、121(112),169(132)が邪魔をします。

この後は、新しい素数の二乗が出てくるほうが早いので、30 が最大のT数となります。
【Unity】山岳Terrain中のMandelbroを探せ♪

Terrain初心者ということで、山岳っぽいTerrain使って、その中をマンデルブロが動いているのをTerrainAssetsのFirstPersonControllerのカメラを使って捜索するをやりました。

![terrain_pj.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/165c22e5-5758-7866-0ceb-4020ef80e9ed.jpeg)


【参考】
①[UnityのTerrainで大地を創る](https://qiita.com/yando/items/ef76c200bb50005170d5)
②[unityterraintoolkit](https://code.google.com/archive/p/unityterraintoolkit/downloads)
③[【Unity】Terrainを使ってMandelbroを動かしてみた♬](https://qiita.com/MuAuan/items/d24f2bf136045af87807)

上記画像見れば、作成方法はだいたい想像つきそうですが、以下解説します。
###やったこと
（１）TerrainAssetsの準備
（２）Terrainを組み合わせて山岳を作り、MandelbroのTerrainを配置する
（３）StandardAssetsのFirstPersonControllerを配置して動かす
（４）OculusGoで捜索する
###（１）TerrainAssetsの準備
TerrainAssetsの部品が全くなかったので、上記の参考①を参考にAssetsStoreと参考②などでとにかくImport。
それでもGrassとかがないので仕方なく以下の方法で作成しました。
###（２）Terrainを組み合わせて山岳を作り、MandelbroのTerrainを配置する
TerrainはFreeSampleでAPIExampleに山岳のものがありました。
ということでそれを丸々使いました。
さらに、独自に参考①に従ってホワイトだけど山岳を作り、この二つの山岳を重ねて配置。
するとちょうどいい塩梅に雪山の山岳が作成できました。
次に、前回のマンデルブロを配置して、動かします。
するとなんとなく山岳地帯をマンデルブロが動く絵になりました。
周りの背景はやはりFreeのMicrospratのTerrainを貼り付けています。
![microsprat.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/b2eaf8f2-990f-1058-e048-b43bf444272f.jpeg)
###（３）StandardAssetsのFirstPersonControllerを配置して動かす
FirstPersonControllerを配置が今回一番苦労しました。
これはカメラです。
これをマウスで左右上下に動かせます。
配置がTerrainに乗らないと重力で下に落ちてしまいます。そこでTerrain上に落ちるようにしました。さらにカメラの中心とカメラの移動半径を小さめにしました。これは試行錯誤で適当な半径を決めました。
一方、マンデルブロは前回のとおり、配置してスタート地点と繰り返しの位置を山岳Terrainのサイズに合わせます。また、山に隠れてしまうので少しピーク値を大きめにしました。
###（４）OculusGoで捜索する
ということで、OculusGoしてみます。
[【Unity】OculusGoで山岳Terraomのマンデルブロを探せ♪](https://youtu.be/ZtHJ-dOImL8)
<a href="http://www.youtube.com/watch?feature=player_embedded&v=ZtHJ-dOImL8" target="_blank"><img src="http://img.youtube.com/vi/ZtHJ-dOImL8/0.jpg" 
 </a>
※画像をクリックするとYouTube動画につながります
mouseよりコントローラーの方が難しい。また、OculusGoだと少し重いです。
ということでFirstPersonControllerの感度を１に落としました。
あと、肝心なことでもともとFirstPersonControllerについているカメラは削除してOculusGoVRのカメラに変更します！
###まとめ
・Terrainを使って雪景色山岳を作成した
・カメラを山岳に配置してマウス操作で動くようにした
・山岳内でマンデルブロを動かして、捜索した

・Terrainの描画などの部品の入手がまだまだ不明
・人を動かして散歩したい
プロキシ、別仮想環境がある場合の docker 使用手順

# 概要

Docker のインストール自体は簡単ですが、プロキシがある環境、または別仮想環境では、いくつか注意点があります。テストした環境は、Windows 10 Pro です。

MacにおけるDockerのプロキシ設定も同じかと思われますが、プロキシのある環境でMacのDockerを試していないため、ここでは省略します。

* Docker for Windowsの動作環境

    Windows 10 Pro、Enterprise、Windows Server 2016

* 後に記載がありますが、VMware や VirtualBox を使用している場合には、起動時のオプションで環境を切り替える必要があります。別仮想環境がある場合も、設定変更及び再起動でどちらも 使用可能でした。(どちらを使用するかで再起動が必要です) 


# 手順

1. Docker インストール

    以下の場所から、Stable をダウンロードしインストールします。

    [https://docs.docker.com/docker-for-windows/](https://docs.docker.com/docker-for-windows/)

2. Hyper-V

    Docker for Windows を起動すると、Hyper-V や Container を有効にするよう指示が出るので指示に従えばインストールされます。何回かダイアログ、再起動が必要な場合があります。

3. Kitematic

    Docker for Windows のタスクバーのアイコンを右クリックから Kitematic のメニューを選択すると ダウンロードできるので、指定の場所に配置します。

4. プロキシ

    Docker のプロキシ設定は、タスクバーのアイコンを右クリックし、Settings からプロキシを設定できます
    * Manual proxy configuration を選択
    * WebServer(HTTP)にプロキシサーバーを指定
    * HTTPSも同じならば、Use same for both にチェックオン
    * Bypass~に除外アドレスを指定

    ![画像](https://tfukumori.github.io/images/2017-2-4-DockerProxy.png)


5. Hyper-V と仮想ツールについて

    Hyper-V とほかの仮想環境(VMware、VirtualBox)は共存可能ですが、同時には起動できません。
    * Docker を使用する場合→Hyper-V をオンにする
    * 仮想環境(VMware、VirtualBox)を使用する場合→Hyper-V をオフにする

    必要に応じて、再起動し設定を選択して起動する必要があります。

    Windows 10、Windows Server 2016 では上記 2 つを起動時に選択するための設定を bcedit コマンド で追加できます。詳細は以下をご参照ください。

    [Tech TIPS:他の仮想環境を利用するために Hyper-V を一時的に無効にする - @IT](http://www.atmarkit.co.jp/ait/articles/1511/13/news032.html)

6. Docker の動作確認

    コマンドライン、または PowerShell を起動し、以下のコマンドを実行します。

    ```
    docker run hello-world
    ```

    モジュールのダウンロード、実行までが行われ、Hello World が表示されれば OK です。 

# その他

## イメージの探し方

* [Docker Hub](https://hub.docker.com/) で検索する。（基本的にここから）
* イメージ名に / が入っていないのが Docker 社公式のイメージ
Rの行列とベクトル計算

よく使うやつをまとめておく

### データ準備

```R
> a <- c(2, 5)
> b <- c(3, 7)
> X <- matrix(1:4, nrow=2, ncol=2)
> Y <- matrix(5:8, nrow=2, ncol=2)

> print(a)
[1] 2 5
> print(b)
[1] 3 7
> print(X)
     [,1] [,2]
[1,]    1    3
[2,]    2    4
> print(Y)
     [,1] [,2]
[1,]    5    7
[2,]    6    8
```

## ベクトル と ベクトル 

### ベクトル同士の積（ベクトルの内積） `%*%`

```R
> print(a %*% b)
     [,1]
[1,]   41
```

### ベクトル同士の要素積 `*`

```R
> print(a * b)
[1]  6 35
```

### ベクトル同士の直積(ベクトルのテンソル積)　`%o%`

```R
> print(a %o% b)
     [,1] [,2]
[1,]    6   14
[2,]   15   35
```

## 行列 と 行列

### 行列同士の積 `%*%`

```R
> print(X %*% Y)
     [,1] [,2]
[1,]   23   31
[2,]   34   46
```

### 行列同士の要素積 `*`

```R
> print(X * Y)
     [,1] [,2]
[1,]    5   21
[2,]   12   32
```

### 行列同士のクロネッカー積 `%x%`

```R
> print(X %x% Y)
     [,1] [,2] [,3] [,4]
[1,]    5    7   15   21
[2,]    6    8   18   24
[3,]   10   14   20   28
[4,]   12   16   24   32
```

## 行列とベクトル

### 行列とベクトルの積 `%*%`

```R
> X %*% a
     [,1]
[1,]   17
[2,]   24
```

### 行列とベクトルの要素積（わかりづらい） `*`

```R
> X * a
     [,1] [,2]
[1,]    2    6
[2,]   10   20
```
「[運用小ネタ] RAMとECSのTag機能でインスタンスを保護する」についての色々

## はじめに
　Qです。 Alibaba Cloudという謎だらけのクラウドサービスに興味があって、某ライフデザイン企業をやめて、7月からソフトバンクとAlibabaが作ったジョイントベンチャーに転職しました。
　<font color="red">Qiita上の投稿はあくまでも個人的な発言になります。</font>
　もともとはAWSを触っていて、AWS上のセキュリティ管理統制とか開発(少し)とかやっていました。
　AWSの経験を活用して、[【[運用小ネタ] RAMとECSのTag機能でインスタンスを保護する】](
https://techblog.sbcloud.co.jp/2018/08/17/protect_instances_by_ram_and_tag/)というAlibaba Cloudのネタを会社のブログに投稿しましたが、Qiitaのほうがもっと自由に書きますので、もう少し好き勝手に言いたくて、この記事を書くことにしました。

## 背景
　1年前に[【タグで特定のEC2インスタンスを保護するIAMポリシー】](https://qiita.com/jobbin/items/cdc3e55b6331c1e4b0a8)というAWSの運用ネタを投稿しました。
　Alibaba CloudのRAM (<font color="red">Resource Access Management</font>)はAlibaba Cloudのリソースへのアクセスを制御するサービスで、AWSのIAMと似ていますので、おそらく 同様なやり方でAlibaba Cloud上でも実現できると思って、確認したところ、想定通りの結果になりました。

## RAMについて
 
　Alibaba Cloudのサービスへのアクセス制御は下記３つのレベルでわかれます。　

1. サービスレベル
  <br>サービスに対して、すべての操作が「できる/できない」で制御
2. アクションレベル
  <br>APIアクションまで制御可能
3. リソースレベル
<br>個々のリソースまで制御可能

　AWSのIAMも同じ考え方です。上記のRAMの情報は[中国語ドキュメント](https://help.aliyun.com/document_detail/28630.html)と[英語のドキュメント](https://www.alibabacloud.com/help/doc-detail/28630.htm)には記載されていますが、なぜか[日本語ドキュメント](https://jp.alibabacloud.com/help/doc-detail/28630.htm)には何も記載されていません。 ~~何をやっているんだ、お前ら~~ 本当に不思議だと思っています。ちゃんとフィードバックしておきます。

　一時的にAlibaba CloudのRAM は AWSのIAMと同じと思っていました。その時に
 [AliEaters #2](https://alibabacloud.connpass.com/event/80249/) (Alibaba Cloudのユーザーグループの勉強会) で僕は[「(RAMは)AWS経験者だったら、すぐに理解できる」](https://www.slideshare.net/binbinqiu1/alieaters2alibabacloud0320-180320184843)と言ってしまいましたが、僕の発表を聞いて、「同じだろう」と思っていた方が見事にハマり、[AliEaters #4](https://alibabacloud.connpass.com/event/86350/)でその[【苦労した話】](https://www.slideshare.net/ssusercc283a/alibabacloudsamlssoaws)を披露することになりました。
　結局、<font color="red">Alibaba CloudのRAMはAWSのIAMと似ているものの、別物です</font>。

## 最後

　Alibaba Cloudのプロダクトの一部はAWSのプロダクトと概念的にも機能的にも似ていますが、AWSと全く同じだと思いこんで、利用すると、必ずハマります。自分もハマりまくりました。

　現状Alibaba Cloudは中国/インターナショナル/日本という３つに分かれています。日本サイトは日本のデータセンターでAlibaba Cloudのプラットフォームで構築したものになります。
　日本サイトのプロダクトはまだ40個くらいですが、中国サイトのプロダクトは100個越えていて、速いスピードで機能更新やサービスの追加が行われています。Alibaba Cloudにご興味ある方は是非 (前職時代に書いた記事)[【Alibaba Cloudサービス一覧、サービス概要、類似のAWSサービスをまとめてみた】](https://qiita.com/jobbin/items/0cf12d402c5d1e7a5cbb)を読んでみてください。
ダーティリード、リピータブルリード、ファントムリードをちゃんと理解してからトランザクション分離レベルを理解しよう


# はじめに

トランザクション分離レベルとは2つ以上のトランザクションの間同士でのお互いの操作の影響度合いを定義したものです。

具体的にトランザクション分離レベルが何なのかを理解するためには、リード現象(Read phenomena)である「ダーティリード(Dirty reads)」「ノンリピータブルリード(Non-repeatable reads)」「ファントムリード(Phantom reads)」の3種類の違いを理解する必要があります。

本記事ではこの3種のリード現象を例を用いて解説し、トランザクション分離レベルの定義を記載しています。

# 3種のリード現象

## 説明に利用する例

以下の`Articles`(記事)テーブルという擬似的なテーブルを例に進めます。

|Id|Title|Tag|
|-------|------|------|
|1|Let's start using Docker!|Container|
|2|Why should you learn Go?|Go|

## ダーティリード(Dirty reads)

|Flow|トランザクション1(T1)|トランザクション2(T2)|説明|
|-------|-------|------|------|
|Step1|SELECT Tag FROM Articles WHERE Id = 1;||T1は"Container"でReadする|
|Step2||UPDATE Articles SET Tag = 'Docker' WHERE id = 1;|T2はCommitしない|
|Step3|SELECT Tag FROM Articles WHERE Id = 1;||T1は"Docker"でReadされる(**ダーティリード現象**)|
|Step4||ROLLBACK;|T2はロールバック可能|

上記のようにダーティリードは、COMMITされていないトランザクションでの変更を他トランザクションがReadすることができてしまう現象のことを指します。

## ノンリピータブルリード(Non-repeatable reads)

|Flow|トランザクション1(T1)|トランザクション2(T2)|説明|
|-------|-------|------|------|
|Step1|SELECT * FROM Articles;||T1は全2レコードをクエリする|
|Step2||UPDATE Articles SET Tag = 'Docker' WHERE id = 1;|ここではT1は対象レコードを読み取れない|
|Step3||COMMIT;|T2がコミットされる|
|Step4|SELECT Tag FROM Articles WHERE Id = 1;||T1は"Docker"でReadされる(**ノンリピータブルリード現象**)|

上記のようにノンリピータブルリードは、他トランザクション(T2)がコミットにより**対象レコードを更新**した場合、1トランザクション(T1)中でReadする**レコードデータ**が異なってしまう現象を指します。

## ファントムリード(Phantom reads)

|Flow|トランザクション1(T1)|トランザクション2(T2)|説明|
|-------|-------|------|------|
|Step1|SELECT * FROM Articles;||T1は全2レコードをクエリする|
|Step2||INSERT INTO Articles(Id,Title,Tag) VALUES (3, 'How to start Go', 'Go');|T2で新規レコードを追加する|
|Step3||COMMIT;|T2がコミットされる|
|Step4|SELECT * FROM Articles;||T1は全3レコードをクエリする(**ファントムリード現象**)|

上記のようにファントムリードは、他トランザクション(T2)がコミットにより**新規レコード追加(または削除)**をした場合、1トランザクション(T1)中でReadする**テーブルデータ**が異なってしまう現象を指します。

# トランザクション分離レベル VS リード現象 対応表

上記のリード現象と代表的なトランザクション分離レベルとの対応表は下記テーブルのようになります。

X: 発生し得る(may occur)
O: 発生しない(don't occur)

|トランザクション分離レベル|Dirty reads|Non-repeatable reads|Phantoms reads|
|-------|:------:|:------:|:-------:|
|Read Uncommitted|X|X|X|
|Read Committed|O|X|X|
|Repeatable Read|O|O|X|
|Serializable|O|O|O|

トランザクション分離レベルのより細かい種類と、各種リード現象をどのよう防ぐかの設計・実装は、PostgreSQL、MySQL、SQLSeverなど各RDBMSにより異なります。設定の際はそれぞれの公式ドキュメントを参照する必要があります。

# 参考

* https://docs.microsoft.com/ja-jp/sql/t-sql/statements/set-transaction-isolation-level-transact-sql?view=sql-server-2017
* https://en.wikipedia.org/wiki/Isolation_(database_systems)
* https://stackoverflow.com/questions/11043712/what-is-the-difference-between-non-repeatable-read-and-phantom-read
自分のポートフォリオサイトをHugoでGitHub Pagesへサクッとデプロイ


# This article has been Deprecated

New article link

https://qiita.com/momotaro98/items/b13236e2f8c619edada9

# はじめに

今まで自身がプライベートで作成してきた作品をポートフォリオサイトとして公開しました。

ポートフォリオサイト: https://momotaro98.github.io/
サイトソース: https://github.com/momotaro98/hugo-bio

デプロイ先は[GitHub Pages](https://pages.github.com/)
静的サイト生成には[Hugo](https://gohugo.io/)とHugo用に提供されてるResumeテーマモジュール([こちら](https://themes.gohugo.io/hugo-resume/))を利用させていただきました。

本記事ではこれらを使ったサイトの作り方、公開方法を紹介します。

# 前提

ローカル環境: MacOS High Sierra 10.13.6

# 手順

## サイト作成

### はじめにHugoをインストール

```shell-session
$ brew install hugo
```

### テーマのレポジトリをフォークしてGit Submoduleに追加

Hugo用に提供されているテーマを利用します。
今回はポートフォリオサイトを作りたいので[こちら](https://themes.gohugo.io/hugo-resume/)のResumeテーマというのを利用させていただきました。
私は自分でサイトのデザインやHugoを変更できるよう、[GitHub上のレポジトリ](https://github.com/eddiewebb/hugo-resume)をフォークしています。

フォークしたらサイトを作成する作業ディレクトリに下記コマンドでGit Submoduleとして追加します。

```shell-session
$ cd YOUR_SITE_WORKSPACE_PATH
$ git submodule add -b master git@github.com:<YOUR_USERNAME>/hugo-resume.git themes/resume
```

### サイト用レポジトリを作成

ポートフォリオサイトを作ります。今回利用するResumeテーマでは[こちら](https://github.com/eddiewebb/hugo-resume/tree/master/exampleSite)に作成例が載っているので参考にして作りましょう。
【はじめに】のリンクで紹介している私のも参考にできます。


Hugoの以下コマンドでローカルマシン上に変更のホットウォッチをするサーバが立ち上がるのでチェックしながら作れます。

```shell-session
$ hugo server
```


## サイトをGitHub Pagesへデプロイ

### GitHub PagesのレポジトリをGitHubへ作成

[公式ドキュメント](https://pages.github.com/)を参考に自身のユーザアカウントのGitHub Pagesのレポジトリを作成します。

【注意】 すでに自身のユーザアカウントに別サイトをデプロイ済みであれば、プロジェクトページとして作成するか、GitHub Pages以外の静的サイトホストサービスを利用してください。

### GitHub PagesのレポジトリをGit Submoduleとしてソースレポジトリに追加

上記で作成したGitHub Pagesのレポジトリをサイト用レポジトリのpublicディレクトリ配下にGit Submoduleとして追加します。

```shell-session
$ cd YOUR_SITE_WORKSPACE_PATH
$ git submodule add -b master git@github.com:<USERNAME>/<USERNAME>.github.io.git public
```

### デプロイ

作成しているサイトが問題ないことを確認した後、以下のデプロイ用スクリプトをサイト用レポジトリのトップに配置し、実行することでGitHub Pages上へサイトをデプロイできます。

```bash:deploy.sh
#!/bin/bash

echo -e "\033[0;32mDeploying updates to GitHub...\033[0m"

# Build the project.
hugo # if using a theme, replace with `hugo -t <YOURTHEME>`

# Go To Public folder
cd public
# Add changes to git.
git add .

# Commit changes.
msg="rebuilding site `date`"
if [ $# -eq 1 ]
  then msg="$1"
fi
git commit -m "$msg"

# Push source and build repos.
git push origin master

# Come Back up to the Project Root
cd ..
```

```shell-session:ターミナル実行
$ cd YOUR_SITE_WORKSPACE_PATH
$ chmod +x deploy.sh
$ ./deploy.sh
```

Pushできていることを確認し、
`https://YOUR_USERNAME.github.io/`
へアクセスしサイトが表示できていればOKです。
react nativeのScrollViewで最下部までスクロールしたときに処理を実行する方法

react nativeのScrollViewは`scrollToEnd()`があるけど、手動で最後までスクロールしたい時のpropsがない。

今回はscrollViewの`onMomentumScrollEnd`をつかって、この処理を実行する。
`onMomentumScrollEnd`は一回のスクロールが終わった時、何か処理をするprops

```javascript
  <ScrollView
    onMomentumScrollEnd={this._scrollPosition.bind(this)}
  >
  </ScrollView>

  _scrollPosition (e: any) {
    let offsetY = e.nativeEvent.contentOffset.y // スクロール距離
    let contentSizeHeight = e.nativeEvent.contentSize.height // scrollView contentSizeの高さ
    let scrollViewHeight = e.nativeEvent.layoutMeasurement.height // scrollViewの高さ

    if (offsetY + scrollViewHeight >= contentSizeHeight) {
      console.log('ここで処理を実行する')
    }
  }
```
ridgepoleの使い方

最近になってridgepoleを使い始めました。その使い方を備忘録として残しておきたいと思います。

# なぜridgepoleを使うのか？
RailsでDBスキーマを管理する場合は、Migrateファイルを使用するのが一般的です。

しかし、テーブルの追加や変更の度にファイルが増えて、管理するのが大変です。

ridgepoleを使用すると、1つのファイルでスキーマを管理できます。スキーマの追加・変更・削除をする場合は、１つのファイルの修正で済むため、管理が非常に容易になります。

# 前提
db:createを実行して、DBが作成されていること。

# 使用方法
### Gemfile
```ruby:Gemfile
gem 'ridgepole'
```
上記を追記して、bundle installする。

### Schemafileを作成
```ruby:config/Schemafile
create_table "users", force: true do |t|
  t.string   "email"
  t.string   "name"
  t.datetime "created_at"
  t.datetime "updated_at"
end
```
※"ID"は自動的に作成されるので、指定不要。

### ridgepoleコマンド実行
```console
$ bundle exec ridgepole -c config/database.yml -E development --apply -f config/Schemafile
```
-cオプションにdatabase.ymlを指定。
-Eオプションにて環境を指定。テスト環境を指定したい場合は「test」にする。
-fオプションにて作成したSchemafileを指定する。

# 導入後の注意
モデルを作成する場合は、migrateをスキップすること。

```console
$ Rails g model Article --skip-migration
```

# 参考にしたサイト
[ridgepoleの初期設定と使い方](https://qiita.com/fujitora/items/ca55d33f0fad0bf64114)
php-master-changes 2018-08-16

だいたい日が変わってから出社するまでくらいの間に更新、という感じでやっていきたい

# 2018-08-16
## remicollet: fix man page installation
- https://github.com/php/php-src/commit/1f2f2c6b9671ea18404d30c0c30cb1c8b88d4e60
- phpdbg の manpage インストール先が間違っていた問題の修正
- [91996e7](https://github.com/php/php-src/commit/91996e7ee504311ff4eca9dbd5840114f75acbad) からだというけど、[17658fa](https://github.com/php/php-src/commit/17658fa7b80bcdb59979c314bea02e8461402ced#diff-68631b3fcf37e4961c7bb67b1858b8ff) からな気がしなくもない

## laruence: Fixed bug [#76747](https://bugs.php.net/bug.php?id=76747) (Opcache treats path containing "test.pharma.tld" as a phar file)
- https://github.com/php/php-src/commit/8c92442b4988a07f683439401da8372af0eba2b3
- ext/opcache 利用時、"test.pharma.tld" など ".phar" を含むパスが phar と誤判定され include に失敗するバグの修正
- strstr() で ".phar" が含まれててかつ "://" が含まれてなければ phar、という雑い判定だった
- 末尾が ".phar" でかつ "://" が含まれてなければ phar、という判定になった
- もちろん「ふぁーｗｗｗ」とかひとりで言ってたこれ見て

## laruence: Update NEWS
- https://github.com/php/php-src/commit/eb7fca9546b102c9ee1e03be45a7e696dd631177
- ↑ の phar 判定のバグ修正を NEWS へ追記
エンジニアがノートを取るならどんなツール？ 

アナログのノートを使っているだろうか。
自分は、考えをまとめる時には必須のツールだと思っている。


## 道具ひとつでエンジニアリングも変わる

特にアナログツールはデジタルと違って「厚み」のある「存在感の大きなツール」なので、手を抜かずに選び、再考したりしたいところだ。

「なんとなく不都合を感じている」の「なんとなく」を大事にしよう。

- ちょうど良い大きさ
- ちょうど良い携帯性
- ちょうど良い機能
- ちょうど良い快適さ

これらすべてがピッタリとはまって欲しい。

## 選択

今まではノートタイプのミニホワイトボード (Nu Board) を使っていた。

だが結局「自分が使うのは1面だけで、ノート型である必要はない」と気付いた。
そこで1枚もの、プラスチックのミニホワイトボードに変えてみることにした。


## 結果

これが非常に良い！ 快適だ。
ページをめくる必要もないし、プラスチックなので紙よりも古びにくい。いつでもピカピカだ。

ちなみにA3サイズを使っている。

![image](https://user-images.githubusercontent.com/13635059/44237507-aefcf500-a1eb-11e8-9395-68a878f8fedb.png)

現状、僕の場合は「1面型、A3型の、ミニプラスチックホワイトボード」が「はまるツール」だったみたいだ。

## あわせて読みたい

- [エンジニアがホワイトボードにお絵描きする理由 - Qiita](https://qiita.com/YumaInaura/items/cbca9f2e1d5e1b1b127a)

## Links

- [For engineering — analog note is so useful ( I recommend plastic mini white board )](https://gist.github.com/YumaInaura/f513bf7a73d3caa543b37bdcad7fec33)
- [Medium—imported](https://medium.com/supersonic-generation/for-engineering-analog-note-is-so-useful-i-recommend-plastic-mini-white-board-c1de71967fe4)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
dockerのコンテナに固定IPを振る(compose file version 3の注意点)

## docker-composeで固定IPを割り振って起動を試みた


```doncker-compose.yml

version: '3.3'

services:

  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80
    networks:
      app_net:
        ipv4_address: 172.30.0.3
    environment:
      - WORDPRESS_DB_PASSWORD
      - TZ

  mysql:
    image: mariadb-10.3.8:05
    build: .
    restart: always
    networks:
      app_net:
        ipv4_address: 172.30.0.2
    environment:
      - MYSQL_ROOT_PASSWORD=${WORDPRESS_DB_PASSWORD}
      - TZ

networks:
  app_net:
    driver: bridge
    ipam:
     driver: default
     config:
       - subnet: 172.30.0.0/24
         gateway: 172.30.0.1
```

`docker-compose up`したところＥＲＲＯＲが発生

```
$ sudo docker-compose up -d
RROR: The Compose file './docker-compose.yml' is invalid because:
networks.app_net.ipam.config value Additional properties are not allowed ('gateway' was unexpected)
```
## 調査してみると
compose file version3よりgatewayの項目は指定できなくなっているので
コメントアウトして再度`docker-compose up`

```docker-compose.yml
version: '3.3'

services:
--------------------------省略-------------------
networks:
  app_net:
    driver: bridge
    ipam:
     driver: default
     config:
       - subnet: 172.30.0.0/24
#         gateway: 172.30.0.1    <-----コメントアウト
```

```
$ sudo docker-compose up -d
Creating compose_wordpress_wordpress_1 ... done
Creating compose_wordpress_mysql_1     ... done
```
今度はうまくいきました。

## 参考サイト
- [version 1.10.0 error on gateway spec #4366](https://github.com/docker/compose/issues/4366)
- [docker-composeを使ってコンテナからホストマシンへのエイリアスを設定する方法](https://qiita.com/c18t/items/af6996fa2c40360c68cd)
- [dockerのコンテナに固定IPを振る](https://qiita.com/reflet/items/e10442c16834a9ce15b3)
Pythonでソートが使えない場合の最大値からX番目に大きい値までのインデックスの取得方法

## 概要
あまり需要はないと思いますが，Qiitaへの投稿に慣れるために，pythonで上位から任意の順位までの値のインデックスをソートを使わずにリストとして手に入れる方法を実装してみます．もっと効率的な方法があれば使いたい．

## 環境
numpy==1.14.0
Python 3.5.0

## 仮定
- 同じ数が存在しない（もしくは，先頭に近い方を取得すれば良い場合）

## 実装

Aが最大値のインデックスを手に入れたいデータ．TOPが何番目の値までかを示す．

```Python
A = [4,9,1]
TOP = 2
results = []
for num in range(TOP):
    idx = np.argmax(A)
    results.append(idx)
    A[idx] = float('-inf')

print(results)
```

結果はこんな感じ

```
$ # Aの最大値と2番目の最大値のインデックスが手に入る
$ [1, 0]
```

Aがarrayだと次の感じ（各行ごとで計算をしていると仮定しています，列ならばaxisの値を0にすればいいはず）

```Python
A = [[3,2,1],[4,5,6],[7,9,8]]
TOP = 2
results = []
for num in range(TOP):
    idxs = np.argmax(A,axis=1)
    results.append(idxs)
    for row, idx in zip(A, idxs):
        row[idx] = float('-inf')

print(results)
```

結果はこんな感じ

```
$ # 最初のarrayが最大値のインデックス，次のarrayが2番目の値の
$ # インデックスが手に入る
$ [array([0, 2, 1]), array([1, 1, 2])]
```