OmniAICreator/Qiita-1.07M huggingface dataset:
Kaigi on Rails 2023 での学び

# はじめに

Kaigi on Rails 2023に、オフライン参加しました。

https://kaigionrails.org/2023/

全ての発表を見ることはできませんでしたが、それでも多くの学びがありました。
その学びをここにまとめます。

:::note warn
学びは、かなり荒めに書いています。
興味ある学びについては、今後追記するかもしれません。
:::

# 学び

## ジョブ実行中のコンテナ削除を遅延できる

https://speakerdeck.com/techouse/sukeraburuactive-jobs-with-sidekiq-enterprise-kaigi-on-rails-2023-day-1-suponsalt2?slide=58

## hako-consoleで、アプリで使っているAWSサービスを把握しやすくなりそう

https://docs.google.com/presentation/d/1Y5ZPVfNNLlTeE5VsT-JbpuWDgF_q1RF6wJHH8JAFV0w/edit#slide=id.g29005d3b8f5_0_18

## Delegated typesを使えば、委譲(composition)を実現できる

https://docs.google.com/presentation/d/1Y5ZPVfNNLlTeE5VsT-JbpuWDgF_q1RF6wJHH8JAFV0w/edit#slide=id.gf559c2d176_0_136

## Fiberで非同期処理を実現できるが、リソース管理をプログラマーがしないといけないので難易度高め

https://docs.google.com/presentation/d/1g1npS_0WEylpDhCVtpqi9AEQk9kUs5-Wo8vRcteLsk0/edit#slide=id.g1276827f2e_0_5

## Exceptional Rubyという本は、面白そう

https://speakerdeck.com/willnet/exceptional-rails?slide=6

## 例外は、ある事実に対して何かする必要がある時に発生させる

https://speakerdeck.com/willnet/exceptional-rails?slide=25

## 例外に対する処理を、アプリ全体で共通化できる

```rb
# 例外を握りつぶす
Rails.error.handle(ActiveRecord::RecordInvalid) do
  do_something
end

# 再度raiseする
Rails.error.record(ActiveRecord::RecordInvalid) do
  do_something
end
```
https://speakerdeck.com/willnet/exceptional-rails?slide=78

https://railsguides.jp/error_reporting.html

## エラーページの表示は、Rails標準搭載のRackミドルウェアに任せるとDRY

https://speakerdeck.com/willnet/exceptional-rails?slide=96

## Rails 7.1から、テスト環境でエラーページがデフォルトで表示される

https://speakerdeck.com/willnet/exceptional-rails?slide=100

## Safari v14で、Stimulusのtargetを使う場合は工夫が必要

https://speakerdeck.com/lnit/kowakunai-hotwire-kaigi-on-rails-2023?slide=76

## Gemからアプリケーションコードを１度だけ呼ぶ場合、Rails Executorを使う

https://envek.github.io/kaigionrails-rails-executor/18

## Gemからアプリケーションコードを長い間呼ぶ可能性がある場合、Rails Reloaderを使う

https://envek.github.io/kaigionrails-rails-executor/19

## KPIの良し悪しによるアクションを事前に決めておくと、ステークホルダーが意思決定をしやすい

https://speakerdeck.com/zuckey_17/shi-ye-noshi-xing-cuo-wu-wozhi-eru-kodowoshe-teyasukusite-sisutemuwosinpurunibao-tushe-ji-togong-fu?slide=48

## RSpecでは初めて visit を使った時に、Railsサーバーとブラウザが起動する

https://speakerdeck.com/yusukeiwaki/kaigionrails2023pub?slide=10

## Playwrightテストランナーでの並列テストは難しい

https://speakerdeck.com/yusukeiwaki/kaigionrails2023pub?slide=53

## [Hotwire] 部品的アプローチでviewを作成すると、他のviewとの依存関係が生まれて開発しづらくなる

https://speakerdeck.com/nay3/hotwirede-nashe-ji-wozhui-qiu-site-webzhi-zhi-ju-nixing-kizhao-itahua?slide=143


## オブジェクト・シリアライザーはMessagePackを使おう

