OmniAICreator/Qiita-1.07M huggingface dataset:
Railsチュートリアル10.2.3 演習1(フレンドリーフォワーディング)で詰まった件

Railsチュートリアル10.2.3 演習1(フレンドリーフォワーディング)で詰まったので、備忘録として残します。コードは基本チュートリアルのコピペ通りで、環境もすべてチュートリアルに従っています。

## 演習内容
> フレンドリーフォワーディングで、渡されたURLに初回のみ転送されていることを、テストを書いて確認してみましょう。次回以降のログインのときには、転送先のURLはデフォルト（プロフィール画面）に戻っている必要があります。ヒント: リスト 10.29のsession[:forwarding_url]が正しい値かどうか確認するテストを追加してみましょう。

## 最初に書いたテスト
```ruby:users_edit_test.rb
 test "successful edit with friendly forwarding" do
    #追記前
    # get edit_user_path(@user)
    # log_in_as(@user)
    
    #追記後
    assert_equal session[:forwarding_url], nil  ###追記1### 
    get edit_user_path(@user)
    assert_equal session[:forwarding_url], edit_user_path(@user)  ###追記2###
    log_in_as(@user)
    assert_equal session[:forwarding_url], nil  ###追記3###
    
    #以下そのまま
    assert_redirected_to edit_user_url(@user)
    …
  end
  
```
実行結果は以下です。
"NoMethodError: undefined method `session' for nil:NilClass"と言われました。
```
ubuntu:~/environment/sample_app (updating-users) $ rails t
Running via Spring preloader in process 5963
Started with run options --seed 30229

ERROR["test_successful_edit_with_friendly_forwarding", #<Minitest::Reporters::Suite:0x000055d72bdb00f8 @name="UsersEditTest">, 2.312850365000031]
 test_successful_edit_with_friendly_forwarding#UsersEditTest (2.31s)
NoMethodError:         NoMethodError: undefined method `session' for nil:NilClass
            test/integration/users_edit_test.rb:24:in `block in <class:UsersEditTest>'

  34/34: [=========================================================] 100% Time: 00:00:02, Time: 00:00:02

Finished in 2.59835s
34 tests, 84 assertions, 0 failures, 1 errors, 0 skips
```
上記の追記1のところが良くなかったらしく、エラーが出ていました。
**追記3と全く同じコードなのに追記1ではエラーが出て、追記3ではエラーが出ない理由がわかる方いたら教えてほしいです…**
追記1,2の間のget edit_user_path(<sapn>@</span>user)で以下コードが実行されます。この前後でsessionがnilだったりnilじゃなかったり（言語化できない）みたいな感じなのでしょうか。
```
def store_location
    session[:forwarding_url] = request.original_url if request.get?
end
```

外部サイトの情報をたどると、`Nilclass`の`nil`オブジェクトに対して、`session`メソッドは定義されていない、とのことですが、あまり把握できず…

一旦次に進むとします。
追記1を消したところ、以下のエラーが出ました
```
ubuntu:~/environment/sample_app (updating-users) $ rails t
Running via Spring preloader in process 6544
Started with run options --seed 36283

session[:forwarding_url] => http://www.example.com/users/762146111/edit3% Time: 00:00:02,  ETA: 00:00:01
 FAIL["test_successful_edit_with_friendly_forwarding", #<Minitest::Reporters::Suite:0x000055d72a2f2950 @name="UsersEditTest">, 2.0507669390003684]
 test_successful_edit_with_friendly_forwarding#UsersEditTest (2.05s)
        --- expected
        +++ actual
        @@ -1 +1 @@
        -"http://www.example.com/users/762146111/edit"
        +"/users/762146111/edit"
        test/integration/users_edit_test.rb:27:in `block in <class:UsersEditTest>'

  34/34: [=========================================================] 100% Time: 00:00:02, Time: 00:00:02

Finished in 2.32992s
34 tests, 85 assertions, 1 failures, 0 errors, 0 skips
```
追記2の比較結果が異なるという結果で、単純に"http\://www.example.com/"をつけ忘れているだけでした。

```ruby:修正点
assert_equal session[:forwarding_url], edit_user_path(@user)  
↓
assert_equal session[:forwarding_url], http://www.example.com" + edit_user_path(@user)
```

以上で、無事テストが動きました。
S3からDynamo DBにデータを一括インポート

# はじめに
最近のアップデートで、S3に上げたファイルをDynamoDBテーブルにインポートできるようになりました。

https://aws.amazon.com/jp/about-aws/whats-new/2022/08/amazon-dynamodb-supports-bulk-imports-amazon-s3-new-dynamodb-tables/

DynamoDBからS3のエクスポートはすでに対応しているようです。

https://aws.amazon.com/jp/blogs/aws/new-export-amazon-dynamodb-table-data-to-data-lake-amazon-s3/

# 試してみる
まず、S3にデータをアップロードします。
対応しているファイルタイプは「json ,[Amazon Ion][link-1] ,csv」の三種類です。
今回は、[DynamoDBドキュメントのサンプルデータ][link-2]を参考に、いくつかjsonファイルを作成しました。
複数Itemを同一のjsonファイルに記載する方法に少しハマりました。カンマで区切らなくて良いようです。

<details>
<summary>jsonでの記載例</summary>

```sample01.json
{
	"Item": {
		"Id": {
			"N": "101"
		},
		"Title": {
			"S": "Book 101 Title"
		},
		"ISBN": {
			"S": "111-1111111111"
		},
		"Authors": {
			"L": [
				{
					"S": "Author1"
				}
			]
		},
		"Price": {
			"N": "2"
		},
		"Dimensions": {
			"S": "8.5 x 11.0 x 0.5"
		},
		"PageCount": {
			"N": "500"
		},
		"InPublication": {
			"BOOL": true
		},
		"ProductCategory": {
			"S": "Book"
		}
	}
}
{
	"Item": {
		"Id": {
			"N": "102"
		},
		"Title": {
			"S": "Book 102 Title"
		},
		"ISBN": {
			"S": "222-2222222222"
		},
		"Authors": {
			"L": [
				{
					"S": "Author1"
				},
				{
					"S": "Author2"
				}
			]
		},
		"Price": {
			"N": "20"
		},
		"Dimensions": {
			"S": "8.5 x 11.0 x 0.8"
		},
		"PageCount": {
			"N": "600"
		},
		"InPublication": {
			"BOOL": true
		},
		"ProductCategory": {
			"S": "Book"
		}
	}
}
{
	"Item": {
		"Id": {
			"N": "103"
		},
		"Title": {
			"S": "Book 103 Title"
		},
		"ISBN": {
			"S": "333-3333333333"
		},
		"Authors": {
			"L": [
				{
					"S": "Author1"
				},
				{
					"S": "Author2"
				}
			]
		},
		"Price": {
			"N": "2000"
		},
		"Dimensions": {
			"S": "8.5 x 11.0 x 1.5"
		},
		"PageCount": {
			"N": "600"
		},
		"InPublication": {
			"BOOL": false
		},
		"ProductCategory": {
			"S": "Book"
		}
	}
}
```

</details>

作成後、S3にアップロードします。

![image01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/cc8bcaa0-8087-02db-00e5-507a13ffa734.png)


マネコン上からインポートを行います。
既存のテーブルにインポートすることはできず、新規でテーブルを作成する必要がありそうです。
![image02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/bbbd2bf5-5bbe-3f0f-8db6-fd07fb96e2f7.png)

後は、テーブル名とパーティションキー(必要があればソートキーも)を入力し、インポートを実行します。
キャパシティーモード等々の設定はカスタマイズすることもできます。今回はデフォルトで実行しました。
![image03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/59e62189-9024-4016-8ffc-0a56ddd37ea3.png)

インポートジョブ完了後、確認するとテーブルが作成されており、データも入ってきていました。
![image04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/a55914a0-2a6a-668c-11ac-a0497e1500cf.png)

# まとめ
(新規テーブルの作成のみですが、)S3からDynamoDBへのインポートがすこぶる簡単になりました。
アカウント間でテーブルの移行を行いたい場合などに使えそうだと思います。

# 参考
https://aws.amazon.com/jp/blogs/database/amazon-dynamodb-can-now-import-amazon-s3-data-into-a-new-table/

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/S3DataImport.Requesting.html

<!---以下リンク--->
[link-1]:https://amzn.github.io/ion-docs/
[link-2]:https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/AppendixSampleTables.html#AppendixSampleData.ProductCatalog
スマホを変えたらAWSマネジメントコンソールに入れなくなった

# はじめに
おそらく5年ほど使い続けていたiphone7と突然お別れすることとなった。無限に再起動を繰り返し、充電もまともにできずバッテリー残量も3%から変わらない。いきなりだったので焦り、とりあえず写真/動画、LINEなどの重要どころのバックアップなど確認し、この際だからとその日のうちにiphone13に買い替えた。それから数週間後、AWSの学習でも久々にしようかとAWSマネジメントコンソールへログインしようとした時、MFA認証の設定を入れていたことを思い出した。仮想MFAデバイスとして、Google Authenticatorと紐づけて2要素認証をしていたため、IAMユーザの認証情報を入力後にMFAコードを聞かれる。
![スクリーンショット 2022-08-28 22.22.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/7c959f6e-b6d1-7cab-90e8-a40393999acc.png)
新しくスマホに入れたGoogle Authenticatorでは既存の設定はもちろん無く、MFAコードが発行されない。Google Authenticatorで機種変更前にセットアップキーを取得していればそれを入力することで、既存の設定を引き継げるみたいだが、そもそも昔に取得していたかどうかの記憶もない。

# 別の要素を使用したサインイン
上の画像の「MFAのトラブルシューティング」を押した後、「別の要素を使用したサインイン」に行くと次の画面になる。
![スクリーンショット 2022-08-28 22.37.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/44e75f69-7651-dbe6-1b55-8768439cc4be.png)
「確認Eメールの送信」を押すとrootユーザに紐づいたEメールアドレス宛にメールが送られてくるので、その内容に従うことで、サインインができる。
ところが今回、スマホを変えたことでrootユーザに紐づいていたEメールは使えなくなっていた。

# AWSサポート
いたしかたないのでWebフォームからAWSサポートに問い合わせ。
![スクリーンショット 2022-08-28 22.46.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/5129a695-0fea-f9af-565e-4aa7f60fbe6c.png)
![スクリーンショット 2022-08-28 22.46.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/4aa1522f-af20-5506-b064-8a18a86971a7.png)
しかし、AWSアカウントに紐づいているメールにアクセス不可のため、セキュリティ保護の観点からMFAのAWSサポートによる無効化はできなかった。

# AWS　CLI
幸いにもAWS CLIの設定をPCにて実施していたため、CLIから新規でIAMユーザを作成し、
AWSマネジメントコンソールにログインすることに成功。

# まとめ
スマホがおかしくなってもまずは深呼吸をし、もう少し冷静になるべきだったと反省。

以上、最後まで読んで頂きありがとうございました！
初心者　Flutter x MySQL8 に挑戦する 22 with mysql_client

# ListViewは遠い　

　exampleで、
- print.colAt(1)と書いてあれば
    - setStateで　　name = row.colAt(1)!と定義して
        - Text(name)と書けば、UIに名前を表示してくれる。

　exampleで　
- print(row.assoc())と書いてあるれば
    - consoleに全データがMapで表示される。

　よく見ると//print all rows as Map<*String,strig>ってコメントがついてる。
　よく似たのにrow.typedAssoc()というのもあって、こちらはどうやらMap<*String, dynamic>らしい。

 だからこれをどうにかして、ListViewにしたいんだがなあ。

　でもここまで来ていながら、「firestreからデータ取って、だあっとListViewに並べる」と同じことができない。まあ、あれは「できた」というより、「できているものを写した」だけだったのだから、当然といえば当然か。

　assocで検索すると、いろんなほかの言語の記事はいっぱい見つかるんだけれどね。　

## 作戦変更　

　そこで今日は、別方向から攻めることにしてみる。自分である程度理解できていることをする。 

- まずUIにTextFormFieldをつくる。
- そこに書き込まれた文字列を取得して、select文に組み込む。

　つまり、何を検索するか、をUI側から指定しようということ。一番簡単なのは、idを指定して、１つ拾う。だから　

```
 onChanged: (text) {
        selectedId = text;
        },
