OmniAICreator/Qiita-1.07M huggingface dataset:
rails test環境構築でエラーが出た

### 開発環境
Windows10
ruby 2.3.3
rails 5.2.2

testをしたかったのだができなかった。
本当はもっと長いエラーが出ましたが必要なところだけ抜粋。

```
C:\Users\myapp>rails test test/controllers/home_controller_test.rb:7
C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/bundler-1.16.2/lib/bundler/runtime.rb:84:in `rescue in block (2 levels) in require': There was an error while trying to load the gem 'chromedriver-helper'. (Bundler::GemRequireError)
Gem Load Error is: not executable: "C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/chromedriver-helper-2.1.0/bin/chromedriver-helper"
Backtrace for gem load error is:
C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/common/platform.rb:135:in `assert_executable'
```
Gemfileの`gem 'chromedriver-helper'`に問題がありそう。

```ruby:Gemfile
group :test do
  # Adds support for Capybara system testing and selenium driver
  gem 'capybara', '>= 2.15'
  gem 'selenium-webdriver'
  # Easy installation and use of chromedriver to run system tests with Chrome
  gem 'chromedriver-helper'
end
```
`rails g`で作成したGemfileがminitestになってなかったので書き直した。

```ruby:Gemfile
group :test do
    gem 'minitest', '~> 5.10', '!= 5.10.2'
    gem 'rails-controller-testing'
end
```

コマンドプロンプトで`$ bundle install`を実行
※`$ bundle update`はだめ。


```
C:\Users\myapp>rails test test/controllers/home_controller_test.rb:7
Run options: --seed 39779

# Running:

.

Finished in 3.282664s, 0.3046 runs/s, 2.7417 assertions/s.
1 runs, 9 assertions, 0 failures, 0 errors, 0 skips
```

できた。わーい(*'▽')
Maya python で BlendShapes からメッシュを作る

Mayaで BlendShape で重みを変えて新しくメッシュを作ります.

変える重みのパターンが数十個や数百個になり多くなると, UI で手作業でやるのは面倒なので, python でやります.
 
https://download.autodesk.com/us/maya/2011help/CommandsPython/blendShape.html

で, 重みを変えてまずは blendshape を deform させます.
重みは (重みのインデックス, 重みの値)で指定します.
重みの名称は別途 listAttr で取得できます.

```
import maya.cmds as cmds

bs_name = 'blendspahe'
list = cmds.listAttr(bs_name + '.w', m=True)
print(list)
# [u'EyeOpen', u'EyeClose', ...]
```

重みパラメータを指定し, `edit=True` で変形できます.

```
cmds.blendShape( 'blendShape1', edit=True, w=[(0, 0.6), (1, 0.1)] )
```

Duplicate special して変形したメッシュを新しく作ります. name でノード名称を指定できます.

作ったメッシュは `pm.hidden` しておきます.

```
import maya.cmds as cmds
import pymel.core as pm

bs_name = 'blendsphape'
bs_list = cmds.listAttr(bs_name + '.w', m=True)

# ... setup weight table
# weight_table = [(0, 0.1), (1, 0.0), ...]

cmds.blendShape( bs_name, edit=True, w=weight_table )

src_obj = pm.PyNode('pBS') # blenshapes に対応したメッシュノード
dst_obj = pm.duplicate(src_obj, name = "new");

pm.hide(dst_obj)

```

## TODO

* Duplicate special のほうがよいか?
Quorumノードのnodekeyとenodeキーの生成

## Quorumとは
本家イーサリアムをフォークし、エンターププライズ版に改変したもの。

通常パブリックに公開されているイーサリアムノードも、Quorumを使うことで、プライベートなイーサリアムネットワークを構築することができる。

## プライベートなネットワークとは
特定のノードしか疎通し合えないということ。
ノードの特定には`enode`キーを使う。また、`enode`キーは`nodekey`から作成される。

## enodeキーを生成してみる
### ethereumパッケージのインストール
ubuntuの場合、以下を実行する。

```
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository -y ppa:ethereum/ethereum
$ sudo add-apt-repository -y ppa:ethereum/ethereum-dev
$ sudo apt-get update
$ sudo apt-get install ethereum
```

### nodekeyの生成
`tmp_file.txt`に`nodekey`を出力する。

```
$ bootnode -genkey tmp_file.txt
```


### enodeキーの生成
`tmp_file.txt`の`nodekey`を元にECDSAで計算された`enode`キーを出力する。

```
$ bootnode -nodekey tmp_file.txt --writeaddress
```


## 参考
- https://github.com/jpmorganchase/quorum/blob/master/docs/running.md
- https://ethereum.stackexchange.com/questions/28970/how-to-produce-enode-from-node-key
- https://techmedia-think.hatenablog.com/entry/2016/04/22/190810
AWS S3 の使い方 (aws-cli, boto3)

AWS S3 を aws-cli と boto3 で使ってみます。
bucket01 というバケットにアクセスできるとします。

A) aws-cli

A-0) バケットの一覧

```bash
aws s3 ls
```

A-1) ファイルの一覧

```bash
aws s3 ls s3://bucket01
```

A-2) ファイルのアップロード
>sample01.txt をアップロードします。

```bash
aws s3 cp sample01.txt s3://bucket01
```

A-3) ファイルの削除
>sample01.txt を削除します。

```bash
aws s3 rm s3://bucket01/sample01.txt
```

A-4) ファイルのダウンロード
>sample02.txt をダウンロード

```bash
aws s3 cp s3://bucket01/sample02.txt .
```

A-5) フォルダーのりネーム

```bash
aws s3 --recursive mv s3://bucket01/folder_a \
		s3://bucket01/folder_b
```

A-6) バケットの作成

```bash
BUCKET="bucket01"
#
aws s3 mb s3://$BUCKET
```

A-7) バケットの削除

```bash
BUCKET="bucket01"
aws s3 rb s3://$BUCKET --force
```

B) boto3

B-0) バケットの一覧

```py:list_buckets.py
#! /usr/bin/python

import boto3

s3 = boto3.resource('s3')

for bucket in s3.buckets.all():
    print(bucket.name)
```

B-1) ファイルの一覧

```py:s3_list.py
#! /usr/bin/python
#
import boto3

bucket_name = "bucket01"
s3 = boto3.resource('s3')

my_bucket = s3.Bucket(bucket_name)
for object in my_bucket.objects.all():
	print(object)
	print(object.key)
#
```

B-2) ファイルのアップロード
>sample01.txt をアップロードします。

```py:s3_upload.py
#! /usr/bin/python
#
import boto3

bucket_name = "bucket01"
s3 = boto3.resource('s3')

s3.Bucket(bucket_name).upload_file('sample01.txt', 'sample01.txt')
```

B-3) ファイルの削除
>sample01.txt を削除します。

```py:s3_rm.py
#! /usr/bin/python
#
import boto3

bucket_name = "bucket01"
s3 = boto3.resource('s3')

my_bucket = s3.Bucket(bucket_name)
s3_client = boto3.client('s3')
s3_client.delete_object(Bucket=bucket_name, Key='sample01.txt')
```

B-4) ファイルのダウンロード
>sample02.txt をダウンロード

```py:s3_download.py
#! /usr/bin/python
#
import boto3

bucket_name = "bucket01"
s3 = boto3.resource('s3')

s3.Bucket(bucket_name).download_file('sample02.txt', 'sample02.txt')
```

B-5) データの書き込み
>sample.json を作成

```py:s3_put.py
#! /usr/bin/python
#
import boto3
import json

s3 = boto3.resource('s3')

bucket_name = "bucket01"

json_key = "sample.json"
obj = s3.Object(bucket_name,json_key)
 
test_json = {'key': 'valueaaa',
		'key2': 'Hello'}
data = json.dumps(test_json).encode('utf-8')
r = obj.put(Body = data)
 
# get json data
print(obj.get()['Body'].read())
```

C) wget

バケットにバケットポリシー　s3:GetObject をつければ、次のようにして、ファイルのダウンロードが出来ます。

```bash
wget https://bucket01.s3.amazonaws.com/sample02.txt
```

ポリシーは次のようになります。

```text
{
  "Id": "Policy1546858622092",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1546858528773",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bucket01/*",
      "Principal": "*"
    }
  ]
}
```