[byroot](https://github.com/byroot)が言ってたけど、色々面倒なのでMessagePack or JSONを使ったほうがいい。

https://shopify.engineering/caching-without-marshal-part-two-messagepack

## 低レイヤーを恐れる必要はない

[byroot](https://github.com/byroot)の発言から

## 準決定的な振る舞いをするものには、依存してはいけない

[byroot](https://github.com/byroot)の発言から

# 終わりに

多くの学びがある２日間でした。
「学びが多すぎて、咀嚼するのに時間がかかるなぁ」と思って記事執筆を渋っていました。
しかし、そのまま放置しておくと学びを忘れてしまいそうだったので、荒めに文章化しました。

## Thanks

下記の記事に発表資料がまとまっています。
https://qiita.com/Hassan/items/9cc836dd5bfb1aaaabac

この記事を執筆するのに、大変助かりました。
ありがとうございます。
renameが使えない環境でのファイル名一括置換

## コマンド
対象ファイルは同一ディレクトリにあると想定。
```
ls | sed -e "s/\(置換元からマッチしたい文字\)/mv \0 \1/g" | xargs -I{} sh -c 'eval {}'
```
## 余談
VSCodeのターミナルに使ってるgit bash上でファイル名をまとめて置換しようとして悩んだので。
さくらVPSとお名前.com、ロリポップでwebサーバーとメールサーバーを分けて運用する方法

# さくらVPSとロリポップレンタルサーバーを使ってwebサーバー、メールサーバーを分けて運用する
さくらVPSでwebサイトを管理しようと構築していたところ、メールアドレスも設定しなくてはいけないことを忘れていた。

VPSでのメールサーバー環境構築は慣れていないため時間がかかる。。。
ということでレンタルサーバー（ロリポップ）にデフォルトでメール機能が搭載されているためそちらを利用することにした。

最初NS（ネームサーバー）をさくらVPSに設定してなんとかやろうとしていましたが、なぜかメールの送受信ができず、、、仕方ないのでNSはお名前.comの切り替えて対応することにしました。
なのでその作業手順メモです。

## 環境情報
- さくらVPS
CentOS 8
Apache
MariaDB Ver 10.3.28

## 概要
- お名前.com
ドメインの管理


- さくらVPS
webサイトのデータを保管
- ロリポップ
メールサーバーとして利用

## STEP１：ドメインのDNS設定（お名前.com側）
スクショを見てもらうのが一番早いので添付。
![スクリーンショット 2023-11-03 19.25.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657875/16b1a747-5a7b-f029-fb53-7bf6ac52baf7.png)

- NSをお名前.comのデフォルトに向ける
- Aレコード：さくらVPSのIPを設定
- Aレコード：さくらVPSのIPを設定(wwwありバージョン)
- MXレコード：ロリポップメールサーバーに向ける
- TXTレコード：SPFレコードの設定

※SPFレコードの設定でミスがあったので追記
ロリポップメールサーバーを使う場合はTXTレコードに以下のコードを入れればOK
`v=spf1 include:_spf.lolipop.jp ~all`

特にメールサーバーをロリポップで利用するために以下を入力すること。

MXレコード：`mx01.lolipop.jp.`

## STEP２：さくらVPSの設定
![スクリーンショット 2023-11-03 19.40.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657875/ecb9df65-d8f7-d9b3-20b0-f1a169089b4a.png)

NSをお名前にしているのでゾーン登録をしてあとはデフォルトの設定にしておけばOK。

## STEP３：ロリポップの設定
![スクリーンショット 2023-11-03 19.47.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657875/22576953-622e-35da-0eea-549adae12102.png)
メールサーバーとしての利用だけなので、独自ドメインの設定からドメインを追加するだけです。
あとはメールアドレスを作って送受信テストをしましょう。

※ロリポップはログイン画面からwebメールがそのまま使えるのでサクッと送受信テストしちゃいましょう。
【HTML・CSS】表のセルを横方向に結合する方法

# 背景
表としては1列で表示しつつも、一部の行では2列で表示させたい事があった。
表のセルを結合させるという発想がすぐに出てこず、1つのセルの中にもう1つセルを作れないか考えたが、思うようにはいかなかった。
本記事では、以下画像のような表のセル同士を結合させて一部の行だけ2列に表示させた方法について記載します。

- 表のイメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/12a7be2e-5fd4-e009-8feb-5f3567fbc82d.png)


# 全体のコード
以下が全体のコードを記載します。
今回は表の見出しとなる`<th>`タグは使用しておりません。
```html
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!-- 表 -->
    <table border="1">
        <!-- 1行目 -->
        <tr>
            <td colspan="2">1st Column</td>
        </tr>
        <!-- 2行目 -->
        <tr>
            <td colspan="2">1st Column</td>
        </tr>
        <!-- 3行目 -->
        <tr>
            <td style="width: 75%;">1st Column</td>
            <td style="width: 25%;">2nd Column</td>
        </tr>
    </table>
</body>

</html>
```
## コードの詳細
ポイントはCSSとして適用させている`colspan`属性です。
`colspan`属性を使用する事でテーブルのセルを横方向に結合させる事ができます。
今回は表を2列で作成しており、1行目と2行目を横方向にセルを結合させています。
```html
<!-- 表 -->
    <table border="1">
        <!-- 1行目 -->
        <tr>
            <td colspan="2">1st Column</td>
        </tr>
        <!-- 2行目 -->
        <tr>
            <td colspan="2">1st Column</td>
        </tr>
        <!-- 3行目 -->
        <tr>
            <td style="width: 75%;">1st Column</td>
            <td style="width: 25%;">2nd Column</td>
        </tr>
    </table>
```

- `colspan`属性=結合するセルの数
のため、今回は2つのセルを横方向に結合させています。
```html
<td colspan="2">1st Column</td>
```

:::note info
補足
今回は表のセルを横方向に`colspan`属性で結合させましたが、
`rowspan`属性を使用すると縦方向にセルを結合します。
:::

参考
- https://developer.mozilla.org/ja/docs/Web/CSS/column-span
AWS WAF 適用イメージ

## AWS WAFとは
AWS認定の勉強中、AWS WAFのイメージがイマイチつかなかった。
図で書いてイメージつくようにしてみたいと思う。

## Amazon CloudFront への適用

![スクリーンショット 2023-11-03 19.26.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586577/1831654f-115e-ed16-7548-9ac95ead226c.png)


1. ClientからURLでCloudFrontへリクエスト
1. CloudFront はWAFにリクエストを送信し、WAFでグローバルウェブACLを使用してフィルタリング
1. リクエストが無効であれば、CloudFlontはClientに403エラーを返す。
有効であればCloudFrontはリクエストに対する処理を続行する。

https://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront.html

## Application Load Balancer(ALB)への適用

![スクリーンショット 2023-11-03 19.26.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586577/155d2224-aad4-284d-d862-10d53027f3dd.png)

流れはCloudFrontの場合とほぼ同じ。
CloudFlontと違い、リージョンのウェブACLを使用するようだ。

### 関連付け可能なリソース
```
【グローバルウェブACL】
Amazon CloudFrontディストリビュート
【地域のウェブACL】
Amazon API Gateway REST API
Application Load Balancer
AWS AppSync GraphQL API
Amazon Cognito ユーザープール
AWS App Runner のサービス
AWS Verified Access インスタンス
```

https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/web-acl-associating-aws-resource.html

## 調べてみてわかったこと

調べる前のイメージ　：　WAFはリソースの前段に置くもの
調べた後のイメージ　：　WAFはリソースと関連つけて、ウェブACLに従ったリクエスト制御を実施するもの 

https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/web-acl.html
NotionでADHDかもしれない自分をサポートしてあげよう

## 困っていること

ちゃんとした診断を受けてはいないのですが、自分でADHDじゃないのかなと感じることがあります。
以下自覚している困っていること。

* 1つのことに集中できない（作業してると自分でも意識しないうちに別のことをやっていることがあります・・・）
* ついさっきのことを一瞬で忘れる
* 大きいタスクがあると何から手を付けたらいいか分からなくなる、また手を付け始めても細かいところが気になってなかなか先に進まない
* バイクの鍵をつけっぱなしで忘れることがよくある

まぁバイクの鍵はNotionではどうしようもないのでそのうちキーレスのにしなければと思ってます。それ以外をNotionで何とかできないかと考えました。
何とかするといってもADHDの症状を何とかすることはできません。

```
1つのタスクに集中できない
↓
1つのタスクに集中できるようにする
```
ではなくて1つのタスクに集中できないのはそのままで、それでも大きな問題にならないようにNotionでサポートしていこうという考え方です。

## やったこと
### とにかく全部Notionに入力する

![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2272731/b9a1eef0-5d3a-654e-9ab4-7c87d4c32ee3.png)

いつまでにしなければならないことがあった場合は、とにかく一旦ToDoに入れます。別に期限が特にない場合もToDoに入れちゃいます。
またスマホからもInboxデータベースにすぐ登録できるウィジェットを登録しておいて思いついたものすべてToDo以外のこともなるべくメモします。
自分の脳みそはすぐに忘れてしまう前提で記憶はNotionに任せます。

### 仕事で覚えておかなきゃのことも時系列でメモっておく
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2272731/3585e5ed-ba7f-eb24-d4b4-82002281d201.png)
仕事で発生したイベントや決定事項などを全部時系列でまとめておきます。
また場合によってはSlackのURLまたはSlackの画面キャプチャなんかもNotionに貼り付けていきます。
HOMEページにあったToDoもプロジェクトに関連するものは表示されるようにしておきます。
（プロジェクト進めていくと途中でどんどん話が変わっていったりするので時系列にしておくと後でどうだったかが分かりやすいので）

とりあえず主にやったことは以上です。
あとはNotionのボードビュー機能を使って、各プロジェクトの細かいタスクが今どんなステータスなのかを分かりやすくするみたいなこともやっています。

ToDoやメモ、カレンダー、ボードなどそれぞれの機能は特にNotionでなくてももっと便利なアプリやサービスがそれぞれあると思います。しかしそれらは高機能過ぎて、自分をアプリ側に寄せる必要があります。
Notionだと自分が利用しやすいように設計できるのでその必要はありません。またADHDな自分にとってはいろんな情報が全部Notionにまとまってくれているのがありがたい。

依然として注意散漫で他に気になることがあるとそちらに意識が移ってしまうのですが、また元のタスクに戻ってきたらとりあえずNotionに記録していた内容が残っているので、以前のようにまったく頭から抜けてしまってるということが少なくなりました。

またNotionに記録する癖がついてことで自分の頭の中が視覚化され、大きいタスクがあっても何となく対処できるようになってきました。
position:fixedが効かない?content-visibility:autoを親要素に書いてませんか?というお話

表題の通り。
`transform`やら使ってないのになんで`position:fixed`が効かないんだ😡と思って調べてたら、`content-visibility:auto;`が原因でしたよという感じ。

## 実際に`position:fixed`が効かなくなる様子

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="vYbXbqB" data-user="hikagami0210" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/hikagami0210/pen/vYbXbqB">
  Untitled</a> by hikagami (<a href="https://codepen.io/hikagami0210">@hikagami0210</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

content-2に`content-visibility: auto;`をつけてます。
そうすると子であるfixed-contentは`position: fixed;`なのにcontent-2を基準にしてしまっていることがわかるかと思います。

`content-visibility: auto;`をコメントアウトするとしっかり全画面を覆ってくれます。


こうなる原因はいまいちよくわからなかったのですが、よくページの読み込みを早くするとメリットだけ書かれている`content-visibility: auto`もこういったデメリットがあるので私の様に時間を無駄にされぬようご注意ください。

もし共存させる方法がありましたら教えてください。
お読みいただきありがとうございました！

## 参考ページ
https://stackoverflow.com/questions/71331489/css-content-visibility-auto-inadvertently-hides-overflow
JSの正規表現でのエスケープにお気をつけ

## はじめに
案件でJavaScriptを用いた開発中に、正規表現内の特殊文字（メタ文字）のエスケープに関する件で一悶着あったので、個人的なメモの意味も込めて注意すべき点をまとめました。

## JavaScriptにおける正規表現
JavaScriptの正規表現は二通りの実装方法があります。
1つがスラッシュで囲んだ正規表現リテラル、そしてもう1つがRegExpコンストラクタを利用する方法があります。

## 正規表現リテラルでのエスケープ
正規表現リテラルでは、特殊文字を文字として扱う場合にエスケープする必要があります。

そこで注意すべき点として、正規表現リテラルの場合はスラッシュで囲む方式となっているため、**スラッシュも特殊文字扱い** となります。

そのため、スラッシュを文字として利用する場合は、エスケープする必要があります。

```Javascript
// /a* の文字列をパターンとして用意する場合
const RE = /\/a\*/;
```

## RegExpコンストラクタでのエスケープ
RegExpコンストラクタでは正規表現リテラルと同様に、特殊文字を文字として扱う場合にエスケープする必要があります。

そこで注意すべき点として、RegExpコンストラクタに渡す文字列リテラル内ではバックスラッシュが特殊文字扱いとなっており、 特殊文字をエスケープするためのバックスラッシュをさらにエスケープする必要があるため、**バックスラッシュを2つ付ける** 必要があります。

※ 正規表現リテラルでは特殊文字扱いだったスラッシュは、文字列リテラルでは特殊文字扱いではないため、文字として利用する場合にエスケープする必要はありません。

```Javascript
// /a* の文字列をパターンとして用意する場合
const RE = new RegExp("/a\\*");
```

## 文字クラス内でのエスケープ
例外として、文字クラス[^1]内では特殊文字の扱いが変わるため、以下を文字として扱う場合**のみ**エスケープが必要になります。

|対象文字|備考|
|:---:|:---|
|`]`|文字クラスの閉じカッコとして利用されるため|
|`-`|`a-z` などのように文字範囲指定に利用されるため|
|`^`|文字クラスの先頭に置くことで否定を意味するため。そのため、**先頭に文字として置く場合のみエスケープ対象**|
|`\`|特殊文字のエスケープに利用されるため|

※ 文字クラス内で上記以外の特殊文字を文字として扱う場合はエスケープが不要となります。

```javascript
// a] の文字列を文字クラス内のパターンとして用意する場合
const RE1 = /[a\]]/;

// #-& の文字列を文字クラス内のパターンとして用意する場合
const RE2 = /[#\-&]/;

// ^" の文字列を文字クラス内のパターンとして用意する場合
const RE3_1 = /[\^"]/;

// "^ の文字列を文字クラス内のパターンとして用意する場合
const RE3_2 = /["^]/;

// |\ の文字列を文字クラス内のパターンとして用意する場合
const RE4 = /[|\\]/;
```

[^1]: 正規表現では `[]` で囲むとその中で指定したセットの任意の1文字と一致するパターンを作ることができ、それを文字クラスと呼びます。
aws lambdaでpsycopg2を使おうとしたらlibpq.so.5: cannot open shared object file: No such file or directoryとなった話

# 概要

lambdaでpythonを使ってRDSにアクセス時に`libpq.so.5: cannot open shared object file: No such file or directory`とエラーが出てしまったのでその問題の解消法を備忘録としてまとめました。

今回はpoetryを使っていましたが普通に`requirements.txt`でやっていても同じことだと思います。

## 環境

- AWS lambda
- AWS RDS (postgresql)
- Python3.11
- poetry

### ライブラリ

poetryで使っていたライブラリの一部

```toml:pyproject.toml
[tool.poetry.dependencies]
python = "^3.11"
psycopg2 = "^2.9.9"
psycopg2-binary = "^2.9.9"
sqlalchemy = "^2.0.22"
```

## 状況

`lambda`から`RDS(postgres)`にアクセスしようとして次のようなエラー（ログ）が`CloudWatch`で確認できた。

```plaintext
libpq.so.5: cannot open shared object file: No such file or directory
```

## 本質的な問題

この状況を打破するためには`psycopg2`と`psycopg2-binary`の違いを理解する必要があります。

簡単に説明すると、`psycopg2-binary` は実行する際に外部ライブラリやコンパイラが必要なくスタンドアローンなパッケージとして作成されているものです。 `psycopg2` 自体はC言語のラッパーであるためCコンパイラが必要になります。

ということで、単に`lambda`から`RDS`にアクセスするためには`psycopg2-binary`があれば必要十分ということになります。


:::note info
`lambda`から`RDS`にアクセスするためには`psycopg2-binary`があれば必要十分
:::

## 解決策

ということで`psycopg2`はこの場合必要ないので一旦両方をuninstallして再度`psycopg2-binary`をinstallします。

```bash
pip uninstall psycopg2 psycopg2-binary
pip install psycopg2-binary
# or 
poetry remove psycopg2 psycopg2-binary
poetry add psycopg2-binary
```

として再度レイヤーやzip化してデプロイすれば解決します。

よって、`pyproject.toml`のライブラリは`psycopg2`が消えて次のようになっていればよいです。

```toml:pyproject.toml
[tool.poetry.dependencies]
python = "^3.11"
psycopg2-binary = "^2.9.9"
sqlalchemy = "^2.0.22"
```

## 参考

https://github.com/psycopg/psycopg2/issues/892
Google Colaboratory（Colab）でSecrets管理が簡単にできるようになった

このツイート↓にあるとおり、ColabのアップデートでSecrets管理機能が追加されました。

https://twitter.com/GoogleColab/status/1719798406195867814

Secrets管理機能を使うことで、OPENAI_API_KEYのようなAPIキーなどをコードに含める必要がなくなります。ノートブックの公開や共有がやりやすいのがColabの強みですが、それをより便利にする機能だと思います。

## 使い方
簡単です。[Colab](https://colab.research.google.com/drive/)を開いて、左側のサイドバーの鍵マークを開いて、シークレット情報を入力し、ノートブックからのアクセスを有効化します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/97fd6517-fb0b-ea87-cf8e-790a4024363c.png)

コード内で`google.colab.userdata.get()`を使えばアクセスできます。

```python
import openai
from google.colab import userdata
openai.api_key = userdata.get('OPENAI_API_KEY')
```

これでおわりです。

SecretsはGoogleアカウントに紐づくようです。NotebookごとにAPIキーを使い分けたい場合や、大量のSecretsに依存するNotebookが複数あったりすると、管理が大変になるかも知れません。

今までは[Google Secrets Managerを使う必要がありました](https://zenn.dev/hattan0523/articles/9be93149ac0754)が、これでより簡単にSecrets管理ができるようになりました。
電話番号の正規表現

## 電話番号の正規表現
※携帯番号は除く

＜VB.NETの場合＞

### ・ハイフンの有無に関係なくチェック可能
　例：`***-***-****`、`**-****-****`、`0120-***-***` など
```vb
^(\d{2}-?\d{4}-?|\d{3}-?\d{3}-?|\d{4}-?\d{2}-?|\d{5}-?\d{1}-?|\d{6}-?|\d{1,4}-?)\d{4}|0120[-]?\d{3}[-]?\d{3}$
```
- `\d`：0-9の半角数字
- `-?`：`-`があってもなくても良い
- `|`：または（orと同じ意味）
- `{2}`：2桁（文字数）
- `()`：グループ分け
    - `(\d{2}-?\d{4}-?|\d{3}-?\d{3}-?|\d{4}-?\d{2}-?|\d{5}-?\d{1}-?|\d{6}-?|\d{1,4}-?)`
    で1つのグループになっている。
<br>

- `\d{2}-?\d{4}-?`：`**-****`または`******`が該当する。（*は半角数字）
- `\d{1,4}-?`：半角数字1桁～4桁までが該当する。`{最小桁数、最大桁数}`

<br>

### ・半角数字のみ
　例：01234567890
 ```vb
 ^[0-9]+$
 ```
 - `+`：[0-9]を1回以上繰り返す。

<br>

### 10桁の半角数字

　例:0123456789
 ```vb
  ^[0-9]{10}$
 ```
  - `{10}`：10桁（文字数） 

<br>

## 参考サイト
https://akinov.hatenablog.com/entry/2017/05/31/194421

https://www-creators.com/archives/4241#i

https://www.soumu.go.jp/main_sosiki/joho_tsusin/top/tel_number/q_and_a.html
似たような言葉の意味を整理してみた(ライブラリ API Gem コンポーネントetc)

# プログラム開発における要素解説

プログラム開発は、さまざまな要素が組み合わさって複雑なアプリケーションやシステムを構築するプロセスです。このプロセスにおいて、いくつかのキー要素が存在し、それぞれの役割や特徴があります。以下では、モジュール、オブジェクト、コンポーネント、ライブラリ、API、およびGemといった重要な要素について解説します。

## モジュール

**モジュール**は、プログラム内で使われる部品の総称です。プログラムが大規模化するにつれ、コードを整理し、再利用性を高める必要が生じます。モジュールは、関連する関数やクラスをまとめたもので、それらをひとまとめにして管理できます。このアプローチにより、プログラムは論理的に分割され、保守性が向上します。

## オブジェクト

**オブジェクト**は、インスタンスとイコールで使用されることが多いプログラム内で特定の機能や概念を表現する部品です。特に、オブジェクトはバックエンド側を含む機能の単位として使われます。オブジェクト指向プログラミング（OOP）では、すべてがオブジェクトとして扱われ、それらのオブジェクトがデータと振る舞い（メソッド）を持ちます。この方法により、プログラムは効率的で拡張可能になり、コードの再利用性が高まります。

## コンポーネント

**コンポーネント**は、フロントエンド（ユーザーインターフェース）の表示に関連する部品です。ウェブアプリケーションやモバイルアプリケーションでは、ユーザーインターフェース（UI）の構築にコンポーネントが使われます。例えば、ボタン、フォーム、ナビゲーションバーなどがコンポーネントとして使われ、これらを組み合わせてアプリケーションの外観と機能を構築します。コンポーネントベースの設計は、UIの一貫性を保ちながら、効率的な開発を支援します。

## ライブラリ

**ライブラリ**は、プログラム開発において非常に便利な外部提供のプログラム部品です。ライブラリには、よく使われる機能やコードのコレクションが含まれており、他のプログラムに機能を提供するために使用されます。複数や単数のクラスをダウンロードする形で利用します。ライブラリの活用により、同じコードを繰り返し書く手間を省き、時間と労力を節約できます。プログラミングコミュニティでは、さまざまなライブラリが共有され、開発者にとって非常に価値のある資源です。

## API

**API（Application Programming Interface）**は、データの受け渡しや編集に特化したライブラリです。APIは、プログラム間のコミュニケーションを容易にし、データの交換や連携を可能にします。ウェブサービスやクラウドサービスなど、さまざまなプラットフォームがAPIを提供し、開発者はこれを使用して外部サービスとの連携を実現できます。APIは、異なるシステムやプログラム間でデータを共有し、連動させるための重要な要素です。

## Gem

**Gem**は、Rubyのライブラリの総称です。Rubyはプログラミング言語であり、GemはRubyプロジェクトで使う拡張ライブラリを指します。Rubyのエコシステムは非常に豊かで、Gemを使用することで、プログラムの機能を簡単に拡張できます。GemはRubyGemsというパッケージ管理システムを介してインストールされ、プロジェクトに必要な機能やライブラリを簡単に追加できます。これにより、Ruby開発者は既存のコードを活用し、効率的な開発が可能となります。

## フレームワーク

以上の要素に加えて、**フレームワーク**も重要な要素として存在します。フレームワークは、アプリケーション開発を助けるための包括的なライブラリと規約の組み合わせです。特に、Ruby on Rails（通称Rails）というフレームワークは、アプリケーション開発に便利な機能がデフォルトで用意されています。Railsは、データベースアクセス、ルーティング、ビューの管理など多くの機能を提供し、開発者はこれらを活用してアプリケーションを迅速に構築できます。フレームワークは、プログラムの骨格を提供し、コーディングの一貫性を保つために役立ちます。 Railsのようなフレームワークを使用することで、開発者はアプリケーションの基盤部分を効率的に構築し、ビジネスロジックやユーザーインターフェースに集中できます。

## まとめ
これらの要素は、プログラム開発において基本的で不可欠な要素であり、プロジェクトを効率的に進めるために活用されています。モジュールやオブジェクトはコードの構造化や再利用性向上に貢献し、コンポーネントはユーザーインターフェースの構築を効率化し、ライブラリとAPIは外部リソースの活用を可能にし、GemはRubyプロジェクトの拡張性を高めます。そして、フレームワークはアプリケーション開発において基盤を提供し、開発プロセスを効率化します。これらの要素を理解し、適切に活用することで、プログラム開発の効率性と品質を向上させることができます。
【Python】Slackアプリ作ってみる #1 メッセージ送信

Pythonを使って、Slackにメッセージを送信するSlackアプリを作りました:baby_tone1:
# Slack APPを用意

下記URLにアクセスして、Create Appをクリック

https://api.slack.com/apps

下記を入力してCreate Appをクリック
-　App Name:Slackアプリ名
-　Pick a workspace to develop your app in:Slackアプリをインストールするワークスペース

![スクリーンショット 2023-11-03 17.54.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3598712/24c47a93-1fd6-d9c8-da32-053d5f986c16.png)

左タブの「OAuth & Permissions」からScopesを設定する。
![スクリーンショット 2023-11-03 17.55.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3598712/d353b057-3a56-4aad-8068-d4d4c802d182.png)
今回はアプリがSlackに投稿する権限が必要なので、Bot Token Scopesに「chat:write」の権限を追加

左タブの「Install App」でInstall to Workspaceをクリックする。
するとトークンが表示されるのでメモしておく。

# ワークスペースにAppを追加
Slackで、アプリを追加したいチャンネルを右クリック　＞　チャンネル詳細を表示　＞　インテグレーション　＞　アプリを追加するをクリック。
すると下の画面になるので、先ほど作成したSlackアプリを追加する。
![スクリーンショット 2023-11-03 17.58.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3598712/50bc3ac1-44ed-2395-7ef0-1a5a4eca0322.png)

# コードを書いていくよ

今回はSlackが提供しているAPIの、「chat.postMessage」を使用してメッセージ送信していきます。

https://api.slack.com/methods/chat.postMessage

```post.py
import requests

TOKEN = '<トークン>'
CHANNEL = '<チャンネル名>'

url = "https://slack.com/api/chat.postMessage"
headers = {"Authorization": "Bearer "+TOKEN}
data  = {
   'channel': CHANNEL,
   'text': 'hogehoge'
}
r = requests.post(url, headers=headers, data=data)
print("return ", r.json())
```
トークンとチャンネル名は自分が使用するものに書き換えてください。

実行すると...
![スクリーンショット 2023-11-03 18.29.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3598712/431cea02-15db-371e-0353-a7d18f029531.png)
Slackにメッセージが投稿されました！！:clap:
git hub入門

# git hubとは？
- バージョン管理をしてくれる
- GitHubは共同作業用のWebベースのプラットフォーム

## バージョン管理とは？
- qiita.pdf
- 最新版qiita.pdf
- 修正版qiita.pdf
- 改善版qiita.pdf
- 提出用qiita.pdf

こうなってると1つ前のバージョンはどれかわからなくなると思います。

- qiita20230101.pdf
- qiita20230102.pdf
- qiita20230103.pdf
- qiita20230104.pdf

こうすると、容量自体がどんどん増えていき困る

一人でやってる分にこれでも問題ないですが、複数人のチームで作業するととんでもないことになります。

git hubなどを使えばこんなことにならず、簡単に履歴も辿れるし、容量も抑えられる

## branchとmerge
git hubを使う上で重要な機能が`branch`と`merge`です

![スクリーンショット 2023-11-03 18.24.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499102/c6126af9-2b21-8e79-8b7d-d986808966dd.png)

## branchを作成する

### 1. clone
desktopにcloneします。

mac
```terminal
ls

cd Desktop

git clone https://github.com/quantum-websolution/git_hub-practice.git
```

win

```terminal
dir

cd Desktop

git clone https://github.com/quantum-websolution/git_hub-practice.git
```
desktop上にgit_hub-practiceファイルがあればclone完了です

### 2. branch
win、mac共通

```
// ローカルにあるbranchの確認
git branch　

// ローカルにbranchを作成
git checkout -b branch名

git branch

```
git branchをしたときにmain以外のブランチが増えていればbranch作成完了です。


### 3. push

```
git add .

git commit -m "メッセージ"

git push
```
git hubのwebサイトを確認して画像のようになってればOK
![スクリーンショット 2023-11-04 1.52.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499102/26fcd35b-7931-940d-e4ac-f59cdf62b26b.png)

### 4. PR（pull request）を作成する

1. `Compare & pull request`をクリックする
![スクリーンショット 2023-11-04 1.55.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499102/82052227-143e-0e70-b669-34f0d4c54e55.png)

2. Add a titleを入力する
どんな変更を加えたか簡潔に書く
3. Add a descriptionを入力
どんな作業をしたか詳しく書く

4. Create Pull Requestをクリック

5. Merge Pull Requestをクリック

以上がgit hubの基本的な流れ
Ubuntuの導入手順

別にユニークな内容を記述している訳ではありません。
初心者なので、アウトプットとして備忘録としての記録です。
メンテナンスはたぶんしません。悪しからず。

## 前提
- 22.04LTS
- 64-bit PC
- ブートUSBを作成する方法で導入します。~~DVDドライバがない。~~

## 必要なもの
- 6GB以上のUSB
- ネット回線のつながるPC
- 導入する用のディスク（SSDなど）

## 手順
### LIVE USBの作成
まずは、なんかしらのOSが既に入っているPCでLive USBを作成する。
UbuntuのイメージファイルをダウンロードしてそのファイルからLive USBを作っていく。
1. 　ブートUSB作成ツールbalenaEtcherを ~~[GitHub](https://github.com/balena-io/etcher/releases "GitHub")~~ [公式サイト](https://www.balena.io/etcher "公式サイト")からSetup用exeファイルをダウンロード
     今回は`balenaEtcher-Setup-1.18.11.exe`
2. 　ダウンロードできたらSetup用のexeファイルを実行してbalenaEtcherをインストールする。
3. 　[公式ダウンロードサイト](https://releases.ubuntu.com/jammy/ "公式ダウンロードサイト")からイメージファイル(iso)を取得  
    今回は`ubuntu-22.04.3-desktop-amd64.iso`
4.   ブート用USBを接続する
4.   ブート用USBをフォーマットする（設定はデフォルトのままで◯）
5.   balenaEtcherを起動
6.   「Frash from file」からさっきダウンロードしたイメージファイルを選択
7.   「Select target」からブート用USBを選択する
8.   「Frash!」を実行

### Ubuntuインストール
Live USBからUbuntuをインストールする。
あとは[こちらの記事](https://eng-entrance.com/ubuntu-install)にしたがってポチポチ。
macos sonomaでもwineで東方をプレイしたい

新たな発見があれば随時書き足す．

## モチベーション

macos monterey 以前ではwineで(大方)問題なく東方projectを動かすことができたが, Ventura以降の環境ではまともにプレイするのが難しい. が, それをどうにかしたい.

ちなみにwineはthpracも動かせる. つよい.

## ネタバレ

~~vpatchがない作品(東方天空璋以降)では平均約100fpsになり, まともに動かない.~~ 
~~解決策募集中~~

(2023-11-05 追記)

~~東方天空璋は60fpsで動くようになった.~~

（2023-11-08 追記）
全ての作品が動くようになった.

詳細は[directx9.0cのネイティブ版のインストール](#directx90cのネイティブ版のインストール)を参照

## 本編

### 準備

東方・vpatchの実行ファイル自体をわかり易い場所においておく.
ここでは`~/Desktop/touhou/`に`th06`を置いたとする.
ファイルのバックアップをとっておくと幸せ.

homebrewをインストールしたことがなければインストールする.
参考: <https://qiita.com/zaburo/items/29fe23c1ceb6056109fd>

### wineのインストール

```shell:terminal
# wineとwinetricksのインストール
brew install --cask --no-quarantine gcenx/wine/wine-crossover
brew install winetricks
```

winetricksはwineの設定などをやりやすくしてくれるプログラム.
あると便利.

### wineの設定

##### ~/.wineのディレクトリを作成

wineでハードディスクとして扱われるディレクトリを作成する.

```shell:terminal
winecfg
```

待っているとウィンドウが一つ開くので, とりあえずcancelを押して閉じる.

##### wineの初期設定

```shell:terminal
# 使用するフォントをMSからIPAモナーに変更
winetricks fakejapanese_ipamona
# 表示される文字をなめらかにする
winetricks fontsmooth=rgb
```

#### 描画関係の設定

##### ビデオカードの設定(大事)

デフォルトの設定ではビデオカードが認識されない(すごく小さいと思われているのかも よくわかりません) そのときすごく遅くなるのでそれを解決する.

```shell:terminal
winetricks videomemorysize=2048
```

##### 言語設定

macはデフォルトではUTF-8環境であり文字化けするので, 設定を変えて実行する. この環境変数は`export`などで設定すると他のプログラムにも影響を与えるのでやらない. (2敗)

```shell:terminal
LANG=ja_JP.sjis wine hoge.exe
```

##### directx9.0cのネイティブ版のインストール

~~これは実行した方がいい場合とそうでない場合があるので,まずなしでやってみて, うまくいかなかったら実行する.~~

(2023-11-05 追記)

東方天空障以降の作品に対してはdirectx9のdllのnative版を使うようにする. そうでないとちゃんと動かない.
```shell:terminal
winetricks d3dx9
```

fpsを固定するd3d9.dllのラッパーを使う.
まず https://github.com/ThirteenAG/d3d9-wrapper/releases から`d3d9.zip`(**`d3d9_x64.zip`ではない**)の最新版をダウンロードして, 解凍する.
解凍されたフォルダの中にある`d3d9.ini`を以下のように編集する.

```ini:d3d9.ini
FPSLimit = 60
```

~~`d3d9.dll`と`d3d9.ini`をWINEPREFIX(デフォルトでは`~/.wine`)の中の`drive_c/windows/system32`に移動する. `d3d9.dll`は元あった同名のファイルを置き換える.~~
(2023-11-08 追記)
`d3d9.dll`と`d3d9.ini`を`thxx`の中に入れる

`winecfg`を起動し, 「ライブラリ」タブの検索窓に「d3d9」と打ち, 「追加」ボタンを押す.


### 実行してみる

元々の実行ファイル`東方紅魔郷.exe`では動かない.

```shell:terminal
cd ~/Desktop/touhou/th06
LANG=ja_JP.sjis wine vpatch.exe
```

東方天空障以降はなぜか1280x960のウィンドウサイズでないと黒い画面のまま動かない．

## 困ったことがあれば

ホームディレクトリにある`~/.wine`を削除すると環境をリセットできる.
セーブデータがある場合は`~/.wine/drive_c/users/crossover/AppData/Local/ShanghaiAlice`から取り出しておくこと.

`WINEPREFIX`の環境変数を
```
WINEPREFIX='~/hoge' winecfg
``` 
のように指定すると, そのディレクトリに別のwineの環境を作成してwineを動かすことができる.

### グラフィック関係

#### 文字が豆腐

原因: フォントがインストールできていない
対応:

```shell:terminal
winetricks fakejapanese_ipamona
```

#### 文字化けしている

原因: 言語・文字コードの設定がずれている
対応:

```shell:terminal
LANG=ja_JP.sjis wine hoge.exe
```

#### ウィンドウが小さい

`thxx`内の`vpatch.ini`を以下のように書き換える
```shell:vpatch.ini
width = 1100
height = 825
```

#### フルスクリーンにすると固まる

ウィンドウでプレイしよう.

### エラーたち

自分が遭遇したもの

#### `Wine cannot find the FreeType font library.`

freetypeの再インストール`brew reinstall freetype`で解決した.
元々入っていなければインストールで直るはず.

## 困ったことがなければ

お楽しみください.
Turboフレームワークと非同期通信

# Turboフレームワークと非同期通信

ウェブページを高速かつユーザーフレンドリーにする方法が、Turboフレームワークと非同期通信です。これらのテクノロジーは、ユーザーに待たせずにコンテンツを提供するために重要です。今回は、Turboフレームワークと非同期通信について分かりやすく説明します。

## Turboフレームワークとは？

Turboフレームワークは、Ruby on Railsの一部として提供されるライブラリで、ウェブアプリケーションの高速化に焦点を当てています。Turboは、Ajaxと非同期通信を活用してウェブページの読み込みを高速化し、ユーザーに優れたエクスペリエンスを提供します。では、Turboフレームワークの核心的なコンセプトを紹介しましょう。

### 1. Ajax（非同期JavaScriptとXML）

Ajaxは、「Asynchronous JavaScript and XML」の略で、ウェブページの非同期通信に利用されるテクノロジーです。非同期通信とは、ウェブページ全体を再読み込みせずに情報を読み込む方法を指します。通常、新しい情報を表示するためには、ページ全体を再読み込みする必要がありますが、Ajaxを使うと、必要な情報のみを読み込むことができます。

### 2. 非同期通信

非同期通信は、情報の送受信が同時に行われない方法を指します。情報を送信する際に、別の操作を行ったり、情報を受信する際にも他の操作を続けたりできます。この非同期性は、ユーザーがウェブページ上で動作するときに役立ちます。ウェブページ全体の再読み込みなしに、情報を読み込んで表示することができます。

## Turboフレームワークのメリット

Turboフレームワークを使用することで、ウェブエクスペリエンスに多くの利点がもたらされます。以下はその主なメリットです。

### 1. 高速なページ読み込み

Turboフレームワークを使うと、ウェブページはAjaxと非同期通信を活用して高速に読み込まれます。ユーザーは待たずにコンテンツを閲覧できます。ページ遷移がスムーズで、白い画面を見ることなくコンテンツが表示されます。

### 2. ユーザーフレンドリー

高速な読み込み速度により、ユーザーは快適なウェブエクスペリエンスを楽しむことができます。ページ遷移がスムーズで、コンテンツが即座に表示されるため、ユーザーは待たずに情報にアクセスできます。

### 3. バックボタンと履歴管理

Turboフレームワークは、ブラウザのバックボタンを適切に処理し、ウェブページの履歴を管理します。ユーザーは簡単に前後のページに移動でき、ウェブサイト内でのナビゲーションが容易になります。

### 4. リソース節約

Turboフレームワークは、非同期通信を通じて必要な情報のみを読み込みます。これにより、サーバーの負荷が軽減され、通信コストが削減されます。ウェブサイトのリソース効率が向上します。

## Turboフレームワークの活用

Turboフレームワークは、Railsアプリケーションの一部として使用できます。Railsを使ってウェブアプリケーションを開発している場合、Turboを導入してウェブページの高速化を実現できます。Turboフレームワークを活用するためには、Railsアプリケーションに組み込むだけで、ウェブページの高速化と改善が可能です。

## 結論

Turboフレームワークと非同期通信は、ウェブページの高速化とユーザーフレンドリーなエクスペリエンスの実珸として注目に値するテクノロジーです。Ajaxと非同期通信を活用することで、ウェブページの読み込みが速く、ユーザーが待たずにコンテンツを楽しむことができます。Turboフレームワークは、ウェブ開発の未来を明るくし、ウェブページの速さと使いやすさを実珸します。初心者からプロの開発者まで、Turboを使ってウェブアプリケーションのパフォーマンスを向上させることができます。このテクノロジーの進化は、ウェブの次のステップへの道を切り開いています。
「Python」 DocやDocxの暗号化と復号化

## はじめに
Word文書は、日常の業務で最もよく使用されるドキュメント形式の一つです。Word文書には重要な情報や機密情報が含まれている場合、文書の共有時のセキュリティは非常に重要です。そのような場合、文書を保護するためにパスワードを設定することができます。パスワードを知っている人だけが文書を正常に表示および編集することができます。この機能は、Word編集ソフトウェアまたは暗号化ソフトウェアを使用して実現することができます。この記事では**Python**を例に挙げて、プログラミングの方法で**Word文書を暗号化および復号化する**方法を紹介します。これは、関連するソフトウェアの開発や文書のバッチ処理に非常に役立ちます。
## ライブラリ
このチュートリアルでは、[Spire.Doc for Python](https://www.e-iceblue.com/Introduce/doc-for-python.html)ライブラリを使用します。これは、**docx**や**doc**などの形式の文書を処理するためのPythonプログラムライブラリです。参考コードについては、[Spire.Doc for Python](https://www.e-iceblue.com/Download/Spire-Doc-Python.html)パッケージをダウンロードして入手することができます。
## インストール方法
操作を行う前に、まず[Spire.Doc for Python](https://www.e-iceblue.com/Introduce/doc-for-python.html)ライブラリを**Visual Studio Code**にインストールしてください。以下にインストール方法を示します。
1.	「Explorer」-「NO FOLRDER OPENED」-「Open Folder」をクリックします。
2.	フォルダーを選択し、その中に 「.py」 ファイルを作成します。
3.	そのファイルを開いて、「Terminal」-「New Terminal」をクリックします。
4.	次のコマンドを入力して、Spire.Doc for Python と plum-dispatch v1.7.4 をインストールします。
```python
pip install Spire.Doc
```
もしまだVS CodeにPython拡張機能をインストールしていない場合は、まず[Python](https://www.python.org/downloads/)をダウンロードしてください。その後、VS Codeを開き、ExtensionsをクリックしてPythonを検索し、インストールしてください。
## Word 文書の暗号化：
### コード：
```python
from spire.doc import *
from spire.doc.common import *

inputFile = "C:/Users/Administrator/Desktop/Sample.docx"
outputFile = "C:/Users/Administrator/Desktop/ Encrypt.docx"

#Word文書を作成します
document = Document()

#Word文書を読み込みます
document.LoadFromFile(inputFile)

#パスワードを設定します
document.Encrypt("123456")

#docx ファイルとして保存します
document.SaveToFile(outputFile, FileFormat.Docx)
document.Close()
```
### コードの説明：
上記のコードでは、まず**Document**クラスを作成し、文書をロードします。そして、**Document.Encrypt()**　メソッドを呼び出して、文書のパスワードを設定します。最後に、docxファイルとして保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/e393b60c-91cf-4508-781d-30bbea1ac7d4.png)
## Word 文書の復号化：
必要な場合は、文書のパスワード保護を解除することもできます。
その場合、**Document.LoadFromFile()** メソッドを呼び出し、パスワードをパラメータとして入力します。そして、生成された文書を保存します。
```python
#パスワードでWord文書を読み込みます
document.LoadFromFile(inputFile, FileFormat.Docx, "123456")
```

## まとめ
上記は、Pythonコードを使用してWord文書を暗号化および復号化する方法の紹介です。
さらに、文書の編集範囲を設定することで文書を保護することもできます。
詳細な手順については、このチュートリアルを参照してください。
[Word 文書の編集制限を設定または削除する](https://www.e-iceblue.com/Tutorials/Python/Spire.Doc-for-Python/Program-Guide/Security/Python-Set-or-Remove-Word-Document-Editing-Restrictions.html)
【UE5 C++】C++でOverlapを呼び出すと継承したBlueprintが反応しない時の解決法

・タイトルの通りです。
UE5のC++でOverlapを呼び出すと継承したBlueprintが反応しない時の解決法です。
もしかしたら、ドキュメントに書いてあるのかもしれないですが、自分は解決法がわからず５時間も無駄にしたので忘れないために書いておきます。

環境：UE5.0.3(UE4.27)、VS2022

・まずどのような状況だったか。（わかりやすいようにただのActorですが、C++のコードのほうがCPP_でBlueprintの方をBP_にしています。）

１、C++でCPP_Actorを作成。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3599502/6447d358-e4a1-cc0c-1e11-ff9f8414f4d3.png)

２、BPに継承したBP_Actorを作成。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3599502/78b835f6-02e2-0bfa-25e4-46bf854ad9d8.png)

３、C++のコードの方で、OverlapBegin関数作成。

CPP_Actor.h
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3599502/e78771b2-42f0-3c39-8c39-0aea18f06a26.png)

CPP_Actor.cpp
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3599502/9a2ed99c-9ef3-14e4-bf74-65130d89426c.png)


４、当たり判定チェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3599502/4df55f34-b62b-6012-9f7e-f52cde2ded46.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3599502/e31da0a0-729d-7810-dcf5-b7725618b3d1.png)

５、反応しない！！！
当たっていたら左上にBomberというログが出る。



解決策
１、BP_Actorを削除

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3599502/50b614c7-a98b-19b6-d645-114ec0869894.png)

２、また継承したBP_Actorを作成。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3599502/592bd715-8341-6f24-12a5-a7a216ad1e99.png)

３、当たり判定チェック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3599502/9a1dcdec-4c4e-9fd1-df90-3c5dd6f6ad36.png)

４、反応！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3599502/509bdfdf-a934-a9b9-a08e-86bdf410f424.png)


この作り直すという作業が、自分は思いつかずコードを変えたり、ブループリント上で当たり判定の対象をいじったりしてかなり時間が取られました....

ちなみに最初にUE4.27をいじってる時に起きたので、UE5でも調べてみましたがどっちのバージョンでも起きましたね..なんでこんな仕様になってるんだろう:thinking:

同じ状況になった方にとっての解決策になれば幸いです！:rooster:



追記：プロジェクトのexeを右クリックしたら表示されるGenerate Visual stadioしたら治るときもある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3599502/a8b6e1c5-c8f8-f134-eb4c-68c64e9ad24b.png)
機械学習でPythonが遅いと感じた時の対処法

Pythonの処理が遅いと感じたことはありませんか？
私は常々思っています！

開発の仕様でどうしてもループやpandasで大きいDataFrameを使う際には、速度の問題は避けて通れない問題です。機械学習では大量のデータを使いますから尚更です。

Pythonも日々新しいライブラリが出ておりますし、高速計算ができるようなライブラリに変更をする。またはC++やRustのような言語を使ってPythonの処理を高速化させるという手段もあるでしょう。
しかし、高速化をするからといって安易に取り入れるべきではない手段があります。
特に会社などでのチーム開発ではあまりお勧めできない手段があります。

そこで、<b>Pythonの処理が遅いとき、どのように考えて処理するべきなのか</b>の私見を述べていきたいと思います。
＊実務での話を想定しています

<h2>基本的には最初にアルゴリズム・データの見直し</h2>
最初にやることも最も時間を割くべきところも「現行処理の見直し」です。つまり、<b>アルゴリズムやデータの効率が悪くなっているところを見直す</b>ということです。
始めから「じゃあライブラリを変えてみよう！」みたいな動きは良くないです。工数もかかりますし、修正する前後の処理も見直す可能性が高いです。

特にループ処理を入れたりすると確実に時間を取られることになります。
やるべき工夫としては、
- <b>ループ自体を減らす
- <b>ループ内での処理を簡略化する
- <b>ループで処理をするデータの持ち方・量を変える

などがあります。

本当にループでなければ処理できないかを考えたり、中間のデータの処理を効率化できないかを最初に考えるべきです。次からの手段は基本的なアルゴリズムやデータの見直し後に考えることをおすすめします。
同じ処理なのに書き方を変えると早くなることは多々あるので、まずは<b>同じ処理の違う書き方を色々試してみる</b>ことです。

<h2>ライブラリの変更</h2>
上記の方法でもどうしても簡略化できない処理があったり、精度を技勢にできずにデータ量を減らせないときは処理する<b>ライブラリの変更</b>も検討しなければならないかもしれません。
例えば、Pandasなどを使えばテーブルデータの処理は非常に楽になりますが、処理はどうしても遅くなります。

代わりに
- <b>numpyだけで処理できるようにする
- <b>pandasの代わりにpolarsを使用する
- <b>PySpark、Cpythonなどを使う

などのライブラリの使用を検討することもできます。

PolarsはPandasと書き方も似ている上に高速で処理ができますし、テーブルデータを処理するならばPysparkを使用してもいいかもしれません。また、そもそもpandasを使わずに処理できるならnumpyで処理できるようにアルゴリズムを変えることもできるかもしれません。

ボトルネックになっているものがライブラリならば、代替を使うという方法です。

ただし、この方法は場合によっては相当の工数がかかる場合があります。
また、機械学習モデルではデータの処理をするライブラリを変えたことで精度に影響する可能性もあります。

<h2>C++、 Rustを使う</h2>

それでも狙っている速度を出すことができない場合はPython使うこと自体も考えなければならないかもしれません。
特に画像分野のような計算量が膨大になる分野では、C++を使って処理を高速化することも考えられます。
C++は一般的にPythonよりも処理が早く、またPythonと組み合わせて使う手法はドキュメントも少なからずあるので実装すること自体は可能です。

しかし、この方法はチーム開発においてはあまりお勧めできない方法です。
それは<b>保守・運用のコストが上がってしまう</b>からです。

チームの全員がC++の記法に通じていれば問題ないかもしれませんが、将来的にずっとそうである保証はありません。
一般的にC＋＋は習得難易度が高い言語としても知られているので、自分以外に習得を促すことになりますがそれはメンバーに負担をかけることになってしまいます。
この手法は、特に新規開発でもない場合は最終手段であることは間違い無いでしょう。

<h2>まとめ</h2>
非常に簡単にまとめてしまいましたが、一番言いたいのは「<b>基本の処理を見直してみるべき</b>」ということです。
変更点が大きくなるほど、将来的にコストは嵩みますし負債になることもあります。
そもそものデータやアルゴリズムの効率化をすることを優先的に考えて、その他の手段はどうしてもの時としておくのがチーム開発においては無難です。
自分のLINEにメッセージを送るLINE Bot in LINE Messaging API

# 概要
LINE Messaging APIで個人lineにメッセージを送信する方法の基本形を紹介する.
BashとGASとPythonのそれぞれの場合について紹介する.
# 必要な準備
- LINE Messaging APIでチャンネルをあらかじめ作成
- Channel Access Tokenを発行して控える(チャンネル画面で発行可能)
- 自分のLINEのUser IDを控える(チャンネル画面で確認可能)
- 作成したチャンネルを自分の個人lineに友達登録する
# やり方
## Bashの場合
以下のコマンドを打ち込む([参考文献](https://developers.line.biz/ja/reference/messaging-api/#send-push-message))
```
curl -v -X POST https://api.line.me/v2/bot/message/push \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer チャネルアクセストークン' \
-d '{
    "to": "送り先のユーザーID",
    "messages":[
        {
            "type":"text",
            "text":"送りたいメッセージ1"
        },
        {
            "type":"text",
            "text":"送りたいメッセージ2"
        }
    ]
}'
```
## GASの場合
- あらかじめGoogle Apps ScriptでWebアプリを作成
- .gsファイルを作成し、以下のコードを入力
- 関数`sendMessage`を右上のメニューから実行する
```
const sendMessage = ()=>{
  const ACCESS_TOKEN = "チャンネルアクセストークン";
  const USER_ID = "自分のユーザーID";

  const URL = "https://api.line.me/v2/bot/message/push";
  const RES = UrlFetchApp.fetch(URL, {
    "headers": {
      "Content-Type": "application/json; charset=UTF-8",
      "Authorization": "Bearer " + ACCESS_TOKEN,
    },
    "method": "post",
    "payload": JSON.stringify({
      "to": USER_ID,
      "messages":[{
              "type":"text",
              "text":"送りたいメッセージ1"
          },
          {
              "type":"text",
              "text":"送りたいメッセージ2"
          }]
    }),
  });

  return RES;
}

```
## Pythonの場合
工事中
Databricksジョブのif/else条件タスクを試す

これは嬉しいエンハンス。

https://docs.databricks.com/ja/workflows/jobs/conditional-tasks.html#add-branching-logic-to-your-job-with-the-ifelse-condition-task

これまでにも、依存するタスクの成功・失敗に基づいて判断を行う [`Run if`の判定機能](https://qiita.com/taka_yayoi/items/0dd9a25629c3464e36ac#databricks%E3%82%B8%E3%83%A7%E3%83%96%E3%81%A7%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%8D%E3%81%A7%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B)がありましたが、これにさらに機能が追加される形になります。[ジョブやタスクのパラメーター変数](https://docs.databricks.com/ja/workflows/jobs/parameter-value-references.html)や[タスクバリュー](https://docs.databricks.com/ja/workflows/jobs/share-task-context.html)に基づいて処理を切り替えることができます。

https://docs.databricks.com/ja/workflows/jobs/conditional-tasks.html#run-if-condition-options

早速動かしてみます。

# ノートブックの準備

ノートブックを3つ用意します。

最初のノートブックではタスクバリュー`gender`に値を設定します。

```py:start
dbutils.jobs.taskValues.set(key = 'gender', value = 'Male')
```

タスクバリューの値に応じて呼び出されるノートブックを二つ用意します。

```py:male
print("男性です")
```

```py:female
print("女性です")
```

# ジョブの設定

ジョブを構成します。最初のノートブックをタスクとして追加します。
![Screenshot 2023-11-03 at 17.14.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/cbced428-43f9-e551-774f-c4dd47ded335.png)

タスクを追加して、一番下に表示される`if/else condition`を選択します。
![Screenshot 2023-11-03 at 17.14.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/af4e6a98-1c0d-e269-679b-ff7eee53fc2e.png)

判定ロジックを記述します。タスクバリューは`{{tasks.<タスク名>.values.<タスクバリューのキー>}}`でアクセスできます。
![Screenshot 2023-11-03 at 17.16.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e1cdeae5-6c78-a526-7948-63b780c82e94.png)

呼び出されるノートブックをタスクとして追加します。True/Falseのどちらに接続するのかは**依存先**で選択します。
![Screenshot 2023-11-03 at 17.17.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a6785fed-c880-4bc7-6234-bd0f01ed4fd3.png)
![Screenshot 2023-11-03 at 17.18.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/389e8cd7-f3dc-75ad-4e49-a5b5aaf28346.png)

# ジョブの実行

ジョブを実行します。実行結果からどのフローが実行されたのかを簡単に確認できます。
![Screenshot 2023-11-03 at 17.33.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/064fd2c2-798d-fdb1-c530-393e07a756f0.png)
![Screenshot 2023-11-03 at 17.33.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ce93094e-8b74-05d2-faa1-884bd24a7eb4.png)

ノートブック`start`を編集します。

```py:start
dbutils.jobs.taskValues.set(key = 'gender', value = 'Female')
```

(当たり前ですが)分岐が変化してます！
![Screenshot 2023-11-03 at 17.37.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1e588042-4b19-a422-427e-56d70b386998.png)
![Screenshot 2023-11-03 at 17.38.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1397fda2-d83f-5680-bb4a-4bac05809052.png)

ジョブの実行画面でも分岐を一覧することができます。
![Screenshot 2023-11-03 at 17.39.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d2316eb3-27ea-213b-d4a6-e98df65cadd3.png)


これまで以上にジョブで柔軟にロジックを構成することができます。是非ご活用ください！

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
【Reactアプリ100本ノック】04 Timer

![bandicam 2023-11-03 16-04-10-941.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/f8feddfa-519e-f033-9cb1-49ad10a4ad5f.jpeg)

# はじめに

<h3>こんにちは！！@Sicut_studyです！</h3>

https://qiita.com/Sicut_study/items/78910cd8d103b8d45a73

こちらの記事が嬉しいことに多くの方に見ていただきました。
そこで**React**が多くの初心者の方に注目されているんだなということを実感させられました。

私の記事では何度も言っている通り

<font color="red"><h4>最速で学ぶならとにかく何か作る</h4></font>

というのが大事になってきます。そこで **「Reactアプリ100本ノック」** というのに挑戦していこうかと思います。徐々に難易度を挙げていってどこまでお題を作りきれるかの腕試しでやっていただければと思います。

今回はさらに状態管理を応用的に利用して、効果音を流すライブラリも使用してみます

# 前回のお題

https://qiita.com/Sicut_study/items/5dec3c42c8f3c90f0487

# Reactアプリ100本ノックルール

- 主要なライブラリやフレームワークはReactである必要がありますが、その他のツールやライブラリ（例: Redux, Next.js, Styled Componentsなど）を組み合わせて使用することは自由
- TypeScriptを利用する
- 要件をみたせばデザインなどは自由

# 04. Timer

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/27f3cd63-6461-6559-1bcb-34e91783d09e.png)

## 問題

タイマーアプリを作成します

## 目的

タイマーアプリでは、Reactの根幹をなす状態管理、ライフサイクルメソッド、そしてイベント処理の実践を通じて、Reactの基礎を固めます

またsetTimeoutなど指定した時間に何かを実行するという関数を学んでいきます

## 達成条件

1. ユーザーは分と秒を入力してタイマーを設定できる。
2. スタートボタンを押すとカウントダウンが開始される。
3. 時間が0になったら、ユーザーに通知される (効果音が鳴る)
4. 一時停止ボタンを押すとカウントダウンが停止し、再開ボタンでカウントダウンが再開される。
5. リセットボタンでタイマーが設定時間に戻る。
6. 無効な時間（例：負の時間、非数値、60分以上の値）が入力された場合、エラーメッセージが表示される。

## 実際に解いてみた

### 利用技術

- React
- TypeScript
- Vite
- Emotion
- use-sound

解答時間 : 1.5時間

円形のプログレスバーを実装してみたのでけっこう大変でした。
またuse-soundを利用して0秒になったら効果音がなるようにしてみました
タイマーを使う人にとっては大事な機能になります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/467704b0-f0cc-28d8-d47c-e663eadf0efe.png)

# 次回

https://qiita.com/Sicut_study/items/c38b51907d18131b31f6

# おわりに

React100本ノックの記事を地道に上げていこうと思いますので、一緒に挑戦したい方は @Sicut_study をフォローいただけるととてもうれしく思います。
ここまで読んでいただけた方はぜひ**いいね**と**ストック**よろしくお願いします。

<h5>少し宣伝します🔥🔥🔥🔥🔥</h5>

これからエンジニアになろうとしている人を本気でコーチングして3か月の期間で立派なエンジニアにするようなチャレンジをしてみたいなと考えております。

もし、本気でエンジニアを目指してコーチングを受けてみたいという方がいれば、[Twitter](https://twitter.com/Sicut_study)に「プログラミング教えてほしいです」みたいなリプライ送っていただけたらなと思います！！

以上です。
今週もプログラミング頑張りましょう！

![bandicam 2023-10-04 20-58-54-525.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/f41a0065-b23e-1895-da22-66bf0e48c5fb.jpeg)

# 参考

https://soundeffect-lab.info/sound/button/

https://github.com/joshwcomeau/use-sound
#Preview を使用してSwiftUIビューを作成する！~Swift macros~

# #Previewでプレビューの定義が簡素化
Xcode15 および Swift5.9 以降では、#Previewを使用して SwiftUI ビューの作成の定義を簡素化することができます！これはWWDC2023リリースで導入されたSwift macrosの概念を使用しています。

https://developer.apple.com/documentation/swiftui/previews-in-xcode

## Swift macrosとは
Swift macrosは、ソースコードのコンパイル時にコードを変換し、その部分を生成することで、Swiftで繰り返しコードを作成することを回避できます。マクロの呼び出しは、常に加算操作です。つまり、マクロは新しいコードを追加しますが、既存のコードを削除したり修正したりすることはありません。

https://developer.apple.com/documentation/Swift/applying-macros

## SwiftUI #Previewの作成の比較

旧：　以前は、プレビュー構成を次のように記述していました！

```ContentView.swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            Text("Hello, world!")
        }
        .padding()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
```
新：　Xcode15以降、SwiftUI ビューのプレビューを作成するには、次のように実行できます！
```ContentView.swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            Text("Hello, world!")
        }
        .padding()
    }
}