```

 こんな感じで文字列を取って、　

```
var result = await conn.execute(
"SELECT * FROM timeline WHERE id = $selectedId");

```
　こんなふうにセレクト文を書くと

![スクリーンショット 2022-08-31 21.04.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1646810/75b87300-fa4a-935e-f49a-bcfdbb3f5c54.png)

　やった〜行けるじゃないか。
　ちなみにこれは、年表の４行目、紀元前776年、記録上最初の古代オリンピック、というデータを拾っている。

 
## でも、その先もガンガン、というわけにはいかなかった。

 id以外のcolumnで取ろうとすると、そんなcolumnないよ、というエラーが出る。例えば国名のcolumnから中国のデータだけ拾ってください、とか、うまく動かない。なかなかもってイジワルである。いろんなcolumnで試したけど、id以外ではうまくいかなかった。残念。　

　明日も検索をがんばるか、それとも【追加】ページにもTextFormFieldつけてみようかな。

https://qiita.com/dongri727/items/14191b6c6e6dce23ac20

https://qiita.com/dongri727/items/691c6911f825262786b3
Nuxt Bridgeでカスタムレイアウトを使用する方法

Nuxt2のプロジェクトを[Nuxt Bridge](https://v3.nuxtjs.org/bridge/)へ移行した際にlayoutファイルを切り替える方法が見当たらなかったので備忘として書きます。

## カスタムレイアウトについて

カスタムレイアウト（layoutファイルを切り替える）とはNuxt2の↓のことです。

https://nuxtjs.org/ja/docs/directory-structure/layouts/#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88

要はプロジェクトで複数のlayoutファイルを用意して特定のページで特定のlaytoutファイルを使用すること。

## Nuxt Bridgeでカスタムレイアウトを使う

Nuxt3であれば`<script setup>`内で`definePageMeta`を使うことでlaytoutファイルを指定できます。

https://v3.nuxtjs.org/api/utils/define-page-meta/

ただし、Nuxt Bridgeの場合悲しいことに`definePageMeta`がサポートされておらず使えません。。

そのため、Nuxt Bridgeでは`<script setup>`とは別に`<script>`ブロックを用意しlayoutファイルを指定する必要があります。

```vue
<script lang="ts">
export default {
  layout: "customLayout"
}
</script>

<script setup lang="ts">
...
</script>
```

↑の方法でdefault以外のlaytoutファイルを指定できます。冗長気味ですがNuxt Bridgeではこうするほかないみたいです。

だれかの役に立てば幸いです。
laravelのORMを使うときにDBのtimestampを保存する方法

こんにちは。[virapture株式会社](https://virapture.com)でCEOしながら[ラグナロク株式会社](https://ragna-rock.com)でもCKOとして働いている[@mogmet](https://twitter.com/mogmet)です。

最後に、[ワンナイト人狼オンライン](https://online.1nite-jinro.com/link/blog)というゲームを作ってます！よかったら遊んでね！

最近忙しぎて全然更新できてないのでさらっとトラブルシューティングメモを残します。

今回はlaravelでMySQLのcreate/updateなどをするときに、DBサーバ側ののtimestampをレコードに保存する方法を紹介します。

## 結論

結論から言うと答えはここにありました。

https://zenn.dev/ad5/articles/5583b0e65b9d2140306b

そして答えのコード。

```php
$attributes['updated_at'] = DB::raw('CURRENT_TIMESTAMP');
```

意外とサクッと出てこなったのでメモです。

## 背景

よくある実装だと現在時刻を入れるのに

```php
$attributes['updated_at'] = Carbon::Now();
```
みたいなのをよく見かけますが、これをやってしまうと実行するサーバ側のtimestampが入ってしまいます。
これは実行側の時間に依存しておりDBとの整合性が取れなくなる可能性があるので非常に危険です。

そのためデータのアクションを起こしたという時刻を入れる場合はDBの時間を入れるのが慣例なのですが、laravelでのやりかたが全然ググっても出なかったのでメモしました。

## まとめ

DBの時間を入れるときは **DB::raw('CURRENT_TIMESTAMP')** を使おう！

最後に、[ワンナイト人狼オンライン](https://online.1nite-jinro.com/link/blog)というゲームを作ってます！よかったら遊んでね！

https://online.1nite-jinro.com/link/blog

他にも[Camecon](https://camecon.me/)や[Offcha](https://offcha.com/)、問い合わせ対応が簡単にできる[CSmart](https://csmart.jp/lp)といったサービスも作ってるのでよかったら使ってね！

https://camecon.me/

https://offcha.com/

https://csmart.jp/lp

また、チームビルディングや技術顧問、Firebaseの設計やアドバイスといったお話も受け付けてますので御用の方は弊社までお問い合わせください。

https://virapture.com/

ラグナロクでもエンジニアやデザイナーのメンバーを募集しています！！楽しくぶち上げたい人はぜひお話ししましょう！！

https://ragna-rock.com
JavaScriptでUSBカメラを使って撮影してみた

# はじめに
PCに接続されているUSBカメラを起動し、JavaScriptでキャプチャしたものをキャンバス上に描画する処理を書いてみました。
次のhtmlコードをブラウザ上で動作させたら、最初にカメラの許可を求めてくるので、許可してください。

# コード
```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>カメラ制御</title>
</head>
    <body>
        <div><video id="video-area"></video></div>
        <div><button onclick="captureImage()">キャプチャ</button></div>
        <canvas id="capture-image"></canvas>

        <script>
            const videoArea = document.getElementById('video-area');

            function captureImage() {
                let canvas = document.getElementById('capture-image');
                let cavas2dContext = canvas.getContext('2d');

                canvas.width  = videoArea.videoWidth;
                canvas.height = videoArea.videoHeight;
                cavas2dContext.drawImage(videoArea, 0, 0);
            }

            document.addEventListener('DOMContentLoaded', function() {
                navigator.mediaDevices.getUserMedia({
                    video: true,
                    audio: false
                }).then(stream => {
                    videoArea.srcObject = stream;
                    videoArea.play()
                }).catch(e => {
                    console.log(e)
                });
            });
        </script>
    </body>
