OmniAICreator/Qiita-1.07M huggingface dataset:
4つの4で1から10の数値を求める。

# ルール

4つの4を使って、答えが1から10までの数になる数式を作る。
ただし演算子は足し算、引き算、掛け算、割り算、数と数の結合（※）のみOK。
（※ 例えば4と4を横に並べて44と見なすこと）

# （自分の）考え方

[a, b, c, d]からxを作る。
=> [e, f, g]からxを作る。（eは[a, b, c, d]の2要素を加工した値、f,gは残りの2要素）
=> [h, i]からxを作る。（hは[e, f, g]の2要素を加工した値、iは残りの1要素）

終わり

# 実装

## ソース
```javascript
function 計算式を求める(計算式の配列, 答えの値, _再帰呼び出しか) {

    const 再帰呼び出しか = _再帰呼び出しか === undefined ? false : _再帰呼び出しか;

    for (let i = 0; i < 計算式の配列.length - 1; i++) {
        for (let j = i + 1; j < 計算式の配列.length; j++) {
            const 計算式1 = 計算式の配列[i];
            const 計算式2 = 計算式の配列[j];
            const 残りの計算式の配列 = (function() {
                const 計算式の配列_クローン = 計算式の配列.concat();
                計算式の配列_クローン.splice(j, 1);
                計算式の配列_クローン.splice(i, 1);
                return 計算式の配列_クローン;
            })();

            const 演算子達 = [足し算, 引き算, 引き算_交換, 掛け算, 割り算, 割り算_交換, 数字結合, 数字結合_交換];
            for (let k = 0; k < 演算子達.length; k++) {
                const 演算子 = 演算子達[k];
                const 計算式の一部分 = 演算子(計算式1, 計算式2);
                let 計算結果;
                try {
                    計算結果 = eval(計算式の一部分);
                }
                catch (e) {
                    continue;
                }

                // 無限、NaNは無視する。
                if (isFinite(計算結果) === false) continue; 

                if (計算式の配列.length === 2) {
                    if (計算結果 === 答えの値) {
                        return 再帰呼び出しか ? 計算式の一部分 : 邪魔な括弧を消す(計算式の一部分);
                    }
                }
                else {
                    const 新たな計算式の配列 = 残りの計算式の配列.concat(計算式の一部分);
                    const 計算式 = 計算式を求める(新たな計算式の配列, 答えの値, true);
                    if (計算式 !== null) {
                        return 再帰呼び出しか ? 計算式 : 邪魔な括弧を消す(計算式);
                    }
                }
            }
        }
    }

    return null;
}

// ※ IE11でも動かしたいのでアロー演算子は使用していません。
function 足し算(a, b) {return "(" + a + "+" + b + ")";}
function 引き算(a, b) {return "(" + a + "-" + b + ")";}
function 引き算_交換(a, b) {return "(" + b + "-" + a + ")";}
function 掛け算(a, b) {return "(" + a + "*" + b + ")";}
function 割り算(a, b) {return "(" + a + "/" + b + ")";}
function 割り算_交換(a, b) {return "(" + b + "/" + a + ")";}
function 数字結合(a, b) {return String(a) + String(b);}
function 数字結合_交換(a, b) {return String(b) + String(a);}

function 邪魔な括弧を消す(計算式) {
    if (計算式 === null) return null;
    if (計算式[0] === "(" && 計算式[計算式.length - 1] === ")") {
        return 計算式.slice(1).slice(0, -1);
    }
    return 計算式;
}
```

## 実践

```javascript
console.log("4つの4");
for (let num = 1; num <= 10; num++) {
    console.log(num + ": " + 計算式を求める([4, 4, 4, 4], num));
}

console.log("おまけ");
console.log("10: " + 計算式を求める([1, 1, 5, 8], 10));
console.log("100: " + 計算式を求める([1, 2, 3, 4, 5, 6, 7, 8, 9], 100));
console.log("810: " + 計算式を求める([1, 1, 4, 5, 1, 4], 810));
```

## 出力

```
4つの4
1: (4+4)/(4+4)
2: (4*4)/(4+4)
3: (4+(4+4))/4
4: 4+(4*(4-4))
5: (4+(4*4))/4
6: 4+((4+4)/4)
7: (4+4)-(4/4)
8: (4+4)+(4-4)
9: (4+4)+(4/4)
10: (44-4)/4
おまけ
10: 8/(1-(1/5))
100: (9+(1+2))-((5+6)*((3+4)-(7+8)))
810: 5*((4*41)-(1+1))
```
OK

# チラ裏

今回のプログラムはただ単に目的の答えを求めるだけのプログラムなのでいろいろとゴミです。
頭のいい人は速くするためにメモ化したり、可読性をあげるために素敵な命名をしてください。
【UiPath】Advent of UiPath 2020 #4（画像をbase64デコードしてOCRで画像認識）