#Preview {
    ContentView()
}
```
マクロを使用すると、プレビューの定義が簡素化することができる！
また、プレビューのタイトルを簡単に指定できるようになるというメリットもある！

## 複数のプレビューを定義する

```ContentView.swift
import SwiftUI

struct ContentView: View {
    var title: String
    var body: some View {
        VStack {
            Text(title)
                .font(.title)
        }
        .padding()
    }
}

#Preview("Yes Preview") {
    ContentView(title: "Yes")
}

#Preview("No Preview") {
    ContentView(title: "No")
}
```
#Preview("プレビューのタイトル")で、簡単にプレビューのタイトルが指定できる！
プレビューするビューごとに #Preview マクロを使用する！

以下のようにYes PreviewとNo Previewが作成されました！
![41fc38d5c3904440c67061b7b2e821fc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/76872d62-4f2b-6e83-0c70-fa9d83e2ab11.png)

![cc10b369ec025345acaee7be729a3540.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/fbc9d36e-76f9-e02d-9cf1-1718f326eb99.png)

# 参考文献

https://www.swiftlangjp.com/language-guide/macros.html

https://www.avanderlee.com/xcode/preview-swiftui-uikit-appkit-views/
NextCloudをロリポップサーバーで実装した際に共有ファイルで引っかかったこと

ネットには英語圏で同様の問題を抱えている人がいた様ですが、ソフトウェアのアップデートなどで解決している様で具体的な解決策が見つからず、色々試した結果、ロリポップのユーザー専用ページにて、php設定を8.2モジュール版にすることで解決。アドミンセッティングのエラーを消す方法は自分の契約内容だと厳しい様である。少なくともファイル共有の問題は解決した。
自分の環境だとiOSアプリもCGI版だとログインできないが、こちらで解決。

<h3>諸々の環境</h3>
Nextcloud Hub 6 (27.1.3)

PHP version 8.2（モジュール版）

ロリポップサーバー
成功在美國找工作的關鍵：海外工作面試訣竅

在現今全球化的時代，許多人夢想著在美國找到一份工作，追求更多的職業機會和個人成長。然而，要實現這一目標，你必須面對激烈的競爭，並通過英文自我介紹和英文面試展現自己的優勢。本文將分享一些關於成功在[美國工作](https://www.apexcharity.org/news/3/85)的關鍵訣竅，助你實現職業夢想。

1. 海外工作經驗的價值

當你申請在美國的工作時，[海外工作](https://www.apexcharity.org/news/3/86)經驗可能是你的一大優勢。這不僅證明了你的國際視野和適應能力，還表明你能夠在不同文化和工作環境中成功工作。在自我介紹和面試中，強調這些經驗，談談你在國際學校或國外實習的收獲和挑戰，以顯示你的價值。

2. [英文自我介紹](https://www.apexcharity.org/news/3/92)的關鍵

在面試前，練習一個流利而有說服力的英文自我介紹至關重要。這個簡短的介紹應該包括你的姓名、背景、學歷、工作經驗以及為什麼你對該職位感興趣。請確保你的自我介紹通順，避免緊張時出現的口誤，並在自己的故事中展現自信。

3. [英文面試](https://www.apexcharity.org/news/3/93)技巧

成功的英文面試技巧可以大幅提高你獲得工作的機會。首先，提前準備常見的面試問題，例如「談談你的強項和弱點」、「為什麼你適合這個職位」等等。這樣你就可以充分準備答案，不會在關鍵時刻措手不及。此外，請注意你的語調和身體語言，保持自信和專業。如果可能，找一位擁有英語面試經驗的朋友進行模擬面試，以獲得反饋和改進。

結語

尋求在美國找工作可能是一個具有挑戰性的過程，但通過充分準備和掌握英文自我介紹和面試技巧，你可以增加成功的機會。不要忘記利用你的海外工作經驗來區分自己，強調你的價值，並在每一次面試中展現出最好的自己。最後，相信自己的能力，堅持不懈地追求你的職業目標，成功將會屬於你。
エンジニアはサウナに入ろう

# 概要
読みました。サウナとITエンジニアは相性抜群？
サウナの良いところ、まとめました。

https://www.diamond.co.jp/book/9784478110317.html

# サウナのメリット
次のようなメリットがあります。
私自身も、サウナを定期的に利用しており、その効果を実感しています。
すごくないですか？

## 脳の疲労が解消される
サウナに入ると、脳波のα波が増加します。
これにより、脳を強制的に省電力モードに切り替えることができます。
人間の脳は、何を考えていなくても70％程度は使用されており、常に休まっていない状態です。
サウナに入ることで、脳を休ませることができます。

## 集中力が増加する
サウナに入ると、脳波のα波が良好な状態になります。
α波は、リラックスした状態にあるときに増加する脳波です。
α波が増加すると、集中力や記憶力や認知能力が向上します。
認知能力が増すということは、一度に頭の中に入れておける情報が増えるということです。
800x600よりも1920x1080の方が作業性が高いですよね。

## アイデアが溢れてくる
俗に言う"煮詰まった"状態を脱することができます。
サウナに入ると、脳の右前頭葉の一部に、脳波のβ波が増加します。
β波は、思考や判断に関わる脳波です。
β波が増加すると、発想力が向上し、新しいアイデアが生まれやすくなります。

## イライラしなくなる
サウナに入ると感情のコントロールがうまくなります。
サウナに入ることで自律神経に負荷が掛かって、鍛えられていくのです。
自律神経が鍛えられると、ストレスへの耐性が向上し、些細なことではイライラしにくくなります。

## 質のいい睡眠が得られる
サウナに入ると、深い睡眠をとる時間が長くなります。
深い睡眠は、疲労回復や記憶の定着に欠かせません。
一説によると体が疲れたと錯覚をして、休憩モードに入るのだとか。
ただし根拠は無いようです。

## 肩こりや腰痛が軽減される
サウナに入ると、筋肉がほぐれて血行が良くなります。
これにより、肩こりや腰痛の改善が期待できます。
また、ヒートショックプロテインという物質も体内で発現して、抗酸化作用によって体がダメージを受けにくくなります。肩こり腰痛が軽減される上に、耐性までつくのです。

# まとめ
紹介されていたメリットを、一部誤解を招くような表現で紹介しました。
サウナは、ITエンジニアにとってもメリットの多い健康法です。
ただし、正しい入り方で入らないと上記の効果は得られない上に危険です。
サウナ初心者の方は注意してください。
ちなみに、この本を読んで友人に力説してみたところ、宗教みたいで怪しいと指摘されてしまいました。
Snowflake Pythonワークシートでpandasパッケージを選択するとエラーになるのだが

# 結論

選択しなければいい。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475867/5711320a-c880-1f2e-cfc4-62ef01773d48.png)

もしくは、pandas 〜1.5.3 を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475867/569bf370-1ec5-7a8a-0f67-4f763174e44e.png)


## なんかエラーが出るようになった？

Pythonワークシートでpandasパッケージを選択して以下のようなコードを実行しようとした。

```python
import snowflake.snowpark as snowpark
import pandas as pd
from datetime import datetime