参考ページ
[AWS S3 でページを公開する](https://qiita.com/ekzemplaro/items/dc2a8403c2096c232cff)
プログラムと美しさ：第五章　アーキテクチャ　―小さな世界―

～ プログラミングって面白そうと思った方に向けた連載エッセイ ～

　プログラム全体をどう構成するか。個々のロジックを組む前に、より広い視点で検討する。ソフトウェアの構造は、建築にならって「アーキテクチャ」と呼ばれる。それを設計する人が「アーキテクト」である。その工程を「方式設計」と呼ぶこともある。

　プログラマは、アーキテクトによって設計されたアーキテクチャに従ってプログラムを組む。小さなチームでは、プログラマがアーキテクトを兼ねることも珍しくない。

　アーキテクトは、技術者にとって憧れの職種と言ってよいだろう。技術者は職人であり、職人はずっと現場で働きたいものである。組織からは加齢とともに管理職への転身を勧められるが、適性も意欲もついてこない場合が少なくない。アーキテクトは、技術者の上級職と位置づけられる。一般的には報酬も高い。発言力もある。マネージャよりも技術者の尊敬を集めることができる。高度なスキルとバランス感覚、構成力、経験が求められるので、誰もがなれるわけではないし、現状、専門職としてのポストは限られているが、管理者コース以外のキャリアパスとして、今後定着していくことが期待されている。

　アーキテクチャ設計で検討する対象は、ミドルウェア、ソフトウェアの枠組み、コーディングスタイル、ネットワーク環境、データベース構成など幅広い。大きな組織では、専門分野ごとにアーキテクトが分業化されることもあるだろう。アーキテクチャはプログラムの基盤となるので、品質や生産性に対する影響は甚大である。規模が大きくなれば、何百人のプログラマがそれに沿って進むことになる。その失敗は取り返しのつかない事態を招くおそれがある。

　責任が重大な一方で、もちろん相応のやりがいはある。プログラムの共通基盤を設計するというのは、技術者の腕の見せ所であり、もっとも「おいしい」部分を任されているとも言える。通常、個々のプログラマが担当するのはソフトウェアの一部分であるが、アーキテクチャや、フレームワークと呼ばれる共通の枠組みにおいては、全体像を構築することになる。言わば、小さな世界を作り上げるのである。腕も振るいたくなろう。

　美しいアーキテクチャは美しいプログラムの礎となる。だが、アーキテクチャにはプログラムから独立した、それ自体の美しさがある。アーキテクトは美意識の強い人種である。美しさにこだわりを持つ人が多い。また、そうでなくては困る。もちろんその職務に限っての話である。幸運なことに、この美への志向はアーキテクチャの実効性とうまく合致する。最適な方式の選択、均整のとれた部品構成、簡素な実装を促す共通基盤、無駄のない処理の流れ――これらを追求することで、美しいアーキテクチャが構築される。それがプログラムの品質、生産性を支えていくのである。

　さあ、美しいアーキテクチャができ上がった。素晴らしい。頑張ったのだから、うっとり自賛するくらいの権利はあるだろう。ただし、いっときである。アーキテクチャは作って終わりではない。プログラミング工程が進めば、想定外のことは必ず起こる。起こりうることはすべて想定しておくのが理想であるが、現実には不可能だし、無駄も多い。最初の決め事は最小限に抑え、必要になってから検討する、という方法論で進められることもある。いずれにしても、アーキテクチャは必要に応じて追加、変更していくものであり、それに耐えうる保守容易性が望まれるのは、プログラム自体と同様である。

---

[序章](https://qiita.com/CodeOne/items/01b4e49a7d5a84d48c71)
[第一章　その美の特徴](https://qiita.com/CodeOne/items/1969ec81d04529fbdb34)
[第二章　見た目と冗長性](https://qiita.com/CodeOne/items/96df6d1140301347156a)
[第三章　ロジック](https://qiita.com/CodeOne/items/3009027a2f8b892e2b6b)
[第四章　命名](https://qiita.com/CodeOne/items/dfc3ace22c46273dc22c)
第五章　アーキテクチャ
[第六章　リファクタリング](https://qiita.com/CodeOne/items/df50fad6bb0bd2f0096f)
[第七章　デザインパターン](https://qiita.com/CodeOne/items/0ac628d6be24328ecc10)
[第八章　正規化](https://qiita.com/CodeOne/items/5df2a5e38cc4c1c90a7a)
[終章](https://qiita.com/CodeOne/items/12ad8d54329bc946b85c)
reactのreducerとreduxの復習メモ

## 環境はcodesandbox
まずcodesandbox最初の状態をコメントアウトする

```javascript
// import React from "react";
// import ReactDOM from "react-dom";

// import "./styles.css";

// function App() {
//   return (
//     <div className="App">
//       <h1>Hello CodeSandbox</h1>
//       <h2>Start editing to see some magic happen!</h2>
//     </div>
//   );
// }

// const rootElement = document.getElementById("root");
// ReactDOM.render(<App />, rootElement);


//ここから追記
import { createStore } from "redux";

const reducer = (state = 0, action) => {
  switch (action.type) {
    case "PLUS_ONE":
      return state + 1;

    default:
      return state;
  }
};

const store = createStore(reducer);

console.log(store);

// subscribeとは、stateが変更されたときにこれを実行してください
store.subscribe(() => {
  // 自分自身のstateを表示してくれるgetState()
  console.log(store.getState());
});

// この上の状態だとアクションが発行されていないのでdispatch(発射)してアクションを発行する必要がある

// ここでtype "PLUS_ONE"というアクションを送ったのでreducerで受け取って一致しているものを返してくれる（つまり一致したstateを返す）
store.dispatch({
  type: "PLUS_ONE"
});
```
これで`subscribe`によって(stateが変更されたときに実行される)`1`と表示される


そしてこの次にまた同じように

```javascript
store.dispatch({
  type: "PLUS_ONE"
});
```
するとアクションが発行されるので`2`という数字が表示される


## 用語に慣れよう(個人的メモ)
reactを触る際、とにかく用語が出てくるので英語ができない私（頭のスペックが悪いので）にとっては用語を整理したほうが良いと感じた

一通り上の方でコメントしているが、そこを理解すればデータの流れを把握することができる

## まとめ
react,redux特にプロジェクトになるとかなりコードを読み解けなくなる、、、が、基本をおさらいしてデータの流れをきちんとわかれば追いやすくなる（当然ですよね、まだまだスペック弱くてすみません）

## イメージのまとめ
`Component connected to store → action(dispatch) → reducer → new State → sotre → stateを上書き`
1.storeを通してコンポーネントからアクションを発行
2.dispatch(reduxでいうとmapDispatchToProps)されてreducerに行く
３.reducerを通って処理が実行され、新しいstateを作る（newStateが作られる）
4.それがstoreの中のstateを上書きして新しくレンダリングされる

的なイメージ
禁断の呪文「rm -rf /」をやってみた

よく聞く禁断の呪文である `rm -rf /` ですが本当に死ぬのでしょうか。

よほど変な環境でなければ`--no-preserve-root`オプションがないと、この禁断の呪文は動かないはずですが、不安になったので仮想マシンを立てて実験してみました。

# tl;dr

**死ぬときは死ぬ。** `--no-preserve-root`で安心してはならない。

# 注意事項

* 動作に関して一切の保証はありません。
* もしやらかして謝罪会見になったりクビになったりしても責任は負えません。
* エンターテイメントの一種として見てください。

# Ubuntu 18.04 LTS Bionic Server

```sh
root@blackmagic:~# rm -rf /
rm: it is dangerous to operate recursively on '/'
rm: use --no-preserve-root to override this failsafe
```

ですよねー。

# CentOS 7.4

「会社ではUbuntuとか使わんしｗ」みたいなヒンシュクを買いそうなのでこちらでもやってみます。

```sh
[root@blackmagic ~]# rm -rf /
rm: it is dangerous to operate recursively on '/'
rm: use --no-preserve-root to override this failsafe
```
ですよねー（2回目）。念の為fedora 28でもやってみましたが、結果は一緒でした。

# Alpine Linux 

Alpineなら消えるという声が来たのでやってみます。

```sh
blackmagic:~# rm -rf /
rm: can't remove '/sys/module/virtio_net/sections/.rodata': Operation not permitted
rm: can't remove '/sys/module/virtio_net/sections/__ex_table': Operation not permitted
.
.
.
rm: can't remove '/sys/module/8250/parameters/skip_txen_test': Operation not permitted
blackmagic:(unknown)#
```


**まじで！？**詳しく調べると、**busyboxのrmは禁断の呪文がオプションなしで動く**ようです。Alpineはbusyboxが使われているので破滅してしまいました。

# Arch Linux

```sh
[root@blackmagic-arch ~]# rm -rf /
rm: it is dangerous to operate recursively on '/'
rm: use --no-preserve-root to override this failsafe
[root@blackmagic-arch ~]#
```

# openSUSE

```sh
blackmagic-opensuse:~ # rm -rf /
rm: it is dangerous to operate recursively on ‘/’
rm: use --no-preserve-root to override this failsafe
blackmagic-opensuse:~ #
```

# Gentoo
```sh
blackmagic-gentoo ~ # rm -rf /
rm: it is dangerous to operate recursively on ‘/’
rm: use --no-preserve-root to override this failsafe
blackmagic-gentoo ~ #
```
# さいごに

そもそも `rm -rf /` を入力しなければならない状態がおかしいです。相対パスを使うべきです。
Linux コマンド awk がまじで毎回分からないのでいったん整理する

Linux command hard to understand for me so wanna clear it 
Linux コマンド awk がまじで毎回分からないのでいったん整理する

# stdout and pipe awk command case

パイプで標準出力を受け取るケース

![image](https://user-images.githubusercontent.com/13635059/50748007-61f0ec80-127a-11e9-999a-ac3cc8fd0134.png)

# awk command arg as file case

awk コマンドに 引数として ファイルを指定するケース

![image](https://user-images.githubusercontent.com/13635059/50748011-6a492780-127a-11e9-9f06-51f9669f1153.png)

# in brace syntax is awk original

ブレースで囲まれた部分は awk 独自の記法

![image](https://user-images.githubusercontent.com/13635059/50748043-a1b7d400-127a-11e9-87b1-1664d08576c6.png)

# Dollar and numbers is split parts  

ドルと数字は分割を扱う

![image](https://user-images.githubusercontent.com/13635059/50748358-78984300-127c-11e9-8d68-2d3c37a51a57.png)

# Able to specify multiple parts

複数を出力することもできる

```rb
echo "a,b,c" | awk -F'\,' '{ print $1 $2 }'
ab
```

# comma in awk syntax makes space separated text  in stdout 

awk 記法としてのカンマを使うと、結果も分割出力される

```rb
echo "a,b,c" | awk -F'\,' '{ print $1, $2 }'
a b
```


https://twitter.com/YumaInaura

https://github.com/YumaInaura/YumaInaura/issues

https://github.com/YumaInaura/YumaInaura/issues/290








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【メモ】プレビュー画像が見えるイメージアップローダー脱Jquery版

```haml
.imageUploader
  .imageUploader__button
    %button{onClick: "buttonClick('hoge')"} 選択
    %input{type: 'file', onChange: 'imageUploader(event)', id: 'hoge'}
  .imageUploader__preview
```

```scss
.imageUploader{
  &__button{
    button{
      width: 100px;
      background-color: #CCC;
      text-align: center;
      border: 1px solid #333;
      -webkit-appearance: none;
    }
    input[type='file']{
      display: none;
    }
  }
  &__preview{
    width: 400px;
    height: 300px;
    img{
      display: block;
      width: 100%;
      height: 100%;
      object-fit: cover;
    }
  }
}
```

```javascript
function buttonClick(inputID){
  document.getElementById(inputID).click();
};
function imageUploader(e){
  var imageFile = e.target.files[0];
  var reader = new FileReader();
  var imageScreen = document.querySelector('.imageUploader .imageUploader__preview');
  var imageTag = document.querySelector('.imageUploader__preview img');
  if(imageTag != null){
    imageScreen.removeChild(imageTag);
  }
  reader.onload = function(){
    var img = document.createElement('img');
    img.setAttribute('src', reader.result);
    imageScreen.appendChild(img);
  };
  reader.readAsDataURL(imageFile);
};
```
入社三年目SIerのチャットボット記録

##はじめに
こんにちは。地方SIer企業三年目の若手エンジニアです。
去年の夏からチャットボットの提案から開発までほぼ一人で行ってきたので、その中で苦労したことや、気づきについて少しまとめてみようと思います。




## まず何から始めたのか？
上層からは「自社でチャットボットサービスを開発して売っていきたいから頑張って」とだけ言われてスタートしました。

入社してから、COBOLでの開発と単体テストしかやってきていなかったので正直「チャットボットって何それおいしいの？」っていうレベルでした。

最初の二週間ぐらいは、とにかくググったり、セミナーや勉強会に参加して、知識をインプットすることに専念しました。

「webアプリケーションの仕組み」、「クラウドの基本的な知識」を習得し、「**チャットボット＝AIではない**」ということに気づき始めたぐらいから、具体的にどういうチャットボットを開発していくか検討しました。

## どんなチャットボットを開発したのか
ググっている中で問い合わせ対応チャットボットの事例が多く、会社でもOffice365を導入したばかりでヘルプデスクが忙しそうだったので、**Office365FAQチャットボット**を開発することにしました。

結果から言うと、QAの範囲が広く、FAQを抽出できるほどのQAデータが十分に用意できず精度もあまり出なかったため断念しました。。。

## どのように開発したのか
AzureBotService + QnAMakerで実装しました。
watsonのNLC + R&R（現在はDiscoveryに統合）も選択肢にありましたが、決め手となったのは以下の点です。

- 会社にAzureを利用できるサブスクリプションがあった
- 問い合わせ学習ナレッジを簡単に作成することができた（当時のR&RはCLIからしか操作できずとても面倒でした）
- 様々なチャネルとの接続が簡単にできた（botconnector）
- ソースのテンプレートが用意してあり、デプロイが簡単だった
- CI/CDもポータルから簡単に設定できた

最終的なアーキテクチャはもうすこし複雑になりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/195221/5246b906-f51e-f957-5b6b-0ee29bf97feb.png)


## 開発で苦労した点
#### バージョンアップの対応
SDKのバージョンアップ、ライブラリの廃止、エミュレータのバージョンアップで突然動かなくなることが多々ありました。テンプレートががらりと変わって今までのノウハウが通用しなかったりと初心者にはとても辛い部分がありました。
[BEACHSIDE BLOG](https://beachside.hatenablog.com/)や[技術の戯れ](https://yseosoft.wordpress.com/)の二つのブログには大変お世話になりました。本当にありがとうございます。

#### 学習データの用意
結局これです。今回はOffice365FAQチャットボットなのでOffice365に関するQAデータが必要でした。ヘルプデスクの問い合わせ履歴などから、
QnAMaker用の学習データを作成する作業を行いました。学習データを作成する上では以下の点を考慮してクレンジングを行いました。

- 質問と回答のペアのデータを作成する
- ペアのデータは一問一答の形式とする
- 質問文と回答文はそれぞれ100文字か～150文字以内になるべく収める
- 抽象的な質問は入れない。一つの回答に絞れないなど

一通りデータをクレンジングすると、200件のQAデータは60件～80件ほどになりました。

Office365FAQのチャットボットの検討段階で、QAデータが200件程あるから、何とかなるだろうと思っていましたが、実際使えるデータは100件も満たないものでした。これが結構な落とし穴で、**データの件数はあっても、それが使えるデータ（学習モデルに適したデータなのか）とは限らない**ということです。

## 提案での気づき
具体的な提案活動は、以下の二点を中心に活動しました。

- 既存顧客に向けてのセミナー開催
- チャットボットのデモンストレーション

セミナーに関しては、「働き方改革」という題目で、問い合わせチャットボットのメリットを紹介しました。セミナーやお話を聞いてくれる既存顧客がいることは、地方SIer企業が今まで積み上げてきた信頼のおかげだなと思いました。

これらの活動の中で、下記二点が個人的にチャットボットを成功させる上でのポイントだと思っています。

１．チャットボットの期待値を合わせること
お客様の中では、「AIが勝手に学習して何でも答えてくれるんでしょ？」という認識の方が見受けられました。提案前にチャットボットの期待値を合わせることはとても重要です。以下の点を意識してお客様には説明していました。

- チャットボットは何でも答えてくれない
- 学習データを用意する必要がある
- FAQのような一問一答などが効果的
- 複雑な質問の場合は、回答にたどり着けるような会話フローを事前に設計する必要があること。（結構大変）

人間が受け答えする部分とチャットボットに自動応答させる部分を役割分担させることが大切で最初からチャットボットにすべて答えさせようとすると失敗します。

２．ユーザーのモチベーション
問い合わせチャットボットの場合、ユーザーはQAデータを用意したり、導入後もQAを追加したり、修正したりと結構めんどくさいです。

ユーザーのモチベーションというのは、**「チャットボットを育てる」**という感覚です。
この感覚がチャットボットを長く利用していただけるポイントかなと思います。

問い合わせチャットボットの場合は、一度答えられなかったらもう使われないというケースが多いです。
しかし正答率をあげるためには、ユーザーにたくさん利用してもらい、会話データをためて、その会話データを分析し、新たなQAを追加したり、修正したりする作業が必要になります。

利用者と管理者ともにチャットボットに対する愛着が、上記のサイクルを回す手助けになると思います。（もちろんシステム上の仕組みを重要です）

チャットボットにキャラクターをつけたり、発話の個性をもたせたほうが、愛着がわきやすいです。


## 最後に
完全な自己満記事で申し訳ないですが、若手SIerがチャットボットに奮闘した軌跡をまとめてみました。もし同じ境遇やチャットボットに関わっている人の何かしらの手助けになればよいなと思います。
最後まで読んでいただきありがとうございました。
Object detection実装：post-processing(主にNMS）実装

前回は、学習時用にencodeしたanchorのdecoderを実装した。

今回の[コミット](https://github.com/festa78/objdet-tf/commit/c2db58644d0c11a411d948772fbe25bd11197dd1)では、予測結果の後処理としてNon-max suppression（NMS)を使ったboxの間引き処理を実装した。加えて結果確認のためのvisualizationも実装している。

NMSは与えられたboxの予測結果に対して、ある程度のオーバーラップがあるbox間において、objectness scoreが低い方を除去する処理である。
この処理は各クラスのboxに対して順次行われる。
TensorFlowには[tf.image.non_max_suppression](https://www.tensorflow.org/api_docs/python/tf/image/non_max_suppression)という関数としてすでに実装されているため、これをベースに実装を行う。

実装のポイントとしては：
・予測結果のバッチをtf.unstackにてunrollしてfor loopでiterateし、tf.boolean_maskを用いて
クラス毎の結果を抽出する。
・non_max_suppressionは除去後に残ったboxのindexを返すので、tf.gatherと組み合わせてboxを取得する。
などである。

動作確認の一環として簡単なtensorboard上で表示するvisualizationも実装。
ただし。TensorFlowは質の良い描画関数がないため。tf.py_funcと組み合わせてopencvを用いて描画する。
【Go言語】GORMで外部キー制約を設定する

# 初めに

[GORMの公式マニュアル](http://gorm.io/ja_JP/docs/has_many.html)を読んでいるとAssociationsの項目に外部キーについての記述が有る。 
例に倣ってモデル定義しGORMのオートマイグレーション機能を実行してみた。 
しかしDBテーブルには外部キー制約は反映されなかった。

# どの様に外部キーを反映させるか？

外部キー制約について明示的に設定する必要が有る。

例えば以下の様なGORM向けモデルが有ったとする。
Userは複数のEventを持つ関係。

```go
type User struct {
	ID uint
	Name string
	Events []Event
}

type Event struct {
	ID uint
	UserID uint　 ←　 外部キーにしたい
	Number uint
}
```

オートマイグレーションに続けて以下の様に外部キー設定を実行する。

```go
db.AutoMigrate(User{})
db.AutoMigrate(Event{}).AddForeignKey("user_id", "users(id)", "RESTRICT", "RESTRICT")
```
外部キー制約を設定出来た。

```go
CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

CREATE TABLE `events` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned DEFAULT NULL,
  `number` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `events_user_id_users_id_foreign` (`user_id`),
  CONSTRAINT `events_user_id_users_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
```
 
CASCADE動作させたい場合。

- DELETE　CASCADE（第3引数を変更する）

```go
db.AutoMigrate(Event{}).AddForeignKey("user_id", "users(id)", "CASCADE", "RESTRICT")
```
- UPDATE　CASCADE（第4引数を変更する）

```go
db.AutoMigrate(Event{}).AddForeignKey("user_id", "users(id)", "RESTRICT", "CASCADE")
```

# おまけ

複合ユニークキーを設定したい場合、

```go
db.Model(&Event{}).AddUniqueIndex("unq_xxxx", "user_id", "number")
```

以上。
Illustratorで特定レイヤーを削除するscript

**2019/01/08  コメントで指摘をいただいた「レイヤー削除」に関する処理を追加しました。**

納品のたびに「レイヤーの削除」「アートボードの削除」をやっているが、手作業だと漏れがある。
毎回の作業なので半自動化するために、レイヤーとアートボードの命名規則を作り、scriptを組む。

#### 命名規則の例
 - 削除したいレイヤー名
   + 「抜き罫」、「図面用」
 - 削除したいアートボード名
   + 「図面用」


## レイヤー名を指定して削除
行う操作の順序は以下の通り。
1. 特定のレイヤー名を検索　[^1]
2. 検索したレイヤーのindexNumberを保存
3. indexNumberに基づいて削除

[^1]: 同名のレイヤーが存在しないことが前提。同名レイヤーをまとめて削除したい場合は、indexNumberを配列に格納すれば対応できるが、そもそも同名レイヤーがあると混乱の元なので避けたほうが良い。

```抜き罫削除.js
// 「抜き罫」レイヤー削除
removeNUKIKEI(activeDocument);
function removeNUKIKEI(docObj)
{
    var i = searchLayerNum (docObj, "抜き罫");
    if( i == -1 ){
        //　抜き罫レイヤーがないなら何もしない
    }
    else{
        var layObj = docObj.layers;
        removeLayer(layObj, i);
    }
}

// レイヤー名検索
function searchLayerNum(docObj,layName){
    layObj = docObj.layers;
    for (i=0; i<layObj.length; i++){
        if( layObj[i].name == layName ){
            return i;
        }
    }
    return -1;  // 見つからなかったら-1を返す
}

// レイヤー削除
function removeLayer(layObj, tgtNum){
        layObj[tgtNum].locked = false;
        // 非表示レイヤはremove()しようとするとエラー失敗する
        layObj[tgtNum].visible = true;
        layObj[tgtNum].remove();
    }
```

## アートボードも名前から削除
アートボードもレイヤーと同様に名前から検索し、削除することが可能。

```図面用削除.js

// 図面用アートボードとレイヤーの削除
removeDRAWING(activeDocument);
function removeDRAWING(docObj){
    var i = searchArtboardNum (docObj, "図面用");
    if( i == -1 ){
        //　図面用アートボードがないなら何もしない   
    }
    else{
        var artObj = docObj.artboards;
        artObj[i].remove();
    }

    i = searchLayerNum (docObj, "図面用");
    if( i == -1 ){
        //　図面用レイヤーがないなら何もしない
    }
    else{
        var layObj = docObj.layers;
        removeLayer(layObj, i);
    }
}
// アートボード名検索
function searchArtboardNum(docObj,artName){
    artObj = docObj.artboards;
    for (i=0; i<artObj.length; i++){
        if( artObj[i].name == artName ){
            return i;
        }
    }
    return -1;  // 見つからなかったら-1を返す
}
// レイヤー名検索
function searchLayerNum(docObj,layName){
    layObj = docObj.layers;
    for (i=0; i<layObj.length; i++){
        if( layObj[i].name == layName ){
            return i;
        }
    }
    return -1;  // 見つからなかったら-1を返す
}

// レイヤー削除
function removeLayer(layObj, tgtNum){
        layObj[tgtNum].locked = false;
        // 非表示レイヤはremove()しようとするとエラー失敗する
        layObj[tgtNum].visible = true;
        layObj[tgtNum].remove();
    }
```
Amazon linux2でletsEncrypt証明書を取得しようとした時に手こずったログ


下の記事でec2からletsEncrypt証明書を取得しようとした際、OSがAmazonLinux2だったがために詰まったところの補足。類似記事はきっとあるけど気にしない。

[LB(ALB)配下のec2からLetsEncrypt証明書を取得しようとしたら、別ホストが認証リクエストを受けて困った](https://qiita.com/tkalive/items/463af8579d6be6a8f428)


```
# cat /etc/system-release
Amazon Linux release 2 (Karoo)
```
（以下、全てroot権限での操作になります）

## certbot-autoが --debugオプションつけてもエラー

「amazonLinux + letsEncrypt」で検索すると、たいてい出てくる「--debugオプションつければok」が、Amazon linux2だと通用しなくて怒られる。

> Sorry, I don't know how to bootstrap Certbot on your operating system!

certbot-auto（中身はpythonスクリプト）を見ると、ExpermentalながらAmazonLinuxには対応しているようなんだが、その判定条件に引っかかってない。判定するファイルを変えて対応

```diff:certbot-auto
-elif [ -f /etc/issue ] && grep -iq "Amazon Linux" /etc/issue ; then
+elif [ -f /etc/system-release ] && grep -iq "Amazon Linux" /etc/system-release ; then
  Bootstrap() {
    ExperimentalBootstrap "Amazon Linux" BootstrapRpmCommon
  }
  BOOTSTRAP_VERSION="BootstrapRpmCommon $BOOTSTRAP_RPM_COMMON_VERSION"
```

## EPELがねーよエラー
> To use Certbot, packages from the EPEL repository need to be installed.

とか怒られた場合は、

```
amazon-linux-extras install -y epel
```

## augeasがねーよエラー

どのタイミングでどう怒られたか覚えてないけど

```
yum install augeas
```

## aws-cliコマンドを使ってIAMやLBに登録する場合

certbot-autoまでなら以上でクリアできた。が、冒頭の参照記事でそれをaws-cli使ってIAMやLB(elb/alb）に登録する場合は、さらにパッケージが必要

```
yum install jq
```
laravel で vue.js , axios を使う

npm install やらなんやら。
わけわからんし、超面倒。
直接読み出そうぜ。


まずはルーティング。
・/api/test/ にアクセスしたらデータを取得。
・それ以外はすべて welcome.blade.php に来るようにする。

```welcome.blade.php

<?php
Route::prefix('api')->group(function() {
    Route::get('test','NikkiController@test');
});

Route::get('/{app}', function () {

    \File::cleanDirectory(storage_path()."/framework/views/");//キャッシュがうざいので毎回削除する。本番ではこれを消す。
    return view('welcome');
})->where('app', '.*');
?>

```



```Http/Controllers/NikkiController.php

    public function test()
    {
        $res = Nikki::query()
            ->select('id','title')
            ->get();
        return $res;
    }


```
 



```welcom.blade.php

<!doctype html>
<html lang="{{ app()->getLocale() }}">
<head>
    <meta charset="utf-8">
    <meta name="csrf-token" content="{{ csrf_token() }}">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Laravel-Vue-todo</title>
</head>
<body>


<div id="app">
    <button @click="request">データ取得</button>
    <ul >
        <li v-for="item in items">@{{ item.title }}</li>
    </ul>
</div>




<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

<script>
    const app = new Vue({
        el: '#app',
        data: {
            items: [] //データ格納
        },
        methods: {
            request: function(){ //←axios.getでデータを取得
                axios.get('/api/test').then((res)=>{
                    console.log(res.data);
                    this.items = res.data //取得したデータをitemsに格納
                })
                    .catch(error => console.log(error))
            }
        },
        // created() {  //最初にメソッドを実行
        //     this.request()
        // },
    });
</script>

</body>
</html>

```


たったこれだけでOK。
MojaveのダークモードでMySQL Workbenchの色がおかしい場合の対処法

## なんかおかしくない？
MacのOSをMojaveにした後MySQL Workbenchのverを`8.0.13`にあげるとWorkbenchの色もダークモード(?)に変わっていました。

ぱっと見はかっこいいのですが、視認性が最悪です。
例えば左のサイドバーは濃いグレーの上に黒の文字なので全然見えないです。

リザルトの「Apply」「Revert」のボタンなんかもほぼ見えないです。

![Mysqlbenchモザイク.png](https://qiita-image-store.s3.amazonaws.com/0/190874/6cc7a10c-1730-c04c-d80f-cbff6b0a954b.png)

こちらの画面に至ってはセレクトボックスの値が見えないです。
白バックに白文字なのでしょうか。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/190874/2b107a27-09f2-aba9-59a6-9030ab920bc1.png)

どうにかする方法はないかと調べたらこんなことが書かれていました。

> MySQL Workbench on macOS 10.14 Mojave was tested with
       positive results. The new Dark Mode feature is not yet
       compatible with all screens and should not be enabled for
       this release.

`8.0.13`ではMojaveの新しいダークモードに完全に互換性があるのではないとのことです。

こちらのコマンドで元のWorkbenchの色に戻すことができます。

```
defaults write com.oracle.workbench.MySQLWorkbench NSRequiresAquaSystemAppearance -bool yes
```


ダークモードの色はかっこいいので次のアップグレードでちゃんと使えるようになってほしいですね。

## 参照
[MySQL Workbench with OSx 10.14 Color Issue](https://bugs.mysql.com/bug.php?id=92902)
[
Changes in MySQL Workbench 8.0.13 (2018-10-22, General Availability)](https://dev.mysql.com/doc/relnotes/workbench/en/wb-news-8-0-13.html)

## 追記(2019-01-23)
1/21に公開されたver`8-0-14`にて修正されていました！

>MySQL Workbench now supports macOS 10.14 Mojave, including full compatibility with the Dark Mode color scheme. (Bug #28831956, Bug #92902)

https://dev.mysql.com/doc/relnotes/workbench/en/news-8-0-14.html

![image.png](https://qiita-image-store.s3.amazonaws.com/0/190874/c9385024-8635-5150-fe3f-a8eecb24a44c.png)
シンタックスハイライトのカラーもかっこいいです！
Visual Studio 2017 が急に重くなった

自分のブログでも書いたんですがこっちにも書きます
[こちら](https://ayano.hateblo.jp/entry/2019/01/06/122501)

あるとき Visual Studio 2017 で特定のプロジェクトを開くと、コードを書くたび、新しいファイルを開くたび、しばらく待たされてコーディングできたもんじゃないという状態になってしまってました。
Visual Studio の修復でもダメで、PC のリセットをかけてみても変わらずで、困ったなあと思ってたんですが、ほかのプロジェクトを開くとそこまで重くないので、たぶんプロジェクトの中のなにかが悪さをしてるかなと。
ファイルの多さが問題かと思ったんですが、それだとどっかの超巨大プロジェクトで同じような問題が起きてしまうので違うだろうな…と思っていろいろ調べてたんですが、

Stackoverflow は何でも知っています (チコ風
[Visual Studio 2015 is extremely slow - Stackoverflow](https://stackoverflow.com/a/41469113)
つまり `".vs" フォルダーを消せばええんやで` って言ってます (雑

ということで、プロジェクトのあるディレクトリの `.vs` フォルダーをまるっと削除することで解決しました。
`.vs` フォルダーは隠しフォルダーになっていて、中はプロジェクトを Visual Studio で操作したときの情報 (開いたファイルとかソリューション エクスプローラーの状態など) が含まれているようです。
[MyProjectフォルダと.vsフォルダは何に使用するものなのか - MSDN フォーラム](https://social.msdn.microsoft.com/Forums/ja-JP/a312ad60-d245-45ac-83a5-51a86c53fa69/myproject1250112457125231248012392vs125011245712523124801239920309)

おそらく、 `.vs` フォルダーの情報がぶっ壊れたんだろうなあと推測。とりあえず無事解決です。

これで年末年始めんどくさかった　結果として PC のリセットはしなくてよかったんですが、年始晴れやかな気持ちで迎えられたような、そんな感じがします。
viで文字化けを直す

# はじめに

Windowsで編集したファイルをCentOSで開こうとした際に文字化けすることがある。system localeを変更できればいいのだが、一時的にviで文字化けを回避したい場合は次のコマンドを使用する

# vim内の文字コード
vim内で編集/作成されるデータはバッファに書き込まれる。
この時、encoding(内部文字コード)に合わせてデータが書き込まれる。

## 確認方法
```console:
:set encoding
⇓
encoding=utf-8
```

## 文字コード指定方法
```console:
:set encoding=utf-8
```

# ファイル書き込み時の文字コード
vimのバッファからデータファイルに書き込む時の文字コード

## 確認方法
```console:
:set fileencoding
⇓
fileencoding=iso-2022-jp
```

<font color="red">※iso-2022-jpはJIS規格の文字コード</font>

## 文字コード指定
```console:
:set fileencoding=utf-8
```

## データに反映させるには？
文字コード指定を行った後、`:w`を使ってファイル出力することで、更新された文字コードでデータの書き込みを行う。


# ファイル読み込み時の文字コード
ファイル読み込み時の文字コードがデータの文字コードと不一致していることで文字化けを起こすことがある。

## 文字コード指定
```console:
:set ++enc=utf-8
```
[WPF]*とAutoの違いをきちんと把握しておらずミスった話

WPFで実装をしていて困ったので、備忘録としてあげておきます。
コントロールを配置したときに領域が思ったように確保されなくて困る時があります。
そういう場合、Gridの指定を見ると適切でない時があります。

# 例
幅205のMainWindowを用意し、Gridで\*を指定してButtonを置くと、

```csharp
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <TextBlock Text="abcdefghijklmnopqrstuvwxyz" Grid.Column="0" />
        <Button Content="Button" Grid.Column="1" Width="40"/>
    </Grid>
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245399/b22c383a-5bc7-cad0-5a69-f7cde0de0d8a.png)
Buttonが必要以上に領域を確保してしまっています。

しかし、GridでAutoを指定してButtonを置くと、

```csharp
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
        <TextBlock Text="abcdefghijklmnopqrstuvwxyz" Grid.Column="0" />
        <Button Content="Button" Grid.Column="1" Width="40"/>
    </Grid>
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245399/a895cbdb-0dc4-712e-b28a-8262bbc535b0.png)
Buttonが必要なサイズのみ確保します。

# \*とAutoは何が違う？
\*は「Gridに比例したサイズ」、Autoは「行列に配置されている内容の要素が必要とするサイズ」だけコントロールの領域を確保します。
上記の例を見ると、\*の場合、行を1対1の比率で定義されているため幅40以上にButtonの領域を確保してしまっています。これは\*が使用可能なスペースを指定した比率でコントロールを配置するためです。
Autoの場合は、Buttonの幅40だけを領域を確保しています。


# 戒め
Gridの指定が\*で定義した箇所にコントロールを置いていることに気づかず、思った以上に領域が確保されて「なんでだろうコントロールの設定ミスったかな」とコントロールばかり見て中々気づけなかった経験があります。
そんなときはGridの指定が正しいか確認しましょう。

# 参考
https://stackoverflow.com/questions/3164651/what-is-the-different-between-auto-and-when-setting-width-height-for-a-gri
https://blog.okazuki.jp/entry/20130106/1357483477
Macでの「画像をクリップボードに入れてコピー&ペーストでアップロード」って正式名称ないの？ないかも

Macでの「画像をクリップボードに入れてコピー&ペーストでアップロード」って正式名称ないの？ないかも

# 疑問

- Windows って最近のOSでもコピー&ペーストでの画像貼り付けできないの？と思い調べるが
- そもそも Mac での「クリップボードでの画像コピーペースト・アップロード」ってなんていうんだろう
- Github では pasting from the clipboard という表記

![image](https://user-images.githubusercontent.com/13635059/50746079-b7c09700-1270-11e9-9ffd-722ebc01b3c6.png)

# Googled

- `mac pasting upload`
- Directly Paste Screenshots Into Documents という言い方ができた
- だけど公式ドキュメントではないっぽい

[macOS: Directly Paste Screenshots Into Documents - The Mac Observer](https://www.macobserver.com/tips/quick-tip/macos-directly-paste-screenshots-documents/)

# Mac keyboard shortcuts

- 正式名称がないような気もしてきた
- コピーしたコンテンツをドキュメントにコピーするという動作だから、それがテキストか画像かその他の形式のファイル化という区切りはないのかもしれない
- やっぱりsimple is best Apple Mac ya ha ha 

[Mac keyboard shortcuts - Apple Support](https://support.apple.com/en-us/HT201236)

```
Command-V: Paste the contents of the Clipboard into the current document or app. This also works for files in the Finder.
```









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
折り畳み表示のJavaScript

#CSSのdisplayプロパティを制御することで折りたたむ

最近のホームページで折りたたみ表示があるが、IDでやると個別に制御できるけど複数個所は面倒くさい。
なので、クラスで丸ごと折りたたみにする。


「非表示（初期）状態⇒表示状態」という流れでするなら以下の通り。


```折り畳み表示する箇所.html
<html>
    <head>
        <link rel="stylesheet" type="text/css" href="折り畳み表示する箇所.css">
		<script type="text/javascript" src="折り畳み表示制御.js"></script>
    </head>
	<body>
		<span onClick="openClose()">開閉ボタン</span>
		<span class="openHere">開閉するのはココ No.1</span>
		<span class="openHere">開閉するのはココ No.2</span>
	</body>
</html>
```
```折り畳み表示する箇所.css
.openHere{
	display:none;
}
```
```折り畳み表示制御.js
/**
* 折り畳み表示
* 'openHere'というクラスに属するオブジェクトをインライン要素or非表示に変更する。
*/
function openClose(){
	var obj = document.getElementsByClassName('openHere');
	for(var i=0;i<obj.length;i++){
		//非表示ならインライン要素に変更。表示状態なら非表示に変更。
		if(obj[i].style.display == "inline-block"){
			obj[i].style.display = "none";
		}
		else{
			obj[i].style.display = "inline-block";
		}
	}
}
```

複数の折り畳み箇所で表示/非表示が混在している場合は、初期表示を規定するクラスを分ける必要がある。
sendgridでx509: certificate signed by unknown authorityと出たときの対処法

この記事は以下の環境を前提としています

* alpineのDockerImageを使用している
* Docker上のアプリでsendgridを使用してメールを送信している

# 現象
[sendgrid-go](https://github.com/sendgrid/sendgrid-go)を使用してFargateのDockerコンテナからsendgridを使用したところ、以下のようなエラーが出ました。

```
UNKNOWN: failed send email. to: &{xxx xxx@example.com}: Post https://api.sendgrid.com/v3/mail/send: x509: certificate signed by unknown authority
```

この現象はDockerを使用していないローカル環境だと起こりません。

# 原因
DockerImage内にCA証明書がないため起こるエラーです。

```shell:docker内
$ ls -l /etc/ssl/certs
total 0
```

# 対処法
Dockerfileに以下を追加してください。

```dockerfile
RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/*
```

これで信頼されているCA証明書のインストールができます。

```shell:docker内
$ ls -l /etc/ssl/certs | wc -l
304
```
GoでOpen Location Code (plus+codes) を扱う

Open Location Code (OLC) をGoから使用するのが簡単だったのでメモしておきます。

## Open Location Code (OLC) とは

Googleが策定・開発した、座標（緯度・経度）を一意の（短い）文字列に変換するコードです。Google Mapsなどでは**plus+Codes**と呼称されています。

たとえば慶應義塾大学三田キャンパス（35.648703, 139.742884）は`8Q7XJPXV+F5`と表記されます。

OLC自体の詳細や仕様については以下のサイトをご覧ください

- [plus.codes](https://plus.codes/)（公式サイト）
- [グーグル、地球上のあらゆる地点をコード化する「plus+codes」リリース - CNET](https://japan.cnet.com/article/35068908/)

## 下準備

`go get` する。

```sh
$ go get github.com/google/open-location-code/go
```

## 使う

こういう感じです。

```go
package main

import (
	"fmt"
	"github.com/google/open-location-code/go"
)

func main() {
	//Encode (座標→OLC)
	olcGridName := olc.Encode(35.7720007, 139.7472105, 10) //緯度(float64),経度(float64),OLCの桁数(int)
	fmt.Println(olcGridName)
	//Decode（OLC→座標）
	area, _ := olc.Decode("8Q7XJPXV+F5")
	fmt.Println(area)
}
```

実行結果はこのようになります。Encodeはその座標が含まれるグリッドが示されますが、Decodeではグリッドの範囲（左下の座標と右上の座標）と渡されたOLCの桁数が示されます。

```sh
8Q7XJPXV+F5
{35.648624999999996 139.74287500000003 35.64874999999999 139.74300000000005 10}
```

## 公式ドキュメント

詳細は公式ドキュメントをご覧ください。

- https://godoc.org/github.com/google/open-location-code/go
SQL Server2008R2でDB作成時に5105エラー

saなのに、SQL Server2008R2でDBを新規作成しようとすると5105エラーが発生し、迷ったので、メモ。

# 事象 #
SSMS(Management Studio)で、DBを新規作成しようとすると5105エラーが発生

## 原因 ##
DB作成時の画面でmdfファイルとldfファイルを指定しなかった為。
※デフォルトで作成してくれると思ってた。

### 解消方法 ###
DB作成時の画面でmdfファイルとldfファイルのパスと名前を指定する

### ユーザ情報 ###
標準ユーザ（Windows。Not管理者）。　sa。
TODO from source code

# これは何？
あるテキスト内の`TODO`を含む行を一覧するShell Scriptの例です
ソースコードにコメントで書いたTODOを一覧表示できる

---

# 実装例
`fish`使いですがほぼそのまま他にも使えるはず

```shell:todocode.sh
function todocode -d "todo from source code"
  grep -e "TODO" -n $argv | grep -c '' # 行数(=件数)を出力
  grep -e "TODO" -n $argv # TODOを含む行を出力
end
```

```shell:使用例
$ todocode a.js
1
67: print "meu" // TODO 変数に置き換え
```

---

## 死ぬほど単純設計なので発生するメリットとデメリット
メリット

- 言語に関係なくとりあえずTODOかけば反応する
- ぶっちゃけfunction化しなくてもいいくらい単純

デメリット

- コメントアウトしていない部分の「TODO」という文字列を引っ張ってきてしまう事がある
S3 アクセス利用時にClassNotFound が発生



# はじめに

Aws を利用したアプリ(例えば、S3) をローカルで作成。
Eclipse を利用して動作確認をして、さあECS 上確認するぞ！といったところで、
java.lang.NoClassDefFoundError が発生。

```
java.lang.NoClassDefFoundError: com/amazonaws/services/s3/AmazonS3
```

実際にwar の中を確認すると、/WEB-INF/lib配下に、aws-java-ask-s3 が含まれていることを確認
これを解決する際に調べたことのメモ


# 結論

aws ask を含んだモジュールはスタンドアローンなjar ファイルではなく、スタンドアローンなwarファイルではない。
そのため、以下のプラグインをpom.xml に含める必要がある。

maven-shade-plugin

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          <createDependencyReducedPom>false</createDependencyReducedPom>
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

<参考>
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/java-create-jar-pkg-maven-no-ide.html

※　本家サイトのlambda サイトに記載あり
※　2.3 のバージョンは最新ではないが、本家の記載に従っていたほうが無難。


# 補足

## maven-shade-plugin

依存するライブラリ（jarファイル）を生成物のするjar内に含めることができるライブラリ。
利用すると、下記の2種類のjarファイルが生成される。
originalのprefix がついている方が、依存ライブラリを含んでいないjar ファイルで、容量に違いがみられる。（解凍すると、ディレクトリ構成が異なる）

xxx-1.0.0-SNAPSHOT
original-xxx-1.0.0-SNAPSHOT

詳細な公式ページは下記
https://maven.apache.org/plugins/maven-shade-plugin/


## スタンドアローンなjar とは

※　スタンドアローンなjar の意味がわからなかったので忘備の調査記録

英語だと、下記。
standalone jar
stand alone で独り立ちできるjar ファイルというのが直接的な意味

わかりやすい日本語だと、実行可能jarファイルという意味。

スタンドアローンなjarは単体で実行できるjar。
スタンドアローンなjarではないことは、そのjarだけでは実行できないという意味になる。
「ツールボックス・エンジニア」になる。1個の技術に固執しないということ。RT @yutakarai @yuki24


# Inspired by

 [技術なんて所詮ツール。ひとつの技術に固執しないこと - 株式会社ロカラボ](https://localab.jp/blog/technology-is-just-a-tool/)

>ある特定の技術を好きになりすぎてしまうと、その技術を使うことが目的になってしまうことも起こりえます。

>ひとつの技術を深く理解することは刃物を磨くことに近いです。

>ひとつひとつのツールの切れ味は必要最低限でも、目的のための最適なツールを取捨選択できて使えることが大切だと考えています。

https://twitter.com/yutakarai/status/1082016121874571264

# ツールボックスを持っておいて、複数ツールを使える状態いしておく

- Osaka ruby kaigi でも Yuki Nishijima さんが発表していたのを思い出した。
- Rails とかいろんなフレームワークがあるけど、結局完璧なフレームワークはなく、マトリクスで見たときには結局長所の反対側の弱点が露呈する
- 道具ありきで動いてしまうと、ツールに発想や動きが縛られることになる

[Osaka RubyKaigi 01](http://regional.rubykaigi.org/osaka01/)

[Yuki Nishijima (@yuki24) | Twitter](https://twitter.com/yuki24)

# たとえばMacBookでの写真撮影とアップロードなら

- エンジニアリングじゃないけど、最近、写真撮影してアップロードする手法は「一つに固定しないのが良い」と思い始めてきた
- 「iPhone でお絵かき or 写真撮影して icloud で同期して アップロードする」とか決めてしまうと、すぐ足回りが悪くなる
- 「自撮りや手書きメモ撮影なら、MacBook本体のPhotoBoothも使える」「単にイメージ画像ならGoogle検索結果をスクショ撮影すれば良い」「画像の同期でもicloud GooglePhoto AirDrop それぞれ長所がある」 こういう手段をいくつも用意しておいて、最適なものを常に使うのがストレス爆発の防止になる

![image](https://user-images.githubusercontent.com/13635059/50744980-ee93ae80-126a-11e9-87d8-530c5b9f497a.png)


---

https://twitter.com/YumaInaura

https://github.com/YumaInaura/YumaInaura/issues




https://github.com/YumaInaura/YumaInaura/issues/288








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Slackでマルチワークスペースにする方法 (Windows)

サインインしたときに別タブで開かれてしまったので作業ログ

- ワークスペース名のドロップダウンから他のワークスペースにサインインするを選択する
- <img width="108" alt="slack-workspace.png" src="https://qiita-image-store.s3.amazonaws.com/0/242788/3b4a6ba6-c109-9657-0480-9c323eb612e3.png">
- サインインする
- 一度別の画面で開かれるので閉じて再度ワークスペースにサインインするを選択する
帳票ファイルのネーミングに使える英語の略語一覧

帳票などのファイル名には、下記要件を満たした略語をprefixにつけると使いやすいです。

* 長すぎない（2~3文字程度）
* 他と被らない
* わかりやすい

毎度毎度システム作るたびに悩んだりググったりしているので、略記例をまとめておきます。

|日本語          |英語                           |略  |
|---------------|------------------------------|----|
|基本契約書       |basic agreement              |ba|
|個別契約書       |individual agreement         |ia|
|見積書(概算)     |estimate                      |est|
|見積書(確定版)   |quotation                     |quot|
|注文書          |purchase order                |po  |
|注文請書        |purchase order confirmation   |poc |
|請求書          |invoice                       |inv |
|納品書          |delivery note                 |dn  |
|受領書・検収書    |final acceptance certificate |fac |

ツッコミや追加依頼など、激烈歓迎。
mysqlが壊れたとき

# はじめに
OS(ubuntu18.04)を再起動したタイミングでDBが起動しなくなった。これで２回目。その都度ググるのも面倒なので、自分用の記事として記載しておく。壊れたのはxamppのMySQLDB。

# こうすればオッケー
下のファイルを開いて

```
sudo vi /opt/lampp/etc/my.cnf
```

こう編集する

```
[mysqld]
 innodb_force_recovery = 6
```

1〜6が指定できるらしいが、6で直った。
Nuxt.jsでセットアップしたときに出るPrettierのエラー対応方法

Nuxt.jsでセットアップ時にPrettierの設定した後に起動すると以下のようなエラーが出る

```bash
 ERROR  Failed to compile with 1 errors                                                                                                                                          friendly-errors 23:56:22


 ERROR  in ./pages/index.vue                                                                                                                                                     friendly-errors 23:56:22

Module Error (from ./node_modules/eslint-loader/index.js):                                                                                                                       friendly-errors 23:56:22

/Users/ebarakazuhiro/***/pages/index.vue
  36:1  error  Delete `⏎`  prettier/prettier

✖ 1 problem (1 error, 0 warnings)
  1 error and 0 warnings potentially fixable with the `--fix` option.

                                                                                                                                                                                 friendly-errors 23:56:22
 @ ./.nuxt/router.js 6:24-8:3
 @ ./.nuxt/index.js
 @ ./.nuxt/client.js
 @ multi webpack-hot-middleware/client?name=client&reload=true&timeout=30000&path=/__webpack_hmr/client ./.nuxt/client.js
                                                                                                                                                                                 friendly-errors 23:56:22
ℹ Waiting for file changes                                                                                                                                                                       23:56:22

 READY  Server listening on http://127.0.0.1:3000                                                                                                                                                23:56:22

events.js:183
      throw er; // Unhandled 'error' event
      ^

Error: listen EADDRINUSE 127.0.0.1:3000
    at Object._errnoException (util.js:992:11)
    at _exceptionWithHostPort (util.js:1014:20)
    at Server.setupListenHandle [as _listen2] (net.js:1355:14)
    at listenInCluster (net.js:1396:12)
    at doListen (net.js:1505:7)
    at _combinedTickCallback (internal/process/next_tick.js:141:11)
    at process._tickDomainCallback (internal/process/next_tick.js:218:9)
[nodemon] app crashed - waiting for file changes before starting...

```

エラーで表記されてるように`pages/index.vue`の36行目でPrettierのエラーが発生しています。

```pages/index.vue
<script>
import Logo from '~/components/Logo.vue'

export default {
  components: {
    Logo
  }
}
</script>

<style>
******* ここ *******
.container {
  min-height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
  text-align: center;
}
```
上記のコードの`<style>`と`.container`の間に改行が空いてることが原因です。

なので、ここの改行を消せばPrettierのエラーが出なくなります。

また、コードをいじらなくても

```bash
yarn lint --fix
```
をすると、自動でフォーマットしてくれます。

この問題は、Nuxt.jsをセットアップするときにPrettierをinstallした場合のみに発生するので、Prettierを入れていない場合は発生しません。
AE　ランダムなカラーを一つ返す

#やりたいこと
平面レイヤーの背景色をランダムな色にしたい。

#エクスプレッション
とりあえずコード

```jsx
posterizeTime(0);
seed =1;//default 1
color = Math.floor((random()*seed) * 16777215).toString(16);
colorSetToRgb(color)

//method
function colorSetToRgb(set){
	var bigint = parseInt (set, 16);
	var r = (bigint >> 16) & 255;
	var g = (bigint >> 8) & 255;
	var b = bigint & 255;
	return [r/255,g/255,b/255,0];
}
```

#取説
基本的にいじるものはseedだけです。
もし色が気に入らなければseedの数値を適当に変えてください。

#AE バージョン16以降
このバージョンからはhexToRgb()のメソッドが使えるので自前でcolorSetToRgbのメソッドを用意しなくて大丈夫です。

```jsx
posterizeTime(0);
seed =1;//default 1
color = Math.floor((random()*seed) * 16777215).toString(16);
hexToRgb(color)
```

#seedRandomがある事をすっかり忘れていた
一番スマートはこれでしょ！！

```jsx
seedRandom(1, true); 
color = Math.floor(random() * 16777215).toString(16);
hexToRgb(color)
```

#新しい記事を発見　（2020/1/9更新）
上記のものだと有名だが欠陥があるらしい
詳しくはこのページで解説しています。
https://q-az.net/random-color-code/
【Ruby入門】引数と戻り値の基本まとめ

# 目次
1. 引数
2. 戻り値
3. returnによる処理の終了
4. 複数のreturn

### 1. 引数
メソッドを出力する時に与える追加情報
メソッドを呼び出す時に引数を渡さないと、メソッドは実行されない
`def メソッド名(引数名)` 

```ruby:qiita.rb
def newyear_info(day,time)
  puts "新春セールは1月#{day}日から始まります"
  puts "オープンは#{time}時です"
end

puts newyear_info(3,10)
```

**実行結果**

```
新春セールは1月3日から始まります
オープンは10時です
```

### 2. 戻り値
呼び出し元で受け取るメソッド内の処理結果
`def メソッド名`
　`return 返す値`
`end`

```ruby:qiita.rb
def sale(price)
  return price / 2   #Rubyではreturn省略可
end

sweater = sale(5000)
puts "新春半額セール中"
puts "セーター#{sweater}円"
```

**実行結果**

```
新春半額セール中
セーター2500円
```

### 3. returnによる処理の終了
returnはメソッドの処理を終了させる性質もある

```ruby:qiita.rb
def sale(price)
  return price / 2   #ここで処理が終了
  puts "半額セール中"  
end 

puts "割引価格で#{sale(5000)}円"
```

**実行結果**

```
割引価格で2500円
```

### 4. 複数のreturn
メソッド内に条件文を入れた場合は、複数のreturnを使うことができる

```ruby:qiita.rb
def shirts(count)
  if count>=3
    return "割引が適用されて50%オフになります"  #条件に合わないため実行されない
  end
  return "3点以上お買い上げで50%オフになります"
end

puts shirts(2)
```

**実行結果**

```
3点以上お買い上げで50%オフになります
```
エラーメッセージ errorConnection reset by peer とは？

エラーメッセージ errorConnection reset by peer とは？

# Googling

[Why do we get the error "Connection reset by peer" during a web service call? - IBM Developer Answers](https://developer.ibm.com/answers/questions/231996/why-do-we-get-the-error-connection-reset-by-peer-d/)

- サーバー側のメモリが溢れてlimitを超えて？
- プロセスが殺され？
- トラフィックの問題でなんだかんだ？

>- resource limitations on the server side like out of memory server
>- process killed
>- overload on the server due to a high amount of traffic

# どゆこと？

- Webサービスのクライントが SOAP レスポンスを待つが？ (SOAPって何？)
- リモートのWebサービスプロバイダとコネクションが早くして切断される？

>The error message "Connection reset by peer" appears, if the web services client was waiting for a SOAP response from the remote web services provider and the connection was closed prematurely.

# 理由はタイムアウト問題？

一般的な理由はFireWallがコネクションを切断したケースが多い？

>One of the most common causes for this error is a firewall in the middle closing the connection. In this case you could increase the connection timeout in the firewall. 



---

https://twitter.com/YumaInaura

https://github.com/YumaInaura/YumaInaura/issues

https://github.com/YumaInaura/YumaInaura/issues/287








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
VR体験プロジェクトのスケジュール [2]

僕の経験から、いつもプロジェクトのスケジュールを作る前に
**プロジェクトの内容を絶対最初に決めた方がいいです。**
なぜかと言うと、プロジェクトの内容から色々次の一歩を判断することができるです。
以下はVR体験プロジェクトの内容を紹介します。

#VR体験プロジェクト
コンピューターによって作られた仮想的な３６０度世界を、奥多摩の人も現実世界のように体感できる技術。 ＶＲ体験の目的は奥多摩に住んでいる人に実際に現地に行かなくても旅行をしたような疑似体験を提供することです。

上に書いてあるVR体験プロジェクト内容について
「仮想」、「３６０度世界」、「奥多摩に住んでいる人」と「旅行」
という言葉を出てくる。そこから何を準備すべきか知っている。例：
「仮想」を構築するためのA-FrameというWebフレームワークを使います。
「旅行」をテーマにした五つ[３６０度]写真を準備します。
1.インドネシアのボロブドゥール
2.フィリピンのナンパックビーチ
3.奥多摩小河内ダム
4.奥多摩小河内神社
5.奥多摩日本語学校

そしたらＶＲ技術を開発する人と３６０度写真を準備する人の役割分担を分けます。
スケジュールを管理するための今回僕たちはtrelloというアプリを使います。
trelloで全部の**作業をリスト**して、**作業の優先度と締め切り**を決めて、**作業の状況**も設定して、**作業をやって**いて、最後は**振り返り**します。

へー？ちょっと。。なぜ振り返りもはいりますか？
知りたいだったら次の記事を読んでね！
Webディレクトリの検索でよく使う正規表現（備忘録）

正規表現をしょっちゅう使うわけではないため、割と簡単なものでも都度調べながら作業していました。
今後調べないで済むよう頻繁に使う表現をまとめました。

```regex:スラッシュ（/）をエスケープ…バックスラッシュ（\）を使う
// 元のWebディレクトリ：/toy/puzzle/castle/list
\/toy\/puzzle\/castle\/list
```
```regex:バックスラッシュ（\）をエスケープ…同上
// 元のWebディレクトリ：\toy\puzzle\castle\list
\\toy\\puzzle\\castle\\list
```
（以降、ディレクトリの区切り文字はスラッシュで説明します）

```regex:前方一致
^\/toy\/puzzle
```
```regex:後方一致
// /listで終わる
\/list$

// /item+数字3桁（例「/item123」）で終わる
\/item[0-9]{3}$
```
```regex:完全一致
^\/toy\/puzzle\/castle\/list$
```
```regex:部分一致
// 文字列「/puzzle/」を含む
\/puzzle\/
```
```regex:任意のアイテム番号を検索
// item+数字3桁を含む
item[0-9]{3}

// /item+数字3桁 または　itemを含む	
item([0-9]{3})?

// 数字が0文字以上続く
item[0-9]*

// 数字が1文字以上続く
item[0-9]+
```
```regex:ディレクトリの末尾を検索
// 末尾がitemまたはlistで終わる
\/toy\/puzzle\/castle\/(item|list)$
```
```regex:任意のディレクトリを検索
// puzzleの特定のカテゴリを検索
\/toy\/puzzle\/(castle|forest|christmas)\/

// 全種類のpuzzleを検索
\/toy\/puzzle\/[a-z]+\/

// /toy/puzzle/配下の全ディレクトリを検索
\/toy\/puzzle\/[a-zA-Z0-9\/\-_\.!\s'\(\)]+\/
```
neovim(バージョン0.3.2以降)のデフォルトカラースキームを元に戻す。

neovimをアップデートしたら配色が大きく変わっていました。
[リリースノート](https://github.com/neovim/neovim/releases)を見るとバージョン0.3.2でdefaults: background=darkとあるのでこちらが原因のようです。
neovimの配色を今までと同じにしたい場合は

```
set bg=light
```

とすれば元に戻ります。

参考https://github.com/neovim/neovim/issues/9455

Google検索、Twitter検索しても特に話題に上がっていなかったので一応。