OmniAICreator/Qiita-1.07M huggingface dataset:
Arduino 通信機能付き キット DKRK100900　第３回目 (温度と湿度を測定してWEBページに表示)

## Lesson 2 send temperatue/humid data to browser
https://osoyoo.com/2018/09/11/use-w5100-ethernet-shield-to-make-an-arduino-iot-web-server/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488134/07122562-b56e-c723-1d9d-e13d1f6733cb.png)

## 内容
温度と湿度を測定してWEBページに表示
おまけとして、LEDの表示・非表示をリンクで変更できる

## 学んだこと

```c
DHT.read11(DHT11_PIN);
DHT.temperature;
DHT.humidity;
```
温度・湿度

```c
while (client.connected()) { 
  if (client.available()) { 
    char c = client.read();            
    //read char by char HTTP request 
    while (readString.length() < 100 && c != 0x0D  ) {
      //store characters to string 
      readString += c; 
      c = client.read();        
    }
    // control arduino pin 
    if(readString.indexOf("?LEDON") > -1) //checks for LEDON 
    { 
       digitalWrite(ledPin, HIGH); // set pin high 
    } 
    else
    { 
    if(readString.indexOf("?LEDOFF") > -1) //checks for LEDOFF 
    { 
        digitalWrite(ledPin, LOW); // set pin low 
    } 
} 
```
リンクによってLEDをつけたり、消したり。リクエストの情報をclient.readで読み出せるようだが、byte毎の読み出ししかできないので、100bitもしくは終わりまでループさせて、その中にLEDONやLEDOFFが存在しているのかを確認して、digitalWriteのHIGH or LOWでLEDをつけたり消したりしている。
https://www.arduino.cc/en/Reference/ClientRead

## ハマったこと
１． ライブラリーdhtが見つからないというエラーが発生
→ 上のosoyoo.comのlesson2をよく読むと、Ardunio libray DHTのダウンロードリンクが存在する
DL後にArdunio IDE の/Users/ユーザ名/Documents/Arduino/librariesに配置。

2. 温度と湿度を測定できない。
→ 配線の間違え
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488134/be89db2c-70b5-b756-abd7-0306eec309db.png)
４本差し込めそうなところが、この図だとあるが、実際には３つで順番が違っている。真ん中がdataなので、それを7番に接続。


## 参考サイト
ライブラリーの追加がわかりやすく記載されている
https://www.indoorcorgielec.com/resources/arduinoide%E8%A8%AD%E5%AE%9A/arduino-ide%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A8%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E6%A7%8B%E6%88%90/

## 感想
アクセスしてくるURLでLEDをつけたり、消したりできたのは、「おー」っと思った。
HDF5での文字列の扱いと圧縮の関係

# 背景
あるプロジェクトで約１GB程度あるcsvファイルを可視化するWebアプリケーションの作成に携わった。
実際に表示する部分はcsvファイルの一部分であり、csvファイルで管理ではパフォーマンス上問題が多いことがありDBの利用を模索していたが、他のメンバーのスキルや開発環境の統一の面倒からデータをHDF5ファイルで管理することが選択された。
しかし実際にHDF5のファイルを生成すると考えていたよりも大きなファイルとなったので調査してみた。

# 前提条件

## CSVファイル
今回比較するファイルは使用するファイルは横200列程度、縦1万行程度のcsvファイルであり基本float64型だが10列程度string型があるファイルとなっており、約200MBのファイルです。

## HDF5ファイル
表形式ではなく、1列ごとにDatasetを作成する形となっています。

## 圧縮方法について
HDF5を扱うために`Python` + `h5py`を利用しています。
参考資料
- https://qiita.com/simonritchie/items/23db8b4cb5c590924d95
- [公式ドキュメント](https://docs.h5py.org/en/stable/)

圧縮する際は`create_dataset`や`require_dataset`関数を呼び出す際に`compression="gzip"`と`chunks=True`を指定することでいい感じにチャンク単位で圧縮されます。
[ドキュメント](https://docs.h5py.org/en/stable/high/group.html#h5py.Group.create_dataset)

例) float64

```python
group.require_dataset(name=col_name, shape=(data.index.size,), maxshape=(None,), dtype=np.float64, chunks=True, compression="gzip")
```

例) string

```python
group.require_dataset(name=col_name, shape=(data.index.size,), maxshape=(None,), dtype=h5py.string_dtype(), chunks=True, compression="gzip")
```

# 本題

前提条件での条件でHDF5ファイルを生成すると約198.3MBのファイルが生成されました。
個人的には全て文字列としているCSVファイルに比べて変化がないのはよく分からなかったので調査をしました。

## 調査1 数値データだけにする 
文字列を含む列を全て取り除き、HDF5ファイルを作成してみました。
結果、10MB程度とかなり小さくなることがわかったので原因は文字列の扱いにあると考えました。

## 調査2 文字列に関する取り扱いを変化させる
文字列は公式ドキュメントで1章分作られるほど取り扱いが面倒なようです。
https://docs.h5py.org/en/stable/strings.html

そこで固定長データとして扱うことにしてみました。

```python
group.require_dataset(name=col_name, shape=(data.index.size,), maxshape=(None,), dtype=h5py.string_dtype(length=30), chunks=True, compression="gzip")
```

`string_dtype(length=30)`を追加しています。
この`length`は文字列の最大長として扱われ、この長さを超えると文字は全て切り捨てられます。

この結果19MB程度とかなり小さくなりました。

## 調査3 lengthはサイズに影響するのか
調査2で指定した`string_dtype(length=30)`ですが、lengthを変化させるとサイズに影響するのか確かめました。
`length=20`とかなりギリギリに指定してみた結果18.5MBとあまり変化が無いようでした。
この結果より空文字となっているところがgzipによりうまく圧縮されているようです。

そのためlengthは安全寄りの数値を選択することを推奨します。

# まとめ
最後に結果をまとめます。

|  | 圧縮なし | gzipのみ | length=30のみ | gzip + length=30 |
|:--|--:|--:|--:|--:|
| サイズ | 385.9MB | 198.3MB | 308.2MB | 19MB |
| 圧縮率 | -- | 49% | 20% | 95% |

固定長で圧縮をかけると全然違いますね。

# 結論
HDF5で文字列を扱う際は可変長ではなく固定長を使おう!
【小ネタ】WSL利用時のRaspberry Pi Picoへの書き込みをコマンドラインから行う