def main(session: snowpark.Session): 
    df = session.create_dataframe(
        pd.DataFrame(
            [[1, datetime.now().strftime("%m/%d/%Y %H:%M:%S")]],
            columns=["No.", "timestamp"]
        )
    )
    df.show()
```

pandasパッケージは以下のように選択しておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475867/267d7628-3b00-cf90-9164-09ef7fc1a252.png)

いざ実行。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475867/90ae5fe0-799a-32c1-3b82-c4e690ab2ab4.png)

```text
100357 (P0000): Cannot create a Python function with the specified packages. Please check your packages specification and try again.
```

エラー...?
もしかしてpandasはあかんの？

と思って、とりあえずInstalled Packagesからpandasを外して再実行してみた。

すると...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475867/5711320a-c880-1f2e-cfc4-62ef01773d48.png)

いけるんかーい。

どうやらPythonワークシートではpandasは指定せずとも使えるらしい。
選択が必須だと勘違いしていた...。

元々pandasを選択していたのか、選択せずに実行していたのか...
最近このような挙動になったのか...
覚えてない。分からない。

念の為pandasバージョンを 2.0.3 -> 1.5.3に変えてみると...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475867/569bf370-1ec5-7a8a-0f67-4f763174e44e.png)

いけた。
バージョン問題でもあるらしい。


## 何も指定しない場合の挙動は？

確認してみる。

```python
import snowflake.snowpark as snowpark
import pandas as pd


