OmniAICreator/Qiita-1.07M huggingface dataset:
fluent-bit をraspbian busterでビルドする

公式ドキュメントを見ましたが
https://docs.fluentbit.io/manual/installation/raspberry_pi
Raspbian buster 用のリポジトリがなかったのでソースからビルドすることにしました。

## 準備とソースコードの取得

```
sudo apt install git build-essential cmake flex bison
git clone https://github.com/fluent/fluent-bit
cd fluent-bit/
git checkout -b work v1.2.2
```

## ビルド

```
cd build/
cmake ..
make
sudo make install
```

## 動作確認

```
$ fluent-bit -i cpu -o stdout
Fluent Bit v1.2.2
Copyright (C) Treasure Data

[2019/09/07 10:19:27] [ info] [storage] initializing...
[2019/09/07 10:19:27] [ info] [storage] in-memory
[2019/09/07 10:19:27] [ info] [storage] normal synchronization mode, checksum disabled, max_chunks_up=128
[2019/09/07 10:19:27] [ info] [engine] started (pid=16215)
[2019/09/07 10:19:27] [ info] [sp] stream processor started
[0] cpu.0: [1567847968.000457920, {"cpu_p"=>0.000000, "user_p"=>0.000000, "system_p"=>0.000000, "cpu0.p_cpu"=>0.000000, "cpu0.p_user"=>0.000000, "cpu0.p_system"=>0.000000, "cpu1.p_cpu"=>0.000000, "cpu1.p_user"=>0.000000, "cpu1.p_system"=>0.000000, "cpu2.p_cpu"=>0.000000, "cpu2.p_user"=>0.000000, "cpu2.p_system"=>0.000000, "cpu3.p_cpu"=>0.000000, "cpu3.p_user"=>0.000000, "cpu3.p_system"=>0.000000}]
[1] cpu.0: [1567847969.000427993, {"cpu_p"=>0.250000, "user_p"=>0.000000, "system_p"=>0.250000, "cpu0.p_cpu"=>1.000000, "cpu0.p_user"=>0.000000, "cpu0.p_system"=>1.000000, "cpu1.p_cpu"=>0.000000, "cpu1.p_user"=>0.000000, "cpu1.p_system"=>0.000000, "cpu2.p_cpu"=>0.000000, "cpu2.p_user"=>0.000000, "cpu2.p_system"=>0.000000, "cpu3.p_cpu"=>0.000000, "cpu3.p_user"=>0.000000, "cpu3.p_system"=>0.000000}]
[2] cpu.0: [1567847970.000310774, {"cpu_p"=>0.000000, "user_p"=>0.000000, "system_p"=>0.000000, "cpu0.p_cpu"=>0.000000, "cpu0.p_user"=>0.000000, "cpu0.p_system"=>0.000000, "cpu1.p_cpu"=>0.000000, "cpu1.p_user"=>0.000000, "cpu1.p_system"=>0.000000, "cpu2.p_cpu"=>0.000000, "cpu2.p_user"=>0.000000, "cpu2.p_system"=>0.000000, "cpu3.p_cpu"=>0.000000, "cpu3.p_user"=>0.000000, "cpu3.p_system"=>0.000000}]
[3] cpu.0: [1567847971.000277824, {"cpu_p"=>0.000000, "user_p"=>0.000000, "system_p"=>0.000000, "cpu0.p_cpu"=>0.000000, "cpu0.p_user"=>0.000000, "cpu0.p_system"=>0.000000, "cpu1.p_cpu"=>0.000000, "cpu1.p_user"=>0.000000, "cpu1.p_system"=>0.000000, "cpu2.p_cpu"=>0.000000, "cpu2.p_user"=>0.000000, "cpu2.p_system"=>0.000000, "cpu3.p_cpu"=>0.000000, "cpu3.p_user"=>0.000000, "cpu3.p_system"=>0.000000}]
^C[engine] caught signal (SIGINT)
```

## 関連

[NanoPi NEO用にfluent-bitをクロスビルドする](https://qiita.com/tetsu_koba/items/f30bad5bd3eba3ccf4f2)
githubに自動で草を生やそう

注意！　なぜか私の環境では、この記事の方法では草を生やせなくなりました。それでも良いなら読み進めていただければ幸いです。

## みなさんgituhubに「草」と呼ばれるものがあるのをご存知ですか？

そう、git commitや、git pushの数を視覚的に表してくれるものですね。
我らがmatzのように、コミット履歴が緑で埋まっているとかっこ良いですー
<img width="1680" alt="スクリーンショット 2019-09-07 19.42.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183835/2ebbc441-ddfb-25d3-5899-78e7969999b3.png">
しかし、普段bitbucketや、gitlabを使っている人はgithubで草がスカスカになってしまいます。
これはかっこ悪い...
しかし、草を生やすためにgithubに乗り換えるのも面倒です。
そこで、プログラミングで草を自動的に生やしましょう。

## 草を生やすには
まず、awsや、gcpを使って、サーバーから適当なリポジトリにコミットしようとした貴方。このやり方ではgithubには草を生やすことは出来ません。bot行為として、githubはこれらのコミットを無視します。

そのため草を生やすには、ローカルマシンからコミットする必要があります。

毎日、自分のPCでbashスクリプト(git push)を定期実行出来れば、草を生やすことができます。

これに適した技術は....

## crontabです。
crontabとは、

>crontabコマンドはUnix系オペレーティングシステム において、コマンドの定時実行のスケジュール管理を行うために用いられるコマンドである。標準入力からコマンド列を読み取り、crontabと呼ばれるファイルにそれを記録する。この記録を元に定時になると、その命令内容を読み取り、実行が行われる。
wikipedia参照

便利なコマンドですねw

## 実装
１. 自分のアカウントで適当な名前のリポジトリ（wwwなど）を作成します。
2. .glassMakerというフォルダをルートフォルダに作成し、README.mdを作成します。

``` 
mkdir .glassMaker
cd .glassMaker
touch README.md
git init
git add .
git commit -m 'init'
git remote add origin 先ほど作成したリポジトリ
```

3. ターミナルで
crontab -e
を実行すると、Vimでcrontabファイルが開かれるので、a と打ち込んで、インサートモードに入ってから、以下をペーストし、:wqと打って保存しましょう。

```bash
1 0 12 * * * cd ＄HOME/.glassMaker; echo "草ァ" >> README.md; git add .; git commit -m "www"; git push origin HEAD
```

左の*はcron記法というものです。左の＊から順番に、分、時、日、月、年を表します。
この例だと、毎日昼の12時になるとgithubにプッシュが送られます。

完成！

これで、githubに大草原を作れました。
あとは、コミットメッセージを"Manage redbox updates by comparing exception IDs"のように、さも重要なコミットとして偽装したり、水曜日だけ３コミットするなどノイズを入れれば完璧です。
【C++の小ネタ】個人的に知った時にいいなと思ったテクニック2選

小ネタ記事です。

#1. メンバ変数のゲッターを参照返しにしてオーバーヘッドを少なくする
単純に……

```copy.h
class hoge
{
private:
    // BIG_TYPEはかなり大きなサイズがある型
    BIG_TYPE fuga;

public:
    hoge();
    ~hoge();

    BIG_TYPE Fuga() const { return fuga; }
}
```

とするとコピーが発生し、コピーによるオーバーヘッドが発生します。
そこで、参照返しにすることでコピーが起こらないようにすることができます。
返す型のサイズが大きければ大きいほど効果があります。
ただし、メンバ変数をダイレクトに返さない(ゲッター内で加工した値が返るなど)場合はこのテクニックが使えないので注意。

```referance.h
class hoge
{
private:
    // BIG_TYPEはかなり大きなサイズがある型
    BIG_TYPE fuga;

public:
    hoge();
    ~hoge();

    const BIG_TYPE& Fuga() const { return fuga; }
}
```

#2. C#のプロパティみたいにゲッター・セッターを定義する
オーバーロードを利用したテクニックです。

```property.h
class hoge
{
private:
    int fuga;

public:
    hoge();
    ~hoge();

    const int& Fuga() const { return fuga; }
    void Fuga(int f) { fuga = f; }
}
```
CloudFormationでスタックの削除に失敗する

## エラーメッセージ

```
The bucket you tried to delete is not empty (Service: Amazon S3; Status Code: 409; Error Code: BucketNotEmpty; Request ID: 3B95A3F4692BA7F6; S3 Extended Request ID: WjswcwJpNbptEDQErwglG9vlFb6/aN5TTh0PmCP2+LvddrK+XuzU/5hkgozVPuwelcYwPn3+8+I=)
```

## 対処方法
S3バケットを直接消す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/60df3cfc-4625-0c28-ccec-75513720f3b7.png)
【Processing】01.変数の中に値を入れる、変える【★✩✩✩✩】

