OmniAICreator/Qiita-1.07M huggingface dataset:
AWS初心者がSQSでキューを作成してみる

どうも!最近ソリューションアーキテクトアソシエイトを無事取得することができましたがまだまだサービスに慣れていないのでAWS初心者を名乗って行こうかと思っているSATO論外です！
今回はAWSのキューイングサービスであるSQSを触って実際に動かして行こうかと思います

#SQSとは？  
[Amazon Simple Queue Service](https://aws.amazon.com/jp/sqs/)の略です。
完全マネージド型のメッセージキューイングサービスでマイクロサービス・分散システム・サーバレスアプリケーションの切り離しとスケーリングが可能です。
主に送信側のアプリケーションと受信側のアプリケーションのポーリング処理の中継役(キューをため込んでポーリング処理を実施)として使用するサービスとなります。
疎結合化を進めるためにSAAの試験でも結構な確率で出てくる項目となりますので是非覚えていて損はありません

#実際に触ってみる

###SQSの作成
   - AWS マネジメントコンソールからSQSを検索して移動、キューを作成をクリック  
   　<img width="1029" alt="スクリーンショット 2020-07-21 10.11.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563324/70b644ed-cdfe-3796-a8b6-2a9fd272e060.png">
   - 作成画面に移動するのでキューのタイプを選択して名前を入力  
  　　<img width="1201" alt="スクリーンショット 2020-07-21 10.52.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563324/c0fc5bdb-4085-20f0-2565-a39ac95d558f.png">
      - SQSには標準キューとFIFOキューの２つのタイプがあります(今回は標準キューを使用します)
         - 標準キュー：基本的には順番通り処理するが場合によっては順番が変わる可能性がある(またメッセージを複数回受信する可能性もある)
         - FIFOキュー：最初に入った順にキューを処理する(順番を確実に保証したい場合に使用する)
   - 詳細の設定(可視生タイムアウト(いつまで見れるか)・メッセージ保持期間など)を行っていきます
　　　<img width="1212" alt="スクリーンショット 2020-07-21 11.01.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563324/b43e8364-493d-1f5e-2704-51c32ddcc472.png">
　　　※今回は可視性タイムアウトとメッセージ受信待機時間をそれぞれ10秒に設定してその他の項目はデフォルト
   - その他アクセスポリシー・暗号化・デットレターキュー・タグについてはこの度はデフォルト設定のまま作成します
     - デットレターキュー：残されたままのメッセージを別キューに移動し正常に処理できなかったメッセージを隔離できる
   - 作成を押すとキューの完成です

###作成したキューを操作してみる
   - 先ほど作成したキューをクリック  
   　　<img width="632" alt="スクリーンショット 2020-07-21 11.19.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563324/0db4c766-634f-69dc-50f9-d831722e572c.png">
   - メッセージを送受信をクリック  
    　<img width="556" alt="スクリーンショット 2020-07-21 11.22.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563324/3c0c86fd-9304-5d0b-133d-351501be9964.png">
   - メッセージと配信遅延を入力してメッセージの送信をクリック  
     <img width="1619" alt="スクリーンショット 2020-07-21 11.24.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563324/6d24cd00-6f4f-91d1-1e22-edcba3ca9087.png">
   - キューの一覧画面に戻ると利用可能なメッセージに1件追加されていることがわかります  
     <img width="877" alt="スクリーンショット 2020-07-21 11.28.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563324/9a20eb6a-3577-0e71-bb7f-113f62593728.png">
   - キューの名前をクリックして詳細画面に移動
   - メッセージを送受信をクリック
   - 下にあるメッセージを受信からメッセージをポーリングをクリックするとポーリング処理が実行されます
   　![スクリーンショット 2020-07-27 10.15.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563324/937e9a14-4966-64a9-7b33-7c189fcab3c3.png)
   - ポーリングが完了するとメッセージ欄に先ほど送信したメッセージが届いていることが確認できます  
   　※今回は管理画面にて簡易的に行っておりますが実際はEC2インスタンスなどを利用してメッセージの受け渡しなどを行っていきます
Power BI Tips - ビジュアルが動かないようにする

#概要
超初心者的な内容ですが・・・
今までスライサーとか操作したときに、誤ってビジュアルをドラッグして位置が動かしてしまうことを
何十回もやってしまっていまして。
これを見つけて超感動してしまい、共有したくて書いています（笑）。

#内容
配置したビジュアルやオブジェクトを動かなくします。

#方法
表示タブの「オブジェクトをロック」にチェックを入れるだけ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/a176dba0-cb84-31a0-e005-2226af431647.png)


#余談
この「オブジェクトをロック」にチェックを入れると、
全てのページのビジュアルやオブジェクトの位置が固定されます。
しかし、同じタブ内の「ページ表示」は、ページ毎に設定する必要があります。
開発初日

AndroidStudio kotlinでアプリを作るよ

なにもかも未経験、なんとかなるでしょ。

期間は決めずにのんびり

activity_main.xmlで画面作成
直感的にボタンを配置する:point_up:
この状態では赤いエラーが出ている:rage:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674870/5ca2fdcd-bec3-a8a9-59ac-de85da244fe7.png)


Layoutタブから正確な位置を指定する
今度は黄色いエラーになった:frowning2:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674870/4f049394-5b1f-991b-09cd-fed6ff5cef79.png)

バーチャルデバイス使う

機種選んで:iphone:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674870/cd467905-f536-ed68-ab81-399401d8edbb.png)

OSえらんで:electric_plug:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674870/5b70f1e5-77f2-db0c-ea3a-102005b0d41a.png)

いざ起動！！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674870/7f1547f9-7ef2-fc96-e39c-d8797856c420.png)
なんで:relaxed:
データ構造とアルゴリズム

#Vol.1: データ構造の概要
この版ではデータ構造の必要性とデータ構造の性能測定方法について学びます。


##データ構造の必要性
👌 データを効果的に保存し、処理する方法について正しく理解する必要があります。
👌 資料構造をきちんと理解しないと、不要にメモリと性能を無駄遣いする余地があります

**例)**
`プログラム内でINT型データが100万個ほど使われると仮定した場合、必要なデータを最も素早く探せる資料構造とは何でしょう？`

##基本的なデータ構造
📌 線形構造
      - 配列
      - 連結リスト
      - スタック
      - キュー

📌 非線形構造
    - ツリー(Tree)
    - グラフ(Graph)

##データ構造とアルゴリズムの相関関係
👌 効率的なデータ構造設計のためにアルゴリズム知識が必要です。
👌 効率的なアルゴリズムを作成するためには、問題の状況に応じた適切なデータ構造が使用されなければなりません。
👌したがってデータ構造論とアルゴリズム理論はすべて同一線上に置くことができます。

##プログラムの性能測定方法論

👌 時間複雑度(Time Complexity)とは、アルゴリズムに使用される演算回数を意味します。
👌 空間複雑度(Space Complexity)とは、アルゴリズムに使用されるメモリの量を意味します。
→　*効率的なアルゴリズムを使用すると仮定すると、一般的に時間と空間は反比例の関係です。*

####時間複雑度を表現するときは、最悪の場合を表す**Big-O表記法**を使います。
複雑度の場合、数学的にも表記が可能です。プログラムを作成する際は最悪の場合を算定して作成しなければならないので、このようにBig-O表記法を使用して最悪の場合をベースにした場合、どれくらいかかるのかと明示することができます。

**例1）**次のアルゴリズムは**O(n)**の時間複雑度を持ちます。
🖍*O(n) = 変数分繰り返すの意味で理解*

```C
int main(void)
{
   int a, b;
   cin >> a >> b;
   int sum =1;
   for (int i = 0; i < b; i++)
   {
           sum *= a;
   }
   cout << sum;
}
```
**例2）**次のアルゴリズムは**O(n²)**の時間複雑度を持ちます。

```C
#include<iostream>

using namespace std;

int main(void)
{
   int n;
   cin >> n;
   for (int i = 0; i < n; i++)
   {
           for(int j =0; j<= i; j++){
                    cout << "*";
                }
                cout << '\n';
           }
}

```
![Screen Shot 2020-07-26 at 22.46.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619479/546e9d50-2758-44da-8035-2f07522c7196.png)

🤔 上の図のようにOの1からnの数乗まで伸ばす方法で多様なアルゴリズムの性能測定が可能です。

**例）** nが1000だと仮定
↓↓↓↓↓↓↓ Your content

```
n : 1,000回の演算
nlogn : 約10,000回の演算
n² : 1,000,000回の演算
n³ : 1,000,000,000回の演算
```

通常、演算回数が10億を超えると1秒以上の時間がかかります。
現実世界の様々な問題では、時間制限が1秒だと考えればいいです。
つまり、あるモジュールが1秒を超えると、事実上ユーザーの立場では多くの時間がかかると感じることができるからです。

また、時間の複雑度を表記するときは、常に大きな項と係数のみ表示します。

**例）**

```
O(3n²+n) = O(n²)
```

