OmniAICreator/Qiita-1.07M huggingface dataset:
【基本】AWS CLIで複数のプロファイル（認証情報）を使い分ける

# 概要
* 複数の認証情報を使ってAWS CLIを使いわける方法を説明します
* 追加は`aws configure  --profile プロファイル名`を使うだけ
* 使用は`awsコマンド--profile プロファイル名`を使うだけ

# 前提
* 既にAWS CLI （EB CLI等）を使って、デプロイなどのAWSへの接続が必要な作業を行ったことがある（=認証情報を使ってことがある）
* AWSに接続できる認証情報を複数持っている。

# 手順
## 追加登録したい認証情報の確認
* プロファイル名: ABCDEFG （任意の名前。重複しなければなんでもOK）
* aws_access_key_id: XXXXXXXXXXXXXXXXXXX （AWSから発行されたid）
* aws_secret_access_key: YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY （AWSから発行されたkey）

## 現状を確認
まず現状のプロファイル登録状況を確認して、これから登録したい認証情報（プロファイル名 ABCDEFG）が__まだ登録されていない__事を確かめます。
ローカルのAWSの認証情報は`~/.aws/credentials`に保存されています。
いままで、1個の認証情報しか使っていなかった場合は、下記の様に__default__というプロファイル名の認証情報が登録されているはずです。

```~/.aws/credentials
[default]
aws_access_key_id = AAAAAAAAAAAAAAAAAAAA
aws_secret_access_key = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
```

__ABCDEFG__というプロファイル名はまだ登録されていない事が確かめられました。

## 認証情報を追加する
ABCDEFGというプロファイルはまだ登録されていない事を確認できたので、安心して、aws cliを使って以下のように認証情報を追加します。default region nameがわかっているなら入れて下さい。（とりあえずいれなくてもOKです。）

```
> aws configure --profile ABCDEFG
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
Default region name [None]:
Default output format [None]:
```

## 変更を確認する
認証情報が追加された事を確認します。追加の時と同様に`~/.aws/credentials`見てください。__ABCDEFG__というプロファイル名と対応するidとkeyが追加されていれば成功です！


```~/.aws/credentials
[default]
aws_access_key_id = AAAAAAAAAAAAAAAAAAAA
aws_secret_access_key = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
[ABCDEFG]
aws_access_key_id = XXXXXXXXXXXXXXXXXXX
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

```
## 追加したプロファイルを使う

