OmniAICreator/Qiita-1.07M huggingface dataset:
【Laravel】諸々復習

この記事は以下の書籍を参考にして執筆しました。

- [PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

#ルーティング
##ルート情報の基本(GET)
```php5
Route::get(アドレス,関数等)
```
第2引数はクロージャ。

```php5
function (){
  return 値;
}
```
returnで返される値が表示内容。
##view
```php5
view(テンプレ名)
```
テンプレファイルをトードしてレンダリングして返す。
テンプレは`resources/views`フォルダの中に作る

##コントローラの利用
##シングルアクションコントローラの利用
1つのコントローラに1つのアクションだけしか用意しないという設計のこと
要するに
`コントローラ：アクション＝1：1`

```php5:シングルアクションメソッドの基本形
class クラス名 extends Controller
{
    public function __invoke()
    {
        //アクション処理
    }
}
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)


**これ以外にアクションメソッドは用意しない。**
ルート情報の記述も変わってくる。

```php5:ルート情報
Router::get('アドレス','コントローラ名');
```

>###invokeはPHPの基本機能
__invokeはPHPのマジックメソッド
__invokeはそのクラスのインスタンスを関数的に実行する。
インスタンスに()をつけて関数として呼び出せる。
したがってコントローラに限らず一般的なクラスも「インスタンスをそのまま関数として実行させたい」という場合に利用される。

##リクエストとレスポンス
ResponseとRequestをアクションメソッドで利用するにはこうする

```php5
public function index(Request $request,Response $response){...
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

引数に追加するだけで使えるようになる。

>###なぜ追加するだけで使えるのか
理解のためには「サービス」と「サービスコンテナ」の機能を知る必要がある。
アクションメソッドに引数を追加することで、サービスコンテナによって対応するクラスのインスタンスがその引数に渡されていた。
この機能は**メソッドインジェクション**という

#PHPテンプレートの利用
##ビューについて
テンプレはLaravelのビューを担当する。
##ルート情報でテンプレを表示する
###viewメソッド
```php5
view('フォルダ名.テンプレ名')
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

テンプレはviewsフォルダから検索される。
例えば、`view('hello.index')`なら
`views/hello`フォルダの
`index.php`ファイルが読み込まれる。

単に`view('hello')`だけなら`hello`という名前の**ファイル**を探してしまう。

##サービスとビューコンポーザ
##ビューコンポーザ
コントローラとは別にビジネスロジックを使って必要な情報などを処理しビューにデータを結合する機能。
##ビューのビジネスロジック
ビューコンポーザを作ってアプリに登録することでビューをレンダリングする際に処理を自動実行できる。
AWSのAMIから構築したredashのmetadataに接続する（操作ログを閲覧する）

AWSのAMIから構築したredashのDatasouceにmetadata(postgresql)を追加してみました。
そのままだとdocker上で動いているpostgresqlに接続できない（ポートが未指定のため）から、docker-compose.ymlを変更して再起動

```
$ cd /opt/redash/

# Docker停止
$ sudo docker-compose stop server scheduler scheduled_worker adhoc_worker

# postgresqlのポートを指定
$ sudo vi docker-compose.yml
下記の2行を追加
==================
    ports:
      - "5432:5432"
==================
 
～～～～～
  postgres:
    image: postgres:9.6-alpine
    ports:
      - "5432:5432"
    env_file: /opt/redash/env
    volumes:
      - /opt/redash/postgres-data:/var/lib/postgresql/data
    restart: always
～～～～～

# 更新
$ sudo docker-compose run --rm server manage db upgrade

# Docker起動
$ sudo docker-compose up -d

```

これでdockerの外から接続可能になる

redashのDatasourceを作成する
Hostはlocalhostだとうまく接続できないため、サーバ自身のプライベートIPを設定
Passwordは`/opt/redash/env`に記載されている`POSTGRES_PASSWORD=xxxxxx`を設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115341/cd8d109b-67b2-3e38-0f6b-97ab9c695b91.png)

これでredash上でmetadataの参照が可能になる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115341/69a9012b-08e5-5fc6-6c41-c157296a4a6f.png)

eventsテーブルに操作ログがある

ちなみにeventsのデータはapiでも取得できる`https://redash.xxxx/api/events/page=1&page_size=100`
特定の文章から URL を削除（置換）する

# やること

`I like http://hoge.com and https://piyo.net.`

この文章から URL を削除して

`I like  and .` 

にしたいと思います。


```swift:Playground
import UIKit

var input = "I like http://hoge.com and https://piyo.net."
let detector = try! NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)
let matches = detector.matches(in: input, options: [], range: NSRange(location: 0, length: input.utf16.count))

var urls: [String] = []
for match in matches {
    guard let range = Range(match.range, in: input) else { continue }
    let url = input[range]
    urls.append(String(url))
}
print(urls)
urls.forEach{ url in
    input = input.replacingOccurrences(of: url, with: "")
}
print(input)
```

```swift:output
["http://hoge.com", "https://piyo.net"]
I like  and .
```

できました。
ラズパイカメラでTensorflowによる手書き文字認識&結果をLED表示

# 作るもの
ラズパイのような軽量なデバイスで、ディープラーニングを動かすプロトタイプを作ってみる。
手書き文字 → カメラ → ラズパイ（Tensorflowで処理）→ 8x8 LED（結果表示）
![20200628_232725.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80263/10758531-a4cb-c6bc-590a-e1caa480cbae.jpeg)

# ラズパイにTensorflow環境を構築する
https://www.tensorflow.org/install/pip?hl=ja#raspberry-pi_1
今回は仮想環境ではなく普通にインストール。

```
$ sudo apt update
$ sudo apt install python3-dev python3-pip
$ sudo apt install libatlas-base-dev        # required for numpy

$ pip3 install --user --upgrade tensorflow  # install in $HOME
```

# MNISTデータを学習しモデルを保存
MNISTデータとは、

```python:learnNum.py

```
[githubリンク]

## プログラムを動かす
MacのDocker環境だと動いていたが、ラズパイに作った環境だと下記修正が必要になった。

```python
# h5pyがないエラーが出たのでインストール
ImportError: `save_model` requires h5py.
$ sudo apt-get install python3-h5py

# tf.image.decode_image だと怒られたので、下記に変更。
tf.image.decode_jpeg

# np.expand_dims だと怒られたので、下記に変更。
tf.expand_dims

#steps引数の指定が必要だと怒られた。
ValueError: When using data tensors as input to a model, you should specify the `steps` argument. 
predictions = new_model.predict(img_expand, steps=1)
```

# MNISTモデルの読み込み
```python:predictNum.py
mnist = keras.datasets.mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
```
テスト画像を食わせてみる。
<img width="62" alt="3.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80263/14f96f5f-3d88-bed8-b184-108ff5bf31c4.jpeg">
「3」と認識し、動作確認は成功。
[githubリンク]

# カメラ画像の取得
```python:predictNum.py
import picamera

camera = picamera.PiCamera()
camera.capture('image.jpg')
```

# 画像を切り取り黒背景化する
```python:predictNum.py
# 画像の読み込み
img_path = "./image.jpg"
img_raw = tf.io.read_file(img_path)
img_tensor = tf.image.decode_jpeg(img_raw)
img_crop = tf.image.crop_to_bounding_box(img_tensor, 0, 300, 620, 620) #切り取り
img_rot = tf.image.rot90(img_crop, k=2) #180度回転
img_inv = tf.bitwise.invert(img_rot) #白黒反転
img_final = tf.image.resize(img_inv, [28, 28])
img_final = img_final/255.0

# 次元をそろえる
img_gray = tf.image.rgb_to_grayscale(img_final)
img_squeeze = tf.squeeze(img_gray)
img_expand = (tf.expand_dims(img_squeeze,0))
```

これだけだと画像のコントラストがはっきりせず正しく判定されない。

# Pillowで画像を前処理する
コントラストを強くし、明るくしてみる。

```python:predictNum.py
from PIL import Image
from PIL import ImageEnhance
filename = 'image.jpg'
img = Image.open(filename)
con1 = img.convert('L')
con2 = ImageEnhance.Contrast(con1)
con3 = con2.enhance(3.0)
con4 = ImageEnhance.Brightness(con3)
con5 = con4.enhance(3.0)
con5.save('./image_con.jpg', quality=95)
```

いけた！！

# 8x8LEDに結果を表示する
http://asamomiji.jp/contents/how-to-use-adafruit-8x8-mini-led-matrix-for-raspberry-pi

Adafruit公式のライブラリを使用する。

```python:led.py
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
from Adafruit_LED_Backpack import Matrix8x8

display = Matrix8x8.Matrix8x8()
display.begin()
display.clear()

image = Image.new('1', (8, 8)) 
draw = ImageDraw.Draw(image)

font = ImageFont.load_default()
draw.text((1, -1), '8', font=font, fill=255)

display.set_image(image)
display.write_display()
```

注意点は、結果は数値でなく文字列で入力すること。
【PowerShell】実行演算子にパラメータを渡す

[以前の記事](https://qiita.com/AWtnb/items/efa5b6f498c060620489) で書いた実行演算子 `&` でファイルを実行しようとしたとき、思いつくまま下記のようにパラメータを指定したらエラーになりました。

```powershell
# これはエラー
& "C:\Users\my script folder\mytool.exe --param hoge"
```

## 解決策

引用符の外側に書いてやればよかったようです。

```powershell
& "C:\Users\my script folder\mytool.exe" --param "hoge"
```

変数を渡すこともできます。

```powershell
& "C:\Users\my script folder\mytool.exe" --param $fuga
```

パラメータ名部分は文字列として指定することもできました。

```powershell
& "C:\Users\my script folder\mytool.exe" "--param" $fuga
```

実行ファイル名までが演算子の対象なのかと思って括弧でくくってみたらエラー。
`&` はそれ以降の文全体を対象にしているようです。

```powershell
# これはエラー
(& "C:\Users\my script folder\mytool.exe") "--param" $fuga
```

パラメータは配列として渡すこともできるようです。

```powershell
& "C:\Users\my script folder\mytool.exe" @("--param",$fuga)
```

なお、配列として扱う場合はパラメータ名も文字列とする必要があるようです（引用符を外したらエラーになりました）。

```powershell
# これはエラー
& "C:\Users\my script folder\mytool.exe" @(--param, $fuga)
```


`@` を省略してもいい模様。

```powershell
& "C:\Users\my script folder\mytool.exe" ("--param",$fuga)
```

でも流石に括弧まで外すとエラーになりました。

```powershell
# これはエラー
& "C:\Users\my script folder\mytool.exe" "--param",$fuga
```

パラメータが複数ある場合も基本的には同じようなのですが……

```powershell
& "C:\Users\my script folder\mytool.exe" --param1 $foo --param2 $baa
& "C:\Users\my script folder\mytool.exe" "--param1" $foo "--param2" $baa
& "C:\Users\my script folder\mytool.exe" ("--param1",$foo) ("--param2",$baa)
```

配列でパラメータ名と値を結びつけているのかな、と思ったら少し違うようです。配列を展開して順に渡しているのでしょうか🤔。

```powershell
# これはエラー
& "C:\Users\my script folder\mytool.exe" ("--param1",$foo),("--param2",$baa)

# これはエラーにならない
& "C:\Users\my script folder\mytool.exe" ("--param1",$foo,"--param2",$baa)
```

変数を渡すのでなければ stop-parsing symbol （パース終了シンボル？）の `--%` を使えばいいようです。

```powershell
& "C:\Users\my script folder\mytool.exe" --% --param hoge
```
よく使うGitコマンドを書いてみた（随時更新中）

#はじめに
これは未経験エンジニアが、フルスタックエンジニアになるための備忘録である:point_up:

##よく使うコマンド一覧

ディレクトリでgitを使い始めるためのコマンド

```
git init
//リポジトリしたいファイルにgit init
```

作成したリポジトリをローカルにコピーする

```
git clone SSHまたはHTTPSのGitHubにある文字列
//リモートからローカルにコピーするコマンドですね！  
```

現在gのgitの状態を確認する

```
git status
//赤字で表示されたら管理外 緑色ならば管理されている状態（ステージング状態）
//ファイル変更したら後に実行するとmodified file名 と表示される
```

ファイルをgitに管理（ステージング状態）にする

```
git add ファイル

git add .
//全てのファイルを git したい場合
```

現在の状態をgitにコミットメッセージを残してセーブする

```
git commit -m "何か文字を入れてね"
//コマンドを実行したら現在の状態が git に保存される
```

git のコミット履歴を確認できるコマンド

```
git log 
//何時何分に誰が変更したかを表示してくれる
```

リモートにアップロードを行う

```
git push origin
//origin というのはリモートサーバのこと
```

リモートリポジトリに接続確認 
鍵認証用

```
 ssh -T git@github.com
The authenticity of host 'github.com (192.30.255.113)' can't be established.
RSA key fingerprint is SHA256:nTmki6kXUpJJUDNE1IGOCspRomTxdCHYSviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)?
//が表示されたらyes と入力し、returnキーを押してください

Hi （自分のアカウント名） You've successfully authenticated, but GitHub does not provide shell access.
このように表示されたら接続は成功
```
```
$ git remote add origin git@github.com:アカウント名/リポジトリ名.git
$ git push -u origin master
```
画面に以下のようなメッセージが表示されたらpushは完了。

```
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (5/5), 420 bytes | 420.00 KiB/s, done.
Total 5 (delta 0), reused 0 (delta 0)
To github.com:BabaShun/sample.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.
```
【UiPath】 UiPathを使いはじめての所感やメモ


# 告知

[UiPathのノート](https://github.com/ymd65536/uipath)を作成しています。
参考になれば幸いです。

---

# はじめに

[前回](https://qiita.com/ymd65536/items/a78db9de32c1cfa23155)

オススメの書籍(ふつうのURL)
[絶対失敗しない! ロボット1000体を導入してわかったRPA成功の秘訣](https://www.amazon.co.jp/dp/4798061727/ref=cm_sw_r_cp_apa_i_1rWdFb9XERV45)

RPAで有名なUiPathが職場に導入されました。
しばらく触ってみた所感とよき使い方について書きます。

--------------------------------
# 結論から申し上げますと

**とっても便利・・・だけどなんか惜しい！**
私の知らない使い方があるのかもしれないけど
とりあえず、そう思った。

--------------------------------
# 良いところ

・動作が速い
・Elementの認識率が良い
・メタデータの管理にjsonが使える
・条件式などの文法にVBやC#が使われている
・Officeとの連携が強い


--------------------------------
# 悪いところ

・動作が速すぎること
・OracleForm等のElementの認識に一工夫必要なところ
・onchangeイベントを発火させるのにキーボード入力が必要なこと
・細かいアクティビティの仕様に気づかないとハマること
・文字列の変換処理に弱いこと
・過度な条件分岐を入れると複雑怪奇になること
・端末にインストールされていないと使えないこと＊
・優れた機能があるのにも関わらず使われていない

＊サーバ型ならリモート先で利用できるがリモート元では使用できない。

--------------------------------
# 全体的な評価

Excel文化の会社にはとても良い薬になると思う。
どこで役に立つかわからないWindowsアプリケーションの
知識が役に立つこともあったりなかったり。。。

---
# すっげー言いたいこと

**サーバ上で処理できることを**
**わざわざローカルAndクライアントで**
**処理しようとするのは単なる無駄**

なので
そこんところは製品を無理に利用せず
最適解を常に求めていきたい。

---
# 弱点
UiPath等のRPA製品は操作の対象がなければ
なんの役にも立たないこと。


---
# 惜しいところ
自分がもったいないなと思うことは
その操作の対象を作ることまで

一括で提供すれば、案件や業務の
コントロール性がめっちゃ上がるのに
ベンダー頼みでシステムを発注してしまうこと。


----
# 他、気になること

学習コストが高い。
コミュニティ版を使えば
金銭面の問題は解決できそうだけど

ActivityとかElementとかそのあたりの概念が
プログラマかつエンジニアの私にはきつかったな。

---

# きつかったところ

主にElementは「JavaScript」などで言われている
Elementとは違うということ

アクティビティの仕様に気づかないとハマるということ

---
# アクティビティの仕様

シナリオ作成をやっていくなかで
アクティビティをうまく活用しなければ
効率化は夢のまた夢

---
# GetVisibleTextの仕様

表示されているテキストを取得すると聞いて
取得しようにも取得できなくてハマる。

実際には画面を最大化して
画面上に文字が表示されていないと
捉えられないという罠がある。

---
# SetTextの仕様
SetTextはOracle Formでは機能しないこと
代わりにType Into アクティビティを使う。

---
# プルダウンメニューのonchangeイベントが発火しない

これはイベントのメソッドを強制発火させれば
おおむねイケる感じはする。
JavaScriptのアクティビティで強制発火させるとイケる。
**がしかし RPA太郎な皆さん、特に非ITな方には嫌われる書き方なので**
**キーボード入力で発火させる。結局は人間の動き**

---
# 気づいたこと
人間的なシナリオの組み方を意識すると
結構、安定したシナリオ作成ができる。

例えば、マウスクリックはクリック対象にhoverしてから
クリックするとうまくクリックできたりする。
クリックシュミレートを活用したりするのも有効

---
# クリックシュミレート

画面範囲外のクリック可能な要素もクリックできるように
してくれるすごいやつ

クリックがうまくいかない時はクリックシュミレートの
設定を見直したりするとうまくいく。


---
# UiPathの根幹

dotNetFrameworkですね。
Activityが利用するライブラリ群ですが
Microsoft Docsに仕様が書いてあります。
実際にアクティビティ本体を作る人もいるみたいですね。

---
# まとめ

これからガンガンUiPathを使って効率化してきたい。
（本業のおまけ程度に）

---
# おわり
【Laravel5.5】 tinkerコマンドで管理者ユーザー登録

<h1>やりたいこと</h1>
今回はタイトルにもある通り、tinkerコマンドを使い管理者(Admin側)でのユーザー登録の流れを解説しようと思います。

<h1>なぜコマンドで登録するのか</h1>
Laravelでは標準で用意されている会員登録機能が認証(Auth側)のみ用意されており、管理者ユーザーのテーブルで直接パスワードを入力してインサートしてもハッシュ化されていないためログインが出来ません。
そのためtinkerコマンドでハッシュ化したパスワードをインサートする必要が出てくる場合があります。

<h1>コマンド操作流れ</h1>
```PHP:tinker
php artisan tinker
Psy Shell v0.9.12 (PHP 7.1.29 — cli) by Justin Hileman
>>> use App\Admin;
>>> $admin = new Admin();
=> App\Admin {#2914}
>>> $admin->name = 'ユーザー名';
=> "ユーザー名"
>>> $admin->email = 'hoge@hoge.co.jp';
=> "hoge@hoge.co.jp"
//bcrypt関数でハッシュ化
>>> $admin->password = bcrypt('パスワード');
=>"ハッシュ化されたパスワード"
>>> $admin->save();
=> true
//quitまたはexitでtinkerの終了
>>> quit
```

こちらがtinkerコマンドでの管理者ユーザー登録の一連になります。
tinkerはメソッド等実行出来るのでデバッグや実際の動きを確認したり、
テーブルに登録されているユーザーの一覧を取得出来たり便利なので積極的に使いたいですね！

以上になります！LGTMを押していただけると励みになります。
お疲れ様でした！
【memberとcollection】

##memberとcollectionとは

現在ツイッターの写真投稿版のようなアプリを作成しているのですが、その作成途中で投稿の検索機能を実装する際に出てきたmemberとcollectionについてとそれぞれの違いについてアウトプットします。

memberとcollectionはルーティングを設定する際に使用しすることができ、生成されるURLと実行されるコントローラを任意にカスタムすることができます。

collectionはルーティングに:idがつかない、memberはつくという違いがあります。


<img width="647" alt="search1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673286/ef12e1c2-420a-ec2b-4384-26c2eb78f242.png">

上の画像のようにtweetsコントローラーのネストに入れてcollectionを記述すると、
以下の画像のルーティングになります。

<img width="592" alt="search2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673286/d17b02b8-012a-a816-0488-addd0821d46a.png">

URIを見てもidが入っていません。

一方、memberで記述した場合

<img width="652" alt="search3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673286/db7a99cf-17a9-abfb-714d-7d85a0239cac.png">

この場合のルーティングは以下の画像のようになります。

<img width="587" alt="search4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673286/39ce13a6-f174-729a-4252-ab206775286b.png">


このようにルーティングにidが入っています。

今回作成した写真投稿アプリの場合は検索結果としてあくまで一覧表示させたいだけでidごとの詳細ページは必要ないのでcollectionを使用しました。
セキュリティインシデント発生時の対応を考える

セキュリティインシデント時スピード感を持ち対応できるよう、対策を調べてみました。

発言は全て個人のもので所属する組織の見解ではありません。


# 目的
有事に備え（インシデント発生前、発生後のマニュアル）

# 想定するセキュリティインシデント
- 情報漏洩
- マルウェア感染
- サービス不能攻撃（DoS、DDoS、EDoS）
- 紛失、故障等



# 事前に準備が必要なこと
- 従業員のセキュリティ意識向上の努力
- 適切なマルウェア対策
- 使用製品のセキュリティ情報を収集・対策
- 適切なログ取得
- 侵入検知システムによる監視
- 適切なバックアップ、遠隔への保存
- サービスの復旧優先度を定める
    - 優先度3
        - 業務が停止することは許されない
    - 優先度2
        - 24時間以内に復旧しなければならない
    - 優先度1
        - 3日以内に復旧しなければならない
    - 優先度0
        - インシデント発生時は停止しても良い
- 社内向けに攻撃訓練を行う
    - 標的型メール送付訓練など


# 有事に備えインシデントレスポンスを行う
- インシデント発生時を想定し、


# インシデント発生の疑いがある場合（従業員の対応）
1. 早急に社内のセキュリティ委員会、担当者に連絡
- PCが感染していると思われる場合、下記の対処を行う
    - ネットワークから隔離（感染拡大を防ぐ）
    - PCの電源は切らない（シャットダウンすると証拠が消える場合も）

# インシデント報告を受けた際（セキュリティ担当者）
- 日時を記録し管理する
1. 状況把握し、対応方法を指示する
    - インシデント発生の真偽
    - 被害を発見した日時
    - 被害の拡大範囲
    - 被害内容
    - 被害原因
    - 対応方法
2. 報告する
    - 情報システム部
    - 広報担当
    - プロバイダー（何のため？）

# 対応完了後
1. 優先度を元にバックアップからシステムを復元する
2. OS、アプリケーションの入れ替え、設定変更など
3. 再発防止計画の作成


# 引用、参考元
- JNSA セキュリティポリシーWG 作成ポリシーサンプル
    - https://www.jnsa.org/policy/incident_hyoujyun.pdf
エンジニアの生産性を高めるために行うこと（備忘録／途中）



# 人間を知る

## 記憶について
- 脳は短期記憶と長期記憶がある
    - 何度も刺激を与えると、長期記憶に持っていくことが可能
        - 人間の脳は保存ボタン一回ではだめ
            - 筋トレに近い
    - 脳と筋トレの違いは「報酬」
        - アウトプットで精神的な達成感などを設けられればなお良い
- 思い返しは、忘れたくらいのタイミング(1ヶ月など)で行うと良い

# 知識を構造化する
- 暗記する前に全体像をざっくりとでも把握する
- テストを行うと
【Android】inaccessible or not found　っていうエラーを解決【データベース】


##今回のこと
[ドットインストールのAndroidデータベース入門](https://dotinstall.com/lessons/basic_android_db_v2)を進めていて、Android Studio内のターミナルを使っていた時の出来事です。
コマンドラインを使ってエミュレーターの中に入り、データベースの中身を操作する、ということをやりました。

その際のエラーが解決できたので、備忘録として書いていきます。

##どう解決したか

もうすでにターミナルを使って、エミュレーターの中に入り、データベースのファイルがあるdatabasesディレクトリに移動していることを仮定して書いていきます。

まずは、lsでdatabasesディレクトリの中身を見ます。

```
generic_x86_arm:/data/data/パッケージ名/databases $ ls
```

>実行結果
(db拡張子のファイル)  (右と同じファイル)-journal

では、このファイルを、「sqlite3 ファイル名」でsqliteを起動しましょう。

```
generic_x86_arm:/data/data/パッケージ名/databases $ sqlite3 ファイル名
```

>実行結果
sh: sqlite3: inaccessible or not found

あれ、ちがう結果になった。。。

原因を調べてみたところ、
「Google Playが実装された仮想デバイスは、root権限でログインできない」とのことでした。
参考サイト　https://teratail.com/questions/186703

![スクリーンショット (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655348/805dcabc-f692-9fc1-2948-943f729810e6.png)

「Play ストア」欄に、三角マークがついていないものを新たにダウンロードなりして、それを起動しましょう。

起動出来たら、上のほうで省略しましたが「adb shell」からまた同じ手順でコマンドを入力していきましょう。
恐る恐る「sqlite3 ファイル名」と入力すると、

>実行結果
SQLite version 3.28.0 2020-05-06 18:46:38
Enter ".help" for usage hints.
sqlite>

できたーーー！！
こんな感じの文が出てきたら起動が成功です。

##結論
仮想デバイスがGoogle Playが実装されているかそうでないか、確認してみよう。

##参考にさせていただきました
[Androidデータベース入門 (全10回) - プログラミングならドットインストール](https://dotinstall.com/lessons/basic_android_db_v2)(有料サービス)
[Android - ADBコマンドをroot権限で使いたい｜teratail](https://teratail.com/questions/186703)
c++3つの数を小さい順に整列させる

与えられた3つの数を小さい順に並び替える。

1：１番目の数と２番目の数が逆順なら並び替える。
2：２番目の数と３番目の数が逆順なら並び替える。
3：１番目の数と２番目の数が逆順なら並び替える。

```c++
int main() {
  int a, b, c;
  std::cin >> a >> b >> c;
  
  if (a > b) {
    std::swap(a, b);
  }
  
  if (b > c) {
    std::swap(b, c);
  }

  if (a > b) {
    std::swap(a, b);
  }

  std::cout << a << b << c << std::endl;
  return 0;
備忘録：30秒で確認 デザインパターンとは



## デザインパターンとは
オブジェクト指向の優れた設計事例
有名なGoFのデザインパターン（書籍)では、23のパターンが紹介されている

### オブジェクト指向
コードの再利用による**信頼性・生産性**の向上
　┗ そのために、再利用性の高いクラス、ライブラリ作りが重要になる

### メリット
- 再利用性の高い柔軟な設計ができる

### こんな場面で役に立つ
- 抽象化

## 特にお世話になった参考文献様
- デザインパターン / TECHSCORE
    - https://www.techscore.com/tech/DesignPattern/index.html/
ローカル環境でLambda開発を進める際の私的ベストプラクティス

# TL;DR
- AWSマネジメントコンソール上ではLambdaのコードを編集しない
- コードは全てバージョン管理が有効になったローカルIDE上で開発し、docker-lambdaを利用して迅速にテストできるようにする

# ローカルでLambdaを開発するフローを考える
## 最も単純なLambdaの開発プロセス
- AWSマネジメントコンソールを利用した最も単純なLambda開発のフローを整理すると、以下のフローになります

1. ローカルでコードを書く
1. AWSマネジメントコンソールにログイン
1. 関数を新規作成、ローカルで編集したコードをブラウザ上のエディタにコピー&ペースト
1. 関数の実行テスト
1. 失敗した場合は原因を特定してローカルのコードを再編集（ここで直接ブラウザ上のエディタを編集したくなるが、ローカルのコードと同期が取れなくなってしまう）
1. 修正したコードををブラウザ上のエディタにコピー&ペースト
1. 成功するまで4〜6を繰り返す必要がある（！）。手作業でコピペするのは辛く、イケてない。

- Lambda上で動作することが保証されているコードを一回だけ動かすようなケースであれば、上記までのやりかたでもそこまで不便な点は感じないかもしれません。
- しかし実際の業務においてはコーディングとテスト実行を幾度も繰り返すことになるはずです。その場合、上記フローでの開発作業には以下のような問題があります
    - AWSマネジメントコンソール上でコードを修正してしまうと、バージョン管理されているローカルのコードと同期が取れなくなってしまう
    - Lambda Layersの開発・テストをする場合、圧縮してデプロイなど非効率的で手間のかかる作業が必要になる

# dockerコンテナを利用した効率的なlambda開発
- https://github.com/lambci/docker-lambda
- リアルなLambda実行環境を模した、Lambdaのローカル開発環境のサンドボックスを提供してくれるOSSプロジェクト。詳細はリンク先を。
- ローカル環境でコーディングしているLambda function、Layersを都度コンテナ内で実行して確認することができるので、効率的なLambdaの開発が可能になります。
- リアルなLambda実行環境とは、Lambda関数が実行される際にマネージドでLambdaのコードがデプロイされるAMIのことです。
  - ファイル構造
  - 権限
  - 環境変数
  - ユーザ
  - プロセス
  - など

## docker-lambdaを利用したLambdaの開発プロセス
Lambdaが正常に動作することのテストを、以下の2ステップまで圧縮できます。
1. ローカルでコードを書く
2. docker-lambda上で実行テスト（`docker run`するだけで実行完了！）
3. デプロイ

- lambda関数のテストが、以下のコマンドだけで完了するのです。感動しますね。

```bash
docker run --rm \
  -v <code_dir>:/var/task:ro,delegated \
  [-v <layer_dir>:/opt:ro,delegated] \
  lambci/lambda:<runtime> \
  [<handler>] [<event>]
```

## docker-lambdaを利用したLambda function実行の例
- docker-lambdaのREADMEに記載にある通り、コンテナ内の`/var/task`に関数のハンドラー、`/opt`にLayersのコードをマウントして実行することで、コンテナ内で関数を実行されることができます。
- これでいちいちLayerを圧縮する必要も、ローカルのコードを都度マネジメントコンソールのエディタ上にペーストする必要もなくなります。
- 以下のサンプルでは、ハンドラーが`/develop/lambda-local-proj/function`、Layersが`/develop/lambda-local-proj/layer`に存在しており、それをdocker-lambdaの指定のディレクトリにマウントして起動しています。
- ランタイムにPythonを利用しています。

```bash
# function、layerのディレクトリをマウントして実行
(venv) 6477:lambda-local-proj sentorei$ docker run --rm -v /Users/sentorei/develop/lambda-local-proj/function:/var/task:ro,delegated -v /Users/sentorei/develop/lambda-local-proj/layer:/opt:ro,delegated lambci/lambda:python3.8 lambda_function.lambda_handler
# ステータスコード200が返され、正常に実行できていることが確認できる
START RequestId: 9f1133d8-9bf4-1629-a2c2-832baf3cc23a Version: $LATEST
END RequestId: 9f1133d8-9bf4-1629-a2c2-832baf3cc23a
REPORT RequestId: 9f1133d8-9bf4-1629-a2c2-832baf3cc23a  Init Duration: 1835.48 ms       Duration: 588.13 ms     Billed Duration: 600 ms Memory Size: 1536 MB    Max Memory Used: 31 MB

{"statusCode":200,"body":"\"Hello from Lambda!\""}
```

- 煩雑なテスト作業から脱出し、ぜひ皆さんも快適なLambda開発を始めましょう。
ダイナミックプライシングで強化学習を使った論文読んでみた。

今回読んだ論文はAlibabaのチームによる論文でした！（Qiitaでの発信は初めて）
Alibabaが提供するECサイトのTmallでの価格決定で用いるアルゴリズムに強化学習のアプローチを取りましたという内容になります。
あとで更新をかける予定です。まずは簡易版で公開しようと思います。

学会ではRejectされているようでしたが、興味があったので読んでみました。

# Dynamic Pricing on E-commerce Platform with Deep Reinforcement Learning 

[URL](https://arxiv.org/abs/1912.02572)

## ダイナミックプライシングとは？
ダイナミックプライシングは在庫や市場での需要を見ながら動的に価格を決定することを指します。価格決定を自動化しようとします。ダイナミックプライシングにおける難しさは、大きく下記の三点があります。
1. 市場の定量化が難しい（予測が難しい）
2. 少しでも不適切な価格設定が大きな損失を招く。
3. 違法になるため、オンラインでのA/Bテストができない。（同時期に同じ商品に異なる価格をつけると違法になる。）

この論文はmarkdown pricingとdaily pricingに絞って考えると書かれていました。これらの違いは在庫の考え方の違いにあると解釈しています。markdown pricingは割引できる商品数には限りがあり、在庫数が有限と考え、daily pricingは在庫数が無限であると考えた上での価格決定をします。論文では直接説明がなかったので、全体を読んで上記のように解釈しました。
（ダイナミックプライシングの知識がなさすぎてこの解釈が合っているのかがわからないのですが...）

## Dynamic Pricing as a MDP
強化学習を使うためにダイナミックプライシングをマルコフ決定過程の枠組みに落とします。表でまとめます。

||記号|項目|
|---|---|---|---|
|製品|$i$||
|状態|$s_{i,t}$|値段、売上個数、収益、実際の値段、値引率、クーポン、ページビュー数、固有訪問者数、購入者数、顧客コメント、類似製品の状態|
|行動|$a_{i,t}$|製品ごとに行動空間が異なる。それぞれに価格帯が設定されており、その範囲内の価格|
|報酬|$r_{i,t}$|下節で説明|
|行動頻度|$d$|1日ごと|

行動空間が価格帯における価格で製品ごとに行動空間が異なる点などはならではの設定と思いました。

## 報酬関数の設計
報酬関数は製品ページを見た固有ユーザーあたりの収益を報酬関数として用います。
$r_{i,t} = revenue_{i,t}/uv_{i,t}$
保管コストなどが算出可能で、コストを算出できる場合は、固有ユーザーあたりの利益を報酬関数として用います。
$r_{i,t} = profit_{i,t}/uv_{i,t}$
しかし、ここまでの報酬関数ではfast-moving customer goods(FMCG；消費者向けの低価格の製品、日用品など)の価格決定の方策学習には向かないということが論文中で主張されています。（理由に関しては追記予定）
最終的に報酬関数は下記のような形になります。
$r_{i,t} = \frac{revenue_{i,t}}{uv_{i,t}} - \frac{revenue_{i,t-\tau}}{uv_{i,t-\tau}}$
この関数を**DRCR(The Difference of the Revenue Conversion Rates)**と呼び、時刻$t$における固有ユーザーあたりの収益と時刻$t-\tau$における固有ユーザーあたりの収益の差分で表されます。ここで、$\tau$は任意の時間間隔を表します。つまり、$\tau$だけ時間が経って、1人あたりの収益がどれだけ変化したかという値です。
この報酬関数で学習された方策は固有ユーザーあたりの収益の上昇幅が最大になるような挙動をすることを目指しているというわけですね。

## モデルの選択
行動空間は製品の値段ということは前節で記述しました。値段は連続値で表現することができます。ただし、スパンで区切ると離散値での表現も可能になります。強化学習では行動空間が連続か離散かで使用するモデルが変わります。
この論文では、連続値の場合はDDPGというモデル。離散値の場合はDQNというモデルを用います。

## 実験結果
DQNとDDPGと人が設定した場合であるControl groupの30日間のDRCRの推移の図が下図です。
<img width="304" alt="スクリーンショット 2020-07-15 22.02.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250271/cb71661d-a9d2-d67c-bd37-6b39b19fe589.png">

全ての日で強化学習のアルゴリズムで価格を設定した場合に人が設定するよりもDRCRが大きくなっていることがわかります。DRCRは固有ユーザー1人あたりの商品の売上の増減を表しているので、強化学習アルゴリズムを使った方が固有ユーザー1人あたりの商品の売上を増加させることができていることがわかります。

ここまで、強化学習によるダイナミックプライシングに関する論文の内容をまとめました。あまり時間がなく色々省いているので、今後時間を作って追記していけたらなと思ってます！
RaspberryPi3でGPS受信キットを使ってみる(Ruby)

# Goal

- GPSで位置情報が取れること

# 使ったもの

- ＧＰＳ受信機キット　１ＰＰＳ出力付き　「みちびき」３機受信対応
  - http://akizukidenshi.com/catalog/g/gK-09991/
- ラズパイ3B
- あとは抵抗とスイッチングダイオードくらい。

# 接続

手元に部品がそろっていたので秋月さまサイトに掲載されているマニュアルの回路図のまま組みました。スイッチングダイオードは実際は不要みたいですが、壊さないよう保険にもなるので繋ぎました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144344/92ffbea6-0d92-b390-43d0-bf2366adba92.png)

http://akizukidenshi.com/download/ds/akizuki/AE-GPS_manual_r1.06_s.pdf

初期設定でGPSのアンテナが真上を向く必要があったので、ブレッドボードが縦になっています。
ちなみに初期動作テストでLEDが点滅するまで30分くらいかかりました。窓際に置いたのですが置いた場所が悪かったのかも。

![IMG_4489.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144344/a52c32a7-55e2-5958-9478-542a299dc4a9.jpeg)

# ソース

下記ソースを実行するにはラズパイでUART接続関連の設定をする必要があります。そこはググってください:pray:
それさえすめばあとは特に大したことはやっていません。

なお、NMEAフォーマット解析用に[nmea_plus](https://github.com/ianfixes/nmea_plus)を使いました。 `SourceDecoder` まぢ便利:point_up:


```ruby
require 'serialport'
require 'nmea_plus'
sp = SerialPort.new('/dev/serial0', 9600, 8, 1, 0) # see: https://rubydoc.info/gems/serialport/SerialPort#set_modem_params-instance_method

trap 'SIGINT' do
  sp.close if sp
  exit
end

source_decorder = NMEAPlus::SourceDecoder.new(sp)
source_decorder.each_complete_message do |message|
  # see: https://github.com/ianfixes/nmea_plus/blob/master/lib/nmea_plus/message/nmea/rmc.rb
  if 'GPRMC' == message.data_type
    puts message.utc_time
    puts message.active? # false: データ無効
    puts message.latitude
    puts message.longitude
    #puts message.speed_over_ground_knots
    #puts message.track_made_good_degrees_true
    #puts message.magnetic_variation_degrees
    puts message.faa_mode # A: 単独測位(精度3m程度), D: 相対測位(精度0.4m程度) 
    puts
  end
end
# sp.close <=  ここには到達しないですね…
```

# 結果

以下実行結果です。

```bash
2020-07-15 12:35:37 +0000
true
33.725575
131.64382333333333
A
2020-07-15 12:35:38 +0000
true
33.72558166666666
131.64381833333334
A
```

ちなみにGoogleだと、検索キーワードに緯度経度を入れるとその地点でGooleMapが表示されますよー。
姫島村のオフィスです:grinning:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144344/fd6c6265-c811-9779-4e2c-dcbdf91b8488.png)


# 感想

- GPS受信キットのピンの並びがラズパイのピンに合わせてある（と思われる）ので繋ぐとき迷わなかった。
- 探せばたいてい便利なGemが見つかりますねー。意地でもRubyを使おう。
- あ、1PPS端子繋いだのに遊ぶの忘れてた。
簡単レシート印刷 receiptline で位置揃えしてみた

日本発のオープンソース receiptline でレシート印刷に少しずつトライしています。
まだレシートプリンターがないので、[前回](https://qiita.com/dopperi46/items/958a87ce0c04c59e9714)利用した開発ツールを引き続き使います。
今回は位置揃えです。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/1689da57-715a-9bd6-fb57-b3bec38e25ca.png)

# Markdown のテーブル

Markdown のテーブルを思い出してみましょう。
1 行目はヘッダー、2 行目は位置揃え、3 行目以降はデータです。

```markdown:Markdown
|left|center|right|
|:---|:---:|---:|
|ABCDEFGHIJ|abcdefghij|1234567890|
```

|left|center|right|
|:---|:---:|---:|
|ABCDEFGHIJ|abcdefghij|1234567890|

# レシートはテーブル

receiptline もテーブルなのですが、少し違いがあります。
ヘッダー行と位置揃え行がなく、どこまでもデータ行です。

レシートを無限に続くテーブルと考えているのですね。
では最初のこれもテーブル？

```text:ReceiptLine
hello, world!
```

文字列の両側にテーブルの区切り記号 `|` を追加してみます。
しかし、結果は変わりません。

```text:ReceiptLine
|hello, world!|
```

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/857a0ee4-3857-e39b-81ed-fe2374525a9e.png)

行の始めと終わりの `|` は省略されていたのです。
単純な文字列も立派なテーブルでした。

# 位置揃えはスペースで

位置揃え行を使わずに、どのように設定するのでしょうか？
それはスペースです。

## 左揃え

文字列の後にスペースを挿入すると、左揃えになります。

```text:ReceiptLine
|hello, world!   |
```

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/dc9857e4-8567-1e10-694b-056d681ffbe0.png)

## 中央揃え

文字列の前にもスペースを挿入すると、今度は中央揃えに。

```text:ReceiptLine
|   hello, world!   |
```

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/abdb7e9c-f8b0-391b-c0a6-b3c2e8d7dc88.png)

## 右揃え

文字列の後のスペースを削除すると、右揃えになります。

```text:ReceiptLine
|   hello, world!|
```

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/78c20489-c926-aa2d-8b67-94afedfc3aed.png)

# 省略形

行の始めと終わりの `|` が省略できることを利用した位置揃えです。
`|` がレシート用紙の端に見えてきませんか？

```text:ReceiptLine
|左揃え
|left
右揃え|
 right|
```

![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/277f71b7-6974-5732-d9fb-231244196950.png)

# 字下げのスペースを出力する

ソースコードやポエムに欠かせない、字下げ。
しかし、スペースはすでに位置揃えのために使われています。

そこで空白記号 `~` の登場です。`~` はスペースに変換されます。
ちなみに、チルダを出力したいときは `\~` と書きます。

```text:ReceiptLine
|hello, world!      |
|~hello, world!     |
|~~hello, world!    |
|~~~hello, world!   |
```

![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/f5b0828c-639e-755b-a007-0f7aa20991f8.png)

次回は 2 列のテーブルを試してみようと思います。
初心者がQiitaのタグ情報を取得しTOP10を可視化し考察する。

#目的
2020/7/14現在のQiitaのタグランキング(TOP10)の記事数とフォロワー数の相関性を調べたい。

###2020/7/14現在のタグランキング

| ランキング| タグ |記事数|フォロワー数|
|:---|:------------------:|------------------:|---------------:|
| 1位|[Python](https://qiita.com/tags/python)|43447|79118|
| 2位|[JavaScript](https://qiita.com/tags/JavaScript)|35443|77167|
| 3位|[Ruby](https://qiita.com/tags/Ruby)  |28098|42793|
| 4位|[Rails](https://qiita.com/tags/Rails) |24287|29232|
| 5位|[PHP](https://qiita.com/tags/PHP)  |20276|47787|
| 6位|[AWS](https://qiita.com/tags/AWS)|19735|8584|
| 7位|[iOS](https://qiita.com/tags/iOS) |16253|38170|
| 8位|[Java](https://qiita.com/tags/Java) |15026|50361|
| 9位|[Docker](https://qiita.com/tags/Docker)|14948|7636|
| 10位|[Swift](https://qiita.com/tags/Swift)|14702|7268|


##環境
node  ｖ14.5.0
axios  0.19.2
#コード

```ruby:app11.js
const axios = require("axios");

async function main() {
  let response = await axios.get("https://qiita.com/api/v2/tags?page=1&per_page=20&sort=count");
    for (let i = 0; i < 10; i++) {
        console.log('タグ: %s' ,response.data[i].id);
        console.log('記事の数: %d' ,response.data[i].items_count);
        console.log('フォロワー数: %d' ,response.data[i].followers_count);
        console.log('');
  }
}
main();
```
#実行結果
```
タグ: Python
記事の数: 43447
フォロワー数: 79118

タグ: JavaScript
記事の数: 35443
フォロワー数: 77167

タグ: Ruby
記事の数: 28098
フォロワー数: 42793

タグ: Rails
記事の数: 24287
フォロワー数: 29232

タグ: PHP
記事の数: 20274
フォロワー数: 47787

タグ: AWS
記事の数: 19735
フォロワー数: 8584

タグ: iOS
記事の数: 16253
フォロワー数: 38170

タグ: Java
記事の数: 15206
フォロワー数: 50361

タグ: Docker
記事の数: 14948
フォロワー数: 7636

タグ: Swift
記事の数: 14701
フォロワー数: 7268
```
#結果
csvで出力しようしましたが、今回のトライではうまくできず・・・
テキストドキュメントにコピペし,(カンマ)へ置換をし不必要な部分は削除しました。

###Jupyter Notebookで可視化
最近まで勉強していたJupyter Notebookでチャートを作成しました。
ライブラリとCSVを読み込み、コードを実行。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206019/effe4644-e59d-c96b-e53e-ceaea95a5df1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206019/0788e041-f65e-dc30-9673-f89f889c21dd.png)

#考察

- 今回グラフから読み取れるのは、PythonとJavaScriptの人気が非常に高い。
- Pythonは、AI、IoTなどの分野で活用され、人気が高まってる？私もRaspberrypiを使うようになりPythonに興味を持った。
- フォロワー数に対する記事数はPythonが多い、Pythonの記事は書きやすい技術が多い？またJavaを見るとフォロワー数は多いが、記事数は少なめ、なぜ？？

#今後

- JavaScriptにもグラフを書けるChart.jsやECharts.jsというライブラリがあるようなので、次回はそちらで可視化をしてみたい。
- 今回は私の考察のみだが、なぜこの2つが人気が高いのか、掘り下げてる。
VCIが消失その５

#結論
小さすぎる

#背景
VR配信・SNSサービスのバーチャルキャストでは、他のVRSNSに見られない仕組みとしてVCIというものがあります。VCIはバーチャル空間で取り扱えるアイテムであり、好きな場所で好きなタイミングで取り出すことができ、その挙動はスクリプトを用いて制御することでインタラクティブな効果を奏することができます。

そのVCIを制作するにあたって、制作の最初の段階で（特に初心者に多い）結構な割合で作ったはずのVCIを呼び出しても出てこない（見つけられない）事が起きます。

本記事ではこの現象に対する事例分けをし、それぞれの対処方法を紹介し、、、たいのですが、結構多岐にわたるので、そのうちの一つをご説明します。


#対象
主に初心者

#症状
なにか出てきたようなのだけど見当たらない
部分的に判定だけある

#どういうことか
これはblenderから初めて取り込んだ際に起こりがちです。
初期設定では、blenderから読み込んだモデル(fbx等）はscaleが100のときに意図した大きさになるように設定されています。
几帳面な方は特に、scale100を見つけると「あれ？こんな数値にしたっけ？直さなきゃ」となって1にしてしまうことが結構あります。これをやってしまうと大きさが1/100になるため、10cmくらいで設計していると1mmとかもっと小さくなってしまい、見えなくなってしまいます。

#解決策
解決策というか回避策は２つあります。
一つは、100のまま放っておく方法です。ただし、これはあまりおすすめしません。なぜなら、scalable(アイテムを拡縮できるようにする設定）を設定した際に、大きさ外としない形で変形してしまう恐れがあるからです。（逆に言えばscalableにしないのであればそのままでも良い）

２つ目は、読み込みのセッティングを変える方法です。
下図の「asprin」を例にとって説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494837/4a2a5b0e-38f4-7853-10a4-2faa3996bbab.png)

3dモデルを選択すると、インスペクタにモデルの情報が表示されます。ここの"Convert Units"にチェックを外してあげてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494837/4428f870-8014-3c20-0a61-d3b6c6d235b2.png)
チェックを確認したら、下の方にスクロールして"Apply"ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494837/2df92ea0-5494-5deb-bd4e-cd569130f3ad.png)
すると、エディター上では大きくなったように見えます。
scaleの値を1に設定してやれば、意図した通りになっています。

#ちなみに
scalableの仕様の関係で、モデルの拡縮をunity editor上で行うのはあまり推奨されませんが、こうなるとモデルの大きさを調整したいと思ったときにblenderに戻らなければなりません。しかし、解決策の２つ目の方法を使うことで横着することができます。
解決策の２つ目と同様にモデルを選択し、"Scale Factor"を好きな値（例えば0.1とか）に設定して、Applyを押せば、アイテムのtransform のscale 1のときの大きさが変わっています（例のように0.1にしていれば、10分の1になります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494837/c85910c0-56ce-5d1e-b573-644c18f93709.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494837/41c3e2d3-de78-d11b-6bed-9d6445ca3a11.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494837/2df92ea0-5494-5deb-bd4e-cd569130f3ad.png)
TechAcademyが無料公開している「レスポンシブWebデザイン入門講座」を受講する～第4回～

# アジェンダ
* レスポンシブデザインの考え方
* 実践

# レスポンシブデザインの考え方
レスポンシブデザインは、一つのHTMLファイルを、様々な表示形態に合わせることが出来るデザイン。
画面のサイズを取得し、最適なCSSを反映する。

# 実践
メディアクエリを使用して、index.html、style.cssを作成した。

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

<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="./style.css">
    <title>レスポンシブなサイト</title>
  </head>
  <body>
    <div class="main_content">
      <h1 class="contact">お問い合わせ</h1>
      <div class="message">
        <p>御用の方は、こちらよりご連絡ください。</p>
      </div>
      <div class="address">
        <p class="sub_headding">連絡先</p>
        <ul class="contact_info">
          <li>xxx@hogehoge.mail.com</li>
          <li>03-0000-0000</li>
          <li>@hogehoge_taro</li>
        </ul>
      </div>
      <div class="footer">
        <p>2020-07-15</p>
      </div>
    </div>
  </body>
</html>
```

```css:style.css
body {
  background-color: lightcyan;
}

.main_content {
  background-color: white;
  height: 80%;
  margin: 1em auto;
  padding: 1em 2em;
  width: 80%;
}

.contact {
  text-align: center;
  width: 100%;
}

.message {
  float: left;
  width: 60%;
}

.address {
  float: right;
  width: 40%;
}

/* 画面が小さい場合、縦に表示する. */
@media screen and (max-width: 680px) {
  .message, .address {
    float: none;
    width: 100%;
  }
}

.sub_headding {
  font-weight: bold;
  margin: 0em;
  padding: 0em 0em 0em 2em;
}

.contact_info {
  margin: 0.5em 0em 1em 0em;
}

.footer {
  border-top: solid 2px lightgray;
  clear: both;
  color: gray;
  text-align: center;
  width: 100%;
}
```
これをWebブラウザに表示させるとこんな感じ。
まずは、一般的なモニタサイズに合わせて大きく表示した場合。
![index_large.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648214/06b19907-3ed4-5481-c498-6791c65e25e5.png)
メッセージと連絡先が横に並んでいる。

次に、ブラウザの横幅を狭くした場合。
![index_small.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648214/2e7f5d08-74e6-0a21-b2a4-4b75060c5dfc.png)
メッセージと連絡先が縦に並んでいる。

このように、画面サイズが変化しても表示が崩れないように、表示形態を整えることが出来る。

ちなみに、メディアクエリを使用しなかった場合、以下のようになってしまう。
![index_no_media.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648214/14d732b8-0757-842b-aa07-5877b7603da4.png)
狭い幅で開業されて見づらい上に、メールアドレスが見切れてしまっている。

# おわりに
今回は、レスポンシブデザインの実践の回だった。
設定方法はわかったので、あとはどの時にどのように表示するかを設計するだけである。

今回でレスポンシブWebデザインの講座はおしまい。

## 参考
[4-1 レスポンシブデザインの考え方（レスポンシブウェブデザイン）](https://www.youtube.com/watch?v=ovZn3N4ubZU&list=PLjw-30bsJNVVUTdM-KUqkiVy3uj4fTfLD&index=16)
[4-2 切り替えポイントを作る（レスポンシブウェブデザイン）](https://www.youtube.com/watch?v=29GTG8ZGCmo&list=PLjw-30bsJNVVUTdM-KUqkiVy3uj4fTfLD&index=17)
[4-3 段落を切り替える（レスポンシブウェブデザイン）](https://www.youtube.com/watch?v=dQUa_7yXmQc&list=PLjw-30bsJNVVUTdM-KUqkiVy3uj4fTfLD&index=18)
[4-4 更に見た目を整える（レスポンシブウェブデザイン）](https://www.youtube.com/watch?v=4xZOhG6HjIM&list=PLjw-30bsJNVVUTdM-KUqkiVy3uj4fTfLD&index=19)
Vue.js  v-on:clickについて

#v-on:clickで時間表示ボタン作成
参考記事
https://www.youtube.com/watch?v=jdcZ3LvTs78&list=PLh6V6_7fbbo-SZYHHBVFstU2tp0dDZMAW&index=5

コード

```
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>Vueの練習</h1>
<div id="app">
    <p>{{now}}</p>
    <button v-on:click='time'>現在時刻を表示する</button>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue"></script>![スクリーンショット 2020-07-15 21.45.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/cf369723-391c-c2e9-1b15-454a9299b410.png)

<script>

let app = new Vue({
    el:'#app',
    data:{
        now: '00:00:00'
    },
    methods: {
        time: function(e){
            let date = new Date();
            this.now =date.getHours() + ':'
            + date.getMinutes() + ':' +
            date.getSeconds() + ':';
        }
    }
})

    
</script>
</body>
</html>
```

結果
![スクリーンショット 2020-07-15 21.45.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/ea529edd-328d-43ce-0ee9-6d1c94a1b57d.png)

現在時刻を表示するボタンをおすと
![スクリーンショット 2020-07-15 21.45.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/d3016526-75fd-706a-50b7-f9b6454d518e.png)

時刻が表示された。

```
v-on:click='time'
```
でボタンをクリックするとtime関数が実行される（関数はmethods内に記述する）。
実行の記述は以下

```
methods: {
        time: function(e){
            let date = new Date();
            this.now =date.getHours() + ':'
            + date.getMinutes() + ':' +
            date.getSeconds() + ':';
        }
    }
```
【地理情報講座#1】Rでのジオコーディング入門

# はじめに
久保研介研究会のサブゼミの資料です！限定公開です。（2020.08. 公開しました
。）**[RでのWeb スクレイピング入門](https://qiita.com/Tom-tom-tom/private/998e8282d013fb218490)**の続篇になります。前回の資料で最後に出力した**gas_naha.csv**を使って、分析を進めていきます！

## 今日のゴール
ざっくりいうと、この2つです。

1. 「位置情報データって役に立ちそう」と感じる。
2. ジオコーディングで重要な操作をRで実行できるようになる！

# とりあえず、ジオコーディングやってみる．
## 緯度経度へ変換
最初なので気合を入れていきたいところですが、こちらは専用のサイトにファイルをアップロードするだけで完成します笑。今回は、東大の**[ジオコーディングサイト](http://newspat.csis.u-tokyo.ac.jp/geocode-cgi/geocode.cgi?action=start)**を使ってみます。手順は下の通りです。

- 住所を含むカラム番号を入力
    - 今回は2行目ですね。csvファイルを開いて確認してみてください。
- 入力ファイルと出力ファイルの漢字コード
    - gas_naha.csvを出力した際に、CP932という意味わからんエンコーディングを指定したので、今回はここをシフトJISと指定しています。
    - 普通のcsvファイルでしたら、なにも指定しなくても大丈夫だと思います。もし文字化けしたら、エンコーディングを変えてみてください。
- 変換したいファイル名
    - その名の通りです。

<img width="587" alt="スクリーンショット 2020-07-15 20.56.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360143/ec302ca6-5434-9517-1819-28aacd7866fc.png">
**送信**を押すと、ファイルが返ってくると思います。返ってきたファイルを**gas_naha_new.csv**という名前にしておきましょう。

## データを綺麗にする
ジオコーディングしたデータをR studioに取り込みましょう。この時、```fileEncoding```を指定することに注意してください。Windowsの人は、```fileEncoding = utf8```とすると、文字化けがなくなるかもです。

```r
gas_naha <- read.csv("gas_naha_new.csv", fileEncoding = "shift-jis")
```

おなじみの**tidyverse**を使って、データを綺麗にしていきましょう。```select```で必要な変数だけを指定して、```rename```で変数の名前をわかりやすくしています。

```r
library(tidyverse)
gas_naha <- gas_naha %>% 
  select(store, address,company, fX, fY) %>% # 必要な変数だけ取得
  rename(longitude = fX, latitude = fY) # 変数の名前を変更
```

## おまけ① 地図上にプロットしてみる
早いですが、1つ目のおまけです。前にもやりましたが、地図にガソリンスタンドをプロットしてみます。**[leaflet](https://kazutan.github.io/JapanR2015/leaflet_d.html)**というライブラリを使います。
下のコードを実行してみてください。mapとうって、世界地図が出てくることを確認してください。

```r
## leafletというライブラリを使用します。 
library(leaflet)

## 地図をRstudio上に用意します。
map <- leaflet(gas_naha) %>% 
  addTiles()
```

この世界地図上に、沖縄県那覇市のガソリンスタンドをプロットしてみます。```addCircles```の代わりに```addMarkers```でも良いかもです。集合体恐怖症の方は注意してください。

```r
map %>% 
  addCircles(lng = ~ longitude, lat = ~latitude)
```

やっぱり、国道沿いに多いですね〜。

# おわりに
次回に続く…。今回作ったデータにメッシュ統計データを組み合わせて分析してみます。

# 地理情報講座リスト
- [RでのWeb スクレイピング入門](https://qiita.com/Tom-tom-tom/private/998e8282d013fb218490)
- [【地理情報講座#1】Rでのジオコーディング入門](https://qiita.com/Tom-tom-tom/private/e651b2afcc9c376174ae)
- [【地理情報講座#2】Rでのメッシュ統計データ入門](https://qiita.com/Tom-tom-tom/private/03d994fdc0a3a0998c10)
- [【地理情報講座#3】Rでの距離計算入門](https://qiita.com/Tom-tom-tom/private/7aa6d2b7a5fea915dd93)
Sublime Bableのインストール【見つからないVScode extentionを手動で】

## Sublime Bubleとは
 React.jsを勉強するためにyoutubeでチュートリアル探してたらおすすめされていた、こちらのVScodeのエクステンション

Javascriptファイルを書いたときにhtmlのようにきれいに色を付けてくれる優れものです



しかし、探しても全然出てこない・・・！

そこで、見つけ出した[こちらのサイト](https://markpetherbridge.co.uk/blog/how-to-install-sublime-babel/) に完璧に記載されてました！！

完全に英語でしたので、日本語で簡潔に説明します。

##ステップ1 　githubからzipファイルをダウンロード
[こちら](https://github.com/joshpeng/Sublime-Babel-VSCode)からzipファイルでダウンロードします。

解凍しておくのを忘れずに！

##ステップ2 　extentionのフォルダーへと移動

ターミナルを開きます(コマンドはMac向けです）

```
$ cd .vscode/extensions
```
そしたら、

```
$ mv ~/Downloads/Sublime-Babel-VSCode-master .
```

##ステップ3  VScodeを再起動
これで動きます！！



##参考サイト
https://markpetherbridge.co.uk/blog/how-to-install-sublime-babel/ （最終閲覧 7月15日）
Vue.js  v-bind の使い方(属性の扱いにも触れてます）

#v-bindの使い方についての備忘録

参考記事
https://www.youtube.com/watch?v=qzFJfekigY8&list=PLh6V6_7fbbo-SZYHHBVFstU2tp0dDZMAW&index=4

コード

```
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .abc{
            color:red;
        }
        .abc2{
            background: blue;
        }
    </style>
</head>
<body>
    <h1>Vueの練習</h1>
<div id="app">
  <!-- <p class='error'>エラーです</p> -->
  <!-- <p class='{{error_class}}''>エラーです</p> -->
  <!-- ↑このように属性の中にマスタッシュ記法は出来ない。マスタッシュはhtmlタグに書かなくては機能しない -->
<!-- classの中に書きたいときは以下のような記法がある ↓-->
<p v-bind:class='error_class'>エラーです</p>


</div>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script>

let app = new Vue({
    el:'#app',
    data:{
        error_class:'abc abc2',
        img_src:'https://cdn.pixabay.com/photo/2020/07/06/13/21/porsche-5377019__480.jpg'
    }
});


    
</script>
</body>
</html>
```

ポイントは
属性にはマスタッシュ記法が使えない

```
<p class='{{error_class}}''>エラーです</p> 
```
↑これのこと。この書き方は❌（マスタッシュが属性の中にある）


マスタッシュが使えるのはhtmlタグである。

```
<div id="app">{{test+count}}</div>
```
↑こういうのはOK（マスタッシュがhtmlタグ内にある）
では属性（タグ内のclassやimgタグのsrcなどをVueでいじるにはどうすれば良いか、、、

そこで使用するのが「v-bind」
使い方は以下
html側

```
<div id="app">
<p v-bind:class='error_class'>エラーです</p>
<img v-bind:src="img_src">
</div>
```
js側

```

let app = new Vue({
    el:'#app',
    data:{
        error_class:'abc abc2',
        img_src:'https://cdn.pixabay.com/photo/2020/07/06/13/21/porsche-5377019__480.jpg'
    }
});
```

Vueの記法内のdataで変数を設定（error_classとimg_src）。
そこに属性に当てたい内容を記述する。
これでcssや画像のURLをVueで指定することが出来る。

結果は以下
![スクリーンショット 2020-07-15 21.22.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/c1a64720-6adb-e511-43f2-fda7d5bf67a5.png)
Pythonでどうしてもsettings.iniを読み込めないエラーが生じた

# この記事の内容
あるPCで動いていたコードが違うPCで動かないことがありました。
原因は相対パスを上手く読み込んでいないことが原因のようでしたので、備忘として解決策を記載します。
なお、現時点で解決策がうまくいく理由がわからないため、理解ができた段階で記事を更新する予定です。


### 目次
1.背景
2.事象の整理
3.解決策
4.解決策が上手くいく理由



# 1. 背景
とある簡単なアプリケーション作成のために書いたコードが1,000行超え始めたところから、１ページのpythonファイルにコードを書くことに限界を感じ始めましたので、処理
を分割し、複数のpythonファイルに分けて管理をすることとしました。
ログイン情報等の初期値については```settings.ini```ファイルを作成し、```settings.py```から```configparser```を使って読み込むこととしました。
また、アップデート管理をするためにgithubも先日使い始めました。
初めてのことが重なり、わからないこともたくさん出てきたので備忘として記録を残します。

# 2. 事象の整理

メインPCで作成したRepositoryをgitからサブPCにクローンを作成したときに、なぜかうまくいかない箇所がいくつかありました。
特に理由がわからなかったのが、相対パスで参照していた```settings.ini```を```settings.py```から読み込めない点でした。

メインPCでは下記のコードで問題なく動いていました。

```python:settings.py

import configparser

conf = configparser.ConfigParser()
conf.read('./settings.ini')

# プロファイルパス
PROFILE_PATH = conf['driver']['PROFILE_PATH']

# saleceforce
Saleceforce_ID = conf['saleceforce']['Saleceforce_ID']
Saleceforce_PASS = conf['saleceforce']['Saleceforce_PASS']
Saleceforce_ADDRESS = conf['saleceforce']['Saleceforce_ADDRESS']
```

しかし、これをサブPCで動かすと下記のエラーが生じます。どうやら```'./settings.ini'```をうまく読み込めていないということがわかりました。

```
raise KeyError(key)
KeyError: 'driver'
```

# 3. 解決策
こちらについては下記のように書き直してやるとうまくいきます。

```python:settings.py
import configparser
import os

conf = configparser.ConfigParser()
path = os.path.join(os.path.dirname(__file__), 'settings.ini')
conf.read(path, 'UTF-8')

# プロファイルパス
PROFILE_PATH = conf['driver']['PROFILE_PATH']

# saleceforce
Saleceforce_ID = conf['saleceforce']['Saleceforce_ID']
Saleceforce_PASS = conf['saleceforce']['Saleceforce_PASS']
Saleceforce_ADDRESS = conf['saleceforce']['Saleceforce_ADDRESS']
```

相対パスだとうまく読み込めないので、実行ファイルのディレクトリを```os.path.dirname(__file__)```で読み込んで直接指定してやると上手くいきました。
違う環境でコードを実行するときはこっちのほうがいいのかもしれないです。


# 4. 解決策が上手くいく理由
理由がわかりません。
自分の中で理解ができたら更新します。
VCIが消失その４

#結論
非表示にしてる

#背景
VR配信・SNSサービスのバーチャルキャストでは、他のVRSNSに見られない仕組みとしてVCIというものがあります。VCIはバーチャル空間で取り扱えるアイテムであり、好きな場所で好きなタイミングで取り出すことができ、その挙動はスクリプトを用いて制御することでインタラクティブな効果を奏することができます。

そのVCIを制作するにあたって、制作の最初の段階で（特に初心者に多い）結構な割合で作ったはずのVCIを呼び出しても出てこない（見つけられない）事が起きます。

本記事ではこの現象に対する事例分けをし、それぞれの対処方法を紹介し、、、たいのですが、結構多岐にわたるので、そのうちの一つをご説明します。

作者のモチベーションが続けばもっと書きます

#対象
主に初心者

#症状
目の前に出てくることを期待していたものが見当たらない
その上、そもそも出てきた雰囲気がない

#どういうことか
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494837/246cab07-e1e9-15c2-bc24-dc68d259041b.png)
インスペクターの一番左上にチェックボックスがありますが、これはオブジェクトの表示・非表示を切り替えるものです。これで非表示になっていると出力されません。
#解決策
チェック入れよう。それで出力すればもとに戻るよ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494837/a3e41779-7bde-a224-2d52-61ce292183ed.png)
GameObjectだけでなく、他の階層（サブアイテムなど）でも起きるので、他の海藻もチェックしよう。下図のように、非表示になっているアイテムはhierarchyでも色が薄くなるので、そこでチェックできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494837/d30813ad-23b0-855c-a405-b6203d39d350.png)


#ちなみに
今でもたまにやらかします。いくつか数をこなしていくと、同一シーンでアイテムが重なってきてしまうので非表示の機能は良く使います。初心者というよりかは初級者の領域に入った際にぶつかるミスでしょうか。

また、単純に複雑なアイテムを作ったりするときも見にくいので非表示にしてみたりしつつ作っているとたまに忘れたまま出力してしまいます。気をつけよう。
（これできればエラー吐いて欲しいなぁ、、GameObject階層は特に）
【AWS】TerraformでAWS管理ポリシーを使用する

# 状況

Terraformでデプロイ用のユーザを作成している。自分の参考書はjson形式で、許可するactionを細かく設定していたが、今回は簡単のためにAWS管理ポリシーを使用したい。すぐに解決したが備忘録として。

# 解決策

必要なAWS管理ポリシーをAWSコンソールで探す

```terminal
# AWS管理ポリシー取得
data "aws_iam_policy" "AmazonEC2ContainerRegistryFullAccess" {
  arn = "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryFullAccess"
}

# IAMユーザー作成
resource "aws_iam_user" "user" {
  name = "test-user"
}

# IAMユーザーにAWS管理ポリシーをアタッチ
resource "aws_iam_user_policy_attachment" "test-attach" {
  user       = aws_iam_user.user.name
  policy_arn = data.aws_iam_policy.AmazonEC2ContainerRegistryFullAccess.arn
}
```

![スクリーンショット 2020-07-15 21.16.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630802/ebb541d5-4ddf-99c4-479a-05191e98c3a4.png)


Terraform公式リファレンス
[resource "aws_iam_user_policy_attachment"](https://www.terraform.io/docs/providers/aws/r/iam_user_policy_attachment.html)
[data "aws_iam_policy"](https://www.terraform.io/docs/providers/aws/d/iam_policy.html)

# 参考
[Terraform: correct way to attach AWS managed policies to a role?](Terraform: correct way to attach AWS managed policies to a role?)
AndroidでPost Effectをつけると画面が真っ暗になる問題

# 問題

Cameraに`OnRenderImage`をoverrideしたスクリプトをアタッチする形式でポストエフェクトを作成したところUnityEditor上では意図通りの動作を確認できるのに、Androidの実機で確認すると画面が真っ黒になるという問題に遭遇しました。

# 解決方法
`.shader`で`ZTest Always`を使うようにすると、意図通り動くようになりました。

例

```c#

Shader "Custom/HorizontalScaleShader"
{
      Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
        [PowerSlider(1)]_HorizontalScale ("HorizontalScale", Range(0.01,1.00)) = 1
    }

    SubShader {
        Pass {
            Tags { "RenderType"="Opaque" }
            ZTest Always

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            sampler2D _MainTex;
            float _HorizontalScale;

            struct v2f {
                half4 pos : POSITION;
                half2 uv : TEXCOORD0;
            };

            float4 _MainTex_ST;

            v2f vert(appdata_base v) {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
                return o;
            }

            half4 frag(v2f i) : COLOR {
                half2 uv = half2(i.uv);
                float horizontalScale = _HorizontalScale;
                uv.x = horizontalScale*uv.x+(1.0-horizontalScale)*0.5;
                fixed4 col = tex2D(_MainTex, uv);
                return col;
            }

            ENDCG
        }
    }
    FallBack "Diffuse"
}

```
# 結果

実機で動いた

![posteffect.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101808/8cc18bf8-702b-6bd6-16d8-868ff56ab494.gif)


# 参考文献
https://forum.unity.com/threads/graphics-blit-not-working-for-android.534835/
【Vue.js】Elements in iteration expect to have 'v-bind:key' directivesの解決法

##エラー
```
Elements in iteration expect to have 'v-bind:key' directives
```

##原因
キー属性を指定していない。

##解決法

各項目にキー属性を指定する必要があある。

###エラーのコード

```
<li v-for="value in object">{{value}}</li>
```

###解決するコード

```
<li v-for="value in object" :key='value'>{{value}}</li>
```