OmniAICreator/Qiita-1.07M huggingface dataset:
必要最低限でDjangoをherokuで動かす方法

タイトル通りですが、必要最低限でDjangoをherokuで動かす備忘録です。

下記は割愛しております。
・Djangoアプリケーションの作成
・herokuのアカウント作成や使い方
・githubのアカウント作成や使い方

では初めて行きましょう。

# 環境
- Windows 10 Pro 64bit (バージョン2004)
- Visual Studio Code バージョン 1.53
- Python 3.8.6
- Django 3.1.6

# Procfileの作成
- manage.pyと同じディレクトリに【Procfile】というファイル名でファイルを作成。

ファイルを作成するときの注意点!!
ファイル名の一文字目は大文字の【P】後は小文字で【rocfile】です。
拡張子は不要です。

- ファイルの中には下記のように記載します。

```python:Procfile
web: gunicorn config.wsgi --log-file -
```

# gunicornのインストール
- herokuでDjangoを動かす為に、推奨サーバーのインストールを行います。

```python:コマンド
pip install gunicorn
```


#django-heroku のインストール​:
- Django アプリケーションを Heroku で動作するように自動的に設定してくれる、django-herokuをインストールします。

```python:コマンド
pip install django-heroku
```

- settings.py​ の先頭に次の import​ ステートメントを追加します。

```python:settings.py
import django_heroku
```
- 続いて次のコマンドを settings.py​ の下部に追加します。

```python:settings.py
# Activate Django-Heroku.
django_heroku.settings(locals())
```
# requirements.txtの作成
- manage.pyと同じディレクトリに【requirements.txt】というファイル名でファイルを作成。
- 下記のコマンドでインストールされたパッケージとバージョンを出力。

```python:コマンド
pip freeze > requirements.txt
```
ここで注意点!!過去にはまったポイントですがWindowsのPowerShellから上記のコマンドにて出力したところ、heroku上で正常に動かないことがありました。
普通のコマンドプロンプトから出力すると問題なくうごきました。その際、ファイルの違いを調べてみると文字コードが違っていました。
似た症状の際、参考になれば幸いです。






# runtime.txtの作成
- manage.pyと同じディレクトリに【runtime.txt】というファイル名でファイルを作成。
現在利用しているバージョンを調べたいときは下記のコマンドで確認できます。

```python:コマンド
python -V
```

私の環境だと下記のように記述

```python:runtime.txt
python-3.8.6
```

以上です。

終わったら、Githubにアップロードして、herokuでデプロイしましょう。

私はこのまま進めると一回、heroku側でエラーが出ました。
下記の記事を参考に進めると起動できました。

HerokuにDjangoアプリをデプロイするときのエラーについての対処法
https://qiita.com/Kohey222/items/82f3a76e0247b2d387db

でわ！
IIS の applicationHost.config をコピーするのはよろしくないという話

IIS のセットをする必要があり、複数台のサーバに同じ設定を反映したいとき、applicationHost.config をコピーするのはよろしくない。

https://forums.iis.net/t/1252407.aspx?Can+I+apply+applicationHost+config+to+other+computer+
Laravelでモデルのメソッドを呼び出す

単純にモデルに記述したメソッドをコントローラーで呼び出したい時に、どう記述するかを学んだので備忘録でまとめます。


## 
``` Customer.php
  // 男性の割合を計算
  public function mens()
  {
    $all = Customer::all()->count();
    $mens_num = Customer::where('gender', 0)->count();
    $mens_percent = round($mens_num / $all * 100);
    return $mens_percent;
  }

  // 女性の割合を計算
  public function womens()
  {
    $all = Customer::all()->count();
    $womens_num = Customer::where('gender', 1)->count();
    $womens_percent = round($womens_num / $all * 100);
    return $womens_percent;
  }
```

```コントローラー.php
  public function productReport()
  {
    $customer = new Customer;
    $mens = $customer->mens();
    $womens = $customer->womens();
    return view('product_report',compact('mens', 'womens'));
  }
```
new モデル名でインスタンスを作成してからメソッドを呼び出します。
ssh-copy-idはパスワード認証でなくて良い

## 概要
ssh-copy-idは接続先のサーバーに公開鍵を登録するために利用します。以下のような場面で使うのではないでしょうか。

1. レンタルサーバーの初期ユーザーの設定をパスワード認証から公開鍵認証に変更したい
2. パスワード認証を無効にした後、公開鍵を追加したい

ssh-copy-idはsshを利用して公開鍵を登録します。そのため、1はパスワード認証、2は公開鍵認証を利用してログインし、公開書を登録しています。

## パスワード認証
```shell
$ ssh-copy-id -i "<登録したい公開鍵のパス>" <ユーザー名>@<ホスト名>
```
特段sshの設定していなければ、実行時にログインユーザーのパスワードが聞かれます。パスワードを入力することで公開鍵が登録されます。

## 公開鍵認証
例えば以下のようなssh/configの設定を想定します。

```text:~/.ssh/config
Host hoge
  HostName hoge.com
  IdentityFile ~/.ssh/id_rsa
  User fuga
```

sshを利用になるため、configの設定を元に接続を行います。以下の場合は公開鍵認証で接続できます。
```shell
$ ssh-copy-id -i "<登録したい公開鍵のパス>" fuga@hoge
```
ただ、毎回configの設定を追加したくない時があると思います。例えば、vagrantで構築した環境やAWSのインスタンス等接続が変わる毎に用意するのは面倒です。その場合は以下のようにsshのoptionで秘密鍵を指定すれば良いです。

```shell
$ ssh-copy-id -i "<登録したい公開鍵のパス>" -o IdentityFile=<認証用の秘密鍵のパス> fuga@hoge.com
```

## まとめ
ssh-copy-idはsshを利用しています。そのため、sshのconfigを正しく設定できれば特に認証方法は意識する必要はないと思います。configを汚したくない場合は適宜オプションを追加して実行すれば良いと思います。
学習内容の振り返り（times文）

#### 書いたコード

```ruby:ruby
puts "繰り返す回数を入力してください"
n = gets.to_i

array = []
n.times do 
  puts "出力したい数字を入力してください"
  num = gets.to_i
  array << num
    
end

p array
puts array
```

自分で繰り返したい回数と、出力したい数値を入力し最終的にまとめて出力するコードです。

```ruby:ruby
puts "繰り返す回数を入力してください"
n = gets.to_i
# 例：2を入力
```

この記述でターミナルで値を入力することができます。
入力した値を変数nに代入しておきます。
出力したい値を入れるための空の配列を用意します。

```ruby:ruby

array = []
```

変数nに代入した値の数だけ繰り返すプログラムを作成します。
変数numに入力された値を代入していきそして入力された値を空の配列を代入してあるarrayに追加します。

```ruby
n.times do 
  puts "出力したい数字を入力してください"
  num = gets.to_i
# 例：一回目は３、二回目は５を入力
  array << num
end
```

出力は以下の通りになります。

```ruby:ruby
p array
# =>[3, 5]

puts array
# =>3
# =>5

```

pメソッドは、出力する値と一緒に型情報も合わせて出力します。