[EB CLIの設定: 名前を指定されたプロファイルを使用する](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3-configuration.html#eb-cli3-profile)を参照すると`--profile プロファイル名`の引数を使えば良いことがわかります。たとえば、`eb init`コマンドであれば下記の通り。

```console
> eb init -i --profile プロファイル名
```

今回追加した__ABCEDFG__を使いたい場合はこんな感じです。

```console

> eb init -i --profile ABCDEFG
```

# 参考
* [AWS 名前付きプロファイル](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-multiple-profiles.html)

* [EB CLIの設定: 名前を指定されたプロファイルを使用する](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3-configuration.html#eb-cli3-profile)
情報エントロピーまわりの自分用メモ

まじめに調べたら交差エントロピってかなりシンプルな定義だったので，すぐ思い出せるよう自分用メモ．
ちょっと雑多だけど勘弁してちょ．

# 情報量

情報エントロピの定義は Wikipedia あたりを参照．
[情報量 \- Wikipedia](https://ja.wikipedia.org/wiki/%E6%83%85%E5%A0%B1%E9%87%8F)

ハートレーとシャノンを押さえておけば良いんじゃないでしょうか．

理解としては，こっちの方が理解し易い．
[情報理論を視覚的に理解する \(3/4\) \| POSTD](https://postd.cc/visual-information-theory-3/)

# まとめ

- [情報量 \- Wikipedia](https://ja.wikipedia.org/wiki/%E6%83%85%E5%A0%B1%E9%87%8F)
    - $H(X) = -\int p(x)\log p(x) dx$
    - 条件付きエントロピ

        ```math
        H(X|Y) = - \int p(y) \int p(x|y) \log p(x|y) dx dy \\
        = E_Y[H(X|y)]\\
        = H(X,Y) - H(Y)
        ```

- [交差エントロピー \- Wikipedia](https://ja.wikipedia.org/wiki/%E4%BA%A4%E5%B7%AE%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AD%E3%83%94%E3%83%BC)
    - $H(p,q)$において$p(x)\ne0,q(x)=0$なる$x$が存在する時，発散する．
      連続密度関数の理論式ではあまり問題にならないけど，実データをそのまま適用しようとすると途端に困る．
    - 一般的な解決方法は知らないけど，もし自分が解決するなら経験分布関数を平滑化してから微分するか，正規分布で近似するか，って感じか．
        - でも正規分布なんて仮定しちゃうと交差エントロピーの式なんて持ち出さなくても平均と分散から欲しい変量を直接計算する方法がありそうな気もする．

    ```math
    H(p,q) = -\int p(x)\log q(x) dx\\
    H(q,p) = -\int q(x)\log p(x) dx\\
    H(p,q) \ne H(q,p)
    ```

- [カルバック・ライブラー情報量 \- Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%83%BB%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%BC%E6%83%85%E5%A0%B1%E9%87%8F)
    - $D_{KL}(p||q)$（下定義）は$p=q$の時に最小値0を取る．
    - この時，交差エントロピは$H(p,q)=H_p(X)$（$p$を$X$の生起確率とした時のエントロピ）で最小値を取る．
    - このことから，$p$を教師分布，$q$を学習している分布とした時の最適化問題を，交差エントロピ$H(p,q)$をもって解くことができる．
        - $H(q,p)$は最小化されない（らしい）．
        - 交差エントロピと同じく発散の問題あり．

      ```math
      D_{KL}(p||q) = -\int p(x)\log p(x) + \int p(x)\log q(x) \\
      = H_p(X) - H(p,q)
      ```

- [結合エントロピー \- Wikipedia](https://ja.wikipedia.org/wiki/%E7%B5%90%E5%90%88%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AD%E3%83%94%E3%83%BC)
    - $H(X,Y) = - \int p(x,y) \log p(x,y) dxdy$
    - 交差エントロピと同じ表記なので注意が必要．書き分けるべきだよな…
    - 結合エントロピは対称性がある（結合確率から計算するのだから当たりまえ）
- [相互情報量 \- Wikipedia](https://ja.wikipedia.org/wiki/%E7%9B%B8%E4%BA%92%E6%83%85%E5%A0%B1%E9%87%8F)
    - 最初，交差エントロピと相互情報量との間で混乱した．

    ```math
    I(X,Y) = H(X) + H(Y) - H(X,Y) \\
    = H(X) - H(X|Y) \\
    = H(Y) - H(Y|X)
    ```
Homesteadでサクッとプロジェクト追加

※すでにひとつ以上動いているプロジェクトがあり、新しくプロジェクトを追加する場合を想定しています。

以下を追記

```Homestead.yaml
    - map: projectName.test
      to: /home/vagrant/Code/projectName/public

databases:
    - projectName
```

/etc/hostsに

```
192.168.23.23   projectName.test
```


provisionしたあと、ssh接続してLaravelでプロジェクトを作成

```
$ vagrant up
$ vagrant provision
$ vagrant ssh

$ cd Code/
$ composer create-project --prefer-dist laravel/laravel projectName
```

.envを編集

```
DB_DATABASE=projectName

```
Definition error of "Corporate Number" in the ministerial order by MOF, Japan

This article is a translation from https://qiita.com/kawasaki/items/bfa9f0edc32c132eff30
***
## Corporate Number
“Corporate Number” or “Houjin-Bango” is a 13-digit enterprise identification number which is now commonly used in Japan. Each number is automatically generated by adding a check digit as a highest-order digit of 12-digit “Kaisha-Houjin-To-Bango” which is an older version of enterprise identification number.

I found an error of definition in the process of calculating the check digit according to the definition given by the [Ministerial order 70 of MOF, 2014, Specification of Corporate Number](http://elaws.e-gov.go.jp/search/elawsSearch/elaws_search/lsg0500/detail?lawId=426M60000040070&openerCode=1).

## False (current)
(Formula of check digit)
Article 2  The formula stipulated in paragraph 1, article 35, the cabinet order, is defined as

```math
9 - \left( \sum_{n=1}^{12} P_n \times Q_n modulo\ 9 \right)
```
where 
Pn is the n-th digit number of the base number stipulated in paragraph 1, article 35, the cabinet order, in which the first digit of the base number is defined as its lowest digit, and
Qn is 1 if n is an odd number and 2 if n is an even number.

## True
(Formula of check digit)
Article 2  The formula stipulated in paragraph 1, article 35, the cabinet order, is defined as

```math
9 - \left( \left( \sum_{n=1}^{12} P_n \times Q_n \right) modulo\ 9 \right)

```
where 
Pn is the n-th digit number of the base number stipulated in paragraph 1, article 35, the cabinet order, in which the first digit of the base number is defined as its lowest digit, and
Qn is 1 if n is an odd number and 2 if n is an even number.

## Explanation
The difference exists in the scope of parentheses.
In the current definition, 

```math
P_n \times Q_n modulo\ 9
```
is included in the summation and the formula generates a 2-digit number contradicting the definition in the higher Cabinet order. [Supplemental documents by National Tax Agency](http://www.houjin-bangou.nta.go.jp/documents/checkdigit.pdf) (PDF) suggests that the content of the summation is Pn x Qn.  

## Reference
- [Law 27, 2013, Law of Use on Personal Identification Number in Administrative Procedures](http://elaws.e-gov.go.jp/search/elawsSearch/elaws_search/lsg0500/detail?lawId=425AC0000000027&openerCode=1)
- [Cabinet order 155  Order for Enforcement of the Law of Use on Personal Identification Number in Administrative Procedures](http://elaws.e-gov.go.jp/search/elawsSearch/elaws_search/lsg0500/detail?lawId=426CO0000000155)
- [Ministerial order 70 of MOF, 2014, Specification of Corporate Number](ttp://elaws.e-gov.go.jp/search/elawsSearch/elaws_search/lsg0500/detail?lawId=426M60000040070&openerCode=1)
Androidエミュレータにアプリをプリインストールする

## 目的
エミュレータの `/system/priv-app/` 内にアプリをインストールする．
プリインストールアプリの開発の足しにする．

## 環境
Windows10 64bit
Android エミュレータ Android7.0 

## 方法
コマンドプロンプトからEmulatorを `-writable-system` で起動する．
`emulator -writable-system -netdelay none -netspeed full -avd Nexus5`
* emulatorはAndroid-SDKフォルダ内のemulatorフォルダ内にある．

ADBをroot権限で実行する．
`adb root`

/systemディレクトリを書き込み可能でマウントする.
`adb remount`

/system/priv-appディレクトリ内にapkを配置する．
`adb push application.apk /system/priv-app`

エミュレータを再起動する．
`adb reboot`
MacでUbuntu18.04LTSのブートUSBを作成する

##はじめに
Ubuntu公式サイトのチュートリアル(英語) [Create a bootable USB stick on macOS](https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-macos#0) を参考に、下記の手順で行います。

1. USBメモリをフォーマット(初期化)する
1. Ubuntu ISOファイルをダウンロードする
1. Etcherを使ってブートUSBを作成する

※作成したブートUSBを元のUSBメモリに戻す方法も最後に記載します

##環境
MacOS High Sierra 10.13.4
USBメモリ 4GB

##USBメモリをフォーマット(初期化)する
2GB以上のUSBメモリを用意し、フォーマットを行います。
詳しくは[MacでUSBメモリをフォーマットする方法](https://pc-karuma.net/mac-format-usb-flash-drive/)を参考にしてください。

1. USBをMacに差し込む
1. 「ディスクユーティリティ」を起動する
1. フォーマットに「MS-DOS（FAT）」を選択して「削除」をクリックする

##Ubuntu ISOファイルをダウンロードする
[公式サイト](https://www.ubuntu.com/download)からお好きなバージョンを指定してダウンロードします。
今回は[Ubuntu Desktop 18.04 LTS](https://www.ubuntu.com/download/desktop)を選択しました。
ダウンロードに数分かかりますが、完了するとダウンロードフォルダ`~/Downloads/`に「ubuntu-18.04-desktop-amd64.iso」というファイルが保存されます。

##Etcherを使ってブートUSBを作成する
[Etcher](https://etcher.io/)はオープンソースのブートUSB作成ツールです。
詳しくは[簡単な3ステップで使えるブートUSB作成ツール「Etcher」](http://terufusa.blog.jp/archives/24477397.html)を参考にしてください。

1. [Etcher](https://etcher.io/)をインストールする
1. Etcherを起動する
1. 「Select image」で先ほどダウンロードした「ubuntu-18.04-desktop-amd64.iso」を選択する
1. 「Flash!」をクリックする

5~10分程度で完了すると思います。
これでブートUSBの完成です。

##ブートUSBを元のUSBメモリに戻す方法
ブートUSBから元のUSBメモリに戻す場合は「ディスクユーティリティ」ではできない場合があります。
その場合はMacに標準で入っている「diskutil」コマンドを用います。
とは言っても簡単で「ターミナル」を起動して下記のようにいくつかコマンドを入力するだけ。

まず、ブートUSBを差し込む前に「ターミナル」から次のコマンドを入力します。

```terminal
diskutil list
```
![1.png](https://qiita-image-store.s3.amazonaws.com/0/120992/03f21692-c07d-954c-4b4b-24a4bf6288ec.png)


次に、ブートUSBを差し込んで再度同じコマンドを入力します。
そうすると次の画像のように「disk」が増えていることがわかります。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/120992/557478af-2d93-8886-41e6-ac077aed8adf.png)

ここでは`/dev/disk2`ですが、ご自身の出力結果に当てはめて下記のコマンドを入力します。

```terminal
diskutil unMountDisk /dev/disk2
```
このように出力されればOKです。

```terminal
Unmount of all volumes on disk2 was successful
```
最後に下記のコマンドを入力します。
「*****」の部分にはUSBに付けるためのお好きな名前を入力してください。

(2018/12/26追記)
ここではmacOS用の `HFS+` というファイルシステムを指定していますが、Windowsなどでも使用する場合は `FAT32` に変更して実行してください。ファイルシステムに関しては他にもいくつか種類があるので、本記事コメント欄や[「ファイルシステムについて」](http://qa.elecom.co.jp/faq_detail.html?id=4047)を参考にしてください。

```terminal
diskutil eraseDisk HFS+ ***** /dev/disk2
```
このように出力されれば完了です。
これで元のUSBメモリに戻すことができました。

```terminal
Finished erase on disk2
```
参考: [MacでHDDをフォーマットする手順とエラー時の対処方法](http://degilog.jp/mac-hddformat/)

##最後に
今回はMacでUbuntu18.04LTSのブートUSBを作成しました。
これを使って自作したGPUを動かすOSをインストールしたいと思っていますが、その件についてはまた次回にでも書きたいと思います。
最後まで読んでいただき、ありがとうございました。
EFIシステムパーティションの削除

#はじめに

Macでバックアップ用に使っていたハードディスクをWindowsで再利用しようと思ったのですが、 「EFIシステムパーティション」は、Windowsの[コンピュータ管理]-[ディスクの管理]からでは削除できないようです。

ので、diskpartというコマンドを使って削除しました。
その手順の覚え書きです。
ハードディスクはWindowsマシンに繋ぎ、Windows上で作業します。

#diskpart

##起動

[スタートメニュー]の[プログラムとファイル検索]に「cmd」と打ち込むか、[スタートメニュー]-[すべてのプログラム]-[アクセサリ]-[コマンド プロンプト]で機動します。

##diskpart起動

コマンドプロンプトでsiskpartを実行します

```
C:\Users\hoge>diskpart
```

「ユーザーアカウント制御」ダイアログが開き「次のプログラムにこのコンピュータへの変更を許可しますか？」と聞かれますので[はい(Y)]をクリックすると、コマンドプロンプトに似た新しいウィンドウが開きます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/222823/203a735b-f568-0b07-2579-9fde5cabbe5f.jpeg" width=600>

以下、このウィンドウで作業します。

##ディスクの状態を確認

list disk を実行すると、ディスクの状態が表示されます。

```
DISKPART> list disk

  ディスク       状態           サイズ   空き   ダイナ GPT
  ###                                         ミック
  ------------  ------------  -------  -------  ---  ---
  ディスク 0    オンライン           465 GB      0 B
  ディスク 1    オンライン           931 GB      0 B
  ディスク 2    オンライン           232 GB      0 B 
```

##ディスク選択

select disk n を実行すると、作業したいディスクが選択されます。
nは、list diskで表示されたディクスの番号です。

```
DISKPART> select disk 2
　
ディスク 2 が選択されました。
```

ディスク状態を確認。選択したディスクに「＊」が付きます。

```
DISKPART> list disk

  ディスク       状態           サイズ   空き   ダイナ GPT
  ###                                         ミック
  ------------  ------------  -------  -------  ---  ---
  ディスク 0    オンライン           465 GB      0 B
  ディスク 1    オンライン           931 GB      0 B
* ディスク 2    オンライン           232 GB      0 B 
```

##パーティション状態の表示

list partition を実行すると、選択したディスクのパーティション状態が表示されます。

```
DISKPART> list partition

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    システム                 200 GB    20 KB
```

##パーティション選択

select partition n を実行すると、作業したいパーティションが選択されます。
nは、list partitionで表示されたパーティション番号です。

```
DISKPART> select partition 1
　
パーティション 1 が選択されました。
```

パーティション状態を確認。選択したパーティションに「＊」が付きます。

```
DISKPART> list partition

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
* Partition 1    システム                 200 GB    20 KB
```

##パーティション削除

delete partition を実行すると、選択されたパーティションが削除されます。

```
DISKPART> delete partition

仮想ディスク サービス エラー:
force protected パラメーターを設定しないと、保護されたパーティションは削除できません。
```

エラーがでました(T0T)
ので、ヘルプを確認

```
DISKPART> help delete partition

    フォーカスされているパーティションを削除します。

構文:  DELETE PARTITION [NOERR] [OVERRIDE]

    NOERR       スクリプト専用です。エラーが発生しても、DiskPart は
                エラーが発生しなかったかのようにコマンドの処理を続けます。
                NOERR パラメーターがない場合は、DiskPart はエラー コードを
                生成して終了します。

    OVERRIDE    DiskPart で、種類に関係なく任意のパーティションを削除
                できます。通常、DiskPart では、既知のデータ パーティション
                の削除のみを許可します。

    システム パーティション、ブート パーティション、あるいはアクティブな
    ページング ファイルまたはクラッシュ ダンプ (メモリ ダンプ) ファイルを含む
    パーティションは、削除できません。

    この操作を完了するには、パーティションを選択する必要があります。

    パーティションは、ダイナミック ディスクから削除することも、ダイナミック
    ディスク上に作成することもできません。

例:

    DELETE PARTITION
```

とりあえずOVERRIDEオプションをためしてみました。

```
DISKPART> delete partition override

DiskPart は選択されたパーティションを正常に削除しました。
```

無事削除できました。

##diskpartの終了

exitコマンドで終了します。

```
DISKPART>exit
```

コマンドプロンプトもexitで終了します。

```
C:\Users\hoge>exit
```
TypeScriptで Redux の Reducer部分を型安全かつスッキリ書く

# はじめに
TypeScript 2.8がリリースされ色々な機能が追加されました。
その中でも*Conditional types*、特に*ReturnType*がなかなか優秀で
今まで諦めていた部分がきれいに書けるようになっております。

そこで個人的にずさんになりがちな、ReduxのReducer周りを少し改良してみたのでご紹介

# コード
```typescript
const INCREMENT = 'app/example/INCREMENT' as const;
const SET_COUNT = 'app/example/SET_COUNT' as const;

export const increment = () => ({
  type: INCREMENT,
});

export const setCount = (num: number) => ({
  type: SET_COUNT,
  payload: {
    count: num,
  },
});

type Actions = (
  | ReturnType<typeof increment>
  | ReturnType<typeof setCount>
);

interface AppState {} // 本記事の趣旨に関係ないため割愛 
const initialState: AppState = {};

export default function reducer(
  state: AppState = initialState,
  action: Actions,
) {
  switch (action.type) {
    case INCREMENT:
      console.log(action.payload);
      // ↑ SET_COUNT以外でpayloadを参照するとエラーになる
      break;

    case SET_COUNT:
      console.log(action.payload);
      // ↑ OK
      break;

    default:
      const _: never = action;
      // ↑ ケースの定義もれがあった場合にエラーになる
  }
}
```
下で要点を解説していきます
また、今回は型をテーマにしていますので、
Reducerの処理自体は空っぽにしております

### ReturnTypeの利用


TypeScript2.8の機能であるReturnTypeを利用することで、
ActionCreator関数の戻り値からActionの型を特定することができるようになりました。
こうすることでAction型定義の管理が少しだけ楽になります。

```typescript
type Actions = (
  | ReturnType<typeof increment>
  | ReturnType<typeof setCount>
);

// ↓ こう解釈される

type Actions = {
    type: "app/example/INCREMENT";
} | {
    type: "app/example/SET_COUNT";
    payload: {
        count: number;
    };
}
```

TypeScript3.4で導入された `const assertion` を利用することで各定数が`string`ではなく、
その文字列の型として定義されるため↑のようにtypeが各アクションとして認識されます。

```typescript
const INCREMENT = 'app/example/INCREMENT' as const;
const SET_COUNT = 'app/example/SET_COUNT' as const;
```


### defaultの部分
`default`部分の`never`型への代入については[TypeScript 2.0のneverでTagged union typesの絞込を漏れ無くチェックする](https://qiita.com/wadahiro/items/9ec4af968a7314402499#_reference-ea5a7c38d951fc383cd3) の記事で紹介されている素敵なテクニックです。

# 最後に
TypeScriptではanyを多用すればエラーを黙らせることはできますが
いかにして型安全に設計・実装できるかを考えるのが楽しいですよね。

実はもっといい方法があるのではないかと
うずうずしていますので、いい案があればぜひ教えていただきたいです。

# 参考記事
色々参考にさせていただきました。

- [Redux typed actions でReducerを型安全に書く (TypeScriptのバージョン別)](https://qiita.com/wadahiro/items/7c421b668f28a99e2a29)
- [TypeScript 2.0のneverでTagged union typesの絞込を漏れ無くチェックする](https://qiita.com/wadahiro/items/9ec4af968a7314402499#_reference-ea5a7c38d951fc383cd3)
- [真・Flow & Redux で Reducer の実装パターンを考える
](https://qiita.com/mizchi/items/0e2db7c56541c46a7785)
AWS CLI備忘録　S3バケット作成

# 前提
- AWS Cliがインストールされており、アプリケーションからコマンドが実行可能なこと
- 実行環境にAWSアカウントのアクセスキーが設定されてること
'aws configure' で設定する必要あり
- アクセスキーの取得元アカウントにS3の権限が付与されていること

# S3バケット生成
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/using-s3-commands.html
任意のバケット名で　S3バケットを生成する
`aws s3 mb s3://bucket-name`

# S3 バケット存在チェック
`aws s3 ls s3://bucket-name`

※作成直後だと空なので戻り値無し。
バケットが無いと以下のエラーが返る
`An error occurred (NoSuchBucket) when calling the ListObjects operation: The specified bucket does not exist
`

# S3バケット ウェブホスティング設定
ウェブホスティングの設定はポリシーではなく以下のコマンド
`aws s3 website s3://bucket-name --index-document index.html
`

# S3バケット ポリシー設定
https://docs.aws.amazon.com/cli/latest/reference/s3api/put-bucket-policy.html

ウェブホスティングのポリシー適用
```
aws s3api put-bucket-policy --bucket bucket-name --policy file://policy.json

policy.json:
{
  "Version":"2012-10-17",
  "Statement":[{
     "Sid":"PublicReadGetObject",
     "Effect":"Allow",
     "Principal": "*",
     "Action":["s3:GetObject"],
     "Resource":["arn:aws:s3:::bucket-name/*"]
  }]
}
```

以後、CloudFrontのディストリビューション作成、Route５３の登録までCLIで実行してみる。
整数のオーバーフローで忘れがちなケース

プログラマの方は、演算時には、オーバーフローに関しては、
常に気を使っていると思いますが、
それでも忘れがちなケースを簡単にまとめます。

この記事は、以下の内容からピックアップした外伝的な内容です。

* 『[破滅的プログラミングの末路#01 「整数の絶対値でやらかす」](https://qiita.com/thrzn41/items/7fdbfd9e13fb3369380c)』
* 『[破滅的プログラミングの末路#03 「整数の比較、"a > b"なら、"a - b > 0"だと思い込んでやらかす」](https://qiita.com/thrzn41/items/ca83535433d702546d35)』


# 1. 話しを単純にするための前提条件

話しを単純にするために、32bitの符号付き整数型を想定します。
今回の内容に関しては、精度が決まっている符号付きの整数型であれば、
他のサイズでも該当するはずです。

Java, C#, C/C++では、
int、Int32, int32などを思いうかべると良いかと思います。
(C/C++では、int型が32ビットの処理系を想定。)


# 2. 乗算(掛け算)での忘れがちなオーバーフロー

大きな数値同士の掛け算とかは、オーバーフローしやすいのは、
すぐイメージできると思うので、本題ではありません。

本題としては、以下のようなケースです。

* C#

``` csharp
int a = Int32.MinValue;
int b = -1;

int answer = a * b;
```

* Java

``` csharp
int a = Integer.MIN_VALUE;
int b = -1;

int answer = a * b;
```

* C/C++

``` cpp
int a = INT_MIN;
int b = -1;

int answer = a * b;
```

`a`には、`-2147483648`が入っていますが、
`-1`を掛けると、32ビットの符号付き整数で表現可能な`2147483647`を超えます。
手元の環境では、いずれも`answer`変数の結果は、`-2147483648`になりました。
C#に関しては、`checked`にした場合は、OverFlowExceptionが発生します。

> ビルドやコンパイル時点で、値が評価できる場合は、
> その時点で、オーバーフローを検出する場合もあります。


# 3. 除算(割り算)での忘れがちなオーバーフロー

整数の割り算では、オーバーフローは発生しないと、
勘違いされているケースもありますが、ちゃんと(？！)オーバーフローする場合があります。

* C#

``` csharp
int a = Int32.MinValue;
int b = -1;

int answer = a / b;
```

* Java

``` csharp
int a = Integer.MIN_VALUE;
int b = -1;

int answer = a / b;
```

* C/C++

``` cpp
int a = INT_MIN;
int b = -1;

int answer = a / b;
```

掛け算の場合と同様ですが、
`-1`で割ると、`-1`を掛けるとの同じことなので、
32ビットの符号付き整数で表現可能な`2147483647`を超えます。
手元の環境では、Javaでは、`answer`変数の結果は、`-2147483648`になりました。
C++では、整数オーバーフローの例外が発生しました。
**C#に関しては、`checked`かどうかにかかわらず、OverFlowExceptionが発生します。**


# 3. まとめ

* `-1`を掛けると符号反転するとは限らない(オーバーフローするかもね)。
* 整数の割り算もオーバーフローする場合がある。
* 整数の割り算のオーバーフローの場合は、言語・環境でクセがある。
Cordova で iOS だけ通知をタップしても callback が実行されない

phonegap-plugin-push と　cordova-plugin-local-notifications には互換性がなく、2つのプラグインをインストールしていた場合, iOS で通知をタップしても 'notification' イベントが呼ばれません。

```javascript
const option = {/* オプション */}
const push = PushNotification.init(option)

push.on('notification', (data) => {
  // --- Not called ---
})
```

対策としてはこの2つのプラグインを同時に使うのをやめることです。

参考：
https://github.com/katzer/cordova-plugin-local-notifications/issues/1311
https://github.com/phonegap/phonegap-plugin-push/issues/1959
AIに支援してもらいながらコーディングできる Visual Studio IntelliCode - Preview を使ってみた

__本情報の内容（添付文書、リンク先などを含む）は、作成日時点でのものであり、予告なく変更される場合があります__

# はじめに
Visual Studio IntelliCode とは、2018年5月7日（米国時間）に Microsoft Build で発表された Visual Studio の Extension で、現在は Experimental Extention という実験的な位置づけです。__AI-powered IntelliSense__ とあるように、Visual Studio の便利機能（現在では Visual Studio Code 等のエディタにも幅広く実装されている）IntelliSense という入力支援機能を更に強化するものです。
昔、プログラミングは写経のように関数名や変数を1文字違わずエディタに入力し、コンパイラが通ったものを実行するというものでしたが、この IntelliSense によって、文字列の一部を入力すると入力候補が表示されるため一字一句覚えていなくてもなんとなくでコーディングができるようになりました。
その機能を更に AI (IntelliCode は2000以上ある GitHub のリポジトリにあるソースコードのうち、スターが100個以上あるものをもとに機械学習しています。)の力で拡張するというものです。変数の使用間違いも指摘する機能もあります。現時点では__C#のみ__サポートされています。

動作時に、__.editorconfig__ という設定ファイルを生成します。
どういう仕組みで、何ができるかの詳細については、[Introducing Visual Studio IntelliCode](https://blogs.msdn.microsoft.com/visualstudio/2018/05/07/introducing-visual-studio-intellicode/)に動画デモもあるのでそちらをご参照ください。


# インストール
## 前提環境
- Visual Studio 15.7 preview 5 以降
- 私の環境は下記のとおりです。
 ![2018-05-08_12h42_02.png](https://qiita-image-store.s3.amazonaws.com/0/135357/ca04c166-877a-5bbb-4631-a8313e30f76e.png)

![2018-05-08_12h38_44.png](https://qiita-image-store.s3.amazonaws.com/0/135357/652127da-f57f-4390-061a-d4dbd67ce6b3.png)

## エクステンションのダウンロード＆インストール
[Visual Studio IntelliCode - Preview ](https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.VSIntelliCode)にアクセスします。
__Download__ ボタンを押すとインストールが開始されます。
![2018-05-08_12h08_10.png](https://qiita-image-store.s3.amazonaws.com/0/135357/b2a00866-93f4-4d06-8526-ba61a520d9ba.png)

![2018-05-08_12h06_40.png](https://qiita-image-store.s3.amazonaws.com/0/135357/b997cfa3-4d23-da88-7c3b-92d119f6f11a.png)

![2018-05-08_12h07_44.png](https://qiita-image-store.s3.amazonaws.com/0/135357/b49ed8e1-1daa-045a-9f0d-e7d6dbe6c651.png)

## つかってみた感想（個人の意見です。）
一般的にはプロジェクトごとにコーディングのお作法（コーディングガイド）があるのですが、そういう細かいことを気にしないでコードが書けるというのは魅力的ではないかと思います。
大規模なプロジェクトで技術者のレベルのばらつきを吸収するために、この機能やLive Share の機能を使うと効果が見込めます。
ただ、Hello World レベルのコードにはあまりその恩恵を実感するのは難しいと思いました。

# 参考リンク
- [Introducing Visual Studio IntelliCode](https://blogs.msdn.microsoft.com/visualstudio/2018/05/07/introducing-visual-studio-intellicode/)
- [Visual Studio IntelliCode - Preview ](https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.VSIntelliCode)
- [Create portable, custom editor settings with EditorConfig](https://docs.microsoft.com/en-us/visualstudio/ide/create-portable-custom-editor-options)
YouTubeにパンコントロール機能を追加するChrome拡張を開発した

YouTubeのプレイヤーに直接UIを追加して**音声のパンニング（左右の振り分け）**を可能にするChrome拡張を作った。
■追記：現在はニコ生、OPENREC、SHOWROOMなど10以上のサイトに対応。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/91479/61bd0605-7491-c3cd-053e-821f8937fb7c.png)


こんな感じで、なるべく画面に溶け込むように調整した。
[ここ](https://chrome.google.com/webstore/detail/panvideo/gpfhajmppnhpfkokaidnlepfkhblpiol)からインストールできる。

##目的と特徴
複数の配信を同時に見るときに、画面の位置と音の位置を同期させることによって聞き取りやすくなるような気がする。
プレイヤーに直接コントローラーを埋め込むことで、**素早く&直感的に**使えるようにした。

##使ったもの
- Content Scripts
 - これによって画面内に要素を追加できる。

- Web Audio API
 - [StereoPannerNode](https://developer.mozilla.org/ja/docs/Web/API/StereoPannerNode)を使って音声を操作する。

- jQuery
 - 要素の追加とリスナーをシンプルに記述するために。

##実装のポイント
動画の場合、音声ソースは**video要素**を指定する。

```javascript:content-script.js
const audioCtx = new (window.AudioContext || window.webkitAudioContext)();
const video = document.querySelector('video');
const audioSource = audioCtx.createMediaElementSource(video);
```

コントローラーは```<input type="range">```を使った。
rangeはデフォルトだと0〜100の値になっているので```min='-1' max='1'```としてあげることで、StereoPannerNodeに適した値を渡すことができる。

また、AudioContextはvideo要素が既にある状態でないと扱えないので、サイトによってタイミングの調性が必要になる。
大抵の場合はMutationObserverでなんとかなるが、backgroundのchrome.tabs.onUpdated.addListenerを使う方法もあるっぽい。

```javascript:content-script.js

// 共通の関数
function setPan(html, point) {
    // スライドバーを挿入
	$(`${html}`).insertAfter(`${point}`);

    // オーディオノードをごにょごにょと繋げる
	const audioCtx = new (window.AudioContext || window.webkitAudioContext)();
	const video = document.querySelector('video');
	const audioSource = audioCtx.createMediaElementSource(video);
	const panNode = audioCtx.createStereoPanner();
	audioSource.connect(panNode);
	panNode.connect(audioCtx.destination);

     // スライドバーの動きに合わせて音声の位置を移動する
	$('input.pan-range').on("input", ()=> {
		const val = $(this).val();
		$(this).attr("value",val);
		panNode.pan.setValueAtTime(val, audioCtx.currentTime);
	});
}

// いい感じのタイミングでこれを発火
setPan("<input class='pan-range' type='range' min='-1' max='1' step='0.2' value='0'>", "サイトによって丁度いいところ");
```

##反応を見る
Content Scriptsは見た目のインパクトが強いから、ちょっとした機能でも反応が貰える。
[画像つきでツイート](https://twitter.com/nulltypo/status/995216194549440512)するといい。

あとは、[リツイート直後のツイートを表示するやつ](https://retweets.pronama.jp/)を使うと、間接的な言及も拾える。

実は初めてChrome拡張作ったんだけど、数時間の作業で**「神」**とか言われるからすごい。無料だからお賽銭は貰えないけど。
【Laravel】Controllersと同じ階層に他のControllersディレクトリを追加したいときに注意すること


前にも似たような記事を書いてた
https://qiita.com/shosho/items/e48df37b9ff9b73e1914

## APIControllersディレクトリを作成

![Screen Shot 2018-05-08 at 14.32.05.png](https://qiita-image-store.s3.amazonaws.com/0/109241/0a2506ba-e0b5-e9c0-9bfa-fcca0a74fa88.png "Screen Shot 2018-05-08 at 14.32.05.png")

これで単純に `api.php` 側でuse、 APIController側で名前空間を設定したらOK

![Screen Shot 2018-05-08 at 14.34.45.png](https://qiita-image-store.s3.amazonaws.com/0/109241/1be818b0-0bc7-bf25-3390-204be7ddd105.png "Screen Shot 2018-05-08 at 14.34.45.png")

![Screen Shot 2018-05-08 at 14.35.11.png](https://qiita-image-store.s3.amazonaws.com/0/109241/440426dd-52c2-7c58-468b-866ddde9c658.png "Screen Shot 2018-05-08 at 14.35.11.png")

とはいかない。

![Screen Shot 2018-05-08 at 14.36.49.png](https://qiita-image-store.s3.amazonaws.com/0/109241/a5b4d178-72a4-04ad-dd8b-e6a093198610.png "Screen Shot 2018-05-08 at 14.36.49.png")

## 解決法

`RouteServiceProvider.php` で名前空間が指定されてしまっているので

![Screen Shot 2018-05-08 at 14.37.46.png](https://qiita-image-store.s3.amazonaws.com/0/109241/ea3555e5-537d-0361-0ccc-66c8513fbcd1.png "Screen Shot 2018-05-08 at 14.37.46.png")

![Screen Shot 2018-05-08 at 14.37.59.png](https://qiita-image-store.s3.amazonaws.com/0/109241/4bfb583d-83ce-66e2-c96c-bd06bee02e37.png "Screen Shot 2018-05-08 at 14.37.59.png")

そこをコメントアウトする必要がある。

![Screen Shot 2018-05-08 at 14.39.38.png](https://qiita-image-store.s3.amazonaws.com/0/109241/74c0a24a-f23c-bd4c-724e-5eae7ae83b8b.png "Screen Shot 2018-05-08 at 14.39.38.png")

![Screen Shot 2018-05-08 at 14.39.47.png](https://qiita-image-store.s3.amazonaws.com/0/109241/458af66d-a07b-bed1-d43d-1f0f8542c5c5.png "Screen Shot 2018-05-08 at 14.39.47.png")
MacでVS Code をターミナル/Cliから起動する方法

Windowsだとインストール時についでで

```
code
```
で起動してくれるけど、Macではしてくれない orz...

探したら、公式で簡単な方法を教えてくれていたのでその紹介。
[Running VS Code on macOS](https://code.visualstudio.com/docs/setup/mac)

1. VSCodeのインストール
2. VSCode開く
3. Shift + コマンド + p
4. "shellcommand" で検索
5. "シェルコマンド:PATH内に'code'コマンドをインストールします

以上。

簡単。

これでgitのデフォエディターをVSCodeにできる。。。
【OpenCV】仮想環境(ubuntu)でWebカメラ撮影

#はじめに
■目的
仮想環境(virtualbox)上のUbuntuにOpenCVを入れて、Webカメラで動画撮影をする

#環境
今回使用した環境

■ソフトウェア
仮想環境：VirtualBox(ubuntu16.04)
画像処理ライブラリ：OpenCV(バージョン3.2.0)

■ハードウェア
Webカメラ:UVC対応のもの今回は『ロジクールC310』を使用

#手順
##OpenCVのインストール
以下を参考にインストール
https://github.com/atinfinity/lab/wiki/Linux%E7%92%B0%E5%A2%83%E3%81%A7%E3%81%AEOpenCV%E3%83%93%E3%83%AB%E3%83%89#ubuntu16.04

※注意点
『CMakeの実行』の実行の際に以下のオプションを変更する。これがないとOpenCVがV4Lに対応してくれない。
-D WITH_V4L=ON

##ソース
こちらの記事を参考にさせて頂きました。
https://qiita.com/vs4sh/items/4a9ce178f1b2fd26ea30
[Mac]めちゃ速い検索コマンドmdfind

##　つまり
これ：`mdfind`

```sh
mdfind -name {searchText}
```

## 要点
+ Spotlight の検索メタデータを使って検索する
    + つまり**速い**
+ ファイル名だけでなく中身を見て検索してくれる

`grep`ほど考えて検索はしない場合、などとりあえず検索するときにオススメ
JavaScript素数判定のプログラムを作ってみた


関数型で素数を判定するプログラムを書いてみたがあっているのだろうか？？
もっといい方法があれば教えて欲しいです。

```JavaScript

//開始値
const start = 2
//終了値
const end = 100

//数値の生成
let range = function(min,max){
    return [...Array(max - min + 1).keys()].map(x => x + min)
}
range(start, end).filter( i => {
    const s = Math.round(Math.sqrt(i))
    return range(2,s).every(j => {
        return i % j != 0 
    })
}).forEach( i => {console.log(i)})

```
【Webview】unity-webview / UniWebView3



## unity-webview

https://github.com/gree/unity-webview

### シンプルに表示

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SimpleWebView : MonoBehaviour {

    private string url = "https://www.google.co.jp/";
    WebViewObject webViewObject;

	void Start () {
        webViewObject = (new GameObject("WebViewObject")).AddComponent<WebViewObject>();
        webViewObject.Init((msg) => {
            Debug.Log(msg);
        });
        webViewObject.LoadURL(url);
        // 中央に配置
        webViewObject.SetMargins(Screen.width / 4, Screen.height / 4, Screen.width / 4, Screen.height / 4);
        webViewObject.SetVisibility(true);
	}
}
```


### ローカルファイルを表示

・`Assets/StreamingAssets/`以下にHTMLなど必要ファイルを配置

・ファイルの読み込みは`webViewObject.LoadURL("file://${filePath}");`に変更する。

```
string filePath = System.IO.Path.Combine(Application.persistentDataPath, "sample.html");
webViewObject.LoadURL("file://" + filePath.Replace(" ", "%20"));
```



> 参考
[Unity上でWebViewを開く unity-webview](http://tsubakit1.hateblo.jp/entry/20130523/1369316363)
[Unity3Dのgree webviewでローカルHTMLを表示し、JSからUnityのコードを実行してファイル読み書きする](http://oredon.guitarkouza.net/blog/2016/04/unity3d-gree-webview-file.php)




## UniWebView3

https://www.assetstore.unity3d.com/jp/?stay#!/content/92605
http://docs.uniwebview.com/api/

### シンプルに表示

空のオブジェクトに`UniWebView.cs`をアタッチするだけ。

![スクリーンショット 2018-05-08 11.52.54.png](https://qiita-image-store.s3.amazonaws.com/0/136286/aee58bd7-b11c-fad5-f73b-13f6af870c6f.png "スクリーンショット 2018-05-08 11.52.54.png")



### ローカルファイルを表示

・任意のオブジェクトに、デモの中にある`LocalHTMLSceneManager.cs`をアタッチ。

・fileNameに`Assets/StreamingAssets/`以下に配置したファイルのパスを記入。

・任意のタイミングで`LoadFromFileメソッド`を叩く。

```csharp:LocalHTMLSceneManager.cs
using UnityEngine;

public class LocalHTMLSceneManager : MonoBehaviour {
    public string fileName;
    public string htmlText;
#if UNITY_IOS || UNITY_ANDROID || UNITY_WP8
    public void LoadFromFile() {

        var webView = CreateWebView();
        webView.url = UniWebViewHelper.streamingAssetURLForPath(fileName);
        webView.Load();
        webView.Show();
    }
    
    public void LoadFromText() {
        var webView = CreateWebView();

        webView.LoadHTMLString(htmlText, null);
        webView.Show();
    }

    UniWebView CreateWebView() {
        var webViewGameObject = GameObject.Find("WebView");
        if (webViewGameObject == null) {
            webViewGameObject = new GameObject("WebView");
        }

        var webView = webViewGameObject.AddComponent<UniWebView>();

        webView.toolBarShow = true;
        return webView;
    }

#else //End of #if UNITY_IOS || UNITY_ANDROID || UNITY_WP8
    void Start() {
        Debug.LogWarning("UniWebView only works on iOS/Android/WP8. Please switch to these platforms in Build Settings.");
    }
#endif
}
```

> 参考
[UNITYでのWEBVIEW（埋め込みブラウザ）について](https://dev.alomarron.com/blog/unity-webview)
Level 15. Naught Coin（The Ethernaut）

「The Ethernaut by Zeppelin Level 15. Naught Coin」を翻訳してみました（[CryptoZombies](https://cryptozombies.io/)のように？）
## **原文はこちら**
https://ethernaut.zeppelin.solutions/
15. Naught Coinをクリック
## 15. Naught Coin
難易度 5/6
NaughtコインはERC20トークンであり、お主は既にすべてのトークンを保持している。
しかし、Naughtコインは10年間のロックアウト期間後に、転送が可能であることを理解しなければならない、お主はいつでも自由にNaughtコインを転送できるようする為、別のアドレスを取得する方法を把握しているかな？
このレベルのクリア条件はお主のトークン残高を0にすることである。
##### **回答の助けになるヒント**
- ERC20の仕様について
- OpenZeppelinのコードベースについて

## **ソースコード**

```javascript:
pragma solidity ^0.4.18;

import 'zeppelin-solidity/contracts/token/ERC20/StandardToken.sol';

 contract NaughtCoin is StandardToken {

  string public constant name = 'NaughtCoin';
  string public constant symbol = '0x0';
  uint public constant decimals = 18;
  uint public timeLock = now + 10 years;
  uint public INITIAL_SUPPLY = 1000000 * (10 ** decimals);
  address public player;

  function NaughtCoin(address _player) public {
    player = _player;
    totalSupply_ = INITIAL_SUPPLY;
    balances[player] = INITIAL_SUPPLY;
    Transfer(0x0, player, INITIAL_SUPPLY);
  }
  
  function transfer(address _to, uint256 _value) lockTokens public returns(bool) {
    super.transfer(_to, _value);
  }

  // Prevent the initial owner from transferring tokens until the timelock has passed
  modifier lockTokens() {
    if (msg.sender == player) {
      require(now > timeLock);
      if (now < timeLock) {
        _;
      }
    } else {
     _;
    }
  } 
} 
```
Level 14. Gatekeeper Two（The Ethernaut）

「The Ethernaut by Zeppelin Level 14. Gatekeeper Two」を翻訳してみました（[CryptoZombies](https://cryptozombies.io/)のように？）
## **原文はこちら**
https://ethernaut.zeppelin.solutions
14. Gatekeeper Twoをクリック
## **14. Gatekeeper Two**
難易度 5/6
このゲートキーパーにはいくつかの新しい課題があるぞ。 このレベルのクリア条件は、(13. Gatekeeper Oneと同様)参加者として登録することだ。

##### **回答の助けになるヒント**
- 最初のゲートキーパー（13. Gatekeeper One）をクリアして学んだことを思い出せ。最初のゲートは「13. Gatekeeper」と同じだ。
- 第2ゲートのassemblyキーワードは、[バニラ](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%8B%E3%83%A9_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2))solidityであるコントラクトに対し、ネイティブでない機能にアクセスすることを可能にする。 詳細は[こちら](http://solidity.readthedocs.io/en/v0.4.23/assembly.html) 
このゲートの「extcodesize」コールは、指定されたアドレスのコントラクトコードのサイズを取得するぞ。これは、[yellow paper](https://ethereum.github.io/yellowpaper/paper.pdf) の「7. Contract Creation」を確認すれば設定された方法と時期について詳しく知ることが出来るぞ。
- 3番目のゲートの「^」はビット演算子（XOR）で、ここでは、他の一般的なビット演算子（[ここ](http://solidity.readthedocs.io/en/v0.4.23/miscellaneous.html#cheatsheet)を参照）を適用するために使用されている。「3. Coin Flip」は、この問題に挑戦する際に確認するのにも適しているぞ。

## **ソースコード**

```javascript:
pragma solidity ^0.4.18;

contract GatekeeperTwo {

  address public entrant;

  modifier gateOne() {
    require(msg.sender != tx.origin);
    _;
  }

  modifier gateTwo() {
    uint x;
    assembly { x := extcodesize(caller) }
    require(x == 0);
    _;
  }

  modifier gateThree(bytes8 _gateKey) {
    require(uint64(keccak256(msg.sender)) ^ uint64(_gateKey) == uint64(0) - 1);
    _;
  }

  function enter(bytes8 _gateKey) public gateOne gateTwo gateThree(_gateKey) returns (bool) {
    entrant = tx.origin;
    return true;
  }
}
```
Level 13. Gatekeeper One（The Ethernaut）

「The Ethernaut by Zeppelin Level 13. Gatekeeper One」を翻訳してみました（[CryptoZombies](https://cryptozombies.io/)のように？）
## **原文はこちら**
https://ethernaut.zeppelin.solutions
13. Gatekeeper Oneをクリック
## 13. Gatekeeper One
難易度 5/6
ゲートキーパー(ここではmodifier修飾子)を通過させ、参加者として登録する（enterメソッドからtrueを返す）ことが
このレベルのクリア条件だ。
##### **回答の助けになるヒント**
- 過去に「4. Telephone」と「5. Token」のレベルから学んだことを思い出せ。
- Solidityのドキュメント（[ここ](http://solidity.readthedocs.io/en/v0.4.23/units-and-global-variables.html)と[ここ](http://solidity.readthedocs.io/en/v0.4.23/control-structures.html#external-function-calls)を参照）で特別な変数「msg.gas」及び推奨エイリアス「gasleft()」について詳しく知ることが出来るぞ。

## **ソースコード**

```javascript:
pragma solidity ^0.4.18;

contract GatekeeperOne {

  address public entrant;

  modifier gateOne() {
    require(msg.sender != tx.origin);
    _;
  }

  modifier gateTwo() {
    require(msg.gas % 8191 == 0);
    _;
  }

  modifier gateThree(bytes8 _gateKey) {
    require(uint32(_gateKey) == uint16(_gateKey));
    require(uint32(_gateKey) != uint64(_gateKey));
    require(uint32(_gateKey) == uint16(tx.origin));
    _;
  }

  function enter(bytes8 _gateKey) public gateOne gateTwo gateThree(_gateKey) returns (bool) {
    entrant = tx.origin;
    return true;
  }
}
```
Level 12. Privacy（The Ethernaut）

「The Ethernaut by Zeppelin Level 12. Privacy」を翻訳してみました（[CryptoZombies](https://cryptozombies.io/)のように？）
## **原文はこちら**
https://ethernaut.zeppelin.solutions
12. Privacyをクリック
## **12. Privacy**
難易度 8/6
このコントラクトの開発者は、ストレージ内の機密情報を保護するのに十分な注意を払っているぞ。
このレベルのクリア条件はこのコントラクトのロックを解除すること（すなわちlocked=falseにすること）だ。

##### **回答の助けになるヒント**
- ストレージの仕組みの理解
- パラメータのパージングの理解
- キャスティングの仕組みの理解

##### **Tips:**
metamaskは単なる商品であることを忘れるな。 問題がある場合は、別のツールを使用するのも一つの手だ。上級者向けのゲームプレイには、remixや独自のweb3プロバイダを使用することが出来るぞ。

## **ソースコード**

```javascript:
pragma solidity ^0.4.18;

contract Privacy {

  bool public locked = true;
  uint256 public constant ID = block.timestamp;
  uint8 private flattening = 10;
  uint8 private denomination = 255;
  uint16 private awkwardness = uint16(now);
  bytes32[3] private data;

  function Privacy(bytes32[3] _data) public {
    data = _data;
  }
  
  function unlock(bytes16 _key) public {
    require(_key == bytes16(data[2]));
    locked = false;
  }

  /*
    A bunch of super advanced solidity algorithms...

      ,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`
      .,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,
      *.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^         ,---/V\
      `*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.    ~|__(o.o)
      ^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'^`*.,*'  UU  UU
  */
}
```
Android Emulatorで、DozeやApp Standbyの動作を確認する方法

# はじめに

Android 6.0（API23）以降では、端末のバッテリー寿命を延ばすための省電力機能として「**Doze**」「**App Standby**」があります。  
端末をずっと放置したり、アプリをずっと操作しなかったりした場合に、システムが「端末が使用されていない」「アプリが使用されていない」と判断し、アプリに対してネットワークアクセスの制限などを適用することで、電池の持ちを少しでも良くする機能です。

- どういう条件で「端末が使用されていない」(**Doze**)「アプリが使用されていない」(**App Standby**)と判断されるか
- 「端末が使用されていない」(**Doze**)「アプリが使用されていない」(**App Standby**)とシステムに判断された場合の、アプリの制限はどのようなものか
- アプリがこれらの省電力機能の制限を受けないようにするには、どうすればよいか

については、下記公式サイトに書かれています。

[\[**Android Developers**\]  Doze と App Standby 用に最適化する機能](https://developer.android.com/training/monitoring-device-state/doze-standby.html?hl=ja)


上記サイトには、**Doze** や **App Standby** によってアプリに制限がかけられる状態をエミュレートする方法についても記載されているのですが、
エミュレータでこれらの動作確認を行う場合、若干手順が不足していたり、環境によっては状態をエミュレートすることができなかったりしたので、メモ代わりにまとめておきます。

# Dozeの動作確認手順

1. 以下コマンドを実行  

    ```shell
    > adb shell dumpsys battery unplug
    ```

1. 以下コマンドを実行

    ```shell
    > adb shell dumpsys deviceidle enable
    ```

1. 端末のスクリーンをOFFにする  
    
1. 以下コマンドを実行

    ```shell
    > adb shell dumpsys deviceidle enable
    ```

1. 以降、4を繰り返すと、端末の状態がACTIVE -> IDLE_PENDING -> SENSING -> LOGCATING -> IDLE -> IDLE_MAINTENANCEと遷移する。
(IDLE以降は、IDLE -> IDLE_MAINTENANCE -> IDLE -> IDLE_MAINTENANCE と繰り返される)
**IDLE**となっているときが「端末が使用されていない」と判断されている状態なので、この状態のときにアプリが意図通り動作していることを確認する。

# App Standbyの動作確認手順
1. 以下コマンドを実行

    ```shell
    > adb shell dumpsys battery unplug
    ```

1. 以下コマンドを実行

    ```shell
    > adb shell am set-inactive <パッケージ名> true
    ```

1. 以下コマンドでIdle=trueと表示されることを確認

    ```shell
    > adb shell am get-inactive <パッケージ名>
    Idle=true
    ```
Idle=trueと表示されている場合、「アプリが使用されていない」と判断されている状態。
Idle=falseと表示されている場合は「アプリが使用されていない」と判断されていない。  
    
1. アプリの画面が前面に表示されている場合は、ホームキーを押してアプリをバックグラウンドへ移動する
1. （「アプリが使用されていない」と判断されている状態なので）アプリの動作が意図通りであることを確認する


# OSバージョンによるエミュレータでの動作状況

上記の動作確認手順を、各OSバージョンのAndroidエミュレータで試してみた結果です。
**Doze**の動作確認はAndroid6.0以降のエミュレータで行うことが出来るようです。
**App Standby**の動作確認は、Android8.0未満のエミュレータでは、手順3で常に`Idle=false`となり、「アプリが使用されていない」と判断されている状態をエミュレートすることが出来ませんでした。

| エミュレータの<br>システムイメージ | Doze<br>動作確認 | App Standby<br>動作確認 |
|:-----------:|:---------------:|:---------------------:|
| Android8.1  | 動作確認できた  | 動作確認できた        |
| Android8.0  | 動作確認できた  | 動作確認できた        |
| Android7.1  | 動作確認できた  | 動作確認できなかった  |
| Android7.0  | 動作確認できた  | 動作確認できなかった  |
| Android6.0  | 動作確認できた  | 動作確認できなかった  |
React+PWAを最速で試してみた

# 目的
ReactでできたPWAを自分の環境で試してみたかった。
ちょい前PWAが話題だったけど、忙しくていじれなかったので、なるべく他力本願で最速に試した。

# 流れ
### **1. 有名なやつクローン**
・スター数多い
・活発
・Reactのみでミニマム

https://github.com/Atyantik/react-pwa

上記をクローン

```bash
git clone https://github.com/Atyantik/react-pwa.git

cd react-pwa

npm i
```


### **2. 立てる**
```
npm start
```
なぜかわからないけど、localhost:3003で立つのでアクセス

<img width="479" alt="スクリーンショット 2018-05-08 13.17.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/114895/e6e378b0-1879-d56c-9ce0-3cdedc438b6a.png">

### **3. カスタマイズ**
以下を抑えればおk

・React Routerでルーティング
src内のroutes.jsでルートを決めている
・OGP設定とかもできる
src/page内で各ページのの設定をしている。
以下のようにOGP設定などはここでできる。

```javascript
  seo: {
    title: "Common Title",
    site_name: "My Site Name",
    description: "This is some temporary description, used if no other description is found",
    twitter: {
      site: "@atyantik_tech",
      creator: "@tirthbodawala"
    },
    facebook: {
      admins: [
        "1501220844",
        "765904161",
      ],
    },
    meta: [
      {
        name:"viewport",
        content: "width=device-width, initial-scale=1"
      },
      {
        name:"theme-color",
        content: "#fff"
      },
      {
        charSet: "utf-8",
      },
      {
        httpEquiv: "x-ua-compatible",
        content: "ie=edge",
      }
    ],
  },
```

# まとめ
GoogleでSEO認識されるかとかを調べてみたい。
あとこれiOS版のChromeブラウザ対応してないのか疑問。

# 5/8 18:54追記
OGPはSEO認識されるようです。
Ubuntu でboot ローダを再インストールする

# Ubuntu のブートローダ及び/boot パーティションを再インストールする 
Ubuntu のパッケージアップデート時やオペレーションミス等でLinux が起動しなくなってしまうような状況に陥ってしまった時、諦めてUbuntu を再インストール…ということは無いでしょうか。
その環境、まだ直るかもしれません。
今回はUbuntu16.04 LTS で検証しました。

# 前提条件 
前提条件としてルート("/")のファイルシステムは壊れていないことが前提です。
今回はUbuntu16.04 LTS で以下のデバイス構成でEFI ブートで起動していたものを実際に復旧してみましょう。

```text
/dev/sda1     /boot/efi
/dev/sda2     /boot
/dev/sda3     /
```

なお、BIOS ブートな環境では`/boot/efi` のデバイスがありませんが、基本的にEFI のときと同じ手順で実施可能です。

# Live USB の作成 
Ubuntu16.04 LTS のデスクトップ版(今回はubuntu-14.04.5-desktop-amd64.iso)をダウンロードしてUSB 等のメディアに焼いてください。本手順は説明を割愛します。
USB をマシンに挿したら、マシンの電源を入れてUSB からUbuntu を起動するようにしてください。

# Live USB からUbuntu desktop の起動 
Live USB から起動したらTry Ubuntu (without installing) を選択してください。
そこからターミナルを開いてroot ユーザにて作業をしていきます。

```console:rootユーザになる
$ sudo su -
```

# デバイスのマウント 
復旧したいOS がインストールされているデバイスをマウントしていきます。

```console:mount
# mount /dev/sda3 /mnt
# mount /dev/sda2 /mnt/boot
# mount /dev/sda1 /mnt/boot/efi
```

その他クリティカルな部分もマウントしていきます。

```console:/dev/dev/pts/proc/sys/runのマウント
# for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done
```

マウントが完了したらマウントしたディレクトリにchroot で入っていきます。

```console:chroot
# chroot /mnt
```

# Linux kernel のインストール 
インストールされていたkernel を確認します。

```console:dpkg
$ dpkg --list | grep linux-image
ii  linux-image-4.4.0-116-generic        4.4.0-116.140                              amd64        Linux kernel image for version 4.4.0 on 64 bit x86 SMP
ii  linux-image-extra-4.4.0-116-generic  4.4.0-116.140                              amd64        Linux kernel extra modules for version 4.4.0 on 64 bit x86 SMP
```

今回再インストールするkernel は4.4.0-116 で行っていきます。
kernel を確認したら/boot 領域を一旦全部削除します。

```console:/bootの削除
$ rm -rf /boot/*

// @lunablanca さんのコメントより注釈追記。
// aptの管理外でファイルを削除することになるので、この方法だと、/boot/grub以下に存在する必要な構成ファイル(テーマなど)まで消してしまいます。
// このため、特定のファイルのみ消すか、aptで不要なカーネルなどを削除するようにすべきです。
// もし、それらも削除してしまった場合は、reinstall お願いします。
```

kernel を再インストールします。

```console:kernelの再インストール
# apt-get install --reinstall linux-image-4.4.0-116-generic
```

grub ローダをインストールします。

```console:grub-install
# grub-install --recheck /dev/sda
# update-grub
```

以上で完了です。

```console
# exit      # <- chroot を抜ける
# shutdown -h now
```

chroot を抜けてシャットダウンして、USB ディスクを抜いてマシンの電源を入れてみましょう。
ubuntu が起動してくるはずです。

# 参考 
- How do I recreate a wiped /boot filesystem in Ubuntu
    - https://superuser.com/questions/614257/how-do-i-recreate-a-wiped-boot-filesystem-in-ubuntu

- How can I reinstall GRUB to the EFI partition?
    - https://askubuntu.com/questions/831216/how-can-i-reinstall-grub-to-the-efi-partition
PoseNet:TensorFlow.js動かしてみた

#Twitterでこんな記事が流れてきた
Google、スマートフォン含むWebブラウザでリアルタイムに人間の姿勢推定を可能にする機械学習モデルPoseNet：TensorFlow.jsバーション発表
https://shiropen.com/seamless/google-tensorflow-posenet


すげええええええええ！！！！

#自分のPCで動かしてみよう
gitにもデモがあったので動かしてみました
https://github.com/tensorflow/tfjs-models/tree/master/posenet
npm install @tensorflow-models/posenet だとうまくうごかなかったので
git clone https://github.com/tensorflow/tfjs-models/tree/master/posenet
で落としました。/demosのREADMEに書いてある通りに

cd into the demos folder
`cd demos`
Install dependencies and prepare the build directory:
`yarn`
To watch files for changes, and launch a dev server:
`yarn watch`

yarnを使ったことがなかったので
yarnを使ってみた
https://qiita.com/masterkey1009/items/50f95b1187646a7db385
を頼りにyarnを導入し、READMEに従ったら動きました
<img width="1014" alt="スクリーンショット 2018-05-08 13.04.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/243994/70284049-7cb7-0a2e-6d8a-e6ffad1408a4.png">

すごい！！
js 与えられた配列の最小の数を返す

##題
与えられた整数の配列から、最小の整数を返してください。

```javascript

let findSmallestInt = (args) => {
  //write your code　
}

findSmallestInt([78,56,232,12,8]);//8
findSmallestInt([78,56,232,12,18]);//12
findSmallestInt([78,56,232,12,0])//0
findSmallestInt([34, -345, -1, 100])//-345

```

##使えたもの
sort();
reduce();
Math.min();

##コード

```javascript
let findSmallestInt = (args) => {
  let sorted = args.sort((a,b)=>{
    return a - b;
  });
  return sorted[0];
}

let findSmallestInt = (args) => {
    return args.reduce(function(prev, curr, index, array) {
      return prev < curr ? prev : curr;
    });
}

let  findSmallestInt = (args) => {
    return Math.min.apply(null, args);
}
```

##その他コード

```javascript
let findSmallestInt = (args) => {
    return Math.min(...args)
}
```

他にも解答コード浮かんだ方、コメントへどうぞ
Google Sheet APIを試す時に詰まったところ

思ったより大変だったので詰まったところをメモ

# Google Sheet API使うために必要なものまとめ
- 承認
- を得るためにAPIキーまたはOAuth token
- を発行するためにGoogle Cloud Platformのアカウント
- を作成するためにクレジットカード

# やったこと
公開されてるGoogle Spread Sheetに対して、Google Sheet APIを使って
特定の指定したシートの指定したセルのデータを読むAPIを実行し、結果をjsonで受け取る

# 流れ
- とりあえず触ってみる
  1. 公式の[チュートリアル] (https://developers.google.com/sheets/samples/reading?hl=ja)を流し読み
  1. 簡単そうじゃん！と喜ぶ
  1. ` GET https://sheets.googleapis.com/v4/spreadsheets/{spreadsheetId}/values/{SheetId}!{開始Cell}:{終了Cell} `
  1. 403エラーで首をかしげる
- 必要な手続きの確認
  1. 公式の[Authorized Request] 
 (https://developers.google.com/sheets/api/guides/authorizing)を読む
  1. Google Sheet APIの利用には承認が必要と知る
  1. それには認証情報（API keyまたはOAuth token）が必要
  1. 発行のためGoogle Cloud Platformのアカウントを作ることにする
- Google Cloud Platformのアカウント作成
  1. [Google Cloud Platform](https://cloud.google.com/)にアクセス
  1. googleアカウントでログイン
  1. 「無料トライアル」を開始
  1. 指示に従って登録。悩むところは無いが、クレジットカードが必要
  1. APIちょっと試したいだけなのに、だんだん大仰になってきたな、と物思いに耽る
- APIキー発行
  1. Google Cloud Platform管理画面にログイン
  1. 左上のメニューから「APIとサービス」> 「認証情報」を選択
  1. ダイアログで「組織ではページを表示できません。 このページを表示するには、プロジェクトを選択してください。」と言われるので「作成」
  1. とりあえずデフォルトのままプロジェクト作成
  1. 認証情報の画面に戻って同じエラーが出てくるので、今度は「選択」（プロジェクトは作成完了まで少しかかる）
  1. ダイアログで「API へのアクセスには認証情報が必要です。使用する API を有効化し～」と言われるので「認証情報を作成」> 「APIキー」
  1. 作成されたAPIキーをコピー
`
- 再挑戦
  1. ` GET https://sheets.googleapis.com/v4/spreadsheets/{spreadsheetId}/values/{SheetId}!{開始Cell}:{終了Cell}?key={API キー}`
  1. jsonでデータが受け取れるのを確認する
  1. おつかれさまでした

**このAPIキーは、警告文にあるように制限がかかっていないので、くれぐれも公開しないようにご注意ください**

# つまづきやすそうなところ
- 認証情報が必要というのが見落としやすい
- SpreadsheetId(Excelのbook)とSheetId（ExcelのSheet）がややこしい
- Google Sheet APIの説明記事でも、Google Cloud Platformのアカウントについては省略してることも多いので、１から始める人は注意
- UIが結構頻繁に変わるようなので、Google Cloud Platformの管理画面操作については参考程度に

# 参考
[公式の紹介記事](https://developers.google.com/sheets/guides/concepts?hl=ja)
[Google Sheets API v4を適当に叩いて適当にデータをJSONで取得する](http://taiki-t.hatenablog.com/entry/2016/10/14/031124)
[Google Cloud Platform のサービスアカウントを作成する（2016年9月版）](http://blog.a-know.me/entry/2016/09/18/212947)
【GitHub】ターミナルからissueを作成する方法


コマンドラインでissueを登録したいときはhubを導入して、

```
git issue create -m "test" -l piyo
```

`-m` がタイトル、 `-l` がラベル。
作成が成功したらissueのリンクが表示される。

![Screen Shot 2018-05-08 at 12.35.45.png](https://qiita-image-store.s3.amazonaws.com/0/109241/088af93c-fd5f-442f-cfe0-3fe075de329d.png "Screen Shot 2018-05-08 at 12.35.45.png")

![Screen Shot 2018-05-08 at 12.36.26.png](https://qiita-image-store.s3.amazonaws.com/0/109241/91e042f8-4b03-4f1e-3282-d0875c8940d6.png "Screen Shot 2018-05-08 at 12.36.26.png")

## 参考
http://d.hatena.ne.jp/takubon/20150725/p2
Android6でGmailアプリの通知だけがPushbulletでミラーリングされない

# android6の機種にしたはいいけど
白ロムでdocomo端末を買った。
早速Pushbulletを入れてみたがGmailアプリだけが通知をミラーリングしてくれない。困る。
GmailアプリだけがPCにミラーリング通知されてこない。
OSはAndroid 6。Xperia Z3 Compact SO-02G。SIMはMVNOのmineoを契約。

# Dozeやらは関係なさげ
色々検索してみるも、Dozeが問題だのHeartbeatが問題だの出てきますが設定しても無駄っぽい。
時間を取って検証してみると、他の通知は飛んでくるしGmailアプリだけの問題の模様。

# 他の通知アプリも試してみる
DesktopNotifierとかいう中華製のアプリを試してみようかと思うも、Firefoxのアドオンが見当たらずこの案はお蔵入り。

# Gmailアプリじゃなく、他のメーラーではどうか
Gmailに大量にアカウント設定してるので、新規に登録し直すのは面倒。
なら同じGoogle謹製のInboxを使えばいいじゃないとなりました。
<a href="https://play.google.com/store/apps/details?id=com.google.android.apps.inbox&hl=ja&rdid=com.google.android.apps.inbox">Inbox by Gmail</a>

結論はこれで解決。PCに通知が飛んできます。
アカウント情報もGmailアプリから引き継いでガンガン登録してくれる模様。

# Inboxは設定回りに注意が必要
ウィザードに従ってポンポン設定していったら通知がオフになってしまったラベルがありました。
重要だからラベル付けてるのに・・ブツブツ言いながら通知をするように設定し直す。。

なんでGmailアプリだけ通知がブロックされるのだろう・・ってのは解決してませんが、
Pushbullet開発チームにメール送っても返信ないし。英語で説明できた自信もないし仕方ないか。

しばらくはこれで様子を見てみようと思います。
【PHP】CS-Fixerを導入する


php cs-fixer
https://github.com/FriendsOfPHP/PHP-CS-Fixer
を用いて、PHPプロジェクトでコード整形を自動化する方法。
複数人で作業していると、無駄なコミットとかは入らないようにしたいし、可読性のことも考えるとメリット大。

## composer経由で導入

```
composer require friendsofphp/php-cs-fixer --dev
```

## コード整形の実行

appディレクトリ下についてコード整形を行いたい場合、以下のようなコマンドを実行。

```
vendor/bin/php-cs-fixer fix app 
```

### Makefileに追加する場合

いちいち上記のコマンドを打つのも面倒なので、Makefileに `make fixer` として登録すると便利。

```Makefile
fixer:
	php vendor/bin/php-cs-fixer fix ./app && \
	php vendor/bin/php-cs-fixer fix ./database
```

## 参考ブログ
PhpStormのボタンで実行できるようにする方法など、詳しくはこちら
https://www.chatbox.blog/2018/04/23/php%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AB-cs-fixer%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%97%E3%81%A6%E3%82%B3%E3%83%BC%E3%83%89%E6%95%B4%E5%BD%A2%E3%82%92%E8%87%AA%E5%8B%95/