def main(session: snowpark.Session): 
    print(pd.__version__)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475867/bed39aef-d3c6-e99c-ce56-70d6e4361e03.png)

なるほど。
つまり、今(2023/11/3頃)のところは以下の模様。

- pandasパッケージを指定せずとも使える
- 今は1.5.3がPythonワークシートで使用できる最新版
- 指定しない場合はデフォルトでpandas 1.5.3 がインストールされている状態になっている
- あえて指定する場合は使用できるバージョンを選択する

ん〜。
とりあえずミニマムでimportしていたから気付けたからいいものの。
いろんなパッケージを選択してimportしているとなかなか分からんて...
[SAA-C03]Amazon AppFlow

# 更新日
- 2023/11/03 初回

# [Amazon AppFlow](https://aws.amazon.com/jp/appflow/)

## これ何？[^1]
SaaSとAWSサービス間を自動化する仕組み。

## 何が便利？
- NoCodeでサービス間の連携が可能[^5]

## 利用例
- SalesForceと連携しCRM情報をS3へバックアップ[^4][^5]
- GoogleAnalyticsと連携可能な独自のマーケティングサービスを展開できそう
- Slackと連携しS3にデータを配置[^2][^3]

ここ[^6]にあるサービスを見てるだけでいろんなことができそうで夢が広がるね


