OmniAICreator/Qiita-1.07M huggingface dataset:
Apple Human Interface Guidelinesを読んでみた① 〜設計原則について〜

#はじめに
iOS開発を行なっているうちにUI(UX)の重要性を感じ始めた。またiOSにおいては「なんとなくカッコイイから使ってみよう」と好き勝手にデザインして行けばいいものでは無く、Apple様がある程度ガイドラインを示して下さってるため、それに最低限従わねばならないというのにもうすうす感じ始めた。
察し始めた以上は勉強せねば、ということで改めてAppleが推奨するUIデザインを勉強しようと思い学習記録を付けていくことにした。

基本的にはタイトルにもある通り、[Apple Human Interface Guidelines](https://developer.apple.com/design/human-interface-guidelines/ios/overview/themes/)を読みながらAppleが推奨するUIデザインを学んでいく。

<img width="1440" alt="Human_Interface_Guidelines.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363018/29ac5084-8aa8-3fd9-6015-b005f523068a.png">

##iOSが他のプラットフォームと違う点
Appleによると3つの点で他のプラットフォームと違うようだ。
その3つとは「Clarity（明快さ）」、「Deference（敬意）」, 「Depth（深さ）」である。

####Clarity（明快さ）
デザインの分かりやすさである。

####Deference（敬意）
ユーザーがコンテンツと対話（？）することができる。具体的には、ベゼル、グラデーション、ドロップシャドウの使用を最小限に抑えて、インターフェースを分かりやすい状態にすること。

####Depth（深さ）
階層構造が目に見えて分かりやすく、現実的な動きを実現されていることで、ユーザーが階層を深く潜って行った際もコンテキスト（文脈）を理解できるようにする。

このあたりは、頭の片隅に置いておいて、あとあと具体的事例を見て行く際に思い出してあげるとしよう。

##設計原則
デザインをの効果を最大限発揮するために、留意しておくべき基本原則である。

具体的には
「Aesthetic Integrity（美的完全性）」、「Consistency（一貫性）」、「Direct Manipulation（直感的な操作）」、「Feedback（フィードバック）」、「Metaphors(比喩)」、「User Control（ユーザーの制御）」
の6つがある。それぞれの詳細を見て行く。

####Aesthetic Integrity（美的完全性）
>美的整合性はアプリの外観と動作がその機能とどの程度うまく統合されているかを表します。

要するに「ユーザーの意図しない変な動きはしない」ということである。突然変な動作をされるとユーザーはアプリケーションに集中できなくなってしまう。

####Consistency（一貫性）
>一貫性のあるアプリは、システムが提供するインターフェイス要素、よく知られているアイコン、標準のテキストスタイル、統一された用語を使用することにより、使い慣れた標準とパラダイムを実装します。

基本的にapple公式のデザインを使えば、アプリ間での一貫性が担保されるため、どのユーザーでも使いやすい実装になりますよということ。

####Direct Manipulation（直感的な操作）
>画面上のコンテンツを直接操作することで、人々を引き付け、理解を促進します。

####Feedback（フィードバック）
ユーザーの行なった操作に対して、適切なフィードバックを返すことでユーザーに対してアクションの結果を明確に示す。
アプリ一覧画面でアプリを長押しした際に発動する微振動も立派なフィードバックで、実装以降知らず知らずのうちにユーザーはそのリアクションに頼っている。

####Metaphors(比喩)
>アプリの仮想オブジェクトとアクションが身近な体験のメタファーである場合、(中略）、人々はより素早く学習します。

本を読むことができるアプリでは、「現実世界でページをめくるようにスワイプして次のページへ行く」などユーザーが理解しやすいような実装が望ましい。

####User Control（ユーザーの制御）
>iOSでは、アプリではなく人が制御されます。アプリは一連のアクションを提案したり、危険な結果について警告したりできますが、通常はアプリが意思決定を引き継ぐのは間違いです。最高のアプリは、ユーザーを有効にすることと、望ましくない結果を回避することの間の正しいバランスを見つけます。


#終わりに
初回ということもあり、かなり抽象度の高い内容が多かった。しかし、これらの設計原則は会社でいう基本理念と同じくらい重要なものであるに違いないため、これから個別具体的な事例を学ぶ上で常に頭に入れておきたい。

#参考
[Apple Human Interface Guidelines](https://developer.apple.com/design/human-interface-guidelines/ios/overview/themes/)
Mac × MAMP × Laravelで接続した時に起こった事

#事象
・なんかLaravelインストールしたらMAMPの「MY WEBSITE」に接続できなくなった
　※正確に言うと、「The requested URL /~ was not found on this server.」の404エラーが出ました。

##原因
・Laravelインストールしたと思ったらできてなかった....
 →composer導入した後に、インストールしたつもりになってた

・Laravel側で複数設定が必要なファイルに対して追加できていなかった。
　■database.php
　　→使用しているデータベースの情報を追加できていなかった

・MAMP側の設定ファイルでLaravelの追加ができていなかった
　■httpd-vhosts.conf
　　→設定されているPort番号がLaravelの行で設定している
　　　Port番号と一致していなかった。
　　　NameVitualHost *:oooo
　　　※上記とここのファイルでLaravelの追加が必要
　■httped.conf
　　→ここでVitural hostsの下の行でコメントアウトされている文章の#を外す
　　　(ここは出来てきた)

##所感
・ターミナル時にコマンド実行して大量のメッセージが流れた時に、
　読み取る前にやった気になってたかも
・MAMPを初めて導入した時より早く事象の解決が出来た気がした。

　//MAMP導入時→12,3時間くらい
　//今回→6,7時間くらい

##参考元
PKunitoさんとCodedayの作者様、理解しやすい記事を作成いただいてありがとうございました。

・Laravel開発：１．環境構築をMAMPを使用して作成する
　https://qiita.com/PKunito/items/6a3bb187ca3c67de4519

・MAMPを使用してLaravelアプリをMySQLに接続する方法
　https://codeday.me/jp/qa/20190324/474003.html
UbuntuでCPUの温度やファンの回転数を表示する

https://ubuntuapps.blog.fc2.com/blog-entry-758.html

http://dlrecord.hatenablog.com/entry/2017/11/28/180027

https://linux.just4fun.biz/?Ubuntu/CPU%E3%81%AE%E6%B8%A9%E5%BA%A6%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%83%BBsensors

https://sekisuiseien.com/computer/11222/
Ubuntu18.04をインストールしたRazerBlade15でTensorflow-gpuを使う

http://demura.net/misc/14779.html

https://openrazer.github.io/
sudo add-apt-repository ppa:openrazer/stable
sudo apt update
sudo apt install openrazer-meta

sudo apt purge nvidia-*
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install nvidia-390

NVIDIA Driverのチェック
$ nvidia-smi

省電力 (バッテリ持ちが格段によくなる）

    sudo add-apt-repository ppa:nilarimogard/webupd8
    sudo apt -y install tlp tlp-rdw powertop
    sudo tlp start
    sudo systemctl start tlp
    sudo systemctl enable tlp

CUDA9.0のインストール
https://developer.nvidia.com/cuda-90-download-archive?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1704&target_type=deblocal

sudo dpkg -i '/home/taka/ダウンロード/cuda-repo-ubuntu1704-9-0-local_9.0.176-1_amd64.deb'
sudo apt-key add /var/cuda-repo-9-0-local/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda-toolkit-9-0

sudo nano ~/.bashrc
sudo reboot
nvcc -V

cudnnがインストールされているかを確認する
dpkg -l | grep "cudnn"

sudo dpkg -i libcudnn7_7.3.1.20-1+cuda9.0_amd64.deb
sudo dpkg -i libcudnn7-dev_7.3.1.20-1+cuda9.0_amd64.deb
sudo dpkg -i libcudnn7-doc_7.3.1.20-1+cuda9.0_amd64.deb




\\\\


nvidia-smi

Command 'nvidia-smi' not found, but can be installed with:

sudo apt install nvidia-340      
sudo apt install nvidia-utils-390


https://knowledge.autodesk.com/ja/support/maya/troubleshooting/caas/sfdcarticles/sfdcarticles/kA230000000u016.html
最近のLinuxディストリビューションでは、インストール時からnouveauグラフィックスドライバを有効にするものがあります。
X-Windowが起動しないランレベル3で起動しているにもかかわらず、高解像度で、起動中に画像が表示されたり、プロンプトが小さかったり、いわゆるVGA画面でない場合は、このnouveauグラフィックスドライバが有効になっている可能性があります。とても有用なドライバーですが、これが有効になっているとNVIDIAドライバーのインストールが失敗してしまいます



https://www.tensorflow.org/install/source#common_installation_problems
tensorflow-gpuとCUDAのバージョン
アイコンWebフォントをiOSで使う

FontAwesome 4.0
http://fortawesome.github.io/Font-Awesome/icons/
FontAwesome 3.2
http://fortawesome.github.io/Font-Awesome/3.2.1/icons/

FontAwesomeKitを使ってiOS 7用のアイコンを動的生成する
http://qiita.com/shobyshoby/items/8f04e97146794057a69b

よく使うアイコン画像を「Font-Awesome」を使って生成する方法
http://qiita.com/EntreGulss/items/fdf0c04a0bc2b926d35c
あと、BButtonってやつでも、FontAwesomが使えます
BButton
https://github.com/mattlawer/BButton
こういうのは アイコンフォントと言って、いくつか種類があって、
FontAwesomeKit の中で、FontAwesome 以外にも、
Foundation Icon とかいろんなアイコンフォント使えます。

画像アイコンはもう古い！CSSでスタイル自由自在のアイコンWebフォント
http://w3q.jp/t/2396
Laradockを用いてDocker/Apache/PHP7.2/MySQL/Laravelの開発環境を構築する

Laradockクローン

ルートディレクトリにて、下記を実行。
$ git clone https://github.com/LaraDock/laradock.git
.envをenv-exampleからコピーして作成。
$ cd laradock
$ cp env-example .env
プロジェクト作成

まずは、ワークスペースを起動。
$ cd laradock
$ docker-compose up -d workspace
ワークスペースに入る。
$ docker-compose exec workspace bash
Laravelのプロジェクトを作成
# composer create-project laravel/laravel web
dockerを一旦終了
# exit
$ docker-compose down
laradock/.envのpathを作成したプロジェクトに変更。

# Point to the path of your applications code on your host
APP_CODE_PATH_HOST=../new_project

apache2の設定変更

ハマったところ。
apache2を使用するので、laradock/apache2/sites/default.apache.confを変更。
ServerName localhost
DocumentRoot /var/www/public/
Options Indexes FollowSymLinks

<Directory "/var/www/public/">

各バージョンを指定（.env）
PHP_VERSION=7.2
MYSQL_VERSION=latest
（mysql/Dockerfile）
ARG MYSQL_VERSION=5.7


dockerにてコンテナを起動。
$ docker-compose up -d mysql apache2 workspace
localhostにアクセス。


docker-compose stop

既存のLaravelプロジェクトを配置する場合
webに展開
docker-compose exec --user=laradock workspace bash # workspaceへ入る
composer install
laradock@hoge:/var/www$ exit # workspaceから抜ける
$ docker-compose restart # コンテナ再起動
http://localhost/ にアクセス


Laravel のプロジェクトを Homestead 環境で 起動させました。
http://localhost:8000/ にアクセスするとエラーがでました。

RuntimeException がでる
RuntimeException
No application encryption key has been specified.
encryption key がないとあります。

key を生成する
php artisan key:generate
Application key [base64:Wdhku6YSePiOh0XjqauthSaeOhzwRKxasFjbuuHXz0w=] set successfully.
Application key が生成されました。

再度アクセス
http://localhost:8000/ にアクセスすると Laravel の初期画面が表示されました
Windows10とUbuntu18.04のデュアルブート環境で1つのBluetoothキーボードを両OSでペアリングして使う方法

# 記事の内容

windows10とUbuntu18.04のデュアルブート環境で

Bluetoothキーボードを片方でペアリングしたら

もう片方でペアリング出来なくなるなどの状態になったので

タイトルにもあるとおり、１つのBluetoothキーボードを同じペアリング情報で使えるようにした際の手順を

備忘録として残しておこうと思います。

# 環境

- Windows10 と Ubuntu18.04のデュアルブート環境
- Bluetoothキーボード（ロジクール K380 マルチデバイス Bluetooth キーボード)

# 参考にしたサイト

参考にしたサイトはいくつかあるんですが、Windowsのレジストリキーの場所が、環境によって違うようで、自分は下記のサイトの場所がマッチしていました。

[Windows と Linux のデュアルブート環境で Bluetooth デバイスを共用する](http://aimingoff.way-nifty.com/blog/2018/09/windows-linux-b.html)

# 手順について

手順は、環境によっても若干うまくいかない場合があるかもしれないので、自分がうまくいったやりかたは、

1. UbuntuでBluetoothキーボードをペアリングする
2. UbuntuのBluetoothキーボードをリンクキーが、作成されていることを確認する
3. Windowsで再起動して、Bluetoothキーボードをペアリングする
4. WindowsのBluetoothキーボードをリンクキーを確認してメモする
5. Ubuntuで再起動して、作成されていたリンクキーを、Windowsのリンクキーに置き換える

以上で、うまく行きました。

この手順に沿っていない場合は、Ubuntuのリンクキーが作成されてなかったり

ペアリングしようとした場合にペアリングできなかったり

リンクキーが自動で更新されて、同じものが使われていなかったりなどが

あったのでこの手順であれば、問題ないかと思います。

以下は、手順を掘り下げます。

# 手順1 UbuntuでBluetoothキーボードをペアリングする

通常のBluetoothキーボードのペアリングで問題ありません。
方法は割愛させていただきます。

# 手順2 UbuntuのBluetoothキーボードをリンクキーが記載されているファイルが作成されていることを確認する

```shell
vi /var/lib/bluetooth/xx:xx:xx:xx:xx/＊＊:＊＊:＊＊:＊＊:＊＊:＊＊/info
[LinkKey]
Key=********************************
```
自分の環境では、上記のinfoファイルに書かれていました。
`xx:xx:xx:xx:xx:xx`が端末のMacアドレス
`＊＊:＊＊:＊＊:＊＊:＊＊:＊＊`がBluetoothキーボードのMacアドレス
`********************************`がリンクキー

Ubuntuのバージョンや環境によって違うかもしれません。

※linkkeyというファイルに書かれているという記事もありました。

# 手順3 Windowsで再起動して、Bluetoothキーボードをペアリングする

通常のBluetoothキーボードのペアリングで問題ありません。
方法は割愛させていただきます。

# 手順4 WindowsのBluetoothキーボードをリンクキーを確認してメモする

`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys\xxxxxxxxxxxx`
に書かれていました。

上記をエクスポートして、テキストファイルにすると自分の環境では、下記のような形になっていました。

```
キー名:              HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys\xxxxxxxxxxxx
クラス名:             <クラスなし>
最終書き込み時刻:  2019/03/10 - 3:05
値 0
  名前:            ＊＊＊＊＊＊＊＊＊＊＊＊
  種類:            REG_BINARY
  データ:            
00000000   ** ** ** ** ** ** ** ** - ** ** ** ** ** ** ** ** 
```
`xxxxxxxxxxxx`が端末のMacアドレス
`＊＊＊＊＊＊＊＊＊＊＊＊`がBluetoothキーボードのMacアドレス
`** ** ** ** ** ** ** ** - ** ** ** ** ** ** ** **`がリンクキー

# 手順5. Ubuntuで再起動して、作成されていたリンクキーを、Windowsのリンクキーに置き換える
Feature-base approachとFine-tuning approach 

# Feature-base approachとFine-tuning approachについて

## はじめに
こんにちは、myjlabのまるたくです。今回は研究室で初アドベントカレンダーにチャレンジするということで、最近読んだ論文で気になったことを話したいとおもいます。  
今回読んだ論文はNLP界隈で有名な[BERT](https://arxiv.org/abs/1810.04805)という手法について書かれた論文です。この論文の中で、*Feature-base approach* と *Fine-tuning approach* という言葉が出てきました。どちらにも共通することは、大規模なデータで事前学習させたモデルを活用することですが、お互いに事前学習モデルの活用方法が少し違うのでそこについて調べました。

## Feature-base approachとは
論文内では、Feature-base approachについて以下のように述べていました
> The feature-based approach, such as ELMo (Peters et al., 2018a), uses task-specific architectures that include the pre-trained representations as additional features. 

Feature-base approachは事前学習を行なったモデルの表現を既存のモデルに特徴量として組み込むことで精度の向上を図ります。ELMoと呼ばれる手法はこのFeature-base approachの代表的な例として挙げられているので、こっちの論文についてもチラッとのぞいてみました。

### ELMoについて
ELMoとは、[Deep contextualized word representations](https://arxiv.org/abs/1802.05365)という論文で提案された手法で、双方向LSTMを大規模なコーパスで学習させることで文脈を考慮した単語表現を獲得することができます。ここで獲得した単語表現を既存のモデルに組み込むことで既存のモデルの精度向上を図ります。
ELMoの中では、以下のように述べられています
> We show that these representations can be easily added to existing models and significantly improve the state of the art across six challenging NLP problems, including question answering, textual entailment and sentiment analysis.

上記の通り、ELMoは既存のモデルに少し手を加えるだけで6個のNLPタスクにおいてSoTAを達成しています。僕は最近固有表現抽出をやる機会があったのでその項をみてみましたが、前のSoTAであるbiLSTM-CRFにELMoの特徴量を足して、少し工夫するだけでSoTAを達成していました。

以上のように、Feature-base approachのメリットは、大規模なコーパスで学習したモデルの特徴量を既存モデルに追加するだけで精度を向上させられる点にあると言えます。

## Fine-tuning Approachとは
BERTの論文内ではFine-tuning approachについて以下のように述べています.
> The fine-tuning approach, such as the Generative Pre-trained Transformer (OpenAI GPT) (Radford et al., 2018), introduces minimal task-specific parameters, and is trained on the downstream tasks by simply fine-tuning all pretrained parameters.

 正直ここに書いてあることが全てなのですが、Fine-tutning Approachとはあらかじめ大規模なデータでパラメータを求めておき、タスクごとに小規模な学習データで学習を行いパラメータを微調整してあげる手法です。

ここでGenerative Pre-trained Transformerという手法が出てきたのでそれについて説明します。

### Generative Pre-trained Transformerとは
Generative Pre-trained Transformer(GPT)とは、OpenAIによって発表された[Improving Language Understanding by Generative Pre-Training](https://s3-us-west-2.amazonaws.com/openai-assets/research-covers/language-unsupervised/language_understanding_paper.pdf)という論文の中で提案された手法です。このモデルの改良版であるGPT2は、「あまりにも本物っぽすぎるニュースを生成できるため、悪用の危険がある」ということで完全なパラメータが最近まで公開されなかったことで有名ですね。
このモデルは事前に大規模なデータを用いて学習を行い、その後タスクごとにFine-tuningを行うことでSoTAを達成しました。

以上のことからFine-tuning approachのメリットは、大規模なデータで事前学習したモデルを使用すれば小規模な学習データでFine-tuningを行うことで良い精度が挙げられる点にあると考えます。

## 終わりに
以上がFeature-base approachとFine-tuning approachです。あまり英語の論文を読むことに慣れていないのと、自然言語処理を真面目に勉強するようになってから日が浅いので間違いや指摘等あれば優しく指摘していただけると幸いです。  
最後まで読んでいただきありがとうございました。
自宅学習_カメラキャプチャ

#カメラの分（キャプチャのみ）
```
# 元のコード　https://tony-mooori.blogspot.com/2015/10/pythonwebpython.html
# カメラ選択　https://crimnut.hateblo.jp/entry/2018/04/04/123147

# -*- coding: utf-8 -*-
import numpy as np
import cv2
from time import sleep

#引数0でデフォルトのカメラ(デスクトップ)、-1で接続されたカメラ
cap = cv2.VideoCapture(0)

while(True):
    # フレームをキャプチャする
    ret, frame = cap.read()

    # 画面に表示する
    cv2.imshow('frame',frame)

    # キーボード入力待ち
    key = cv2.waitKey(1) & 0xFF

    # qが押された場合は終了する
    if key == ord('q'):
        break
    # sが押された場合は保存する
    if key == ord('s'):
        path = "photo.jpg"
        cv2.imwrite(path,frame)

# キャプチャの後始末と，ウィンドウをすべて消す
cap.release()
cv2.destroyAllWindows()
```

#python読みとり（温度）
```
# -*- coding: utf-8 -*-
import numpy as np
import serial
import datetime
import re
from time import sleep

def queue(src, a):
    dst = np.roll(src, -1)
    dst[-1] = a
    return dst


def main():
    # 1次元配列の生成
    temps = np.zeros(10)
    ser = serial.Serial('COM3')  # Arduinoが接続されているコムポートを指定

    todaydetail = datetime.datetime.today()

    line = ser.readline()  # 行終端まで読み込む
    temp = line.rstrip()  # 行終端コード削除
    temp_a = str(temp).split(",")
    t = int(re.sub("\\D", "", str(temp_a[0])))/100
    h = int(re.sub("\\D", "", str(temp_a[1])))
    # キュー操作
    print(todaydetail.strftime("%Y/%m/%d %H:%M:%S"),t,h)

    ser.close()
i = 0
while(True):
    i = i+1
    main()
    sleep(1)
    if i == 10:
        break
```
#arduino分（温度）
```
#include <DHT.h>        //ライブラリ読み込み

#include<Wire.h>
#include<Adafruit_GFX.h>
#include<Adafruit_SSD1306.h>

const int DHTPIN=7;     //7番pinをDHTpinに設定
#define DHTTYPE DHT11   // DHTの種類をDHT 11に設定

DHT dht(DHTPIN, DHTTYPE);//DHT11に関する情報を入力

Adafruit_SSD1306 display(-1);

void setup() {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  Serial.begin(9600);   //9600bpsでシリアルポートを開く
  dht.begin();           //DHT11による計測開始
}

void loop() {
  
  float h = dht.readHumidity();     // 湿度を測定
  float t = dht.readTemperature();  // 温度を摂氏で測定
  
  
  Serial.print(String(t,1));
  Serial.print(",");
  Serial.println(String(h,0));

 // ディスプレイをクリア
  display.clearDisplay();

  // 出力する文字の大きさ
  display.setTextSize(2);
  // 出力する文字の色
  display.setTextColor(WHITE);
  // 文字の一番端の位置
  display.setCursor(10, 10);

  // 出力する文字列
 // display.println();
  display.print(String(t,1));
  display.print(" / ");
  display.print(String(h,0));

  // ディスプレイへの表示
  display.display();
  
  delay(2000);
  
}
```

#ラズパイ(うまくいかない)
```
import re
from time import sleep

def queue(src, a):
    dst = np.roll(src, -1)
    dst[-1] = a
    return dst


def main():
    # 1次元配列の生成
    temps = np.zeros(10)
    ser = serial.Serial('/dev/ttyUSB0')  # Arduinoが接続されているコムポートを指定

    line = ser.readline()  # 行終端まで読み込む
    temp = line.rstrip()  # 行終端コード削除
    temp_a = str(temp).split(",")
    v = int(re.sub("\\D", "", str(temp_a[0])))
    
       
    # キュー操作
    print(v)
    ser.close()
i = 0
while(True):
    i = i+1
    main()
    if i == 100:
        break
```

#URL（OPCV）
https://signal-flag-z.blogspot.com/2019/03/opencv-4-raspberry-pi.html
新卒1年目でハッカソン行ってきたけど、いろいろできたお話。

#ハッカソン行ってきた
**ハッカソンに行って来ました！！！**
新卒1年目。開発もままならない自分がハッカソンに行って体験したことを書いておきます。
先に言っておきますと、行ってよかった！
社内行事で、土日休みを使うのは億劫でしたが、勉強といいきっかけになりました。

#と、言うことでまず自己紹介
- 新卒1年目の19卒。
- エンジニア歴は1年。
- 主にフロントサイドのエンジニア。
- 言語は、PHP・JS・SQL・HTML・CSS。
- 正直プログラミングは自信なし！

#概要
- 1泊2日でチーム戦。
- テーマはaws使えばなんでもOK！

#学んだこと
###awsのサービス多すぎ！
単純に調べれば調べるほどなんでもできる。音声認識をできちゃう。

###Qiitaさんありがとう
先人の教え最強。ありがとうございます。

###awsの公式マニュアルショボい…
更新あんまされてない？導線の説明が無茶苦茶で指示されたボタンがない。

###ググる力=成長速度
考えるのも必要ですが、調べる方が大切ですね。

###環境構築能力の欠如
全然サーバサイドのこと知りませんでした。これ勉強してできるようにならないとダメですね。

###事前準備が全て
これで爆死しました。目標から逆算して、どこまで出発するまでにやるか考えましょう。

#総括
**ググりながらやれば1年目でもどんどんチームに貢献できました！**
しかし、思い通りにならないことばっかでした。圧倒的に力が足りない。
でも、チャレンジしないと意味ないなと。最初はみんな素人ですね。
僕も超人ではないのでコツコツやるしかないです。

**1年目だから早いなんてないです！！！**
SwiftのOptionalのmapメソッドについて（Unwrapとして使うmapメソッド）

Optional型のArrayのmapメソッドを使う際、mapの扱いを見落として使ってしまいがちだったので、戒めのためにメモ

@koherさんの記事「[ArrayとOptionalのmapは同じです](https://qiita.com/koher/items/68585cff691d87124077)」で
> Optional や Array を値を入れる箱だと考えると、 map は箱から値を取り出さずに操作するためのメソッド／関数です

という概念で理解できました。

配列の中身を一つづつ、処理しようと、以下のように書くと

```swift
let numbers: [Int]?
numbers = [1, 2, 3, 4]
numbers.map {
    print($0)
}
```

結果は
`print($0) // [1, 2, 3, 4]`
になります。

これは
Optional型に、mapメソッドを通した場合
Unwrapの処理が行われ、Optional型 → 非Optional型になるからです。

期待する動作（配列の中身を一つづつ処理する）をしたい場合は、以下です

```swift
let texts: [String]?
numbers.map {
    print($0) // [1, 2, 3, 4]
    let update_numbers = $0.map {
        $0 + 2
    }
    print(update_numbers) // [3, 4, 5, 6]
}
```

これは、

```swift
if let numbers = numbers {
    print(numbers) // [1, 2, 3, 4]
    let update_numbers = numbers.map {
        $0 + 2
    }
    print(update_numbers) // [3, 4, 5, 6]
}
```

と同じ動作をします

違いは
前者の`map`でのUnwrapは、**箱から値を取り出さずに操作**し
後者の`if let`でのUnwrapは、**一旦、変数に代入して、if文の中で操作**
という違いで、特に大きな違いはないので、好みでいいのかと思いますが
自分は前者の方がスッキリして、見やすいかなと思います。
ただ、後者は何をやってるのかは、パッと見で分かりやすいので
レビュー者との共通認識で、どちらかを使うか決めた方が良さそうです。
Rubyで「大石泉スキ」を標準出力する & idol++

この記事は [「大石泉すき」アドベントカレンダー](https://qiita.com/advent-calendar/2019/ohishi-izumi-suki) 2日目の記事となります。
2日目は、1日目のPythonに対抗してRubyで標準出力してみます。

## 概要
以下のような方を対象にした内容になります。

* 大石泉P
* 大石泉に興味がある人
* Rubyでプログラミングを始めたいと思っている人

なお、すそ野を広げるという観点にたって記事内のコードは以下の環境で実行しています。

```
OS: Windows 10
Rubyバージョン: ruby 2.6.3p62 (2019-04-16 revision 67580) [x64-mingw32]
```

## とりあえず、Rubyで出力してみよう
### 初歩的な標準出力
Rubyがインストールされている状態でコマンドプロンプトを立ち上げて以下のコマンドを入力して実行します。
`ruby -e "文字列"` は `"文字列"` のコードをRubyが解釈して実行します。
いわゆるevalですね。

```bash
ruby -e "puts '大石泉スキ'"
```

![大石泉_1_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106217/f7ca7369-2ce7-ce8b-bfb5-3ed5b0c02a7a.png)

### 複数回出力する
```bash
ruby -e "5.times { puts '大石泉スキ' }"
```

![大石泉_1_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106217/154a1bab-b715-445b-ff7c-70022216907b.png)


`n.times { (処理) }` は `n` で指定した回数分だけ `{}` 内の処理を実行するループ構文です。
この場合は `n = 5` を指定しているので5回文字列の出力が実行されます。

### ランダム要素を加えてみよう
文字列を出力するだけでは面白味もないし、 **idol++** ではないのでランダム要素を加えてみましょう。


```bash
ruby -e "puts ['大石泉スキ', 'idol++', 'ネイビーウェーブ',  'ビット・パフォーマー', 'ニューウェーブ・ネイビー', 'ニューウェーブ・バースデー'].sample"
```

![大石泉_1_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106217/a803ff36-6187-12d5-d225-e867a7b48d1d.png)

実行する毎に以下の要素のなかからランダムに出力されます。
[Aray#sample](https://docs.ruby-lang.org/ja/latest/method/Array/i/sample.html) を利用しています。

* 大石泉スキ
* idol++
* ネイビーウェーブ
* ビット・パフォーマー
* ニューウェーブ・ネイビー
* ニューウェーブ・バースデー

## Rubyのclassファイルを作成してみよう
コマンドラインからの入力だけでは **ビット・パフォーマー** にはなれないのでRubyでclassを定義してコードを書いてみましょう。

### 初歩的なclass定義とコマンドラインからの実行
テキストエディタで以下のコードを入力して `izumi.rb` という名前で保存します。

```ruby
class Izumi
  def perform
    puts '大石泉スキ'
  end
end

# コマンドラインから呼び出された時に実行される処理
izumi = Izumi.new
izumi.perform
```

コマンドプロンプトで以下のコマンドを入力して `izumi.rb` を実行します。

```bash
ruby izumi.rb
```

![大石泉_2_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106217/4d15d334-2200-55fb-063e-7f22322adbc4.png)

### irbからの実行
コマンドラインからの実行では1回限りの操作しか行えないので複数回の操作を繰り返して変化が起こるようにしてみましょう。
まずは、Rubyの対話型の実行環境である `irb` を立ち上げましょう。
`--noreadline` オプションをつけないと日本語入力が行えないので気を付けてください。

```bash
irb --noreadline
```

以下のようにRubyのコードを実行することができます。

![大石泉_2_2_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106217/e9c82550-4376-b6f7-e393-9afe7177f74d.png)

`izumi.rb` を以下のように書き換えます。

```ruby
class Izumi
  def initialize
    @idol = 0
  end

  # Rubyはインクリメント演算子がないので全角文字を利用したメソッド名にしています
  def idol＋＋
    @idol += 1
  end

  def perform
    puts '大石泉スキ'
    idol＋＋

    if @idol % 3 == 0
      idol_rank = @idol / 3

      puts ''
      puts "大石泉のアイドルランクが上がった！ => アイドルランク #{idol_rank}"
    end

    @idol
  end
end
```

`izumi.rb` ファイルのあるディレクトリに移動してirbを起動し、以下のコマンドを入力して `izumi.rb` の内容をirbに読み込みます。

```ruby
require './izumi'
```

class定義から `izumi` インスタンスを作成して `perform` メソッドを呼び出します。

```ruby
izumi = Izumi.new
izumi.perform
```

![大石泉_2_2_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106217/5aea0880-6648-316b-71ee-9e35cba09844.png)

`perform` メソッドを呼び出す毎に `idol++` されて3回毎にアイドルランクがアップしていきます。

![大石泉_2_2_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106217/c5b4d557-7ce8-28d6-6ca6-da5ff6536871.png)
サイトのファビコンを取得して画像ウィジェットにセットする

どうもこんばんは、みかんです。

**！！！！とつぜんですがたいせつなおしらせ！！！！**

2020年1月27日
App Maker の提供終了に向けた対応のご案内
https://support.google.com/a/answer/9682494?p=am_announcement&visit_id=637157414793613981-426262357&rd=1


??!???!?!?!???!?

残念ながら2021年1月19日には終了してしまうそうです(涙)
移行先はAppSheetかApp EngineかGoogleフォームだそうです・・・

消すのは忍びないので記事は残して置きますが、何かの間違いじゃ無い限り役に立つことはないでしょう・・・


**！！！！おしらせはおわりです！！！！！**


今回はサイトのファビコンを取得して画像ウィジェットにセットする方法を書いてみます。
下記ステップでやっていきます。

* アプリの下準備
* URLからドメインを取得するコードを書く
* ファビコンを取得できるURLを作成するコードを書く
* 入力値からファビコン用URLを作成し、画像ウィジェットに設定するコードを書く

# アプリの下準備

|![ap01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26085/b96643c0-6650-8b80-c3a1-b404701b522e.png)|
|:-:|

|![ap02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26085/d50eabb9-2fb3-a7c9-956b-9f9a1f2b1e68.png)|
|:-:|

Blank Applicationからアプリを作成して、NewPageにウィジェットを3つ置きます。
スクリプトからウィジェットを参照するので、わかりやすい名前を付けておきましょう。

|![ap04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26085/4ebba6d6-c121-9207-28de-545ffa23ec34.png)|
|:-:|

ボタンのonclickに「loadFavicon」という関数を書いておきます。

# URLからドメインを取得するコードを書く

|![ap03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26085/68b3f1df-50f3-f9b5-9b81-bfaa7ed781e5.png)|
|:-:|

クライアントスクリプトを新規作成しましょう。
下記関数を追加します。

```javascript
function getDomain(url) {
  return url.match(/^https?:\/{2,}(.*?)(?:\/|\?|#|$)/)[1];
}
```
渡したURLのドメイン部分だけを返す関数になります。

# ファビコンを取得できるURLを作成するコードを書く

続けて、下記関数も追加します。

```javascript
function getFaviconUrl(url) {
  return "http://www.google.com/s2/favicons?domain=" + getDomain(url);
}
```

このようなURLの末尾にドメインをつけたURLを作ると、そのドメインのfaviconを取ってきてくれるURLの出来上がりです。

# 入力値からファビコン用URLを作成し、画像ウィジェットに設定する処理を書く

必要な関数は出揃ったので、各ウィジェットと連動させましょう。下記のような関数を作ります。

```javascript
function loadFavicon() {
  var uiRef = app.pages.NewPage.descendants;
  var url = uiRef.UrlBox.value;
  var faviconUrl = getFaviconUrl(url);
  uiRef.FaviconImage.url = faviconUrl;
}
```

ボタンを押された時に呼び出される想定の関数です。
特定のウィジェットを参照する方法はいくつかあるのですが、ここでは絶対参照方式を使っています。
長くなると見づらいので、一旦uiRefという名前で変数に持っておいてます。
入力値(URLを想定)を取ってきて、
favicon用のURLに変換し、
画像ウィジェットにセットしています。

説明のために、UrlBoxが空だったらとかURL形式じゃなかったらとかは無視しています。

# 動作確認

Previewで動作確認してみましょう。

|![check-compressor.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26085/89847b60-bf1f-01d8-6a40-db5c24187e94.gif)|
|:-:|

以上です。良いApp Makerライフを!
素因数分解

ある整数num(num>=1)を素因数分解する方法


Python3.6.8

```Python3
#Python3
import math

def calc(num):
    L =[1]
    for i in range(2, int(math.sqrt(num))+1): #iが素因数であるか、2から√numまで調べる
        while num % i==0:
            L.append(i)
            num = num//i
    if num !=1:
        L.append(num) #最後に残ったnumをリストに追加
    print(L)
            

calc(100)
```
```
[1, 2, 2, 5, 5]
```
<br><br>

C17++

```C++
//C17++
#include <bits/stdc++.h>
using namespace std;

void calc(int num){
    vector<int>L(1, 1); //L(要素数,初期値)
    int n = sqrt(num);
    
    for(int i=2; i<=n; i++){
        while (num % i==0){
            L.push_back(i);
            num = num/i;
        }
    }
    if(num !=1){
        L.push_back(num);
    }
    for(auto c:L){
        cout << c << ' ';
    }
}

int main(void){
    calc(90);
    
}
```
```
1 2 3 3 5
```
ありがとうございました。

参考文献
試し割り法 - Wikipedia
https://ja.wikipedia.org/wiki/%E7%B4%A0%E5%9B%A0%E6%95%B0%E5%88%86%E8%A7%A3
なぜ、デザインは「センス」が必要だと思われるのか。

[Ateam Lifestyle Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ateam-lifestyle)の6日目は
株式会社エイチームライフスタイル クリエイティブ戦略部 マネージャーのMが担当します。

---

いきなり問題です。
AとBはどちらが正解[^1]でしょうか？
わからない！という方は、なんとなくしっくりくるほうを選んでもらって構いません。

![colors.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217789/83b1296c-6b3c-4a0c-0511-d0b8df9df587.jpeg)
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>

## デザインはロジックの塊である

正解は「A」です。
AもBも5つの異なる色相で成り立っていますが、Aは近似する明度と彩度で構成された配色になっています。この状態を表す為に[トーン](http://www.sikiken.co.jp/pccs/pccs04.html)という概念があります。
**トンマナを合わせる**という言葉を聞いたことがある方も多いと思いますが
Aはトーンが合っている状態であり、更にペンタード配色[^2]で構成され、左から順に色相環[^3]に沿って右周りの順で配置されています。
一方、Bのほうは明度や彩度がバラバラであり秩序のない状態、つまりトーンが合っていない状態と言えます。

<img width="666" alt="87CB91F7-D397-4220-BCC2-48F1A337652A.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217789/0100096e-562e-d103-316c-1232c8833792.png">


トーンを合わせることによって色を通じて「楽しい」「さわやかな」「冷たい」といったような様々な印象を与える効果があります。
更にビジュアルにも統一感が生まれ、伝えるべき情報に優先度を持たせやすくなるのです。
デザイナーは色の説明をする際、この原理を伝えてあげると良いかもしれません。

今回は配色を例に挙げましたが、色だけでなくレイアウト、タイポグラフィなど全てのデザインにはこのようなロジックがあります。
デザイナーの皆さんはなぜAが正しいのか、言語化して説明できますか？
[^1]: 理論に基づく配色
[^2]: ペンタード配色：色相環を５等分（72度）した位置にある５色の色を組み合わせる配色のこと
[^3]: 代表的な色相を系統的に環状に並べたもの

## 感覚派デザイナーの罪

上記の問題をなんとなく感覚で正解が判った人は**感覚派デザイナー**になれる素質があります。
ちなみに私も超感覚派デザイナーです。
デザインのルールに則っていないものには何かしら違和感を感じ、どこを直せばよいのかも感覚ですぐわかってしまいます。
これだけ言うと、凄い能力に思えませんか？

一昔前は、デザインを体系的に学んだ経験がなくても、IllustratorやPhotoshopなどのツールが一通り使えれば簡単にデザイナーになれました。なぜならば、当時日本ではまだデザイナーといえばグラフィカルな「見た目を作る人」という認識が一般的だったからです。
ツールを使ってそれっぽいモノを作ることができれば、誰でもデザイナーを名乗れたんじゃないかなと思います。

更に経験を積んでいくと自分の中にデザインのストックが増えたり、ルールを自然と覚えてしまうので、感覚だけでも充分やってこれたのです。
（今はデザインを体系的に学べるカリキュラムや書籍も充実しているので本当にありがたい限り…。）

## センスの正体

実は感覚派デザイナーの多くは、先程の例を**論理立てて言語化**することが残念ながらできません。
例えば彼らに二番目の例がなぜ正しいのかを聞いてみると

>デザイナー
「明らかにこっちのほうがいいじゃん！」

とか

>デザイナー
「こっちのほうがしっくりくる。」

とか
>
デザイナー
「俺が良いって言ったからいいんだ！（いいから素人は黙ってろ）」

のような言葉しか多分出てこないと思います笑。
頭ではわかっていても、**デザイン理論を学んでいないので説明のしようがない**のです。

そのため、ノンデザイナーの人もなぜそれがデザインとして正しいのかわからないままゴリ押しされる為、

>ノンデザイナー
（なんかよくわかんないけどプロが言うんだからそういうモンか〜。）
（俺、センスないしとりあえず任せておくか〜）

と、ロジックが見えないから**デザインはプロにしかわからない”何か"**として処理されます。デザインはセンスが必要と思われてしまうのは、こういった背景があるからです。
何が正しいのかなんとなくわかってしまう、これが「センス」と言われる正体です。

## これからのデザイン

昨今はデザイナーの役割が正しく認知されてきており、デザインの領域もかなり広がってきました。
世の中にどんどん新しいサービスが生まれコモディティ化も進む中で、他と差別化を図るためにはデザイナーもビジネスやテクノロジーの領域を行き来することが求められるようになってきました。
その為には**他職能とのコミュニケーション能力**が必須になります。
デザインをロジカルに理解し伝えることで、はじめてビジネスやテクノロジーと繋がることができるのです。
デザインはデザイナーだけのものだった時代はもう終わったのです。
デザイナーも他の職能と仕事をする際は必ず自分がデザインしたものに説明責任を持てるようになって下さい。そして、デザインは設計でありロジックだということをぜひ伝えていってください。

## おわりに

とはいえ、デザインを全て言語化することはなかなか難しいことです。
人の頭で理解し説明できる範囲に及ばない部分も少なからずあるのではないかと思っています。
そこを表現できるのが感覚派デザイナーならではの強みなのかもしれません。




---

Ateam Lifestyle Advent Calendar 2019 の7日目は、@takaHALがお送りします。
お楽しみに！

“挑戦”を大事にするエイチームグループでは、一緒に働けるチャレンジ精神旺盛な仲間を募集しています。興味を持たれた方はぜひエイチームグループ採用サイトを御覧ください。
<https://www.a-tm.co.jp/recruit/>
Akashic Engine の FilledRect で線分を描いてみた

この記事は、[Akashic Engine Advent Calendar 2019](https://qiita.com/advent-calendar/2019/akashic-engine)の4日目の記事です。

# はじめに

Akashic Engine は JavaScript で動作するマルチメディアライブラリです。ニコニコ生放送で動くゲームの開発に使われています。Akashic Engine で何ができるかは以下の入門を読むと分かります。

- [Akashic Engine 入門](https://akashic-games.github.io/tutorial/v2/)

Akashic Engine はとてもプリミティブな機能しか用意されておらず、例えば線を描くという機能がありません。マルチプラットフォームのマルチメディアライブラリの SDL (Simple DirectMedia Layer) に線を描く命令がないのと似ています。

この記事では、Akashic Engine の FilledRect を利用して線を描く方法を説明します。記事中のコードは TypeScript で書かれています。

# FilledRect

Akashic Engine の `FilledRect` は塗り潰した矩形を描画します。以下は座標 `(100, 80)` に幅 `80` 高さ `40` の赤色の矩形を作るコードです。

```typescript
const rect = new g.FilledRect({
  scene,
  cssColor: "#ff0000",
  x: 100,
  y: 80,
  width: 80,
  height: 40
});
```

`akashic-sandbox` でグリッド付きで表示する以下のようになります。

![img01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70306/57ea1a96-5d58-02f3-8a4b-18381fa7fcb5.png)

`FilledRect` は矩形の左上頂点までの距離で座標を指定します。`FilledRect` には回転角を指定する `angle` プロパティがあります。`angle` プロパティには角度を度数で表します。例えば `15` 度傾ける場合は以下のコードになります。

```typescript
const rect = new g.FilledRect({
  scene,
  cssColor: "#ff0000",
  x: 200,
  y: 100,
  width: 300,
  height: 200,
  angle: 15
});
```

実行すると以下の表示になります。

![img02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70306/67827a77-0f28-ba79-1cf9-0ac6bb7528e8.png)

矩形の中心座標を中心に時計回りに回転します。回転の中心座標が矩形の左上ではない点に注意が必要です。

# FilledRect で線分を描く

Akashic Engine の `FilledRect` は回転させることができるので、細長い `FilledRect` を回転させることで、2点を結ぶ線分を描画できます。

ここでは `(x1, y1)` から `(x2, y2)` までの線分を描くのに必要な `FilledRect` のプロパティ `x`, `y`, `width`, `height`, `angle` を計算します。

最初に線の太さを決めます。

```typescript
const lineWidth = 5;
```

線の長さは2点間の距離になるので、

```typescript
const lineLength = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
```

直線の角度を `Math.atan2` で計算します。`180 / Math.PI` をかけて孤度法から度数法に変換します。

```typescript
const lineAngle = Math.atan2(y2 - y1, x2 - x1) * (180 / Math.PI);
```

この時点で `width`, `height`, `angle` は、以下のようになります。

```typescript
const width = lineLength;
const height = lineWidth;
const angle = lineAngle;
```

となります。問題は `x` と `y` の座標です。`FilledRect` は中心で回転するので回転後の座標を考えて座標を決める必要があります。具体的には以下のようになります。

```typescript
const x = x1 - (lineLength / 2 - (x2 - x1) / 2);
const y = y1 - (lineWidth / 2 - (y2 - y1) / 2);
```

`(x2 - x1) / 2` は矩形の中心のX座標です。`lineLength / 2` からこの値を引くことで、x座標のずれを補正します。y座標も同様に計算します。図で表すと以下のようになります。

![img03-fix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70306/e83289c3-020e-4625-3a9c-85fb6cdc9622.png)

xとyは式を整理すると以下のようになります。

```typescript
const x = (x2 + x1 - lineLength) / 2;
const y = (y2 + y1 - lineWidth) / 2;
```

これで線分が描画できます。以下のように `x1`, `y1`, `x2`, `y2` を与えると、上の図の赤線が出来上がります。

```typescript
const x1 = 200;
const y1 = 100;
const x2 = 500;
const y2 = 300;
```

# デモとソースコード

以下のURLで実際に動くデモを試せます。

- [デモページ](https://lambdataro.github.io/akashic-line-demo/)

ソースコード全体は以下のリポジトリに置いてあります。

- https://github.com/lambdataro/akashic-line-demo
多次元連想配列の数値の合計値を出す

# 多次元連想配列の数値の合計値を出す

```php:index.php
array(3) {
  [0]=>
  array(2) {
    ["name"]=>
    string(5) "apple"
    ["stock"]=>
    int(2)
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(5) "lemon"
    ["stock"]=>
    int(4)
  }
  [2]=>
  array(2) {
    ["name"]=>
    string(5) "orange"
    ["stock"]=>
    int(8)
  }
}
```

こちらの連想配列の`"stock"`の値を合計していきます。

処理方法は

```php:index.php
$sum_stock = array_sum(array_column($fruits, 'stock'));
```

です。
`array_column()`で配列の単一のカラムを抽出し、その値を`array_sum()`で合計するという方法です。

結果は

```php:index.php
var_dump($sum_stock);

int(14)
```

以上多次元連想配列の数値の合計値を出すでした。

ご閲覧ありがとうございました。
iOS13のUISearchBarにつまずいた

# はじめに
今まで `UISearchBar` のテキストフィールドをカスタマイズしたい場合は下記のようにアクセスする方法が主流でした。

```swift
let textField = searchBar.value(forKey: "_searchField") as? UITextField
```

しかし、iOS13 では実行すると下記のようなエラーとなりアプリがクラッシュします:scream:

```
Terminating app due to uncaught exception 'NSGenericException', reason: 'Access to UISearchBar's _searchField ivar is prohibited. This is an application bug'
```

>This is an application bug

:scream::scream::scream:

# 対応
iOS13 からは [`searchTextField `](https://developer.apple.com/documentation/uikit/uisearchbar/3175433-searchtextfield) というプロパティが追加されたようです。

こちらは [`UISearchTextField`](https://developer.apple.com/documentation/uikit/uisearchtextfield) というクラスのようですが `UITextField` を継承しているので今まで通りテキストフィールドとして利用できます。

iOS13 以前では今まで通り `value(forKey: "_searchField")` でアクセスしないといけないので下記のような　`extension` を作ると使いやすいと思います。

```swift
extension UISearchBar {
    var textField: UITextField {
        if #available(iOS 13.0, *) {
            return searchTextField
        } else {
            return value(forKey: "_searchField") as! UITextField
        }
    }
}
```

これでどの画面でも `searchBar.textField` でアクセスできるようになりました:tada::tada::tada:

# その他UISearchBarの新機能
iOS13 からは下記のクラスが追加されており色々新機能があるようです。

* [UISearchTextField](https://developer.apple.com/documentation/uikit/uisearchtextfield)
* [UISearchToken](https://developer.apple.com/documentation/uikit/uisearchtoken)

[UISearchTextFieldDelegate](https://developer.apple.com/documentation/uikit/uisearchtextfielddelegate) というプロトコルも追加されているみたいです。

下記の記事に詳しく書いてありました。

* [【iOS】iOS13のUISearchBarの新機能を試してみる](https://qiita.com/shiz/items/4524ac5f1e9005f45dfa)

`UISearchToken` がおもしろそう

# さいごに
`UISearchBar` は `value(forKey: "_searchField")` という非合法のやり方でテキストフィールドにアクセスする Developer があまりにも多いので公式で API を用意してくれたんですかね？

>This is an application bug

というくらいですからお前らもう公式で用意したからそういうことやめろよ？って感じがします:sweat_smile:

余談ですが `UIAlertController` も下記のように色々カスタマイズできます。

`UIAlertAction` の　`setValue(_:forKey:)` で下記のようにキーを指定すると色々できるようです。([参考](https://qiita.com/unicoonn1/items/a009916c87b667ae987f))

* image
* imageTintColor
* titleTextColor

他にも色々いじれそう...([参考](https://stackoverflow.com/questions/30056236/uialertaction-list-of-values))

こんな感じ

<img width="282" alt="alert" src="https://user-images.githubusercontent.com/34936885/69916459-8d865200-149e-11ea-867e-4a7bf206120f.png">

`UIAlertController` のカスタマイズもみんなが使いまくれば公式 API が公開されるかも？:hatching_chick:

# 参考
* [UISearchBarのプライベートなプロパティにアクセスするコードがiOS 13では禁止になったようです](https://qiita.com/ktanaka117/items/1a30c4c6052cd8e1a0b7)
* [【iOS】iOS13のUISearchBarの新機能を試してみる](https://qiita.com/shiz/items/4524ac5f1e9005f45dfa)
* [UIAlertControllerの左端にImageを表示させる方法(UIAlertControllerカスタマイズ)](https://qiita.com/unicoonn1/items/a009916c87b667ae987f)
* [UIAlertAction list of values](https://stackoverflow.com/questions/30056236/uialertaction-list-of-values)
クラウド型BIツールLookerの概要と使い方

Advent Calendar初参加です🎉４日目！
今更ながら知ったんですが、アドベントって**降臨**って意味なんですね。
イエスキリストの降臨を祝福をしつつ(?)、業務で使用したLookerの使い方をまとめていこうと思います。

# Lookerとは
[Looker](https://ja.looker.com/)はクラウド型のBIツールです。
データベースと連携するとい感じに統計や分析をして表示してくれます。
公式ドキュメントは[こちら]
(https://docs.looker.com/)。
Lookerは去年から日本に向けたビジネスを開始しており、日本語にはまだまだ対応していない印象です。

# 設定方法
基本的に以下のような流れで設定を行なっていきます。

1. データベースの連携
2. lookerMLで各データの定義
3. Exploreで各データを抽出し可視化
4. Browseでダッシュボード化

Lookerは独自の概念や単語が多く、それらを理解していく必要があります。
それぞれ説明していきます。

### 1. データベースの連携
Looker自体はデータを持ちません。データ元となるデータベースが必要です。
**Admin > [Database]Connections** から、項目に従って必要な情報を入力していきます。
<img width="1440" alt="1database.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/fe917ef4-ce2e-4ced-35e0-9bc00613d3ca.png">

### 2. lookerMLで各データの定義
**Develop > Manage LookML Projects** で、プロジェクトの設定をします。
**LookML**はLooker独自の言語で、各データの定義を行います。
YAMLとほぼ似た構成なのでわかりやすいと思います。
Gitと連携して、バージョン管理することも可能です。

<img width="1440" alt="2LookML.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/26d3c468-208d-2be6-990f-972d877bb5b6.png">

LookML Projectsでは、**Model**と**View**という項目があります。

**Model**・・・キャッシュのタイミングなどデータベースに関する設定
**Views**・・・データの型や集計方法などの定義
<img width="1440" alt="3Views.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/7496f6e3-4fc9-f3da-46dd-971c3a7ea096.png">

簡単な集計なら[measure](https://docs.looker.com/reference/field-params/measure)を使うと便利です。

### 3. Exploreで各データを抽出し可視化
Exploreではデータの表示を設定することができます。
<img width="1440" alt="5Explore2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/9a225aac-d375-3135-b4ca-1c077ed79608.png">

Exploreでは、左メニューから選んだデータを、右画面で可視化ができます。
右画面には**FILTER**、**VISUALIZATION**、**DATA**という機能があります。

**FILTER**・・・データを条件によってフィルタリング
**VISUALIZATION** : グラフの形式や色などレイアウトの変更
**DATA**・・・表形式のデータ結果やSQLの表示

右上の設定アイコンから出力結果を保存できます。

### 4. Browseでダッシュボード化

**Browse > xx’s Space** を選択すると、Exploreで出力した一覧を見ることができます。
<img width="1440" alt="7Browse.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/f2330d47-1e52-e976-a917-e148436645c1.png">

ダッシュボードでは、各統計や分析結果の配置を変更することが可能です。
<img width="1440" alt="9Browse3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/cf1bcb04-e61c-ee1f-3893-bdec83725861.png">

権限などの設定を行うと、ユーザに対してこの画面のみ表示するようにすることができます。

# 余談
Lookerを使ってみての感想ですが、多機能なため仕様に柔軟に対応できそうです。
ただその反面、ここに書いていない機能はまだまだあり、それらを理解し使いこなすのに少し時間がかかりそうです。

自分はLookerの[SSO Embedded](https://docs.looker.com/reference/embedding/sso-embed)という埋め込み機能を利用して実装したので、もし要望があればそれについての記事も書きます。
(ほぼ英語の公式ドキュメントしか情報がなくてしんどかった・・・)

ちなみにLookerは2019年6月に[Googleに買収](https://www.itmedia.co.jp/news/articles/1906/07/news062.html)されました。
今後Google Cloudプラットフォームに組み込まれたりするんでしょうか。
そうなったらさらにいろんな可能性が出てきそうですね。
料金体系も変わったりするのか気になるところです。

記事に間違いや不明な点があれば遠慮なくご指摘ください！
個人的によく使うUIViewExtension

他の方が取り上げていたら:bow_tone1:
## 四隅のアンカー作成

```swift
extension UIView {
    func addEdgeConstraint() {
        guard let superview = self.superview else {
            return
        }
        translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            self.topAnchor.constraint(equalTo: superview.topAnchor),
            self.leadingAnchor.constraint(equalTo: superview.leadingAnchor),
            self.trailingAnchor.constraint(equalTo: superview.trailingAnchor),
            self.bottomAnchor.constraint(equalTo: superview.bottomAnchor),
        ])
    }

    func addEdgeSafeAreaConstraint() {
        guard let superview = self.superview else {
            return
        }
        translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            self.topAnchor.constraint(equalTo: superview.safeAreaLayoutGuide.topAnchor),
            self.leadingAnchor.constraint(equalTo: superview.safeAreaLayoutGuide.leadingAnchor),
            self.trailingAnchor.constraint(equalTo: superview.safeAreaLayoutGuide.trailingAnchor),
            self.bottomAnchor.constraint(equalTo: superview.safeAreaLayoutGuide.bottomAnchor),
        ])
    }
}

```
###使い方

```swift
class ViewController: UIViewController {
    let imageView = UIImageView()
    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(imageView)
        imageView.addEdgeSafeAreaConstraint()
    }
}
```

## インスタンス生成時のプロパティ編集
 
```swift
protocol Layout: UIView {}
extension UIView: Layout {}
extension Layout {
    func layout(_ layout: (Self) -> Void) -> Self {
        layout(self)
        return self
    }
}
```
### 使い方

```swift
class ViewController: UIViewController {
     let label: UILabel = UILabel()
                            .layout {
                               $0.textColor = .white
                            }
}
```

もっと上手に書ける方法があったら教えていただけると非常に嬉しいです
国土地理院やJAXAの公開しているGISデータを手に入れる

# GISデータを手に入れる

※後で画像・スクリーンショットなどを追加してもっとわかりやすくする

世の中に公開されているGISデータを手に入れて、QGISなどの汎用GISアプリケーションで扱えるところまで、ざっと書きます。

## 国土地理院の基盤地図情報を手に入れる

おもむろに、国土地理院の[基盤地図情報ダウンロードページ](https://fgd.gsi.go.jp/download/menu.php)にアクセスしましょう。
このページの「ダウンロード」の「基盤地図情報」の「基本項目」の「ファイル選択」ボタンをクリックすると、シンプルな地図表示ページが開きます。
とりあえず、ダウンロードしたいデータのある地域をズームインしていき、枠内の6桁くらいの数字部分をクリックして選択しましょう。

「選択リスト」項目の「ダウンロードファイル確認へ」ボタンをクリックすると、ダウンロード画面に遷移します。
「すべて選択」して「まとめてダウンロード」ボタンを押すと、ログイン画面とアンケートの画面を経て、多少時間がかかるかもしれませんが、ダウンロードされます。
アカウントがないとダウンロードできないので、あらかじめ作っておきましょう。

ダウンロードしたものは、国土地理院が策定した地理情報用XMLデータになっています。取り回しがしやすいようにShapeファイルという、事実上GIS分野のデファクトスタンダードになっているファイルに変換します。（※最近はKMLとかなのか？実はShapeファイルももう古い？）

[基盤地図情報のドキュメントページ](https://fgd.gsi.go.jp/download/documents.html)にある、「基盤地図情報ビューア」を使います。ダウンロードして展開しておきましょう。（対応OSはWindowsのみです。）

展開したフォルダ内のFGDV.exeを実行すると、基盤地図情報ビューアが起動します。ビューアという名前ですが、各種便利な変換などもしてくれます。何にしろ国土地理院公式ツールなので、安心感はあります。

メニューの「ファイル」-「新規プロジェクト作成」から、先ほどダウンロードしたZipファイル（まとめてダウンロードした場合は一段階展開した方がよい）を直接読み込むことができますが、東京都心部のデータなどは、死ぬほど重いので注意してください。

メニューの「エクスポート」-「エクスポート」を選ぶと、エクスポートダイアログが開き、今表示されているデータをエクスポートすることができます。
変換種別をシェープファイル、「直角座標系に変換」のチェックを「外し」、「全データ領域を出力」を選択して、出力先フォルダを設定して「OK」ボタンを押しましょう。場合によってはものすごく時間がかかるので、適当に分けて出力することを考えてください。

以上で、国土地理院の基盤地図情報をQGISなどの汎用GISソフトウェアで扱いやすい、シェープファイルに変換することができます。

## JAXAのDSMを手に入れる

[AW3D30のサイト](https://www.eorc.jaxa.jp/ALOS/aw3d30/index_j.htm)から、全球数値地表モデル(DSM)をダウンロードできます。
こちらも、アカウント登録が必要なのであらかじめしておきます。
ここでも、地図上から欲しい領域のデータを探してダウンロードするだけです。「4. データのダウンロード方法」あたりのダウンロードサイトへのリンクをクリックすると世界地図のページが開くので、そこから欲しい地域にドリルダウンして最後に「Download」リンクからファイルをダウンロードしましょう。

ちなみに、こちらのファイルは、.tar.gzで圧縮されているので、対応する展開ソフトを使います。個人的な趣味としては、「7Zip」を使っていますが、何でもよいでしょう。
こちらのファイルの中身はGeoTiffという画像ファイルになっています。なので、そのままPhotoshopなどの画像編集ソフトウェアにも読み込むことができます。ただ、16bitのグレースケール画像になっているので、対応していないソフトは多いかもしれません。
8bitグレースケールなどに変換してテクスチャとして読み込むことができれば、そのままハイトマップとして使うことで、地形をUnityなどでリアルに表示することができます。

GeoTiffはGISとして必要な情報もTiffファイルのフォーマットを拡張して格納しているので、そのままQGISなどの対応GISソフトに読み込むことができます。便利ですね。

# まとめ

ほかにも、公開されているGISデータは結構色々あります。日本だと国土交通省が国土地理院とは異なる側面のデータを公開していますし、NASAがスペースシャトルからのリモートセンシングで作成した全球数値標高データなどもあります。そうしたデータを扱うときに大切なのが、ファイル形式についての理解と、データの作り方や性質・精度などに関する理解になります。あまり広く知られていない分野なので調べるのが難しかったりしますが、これらを活用することで、様々な価値につながると思います。

ということで、駆け足ですが、今日はここまで。
C++でsprintf的な文字列フォーマットを行う

C++には、sprintf的な文字列フォーマットを行う機能は標準では備わっていない。そのため、Boost Format Libraryに含まれる`boost::format`を使うなどする必要がある。

Boost Format Libraryを使う場合の例：

```cpp
// サンプルコード
#include <iostream>
#include <string>
#include <boost/format.hpp>

int main()
{
    const std::string s = (boost::format("%03.4d %s") % 3 % "abc").str();
    std::cout << s << std::endl;
}

```
実行結果：

```sh
003 abc
```

# 参考

文字列フォーマット - boostjp : Boost日本語情報サイト
https://boostjp.github.io/tips/format.html
インスタンスの管理はちゃんとせよという教訓を得た話

ちゃんとしたシステムを作りたい場合インスタンスというもののライフサイクルをきちんと把握しておかなければいけません。
プログラムは目に見えないものなので、インスタンスがどこで作成されて、どこで解放されるのか、それが把握できなくなるということは極端な話ですが制御不能だといってもいいでしょう。

例えばデザインパターンではインスタンス生成に関するパターンという区分けがありまして、代表的なもので言えばSingletonとかFactory(AbstractFactoryやFactoryMethod)がありますね。

今回私が作っていたシステムではスレッドの実行とインスタンス生成を組み合わせた処理がありました。
プログラムの全貌を話すことはできませんが、搔い摘むと下記のようなイメージです。


```csharp:TaskManager.cs
class TaskManager
{
    private CancellationTokenSource source;
    public void Create(ISomethingProcess proc){
        source = new CancellationTokenSource();
        var token = source.Token;

        Task.Run(async() =>{
            try{
                while(!token.IsCancellationRequested){
                    //何かをする処理 ...
                    proc.SomeMethod();


                    await Task.Delay(100, token);//ちょっと待ってみたり
                }
            catch(TaskCanceledException e){
                logger.Info("キャンセルされました",e);
            }
            catch(Exception e){
                logger.Error("致命的なエラーが発生しました。",e);
                throw;
            }
        },token);
    }
    public void Cancel(){
        source.Cancel();
    }
}

```

```TaskList.cs
class TaskList
{
    public TaskList(IFactory factory){
        list = new List<TaskManager>();
        this.factory = factory;

    }
    private List<TaskManager> list;
    private IFactory factory;

    public void Start(){
        Stop();
        list.AddRange(factory.CreateTaskList());
        foreach(var each in list){
            each.Create(factory.GetSomethings());
        }
    }

    public void Stop(){
        foreach(var each in list){
            each.Cancel();
        }
        list.Clear();
    }
}

```

TaskListはコマンドによってタスクを起動したり、停止したりします。
TaskManagerはTaskを生成したり、キャンセルしたりします。

今回TaskListはいろんな処理からStartしたりStopしたりをしてまして、横着して以下のようなコードを書いてしまってました。

```csharp:Something.cs
class Something
{
    public void Hoge(){
        tasklist = new TaskList(factory);
        tasklist.Start(); // まとめて実行
    }
    public void Fuga(){
        tasklist?.Stop();
    }
    TaskList tasklist;
}
```

TaskList自体には何も問題ないかもしれませんがSomethingクラスではtasklistのインスタンスをHogeが実行されるたびに再生成し、スタートをしています。
私はTaskListを作る時、「StopしてからStartしてればタスクがキャンセルされるので制御できるよね！」という考えのもと作ってたんですが
Somethingを作ってた時は、「TaskList再生成すればGCされるだろうし、再生成すればいいよね～」と考えてた感じです。
この処理で、２回３回連続してHogeを実行してしまうと、見事に以前インスタンス化したTaskListが宙ぶらりんになってしまい、キャンセルできないタスクが実行しっぱなしという現象に見舞われたのでした。

今回は全部自分で作成しているシステムでしたのでもう惑わされませんが、これがTaskListとSomething、分業して開発している場合は普通に起こりえる問題ですよね。怖い怖い。
psコマンドでスレッドID, スレッド数を確認するコマンドメモ


psコマンドでスレッドID, スレッド数を確認するコマンドメモ
スレッド毎のメモリ、CPUも確認したい。
JVMのスレッドダンプ取ったりする時に使った記憶。

# コマンド

```
$ ps auxww -L
USER       PID   LWP %CPU NLWP %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
shodai     774   774 21.0    1  0.0  17380  1960 tty1     R    00:05   0:00 ps auxww -L
```

## LWP
light weight process ID(軽量プロセスID) or スレッドID
## NLWP
プロセス内のlwpの数。
【PowerShell】今日の日付の名前のフォルダを作成するスクリプト

#1.この記事について
こんなケースを想定。
《今日の日付のフォルダを手早く作成したい》
《応用として現在時刻のフォルダも作成したい》

#2.やりたいこと
日付のフォルダを作成したいフォルダでPowershell起動。
スクリプトを実行して自動的に目的のフォルダを作成。
スクリプト実行後は自動的にPowershellのウィンドウも閉じればなお利便性が良い。

※実行するスクリプトは環境変数PATHの通ったフォルダに格納して
tabキーで簡単に呼び出せるようにすると良いかと思う。

#3.作成したコード

###※※20191223追記※※

[こちらで頂いたコメント](https://qiita.com/dede-20191130/items/150dea98affbedea1fd2#comment-5e1dd43379a3404d020d)
をもとにプロセス停止周りを改善。

```powershell:mkdir_Today.ps1
#現在日時を取得する（西暦＆月＆日の形式）
$date = Get-Date -Format "yyyyMMdd"

#カレントディレクトリに既に作成予定のフォルダが存在する場合は処理を終了
if (Test-Path .\$date) {
    Write-Host "フォルダが既に存在します"
    exit
}

mkdir .\$date

#powershellを停止する（Powershellのウィンドウを閉じる）
Stop-Process -Id $PID

exit

```



#4.コードの解説
~~###__Stop-Process -name powershellについて__~~
~~フォルダの作成後にPowershellのウィンドウが残っていると~~
~~いちいち閉じなければならないので面倒だった。~~
~~そのため処理後に自動的に閉じるように実装している。~~

~~※ただしPowershell全部のプロセスを終了するため~~
~~裏で動かしてたりするプロセスが無いようにする注意が必要となる。~~
上記は追記の内容で改善した。

<br><br>
###応用：現在時刻のフォルダの作成
$dateに格納する値を変えるだけ。

```powershell
$date = Get-Date -Format "yyyyMMdd_HHmm"
```



#5.終わりに
なにか補足がありましたらコメントください。
【AWS EC2】デプロイに1週間かかったので、起こったことをありのままに全て話すぜ！

#はじめに
ただいまプログラミングスクールにて学習する身でございます。
さて、そんな私が初めてデプロイした時にめっちゃ時間がかかったっていう話です。
基本的には、カリキュラム通りにやっていれば問題なくデプロイできるのですが。
な　ぜ　か　アプリを3つ、インスタンスが６つ作るはめになってしまいました。

カリキュラムはちゃんと読もうね！

#序の口
エラーは出ましたが、なんとか対処できるレベルのやつ。

[【AWS EC2】bundler -v -bash: bundler: コマンドが見つかりません
](https://qiita.com/kaorioka09jm/items/c1ed1c7749cb7c84a877)
**→原因：bundllerをインストールするコマンドの入力し忘れ**

[【AWS EC2】$sudo vim /etc/nginx/conf.d/rails.conf 書き込みできない
](https://qiita.com/kaorioka09jm/items/8524733eff31040c3d6f)
**→原因：権限付与のコマンドの入力し忘れ**

[【AWS EC2】Mysql2::Error: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'](https://qiita.com/kaorioka09jm/items/cd4731a4d4cbb149584e)
**→原因：EC2サーバー上でSQLが起動してないのにDB作ろうとした。**

[【AWS EC2】`find_spec_for_exe': can't find gem bundler (>= 0.a) with executable bundler (Gem::GemNotFoundException)](https://qiita.com/kaorioka09jm/items/22ccba2923ce46fad260)
**→原因：手順がテレコになったから出たエラーだと思われ。**

[【rails】Mysql2::Error::ConnectionError【凡ミス系】
](https://qiita.com/kaorioka09jm/items/3755a2bcd67c1ebc6fe8)
**→原因:エラーに関係のない箇所修正してて、それを戻さず先に進んだため別の場所でエラーが出た。つまり勝手なことした。**

#伝説の一手
運命を呪いたくなるようなコマンドの一手。

[【rails】PCからrvenvだけを間違ってアンインストールしてしまって鼻血が出た話
](https://qiita.com/kaorioka09jm/items/77f3b64027d8ed05bb21)
**原因：rvenvを削除するコマンドを打ったら、EC２からタイムアウトしていたようで、ローカルでコマンド打ったことになりPCからrvenvを削除してしまいました。rails sできなくなって発狂して鼻血出た**

#地獄の8時間
せっかくの休日を丸一日費やした悪夢のミス。

[【AWS EC2】mysqlにログインできない時最後に見る記事　for mac【凡ミス系】
](https://qiita.com/kaorioka09jm/items/3c563871e5927ff9d2b0)
**→原因：macのメモ帳にコマンド書いてから打ち込んだら、パスワードにアポストロフィーが入ってしまい、ログインができない事案が発生。内容もさることながら費やした時間も地獄。**

#途方に暮れた
[【AWS EC2】ログインしようとすると@@WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!@@
](https://qiita.com/kaorioka09jm/items/e847ad03b0d383d0bf0d)
**→原因：不明。free wifiスポットで出るエラーかと思ったら、自宅でも出て途方に暮れた。この時、インスタンスをなんども作り直し、IPを使い回ししていたため、それが原因かも？と思ってIP変えてみたらログインできた。でも直接的に関係あるかは不明。**

#資産記事
このミスの多さにより自分の資産となりうる記事が誕生したこともまた事実。

[【AWS EC2】自動デプロイ設定後に、修正ファイルを再デプロイする手順
](https://qiita.com/kaorioka09jm/items/2af4097c563c2c023027)
　→自動デプロイ通過したあとに修正指示来た時にどうしたら良いかって、すんなり行った人ほどわからないようでした。

[【AWS EC2】デプロイするまでに使うコマンドメモ
](https://qiita.com/kaorioka09jm/items/0cbd312324fea9ed85c8)
　→試行錯誤しつつやってるとカリキュラムのルート上にほしいコマンドが載ってないんだよね。（まずそれがおかしい）そんな自分のために作った記事です。

#おわりに
いかがでしたでしょうか。これらは普通にやってれば全く出ないエラーの数々です。
同期の友人たちはこれ以外のエラーを出していて、エラーを出すということも深い世界だって思いました。できれば出したくないけど、出ることによってこの先の肥やしになるなら出すのは今でしょ！

ちなみに今回のこの試行錯誤により、AWSから３００円くらいの請求がきました。
こんなもんでよかった...