OmniAICreator/Qiita-1.07M huggingface dataset:
FlutterでGoogle SignInにハマる

とてもハマってしまったため、書いておきます。

## ハマったところ

FlutterでFirebaseのGoogle SignInを実装しようとして、次の2つでハマりました。

1. AndroidX
2. サポートメールの設定

## AndroidX

実装後、ビルドが通らなくなりました。
supportライブラリにビルドエラーが出ていました。

いろいろ調べたところ、どうやらパッケージがAndroidXに切り替わったタイミングがあるらしく、その依存関係の問題でした。

https://flutter.dev/docs/development/packages-and-plugins/androidx-compatibility

AndroidXを使わないバージョンの指定方法も上の記事には書いてあったのですが、あとあと面倒になるので、AndroidXに対応するよう修正しました。

## サポートメールの設定

ビルドが通るようになって、Googleのサインイン画面でサインインボタンを押すところまでできるようになったのですが、ボタンを押すと、signIn()で以下のExceptionが発生しました。

```
PlatformException (PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 12500: , null))
```

stackoverflowにはいろいろな解決策が提示されていて、だいたいは、SHA1のキーをFirebaseに設定すればいいんだよ、というものでしたが、どれもダメでした。
探しまくったところ、以下の質問の回答に今回の解決策がありました。

https://stackoverflow.com/questions/56188338/platformexception-platformexceptionsign-in-failed-com-google-android-gms-comm

> Finally I found that Forgot to set support e-mail address in Google Developers Console > API and service > certificate > user consent screen link and this option also in your Firebase project setting .After set up everything should work.Hope this will help you.

原因は、Firebaseプロジェクトのサポートメールを設定していなかったためでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44912/f311c061-bea5-c4c1-9582-b5ff0f01c344.png)

これを設定したところ、無事、サインインできるようになりました。


分かった後でググってみると、きちんと書いてある記事もありました。
https://dev.classmethod.jp/smartphone/flutter_firebase-authentication1/

## 対応コード

### signInWithGoogleはもうありません

``` *.dart
    FirebaseUser user = await _auth.signInWithCredential(
        GoogleAuthProvider.getCredential(
            accessToken: googleAuth.accessToken, idToken: googleAuth.idToken));
```

### AndroidX対応いろいろ

``` pubspec.yml
  firebase_core: ^0.4.0+1
  firebase_auth: ^0.11.1
  google_sign_in: ^4.0.1+3
```

``` android/build.gradle
    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.0'
        classpath 'com.google.gms:google-services:4.2.0'
    }
```

``` android/app/build.gradle
android {
    compileSdkVersion 28
    ...
    defaultConfig {
        ...
        minSdkVersion 21
        targetSdkVersion 28
        ...
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
...
dependencies {
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
    implementation 'com.google.firebase:firebase-core:16.0.9'
}

apply plugin: 'com.google.gms.google-services'  // Google Play services Gradle plugin
```

``` android/gradle.properties
android.enableJetifier=true
android.useAndroidX=true
```

## その他

Google SignInのための設定。

### Firebase Consoleでの作業
https://console.firebase.google.com

プロジェクトの設定で、マイアプリを作成する。
flutterプロジェクトのSHA証明書フィンガープリントを設定する。(Android Studioで確認できる)
google-services.jsonをダウンロードして、android/appに置く。

Authenticationのログイン方法で、Googleを有効にする。
Androidの場合は、他の設定は不要。

### Google Developer Consoleでの作業
https://console.developers.google.com

OAuth 同意画面を設定する

おしまい。
寝ます。おやすみなさい（月

# 今日は寝る
- 所用で遅くなったので今日はやらずに寝よう
- その前に明日へ向けて前日のまとめ

# 昨日実施した事
- ローカルリポジトリを作成
- ローカルリポジトリへはコミット出来た
- リモートリポジトリ（GitHUB）へはプッシュ出来ない
- プロトコルはhttps→sshへ変更した
- GitHUBには公開鍵を登録済

# Todo（やる事）
- ローカルリポジトリからリモートリポジトリへpush出来るようにする
- GOの勉強を進める
    - いつものことだけど本題を進める上で便利な事、あったらいい事などサイドプロジェクトがどんどん本題になってしまい本末転倒になる事が今まで多々あった
    - 大切なのはGO言語のお勉強なので
【Linux】シェルスクリプトの終了/中断時に後処理が出来るtrap

# 終了/中断時に後処理が出来る trap

シェルで良くありがちな処理として、ファイルを作ってシェルの実行結果をテキストファイルなどに書いたり、
そのファイルを最後に削除したりする物が多い。
しかし、そういった場合に作成したファイルの後始末が結構面倒だったりします。

`Ctrl+C` とかで処理の途中で終了された時に、
作業途中のごみファイルが残ったりして、一時退避していたファイルがそのまま取り残されたりすると本当に面倒です。

 **そこで便利なのが trap コマンドです。** 

## trapのメリット
事前にtrap処理を書いておく事で、処理が途中で中断されてしまったりした際にも、
必ず中に書いてあるコマンドを後処理として実行させることができるようになります。

しかも素晴らしいのが trap コマンドは終了時のシグナルを捕捉して、
処理を実行してくれるので、

* エラーの時はこんな処理を走らせる
* 正常終了の時はこんな処理を走らせる

と処理を書き分けたり出来るので、本当に便利です。  
たとえスクリプトが `Ctrl+C` とかで途中終了してしまった場合でも、きちんと後始末できるようになります。

以下の様にして `trap "後処理" シグナル番号` と指定するだけでOKです。

```bash
trap "rm /tmp/hoge-tmp" 0
```

# 同じシグナルに対して2つ以上のコマンドを実行したい
以下の様にすればOKです。
(勿論、Terminate処理の関数を作って、それを実行させるのもOKです)  

```sh
trap "
  mv /tmp/swap-file original-file
  rm /tmp/target-file
" 0
```

# trapコマンドを使うにあたって

シグナルの理解は必須です。
以下のサイトを参照の上で利用する事を推奨します。

