OmniAICreator/Qiita-1.07M huggingface dataset:
iOS14でtrackingAuthorizationStatusのメモ

## 環境

- Xcode12.3
- iOS 14.2 iPhone SE

### 条件

1. 端末： 設定＞プライバシー＞トラッキング＞Appからのトラッキング要求を許可
![IMG_9760666317E9-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228438/c13c40fa-d467-b982-842d-2794bf5718aa.jpeg)
2. アプリ: トラッキング要求ダイアログ
![IMG_2264.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228438/66170766-c216-0dec-b4ea-0c08ad3afd61.png)

## トラッキング要求の動き

|端末|トラッキング要求|アプリ|status|
|:-:|:-:|:-:|:-:|
|許可|未|-|notDetermined|
||済|許可|authorized|
|||拒否|denied|
|拒否|未|-|denied|
||済|許可|denied|
|||拒否|denied|

想定通り。
トラッキング要求を出していない状態で、端末設定を拒否から許可に戻すとちゃんとnotDeterminedに戻ります

## トラッキング要求を許可後の動き

アプリでトラッキング要求を許可した後に端末設定を拒否にした場合、こんなダイアログが出てくる
トラッキング要求をしていない場合や拒否した場合はダイアログがでない
![IMG_729819AB963E-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228438/48923df8-7274-b4b7-d1a0-4958a12f532f.jpeg)

「Appがトラッキングを続けることを許可する」を選ぶと、こんな画面なので端末で拒否しても取れるのかなと思ったらそんなことはなかった。
![IMG_6D17ED26E52E-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228438/b9745e07-2967-319e-2d10-c2e2bb53a367.jpeg)

再表示するとちゃんとオフになっています
![IMG_8F6BE63E2509-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228438/57901c77-4c02-b4f1-7007-825dbd9b5dd0.jpeg)

端末設定で再許可時のstatusをそのままにしてくれる動きのようです

|ダイアログ|status|端末設定で再許可時のstatus|
|:-:|:-:|:-:|
|Appがトラッキングを続けることを許可する|denied|authorized|
|「Appにトラッキングの停止を要求」|denied|denied|

---

## 端末拒否時のトラッキング要求の動き

また、端末で拒否時にトラッキング要求をするとdeniedが設定されて端末設定を許可に戻してもdeniedのままになります。
トラッキング要求を出していなければnotDeterminedに戻ります

### 端末拒否時

|トラッキング要求|status|端末許可に変更後のstatus|
|:-:|:-:|:-:|
|未|denied|notDetermined|
|済|denied|denied|
PHPのSJIS系文字エンコーディングとエイリアスを表にまとめてみた

# はじめに
※ 本記事ではShift_JISを拡張した文字エンコーディングを**SJIS系文字エンコーディング**と記載しています。

Shift_JIS、Shift-JIS、SJIS、SJIS-win、CP932、MS932、Windows-31J、MS_Kanjiなどなど、、、
SJIS系文字エンコーディングってたくさんありますよね。
「Shift_JISでcsv下さい」って言われたからShift_JISに変換したら「髙」が〜「ハイフン」が〜と言われたことある方は少なくないと思います。

