OmniAICreator/Qiita-1.07M huggingface dataset:
深層学習（前編 2）：「Section3 : 過学習」

特定の訓練サンプルに対して過剰に学習してしまい、テスト誤差と訓練誤差の学習曲線が乖離することを過学習と呼ぶ。原因としてはネットワークの自由度（層数、ノード数、パラメータの値等々）が高いため発生するため、ネットワークの自由度に制約をかけることで防ぐことができる。正則化手法を利用して過学習を抑制することができる。
正則化手法では、誤差関数にpノルムを加えることで計算する。
En(w) + 1/p*λ*||x||p
||x||p = (|x1|p + … +|xn|p)^1/p
pが1のとき、L1正則化、2のときL2正則化と呼ぶ。
またドロップダウンと呼ばれる、ランダムにノードを削除して学習させることでノード数を減少する手法がある。
forループ内のaddEventListenerで詰まった


#・forループ内でのaddEventListener複数生成について
・forループ内でのaddEventListenerが動かない・・・
・【原因】スコープ問題
・【対処法】即時関数がいい
・おまけ　DOMで習得できるelementの塊について


##複数addEventListenerを作りたいけど動かないです。
やりたいこと→取得したtargetクラス（複数ある）の子要素に、クラスをつけ外ししたい。
書いたのがこちら。

```javascript

var togList = document.getElementsByClassName('target');

for(var i = 0;i<togList.length;i++){
    togList[i].addEventListener('click',()=>{
    togList[i].firstElementChild.classList.toggle('pull');
    });
}
```

**ちっとも動かない！**

##原因
スコープが問題だった。varで宣言された変数は関数内で参照が可能なので、
addEventListenerの値がループが終わり切ったiの値を参照指定していたのが問題。
→他の言語で出現するブロックスコープがないらしい。なんですって！（letを使えばブロックスコープが作れるとのこと）

##【私がとった対処法】即時関数

**即時関数とは？
関数を定義し即時に実行される関数。これを使うことでスコープの汚染を防ぐことができます！

```javascript
for(var i = 0;i<togList.length;i++){
   (function(n){
       togList[n].addEventListener('click',()=>{
           togList[n].firstElementChild.classList.toggle('pull');
       });

   })(i);
}
```

即時関数でラッピングして、それにiを渡しています。
これで一つ一つのaddEventListenerが正しいnを参照できますね。

【追記】
varではなくてletを使った方がいいかも。

##おまけ　DOMで習得できるelementの塊について
DOMでelementを習得する場合、getElementsByClassNameやquerySelectorAllなどは、elementの集合体を習得することになってしまいます。

この集合体は主に二種類の型があります。

**HTMLCollection**・・・
getElementsByClassName、getElementsByTagName、childrenなどで習得される。
動的なので、要素の増減がすぐに反映される。

**NodeList**・・・
querySelectorAllで習得される。
静的なので、要素の増減が即時に反映されない。

静的・動的の使い分けに気をつけなければならない。大変...!
短冊メーカー「願う」をリリースしました

# [https://negau-tanabata.web.app/](https://negau-tanabata.web.app/)

願いを入力して作成された画像をtwitterに投稿できるだけのサービスです。
実際に使っていただければわかりますが、作成された画像はOGPによってリンクに紐付けられています。

## 作るまでの経緯

もうすぐ七夕だな～って6/28に思いました。
文字列をそれっぽく短冊風の文字列に変換するサービスが有るのは知っていたので、画像に簡単にできそうだな～と思い、実装をはじめました。
とにかく勢いを大切にしました。完成度はお世辞にも高いとは言えませんが…

## 作り始めて

画像の自動生成は30分ほどでできました（細かい調整は無しで）。
どちらかというと、細かい部分をどういう実装にしていくか、という部分で時間がかかり苦労しました。

## 使った技術

- firebase
  - hosting
  - cloud functions
- node.js
  - canvas
  - express
  - pug

Realtime Databaseや、Cloud Firestoreを使うと逆に時間がかかりそうだったので全く使っていません。
技術ではないですが、短冊には「いらすとや」さんのイラストをお借りしました。ありがとうございました。

## 作ってみて

完走した感想ですが、ちょっとでも流行らないかなぁ。
皆さんの願いをTwitterに乗せてみてください。ハッシュタグを探しに行きたいと思います。
Railsでバルクインサート！

#はじめに
今回は、Railsでバルクインサートを使用する方法をご紹介します！:information_desk_person:

### バルクインサートとは
あるテーブルに複数のデータ（レコード）を保存したい時に便利です。
通常だと１レコードずつINSERTが発行されるので、膨大な量を保存するとなるととても時間がかかります。
これを防ぐために！
保存したいデータ情報を一度全て配列に入れてから、一気に保存する！のがバルクインサートです:fist:
つまりは**膨大な保存データをSQLで一括登録する方法**です。

#下準備
Railsでバルクインサートしたい場合には、まずgemを入れます。
Gemfileに以下を追加！

```Gemfile
gem 'activerecord-import'
```
そして忘れすにターミナルでbundle install !!

```terminal
$ bundle install
```

これで下準備終了です！

# 使い方① createする場合
では早速使用していきましょう！
まずは例として、バルクインサートを使用せずに、一つ一つのデータごとにINSERTを走らせて保存するやり方です。

```test.rb
10.times do |i|
  Book.create! name: "book #{i}"
end
```
booksテーブルにbook1,book2,book3と一つ一つデータを保存する例です。
一つずつ保存する旅にcreateアクションが走るので、保存データ量が多い場合はとても動作が遅くなります。

```test.rb
books = []
10.times do |i|
  books << Book.new(name: "book #{i}")
end
Book.import books 
```
このようになります！
まずは配列booksを用意しておき、新しいデータを配列booksに順番に入れておきます。
そして最後、**Book.import books** で保存するデータを一気にcreateしています。

# 使い方② updateする場合
updateする場合は**on_duplicate_key_update**をオプションで付けるだけです！

```test.rb
モデル名.import 配列名, on_duplicate_key_update: [:カラム名]
```
先ほどのbooksテーブルのtitleカラムを一気に変更する場合は、

```test.rb
Book.import books, on_duplicate_key_update: [:title]
```
このようになります！

#さいごに
gemを入れるだけでこんなに便利に！簡単にバルクインサートできるんですね！
ただしバルクインサートを使用する際はコールバックが発火しないので注意が必要です！
コールバックがない場合はぜひバルクインサートでさくさくデータ保存してみてください:v:

# 参考URL
①gem 'activerecord-import'のgithubです！
　https://github.com/zdennis/activerecord-import
②バルクインサートを使用した場合としない場合のパフォーマンスをまとめている良記事
　https://qiita.com/xhnagata/items/79184ded56158ea1b97a
深層学習（前編 1）：「演習課題」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415265/828570ae-ca00-ba51-bd65-9b3f4141062e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415265/8dc73591-1683-55da-29e8-f6c4a44f9548.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415265/5d011b8d-4988-10c5-a706-125922c1c5dd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415265/0e6dc1b8-b3d2-e7f3-c1a8-e0096dc4a2bd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415265/fcce28ec-5e3c-ec52-3e40-9a3bc46fca16.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415265/f0919cf5-ce08-5a68-854f-3cd1567eeffe.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415265/1a292290-deb6-68ae-6227-67640a3e618d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415265/36146057-9066-610f-c72a-c9bc7f100c71.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415265/e86ae9a5-e170-be67-b7d6-9dbd9fd41a8f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415265/8be33030-b99e-7a25-20c6-fef79839687e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415265/8f1a3252-d0de-6810-9c5b-149b9cdd9e0e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415265/611c04a4-6a70-d13e-eaee-b21235a576a2.png)
JFreeChart-バーチャート(BarChart)