* [シグナルと trap コマンド - UNIX & Linux コマンド・シェルスクリプト リファレンス](http://shellscript.sunone.me/signal_and_trap.html)
* [Linuxのシグナルまとめ](https://www.xmisao.com/2013/11/10/linux-kill-signals.html)
Windows10のWSLでdocker-compose

# 概要

1. docker使いたい
2. コマンドプロンプトとかPowerShellきらい
3. WSLあるし使おう

マウントがうまく行かずハマる

# TL;DR

マウントのパスは相対パスで書かないこと.絶対パスで書く
Windowsのパス形式で書かないこと.


# やりたいこと

WSLでdocker-compose up できるようにする

WSLが有効化されている状態で始めます

1. [WSLでdockerのインストールからdocker-composeまで動かす
](https://qiita.com/tettsu__/items/85c96850d187e4386c24) を参考にWSLにdocker-composeのインストールまで済ませる

2. Docker DesktopのSettingsでShare DrivesのCドライブを一旦チェック外してApply

3. もう一回CドライブにチェックいれてApply [参考](https://mosapride.com/index.php/2017/02/16/post-70/)

4. docker-compose.ymlのvolumesの中でパスを指定するときに絶対パスで指定する

[参考](https://qiita.com/gentaro/items/7dec88e663f59b472de6)

+ 相対パスだと,永続化はされるがホスト側の見当違いなところにマウントされる
+ Windowsのパス形式で書いてもWSLのdocker-composeは理解できない
【Unity(C#)】Viveコントローラーの振動実装(SteamVR2.0)

##Viveコントローラーの振動
SteamVR2.0を対象にViveコントローラーの振動実装を備忘録として記録します。

```C#:コントローラーにアタッチ
using UnityEngine;
using Valve.VR;

public class Hapic : MonoBehaviour
{
    public SteamVR_Input_Sources handType;

    public SteamVR_Action_Vibration hapicAction = SteamVR_Input.GetAction<SteamVR_Action_Vibration>("Hapic");

    [SerializeField]
    bool debug;

    //振動の強さ三段階
    public enum HapicPower
    {
        NONE = 0,
        WEEK = 1000,
        MIDDLE = 2000,
        STRONG = 4000
    }


    void Reset()
    {
        handType = this.gameObject.GetComponent<SteamVR_Behaviour_Pose>().inputSource;
    }

    void Update()
    {
        //デバッグ用 (どんぐらいの強さかな～?)
        if (debug)
        {
            ControllerHaptic(HapicPower.STRONG);
        }
    }

    //振動メソッドたち

    //パターン①
    public void ControllerHaptic()
    {
        float seconds = (float)HapicPower.MIDDLE / 1000000f;
        hapicAction.Execute(0, seconds, 1f / seconds, 1, handType);
    }

    //パターン②
    public void ControllerHaptic(HapicPower hapicPower)
    {
        float seconds = (float)hapicPower / 1000000f;
        hapicAction.Execute(0, seconds, 1f / seconds, 1, handType);
    }

    //パターン③
    public void ControllerHaptic(ushort microSecondsDuration)
    {
        float seconds = (float)microSecondsDuration / 1000000f;
        hapicAction.Execute(0, seconds, 1f / seconds, 1, handType);
    }
    
}

```

##振動の設定
`Execute`の引数に振幅とやら振幅間隔やらいろいろ項目がありますが、
サンプルシーン内でも使用されていた
`Execute(0, seconds, 1f / seconds, 1, handType)`が一番使い勝手良いかと思います。

私は変更したい設定として、振動の強さくらいだったので
`seconds`の値を変えるだけで十分でした。

##オーバーロード

オブジェクト指向の便利機能[^1]だそうです。
>オーバーロードとは、「引数や戻り値が異なるが名称が同一のメソッドを複数定義する」というオブジェクト指向プログラミングのテクニックである。

振動の強さに関して、
・決められた値
・決められた値の中から選択
・数字で指定
上記3パターン用意しました。

呼び出す際はこんな感じです。

```C#
//パターン①
ControllerHaptic();

//パターン②
ControllerHaptic(HapicPower.STRONG)

//パターン③
ControllerHaptic(3200);
```

[^1]: [参考リンク](https://www.weblio.jp/content/Overload)
Excelシートの列を数字表記に変える方法


VBAで列の指定をする際に、A,B,Cではなく、1,2,3で指定します。
その時に向けて、列を数字に変えておくと作業が容易になります。

Excelのリボンに表示されている、
ファイル→オプション→数式→**R1C1参照形式を変更する**
にチェックを入れて右下のOKをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433296/ee72940b-9b97-b375-7d7b-789ba53db26b.png)
すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433296/651c3221-3025-023f-3867-2d4b75f324c1.png)
列がA,B,C…表記から1,2,3…表記になります。

A,B,Cの段階ならまだ数えてわかる範囲ですが、AS,AM列などの時は
確認する際にひと手間かかるので、先に変えておくことをお勧めします。
【Vim】node_modules のための Denite source を作った

皆さんもう最新の Denite は試されましたかね？ 一つ前の記事では新しくなった Denite v3 についての紹介記事を書きました。

* [【Vim】新しい Denite に爆速で対応する - Qiita](https://qiita.com/delphinus/items/de15250b39ac08e9c0b9)

最近の Denite 熱の高まりに応じて source の自作にハマっています。今回は、`node_modules` ディレクトリからパッケージを羅列する source を作ってみました。意外なことに、ググってもなかったんですよね、これ。

# 作ったもの

* [delphinus/vim-denite-node-modules: Denite source for node_modules](https://github.com/delphinus/vim-denite-node-modules)

<img width="647" alt="スクリーンショット 0001-06-09 14.52.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8880/aa54a840-f014-e6e3-0f73-f1cf945a35c8.png">

`:Denite node_modules` でカレントディレクトリから一番近い `package.json` を探し、同階層にある `node_modules` を探索してくれます。`dependencies` や `devDependencies` などに列挙されているパッケージには `[dev]` などのマークがついています。

Kind には `directory`（`:h denite-kind-directory`）を指定してありますので、対応した Action はなんでも実行できるようになっています。僕は `fire/rec` source や `grep` source を起動して、さらに検索を続けたりすることが多いです。

# neoclide/npm.nvim

上では「ググってもない」なんて書いたんですが、実はあるんです。

* [neoclide/npm.nvim: Npm plugin to make vim user works with npm easier](https://github.com/neoclide/npm.nvim)

あるんですが、少しこのプラグインは実装が複雑で、導入も難しいです。

* プラグイン独自の Kind を denite.nvim のディレクトリにコピーしないと動かない。
  - 独自 Kind にしたのはもちろん機能を足すためなのでしょうが、個人的には、Kind に機能を足すよりも、必要な Action を利用者が自分で定義して使う方がスマートだと思います。
* 付属の Denite source では `package.json` 内の `dependencies` と `devDependencies` をリストアップすることしかできなかった。
  - `node_modules` にはもっといろんなパッケージがあるのに！

このような不満から、車輪の再発明に至った次第です。

# まとめ

今回作成した Denite source は subprocess を起動するわけでもなく、非同期処理もありません。構造が単純なので source 作りの参考にしやすいと思います。以前 source 作成について書いた記事もリンクしておきますので、是非皆さんもオリジナルの source を作ってみてください。

* [vim-go に unite/denite source を作って contribute した話 - Qiita](https://qiita.com/delphinus/items/6c982caa805f87ecdd09)
  - vim-go と連携した source の作り方。
* [【Vim】mattn/memo の Denite source を作った - Qiita](https://qiita.com/delphinus/items/4c45ade227d39773c09b)
  - こっちでは subprocess + 非同期処理が必要な source を作っています。
UiPathのコーディングチェックツールを作ってみた【RPA】

## はじめに
RPAの開発者・管理者向けに、UiPathで開発したロボットのソースファイル(xamlファイル)から、コーディング情報を一覧化するツールを作ってみました。

↓ツールへのリンク
[UiPath Coding Checker](https://jw-automation.com/rpa/uipathcodingchecker/)

【動作環境】
　　Chrome, Firefox, Edge（IE不可）
【開発】
　　html, css, JavaScript, Bootstrap
【使い方】
　　画面右上からxamlファイルを選択し、右側の「Check Start」ボタンを押下（複数ファイル対応）

![mn917-mrv8d.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431306/df26ffbd-b76b-b7b3-cef1-85239d97bd0b.gif)

※補足
ファイルをブラウザ上で処理するだけであるため、チェック対象のファイルが外に出る事はありません(アクセス後にインターネット接続を切っても動きます)

## 機能説明
本ツールが表示する情報の一覧は以下です。

|タブ|概要|表示内容|
|:---|---|---|
|Dashboard|コーディングサマリ|・xamlファイル数<br>・アクティビティ総数<br>・変数総数<br>・引数総数<br>・分岐総数|
|Activity|アクティビティ情報一覧　　　|・アクティビティ別使用数<br>・アクティビティ名<br>・表示名<br>・アノテーション<br>・スコープ<br>・スコープID<br>
|Variable|変数情報一覧|・変数名<br>・型<br>・アノテーション<br>・初期値<br>・スコープ<br>・スコープID
|Argument|引数情報一覧|・引数名<br>・方向<br>・型<br>・アノテーション<br>・初期値<br>|

## 開発の背景

UiPathはGUIのドラック&ドロップベースのフローチャート形式でロボットが作れるのが売りなんですが、結構困るのが、開発したソースの情報の一覧化が難しい事です。

UiPathは、使用アクティビティや変数、条件分岐数などを開発画面から1つずつ確認するしかないため、よくあるケースとして、
「プロジェクトで策定した開発標準にロボットが準拠できているかのチェックが大変・・」
「ロボットの改修を依頼されたけれど、このロボットの規模感や処理の複雑さがわからない・・」
といった事があります。

プロジェクトで開発標準を策定し、開発標準準拠のチェックシートを作って開発完了時に開発者に提出してもらうというような事も多いと思いますが、そもそも一つ一つの確認作業が大変な上に、一般のシステムに比べて改修が頻繁に発生するRPAにおいて、このチェックは開発者にとって非常に骨の折れる作業になります。
しかも、管理者目線で見ると、チェックシートはあくまでサインでしかないため、本当に守れているかどうかは定かではありません。後から確認したら「実は守れていなかった」「一部抜けがあった」という事例も少なからずあります。

私が参画したプロジェクトでは、品質担保のために、開発者にチェックシートを提出してもらいつつ、更に管理者が定期的に実際のソースを見て確認するという事を実施しており、開発者・管理者共に非常に負荷が高い状態となっていたため、自動チェックツールの作成に至りました。

自動チェックツールの作成により、開発者が開発途中でも随時・簡単に確認可能になったため開発の手戻りが大幅に減った上に、管理者も一覧のチェックのみで済むようになったため、RPA開発の高速化と品質担保に大きく寄与しました。

また、使用アクティビティ数や変数の数、条件分岐数などから、ロボットの規模感や複雑さなども確認できるため、既存ロボットの改修時の見積もりや、ロボットの統廃合の判断材料としても使用可能になりました。

本ツールは、幅広く使えるように、プロジェクト独自の開発標準準拠のチェックや分析箇所を落とし、汎用的なコーディング情報の一覧化に焦点を当てています。

## さいごに
プロジェクト毎の開発標準や分析への対応・改善要望等ありましたらお知らせ下さい。
少しでもUiPathを使用して業務改革に取り組まれている方々の役に立てば幸いです。

<参考>
Qiita記事
・[RPAは誰でも簡単に作れるという罠](https://qiita.com/jw-automation/items/78d823a6cb278f7015b5) 
・[VBAが組める人ならRPAは簡単に作れるという罠](https://qiita.com/jw-automation/items/38c28016bf5162e76c59)
・[RPAへの理解がぐっと深まる、RPAがよくこける理由](https://qiita.com/jw-automation/items/836391dfde3fb1ac83d6)
・[寿司打を自動化してみた【RPA×OCR】](https://qiita.com/jw-automation/items/a906f7a79e72add7b577)
・[RPAのオススメ書籍](https://qiita.com/jw-automation/items/3c141c50c7a163943fd9)
・[RPAの開発に向いている人、向いていない人](https://qiita.com/jw-automation/items/828933731611b9ec601f)
・[RPAの推進に必須なRPAOpsという考え方](https://qiita.com/jw-automation/items/53c45b7dfc7a5865c5ff)
・[【AI】Deep Metric Learning](https://qiita.com/jw-automation/items/7bbe1c872fcec7fa6c1d)
・[【AI】Deep Learning for Image Denoising](https://qiita.com/jw-automation/items/f942ea0c6a02e8e50fa2)
・[Deep Convolutional Autoencoderベースの教師なし異常箇所検知](https://qiita.com/jw-automation/items/aea08a5c915d0627803a)


デモ
・[AI World](https://jw-automation.com/aiworld)：DeepLearningによるAIのデモサイト
・[UiPathCodingChecker](https://jw-automation.com/rpa/uipathcodingchecker)：UiPathのxamlファイルからコードを分析
・[寿司打自動化(YouTube)](https://youtu.be/7l9FiPtPftw)：タイピングゲーム寿司打のRPA×OCRでの自動化
atcoder 茶色レートを目指して 2話 ABC129に参戦したよ

#はじめに
このサイトでは私が灰色レートから茶色レートになるまでをまとめていきたいと思います

#今回の活動報告
今回はABC129に参戦したので反省などを書いていきます。
結果から言いますとA問題とB問題を解くことができました。
なのでどのように解いたのか解説したいと思います。
使用言語はC++です。
#ABC129 A問題
・問題:https://atcoder.jp/contests/abc129/tasks/abc129_a
・提出コード:https://atcoder.jp/contests/abc129/submissions/5838153
この問題はP,Q,Rの中で一番小さい数と２番目に小さい数を足した数が答えになるなと思ったので、まず一番小さい数を変数に入れて、２番目の数に関してはif文を使って足し算する数を決めるという回りくどいことをしてしまいました。ここでタイムロスしてしまったなと思います。
#ABC129 B問題
・問題:https://atcoder.jp/contests/abc129/tasks/abc129_b
・提出コード:https://atcoder.jp/contests/abc129/submissions/5845838
この問題は文章の理解に時間をかけすぎました。ていうかわかりづらかったです。最初私は、全部の数字の中で一つ数字を選んで、それより大きい数字とそれ以外の数字を各々全部足して、それを引いた結果の中で一番小さい数字を表示すると思ったので、入力した数字を昇順にソートして上記のやり方で出た結果を配列に格納しておいて最後に昇順にソートして最初の配列の要素を出力するやり方をしてしまったので、ワケのわからない数が出てきました。
今回は諦めようかと思いましたが、最初の入力した数字を昇順にソートするのがいらないとわかったので、ソートした部分を消したらうまいこといきました。

#終わりに
長々と書いてしまいましたが上記にあるのが私がどのように解いたかの解説になります。勉強不足のため無駄なことを数多くしていますので、「もっと良い解き方があるよ」などありましたら、コメントに書いていただくととてもありがたいです。C問題以降はABCの解説をみて勉強したいと思います。
僕のMacbookの設定

この前WWDC( https://developer.apple.com/wwdc19/ )がありましたね。
Mac Pro欲しいけど、いくらになるのかしら、、、

それはさておき、個人的にWWDCの時期にMacの再クリーンインストールをする習慣にしてるので、その時の備忘録です。

なお、僕が持ってるのはMacBook Air (13-inch, 2017)です。
OSは macOS Mojave (10.14.5) です。

Qiitaで物を書くのは初心者なので、見づらい箇所等ありましたらご指導いただけるとありがたいです。

#初期化からのインストール
https://support.apple.com/ja-jp/guide/mac-help/mchlp1599/mac を参考に。
Option ＋ Command ＋ R キーで、SSDをフォーマットからのOS最新版をインストール。
画面に従っていけばOK。
特につまるところもなく終了。

#トラックパッドのクリックを、タップでできるように設定
「システム環境設定」→「トラックパッド」→「タップでクリック」にチェック

（これ、最初からタップできるようにしてて欲しいなぁと思うのは僕だけ、、、？）

#いつも使うソフトのインストール
- Keynote (App Storeから)
- ウイルスバスター (Safari経由)
- FireFox (Safari経由)
- Microsoft Office 365 (FireFox経由)
- Googleドライブ (FireFox経由)
- Android File Transfer (FireFox経由)
- Xcode (App Storeから) ←めっちゃ時間かかる

ここまではGUIでインストールしました。

#ターミナルからプログラミング系をインストール
## Homebrew
https://brew.sh/index_ja  を参考に。

```Terminal:Terminal.app
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

## Emacs
一応、Emacs派なので、、、
App一覧に乗るようにcaskを使用。

```Terminal:Terminal.app
$ brew cask install emacs
```

## Visual Studio Code
まぁ、いつもメインで使うのはVS Codeなのでインストール。

```Terminal:Terminal.app
$ brew cask install visual-studio-code
```

## ROOT (CERN)
ROOTという解析ソフトが必要なのでインストール。

```Terminal:Terminal.app
$ brew install root
```

## Geant4
Geant4というシミュレーションのソフトが必要なのでインストール。

```Terminal:Terminal.app
$ brew install geant4
```

Geant4については自力でパスを通す必要があるのでとりあえず以下を実行。

```Terminal:Terminal.app
$ . /usr/local/opt/geant4/bin/geant4.sh
```

~~同じディレクトリに「geant4.sh」と「geant4.csh」があるけど何が違うのかしら、、、
あと、「.bashrc」的なのに書き込んどけば毎度毎度パスを通す必要は無くなるハズ。
（ここら辺は、後日、追記予定。）~~
macの場合は「.bashrc」に「geant4.sh」を読み込むよう書けばいいっぽいです。

## CMake

Geant4のためにCMakeが必要なのでインストール。

```Terminal:Terminal.app
$ brew install cmake
```

#おしまい
XQuartzをインストールしたものの、使用してないので割愛。

以上です、お疲れ様でした。
Elmでinputフォームを使ったらiPhoneのsafariで入力が以前の文字も入力されてしまうバグが起きたメモ

## 現象
inputでmodelの値を更新するフォームをElmで作ったところ、iphoneの場合に、 それまでの履歴が入力されてしまう現象が起きた。

* 12と入力すると、112、123と入力すると1121123のようになる。
* 半角空白をいれると一旦きれてまた同じ現象となる。(1121123 、1121123 1、1121123 112、...)
* webやandroidでは発生しない。
* textareaでは発生しない

```elm
input [value val, onInput toMsg]
```

以下のものと似たような状態。
https://github.com/elm/virtual-dom/issues/138

## 解決
discordで質問したところ、上記のissueや`Html.Events.Extra.onChange`をonInputの代わりに使う方法を教えていただいた。onChangeに変更したところ現象は発生しなくなった。

https://github.com/elm-community/html-extra
Bash で標準入力を配列に入れる

AtCoder の [AtCoder Beginners Selection](https://atcoder.jp/contests/abs)、転職活動していた時に解いた問題の数々を思い出す感じで楽しいです。
とはいえ、当時は C で解いていたのに、今は第一候補は Bash でその次が PHP、そのあとにやっと C。変わるもんだ。

Beginners Selection の問題は (その他もそうかもしれないけれど) 標準入力からテストケースをインプットし、想定のロジックに従った標準出力をするという形で作られています。今回解いた Shift only は、本来ならもっとスマートな方法がありそうなのですが、かなり力技で解きました。
その中で、標準入力からスペース区切りで受け取った内容を配列に格納したかったのですが、その時にやり方を調べたのでメモ。

# 標準出力から読み込む

読み込むには `read` が使えます。

## 1 つの値を読み込む

よくこんな形で使われているかと思います。

```bash:read.sh
#!/bin/bash -u
echo "Continue? [y/N] > "
read answer # ここで読み込み待ち
if [ "${answer}" != "y" ]; then
  echo "Aborted."
  exit 1
fi
echo "Continuing..."
# 以降処理を続ける
exit 0
```

```terminal
$ bash ./read.sh
Continue? [y/N] > y
Continuing...
$ echo $?
0
$
$ bash ./read.sh
Continue? [y/N] > N
Aborted.
$ echo $?
1
```

## 複数の値を読み込む

入力される値がわかっていれば (固定なら) こんな感じにできます。

```bash:read2.sh
#!/bin/bash -u
echo "Input three values > "
read a b c
echo ${a}
echo ${b}
echo ${c}
exit 0
```

```terminal
$ bash read2.sh
Input three values > 7 30 365
7
30
365
```

### このやり方を知る前

Qiita のいろいろな記事から学んだのでどれと言えないのですが、このやり方を知る前は普通にまとめて 1 個の文字列として読んだ後、awk で分割していました。


```bash
#!/bin/bash -u
echo "Input three values > "
read line
a=$(( echo "${line}" | awk -F' ' '{ print $1 }' ))
b=$(( echo "${line}" | awk -F' ' '{ print $2 }' ))
c=$(( echo "${line}" | awk -F' ' '{ print $3 }' ))
echo ${a}
echo ${b}
echo ${c}
exit 0
```

## 入力個数がわからない場合はどうしたら？

### 以下のようにすると配列に読み込める

```bash:read_array.sh
#!/bin/bash -u
echo "Input values > "
declare -a array=()
echo "Continue? [y/N] > "
read array # ここで読み込み待ち
for number in ${array[@]}; do
  echo ${number}
done
```

```terminal
$ bash read_array.sh
Input values > 1 2 3 4 5
1
2
3
4
5
```

## Conclusion

PHP では特に対話的なコンソールアプリを作る機会があまりないので、こういう問題タイプだとついつい Bash を選びますが、まだまだ知らないことがたくさんあるなあと発見ばかりでした。
配列やリストでもIsNullOrEmpty ()を使いたい (C#)

# 前提
- Linqは使いたくないものとします。
- staticクラス内で定義しない(拡張メソッドにしない)場合は、引数のthisを取ってください。

# やりたいこと
- 文字列が`null`や`""`でないかでチェックする`IsNullOrEmpty ()`を、配列やコレクションでも使いたい。

# コード

- 素直に、配列なら`Length`で、コレクションなら`Count`でチェックします。

```cs:
using System.Collections.Generic;

static class CollectionHelper {
    /// <summary>Collection&lt;T&gt;がnullまたは空であれば真</summary>
    public static bool IsNullOrEmpty<T> (this ICollection<T> collection) {
        return (collection is null || collection.Count == 0);
    }
}
```

- `System.Collections.Generic`を使いたくない(配列だけでいい)場合は、以下のようになります。

```cs:
static class CollectionHelper {
    /// <summary>T []がnullまたは空であれば真</summary>
    public static bool IsNullOrEmpty<T> (this T [] array) {
        return (array is null || array.Length == 0);
    }
}
```
Cisco IOS-XR gNMI メモ（Tech Field Day）

Tech Field Day 2019/01/16 で Cisco IOS-XR で gNMI を利用するというセミナービデオの内容メモ。

Networking Field Day Exclusive Cisco Service Provider gNMI and Telemetry
https://www.youtube.com/watch?v=99hyTLPMAQQ&list=PLinuRwpnsHaficUof36cGuDciju4xPH5V&index=8

現在の gNMI  にまつわる状況が分かりやすくプレゼンされていて参考になる
（もちろん "Cisco の観点から" ではありますが）

* Cisco IOS-XR: gNMI は 6.5.1 でサポートされたので、試すなら 6.5.x の最新が良さそう。
* gNMI message size comparison based on encoding type
    * GPB: 330 bytes
    * KV-GPB: 1142 bytes
    * JSON: 1325 bytes
* Transport is HTTP. Can enable/disable TLS.
* Peak BW comparison ... screenshot.
* What people use? gRPC + KV-GPB + OpenConfig (+Native) YANG Model
* Subscribe できる Object (treeのnode）はいくつか指定されているのでそこから選ぶ。
* CLI で gNMI check
    * `# sh tele m subscription`

# Telemetry company:

* SevOne https://www.sevone.com/
* Anuta networks https://www.anutanetworks.com/
* packet design
    * July 2, 2018 に Ciena に買収されている
    * https://www.ciena.com/insights/articles/Ciena-Completes-Acquisition-of-Packet-Design.html
    * Blue Planet Analytics: https://www.blueplanet.com/products/analytics.html
* Volansys https://volansys.com/
    * https://volansys.com/network-telemetry-monitoring-software/

# Tools

* Influxdata Telegraf : https://github.com/influxdata/telegraf
* Grafana : https://grafana.com/
1時間WordPress無料でハマったところ

GCPもWordPressもはじめてさわる人間が [1時間で出来る！最強のWordPress環境構築(永久無料)](https://qiita.com/ryuta69/items/dbb0db5cf7099b7a7cc4) でハマったところのメモ。

## サイトのアドレスが分からなくなってしまった
うっかりタブを閉じてしまいアドレスが分からなくなってしまう。
**ナビゲーションメニュー > Deployment Manager > デプロイ** でラベルを選択すると確認できる。

## WordPressの設定画面とは？
サイトのアドレスの近くに書いてある「Admin URL」からアクセスできる。
IDとパスワードもそこに書いてあるものを入力する。

## WordPress英語なんだけど
**Dashboard > Settings > General > Site Language** を「日本語」にするだけ。

## CloudFlareの「Add a Website」
サイトのURL(http://ipアドレス) 入れたら弾かれた。
適当な名前を入力したらいけた。

## DNS設定でハマりまくる
### ネームサーバーの設定
元記事とCloudflareの画面が違ったのでわけが分からなくなってしまった。
#### Cloudflare
追加したサイトのOverviewのページにネームサーバーが2つ書いてあるのでコピーする。
#### freenom
freenomでドメインを取った。
**Services > My Domains > Manage Domain > Management Tools > Nameservers** で
「Use custom nameservers (enter below)」を選択する。
その下にコピったやつを貼り付けて「Change Nameservers」ボタンを押す。
### それでもうまくいかん
#### 動的IPを静的にする(GCPの設定)
これが抜けてたので変更したところ上手くいった。。
あちこちのサイトを行き来して登録したり、メールアドレスのverifyしたりしている際に読み飛ばしてしまってたんだと思う。


何はともあれ出来たのでWordPressで遊んでみよう。
tmuxからクリップボードにコピーする（令和版）

#環境
Arch Linux 2019.06.04
tmux 2.9a
xsel version 1.2.0

※以前の記事は環境が古いため書き直しました。

#設定箇所
下記を~/.tmux.confに追記しました。

```~/.tmux.conf
set-window-option -g mode-keys vi

bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi C-v send-keys -X rectangle-toggle
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xsel -bi"
bind-key -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "xsel -bi"
```
※もともと"v"にはrectangle-toggleがバインドされているために、"C-v"にバインドを移動させています。

#使い方
1. "\<prefix> ["でコピーモードに入る
2. "v"で選択を開始
3. "y"もしくは"Enter"で選択を終了（コピー）、その結果がxselにパイプされクリップボードにコピー
4. ハッピー

#おまけ（WSL版）
win32yank.exeはPATHの通っているところに置きましょうね～。

```~/.tmux.conf
set-window-option -g mode-keys vi

bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi C-v send-keys -X rectangle-toggle
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "cat | win32yank.exe -i"
bind-key -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "cat | win32yank.exe -i"
```
vuexfireにおけるupdate実装でハマった結果、Objectのpropertyについて理解が深まった

# 追記
2019/6/24
そもそも公式に説明があったのを見逃していた
https://vuefire.vuejs.org/vuexfire/binding-subscriptions.html#using-the-data-bound-by-vuexfire

# 概要
公式ドキュメントを見ながらvuexfireの導入を進めていたときのこと、「doc.data()を同期してstateに持っててくれるのか、これは便利だ・・・。ん、でもdoc.idはどこいった？updateとかdeleteはどう実装するんだ？あれれれれ」と軽くハマったが、これを通してObjectのpropertyには列挙可能なやつとそうじゃないやつがあるということを知った、という話。


# ハマった流れ
typescriptの練習としてTODOアプリを作っていたときのことでした。

1.vuexfireの導入
```npm install vuexfire```

2.firestoreをbind
https://vuefire.vuejs.org/vuexfire/binding-subscriptions.html#binding-in-actions
公式ドキュメントを見ながら書いただけ

3.vueで表示
vue-devtoolsでstateを確認、ちゃんと取れてそう。
v-for使って中身を取ってきた配列データを表示してみたところ、問題なさそう。わお！便利！

4.createを実装する。
vuexfireは片方向に同期してくれるだけなので、追加や変更などは通常通り実装する必要があります。
まずはcreateを実装してみたところ、問題無くできた。ちゃんと同期されてる！楽チンで嬉しい！

5.updateを実装する。
```ref.doc(id).set({ payload }, { merge: true })```という感じでfirestore上の上書きしよう。
・・・あれ、id無くね？

ここでハマりました。
vue-devtoolsで中身を見ても、idが見当たらないのです。うーん・・・。

<img width="764" alt="スクリーンショット 2019-06-05 0.52.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271816/3c0583ba-8815-1a0d-c396-945254a7a516.png">

# 本題
## console.log()してみる

知り合いが先に取り組んでいたので相談してみたところ、「普通にid使えるはずです・・・。ちょっとconsoleに出してみてください。」とのこと。
なるほど・・・？
ではやってみましょう。（chromeです）
<img width="760" alt="スクリーンショット 2019-06-05 1.35.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271816/69b4e426-aaf4-a43e-f558-c7aaa5a210bc.png">

ありましたありました。vue-devtoolsには見えてないだけで、普通にありました。
idプロパティの色が薄いのが気になりますが、ありましたね。
なので、普通に```todo.id```みたいな感じでアクセスすれば使えました。

なんだか狐につままれたような気分です。vue-devtoolsに出ないということは取れて無いと思っていたが、どうやらそうではないらしい。

## vuexfireのソースコードを読んでみる
落ち着いてvuexfireのidを扱っている辺りのソースコードを読んでみます。

該当部分がここです。doc.data()とdoc.idをくっつけたオブジェクトを返す関数が定義されています。

```.js
function createSnapshot (doc) {
  // defaults everything to false, so no need to set
  return Object.defineProperty(doc.data(), 'id', {
    value: doc.id
  })
}
```
"Object.defineProperty()"というところがとても怪しい。
mozillaのドキュメントを確認してみよう。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
これによると、Objectの持つプロパティについて、細かく設定が出来るとある。
プロパティの追加と言ったら

```.js
let obj = {
  a: 1,
  b: 'hoge'
}
obj.c = 'added'
```
みたいな書き方しか知らなかったが、上位互換みたいなやつがあるっぽい。

これを参照しながらvuexfireのコードを読み解くと、doc.data()のオブジェクトに対して"id"プロパティを追加する際、

```.js
{
    enumerable: false,
    writable: false,
    configurable: false,
    value: doc.id
}
```
というオプションにが設定されるっぽい（デフォルト値についても明示的に書いてます）。
この中だとenumerableオプションが怪しいので、また調べる。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Enumerability_and_ownership_of_properties
>列挙可能な (enumerable)プロパティとは、内部の [[Enumerable]] フラグがtrueに設定されているものであり、単純な代入や初期化で生成されたプロパティはデフォルトでそうなります（一方、Object.defineProperty()で追加したプロパティはデフォルトで [[Enumerable]] が false になります）。 列挙可能なプロパティは、名前がSymbolである場合を除いて、 for...in ループの対象になります。

なるほど！enumerableオプションがfalseだとプロパティ列挙しようとしても出てこないと。(consoleで薄い色だったのもそのせい？）
~~vuexfireで```enumerable: false```としているのは、なるべく元のデータ構造を壊さないようにという考えでしょうか？~~
（追記）公式ドキュメントにそんなような事が書いてありました。

ちなみに、idはvue-devtoolsに出てこなかったわけですが、template内で```{{todo}}```のようにマスタッシュ記法で表示させようとしても、スプレッド演算子で展開するときもやはり出てきません。
[Intel SGX] sgx_ra_get_keyで生のバイナリ値が欲しい

## 背景
sgx_ra_get_keyでRemote Attestation共通鍵MKを取ってこれるらしいのだけど、このMKをuint8_t配列で、すなわち生のバイナリ値が欲しかった。しかし、生のバイナリ値を取り出すのに苦戦したのでここにメモを残す。基本的に鍵は生のバイナリ値で取り出すべきではない（公式ではHash値を使えと書いてある）、でも私のように特殊な需要も考えてほしい。

## わかったこと
sgx_ra_get_keyができるのはEnclave内だけである。この値をEnclave外(Appとする)から取り出そうとするとそう簡単にはいかない。ocallを上手に使ってやる必要がある。


## サンプルコード
フォルダ構造は次のようになっているものとします。

- App Proj
  - App.cpp
  - ocalls.cpp
  - ocalls.h
- Enclave Proj
    - enclave.edl
    - enclave.cpp 


まずキーを出力する関数を書く(ocall.cpp)

```
#include <stdio.h>
#include "path_to_enclave_u.h"
void ocall_print_mk(const uint8_t *mk, int len) {

	printf("\n\n");
	for (int i = 0; i <len; i++) {
		printf("%02x", mk[i]);
	}
	printf("\nlen=%d", len);
	printf("\n\n");
}
```

ヘッダーでextern "C"を忘れないように(ocall.h)

```
#pragma once
#include <sgx_key_exchange.h>


extern "C" {
	void ocall_print_mk(const uint8_t *mk, int len);

	void ocall_print_str(const char *str);
}
```

edlはuntrustedに書く。

```
	untrusted{
		void ocall_print_mk([in, count=len] const uint8_t *mk, int len);
	};
```

Appの任意の場所でmkを取り出して出力する。(App.cpp)

```
	sgx_ra_key_128_t key;
	sgx_status = sgx_ra_get_keys(ra_ctx, SGX_RA_KEY_MK, &key);
	if (sgx_status != SGX_SUCCESS) {
		return INVALID_PARAMETER;
	}
	uint8_t copied[16] = { 0 };
	for (int i = 0; i < 16; i++) {
		copied[i] = *(key + i);
	}
	ocall_print_mk(copied, 16);
```
Buildfarm+bloomで自作ROS pkg をaptやrosdepで取得可能にする！

題記の手順をチュートリアル形式にした記事を書きました。詳細は、リンク先のブログをご参照下さい。

![ROS Buildfarm 構成図](https://cdn-ak.f.st-hatena.com/images/fotolife/M/MoriKen254/20190609/20190609204332.jpg)

### 目次
- [① 前準備編](http://www.moriken254.com/entry/2019/06/09/224241)
- [②リリース編](http://www.moriken254.com/entry/2019/06/09/224329)

### 概要
#### [① 前準備編](http://www.moriken254.com/entry/2019/06/09/224241)　→　詳細は「[こちらのリンク](http://www.moriken254.com/entry/2019/06/09/224241)」
  - bloom における、リリースの前処理側(CHANGELOG の更新、package.xml の ver. インクリ等)の手順を説明します。
  - ![bloom前処理](https://cdn-ak.f.st-hatena.com/images/fotolife/M/MoriKen254/20190609/20190609210908.jpg)

#### [②リリース編](http://www.moriken254.com/entry/2019/06/09/224329)　→　詳細は「[こちらのリンク](http://www.moriken254.com/entry/2019/06/09/224329)」
 - release リポジトリの更新、ros-distro への PR 等、実際のリリース作業の手順を説明します。
 - ![debian作成確認](https://cdn-ak.f.st-hatena.com/images/fotolife/M/MoriKen254/20190609/20190609220634.jpg)
【Java】指摘しないこともあるけど出来ればリファクタリングしてほしいこと【好みの問題】

# はじめに
この記事は[【Java】ソースレビューを依頼する前にセルフチェックできること【初心者】](https://qiita.com/mtanabe/items/aba0c9ec8e3a76792e2f)のおまけになります。
個人的な好みもあるので、ソースレビューでは指摘したりしなかったりします。

# 個人的に好きじゃないから指摘しちゃうもの

## 拡張for文はList専用ではありません。

配列でも使えますし、逆にListでも普通のfor文使えます。
indexの値を必要としないなら、全て拡張for文でOKなくらいです。

```Java
// 配列を拡張for文で回す例
String[] strArray = new String[5];
for (String str : strArray) {
  System.out.println(str)
}

// Listを普通のfor文で回す例
List<String> strList = new ArrayList<String>();
for ( int i = 0 ; i < strList.size() ; i++) {
  System.out.println(strList.get(i))
}
```

よければ、こちらも参考にしてください。
:link: [【Java】今さらだけど拡張for文はList専用じゃないよ？](https://qiita.com/mtanabe/items/865608d100045179d213)

## メソッドの戻り値はそのままreturnできませんか？
例えば、以下のようなソースコードは、変数`String str`に取り出さなくても、そのままreturnできます。

```Java
String str = hogehogeClass.fugafugaMethod(condition);
return str;
```

特に何もせず、素直にreturnするだけであれば、いちいち変数に取り出さずに真っ直ぐreturnしてOKです。

```Java
return hogehogeClass.fugafugaMethod(condition);
```

## メソッド名・変数名は長すぎませんか？
### getterが連続するとき
DBから取得した値などは、オブジェクト構造の関係で、getter呼び出しが長くなることもあります。

```Java
// 例）
hogehogeObject.gethogeList().get(0).getfugafuga();
```
これくらいだったらかわいいですが、実際の現場では`hogehoge`部分はもっと長くなることもあります。
読み辛いだけなので、適当な短い名前の変数に入れてください:dizzy_face:
何回も使うような場合は特に！

#### おことわり
「こんなオブジェクト設計が間違ってる！」とか「イケてない:anger:」とか、思うことがあるプログラマは多いと思います。
が、数年以上続いてる案件だとツギハギだらけでこんな設計になってしまった
悲しいソースにも出会います・・・:cry:

### クラス名そのままの変数
クラス名をそのまま変数名としている場合が多いですが。

```Java
// 例）
HogeHogeDataReq hogeHogeDataReq;
```
明らかに判別可能な場合は、クラス名をそのまま変数名にしなくてよいです。上記の例だと、`req`とかでOKです。

## その英語合ってますか？
例えば、「取引」という日本語を英訳サイトなどで検索すると、パパッと見ただけでも、これだけ引っかかります [^検索元]。

[^検索元]: 参考） :link: [英辞郎 on the WEB：アルク](https://eow.alc.co.jp)

| 英単語 | 日本語の意味 |
|:--|:--|
| deal | 取り決め、契約 |
| dicker | （政治的な）駆け引き |
| trading | 貿易、通商 |

いま使いたい「取引」は、どの「取引」でしょうか？
ECサイトなのに「dicker」は、まずナシですよね。

### その略し方、合ってますか？
日本語にもある程度略し方があるように、英語にも略し方があります。
正しく略せば、プログラムの中の変数は自然と統一されてくると思います。

手前味噌ですが、英単語の省略の仕方に自信がない方はこちらを参考にどうぞ。
:link: [【変数】英単語の略し方や省略形を検索する【命名】](https://qiita.com/mtanabe/items/48f9b2f5167d5a3b2d71)

# おわりに
好みの問題もありますが、誰が読んでもイライラ:angry:しないソースを書きたいですね。
NIPALS(regression)

```{r}

#入門機械学習による異常検知　コロナ社　井出剛先生　p.176

#NIPALS method(regression)

library(dplyr)
data=data.frame(num=1:20,y=c(167,167.5,168.4,172,155.3,151.4,163,174,168,160.4,164.7,171,162.6,164.8,163.3,167.6,169.2,168,167.4,172),x1=c(84,87,86,85,82,87,92,94,88,84.9,78,90,88,87,82,84,86,83,85.2,82),x2=c(61,55.5,57,57,50,50,66.5,65,60.5,49.5,49.5,61,59.5,58.4,53.5,54,60,58.8,54,56))

X=t(matrix(c(data$x1,data$x2),ncol=ncol(data)-2,nrow=nrow(data)))

Y=t(t(as.numeric(data$y)));N=length(Y)

cols=nrow(X);X2=X

P=array(0,dim=c(nrow(X),cols))

for(j in 1:cols){
  
P[,j]=X2%*%Y/sqrt(sum(X2%*%Y^2))  

d=t(X)%*%P[,j]/sqrt(sum((t(X)%*%P[,j])^2))

X2=X2-X2%*%d%*%t(d)

}

R=t(P)%*%X

Beta=solve(R%*%t(R))%*%R%*%Y

result=data.frame(num=1:nrow(data),y=data$y,predict=t(t(Beta)%*%R))

plot(result$num,result$y,xlim=c(1,nrow(data)),ylim=c(min(result$y,result$predict),max(result$y,result$predict)),xlab="sample number",ylab="values",type="o",col=2)
par(new=T)
plot(result$num,result$predict,xlim=c(1,nrow(data)),ylim=c(min(result$y,result$predict),max(result$y,result$predict)),xlab="sample number",ylab="values",type="o",col=3)

cor(result$y,result$predict)


```
Twilio で Fax 送信 を PowerShell コマンドレットで

Twilio の API を PowerShell から操作して FAX を送信します。

##Twilio の API
API で FAX 送信できます。

TITLE: プログラマブルFax REST API
URL: https://jp.twilio.com/docs/fax/api

##PowerShell から API 操作

```
$cred = Get-Credential
Invoke-RestMethod -Uri "https://fax.twilio.com/v1/Faxes/" -Credential $cred -Method POST -Body @{To="<宛先の Fax 番号>"; From="<Twilio で取得した発信番号>"; MediaUrl="<PDF ファイルの URL>"}

```
実行例は以下のようになります。

```
$cred = Get-Credential
Invoke-RestMethod -Uri "https://fax.twilio.com/v1/Faxes/" -Credential $cred -Method POST -Body @{To="+81300000000"; From="+81310000000"; MediaUrl="https://jp.twilio.com/docs/documents/25/justthefaxmaam.pdf"}
```
##動作確認
上述のスクリプトを実行します。

Get-Credential コマンドレットに応じて、資格情報入力のダイアログが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/10ce891d-e37d-5dbc-3789-ca2bdecae3e5.png)

Twilio のダッシュボードで取得できる Account SID と Auth Token を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/974cd4c7-116f-410a-1507-cabcdf120d15.png)

FAX 送信のキューに格納されたことを示すレスポンスが返ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/24a2a119-05e3-4c9c-712f-0bf843884f65.png)
PythonでシンプルにDBへアクセスできる dataset を試す

## はじめに
PythonでシンプルにDBへアクセスできる [dataset](https://dataset.readthedocs.io/en/latest/index.html) を試しました。

## 前提条件
以下がインストール済みであることを前提とします。
- pipenv
- sqlite3

動作確認した環境のバージョンは以下のとおりです。

``` sh
$ pipenv --version
pipenv, version 2018.11.26
$ sqlite3 --version
3.16.0 2016-11-04 19:09:39 0e5ffd9123d6d2d2b8f3701e8a73cc98a3a7ff5f
```

## 環境構築
``` sh
$ mkdir sample && cd sample
$ pipenv --python 3.7
$ pipenv install dataset
$ cat <<EOF | sqlite3 ./sqlite3.db
CREATE TABLE depts(id integer primary key autoincrement, name text);
CREATE TABLE users(id integer primary key autoincrement, name text, email text, dept_id integer);
insert into depts (name) values ('A');
insert into depts (name) values ('B');
insert into depts (name) values ('C');
EOF
```

## ソースコード
``` python:test.py
#!/usr/bin/env python
import dataset, traceback, json

db = dataset.connect('sqlite:///sqlite3.db')

users = db['users']

try:
	db.begin()

	users.delete()

	users.insert(dict(name='test1', email='test1@example.com', dept_id=1))
	users.insert(dict(name='test2', email='test2@example.com', dept_id=2))
	users.insert(dict(name='test3', email='test3@example.com', dept_id=3))
	users.insert(dict(name='test4', email='test3@example.com', dept_id=3))
	users.insert(dict(name='test5', email='test3@example.com', dept_id=3))

	db.commit()

except Exception as e:
	traceback.print_exc()
	db.rollback()

rows = db.query("""
	select
		u.id
		, u.name
		, u.email
		, u.dept_id
		, d.name as dept_name
	from users u
	left join depts d
		on u.dept_id = d.id
	where
		u.dept_id = :dept_id
""", dept_id=3)

print("Result:")
for row in rows:
	print(json.dumps(row))

```

## 実行
``` sh
$ pipenv run python test.py
Result:
{"id": 3, "name": "test3", "email": "test3@example.com", "dept_id": 3, "dept_name": "C"}
{"id": 4, "name": "test4", "email": "test3@example.com", "dept_id": 3, "dept_name": "C"}
{"id": 5, "name": "test5", "email": "test3@example.com", "dept_id": 3, "dept_name": "C"}
```

とてもシンプルに書けていい感じです！！
【GitHub】コミットしたユーザーアカウントが違うときの対処法

#概要
GitHubにプッシュしたあと、別アカウントでプッシュされていたので、統一アカウントにして、すでにプッシュ済みのコミットも統一アカウントに変更してみました。

#コミットの確認
最初に下記のコマンドでログを確認します。

```:terminal
$ git log --pretty=full
```

各々のログが出てくると思います。

```:terminal
commit xxx123xxx456xxx789xxx (HEAD -> master, origin/master)
Author: name <email@example.com>
Commit: name <email@example.com>

    first commit
```

#Gitの設定変更
プッシュされたコミットはGitHubと関連付けるために、メールアドレスを使用しています。そのため、統一したいGitHubアカウントのメールアドレスに変更すれば解決できるので、

①まずメールアドレスを変更しましょう。

```:terminal
$ git config --global user.email "email@example.com"
```

②正しく変更されているか確認します。
上記で指定したメールアドレスに変更されていれば大丈夫です。

```:terminal
$ git config --global user.email
email@example.com
```

③最後にもう一度プッシュします。

```:terminal
$ git push-f origin master
```
これでGitHubに戻ってみると、コミットしたアカウントが、変更後のアカウントになっているはずです。

#最後に
まとめると、下記のようなことを行いました。
![github_change_commit_user.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403981/8b7ff008-fe0b-3ec4-e551-7ae0e6703d3e.png)

#参照
- [Why are my commits linked to the wrong user?](https://help.github.com/en/articles/why-are-my-commits-linked-to-the-wrong-user)
- [Setting your commit email address in Git](https://help.github.com/en/articles/setting-your-commit-email-address-in-git)
- [GitHubのAuthorを全コミット変更したい。実際に使っているメールアドレスをコミットに使いたくない。](https://himakan.net/websites/github_edit_commit)
Embulkを利用したElasticCloudへの送信

# 冒頭
Embulkから、ElasticCloudに送信できるのかなと思い備忘録も兼ねて記述を残します

# 事前準備

- Embulkのインストール
- ElasticCloud(14日間体験版)

brewなら下記のコマンド

```
$ brew install embulk
```

# 手順

inputファイルを作成する

```
$ vi log/aaa.csv 
```

ファイルの中身

```
a,b,c
100,200,300
200,300,400
500,60000,7000
```

seed.yml を作成する(XXXXXはElasticCloudの管理画面より入手する)

```
in:
  type: file
  path_prefix: "/Users/taku333/Documents/embulk/log/aaa.csv"
#out: {type: stdout}
out:
  type: elasticsearch
  index: embulk
  index_type: embulk
  nodes:
  - {host: XXXXXXX, port: XXXX}
  user: XXXXX
  password: XXXXXXXXXXXXXXXXX
  use_ssl: true
  auth_method: basic
```

seed.yml ⇨ config.yml を作成する

```
embulk guess seed.yml -o config.yml
```

embulkを実行する

```
embulk run config.yml
```

# 結果
良かった表示された　7.1.1だったけど動いた
<img width="1093" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159184/97d6dcd7-a4dc-b0b4-be07-e73bf6100f08.png">

7.0なら「_doc」で自動登録されるので「index_type」の項目を削除して試してみましたが、
予想通り動きませんでした

```
Caused by: org.embulk.config.ConfigException: com.fasterxml.jackson.databind.JsonMappingException: Field 'index_type' is required but not set
```

# 失敗した点
「auth_method」忘れてて、失敗しました

```
org.embulk.exec.PartialExecutionException: org.eclipse.jetty.client.HttpResponseException: Response not 2xx: 401 Unauthorized
```

# 参考資料

- [embulk-output-elasticsearch](https://github.com/embulk/embulk-output-elasticsearch)
- [embulk初歩](https://qiita.com/tagackt/items/e60e149e97ab204c82c3)
- [Embulkについてまとめてみた　2017/08](https://qiita.com/tashiro_gaku/items/f7fa0f1a99c759d947a7)
- [Embulk + Elasticsearch + kibana + OpenStreetMapでお手軽に地理情報を可視化](https://qiita.com/terukizm/items/46b531b7fcc7a5f6f436)
Pythonの標準ログ出力機能を利用するときの設定

# はじめに
Pythonにはログ出力を行う`logging`モジュールが標準で備わっています。
このモジュールを利用するときには、ログの出力先や出力内容などを設定する必要があります。
しばらく使っていないと忘れてしまいそうなので、メモします。

# ログ出力の設定方式とこの記事で取り扱う方式
`logging`モジュールには、大きく2つの出力設定方式があります。
`dictConfig()`と`fileConfig()`という2つです。

`dictConfig()`では、引数にditctionary形式で出力設定を与えます。
`fileConfig()`では、ConfigParser形式(WindowsのINIファイルに似た形式)で出力設定を与えます。

`fileConfig()`APIでの出力設定の方式は`dictConfig()`での方式よりも古く、
将来、設定方式が拡張されるときに`dictConfig()`のみになされるそうなので、
`dictConfig()`方式を利用するのが良いそうです。

ということで、`dictConfig()`方式での指定方法について情報を記載します。

# ログ出力設定
dictionary形式で以下のように準備します。

* `version`は固定的に1を指定。
* `formatters`には出力文字列の書式を設定します。複数設定可能です。
* `handlers`には出力先(コンソールに出力する`StreamHandler`やローテートして出力する`RotatingFileHandler`など)を設定します。
* `logger`には、ロガー名と利用するハンドラとの対応づけを設定します。

```python
# ログ出力設定
LOGGING = {
    'version': 1,
    'formatters': {
        'simpleFormatter': {
            'class': 'logging.Formatter',
            'format': '%(asctime)s - %(name)s[%(levelname)s] %(message)s'
        }
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'level': 'DEBUG'
        },
        'fileout': {
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': 'dictlog.log',
            'mode': 'a',
            'maxBytes': 5000,
            'backupCount': 5,
            'formatter': 'simpleFormatter'
        }
    },
    'loggers': {
        'simpleExample': {
            'handlers': ['fileout', 'console'],
            'propagate': 0,
            'level': 'INFO'
        }
    },
    'root': {
        'level': 'DEBUG',
        'handlers': ['fileout']
    },
}
```


# ログ出力部分

```python
import logging
import logging.config


### 上のLOGGINGの宣言をここに書く ###

# ログ出力設定をdictionary形式で指定する
logging.config.dictConfig(LOGGING)

# dictionary内に定義されているロガー名を指定する
logger = logging.getLogger('simpleExample')

logger.info("===== Application Start =====")

logger.info("===== Application End =====")
```

# 出力例
上の設定では、`simpleExample`ロガーにて、ファイルとコンソールとの両方に出力するよう設定しています。
それぞれ次のように出力されます。

* ファイル

```
2019-06-09 20:33:20,090 - simpleExample[INFO] ===== Application Start =====
2019-06-09 20:33:20,091 - simpleExample[INFO] ===== Application End =====
```

* コンソール

```
===== Application Start =====
===== Application End =====
```

# おわりに
ログはプログラムの動作を追うのにとても有効な情報となります。
短いプログラムであってもログを出力するようにしていきたいものです。

# 参考情報
* 設定のフォーマット

https://docs.python.org/ja/3/library/logging.config.html#configuration-dictionary-schema

* 出力する文字列の書式設定

https://docs.python.org/ja/3/library/logging.html#logrecord-attributes
DockerfileのWORKDIRが有効な範囲

削除準備中
内容は移動
[DockerfileのWORKDIRが有効な範囲 - メモ置き場](https://scrapbox.io/tkms0106/Dockerfile%E3%81%AEWORKDIR%E3%81%8C%E6%9C%89%E5%8A%B9%E3%81%AA%E7%AF%84%E5%9B%B2)
色んな文字まるめ



長い文章をCSSだけで `…`で区切る方法。詳細ページへリンクする一覧ページのリスト表示とかで使えるやつね。 

```
- 長い文章があったときにとても文章が長くて冗長で切り上げたいときがありますよね。
// こうなる👇
- 長い文章があったときにとても文章が長くて冗長で…
```

`…`のことをクランプ文字とか言うらしい :thinking: てんてんてんでええやん。

<p class="codepen" data-height="300" data-theme-id="29715" data-default-tab="result" data-user="ksyunnnn" data-slug-hash="PvMvRW" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="色んな文字まるめ">
  <span>See the Pen <a href="https://codepen.io/ksyunnnn/pen/PvMvRW/">
  色んな文字まるめ</a> by Kobashi syunsuke (<a href="https://codepen.io/ksyunnnn">@ksyunnnn</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# こいつで遊びます

長いですね〜

```html
<section>
  <ul>
    <li> 
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Nulla aliquet enim tortor at auctor urna nunc id. Venenatis cras sed felis eget. </p>
    </li>
    <li> 
      <p>Et sollicitudin ac orci phasellus egestas tellus. Enim facilisis gravida neque convallis a cras semper. Elementum tempus egestas sed sed risus pretium. Aliquam nulla facilisi cras fermentum odio eu feugiat pretium. Aliquam malesuada bibendum arcu vitae elementum curabitur. Suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. </p>
    </li>
    <li> 
      <p>Scelerisque purus semper eget duis at tellus.</p>
    </li>
    <li> 
      <p>Diam vel quam elementum pulvinar etiam. </p>
    </li>
    <li> 
      <p>Id consectetur purus ut faucibus pulvinar elementum integer enim.</p>
    </li>
  </ul>
</section>
```

# 1.幅でまるめ

```scss
section {
  max-width: 400px;
  li {
    overflow: hidden;
    p {
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: nowrap;
    }
  }
}
```

結果
<img width="436" alt="Screen Shot 2019-06-09 at 22.01.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117615/c2b2a97f-80b2-e2eb-8752-f4035f058185.png">


# 2.行数でまるめ

```scss
section {
  li {
    overflow: hidden;
    p {
      display: -webkit-box;
      -webkit-box-orient: vertical;
      -webkit-line-clamp: 3;
    }
  }
}
```

<img width="667" alt="Screen Shot 2019-06-09 at 22.03.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117615/a67b2192-6ac0-a311-0b6a-b63fbd4f171a.png">


# 再掲

<p class="codepen" data-height="300" data-theme-id="29715" data-default-tab="result" data-user="ksyunnnn" data-slug-hash="PvMvRW" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="色んな文字まるめ">
  <span>See the Pen <a href="https://codepen.io/ksyunnnn/pen/PvMvRW/">
  色んな文字まるめ</a> by Kobashi syunsuke (<a href="https://codepen.io/ksyunnnn">@ksyunnnn</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

<br/>
他にもあったら教えて〜
Android Developer Roadmap 2019 【Android Studio編】

#はじめに
私は、実務未経験でAndroidアプリ開発者に転職することを目指している者です。
先日、Android Developer Roadmapというものを教えていただきました。
初学者がロードマップに従い調べた内容を簡潔にまとめて記事にすることを目的としています。

#Android Developer Roadmap 2019
Androidアプリの開発者を目指すのに当たり、何を勉強すれば良いのか、どの程度まで知っておく必要があるのかを現役エンジニアの方に相談したところ、こちらを教えていただきました。（ありがとうございます！）
このロードマップを参考にコツコツとまとめていきたいと思っています。
https://github.com/anacoimbrag/android-developer-roadmap


#Android Studioのインストール
今回はAndroid Studio編ということで、Android Studioのインストール方法をまとめたいと思います。

環境 : Windows7 64bit、Android Studio 3.4.1
1. https://developer.android.com/studio/index.html?hl=ja にアクセスし、Android Studioをダウンロード
2. ダウンロードしたexeファイルを実行
3. 特に設定を変えずにNext → Install
4. Installが終了し、Next → Finishで完了

日本語化する場合
5. http://mergedoc.osdn.jp/ からPCに応じたPleiadesプラグインをダウンロード
6. ダウンロードしたzipファイルを解凍
7. setup.exeを実行
8. 日本語化するアプリケーションを選択（本環境では、\Android\Android Studio\bin\studio64.exeを選択）

これでインストールが完了です。
（参考 : https://developer.android.com/studio/install?hl=ja ）
Railsのインスタンス変数(view)について

#インスタンス変数(view)について

##前提
属性name <- validates　true

##Controller(createアクション)
Railsでtodoアプリを開発する際に、createアクションでの検証エラーを画面に表示する方法を忘れそうなので記述しとく

例えば通常(ただ登録するだけ)では

```ruby:tasks_controller.rb
def create
  task = Task.new(xxx_params)
  task.save!
  redirect_to xxx_url
end

private
  def xxx_params
    params.require......
  end
```

となる

**だが**
このままでは名前が空欄のまま登録した際にエラーを表示できなくなる
**対処法**

```ruby:tasks_controller.rb
def create
  @task = Task.new(xxx_params)
  
  if @task.save
    redirect_to xxx_url or @task 
  else
    render :new  
  end
end
```

1.　save!をsaveにしたのはsaveは失敗した場合戻り値に**false**を返すから
2.　render :new としたのは結果がfalseだった場合にnew.html.erbを再度表示させるため
3.　taskを@taskにしたのはエラーの際にnew.html.erbを表示される、この時にインスタンス変数@taskであればnewページに戻ったとしても、**前回入力した値を引き継いでくれる**。


これはeditアクションにも応用できる

```ruby:tasks_controller.rb
  def edit
    @task = Task.find(params[:id])
  end

  def update
    @task = Task.find(params[:id])

    if @task.update(xxx_params)
      redirect_to xxx_url or @task
    else
      render :edit
    end
  end
```

忘れないでおこう
コントローラーで押したらボヨンボヨンするオブジェクトをつくる

#完成イメージ
コントローラーで押したら反発（元の位置に戻ろうとする）するオブジェクトをつくります。
![20190609_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285370/5db239f2-7fc4-742b-fed5-3c7f526b7bba.gif)

#前準備
コントローラーとオブジェクトにRigidbodyとColliderをアタッチします。
Rigidbodyは UseGravity のチェックを外してください。
Collider の形は Box や Sphere で問題ありません。
上記のイメージではBoxColliderを使用しています。

#スクリプト
以下のスクリプトを反発するオブジェクトにアタッチします。

ElasticityObject.cs

```
using UnityEngine;

public class ElasticityObject : MonoBehaviour
{
    private Rigidbody rb;
    private Vector3 initialPos;
    private Vector3 initialAng;

    void Start()
    {
        rb = this.gameObject.GetComponent<Rigidbody>();
        initialPos = this.gameObject.transform.position;
        initialAng = this.gameObject.transform.eulerAngles;
    }

    void FixedUpdate()
    {
        this.gameObject.transform.position = initialPos;
        this.gameObject.transform.eulerAngles = initialAng;
    }
}
```
FixedUpdate() 内で Rigidbody の位置と角度を最初の状態に戻しています。

#最後に
遊んでたらたまたま出来た、という感じなので他にスマートなやり方があるかもしれません。
また、Collider が小さすぎると、コントローラーがすぐオブジェクトを貫通してしまうので、Colliderは少し大きめに設定した方がよいです。

スクリプト 及び Rigidbody の Constraints を設定を変更するとオブジェクトを回転させることもできます。（もう反発とか関係ないですが。。。）
![20190609_2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285370/4b709660-3655-6f8b-def9-fe0b98681caf.gif)
Rails Tutorial（2週目）-10-

#認可
***認証(authentication)***はサイトのユーザーを識別すること***認可(authorization)***はそのユーザーが実行可能な操作を管理すること。

##beforeフィルター
ログインしていないユーザーが保護されているページにアクセスした時、ログインページに転送するために、beforeフィルターを使う。

```app/controllers/users_controller.rb
class UsersController < ApplicationController
  before_action :logged_in_user, only: [:edit, :update]
  .
  .
  .
  private

    def user_params
      params.require(:user).permit(:name, :email, :password,
                                   :password_confirmation)
    end

    # beforeアクション

    # ログイン済みユーザーかどうか確認
    def logged_in_user
      unless logged_in?
        flash[:danger] = "Please log in."
        redirect_to login_url
      end
    end
end
```

`before_action`で何らかの処理が行われる直前に特定のメソッドを実行できる。またオプションとして、`:only`オプションを渡すことで、コントローラ内の特定のアクションを行う前にだけフィルタを適用させる事ができる。

##フレンドリーフォワーディング
フレンドリーフォワーディングとはユーザーが認可前に開いていたページを認可後に開く仕組み。

→ユーザーを希望のページに転送するには、リクエスト時点のページをどこかに保存しておき、その場所にリダイレクトさせる必要がある。

```app/helpers/sessions_helper.rb
module SessionsHelper
  .
  .
  .
  # 記憶したURL (もしくはデフォルト値) にリダイレクト
  def redirect_back_or(default)
    redirect_to(session[:forwarding_url] || default)
    session.delete(:forwarding_url)
  end

  # アクセスしようとしたURLを覚えておく
  def store_location
    session[:forwarding_url] = request.original_url if request.get?
  end
end
```

requestオブジェクトはアクセスしたユーザーの情報を取得。
`request.メソッド`で使える
`request.original_url`でリクエスト先のURLを取得

#サンプルユーザーの作成
##fakergemの使用
fakerをインストールしたあと、db/seeds.rbにコードを書く。

```db/seeds.rb
User.create!(name:  "Example User",
             email: "example@railstutorial.org",
             password:              "foobar",
             password_confirmation: "foobar")

99.times do |n|
  name  = Faker::Name.name
  email = "example-#{n+1}@railstutorial.org"
  password = "password"
  User.create!(name:  name,
               email: email,
               password:              password,
               password_confirmation: password)
end
```

`$ rails db:migrate:reset`
`$ rails db:seed`でデータベースに適用させる

##ページネーション
gemfileにwill_peginate gemとbootstrap-will_paginate gemを両方含ませる。

```
source 'https://rubygems.org'

gem 'rails',                   '5.1.6'
gem 'bcrypt',                  '3.1.12'
gem 'faker',                   '1.7.3'
gem 'will_paginate',           '3.1.6'
gem 'bootstrap-will_paginate', '1.0.0'
```

paginateはキーがpageで値がページ番号のハッシュを引数に取る。　
`$ rails console
\>> User.paginate(page: 1)
  User Load (1.5ms)  SELECT "users".* FROM "users" LIMIT 30 OFFSET 0
   (1.7ms)  SELECT COUNT(*) FROM "users"
=> #<ActiveRecord::Relation [#<User id: 1,...`

実際には

```app/controllers/users_controller.rb
def index
    @users = User.paginate(page: params[:page])
  end
```
今回はページ番号を取る値にparams[:page]をとっているが、これはwill_paginateメソッドが自動で生成している。
おそらくアクセスされた番号のページということだと思う。
``