参照
[print puts p printf 出力メソッドを極める！](https://www.sejuku.net/blog/16119)
AWS Lambda@Edge 概要


* AWS Lambda@Edgeの概要情報をまとめる。

## AWS Lambda@Edgeとは

* CloudFrontのエッジサーバーでコードを実行するLambda関数。
* ユーザーに近いロケーションでコードを実行することでアプリケーションのパフォーマンスを向上させる。
* CloudFrontのイベントをトリガーとしてコードを実行する。

## 用語・概念

### トリガー

![lambdaedge_concept.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/ef292e7c-f06a-48cf-7003-96b29527377f.png)


* Lambda関数の実行タイミング。
* 関数実行したいタイミングに応じて、選択する。

|              | Viewer                                                       | Origin                                                       |
| ------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| **Request**  | CloudFront キャッシュが確認される前のタイミング。<br />すべてのリクエストで実行する。 | リクエストがオリジンへ転送される前のタイミング。<br />キャッシュミスで実行する。 |
| **Response** | オリジンまたはキャッシュからのレスポンスを受け取った後のタイミング。<br />すべてのリクエストで実行する。 | オリジンからレスポンスを受け取った後のタイミング。<br />キャッシュミスで実行する。 |

## 作成の大まかな流れ

1. CloudFront ディストリビューションを作成する
   
2. 関数を作成する※US-East-1 (バージニア北部) リージョンで作成

3. 関数にCloudFront トリガーを追加する

## サポートランタイム※20210207時点

* Python 3.8
* Python 3.7
* Node.js 12
* Node.js 10
* Node.js 8 および Node.js 6※作成済みのもののみ利用可能。

## ユースケース

### セキュリティ対応

* Lambda 関数をトリガーし、オリジン上のコードを変更せず、全てのオリジンレスポンスに HTTP セキュリティヘッダーを追加する。

### エッジロケーションでの動的ウェブアプリケーション構築

* 他の AWS サービスと組み合わせることで、オートスケーリングやオリジンのインフラ管理作業なしで、自動的にスケールイン/アウトできるウェブアプリをエッジロケーションで構築する。

### A/B テスト

* ウェブサイトのさまざまなバージョンをテストしてユーザーに提供する。

  * A/B テスト用に異なるバージョンのサイトをユーザーに表示する。
![lambdaedge_ab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/0cc167ed-fda6-870d-5792-8537a9d6ecbf.png)


### デバイスに応じたレスポンスの返却

*  `User-Agent` ヘッダーを確認し、ビューワーが使用するデバイスに基づいて、異なるオブジェクトをビューワーに返却できる。以下、例。
  * デバイスの画面サイズに基づいて異なるイメージを返却する。
  * `Referer` ヘッダーの値を考慮する関数を作成し、最も低い解像度のイメージをボットに返却する。

### ユーザーの認証・認可

* ユーザーを認証および認可し、不正なリクエストをオリジンへ到達する前に除外できる。
  * 例：Amazon Cognito などの認証およびユーザー管理サービスを呼び出し、ビューワーのリクエストを認証・認可させる。

![lambdaedge_sec.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/75dbac3a-9e23-bb44-7d87-f3302cf13064.png)


## 参考情報

* [Lambda@Edge を使用したエッジでのコンテンツのカスタマイズ](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html)
* [5分で読む！Lambda@Edge 設計のベストプラクティス](https://dev.classmethod.jp/articles/lambda-edge-design-best-practices/)

* [AWS Lambda@Edge](https://d1.awsstatic.com/webinars/jp/pdf/services/20180221_AWS_Lambda_at_Edge_Black_belt.pdf)
iOSの最終ベータ版が"GM"から"RC"に変わった件

Appleは、
正式リリース直前のベータ版のことを、iOS 14.1までは**“Golden Master”=GM**と呼んでいました。
ところが、iOS 14.2から**“Release Candidate”=RC**っていうのが出て、その後に正式版が出るようになりました。

参考リンク１：
[OSの「Release Candidate（RC）」と「 Golden Master（GM）」の違いは？](https://ipadmod.net/2020/10/31/os%e3%81%ae%e3%80%8crelease-candidate%ef%bc%88rc%ef%bc%89%e3%80%8d%e3%81%a8%e3%80%8c-golden-master%ef%bc%88gm%ef%bc%89%e3%80%8d%e3%81%ae%e9%81%95%e3%81%84%e3%81%af%ef%bc%9f/)
参考リンク２：
[Apple phasing out usage of “GM,” replacing it with “Release Candidate” (RC) instead](https://www.reddit.com/r/iOSBeta/comments/jl5njl/apple_phasing_out_usage_of_gm_replacing_it_with/)

↑の執筆者要約＆考察：

- 一般的には、RCはGMの一歩手前の状態を指す。RCのバージョンは (RC1, RC2...) など複数である場合もある。対してGMは通常一つ。（参考リンク１の情報）
- 最近は“master/slave”という差別的背景を含む用語を避ける風潮があることから、今回のAppleの場合、GMとRCの使い分けというようよりは、"Master"という用語を避けるための変更ではないか？。（参考リンク２の情報）

Appleからの公式情報は得られなかったのですが…
どうやら今後、正式版の直前に出るベータは“RC”のようです。

参考リンク３：
https://gori.me/ios/ios14/132512
https://iphone-mania.jp/news-333424/
サーバー立てずGitHubだけでLINEbotを動かす【Python】

今までLINEbotを作るときはVPSやherokuでサーバー立てたりしてその上で動かしていました。
しかし、GitHub Actionsを使えばGitHub上にpushするだけでLINEbotを動かすことが可能です。
今回は一方的にメッセージが届くbotの作成について一連の流れを説明します。

## 追記2021/02/10
**※注意事項**
GitHub Actionsの利用規約は確認しましょう。
https://docs.github.com/en/github/site-policy/github-additional-product-terms#a-actions-usage
GitHub Actionsを利用することでサーバーレスが可能になりますが、GitHubに負荷をかけてしまうことになります。そのため、リポジトリのプロジェクト運用に関係ないのであればサーバーを立てるもしくはサーバーレスのサービスを利用することをおすすめします。

# やること
- PythonでLINEメッセージを送信する
- GitHub上でトリガーを元にLINEbotを動かす

## 環境
Python
Messaging API
GitHub

## PythonでLINEにメッセージを送信する
### 事前準備
- LINE Developersからチャネルの設定（詳細は割愛します）
- Messaging API SDKインストール

```
pip install line-bot-sdk
```

- python-dotenvのインストール  

```
pip install python-dotenv
```
[python-dotenvを使って環境変数を設定する](https://qiita.com/harukikaneko/items/b004048f8d1eca44cba9)


### 必要ライブラリインポート
- envファイル用

```setting.py
import os
from os.path import join, dirname
from dotenv import load_dotenv
```
.envに後述で利用するMessagin APIのアクセストークンとユーザーIDを設定してsetting.pyでそれらを取得します。

- メッセージ用

```message.py
from linebot import LineBotApi
from linebot.models import TextSendMessage
import setting
```

### メッセージを送る
```message.py
# setting.pyで取得したアクセストークンとユーザーIDを代入
CHANNEL_ACCESS_TOKEN = setting.CHANNEL_ACCESS_TOKEN
USER_ID = setting.USER_ID
line_bot_api = LineBotApi(CHANNEL_ACCESS_TOKEN)

def push():
    # LINEで送る内容を記述
    messages = TextSendMessage(text="おはよう〜〜〜〜")
    line_bot_api.push_message(USER_ID, messages=messages)

# 実行！
push()
```

## GitHub上でトリガーを元にLINEbotを動かす
記述してきた内容をコミットし、GitHubにプッシュします。
GitHub上でActionsタブを選択し、ymlファイルにトリガーや実行する処理を記述していきます。
https://docs.github.com/en/actions/reference/events-that-trigger-workflows#manual-events
トリガーに`workflow_dispatch `というイベントが実装されたことによって手動で実行することが可能になったようです。

![スクリーンショット 2021-02-07 9.43.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464231/4acbc504-35b2-448f-dcf2-3e9e26438bab.png)

今回はcronを指定して、定期的にメッセージを送るようにします。
cronについては下記を参考に設定しました。
[crontabコマンドについてまとめました 【Linuxコマンド集】](https://eng-entrance.com/linux-command-crontab)
※注意　
GitHub Actionsのcronの時刻はUTCなので、日本時間に合わせるために日本時刻から-9時間で設定する必要があります。

```yml
# 10分毎にメッセージを送信
on:
  schedule:
    - cron: '*/10 * * * *'
```
10分間隔にしていましたが、実際に届いたメッセージは10~20分の間でランダムになってました。謎
![スクリーンショット 2021-02-07 9.57.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464231/f1e91d5d-a051-926f-8c88-1317357bb2ea.png)



### 参考
https://www.youtube.com/watch?v=T0KAE2kq2Xo
初めてのRaspberry Pi Pico ⑧ 新しいディレクトリで開発をする

 PicoをC言語で開発するには、pico/pico-examplesの中で作業をしています。新たにpico/worksを作り、この中でLチカをします。
###コピーしてくるもの
　/home/pi/pico/pico-examplesから、

- pico_sdk_import.cmake
- example_auto_set_url.cmake
- cmakeフォルダ
- blinkフォルダ
- CMakeLists.txt

を/home/pi/pico/worksにコピーします。

```
mkdir build
```

　buildフォルダを作ります。
![w101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/c7aaba2b-f2bf-27ac-fdf6-0c0a75cc4380.png)
　CMakeLists.txtをテキスト・エディタで開き、次のように必要なフォルダの記述だけにします。

```shell
cmake_minimum_required(VERSION 3.12)

# Pull in SDK (must be before project)
include(pico_sdk_import.cmake)

project(pico_examples C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)

set(PICO_EXAMPLES_PATH ${PROJECT_SOURCE_DIR})

# Initialize the SDK
pico_sdk_init()

include(example_auto_set_url.cmake)
# Add blink example
add_subdirectory(blink)
add_subdirectory(cmake)
```

###準備OK

　buildフォルダにおります（/home/pi/pico/works/build/）。

```shell
pi@raspberrypi:~ $ cd pico
pi@raspberrypi:~/pico $ cd works
pi@raspberrypi:~/pico/works $ cd build
pi@raspberrypi:~/pico/works/build $ ls
pi@raspberrypi:~/pico/works/build $ 
```

　もちろん空っぽです。このディレクトリで、

```
cmake ..
```

　たくさんのファイルが作られます。
![w103.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/10badad6-a66d-0536-1ac9-a72a953716c6.png)

　新しくできたblinkにおります。

```
cd blink
```

　makeします。

```
make -j4
[  0%] Building ASM object pico-sdk/src/rp2_common/boot_stage2/CMakeFiles/bs2_default.dir/boot2_w25q080.S.obj
[  0%] Creating directories for 'ELF2UF2Build'
[  2%] Linking ASM executable bs2_default.elf
[  2%] Built target bs2_default

。。。

[ 97%] Building C object blink/CMakeFiles/blink.dir/home/pi/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj
[100%] Linking CXX executable blink.elf
[100%] Built target blink

```

　　ラズパイのデスクトップにPico（PRI-RP2）をマウントするために、BOOTSELボタンを押したままUSBケーブルをつなげました（抜き差し）。
　できたblink.uf2をPRI-RP2ドライブへドロップします。
![w104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/54f44edf-2c1e-86ff-45cc-428aba88e86c.png)

　LEDが点滅し始めます。
【Git】バージョン管理をする理由

バージョン管理を行わなければアプリケーションが動かないというわけではないですが、
バージョン管理をしておけば、コードの履歴を追ったり、削除してしまったファイルを復旧できたりします。

【コマンド】

【変更のあった全てのファイルを追加】

```
git add -A
```
このコマンドを実行すると、現在のディレクトリにあるファイルが全て追加される.
.gitignoreに記載されているパターンにファイル名が合致するファイルは追加されない。

【削除】

```
rm -rf
```

rmは対象のファイルを削除するコマンド

-rf =
(recursive)
サブディレクトリやその中のファイルも全て削除する

(force)
削除して良いかどうかを確認しない
を指定するオプション

【復旧】


```
git checkout -f
```
削除前のディレクトリとファイルを復旧する
【Flutter/ iOS】CocoaPods could not find compatible versions for pod の対策

## 概要
依存関係が変わった時（pubspec.yaml変更時）にビルドすると `CocoaPods could not find compatible versions for pod`が出てビルドに失敗するときの対策です。

## 解決方法
Podfile.lockを削除して、依存ライブラリをインストールし直すと解決しました！

```
cd ./ios && rm -rf ./Podfile.lock && pod install --repo-update
```
サルでもわかるCOMP-3（パック１０進数）

#COBOLエンジニアへ送るCOMP-3
COBOLエンジニアの方々、こんにちは。
本記事は、COBOLに触れて間もない方が、確実にぶち当たるであろう、COMP-3について解説いたします。
ただし、ここでは文字コードはEBCDICとします。

#目次

1. [COMP-3とは？](#anchor1)
2. [COM-3をもう少し詳しく](#anchor3)
3. [COM-3の桁数計算方法](#anchor3)
4. [COMP-3の末尾の「C」の意味](#anchro4)


<a id="anchro1"></a>

##COMP-3とは？
まず、COMP-3がなんなのか、ざっくり説明いたします。
COMP-3とは、COBOLで数値を宣言するときに使われるます。
このとき、変数用に確保される領域を削減する宣言方法です。
要は、__領域の節約__ですね。

<a id="anchro2"></a>

##COM-3をもう少し詳しく
COBOLで、いわゆる変数を定義するときには、大別して「文字」と「数値」があります。
文字であれば、X
数値であれば、9
で宣言しますね。
このとき、例えば、「123」を「9」で宣言した場合、16進数では、
F1F2F3
となります。
（なぜ、Fなのかは、文字コード表を見てください。）
このとき、各桁は1Byteで表現されます。
つまり、桁数＝Byte数、ということになりますね。
パット見てわかるように、桁数が大きくなるほどバイト数も比例して大きくなります。
1桁ごとに無駄に「F」が表記されるので、正直無駄ですね。
このムダを省くために使われるのが、COMP-3です。
COMP-3で「123」を表現すると、次のようになります（16進数）。
123C
これは、2Byteですね。
（末尾のCの意味は後述。）
よって、「9」から、COMP-3にすることで、1Byteの節約になりました。
例では、たった1Byteの削減ですが、これが桁数が大きくなるほど効果的になります。
例えば、10進数で10桁の場合、
9　→　　　  10Byte
COMP-3　→　6Byte
こうなります。
4Byteの節約になりましたね。

<a id="anchro3"></a>

###COM-3の桁数計算方法
COM-3では、上述のように、桁数を削減できることがわかりました。
では、10進数のときの桁数が、実際は何桁に削減されるのか、計算方法を学んでみましょう。
計算式は至ってかんたんです♪

```math
（桁数）/2+0.5　の小数点以下繰り上げ
```
です。
例えば、123（10進数）なら、
3桁 / 2 + 0.5 = 2.0 =>　2Byte
1234（10進数）なら。
4桁 / 2 + 0.5 = 2.5　=>　3Byte
となります。
かんたんですね。

<a id="anchro4"></a>

###COMP-3の末尾の「C」の意味
COMP-3で宣言したとき、16進数で見ると、必ず末尾に「C」もしくは、「D」が入ります。
「えっ、Dはどこからでてきたの？？」という方、安心してください。
ここで初めて言いました。これから説明します。
簡単に言いましょう。
C　=>　正の数
D　=>　負の数
ということです。
123Cなら、2Btyeの正の数、123
01234Dなら、3Byteの負の数、1234
です。
これは、「なんで？」とは考えず、そういうものだとして覚えてください。
別に知らなくても実務レベルでは全く問題ないです。（きっと）
#ADX2 ロボット機能でビルドファイルをUnityへコピーするだけ

#はじめに

UnityでADX2を使う場合、ACF,ACB,AWBを適切な場所へコピーする作業が必要で、これ手作業でやるとミスとかしそうなので、python でコピーするものを作って使っていたのですが、それを[ADX2ロボット(CRI Atom Craft ロボット機能)](https://game.criware.jp/manual/adx2_tool/latest/criatom_tools_atomcraft_api.html)に移植してみました。

非常にシンプルなので、ADX2ロボットで最初に動かしてみるサンプルとして良いかもしれません。

導入方法などは[こちらの記事「ADX2ロボット機能を使ってみる備忘録」](https://qiita.com/tatmos/items/f33756ab5035b22190db)を参照ください。

#スクリプト

実行すると、ファイルの存在確認をして、あればコピー処理をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/37097fd3-69bb-2b6d-1fd7-2b3475a0eb8e.png)

コピーに失敗するとNGと表示されます。

Pathについては、各プロジェクトごとに適宜修正してもらえればと思います。

``` CopyToUnity.py
# --Description:[tatmos]ACF,ACB,AWBをUnityへコピーします。
import sys
import cri.atomcraft.project
import cri.atomcraft.project as acproject
import cri.atomcraft.debug as acdebug
import os
import shutil

srcPath = "C:/MyDearest/github/CraftData/Megalith/PC/"
dstAcfPath = "C:/MyDearest/github/Megalith/Assets/StreamingAssets/adx2/"
dstAcbPath = "C:/MyDearest/github/Megalith/Assets/StreamingAssets/adx2/"

if(os.path.exists(srcPath)):
    acdebug.log("srcPath OK");
if(os.path.exists(dstAcfPath)):
    acdebug.log("dstAcfPath OK");
if(os.path.exists(dstAcbPath)):
    acdebug.log("dstAcbPath OK");

acfAcbAwbNameList = ["BGM.acb","BGM.awb",
                     "SE.acb","SE.awb",
                     "VOICE_ja.acb","VOICE_ja.awb",
                     "VOICE_en.acb","VOICE_en.awb",]

# ACFファイルコピー
shutil.copyfile(srcPath + "Megalith.acf", dstAcfPath + "Megalith.acf")

# ACBファイルコピー
for acfAcbAwbName in acfAcbAwbNameList:
    shutil.copyfile(srcPath + acfAcbAwbName, dstAcbPath + acfAcbAwbName)
    if(not os.path.exists(srcPath + acfAcbAwbName)):
        acdebug.warning(srcPath + acfAcbAwbName + " NG");
    if(not os.path.exists(dstAcbPath + acfAcbAwbName)):
        acdebug.warning(dstAcbPath + acfAcbAwbName + " NG");
``` 

#注意点
- ファイルのパスを直接書いているので、環境ごとに書き換えが必要です。適宜パスを書き換えてください
- ACFのコピーを別にしているのは、一時期ACFだけ配置を変えたことがあっただけで、まとめてしまっても問題ない。（名残から変数名がちょっと雑ですが気になる人は直して使ってください）
- 毎度内容比較もせずコピーするので、バージョン管理などで差分をみて間違いないかは確認した方が安全と思われます。（意図しないバイナリを間違ってマージしないように注意）

#おわりに
ロボット機能の使いどころ：
使っていて、ちょっとこれ手間だな・・・　というものをロボット化することが最大のメリットかもしれません。

ファイルのコピーとか
検索して選択とか
こういう頻繁に行う操作などもスクリプト化するメリットが高いと思います。

ここから、ADX2ロボット沼（CRI Atom Craftロボット沼）へはまっていく人が増えれば幸い。（他の人の作った便利機能とか見てみたい）
【Blockly】toolboxにテキストやボタンを配置する

![スクリーンショット 2021-02-07 9.15.13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549093/6cd25004-c305-f43f-89ec-ac314edb8400.jpeg)
## はじめに
定義したblockをXML形式に<block>タグをつけて書き込むことでtoolboxにブロックを配置することができます。この記事ではテキストやボタンを配置する方法、さらに配置したボタンに関数を定義して実行する方法を共有します。
## XMLにbuttonタグとlabelタグを追加する

<button>タグでボタンを、<label>タグでテキストを追加することができます。
<button>タグのtext要素には表示される文字が、callbackKeyには実行される関数を入力します。callbackKeyについては後述します。

```xml
<block type="definepoint"></block>
<button text="A button" callbackKey="myFirstButtonPressed"></button>
<label text="A label" web-class="myLabelStyle"></label>
```
実行結果はこんな感じになります。
![スクリーンショット 2021-02-07 9.15.13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549093/1d53094b-e7ca-dda0-b461-22a89715e03e.jpeg)

ちなみに点を作成するブロックは

```javascript
 Blockly.Blocks['definepoint'] = {
    init: function() {
      this.appendDummyInput()
          .appendField("点を作成する");
      this.setColour(230);
   this.setTooltip("");
   this.setHelpUrl("");
    }
  };
  Blockly.JavaScript['definepoint'] = function(block) {
    // TODO: Assemble JavaScript into code variable.
    var code = '...;\n';
    return code;
  };
```

のようにして作成しています。

## 関数を定義する
workspaceを書いているscriptタグの中身を確認すると、おそらく以下のことが書かれていると思います。

```html
<script>
          var counterOfPoint = 0
          var blocklyArea = document.getElementById('blocklyArea');
          var blocklyDiv = document.getElementById('blocklyDiv');
var demoWorkspace = Blockly.inject(blocklyDiv,
              {toolbox: document.getElementById('toolbox')});

```
そこを以下のように書き加え、変更します。

```html
<script>
var counterOfPoint = 0
var blocklyArea = document.getElementById('blocklyArea')
var blocklyDiv = document.getElementById('blocklyDiv');
var demoWorkspace = Blockly.inject(blocklyDiv,
              {toolbox: document.getElementById('toolbox')});

demoWorkspace.registerButtonCallback("myFirstButtonPressed",myFirstButtonPressed);//追加
function myFirstButtonPressed() {
  //行いたい処理を記述
  console.log('テスト')
}
```

これでtoolboxにボタンを配置し、任意の処理を実行させることができます。
M1 MacでAtom Matrixを使う(M5Stack,esp32)

M1 MacでM5stackの小さい版のAtom Matrixを使うためのメモ。結論としてはM1 MacでArduinoは使えるが、esp32系のM5StackやAtom Matrixはpython 関連のコマンドを実行する一手間が必要。

#環境
M1 MacBookAir
Atom Matrix
Type-Cケーブル接続

#手順
環境設定＞セキュリティ＞一般
「App Storeと確認済みの開発元からのアプリケーションを許可」にチェック

ATOM MatrixのUSBドライバをDLして、インストール
https://docs.m5stack.com/#/en/arduino/arduino_development
CP210x_VCP_MacOS.zipをDLし、
SiLabsUSBDriverDisk.dmgを解凍し、
Silicon Labs VCP Driver.pkgを実行
なんか失敗したと出る。もう一回インストールするが、もう出ない。なんだったのか？
↓これかもしれないが、気にせず進めて問題なかった。
https://support.apple.com/ja-jp/guide/mac-help/mchl768f7291/mac

Arduino(1.8.13)をDLしてインストール

Arduino＞Preferenceで「追加のボードマネージャのURL」欄に
https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json
を追加する


#ボードマネージャの設定
ツール＞ボード＞ボードマネージャで「追加のボード」で「ATOM」を検索し、M5Stack(1.0.7)をインストール
ツール＞ボード＞M5Stack Arduino＞M5Stack ATOMを選ぶ
ツール＞UploadSpeed＞115200を選ぶ
※古そうな資料には、M5StickCかESP32 Pico KITを選択（ただし、ESP Picoの場合、レートは115200を使うこと）とあるので、115200を使った方がいいかもしれないが、1500000でも問題なく動くし、転送時間もグッと短くなる。
ツール＞シリアルポート＞/dev/cu.usbserial-9156002393（数字は環境によって変わる）

#ライブラリマネージャの設定
ライブラリマネージャで「M5Atom」を検索し、M5Atom(0.0.1)をインストール
ライブラリマネージャで「FastLED」を検索し、FastLED(3.4.0)をインストール

※M5Stackの場合は「M5Stack」を検索し、M5Stack(0.3.1)をインストール

このままでは、ビルドに失敗する。原因はMacOS11にあるようで、OS的にはpython3がデフォルトになっているのに、Arduinoはpython2を求めるから、失敗するらしい。解決するには、ターミナルから、下記コマンドを実行しパスワードを入力。

```
sudo pip3 install --target /Library/Python/2.7/site-packages pyserial
```

WARNINGが出るが、とりあえず問題なさそう。

試しに
ファイル＞スケッチ例＞M5Atom＞Basics＞Buttomをビルドし、書き込む。
SPIとかFastLEDの赤い文字がたくさん出るが、それ自体は問題ない。
いつもの「何バイトになった」という白いレポートが表示されればOK。
その後、また赤い字で、何％という転送の様子が徐々に表示される。


#サンプルコード
加速度データを取得し、シリアルプロッタで表示するコードを示す。
シリアルプロッタは115200に設定しないと、文字化けして見れない。

```c:atomAcc.ino
#include "M5Atom.h"

float accX, accY, accZ;
float gyroX, gyroY, gyroZ;
float temp;

void setup() {
  M5.begin(true, false, true);
  M5.IMU.Init();
}

void loop() {
  M5.IMU.getGyroData(&gyroX, &gyroY, &gyroZ);
  M5.IMU.getAccelData(&accX, &accY, &accZ);
  M5.IMU.getTempData(&temp);

  Serial.printf("accX:%.2f,accY:%.2f,accZ:%.2f,temp:%.2f\r\n",accX,accY,accZ,temp);

  delay(20);
  M5.update();
}
```
![スクリーンショット 2021-02-07 9.01.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/fa34b941-d5b3-2afa-b165-06d20edfbf68.png)

スピーカが欲しい
この温度の30はなんだろうか？
室温は多分10度ぐらいだし、握っていると、じわじわと上昇して40以上にはなる。ICの熱か？とにかく、気温を測ることには使えない。おそらく、ICが熱で壊れないように、チェックするためのものだろう。
Creating default object from empty valueの解決方法

Laravel初学者です。
オリジナルアプリを作成しているのでその過程を記事にしています。

理解が曖昧なところも多いため、ご指摘等ありましたらご連絡いただければ幸いです。

今回は
`Creating default object from empty value`
が出たのでその解決方法を記録として残します。


## 環境

|                | Version     |
|:---------------|------------:|
| PHP            | 7.4.14      |
| Laravel        | 8.24.0      |
| mysql          | 8.0.23      |
| docker         | 20.10.2     |
| docker-compose | 1.27.4      |

## エラー発生

投稿を保存する機能の実装中に
`Creating default object from empty value`とエラーが出ました。
下記が今回の原因のコントローラーです。

```PHP:app/Http/Controllers/GameController.php
public function store(Request $request)
    {
        $input = $request->only('name', 'describe', 'image_path');
        
        $game = new Game();
        $game->name = $input["name"];
        $game->describe = $input["describe"];

        $image = $request->file('image');
        $path = Storage::disk('s3')->putFile('bgama32070', $image, 'public');
        $post->image_path = Storage::disk('s3')->url($path);
        
　　　　　$game->save();

        return redirect('/');

    }
```

おかしなところがありますね。
これに気づかず2時間くらい無駄にしました...

## 解決方法

[こちら](https://qol-kk.com/wp2/blog/2020/10/17/post-2099/)の記事を参考にさせていただきました。
ありがとうございます！

今回のエラーである
`Creating default object from empty value`は
`未定義の変数にプロパティを追加すると発生する`のだそうです。

定義していない場所を探して見つけました。

```PHP:app/Http/Controllers/GameController.php
$post->image_path = Storage::disk('s3')->url($path);
```

上記の部分ですが、その上で`$game = new Game();`としているのになぜか`$post`になっています。
これは記述をした際に参考にした記事のまんま何も考えずにコピペしたからこうなっています。
理解できていないのでおきたエラーでした。

```PHP:app/Http/Controllers/GameController.php
$game->image_path = Storage::disk('s3')->url($path);
```

`$game`と直して解決です。

このエラーはスペルミスとか、単数形か複数形かの書き間違いでもよくおきるみたいなので
勉強になりました。
Node.js: JWT のペイロード部をデコード

次の記事を参考にしました。
[JWTクレーム・セット部分のデコード方法](https://qiita.com/hoshimado/items/615173e1cdb37a597aa0)

```js:decode_jwt.js
#! /usr/bin/node
// ---------------------------------------------------------------
//	decode_jwt.js
//
//					Feb/07/2021
//
// ---------------------------------------------------------------
'use strict'

const fs = require("fs")

// ---------------------------------------------------------------
var atob = (base64) => {
	const buffer = Buffer.from( base64, 'base64' )
	const utf8 = buffer.toString('utf8') // Not "ascii"

	return utf8
}

// ---------------------------------------------------------------
var decodeJwt = (token) => {
	const base64Url = token.split('.')[1]
	const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/')

	const encodeURI = encodeURIComponent(atob(base64))
	const decodeString = decodeURIComponent(encodeURI)

	return JSON.parse(decodeString)
}

// ---------------------------------------------------------------
console.error ("*** 開始 ***")

const file_token = process.argv[2]

if (fs.existsSync(file_token))
	{
	const str_token = fs.readFileSync (file_token,'utf8')

	var jsonObj = decodeJwt(str_token)
	console.log(jsonObj)
	}

console.error ("*** 終了 ***")
// ---------------------------------------------------------------
```

実行方法

```bash
./decode_jwt.js token01.txt
```
[Git] 今いるブランチを入力せずにPushをする方法！

```terminal:従来の方法
git push origin ＜ブランチ名＞
```
今まで、上記のような手段でPushを行っていましたが。

下記のような手段で、今いるブランチを参照してpushしてくれます

```terminal:新しい方法
git push origin @
```

ブランチ名が多くなると、今いるブランチを把握しないといけないのでこれはめちゃめちゃ便利！

# 動作環境
git version 2.30.0
vue(nuxt)でiframelyの埋め込み要素を描画する

# 参考

https://iframely.com/docs/embedjs
https://blog.mintsu-dev.com/posts/2020-05-23-nuxt-spa-twitter-share/

# やり方

```nuxt.config.js
export default {
  head: {
...
    script: [
      { src: '//cdn.iframe.ly/embed.js', async: true}
    ]
...
  },
...
```

```vue
  mounted() {
    if (iframely) {
      iframely.load();
    }
  },
```
MIME タイプについて確認した時のメモ

メモです。

# MIME タイプとは

以下が詳しい。

[MIME タイプ (IANA メディアタイプ)](https://developer.mozilla.org/ja/docs/Web/HTTP/Basics_of_HTTP/MIME_types)

抜粋

+ メディアタイプ (別名 Multipurpose Internet Mail Extensions または MIME タイプ) は、文書、ファイル、またはバイト列の性質や形式を示す標準
+ RFC 6838 で定義され、標準化されている
+ もっとも単純な MIME タイプはタイプとサブタイプで構成されている
+ これらはどちらも文字列で、その間をスラッシュ (/) で接続し、 MIME タイプを構成する。「タイプ/サブタイプ」という形式
+ 例えば、 MIME タイプが text の場合、サブタイプは plain (プレインテキスト)、 html (HTML ソースコード)、 calendar (iCalendar/.ics) ファイルなどになる(text/plain,text/html などの表記)

ざっくり理解するには以下も図などがあって参考になった

[text/html【MIMEタイプ】](https://wa3.i-3-i.info/word15789.html)

# 検証してみる

## HTTP リクエスト・レスポンスで見てみる

実際に HTTP リクエスト・レスポンスで使われている部分を見てみる。

```
$curl -v https://www.google.co.jp
・・・(一部略)

> Host: www.google.co.jp
> User-Agent: curl/7.61.1
> Accept: */*
>
* Connection state changed (MAX_CONCURRENT_STREAMS == 100)!
< HTTP/2 200
< date: Sat, 06 Feb 2021 20:59:28 GMT
< expires: -1
< cache-control: private, max-age=0
< content-type: text/html; charset=Shift_JIS
< p3p: CP="This is not a P3P policy! See g.co/p3phelp for more info."
< server: gws
< x-xss-protection: 0
< x-frame-options: SAMEORIGIN
（以下略）

```

リクエストでは `Accept` ヘッダで使われている。

[Accept](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Accept)

上記例では、「Accept: \*/*」となっており、すべての MIME タイプを意味するので「クライアントは どの MIME タイプでもレスポンスしても良い」ということを意味する。

レスポンスでは `Content-type` ヘッダで使われている。

[Content-Type](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Content-Type)

上記例では「content-type: text/html」となっており、レスポンスが「text/html」であることを表している。

## file コマンドで確認する

Linux では `file` コマンドで MIMEタイプが確認出来るようだった。

[How can I find out a file's MIME type (Content-Type)?](https://stackoverflow.com/questions/2227182/how-can-i-find-out-a-files-mime-type-content-type)

こちらについても確認

```bash
# text/html の場合
$wget https://www.google.co.jp
$file --mime-type index.html
index.html: text/html

# image/png の場合 
$wget https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Google_2015_logo.svg/500px-Google_2015_logo.svg.png
$file --mime-type 500px-Google_2015_logo.svg.png
500px-Google_2015_logo.svg.png: image/png
```
Windowsデバイスドライバプログラミング　勉強記録1

__※本記事は勉強しつつ書いていますので、不正確な情報が含まれる可能性がありますので予めご了承ください。__

#テキスト

__書籍__


[Windows Vistaデバイスドライバプログラミング ](https://www.amazon.co.jp/Windows-Vista%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E6%B5%9C%E7%94%B0-%E6%86%B2%E4%B8%80%E9%83%8E/dp/4797343222)
この書籍をメインでやりつつ、下記のページで補足参照しながら進める予定。
以下、「テキスト」と書いた場合、本書籍を指す。

![51REA+ahW+L._SX392_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067094/410398da-9b58-a481-eeb0-80b0f6a7fe9d.jpeg)

Windows Vista版であるが、Window10でも使用できるみたい。
逆にWindows XP版の書籍の場合は、Vistaから取り入れられた新しいフレームワークに対応できない。
日本語の類書でWindows10のものはみあたらなかった。

__Webページ__
[誰でもわかるデバイスドライバ講座](https://sciencepark.co.jp/device_driver/dvdr/)



#勉強の流れ

〇WDMの基本、環境構築
WDM(Windows Driver Model): WindowsXPからある従来のドライバモデル（フレームワーク）。Windows98はフレームワークが異なった。
↓　
〇USBストレージデバイスの使用
書籍ではUSBのドライバの事例として扱っている
↓ 
〇マイクロソフトのサンプルプログラムを読んでみる
もしかしたら前倒しするかもしれないです。実際にサンプルを読んで、出来たら動作やコードを修正してみたりして
より深い理解につなげたい。
↓　
〇KMDFの基本
↓
〇KMDFの基本
KMDF(Kernel Mode Driver Model Framework): WDMを使いやすく定型処理をライブラリとしてより高度な機能を提供するフレームワーク
イメージとしてはWin32 APIに対するMFCのような認識。
↓
〇UMDFの基本
UMDF(User Mode Driver Model Framework): 実際のデバイス制御をおこなうカーネル部と通信を行うことにより機能を実現する、ユーザモードのフレームワーク
↓
〇実践（未定）


#デバイスドライバの定義

デバイスドライバはアプリケーションに抽象化したインタフェースを提供する。
デバイスドライバはOSに定められた関数の仕様(インタフェース)に基づき、各デバイスを制御する実際の機能を実装するソフト

[?]OSがオブジェクト指向でいう抽象クラス(インタフェース)を定めて、それを継承して実際の機能の実態をデバイスドライバが
実装している感じか？

<!-- ※実際にはデバイスドライバの1つ上位にはOSの入力装置マネージャの仕様に従った機能を提供する。
I/Oマネージャがさらに上位に抽象化したインタフェースを提供する。

I/Oマネージャは、おそらく以下のものを言っているのだろう。今後、出てくるものなので深追いはしない。
[Windows カーネルモード I/O マネージャー](https://docs.microsoft.com/ja-jp/windows-hardware/drivers/kernel/windows-kernel-mode-i-o-manager)
-->

#ソフトウェアの階層構造

C言語のgetchar()の例

`-----------------`
[アプリケーション]　
getchar()呼び出し
`-----------------`
[OS]標準ライブラリ
`-----------------`
[OS]Inputマネージャ
`-----------------`
[デバイスドライバ]
※各デバイスごとに
実装（キーボード等）
`-----------------`

#デバイスドライバの階層構造

USBキーボードの例

`-------------------------------`
USBキーボード
ファンクションドライバ: 
（上位のデバイスドライバ）
`-------------------------------`
USB　バスドライバ
（下位のデバイスドライバ）
`-------------------------------`
USBコントローラ
`-------------------------------`
キーボード
`-------------------------------`

ファンクションドライバ: 
データ転送など制御依頼をバスドライバに依頼する。以下の種類がある。

　・クラスドライバ  ※
　　（OSと連携して動作する）

　・ベンダードライバ　※ <= テキストで扱うのはこれ
　　(OSではなく専用アプリケーションと連携) 
　※テキスト独自の用語らしい。

バスドライバ：
ファンクションドライバの依頼を受けてハードウェア（入力装置に組み込まれるコントローラ）を制御する
Rails スマホ用の画面下部にあるメニューバーの実装【Instagramにあるようなやつ】【初心者向け】

## 環境
Rails5

## 実装イメージ
InstagramやTwitterをスマホで使う際にあるメニューバーを実装します。
↓こんな感じのやつです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/989457/8b17b3f8-4537-8553-1e23-b0acd2384735.png)


実装時、参考記事が見つかりませんでしたので、
初心者オリジナルになりますが、投稿します。
ベターな方法があればご指摘頂けますと幸いですm(__)m

## 実装
この記事ではBootstrapとCSS両方使っています（CSSだけでも出来ます）。
下記3点で実装します。

- メニューバーの作成
- メニューバーを画面下に固定
- レスポンシブでスマホサイズの時だけ表示


### メニューバーの作成
ここに関してはヘッダーのメニューバーとほぼ同じで問題ないと思います。
ごちゃごちゃしておりますが…僕はこんな感じにしてみました。
※リンク判定範囲が広く、タップした際に一瞬ホバーするようにBootstrapを指定しています。

```ruby:_mobile_nav.html.erb
    <ul class="w-100 shadow-lg list-unstyled list-group list-group-horizontal text-center">
      <button class="mx-auto list-group-item list-group-item-action">
        <%= link_to ○○_path do %>
         <p>アイコン、画像など</p>
        <% end %>
      </button>
      <button class="mx-auto list-group-item list-group-item-action">
        <%= link_to ○○_path do %>
        <p>アイコン、画像など</p>
        <% end %>
      </button>
      <button class="mx-auto list-group-item list-group-item-action">
        <%= link_to ○○_path do %>
        <p>アイコン、画像など</p>
        <% end %>
      </button>
      <button class="mx-auto list-group-item list-group-item-action">
        <%= link_to ○○_path do %>
        <p>アイコン、画像など</p>
        <% end %>
      </button>
    </ul>
```


### メニューバーを画面下に固定
Bootstrapで .fixed-bottom を指定すれば画面下固定が可能です。

```ruby:_mobile_nav.html.erb
#fixed-bottomを追加
    <ul class="fixed-bottom w-100 shadow-lg list-unstyled list-group list-group-horizontal text-center">
```



### レスポンシブでスマホサイズの時だけ表示
最後ですが、CSSで指定しました。

```scss:application.scss
//width544p以下の時に適用される
@media screen and (min-width:544px) {
  .bottom-nav {
    display:none;
  }
```
スマホサイズの時だけ表示 というより、スマホサイズ以外の場合は消えるという記述にしています。
つまり、『デフォルトでは表示されて、スマホサイズ以外では消える』という設定です。

理由としては、display:none;を使って、表示させる際にdisplay:block;を使うと、
インライン要素であるべき部分も変更されてしまい、レイアウトが崩れてしまうためです。

```ruby:_mobile_nav.html.erb
#bottom-navを追加
    <ul class="bottom-nav fixed-bottom w-100 shadow-lg list-unstyled list-group list-group-horizontal text-center">
```
これで完成です！
よく考えると、特にRailsの内容ではないですね…(^^;)
OpenSSL 証明書作成 with 中間CA

ルートCA・中間CAまで含めたオレオレ証明書を作りたくなった時の備忘。多分動くと思う。


# ルートCAの建造
```bash
mkdir -p /etc/pki/CA/newcerts
touch /etc/pki/CA/index.txt
echo 01 > /etc/pki/CA/serial
```
opensslがどうしても作業環境に依存してしまうため、最低限作業場所を整える。
Centos8の場合はこれだけやっとけば諸々生成できるようになった。SHAとかの細かい設定はしらんです。

署名時にindex.txtとの突合して同名の証明書定義あるとエラー出るっぽいので

```bash
:> /etc/pki/CA/index.txt
```
を思い立ったタイミングで実行してきれいにしておく。

# ルートCA証明書・鍵の作成

```bash
openssl req -new -keyout rootCA.key -out rootCA.csr
openssl x509 -req -days 9999 -signkey rootCA.key -in rootCA.csr -out rootCA.crt
```
以下を生成。`-days XXXX`で有効な日数を指定。ルートなので長いほうがよさそう。

- ルートCA鍵：rootCA.key
- ルートCA証明書要求：rootCA.csr
- ルートCA証明書：rootCA.crt


実行時の以下入力欄は証明書に署名する時必須っぽいので、さぼらずに記入すること。


- Country (国名)
- State (都道府県名)
- Locality (市区町村名)
- Organizational Name (組織名)
- Organizational Unit (部門名)
- Common Name (コモンネーム)

※` -subj "/C=JP/ST=Tokyo/L=hoge/O=fuga/OU=piyo/CN=moge"`みたいな形で実行時オプションとしても定義可能。


# 中間CA証明書の作成
```bash
openssl req -new -keyout midCA.key -out midCA.csr
openssl ca -days 9999 -keyfile rootCA.key -cert rootCA.crt -in midCA.csr -out midCA.crt
```
中間CAはさみたくない場合はこれをそのまま証明書として利用しちゃえばよさそう。

# 証明書の作成

```bash
openssl req -new -keyout myCert.key -out myCert.csr
openssl ca -days 9999 -keyfile midCA.key -cert midCA.crt -in myCert.csr -out myCert.crt
```
中間CAで署名して証明書を作成。
「EBSとは」（バイリンガル）

<H1>EBSとは （什么是EBS）</h1>
<p>
EBSはEC2のストレージの一つ。<br>
イメージ的：EC2の外付けのHDD的サービス<br>
※EC2が利用するストレージはインスタンスストアとEBSの２種類です。
<br>
<br>
中：
EBS是EC2储存方式的一种。（可以理解为EC2的外置储存服务。）<br>
※在EC2中所用到的2种储存分别是，EC2的实例储存和EBS。
<br>
<br>
<strong style="font-size: 17px; color: #2b2301;">二者の違い（两者的区别）</strong>

<table>
<thead>
</thead>
<tr>
<td>Name</td>
<td>Japanese</td>
<td>Chinese</td>
</tr>

<tbody>
<tr>
<td>Instance Store</td>
<td>
・EC2の物理ストレージ<br>
・一時的なデータ<br>
・無料</td>
<td>
・物理储存<br>
・数据暂时性<br>
・免费</td>
</tr>

<tr>
<td>EBS</td>
<td>
・EC2と独立管理<br>
・EC2が停止しても、EBSは保持可能<br>
・有料
</td>
<td>
・跟EC2分开管理<br>
・EC2停止运行了，EBS的数据依旧存在<br>
・课金
</td>
</tr>
<tbody>
</table>
</p>

<h2>EBSの特徴（EBS的特征）</h2>
1.一つのEC2に複数のEBSが存在可能。
2.複数のEC2は一つのEBSにアタッチ不可。
3.他のインスタンスにアタッチ可。
4.別のAZにあるEC2インスタンスにアタッチ不可。

中：
1个EC2里面可以存在多个EBS。但是，多个EC2不能指定同个EBS。
EBS可以配置到同个AZ里面的EC2，跨AZ的话就不行。

<h2>終わりに</h2>
ご覧いただきありがとうございます。
お疲れ様でした〜

中：
谢谢观看～
Gem::Ext::BuildError: ERROR: Failed to build gem native extensionはXcodeが関わっていた

結論から述べると、Xcodeのライセンス認証ができていないのが原因でHomebrewが使えてなかったためです。

僕の場合は、bundle installした際にエラーが出ました。

タイトルのエラーだけでなく、

```
Could not find gem 'puma (= 4.3.6)' in any of the gem sources listed in your Gemfile.
```

この他にも、ターミナル上でエラー文が表示されていました。


「Xcodeがなぜ、railsでエラー！？」と思いましたが、調べていると、Xcodeは何かしらでエラーに絡んでくる場合があるそうですね、、、汗

Xcodeを入れてから、久々にRailsを触るとエラーが出ていたので、エラー解決にかなり時間がかかりましたが、忘れないうちに記事にしておきます。

早速ですが、このコマンドでXcodeのライセンスに同意する形になります。

```
sudo xcodebuild -license
```



そして、上記のコマンド実行後にenterを押し、同意の場面で「agree」と入力することで認証されます。

色々と模索してやっと、解決にたどり着けて良かったです。

是非、参考にしてみてください！
アイデアを思いつくには from エンジニアの知的生産術(マイピックアップ)

「[エンジニアの知的生産術](https://www.amazon.co.jp/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E7%9F%A5%E7%9A%84%E7%94%9F%E7%94%A3%E8%A1%93-%E2%80%95%E5%8A%B9%E7%8E%87%E7%9A%84%E3%81%AB%E5%AD%A6%E3%81%B3%E3%80%81%E6%95%B4%E7%90%86%E3%81%97%E3%80%81%E3%82%A2%E3%82%A6%E3%83%88%E3%83%97%E3%83%83%E3%83%88%E3%81%99%E3%82%8B-WEB-PRESS-plus-ebook/dp/B07JFRF6MW/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2GRDGUXMBTF82&dchild=1&keywords=%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E7%9F%A5%E7%9A%84%E7%94%9F%E7%94%A3%E8%A1%93&qid=1608975046&sprefix=%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E7%9F%A5%E7%9A%84%2Cstripbooks%2C272&sr=8-1)」を読み、今の自分にとって大切な考え方をピックアップ!

# 第6章. アイデアを思いつくには

アイデアを思いつくタスクは3つのフェーズで構成される

- 「耕す」(情報を集め、つながりを見出すフェーズ)
- 「芽生える」(情報を寝かせて、思いつくのを待つフェーズ)
- 「育てる」(生まれたアイデアを磨き上げるフェーズ)

##「芽生え」は管理できない

アイデアが芽生えるかどうかは運!(待てば必ず芽生えるわけではない)

↓なので

アイデアを生み出す仕事をする場合、**<font color='orange'>アイデアが芽生えないことを想定して計画を立てる必要がある!!<font>**

例えば、
 1週間後に新しいアイデアについてプレゼンをしないといけないケース。

良いアイデアが生まれることを前提として計画すると、芽生えなかったときにストレスになる。そうはせず、**予定期間内にアイデアが芽生えなかった場合には不完全なアイデアで育てるフェーズに進むように計画しよう!!**

アイデアが芽生えるのを待って時間を使いつくすと、アイデアを育てる時間が無くなる。
→ <font color='orange'>締め切りから育てるのに必要な時間を引いて、いつまで芽生えを待てるのかを自分で期限を決めることが最善<font>


## アイデアを磨き上げる

### 知識の少ない人からも学ぶことが出来る

顧客に製品を見せた際に酷評されたとする。顧客の意見を聞かず自分視点で製品を説明して顧客にお金を払ってもらった場合、<font color='red'>それは売上に付与するが、アイデアのブラッシュアップには付与しない<font>

### アイデアは積極的に見せるべし

良いアイデアを発信することは、見た人を刺激してその人が積極的にフィードバックをくれる。
→ **アイデアは発信して磨かれる!**
Redux辛い

# いろいろ辛い
なんで同じようなコードを書かされるんだろう。
redux-toolkitが出てきてましになってはいるようだけど。

```js:
const dispatch = useDispatch()
useEffect(() => dispatch(actionCreator()), [dispatch])
```

dispatchは、store.dispatchで変わらない。
いっそのこと、useDispatchをつかわず、store.dispatchをexportしてそれを参照してしまえば早いじゃんとも思う。
さらに、actionCreatorとbindさせると、それを呼ぶだけになるのに。
なんか困ったことになるんだろう。

その「困ったこと」が解決できるか、起きないか、我慢できるなら、簡単に楽できた方がいいじゃんという気がする。
Shopify sectionに表示有効期限をつける

## この記事でできるようになること
ShopifyのTopページを構成するセクションへ管理画面のテーマのカスタマイズから表示有効期限を設定し、
期限が切れたら非表示にするような実装を行える様になる

## はじめに
Themeの詳しい話には触れません。

以下のアプローチで非表示を制御します

- theme 編集画面では適当にフォーマットされている日時を入力する
- section側では↑の文字列をパースして秒に換算し、それを現在時刻と比較して表示/非表示を制御する


#### 表示期限入力フォームを作る
sections/配下の非表示対応をしたいファイルのschemaへ
以下の設定を追加しましょう(schema.settingsに以下のobjectを足す)

本当はカレンダーみたいなのがあると嬉しいのですが、
そういうtypeが今現在はなさそうなので文字列で設定するようにします。
設定可能なtypeについての公式ページ → https://shopify.dev/docs/themes/settings


```json
{
  "type": "text",
  "id": "display_limit_time",
  "label": "表示期限 YYYY/MM/DD HH:MM",
  "default": "2040/01/01 01:00"
}
```
これで↓のフォームがテーマカスタマイズ時に表示されるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268490/861acc3e-7f58-aa50-969f-b1e5063fcf63.png)


#### sectionの表示非表示を制御する
sectionに追加したobjectのidをdisplay__limit_timeにしたので、
`section.settings.display_limit_time` という形でliquid上で値を参照できます。

https://shopify.github.io/liquid/filters/date/

> To get the current time, pass the special word "now" (or "today") to date:

と書いてあり、現在時刻はnowと使えば取れそうなのでこれを設定した日付と比較し、表示フラグ変数を作ります。

```liquid
{% assign current_time = 'now' | date: '%s' %}
{% assign setting_limit_time = section.settings.display_limit_time | date: '%s' %}

{% assign displayable = true %}
{% if current_time > setting_limit_time %}
  {% assign displayable = false %}
{% endif %}
```

これで、section上でdisplayableの値を見れば、
設定した時間を過ぎているかどうかが確認可能です。

適当に

```liquid
{% if displayable %}
... sectionのHTMLの全体
{% endif %}
```

と囲んであげれば無事目的達成です。

おわり
「EC2とは」  （バイリンガル）

AWSの勉強をし始めました！
その学習記録を<strong>QIITA</strong>に記載させていただきます！
間違い等ございましたら、ご指摘いただけますと幸いです:raised_hands_tone2:

中：
我将会在QIITA上记录关于AWS的学习笔记。
如果学习笔记里有错误的地方，请指教哟～

<H2>EC2とは （什么是EC2？）
<p>
EC2の正称：Amazon Elastic Compute Cloud (Amazon EC2)
IaaSのクラウドサービスです。簡単に言うと、多種の仮想サーバーを構築するのが可能です。
EC2はAWSのコア部分であり、多くのAWSサービスに関わります。
EC2の単位はインスタンスと呼ばれます。任意のAZにインスタンスを立ち上げてサーバーとして利用します。
</p>

<p>
中：<br>
EC2的全称是Amazon Elastic Compute Cloud (Amazon EC2)。是一个Iaas云服务。
简单地说，EC2是一个能够提供多种类型的虚拟机。
EC2是AWS的核心部分，与AWS的多个服务有关联。
EC2的单位是Instance(中文：实例)。可以在任意的AZ（Availability Zones）里搭建服务器。
</p>

<H2>EC2のセッティング手順（EC2的设定方法）
<p>
step1: Select AMI(选择AMI)
step2: Select Instance Type（现在实例类型）
step3: Configure Instance（创建实例）
step4: Add storage（选择储存类型）
step5: Configure Security Group（配置安全组）
step6: Set up SSH Key Pair（创建秘钥对）

上記のステップを完成したら、EC2の画面に戻り、インスタンスの設定状況を確認します。もし設定成功だったら、Instance Stateで「running」が表示されます。

中：
以上步骤完成之后，回到EC2页面确认实例情况。如果显示<strong>running</strong>，则表示创建成功。

参考資料：
1.<a href="https://aws.amazon.com/jp/ec2/instance-types/">Instance Type</a>

</p>

<H2>EC2のメリット（EC2的优点）
<p>
1.簡単なスペック変更。（能简单更改性能)
2.従量課金によるコスト。（按需收费）
3.構築に手間がかからな。（不需要繁琐的搭建手续）
4.冗長化も簡単に行える。（系统冗长性也可以简单的搭建）
</p>


<H2>終わりに
<p>
EC2についての学習メモは以上となります。
ご覧いただきありがとうございます。お疲れ様でした〜

中：
以上就是关于EC2的学习笔记啦！
谢谢观看～
<p>
Vue Router とインスタンス化の自己解釈

#Vue Routerとは？
Vue RouterとはSPA（シングルページアプリケーション）を構築するライブラリである。
では、シングルページアプリケーションとは何か？というと初めに１つのHTMLをロードすると、それ以降はユーザーとのインタラクティブ、言い換えると、ユーザーの操作や相互作用でAjaxで情報を取得し、動的にページを更新するWebアプリケーションである。

この時の非同期通信やViewのレンダリングなどを担ってくれるのがVue Routerである。

##ルーターインスタンスとインスタンス化とは？

インスタンス化はそのデータや機能を使うために定数や変数を定義して置き換える作業をインスタンス化と言う。

つまり、ルーターインスタンスとはルーター（Vue Router）に対して行うインスタンス化のことである。

```vue:index.js
const router = new VueRouter({
  mode: "history",
  base: process.env.BASE_URL,
  routes,
});

 .
 .
 .
export default router;
```

exportで他のファイルでのVue Routerの機能がrouterというインスタンス名を使うことで使えるようになっている。

Vue Routerでは`＄router`にvue Routerの機能が収納されているので、そこにpushメソッドを利用する。

そのため、`this.$router.push`でページ遷移を行うことができる！

##Vueインスタンスとは？

vueインスタンスとはvue.jsの機能を使うためにnewを用いて生成されたオブジェクトのことである。

つまり、上のインスタンスかをvue.jsの機能のために用いているということである。

```vuejs:main.js
new Vue({
  router,
  render: h => h(App)
}).$mount('#app')
```
`$mount`で`App.vue`にある`<div id="app">`のappにくっつけるというイメージである。。
TypeScriptで何か書くときの最初の設定メモ

TypeScriptについてだと、設定（ `tsconfig.json` とか）やコンパイル体制などが必要で、JavaScriptのように、単にエディタとかでJSファイル作ればそれでいい、とはならない（とはいえプロジェクトなら素のJSでもモノによってはNodejsの設定とか必要だが）
が、始める時に毎回いちいち書籍とか関連サイトとか巡ってコード引っ張ってきたりするのも面倒なので、ここにとりあえずこれ打ち込んでおけばOKのメモを記録しておきます

…本当なら自分の頭に記憶していくのが一番いいが、自分の記憶力は壊滅レベルなので

このあたりの手順については、既に書籍やWeb上に色々書いてあると思いますが、今回書く手順についてはオライリー・ジャパンの「プログラミングTypeScript」（ISBN-978-4-87311-904-5）の第2章及び付録Hを参考にしています

# TL;DR

コマンドだけ抜き出しておく
このあたり叩き込んで、`src`ディレクトリに`index.js`とか作ってコード書けばそれだけでいいレベルのもの

環境の用意

```
npm init
npm i -D typescript
npx tsc --init
npm i D eslint @typescript-eslint/eslint-plugin @typescript-eslint/parser
mkdir src
```

`src`下に`index.ts`とか作って中身のコード書いてからコンパイル

```
.\node_modules .bin/tsc
```

ここまでできれば、あとは

```
node .\dist\index.js
```

とかすれば実行できる

#前提

自分が今やってる環境が

* Windows10
* VSCode

なので、その中でやる形になります
もちろんコマンド実行は _WindowsPowerShell_ になります

#環境の用意

まずはプロジェクト作りたいディレクトリ下にて、プロジェクトのディレクトリを作成します（右クリックでも`mkdir`でもなんでもいい）
作成できたらPowerShellで、そのプロジェクトのディレクトリ下に`cd`とかで移動し、次のコマンドを実行します

```
npm init
npm i -D typescript
npx tsc --init
npm i D eslint @typescript-eslint/eslint-plugin @typescript-eslint/parser
```

1行目でnpmを初期化します
設定に関して色々対話式で言われますが、面倒なので全部エンターキー押してデフォルト設定すればいです（なので`npm init -y`とかでもいい）
2行目でTypeScriptをインストールします
3行目でtsconfig.jsonを作成します
デフォルト設定で全部やってるので、特に何もなければこれでいいですが、JSファイルの出力先`outDir`が設定されておらず`src`ディレクトリに出力されることになるので、よくある形だと（後からでもエディタなりなんなりで）`dist`に設定しておくといいかもしれないです
4行目でリンターとしてESLintを設定しています

ここまでで、TSコード作成できる準備はだいたいできました
詳しい人から見れば`tsconfig.json`の設定とか色々まだあると思いますが、とりあえず動けばいいのを用意するのが目標なのでここまでで

#TypeScriptファイル作成

プロジェクトのディレクトリ下に`src`ディレクトリを作り、その中にてきとーな名前つけたtsファイル（よくあるものだと`index.ts`あたり）作って、中身のコードを書きます

#TypeScriptのコンパイルと完成したJSファイルの実行

すでに`node_module`ディレクトリ配下にTypeScriptコンパイラ`bin/tsc`ができているので、それを実行します
PCのの設定で制限かかって実行できない場合は、先に`Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process`あたりで実行ポリシーの制限を緩めておきましょう

```
.\node_modules .bin/tsc
```

（なんかうまく実行できなかったので、`cd`で`node_modules`に入ってから`.bin/tsc`コマンド実行して対応したりした）

ここまでくればほぼ完了で、`dist`ディレクトリ配下（`tsconfig.json`修正してなければ`src`配下）に`index.ts`からコンパイルされた`index.js`ができてます
このファイル単体で動かしてテストしたい場合は以下のコマンドで実行してみましょう

```
node .\dist\index.js
```

実用で書くものとかだとこれだけでは不十分だと思いますが、とりあえず動けばいいもの、自分用メモということで、今回はこれまで
windoes terminalの使用

#◆Windows Terminalの使用
今までGit bashを使っていましたが、windows公式のターミナルである、Windows Terminalに移管しました。
備忘録として記録します。

#◆Windows Terminalのインストール
Microsoft Storeでインストール。

#◆起動
以下の画面が開きます。
初期設定ではPower Shellの画面が開きます。
今回はUbuntuを使用したいので、環境設定を変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764778/4ac122fd-d462-a4dc-f99c-3da7c109ef81.png)

#◆Ubuntuのインストール
Microsoft StoreでUbnutuをインストールします。

#◆Terminalの確認
TerminalでUbnutuが使えることを確認しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764778/d772c533-fc35-0fe9-c94a-37b1eba17f37.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764778/ad2283f6-c56a-0c9d-35b7-b185285cee86.png)

#◆デフォルト表示をubuntuに変える

以下の記事を参考にしました。
https://dk521123.hatenablog.com/entry/2020/12/10/094125


1) Windows Terminalを起動し、タブの横にある「逆三角（プラスじゃない方）」を選択し
　[設定]を押下する
　=> 「settings.json」が開く

※ 念のため、「settings.json」を別名で保存し、バックアップを取っておく
~~~~~~
%LocalAppData%\Packages\Microsoft.WindowsTerminalPreview_8wekyb3d8bbwe\LocalState
~~~~~~

2) 「settings.json」からUbuntuのGUIDをコピーし、"defaultProfile"の値に張り付け、保存する

~~~~~~
    "defaultProfile": "{<UbuntuのGUID>}", <<= b) ここに張り付ける

            {
                "guid": "{<UbuntuのGUID>}", <<= a) ここをコピー
                "hidden": false,
                "name": "Ubuntu",
                "source": "Windows.Terminal.Wsl"
            },
~~~~~~

#◆設定完了
デフォルト表示がUbuntuに変わりました。
AzureでConfigurationSetting 、KeyVaultSecretを取得 (DIなし版)


```c# 
using System;
using System.Linq;
using Azure.Data.AppConfiguration;
using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;

namespace FunctionApp_v2_tf {
    public class Function1 {

        [FunctionName("Function1")]
        public void Run([TimerTrigger("0 */10 * * * *")] TimerInfo myTimer, ILogger log) {
            log.LogInformation($"C# Timer trigger function Started");

            DefaultAzureCredential credential = new DefaultAzureCredential(new DefaultAzureCredentialOptions());

            // AppConfig:Endpoint
            var configUrl = Environment.GetEnvironmentVariable("AppConfig:Endpoint", EnvironmentVariableTarget.Process);
            ConfigurationClient client = new ConfigurationClient(new Uri(configUrl), credential);
            ConfigurationSetting setting = client.GetConfigurationSetting("configs");
            log.LogInformation(@$"{setting.Value}");

            // KeyVault:Endpoint
            var keyVaultUrl = Environment.GetEnvironmentVariable("KeyVault:Endpoint", EnvironmentVariableTarget.Process);
            SecretClient keyVaultClient = new SecretClient(new Uri(keyVaultUrl), credential);
            KeyVaultSecret secret = keyVaultClient.GetSecret("dbkey");
            string dbkey = secret.Value;
            log.LogInformation(@$"{dbkey}");

        }
    }
}

```
WP-CLIの導入

WP−clIを導入したのでその時の方法をまとめる。
##WP-CLIとは？
>WP-CLI は WordPress を管理するためのコマンドラインインターフェースです。 プラグインのアップデートやマルチサイトのセットアップなどの多くのことをブラウザ無しで行うことができます。

公式ドキュメントより引用
https://wp-cli.org/


ローカルでWordpressを操作できるということで、WordPressのアップデート、プラグインのインストール・アンインストール、ユーザ管理、データベース操作、インポート・エクスポートなどたいていのことはできるらしい。

##インストール方法
CLIに慣れている人は困らないだろうが、あの黒い画面に慣れていない人向けに実行結果とともに載せていく。
ドキュメントのInstallingを参照している。

```
$ curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 5437k  100 5437k    0     0  14.1M      0 --:--:-- --:--:-- --:--:-- 14.1M
```
↑このコマンドでダウンロードしている。

```
$  php wp-cli.phar --info

OS:	Darwin 19.6.0 Darwin Kernel Version 19.6.0: Tue Nov 10 00:10:30 PST 2020; root:xnu-6153.141.10~1/RELEASE_X86_64 x86_64
Shell:	/usr/local/bin/fish
PHP binary:	/usr/bin/php
PHP version:	7.3.11
php.ini used:	
WP-CLI root dir:	phar://wp-cli.phar/vendor/wp-cli/wp-cli
WP-CLI vendor dir:	phar://wp-cli.phar/vendor
WP_CLI phar path:	/Users/kyosukekaneko
WP-CLI packages dir:	
WP-CLI global config:	
WP-CLI project config:	
WP-CLI version:	2.4.0
```

```
$ chmod +x wp-cli.phar
```
↑のコマンドで`wp-cli.phar`へのアクセス権を与えている。

```
 $ sudo mv wp-cli.phar /usr/local/bin/wp
Password:ログインする時のパスワード

```
↑パスを設定して`wp`コマンドを使えるようにする

```
$ wp --info
OS:	Darwin 19.6.0 Darwin Kernel Version 19.6.0: Tue Nov 10 00:10:30 PST 2020; root:xnu-6153.141.10~1/RELEASE_X86_64 x86_64
Shell:	/usr/local/bin/fish
PHP binary:	/usr/bin/php
PHP version:	7.3.11
php.ini used:	
WP-CLI root dir:	phar://wp-cli.phar/vendor/wp-cli/wp-cli
WP-CLI vendor dir:	phar://wp-cli.phar/vendor
WP_CLI phar path:	/Users/kyosukekaneko
WP-CLI packages dir:	
WP-CLI global config:	
WP-CLI project config:	
WP-CLI version:	2.4.0
```

インストールされていることの確認


そうすると'wp'コマンドで自由に操作できるようになり、DB設計やローカルでのwordpressの運用もできる。

始めに`wp core download`などのダウンロードをお忘れなく！
#2 続・ネットワークスペシャリスト試験の基礎固め

この記事はシリーズものです。トップはこちらから。

 - [ネットワークスペシャリスト試験を受けることにしました【令和3年春季】](https://qiita.com/foxtail1979/items/5e333d28f2e93acb552b)

# 一問一答と過去問と

先週に引き続き基礎固めをしていました。

[ネットワークスぺシャリストドットコム](https://www.nw-siken.com/nwkakomon.php)の過去問で、午前Ⅱをやり込んでいます。過去10年分掲載されているので、合計２５０問。

ちなみに計算問題は出題しない設定にしているので、実際に解いている問題数は250問より少ないです。集中力がきれないように、カテゴリごとに解くようにしています。

それと、[ネスペR1 - 本物のネットワークスペシャリストになるための最も詳しい過去問解説](https://www.amazon.co.jp/dp/4297113279)下記書籍の巻末にある一問一答３００問をひたすら繰り返しています。

計算問題って、試験に合格を目標にするだけならあまり時間かけたくないのが本音なんですよね。もちろんサブネットマスクとかビット⇆バイト換算くらいはできうのは当然としても。呼量の計算とか、ビット誤り率の計算は解いても実りが少ないというか。。。そこは午後対策を始めた頃に実力不足と感じたら、対策します。

ちなみに下記の参考書を購入しました。やはり手元にささっと参照できる書籍があると心強いです。

 - [情報処理教科書 ネットワークスペシャリスト 2020年版](https://www.amazon.co.jp/dp/B0841WNWC1)

相変わらず平日の勉強時間は３０分ほど、週末に土日それぞれ2時間くらいかける感じです。

## 今週の苦戦中
音声ネットワークはやはり業務で触れたことがないので基本知識を覚えるのに苦戦しています。セキュリティ関連も事象と対策、その対策がなぜ有効なのか、をきちんと説明できるようになるにはもっと勉強が必要だなと感じています。

知識としてインプットしたら、第三者に説明してみるとか、アウトプットしないと定着しないですね。引き続き頑張ります。
AsyncStorageを使用中にはまったエラー

react-nativeでAsyncStorageを使用してデータを永続化しようとしたときに下記のようなエラーが出てきた時のエラー解消です

```
[Unhandled promise rejection: TypeError: undefined is not an object
 (evaluating '_asyncStorage.AsyncStorage.setItem')]
```

上記のエラーが出ている時はインポート文を

```
import { AsyncStorage } from '@react-native-community/async-storage';
```
から

```
import AsyncStorage from '@react-native-community/async-storage';
```
に変更するとエラーが解消されます

この些細なミスで消耗する人が1人でも減りますように、、