OmniAICreator/Qiita-1.07M huggingface dataset:
NYAGOS 4.2.5βが、いかにしてバッチファイルでの環境変数の変更取り込みを可能としたか

1. 通常、環境変数は親プロセスから子プロセスへの一方通行で継承されるものであり、逆はありえない。
2. CMD.EXE で「環境変数設定バッチ」というものが成り立つのは、バッチファイルを子プロセスではなく、バッチファイルを呼び出しているCMD.EXEプロセス自身でバッチファイルを読み取り、実行しているから
3. 故に、バッチファイルを「子プロセスの CMD.EXE」で呼び出している NYAGOS では、CMD.EXEのような環境変数設定用のバッチファイルを期待通りに利用することはできないはず

だが、しかし：

```t\batchtst.cmd
set F=%TIME%
cd "%TEMP%"
```

このバッチファイルを実行する時、4.2.5βでは、かわりに次のようなバッチファイルを生成・実行する。

```%TEMP%\nyagos-11428.cmd
@call t\batchtst.cmd
@set "ERRORLEVEL_=%ERRORLEVEL%"
@(cd & set) > "C:\Users\(ユーザ名)\AppData\Local\Temp\nyagos-11428.tmp"
@exit /b "%ERRORLEVEL_%"
```

このテンポラリバッチは、本来実行すべきバッチファイル(`t\batchtst.cmd`)を呼び出した後、`%TEMP%\nyagos-11428.tmp` というファイルに

* 1行目：実行直後のカレントディレクトリ
* 2行目以降：「環境変数名=値」の繰り返し

という内容を出力する。後は nyagos.exe でこれを読みだして反映するだけ！

多分、これで**環境設定バッチ**も**バッチソ**だと思うんですが、どうでしょうか！

（正直、ひどい力業（ちからわざ）だとは思いますけどね）

この環境変数バッチを読み込む機能自体は、以前より `source` というコマンドに実装されていた。4.2.5βではそれに対し、以下のような修正を行った。

* `source` と打たずとも、デフォルトのバッチファイル実行でも、反映機能が有効になるようにした。
* `%TEMP%\nyagos-(プロセスID).cmd`生成の際、バッチへの引数が正しく引き渡されない以下の不具合を修正
     * UTF8 のまま引き渡され、CMD.EXE 側で正しく受け取れなかった（⇒ 現在のコードページ文字列(ANSI)へ変換）
     * `"&"`・`">"` といった引数の二重引用符が外れてしまっていた（⇒ 元々の二重引用符をそのまま引き渡すように修正）

以上、開発の現場からでした。
Tomcatログローテートメモ書き

# Tomcatログ
以下、6種類有
① catalina.YYYY-MM-DD.log
② localhost.YYYY-MM-DD.log
③ manager.YYYY-MM-DD.log
④ host-manager.YYYY-MM-DD.log
⑤ localhost_access_log.txt
⑥ catalina.out

①~⑤ まではTomcatの機能でログローテートが可能である。※
⑥ はTomcatの機能でログローテートする機能がないように見える。そのためOSの標準機能で実施する。
※ ⑤に関してはログローテート自体を止めることができるため、OSのlogrotateを使用する方式で行う。
  　 ①~④に関してはログローテートを止める方法が勉強不足で見つからなかったためTomcatの機能を使用する。

# ログローテーション（OS標準に任せる）
## localhost_access_log
最初にログ出力の形式などを設定している箇所を確認
ログローテートに関しては未記載で実施する設定になっている。

```bash
$ sudo cat /opt/tomcat/apache-tomcat-8.5.29/conf/server.xml
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"	
               prefix="localhost_access_log" suffix=".txt"	
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
		
```

極力OSの標準機能のlogrotateで管理するようにしたいため、ログローテートを止める必要がある。
また、出力形式もなじみ深いapacheと同一のものに変更。
そのような変更を加えたものが以下である。

```bash

$ sudo vim /opt/tomcat/apache-tomcat-8.5.29/conf/server.xml
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"	
               prefix="localhost_access" suffix=".txt"	
               rotatable="false"	
               pattern="combined" />	
```
これでlocalhost_access_logは準備OK

## logrotate

Tomcatがログをつかんでいるので、copytruncateが必須
compressは用途に応じて

```bash

$ sudo vim /etc/logrotate.d/tomcat8
/opt/tomcat/apache-tomcat-8.5.29/logs/catalina.out
/opt/tomcat/apache-tomcat-8.5.29/logs/localhost_access.txt
{
    copytruncate
    daily
    rotate 7
    compress
    missingok
    create 0644 tomcat tomcat
}
```
# ログローテーション（Tomcatの機能）

Tomcatの機能でローテートするlogの場合は、ログローテート自体は毎日実行してくれるが、削除する機能がない。
そのため削除するシェルスクリプトが必要となる。

```bash
$ sudo vim shell/TomcatLogDel.sh
#!/bin/bash
LOG_DIR=/opt/tomcat/apache-tomcat-8.5.29/logs/
delfiles=`find ${LOG_DIR}*.log -mtime +7`
for a in $delfiles
do
    echo -e "delete file: ${a}" > /dev/null 2>&1
    rm -f ${a}
done

```

これで7日以上経過したログは削除され、Tomcatのログでリソースがひっ迫することはない。
シェルスクリプトは暫定で後日編集予定。
コマンドラインから画像ファイルの形式変換

ImageMagickにある`convert`コマンドを利用することで画像の形式を変換することが出来ます。

Debian系のOSなら

```
sudo apt-get install imagemagick
```

でインストールできます。

Windowsはここから

```
http://www.imagemagick.org/script/download.php#windows
```

実際の形式変換は

```
convert before_image.gif after_image.png
```

で実行できます。

jpegへ変換する際は

```
convert before_image.png -quality 100 after_image.jpeg
```

と圧縮率を指定して実行します。
```-quality 100```は圧縮率100のことだそうです。（詳しいことは分からない...）

ImageMagickがサポートしているフォーマットは```identify -list format```で確認することが出来ます。