# 変数に値を入れる
変数を宣言したらその変数の値を入れてみよう！

- intは数字
- floatは小数点を含む数字
- Stringは文字列
- booleanはYES/NO判定

他にもあるけど、最初のうちはこの4種類を覚えて使うだけでも問題ないよ！

```java:fukube.pde
int satou;//-2,147,483,648 ～ 2,147,483,647
float suzuki;//-16777216 ～ 16777216
String takahashi;//「" "」の間ならなんでもOK！
boolean tanaka;//trueかfalse
void setup(){
  size(100,100);
  satou=5;
  suzuki=2.5;
  takahashi="mikan";
  tanaka=false;
}
void draw(){

}
```
変数につけた名前の後に「=」を一つ書いて、種類に対応した値を書くだけ！

```java:fukube.pde
int satou;//-2,147,483,648 ～ 2,147,483,647
float suzuki;//-16777216 ～ 16777216
String takahashi;//「" "」の間ならなんでもOK！
boolean tanaka;//trueかfalse
void setup(){
  size(100,100);
  satou = true;//←ダメ
  suzuki = "sukiyaki";//←ダメ
  takahashi = 185;//←ダメ
  tanaka = -0.5;//←ダメ
}
void draw(){

}
```

# 変数に入ってる値を変えよう

簡単に変数の中に入ってる値は変えられるよ！

```java:fukube.pde
int satou;
float suzuki;
String takahashi;
boolean tanaka;
void setup(){
  size(100,100);
  satou=5;
  suzuki=2.5;
  takahashi="mikan";
  tanaka=false;
  //下に書けば書くほどそれが上書きされる
  satou=300;
  suzuki=15.5;
  takahashi="tokage";
  tanaka=true;
}
void draw(){

}
```

結果的にsatouは300に、suzukiは15.5に、takahashiはtokageに、tanakaはtrueになったよ！

# よく使う数字変更の書き方

1+1は2とか9×9は81とかの計算の答えを変数に入れることもできるよ！

```java:fukube.pde
int satou;
float suzuki;
String takahashi;
boolean tanaka;
void setup(){
  size(100,100);
  satou=5;
  suzuki=2.5;
  takahashi="mikan";
  tanaka=false;
  
  satou=5+5;//←結果10
  satou=satou+1;//←結果11
}
void draw(){
  satou=satou+1;//繰り返されるたび結果毎回1ずつ増えるので、12,13,14,15,16,17,18...となっていく
}
```

##これをやってメンターに見せてみよう！

#ミッション

数字の変数(int)を三つ作って、それぞれの名前をa,b,cとしましょう！
aに自分の好きな数字を入れてからbと足しあわせ、cが結果10になるようにプログラミングしてみよう！
ssh configの設定でつまづいた件

## 概要    
1台のPCで会社用と個人用、2つのgithubアカウントを管理したい。
ssh/configの設定でつまづいたので共有。

## 理由
会社のPCで個人の開発しようとgitからssh使ってcloneしたら、会社用のgitでpush,pull等ができなくなった。
後からわかることだが、sshの上書きをしてしまっていたようだ。。。(リモートの向き先が変わっていた？)
色々な記事を読んでいくうちにsshのconfigというものがあり、これをうまく使うと簡単にgitのためのssh keyを管理できるという。
ということで下記の記事を読みながらssh/configの設定をしてみた。

[GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](https://qiita.com/shizuma/items/2b2f873a0034839e47ce
)
[~/.ssh/configについて](https://qiita.com/passol78/items/2ad123e39efeb1a5286b)
[gitとsshのconfigについて(備忘録)](https://qiita.com/yoshidev523/items/b5e5923b2f658f09e0a6)

## 作業内容
1. ssh keyを適当な名前で2つ作成
2. gitへ登録
2. ~/.ssh/configファイルの作成
3. configに詳細をコピペ（IdentityFileは自分の作ったkeyに修正）
4. 接続の確認

## つまづいたこと
接続を確かめるために`ssh -T git@github.com`や`ssh -T {config.User}@{config.Host}`などを試したが、毎度毎度
>{ユーザー名}@github.com: Permission denied (publickey).

が返ってきてしまう。は？なんなん？接続できてないやんけ。
なのにSourcetreeからpushもpullもできるし。。。わけわからん。
Sourcetreeがなんか助けてくれてる？？

## 原因と解決策
困ったことに原因はすごく簡単なことであった。
ssh keyのgitの登録がうまくいってなかった。
というのもサイトに転がってる`pbcopy < ~/.ssh/id_rsa.pub`を使ってgitへ登録していのだ。
そりゃconfigでは`~/.ssh/hoge(自分でつけた名前)`で登録してるんだから違うよって否定されるのも納得。
`pbcopy < ~/.ssh/hoge`でkeyをコピーしてgithubに登録したら
> Hi {ユーザー名}! You've successfully authenticated, but GitHub does not provide shell access.

が返ってきて無事接続が確認できた。
いやぁ、ssh keyを複数作成していたのが悪の根源だったのか。。。
めちゃくちゃつまづいたけどいい勉強になった。


まだまだ初学者だから阿呆らしいとこでつまづいていますが優しい目で見守ってください。
現在僕が、コードを書くときに気にしていること[Laravel使用](自動テスト)

<b>新米なので、こういったことを意識するといいよというアドバイスがいただけるとありがたいです。</b>

## プログラムはじめたてのころ
まず、プログラミングを学び始めて、ある程度の計算やSQLをかけるようになったとき、困ったことが、
<b>・メソッドや変数名の命名</b>
<b>・何がいいコード何だろうと、そもそもいいコードの基準がわからなかった<b>

そこで、「リーダブルコード」やほかのQiita記事を読み、命名や循環的複雑度(ifやforなどの階層の深さでコードの複雑度を判断)を下げたり、可読性を上げたり、共通化する(カプセル化)方法を学びました。循環的複雑度を下げるときに、そのコード自体の処理を見直す、インターフェースを利用などがあります。「リーダブルコード」のコード指針としては、
<b>・他人が見て、最短で理解できるコード</b>
と書いてありました。最短で理解できるコードが書ければ、コードをレビューする人、コードを改修する人の時間が削減されるなど、多くの利をもたらします。それと、そういったコードが書ければ、自分のテンションもあがりますね。

そして、僕は自分のコードを書く指針として、「他人が見て、最短で理解できるコード」を設定することにしました。

##最近気にしていること

前々から、コードを書いて自動テストを行いたいと思っていました。(Laravelでは、PHPUnitやDusk)
理由としては、デバッグが楽になったり、後々の機能追加の際も、既存の機能のテストに時間は取られないためです。
そこで、既存プロジェクトにテストを入れようとしました。テストをいれることを考慮されていないため、そのプロジェクトにテストをいれるのは、すごく大変で、テストコードの可読性も低い(途中のデータ成型などが多く、肥大したテストコード)ものになってしまいました。なので、自分で作っていて、これってテスト仕様書を書いて、手で実行したほうがめちゃくちゃ早くないかなと思っていました。

そんな時、Laravelでバリデーションをするときによく使うFormRequestを、自動で作れて、そのクラスに自動テスト(入力値を同値分割と境界値チェック)を自動で作成してくれるツールをつくってみてと上司の方にお話をいただきました。[自動FormRequest作成](https://qiita.com/hekizi/items/cf942733e662d3131b68)

それを作ったときに、Laravelのバリデーションルールに対して、テストしているだけなように感じました。しかし、前回テストを入れた時と違い、こういった部分的な自動テストはいいんじゃないかなと感じました。テストをいれるにしても、基準が必要だと感じました。

<b>そして、今回新しいプロジェクトに入ったときに自動テストしやすくすると思いを抱き、作成していきました。</b>
まず、テストコードを入れるためには、テストコードを入れやすいようにする必要がありました。肥大化したテストコードを書かないために、僕のいいコードの指針に<b>テストを入れやすいコードを書く</b>というのが追加されました。
Laravelでは、コンストラクタインジェクションを使い、そのコンストラクタで指定されているものを利用するときに、mock化したものを利用できることは知っていたので、導入しました。しかし、テストを入れやすいコードって、具体的にこれ以外にしらないなぁと感じました。僕の指針の「他人が見て、最短で理解できるコード」これは、テストを入れる人の時間を削減することはできるけど、テストコード自体の肥大化を抑えるには、至らないのかなと思いました。
<b>可読性 ≒ テストを入れやすいコード</b>

そんな中、機能を作り終わり、僕よりはるかに高い技術を持つ方々に、今回苦労した数字を扱う関係の機能のコードをレビューしていただけることになった。そこで指摘いただいたのが、
<b>・カプセル化があまい</b>
<b>・テストを入れやすいように、持っていきたいなら、カプセル化をするときの意識を変えたほうがよい</b>
というアドバイスを頂けました。

<b>カプセル化があまい</b>
これは、僕のカプセル化したメソッドが、まだ全然さらにカプセル化できる状態で、メソッドに対して単体テストがいれられない状況。そもそものカプセル化があまい。単体テストできるレベルまで、カプセル化したほうがいい。

<b>テストを入れやすいように、持っていきたいなら、カプセル化をするときの意識を変えたほうがよい</b>
これは、僕がカプセル化しているメソッドに渡している引数とメソッドの中身が悪かった。
例えば、計算するメソッドがあったとして、

```
public function calc()
{
	$list = DB::table('numbers')->select('number')->get();
	・・・・・・・
}

public function calc($list)
{
	・・・・・・・
}
```

という二つのメソッドがあったとき、上のメソッドは、メソッド内でDBからデータを取得して、そのあと処理している。
下のメソッドは、DBからデータを取得したものを引数としてもらって処理している。テストを入れることを考えれば、データベースの値はなるべく使わないほうが簡単なテストコードになる(DB操作がない分)し、より単体テストといえると思う。

上のメソッドはテストを入れる際に、DBに入れる値を用意して、DBに入れて、このメソッドを呼び出して、返り値をチェックする。
下のメソッドなら、値を用意して、メソッドを呼び出して、返り値をチェックする。

なるほどーーーと思った。これは僕のコード指針に速攻追加した。最上位メソッド以外は、なるべくDBの値(動的値)を呼び出さないようにして、引数として受け取り、テストを入れる際はDB操作をしなくて済むようにしたほうがいいと感じた。また、引数に多次元配列などを指定する場合でも、テストをするときにデータを作るのが大変なので、やめたほうがいいとわかった。そうならないように設計することが重要だった。今までは、コードがあって、テストがあるって考え方だったけど、<b>テストを考えて、コードを書くほうがよりよい</b>と気づけた。

さらに、テストを入れる基準に、数字関係の機能を作った際は、ぜひ入れたほうがいいなと思った。お金の計算なんかは自動テストを入れることですごく楽できるし、正確にデバッグできるし、また、自動テストをいれることを意識することがやはり、いいコードにつながるんだな(カプセル化など)と感じた。

##まとめ

僕の現在のコード指針
・他人が見て、最短で理解できるコード　(命名・循環的複雑度・共通化などなど)
・テストを入れやすいコードを書く

僕の今の基準のテストを入れやすいコードとは、単体テストが入れられるレベルのカプセル化が意識されたコードであり、動的な値は引数として受け取っているメソッドが作成されていることと後は、コンストラクタインジェクションが使われているプロジェクト

また、いろいろ気づくことがあったらルールを追加していきたい。
<b>新米なので、こういったことを意識するといいよというアドバイスがいただけるとありがたいです。</b>
Pythonでフォルダ内の全サブフォルダ、ファイルの取得

#とにかくPythonを使ってみる
プログラミングを始めたころはなんでもかんでもPythonを使ってみるようにしていた。
仕事中も時間があればひたすらPython書いてるわけだがエディター開いてると仕事してるっぽい感じらしく
特に怒られたりしないので、仕事中のPython修行は最高の環境だった。
（しかし業務内容を入力するという就労管理システムがあるため、あえなく自爆）


#便利なコード
とはいえ、業務に活かすべくプログラミングしてるのだから仕事してないわけではない。（多分）
PC業務が日常の一部のような現代社会でファイル管理ができない奴はゴマンといます。
きっと皆さんの周りにもいるでしょう。

・自分が作ったデータの在りかがわからない
・無駄にフォルダ階層ばかり作って探しきれない

とはいえフォルダ検索はアホほど遅い。
ので、Pythonじゃね？ということで探したらあった。

```Python:フォルダ内検索.py

import os

dock = r"ここにファイルフルパスを貼る"    

for folder,subfolders,files in os.walk(dock):
    print('folder: {}'.format(folder))
    print('subfolders: {}'.format(subfolders))
    print('files: {}'.format(files))
```



結局はいつの時代も探しものばっかりなんだな～…
PaizaはGoの初心者に優しくない

#はじめに
Paizaのスキルチェックで遊ぼうとしたら、Goだけ標準入力取得のサンプルコードはありません。(2019/09/07現在)
つまり、Goで問題挑戦するなら、サンプルコードいらないよね。
「初心者はテスト受ける価値がありません」と言われてるも同然です(勝手な拡大解釈)

というわけで
他のサンプルコードを見ながら、標準入力を取得する程度(Dランクの問題より難しい)の能力が必要なわけです。
雑に取得するコードを書いてみました

# サンプルコード

```Go
var sc = bufio.NewScanner(os.Stdin)

func getNextLine() string {
	sc.Scan()
	return sc.Text()
}
func main() {
	input := getNextLine()
}
```

#それ以外の優しくない点
- goのフォーマッターをpaiza上で動かせない
- Goのバージョンが1.7.3
(2019/09/07現在1.13がリリースされている)

#感想
問題が難しくなればなるほど実務能力よりは、
競技プログラミング的な能力が求められるので仕方ない気もします(擁護？)

# その他
もっと便利な取得関数を作っておられる方はこちら
https://qiita.com/zurazurataicho/items/c8856fc97924decf23b4
Let's Encryptでpipのエラーが出た際に試す価値のある方法

Let's Encrypt という証明書サービスの存在を知ったので、さっそくうちのサイトに導入してみようかと意気込んでみたわけですが、証明書の取得中になぜかこんなエラーが出てしまいまして。

参考： [無料でHTTPS化できる「Let's Encrypt」をやってみた ※install.sh付き](https://qiita.com/daiki_44/items/a3616390f277722b97e0)

```
Installing Python packages...
/opt/eff.org/certbot/venv/bin/python: No module named pip.__main__; 'pip' is a package and cannot be directly executed
Traceback (most recent call last):
  File "/tmp/tmp.npkn4VEZsM/pipstrap.py", line 177, in <module>
    sys.exit(main())
  File "/tmp/tmp.npkn4VEZsM/pipstrap.py", line 149, in main
    pip_version = StrictVersion(check_output([python, '-m', 'pip', '--version'])
  File "/usr/lib/python2.7/subprocess.py", line 544, in check_output
    raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command '['/opt/eff.org/certbot/venv/bin/python', '-m', 'pip', '--version']' returned non-zero exit status 1
```

はて、これは何じゃラホイと怪訝に思って調べてみると、どうやら最新版の cert-bot では問題があるらしく、基本的にはバージョンは 0.31.0 に固定にしたほうがいいでやんすということで。

早速解決法を調べてみると、Let's Encryptのコミュニティでそのものズバリな解法をしている方がいらっしゃいました。

[Certbot auto started failing with ’ No module named pip.__main__’](https://community.letsencrypt.org/t/certbot-auto-started-failing-with-no-module-named-pip-main/89097)

ericb2038さんの回答を適時置き換えたコードがこちら

```
rm /usr/bin/certbot-auto*
wget https://raw.githubusercontent.com/certbot/certbot/75499277be6699fd5a9b884837546391950a3ec9/certbot-auto
mv certbot-auto /usr/bin/
chmod +x /usr/bin/certbot-auto
certbot-auto certonly --webroot -w /var/www/hoge -d hoge.com --email hoge@hoge.com --no-self-upgrade
```

オプションの `--no-self-upgrade` がキモですね！

試してみたところ、無事に先へ進めるメッセージが出ました。

```
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/hoge.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/hoge.com/privkey.pem
   Your cert will expire on 2019-12-06. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again. To non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
```

というわけで、皆さん気軽にSSLライフをエンジョイしましょー！
Logic Apps + Text Analyticsを使ってツイートを分析する(2) 感情分析

前の記事　[Logic Apps + Text Analyticsを使ってツイートを分析する(1)キーフレーズ抽出](https://qiita.com/damarinz/items/d830574c0d82bcbf3160) の続きです。

# 感情分析

キーフレーズはカンペキではないにしろ取れることはわかったので、今度はツイートの感情分析をかけてみます。
なにかの話題で盛り上がってるときに、数値が変化するはずです。

## データ保存用シートの作成

Google Spreadsheetへの別タブを作ります。すでにデータが入ってますが、以下のようなシートを作りました。

A列 Emotion
B列 Tweet_text
C列 Tweet_username
D列 Tweet_datetime



<img width="424" alt="ツイート分析sandbox_-_Google_スプレッドシート.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96615/834094a7-8264-6b55-3e6a-a97ae335a448.png">

## 感情分析の追加

感情の検出もかんたんです。ツイートテキストを指定するだけです。

<img width="314" alt="Logic_Apps_デザイナー_-_Microsoft_Azure.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96615/d6d67366-fd8c-6ffb-afff-48b33143f834.png">


分岐を作って、感情の検出のアクションを追加します。

Google Spreadsheetへの別タブへの保存を設定しました。本文を解析して判定された数字をEmotionに入れていきます。

<img width="480" alt="Logic_Apps_デザイナー_-_Microsoft_Azure.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96615/af37f268-7d32-22e5-7697-1af8dd184f83.png">

分岐を書いた場合、まとめて終了するステップを明示的に書いてあげないとうまく動かないようです。怒られたので追加しました。

<img width="463" alt="Logic_Apps_デザイナー_-_Microsoft_Azure.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96615/e919cdb8-f06a-6c91-1ae3-0ff42436d6bc.png">

# DOMOで可視化してみる

先の記事で作ったワードクラウドとあわせて、こんな感じで可視化しました。

<img width="356" alt="概要_-_Domo.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96615/7f499d4f-bcd4-d0bd-2696-97d54a54c612.png">

ノンプログラミングでかんたんにつくれるので、すばやいプロトタイピングや分析が可能になります。ありものの組み合わせなので、かゆいところに手が届かないこともありますが、それを補って余りある利点があると思います。

続き　[Logic Apps + Text Analyticsを使ってツイートを分析する(3) ストレージと課金](https://qiita.com/damarinz/items/429fe48906dd27557144)
Unity C# でアドベンチャー風テキスト作成


今日は趣味の方の投稿です。
やりたかったのは以下のこと。
 - テキストをtextコンポーネントに表示
 - 全てを表示し終わったらアニメーターのついたイメージを表示
 - クリック（タッチ）したら文章をスキップする

↓完成図
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">テスト <a href="https://t.co/M1mbzMPuY2">pic.twitter.com/M1mbzMPuY2</a></p>&mdash; いりこ@ゲーム (@iricocco301) <a href="https://twitter.com/iricocco301/status/1170273193220657152?ref_src=twsrc%5Etfw">September 7, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

##実際のコード
https://qiita.com/ryouhei_de/items/74bf63d35f28594b78a4
こちらの記事を参考にさせていただきつつ、
スキップ機能をつけてみました。

```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class textbox : MonoBehaviour
{
    [SerializeField] List<string> messageList = new List<string>();//会話文リスト
    [SerializeField] float novelSpeed;//一文字一文字の表示する速さ
    int novelListIndex = 0; //現在表示中の会話文の配列
    Text textArea;
    public GameObject TextTouch; //文を出し切ったら表示する
    bool isSkipFlag = false; //スキップ可能かどうか
    int messageCount = 0; //現在表示の文字数

    // Start is called before the first frame update
    void Start()
    {
        this.textArea = GetComponent<Text>();
        StartCoroutine(Novel());
    }

    // Update is called once per frame
    void Update()
    {
        if(Input.anyKeyDown && isSkipFlag){
            this.textArea.text = messageList[novelListIndex];
            messageCount = messageList[novelListIndex].Length;
        }
    }

    private IEnumerator Novel()
    {
        this.textArea.text= ""; //テキストのリセット
        
        while (messageList[novelListIndex].Length > messageCount)//文字をすべて表示していない場合ループ
        {
            isSkipFlag = true;
            
            this.textArea.text += messageList[novelListIndex][messageCount];//一文字追加
            messageCount++;//現在の文字数
            yield return new WaitForSeconds(novelSpeed);//任意の時間待つ
        }

        novelListIndex++; //次の会話文配列
        isSkipFlag = false;
        TextTouch.SetActive(true);
        yield return new WaitUntil(Touch);
        TextTouch.SetActive(false);
        messageCount = 0;
        if (novelListIndex < messageList.Count)//全ての会話を表示していない場合
        {
            StartCoroutine(Novel());
        }
    }
    bool Touch(){
        return Input.anyKeyDown;
    }
}
```

参考サイトの通り、コルーチンで字が出るまでの待機・クリックするまでの待機を行なっています。
ちょっと異なるのが、updateでクリックされた場合に字を強制的に全て
表示させるとこですね。
その為に`messageCount`をwhileループから出したので、
その辺の処理がチョコチョコ入った感じです。

textTouchというのはテキストボックスの最後に表示される「touch」を促すアニメーションのコンポーネントです。

c#まだまだ慣れないですけど書きやすくていいですね。
MacでpythonのSpeechRecognitionを使って音声認識

# 目的
MacでpythonのSpeechRecognitionを使って音声認識した際の備忘録です。

# 準備

下記の公式サイトを参考にMac用のライブラリをインストールします

> [SpeechRecognition 3.8.1](https://pypi.org/project/SpeechRecognition/)

```
$ pip install SpeechRecognition
$ brew install portaudio
$ pip install pyaudio
$ pip install google-api-python-client
```

# コード

下記のサンプルコードを改造してwavデータからテキスト生成します

> [audio_transcribe.py](https://github.com/Uberi/speech_recognition/blob/master/examples/audio_transcribe.py)

```b:audio_transcribe.py
import speech_recognition as sr

AUDIO_FILE = "./aps-smp.wav"

# use the audio file as the audio source
r = sr.Recognizer()
with sr.AudioFile(AUDIO_FILE) as source:
    audio = r.record(source)  # read the entire audio file

result=r.recognize_google(audio, language='ja-JP')

try:
    print("Google Speech Recognition thinks you said " + result)
except sr.UnknownValueError:
    print("Google Speech Recognition could not understand audio")
except sr.RequestError as e:
    print("Could not request results from Google Speech Recognition service; {0}".format(e))
```

# テスト

[コーパス開発センター　音声・転記テキストサンプル](https://pj.ninjal.ac.jp/corpus_center/csj/sample.html)から、
学会講演[音声]のサンプル音声(aps-smp.mp3)をダウンロードします。

ダウンロードしたデータはmp3形式のため、wav形式に変換します。

```
$ ffmpeg -i aps-smp.mp3 aps-smp.wav
```

変換したデータをaudio_transcribe.pyで音声認識します。

```
$ $ python audio_transcribe.py
Google Speech Recognition thinks you said パラ言語情報ということなんですが 簡単に最初に復習をしておきたいと思います まああのー こうやって話しておりますと それはもちろんあの言語的情報を伝えるという事が一つの重要な目的 なんでありますが同時に パラ言語情報 そして 非言語情報が伝わっていますが この散文方は 藤崎先生によるものでして パラ言語情報というのは 要は 意図的に作業できるわしゃがちゃんとコントロールして出してるんだけども 言語情報と違って 連続的に変化するから カテゴライズすることが やや難しい そういった状況であります
```

ほぼ正解しています。

# 備考

サンプルのspeech_recognitionはなかなか私の声を認識してくれません..

```
$ python -m speech_recognition
A moment of silence, please...
Set minimum energy threshold to 124.235981999
Say something!
Got it! Now to recognize it...
Oops! Didn't catch that
```


# 参考
[pythonで音声認識を使う – SpeechRecognitionを試してみる](http://書物の回想.コム/archives/10577)
[Pythonで音声入力に入門しよう(SpeechRecognition)](https://github.com/Uberi/speech_recognition)
[SpeechRecognition 3.8.1](https://pypi.org/project/SpeechRecognition/)
[コーパス開発センター　音声・転記テキストサンプル](https://pj.ninjal.ac.jp/corpus_center/csj/sample.html)
[audio_transcribe.py](https://github.com/Uberi/speech_recognition/blob/master/examples/audio_transcribe.py)
Maixduinoの初期起動を参考にしたサイトとWindows10でシリアルポートが認識されない問題

[結論]
PC落として元電源切ってコンセント抜いて半日放置した後デバイスマネージャーからドライバの更新を自動検索したら認識された


[経緯]
以下のサイトを元にMaixduinoを使おうとした
https://kitto-yakudatsu.com/archives/7034
サイトに載っている以下の部分で躓いた
![asfd.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/d42c5e36-6d83-d3dc-8896-bcff7e15622b.png)
私のデスクトップPCでは以下のようになっていた
![debaisu.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/c36d83f5-c8d9-2711-dc28-4d16f1f0a7ac.png)




デスクトップPCで試そうとしたときにUSB接続してもシリアルポートとして認識されないようであった
試しにmacの記事があったのでmac試したところ起動した
https://kokensha.xyz/deeplearning/macos-sipeed-maixduino-face-detection/

ほかの記事を確認した
https://qiita.com/tomitomi3/items/d1b675957238f9b7f965

ドライバを入れる手順があったのでUSBドライバを入れたが状況変わらず
http://www.wch.cn/downloads/CH341SER_ZIP.html

下記の記事からPCがデバイス見失う(?)トラブルがあるよう
https://freesoft.tvbok.com/tips/windows/connect_usb.html

コンセントまで抜いて半日放置したのちデバイスマネージャーからドライバの更新を自動検索し、認識された
![fasdfdf.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/b0f0014f-2091-5456-7c8f-45cf51a205d2.png)
form_forからform_withに変えるときにつまづいた事

# はじめに

Rails Turorial等でユーザー登録機能、ログイン機能を実装する際にform_forで書かれていました。

しかしRails5.1以降ではform_forではなくform_withを使うことが推奨されているので、そっくりそのまま変えてみたのですがエラーが出てしまいました。

なのでこれからform_withを使いたいけどform_forしか使い方が分からないという人のために私がつまづいた事、そしてその改善点を載せておきます。


# ユーザー登録機能

Rails Turorialではユーザーを登録する際form_forを使って以下のように記述されてます

```app/views/users/new.html.erb
<%= form_for(@uesr) do |f| %>
  <%= f.label :name %>
  <%= f.text_field :name %>
```

これをform_withに変えても ArgumentError が出てしまいます。

原因はform_forではUserモデルが存在する場合自動的に@userに対してモデルを割り振られていましたがform_withではこちらが指定しないといけないためエラーとなってしまいます。

```app/views/users/new.html.erb
<%= form_with(model: @uesr) do |f| %>
  <%= f.label :name %>
  <%= f.text_field :name %>
```

# renderのflash

ユーザー登録をした時にflashでメッセージを出そうとした時にredirect_toの成功のメッセージは表示されるが、renderの失敗の文字が表示されなくなりました。

原因はform_withはデフォルトで非同期通信となっていたため。
引数にlocal: trueを記入すると非同期通信がオフとなる。

```app/views/users/new.html.erb
<%= form_with(model: @uesr, local: true) do |f| %>
  <%= f.label :name %>
  <%= f.text_field :name %>
```

# ログイン機能

```app/views/sessions/new.html.erb
<%= form_for(:session, url: login_path) do |f| %>
  <%= f.label :name %>
  <%= f.text_field :name %>
```

ユーザー登録機能の時と同様にform_withに変えても ArgumentError が出てしまいます。

原因は:sessionに対して何も指定していないから。
(すみません、対処法がわかってもなぜ必要なのかがわかりませんでした。わかる方がおられたら教えていただけたら嬉しいです。)

```app/views/sessions/new.html.erb
<%= form_with(scope: :session, url: login_path) do |f| %>
  <%= f.label :name %>
  <%= f.text_field :name %>
```

# まとめ
自分の勉強のまとめとこれから勉強する人のやくに立てればと思いましたので今回初投稿してみました。

間違っているところ等ございましたら連絡よろしくお願いします。

# 参考
- [Rails 5.1] ‘form_with’ APIドキュメント完全翻訳      
https://techracho.bpsinc.jp/hachi8833/2017_05_01/39502
- 【Rails 5】(新) form_with と (旧) form_tag, form_for の違い      
https://qiita.com/hmmrjn/items/24f3b8eade206ace17e2
SQL Server on Ubuntu の接続でエラー

## その前に、UbuntuへのSQL Serverのインストール方法

以下のマニュアルの通りにインストール。



- クイック スタート: Ubuntu に SQL Server をインストールし、データベースを作成する
  - https://docs.microsoft.com/ja-jp/sql/linux/quickstart-install-connect-ubuntu?view=sql-server-2017



## エラー内容



接続時に以下のエラー。

-Sのところを、127.0.0.1やホスト名やIPアドレスに変えてもNG。



```
# sqlcmd -S localhost -U SA

Password: 

Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : TCP Provider: Error code 0x2746.

Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Client unable to establish connection.
```



## 対応内容



### mssql-serverを停止する

```
# sudo systemctl stop mssql-server 
```



### mssql-serverの内容を編集する

```
# sudo systemctl edit mssql-server
```

以下を追記して保存する。

```
[Service]
Environment="LD_LIBRARY_PATH=/opt/mssql/lib" 
```



### OpenSSL 1.0のシンボリックリンクの作成

```
# sudo ln -s /usr/lib/x86_64-linux-gnu/libssl.so.1.0.0 /opt/mssql/lib/libssl.so 
# sudo ln -s /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 /opt/mssql/lib/libcrypto.so 
```



### mssql-serverを起動する

```
# sudo systemctl start mssql-server 
```





## 参考



- Installing SQL Server 2017 for Linux on Ubuntu 18.04 LTS

  - https://blogs.msdn.microsoft.com/sql_server_team/installing-sql-server-2017-for-linux-on-ubuntu-18-04-lts/

  

- Error: TCP Provider: Error code 0x2746. During the Sql setup in linux through terminal

  - https://stackoverflow.com/questions/57265913/error-tcp-provider-error-code-0x2746-during-the-sql-setup-in-linux-through-te
【Railsメモ】content_forを用いて、条件に応じてページ内容を切り替える

例えば以下ようなページがあったとします。
![2e7fa6cde6fd23f0f0fec49cb831e78e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/476952/a07be77f-6c42-a689-f8a8-bdf5c882ad5f.png)

右側にはユーザ情報として、**"アイコン"**と**"名前"**が表示されます。 
これを
・ログイン時
→自分の情報

・非ログイン時
→新規登録案内
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/476952/cd603da4-1a4c-f023-5ef3-01785ed5e2a3.png" width="300px">

・各ユーザのプロフィールユーザページ
そのユーザの情報
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/476952/aab345c5-6132-78e6-ff59-8f80d218222c.png" width="300px">



この三種類に切り替えたい場合の実装方法です。 


ログイン時と非ログイン時であれば、ユーザがログインかどうかを判断して条件分岐させるだけですが、このように特定状況下で各ユーザの情報を入れたいとなると、**content_for**を使うのが良いようです。 

例えば、このサイトの場合views内にあるusers/show.html.erb（各ユーザの名前やアイコンを表示する）では、routesで設定したURL内に含まれるIDを取得し、ユーザを特定しています。  ところが、非ログイン時はもちろん、URLにIDが設定されていないviewsからユーザを特定する事は出来ません。 その為ユーザを特定できない状況ならばヘルパーで設定した**current_user**にて、現在ログインしているユーザの情報に切り替えて表示しようというわけなのです。各 ``` <%= render 'users/users_deta' %> ``` を見てもらえればわかりますが、各条件分岐にて与える変数を変えています。 （**@user**がURLから取得したユーザ、**current_user**がヘルパーで設定した現在ログインしているユーザです）





**<% if content_for?(:side_user) && logged_in? %>** にて、ページに**side_user変数**があり、かつユーザがログインしているかどうかを判定しています。 




```application.html.erb
<!-- 各ユーザのプロフィールユーザページ-->

<!-- そのユーザの情報 -->
<% if content_for?(:side_user) && logged_in? %>
  <%= render 'users/users_deta', user: @user %>
  
<!-- ログイン時 -->
<% elsif logged_in? %>
  <%= render 'users/users_deta', user: current_user %>
  
<!-- 非ログイン時 -->
<% else %>
  <!-- 非ログイン時の新規登録案内 -->
  <div class="nologin_top_image">
    <div class="nologin_top_text">
      <h2 class="text-white">DopeArtworksへようこそ！</h2>
      <div class="button_follow">
        <%= link_to '新規登録', signup_path, class: 'btn btn-lg btn-primary' %>
      </div>
    </div>
  </div>
<% end %>
```

では、一番目の条件分岐を実行したい場合です。 
これは実に単純で実行させたいviewsページ内に ```<% provide :side_user, "side_user" %>``` （変数（:左）及び与える文字列（"右"）は各自で変えてください） を記述するだけです。 

今回は**content_for**を使う経緯まで説明しましたが、重要なのは
```if content_for?(:変数) ```
と
```provide :変数, "文字列" ``` 
です。 

つまり、```if content_for?(:変数) ```で同じ```:変数```が各ページにあるかを判定し、好きなviewsにて記述した```provide :変数, "文字列" ``` にて```"文字列"```が```:変数```に代入され、条件分岐で指定したものと同じであれば、プログラムが実行されるわけです。
【非エンジニア・SE初心者用】rubyのクローリングでCSVダウンロード

## 1.はじめに
前回はクローリング方法について書きましたが今回はクローリングしたデータのCSVダウンロード方法について書かせていただきます。
また、前回の記事で作成したクローリングのファイルを使用します。

もし、クローリング方法について知りたい。どんな内容だったのか見たいという方がいらっしゃいましたら<a href=https://qiita.com/Nash-BETA/items/e9742f71c330e1a5f740>前回の記事</a>を見ていただければと思います。

### 1-1.クローリングできるファイル（前回作成したファイル）
下記のファイルの内容に追記していきCSVダウンロードできるようにしていきます。

```scraping.rb
require 'nokogiri'
require 'open-uri'


uri = "https://tabelog.com/tokyo/A1308/A130802/13025020/" #URLの指定
doc = Nokogiri::HTML(open(uri),nil,"utf-8")

# cssでデータを抽出する
doc.css("h2.display-name").each do |name1|
    puts name1.text
end

# xpathで抽出する場合
doc.xpath('//*[@id="rstdtl-head"]/div[1]/section/div[1]/div[1]/div/h2/span').each do |name2|
    puts name2.text
end
```

#CSVダウンロードの設定
### 2-1.CSVのライブラリを読み込む
```ruby
require 'csv'
```
CSVのライブラリーを使用する為、上記のコードを追記します。


```sucaping.rb
require 'nokogiri'
require 'open-uri'
require 'csv'

...
````

ファイル上部にcsvライブラリの指定をする


### 2-2.CSVダウンロードの指定

```ruby
CSV.open("scraping.csv", "w") do |csv|
#scraping.csvはファイル名
```

ダウンロードするためのコードを記入

## 3.確認と実行

### 3-1.コード全体

```scraping.rb
require 'nokogiri'
require 'open-uri'
require 'csv'

CSV.open("taberogu.csv", "w") do |csv|

    (14000513..14000514).each do |id|

        uri = "https://tabelog.com/kanagawa/A1401/A140105/#{id}"
        doc = Nokogiri::HTML(open(uri),nil,"utf-8")

        name = doc.css("h2.display-name").text
        name_hurigana = doc.css("span.alias").text
        smoking = doc.xpath('//*[@id="contents-rstdata"]/div[2]/table[2]/tbody/tr[4]/td/text()').text
        csv << [name, name_hurigana,smoking] 
    end
end
```

### 3-2.実行

```terminal
$ ruby scraping.rb 
```
【Rails】devise + omniauthでfacebook, googleログイン実装中のエラー

#概要
Rails5にてdevise, omniauthを用いてログイン機能を実装中に起きたエラーの解決方法をまとめました。同じ方法でエラー解決になれば幸いです。

#環境

#使用したgem
```
gem 'dotenv-rails'
gem 'omniauth-rails_csrf_protection'
gem 'omniauth-facebook'
gem 'omniauth-google-oauth2'
```
omniauthを使って実装している記事が多いのですが、脆弱性が指摘されているとのことでomniauth-rails_csrf_protectionを使用しています。
公式ドキュメントはこちら
https://github.com/cookpad/omniauth-rails_csrf_protection
参照記事
https://qiita.com/NT90957869/items/2a3ce18dedf93ccf2bdc

#エラーその１　Authentication passthru.
リンクから飛んだ時に表示されるこんな画面。

[![Image from Gyazo](https://i.gyazo.com/16d0b3e0aa1d51fd6dc584f6c29b0232.png)](https://gyazo.com/16d0b3e0aa1d51fd6dc584f6c29b0232)

## 解決策
Qiita記事の通りやったのにー！　なんでだー！
と思いました、はい。
ちゃんとドキュメントを読みましょう。

今回、使っているgemはomniauth-rails_csrf_protectionでした。
公式ドキュメントを読んでみると、methodを指定する必要があるとのこと
>You will then need to verify that all links in your application that would initiate OAuth request phase are being converted to a HTTP POST form that contains authenticity_token value. This might simply be done by changing all link_to to button_to, or use link_to ..., method: :post.

ですのでfacebookとかのリンクを以下のようにする必要がありますね

```@_new.html.haml
     = link_to user_facebook_omniauth_authorize_path , method: :post
```


#エラーその２　JWT::InvalidIatError
「OSの時間のずれ」が原因だそうです。
omniauth-google-oauth2の公式ドキュメントに以下の記述がありました。
>skip_jwt: Skip JWT processing. This is for users who are seeing JWT decoding errors with the iat field. Always try adjusting the leeway before disabling JWT processing.

なので以下のように追記します。

```
config.omniauth :google_oauth2, ENV['GOOGLE_CLIENT_ID'], ENV['GOOGLE_CLIENT_SECRET'], skip_jwt: true
```

公式ドキュメント
https://github.com/zquestz/omniauth-google-oauth2
golang functional option

# Optionalな引数、どうしてますか？

pythonやjavascriptであれば

```py
def hoge(a, b="bbb", c=123):
   pass
```

こんな風にすれば、関数はoptionalな引数を持つことができますが、Golangではこういう文法はありません。
調べると「Functional Optionを使いましょう」という記述に沢山出会います。

実際にFunctional Optionってどうやればいいんだろう？ということでやってみました。

# 実装

## クラスのコンストラクタの場合

```go
struct Sample {
   a string
   b string
   c int
}
func (s *Sample) init(){
   // init Sample
}
func NewSample(a string, b string, c int) *Sample {
   s := &Sample{a,b,c}
   s.init()
   return s
}
```

たとえばこんなコードがあるとします。

b,c をFunctional Optionにするとこんな感じになります。

```go
type Sample struct {
   a string
   b string
   c int
}
func (s *Sample) init(){
   // init Sample
}
func NewSample(a string, options ...Option) *Sample {
   s := &Sample{a, defaultB, defaultC}
   for _, f := range options {
      f(s)
   }
   s.init()
   return s
}
type Option func(s *Sample)

func WithB(b string) Option {
   return func(s *Sample){
      s.b = b
   }
}
func WithC(c int) Option {
   return func(s *Sample){
      s.c = c
   }
}

```

実行

```go
func main(){
   s := NewSample("aaa", WithB("bbb"), WithC(123))
}
```

こんな風にすれば、nilのような不要なパラメータが出現する事もなく、type safeなgolangの特徴を崩す事もなくoptionを導入できそうです。

## 関数の場合

関数では、クラスのように状態を持つことができるstructが存在しないため、新たに導入する必要がありそうです。

```go
func hoge(a string, b string, c int){
   // do something with a,b,c
}
```

上記関数に対して、b,cをFunctional Optionにしてみます。

```go
func hoge(a string, options ...Option){
   o := &option{defaultB, defaultC}
   for _, f := range options {
      f(o)
   }
   // do something with a, o.b, o.c
}
type option struct {
   b string
   c int
}
type Option func(o *option)

func WithB(b string) Option {
   return func(o *option){
      o.b = b
   }
}
func WithC(c int) Option {
   return func(o *option){
      o.c = c
   }
}
```

実行

```go
func main(){
   hoge("aaa", WithB("bbb"), WithC(123))
}
```

こんな風にoption structを導入することで、クラスのコンストラクタと同様な手順で関数のオプションをFunctional Option化することができそうです。
optionというstructが導入されましたが、無駄な設定がなくtype safeなgolangの特徴を壊していないかと思います。

# 感想

最近仕事でgolangを書き始めました。
独特なルールを持つ言語なので、golangの特徴を生かした書き方をいろいろ探してみたいと思っています。


# 参考

https://commandcenter.blogspot.com/2014/01/self-referential-functions-and-design.html
https://medium.com/@dreissenzahn/functional-options-in-go-35279f535c6
OpenID Connect Back-Channel Logout 1.0 ざっくりまとめ

OpenID Connectでバックエンド間の通信でシングルサインアウトをするための仕様である [OpenID Connect Back-Channel Logout 1.0 - draft 04](https://openid.net/specs/openid-connect-backchannel-1_0.html) のざっくりまとめ

#### ログアウトの流れ

- （OPはログインを実施したRPをCookie等で記録しておく。）

- OPはLogout Token（ログアウト要求の情報を含むJWT）をログインしたRPに送信する。
  - ログアウト対象はLogout Tokenの `sub`（サブジェクトID）もしくは `sid`（セッションID）に指定する。（両方指定してもよい）
  - Logoutトークンはapplication/x-www-form-urlencoded形式で `logout_token` パラメータに指定し、POSTメソッドで送信する。
- RPは受け取ったLogout Tokenを検証して、Logout Tokenで指定されたセッションを無効化する。
  - ログアウトに成功した場合はステータスコード `200` 、失敗した場合は `400` を返却する。

#### その他

- ログアウト時にはoffline_accessプロパティのないリフレッシュトークンも無効化すべきとされている。
- Back-Channel Logoutは[OpenID Connect Session Management 1.0のRP-Initiated Logout](https://openid.net/specs/openid-connect-session-1_0.html#RPLogout) と組み合わせることもできる。（ユーザーがRPでログアウト実施 → OPが他のRPにBack-Channelでログアウト依頼 という流れ）
Node.jsにてカレンダーのicsファイルの作成

#はじめに
Googleカレンダーのようなカレンダーアプリはたくさんあります。
サービス間でカレンダーを共有したい場合があります。icsファイルを利用して簡単に別のカレンダーサービスにインポートできます。
Node.jsにてicsモジュールを利用すると簡単にicsファイルが作成できます。

#icsとは
The iCalendar generator

URL：https://github.com/adamgibbons/ics

#インストール
`npm install -S ics`

#サイトにあるサンプル
```javascript
const fs = require("fs");
const ics = require("ics")

const event = {
  start: [2018, 5, 30, 6, 30],
  duration: { hours: 6, minutes: 30 },
  title: 'Bolder Boulder',
  description: 'Annual 10-kilometer run in Boulder, Colorado',
  location: 'Folsom Field, University of Colorado (finish line)',
  url: 'http://www.bolderboulder.com/',
  geo: { lat: 40.0095, lon: 105.2669 },
  categories: ['10k races', 'Memorial Day Weekend', 'Boulder CO'],
  status: 'CONFIRMED',
  organizer: { name: 'Admin', email: 'Race@BolderBOULDER.com' },
  attendees: [
    { name: 'Adam Gibbons', email: 'adam@example.com', rsvp: true, partstat: 'ACCEPTED', role: 'REQ-PARTICIPANT' },
    { name: 'Brittany Seaton', email: 'brittany@example2.org', dir: 'https://linkedin.com/in/brittanyseaton', role: 'OPT-PARTICIPANT' }
  ]
}
 
ics.createEvent(event, (error, value) => {
  if (error) {
    console.log(error)
    return
  }
  //valueの値をxxx.icsファイルに出力
  ...
})
```

普通のYYYYMMDDHHmm形式の日本語時間を入れると９時間差が出てます。
日付の９をマイナスする処理を追加で対応できます。

```javascript
const moment = require("moment-timezone");

moment.locale("ja");
let start = moment.tz("201909071800", "YYYYMMDDHHmm", "Asia/Tokyo");
start = start.add(-9, "hours");

const event = {
 start: [start.year(), start.month() + 1, start .date(), start.hours(), start.minute()],
 ...
}

```

また、一つicsファイルに複数イベントを作成することも可能です。

#イベントオプション
https://github.com/adamgibbons/ics
のattributes部分を参照

以上
graphql-codegenでRails6を使ったgraphqlのendpointからTypeScriptの型定義が自動生成できない


Rails5系の場合は問題なくgraphql-codegenを使ってTypeScriptの型定義の自動生成できていたのですが、
Rails6にアップデードしたら、エラーになり自動生成ができなくなったのでその解決方法を記載しておきます。

開発環境はdockerでフロントエンドとバックエンドでそれぞれコンテナが存在しています。

各コンテナへのURLは以下の通り
フロントエンド　http://localhost
バックエンド　http://localhost:3001

Rails6から`Host Authorization`という機能が追加されたのですが、これが原因でした。

バックエンド側のコンテナには`docker-compose.yml`に`backend-api`というホスト名を付与しており、フロントエンド側のコンテナから`graphql-codegen`を実行する際は`http://localhost:3001`ではなくて`http://backend-api`に向けて実行します。

```
# docker-compose exec frontend bash
bash-5.0# yarn graphql-codegen --config codegen.yml
```


```codegen.yml
overwrite: true
schema: "http://backend-api/graphql"
documents: "graphql/**/*.graphql"
generates:
  graphql/generated/graphql.ts:
...
```


その際、Rails側にbackend-apiというホスト名のホワイトリストに入れてあげないとリクエストが許可されない。

```config/application.rb
config.hosts << 'backend-api'
```

これでRailsを再起動させて、再度`graphql-codegen`を実行すれば、無事TypeScriptの型定義が自動生成されるはずです。

簡単な説明ですが、以上となります。


参考URL　https://www.fngtps.com/2019/rails6-blocked-host/
Scalaのfor-comprehensionの途中”=”でTupleが分解できるって常識なの？

# 知らんかった
何気なく[ZIO](https://zio.dev/)のドキュメント見てたら

```scala
def bigCompute(m1: Matrix, m2: Matrix, v: Matrix): UIO[Matrix] =
  for {
    t <- computeInverse(m1).zipPar(computeInverse(m2))
    (i1, i2) = t
    r <- applyMatrices(i1, i2, v)
  } yield r
```

ってfor-comprehension内で"="使ってTuple分解してた。

知らんかった。

今まで見たことなかったけど、これって常識なの？
nil? empty? blank? present? の使い分け

業務で見かけたのでメモします。
>
nil?
empty?
blank?
present?

参考：[nil? empty? blank? present? の使い分け](https://qiita.com/somewhatgood@github/items/b74107480ee3821784e6)

##nil?
nil（中身すら存在せず落ちる）のとき、`true`


##empty?
中身は存在するけど、
文字列の長さが0（= ""）、
または
配列が空のとき、`true`

##blank?
rails拡張メソッド。　nil?とempty?の合体版。

・nil
・""
・" "
・[]
・{}
のいずれかのとき、`true`

##present?
rails拡張メソッド。
なにかしら中身が存在していれば、`true`
git checkout . を打つと「本当にいいのか？」と念を押されるようにした

#はじめに
とある日の朝、「さーて、頑張るぞー」と意気込んで
まずはじめに`git checkout .`
「..............(昨日の進展全部消えた.. :smile:) 」

git checkoutコマンドってブランチを切る時にも使うのに(gitの最新バージョンでは変わりますけど..)こういう怖さがあるので、
仮に間違えて`git checkout .`コマンドを打ってもアラートがでるようにしました。


I just finally know what I have to do. And I know in my heart that it’s right.（やっとやるべきことがわかったんだ。そして、心から思っている。それは正しいと）   -- トニー・スターク


#動作環境
OS: mac OS Mojave 10.14.14
shell: zsh

#プログラム

```.zsh
preexec_functions=()
preexec_functions+=(show_alert_git_checkout)
show_alert_git_checkout() {
   local cmd="${1}"
   if [[ $cmd = "git checkout ." ]]; then
     echo "Are you sure to use 'git checkout .' ? (y/N): "
     if read -q; then
       echo "start execute 'git checkout .'"
     else
       kill -INT 0 # stop git checkout .
     fi
   fi
}
```

#実行結果

```
// case yes
name% git checkout .
Are you sure to use 'git checkout .' ? (y/N):
ystart execute 'git checkout .'
name%
name%

// case no

name% git checkout .
Are you sure to use 'git checkout .' ? (y/N):
n%
name%
name%
```


#参考文献
https://kakurasan.hatenadiary.jp/entry/20080326/p1
http://zsh.sourceforge.net/Doc/Release/Functions.html
http://web.cs.elte.hu/zsh-manual/zsh_17.html
#VsCode でサイドバーを開いている時に元の右側のエディタにフォーカスを戻すショートカット ( Command + K の次に Command + → )

Shortcut to return focus to the original editor on the right when the sidebar is open with #VsCode (Command + K then Command + →)


コマンドパレットで見つけたやつ

![image](https://user-images.githubusercontent.com/13635059/64471141-17689c80-d188-11e9-8d32-52b533469178.png)



# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
TouchableHighlightを利用して何でもボタンにする


ボタン以外にボタン機能をもたせたい場合などにはTouchableHighlightを利用します。

## やること

下記のように（例えば）ViewやImageをボタンのようにして、押したとき（Touchしたとき）色が変わり、イベントを発生させる（下記は静止画です。すみません）。


![スクリーンショット 2019-09-07 17.37.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/2a106206-3e66-ae70-d22e-cfff343f35f7.png "スクリーンショット 2019-09-07 17.37.30.png")



## 実装

特に難しいことはないが、プロパティとかの特性をしる必要がある。代表的なものは下記の３つ。

* onPress: クリックしたときのイベントを定義するが、設定してないとそもそも色が変わらない。
* underlayColor: クリックしたときに変化する色のベース（背景色）となる。
* activeOpacity: クリックしたときに透過される割合。



```js:App.js
import React from 'react';
import { StyleSheet, Text, View, SafeAreaView, TouchableHighlight, Image } from 'react-native';

export default class App extends React.Component {
    render() {
        return (
            <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
                <TouchableHighlight
                    onPress={() => console.log("pushed")}
                    underlayColor={'red'} // #角丸を設定した場合は、背景色を同じ色にしないとおかしく見える
                    activeOpacity={0.7}
                >
                    <View style={{
                        width: 100,
                        height: 100,
                        backgroundColor: 'blue',
                        justifyContent: 'center',
                        alignItems: 'center',
                        borderRadius: 10,
                        shadowColor: '#000',
                        shadowOffset: { width: 2, height: 2 },
                        shadowOpacity: 0.5,
                        shadowRadius: 2
                    }}
                    >
                        <Text style={{ color: "#FFF" }}>Hoge</Text>
                    </View>
                </TouchableHighlight>

                {/* スペーサー */}
                <View style={{ height: 100 }}></View>

                <TouchableHighlight
                    onPress={() => console.log("Image Press.")}
                    underlayColor={'#fff'}
                    activeOpacity={0.5}

                >
                    <Image
                        source={require('./assets/shiro2.jpg')}
                        style={{
                            width: 100,
                            height: 100,
                            borderRadius: 10,
                            shadowColor: '#000',
                            shadowOffset: { width: 2, height: 2 },
                            shadowOpacity: 0.5,
                            shadowRadius: 2,
                        }}
                    />
                </TouchableHighlight>
            </View>
        );
    }
}
```

同様の機能にTouchableOpacity()というのもある。が、だいたい機能は同じらしい。あと、もっとカスタマイズしたいときはTouchableWithoutFeedbackを利用して、自分でTouch時の動作を定義することもできるらしい。

>おまけでDropshadowしてみたが、Imageの方には影が落ちない。どうやら、TouchableHighlight自体にshadow設定すると良いようだ。
Study AIchi 個人的メモ

9/6(土)StudyAIchiに参加した際のメモを備忘録としてアップしました。
※　スライドは公開されたら随時追加します
※　面白かったので是非第二回も開催してほしいなー(チラッ

## 「About Edge Computing "あらゆるものが考える"世界を作るのに必要な技術」（ほけきよさん）
[スライド資料](https://www.slideshare.net/TakeakiImai/edge-computing-169769308)
###処理の高速化
- 枝刈り/量子化/蒸留
- 蒸留 : 強いモデルの推論結果を弱いモデルに食わせる
- Distiller : Pytorchのモデルを軽量化

###遠隔で更新する
- つよいコンピュータにデータを転送
- つよくないコンピュータにモデルを転送
- クラウドの力を借りよう

## ｢挫折しないためのAI学習法」（からあげさん）
[スライド資料](https://www.slideshare.net/karaage0703/ai-169834754)

- 環境構築は大変なのでColabとか使う
- 最初の課題は画像認識がとっかかりやすい
- Object Detection API使ってみよう
- "No Output, No Value"

## 「技術力で世界と戦う　機械学習コンペティション『Kaggle』の魅力」（u++さん）
[スライド資料](https://speakerdeck.com/upura/attractiveness-of-kaggle)

- キャーユープラサーン!
- 名古屋/東京判定アプリすごい
- オススメ書籍 : [イラストで学ぶ機械学習](https://www.amazon.co.jp/dp/B00LUMVZWE/) ~~イラストは役立たない~~
- kaggleの開催費用は2000万円ぐらい?
- みんなも [kaggle入門](https://qiita.com/upura/items/3c10ff6fed4e7c3d70f0)しよう

## 「カーナビプロダクトにおける機械学習事例」（masayuki5160さん）
- CarPlayの話
- GNSSが届かないところでの自車位置更新

## 「ベイズ学習に入門した話」（なつおさん）
[資料(GitHub)](https://github.com/natsuokw/machine_learning_basics/blob/master/linear_regression.ipynb)

- 数式がいっぱい
- 入力xに対するtの分布が得られる

## 「エッジAIの事例を簡単に試せる！Edge TPUとAI初心者」（ミソジさん)
[スライド資料](https://www.slideshare.net/ssuserd477fa/aiedge-tpuai)

- エンジニアの電気屋さんだ!
- AutoML Vision EdgeでエッジAI用のモデルを作成

##「人工知能の国際会議IJCAIの紹介」（神さん）
[スライド資料(一部)](http://www.kamishima.net/archive/mldm-overview.pdf)
- IJCAI : AI分野全般のトップカンファレンス
- 2020年は横浜開催

##「AIを活用して作るWebサービス開発について」（2zさん）
[スライド資料](https://speakerdeck.com/2z/aiwohuo-yong-sitezuo-ruwebsabisukai-fa-nituite)

- [ドメイン失効ネタ](https://qiita.com/tonteki/items/e8d4135f8dfc1f8850fd)
- [FaceScore](https://face.sc/)面白い

##｢Math is a language｣(HELLO CYBERNETICSさん）
- 線形代数と微分をとにかく勉強しよう!


##「ディープラーニングおじさんの話」（やまさん）
[スライド資料](https://www.slideshare.net/karaage0703/ss-170694798)
###大学で勉強すること、すべきこと
- "研究の仕方"を身につける

###会社で勉強すること、すべきこと
- 世の中の流れをつかむこと(これからもチャンスあり)
- モチベーション上げるためにはとにかく"実際に手を動かすこと"
Node.jsにてSMTPサーバなしでメール送信

#はじめに
普段の送信ではSMTPサーバを利用して送信しますが、SMTPサーバをない状態で送信したい場合があります。
Node.jsではnode-sendmailというモジュールを利用すると簡単にできます。

#node-sendmailとは
Send mail without SMTP server
URL: http://github.com/guileen/node-sendmail

#インストール
`npm install sendmail --save`

#メール送信例
```javascript
const sendmail = require('sendmail')();
 
sendmail({
    from: 'xxx@yyy.com',
    to: 'user1@xxx.com, user2@yyy.com',
    subject: 'メールのタイトルです',
    text: 'メールの本文です。この例はテキストです。html形式でもOK。',
  }, function(err, reply) {
    console.log(err && err.stack);
    console.dir(reply);
});
```

#設定可能なオプション
from
sender
to
cc
bcc
replyTo
inReplyTo
subject
text
html

#添付ファイルの例
https://github.com/guileen/node-sendmail/blob/master/examples/attachmentFile.js


以上
#VsCode で 画面の一番下の青いバー (ステータスバー) の表示・非表示を切り替える ( Toggle Status Bar )

Use #VsCode to show / hide the blue bar (status bar) at the bottom of the screen (Toggle Status Bar)


コマンドパレットを起動して  `Toggle Status Bar Visibility`  を選択

![image](https://user-images.githubusercontent.com/13635059/64471207-7da1ef00-d189-11e9-866d-f4036b362a0b.png)
![image](https://user-images.githubusercontent.com/13635059/64471210-7f6bb280-d189-11e9-9f98-126912725417.png)



# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
webcomponentsにAngularから値を渡す

# バージョン
Angular/core ~8.1.2

# やりたかったこと
webcomponentsのディレクティブにAngularから値を渡す。

app.component.html

```html
<clr-icon [shape]="item.icon"></clr-icon>

```
# 怒られ

普通にやると怒られが発生する。

```
VM47766 vendor.js:21971 Uncaught Error: Template parse errors:
Can't bind to 'shape' since it isn't a known property of 'clr-icon'.
1. If 'clr-icon' is an Angular component and it has 'shape' input, then verify that it is part of this module.
2. If 'clr-icon' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message.
3. To allow any property add 'NO_ERRORS_SCHEMA' to the '@NgModule.schemas' of this component
```

Angularの知らないプロパティを渡そうとしたからである。
だいたいの場合、moduleへ対象のAngular componentをexportしているmoduleをimportしていないことが原因で出るいつものやつだが、
今回は2.のケースに該当するため2.を実行する。

```typescript
// app.module.ts
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';

@NgModule({
  declarations: [AppComponent],
  imports: [
    CommonModule,
    RouterModule,
    ClarityModule
  ],
  schemas:[CUSTOM_ELEMENTS_SCHEMA] // これを追加
})
export class AppModule { }

```

# アトリビュートの指定

これでエラーは出なくなるが、挙動的にどうもshapeアトリビュートに値が渡ってなさそうである。
調べたところ、どうやら[attr.アトリビュート名]で指定する必要があるそうだ。

正解は以下の通り。


```html
<clr-icon [attr.shape]="item.icon"></clr-icon>

```

# 出典
https://medium.com/@jorgecasar/how-to-use-web-components-with-angular-41412f0bced8