OmniAICreator/Qiita-1.07M huggingface dataset:
[Scala] ActorMaterializerのDIがうまくいかない

```scala
@singleton
class Hoge @Inject() (implicit system: ActorSystem, materializer: ActorMaterializer) {
  def fuga = Try {
    Http().singleRequest(
      HttpRequest(method = HttpMethods.GET, uri = "https://mikeneko.tk"
    )
  }
}
```

で実行すると以下のエラー

```
ProvisionException: Unable to provision, see the following errors:

No implementation for akka.stream.ActorMaterializer was bound.
```

ActorMaterializer のimplicitがないってエラーになります。
IntelliJでもちゃんとあるって判定はされているのですが・・・

調べてみても同じ記述方法でやってる人はいますね。
* https://blog.colinbreck.com/integrating-akka-streams-and-akka-actors-part-ii/
* https://www.programcreek.com/scala/akka.stream.ActorMaterializer

# ハマる(1回目)

色々試してみてわかったのですが、ActorMaterialは `()` の宣言で挙動が変わってきそうです。
一回外に出して確認してみます。

```scala
// これは通る
@singleton
class Hoge @Inject() (implicit system: ActorSystem) {
  implicit val materializer = ActorMaterializer()
  def fuga = Try {
    Http().singleRequest(
      HttpRequest(method = HttpMethods.GET, uri = "https://mikeneko.tk"
    )
  }
}
```

```scala
// これは通らない(ActorMaterializerにかっこがないだけ)
@Singleton
class Hoge @Inject() (implicit system: ActorSystem) {
  implicit val materializer = ActorMaterializer
  def fuga = Try {
    Http().singleRequest(
      HttpRequest(method = HttpMethods.GET, uri = "https://mikeneko.tk"
    )
  }
}

// 結果
could not find implicit value for parameter materializer: 
akka.stream.ActorMaterializer
```

つまり `ActorMaterializer` はActorMaterializerとして判断されておらず、 `ActorMaterializer()` で判断されるようになるみたいです。

理由として、 `ActorMaterializer()` は applyが呼ばれるのですが、 `ActorMaterializer` だとただオブジェクトを呼んでいるだけっぽいです。
applyできずに、エラーになっているっぽいですね。ただのオブジェクトをimplicitとして渡されても困るって感じでしょうか。

```scala
object ActorMaterializer {

  def apply(materializerSettings: Option[ActorMaterializerSettings] = None, namePrefix: Option[String] = None)(implicit context: ActorRefFactory): ActorMaterializer = {
    val system = actorSystemOf(context)

    val settings = materializerSettings getOrElse ActorMaterializerSettings(system)
    apply(settings, namePrefix.getOrElse("flow"))(context)
  }

  ...
}
```

ActorSystemがカッコ無しで通るのは、抽象クラスになっていてそもそもの作りが全然違うからでした。

```scala
abstract class ActorSystem extends ActorRefFactory {

  ...
}
```

# 更にハマる(2回目)

ならカッコ付きで宣言したらOK って思ったのですがここで新たな問題として `@Inject()` の後ろでimplicitとして定義したいのですがこの中で `ActorMaterializer()` という記述は使えません。カッコが使えないのです。（何故？）

ActorSystemはかっこなしとありで挙動が変わらなかったのでここに書いていますが、ActorMaterializerに関しては変わるので外に出すことにしました。やってることは同じなはず・・・

```scala
@singleton
class Hoge @Inject() (implicit system: ActorSystem) {
  implicit val materializer = ActorMaterializer()
  def fuga = Try {
    Http().singleRequest(
      HttpRequest(method = HttpMethods.GET, uri = "https://mikeneko.tk"
    )
  }
}
```

一旦これで。
毎回 ActorMaterializerを生成するのを防ぎたいという目標自体はクリアでき他のでこれでOKとします。
ラズベリーパイで温湿度を計測してデータをネット上に保存してグラフ化

##内容
- 温度と湿度を一定時間で計測しグラフ表示
- 計測データはローカルではなくネット上に保存

##使ったもの
- Raspberry Pi3 Model B
- DHT11
- python
- ambient

##コード
```python
import ambient
ambi = ambient.Ambient(チャネルID,"ライトキー")

import RPi.GPIO as GPIO
import dht11
import time
import datetime

# initialize GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()

instance = dht11.DHT11(pin=4)

while True:
    result = instance.read()
    if result.is_valid():
        print("Last valid input: " + str(datetime.datetime.now()))
        print("Temperature: %d C" % result.temperature)
        print("Humidity: %d %%" % result.humidity)
	r = ambi.send({"d1":result.temperature, "d2":result.humidity})
    time.sleep(1)
```

##疑問
プログラムの実行方法は、whileで行ったほうがいいのか、それともcronで行ったほうがいいのか、どっちが良いのかわからない。実行間隔が長い場合はcron、短い場合はwhileで良いのかな？
怠惰な人のためのAngular + Firebase(Hosting、Functions、Firestore)のローカルテスト環境の作り方

## 結論
Angularのビルドをウォッチモードで起動

```
$ ng build --watch
```

Functions用にTypeScriptのビルドをウォッチモードで起動

```
$ tsc -w
```

Firebaseのテストサーバーを起動

```
$ firebase serve
```

 `localhost:5000`にアクセス

→ **これでローカルテストがらくちん！！！**

### メリット
- CORSなどを気にせず、FirebaseでHosting、Functions、Firesotreを使ったサイトをFirebase上とほとんど同じ状況でローカルテストができる。
- Angular、Functionsどちらも編集ごとのビルドを自動でやってくれる。再起動いらない。
- Functionsを実際デプロイするととても時間がかかるが、ローカルなら素早くテストできる。

### デメリット
- Angularの`ng build`はホットリロードが効かないので編集したらブラウザのリロードは必要。そのさいキャッシュが残る場合もあるのでハードリロード推奨。
- Functionsを使用しないテストは`ng serve`単体の方がホットリロードが効いて便利


### その他
#### 環境変数を使用する場合はローカルに保存

```
$ firebase functions:config:get > .runtimeconfig.json
// gitにcommitしないように注意
```

#### Firebaseのプロジェクトを確認、選択
Firestoreは実際の環境を使用するので注意。

```
$ firebase list
$ // プロジェクトIDが出てくるのでその中から選ぶ
$ firebase use hogeID
```

#### `firebase serve`がうまく行かない時。
firebase-functionの3.1.0では動かなかったので3.0.2で

```code:package.json
"firebase-functions": "^3.0.2",
```
質問に当たっての心構え

## とりあえず質問しに行く、をやめる

「とりあえず質問をしに行けば何とかなるのでは」という気持ちで質問をしにいかない。

断言しておくが何ともならない。

```
質問しにいけば多少は何か分かるかな、分かったら嬉しいな
```

という考えが脳裏に浮かんではいないだろうか。

問題はそこだ。あなたがやっているのは質問ではなく、気持ちを紛らわせようとしている行為だ。

## 質問で、教えを求めに行く

明言する人はあまりいないが、仕事での質問は「教えを求めにいく行為」だ
(**回答** ではないことに注意を払って欲しい)

教えを求めにいく、という行為を意識するかどうかで質問の質が上がりも下がりもする。

ではそのやり方は？コツを書いておく。

* (1) 仕事をどこまで進めたかをまとめる
* (2) 何が分からないかを表現できるようにしておく
* (3) 質問しにいく(教えを求めにいく)

### (1) 仕事をどこまで進めたかをまとめる

あなたが実装をしているとしよう。

実装でつまづき始めて、30分ぐらい進捗がでない。

実装の手を止め、まずどこまで進められたかをメモ帳なり何なりでまとめる。

まとめたものは、質問される側に見せられるように保存しておく。

### (2) 何が分からないかを表現できるようにしておく

上記に加えて、何が分からないのかを **言葉で** 表現できるようにしておく。

* リーダーがタスク表に書いている タスクA に関連して
  * 「ユーザーを認可する」という言葉の意味が分からない
  * 「βサーバーにアクセスする」のアクセス方法が分からない
  * そもそも、機能の実現方法をイメージできない(どうやってやるのかわからない)

「分からない」とは、人に教えられるか、教えられないかで分別する

### (3) 質問しにいく(教えを求めにいく)

有識者と思しき人に教えを求めにいく。上司でも先輩でも同僚でもいい。

上の例だとリーダーに「どこまで進めたか」を共有し「分からないこと」をぶつける。

* タスクA について、これこれまでは実装が進められました
* すみません、そのうえで教えて欲しいことがあります
  * ユーザーを認可する、という表現を見たのが初めてです、どういうことを指すのか教えてもらえないでしょうか
  * βーサーバーにアクセスすると書いてありますが、アクセスする方法はどのような想定でいらっしゃるか、教えてもらえないでしょうか
  * そもそもですみませんが、機能の実現はどのような方法をイメージしていらっしゃるか、教えてもらえないでしょうか

質問している最中にも、分からないことがあったら、分からないことがなくなるまで質問をすることだ。

## 何が分からないか分からなくてしまった時は

実施したことまではまとめられたが、何が分からないか分からなくなってしまったら。

依頼者、上司、先輩、同僚に協力依頼をしよう。

「ここまでは分かったのですが、何が分からないのか分からなくなって困っています。

  一緒に問題点の整理をお願いしてよいでしょうか」

というのが一番良い。教えを求めるのではなく、助けを求めよう。
Python：グローバル変数

