OmniAICreator/Qiita-1.07M huggingface dataset:
AWS IoT SQLを用いた日本標準時の生成方法

# はじめに
　とあるIoT機器からAWSへ送信されるデータを、AWS IoT Core経由でAmazon S3へ保存する機会に恵まれ、Amazon S3のオブジェクトキーに日本標準時の日付を使用する方法をまとめた。

# 条件
* AWS CLIをインストール済み
* AWS IoT CoreにアタッチするIAMロールを作成済み
* Amazon S3を作成済み

# 方法
　ルールを記述するペイロードファイルのAmazon S3オブジェクトキー記述部分にAWS IoT SQL Functionの`timestamp()`と`parse_time(String, Long[, String])`を用いる。

## ペイロードファイル(JSONフォーマット)

```.json
{
  "awsIotSqlVersion": "2016-03-23",
  "sql": "SELECT * FROM 'topic/name'",
  "ruleDisabled": false,
  "actions": [
    {
      "s3": {
        "roleArn": "role_name",
        "bucketName": "bucket-name",
        "key": "${parse_time('yyyyMMddHHmmss', timestamp(), 'Asia/Tokyo')}"
      }
    }
  ]
} 
``` 

ペイロードファイルの解説

* `sql`キー: AWS IoT Coreでの受信データをフィルターしている。`topic/name`部分を各々の環境に合わせた書換えが必要。
* `"ruleDisabled"`キー: ルールの有効/無効設定。有効化する場合は値に`false`を記述する。
* `roleArn`キー: 値にIAMロールのARNを入力する。IAMロールは各々の環境に合わせて別途作成しておく必要がある。
* `"key"`キー: 値にオブジェクトキーを記述する。`"Literal"`のように固定のキーを記述することも可能だが、ここでは関数が使用できて現在日付のように動的にオブジェクトキーを生成することができる。オブジェクトキーにストアした現在日本標準時を含めたい場合は、2つの関数`timestamp()`と`parse_time(String, Long[, String])`を使用して日付を取得する。`timestamp()`はミリ秒単位のUTC時刻を返す。`parse_time(String, Long[, String])`の第一引数にjoda-Timeフォーマットで日付パターン、第二引数にミリ秒単位でUNIX時刻、第三引数にタイムゾーンを指定すると第一引数で指定したパターンに従って日付を返す。上記ペイロードファイルの例では、現在時刻が日本標準時の2021年11月1日11時11分11秒場合、Amazon S3に`20211101111111`のオブジェクトキーがストアされる。オブジェクトキーを西暦、月で区切りたい場合はペイロードファイル`"key"`の列を下記のように記述すればよい。

```
"key": "${parse_time("yyyy", timestamp(), "Asia/Tokyo")}/${parse_time("MM", timestamp(), "Asia/Tokyo")}/file_name"
```

ルールの生成

```
$ aws iot create-topic-rule --rule-name rule_name --topic-rule-payload file://file_name.json
```

上記のコマンドを実行するとルールが生成される。`rule_name`, `file_name.json`部分は各々の環境に合わせて書換えが必要。