> 参考までに
[画像ファイル形式の基礎と特徴まとめ（JPEG・GIF・PNGなど）](https://liginc.co.jp/web/design/material/50037)
[コマンドラインから画像形式を変換する](https://qiita.com/tadsan/items/e718cf3a90fc29f61107)
VueでSVGでスライダー？的なパーツを自作した

アドベントカレンダー以降、SVGを徐々に触りはじめ、スゴく楽しいです。
荒削りなコードでリファクタリングすべき箇所はいっぱいありますが、最近やりたかった四角形の両端がつまむエリアになっていて、大きさを変更できるというパーツを自作しました。
React、Vueどちらのサンプルでも良かったのですが、同じようなエントリを中々見つけることができなかったので投稿しておきます。

もともとはReactでCodepenにあったコードをサンプルにしました。
<p data-height="290" data-theme-id="0" data-slug-hash="yVEeOx" data-default-tab="js,result" data-user="techniq" data-embed-version="2" data-pen-title="React SVG drag and drop" class="codepen">See the Pen <a href="https://codepen.io/techniq/pen/yVEeOx/">React SVG drag and drop</a> by Sean Lynch (<a href="https://codepen.io/techniq">@techniq</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

#　できたもの

<p data-height="265" data-theme-id="0" data-slug-hash="aYLJxE" data-default-tab="html,result" data-user="sakapun" data-embed-version="2" data-pen-title="Vue Draggable SVG" class="codepen">See the Pen <a href="https://codepen.io/sakapun/pen/aYLJxE/">Vue Draggable SVG</a> by sakapun (<a href="https://codepen.io/sakapun">@sakapun</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## 知らなかったこと
### mousedownしたらmousemoveのイベントをDOMに貼ること
カーソルの動きが早すぎて対象にmousemoveを貼ると追い越して動かなくなってしまいがちです。
同様にサンプルではmouseupを大きめの対象に貼っていましたが、それだとバグることがありました。

### touchmoveのポジションのとり方がめんどくさい
event.touches[0].clientXとしなきゃいけないのは知りませんでした。

## 知ってたけど紹介したいこと
eventを引数として渡す時は特別な$eventを渡してあげます。

## よくわかりきってないこと
offsetXとかclientXとpageXとどれを使えば良いのか分かってない。
微妙に10pxほどずれるのを計算指定しているけど、良くないことなと思っているが未解決

## 最後に一言
今まで図形の描画ってライブラリを使うものだと思ってましたけど、簡単なものなら自作できるようになってきました。
ReactでもVueでも、SVGってグリグリ動かせて楽しいですね！
React(Native) + MobX + Flow で @inject がエラーになる時

Flow が Decoratorを解釈しない問題に立ち向かった記録。

# 概要

JS(X)の静的型チェックを可能にする Flow は、 ES Proposal のデコレーターを解釈しない。

何も設定しないとエラーになり、 Flow そのものが実行できなくなるが、下記の設定を入れることで飛ばしてくれる。

```ini:.flowconfig
esproposal.decorators=ignore
```

ただこれは、エラーを無視して飛ばしてくれるだけで、依然としてデコレーターを解釈はしない。つまり、 MobX の `@inject` を使ってストアを注入している時などに、エラーを吐いてしまう。

これの対処は、現時点（2018/03/26）ではデコレーターを使わない以外の選択肢は無い。

下記のように、無理やり `defaultProps` に注入予定のコンポーネントを書くとエラーは出ないが、

https://wietse.loves.engineering/using-flowtype-with-decorators-in-react-af4fe69e66d6

余計な型が増える上に、 `Props` がはっきりしなくなるので、避けたい。


# 前提

- React(Native) + MobX + Flow で開発している
- babel-plugin-transform-decorators-legacy 入れている
- `Component<*>` や `$flowFixMe` などという抜け道を作りたくない

# 問題のコード

`@inject` がエラーになる時

```jsx:App.jsx
import SomeComponent './SomeComponent'


class App extends Component<Props> {
  render() {
    return ( 
      <ScrollView>
        <SomeComponent someProperty="Hello" />
      </ScrollView>
    )
  }
}
```

```jsx:SomeComponent.jsx
type Props = {
  store: Store<*>;
  someProperty: string;
}

@inject('someStore')
@observer
export default class SomeComponent extends Component<Props> {
  render() {
    return <Text>{this.props.someProperty}, {someStore.someValue}</Text>
  }
}
```

このようなエラーが出る

```
Property `someStore` is incompatible:

...

property `someStore`. Property not found in. see `SomeComponents.js`

...

props of React element `SomeComponent`
```

Flow の気持ちになって考えてみれば、自分が無視する Decorator がしている処理は見たくないので、この挙動は当然といえます。


# 解決策

単純な解決策ですが、 `@inject` を諦めましょう。代わりに、関数として `inject` しても、可読性はそんなに変わりません。


```jsx:SomeComponent.jsx（一部）

@observer
class SomeComponent extends Component<Props> {
  render() {
    return <Text>{this.props.someProperty}, {someStore.someValue}</Text>
  }
}


export default inject('someStore')(SomeComponent)
```




参考

https://gist.github.com/vonovak/29c972c6aa9efbb7d63a6853d021fba9
Windows10のPCをWindwosServer2016のNPSでIEEE802.1x認証する　Part-1

# 目的
Windows10とWindows Server2016を利用してEAP-TLSによるIEEE802.1x認証をする。<br>
ちなみに無線でなく有線！！<br>
簡単すぎる概要図はこんな感じ。<br>
![概要図.png](https://qiita-image-store.s3.amazonaws.com/0/238567/4c9dcb89-6c46-12a8-2d55-d6128361bc1f.png)



# 前提
&nbsp; ・AD、ADCS、DHCP構築済み<br>
&nbsp; ・対象のWindows ServerにはNPS、AD、DHCP、ADCSを共存<br>
&nbsp; ・RADIUSの認証装置とするスイッチの設定は省略<br>
&nbsp; ・DHCPリレーとするルータの設定も省略<br>


# 手順
## １．証明書の設定
ユーザがログインした時に自動でユーザ証明書をインストール、更新するように証明書の自動配布設定をする。
### ■ユーザ証明書のテンプレート作成
mmc（Microsoft 管理コンソール）を起動して、『ファイル』→『スナップインの追加と削除』を選択して、『証明機関』と『証明書テンプレート』を追加する。
証明書テンプレートの中にある『ユーザー』を右クリック→『テンプレートの複製』を選択する。<br>
新しいテンプレートのプロパティ画面が表示されるので以下のとおり設定する。<br>

```
※変更しなくても問題ない箇所は省略
[要求処理]
　デフォルトでは『秘密キーのエクスポートを許可する』が有効になっているが、セキュリティ向上のため無効とする。

[サブジェクト名]
　『ActiveDirectoryの情報から構築する』にチェックをいれ、以下の設定にする。
　　　サブジェクト名の形式：完全な識別名
　　　代わりのサブジェクト名に次の情報を含める：ユーザ―プリンシパル名（UPN）

[セキュリティ]
　ここでユーザ証明書を自動配布するための権限を追加する。
　今回はIEEEというグループに自動配布するため、
　グループIEEEを追加し、読み取り・自動登録・登録にチェックを入れる。
```

次に『証明機関』の証明書テンプレートを開いて、
右クリック→新規作成→発行する証明書テンプレートを選んで、さっき作成したテンプレートを発行する。
これでユーザ証明書の下準備はOK！！

### ■サーバ証明書のテンプレート作成
サーバ証明書についてもほぼ同様の手順でテンプレートを作成する。
基となるテンプレートは『RASおよびIASサーバー』にして、以下のとおり新規テンプレートを作成する。

```
※変更しなくても問題ない箇所は省略
[要求処理]
　デフォルトでは『秘密キーのエクスポートを許可する』が有効になっているが、セキュリティ向上のため無効とする。

[サブジェクト名]
　『ActiveDirectoryの情報から構築する』にチェックをいれ、以下の設定にする。
　　　サブジェクト名の形式：共通
　　　代わりのサブジェクト名に次の情報を含める：DNS名

[セキュリティ]
　ここでユーザ証明書を自動配布するための権限を追加する。
　NPSをインストールしたサーバに自動配布する設定にしたいため、
　『RAS and IAS Servers』グループの権限を読み取り・登録・自動登録に変更する。
```

ユーザ証明書のときと同じようにして、サーバ証明書のテンプレートも発行する。

## ２．ADの設定
次にグループポリシーの設定を変更して、作成したユーザ証明書とサーバ証明書のテンプレートを自動配布する様設定を変更する。
ここは簡単に設定対象だけ記載。。。

```
[ユーザ証明書の自動配布]
　『ユーザの構成』→『ポリシー』→『Windowsの設定』→『セキュリティの設定』→『公開キーのポリシー』→『証明書サービスクライアント-自動登録』を有効にする。

[サーバ証明書の自動配布]
　『コンピュータの構成』→『ポリシー』→『Windowsの設定』→『セキュリティの設定』→『公開キーのポリシー』から『証明書サービスクライアント-自動登録』を有効にする。
```

## ３．NPSの設定

### ■接続要求ポリシーの作成
まずは、接続要求ポリシーを作成する。
接続要求ポリシーは一旦対象のNPSクライアント（スイッチ：以下SW）からのイーサネット通信は全部条件に入るよう以下のとおり作成。<br>

```
 [接続要求ポリシー]
　・概要 - ポリシー名とかを適当につけて、有効にする
　・概要 - NASポートの種類：イーサネット
　・設定 - デフォルトのまま
```

これで対象のNPSクライアント（SW）に繋がっているPCは全部NPSの接続要求ポリシーに該当するので、次にネットワークポリシーを作成して接続可否を設定する。
### ■ネットワークポリシーの作成
今回は特定のADグループの人のみ認証許可する設定とするため、以下のとおりネットワークポリシーを作成する。

```
[ネットワークポリシー]
　・概要 - ポリシー名とかを適当につけて、有効にする
　・概要 - NASポートの種類：イーサネット、Windowsグループ：対象のグループ名（ここではIEEEとする）
　・制約 - 認証方法（EAPの種類）：『Microsoft：スマートカードまたはその他の証明書』を選択する。
　・設定 - RADIUS属性（標準）：今回はDHCPサーバと連携してIPを払い出すため、以下のattributeを設定
　　　　　Framed-Protocol：PPP
　　　　　Service-Type：Framed
　　　　　Tunnel-Medium-Type：802
　　　　　Tunnel-Medium-Type：802
　　　　　Tunnel-Pvt-Group-ID：100※ここはDHCPで払い出すVLANID
　　　　　Tunnel-Type：Virtual LANs（VLAN）
```

以上でNPS側の設定はおしまい。
長くなりそうなので端末側の設定等々については次回に続く。。
【電子レンジ】うまかっちゃんを電子レンジでいい感じにデプロイする方法【うまかっちゃん】

## はじめに

---
　　　　
　　　　
　　　　　　
全くプログラミングと関係ありません。ただただ純粋に、そして楽してうまかっちゃんを美味しくいただこうとした過程と結果です。

---

## なぜこのようなことを？

---
　　
　　
　　

鍋を出したり洗ったりするのがめんどくさいからです。

---

# 準備するもの

---

・電子レンジでコンパイルしてもOKなどんぶり
・うまかっちゃん
<img src="https://qiita-image-store.s3.amazonaws.com/0/81328/bb1a4e84-8387-49ed-704f-0d4663a2637f.jpeg" width="40%">
※画像の向きは気にしないでください。

---

# 手順

---

1.袋から出します。どんぶりINします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/81328/b3884cd4-34db-f143-3914-6d6e41298aa0.jpeg" width="60%">
※画像の向きは(ry

---

2.お湯、または水をいい感じに張ります。

<img src="https://qiita-image-store.s3.amazonaws.com/0/81328/dd5d94ad-a527-6ddf-eb11-0e9733ff242e.jpeg" width="60%">

---

3.やさしくラッピングします。
そのままレンジにINします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/81328/0769d6af-159b-5af2-fd79-f453c0d2c050.jpeg" width="70%">

---

4.３分くらいコンパイルします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/81328/1e4d15fe-78f3-9bff-3b2c-e5cbafc89b63.jpeg" width="60%">

---

5.いい感じにデプロイされた麺を確認後、粉末スープを投入します。
※硬麺派の人は2分半くらいでいいかも
<img src="https://qiita-image-store.s3.amazonaws.com/0/81328/684ca3da-8585-ee6e-8484-b37f601ef3bc.jpeg" width="60%">

---

## 完成
<img src="https://qiita-image-store.s3.amazonaws.com/0/81328/4238988d-6750-b25f-a9ac-f6fce48bf9fb.jpeg" width="60%">

---
# 感想
---
・調理の手間60%カット（※当社比）
・片付けの手間50%カット（※当社比）
・おいしさかわらず（※当社比）
・余った時間、プライスr(ry

---
#最後に
---
手間が大幅にカットされておいしさかわらずはいいと思います。
是非お試しあれ

つまらない記事にお付き合い頂きありがとうございました。
Ubuntuでスクリーンショットに強調枠線やモザイク処理をする

Qiitaやブログなどへの投稿時にスクリーンショットを撮って、

こんな感じで
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244394/498f8fbe-a0eb-5650-0981-d869402f1584.png)
その一部を枠で囲って強調したり、個人情報部を隠したいってことが結構ある。

Windowsであればペイントで簡単にやれるけど、Ubuntuではどうやるんだろう？
てかこれができないと投稿もまともにできねぇ、ってことで調べてみた。

# Ubuntuの画像編集ツール
そもそもUbuntuで今回やりたいようなことができるツールが何かさえもわかっていない状態だったので、サクッと調べた。

## GIMP
Ubuntuの画像編集ツールといえばコレ的な有名なやつらしい。
機能は充実しているがとっつきにくく、慣れが必要？

## Pinta
Pinta.NETと呼ばれる、.NET Framework上で動くものをベースとしているツールとのことで、UbuntuのようなLinux系だけでなく、Win/Macでも使えるらしい。
直感的な操作で編集が行えるツールっぽい。Windowのペイントに一番近い？

## Shutter
スクリーンショットの編集に強いツール。
厳密に言うと画像編集ツールではないのかも。


## で、どれが良いの？
それぞれ個性があって用途によって得手不得手がありそうなので、
自身の用途によって使い分けるのが良さそう。

|　　　| GIMP | Pinta | Shutter |
|:-------------|:-----------------:|:------------------:|:------------------:|
| 情報量 | 多(534,000件) | 少(169,000件) | 並(456,000件) |
| 機能 | ◎ | ○ | ○ |
| 操作性 | △ | ○ | ○ |
| 用途   | ガッツリ編集 | Windowsのペイント程度 | スクリーンショットさえ弄れればOK | 
※情報量については2018/03/27時点で
　`ubuntu {ツール名}`でググった時の検索結果件数
※Shutterは常用語なので、他の二者よりも関連のない余計なものも多く含んでいるかもしれない

好み次第と言ってしまえばおしまいだけど、今のところはスクリーンショットを編集できれば十分なので、今回はShutterを入れてみる。


# Shutterのインストール
Ubuntuソフトウェアを立ち上げて
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244394/be9f7416-4ba4-06e9-b752-e925e10b249a.png)

検索窓に`shutter`と入れると該当のツールが出てくるので、
`インストール`をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244394/ea445107-651f-eb3b-db83-c0cc376d5e6f.png)


認証を求められた場合は認証する。これだけで完了。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244394/ce390d62-2ab5-8bd8-05a6-8d70bbed1164.png)


# Shutterを触ってみる
起動すると、こんな画面が出てくる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244394/e8e5198d-5a71-669e-b9b0-d7bc1ca69a61.png)


`範囲を選択`で範囲を指定してEnterを叩くとスクリーンショットを取ることができて、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244394/a0e7d508-da8b-63e7-4444-13a19b3a9735.png)


`編集`をクリックすると、こんな感じの別ウィンドウで編集ができる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244394/5d58bd24-218c-3283-0481-c8fd15a4920c.png)