[サポートされる文字エンコーディング](https://www.php.net/manual/ja/mbstring.supported-encodings.php)に記載されている中でよく使用するSJIS系文字エンコーディングは、SJIS、SJIS-win、CP932の3種類だと思います。

[サポートされるエンコーディングの概要](https://www.php.net/manual/ja/mbstring.encodings.php)のShift_JISの説明と注記に「IANA の定義によると、Shift_JIS のコードセットは IBM932 / CP932 とは微妙に異なります。」「CP932 コードマップを使用するには、代わりに SJIS-WIN を使用してください。」と記載されているため今までこのように考えていたんですが、実際は少し違うようです。

エンコーディング名|間違った解釈
:--|:--
SJIS|Shift_JIS
CP932|Windows-31J?
SJIS-win|NEC拡張のCP932?

しかも[サポートされる文字エンコーディング](https://www.php.net/manual/ja/mbstring.supported-encodings.php)に記載されていない文字エンコーディングでも実際には指定することができます。
下記は全てError、Warning、Noticeが出ることなく変換できます。

```php
<?php
mb_convert_encoding('テスト', 'SJIS');
mb_convert_encoding('テスト', 'SHIFT-JIS');
mb_convert_encoding('テスト', 'Shift_JIS');
mb_convert_encoding('テスト', 'CP932');
mb_convert_encoding('テスト', 'MS932');
mb_convert_encoding('テスト', 'MS_Kanji');
mb_convert_encoding('テスト', 'Windows-31J');
mb_convert_encoding('テスト', 'SJIS-win');
```

どれが同じでどれが違う文字エンコーディングなのか、、、
このモヤモヤを解消するため、ソースコードを読んで表にまとめてみました。

# エンコーディングとエイリアスの表
mime_nameがShift_JISで登録されている文字エンコーディングを全て羅列しています。

エンコーディング名|エイリアス
:--|:--|:--
SJIS|x-sjis, SHIFT-JIS
CP932|MS932, Windows-31J, MS_Kanji
SJIS-win|SJIS-open, SJIS-ms
SJIS-2004|SJIS2004, Shift_JIS-2004
SJIS-mac|MacJapanese, x-Mac-Japanese
SJIS-Mobile#DOCOMO|SJIS-DOCOMO, shift_jis-imode, x-sjis-emoji-docomo
SJIS-Mobile#KDDI|SJIS-KDDI, shift_jis-kddi, x-sjis-emoji-kddi
SJIS-Mobile#SOFTBANK|SJIS-SOFTBANK, shift_jis-softbank, x-sjis-emoji-softbank

エイリアスにShift_JISが登録されている文字エンコーディングはなかったんですが、実際にファイル出力してみたところSJISと同じっぽいです。
UTF-8環境で実行しているためか、CP932とSJIS-winで文字化けする文字に違いはありませんでした。

```php
$file = fopen('test.txt', 'w');
fwrite($file, mb_convert_encoding("髙閒ー−-㌢㏍㍿\n", 'SJIS')); #=> ??ー－-???
fwrite($file, mb_convert_encoding("髙閒ー−-㌢㏍㍿\n", 'SHIFT-JIS')); #=> ??ー－-???
fwrite($file, mb_convert_encoding("髙閒ー−-㌢㏍㍿\n", 'Shift_JIS')); #=> ??ー－-???
fwrite($file, mb_convert_encoding("髙閒ー−-㌢㏍㍿\n", 'CP932')); #=> 髙閒ー－-㌢㏍?
fwrite($file, mb_convert_encoding("髙閒ー−-㌢㏍㍿\n", 'MS932')); #=> 髙閒ー－-㌢㏍?
fwrite($file, mb_convert_encoding("髙閒ー−-㌢㏍㍿\n", 'SJIS-win')); #=> 髙閒ー－-㌢㏍?
fwrite($file, mb_convert_encoding("髙閒ー−-㌢㏍㍿\n", 'Windows-31J')); #=> 髙閒ー－-㌢㏍?
fwrite($file, mb_convert_encoding("髙閒ー−-㌢㏍㍿\n", 'MS_Kanji')); #=> 髙閒ー－-㌢㏍?
fclose($file);
```

# まとめ
UTF-8からの変換であれば、SJIS or CP932の２択で良さそうです。
Shift_JISのエイリアスであるはずのMS_Kanjiが、PHPではCP932のエイリアスとして登録されているのは不思議な感じがしました。

結局SJIS-winが何を指しているのかはよくわかりませんでした。
そのうち「依存する文字集合」を確認して追記しようと思います。
navigation (move_base) でロボットが一時停止を繰り返す

navigation (move_base) を動かしていると、設定速度を上げるとロボットが一時停止→移動をこまめに繰り返すようになった（低速のときは問題なかった）。
そのときに出力されていたエラーが以下のもの。



```
[ERROR] [1609950201.266020807]: Extrapolation Error: Lookup would require extrapolation into the future.  Requested time 1609950201.261970043 but the latest data is at time 1609950201.165888008, when looking up transform from frame [odom] to frame [map]
```

どうやらtfの[map]→[odom]の更新したときのタイムスタンプがおかしいらしい。


# 原因

navigationでは[map]→[odom]のtfはamclで更新している。
調べてみると、やはりamclの方に問題があったようだ。

速度を上げると（位置の分散が大きくなるため）amclのパーティクル数が増え、処理時間が増えたことでタイムスタンプの更新が遅くなり、その結果としてタイムスタンプが遅れてしまったらしい。


# 対策

amclのパラメータである"max_particles"を下げることで解決できる(amcl.launchを使っている場合はその中にmax_particlesが記載されているあはずです)。
私は"min_particles"を500、"max_particles"を600程度にすることで一時停止することなく移動できるようになった。

なお、もし低速でも同じエラーが出る場合は"min_particles"の設定値も下げると解決できる可能性がある。

※ min_particlesとmax_particlesはモンテカルロフィルタの粒子数です。これを減らすと位置推定の精度やロバスト性が下がる可能性があるため、下げすぎないことをおすすめします。
煉獄杏寿郎にLGTMをしてもらうと安心できる

## PullRequest 
PullRequest 出す方も、みる方も大変ですよね。
忙しい時とか、本当辛いです
ついつい攻撃的になってしまう時もあります。

Approve してもらわなくて萎えてませんか。


## 煉獄杏寿郎にLGTMをしてさくっとマージすると気持ちいい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5565/f410543d-40e3-eb24-8eae-87d6a52081b8.png)

この画像をはると胸をはってマージできます。
不思議です。

心が燃えてきます。

以上、深夜テンションのくだらない記事でした。
WSL2+Ubuntu20.04へのRubyインストール

個人的なメモ

## 必要なライブラリのインストール
```bash
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install -y autoconf bison build-essential libssl-dev libyaml-dev libreadline-dev zlib1g zlib1g-dev imagemagick git
sudo apt-get install -y nodejs npm
sudo apt-get install -y sqlite3 libsqlite3-dev
sudo apt-get install -y libmariadb-dev
sudo apt-get install -y libmysqlclient-dev
```

## yarnのインストール
```bash
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt-get update
sudo apt-get install yarn -y
```

## Rubyをインストール
```bash
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo '[ -f "$HOME/.profile" ] && source "$HOME/.profile"' >> ~/.bash_profile
echo '[ -f "$HOME/.bashrc" ] && source "$HOME/.bashrc"' >> ~/.bash_profile
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
source ~/.bash_profile
```

```bash
~/.rbenv/bin/rbenv init
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
```

### 確認
```bash
rbenv -v
```

### ruby-build をインストール
```bash
mkdir -p "$(rbenv root)"/plugins
git clone https://github.com/sstephenson/ruby-build.git "$(rbenv root)"/plugins/ruby-build
```

### rubyをインストール
```bash
rbenv install -l
rbenv install 2.6.6
```

### インストールしたrubyの確認
```bash
rbenv global 2.6.6
ruby -v
```

### ドライブのマウント設定
```bash
sudo tee /etc/wsl.conf <<EOF >/dev/null
[automount]
options = "metadata"
EOF
```

> ~~echo 'export PATH="$(echo "$PATH" | sed -r -e '"'"'s;:/mnt/[^:]+;;g'"'"')"' >> ~/.bash_profile~~
~~source ~/.bash_profile~~
>
> ただし、上記を行うと、VS CodeなどのPATHも変更されてしまう。。。
> ### 参考
WSL の Ubuntu コンソールで Insecure world writable dir... という警告が出る件
https://www.oiax.jp/books/insecure_world_writable_dir.html


### 設定を有効にする為にWindowsを再起動する

### bundleのインストール
```bash
gem install bundle
```
AWS GuardDuty 概要

# 概要

※この記事は目下記載中です
AWS のセキュリティ周り、特に GuardDuty の位置づけを理解するためにざっと調べた内容をまとめ。
まず、GuardDuty およびその周辺の AWS リソースの関連は以下のようなイメージ。

![AWS.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9128/b81bb842-b472-83b9-0115-ba73100cb3b8.jpeg)

## 用語補足

| 用語 | 説明 |
|:-----|:-----|
|Data source|GuardDutyが解析するデータの発生源 (Cloud Trail、VPCフローログ、DNSログなど)|
|Finding|GuardDutyが検知したセキュリティ問題の兆候. いくつかのFinding typesがプリセットされている（[参考](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-active.html)）CloudWatch Eventを通しても確認でき、GuardDutyからCloudWatchへはHTTPSでFindingsを送信します
|AWS Security Hub||
|AWS Config      ||

※続き記載中...
Ubuntu20.04 の日本語化

個人的なメモ
ネタ元はここ

https://www.atmarkit.co.jp/ait/articles/1806/28/news043.html

# 1．パッケージ情報の更新
```shell
sudo apt update
sudo apt upgrade -y
```

# 2．日本語言語パックのインストール
```shell
sudo apt -y install language-pack-ja
```

# 3．ロケールを日本語に設定
```shell
sudo update-locale LANG=ja_JP.UTF8
```

# 4．ここでいったん終了してから、Ubuntuを再起動

# 5．タイムゾーンをJSTに設定
```shell
sudo dpkg-reconfigure --frontend noninteractive tzdata
```

# 6．日本語マニュアルのインストール
```shell
sudo apt -y install manpages-ja manpages-ja-dev
```

# 7．ツールのインストール
```shell
sudo apt -y install net-tools zip htop tree jq
```
Rails on Tiles（どう書く）

http://nabetani.sakura.ne.jp/hena/ord5railsontiles/

与えられたタイルのレールに沿って移動するとき、範囲外にはみ出てしまうまでのルートを求める問題です。

```ruby:Ruby
module RailsOnTiles
  Tiles = [[2, 3, 0, 1], [1, 0, 3, 2], [3, 2, 1, 0]]
  Dirs = [[0, -1], [1, 0], [0, 1], [-1, 0]]
  module_function
  
  def go(input)
    field = input.chars.map(&:to_i).each_slice(3).to_a
    solve(field).map { |i| ("A".."I").to_a[i] }.join
  end
  
  def solve(field, x=1, y=-1, dir=2, route=[])
    dx, dy = Dirs[dir]
    x += dx
    y += dy
    return route if x < 0 || x > 2 || y < 0 || y > 2
    rev = Tiles[0][dir]
    nxt = Tiles[field[y][x]][rev]
    tile_num = y * 3 + x
    solve(field, x, y, nxt, route + [tile_num])
  end
end


if __FILE__ == $0
  require 'minitest/autorun'
  describe 'RailsOnTiles' do
    [
      ["101221102", "BEDGHIFEH"],
      ["000000000", "BEH"],
      ["111111111", "BCF"],
      ["222222222", "BAD"],
      ["000211112", "BEFIHEDGH"],
      ["221011102", "BADGHIFEBCF"],
      ["201100112", "BEHIFCBADEF"],
      ["000111222", "BEFIH"],
      ["012012012", "BC"],
      ["201120111", "BEDABCFI"],
      ["220111122", "BADEHGD"],
      ["221011022", "BADG"],
      ["111000112", "BCFIHEBA"],
      ["001211001", "BEFI"],
      ["111222012", "BCFEHIF"],
      ["220111211", "BADEHI"],
      ["211212212", "BCFEBAD"],
      ["002112210", "BEFC"],
      ["001010221", "BEF"],
      ["100211002", "BEFIHG"],
      ["201212121", "BEFCBAD"]
    ].each do |input, expect|
      it input do
        assert_equal RailsOnTiles.go(input), expect 
      end
    end
  end
end
```

`field`はタイルの配置を表していて、タイルの種類は`Tiles`に格納してあります。方向の種類は、0,1,2,3 がそれぞれ上右下左を表します。前のタイルから下へ行けば、次のタイルでは上から来るという具合に「反転」するので、それが`rev`に入ります。あとは、`field`を外れるまで再帰し、結果を返します。

なお、道すじ`route`はタイルの位置を数字で表しているので、最後にアルファベットに変換しています。
laravel を vagrant 上にインストール

# laravel を vagrant 上にインストール

```bash
composer global require laravel/installer
export PATH=$PATH:$HOME/.config/composer/vendor/bin    
```

#プロジェクトの作成
`laravel new laravelapp`
`composer create-project laravel/laravel laravelapp -prefwe-dist`
`composer create-project laravel/laravel6 laravelapp -prefwe-dist`
BRICSBuildによる分子構造生成

# はじめに
BRICSによって生成したフラグメントを組み合わせることで新しい分子構造を生成する。([BRICSについて](https://chemoinformatics.hatenablog.com/entry/2021/01/06/132925))　生成した分子群（仮想分子ライブラリー）は逆解析時の候補分子として利用可能。
このような構造生成器を Building blockタイプと呼ばれる。このタイプは化学構造としては妥当なものを生成しやすいことが長所。

水溶解度データ（[金子研究室HPのデータセット](https://datachemeng.com/pythonassignment/)）に含まれる1290分子の構造をフラグメント化し構造生成に利用する。

# 前準備

###モジュールのインストール

```
conda install -c conda-forge rdkit
```

# コード

### モジュールのインポート

```python
import numpy as np
from rdkit import rdBase, Chem
from rdkit.Chem import AllChem, Draw, BRICS, Recap, Descriptors
from rdkit.ML.Descriptors import MoleculeDescriptors
```

### フラグメントの準備
水溶解度データ（[金子研究室HPのデータセット](https://datachemeng.com/pythonassignment/)）に含まれる1290分子の構造をフラグメント化する。
複雑な構造（分子量300以上）のフラグメントは削除する。

```python
suppl = Chem.SDMolSupplier('logSdataset1290_2d.sdf')
mols_list = [mol for mol in suppl if mol is not None]

###１290分子を分解してフラグメントを準備する
fragment_set = set()
for mol in mols_list:
    fragment = BRICS.BRICSDecompose(mol)
    fragment_set = fragment_set | fragment

fragment_smiles = list(fragment_set)
fragment_list = np.array([Chem.MolFromSmiles(smiles) for smiles in fragment_smiles])

#複雑なフラグメント（分子量300以上）は削除する
descriptor_calc = MoleculeDescriptors.MolecularDescriptorCalculator(['MolWt'])
MolWt_list = np.array([descriptor_calc.CalcDescriptors(mol)[0] for mol in fragment_list])

fragment_list = np.array(fragment_list)[np.where(MolWt_list<=300)]

#先頭6フラグメントだけ描画してみる
img = Draw.MolsToGridImage(fragment_list[:3], molsPerRow=3,legends=fragment_smiles[:3])
img.save('fragment_BRICS.png')
img
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348376/45fd1bb9-5df2-00aa-0c10-62d890b01702.png)
  

### BRICSBuildを用いた分子生成

```python
### smilesをMOLオブジェクトに変換し，ジェネレーターを作成
builder = BRICS.BRICSBuild(fragment_list)

### 分子2000個を作成し，シャッフル
generated_mols = [next(builder) for x in range(2000)]

#返された分子はサニタイズされていない（＝整えられていない？）ので、原子価を更新した方がよいとのこと。
for mol in generated_mols:
    mol.UpdatePropertyCache(strict=True)
    
#25分子だけ描画してみる
np.random.shuffle(generated_mols)
img = Draw.MolsToGridImage(generated_mols[:25], molsPerRow=5)
img.save('generated_mols.png')
img
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348376/fed5ee13-45e8-baf7-e347-319c32bdb3a7.png)


#参考
- [RDKitでBRICSを用いた仮想ライブラリーの構築（化学の新しいカタチ）](https://future-chem.com/rdkit-brics/)
MacのM1搭載機でもnpmでElmをインストールしたい

[Elm-jpのDiscord](https://discordapp.com/invite/4j2MxCg)で質問がありました。
work aroundが分かったので記録しておきます。
![Screenshot at 2021-01-07 01-13-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16345/972d3936-7cfd-c2f6-bd1d-1bf3fc3b4311.png)

M1チップを採用したMacにおいて、npmでElmをインストールしようとすると下記のエラーがでるそうです。

```
Error: No binaries are available for your platform: darwin-arm64
```

実はこの問題はすでにElmコンパイラーのリポジトリーで[PR](https://github.com/elm/compiler/pull/2156)が作成されています。
でもElmは[レイテンシーよりスループットを重視した開発方針](https://qiita.com/arowM/items/dfb38d1c5f3dfde8b8bf#%E5%85%AC%E5%BC%8F%E3%83%AC%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E5%AF%BE%E5%BF%9C%E3%81%AE%E9%81%85%E3%81%95%E3%82%92%E6%B0%97%E3%81%AB%E3%81%99%E3%82%8B%E4%BA%BA%E3%81%AB%E3%81%AF%E3%82%AA%E3%82%B9%E3%82%B9%E3%83%A1%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84)を取っています。いつになったらこれがマージされるか分かりません。

そこで、当該PRの内容を元に簡単にnpm installできるようにしたリポジトリーを作成しました。

```bash
npm i arowM/elm-npm-install-x64-on-M1
```

`npm i elm`の代わりにこのコマンドを使うことでインストールが成功します。この手法ならその他の環境でも`npm i elm`と同様にElmコンパイラーがインストールされます。これなら[elmをnpmでローカルインストールして開発者間でバージョンを合わせる方法](https://qiita.com/arowM/items/ed3112a77fa3ca2355d8)が使えるので便利です。

なお、M1チップを使ったマシンでもエラーが起きないことがあるそうです。
![Screenshot at 2021-01-07 01-14-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16345/e2fc18e9-3712-4247-92ff-eb602fde114c.png)

ぶめぇ

# 追記

公式が対応して最新のnpmパッケージがM1に対応しました。
NOTE:ブクマカはどのくらいの割合でファクトチェックをして{いる|いない}のか

## 動機

はてなブックマークで[こういう「タメになったねぇ～！」って画像ください！！！！！:哲学ニュースnwk](http://blog.livedoor.jp/nwknews/archives/5731190.html)がホッテントリになっていた。

記事を読んで、浅学非才な私でも一部の内容に間違いがあることは気付いたが、誤りを指摘しているブクマが少ない印象を受けた。

なぜそのような印象を受けたのかを考えた結果、はてなブックマークはファクトチェックに厳しいという先入観がある気がしたので、この先入観が正しいか検証したい。

## TL;DR

ファクトチェックしている:ファクトチェックしていない = 4:6

四捨五入して、おおむね上記の割合だったので正しくなかった。

## 検証の流れ

1. はてなブックマークエントリー情報を取得する
2. 取得した情報をMySQLに保存する
3. SQLで集計する

## はてなブックマークエントリー情報を取得する

集計中に集計対象のデータが更新されないことを担保するために、[はてなブックマークエントリー情報取得API](http://developer.hatena.ne.jp/ja/documents/bookmark/apis/getinfo)を利用してJSON形式で情報を取得し、ファイルに保存する。

```sh
curl https://b.hatena.ne.jp/entry/json/http://blog.livedoor.jp/nwknews/archives/5731190.html | jq '.bookmarks | length' > bookmarks.json
```

ドキュメントにも記載の通り常に最新のデータが返ってくる訳ではないので、調査時点の最新件数は645件だったがAPI経由では442件しか取得できなかった。

> JSON データはキャッシュを利用しているため、実際のエントリーの内容と異なる場合があります。ご了承ください。

最新情報を取得する方法が見つからなかったので、今回は442件を対象に集計する。

## 取得した情報をMySQLに保存する

`jq`コマンドで集計したかったが、クエリの書き方の学習に時間がかかりそうだったので、外部サービスを利用してSQLに変換し、MySQLにINSERTした。

## SQLで集計する

集計では以下の4パターンに分類した。

1. ファクトチェックをしているらしいエントリー
    - 内容が正しいコメント（信頼性の高いソースが見つかった内容は正しいと判断）
    - 「ググったら」などファクトチェックをしたことがわかるようなコメント
2. ファクトチェックをしているか、してないかわからない・ファクトに関係ないエントリー（感想など）
3. ファクトチェックをしていないらしいエントリー
    - 誤った内容を前提としたコメント
    - 誤った内容を信頼していると受け取れるコメント
4. コメントのないエントリー

主観に基づかない分類方法がわからないので止むを得ず主観に基づく。

分類した結果を以下の通り集計する。

| No. | 指標 | 計算 |
| :-- | :-- | :-- |
| ① | ブクマ総数 | 442件（調査時点） |
| ② | 無言ブクマの件数 | `comment`カラムが`NULL`のデータ件数 |
| ③ | ちゃんとファクトチェックをするブクマカの割合(%) | 分類1のエントリー件数 / (① - ②) * 100 |
| ④ | ファクトチェックをしていないブクマカの割合(%) | 分類3のエントリー件数 / (① - ②) * 100 |

### 結果

- ①: 442件
- ②: 380件
- ③: 9件 / 62件 * 100 = 14.5161290323%
- ④: 14件 / 62件 * 100 = 22.5806451613%

#### その他

`62.9032258065%`はネタ・感想・質問・関係のないコメントだった。

## 感想

- APIのレスポンスがJSONとはいえページング（スライス？）的な事してないのが意外だった
    - バズってもエントリーの数が2000件行くことが少ないため、APIでのページングは不要という設計と推測
- はてなブックマークの仕様を気にした事はなかったが、[エントリー詳細ページ](https://b.hatena.ne.jp/entry/blog.livedoor.jp/nwknews/archives/5731190.html)に表示されてるコメント数が正しかったので必要以上に時間をかけてしまった気がする
- 結果的にファクトチェックをしていない人の方が若干多かったが、私の先入観は間違っていたと言えそうだ
    - 間違った先入観を払拭できて良かった
- 分類・集計方法が正しいか自信がない、分類学・統計学について学習の必要がありそうだ
- データは「誰のどのようなコメントを私がどう評価したか」がわかるため、コミュニティガイドラインに則って非公開にしておく
VPCのDNSについて

## 勉強前イメージ

VPCでDNSの設定があるの？
設定しないと繋げないとかなんとか？

## 調査

### VPCのDNSについて

以下の画像のように、VPCの設定でDNSに関する設定が以下になります。
それを今回は詳細確認していきたいと思います。

- DNS解決(DNS Resolution)
- DNSホスト名(DNS Hostname)
- DHCPオプションセット(DHCP Options Sets)

![VPCの設定お使いの VPC _ VPC Management Console - Google Chrome .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/c158f5fb-cf88-3071-5f60-f5ffa4738435.png)

### DNS解決(DNS Resolution)

プライベートホストゾーンに必須の設定になり、VPCのAmazon DNS サーバーはプライベートホストゾーンで指定する DNS ドメイン名を解決するために使用されます。
これを有効化にしていないと、プライベートホストゾーンで名前解決が出来ません。


![DNS解決VPC Management Console - Google Chrome 2021-01-04 .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/209b227a-265b-4a2f-156f-f0706e988d63.png)


### DNSホスト名(DNS Hostname)

こちらもDNS解決(DNS Resolution)と同様にプライベートホストゾーンに必須の設定になり、効にすることなくドメインのプライベートホストゾーンを作成しこのゾーンにレコードを作成すると、プライベートホストゾーンは有効になりません。
デフォルトで無効になっていて、プライベートホストゾーンを使用するにはこのオプションを有効にする必要があります。



![ホスト名VPC Management Console - Google Chrome 2021-01-04 .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/a48d0807-6208-74fa-6558-20084086c55c.png)


### DHCPオプションセット(DHCP Options Sets)

DHCPのオプションに関するパラメータ(DNSサーバやドメイン名など)を指定する項目です。
パラメータを設定した `DHCP Options Sets` をVPCに紐付けることで設定できます。

![DHCPオプションセットVPC Management Console - Google Chrome 2021-01-04 .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/b5ca023a-5d23-7463-12cc-9efb5ad66ff3.png)


## 勉強後イメージ

内部のプライベートネットワークの話だった。
デフォルトVPCと新しく作ったVPCで色々違うからみすりそう・・

## 参考

- [DHCP オプションセット](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_DHCP_Options.html)
- [【基礎から学ぶ】VPCのDNSについてまとめてみた](https://blog.serverworks.co.jp/tech/2017/04/03/vpc-dns-matome/)
- [プライベートホストゾーンを使用するにはどの Amazon VPC オプションを有効にすればよいですか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/vpc-enable-private-hosted-zone/)
[Unity]  Prime31(ios)でのandroidのビルドエラー

# 状況
UnityにPrime13(iOS : Etcetera Plugin)を追加した。
iosでのビルドは問題なくできたが、androidのビルド時にエラーが起きた

# エラー内容
> What went wrong:
>
> Execution failed for task ':launcher:processReleaseResources'.
>
> Android resource linking failed
>
> /Users/ユーザー名/Desktop/Unity/プロジェクト名/Temp/gradleOut/launcher/build/intermediates/merged_manifests/release/AndroidManifest.xml:52: AAPT: error: unexpected element <uses-permission> found in <manifest><application>.

# 解決法
プロジェクトファイル内の `AndroidManifest.xml` のコードを変えた

```(変更前)AndroidManifest.xml
<manifest>
  <application android:label="@string/app_name" android:hasCode="false" android:debuggable="false">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    ...
  </application>
</manifest>
```

```(変更後)AndroidManifest.xml
<manifest>
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <application android:label="@string/app_name" android:hasCode="false" android:debuggable="false">
    ...
  </application>
</manifest>
```

# 注意点
`プロジェクト名/Assets/Plugins/Android/AndroidManifest.xml` 
`AndroidManifest.xml` のファイルを変更する。
エラーログにあるパスの`AndroidManifest.xml`ファイルを変更してもビルド時に元通りになってしまう。

# 似たビルドエラー
[【Unity】Androidビルドでエラー"maxAspectRatio not found"](https://eorf.hatenablog.com/entry/2020/02/10/040831)
アドベントカレンダー32日目：SREを読んでみた「オンコール対応」編③

オンコール対応の3回目です。
オンコール対応の最後の回になります。最後は、オンコール対応の負荷が増え過ぎた場合についてを見ていきます。

## 不適切な運用負荷の回避

SREは作業の50%をエンジニアリングに当て、残りの50%で運用を行います。
運用作業の過負荷を避ける目標を数値化するために、過負荷の兆候を計測できる形にしておくことが重要です。（日々のチケット数を5以下に抑えるやシフトごとのページ発生イベントを2以下にするなど）

システムのアラートは、SLOを脅かす症状に対して、行うべきです。
細かいアラートは、それを対応するエンジニアの生産性を下げたり、より重要なアラートへの注意を散漫にします。

また、一つのインシデントに対して、複数のアラートが発行されることがありますが、これはできるだけインシデントとアラートの関係が1対1になるように調整すべきです。
この理由は、関連のあるアラートが複数発行されると、そのアラートの切り分けに時間が費やされたりしてしまい、インシデントへ集中しづらくなるからです。
アラートを関連性によって、まとめて、必要のないアラートは発行されないようにすべきです。

運用の過負荷は、モニタリングの設定によるものだけではなく、開発チームにより、信頼性の低下をもたらすような修正がなされたときにもおきます。
運用の負荷がかかり過ぎている場合、極端なケースでは、SREチームにおいて、運用が行えるレベルになるまで、開発チームへオンコールの対応を行ってもらえるように交渉することもできます。

### 油断ならない敵：低すぎる運用負荷
運用チームへのアラートが少なく、長期間プロダクトとのかかわりがないと、自信に関する問題が生じます。それは自信過剰か自信喪失どちらもあり得ますが、いずれにしてもインシデント対応が起きたときはじめて、知識のギャップを知ることになります。
四半期に1回か2回はオンコール対応をして、プロダクトに触れる機会を作るべきです。
また、Googleでは年に一回DiRT（Disaster Recovery Training）を全社規模で行っています。

## まとめ
* 無用な負荷を増やさないためにアラートの設定は適切（SLOに影響を与えるもの）に設定する。
* プロダクトに触れる機会を四半期に1回か2回は最低でも作る

#### 参考文献
1. Betsy Seyerほか　SRE サイトリライアビリティエンジニアリング　オライリー　136-138
PHPの??ってなに？

# まだ現場経験が浅いときに思ったこと

「??ってなに？」

現場経験３か月頃、初めて下記の処理を見たとき、一体どういう処理なのか？と
悩んだ覚えがあるので、同じような方向けに記事にしました。

```
$hoge = $a ?? null
```


下記のような三項演算子なら知っていましたが、「??」はあまり馴染みない方も多いはず。。

```
$a = 1;
$b = 2;

$max = $a > $b ? $a : $b;
echo $max;
```
```
実行結果
2
```

# 結論

```
$hoge = $a ?? null
```


これは下記の処理と同じことをしています。
aに値があればaの値を代入し、無ければnullが入るようなイメージです。

```
if ($a) {
    $hoge = $a;
} else {
    $hoge = null;
}
```


以上、短い記事でしたがどなたかの参考になれば幸いです。
DockerfileにRUN echoを書いているのにbuild時に標準出力に表示されない

# 環境情報
```terminal
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.6
BuildVersion:	19G73
$ docker --version
Docker version 20.10.0, build 7287ab3
```
Docker Desktop version 3.0.3
# 事象
## Dockerfileの内容

```Dockerfile
FROM docker/whalesay:latest
RUN echo `date +"%Y-%m-%d %H:%M:%S"`
CMD date | cowsay
```

## 出力結果

```terminal
$ docker build -t docker-whale . --no-cache
[+] Building 0.4s (6/6) FINISHED                                                                                      
 => [internal] load build definition from Dockerfile                                                             0.0s
 => => transferring dockerfile: 234B                                                                             0.0s
 => [internal] load .dockerignore                                                                                0.0s
 => => transferring context: 2B                                                                                  0.0s
 => [internal] load metadata for docker.io/docker/whalesay:latest                                                0.0s
 => CACHED [1/2] FROM docker.io/docker/whalesay:latest                                                           0.0s
 => [2/2] RUN echo `date +"%Y-%m-%d %H:%M:%S"`                                                                   0.3s
 # ここにechoの結果が表示されてほしいのだが、表示されない。
 => exporting to image                                                                                           0.0s
 => => exporting layers                                                                                          0.0s
 => => writing image sha256:e927115c90cf9ec5c69d8bf8664afe1e6483514e86b7f94f76da5050a0f0f65e                     0.0s
 => => naming to docker.io/library/docker-whale 
```
# 解決策
`docker build` の時に `--progress plain`を指定する。

```terminal
$ docker build -t docker-whale . --progress plain --no-cache
#1 [internal] load build definition from Dockerfile
#1 sha256:5b446167b8f2660da37e9b45a41f805c9fc491d4bc0e0d278051f6613c08384c
#1 transferring dockerfile: 234B done
#1 DONE 0.0s

#2 [internal] load .dockerignore
#2 sha256:a94a1fefc4aa855d02da542c8c83ce7747028a0f7dce44469f27ba31896d7b89
#2 transferring context: 2B done
#2 DONE 0.0s

#3 [internal] load metadata for docker.io/docker/whalesay:latest
#3 sha256:d59230d59547a76b6e0d9b846a193c02fc104868f78213593f8e7d8ae95dcf2c
#3 DONE 0.0s

#4 [1/2] FROM docker.io/docker/whalesay:latest
#4 sha256:6fe26e5b9899a35aa22f0c64d5f0e8eedced7ba4b2f0880373a944a3c2831547
#4 CACHED

#5 [2/2] RUN echo `date +"%Y-%m-%d %H:%M:%S"`
#5 sha256:188e3f318e8343d0d960ed39317fad4327f9530bd6446d2a8fb280ee1324f963
#5 0.211 2021-01-06 15:40:08  # echoの内容が表示される！
#5 DONE 0.3s

#6 exporting to image
#6 sha256:e8c613e07b0b7ff33893b694f7759a10d42e180f2b4dc349fb57dc6b71dcab00
#6 exporting layers done
#6 writing image sha256:d2a4932df513014ef9f1cac98183aa781e776f6437ac442573d4b9a1bf8c960e done
#6 naming to docker.io/library/docker-whale done
#6 DONE 0.0s
```
Vue.js プロパティまとめ

# これはなに
Vue.jsのプロパティとコンストラクタのオプションをまとめたメモ。

## dataプロパティ
データのオブジェクトを指定。テンプレートから参照できる。
dataプロパティはリアクティブで、値が変わるたびにVue.jsが検知して表示などを切り替えることができる。

オブジェクトもしくは関数を設定できるが、あくまでもデータそのものをおくべきで、値を処理する関数や、計算する関数はmethodsやcomputedに設定したほうが良い。


```javascript

data: {
  name: 'hoge',
  price: 1000
}
```
```html
<p>{{ name }}</p> <!-- hoge -->
<p>{{ price }}</p> <!-- 1000 -->
```

## フィルター(filters)
テキストフォーマット処理を適用する仕組み。日付のフォーマットや数値のフォーマットなど。

```javascript

filters: {
  yen_filter(value) {
    return value + '円'
  } 
}
```

```html
<p>{{ 1000 | yen_filter }}</p> <!-- 1000円 -->
```

## 算出プロパティ(computed)

データに何らかの処理を加えたものをプロパティにしたい場合に使用する。
例えば、複雑な計算式の記述や、同じ計算式をテンプレートの複数箇所などに記述することを避けたい場合など。
データが変更されない限り、**一度計算した結果をキャッシュする**特徴をもつため、**計算した結果を再利用したい**場合に使用すると良い。
基本的に引数を渡すことはできない。this(Vueのインスタンス自身)経由で参照するのが良い？


```javascript
data: {
    value1: 100,
    value2: 200,
  },
computed: {
  some_computed () {
     return (this.value1 + this.value2) * 100
  }
}
```
```html
<p>{{ some_computed }}</p> <!-- 30000 -->
```

## メソッド(methods)
データの変更やサーバーにhttpリクエストを送る際に用いる。
computedと異なり、キャッシュされない。
「時間が経っても使いやすい汎用性の高いコードを書こう」（ n回目 ）

こんにちは、株式会社ベストティーチャーで元気に働く たわら です。

## とある日

先輩 「 キャンペーンのダミーデータを作ってくれる？　rakeタスクで 」
ボク 「 ハイ！ 」

ボク 「 ゴニョゴニョ、、、よし」

```ruby
  task campaign: :environment do
    Campaign.create(
      title: "ダミーキャンペーン", 
      message: "条件 2021年1月1日（金）〜1月31日（日）までにキャンペーンに参加",
      duration: Time.zone.parse('2021-01-01 00:00:00')..Time.zone.parse('2021-01-31 23:59:59'))
  end
```

ボク「 できました！ 」

先輩 「 ...... 」
先輩 「 ...... 」
先輩 「 これ一回きりしか使えないね、、、 」
先輩 「 時間が経っても使いやすい汎用性の高いコードに改善しよう！ 」
先輩 「 たとえば、先に変数で定義して、範囲は実行時点の月初から月末にするとか、、、 」
先輩 「 あとタスク名はわかりやすく、`dummy_campaign`にしよう」（コメントでご指摘いただき追記しました）
ボク 「 ハイ！ 」

```ruby
  task dummy_campaign: :environment do
    start_day = Time.current.beginning_of_month
    end_day = Time.current.end_of_month
    str_start_day = start_day.strftime("%Y/%m/%d/%a")
    str_end_day = end_day.strftime("%Y/%m/%d/%a")
  
    Campaign.create(
      title: "ダミーキャンペーン", 
      message: " 条件 #{str_start_day}〜#{str_end_day}までにキャンペーンに参加 ",
      duration: start_day..end_day)
   end
```

先輩 「 、、、んー、よいでしょう！ 」
先輩 「 こうすれば、すぐ使えるね。毎回書き直さなくてよいから、今後使う人に親切になるね 」
ボク 「 勉強になりました！ 」

## 学び

時間が経って、自分以外の人がコードを見た場合の、汎用性や利便性を考えて、コードを書きましょう！
エンジニアとしてガシガシ勉強してグングン成長したいです！

##### 2020/1/8 大事な追記 ver1（@nirasan さんにコメントでご指摘をいただきました。ありがとうございます！）

ただし要件によっては、修正前のコードでも問題ない場合があるので、、、

>できれば、値が静的になる場合も動的になる場合もありえるということを憶えておき、実装する前に「なんのために使いたいか？」「どう使いたいか？」ということをヒアリングし理解して、要件に合わせて実装していく、という流れで作業してみるのが良いと思います。

というステップで仕事を進めていきたいと思います。

まさに業務を進めていく上でどこかで感じていた、もやもやしていた気持ちが、こちらのコメントで晴れました。要件をヒアリングする技術も磨いていきたいですね。Qiitaにアウトプットしてよかった！

##### 2020/1/9 大事な追記 ver2（@dyoshikawa さんにコメントでご指摘をいただきました。ありがとうございます！

>
「別の人が見ても読みやすい」(可読性)
「時間が経っても使いやすい」（汎用性）
の2つを混同してしまっているかもしれません。
今回の先輩の指摘と筆者さんの改善は専ら後者の内容であるように思いました。

修正前のコードの問題は（今回の文脈の場合）、可読性が低い、のではなく、汎用性が低いことでした。ご指摘を受け、、、
・記事の意図がわかりやすいようにタイトルの変更
「時間が経って、別の人が見ても使いやすいコードを書こう」
↓
「時間が経っても使いやすい汎用性の高いコードを書こう」

・一部文章の変更
を行いました。コードの可読性と汎用性の違いを切り分けて学習していこうと思います。アウトプットしてよかったです！



##### 追記おわり


## 宣伝

オンラインで英語を「書く」「話す」能力を磨く機会を提供するサービスを提供しています。
iOSエンジニアを募集していますので、よかったらご検討ください。

英語を学びながら働きたいiOSエンジニア募集 - Qiita Jobs
https://jobs.qiita.com/employers/266/postings/1102

（了）
laravel学習　掲示板Webアプリ作成


初めての投稿です。
laravelの学習で掲示板アプリを作った際の作業メモです。
まずはUdemy動画になぞってコーティングしました。

## プロジェクト作成
ターミナルで下記コマンドを実行する。

```
composer create-project laravel/laravel keijiban
```
```Application key set successfully.```が表示されればOK。
					
							
## サーバー起動
```
php artisan serve						
```
							
## DBマイグレーション
migrationファイルを作成

```
php artisan make:migration create_posts_table --create=posts
```			
database>migrationsフォルダの中に生成されたファイルに項目を追加。
```title,content```を。

```php:2021_01_02_065906_create_posts_table.php
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->BigIncrements('id');
            $table->string('title');
            $table->string('content');
            $table->timestamps();
        });
    }
```

databaseフォルダにdatabase.sqliteファイルを空で設置。						

migrateしたらエラー				

```							
php artisan  migrate
```
![スクリーンショット 2021-01-07 0.03.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1007978/ff7a8bc0-1357-cbee-819b-49514ed8a221.png)

configのdatabase.phpを修正。						

```php:database.php
'default' => env('DB_CONNECTION', 'mysql'),	
→'default' => env('DB_CONNECTION', 'sqlitel'),						
```
これでも同じエラー。

プロジェクトフォルダ直下の.envファイルの修正が必要だった。
これUdemyで説明抜けているぽい。
→再び、migrateするとできた。						

## model作成
```
php artisan make:model Post						
```							
## view作成
viewをUdemyサイトから持ってた。
views>layoutsにapp.blade.php
views直下にposts.blade.php
あとcommonsにerrors.blade.phpもこのままだとまだエラー。

## ルーティング設定
モデルのパスを通すコードを追加。

```php:web.php
use App\Models\Post;

Route::get('/', function () {
    $posts = Post::all();
    return view('posts', ['posts' => $posts ]);
});
```						
最初の表示完了！！！追加フォームが表示された。
[Editor拡張] InspectorにUI取得ボタンを表示して押したらUIを取得

使用すると下画像のようにInspectorにボタンを追加します。

![スクリーンショット 2021-01-07 0.19.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119898/7d3cd22c-7606-3eea-7e57-d39029ac8b01.png)


以下　サンプルコード

```Sample.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif

namespace Test
{
    public class Sample : MonoBehaviour
    {
#if UNITY_EDITOR
        public void SetInspectorUI()
        {
                // ここに処理を記載
                Debug.Log("On Click");
        }
#endif
    }

#if UNITY_EDITOR
    [CustomEditor(typeof(Sample))]
    public class SampleEditor : Editor
    {
        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();

            if (GUILayout.Button("Set UI"))
            {
                Sample t = target as Sample;
                t.SetInspectorUI();
            }
        }
    }
#endif
}
```

UIを取得するならこういう書き方かな？というサンプル

```Sample.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
#if UNITY_EDITOR
using UnityEditor;
#endif

namespace Test
{
    public class Sample : MonoBehaviour
    {
        public Text A;
        public Text B;
        public Text C;

#if UNITY_EDITOR
        public void SetInspectorUI()
        {
            var texts = GetComponentsInChildren<Text>();

            foreach (var t in texts)
            {
                if (t.name == "A")
                {
                    A = t;
                }
                else if (t.name == "B")
                {
                    B = t;
                }
                else if (t.name == "C")
                {
                    C = t;
                }
            }
        }
#endif
    }

#if UNITY_EDITOR
    [CustomEditor(typeof(Sample))]
    public class SampleEditor : Editor
    {
        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();

            if (GUILayout.Button("Set UI"))
            {
                Sample t = target as Sample;
                t.SetInspectorUI();
            }
        }
    }
#endif
}

```
Autowareで走行経路（Waypoint）の作成

自動運転する際に、車両が追従するための走行経路/コースであるWaypointを作成する。

地図作成が完了している前提。
https://qiita.com/atsuto/items/f26d63b778a783929ab7

※参考
https://faboplatform.github.io/AutowareDocs/03.WayPoint/01.waypoint/
https://qiita.com/k-koh/items/db88bbd6923a668c3164
https://qiita.com/k-koh/items/0e492a0ae032a5ab034d
http://4c281b16296b2ab02a4e0b2e3f75446d.cdnext.stream.ne.jp/randc/mirai/3_Autoware_LP.pdf
P49付近

# ROSBAGの再生
再生してすぐ一時停止。
# 設定
### Setup Tab
TFとVehicle Modelを設定
### Map Tab
地図ファイルとTFを設定
### Sensing Tab
voxel_grid_filterを選択
### Computing Tab
ndt_matchingのappでInitial Posを選択、保存先も指定する。
ndt_matching、vel_pose_connect、waypoint_saverを選択

# RVizで確認
部屋の中を車が走りはじめた！
![Screenshot from 2021-01-06 23-08-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80263/82550329-36ff-ffac-f2a9-c065354b7f66.png)

徐々にWaypointが増えていく。
![Screenshot from 2021-01-06 23-16-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80263/9bf2143c-e6c7-5ee7-5b55-618e0aaaf92b.png)


![Screenshot from 2021-01-06 23-12-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80263/de128281-b531-8f7e-20f5-3b099ca44e38.png)

結果、できあがったWaypointがこちら。（今回は短いコースのため3点しかないが。）
saved_waypoints.csv

```csvs:saved_waypoints.csv
x,y,z,yaw,velocity,change_flag
0.0225,0.0338,-0.0025,0.0014,0,0
0.9819,-0.2502,-0.0053,-0.0535,0.0000,0
1.9725,0.0507,0.0683,1.1678,0.0000,0
```
Django初心者がハマったエラーと解決法のメモ

## やったこと
pythonでwebアプリを作ってみたくて、[Udemyの初心者講座](https://www.udemy.com/course/django-3app/)をやってみました。

VScodeでソースを編集＆Linuxの操作しつつ、Djangoでアプリを動かしDBはSQLiteを使っていく講座でした。


##開発環境
- VScode：1.52.1
- Django：3.1.4
- python：3.8.5

##環境構築
venvで仮想環境構築後、Djangoパッケージのインストールを行ったのにVScodeから”Unable to Import Django～"とチェックが入った。

VScodeのLinterが参照するPythonファイルが仮想環境にインストールしたものと違っていた。
設定から変更可能。選択肢が自動で表示されるがディレクトリを直接指定することも可能。

##プロジェクト設定
アプリで登録した画像ファイルが指定のディレクトリに保存されない。

プロジェクトのsettings.pyにて"MEDIA_ROOT"と設定すべき変数名を"MEDIA_DIR"と設定していた。完全に凡ミス。


## SQLite
migrateコマンドを実行しようとした際に、「AAAというモデルがないよ」とエラーがでて失敗する。しかし、models.pyにもmigrations以下のファイルにもAAAというモデルが存在する。

AAAというモデル名を修正したくて、migrations以下のファイルを直接編集してしまった。
その後、makemigrationsコマンドを実行したせいで、モデル名を修正してもエラーがでていた。
完全にSQLiteの知識不足ですね・・・・
対策はいろいろ調べたがわからず、結局migtaionsフォルダを作り直した。

##デバッグ
ソースコードを完璧に修正したはずなのにエラーが解決しねぇ！！！！

９割ぐらいVScode上でファイルの保存がされていません。
これもその辺の仕様の理解不足ですね。
ターミナルにポケモンを表示したい。何故なら業務中も癒やされたいからだ

叶えましょう、その願い。

# やりたいこと

いつも戦っているターミナルアプリに、ポケモンを登場させて癒やされたい。

こんな感じに
![Demo](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72413/a3091ff5-4060-c4e9-6804-3fd1bff49680.gif)


# ワンライナーで解決する

とりあえず試すなら、このコマンドを実行すればOKです。
初代ポケモン151匹のうち、ランダムにどれかが表示されます。

```bash:bash
curl -s -L "https://raw.githubusercontent.com/shinya/pokemon-terminal-art/main/hello.sh" | bash
```

# 作ろうと思ったきっかけ

モノづくりをする時、Whyを考えるのは大事だと先輩に教わりました。
なので、ここに作った理由を書いておきます。

## その1. 私がポケモン好きだから

シンプル。
私はポケモンが大好き。
ちなみに推しのポケモンは金銀で初登場した「ハッサム」です。カッコいい。
あとゲンガー。かわいい。

## その2. ターミナルの背景色を自由に変えられると知ったから

Qiitaを回遊していたら、[こんな記事](https://qiita.com/tu-kun/items/d38452161bfb9da54bcd)を見つけました。
「え！スライム表示できるの！？めっちゃええやん」
となりました。私はドラクエも大好きであるのです。

こうなったら、ポケモンでもこれをぜひ実現させたい。


**以上の2点から、私はこのツールを作るのに至りました。**

# 作った効果

圧倒的モチベーションアップ！

本当にポケモンが表示されると **癒やされます（個人の見解）**
大変なリリース作業や、難易度の高い開発PJの最中に、ふと目をやるとポケモンたちがそこにいる。
はぁ・・・めっちゃいいやん・・・となり、業務中もこのように表示しています。
これはモチベーションあがります。

**tmuxを使って、このように画面の一部に表示するのがおすすめです。**
![pokemon_demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72413/dce904f1-1869-3989-9f5c-7742e194b4a1.gif)

マジでこれはオススメです。ポケモン可愛いよポケモン・・・。

# ソースコード（という名のテキストファイル）はこちら

[Github](https://github.com/shinya/pokemon-terminal-art)で初代151匹分のテキストデータを作って公開しています。
好きなポケモンのテキストデータを `cat` してください。
`screen.sh` を実行すると上記のようにランダムで次々と表示する処理をしてくれます。

紹介しているのはいわゆるゲームボーイの「金」のグラフィックです。
が、
ブラック/ホワイト版のグラフィック豊かな方も用意しています。

https://github.com/shinya/pokemon-terminal-art

下記のようなイメージで、ポケモンを指定してcurlしてもらってもOKです。

```bash:bash
# 006はリザードン
POKEMON_NUMBER="006"

curl -s "https://raw.githubusercontent.com/shinya/pokemon-terminal-art/main/256color/gold/${POKEMON_NUMBER}.txt"
```

# motdにもぜひ

Linuxのサーバーにログインしたら表示される `/etc/motd` 
この中身に設定したら、サーバーにログインするたびにポケモンに会えます。

* 開発環境は「メタモン」
* ステージングは「リザードン」
* 本番環境は「ミュウツー」

みたいに、 **ログイン時に目で見てすぐ環境がわかるような設定もオススメ**です。

こんな感じ
![pokemon_demo2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72413/a0cc8f85-afd9-7a29-9787-d2c0643ef5eb.gif)


# 今後について

まだ初代の151匹しか作成できていない。
しかし現状のゲームソフトでは、世界にはもっとたくさんのポケモンがいる。
なので、ちょっとづつ数を増やしていきます。

優先的に作って欲しいポケモンがあったら、GithubでIssueくださいませ。

# 勝手に謝辞

当グラフィックテキストを作成するに当たり、こちらのサイトの画像を参考にさせていただきました。
ありがとうございます。

* ひこちゃんず！
    * http://hikochans.com/
Win10でapacheサーバーに、PHPをインストール

# PHPのダウンロード
以下サイトからダウンロード、今回試したのは、PHP8

https://www.php.net/

`自分がサーバーにしてるマシンが32bitなので、`
Download -> Windows downloads 
`VS16 x86 Thread Safe (2021-Jan-06 00:27:59)` の zip をダウンロード

# PHPをインストール
ダウンロードした zip を展開して、任意のパスに配置
`C:php とかに配置`

# 環境パスの設定
PHPを配置したパスを、環境パスの　path に設定する

# PHPの設定ファイルを調整する
## iniファイルを作成
../php/`php.ini-development`が展開したフォルダに含まれているので、
複製して `php.ini`にリネームしてから編集する

### タイムゾーンを設定
```
; date.timezone = 
　↓
date.timezone = "Asia/Tokyo"
```

### エクステンションフォルダパスを設定
```
; extension_dir = "./"
　↓
extension_dir = "C:/php/ext"
```
### その他に必要なエクステンションを設定
```
;extension=mbstring
;extension=gd
　↓
extension=mbstring
extension=gd
```


## apacheの設定にPHPを追加する
../Apache24/conf/`httpd.conf` をテキストエディタで編集する
最下部に書きを追記

```
LoadModule php_module "C:/php/php8apache2_4.dll"
PHPIniDir "C:/php/"
AddHandler application/x-httpd-php .php
```

## 動作チェック
### test.phpの作成
`../Apache24/htdocs` 以下に `test.php` の名称でファイルを作成する
テキストファイルの中身は、以下の phpinfo関数の呼び出しを記述

```
<? php
phpinfo();
?>
```

### test.phpをブラウザから呼び出す (ポート番号80 の場合)
chorome ブラウザなどで、 `localhost:80/test.php `
で、phpinfoの内容が、ブラウザ上に表示されれば、完了
git-flowとGitHub Flow

※私的メモ
`git-flow`,`GitHub Flow`は「Gir/GitHubのワークフロー」であり、**厳密な規則**ではない。
開発規模や人数によって適切なワークフローを用いることで、複数人でのバージョン管理システムの運用を円滑にすることができる。
#git-flow
「git-flow」はVincent Driessen氏の[「A successful Git branching model」](https://nvie.com/posts/a-successful-git-branching-model/)を基にしたワークフロー。
他のワークフローと比べると大規模で複雑な構成になっている。
**開発者が4人以上**の場合に適している。
##ブランチの種類と用途
###メインブランチ
メインブランチには**「master」**と**「develop」**の2つのブランチがある。
これらのブランチは常に存在する。

- master(main)

リリース済みのソースコードを管理する

- develop

開発中のソースコードを管理する


###サポートブランチ
タスクごとに**「feature」****「release」****「hotfix」**のいずれかのブランチを作成し、作業を行う。

- feature
機能実装や開発作業を行う

- release
リリース準備作業を行う

- hotfix
緊急の修正やバグ修正を行う

##開発フローの例
![at-it-git-15-002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420303/7c6af66c-6cf2-7a83-cb5d-d8a1377cc846.jpeg)
**1,developブランチを作成**
master(main)ブランチからdevelopブランチを作成

**2,機能を実装する**
developブランチから、featureブランチを作成
機能実装後、コミットはfeatureブランチに対して行う

**3,機能実装を完了する**
featureブランチでの作業が完了したら、featureブランチをdevelopブランチにマージする
マージ完了後にfeatureブランチを削除する

**4,リリース準備を始める**
機能実装が終わりリリースできる状態になったら、developブランチからreleaseブランチを作成する

**5,リリース準備を完了する**
リリースブランチでの作業が完了したら、releaseブランチをmasterとdevelopブランチにマージする
マージ完了後にreleaseブランチを削除

**6,緊急の修正作業を開始する**
リリース後に緊急の修正作業が発生した場合は、masterブランチからhotfixブランチを作成し、修正作業を行う
マージ完了後にhotfixブランチを削除する

#GitHub Flow
「GitHub Flow」は「GitHub」の開発で使用されているワークフローであり、「git-flow」に比べてシンプルな構成になっている。

**開発人数が1~3人**で1日に複数回デプロイを行うようなWebアプリケーションの開発に適している。
##6つのルール
- **masterブランチは常にデプロイ可能である**
- 作業用ブランチをmasterから作成する
- 作業用ブランチを定期的にプッシュする
- プルリクエストを活用する
- プルリクエストが承認されたらmasterへマージする
- masterへのマージが完了したら直ちにデプロイを行う

##開発フローの例
![at-it-git-15-009.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420303/ae165e0f-62b4-3fa7-f5c0-8f835d3e631f.jpeg)
**1,開発作業を行う**
GitHub Flowでは、全てのブランチをmasterブランチから作成する
ブランチ名は、何の作業を行っているかが分かる名前にする。また、作業用ブランチは定期的にリモートリポジトリにプッシュするようにする。これによって、他の開発者の作業状況を把握できるようになる

**2,Pull Requestを行う**
作業用ブランチをmasterブランチへマージできる状態になったら、プルリクエストを作成して他の開発者にコードレビューを依頼する。そして、プルリクエストが承認されたらmasterへマージする

GitHub Flowを使用した開発では、**プルリクエストを積極的に活用する**。作業完了後のコードレビューだけではなく、作業途中の実装への助言を求める場合などにも使える

**3,デプロイする**
masterへのマージが完了したら直ちにデプロイを行う
#まとめ
git-flowは4人以上での開発の際に用いる
GitHub Flowは1~3人での開発に用いる
マージの際はPull Requestをする(GitHub Flowの場合は作業途中でも有用なため積極的にする)



- master(main)・・・ユーザーが使う製品
- hotfix・・・バグ修正用ブランチ、masterからクローンしてくる
- release・・・リリース用
- develop・・・featureブランチの集まり
- feature・・・作業ブランチ

#参考
https://www.atmarkit.co.jp/ait/articles/1708/01/news015.html#02
React Redux Hooks公式ドキュメント翻訳（概要編）

Reactアプリケーションの状態管理のためのOSSライブラリである、React Reduxのバージョン7.1.0で追加された、Hooks APIの公式ドキュメントを翻訳していきます。

1. React Redux Hooks公式ドキュメント翻訳（概要編）
2. [React Redux Hooks公式ドキュメント翻訳（useSelector編）](https://qiita.com/japanesebonobo/items/843753903fdfa173f516)
3. [React Redux Hooks公式ドキュメント翻訳（useDispatch, useStore編）](https://qiita.com/japanesebonobo/items/0efd36798933fbb1f689)

2021/1/6公開。原文リンクは以下。
・公式ドキュメント（React Redux Hooks）：https://react-redux.js.org/api/hooks

今回の記事は概要編です。
![スクリーンショット 2021-01-06 23.07.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296645/8c3d0801-b2a1-e494-2a01-8743cecbd8e1.png)

#Hooks APIとは
Reactの新しい[hooks API](https://reactjs.org/docs/hooks-intro.html)はローカルなコンポーネントのstateをより簡単に扱うことができる関数コンポーネントです。

React Reduxは今回、高階コンポーネント(HOC)の一つである既存のconnect関数の代わりに、いくつかのhook APIを提供します。これらのAPIを使えば、connect関数であなたのコンポーネントをラップすることをせずとも、ReduxのStoreに登録し、Actionを送る（dispatchする）ことが可能になります。

Hooks APIはReact Reduxのバージョン7.1.0で追加されました。

#React ReduxアプリでHooks APIを使う
connect関数と同様に、Hooks APIを使う前の準備として、コンポーネントの階層全体でReduxのStoreを使えるように、以下のようにProviderを設定する必要があります。

```react
const store = createStore(rootReducer)

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
)
```

この準備が整えばこれから紹介する、React Redux hooks APIの全てをあなたの関数コンポーネントの中で使用することができます。



次回はHooks APIの一つ、useSelector（）について説明します。
FlutterでJavaScriptのquadraticCurveToとbezierCurveTo

メモです。
結論から言えば
quadraticCurveTo => quadraticBezierTo
bezierCurveTo=> cubicTo

https://developer.mozilla.org/ja/docs/Web/Guide/HTML/Canvas_tutorial/Drawing_shapes
のコードを参考。

```dart:コード
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
        home: Container(
      color: Colors.white,
      child: CustomPaint(
        painter: CirclePainter(),
        child: Container(
          height: 500,
        ),
      ),
    ));
  }
}

class CirclePainter extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {
    // 円（外線）

    final quadraticBezierTo = Path()
      ..moveTo(75, 25)
      ..quadraticBezierTo(25, 25, 25, 62.5)
      ..quadraticBezierTo(25, 100, 50, 100)
      ..quadraticBezierTo(50, 120, 30, 125)
      ..quadraticBezierTo(60, 120, 65, 100)
      ..quadraticBezierTo(125, 100, 125, 62.5)
      ..quadraticBezierTo(125, 25, 75, 25);

    canvas.drawPath(
        quadraticBezierTo,
        Paint()
          ..color = Colors.red
          ..style = PaintingStyle.stroke
          ..strokeWidth = 1);

    final cubicTo = Path()
      ..moveTo(75, 40)
      ..cubicTo(75, 37, 70, 25, 50, 25)
      ..cubicTo(20, 25, 20, 62.5, 20, 62.5)
      ..cubicTo(20, 80, 40, 102, 75, 120)
      ..cubicTo(110, 102, 130, 80, 130, 62.5)
      ..cubicTo(130, 62.5, 130, 25, 100, 25)
      ..cubicTo(85, 25, 75, 37, 75, 40);

    canvas.drawPath(
        cubicTo,
        Paint()
          ..color = Colors.blue
          ..style = PaintingStyle.stroke
          ..strokeWidth = 1);
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) => false;
}
```
結果:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702338/e294a13a-9e54-7649-a859-5e07ad474178.png)
[基礎] Unixコマンド

コマンド     |	説明	             
------     |---------------------------------------------------------------------
ls        | カレントディレクトリにあるファイルやディレクトリを表示する
ls-l     | ファイルやディレクトリの詳細も同時に表示する
ls-a     | 隠しファイルも含めファイルやディレクトリを全て表示する
ls−la    | 隠しファイルを含む全てのファイルやディレクトリの詳細を表示する
-l        | ロングフォーマット
-d        | 指定のディレクトリ情報のみ表示
cd        |	ディレクトリの移動(change directory）	
cd ~/     | ホームディレクトリに移動する
cd ..     |一つ上の階層のファイルに移動する
cd ファイル名|  ファイルに移動する
pwd	  | カレントディレクトリの表示（print working directory）
touch ファイル名   |	空ファイルが作られる	
mkdir フォルダ名    |	空のフォルダが作られる。（make directory)	　　　　|-p 入れ子のフォルダを一気に作成	
mv ファイル名 a/| ファイルを相対パスでa/に移動する(move)
mv ファイルa ファイルb | ファイルaをファイルbに名前変更する
rm ファイル名|  ファイルを削除する（remove）
rm ディレクトリ名| ディレクトリとその中身を削除する
rm -f ファイル名| ファイルを警告なしで削除する
rm -rf ディレクトリ名| ディレクトリとその中身を警告なしで削除する
cp        |	ファイルのコピー           |-i インタラクティブモード
-p        | ファイルの属性を維持
-R        | 丸ごとコピー
-v        | コピーされたファイル名の表示
cat       |	テキストファイルの内容を表示 |-n 行数表示
man       |	マニュアルの表示	
whatis	  |コマンドの簡単な説明を表示	
which	  |コマンドの保存先を調べる	
type	  |コマンドの保存先を調べる	|-a 全ての保存先を表示
apropos	  |コマンドをキーワードで検索	
find	  |ファイルの検索※[find ディレクトリ名 -name ファイル名]で検索|-name ファイル名、-typeタイプ（d: ディレクトリ、f: ファイル、l: シンボリックリンク）-mtime 変更日時（-3で3日前から現在、+3で3日前よりも前）-sizeサイズ
cal	  |カレンダーの表示	例） cal 11 2018
date	  |日付の表示	

---
こちらの記事を参考させていただきました。
https://qiita.com/ryouzi/items/f9dee1540a04a0bfb9a3
Azure CLIでBlobの一部ディレクトリを除いて削除する

## 特定のディレクトリを削除対象から除外

例： `data` ディレクトリを削除対象から除外

```bash
az storage blob delete-batch \
  --account-name $ACCOUNT_NAME \
  --source $CONTAINER_NAME \
  --pattern '[!backup]*'
```

## 複数のディレクトリを削除対象から除外

例： `backup` と `data` ディレクトリを削除対象から除外

```bash
az storage blob delete-batch \
  --account-name $ACCOUNT_NAME \
  --source $CONTAINER_NAME \
  --pattern '[!backup&&!data]*'
```

## 削除前に、意図した挙動になるかを確認するには

`--dryrun` オプションを付与することで、実際には削除せず、コンソール出力で削除対象のファイル一覧を確認することができる。

```bash
az storage blob delete-batch \
  --account-name $ACCOUNT_NAME \
  --source $CONTAINER_NAME \
  --pattern '[!backup]*' \
  --dryrun
```

## 参考

* [az storage blob delete-batch](https://docs.microsoft.com/en-us/cli/azure/storage/blob?view=azure-cli-latest#az_storage_blob_delete_batch)
MySQL　boolen型（真偽値チェック）　JOIN（テーブル連結）　備忘録

# データベース設計時のboolean型

+ 真偽値チェックに使う。データが返ってくる時にtrue,falseを返して欲しい時に設定。
+ **trueが１でfalseが０** 
+ 何も指定しなければデフォルトで0(false)が入る
+ 命名は**is_item**のようにis_〇〇と設定。
+ データ型は**tinyint(1)**とする。０か１しか入らないので１文字となる→（１）


💡大抵選ぶ項目が二つの時は０or1。（　true1,false0のように　）
　項目が３つ以上になると１、２、３という形になる（　性別：　１,女　2,男　3,その他　）

# JOIN

複数のテーブルから情報を取得する必要がある場合、テーブルを連結することでクエリの発行から情報の取得までを一度に済ませることができる。

＜データの量が少ない＞
→テーブルを連結させた方がデータとってくるスピードが早い

＜データの量が多い＞
→分けた方が良い。くっつけると逆にデータをとってくるスピードが遅くなる


以上！！
M1搭載Macのpip installに苦戦した

参考記事
https://freeheroblog.com/pipenv-install/

M1搭載のMacBookProを買ったがpip install すら出来ず。
それを乗り越えたので。
難しいことはしてないし書かないし分からない。

##環境
MacBookPro M1

##つまづいた原因
Homebrew がARMプロセッサでは対応してないということで
インストールを諦めた事。

そもそも、普通にはインストール出来なかった

##Homebrewインストール方法
特に気にせず、
ターミナルで

```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
を実行すると、
「ARMプロセッサに対応してない」的なエラーが出る
と同時に下の文には、
「Rosetta2でHomebrewインストールを再実行します」
と書いてある

そのため、Rosettaからインストールしますがその方法を下記に。

①Finderからターミナルを検索します
②ターミナルを２本指クリック(右クリック)
③「情報をみる」をクリック
④「Rosetta」を使用して開く　にチェックを入れる

ここまでしたら再度、ターミナルを開いて、

```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

実行します

何かしら上手くいかなければPCを再起動してください
それで自分もインストールできました

ここまでできたら
仮想環境内であろうと、pip install が正常に動作するようになりました
今更だけど、activeセレクターとhoverセレクターの違いについて

#はじめに
　コピペしていて気づかなかった、CSSのセレクターについて、自分が忘れないように記録しておく。

##:activeセレクターと:hoverセレクターの違いについて

`:active`は<font color=red>クリックされた瞬間</font>にスタイルを適用させるもの。
`:hover`は<font color=red>マウスポインターが重ねられたとき</font>にスタイルを適用させるもの。

ただし、両方とも適用させたい場合は、スタイルが上書きされないように、`:activeセレクター`は後ろに記述する。
RubyでValueObjectを作るベストなやり方を考えてみた

## 結論
以下のようにするのがベストではないかと思ってますが、もっと良いやり方あったらコメントください。

```ruby
module ValueObjectable
  def initialize(args)
    super(args)
    freeze
  end
end

class Location < Struct.new(:country, :city, keyword_init: true)
  include ValueObjectable
end

## 特徴 ##
# 1. OpenStructのように Hash で初期化できる
tokyo = Location.new(country: 'Japan', city: 'Tokyo')
=> #<struct Location country="Japan", city="Tokyo">

# 2. 比較演算ロジックを自前で定義しないでいい
fukuoka = Location.new(country: 'Japan', city: 'Fukuoka')
tokyo == fukuoka
=> false

# 3. 値は不変
tokyo.country = 'U.S'
FrozenError: can't modify frozen Location
```