OmniAICreator/Qiita-1.07M huggingface dataset:
Rails新規プロジェクト作成からrails serverまでのまとめ

## はじめに

Rails初学者が書いています。
間違っているところや、こうした方がいいなどがあれば教えてください。

## 筆者の環境

MacOS : BigSur
Ruby : 2.7.2
Rails : 6.0.3.4

## 目次

1. rails newまで
1. dotenv gem追加
1. .gitignore更新
1. MySQLデータベース作成

## rails newまで

[新規Railsプロジェクトの作成手順まとめ](https://qiita.com/yuitnnn/items/b45bba658d86eabdbb26)をかなり参考にさせてもらってます。

### bundle install
まずはrailsプロジェクトを作成します。
いきなり`rails new`するとシステムのgemにインストールされてしまい、
あまりよろしくない（なるべくクリーンにした方が良い）ので、
`vendor/bundle`下にインストールするようにします。

```
$ mkdir sample_app
$ cd sample_app
$ bundle init
```

生成されたGemfileを以下のように編集します。
railsのバージョンを以下のように指定するとrails6.1未満で最新のものがインストールされます。

```ruby:Gemfile
# frozen_string_literal: true
source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem 'rails', '~> 6.0.0'
```

これで準備ができたので、下記のコマンドでRailsをインストールします。

```
$ bundle install --path vendor/bundle
```

この時に--path vendor/bundleを忘れずにつけてください。
このオプションを付けることによって、プロジェクトのvendor/bundle以下にgemが格納されます。（一度このコマンドを実行したら、次回以降は`bundle install`でいけます）

### rails new

```
$ bundle exec rails new . -B -d mysql
```

Railsのインストール実行時にGemfileを上書きしていいか聞かれますが、yesにして続行します。

| コマンド | 効果 |
|:-----------|:------------|
| bundle exec | railsのバイナリがないのでbundleから呼び出します。 |
| rails new . | ドットを入れることで現在のフォルダ名でプロジェクトを作成します。
| ｰB | Railsプロジェクト作成時にbundle installを行わないようにする |
| -d mysql | 指定したデータベースに変更する（railsのデフォルトのDBはsqlite3） |

## dotenv-rails gemを追加

Gemfileに追加します。

```ruby:Gemfile
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'dotenv-rails'
end
```
このGemは環境変数を追加するものです。

### bundle install

```
$ bundle install
```

## .gitignore更新

.gitignoreはgitに同期しないファイルを設定するものです。
私は[gitignore.io](https://www.toptal.com/developers/gitignore)のファイルをそのまま使用します。
[Rails用はこちら](https://www.toptal.com/developers/gitignore/api/rails)

これで.gitignoreを上書きします。

またデフォルトで、dotenv用のファイルも除外されています。

## MySQLデータベースの作成

### 環境変数の設定

先ほどGemfileに追加したdotenvの設定をしていきます。
まずはルート下に.envファイルを作成します。
そして以下のように書きます。

```:.env
DATABASE_PASSWORD='********'
```

`config/database.yml`のファイルのパスワードのところに追記します。

```ruby:config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  host: localhost
```

### rails db:create

これで以下を実行すればDBを作れます。

```
$ rails db:create
```
あとは`rails server`で起動できます。

## 参照

[新規Railsプロジェクトの作成手順まとめ](https://qiita.com/yuitnnn/items/b45bba658d86eabdbb26)
[[初期設定]初学者が最初に「.gitignore」を設定する方法](https://qiita.com/shimadama/items/c0c95363434c5210b502)
[【Rails/MySQL】RailsにMySQLを導入する方法【プログラミング学習149日目】](https://qiita.com/fuku_tech/items/a380ebb1fd156c14c25b)
【shopify】Polarisを使用すると「Cannot read property 'tapAsync' of undefined」と言われる問題

## 前提

- polaris: "6.0.1"
- react: "16.14.3"
- react-dom: "16.9.10"

以下のチュートリアルを進めていたところ、、、

https://shopify.dev/tutorials/build-a-shopify-app-with-node-and-react/build-your-user-interface-with-polaris

## エラー

このようなエラーが出て、どうにもこうにも解決できませぬ、、、

```terminal
> Ready on http://localhost:3000
error - ./node_modules/@shopify/polaris/dist/styles.css
TypeError: Cannot read property 'tapAsync' of undefined
```

以下の部分をコメントアウトすると正常に動作するので、`polaris`のstyles.cssが正常にimportできていないようです

```_app.js
...

import '@shopify/polaris/dist/styles.css';

...
```


ちなみに、サーバーにアクセスするとこうなりますが、

```terminal
Error: Cannot find module '/Users/user-name/environment/shopify/shop_node/.next/build-manifest.json'
Require stack:
- /Users/user-name/environment/shopify/shop_node/node_modules/next/dist/next-server/server/load-components.js

 ...
```

こちらは以下の記事を読む限りだと、「importに問題がある場合発生する」とのことなので、上記のインポート問題を解決すれば一緒に対処できそうです。

https://medium.com/anna-coding/error-cannot-find-module-path-build-manifest-json-masks-an-underlying-issue-with-next-js-f93b07eac52


## 対処

### 追記

修正方法がわかりました

結論から言うと、`webpack`のバージョンが問題でした

エラーが起きていた際には最新の`5.21.0`を使用していたのですが、それを4.0系の最新版`4.46.0`へと変更することで無事に解決しました

なお、関連リンクにて別のエラーの報告がありますが、そちらのエラーも同様に「`webpack`のバージョンを4.0系にすることで解決する」可能性があります。

一度お試しいただけますと幸いです！

※ 今回のエラーとは関係ないですが、下記のissueをみて解決策へと辿り着きました

https://github.com/cloudflare/wrangler/issues/1678

---

~~色々試しましたが、直りませんでした、、、~~

~~なのでどうしたかと言いますと、、、~~

~~まず`_app.js`では、Polarisのスタイルシートのインポートを諦めました。~~

~~そして、React側にて、Headerから直接CDNでスタイルシートを読み込むことにしました~~

```_app.js
...

// import '@shopify/polaris/dist/styles.css';

...

  <Head>
    <title>Sample App</title>
    <meta charSet="utf-8" />
    <link
      rel="stylesheet"
      href="https://sdks.shopifycdn.com/polaris/3.18.0/polaris.min.css"
    />
  </Head>

...
```

~~追加した部分は、以下になります~~

```javascript
    <link
      rel="stylesheet"
      href="https://sdks.shopifycdn.com/polaris/3.18.0/polaris.min.css"
    />
```

~~これでひとまずスタイルシートは反映されました~~

~~ただ、"これでいいのか"は疑問が残りますので、解決策が見つかりましたら追記します。~~


## 関連リンク

以下の方も同じ現象に悩まれていたようです

https://community.shopify.com/c/Shopify-APIs-SDKs/Cannot-resolve-the-error-while-building-Shopify-Tutorial-App/td-p/1045762
Salesforceで一年以上前のToDoや行動を確認する方法（データローダ編）

SalesforceのToDoや行動には特別なルールがあります。
活動のアーカイブという機能です。

活動のアーカイブとはSaleforceが標準で用意している機能で、期日から一年以上経過した過去の活動を自動でアーカイブしてくれます。

Salesforce は次の活動をアーカイブします。
終了してからの経過日数が 365 日を上回る行動
期日からの経過日数が 365 日を上回る完了した ToDo
作成日からの経過日数が 365 日を上回る完了した ToDo (期日がない場合)
詳細下記ヘルプ参照
https://help.salesforce.com/articleView?id=sf.activities_archived.htm&type=5

アーカイブ済みの活動を確認する方法は主に３つです
①サポートに問い合わせて、アーカイブ期間の延長を依頼する
②[活動履歴] 関連リスト　から表示
③データローダでエクスポート

今回は
③データローダでエクスポート
の方法を説明します。

ステップ１
データローダで「Export All」をクリックし環境にログイン
![１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/646e6362-62a8-84f0-116f-916573d60ed3.png)

ステップ２
「ToDo」を選択。「Brose」をクリックしエクスポート先を選択し「Next>」ボタンをクリック（行動レコードをエクスポートする場合「行動」を選択してください）
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/ff6a5536-8a34-293e-15ea-30be4ee6011b.png)

ステップ3 エクスポートする項目を選択し「Finish」ボタンをクリック
（特にエクスポートする項目に指定がなければ「Select all fields」ボタンをクリックしたらすべての項目がエクスポートできます）
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/d7e0d890-780f-52b4-504d-2dabb487380c.png)

以上で設定は完了です。
なお、「ステップ１」のデータローダの選択画面で「Export All」ではなく「Export」を選択するとアーカイブ済みの活動はエクスポートできないのでご注意ください。
![４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/169819b6-228c-d528-bf06-b9ab102df9df.png)
VisualStudioCodeで特定の文字から特定の文字までの情報を書き換える方法


View > Search から検索を開き .* を選択する。

![スクリーンショット 2021-02-06 14.25.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244853/8f978c60-6dcf-17a4-0f5e-3637bb797c4b.png)

下記を正規表現で置き換えたい

     <p>abcdefg</p>

a~z,A~Zの文字、数字の正規表現

    [a-zA-Z0-9]

aから始まってzで終わる3桁以上の文字列

    a.+z

上記を組み合わせる

    <p>[a-zA-Z0-9].*</p>

    上記で<p>abcdefg</p>をReplaceで入れた好きな文字等に変更できる。
matplotlibによる3次元プロット

#背景
pythonで３次元プロットをする時、座標/関数をどのようなデータでプロットメソッドに渡せばいいか調べるのに時間がかかったため、備忘として残す。

#3次元プロットのコード
関数の定義

```
def function_2(x):
    return x[0]**2 + x[1]**2
```

3次元プロット

```
import numpy as np
import matplotlib.pylab as plt
from mpl_toolkits.mplot3d import Axes3D

x0 = np.arange(-3, 3, 0.25)
x1 = np.arange(-3, 3, 0.25)
X, Y = np.meshgrid(x0, x1)
w = np.array([X,Y])
z = function_2(w)

fig = plt.figure()
ax = Axes3D(fig)
ax.set_xlabel("x0")
ax.set_ylabel("x1")
ax.set_zlabel("f(x0, x1)")
ax.plot_wireframe(X, Y, z)
plt.show()
```

#各配列の中身を理解する(ここが大事)
手書きですがご容赦を。
![DSC_0127.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031632/67f4140c-1d36-0e98-c1b1-ab3a658ae8d4.jpeg)
itermチートシート

itermの設定や操作を忘れないようにチートシートを作成してみた。

#設定
+ [iTerm2のおすすめ設定〜ターミナル作業を効率化する〜](https://qiita.com/ruwatana/items/8d9c174250061721ad11)
+ [iTerm2で単語単位でカーソル移動する設定](https://qiita.com/hokutoasari/items/e2442b87c7b381f9ff7c)
+ [iTerm2で単語単位で削除する設定](https://www.ohitori.fun/entry/iterm2-delete-word-shortcut#:~:text=iTerm2%E3%81%A7%E5%8D%98%E8%AA%9E%E5%89%8A%E9%99%A4%E3%82%92%E5%8B%95%E4%BD%9C%E3%81%95%E3%81%9B%E3%82%8B,-%E3%81%BE%E3%81%9A%E3%81%AF%E3%80%81iTerm2%E3%81%AE&text=Keys%E3%82%BF%E3%83%96%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%97,delete%20%E3%82%92%E3%82%BF%E3%82%A4%E3%83%97%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)

#操作
###ウィンドウ
| ショートカット      |説明 |
|:---------------|:------------------|
| ⌘ + n          |新しいウィンドウを表示|
| ⌘ + w          |ウィンドウを削除|
| ⌘ + d          |ウィンドウを縦に分割|
| ⌘ + ⇧ + d      |ウィンドウを横に分割|
| ⌘ + [          |次のウィンドウへ移動|
| ⌘ + ]          |前のウィンドウへ移動|
| ⌘ + t          |新しいウィンドウをタブで開く|
| ^ + tab        |タブの移動|

###スクリーン
| ショートカット      |説明 |
|:---------------|:------------------|
| ⌘ + ⇧ + +      |文字の拡大|
| ⌘ + -          |文字の縮小|
| ⌘ + 0          |元に戻す|
| ⌘ + Enter      |フルスクリーン表示|
| ^ + l          |画面をスクロールアップ|
| ⌘ + k          |画面をクリア|
| ⌘ + u          |透過度のONとOFF|

### 移動
| ショートカット      |説明 |
|:---------------|:------------------|
| ctrl + -       |入力を戻す|
| ctrl + a       |行頭へ移動|
| ctrl + e       |行末へ移動|
| cmd + k        |画面をクリア|

### カット
| ショートカット       |説明 |
|:-----------------|:------------------|
| ctrl + k         |カーソル位置から行末まで一気にカット|
| ctrl + w         |単語ごとにカット|
| ctrl + u         |カーソルの行をカット|
【Mac】VScodeでC++のソースコードを実行し、入出力をしたい！

# はじめに
他の記事にもやり方がありましたが、出力のみしかできず、入力(cin)が出来る方法がないか調べてみました。

参考にした内容は、動画とコメント欄の一番上にあります。
https://www.youtube.com/watch?v=zIIYN_PyUAM

# 拡張機能の追加
まず、下の二つの拡張機能をインストールしてください。

## C／C＋＋
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662345/474139fd-51f5-cec3-5ebe-60843e5c67a6.png)

## Code Runner
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662345/842039f3-f997-b0f9-bda2-384289b90f5a.png)

# 入力が出来るようにする設定
ここまでは他の記事と同じで、この状態でソースコードを開き、右上の三角形(再生ボタンみたいな)を押すと、出力(cout)しかしてくれないので、`cin << hoge;`とか書いてても何もできません(多分`Cannot edit in read-only terminal.`
って出る)

これを修正するには、手動で読み書きを有効にする必要があります。

* VsCodeで、「Code」→「Preference」→「Settings」と進みます。
* 左側のパネルの「User」タブで、「Extensions」セクションを見つけます。
* スクロールして「Run Code Configuration」を見つけてください。
* スクロールして、「Run in Terminal」のチェックボックスを見つけます（統合ターミナルでコードを実行するかどうか） チェックを入れます。

下の画像のようにチェックしていれば大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662345/6b8f425c-4bcf-5323-4d40-847c5e18ab3f.png)

## 実行
実行してみると、ターミナルが開き、値を入力をさせるソースコードだと、入力待ち状態になっていると思います。

## 終わりに
入力が出来る設定ができたなら良きです。
説明が少々雑ですが、そこはご愛敬🙏。
コネタ: sudoの「大いなる力には大いなる責任が伴う」を訳した人って誰？

# TL;DR あなたの使うOSSで、和訳がついているのはtranslation projectさんのおかげかもしれない。


# はじめに

また、ツイッターネタでごめんなさい。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">sudo の「大いなる力には大いなる責任が伴う」を訳した人って誰なんだろう</p>&mdash; だんぼーだよ📦 (@Liliaceae) <a href="https://twitter.com/Liliaceae/status/1357852367207583746?ref_src=twsrc%5Etfw">February 6, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

そういえば、つい先日、sudoコマンドの脆弱性の話もあったなあ…

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Linux「sudo」コマンドに管理者権限奪う脆弱性: 日本経済新聞 <a href="https://t.co/T8W5ZhEY6A">https://t.co/T8W5ZhEY6A</a></p>&mdash; (*´▽｀*) (@hon_no_mushi) <a href="https://twitter.com/hon_no_mushi/status/1357909568647434244?ref_src=twsrc%5Etfw">February 6, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ちと調べてみますかね（ソースコードの場所とかいろいろこういうきっかけがないと見ないですからね……）

# sudoコマンドのソースコードは？

[実行順序から解き明かす、sudoコマンドの脆弱性（CVE-2019-14287）が発生した理由 (1/2)](https://www.atmarkit.co.jp/ait/articles/1911/18/news014.html) が非常にわかりやすい。

さて、ソースコード管理元は、"https://www.sudo.ws/" 。

https://github.com/sudo-project/sudo/blob/1c02c14c35207d981240d7a517aabbe7b6ea4b16/plugins/sudoers/po/ja.po#L1118

この翻訳は、、translationprojectの成果物を利用しているらしい。

# translationprojectの日本語チームさん

https://translationproject.org/team/ja.html

https://translationproject.org/PO-files/ja/sudo-1.8.4rc1.ja.po

ここから、翻訳を当時担当されたかたを探す。

```
[TXT]	sudoers-1.8.12b1.ja.po	2014-11-08 16:52    ""
[TXT]	sudoers-1.8.12b3.ja.po	2014-11-21 22:18    ""
[TXT]	sudoers-1.8.13b3.ja.po	2015-05-03 10:52    "    #3) 大いなる力には大いなる責任が伴うこと。\n"
[TXT]	sudoers-1.8.14b1.ja.po	2015-07-02 09:18    "    #3) 大いなる力には大いなる責任が伴うこと。\n"
[TXT]	sudoers-1.8.14b2.ja.po	2015-07-04 09:02    "    #3) 大いなる力には大いなる責任が伴うこと。\n"
[TXT]	sudoers-1.8.15b1.ja.po	2015-09-15 12:47    "    #3) 大いなる力には大いなる責任が伴うこと。\n"
[TXT]	sudoers-1.8.15rc3.ja.po	2015-10-26 15:42    "    #3) 大いなる力には大いなる責任が伴うこと。\n"
```

sudoers-1.8.13b3.ja.po を見るとTakeshi Hamasakiさんというかた、らしいですね。現在の最新版の翻訳も担当されているようです。
（ええっと、違っていたらごめんなさい）

```
# Japanese messages for sudoers
# This file is put in the public domain.
# Yasuaki Taniguchi <yasuakit@gmail.com>, 2011.
# Takeshi Hamasaki <hmatrjp@users.sourceforge.jp>, 2012, 2015.
```

最大限の感謝とともに！！ありがとうございました！

以上となります！
mac x mosquitto 備忘録

## 概要

随時更新していきます。


## 参考

`mac にmosquitto インストール`
https://what-a-day.net/2016-12-06-163717

`mac mosquitto service スタート`

```
brew services start mosquitto -d
```

```
/usr/local/sbin/mosquitto
```

`ClassNotFoundException: Didn't find class "androidx.localbroadcastmanager.content.LocalBroadcastManager`
https://github.com/eclipse/paho.mqtt.android/issues/321

```
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
```

`java.lang.RuntimeException: Fail to connect to camera service`

add at `AndroidManifest.xml`

```
<uses-permission android:name="android.permission.CAMERA" />
```

プラス端末の設定から手でカメラ権限をONにすること。

`cannot find symbol OpenCVLoader`

```
import org.opencv.android.OpenCVLoader;
```
Opnecv-android-sdk-***/samples/image-manupulations/
等を参考にすると良い。

また、

```
projects/app/src/main
```
以下に `jniLibs`をコピーする。
正規表現の基本メモ

RegexOneで学んだことをメモしていきます  

# Lesson 1
## 0-9の数字にマッチさせる
```:regex
\d
```
1がヒットする

```:sample
abc123xyz
```

#Lesson 2
## Wildcard (全ての文字にヒットする）
`.`は全ての文字にマッチする

```:regex
.
```
`.`を含む文字を検索したい場合はエスケープする 
 
```:regex
\.
```
結果下記がヒットする  

```:sample
cat.
```

# Lesson 3
## 指定した各文字にマッチさせる
下記のように`[]`で囲んだものは、`abc`という単語を探しにいくのではなく、`a`,`b`,`c`の一文字ずつを探しにいくことになる(ANDではなくORであることに注意)

```:regex
[abc]
```
下記3単語の最初の`a`、`b`、`c`がヒットする

```:sample
ady
bor
cfg
```

# Lesson 4
## 指定した単語を含めたくない場合
`a`または`b`または`c`を含めたくない

```:regex
[^abc]
```

```:sample
abc
def
ghi
```

```:result
def
ghi
```

# Lesson 5
## 文字の範囲を指定したい場合
Case Sensitiveであることに注意

```:regex
[A-Z]
```
```:regex
[a-z]
```
```:regex
[0-9]
```
全部一気に指定もできます

```:regex
[a-zA-Z0-9]
```

一気に指定は楽な方法が下記
#### 全ての文字を検索
```:regex
[\w]
```

#### 全ての文字以外（空白や記号など）を検索
```:regex
[\W]
```

# Lesson 6
## 繰り返しを指定
下記のように指定すると`aaa`となっている文字がヒットする

```:regex
a{3}
```

何回以上、以内で繰り返しているのか指定もできる

```:regex
a{2,5}
```

`.`を指定すれば文字列の長さの範囲を指定している感じにもなる
例えば下記は3文字以上の文字がヒットする

```:regex
.{3}
```

```:sample
a
ab
abc
abcd
abcde
```

```:result
abc
abcd
abcde
```

# Lesson 7
## 0回以上、1回以上の繰り返しを指定
1回以上の全ての1文字の繰り返しを検索

```:regex
.+
```

下記のようにしたら2文字の1回以上の繰り返しを検索

```:regex
..+
```
0回以上の全ての1文字を検索

```:regex
.*
```

`a` `b` `c`のどれかが1回以上繰り返しているものを検索

```:regex
[abc]+
```

```:sample
a
abc
abbc
abcc
abbcc
```

## 空白を見つけたいとき
```:regex
\s
```

```:sample
1  a
  2.abbc
3.&^%abcc
```

```result
3.&^%abcc
```

## 文字の開始と終了の指定
`abc`から始まる文章を検索

```:regex
^abc
```

`abc`で終わる文章を検索

```:regex
abc$
```
投稿ページの仕上げ

# single.phpの細かな調整
## <?php language_attributes(); ?>

```index.php
<html lang="en">
```

```index.php
<html <?php language_attributes(); ?>>
```
## <?php body_class(); ?>
bodyタグの中身を`<body>` -> `<body <?php body_class(); ?>>`
というふうに書き換えることによって、classが付与される。

前後を比較してみよう。まずは書き換える前。

![スクリーンショット 2021-02-05 15.06.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656707/8be78d1a-ab6e-c8db-d31f-9fe1400528cc.png)

classの中には`customize-support`がある。
次に書き換えた後を見てみよう。

![スクリーンショット 2021-02-05 15.06.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656707/d7149adc-d42b-84ba-bafa-ee19136ebe20.png)

classの中が明らかに増えている。このように非常に多くのclassがbodyタグに付加される。なぜかというと、このclass属性によってstylesheetの調整やスクリプトの稼働の制御を行なっているからだ。

![スクリーンショット 2021-02-05 15.06.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656707/3c6951b4-4149-1028-1843-f7ba1a1ff40a.png)

## <?php wp_body_open(); ?>

`<?php wp_body_open(); ?>`
googleのタグマネージャーを使うとき、プラグインの出力がこのコードが書かれているところに表示されるため付け加えた方が良い。

このタグはsingle.phpで呼ばれるより、includes>header.phpで呼ばれた方が良い。

![スクリーンショット 2021-02-05 15.19.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656707/4977dfef-5472-bc09-47af-4424aa444abf.png)

# パーマリンク
![スクリーンショット 2021-02-06 12.10.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656707/6d592bc0-e8c9-d60b-54c8-0948f81c7a86.png)

パーマリンクとは、上画像のURLのようにURLの表現形式を指す。この仕方を設定すること

URL自体は設定によって異なるため、表示の仕方は異なる。

パーマリンクの設定は、
![スクリーンショット 2021-02-06 14.07.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656707/6f072956-f343-1806-ab26-9ded4d4d9467.png)

管理画面の左側にあるメニューの設定からパーマリンクを選んで、各々好きな表示タイプを選択する。

### 手動で変える

日本語がURLの中に入ると、URLエンコードによって、表記が長くなってしまう。そのため、URLは英語表記でした方が良い。

変更の仕方は、投稿画面の右側にあるパーマリンクのURLスラッグを変更すれば良い。スラッグはそのページを示すための記法を意味する。

![スクリーンショット 2021-02-06 13.48.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656707/5a5ed545-59f7-ffe7-f541-26462fe100e0.png)

変更すると、投稿の表示に変更後のURLが表示される。
![スクリーンショット 2021-02-06 13.49.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656707/836f53c7-7f66-3e0f-f01b-31689efeff91.png)

## 階層構造
URLスラッグのところを
`about/contact`
と変えても階層構造にならない。(自動的に`about-contact`と変更される。)

WordPressで階層構造を設定したいときは、投稿画面右側の下にあるページ属性から親となるページを洗濯する。
![スクリーンショット 2021-02-06 14.01.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656707/61d9a0b7-2515-3e0c-acc6-f656022d6965.png)

公開すると、`〇〇/about/contact/`というURLとなる。

## おすすめのパーマリンク
![スクリーンショット 2021-02-06 14.10.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656707/34369f29-47da-97b4-6473-14fec8dba116.png)

上図のように、カスタム構造を選んで、年/月/投稿番号というふうに設定するのがおすすめである。理由はブログで運用する場合、記事数が多くなるため、一つ一つに対してスラッグを決めていくのも労力がかかる点と、タイトルが日本語になる可能性が高く、パーマリンク設定を忘れてしまう点があげられる。
Memcachedで特定キャッシュの情報を確認するメモ

特定キャッシュを調べる際の手順と作ったShellをメモしておく

# 参考
 [Memcachedで特定キーのキャッシュ有効期限を取得する](https://qiita.com/telx2bz/items/70c94365cf11a5742913)  

# 手順  
上記の参考リンクを基本は行うだけだが、単純にkey名がわかっている場合は下記shellを実行すればヨイ

```sh:test.sh
for ((i=1; i<=$loopLimitCnt; i++));
do 
    echo "ITEM ${i}"
    stats="stats cachedump ${i} 93798"
    echo $stats | nc $hostname 11211 | grep "${keyName}"
done
```

## 補足
- `$loopLimitCnt`に関しては、下記を実行しておき、ITEMの最大値を取得した数となる

```
echo 'stats slabs' | nc {host} 11211
```

- `$loopLimitCnt`, `$hostname`, `$keyName`は引数渡しするなりfor文の前にセットするなりすればOK

- もしkey名がわからない場合は `| grep "${keyName}"`を削除すればどのITEMにどのkeyのキャッシュがあるかわかる

- 単純にキャッシュひとつを消したい場合は下記

```
$ telnet localhost 11211
$ delete key名
```
railsのmigrationファイル内で生のSQLを使う方法

##やりたいこと
railsのmigrationファイル内で生のSQLを使いたい。

##環境
rails:6.0
mysql:5.7

##手順
まずは、migrationファイル作成

```
$rails g migration クラス名
```

作成されたmigrationファイルのdef内に記述

```
class クラス名 < ActiveRecord::Migration[6.0]
  def change
    sql = "ALTER TABLE users COLLATE 'utf8mb4_bin';"
    ActiveRecord::Base.connection.execute(sql)
  end
end
```

migration実行。

```
$rake db:migrate
```

以上です。

間違い等あればご指摘お願いします。
PHP 時刻を日本時間に合わせる。

時刻をその場所のタイムゾーンに合わせる方法を、備忘録として残します。
環境は以下の通りです。

* macOS Catalina
* PHP 7.4.12
* MAMP


##コードをそのまま書いて設定する。

<a href="https://www.php.net/manual/ja/function.date-default-timezone-set.php" color="blue">date_dafault_timezone_set( )</a>　関数を用いる。
この関数はデフォルトのタイムゾーンを指定できます。

タイムゾーン一覧はPHPリファレンスより参照できます。
→[サポートされるタイムゾーンのリスト](https://www.php.net/manual/ja/timezones.php)

下記コードは```"Asia/Tokyo"```で日本のタイムゾーンを指定しています。

```php

date_default_timezone_set('Asia/Tokyo'); //日本のタイムゾーンに設定
print(date('G時 i分 s秒')); //Gは時(24時間単位)、iは分、sは秒
> 12時 15分 3秒 //出力（日本時間になっている。）
```

##php.iniの設定を変える。
Finderを開き

**アプリケーション → MAMP → bin→ php7.4.12(バージョンによって変わります。) → conf → php.ini**

と辿って行き```php.ini```を開く。

*[Date]* の箇所までいき、*date.timezone* を変更する。

<font color="red">*先頭についているセミコロンの外し忘れると反映しません。</font>

```ini
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = "Asia/Tokyo" 　←先頭に着いていた;(セミコロン)を外し、"Asia/Tokyo"に書き換える。
```

最後にMAMPを再起動して反映されてるか確認。

```php
print(date('G時 i分 s秒')); //ちゃんと設定したタイムゾーンになっていればOK
```
element ui で theme でつかっている color 変数を使用する



# motivation
element ui で 設定されている theme用の変数を使用したかった。

# 結論

Sassファイルに以下を記述する。


```sass

@import "~element-ui/packages/theme-chalk/src/common/var";
```

# 備考
[こちら](https://qiita.com/teriyakisan/items/7773adcfcb4c4a315720) を参考にやらせてもらったが、
以下を配置すと、buildの時間がかかるようになってしまいました。
```
@import "~element-ui/packages/theme-chalk/src/index";
```

そのため、部分的にimport するようにしました。

参考
https://qiita.com/teriyakisan/items/7773adcfcb4c4a315720
electronの自動アップデート コードサイニングの仕組み (Windows版)

##はじめに
初めてelectronでデスクトップアプリを作成し、色々壁に当たりながらも全て解消しリリースにこぎつけた。
今回は、リリース後初めての証明書の更新(Windows版)で生じた問題について原因と対応内容をまとめた。

###背景
Web版やSPアプリで同機能のシステムをリリースしていて、対応チャネルを増やす目標があった。
Web版はreact/javascriptを使用していて、コンポーネントやロジックの共有も考え、
react + electron + javascriptを用いて1ソースでWindows/Macデスクトップアプリを作成した。

###ある日...
リリースから10か月程経ちシステムは安定稼働している。
electronのコードサイニング証明書の期限(1年)が近づいてきたため、証明書を取得した。
今回は当初の発行元機関が証明書の発行業務をやめたため、新しい発行機関にて証明書を取得した。
コードサイニングはelectron-builderにて実装。
新しい証明書にて問題なくビルドでき、いざ自動アップデートの検証をして見る。
自動アップデートに失敗。むむむ。
なぜだ。

###コードサイニングについて
コードサイニング証明書はソフトウェアの正当性を担保するもので、作成元で生成されたことを保証する。
 1. コード・暗号化されたハッシュ値（デジタル署名）・コードサイニング証明書を使ってパッケージを作成
 2. コードサイニング証明書の有効有無確認
 3. コードサイニング証明書の公開鍵を取得
 4. 暗号化されたハッシュ値（デジタル署名）を復号し証明書に含まれているハッシュ値を比較
ハッシュ値の一致により改ざんによる不正がないパッケージであることが証明される

###electron-updaterについて
electronデスクトップアプリの自動アップデートにelectron-updaterを用いた。
electron-builderにelectron-updaterの組み合わせは参考文献も多く自然とその組み合わせを選択した。
electron-updaterは、インストール済みのパッケージ起動時に指定の配置先のパッケージのバージョンをチェックする。
配置先のバージョンがインストールより新しい場合、ローカルのtempフォルダ内に最新版をダウンロードし証明書をチェックする。
証明書チェックOKであれば、tempフォルダにダウンロードしたパッケージをインストールする。
証明書チェックがNGであれば、tempフォルダを削除しインストール失敗の結果を戻す。

###自動アップデートに失敗した原因
ログをたどっていくと、ローカルtmpフォルダ内に最新版をダウンロードまでは行われていて、証明書チェックでNGとなっていることが分かった。証明書を含んだビルドも成功うしているため、証明書チェックでエラーとなる理由が分からない。
しばらく考えてみたが、原因が分からないため、ローカルにプルしているnpmモジュールを修正し原因になりそうな箇所にログを出して調査を進めてみた。
electron-updaterのverifySignature内で、インストール済みのパッケージのpublishNameと、証明書から取得した文字列をし署名が正しいかを判定している。
今回証明書発行元が変更になった際、発行者の名前を半角英数字とカナ文字で変更していた。

verifySignatureの処理内で以下の処理が行われるが、カナ文字の変換では正しく変換されない。
const data = parseOut(Buffer.from(stdout, "base64").toString("utf-8"))
これが原因であった。
カナ文字の発行者だった場合に証明書チェックが正しく行われず証明書チェックエラーとなる可能性がある。
今回はWindow版での処理について記載したが、Mac版は同じライブラリで別処理を通っている。

###まとめ
自動アップデートのライブラリは外部ライブラリを使うことが多いと思うが、設計段階でどういう処理を行っているかの事前調査が必要だと改めて感じた。
electron-updaterでの自動アップデートでの失敗文献が少なかったため、似たような問題に当たった方の参考になればと思う。
【Ruby】includeとprependの違いとは？初心者のわからないを簡単に解説してみた！

皆さんはincludeやprependでモジュールを継承したことはありますか？

初心者であれば、あまり使ったことがあるという人はいないのではないでしょうか。

そうなると、includeとprependに関して理解している人も少ないと思います。

しかし、includeとprependには明確な違いがあります。

これは、皆さんがこれからRubyistとして活躍していきたいのであれば、是非理解していただきたい内容となっております。

簡単にわかりにくい内容を省いて解説しておりますので、是非ご一読ください！

## そもそもincludeとprependって何ができるの？

includeとprependは、モジュールをクラスに継承するためものです。

予めモジュールに定義していたメソッドなどを引き継ぐことができます。

## includeとprependの違いとは？

そして、本題なのですが、includeとprependの違いとはなんなのでしょうか。

答えは、継承チェーンにあります。

継承チェーンについては以前記事にしたので、わからない方は是非ご一読ください。

includeは読み込んだモジュールが、継承チェーンの中でクラスの上にくるという特性があります。

一方で、prependはクラスの下に位置します。

## 継承チェーンの位置関係が異なると、どんなことが起きるの？

継承チェーンの位置関係が異なると、どのようなことが起きるか。

一番に理解しなければいけないのは、rubyがメソッドを理解する手順にあります。

rubyはメソッドを理解する際に、カレントクラスをみてから、継承チェーンを一個ずつたどってメソッドを探していくと、以前継承チェーンに関する記事に記載しました。

ということは、例えば、カレントクラスとそのスーパークラスに同じなえのメソッドが存在し、そのメソッドが呼び出された時、どのようなことが起こるのでしょうか。

答えは、「カレントクラスのメソッドの方が呼び出される」です。

したのクラスから順番に調べられていくので、上に位置するクラスのメソッドは必然的に優先順位が低くなってしまいます。

なので、includeとprependをうまく使い分けることで、そういったことを操作してアルゴリズムを組むことができるのです。

## まとめ

どうでしたでしょうか。

初心者の時はincludeやprependなど、最初はよく使わないことに対しての理解は疎かになってしまいがちだと思います。

曖昧に、「どちらもモジュールを読み込むためのもの」といった理解の仕方をしている人も多くいるでしょう。

しかし、今回解説したように、いくつも似たようなものがあっても、それぞれ明確な違いはあるものです。

includeとprependの違いに関しては、特に重要なことだと思ったので記事にさせていただきました。

最後までお読みいただいてありがとうございます！

また次回もあればよろしくお願いいたします！
Shuttle XH410GへVMware vSphere 7.0U1のインストール

#概要
使っていたNUC D54250WYKの更改ついでに備忘録として

#構成
・ベアボーン Shuttle XH410G
　Deskmini H470かShuttle DH410と悩んだ末、PCIeスロットがあるShuttle XH410Gに。
・Core-i5 10400 TDP65W
　10500より5000円ほど安かったのでこれに。
・メモリ　32GBx2 Crucial CT2K32G4SFD8266
　とりあえず積めるだけ（Nested ESXiしたかったので）
・ストレージ WD Blue SN550 NVMe WDS100T2B0C
・USBメモリ SanDisk Ultra Fit SDCZ430-064G-J57
　ESXiインストール用デバイス
　[ESXi7.0からブート領域のパーティションが変わったようなのでとりあえず64GBものを](https://kwmtlog.blogspot.com/2020/04/esxi-7-boot-bank-changes.html)
・AINEX M.2 SSD用ヒートシンク HM-21
　かなりギリギリです。組み立ての画像参照
・SILVERSTONE PCファンフィルター SST-FF143
　上部にある通気口の穴が大きかったので

#1.組み立て
M.2 SSDへヒートシンクをとりあえずつけたのはよかったのですが、CPUのヒートシンク（台座？）と干渉して取り付けれませんでした。
ひとまずM.2のヒートシンクをコネクタ側からネジ側へずらして装着して干渉しないようにしています。
ヒートシンクつける方は気を付けたほうがよいです。

![IMG_20210206_1242212.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1084454/d13a6dbb-c471-5a31-0346-9cd8b83d5a23.jpeg)

CPU・メモリの取り付けについては特段問題なかったです。

#2.ESXiのインストール
Shuttle XH410Gはintel I219LMでvSphere 7.0はデフォルトでインストールできませんでした。
ESXi-Customizer-PSを使ってVMW_bootbank_ne1000-intelnuc_0.8.4-3vmw.670.0.0.8169922.vibのドライバを追加してカスタムイメージを作成したところ成功
自分の環境では、直接isoファイルが作成できなく一旦オフラインバンドルのzip→isoとしたところうまくいきました。
あとはrufusを使ってUSBメモリへ書き込みしてインストール。

![ESXi_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1084454/55cc4e18-90c6-bcbd-aed1-3ef0c1ae9763.png)


#参考
[ESXi のブート領域(Boot Bank)のパーティションについて](https://kwmtlog.blogspot.com/2020/04/esxi-7-boot-bank-changes.html)
[ESXi-Customizer-PS で WinError 10054 となる時の対応](https://buu0528.com/?p=637)
【Swift】Main.storyboard の名前を変更したい

# どういうことか

プロジェクトを作成すると初めから作られている **Main.storyboard** の名前を変更したい。
この記事では **TopViewController.storyboard** という名前に変更する。

## 3箇所の変更が必要

1. まずナビゲーターエリア（左側のファイルなどが並んでいる場所）で直接名前を変更する
2. **info.plist** を修正する。修正箇所は以下画像の選択部分
3. 一番下の `Main storyboard file base name` の部分

こんなかんじです。

![cde7ab7a458f6a81b6bcae475a16a03a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413699/282c4e90-d231-a21e-f378-e377e5090118.png)
いろんな量子ゲートの行列表示と相互関係

量子コンピューティングを勉強していて、よく量子ゲートの動作や量子回路の簡略化の方法を忘れるので、備忘録として投稿します。この分野を勉強する方々にも役に立つと幸いです。主に以下のページを参考にしました。
[The basics of Quantum Computing](https://www.quantum-inspire.com/kbase/introduction-to-quantum-computing/)
[IBM | Quantum Computing](https://www.ibm.com/quantum-computing/)

# 量子ゲートの行列表示

- Pauli-X gate

$$
X = \left(\begin{matrix}
0 & 1 \\\\
1 & 0
\end{matrix}\right)
$$

- Pauli-Y gate

$$
Y = \left(\begin{matrix}
0 & -i \\\\
i & 0
\end{matrix}\right)
$$

- Pauli-Z gate

$$
Z = \left(\begin{matrix}
1 & 0 \\\\
0 & -1
\end{matrix}\right)
$$

- Rx gate

$$
R_x(\theta) = e^{-i\frac{\theta}{2}X} = \left(\begin{matrix}
\cos(\frac{\theta}{2}) & -i\sin(\frac{\theta}{2}) \\\\
-i\sin(\frac{\theta}{2}) & \cos(\frac{\theta}{2})
\end{matrix}\right)
$$

- Ry gate

$$
R_y(\theta) = e^{-i\frac{\theta}{2}Y} = \left(\begin{matrix}
\cos(\frac{\theta}{2}) & -\sin(\frac{\theta}{2}) \\\\
-\sin(\frac{\theta}{2}) & \cos(\frac{\theta}{2})
\end{matrix}\right)
$$

- Rz gate

$$
R_z(\theta) = e^{-i\frac{\theta}{2}Z} = \left(\begin{matrix}
e^{-i\frac{\theta}{2}} & 0 \\\\
0 & e^{i\frac{\theta}{2}}
\end{matrix}\right)
$$

- Phase gate

$$
S = \left(\begin{matrix}
1 & 0 \\\\
0 & i
\end{matrix}\right)
$$

- $\frac{\pi}{8}$ gate (T gate)

$$
T = \exp{(i\pi / 8)} \left(\begin{matrix}
\exp{(-i\pi / 8)} & 0 \\\\
0 & \exp{(i\pi / 8)}
\end{matrix}\right) = \left(\begin{matrix}
1 & 0 \\\\
0 & \exp{(i\pi / 4)}
\end{matrix}\right)
$$

- Hadamard gate

$$
H = \frac{1}{\sqrt{2}}\left(\begin{matrix}
1 & 1 \\\\
1 & -1
\end{matrix}\right)
$$

- controlled not (またはCNOT、controlled X)
第1量子ビットが制御ビット、第2量子ビットが標的ビットの場合の行列：

$$
CNOT_{1, 2} = \left(\begin{matrix}
1 & 0 & 0 & 0 \\\\
0 & 1 & 0 & 0 \\\\
0 & 0 & 0 & 1 \\\\
0 & 0 & 1 & 0
\end{matrix}\right)
$$
量子回路としての表示：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695158/6227e501-df58-9136-21d0-63bbdeb0742f.png)

- 任意のユニタリオペレータ$U$について、以下を満たすような実数$\alpha, \beta, \gamma, \delta$が存在する。

$$
U = e^{i\alpha}R_z(\beta)R_y(\gamma)R_z(\delta)
$$

# 相互関係

相互関係と呼ぶのかは知りませんが、ここでは同じ動作を示す量子回路の組をいくつか説明します。

## 1量子回路

- $XZX = -Z$
- $HXH=Z$
- $HYH=-Y$
- $HZH = X$
- $HTH=R_x(\frac{\pi}{4})$
- $SHZHS^\dagger = Y$
- $S=T^2$
- $XYX=-Y$
- $XR_y(\theta)X=R_y(-\theta)$

## 2量子回路

- controlled Rz gate =

$$
CNOT_{1,2} (I \otimes R_z(-\theta/2)) CNOT_{1,2} (I \otimes R_z(\theta/2))
$$
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695158/fadc1e29-e4f8-29cf-2b07-f301d5179f3f.png)
**==**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695158/af3d7b6b-f590-645f-0415-0a9279bb7706.png)
[Unity]3Dオブジェクトをキャラ単位でスナップ移動させる方法

#概要
ゲームのステージ作成など、1マス単位で3Dオブジェクトを動かしたい時に便利な設定です。
#本文
Sceneビューの上側にあるボタンからスクショの様に辿っていきEdit Grid and Snap Settingsを選びます。
![スクリーンショット (1755).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/ab93ca90-b609-4e3a-ffd3-eea53eedaf79.png)
IncrementSnapのMoveを移動させたい単位（作成中のプロジェクトのキャラクターサイズ）に設定します。今回は0.25 -> 1に設定しました。
![スクリーンショット (1756).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/c12c9be1-b9f9-9eea-c661-90aa583808c9.png)
↓ ちなみに最新バージョンのUnityでは押すボタンが変更されていて、操作もシンプルになっています。
![スクリーンショット 2022-02-09 20.59.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/beb41d11-325f-caad-2b07-bb6815e6680a.png)
CTRLキー(macはcommandキー)を押しながら矢印をドラッグすると設定した単位でキッチリ移動するようになります。
![スクリーンショット (1757).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/52a60074-e758-e6a2-ac34-fa2511ed2d51.png)
#ちなみに
PackageManagerからProGridsをインポートすればCTRLキーを押さなくてもスナップ移動できるようになります。お好きな方でどうぞ。
AWSの「VPCとは何か？」

今回はAWSのVPCについて学習した内容をまとめてみました。

VPCとは、一言で説明すると仮想ネットワークのことです。
具体的には、AWS内部のネットワーク環境内にある自分専用のAWSの領域です。
その領域をどのようなセキュリティルーで守るか？
どの通信が入ってくるのを拒否するか？
などセキュリティ設定も含めたものになります。
AWSの様々なサービスを繋ぎ合わせるとても重要なサービスになります。

まずはじめに、AWSのVPCを理解するために必要な知識を順番に解説したいと思います。

##リージョン
アベイラビリティゾーン(AZ)で囲まれたネットワーク範囲のことを`リージョン`と呼びます。
アベイラビリティゾーン（AZ）とは、クラウドサービスを提供するために設置された複数のデータセンター(サーバ機器や空調・電源設備などを収容する場所)同士を光ファイバ回線を接続して冗長化したものになります。

日本には、東京と大阪のリージョンがあります。

##サブネット
1つの大きなネットワークを小さいネットワークの集合体に分割した際の、それぞれの小さいネットワークのことをサブネットと呼びます。
AWSの場合ではVPC（AWS内部のネットワーク環境内にある自分専用のAWSの領域）という大きなネットワークがあり、その中にある小さいネットワークのことをサブネットと呼んで良いと思います。
サブネットにはPublicサブネットとPrivateサブネットの2種類があります。

####Publicサブネット
インターネット接続可
インターネットゲートウェイへのルーティング有るサブネットのことです。

####Privateサブネット
インターネット接続不可
ルートテーブルにインターネットゲートウェイへのルーティング無いサブネットになります。
プライベートサブネットからインターネット接続を可能とするためには、
Natゲートウェイが必要になります。
Natゲートウェイではアウトバウンドは設定できるが、インバウンドは設定できないことに
注意しておきましょう。


##CIDR表記(IPアドレスの範囲を指定できる)
通信設定をする時には、`IPアドレスの指定`と`サブネットマスク`の両方の情報が必要になります。CIDR表記は、サブネットマスクの単位を端的で見やすくするために考えられた表記方法だと思って頂くと良いと思います。
ちなみにサブネットマスクとは、IPアドレスのどこからどこまでが「どのネットワーク」でどの「コンピューター」からの情報かを示したものになります。

以下は、10.21.59.223のIPアドレスをCIDR表記を用いて通信範囲を表した例です。

```:CIDR表記の場合
0.0.0.0/0        　　    すべてのIPアドレスが使用できる

10.21.59.223/32         10.21.59.223（1の特定のIPアドレスが使用できる）
 
10.21.59.223/24         10.21.59. *  (第３オクテッド255個分のIPアドレスが使用できる)

10.21.59.223/16         10.21. * . * (第３オクテッド＋第４オクテッド = 255×255個分のIPアドレスが使用できる)
```
※例えば上記の(第３オクテッド＋第４オクテッド = 255×255個分のIPアドレスが使用できる)を指定したものをCIDR表示を使用せずに同じ事を表そうとすると以下のようになります。

```:CIDR表記ではない場合
10.21.59.223/255.255.0.0　　　10.21. * . * (第３オクテッド＋第４オクテッド = 255×255個分のIPアドレスが使用できる)
```
このようにCIDR表記を使用した方が指定文が短く、直感的に理解しやすいですよね。
CIDR表記の/(スラッシュ)以降の数値は、サブネットマスクの中にある1の個数を表したものになります。
例えば「/24」と書いてあった場合は、サブネットマスクとして

2進数：11111111.11111111.11111111.00000000
10進数表記：255.255.255.0　を使用しますと言った事を表しています。


##ルートテーブル
サブネットに関連づけて使用するもので、サブネットから外に出ていく通信をどこに向けて発信するかを決めるルール・定義のことです。
ルートと呼ばれるルールで構成されます。

##インターネットゲートウェイ
VPC内のAWSリソースとインターネットを繋げる部分になります。
自動でスケールし、可用性が高いです。
サブネットのルートテーブルを設定して使用します。


##ENI(Elastic network interface)
仮想ネットワークインターフェイスのことをENIと呼びます。
EC2インスタンスのIPアドレスはENIに付与されます。
同じAZ内のインスタンスにアタッチ/デタッチができます。


##Public IPアドレス
AWSのIPアドレスプールより割り当てられる。
インスタンスが再起動、停止終了した場合にこのアドレスは開放されます。

##Elastic IPアドレス
インスタンスにアタッチ/デタッチ可能で静的なパブリックIPアドレスのことです。
インスタンスが再起動、停止、終了しても同一アドレスを保持します。

##セキュリティグループ
AWSの仮想ファイアーウォールサービスのことです。
※セキュリティグループはサブネット単位で設定することはできません。
ENI単位で設定するものになります。
セキュリティグループにはインバウンドルールとアウトバウンドルールがあります。
インバウンドルールは受信許可のルール設定です。
アウトバウンドルールは発信許可のルール設定になります。

##Network ACL
サブネット単位で設定するファイアーウォールのことです。
セキュリティグループの補助的なサービスになります。
セキュリティグループで対応ができない時などにNetwork ACLを使用したりします。

##まとめ
AWSのVPCとは、AWS内部のネットワーク環境内にある自分専用のAWSの領域のことであり、
VPCの内部にはサブネットを設置します。
サブネットにはインターネットに接続可能なPublicサブネットとインターネットに接続ができないPrivareサブネットがあります。
PublicサブネットはIGW（インターネットゲートウェイ）を通してVPC外部のインターネットと接続し、Privateサブネットは、Natゲートウェイを経由してPublicサブネットと接続することができます。
また、サブネット内にはセキュリティグループを設定し、通信範囲をCIDR表記を使用してインバウンドルールとアウトバウンドルールの内容を決めます。
IPアドレスは、動的なPublic IPアドレスとインスタンスが再起動、停止、終了してもアドレスが固定されたElastic Ipアドレスの２種類があります。

他にも色々ありますが、今回は以上とさせて頂きます。

この記事はAWS初学者を導く体系的な動画学習サービス
「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com
STM32L010のMbedでの液晶,AQM0802Aで表示(i2c)(STM32L010F4P6)


1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり

注意
mbedのリビジョンは、125

x PA9,PA10は、いつも間違えるので各自確認のこと

いぞがしい人のために
https://os.mbed.com/users/caa45040/code/AQM0802A_010_test1/

参考
STM32L010のMbedでの温度,STTS751で温度表示(AQM0802A)(STM32L010F4P6)
https://qiita.com/caa45040/items/54b5d2a9425c38b0d908

```c++

#include "mbed.h"
 
#define ADDR     (0x7C) //  address
 
//I2C i2c(I2C_SDA, I2C_SCL);
I2C i2c(PA_10, PA_9);

//DigitalOut myled(LED1);
 
//Serial pc(SERIAL_TX, SERIAL_RX);
 
//volatile char TempCelsiusDisplay[] = "+abc.d C";

int main()
{
 
    char data_read[2];
  
    //init
    wait(0.2);

    data_read[0] = 0x0;

    data_read[1]=0x38;
    i2c.write(ADDR, data_read, 2);

    data_read[1]=0x39;
    i2c.write(ADDR, data_read, 2);

    data_read[1]=0x14;
    i2c.write(ADDR, data_read, 2);

    data_read[1]=0x70;
    i2c.write(ADDR, data_read, 2);

    data_read[1]=0x56;
    i2c.write(ADDR, data_read, 2);

    data_read[1]=0x6C;
    i2c.write(ADDR, data_read, 2);

    wait(0.2);

    data_read[1]=0x38;
    i2c.write(ADDR, data_read, 2);

    data_read[1]=0x0C;
    i2c.write(ADDR, data_read, 2);

    data_read[1]=0x01;
    i2c.write(ADDR, data_read, 2);

    wait(0.2);

    data_read[0]='@';
    data_read[1]='a';
    i2c.write(ADDR, data_read, 2);


    while (1) {

        // Display result
//        pc.printf("temp = %s\n", TempCelsiusDisplay);
//        myled = !myled;
        wait(2.0);

    }
 
}


```

![i2c_8x2_010_5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ef87ecd4-0c9d-c258-413c-9ba3aaee8e36.jpeg)


![i2c_8x2_010_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/6d07cc31-22ed-fc9d-1a95-4de3c26788c1.jpeg)

![i2c_8x2_010_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0a332db5-610c-83a2-8e32-fba3f692f269.jpeg)

![i2c_8x2_010_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/dc18c3d7-5d2e-2d91-01de-cbba384d6f48.jpeg)

![i2c_8x2_010_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9fdb83c4-4449-b299-7432-6c7f1fe9d28b.jpeg)

![i2c_stm32l010_pa9_pa10_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d6e9d8cd-c271-6c27-341d-9930e4bf829c.jpeg)
徳丸基礎試験受験記

#徳丸基礎試験とは
正式名称は「ウェブ・セキュリティ基礎試験」ですが、公式に通称があるので本記事ではこれを使うことにします。なお、試験官に徳丸基礎試験と言っても通じない可能性がある点にはご注意ください。

本試験についてはすでに受験された方がいらっしゃいますので、まずは以下をご覧ください。
https://qiita.com/sano1202/items/a3d451bedd3371e4850b

#勉強方法
大前提として、私は業務でWebアプリケーション診断を実施しており、一定の知識があります。全くの未経験ではありませんのでご注意ください。

実際にやった勉強は、会社行われた勉強会でさらっと復習し、徳丸本を試験前1時間で流し読みしただけです。
基本的な知識を問う問題ばかりですので、実務経験があればこれで十分合格できると思います。

実務経験がない方は、徳丸本（第2版）を十分に理解する必要があります。
SQLインジェクション、XSS、CSRFなどの脆弱性について、各脆弱性がどのようなもので、どのような影響があり、どうすれば対策できるかを理解する必要があります。
事前の情報どおり、PHPに関する問題は一切出題されませんでした、JavaScriptのコードは出題されましたが、前述のとおり基本的な知識を問う問題ですのですので、JavaScriptに深く精通している必要はありません。

#試験について
私がこれまでに取得した資格の中ではかなり簡単な試験でした。これまでセキュリティや開発をやったことがないという人でも、徳丸本をきちんと理解しておけば十分合格できると思います。Web診断の実務経験が半年ほどあるなら私と同じように徳丸本をさらっと復習するくらいでも合格できると思います。

海外の資格のように、翻訳ミスや怪しい翻訳に苦しめられることもなく、出題そのものもシンプルで、「あてはまるものを選択」か「あてはまらないものを選択」のどちらかです。1問だけ正解が2つあるように見える問題がありましたが、経験上そういう問題は調査用の問題で採点されないだろうと思ってスルーしました。

なお、点数は900点でした。

#次の目標
徳丸実務試験を狙いたいところですが、今年はGREMを取得したいのと、CompTIAの資格の更新期限が近いので、CASPが取れたら良いなと思っています。よって受験は少し先になるかもしれません。
【AWS】「CloudTrail ユーザーガイド」を読んでみた[検出に関するベストプラクティス編]

#はじめに
「CloudTrailは良い」という認識は持っているのですが、「使いこなす」レベルには達していないので、ユーザーガイドを読んでみました。
https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/awscloudtrail-ug.pdf
このPDF資料が全352ページと中々えげつないボリューム。
AWS認定資格のアソシエイトレベルなら「AWS上のアクティビティ(APIイベント)を証跡として記録してくれるサービス」という理解だけ持っていれば大丈夫だったと思います。
が、CloudTrailマスターになるには道のりは長そうです…。

ということで、ユーザーガイドを読んで得た知見や試したことを書き残していきます。
今回は「セキュリティのベストプラクティス」の「検出に関するベストプラクティス」を読んだので、しゃべりかけるノリで理解した内容を書いてみます。
私自身の解釈含みます！
※わかりやすいかはわからないので、読んだ方ぜひコメントでご意見ください(__)！

#セキュリティのベストプラクティス
紹介するベストプラクティスは全部重要だけど、「これ全部やれば完璧！」てものではないよ。
なので、「自分の環境でも有効な手段かな？」とか「他にやるべきことはないかな？」とか、使う側でしっかり考えていこうね！


#検出に関するベストプラクティス
4つ紹介するよ。
##証跡の作成
まずは証跡(Trails)を作ったほうがよいよ。
CloudTrailてのはあくまでサービス名で、証跡はイベントログを実際に保管するリソースていうイメージかな。
保管先はS3, CloudWatche Logs, CloudWatchEventsがある。
ちなみに、証跡を作らなくてもコンソール上に90日分のイベント履歴は残る。だから一応直近のできごとについては最初から分析できるね。けど、古いものから削除されてくし、情報も限られてるんよね。
全部のイベントを、古いやつも全部とっときたいならちゃんと証跡を作ろう。

あとデータを管理しやすいように、「ひとつの証跡に」「全リージョンと組織管理下の複数アカウントのイベントをぜんぶ記録する」のがおすすめ。
もしリージョンやアカウントごとに証跡が分割されてたらいちいち「どの証跡みるか」を考えないといけなくてめんどくさい。「何かあったらこの証跡を調べればOK」てものがあれば、いざという時安心だよね。
「簡単にできること」は「続けること」や「いざというときに必ず実施できる」ための重要要素だと思うから、意識しときたいね。

S3のイベント通知とかLambdaでログ加工して、特定用途の追加証跡を作るのもクールかもね。

##証跡は「全てのリージョンに適用」しとこう
ちょっとさっきも触れた話題だね。
ユーザー、ロール、サービスから発生するイベントログを全部完璧に取得するために、全リージョンの証跡を取得するように設定しとこう。
ただ、マネジメントコンソールから証跡を作成した場合は、デフォルトで全リージョンイベント取得の設定になるみたいだから、認識しとくだけでよいかも。
※CLIで証跡作る場合は、明示的にオプション指定する必要あるよ！

「全リージョンでの取得」が有効になってるかを、AWS Configのルールで検知することもできるよ。

##信じられるCloudTrailログでいてもらうには
人から一度でも嘘をつかれると、もうその人のこと信じられなくなると思う。
ITの世界でも「嘘をついているかもしれない」ログは役に立たない。知らない人が変更してたりとか、削除したりとかされるとね。
CloudTrailで「ログファイルの検証設定」をしとけば、「バレずにログを改ざんしたりすること」ができなくなる。
「信じられるCloudTrail」でいてもらうために、設定を有効化しておこう。
「変なことをされてること」に気付けたら、「入口のセキュリティを再確認する」とか「疑わしいログは処分する」とか色々アクションに移せるよね。

##CloudWatch Logsとのコラボ
CloudWatch Logsは、色んなAWSサービスのログを収集して監視できるクールなサービス。
CloudTrailのログを送り込むこともできるんよ。
特定イベントを監視して、アラートを受信するなんてこともできる。
例えば、コンソールへのサインイン失敗とかね。連続的にたくさんサインインの失敗が発生してたら、ちょっと心配よね。
気付いた後、仮にそのユーザにMFA未設定だったら、「これを機に設定しとこう！」とか「そもそもMFA設定義務化しよう！」という行動に移すとかね。
その他にも主要なセキュリティとかネットワークに関するイベントを監視できるみたい。

#感想
CloudTrailの基本機能は「AWS上のAPIイベントを記録する」ってシンプルなものだけど、「じゃあどうやって活用する？」を考え出すと奥深い。
Lambdaでデータ加工検討したりとか、CloudWatch Logsと組み合わせて検知の仕組み作ったりとか。
そもそも活用するには、セキュリティ対策に必要な基本の考えを理解する必要があったりとか。
AWSサービスを勉強すると、IT業界にどんな分野と概念があるのかを勉強するきっかけになって、すごく知見が広がるし面白いなーと思います。

次は、予防のベストプラクティスについて同じことしてみます。
あとは具体的な設定方法とかケーススタディ的なこととか書いていきたい。

#参考情報
AWS CloudTrail ユーザーガイド Version 1.0
https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/awscloudtrail-ug.pdf
※機械翻訳ベースで、正しく訳されていない部分もあるので、腹落ちしない部分は原文で読むことをおすすめします。

Security Best Practices in AWS CloudTrail
https://docs.aws.amazon.com/awscloudtrail/latest/userguide/best-practices-security.html

AWS Well-Architected フレームワーク > フレームワークの 5 本の柱 >セキュリティ
https://wa.aws.amazon.com/wat.pillar.security.ja.html
[Unity]Unity2020以降のPackage Managerでpreviewパッケージを使う

#概要
Unity2020以降ではPackage Managerの一覧にはpreviewパッケージが表示されません。少し設定する必要があります。
#本文
Package Managerの歯車をクリックして表示されるAdvancedProjectSettingsをクリック
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/d7f97134-b0dd-9e69-12a4-f3504909c5c5.png)
EnablePreviewPackageとShowDependenciesにチェックを入れるとpreviewパッケージが表示されるようになります。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/9442a775-880b-1f7c-7e46-ae9f9d2420e4.png)
Error Call to a member function hashName() on nullの解決方法

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

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

今回は
`Error Call to a member function hashName() on null`
が出たのでその解決方法を記録として残します。


## 環境

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


## エラーが出た流れ

下記が今回のエラーが出たviewです

```PHP:resources/views/game/create.blade.php
<h1>新規作成</h1>

<form action="{{ route('game.store') }}" method="POST" id="new">
  @csrf

  <div>
    <label>名前</label><br />
    <input type="text" name="name" value="{{old('name')}}">
  </div>

  <div>
    <label>画像</label><br />
    <input type='file' name="image" accept="image/png, image/jpeg">
  </div>

  <div>
    <label>説明</label><br />
    <textarea id="new" name="describe" value="{{old('describe')}}"></textarea>
  </div>

  <input type="submit" value="登録する">

</form>
```

この状態でstoreで保存の処理を実装していて下記のエラーになりました。

![スクリーンショット 2021-02-05 23.38.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051152/2d8f7bde-85cd-d695-38e9-d46fbf53cb0b.png)


## 解決方法

[こちら](https://qna.habr.com/q/718479)の記事を参考にしました。
ありがとうございます！

viewの`formタグ`に`enctype="multipart/form-data"`を追加することで解決しました。

```PHP:resources/views/game/create.blade.php
<h1>新規作成</h1>

<form action="{{ route('game.store') }}" enctype="multipart/form-data" method="POST" id="new">
  @csrf

 # 省略
</form>
```

詳しい理由は...よく分かりません。

以上です。
windows環境にてpythonのバージョンを指定してvenvを作成する

# 課題
開発端末に複数のpythonがインストールされている場合に
venvで仮想環境を作成するとPATHが通っているバージョンで仮想環境が作成される。
PATHの値を変更せずに異なるバージョンでのvenvの作成方法をここにまとめる。

# venvの作成方法

バージョンを指定せずに（PATHが通ったpythonのバージョンで）venvを作成する

```
python -m venv test
```

バージョンを指定してvenvを作成する

```
py -3.7 -m venv test
```

-x.xの部分にインストールされているpythonのメインバージョンを指定する。

# 参考記事
[Python、venvで仮想環境を作る](https://blog.narito.ninja/detail/171/)
100年有効な自己署名https鍵をOpenSSLコマンドで作る (新Edge, Chrome対応, subjectAltName)

## OpenSSLで100年有効な鍵を作る

```sh
#!/bin/sh
set -eux


SUBJECT="/C=JP/OU=my-localhost"

# server.key
openssl genrsa -out server.key 3072

# server.csr
openssl req -new -key server.key -subj "${SUBJECT}" > server.csr

# server.crt
echo "subjectAltName = DNS:localhost, IP:127.0.0.1" > SAN.txt
openssl x509 -in server.csr -days 36500 -req -extfile SAN.txt -signkey server.key > server.crt

# server.der : 信頼されたルート証明機関用。ブラウザエラー回避に必要。
openssl x509 -inform PEM -outform DER -in server.crt -out server.der

# CSRは不要なため削除
rm -f server.csr
```

以下のように保存。(nginxのダウンロードは後述)

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/7c0fbed9-3754-c5ae-4a86-50a9edfb6d93.png)


### 信頼されたルート証明機関 にインポート

* `server.der`をダブルクリックしインポート

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/a158e482-aa9e-64f1-05e4-c4a582ae4a76.png)


* `信頼されたルート証明機関`での表示名を変更したい場合は、`my-localhost`の箇所を変更のこと。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/ca4119fb-52dc-0552-369c-aee324f5740e.png)

----

## stone.exe

https://localhost にアクセスすると http://localhost のページが表示される例

[公式HP](https://www.gcd.org/sengoku/stone/Welcome.ja.html)の配布分だと`TLS1.0`までしか対応していない。
`TLS1.2`で動作するには[takuya-o/stone](https://github.com/takuya-o/stone/releases)さんの`stone24LB.zip`を使わせていただきました。[おのたく日記(2017-08-24)](https://on-o.com/page/diary/20170824.html) [その他ログ](https://android978.rssing.com/chan-13550390/latest.php)
また、動作には[Visual Studio 2015 の Visual C++ 再頒布可能パッケージ
](https://www.microsoft.com/ja-jp/download/details.aspx?id=48145) の x86版のインストールが必要。(Windowsが64bit版でも。)

```sh
stone.exe -z key=server.key -z cert=server.crt localhost:80 443/ssl
```

出力を抑止したい場合は ` > nul` をつけるとよい。

## nginx

### ダウンロード、解凍

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/dffb8b7e-310d-2047-5b50-4ab7779a5719.png)


### conf/nginx.conf

```nginx:conf/nginx.conf
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    # HTTPS server
    server {
        listen       443 ssl;
        server_name  localhost;

        ssl_certificate      ../_cert/server.crt;
        ssl_certificate_key  ../_cert/server.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   html;
            index  index.html index.htm;
        }
    }


}
```

### 接続確認

* http://localhost:443 にアクセスし表示できることを確認。

### nginx.exe を終了させるのに便利なコマンド

```vb
taskkill /im nginx.exe /f
```

----


## mkcertの例 (こちらは有効期限2年ちょい)

* https://github.com/FiloSottile/mkcert

```sh
apt install -y libnss3-tools
```

```sh
wget "https://github.com/FiloSottile/mkcert/releases/download/v1.4.3/mkcert-v1.4.3-linux-amd64" \
 -O mkcert

chmod +x mkcert
```

```sh
./mkcert -install
cp  ~/.local/share/mkcert/rootCA.pem rootCA.crt

./mkcert localhost
mv localhost-key.pem server.key
mv localhost.pem server.crt
```

* `rootCA.crt`をブラウザの`信頼されたルート証明機関`に入れる。
パスワード設定したSwitchBotをESP32(M5Atom)からコントロールする！！

# 目的

* 玄関の照明を自動点灯するためにSwitchBotを、PIRセンサを付けたM5Atomからコントロールする。
* ただ、SwitchBotはデフォルトだとBLEが届けばアプリからコントロールできてしまうので、パスワード設定した状態のSwitchBotをM5AtomからBLEでコントロールする
* この記事ではPIRセンサ部分は割愛

# 参考URL(というか以下URLの内容まるぱくり…^^;)

* BLEのサンプルコード: https://github.com/h2zero/NimBLE-Arduino/blob/master/examples/NimBLE_Client/NimBLE_Client.ino
(Arduino標準のBLEだとCharacteristicの取得がうまくいかなかったのと、容量が大きいため、NimBLEを使用) 
* パスワード設定したSwitchBotをコントロールするPythonコード: https://github.com/Danielhiversen/pySwitchbot

# 事前準備

* 上記のPythonコードをお借りした以下のコードで、パスワードをエンコードしてコマンド文字列を生成する

```python:pass.rb
import binascii
KEY_PASSWORD_PREFIX = '5711'
ON_KEY_SUFFIX = "01"
OFF_KEY_SUFFIX = "02"
PRESS_KEY_SUFFIX = "00"
key_suffix = PRESS_KEY_SUFFIX # ここをON/OFF/PRESSのいずれかに変更する
password = 'password' #SwitchBotに設定したパスワード
_password_encoded = '%x' % (binascii.crc32(password.encode('ascii')) & 0xffffffff)
print(KEY_PASSWORD_PREFIX + _password_encoded + key_suffix)
```

* 出力結果(例だと`571135c246d500`)をArduino用に2文字ずつ`,`で区切って`0x`をつける

```cpp
static uint8_t cmdPress[7] = {0x57,0x11,0x35,0xc2,0x46,0xd5,0x00};
```

# NimBLEのサンプルコードを流用する

1. 対象ソース: https://github.com/h2zero/NimBLE-Arduino/blob/master/examples/NimBLE_Client/NimBLE_Client.ino
* ソース中の`DEAD`(=サービスUUID)をSwitchBotのもの`cba20d00-224d-11e6-9fb8-0002a5d5c51b`に変更する
* ソース中の`BEEF`(=CharacteristicUUID)をSwitchBotのもの`cba20002-224d-11e6-9fb8-0002a5d5c51b`に変更する
* ソース中の`BEEF`(=CharacteristicUUID)をSwitchBotのもの`cba20002-224d-11e6-9fb8-0002a5d5c51b`に変更する
* https://github.com/h2zero/NimBLE-Arduino/blob/ad4d5779622392568fb42a2016b4611e77d67ab5/examples/NimBLE_Client/NimBLE_Client.ino#L213 の`Tasty`を事前準備で作成した`cmdPress`に置き換える。(もちろん`static uint8_t cmdPress[7]...`をこれより前で宣言しておく)

```cpp:NimBLE_Client.inoの213行目
                if(pChr->writeValue(cmdPress)) {
```

# 以上
STM32F303K8のMbedでの液晶,AQM0802Aで表示(i2c)


1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり

おまけ
古いスイッチサイエンスのソースを参考にしました。
aと表示される。

```c++

#include "mbed.h"
 
#define ADDR     (0x7C) //  address
 
I2C i2c(I2C_SDA, I2C_SCL);
 
DigitalOut myled(LED1);
 
Serial pc(SERIAL_TX, SERIAL_RX);
 
volatile char TempCelsiusDisplay[] = "+abc.d C";

int main()
{
 
    char data_read[2];
  
    //init
    wait(0.2);

    data_read[0] = 0x0;

    data_read[1]=0x38;
    i2c.write(ADDR, data_read, 2);

    data_read[1]=0x39;
    i2c.write(ADDR, data_read, 2);

    data_read[1]=0x14;
    i2c.write(ADDR, data_read, 2);

    data_read[1]=0x70;
    i2c.write(ADDR, data_read, 2);

    data_read[1]=0x56;
    i2c.write(ADDR, data_read, 2);

    data_read[1]=0x6C;
    i2c.write(ADDR, data_read, 2);

    wait(0.2);

    data_read[1]=0x38;
    i2c.write(ADDR, data_read, 2);

    data_read[1]=0x0C;
    i2c.write(ADDR, data_read, 2);

    data_read[1]=0x01;
    i2c.write(ADDR, data_read, 2);

    wait(0.2);

    data_read[0]='@';
    data_read[1]='a';
    i2c.write(ADDR, data_read, 2);


    while (1) {

        // Display result
        pc.printf("temp = %s\n", TempCelsiusDisplay);
        myled = !myled;
        wait(2.0);

    }
 
}


```
【PHP】連想配列の展開

知識を整理するための個人的な備忘録です。

##`$members`が連想配列の時

###バリューのみ表示
```php
foreach ($members as $member) {
  echo $member;
}
```

###キーとバリューそれぞれを表示
```php
foreach ($members as $key=>$value) {
  echo $key . 'は' . $value;
}
```
多段階の配列を展開するときは、`foreach`の中で`foreach`を使うこともある。
Vue.jsで分かりやすいクラスバインディング

# 始めに
Vue.jsにはクラス名のバインディング方法はいくつかありますがどのパターンで書いたら綺麗に書けるか分からずごちゃごちゃしてしまった時があると思います。色々考えてこのやり方だとほぼ1つのパターンで表現できると思うので、それについて紹介したいと思います。

```vuejs
<template>
  <div>
    <!-- stringの変数を直接バインディングして1つだけ設定 -->
    <div :class="$data.className"></div>
    <!-- 配列で複数クラスを設定 -->
    <div :class="[$data.className, $data.className2]"></div>
    <!-- オブジェクトでtrueのキー名だけ設定 -->
    <div :class="{ 'flag-class': $data.flag }"></div>
  </div>
</template>
```

[クラスとスタイルのバインディング](https://jp.vuejs.org/v2/guide/class-and-style.html)

# 結論
結論を言うと**全部オブジェクトで設定する**になります。オブジェクトの場合は以下のように書けるため、どのやり方でも設定できます。

```vuejs
<template>
  <div>
    <div
      :class="{
        [$data.className]: true,
        [$data.className2]: true,
        'flag-class': $data.flag,
      }"
    >
    </div>
  </div>
</template>
```

## よくやりがちな対応
上記のやり方を知らないと以下のように頑張ってやるのを見かけます😅2つくらいならまだなんとかなりますが、3つ以上になるとかなり分かりづらくなりますよね。。

```vuejs
<template>
  <div>
    <!-- 3項演算子を駆使して上手くつなげる -->
    <div :class="$data.className + ($data.flag ? ' flag-class' : '')"></div>
    <div :class="[$data.className, $data.flag ? 'flag-class' : '']"></div>
  </div>
</template>
```

# 終わりに
以上がVue.jsで分かりやすいクラスバインディングの方法でした。とにかくオブジェクトで設定する癖をつけておけばどんなパターンでも基本的には対応できると思うので是非参考にしてみてください。
なおtemplate部分をpugで書く場合で改行できずに苦しんでいる方はこちらの記事を参考にしてもらえると嬉しいです。

[Vue.jsのpug templateで途中で改行を入れたい場合](https://qiita.com/wintyo/items/f9e2aa0617c21aa6162f)