編集が終わったら`保存`をクリックすると、`セッション`タブに保存した画像がいる状態になる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244394/2af465e2-7571-f774-5a04-ee280a0166b0.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/244394/2dd555e6-63db-82b1-8ff2-2962e516a3c5.png)


上記で保存した画像をQiitaで使うときは、
`セッション`タブをクリックして、使用したい画像をコピー、Qiitaの編集画面の本文上にペーストすればOK。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244394/1b97badb-d4dc-b6b4-11f9-ddaecd9ee809.png)


もっと色んなことができるのだろうけど、現状ではこんな程度がサクッとできれば十分なので一旦ここまで。
【CSS】CSSでうにうにした、まん丸を作ってみる

## はじめに
うにうにしたまん丸ってどうやって作ってますか？
こういうやつです！

![munimuni.gif](https://qiita-image-store.s3.amazonaws.com/0/143803/a10bd328-b5e8-839f-6223-185a031a4426.gif)


そもそも、そんな機会ないんじゃないかという話は置いてといて、
SVGを使ったり、canvasを使ったり色々あると思いますが、今回はCSSのみで **それっぽい**ものを作りたいと思います。

[DEMO](https://sengokukun.github.io/share_dir/border/)

## 完成品

<p data-height="500" data-theme-id="0" data-slug-hash="YardPx" data-default-tab="css,result" data-user="sengoku" data-embed-version="2" data-pen-title="border" class="codepen">See the Pen <a href="https://codepen.io/sengoku/pen/YardPx/">border</a> by kizuku sengoku (<a href="https://codepen.io/sengoku">@sengoku</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## マークアップ

### HTML
```index.html
  <body class="bg">
    <div class="border"></div>
  </body>
```

これだけ

### CSS

```style.css
/* センターに寄せているだけなので、参照しなくてOK */
.bg {
  height: 100vh;
  background-color: #000;
  display: flex;
  justify-content: center;
  align-items: center;
}

.border {
  width: 400px;
  height: 400px;
  border-radius: 50%;
  border-top: 10px solid #fff;
  background-color: #fff;
  animation-name: spin;
  animation-duration: 3s;
  animation-iteration-count: infinite;
  animation-timing-function: linear;
}

/* 回転するkeyframe */
@keyframes spin {
  0% {
    transform: rotate(0);
  }
  100% {
    transform: rotate(360deg);
  }
}
```

## 構成

<p data-height="500" data-theme-id="0" data-slug-hash="VXMgYE" data-default-tab="css,result" data-user="sengoku" data-embed-version="2" data-pen-title="border-02" class="codepen">See the Pen <a href="https://codepen.io/sengoku/pen/VXMgYE/">border-02</a> by kizuku sengoku (<a href="https://codepen.io/sengoku">@sengoku</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

`border-top`でうにうにの外側を作ります。
次に、keyframeで回るアニメーションを作ります。
この時、`animation-timing-function`を`linear`にするとなめらかになります。
※別にborder-topでなくてもOK!

この上で`background-color`を`border`の色に合わせれば、
**それっぽい** 実装ができます。
単純に400px(設定したいheight)に10pxはみ出しているだけですね。
`box-sizing: border-box;`とかしちゃうと、うにうにしなくなります。

## まとめ
`animation-duration`の値を変えたり、`box-shadow`などで装飾しても面白い実装ができそうですね。
ただ、実務に向いているかというと、わかりませんが。。。
いいからとにかくRxJSを動かしてみたいだけなんじゃ

本番でどう使うかとか、モジュールがどうとかNodeJSがどうとかはどうでもよくて、

いいからとにかくRxJSを動かして、どんなものなのか様子を見たいだけなんじゃ。

#やりたいこと

http://reactivex.io/rxjs/manual/overview.html

ここのデモコードに

```javascript:ov02.js
var button = document.querySelector('button');
Rx.Observable.fromEvent(button, 'click')
  .subscribe(() => console.log('Clicked!'));
```

というものがある。(`ov02.js`という名前は僕が適当につけたので意味はないです)

Observableが初めて出てくる、とても簡単なコード。これを動かしたい。それだけでいい。まずは。それだけでいい。

ブラウザでボタンをクリックすると、ブラウザのコンソールに「Clicked!」と表示される、ただそれだけ。

ブラウザのコンソールは、例えばChromeなら、適当な所を右クリックして「要素を検証」をクリックして出て来る開発者ツールで、コンソールタブを探せば出てきます。

#問題は何

上の`ov02.js`と、この`ov02.html`を同じフォルダに置いて、ブラウザで`ov02.html`を開きます。

```ov02.html
<!DOCTYPE html>
<head>
</head>
<body>
  <button>button</button>
  <script src="./ov02.js"></script>
</body>
```

```javascript:ov02.js
var button = document.querySelector('button');
Rx.Observable.fromEvent(button, 'click')
  .subscribe(() => console.log('Clicked!'));
```

(`ov02.js`は再掲)

当然、動きません。何故なら、RxJS本体を読み込むコードがどこにもないからです。



#結論

CDN経由で`Rx.min.js`というファイルを入手して、同じフォルダに置いて、普通にHTMLから読み込んで動かすことが出来ました。

修正版のHTMLがこちら。`ov02.js`ファイルはそのままで大丈夫です。

```html:ov02.html
<!DOCTYPE html>
<head>
</head>
<body>
  <button>button</button>
  <script src="./Rx.min.js"></script>
  <script src="./ov02.js"></script>
</body>
```

`Rx.min.js`というファイルは、このサイトを使って入手しました。
https://cdnjs.com/libraries/rxjs

そもそもこのRxJS、ライブラリなんだから、jQueryと同じように、本体ファイルをHTMLから読み込めば動くんですね。

RxJSを読み込む行は、RxJSを使用するJSファイルを読み込む行よりも上に書きましょうね。先に読み込まないといけないですからね。

いやあ、なんか、NodeJSを使って`import`やら`require`するものだっていう先入観があって、遠回りしてしまった。

CDNというのは、「コンテンツデリバリーネットワーク」のことで、めちゃくちゃ簡単に言うと、コンテンツを受け取る側にとっては「ファイルが入手できる所」くらいの意味です。

いやもっとメリットあるんですけど、とにかく、「CDNにアクセスすると、ファイルが手に入る」ということです。

CDN使う方法も本家サイトに書いてあったけど、なんか「CDN」ってアルファベットで言われた瞬間「何かのインストーラかな。入れてないな〜」とか思っちゃったんですよね。情弱すぎる。

#`node`で動かすなら

ブラウザではなく、ターミナルなどを使って`node`コマンドで動かす場合はこちら。

```javascript:ov06.js
Rx = require('./rx.min.js');

Rx.Observable.of(1,2,3).subscribe(x=>console.log(x));
```

JSファイルの冒頭で`require`を使って読み込んでやれば動きます。

```:コマンド
node ov06.js
```


```:出力
1
2
3
```


#以下、遠回り中のぼやき
以下、ぼやきです。役に立つことは書いてません(なんですって…！)


そもそも、元の`ov02.js`にimport文を足してhtmlから読み込んで試そうと思ったらハマった。

俺のバージョンのchrome(64.0)はjavascriptのモジュール機能に対応してるらしいからいけるのかと思ってしまった。

###importやrequireはブラウザのコンソールからは使えない

importしたいモジュール(?)をコンソールから呼ぶことは出来ない

###普通にJSを読み込んでもimportやrequireはうまく動かない

```javascript
import { hoge } from ...
```

は、unexpected token "{" って怒られる。"import"の時点で怒られてるわけではないのか。

```javascript
import Rx from ...
```

とすると、unexpected identifier らしい。はあ。

###ブラウザはnode_modulesに対応していない

import Rx from... がダメなのはこのせいか？

###ローカルからモジュールのインポートはできない

html側を

```html
<script type="module" src="./hoge.js"></script>
```

とすると、CORSポリシーに反するということで怒られる。

hoge.js自体はモジュールとして記述してるわけじゃないんだけど、どうなんだ？

その冒頭にあるimport文がまずいのか？？

まあnode_modulesに対応してないんじゃ結局だめだけど。


###バンドラ(?)とかいう謎概念を使えば良い？？

確かに、Angularのテストサーバーを動かすと、webpackがどうこういうメッセージがでる。

webpackは一体どんな仕事をしているんだ。わかってないぞ。

###CDNからRx.min.jsを手に入れてHTMLから普通に読みこむ

うまくいきましたわ。
画像投稿時に、![error]()となる件

せっせこ記事を書いていたら、画像投稿時に下記エラーが表示された。

```
![error]()
```

何故！？
調べてみたら、記事が未投稿のユーザーは、アップロードファイルの上限が２MBなのだそう。
なので、この記事を投稿してアップロードファイルの上限が増えるか確認してみる。

#追記
![skitch-8.png](https://qiita-image-store.s3.amazonaws.com/0/240320/7acf69f2-2551-2dfb-8397-670b71f5f988.png)
増えました。
因みに、100MB/月　だそうです。

#参考
https://qiita.com/unsoluble_sugar/items/f61be798972883e44877
文字をカッコよくフェードイン（CSSアニメーション）

# 概要
cssアニメーションを使って、文字をカッコよくフェードインさせる。

# 実装例
https://inoyoh.github.io/practice/fadein/

# 仕組み（全体像）
- 1. 動く背景(mask_fadeIn)を<font color="red">キーフレイムで定義</font>
- 2. 
    - 2-1. 指定要素(.is-fadeIn)を「position : relative;」
    - 2-2. 指定要素の擬似要素(:after)に、固定値とanimationプロパティを指定。

# コード
- 使われているプロパティ
    - 「transform : scaleX(0)」 ： X方向の縮尺比率を指定。「1」：1倍。（[参考](http://www.htmq.com/css3/transform_scale.shtml)）
        -  「transform : none」  ： 初期値。
    - 「transform-origin: 0 0;」 ：　プロパティ要素の変換の原点を指定。（[参考](http://www.htmq.com/css3/transform-origin.shtml)）
    - 「animation: mask_fadeIn 1.0s cubic-bezier(0.77, 0, 0.175, 1) 0s;」 ： キーフレームで定義した「mask_fadeIn」を、1秒間で、指定したイージングで動かす。（[参考](http://on-ze.com/archives/6697)）


```html:html
<span class="is-fadeIn">あああああ</span>

```
```css:css
/* 動く背景 (mask_fadeIn) の定義 */
@keyframes mask_fadeIn {
  0% {
    /* x方向の倍率を0に */
    transform: scaleX(0);
    /* 変換の原点を(0, 0)に指定 */
    transform-origin: 0 0;
  }
  45% {
    /* x方向の倍率を初期値(1倍)に */
    transform: none;
    transform-origin: 0 0;
  }
  50% {
    transform: none;
    transform-origin: 100% 0;
  }
  100% {
    transform: scaleX(0);
    transform-origin: 100% 0;
  }
}

.is-fadeIn {
  position: relative;
  overflow: hidden;
}

.is-fadeIn:after {
  content: "";
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background: #ffffff;
　　　　/* 固定値のx方向の倍率を0に。アニメーション後の横幅が0になる。 */
  transform: scaleX(0);
  /* キーフレームで定義した「mask_fadeIn」を動かす。 */
  animation: mask_fadeIn 1.0s cubic-bezier(0.77, 0, 0.175, 1) 0s;
}

```

# 参考
- [transform : scale()] (http://www.htmq.com/css3/transform_scale.shtml)
- [transform-origin](http://www.htmq.com/css3/transform-origin.shtml)
Go で N 秒に M 回なんかする


# なんかするコマンド

* 一定の間隔でなんかしたいときは [time.Ticker](https://golang.org/pkg/time/#Ticker) が便利

```go:ticker.go
package main

import (
	"flag"
	"fmt"
	"os/exec"
	"strings"
	"time"
)

var (
	s = flag.Int("s", 1, "unit seconds")
	c = flag.Int("c", 1, "unit count")
	d = flag.Int("d", 1, "duration seconds")
	e = flag.String("e", "", "execute command")
)

func main() {
	flag.Parse()

	ticker := time.NewTicker(time.Second * time.Duration(*s) / time.Duration(*c))
	defer ticker.Stop()

	done := make(chan bool)
	go func() {
		time.Sleep(time.Second * time.Duration(*d))
		done <- true
	}()

	e := strings.Split(*e, " ")

	for {
		select {
		case <-done:
			return
		case <-ticker.C:
			if out, err := exec.Command(e[0], e[1:]...).Output(); err != nil {
				panic(err)
			} else {
				fmt.Printf("%s", out)
			}
		}
	}
}
```

# やる

```sh
# 1 秒に 10 回のペースで 5 秒間 echo hello world する
$ go run ticker.go -s 1 -c 10 -e "echo hello world" -d 5

# 1 秒に 1000 回ペースを指定するが exec が遅いので自分の環境だと秒間 360 回程度しか実行できない
$ go run ticker.go -s 1 -c 1000 -e "echo hello world" -d 5 | wc
1837    3674   22044
```

# Go でなんかする

* コマンド実行だと遅いので実処理部分を Go で実装する
* ここでは任意のファイルに任意の長さのログを書き出すスクリプトを作る

```go:ticker2.go
package main

import (
	"bytes"
	"flag"
	"os"
	"time"
)

var (
	s = flag.Int("s", 1, "unit seconds")
	c = flag.Int("c", 1, "unit count")
	d = flag.Int("d", 1, "duration seconds")
	f = flag.String("f", "", "log filename")
	l = flag.Int("l", 1, "log length")
)

func main() {
	flag.Parse()

	ticker := time.NewTicker(time.Second * time.Duration(*s) / time.Duration(*c))
	defer ticker.Stop()

	fd, err := os.OpenFile(*f, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		panic(err)
	}
	defer fd.Close()
	txt := append(bytes.Repeat([]byte("0"), *l), []byte("\n")...)

	done := make(chan bool)
	go func() {
		time.Sleep(time.Second * time.Duration(*d))
		done <- true
	}()

	for {
		select {
		case <-done:
			return
		case <-ticker.C:
			if _, err := fd.Write(txt); err != nil {
				panic(err)
			}
		}
	}
}
```

# Go でやる

```sh

# 1000 件/秒で 1 秒間 500(499 + 改行) バイトのログを out.log ファイルに出力する
$ go run ticker.go -s 1 -c 1000 -d 1 -f out.log -l 499

# 毎秒 1000 件程度は楽勝
$ wc out.log
	1000    1000  500000 out.log

# 100000 件/秒で 1 秒間 500 バイトのログを out.log ファイルに出力する
$ go run ticker.go -s 1 -c 100000 -d 1 -f out2.log -l 499

# 自分の環境だと毎秒 7, 8 万件程度まで実行できた
$ wc out2.log
   72853   72853 36426500 out2.log
```

# どっかでなんかやる

* Go なので Docker や Kubernetes 環境とかの Linux 向けにポータブルにビルドして実行するのが楽

```sh
# Linux 向けにビルド
GOOS=linux GOARCH=amd64 go build ticker.go

# Docker で実行
docker cp ticker $CONTAINER_ID:/path/to/ticker
docker exec $CONTAINER_ID sh -c '/path/to/ticker -s 1 -c 10 -e "echo hello world" -d 5'

# Kubernetes で実行
kubectl cp ./ticker $POD_NAME:/path/to/ticker
kubectl exec $POD_NAME -- /path/to/ticker -s 1 -c 10 -e "echo hello world" -d 5
```
MattermostでローカルPCにSlackライクなメモ環境を準備する

## はじめに

以下に書いたようなことを満たすために、Slackクローンの<a href="https://about.mattermost.com/" target="_blank">Mattermost</a>をローカルに構築したメモです。

* 新しい技術検証や何かアイデアを思いついたときにメモしたい
* 単純に```.txt```ファイルでメモを取るのではなく、もっとTwitterみたいにライトに書きなぐり、タイムライン形式で見返したい
* とはいえ個人的なメモなので、パブリックにはしたくない
* Twitterの鍵アカウントや個人Slackでも希望は満たせそうだが、インターネット上には置かずローカルに閉じた形にしたい

## 前提環境

* Mac OS X 10.13.3(High Sierra)
* Docker for Mac (Version 17.12.0-ce-mac55 (23011))
* Homebrew 1.5.12

## 手順

### Mattermost Server起動

参考：<a href="https://docs.mattermost.com/install/docker-local-machine.html#one-line-docker-install" target="_blank">One-line Docker Install</a>

Dockerを使って、下記コマンド一発で起動できます。

```
$ docker run --name mattermost-preview -d --publish 8065:8065 mattermost/mattermost-preview
```

Webブラウザから```http://localhost:8065/```にアクセスし、ユーザー登録画面が出ることを確認します。

メールアドレス、ユーザー名、パスワードを入力し、登録しておきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/ec474646-1b23-e691-74a7-436f3dd7d830.png)

Create New Teamをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/a3ae0c5e-d07d-8629-9113-ca5ed8619a6b.png)

Team名を入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/a133adaa-9ace-f53f-cd39-f04a8e1a157a.png)

Team URLを確認します。(デフォルトではTeam名が入力されています)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/1885f0e6-8cc2-1510-d33c-d8dc449d08d3.png)

Finishをクリックすると、MattermostのTop画面に遷移します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/01dbfca3-9f15-5447-ad77-cac71f446494.png)

### Mattermostデスクトップアプリインストール

Slackでもそうですが、Webブラウザからではなくデスクトップアプリから使えると便利ですよね。

Mattermostも<a href="https://docs.mattermost.com/install/desktop.html" target="_blank">Desktop Application</a>が用意されています。

Mac OS X(10.9+)の場合、HomeBrew Caskでインストールできます。

```
$ brew cask install mattermost
```

MacのアプリケーションからMattermostを起動します。

先程登録したユーザー名、パスワードでログインします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/aee8211d-a1a1-414f-57d7-e37571fa35b8.png)

先程Dockerで起動したMattermostのServer情報を入力し、Addをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/fc7a3199-fab7-6058-261e-c6ef97fe6ea1.png)


Server Manegementに新規登録されるので、追加されたエリアをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/f9ec566a-97b8-4a0c-5bf5-332793f07c33.png)

TeamのTop画面に遷移します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/3e25ac60-afa1-58ea-6354-fd8a1db26d06.png)

これでメモをガシガシ残していけるようになりました！

## 参考

* [SlackクローンのMattermostを使ってみる - 導入、初期設定編-](https://qiita.com/terukizm/items/4a4016d8ec5a21856e4f)
Ubuntu16.04でRX480を使うという話。

# 物の試しにUbuntuをインストールしようとしたらアホみたいにハマる
きっと世の中には自分のようなアホは居まいと思うものの、未来の自分は今日の自分よりもアホな可能性があるので備忘録として記録する。何を隠そうOSを入れるだけで2日間もかかることがないように。

## まず最初にUEFIの設定を確認する
USBインストーラーを作る方法は色々あるようだが、とりあえず自分はrufusというFF7の若社長と同じ名前のソフトを使用して作成している。
ここまではよい。

OS起動前にファンクションキーなりDeleteなりを連打してUEFIに入った後、使用しようとしているOSに相応しいブート設定をしたとしよう！　しかし、妙にあちこち手を加えた自分のPCではこの後Ubuntuが起動することはない。LowGraphicModeとかなんとかいって画面は真っ暗。

何故？　まだドライバも何もどうこうするような段階じゃないはずなのに。
ISOをダウンロードしなおしても無駄。別のディストリを使おうと無駄。

訳が分からずUEFIの設定を再度確認していると、GPUを購入した直後改変した項目を思い出した。ASUSのUEFIではAdvancedModeの中にあるグラフィック周りの設定である。正確に言えばAdvancedタブ内SystemAgentConfigrationのPrimaryDisplayである。**自分の場合こいつをPCIEXにしていた事が原因だった。**

こいつをCPUにして起動してみれば無事Ubuntuのデスクトップまでたどり着けました。

## GPUドライバはどうするの？
ggrksと言われるだろうが自分のようなアホにはググったところで難しいことは分からぬ。どうやらオープンソースとメーカー開発の2種類のドライバがあるがどちらがプロプライエタリなのかも判然とせぬ。大事な事はUbuntuインストール直後の状態ではGPUからの出力が出来ないという事だ。
オープンソースドライバってどうやって入れれば良いんですの？　と悩んでみてもプロプライエタリなドライバの情報しか見つけられず、よもやこれまでか。UbuntuではRX480使えないのか？

となったところで、AmdGpuProドライバーには適合するOSと同時にカーネルの番号が書いてあったようなと思い当たる。
試しに**カーネルを更新してみると見事GPUからの出力が出来る。**4Kモニタが映るじゃないですか。
まあこれで調子こいてプロプライエタリなドライバを当てた挙げ句真っ黒画面にCLIでアンインストールのコマンドを打ち込むハメになったわけですが。

## とりあえず終戦
たったこれだけの事で2日溶けたという事実にいじけながら、更にログオフしてから再度ログインするとUSBDACから音が出なくなりダミー出力とかいうのがドンドカ拍動する件には目をつぶり使用中。
Cockyとの格闘とか楽しすぎて大変。

特にGPUドライバは結構な鬼門のような気がした一件でした。目指せ4Kでデレステ。
Surface Book 2 を Windows10 と Ubuntu のデュアルブートにする

最近出ているノートPCの中でも，Linuxを動かすハードルが最も高い部類のPCである Surface Book 2 で Windows 10 と Ubuntu のデュアルブート構成にしていく手順です．

## Ubuntu用の空き領域を確保する

購入してきた状態だと，当然ながらディスク領域が割り当てられた状態になっているので，これを縮小していきます．

Cドライブのパーティションが縮小対象です．他にもEFIパーティションやリカバリ用パーティションがありますが，これらには触らないように．

1. Windowsのバックアップを取る
1. BitLocker によるCドライブの暗号化を無効化する（**これをやらないとほとんどパーティションを縮小できないのでおそらく必須**）
2. Windowsの「ディスクの管理」か，EaseUS partition master などのソフトを使ってパーティションを縮小する
3. BitLocker を再度有効化する（必要に応じて）
4. BitLockerの回復キーをバックアップする（**これをやらないとセキュアブート設定を変更した後にWindowsを起動できなくなります**）

## Ubuntu をインストールする

* 事前準備するもの
    * Ubuntuが起動可能なUSBメモリ
    * （USBキーボード）

今回は Ubuntu 17.10.1 amd64 Desktop をインストールしました．

Surface Book 2 はパッチの当たっていないカーネルだとキーボードが認識されないとの情報がありましたが，Ubuntu 17.10 のインストーラではキーボードとタッチパッド両方使えました．

インストールにあたり，セキュアブートは無効化します（セキュアブートを有効にしたままでもインストールできるような情報もありましたが，手元の環境ではうまくいかなかったため）．下記のステップは，セキュアブートを無効化することによるリスクを理解した上で行ってください．

1. マシンの電源を切った状態から，音量＋ボタンを押し続けながら電源ボタンを押して電源を入れる
2. Surface UEFIの画面で，「Security」→ 「Secure Boot」で「none」を選択
3. Surface UEFIの画面で，「Boot configuration」でUSBの起動順序を一番上にしておく
4. USBメモリを挿して，Surface UEFIを「Exit」で抜けて再起動
5. Ubuntuのインストーラをポチポチ進めていく．ポイントとなるところだけメモ
    -  「Ubuntuのインストール準備」で「グラフィクス（略）サードバーティーソフトウェアをインストールする」をチェックする
    -  「UbuntuをWindows Boot Managerとは別にインストール」を選択（grub2がインストールされます）

これで，PCを起動するとブートローダとしてgrub2がつかわれるようになります．
Windowsを起動する場合には，grub2のメニューから「Windows Boot Manager」を選択すればよいです．BitLockerを有効にしている場合には，最初にgrub2経由で起動したときには回復キーの入力が求められるので，予めバックアップしておいたものから入力しましょう．

## 参考資料

* https://docs.microsoft.com/ja-jp/surface/manage-surface-uefi-settings
* http://www.milkmemo.com/entry/surface_ubuntu_install
* http://121ware.com/qasearch/1007/app/servlet/relatedqa?QID=017878#a01
* https://www.reddit.com/r/SurfaceLinux/comments/7kb1ky/guide_installing_linux_on_surfaceseries_devices/?st=jf87hm0h&sh=efb60162
* https://github.com/jakeday/linux-surface
【Unity/Git】Unityでチーム開発をする(1) 概要と初期設定編

# はじめに
これまで会社で2年ほどUnityでチーム開発をして来ましたが、そこで得た知見を文書化していなかったため、新人が入る度に講義をしていました。転職して環境も変わったので、以前やっていたチーム開発のやり方を残しておこうと思います。

ただ、全ての詳細を記載すると~~めんどくさい~~長大なエントリーになるため、概要程度の内容にとどめます。
そのうち各節の詳細を別エントリーで書くかもしれません。

# 対象
Gitの概要を知っていて、これからUnityでチーム開発を始める人

# Unityでチーム開発をする
## バージョン管理
Gitでおk。

ただし、エンタメ系の開発で巨大なファイル（モデル、テクスチャ、動画等）を管理する場合は注意が必要です。
何も考えずにGitで巨大なファイルをPushしていると、最終的にはCloneやブランチの切り替えに平気で**数十分～数時間かかるようになる**ので、誰も幸せになりません。もし今そのようなリポジトリを使っているなら、腹を括って一旦捨ててしまったほうがよいでしょう。

素直にGitLFSを使えば良いと思います。

## Gitホスティングサービス

Gitのホスティングサービスとは、GitHubとかBitBucketとかのことです。
これに関しては、予算やチームの規模によるので一概には言えません。どのサービスを使うのか、自社サーバを建てるのか等検討が必要です。
Gitホスティングサービスの比較は、ネット上に転がっているのでそちらを参照して決めてください。

## Gitクライアント
プロジェクトメンバーのコンテキストや好みによると思いますが、私はSourceTreeを使っています。
特にエンタメ系の開発だと、非エンジニアもGitを触ることになるので、CUIはツラいです。

## Gitの初期設定
**この設定を忘れると、初期の段階ならリポジトリを作り直すレベルで面倒なことになるので非常に重要です。**

### Git上で管理しないファイルの設定を行う
Gitの無視リスト(gitignore)を設定します。
この設定を忘れてコミットしてしまうと、Unityが生成したローカルのLibraryファイルがGit管理ファイルとして大量に登録されます。
このファイルは、各個人で生成されるファイルが異なるため、Unityのプロジェクトファイルを開いた瞬間に、大量の差分が発生します。
もうこうなると差分管理どころではないので、前職では何度かリポジトリを捨てました。
復旧方法はあるっぽいのですが、**うまくいったことがないので誰か解決方法教えてください。**

何はともあれ、以下に記載のgitignoreを設定しておきましょう。
[Unity向け .gitignoreの設定について](https://qiita.com/nariya/items/97afba6b7b448920cdf0)


### GitLFSで管理するファイルの設定を行う
**GitLFSを使わない場合は設定不要です。**
GitLFSは、管理する対象のファイル形式を予め設定する必要があります。
SourceTree上で「リポジトリ」-「Git LFS」-「Initialize Repository」から、管理する対象を追加しましょう。


## Unityのバージョン
基本的にプロジェクト開始時点でのパッチリリース最新版を使えば良いと思います。
**プロジェクトメンバーは全員同じバージョンを使いましょう。**

## Unityの初期設定
意外に忘れがちですが、UnityプロジェクトをGitで管理する場合、Unityプロジェクト側の設定を変更してあげる必要があります。
以下の通りEditorSettingsを設定しないと、シーンファイルやプレハブファイルがバイナリで保存されるため、Git上でマージする事ができません。
Unityのプロジェクトファイルを最初にコミットする際に、忘れずに設定しておきましょう。
最初にコミットするときに設定していれば、他のメンバーは改めて設定する必要はありません。
![EditorSettings.png](https://qiita-image-store.s3.amazonaws.com/0/216921/36096af3-bb64-cdd0-0b0d-fea77465ed22.png)

## 次回
[【Unity/Git】Unityでチーム開発をする(2) GitFlowでブランチを管理する](https://qiita.com/Sansuusetto/items/90b602f25f49016188d3)
DataTableの照合順序で躓いた話

## 前置き

Qiitaでは余り投稿されていませんがVB.Netで躓いた時の話です。

## 躓いたコード

``` hoge.vb

Dim dt As New DataTable

dt.Columns.Add("Item")

dt.Rows.Add(New Object{"ABC"})
dt.Rows.Add(New Object{"abc"})

dt.Select("Item = 'abc'").Count

```

上記のコードでCountを取得すると2件取得されてしまいます。
デフォルトで大文字小文字を判別しない仕様になっています。
全角半角も区別しないようです。


## 修正後のコード

``` hoge.vb

Dim dt As New DataTable

'大文字小文字半角全角を区別するようにする
dt.CaseSensitive = True

dt.Columns.Add("Item")

dt.Rows.Add(New Object{"ABC"})
dt.Rows.Add(New Object{"abc"})

dt.Select("Item = 'abc'").Count

```

DataTableのCaseSensitiveプロパティを設定することによって解決しました。
【peco】たった4つの設定で最高の環境を手に入れる

[peco](https://github.com/peco/peco)を使い続けて早1年。
[peco](https://github.com/peco/peco)を使うと、さまざまな場面でインクリメンタルサーチベースでコマンドを実行することができます。

あまりに便利なので、[peco](https://github.com/peco/peco)を絡めたコマンドを毎日のように使っています。
この1年でいろんな使い方をしてみましたが、最終的に**４つ**に集約されました。

ということで、毎日のように利用している**4つ**のコマンドを紹介してみる。

## 環境

OS: macOS High Sierra
ターミナル: [iTerm2](https://www.iterm2.com/)
シェル: Zsh   　※ インストールは ```$ brew install zsh```

## 【Histroy】検索

とにかくオススメ。通常の履歴検索にはもう戻れない。

```zsh:.zshrc
function select-history() {
    local tac
    if which tac > /dev/null; then
        tac="tac"
    else
        tac="tail -r"
    fi
    BUFFER=$(fc -l -n 1 | eval $tac | peco --query "$LBUFFER")
    CURSOR=$#BUFFER
    zle -R -c
}
zle -N select-history
bindkey '^r' select-history
```

![select-history.gif](https://qiita-image-store.s3.amazonaws.com/0/74485/d5f1c328-2c21-ad3e-5235-7786eaf3cb22.gif)

## 【[ghq](https://github.com/motemen/ghq)】Gitリポジトリにcd

シェル起動　→ 「g」 の安定の流れ。

```zsh:.zshrc
alias g='cd $(ghq root)/$(ghq list | peco)'
```
![ghq.gif](https://qiita-image-store.s3.amazonaws.com/0/74485/b380be33-0a85-0a19-4a9e-e27b914f4e9a.gif)


## 【[Git](https://git-scm.com/)】ブランチ切り替え

増えがちなローカルブランチに一瞬で切り替えれる。

```zsh:.zshrc
alias -g lb='`git branch | peco --prompt "GIT BRANCH>" | head -n 1 | sed -e "s/^\*\s*//g"`'
```

![git-co-lb.gif](https://qiita-image-store.s3.amazonaws.com/0/74485/ffc22d88-bd07-bc26-9b1e-235f90fe9903.gif)

## 【[Docker](https://www.docker.com/)】コンテナ内に入る

docker ps でコンテナ名調べて...コピーして...みたいなのがなくなり最高。

```zsh:.zshrc
alias dps='docker ps --format "{{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Command}}\t{{.RunningFor}}"'
alias de='docker exec -it `dps | peco | cut -f 1` /bin/bash'
```

![docker-ps.gif](https://qiita-image-store.s3.amazonaws.com/0/74485/eca9b443-ff7b-c4b0-c6ac-97f1a21b6b40.gif)
wp-cliでよく使うコマンド

# What's WP-CLI?
- [WP\-CLI – The command line interface for WordPress](https://make.wordpress.org/cli/)
- 黒い画面からWordPressをいじくれる
- GUIアレルギーでもWordPressが管理できる！
    - というのは冗談で、ポチポチクリックするのが面倒な作業またはcronで定期的に行いたい作業をやるのに便利
- [VCCW](http://vccw.cc/)ではWordPressのセットアップに用いてる

# 外部パッケージ
## revisions
- https://github.com/trepmal/wp-revisions-cli
- リビジョンを管理？するためのwp-cliパッケージ
- ```$ wp revisions clean -1```で、リビジョンが全部削除できる
    - いまやってる環境だと、なぜか1個だけ残る…
    - ```$ wp revisions dump --hard```との違いがよくわからない

## profile
- https://github.com/wp-cli/profile-command
- 公式のパッケージっぽい
- ```$ wp profile stage```で、とりあえず実行時間を確認する

# デフォルトコマンド
## $ wp search-replace \<old\> \<new\>
- https://developer.wordpress.org/cli/commands/search-replace/
- DBの中身を置換する
- production環境から、ローカルのdevelopment環境にコピーした時もしくはその逆のときに、ドメインが変わってしまうので、このコマンドで置き換える。

## $ wp rewrite flush
- https://developer.wordpress.org/cli/commands/rewrite/
- 「管理画面　→ 設定 → パーマリンク設定 → 保存」とやったのと同じ動作をするっぽい
- Databaseをコピーして、``` $ wp search-replace```で置き換えしただけでは、ちゃんとページ遷移できる状態になってくれないので、これを合わせて実行すると良さげ

## $ wp package install \<package\>
- パッケージをインストールするためのコマンド
- たまに memory_limit でインストールできないので、下記コマンドで対応
    - ``` $ php -d memory_limit=-1 /usr/local/bin/wp package install <package>```
    - 参考: [WP\-CLI でメモリ不足のエラーが出る時の対処法 \- Qiita](https://qiita.com/miya0001/items/9797832db58b60786803)

# 今後使ってみたい
## $ wp db export \<sql_file_name\>
- https://developer.wordpress.org/cli/commands/db/
- WordPressが使ってるDBをエクスポートしてくれる
- いつも``` $ mysqldump ``` を使っているため、気にしてなかった

# その他メモ
- wp コマンドは、大抵のサブコマンドにおいて、実際にWordPressを実行する形で行われるっぽい
- ブラウザから叩いているわけではないので、wp コマンドの実行者にアクセス権限、書き換え権限等がないと、updateなどができない
- --path=\<wp dir\> はいちいち叩くと面倒くさいので、```~/.wp-cli/config.yml``` にpathの設定をしておこう
- ``` $ wp core update```などは使ってない。たいていアップデートに気づくときは管理画面に入っているので、そこからやってる。おそらくcronとか使って定期自動updateするためようだと思う。

# Referenced
- [WP\-CLIの使い方 \- Qiita](https://qiita.com/IK12_info/items/4a9190119be2a0f347a0)
- [WP\-CLI でメモリ不足のエラーが出る時の対処法 \- Qiita](https://qiita.com/miya0001/items/9797832db58b60786803)
- [\[WordPress\] 負荷がかかっている処理を見つけるのに wp profile がとても便利だった \- Qiita](https://qiita.com/wokamoto/items/3902278e658ba856f1a9)
Pytorch と Caffe2 のパフォーマンス比較

Resnet50 の pretrainedモデルを使って、CPUでの推論の性能差(速度)をチェックする。
caffe2, pytorch はともに以下のcondaパッケージを利用 (python3.6)

```
pytorch                   0.3.1           py36_cuda0.0_cudnn0.0_2
caffe2                    0.8.dev          py36hbf6519f_0 
```

テスト環境は3年くらい前のMBP

```
2.5GHz Intel Core i7
16GB メモリ
```

**pytorchのコード**

```python
import time

import torch
from torch.autograd import Variable
import torchvision.models as models


model = models.resnet50(pretrained=True)
model.eval()
model.cpu()

dummy_input = Variable(torch.randn((1, 3, 224, 224))).cpu()

start = time.time()
for i in range(100):
    res = model(dummy_input)
print(time.time()-start)
```

**caffe2のコード**

```python
import numpy as np
import time
from caffe2.python import workspace
from caffe2.python.models import resnet50

p = workspace.Predictor(resnet50.init_net, resnet50.predict_net)

dummy_input = np.random.random((1, 3, 224, 224)).astype(np.float32)

start = time.time()
for i in range(100):
    res = p.run({'gpu_0/data': dummy_input})
print(time.time()-start)
```
※入力のデータ名がgpu_0~ となってますがcaffe2のモデルの仕様の問題で, gpuは使ってません.

# 結果
それぞれ上記のコードで3回計測し、中央値で評価した。


|  | pytorch | caffe2 |
|:-----------:|:------------:|:------------:|
| 処理時間 | 21.153s | 6.232s |

cpuでの推論はcaffe2の方がpytorchより3倍~ほど速かった。
今回はcaffe2, pytorchともにcondaパッケージをそのまま使ったので自前で最適な構成でインストールすればまた違う結果になると思います。
（再掲）micro:bitでリズムをきざむ

これは [micro:bit Advent Calendar 2017](https://qiita.com/advent-calendar/2017/microbit) の 24 日目の記事(の再掲)です。
※YouTube埋め込みたくて[はてなブログに書いていた](http://satzz.hatenablog.com/entry/micro-bit-sequence)


## 何をつくるか

ボタンでリズムを作って鳴らすやつを作りたい。
なんて呼ぶのか分からないのだが機能的にはステップシーケンサーに近い？

## 部品をそろえる

8拍子コントロールするのにスイッチを8つ買うことにした。あとはmicro:bit使ってみることにした。
Amazonやスイッチサイエンスで部品を探してポチる。

### micro:bit

- [BBC micro:bit](https://amazon.co.jp/dp/B074M58PL7)

今回の主役。USB microケーブルでPCと接続し、Webで書いたプログラムを書き込む。

### タクトスイッチ

- [uxcell タクトスイッチ 瞬時タクタイルスイッチ 押しボタン 　 4ピンイン　DIP 12mm x 12mm x 8mm 10個入り](http://amzn.to/2C1OWNU)

もう一方の主役。ステップのON/OFFを制御するのに使う。好みでok。

### その他

- [BBC micro:bitエッジコネクタボード](http://amzn.to/2DAf8x6)
    - micro:bitの小さい入出力端子を使えるようにするのに使う。
- [ブレッドボード](http://amzn.to/2CYa44E)
    - 半田づけなしでサクッとプロトタイプするのに使う。
- [ブレッドボードジャンパー線](http://amzn.to/2D0cT5a)
    - ブレッドボード上の配線に使う。
- [メス・オスジャンパー線](https://www.switch-science.com/catalog/209/)
    - エッジコネクタボードのピンとブレッドボードを接続するのに使う。
- [ワニ口クリップ](http://amzn.to/2D1Z7iy)
    - イヤホンとmicro:bitを接続するのに使う。
- [イヤホン](http://amzn.to/2C0n3pr)
    - 普通の安いやつでok。micro:bitのスピーカーモジュールを買う手もあるが、エッジコネクタボードと併用する方法がよくわからなかった。

ここに書いたのを買った場合、しめて7000円弱。LED周りはmicro:bitについているものをそのまま使えば買わなくてよい。

さらにマストではないけど配線上の電圧やスイッチの仕様などの確認でテスターが手元にあるとよい。

- [Sanwa(三和電気計器) デジタルマルチメーター PM-3](https://amazon.co.jp/dp/B000JQHB6G)

## 使う入力ピンを決める

入出力端子の一覧を見ながら、どのピンにデジタル入力がきたらON/OFFが変わるようにするかを考える。

- http://microbit-micropython.readthedocs.io/ja/latest/pin.html

LEDと共有されていないP5, P1, P8, P16, P2, P13, P14, P15をここでは使うことにした。
イヤホン出力はP0から行う。

## 配線する

ブレッドボードジャンパー、メス-オスジャンパー、ワニ口クリップを取り回して配線する。各タクトスイッチを押すと電源ラインが入力ピンと導通するだけのシンプルな回路。


![](https://cdn-ak.f.st-hatena.com/images/fotolife/s/satzz/20171222/20171222144056.jpg)


エッジコネクタボード上の配線は次のようにする。

- 3.3V(右から3つめのピン、赤いケーブル)をブレッドボードの電源ラインへ。
- P0(左から2つめのピン、左、赤ケーブル)をイヤホンジャックへ。
- GND(右から1/2つめのピン)をイヤホンジャックへ。
- 残りのデジタル入力ピンをタクトスイッチへ。

![](https://cdn-ak.f.st-hatena.com/images/fotolife/s/satzz/20171222/20171222143921.jpg)

イヤホンはジャックを買う必要はなく、ワニ口クリップでつなげばP0からの出力で音が出る。

![](https://cdn-ak.f.st-hatena.com/images/fotolife/s/satzz/20171222/20171222143851.jpg)


## 変数をつくる

せっかくなので、ブロックでのプログラミングをやってみる。

- https://makecode.microbit.org/

まず初期化で、必要な変数をつくる。

- 各ステップのON/OFFをtrue/falseで保持する配列
- 各ステップを表示するLEDの座標(x,y)を保持する配列

![](https://cdn-ak.f.st-hatena.com/images/fotolife/s/satzz/20171224/20171224014907.png)

## ON/OFFの値を変える
foreverループで8拍子分のステップを回す。毎ステップごとに全てのタクトスイッチの入力を読み、入力があれば該当するステップの変数のON/OFFを切り替える。

![](https://cdn-ak.f.st-hatena.com/images/fotolife/s/satzz/20171224/20171224015159.png)


## ON/OFFの値を出力する

まず、該当するステップの変数を見る。
OFFだったら何もしないで20ミリ秒待つ。
ONだったらLEDとイヤホンへ出力して20ミリ秒待ち、LEDを消す。
ここでLEDのどこかを光らせる・消すかを決めるのに、先ほど作っておいた座標配列を使う。次のステップに行く前に適当に(ここでは250ms)待つ。

![](https://cdn-ak.f.st-hatena.com/images/fotolife/s/satzz/20171224/20171224015532.png)

## 動かす

画面のシミュレータでも確認した後、プログラムのhexファイルをダウンロードしてFinder上でmicro:bitへドラッグする。

- https://youtu.be/YffYA7Trc4Q

動画にうつっていないのだが音はイヤホンから出ている。

## 感想

スイッチ入力はトグルスイッチを使えば変数の値の設定が楽になるだろうし、可変抵抗やアナログ入力を使えば、音程、BPMなども調整できるようになるはず。クリスマスソング鳴らすのもいいけど、自分で音をいじってみるのもなかなか楽しい。

## 参考書籍

これを買えば基本的なことはだいたいわかる。

- [micro:bitではじめるプログラミング ―親子で学べるプログラミングとエレクトロニクス (Make:PROJECTS)] (https://amazon.co.jp/dp/4873118131)
Ruby on Railsについてのまとめ

#はじめに
前回プログラミングの学習を始めるにあたり[学ぶ言語の大枠をまとめました](https://qiita.com/hak_chami/items/f666c2abfa078a4e722b)。
今回はこれからRailsを始めるため、Railsについてさらに調べたことをまとめます。

##Ruby on Railsの基本哲学
###DRY：Don't Rpeat Yourself（同じことを繰り返さない）
プログラミングをしていくうえで守るべき原則ひとつ、DRYの原則。
重複を避ける＝複数の場所に同じ（似たような）情報を置かない

重複して記述されているとどうなるか…

- 記述量が多く複雑になりコードを読むのが難しくなる
- 修正箇所が複数発生し、修正漏れなどがおこる可能性がある

DRYの原則を守ることで、**プログラムの可読性・保守性が高くなる。**

###CoC:Convention over Configuration（設定より規約）
Ruby on Railsにはファイル名の規約やテーブル定義の規約など様々な規約があり、この規約に則って記述することで記述量を大幅に減らすことができる。
規約から外れる場合だけ開発者自身でそのコードを書く必要が生じる。

**余計な記述を省けることで開発のスピードが上がる。**

##MVC（：Model・View・Controller）とルーティング
Ruby on RailsはMVCアーキテクチャ※に基づいて3つの部分で構成されている。
※アーキテクチャ＝基本設計や設計思想

###M：Model
**データベースを操作する仕組み**
Controllerからデータの追加や変更・削除の指示を受け実行する。
データベースのテーブルごとにModelが用意されている。
データベースのテーブルはモデルクラスとモデルクラスから生成されたインスタンスによって作られている。

###V：View
**ユーザに見せるインターフェイスのデザイン**
Viewは通常複数用意されており、おのおのHTMLのテンプレートのような形になっている。
テンプレートの中にはRubyのコードが埋め込んであり、要求されたアクションに応じて該当のテンプレートにControllerがModelから受け取ったデータを反映し、HTMLを生成する。

###C：Controller
**ユーザーリクエストをModelやViewと連携させる仕組み**
ユーザーからのリクエストを受けModelから必要な情報を受け取り、Viewによって生成されたHTMLを画面に反映させる。
ModelとViewに指示を出す司令塔のような役割。
Viewと同じく複数用意されており、さらに1つのControllerの中に複数のアクションが用意されている。

アクション＝アクションメソッド
ユーザーからのリクエストに対して具体的な処理を実行するためのメソッド。

###ルーティング
**URLとアプリケーションを結びつける仕組み**
ユーザーがブラウザを経由してアクセスしたURLとコントローラーのアクションを結びつける（＝処理を割り振ってい る）役割。
コントローラーの一部のようなもの。

###MVCとルーティングの関係を図にしたもの

これまでの情報をまとめて図にしてみました。

![MVC.png](https://qiita-image-store.s3.amazonaws.com/0/242529/a5ee9336-1002-66a7-eece-2f9ee94d5070.png)

##まとめ
勉強を始める前にまとめましたので理解し切れてない部分があるかと思いますが、ここでまとめたことを意識しながら勉強を進めて行きたいと思います。
Laravel5.1 ログインで’emailが必須です’とエラーがでる

全くのプログラミング初心者から約半年間PHPの勉強をしております。
低レベルの質問で大変恐縮ですが、教えてください。

Laravel5.1でサイト構築しているのですが、標準のログイン認証機能を少し変更して利用をしようとしております。
そこで、AuthControllerを以下のように変更しております。


   protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => 'required|max:255',
            'login_id' => 'required|max:255|unique:users',
            'password' => 'required|confirmed|min:6',
        ]);
    }

こちらでログイン画面からログインすると、emailが必須項目ですとエラーがでます。
viewやController,modelに「email」という文字は検索してもでてきません。
また、カラムにも存在しません。

原因を教えて頂けませんでしょうか。
【Flutter】iOSビルド時にFlutter Pluginのヘッダーファイルが見つからないエラー対処法

FlutterアプリでiOSビルド時にFlutter Pluginのヘッダーファイルが見つからないエラー対処法メモです。


## 対処法
XCodeで対象のヘッダーファイルを開いて、右ペインの `Target Membership` を `Project` から `Public` に変更する。

![](https://qiita-image-store.s3.amazonaws.com/0/123122/423bb388-5221-df0a-f048-285fcc6a6941.png)

:point_down: 

![](https://qiita-image-store.s3.amazonaws.com/0/123122/0103e1bc-d7c3-618b-d298-42809be82929.png)

ヘッダーファイルが複数ある場合は全てのファイルに対してこの操作をする必要があります。

## 環境
- Flutter 0.1.5
- Dart 2.0.0-dev.28.0
- iPhone X - 11.2

## エラー
エラー抜粋です。

```
/Users/rkowase/StudioProjects/stopwatch/ios/Runner/GeneratedPluginRegistrant.m:6:9: fatal error: 'firebase_admob/FirebaseAdMobPlugin.h' file not found
#import <firebase_admob/FirebaseAdMobPlugin.h>
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
```


## 補足
FirebaseのPluginを追加するときは、 [Add Firebase to your iOS Project  |  Firebase](https://firebase.google.com/docs/ios/setup) にあるとおり、XCode上から `GoogleService-Info.plist` を追加する必要があります。（Android Studioから追加してもXCodeで見るとファイルが認識されていない状態になります）
![](https://qiita-image-store.s3.amazonaws.com/0/123122/02c5c5ee-90c2-495b-cd3a-24ea4400ecc3.png)


## リンク
FirebaseAdMobPlugin.h file not found when using firebase_admob Plugin for Flutter - Stack Overflow
https://stackoverflow.com/questions/49473823/firebaseadmobplugin-h-file-not-found-when-using-firebase-admob-plugin-for-flutte

objective c - Swift compiler error: "non-modular header inside framework module" - Stack Overflow
https://stackoverflow.com/questions/24103169/swift-compiler-error-non-modular-header-inside-framework-module/24317456#24317456

"Made Podfiles use symlinks to local pods" not working · Issue #15099 · flutter/flutter
 https://github.com/flutter/flutter/issues/15099

PathProvider not found on iOS build - Google Groups
https://groups.google.com/forum/#!msg/flutter-dev/7QRk1RphLDE/5rLS4CciBwAJ

Firebase for Flutter
https://codelabs.developers.google.com/codelabs/flutter-firebase/#4

Add Firebase to your iOS Project  |  Firebase
https://firebase.google.com/docs/ios/setup
OpenVPN のアクセスログを保存しないようにする方法

# はじめに
OpenVPN では、クライアントからのアクセスログを記録することができますが、クライアントを常時 OpenVPN に接続してインターネットを使用していると、ログファイルの容量が膨大になってしまいます。自分の環境では、Mac や iPhone で数ヶ月 OpenVPN に接続してインターネットを利用していたら、OpenVPN のクライアントのログファイルだけで 20GB 近くまで膨れ上がってしまいました。

ログを記録しておくことはサーバ管理において非常に重要ですが、OpenVPN では容量削減のためにログを記録しないようにしておくのも一つの方法です。今回は OpenVPN におけるあらゆるログを記録しないようにする設定方法について説明します。

# サーバの設定ファイルを変更
やることはとても簡単です。サーバの設定ファイルを変更して、OpenVPN を再起動するだけです。以下のように、ログに関する設定をコメントアウトして無効化します。

```diff
- status     /var/log/openvpn-status.log
- log        /var/log/openvpn.log
- log-append /var/log/openvpn.log
- verb       3
+ ; status     /var/log/openvpn-status.log
+ ; log        /var/log/openvpn.log
+ ; log-append /var/log/openvpn.log
+ verb         0
```

OpenVPN の設定ファイルでは、行頭に `;` をつけるとコメントアウトすることができます。

`status`、`log`、`log-append` の 3 つはログの保存場所を指定する設定なので、これらをコメントアウトすることでログを記録させないようにします。また、`verb` はログの冗長度を数値で表したもので、`0` にすると、必要最低限のみのログだけ記録するようにします。

これで設定は完了です。

# OpenVPN の再起動
設定の変更を反映するために OpenVPN を再起動します。

```bash
$ sudo systemctl restart openvpn
```

以上でログが記録されないようになりました。お疲れさまでした。なお、OpenVPN のエラーなどで作業が必要になったときは、ログがヒントになっていることが多いので、変更を元に戻すことを推奨します。設定ファイルの変更後は OpenVPN の再起動を忘れずに行ってください。

# 参考サイト
* [OpenVPNのインストールとセットアップからインターネット接続までのガイドブック](https://ja.developers.noraworld.blog/openvpn-installation-and-setup-guidebook)
* [Ubuntu クライアントから OpenVPN サーバに接続する方法](https://ja.developers.noraworld.blog/how-to-connect-openvpn-via-ubuntu-client)
Redis Clusterのベンチマークを取る

Redis 公式の [redis-benchmark](https://redis.io/topics/benchmarks) は クラスターモードに対応していませんが、 [memtier_benchmark](https://github.com/RedisLabs/memtier_benchmark
) を使えば手軽に取れるというメモです。

- https://github.com/RedisLabs/memtier_benchmark

インストール
=====
https://github.com/RedisLabs/memtier_benchmark のREADMEの通り

### CentOS
```
$ sudo yum install autoconf automake make gcc-c++ 
$ sudo yum install pcre-devel zlib-devel libmemcached-devel

# CentOS6系の場合
$ wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
$ tar xfz libevent-2.0.21-stable.tar.gz
$ pushd libevent-2.0.21-stable
$ ./configure
$ make
$ sudo make install
$ popd
$ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:${PKG_CONFIG_PATH}

# CentOS7系の場合
$ sudo yum install libevent-devel

$ git clone https://github.com/RedisLabs/memtier_benchmark.git
$ cd memtier_benchmark
$ autoreconf -ivf
$ ./configure
$ make
$ sudo make install
$ memtier_benchmark --help
```

### Ubuntu
```
$ sudo apt-get install build-essential autoconf automake libpcre3-dev libevent-dev pkg-config zlib1g-dev

$ git clone https://github.com/RedisLabs/memtier_benchmark.git
$ cd memtier_benchmark
$ autoreconf -ivf
$ ./configure
$ make
$ sudo make install
$ memtier_benchmark --help
```

### Docker
```
$ git clone https://github.com/RedisLabs/memtier_benchmark.git
$ cd memtier_benchmark
$ docker build -t memtier_benchmark .
$ docker run --rm memtier_benchmark --help

# 実行はdocker runにargsを渡す
docker run --rm memtier_benchmark --help
```

実行
=======

```
# --cluster-mode をつけてクラスターのマスターノードの一つを指定します。
$ memtier_benchmark -s 127.0.0.1 -p 6379 --cluster-mode

# 例） パスワード指定、8スレッドで各スレッド100コネクション、データサイズランダムな500byte、SET:GETコマンドの割合が1:2、で20000リクエストを送信
$ memtier_benchmark -s 127.0.0.1 -p 6379 -a password --cluster-mode -t 8 -c 100 -R --ratio=1:2 -d 500 -n 20000
```
`スレッド数 * コネクション数 * リクエスト数` の数だけコマンドが送信されます。上記の例でいうと `8 * 100 * 20000 = 1600万`

より詳しいオプションはヘルプを参照してください。

```
$ memtier_benchmark --help
```