```Python
>>> gvalue = 0
>>> def t():
...     gvalue = 1
...
>>> t()
>>> gvalue
0
>>>
```
スコープが内側になると変数は隔離されます

```Python
>>> gvalue = 0
>>> def t():
...     gvalue = 1
...     print(gvalue)
...
>>> t()
1
>>> gvalue
0
>>>
```

代入時は隔離されますが、参照のみならグローバル変数を利用できます。
ただし、

```Python
>>> gvalue = 0
>>> def t():
...     print(gvalue)
...     gvalue = 1
...
>>> t()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in t
UnboundLocalError: local variable 'gvalue' referenced before assignment
>>>
```

グローバル変数として利用してから、代入を行うと、
前者はグローバル変数、後者はローカル（関数内）変数と解釈が食い違うため、エラーが発生します。
それを避けるために、グローバル変数を利用するときは

```Python
>>> gvalue = 0
>>> def t():
...     global gvalue
...     gvalue = 1
...
>>> gvalue
0
>>> t()
>>> gvalue
1
```

のように`global`で「グローバル変数を使う」と宣言してください。
(関数の一番最初で宣言するのが吉です。)

#まとめ

グローバル変数を使うとき
参照のみならグローバル宣言を行わなくてもよい。
（宣言してもいいしそっちのほうがわかりやすいけれど）
グローバル変数を操作する場合はしっかり宣言しましょう。
Linux版google chromeでホイールの速度を変える。

##本文入り口
本文短いです。
Firefoxからchromeに移行したんだがホイールの速度がやたら遅くて、人差し指の腹が痛くなった。
Firefoxのときはabout:configでmousewheel.default.delta_multiplier_yの値を変更するだけで良いのだが、chromeにはそういうのがないみたい。色々拡張機能を探して試したがイマイチだったので昼寝しようと目を閉じると、どこからか声が…

**imwheelで調整すればよくね?**

たしかに。