空間複雑度を表記するときは、一般的にMB単位で表記します。
**例）**

```
int a[1000]:4KB
int a[1000000]:4MB
int a[2000][2000]:16MB
```

→　int型は4byteの空間を占めるので、int型変数が1000個入る変数を作ったなら、4byte X 1000 = 4000byte = 4KB

📚参考講義：[コンピューター工学専攻必須オールインワンパッケージOnline](https://www.fastcampus.co.kr/dev_online_cs)
👆 上記の講義はCとC++を言語を前提に説明しています。
【python】 辞書型の内包表記

# 内包表記を使って辞書型の変数を作る

リスト型の変数を内包表記で表せるのと同様に、
辞書型の変数も次のように内包表記で表すことができます。

```python
S = ['A', 'B', 'C', 'D', 'E']
L = [0, 1, 2, 3, 4]

dic = {s:l for s,l in zip(S,L)}  # {key:value for item in iterator}

print(dic)  # 出力結果: {'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4}
```

ちなみに今回は例として内包表記を使いましたが、
この場合は```dict(zip(S, L))```とするほうが簡単です。(コメントありがとうございました)

## forループよりも内包表記を使ったほうが良い

内包表記を使うと次のメリットがあるようです。[^1]

> Pythonで内包表記を使うことで以下の様なメリットがあります。
> 
> - コードがシンプル
> - 可読性の向上
> - 実行速度が高速
> 
> 実行速度は通常のForループを使用するよりも、約2倍高速されるそうです。

場合にもよりますが、forループを使うよりも積極的に内包表記を使ったほうがよさそうです。

[^1]: https://www.itbook.info/network/python26.html
.NetCore3.1＋Next.js＋TypeScriptの環境構築

## 構成

業務で下記構成でWebアプリケーションを開発中です。初期構築したときの手順をちょっとまとめさせてください。

- サーバ側
  - WindowsSever2019
  - .NetCore3.1
  - IIS
- フロント側
  - node.js 12.8.0
  - Typescript 3.9.7
  - next.js 9.4.4

## サーバ側

「DotNetTest」という名前の.NetCore3.1のAPIプロジェクトを作成します。

```bash
dotnet new webapi --framework netcoreapp3.1 --output DotNetTest
```

```
DotNetTest
│  appsettings.Development.json
│  appsettings.json
│  DotNetTest.csproj
│  Program.cs
│  Startup.cs
│  WeatherForecast.cs
│
├─Controllers
│
├─Properties
│      launchSettings.json
│
├─Content
│  └─frontend
│
└─wwwroot
```

静的ファイルを提供するミドルウェアを登録します。

```c#:Startup.cs
// Configureメソッド内
app.UseDefaultFiles();
app.UseStaticFiles();
```

`Content/frontend`にNext.jsのソースを格納し、`wwwroot`にコンパイル後のコードを格納する形にしたいと思います。

## フロント側

作ります。

```bash
mkdir Content
cd Content
npx create-next-app frontend
cd frontend
npm install --save-dev typescript @types/react @types/node
touch tsconfig.json
npm run dev
```

`package.json`を書き換えます。`scripts`に下記文言を追加しました。

```json:package.json
"build": "next build && next export -o ../../wwwroot",
```

`npm run build`して終わり、簡単でございました。
【ふくだ学習録】インフラエンジニア教本-ネットワーク構築技術解説- part5【55日目】

# ふくだ学習録とは？
ふくだが学習したことの備忘録。
目に見える形で残すことによってやる気を出す個人的な作戦です。
他人に見せるように書いているわけではないので、すごく読みにくいです。

### 読了した本

#### 技術系
[データベースエンジニア養成読本 [DBを自由自在に活用するための知識とノウハウ満載!]](https://www.amazon.co.jp/dp/4774158062/ref=cm_sw_r_tw_dp_U_x_FPphEbQFPPQRM )
[ゼロから作るDeepLearning](https://www.amazon.co.jp/dp/4873117585/ref=cm_sw_r_tw_dp_U_x_y3UiEbF3P6EG7)
[PHPフレームワーク CakePHP 3入門](https://www.amazon.co.jp/dp/4798048577/ref=cm_sw_r_tw_dp_U_x_.YIjEbS1K4JY2)
[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/ref=cm_sw_r_tw_dp_U_x_XlokEbJQK2N7P )
[Docker入門](https://www.amazon.co.jp/dp/480071091X/ref=cm_sw_r_tw_dp_U_x_xVlmEbN8ZTHZK)
[PHPフレームワーク Laravel入門](https://www.amazon.co.jp/dp/4798052582/ref=cm_sw_r_tw_dp_U_x_zzeyEbJBSQ5Y0 )
[サーバ/インフラを支える技術](https://www.amazon.co.jp/dp/4774135666)


#### ビジネス系
[サブスクリプション](https://www.amazon.co.jp/dp/B07HY1TND9/ref=cm_sw_r_tw_dp_U_x_lp4NEb3EEGD7Y)
[Running Lean ―実践リーンスタートアップ](https://www.amazon.co.jp/dp/4873115914/ref=cm_sw_r_tw_dp_U_x_UsMREbV6Y41Y8)
[amazon 世界最先端の戦略がわかる](https://www.amazon.co.jp/dp/4478105057)
[Lean Analytics ―スタートアップのためのデータ解析と活用法](https://www.amazon.co.jp/dp/4873117119)
[ピーター・ティール 世界を手にした「反逆の起業家」の野望](https://www.amazon.co.jp/dp/4864106010)
[Airbnb Story 大胆なアイデアを生み、困難を乗り越え、超人気サービスをつくる方法](https://www.amazon.co.jp/dp/4822255190)
[ユダヤの商法](https://www.amazon.co.jp/dp/4584139008)
[How Google Works](https://www.amazon.co.jp/dp/4532198348)
[イシューからはじめよ](https://www.amazon.co.jp/dp/4862760856)
[ピクサー流　創造するちから](https://www.amazon.co.jp/dp/4478016380)
[ストーリーでわかる財務３表超入門](https://www.amazon.co.jp/dp/4478015619)


### 今読んでいる本
[インフラエンジニア教本 ~ネットワーク構築技術解説](https://www.amazon.co.jp/dp/4774170348)

# 第1章 DHCPサーバーの教科書

### DHCPとDNSの連携
DHCPでは面倒なネットワーク設定が自動化されるため便利だが、サーバーのアクセスログをIPアドレスで追跡しようとしても、どのクライアントにどのIPが割り当てられているか追跡するのが面倒なため、正確にクライアントを特定するのは困難。

Dynamic DNSでDHCPサーバとDNSサーバを連携させ、クライアントに割り振ったIPアドレスとホスト名をDNSに登録し、ホスト名でアクセスログを記録できるようにする。

### jnlファイルとは
何かの履歴を記録したファイルの総称。
[ジャーナルファイル (journal file)](https://wa3.i-3-i.info/word16096.html)

### TSIG認証とは
DNSの通信（トランザクション）に共有鍵を用いた署名を付加し、通信の安全性を高めるための仕組み。
[「BIND 9」にTSIG認証回避の脆弱性2件、最新バージョンへの更新を](https://internet.watch.impress.co.jp/docs/news/1068174.html#:~:text=TSIG%E3%81%AF%E3%80%81DNS%E3%81%AE%E9%80%9A%E4%BF%A1,%E3%81%AE%E6%94%B9%E3%81%96%E3%82%93%E3%82%92%E6%A4%9C%E7%9F%A5%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%82)

### AmazonVPCのIPアドレス
AWSでは仮想マシンを起動すると、自動的に仮想ネットワーク環境が与えられる。
その仮想ネットワーク環境からIPアドレスを払い出すために、DHCPサーバを使用する。
VPCでは仮想マシンのENI（Elastic Network Interfases）に対してIPアドレスを払い出すため、ENIが変更にならない限りMACアドレスやIPアドレスが変更になることは無い。

### AmazonVPCのDHCPオプション
VPCのDHCPサーバからクライアントへ付与されたIPアドレスを確認する場合、Amazon Linuxの場合であれば、`/var/lib/dhclient/dhclient-eth0.leases`ファイルで確認できる。

# 今日の一言
もっと早よ起きなければ、、
JS 配列のN個からN個までを取り出す

##Lodashのslice関数を作成してみた

~~~javascript
const slice = (array = [], start = 0, end = array.length) => {
  const newArray = []
  for (let i = start; i < end; i++) {
    newArray.push(array[i])
  }
  return newArray
}

console.log(slice([1, 2, 3, 4, 5], 1, 4))
// => [ 2, 3, 4 ]
~~~
【Laravel】データベースを使った画像の取得と表示

#画像のアップロードとデータベースへの保存

##画像のアップロード
###formを作る
新しくviewファイルを作りformを作る。

```php
<form action="{{route('任意のルート名')}}" method="post" enctype="multipart/form-data">
    @csrf
    <input type="file" name="sample_image" >
    <input type="submit" value="投稿">
</form>
```
- formはenctype=“multipart/form-data”とする。multipart/form-dataはファイルの送信をするときに指定する必要がある。
- enctypeは送信データのエンコードタイプを指定しており、methodがpostのときにしか使えない。
- 何も指定しなければapplication/x-www-form-urlencodedとなり、これは全ての文字をURLにする。
 - enctypeは基本は書かずにファイルの送信をするときだけmultipart/form-dataとすればいい。
- input type=“file”でファイルを選択できる。

###Controllerで画像を保存する
```php
public function store(Request $request){
  $image = $request->file('sample_image')->store('public/image');
}
```
- contorollerで$request->file(‘name’)->store(‘任意のディレクトリ);とすることでstorage/app直下の任意のディレクトリにユニークなファイル名で保存される。
 - 今回はname="sample_image"、保存するディレクトリはstorage/public/imageになる。

##データベースにファイル名を保存する
「Controllerで画像を保存する」で作成したstoreの中身に追加する。

```php

public function store(Request $request){
  $image = $request->file('sample_image')->store('public/image');

  #この下に追加する

  $image = str_replace('public/image/', '', $image);

  $image = new Image;
  $image->file = $image;

  $image->save();
}
```
- str_replace('指定の文字列' , '置換する文字列' , '対象の文字列')で対象の文字列から指定した文字列を置換する文字列に置き換える。
 - 今回は$imageに保存されているファイル名からpublic/image/という文字列を''（空文字）に置き換えている。 

※今回は画像を表示するのにヘルパ関数のassetを使うことを前提にしているのでファイル名のみをデータベースに保存した。

##保存した画像の表示
###ファイル名をデータベースから取得する
今回はimages_table（モデルはImage）の中のfileというカラムにファイル名が入っているとする。

```php
public function index(){
  $image = Image::all();

  return view('image.index', compact('image'));
}
```
###viewファイルで画像を表示する
※storage/app/public配下（画像を保存した場所）はwebからのアクセスを許可しないので、データベースからファイル名を取得しても画像は表示されない。

artisanコマンドでstorage:linkとすることでstorageのファイルがpublic直下に同期される（publicの中にstorageが追加されている)。

- 画像が保存されている場所：storage/app/public/image
- 画像を取得する場所：public/storage/image

```terminal
php artisan storage:link
```
上記のartisanコマンドを通せばpublic/storage配下に画像があるのでにassetを使ってアクセスできる。

```php
<img src="{{asset('storage/image/'.$image->file)}}">
```
バージョン
---
php:7.3.11
Laravel:7.21.0
Chromebook(ASUS C101PA)でAWS CodeDeployチュートリアルやってみた 

#概要
CodeDeployが気になっていたのでAWS公式のチュートリアルをやってみた。
何もしないと忘れそうなので、作業メモとして残す。


##作業環境・使用サービス
- 作業端末
    - chromebook (ASUS C101PA)
    - Secure Shell App (SSH接続用)
- AWSサービス(東京リージョン)
    - EC2（Amazon Linux 2 AMI (HVM), SSD Volume Type）
    - AWS CodeDeploy
    - AWS CodePipeline
- github

##1. IAM準備
EC2用とCodeDeploy用のIAMロールを準備する。
・EC2用
　IAMロール作成画面でAWSサービス ＞ EC2を選択。
　↓
　ポリシーに”AmazonEC2RoleforAWSCodeDeploy”を指定。
　↓
　タグは飛ばす。
　↓
　任意のロール名を入力し、ロールの作成。

・CodeDeploy用
　IAMロール作成画面でAWSサービス ＞ CodeDeployを選択。
　↓
　ユースケースの選択でCodeDeployを指定。
　↓
　ポリシーにAWSCodeDeployRoleが表示される。（変更なし）　
　↓
　任意のロール名を入力し、ロールの作成。

##2. EC2準備
EC2インスタンスの作成のクイックスタートで、
Amazon Linux 2 AMI (HVM), SSD Volume Type - ami-06ad9296e6cf1e3cf (64 ビット x86)
を選択し、下記以外は適当な設定で作成。（すべて無料枠で作成した。）
・「ステップ3:インスタンスの詳細の設定」のIAMロールに1で作成したEC2用ロールを割り当てる。
・同画面最下部のユーザーデータに下記記入
sudo yum install ruby 
sudo yum install aws-cli 
aws s3 cp s3://aws-codedeploy-ap-northeast-1/latest/install . --region ap-northeast-1
chmod +x ./install
sudo ./install auto
↓
・タグはあとで使用するのでメモ残しておくこと。
↓
起動
↓
Secure Shell Appで接続
↓
・AWS CLIインストール？？（←不要？要確認）
・gitインストール
 `$ sudo yum update`
 `$ sudo yum install git`
 `$ git version` 

##4. github準備
GitHubの自分のアカウントで下記設定でニューレポジトリ作成。
[レポジトリ名] CodeDeployGitHubDemo
[Public] 
[Initialize this repository with a README] チェックボックスをオフ
↓
ターミナルで下記コマンドを1行ずつ実行
`$ mkdir /tmp/CodeDeployGitHubDemo`
`$ cd /tmp/CodeDeployGitHubDemo`
`$ touch README.md`
`$ git init`
`$ git add README.md`
`$ git commit -m "My first commit"`
`$ git remote add origin https://github.com/user-name/CodeDeployGitHubDemo.git`
`$ git push -u origin master`
`$ aws s3 cp s3://aws-codedeploy-ap-northeast-1/samples/latest/SampleApp_Linux.zip . --region ap-northeast-1`
`$ unzip SampleApp_Linux.zip`
`$ rm SampleApp_Linux.zip`
`$ git add .`
`$ git commit -m "Added sample app"`
`$ git push`

##5. CodeDeploy準備
・アプリケーションおよびデプロイグループの作成
`$ aws deploy create-application --application-name CodeDeployGitHubDemo-App`

`$ aws deploy create-deployment-group --application-name CodeDeployGitHubDemo-App --ec2-tag-filters Key=ec2-tag-key,Type=KEY_AND_VALUE,Value=ec2-tag-value --deployment-group-name CodeDeployGitHubDemo-DepGrp --service-role-arn service-role-arn`

ec2-tag-key：作成したEC2インスタンスのタグ
ec2-tag-value：作成したEC2インスタンスのタグ値
service-role-arn：CodeDeploy用のIAMロールのARN

##6. アプリケーションをデプロイ
GitHubへの権限付与にコンソールを使用するのでそのままコンソールで設定しきる。

サービスからCodeDeploy画面へ移動
↓
アプリケーション＞作成したデプロイグループ＞[デプロイの作成] 
↓
[リビジョンタイプ] で [GitHub] を選択
リビジョンの場所：自分のGitHubアカウント名
リポジトリ名：アカウント名/リポジトリ名
Commit ID：コミット（基本的に最新のID）
↓
デプロイの作成

## ７．CodePipeline設定
サービスからCodePipeline画面へ移動。
↓
パイプラインを作成する
↓
パイプライン名：適当
サービスロール：自動
↓
ソース：GitHub
リポジトリ：紐付けたリポジトリ
を選択
ブランチ：master
↓
ビルドステージをスキップする。
↓
デプロイプロバイダー：AWS CodeDeploy
リージョン：アジアパシフィック（東京）
アプリケーション名：作成したアプリケーション
デプロイグループ：作成したデプロイグループ
↓
パイプラインを作成する

インスタンスのパブリックIPをブラウザ入力すると、水色の画面が表示されるはず。
GitHubのリポジトリのhtmlファイルのカラーコードを「#000000」に変更して、画面が黒色に変わることを確認する。

## 所感
CodeDeploy用のIAMロール作成が抜けていて、解決までに時間がかかった。
また、awsconfigの設定等、基本的なところで詰まってしまったので、スムーズに
設定できるように作成で順などまとめるようにしようと思う。
Donkey car / Jetbot、別のコースを再学習なしで走れる？

#カメラの位置調整
パイロン旋回中にもパイロンが視野に入るようカメラの位置を上げました。
横方向は車輪の外側＋車幅まで見えますので、旋回中に迷子になりません。
![IMG_2066.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/522bb311-96af-354b-0606-5f97bc326345.jpeg)
首の長くなったJetbot。オリジナルに対し倍の高さ、少し下向き。
![cameraview.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/b554782e-4aa7-6652-b404-a4568879529d.png)
カメラビュー
![IMG_2062.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/84826ec0-b18f-d7cd-2693-340efcf4f6d7.jpeg)
視野、ブロックで1/4, 1/2, 3/4, 1の画面位置を示しています。
#教師データ用コースは楽勝！
1)パイロンを回る。
2)プラレースに沿って走る。
これを学習するコースを作り、データ取り、学習した自動運転です。
https://www.youtube.com/watch?v=sCBsngtiI44
![simple.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/a690fe34-171b-4e2c-5bda-b482481d182a.png)
#じゃあ、コースを変えても走る？
コースを大幅に変更しても再学習なしで走りますので、
パイロンを回る事、プラレールに沿って走ることを覚えたようです。
AIはコースが変わったことを判っているのでしょうか？
https://www.youtube.com/watch?v=bLH2F7jwnx8
![new.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/29345f48-39fb-2abe-2412-9ae968ce5c46.png)
#パイロンコースで意地悪テスト
自動運転中にパイロンを追加、撤去するとどうなる？
https://www.youtube.com/watch?v=Ci-GV2D7ljY&feature=youtu.be
![Swan2Pylon.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617683/e6e34e61-9137-9a63-82a2-f5bbddc2ba73.png)
donkeycarで一度の学習でいろいろなコースに対応するアイデアでした。
OpenWrt 19.07でWPA3を有効にする

2020年1月リリースのOpenWrt 19.07からWi-FiのセキュリティプロトコルとしてWPA3がサポートされています。WPA3はWPA2の後継で、KRACKへの対応などが行われているようです。

以下、リリースノートの内容です。

> The 19.07 release brings initial support for WPA3. However, WPA3 is not enabled by default and requires installing specific packages: to run WPA3 as an access point, `hostapd-openssl` is needed. For use as a Wi-Fi station, you need either `wpa-supplicant-openssl` (station support only) or `wpad-openssl` (AP + station). Due to their large size, these packages are not installed by default, and it is impossible to install them on devices with less than 8MB flash.

OpenWrt 19.07ではイメージサイズを小さくするためWPA3が標準で無効化されており、WPA3を有効にするには追加でパッケージのインストールが必要です。WPA3対応のAPとして使うだけなら`hostapd-openssl`を、Wi-FiクライアントとしてWPA3をサポートしたい場合は`wpa-supplicant-openssl`を、APとクライアント両方使いたい場合は`wpad-openssl`をインストールしましょう。また、APとクライアントに加えて802.11sのメッシュネットワークでもWPA3をサポートしたい場合は`wpad-mesh-openssl`が利用できます。

```
# opkg list # から抜粋
hostapd-openssl - 2019-08-08-ca8c2bd2-4 - This package contains a full featured IEEE 802.1x/WPA/EAP/RADIUS Authenticator.
wpa-supplicant-openssl - 2019-08-08-ca8c2bd2-4 - WPA Supplicant
wpad-openssl - 2019-08-08-ca8c2bd2-4 - This package contains a full featured IEEE 802.1x/WPA/EAP/RADIUS Authenticator and Supplicant
wpad-mesh-openssl - 2019-08-08-ca8c2bd2-4 - This package contains a minimal IEEE 802.1x/WPA Authenticator and Supplicant (with 802.11s mesh and SAE support).
```

私は以下のように作業しました。

```
# opkg update
# opkg remove wpad-basic
# opkg install wpad-mesh-openssl
```

これでWi-FiのAP/client/meshの暗号化方式としてWPA3-SAEが使えるようになります（下図参照）。とはいえWPA3をサポートしているOSはまだ少ないので、当分はWPA2/WPA3のmixed modeを使うのがよさそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46856/6d72c0ec-5d8f-aa90-4964-df21115fc028.png)

## 参考URL

- [OpenWrt Project: OpenWrt 19\.07\.3 \- Service Release \- 20 May 2020](https://openwrt.org/releases/19.07/notes-19.07.3)
v-app-barなどのコンポーネントが読み込まれないエラー

Nuxtを使っていて、vuetifyのコンポーネントが読み込まれないエラーに少しハマったので、メモがてらに書きます。

## 環境
・macOS Catalina バージョン10.15.5
・node v14.3.0
・npm 6.14.6
・Nuxt v2.13.3
 

## エラー文

```
Unknown custom element: <v-app-bar> - did you register the component correctly? For recursive components, make sure to provide the "name" option.
```

自分で作成したコンポーネントならまだわかるが、vuetifyが用意してくれてるコンポーネントが何で読み込まれないのか不思議でした。
綴りも何回も確認しました。
他にも`<v-list-item>`などvuetifyで用意してくれているコンポーネントが一部読み込まれないようです。

## 結論
package.jsonを確認すると、

```json:package.json
"@nuxtjs/vuetify": "0.5.5"
// 他は割愛
```

バージョンが古いことがわかりました。
これが原因でした。

## インストールできない問題

@nuxt.js/vuetifyの新しいバージョンをインストールしようとすると、インストール時にエラーが出て、インストールできない問題にぶつかりました。

```
gyp: No Xcode or CLT version detected!
```

「参考記事」に記載してある2つの記事を参考に以下を行うとインストールができるようになりました。

```
$ rm -rf $(xcode-select -print-path)
$ rm -rf /Library/Developer/CommandLineTools
$ xcode-select --install
```

筆者の方ありがとうございます。助かりました。


## 最後に
vuetifyのコンポーネントがないと言われるときはまずバージョンを確認する
といいですね。って当たり前でしたが、他のコンポーネントは使えていて、なかなか原因がわからなかったので備忘録的に書きました。

同じようなエラーにハマっている方の助けになれば幸いです。

## 参考記事
https://qiita.com/baby-0105/items/18f6fbc073e160bf83ac

https://qiita.com/hppRC/items/a01e33a5c890f7b2c125
JS 配列からN個返す

## LodashのtakeRight関数を作成してみた

~~~javascript
const take = (array = [], take = 1) => {
  if (take === 0) {
    return []
  }

  if (array.length < take) {
    return [...array]
  }

  const newArray = []
  for (let i = 0; i < take; i++) {
    newArray.push(array[i])
  }

  return newArray
}

console.log(take([1, 2, 3], 0))
=> []

console.log(take([1, 2, 3], 2))
=> [1, 2]

console.log(take([1, 2, 3], 5))
=> [1, 2, 3]
~~~
pytorchで自作データセットを用いる方法

ここでは、pytorchで用意されているデータセット以外を用いる際のデータローダの作成方法を解説します。
今回はsklearnで用意されているデータセットを用います。

## 実装

```
import numpy as np
import torch
from torch import nn
import torch.nn.functional as F
import torchvision
from torchvision import transforms
from torch import optim
from torch.utils.data import DataLoader, Dataset, TensorDataset

# MNISTデータセットの読み込み
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split

mnist_X, mnist_y = fetch_openml('mnist_784', version=1, data_home="./mnist", return_X_y=True)

X_all = mnist_X.astype(np.float32) / 255 # データを[0,1]に変換
y_all = mnist_y.astype(np.int32)

# 分割
X_train, X_test, y_train, y_test = train_test_split(X_all, y_all, train_size=0.8, random_state=1)

print(X_train.shape) # (56000, 784)

X_train = X_train.reshape(len(X_train), 1, 28, 28).astype('float32')
X_test = X_test.reshape(len(X_test), 1, 28, 28).astype('float32')

y_train = y_train.astype('long')
y_test = y_test.astype('long')

train_set = TensorDataset(torch.from_numpy(X_train), torch.from_numpy(y_train))
test_set  = TensorDataset(torch.from_numpy(X_test), torch.from_numpy(y_test))

bs = 1000

train_loader = DataLoader(train_set, batch_size=bs, shuffle=True)
test_loader = DataLoader(test_set, batch_size=bs, shuffle=False)

```

## 解説
```
train_set = TensorDataset(torch.from_numpy(X_train), torch.from_numpy(y_train))
test_set  = TensorDataset(torch.from_numpy(X_test), torch.from_numpy(y_test))
```

ここでテンソルデータセットを作成しているが、入力画像データ(X)は (データ数、チャネル数、高さ、幅)に設定する必要がある。
そのため、

```
X_train = X_train.reshape(len(X_train), 1, 28, 28).astype('float32')
X_test = X_test.reshape(len(X_test), 1, 28, 28).astype('float32')
```

で変換している。
また、正解ラベルは

```
y_train = y_train.astype('long')
y_test = y_test.astype('long')
```

のようにlong型に設定する必要がある。
【GameMakerStudio2】基本的なキーボードによるオブジェクトの移動

# はじめに
GameMakerStudio2のチュートリアルはかなり充実していると思う。
公式動画などを見れば当たり前のような事かもしれませんが、一応書き記したいと思います。
個人的な思考も入っておりますので間違いや勘違いがることはご了承ください。

GMLでの環境となります。

## 上下左右の移動

動かしたいオブジェクトを作成しCreateイベントを作成します。


```swift:Create
spd = 1;

moveX = 0;
moveY = 0;

```

次にStepイベントを作成します。

```swift:Step
// キーボード入力
var _right = keyboard_check(vk_right);
var _left = keyboard_check(vk_left);
var _up = keyboard_check(vk_up);
var _down = keyboard_check(vk_down);

// 移動方向
var _inputX = _right - _left;
var _inputY = _down - _up;

// 移動値
moveX = _inputX * spd;
moveY = _inputY * spd;

// 当たり判定

// 移動
x += moveX;
y += moveY;

```

コメントに記載していますが、実際は当たり判定を行ってから座標の移動を行う必要があります。
今回は割愛。

### 解説
Createイベントはオブジェクトが生成されたタイミングで動作します。
Createで定義した変数`spd`がプレイヤーの移動速度となり、早くしたい場合は数値を上げましょう。

Stepイベントはオブジェクトがフレームごとに呼び出される処理です。
オプション側でフレーム数を設定でき、基本的には1秒=60フレームで動作する設定かと思います。

フレームごとに`keyboard_check`でのキーボードの入力値を各変数`_right`などに代入しています。
keyboard_checkは入力があれば1 なければ0 が返ります。

この値を利用して移動上下左右の方向を取得します。

```swift
var _inputX = _right - _left;
```

上記の計算を見てみましょう。
キーボードの右が押された場合 `_inputX = 1 - 0;`となります。つまり`1`ですね。
逆に左が押された場合 `_inputX = 0 - 1;`となります。つまり`-1`ですね。

GameMaker Studio2は**左上に起点(0, 0)**がありますので右に移動する場合は加算、左の場合は減算する必要があります。
この算出した数値をオブジェクトの移動速度と掛けてX方向へ移動するように代入しています。

```swift
// 移動速度
moveX = _inputX * spd;
moveY = _inputY * spd;

// 当たり判定

// 移動
x += moveX;
y += moveY;
```

上下も同じ仕組みで動いております。

以上、本当に簡単にですが、オブジェクトのキーボード移動についてでした。
[ASP.Net Core] How to manage access to the file (Azure Blob) using ASP.Net Identity Core

Here is how to mange access to the file (which is stored on Azure Blob) using ASP.Net Identity .

For more details about ASP.Net Identity, please refer to this document
https://docs.microsoft.com/en-us/aspnet/identity/

Azure Blob has several ways to control access to the file, as below.

- Shared Key (storage account key)	
- Shared access signature (SAS)	
- Azure Active Directory (Azure AD)

Please read here for details.
https://docs.microsoft.com/en-us/azure/storage/common/storage-auth

If you are using APS.Net Identity, the simple way to manage access to the file is generating Shared access signature along with making request to the file.

For making Shared access signature, please refer to this document.
https://docs.microsoft.com/en-us/azure/storage/common/storage-sas-overview

Withing Share access signature (SAS), there are there types.

### User delegation SAS
> A user delegation SAS is secured with Azure Active Directory (Azure AD) credentials and also by the permissions specified for the SAS. 

For this we are not using Azure AD, so we ll skip this type.

### Account SAS
> An account SAS is secured with the storage account key. An account SAS delegates access to resources in one or more of the storage services. All of the operations available via a service or user delegation SAS are also available via an account SAS. Additionally, with the account SAS, you can delegate access to operations that apply at the level of the service, such as Get/Set Service Properties and Get Service Stats operations. You can also delegate access to read, write, and delete operations on blob containers, tables, queues, and file shares that are not permitted with a service SAS. 

We are focused on reading files on Azure Blob, so we ll skip this type.

### Service SAS
> A service SAS is secured with the storage account key. A service SAS delegates access to a resource in only one of the Azure Storage services: Blob storage, Queue storage, Table storage, or Azure Files.

For generating service SAS, please refer here.
https://docs.microsoft.com/en-us/rest/api/storageservices/create-service-sas
HashMapクラスとHashSetクラス

#HashMapクラス
HashMapは、キーと値をセットにした要素の集まりを管理できるコレクションです。

下記は、元素名と原子番号をセットにして出力させてます。

```java

import java.util.HashMap; // インポート

public class Sample {
  public static void main(String[] args){
    // キーは文字列、値は整数
    HashMap<String, Integer> map = new HashMap<String, Integer>();
    String atom[] = {"水素", "ヘリウム", "リチウム", "ベリリウム"};
    map.put(atom[0], 1); // .put()でデータを格納
    map.put(atom[1], 2);
    map.put(atom[2], 3);
    map.put(atom[3], 4);
    System.out.println("---原子番号---");
    for(String s:atom){
      System.out.println(s + "は" + map.get(s) + "番"); // .get()で値を取得
    }
  }
}
```

```
---原子番号---
水素は1番
ヘリウムは2番
リチウムは3番
ベリリウムは4番
```

###主なメソッド
| メソッド | 機能 |
|:--|:--|
| get() | 指定したキーの要素を返す。 |
| put() | キーと要素を対応させます。 |
| remove() | 指定したキーの要素を削除します。 |
| clear() | すべてのキーと要素を消去します。 |
| containsKey() | 指定したキーの値が存在すれば、true、なければfalseを返します。 |
| isEmpty() | 要素がなければ、trueを返します。 |
| size() | 要素数を返します。 |

#HashSetクラス
HashSetは、重複なくデータを格納できるコレクションです。

下記は、APPLEを一文字ずつ格納し、出力しています。

```java
  
import java.util.HashSet;

public class Sample {
  public static void main(String[] args){
    HashSet<String> hs = new HashSet<String>(); // String型で生成
    hs.add("A"); //.add()でデータを格納
    hs.add("P");
    hs.add("P");
    hs.add("L");
    hs.add("E");
    for(String s:hs){ // 特殊for文で全て表示
        System.out.println(s);
    }
  }
}

```

Pを２つ格納し、重複が起きたので一回しか出力されない。

```
P
A
E
L
```

###主なメソッド
| メソッド | 機能 |
|:--|:--|
| add() | 要素を追加します。 |
| remove() | 指定した要素を削除します。 |
| clear() | すべて要素を消去します。 |
| contains | 指定した要素が存在すれば、true、なければfalseを返します。 |
| isEmpty() | 要素がなければ、trueを返します。 |
| size() | 要素数を返します。 |
【注意！】iOSでは背景画像が動いてしまう問題について

#はじめに
簡単なwebページを作っていざデプロイ。

そして、iPhoneなどの実機で確認。

しかし、開発時にレスポンシブ対応させたのにも関わらずレイアウトが異なってしまうってことに陥ってしまいます。

今回は、```background-attachment: fixed;```が効かないことについてまとめてみました。

#background-attachment: fixed;が効かない問題
スクロール時に背景画像を固定したい時、```background-attachment: fixed;```を使用すれば背景画像の固定が出来ます。

しかし、これ。iOSでは思うように動作しません。

と、言うよりも

```
background-attachment: fixed;
background-size: cover
```

を同時に使用した場合に動きません。

###なぜか？
>iOS has an issue preventing background-attachment: fixed from being used with background-size: cover - see details

[公式](https://caniuse.com/#search=background-attachment)でも記載されているバグみたいです。

###では、どうすれば？

#擬似要素を活用する

iOSでも背景を固定するためには、

**「bodyの擬似要素にbackground-imageをおく」**
（ちなみに、全体を囲う要素であればbodyでなくてもかまいません。）

事で実現できます。

```sample.css
body:before{
    content: "";
    display: block;
    position: fixed;
    top: 0;
    left: 0;
    z-index: -1;
    width: 100%;
    height: 100vh;
    background: url("#{$bgPath}about_back.jpeg") center no-repeat;
    background-size: cover;
}
```

要は、擬似要素ごと画面幅いっぱいに広げて固定します。

**画像を固定するのではなく、要素を固定することになるため背景を固定できます。**

そのため、
```background-attachment: fixed;```ではなく、```position: fixed;```を使用します。

```height: 100vh;```で画面の高さいっぱいにheightをとっています

###【ポイント】
**・背景画像の固定ではなく、要素自体の固定を利用することで、```background-attachment: fixed;```の利用を避ける。**

#参考
・[background:fixedでの背景固定はiOS（iPhone）でうまく動かないのでこれを使いましょう](https://y-com.info/contents/?p=5941)

・[【CSS】background-attachment:fixedがスマホだけ効かない原因と対処法](https://dezanari.com/css-background-attachment-fixed-sp/)
【transform: rotateX/rorateY】iOSでの挙動がおかしい訳は？

#はじめに
```transform : rotateY(90deg);```などを用いて、スクロール時に要素を回転させたい。

そういう時に使える便利な```transform```プロパティ。

そして、完成していざデプロイ！

しかし、iOS実機では動かない事態が起こってしまいました。

そこで、いくつかの落とし穴にハマったので記載していこうと思います。

#奥行きを作らないといけなかった
```sample.html
<div class = "section">
  <div class = "content"></div>
</div>
```

```sample.css
.section{
  margin: 0 auto;
  width: 100%;
}

.content{
  position: fixed;
  top: 200px;
  right: 100px;
  width: 50%;
  height: 50%;
  background-position: center center;
  background-size: cover;
  opacity: 0;
  transition: all 0.2s ease 0s;
  transform: rotateY(90deg);
  -webkit-transform: rotateY(90deg); 
}

.show .content{
  opacity: 1;
  transform: rotateY(0deg);
  -webkit-transform: rotateY(0deg); 
}
```

開発段階では、上記コードで問題なく期待通りの動作します。

ただし、デプロイ後、iOSで確認した際には状況が変わります。

僕の場合は、```transform : rotateY;```で回転しないどころか、スクロール時、画面が縦に真っ二つに割れていましまします。

では、どうすればよいのか？

##解決策は？
結論は、
**親要素にperspectiveプロパティを追加する**

```sample.css
.section{
  margin: 0 auto;
  width: 100%;

  /*追加*/
  -webkit-perspective: 500px;
  perspective: 500px;
}
```

perspectiveとは、

**「3D変形の奥行きの深さを指定するプロパティ」**です。

iOSでは、回転軸の位置が定められなく思うように動作できませんでした。

そこで、```perspective```で3D変形用の軸を定めています。

ここまでで、解決する方もいらっしゃるでしょう。

###しかし。

僕のように、```transform : rotateY;```をかけた要素に対して、```position: fixed;```を使っている場合。

今度は、実機では正常に動くが、開発時（それも、僕の場合はchromeの時にのみ）には思っている挙動はしてくれません。

###なぜか？

>'transform'プロパティに 'none'以外の値を指定すると、適用先の要素に新しいローカル座標系が確立されます。
[Transform Rendering Model](http://www.w3.org/TR/css3-transforms/#transform-rendering)

要は、```transform```を使用することで**3dでの判断になる為、固定位置が定まらない**という事です。

###じゃ、どうすれば？

・transformを外す
・html構造の親子関係を解消させる

仕様上の問題なので、上記のパターンで変更を加えましょう。

#参考
・[iOS8 Safariで-webkit-transform: rotateX/rorateYが効かない/要素が消える](https://qiita.com/ttake/items/47c710142cbf57ff2adc)

・[[CSS] transform:perspectiveを使用した、パタッと開いて閉じるサイドメニュー](https://theorthodoxworks.com/web-design/css-perspective-side-menu/)

・[position:fixedによる画面位置固定が出来ない、そんなときもあるよね。](https://qiita.com/takustaqu/items/e4b5ecb48fe866a5b92c)

・[これはハマった！スマホサイトのコーディング時に悩んだバグと仕様4選【iOS8情報あり】](https://liginc.co.jp/web/html-css/130658)

・[position:fixedが効かない事件簿](https://qiita.com/tiwu_dev/items/797459d9789db4379691)
Spring Boot で実装した REST API に swagger-ui を導入する

# 概要
- Spring Boot で REST API を実装している前提
- API のドキュメントを生成する swagger-ui を導入する
- gradle に `io.springfox:springfox-boot-starter:3.0.0` を追加するだけ

# サンプルプロジェクト
- Spring Initializr で Spring Web を選択してプロジェクト新規作成
- REST API を実装
  - src\main\java\com\example\demo\api\DemoController.java を以下内容で作成
  
  ```java
package com.example.demo.api;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

@RestController
@RequestMapping("/api/demo")
public class DemoController {

    @GetMapping("/customers")
    public String[] customers() {
        return new String[] {
                "あいうえお",
                "かきくけこ",
                "さしすせそ"
        };
    }

    @GetMapping("/customer/{id}")
    public Map<String, String> customer(@PathVariable String id) {
        return Map.of(
                "id", id,
                "name", "名前",
                "address", "東京都");
    }
}
  ```

# swagger-ui 導入
- build.gradle に追加

```groovy:build.gradle
    implementation "io.springfox:springfox-boot-starter:3.0.0"
```

- アプリケーション起動
- http://localhost:8080/swagger-ui/ をブラウザで開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517184/725bbb0c-677b-0e71-7d2c-a44bf3e42dc3.png)

# 参考
- https://springfox.github.io/springfox/docs/current/
CentOS7 MACアドレス(HWADDR)を調べる

# 目的

- CentOS7でのMACアドレスの確認方法をまとめる

# 詳細

1. 下記コマンドを実行してネットワークの情報を出力する。

    ```terminal
    $ ifconfig
    ```
1. etherの行に続いて記載されている物がMACアドレスである。

    ![ifcfg-enp8s0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/771ebfba-0571-ebea-96ea-4bb8065c4c2c.png)
グーグルフォームで返信メールの時にでてくるe.namedValuesについて調べた

#グーグルフォームに自動返信メールを作るときにでてくるe.namedValues
自動返信メールはできたのですが、
e.namedValues　がなんなのか　ググってもすっきりするものがなかったので調べてみました。


##わからないこと
①e.namedValues['メールアドレス']で回答を取得しているものや、e.namedValues['メールアドレス'][0]で回答を取得しているものが混在している。どっちがいいのかしら。
②スプレッドシートの関数にnamedValuesがでてこないなぜ

そしてありました。
公式ドキュメントに e.namedValues
<a href="https://developers.google.com/apps-script/guides/triggers/events" rel="noopener noreferrer" target="_blank">https://developers.google.com/apps-script/guides/triggers/events</a>

##わかったこと
じつはいままでスプレッドシートの関数かとおもっていたのですが、フォームの関数なんですね。

**e.namedValues でフォーム送信の質問名と値を含むオブジェクトを取得できるのです。**
具体的には e.namedValuesでは↓のような値を取得できます。
{
  'First Name': ['Jane'],
  'Timestamp': ['6/7/2015 20:54:13'],
  'Last Name': ['Doe']
}
連想配列なんですね。
キーが質問名で値が回答で配列になっていました。
だから
e.namedValues['メールアドレス']だけのものや
e.namedValues['メールアドレス'][0]
の記述が乱雑しているのですね。

回答の部分が配列と分かった以上
e.namedValues['メールアドレス'][0]　の記述のほうが安心です。

なんかすっきりしました。
GoでCLIアプリケーション作成時にホットリロードする

# 背景と解決したい問題
Goの学習を進めるにあたり、簡易的なサンプルコードを書いて実行する、というサイクルを頻繁に回していました。
その際にいちいちエディタと実行するウィンドウを往復することになり、手数が増えて効率が落ちてしまっている実感がありました。
そこで、ファイルの更新を自動検知して自動でビルド&実行(ホットリロード)してくれる環境が欲しくなりました。

# 解決策

Go のツール、`gohr` を使うことをおすすめします。
https://github.com/longtime1116/gohr

## 導入と利用

[README.md](https://github.com/longtime1116/gohr/blob/master/README.md) に書いてある通り、以下のコマンドを実行します。

```shell
$ go get github.com/longtime1116/gohr
```

あとは、自分の開発しているワーキングディレクトリで `gohr` コマンドを実行すればOK。第一引数に出力ファイル名を指定します。

```shell
$ gohr main
```

# おまけ
このようなツールを使わなくても watch コマンドを使うと擬似的に同じような機能を実現できます。
状況に関係なく使える技なので、覚えておくと便利かもしれません。

```shell
# 1秒ごとにコマンドを繰り返す。
$ watch -n1 <コマンド>
```

(例えば↑で `watch -n1 go run main.go` とかやっておけば1秒おきに実行してくれる)
Vim上でツイートをニコ動のコメント風に流す

こんにちわ
ゴリラです

普段ブラウザでTwitterをしていますが、最近Vimとブラウザを切り替えるのが面倒だなと感じています。
そこで、Vimで作業しながらツイートをニコ動のコメント風に流したら便利なのでは？と思ったのでしました。

## 検証結果
![nico-like.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/880839c7-29f8-67d5-e10c-2e5a38a95e44.gif)

画面が埋もれて仕事できそうにないことがわかりました。
残念…

## 検証で使用するもの
- [twty](https://github.com/mattn/twty)
- Vim v8.1.1364 ~

## 検証方法
全体の流れは大まか次になります。

1. `twty`で定期的にtimelineのJSONを取得
2. JSONからツイートテキストを抽出
3. ウィンドウを生成して、右から左に移動させる

### `twty`で定期的にtimelineのJSONを取得
`twty`にはtimelineを指定した間隔でpollingする機能があります。
次のコマンドを実行すると20s間隔でtimelineのjsonが返ってきます。

```sh
twty -S 20s -json
```

Vimには外部コマンドを非同期で実行する`job_start`関数があるので、
これを使ってコマンドを呼び出すことで、ツイートのJSONを得られます。

```vim
call job_start(["twty", "-S", "20s", "-json"], #{
      \ out_cb: function('s:tweet'),
      \ err_cb: function('s:onerr')
      \ })
```

### JSONからツイートテキストを抽出
`out_cb`で指定した関数にJSONが入ってくるので、それをdecodeしてツイートテキストを取り出します。
`timer_start`でランダム遅延させて、ウィンドウを生成するタイミングをずらしています。

```vim
function! s:tweet(ch, msg) abort
  let obj = json_decode(a:msg)
  if obj.text is# ""
    return
  endif
  let wait = rand(srand()) % 12
  call timer_start(wait*800, function('s:comment', [obj]))
endfunction
```

### ウィンドウを生成して、右から左に移動させる
`popup_create`でウィンドウを作成します。
その際、ウィンドウの上下の位置をランダムで配置するため、`line`オプションに乱数を使っています。

```vim
function! s:comment(obj, timer) abort
  let winid = popup_create(a:obj.text, #{
        \ col: &columns - 40,
        \ line: rand(srand()) % &lines,
        \ minwidth: strlen(a:obj.text),
        \ maxwidth: 40,
        \ tabpage: -1,
        \ zindex: 300,
        \ })

  call timer_start(100, function("s:move", [winid]), #{
        \ repeat: -1,
        \ })
endfunction
```

ウィンドウを作成したら、また`timer_start`で動かしていきます。
一番左まで移動したらtimerを止めてウィンドウを消します。

```vim
function! s:move(winid, timer) abort
  let opt = popup_getpos(a:winid)

  if opt.col is# 1
    call timer_stop(a:timer)
    call popup_close(a:winid)
    return
  endif

  let opt.col -= 1
  call popup_move(a:winid, opt)
  redraw
endfunction
```

## 検証コード
ここに上げておきましたので、試してみたい方はどうぞ。
[skanehira/tweet-comment.vim](https://gist.github.com/skanehira/f2bdc6f408cfdf8bfe21cf10fc179aab)
シェルスクリプト　ファイルの存在で条件分岐

#ファイルやディレクトの存在の有無で条件分岐させたい　備忘録


**-eオプションとif文を組み合わせる**


「既にファイルが存在するなら、実行したい。」場合

```
#!/bin/bash
filename=hoge

if [ -e $filename];then
  echo "$filename exists"
fi
```


「すでにファイルが存在するなら余計なことはしなくない」という場合
**否定論理にしたいなら -e の前に ! をつける**

```
#!/bin/bash
filename=hoge

if [ !-e $filename];then
mkdir $filename
```

以上
ArrayListクラス

###通常の配列は、要素をいくつ格納するか決めてから使用します。

```java

int r [] = new int[4]

r[0] = 88;
r[1] = 45;
r[2] = 34;
r[3] = 47;
```
###しかし、予め要素数がわからないけど配列を使いたい場合に、Collection(コレクション)を使用します。
##コレクションの一つとしてArrayListクラスの使用例
下記は、10未満の乱数を発生させ0が出るまでArrayListに格納する処理です。

```java

import java.util.ArrayList; // インポートします。
import java.util.Random;

public class PracticeList {
  public static void main(String[] args) {
    ArrayList<Integer> al = new ArrayList<Integer>(); // 生成
    Random random = new Random();
    
    while(true){
      int randomValue = random.nextInt(10);
      if(randomValue == 0){
        break;
      }
      al.add(randomValue); // 0が出るまで一つ一つ格納
    }
 
    for (Integer n: al) { // 特殊for文で回し、一つ一つ表示
      System.out.print(n); // 出力結果例 : 234245...
    }
```

メソッドとしては、主に

add() -> 要素を追加　（上記例で使用）

size() -> 要素数の取得

remove() -> 指定した番号の要素を削除

isEmpty() -> リストに要素がない時、trueを返す
CPUバーストUnlimitedのEC2さんに乱暴したら課金された

[秘密鍵を10億個作ろう](https://qiita.com/umihico/items/c99b41c818c13531f83c)として遊休サーバーを使い始めたら、CPUバーストがUnlimitedであることに気づきました。危ない危ない。

以下のコマンドでEC2が自分の望む状態になるようコントロールしましょう。

```bash
# 一覧を出す。
$ aws ec2  describe-instance-credit-specifications
{
    "InstanceCreditSpecifications": [
        {
            "InstanceId": "i-1234567890abcdef0",
            "CpuCredits": "unlimited"
        },
        {　
            "InstanceId": "i-1234567890abcdef0",
            "CpuCredits": "unlimited"
        }
    ]
}

# インスタンスIDを指定してstandardにする
$ aws ec2 modify-instance-credit-specification --instance-credit-specification "InstanceId=i-1234567890abcdef0,CpuCredits=standard"
{
    "SuccessfulInstanceCreditSpecifications": [
        {
            "InstanceId": "i-1234567890abcdef0"
        }
    ],
    "UnsuccessfulInstanceCreditSpecifications": []
}


# インスタンスIDを指定してunlimitedにする
$ aws ec2 modify-instance-credit-specification --instance-credit-specification "InstanceId=i-1234567890abcdef0,CpuCredits=unlimited"
{
    "SuccessfulInstanceCreditSpecifications": [
        {
            "InstanceId": "i-1234567890abcdef0"
        }
    ],
    "UnsuccessfulInstanceCreditSpecifications": []
}
```

参考

- https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/burstable-performance-instances-unlimited-mode.html
- https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-credit-specification.html
- https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/burstable-performance-instances-unlimited-mode-concepts.html#how-burstable-performance-instances-unlimited-works
- https://qiita.com/digitalpeak/items/420732dfed1a6416711b
- https://qiita.com/kter/items/45c19119c170e52135df
- https://tech.smartcamp.co.jp/entry/aws-ec2-t2-unlimited
- https://dev.classmethod.jp/articles/notes-on-using-t2-unlimited/#toc-t2-unlimited2
- https://thr3a.hatenablog.com/entry/20180831/1535674868
Rigging the Lottery: Making All Tickets Winners 【5 Discussion & Conclusion】【論文 DeepL 翻訳】

この記事は自分用のメモみたいなものです.
ほぼ [DeepL](https://www.deepl.com/home) 翻訳でお送りします.
間違いがあれば指摘していだだけると嬉しいです.

翻訳元
[Rigging the Lottery: Making All Tickets Winners](https://arxiv.org/abs/1911.11134)

前: [【4 Empirical Evaluation】](https://qiita.com/tomato_/items/ba22aa68a63e7d551f08)
次: ないよ


# 5 Discussion & Conclusion

### 訳文

本研究では, スパースなニューラルネットワークを効率的に学習するためのアルゴリズムである ‘Rigged Lottery’ (RigL) を紹介する. 与えられた計算予算に対して, RigL は既存の密からスパースへ, スパースからスパースへの訓練アルゴリズムよりも高い精度を達成する. RigL は3つの異なるシナリオで有用である. (1) 配備を目的としたスパースなモデルの精度向上, (2) 限られたイテレーション数しか訓練できない大規模でスパースなモデルの精度向上, (3) スパースプリミティブと組み合わせて, 通常では不可能な大規模でスパースなモデルの訓練を可能にする.

第3のシナリオは, ハードウェアおよびソフトウェアによる sparsity のサポートが不足しているため, 未踏のシナリオである. それにもかかわらず, 現在のハードウェア上でのスパースネットワークの性能を向上させる作業が続けられており (Hong et al., 2019; Merrill & Garland, 2016), 新しいタイプのハードウェアアクセラレータは, パラメータの sparsity をより良くサポートするようになるだろう (Wang et al., 2018; Mike Ashby, 2019; Liu et al., 2018; Han et al., 2016a; Chen et al., 2019). RigL は, そのような進歩を利用するためのツールを提供し, そのためのモチベーションを提供する.


### 原文

In this work we introduced ‘Rigged Lottery’ or RigL, an algorithm for training sparse neural networks efficiently. For a given computational budget RigL achieves higher accuracies than existing dense-to-sparse and sparse-to-sparse training algorithms. RigL is useful in three different scenarios: (1) To improve the accuracy of sparse models intended for deployment; (2) To improve the accuracy of large sparse models which can only be trained for a limited number of iterations; (3) Combined with sparse primitives to enable training of extremely large sparse models which otherwise would not be possible.

The third scenario is unexplored due to the lack of hardware and software support for sparsity. Nonetheless, work continues to improve the performance of sparse networks on current hardware (Hong et al., 2019; Merrill & Garland, 2016), and new types of hardware accelerators will have better support for parameter sparsity (Wang et al., 2018; Mike Ashby, 2019; Liu et al., 2018; Han et al., 2016a; Chen et al., 2019). RigL provides the tools to take advantage of, and motivation for, such advances.
v-if/v-showと$vuetify.breakpointを使ってうまくレスポンシブができなかった件

こんにちは、[Yui](https://twitter.com/yui_active)です。

皆さんVue.jsでスマホのみサイドメニューなどを非表示にしたい場合、どうしていますか？
多分色々とやり方があるとは思うのですが、私はいつも表示非表示の切り替えは個人的に一番楽な`v-if`/`v-show`を使っています。

そして画面サイズによって表示・非表示を切り替えるために、`v-if="$vuetify.breakpoint.xs"`というような形で簡単にレスポンシブを組んでいます。

今回、いつものように`v-if`/`v-show`と`$vuetify.breakpoint`を組み合わせて表示非表示を切り替えようとしたら、うまくいかなかったので、代わりにscssで調整した方法をまとめます。

# $vuetify.breakpointとは？
そもそも、`$vuetify.breakpoint`とはどのような書き方かというと、Vuetifyでは下記のように画面サイズがあらかじめ決められており、例えば`v-if="$vuetify.breakpoint.xs"`と書くことで、その要素をスマホのみ表示にすることができます。

<img width="918" alt="スクリーンショット 2020-07-27 6.49.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670446/b3d95000-4e21-efb2-2522-2e6f852c99b6.png">
[Vuetifyドキュメントより](https://vuetifyjs.com/en/customization/breakpoints/)

ちなみに、v-ifとv-showの切り替えは、**v-ifがあまり頻繁に切り替えないとき、v-showは頻繁に表示非表示を切り替える場合**に使うのが良いとされています。（v-ifの方が切り替えの際に負荷がかかる。）

# 今回起こった問題

まずはこちらを見てください。

ボタンが押すとサイドコンテンツが表示されますが、その後、ボタンが消えています。

![ac672fcf879481c8676cba3870de29e2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670446/df41e71a-7f5e-2c6c-0cd7-15f8ace490ba.gif)

今回は、ヘッダーの下に紫色の「開く」のボタンを置いて、そのボタンを置くとサイドコンテンツが表示されるようにしています。

PC版では、サイドコンテンツはデフォルトで表示をしているため、このボタンは表示する必要がありません。
なので、スマホでのみ表示にするためにこのように書きました。

```vuejs:App.vue
<v-btn v-if="$vuetify.breakpoint.xs"
 color="purple"
 dark
 @click.stop="drawer = !drawer"
>
   開く
</v-btn>

〜〜〜〜
<v-navigation-drawer
 v-model="drawer"
 absolute
 right
>
　<SideComment/>
</v-navigation-drawer>
```
※サイドコンテンツはページをわけて、`SideComment.vue`として作っています。

表示を見ると、上記の通りボタンは無事スマホでのみ表示されるものの、一度しか押せなくなってしまいました。ちなみに、今回はPCとスマホは頻繁に切り替わることもないと`v-if`を使っているのですが、`v-show`を使っても一度きりしか押せないのは変わりませんでした。

どうやら`v-if`/`v-show`と`@click`の動きは併用できないようです。
※もし併用できる方法を御存知の方はひっそりと私に耳打ちしてください。笑
（少なくとも色々と調べた限りでは、`v-if`/`v-show`と`@click`の動きを併用するのはあまり一般的ではないようでした。）

#どうしたか
`v-if`/`v-show`が使えないとなると、scssで`display`設定をするしかありません。
ということで、下記

```vuejs:App.vue
<v-btn v-if="$vuetify.breakpoint.xs"
 class="sp-visible"
 color="purple"
 dark
 @click.stop="drawer = !drawer"
>
   開く
</v-btn>

〜〜〜〜
<style lang="scss" scoped>
 $pc-min: 960px;
 @mixin display_pc {
   @media (min-width: $pc-min) {
     @content;
   }
 }
 .sp-visible {
   @include display_pc {
     display: none !important;
   }
 }
</style>

```
クラス名をつけて、そこにscssを適用させています。
`@mixin`ははじめて使ったのですが、かなり便利でした。（参考：[Sassの「@mixin（ミックスイン）」の使い方と「引数」の解説](https://stand-4u.com/css/sass/mixin.html)）

今回はタブレットの表示はとりあえずおいておいて、とりあえずPCでのみ非表示にすることが目的だったので、このようなざっくりとしたブレイクポイントで設定しました。

#完成形
![2f59efbbac9bb0ed978667ecc19c5f8a.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670446/cb64cc28-f9ff-542b-25dc-ac07c4826ea1.gif)

このような感じで、ボタンは押しても消えなくなったので、とりあえずは成功です。

もちろん、このままではまだまだレスポンシブとして不完全なので、引き続きレイアウトは整えますが、とりあえずは目標達成です！やったね！

今回`@mixin`にかなり感動したので、またまとめたいと思います。
見た目もスッキリ！ ウインドウの配置・サイズを変更する方法

ブラウザを操作していてキャプチャをとるとき、どうせならウインドウサイズを揃えて、きれいにキャプチャしたくなります。
マウス操作で、いい感じに変更してもよいのですが、少し手間です。
そんなときのため、PowerShellでサクッと解決する方法を調べてみました。

# ポイント

1. ウインドウサイズの変更は、user32.dll の `bool MoveWindow()` でできる。ただし、呼び出すためにお作法が必要。
2. ウインドウの一覧は、`Get-Process -Name $name | where { $_.MainWindowTitle -ne "" }` で取得できる。ただし、ブラウザで複数ウインドウを表示している場合、アクティブなウインドウのみ取得可能な模様。

# スクリプト

Edge, IE, Chrome, Firefox を対象に、1024x768サイズに変更するスクリプトです。
対象ブラウザやサイズ、位置は、お好みで変更してみてください。

```powershell:ブラウザサイズを変更する.ps1
$name = "msedge","iexplore","chrome","firefox"
$w = 1024
$h = 768
$x = 0
$y = 0
Add-Type @"
  using System;
  using System.Runtime.InteropServices;
  public class Win32Api {
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
  }
"@
Get-Process -Name $name | where { $_.MainWindowTitle -ne "" } | foreach {
  [Win32Api]::MoveWindow($_.MainWindowHandle, $x, $y, $w, $h, $true) | Out-Null
}
```

# 動作確認環境

- Windows 10
- PowerShell 5.1

# 参考にさせていただいたサイト

- [PowerShellでアプリケーションのウィンドウサイズを変更する。 | 迷惑堂本舗](https://maywork.net/computer/powershell-googlechrome-windows-size-reset/)
abstract(抽象クラス) と interface(インターフェイス) 

#abstract(抽象クラス)とは
抽象メソッドを一つ以上もつクラスのこと。

**抽象メソッド**とは、具体的な処理を記述せずに、引数やメソッド名の定義のみを宣言するメソッド。

```抽象クラスの宣言.java
abstract class クラス名{}
```

```抽象メソッドの宣言.java
abstract 戻り値の型 メソッド名(引数の型 引数名);
```

###特徴
⭕️スーパークラスのメソッドをサブクラスで**オーバーライド**（書き換え）できる。

❌クラスの多重継承できない。

❌直でインスタンス化ができない。

#interface(インターフェイス) とは
クラスに含まれるメソッドの具体的な処理を記述せずに、変数とメソッドの型のみを定義したもののこと。

```インターフェイスの宣言.java
interface インターフェース名{}
```

```インターフェイスの実装.java
class クラス名 implements インターフェース名{}
```

###特徴
⭕️メソッドの型だけ先に記述し、使用直前に処理を記述できる。

⭕️インターフェイスの多重継承OK。

#イメージ
###抽象クラス
孫悟空(スーパークラス)が孫悟飯（サブクラス）、孫悟天（サブクラス）の複数名に孫という苗字を引き継げる。

また、悟飯が婿入りすれば苗字が鈴木へ書き換えられる(オーバーライド)。

###インターフェイス
悟空からサイヤ人、チチから地球人という仕様を悟飯が引継ぎできる。

明確な遺伝子は、直前に決めれる。
AWS EC2 Konga導入

# 環境
Amazon Linux AMI release 2018.03

# インストールコマンド
```
$ curl -sL https://rpm.nodesource.com/setup_14.x | sudo bash -
$ sudo yum install -y nodejs
$ sudo npm install bower gulp sails -g
$ sudo yum install git
$ git clone https://github.com/pantsel/konga.git
$ cd konga
$ npm install
$ cd konga
$ cd config
$ cp -pr local_example.js local.js
$ npm start
``` 
起動すると、1338番ポートでGUIサービスが起動します。
セキュリティグループで外部（自分のIP）からTCP/1338番ポートに繋がるようにして、ブラウザからアクセスしましょう。

# 設定
- NEW CONNECTION

```
Name： （任意でユニークな名前）
Kong Admin URL： http://127.0.0.1:8001
```

# 参考
[aws linuxにnpmを導入する](https://qiita.com/rakuraku0615/items/dd5bcc1f8641c5bbb091)
`Error: UNABLE_TO_GET_ISSUER_CERT_LOCALLY` エラーで詰まった際に、参考にさせていただきました。

[KONGの運用を楽にするKONG Admin API用GUI 「KONGA」](https://blog.web.nifty.com/engineer/491)
UbuntuのOfficial Docker image内でlsb_release -cs相当のことを実現する

Ubuntuのdocker iamgeには`lsb_release`が入っていないため、Dockerfile中に`lsb_release`相当のことをするにはちょっと工夫が必要になります。`lsb_core`をインストールすれば使えるようにはなりますが、わざわざインストールするのもためらうときに使えるtipsです。

例えば、`lsb_release -cs`はOSのコードネームを取得するコマンドですが、これと同様のことをしたければ、下記の様に書くことができます。。要は`lsb_release`が参照している情報は`/etc/lsb-release`に格納されているので、そこから必要な文字列を取り出せばいいわけです。

```dockerfile
RUN export ubuntu_codename=$(cat /etc/lsb-release | grep DISTRIB_CODENAME | cut -d = -f 2)
```