OmniAICreator/Qiita-1.07M huggingface dataset:
MySQLを再インストールしてやり直す場合の注意点

## 実行環境
macOS Big Sur 11.4

## どういうエラーが起こったか
まずはPCに入っているMySQLをアンインストールした。

```
% brew uninstall mysql@5.7
Uninstalling /usr/local/Cellar/mysql@5.7/5.7.35... (320 files, 234.6MB)
```
このあと再度MySQLをインストールした。

```
% brew install mysql@5.7
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/cask).
==> Updated Casks
Updated 2 casks.

==> Downloading https://ghcr.io/v2/homebrew/core/mysql/5.7/manifests/5.7.35-1
Already downloaded: /Users/yamadayuuki/Library/Caches/Homebrew/downloads/8d6a41ecd64a64e4997897ce7c853b2f9c92646544b8f2df7260d72506eff4d9--mysql@5.7-5.7.35-1.bottle_manifest.json
==> Downloading https://ghcr.io/v2/homebrew/core/mysql/5.7/blobs/sha256:983b9015ebe2bf32c43eb309de1712a289eaf22c6a17de3e5f3
Already downloaded: /Users/yamadayuuki/Library/Caches/Homebrew/downloads/d8237be5e54bf7044ca0e87a8e7d791325178341af709efbda5f54170b2efb14--mysql@5.7--5.7.35.big_sur.bottle.1.tar.gz
==> Pouring mysql@5.7--5.7.35.big_sur.bottle.1.tar.gz
==> Caveats
We've installed your MySQL database without a root password. To secure it run:
    mysql_secure_installation

MySQL is configured to only allow connections from localhost by default

To connect run:
    mysql -uroot

mysql@5.7 is keg-only, which means it was not symlinked into /usr/local,
because this is an alternate version of another formula.

If you need to have mysql@5.7 first in your PATH, run:
  echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.zshrc

For compilers to find mysql@5.7 you may need to set:
  export LDFLAGS="-L/usr/local/opt/mysql@5.7/lib"
  export CPPFLAGS="-I/usr/local/opt/mysql@5.7/include"

For pkg-config to find mysql@5.7 you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/mysql@5.7/lib/pkgconfig"


To restart mysql@5.7 after an upgrade:
  brew services restart mysql@5.7
Or, if you don't want/need a background service you can just run:
  /usr/local/opt/mysql@5.7/bin/mysqld_safe --datadir=/usr/local/var/mysql
==> Summary
🍺  /usr/local/Cellar/mysql@5.7/5.7.35: 320 files, 234.6MB
```
さらに、[ProGateのチュートリアル](https://prog-8.com/docs/mysql-env)通りにすすめるも、エラーとなる。

```
% brew services start mysql@5.7
Bootstrap failed: 5: Input/output error
Error: Failure while executing; `/bin/launchctl bootstrap gui/501 /User/{username}/Library/LaunchAgents/homebrew.mxcl.mysql@5.7.plist` exited with 5.
```
ただ単に`brew uninstall mysql@5.7`するだけでは完全にゼロには戻らないのか、と気づいた。

## 解決策
([こちらのQiita記事](https://qiita.com/webmaster-patche/items/e3e86043baf21aa554b5)を参考にさせていただきました。)
`brew uninstall mysql@5.7`の後に以下を実行しました。3つ削除しているのですが、これらは

```
% rm -rf /usr/local/var/mysql
% rm -rf /usr/local/etc/my.conf
% rm -rf /usr/local/etc/my.conf.default
```
`-rf`オプションは、問答無用に削除する場合に使用されます。何を削除しているのかですが、[MySQLの構成ファイル（グローバルオプション）](https://dev.mysql.com/doc/refman/8.0/ja/option-files.html)を削除しています。削除して良いのか？につてですが、これらのファイルは`brew install mysql@5.7`を実行したときに作成されるので安心してください。

```
% cat my.cnf
# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
mysqlx-bind-address = 127.0.0.1

% cat my.cnf.default
# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
```
HTMLで九九の表を作る

HTMLでシンプルな九九の表を作っていきます。

まずはbodyを作っていきます。

``` index.html
<!DOCTYPE html>
</head>
<body>
  <table>
    <tr>
      <th></th><th>1</th><th>2</th><th>3</th><th>4</th><th>5</th><th>6</th><th>7</th<<th>8</th><th>9</th>
    </tr>
    <tr>
      <th>1</th><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td><td>9</td>
    </tr>
    <tr>
      <th>2</th><td>2</td><td>4</td><td>6</td><td>8</td><td>10</td><td>12</td><td>14</td><td>16</td><td>18</td>
    </tr>
    <tr>
      <th>3</th><td>3</td><td>6</td><td>9</td><td>12</td><td>15</td><td>18</td><td>21</td><td>24</td><td>27</td>
    </tr>
    <tr>
      <th>4</th><td>4</td><td>8</td><td>12</td><td>16</td><td>20</td><td>24</td><td>28</td><td>32</td><td>36</td>
    </tr>
    <tr>
      <th>5</th><td>5</td><td>10</td><td>15</td><td>20</td><td>25</td><td>30</td><td>35</td><td>40</td><td>45</td>
    </tr>
    <tr>
      <th>6</th><td>6</td><td>12</td><td>18</td><td>24</td><td>30</td><td>36</td><td>42</td><td>48</td><td>54</td>
    </tr>
    <tr>
      <th>7</th><td>7</td><td>14</td><td>21</td><td>28</td><td>35</td><td>42</td><td>49</td><td>56</td><td>63</td>
    </tr>
    <tr>
      <th>8</th><td>8</td><td>16</td><td>24</td><td>32</td><td>40</td><td>48</td><td>56</td><td>64</td><td>72</td>
    </tr>
    <tr>
      <th>9</th><td>9</td><td>18</td><td>27</td><td>36</td><td>45</td><td>54</td><td>63</td><td>72</td><td>81</td>
    </tr>
  </table>
</body>
</html>
```
![スクリーンショット 2021-09-19 195711.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612146/21733d78-f2de-6079-a0d6-55e00af4362c.png)

これにCSSでデザインしていきます。

``` index.html
body {
  font-size: 22px;
  background: #808080;
}

table {
  border-collapse: collapse;
  border-collapse: separate;
  border-spacing: 2px 2px;
}

th {
  background: #FFA500;
  padding: 3px 12px;
}

td {
  text-align: right;
  background: white;
}
```
これでこのようになります。

![スクリーンショット 2021-09-21 194227.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612146/4f02f4b0-e9a1-e28d-f80e-1a26d46eccec.png)
docker-entrypoint.sh: 38: exec: bundle: not found

##環境
Docker version 20.10.7
docker-compose version 1.29.2


##状況
```docker-compose run web```でrailsコマンドたたくとエラーを吐く

```
$ docker-compose run web bundle exec rails -v
Creating XXX_web_run ... done
/docker-entrypoint.sh: 38: exec: bundle: not found
ERROR: 127
```

##解決方法

```
$ docker-compose exec app bundle exec rails -v
Rails 6.1.3.2
```


- ```docker-compose run```と```docker-compose exec```の違い：
run を指定して実行した場合は新しくコンテナを立ち上げてから実行し、 exec を指定して実行した場合は既に立ち上がっているコンテナを使って実行します(参考記事抜粋)

- appについては下記参照

https://qiita.com/kat0/items/b4adff9a4840ea0d2924


##参考

https://qiita.com/nikadon/items/995c5705ff1171f7484d
AWS lambda テストイベントでPOSTリクエストを作成する


テストサンプルにPOSTボディできるものがなかったので、備忘録として。

手動で書き換えるポイントとしては、methodをPOSTにして、bodyというブロックが必要になります。
下にあるサンプルでは、Cookieもつけてます。（test=hoge123;）
要らなければブロックごと削除ですね。
BodyデータはBase64にエンコードしたものじゃないとダメのようです。
`{"hoge1":"aaaaaaaaaa","hoge2":1111111111111}`というJsonをつけてみました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213689/94a4a373-447b-4e4b-dacc-09ee4d78b912.png)



```
{
  "Records": [
    {
      "cf": {
        "config": {
          "distributionId": "EXAMPLE"
        },
        "request": {
          "uri": "/sample.html",
          "method": "POST",
          "clientIp": "2001:cdba::3257:9652",
          "body": {
            "action": "read-only",
            "data": "eyJob2dlMSI6ImFhYWFhYWFhYWEiLCJob2dlMiI6MTExMTExMTExMTExMX0=",
            "encoding": "base64",
            "inputTruncated": false
          },
          "headers": {
            "host": [
              {
                "key": "Host",
                "value": "d123.cf.net"
              }
            ],
            "user-agent": [
              {
                "key": "User-Agent",
                "value": "Test Agent"
              }
            ],

            "user-name": [
              {
                "key": "User-Name",
                "value": "aws-cloudfront"
              }
            ],
            "cookie": [
              {
                "key": "cookie",
                "value": "test=hoge123;"
              }
            ]
          }
        }
      }
    }
  ]
}

```

lambda@edgeのコードです。

```index.js
'use strict';

exports.handler = (event, context, callback) => {

	// リクエストの取得
	const request = event.Records[0].cf.request;
	console.log("event", event);
    // body取得
    var bodyData = Buffer.from(event.Records[0].cf.request.body.data, 'base64').toString("utf-8");
        
    var req_body = JSON.parse(bodyData);
    console.info('req_body: ',req_body);


	callback(null, request);
};


```

実行ログです。

```
START RequestId: 83454c21-7a6b-4f9f-9085-1b5fd1e2aefc Version: $LATEST
2021-09-21T10:16:51.415Z	83454c21-7a6b-4f9f-9085-1b5fd1e2aefc	INFO	event { Records: [ { cf: [Object] } ] }
2021-09-21T10:16:51.416Z	83454c21-7a6b-4f9f-9085-1b5fd1e2aefc	INFO	req_body:  { hoge1: 'aaaaaaaaaa', hoge2: 1111111111111 }
END RequestId: 83454c21-7a6b-4f9f-9085-1b5fd1e2aefc
REPORT RequestId: 83454c21-7a6b-4f9f-9085-1b5fd1e2aefc	Duration: 56.07 ms	Billed Duration: 57 ms	Memory Size: 128 MB	Max Memory Used: 65 MB	Init Duration: 165.47 ms
```

`req_body`というJsonオブジェクトに入ってます。
個別に取り出すときは、`req_body.hoge1`とかで取れると思います。
docker-compose execコマンド実行しても反応しない

##環境
Docker version 20.10.7
docker-compose version 1.29.2

##状況
```
$ docker-compose exec ruby -v
$　　
```

##解決策
```$ docker-compose exec```にサービス名を指定
今回は「app」

```
$ docker-compose exec app ruby -v
ruby 2.7.1p83 (2020-03-31 revision XXXXXXX) [x86_64-linux]
```

docker-compose.ymlで確認

```docker-compose.yml
version: '3'
services:
  app: &app
    #(略)
```


https://it-afi.com/docker/post-1779/
C# 使いの Python メモ

## FirstOrDefault
C#であればそれを返しなければ null にしたい LINQ の関数と言えば FirstOrDefault 

``` C#
employees.FirstOrDefault(p => p.name == "Tanaka)
```

Python でやるにはイテレータの next 関数が、次の要素がなければデフォルト値を返すように書けるので、こんなふうに書けば良いみたいです。

```Python
tanaka = next((e for e in employees if e.name == "Tanaka"), None)
```

参考：loekvandenouweland.com/content/first-or-default-in-python.html
docker-compose execコマンドでエラー:OCI runtime exec failed

##環境
Docker version 20.10.7, build f0df350
docker-compose version 1.29.2, build 5becea4c

##状況

```
$ docker-compose exec app rails -v
OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "rails": executable file not found in $PATH: unknown
```

##解決方法
railsコマンド前にbundle execをつける

```
$ docker-compose exec app bundle exec rails -v
Rails 6.1.3.2
```

##参考

https://qiita.com/nikadon/items/995c5705ff1171f7484d
RustでDLLを作って、Cで呼び出す

# はじめに

RustからC/C++を呼び出す記事はたくさん見つかったが、C/C++からRustを呼び出す記事が全然見つからなかったので試したときの備忘録

# 環境

- Rust 1.55.0
- MSVC V19.29.30038.1 for x64

# RustでDLLライブラリを作る

## DLLを作る

```Rust:sample.rs
#![crate_type = "cdylib"]

#[no_mangle]
pub extern "C" fn greeting() {
    println!("Hello, {}", "Rust");
}

#[no_mangle]
pub extern "C" fn rust_add(x: i32, y: i32) -> i32 { x + y }
```

`#![crate_type = "cdylib"]`でコンパイルするとダイナミックCリンクライブラリが出力されるようになる。`#![crate_type = "dylib"]`にすると、ダイナミックなRustリンクライブラリができる。が、どちらでも実行できたのでよくわからず。
`#[no_mangle]`でコンパイル時にマングリングしないように指定する。


下記のコマンドでコンパイルする

```
$ rustc sample.rs
```

何も出なければOK
コンパイルするとディレクトリは下記のようになる。

```
.
├── sample.dll
├── sample.dll.exp
├── sample.dll.lib
├── sample.pdb
└── sample.rs
```

これでDLLの作成は完了

## Cヘッダーファイルを作る

```C:sample.h
void greeting();
int rust_add(int, int);
```

追加した関数は2つだけなので上記の2行だけでOK

# DLLを呼び出すCを作る

```C:main.c
#include <stdio.h>
#include "sample.h"

int main(int argc, char** argv) {
    greeting();
    
    printf("result: %d\n", rust_add(3, 9));
    
    return 0;
}
```

ヘッダー読み込んで、使うだけ

コンパイルする

```
$ cl main.c sample.dll.lib
Microsoft(R) C/C++ Optimizing Compiler Version 19.29.30038.1 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

main.c
Microsoft (R) Incremental Linker Version 14.29.30038.1
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:main.exe
main.obj
sample.dll.lib
```

`sample.dll.lib`じゃないとコンパイルが通らない。理由は不明。`sample.dll`にすると「ファイルが壊れています」とか言われてコンパイルできない。
MSVCコンパイラは64ビットを使わないとコンパイルができない。Visual Studioをインストールしたらついてくる「x64 Native Tools Command Prompt for VS 2019」を使えばOK
Rustコンパイラがデフォルトで64bitでコンパイルするから?

コンパイル後のディレクトリの中身は下記のようになる

```
.
├── main.c
├── main.exe
├── main.obj
├── sample.dll
├── sample.dll.exp
├── sample.dll.lib
├── sample.h
├── sample.pdb
└── sample.rs
```

# 実行してみる

```
$ main
Hello, Rust
result: 12
```

できた
[Rails]初のbundle installでmysql2のエラーが出た時の解決策をまとめてみた

# はじめに
開発環境を整えているとき、初のbundle installにて以下のようなエラーが出ました。

```
Installing mysql2 0.5.3 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

（中略）

Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

（中略）

An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
```

このエラーで詰まされている人が多く、関連記事が既にたくさんあるのですが、以下で登場するOpenSSLやbundle configといった周辺知識を調べたかったので自分で解決策をまとめてみました。

# １.mysql2をbundle installする時のオプションを指定
だいたいの皆さんは以下のコマンドでうまくいってます。

```
$ brew install openssl  //opensslがinstall済みであれば不要
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"
$ bundle install
```
## 補足
### bundle config 〜のコマンドは一体何をしているのか

- bundle configはbundlerの設定に関するコマンド
- --localオプションをつけることで、プロジェクトごとの設定ファイルに設定を書き込む
    - そのファイルはapp/.bundle/configに格納されている
- build.mysql2でmysql2をビルド（```bundle install```）する時のオプションを指定
    - mysql2をbundle installする時に、OpenSSLを参照するようにパスを追加している。


```"--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"```の部分は```brew info openssl```で確認できます。

参考
https://dog-and-rabbit.com/rails-mysql2-gem-error
https://qiita.com/thunders/items/101c6b329830fb1fb27d



### OpenSSLとは何か

SSLの機能を提供するライブラリです。HTTPS通信などで使われます。


***

しかし私はこれでもこれでうまくいかなかったのでさらに調査を進めました。すると以下の記事に出会いました。
https://310nae.com/error-mysql2/

1度に2つのライブラリのパスを同時に指定するとエラーになるということで、コマンドを2回に分けます。

```
$ bundle config --local build.mysql2 "--with-cppflags=-I/usr/local/opt/openssl/include"
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"
$ bundle install
```

しかしこれでもうまくいかず、、

# ２.そもそもmysqlがインストールされていない
私はこのパターンでした、、汗

```
$ brew list  #このコマンドで表示されるリストの中にmysqlがなければ以下のコマンドを打つ
$ brew install mysql
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"
$ bundle install
```
mysql2を使うときはMySQLクライアントを先にローカルにインストールする必要があるみたいです。

## 補足

MySQLクライアントとは？

- MySQLサーバーと通信してデータベース内の情報を操作するためのプログラム
- mysqlはコマンドラインを提供するクライアント

参考
https://gihyo.jp/dev/serial/01/mysql-road-construction-news/0051
https://qiita.com/unsoluble_sugar/items/1403ddf0ac9709b1aae6

# 余談

私は他にも

- ruby, gem, opensslのパスがおかしくないかチェック

```
$ which ruby
$ which openssl
```

- gemのアップデート

```
$ gem update --system    #gem自体のアップデート
$ bundle update    #プロジェクト内のgemのアップデート
```
参考　https://qiita.com/tatama/items/4e9d6bb8bfa2d9556db7

- xcodeインストール

```
xcode-select --install
```
参考　https://qiita.com/gengogo5/items/815869416eaee3bb8daa

などを試しましたがうまくいきませんでした。しかし、今後またエラーになった時に、原因の1つになることも否定できないので一応書き記しておきます。

# まとめ
OpenSSLに関して、もっと勉強していく必要がありそうです。
何か間違いがあれば気兼ねなくコメントください。
python初学者の備忘録　まとめ

:::note warn
鋭意作成中ですm(__)m
:::

:::note info
python,Qiita初心者なので、備忘録として記載していきます。
なにせ初心者なので、知識不足はご容赦ください。
知識を深めながら追記していきたいと思います。
:::

# 目次

## 〇 python（パイソン）とは

**・[公式リファレンスマニュアル](https://docs.python.org/ja/3/reference/introduction.html)**

**・豊富な[標準ライブラリ(公式リファレンス) →] (https://docs.python.org/ja/3/library/index.html)と[外部ライブラリ(公式リファレンス) →](https://pypi.python.org/pypi)** 
　　標準ライブラリの中でも、いくつかのカテゴリーをあげるだけでも以下のようなものがある

　　　・ 数学関連
　　　・ ファイル操作およびさまざまなフォーマットのファイルの操作
　　　・ データの永続化
　　　・ データ圧縮／アーカイブ
　　　・ 並列処理
　　　・ ネットワーク処理
　　　・ インターネット関連
　　　・ GUI（グラフィカルユーザーインタフェース）

## 〇 環境編
### [・外部ライブラリパッケージのインストール](https://qiita.com/dondondon/items/8a540c1d95dce334df11)

## 〇 入門編
### -- データ型 --

#### [　・変数について](https://qiita.com/dondondon/items/e0a933bc57030e8b2d6b)

#### [　・型について](https://qiita.com/dondondon/items/6fe811bad056d7bd7c30)

#### [　・数値型について](https://qiita.com/dondondon/items/1c7ff18c2d9627772e8e)

#### [　・文字列型について](https://qiita.com/dondondon/items/75326c64e1704ed35493)

#### [　・ブール型について](https://qiita.com/dondondon/items/412b8e5c147cc3c0c38f)

### -- 演算子 --

#### [　・代数演算子について](https://qiita.com/dondondon/items/23f9c09e4f3555c6fbc7)

#### [　・比較演算子について](https://qiita.com/dondondon/items/69c797f7d570d4084888)

#### [　・論理演算子について](https://qiita.com/dondondon/items/0b7de45078bee0ba2b13)

#### [　・ビット演算子について](https://qiita.com/dondondon/items/999659c5e215d3e9e334)

#### [　・累算代入演算子について](https://qiita.com/dondondon/items/91b90154ed330e1328b7)

### -- 関数 --

#### [　・組み込み関数について(公式リファレンス)](https://docs.python.org/ja/3/library/functions.html)

#### [　　・print関数について](https://qiita.com/dondondon/items/0caa1c0492af3fb018ff)

#### [　　・数値型の関数について](https://qiita.com/dondondon/items/79df395634a68aa82c6f)

#### [　　・文字列型の関数について](https://qiita.com/dondondon/items/848932f2d1f0dafe050e)

#### [　　・ブール型の関数について](#・)

### -- メソッド --

#### [　　・数値型のメソッドについて](#・)

#### [　　・文字列型のメソッドについて](https://qiita.com/dondondon/items/7537aa8b9b43c8c97792)

#### [　　・ブール型のメソッドについて](#・)
#### [　　・リスト型のメソッドについて](#・)


## 〇 基礎編

### -- コレクションオブジェクト --

#### [　・コレクションについて](https://qiita.com/dondondon/items/47df35c04a23396bb35f)

#### [　・レンジ型について](#・)

#### [　・リスト型について](https://qiita.com/dondondon/items/e16d4f11f5fec214ff2b)

#### [　・タプル型について](#・)

#### [　・辞書型（連想配列）について](#・)

#### [　・集合型について](#・)


## 〇 応用編

### -- 文字列のフォーマット --

#### [　・printf形式　%演算子](https://qiita.com/dondondon/items/bd8feee8e8d196de2ad0)

#### [　・format関数](#・)

#### [　・formatメソッド](#・)

#### [　・f文字列](#・)

#### [　・n進数変換について](https://qiita.com/dondondon/items/50046f8224de046c5e65)

## 〇 実践編

#### [　・ファイルの読み書きについて](#・)

## 〇 番外編

#### [　・2進数について](https://qiita.com/dondondon/items/609b64e39a77e1378786)

#### [　・8進数について](https://qiita.com/dondondon/items/aefc106605fb00b0b6bb)

#### [　・16進数について](https://qiita.com/dondondon/items/730510cd5fa126d851e7)
FreeRTOSのタスク通知をビット単位で使う際の挙動

タスク通知で複数のビットをセットし、一部のビットだけ読むと、残ったビットを手順通りに読み出せなくなる。
FreeRTOSのカーネルは10.3.1を使用。

```c++:テストコード
{
    const TaskHandle_t task_handle = xTaskGetCurrentTaskHandle();
    uint32_t value = 0;
    BaseType_t status = pdFALSE;

    xTaskNotify(task_handle, 0x3, eSetBits);

    status = xTaskNotifyWait(0, 0x1, &value, 2);
    printf("%ld, %08lX\n", status, value);

    status = xTaskNotifyWait(0, 0x2, &value, 2);
    printf("%ld, %08lX\n", status, value);

    status = xTaskNotifyAndQuery(task_handle, 0, eNoAction, &value);
    printf("%ld, %08lX\n", status, value);

    ulTaskNotifyValueClear(task_handle, 0x3);
}
printf("\n");
{
    const TaskHandle_t task_handle = xTaskGetCurrentTaskHandle();
    uint32_t value = 0;
    BaseType_t status = pdFALSE;

    xTaskNotify(task_handle, 0x3, eSetBits);

    status = xTaskNotifyWait(0, 0x1, &value, 2);
    printf("%ld, %08lX\n", status, value);

    xTaskNotify(task_handle, 0, eNoAction); // フラグの読み捨て

    status = xTaskNotifyWait(0, 0x2, &value, 2);
    printf("%ld, %08lX\n", status, value);

    status = xTaskNotifyAndQuery(task_handle, 0, eNoAction, &value);
    printf("%ld, %08lX\n", status, value);

    ulTaskNotifyValueClear(task_handle, 0x3);
}
```

```:結果
1, 00000003
0, 00000002
1, 00000002

1, 00000003
1, 00000002
1, 00000000
```

xTaskNotifyWaitを連続で呼び出すと、2回目はpdFALSEが返り、指定したビットのクリアも行われない。
途中でxTaskNotify/eNoActionを読んでフラグを読み捨てた場合は2回目の呼び出しでpdTRUEが返り、指定したビットのクリアが行われる。

***

ぐぐると、それっぽい話題が出てきた。
[xTaskNotifyWait and notification nesting - FreeRTOS](https://www.rtos.org/FreeRTOS_Support_Forum_Archive/February_2017/freertos_xTaskNotifyWait_and_notification_nesting_ac947cc5j.html)

1回目ですでに通知は全部受け取り済みとフラグを設定することにより、2回目が受け取れなくなるようだ。
ゼロ以外は全部有効な値として処理すればいいんだろうけど、そういう実装にすると今度はインクリメントモードが使えなくなるから、専用のフラグで管理しているのかな?

対策としては「可能性のあるビットは全部一度に読み込む」らしい。
【Rspec】エラー：NameError: uninitialized constant FactoryBot

##環境
ruby 2.7.1
Rails 6.1.3.2
Docker version 20.10.7, build f0df350
docker-compose version 1.29.2, build 5becea4c

##状況

テストを実行するとエラーを吐く

```
$ docker-compose exec app bundle exec rspec spec/requests/XXXXXXX_spec.rb

Failure/Error: config.include FactoryBot::Syntax::Methods

NameError:
  uninitialized constant FactoryBot
```

```spec/rails_helper.rb
RSpec.configure do |config|
  #略
  config.include FactoryBot::Syntax::Methods
end
```

```Gemfile.
group :test do
　　　　　#略
  gem 'factory_bot_rails'
end
```


##解決方法
Gemfileで開発とテスト両方でインストール

```Gemfile.
group :development, :test do
　　　　#略
  gem 'factory_bot_rails'
end
```
ちゃんとドキュメント通りにインストールするのは大事ですね‥

##参考

https://github.com/thoughtbot/factory_bot_rails
ABC135 C - City Savers から学んだ

https://atcoder.jp/contests/abc135/tasks/abc135_c

![abc135_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/7a6a22e8-fcc9-72e0-450a-1473add33a3e.png)
![abc135_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/33d0eabc-12de-37e9-5f7f-1c4450a1c8b2.png)
![abc135_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/daa2150d-9260-5801-a1b8-7df5176f19d4.png)
![abc135_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/6dc00352-5ae6-8306-fd33-c455f97c7eda.png)

うーん、なるほど
DP っぽいなー。。って書いたら
全然違った(笑)

```CitySavers.py
N = int(input())

A = list(map(int,input().split()))
B = list(map(int,input().split()))

score = 0
marg = 0
for i in range(N):
    num = A[i]-marg
    if num > 0:
        score += marg
        A[i] -= marg
        if B[i] >= A[i]:
            score += A[i]
            marg = B[i]-A[i]
        else:
            score += B[i]
            marg = 0 # <= ここを忘れて WA (泣)
    else:
        score += A[i]
        marg = B[i]

if A[-1]-marg >= 0:
    score += marg
else:
    score += A[-1]
print(score)#123ms
```

for 文で、どこで抜けても
処理している引数は全て意図した
形式になるように意識が必要だと
再認識した。

***
再チャレンジ。
記述を少し最適化できて
かつ WA を食らわずに一発 OK!!
ちょっと時間をかけて慎重にやったから当然か。。

次回はサクッと出来るようになってることを祈る。

```abc135c.py
N = int(input())
A = list(map(int,input().split()))
B = list(map(int,input().split()))

sup = 0
cnt = 0
for i in range(N):
    a,b = A[i],B[i]
    if a <= b:
        cnt += a
        if A[i+1] >= b-a:
            A[i+1] -= b-a
            cnt += b-a
        else:
            cnt += A[i+1]
            A[i+1] = 0
    else:
        cnt += b
print(cnt)#119ms
```
[Rails] Google Map APIの地図が本番環境で表示されない

# やりたいこと
Google Map APIを使用したPFを本番環境(AWS)にデプロイしたところ開発環境では表示されていた地図が表示されなくなっていた。
![スクリーンショット 2021-09-17 18.16.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974719/45e36fca-6a4c-6d2e-3635-7bcb64e367f9.png)

本番環境でも地図が表示されるようにする！

# 調査
Google Map APIの設定に不備があるのかなと思ったのでとりあえずググり以下の記事がヒット！

https://web.chichibu-life.com/googlemap-error/

設定を確認するも全て設定済‥
Google Map APIには何も罪はなかったです 笑

ここから全く分からずめっちゃハマる‥

# 原因と解決策
結論から言うと地図が表示されないのはAPIキーを`gitignore`している`.env`ファイルに記入してたからでした。
そりゃ本番環境で動くはずないや‥

解決策は、`config/credentials.yml.enc`でAPIキーを管理させればOK

vimファイルを開いて

```ruby:ターミナル 
$ EDITOR=vi rails credentials:edit
```

APIキーを入力
ちなみにvimファイルの入力の仕方は`i`で入力できるようになり、
入力できたらescキーを押して`:wq`で保存できます。

```ruby:ターミナル 
map_api_key: APIキー 
```

保存後APIキーが正しく入力されているか一応コンソールで確認します。
APIキーが返ってきてたらOKです！

```ruby:ターミナル 
rails c
irb(main):001:0> Rails.application.credentials.map_api_key
=> "APIキー"
```

あとはMAP表示のための該当箇所を書き換えていきます。

MAP表示部分(haml)

```ruby
%script{:async => "", :defer => "defer", :src => "https://maps.googleapis.com/maps/api/js?key=#{Rails.application.credentials.map_api_key}&callback=initMap"}
```

geocoderの設定ファイル

```ruby:config/initializers/geocoder.rb
api_key: Rails.application.credentials.map_api_key
```

これで解決。

#おまけ
Map表示のやり方は以前まとめたのでよければ参考にしてみてください！

https://qiita.com/aaaasahi_17/items/8784ce1517c58510f0b8
laravel外部キー設定したテーブルのデータをtruncateしたい

##はじめに
データをいったん消去したかったので調べてみると
php artisan db:seedを使ってできるようだったのでやってみた。
備忘録として残しておきます。

##環境
- Laravel8
- php8

## 最初に実行したコード（失敗例）
``` php 
namespace Database\Seeders;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {  
        \App\Models\User::truncate();
        \App\Models\Post::truncate();
    }
}
```

## `php artisan db:seed` 実行後エラー

```
   Illuminate\Database\QueryException 

  SQLSTATE[42000]: Syntax error or access violation: 1701 Cannot truncate a table referenced in a foreign key constraint (`laravel`.`post`, CONSTRAINT `post_user_id_foreign`) (SQL: truncate table `users`)

  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:678
    674▕         // If an exception occurs when attempting to run a query, we'll format the error
    675▕         // message to include the bindings with SQL, which will make this exception a
    676▕         // lot more helpful to the developer instead of just the database's errors.
    677▕         catch (Exception $e) {
  ➜ 678▕             throw new QueryException(
    679▕                 $query, $this->prepareBindings($bindings), $e
    680▕             );
    681▕         }
    682▕ 

      +11 vendor frames
  12  database/seeders/DatabaseSeeder.php:21
      Illuminate\Database\Eloquent\Model::__callStatic("truncate", [])

      +22 vendor frames
  35  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

```

外部キー制約が発生しており、削除できない。（truncateする順番の違いでもない。）


## 修正

``` php 
namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Schema;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        Schema::disableForeignKeyConstraints(); //外部キーチェックを無効にする
        \App\Models\User::truncate();
        \App\Models\Post::truncate();
        Schema::enableForeignKeyConstraints(); //外部キーチェックを有効にする
    }
}
```

##がっつり参考にさせていただいた記事
[Laravelで外部キー制約のあるテーブルを操作する。](https://qiita.com/ucan-lab/items/55ec5c341fb5c228fe14) 
[laravel マイグレーション](https://readouble.com/laravel/8.x/ja/migrations.html)

laravelの公式ドキュメントは見返す度、新しい知識が増えるなぁ。
python初学者の備忘録　pipについて

####[←目次へ](https://qiita.com/dondondon/items/cd45224ca93e65c976cc)

:::note info
python,Qiita初心者なので、備忘録として記載していきます。
なにせ初心者なので、知識不足はご理解ください。
知識を深めながら追記していきたいと思います。
:::

#pipとは
`基本`

+ The package installer for Pythonの略
+ 以下の場所からインストール等を行うツール
+ [PyPI（Python Package Index）](https://pypi.python.org/pypi)は、Pythonのサードパーティーライブラリ倉庫みたいなもの

:::note info
ライブラリ > パッケージ > モジュール
:::

#####`pipのバージョン確認`

```python
>>> python -m pip --version
または
>>> python -m pip -V
# pip 21.2.4 from ...\pip (python 3.9)
```

#####`pipのアップグレード`

```python
>>> python -m pip install --upgrade pip
または
>>> python -m pip install -U pip
```

# pipコマンド
#####`インストール済みのパッケージの確認`

```python
>>> python -m pip freeze

# -- 実行結果 --
autopep8==1.5.7
pycodestyle==2.7.0
toml==0.10.2
```
または

```python
>>> python -m pip list

# -- 実行結果 --
Package     Version
----------- -------
autopep8    1.5.7
pip         21.2.4
pycodestyle 2.7.0
setuptools  56.0.0
toml        0.10.2
```

#####`最新でないパッケージだけを確認`

```python
>>>python -m pip list --outdated 
または
>>>python -m pip list -o

# -- 実行結果 --
Package    Version Latest Type
---------- ------- ------ -----
setuptools 56.0.0  58.0.4 wheel
```

#####`最新のパッケージだけを確認`

```python
>>>python -m pip list --uptodate
または
>>>python -m pip list -u

# -- 実行結果 --
Package     Version
----------- -------
autopep8    1.5.7
pip         21.2.4
pycodestyle 2.7.0
toml        0.10.2
```

#####`パッケージのインストール`

```python
>>> python -m pip install パッケージ名

# -- バージョン指定してインストールする場合 --
# バージョンダウンしたい場合も同様
>>> python -m pip install パッケージ名==バージョンNo
```

#####`インストール済みパッケージのアップグレード`

```python
>>> python -m pip install --upgrade パッケージ名
または
>>> python -m pip install -U パッケージ名
```

#####`パッケージのアンインストール`

```python
>>> python -m pip uninstall パッケージ名
```

#####`パッケージの依存関係を調べる`

:::note info
-f オプションを指定すると、パッケージを構成する全てのモジュールが表示される
:::

```python
>>> python -m pip show パッケージ名
# 例
>>>python -m pip show toml

# -- 実行結果 --
# Name: toml
# Version: 0.10.2
# Summary: Python Library for Tom's Obvious, Minimal Language
# Home-page: https://github.com/uiri/toml
# Author: William Pearson
# Author-email: uiri@xqz.ca
# License: MIT
# Location: #c:\....\site-#packages
# Requires:
Required-by: autopep8
# autopep8パッケージに依存していることが分かる
```

#####`パッケージを検索する`

:::note warn
一時的にAPIが停止されているようです
:::

```python
python -m pip search パッケージ名
```

### パッケージのバージョンバックアップ方法
パッケージのなかには、他のパッケージに依存しているものがあります。そのため、アップグレードによりパッケージ間の依存関係が損なわれると動かなくなることがあります。そのような時のために、正常に動作していた時のバージョンを控えておきます。

```python
# -- 指定したパスへファイルを出力する ※管理者権限じゃないと怒られるカモ --
>>> python -m pip freeze > パス\ファイル名
```

### バックアップファイルからパッケージを復元する

```python
# -- 指定したファイルからパッケージを復元する --
>>> python -m pip install -r パス\ファイル名
```
[Ruby] AtCoder過去問 D - Caracal vs Monster 

##はじめに
AtCoder過去問D問題にRubyで挑戦してみました。
よろしくお願いします。

問題はこちらから確認してください。↓

https://atcoder.jp/contests/abc153/tasks/abc153_d

##D - Caracal vs Monster 
まずは入力を受け取ります。
その後処理に使用する変数xとx_aryという配列を準備します。

```ruby
h = gets.to_i

x = 1
x_ary =[1]
```

実はこれの答えはある程度答えが限られています。
例えばhが2であれば答えは3です。
hが３であっても答えは3です。

もしhが4だったら答えは7です。
5でも6でも7でも答えは7です。

hが８になると答えは15です。これもhが１５までは答えは15なのです。

x_aryにmaxの```1099511627775```までの答えの数字を配列として入れていくのです。(10の12乗がこの数字)

先ほどのxとx_aryを利用してこれを表現します。

```ruby
h = gets.to_i

x = 1
x_ary =[1]
while x != 1099511627775
  x = x * 2 + 1
  x_ary << x
end
```

ちなみにx_aryの中身は下記のようになっています。

```ruby
[1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215, 33554431, 67108863, 134217727, 268435455, 536870911, 1073741823, 2147483647, 4294967295, 8589934591, 17179869183, 34359738367, 68719476735, 137438953471, 274877906943, 549755813887, 1099511627775]
```

答えはこの中の数字でしかあり得ません。
長ったらしいですが、めちゃめちゃ時間がかかるような処理でもないと思うのでこれでいけるはずです。

続いて変数countを用意して0を代入します。
each文で配列x_aryから一つずつ取り出して、入力されたhの方が大きい限りcountに+1し続けます。ブロック変数iに代入された値がhを超えたら処理を強制的に終了させます。

x_aryの中でhよりも小さい最大の数字はx_ary[count]で表現できます。
それが答えです。

```ruby
h = gets.to_i

x = 1
x_ary =[1]
while x != 1099511627775
  x = x * 2 + 1
  x_ary << x
end

count = 0

x_ary.each do |i|
  if h > i
    count += 1
  else
    break
  end
end
puts x_ary[count]
```
Go 言語で日付を JSON に変換するとき構造体を使わずに任意のフォーマットにする

## はじめに

Go 言語で構造体を JSON に変換すると `time.Time` 型の要素は RFC3339 フォーマットに変換されます。
これを他のフォーマットにしたくて

> golang time json marshal

といったキーワードでググると `time.Time` 型を要素に持つ構造体 (`jsonTime`) を定義して `MarshalJSON()` メソッドを実装する、以下のような方法がヒットします。

```go
type jsonTime struct {
    time.Time
}

func (j jsonTime) MarshalJSON() ([]byte, error) {
    return json.Marshal(j.Format("2006/01/02"))
}
```

これで解決なのですが、私にとっては `jsonTime` が構造体だと都合が悪かったため、それを使わない方法を調べました。

## 環境

```zsh
% go version
go version go1.17.1 darwin/amd64
```

## 実装方法

まずコードを示します。

```go:main.go
package main

import (
    "encoding/json"
    "fmt"
    "time"
)

type jsonTime time.Time

func (j jsonTime) MarshalJSON() ([]byte, error) {
    t := time.Time(j)
    return json.Marshal(t.Format("2006/01/02"))
}

type data struct {
    Id        int      `json:"id"`
    Name      string   `json:"name"`
    CreatedAt jsonTime `json:"created_at"`
}

func main() {
    d := data{
        Id:        1,
        Name:      "Foo Bar",
        CreatedAt: jsonTime(time.Now()),
    }

    bytes, _ := json.Marshal(d)
    fmt.Printf("%s", bytes)
}
```

先述した `jsonTime` 構造体の代わりに、defined type を使用して `time.Time` 型から `jsonTime` 型を定義しています。
ポイントは `MarshalJSON()` メソッドで `jsonTime` 型のレシーバを `time.Time` 型にキャストしているところです。

次に実行結果です。

```
{"id":1,"name":"Foo Bar","created_at":"2021/09/22"}
```

日付を任意のフォーマットにできました。

## おわりに

私が探した限り、日付を任意のフォーマットの JSON に変換する方法はどれも同じものしか見つけられませんでした。
フォーマットのやり方にこそ差異はありましたが、構造体を使っていることは同じでした。
もしかして defined type では何か不都合があったりするのでしょうか？
それとも構造体以外も使えるのは当たり前すぎて誰も記事にしないだけ？
【React】Ratingコンポーネントの星の数を制御する【MaterialUI】

<h2>Ratingコンポーネントの星の数を制御したい</h2>
Ratingコンポーネントでデフォルトの５つ星から、数を増減させたりゼロにさせないようにしたい場面に遭遇しました。

ここではその方法について記載します。

なお、星をゼロにしない方法については、APIに記載がなく割と無理やりな実装になっています(泣)

<h2>実装方法</h2>
<h3>最大値の設定</h3>
最大値の設定方法についてです。
最大値を設定すると、その分だけ星が表示されるようになります。

下記では最大値を8に設定したものになります。

```react:Ratingコンポーネントに最大値を設定
import * as React from 'react';
import Box from '@mui/material/Box';
import Rating from '@mui/material/Rating';
import Typography from '@mui/material/Typography';

export default function BasicRating() {
  const [value, setValue] = React.useState(2);

  return (
    <Box
      sx={{
        '& > legend': { mt: 2 },
      }}
    >
      <Rating
        name="simple-controlled"
        value={value}
        max={8}
        onChange={(event, newValue) => {
          setValue(newValue);
        }}
      />
    </Box>
  );
}

```

結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927880/e0b1412d-c436-85c1-f8c6-a1edc7aefba8.png)

<h3>最小値の設定</h3>
最小値の設定方法です。こちらはMaterialUIのAPIに記載がありませんでした。
APIにはmaxがあったのだから、「min」でいけると思ったのですが、機能しませんでした。。。なので、ここでは原始的な条件分岐によって成業するようにしました。

下記のソースでは、星をゼロにしようとしても1を最小値として設定します。

ちなみに、初期の設定のままだと星をゼロ設定したときに、valueの値がnullになってしまい、いざ自作アプリに組み込もうとしたときには、0ではなくnullになっていてエラー。。。みたいになるので注意です。
以下では、星がゼロの時は1にするような条件分岐を作って、その問題を回避しています。

```react:Ratingコンポーネントに最小値を設定
import * as React from 'react';
import Box from '@mui/material/Box';
import Rating from '@mui/material/Rating';
import Typography from '@mui/material/Typography';

export default function BasicRating() {
  const [value, setValue] = React.useState(2);

  function onChangeHandle(newValue) {
    if(newValue === null){
      setValue(1)
    }else{
      setValue(newValue)
    }
  }

  return (
    <Box
      sx={{
        '& > legend': { mt: 2 },
      }}
    >
      <Rating
        name="simple-controlled"
        value={value}
        onChange={(event, newValue) => {
          onChangeHandle(newValue);
        }}
      />
    </Box>
  );
}

```

結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927880/6eee8450-4250-1692-b878-e29d4a247408.png)

<h2>参考</h2>

https://mui.com/components/rating/

https://mui.com/api/rating/
laravel jetstream  認証メール送信をスキップしたかった

##はじめに
Laravel8 JetStreamには会員登録時に認証メールを導入する機能があって便利だけど
設定後に認証メール送信せずにユーザー登録できるルートも用意したかったので備忘録として残します。

##結論
`trait MustVerifyEmail hasVerifiedEmail()` のnull判定により、認証メールが送信されていたので
新規登録時に`email_verified_at`を挿入できるように `fillable`に追加する

###1. ユーザー登録時に `email_verified_at` に時刻を挿入する

``` php
use Carbon\Carbon;

$user = User::create([
  'email' => $request->input('email'),
  'name'  => $request->input('name'),
  'email_verified_at' => Carbon::now() //時刻設定して認証メールをスキップする   
]);
```

###2. Userモデルの`fillable`に `email_verified_at` を追加する

``` php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
/** 省略 */
use App\Models\SnsProvider;

class User extends Authenticatable implements MustVerifyEmail
{
    use HasApiTokens,HasFactory,HasProfilePhoto,Notifiable,SoftDeletes;

    /**
     * The attributes that are mass assignable.
     *
     * @var string[]
     */
    protected $fillable = [
        'name',
        'email',
        'password',
        'zip',
        'prefecture',
        'address',
        'email_verified_at' //登録時に追加できるようにするため
    ];
```

これで登録時に認証メールが送信されないようになる。
あとは、`Auth::login('$user')` などでログインすればオッケー。


## ちなみに
MustVerifyEmail の`hasVerifiedEmail()` はlaravel内で条件分岐として使用されている。
notify()を使用してメール送信処理も行われている。


``` php 
namespace Illuminate\Auth;
use Illuminate\Auth\Notifications\VerifyEmail;

trait MustVerifyEmail
{
    /**
     * Determine if the user has verified their email address.
     *
     * @return bool
     */
    public function hasVerifiedEmail()
    {
        return ! is_null($this->email_verified_at);
    }
```

間違いあればコメントください。
Laravel 論理削除されているリレーション先データを取得する方法

## 目的

-　論理削除されているリレーション先データを取得する方法をまとめる

## 方法

- リレーションの記載に`withTrashed()`の記載も追加する。

    ```php
    public function foo()
    {
        return $this->belongsTo('App\Models\Foo','foo_id')->withTrashed();
    }
    ```
typescriptで複合型の配列を定義したい

```hoge.ts
const hoge: (string|number)[] = [ 1, "hige" ];
```
ただし

```hage.ts
// OK
const hage: (number|[])[] = [ 1, [] ];

// NG
const moge: (number|[])[] = [ 1, [ [], 3 ] ];

// OK
const koge: any = [ 1, [ [], 3 ] ];
```

ネストしたい場合は大人しくany使った方がいいかも


追記：
コメントで再帰的な型の定義方法教えていただきました。
ありがとうございます。
【Vue.js】算出プロパティ

#はじめに
こんにちは。
Vue.jsの算出プロパティについてアウトプットしていきます！

##算出プロパティとは
関数によって算出したデータを返すことができるプロパティのこと。


```html:HTML
<div id="app">
  {{ message.split('').reverse().join('') }}
</div>
```

```javascript:Vue.js
var app = new Vue({
  el: '#app',
  data: {
    message: 'Hello!'
  }
})
```
`!olleH`が出力される。
Vue.jsでは、テンプレート内に式をかくことは可能ですが、ロジックを詰め込んでしまうとコードが見づらくなり、メンテナンス性が悪くなるため算出プロパティを利用します。

<br>

```html:HTML
<div id="app">
  {{ reversedMessage }}
</div>
```

```javascript:Vue.js
var app = new Vue({
  el: '#app',
  data: {
    message: 'Hello!'
  },
  computed: {
    reversedMessage: function(){
      return this.message.split('').reverse().join('')
    }
  }
})
```
上記のように、式をcomputed内で実行させるとコードも見やすく、複数回呼び出すときも`{{ reversedMessage }}`を記述するだけなので再利用もしやすくなります。


#最後に
ここまで算出プロパティについてまとめました。
基礎を押さて実務でも使えるよう、見やすさやメンテナンス性のしやすいコードをかけるようにコツコツ学習していきます！
ABC144 C - Walk on Multiplication Table から学んだ

https://atcoder.jp/contests/abc144/tasks/abc144_c

![abc144_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/e28e27fb-7275-3f00-ae06-51b0d9894394.png)
![abc144_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/8f5d0a9b-b6aa-9a11-3786-670ef8dd03b2.png)
![abc144_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/5a72e175-7e0a-7c87-8012-fee94f11595e.png)
![abc144_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/c9b7231a-e080-99a3-fd07-049c9e31786c.png)

う、掛け算表が分からない。。ググると。どうやら以下のイメージらしい。

![150616timestable_top-w960.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/6e5af4cf-babc-61eb-d7fe-f64454b877b5.jpeg)

問題文に、一応掛け算表の定義が書いてある。なるほど。。

 N へのアクセスアプローチから最小のモノを答えよ。。的な。

なるほど、ざくっと書いたら通った。

```WalkonMultiplicationTable.py
N = int(input())

lis = []
from math import *
for n in range(1,floor(isqrt(N))+1):# 10^12 まで試す必要ない 10^6 で充分
    if N%n == 0:
        lis.append([n,N//n])
#print(lis)

ans = float("inf")

for a,b in lis:
    ans = min(ans,a-1 +b-1)
print(ans)
#144ms
```

幅優先探索が使えるかとワクワクしたが、そこまで必要なかった。

step1.N を 2 つの要素に分解,組み合わせをリストする。
step2.組み合わせの中から、最短ルートを探す

10^12 ではなく、10^6 までで充分な理由は以下で触れてます。

https://qiita.com/AKpirion/items/f827b85de976dcd1678e

***

さっぱり忘れて解き直し。
横移動、下移動 の差分を最小にすると移動距離は最小になると思った。

```abc144c.py
N = int(input())

lis = []
from math import floor
for i in range(1,floor(N**0.5)+1):
    if N%i == 0:
        lis.append([i,N//i,abs(i-N//i)])#[下移動、横移動、下-横] を一パックにして lis に格納

lis = sorted(lis,key=lambda t:t[2])     #lis[2] 下-横の値で sort
#print(lis)
print(lis[0][0]-1+lis[0][1]-1)          #lis[0] を呼び出して答えを導出
#133ms
```
Python3: Kinesis から Lambda に渡されたパラメーターを読む方法

Lambda でトリガーを Kinesis に指定した時、パラメーターは base64 でエンコードされて渡されます。その値を読む Lamba のプログラムです。

```py:lambda_monitor.py
# -*- coding: utf-8 -*-
#
#	lambda_monitor.py
#
#				   Sep/21/2021
#
# --------------------------------------------------------------------
import sys
import base64
import json

# --------------------------------------------------------------------
def lambda_handler(event, context):
	sys.stderr.write("*** lambda_handler *** start ***\n")
	print("Received event: " + json.dumps(event, indent=2))
	sys.stderr.write("*** lambda_handler *** bbb ***\n")
	data_in = event["Records"][0]["kinesis"]["data"]
	decoded = base64.b64decode(data_in)
	str_out = decoded.decode()
	print(str_out)
	sys.stderr.write("*** lambda_handler *** end ***\n")
#
	return "OK"
# --------------------------------------------------------------------
```
Eloquent の多対多リレーションの更新の分類

#はじめに
多対多のリレーションを持つテーブルの Eloquent に触れたので整理をしておこうと思います。

#多対多の前提設定
今回はユーザーとロールの例で話をすると、まずは以下のテーブルが存在していることになります。

- users

| column name | column type |
|:-:|:-:|
| id | integer |
| name | string |

- roles

| column name | column type |
|:-:|:-:|
| id | integer |
| name | string |

- role_users

| column name | column type |
|:-:|:-:|
| role_id | integer |
| user_id | integer |

上記のテーブルに対して、User クラスと Role クラスにはそれぞれ以下の様に多対多リレーションメソッドを定義します。

```
- User 側
public function roles()
{
    return $this->belongsToMany(Role::class);
}

- Role 側
public function users()
{
    return $this->belongsToMany(User::class);
}
```

ちなみに、`belongsToMany()`は第4引数までを用いることで、中間テーブルや中間テーブルで使用するカラム名の指定が可能です。

```
- 形式
belongsToMany(相手のクラス, 中間テーブル名, 自身のIDを指すカラム名, 相手のIDを指すカラム名)

- 実例（User 側）
public function roles()
{
    return $this->belongsToMany(Role::class, 'role_users', 'user_id', 'role_id');
}
```

#多対多リレーションの更新
多対多のリレーションを更新する際は、

```
$user->roles()->更新用メソッド(相手のIDの配列);
```

という形式で更新を行うことが多いですが、この更新用メソッドは大きく分けて以下の3つが存在します。

・attach()：関連付け
・detach()：関連解除
・sync()：同期

## attach()/detach()
`attach`はリレーションの追加のみ、`detach`はリレーションの解除のみを行うメソッドです。

用途としては、以下の様にそれぞれに対して追加 or 解除を実行する場合に向いています。

| 権限名 | 操作 |
|:-:|:-:|
| admin | [ 解除 ] |
| manager | [ 解除 ] |
| normal | [ 追加 ] |

ちなみに、`detach`に関しては引数なしでの実行も可能であり、引数なしで実行すると実行元のレコードが持つリレーションを全て解除します。

## sync()
`sync`は引数で渡された ID 配列に指定されている ID のみとリレーションが結ばれるように追加及び解除を行います。
引数なしの`detach`の後に`attach`を行うことで得られるリレーションと同じリレーションを1つのメソッドの実行で得ることができます。

用途としては、以下の様に全てのレコードが並んでいてそこからリレーションを行うものを選択して更新する場合に向いています。

[x] admin
[x] manager
[ ] normal
　　　　　[ 更新 ]
iOS15のUITableViewHeaderの上部に空白ができる

取り急ぎの自分用メモです。

UITableViewにHeaderを設定している場合、上部に空白ができていました。

```
if #available(iOS 15, *) {
    tableView.sectionHeaderTopPadding = 0.0
}
```

これを使ってパディングを0にしてあげればOK。
14以下はパラメータ自体がないのでバージョンで条件分け。
パラメータを追加するなら、デフォルトはゼロにして欲しい、、、😥
ALM Accelerator for Makersを無料のGitHub組織プランで使用する方法

向井です。

こちらの記事は前回[こちらの記事](https://qiita.com/kumukai/items/561e652fdeb6bfa31180)で書いたALM Accelerator for Makersを使えるようにする方法の追記です。

ALM Accelerator for Makersを使うには無償のGitHub組織プランを使う方法と有償のGitHub組織プランを使う方法の2つの方法があります。

こちらの記事では無償のプランを使う方法について書きます。

#1. GitHubにリポジトリを作成する
[こちらの記事](https://qiita.com/kumukai/items/561e652fdeb6bfa31180)の**4.**までの手順のあと、[こちらのDocs](https://docs.microsoft.com/ja-jp/power-platform/guidance/coe/almaccelerator-components)の手順でキャンバスアプリからプロジェクトを作成します。承認後、GitHubにリポジトリが作成されます。

#2. GitHubのリポジトリのシークレットを設定する
[こちらのDocs](https://docs.microsoft.com/ja-jp/power-platform/guidance/coe/setup-almaccelerator#free-github-org-plan)をみると、
「 注意：これらの手順は、ALM Accelerator for Makers で作成されたすべてのプロジェクトで実行する必要があります。」
と書いてあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/738a19ab-171c-7b44-926c-a67f70fa58c9.png)

わかりにくい表現ですが、これは**ALM Accelerator for Makersを使って作成されたすべてのGitHubのリポジトリ**に対してシークレットの設定が必要だということのようです。

つまり、**プロジェクトを作成するたびに設定が必要**になります。

（実際の運用を考えるとなんとも不便なのですが、そこは有償版のGitHubを使えということなのでしょうか・・・）


設定の仕方は以下の通りです。


作成したリポジトリを開く。
Setting
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/4400364c-d610-88dd-5008-35e8c389e16c.png)

Secrets
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/2167fd7e-1db4-30d6-b174-76138cf127dd.png)

New repository secret
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/c7a28f94-1979-0fe3-8591-e7829ac9f2c0.png)

Name：**DEV_ENVIRONMENT_SECRET**
Value：Microsoftアカウントにサインインするときのパスワード
入力したら、Add secret
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/7643ebbb-182e-c4ff-87e0-a4ec583c732d.png)

同様の手順で、
Name：**TEST_ENVIRONMENT_SECRET**、**PROD_ENVIRONMENT_SECRET**
Value：Microsoftアカウントにサインインするときのパスワード
も作成する。

作成後は以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/36b0450f-2aa0-3371-ba9c-8bd95c14601b.png)

これで設定は終了です。
設定したプロジェクトは、Deployボタンが機能するようになったはずです。
Win32 APIを扱いやすくするMicrosoft.Windows.CsWin32を使うときに躓いたことのメモ


## Microsoft.Windows.CsWin32とは？
[こちらのGitHub](https://github.com/microsoft/CsWin32)に記載の通り、Win32 APIにアクセスするために作成するクラス（通常NativeMethods）を自動生成してくれるライブラリです。
利用したい関数名を事前に記載しておくだけで、ビルド時にNativeMethodsクラスを作成してくれます。ややこしいところを吸収してくれるのは助かりますね😉
使い方はReadMeを見ればわかると思うので、詰まったところだけ記載します。

**注意**
0.1.560-betaで確認しています。

## 詰まったところ
### HWND型がGenerateされない？
Windows.Win32.Foundation名前空間にいました。(ドキュメントに記載ないよね？)
### WPFでHWNDはどうやって取得するの？
公式のサンプルコードが見つからなかったのですが、以下の記載で取得できています。
[参考:WPF で Visual Studio 2012 のような光るウィンドウを作る | grabacr.nét](http://grabacr.net/archives/507)

``` C#
/// <summary>
/// コンストラクタ
/// </summary>
/// <param name="window">対象ウィンドウ</param>
internal unsafe ClipboardController(Window window)
{
   // WPFでウィンドウプロシージャをフックする場合、
   // 対象WindowからHwndSourceを取得し、それに対してフックを追加する
   HwndSource source = (HwndSource)PresentationSource.FromVisual(window);
   source.AddHook(WndProc);
   // ハンドルを取得しリスナを追加
   hWnd = new(source.Handle);
   _ = PInvoke.AddClipboardFormatListener(hWnd);
}
```

## 作ったもの
https://github.com/soiyayios/ClipboardViewer
ipconfig /flushdns がフリーズする

### ipconfig /flushdns がフリーズするとき

#### 背景

「DNSリゾルバーキャッシュ」を長年フラッシュせずに、Windowsを使い続けていたところ、突然「DNSクライアント」機能が全く動かなくなった。「DNSリゾルバーキャッシュをフラッシュしたら直るかも」ということで、「ipconfig /flushdns」を実施するも、途中でフリーズして完了しない。

#### 対策

DOS窓を「管理者モード」で開いて、

```
C:\Users\XXXX>ipconfig /flushdns
```

がいつまで経っても完了しない。このとき、タスクマネージャを起動して、「サービスホスト:DNS Client」を強制終了すると、サクッと終った。

```
C:\Users\XXXX>ipconfig /flushdns
DNS リゾルバー キャッシュは正常にフラッシュされました。
```
たぶん「DNS Client」がいじわるしてたかんじ。お疲れ様でした。

#### 教訓

* Windowsの「DNSクライアント」機能は突然動かなくなる（致命的）。
* 定期的に「DNSリゾルバーキャッシュ」を削除するほうが良さそう。
Excelで空白セルの行を削除したい

いろいろ方法がありますがここでは「検索と選択」、「フィルター」を使って空白セルの行を削除します。

1.対象の列、または対象範囲を選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22308/ba1d47c2-751a-b653-1e7b-08af547e317b.png" width=50%>

2.[ホーム]>[検索と選択]>[条件を選択したジャンプ(S)]
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22308/1856b742-46aa-5ec6-8293-c9947c9c5835.png" width=50%>

3.選択オプションで[空白のセル(K)]を選択して[OK]
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22308/de62ed8d-b211-fccf-c2db-100129e622d4.png" width=50%>

4.空白のセルが選択されるので、選択されたセル上で右クリックして[削除(D)]する（上手に右クリックしないと選択が解除されるので注意！）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22308/9e77dfc5-c48d-cb35-49d4-ebf494b7493f.png" width=50%>

5.[上方向にシフト(U)]を選択した[OK]
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22308/726a4f80-c05c-4442-9e6f-abb6e2a3246b.png" width=50%>

6.空白セルの行をできました
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22308/a3e87445-83a9-a113-d3cf-158fda69c36f.png" width=50%>


ところが、セルに半角スペースや全角スペースが入っていると[空白のセル(K)]では上手くいきません。

そんな場合フィルタを使います。

7.範囲を選択して、[データ]>[フィルタ]
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22308/d90ee23c-ff28-30fb-b244-20a5a4892e54.png" width=50%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22308/e97be6d3-0086-622d-a56f-aadb17e48724.png" width=50%>

8.「▼」マークをクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22308/e4dadc6b-2d6c-c723-83b5-320611bd94e6.png" width=50%>

9.削除したデータを選択して[OK]
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22308/f10dd216-01ec-517c-158d-a9594feb07e2.png" width=50%>

10.選択したデータだけがフィルタされるのでその行を選択して右クリックから[行の削除(D)]を実行します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22308/51027dbe-7005-b192-0b63-95b3bbf90849.png" width=50%>


マクロを使うとか他の方法もありますが多分最も簡単な方法のひとつです。
Javascriptのスプレッド構文

#スプレッド構文を使ってできること
配列やオブジェクトを展開できる。
##展開とは？:thinking:
配列やオブジェクトを
配列はそのままでは使いづらいことがしばしばある。
簡単にバラして、配列じゃない形で配列の順番のまま使えるようにできるイメージ！
詳しくは実際に使っているものを見てみて:point_down_tone2::point_down_tone2::point_down_tone2::point_down_tone2::point_down_tone2::point_down_tone2:
#スプレッド構文の書き方
ドット３つのあとに、展開したいものを持ってくる

```
...定数
```
```js
const point =[67,88,54,99,78];
const MaxP=Math.max(...point);

console.log('最高得点：'+MaxP);
>最高得点：99
```

##配列の場合
```js
const AIU=['あ','い','う'];
const Agyou =[...AIU,'え','お'];

console.log(Agyou)
>["あ", "い", "う", "え", "お"]
```
###スプレッド構文は好きなところに入れられるぞ
```js
const num =[32,1,4,24];
const answer =[0,...num];

console.log(answer)
>[0, 32, 1, 4, 24]
```
#オブジェクトの場合
```javascript
const obj1 = {a:1,b:2,c:3};
const obj2 = {...obj1,c:99,d:5};

console.log(obj2)
>{a: 1, b: 2, c: 99, d: 5}
```

:warning:オブジェクトで同じプロパティ名のものがあった場合は上書きされてしまう