##本文 imwheelの設定
ということで、imwheelを設定したときのブックマークを[見つけた](https://wiki.archlinux.jp/index.php/Imwheel)。確かにアプリごとに設定できると書いてある。もうすでにインストールしてあるので設定ファイルをいじる。

```
gedit ~/.imwheelrc

".*"
    None, Up, Button4, 3
    None, Down, Button5, 3
```

これを、

```
"google-chrome$"
    None, Up, Button4, 3
    None, Down, Button5, 3
```

こうじゃ！
`".*"`は全てのアプリを対象にするこれを`"google-chrome$"`こうしてchromeだけを対象とするようにする。これで今までファイルマネージャーとかでも設定が効いてたのが効かなくなるけど、まあ別のそれはかまわないかな。Nemoでも設定を効かせたい場合はそれも書けばいい。あとはgeditとかも書けばいい。ここで続けて`".*"`で設定を書くとchromeの設定が上書きされるのかどうかはわかりません。
試すときは`imwheel`それから、システムマネージャーでimwheelを検索してkill、で設定ファイルを書き換えてまた同じ繰り返し。
最後に、linux mint19の場合はSetup Applicationsで下の方にあるプラスマークを選択してCustom commandで名前を、`imwheel`、commandを、`imwheel`でおわり。
それだけ。
linuxならわざわざ拡張機能とかchromeの設定とかいじらなくても、imwheelを使えばいいよってだけ。

##インストールの仕方

```
sudo apt install imwheel
```

それで、

```
touch ~/.imwheelrc
gedit(もしくはnvimとかvim) ~/.imwheelrc
```

全アプリが対象なら、

```
".*"
    None, Up, Button4, 3 <= (3のとこを変える)
    None, Down, Button5, 3 <= (3のとこを変える)
```

特定のアプリが対象なら、

```
"おそらくここにコマンド$"
    None, Up, Button4, 3
    None, Down, Button5, 3
```
これで上手く行かなければ[ここ](https://wiki.archlinux.jp/index.php/Imwheel)を参考に色々試してみたら良いと思います。最後に、

```
imwheel
```
でおわり。
##参考
https://wiki.archlinux.jp/index.php/Imwheel
http://pagent.github.io/2015/05/13/mouse-wheel-scroll-speed/
https://qiita.com/ys22_/items/f87c05a1141092c1d548
libMagickWand-6.Q16.so.3: cannot open shared object file: No such file or directory - /home/circleci/project/vendor/bundle/gems/rmagick-2.16.0/lib/RMagick2.so

#事象
CircleCiで`bundle install`を実行し、rspecのテストを走らせた時に発生。

An error occurred while loading ./spec/models/hoge_spec.rb.
Failure/Error: require File.expand_path('../../config/environment', __FILE__)

LoadError:
  libMagickWand-6.Q16.so.3: cannot open shared object file: No such file or directory - /home/circleci/project/vendor/bundle/gems/rmagick-2.16.0/lib/RMagick2.so

#原因
不明。特にrmagick絡みは弄っていなかったが、急に発生した。

#対処
アンインストールしてインストールしたら直るよ的な投稿を発見。
https://stackoverflow.com/questions/16684544/libmagickcore-so-4-cannot-open-shared-object-file-no-such-file-or-directory

CircleCiで`vendor/bundle`フォルダをキャッシュ→リストアしていたので、一時的にコメントアウトしてをリストアしないようにした。

```
# Restore bundle cache
# - restore_cache:
#     keys:
#       - rails-hoge-{{ checksum "Gemfile.lock" }}
#       - rails-hoge-
```

問題なくテストが通りました。
プロキシ環境下でのFTP(コマンドライン)

proxy環境下でsftpではくftpを実行したかったのでインストールから使用まで．．．

***termnalからproxy設定***

```
export http_proxy=プロキシ:ポート
export https_proxy=プロキシ:ポート
```
確認
```export```

***homebrewインストール***

```
/usr/bin/ruby -e "$(curl -x http://プロキシ:ポート/ -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
```Enter →　password```
確認
```brew help```
***ftpインストール***

```
brew install tnftp
```
ftp使い方

```
ftp 接続ユーザー名@接続先サーバ名 or IPアドレス
ftp>
```

#ftpコマンド
|        |        |
|:----------------:|:-----------------:|
| pwd             |              カレントディレクトリの確認 |
| cd           |            ディレクトリの移動 |
| ls             |              カレントディレクトリ内の確認 |
| quit               |                終了 |
| put               |                インポート |
| get               |                ダウンロード |
Laravel+Passport+Vue.js+axiosでPost通信ができない

#環境
* Laravel 5.8
* Passport 7.3
* Vue.js 2.6.10

#問題

Vue.jsのaxiosを使用してAPI通信をする際、認証機能としてPassportを使用しました。
取得したトークンをリクエストのヘッダーに追加して非同期通信をしてもらいたく書いたコードがこちら

```js

axios.get(
     APP_URL,
     {
          headers: {
               "Content-Type": "application/json",
               "Authorization": 'Bearer ' + token
          }
     },
     ).then(function(response) {
          console.log(response);
     }).catch(function(error) {
          console.log(error);
     }
);

```

GET通信はこれでうまくいきました。
しかし、これをそのままPOST通信に変えると途端に４０１エラー、つまりは認証失敗になってしまいます。

#解決策
headersにいれるときの書き方を変えるとうまくいきます

```js

axios.defaults.headers.common['Authorization'] = "Bearer " + token;
axios.post(
     APP_URL,
     {
          headers: {
               "Content-Type": "application/json"
          }
     },
     ).then(function(response) {
          console.log(response);
     }).catch(function(error) {
          console.log(error);
     }
);
```

#残った疑問
ただ```headers```にいれるだけではなく、```axios.defaults.headers.common```を介さないとだめな理由がわかりませんでした
bootstrap.jsで記述されてる例もありましたが、トークンが変わるときとか大丈夫なんでしょうか

そのあたりお詳しい方コメントいただけると幸いです

[参考記事](https://github.com/laravel/passport/issues/839)
多言語化されたWindows Installerを 作成する

# はじめに
多言語対応のWindows Installer(MSI)を作成した手順が複雑だったので、成功した方法をメモ。
今回は日本語版のWindowsでは日本語が表示され、それ以外では英語が表示されるようなインストーラーを作成した。

# Windows Installerの作成概要
[WiXToolset](https://wixtoolset.org/)というWindows Installer を作成するツール群が用意されており、割と簡単にWindows Installer（msi拡張子のやつ）を作成することができる。
簡単に作成手順を説明すると..

1. wxsファイル(xml形式のインストーラーのソースのようなもの)を用意する。
   - `test.wxs`
2. heatコマンドでインストールするファイルのフラグメント作成する。（`test_files.wxs`が生成される）

    ```shell
    >> heat.exe c:\InstallerFilesPath`
    ```
3. candleコマンドで中間ファイル（wixobj）を生成する。

    ```shell
    >> candle.exe test.wxs -out test.wixobj
    >> candle.exe test_files.wxs -out test_files.wixobj
    ```
4. lightコマンドでインストーラー(msiファイル)を生成する。

    ```shell
    >> light.exe test.wixobj test_files.wixobj -out installer.msi
    ```

# 多言語化したWindows Installerの作成概要

1. wxsファイルを用意する。言語に関する箇所を修正する。(以下は単言語版から修正した箇所の抜粋)
 
    ```xml:test.wxs
    <Wix>
        <Product Language="1033">
            <Package Launguages="1033,1041" />
            <Directory>
                <Merge Language="1033" />
        ...
    </Wix>
    ```
このあたりの1033や1041はWindowsのregion IDみたいなもので[ここ](https://www.science.co.il/language/Locale-codes.php)にテーブルがある。
2. heatコマンドでインストールするファイルのフラグメント作成する。  （`test_files.wxs`が生成される）

    ```shell 
    >> heat.exe c:\InstallerFilesPath
    ```
3. candleコマンドで中間ファイル（wixobj）を生成する。

    ``` shell 
    >> candle.exe test.wxs -out test.wixobj
    >> candle.exe test_files.wxs -out test_files.wixobj
    ```
4. lightコマンドで英語版インストーラー(msiファイル)を生成する。

    ``` shell
    >> light.exe test.wixobj test_files.wixobj -cultures:en-US -out installer_en.msi -pdbout installer_en.wixpdb
    ```
5. lightコマンドで日本語版インストーラー(msiファイル)を作成する。

    ```shell
    >>  light.exe test.wixobj test_files.wixobj -cultures:ja-JP -out installer_jp.msi -pdbout installer_jp.wixpdb
    ```

6. torchコマンドで英語版と日本語版の差分を抽出

    ```shell
    >> torch.exe -t language installer_en.msi installer_jp.msi -out 1041.mst
    ```
7. wisubstg.vbs で差分ファイルを統合する。(wisubstg.vbsはwindows sdkのインストールフォルダにある。)

    ```shell
    >> cscript wisubstg.vbs installer_en.msi 1041.mst 1041
    ```


これで日本語以外のWindowsでは英語で、日本語Windowsでは日本語が表示されるインストーラーが作成できた。
4または5のlightコマンドで`light.exe : error LGHT0309 : Failed to open merge module for validation.`が発生する場合は、WindowsのOS言語設定をen-USに変更すると動いた。

#参考サイト
- http://www.02.246.ne.jp/~torutk/windows/wixandwixedit.html
- http://prins-note.blogspot.com/2010/02/msi.html
Qtプロジェクトファイルの変数の値をコマンドラインで取得する

何らかの解析でQtプロジェクトファイルの変数の値を知りたいとします。

しかし、Qtプロジェクトファイルはそれなりに複雑であり、正規表現などで変数の値を取り出すのは難しいです。
(書式が整っていれば可能な場合もある)

qmakeにプロジェクトファイルを実行させ、実際に変数に入っている値を出力させましょう。

このようなプロジェクトファイルを作ります。

```:inspect.pro
TEMPLATE = aux
CONFIG(release, debug|release):log($$fromfile($$TARGET_PRO, $$VARIABLE))
```

そして、qmakeのコマンドラインで対象のプロジェクトファイルと変数名を渡すと、変数の値が出力されます。

```
qmake "TARGET_PRO=path/to/target/target.pro" "VARIABLE=TARGET" -nodepend -nomoc -nocache
```

# 例

```:target.pro
FOO=bar
```

```
> qmake inspect.pro "TARGET_PRO=target.pro" "VARIABLE=FOO" -nodepend -nomoc -nocache
bar
```
Xamarin.AndroidでResources.Designer.csが更新されない問題に終止符を打った

# パターン1

.xmlが怒られてる

→.xmlの使い方が間違っています。

# パターン2

症状：
大量のファイル名の変更や変数名の変更を行ったあとビルドできない

## やる前の注意点

`.csproj`の構造がまるっきり変わる可能性があり、Git管理のときに困ります。
（そのため、この方法は応急処置としていいかもしれません）

#手順

＃１　問題の`***.Android.csproj`をテキストエディタで開く
＃２　ItemGroup直下にあるAndroidResource要素を全て消す

```xml
<ItemGroup>
  <AndroidResource Include="hogehoge">
    <!-- -->
  </AndroidResource>
  <AndroidResource Include="fugafuga">
    <!-- -->
  </AndroidResource>
</ItemGroup>
```
＃３　`Resources/`ディレクトリを一旦プロジェクトから外す
＃４　Visual Studio再起動（念の為）
＃５　`Resources/`ディレクトリを再びプロジェクトに入れる（Resources.Designer.csがアップデートされる！）

## 原因

おそらくですがシミュレーター実行中などのVisual Studioがbusyなときに`Resouces/`直下のファイルの名前を変えると発生します。
これを意識してみたら発生しにくくなるかもしれません。

`Resouces/`直下は思った以上にデリケートなんですね。

## まとめ

プロジェクトをクリーンしてVisual Studio終了させて`bin/` `obj/`を消して`Resouces/`直下を退避して再起動して戻してリビルドしたらいける
→　いけない

ってときに有効だと思います。csprojが荒れるのであくまでも最終手段ですが。
非エンジニアの社長にReactとは何かを説明する②

# 非エンジニアの社長にReactとは何かを説明する②

※よく分からんと言われたので[非エンジニア向け解説](https://qiita.com/xx2xyyy/items/a88ff4c0f81c25b54d6a)作りました。

[前回](https://qiita.com/xx2xyyy/items/2074ea483745e2f3ea2d)の続きです。
さて、前回はWebページに動きを付けているのはJavaScriptであり、
ReactはそのJavaScriptをうまく使うための道具(ライブラリ)であることまで説明しました。

とはいえ、React以外にもJavaScriptのライブラリは多くあります。(古くはjQuery,似たような世代ではVueやAngularなど)
これからその中でReactを採用するメリットについて説明していきます。

## VirtualDOM/JavaScriptと速度問題
まず、Reactの一番の特長である、VirtualDOMについて解説します。

とはいっても、いきなりVirtualDOMという言葉だけ出されても何のことやらとなってしまいますので少し話を戻します。

前回説明したように、現在のリッチなUIを作るのには、JavaScriptが欠かせません。
しかしながら、このJavaScript,使い方を誤るとUXの方を大きく損なってしまいます。
というのも、JavascriptでHTML形式のデータを書き換える「DOM操作」と呼ばれる処理は重いのです。
少し値を書き換えるくらいだったらそこまででもないのですが、構造の組み換えなど一部の処理を行ってしまうとかなり遅くなります。
画面の描画中は基本的に操作を受け付けられないので、ユーザーとしてはかなりのストレスが溜まります。

このような状況を避けるため、フロントエンドエンジニアは負荷の大きい処理が可能な限り少なくなるように工夫しなければなりません。

### 開発効率とチューニングの対立
が、この負荷を軽減するためのチューニングは開発効率を下げます。
ロジックの複雑性が増すからです。

簡単なTODOリストを例に考えてみましょう。
複数人のタスクを管理し、表示対象のメンバーを切り替えられるとします。

例:

Aさんのタスク

* 作業1
* 作業2
* 作業3

これを、切替処理を行うと、

Bさんのタスク

* 作業4
* 作業5

に変更するような機能です。

この機能を実装する上で、エンジニアとしては「作業を描画する」「描画されている作業を消す」の二つだけで実現できると都合がいいです。

作業の書き換えを「元々の作業を消す」＝＞「次の作業を描画する」という形で実装すると、
元々ある機能(作業を描画する)を流用できますし、一回全部消してしまえば前と次の差のパターンなども考える必要がありません。
複雑性が増すとバグや仕様追加時の対応コストがどんどん増すのでなるべくシンプルに済ませたいのです。

が、DOM操作をこの発想でやるとろくなことになりません。
速度を考えると、表示欄の追加や削除はコストが大きいので雑に扱ってはいけません。
きちんと変更前後のタスク数を比較して、最小限の増減に抑える処理を入れるべきです。

こうなると、当然書くロジックは増え、必然的にバグの発生しうる要素も増え、テストにかける工数も増えます。
フロントエンドで速度を追求していくと、必要工数がどんどん増えてしまうわけです。
望ましくない状況です。

### 面倒なところはReactがやってくれる
ここで登場するのがVirtualDOMです。
ReactはVirtualDOMを利用することで、描画部分の最適化を自動で行ってくれます。

Reactは実際のHTML形式データとは別に、描画すべき構造をReact内で管理しており、これがVirtualDOMです。
Reactを利用する場合、開発者は直接DOM操作を行うわけではなく、Reactに「こういう内容を描画したい」という情報を渡します。(例えば、Cさんのタスクとして作業6個描画したいとか)
そうするとReactはまず自分の中に持っている仮想DOMにその変更情報を渡して最終的にどのようなデータになるかを計算します。
その上で、最終的な完成形と内部で計算したデータを比較して最小限の差分だけ実際に適用するのです。
(例えば、前のBさんのタスクは2つだったからタスク欄は4つだけ足す。1番目のタスクはBさんとCさんで共通だから変更なし、など)

Reactに描画の管理を任せると、エンジニアはシンプルなロジックを書いているだけなのに、Reactが勝手に最適化をしてくれるようになるわけです。素晴らしい。

## 今回のまとめ
* 速いWebページのためには描画の最適化が必要だが非常に面倒臭い
* ReactはVirtualDOMによってそれを代行してくれるすごい奴

も少し[続き](https://qiita.com/xx2xyyy/items/6101f6180ce748718eb7)ます。
サンプルサイズと効果量ｄについて

# 目的
データ分析・統計も学んでいます。
今回は、その中でも
母集団から取り出すサンプルサイズの大きさと効果量ｄについて
学んだことをアウトプット・共有します[^1]。

WEB上にはいろいろな資料がありますが、
大事なのは、自分自身で腑に落とせるか、なので
ここでの説明で腑に落ちる人がいれば幸いです。

# 結論
サンプルサイズは、効果量ｄ（＝正規分布の重なり具合）をどの程度にするかで検定前に決めることができる。

これをしないと、検定の妥当性が低くなったり、過大なサンプル収集を行うリスクが出る。


# 中心極限定理
ある母集団から何個かのサンプルを取り出して（＝抽出）、
サンプルの持つデータの平均値を計算する。
この作業を繰り返す。
横軸に平均値、
縦軸に抽出回数、
にして、データをプロットすると、正規分布になる。

このときの正規分布のばらつき：標準偏差（σ）は1回の抽出のサンプル数が多いほど
小さくなる。  
このことは、
「母集団からサンプル数を多くとればとるほど、母集団の特性（真の平均値）をより強く抽出できるよ！！」
って感じで直感的に納得できると思います[^2]。
この考えを中心極限定理といいます。



<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408801/3ea57caf-aac6-c956-a3e4-13ddf6eb3156.jpeg", width=50%>




# サンプルサイズと有意性
二つのデータグループ、
A:東京都民全員
B:自分の親族30人
を考えてください。

この二つのグループの平均年齢を推定し、両グループ間に有意な差があるかを判断したいとします。つまり、自分の親族の平均年齢は諸事情で東京都都民の平均年齢とは異なる、ということを検証したいとします。

なお、このグループA,Bの平均値が完全に一致するほうが”むしろ異常”であるという直感を持っていてください。

ここで話を簡単にするために、Bグループはすでに真の平均値（全員の年齢の平均値）を
把握しているとします。この値をμB=３５歳としましょう。

Aグループは母集団が大きいため、真の平均値を知ることはできません。
そのため、標本を採って真の平均値を推定するとします。
このサンプリングの結果、標準偏差σA=５歳で、μA=３２歳だったとします。
（つまり、この標本はピークが32歳で、およそ±５歳のばらつきを持つ正規分布に従う）

さて、このグループの平均値の差（μAーμB）は有意なのでしょうか？？

この時点では、
「有意ではない」
と判断しえるかもしれません。
なぜなら、σA=５で、μA=３２の正規分布なら、μB=３５は統計上の誤差といえる値だからです。




しかし、ここで、（何かの陰謀を持って）検定者が
「どうしても、この差は有意である、と言いたい！」
と強い意思をもって、作為的に「有意である」としたいと考えたら
彼は何をするでしょうか？
（有意という事柄に関しては、今回は説明を省略します）

それは
「グループAのサンプル数をできるだけ増やして、σAを小さくする」
です。
これをすると、何が起きるのでしょうか？
ここで、前節で紹介した中心極限定理が効いてきます。

中心極限定理を極端に考えると、  
結局、”母集団そのもの全体”をサンプルとして取ってきて、平均を取ればσ＝０となり、真の平均値を得ることになります。  
これをすると、
正規分布の幅（ばらつき）が無くなります。
その結果、μBがμAと完全に一致しない限り、この平均の差は有意な差であると判断できてしまうのです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408801/2bd96410-1469-e13d-2e48-c1564c269e74.jpeg", width=50%>




でも、
サンプル数を増やせば、どんな平均の差も有意に持ち込める。
。。。これはおかしいですよね。

このような統計結果の作為的な操作を抑止するために導入するのが、効果量ｄです。

# 効果量ｄ
効果量ｄは両グループの平均の差を、両グループの標準偏差の加重平均で割ったものです。
ｄ＝（μA－μB）／（σAとσBの加重平均）　　（今の場合、σBはゼロ）
イメージとしては
二つのグループの正規分布の重なり具合を示す指標です。

ｄが大きいほど、重なりは小さいです。
ｄが小さいほど、重なりは大きいです。

<img, src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408801/bc95b8ad-cee4-c373-4e05-943df6f2d5e0.jpeg", width=50%>




__以下の解釈があっているか悩み中です。ご指摘いただけると嬉しいです__


Q.効果量どういった値を取ればいいのか
A.小０．２、中０．３～０．５、大０．８から取るのがいいようです。
小中大での値は分野ごとに異なるようなので、一概に「この値！」とは言えません。
また、小中大のどれを取るかも決まりはないようです。
大事なのは、おおよそこれらの値に入るように検定しなさい、ということです。

例えば効果量ｄ＝０．３を採用した場合、平均の差が３歳（＝μA－μB）だった場合、標準偏差σAは１０歳が必要になる計算です（３／１０＝０．３）。このように効果量と標準偏差を決めると、サンプルサイズを指定することになります（サンプルが少ないとσAは10歳より大きくなり、サンプルが多いと、σAは10歳より小さくなる）。

ですので、統計を行う前に、
１．効果量をおおよそ決める
２．得られるであろう平均の差を予想する
３．効果量と平均の差によって、最適なサンプル数が求まる



また、自分が当初勘違いしたこととして、
「効果量ｄは大きければ大きいほど良いor小さければ小さいほど良い」
という究極論発想をしていましたが、前述したように、ある程度値の間に収めることが大事です。

以下参考にした投稿
[効果量とは何か](https://qiita.com/fhiyo/items/9cb2b05b36566ffe0eff)

# おわりに

次はR言語を使ってグラフを書きます

[^1]: 昔、トリビアの泉という番組で何かの事象を検証するという企画がありました。その中で、「どれくらのサンプル数を取れば、十分なのか？」という疑問に統計学者が「～くらいのサンプルを取ればOK!」と言っていたことを思い出します。当時小学生の自分は「？何適当なこといってんだ？」という感じでしたが、今は理解できます。
[^2]: 統計学の基本的考えは「如何に少ないデータから母集団の特性を得るか」ということなので、むやみやたらにデータを増やすのは、良くない思考です。推定に必要なデータ量を見積もって、最低限のコストで母集団の特性を知るべきです。
Algoliaの発行するクエリの中身を探ってみた

<h1>やること・動機</h1>
AlgoliaのAPI叩いた時にどんなクエリが発行されるか見てみる。

実はAlgoliaのAPI、返ってきたデータをLaravel側でソートできないのです。
ソートというのはorderByとかsortByとかです。
実行するとこんなエラーになると思います。

クエリ発行時にはソートできないのですが、取得したコレクションに改めてソートをかけることは可能です。

なぜソートできないのだろう。。と思ってAlgolia特有のsearchメソッドがどんなクエリを発行しているのか見てみようと思いました。

<h1>クエリ確認のメソッドをコントローラーに記述</h1>
コントローラー内のクエリログをみたいメソッドを以下のように書きます。

```BookController.php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Book;
use Illuminate\Support\Facades\DB;


class BookController extends Controller
{

    public function search(Request $request)
    {
        //ここからクエリ監視開始
        DB::enableQueryLog();

        $data = Book::search($request->str)->get();
       
        //Algoliaの場合は結果を取得したあとにソートをかける
        $books = $data->sortBy('id');
        $result = DB::getQueryLog();

        //監視終了と結果出力
        foreach($result as $r){
            dump('クエリ:'.$r['query'] .'実行時間:'. $r['time'] / 1000 . '秒');
           
        };
        
        return view('book.search')->with('books',$books);
                                  
    }
}
```

`getQueryLog()`だけではログ取得できないので`enableQueryLog()`を先に書かなければなりません。
ちなみに取得できるログ内のtime要素の単位はミリ秒なので秒に変換するために1000で割っています。

結果はこんな感じで出ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454650/c7a88716-a381-f447-9f5a-203df9114a42.png)

Algoliaは検索結果をデータベースのidを配列で返して、それをLaravel側でデータベースに検索をかけて引っ張ってきていることがわかりました。なるほど〜。
実際にとってきたidも見たい場合はコントローラーに以下のように追加してください。

```BookController.php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Book;
use Illuminate\Support\Facades\DB;


class BookController extends Controller
{

    public function search(Request $request)
    {
        //ここからクエリ監視開始
        DB::enableQueryLog();

        $data = Book::search($request->str)->get();
       
        //Algoliaの場合は結果を取得したあとにソートをかける
        $books = $data->sortBy('id');
        $result = DB::getQueryLog();

        //監視終了と結果出力
        foreach($result as $r){
            dump('クエリ:'.$r['query'] .'実行時間:'. $r['time'] / 1000 . '秒');
            dump($r['bindings']); //追加
           
        };
        
        return view('book.search')->with('books',$book);
                                  
    }
}
```
こんな結果になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454650/7ad70323-9615-4235-22b7-342a1e5bc2e4.png)

クエリを見ているだけなのでソートされていないと感じますがこれで合ってます。
ソートされているのは$bookの方なので。


<h1>最後に</h1>
ログとか見たことありませんでしたが、絶対今後使うと思いますしめちゃめちゃ勉強になりました。
<h1>参考ページ</h1>
[Laravelで実行されたSQLを確認する](https://qiita.com/rinkun/items/7521e3d7be8c6e915f9d)
【SpringBoot】ファイルの配列/リストとその他データを同時にPOSTする【Axios】

以前書いた記事について、今度は複数ファイルをリストとしてPOSTするやりかたをまとめます。

[【SpringBoot】ファイルとその他データを同時にPostする【Axios】 \- Qiita](https://qiita.com/wrongwrong/items/3e9b7b04d004ed71d921)

# エンドポイント
エンドポイントは以下のような形になります。
このサンプルでは配列として受け取っていますが、`List<MultipartFile>`として、リストの形で受け取ることもできます。

```java
@PostMapping("/api/test")
public void create(
        @RequestParam("intValue") Integer intValue,
        @RequestPart("uploadFiles") MultipartFile[] multipartFile,
        @RequestPart("form") @Valid SampleObject sampleObject,
        BindingResult errorResult
) {
    /* 内部処理 */
}
```

## 注意点
SpringBootのエンドポイントは一ファイルの容量/リクエストの総容量に制限が有るため、必要に応じてサイズ制限を緩和する必要があります。
このやり方については以下にまとめてあります。

[【SpringBoot】アップロードするMultipartFileの最大サイズを変更する \- Qiita](https://qiita.com/wrongwrong/items/d3060a9094f59cfead31)

# POST側
以下のコードで、「ファイルの複数選択 -> 開く or キャンセルでPOST関数を呼ぶ」形を想定しています。

```html
<!-- 選択と同時にpostが呼ばれる、multiple指定のため複数選択できる -->
<input type="file"
 @change="postFilesWithForm" multiple/>
```

POSTする関数は以下の通りです。

```javascript
postFilesWithForm(ev) {
  const formData = new FormData()

  // フォームデータのサンプル
  const form = {
    formData: 'hogehoge'
  }

  // Blob化したフォームを追加
  formData.append('form', new Blob(
    [JSON.stringify(form)], { type: 'application/json' }
  ))

  // ファイルを追加
  Array.from(ev.target.files).forEach(file => formData.append(`uploadFiles`, file))

  /* formDataを使ったPOST処理 */

}
```

工夫したのは以下3点です。

- JSONのデータについては`type: 'application/json'`を指定する
- `append`は同じプロパティに対して繰り返せばよしなに配列として扱われるため、そのまま入れる
- （`FileArray`は`forEach`できないため、`Array.from(ev.target.files)`する）

以上のやり方で、ファイルの配列/リストとその他データを同時にPOSTできます。

# 参考にさせて頂いた記事
- [javascript – ファイルリストでforEachを使用できない \- コードログ](https://codeday.me/jp/qa/20190301/343957.html)
- [spring\-mvc \- 複数のファイルをアップロードする \| spring\-mvc Tutorial](https://riptutorial.com/ja/spring-mvc/example/10366/%E8%A4%87%E6%95%B0%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B)
ローカル環境にセットアップしたwordpressの管理画面が出せなくなった。

MAMPを使ってローカル環境にセットしていたwordpressの管理画面に入れないという現象が起きたため、
試したことを書きました。

①localhost/wp-login.phpにアクセスしてみる。
上手くいきませんでした。
似たような状況に陥った方が作成した記事を参考にしてみたのですが、ケースが異なっていたみたいです。
404 Not Found が表示されます。

②localhost/wp/wp-login.phpにアクセスする。
これもダメでした。
同じエラーが表示されます。

③FTP Filezillaを使う。
これも上手くはいきませんでした。
そもそもlocalhost:8888にデータが入っていないことが原因と考えられるこのエラー。
サーバーにアクセス出来ませんでしたと、エラーメッセージが表示されます。

④MAMPのOpenWebStartボタンを押し、phpMyAdminにアクセス。
作成したデータベース（私の場合はwordpressでした。）ごと削除。
新しくwordpress.orgからwordpressをダウンロードし、MAMPのhtdocsに格納する。
これで上手くいきました。
なんとか再びダッシュボードにログインできました。
私の場合は作成していたブログ記事のバックアップを取っていたのでことなきを得ましたが、もっと苦労される方も多かったでしょう。
【Rails】Railsサーバーのプロセスを強制終了させる方法

# 使うコマンド

実行中のプロセスを確認

```terminal:ターミナル
lsof -i:3000
```

プロセスを停止する

```terminal:ターミナル
kill -9 プロセス番号
```

# まとめ
上記の方法でプロセスを強制終了できます。
コマンド+Wタブを閉じてたら、
勢い余ってIDEごと落としてしまい…

already running...
みたいな表示を良く出してしまったので。。
メモとして残しておきます。
E2Eテストのテストデータの削除

# はじめに
turnipとchromedriverを使った、RailsのE2Eテストの導入を検討しています。こちらの記事で、[turnipで、FactoryBotを使用して初期データの作成及びその利用](https://qiita.com/ginbae/items/4c619252f4f378f3c73e)まで成功しましたが、テスト後にtestデータベースにデータが残ってしますので、それを削除する仕組みを導入します。

# 環境
macOS Majave 10.14.5
ruby 2.4
Rails 5.0.4
database_cleaner 1.7.0

# 結論
[DatabaseCleaner](https://github.com/DatabaseCleaner/database_cleaner)という、gemを入れました。

``` Gemfile
group :development, :test do
  gem 'database_cleaner' # 追加
end
```

``` zsh
bundle isntall
```

``` spec/spec_helper.rb
require 'database_cleaner' # 先頭に追記

RSpec.configure do |config|
  ...
  DatabaseCleaner.stategy = :truncation
  
  # RSpecの実行前に1度、実行
  config.before(:suite) do
    DatabaseCleaner.clean
  end

  # rspecでいうexample、turnipでいうシナリオが終わるごとに実行
  config.before(:each) do
    DatabaseCleaner.clean
  end  

  # 最後に1度、実行
  config.after(:suite) do
    DatabaseCleaner.clean
  end
  ...
end
```

これで、テスト実行後の、testテーブルは毎回空になるようになりました。
勉強会イベントを開催するときにきをつけること

勉強会やイベントをやってみたいけどよくわからない人向けに、まとめてみました。

# 事前準備  
## 日程決め  
ワンオペになるとすごいつらいので、お手伝いの人員確保しておくとよい  

## スケジュール設定
だれが何分受け持つなどの詳細を考える。
休憩時間も考えておくとよい。


## 会場の申請関連  
入場の発券システム、空調、施錠、飲食可否についてとか確認しておくとよい  

## 資材確認  
ディスプレイとかマイクの有無の確認。可能なら動作確認もしておくとベター 

## 周知  
飛び入り参加やキャンセルにも対応できるように、周知とあわせて連絡先や連絡方法も併記しておくとよい  

# 当日  
## 名簿準備  
出欠席チェックのため、ペンと名簿あればわかりやすいよ。
出席したひとにはノベルティなど渡せるとスムーズ

## 会場案内
早い段階でトイレ、退場時の案内をしておくといよい。
案内板などがあるとわかりやすいよ。

## 案内は二度言う
騒がしかったり、聞き逃すことがあるのでマイクを使った案内は二度言う。
JFreeChart-PolarChart-極座標-UIで特定データを強調する


目次 ⇒ [JFreeChartサンプル](https://qiita.com/artery/items/3e9c63e5c14a9e965c97)

```java
package jp.avaj.lib.chart;

import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.PolarPlot;
import org.jfree.chart.renderer.DefaultPolarItemRenderer;
import org.jfree.chart.renderer.PolarItemRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

/**
■ JFreeChart-PolarChart-極座標-UIで特定データを強調する

・ArcPolarChartEmphasizeWinを使用するとデータ選択の画面が表示される.
・ボタンを押下すると、当該データが強調表示される.

・(1)データセットはXYSeriesCollectionを使う.
・(2)データには角度と値を指定する.
  ・角度はラジアンではなく度.
・(3)レンダラはDefaultPolarItemRenderer.
・軸は一つだけ必要で、NumberAxisを指定した.
・プロットはPolarPlotというものがあるので、これを使う.

 */
public class Chart20_02 {
  // PolarChar/極座標.
  A_Chart20 a_Chart20;
  // 目次-Artery-JFreeChart用のライブラリ
  A_Chart00 a_LibChartSampeContents;

  public static void main(String[] args) {
    XYSeriesCollection dataset = new XYSeriesCollection(); // (1)
    XYSeries data0 = new XYSeries("data0");
    data0.add(0.0D, 2.0D); // (2)
    data0.add(90.0D, 13.0D);
    data0.add(180.0D, 9.0D);
    data0.add(270.0D, 8.0D);
    dataset.addSeries(data0);
    XYSeries data1 = new XYSeries("data1");
     data1.add(90.0D, 0.0D);
    data1.add(180.0D, 22.0D);
    data1.add(250.0D, 18.0D);
    data1.add(355.0D, 10.9D);
    dataset.addSeries(data1);
    //
    DefaultPolarItemRenderer renderer = new DefaultPolarItemRenderer(); // (3)
    NumberAxis radiusAxis = new NumberAxis(); //(4)
    PolarPlot polarPlot = new PolarPlot((XYDataset)dataset,(ValueAxis)radiusAxis,(PolarItemRenderer)renderer);
    JFreeChart jfreeChart = new JFreeChart("PolerPlot",(Plot)polarPlot);
    //
    ChartFrame cFrame = new ChartFrame("PolerPlot",(JFreeChart)jfreeChart);
    cFrame.pack();
    cFrame.setVisible(true);
    //
    new ArcPolarChartEmphasizeWin(cFrame,polarPlot,dataset);
  }
}

```


![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/c430437d-88f8-6b0a-defa-dc85067c8fcd.png)
オブジェクト指向の中身をキーワード別に分けてみる

# オブジェクト指向の中身をキーワード別に分けると

## カプセル化

- ~~使い手に関係のないものは見せない~~
- C#の場合は、使い手に関係のないものは見せない
- JavaScriptやPythonのように、情報隠蔽できないオブジェクト指向言語もある

### 見せた場合

- 変更してほしくない部分を変更させる可能性がある
- 使って欲しい操作を読み取ってもらうのに時間がかかる

### 例 ) テレビ

- テレビをそうする時にわざわざテレビの中に入っている回路はいじらせない
  - なぜか？回路いじってたら動かなくなったなんて言われたらたまったもんじゃない
- テレビを見たい人はチャンネル、音量、電源のオンオフができれば満足
  - 無駄な情報はない方がいい

## 継承

- 元になるクラスのメンバーを引き継ぎながら新たな機能を追加、修正、上書きする仕組み

### 継承をしないと

- 似たようなものを作りたいけど、細部は違うようなものを作りたくなった場合に１から作る必要が出てくる
- コピペの嵐

### 例 ) 車のオプション

- カーナビが付いていない車にカーナビを付けて欲しいと言われて、その車を１から作り直すことはない
  - 元から完成している車にカーナビを外付けする

- 汎用的なベースになる車(一般人用)のようなものを作っておいて、特殊な機能が必要になった時に後付けしたり部品をバージョンアップしたりする

## ポリモーフィズム
- 難しいので別記事で

# 終わりに
改めて記事にしてみると、理解度の足りなさが露呈してしまいました。
何か、認識が間違っていましたら、ご指摘いただけると嬉しいです！
オブジェクト指向とは

# オブジェクト指向とは

- また使いそうな部分はいつでも使えるように分けておこう指向
- 一度書いた処理を「再度使いたくなった時」に、もう一度書く必要がないようにする

## 例 ) 車を10色のバイエーションで製造する場合

### Bad (非オブジェクト指向)

- 全ての色の車を生産ラインで１から新規に組み立てる
  - １０色のバリエーションを作る場合１０回同じ作業をする必要が出てくる
- 時間がかかる
- 作る分だけ同じ作業をしなければいけい

### Good (オブジェクト指向)

- 最初に色をつける前の車をテンプレートを作成しておく
  - テンプレートを量産し色を付ける作業だけ別途行う
- 1度テンプレートを完成させてしまえば、色付け作業のみに集中できる
- 全く同じ構造なので一括修正する場合も素早く全台に対応できる

# 終わりに
改めて記事にしてみると、理解度の足りなさが露呈してしまいました。
何か、認識が間違っていましたら、ご指摘いただけると嬉しいです！
E2Eテストをchromedriverでやる場合の、FactoryBotの初期データ作成

# はじめに
turnipを使った、E2Eテストを実装したくテストデータの作成に、FactoryBotを使用。turnipのテスト開始時に、初期データを作成するものの、turnipのstepの中からは作成した初期データにアクセスできるが、E2Eテストで使っている、chromedriverの画面（controllerでも）からは、テストデータにアクセスができない。

# 環境
- macOS Mojave 10.14.5
- ruby 2.4.0
- Rails 5.0.4

# 結論
``` spec/rails_helper.rb
RSpec.configure do |config|
  # ...

  config.use_transactional_fixtures = true

  # ...
end
```
'config.use_transactional_fixtures'の部分が'true'になっていると、データは永続化されないので、stepの中からはアクセスできても、chromedriverが参照しているDBは相変わらず空のまま。

この部分を、'config.use_transactional_fixtures = false'にしたら、testデータベースにデータが保存されるようになりました。

# 動作の変化をログで比較
変更前

``` log/test.log
(0.2ms)  BEGIN
(0.2ms)  SAVEPOINT active_record_1
SQL (0.4ms)  INSERT INTO `articles` (`title`, `body`, `created_at`, `updated_at`) VALUES ('TEST_TITLE1', 'TEST_BODY1', '2019-07-25 09:30:17', '2019-07-25 09:30:17')
(0.1ms)  RELEASE SAVEPOINT active_record_1
```

変更後

``` log/test.log
BEGIN
SQL (0.2ms)  INSERT INTO `articles` (`title`, `body`, `created_at`, `updated_at`) VALUES ('TEST_TITLE6', 'TEST_BODY6', '2019-07-25 09:18:31', '2019-07-25 09:18:31')
(0.4ms)  COMMIT
```

ログから、'RELEASE SAVEPOINT active_record_1'というのが消えて、通常通りのインサート文になりました。

# どのような状況で必要になったか
例えば以下のようなテストをturnipで行いたい場合。

``` spec/steps/articles_steps.rb
# conding: utf-8

step 'サイトにアクセスする' do
  Capybara.app_host = 'http://localhost:3000'
end

step 'articlesの初期データを作成する' do
  create_list(:article, 10) # ①テストデータの作成
end

step 'アーティクル一覧画面を表示する' do
  visit 'http://localhost:3000/articles'
end

step '記事が10件表示されていること' do
  puts Article.all.count # 10と表示されちゃんと①のデータが作成されている。
  
  # しかしchromedriverからは、10件のデータにアクセスできない。
  expect(page).to have_content '10件'
end
```

# 課題
テストが終わったあとに、testデータベースにデータが残るので、最後にクリーンアップする方法を検討する。

# 追記
[こちらの記事](https://qiita.com/ginbae/items/98a48eee375ab596b00f)で、database_cleanerを導入しました。
Jboss GC状況確認 備忘



##GCログ関連のパラメータ
Jboss起動時にJavaVMに渡すパラメータ
standaloneモードの場合、standalone.confで設定
domainモードの場合、host.xmlに設定


 | 項目 | 内容
--- | --- | ---
1 | -verbose:gc | GCログを出力する
2 | -Xloggc:”ログファイル名” | 指定したログファイル名へGCログを出力する
3 | -XX:+PrintGCDetails | GCの詳細情報を出力する
4 | -XX:+PrintGCDateStamps | GCログに日時を出力する
5 | -XX:+UseGCLogFileRotation | GCログをローテーションする
6 | -XX:NumberOfGCLogFiles=x | ローテーションをxファイル行う
7 | -XX:GCLogFileSize=xM | GCログサイズがxMBに達した場合、ローテーションを行う

システムのスローダウンや一定時間無応答になる場合GCログの解析が必要なことが多い
GCログはJbossを起動するたび再作成されるのでgc.logはバックアップしておくのが無難

##GCログの可視化
↓ GCViewerを利用
https://github.com/chewiebug/GCViewer/wiki/Changelog

グラフ化しないと状況がわかりずらいためGCログと合わせて必須のツール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222266/bf5dd32e-85f4-b581-dbb9-46599e4ae277.png)

##Jstat
JDK標準でバンドルされているコマンドjstatを利用する
JVMの統計情報をモニターする際に使用

**-gcオプションでJavaヒープ領域の全容量を取得**

 | 項目 | 内容
--- | --- | ---
1 | S0C	 | Survivor 領域 0 の現在の容量 (KB)
2 | S1C	 | Survivor 領域 1 の現在の容量 (KB)
3 | S0U	 | Survivor 領域 0 の使用率 (KB)
4 | S1U	 | Survivor 領域 1 の使用率 (KB)
5 | EC	 | Eden 領域の現在の容量 (KB)
6 | EU	 | Eden 領域の使用率 (KB)
7 | OC	 | Old 領域の現在の容量 (KB)
8 | OU	 | Old 領域の使用率 (KB)
9 | PC	 | Permanent 領域の現在の容量 (KB)
10 | PU	 | Permanent 領域の使用率 (KB)
11 | YGC	 | 若い世代の GC イベント数
12 | YGCT	 | 若い世代のガベージコレクション時間
13 | FGC	 | フル GC イベント数
14 | FGCT	 | フルガベージコレクション時間
15 | GCT	 | ガベージコレクション総時間

**-gcutilオプションで使用率を表示**

```linux:
[hoge@hostname ~]$jstat -gcutil 21567 1000 10
引数は"プロセスID" "取得間隔ミリ秒" "取得回数"

  S0     S1     E      O      P     YGC    YGCT    FGC    FGCT     GCT

 12.44   0.00  27.20   9.49  96.70    78    0.176     5    0.495    0.672

 12.44   0.00  62.16   9.49  96.70    78    0.176     5    0.495    0.672

 12.44   0.00  83.97   9.49  96.70    78    0.176     5    0.495    0.672

  0.00   7.74   0.00   9.51  96.70    79    0.177     5    0.495    0.673

  0.00   7.74  23.37   9.51  96.70    79    0.177     5    0.495    0.673

  0.00   7.74  43.82   9.51  96.70    79    0.177     5    0.495    0.673

  0.00   7.74  58.11   9.51  96.71    79    0.177     5    0.495    0.673
```

##
GCやヒープメモリの使用状況は可視化しないとよくわからないためjstatもExcelなどでグラフ化は必要
【Vue.js】オブジェクトをwatchした時、fromとtoで同じオブジェクトが帰ってきていた

プロパティをまとめて監視したかったのでオブジェクトを用意して監視していたのですが、表題のところでつまづきました。
解決したので備忘録です。
# watchのおさらい
```index.html
<div id="app">
    <input type="text" v-model="num">
</div>

<script>
    new Vue({
        el: '#app',
        data: {
            num: 0,
        },
        watch: {
            num: {
                handler: function(to, from) {
                    console.log(from + ' -> ' + to);
                }
            },
        },
    })
</script>
```
numを監視して、変更前と変更後をconsoleに吐き出す簡単なアプリケーションです。
ここまではなんの問題もなく動きます。

# オブジェクトを監視するとうまく動かない
```index.html
<div id="app">
    <input type="text" v-model="obj.num">
</div>

<script>
    new Vue({
        el: '#app',
        data: {
            obj: {
                num: 0,
            }
        },
        watch: {
            obj: {
                deep: true, // オブジェクト内のプロパティを監視対象に含めるためdeepをtrueに
                handler: function(to, from) {
                    console.log(from.num + ' -> ' + to.num);
                }
            },
        },
    })
</script>
```
上記のように記述した場合、obj.numを変更してもconsoleには変更前と変更後に同じ値が出力されてしまいました。
シャローコピーされた値が帰ってきているためこのような現象になるのだと思います。

# 算出プロパティを監視して解決
```index.html
<div id="app">
    <input type="text" v-model="obj.num">
</div>

<script>
    new Vue({
        el: '#app',
        data: {
            obj: {
                num: 0,
            }
        },
        computed: {
            computedObj: function() {
                return Object.assign({}, this.obj); // ディープコピーしたものを返す
            },
        },
        watch: {
            computedObj: { // 算出プロパティを監視
                deep: true,
                handler: function(to, from) {
                    console.log(from.num + ' -> ' + to.num);
                }
            },
        },
    })
</script>
```
ディープコピーした値を返す算出プロパティを用意し、その算出プロパティを監視するようにしました。

fromとtoは別参照のオブジェクトになったため無事正しいオブジェクトが帰ってきました。


参考：https://github.com/vuejs/vue/issues/2164
EBSのボリュームをダウンタイムゼロで拡張する


#概要
こんにちわ！[OCEAN'S](https://qiita.com/organizations/oceans)の大庭です。

今回は本番で稼働しているEBSの使用量が99％を超えたのでダウンタイムゼロでボリュームを拡張します。

そもそも可能か？
2017年にEBSがUPDATEされ、それ以降はダウンタイム無しでボリューム変更が可能になりました

#サービス稼働中の本番サーバーでボリューム拡張する
まずはじめにWEBサーバーにログインし容量を確認します

```console
# lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  400G  0 disk
└─xvda1 202:1    0  400G  0 part /

# df -kh
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        7.4G   60K  7.4G   1% /dev
tmpfs           7.4G     0  7.4G   0% /dev/shm
/dev/xvda1      394G  390G  4.2G  99% /
```

・現在EBSのボリュームサイズ４００Gを利用しています。
・使用量99%
・空き容量が4.2G


---
Aws Management Console上から
EBS→ボリューム→アクション→ボリューム変更を選択
![スクリーンショット 2019-07-25 16.10.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132493/1b710186-6561-a694-ad9e-5766dcf77713.png)

---
ボリュームを400から800に変更します
![スクリーンショット 2019-07-25 16.13.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132493/42e9f9a7-3582-f337-c544-9f120c19adb6.png)

---
内容を確認し「はい」を選択。

![スクリーンショット 2019-07-25 16.14.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132493/0352a7fd-2647-d8ef-245f-15bb7ca21bbb.png)

Statusが黄色から、グリーンになれば完了です。
実際に400G→800Gに変更が完了するのに約2時間かかりました。
![スクリーンショット 2019-07-25 16.18.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132493/041beee5-f841-bcca-89a7-90a265cc6625.png)

OS上から確認します
ルートボリュームである、xvdaのSIZEが800Gになっていますが、まだパーティション（xvda1）のサイズは400Gのままです。
※余談ですが2時間まっている間に使用量が100%になりました。急ぎましょう。


```console
# lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  800G  0 disk
└─xvda1 202:1    0  400G  0 part /

# df -kh
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        7.4G   60K  7.4G   1% /dev
tmpfs           7.4G     0  7.4G   0% /dev/shm
/dev/xvda1      394G  390G  3.8G 100% /
```

---
ボリュームに紐づくパーティション(xvda1)の拡張を行います

```console
# growpart /dev/xvda 1
CHANGED: disk=/dev/xvda partition=1: start=4096 old: size=838856670,end=838860766 new: size=1677717470,end=1677721566

# lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  800G  0 disk
└─xvda1 202:1    0  800G  0 part /

# df -kh
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        7.4G   60K  7.4G   1% /dev
tmpfs           7.4G     0  7.4G   0% /dev/shm
/dev/xvda1      394G  390G  3.7G 100% /
```
└─xvda1 のSizeが800Gになりました

※df -kh のコマンド結果がまだ394Gのままです。

---
最後にresize2fsコマンドにて、ファイルシステムのサイズを新しいボリューム容量に変更します。

```console
# resize2fs /dev/xvda1
resize2fs 1.43.5 (04-Aug-2017)
Filesystem at /dev/xvda1 is mounted on /; on-line resizing required
old_desc_blocks = 25, new_desc_blocks = 50
The filesystem on /dev/xvda1 is now 209714683 (4k) blocks long.
```
成功しました。確認します

```console
[root@nadia tmp]# df -kh
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        7.4G   60K  7.4G   1% /dev
tmpfs           7.4G     0  7.4G   0% /dev/shm
/dev/xvda1      788G  390G  398G  50% /
```

無事に拡張されました！

# 所感
今回は本番サーバー稼働中にボリュームを拡張しましたが、ダウンタイムはもちろん負荷なども含めサービスへの影響はなく拡張することができました。
ディスクサイズがこれだけ容易に拡張できるとはいい時代になったなとしみじみ思います。
Neo4j #3 個人的に詰まったところ

# はじめに
自分の紹介をしておきますと, 当方関東の大学のB4で, Python, C, Java, SQLが書けます. インターンしている会社でNeo4jを触って詰まったところをリストアップしていこうと思います.かなり基礎的ですがこの記事は自分のメモとして利用しています. ご容赦ください...

# データ消去
## リレーションが入り組んだ場合のDELETE
リレーションはノードありきのため, リレーションだけでは存在できない. そのためリレーションが存在するノードを消去したいとき, リレーションを先に消去する必要がある.しかしながらノードにリレーションが入り組んでいる時,いちいちリレーションを消去するのはめんどくさい. そんな時は`DETACH DELETE`というコマンドを使うことでノードに関係するリレーションも勝手に断ち切ることができる.

```
MATCH (n)
DETACH DELETE n
```

## 大量データをDELETEするとき
大量データをグラフにした後に前述のDETACH DELETEでは消去しきれないことがあった(2019年3月時点). そこでデータが保存されている場所にアクセスして物理的にrmコマンド等で消去することができる.
データは\<neo4j-home\>/data内のgraph.dbに保存されているのでそこを物理的に消去してあげると良い.

# LOAD CSV周り
## ファイルを置くべき場所
Neo4jのCypherという言語にはCSVファイルからデータを取ってくる処理を行うLOAD CSVというコマンドがある.これは入手したCSVファイルを元にグラフを構築することができるというものである.まずLOAD CSVでファイルを取ってくるときにファイルを\<neo4j-home\>/import内に置くことで

```
LOAD CSV FROM "file:///hogehoge.csv.gz"
```
のコマンドを打つことで取ってくることが可能である.

## USING PERIODIC COMMIT
また, 大量のデータをLOAD CSVを用いて取得する際に

```
USING PERIODIC COMMIT <数字(約500くらい)>
```
というコマンドを打つことでJavaのヒープメモリのオーバーフローを防ぐことができる.

# 重複で取ってくることを防ぐ
データが複雑であると, データの中に誤って重複が含まれてしまうことがある. そんな時に重複が含まれないように制約を課すことが可能である.以下のようにクエリを書く.

```
CREATE CONSTRAINT ON (u:User) ASSERT u.id IS UNIQUE
```
また, この制約を取り除きたい場合は下記のように記述すれば良い.

```
DROP CONSTRAINT ON (u:User) ASSERT u.id IS UNIQUE
```

# ノードのIDとid
自分で任意で属性として設定するidの他にノードやリレーション作成時にノード, リレーション固有のidが必ず自動的に付加される. 下図のように\<id\>として表される. 

<img width="334" alt="スクリーンショット 2019-07-25 18.05.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287300/da09375b-4ca1-6c58-1bdb-609b8e6fcb2f.png">
この固有のidを元に参照したい時は下記のように記述する

```
MATCH (n)
WHERE id(n) = 4
RETURN n
```

# apoc, algo導入
Neo4jには[apoc](https://github.com/neo4j-contrib/neo4j-apoc-procedures)と[algo](https://github.com/neo4j-contrib/neo4j-graph-algorithms)という拡張ライブラリが存在し, これによりNeo4jでできることを増やすことができる.拡張ライブラリを利用するためには, github上のjarファイルを\<neo4j-home\>/pluginsに保存してあげる必要がある. apocのダウンロードは下記のようにコマンドラインに入力すると良い.

```
$ cd $NEO4J_HOME/plugins
$ wget https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases/download/3.5.0.4/apoc-3.5.0.4-all.jar
```
一方algoについては以下のようにインストールする.

```
$ git clone https://github.com/neo4j-contrib/neo4j-graph-algorithms
$ cd neo4j-graph-algorithms
$ git checkout 3.3
$ mvn clean install
$ cp algo/target/graph-algorithms-*.jar $NEO4J_HOME/plugins/ $NEO4J_HOME/bin/neo4j restart
```
ただしこれだけでは実行ができない. \<neo4j-home\>/conf/neo4j.confに下記のように記載する必要がある.

```:neo4j.conf
dbms.security.procedures.unrestricted=algo.*,apoc.*
dbms.security.procedures.whitelist=algo.*,apoc.*
```

# まとめ
また触ってみて詰まったところだったりがあったら記載していこうと思います. とにかくNeo4jは日本語の記事が少なかったり, 大幅アップデートによりクエリの書き方が大きく変化しているなどのせいか古い記事が役に立たなかったり等々あるので,参考になれば幸いです.
Neo4j 入門 #1 (インストールおよび起動)

# 目的
Neo4jを勉強する必要に迫られた時, コードを書けるようになるためには英語の文書を大量に読み理解する必要がある. かつ, Neo4jに関する日本語の記事も存在するが投稿数が少ないうえ丁寧でないものも多く, 自分が学習する際に詰まることが多々あった. そこでNeo4jの学習の敷居を下げる目的と共に,自分がつまづいたところを列挙できれば他人が学習する時に役に立つのではないかと考えている.

# Neo4jとは
Neo4jはJavaで実装された, オープンソースの最も人気のあるグラフデータベースである. グラフデータベースはグラフ構造を持ったデータの保存, 探索, 集計に最適化されたデータベースを指す.

# インストール方法
事前にJDKをインストールする必要があるので[こちら](https://www.oracle.com/technetwork/java/javase/downloads/index.html)からインストール.
Neo4jは[このサイト](https://neo4j.com/download/)からインストールができる.

## CUIのインストール(推奨)
GUIを入れるのはいちいちめんどくさい(容量も食うし). GUIに近いインターフェースをWeb上で利用ができるためCUIで十分である. ただし, GUIのインストール方法は後述しておく. GUIをインストールする際はこの項目は飛ばして良い.
### Dockerでのインストール
まず, Dockerでインストールする場合は, DockerHubに公式のNeo4jレポジトリがあるので, 

```
$ docker pull neo4j
```
で完了である.

### brewでのインストール

```
$ brew install neo4j
```

で完了する.

### 起動方法

```
$ neo4j start
```
でNeo4jを実行できる.実行時にコマンドラインに

```
Active database: graph.db
Directories in use:
  home:         /usr/local/Cellar/neo4j/3.5.0/libexec
  config:       /usr/local/Cellar/neo4j/3.5.0/libexec/conf
  logs:         /usr/local/Cellar/neo4j/3.5.0/libexec/logs
  plugins:      /usr/local/Cellar/neo4j/3.5.0/libexec/plugins
  import:       /usr/local/Cellar/neo4j/3.5.0/libexec/import
  data:         /usr/local/Cellar/neo4j/3.5.0/libexec/data
  certificates: /usr/local/Cellar/neo4j/3.5.0/libexec/certificates
  run:          /usr/local/Cellar/neo4j/3.5.0/libexec/run
Starting Neo4j.
Started neo4j (pid 20944). It is available at http://localhost:7474/
There may be a short delay until the server is ready.
See /usr/local/Cellar/neo4j/3.5.0/libexec/logs/neo4j.log for current status.
```
と出力されている. これより [http://localhost:7474/](http://localhost:7474/)に接続することでWebブラウザ上下図のように表示され, 利用できる.
<img width="1440" alt="スクリーンショット 2019-07-19 16.57.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287300/21cb0fc0-0fac-1f1c-f190-b838cfe2f175.png">

この際パスワードはneo4jと入力すると自分の独自のものに変更するように命じられる.

## GUIのインストール
本項ではMacの場合のみについて解説する.
まずはインストーラ(.dmgファイル)を開いて, 下図の画面に遷移し, アプリケーションフォルダにドラッグ&ドロップする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287300/986f71e7-234d-a3b1-ebbc-27d43e211ccb.png)

起動したら下図のような画面に遷移するので, アカウント連携を行い, 認証を行う.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287300/099fa61c-5020-c8d3-e778-8764bda73c27.png)

*ここまではドキュメントの画像を流用しています...

続いて下のような画面が出るのでNewボタン(赤丸)をクリックしプロジェクトを作成する.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287300/b11f7ddb-90c4-066a-cd4d-822cf394c48f.png)

続いて, Add Graphをクリックし, Create a Local Graphをクリックすると次の画面のようになる.
<img width="1002" alt="スクリーンショット 2019-07-19 16.18.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287300/0ab3a549-2bfc-a64f-8ce6-e3bd6c35e634.png">

Graphの名前とパスワードを決めた後にCreateボタンをクリックすると次の図のようになるので, Startを押し, Manageボタンを押し, その後の画面でOpen Browserボタンを押すことで接続ができる.
<img width="1001" alt="スクリーンショット 2019-07-19 16.26.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287300/948fd325-6c3d-07ad-9643-e652fc146d36.png">

# 次回予告
Neo4jをインストールし起動ができるようになったところで, Neo4j特有の予約語について説明をしていくこととする
\#2は[こちら](https://qiita.com/flystaslingan40/items/4d1eff881275ebffe6b3)
Railsなどのメモ帳

#メモ帳
+ CRUD (Create, Read, Update, Delete)

| CRUD     | SQL     | Rails                            |
|:--------:|:-------:|:--------------------------------:|
| Create   | INSERT  | create/create!, save/save!       |
| Read     | SELECT  | find, find_by, where, allなど     |
| Update   | UPDATE  | update/update!, save/save!など    |
| Delelte  | DELETE  | delete/delete!, destroy/destroy! |

[https://web-nari.net/2018/07/03/ruby-on-rails-crud-1/](https://web-nari.net/2018/07/03/ruby-on-rails-crud-1/)

+ generate コマンド別生成ファイル

|コマンド名          |コントローラ|ビュー|モデル|マイグレーション|アセット|ルート|テスト|ヘルパー|
|:-----------------:|:--------:|:----:|:---:|:------------:|:----:|:----:|:---:|:-----:|
|scaffold           |○|○|○|○|○|○|○|○|
|scaffold_controller|○|○|×|×|×|×|○|○|
|controller         |○|○|×|×|○|○|○|○|
|model              |×|×|○|○|×|×|○|×|
|migration          |×|×|×|○|×|×|○|×|

[https://maeharin.hatenablog.com/entry/20130212/rails_generate](https://maeharin.hatenablog.com/entry/20130212/rails_generate)

+ rails sever起動後routesを確認するURL: [http://localhost:3000/rails/info/routes](http://localhost:3000/rails/info/routes)

+ タイムゾーンを日本にする

```ruby:config/application.rb
#moduleの中に↓を追加
config.time_zone = 'Tokyo'
```

+ 数値のみを出すパターンマッチ  
str =~ /^[0-9]+$/

+ スマホサイト作成時の画面サイズについて
```html:スマホ向けサイト作成時の画面サイズ
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
```
VisualStudio C# から SQLServer への接続 

## 概要

地味に接続で時間喰ったので掲載


## 環境
VisualStudio 2017 (C#)
SQLServer 2012


## コード

```C#:DBAccess.cs

void Test02()
{
 SqlConnection connection = new SqlConnection();
 SqlCommand command = new SqlCommand();
 var dt = new DataTable();


 try
 {
  command.Connection = connection;
  connection.ConnectionString = @"Data Source=[server];Persist Security Info=True;Initial 
  Catalog=[dataBase];User ID=[id];Password=[pass];";
 
  // データベースの接続開始
  connection.Open();

  // SELECT文を設定します。
  command.CommandText = "SELECT * FROM [tableName] " ;

  // SQLの実行
  var adapter = new SqlDataAdapter(command);
  adapter.Fill(dt);

  }
  catch (Exception exception)
  {
  Console.WriteLine(exception.Message);
  throw;
  }
  finally
  {
  // データベースの接続終了
  connection.Close();
  }
 } 
}
```
## かかったとこ
テンプレは見つかるけど結局コネクトのとこで躓いてた
treeコマンドでディレクトリ構成図を書く

下記のようなディレクトリ構成があるとする

```
sample1
    ├── hoge
    │   └── 1
    │       └── one.txt
    └── huga
        └── 2
            └── two.txt
```

`cd sample` で `sample` ディレクトリに移動する。

`tree | pbcopy` で `tree` コマンドの出力結果がクリップボードにコピーされる。

それを貼り付ける。(コマンド実行場所は `.`　になるのであとでディレクトリ名に変える)

```
.
├── hoge
│   └── 1
│       └── one.txt
└── huga
    └── 2
        └── two.txt
```
SRA toolkitの使い方

あまり使わないコマンドなのでメモ用に取っておく。

最新版は[こちら](https://www.ncbi.nlm.nih.gov/sra/docs/toolkitsoft/)からダウンロードしてください。

##使ったバージョン
2.8.2-1 (CentOS Linux 64 bit用）

##使用例

SRAをダウンロードするとき

```
#単体の場合 （--max-sizeはなんとなくつけてます）
prefetch --max-size 200G SRR123456

#複数のSRAをダウンロードしたいとき
prefetch --max-size 200G --option-file <SRA list>
```

SRAからFASTQに変換するとき

```
#Single-endの場合
fastq-dump SRR123456.sra

#Paired-endの場合
fastq-dump --split-files --defline-seq '@$ac:$si:$sn $ri:N:0:' --defline-qual '+' SRR123456.sra
```
Paired-endの場合、--split-filesオプションをつけないとsingleとして出力されてしまいますので、ご注意を。