OmniAICreator/Qiita-1.07M huggingface dataset:
matplotlib-cppでエラーにハマった話。error: ld returned 1 exit status

# 前置き
最近、数値計算する言語をpythonからcに移植しています。
cでグラフをプロットするのに良いライブラリはないかと探して、matplotlib-cppがおすすめされていたので軽い気持ちで使おうとしたらエラーにハマりました。
    [lava/matplotlib-cpp](https://github.com/lava/matplotlib-cpp/blob/master/README.md)

環境はVScodeのDockerのc++向けのubuntuサンプルを少しいじっただけだったので環境のせいではないと思います。(一応末尾にDockerfile載せときます)

先にオチを言ってしまうと、matplotlib-cppに限った話でなく、外部ライブラリを使うときにはそのライブラリが内部で使っている他のライブラリを入れたり、ライブラリパスやライブラリ自体を指定し無ければなりませんでした。

# エラー
まず1のエラーがでて、1を解決したら2のエラーに悩まされました。

1. `fatal error: Python.h: No such file or directory`

    matplotlib-cpp.hないで使うpythonヘッダがないよっていうエラー。


2. `error: ld returned 1 exit status`
    (おそらくこの場合は)ライブラリが不足していて未定義の関数, 変数があるよっていうエラー。
chatGPT様に聞いたところ、/usr/bin/ldにはLinuxシステム上で使用されるリンカー(linker)プログラムの実行可能ファイルがあり、オブジェクトファイルのリンクに問題が無ければ0, 問題があれば1を返すのだそう。

# 解決策
1.
    環境にpython, matplotlib(+numpy)パッケージをインストールして、インクルードパスを指定しなければなりませんでした。numpyに限ってはコンパイル時に`WITHOUT_NUMPY`を指定すれば入れてなくてもいいそうです。
    ```terminal
    apt install libpython3-all-dev python3-matplotlib python3-numpy
    ```
    Dockerfileに書いておくと楽ですね。
    実行時は`-I/usr/include/python3.10`のようにiclude以下のpythonまでパスを指定します。Macでhomebrewを使っている方ならパスは
`/opt/homebrew/include/python3.10`になるんでしょうか。

2. 上でライブラリを入れても、それをコンパイラに認識してもらわなければなりませんでした。
    `-L/usr/lib/python3.10 -lpython3.10`のようにライブラリのパスと使用するライブラリを指定すれば大丈夫でした。

結果的にコンパイル時のプロンプトは
```terminal
g++ -O3 -std=c++20 animation.cpp -I/usr/include/python3.10 -L/usr/lib/python3.10 -lpython3.10
```
となりました。animation.cppはmatplotlib-cppのサンプルコードです。pythonのバージョンはその時々でインストールされたものに変えてください。
vscodeを使っている方はsettings.jsonで"code-runner.executorMap"を編集すれば毎回入力しなくて済みますね。

# Dockerfile
```Dockerfile
FROM mcr.microsoft.com/devcontainers/cpp:0-ubuntu-22.04
ARG REINSTALL_CMAKE_VERSION_FROM_SOURCE="3.22.2"

\# Optionally install the cmake for vcpkg
COPY ./reinstall-cmake.sh /tmp/

RUN if [ "${REINSTALL_CMAKE_VERSION_FROM_SOURCE}" != "none" ]; then \
        chmod +x /tmp/reinstall-cmake.sh && /tmp/reinstall-cmake.sh ${REINSTALL_CMAKE_VERSION_FROM_SOURCE}; \
    fi \
    && rm -f /tmp/reinstall-cmake.sh \
    && apt update \
    && export DEBIAN_FRONTEND=noninteractive \
    && apt install -y \
    libeigen3-dev \
    libpython3-all-dev \
    python3-numpy \
    python3-matplotlib
```

# 参考
stackoverflowのおかげで解決できました。
[c言語からpythonを埋め込んだ場合に-py-initializeが存在しないエラーが発生する](https://ja.stackoverflow.com/questions/28907/c言語からpythonを埋め込んだ場合に-py-initializeが存在しないエラーが発生する)

#
間違っている所などありましたら、コメントで指摘お願いします。
github copilot 使用メモ

github copilot を使ってコメントから簡単なスクリプトを作成してもらいました。
その上でいくつか気づきがあったのでメモしておきます。

----

## 生成するスクリプト

以下のようにボタンをタップさせて次の画面を表示させる簡単な画面があり、これに二重送信を防止するため、タップやクリックされたらボタンを非活性にする制御を javascript で入れることを考えています。

```erb:erb
<div class="container">
  ボタンをタップして下さい。<br>
  <br>
  <button id="nextButton">
    結果を確認する
  </button>
</div>
```

ちなみに想定しているのはこんな感じのスクリプトです。

```erb:理想
<script>
document.querySelector('#nextButton').addEventListener('click', event => {
  event.target.disabled = true
})
</script>
```

## 試行錯誤
今回は以下のように `script` タグにコメントだけ書いて github copilot に残りのコードを書いてもらうことにします。

```erb
<script>
// ボタンをタップしたら、ボタンを非活性にする  
</script>
```

ちなみに上記で生成されるのがこちら

```erb
<script>
// ボタンをタップしたら、ボタンを非活性にする  
$('#nextButton').on('click', function() {
  $(this).addClass('disabled');
});
</script>
```

割といい線のスクリプトを提示してもらいましたが今回は jQuery を使ってないのと、css クラスではなく `disabled` 属性を指定してほしいのでもう少しコメント変えて指定していきます。



```erb
<script>
// ボタンをタップしたら、二重タップ防止のためにボタンを非活性にする
$('#nextButton').on('click', function() {
  $(this).addClass('disabled');
});
</script>

<script>
// ボタンをタップしたら、二重タップ防止のために addEventListener を用いてボタンを非活性にする
$('#nextButton').on('click', function() {
  $(this).get(0).addEventListener('click', function() {
    return false;
  });
});
</script>

<script>
// ボタンをタップしたら、二重タップ防止のために addEventListener と querySelector を用いてボタンを非活性にする
$('#nextButton').on('click', function() {
  document.querySelector('#nextButton').addEventListener('click', function() {
    return false;
  });
});
</script>

<script>
// 二重タップ防止のために、ボタンがタップされたら addEventListener と querySelector を用いてボタンを非活性にする
document.querySelector('#nextButton').addEventListener('click', function() {
  return false;
});
</script>

<script>
// 二重タップ防止のために、ボタンがタップされたら addEventListener と querySelector を用いて、2回目のタップができないようボタンを非活性にする
document.querySelector('#nextButton').addEventListener('click', function() {
  document.querySelector('#nextButton').addEventListener('click', function() {
    return false;
  });
});
</script>

<script>
// 二重タップ防止のために、ボタンがタップされたら addEventListener と querySelector を用いて、disabled 属性を付与する
document.querySelector('#nextButton').addEventListener('click', function() {
  document.querySelector('#nextButton').setAttribute('disabled', true);
});
</script>

<script>
// 二重タップ防止のために、ボタンがタップされたら disabled にする
document.querySelector('#nextButton').addEventListener('click', function() {
  document.querySelector('#nextButton').disabled = true;
});
</script>
```

色々コメントの順番や具体的な関数名等をこねくり回してそれっぽいコードになりましたがこの辺で切り上げました。
試してみた感想として、

- コメントの内容がほぼ同じでも順序によって生成されるコードが変わってくる
- javascript の場合は jQuery を使用する頻度が高いっぽい

なのでどちらにしても AI にとっての適切なコメントをある程度推敲することが重要そうだと感じました。

なお上記には書いてないですが、コードの行間に以下のようなコードを入れる提案もしてくれるためコードを補足してもらう使い方も使いこなせるようになると良さそうです。

```js
event.target.innerHTML = '処理中...';
```
【RubyKaigi2023】Ruby対応されたDebug Visualizerを試してみた

## この記事は何

RubyKaigi2023 2日目のセッションの内容を自分でも試してみた記事になります！
セッションはこちらになります！

https://rubykaigi.org/2023/presentations/ono-max.html#day2

こちらで紹介されていたDebug Visualizerを実際に使えるようにする方法を書いていきます。

## Debug Visualizerとは

Visual Studio Code(以下VS Code)の拡張機能になります。

https://marketplace.visualstudio.com/items?itemName=hediet.debug-visualizer

テーブル形式だけではなく、グラフなどいろいろなビジュアライゼーションの方法が提供されているのが特徴に感じます。

こちらの拡張機能ですが、昨年の11月にRuby Debug Gemと組み合わせることで、Rubyにも対応されました:tada:

https://github.com/hediet/vscode-debug-visualizer/pull/159

## 使い方

筆者はRuby3.2の環境で実際に試しています。

### Gemのインストール

`debug`と、`debugvisualizer`をインストールします。
`Gemfile`に下記を記載して、bundle installを実行します。

```ruby:Gemfile
# frozen_string_literal: true

source "https://rubygems.org"

gem "debug"
gem "debugvisualizer"
```

### .rbファイルの作成

雑にapp.rbを書きます。
Integer、Array、Hashのデータを用意して、これを表示するようにしてみます。

```ruby:app.rb
# frozen_string_literal: true

NUM = 5

num_array = [2, 3, 5, 1, 4]

test_hash = [
  { id: 1, name: 'taro' },
  { id: 2, name: 'jiro' },
  { id: 3, name: 'saburo' },
  { id: 3, name: 'shiro' },
]

puts 'Hello, World'

```

### VS Codeの拡張機能のインストール

2つの拡張機能をインストールします。

- [ruby-debug](https://marketplace.visualstudio.com/items?itemName=castwide.ruby-debug)
- [debug-visualizer](https://marketplace.visualstudio.com/items?itemName=hediet.debug-visualizer)

これで利用のための準備は整いました。

## Debug Visualizer を使ってみる

- ブレークポイントを設定し、debuggerを起動する

![スクリーンショット 2023-05-13 0.46.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166596/2182dc30-7f9e-18b9-5d4e-0fb38f248632.png)

- Debug Visualizerを表示する
  - コマンドパレットから、`> Debug Visualizer: New View` を選択する

下記のような画面がVS Codeの右半分くらいに表示されます。

![スクリーンショット 2023-05-13 0.45.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166596/e8b599b3-dc5b-f122-10f2-902428f929c4.png)

- 変数の値をVisualizeしてみる

入力ウィンドウに変数名/定数名を入力することで、その変数の値を表示することができます。

Integer、定数も表示できる

![スクリーンショット 2023-05-13 0.49.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166596/9194900a-aa2a-9e3f-b792-07275527c8b0.png)

Arrayはデフォルトで、線形で表示されます。

![スクリーンショット 2023-05-13 0.50.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166596/6e999e22-c505-d3d5-758d-949834d98b5d.png)

Hashの場合は、テーブルの形で表示されます。
Debug Visualizerの方で、ソートしたり、表示する順番を変えることができます。
Filterなどは、自分の環境では動かすことができませんでした...

![スクリーンショット 2023-05-13 0.57.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166596/20249e49-41e5-355a-a507-a32c747f132d.png)

セッションのデモでは、ActiveRecordで取得した値をテーブル形式でvisualizeするなども行っていました。

## 終わりに

実際にセッションで紹介された、`debug-visualizer`を触ってみました。
データがvisualiseされるので、とてもわかりやすくて面白いですね。
Ruby以外にもさまざまな言語で適用することができるので、プログラミングを始めたばかりの方などは使ってみると理解しやすくなるのかなと思いました。

Railsのアプリケーションにも組み込んだりして、もっと試してみたいなと思います。
また、同セッションでは、ruby-debug拡張機能のTrace Inspectorという機能がメインで紹介されていました。
こちらも便利だなと思ったので、試して記事にしたいと思います！
【Docker】コンテナからホストにアクセスする

## コンテナからホストにアクセス

`host.docker.internal`を使用することでコンテナ内からホストマシンにアクセスできます。

`host.docker.internal`を使用するとホストマシンのIPアドレスを指定する必要がなくホストマシンのIPアドレスを自動的に解決することができます。

ただし`host.docker.internal`はDocker Desktopの開発環境でのみ対応しています。



https://docs.docker.com/desktop/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host
AWS アカウントの OU 間移動を IAM ポリシーで制御する

## やりたいこと
* AWS Organizations でメンバーアカウントを Organizational Unit (OU) 間で移動する権限を付与したい
* 特定のアカウントや OU 間のみ移動可能とする

例えば意図しないアカウントの閉鎖やルートアカウントの操作などを Service Control Policy (SCP) で拒否しているとします。それらの操作が本当に必要になった際に当該 SCP が設定されていない OU にアカウントを移動し作業を行うようなケースを想定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/1a22bd56-c021-ac9e-902f-b6013cf50a8e.png)

## 制御例
アカウントの移動を行うには MoveAccount アクションを許可する必要があります。以下のドキュメントに記載のとおり、ルート、OU、アカウントレベルの権限制御をサポートしています。

https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsorganizations.html#awsorganizations-actions-as-permissions

例えば前述の例で Prod OU と Suspended OU 間の移動を許可する場合は以下のようなポリシーになります。

```json
{
    "Sid": "AllowMoveAccount",
    "Effect": "Allow",
    "Action": "organizations:MoveAccount",
    "Resource": [
        "arn:aws:organizations::123456789012:ou/o-yyyyyyyyyy/ou-xxxx-bbbbbbbb",
        "arn:aws:organizations::123456789012:ou/o-yyyyyyyyyy/ou-xxxx-dddddddd",
        "arn:aws:organizations::123456789012:account/o-yyyyyyyyyy/*"
    ]
}
```

注意点としては親 OU を Resource 句に指定しても、その親に紐づく子 OU は許可されません。許可する OU をすべて羅列する必要があります。

アカウント ID については上記の例では組織内の全アカウントを許可しています。アカウントを絞りたい場合は、許可リスト形式でアカウントをリストするか、以下のように拒否リストを追加して Deny することもできます。

```json
{
    "Sid": "DenyMoveAccount",
    "Effect": "Deny",
    "Action": "organizations:MoveAccount",
    "Resource": [
        "arn:aws:organizations::123456789012:account/o-yyyyyyyyyy/222222222222"
    ]
},
{
    "Sid": "AllowMoveAccount",
    "Effect": "Allow",
    "Action": "organizations:MoveAccount",
    "Resource": [
        "arn:aws:organizations::123456789012:ou/o-yyyyyyyyyy/ou-xxxx-aaaaaaaa",
        "arn:aws:organizations::123456789012:ou/o-yyyyyyyyyy/ou-xxxx-bbbbbbbb",
        "arn:aws:organizations::123456789012:account/o-yyyyyyyyyy/*"
    ]
}
```

簡単ですが以上です。
参考になれば幸いです。
ER図について勉強してみた【初心者】

## はじめに
プログラミング勉強中の👶です。
理解を深めるために日々の学びを記事にしています。
初心者の記事なので言い回しや記載に誤りがあるかも知れませんが、暖かく見守っていただけると幸いです。
<font color="gray">(よろしければ間違いをコメントいただけると学び、励みになります！)</font>

## 学んだこと
・ER図の書き方
・ECサイトのER図を実際に書いてみた（お遊び）

## ER図とは
ER図は、「Entity Relationship Diagram」の略でデータベースの関係を体系化したものです。

## ER図の構成
- エンティティ：実体（登場人物や物、概念など）
- アトリビュート：属性（エンティティの付加情報）
- リレーション：エンティティ同士の関係性
- カーディナリティー：エンティティ間の多重度

![若手プログラマー必読！５分で理解できるER図の書き方５ステップ | NTTコミュニケーションズ 法人のお客さま](https://www.ntt.com/content/dam/nttcom/hq/jp/business/services/data-utilization/dxplatform/sdpf/knowledge/img/archive_50-01.png)
引用: [若手プログラマー必読！５分で理解できるER図の書き方５ステップ | NTTコミュニケーションズ 法人のお客さま](https://www.ntt.com/business/sdpf/knowledge/archive_50.html)

## ER図を設計する
下記の流れでデータベースを設計していきます。
1.  エンティティを洗い出す
2.  要件から属性を抜き出す
3.  重複するもの（繰り返し項目）は分割する = データの正規化
4.  外部キーで置き換える
5.  マスタ項目を分割する
7.  多重度を考える

## 完成はこんな感じになりました。
ER図に作成にはdraw.ioを使用しました。
![Untitled Diagram.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736096/d5678f06-438d-97bc-bfa7-d0237ef868a6.jpeg)

**1.エンティティを洗い出す**
どんなテーブルがいるかな〜と考えます。
- 顧客関連: 
　顧客(会員情報を登録する)
　配送先住所(注文者以外の配送先の登録用)
- 商品関連: 
　商品(商品を登録する)
　商品ジャンル(検索機能実装する際の絞り込みに使用)
- 注文関連: 
　カート商品(注文内容の仮の保管場所)
　注文商品(注文が確定した後の保存場所)
　
カート機能はDBでなくセッションに保存するという方法もあるようです。この場合、Webサイトから離れたり、セッションが切れるとカート内の情報が消えてしまいます。今回はWebサイトから離れていた場合もカート情報を記録しておくことを前提としました。
　
**2. 要件から属性を抜き出す**
**3. 重複するもの（繰り返し項目）は分割する**
**4. 外部キーで置き換える**
どんなカラムがいるかな〜と考えます。
意識したことは下記です。
- 実際にDBに使用することを意識して属性名を考えました。その際に命名の作法を調べて、具体的にどういう値なのか？が想像できる名前にしました。
- プログラム上で処理できる項目は入れないようにする。
　例えば、商品エンティティに税込価格と税抜価格の両方を登録する必要があるでしょうか？私は不要と思います。プログラミング上で簡単に計算できるためDBに記録しておく必要がないと考えたためです。
　
また個人的に複数の商品を同時発注するための仕組みがイメージしづらく、苦戦しました。
注文の一連の流れを以下とします。
1. 顧客が商品を選択して個数を登録する=>カート商品テーブルに保存 (商品名 x 個数)
2. 顧客が注文を確定させる=>① 注文商品テーブルと②注文テーブルに注文内容を登録する
具体的には、① 注文商品テーブルにカート商品テーブルの内容を写します。また、どの商品が1回の注文の纏まりであるか判別するために注文id(後述の②注文テーブルの主キーidです)を副キーに登録します。②には主に注文に関する情報を記載します。どの商品がいくつ注文されたかについては、①注文商品テーブルでidで引き出せば問題なさそうですね。

**5. マスタ項目を分割する**
運用上、レコードの内容を変更する可能性があるものはマスタテーブルとして分割することがある。今回は、商品ジャンルをマスタ項目に設けました。

**6. 多重度を考える**
リレーションの確認をする。下記は推奨されないリレーションです。
- 1対1のリレーション：通常テーブルをまとめることができる
- 多対多のリレーション：正規化がうまくできず、整ったデータの持ち方ができない => 中間テーブルを作る


## 作ってみた感想
正直これが正解なのか・？という疑問はあります。実際のECサイトは値の変動や記録しておく値も多く、セール等もやっているので、もっと複雑なんだろうな。。と思いました。データベース設計の難しさに触れられたことは良い学びでした。
実際に運用されているデータベースも知りたいと思いました(好奇心と怖いもの見たさ)


終わり
【メモ】GitHubエラー：プッシュがうまくいかない場合の対処法

## エラー内容
```  git:git:err
>git push main master
error: src refspec master does not match any
error: failed to push some refs to 'https://github.com/koinunopochi/ChatEasyAPI.git'
```
### エラー発生状況
vscodeでGitHubに新しく作成したリモートレポジトリにフォルダプッシュしようとしたところ、このエラーが発生した。
![2023-05-12_23h10_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/38c514d3-dd19-57bc-5738-5d14afeb04dc.png)からプッシュ先を「main」に変更した気になったまま __プッシュ__ したところ発生

### エラー原因
エラーメッセージから、「master」ブランチが存在しないため発生とある通り、指定したはずの「main」ではなく「master」にプッシュしようとして失敗している。

### 解決法
#### 1
```
git branch -m master main
```
を用いて、ローカルの設定を「master」から「main」に変更する
#### ２
リモートで、mainを作成してしまう

### まとめ
他にも
```
git push origin main
```
などがあるようだが、ひとまず解決法1，2で解決できそうなので、今後慣れてきたら他の方法も探していこうと思う。
ZshとPrezto: あなたのターミナル環境をアップグレードする完全ガイド(環境構築メモ)


## 初めに
本稿では、ターミナル環境であるZshとその設定フレームワークPreztoのインストールと設定方法についてのメモを残す。この2つのツールは、コマンドライン操作をより効率的に行うための重要なツールである。

Zshは、Bashと並ぶ人気のシェルの一つで、機能的で拡張性のある特性を持つ。その豊富な機能とカスタマイズ性を活かすための設定フレームワークとして、Preztoが存在する。

## 筆者の環境
- ubuntu22.04
- mac(M1) → Preztoのインストールから作業開始
## zshのinstall
Zshのインストール方法を説明する。端末を開き、次のコマンドを実行する。

```shell
sudo apt update
sudo apt install zsh
```
このコマンドにより、Zshがインストールされる。次に、デフォルトのシェルをZshに変更するためのコマンドを実行する。

```shell
---------------
webarenaのubuntuの場合
sudo passwd ubuntu
New password:＜任意のpassworを入力＞
Retype new password:＜再度任意のpassworを入力＞
---------------

chsh -s $(which zsh)
```
システムを再起動し、デフォルトのシェルがZshに変更されていることを確認する。
```shell
echo $SHELL
```

出力結果が /usr/bin/zsh または /bin/zsh のようになっていれば、Zshのインストールは成功であると言い切ることができる。


## Preztoのインストール
次に、Preztoのインストール方法を説明する。まず、Zshを起動し、次のコマンドを実行する。

```shell
#gitがなければ
sudo apt install git
#macの場合
brew install git

#Preztoのインストール
git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
```
このコマンドにより、Preztoのリポジトリがクローンされる。次に、設定ファイルを作成またはリンクするためのコマンドを実行する。

```shell
setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
```
Zshを再起動する。


## 最後に
以上の手順により、Preztoのインストールが完了する。Preztoの設定は ~/.zpreztorc ファイルで行うことができる。利用者の好みに合わせて設定をカスタマイズすることが可能である。
BigqueryテーブルをSQLでもっと自由自在に！


## 概要
BigqueryではGUIでテーブル作成スケジューリングさせてテーブル作成を実行することができて非常に便利です。

その他、jsonファイルのテーブル作成活用やcloud shellでの作成方法など様々な手法がございますがデータベース言語でもっと自由自在にテーブルを操りたい！と考えた方に向けて本記事を投稿します。

作成/追加/変更などなど

今回はSQLでテーブルに変化を加えるクエリをまとめてみました。

![gcp.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180499/b722eded-8194-2da2-1223-99b550439e9a.jpeg)


## テーブルを作成 or 変化を加えるＳＱＬ

### テーブル作成
引用：[【BigQuery】CREATE文を使えるの知ってた？SQLでテーブル作成](https://gri.jp/media/entry/3636)

```sql

CREATE TABLE {[project_id].}[dataset_name].[table_name]
-- CREATE TABLE IF NOT EXISTS は同名のテーブルが不存在なら作成
-- CREATE OR REPLACE TABLE 同名のテーブルが存在した場合、テーブルが置換
-- テーブルを別種類のパーティショニングで置き換え不可
(
  [column_name a] [data_type] {NOT NULL} {OPTIONS(description="[description_text]")}
  , [column_name b] ...
-- 各新規作成するカラムの型情報などを設定
)
{ PARTITION BY [partition_expression] }
-- パーティション設定可能/castして変換処理が必要な場合がある
-- パーティションとは後述
{ CLUSTER BY [column_name　a] }
-- クラスター化させたいカラムを設定/複数[カラム名,]で複数設定可能
{ OPTIONS (
    [option_name1] = [value]
    , [option_name2] = ...
    , ...
--　テーブル情報設定したい場合/以下オプション一覧
-- expiration_timestamp = TIMESTAMP("2018-12-24 01:00:00 UTC")
-- ,friendly_name = "My cat diary"
-- ,description = "The record of encountered cats"
-- ,labels = [("user", "tomono.t"), ("importance", "high"),("confidentiality","private")]
)}
{
  AS SELECT ...FROM...
-- 別テーブルの結果をもとにテーブルを作成したい場合AS~としてSELECT文を記載
}
```
#### パーティションとは？
パーティション分割テーブルはパーティションと呼ばれるセグメントに分割されるため、データの管理や照会が簡単になります。大きなテーブルを小さなパーティションに分割することで、クエリのパフォーマンスを高めることや、クエリによって読み取られるバイト数を減らしてコストを抑えることができます。
引用：[分割テーブルの概要](https://cloud.google.com/bigquery/docs/partitioned-tables?hl=ja)

#### クラスター化とは？
カラム名に基づいて並び替えられます。
パーティション分割と併用すると、各パーティションの中でさらにカラム名に基づいて並び替えられます。
引用：[【BigQuery初心者の日記 DAY3】クラスタ化テーブル①ークラスタ化テーブルの作成ー](https://gri.jp/media/entry/3636)

### テーブルに変更を加える

◇INSERT
テーブルにデータを追加
テストケース作成で使用することが多いです。
```sql
-- テーブル名とカラム(customer_id, name, location, ts)準備
INSERT `project.dataset.table_name` (customer_id, name, location, ts)
-- データの中身を準備- 
VALUES(65401, 'John Doe', 'Faraway', TIMESTAMP("2017-01-01")),
      (74682, 'Jane Michaels', 'Nearland', TIMESTAMP("2017-02-01"));
```

◇DELETE
削除
```sql
DELETE FROM `project.dataset.table` WHERE true;

-- サブクエリを使用して削除する行を指定方法
DELETE `project.dataset.table` t
WHERE t.id NOT IN (SELECT id from `project.dataset.unprocessed`)
```

◇MERGE

```sql
MERGE
  `blog.target` AS T
USING
  `blog.source` AS S
ON
  T.user_id = S.user_id
WHEN MATCHED  THEN
  UPDATE SET T.comment = S.comment
WHEN NOT MATCHED THEN
  INSERT (user_id, comment)
  VALUES (user_id, comment)
```
MERGEは大変便利なのですが、BigQueryにデータを追加する基本手段のloadが無料であるのに対して、MERGEはSELECT同様に課金が発生します。
上記料金の兼ね合いで使用しないほうが賢明です。
[PostgreSQL]PUBLICATIONがUPDATEまたはDELETE操作をパブリッシュする場合でテーブルにWHERE句を使用する場合、WHEREで指定する列はreplica identityに含まれている必要がある。

PUBLICATIONのFOR TABLEにWHERE句を使用する場合、WHEREで指定する列はreplica identityに含まれている必要があります。
と、[PostgreSQL: Documentation: 15: 31.3. Row Filters](https://www.postgresql.org/docs/current/logical-replication-row-filter.html)の31.3.1. Row Filter Rulesに書かれています。

以下のテーブルで、public_openがtrueの行だけをレプリケーションしようとしました。
```SQL
# \d usersql
                                              Table "public.usersql"
      Column      |           Type           | Collation | Nullable |                   Default
------------------+--------------------------+-----------+----------+---------------------------------------------
 id               | integer                  |           | not null | nextval('"usersql_id_seq"'::text::regclass)
 uid              | text                     |           | not null |
 sql              | text                     |           | not null |
 title            | text                     |           | not null |
 explanation      | text                     |           |          |
 public_open      | boolean                  |           | not null | false
Indexes:
    "usersql_pkey" PRIMARY KEY, btree (id)
    "usersql_uid" btree (uid)
```

以下のSQLを使用しました。
```SQL
CREATE PUBLICATION pub FOR TABLE usersql WHERE (public_open = true);
```
これで作成したPUBLICATIONでは、usersqlテーブルのuidのUPDATEに失敗します。
```SQL
# UPDATE usersql set uid = 'testuser2' where uid = 'testuser' ;
ERROR:  cannot update table "usersql"
DETAIL:  Column used in the publication WHERE expression is not part of the replica identity.
CONTEXT:  SQL statement "UPDATE ONLY "public"."usersql" SET "uid" = $1 WHERE $2 OPERATOR(pg_catalog.=) "uid""
```
理由はpublic_open列がreplica identityに含まれていないからです。
public_open列を[replica identity](https://www.postgresql.org/docs/current/sql-altertable.html#SQL-ALTERTABLE-REPLICA-IDENTITY)に含めるには、まずはpublic_open列を含むようなUNIQUE INDEXを作成します。
※REPLICA IDENTITYに設定するインデックスはUNIQUEでなければなりません。UNIQUE INDEXでないと`ERROR:  cannot use non-unique index "usersql_id_public_open" as replica identity`というエラーメッセージが表示されます。
```SQL
# CREATE UNIQUE INDEX usersql_id_public_open ON usersql (id,public_open);
CREATE INDEX
```
次に、そのINDEXをusersqlテーブルのREPLICA IDENTITYに設定します。
```SQL
# ALTER TABLE usersql REPLICA IDENTITY USING INDEX usersql_id_public_open ;
ALTER TABLE
```
これにより、usersqlテーブルのUPDATEが可能になりました。
```SQL
# UPDATE usersql set uid = 'testuser2' where uid = 'testuser' ;
UPDATE 1
```
【Xcode】シュミレーターをダークモードにする

# やりかた
① 「設定」を開きます
![スクリーンショット 2023-05-12 22.55.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/c9c1eec2-ea4e-fb7c-4619-d2e36d1ffe8d.png)

② 「デベロッパ」を選択します
![Simulator Screenshot - iPhone 14 Pro - 2023-05-12 at 22.56.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/303751e8-6b01-63de-6831-65127a8a416a.png)

③ 「ダークの外観モード」をオンにします
![Simulator Screenshot - iPhone 14 Pro - 2023-05-12 at 22.57.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/5661513a-8427-7b37-dab7-80a7ba630b6e.png)

ダークモードになりました！！
![Simulator Screenshot - iPhone 14 Pro - 2023-05-12 at 22.58.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/56d24424-af54-f6be-9bfb-37aab72d60fb.png)

# おわり
これめっちゃ便利そうです！！(課金すれば。。)

https://www.rocketsim.app/
【Vim】 エラーに素早く対処する！ 行数指定でファイル起動


# Introduction

仕事でもプライベートでもメインで`VSCode`サブで`Vim`を使っているのですが、日々の業務をこなす中で、`VSCode`より`Vim`の方が便利と思うケースが幾つかありました。

コマンドだけ丸暗記は苦痛なので、実際に業務で起きたケースに基づいて紹介していきます。

忙しい方向けで先にコマンド、後に活用例を記載します。

1 記事 1 テーマ予定ですが、単発にするかシリーズ化するかは不明です。

モチベ次第で……

**本記事が少しでも読者様の学びに繋がれば幸いです！**
**「いいね」をしていただけると今後の励みになるので、是非お願いします！**

## 環境

Ubuntu22.04

## 行番号を指定して開く。

`Vim`起動時に`+`又は`-c`で指定した行数を開けます。

`web_crawler.py`の 110 行目を指定して開く例。

```bash
vim +110 web_crawler.py
```

```bash
vim -c110 web_crawler.py
```

```bash
vim -c 110 web_crawler.py
```

行数指定はファイル名の後でも可。

```bash
vim web_crawler.py +110
```

```bash
vim web_crawler.py -c110
```

```bash
vim web_crawler.py -c 110
```

`+`はブランクがあると行数指定できません。`+<行数>`
`-c`の行数指定はブランク有無問わず指定可能です。`-c<行数>`,`-c　<行数>`

個人的に`-c`は実行ファイルの引数と混同しやすいので`+`の方が覚えやすいです。

## 実際の使用ケース

「ターミナルで Python ファイルを実行！」

```bash:
python3 web_crawler.py
```

「あ、エラー出た。」

```console:
Start crawling images...
Traceback (most recent call last):
  File "/home/_/create_movie/crawler/ml/web_crawler.py", line 135, in <module>
    main(args)
  File "/home/_/create_movie/crawler/ml/web_crawler.py", line 110, in main
    with open(SEARCH_FILE) as f:
         ^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'search.yaml'
```

「110 行目でエラーか……`yaml`ファイルの配置を直下から変えたんだっけ。」

「`VSCode`起動して……ファイル開いて……110 行目に移動して……パス修正。」

「修正したからターミナルに戻って……マルチタスクで大量に窓開いているから戻り辛い。」

「もう一度 Python ファイルを実行！」

......手間ですね。遅いですね。ストレッサーになりかねませんね。
こんなケースで先程ご紹介した行数指定のコマンドが役に立ちます。

```bash
vim +110 web_crawler.py
```

これでエラー箇所をいち早く修正してそのまま再実行可能です。

忘れても普通に`Vim`でファイルを開いた後に`行数G`で移動できます。
今回のように 110 行目であれば`Ctrl + F`や、最悪`jkhl`で移動も一応出来ます。

ただ`Vim`で開いてすぐお目当てのコードと向き合えることは想像以上に心地良いので、皆様にも是非体験していただきたいです。

軽いエラーの度にアプリケーションを遷移していると集中力も切れやすいので、楽していきましょう！

## 最後に

エラーが複数あったり、根が深いものであれば使い慣れたエディタを使うことをおすすめします。
ただ今回のように、エラーを見てすぐ修正案が浮かんだ場合はどうでしょうか？
いち早く直して再実行したいですよね。

今回ご紹介したコマンドを覚えておけばコマンド入力と移動を同時に行えます。
素早くエラーを修正して、ストレスフリーで業務や個人開発に勤しみましょう。

最後まで閲覧頂きありがとうございました。
備忘録の側面もありますが、本記事がお役に立てば幸いです！
RaspberryPiに外付けのHDDのマウント

### 外付けHDDのマウント

- 外付けのHDDをRaspberryPiのUSBに接続し、マウントを確認する
```terminal
pi@raspberrypi:~ $ df
ファイルシス   1K-ブロック      使用     使用可 使用% マウント位置
/dev/root         30433312   3777304   25362888   13% /
devtmpfs            340460         0     340460    0% /dev
tmpfs               472044         0     472044    0% /dev/shm
tmpfs               188820      2236     186584    2% /run
tmpfs                 5120         4       5116    1% /run/lock
/dev/mmcblk0p1      261108     51636     209472   20% /boot
/dev/sda2       3906885932 383741628 3523144304   10% /mnt/hdd
tmpfs                94408        20      94388    1% /run/user/1000
```
- マウント用のフォルダを作成する（RaspberryPiは外付けのHDDを接続し、割付をしないとそのまま使えないため）
- フォルダの権限を読み書き可能とする
```terminal
sudo mkdir /mnt/hdd
sudo chmod 777 /mnt/hdd
```
- 自動マウントを設定する前準備（設定後、USBからHDDを抜いたままだとRaspberryPiが起動しないので、注意すること）
- 自動マウントの設定情報にはHDDデバイスのUUIDをセットする必要があるため、PARTUUIDを先に取得する
```terminal
pi@raspberrypi:~ $ sudo blkid
/dev/mmcblk0p1: LABEL_FATBOOT="bootfs" LABEL="bootfs" UUID="C336-AC83" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="e327fd70-01"
/dev/mmcblk0p2: LABEL="rootfs" UUID="eaaa4faa-eab6-400c-950f-dc96ae4e0400" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="e327fd70-02"
/dev/sda1: PARTLABEL="Microsoft reserved partition" PARTUUID="<xxxx_xxxx-xxxx>"
/dev/sda2: LABEL="HDCZ-UT" BLOCK_SIZE="512" UUID="368AE5D88AE59521" TYPE="ntfs" PARTLABEL="Basic data partition" PARTUUID="<xxxx_xxxx-xxxx>"
```
- 自動マウントの設定
- 【/etc/fstab】を編集する<b>（注意：<span style="color:red;">ここを間違えるとメモリーカードが壊れてしまうため、慎重に作業すること</span>）</b>
- PARTUUID=d9e942c4-331c-466a-8fdc-83f60561f7b6 /mnt/hdd ntfs defaults.nofail 0 0
```terminal
pi@raspberrypi:~ $ cat /etc/fstab
proc            /proc           proc    defaults          0       0
PARTUUID=e327fd70-01  /boot           vfat    defaults          0       2
PARTUUID=e327fd70-02  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that
PARTUUID=d9e942c4-331c-466a-8fdc-83f60561f7b6 /mnt/hdd ntfs defaults,nofail 0 0
```
- 最後に再起動して、dfコマンドで以下のようになっていればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576081/98773998-3390-96a0-f45d-2a2d37a6fe75.png)
Alacrittyでpecoが動かない

# エラー内容
Ctrl+Rを押すと次のエラーが出る。
```
❯ panic: runtime error: index out of range [5] with length 0

goroutine 27 [running]:
github.com/nsf/termbox-go.send_attr(0xb05, 0x0)
	github.com/nsf/termbox-go/termbox.go:154 +0x339
github.com/nsf/termbox-go.send_clear()
	github.com/nsf/termbox-go/termbox.go:243 +0x2b
github.com/nsf/termbox-go.update_size_maybe()
	github.com/nsf/termbox-go/termbox.go:267 +0xf7
github.com/nsf/termbox-go.Flush()
	github.com/nsf/termbox-go/api.go:156 +0x45
github.com/peco/peco.(*Termbox).Flush(0x5733d1)
	github.com/peco/peco/screen.go:52 +0x85
github.com/peco/peco.(*StatusBar).PrintStatus(0xc0000a8100, {0x5733be, 0x14}, 0x0)
	github.com/peco/peco/layout.go:279 +0x383
github.com/peco/peco.(*View).printStatus(0xc0000a00a8, {0x5a5018, 0xc0000a8020}, {0x7f31895e0008, 0xc0000a0030})
	github.com/peco/peco/view.go:74 +0xc9
github.com/peco/peco.(*View).Loop(0xc0000a00a8, {0x5a58f8, 0xc000116c40}, 0x0)
	github.com/peco/peco/view.go:50 +0x235
created by github.com/peco/peco.(*Peco).Run.func4
```

# 解決策
Alacrittyの設定ファイルに以下を追記。理由はよくわからない。
```~/.config/alacritty/alacritty.yml
env:
  TERM: xterm-256color
```
# 参考にしたリンク
https://github.com/peco/peco/issues/516
https://zenn.dev/sho7650/articles/8b1b4553eb0129
https://qiita.com/tetzng/items/0fa27275255069142c32
AWS関する権限不足

awsを勉強して時に、子ユーザーがこのようなトラブルが発生しました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3290285/89006702-8306-ee70-556a-f845c3927d84.png)
このURLに
https://us-east-1.console.aws.amazon.com/billing/home?region=us-east-1#/account
この関するの権限をクリクして大丈夫です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3290285/a8d89991-b5d9-f184-2fb5-fff35bc014b5.png)
無事に解決しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3290285/7f64e37f-2ea1-93ec-2b8b-b434e56101a7.png)
PowerShellを使ってgithub上に置いてあるscriptを実行する

# githubにscriptを準備
①　githubにscriptを置いておく　
②　対象のファイルを開く
③　右側にあるRawをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/06eea731-7d4b-3b10-77e4-b413da661a44.png)

④　開いたらURLをコピーしておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/eb41ec3f-726f-aba3-48c5-13fc42b89bac.png)

# Windows11でPowerShellを開く
powershellから下記のコマンドを実行
　（「githubのRawのURL」と「ファイル名」は適宜置き換えてください）

```
wget https://githubのRawのURL　-OutFile　ファイル名.ps1
powershell -ExecutionPolicy Bypass .¥ファイル名.ps1
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/cb2a4fd0-f690-0781-36ca-b6ce461e3012.png)

実行出来ました
XcodeのCanvasがうまく表示されない場合に行う解決策集まとめ（手段１−４あり）

こんにちわ。ZaQです。:smiley:

会社内でおいてGithubを用いてプロジェクト管理を行い、メンバー内でのコードレビューを実施しています。

本日は、タイトル通りXcodeでの「Canvas（Preview）」が表示されなくなった時の対応策です。

環境：
Xcode：14.3
Swift version：5.8
PC OS ：Mac Ventura 13.3.1

# 【解決策１】キャンパスの設定を変更すること

以下の手順に従って、Onone Swift optimization levelを使用するようにXcodeを設定しましょう。

Xcodeで、プロジェクトのターゲットを選択して、[Build Settings]タブをクリックします。
![スクリーンショット 2023-05-12 21.44.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918162/96481d4a-ca78-281f-b10c-121c95054147.png)

[Swift Compiler - Code Generation]セクションを展開します。
そして、[Optimization Level]設定を探し、[Debug]モードに対して「-Onone」を設定します。これにより、Onone Swift optimization levelが使用されるようになります。

![スクリーンショット 2023-05-12 21.45.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918162/10553b38-5c71-ed25-5e56-4555d903dba4.png)
プロジェクトをビルドし、プレビューを表示してみてください。
これで、プロジェクトのビルド設定が変更され、Onone Swift optimization levelが使用されるようになります。プレビューを再度表示してみてください。

:::note info
<dt>ここでポイント</dt>
1.他の人（同じProjectでコードを書いている人）がこのLevel部分を変更したとしても、原因がわかりませんがうまく自分のローカル側では設定できていない時があります。<br>
2.その時は、この「Debug」及び「Release」の部分で、一度、別の内容に設定(例：Optimization for Size)をした後に、「-Onone」を設定して下さい<br>
:::
理由までは確認できていませんが、自分の環境でも最適状態に更新したことにより正しく動作することができます
# 【解決策２】Clean buildすること
これは単純な方法になってしまいますが、build時に残っているCash情報などが邪魔をすることで正しく表示ができていないこともあります。その時は、一度クリアした状態を構築し実施しましょう！

# 【解決策３】Xcodeを再起動すること
こちらもXcode自体の不安定な挙動が原因な場合も考えることができますので、上記の解決策がダメな場合はトライしましょう

# 【解決策４】PCの再起動すること
あるあるの対応策で申し訳ないのですが、上記の解決策1−３を実施し、うまくいかない場合は、
「いつにどのような使い方を行なってしまったが為に不具合が発生したかわからない」状況となりますので、PC自体を初期の挙動がされる正しい状態に行った上で、Canvasを触ることをトライしてみましょう！

それではまた。

弊社サイト：https://www.winescan.co.jp/
私たちの働きでひとり一人の自分らしさをupdateし続けることができる社会を目指します
[Flutter] fvm インストールまでの道のり

## はじめに
ただ Flutter fvm インストールしたいだけなのに
なかなかゴールにたどり着けなかったのでその軌跡をまとめておきます。
Flutter初級者のため、情報に誤りがある可能性がございます。ご了承ください。

## 前提
Flutter SDKを事前にインストールしておく

## Dart SDKのインストール
1. Dartのリポジトリをbrewで登録する
    - brew tap コマンドは、Homebrewで提供されているサードパーティのリポジトリを登録するためのコマンド。このコマンドにより、パッケージを検索してインストールできるようなる
    - Dart言語の公式パッケージがHomebrewに登録され、Dart SDKをHomebrewを使用して簡単にインストールすることができるようになる

    ```
    brew tap dart-lang/dart
    ```
1. Dart SDKのインストール
    ```
    brew install dart
    ```
    → エラー発生
    コマンドラインツールがないためインストールしろと言われる
    ```
    Error: Xcode alone is not sufficient on Monterey.
    Install the Command Line Tools:
      xcode-select --install
    ```

1. Xcodeコマンドラインツールのインストール (command line developer tools)
    ```
    xcode-select --install
    ```
    ![clt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173803/00834eb2-1ec1-017a-8873-5a4972fb19e5.png)
    - Xcodeコマンドラインツールが正しくインストールされたか以下で確認
        ```
        xcode-select -p
    
        /Applications/Xcode.app/Contents/Developer
        ```

1. 再度、2.の項目でDart SDKをインストールする
1. Dart SDK がインストールされたか？確認する
    ```
    dart --version

    Dart SDK version: 2.16.2 (stable) (Tue Mar 22 13:15:13 2022 +0100) on "macos_x64"
    ```

## fvmのインストール
1. fvmをグローバルにインストールする
    - pubとはDartのパッケージ管理ツールのこと
    - 以下を実行してもfvmにPATHが通っていないためパスを通す必要がある
    - ※  インストールが正しくできない場合
    **`dart pub global activate fvm`**  と**************************************頭にdart 〜をつけてコマンドしてみる**************************************
(pub コマンドは非推奨のため、 dart pub 〜 コマンドで実行する)
        ```
        pub global activate fvm
    
    	→ pub command not found
        ```

1. fvmへのパスを通す
    - .zshrc に以下を追記する
        ```
        export PATH="$PATH":"$HOME/.pub-cache/bin"
        ```
    
    - .zshrcを再設定する
        ```
        source ~/.zshrc
        ```
    
    - fvmへパスが通っているか確認する バージョンがでたら正しくインストールできている
        ```
        fvm --version
    
        2.4.1
        ```
    
    -  fvm —version で、以下のエラーが出る場合 
        ```dart pub global activate fvm``` を実行してみる
        ```
        Can't load Kernel binary: Invalid kernel binary format version.
        Could not find a file named "pubspec.yaml" in "/Users/ユーザー名/.pub-cache/hosted/pub.dev/fvm-2.3.1".
        ```
    
    - それでもうまくできない場合
        which dart でDartSDKのインストールパスを確認する
        ```
        which dart
        
        /Users/ユーザー名/development/flutter/bin/dart
        ```
1. dart-sdk/bin ディレクトリを$PATH 環境変数に追加する
        .zshrc に以下を追加
        インストールパスはwhich dart で出たパスを記述
    ```
   export PATH="$PATH:/Users/ユーザー名/development/flutter/bin/cache/dart-sdk/bin"
    ```


## 参考
https://zenn.dev/welchi/articles/d8f120adeebc7a85ed17
URIをいい感じに扱うのが意外と難しい話

For [Agileware Drinkup at RubyKaigi 2023](https://agileware.connpass.com/event/279278/) Lightning Talk


#### 自己紹介
渋谷　充宏 `@m4buya`

* 株式会社ファンファーレ Engineering Manager
* Ruby / SRE / マネジメント
* https://github.com/mshibuya
* RailsAdmin/CarrierWave committer
* 自作キーボード沼に入門しました

---

## この発表について

CarrierWaveというファイルアップロードライブラリには、エンドユーザーからファイルのURLを受け取ってそれをダウンロードし格納する仕組みがあります。そこでURI/URLを扱うのが意外と難しいなぁ…という話をします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27474/560960b3-bdc9-ce71-9bf3-0e088f77d6ac.png)


---

## URI

皆様よくご存じ、Uniform Resource Identifier。
Rubyでは標準ライブラリとして `URI` が存在していて、いろんなURIを便利に扱える。
が、わりと仕様に厳密に即した入力を要求する。

https://docs.ruby-lang.org/ja/latest/class/URI.html

---

#### Ruby URIライブラリが扱えないURIの例

* https://example.com/file[1].txt
* https://example.com/?q=あああ
* https://ドメイン名例.jp/ (IDNA)

これらのURIはRFC違反なので使えません、と言い切ってしまう手もあるが…

```irb
irb(main):001:0> URI.parse('https://example.com/file[1].txt')
/Users/mshibuya/.anyenv/envs/rbenv/versions/3.2.1/lib/ruby/3.2.0/uri/rfc3986_parser.rb:66:in `split': bad URI(is not URI?): "https://example.com/file[1].txt" (URI::InvalidURIError)
	from /Users/mshibuya/.anyenv/envs/rbenv/versions/3.2.1/lib/ruby/3.2.0/uri/rfc3986_parser.rb:71:in `parse'
```

---

## エンドユーザーはURIに対しふわっとした期待を持っている！

？？？「ブラウザのアドレスバーに入れたらちゃんと出るものがダウンロードできないのはバグでしょ」

特にIDNAが厄介で、この表記がなされたもの自体はURIそのものではなく「規定のエンコードがなされたURIをアプリケーションがよしなに表示できる」という扱い…

---

## そこで Addressable

RubyのIDNA対応URIライブラリとしてポピュラー。
入力にもかなり寛容なので、ユーザーの期待に近い

https://github.com/sporkmonger/addressable

---

## IDNAを扱うには

#normalize します

```irb
irb(main):001:0> Addressable::URI.parse('https://ドメイン名例.jp/').normalize
=> #<Addressable::URI:0x382c URI:https://xn--eckwd4c7cu47r2wf.jp/>
```

---

## 落とし穴

URI全体をnormalizeしてしまうと、pathなども別物になってしまう！

```irb
irb(main):001:0> Addressable::URI.parse('https://example.com/o%CC%88.png').normalize
=> #<Addressable::URI:0x7170 URI:https://example.com/%C3%B6.png>
```

---

## 実装された運用

```ruby
uri = Addressable::URI.parse(source)
uri.host = uri.normalized_host
uri.to_s
```

とりあえずこんな感じにお茶を濁してます…問題が出ないといいな

---

## まとめ

* URI、おなじみなんですが考えることが多くて意外と難しい
* おすすめの方法があったら教えてください
* 人間はいい加減なのでできるだけURIを書かせてはいけない（戒め）
web制作のやり方

ここではweb制作（主にwordpress）の簡単なやり方について説明していきます！

身に着けるスキルとweb制作ができるようになる手順は以下の方法です
①HTML CSSを身に着ける
②SCSSやJavaScriptを学習する（ただし完璧にする必要はない）
③wordpressについて学習する（テンプレ等）
④wordpressのサイトを一つ作ってみる
⑤サーバーなどの外の知識を得る

それぞれ手順でどれくらい勉強をすればいいのか難しいと思います。HTMLやCSSを長い時間勉強しても無駄ですし
そのため効率よくそれぞれを学習する必要があります。


案件の受け方は別の記事で説明しようと思います。
参考になったという方やもっと詳しく知りたいという方はコメントなどください。

別で教える事が可能ですので
3Dプリンターで印刷後に組み立てる覚書

# 概要
3Dプリンターで1度で印刷できないサイズの物を印刷する機会があったので印刷後に組み立てる手段を考えてみました、の覚書

# 印刷するもの

- とある機械にはめ込むことで機械からQRの位置を確定してくれるアタッチメントを作りました

![FvhpYHsaUAEUyBM.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436651/7f7b523b-8d52-0d33-6461-9e5fa6afe9cf.jpeg)
※画像は途中経過のものです

- 経緯としては、、
とある機械から決まった距離にQRコードを配置するという作業があり、毎回精度良く図るのが面倒だったため、はめ込むだけでQRコードの位置を確定できるアタッチメントが欲しいと思った感じです


# 基本情報
- QRコードは15cm * 15cm
- はめ込む箇所の形は数種存在する
    - 出来れば付け替えられた方が良いよね...
  

# 使用する3Dプリンター
ANYCUBIC Vyper

https://www.anycubic.com/products/anycubic-vyper

# 印刷中に困ったこと
## 接続部が折れた
- 画像でもわかるように、接続部が小さすぎて印刷後組み立てると折れました。
![FvhpYHsaUAEUyBM.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436651/7f7b523b-8d52-0d33-6461-9e5fa6afe9cf.jpeg)

これを機に我が家の3Dプリンターで印刷後にはめ込むための誤差を調査しようとなりました

- 縦：5mm　横：3.8mmの穴を印刷
![FvnXllHXgAUpX53.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436651/7b5b6253-f2e0-77e0-1db8-11fcd4f08b62.jpeg)

- 穴を100%とし、99%~95%までの突起を印刷
![FvnXllIXwAM1raP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436651/0e473636-630e-a370-1975-6c3fd5262b48.jpeg)

- その結果、95%のものがぴったりくっ付くことが分かりました。
    - 例えば10mmの穴にピッタリくっつけるには9.5mmの凸を印刷すると良いということに。
- 印刷物にはこの%を適用して作成しました
![FvnXllKWYAMYAec.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436651/daa5523b-28b5-9c12-bed2-1a87ba758c73.jpeg)


# 最終的にできたもの
- 印刷後にはめ込んで組み立てることができました
![FvsBTUeagAQJGzc.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436651/bed69a13-1777-ad43-4c17-38c34dfa20f7.jpeg)
【初学者向け】データベースの正規化をわかった気になろう！(第２正規化)

# はじめに
データベースに関する教科書的な説明がわかりにくかったので、具体例を通してわかった気になれる記事を書きます。
今回は「第２正規化」について書きます。



# 第２正規化
第２正規化とは、**部分関数従属** を解消することです。
部分関数従属とは、"キーではない普通のカラム"が、複数あるキーの内の一部にだけ依存する場合を指します。
。。。まあ分かりにくいので具体例を通して理解していきましょう。

今回は、大学の講義の成績を管理するデータベースで考えてみましょう。
次のようなテーブルがあるとします。

・講義の成績テーブル
| 講義ID | 教師ID | 学生ID | 講義名 | 教師名 | 学生名 | 成績 |
|--------|--------|--------|--------|--------|--------|------|
| 1      | 101    | 1001   | 数学   | 田中   | 山田   | A    |
| 1      | 101    | 1002   | 数学   | 田中   | 佐藤   | B    |
| 2      | 102    | 1001   | 英語   | 鈴木   | 山田   | C    |
| 2      | 102    | 1003   | 英語   | 鈴木   | 田村   | B    |

まずはこのテーブルをじっくり観察してみましょう。
このテーブルは３つの要素がゴチャ混ぜになって構成されています。

1. まず、上記のテーブルにおいてキーのひとつである「講義ID」が `1` の場合、１つに定まる他のカラムはなんでしょうか？
**教師ID(101)、講義名(数学)、教師名(田中)** は１つに定まりますね。
逆に、学生ID(1001, 1002)、学生名(山田, 佐藤)、成績(A, B)は２つあるため１つに定まりません。
このような関係を「 **教師ID・講義名・教師名 は、 講義ID に従属する** 」と表現します。


2. 上記のテーブルにおいてキーのひとつである「学生ID」が `1001` の場合、１つに定まる他のカラムはなんでしょうか？
  **学生名(山田)** が１つに定まりますね。
逆に、学生名以外は何も１つに定まりません。
このような関係を「 **学生名 は、 学生ID に従属する** 」と表現します。


3. 最後に一つ残ったのが「成績」ですね。
これはどのカラムを中心に見ても１つに定まりません。
これに関しては「講義ID」と「学生ID」の２つが揃った場合に１つに定まります。


まとめると、講義の成績テーブルは、上記 1 ~ 3 の３つの要素がゴチャ混ぜになって構成されていることに気づけます。
このゴチャ混ぜを解消し、テーブルを第二正規形にするためには、**テーブルを分割** します。具体的には次のように3つのテーブルに分割することが考えられます。

講義テーブル:
| 講義ID | 教師ID | 講義名 | 教師名 |
|--------|--------|--------|--------|
| 1      | 101    | 数学   | 田中   |
| 2      | 102    | 英語   | 鈴木   |

学生テーブル:
| 学生ID | 学生名 |
|--------|--------|
| 1001   | 山田   |
| 1002   | 佐藤   |
| 1003   | 田村   |

成績テーブル:
| 講義ID | 学生ID | 成績 |
|--------|--------|------|
| 1      | 1001   | A    |
| 1      | 1002   | B    |
| 2      | 1001   | C    |
| 2      | 1003   | B    |

これで第二正規形になりました！

各テーブルについて説明すると、

- 講義テーブルでは、各講義はその「講義ID」によって一意に識別され、教師ID、講義名、教師名は全て講義IDに従属します。
- 学生テーブルでは、各学生はその「学生ID」によって一意に識別され、学生名は学生IDに従属します。
- 成績テーブルでは、各成績レコードはその（講義ID, 学生ID）によって一意に識別され、成績は講義IDと学生IDに従属します。

このように、テーブルのごちゃつきを解消することで、データの重複を避け、データの一貫性と整合性を維持しやすくなります。また、データの更新（挿入、削除、変更）の際の問題も軽減できます。


# 最後に
ここまで読んでいただきありがとうございました！！
もし本記事が少しでも理解の助けになったなら、ぜひイイね！をよろしくお願いします。
それではまた！(^_^)ﾉｼ
リモートのGeforceRTX3090マシン上のMPT-7bとチャットしてみた。

# はじめに
Geforce RTX 3090 (VRAM:24GB) のマシンを使わせてもらう機会を得たので、MPT-7Bとチャットしてみることにした。MPT-7Bは、（トレーニング内容による区別と思われる）いくつかのタイプがある大規模言語モデルであるが、transformers で呼び出して使うことができるモデルもあり、さらには商用利用も可能なライセンスタイプもある。

https://gigazine.net/news/20230508-mpt-7b/?fbclid=IwAR1GLwfXAXaZx1liGyhRGGPR-CHoQ4RyMPzT5nUEDx_xgTqEv04DbpqzRdE


# 準備
参考サイトはこちら。

https://qiita.com/taka_yayoi/items/0142c1e1b4a21dde45b7

また、受け答えのUIについては、こちらを参考にした。

https://qiita.com/riversun/items/7c45580f1a098b041528

モデルは、mosaicml/mpt-7b-Chatを使うことにし、日本語の入力テキストを直接、モデルに入力することにした。（英語への翻訳変換なし）

https://huggingface.co/mosaicml/mpt-7b-chat

config, model, tokenizer は、特に捻りもなく使わせていただいた。
```python
model_name = "mosaicml/mpt-7b-Chat"

config = AutoConfig.from_pretrained(
    model_name,
    trust_remote_code=True
)
# config.attn_config['attn_impl'] = 'triton'

model = AutoModelForCausalLM.from_pretrained(
    model_name,
    config=config,
    torch_dtype=torch.bfloat16,
    trust_remote_code=True
)
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model.to(device=device)

# トークナイザーとモデルの準備
tokenizer = AutoTokenizer.from_pretrained(
    model_name
)
```

# 結果例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699890/3447565d-26ad-4970-e405-97a30435af7d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699890/e50a4e2d-9f12-58ef-a984-49d6508ac318.png)

# 感想
ずばり、長い文章を作文したがるクセのある印象を受けました！

どういう場面で使えるのか、と聞かれると作文結果が欲しい人向けだけど、文章の展開がChatGPTほど賢くはなく、同じことを繰り返し出力したり、くどく感じてしまう感じ。”チャット”として使うには、読まされる側の気持ちとしてちょっと・・・。

あと、日本語で「〜ください。」と終わる文章を書くと、なにかのインストラクション（指示・命令）と受け取ってしまうのか、回答が「翻訳作業結果の報告」になりがち。

上部の例にあるように、英文の要約を指示してみたところ、特徴のあるコトバをわざと回避して、概念に落とし込んだコトバで表現しようとしている印象を受ける。

こういった回答傾向は、自分の印象としては、会話のポイントをわざとぼやかして、長い文章を出力しようとするめんどくさいやつ、という感じ。非礼を承知で申し上げると、話したいと思えない人格（？）だ。

そういう学習傾向をどうやって形成させたのか、というところを想像することが面白い・・・よね、機械学習の世界ってさ。

# まとめ
自前のファインチューニングなどなしに、Huggingfaceのモデルをそのまま動かしてみました。そのモデルの出力文章の例を提示し、私的な感想・印象を述べさせていただいた内容が、今後、このモデルを操作しようとする人の参考になれば幸いです。

# おまけ
GPU、RTXシリーズ、しかも3090を初めて使った感想としては・・・、まずはVRAMの大きさに安心感がある。そして、いつも使っているGTX1080とは、流石に段違いのスピード・・・。別記事にも書いていたDollyV2を動かして速度（体感、印象）を調べてみるかな。
toio.pyをRaspberry PiやJetson XavierNXで動かしてみる

# 祝toio.py公開

toio™ core cubeを制御するプログラミング環境としてはオフィシャルからはビジュアルプログラミング環境の「[toioDo](https://toio.io/do/)」およびJavaScriptライブラリ「[toio.js](https://github.com/toio/toio.js)」、そしてUnity用「[toio SDK for Unity](https://toio.io/blog/toio-sdk-for-unity/)」が用意されていましたが、この度、４つめの環境としてPythonライブラリ「[toio.py](https://github.com/toio/toio.py)」が公開されました。(2023.5.8)

このライブラリはPythonライブラリ[tomotoio](https://github.com/kenichi884/tomotoio)と違ってBLE通信の基盤部分にbleakを使っているため、Linux系OS以外に、Windows、Linux、MacOSでも動かすことができるようです。(tomotoioはbluepyを使っているのでLinux上でしか動かない)

https://github.com/toio/toio.py には非常に詳しいインストール手順が書いてありますので、動作確認済環境であれば問題なく動かせるとは思います。(主な動作確認環境　Windows: Windows10 (21H2)、補助的な動作確認環境　Linux: Ubuntu22.04、macOS: macOS 12(Monterey))

https://github.com/toio/toio.py/blob/main/SETUP_GUIDE.ja.md


ここでは、オフィシャルで動作確認がされてない環境(Ubuntu20.04、RaspberryPiOS、JetPack5.1)でのインストールを試みます。

たぶんLinux系ディストリビューションでPython3.11以上が入る環境であれば同様の手順でインストール、動作させることができるかと思います。

# Raspberry Pi OSやJetPackで動かしたい
オフィシャルの動作確認済環境としてUbuntu22.04がありますが、Raspberry Pi OS(2023年時点)や、Jetson用のJetPack5.1.xはそれぞれdebian bullseye、Ubuntu20.04相当で、Ubuntu22.04よりは少し世代が古めになります。このためpython3は3.8で、toio.pyの動作環境であるpython3.11ではありません。

## まずpython3.11を入れる

[Python Japan の Ubuntu 版 Python のインストール](https://www.python.jp/install/ubuntu/index.html)を参考にして Python をインストールします


<pre>
$ sudo apt update
$ sudo apt install build-essential libbz2-dev libdb-dev \
  libreadline-dev libffi-dev libgdbm-dev liblzma-dev \
  libncursesw5-dev libsqlite3-dev libssl-dev \
  zlib1g-dev uuid-dev tk-dev
</pre>

https://www.python.org/downloads/ からpython 3.11以降をダウンロードします
<pre>
$ wget https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tgz
</pre>

ソースコードを展開し、ビルド、インストールします。今回、システム側デフォルトの/usr/local/bin/python3に上書きしないで、/usr/local/bin/python3.11として別にインストールします。

<pre>
tar xfvz Python-3.11.3.tgz
cd Python-3.11.3
./configure
make 
make altinstall
</pre>

## Python3.11の仮想環境を作ってそこにtoio.pyをインストール

venvを使ってPython3.11の仮想環境を作ってそこにtoio.pyをインストールします。これでシステムのデフォルトのpython3環境をを汚すことなくインストールすることができます。

<pre>
$ /usr/local/bin/python3.11 -m venv py3.11env
$ source py3.11env/bin/activate
(py3.11env)$ python -V 
Python 3.11
(py3.11env)$ python.exe -m pip install --upgrade pip
(py3.11env)$ python -m pip install bleak
Jupyterを使わない場合はipykernelのインストールは不要です
(py3.11env)$ python -m pip install ipykernel
(py3.11env)$ python -m pip install toio-py --upgrade
(py3.11env)$ python -c "import toio.scanner; print('ok')"
ok
</pre>

これでtoio.pyのインストールは完了です

# 動作確認済環境
こちらの手元でtoio.pyのインストールを試してtoio™ core cubeを動かすことのできた(examplesのサンプルスクリプトが動かせたもの)環境を列挙します。

なお、どの環境でもcube.api.motor.motor_control_multiple_targets()で3つ以上のターゲット地点を指定した場合は動作しませんでした。(これはbluepyを使うtomotoioも同様の制限があります。ターゲット地点2つまでが限界)

## PC (Ryzen 5 2600) + USB Btドングル
* Ubuntu 20.04LTS
* Windows 11 22H2
## Raspberry Pi 4B
* Raspberry Pi OS 64bit版 (bullseye)
## Jetson Xavier NX dev.kit
* JetPack 5.1.1
Count on Our Quality Cisco 350-801 Dumps

350-801 imposing and operating Cisco corporation community middle technology recommendations 350-801 examination pointersonline Do you want up-to-date be a talented character for your workplace. Please hurry up and get our 350-801 examination dumps that are  and correct. The Cisco 350-801 test engine creates a nearly real environment, that could enhance your self belief in Cisco real exam. there's an interactive area on the Cisco 350-801 take a look at engine. you can make notes at the printable <a href="https://dumpsboss.com/cisco-exam/350-801/">Cisco 350-801 Exam Dumps</a> PDF files. you'd higher take a quiz up-to-date your understanding about the Cisco 350-801 examination. there is a licensed crew of professionals who've compiled the imposing and working Cisco organisation community center technologies certification exam questions and solutions. they're placing a lot energies everyday revise the imposing and working Cisco business enterprise community core technology study substances that a large number of applicants have handed their Cisco 350-801 vce at the primary attempt. they have utmost religion in our 350-801 products. So, they constantly pick out our examination dumps for any other Cisco Cisco certification exam education. 

Get Upto 90% Off >>>>>> https://dumpsboss.com/cisco-exam/350-801/
【Python】PySimpleGUIで表示したウィンドウを閉じてもプロセスが残る

**【事象】**
PySimpleGUIでウィンドウを表示するプログラムをPyInstallerでexe化しました。
そのexeを実行したあと、ウィンドウを閉じても
タスクマネージャーにプロセスが残ります。
 
 

なお、このプログラムはスレッド処理を使用しています。
 
 
**【解決方法】**
ウィンドウクローズを検知したあと、
メインスレッド以外のスレッドを明示的に終了させます。

```Python
for thread in threading.enumerate():
    if thread != threading.main_thread():
      ctypes.pythonapi.PyThreadState_SetAsyncExc(thread.native_id, ctypes.py_object(SystemExit))
```

**参考サイト**
https://zenn.dev/bluesilvercat/articles/c492339d1cd20c
CloudFront＋S3・Lambdaで署名付きURLを発行する

## はじめに
CloudFront用の署名付きURLを発行して共有する必要があったので、そのやり方を記録しています。

CloudFrontディストリビューションの作成が必要ですが、
多くの記事が存在しているようなので、今回はその手順は省略させてもらいます。

## 実践
### Lambdaソース

```Python:lambda_function.py
from datetime import datetime, timedelta
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import padding
from botocore.signers import CloudFrontSigner

def rsa_signer(message):
    with open('../private_key.pem', 'rb') as key_file: 
        private_key = serialization.load_pem_private_key(
            key_file.read(),
            password=None,
            backend=default_backend()
        )
    return private_key.sign(message, padding.PKCS1v15(), hashes.SHA1())

def lambda_handler(event, context):
    key_id = 'xxxxx' 　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　                   # ディストリビューション ID
    url = 'https://xxxxx.cloudfront.net/'                    # ドメイン名
    file = 'xxxxx.mp4'　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　                   # 任意のファイル
    expire_date = datetime.utcnow() + timedelta(minutes=30)  # 有効期間

    cloudfront_signer = CloudFrontSigner(key_id, rsa_signer)

    signed_url = cloudfront_signer.generate_presigned_url(
        url + file,
        date_less_than=expire_date)

    return signed_url

```
Penn World Table（PWT）をGoogle Colab 上のR環境でいじってみた

# はじめに
Goole Colab 上のR環境で、マクロ経済のデータベースであるPenn World Table（PWT） https://www.rug.nl/ggdc/productivity/pwt/ を使ってみることにした。こういうデータベースを使う以上、日本のデータだけというのは無意味な気もするが、とりあえず今回は日本の実質GDPの時系列グラフを描くことにした。

### 実行環境
Goole Colab でのR環境の構築方法については https://htsuda.net/stats/colab.html を参考にさせていただいた。

### データ
現行バージョンのPWT10.01 は、183か国のrgdpe（実質GDP（支出面））、rgdpo（実質GDP（生産面））、hc(人的資本)などを含む48の時系列データ（1950年から2019年まで）が提供されている。

今回はRのパッケージでこのデータベースを使ってみる。

CRANのサイト（ https://cran.r-project.org/web/packages/available_packages_by_name.html ）をみると、PWTのRパッケージは古いものを含め、以下のように複数ある。
pwt	　　Penn World Table (Versions 5.6, 6.x, 7.x)
pwt10 　Penn World Table (Version 10.x)
pwt8　　Penn World Table (Version 8.x)
pwt9　　Penn World Table (Version 9.x)

2019年までのデータを含む最新のものにしておきたいので、pwt10を使う。
```R
install.packages("pwt10")
library("pwt10")
```
ここで、
```R
data()
```
と確認してみると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3305624/7ec7edff-4362-3f90-c22a-65e36f895045.png)
と表示され、pwt10.0 とpwt10.01が使えることが分かる（チェックしてみると、データフレーム型）。

この後描くグラフだけなら、追加のライブラリーは"ggplot2"だけでよさそうだが、データ分析によく使われる他のものを含む"tidyverse"のロードまたはインストールをしておくことにした。


```R
if (!require("tidyverse")) install.packages("tidyverse")
```

# グラフ描画のコード
pwt10.01から日本のデータだけ取り出してグラフを描く。
```R
# 日本のデータのみ選択
data_selected <- pwt10.01 %>% filter(country == "Japan")

# rgdpo の時系列グラフ
ggplot(data = data_selected, aes(x = year, y = rgdpo)) +
  geom_line() +
  labs(title = "Real GDP of Japan (1950-2019)",
       x = "Year",
       y = "Real GDP")
```
出力結果は以下の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3305624/40631326-4c5b-2e41-bb8a-b0532a5e6707.png)

# おわりに
これまでPWTの存在は知っていたが、Rのパッケージの存在は知らなかった。できるのかわからないが、次はPythonで試してみたい。
[AWS Q&A 365][Step Function]AWSのよくある問題の毎日5選 #55

# 1. AWS Step Functionsと統合できる他のサービスはありますか？
回答：AWS Step Functionsは、AWS Lambda、Amazon SNS、Amazon SQS、Amazon DynamoDBなど、さまざまな他のAWSサービスと統合することができます。

# 2. AWS Step Functionsはマイクロサービスのオーケストレーションにどのように使用できますか？
回答：AWS Step Functionsを使用すると、複数のマイクロサービスの実行をオーケストレーションし、複雑なワークフローを自動化および管理することができます。

# 3. AWS Step Functionsはデータ処理タスクに使用できますか？
回答：はい、AWS Step FunctionsはAmazon S3やDynamoDBからのデータの処理やデータ上での機械学習モデルの実行など、データ処理タスクに使用することができます。

# 4. AWS Step FunctionsはITおよびセキュリティの自動化にどのように使用できますか？
回答：AWS Step Functionsは、インシデント対応のワークフローの自動化やセキュリティおよびコンプライアンスのチェックの管理など、ITおよびセキュリティの自動化タスクに使用することができます。

# 5. AWS Step Functionsと他のサービスを統合する際の制限はありますか？
回答：AWS Step Functionsは多くのAWSサービスと統合できますが、使用する具体的なサービスによっては制限や互換性の問題がある場合があります。AWS Step Functionsとの統合前に、ドキュメンテーションを注意深く確認し、すべてのサービスが互換性があることを確認することが重要です。