OmniAICreator/Qiita-1.07M huggingface dataset:
Lerna はまりポイント

最近、Node.js の複合パッケージ向けのコードベース管理ツールである、[lerna](https://lernajs.io/) を使っているので、その備忘録。
随時更新。

## npm install をしてはいけない。

ついやりたくなるが、個別のパッケージディレクトリで引数なしの `npm install` をしてはいけない。かならず `lerna bootstrap` を使う。ちなみにこのコマンドはルートディレクトリでなくても実行できる。

lerna は同じリポジトリ内のパッケージ参照に対してシンボリックリンクを利用して node_modules を形作るため、通常のコマンドを使うとそれが破壊されてしまう。

## コマンドラインツールをルートにインストールしてはいけない

lerna のよいところは共通の開発用のパッケージをルートディレクトリの node_modules にまとめてつっこめることだ（いうまでもないが `devDependencies` にかぎる）。

しかし、コマンドラインツールに対してこれはできない。正確に言うと、npm scripts（prepublish や test）で呼び出したいものはできない。それらは require と異なり、上位のディレクトリの node_modules を参照しないためだ。

よって、gulp などのタスクランナー、webpack などのモジュールバンドラー、babel や typescript などのトランスパイラをルートにインストールすると残念な結果を招く。

`lerna add` で全部にインストールしよう。ちなみに対象のパッケージを限定したい場合は `--scope=<package-name>` オプションをつければいい。

逆にいうと、prettier のように最上位のディレクトリでしか実行しないものや、gulp のプラグイン化されたものは問題なく使える。[^1]

[^1]: むしろエディタ/IDE の機能によってはルートに入れないと動作しないかもしれない。

## npm uninstall 相当がない

そんなはずはないと思うのだが、`lerna add`　はあるのに `lerna remove` がない。**だれか教えてほしい**

いまは package.json から直接該当行を削除して、`lerna clean` を実行している。
２０１８年4月11日講座コマンド

useradd miho ; mkdir -p /home/miho/id ; tail -1 /etc/passwd > /home/miho/id/user.info ; date >> /home/miho/id/user.info ; chmod 444 /home/miho/id/user.info

wget yahoo.co.jp ; wc -l index.html


mkdir -p /tmp/test
cd /tmp/test\
wget yahoo.co.jp
wc -l *


userdel miho
mv /home/miho /home/miho.old
mv /var/mail/miho /var/mail/miho.old
useradd miho

ls -l /var/mail/USER

tar cf document.tar *
tar tvf document.tar
tar xf document.tar

gzip *.txt
qunzip *.gz



useradd sato
tail -1 /etc/passwd > user.info : id sato >> user.info

head -201/var/log/dmesg > log.txt
tail -10 /var/log/dmesg >> log.txt

du -h user.tar.gz

cat /etc/redhat-release
         rpm -ql vi
         
         debian
         dpkg


rpm -qa | grep python
rpm -qa | grep python > gpython ; wc -l gpython
rpm -qa | grep python | wc -l

cat /etc/redhat-release > myOS.info ; rpm -qa | grep python >> myOS.info ;mkdir -p /tmp/info/os ; mv myOS.info /tmp/info/os

cat /etc/redhat-release > myOS.info2 ; rpm -qa | grep python | wc -l >>myOS.info2 ; echo The installed PKG is Kho >> myOS.info2


```
[root@ik1-331-25935 os]# cat /etc/redhat-release > myOS.info2 ; rpm -qa | grep python | wc -l >>myOS.info2 ; echo The installed PKG is Kho >> myOS.info2
[root@ik1-331-25935 os]# cat myOS.info2
CentOS Linux release 7.2.1511 (Core)
27
The installed PKG is Kho
```

cat /etc/redhat-release > myOS.info3 ; echo The installed PKG is Kho >> myOS.info3 ; rpm -qa | grep python | wc -l >> myOS.info3 

rpm -i python-slip-0.4.0-2.el7.noarch > slip.conf


yum upgrade
yum list updates


yum -y install postgresql
yum -y install postgresql-server

yum -y install postgresql-server

yum -y install postgresql
yum list installed | grep postgresql

```
```
echo “listen_addresses = ‘*’” >> /var/lib/pgsql/data/postgresql.conf
echo "# PostgreSQL Client Authentication Configuration File" >  ./pg_hba.conf
echo "# ===================================================" >> ./pg_hba.conf
echo "local all all              trust"                      >> ./pg_hba.conf
echo "host  all all 127.0.0.1/32 trust"                      >> ./pg_hba.conf
echo "host  all all ::1/128      trust"                      >> ./pg_hba.conf

servie postgresql restart
Gitlab-CIのcacheをパイプライン終了後に消す

Gitlab-CIで、jobをまたいでgit管理外のファイルを残したい場合、cacheを定義します。
以下のyamlを例にすると、cacheを定義することで、installジョブで作られたgit管理外のファイルをbuildジョブに引き継げます。具体的には`node_modules`などです。

```yaml
## --- ここから
cache:
  untracked: true
  key: "$CI_COMMIT_REF_NAME"
## --- ここまで

stages:
  - pre-build
  - build

install:
  stage: pre-build
  script:
   - yarn

build:
  stage: build
  script:
    - yarn build
```

ところが、このcacheはCI(pipeline)が完了しても残ります。
今回の場合、cache.keyを`$CI_COMMIT_REF_NAME`しているので、ブランチ毎のcacheが消えずに溜まっていきます。
ディスク使用量が80%を超えたぜアラートに怒られてしまいました。

解決策としてはふたつ。

1. cache.keyを適当なものに変更して、ブランチ毎のキャッシュをやめる
2. pipelineが完了したらcacheを削除するようにする

自分の場合、(1)は難しく[^1]、(2)になりました。
それ用のパラメータがあるかなと[ドキュメント](https://docs.gitlab.com/ce/ci/yaml/#cache)をあさったのですが無いらしい。
なので、自分でcacheを削除するジョブを定義してあげるのが今のところの解決策らしいです。

- [Clearing the pipeline cache with Gitlab CI
](https://stackoverflow.com/questions/48469675/clearing-the-pipeline-cache-with-gitlab-ci/48509094#48509094)
- [Clearing the cache](https://gitlab.com/gitlab-org/gitlab-runner/issues/1016)

うーむ、綺麗ではないけど消せるようにはなりました。
もっとエレガントな方法があれば教えていただきたいです！

```yaml
cache:
  untracked: true
  key: "$CI_COMMIT_REF_NAME"

stages:
  - pre-build
  - build
  - cleanup

install:
  stage: pre-build
  script:
   - yarn

build:
  stage: build
  script:
    - yarn build

## --- ここから
cleanup:
  stage: cleanup
  cache:          # 適当なcache設定をして実行時間を短縮
    key: empty
    policy: pull
  script:
    - rm -rf /home/gitlab/cache/xxx/yyy/${CI_COMMIT_REF_NAME}*
  except:
    - master
```

[^1]: ブランチ名の一部分をkeyにしたかったのですが、できなそうでした。具体的にはfeature/xxxのfeatureだけをkeyにしたいなど！
React で異なる Renderer を混ぜる際にメモリリークを防ぐ

https://github.com/michalochman/react-pixi-fiber を使っていてちょっとハマったのでメモ

react-pixi-fiber のような、ReactDOM以外の異なる reconciler を要求される場合、別マウントで render し直す必要がある。


最初こんな感じのコードを書いた

```js
// import は省略

class PIXIApp extends React.Component {
  componentWillUnmount() {
    // 終了処理
  }
  render() {
    return (
      <Stage
        width={300}
        height={300}
        options={{ backgroundColor: 0x10bb99 }}
       >
         <Text text={Date.now().toString()} x={200} y={200} />
       </Stage>
    )
  }
}

class PIXIAppContainer extends React.PureComponent {
  containerRef = React.createRef()
  componentDidMount() {
    ReactDOM.render(<PIXIApp />, this.containerRef.current)
  }
  render() {
    return <div ref={this.containerRef} />
  }
}
```

(createRef は v16.3.0 からの機能) 
PIXIAppContainer から PIXIApp をマウントする。
よく考えればわかるが、これだと PIXIAppContainer はツリー外なので、 PIXIAppContainer の unmount で PIXIApp の unmount が行われず、マウントし直した回数だけインスタンス分のメモリがリークする。

## 解決策

ちゃんと自分の componentWillUnmount で ReactDOM.unmountComponentAtNode を呼びましょう

```js
class PIXIAppContainer extends React.PureComponent {
  containerRef = React.createRef()
  componentDidMount() {
    ReactDOM.render(<PIXIApp />, this.containerRef.current)
  }

  componentWillUnmount() {
    ReactDOM.unmountComponentAtNode(this.containerRef.current)
  }

  render() {
    return <div ref={this.containerRef} />
  }
}
```

考えてみたら当然なんだけど、書いてる最中は気づかなくてハマった。
PILでtransform

#概要
PILのtransformを理解したかった。

#元画像

![p1m.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/3f2960b9-2c9f-74b3-2b43-623147315b90.jpeg)

#Image.PERSPECTIVE

![a0.png](https://qiita-image-store.s3.amazonaws.com/0/18104/165a6a1f-7d29-b6ba-a340-5a824518ef9c.png)

```
from PIL import Image

img = Image.open("p1m.jpg")
img = img.transform(img.size, Image.PERSPECTIVE, (3.0, 1.7, -500.0, 0, 3.0, 0, 0.000045, 0.007))
img.save("a0.png");

```

#Image.EXTENT

![a1.png](https://qiita-image-store.s3.amazonaws.com/0/18104/d086b176-039c-c561-8033-1cb5a14c97ff.png)

```
from PIL import Image

img = Image.open("p1m.jpg")
img = img.transform(img.size, Image.EXTENT, (10, 0, 135, 100))
img.save("a1.png");
```

#Image.AFFINE

![a2.png](https://qiita-image-store.s3.amazonaws.com/0/18104/64ed2e0a-76f1-c99c-d332-a5231b40eaf0.png)


```
from PIL import Image

img = Image.open("p1m.jpg")
img = img.transform(img.size, Image.AFFINE, (1, 0.1, 0, 0, 1, 0,))
img.save("a2.png");
```

#Image.QUAD

![a3.png](https://qiita-image-store.s3.amazonaws.com/0/18104/7aa6a35f-64c7-7d15-c0d0-b1aa96468bfd.png)


```
from PIL import Image

img = Image.open("p1m.jpg")
img = img.transform(img.size, Image.QUAD, (0, 0, 50, 50, 200, 50, 250, 0))
img.save("a3.png");
```

#Image.MESH

![a4.png](https://qiita-image-store.s3.amazonaws.com/0/18104/8937610d-1539-eb15-29a5-d19d5801f7b4.png)

```
from PIL import Image

img = Image.open("p1m.jpg")
(w, h) = img.size
img = img.transform(img.size, Image.MESH, [((0, 0, w // 2, h // 2), (0, 0, 0, h, w, h, w - 100, 0)), ((w // 2, h // 2, w, h), (0, 0, 0, h, w, h, w - 100, 0))])
img.save("a4.png");
```

以上。
UserControl.TextChanged イベント

#ユーザコントロールへ張り付けたTextBoxのTextChagedイベントをフォームで取得する方法

###Textプロパティの実装

userControl1.Textの値を変えると、UserControlへ張り付けたTextBoxに表示される値が変わるようにしたいと思います。

UserControlクラスには元々Textプロパティがあるのですが、デザイナからは見えなくなっています。また、UserControl自身のTextなので、UserControlへ張り付けたTextBoxやLabelに表示されるTextとは無関係です。

自作のUserControl1クラスでoverrideして、getterとsetterを編集してtextbox1.Textへ直接get/setするようにします。

``` C#
        [Browsable(true)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public override string Text
        {
            set
            {
                textBox1.Text = value;
            }
            get
            {
                return textBox1.Text;
            }
        }
```

ただオーバーライドしただけでは、デザイナのプロパティウィンドウにTextプロパティが表示されていません。
```[Browsable(false)]```を、```[Browsable(true)]```へ変更すると、プロパティウィンドウに表示されるようになります。

さらに、プロパティウィンドウで値を変えれるようになったのですが、実行すると空白のまま起動して、デザイナに戻ると値が消えてしまっています。
```[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]```を、```[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]```へ変更すると、設定した値を保存したまま起動できるようになります。

###TextChagedイベントハンドラの実装

先ほどのプロパティのように```[Browsable(true)]```にしてoverrideすれば良いかと思いましたが、virtual、abstract または override に設定されていないためオーバーライドできません。と怒られてしまいます。
ですので、newキーワードを使用して、同じ名前のイベントハンドラを新たに宣言しました。
このイベントハンドラではadderとremoverを編集して、フォームからuserControl.TextChangedへ渡されてきたメソッドを、そのままtextbox1.TextChangedへ登録しています。

``` C#
        [Browsable(true)]
        public new event EventHandler TextChanged
        {
            add
            {
                textBox1.TextChanged += value;
            }
            remove
            {
                textBox1.TextChanged -= value;
            }
        }
```

これで、デザイナのプロパティウィンドウにTextChangedイベントが表示されていますので、いつものようにダブルクリックするだけで使えるようになります。
Textプロパティの方も、overrideしなくても、newで上書きするのでも別に良い気がします。


###ソースコード全体
``` C#
using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }

        [Bindable(true)]
        [Browsable(true)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public override string Text
        {
            set
            {
                textBox1.Text = value;
            }
            get
            {
                return textBox1.Text;
            }
        }

        [Browsable(true)]
        public new event EventHandler TextChanged
        {
            add
            {
                textBox1.TextChanged += value;
            }
            remove
            {
                textBox1.TextChanged -= value;
            }
        }
    }
}
```
Windows版 Android Studio (Gradle) でビルドディレクトリのドライブを変えるとエラーになる件

[Android_Studio_project_on_network_drive.md](https://gist.github.com/keigoi/d14026db1b5199791caae2782600263e) に書いた話

# Android Studio でネットワークドライブ上にプロジェクトを置く

Android Studio のプロジェクトをネットワークドライブ上に置くことについて [前の記事](https://qiita.com/keigoi/items/3308a9426570540a9573) で書いた。

しかし、このままではビルドディレクトリもネットワークドライブ上に置かれてしまうためビルドがとても重い。

ビルドディレクトリをローカルドライブに変更するとビルド時間が 1/4 で済むので、そのようにした話。

# ビルドディレクトリを変える

``app/build`` 以下に置かれるデフォルトのビルドディレクトリを変更するには、``~/.gradle/init.gradle`` に

```gradle
gradle.projectsLoaded {
    rootProject.allprojects {
        buildDir = "/path/to/build/${rootProject.name}/${project.name}"
    }
}
```

などと書く。

- 参考：
  - https://stackoverflow.com/questions/47135634/migrating-to-gradle-plugin-3-0-aapt2-build-error
  - https://stackoverflow.com/questions/23008485/change-gradle-build-directory-in-android-studio

# ソースと異なるドライブに置くとエラー？

Google の [issue tracker にポスト](https://issuetracker.google.com/issues/68936311) されているが、ビルドディレクトリを別ドライブに変えると ``error: failed to create directory ...`` などとビルドが途中にエラーで止まる。 参考: [Stackoverflow のポスト](https://stackoverflow.com/questions/47135634/migrating-to-gradle-plugin-3-0-aapt2-build-error)

これに対処するには、 ``gradle.properties`` に

```properties
android.enableAapt2=false
```

と書く。ただし 「2018年内でこの設定はできなくなる」旨の警告が出るようになってしまう。また Instant Run でエラーが出るなるので Android Studio の設定で無効化する必要があった。
家族の連絡手段としてのLINE Clova Friends


# はじめに
うちのこども（小学生）が自宅で留守番するとき、親との連絡手段をどうするかを検討していた。
自宅に固定電話はなく、こどもに携帯は持たせてない。ネット回線はある。

LINE Clova Friends（以下、Friends）が3千円台で買えたので、使えるか試してみた。

結論から言うと多少の制約はあるものの、家族間連絡手段として非常に役に立っている。しかも月額無料というのが嬉しい。

以下、制約や運用メモ。
技術的な話はないです。

![image.jpg](https://qiita-image-store.s3.amazonaws.com/0/66591/4b21563e-2042-e71a-eb67-72e52143decc.jpeg)


# 音声やり取り全般

Friendsの呼び名（「OK, Google」的なやつ）は、
* 「クローバ」
* 「ジェシカ」
* 「ねぇ、クローバ」
から選べる。「クローバ」と「ジェシカ」は、テレビの音声や何気ない会話でよく引っかかるため、「ねぇ、クローバ」で運用上落ち着いた。
ただ、3つの呼び名を各数日ずつ試したので、「ねぇ、クローバ」に運用が落ち着いてからも、つい「ジェシカ」と呼んでしまうことがある。当然無反応のため、呼び名はコロコロ変えないほうが良かった。

Google Homeもそうだけど、はっきり喋らないと音声認識できなことが多く、小学生にとっては滑舌よく話す良い機会になっている。

あと、Friendsの話し声は大人の女性なので、かわいいキャラクターの見た目との違和感が半端ない。


# LINEメッセージ

Friendsのセットアップをすると、ファミリーアカウントを作成することができる。Friends自体がアカウントを持つような感じ。
このファミリーアカウントを友だち登録すると、Friendsを通じてその友だちとメッセージのやり取りができる。


_ファミリーアカウント（Friends）<=>ファミリーアカウントの友だち_



登録した友だちに呼び名を付けることで、音声で宛先の友だちを指定できる。

たまに漢字の読みを間違える（今をコンと読むとか）ので、Friendsへのメッセージはひらがなにするのが無難。

Friendsにぼよーん、とか送ると家ではこどもが大笑いしていたので、こどもがぐずったりしたときの気分転換にも使える。

あと通知について。Friendsがメッセージ受信したときに、短い通知音は鳴るが聞き逃しやすい。
その代わり本体下部が光り続ける。結構目立つのでFriendsを目につくところに置くと、メッセージ見逃しにはならない。


# LINE無料通話

メッセージだとできたが無料通話では先ほどのファミリーアカウントからの発信・着信ができない。ファミリーアカウントではなく、既存のLINEアカウントとの連携になる。
Friendsから無料通話できる友だちは、連携したアカウントの友だちから選択して設定する。

_既存アカウント（携帯・Friends）<=>そのアカウントの友だち_

例えば、パパ携帯のアカウントとFriendsを連携させるとする。Friendsにママに電話してと頼むと、ママ携帯側にはパパからの着信と映る。
ママ携帯のLINEからパパに無料通話をかけると、パパ携帯とFriendsの両方で着信音が鳴る。

これはこどもが留守番するときの連絡手段として見た場合の制約になる。今の例で言うとママ宛に無料通話できるけど、パパ宛にはできなくなる。またママ側では、パパからの着信なのかFriendsからの着信なのか区別ができない。

こういう使い方をするのであれば、緊急時に連絡先の優先度が低いアカウントをFriendsと連携させることになる。
うちでは緊急時はママとばぁばに連絡するということで、結局パパのアカウントとFriendsを連携することになった。
また基本はメッセージ利用を優先する運用とした。

# お知らせ

IFTTT等からFriendsにお知らせを送ることができる。
お知らせを受け取ると、メッセージと同じように本体下部が光る。メッセージ利用をよく使っていると、てっきりメッセージの通知かと勘違いする。特にこどもは。
お知らせが来てるのに、Friendsに「メッセージ読んで」と頼むと「メッセージはありません」と返されて終わる。
ああお知らせか、と気付いて改めて聞き返すのは面倒ということになり、お知らせ機能は使わない運用となった。
`ls -l` と `chmod` による謎の数字とアルファベットの意味まとめ

## はじめに

よくLinuxの手順書に `chmod 644 ○○` とか `chmod 755 ××` とか書いてあるのを見て、意味もわからず実行していませんか？
恥ずかしながら私はそうでした。
仕事ではなくプライベートな環境で実行することがほとんどなのであまり気にしていませんでしたが、やはり気になっているので、このあたりで意味をまとめることにします。

## 本記事の目標

以下のコマンドと出力結果の意味がわかるようになる。

```bash
$ ls -l
total 0
drwxr-xr-x 2 {ユーザー名} staff 64  4 12 00:14 bar
-rw-r--r-- 1 {ユーザー名} staff  0  4 12 00:14 foo.txt

$ chmod 666 foo.txt

$ ls -l
total 0
drwxr-xr-x 2 {ユーザー名} staff 64  4 12 00:14 bar
-rw-rw-rw- 1 {ユーザー名} staff  0  4 12 00:14 foo.txt
```

## 環境

- OS：macOS High Sierra 10.13.1

Linuxでなくてすみません。
MacもUNIX系のOSなのでお許しください。

## 「ls -l」とは？

ファイルやフォルダの情報を出力するコマンド。
`-l` オプションを付けることで権限などの詳細な情報も出力されます。

### 出力結果の意味

```bash
# 左から順に、ファイルの種類, 権限, ハードリンク数, 所有者, グループ, サイズ(バイト), タイムスタンプ, ファイル名
$ ls -l
total 0
drwxr-xr-x 2 {ユーザー名} staff 64  4 12 00:14 bar
-rw-r--r-- 1 {ユーザー名} staff  0  4 12 00:14 foo.txt
```

`bar` と `foo.txt` は「staff」グループのユーザーによって4/12 00:14に作成されたことがわかります。

### ファイルの種類

|記号|意味|略|
|:---|:---|:---|
|-|ファイル|-|
|d|フォルダ|directory|
|l|シンボリックリンク|link|

`bar` はフォルダなので `d` , `foo.txt` はファイルなので `-` となっています。

権限の見方については次のセクションで説明します。

## 「chmod」とは？

ファイルやフォルダのアクセス権を変更するコマンド。
「change file modes or Access Control Lists」の略。

### 各記号の意味

記号は `x` `w` `r` の3種類です。
記号があればその権限があり、 `-` ならば権限がないということです。

|記号|意味|略|
|:---|:---|:---|
|x|実行権限|execute|
|w|書き込み権限|write|
|r|読み込み権限|read|

### 数字と記号の対応表

数字は0〜7の8進数であり、記号と以下のように対応しています。
2進数の足し算のように、右から1ずつ足していくのがポイントです。

|数字|記号|
|:---|:---|
|0|---|
|1|--x|
|2|-w-|
|3|-wx|
|4|r--|
|5|r-x|
|6|rw-|
|7|rwx|

__x=1, w=2, r=4__ と覚えるのもいいです。
例えば「6」なら4+2なので「rw-」となります。

### よく使うモード

モードは数字3桁で表します。
左から順に「所有者」「グループ」「その他のユーザー」のアクセス権限を表します。

モードの組み合わせは8の3乗で512通りもあるため、ここではよく使うモードのみ抜粋して紹介します。

|数字|記号|説明|主な用途|
|:---|:---|:---|:---|
|600|rw-------|所有者のみ読み書き可|TBD|
|644|rw-r--r--|所有者のみ書込可、他は読取専用||
|666|rw-rw-rw-|全ユーザーが読み書き可||
|700|rwx------|所有者のみ読み書き実行可||
|755|rwxr-xr-x|所有者のみ書込可、他は読みと実行のみ可||
|777|rwxrwxrwx|全ユーザーが読み書き実行可||

`ls -l` で出力される権限もこの記号と同様の意味です。

## おわりに

最初に紹介したコマンドと出力結果の意味はわかりましたでしょうか？
`foo.txt` には所有者しか書き込み権限がなかったので、 `chmod 666 foo.txt` を実行して全ユーザーにも書き込み権限を付与したということでした。
その結果を `ls -l` で示しています。

これで権限にまつわる謎の数字やアルファベットも怖くありません！

## 参考リンク

- [【 ls 】 ファイルやディレクトリの情報を表示する | 日経 xTECH（クロステック）](http://tech.nikkeibp.co.jp/it/article/COLUMN/20060227/230820/)
- [【 chmod 】 ファイルやディレクトリのアクセス権を変更する | 日経 xTECH（クロステック）](http://tech.nikkeibp.co.jp/it/article/COLUMN/20060227/230728/)
- [Linuxの権限確認と変更（超初心者向け） - Qiita](https://qiita.com/shisama/items/5f4c4fa768642aad9e06)
- [UNIXコマンドは何の略なのか? - Qiita](https://qiita.com/yaginuuu/items/72d77d77ab3608d4f164#chmod)
アジャイルサムライを読んでみて。アジャイルな計画づくり


##第6章 ユーザストーリーを集める
ユーザストーリーは、顧客がソフトウェアで実現したいと思っているフィーチャを簡潔に記述したもの。よく書けているユーザストーリーは「独立している、交渉の余地がある、価値のある、見積もれる、小さい、テストできる」の６要素が含まれている。

###ストーリー収集のワークショップ
 1. 大きくて見通しの良い部屋を用意する
 2. 図をたくさん書く
 3. ユーザーストーリーをたくさん書く
 4. その他もろもろをブレインストーミング
 5. リストを磨き上げる

##第7章 見積もり・当てずっぽうの奥義
見積もりなんて当てずっぽうだ。
 ・ストーリーそれぞれを互いに相対的なサイズで見積もる
 ・ポイントをもとにして進捗を追跡する

###見積もり技法
三角測量
代表的なストーリーをいくつか基準として選出し、残りのストーリーを基準になるストーリーとの相対サイズで見積もる方法

プランニングポーカー
ストーリーを自分自身で見積もる。各人が見積ったら、メンバー同士で見せあってチームで統一した見積もりを出す。

##第8章 アジャイルな計画づくり
アジャイルの計画づくりとはチームの開発速度を計測して、その速度をもとにプロジェクトの完了時期を見通せるようにすることでしかない。

```
イテレーション数＝作業量の合計／チームの予想ベロシティ
```

初回の計画づくり
 1. マスターストーリーリストを作る
 2. プロジェクト規模を見極める
 3. 優先順位をつける
 4. チームのベロシティを見積もる
 5. 期日を仮決めする

###バーンダウンチャートとバーンアップチャート
チームがどのくらいの速度でストーリーを実装しているかを一目でわかるようにした図のこと
　縦軸：残っている作業量
　横軸：時間（イテレーション）

大切なのは手間をかけずに、目に見える形でプロジェクトへの期待をマネジメントできること。
Golangのポインタにあれこれ

どうも, [@nomurakkooo](https://twitter.com/nomurakkooo)です.
今回はGoを触っていてポインタについて少し調べたので書きます.
初心者レベルです. よろしくどうぞ

## ポインタとは
GoとかCとかでよく見る`*`とか`&`.
変数のアドレスを参照して値を取得したり, 更新したりするやつという認識です.
間違えていたら優しく教えてください.

## `*`と`&`ってなに
簡単にいうと`*`は変数に対するアドレスの中身の参照で`&`は変数のアドレスヘのアクセスです.

`&`の方はしっくり来る例えがパッと思い浮かびませんでした.
こんなのあるよとかこっちの方が良くない？とかあったら是非教えてください.

簡単な例を挙げると

```Go:e.g.1
1: package main
2:
3: import "fmt"
4:
5: func main() {
6:     var pointer *string
7:     var name string = "nomurakkooo"
8:
9:     pointer = &name
10:
11:    fmt.Println("&name:　", &name)
12:    fmt.Println("pointer:　", pointer)
13:    fmt.Println("name: ", name)
14:    fmt.Println("*pointer: ", *pointer) 
15: }
```

```:実行結果
&name:  0xc42007e050
pointer:  0xc42007e050
name:  nomurakkooo
*pointer:  nomurakkooo
```

## なぜ使うのか
関数に引数を渡す時, それは全てコピーを渡している.

関数内で引数として渡された値を更新したいときや引数が大きすぎてコピーしたくないなーってときに使おう.

ちなみに, コピーを渡すということは変数を参照するアドレスは変化している.
変化しているからこそ参照元の値が更新されないというわけですね.

## 関数へのポインタ渡しについて
前記の「なぜ使うのか」 というところにもつながる.
引数をポインタで渡すことにより参照元のアドレス, 値の共有を行う.

簡単に渡してみる

```Go:e.g.2
1: package main
2:
3: import "fmt"
4:
5: type Nomurakkooo struct {
6:	 first  string
7:	 last string
8: }
9:
10: func updateName(name *Nomurakkooo) {
11:	 name.first = "nomurakkooo"
12:	 name.last = "rakko"
13:
14:	 fmt.Println("関数内:", name.first, name.last)
15: }
16:
17: func main() {
18:	 fullName := Nomurakkooo{first: "nomura", last: "kouta"}
19:
20:	 fmt.Println("更新前:", fullName)
21:
22:	 updateName(&fullName)
23:
24:	 fmt.Println("更新後:", fullName)
25: }
```

```:実行結果
更新前: {nomura kouta}
関数内: nomurakkooo rakko
更新後: {nomurakkooo rakko}
```

構造体の場合は11, 12行目で`(*name).first`とかじゃなくてええんかって思うのですが`name.first`でも指定できるみたいです.
アドレスへの参照の仕方は`＊`をつけるで統一したほうが良い感は伝わって来るが実際どうなのでしょう.

わかる方いらっしゃいましたら教授いただけると幸いです.

## まとめ
間違えて覚えてしまいそうなところなので気をつけよう!
【CSS】画面にペタッとついてくるやつを作ってみる

## はじめに

まず「ぺたっとついてくるやつ」という日本語は無視してもらって、
今回作りたいのは、こういうやつ↓。

![stiky.gif](https://qiita-image-store.s3.amazonaws.com/0/143803/872e419e-de07-84af-332e-3ce58baf512f.gif)


主にheaderとかsidebarで使われたりしていますよね。
**sticky**〇〇なんて言われています。

JavaScriptで実装されていたり、それらに特化したプラグインなどもあるみたいです。

ですが、今回はCSSの`posision: sticky`を使って **ペタッと**させますー

**※お使いのブラウザによっては正しく表示されない場合があります。**

## 完成品

[headerがペタッと](https://sengokukun.github.io/share_dir/sticky/first.html)

[CVがペタッと](https://sengokukun.github.io/share_dir/sticky/second.html)

[パララックス風](https://sengokukun.github.io/share_dir/sticky/parallax.html)

[おまけ](https://sengokukun.github.io/share_dir/sticky/third.html)

## headerがペタッと

### HTML

```index.html
<header>
  topだよん
</header>
<div class="items">

  <div class="title title_color_red">
    ギ
  </div>

  <div class="item">
    なんかの箱1
  </div>
  <div class="item">
    なんかの箱1
  </div>
  <div class="item">
    なんかの箱1
  </div>
</div>  

...割愛
    
<footer>
  bottomだよん
</footer>
```
### CSS
```style.css
.title {
...割愛
  position: sticky;
  top: 0;
}
```

これでOK！
`top`プロパティで「ペタッ」となる基準を決めています。
※`top`に限らず`left`,`right`,`bottom`でも決めることができます。

## CVがペタッと

### HTML

```index.html
<header>
  topだよん
</header>
    
 ...割愛

<div class="items">
  <div class="item">
    なんかの箱1
  </div>
  <div class="item">
    なんかの箱1
  </div>
  <div class="item">
    なんかの箱1
  </div>
</div>

<div class="contact">
  <a href="#" role="button">申し込もうかなー</a>
</div>  

// 位置が重要！
    
<footer>
  bottomだよん
</footer>
```
### CSS
```style.css
.contact {
...割愛
  position: sticky;
  bottom: 0;
}
```

今度は常時画面下にfixしていて、footer(固定してほしいところ)に来たら「ペタッと」なるもの。
jsなどを使うとやや面倒くさい実装もこれなら楽にできます。
LP制作時などに活躍しそうですね。
ただ注意が必要で、「ペタッと」させたい直前で読み込まないといけません。今回でいうと、footerでペタッとさせたいので、その直前に置いてあげています。

## stickyとfixedの違い
大きな違いは、画面にペタるときの親要素の関係です。
stickyは親に依存してペタるので、fixedのように常にビューポートを基準に固定され続けることはありません。
逆に言うと、stickyは親を設定してあげないと、思ったような挙動にならないかもしれません。

## さいごに
HTML/CSSやjsを学び始めた頃は、どうやって実装して良いのかわからず「header 固定 ついてくる 追尾 js ...etc」とgoogleをさまよっていたのを今だに覚えています。
stickyという「したいこと」のワードにたどりつくのにも一苦労ですよね。
私のようにさまよっている人に届けば幸いです...:rolling_eyes:

今回のソースはこちら↓
[githubから](https://github.com/sengokukun/share_dir/tree/master/sticky)

参考

- [position: stickyの面白い使い方と使用時の注意点](https://parashuto.com/rriver/development/position-sticky)

画像元
- [スキマナース](http://nurse-web.jp/photo/)
エンジニアの英語学習 | Vim + 透過度を上げたiTerm2 で写経する


学習はインプットよりアウトプットが大事だという。
そこで英語学習の一環で、何かの公式ドキュメントを写経してみることを思いついた。
(別に公式ドキュメントじゃなくても良いけど)

どうせ英語を書くのだから、プログラミング関係なら一粒で二度美味しいかもしれないという企み。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/a01e7d56-9c35-d7eb-9f8d-3940805bff02.png)

# メリット (実験中)

- エディタが透過なだけで、写経のやりやすさが10倍違う。もう非透過エディタでの写経は考えられない。
- 何も考えずに手を動かせる。
  - 頭をあまり使わないので、キーボードを打つ準備体操的な感覚。まだ指先の温まっていない朝などにやるのは良いかもしれない。
  - 考えながら写経すればもっと勉強になると思う。
- 英語を打つ練習にもなるし、もしかしたらプログラミングにも役立つかもしれない。
  - たとえば読むだけでハードなドキュメントは、写経をしていると、自分のスピードで落ち着きながら親しめる気がする。
  - 本来は、コードそのものを動かした方がプログラミングの勉強にはなるだろうが、このやり方はそもそも英語学習のおまけだし、準備体操のようなものだから問題ない。
  - 「いつかちゃんと、あの分野の本格的な勉強をしよう」と思いつつ、ただ時間が過ぎて行くよりずっと良い
  - Better than Nothing.

# 非透過への切り替え

`Command + U`

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/b3db8241-a57e-49fd-09a4-1e63b271faa9.png)

# 環境

- iTerm2 3.1.5
- Mac OS X








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
「パラメーター "basePath" を相対パスにすることはできません。」の対処方法

　Visual Studioでデバッグ開始時に上記のエラーが発生する場合の対処方法。
　プロジェクトのプロパティを確認したところ、"作業ディレクトリ" の値が "\$(ProjectDir)" のようにダブルクォーテーションで囲まれている場合に発生する。これを、デフォルトの \$(ProjectDir) に戻したところ発生しない。
mac 起動しない クリーンインストールする前にやること

# 事象
ある朝、macPCを開いても反応がない(画面は黒いまま)。電源ボタンで1度シャットダウンし、起動すると・・・なにやらエラーが・・・

```
Apr 11 04:00:44 localhost opendirectoryd[186]: opendirectoryd (build 483.500) launched - installer mode
Apr 11 04:00:44 localhost opendirectoryd[186]: [default] Failed to open file <private> [2: No such file or directory]
Apr 11 04:00:45 localhost opendirectoryd[186]: [default] Initialize trigger support
Apr 11 04:00:45 localhost opendirectoryd[186]: [default] Failed to open file <private> [2: No such file or directory]
Apr 11 04:00:45 localhost opendirectoryd[186]: [default] Failed to open file <private> [2: No such file or directory]
・
・
・
Apr 11 04:01:45 MacBook-Pro opendirectoryd[186]: [session] ODNodeRelease completed
Apr 11 04:02:17 MacBook-Pro powerd[173]: Assertion Created. Type:UserIsActive Name:'com.apple.iohideventsystem.queue.tickle.4294968282.11' Id:0x900008003 Process:hidd [System: DeclUser kDisp]
```




# やったこと
1. シャットダウン、起動を再度試す。
2. 再起動を試す。
3. NVRAMをリセット  
https://support.apple.com/ja-jp/HT204063  
4. SMCリセット  
https://support.apple.com/ja-jp/HT201295 
5. ハードウェア診断実施  
https://support.apple.com/ja-jp/HT202731  
ここで問題があった時は、Appleに問い合わせが必要な可能性高い。。
6. ディスクの修復  
https://support.apple.com/ja-jp/guide/disk-utility/dskutl1040/mac
7. セーフモードで起動できるか確認  
https://support.apple.com/ja-jp/HT201262  
セーフモードで起動できる場合、Appstoreで未完了のアップグレードを実施して再起動してみる
8. 別のユーザで起きるか確認する  
https://support.apple.com/ja-jp/HT204443  
ユーザに問題があるのかどうかの切り分け
9. 前回正常時の状態に戻す  
https://support.apple.com/ja-jp/HT201250  
Windowsのように気軽にできるのではなく、ちゃんとTime Machineで日頃からバックアップを取得していないとダメ。。。自分は取得してなかった(泣)
10. OSX再インストール(ここ重要)  
https://support.apple.com/ja-jp/HT204904  
これはクリーンインストールとは違い、データを残したままOSを再インストールするもの！
自分はこれでうまくいきました！  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/52335/0002e489-78ae-ad66-54cf-d22532629c3e.png)
11. OSXクリーンインストール(最終手段)  
https://support.apple.com/ja-jp/HT204904  (起動ディスクを消去するの箇所)
データを初期化して再インストール。セーフモードで起動できるならデータバックアップしてからやりましょう。
プログラミングは種類がたくさん、まず出会い　

:dancer_tone2:

  さあ、　あなたはどの電子工作と出会いましたか？　
やはり紹介してくれるところ、教えてくれるところや講座があると、選びますよね。
　私が初めてであったのは、手のひらサイズの　子どもマイパソコンIchigoJamです。
とっても可愛い！！　緑色の基盤に、いろいろなものがついていました。
　Ichigojamを　紹介していきますね。
電子工作は、つなぎ方でも、つかなかったりしますので、とても最初の準備　セッテイングが大事です。（もうここでトラブルがありました。）
　そういう時、どうしましょう？？？　など、
どうしたらいいか、
苦労しましたことを、　そういうことも交えて、　
初心者が　助けてほしいことも書いていけたら、

　お笑いになる話も　　たくさんあるので、　
楽しんでいけるもの、難しくないものを、
初心者が増えるために、初心者の格闘も書いていこうと思います。
Springboot + Kotlin でAPI （仮）

#このページは
SpringbootもKotlinも初心者な自分が、REST APIを作ってみた際の備忘録。
（完全自分用。良い記事は他でたくさんありますので。）
作りながら更新よてい。

#環境
- MacOS
- IntelliJ IDEA 2018.1.1
- JDK10
- Springboot 2.1.0(SNAPSHOT)
    - Grade
- Kotlin
- MySQL
- Jacson(予定)
- MyBatis

基本的に全て最新バージョンで試している。

#環境構築手順
1. IntelliJ IDEA をインストール
2. JDK10 をダウンロード
3. [Spring Initializr](https://start.spring.io) でProjectの作成
4. IntelliJ を起動
5. Import Project をクリック、作成したProjectファイルを選択
6. Gradleを選択して[Next]
![スクリーンショット 2018-04-13 2.27.50.png](https://qiita-image-store.s3.amazonaws.com/0/83953/533f481a-5d99-36f8-82f2-330dc35f7cbf.png)

7. 以下の通り設定し[Finish]
![スクリーンショット 2018-04-13 2.31.42.png](https://qiita-image-store.s3.amazonaws.com/0/83953/c1f34762-c70b-2513-8825-5e920ee40a37.png)
GradleJVMの選択で、ダウンロードしたJDKがプルダウンに出てこない時は、".../jdk-10.jdk/Contents/Home"まで指定して設定。


springbootは後ほど学習予定なので今回はwebサービスでProjectを作成した。ありがたい。
大きな画像を分割して使うのにimageクレートが使えた＆piston_windowで使う編

暇な時、pistonを用いたゲーム制作について少しずつ勉強しています。ただリファレンス読んでも3Dゲームの作り方は微塵も見つからない...

## 閑話休題
今回は2Dゲームの基本?として、いくつかの画像をまとめた大きな画像を読み込み、分割して使用する方法をまとめてみました。
少し前までpiston_windowクレート内部だけですべて完結させようとしていたので進展のなさに諦めかけていましたが、imageクレートを使用することで解決しました。

今回はこちらの一部を使って説明します。変数名が異なっていますのでご注意ください。
https://github.com/glaceef/sub_image

## piston_windowクレートとimageクレートを組み合わせる
find_folderクレートなどで画像へのPathを取得しておきます。

```rust
// image path
let image_path = ...;

// create texture
let topen(&image_path).unwrap();

// create a sub image
let sub_image = SubImage::new(
  &mut texture,
  0, 0, // offset x, y
  100, 100 // width, height
);
let sub_image_buffer = sub_image.to_image();
let new_texture = Texture::from_image(
  &mut window.factory,
  &sub_image_buffer,
  &TextureSettings::new()
).unwrap();
```
画像を表示するには、クロージャ内部の記述にimage()を用います。

```rust
while let Some(e) = window.next() {
  window.draw_2d(&e, |c, g|{
    clear([1.0; 4], g);
    image(&new_texture, c.transform, g)
  });
}
```

###全然関係ないですけど...
[以前の記事](https://qiita.com/glaceef/items/1bc5377d3b5334bf95ad)でも少し触れたのですが、piston_windowのループでは描画するときとしないときがあって、滑らかに描画されない(ガクガクしてる)のですが何か解決策を知っている方はいらっしゃいませんか...？
【Raspberry Pi 3 Model B】男ひとり酒を飲みながらラズパイと会話したい（第４回）

##概要
docomoのAPIや、Open JTalk等を組み合わせれば、ラズパイと会話ができそうなので作ってみました。
第４回は今までのを組み合わせた音声での会話です。

##参考にしたサイト

- [とりあえずdocomo雑談対話APIを使ってみる](https://qiita.com/ponkio-o/items/df0d64677dcb4b7e8eb3)
- [Raspberry pi で音声会話をする](https://qiita.com/what_is_your_name/items/ecf9488039eb93babf5e)
- [簡単にできる！音声認識と音声合成を使ってRaspberrypiと会話](https://qiita.com/kinpira/items/75513eaab6eed19da9a3)

##前提条件

- モデル : Raspberry Pi 3 Model B
- OS : Raspbian Stretch
- マイク（USB）
- スピーカー（アナログ）

```Bash:
$ uname -a
Linux raspberrypi 4.14.30-v7+ #1102 SMP Mon Mar 26 16:45:49 BST 2018 armv7l GNU/Linux
```

##音声会話
第１回から第３回の組み合わせで、新しいことはしてないつもりなので、いきなりスクリプトです。

```Bash:
$ vi pitalk.py
```

```Python:pitalk.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import requests
import json
import subprocess

APIKEY = '入手したAPIKEY'
url1 = "https://api.apigw.smt.docomo.ne.jp/amiVoice/v1/recognize?APIKEY={}".format(APIKEY)
url2 = "https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY={}".format(APIKEY)

#1回目の会話（context取得のため空実行）
payload = {'utt' : '', 'context': ''}
headers = {'Content-type': 'application/json'}
r = requests.post(url2, data=json.dumps(payload), headers=headers)
context = r.json()['context']

#2回目以降の会話(Ctrl+Zで終了)
while True:
    # 録音
    cmd = [
        'arecord',
        '-D','plughw:0,0',
        '-d','3',
        '-r','16000',
        '-f','S16_LE',
        '/tmp/tmp1.wav'
        ]
    subprocess.call(cmd)
    # 音声認識
    files = {"a": open('/tmp/tmp1.wav', 'rb'), "v":"on"}
    r = requests.post(url1, files=files)
    print r.json()['text']
    # 雑談対話
    payload['utt'] = r.json()['text']
    payload['context'] = context
    payload['t'] = '20'
    r = requests.post(url2, data=json.dumps(payload), headers=headers)
    response = r.json()['utt']
    print "response: %s" %(response)
    # 音声合成
    f = open('/tmp/tmp2.txt', 'w')
    f.write(response.encode('utf-8'))
    f.flush()
    f.close()     
    cmd = [
        'open_jtalk',
        '-m','/usr/share/hts-voice/mei/mei_normal.htsvoice',
        '-x','/var/lib/mecab/dic/open-jtalk/naist-jdic',
        '-ow','/tmp/tmp2.wav','/tmp/tmp2.txt'
        ]
    subprocess.call(cmd)
    cmd = [
        'aplay','/tmp/tmp2.wav'
        ]
    subprocess.call(cmd)
```

```Bash:実行
$ python pitalk.py
```
音声で会話ができれば成功です！！
エンドレスで続きます。。。

##まとめ
現状だと、こちらが発言するタイミングが分かりにくいので、BEEP音的なものがあるといいですね。
あとは、Bluetoothリモートシャッターを押すと起動して（[参考](https://qiita.com/sunaga70/items/89e2d1eecfd73d3fef21)）、特定の言葉で終了できるようにすれば、実用的かと思います。
気が向いたら番外編でアップデートします。。。

##記事

[【Raspberry Pi 3 Model B】男ひとり酒を飲みながらラズパイと会話したい（第１回）]
(https://qiita.com/sunaga70/items/acbfa107ae9221529115)
[【Raspberry Pi 3 Model B】男ひとり酒を飲みながらラズパイと会話したい（第２回）]
(https://qiita.com/sunaga70/items/aed3da33fb6ba453c422)
[【Raspberry Pi 3 Model B】男ひとり酒を飲みながらラズパイと会話したい（第３回）]
(https://qiita.com/sunaga70/items/f83dac93ac2b9ef217dd)
[【Raspberry Pi 3 Model B】男ひとり酒を飲みながらラズパイと会話したい（第４回）]
(https://qiita.com/sunaga70/items/f636edc396a7b5100a7a)
jscolor Color Picker で色選択時にAndroid クロームでは画面がスクロールしてしまう問題に対処する

カラーピッカーの一つに [jscolor Color Picker](http://jscolor.com/) というものがあります。
結構デザインが良くて使いたいと思うのですが、現行バージョン(2.0.4)だと、Android のChrome ブラウザでは色選択中に画面がスクロールしてしまう問題があります。

今回はそのバグを修正する方法です。

なお、説明は jscolor v2.0.4 のものです


jscolor.js の112行目から始まる以下の関数を修正します。

```js
attachEvent : function (el, evnt, func) {
	if (el.addEventListener) {
		el.addEventListener(evnt, func, false );
	} else if (el.attachEvent) {
		el.attachEvent('on' + evnt, func);
	}
},
```

上記の関数を以下のように変更します

```js
attachEvent : function (el, evnt, func) {
	if (el.addEventListener) {
		el.addEventListener(evnt, func, { passive: false } );
	} else if (el.attachEvent) {
		el.attachEvent('on' + evnt, func);
	}
},
```

addEventListener を呼び出すときにオプションとして `` { passive: false } ``を渡してあげることで、jscolor Color Picker で呼び出される ``preventdefault()``関数が有効に働くようになります。

開発元にプルリクでも送ろうと思ったのですが、開発元のGithub リポジトリがどれなのか判別つかなかったので、とりあえずここに解決方法を記述しておきます
さくらvpsの初期設定をコマンド1つで完成させる

# 概要

現在さくらVPS借りていろいろ作業しているけど、環境が汚くなるとたびたびOSの再インストールしていた。
そのたびにユーザ作成してSSH設定してsudoers設定してとメモ帳を開きながら何回もやって疲れてきた。

もう自動化したいと思って対応した時のメモ書き。

[【さくらのVPS】サーバの初期設定ガイド](
https://help.sakura.ad.jp/hc/ja/articles/206208181--%E3%81%95%E3%81%8F%E3%82%89%E3%81%AEVPS-%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E5%88%9D%E6%9C%9F%E8%A8%AD%E5%AE%9A%E3%82%AC%E3%82%A4%E3%83%89)
→　Step２の２～４ + sudoersの設定まで実施してくれるイメージ

# 環境

* CentOS 7（Gitは初期で入っているはず）

# 入力するコマンドはこれだけ

```sh
git clone https://github.com/haruto167/ansible-init.git && sh ./ansible-init/startup.sh {username} {password}
```

※　{username} {password}は、ログインするときの新しいユーザ名とSSHのパスワードを入力する

# おしまい！サーバセットアップ完了。鍵のダウンロード忘れずに！

ディレクトリ/home/{username}/.sshに鍵(id_rsa)が作成される → **重要：Shell実行後、ダウンロードしておく**

# 何をしたの？

上の処理はGitHubからダウンロードしてShellをたたいている。
Shellは具体的には以下のことをしている。
１．Ansibleのダウンロード
２．Playbookを使ってymlで定義したタスクを実行

```yaml:init.yml

- hosts: localhost
# 変数を用意
  vars: 
# 作成するユーザ名を指定する
    user_name: user  
# パスワード指定
    password: superpass 

  tasks:
# ユーザ追加
    - name: add user.
      user: 
        name: "{{user_name}}"
        createhome: yes
        password: "{{ password | password_hash('sha512') }}"
        update_password: on_create
# ユーザ作成と共に鍵を作成
        generate_ssh_key: yes 
      become: yes
# sshディレクトリ作成
    - name: make .ssh directory
      file:
        path: /home/{{user_name}}/.ssh
        state: directory
        owner: "{{user_name}}"
        group: "{{user_name}}"
        mode:  0700

    - name: copy ssh key
      copy:
        src: /home/{{user_name}}/.ssh/id_rsa.pub
        dest: /home/{{user_name}}/.ssh/authorized_keys
        owner: "{{user_name}}"
        group: "{{user_name}}"
        mode: 0600

    - name: add sudoers.
      lineinfile:
# sudoersを書き換える前にバックアップも作成しておく
        backup: yes 
        path: /etc/sudoers
        state: present
        regexp: "^%{{user_name}} ALL="
        line: "%{{user_name}} ALL=(ALL) NOPASSWD: ALL"
        validate: '/usr/sbin/visudo -cf %s'

    - name: sshd conf1
      lineinfile:
         backup: yes
         path:  /etc/ssh/sshd_config
         regexp: '^\#Port 22'
         line: 'Port 22'
         backrefs: yes

    - name: sshd conf2
      lineinfile:
        path:  /etc/ssh/sshd_config
        regexp: '^\#PermitRootLogin yes'
        line: 'PermitRootLogin no'
        backrefs: yes

    - name: sshd conf3
      lineinfile:
        path:  /etc/ssh/sshd_config
        regexp: '^PasswordAuthentication yes'
        line: 'PasswordAuthentication no'
        backrefs: yes

    - name: restart service sshd
      systemd:
        name: sshd
        state: restarted
```

# 検討したこと

今までのコマンドをシェルに全部書き込んでして流そうかと思ったが、
せっかくなのでインフラ側のツールの勉強も兼ね今回は**Ansible(構成管理ツール)**を使ってみる

# 参考サイト

http://machida0902.hatenablog.com/entry/2018/01/19/220941
【No.2】 ｻｸﾗｴﾃﾞｨﾀでRubyの設定をしてみた(=ﾟωﾟ)b

#【スクリーン】設定ですよ
:star:赤で囲まれた部分をまず設定します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/248438/ce823e3f-1c72-5183-ca1b-dac57896d2a0.png" width=50%>
:sparkles:ここで私的に慎重にポイント(;´･ω･)
先ほど設置した「ルールファイル」の「(1)…」を押下するんですよ。
そして、**「【No.1】 ｻｸﾗｴﾃﾞｨﾀでRubyの設定をしてみた(=ﾟωﾟ)b」の「【確認】設定の前に」**で行った「C:\Program Files (x86)\sakura\keyword」の中にある「Ruby.rule」を選択ですよ。
「(1)…」の隣の四角に「C:\Program Files (x86)\sakura\keyword\Ruby.rule」なっているのを確認！！
<img src="https://qiita-image-store.s3.amazonaws.com/0/248438/fc8cc444-2aa8-270c-3b46-0d39f40395c2.png" width=50%>
大丈夫なら、次へいこう(´ω｀*)))

#【ウィンドウ】設定しますよー
:star:赤で囲まれた部分を設定します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/248438/42b62486-b70d-3254-fd8b-823794698919.png" width=50%>
ここは楽勝だね　三＝(/・ω・)/

#【支援】設定しまっす
:sparkles:ここで私的に慎重にポイント(;´･ω･)
「単語ファイル」の「(1)…」を押下っす。
そして、**「【No.1】 ｻｸﾗｴﾃﾞｨﾀでRubyの設定をしてみた(=ﾟωﾟ)b」の「【確認】設定の前に」**で行った「C:\Program Files (x86)\sakura\keyword」の中にある「Ruby.hkn」を選択しまっす。
「(1)…」の隣の四角に「C:\Program Files (x86)\sakura\keyword\Ruby.hkn」なっているのを確認っす！！
<img src="https://qiita-image-store.s3.amazonaws.com/0/248438/d6287df9-831d-182d-6e47-501d50f71dbc.png" width=50%>
はい、OKっす('Д')ノ
【No.1】 ｻｸﾗｴﾃﾞｨﾀでRubyの設定をしてみた(=ﾟωﾟ)b

#【はじめに】サクラエディタをダウンロードだね
HP : http://sakura-editor.sourceforge.net/index.html
ダウンロード : http://sakura-editor.sourceforge.net/download.html
2018年4月12日(木)では
最新版 **sakura_install2-2-0-1.exe (2.2.0.1)**

ちゃんとダウンロード出来たかな？わからなかったらググって…
多分、「はい」「次へ」「インストール」「完了」の順だったかな (´ω｀*)。○ 〇

#【確認】設定の前に
Ruby用の設定ファイルは「サクラエディタのインストールフォルダ」にありますか？
設定変えずにダウンロードしたらたぶん「C:\Program Files (x86)\sakura\keyword」です(*‘ω‘ *)
「keyword」の中にRubyたちがいるのを確認！！
<img src="https://qiita-image-store.s3.amazonaws.com/0/248438/a64adc91-5afc-3528-8a30-0a8746bae07e.png" width=50%>
確認が済みましたら、いよいよ設定にはいりまっせ(∩'∀')∩

#【START】Rubyの設定に入ります
:star:「設定」→「タイプ別設定一覧」と押下します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/248438/d71f1d7a-aac6-4430-f553-b2368802c8c1.png" width=50%>
:star:押下した後に、下記の画像のようにあらわれ、「追加」を押下します。
　追加されると、「設定18」が出力されます。
※前もってテストを行ったので私の場合は「Ruby(rb)」が入っています。
<img src="https://qiita-image-store.s3.amazonaws.com/0/248438/b32e3a3a-c44b-3f83-53dc-bcb44d39ea34.png" width=50%>
:star:「設定18」を選択し、「設定変更」を押下します。
次の設定へ(-ω-)/
UnityのTransform.positionの各値(x,y,z)を直接変更できない理由

Unityを始めた初心者がなぜこれが出来ないのかというのを疑問に思うのでほんの少しでも手助けになれば。

## 前提
positoinを表すVector3はstructです。
struct同士を代入、引数としてメソッドに渡す場合はclassと違い、参照渡しではなく値渡しとなります。

## Unityのコードを見てみよう
Unityの一部のコードがGitHubで公開されているので見てみましょう
https://github.com/Unity-Technologies/UnityCsReference

## 残念ながらTransform自体のコードの殆どは公開されていない
見てみようと言いながらそのコードの殆どは公開されていません。コアの殆どをC/C++で書かれているか、単純に公開していないかのどちらかです。ただし、幸いにもTransformへのアクセス箇所は見ることができるのでその処理を見ることができます。

## TransformBinding.gen.cs
`gen` てことは何らかのツールなどを用いて自動生成されている！(ここはどうでも良い)
では、そのコードを見てみましょう。

```cs
public Vector3 position
{
    get { Vector3 tmp; INTERNAL_get_position(out tmp); return tmp;  }
    set { INTERNAL_set_position(ref value); }
}
```
こうなっています。
この時点で値渡し、参照渡しということが理解できている人は気づくのではないでしょうか。
(ごめんなさい、これがわからないという人向けにまで説明する余力がありません...)

こうなっていなくても、getterが宣言された時点で、structの各メンバへの代入は意味をなしません。
そのためコンパイル時点でエラーとして弾かれます。

例えば、こうするとより簡潔になるかもしれないです。

```cs
private Vector3 m_position;
public Vector3 position { get { return m_position; } set { m_position = value; } }
```
こうなると、positionにアクセスした時点で、structのコピーが行われ、
m_positionとは全く別の実体が生成されます。
そのため、`Transform.position.x = 1` とやっても、大本の`m_position`には **何の影響もないんです**
宣言を、`public Vector3 position { get; }` とだけ書いても↑と同じです。

( `public Vector3 position;`　とだけ書いた場合は構造体の各メンバも編集できます ) 

## なぜこうなっているのか
理由は、大本のコードのとおりに隠蔽された箇所にアクセスする必要があるので、こうせざるを得なかったのだと思います。
ただし、昨今のECS/JobSystemで見る通り、Unityはstructの負荷の軽さを有効活用していこうというのがよくわかります。
(struct自体はclassに比べて高速、且つ、GCの世話にならない場合が多いなど)
本当の理由は開発者に聞かないとわかりませんが、色々なことを考慮した上でこうなっているのではないでしょうか。
SharePointのページタイトルを変更する

## タイトルを変更する。
SharePointのページの例えば、ホームであれば「ホーム」がデフォルトで表示されます。
少し調べて分からなかったので一旦諦めましたが、本気で調べたらすぐわかりました。

こんな感じ。
<img width="230" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/245365/5428f96a-9e2f-7f88-c1e7-814dc227a4c7.png">

これを変えるには、左メニューの「ページ」をクリックしてページの一覧を表示します。
変更したいページを選択状態にします。
<img width="396" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/245365/2910bd95-f135-d257-5ce5-18fd8f632e8c.png">

この状態で右側の↓をクリックします。
<img width="74" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/245365/c6266818-6383-a2c2-a7a8-43360fdf4013.png">

そうすると右側にページのプロパティが表示されます。そこの「すべて編集」リンクをクリックします。
<img width="319" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/245365/706d4fde-7273-6c02-1083-290cb46eba06.png">

こんな感じになるので、あとは適当に変更します。
<img width="642" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/245365/adf5dbfd-03af-6d98-f5b8-b80e35bab567.png">

こんな感じで変わります。
<img width="199" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/245365/96324be4-9e61-47fe-36f1-c583941bdda0.png">
「PyTorchで学ぶニューラルネットワークと深層学習」サンプルコード集

[PyTorchで学ぶニューラルネットワークと深層学習](https://www.amazon.co.jp/PyTorch%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%A8%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92-%E6%9D%9C-%E4%B8%96%E6%A9%8B-ebook/dp/B078WK5CPK/ref=sr_1_1?ie=UTF8&qid=1523460359&sr=8-1&keywords=pytorch)のサンプルコードがなかったので作りました。

学習用データを用意するためのシェルも用意してあります。レポジトリは[こちら](https://github.com/KentFujii/pytorch_dl)。

- PyTorchの基本
    - [Tensor](https://github.com/KentFujii/pytorch_dl/blob/master/basic/tensor.ipynb)
    - [Variableと自動微分](https://github.com/KentFujii/pytorch_dl/blob/master/basic/variable.ipynb)
- 最尤推定と線形モデル
    - [線形回帰モデル](https://github.com/KentFujii/pytorch_dl/blob/master/estimation/linear.ipynb)
    - [ロジスティック回帰](https://github.com/KentFujii/pytorch_dl/blob/master/estimation/logistic.ipynb)
- 多層パーセプトロン
    - [MLPの構築と学習](https://github.com/KentFujii/pytorch_dl/blob/master/multilayer_perceptron/mlp.ipynb)
    - [DatasetとDataLoader](https://github.com/KentFujii/pytorch_dl/blob/master/multilayer_perceptron/dataset_dataloader.ipynb)
    - [学習効率化のTips](https://github.com/KentFujii/pytorch_dl/blob/master/multilayer_perceptron/tips.ipynb)
    - [ネットワークのモジュール化](https://github.com/KentFujii/pytorch_dl/blob/master/multilayer_perceptron/modularization.ipynb)
- 画像処理と畳込みニューラルネット
    - [CNNによる画像分類](https://github.com/KentFujii/pytorch_dl/blob/master/cv/cnn.ipynb)
    - [転移学習](https://github.com/KentFujii/pytorch_dl/blob/master/cv/transfer.ipynb)
    - [CNN回帰モデルによる画像の高解像度化](https://github.com/KentFujii/pytorch_dl/blob/master/cv/cnn_regression.ipynb)
    - [DCGANによる画像生成](https://github.com/KentFujii/pytorch_dl/blob/master/cv/dcgan.ipynb)
- 自然言語処理と回帰型ニューラルネット
    - [テキストデータの数値化](https://github.com/KentFujii/pytorch_dl/blob/master/nlp/embedding.ipynb)
    - [RNNと文章のクラス分類](https://github.com/KentFujii/pytorch_dl/blob/master/nlp/classify_text.ipynb)
    - [RNNによる文章生成](https://github.com/KentFujii/pytorch_dl/blob/master/nlp/gen_text.ipynb)
    - [Encoder-Decoderモデルによる機械翻訳](https://github.com/KentFujii/pytorch_dl/blob/master/nlp/translate.ipynb)
- 推薦システムと行列分解
    - [行列因子分解](https://github.com/KentFujii/pytorch_dl/blob/master/mf/mf_basic.ipynb)
    - [ニューラル行列因子分解](https://github.com/KentFujii/pytorch_dl/blob/master/mf/mf_neural_net.ipynb)
良いパワーポイントtips（プレゼン用スライド編）

パワーポイント資料は慣れてしまえば簡単に作れますが、かっこいいもの、センスの良いものはほとんど見たことがないように感じます。
そこで、以下を全て満たしていれば自ずと良いものができるようにまとめました。
※ プレゼンする対象が良いものであることが前提条件です。

## __1. 文字のポイントは18以上であるか__
できることなら__20ポイント__が良いとのこと。
小さい文字は見づらい。また、ポイントが大きければスライドが文字で埋め尽くされることもないでしょう。

## __2. フォントはゴシック体であるか__
明朝体やセリフ体のハネや文字の端の飾りをセリフという。
これがあると格式高い印象を与えるが、スライドでは古臭さを感じさせる。

## __3. フォントの種類が統一されており、フォントサイズが2種類以内であるか__
フォント種類が統一されていない、あるいは３つ以上の異なるサイズのフォントが存在するデザインは
そうではないデザインに比べ、感情関与が大きく阻害されるとの研究結果が出ています。

## __4. スライドのタイトルはメッセージであるか__
1枚のスライドには１番主張したいメッセージ1つを設定してそれをタイトルにするという原則があります。
解釈を相手に委ねるようなタイトルにするのではなく相手の解釈をこちらでコントロールする必要があります。
グラフや図のタイトルではなく、主張したいメッセージであるかどうかです。

## __5. 無駄なオブジェクトは存在していないか__
ロゴはメッセージの理解を助けないので不要です。
同じ理由で不要なオブジェクトがたくさんあるはず。
すき間がさびしく感じても無理やり埋めないように

## __6. スライドの配色は正しく設定したか__
デザイナーでない人が資格効果の高い配色を設定することは困難です。
会社の配色ガイドなどがない場合は__[Adobe Color CC](https://color.adobe.com/ja/create/color-wheel/)__で配色パターンを決定する。

## __7. オブジェクトは1mmもずれていないか__
見てる側からすれば、少しでもずれているなと感じたその時からそのスライドはアマチュアのものになってしまいます。

### 補足
抽象的で分かりづらいものもありますが、フォントサイズやのフォントの種類の統一、オブジェクトのずれなどをなくすだけでも、随分変わると思います。
命名一覧

## 概要

実際に使えそうなテーブル名、カラム名を記録していきます。
ほぼ自分用のメモ

随時更新予定です。

##　一覧



|用途|論理名|物理名|型|備考|
|:--|:--|--:|:--:|:--:|
|テーブル名|ユーザー|users|||
|カラム名|ユーザー名|screen_name|varchar||
|カラム名|姓|last_name|varchar||
|カラム名|名|first_name|varchar||
|カラム名|セイ|last_name_kana|varchar||
|カラム名|メイ|first_name_kana|varchar||
|カラム名|電話番号|phone_number|varchar||
|カラム名|電話番号認証|is_phone_number_authenticated|boolean||
|カラム名|メールアドレス|email|varchar||
|カラム名|メールアドレス認証|is_email_authenticated|boolean||
|カラム名|パスワード|password|varchar||
|カラム名|トークン|token|varchar||
|カラム名|性別|gender_id|tinyint|定数で定義 'GENDERS' => ['1' => '男性', '2' => '女性', '3' => 'その他']|
|カラム名|血液型|blood_type_id|tinyint|定数で定義 'BLOOD_TYPES' => ['1' => 'A', '2' => 'B', '3' => 'O']|
|カラム名|誕生日|birthday|date||
|カラム名|国|country_id|int|定数で定義 'COUNTRIES' => ['1' => 'アメリカ', '2' => '日本']|
|カラム名|住所（郵便番号）|postcode|varchar||
|カラム名|住所（都道府県）|prefecture_id|int||
|カラム名|住所（市区町村）|city|varchar||
|カラム名|住所（番地）|block|varchar||
|カラム名|住所（建物名・部屋番号）|building|varchar||
|カラム名|自己紹介|biography|varchar||
|カラム名|プロフィール画像|avatar_image_id|int||
|カラム名|ヘッダー画像|background_image_id|int||
|カラム名|状態|status_id|tinyint||
|カラム名|登録日時|signup_at|datetime||
|カラム名|最終ログイン日時|last_login_at|datetime||
|カラム名|作成日時|created_at|datetime||
|カラム名|更新日時|updated_at|datetime||
|カラム名|削除日時|deleted_at|datetime||
|テーブル名|管理者|admins|||
|カラム名|名前|name|varchar||
|カラム名|役割|role_id|tinyint||
|テーブル名|アクセス履歴|access_histories|||
|カラム名|ユーザー|user_id|int||
|カラム名|アクセス日時|access_at|datetime||
|カラム名|アクセス元IPアドレス|access_ip|varchar||
|カラム名|ユーザーエージェント|useragent_id|tinyint||
|テーブル名|企業, 会社|companies|||
|テーブル名|商品|products|||
|テーブル名|あしあと|footprints|||
|カラム名|価格|price|||
|テーブル名|友達|friends|||
|テーブル名|フォロー|follows|||
|カラム名|フォローしているユーザー|from_user_id|||
|カラム名|フォローされているユーザー|to_user_id|||
|テーブル名|いいね|likes|||
|テーブル名|お気に入り|favorites|||
|テーブル名|ブロック|blocks|||
|テーブル名|ミュート|mutes|||
|テーブル名|メッセージ|messages|||
|テーブル名|メッセージスレッド|message_threads|||
|テーブル名|メッセージスレッドユーザー|message_thread_user||メッセージスレッドとユーザーの中間テーブル|
|テーブル名|イベント|events|||
|テーブル名|イベント|event_user||イベントとユーザーの中間テーブル|
|テーブル名|コミュニティ|communities|||
|テーブル名|職業|jobs|||
|テーブル名|画像|images|||
|テーブル名|タグ|tags|||
|テーブル名|記事|articles|||
|カラム名|表題|title|||
|カラム名|本文|text|||
|カラム名|コメント|comments|||
|カラム名|公開状態|public_status_id|tinyint||
|カラム名|公開日時|published_at|datetime||
|テーブル名|ツイート|tweets|||
|テーブル名|ポイント|points|||
|テーブル名|お問い合わせ|contacts|||
|テーブル名|ソーシャルプロフィール|social_profiles||OAuthで取得したユーザーの情報を持つusersの子テーブル|
|カラム名|プロバイダー|provider|varchar||
|カラム名|プロバイダーユーザーID|uid|varchar||
|カラム名|取得情報|raw_info|text|JSON形式|
|カラム名|認証情報|credentials|text|JSON形式|
素人が zsh の仕組みを学びながら良く行くディレクトリに行けるようにしてみる

# はじめに
まず、zsh には cdr や z などの有名な拡張があります。ちゃんと設計されたものを使いたければそっちを使って下さい。でも、素人が何がやってみたいと思ったら、既存のものがあるかどうか気にせずにやってみたらよいと思います。別にこれで仕事をしてるわけでもない素人は車輪の再発明なんて気にする必要はありません。同じ物でも劣化品でも何でも作って学びましょう。hello.c なんて、いったいこれまでに何度書かれてきたことか。だいたい私、hello.c をそらで書けませんし。

# zsh が cd したときに自動実行するのは何?
``function chpwd()`` が実行されます。

```zsh
function chpwd() {
  echo "ふざけてんの？"
}
```
としておけば、
```zsh
% cd
ふざけてんの？
% cd
ふざけてんの？
% cd
ふざけてんの？
% cd
ふざけてんの？
```
となります。


# どうやってディレクトリの頻度を保存しよう


テキストに書きこんでも良いのですが、ここは素直に sqlite を使いましょう。いえ、私が使ってみたかったんです。sqlite の DB にパスと回数を記録することにします。では早速 DB を作りましょう。普通のプロダクトなら初回起動時に自動生成するもんですが、自分プロダクトです。気にせずにいきましょう。

```zsh
sqlite3 $HOME/.cache/.dirstack.db "create table dirstack(path text, freq integer)"
```

で DB へ書き込むスクリプトは

```zsh:~/.local/bin/OreDirStack
#!/bin/zsh
DIRSTACK_DB=$HOME/.cache/.dirstack.db

# カレントディレクトリの回数を調べます。なければ失敗して count は空です。
count=$(sqlite3 $DIRSTACK_DB "select freq from dirstack where path=\"$PWD\" ")

# count が空なら現ディレクトリ、1 回を登録
if [ -z $count ]; then
  sqlite3 $DIRSTACK_DB "insert into dirstack values(\"$PWD\",1)"
else
# そうじゃなかったら、1 足して登録
  count=$(( $count + 1 ))
  sqlite3 $DIRSTACK_DB "update dirstack set freq=$count where path=\"$PWD\" "
fi

# Validation
# sqlite3 $DIRSTACK_DB "select * from dirstack order by freq DESC"

return
```

# その DB を使って移動しよう
ここは当然 peco でしょう。頻度の高い順に並べたクエリ結果を peco に流しこんで使います。難しい zle 関数とか書けなくても zsh の global alias で次のようにすれば ``cd :df`` で頻度の高いディレクトリにあっという間に移動できます。

```zsh
alias -g :df='$(sqlite3 ~/.cache/.dirstack.db "select path from dirstack order by freq desc"| peco)'
```

[![asciicast](https://asciinema.org/a/JmMQSAzOZ4PfiSEbXGrkMI31q.png)](https://asciinema.org/a/JmMQSAzOZ4PfiSEbXGrkMI31q)
[javascript][svg] SVGを扱うjsライブラリRaphael.jsとSnap.svgの比較



両者は **兄弟** であり、
両者とも **[Dmitry Baranovskiy氏](https://github.com/DmitryBaranovskiy)** が作成したもので、
**Snap.svg**の方が後発だ。

順当にいけば Snap.svgを使うのが良さそうだが、
Githubにある[Snap.svgのレポジトリ](https://github.com/adobe-webplatform/Snap.svg)を見ると、 **１年以上更新されてない**のが心配。
しかも **ビルド失敗** になっているよう。

それに対して、[raphael](https://github.com/DmitryBaranovskiy/raphael)の方は頻繁に更新されているよう。


http://dmitrybaranovskiy.github.io/raphael/

# 両者の比較


| 比較項目 | Raphaël.js | Snap.svg |
|--------|--------|--------|
| リリース   |  2009年12月      |  2013年 10月      |
| 最新バージョン  |  v2.2.7 (github)      |  v0.5.1 (github)      |
|  更新頻度	|  定期的に更新されている	 |  2017年2月から更新なし |
| ブラウザサポート | IE6.0+, Firefox3.0+, Safari3.0+, Chrome5.0+, Opera9.5+ |  IE9.0+, 最新のブラウザ |
| 特徴 |レガシーブラウザをサポートしている（VMLが使える） | SVG仕様（マスキングやクリッピング、グラデーションなど）がフルで使える|


注：２０１８年０３月１１日時点

# 結論

現時点（２０１８年０３月１１日）は、
[raphael](https://github.com/DmitryBaranovskiy/raphael)の方
を使った方が良いだろう。


# 参考

使い方を詳しくまとめてくれているサイト。

http://defghi1977.html.xdomain.jp/tech/snapsvg/snapsvg.xhtml#section_26
https://kuroeveryday.blogspot.jp/2016/12/raphaeljs-vs-snapsvg.html
Riot.jsでif={v}入れてeachすると自動的にFilterされる

# 始めに
最初に、下記のようなロジックを組んで実行したところ結果がおかしかった

``` html:tag
<test>
  <div each={v,i in test} if={v}>index:{i},val:{v}</div>
  <script>
    var self     = this;
    self.test    = [1,0,1,1];
  </script>
</test>
```

## 想定していた出力

``` txt
index:0,val:1
index:2,val:1
index:3,val:1
```
## 出力されたもの

``` txt
index:0,val:1
index:1,val:1 ←indexが１になってしまっている…
index:2,val:1
```

存在するはずの```index```が```1```で```０```の値が消えてしまっている。
挙動からすると、```each```内に```if={}```があるとその条件でFilterされたものを回しているっぽい…

## 対策

どうしても理想を叶えたいならこうとかすれば良いと思います

``` html:tag
<test>
  <div each={v,i in test} class={non:!v}>index:{i},val:{v}</div>
  <style>
    .non{
      display: none;
    }
  </style>
  <script>
    var self     = this;
    self.test    = [1,0,1,1];
  </script>
</test>
```

こんな感じで```if={}```を使わずに```style```で消す。

## 対策２

@clown0082 さんから頂いたご意見。
こちらのほうがスマートですね。
ありがとうございました！

``` html:tag
<test>
  <div each={v,i in test} show={v}>index:{i},val:{v}</div>
  <script>
    var self     = this;
    self.test    = [1,0,1,1];
  </script>
</test>
```