# 実装[^7]
のちほど追記します

# Ref
[^1]: [GraphQLとはなんでしょうか。](https://hasura.io/learn/ja/graphql/intro-graphql/what-is-graphql/)
[^2]: [Amazon AppFlow を使用して Slack アプリから Amazon S3 にデータをロードする方法を教えてください。](https://repost.aws/ja/knowledge-center/appflow-slack-data-s3)
[^3]: [Create Slack App](https://catalog.us-east-1.prod.workshops.aws/workshops/9787ec94-1ace-44cc-91e5-976ad7ddc0b1/en-US/slack/create-slack-app)
[^4]: [Amazon AppFlow をはじめよう](https://trailhead.salesforce.com/ja/content/learn/modules/amazon-appflow/get-started-with-amazon-appflow)
[^5]: [Amazon AppFlowでSalesforce ⇔ S3の連携を試してみた](https://dev.classmethod.jp/articles/amazon-appflow-saelsforce-s3/)
[^6]: [Amazon AppFlow 統合](https://aws.amazon.com/jp/appflow/integrations/)
[^7]: [AWS::AppFlow::Flow](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appflow-flow.html)
[^8]: [Pub/Sub とは](https://cloud.google.com/pubsub/docs/overview?hl=ja)
[^9]: [Pub/Sub メッセージングとは何ですか?](https://aws.amazon.com/jp/what-is/pub-sub-messaging/)
[^10]: [Amplify で Slack アプリつくってみた](https://qiita.com/HayatoW/items/e2ed24dcf54f352616ad)
[^11]: [GraphQLにおけるSubscription処理について(実装例: Amplify + AppSync)](https://qiita.com/yoshii0110/items/3d9ec03215537646b65c)
[^12]: [AWS AppSync のお客様](https://aws.amazon.com/jp/appsync/customers/)