この記事は、UiPath Forum で行われている [**Advent of UiPath 2020**](https://forum.uipath.com/t/advent-of-uipath-2020/273299) の [Advent Challenge #4](https://forum.uipath.com/t/advent-challenge-4/274656) の紹介記事です。

:christmas_tree: 過去の投稿

- [Advent of UiPath 2020 #1（APIからデータを取得）](https://qiita.com/miya_g/items/4021ba90aab84984cb3c)
- [Advent of UiPath 2020 #2（正規表現で文字列を抽出）](https://qiita.com/miya_g/items/087a9d5d29145ae3e33e)
- [Advent of UiPath 2020 #3（ファイルをダウンロードしてメール送信）](https://qiita.com/miya_g/items/b774ef61150330ba0ee0)

# “Advent of UiPath 2020” とは何か？

- 英語版のフォーラムで投稿されています。
- RPA challenge です（＝お題を出て、みんなでRPA化してみる）
- 誰でも回答できます（フォーラムのアカウントがあれば）
- 3日おきに出題され、計8回（xmasイブまで）あります
- 回答して上位に選ばれれば、フォーラム上でスターがもらえます。
- フォーラムのスタッフが開催しているっぽいです。

# チャレンジ4：画像をbase64デコードしてOCRで画像認識

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/704d594c-6c3a-6113-c9c8-ce1416363dfd.png)

サンタはまたあなたの助けを必要としています！ 
コペンハーゲンを離れた後、サンタは多くの都市の多くの子供たちを訪ね、ローマで少し休憩することに決めました。ここで、サンタは彼の親友と会っています。サンタは、クリスマスシーズンの後で休暇を過ごしたい2つの場所を親友に見せたいと思っています。しかし、サンタのコンピューターはウイルスに感染し、画像は暗号化されて完全に読めなくなりました。サンタが休暇の目的地が分かるように、画像をデコードし中に書いてある場所の座標を取得する必要があります。

### 初心者用チャレンジ

画像をデコードしてください。デコード用のライブラリを用意しました。
画像から座標の情報を取得し、コンソールに出力してください。

### 上級者向けチャレンジ

画像をVBまたはC#でデコードしてください。OCRで画像に書かれた場所を認識し、GoogleMAPで検索して座標を取得し、こコンソールに出力してください。

# 感想

今回は「画像デコード＆OCRで画像認識」というお題でした。

実業務で画像のデコードをすることは少ないと思います。（フォームアクティビティで画像を表示したいとかで使う位）
OCRで画像認識は稀にあります。
認識の精度を試しながら、エンジンを決めていきますが、画像の文字が何か（数字？英語？日本語？）次第ではあります。

回答の内容の差はあまりなかったです。面白い回答は、下記でした。

■ ハットリ君が登場
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/304c13ab-9a2f-aae8-1179-f09c233d57c4.png)

■ ヨーダがメッセージボックスで回答してくれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/3b390b4f-c7b3-d041-34f6-a600c6de063a.png)
Android Studio ショートカット(1)

参考：https://developer.android.com/studio/intro/keyboard-shortcuts

よく使われるもの：

1.全てのファイルの中から検索：
preferences---->keymap--->find in path
control+command+F

2.コードの整列
option+command+L

3.コードの修正
option+enter

4.ドキュメントの表示
control+J

5.パラメーター提示
command+P
セキュリティソフトのせいで、Vue-CLIのインストールに苦戦した～「Vue.js初心者に解説してみた」ウラ話


[フューチャーAdventCalendar2020](https://qiita.com/advent-calendar/2020/future) 13日目です。
昨日は、Shin Kurita(@montblanc18 )さんによる、[GoでGoogleSpreadsheet出力する](https://qiita.com/montblanc18/items/687bd4bc79ea2f9718a1)でした。
# はじめに
今年はFuture技術ブログに２記事書かせていただいています。
[数字で振り返るフューチャー技術ブログ（2020）](https://future-architect.github.io/articles/20201127/)でも記載がある通り、[Vue.jsのslotの機能を初心者にわかるように解説してみた](https://future-architect.github.io/articles/20200428/) は、1.1万PVとなかなかの数、閲覧いただいております。ありがたいことです。

この記事を書くために、私物のMacBook Air(2018)にVue-CLIをインストールしたのですが、びっくりするほど苦戦しました。
原因はセキュリティソフトだったのですが、備忘のために、対応を残しておこうと~~おもいつつ、忘れていたので、~~アドカレ用に温めておいたので、ここで書いておきます。

# Vue.CLIをインストールする

[Vue.js を vue-cli を使ってシンプルにはじめてみる](https://qiita.com/567000/items/dde495d6a8ad1c25fa43)を参考に、インストールしていきます。すたこらとインストールし、プロジェクトを起動します。

![スクリーンショット 2020-12-13 0.05.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322052/6ec312a0-9884-37f5-3985-08dc4322c738.png)
（[Vue.js を vue-cli を使ってシンプルにはじめてみる](https://qiita.com/567000/items/dde495d6a8ad1c25fa43)より）


`http://localhost:8080` にアクセスしたところ、サンプルが表示されませんでした。

![err.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322052/8d373e6b-70dd-0a01-d73c-670b148267f5.png)
（このページは動作していません　localhostからデータが送信されませんでした。 ERR_EMPTY_RESPONSE）

こちらは私のMacBook Airに入れていたESETというセキュリティソフトが、8080ポートをブロックしていたようです。（インストールに苦戦したというタイトルをつけましたが、インストール自体はうまくいっていたのが本当は正しいです。）

# 起動するポート番号を変える

セキュリティソフトの設定を変えてもいいのですが、起動する開発サーバーのポート番号を変えることで対処してみます。
※例えば会社でセキュリティソフトの設定が変えられない場合などはこちらで対応することになるかと思います。
[Vue-CLIの公式ドキュメント](https://cli.vuejs.org/config/#vue-config-js)によると、`vue.config.js`ファイルを用意すると、設定を読みこむようなので、ファイルを用意して、port番号を指定してあげます。

```javascript:vue.config.js
module.exports = {
devServer : {
        port: 8888,
    },
};
```
`npm run serve`コマンドで、再度立ち上げてみると、無事`localhost:8888`にVue-CLIのサンプルプロジェクトが立ち上がることが確認できました。
![スクリーンショット 2020-12-13 0.46.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322052/6eb77288-1a2d-1a35-40d1-4987e2d78a2d.png)

![スクリーンショット 2020-12-13 0.51.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322052/4ca31359-71ea-bc72-d551-77ab0753d98e.png)


# 終わりに

これで無事に環境も整いました。

環境構築って何かしらうまくいかないことが多い経験をしている気がするのですが、気のせいでしょうか。
環境構築の挫折が、特に初心者が学習する意欲を失う原因No.1なんじゃないかと勝手に思っています。
詰まったところが解消したら、ちゃんと知見に残すのが大切ですね。

Vue.js初心者な皆さんは、[Vue.jsのslotの機能を初心者にわかるように解説してみた](https://future-architect.github.io/articles/20200428/) も読んでもらえたら嬉しいです。
MySQL ユーザを作成して権限を設定・削除する

# 目的

- MySQLのユーザを作成して権限を設定する方法をまとめる

# 目的

- MySQLのユーザ一覧を表示する方法をまとめる

# 前提条件

- MySQLのrootユーザの認証パスワードがわかること。(MySQLのrootユーザのパスワードを失念してしまった方はこちら→[Mac ローカル環境の MySQL 8.x のrootパスワードを忘れた時のリセット方法](https://qiita.com/miriwo/items/1880e9d2ebcfd3c0e60d))

# 前提情報

- 筆者はMacに立てたMySQLで本記事の内容を検証している。（rootユーザのパスワード入力を求められたら入力しEnterを押下する。）
- 下記SQLを実行してMySQLのユーザ（ユーザ名: test パスワード: test0000）を予め作成した。

    ```sql
    create user test@localhost identified by 'test0000';
    ```

# 詳細

1. 下記コマンドを実行してターミナルからMySQLにログインする。（rootユーザのパスワード入力を求められたら入力しEnterを押下する。）

    ```terminal
    $ mysql -u root -p
    ```
1. 下記SQLを実行してtestユーザの権限を確認する。（testユーザは作成直後であり、権限系の設定は何も行っていない。）

    ```sql
    show grants for test@localhost;
    ```
1. 下記のように表示された。これはグローバルの設定でなんの権限も無いことを表している。ログインする事ができるだけ。これだとtestユーザでログイン後に`show database;`すら実行権限がない。

    ```
    +------------------------------------------+
    | Grants for test@localhost                |
    +------------------------------------------+
    | GRANT USAGE ON *.* TO `test`@`localhost` |
    +------------------------------------------+
    ```

### すべての権限を付与

- 下記SQLを実行して権限を付与する。

    ```sql
    grant all on *.* to test@localhost;
    ```

### データベースの作成、テーブルの作成を行うことのできる権限の付与

- 下記SQLを実行して権限を付与する。

    ```sql
    grant create on *.* to test@localhost;
    ```

### 指定データベース内だけテーブルの作成を行うことのできる権限の付与

- 下記SQLを実行して権限を付与する。

    ```sql
    grant create on データベース名.* to test@localhost;
    ```

### 指定データベース内だけselect句を実行することのできる権限の付与

- 下記SQLを実行して権限を付与する。

    ```sql
    grant select on データベース名.* to test@localhost;
    ```

### 権限を削除

- 下記SQLを実行して権限を削除する。

    ```sql
    revoke 権限内容 from ユーザ名@ホスト；
    ```
- たとえはlocalhostのtestユーザが持っている`create on *.*`の権限を削除したいときは下記SQLを実行する。

    ```sql
    revoke create on *.* from test@localhost；
    ```

# その他

1. 更に詳しい権限の設定は参考文献先に記載されている。

# 参考文献

- [https://www.dbonline.jp/mysql/user/index6.html](https://www.dbonline.jp/mysql/user/index6.html)
- [https://www.dbonline.jp/mysql/user/index8.html](https://www.dbonline.jp/mysql/user/index8.html)
【Workato】Workbot for MS TeamsのPick listの使い方

#MS Teams Workbotのpick listの使い方
Teams Workbotに対して取引先名を入力すると、Salesforceにその取引先情報を登録すると同時に、法人番号APIを叩いて法人番号を取得してくるレシピを作ってました。
ヒットした法人が複数あった場合、ユーザがリストから選べるようにしたかったため、「Pick list」を使いました。

こんな感じの見た目になります。
![スクリーンショット 2020-12-13 0.28.34（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/947273/a59ccb88-9349-d3b3-c60f-9b7334f16c10.png)

リストをクリックすると、このように法人名と所在が表示されるようになっています。

![スクリーンショット 2020-12-13 0.32.16（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/947273/5d81034d-3135-a155-14b5-220198fd141c.png)

法人を選択したあと、下の`この法人を選択する`ボタンを押すことでその法人名と法人番号でSalesforceに登録しにいきます。
Teamsから取引先を登録できる上、これが名寄せになるため取引先が重複することがなくなります。

![スクリーンショット 2020-12-13 0.28.56（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/947273/a7d970ce-a1bd-431a-8616-fae42b7b7e66.png)

#レシピ上の実装
裏の動きとしては、ユーザがpick listで選択した法人の法人番号が「corporate_number」パラメータ（引数）として次のレシピに渡されるようになっています。
言葉の説明だとわかりにくいので実際のレシピの画像を貼っておきます。（小さくてすみません）

![スクリーンショット 2020-12-13 0.45.08（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/947273/94b3165a-958c-b12c-6c29-b72b65dea2b8.png)

`Picklist style`：「Compact」を選択するとドロップダウン形式で表示されます。
`Choice parameter`：ボタンを押したときに呼ばれるレシピに、picklistで選択されたvalueを入れておくパラメータの名前です。つまり画像の例では選択された法人の法人番号（ChoicesのValueフィールド）が「corporate_number」として渡されます。
`Choices`：選択肢の項目。「Title」は選択肢として表示させるテキスト。「Value」はそれぞれの選択肢が選択されたときに、次のレシピに渡したい値。

先述の通り、「corporate_number」に法人番号が入って次のレシピが呼ばれるので、その呼ばれるレシピではcorporate_numberをParametersとして作っておく必要があります。
ボタンを押したときに呼ばれるレシピ👇
![スクリーンショット 2020-12-13 0.57.56（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/947273/f0f5b994-8ec2-a317-8afe-2f43fe801924.png)
「go言語でつくるインタプリタ」のためのdocker環境構築

（常識かもしれないのですが）「go言語でつくるインタプリタ」を現在読んでいてローカル環境との衝突がだるかったので、docker環境を構築しました。コンテナの中でテストしたり、インタラクティブモードを走らせられます。

一応Github Repo: https://github.com/greenteabiscuit/go-interpreter

`monkey`フォルダが置いてあるところ（srcフォルダ直下）に`Dockerfile`と`docker-compose.yml`を配置します。

ファイル配置の全体像：

```
go-interpreter/ch01/src git:(master) ls
Dockerfile         docker-compose.yml monkey
```


`Dockerfile`:

```
# ベースとなるDockerイメージ指定
FROM golang:latest
# コンテナ内に作業ディレクトリを作成
# RUN mkdir /go/src
# コンテナログイン時のディレクトリ指定
WORKDIR /go/src
# ホストのファイルをコンテナの作業ディレクトリに移行
ADD . /go/src
```

`docker-compose.yml`:

```
version: '3' # composeファイルのバーション指定
services:
  app: # service名
    build: . # ビルドに使用するDockerfileがあるディレクトリ指定
    tty: true # コンテナの起動永続化
    volumes:
      - .:/go/src # マウントディレクトリ指定
    environment:
      - "GOPATH=/go"
```


実際のビルド手順:

```
$ cd go-interpreter/ch01/src
$ docker-compose up build
$ docker-compose up
```

テストする場合：

```
(In another directory)
$ docker exec -it containername /bin/bash
(Inside docker container)
/go/src# echo $GOPATH
/go

/go/src/monkey# go test ./lexer/
ok  	monkey/lexer	0.006s
```

REPL:

```
go run main.go
Hello root! This is the Monkey programming language
Feel free to type in commands
>> let add = fn(x,y) {x+y};
{Type:LET Literal:let}
{Type:IDENT Literal:add}
{Type:= Literal:=}
{Type:FUNCTION Literal:fn}
{Type:( Literal:(}
{Type:IDENT Literal:x}
{Type:, Literal:,}
{Type:IDENT Literal:y}
{Type:) Literal:)}
{Type:{ Literal:{}
{Type:IDENT Literal:x}
{Type:+ Literal:+}
{Type:IDENT Literal:y}
{Type:} Literal:}}
{Type:; Literal:;}
```


参考：

> [DockerでGoの開発環境を構築する](https://qiita.com/uji_/items/8c9eda89526abe0ba900)
> [Docker for MacでGoの実行環境を作る](https://qiita.com/masakurapa/items/fa867451053e41b69126)
【C#】varについて改めて調査してみる

# 最初に

どうも、ろっさむです。
今回は下手したら使いどころを誤りそうな `var`について、今後の自分のためにも改めて調査し、まとめていこうと思います。

# varとは

みんな大好き「型推論」を行う際に使用するキーワードが**`var`**です。これはC#3.0から追加された機能です。

コンパイラから見て、**初期化値から変数の型がわかる場合**には`var`を用いて、**コンパイル時にコンパイラに型を推測させる**ことができます。このようなローカル変数を**「暗黙的型指定ローカル変数」**といいます。

```c#
// int型
var iNum = 1;

// float型
var fNum = 2.5;

// string型
var str = "hoge";

// Dictionary<string, List<int>>型
var myList = new Dictionary<string, List<int>>();
```

ListやDictionary等のような初期化で二回書くのが面倒臭い冗長なコードに対して、`var`は効果を発揮します。

そんな便利な`var`ですが使いどころを誤ると可読性が損なわれかねません。

# varが使えない箇所

- プロパティ
- グローバル変数
- nullでの初期化を行う変数の宣言（ただしnull許容参照型を有効にして使用することはできる…）
- 初期化式を使用する変数（例：`var i = (i = 10)`）

# varの適材適所

`var`キーワードはMicrosoftではコンストラクタ内で使用することを推奨しています。これは単にコンストラクタ内で初期化を行うのが一般的だからでしょう。

- 右辺の型が明確な時

```c#

// これはOK
var myList = new Dictionary<string, List<int>>(); 

// これはGetMyListが何の型を返してくるのかぱっと見でわからない
var myList2 = GetMyList();
```

上記の、メソッドからの返り値を格納するためのローカル変数にvarを使うのはMicrosoftのコーディング規約ではNGとなっています。ただ、チームで使用しているIDEが決まっている（例えばVisual Studio, Riderなど）場合は、そのIDEがvar変数の型を適宜表示してくれる機能があるので、優先すべきはチームでのコーディング規約かと思います。

- foreachなどのループ用変数の型を指定

```C#
var IDs = new List<int>();

foreach (var id in IDs)
{
    // なにかしらの処理
}
```


- クエリ式を使用する時

```C#
string[] colors = { "red", "blue", "green", "white", "black" };
var wordQuery = from word in colors
	where word[0] == 'w'
	select word;
```

# new 式

こちらはC#9.0以降の新しい機能となります。
詳しくはまた別の記事でまとめて紹介しようと思いますが、さらっと解説します。

`var`は左辺の型を暗黙的に推論するために使用するキーワードでしたが、この「new式」は右辺に対して働きます。式の中の変数の型がわかっている場合には**、初期化用の型の方を省略する**ことができます。


```c#
List<int> ids = new();
```


# 参考

- [var (C# リファレンス)](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/var)
- [new 演算子 (C# リファレンス)](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/new-operator)
xreaでssh接続

古に登録したxreaのサーバーを久しぶりに触った。
FTPでアップロードは嫌だなあと思い、まずはSSH接続してみたので、その過程のメモ。

# コンパネからssh接続を許可
まずxreaのコンパネにログインし、ssh接続を許可する。

1. サイト設定
2. ツール/セキュリティ
3. SSH接続IP許可セクションの「SSH接続IP許可」
4. 「SSH接続のIPを許可する」

なお、これをせずにsshコマンドをすると`ssh_exchange_identification: read: Connection reset by peer`と怒られる。


# sshコマンドで接続してみる
```bash

$ssh ユーザー名@sXXX.xrea.com
```
とするとパスワードを求められるので、

xreaのコンパネの
1. サイト設定
2. FTP設定
3. パスワード

からパスワードをコピペしてEnterすると、接続される。
`cd public_html` で見慣れたディレクトリが並んでるかんじに。

# ssh接続を鍵認証に変更
毎回パスワード入力するのも面倒なので、鍵認証にする。

### ローカルの公開鍵をコピペしておく
```bash
$cat ~/.ssh/id_rsa.pub
# id_rsa.pubの中身をコピー
```


### リモートにauthorized_keysを作成して、ローカルの公開鍵をペースト
```bash

$ssh ユーザー名@sXXX.xrea.com
#パスワード入力

$cd virtual/ユーザー名/

$mkdir .ssh


$cd .ssh

$touch authorized_keys

$vi authorized_keys
# ローカルのid_rsa.pubの中身をコピペ
```

### ローカルでssh configを書いておく
```bash

Host hogehoge
  User ユーザー名
  HostName sXXX.xrea.com
  Port 22
  IdentityFile ~/.ssh/id_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes
```

# Done
```bash
ssh hogehoge
```

で接続できればOK


# メモ
ついでにgithubにpushしたらデプロイｓ
https://qiita.com/nakm/items/f3e0bc98c78dc014c632
Caddy2でPHPを動かしたい

環境
Win10 AMD64

構成

```
C:/
    tool/
        caddy/
            caddy.exe
    exapmle/
        Caddyfile
		php.ini
    ver/
        a.html
		index.php
	php/
		....
		php-cgi.exe
		php.exe
```

## 各種インストール
### Caddy2
前回書いた [Caddyの使い方メモ](https://qiita.com/mafumafuultu/items/2bc159a5cf9cc30df9d8)を参照

[php_fastcgi](https://caddyserver.com/docs/caddyfile/directives/php_fastcgi)に設定するアドレスは `php-cgi`の`-b`オプションに設定するアドレス

```:Caddyfile
http://localhost {
	root * C:/ver/
	php_fastcgi http://localhost:2020
}
```

### PHP8
[PHP8 ダウンロード](https://windows.php.net/download#php-8.0)
今回使うのはPHP8のNon Thread Safe版を使う。
zipの中身を`C:/php/`に展開し`PATH`に`C:/php`を追加

```powershell:PHPのパスが通った事を確認
php -v
```

```:パスが通っていればこんな感じ
PHP 8.0.0 (cli) (built: Nov 24 2020 22:02:58) ( NTS Visual C++ 2019 x64 )
Copyright (c) The PHP Group
Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies
```

```powershell:php.iniを設置
cp C:/php/php.ini-production C:/exapmle/php.ini
```

古より受け継がれし伝統`phpinfo()`を用意しておく

```php:/ver/index.php
<?php phpinfo(); ?>
```

## 起動

ターミナルを2つ立ち上げる

```powershell:fastcgiを立ち上げ
cd C:/example
php-cgi -b localhost:2020
```

```powershell:Caddyサーバ立ち上げ
cd C:/example
caddy run
```

`http://localhost` にアクセスし、`phpinfo()`が実行されたことを確認する。
pythonでjsonの保存

[Python, Requestsの使い方 \| note\.nkmk\.me](https://note.nkmk.me/python-requests-usage/)
[天気予報 API（livedoor 天気互換）](https://weather.tsukumijima.net/)

```py:weather_request.py
import requests
import json

def main():
    url = "https://weather.tsukumijima.net/api/forecast/city/130010"
    res = requests.get(url)
    json_text = json.dumps(res.json())
    with open("f.txt", "w", encoding="utf-8") as f:
        f.write(json_text)
    json_obj = json.loads(json_text)  # ロード
    print(json_obj)
    # {'publicTime': '2020-12-12T17:00:00+09:00', 'publicTime_format': '2020/12/12 17:00:00', 'title': '東京都 東京 の天気', '

if __name__ == '__main__':
    main()
```
Blazorを始めるなら？

今でしょう！この内容は [Blazor Advent Calendar 2020](https://qiita.com/advent-calendar/2020/blazor)の13日目の記事です

#自分のBlazorの履歴
僕はBlaozrの開発を大体2018年の12月ぐらいから始めています。大体2年ぐらいBlazorを使っていることになります。Blazorを始めた当初よく言われていたことは、確かに凄そう、だけどテクノロジーとしては定着しなそう。僕自身も正直将来でもBlazorが使えるかと言うと、かなり厳しいと思っていました。にも拘わらずその当時ASP.NET MVCで作っていたサービスをほぼゼロからフルスクラッチで書き換えることにしました。この理由はただ一つで自分にとっての至高言語であるC#を使ってクライアントサイドを書きたかったからです。

#Blazorは使い始めた時からちゃんとC#で書ける
Blazorは開発当初からC#でクライアントが書けます。個人的にはかなり直感的に使えると思いました。razorファイルの中で変数を宣言すればhtmlのタグの中に@でその変数を書けます。

```cs
@code {
    private int Count { get; set; } = 1;
}
```

```html
Blazor構文
<div>@Count</div>
↓
実際にレンダリングされるhtml
<div>1</div>
```
@の中ではif文もfor文も使えます。これだけで僕にとっては使う価値がありと判断しました。この仕組みは2年前から全く変わっていません。

#バージョンアップ毎に色々あった
ただ、最も重要なC#で書けるという大枠は変わってないですが、ライブラリの記述ルールやメソッドの名前、ファイル名の拡張子など細かいルールは色々変わっています。例えば以前はBlazorの中でcsを書くためのキーワードは@codeではなくて、@functionsでした。僕が使っていた2年前は、そもそもexperimentalと銘打っていたので当たり前の話ではあるんですが、バージョンアップするとほぼ書きかえないと動かなくなっていました。分かっていてやっている分には許せても、この段階で人に勧めるのはちょっと難しいと思います。

#IDEの開発環境もバグが多かった
また、Visual StudioもBlazorで開発していくにはバグが色々ありました。特に2年前はrazorファイル（当時はまだcshtmlファイル）の編集が酷くて、色は碌に変わらないし、インデントはちょっとしたことですぐ崩れました。極めつけはVSの機能でリネームしただけなのに、ファイルの中身がめちゃくちゃになったこともありました。Gitの履歴を確認したら編集出来ない状態も長く続いていてこれは地味にストレスでした。

#ライブラリも足りていなかった
この状態だと当然ですがライブラリも充実していません。誰かが作った便利ライブラリが少ないのはもちろん、公式のBlazorにも足りない機能はありました。特に当初認証回りが全く対応していませんでした。僕はその部分は自作しています。やるならほぼ自分で作らないといけないのもハードルしては高いと思います。

#正式版の発表
2020年の5月にBlazorは正式版になりました。バージョンアップは苦労していたのですぐにはせずに8月ぐらいに完全に新規で作りなおしました。それまでのコードは全て刷新されて無駄と思えていたようなコードはこの時点で全てなくなりました。開発環境も全く問題ないレベルになっていました。razorファイルの中でブレークポイントがバッチリ使えるようなったのも大きいと思います。さらに最近[.NET Conf 2020](https://www.dotnetconf.net/agenda)がありましたがスケジュールを見たらBlazorのセッションが10個以上ありました。これはマイクロソフトとしても本気で推してきていることが見て取れます。

#というわけでまとめ
バージョンアップから何か月かさわっていますが、フレームワークとしての完成度という点において全く問題なくなっていると感じます。IDEの開発環境としても使いやすいし、長く問題だったバグも直っていたし、これからはもうバージョンアップしても殆ど書き換える必要もないと思います。開発するのに必要なものも揃ってきているし、今後は導入実績もどんどん増えていくと思います。そろそろ使えるフレームワークとして人に勧めても良い時期が来たと思います。なにより僕自身が全作り直しを覚悟して選んだフレームワークなのでこの状況を一番喜んでいます！

Blazorを始めるなら？今でしょ！
Hyper-VプロバイダのVagrant実行時の権限問題対処（荒療治）

DドライブなどのOSがインストールされていないドライブでvagrnt upする場合に発生する問題の対処です。

# 普通にvagrant up --provider=hypervしてみる

```
vagrant up
Bringing machine 'default' up with 'hyperv' provider...
==> default: Verifying Hyper-V is enabled...
==> default: Verifying Hyper-V is accessible...
Hyper-V access check has failed for the configured destination. This
is usually caused by running on a non-system drive which is missing
required permissions. Running the following command may resolve the
problem:

  icacls.exe d:\XXXX /T /Q /grant "NT AUTHORITY\SYSTEM:(IO)(CI)(F)"
```

ちなみに提示されたコマンドを実行しても解決しない。（というかハングした。）
WSL環境から実施するとコマンド自体は動いた気がする。

# 対処
似たような問題に対処しているバグチケットがあった
https://github.com/hashicorp/vagrant/issues/9986

ざっと見た感じ、言語設定による差分でvagrant内の判定に問題が起きているらしい。
ただ細かくみるつもりはないしpowershellスクリプトの読み方もイマイチ分からない。
とにかくこの判定式を抜けようということで絶対にTrueを返すようにしたところ対応できた。

```powershell:VagrantVM.psm1
function Check-VagrantHyperVAccess {
    return $true
    param (
```
[Laravel] GithookをGit管理し、コミット時に対象ファイルをフォーマットする

#なにがおきたか

この記事を書きましたが、unstagedのものまでコミットされたり不便でした

[Laravel] コードをコミット時に自動整形する
https://qiita.com/ntm718/items/0f8feedc4e14c068c455


#やりかた

大筋は上記の記事通りです。
下記コマンドを実行した際に、`.git/hooks/pre-commit に記載した内容がそのままコピーされているようでした


```json:composer.json
"hooks": {
            "pre-commit": [
                "./vendor/bin/php-cs-fixer fix .",
                "git add ."
            ]
        }
```

```bash
./vendor/bin/cghooks update
```

下記のように、対象のhooksに転記されるだけ

```bash:.git/hooks/pre-commit
#!/bin/sh                                                                                                                 

./vendor/bin/php-cs-fixer fix .
git add .
```

つまるところ、普通にshellを書けば、そのまま転記される

```json:composer.json
"hooks": {
            "pre-commit": [
                "for FILE in `git diff --staged --name-only | grep .php`; do",
                "if [ -e $FILE ]; then",
                "./vendor/bin/php-cs-fixer fix $FILE",
                "git add $FILE",
                "fi",
                "done"
            ]
        }
```

```bash
./vendor/bin/cghooks update
```

これを反映させた場合

pre-commitは下記のようになっています

```bash
#!/bin/sh

for FILE in `git diff --staged --name-only | grep .php`; do
if [ -e $FILE ]; then
./vendor/bin/php-cs-fixer fix .
git add $FILE
fi
done
```

上記のように、stage済みのものかつphpファイルで、削除されていないものであればフォーマットされます。
インフラのあれこれ

## 概要
基本的に、初心者の方向けに書くので細かい内容は書きません。

## インフラを理解する
今回は、よく出てくるインフラ辺りの単語をざっとこんな感じのイメージですっていうのをまとめました。
めちゃめちゃ雑に書くので、気になった内容は調べてみてください。皆さんの手掛かりになると嬉しいです。

## OS関連
#### UNIX
一番最初らへんに出たOS
コマンドベース
macOSはUNIXの派生
商用

#### LINUX
商用やめて、OSSで皆使おう
UNIXをパクって作ったOS
UNIXとは別物扱いだが、機能としては似ている
オープンソース

#### ディストリビューション
LINUXをベースに派生したもの
CentOS・RHEL・Ubuntu・Amazon Linuxなど

#### Windows
普段クライアントPCで使われているようなWindows 10の他に、
サーバ用途でWindows Server 2016などもあります

#### BIOS
F12連打してください→黒い画面のあれです

#### ブートローダ
パソコンの電源ボタンポチすると、マザーボードのBIOSが起動します
BIOSはブートローダを呼びます。ブートローダがOSを起動します。

## サーバ関連
#### サーバ
普通のパソコンより処理速度が早くなったものというイメージでいいと思います

#### サーバラック
サーバをいれる棚です
データセンター行くといっぱいあります

#### ラックサーバ
サーバの形が薄くて、幅が長い感じの形です
ラックに入るような形になってます
データセンターにあるのはこっちが多いです

#### タワーサーバ
普通のデスクトップのような形してます
個人利用が多いイメージです

#### メモリ
作業机みたいなものです

#### CPU
人間の脳みたいなものです、作業机（メモリ）の宿題を脳（PCU）が処理します

## ネットワーク関連
#### IPアドレス
住所です

#### セグメント
ネットワークの世界では、東京都港区内（セグメント）だとLINE（パケット）を送れます
セグメントを広げることもできるし、狭めることもできます

#### サブネットマスク
255.255.255.0とかです
その数字で、東京都にするのか日本にするのかなどサイズを決めます

#### CIDR表記
/24とかです
サブネットマスクと意味は同じでサイズを決めます
書き方が違うだけです
/24 = 255.255.255.0

#### OCI参照モデル
知っておいて損ないです
ネットワークの問題が起きたら、物理層から順番に確認すれば間違い無いです
クラウドだったら、L2からだと思います

#### ポート
chromeでgoogle.com:443を叩いてみましょう
sshは22だったり、IPアドレスとポートを使っていろいろつなげてます

#### TCP UDP
早くて雑か、遅くて正確かです
TCPのポートとUDPのポートがあるので注意です

## その他
ファイルシステム、CIFSやNFSなどディスク関連も知っておくと良いかもしれません。
[Swift] 関数　デフォルト引数

#デフォルト引数とは
引数にデフォルト値を設定することができ、関数呼び出しの時に省略できます。
#書き方
引数宣言の後に=デフォルト値を追加します。
以下のコードはteam以外にはデフォルト値を設定しています。
returnの式のところには引数に応じて、チームの順位を引っ張ってくる条件式を入れると想定して書いてみました。
デフォルト値はjapanとsoccerなので日本サッカーの順位を引っ張ってくるなら、
`search(team: "川崎F") `で順位を取得できます。
デフォルト値とは違う、例えば日本の野球チームの順位を引っ張りたいなら、
`search(team: "阪神", event: "野球") `と書けばできそうです。
そのためには{}内の処理もしっかり書き込まないといけないと思いますが、今回はデフォルト値の説明なので割愛させていただきます。



```swift
func search(team: String, country: String = "japan", event: String = "soccer") -> Int {
    return 1
}
search(team: "川崎F")   //1
```

#メリット
引数を省略できる。
検索条件のような多くの引数がいるが、全てが必須条件ではない場合の関数を定義する時に役立ちます。
#参考文献
石川洋資・西川勇世、『[増補改訂第３版] Swift実践入門　直感的な文法と安全性を兼ね備えた言語』、技術評論社、２０２０年４月２８日、４５３ページ
PySide2の情報をまとめる（自分用）

pythonで作る対話システムの２章を読んでわからなかったPySide2を用いた処理をまとめます。

#SCXMLとは
有限状態オートマトンを記述するための言語。

対話システムやマルチモーダルアプリケーションの遷移図を書くために利用されている。

#Qt for Python(PySide2)
これはpythonでSCXMLを扱うために必要。

有限状態オートマトンを表すQScxmlStateMachineというクラスがある。

```python
from PySide2 import QtCore, QtScxml
#Qtに関するおまじない
app = Qtcore.QCoreApplication()
el = Qtcore.QEventLoop()
```

Qtを用いるアプリケーションではメインとなるインスタンスが必要。
そのためのapp = Qtcore.QCoreApplication()
Qtのモジュールは一般にイベントを受け取って処理を進める設計になっている。

```python
QtScxml.QScxmlStateMachine.fromFile('states.scxml')
```
fileName で指定された SCXML ファイルからステートマシンを作成します。

このメソッドは常にステートマシン(有限状態オートマトンのこと？）返します。SCXML ファイルの読み込み中にエラーが発生した場合、ステートマシンを開始することはできません。エラーは、parseErrors() メソッドを呼び出すことで取得できます

>parseErrors()
メゾットを追加してファイルの読み込みにエラーがあるかを調べる。


```python
activeStateNames()
```

すべてのアクティブな状態の状態名の**リスト**を取得します。

あるステートがアクティブな場合、定義上はすべての親ステートがアクティブになります。compress が true (デフォルト) の場合、親の状態はフィルタリングされ、リーフの状態だけが返されます。これが false の場合、アクティブなステートの完全なリストが返されます。

>compressがfalseの場合も試してみる
activeStateNames(compress=false)
[Xcode]あんたこれ知らないなんてバカぁ？（知っておくと便利Tips10選）

上記釣りタイトル大変失礼致しました。

#動作環境
Xcode：Version 12.2

#①範囲選択したテキスト（変数名、関数など）を一括してリネームすることができる
`command + Ctrl + e`
![Qiita01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585523/2c3a4741-dc92-b7e5-639c-4e7b9101dfae.gif)


#②範囲選択したテキストを上下に移動できる
###上にあげる
`command + option(⌥) + {`
###下に下げる
`command + option(⌥) + }`
![Qiita02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585523/4eae50a0-d0ae-e759-0fec-c8b337b7aa1d.gif)


#④範囲選択して、コード整形する
範囲指定後、`Ctrl + i`
![Qiita03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585523/3a838f2e-0810-9815-324c-f88617acea21.gif)


#⑤プロジェクト内のファイル検索を行える
`command + Shift + o`
![Qiita04.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585523/938ebaa3-7e9c-4713-3906-557ec484e0e6.gif)


#⑥コードを保存して好きな時に呼び出せる
####手順1, 範囲選択したテキスト上で二本指タップ
####手順2, "Create Code Snippet"を選択

![Qiita05.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585523/0d3c5941-733f-a81e-24c6-e09577e01ca1.gif)


#⑦一括で文字を追加入力
`option(⌥)を押しながらドラッグ。離したところで任意の文字入力`
![Qiita06.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585523/bb8dfe1d-ac63-efd9-225a-497e07d84fe9.gif)


#⑧検索文字置換を行える
`command + F + option(⌥)`
![Qiita07.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585523/f00055f2-832e-b3c7-b2cf-148c6dc99206.gif)


#⑨現在見ているファイル内の関数や変数一覧を表示&移動できる
`Ctrl + 6`
![Qiita08.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585523/f6c621e6-e09d-fde4-df09-aac843352b9f.gif)
）

#⑩UIColor型の値で大活躍の"Color Literal"
`var color:UIColor() = Color Literal`

**⚠︎"Color Literal"とこのまま入力しても表示されない可能性があります！その場合、先頭の"Color"だけ入力して予測変換を待ちましょう！**
![Qiita09.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585523/7a2a3647-5cf0-2ea5-2a90-c43f9c1f5c90.gif)


#番外編⑪プレイスホルダーを作ることができる
`<#文字#>`
時々使うLookerの表パターン

# 自社にあるものを紹介
Lookerを導入し色んなDashboardを作っていっています。
ただ他社のdashboardとか表ってどんな風な見た目にしてるのかな？と気になりつつもデータが絡んでいたりするので気軽に社外に出せるものでもないと思います。今回は僕の働いているDiverseという会社ではこんな感じの表やこんな感じの項目を表示してたりしてるという共有ができたらと思います。

⚠️connectionしているDBがTreasureDataなのでBigQueryだとちょっと変えてください。

## 先週比
![スクリーンショット 2020-11-30 18.06.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170870/19cbbd33-5081-f4da-6e3e-6c5d5e3ccdbb.png)
先週と比較することがケースが一番多いというか需要があるのかなと思います。

今日や昨日といったdimension_groupを定義し、
day_of_week_indexを比較するカスタムフィルターで表示したい曜日を制限しています。

``` typescript
  // 今日の日付のdimension
  dimension_group: today {
    label: "今日"
    type: time
    datatype: epoch
    timeframes: [raw, time, hour, hour_of_day, day_of_month, day_of_week_index, date, week, month, year]
    sql: to_unixtime(NOW());;
  }
```

``` typescript
// カスタムフィルター
${table.today_day_of_week_index} = ${table.hoge_at_day_of_week_index}
```

## 男女デバイス別

![スクリーンショット 2020-12-12 23.06.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170870/fecdeb9c-17e5-6d1e-1c4e-05c4bb41727b.png)
デバイス別で何かを表したい時に絵文字とかを入れたりしています。

🍎 => iOSアプリ
🤖 => Androidアプリ
👨 => 男性
👩 => 女性


## 広告ごとのインプレッション数を理解しやすくする表
![スクリーンショット 2020-12-12 23.10.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170870/b931e699-4a98-6018-7c6b-7e1516bb0d5f.png)
(scatterPivotを使いたくて作った表です)
この表使ってこれみるといいよみたいなのがあると教えていただけると嬉しいです。

## boxpivotで中央値の推移
以上な行動をされる方などがいると辺なグラフになってしまうものに関しては、特定のアクション数の中央値による変化を追ったりしています。
https://docs.looker.com/exploring-data/visualizing-query-results/boxplot-options
![スクリーンショット 2020-12-12 23.40.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170870/05335637-bb95-0d17-6edb-830e25301c58.png)

## 土日で色を変える
土日で数値がかわることが多く、雑多にグラフにしているとこれは土日の変化なのか・・・？と思うことが多々あり色を変えたりもしています。
![スクリーンショット 2020-12-12 23.49.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170870/31671941-e76a-ab40-5471-73abd704c87c.png)

``` typescript
  dimension: date_color {
    label: "date"
    sql: ${time_date} ;;
    html: {% if time_day_of_week_index._value == 5 %}
          <font color="blue"> {{ value }} </font>
          {% elsif time_day_of_week_index._value == 6 %}
          <font color="red"> {{ value }} </font>
          {% else %}
          {{ value }}
          {% endif %}
          ;;
  }
```

## おまけ 社内できのたけ戦争をした時の戦況報告表
![スクリーンショット 2020-12-12 23.17.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170870/6b3fd314-5e14-a427-5d42-cf1bb588d44e.png)
どちらの派閥の方もいると思うので両者引き分けの状態です。
テキストのところにimageタグを入れ込んでいるだけです。
(画像を勝手に利用してしまったので怒られるかもしれないので、問題がありそうなら削除します)

# まとめ
なんだかんだ一番使っているのはテーブルの表だったりするんですが、そればかりだと面白くないと思いつつも無難な形に毎回なっています。
他の会社の人ってどう言った形でデータをまとめられているのか気になる...。
BigQueryで簡単にbit全探索

福岡でデータ基盤エンジニアしている荒木です！
日々の業務の中でクエリを書いていると、SQLで[bit全探索](https://drken1215.hatenablog.com/entry/2019/12/14/171657) が書きたいなーと思うことってありますよね？僕は一度もないです。
BigQueryの関数とWith句を使うとbit全探索が意外と簡単に書けたのでご紹介したいと思います。
例題として、価値と重さが設定された20個品物を一定の重さ以下で価値を最大化する問題（いわゆる　ナップザック問題）を考えてみたいと思います。
（前提知識として通常のプログラミング言語でbit全探索を理解している方を対象としています = bit全探索についての説明はしません。）


```sql:bit.sql
WITH nimotu AS (
  -- テストケース
  SELECT 0  AS id,   2 AS value,  9 AS weight UNION ALL
  SELECT 1  AS id,   5 AS value,  5 AS weight UNION ALL
  SELECT 2  AS id,   4 AS value,  1 AS weight UNION ALL
  SELECT 3  AS id,   1 AS value,  5 AS weight UNION ALL
  SELECT 4  AS id,   3 AS value,  5 AS weight UNION ALL
  SELECT 5  AS id, 100 AS value, 20 AS weight UNION ALL
  SELECT 6  AS id,   2 AS value,  9 AS weight UNION ALL
  SELECT 7  AS id,   5 AS value,  5 AS weight UNION ALL
  SELECT 8  AS id,   4 AS value,  1 AS weight UNION ALL
  SELECT 9  AS id,   1 AS value,  2 AS weight UNION ALL
  SELECT 10 AS id,   3 AS value,  5 AS weight UNION ALL
  SELECT 11 AS id, 100 AS value, 20 AS weight UNION ALL
  SELECT 12 AS id,   2 AS value,  9 AS weight UNION ALL
  SELECT 13 AS id,   5 AS value,  5 AS weight UNION ALL
  SELECT 14 AS id,   4 AS value,  1 AS weight UNION ALL
  SELECT 15 AS id,   1 AS value,  2 AS weight UNION ALL
  SELECT 16 AS id,   3 AS value,  5 AS weight UNION ALL
  SELECT 17 AS id, 100 AS value, 20 AS weight UNION ALL
  SELECT 18 AS id,   2 AS value,  9 AS weight UNION ALL
  SELECT 19 AS id,   5 AS value,  5 AS weight 
), solve AS(
  SELECT
    SUM(
      -- bitが0の商品は加算
      CASE WHEN bit & (1 << id) = 0 
        THEN nimotu.value 
        ELSE 0 
      END
    ) AS value,
    SUM(
      -- bitが0の商品は加算
      CASE WHEN bit & (1 << id) = 0 
        THEN nimotu.weight 
        ELSE 0 
      END 
    ) AS weight
  -- 商品idと選び方をcross joinして1レコードがある選び方のときのある商品の状態を示すテーブルを作成
  FROM
    -- 商品idの列挙
    UNNEST(GENERATE_ARRAY(0, 19)) AS id
  CROSS JOIN
    -- bitで選び方を列挙
    UNNEST(GENERATE_ARRAY(0, 1<<19)) AS bit
  LEFT JOIN
    nimotu
  ON
    id = nimotu.id
  GROUP BY
    -- 選び方でグループ分けして1レコードがある選び方を示すテーブルに変換
    bit
)
SELECT
  MAX(value)
FROM
  solve
WHERE
  -- 重量は50以下の設定にする
  weight <= 50
```

GENERATE_ARRAYで商品idの連番テーブルと選び方のbit列の連番テーブル作ってCROSS JOINします。するとある商品がある選び方のときにの状態を示すテーブルができます。なのでbitでグループ分けして、bit & ( 1 << id )が0の商品を合計すると全ての選び方を全列挙することができました。
そうだ、馬と一緒にリモートワークしよう

# はじめに
[iRidge Advent Calendar 2020](https://qiita.com/advent-calendar/2020/iridge) 13日目の記事です。

3月末からリモートワークが始まって、最初のうちは「通勤時間がないからその分仕事できる」とか「家族やペットと過ごす時間が増えて良かった」とポジティブに捉えてました。

でもね、実際やってみると...

**通勤時間がON/OFFに切り替えに大事だったな**
**WEB会議に子供が乱入してくるし、宅急便来ると犬が吠える！**

と課題が見えてくるし、そしてなにより

**ずっと家の中は辛い！！**

そうなんです。
やっぱり家は仕事をする場所には適していないので、色々なものから逃れるようにバルコニーで仕事する機会が増えました。

![代替テキスト](https://magazine.fujiei.co.jp/wordpress/wp-content/uploads/2020/05/1-gazou_1200_720_2-1200x720.jpg)


春は気候が良いから最高♪
夏はちょっと暑いけど...我慢すればギリセーフ
秋は少し肌寒いけどアウター着れば問題なし！
冬...うん寒くて無理だね、これ

という訳で、リモートワーク初めて9ヶ月経った12月から本格的に仕事環境を見直すことにしたので、少しでもこの記事が皆さんのリモートワーク環境作りの参考になれば幸いです。

# 場所選び

場所探しの条件は以下の2点！

**自宅から徒歩圏内（電車移動なし）**
**リモートワーク手当 5,000円の範囲に収まること**

でもね、コワーキングスペースを調べても月数万かかるから、5,000円だと自宅のインターネット環境を整えるくらいしかできないんですよね。

やっぱり自宅で我慢するしかないのかと半ば諦めて、週末に馬術部で学生の練習を見ていたら...
※母校の大学で馬術部の監督をしています

**あっ、厩舎で仕事すればいいじゃん！**

![代替テキスト](https://pbs.twimg.com/media/Eb6yVhNUYAEhLXd?format=jpg&name=small)

ということに気づいたんです。
自宅から徒歩2分だし、教官室という築うん十年という建物だけど雨露はしのげるし、なにより大好きな馬が近くにいる。
早速環境作りの準備が始まりました。

![代替テキスト](https://blog-imgs-96.fc2.com/m/o/s/mosu3/20160814183552969.jpg)

# 環境作り

**オフィスチェア**
ちょうどオフィスの縮小で持ち帰りOKとのことだったので、馬術部のトラックで後輩の分と合わせて2脚を運び込み完了

**モニター**
こちらも持ち帰りOKとのことで、自家用車で搬入完了

**机**
教官室にもともとあったアンティークの机を利用

**通信環境**
リモートワーク手当を使って光回線の工事手続き中

通信環境だけ準備中ですが、いよいよ働ける環境が構築できました！

# リモートワーク開始

12月に入ってからは、毎朝コーヒー片手に馬術部の厩舎に出勤。
放牧中の馬に挨拶して、充実したリモートワークを始めています。

![代替テキスト](https://lh5.googleusercontent.com/p/AF1QipOsnu7cIeF2OPBPpRrgzFq8tfetIy5CVdAjJPLl=s1600-w800
)

厩舎でリモートワークする変人は日本で私くらいな気がするけど、好きな場所でリモートワークできたらやっぱり最高だなと思いました。

ちなみに、学生もオンライン授業がメインでスマホのテザリングを使っていたので、Wi-Fi引くよと伝えたら歓喜してました。
もっと早くから厩舎で仕事していれば良かったね。

おわり
ページ遷移してもdetailsを開きっぱなしにするJS

素人がchromeでページ遷移をしてしまうとdetailsとsummaryのアレ（以下details）が閉じちゃうのをどうにかしたくて作りました。

##動機
小説サイトを改装中、1ページに全ジャンル詰め込みたくてdetails導入してみたんですよ。 Firefoxでは期待通りに動いてくれて、ウッキウキでChrome動作確認したところ、 リンクをクリックして小説読んだあとブラウザバックで戻ってきたらdetails閉じてた。
**なんでや！！！！！**
ということで仕方なく門外漢がjavascriptに手を出しました。ぐぬぬ。

##つくったやつ
<p class="codepen" data-height="450" data-theme-id="light" data-default-tab="js,result" data-user="maimaine" data-slug-hash="QWKdjqv" style="height: 450px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="detailsを開きっぱなしにするやつ">
  <span>See the Pen <a href="https://codepen.io/maimaine/pen/QWKdjqv">
  detailsを開きっぱなしにするやつ</a> by maine (<a href="https://codepen.io/maimaine">@maimaine</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>


##使い方メモ
主に自分のために忘れそうなので書いておきます。

####①htmlでdetailsとsummaryにそれぞれidをつける

```html:details.html
<details id="sample">
  <summary id="sample_s">サンプル1</summary>
```

サンプルではdetailsに「sample」、summaryに「sample_s」とidをつけています。

####②jsを書き換える

```js:details.js
open('openSAMPLEsave', "sample");
```

```js:details.js
document.getElementById("sample_s").onclick = function() {
　stSave('openSAMPLEsave');
}
```

「sample」「sample_s」はそれぞれ①でつけたidに書き換えてください。
「openSAMPLEsave」は自由に名付けて大丈夫です。こちらもdetailsごとに別の名前をつけてください。

##解説のようなもの
簡単に言うと、セッションストレージを使ってdetailsが開いたかどうかを保存してくれるようにしました。

セッションストレージというのは、ブラウザに情報を保存しておいてくれる便利機能らしいです。

そしてこの子、「ブラウザが」「タブごとに」保存してくれるらしいので、 通信とかすることなく、タブを消しちゃえばその情報は消えてくれるという。 すごい！気軽に使えるいい子だ！！

##その他

####◆jsファイルってどうやって使うんだっけ
＜/body＞タグの直前に

```html
<script type="text/javascript" src="details.js"></script>
```

って記入すれば動いてくれます。

####◆JS導入できない環境なんだけど
夢小説サイトあるある。JSファイルの中身をコピペして、

```html
<script type="text/javascript">
</script>
```

このタグの中に入れて＜/body＞タグの直前に置けばOKです。

##あとがき
たぶんこういうの見る方々はわたしなんかよりもっとできるひとたちなんだろうけど、もしかしたらわたしと同じようなひとが検索かけてたら悩む手間を省けるかなって思って投稿してみました。もしお役に立てたのなら嬉しいです。
あとなんかもっといい方法あったら教えてください。
【JavaScript】オブジェクトから特定のプロパティを抽出


# やりたいこと

```js:
const obj = { id: 1, name: "taro", age: 20 }
// これを
// { name: "taro", age: 20 }
// このようにのプロパティだけ抽出したい
```

配列でいうfilterのようなことをオブジェクトでもやりたくなる。



# 方法

```js:
const obj = { id: 1, name: "taro", age: 20 }
const picked = (({ name, age })=>({ name, age }))(obj)
console.log(picked) // { name: "taro", age: 20 }
```


# 解説

```js:
const picked = (({ name, age })=>({ name, age }))(obj)
```

これは

```js:
const pick = ({ name, age }) => {
 return { name, age }
}
const picked = pick(obj)
```

やっていることはこれと同じです。


```js:
const pick = ({ name, age }) => ({ name, age })
const picked = pick(obj)
```

returnを括弧で省略。


```js:
const picked = (({ name, age })=>({ name, age }))(obj)
```

呼び出しまで一行で行う。


# おまけ

lodashの[pick](https://lodash.com/docs/4.17.15#pick)でも同じことができます。

```js:
const picked = _.pick(obj, ["name", "age"])
console.log(picked) // { name: "taro", age: 20 }
```


# さいごに

可読性が低くなってしまうので、あまり使わない方がいい気がしています...
他にもっといい方法があれば教えていただきたいです。
プロ野球関連の開発についてメモ

#開発案
一球速報
記事まとめ
打席結果予測
特定の球団や選手の速報

なんかしら野球関連の開発したいものですね。

#今日の名言
Baseball is like church. Many attend few understand.
(野球は教会のようなものだ。多くの人がいくが、理解している人は少ない)
-レオ・ドローチャー(アメリカプロ野球殿堂)
AWS Amplifyメモ

# 1.[チュートリアルの注意点](https://aws.amazon.com/jp/getting-started/hands-on/build-web-app-s3-lambda-api-gateway-dynamodb/?sc_icampaign=acq_jp_getting-started-handson-202010-build-web-app-s3-lambda-api-gateway-dynamodb&sc_language=jp&sc_icontent=awssm-6336&sc_iplace=ribbon&trk=ha_ribbon_acq_jp_getting-started-handson-202010-build-web-app-s3-lambda-api-gateway-dynamodb)

* チュートリアルの「モジュール1」でindex.htmlをzipでアップロードするとき、Macの場合はターミナル上でzipコマンドを使用すること。GUIで「〜を圧縮」では「AccessDenied」というXMLファイルが表示されうまくいかない。

```xml

<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>XXXXXXXX</RequestId>
<HostId>XXXXXXXXXXXXXXXXXXXXXXXXXX</HostId>
</Error>
```
React NativeのWebSocketは接続先のホストがOriginに使われる

## `Origin` ヘッダー、 CORS とは

ブラウザから JavaScript で別ドメインの API 、画像、音声ファイルなどのリソースを利用するときはもろもろの脆弱性（詳しくは割愛）を防ぐため、 CORS という仕組みを使いリクエストの `Origin` ヘッダーを見てアクセスを許可する場合のみレスポンスに `Access-Control-Allow-Origin` ヘッダーを返してあげる必要があります。

[オリジン間リソース共有 (CORS)](https://developer.mozilla.org/ja/docs/Web/HTTP/CORS)

これはブラウザのセキュリティを担保するためのものなので、ターミナルから `curl` コマンドを使ったリクエストや Node.js からのアクセスなどには関係ありません。つまり React Native にも基本的には関係ありません。

## オリジン間のWebSocket

WebSocket には CORS が適用されないため、 `Origin` をヘッダーを見て意図しないオリジンからのアクセスを拒否するように WebSocket サーバー内で実装する必要があります。

https://www.slideshare.net/muneakinishimura/webhtml5-31749532

これをしないと **Cross-Site WebSocket Hijacking** の危険性があります。

## React Native の WebSocket の `Origin` って？

前述の通り React Native に CORS は基本的には影響しませんが、 WebSocket 接続時のセキュリティを担保するための `Origin` ヘッダーはどのように設定されているのでしょうか？

ドキュメントには記述が見つけられませんでしたが、 React Native のネイティブ側の WebSocket の実装をみると **WebSocketの接続先の `ws(s)` を `http(s)` に置換した文字列を `Origin` ヘッダーにセットしている**ようでした。

iOS
[https://github.com/facebook/react-native/blob/v0.63.4/Libraries/WebSocket/RCTSRWebSocket.m#L1552-L1571](https://github.com/facebook/react-native/blob/v0.63.4/Libraries/WebSocket/RCTSRWebSocket.m#L1552-L1571)

Android
[https://github.com/facebook/react-native/blob/6e6443afd04a847ef23fb6254a84e48c70b45896/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.java#L105-L129](https://github.com/facebook/react-native/blob/6e6443afd04a847ef23fb6254a84e48c70b45896/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.java#L105-L129)

Android の実装をみると JS から `Origin` ヘッダーが渡された場合その値が使われるようになっていそうですが、 iOS のほうにはそのような挙動はないようなので、 `Origin` ヘッダーは渡さない方がよさそうな感じがします。

## なぜこれが必要だったのか

現在のプロジェクトで [Hasura](https://hasura.io/) という PostgreSQL から GraphQL API を生成してくれるミドルウェアを使っているのですが、 Hasura には `HASURA_GRAPHQL_CORS_DOMAIN` 環境変数をセットすることでCORSを許可するドメインを指定できる機能があります。

[GraphQL engine server config examples | Hasura GraphQL Docs](https://hasura.io/docs/1.0/graphql/core/deployment/graphql-engine-flags/config-examples.html#configure-cors)

`HASURA_GRAPHQL_CORS_DOMAIN` をセットすると、同時に GraphQL Subscription の WebSocket 接続もその `Origin` 以外からは弾くようになっています。

[Subscriptions | Hasura GraphQL Docs](https://hasura.io/docs/1.0/graphql/core/subscriptions/index.html#cookies-and-websockets)

この仕様は基本的にはありがたいのですが、 React Native の場合は CORS は関係ないはずなのに WebSocket のときのみ接続が弾かれてしまうという問題があり CORS の設定ができないでいました。

React Native からの WebSocket 接続があるときは、 WebSocket サーバー自体のドメインを許可する `Origin` に追加すればよさそうです。

## まとめと宣伝

Hasura の CORS を設定すると WebSocket が接続できなくなる問題があるため [Production checklist](https://hasura.io/docs/1.0/graphql/core/deployment/production-checklist.html) のうち CORS の設定だけできていなかったのですが、これで一通り実践できるようになりました :tada: 

最後に宣伝です。
現在 TypeScript / Next.js / React Native / GraphQL / Hasura を使った開発現場で業務委託やインターンのエンジニアを募集しています。
興味がございましたら [shinnoki](https://twitter.com/y_shinnoki) までご連絡下さい。
Android studio：Kotlin：shared preferenceの使い方

アプリ版のini設定みたいなやつ

とりあえずこれを書く

```kotlin:MainActivity.kt
//第一引数に名前を入れとくとアプリ全体で共有できる
val spf = getSharedPreferences("Setting", MODE_PRIVATE)
val editor = spf.edit()

```

読み込みはこう(デフォルト値は必須)

```kotlin:MainActivity.kt
spf.getInt("Key", "ここにデフォルトの値を入れる")
spf.getString("Key", "ここにデフォルトの値を入れる")
spf.getFloat("Key", "ここにデフォルトの値を入れる")

//こんな感じで使う
var A=spf.getInt("Key", "ここにデフォルトの値を入れる")

```

書き込みはこう

```kotlin:MainActivity.kt
editor.putInt("Key",1)
editor.putString("Key","内容")
editor.putFloat("Key",1F)
//applyしたら書き込まれる
editor.apply()

```

一度全削除してインストール直後の状態を試したい場合は以下

```kotlin:MainActivity.kt
val spf = getSharedPreferences("Setting", MODE_PRIVATE)
val editor = spf.edit()
editor.clear()
editor.apply()
```
2週間の振り返り(12/01~12/12)

目標：
トリミングの店のHPのサイトを作る。
　→ターゲットを設定
　→ワイアーフレーム
　→なぜそうしたかを考える。
　→サイト実装出来たら今学んでいるdjanngoでお問い合わせなどの機能の実装
・PyQの機械学習のコースを終える。（1日2クエスト)
・Qiitaで定期的に振り返る。
・GITHUBを導入する。

結果：
WEBサイトのホームページ作成
→ワイヤーフレームのためにADOBE XDを導入
XDの操作方法を覚えるためにyoutube等で学びました。
初心者ながらわかりやすかった動画とサイトを紹介させていただきます。
1,アドビ公式trailキャンプの動画：https://youtu.be/uVbltuX5jNg
こちらでは、合計２時間程度の動画でスマートフォン向けのWEBサイトを作ることができます
![スクリーンショット 2020-12-12 23.28.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764631/553051c2-a702-6358-3862-8a1889364bb3.png)
非常にわかりやすく、素材も提供されていますので初心者の方はやってみてもいいかと思います。
横にある、PC向けのものは勝手に自分で作りました。

2,ADOBEtrailのサイト：https://xdtrail.com
こちらで、動画にはないものもあるので、動画が終わり次第やるといいと思います。

→Djangoについて
いきなり、djangoを導入するのは無理がありました。
ですので、Djangoのチュートリアルである、djangogirls：　https://tutorial.djangogirls.org/ja/
をやっています。
かなり初歩的なところから、初心者が間違いやすいところなどを書いてくれている為とてもよいと思いました。
Djangoをやってみたいけれど・・・という人はこれをやってみるといいかもしれません。

→PYQ一日２クエスト
こちらは毎日達成することができています。
ですが、統計学の知識が必要であることがわかった為、kindle unlimitedで無料配信されていた「大学4年間の統計学が10時間でざっと学べる」を買い、勉強しています。

→GitHub導入
GitHubとPCを連携させることができました。


年末までの目標
DjangoGirlsを完了（１週間以内）＋Girlsの次のステップもあったためそれを完了（２週間以内）

また、新型MACを購入したので、そちらの環境構築もあわせて進める
→adobe関係はMACと聞くのでMACに移行させる。

技術関連（初心者なりの思った点や気づいた点）のQIITAの記事を書く

PYQを継続すること。→djangoの部分も含めてわからないことが増えてきたので入門書1冊に変更
新機能「サーバスクリプト」使ってみました！！

# 新機能「サーバスクリプト」使ってみました！！
オープンソースのWebデータベース「Pleasanter」の新機能の「サーバスクリプト」を試しに活用してみました。

## サーバスクリプトとは
サーバサイドで行う処理をフロントエンドで使用するJavaScriptを用いて処理を記述し、動作させることができる新しい機能です。

## どんなところに使用すると良いか
・インポート機能で一括登録したレコード
・一覧編集画面で編集した複数レコード
上記レコードの項目に対しての何らかの処理を行いたいとき使用するのが良いかと思います。
※今までは拡張機能（拡張SQL）を用いて対応していたものをサーバスクリプトでは簡易的に実装することができるようになります。

## サーバスクリプト設定
テーブルの管理の中にある「サーバスクリプト」タブで設定することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/7c5471c3-6b2f-2c49-edfb-edd6d42be58a.png)
サーバスクリプトの設定画面は以前からあるスクリプトと同じような画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/43e876fb-483d-1489-52ed-782268e1cf61.png)




## 実際に使ってみる
### 計算式（標準機能）で算出した値をもとにさらに計算させる
・単価（数値A）と個数（数値B）を掛け合わせた結果が合計(税抜)（数値C）に入る計算式が設定されている場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/c065b096-0372-a7a3-412e-5752f1159c1f.png)
　上記の数値Cと数値Dを掛け合わせて数値Eに計算結果を入れる　←この部分をサーバスクリプトで行う。

計算処理のスクリプトは以下の通りです。計算式の後に実行させたいので、「計算式の後」のチェックをオンにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/c55af9b5-2b8a-c10f-5f75-c23b928a737e.png)

実際に動かしてみたいと思います。まずはよく使用する新規作成で試します。※編集画面も同様です。
#### 新規作成（編集画面）
ぶどうの単価(300円)、個数(2個)、税率(10%)を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/94399534-acfd-8c50-1d37-46d7524ea431.png)

作成ボタンを押すと、合計(税抜)、合計(税込)に値がセットされます。
※合計(税抜)は計算式、合計(税込)はサーバスクリプト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/e5896f5e-2cc8-189a-f0ed-9eadd86315f0.png)

一覧編集、インポートでも処理できるか試してみます。
#### 一覧編集
りんごの単価(250円)、個数(3個)、税率(10%)を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/6b9d8146-b26d-a691-f29d-7bbdf0f773de.png)
更新します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/a66caacb-69b3-fabc-be16-8f3ed05b03f3.png)


#### インポート
以下のように、タイトル(いちご)、単価(400)、個数(4)、税率(10)が記載されたCSVファイルを用意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/a268af45-08e8-98eb-d387-99a3c5ec8419.png)
上記のCSVファイルをインポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/6fc3462a-6a18-fb71-b9f4-78ccb034b693.png)
インポートすると計算されレコードが登録されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481749/6f270039-e1ac-91d0-49a2-ce7270e72e7c.png)

## 最後に
上記で試してきたサーバスクリプトの計算は、最初の方でも少し触れた拡張SQLを用いることで対応することは可能ですが、SQLを環境に設定する際、IISを再起動する必要があり、業務に影響してしまいます。ただし、このサーバスクリプトは、プリザンターを動かしたまま追加、修正ができるため、業務を継続させる観点からもとても良い機能だと思います。
※この機能があの時あったらなと思うことがしばしばあります笑。。。

ぜひ、一度お手元の環境で試していただければと思います。
最後まで記事を読んでいただきありがとうございました！！
【Android】備忘録: 権限リクエストのやり方

#【Android】備忘録: 権限リクエストの方法

## 概要
完全な自分用の備忘録です。
毎回、パーミションのリクエストの仕方を忘れるので、その記録です。

## 手順
1. manifestに、権限の宣言を追加する。
2. 実行時に、permissionの状態を確認する
3. 許可されていなければ、リクエストを行う
4. リクエストの結果で処理を実行

## 1. manifestに、権限の宣言を追加する。

* AndroidManifest.xmlに、権限についての宣言を行う。
  * 例: カメラを使いたい時

* `<users-permission android:name="~"/> ` を追加

``` AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.sample.sample">

    // この部分が必要
    <uses-permission android:name="android.permission.CAMERA" />

  <application
     ~~~省略~~~ >

  </aplication>
</manifest>
```

## 2. 実行時に、permissionの状態を確認する

* 例えば、buttonをタップした時に、permissionの確認をする場合
  * 例: cameraButtonをタップした時に、確認 

* 注意するところ
  * Manifestが、java.util.Manifestをimportしないこと。android.Manifestをimportする。 

``` ~Activity.kt

val cameraButton = binding.camera
cameraButton.setOnClickListener {
  // この部分が必要
  // checkSelfPermissionで、Permissionの状態を確認する
  // != PackageManager.PERMISSION_GRANTEDなので、許可されていないという条件分岐
  if (ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
　　 // この部分は、「3. 許可されていなければ、リクエストを行う」で追加
  } else {
    // 許可されていれば、カメラ起動
    startActivity(Intent.(MediaStore.ACTION_IMAGE_CAPTURE))
  }
}
```

## 3. 許可されていなければ、リクエストを行う
* 2.で書いたコードに、リクエストの処理を追加

``` ~Activity.kt
cameraButton.setOnClickListener {
  // != PackageManager.PERMISSION_GRANTEDなので、許可されていないという条件分岐
  if (ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
　　 // この部分が、追加
    //　最後のREQUEST_CAMERA_PERMISSIONは、任意の定数
    ActivityCompat.requestPermissions(activity, arrayOf(Manifest.permission.CAMERA), REQUEST_CAMERA_PERMISSION)
  } else {
    // 許可されていれば、カメラ起動
    startActivity(Intent.(MediaStore.ACTION_IMAGE_CAPTURE))
  }
}

``` 

## 4. リクエストの結果で処理を実行
* permissionのリクエストの結果は、onRequestPermissionsResultで受け取る

``` ~Activity.kt
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
  if (requestCode == REQUEST_CAMERA_PERMISSION) {
      if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
          // カメラ起動
          startActivity(Intent.(MediaStore.ACTION_IMAGE_CAPTURE))
      }
      super.onRequestPermissionsResult(requestCode, permissions, grantResults)
}

```
インデントがわかりやすくなるおすすめの拡張機能　〜VSCode〜

#はじめに
　リファクタリングをしていて、タグのはじめと終わりやif文のはじめと終わりがどうも見つけにくくて導入しました。パソコン画面に目を近づける回数が激減しました。視覚的にわかるので、今ではたいへん重宝しています。

##エディタ
- VSCode

##おすすめの拡張機能

`Indent-Rainbow`という拡張機能をご存知だろうか。
これは、インデントに色をつけるものです。
色が付くことで、まとまりがわかりやすいし、エラーも見つけやすくなります。

![](https://i.gyazo.com/be0d1922528400abdcb8f108d6e5aa97.png)

あと、単純にお洒落でモチベも上がります。