# 参考資料
* [Creating an AWS IoT rule](https://docs.aws.amazon.com/iot/latest/developerguide/iot-create-rule.html)
* [AWS IoT SQL Functions](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sql-functions.html)
Go言語でプライベートなGithubリポジトリにあるモジュールを利用し、DockerでBuildを行う方法

## 経緯

- Go 言語で開発したバックエンド API を Docker イメージにビルドしたい
- Go モジュールに社内で共有している非公開リポジトリにあるライブラリ（非公開ライブラリ）を含んでいる
- docker のイメージをビルドするとき、go mod download の箇所でライブラリにアクセスできないためエラーとなる

## 原因

- Docker ビルド時に Gitの認証情報を含んでいないため、非公開ライブラリにアクセスできない
- マイPCにはGitアカウントの認証情報があるため、ローカル環境では問題なく go install が行える

## 対応

- 秘密鍵を生成し、非公開リポジトリに公開鍵を設定する
- バックエンド API に、非公開ライブラリにSSH通信するための秘密鍵とSSHのconfigを配置する
- Dockerfile で 非公開ライブラリにアクセスするための設定を行う

秘密鍵をGitリポジトリにおくことに抵抗がある人は、github の secrets を利用するなりしてください

### 秘密鍵を生成し、非公開リポジトリに公開鍵を設定する

- 秘密鍵と公開鍵を生成する

```bash
ssh-keygen -t rsa
```

Windows でも Git をインストールすれば ssh-keygen を利用できると思います 

- 非公開なGithubリポジトリに公開鍵を登録する

Github 公式に手順が記載されています

https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account


### バックエンド API に、非公開ライブラリにSSH通信するための秘密鍵とSSHのconfigを配置する

- 秘密鍵とconfigの配置

以下のディレクトリ構成を想定します。certs以下に secrets.pem と config を配置しています

```
/
├ certs
│   ├ secrets.pem  # 秘密鍵
│   └ config # SSH Config
├ main.go
├ go.mod
└ dockerfile
```

- config

```config
Host github.com
  Hostname github.com
  User git
  IdentityFile /go/src/certs/readonly
```


### Dockerfile で 非公開ライブラリにアクセスするための設定を行う

該当の部分だけ記載します

- dockerfile

```dockerfile
COPY ./certs/config  /root/.ssh/config
RUN chmod 600 ./certs/readonly
RUN chmod 600 /root/.ssh/config
RUN git config --global url."git@github.com:<account>/<repository>".insteadOf "https://github.com/<account>/<repository>"
RUN ssh -o StrictHostKeyChecking=no -i ./certs/readonly -T git@github.com || true
RUN export GOPRIVATE=github.com/<account>/<repository>
RUN go mod download
```

エラーが出なければ OK

## 追記

### 2021-11-19

- Linux(WSL) で動作検証をしています。Windows で試すときは CRLF <=> LF などを注意してください
- SSH 周りのエラーを確認したいときは、

```dockerfile
RUN ssh -o StrictHostKeyChecking=no -i ./certs/readonly -T git@github.com || true
```

の部分を

```dockerfile
RUN ssh -o StrictHostKeyChecking=no -i ./certs/readonly -T git@github.com
```

にして実行してみてください。

```
Hi xxxxxx/xxxxx! You've successfully authenticated, but GitHub does not provide shell access.
```

以外のメッセージが出ていれば成功しています。
Laravelのファイルアップロード処理をFetchAPIで書き直した

Internet Explorer のサポート廃止に伴い、Laravelアプリケーションのファイルアップロード処理を焼き直してみました。

# View（フロントエンド）の修正

```html:修正前HTML
<form method="POST" action="{{ route('upload') }}">
  @csrf
  <input type="file" name="csvfile">
  :
```

HTML5の**FormDataオブジェクト**をJavaScriptで作成し、サーバに送信します。
FormDataオブジェクトにセットするファイルは、コンストラクタから既存のform要素で渡せますが、今回はinput要素を`append()`メソッドで直接追加するため、form要素は削除します。

```html:修正後HTML
<input type="file" name="csvfile">
```

対して、JavaScriptのコードは増えます。
**アロー関数**や**Promiseチェーン**など、**ES6**（ECMAScript2015）で書いているのでpolyfillしないとIEでは動きませんが、IEはサポートしないと利用者に断っているので問題ありません。Promiseは非同期処理のコールバック関数を簡単に記述できる便利な仕組みですが、それだけで記事になるくらいの情報量なのでここでは説明しません。

```javascript:JavaScript(ES6)
// このメソッドは clickやdropイベントで起動する
// filesはinput要素
function handleFileUpload(files) {
  const fd = new FormData();
  fd.append('csvfile', files[0]); //先頭のファイルのみ追加

  fetch('{{ route("upload") }}', {
    method: 'POST',
    body: fd,
    headers: {
      'X-CSRF-TOKEN': '{{ csrf_token() }}' //Laravelの場合これが必要
    },
  })
  .then(res => {
    if (!res.ok) { //通信失敗
      throw new Error(`${res.status}: ${res.statusText}`);
    }
    return res.json(); //JSONを取り出して次のチェーンへ
  })
  .then(json => {
    if (json.result) { //正常
      $('#guide').text(`${json.category}のデータを${json.count}件登録しました`); //$()はjQuery
    } else { //アプリケーションレベルのエラー
      $('#guide').text(json.message); //$()はjQuery
    }
  })
  .catch(error => alert(error.message))
};
```

FormDataオブジェクトは、従来の`XMLHttpRequest`（XHR）や`ajax`の非同期通信でもサーバに送信できますが、タスクの順列・並行処理の指定が困難なので、Promiseを返却できるモダンなAPIの`fetch`を使います。
`fetch`が返すResponseオブジェクトには便利な`ok`プロパティがあり、HTTPステータスコードが200番台だとtrueがセットされます。

さて、Laravelフレームワークにも当然、**クロスサイトリクエストフォージェリ（CSRF）攻撃**を弾く仕組みがありますので、非同期通信のPOSTでも正しいCSRFトークンが必要です。リクエストヘッダの`X-CSRF-TOKEN`に`csrf_token()`を指定してあげれば良いです。

# Controller（バックエンド）の修正
クライアントからファイルを受け取る処理は変わりません。
返却値をJSON形式に書き替えるだけです。

```php:修正前PHP
//正常時
return view('aaa')->with('category', 'XXX')->with('count', $count);

//異常時
return view('aaa')->with('message', 'ファイルが不正です');
```

Laravelのコントローラでは、配列を返却すると、ヘッダ含めてJSON形式に変換してくれます。

```php:修正後PHP
//正常時
return ['result' => true, 'category' => 'XXX', 'count' => $count ];

//異常時
return ['result' => false, 'message' => 'ファイルが不正です'];
```

次回は、気が向いたらフロント側の処理を掘り下げて記事にしようと思います。
Docker + Visual Studio Code で PlantUML を使う

何番煎じか分かりませんが、導入にはまった箇所があったのでメモしておきます。

# 導入手順
ドキュメント管理用のディレクトリに以下を作成しておきます。

```yml:docker-compose.yml
version: '1'
services:
  plantuml-server:
    image: plantuml/plantuml-server
    container_name: plantuml-local-server
    ports:
      - "9876:8080"
```
VSCode でドキュメント管理用ディレクトリを開き`docker-compose.yml`を右クリック→Compose Up で PlantUML Server を立ち上げることが出来ます。
*使用 Port を変更しています。

**この時`container_name`が無いとエラーになります。**

次に VSCode に拡張機能を追加します。
必須なのは **[Markdown Preview Enhanced](https://marketplace.visualstudio.com)** のみです。

Markdown Preview Enhanced インストール後に、
Markdown-preview-enhanced: Plantuml Server
を変更します。

```JSON
"markdown-preview-enhanced.plantumlServer": "http://localhost:9876/svg/"
```
この時、上記を入れただけではプレビューにエラー(`TypeError: Only HTTP(S) protocols are supported`)が出てしまい切り分けに時間がかかってしまいました。
**結論だけ言うとエラーを無視して設定後に VSCode をリスタートすることで無事反映させることが出来ました。**
**Port と ディレクトリ(svg)に注意してください。**

これでドキュメント管理が楽になるはず！

＃ おまけ
Markdown Preview Enhanced は html を理解するようで、以下のような記述が出来ます。

~~~markdown:test.md
 <div class="title">システム名
     <div>概要</div>
 </div>
# test h1
## test h2
```plantuml
@startuml
title 自販機のシーケンス
actor "ユーザー"
"ユーザー" -> "パネル" : お金を入れる
"ユーザー" -> "パネル" : 商品ボタンを押す
"パネル" -> "レジスター" : 硬貨が格納される
"ディスペンサー" -> "パネル" : ドリンクが出る
"パネル" -> "ユーザー" : 商品を取る
@enduml
```//ここは```だけです。エスケープ方法が分からなかった。。。
~~~
適当な CSS を
markdown-preview-enhanced.customizeCss
にあててやると、以下のような表示が可能です。

![スクリーンショット 2021-11-01 113536.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69125/1233002a-31e3-83cc-02a2-8ca4b166e60b.jpeg)
エッジコンピューティングを実現するCouchbase Mobile紹介：Sync Gatewayによるデータ同期におけるフィルタリング

## はじめに

Couchbase Mobileは、エッジコンピューティングを実現するデータプラットフォームであり、AndroidやiPhone(Swift, Objective-C)のようなスマートフォンやエッジデバイス用の組込データベースであるCouchbase Liteと、Couchbase Server、そしてそれらの間のデータの同期を実現する、Sync Gatewayから構成されます。

[エッジコンピューティングを実現するCouchbase Mobile紹介：Sync Gatewayによるデータ同期におけるアクセス制御モデル](https://qiita.com/yoshiyuki_kono/items/b9eb6ddae93fc98f4f7b)では、データ同期に参加するモバイル端末/ユーザーの観点からみたコントロールについて紹介しました。

本稿では、データ同期されるデータ（ドキュメント）の観点からみたコントロールについて紹介します。

[Couchbase Mobileアプリケーション開発へのロードマップ](https://qiita.com/yoshiyuki_kono/items/6a5bbad1b02196a25417)もご覧ください。

## 設定方法
Sync Gatewayは、同期プロセスをカスタマイズするためのJavaScript関数の使用をサポートしています。
次のいずれかの方法で設定することができます。

- 構成ファイル内のインラインJavascript関数
- 外部Javascriptファイル
- 外部HTTP/HTTPSエンドポイント

3.0ベータより前は、構成ファイル内のインライン関数で設定が行われていました。
3.0ベータ以降、Javascript関数の構成は、管理REST APIを使用して行われます。

外部JavaScript関数をHTTPSエンドポイントでホストし、サーバーCA証明書と組み合わせたセキュアな接続を実現することができます。


## 関数定義

インラインJavaScript関数は、バックティックペア（``）で囲む必要があります。

```JSON
//
{
  //  ... may be preceded by additional configuration data as required by the user ...
  "databases": {
    "getting-started-db": {
      "bucket": "getting-started-bucket",　①
      "import_docs": true,
      "num_index_replicas": 0, 
      "import_filter": `
        function(doc) { 
          if (doc.type != "mobile") {　②
            return false
          }
          return true
        }`,
      "sync": `function (doc, oldDoc) {
        if (doc.sdk) {
          channel(doc.sdk);
        }
      }`
    }
  }
  //  ... may be followed by additional configuration data as required by the user ...
}
//
```


①インポートフィルターを設定するバケット名。
②「type」プロパティが、「mobile」に等しいをドキュメントのみをインポートします。

## 最後に

インポートフィルターを、次のような目的で使うことが考えられます。

- ドキュメントの種類に応じて、モバイルでの利用の必要有無を反映させる。
- ドキュメントの作成年月日に応じて、モバイルでの利用の必要有無を反映させる。
- アプリケーションが設定するフラグによって、インポート処理実行の必要性を反映させる。

上記にとどまらない、アプリケーションの要件に応じた、利用方法が実現できることは、フィルタリング機能が、JavaScript関数として提供されている利点といえるでしょう。


## 参考情報

https://docs.couchbase.com/sync-gateway/3.0/import-filter.html
AWS IoTのポリシー名から紐づく証明書を取得する


# 何がしたいか

AWS IoTのPolicy名から紐づく証明書がわかるかの調査です。

これができるなら、MACアドレスやdeviceのIDなどデバイス固有の値をPolicy名にすることで、DBなどにdeviceと証明書の紐付き情報を持たずに、以下項目ができると考えています。

* デバイス再登録時に証明書を再作成する
    * ポリシーはそのままで、証明書を削除&作成する
* デバイス削除時にポリシーと証明書を削除する
    * 証明書もポリシーも削除する


## Policyが紐づいている証明書のArnを表示

```bash
aws iot list-targets-for-policy --policy-name <ポリシー名>
```

取得できる情報

* targets
    * 証明書のarnのリスト



# 結論

ポリシー名から証明書を引くことはできる。


# おまけ

## Policyの内容を名前から表示

```bash
aws iot get-policy --policy-name <ポリシー名>
```

取得できる情報

* policyName
* policyArn
* policyDocument
* defaultVersionId
* creationDate
* lastModifiedDate
* generationId
Raspberry Pi でブロックチェーンの実証実験を行う(その1)

**はじめに**
CQ出版社刊：「ラズパイで作るブロックチェーン暗号化コンピュータ(2020年3月1日 初版) を参考にして
ブロックチェーンの実証実験を行った。
この書籍に記載されている流れが私にとっては、非常に理解し難いため　ここに整理をして記載する。
※この記事を見ただけでは、出来ません！！
※是非、「ラズパイで作るブロックチェーン暗号化コンピュータ」を購入した上で参考にして下さい。
[(その２)は、こちらから](https://qiita.com/ytetsuo/items/e6b2aa2931b046191e82)


![50281l.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2056854/919fae50-0ed8-1c35-5a8d-f60d4720cce6.jpeg)
[ラズパイで作る ブロックチェーン暗号コンピュータ](https://shop.cqpub.co.jp/hanbai/books/50/50281.html)
[https://shop.cqpub.co.jp/hanbai/books/50/50281.html](https://shop.cqpub.co.jp/hanbai/books/50/50281.html)

---
**実行環境の構築**
本書の P.166 - 168 では、Mac上での ブロックチェーン環境構築手順が記載されている。
Raspberry Pi での構築手順は、P.194-197に 書かれているが 記述が非常に分かり難くい。
Mac上での構築方法を参考にする方が良い。(同じ手順で 構築できる)

Step1: GO言語のインストール
&emsp;&emsp; &emsp;[私が以前作成した記事：https://qiita.com/ytetsuo/items/60b654c0bac40d17c575](https://qiita.com/ytetsuo/items/60b654c0bac40d17c575)で
&emsp;&emsp; &emsp;GO言語に関する(前半)部分を行う。

~~Step2: 必要なパッケージの準備~~
~~&emsp;&emsp; ECHO (上段) および JWT-JSON Web Token (下段)~~
※書籍に記載されているECHOのパッケージの準備は、不要！

Step3: プログラムファイルを入手
&emsp;&emsp;&emsp; 書籍を購入して、入手先を確認して下さいね！！

Step4: 作業ディレクトリにファイルを置く
&emsp;&emsp;&emsp; ※書籍通りにせずとも、自分の好きな作業ディレクトリで良い！

Step5: GO言語のモジュール管理(書籍には、未記載)
&emsp;&emsp;&emsp; ※最新の GO言語(1.11 以上) で必要

```
.....:~/MyWork/MyBlockChain $ go mod init exsample.com/MyBlockChain
.....:~/MyWork/MyBlockChain $ go mod tidy
```

Step6: ソースコードの修正
&emsp;&emsp; &emsp; 1. Main.go  の中
&emsp;&emsp; &emsp; &emsp; "github.com/labstack/echo/v4"
&emsp;&emsp; &emsp; &emsp; "github.com/labstack/echo/v4/middleware"
&emsp;&emsp; &emsp; &emsp; "exsample.com/MyBlockChain/Block"
&emsp;&emsp; &emsp; &emsp; "exsample.com/MyBlockChain/P2P"

&emsp;&emsp; &emsp; 2. Block.go  の中
&emsp;&emsp; &emsp; &emsp; "exsample.com/MyBlockChain/P2P"

Step7: ビルド

```
$ go build
```

Step8: 起動方法 (P.198 に サラリと書かれている・・・分かり難くい！！)

```
$ ./MyBlockChain -host xx.xx.xx.xx -apiport 3000 -p2pport 4000 -first
```
※xx.xx.xx.xx：IPアドレス

---

☆2021年11月 1日(月) 午前11時45分 初版(Ver1.00) 作成

---
GitHubのプライベートリポジトリをBitBucketに移行する

### 1. GitHubでアクセストークンを発行する

  GitHubにログインした状態で[Settings > Developer settings > Personal access tokens > Generate new token](https://github.com/settings/tokens/new)を押下する。

  Note(使用用途などを書くとよいと思われる)、期限、スコープを設定して、アクセストークンを発行したら、メモする。

### 2. BitBucketに移行する

BitBucketにログインした状態で[Create > インポート リポジトリ](https://bitbucket.org/repo/import)を押下する。

下記の画像を参考に情報を入力して、[リポジトリのインポート]を押下する。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330109/f401e162-8806-4a49-1292-0be09d1ff9b3.png)
HerokuとローカルのDBの同期

#はじめに
herokuでデプロイする際、ローカルで作成済みのDB(今回はpostgresql)をそのままHerokuのDBに移行する方法

#環境
・mac os
・postgresql

#ローカルDB→Heroku

```
PGUSER=username PGPASSWORD=password heroku pg:pull DATABASE_URL dbname --app appname
```

既にHeroku上にDBが存在する場合、エラーが発生するので下記コマンドでdbをリセット後、改めて上記のコマンドを実行

```
 heroku pg:reset --app appname
```
Raspberry Pi OS 64bit メモ

Raspberry Pi OS 64bit(2021-05-07-raspios-buster-arm64-lite)
を使用して？となったことのメモ。

#phpMyAdminがない(2021年10月31日時点)
```text:コマンド
sudo apt install phpmyadmin
```

```text:結果
Package phpmyadmin is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source

E: Package 'phpmyadmin' has no installation candidate
```
となってphpMyAdminをインストールできない。
どうやら64bit版だとphpMyAdminはBackports repositoriesにあるとのこと。
なのでaptのsources.listにバックポートのurlを追加してインストールする。

```text:コマンド
sudo apt edit-sources
```
でsources.listを編集。

```text:
deb http://deb.debian.org/debian buster-backports main
```
を追加。

```text:コマンド
sudo apt update
```
でパッケージ一覧を更新して

```text:コマンド
sudo apt install phpmyadmin
```
で上手くいく。
正しいやり方は

- https://forums.raspberrypi.com/viewtopic.php?t=283586
- https://wiki.debian.org/Backports
AtCoder Beginner Contest 225の[C - Calendar Validator]

SwiftでAtCoder Beginner Contest 225の[C - Calendar Validator]を解きました。

## 問題内容

> 問題文
10の100乗行7列の行列Aがあり、任意の整数対 (i,j) (1≤i ≤10の100乗,1≤j≤7) についてその(i,j)成分は(i−1)×7+jです。
N行M列の行列Bが与えられるので、BがAから一部の矩形領域を（向きを変えずに）切り出したものであるかを判定してください。

https://atcoder.jp/contests/abc225/tasks/abc225_c

## 解答コード

```swift
import Foundation

let aa = readLine()!.split(separator:" ").map{Int($0)!}
let n = aa[0]
let m = aa[1]

var array : [[Int]] = []

var flag = true

for _ in 0..<n{
    let aa = readLine()!.split(separator:" ").map{Int($0)!}
    array.append(aa)
}
for i in 0..<m{
    for ii in 1..<n{
        if array[ii][i] - array[ii - 1][i] != 7{
            flag = false
        }
        
    }
}
for i in 0..<n{
    for ii in 1..<m{
        var after = array[i][ii] % 7
        var before = array[i][ii - 1] % 7
        
        if before == 0 {
            before = 7
        }
        if after == 0 {
            after = 7
        }
        if after - before != 1{
            flag = false
        }
    }
}

if flag == true{
    print("Yes")
}
else{
    print("No")
}
```
二次元配列を作って、

上より下の方が7大きい
左より右の方が1大きい

ことを確認しています。

ただ、右端が7の倍数になることを考えると7,8,9と並ぶことはありえませんので、左より右の方が1大きいことを確認する際は、7で割った時のあまり（7の倍数は0ではなく7にする）を比較しています。

コードが長めになってしまいましたがACが出たので良かったです。

## Swiftのお役立ち情報

https://wagtechblog.com/programing/swift-iphone-application-school

https://wagtechblog.com/programing/swift-textbook.html
Android11でアプリ内の領域に出力したファイルを自分の手元のPCに持ってこようとしたら Permission denied と言われる件

# 概要
掲題について、調べると手順が出てくるのですが、おおよそ

- Android端末内の/sdcard/にファイルを一度コピー
- それをadb pull でPCへコピー

という手順になるのですが /sdcard/（実際には /storage/self/primary へのシンボリックリンク）へのコピーが Permission denied となってしまいました。

# 端末
Android11


# 今回の回避方法
おそらく正しいアプローチがあるのだと思いますが、今回そこまで時間をかけられなかったので、以下でとりあえずの回避が出来ました。

アプリのファイルのパスを確認

```
TANMATSU:/ $ run-as com.xxx.xxxxxxxxzzz
TANMATSU:/data/user/0/com.xxx.xxxxxxxxzzz $ cd files
TANMATSU:/data/user/0/com.xxx.xxxxxxxxzzz/files $ pwd
/data/user/0/com.xxx.xxxxxxxxzzz/files
TANMATSU:/data/user/0/com.xxx.xxxxxxxxzzz/files $ ls -l
total 145996
-rw-rw---- 1 u0_a299 u0_a299 50285969 2021-10-31 12:27 file1.txt
-rw-rw---- 1 u0_a299 u0_a299 50285969 2021-10-31 12:27 file2.txt
-rw-rw---- 1 u0_a299 u0_a299 50285969 2021-10-31 12:27 file3.txt
```

adb shell の run-as からの cat コマンドで、手元のPCに対して出力させます。

```
adb -d shell "run-as com.xxx.xxxxxxxxzzz cat /data/user/0/com.xxx.xxxxxxxxzzz/files/file1.txt" > file1.txt
adb -d shell "run-as com.xxx.xxxxxxxxzzz cat /data/user/0/com.xxx.xxxxxxxxzzz/files/file2.txt" > file2.txt
adb -d shell "run-as com.xxx.xxxxxxxxzzz cat /data/user/0/com.xxx.xxxxxxxxzzz/files/file3.txt" > file3.txt
```

# 参考

[こちら](https://stackoverflow.com/questions/20891597/copy-db-file-with-adb-pull-results-in-permission-denied-error) を参考にしました。
グローバル同一サーバーを採用するゲームのバックエンドアーキテクチャのソリューション

グローバル同一サーバーを採用するゲームのバックエンドアーキテクチャのソリューション
前回は2種類のバックエンドアーキテクチャの長所・短所を比較した。今回はグローバル同一サーバを使用する場合の技術的ソリューションを説明する。

1，	グローバル同一サーバのアーキテクチャ

このタイプのアーキテクチャでは、全世界でプレイヤーが同じサーバクラスタに接続する。最大の課題は遅延である。特にネット環境が遅れているリージョンでは、パケットロスやジッターなどにより、ゲームプレイが不安定になってしまう。
そのため、グローバル同一サーバを実現するには、通信速度を高め、各リージョンのプレイヤーがバトルサーバーに接続した際の通信環境と安定性を向上させることが必要となる。
通信速度の向上には主に次の2つの方法がある。

1，サーバをできるだけプレイヤーと物理的距離が近い場所に設置する。
2，	長距離のパブリックインターネットを安定したプライベートネットワークに変更する。

1：プレイヤーとサーバとの間の物理的距離を短縮させることについて
よく使われているCDNが一例である。この方法は画像のような静的コンテンツへのアクセスを加速させることができる。テンセントゲームズではCDNとCOSを併用し、静的コンテンツへのアクセスを加速させている。

2：長距離のパブリックインターネットを安定したプライベートネットワークに変更。
たとえば下記のサービスが使われている。

テンセントクラウド	GAAP（グローバル・アプリケーション・アクセラレーション・プラットフォーム）	https://cloud.tencent.com/product/gaap

テンセントクラウド	AIA（Anycast インターネット加速）	https://cloud.tencent.com/product/aia

これらはすべてプライベートネットワークによってリージョンを跨いだ加速を実現するものだ。
筆者はテンセントクラウドについて比較的詳しいため、以下ではテンセントクラウドを例にそのメカニズムを説明する。
GAAP（グローバル・アプリケーション・アクセラレーション・プラットフォーム）はサービスにアクセスする際の遅延を最小限に抑えるPAAS（Platform as a Service）である。全世界にあるノード間の高速コネクション、転送クラスタ及びスマートルーター技術を利用することにより、各地のユーザーが最寄りのノードに接続できるようにするほか、トラフィックをオリジンサーバーのリージョンに転送することで、ラグや遅延を解決するものである。
GAAPの誕生は、IEG（テンセント・インタラクティブ・エンターテイメント）のゲームの動作を加速させるのに、中国のプレイヤーが米国のAWSを利用したことがきっかけだった。当時のソリューションは、「Fullnat+toaで、TCPプロキシとIP透過を実現する」というもので、これをもとにテンセントクラウドがさらに研究を進め、GAAPを開発した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096510/79211c6d-06d0-a098-3a43-323dce8a336e.png)
GAAPのメカニズムは簡単だ。高速コネクションの入り口とオリジンサーバーのリージョンにある出口にそれぞれ転送クラスタを設置し、長距離のパブリックインターネットの一部をプライベートネットワークに変更することで、ネットワークの安定性を向上させるものだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096510/d2f0fb01-2874-0c99-5e6c-350b836bc8f6.png)
GAAPの最大の強みは、クライアントとサーバサイドがテンセントクラウドのマシンでなくてもよいことだ。テンセントクラウドのノードまでの距離が利用可能な近さであればこのサービスを利用できる。この強みによって、上図のようにグローバル同一サーバを実現させることのほか、オンラインゲームの加速ツールにもよく使われている。後者の場合、クライアントは本物のユーザーであり、オリジンサーバはAWSなどテンセントクラウド以外のマシンとなる。

プレイベートネットワークによる加速の技術にはほかにAnycastがある。テンセントのAIA（Anycast インターネット加速）がそれにあたる。
AIAのメカニズムも簡単だ。Anycast方式でIPを同時に複数のリージョンにリリースし、クライアントのトラフィックはパブリックネットワークのみを経由し、最も近いテンセントクラウドのノードに到着する。その後テンセントクラウドのプライベートネットワーク専用回線により目的アドレスに到達するものだ。
テンセントクラウドのAnycast IPはテンセントクラウドのバックエンドサーバやCLB（クラウドロードバランサー）にバンドリングさせることができ、通常のIPと同じ感覚で使えるため、非常に手軽だ。
GAAPと比べ、AIAのデプロイメントはより簡単である。単一のIPでDNS不要、アーキテクチャが明確、などの特長がある。しかし、AIAのバックエンドはテンセントクラウドのマシンでなければならず、サードパーティのマシンに接続するには別途セッティングが必要となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096510/f22b8971-fe99-286c-71ac-204117aed03f.png)
excel 風jsライブラリ

excel 風 jsライブラリのまとめ

* SpredJS https://www.grapecity.co.jp/developer/spreadjs (commercial)
* slickgrid https://github.com/6pac/SlickGrid (MIT)
* hansontable https://handsontable.com/ (commercial/MIT)
* jspreadsheet https://bossanova.uk/jspreadsheet/v4/ (MIT)
PlatformIOでMAKER PI RP2040をArduinoとして使う

[MAKER PI RP2040](https://github.com/CytronTechnologies/MAKER-PI-RP2040)というマイコンボードがあります。
![MAKER PI RP2040](https://github.com/CytronTechnologies/MAKER-PI-RP2040/raw/main/maker-pi-rp2040-tagline.png)
ざっくり言うと、[Raspberry pi PICO](https://akizukidenshi.com/catalog/g/gM-16132/)にサーボコントローラーx4、正逆回転可能(フルブリッジ)なモータードライバーx2、フルカラーLEDx2、GROVEコネクタx7、LIPOバッテリーチャージャー、サウンダー（スピーカー）、**リセットボタン(これがないとプログラム書き換え毎にUSBを抜き差しする必要があってとても面倒)**、GROVEコネクタ付きケーブルやプラスドライバ（それ必要？） 等を付けて[¥1240](https://akizukidenshi.com/catalog/g/gM-16939/)、という、価格設定がおかしい感じのボードです。Product of Malaysiaなので、たぶんロボット好きなマレーシアの大富豪が道楽で出しているんだと思います（妄想）。

Pythonがプリインストールされているのでそのまま使うのがよろしいかと思うのですが、今回はPlatformIOからArduinoとして使用してみました。

PlatformIOでProject Wizardを開き、boardを検索すると Raspberry Pi Pico が見つかるのでこれを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/b34d979a-2fc4-e115-4010-6365f204f579.png)

プログラムを組んだらビルドするのですが、ビルドの際、 **→** でビルド＆書き込みをすることはできません。
その左のチェックマークでビルド後、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/e55258c2-fdf8-97f2-6a2a-c7fc0ac6a1cd.png)
.pio\build\pico\firmware.uf2をインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/48cd1de8-a5cc-8cae-1b8e-f27ce3e1dd90.png)

インストール方法は

* リセットを押す  
* Bootを押す  
* リセットを離す  
* Bootを離す  

とするとドライブが見えるようになるので

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/b07b9be6-2e50-3b13-8976-fe540f7961dd.png)

ここにfirmware.uf2をドラッグ＆ドロップします。

#はまった点
はまった点をいくつか共有します。

* F()マクロが使えない
Unoのようにメモリが少ない場合、Serial.Println()等で表示するためだけに定義する使う文字列はRAMに置くのがもったいないのでF()マクロでフラッシュ側に逃がしたりしますが、PlatformIOでは使用できませんでした。ので```#define F(a) ((a))```としてバイパスしました。  


* EEPROMがない
RP2040にはEEPROMがないのですが、[FLASHの最後のチャンクをEEP代わりに使うライブラリ](https://arduino-pico.readthedocs.io/en/latest/eeprom.html)があるようです。  


* I2Cポートが複数GROBEにまたがっている
Wire.begin()して使う通常のI2Cポートは、デフォルトではGP6,GP7(SDA1,SCL1)になっているようです。
![IMG_0494.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/5f2e1201-504e-65f7-848a-5350dd278ad1.jpeg)
ですがこの二つが並んでいるGROVEポートは存在せず、GROVE5からGP6を、GROVE7からGP7を引っ張ってきてSDA,SCLにつなぐ必要があります。
かつ、複数のGROVEポートをSDA1,SCL1として使いたい場合は、ここに[GROVE I2C HUB](https://akizukidenshi.com/catalog/g/gM-16772/)を繋ぐことになるかと思います（ナンダコレ）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/8d3b886e-a1ed-4495-b89f-a4393a01849d.png)  


* CircuitPythonに戻せない**(←イマココ)**  
ボードをリセットし、[このページ](https://circuitpython.org/board/cytron_maker_pi_rp2040/)からCircuitPython をダウンロードしてドラッグ＆ドロップすれば
初期状態(CircuitPython)に戻せるハズ、、なのですが、なぜか戻らなくなってしまいました。はじめのうち何回かはうまく戻せていたのですが。。。
インストールはされるているようなのですが、リセットしてもドライブが見える状態となり、code.pyをドラッグ＆ドロップしても実行されません。
もうお前はArduinoとして生きろ。。。



現場からは以上です。
【JavaScript】関数とオブジェクト⑰　super



#はじめに

Udemyの[【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)の講座の振り返りです。

前回の記事

https://qiita.com/nao0725/items/3cb497a27e534f20d5c1

#目的

* 関数とオブジェクトについての理解を深める

#本題
###1.super

superとは継承元の関数を呼び出すキーワード

####例1

superの使用例

```js
class Person {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }

    hello() {
        console.log('hello ' + this.name);
    }
}

class Japanese extends Person {
    constructor(name, age, gender) {
        // superの前に新たにthisを使ってプロパティを設定すると絵エラーになる
        // 必ず先に初期化
        super(name, age);
        this.gender = gender;
    }

    hello() {
        // superは継承元のコンストラクターだけでなくメソッドも呼び出せる
        super.hello();
        console.log('Konnichiwa ' + this.name);
    }

    bye() {
        console.log('Sayonara ' + this.name);
    }
}

const taro = new Japanese('Taro', 23, 'Male');
console.log(taro);
// 下記のhelloメソッドを使うとsuper.hello();はPersonのhelloメソッドを使っているので
// hello Taroと出力される
taro.hello();
````

####例2

使用する上で注意すること
オブジェクトの中で呼べる

**前提**

````js
// americanという関数を定義
const american = {
    hello() {
        console.log('hello ' + this.name);
    }
}

// bobという関数を定義
const bob = {
    name: 'Bob',
    hello() {
        console.log('hello ' + this.name)
    }
}
// 出力結果：hello Bob
bob.hello();
````

ここでbobというオブジェクトに対してamericanオブジェクトをプロトタイプに追加します

```基本構文.
Object.setPrototypeof(A,B)

A =　オブジェクト
B = Aに継承させたいオブジェクト
`````


````js

const american = {
    hello() {
        console.log('hello ' + this.name);
    }
}

const bob = {
    name: 'Bob',
    // hello() {
    //     console.log('hello ' + this.name)
    // }
}
// ,下記のようにするとコンソールでbobの中にhelloが継承されていることが確認できる
// よってbobのhellメソッドを消してもhello　Bobと出力される(プロトタイプをさかのぼってamericanに行き着いた)
Object.setPrototypeOf(bob, american);
bob.hello();
````

superはクラスの中で使用されるもの


今日はここまで！

#参考にさせて頂いた記事

* [【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)
RedshiftのUNLOADでPARTITION BYを行う際にファイルのプレフィックスが付けられない場合の回避策

# やりたいこと
- yyyymmごとに溜まっていくデータを対象とし
- Athenaで扱うためのParquetデータを作成したい（AthenaのCTAS以外で）
- とあるカラムのデータから分散させた partition_number でパーティションを分けたい
- でもyyyymmではパーティション切りたくない
- RedshiftのUNLOADの機能「PARTITION BY」を利用したい

# やってみた
まずは1か月分のyyyymmで試します。

```unload1.sql
unload 
('select column1,  column2,  column3,partition_number from tablename where yyyymm =\'202101\' ')
to 'UNLOAD-TO' CREDENTIALS 'aws_iam_role=MYROLE' 
FORMAT AS PARQUET 
PARTITION BY (partition_number) 
PARALLEL ON allowoverwrite;
```

PARTITION BYによって自動的に partition_number=xxxxx という形式でUNLOADされてゆきました。
おお素敵！という結果なので、他のyyyymmも続けてやってゆきました。

# 困った
3か月分くらいが終わったころでしょうか。よしエラーもないなと思いつつ確認をしていると、ファイルのサイズが想定よりかなり少ない状態です。
中身を見てみると、、、最後に実行したyyyymmのデータのみ、しかありません。

ここで気づきました。
そう、yyyymmでパーティションを切っていないので、同じ /partition_number=xxxx/ の下に同じファイル名で次々と上書きされてしまったのです。

通常、UNLOADするときにはUNLOAD先自体にyyyymmをprefix的に入れるなどしてこうしたことを回避します。しかし、PARTITION BY を利用するとそうした指定ができなくなってしまうのです。
また、AthenaのCTASによるParquetおよびPARTITION作成では、prefix的に出力ファイル名に実行時刻みたいなものが自動的に付いたりするので、自動回避できたりもします。

# 回避方法
以下の方法を採りました

- **Athenaで利用はしないがパーティション自体は作成する**

```unload2.sql
unload 
('select column1,  column2,  column3, partition_number ,\'202101\' as yyyymm  from tablename ')
to 'UNLOAD-TO' CREDENTIALS 'aws_iam_role=MYROLE' 
FORMAT AS PARQUET 
PARTITION BY (partition_number,yyyymm) 
PARALLEL ON allowoverwrite;
```

これにより、プレフィックスというか単にパーティションにはなりますが、上書を回避することができました。
無理やりな回避方法にはなりましたが、そもそも処理成功後ファイルのyyyymmが見えることは良いことで

- UNLOADの処理の進捗がわかりやすい
- 処理失敗時の削除などにも便利

というメリットがあります。

# 感想
書いていて、そもそも「特定のパーティションは切りたいが、yyyymm等のdateパーティションは切りたくない」みたいなケースがレアなのではと思ってきました。
Reactを基本からまとめてみた【15】【React Hook (useContext) ② 】

##useContextとは

useContextとは、Context機能をよりシンプルに使えるようになった機能。
親からPropsで渡されていないのに、Contextに収容されているデータへよりシンプルにアクセスできるというもの。

通常、親コンポーネントから子コンポーネントにデータを渡す際は、propsを介して行うが、親から子、そのまた子といったように複数のコンポーネントを介してデータを渡すのはpropsでは煩雑になってくる。

ReactのContext APIを利用することでpropsを利用することなく、下の階層のコンポーネントとデータの共有を行うことができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939638/fa5bf810-d368-683a-fae2-6991a6d8f606.png)

##使用例 『UseContext』

App.jsファイルを一番親のコンポーネントとして、App.jsファイルに子コンポーネントAをimportし、コンポーネントAにコンポーネントB、コンポーネントBにコンポーネントCをimportした4階層のコンポーネントを作成する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939638/c58d7676-5be3-dcb3-0432-2c2e3d09b690.png)

一番上の親コンポーネントであるApp.jsのファイルの中身は下記のようになり、ComponentA、B、Cについてはcomponentsディレクトリの下に作成する。

```App.js
import React from 'react';
import ComponentA from './components/ComponentA'

function App() {
  return (
    <div style={{ textAlign: 'center' }}>
      <h1>Learn useContext</h1>
      <ComponentA/>
    </div>
  );
}
export default App;
```

```ComponentA.js
import React from 'react'
import ComponentB from './ComponentB'

const ComponentA = () => {
    return (
        <div>
            <p>Componet A</p>
            <ComponentB />
        </div>
    )
}
export default ComponentA;
```

```ComponentB.js
import React from 'react'
import ComponentC from './ComponentC'

const ComponentB = () => {
    return (
        <div>
            <p>Componet B</p>
            <ComponentC />
        </div>
    )
}
export default ComponentB;
```

```ComponentC.js
import React from 'react'

const ComponentC = () => {
    return (
        <div>
            <p>Componet C</p>
        </div>
    )
}
export default ComponentC;
```

##参考サイト
[こんなに簡単なの？React Hook useContextでデータ共有]
(https://reffect.co.jp/react/react-usecontext-understanding)
[React hooksを基礎から理解する (useContext編)]
(https://qiita.com/seira/items/fccdf4e73c59c491558d)
Dockerの基礎用語を調べた

# はじめに

Docker を少しだけ使ったことがあるけど、用語はほとんど知らなかったので今更ながら調べました。
初心者の勉強の記録です。

# Docker とは

コンテナ型の仮想環境を作成したり利用したりできるソフトウェアです。
仮想化には他にホストOS型やハイパーバイザー型があります。これらと比べてコンテナ型は以下の特徴があります。

* OS を実行しない
* 最低限必要なファイルだけで構成する

そのため CPU やメモリ、ディスクといったシステムのリソース利用量が少なくて済み、仮想環境を軽量に扱うことができます。大勢で開発を行うような場合に、全員が同様の仮想環境を迅速に構築できます。
ただしホスト側のカーネルに依存するため、たとえば Windows 上で直接 Docker コンテナを利用することはできません。

# Docker コンテナ

Docker で利用できるコンテナ型の仮想環境です。
これを作成することで、仮想環境を利用したいろいろな処理ができるようになります。

Docker コンテナは、次に記載している Docker イメージを元に作成します。
また以下のコマンドで作成済みの Docker コンテナから Docker イメージを作成することができます。

```shell
docker commit ~~
```

# Docker イメージ

利用したい Docker コンテナの構成（どんなファイル、アプリを入れるか、等）をまとめて保持しているものです。Docker で仮想環境を利用するには、このイメージからコンテナを作成する必要があります。

イメージは Docker Hub 等で公開されているものを利用するのが良いと思います。
公開されているイメージをそのまま利用することもできるし、自分なりに設定を追加した独自のイメージを作成することもできます。

[Explore Docker's Container Image Repository | Docker Hub](https://hub.docker.com/search?type=image)

## Dockerfile

Docker Hub 等から入手した Docker イメージをもとに、自分なりに必要な機能や設定を追加したイメージにするには、一つ一つコマンドを叩くなどの手順を踏みます。
これはなかなか手間がかかり、手順を間違う恐れもあります。
そこで `Dockerfile` という名前のテキストファイルにイメージに設定する内容を記述しておくと、イメージいじりが自動化できます。

`COPY` を使わずに複数行のファイルを作れないかなと調べたところ、オープンソースのコードで以下のような書き方ができることを知りました。
下記はファイルの新規作成ですが、追記したい場合は `>` を `>>` にすればいけます。

```dockerfile:Dockerfile
RUN { \
  echo 'export LANG=ja_JP.UTF-8'; \
  echo 'autoload -Uz compinit && compinit'; \
  echo 'bindkey -e'; \
} > .zshrc
```

```:.zshrc
export LANG=ja_JP.UTF-8
autoload -Uz compinit && compinit
bindkey -e
```

# イメージとコンテナ

イメージとコンテナについて、自分は

* イメージ
  * オブジェクト指向での __クラス__
* コンテナ
  * オブジェクト指向での __インスタンス__

のような感じかなと理解しました。

# コンテナで扱うデータの管理

コンテナで作成されたデータはそのコンテナで保持されますが、コンテナが削除されると一緒に消えてしまいます。また複数のコンテナ同士でデータを共有することもできません。
これを解決するために、__コンテナで扱うデータをホスト側で保持し、それをコンテナ側にマウントする__ という方法が用いられます。
以下のような方法がありますが、公式リファレンスではなるべく **ボリューム** を使用すべきとされています。

## ボリューム

ホスト側の `/var/lib/docker/volumes/` 以下にコンテナで扱うデータ領域を作成し、それをコンテナでマウントして利用します。
以下のコマンドでボリュームを作成できます。コンテナを破棄した後も残ります。

```
docker volume create [volume_name]
```

## バインドマウント

ホスト側のディレクトリをコンテナ内のディレクトリにマウントすることでデータを同期します。

## tmpfs

ボリュームやバインドマウントとは異なり、ホスト側のメモリ上に保存します。コンテナが停止されると tmpfs マウントは削除され、保存したファイルは消滅してしまいます。
永続化したくない（例えば個人情報などを一時的に保存したい）場合に有用です。



# 参考

https://matsuand.github.io/docs.docker.jp.onthefly/get-started/overview/
UNICORNプログラミングコンテスト2021(AtCoder Beginner Contest 225) 参戦記

# UNICORNプログラミングコンテスト2021(AtCoder Beginner Contest 225) 参戦記

## [ABC225A - Distinct Strings](https://atcoder.jp/contests/abc225/tasks/abc225_a)

2分半で突破. 最大で6種類しかないので、サクッと生成してしまうのが良いですね.

```python
S = input()

t = set()
t.add(S[0] + S[1] + S[2])
t.add(S[0] + S[2] + S[1])
t.add(S[1] + S[0] + S[2])
t.add(S[1] + S[2] + S[0])
t.add(S[2] + S[0] + S[1])
t.add(S[2] + S[1] + S[0])
print(len(t))
```

## [ABC225B - Star or Not](https://atcoder.jp/contests/abc225/tasks/abc225_b)

4分で突破. 全ての*i*について*a<sub>i</sub>*か*b<sub>i</sub>*のどちらかに特定の数字が入っているかどうかですね.

```python
from sys import setrecursionlimit, stdin

readline = stdin.readline
setrecursionlimit(10 ** 6)

N = int(readline())
ab = [list(map(int, readline().split())) for _ in range(N - 1)]

x = ab[0][0]
if all(x in l for l in ab):
    print('Yes')
    exit()
x = ab[0][1]
if all(x in l for l in ab):
    print('Yes')
    exit()
print('No')
```

## [ABC225C - Calendar Validator](https://atcoder.jp/contests/abc225/tasks/abc225_c)

12分半で突破、WA1. 7の倍数は右端でしか出ないことをチェックし漏れていましたね…….

```python
from sys import setrecursionlimit, stdin

readline = stdin.readline
setrecursionlimit(10 ** 6)

N, M = map(int, readline().split())
B = [list(map(int, readline().split())) for _ in range(N)]

x = B[0][0]
for i in range(N):
    if (B[i][0] - 1) // 7 != (B[i][M - 1] - 1) // 7:
            print('No')
            exit()
    for j in range(M):
        if x + 7 * i + j != B[i][j]:
            print('No')
            exit()
print('Yes')
```

## [ABC225D - Play Train](https://atcoder.jp/contests/abc225/tasks/abc225_d)

36分半で突破. Doubly linked list で管理するだけみたいな簡単な問題じゃないよなあと思いつつ、計算量を見積もったらそれだけの簡単な問題でアレってなった.

```python
from sys import stdin

readline = stdin.readline

N, Q = map(int, readline().split())

front = [0] * (N + 1)
rear = [0] * (N + 1)
result = []
for _ in range(Q):
    s = readline()
    if s[0] == '1':
        _, x, y = map(int, s.split())
        rear[x] = y
        front[y] = x
    elif s[0] == '2':
        _, x, y = map(int, s.split())
        rear[x] = 0
        front[y] = 0
    elif s[0] == '3':
        _, x = map(int, s.split())
        while front[x] != 0:
            x = front[x]
        t = []
        while True:
            t.append(x)
            if rear[x] == 0:
                break
            x = rear[x]
        result.append(' '.join(str(x) for x in [len(t)] + t))
print(*result, sep='\n')
```
Python3: psycopg2 のエラー対策

PostgreSQL に接続するライブラリーの psycopg2 を使っていてエラーが出た時の対策です。
Ubuntu 21.10 での対策です。

エラーメッセージ

```text
FATAL:  Peer authentication failed for user
```

次のファイルを編集します。

変更前

```text:/etc/postgresql/12/main/pg_hba.conf
（省略）
local   all             all                                     peer
```

変更後

```text:/etc/postgresql/12/main/pg_hba.conf
（省略）
local   all             all                                     trust
```

PostgreSQL の再起動

```bash
sudo systemctl restart postgresql
```
Anaconda Navigatorが起動しない(PyQt5が影響していた話)

# PyQt5をインストールしたらNavigatorが起動しない
PyinstallerなどではPyQt5のインストールが要求されることがあります。
Anaconda Navigatorの起動ではPySideが要求されるのですが、PyQt5がインストールされていると**競合**して起動しない場合があります。
>PythonバインディングはQt4系のPyQt,PySide、Qt5系のPyQt5,PySide2があります。
>https://teratail.com/questions/246069

以下のようなエラーが出た場合、PySideとPyQt5が競合されている場合があります。

```bash
ModuleNotFoundError: No module named 'PySide'
```

以下のコマンドでPyQt5をアンインストールすると、PySideを使ってAnaconda Navigatorが起動するようになるはずです。

```bash
pip uninstall PyQt5
```

PyQt5が起動を競合している場合、Anacondaのアンインストールでは修正できないので、他のサイトを試してうまくいかなかった場合は試してみてください。
Unity・MVP設計実践～ぷよぷよを作ろう～：第1章「概要編」

[Unity設計実践の目次はこちら](https://qiita.com/wolfmagnate/items/4b1a1d0cf8db7ff7d66f)
- - -

# はじめに
この記事では、ぷよぷよ開発において採用するライブラリや使用するUnityの機能、開発順序などについて解説していきます。

# なぜぷよぷよか
有名なパズルゲームだからです。
パズルゲームは

* ゲームの規模に比べて、ルールがある程度の複雑である
* ゲームであるが故にそこそこ複雑な演出もある

という特徴を持っているため、MVP開発のサンプルに非常に適しています。

# 仕様
普通のぷよぷよです。詳しくは検索すれば出てくるので割愛。

# 完成品
[GithubにUnityのプロジェクトフォルダを上げています。](https://github.com/wolfmagnate/PuyoPuyoMVP/)こちらから手元にcloneしてきてUnity2020.3.9f1にて実行してみてください。

# Unityのバージョン
2020.3.9f1 LTS

# 実装順序
最も安定するMVPにおける開発順序は、M→P→Vです。
理由を挙げます。
## 依存関係
理論的なMVPについて、おさらいします。
「Modelは単体で存在可能な純粋な存在である。PresenterはModelのデータを論理的な画面の情報に変換する。最後にViewがUnityの仕組みに従って、Presenterの論理的な画面情報を実際の画面に変換する」
以上のことから「Modelは誰にも依存しない」「PresenterはModelに依存する」「ViewはPresenterに依存する」ということが分かると思います。
この関係から考えて、ModelがないとPresenterは作れず、PresenterがないとViewは作れないのですから、Model→Presenter→Viewの順序になるのは当然と言えるでしょう。

## アーキテクチャの強制
もしも、ViewやPresenterを先に作ってしまった場合、「Modelからこのようなデータを受け取るんだろうなぁ」といった想定をしてコードを書かざるを得ません。そして、PresenterやViewの実装に引きずられたModelを作ってしまうリスクが高まります。これでは、事実上PresenterやViewに依存したModelを作ってしまう弊害を生む可能性あります。
他のプログラムが存在しない状況でModelを書けば、PresenterやViewに気兼ねをすることは不可能です。
逆に、Presenterを書くときにModelが存在したとしても問題はありません。なぜなら、もともとPresenterやViewはModelに依存するものなので、Modelを意識するのは当然だからです。

# 採用するライブラリ・機能
以下で紹介するものはすべてUnity Package Managerからインストールできます。

## Assembly Definition Files
通称adf。C#のビルドファイル(dll)を、機能ごとに分割して出力できる機能です。
Model、View、Presenterといったレイヤーを採用したアーキテクチャにおいては非常に強力な武器になります。
詳しい使い方については[Unity Assembly Definition 完全に理解した](https://qiita.com/toRisouP/items/d206af3029c7d80326ed)などの参考文献を参照してください。

## UniRx
MVPにおける通知の実装において不可欠といっていい便利ライブラリです。

## Unity Test Runner
Unityにおけるテストライブラリ。ボタン1つでテストが実行できるので非常に便利です。
また、Edit Mode TestではUnity起動のオーバーヘッドなしにModelやPresenterのテストが実行できます。
詳しい使い方については[【Unity】Unity Test Runner（Test Framework）入門 - インストールから基本的な使い方・注意点まとめ](https://light11.hatenadiary.com/entry/2020/02/21/212657)などの参考文献を参照してください。

## DOTween
単純にTween系の便利なライブラリという点で採用しました。Viewで用います。
注意点として、何も考えずにインストールするとアセンブリが分けて出力されません。
DOTweenの設定画面からadfを生成してください。

## ぷよ画像5枚セット
私が5秒で描きました。皆さんも描きましょう！
![RedPuyo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412657/c19f7b5d-9f7a-6bc9-bd46-ff6e790ff7ec.jpeg)


# フォルダ構成
Asset直下にProjectという名前のフォルダを配置します。
Asset直下はアセットストアなどから落としてきた素材が大量に並ぶことになるので、Asset直下は綺麗にしておくのがおすすめです。
Project以下にはModel,View,Presenterという3つのフォルダを用意します。
この3つのフォルダの詳しい内容についてはそれぞれの記事で解説します。

# おわりに
今回は開発準備の内容を扱いました。
次回から詳しい実装についてやっていきます。
Unity・MVP設計実践～ぷよぷよを作ろう～：目次

# はじめに
前連載の[Unity設計入門](https://qiita.com/wolfmagnate/items/cf7081a0352667b12d6a)では、MVPをはじめとするアーキテクチャの理論的なバックグラウンドについて解説しました。
しかしながら、これを実際Unityに応用するには若干のギャップが存在します。
ソフトウェア開発ではさまざまな例外的状況や回避しがたい複雑性があり、その回避方法は実践でしかわからないことが多いです。加えて、Unity特有の事情や、Unityが準備してくれているMVP開発に使える機能も多くあります。
そこで「Unity・MVP設計実践」では「Unity設計入門」の読者を対象に、Unityにおけるアーキテクチャを強く意識した開発におけるTipsを具体的なコードとともに解説していこうと思います。

# 対象読者
* C#・Unityである程度のゲームを作れる人
* UniRxについての基礎的な知識がある人
* C#・Unityにおける設計を学びたい人
* 「[Unity設計入門](https://qiita.com/wolfmagnate/items/cf7081a0352667b12d6a)」を読んだ人(必須ではないものの、理論的なベースはこちらに書いてあります)
* MVPに関して理論的な理解はあるものの、Unityへの応用方法が分からない人

# 対象ではない読者
* 「ぷよぷよを作ってみたい！」という人

この連載ではぷよぷよのプロジェクトをベースに解説しますが、ぷよぷよ作成が重点ではありませんので、アルゴリズムなどへの言及はありません。すでに「ぷよぷよ」が作れる人が「MVPぷよぷよ」を作れるようになるための記事です。

# リポジトリ
記事で扱う内容を以下のリポジトリにまとめています。ぜひ参考にしてください。
https://github.com/wolfmagnate/PuyoPuyoMVP

# リンク
[第1章「概要編」](https://qiita.com/wolfmagnate/items/a821d7f863ecc7d0538c)
[第2章「Model編」](https://qiita.com/wolfmagnate/items/1b4682affcf59d2acbad)
[第3章「Presenter編」](https://qiita.com/wolfmagnate/items/348de21f70e6a36b6f6b)
[第4章「View編」](https://qiita.com/wolfmagnate/items/756be61d63eea5978184)
【Unity】自作フォントの使用に関する備忘録

自作フォントの使用は大きく分けて２通りある。理由は定かではないが上手く出来ずに手こずったので参考にしたサイトと結果的に成功したやり方を記す。同じ境遇の同士が他のやり方で妥協出来るように参考にしたサイトと特色をここに記す。Unity:ver.2020.3.16f1

・やり方１「Custom Fontを使用する」
検索するとそこそこヒットするが、数値の設定が大変なので文字数が多い場合はオススメしない。

参考
http://scalar.seesaa.net/article/447727959.html
https://hachy.github.io/2018/05/08/custom-font-in-unity.html
http://ktstg.blog.shinobi.jp/Entry/994/

・やり方２「TextMeshProを使用する」
おそらく最もメジャーなやり方。
細かく分けると一つの画像をスライスして使う方法と、一文字づつ別れた画像データをアセットを使ってくっつけるやり方がある。
私は前者がどうしても出来なくて後者のやり方のたどり着いた。助かった。

参考（スライス方法）
https://note.com/non_non_cha/n/n455cb315193b
https://elekibear.com/20200927_02

参考（くっつける方法）
https://shikaku-sh.hatenablog.com/entry/unity-draw-text-with-image-in-textmeshpro#%E5%8F%82%E8%80%83
https://baba-s.hatenablog.com/entry/2018/08/08/090000
(↑結果的にはこれで成功した)
Jetpack Compose ConstraintLayoutの基本的な利用方法

AndroidのJetpack ComposeでConstraintLayoutの基本的な利用方法です。
この記事は以下のバージョンに対応しています。

| | バージョン |
|:-----------|:------------:|
|Jetpack Compose|1.0.4|
|androidx.constraintlayout:constraintlayout-compose|1.0.0-beta02|
|AndroidStudio|ArcticFox 2020.3.1 Patch 3|

# 基本的な利用方法
Jetpack ComposeでConstraintLayoutを利用するために固有の`androidx.constraintlayout:constraintlayout-compose`というライブラリを導入する必要があります。

`ConstraintLayoutSample`を例に基本的な利用方法を説明します。

```Kotlin:ConstraintLayoutSample.kt
@Preview(showBackground = true)
@Composable
fun ConstraintLayoutSample() {
    ConstraintLayout(modifier = Modifier.fillMaxWidth()) {
        val (icon, title, bar) = createRefs() // (1)
        Icon(
            modifier = Modifier
                .padding(4.dp)
                .constrainAs(icon) { // (2)
                    top.linkTo(title.top) // (3)
                    bottom.linkTo(title.bottom)
                    start.linkTo(parent.start) // (4)
                },
            imageVector = Icons.Rounded.Info,
            contentDescription = "Info"
        )
        Text(
            modifier = Modifier.constrainAs(title) {
                start.linkTo(icon.end)
            },
            text = "タイトル",
            fontSize = 32.sp
        )
        Spacer(
            modifier = Modifier
                .constrainAs(bar) {
                    top.linkTo(title.bottom)
                    start.linkTo(title.start)
                    end.linkTo(title.end)
                    width = Dimension.fillToConstraints // (5)
                    height = Dimension.percent(0.1f) // (6)
                }
                .background(color = Color.DarkGray)
        )
    }
}
```
![スクリーンショット 2021-10-31 22.09.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356260/ad094622-b5ab-6d1c-fc4f-23793b4d89c8.png)

- (1) createRefs()でConstraintLayoutの子要素となるComposeを参照するためのオブジェクトを作成します。
- (2) 子要素となるComposeのmodifierに、(1)で作成したオブジェクトを引数に指定したconstrainAs()を指定します。
- (3) constrainAs()のラムダでConstraintLayoutの制約を指定します。
- (4) parentというオブジェクトはConstraintLayoutが持つオブジェクトです。親を指します。
- (5) widthにDimension.fillToConstraintsを指定することで、startとendに指定した制約にもとづいて可能な限り横幅を広げる制約となっています。heightにDimension.fillToConstraintsを指定した場合、topとbottomに指定した制約にもとづいて可能な限り高さを広げる制約となります。
- (6) widthにDimension.percentを指定することで、親の横幅に対する割合で横幅を決めています。heightにDimension.percentを指定すると、親の高さに対する割合で高さを決めることができます。
A Hard Day's Night イントロ、ベースD2ハーモニクス説

The Beatles, A Hard Day's Nightのイントロをフーリエ解析するシリーズ
### 今回の説は、ベースがハーモニクスを使っている説です。

前回で、アルバム版、A Hard Day's Nightのイントロ左チャンネルをフーリエ変換しました。

![HDN_intoro_album.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2117456/a4970664-67d0-140d-9ac4-8f551bc5989f.png)

ここで、ベースが出しているD3付近の音と、D2付近の音について考える。普通にD3の音を弾いたのであれば、それよりも低いD2の音は出ないはず。だが、D3の音の1/8程度の音量でD2の音が出ている。この理由は、ポールがハーモニクス奏法を使っているのではないかと考えました。もしかしたら、ハーモニクスの指の触り具合で周波数が２％程度変化する可能性もあるかと思いました。

Youtubeにあるベースをハーモニクス奏法で弾いた音をWAVファイルとして取り組み、フーリエ変換してみます。
![harmonics_E2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2117456/7270bb4e-3e5b-0876-2ccc-c2a5e94296f5.png)
これは、E2の弦をハーモニクスで弾いた音をフーリエ変換したグラフです。E2音のよりも高い音量でE3が出ています。音量は1/4。ハーモニクスさせる指の触り具合で、この比率は変化します。３倍音から、７倍音まで観測されています。A Hard Day's Nightイントロに近い形状となります。ただ、ハーモニクスさせても、周波数のズレは生じていません。

## 結論：ポールがベースのD2の音をハーモニクスさせている可能性は高い。
[Github_Actions][error]User: arn:aws:iam::<AcountID>:user/<IAM User Name>is not authorized to performの解決例

## エラーの様子
下記のように題名のエラーを吐いた。
![スクリーンショット 2021-11-01 7.31.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/e639dc4e-dd7a-ac26-059e-530871785157.png)


## 原因
github用のiam_roleのaccess_key_id,secret_key_idを通常のawsアカウントのもので環境変数に登録してしまったから。（画像では***になっている部分）

## 解決法

下記コマンドで該当のiam_roleのaccess_key_id,secret_key_idを確認する→それを環境変数に登録する

```
% aws iam get-account-authorization-details
```

access_keyがなければ下記コマンドで生成する。

```
% aws iam create-access-key --user-name example-prod-foobar-github
```

## その他の原因
AssumeRoleする際にセッションタグを渡せるようにする。（github用のiam_roleにその権限を持たせる）
この解決方法は下記の記事がとても参考になった。

https://www.dehio3.com/entry/2020/02/19/183903
IKEAのマニュアル（ほか身近なもの）に学ぶUX

https://zenn.dev/e99h2121/scraps/5631969817bc5e

序章でIKEAのマニュアルが例に出てきてほほう！と思った。

https://qiita.com/soepy/items/6b33859501fc5811c04b

と同様、マニュアルやテクニカルライティング分野というのはもともとUI/UXの一分野だという認識では居たのだが。


## IKEAのマニュアルの素晴らしいところ

[説明文の無いマニュアル | マニュアル制作のトリセツ](https://manual-torisetsu.com/blog/2119/)

> 説明文は短ければ短いほど良い世界ですので、究極の短さで分かりやすくをめざした結果
> 商品は詳細に描き、人間などは簡潔に描き分けています。
> グローバルに商品販売しているIKEAでは、説明文が無いマニュアルのため、多言語制作の必要がなくコスト削減


[イケアの「組立説明書」に隠された3つの知恵 | GetNavi web ゲットナビ](https://getnavi.jp/world/576407/)

> 1: 最初の工程は簡単にして、自信を持たせる
> 2: 大きなパーツを最初に組み立て、完成品をイメージさせる
> 3: 1つの工程に1つの作業だけ


## もちろん万人にパーフェクトではない

https://twitter.com/SelenaNareski/status/1441836230455357447?s=20

https://twitter.com/danteluciani/status/1383066352903196676?s=20

## まとめ: しかし

https://uxplanet.org/the-ikea-effect-a-ux-case-study-e30fb27df5cc

> イケアはすでにこの問題をどのように解決しようとしているのでしょうか？
> また、その理由や必要性はあるのでしょうか？
> 多くの人々に、よりよい日常生活を提供するために - イケアのミッションステートメント

<iframe width="663" height="382" src="https://www.youtube.com/embed/hNANFFH9qU8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

> イケアのビジネスは、一見するととてもシンプルです。手頃な価格のホームファニッシング製品を提供しているのです。しかし彼らの目的は、すべての人、つまり多くの人が、持続可能で機能的な高品質の家具を手に入れられるようにすることです。一部の人だけでなく、多くの人に。
> このミッションをベースに、アクセシビリティを追求しています。組み立てが困難なために製品にアクセスできない人がいたとしても、イケアはその人たちにもアクセスできるように取り組んでいます。

組み立てを外部委託することもひとつであるし、

- 現在のステップ、前のステップ、次のステップをどのようにユーザーに反映させるか（UI上で）。ステップはどのようにして次のステップに移行するのか？
- ユーザーがプロセスの何段階目にいるかを認識できるようにするにはどうすればよいか？ 

> "私は......パーツが揃っているかどうかを確認するステップを省略しがちなのですが、説明書を確認してから再確認するまでの間に、すべてのパーツを把握することができなくなってしまうんです。そうすると、自分がどの段階にいるのかを忘れてしまい、即興で作り始めてしまい、うまくいかないのです。"
一言で言うと 私が作りたかったのは、短い形式の（消化しやすい）ループビデオ（アニメーション）の列のためのプレーヤーで、ユーザーがプロセスのどこにいて、どのような行動を取るべきかを常に把握できるようにすることです。

等などユーザーインタビューを実施しモバイル・リモート・アプリの開発をしている。

## 追記: LEGO

https://www.lego.com/ja-jp/service/buildinginstructions/

https://www.lego.com/ja-jp/categories/vehicles/building-instructions

https://www.lego.com/ja-jp/categories/animals/building-instructions

LEGOのマニュアルのほうが良いぞとコメント頂いたので追記

### 追記: 料理のレシピ

https://cookpad.com/

- 材料
- 難易度
- 所要時間
- 手順


何気なく見ていたマニュアルの類ですが気づきがありましたという話でした。以上、参考になればさいわいです。
論文まとめ：MagFace: A Universal Representation for Face Recognition and Quality Assessment

# はじめに
CVPR2021より以下の論文
[1] Q. Meng, et. al. MagFace: A Universal Representation for Face Recognition and Quality Assessment. CVPR2021
のまとめ

CVF open access:
https://openaccess.thecvf.com/content/CVPR2021/html/Meng_MagFace_A_Universal_Representation_for_Face_Recognition_and_Quality_Assessment_CVPR_2021_paper.html

github:
https://github.com/IrvingMeng/MagFace

既にこちらのような
https://qiita.com/miiuchu/items/bf970a6fe4ab01866511
まとめ記事が存在するので、自分用にlogicと結果のみ超ざっくりまとめ

# 概要
- 顔画像から個体認証する系のモデル
- ArcFaceに対して、dataのqualityが高いほどlossに加える重みを高くすることで精度を上げた


# lossの改良点
## ArcFaceのloss
MobileFaceNetの記事内
https://qiita.com/masataka46/items/e069384c2622f3b722f9
にまとめたので略

```math
L = -\frac{1}{N} \sum^N_{i=1} \log \frac{e^{s \cos (\theta_{y_i} + m)}}{e^{s \cos (\theta_{y_i} + m)} + \sum_{j \neq y_i} e^s \cos \theta_j} \tag{1}
```

角度ベースで $m$ のマージンを加えている。

## MagFaceのloss

まず a を特徴量の大きさとする。data i の特徴量 $f\_i$ における大きさは

```math
a_i = \| f_i \| \tag{2}
```

確信度の高いdataほど特徴量の絶対値が大きいと仮定し、マージン m を $a\_i$ に比例的に大きくなるとする。

ArcFace のlossを以下のように修正する。

```math
L = -\frac{1}{N} \sum^N_{i=1} \log \frac{e^{s \cos (\theta_{y_i} + m(a_i))}}{e^{s \cos (\theta_{y_i} + m(a_i))} + \sum_{j \neq y_i} e^s \cos \theta_j} + \lambda_g g(a_i) \tag{3}
```

そうすると、質の低いデータの影響力は下がるだろう。２項目は正則化項。

# 結果
以下は各データセットにおける（各列）各モデル（各行）のvarification accuracy。

![MagFace_img00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/72a629c8-2925-c5d4-dd2a-7202d789eb9b.png)

ArcFaceに対して微妙に上がってる。
パーミッション事故でSSHログインできなくなった時の対処(AWS EC2)

WordPressでサイト作ったけど、SSH接続できなくなりました！
っていうヘルプがきたので対処してみました。

historyに残ってた最後のコマンド***（絶対うたないでね）***

```
sudo chown -R ec2-user /
```

恐怖ですね...数年に一度は見るLinux事故です。

以下、私が対処した流れです。
あくまで***私が対処した流れ***で、ベストな手順ではないので注意してください。
実施の前にはデグレを防ぐため、***スナップショット***を取得しておきましょう。

###①全体的なパーミッションの変更（実際に対処するときは項目４までで良いかも？）
不幸中の幸いか、EBSは***デタッチ/アタッチ***ができるので復旧の余地が大いにあります。

***１、EC2停止→EC2→ボリューム→該当のボリュームを選択→アクション→デタッチ***

***２、アタッチ→復旧用のインスタンス（停止済）を選択***
復旧用インスタンスを用意します。
復旧用インスタンスは同じAZであること。
この時/dev/以下はデフォルトでOK。

***３、復旧用インスタンスにログインし、マウント用ディレクトリ作成***
作成はどこでもいいです。私はわかりやすくルート配下に作りました。

```
mkdir ディレクトリ名
```

***４、マウント***
ここでアタッチ時の/dev/XXXXを確認

```
cat /proc/partitions
```


マウント

```
mount /dev/XXXX ディレクトリ名
```

***５、パーミッション変更（実際に変更するかどうかは検討してください）***
ec2-userにかえられてしまったディレクトリをrootに戻しました。

```
chown -R root XXX
```

***６、EBSの戻し（実際にやるのは③の後でOK）***
１と２を元のインスタンスに対して実行します。
このときボリュームは起動用ボリュームになる**/dev/xvda**を選択すること。

この時点でログインのエラーがかわるだけで、まだログインできてません。

###②/home/ec2-user 配下のパーミッション変更
以下のbashやssh関連の***隠しファイル***をユーザーをそれぞれ***ec2-user***に戻しました。
.bash_history　.bash_logout　.bash_profile　.bashrc　.ssh

隠しファイル確認

```
ls -la
```
パーミッション変更

```
chown -R ec2-user XXX
```

この時点でとりあえずSSHログインができます。

###③sudoの復活
ログインはできましたが、sudoが使えません。

```
sudo: /usr/bin/sudo は所有者が uid 0 である必要があり、かつ setuid が設定されている必要があります
```
/usr/binの下にいるsudoの権限を変更します。

```
chmod 4111 /usr/bin/sudo
```
頭の4で***SUID***になります。
これでファイル所有者権限で動作させることができるようになるみたいです。
実際にsudoの実行、rootユーザへの切り替えができるようになります。
ここまでくれば以降はボリュームのデタッチ、アタッチ不要なので楽になりました。

###④MySQLの復活
WordPressで使われる***MySQL***があがらなくなっていたので、ここも最後に権限変更が必要です。

***１、systemctlでエラー確認***

```
systemctl status mysqld
```

わかりやすいログがでてました。
ログが出力できなくてあがらないようです。

```
[ERROR] [MY-010187] [Server] Could not open file '/var/log/mysqld.log'
```

***２、/var/log/mysqld.logの権限変更***
これも権限問題です。

```
chown mysql:mysql mysqld.log
```

※mysqld.logに/var/lib配下のエラーもでていたので、
以下のディレクトリも***chown mysql:mysql***しています。
mysql　mysql-files　mysql-keyring

***３、MySQL起動***

```
systemctl start mysqld
```

これで無事WordPressのサイトが見れるようになりました！
デタッチ/アタッチを繰り返しながら検証していたので、結構大変でした...

***参考にした記事***
EBSデタッチ/アタッチ
https://qiita.com/hardreggaecafe/items/de9bac1d9ba42f25378e

sudoの復活
https://qiita.com/lmond/items/33cd8f6d58e4932f589f

感謝です。
M1 Macでemacsを使う

# きっかけ
M1対応のBig Surには、デフォルトでEmacsが入っていません。
そこで、arm64対応が早かった、MacPortsのEmacsを使っていました。簡単だった。

しばらくして、ふと[Emacs for Mac OS X](https://emacsformacosx.com/)のアイコンをcommand-iで見たら、Universalになっていました。
[Changes](https://emacsformacosx.com/builds)を見ると、2021-03-26から、arm64対応していたようです。
だったら、MacPorts無しでも、Emacsが使えるのでは?

# 環境と準備
[Emacs for Mac OS X](https://emacsformacosx.com/)のEmacsを/Applications/に設置。
執筆時点の最新は、27.2-2, 2021-03-27。
macOSは11.6.1。

# GUI
アイコンをクリックしたら、「Emacsが予期しない理由で終了しました」。自分だけ?

1. アイコンをcommand-iで情報を見る
2. 「Rossettaを使用して開く」のチェックを外す

で、直りました。

# CUI
~/binにPATHが通っている場合、

```shell-session
ln -s /Applications/Emacs.app/Contents/MacOS/Emacs ~/bin/emacs
emacs -nw
```

で、ターミナル上でも動きました。

ちなみに、ターミナルから`-nw`無しで起動すると、GUIが起動します。

# 参考
- 奥村先生の[M1 Mac](https://oku.edu.mie-u.ac.jp/~okumura/macosx/m1.html)のページ
- [M1 MacBook Air に Emacs をインストール](https://qiita.com/tou_kun/items/cf47f6c9b8fddab1361c)の記事