</html>
```

正常に動作すれば以下のように、
緑色の四角に起動したカメラの様子が表示され、青色の四角にキャプチャしたものが描画されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309633/9cbe9eb2-7e74-7c08-b42c-b238df3d1c24.png)
PythonでTwitter自動で動かし懸賞を当てよう

<h1>早速コードを書く前に</h1>
<p>twitterをpythonで操作するにはTwitterAPIを使用する。TwitterAPIを使うには利用申請をしないといけないのですが、ここでは省略します。</p>
<p>詳しくは<a href="https://www.itti.jp/web-direction/how-to-apply-for-twitter-api/">こちら</a></p><p>のページがわかりやすいので、見ながら申請してみてください。最近は申請がゆるいみたいなのですぐに使用できるようになると思います。</p>

<h1>TwitterAPIの申請が通ったら</h1>
<p>申請でも使った<a href="https://developer.twitter.com/en/apps/">こちら</a></p>
<p>にアクセスしTwitterAPIを使うのに必要な各種キーを取得しましょう</p>

![スクリーンショット 2022-08-06 3.22.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778130/4a14abc9-fcad-2c7d-107b-7803a8f6a049.png)
<p>写真内の+AddAppから適当にAppsを作成し、鍵のマークをクリック</p>

![スクリーンショット 2022-08-06 3.22.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778130/835b6d58-ad7c-0da7-20dd-19fab35db6a3.png)
<p>すると画面遷移し、このような画面に来る。この画面のRegenerateを押すと各種キーを取得できます。取得したらどこか適当にtxtファイルにでも保存でもしておきましょう。これで準備は完璧です。</p>

<h1>ついにコードを書く</h1>
<p>申請でも使った<a href="https://developer.twitter.com/en/apps/">こちら</a></p>
<p>にアクセスしTwitterAPIを使うのに必要な各種キーを取得しましょう</p>












<p></p>
正規表現メモ(Ruby)

この記事は正規表現を利用する機会が少なく、毎回必要になった時に調べ直している筆者がその手間を省くために書いたメモです。

# 正規表現検証ツール(Ruby)
[Rubular](https://rubular.com/)

# (筆者が)よく使う例
|正規表現|マッチ|メモ|
|:---|:---|:--|
|/\d+/ または /[0-9]+/|この前餃子を`10`個たのんで、`3`個食べて、`7`個は友達にあげました|数字の羅列にマッチ|
|/\d{3}-\d{4}/|郵便番号は`123-4567`です|郵便番号にマッチする|
|/\d{4}年\d{1,2}月\d{1,2}日/|君の誕生日は`2022年3月3日`だったんだね|日付にマッチ|
|/\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i|私のメールアドレスは`hoge.fizz@example.com`です|メールアドレスにマッチ|

# 正規表現で利用する特殊文字
|特殊記号|意味|使用例|使用例のマッチ|
|:---|:---|:--|:--|
|[]|カッコ内で指定した文字のどれかに該当したらマッチ|/[abc]/|uy`a`jk`b`lk`c`
|[^]|カッコ内で指定した文字のどれにも該当しなかったらマッチ|/[^abc]/|`uy`a`jk`b`lk`c
|-|[0-5]のように使用して0〜5までの数字だったらマッチするように設定|/[A-z0-3]+/|`abc`7`1`8`def`9`2`6`ghi`
|.|なんでも1文字とマッチ|/hoge.+hoge/|foo`hogebuzzfizzhoge`foo
|?|パターンが1回以下発生した場合にマッチ|/a\d?a/|bbbb`a1a`cccc`aa`dddda12a
|*|パターンが0回以上発生した場合にマッチ|/a\d*a/|bbbb`a1a`cccc`aa`dddd`a12a`
|+|パターンが1回以上発生した場合にマッチ|/a\d+a/|bbbb`a1a`ccccaadddd`a12a`
|{}|パターンXX回発生した場合にマッチ|/a\d{3}a/|bbbba1accccaadddd`a123a`
|{,}|パターンXX回以上yy以下発生した場合にマッチ|/a\d{2,3}a/|bbbb`a12a`ccccaadddd`a123a`
|\||ORでマッチ条件をつなぐ|/a\d{3}a\|a[A-z]{3}a/|`a123a`bbb`aabca`ccc
|^|マッチパターンを文字列の先頭に絞る|/^aa/|`aa`aaaaaaaaaaaaaaaa
|$|マッチパターンを文字列の末尾に絞る|/aa$/|aaaaaaaaaaaaaaaa`aa`
|\ |特殊記号をエスケープさせたり、\dなどの記述で数字を表すことができる|/\\[\d\]/|`[1]`[a]`[9]`[11]
Azure ubuntu 18.04 で systemd の DNS解析エラー

Azure 関連で、以下の対応に追われる感じの1日でした。

## 事象

Azure VM で **ubuntu 18.04 systemd** の特定バージョン?? を使用してると、アウトバウンド処理で Errorが発生する障害となりました、、

運用システムで20台以上が障害対象になった形です。

**事象の参考**
[https://status.azure.com/ja-jp/status](https://status.azure.com/ja-jp/status)


## 対応
1. Azure VMサーバ 再起動
2. VMサーバにアクセスして、スクリプトを手動起動する (17台)


## 今後
「**Ansible** で自動化」

単純に1台とかならよいですが、運用システムですし復旧に時間をかけすぎるのも良くないかと。お客様にかかる信用問題ですし、迅速な復旧対応が必要です。

また、手動で**コマンドの打ち間違い**とかも単純に発生しそうです、、、
最後の方は、集中力も切れますしね。

関わっているプロジェクトでは、**テストコード**・**CI/CD ツール** も取り入れることができてないです。なので、改修コスト・メンテナンスもテストコードがないことで調査コストが高く、着手も難しい現状です!

課題は山積みですが、良い経験もできてるので引き続き進めていきます!

ありがとうございました!!!
初めてQuittaを使うため、試しに投稿してみる

# はじめに
主に、自分のメモのためにQuiitaを使っていこうかと思い投稿する。

## 1.見出し
## 見出し
### 見出し
＃を増やすと小さくなっていくらしい。

## 2.リスト
- 文頭に「*」「+」「-」のいずれかを
- 入れると順序なしリストになる
* 途中で記号を変えると別のリストと
* 認識されて空白ができるみたい
+ aaa
+ aaaa

+ リストの途中でエディタ上の改行を入れると
+ リストの間隔が大きくなる

1. 文頭に「数字.」を入れると
2. 番号付きリストになる。
2. エディタでエンターを押すと
2. 自動的に同じ数字が入っているが
2. プレビューでは1づつ増えていってる

## 3.コード挿入
```
「```」でコードを囲うとコードを入れることができる
class Main{
    function(){}
}
```

## 4.テーブル
| \|\|を | 使うと | テーブル |
| :-- | :-: | --: |
| ができる | らしい |  |
| \|を表の|中で使うには|\を前につける|
|「:--」|で表の中の|位置を指定する|

| 「axb」 | (a,bは数字) | と入力すると |
|:-:|:-:|:-:|
|  自動で | 表を  | 作成する  |
|  ことができる | xは  | 小文字の  |
|  エックス |   |   |

## 5.水平線
「***」や「---」で水平線が引ける。
***

## 6.リンク
[[リンクテキスト]（リンク先アドレス）]()

## 7.画像挿入
・タイトルありの画像を埋め込む
![\!\[代替テキスト\](画像のURL "画像タイトル")](画像のURL "画像タイトル")
と書く。

・タイトル無しの画像を埋め込む
![\!\[代替テキスト\](画像のURL)](画像のURL)
と書く。

・ドラッグ＆ドロップ
基本これでよさそう。自動で入力される。
![siteid-reverse-6044901aace6435306ebd1fac6b7858c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821619/979cb5bb-6ba3-75db-eed7-ba9fe6d3d603.png)

## 8.数式の挿入
コードブロックの言語指定に "math" を指定することでTeX記法を用いて数式を記述することができる。
```math
y = a + b
```
また、「\\$」で数式を挟むことで行中に数式(例)$a = b + c$を入れることができる。