[Raspberry Pi PicoをWSL(Windows Subsystem for Linux)で使う](https://qiita.com/yunkya2/items/e67996301a2d8d2a5609) で紹介した手順で、WSL上のビルドでできた*.uf2ファイルをコマンドラインからRaspberry Pi Picoに書き込めるようにします。

# pico-installスクリプト

BOOTSELボタンを押しながら起動すると現れるマスストレージデバイスはWSLからは見えないためWindowsのエクスプローラからドラッグ&ドロップする必要があったのですが、WSLからPowerShell[^1]を呼び出して代わりにコピーしてもらうことで、WSLでもコマンドラインからの書き込みができるようにしました。

[^1]: コマンドプロンプトからでも見えるのですが、こちらは逆にWSL側のファイルシステム(\\\\wsl$\\)を見ることができないため、使えるのはPowerShell一択です。

以下のシェルスクリプトを`pico-install`という名前で保存して実行属性を付けます。

```bash:pico-install
#!/bin/sh
if [ $# -ne 1 ]; then
        echo "Usage: $0 <file>"
        exit 1
fi

DRIVE=`powershell.exe get-volume|grep RPI-RP2|awk '{print $1}'`

if [ "${DRIVE}" = "" ]; then
        echo "$0: Raspberry Pi Pico is not mounted"
        exit 1
fi

powershell.exe copy $1 ${DRIVE}:
```

WSLでアプリケーションをビルド後、`pico-install blink.uf2` のようにuf2ファイルを指定して実行すると、ボリューム名が RPI-RP2 であるドライブ(BOOTSELを押しながらRaspberry Pi Picoを起動すると現れるドライブ) にそのファイルをコピーしてくれます。該当ドライブがなければエラーで終了します。
Reactで環境変数を使う


## 環境変数用のファイルを用意しておく
- 頭に`REACT_APP`をつける必要がある

```.env
REACT_APP_URL=http://localhost
```

## 読み込み方

```javascript

const URL = process.env.REACT_APP_URL;
console.log(URL)
```

## 参考
https://qiita.com/yuta-ushijima/items/a653e9ca4847276f19cd
SphinxのWARNING解決メモ


# 初めに
Sphinxでのドキュメント生成はオリジナルで自動生成を行おうとする際にwaringが割と発生する。
特に一定期間触れないと忘れるので、対策後にまとめる。
したがって、新たに発生したら追記しようと思う。

## WARNING: Title underline too short.

```WARNING: Title underline too short.
```
見出しに使用するテキストより、見出し指定を行うアンダーラインが短いと出るエラー。

```
[NG]
text
==

[OK]
text
========
```

## WARNING: Field list ends without a blank line; unexpected unindent.
```WARNING: Field list ends without a blank line; unexpected unindent.
```
フィールドリスト（ブロック）や属性を設定するなどを示す区切り文字としてコロンが使用されている。
但し、コロンはソースコードの各行1文字目に置くことができない。
ただの文字としては空白を設けることでエラーを防げるが、元々のフィールドリストを記載したい場合はその記法に則った記載を行う。

```
[NG]
: 

[OK]
 :
```

## WARNING: the following exception was raised
```WARNING: autodoc: failed to import function 'xxx_function' from module 'xxx_module'; the following exception was raised:
No module named 'xxx_module'
```

autodoc拡張を使用している場合において、moduleがルートディレクトリ内に存在しない。
ルート設定はしているが、moduleを認識できていない。
未解決。

# 最後に
追記した場合は以下に記載していく。
ネットワーク上のサービス

#ネットワーク上のサービス
サービスというのは、サーバーがネットワーク上で提供している機能。

ファイル共有、プリンタ共有もこの一つ。
プリンタは1台あるだけで、スマホからもPCからもなど複数のデバイスから印刷できるので便利ですよね。

##ゲートウェイ
外部ネットワークとのやり取り管理

##ファイル共有
ネットワーク上でファイルを共有可能にする

##DNS
コンピューター名からIPアドレスを取得する

##プリンタ共有
ネットワーク上でプリンタ共有可能にする

##DHCP
IPアドレスの割当などネットワーク設定を自動化します。
↑Wifiルーターに搭載されている機能なんかな？

##NTP
稼働しているコンピューターの時刻を同期できる。
スマホやｐｃなどが同時にネットにつながるのも、こういうサービスのおかげらしいです。

##IPマスカレード
１つのIPで複数の端末でシェアできるみたい。
そのため、ネットを複数台で同時に閲覧可能だとか。
MR クラウド管理型ワイヤレス アクセスポイント設定ガイド

MR クラウド管理型ワイヤレス アクセスポイント設定ガイド
https://www.cisco.com/c/dam/global/ja_jp/products/meraki/literature/mr-setup-guide.pdf

#Index

###[Meraki AP設定](#meraki-ap設定)

[1.APのローカルWebページへのアクセス](#1apのローカルwebページへのアクセス)

[2.Meraki APへのIPアドレスの割り当て](#2meraki-apへのipアドレスの割り当て)

[3.Meraki APでのスタティックIPアドレスの直接設定](#3meraki-apでのスタティックipアドレスの直接設定)

[4.DHCP予約によるMeraki APのスタティックIPアドレスの設定](#4dhcp予約によるmeraki-apのスタティックipアドレスの設定)

[5.新しいAPの追加](#5新しいapの追加)


###Meraki 機能

1.Air Marshal - ワイヤレス侵入防御システム（WIPS）


#Meraki AP設定

###1.APのローカルWebページへのアクセス

(1)AP を無線でまたは有線クライアントとして関連付けます（AP のイーサネット ポートに接続されているイーサネット ケーブルを使用）。

(2)http://my.meraki.com/ にアクセスします。

###2.Meraki APへのIPアドレスの割り当て

すべての Meraki ゲートウェイ AP（イーサネットで LAN に接続する AP）にはルーティング可能な IP アドレスを割り当てる必要があります。

これらの IP アドレスは、各 AP で直接設定するか、アップストリームのDHCP サーバを介して AP に割り当てることができます。

DHCP を介して IP アドレスを取得する場合でも、Meraki AP では、一般に、スタティック IP アドレスの割り当てが推奨されています。

この場合、DHCP サーバは、Meraki AP に属する MAC アドレスごとにスタティック IP アドレスを割り当てるように設定する必要があります。

802.1x 認証など、ワイヤレス ネットワークのその他の機能は、AP にスタティックIP アドレスが割り当てられていることを想定している場合があります。

###3.Meraki APでのスタティックIPアドレスの直接設定

所定の AP で直接スタティック IP アドレスを設定するには、次の手順に従います。

(1) クライアント マシン（ラップトップなど）を使用して、ワイヤレスで（AP の SSID ブロードキャストに関連付ける）、または有線で AP に接続します。

(2) クライアント マシンの Web ブラウザで次の URL を開き、AP 内蔵の Web サーバにアクセスします。
http://my.meraki.com

(3) [Static IP Configuration（スタティック IP の設定）] タブをクリックします。ログインするよう求められます。
デフォルトのユーザ名は「admin」で、デフォルトのパスワードは AP のシリアル番号（ハイフン含む）です。

(4)この AP がインターネットへの有線接続で使用するスタティック IP アドレス、ネット マスク、ゲートウェイ IP アドレス、および DNS サーバを設定します。
必要に応じて、この AP を LAN へのイーサネット接続に再接続します。

###4.DHCP予約によるMeraki APのスタティックIPアドレスの設定

管理者は、各 Meraki AP にスタティック IP アドレスを関連付けて設定するのではなく、アップストリームの DHCPサーバを使用してMeraki AP にスタティック IP アドレスを割り当てるよう設定できます。
「DHCP 予約」では、IP アドレスが Meraki AP の MAC アドレス用として「予約」されます。

###5.新しいAPの追加

[Configure（設定）] > [Add access points（アクセス ポイントの追加）] ページで、新しいアクセス ポイントを簡単に追加できます。
Elixir実践ガイド 読みました

# はじめに
- [Elixir](https://elixir-lang.org/)楽しんでいますか :bangbang::bangbang::bangbang:
- @kuroda@github さんの:book:「[Elixir実践ガイド (impress top gearシリーズ)](https://www.amazon.co.jp/dp/4295010774/)」を読みました！
- 2021/2/6(土)に開催した「[autoracex #8](https://autoracex.connpass.com/event/203960/)」の成果です

# @kuroda@github さんからのご紹介
- https://twitter.com/tkrd_oiax/status/1357515188564463619
- [まえがきと目次](https://coregenik.com/ja/elixir_practical_guide) 
    - :point_up::point_up_tone1::point_up_tone2::point_up_tone3::point_up_tone4::point_up_tone5:リンク先に公開されています
- [『Elixir実践ガイド』正誤表](https://www.oiax.jp/ex_book1_errata)

## 私のまとめ
### 概要
- **Elixirの入門書**とのことです
    - 開発環境の構築から解説アリ
    - [Enum.reduce/2](https://hexdocs.pm/elixir/Enum.html#reduce/2)、[Enum.reduce/3](https://hexdocs.pm/elixir/Enum.html#reduce/3)、[Enum.reduce_while/3](https://hexdocs.pm/elixir/Enum.html#reduce_while/3)は丸々 一章を使って解説！！！
- 後編(構造体、ポリモーフィズム、ビヘイビア、メタプログラミング、並行プログラミングなど)は**[アドバンスト編]として出版予定** :rocket::rocket::rocket:

### 私がよいとおもったところ
- リスト、タプル、マップ等を模式的な図付きで解説
    - たとえば、なぜリストは先頭への要素追加は速くて、末尾への追加は遅いのかが図付きでわかりやすく解説されています
- 文字列に対するパターンマッチング
    - あ、そんな手があったのね！　という発見を得ました[^1]
        - p.257
- 最後の3章で三目並べ(○☓ゲーム)の実装を通じて、[GenServer](https://hexdocs.pm/elixir/GenServer.html#content)、[Agent](https://hexdocs.pm/elixir/Agent.html#content)の理解が深まります
    - list_of_listsの行と列の入れ替えや、斜めのデータ取得は、なるほどね〜　となりまして、きっといつかどこかで使えるだろうという予感がしています
    - とりあえず今日のところはまだ読んだだけですが、この3章は写経して、しゃぶりつくしてみようとおもっています
- <font color="purple">$\huge{Elixirプログラミングでは、パイプ演算子がとても頻繁に用いられます。}$</font>
- <font color="purple">$\huge{慣れると使うのが楽しく感じるようになるでしょう。}$</font>
    - Exactly!!! I agree with you.
        - @zacky1972 先生「[基本初心者からベテランまでパイプライン演算子で押し通すのですよね。定番の書き方が決まっているんです。](https://qiita.com/zacky1972/items/0c2869f9f39f7bb917a5#comment-8ee72859e27dbd8af53a)」
    - p.65
- 章末に練習問題とその**解答付き**

# Wrapping Up :lgtm::lgtm::lgtm::lgtm::lgtm::lgtm::lgtm::lgtm:
- 続編の**[アドバンスト編]**も楽しみです！
    - 構造体、ポリモーフィズム、ビヘイビア、メタプログラミング、並行プログラミングなど
- Enjoy [Elixir](https://elixir-lang.org/) :bangbang::bangbang::bangbang:

[^1]: https://hexdocs.pm/elixir/patterns-and-guards.html#binaries の`"hello " <> world = "hello world"`の例ご存知でしたでしょうか:interrobang: これおもしろいですよね。
【初心者でもわかる】PCとスマホでjavascriptを切り換える2つの方法（画面サイズ・デバイス）

#どうも7noteです。PCとスマホでjavascriptを切り換える2つの方法（画面サイズ・デバイス）

PCだけに効かせたいjavascript。スマホだけに効かせたいjavascript。
そんなのを書き分ける2つの方法を紹介できればと思います。

**・画面サイズ**
見ている画面サイズによって切り分ける方法です。そのためPCでも画面幅を小さくすればスマホと同じような挙動をします。

**・ユーザーエージェント**
ユーザーエージェント。言い換えればデバイスの種類ごとに判定してjavascriptを書き分ける方法です。


どちらも書き方は難しくなく**直感的にコピペだけで使用することができます。**

※jqueryを使用しております。jqueryってなんだという方は[こちら](https://qiita.com/7note/items/45bd8efbedd557667218)


## 書き方

### ●画面サイズ（幅）で判別してjavascriptを書き分ける方法

```script.js
$(function () {
  $(window).on('load resize', function(){
    var replaceWidth = 768; //ブレイクポイント設定
    var windowWidth = parseInt($(window).width());
    if (windowWidth >= replaceWidth) {
	// PC用コード
    }else {
	// スマートフォン用コード
    }
  });
});
```

### ●ユーザーエージェントで判別してjavascriptを書き分ける方法

```script.js
$(function () {
  var ua = navigator.userAgent;
  if (ua.indexOf('iPhone') > -1 || (ua.indexOf('Android') > -1 && ua.indexOf('Mobile') > -1)) {
    // スマートフォン用コード
  } else if (ua.indexOf('iPad') > -1 || ua.indexOf('Android') > -1) {
    // タブレット用コード
  } else {
    // PC用コード
  }
})
```



## まとめ

ユーザーエージェントで判別する際に、PCとスマートフォンの2種類でしか分けないという場合は、真ん中のelseifは削除して以下のような形でお使いください。

```script.js
$(function () {
  var ua = navigator.userAgent;
  if (ua.indexOf('iPhone') > -1 || (ua.indexOf('Android') > -1 && ua.indexOf('Mobile') > -1)) {
    // スマートフォン用コード
  } else {
    // タブレット・PC用コード
  }
})
```

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
ネットワークを構成する装置

#ネットワークを構成する装置の名前
ざざっといきます

##ルーター
異なるネットワークに相互に接続するための機器

##ハブ
LANケーブルの集線装置で複数のコンピューターに接続

##LANケーブル
文字通り

##NIC
コンピューターをネットにつなぐための拡張ボード
↑PCの中に入ってる

#おまけ
家庭のネットは（NTT光回線または、NTT光コラボレーションモデルの場合）
ONUに光ファイバーケーブルを挿して、
↑NTTから貸与される黒い機会です。

ONUに無線LAN（wifiルータ）挿して、Wifiが飛ぶけどもどういう仕組みなのか・・・
今後勉強します。
光回線に迷ったらソフトバンク光が一番オススメです。NUROよりいい。
powershellの文法の調べ方

#はじめに
powershellのhelpはわかりにくいので今日気がついた、方法をup
#powershellの引数とhelp
powershellでは、例えば次のような関数を作成すると自動的にhelpを作ってくれる

```powershell:function 
function test($x,$y="def"){
  echo $x $y
}
```

ヘルプの内容

```
>help test 
NAME
  test
SYNTAX
  test [-x] <object> [[-y] <object>]
PARAMETERS
  -x <object>
     Required?   true
     position    0
     省略
　-y <object>
     Required?   false
     position    1
      省略
```
そうなのである。functionで
 test 1 2
とかで使おうと思っていた関数が
 test -x 1 -y 2
というように呼ぶことができるのだ。これを知っていると次の応用ができる。

#通常のコマンドの調べ方
つまり、いちいち、-xxxを指定しない方法は「position」を検索すればいいということになる。
そこで、
help ls | position
とすると、pathが１番目、filterが２番目とわかるので

ls . *.bat 
とかすれば、okであるというのが分かる。
めでたしめでたし。
BICとは何か

#はじめに

千葉大学大/Nospareの[米倉](https://sites.google.com/site/shoutoyonekura/)です．今回はベイジアン情報量規準(BIC)について解説をしたいと思います．理由は赤池情報量規準（AIC)についての解説はよく見かけますが，BICはあんまり見かけない気がしたからです．AICについては，例えば[川久保先生の記事](https://qiita.com/ykawakubo/items/4bb7498eaa59218c127d)等を参照して下さい．

#エビデンス（周辺尤度）とベイズファクター
まずベイズ統計学の文脈で，エビデンスと呼ばれるものについて解説します．エビデンスは周辺尤度ともよばれます．今データ$y=(y_1,...,y_n)$がi.i.d.で観測されたとしましょう．この時ベイズ統計学ではパラメタ$\theta$に対して事前分布$p(\theta)$と尤度関数$L(y\mid\theta)$を分析者が設定し，事後分布$\Pi(\theta\mid y)=\frac{L(y\mid\theta)p(\theta)}{m(y)}$を求めることを考えます．ここで$$m(y)=\int L(y\mid\theta)p(\theta)d\theta$$のことを<font color="Red">エビデンス（周辺尤度）</font>と呼び，ベイズ統計学の枠組みでモデル選択を行う際にとても重要な量になります．

何故モデル選択を行う際に重要となるのでしょうか？今二つのモデル$\mathcal{M}_1$，$\mathcal{M}_2$があるとしましょう．この時ベイズ統計学では，$$BF(1,2):=\frac{\int L(y\mid\theta_1)p(\theta_1)d\theta_1}{\int L(y\mid\theta_2)p(\theta_2)d\theta_2}$$のことを(モデル１と２の）「ベイズファクター」と呼びます．つまりベイズファクターとは，それぞれのモデルのエビデンスの比です．

ベイズファクターの性質として，モデル1の方がモデル２よりデータにフィットしているならば，サンプルサイズの$n$を大きくすると，その値が$+\infty$に近づきます．逆にモデル2の方がフィットしていると，$0$に値が近づきます．よって,ベイズファクターの値を見てモデル１か２，どちらを使う方がいいのかを決めることが出来ます．ベイズファクターの性質等について詳しくは，例えば，[Chib and Kuffner (2016)](https://arxiv.org/abs/1607.00292)を参考にしてみてください．また定義より，エビデンスの対数を取ったものは$$\log m(y)=\log L(y\mid\theta)+\log p(\theta)-\log\Pi(\theta\mid y)$$が常に成立します．

#ラプラス近似
エビデンスは上で確認した通り，モデル選択の際に良い性質を持っています．しかしながらエビデンスを求めるときの積分，つまり$\int L(y\mid\theta)p(\theta)d\theta$は，一般に解析的に求められることが困難であるという弱点を抱えています．そこで何かしらの積分の近似を考える必要があるのですが，今回は<font color="Red">ラプラス近似</font>を用いることを考えてみます．

ラプラス近似のアイディアを簡単に言うと，<font color="Red">密度関数はある条件の下で最尤推定値を中心とした正規分布で近似できる</font>，というものです．詳しくは，[Kass et al. (1990)](https://www.stat.cmu.edu/~kass/papers/validity.pdf)を参照して下さい．ラプラス近似を事後分布に適用し対数を取って2倍すると，$$2\log m(y)\approx 2\log L(y\mid\hat\theta)+2\log p(\hat\theta)+d\log 2\pi-d\log n-\log det(J(\hat\theta))$$
という関係が成立することを示すことが出来ます．ここで$\hat\theta$は最尤推定値，$d$はパラメタ$\theta$の次元，$J(\hat\theta)$は$\log L(y\mid\theta)$を$\theta$に関して二階微分し最尤推定値で評価した行列を$n$で割ったもの，$det(A)$は行列$A$の行列式を表します．本当はもう少し色々な項が出てくるのですが，ここでは簡単化のために省略しています．

#BIC
$n\rightarrow\infty$としたとき，上のラプラス近似で得た式の$\log p(\hat\theta), \log det(J(\hat\theta))$はある仮定の下で定数に収束することが示せ，また$d\log 2\pi$はそもそも定数です．そこで，[Schwarz (1978)](https://projecteuclid.org/euclid.aos/1176344136)はラプラス近似で得た式でそれらの項を無視した$2\log L(y\mid\hat\theta)-d\log n$をモデル選択で用いることを提唱しました．通常AICとの整合性から，これにマイナスをかけて$$BIC=-2\log L(y\mid\hat\theta)+d\log n$$をベイジアン情報量規準(BIC)とよび，この値が小さいモデルを良いモデルとして選びます．まとめると，<font color="Red">BICとはエビデンスのラプラス近似</font>です．

#BICの注意点
導出から分かると思いますが，BICはパラメタの推定として最尤推定を採用しています．そのため，<font color="Red">ベイジアンという名前に反してBICは頻度論的世界観の情報量規準</font>です．実際，事後分布をラプラス近似できる条件は，最尤推定量の一致性や漸近正規性の条件と密接に関係しています．

より「ベイズ的」な情報量規準として，例えば偏差情報量規準（DIC）や広く使える情報量規準（WAIC）などがありますが，これらについても今後機会があれば解説していきます！


#一緒にお仕事をしましょう！
今回の内容に関連する共同研究・各種お問い合わせにつきましては，お気軽に米倉までご連絡ください．また，株式会社Nospareでは統計学の様々な分野を専門とする研究者が所属しております．統計アドバイザリーやビジネスデータの分析につきましては[株式会社Nospare](https://bit.ly/38WtGZH) までお問い合わせください．
<a href="https://bit.ly/38WtGZH">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1023506/d5c625c0-d6f4-680b-d702-3c40f11d6c39.jpeg" alt="株式会社Nospare" width=400>
</a>
Amazon　S3とは

#AmazonS3とは
AWSが初めて公開したサービスです。
データを保存するサービスです。

↑端的すぎますが・・・

##AmazonS3概要
・ストレージサービス
・高耐久
　99.999999999
　障害によってデータ失う確率らしい・・・
↑イレブンナインと言われているらしい

・高拡張性（容量無制限、ファイル数無制限）
↑１オブジェクトあたり、5TB制限あるらしい。

###利用用途
・長期保存する
・大量のデータ
・ファイルをそんなに書き換えないものの保存
↑出し入れとか頻繁に編集する場合は不可。

###S3の構成要素
・バケット→オブジェクトの集合体
・オブジェクト→S３に格納されるデータそのもの
・メタデータ→オブジェクトを管理するための情報（オブジェクト作成日時）

##料金
月50TBまでは1GBあたり2.5円

###料金体系
ストレージ容量+データ転送料金+リクエスト料金

ここでリクエストってなんだ？と思ったんですが
GET/PUT/POST/LIST/COPY
↑これを行うときに課金されるようです。

##ストレージクラスを使い分けることができる
ストレージクラスってなんだ・・・という感じですね。
使う用途によってコストダウンを図るために用意されているだとか。

###S3標準
こちらは標準的なストレージクラスです。

耐久性はイレブンナイン
可用性は99.99%

###S3 Intelligent-Tiering
最もコスト効率の高いストレージクラスに自動的にデータ移動する（素晴らしい！）
利用頻度が予測できないときに使う。

耐久性はイレブンナイン
可用性は99.9%

###S3　標準低頻度アクセス
アクセス頻度は低いが、すぐに取り出す必要があるデータに利用する
標準より安価
取り出し料金有り

耐久性はイレブンナイン
可用性は99.9

###S３ １ゾーン低頻度アクセス
アクセス頻度は低いが、すぐに取り出す必要があるデータに利用
S３標準低頻度アクセスより20%安い

耐久性がイレブンナイン
可用性が99.5%
一つのAZに保存(

###S3 Glacier
データアーカイブ（バックアップ）
保存する必要はないが、即時アクセスは必要無しデータを格納する。
低コスト
即時アクセス不可
取り出しに手続きが必要（数分〜数時間）
取り出し料金有り

耐久性イレブンナイン
可用性99.99%

###S3 GlacierDeepArchive
もっと低頻度のアクセスなのでコストダウンをしたい場合。
取り出し時間が一番かかる（12時間）

耐久性イレブンナイン
可用性99.99%
最小ストレージ期間が180日と長い


###最小ストレージ期間
S3標準　なし
その他　３０−１８０日
↑1日利用をしても30日分の料金が取られるような仕組み
【個人開発】ニクテン～お肉AI判定サービスをリリース！お肉の写真をAIが判定・スコア化

お肉写真をAIが判定・スコア化してくれるサービス**「ニクテン」**をリリースしました！
リクルートのAIサービス・A3RTの「Image Influence API」とGoogle Apps Script(GAS)を組み合わせて開発しました。
ぜひ、多くの人に使ってみてほしいので、Qiitaで紹介したいと思います。

## お肉AI判定サービス「ニクテン」とは？

お肉AI判定サービス「ニクテン」はWebサービスとして開発しました。

[「ニクテン」～お肉AI判定サービス](https://auto-worker.com/blog/?p=2747)

お肉の画像をアップロードすると、AIが美味しそうか判定し、点数化してくれます。
![Snipaste_2021-02-06_18-16-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365005/a288e8be-0ace-02d5-0084-47b5969f7472.png)
点数は1点以上～10点満点で、小数点ありのスコアです。

**※画像サイズによってはアップロード～AIの判定結果出力まで数十秒かかることもあります。**

## 開発言語は？

開発言語は無料Webサービス開発の強い味方、「Google Apps Script(GAS)」です。
GASだけでWebアプリケーションに必要な3つの要素が完結します。

+ HTMLやCSSのフロント部分
+ AIとのデータやり取りのバックエンド
+ デプロイ環境

これだけ揃って、Herokuのようにサービス停止なく、無料利用できるって恐ろしすぎですｗ

## AIはどうやって実装？

お肉判定のAIは、リクルートが公開しているAIサービス・A3RTの「Image Influence API」を利用しました。
HTTP(POST)リクエストで画像データを投げるだけで、評価スコアを返却してくれます。
GASとも連携しやすく、お手軽AIサービスにはもってこいです。

## AIの学習モデルの構築は？

Image Influence APIには、デフォルトでお肉を評価するAIの学習モデルが用意されています。
自分で頑張って画像を用意し、スコアを付けて学習させるよりも、あらかじめ利用用途に即したモデルのほうが評価精度が高いと考えました。

## 終わりに

今回、お肉AI判定サービス「ニクテン」をリリースしたので、記事を紹介してみました。
Google Apps Script(GAS)を活用したので、サーバーレスで無料でWebサービスが作れました。

お肉の写真が他の人から見て映えているかの確認など活用してみてください↓

[「ニクテン」～お肉AI判定サービス](https://auto-worker.com/blog/?p=2747)
サクラエディタからExcelのセル内改行状態でコピペする方法

データベースの項目一覧からリスト作るときに苦労したので
手順を備忘録もかねて

#本例の説明
・D列にB列C列の内容をセル改行の形式で入力したいこととする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475419/4c0ec7d1-767a-3770-a93f-6fe566130061.png)



#手順

①　B-C列をコピーし、サクラエディタへコピーする。

　　　●Excel(コピー時)
　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475419/caf3af9c-f36f-bd94-8f0f-5068ee375db5.png)

　　　●サクラエディタ(貼り付け後)
　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475419/7517ff29-aa6a-857b-c3cb-4e5e70c40342.png)


②　サクラエディタ側で行の先頭と最後に「"」を入力する。
　　※[Alt]を利用して矩形選択すると楽。

　　　●サクラエディタ(入力後)
　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475419/4b5019f8-c008-1bb4-4ad8-639e6fcce060.png)

③　サクラエディタで[Ctrl+R]を押下し、[置換ウインドウ]を表示する。
　　　●置換ウインドウ
　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475419/e7bc49ce-4aad-9d29-2997-a75d365b221b.png)


④　置換ウインドウに以下内容を入力、チェックする
　　・置換前：\t
　　・置換後：\n
　　・正規表現：チェックあり
　　・置換対象：選択文字
　　・範囲：ファイル全体

　　　●置換ウインドウ(入力後)
　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475419/573dcaad-78f8-efe6-e823-4ff45554a3a1.png)


　　　●置換前
　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475419/d911c88b-8400-1327-93d6-579c1c109a69.png)

　　　●置換後
　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475419/a20128a6-5b42-30a5-a749-4bfda1f689d3.png)

⑤　サクラエディタで全コピーし、Excelへ貼り付ける。

　　　●Excel(貼り付け時)
　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475419/4924a483-7cd4-395e-e63f-5fccabbe96d0.png)

ここまで
初心者用Git使い方

#前提
最初からGitHubDesktopの操作に慣れてしまった私が、gitのコマンド操作に少しでも慣れるために書いたアウトプットの記事です。
復習も兼ねています。
GitやGitHubとはなんぞやは調べるとすぐわかるので、今回説明は省略します。


#環境
Mac OS Big sur
バージョン11

#基本的な流れ
**1.ステージングエリア（一時待機場所）へ変更したファイルを登録する**
**2.登録したファイルをコミット（ローカルリポジトリへ保存）する**
**3.コミットしたファイルをプッシュ（リモートリポジトリへ保存）する**

細かく説明します。

###1.ステージングエリア（一時待機場所）へ変更したファイルを登録する
ステージングエリアとはコミットをするファイルを選択するための一時待機場所

**＜ファイルをすべてaddする場合＞**

```terminal
git add .
```
**＜ファイルを指定する場合＞**

```terminal
git add ファイル名
```

###2.登録したファイルをコミット（ローカルリポジトリへ保存）する
ポイント：時系列で記録される
ポイント：どこを変更したのかコミットメッセージを残す

```terminal
git commit
```
```terminal
git commit -v
#-vをやると、変更内容も見れるよ
```

```terminal
git commit -m "コミットメッセージ"
#-mでコミットメッセージも同時に行える
```

**＜vimを使って、コミットメッセージを入力する場合＞**
入力方法・・・半角英数字にして、iを力すると入力モードになり、ここでコミットメッセージ入力
保存方法・・・escボタン→「:wq」と入力→Enter

**＜余談＞**
1作業1コミットが原則らしいが、コミットの単位は実際人それぞれなわけで・・・
どうしたらええねんと思ったとき、以下の記事がとても参考になった。
https://qiita.com/jnchito/items/40e0c7d32fde352607be

###3.コミットしたファイルをプッシュ（リモートリポジトリへ保存）する
**＜リモートリポジトリが作成されている場合＞**

```terminal
git push origin ブランチ名
```

**＜リモートリポジトリが作成されていない場合＞**
GitHubで新規リポジトリを作成後、以下コマンドを入力し、＜リモートリポジトリが作成されている場合＞のコマンドを入力する

```terminal
git remote add origin https://~~~
#リモートリポジトリを作成した際に作られたURL
```

**おまけ**
コミットしたlogを確認したいときはgit logで確認できる
（誰がいつどんな変更をしたのか）

```terminal
git log
#オプションその１（一行で表示する）　　--oneline
#オプションその２（ファイルの差分を見る）　　-p ファイル名
#オプションその3(最新の見たいコミット数を指定する)　-n 数字
#操作　上にいきたいとき　j
#操作　下にいきたいとき  k
#操作　終了したいとき  q
```

##どんなコマンドがあるの？（基礎編）

**①ローカルリポジトリの新規作成**

```terminal
% git init
```
「init」はinitializeの略
このコマンドをうつと、「.git」ディレクトリが作成されて、そこでファイルやファイルの変更内容が管理されていくんやで〜

**②ディレクトリの移動**

```terminal
% cd ディレクトリのパス
#ディレクトリ間は / で区切る
```
**③ディレクトリの一覧を表示**

```terminal
% ls
```
```terminal
% ls -a
```
-aというオプションをつけると隠しディレクトリも見れるんやで〜

**④ディレクトリの作成（新規フォルダの作成ってやつですね）**

```terminal
mkdir
```


**⑤ファイルの削除**

```terminal
rm ファイル名
```
意味は、remove
削除したファイルをステージングエリアへ追加したい場合は以下のコマンドを使う

```terminal
git rm ファイル名
```

**⑥ファイルのコピー**

```terminal
copy
```

**⑦ファイルの移動とファイル名の変更**

```terminal
mv
```

**⑧コミット後の変更箇所を確認**

```terminal
git status
```

**⑨変更の差分を確認**
ステージングエリアやコミットへの保存をする前に、本当に必要な変更なのかを確認するために使うよ

```terminal
git diff
```
diffrentの略
ローカルとステージングエリアとの差分を確認できる

```terminal
git diff HEAD
```
ステージングエリアとコミットとの差分を確認できる

#参考にしたもの
Udemyの「はじめてのGitとGitHub」
https://www.udemy.com/course/intro_git/

#その他参考記事
https://qiita.com/konweb/items/621722f67fdd8f86a017
【基本情報技術者】8進数を10進数に変換

8進数5746を10進数に変換


【解説】
8進数5746,8093を10進数に変換する方法を説明してみたいと思います.

まず考え方として
1桁目はそのまま
2桁目は 8 * 値
3桁目は 8 * 8 * 値
4桁目は 8 * 8 * 8 * 値
1桁目 + 2桁目 + 3桁目 + 4桁目 = 10進数の値
となります。

今回の例、5746で実際計算してみます。
6
8 * 4 = 32
8 * 8 * 7 = 448
8 * 8 * 8 * 5 = 2560
6 + 32 + 448 + 2560 = 3046
となります。


77073もやってみます。
3
8 * 7 = 56
8 * 8 * 0 = 0
8 * 8 * 8 * 7 = 3584
8 * 8 * 8 * 8 * 7 = 28672
3 + 56 + 0 + 3584 + 28672 = 32315
となります。
css flexを理解する

# 初めに
cssを使っていく中で理解を深めるためにまとめてみる。

# flexとは
flexについては[MDN Web Docs]では以下のように説明されています。
>flex は CSS の一括指定プロパティで、フレックスアイテムをフレックスコンテナーの領域に収めるために、どのように伸長・収縮させるかを指定します。

コンテナとは容器なので、指定した範囲内で中のアイテムの大きさを指定することができる様子。

##### flexのプロパティ
- flex-grow （他と比較してどれくらい大きくなるかを指定）
- flex-shrink (他と比較してどれくらい小さくなるかを指定)
- flex-basis （初期の寸法を指定）

# 参考文献
[MDN Web Docs](https://developer.mozilla.org/ja/docs/Web/CSS/flex)
【Heroku】デプロイしたけど背景画像がアップロードされないよ！！

皆さん、こんにちは！のんびり系初心者白ヒゲさんです(*´∇｀*)

今回はHerokuへデプロイした時のお話です。

##最終形態のview
![citylab.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711992/fff1bd37-bc6f-ec49-bd6d-c0326143a6b7.jpeg)

上記の画像のようなviewを模写コーディングしながらアップロードしようとしたのですが...


##初回デプロイのview
![citylab2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711992/d7dbeb7e-7f41-6811-79f8-486cf5a9c39e.png)

上記のように背景画像が反映されていませんでした_:(´ཀ`」 ∠):

そーいえば、今まで背景画像をつけたものをHerokuへ上げてませんでした。

Herokuって画像が消えるとか聞くし背景画像もあげれない！？
そんな馬鹿な事を薄ぼんやりと考えながら検索していくとありました(*´∇｀*)

##へへっ...なんだよ、やっぱりできるじゃねぇかよ...

config(設定)>environments(環境)>production(本番)

```ruby:config>enviroment.rb>production.rb
  # Do not fallback to assets pipeline if a precompiled asset is missed.
  config.assets.compile = false
```

```ruby:config>enviroment.rb>production.rb
  # Do not fallback to assets pipeline if a precompiled asset is missed.
  config.assets.compile = true
```

とりあえずこれで背景画像が写るようになりました(*´∇｀*)

##ただし！ここの仕組みが詳しくわかっていない！！
イマイチ仕組みを理解しきれていないので結局どうして？や応用がこれを書いているときは把握できていません！！
ちょっと詳しく調べていきたいと思います（ ;  ; ）

それでは、お疲れ様でした！
Q21.[Reversing]reversing easy!を解いてみようとした

結論でいうとキレイな解法がよくわからない(´・ω・｀)
write up的な何かなのでメモ程度に・・・

>フラグを出す実行ファイルがあるのだが、プログラム(elfファイル)作成者が出力する関数を書き忘れてしまったらしい… 

問題文を見ると出力する関数を書き忘れたとのこと
とりあえず指定ののファイルをfileコマンドで見てみる

```
rev100: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=f94360edd84a940de2b74007d4289705601d618d, not stripped
```

ELFファイルってのは分かるけどそれ以上のことは読み取れない・・・
ELFだしとりあえず実行してみる

```
root@kali:/home/kuratsuka/Documents# ./rev100 
cpaw{}
```

う～んcpaw{}としか表示されない・・・


Stirlingで開いてみる
![st.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517314/9fb307eb-a6a3-4d26-0744-1432db8876ac.jpeg)

cpawって文字列が見える・・・
邪魔な情報も多くフラグを絞りきれないので、他の人の解法をググるとstringsコマンドとやらを実行するらしい

##stringsコマンドで試してみる
stringsコマンドを調べてみたところざっくりファイルの可読部分を表示させるコマンドらしい
とりあえずstringsコマンドを実行してみる


```
D$Fcpawf
D$J{
D$ y
D$$a
D$(k
D$,i
D$0n
D$4i
D$8k
D$<u
D$@!
T$Le3
[^_]
```

※上記はstringsコマンド結果一部抜粋です
縦で読んでみると「yakiniku!」って文字が見える、そして答えを言うとcpaw{yakiniku!}
他のサイトを見ると大体がここで終わる、しかしこれでいいんだろうか？
"D$"とかは共通しているから削除してもいいんだろうけど一体どこまで文字を削除すればいいんだろうか？
もうちょっとキレイに解ける方法はないのかな？？

##IDA Freeに突っ込んで見るとフラグ部分がきれいに取れる？
ReversingにはIDA、古事記にもそう書いてある
demo番だと30分？しか使えないそうなのでFREE版をダウンロードして対象のファイルを解析してもらう
![IDA.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517314/64416085-b224-80fe-9b7b-b09c38430878.jpeg)
movとかそれっぽいの見るの基本上納のCASLⅡ以来だ・・・
この7Bh、79hとかが文字コードっぽい気がするのでとりあえずググって見る


>文字コード表 - しなぷすのハード製作記
>https://synapse.kyoto/lib/MGLCD/CharacterCode/page001.html

参考にさせていただいたのは上記サイト
この文字コードはASCIIコードらしい
"[esp+xxx]"って所が"D$J"とかのyakiniku!の前につく文字っぽいので、その右側の文字を変換していく

|  7Bh |  79h  |  61h |  6Bh  |  69h |  6Eh  |69h |6Bh|75h|21h|7Dh|
| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
|  {  |   y  |a|k|i|n|i|k|u|!|}|
※最後の"}"先頭に0A付いてるけど制御文字っぽい？

上記から{yakiniku!}は読めるけど問題は最初の"77617063h"部分
これが答えからするとここの部分が"cpaw"って書いてあるはずなんだけど・・・

##77617063h部分はリトルエンディアン？
"cpaw"自体をASCIIコードに変換すると"63 70 61 77"となり、解析したコードは逆に入ってることが分かる
>リトルエンディアンとは何？ Weblio辞書
>https://www.weblio.jp/content/%E3%83%AA%E3%83%88%E3%83%AB%E3%82%A8%E3%83%B3%E3%83%87%E3%82%A3%E3%82%A2%E3%83%B3
>＞例えばIntelのマイクロプロセッサでは8086からPentiumシリーズまでリトルエンディアン方式で記録されるが、

同問題に対してリトルエンディアンなので注意してって書いているサイトを見つけた
調べてみると先程のURLにあるWeblio辞書にプロセッサとリトルエンディアンの関係が記述されている
最初のfileコマンドで"Intel 80386"と出力されたがこの80386は8086と同じくx86系なので命令セットが同じ、
つまりリトルエンディアンが採用されているのだ
みんなここまで覚えてCTFしてるの！！？？

##まとめ
IDA Freeの解析のおかげである程度綺麗にフラグは出せたけど
問題文にある通り出力する部分を追記して、ファイルを実行したら"cpaw{yakiniku}"と出力するようにしたかった・・・
ここは完全に技術力不足・・・(´；ω；｀)
【iOS】iPhone / iPadのセーフエリア（Safe Area）一覧

【追記 2025/5/13】
iPad 10 (A16) を追加しました。


自身の整理用にまとめました。

以下で取得した画面サイズとセーフエリア（Safe Area）を機種ごとに一覧にしました。

~~~objectivec

// width / height
NSLog(@"%f %f", [[UIScreen mainScreen] bounds].size.width, [[UIScreen mainScreen] bounds].size.height);

// Safe Area
NSLog(@"%f %f %f %f", self.navigationController.view.safeAreaInsets.top, self.navigationController.view.safeAreaInsets.bottom, self.navigationController.view.safeAreaInsets.left, self.navigationController.view.safeAreaInsets.right);

~~~

iPhoneは、Portrait（縦向き）とLandscape（横向き）とでセーフエリアが異なります。

- Device：　機種
- Size：　画面サイズ（インチ）
- Width：　画面幅
- Height：　画面高さ
- Safe Port Top：　セーフエリア（縦向き）　上
- Safe Port Btm：　セーフエリア（縦向き）　下
- Safe Land Top：　セーフエリア（横向き）　上
- Safe Land Btm：　セーフエリア（横向き）　下
- Safe Land Left：　セーフエリア（横向き）　左
- Safe Land Right：　セーフエリア（横向き）　右

## iPhone

| Device | Size | Width | Height | Safe<br>Port<br>Top | Safe<br>Port<br>Btm | Safe<br>Land<br>Top | Safe<br>Land<br>Btm | Safe<br>Land<br>Left | Safe<br>Land<br>Right |
|---|---|---|---|---|---|---|---|---|---|
| 5 / SE | 4.0 | 320 | 568 | 20 | 0 | 20 | 0 | 0 | 0 |
| 8 / SE2 | 4.7 | 375 | 667 | 20 | 0 | 0 | 0 | 0 | 0 |
| 8 Plus | 5.5 | 414 | 736 | 20 | 0 | 0 | 0 | 0 | 0 |
| 11 Pro | 5.8 | 375 | 812 | 44 | 34 | 0 | 21 | 44 | 44 |
| 11 | 6.5 | 414 | 896 | 48 | 34 | 0 | 21 | 48 | 48 |
| 11 Pro Max | 6.5 | 414 | 896 | 44 | 34 | 0 | 21 | 44 | 44 |
| 13 mini | 5.8 | 375 | 812 | 50 | 34 | 0 | 21 | 50 | 50 |
| 13 Pro<br> 14 | 5.8 | 390 | 844 | 47 | 34 | 0 | 21 | 47 | 47 |
| 14 Pro<br> 15 / 16<br> 15 Pro | 6.1 | 393 | 852 | 59 | 34 | 0 | 21 | 59 | 59 |
| 16 Pro | 6.3 | 402 | 874 | 62 | 34 | 0 | 21 | 62 | 62 |
| 13 Pro Max<br> 14 Plus | 6.5 | 428 | 926 | 47 | 34 | 0 | 21 | 47 | 47 |
| 14 Pro Max<br> 15 Plus<br> 15 Pro Max<br> 16 Plus | 6.7 | 430 | 932 | 59 | 34 | 0 | 21 | 59 | 59 |
| 16 Pro Max | 6.9 | 440 | 956 | 62 | 34 | 0 | 21 | 62 | 62 |

- Safe Area を持つ端末の Safe Port Bottom は 34
- Safe Area を持つ端末の Safe Land Bottom は 21
- Safe Area を持つ端末は、(Safe Port Top) = (Safe Land Left) = (Safe Land Right)

## iPad

| Device | Size | Width | Height | Safe<br>Port<br>Top | Safe<br>Port<br>Btm | Safe<br>Land<br>Top | Safe<br>Land<br>Btm | Safe<br>Land<br>Left | Safe<br>Land<br>Right |
|---|---|---|---|---|---|---|---|---|---|
|  mini (5th)<br> 9.7 | 7.9<br>9.7 | 768 | 1024 | 20 | 0 | 20 | 0 | 0 | 0 |
|  mini (6th/7th) | 8.3 | 744 | 1133 | 24 | 25 | 24 | 25 | 0 | 0 |
|  7/8/9 | 10.2 | 810 | 1080 | 20 | 0 | 20 | 0 | 0 | 0 |
|  10 (A16) | 10.9 | 820 | 1180 | 24 | 25 | 24 | 25 | 0 | 0 |
|  Air3 | 10.5 | 834 | 1112 | 20 | 0 | 20 | 0 | 0 | 0 |
|  Air4/5 | 10.9 | 820 | 1180 | 24 | 25 | 24 | 25 | 0 | 0 |
|  Air 11.0<br> (M2/M3) | 10.9 | 820 | 1180 | 24 | 25 | 24 | 25 | 0 | 0 |
|  Air 13.0<br> (M2/M3) | 13.0 | 1024 | 1366 | 24 | 25 | 24 | 25 | 0 | 0 |
|  Pro 11.0 | 11.0 | 834 | 1194 | 24 | 25 | 24 | 25 | 0 | 0 |
|  Pro 12.9 | 12.9 | 1024 | 1366 | 24 | 25 | 24 | 25 | 0 | 0 |
|  Pro 11.0<br> (M4) | 11.0 | 834 | 1210 | 24 | 25 | 24 | 25 | 0 | 0 |
|  Pro 13.0<br> (M4) | 13.0 | 1032 | 1376 | 24 | 25 | 24 | 25 | 0 | 0 |
【基本情報技術者】16進数を10進数に変換

16進数289,fffを10進数に変換

【解説】
16進数289,fffを10進数に変換する方法を説明したいと思います。

考え方として、
1桁目はそのまま
2桁目は16 * 値
3桁目は16 * 16 * 値
1桁目 + 2桁目 + 3桁目 = 10進数の値　となります。

この場合であれば、
1桁目の9はそのまま
2桁目は 16 * 8 = 128
3桁目は 16 * 16 * 2 = 512
9 + 128 + 512 = 649　が10進数の値となります.


fffの場合であれば、
15
16 * 15 = 240
16 * 16 * 15 = 3840
15 + 240 + 3840 = 4095　が10進数の値です.

ここで注意なのが16進数は0から始まっているため、
fに対応する10進数の値は15となります.
UbuntuにMySQL8.0をインストールする

# はじめに
すべては以下のエラーから始まりました。

```
System has not been booted with systemd as init system (PID 1). Can't operate.
```

ubuntuにmysqlをインストールしたかっただけなのに手順がややこしかったのでまとめます。

# 環境
- windows 10 Home
- Ubuntu 20.04
- wsl2

# ややこしくなった原因
### wsl2を使用していなかった
ubuntuではsystemctlが使えないらしく、使えるようにするためにはwsl2が必要でした。自分はwsl1を使っていたのでwsl2を導入する分手間が増えました。

### 実際にやった手順
- mysqlをインストール

mysqlは公式ホームページでインストール方法を調べてその手順通りインストールを行いました。
インストール方法が何個かありその中からUbuntu 20.04に対応した方法を探すのが手間だったので、自分が参考にしたURLを載せときます。
[Ubuntu 20.04 | MySQLインストールで参考にした記事](https://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/)
とりあえず手順３までやり以下のパッケージをインストールしました。
sudo apt install mysql-client-core-8.0

- wsl1 -> wsl2にする

以下の記事を参考にしました。
https://www.kkaneko.jp/tools/wsl/wsl2.html
https://docs.microsoft.com/en-us/windows/wsl/install-win10
この部分は手順が分かりやすくまとまっていて記事通りにやれば問題ありませんでした。
自分はもともとUbuntuを導入していたので、Ubuntuのインストール部分は手順を省略しました。

- wsl2でsystemctlを使えるようにする

以下の記事を参考にしました。
- https://shikiyura.com/2020/06/execute_systemctl_on_wsl2/
- https://github.com/arkane-systems/genie

一つ目の記事はsystemctlが使えない原因が書かれています。ここからwsl2でsystemctlを使えるようにするgenieというパッケージを知りました。
二つ目の記事はgenieのGitHubです。genieのインストール方法がREADMEに書かれています。依存関係があったためこの手順も簡単にまとめときます。

- genieのインストール

1. .NET SDKをインストールする
Ubuntu20.04の場合、以下の記事が参考になります。
[Ubuntu20.04 | .NET SDKをインストールする](https://docs.microsoft.com/ja-jp/dotnet/core/install/linux-ubuntu#2004-)

2. wsl-transdebianのインストール
https://arkane-systems.github.io/wsl-transdebian/

3. genieのインストール

```
$ sudo apt update
$ sudo apt install -y systemd-genie

// genieをインストール後以下のコマンドを実行

$ genie -s 
```

以上です。
Arduino 通信機能付き キット DKRK100900　第２回目 (WEBサーバーを作る)

## Lesson 1 make a web server
https://osoyoo.com/2019/10/25/arduino-ethernet-shield-iot-learning-kit-lesson-1-use-w5100-shield-to-make-a-web-server/#1
![4D0645B4-9F14-4469-B453-E7C06E009671.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488134/0ba4fe3f-f014-28fd-d150-6c2abe168513.png)

## 内容
ウェブサーバを作る

## 参考サイト
https://deviceplus.jp/hobby/entry_006/
このサイトがとてもわかりやすかった。

## 学んだこと
<code>Serial.println(data, format)</code>
コンソール的なものを　Ardunio IDEのツール シリアルモニターに表示させることができる。

## ハマったこと
１． IPが割り振られない 0.0.0.0になる。
→ 原因は接触不良。光っているからOKかと思ったが、しっかり差し込む必要があるようだ。
![IMG_20210206_200036.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488134/470832ed-965f-ac84-8247-c0395667f44c.jpeg)

２． MACアドレスが不明
→　他のサイトの情報だと、ボードにMACアドレスのシールが張っているようだが、私のボードにはなかった。初期のコードをままでも動くが、少し気持ち悪い。

## 感想
このボードがwebサーバになるのは、不思議な感じだ。
シンプルに動かせるLambda(Python)のローカル環境を5分で作ってみました

今回Lambda関数のテストをローカル環境でできないかなと調べていまして、Amazonが公式に公開しているdockerイメージ(aws-lambda-python)を使用すれば簡単に動かせるらしいということを知りました。

ただ、これを説明しているサイトだとイメージの作成、ポートの指定とかコマンド直打ちでやってるのが多くてめんどくさい(みんなバラバラのイメージ名、ポート番号だと正直めんどくさい)なあと思ったので、このあたりをdocker-composeで簡単かつ自動で動くようにしちゃおうというものです。

「aws-lambda-python 使い方」とか調べても出てこなかったので、参考にしていただければ幸いです。


## 環境

* Windows 10
* Docker for Windows
* Git Bash


## 前提

上記がすべてインストール済みであること。


## 今回のディレクトリ構成

```
proj/
  ├ app.py
  ├ docker-compose.yml
  └ Dockerfile
```


## 方法

app.pyに実行する内容を書きます。今回はシンプルに文字列を返すだけのものにしてます。

```python:app.py
def handler(event, context):
    return 'Hello World! from Lambda'
```

[Amazon公式ドキュメント](https://hub.docker.com/r/amazon/aws-lambda-python)に書いてある内容を貼り付けます。

```dockerfile:Dockerfile
FROM public.ecr.aws/lambda/python:3.8
COPY app.py ${LAMBDA_TASK_ROOT}
CMD [ "app.handler" ]
```

これで公式サイトに書いてある方法で実行できるのですが、正直2,3ステップ踏むのが面倒だなあと感じたのでこの先の手順を自動化します。

```yml:docker-compose.yml
version: "3.9"

services:
  lambda:
    build: .
    ports:
      - "9000:8080"
```


## 試してみる。

ここまでやったら準備は整ったので、いよいよ進めます。

今回のプロジェクトファイルのあるディレクトリで以下を実行。

```
$ docker-compose up -d
```

これだけで9000番ポートでLambdaを実行できるようになりました。

最後に確認してみます。

```
$ curl http://127.0.0.1:9000/2015-03-31/functions/function/invocations -s -d '{}'
"Hello World! from Lambda"
```

これ、windowsのコマンドプロンプトでやると以下のようなエラーが発生するので、気を付けてください。（なので、環境のところで敢えてGit Bashと書きました。）

```
{"errorMessage": "Unable to unmarshal input: Expecting value: line 1 column 1 (char 0)", "errorType": "Runtime.UnmarshalError", "stackTrace": []}
```

## 参考
* [Docker Hub | amazon/aws-lambda-python](https://hub.docker.com/r/amazon/aws-lambda-python)
* [Unable to unmarshal input: Expecting value: line 1 column 1 (char 0) · Issue #208 · lambci/docker-lambda · GitHub](https://github.com/lambci/docker-lambda/issues/208)
AWSのELB(Elastic Load Blancing)とは？

今回は、AWSのELB(Elastic Load Blancing)について学んだ事をアウトプットさせて頂きたいと思います。

##ELB(Elastic Load Blancing)の特徴

-  ロードバランサ-にはDNS名のアクセスポイントが付与されます。<br>=>アクセスポイントを一つにし、CPU使用量などを自動認知し全体の負荷を分散させることができます。

- ヘルスチェック機能があります。<br>=>異常なインスタンスを認識し、通信を自動でストップしてくれます。

- ELBに証明書を付与することでSSL通信の終端となります。<br>=>HTTPS通信を複合する処理を担います。こちらもう少し具体的に説明すると、HTTPS通信を取るためには証明書が必要なるが、無料で証明証をELBに設置ができるということになります。

###ELBの３種類

####・ALB(Application Load Balancer)
ALBはHTTPやHTTPSなどの通信時の負荷分散を行います。

####・NLB(Network Load Balancer)
NLBはTCP、TLS、UDPなどの通信時に負荷分散を行います。

####・CLB(Classic Load Blancer)
CLBは以前使用されていた古いタイプのELBなので、基本的にあえて使用する必要はないかと思います。

###まとめ
最後にELBを使用した構成図の画像を添付させて頂きたいと思います。
以下はPublicサブネットにはALBのみを設置し、Privateサブネットにフロントエンド用インスタンス2台×サーバーサイド用インスタンス２台、RDSでMasterとSlaveを２台用意したパターンです。インターネットの接続は基本的にALBで受けることで処理の効率化とセキュリティの安全性を高めています。フロントとサーバー間のAPI通信時の単一障害を防止するために、内部でNLBを使用しているイメージです。

(AWS Cloud Tech学習サービス参照 https://aws-cloud-tech.com/)
![ELB1.015.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930396/607be5b0-71da-ea97-fb0a-4b8f2fc4d48d.jpeg)


この記事はAWS初学者を導く体系的な動画学習サービス
「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com
Go: Firebase Auth のトークンの作成

```go:get_token.go
// ---------------------------------------------------------------
//
//	get_token.go
//
//				  Feb/06/2021
// ---------------------------------------------------------------
package main

import (
	"fmt"
	"os"
	"io/ioutil"
	"net/http"
	"net/url"
	"encoding/json"
	"github.com/joho/godotenv"
)

// ---------------------------------------------------------------
func main() {

	fmt.Fprintf (os.Stderr,"*** 開始 ***\n")
	email := os.Args[1]
	password := os.Args[2]
	fmt.Fprintf (os.Stderr,"email = " + email + "\n")
	fmt.Fprintf (os.Stderr,"password = " + password + "\n")

	err := godotenv.Load(".env")
	if err != nil {
		panic(err)
		}

	api_key := os.Getenv("API_KEY")

	url_target := "https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key=" + api_key
	args := url.Values{}
	args.Add("email",email)
	args.Add("password",password)
	args.Add("returnSecureToken", "True")
	res, err := http.PostForm(url_target,args)
	if err != nil {
		fmt.Println("Request error:", err)
		return
	}
	defer res.Body.Close()

	body, err := ioutil.ReadAll(res.Body)
	if err != nil {
		fmt.Println("Request error:", err)
		return
	}

	str_json := string(body)
	var unit_aa map[string]interface{}
	json.Unmarshal ([]byte(str_json), &unit_aa )

	token := unit_aa["idToken"]
	fmt.Println(token)

	fmt.Fprintf (os.Stderr,"*** 終了 ***\n")
}

// ---------------------------------------------------------------
```

```text:.env
API_KEY = "AIzaS....."
```

実行スクリプト

```bash
go run get_token.py ppp@example.com hello888 > token01.txt
go run get_token.py qqq@example.com hello999 > token02.txt
```

関連ページ
[Python3: Firebase Auth のトークンの作成](https://qiita.com/ekzemplaro/items/79b7caef66b5405db1f3)
【AWS】EC2の別アカウントへの移行方法（AMIの共有設定）


#はじめに
様々な理由でAWSリソースを別のAWSアカウントに移行したいという場面があるかと思います。
今回はAWSサービスの中でもよく利用されるEC2の別アカウントへの移行方法をご紹介します!

RDSの移行方法についてもご紹介しています。
・[【AWS】RDSの別アカウントへの移行方法（スナップショットの共有設定）](https://qiita.com/NaoyaOshiro/items/ed31a0e4f364c554379d)


#EC2移行方法
移行元のAWSアカウントでEC2 AMIを作成し、移行先のAWSアカウントに共有設定をし、共有されたAMIからEC2インスタンスを作成する方法をご紹介します。
手順にすると下記のようになります。


#移行手順
3ステップです。

1. 移行元のAWSアカウントでEC2 AMIを作成
2. 移行先のAWSアカウントにEC2 AMIを共有
3. 移行先のAWSアカウントで共有されたAMIからEC2インスタンスを作成


<h4>1. 移行元のAWSアカウントでEC2 AMIを作成</h4>
移行元のAWSアカウントで移行対象のEC2インスタンスを選択し、アクションから「イメージとテンプレート」→「イメージを作成」
![スクリーンショット 2021-02-06 18.47.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237056/1d0793cf-306f-8e8e-2c67-3c65fbacbb0b.png)

インスタンスIDが正しいことを確認「イメージ名」を記入し「イメージを作成」
![スクリーンショット 2021-02-06 18.48.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237056/51ee00ad-55aa-d2d9-5058-eac5d1432d2d.png)



<h4>2. 移行先のAWSアカウントにEC2 AMIを共有</h4>
対象のAMIを選択「アクセス許可タブ」から「編集」
※AMIの作成が完了していることを確認（ステータスがavailable）
![スクリーンショット 2021-02-06 19.24.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237056/1c9d8e82-aae5-a910-5fe2-4d6cbdcc3783.png)


移行先のAWSアカウント番号を入力し「アクセス許可の追加」保存
![スクリーンショット 2021-02-06 19.30.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237056/86ee7a3a-65a2-6f7b-f009-de1feaf0d62f.png)


<h4>3. 移行先のAWSアカウントで共有されたAMIからEC2インスタンスを作成</h4>
移行先のAWSアカウントでAMIから表示範囲が自己所有になっている場合は「プライベートイメージ」を選択
![スクリーンショット 2021-02-06 19.35.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237056/3b388216-2eb3-533c-83bf-1277a344a897.png)

共有設定したAMIが表示されるので、そのAMIから新しいEC2インスタンス作成すれば移行完了！
※念の為AMI IDや所有者が移行先のAWSアカウントIDと同じであることを確認。
![スクリーンショット 2021-02-06 19.36.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237056/8f9fb64f-0871-632c-db6d-d44453ad3311.png)


#注意事項
今回ご紹介した方法はあくまでもAMIの「共有」なので、移行元のAWSアカウントからAMIを削除すると共有先でもAMIは選択できないのでそこのところ注意が必要です。
【Swift】UITextFieldDelegate でキーボードの挙動を実装するサンプル

# 概要
`UITextFieldDelegate` を使ってキーボードを閉じたときの挙動を実装するサンプルです。

# 前提
言語 : Swift 5
開発環境 : Xcode 12

# サンプルコード
```swift:ViewController.swift
class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var searchTextField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    // searchTextField のデリゲートを ViewController が受け取る
        searchTextField.delegate = self
    }
    
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        searchTextField.endEditing(true)
        return true
    }
    
    func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
      if textField.text != "" {
        textField.placeholder = "Search"
        return true
      } else {
        textField.placeholder = "入力してください"
        return true
      }
    }
    
    func textFieldDidEndEditing(_ textField: UITextField) {
        if let text = searchTextField.text {
            print(text)
        }
        searchTextField.text = ""
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
            self.view.endEditing(true)
    }
}
```

## textFieldDidEndEditing
テキストフィールドの編集が停止したときにデリゲートに通知するメソッド。
サンプルコードでは、テキストフィールドの値を出力して入力を空欄に変更しています。

```swift

func textFieldDidEndEditing(_ textField: UITextField) {
// オプショナルバインディング
    if let text = searchTextField.text {
      print(text)
    }    
    searchTextField.text = ""
}
```

## textFieldShouldReturn
キーボードの `Return` をタップしたら呼ばれるメソッド。
呼ばれたらファーストレスポンダから解除し、キーボードを非表示にする役割を担っています。

```swift

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
// ファーストレスポンダから解除し、キーボードを非表示にする
    searchTextField.endEditing(true)
    return true
}
```

## textFieldShouldEndEditing
テキストフィールドの編集を停止するかデリゲートに問い合わせるメソッド。
ファーストレスポンダの状態を解除するように要求されたときに呼ばれています。
サンプルコードでは、テキストフィールドが空欄だった場合に `placeholder` の値を変更しています。

```swift

func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
// テキストフィールドが空欄じゃなかったら true
    if textField.text != "" {
      return true
    } else {
// テキストフィールドが空欄だったら placeholder を変更
      textField.placeholder = "入力してください"
      return true
    }
}
```
## touchesBegan
画面をタッチしたときに呼ばれるメソッド。
オーバーライドすることでイベントを検知できます。
サンプルコードでは、画面をタッチしたときにキーボードを閉じる役割を担っています。

```swift
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.view.endEditing(true)
}
```

# まとめ
似たようなメソッド名で混乱していましたが、調べてみるとそれぞれ呼ばれるタイミングや役割が異なっていることが分かってスッキリしました。
【Ubuntu 20.04】ホーム内のディレクトリ名を英語にする

# 前提
全体の設定を英語にするのが一番手っ取り早いです。

基本は日本語環境で使いたいけど、ディレクトリの名前を英語にしたい人向けの記事です。
# Ubuntuでホーム内のディレクトリを英語化する
Ubuntuをインストールするとき、日本語に設定するとディレクトリの中身が日本語になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135111/5445b19a-cc7d-2141-f6f7-793940ff502b.png)


ダウンロードやデスクトップなど、CLI環境で操作したいとき不便になる。

シェルで以下のコマンドを実行

```
$ LANG=C xdg-user-dirs-update --force
```

以下のコマンドですべて英語表記になっているか確認する。

```
$ cat .config/user-dirs.dirs
```
以下のように表示されればOK

```
# This file is written by xdg-user-dirs-update
# If you want to change or add directories, just edit the line you're
# interested in. All local changes will be retained on the next run.
# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped
# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an
# absolute path. No other format is supported.
# 
XDG_DESKTOP_DIR="$HOME/Desktop"
XDG_DOWNLOAD_DIR="$HOME/Downloads"
XDG_TEMPLATES_DIR="$HOME/Templates"
XDG_PUBLICSHARE_DIR="$HOME/Public"
XDG_DOCUMENTS_DIR="$HOME/Documents"
XDG_MUSIC_DIR="$HOME/Music"
XDG_PICTURES_DIR="$HOME/Pictures"
XDG_VIDEOS_DIR="$HOME/Videos"
```


ただ、このままだと元の日本語のディレクトリが残って「ダウンロード」「Downloads」のように2つが共存してしまうので、以下のコマンドで中身を移動し、日本語のディレクトリを削除する。

```
$ cd; mv デスクトップ/* Desktop; mv ダウンロード/* Downloads; mv テンプレート/* Templates; rm -rf テンプレート; mv 公開/* Public; mv ドキュメント/* Documents; mv ミュージック/* Music; mv ピクチャ/* Pictures; mv ビデオ/* Videos
$ rm -rf デスクトップ ダウンロード テンプレート 公開 ドキュメント ミュージック ピクチャ ビデオ
```

再起動し、ログインすると以下の画面が出てくるので、`次回から表示しない`にチェックを入れて

<u>**古い名前のままにする**</u>

を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135111/3948b4d6-2861-d9b2-3f69-00b887dd3f65.png)



## 参考
- https://qiita.com/matoken/items/1e43b4f446060f64afa1
- https://qiita.com/taiko19xx/items/d1a001bfc25245b91354
Arduino 通信機能付き キット DKRK100900　第１回目  (LEDを光らせる)

# Arduino入門
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488134/1fb99dcf-2268-58f8-c0ba-b7b0f9042abe.png)
購入した商品　3000円ぐらい
https://www.amazon.co.jp/OSOYOO-Arduino-%E7%89%A9%E4%BD%93%E3%81%AB%E9%80%9A%E4%BF%A1%E6%A9%9F%E8%83%BD%E3%82%92%E6%8C%81%E3%81%9F%E3%81%9B-%E3%83%A2%E3%83%8E%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88-%E9%96%8B%E7%99%BA%E9%9B%BB%E5%AD%90%E9%83%A8%E5%93%81%E3%82%AD%E3%83%83%E3%83%88/dp/B076H2D8WN

## Ardunioで遊んでみる
新しいことに挑戦しようということで、昔から気になっていたハードを勉強してみる。
きっかけは、「【フィットネスバイク】のインターネットを作る！！」　をみて、面白そうと思った。
https://qiita.com/ie4/items/130308793444bd98179f

37歳になったので、昔よりも新しいものへ挑戦が億劫になっていたが、ある本で「一生を２４時間に置き換える」考え方が紹介されていて、今の自分は１１時頃。そう考えると、昼前で、まだまだこれから。やって意味あるかなとか思わずに、興味を持ったことに挑戦してみる。

また、Amazonのレビューでもうまくいかないと指摘が多いので、備忘録を兼ねて、Qittaにサンプルを試したメモを残しておく。

## Arduino LED 点灯
### 内容
Ledを点灯させる

### 参考サイト
https://fabkura.gitbooks.io/arduino-docs/content/chapter5.html

### 学んだこと
<code>pinMode(数字, OUTPUT)</code>
ボードの数字の場所にエネルギーを出力する

GNDがグラウンドという意味で、マイナスを指す。
抵抗がないとledはこわれてしまう。

### ハマったこと
シリアルポートを間違えて選択してしまい、書き込みエラーが続いた。
→ Ardunio IDEのツール - シリアルポートで変更可能。

LEDが光らない
→ 接触不良が起きていたようで、指抜を何度かしたら解決

### 感想
LEDがついたときに、嬉しいと感じた！
点滅して光るだけで、なんにも役に立たないんだけどね。
！注意喚起！UPDATE文にはWHERE句をつけよう

### 背景

本日、テストデータを作成していた際にやらかしてしまったことを共有します。
検証環境だったのでまだなんとかりましたが、リカバリにかなり時間を使いました、

### 結論

__UPDATE__文、又は__DELETE__文には必ず__WHERE__句をつけよう。

当たり前と思う方もいるかもしれませんが大事です。

### 詳細

例えば

```sql
UPDATE user_master SET name = "イチロー";
```

これだけだとuser_masterに格納されている全員が"イチロー"さんになります。

更新したいレコードを指定する。

```sql
UPDATE user_master SET name="イチロー" WHERE name = "鈴木一郎";
```

ひたすら作業しているなかでWHERE = "イチロー"が完全に抜けました。(実際のテーブルはuser_masterではないです。)


以上。自分のような方が１人でも減ることを祈っております。
phpの型変換が難しくて混乱するので整理した（配列×boolean×if文）

もうずっとこれに翻弄されているので整理しようと思いました

PHPの自動的な型変換について
-
公式より
https://www.php.net/manual/ja/language.types.boolean.php#language.types.boolean.casting

>bool に明示的に変換を行うには、キャスト (bool) または (boolean) を使用します。しかし、演算子、関数、制御構造が bool 型の引数を必要とする場合には、値は自動的に変換されるため、 多くの場合はキャストは不要です。

基本的には明示的にわざわざキャストしたりしなくて良いということらしい。
キャストまではしないにしろ、if文とかで使うのに明示的に論理式などになっている方が好みなのに。
でも公式にこう書かれてしまうとやりづらい、、

困っていること
-
既存のコードで
・フレームワークの仕様により配列が無限に登場している
・配列がif文の条件に無限に使われており、PHPによる型変換の結果のbool値が使われるのではなく、isset()の結果のbool値が使われている
・isset()使った方がまだ分かりやすいけど、自動的な型変換の動きが理解できれば不要な気がする

isset()の挙動
-
https://www.php.net/manual/ja/function.isset.php
公式によると、変数がセットされ且つnullではない値になっている場合trueを返す。
また配列に関しては、キーが存在しない又はキーに紐づく値がNULLだとfalseを返し、それ以外はtrueを返すよう。

また、下記のように文字列のオフセットを取得する場合の結果は

```php
<?php
$expected_array_got_string = 'somestring';
var_dump(isset($expected_array_got_string['some_key']));
var_dump(isset($expected_array_got_string[0]));
var_dump(isset($expected_array_got_string['0']));
var_dump(isset($expected_array_got_string[0.5]));
var_dump(isset($expected_array_got_string['0.5']));
var_dump(isset($expected_array_got_string['0 Mostel']));
?>
```
これとの事。integerと文字列0の場合だけオフセット可能なように変換してくれるらしい。
このオフセットと自動変換の挙動に頼る事ないコードを書きたいとしか思えない。

```php
bool(false)
bool(true)
bool(true)
bool(true)
bool(false)
bool(false)
```

配列×if文×型の自動変換の組み合わせのコードを掘り下げる
-
こんなコードがある

```php
$test = $this->request->getData('test.data');
if (isset($test)){
  //処理
}
```
これだとisset（）の挙動により、指定の配列の値がnullならfalseを返してくるという事でまず間違いない。
次に、issetを使用せず変数となっている配列の値から型の自動変換が行われる事を前提に、下記のようなコードに変更してみた

```php
$test = $this->request->getData('test.data');
if ($test){
  //処理
}
```
見た目はこちらの方がスマートである。
でも何しでかすかわからない不安があって今まではどうしてもisset使いたくなってしまっていたけど、今日はちゃんと公式で確認。

>bool に変換する場合、次の値は false とみなされます。
boolean の false
integer の 0 および -0 (ゼロ)
float の 0.0 および -0.0 (ゼロ)
空の文字列、 および文字列の "0"
要素の数がゼロである 配列
特別な値 NULL (値がセットされていない変数を含む)
属性がない空要素から作成された SimpleXML オブジェクト。つまり、子要素も属性もない要素です。

指定の配列の値（要素）がゼロ、又は値がNULL、又は値がセットされていない変数の場合falseを返してくれるよう。
ここまでわかればisset消しても大丈夫そうだな。型変換理解している風を装って消そう。
（でもなんとなく使いたい気持ちになる明示的じゃないと不安になる病）

おまけ
-
変数を使わなくてもいける
でもif文以降も同じ配列の値を使うなら、変数使った方がすっきりする
（既存のコードでもisset使われてたから、PHPの自動的な型変換に不安を覚える人は多いのかもしれない）

```php
if ($this->request->getData('test.data')){
  //処理
}
```