OmniAICreator/Qiita-1.07M huggingface dataset:
どこでもドア作ってみた

#発想
アドベントカレンダーに友人から誘われ、Qiita記事も書いたことがない人が何を書いたら良いだろうと悩んでいました。考える時間ももったいないので、誘ってきた友人に「何書いたらいいかなぁ？」を会うたびに聞きまくっていたら・・・。
**「どこでもドアつくって」**って言われた。
無茶ぶりかよ、助けてドラ○もん。

さすがに未来技術は作れないので…。
「どこでもドア」を「どこでも（開けられる）ドア」に読みかえてみました。
この読みかえができた自分、偉いと思う。

「そしたら自動ドアと通信する仕組み作ったらいけるのでは？」
と構想が見えてきて、制作に踏み切りました。

#構想
1. 操作者は何らかの方法でドア型ロボットに通信を行う。
2. ドア型のロボットは通信内容にしたがってドアを開閉する。
3. でもサーバーとか立てるのは面倒なので、なんとか既存サービスを組み合わせたい。

以上３つが達成できればできるはず！

#実装
じゃあ作っていきます。記事では３つに分けて紹介します。
一番技術的に不透明なのは、ロボットとの通信部分でした。
まずはここからはじめていきます。
###ドア型ロボットとの通信
電子パーツ集めてロボット作るのは大変なので、今回はレゴ社のWedo２．０またはEV3を使います。Wedo２．０でできたらロボットの制作はとても楽できます。

Wedo２．０にはモーションセンサーが含まれているので、カラーセンサーとして代用できるはず。あとはPCの画面にセンサーくっつけて、画面の色をネットワーク越しで操作できたらミッションクリアです。

今回はGoogleAppScript（以下GAS） ＋ GoogleSpreadsheet（以下スプレッドシート）で実装してみます。

- まず、GASでは簡易的なWebサイトが作れるので、それを利用してフォーム送信できるHTMLを作ります。
- HTTPリクエストの受付、フォーム送信やスプレッドシートへの書き込みを行うGASを書きます。
- 次にスプレッドシート作成。条件付き書式を設定してデータによって白黒を切り替えられるようにします。

実装したWebサイト・コードがこちら。実装はすべてGASのスクリプトエディタ上で行っています。
作ったWebサイトはiPhoneで表示して、開ける・閉めるボタンが押せるようにしてあります。
デサインは勘弁してください。
<img width="375" alt="IMG_0696.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550572/746d7107-8cd7-bcfa-50a3-238655e955f0.png">

```HTML:index.html
<!DOCTYPE html>
<html>

<head>
<base target="_top">

<style type="text/css">
<!--
h1 {
  font-size:150px;
  margin-block-start: 10px;
  margin-block-end: 10px;
}

input {
  display       : inline-block;
  border-radius : 5%;          /* 角丸       */
  font-size     : 100pt;        /* 文字サイズ */
  text-align    : center;      /* 文字位置   */
  cursor        : pointer;     /* カーソル   */
  padding       : 12px 12px;   /* 余白       */
  background    : #00aaff;     /* 背景色     */
  color         : #ffffff;     /* 文字色     */
  line-height   : 1em;         /* 1行の高さ  */
  transition    : .3s;         /* なめらか変化 */
}
-->
</style>
</head>

<body>
<h1>どこでもドア</h1>
<form method="post" action="https://script.google.com/macros/s/AKfycbwhBQJ1n2uO2_BNKQQXxWRCIYjKeZBcb5FfxcwBzfIGmRx9KVPt/exec">
<input type="submit" name="open" value="開ける">
<input type="submit" name="open" value="閉じる">
</form>
</body>

</html>
```

```javascript:code.gs
function doGet() {
  var toppage=HtmlService.createTemplateFromFile("index");
  return toppage.evaluate();
}

function doPost(postdata){

  var sh=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var str=postdata.parameters.open.toString();

  var cell=sh.getRange(1, 1);
  cell.setValue(str)

  var resultpage=HtmlService.createTemplateFromFile("index");
  return resultpage.evaluate();
}
```

###センサの反応チェック
**ここで問題が発生**
Wedo2.0のセンサでディスプレイ上の色の変化を読み取れなかった！
いや…そうだよね…赤外線の反射光を測るセンサだから、ディスプレイの色じゃなくて素材に左右されるもんね…。あれ？この問題はEV3のセンサでも起きてしまうのでは？

**制作中止か・・・？**
数日意気消沈したあと、おそるおそるEV3のカラーセンサーも試してみました。
結果は…やっぱりだめだった。「反射光の強さ」だと違いがでませんでした。
これはまずい…と思いましたがセンサの値を「周辺光の強さ」に切り替えたら十分な変化量が出ました！
いや〜…まじで良かった。

###ドア型ロボットの制作
ここからは一気に作るだけです。ロボット・プログラムの制作工程は割愛して写真だけ。
写真ではドア型ロボットの部分と、センサをPCに固定する部分に分かれています。
![IMG_0693.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550572/42f49be6-68bc-5268-9284-2cc37b005706.jpeg)