# 参考
[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)
[Qiita Markdown 書き方 まとめ](https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1)
[Qiita 初心者向け書き方まとめ](https://qiita.com/ryu3/items/27e77aa35e44f8926933)
ASP.NET Core のWeb APIが返すJSONのキー名をsnake caseにしたい

## はじめに

ASP.NET Core 6のWeb APIでJSONデータを返す際に、そのキー名をデフォルトのcamelCaseではなく、snake_case(スネークケース)にする方法を説明します。

#### 環境

.NET 6
ASP.NET Core 6.0
C# 10.0

## JsonNamingPolicyを継承したクラスを定義

キー名を変更するConvertNameメソッドを定義します。

```cs
using System;
using System.Linq;
using System.Text.Json;
using System.Text;

namespace JsonSerializeSample.Utils;

public class SnakeJsonNamingPolicy : JsonNamingPolicy
{
    // ちょっと手抜き SNSAccountsのような名前には対応していない.
    public override string ConvertName(string name)
    {
        var snakeseq = name.Select((x, i) => i > 0 && char.IsUpper(x) ? "_" + x.ToString() : x.ToString());
        return string.Concat(snakeseq).ToLower();
    }
}
```

## Program.csでJsonの命名ポリシーを設定

```cs
using System.Text.Json;
using JsonSerializeSample.Utils;
using Microsoft.Extensions.Options;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        var snakePolicy = new SnakeJsonNamingPolicy();
        options.JsonSerializerOptions.DictionaryKeyPolicy = snakePolicy;
        options.JsonSerializerOptions.PropertyNamingPolicy = snakePolicy;
    });

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
```

` .AddJsonOptions(...)` のところでJsonの命名ポリシーを登録しています。

これでAPIから返るJSONのキー名がsnake_caseになります。

## APIを定義してみる

では、APIを定義してみます。

ここではPersonクラスの固定的なオブジェクトを返すだけの単純なものとします。

```cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;


namespace JsonSerializeSample.Controllers;

[ApiController]
[Route("[controller]")]
public class PersonController : ControllerBase
{
    [HttpGet]
    public Person Get()
    {
        return new Person
        {
            FirstName = "ひでゆき",
            LastName = "いでい",
            EmailAddress = "hideyuki.i@example.com",
        };
    }
}

public class Person
{
    public string FirstName { get; set; } = string.Empty;
    public string LastName { get; set; } = string.Empty;
    public string EmailAddress { get; set; } = string.Empty;
}
```

これでOKです。

## 実行してみる

実行してみます。デフォルトでSwaggerが利用できるのは便利です。

![スクリーンショット 2022-08-30 21.15.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29415/a136ad23-3997-2e09-0a3d-abd1ede2a9e9.png)

Personの行をクリックして、「try it out」ボタンを押し、Executeボタンをクリックすれば、`Person API`を呼び出せます。

![スクリーンショット 2022-08-30 21.20.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29415/98111735-276b-d2b1-a901-396d3b46327b.png)

ちゃんと、`first_name`, `last_name`, `email_address` をsnake_caseになっていることを確認できました。

なお、この記事ではMacで動かしてますが、Windowsでもコード変更なしでそのまま動きます。.NET 6は本当に便利です。
【Kotlin】Nullableな変数と上手く付き合ってみた

# はじめに

皆さん、ごきげんよう！れぶです！

今回の記事では、**Kotlinのnull許容型の変数（以降、Nullableな変数とする）からプロパティーやメソッドを安全に呼び出す方法**について列挙していきます。

自分はJava出身で、Kotlinの`Null Safety`周りはJavaにはない概念だったのでこの記事で整理します。自分と同様にJavaからKotlinへ移行中だけど、Nullableな変数の扱い方がイマイチ分からない方に特に参考になればと思います。

それでは、参りましょう！！

# Nullableな変数へアクセスする方法

今回は以下のコードを例とします。

```kotlin
class Person(val name:String) {

    fun hello() = println("Hello!I'm $name.")
}

fun main() {
	val person: Person? = Person("Tom")
    person.hello()
}
```

ただ、このままでは正しく動作しません。**Nullableな変数はnullが代入されている可能性もあるため、直接アクセスするとコンパイラーになります**。以下の４つの方法（!!演算子は除外）で適切にNullableな変数へアクセスしていきます。

## 1. 条件式

```kotlin
fun main() {
	val person: Person? = Person("Tom")
    if(person != null) {
        person.hello() //Hello!I'm Tom.
    }

    val person2: Person? = null
    if(person2 != null) {
        person2.hello() //処理なし
    }
}
```
Javaでもよくやるif文を使ったnullチェックです。

if文のブロック内ではnullでないことが保証されているため、アクセスできます。ただし、`val`で宣言した変数に限り、適切に機能します。

## 2. セーフコール演算子

```kotlin
fun main() {
	val person: Person? = Person("Tom")
    person?.hello() //Hello!I'm Tom.

    val person2: Person? = null
    person2?.hello() //処理なし
}
```
変数にセーフコール演算子`?.`を付けるやり方です。

演算子の左側がnullでない場合のみ、プロパティやメソッドを呼び出します。上記の例では`person`はnullでないため、`hello()`を呼び出すことができますが、`person2`はnullであるため、処理が無視されます。

**先程の条件式のやり方を1行で表せる**ので便利です。

## 3. エルビス演算子

```kotlin
fun main() {
	val person: Person? = Person("Tom")
    person?.hello() ?: println("nullだお") //Hello!I'm Tom.
    
	val person2: Person? = null
    person2?.hello() ?: println("nullだお") //nullだお
}
```

変数にエルビス演算子`?:`を付けるやり方です。
※上記は先程のセーフコール演算子と組み合わせています。

変数の値がnullの場合、エルビス演算子の右側の値を返したり、処理します。上記の例では`person`はnullでないため、セーフコール演算子により`hello()`を呼び出します。また`person2`はnullであるため、エルビス演算子の右側の`println()`の処理を行います。

**変数の値がnullの場合に、nullを返すのではなく、特定の値を返したい場合に便利です**。

## 4. スコープ関数let✖️セーフコール演算子

```kotlin
fun main() {
	val person: Person? = Person("Tom")
    person?.let{it.hello()} //Hello!I'm Tom.

    val person2: Person? = null
    person2?.let{it.hello()} //処理なし
```
【変数＋セーフコール演算子】に、スコープ関数`let`を呼び出すやり方です。
※上記の場合だとスコープ関数runを使う方がよく見かけるかもですが。

変数がnullでない場合のみ、セーフコール演算子によりラムダ式の処理を実行します。上記の例では、`person`はnullでないため、ラムダ式で`hello()`を実行します。`person2`はnullであるため、処理が無視されます。

**変数の値を加工したり、複雑な処理(条件文やループ処理など)をしたい場合に便利です**。

# おわりに

今回は、KotlinでNullableな変数への適切なアクセス方法4つを記しました。

| アクセス方法 | 特徴 |
|:--|:--|
|  条件式 |  Javaでお馴染み |
| セーフコール演算子 |  オーソドックス |
| エルビス演算子  | 変数がnullの場合に特定の値を返したい時に有効  |
| スコープ関数let✖️セーフコール演算子 | 変数を使って複雑な処理をしたい時に有効  |

ただ、**KotlinではNull Safetyにより、変数にnullを代入することを基本禁止している**ことが前提にはなりますね。

この記事が参考になると光栄です。以上です。ありがとうございました！


# 参考サイト
* [Null safety](https://kotlinlang.org/docs/null-safety.html)
* [【Kotlin練習問題】Null許容型（Nullable）](https://codelabsjp.net/kotlin-practice-nullabletypes/)
* [JavaプログラマがKotlinでつまづきがちなところ](https://qiita.com/koher/items/d9411a00986f14683a3f#null-safety)
* [[Kotlin] null安全とは？ null許容型との付き合い方](https://pouhon.net/kotlin-null/1060/)
* [Kotlin Null Safetyについて知ろう](https://tech.pjin.jp/blog/2017/04/10/kotlin_null_safety/)
* [Kotlinの関数letの使い方を現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/19796)
PowerAutomate: Parent Message ID (スレッドの親 ID) が取得出来るようになった。⇒ For a selected message でスレッド内返信が可能に

# 背景
Teams の Message Details (メッセージの詳細）を取得する際
- 返信したいメッセージID

ではなく、
- 返信したいメッセージIDの親のメッセージID（スレッドの最初の投稿メッセージID）

が必要です。

以前は 親のメッセージID (Parent Message ID) を取得することが出来なかったはずなんだけど、いつの間にか出来るようになってましたってお話

[Get Message Details](https://docs.microsoft.com/en-us/connectors/teams/#get-message-details)
[【日本語版】⇒　メッセージ詳細を取得する](https://docs.microsoft.com/ja-jp/connectors/teams/#%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E8%A9%B3%E7%B4%B0%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B)

以下で指定する ID です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/de6a8827-03f4-9e26-a4ab-80e609c46ec9.png)


# 取れるもの
元々困っていた、For a selected message トリガーと、取得アクション自体での結果を例示

Parent Message ID という名前ではなく、Reply To ID で存在。

## トリガー: For a selected message
[For a selected message (V2)](https://docs.microsoft.com/en-us/connectors/teams/#for-a-selected-message-(v2))
[【日本語版】⇒　選択されたメッセージに対して (V2)](https://docs.microsoft.com/ja-jp/connectors/teams/#%E9%81%B8%E6%8A%9E%E3%81%95%E3%82%8C%E3%81%9F%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6-(v2))

```json: Parent Message ID の取得
@{triggerBody()?['teamsFlowRunContext']?['messagePayload']?['replyToId']}
```

![2022-08-31_14h59_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/ef4a8325-271d-e44c-06b8-06b83ebe7ff0.png)

## アクション: Get Message Details 自身からも取得出来ます
[Get Message Details](https://docs.microsoft.com/en-us/connectors/teams/#get-message-details)
[【日本語版】⇒　メッセージ詳細を取得する](https://docs.microsoft.com/ja-jp/connectors/teams/#%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E8%A9%B3%E7%B4%B0%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B)

```json: Parent Message ID の取得
@{outputs('Get_message_details')?['body/replyToId']}@{triggerBody()?['teamsFlowRunContext']?['messagePayload']?['subject']}
```

![2022-08-31_15h49_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/b14fdc92-eac5-9e75-52eb-0e62026f5cf5.png)


# ドキュメント
以下記載なので、不明

> Returns
> The outputs of this operation are dynamic.

![2022-08-31_13h45_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/a086f965-ef48-3d5e-0c43-0b86364c1e6a.png)

https://docs.microsoft.com/ja-jp/connectors/teams/#%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E8%A9%B3%E7%B4%B0%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B

![2022-08-31_13h46_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/6256ba0e-fbc4-bea7-be30-fd100db3e0db.png)

https://docs.microsoft.com/en-us/connectors/teams/#get-message-details

# あとがき
これで、For a selected message を使って、スレッド内返信が出来るようになりました
poetryのバージョンを指定してインストールする

## はじめに
Poetry 1.2.0が本日(2022/8/31)リリースされました。筆者の環境ではDocker上などでインストールエラーが発生するようになったので1.1を指定してインストールする方法についてまとめます。

## How to
ローカルでのインストールは以下のようになります。`POETRY_VERSION`はInstallしたいバージョンに適宜変更してください。

```bash
# この辺は　.bashrc系に書くと良さそう
export POETRY_HOME="/opt/poetry"
export POETRY_VERSION=1.1.14
export PATH="$POETRY_HOME/bin::$PATH" 
curl -sSL https://install.python-poetry.org | python3 -
```
Dockerで書く場合は以下のような感じです。

```dockerfile
ENV POETRY_HOME="/opt/poetry" \
    POETRY_VERSION=1.1.14
ENV PATH="$POETRY_HOME/bin::$PATH"
RUN curl -sSL https://install.python-poetry.org | python3 -
```

ちなみに本記事は以下のレポジトリのDockerfileと[公式ドキュメントのインストール方法](https://python-poetry.org/docs/#installing-with-the-official-installer)を参考にしています。docker上でのPoetryの書き方かかなり詳しく書かれており参考になります。

https://github.com/michaeloliverx/python-poetry-docker-example/blob/master/docker/Dockerfile
GitHub Permissin denied 公開鍵

# 8/31
- React-Admin authProviderにほんの少しだけ突っ込んだ。　用意されてる認証方法もあるし、もちろんカスタマイズもできるみたい。
　https://marmelab.com/react-admin/Authentication.html
- Githubに一応あげた。
　認証でSSHを始めて使ってみた。結構楽。
　https://qiita.com/takapon21/items/13f00cb2e48d8c1cc115
- httpOnlyとか。
　https://qiita.com/Kohei-Sato-1221/items/80ff7a0bba6ac9128f56
献立アプリを作ってみた~簡単に紹介~

最近、母親が作るマカロニサラダにはまっています。
何かおいしいんですよね。。
# きっかけ
今日の晩御飯のときに冷蔵庫の中見て、何作ろーっていつもなります。
その時に、決めてくれるアプリがあると考える時間が無くなり早くご飯食べれるじゃん！と思いました。
今回は、簡単に作ってみました。

# Dataverse
追加するのは2つです。
| 列名 | データの種類 |
|:-:|:-:|
| 料理名 | テキスト |
| 材料 | テキスト |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404009/cf6dd752-3f43-db54-893a-e5a1cd20f523.png)

# 画面
作成する画面は3つです。
- 検索画面
- 材料を確認する画面
- 料理追加画面

これに加えて私は、2つ追加しました。(ここは私が楽しくなり、自己満足で追加しています。)

- 考えてるよーみたいにくるくるしている画面
- タイトルみたいな画面
## 画面1.タイトルみたいな画面
新しく料理を追加する画面と何を作るか検索する画面へ移動したいので、Navigate関数を使用し移動するよう設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404009/116f14cc-d105-0b07-834e-e289a69abc04.png)

## 画面2.検索画面
1.左上の矢印アイコンで前の画面へ戻れるように、Navigate関数を使用し移動するよう設定します。
2.材料を記載し検索をしたいので、今日の献立をボタンにし、ボタンに上で記載した材料をSearch関数を使用しDataverseのテーブルの材料列から検索をして、コレクションに追加をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404009/1d17e1f4-f877-3168-ff43-09daf1c54452.png)

## 画面3.考えてるよーみたいにくるくるしている画面
1.左上の矢印アイコンで前の画面へ戻れるように、Navigate関数を使用し移動するよう設定します。
2.検索してるよーって思わせたいので、ルーレットの動画を挿入。
3.ルーレットを止めたら、上に料理名を表示させる。
4.料理名を表示させたら、右側の矢印アイコンで材料を確認する画面へ、Navigate関数を使用し移動するよう設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404009/a20fd001-f703-24bc-0839-6e684ca4ebb3.png)

## 画面4.材料を確認する画面
1.左上の矢印アイコンで前の画面へ戻れるように、Navigate関数を使用し移動するよう設定します。
2.右上の更新アイコンで一番最初の画面へ戻れるように、Navigate関数を使用し移動するよう設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404009/410a208a-dccb-b5fa-a3f1-59d7ec378296.png)

## 画面5.料理追加画面
1.左上の矢印アイコンで前の画面へ戻れるように、Navigate関数を使用し移動するよう設定します。
2.料理名と材料名をテーブルに追加するために、レパートリー追加をボタンにし、ボタンにテーブルへ追加するよう設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404009/1c4b59c8-0454-1eb8-8672-37fcf3f9b430.png)


# 最後
私はこのアプリに好きな画像を入れて使用することを前提に作成したので、レイアウトとか「え…」となっていますが、レイアウトを考えるのも楽しいですよね。
このアプリを作ったおかげで、何を作ろうかなって考える時間が減ったり、買い物をするときに、何作ろうとうろうろすることもなくなりました。
次は、どんな関数を使用して作成したのかを書いた記事を投稿します。
VSCodeのショートカットキー一覧

## はじめに
VSCodeでよく使うショートカットキーを備忘録としてまとめていきます。

## 環境

OS: macOS Monterey Version 12.3
VSCode: 1.70.0

## エディタ関連

`command` + `N` : ファイルの新規作成

`command` + `S` : ファイルの保存　※設定により自動保存ができる

`command` + `W` : ファイルを閉じる

`command` + `O` : ファイルを開く

`command` + `Z` : 元に戻す

`shift` + `command` + `Z` : やり直し

`command` + `X` : 切り取り

`command` + `C` : コピー

`command` + `V` : 貼り付け

`command` + `/` : コメントアウト

`shift` + `option` + `↓` : コードを複製

`command` + `P` : 検索

`command` + `B` : 一覧の表示/非表示

`command` + `Q` : 終了

## 参考記事

- [【macOS】VSCodeのエディタ、ターミナルに関するショートカットキー](https://qiita.com/Utsubo/items/c8cd6f4b02e19d1db1ed)

- ゼロからわかる Ruby 超入門　五十嵐邦明、松岡浩平[著]
[python] 定義済みEnumから動的にEnumを生成する

# やりたいこと

定義済みのEnumから指定したリストで動的にEnumを生成する。

## 実装例

```python
from enum import Enum

class Color(Enum):
    red = "赤"
    blue = "青"
    yellow = "黄"
    purple = "紫"

    @classmethod
    def generate_enum(cls, target_list: list[str]):
        result = {e.name: e.value for e in cls if e.name in target_list}
        return Enum(__class__.__name__, result)

```

## 使用例

```python
target_list = ["red", "purple"]
results = Color.generate_enum(target_list)
# results["red"], results("赤"), results["purple"], results("紫")が指定可能
```

## 説明

クラスメソッド`generate_enum()`で当該処理を担当。
自身の列挙値を一つずつ取り出し、引数で渡されたリストに存在しているか確認。
存在していれば`{name: value}`で格納。
格納値でEnumを再生成して返却。


## 参考記事

[Python: Enumクラスを拡張する](https://zenn.dev/yuji38kwmt/articles/63cda54021ecf3)
pandasのpd.TimestampとUnixTimestampの相互変換

`timestamp.astype(np.int64)` と `pd.to_datetime(unix_timestamp_index)` で相互変換できる。


# データ準備

```python
date_index = pd.date_range(start="2022-08-31 10:00:00", end="2022-08-31 11:00:00", freq="1S")
```

```
DatetimeIndex(['2022-08-31 10:00:00', '2022-08-31 10:00:01',
               '2022-08-31 10:00:02', '2022-08-31 10:00:03',
               '2022-08-31 10:00:04', '2022-08-31 10:00:05',
               '2022-08-31 10:00:06', '2022-08-31 10:00:07',
               '2022-08-31 10:00:08', '2022-08-31 10:00:09',
               ...
               '2022-08-31 10:59:51', '2022-08-31 10:59:52',
               '2022-08-31 10:59:53', '2022-08-31 10:59:54',
               '2022-08-31 10:59:55', '2022-08-31 10:59:56',
               '2022-08-31 10:59:57', '2022-08-31 10:59:58',
               '2022-08-31 10:59:59', '2022-08-31 11:00:00'],
              dtype='datetime64[ns]', length=3601, freq='S')
```

# pd.Timestamp -> unix timestamp

```python
unix_timestamp_index = date_index.astype(np.int64)
```

```
Int64Index([1661940000000000000, 1661940001000000000, 1661940002000000000,
            1661940003000000000, 1661940004000000000, 1661940005000000000,
            1661940006000000000, 1661940007000000000, 1661940008000000000,
            1661940009000000000,
            ...
            1661943591000000000, 1661943592000000000, 1661943593000000000,
            1661943594000000000, 1661943595000000000, 1661943596000000000,
            1661943597000000000, 1661943598000000000, 1661943599000000000,
            1661943600000000000],
           dtype='int64', length=3601)
```

# unix timestamp -> pd.Timestamp

```python
date_time_reconstruction = pd.to_datetime(unix_timestamp_index)
```

```
DatetimeIndex(['2022-08-31 10:00:00', '2022-08-31 10:00:01',
               '2022-08-31 10:00:02', '2022-08-31 10:00:03',
               '2022-08-31 10:00:04', '2022-08-31 10:00:05',
               '2022-08-31 10:00:06', '2022-08-31 10:00:07',
               '2022-08-31 10:00:08', '2022-08-31 10:00:09',
               ...
               '2022-08-31 10:59:51', '2022-08-31 10:59:52',
               '2022-08-31 10:59:53', '2022-08-31 10:59:54',
               '2022-08-31 10:59:55', '2022-08-31 10:59:56',
               '2022-08-31 10:59:57', '2022-08-31 10:59:58',
               '2022-08-31 10:59:59', '2022-08-31 11:00:00'],
              dtype='datetime64[ns]', length=3601, freq=None)
```
良いマネージャーは乳母である (「アドレナリンジャンキー」より)

>良いマネジャーは、部下の能力を理解している。責任を割り当て、人材のスキルと仕事の性質がベストの組み合わせとなるよう計画する。ここまではわかりきったことだ。なかには、さらに一歩先を行くマネジャーもいる。人びとが最大限に能力を発揮し、さらに能力を高められるような労働環境を、技術面と社会面の双方で整える。部下には仕事に必要なツールが行き届くようにする。部下同士の質問や議論をうながし、チームの一人ひとりに適した課題を与え、必要なときには批判し、楽しく仕事ができる職場をつくり、ものごとがスムーズに運ぶよう必要な修正を加える。ひと言でいうと、良いマネジャーは、乳母が子供を育てるように部下を育てる。

トム デマルコ,ピーター フルシュカ,ティム リスター,スティーブ マクメナミン,ジェームズ ロバートソン,スザンヌ ロバートソン. アドレナリンジャンキー プロジェクトの現在と未来を映す86パターン (Japanese Edition) (Kindle の位置No.495-502). Kindle 版. 

<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura

<!-- Update From Qiita API -->
GoでGormを利用してmigrateしたがDBの制約が反映されない

# はじめに

Goのテストを書いていた時にメールアドレスが一致したらエラーを返すテストを書いていました
なのになぜか200の成功ステータスが返ってくるので調べたところレコードが作成されていました
Gormで設定したユニークが効いていないようです

# 問題

以下のようなコードでテーブル定義を書いていました

```go:user.go
Email    string `gorm:"size:256 , not null , unique" json:"email"`
```

しかしこれでは`non nul`や`unique`の制限がついていませんでした

MySQLで`desc users;`を確認してもやはり制約はついていません

# 解決方法

以下のように変更することで解決しました

```go:user.go
Email    string `gorm:"size:256;not null;unique" json:"email"`
```

なんとなくで書いていたようです
テストを書くまで気づきませんでした

# おわりに

公式ドキュメントをしっかりみるようにすれば解決することがほとんどです

# 参考
https://stackoverflow.com/questions/72268177/how-to-write-a-migration-to-add-not-null-in-table-field-golang
TeamsのPrivateチャネルにPower Automateでリマインド投稿をする

# 概要

会社のTeamsで毎月ある提出物のリマインド連絡を自動化したく、Power Automateで試みるもPrivateチャネルだと少し工夫が必要だったので備忘録として書いておきます。

# 手順

基本はこちらの記事を参考に進めさせて頂きました。

https://qiita.com/TakahiRoyte/items/a7c458dc18cd0dcc80c6

## 工夫が必要だった点

### メッセージIDの取得

![スクリーンショット 2022-08-31 113838.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148042/88f33d39-72c1-7e50-3f60-95c80cb61527.png)

privateチャネルだと「リンクを取得」がメニューに出てこないので、「検証」を表示してコードから読み取っていきます。

目的のメッセージの上で右クリックして、「検証」からコードを開き、コードを少し上に遡るとメッセージ全体を囲っているdiv要素に`<div id='mXXXXXXXXXXXXX'`という要素があるので、mを除くこの13桁の数字をメッセージIDとして利用します。

### 投稿者の種別

これで行けそうに思うのですがprivateチャネルだとbotからの投稿権限が無いようで、更に投稿者の設定が必要でした。
下記画像の通り「User」を選ぶことでこのフロー作成者のアカウントが利用され、無事Power Automateから自動投稿をすることができました。
（フロー作成後テストができるので一度流して確認することをおすすめします）

![スクリーンショット 2022-08-31 115026.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148042/046791bb-cce4-3c88-09a3-d7f28b6cf2c9.png)

# 備考
「毎月」実行の場合Recurrenceの開始時刻にある末尾の「Z」を消さないとUTC扱いになるようで、注意が必要です...

https://qiita.com/RYO-4947123/items/da2f30617e585ab312b0
GoのテストでJSONのレスポンスから値を取得して比較したい

# はじめに

Goのテストを書くときに、レスポンスのBodyの内容を比較する際に以下のようなコードを書いていました

```
assert.Equal(t, w.Body.String(), "{\"msg\":\"pong\"}")
```

しかし、この中の要素を取得してテストを書く機会が訪れたのでまとめます

# 問題

` bcrypt`を利用して、レスポンスのBodyにはいっている暗号化されたパスワードを取得して、それを複合して比較して同じことを確かめるテストを書こうとしました

そこでレスポンスから暗号化したパスワードのみを取得する必要がありました


# 解決方法

以下のようにすることでレスポンスからパスワードのみを取得することができました

```go:controller_test.go
		req, _ := http.NewRequest("POST", "/sign_up", body)
		req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
		w := httptest.NewRecorder()
		r.ServeHTTP(w, req)

		jsonBytes := []byte(w.Body.String())
		data := new(Response)
		if err := json.Unmarshal(jsonBytes, data); err != nil {
				fmt.Println("JSON Unmarshal error:", err)
				return
		}
		
		assert.Equal(t, data.Password, "暗号化した文字列")
```

# おわりに

構造体がやはりまだ慣れておらず解決まで少し時間がかかってしまいました
この方法は今後も重宝しそうです

# 参考

https://qiita.com/268iop/items/dc6e73138ee97dff2f73

https://tikasan.hatenablog.com/entry/2017/04/26/110854
phpにおけるinterfaceをシンプルに説明してみた

１、interfaceとは？
phpにおけるinterfaceは一言で言うと、「各クラスで必要なメソッドを定めたもの」です。
interfaceという英単語の意味が、「何かと何かを繋いだ境界線」のようなニュアンスです。
そのためオブジェクト指向におけるinterfaceは「クラス」と「クラス」の間をつなげる「約束事（ルール）」という意味で理解できるかと思います。
interfaceを使用することで、必要なメソッドがきちんと定義されていることを確認することが可能です。

２、interfaceの使い方

```
<?php

interface A
{
   //インターフェースAを実装したクラスではplusメソッドを使用するように定める
   //ここでメソッドの定義はしないことに注意
   public function plus();
}

//sumクラスでインターフェースAを実装
 class sum implements A
 {
　　　　　　　　　　//インターフェースAで定めたplusメソッドを定義
　　　　　　　　　　//このclassでplusメソッドを定義しないとエラーになる
     public function plus()
     {
         echo 1 + 2;
     }
 }
```

３、参照URL
https://www.sejuku.net/blog/87543
https://laraweb.net/surrounding/1985/
https://www.php.net/interface
ReactでGTMを使った計測方法（GA4）

備忘録
※筆者は本格的にフロントを触り始めてまだ３ヶ月目なので、間違っている可能性が高いです。


使用Ver
```
    "react": "^17.0.0",
    "react-dom": "^17.0.0",
    "react-gtm-module": "^2.0.11",
    "react-redux": "^8.0.2",
    "react-router-dom": "^5.3.0"
    .
    .
    .
```

```
npm install react-gtm-module
```

# ページビュー取得方法
### GTM側でタグを作成
![スクリーンショット 2022-08-31 18.07.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176056/d4a568c1-d5f8-b8ae-9f65-107118ac99dc.png)


```usePageTracking.js
import { useEffect } from "react";
import TagManager from "react-gtm-module";
import { useLocation } from "react-router-dom";

const usePageTracking = () => {
  const location = useLocation();

  const tagManagerArgs = {
    gtmId: process.env.REACT_APP_GTM_ID,
  };

  useEffect(() => {
    TagManager.initialize(tagManagerArgs);
  }, [location]);
};

export default usePageTracking;

```

```App.jsx
import { useLocation } from "react-router-dom";
import { useEffect } from "react";
import usePageTracking from "../helpers/useTracking";

export const Top = () => {
  //　やり方①（単純にこのページに到達した時にページビューを発火させる）
  usePageTracking();
  //　やり方②（useLocationを使って、現在ユーザーがいるページ情報を取得して、変更があった際にページビューを発火させる）
  const location = useLocation();
  useEffect(() => {
      usePageTracking();
  }, [location])  
  return (
    <div>
      AppPage
    </div>
  );
};
```

# カスタムトリガー作成（クリックイベント）

### トリガー作成
トリガー名は自分がわかりやすい名前にしておく
トリガーのタイプはクリックすべての要素
このトリガーの発生場所は、どこで発火させたいのかという部分のなので、各々設定
今回自分はClickした要素のIDが一致していたら発火するように設定しています。
![スクリーンショット 2022-08-31 18.10.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176056/7eb64c71-131d-8ec0-33cc-8bbdd6e6b84b.png)

### タグを作成
設定タグにページビュー取得方法で作ったタグを選択
イベント名とタグ名は自分のわかりやすい名前にしておく
トリガーは上で作成したものを選択して紐づける
![スクリーンショット 2022-08-31 18.10.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176056/7b028a09-e96c-948e-c1a1-f431376a87f8.png)

### 発火方法
```

export const Button = () => {
  return (
    <a id="more_">
        発火テスト
    </a>
  );
};
```

これで、ページビュー取得とクリックイベント発火できました。
今回ほぼ初めてフロントを触って、GA,GTM周りも初めて触っているので、諸々おかしい点があるかもしれませんが、参考になる方がいれば
インターリージョンVPCピアリング とは

# インターリージョンVPCピアリング とは

## 勉強前イメージ

特別なVPC？
なんかのリージョン？

## 調査

### インターリージョンVPCピアリング とは

AWSのVPCピアリングで、異なるリージョン間でのプライベート接続をインターリージョンVPCピアリングと言います。
基本的には普通のVPCピアリングと変わりません。
パブリックなインターネットを通らないので攻撃などが軽減され、またリージョン間のトラフィックは暗号化されています。

東京リージョンは使用できますが、未対応リージョンとの接続はできません。
対応しているリージョン同士での接続になります。

AWSの画面でいうと以下で設定が可能です。
別のリージョンとピアリング接続したい場合は 「別のリージョン」 を選択して、接続したいリージョンを選びます。

![1VPC Management Console - Google Chrome 2022-08-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/8a6900e0-caf3-caec-d407-1f4f4e525012.png)


## 勉強後イメージ

なにか新しいピアリングの設定かと思ったけど、
別リージョンとピアリング接続できるのをインターリージョンVPCピアリングっていうのか。

## 参考

- [[新機能]リージョン間のVPCピアリング「Inter-Region VPC Peering」がリリースされました！ #reinvent](https://dev.classmethod.jp/articles/inter-regrion-vpc-peering/)
Docker上にReactとTypeScriptで開発するための環境構築でのつまづきまとめ


本記事では、Docker上でReactとTypeScriptで開発を進めるための、
環境構築について以下記事参照しつつ進めた際のつまづきの記録です。

https://qiita.com/kashimuuuuu/items/b5f35057dfe1980d053a

1時間だけ完全に手持ち無沙汰な時間があったので、1時間でどこまで行けるかなと思い、
上記記事参考に、作業した記録のため、調べ方が甘いところなどあったりするかもしれません。
同じところでつまづいた方が、つまづきを解消する手助けになればと思いますmm
また、作業手順については参考にした記事のままで基本進めているので、省かせていただきますmm

## 当方のスキル感
この記事を書いた筆者のスキル感は以下の感じです。
 - ReactとDockerは触れたことあるけど、環境構築したことがない。
 - TypeScriptは業務でも使うし、個人で環境構築もしたことある。


## 環境
今回、使用しているOSやいれようとしている各言語のバージョンは以下です。
 - MacOS Big Sur バージョン11.6.8
 - typescript ^4.7.4
 - react ^18.2.0


## つまづきポイント
### Docker入れてすぐにつまづいた
dockerを入れたし、、
```sh
docker version
```
「...おや？なんか...???」
```sh
Error response from daemon: dial unix docker.raw.sock: connect: connection refused
```
え？？？入ってないのかな？？？？

このエラーは、Dockerにサインインできていないと起こるエラーですね。
Dockerのログインをしてどうにかいけました！！

## 終わりに
今後、Docker Hubにコンテナをアップロードなど行なって行きたいので、やってみたつまづいたところをここに追記していければと思います。
RF Bandとチャネルについて

# 2.4GHz ISM Bandとチャネル

- ISM領域というのは、通信以外の目的で使われる領域のことです。例えば、電子レンジだったり、医療の何かだったり
- 802.11, 802.11b, 802.11g, 802.11nは2.4GHzのISM Bandを使います。
- たいてい、11から14のチャネルがあるのですが、それを全部使おうとするとチャネル同士が干渉しあって、隣のチャネルの情報が見れてしまうので、干渉させないためにチャネル１、６、１１を使います。

## チャネルの領域幅に関する具体的なこと

ざっくりテキストで説明するのでわかりずらいかも知れません。

- １つのチャネルは領域は、山のようになっています
- そして、チャネル同士の山のてっぺんの距離は5MHzぐらいで、チャネル自体の幅は、20+αMHzぐらいになっています。
- お気づきなったと思います。隣同士のチャネルは完全に干渉しているのです。
- だから、ちょうど干渉しないようなチャネル１、６、１１が使われるのです。

# 5GHz U-NII Bandとチャネル

- 802.11aと802.11nは5GHzのUnlicensed National Information Infrastructure(U-NII) Band を使います。
- 調べたところ、どうやら5GHzのISM Bandもあるらしいです
- U-NIIは無線領域を分割するものです

U-NIIには４つの領域があります

- U-NII 1, 別名Lower-U-NII。5.150GHz~5.250GHzの領域のことです。
- U-NII 2, 別名Middle-U-NFII。5.250GHz~5.350GHzの領域のことです。
- U-NII 2E, 別名U-NII 2 Extended。5.470GHz~5.725GHzの領域のことです。
- U-NII 3, 別名Upper U-NII。5.725GHz~5.825GHzの領域のことです。

## 領域の使用用途

- 国によって変わるのですが、802.11aはU-NII 1, U-NII 2, U-NII 3を４つのチャネルに分割します。U-NII 2Eは、11つチャネルに分割されます。
- U-NII 1は屋内用、U-NII 2は屋内と屋外用。U-NII 3は屋外用です。
- U-NII 2EはNICが対応していないという可能性があるという問題を抱えています。

# チャネルの結合

チャネルの結合は、802.11nと802.11acでできます。結合することで、高いスループットを可能にできます。

チャネルの結合というのは、複数のチャネル領域をまとめて、一つのチャネルにすることです。

例えば、チャネルを二つ合体した場合、HT40と言います。HTは、High Throughpuの略です。そして40というのは、二つのチャネルの領域の合計のことです。覚えているでしょうか？１つのチャネルの領域は20+αMHzでしたよね？

間違っていることを書いていたらコメントしてくれると嬉しいです
以上です。
お疲れ様でした。
Stable Diffusion の prompt に加法性を与えてみた


話題の Stable Diffusion を Google Colaboratory で動かしてみました。
それだけではつまらないので少しだけ改造して prompt を明示的に加減算できるようにしました。




### 参考の記事

https://zenn.dev/td2sk/articles/eb772103a3a8ff

加減算の参考にしました。優しく説明されている良い記事です。

# Stable Diffusion
text-to-image の描画 AI です。自然言語で記述された prompt から画像を生成します。デジタルイラスト調、油絵調のものから写真のような画像まで何でも生成します。

https://ja.wikipedia.org/wiki/Stable_Diffusion

### どんな感じ？
> A cute dog doing programming instead of his owner."

で生成してみました。

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2696283/1301c057-a129-ab15-7a58-da57b09da36c.png)

ものの数行のコードでこのような画像が生成できます。



# prompt に加法性を与える
Stable Diffusion は、与えられた prompt をベクトルとして埋め込んで得られる意味ベクトルを使って画像生成をしています。このような文章の意味を反映したベクトルには意味的な加法性があると言われています。

例えば、
queen = king - man + woman
のような操作が成り立つような空間になっているらしいです。

### 改造する
pip でインストールした Stable Diffusion を改造して、この加法性を陽に扱えるようにします。
/diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion.py を次のように変更しました。

```/diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion.py
import inspect
import warnings
from typing import List, Optional, Union

## 省略 ##

    def __call__(
        self,
        prompt: Union[str, List[str]],
        prompt_collection: List[str], # 追加
        height: Optional[int] = 512,
        width: Optional[int] = 512,
        num_inference_steps: Optional[int] = 50,
        guidance_scale: Optional[float] = 7.5,
        eta: Optional[float] = 0.0,
        generator: Optional[torch.Generator] = None,
        output_type: Optional[str] = "pil",
        **kwargs,
    ):

        ## 省略 ##

        text_embeddings = self.text_encoder(text_input.input_ids.to(self.device))[0]

        # ここから追加
        for pw in prompt_collection:
            p, w = pw.split("::")
            p_input = self.tokenizer(
                p,
                padding="max_length",
                max_length=self.tokenizer.model_max_length,
                truncation=True,
                return_tensors="pt",
            )
            p_embeddings = self.text_encoder(p_input.input_ids.to(self.device))[0]
            text_embeddings += float(w) * p_embeddings
        # ここまで追加

        ## 省略 ##
```

prompt_collection に "プロンプト::プロンプトの重み" からなるリストを与えてやることで、

> 写真 - リアルさ * 0.6 + ファンタジーっぽさ * 0.3 + 漫画っぽさ * 0.3

みたいな入力をモデルに与えることができるようになります。


# 加法性でいろいろ変換

### 画風変換

> portrait of BILL GATES, photo

から "photo, realistic" を徐々に減算し、"drawn by HOKUSAI KATSUSHIKA, ukiyoe" を徐々に加算します。

![billgatestoukiyoe2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2696283/cc3716e2-108e-c58c-8ee1-0bb5cd58a5b7.gif)

浮世絵かどうかはよくわかりませんが、徐々に色味が失われて行って最終的に濃淡だけの水墨画っぽい画像になっています。
ただ、写真と絵の境界ははっきりしているように見えます。（急に絵になったな、と思う画像が出てくる）
これはモデルの特性かなと思っています。

### 性転換
> portrait of STEVE JOBS, photo

から "male" を徐々に減算し、"female" を徐々に加算する。

![stevejobstofemale.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2696283/605b2413-3c31-f729-b144-f0f8f45cf128.gif)

なるほど。


# おわりに
少しだけ Stable Diffusion を扱ってみました。
構図のコントロールが難しいです。
【laravel】スタティックメソッドでクラスを呼び出したのにコンストラクタを通ってる！！

みなさんもこんな経験ないですか？
私はあります。

例えばこんな感じです

```
app/Model/

class UserMoel extends Model
{
  $table = 'user';

  $a = null;

  public __construct()
  {
    $this->a = 'かめはめ波';
  }

  public static function getUser($userId)
  {
    $user = self::query()->where('user_id', $userId)->first();
    dd($this->a);

    return $user;
   }

-----------------------------------

Http/Controller

class user extends Controller
{
  public function login()
  {
    $user = UserModel::getUser(2)
  }
}

//出力
かめはめ波
```

私のコンストラクタが通る認識としてはインスタンスを生成時、つまり
new UserModel
としたときでした。

今回はインスタンスを生成せずにスタティックメソッドを呼び出したにもかかわらず
コンストラクタを通ったのには理由があります。

UserModelのgetUserにある
query()の中でインスタンスを生成しているからです。

プログラムに慣れている人は当たり前に感じるかたもいらっしゃると思いますが
私にはずっと謎でした。

このqueryの中身を辿っていくとインスタンスを生成している箇所がわかります。

Modelのファイル内にてctl + fで
function queryと検索いただくと出てきます。
以下がインスタンスを生成している箇所になります。
```
public static function query()
{
 　return (new static)->newQuery();
}
```

厳密に言えば違うと思うのですが
エンジニア１年目の私にはここまでの理解で限界でした。

もしlaravelのソースレベルで詳しくて優しい方がいらっしゃれば
ご教授いただけると幸いでございます！
CとPythonの比較

C：Cは、1972年から73年にかけてベル研究所でDennis Ritchie氏によって開発された構造化された中級レベルの汎用プログラミング言語である。UNIXオペレーティングシステムを開発するための基盤として構築された。中級言語であるため、高級言語に特徴的な組み込み機能はないが、開発者が必要とするすべてのビルディングブロックを提供する。C言語は構造指向、つまりプログラムをより小さな関数に断片化するトップダウン・アプローチに従う。

C言語の特徴は、従来アセンブリ言語で書かれていた低レベルのメモリ管理作業（メモリ位置に直接アクセスできる16進数のコード形式）に最適化されていることである。現在でも、UNIXやLinuxの派生系は、多くの機能でCに大きく依存している。

Python Pythonは1989年にGuido Rossumによって開発された汎用的な高級プログラミング言語である。Pythonがすごいのは、英語に近いシンプルな構文と動的型付け機能です。構文が単純なため、コードを読みやすくすることができます。

また、インタプリタ型言語であるPythonは、ほとんどのプラットフォームでスクリプトや高速<a href="https://hktoi.com">私家偵探</a>アプリケーションを開発するのに最適な言語であり、開発者にとても人気があるのです。スクリプト言語は、ウェブベースのアプリケーションを通じて、インタラクティブな機能とダイナミックな機能の両方を組み込んでいます。
npm uninstall --global @vue/cli が効かない

最新のVueを入れてから、Vueのバージョン指定を試みるが上書きできず。
npmのアンインストールを試みるが、アンインストールができない。

@vue/cli 5.0.8だからアンインストールのコマンドは
```
sudo npm uninstall --global @vue/cli
```
か
```
npm uninstall --global @vue/cli
```
![LINE_P20220831_160739746.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223785/eda6d72e-c825-666e-2a85-dfbe79e4837d.png)
画面のとおり、削除できていない💦

https://www.imymac.jp/powermymac/uninstall-node-mac.html#part2

![スクリーンショット 2022-08-31 17.41.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223785/0ffcfcc5-be3d-5794-c455-0530d87eede3.png)
上記(ノードを手動で削除します。)を参照の上、NPMを削除したら
![スクリーンショット 2022-08-31 17.38.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223785/a5ead3c6-b0c9-bd6d-9a8c-2f6e4c493127.png)
削除できました！
コマンドの意味とは💦
Dataframeを列あるいは行単位でまとめて標準化する方法

# PythonでDataframeを列あるいは行単位でまとめて標準化(zscore)する
標準化：平均を0、分散を1となるように値を変換すること

RNA-seqで得られた遺伝子発現量（TMM, TPMなど)を遺伝子間で比較する際、値をzscoreか、log10かのどちらかで取ることがあると思います。
今回はzscoreの取り方を備忘録として書きます。

## やり方
```python:
def mean_norm(df_input):
    return df_input.apply(lambda x: (x-x.mean())/ x.std(), axis=1)

# 列ごとの標準化の場合は axis=0
```
以上。
上記の関数のdf_inputのところにdataframeを代入すれば、標準化ができる。