目次 ⇒ [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.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.data.category.DefaultCategoryDataset;

/** JFreeChart-バーチャート(BarChart) */
public class Chart07_00 {
  // 目次-バーチャート(BarChart)
  A_Chart07 a_Chart07;
  // 目次-Artery-JFreeChart用のライブラリ
  A_Chart00 a_LibChartSampeContents;

  public static void main(String[] args) {
    //
    // 表示データを作成する,DefaultCategoryDatasetを使用する
    DefaultCategoryDataset catDataSet = new DefaultCategoryDataset();
    {
      catDataSet.addValue(54,"2009","民進");
      catDataSet.addValue(38,"2009","自民");
      catDataSet.addValue(23,"2009","公明");
      catDataSet.addValue( 8,"2009","共産");
      catDataSet.addValue( 4,"2009","無所属");
      catDataSet.addValue( 2,"2009","ネット");
      //
      catDataSet.addValue(59,"2013","自民");
      catDataSet.addValue(23,"2013","公明");
      catDataSet.addValue(17,"2013","共産");
      catDataSet.addValue(15,"2013","民進");
      catDataSet.addValue( 7,"2013","みんな");
      catDataSet.addValue( 3,"2013","ネット");
      catDataSet.addValue( 2,"2013","維新");
      catDataSet.addValue( 1,"2013","無所属");
      //
      catDataSet.addValue(55,"2017","都民");
      catDataSet.addValue(23,"2017","自民");
      catDataSet.addValue(23,"2017","公明");
      catDataSet.addValue(19,"2017","共産");
      catDataSet.addValue( 5,"2017","民進");
      catDataSet.addValue( 1,"2017","ネット");
      catDataSet.addValue( 1,"2017","その他");
    }
    // XAxis ⇒ CategoryAxis
    CategoryAxis xAxis = new CategoryAxis("政党");
    // YAxis ⇒ NumberAxis
    NumberAxis yAxis = new NumberAxis("議席数");
    // 棒グラフで表示するのでBarRendererを使用する
    BarRenderer renderer = new BarRenderer();
    // Plotを生成して表示する
    CategoryPlot catPlot = new CategoryPlot(catDataSet,xAxis,yAxis,(CategoryItemRenderer)renderer);
    JFreeChart jfreeChart = new JFreeChart("都議会議員選挙",(Plot)catPlot);
    ChartFrame cFrame = new ChartFrame("都議会議員選挙",(JFreeChart)jfreeChart);
    cFrame.pack();
    cFrame.setVisible(true);
  }
}

```

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/08826324-2e08-853d-23d4-ec896842bf7e.png)
GitHubのContributor一覧に自分のアカウントが表示されない[解決済]

## 現象
GitHubのオープンソースリポジトリ([dotnet/docs.ja-jp](https://github.com/dotnet/docs.ja-jp))に送ったPull Requestがマージされたが、[Contributors](https://github.com/dotnet/docs.ja-jp/graphs/contributors)の一覧に自分の名前が表示されない。
## 原因
[Viewing a project's contributors](https://help.github.com/en/articles/viewing-a-projects-contributors#troubleshooting-contributors)のトラブルシューティングから抜粋。

- You aren't one of the top 100 contributors.
  - Contributorの**上位 100 名でない。**
- Your commits haven't been merged into the default branch.
  - **`default`のブランチ[^1]**にマージされていない。
- The email address you used to author the commits hasn't been added to your GitHub account.
  - **コミットに使用したメールアドレス**が、GitHubアカウントのメールアドレスに**紐付けされていない。**

3つ目の「メールアドレスの不一致」が原因だったようです。
(ローカルでコミットした時のメールアドレスは`user@example.com`のように登録していたが、GitHubのメールアドレスは`user+github@example.com`だった)
[Email settings](https://github.com/settings/emails)で、`user@example.com`をサブメールアドレスとして登録、Verifyしたが反映されず。

### 追記(2019/7/4)
時間が経ってから確認したところ、[反映されていました](https://github.com/dotnet/docs.ja-jp/commits?author=nogic1008)。

## 結論
ローカルGitに登録する名前とメールアドレスは、ちゃんとしたものにしましょう。

[^1]: リポジトリを開いたときに、最初に表示されるブランチ。`リポジトリのURL/branches`でも確認可能。
git pushがrejectされた時の対処法

##はじめに
git pushしたら下記のエラーが出てrejectされました。

```
To https://github.com/username/〇〇〇.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/username/〇〇〇.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```
##解決方法
上記のエラーは自分がリモートの変更をpullしてから、pushするまでの間に、他からのpushがあるなどして、リモートリポジトリが変更されているためです。

```
$ git pull origin master
```
上記のコマンドでローカルリポジトリのmasterブランチをリモートリポジトリのmasterをmargeさせてあげた後に、再度pushし直します。

```
$ git push
```

##参考サイト
https://hacknote.jp/archives/15275/
Raspbian Busterにdockerをインストールする

Rasberry pi 4が海外で発売開始されたことを横目に見ながら、Rasberry pi 3+を購入しました。NoobsでインストールされるOSはRaspbian Busterですが、Dockerのインストールがうまく行かなかったのでメモとして残しておきます。(どうやら[これ](https://github.com/docker/for-linux/issues/709)に当たったようです。)

### やり方
まずは最新化しておきます。

```bash
sudo apt update && sudo apt dist-upgrade 
```

次にDockerのインストールをします。

```bash
curl -sSL https://get.docker.com | sh
```

ところが、Dockerがインストールされずにエラーが発生します。設定ファイルを確認すると

```
# /etc/apt/sources.list.d/docker.list
deb [arch=armhf] http://download.docker.com/linux/raspbian 10 stable
```

となっています。一方、執筆時点で[Dockerがraspbian向けに提供しているのはjessieとstrech](https://download.docker.com/linux/raspbian/dists/)です。

しかたないので、[Dockerが提供しているdebian/buster向け](https://download.docker.com/linux/debian/dists/buster)に設定を変更してインストールしてみましょう。

```
# /etc/apt/sources.list.d/docker.list
deb [arch=armhf] http://download.docker.com/linux/debian buster stable
```

```bash
sudo apt update && sudo apt install docker-ce docker-ce-cli
```

このインストールはDockerが依存しているaufs-dkmsでエラーが発生します。

```
Error! Bad return status for module build on kernel: 4.19.50+ (armv7l)
Consult /var/lib/dkms/aufs/4.19+20190211/build/make.log for more information.
dpkg: error processing package aufs-dkms (--configure):
 installed aufs-dkms package post-installation script subprocess returned error exit status 10
```

パッケージの状態を確認します。

```bash
sudo dpkg --audit
```

どうやらConfigureで失敗しているようなので、悪さしているファイルを削除します。

```bash
sudo rm /var/lib/dpkg/info/aufs-dkms.postinst
sudo rm /var/lib/dpkg/info/aufs-dkms.prerm
```

そして、再度configureする。

```bash
sudo dpkg --configure aufs-dkms
```

これでエラーが解消されました。最後にDockerの動作確認します。

```
$ sudo docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (arm32v7)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```

動きました。

#### 参考
https://qiita.com/yukari-n/items/d1b17bd37036f120153c
Delphi IDE の便利な機能 - キーボードショートカットなど - その２

[こちらの方](https://qiita.com/pik) からキーボードショートカットの続きを書いてよ的なリクエストを頂きましたので、その２です

## Shift+Ctrl+I
選択した行またはブロックをインデント ( プログラムコードを読みやすくするための字下げ ) します 
インデントの幅は [ ツール | オプション ] のユーザーインターフェース\エディタ設定\ソースオプションで指定します
![indentOption.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164551/37a9758a-3baa-0d97-cde4-8548886a4e25.png)


## Shift+Ctrl+U (または Shift+Tab or Ctrl+K+U) 
選択した行またはブロックのインデントを解除します

上記 2 つのキーボードショートカットを行った例
範囲を選択してキーボードショートカットを実行すると、指定した範囲のコードが右や左にシフトします
![indent.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164551/a7aae397-e2e1-1176-a935-cf838a10443c.gif)

## Shift+Ctrl+R
キー入力マクロの記録の開始と停止を切り替えます
キーボード入力の一連の入力の作業をキー入力マクロとして記憶することができます
Shift+Ctrl+R を押して記録が開始され、再度 Shift+Ctrl+R を押すと記録を終了します

## Shift+Ctrl+P
記録したキー入力マクロを再生します

次のキー入力マクロの例では、コピーした文字列に対する修正を、キー入力マクロとして記録して直ぐ下の２つの行で再生しています

なお、ここで主に使用しているショートカットは
Shift + Ctrl + → カーソルの右側の 1 語を選択
Shift + Ctrl + ← カーソルの左側の 1 語を選択
Ctrl + → カーソルを 1 語右側に移動
Ctrl + ← カーソルを 1 語左側に移動
Ctrl + C コピー
Ctrl + V ペースト
で、他のキーボード操作は、= の追加、変数の先頭の f を a に修正するという操作を行っています
![keyboardMacro.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164551/450c87fa-faa8-383d-fb43-db901bb65786.gif)

## Shift+Ctrl+↑ と Shift+Ctrl+↓
同じユニット内で、宣言から実装に、または実装から宣言にジャンプします。 
![jumpCode.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164551/070c3c1c-24d5-bc4c-ad95-6c2fa51d6ed7.gif)

## Shift+Ctrl+J
同期編集モードのオン/オフを切り替えます
同期編集とは、コードエディタ上で、選択した範囲で同じ識別子があれば、一つの識別子を修正すると残りの同じ識別子も同期をとって修正してくれる仕組みです

以下の画面の例は範囲を指定して Shift+Ctrl+ J で同時編集モードを On にして J という識別子に対して編集を行っています
範囲内の J という識別子に対して同時に編集が行われています
private の箇所に識別子 J の定義がありますが、ここは範囲外のため同期編集が行われません
コード内のすべての識別子を網羅して編集を行うのであればリファクタリングの機能がオススメです
![douki.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164551/b9c22294-3304-7feb-773e-a6e621fb2287.gif)

## 参考

- [キー入力マクロを記録する](http://docwiki.embarcadero.com/RADStudio/Rio/ja/%E3%82%AD%E3%83%BC%E5%85%A5%E5%8A%9B%E3%83%9E%E3%82%AF%E3%83%AD%E3%82%92%E8%A8%98%E9%8C%B2%E3%81%99%E3%82%8B)
- [デフォルトのキーボード ショートカット](http://docwiki.embarcadero.com/RADStudio/Rio/ja/%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89_%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88)
- [同期編集モード](http://docwiki.embarcadero.com/RADStudio/Rio/ja/%E5%90%8C%E6%9C%9F%E7%B7%A8%E9%9B%86%E3%83%A2%E3%83%BC%E3%83%89%EF%BC%88Delphi%E3%80%81C%2B%2B%EF%BC%89)
- [同期編集を使用する](http://docwiki.embarcadero.com/RADStudio/Rio/ja/%E5%90%8C%E6%9C%9F%E7%B7%A8%E9%9B%86%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B)
ノンプログラマーがプログラミングを勉強しようとした話。【前節】

#前節
自己紹介とか、動機とかなので興味ない方は読み飛ばしていいです。
次の記事から具体的内容書いていければなと。
継続的デリバリーでユーザーにアレするため細かいチャンクで展開していきます。
ついでにチャンクってもともとデザイン用語で、人間が一度に認識できる文字列の量の定義から来てるらしいです、やったね。
知りたい人はマジカルナンバーで検索
＊プラグラムのマジックナンバーとは違います。

###初めに
NUKO-Dについて
某ゲーム会社に勤務しているイラストレーター
なので、この記事はイラストレーターやグラフィッカー視点であることにご留意いただければ何卒。
また、本職のエンジニアではないのと、ところどころ間違いや、認識としてのずれがあるかと思いますがそういったところはご指摘いただけるとたすかります。
###何故プログラムを学びたいのか
基本現在の業務ではイラストレーターではあるが、イラストレーターという水商売具合に将来を生き抜く自信がなく、プログラムというより技術を学び手に職つけて生きていくぞという思いがあった。

いやいや、そういはいっても絵が描けるのいいじゃないという話もよくされるが、趣味として割り切れるのであれば確かに豊かな人生に寄与するものではあると思う。

ただ、昨今の無限にわき続ける若い才能、一昔前なら高校生なのにこんなに描けます！の程度もしれていたが、今はそのレベルがプロすら置いてけぼりにされる人もちらほら出てくる（単にSNSをやる分母が増えて可視化されただけという話もありそうだけど確実に増えてる）

もう一つは中国・東南アジア地域のイラストレーターの進出が目覚ましい。
SNSの普及によってかなり、他国のイラストの日本ナイズが図られ競争力が増している……。

いや頑張れよっていう話なんですが、絵を極めるというところに個人的に比重が置けないなぁというのが正直なところ。
一つのことやるより全般学びたいっていうのが本心です。

スマホゲームのグラフィックは２Dから３Dとゲーム業界が云十年かけて進化してきた事を、ここ数年でコンシューマーの域まで達して僕が業界に飛び込んだ時よりも要求される知識レベルは飛躍的に上がりました。

- **ゲームエンジン**
- **描画**

アーティストとして振り切って上流に行かない以上、この二つの知識がゲーム業界にいる以上は表現上必須になっていくのかなと。
次回からはゲームエンジンのUnityで使われてるC#を勉強する時にわからなかったことや、参考になったことを書ければと。

内容なくてごめんね。
DockerでTS3サーバを簡単構築

# はじめに
discordで通話しながらゲームしてたんですが、
サーバが不安定になることがたまにあるので避難用としていつでも建てれるように準備しました！
GCPですでに存在するサーバに対して作業していきます。

# 実際にts3サーバを建ててみる

## 準備

・dockerをサーバ上にインストール(公式を参考に)
https://docs.docker.com/get-started/
・9987UDP, 10011TCP, 30033TCPポートを解放する（GCP上では画像みたいな感じ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52392/a1f916ed-25a0-caf5-e0c6-a603925c14c5.png)

## 構築開始

### dockerイメージからTS3を初回起動する

dockerイメージをDockerHubから使わせていただく
https://hub.docker.com/_/teamspeak

初回起動時には TS3のライセンスへの同意が必要

```
$ sudo docker run -d --name teamspeak3 -p 9987:9987/udp -p 10011:10011 -p 30033:30033 -e TS3SERVER_LICENSE=accept -v /var/ts3server/:/var/ts3server/ teamspeak
```

ログイン用（管理者）のユーザ・パスワードやトークンを確認

```
$ sudo docker logs teamspeak3
```

あとは接続するだけ！

## 備考

### 次からはこちらのコマンドで良いハズ

```
$ sudo docker run -d --name teamspeak3 -p 9987:9987/udp -p 10011:10011 -p 30033:30033 -v /var/ts3server/:/var/ts3server/ teamspeak
```

### dockerコマンド
```
$ sudo docker ps -a  # dockerのプロセスを表示
$ sudo docker stop <name> # dockerのプロセスを停止
$ sudo docker rm <name> # dockerのプロセスを終了
$ sudo docker exec -it teamspeak3 sh #  TeamspeakのDocker内のshellに接続する
```

### docker run の引数
```
# バックグラウンドで実行
-d

# コンテナの名前
--name teamspeak3

# サーバの指定のディレクトリをコンテナ内のディレクトリと同期する（マウントする）。[サーバ：コンテナ内]で指定する
-v /var/ts3server/:/var/ts3server/
```
railsでウェブアプリケーション作成がうまくいかず困っています

プログラミングの勉強を始めたばかりのものです。
先日railsの技術書を買い、それに倣いなんとかインストールまでは進んだのですが、コマンドプロンプト上で、
「rails new　（アプリケーション名）」を実行した際にうまくいかず困っています。
![01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453349/5a570aee-e353-c60d-b56d-4e305806df8f.png)
![02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453349/4ce96213-d6db-b77b-b01e-e7158c0728d8.png)
さっぱり何が書いてあるか分からず、困っています。どうしたらよいでしょうか？
買った本の最終更新が2年前であったり、RailsInstaller3.3.0と3.2.1を両方試しましたがだめだったり、いっそ別の教材を見つけたらいいのか自分が行っている手順が間違っているのか、何がなんだか分かりません。
PCはwindows10の64bit版です。
どうか助けてください…。
react-bootstrapで簡単なスライドを表示させよう

需要があるかわかりませんが記事を書く練習がてらに書きます。

#スライドの表示
react-bootstrapでのスライドの表示は`<Carousel></Carousel>`内に書くことによって作れます。

まずはreturn内に以下のコードを書きました

```html

<Carousel>
  <Carousel.Item>
    <img
      className="d-block w-100"
        src="holder.js/800x400?text=React&bg=373940"
        alt="First slide"
    />
    <Carousel.Caption>
      <h3>Reactを使用しました</h3>
      <p>ReactとはJavaScriptのライブラリです</p>
    </Carousel.Caption>
  </Carousel.Item>
</Carousel>
```

まず上から順に説明していくと、`<Carousel.Item>`で一枚のスライドを表示することができ、３枚スライドを用意したいなら３つ用意すれば良いわけです。

`<img>`で画像も使用できますが、この`holder.js`というライブラリを使用することによって簡単に文字を入れたスライドを作ることが可能になります。

holder.jsは以下のコードで読み込みましょう。

```index.html
<script src="//cdnjs.cloudflare.com/ajax/libs/holder/2.9.6/holder.js"></script>
```

`<Carousel.Caption>`の中は説明文を書くことができます。この中に説明したいことを記述しましょう。

以上です、練習がてらに書いたので説明不足と下手さは見逃してください。
No code signature failed.の対応方法

## トリガー
実機にデバッグビルド（cmd + R）をしたところ、タイトル通りのダイアログが表示され失敗する。
タイミングは`Build Success` -> インストールしようとする -> タイトル通りのダイアログが表示。

## 環境
iPhone6 11.2
Xcode 10.2.1
CocoaPods 1.7.2

## 結果（自分の場合）
* `Pods.xcodeproj` -> `Build Active Architecture Only` -> `Debug`が`NO`になっているか
    * `YES`になっていたので`NO`に変更したところ治った

## 試した対応方法
* [【Xcode】【Swift】No code signature found. と出た時の対処法](https://qiita.com/kiyokiyoabc/items/98fa7b0758075fd3007e)
    * 効果なし
* 直前にファイルを追加していたので一度削除し、再度xcode上にD&D
    * TARGETにチェックをいれて`copy items if needs`はチェックしない
    * 効果なし
* `~/Library/Developer/Xcode/DerivedData`内のファイルを削除
    * 効果なし
* プロジェクト内のxcuserdataを削除
    * 効果なし
* iPhoneOS.sdk内の`CODE_SIGNING_REQUIRED`が`NO`になっていないか確認する
    * `YES`だった

## 参考
* [iOS app testing. App installation failed. No code signature found [closed]](https://stackoverflow.com/questions/38371044/ios-app-testing-app-installation-failed-no-code-signature-found)
MacのGoogle Chromeはショートカットキーでブックマークバーをフォーカスできない

ショートカットキーの話です。
WindowsのGoogle Chromeだと、alt + shift + Bでブックマークバーにフォーカスすることが可能でした。
キーボード操作だけでブックマークにいけるので快適だったんですが、Macにはこのショートカットキーがありません。
３０分くらい調べましたが、マジでないみたいです。
なくても困んないっちゃ困んないんですが、キーボード操作だけで完結させたいので、ちょっと嫌ですね。

何か回避法知ってる方いたら紹介お願いします！

# 参考
[Google Chrome公式](https://support.google.com/chrome/answer/157179?hl=ja)
[Chromeのウザいショートカットを対策しよう](https://qiita.com/asachi/items/c1a57cfd112bc001a46a)
Lograge に設定した Logger を呼び出す方法

# 概要
* [lograge](https://github.com/roidrage/lograge) を使っていても `Rails.logger` を直接呼び出してログを出力すると lograde 側のログに出力されない.
* `begin ～ rescue`でキャッチしたエラーも lograge に出力させたかった.

# 方法
以下のように `Rails.application.config` から直接呼び出せばいいことに気づいた.

* `Rails.application.config.lograge.logger.debug({ message: '何か文字列' }.to_json)`

当たり前なのだろうけど, 気づくのに時間がかかったので備忘録として残しておく. ラッパークラスを作って出力されるログの構造を統一すれば使い勝手がさらに良くなる気がする.
digとnslookupの違い

#digコマンドとnslookupの違いとは？
結論
` nslookupはネームサーバーからの応答を見やすいように加工して表示するため、意図しない結果になってしまう事があるが、 digはほぼそのまま表示するので、より正確な情報が得られる`



最初にざっと調べた感じ
` digコマンド・・・ドメイン名からIPアドレスを調べる `
` nslookupコマンド・・・ドメイン名からIPアドレスを調べる `
違いがわからん…となったので、この記事を書いた。  

##digコマンドの詳細
digとは、domain information groperの略で、ネームサーバーに問い合わせを行い、その応答結果を表示するコマンド。

```
$ dig www.google.co.jp

; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5_4.2 <<>> www.google.co.jp
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54701
;; flags: qr rd ra; QUERY: 1, ANSWER: 8, AUTHORITY: 4, ADDITIONAL: 4

;; QUESTION SECTION:
;www.google.co.jp.		IN	A

;; ANSWER SECTION:
www.google.co.jp.	345600	IN	CNAME	www.google.com.
www.google.com.		604800	IN	CNAME	www.l.google.com.
www.l.google.com.	300	IN	A	72.14.203.104
www.l.google.com.	300	IN	A	72.14.203.105
www.l.google.com.	300	IN	A	72.14.203.106
www.l.google.com.	300	IN	A	72.14.203.147
www.l.google.com.	300	IN	A	72.14.203.99
www.l.google.com.	300	IN	A	72.14.203.103

;; AUTHORITY SECTION:
google.com.		172799	IN	NS	ns3.google.com.
google.com.		172799	IN	NS	ns4.google.com.
google.com.		172799	IN	NS	ns1.google.com.
google.com.		172799	IN	NS	ns2.google.com.

;; ADDITIONAL SECTION:
ns1.google.com.		345599	IN	A	216.239.32.10
ns2.google.com.		345599	IN	A	216.239.34.10
ns3.google.com.		345600	IN	A	216.239.36.10
ns4.google.com.		345599	IN	A	216.239.38.10

;; Query time: 718 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Feb 10 20:46:31 2011
;; MSG SIZE  rcvd: 314
```

###nslookupの詳細
nslookupコマンドとは、ネームサーバーに問い合わせを行い、その応答結果を加工し、表示するコマンド。

```
$ nslookup www.google.co.jp
Server:		127.0.0.1
Address:	127.0.0.1#53

Non-authoritative answer:
www.google.co.jp	canonical name = www.google.com.
www.google.com	canonical name = www.l.google.com.
Name:	www.l.google.com
Address: 72.14.203.103
Name:	www.l.google.com
Address: 72.14.203.104
Name:	www.l.google.com
Address: 72.14.203.105
Name:	www.l.google.com
Address: 72.14.203.106
Name:	www.l.google.com
Address: 72.14.203.147
Name:	www.l.google.com
Address: 72.14.203.99
``` 
nslookupコマンドを使って、ドメイン名を問い合わせると、応答が加工されて一部の情報は表示されていないため、digコマンドを使う方がより正確な情報を得られる。

##参考サイト
https://www.atmarkit.co.jp/fnetwork/dnstips/011.html
応用数学

応用数学

１．行列
行列はベクトルの集合
ベクトルはスカラーの集合
スカラーは普通の数（四則演算できるもの）

２．行列の積について
行列の積の結果におけるそれぞれの要素は、積算のもとになった行列、またはベクトルすべての要素から影響を受けている

３．線形代数とは
Likerと呼ばれ、ベクトルの表現そのもののことを呼ぶ

４．固有値とは
スカラーで表現される
ある行列からスカラーを係数のように取り出して、固有値とする。
その固有値に分解された残骸が、固有ベクトルである。
したがってある行列の固有値に対する固有ベクトルは一つである。

５．固有値分解とは
行列の累乗の計算を容易にするために行われる
ある正方形の行列を、固有ベクトルを並べた行列と固有値を対角線上に並べた行列（対角線以外は０にして固有値を表現）で構成される式に表現しなおすこと。

６．特異値分解とは
正方形以外の行列を疑似的に固有値分解すること
対象の行列を転置させ、転置前の行列と転置後の行列の積で正方形化する。それを固有値分解する。

確率・統計

１．	独立的な事象の同時確率の出し方
お互いに因果関係のない事象ｘと自称ｙが同時に発生する確率は、それらの積によって表される。

２．	条件付き確率
ある事象ｘが与えられた条件かでｙとなる確率

３．	確率変数とは
確率を計算する元となる変数のこと（事象が発生した回数ではなく、事象そのものを確率計算をするために数値化したもの

４．	確率分布とは
ある確率変数をとる確率の分布
確率の規則を表す
この確率分布に従って起こる変数が、確率変数である

５．	分散とは
データの散らばり具合のこと
期待値からどれだけデータがずれているのかを表す
ずれを平均して算出している

６．	共分散とは
二つのデータ系列の傾向の違い
正＝似た傾向
負＝逆の傾向
ゼロ＝関係性なし

７．	ベルヌーイ分布
イエスかノーかの確率分布

８．マルチヌーイ（カテゴリカル）分布
	いくつかの結果カテゴリーがある確率分布

８．	二項分布
ベルヌーイ分布となるテスト太対象を、何度も試したもの

９．	ガウス分布
確率をグラフで表せるよう、分布を数式化したもの
積分値が１以内に収まるように、数式で調整している。

１０．	期待値とは
その分布における確率変数の平均の値、またはありえそうな値を表す

情報理論

０．	情報理論の目的
無駄な計算、無駄な情報を把握し、効率的に情報を伝達するためのもの

１．自己情報量とは
	その情報が全体でいかにユニークな値を保持しているか

２．シャノンエントロピーとは
	自己情報量の期待値
	エントロピーとは平均情報量のことである

３．カルバック・ライブラーダイバージェンス
	同じ事象・確率変数における、異なる確率分布の違いを表す

４．交差エントロピー
ある確率分布に最適化された方式で別の確率分布をエンコードしたときの平均情報量。
Cloud Buildを定期実行する(scheduled CloudFunctionsからCloud Buildを実行する)

https://console.cloud.google.com/cloud-build/triggers
からトリガー詳細を見た時のURL

```
https://console.cloud.google.com/cloud-build/triggers/${triggerId}?project=${projectId}
```

に含まれているtriggerIdを使う。

```json:package.json
  "dependencies": {
    ...
    "googleapis": "^39.2.0"
  },
```

```typescript
import * as gapis from 'googleapis';

run = async (projectId: string, triggerId: string): Promise<gapis.cloudbuild_v1.Schema$Operation> => {

  const authCloudBuild = async (): Promise<gapis.cloudbuild_v1.Cloudbuild> => {
    const client = await gapis.google.auth.getClient({
      scopes: ['https://www.googleapis.com/auth/cloud-platform']
    });
    return new gapis.cloudbuild_v1.Cloudbuild({ auth: client });
  }

  const authedCloudBuild = await authCloudBuild();
  const runParams: gapis.cloudbuild_v1.Params$Resource$Projects$Triggers$Run = {
    projectId: projectId,
    triggerId: triggerId,
    requestBody: { repoName: 'hoge', branchName: 'master' }
  };
  const res = await authedCloudBuild.projects.triggers.run(runParams);
  return res.data;
}
```

https://cloud.google.com/cloud-build/docs/api/reference/rest/v1/projects.triggers/run?hl=ja
https://cloud.google.com/cloud-build/docs/api/reference/rest/Shared.Types/Build?hl=ja#RepoSource

でcloud buildのtriggerを引けるので

```typescript:index.ts
const fn = functions.region('asia-northeast1');
export const every1days = fn.pubsub.schedule('every 1440 minutes').onRun(async context => {

}
```

https://firebase.google.com/docs/functions/schedule-functions?hl=ja
(要Blazeプラン)
から呼べば1日1回とかビルドが走る
古いブラウザでウェブサイトにアクセスされた時、推奨ブラウザをインストールするように勧める画面を表示する

# Motivation

- IE 対応したくないけど、画面が真っ白になるのは避けたい
- せめてサービスの紹介くらいは IE からでも見られるようにしたい
- IE 対応したくない

# TL;DR

1. UA で判断せず、 `window.Symbol !== undefined` や `try { eval('async () => {}') } catch(e){}` で判断
1. モダンブラウザとそれ以外で js のエントリーポイントを分ける
    - Webpack なら multi entry
    - CDN 通してるなら、 js コードの共通化は考えないで、全部バンドルしよう
1. `.babelrc` を２つ書く
1. https://www.browserling.com で結果を確認

# User Agent で判断しない

- あなたが対応したいのはどのブラウザのどのバージョンのですか？
- 明確に「このバージョンだけ対応できれば OK」と答えられるなら UA で判断しても良いが、多くの場合は「このコードを実行してもエラーが出ないかどうか」が知りたい
- それを UA でひとつずつ確認していくのはしんどい
    - たとえ Chrome や Safari であっても、５年前からアップデートされていなければ、もはや別物


→ 実行時に確認する

## 実際に使ったコード（あなたのプロジェクトに合わせて変えください）
```javascript

const requirements = ['Symbol', 'Proxy', 'URLSearchParams'];
const isOldBrowser = !requirements.every(key => key in window);

if (isOldBrowser) {
  // ここで古いブラウザ向けのビューを表示する
}
```

- このファイルは Babel するので `const` なども使っています
- Babel してないよという方は `var` にするなり `every` を for 文に置き換えるなりお願いします

## どうやってこの３つに決めたのか

- https://rollbar.com/ というエラーレポートサービスを使っている
- 実際にブラウザ上で発生したエラーを見ながら付け足していった
- そのため、これは正解でもなんでもない、当てずっぽうな実装でしかない
    - 機械的に判断する方法が思いつかなかっただけなので、良い方法があればコメントしていただけると嬉しいです


# モダンブラウザとそれ以外で js のエントリーポイントを分ける

つまり、最終的にこうなっていることを目指す

```html
<html>
    <head>
        <script src="モダンブラウザ向け.js"></script>
        <script src="それ以外向け.js"></script>
    </head>
</html>
```

## Webpack

- [multi entry point](https://webpack.js.org/concepts/entry-points/#object-syntax) にする
- ソースのディレクトリを２つに分ける
    - 必ずしもこうする必要はないが、分けたほうが `babel-loader` のルールがシンプルになって良い
    - ここでは `src` と `fallback` の２つに分けた

```javascript
module.exports = {
  entry: {
    for_modern_browser: './src/index', // 通常のアプリケーションのエントリーポイント
    for_other_browser: './fallback/index' // モダンブラウザ以外のエントリーポイント
  }
};
```

## .babelrc を２つ書く

- webpack.config.js

```javascript
module.exports = {
  entry: {
    for_modern_browser: './src/index', // 通常のアプリケーションのエントリーポイント
    for_other_browser: './fallback/index' // モダンブラウザ以外のエントリーポイント
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        use: 'babel-loader',
        include: ['src']
      },
      {
        test: /\.js$/,
        use: {
          loader: 'babel-loader',
          options: {
            // ↓ fallback ディレクトリ以下の js ファイルは fallback/.babelrc に基づいてトランスパイルする
            babelrcRoots: ['fallback']
          }
        },
        include: ['fallback']
      }
    ]
  }
}
```

- fallback/.babelrc

```json
{
  "presets": [
    [
      "@babel/env",
      {
        "targets": { "ie": "9" }
      }
    ]
  ]
}
```

- 上記のコードは一部抜粋なので、コピペせず、実際のプロジェクトに合わせて使ってください
- とくに、 `fallback/.babelrc` の `useBuiltIn` プロパティの設定は必須です


# browserling で動作を確認

- IE9 は Vista、 IE10 は Windows 7 でしか動かない
- Windows 端末を持っていない場合は https://www.browserling.com を使うと良い


[![Image from Gyazo](https://i.gyazo.com/45881bd2a3dbbb93cb6a48bbca8efbf7.png)](https://gyazo.com/45881bd2a3dbbb93cb6a48bbca8efbf7)
LeapTrainer.jsを使ってみよう

今回はLeapMotionであれこれやってることろにLeapTrainer.jsというとても便利なライブラリがあったので紹介することにしました。

#LeapTrainerってなに？
簡単に言うとLeapMotionを使って手の動きや形を記憶し識別できるソフトウェアとライブラリ。
ジェスチャーを覚えさせてそれをHTMLのScriptにコピペするだけで、そのジェスチャーを行ったときにアクションを起こすことができます。

追記
ポーズ認識もできます。

##使ってみよう
まずLeapTratner.jsをgithubから持ってきて、trainer-ui.htmlを表示してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435485/ab259178-e542-aa31-7823-5d253ecd46bd.png)
このような画面がでてきます。

**OPTION**で細かな動作の検出や識別方法などが選択できます。その説明は今後行うことにします。
**CREATE A GESTURE**でジェスチャーの名前を決め、登録します。

##ジェスチャーを登録しよう
では実際に右方向にスライドするジェスチャーを登録してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435485/ce8f5ea9-e61d-6d19-91f2-838b17236e8a.png)

これで登録完了です。次にもう一度同じ動作を行い、マッチ度を検証できます。
マッチ度が表示されなかったり、低すぎたりする場合は登録したジェスチャーをクリックし、`RETRAIN`を選択することでジェスチャーを取り直すことができるので、もう一度行いましょう。

##HTMLで読み込んでみよう
今回はLeapTraine.jsのファイル内にあるmenu-demoで行ってみます。
ではmenu-demoのなかにあるindex.htmlを見ていきましょう

```menu-demo/index.html
<script>
...
var trainer = new LeapTrainer.Controller(); 

  trainer.fromJSON('コピペしたものをはる');
  trainer.fromJSON('コピペしたものをはる');
  trainer.on('LEFT', open);
  trainer.on('RIGHT', close);

</script>
```
jQueryでOPENを押したときにメニューが出てCLOSEを押したときに閉じる動作が書かれている下にLeapTrainerから動作を呼び出すコードがかかれています。

次にジェスチャ名をクリックするとJSON形式でコードが表示されるのでコピペ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435485/8bf966e4-b222-2ab0-1723-54c7050ff296.png)
ここのfromJSONの中に先程の右スライドのジェスチャーでコピペしたものを貼り付ける。すると右スライドしたときにCLOSEが押されたときと同じ動作を行うことができる。OPENもあるので、こっちのほうは左スライド時に動作するようにした。

左スライドでこのようにメニューが表示されれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435485/344b5a03-81f2-5bd9-2105-ec319a705dce.png)
環境依存のファイルを .gitignore に含めずに ignore する方法

## はじめに

複数名で開発している場合、人によって OS や エディタが異なるため、環境依存の一時ファイルなどを .gitignore に入れるのはよくありません。 Vim が生成するスワップファイル ( *.swp など ) や Mac が生成する .DS_Store など、他のメンバーには関係のない環境依存のファイルの ignore する方法を知ったので備忘録として残しておきます。

## 設定方法

Git の公式ドキュメントに記載されていたので引用します。

https://git-scm.com/docs/gitignore

> Which file to place a pattern in depends on how the pattern is meant to be used.
> * Patterns which a user wants Git to ignore in all situations (e.g., backup or temporary files generated by the user’s editor of choice) generally go into a file specified by core.excludesFile in the user’s ~/.gitconfig. Its default value is \$XDG_CONFIG_HOME/git/ignore. If \$XDG_CONFIG_HOME is either not set or empty, $HOME/.config/git/ignore is used instead.

つまり、 **$XDG_CONFIG_HOME** の設定がある場合は **$XDG_CONFIG_HOME/git/ignore** 、ない場合は **~/.config/git/ignore** に設定すれば良さそうです。

Vim のスワップファイルと Mac の .DS_Store を除外する場合は以下を配置すれば OK。スワップファイルは .swp とか .swo とか何種類かあるので `?` でパターンマッチさせます。

```~/.config/git/ignore
.DS_Store
*.sw?
```

以上。

## 関連記事

* [意外と知らない Vim でできること](https://qiita.com/tanabee/items/a9e80aeee4261501bdd6)
* [Vim におけるプラグイン管理についてまとめてみた](https://qiita.com/tanabee/items/e2064c5ce59c85915940)
* [Vim でブラウザのようにファイル間で進む、戻る操作をする方法](https://qiita.com/tanabee/items/8675580c07c58a3db990)
Node.jsデザインパターンのnginxの負荷分散をdockerを使って試したメモ

## 概要
[Node.jsデザインパターン 第2版][*1]

* 10章　スケーラビリティとアーキテクチャ
  *    10.2　クローニングと負荷分散

上記のサンプルコードを試すために、dockerを使ったところ、少しハマったのでメモ。


## 環境

* Windows 10
* Vagrant 2.2.5
* virtualbox 6.0.8
* Ubuntu 18.04 LTS (Bionic Beaver)
* Docker version 18.09.5, build e8ff056
* docker-compose version 1.24.0, build 0aa59064

## 構成

```
- app
  - app.js
- docker
  - docker-compose.yml
  - nodejs
    - Dockerfile
  - nginx
    - Dockerfile
    - default.conf
    - upstream.conf
```

[例題のgithubページ](https://github.com/mushahiroyuki/ndp2/tree/master/example/ch10/04_reverse_proxy_nginx)だと、以下だけなので、だいぶん冗長。

```
- app.js
- nginx.patch.conf
```

## ソース

```yml:docker/docker-compose.yml
version: '3'
services:
  nodejs:
    build: ./nodejs
    volumes:
      - ../app:/app/app
    command: [npm,run,run]
  nginx:
    build: ./nginx
    ports:
      - 80:80
```

node.jsのコンテナ作成時に、必要なモジュールのインストールを行う。
その後、package.jsonに実行したいコマンドをscriptに登録している。

```docker:docker/nodejs/Dockerfile

FROM node:12.5.0
WORKDIR /app
RUN npm init -y
RUN yarn add forever
RUN sed -i -e "s/\(\"scripts\": {\)/\1\n    \"run\": \"forever start app\/app.js 8081 \&\& forever start app\/app.js 8082 \&\& forever start app\/app.js 8083 \&\& forever start app\/app.js 8084 \&\& forever list \&\& forever --fifo logs 0 \",/g" /app/package.json
```

ここでnpm run runで実行されるスクリプトは以下。
foreverだけだと、実行した後コンテナが終わってしまう。
コンテナを継続するためにログを出している。`forever --fifo logs 0`

```
forever start app/app.js 8081 
forever start app/app.js 8082 
forever start app/app.js 8083 
forever start app/app.js 8084
forever list 
forever --fifo logs 0
```

nginxはコンテナに設定ファイルを読み込むようにする。

```docker:docker/nginx/Dockerfile
FROM nginx
COPY default.conf /etc/nginx/conf.d/default.conf
COPY upstream.conf /etc/nginx/conf.d/upstream.conf
```

```conf:docker/nginx/default.conf
server {
  listen 80;
  location / {
    proxy_pass http://nodejs_design_patterns_app;
  }
}
```

サンプルでは127.0.0.1を指しているところを、コンテナの名前(nodejs)に置き換えている。

```conf:docker/nginx/upstream.conf
  upstream nodejs_design_patterns_app {
    server nodejs:8081;
    server nodejs:8082;
    server nodejs:8083;
    server nodejs:8084;
  }
```

app.jsは特に例題から変更なし。

```js:app/app.js
"use strict";

const http = require('http');
const pid = process.pid;

http.createServer((req, res) => {
  //  1e7: 10の累乗を指数で指定*1
  for (let i = 1e7; i > 0; i--) {}
  console.log(`Handling request from ${pid}`);
  res.end(`Hello from ${pid}\n`);
}).listen(process.env.PORT || process.argv[2] || 8080, () => {
  console.log(`Started ${pid}`);
});
```

[*1](https://www.webprofessional.jp/shorthand-javascript-techniques/)

[参考用自作ソース](https://github.com/hibohiboo/develop/tree/d65d69686b5faeb36108521ce7228dc5ba1fccf0/tutorial/lesson/node/design_pattern)

## 参考

[Node.jsデザインパターン 第2版][*1]
[サポートページ](https://www.marlin-arms.com/support/nodejs-design-patterns/)
[DockerでApache Benchをサクッと実行する](http://thr3a.hatenablog.com/entry/20190419/1555640388)
[node.js express foreverアプリをdockerコンテナ化する](https://note.mu/loftkun/n/n6613a73a8007)
[実践編ーDockerを使ってnginxでリバースプロキシを立ててみる](https://qiita.com/zawawahoge/items/d58ab6b746625e8d4457)

[*1]:https://www.oreilly.co.jp/books/9784873118734/
docbaseで文字に色をつける

# docbaseで文字に色をつける


何度調べても忘れてしまうので備忘

### 記載方法

```markdown
色見本

<span style="color: #ff0000">赤</span>
<span style="color: #0000FF">青</span>
<span style="color: #00FF00">緑</span>
```

### 結果


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139443/c350935d-0031-6590-3bfd-2da679090ba7.png)
Rails6 のちょい足しな新機能を試す45（Allocations 編）

# はじめに

Rails 6 に追加されそうな新機能を試す第45段。 今回は、 `Allocations` 編です。
Rails 6 では、 View の render 時のログに生成されたオブジェクトの数を表示するようになりました。

Ruby 2.6.3, Rails 6.0.0.rc1, Rails 5.2.3 で確認しました。Rails 6.0.0.rc1 は `gem install rails --prerelease` でインストールできます。

```shell
$ rails --version
Rails 6.0.0.rc1
```

# プロジェクトを作る

```shell
bin/rails new rails6_0_0rc1
```

# rails server を実行する

```shell
bin/rails s
```

# ブラウザで表示する

ブラウザで http://localhost:3000 を表示すると

```
Processing by Rails::WelcomeController#index as HTML
  Rendering /usr/local/bundle/gems/railties-6.0.0.rc1/lib/rails/templates/rails/welcome/index.html.erb
  Rendered /usr/local/bundle/gems/railties-6.0.0.rc1/lib/rails/templates/rails/welcome/index.html.erb (Duration: 4.5ms | Allocations: 309)
Completed 200 OK in 11ms (Views: 5.7ms | ActiveRecord: 0.0ms | Allocations: 1667)
```

`Rendered` と `Completed` の最後にそれぞれ、 `Allocations: 309` 、 `Allocations: 1667` と表示されていることがわかります。

# Rails 5 では

Rails 5 では、 オブジェクトの数は表示されません。

```
Processing by Rails::WelcomeController#index as HTML
  Rendering /usr/local/bundle/gems/railties-5.2.3/lib/rails/templates/rails/welcome/index.html.erb
  Rendered /usr/local/bundle/gems/railties-5.2.3/lib/rails/templates/rails/welcome/index.html.erb (2.3ms)
Completed 200 OK in 12ms (Views: 6.3ms | ActiveRecord: 0.0ms)
```

# Allocations の値

Allocations の値は、 レンダリング後の `GC.stat(:total_allocated_objects)` の値とレンダリング開始時の `GC.stat(:total_allocated_objects)` の差のようです。
JRuby では、0 になるようです。 ([instrumenter.rb](https://github.com/rails/rails/blob/6-0-stable/activesupport/lib/active_support/notifications/instrumenter.rb) の Event クラス)

# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/


# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Add allocations to template renderer subscription](https://github.com/rails/rails/pull/34136)
* [instrumenter.rb](https://github.com/rails/rails/blob/6-0-stable/activesupport/lib/active_support/notifications/instrumenter.rb)
SQL Server: 10進数よりも表現力のある、並び替え用の進数を調べてみた

背景は省きますが、以下の要件を満たす進数を作りたかったので調べてみました。

要件1. 各文字は必ず1桁（16進数のイメージ）
要件2. できるだけ多くの数を表現できる
要件3. SQL Serverで並び替えに使える

# 結論
char(177)とchar(221)の間のｱｲｳｴｵを使えばorder byに使える45進数が得られる。

```sql
select char(177), char(221)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148310/1c3b3397-dda6-4dab-cf73-b4633ffa82e5.png)

# 調査方法

### 準備
```sql
create table #tmp (val int)

insert into (val) value (1)
insert into (val) value (2)
...
insert into (val) value (500)
```

### 実験
```sql
select
val, char(val)
from
#tmp
order by val
```

↓こんな感じでとれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148310/bc1b90d1-107f-46b5-4e94-ce4b80fe542c.png)

このとき、[order by val]と[order by char(val)]で並び替えしたときに得られるレコードの順番が一致するvalの範囲で最も長く連続するものを調べました。

# まとめ
ｱｲｳｴｵの並びが一番長そうでしたが、もっと表現力のある方法ご存知の方がいれば教えていただきたいです。
gasの開発を便利にclasp

## claspとは
ローカルのソースをGASエディターに反映してくれる神ツール


## 使用方法・手順 
まず

```
npm i @google/clasp -g
```

私は `npx`　で動かすのでグローバルにはインストールしないのでここら先は
`npx`で動かすコマンドで書いていきます。

```
npx clasp login
```

ポップアップが表示されるので開発で使いたいアカウントでログインしましょう

## 既存scriptをローカルにクローン

```
npx clasp clone スクリプトID
```
### スクリプトIDの場所

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115687/f360ff62-4be7-fc34-5193-04fdb3c5fc30.png)

`ファイル` > `プロジェクトのプロパティ`

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115687/1942d7ca-dc1e-0dac-39f0-0a00b8a09e0d.png)

`スクリプト ID`に記載されています。

```
$ npx clasp clone スクリプトID
Cloned 2 files.
└─ appsscript.json
└─ コード.js
```

成功すればこのように`clone`できます。

## ソースの反映

適当にソースを追加して保存します。
次に

```
npx clasp push
```

これでgasのtabでブラウザを更新すれば反映できます。
もしエラーが出たら下記からAPIの許可を行ってください。
https://script.google.com/home/usersettings

もう一度`push`してみてください反映されるはずです。

###　豆知識

もし`push`からのブラウザ更新が煩わしければ

```
npx clasp open
```
↑で新規タブでgasエディターが開けるので便利です。

その他にもの便利なコマンドたくさんあるので興味のある方は公式READMEを読んでみてください。

https://github.com/google/clasp
slackのカスタムレスポンスでメンションつけようとしたらハマったこと

## TL;DR

- カスタムレスポンスでメンションをつけるときにはユーザー名を使う
- Slackには表示名、氏名のほかにユーザー名が存在する。

#### ユーザー名の確認の仕方
1. 左のチャンネル一覧の上、ワークスペース名を押してプルダウンメニューを出す
2. プルダウンメニューから「slack を カスタマイズ」を開く
3. 左のメニュー欄の「アカウントとプロフィール」を開く
4. 設定タブの下に「ユーザー名」の行があるので右の「開く」ボタンを押す

## 何がしたかったのか

Slackのちょっとしたやり取りや自動で流れてくるメッセージにフックさせて、
自分に通知を飛ばしたかったのがスタートです。

WebHookを使ったSlack Botを実装すれば確実だったのですが、
手早く実装したかったのでカスタムレスポンスですぐ実装できないかと考えてしまった。
~~それで記事書こうかと思うくらいにはハマることになるとは知らずに……~~

## とりあえず、サクッと書いてみようか

カスタムレスポンスですよね。
よっしゃ、設定を開いてちょちょいのちょいですよ。

```text:カスタムレスポンスの内容
@通行人A さん\nエラーの発生を検知しました。\n対応をお願いします
```

個別のページでテストしてみると、
お？ おかしいぞ……メンションじゃなくて文字列になってる。

## 自分で調査すると

やはりSlackほど有名なサービスだと情報も多いですね。
いくつかの情報を確認したところ`<@user_id>` を使えばいいとのこと。
早速、内容を変更して入れてみるもやっぱり送られない。

どうやらWebHookを使ったSlack Botの仕様であって、
カスタムレスポンスは仕様が違う可能性が見えてきました。

## 一人ではどうしようもなかったので

参加していた某エンジニアが集まるSlackチームで質問を投げてみると、
一緒に色々検証してくれる流れに。 *皆さん本当にありがとうございます*

そのうち一人方からカスタムレスポンスでは「@氏名」だとメンションが飛ぶとの結果が
早速試してみるが、自分ではうまくいかなかった。なぜ……

その人が書いたカスタムレスポンスの文面を見てみると、確かに氏名が指定してありました。
そしてその隣を見て気付いたのです。

「最終更新者の名前と氏名が同じだ……」

## 氏名？ 表示名？ いいえ、ユーザー名です。

自分は社内のslackで氏名と表示名とユーザー名のすべてが違う奇特な人間だったため、
常々違和感は持っていました。

そして、試しにユーザー名を指定すると……メンションが飛んだ！

**カスタムレスポンスでメンションをつける際は `@ユーザー名` です。**
それだけの情報ですがこんなところまで読んでいただいてありがとうございます。

自分と同じように、3つの名前を使い分けている奇特な方々の助けになれていれば幸いです。

## 参考にしたサイト

- [slack BOTでのメンションの飛ばし方！！ - Qiita](https://qiita.com/masa_stone22/items/c8428aef41ce1b9f4f19)
- [Slackbotからmentionを飛ばす – WEBってなんだろう](http://whatsweb.info/?p=611)
- [SlackのIncoming Webhooksでメンションを飛ばす方法 - Qiita](https://qiita.com/ryo-yamaoka/items/7677ee4486cf395ce9bc)

あと私が参加しているエンジニアのコミュニティはこちらです。
（アドベントカレンダーですが、ここのTopにmohikanzの説明があります）
[mohikanz Advent Calendar 2018 - Adventar](https://adventar.org/calendars/2950#list-2018-12-01)
超新人向けbash効率化ハンズオン

過去資料です。30分未満で終わります

#テーマ
- なるべく簡単なものを覚える
- なるべく基本機能を使う
- なるべくカスタマイズしない → サーバもいろいろ

#用意するもの
- Macの人はMac
- WindowsPCはVagrantからのCentOS

#設定ファイルについて
- `~/.bash_profile`　ログイン時のみ利用される
- `~/.bashrc`　シェル起動時(対話モード)

.bashrcに手を入れていく

#コマンドに色を付けよう

```shell:Mac(BSD)
alias ls="ls -G"
```

```shell:CentOS(実は大体の場合記述済み)
alias ls="ls --color=auto"
```

```shell:grep
alias grep='grep --color'
```

#historyの追加
これぐらいなら修正しても支障なし。

```shell:.bashrc
export HISTSIZE=10000 # 履歴サイズ
export HISTFILESIZE=10000 # 終了時履歴サイズ
export HISTTIMEFORMAT='%Y%m%d %T ' # 履歴に実行時刻がつく。フォーマットは仮で
```

#便利な基本コマンド
```shell:.bashrc
cd # ユーザーホームへ
cd - # 1つ前のディレクトリに戻る
```

#便利な入力
シェルの入力はemacsベースです。

|ショートカット|効果|
|---|---|
|CTRL + a|カーソルを一番左へ|
|CTRL + e|カーソルを一番右へ|
|CTRL + k|カーソル位置から行末までを切り取り|
|CTRL + u|カーソル位置から先頭までを切り取り|
|CTRL + y|上記の切り取りを貼り付け|
|CTRL + o|Enterしたあと次の履歴を入力欄に表示。過去の履歴を連続実行できる|
|ALT + @|/etc/hostsからサーバ名を補完する。Mac初期設定ではESCがALTキー|
|@ + tab + tab|	/etc/hostsからサーバ名の一覧を出力する|

#SSH
`~/.ssh/config`に設定することができる

```~/.ssh/config
host yourserver
    hostname      yourhost
    user          youruser
```

```shell:上記設定後
ssh yourserver # aliasでらくらくログイン
ssh yourserver 'echo `hostname`' # ログイン先でコマンド実行して終了
```

##かなり古いサーバを経由する多段プロキシの例
```shell
host yourserver2
    hostname yourhost2
    user     youruser
    ProxyCommand  ssh legecygateway nc -w 6000 %h %p
# 古い踏み台サーバ上ではncを使う
```

```shell:上記設定後
ssh yourserver2 # legacygatewayを経由してyourhost2にログイン
```
# 入力補完
Macの場合のインストール
```brew install bash-completion```

以上
ディスク空き容量不足の時に確認でよく使うコマンドmemo

## dfコマンド
dfはディスクの空き容量のサイズを集計して表示するコマンド

~~~
df -m
~~~

``` -m ```はサイズ表記を1M単位で表示する

``` -h ```はサイズに応じて読みやすい単位でサイズを自動で表示する

## duコマンド

duはディスクの使用料をディレクトリごとに集計して表示するコマンド

~~~
du -sh
~~~

``` -s ```は指定したディレクトリの合計のみを表示する（サブディレクトリの行が表示されない）
```-h```はサイズに応じて読みやすい単位でサイズを自動で表示する
Mapbox Style を書くのに HOCON を使えないか

Mapbox Style (.style) を書くのに、これまでは hjson で書いて適宜変換していましたが、やはり include 的な機能があると便利だと思いました。

[HOCON](https://github.com/lightbend/config/blob/master/HOCON.md)には、それなりに考えられたように見える include の文法があり、[Node.js 上のパーザー](https://github.com/josephtzeng/hocon-parser#file-inclusion-shorthand)もあるみたいですね。

https://github.com/hfu/balzac-hocon で実験を始めています。
ターミナルでカレンダーを見たい

## 年間カレンダーを見たい
本日がハイライト表示されます。（ここでは見えてないですが）

```
$cal 2019
                            2019
      January               February               March
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
       1  2  3  4  5                  1  2                  1  2
 6  7  8  9 10 11 12   3  4  5  6  7  8  9   3  4  5  6  7  8  9
13 14 15 16 17 18 19  10 11 12 13 14 15 16  10 11 12 13 14 15 16
20 21 22 23 24 25 26  17 18 19 20 21 22 23  17 18 19 20 21 22 23
27 28 29 30 31        24 25 26 27 28        24 25 26 27 28 29 30
                                            31

       April                  May                   June
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6            1  2  3  4                     1
 7  8  9 10 11 12 13   5  6  7  8  9 10 11   2  3  4  5  6  7  8
14 15 16 17 18 19 20  12 13 14 15 16 17 18   9 10 11 12 13 14 15
21 22 23 24 25 26 27  19 20 21 22 23 24 25  16 17 18 19 20 21 22
28 29 30              26 27 28 29 30 31     23 24 25 26 27 28 29
                                            30

        July                 August              September
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6               1  2  3   1  2  3  4  5  6  7
 7  8  9 10 11 12 13   4  5  6  7  8  9 10   8  9 10 11 12 13 14
14 15 16 17 18 19 20  11 12 13 14 15 16 17  15 16 17 18 19 20 21
21 22 23 24 25 26 27  18 19 20 21 22 23 24  22 23 24 25 26 27 28
28 29 30 31           25 26 27 28 29 30 31  29 30


      October               November              December
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
       1  2  3  4  5                  1  2   1  2  3  4  5  6  7
 6  7  8  9 10 11 12   3  4  5  6  7  8  9   8  9 10 11 12 13 14
13 14 15 16 17 18 19  10 11 12 13 14 15 16  15 16 17 18 19 20 21
20 21 22 23 24 25 26  17 18 19 20 21 22 23  22 23 24 25 26 27 28
27 28 29 30 31        24 25 26 27 28 29 30  29 30 31
```

## 今月だけ見たい

```
$cal -m 7 2019
     July 2019
Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
```

```
$ncal  -w
    July 2019
Mo  1  8 15 22 29
Tu  2  9 16 23 30
We  3 10 17 24 31
Th  4 11 18 25
Fr  5 12 19 26
Sa  6 13 20 27
Su  7 14 21 28
   27 28 29 30 31
```
Fetchオブジェクトのパラメータ操作について

SAS ViyaはAIプラットフォームです。PythonやJava、Rなどの言語を通して利用できます。そのSAS Viyaの中で使われているのがCASTableというテーブルオブジェクトです（CASはCloud Analytic Servicesの略です）。CASTableからデータを取得する方法は幾つかありますが、今回はFetchオブジェクトのパラメータ操作について紹介します。

## SAS Viyaに接続する

まずはSAS Viyaに接続します。

```python
from swat import *

cashost='localhost'
casport=5570
useremail='dev@sas.com'
userpassword='password'
casauth='~/.authinfo'
conn = CAS(cashost, casport, useremail, userpassword, caslib="casuser")
```

## データをアップロードする

CSVファイルのデータをアップロードします。今回は有名なIRISのデータです。

```python
out = conn.upload('./iris.csv')
```

## Fetchオブジェクトを取得する

Fetchオブジェクトをconnから取得します。

```python
fa = conn.Fetch(to=5, table=dict(name='iris', caslib='casuser'))
```

## パラメータを確認する

まずは現在の設定を見てみます。

```python
fa
# ?.table.Fetch(table=dict(caslib='casuser', name='iris'), to=5)
```

## 設定値を取得する

`get_param` で取得できます。

```python
fa.get_param('to')
# 5
```

## 設定値を取得する（複数）

引数を複数指定できます。

```python
fa.get_params('to', 'table.name')
# {'table.name': 'iris', 'to': 5}
```

## 設定値を削除する

`del_params` で設定値を削除できます。

```python
fa.del_params('to', 'table.caslib')
fa
# ?.table.Fetch(table=dict(name='iris'))
```

## 設定があるか確認する

`has_param` で設定値の存在を確認できます。

```python
fa.has_param('table.name')
# True
```

## 設定があるか確認する（複数）

引数を複数与えれば、複数の設定値があるかまとめて確認できます。この場合、すべての設定がないとFalseになります。下の例の場合、`table.name` はありますが `to` がないためにFalseになります。

```python
fa.has_param('table.name', 'to')
# False
```

## プロパティでアクセスする

メソッドを使わずにプロパティを使うこともできます。

```python
fa.table.name
# iris
```

```python
fa.table
# {'caslib': 'casuser', 'name': 'iris'}
```

この場合も削除ができます。

```python
del fa.table.caslib
fa.table
# {'name': 'iris'}
```

## まとめ

Fetchオブジェクトを使うことでデータの取得が容易になります。また、プロパティの値を変更すれば取得されるデータも変わります。ぜひ使いこなしてください。

[SAS for Developers | SAS](https://developer.sas.com/home.html)
csvファイルにカラムを追加する

**したいこと**
  cvsファイルに任意のカラムを追加して別ファイルで出力
 
 **使用するコマンドレット**

 - Test-Path
 - Get-Content 
 - Out-File


 **サンプルコード**
 
```powershell
    Set-Location "C:\Users\Administrator\Documents\sample"
    
    $target ='sample_20190329.csv'  #csv  
    $date = '20190329'  #ファイル日付   
    $inputdate = '20190423'    #実行日
    $file = '.\' + $target		#ファイルパス    
    $output = 'output_test.csv'	#出力ファイル
    
    #ファイルが存在する場合に処理    
    if (Test-Path $file) {    
	    #csv読み込み～カラム挿入～書き込み 
	    foreach ($line in Get-Content $file) {    
		    $line + ','  +  $date + ',' + $inputdate|    
		    Out-File $output -Append -Encoding Default    
    }
```