#結果
作ったものをセッティングしていざ動作テスト！
どこでもドア、動きました。
[![どこでもドア動画](http://img.youtube.com/vi/QRI1oabZycI/0.jpg)](http://www.youtube.com/watch?v=QRI1oabZycI)
gdb覚書

## config

```
# 長い文字列が途切れないように
# default 200
set print elements 0
# 重複も直接表示する
# default 10
set print repeats 0
# 整形して出力
set print pretty on
# 一気に表示する
set pagination off
# オーバーロード解決を無効にする(?) 個人的には無効のほうがちゃんと動く感じがする
set overload-resolution off
```

## generate string

- https://stackoverflow.com/a/11311786/2641271

```
set $fname=(std::string*)((void*(*)(int))malloc)(sizeof(std::string))
call $fname->basic_string()
call $fname->assign("/tmp/hello")
```

https://stackoverflow.com/questions/41695254/can-gdb-print-64-bit-address/41705611#41705611 によると、ポインタは、正しいシグネチャの関数ポインタにキャストすれば使えるらしい。

なおこのテクニックは[Perl_get_context()を渡す](https://qiita.com/cielavenir/items/80d69340acb0c043d3cf#perl)ときにも使います。

## calling shared_ptr

```cpp
#include <memory>
#include <boost/shared_ptr.hpp>

class obj{
public:
    int fff(int i){return i;}
};

int main(){
    boost::shared_ptr<obj> o(new obj);
    return o->fff(0);
}
```

```
# boost
set overload-resolution off
p (*o.px)->fff(1)
# std
set overload-resolution off
p (*o._M_ptr)->fff(1)
```
Xcode11でのHealthKitのPrivacyPolicy設定 for Apple Watch

いつものように開発で引っかかったところのメモです。

**環境**
- Xcode 11.3 (11C29)
- iOS 13.3
- watchOS 6.1.1

## 今までは

``` objective-c
healthStore_ = [[HKHealthStore alloc] init];
HKQuantityType *type = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate];
HKQuantityType *type2 = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceWalkingRunning];
HKQuantityType *type3 = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierActiveEnergyBurned];

[healthStore_ requestAuthorizationToShareTypes:nil readTypes:[NSSet setWithObjects:type, type2, type3, nil] completion:^(BOOL success, NSError * _Nullable error) {
    
    if (success) {
    NSLog(@"health data request success");
    
    }else{
    NSLog(@"error %@", error);
    }
}];
```

という感じでWorkout Sessionの為のHKHealthStore を準備できたのですが、Xcode11になってから、
- NSHealthShareUsageDescription
- NSHealthUpdateUsageDescription

をinfo.plistに設定していて、かつ、ちゃんとdescriptionを（エンタープライズアプリであろうと）書いてあげないと、watchアプリがクラッシュするようになりました。

watchアプリやってる人少ないんでしょうけど、、、気をつけましょうね。
curl で JSONデータを返すAPI をたたく

前提としてMac を使用しています。

## curl
Mac には最初から入っているはずだが、入っていない場合は以下のサイトからダウンロード方法を確認
https://curl.haxx.se/

## GETでたたく
```
curl [APIのURL]
```

### 返ってくるデータ
JSONで返ってくるんだけど、すごく見にくいデータで返ってくる...

### データを整形して返す方法
jqコマンドを使う。
https://stedolan.github.io/jq/download/

#### インストール方法
```
brew install jq
```

Homebrew が入っていない場合は以下↓のコマンドで Homebrew をインストールしてからにしてください

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

#### jq コマンド 実行方法
```
curl [APIのURL] | jq .
```

## 参考
[curl コマンド 使い方メモ](https://qiita.com/yasuhiroki/items/a569d3371a66e365316f)
[jqコマンドでjsonから必要なデータのみを取得する](https://qiita.com/bunty/items/a769ebabbdd324ff0d6f)
Pythonで2つリストの各要素合計と指定した値を比較する

## はじめに
　2 つのリストがあったときに、その各要素の合計値と指定した値を比較したくなったことってありませんか？
　
　例えば、

　　[-1, 3, 8, 2,  9, 5]
　　[4,  1, 2, 10, 5, 20]

　という2つのリストがあるとします。

　その時、各リストからそれぞれ選んだ 2 つ要素の合計によって特定の値が表現できるかを調べます。

　もし、特定の値が 25 の時、(-1, 4) を選択した場合、合計は 3 なので違います。その場合は (5, 20) のみが正解です。
　
　この問題を解く方法がYouTubeの動画（下記のURL参照）で紹介されていました。今回はその方法をPythonで書きました。

## プログラム
　紹介されていた方法の中から3つの解き方をプログラムしました。
　比較する値は ~~24, 25, 26~~ 23, 24, 25です（2019年12月13日訂正）。

　まずは、全ての要素を足し合わせる方法です。

```python:Brute-force.py
#リスト
A = [-1, 3, 8, 2, 9, 5]
B = [4, 1, 2, 10, 5, 20]

#比較したい値
target = 24

#ブルートフォース
for i in A:
    for j in B:
        if target - 1 <= (i + j) <= target + 1:
            print(str(i) + "と" + str(j) + "はペアです。")
```

　次は、リストの中身を検索してから比較する方法です。

```python:linear.py
#リスト
A = [-1, 3, 8, 2, 9, 5]
B = [4, 1, 2, 10, 5, 20]

#比較したい値
target = 24

#線形選択
for i, v in enumerate(B):
    if target - 1 - v in A:
        index = A.index(target - 1 -v)
        print(str(A[index]) + "と" + str(v) + "はペアです。")
    if target - v in A:
        index = A.index(target - v)
        print(str(A[index]) + "と" + str(v) + "はペアです。")
    if target + 1 - v in A:
        index = A.index(target + 1 - v)
        print(str(A[index]) + "と" + str(v) + "はペアです。")
```

　最後は、マトリックスを作成する方法です。比較する値は 12, 13, 14 です。

```python:Matrix.py

#マトリックス作成
import numpy as np

#要素
A = np.array([7, 4, 1, 10])
B = np.array([4, 5, 8, 7])

#要素を昇順に並び替える
A.sort()
B.sort()

target = 13

#全要素の足し算を表にする
array = np.array([i+j for i in A for j in B]).reshape((len(A), len(B)))

#ターゲットの範囲
column_start = 0            #0
column_end = array.shape[1] #4

#探索
for j in reversed(range(array.shape[0])):
    #上側の範囲
    for i in range(column_start, column_end):  
        if array[i][j] >= target - 1:
            column_start = i
            break
    print(str(A[i]) + "と" + str(B[j]) + "はペアです。")

```

## 学んだこと
　どうすればより少ない計算量で問題を解くことができるのか学びました。

## おわりに
　正直なところ、勉強不足で最後の方法の活用場面は分かりませんでしたが、
　これからもプログラミングの学習を続けていきたいと思います。
　
　ご覧いただきありがとうございました。

## 参考URL
　[5 Problem Solving Tips for Cracking Coding Interview Questions](https://www.youtube.com/watch?v=GBuHSRDGZBY) (YouTubeの動画にリンクしてます)
"Task.Run"でビルドエラー「'System.Threading.Tasks.Task' に 'Run' の定義がありません。」 

いくらググっても出てこない。
誰もそんなことでは悩んでいないらしい。

試行錯誤した結果、
.NET Framework 4.5以上でなければTaskオブジェクトにRunメソッドは無かった。

非同期処理やスレッド処理について解説したページで
Task.Runを使ったサンプルソースがあるけれど、
必須条件までは書かれていなかったなぁ。

というより、
特別な理由がなければVisualStudioのプロパティの初期値を変更しないか。
WSL(Ubuntu 18.04 LTS)でBlawn使ってみた

# はじめに
この記事は、取り敢えずwslでblawnしてみたいけど、github見ても良くわからない人向けです。技量のある人は回れ右。

# 概要
最近、HOTなプログラミング言語「Blawn」をwslで使ってみました。
なんでもスーパー中学生が作ったプログラミング言語らしいです。

# 環境
タイトルの通り、win10のwsl環境です。

- windows 10 pro
- wsl ubuntu 18.04 LTS
   
# 導入
早速wslを起動してBlawn してみよう！

```bash:~/$
# github からダウンロードします
git clone https://github.com/Naotonosato/Blawn

# Linux 用のコンパイラ
./Blawn/sample/Blawn/blawn <input file>

# pathを通す場合
echo export PATH='./Blawn/sample/Blawn:$PATH' >> ~/.bashrc

# bashrcの再読み込み
source ~/.bashrc
```

# 使ってみよう！
例えば下の blawnファイルをコンパイルしてみましょう。

```blawn:hello.blawn
print("Hello Blawn !!")
```
```bash:~/$
# パスを通してない人
./Blawn/sample/Blawn/blawn ./hello.blawn

# パスを通した人
blawn ./hello.blawn
```
Blawnではコンパイルと同時に実行もしてくれます。

```output:出力結果
Hello Blawn !!
```
# まとめ
今回はblawnをwslで使う方法を記しておきました。
最近の中学生はすごいですねぇ。blawnの今後の発展に期待です！
Docker


こちらの記事では1からDockerについて理解するための初学者向けの内容を扱っていきます。

##Dockerとは

DockerとはDocker社が提供する**「コンテナ型仮想化技術」**です。
Dockerは従来の仮想化に比べて別のOSを立ち上げる必要がないため軽い動作を実現できたり、その仮想環境を他の開発者と共有できたりと開発者にとっては欠かせない技術と言えるでしょう。
これらのメリットについて以下で深掘りしていきます。


##コンテナ型仮想化技術

まず仮想化とは、簡単に言うとパソコンの中でパソコン(仮想環境)を立ち上げるということです。
イメージとしては下記の図を参照して下さい。
＜従来の仮想化＞

<img width="491" alt="スクリーンショット 2019-12-13 15.18.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499907/432e727d-4ce7-f09e-75d4-e87ecd43295a.png">

＜コンテナ型仮想化＞

<img width="487" alt="スクリーンショット 2019-12-13 15.18.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499907/0017530d-a7f0-bb88-10b8-a795997f0ae7.png">
###コンテナ型仮想化による動作の軽量化
一つ目の図がコンテナ型仮想化つまりDockerで、二つ目は従来の仮想化の図です。では具体的に何が違うのか。それは、**仮想環境を動かすためのゲストOSの有無**です。ゲストOSを必要とする従来の仮想化とは異なり、Dockerではコンテナと呼ばれるミドルウェアの環境構築がされた実行環境を作成し、その中でアプリケーションを動作させます。ゲストOSを必要としない分、動作が従来よりとても軽くなるのです。

###コンテナ型仮想化による実行環境の共有

ほとんどの場合開発は複数人で行います。プログラムコードの共有には、Gitというバージョン管理の仕組みが使用され、自分の書いたプログラムコードをチームで共有するGithubやBitbucketなどのサービスがあります。しかし、プログラムコードを共有したとしても実行環境が異なれば、コードが正常に動作しません。Dockerはプログラムの実行環境を管理するための仕組みで、それを共有するための仕組みとしてDockerHubなどのサービスがあります。実行環境を共有できるという点はDockerの最大の利点と言えるでしょう。

##イメージとは
・**実行環境を構築するための設計書**みたいなもので、オブジェクト指向でいうとクラスだと認識するのが解りやすいでしょう。
・**Registry（DockerHub）を使って共有が可能**で、既にほとんどの実行環境の構築のための設計書（イメージ）が配布されています。
・以下のコマンドによって、テキストファイル（dockerfile)からイメージを作成することができます。

` $ docker build [Docerfileのパス]`


##コンテナとは
・イメージという設計書から**実際に構築された実行環境**のことをいいます。こちらはオブジェクト指向でいうとインスタンスです。
・**Dockerfile→イメージ→コンテナ**という流れ
・**原則１コンテナ１アプリ**を公式から推奨されています。（データベースを扱うアプリであれば、データベースとアプリのコンテナにそれぞれ分けること）


・起動時のコマンド（EntryPoint）が終わると自動で終了します。

・実行時のコマンドでいろんな設定ができます。
　○環境変数（osが定義している変数）
　○ホスト側に解放するポート　
　○コンテナ同士をつなぐネットワークの設定　　etc

・`$ Docker run` or `$ Docker start `で起動


**実際にコマンドで起動と設定してみる**

```
$ Docker run nginx
```
↑これだけで実際にNginx(webサーバー)のコンテナを起動できます。

Dockerしかインストールしていないにも関わらずこのコマンドだけで恐ろしいほど簡単にWebサーバーが立ち上がってしまう…

`-v`オプションで設定ファイルやHTMLファイルをマウントすればそれだけで思い通りに動かせる

`-p 80:80`（左の80=ホスト側、右の８０＝Docker側を表す）とすれば80番ポートで外部に公開される

##Docker Composeはとても便利
これまでに説明した`build` `run` `start`やその他のコマンドをさらに簡略化できるようになります。

・yamlファイル（設定用に使用されるファイル）一つで複数コンテナを定義することが可能。

・環境変数やポートの設定がyaml形式で書くことが可能。

・ネットワークの設定が自動で楽。

以上の理由から、特別な状況でない限りは使用するのがオススメ。

Docker Compose見本(yamlファイル）↓


```docker

version:"3"
services:
    reserse-proxy:
        image:nginx
        volumes:
            ./config:/etc/nginx/nginx.conf.d #相対パス使用ok
        ports:
             "80:80"
        restart:always#再起動しても自動で起動してくれる

　　web-server:
       image:nginx
       volumes:
               ./docs:/user/share/nginx/html
#二つのコンテナは同じネットワークに繋がる
#しかも"web-server"などで名前解決ができる（＝ipアドレス調べる必要なし）
```

また後々Dockerについて深掘りした記事出したいなと思ってます。
[ AndroidTest ] esspressoを使う

Android StudioにはAndroidアプリをテストするためのフォルダが用意されている。
app→src→AndroidTestとtestフォルダが用意されている。

![スクリーンショット (183).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506451/9ea350f7-c3ce-6d39-9783-91b53fb5de83.png)

・AndroidTest
　UIを使ったテストを行う時に使う。例えばボタンをクリックしてイベントが発生することをテストしたいとき、click()などを使って、UI操作をした時のテストを行える。

・test
　ロジックファイルのテストを行う。

##テスト用ライブラリ
テストをしたい場合、それに必要なライブラリがある。
使用するテスト用のライブラリは次のものです。

>
•**JUnit** 
いわずとしれたJava用のユニットテストライブラリです。
>
•**Mockito** 
テスト時に各クラスをMock可するためのライブラリです。
具体的には通信処理のように、テスト中に本番の動きをされたら困るコンポーネントの動きを差し替えるために使用します。
>
•**Espresso** 
Android用のUIテスト用のライブラリです。
JUnitのテストコードの中で、Activityを起動したり、Viewを操作（クリックやスワイプなど）したり、表示内容を確認する機能があります。


引用https://qiita.com/cattaka/items/83f7a82ce80f352ef7c9

##buildGladleの設定
以下を確認し、ない場合は追記する。
・Runnerが設定されている。

~~~
android {
    defaultConfig {
        //追加
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
}
~~~

・androidTestCompile指定でEspressoライブラリが指定されている

~~~
 dependencies {
    // for AndroidTest
    compile 'com.android.support:support-annotations:21.0.3'
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0'
    androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
}
~~~

参考https://tech.cookbiz.co.jp/android-463

##UIテスト用サンプル
ボタンクリックをテストしたい場合の例は以下のとおりである。

~~~java
public class TitleActivityTest {

    //ここでテストしたいアクティビティのインスタンスを生成。@Ruleアノテーションがないとエラーが発生するので注意が必要。
    @Rule
    public ActivityTestRule<TitleActivity> activityTestRule = new ActivityTestRule<>(TitleActivity.class, false, false);

    //テストしたいメソッド
    @Test
    public void onCreate() {
        //この行でテストしたいアクティビティのonCreate()が呼ばれる
        TitleActivity titleActivity = activityTestRule.launchActivity(null);

        //ボタンのリソースIDを取得し、クリックするコード
        onView(withId(R.id.goButton)).perform(click());

        //その他処理＋期待する結果を記述
    }
}
~~~
2.Salesforce Training(Integration Architecture Designer)


#【前言】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548773/de52dfb7-eccf-2235-fa2c-1b6f97fbfedd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548773/9e985d06-7648-0c02-373b-ee396917569b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548773/3a6ce9f2-0992-6c6f-16c1-3b36640f1d05.png)

#【Training内容】
##0.事前準備
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548773/dedb7a72-bcfe-cd04-bfd5-43aacc905dfa.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548773/cfcaf971-228f-f6ad-cede-ca971db3c00c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548773/b22202d4-6a95-5695-0495-1d4073ecc486.png)

##第 1 次课
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548773/803eab0e-ec37-0e28-b6ff-4d140b046790.png)

##第 2 次课
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548773/e07d358b-ff68-d745-ce8c-8abc546f91a2.png)

##第 3 次课
###【内容1】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548773/d83309ab-f95d-4fe2-20a7-5c2047495d82.png)

###【内容2】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548773/42631070-408a-58f0-c4fa-d47569e3c361.png)

##第 4 次课
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548773/04699d42-e474-6ac3-c55d-dc650ed374aa.png)

##補足資料
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548773/0ad3cb95-0dca-f363-dc10-0dd2db33eb09.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548773/4ac7a610-3e57-24fc-92d3-7609c3c9951d.png)
Error Handling and Rust

> **Error handling in Rust**:

Rust and compilation errors are going hand-in-hand. The compiler of Rust is very strict in their grammar. Although, in the beginning, it feels very troublesome to see compiler complaining about everything, as time passes and your familiarity with Rust increases its becomes your biggest companion and will always help in pinpointing and resolving major parts of the problem.
 
This write-up particularly talks about how to replace unwrap, expect and panic with Result\<_, Err> and handle possible failed scenarios for production code.

> **Unwrap** - _Unwraps a result, yielding the content of an Ok.
               Panics if the value is an Err, with a panic message provided by the Err's value._

```rust
let code_value = self.get_code().unwrap();
```
Let's handle unwrap with a more logical and programmable way.

```rust
let code_value = match self.get_code() {
    Ok(v) => v,
    Err(e) => {
        return Err(Error::invalid(format!(
            "Invalid code: {}",
            e
        )))
    },
};
```

> **Expect** - _Unwraps a result, yielding the content of an Ok.
Panics if the value is an Err, with a panic message including the passed message, and the other 
content of the Err._

```rust
let n = s.trim().parse::<usize>().expect(&format!(
        "Fatal when converting into usize, str = {}",
        s.trim()
    ));
```
Let's handle expect with a more logical and programmable way.

```rust
let n = match s.trim().parse::<usize>() {
    Ok(v) => v,
    Err(s) => {
        error!("Fatal when converting into usize, str = {}", s);
        return Err(());
    },
};
```

> **Panic** - _Panic is more suitable in situations where the program reaches in an unrecoverable state. But, it is not a good idea to decide the program unrecoverable state on behalf of the calling method. Instead, returning
 Result\<\_, Err> value will give the calling method an option to make a decision._

```rust
panic!("Error: missing arguments, len = {}", args.len());
```

Let's return a result to the calling code and handle the panic scenario.

```rust
return Err(std::io::Error::new(
    std::io::ErrorKind::Other,
    format!("Error: missing arguments, len = {}", args.len()),
));
```
Chromeの｢自動テストソフトソフトウェアによって制御されています｣を消す

自動テストを実行する際に表示される｢自動テストソフトソフトウェアによって制御されています｣を消す方法をあちこちのページを跨いで解決したのでまとめました。
webdriver_managerを使った場合の消し方になります。

# 環境
Windows10 Pro 64bit
Python3.7
Selenium
webdriver_manager


# やること
・オプションを定義する
・そのオプションを使ってWebdriverを立ち上げる
　...簡単。

```sample.py
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("excludeSwitches", ['enable-automation'])
driver = webdriver.Chrome(ChromeDriverManager().install(), options=chrome_options)
```
['enable-automation']を['disable-automation']にすると、また｢自動テストソフトソフトウェアによって制御されています｣が表示されます。

追記
「デベロッパーモードの拡張機能を無効〜」とアラートがでるようになったのでそれも消したい。
オプションに「'load-extension']」を追加すると消えるようなので追加。
最終的にはこうなりました。

```sample2.py
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("excludeSwitches", ['enable-automation', 'load-extension'])
driver = webdriver.Chrome(ChromeDriverManager().install(), options=chrome_options)
```

# 参考ページ
http://serverless.hateblo.jp/entry/2018/10/26/101428
https://help.applitools.com/hc/en-us/articles/360007189411--Chrome-is-being-controlled-by-automated-test-software-notification
https://github.com/SergeyPirogov/webdriver_manager
分散SQLエンジン(マルチデータベース・アクセスツール)の調査

エッジコンピューティングによって高性能化したエッジ機器にデータが格納されるようになると、クラウドサービスにデータを集めないでエッジ機器のデータを直接検索したいとニーズが生まれてきました。そして、IoT(Internet of Things) システムでは広域に分散されたエッジ機器のデータ群を高速に検索するために、マルチデータベースにアクセスできる分散SQLエンジンが求められています。そこで代表的な分散SQLエンジンの Presto, Apache Drill, Dremio, PGSpider を調査して比較しました。

性能評価は、うちのメンバーがFOSDEM PGDay 2020で発表しています。
https://www.postgresql.eu/events/fosdem2020/sessions/session/2893/slides/281/FOSDEM2020PGDay_PGSpider.pdf

# 調査項目
時系列データベースの調査項目は以下の通りです。

|調査項目&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|調査内容|
|-----|--------|
|対応プログラム言語|アプリケーションからデータベースを操作可能なプログラム言語|
|アクセス可能なDB|マルチDBアクセスツールからアクセス可能なデータベース|
|クエリ言語|データベースに対する問い合わせ言語。主にSQLの調査|
|マルチテナント|マルチテナント機能の有無|
|インデックス|使用可能なインデックスの種類及び特徴|
|トランザクション|トランザクションの特性。ACID特性など。|
|ストアドプロシジャ|ストアドプロシージャ/ファンクションの有無、記述言語|
|dockerコンテナ|dockerコンテナイメージが提供されているかどうか|
|性能拡張|スケールアウトを中心にどのように性能拡張するのかを調査。主にシャーディング機能の調査。|
|高可用性|障害発生時に継続動作するためのメカニズムについて調査。主にレプリケーション機能の調査。|
|運用|運用時に必要なバックアップや監視ツールについて調査|
|通信暗号化|DBサーバとクライアント間の通信暗号化機能の有無|
|DB格納領域の暗号化|DBファイルなどの格納領域の暗号化機能の有無|
|認証機能|ユーザーを識別するような認証機能の有無|
|権限管理|DBオブジェクトに対する権限付与する機能の有無|
|DB監査|操作の履歴である監査証跡（ログ）機能の有無|

# 調査結果比較

以下は、調査結果を比較した表です。

|調査項目&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|Presto|Apache Drill|Dremio|Dremio (製品版)|PGSpider|
|-----|:------:|:------:|:------:|:------:|:------:|
|対応プログラム言語|△|〇|△|△|〇|
|アクセス可能なDB|△|△|〇|〇|◎|
|クエリ言語|〇|〇|〇|〇|〇|
|マルチテナント|Ｘ|Ｘ|Ｘ|〇|〇|
|インデックス|Ｘ|△|Ｘ|Ｘ|Ｘ|
|トランザクション|Ｘ|Ｘ|Ｘ|Ｘ|△|
|ストアドプロシジャ|Ｘ|△|Ｘ|Ｘ|〇|
|dockerコンテナ|〇|〇|〇|〇|△|
|性能拡張|〇|〇|〇|〇|◎|
|高可用性|Ｘ|Ｘ|〇|〇|〇|
|運用|Ｘ|Ｘ|〇|〇|〇|
|通信暗号化|〇|〇|Ｘ|〇|〇|
|DB格納領域の暗号化|Ｘ|Ｘ|Ｘ|Ｘ|〇|
|認証機能|〇|〇|Ｘ|△|◎|
|権限管理|〇|〇|〇|〇|〇|
|DB監査|〇|〇|Ｘ|Ｘ|〇|

詳細の調査結果は以下に掲載しています。
- [Prestoの調査](https://qiita.com/kanegoon/items/284db70ec61c78af47da)
- [Apache Drillの調査](https://qiita.com/kanegoon/items/da09e4ece44c5ea94838)
- [Dremioの調査](https://qiita.com/kanegoon/items/c98bea30aae9388abfc8)
- [PGSpiderの調査](https://qiita.com/kanegoon/items/d0c344de8b62559bb493)

# まとめ

IoTデータのビッグデータ検索で分散型SQLクエリエンジンを使用することを考えると、マルチテナント機能は外せません。また実運用を考えると高可用性、運用、セキュリティを考慮する必要があります。この条件では、Dremio(製品版)と PGSpider という2択になります。Presto は、高可用性、運用面を自前で対応すれば、選択肢に挙がってきます。現時点では、あえて Apache Drill を選択する理由はないと考えます。<br>

掲載内容は、(株)東芝 デジタルイノベーションテクノロジーセンター及びソフトウェア技術センターの見解です。コメント等は広くご意見を頂ければ幸いです。<br>
また、記述について誤りがあったり、気になることがあれば、編集リクエストやコメントでフィードバックしていただけると助かります。
MaterializeのChipsでつまづいた

<h1>はじめに</h1>
ポートフォリオ作成中に使い慣れたbootstrapからmaterializeに挑戦中なのですがjqueryのプラグインの導入の際につまづいたので備忘録として残します。

<h1>やりたいこと</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512759/beec31eb-3555-8215-8f42-421c3ef3882a.png)
エンターキーを押したら画像のようにタグを出現させたい

<h1>つまづきポイント</h1>
公式のリファレンスにはscriptを書いてクラス名にchipsとつけるくらいしか書かれていない。見様見真似でやってみると中々フォームが出てきてくれませんでした。

つまづいていた時のコードがこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512759/bd7e8ccf-d6ff-7bf0-169c-ee543adaf843.png)

chipsの中でformに書きたかったのでformをchipsで囲んでいました。
jqueryの読み込む順番からscriptの書き方など見直していましたが思い通り動きませんでした。

<h1>解決法</h1>
公式ページでchipsの動きを見ているとchipsの中でchipが生成されており、タグを打つたびにchipができていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512759/12698674-596a-4f22-7b64-00e3f1934bd6.png)
余計なものを入れるなってことですかね。これで動きました。

地道に検証モードで見ていくとエラーが分解されていきました。
Azure Key Vault を利用した .env 内の機密情報の管理

# .env と機密情報
Laravel を利用したプロジェクトは通常 `.env` を使って環境変数を管理しています。`.env` には各種認証情報などを含めることもあると思いますが、それらは Git などのバージョン管理システムに平文で保存するべきではありません。
かと言って、どこにも管理されておらず稼動している環境に置いてあるだけの状態というのも心許無さがあります。

そこで [Azure Key Vault](https://docs.microsoft.com/azure/key-vault/basic-concepts) (和名:キー コンテナー)の[シークレット](https://docs.microsoft.com/azure/key-vault/about-keys-secrets-and-certificates#key-vault-secrets)と、Go で書いた簡素な [vaultenv](https://github.com/sensyn-robotics/vaultenv) というツールで、 `.env` に直接機密情報を記述することなく管理できるようにしました。以下では Azure VM を利用していることを前提に、例を紹介します。

## Azure Key Vault の準備

* まずは Key Vault を作成します。(ここでは Azure CLI を使った例で説明します)

```shell
az keyvault create --location japaneast --name <YourKeyVaultName> --resource-group <YourResourceGroupName>
```

* 開発者のグループやユーザーに`セット`(set)と`一覧取得`(list)の権限を付与します。格納されているデータは取得できないようにします。

```shell
az keyvault set-policy --resource-group <YourResourceGroupName> --name <YourKeyVaultName> --secret-permissions set list --object-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
```

* シークレットを復元したいデプロイ用途などの VM に対して、`取得`の権限を付与します。

```shell
az vm identity assign --name <NameOfYourVirtualMachine> --resource-group <YourResourceGroupName>
{
  "systemAssignedIdentity": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "userAssignedIdentities": {}
}
```
```shell
az keyvault set-policy --name <YourKeyVaultName> --object-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx --secret-permissions get
```

## Key Vault へ機密情報の格納

* 機密情報を Key Vault のシークレットに保存します。

```shell
$ az keyvault secret set --vault-name <YourKeyVaultName> -n example-password --value "naisho"
{
  "attributes": {
    "created": "2019-12-13T03:41:15+00:00",
    "enabled": true,
    "expires": null,
    "notBefore": null,
    "recoveryLevel": "Purgeable",
    "updated": "2019-12-13T03:41:15+00:00"
  },
  "contentType": null,
  "id": "https://<YourKeyVaultName>.vault.azure.net/secrets/example-password/97a8cfac350c4b67b1f3510b1598cdce",
  "kid": null,
  "managed": null,
  "tags": {
    "file-encoding": "utf-8"
  },
  "value": "naisho"
}
```

* 登録時に出力された id を `{{ kv < id > }}` の形式で任意のテキストファイルに埋め込みます。example-password 以下(`/97a8c...`) も含めるとバージョンを固定することができます。含めない場合は最新の値を取得します。

```text:.env.template
USER=user1
PASSWORD={{ kv "https://<YourKeyVaultName>.vault.azure.net/secrets/example-password" }}
```

## .env への展開
* シークレットの取得を許可した VM 上で行います。上記のファイルを [vaultenv](https://github.com/sensyn-robotics/vaultenv) を通すことにより `{{ kv < id > }}` で記述された部分が Key Vault に保存したデータに置換されます。実際にはデプロイ時に自動実行されるスクリプト内で行っています。

```shell
$ go get github.com/sensyn-robotics/vaultenv
$ vaultenv < .env.template > .env
$ cat .env
USER=user1
PASSWORD=naisho
```

## まとめ
Key Vault のアクセスポリシーを設定するすることにより、開発者自身のアカウントでは保存されたデータを参照せずに、登録のみが行えるようにすることができます。さらに、データの取得権限を特定の VM に限定することで、(VM に対するアクセスコントロールを適切に行えていれば)機密情報が漏洩してしまうリスクを低減できます。

## 参考リンク
* https://laravel.com/docs/6.x/configuration#environment-configuration
* https://docs.microsoft.com/azure/key-vault/tutorial-net-linux-virtual-machine
* https://github.com/sensyn-robotics/vaultenv
僕のshutil(Python)

自分用のまとめ
随時更新

**自分がわかればいいからところどころ用語が間違ってるかも**

！見方

```python
#コマンド
    #引数のオプションの説明
```

##pyautoguiって何に使うの？

これもos.path同様ディレクトリ操作




###モジュール読み込み

```python
import shutil
```
##頻出操作

```python
#フォルダのコピー
shutil.copytree()
    #第一引数のフォルダを中身ごと第二引数のパスにコピー
    #第二引数のフォルダは存在するとコピーできない。

#フォルダの削除、中身のあるなしは関係ない。
shutil.rmtree()
   #引数のフォルダを削除。 
```
VSCode で Flutterのビルド構成を切り替える

FlutterでProdiction環境、Debug環境、Staginｇ環境を切り替えて開発する事があると思いますが、ターミナルで

```
flutter run -t /lib/main/debug.dart
``` 
と打って切り替えるのも面倒だし、保存したタイミングでHotReload走らないし、flavorつけ忘れもあるし....とめんどくさいのでVSCodeの設定で切り替えれるように設定しました。
AndroidStadioはポチポチするだけで設定できますが、VScodeは`launch.json`に設定を書き足さないとできないです。
`flutter run`　のデフォルトのエントリーポイントは`lib/main.daｒｔ`なのでエントリーポイントとなるファイルを指定します。
下記に設定例を置いておきます
プロジェクトルートに.vscodeディレクトリを用意し、`lib/main`の中にエントリーポイントとなるファイルを置けば下記の設定をコピペするだけで使えます。

```json:launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "release",
      "request": "launch",
      "type": "dart",
      "args": [
        "-t",
        "./lib/main/release.dart"
      ]
    },
    {
      "name": "debug",
      "request": "launch",
      "type": "dart",
      "args": [
        "-t",
        "./lib/main/debug.dart"
      ]
    },
    {
      "name": "localhost",
      "request": "launch",
      "type": "dart",
      "args": [
        "-t",
        "./lib/main/localhost.dart"
      ]
    },
    {
      "name": "demo_widget",
      "request": "launch",
      "type": "dart",
      "args": [
        "-t",
        "./test/widget_test.dart"
      ]
    }
  ]
}

```

argsに書いているエントリーポイントはプロジェクト構成に合わせて書いてください。

Androidの場合、`android/app/build.gradle`の`signingConfigs`に
iOSの場合は、`Production > Scheme`の`Configration`に
設定を追加するとリリース版、デバッグ版の2つをインストールしておくことも可能です
今日の日付をJavaScriptで表示させる方法


今日の日付は、JavaScriptで以下の通りに書きます。

```
      const today = new Date();
      const todayHtml = today.getFullYear() + '/' + (today.getMonth() + 1) + '/' + today.getDate();

      document.write('<p class="date">' + todayHtml + '</p>');
```


HTMLとJavaScript全体のコードは以下の通りです。


```
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>TODAY</title>

  <!--Bootstrap CDN ここから--＞
  <!-- Latest compiled and minified CSS -->
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"
    integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">

  <!-- Optional theme -->
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap-theme.min.css"
    integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous">
  <!--Bootstrap CDN ここまで-->
  <link rel="stylesheet" href="styles.css">
</head>

<body>
  <header>
    <h1>TODAY</h1>
  </header>

  <div class="container">
    <script>
      const today = new Date();
      const todayHtml = today.getFullYear() + '/' + (today.getMonth() + 1) + '/' + today.getDate();

      document.write('<p class="date">' + todayHtml + '</p>');
    </script>
</body>

</html>
```

【プログラマー未経験者の方へ】
ドットインストールが難しくて萎えている方や、模写コーディングが出来なくて悩んでいる方はUdemyがめっちゃおすすめです。
僕はプログラマー未経験者ですが、以下の記事の講座で模写コーディング、さらには自分でコーディングできるまでになりました。
https://greenberet.net/mosya-coding-udemy/
僕はコーディングできるまでかなり苦しみ、何度も挫折しかけましたが、Udemyに助けられました。
参考にしていただければ幸いです。
document.writeの使い方


```
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>TODAY</title>

  <!--Bootstrap CDN ここから--＞
  <!-- Latest compiled and minified CSS -->
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"
    integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">

  <!-- Optional theme -->
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap-theme.min.css"
    integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous">
  <!--Bootstrap CDN ここまで-->
  <link rel="stylesheet" href="styles.css">
</head>

<body>
  <header>
    <h1>TODAY</h1>
  </header>

  <div class="container">
    <script>

      document.write('<p class="date">20xx/1/1</p>');
    </script>

  </div>
</body>
</html>
```

###('');　についての説明

documentは「オブジェクト」 writeは「メソッド」 ('')はパラメータと呼ぶ。
日本語風に言うと、「画面上(オブジェクト）に（　）（パラメータ）を書く（メソッド）という意味になる。


###const today = new Date();　を使う理由
変数とは設計図を箱の中に入れる作業。

今回の場合、設計図＝new Date(); 箱=const today
となる。


【プログラマー未経験者の方へ】
ドットインストールが難しくて萎えている方や、模写コーディングが出来なくて悩んでいる方はUdemyがめっちゃおすすめです。
僕はプログラマー未経験者ですが、以下の記事の講座で模写コーディング、さらには自分でコーディングできるまでになりました。
https://greenberet.net/mosya-coding-udemy/
僕はコーディングできるまでかなり苦しみ、何度も挫折しかけましたが、Udemyに助けられました。
参考にしていただければ幸いです。
最高のワーキングスペース、“テルマー湯“を知っているか

## はじめに
Leverages Advent Calendar 14日目
担当の@masa94です。

突然ですが、「[テルマー湯](http://thermae-yu.jp/)」って知ってますか？
テルマー湯とは、身体の疲れも取れつつ、作業に集中できる最高のワーキングスペースです。

## どんな人向けの記事なの？
- 都内で作業できる場所探している人
- 作業したいけど、身体が疲れて気持ちが乗らない人
- <strike>温泉好きな人</strike> いつもと違う環境で作業したい人

## 作業場所の条件って？
みなさん、作業場所の条件って何を求めますか？
### 絶対欲しい
- 電源あり
- Wifiあり
- 静かさ

### あったら嬉しいな
- 寝ても大丈夫（治安的な意味も）
- 長居できる
- コスパのよさ
- リラックススペースがある
- 心も体もリフレッシュできる

人によって変わりそうですが、僕はこんな感じで分けてみました。
実際にワーキングスペースを探すときは、だいたい必要条件が揃ったところに行ってます。
でも、たまには「あったら嬉しいな」もほしい…と思う方いませんか？
そんなあなたに、**テルマー湯**です。

## テルマー湯って？
詳しくはテルマー湯の公式サイトをご覧になっていただきたいのですが、簡単に説明すると、ご飯を食べたり、テレビを見たり、寝たりすることができる温泉施設です。（これだけ聞くと結構ありそう）
場所は、新宿駅から徒歩10分です。（新宿3丁目からは2分とか）
それと、24時間やってます。
ちなみに、電源あり、Wifiあり、静かはちゃんとあります。

気になった方はこちらをご覧ください↓
http://thermae-yu.jp/

## テルマー湯の何がそんなにいいの？
何がいいか、3つくらいに絞ると

1. 超集中できる！
2. 寝れる！
3. やっぱり温泉（サウナ）！

### 超集中できる
一人用のマッサージチェアチックな席が大量にあり、それぞれに電源とライトがついています。（一応テレビも）
頭の横にテレビ用のスピーカーがついており、そのおかげで横の人は見えないようになっています。
そのため、横の人が気にならずに自分の作業に集中することができます。
カフェやコワーキングだとたまに横の人が近くて気になったりするので、僕としてはとても嬉しいです。

### 寝れる
もちろん上で説明した席で寝ることも可能です。
大抵の人はテレビを見たり寝てたりするので、寝ることに対する抵抗は全くありません。
作業して疲れたなと思ったら仮眠をとってまた作業する、ができるとさらに効率アップができそうですね。

### やっぱり温泉（サウナ）
結局ここです。
リフレッシュできるのが一番の強み。
その施設にいる間は何回温泉やサウナに入ってもいいので、温泉=>作業=>温泉のように温泉に始まり温泉で締めることも可能です。

## おわりに
今回は少し変化球ですが、僕が最近であった最高のワーキングスペースを紹介しました。
普通のワーキングスペースよりも値段が高くなってしまうのですが、身体もリフレッシュしつつ作業も進めたい方にはすごくオススメです。

それではいい
温泉
ワーキングライフを。

http://thermae-yu.jp/
Git for Windowsで認証情報を保存しない方法

Git for Windowsでは認証情報を自動的に保存してくれるが、共有PCでは認証情報の保存をして欲しくないので保存しない方法のメモ

## 設定方法1
gitconfigのcredential.helperから設定。
注意点としてはgitconfigはsystem>global>localの順に参照される。
たぶんデフォルトのままインストールした場合はsystemでcredential.helper = managerとなっているのでこれを削除。

```
git config --system -e
```

編集モードに入って

```
[credential]
helper = manager
```

この欄を削除して保存。なお、systemの編集は管理者権限が必要なので注意。

## 設定方法2
Gitインストール時にGit Credential Managerのチェックを外しておく。
インストール後であればGit Credential Managerをアンインストール。

## おまけ
### すでに保存済みの認証情報の削除
コントロールパネル>すべてのコントロール パネル項目>資格情報マネージャー
Windows資格情報から削除できる。
FileMaker　インポート時の自動入力に関する小技　

FileMakerにExcelなどのリストをインポートする時の小技です。
やや ~~暴力的~~ 強引な内容を含みますので、大らかな気持ちでどうぞ。

#対象者
FileMaker入門者
非エンジニア
FileMakerにデータをインポートしたことがある人

#こんな時に使う
#####インポート元の値はそのまま、その他の値は自動入力したいときに。

- インポートするフィールドは自動入力オプションを無効にしたい。
- インポートしないフィールドは自動入力オプションを有効にしたい。
- **フィールドが多くて自動入力オプションを個別に有効・無効設定するのが面倒**


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316038/27b6df25-4587-75d5-90b8-c4cae50a87e7.png)
インポート時間よりとにかく手間を減らしたいあなたに。


#やりかた
###まずはレコードを新規追加でインポート。
この時、インポート時のフィールド値の自動入力オプションをオン。
※デフォルトで有効になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316038/94f55f56-ac7f-887c-1bd4-b427b8ae8bd3.png)
自動入力オプションがたくさんあるとインポートに時間がかかるので、明らかに不要なオプションは外します。**よくわからない時は全部自動入力しちゃいましょう。**

####インポート結果をチェック
インポートされたレコードを確認してみると、補償プランが空欄になっていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316038/5ab5d6c5-20a6-b551-4d21-53e79cf9d8f6.png)
ルックアップ元のマスタに存在しない値が入っていたりすると、こうなります。
インポート元のリストを精査したり、マスタに追加するのも方法ですが、今回はリストの値をそのままインポートしちゃいます。

###既存レコードをインポートで置換
さきほどインポートしたリストをまったく同じフィールド順でインポートします。
ただし次の部分を変更。

- インポートの種類を「置換」にする
- 自動入力オプションを無効にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316038/c7d7f68e-4529-7085-d7ff-c177f4a99a59.png)

####インポート結果をチェック
インポートされたレコードを確認してみると、インポート元と同じ値が入っていますね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316038/d2dc47f2-a603-42f0-c6c5-59fbd6efe441.png)


#終わりに
わりと強引な方法なので、他の方法も検討しましょう。

- 元のリストを精査してからインポートする
- マスタなどに足りない部分を追加してからインポートする
- 自動入力オプションの有無を個別に設定してインポートする


#宣伝
Discord の「FileMaker Casual」サーバーで気軽に FileMaker 開発者と交流しませんか？
@Hi_Noguchi さんが立ち上げた FileMaker 中心の情報共有チャットです。

どなたでも参加できて、気軽に質問できる空間です。是非ご参加ください。
招待リンク=> https://discord.gg/g2gp6Ez
二重中括弧 {{  }} 内でできること ❏Vue.js❏

開発環境はJSFiddleで！
https://qiita.com/ITmanbow/items/9ae48d37aa5b847f1b3b

#① data内のプロパティを直接書き込んで表示させることができる

```html:html
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<div id="app">
  <p>{{ message }}</p>
</div>
```

```javascript:javascript
new Vue({
  el: "#app",
  data: {
    message: "hello world!"
  }
})
```

【出力結果】
`hello world!`

<br>
#② javascript式を書くことができる

```html:html
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<div id="app">
  <p>{{ message }}</p>
  <p>{{ number + 5 }}</p>
</div>
```

```javascript:javascript
new Vue({
  el: "#app",
  data: {
    message: "hello world!"
    number: 3
  }
})
```

【出力結果】
`hello world!`
`8`

<br>
#③ 三項演算子を書くことができる

```html:html
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<div id="app">
  <p>{{ message }}</p>
  <p>{{ number + 5 }}</p>
  <p>{{ ok ? "YES" : "NO" }}</p>
</div>
```

```javascript:javascript
new Vue({
  el: "#app",
  data: {
    message: "hello world!"
    number: 3
    ok: true
  }
})
```

【出力結果】
`hello world!`
`8`
`YES`

<br>
#④ メソッドを書くことができる

```html:html
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<div id="app">
  <p>{{ message }}</p>
  <p>{{ number + 5 }}</p>
  <p>{{ ok ? "YES" : "NO" }}</p>
  <p>{{ sayHi() }}</p>
</div>
```

```javascript:javascript
new Vue({
  el: "#app",
  data: {
    message: "hello world!"
    number: 3
    ok: true
  },
  methods: {
    sayHi: function() {
      return "Hi";
    }
  }
})
```

【出力結果】
`hello world!`
`8`
`YES`
`Hi`

<br>
ではまた！
クラウド監視サービス　その2

前回，[こちら](https://qiita.com/moyuta/items/eee98dda6d0d035c833d)でCloud Watchについて説明しました．
監視サービスはまだまだあるので今回はそちらも紹介．

#Config
awsリソースの構成管理と変更の監査を行うマネージドサービス．
ちょー簡単に言うと，
企業のガバナンス(コンプラ)に準拠しているかどうか評価してます．

awsリソース構成
👇
セキュリティ監査
👇
ルールに対して準拠/非準拠を設定


##Trusted Advisor
管理者の強い味方になってくれます．
「本当に今のインフラ環境最適か?」
って言う不安を取り除いてくれます．

![trusted.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543591/44b263a4-2c2b-6a67-ed3c-7a6e0293e8a9.png)

こんな感じで
コスト，パフォーマンス，セキュリティ，フォールトトレランス，サービス制限
で問題のありそうなところを❗️で教えてくれます．

フォールトトレランスは，対障害性です．

これ見れば対処すべきところがすぐ分かる．


#Cloud Formation
プロビジョニング(サービス)を自動化してくれます．
具体的に言うと，
インフラをコード化して自動でデプロイできるようにする．
人件コスト削減に繋がるよ！

テンプレを作っちゃえば，JSONで,
"ここにはこれを入れて!!"
と自動デプロイ時に渡すことも出来ます．

例） commit : "hogehoge.pyの30行目を直した"
なんてことも可能．


#Elastic Beanstalk
アプリのコードをアップするだけで面倒なプラットフォーム管理がいらなくなる．
言語によってスタックを選択すれば出来ます
どの言語がどのスタックかは書いてあるので分かるはず．

バージョン管理もしてくれるので，前デプロイした時に戻ることも簡単

#Ops Works
Chef/Puppetを使ってサーバーの構成管理を自動化するマネージドサービスです．
chefとpuppetは
サーバーの構成をコードによって，自動化するフレームワークです．

EC2インスタンスにログイン -> サーバー設定
をすることなくサーバー構成可能
テンプレとしてサーバー構成の使い回しが可能になります．
僕のNumpy(Python)

自分用のまとめ
随時更新
自分が使った、調べたコマンドを記載
**自分がわかればいいからところどころ用語が間違ってるかも**

！見方

```python
#コマンド
    #引数のオプションの説明
```




###モジュール読み込み

```python
import numpy as np
```



##頻出操作

```python
#numpyの配列を作る。
array = np.array()

#配列を変形する
array.reshape([行:列])
　　　　#引数の行と列のどちらかを-1にするともう一方の引数から自動計算してくれる

```
配列なんて「listでいいべ」と思うかもしれないが、numpy.array()の方が、いろいろな操作ができて、なおかつ、listよりもfor文を回す時に遥かに速いらしい。
Dockerコマンド

# Dockerイメージ系コマンド

## docker images
説明：作成されたイメージの一覧を表示する。docker image list、docker image lsも同じ。

例：

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker_php          step2               0778349bf1db        About an hour ago   480MB
```
## docker build [OPTIONS] PATH
説明：PATHにあるDockerfileを元にイメージを新規作成する。

[OPTIONS]
-f : Dockerfileの名前を指定。例えば、Dockerfile.test、 Dockerfile.prodと用意して、使用するファイルを-fで指定できる。
-t : *イメージ名*:*タグ*の形式で名前とタグを指定。タグは省略可。省略した場合は、latestがセットされる。

例：　ここではカレントディレクトリ（.）をPATHに指定している

```
$ docker build -t docker_rails:step2 -f Docker.prod .
```

# Dockerコンテナ系コマンド

## docker run [OPTION] IMAGE [COMMAND] [ARGS...]
説明：　IMAGEを元に新しくコンテナを作成する。COMMANDが指定されている場合は、作成されたコンテナ内で実行される。実行の度に毎回新しいコンテナが作られることに注意。作られたコンテナを再利用するには、docker start（停止しているコンテナを稼働）やdocker attach（稼働中のコンテナに接続）を使用する。これとは別にコンテナ作成のみを行うdocker createもある。

IMAGE : docker imagesで表示されるREPOSITORY:TAGでイメージを指定する。例：sample:latest

[OPTION]
--name *container-name* : 新しく作成されるコンテナの名前*container-name*で指定できる。
--publish *host*:*container* : ホスト側・コンテナ側に開けるポートを指定。8001:8002の場合、ホスト側で開けた8001番をコンテナ側の8002番につなげる。-pは--publishの短縮形。
-it : -i(= --interactive)で標準入力を受け付けるようにし、-t(= --tty)でターミナルを開く。

例1:

```
$ docker run sample:latest
```

結果：sample:latestのイメージを元にコンテナが新規作成される

例2

```
$ docker run --name samplecontainer -p 8001:8002 -it sample:latest
```

結果：samplecontainerという名前でコンテナを作成し、ホスト側8001番->コンテナ側8002番につなげる形でポートを空け、コンテナのターミナルを利用できるようにする

## docker ps [OPTION]
説明：　稼働しているコンテナの一覧を表示する。

[OPTION]
-a : 停止したコンテナも併せて一覧に表示する。

例

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES
549ca6764138        docker_php:step2    "docker-php-entrypoi…"   2 hours ago         Up 2 hours          0.0.0.0:8000->8000/tcp, 9000/tcp   step2
```
Aurora PostgreSQL に既存DBのダンプをリストアしたらちょっとハマったので対処法メモ

オンプレミスの PostgreSQL でダンプを取って、Aurora PostgreSQL にカジュアルにダンプ＆リストアしようとしたら失敗した。

# ALTER ROLE が失敗した
まずユーザ情報を持ってこうと思ったら `ALTER ROLE` が失敗した。

```shell-session
$ pg_dumpall --globals-only -U postgres | ssh bastion-ec2 psql -U postgres
You are now connected to database "postgres".
SET
SET
SET
CREATE ROLE
ERROR:  must be superuser to alter superusers
```

## 原因
原因は pg_dumpall で吐かれたSQLに `NOSUPERUSER` が含まれてたせいだった。

```sql
CREATE ROLE user1;
ALTER ROLE user1 WITH NOSUPERUSER INHERIT NOCREATEROLE NOCREATEDB LOGINPASSWORD 'xxx';
```

RDS や Aurora 環境ではマスターユーザといえども SUPERUSER 権限を持つことが出来ないので `ALETR ROLE`では `SUPERUSER` はもちろん `NOSUPERUSER` も指定が出来ない。

## 対応
とりあえず問題のSQLを以下のように `NOSUPERUSER` をとっぱらう修正をしてやれば通る。

```sql
CREATE ROLE user1;
ALTER ROLE user1 WITH INHERIT NOCREATEROLE NOCREATEDB LOGINPASSWORD 'xxx';
```

最初のワンライナーでいうと以下のように修正してやったらキレイに通った。

```shell-session
$ pg_dumpall --globals-only -U postgres | perl -pe's/^(ALTER ROLE.*) (?:NO)?SUPERUSER (.*)/$1 $2/' | ssh bastion-ec2 psql -U postgres
You are now connected to database "postgres".
SET
SET
SET
CREATE ROLE
```



# CREATE DATABASE が失敗した
次にスキーマをリストアしてみる。案の定ここでもエラーが出る。

```shell-session
$ pg_dumpall --schema-only -U postgres | ssh bastion-ec2 psql -U postgres
:
ERROR:  must be member of role "user1"
```

## 原因
どうやら以下のSQLで失敗したようだ。

```sql
postgres=> CREATE DATABASE user1 WITH TEMPLATE = template0 OWNER = user1;
ERROR:  must be member of role "user1"
```

これは「接続中のユーザ(=postgres) が user1 のロールの権限を持ってないから user1 としてデータベースを作れません」ということのようだ。
自分でセットアップした PostgreSQL とかでは postgres が SUPERUSER 権原を持っていることが多いから忘れがちだが、Aurora環境ではマスターユーザ(=postgres)が SUPERUSER 権原を持っていないのでこういう事が起こる。

## 対応
user1 ロールの権限を持ってないのが原因なのでつけてやれば良い。

```sql
-- 複数ある場合は全部のロールのメンバーになっておけば良い
GRANT user1 TO postgres;
GRANT user2 TO postgres;
-- 複数ある場合はカンマ区切りでまとめて実行もできる
GRANT user1,user2,user3,user4 TO postgres;
```

ちなみに元の方のDBで先に明示的にこれを実行しておけば `pg_dumpall` で CREATE ROLE / ALTER ROLE したあとに GRANT も吐いてくれるので何度も dump & restore をするようであれば元の方でやって置くほうが楽だと思う。


# Aurora 側で pg_dumpall する時にも注意点
素直に `pg_dumpall` を実行するとロールのダンプのところで爆死する。

```shell-session
$ pg_dumpall -h dbhost -U postgres
--
-- PostgreSQL database cluster dump
--

SET default_transaction_read_only = off;

SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;

pg_dumpall: 問い合わせが失敗しました: ERROR:  permission denied for relation pg_authid
pg_dumpall: 問い合わせ: SELECT oid, rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolconnlimit, rolpassword, rolvaliduntil, rolreplication, rolbypassrls, pg_catalog.shobj_description(oid, 'pg_authid') as rolcomment, rolname = current_user AS is_current_user FROM pg_authid WHERE rolname !~ '^pg_' ORDER BY 2
```

## 対応
これは SUPERUSER を権限持ってないのに他のロールのパスワード見ようとしたから怒られてるので以下のように `--no-role-password` オプションを付けてやれば解決する。

```bash
pg_dumpall -h dbhost -U postgres --no-role-password
```
僕のwin32gui(Python)

自分用のまとめ
随時更新

**自分がわかればいいからところどころ用語が間違ってるかも**

！見方

```python
#コマンド
    #引数のオプションの説明
```

#win32guiって何に使うの？
ウィンドウ取得の時によく使うかなぁ

---



###モジュール読み込み

```python
import win32gui
```



##頻出操作
```python
#ウィンドウタイトルでウィンドウハンドルを取得
win32gui.FindWindow()
    #第一引数はクラス名、なければNone
    #第二引数はタイトル名

#最前面のウィンドウのウィンドウハンドルを取得
win32gui.GetForegroundWindow()

#ウィンドウの位置を取得
rect = win32gui.GetWindowRect()
    #引数ウィンドウハンドル
  #返り値は
  #rect[0]画面左上x座標
  #rect[1]画面左上y座標
  #rect[2]画面右下x座標
  #rect[3]画面右下y座標
```
正規表現

記事書くのはこれが二つ目になりますが、前の記事書いてて思ったのは分かりやすい記事が沢山あるのに、それを有効活用できてないって事なんですよね。
わざわざ他の記事にあるのと同じ内容を写すのって時間の無駄だと感じたので今回からはどんどん他の記事引用して自分なりのまとめ方をしていこうと思います。

##regex

前置きはこのくらいにして今回扱うテーマは『regex』。これは「Regular Expression」の略語で、"正規表現"という意味です。
Javascriptでは関数として扱われている理由から「Regexp」とも略されるみたいですね。

##正規表現とは何なのか
では正規表現とは何なのか。一言で表すと「いくつかの文字列を一つの形式で表現するための表現方法」です。この表現方法を利用すれば、たくさんの文章の中から容易に見つけたい文字列を検索することができるため、非常に便利なのです。

##メタ文字（特殊文字）
正規表現は「一つの形式で表現するため」に、以下のようないくつかのある文字に対して特別な意味を与えています。

`.   ^   $   [   ]   *   +   ?   |   (   )`

これらはメタ文字と呼ばれ、これらを用いた正規表現によって文字列を検索できるようになります。

それぞれのメタ文字がどのように正規表現として検索されるかは以下のサイトで詳しく書いてあリます
↓
https://www.mnet.ne.jp/~nakama/







今回は正規表現に関する初歩的な知識についてまとめただけなので以降で詳しくまとめていきたいと考えています。
【Python】PDFの文章をページ毎にCSVに変換（2/24追記）

参考：[PDFMinerでPDFから日本語テキストを抽出する](https://qiita.com/korkewriya/items/72de38fc506ab37b4f2d)

ほぼほぼこちらの方法です。
なにも面白いことはしてないです。


#つかうもの
PDFMinerというライブラリ。
pipで一発です。

`pip install pdfminer.six`

参考サイトでは日本語が～とありましたが、pipで入れてもちゃんと日本語検出されました。

#つくるCSV
・「更新日時」カラムにCSV作成日データが入っている
・「文章」カラムにPDFのテキストデータが入っている
・「ページ番号」カラムにPDFのページ番号が入っている

#できたもの
9割参考サイトのソースです。

```python
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO

import csv,re,datetime
import pandas as pd

class converter(object):
  def pdf_to_csv(self,p_d_f):
    df = pd.DataFrame(columns=["更新日時","文章","ページ番号"])
  
    #ここからPDFのテキスト抽出
    cnt = 1
    space = re.compile("[ 　]+")
    fp = open(p_d_f, 'rb')
        
    for page in PDFPage.get_pages(fp):
      #逐次初期化 
      rsrcmgr = PDFResourceManager()
      outfp = StringIO()
      codec = 'utf-8'
      laparams = LAParams()
      laparams.detect_vertical = True
      device = TextConverter(rsrcmgr, outfp, codec=codec, laparams=laparams)
      interpreter = PDFPageInterpreter(rsrcmgr, device)
            
      interpreter.process_page(page)
      text = re.sub(space, "", outfp.getvalue())

      df.loc[cnt,["文章","ページ番号"]] = [text,cnt]
      cnt += 1
            
    outfp.close()
    fp.close()
    device.close()
         
    now = datetime.datetime.now()
    df["更新日時"] = now

    csv_path = p_d_f.replace('.pdf', '.csv')
    df.to_csv(csv_path, encoding='CP932', index=False)

if __name__ == "__main__":
       
  p_d_f = "なんちゃか.pdf"
  con=converter()
  hoge=con.pdf_to_csv(p_d_f)

```

参考サイトと異なる点は、PDFから抽出したテキストデータを格納する箱（outfp）をデータフレームに入れた矢先に初期化しているというところです。
そのままだと全ページのテキストデータがどんどん追加されていくので。
データフレームに入れてしまえばこちらのものなので、細かいカラム追加などはさくっとできるかと。

検索しても一発でcsv変換が引っかからなかったのは簡単だからという理由もあるかもですが、メモ書きに。

#2/24追記
[なぜか続いた](https://qiita.com/wagahaiCAT/items/f6439635111d1bebe001)
僕のpyperclip(Python)

自分用のまとめ
随時更新
**自分がわかればいいからところどころ用語が間違ってるかも**

！見方

```python
#コマンド
    #引数のオプションの説明
```

##モジュール読み込み

```python
import pyperclip as clip
```

##pyperclip頻出操作

```python
#クリップボードにコピー
clip.copy()
    #引数にコピーする文字

#貼り付け
clip.paste()
    #張り付ける文字。引数指定しなかったら、クリップボードのもんがコピーされんじゃないか？知らんけど。
```
個人メモ: ランダムな何かを生成する Ruby ワンライナー

個人的に必要になるけど、よく忘れるのでメモ

#### 13桁のランダムな数字 (ただし、先頭は常に `1`)

```ruby
ruby -e "puts('1' + (1..12).map { ('0'..'9').to_a.sample }.join)"
```

#### 20 バイトのランダムなバイト列 (hexadecimal 形式)

```ruby
ruby -r securerandom -e 'puts SecureRandom.hex(20)'
```
Ubuntuにインストールしたyarnが実行できない

# Ubuntuにインストールしたyarnが実行できない
Ubuntu 16.04に最新のyarnをインストールした際、yarnコマンドを実行すると以下のようなエラーが発生しました。

```
$ yarn -v
/usr/share/yarn/lib/cli.js:46099
  let {
      ^

SyntaxError: Unexpected token {
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:374:25)
    at Object.Module._extensions..js (module.js:417:10)
    at Module.load (module.js:344:32)
    at Function.Module._load (module.js:301:12)
    at Module.require (module.js:354:17)
    at require (internal/module.js:12:17)
    at Object.<anonymous> (/usr/share/yarn/bin/yarn.js:24:13)
    at Module._compile (module.js:410:26)
    at Object.Module._extensions..js (module.js:417:10)

```

yarnと関係ありそうなものとして、Nodejsがあるので、Nodejsのバージョンを確認します。

```
$ nodejs -v
v4.2.6
```
そういえば、レポジトリを更新しない状態で`apt install nodejs`をすると、古いバージョンがインストールされるようだった気がします。

yarnの公式HPを確認すると、Nodeのバージョンが`4.8.0`以上となっていました。
いつの間に!
[Yarn公式HP](https://yarnpkg.com/lang/ja/)

なので、今回はバージョン10系のnodejsがインストールできるように、レポジトリを追加します。
そして、インストール済みのnodejsを削除して、新しいnodejsをインストールします。
コマンドは以下の様になります。

*最新のバージョンをインストールしたい場合は、curlコマンドのurl部分を変更してください。
例) バージョン12系をインストールしたい 
    -> `curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -`

```
$ curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
$ sudo apt remove nodejs
$ sudo apt install nodejs
```

これで、yarnコマンドが実行できれば、解決です。

```
$ yarn -v
1.21.1
```

お疲れさまでした。