OmniAICreator/Qiita-1.07M huggingface dataset:
PHPとMySQLの接続〜登録〜取得


１）**<font color="Magenta">mysqli_connect</font>**
　　PHPからMySQLに接続する
　　**※SQLに接続できないケースも追加する(if文)**
```SQL
function dbConnect()
{
$link = mysqli_connect('<ホスト名>''<ユーザー名>''<パスワード>''<データベース名>');
if(!$link) {
    echo 'Error:データベースに接続できませんでした' . PHP_EOL;
    echo 'Debugging error:' . mysqli_connect_error() . PHP_EOL;
    exit;
        }
        return $link;
}

$link = dbConnect();
mysqli_close($link);
```


２）**<font color="Magenta">mysqli_query</font>**
　　①テーブルを作成する
  　　※エラーがあった場合、エラーメッセージを表示するようにする(変数$result)
```SQL
function createTable($link)
{
    $createTableSql = <<<EOT
CREATE TABLE <テーブル名>(
        <カラム名><データ型><制約>,
        <カラム名><データ型><制約>,
        <カラム名><データ型><制約>
)DEFAULT CHARACTER SET=utf8mb4;
EOT;

    $result = mysqli_query($link,$createTableSql);
    if($result) {
        echo 'テーブルを作成しました' .PHP_EOL;
    } else {
        echo 'Error:テーブルの作成に失敗しました' .PHP_EOL;
        echo 'Debugging Error:' .mysqli_error($link) .PHP_EOL;
    }
}

$link = dbConnect();
createTable($link);
mysqli_close($link);
```  

　 ②MySQLのデータを削除する
 ```SQL
 function dropTable($link)
{
     $dropTableSql = 'DROP TABLE IF EXISTS <テーブル名>;';
     $result = mysqli_query($link, $dropTableSql);
     if ($result) {
         echo 'テーブルを削除しました' . PHP_EOL;
     } else {
         echo 'Error:テーブルの削除に失敗しました' . PHP_EOL;
       echo 'Debugging error:' . mysqli_error($link) . PHP_EOL;
     }
}

$link = dbConnect();
dropTable($link);
mysqli_close($link);
 ```
  ③データを追加する
  ```SQL
  function createData($link, $<連想配列>)
{
    $sql = <<<EOT
INSERT INTO <テーブル名> (
    <カラム名>,
    <カラム名>,
    <カラム名>
) VALUES(
    "{$<連想配列>['<配列名>']}",
    "{$<連想配列>['<配列名>']}",
    "{$<連想配列>['<配列名>']}"
)
EOT;
    $result = mysqli_query($link, $sql);
    if ($result) {
        echo '登録が完了しました' . PHP_EOL;
    } else {
        echo 'Error:データの追加に失敗しました' . PHP_EOL;
        echo 'Debugging Error:' . mysqli_error($link) . PHP_EOL;
    }
}

$link = dbConnect();
createData($link);
mysqli_close($link);
  ```
 
 ３）**<font color="Magenta">mysqli_fetch_assoc</font>**
    テーブルからデータを取得する

 ```SQL
    function listTable($link)
{  $sql = 'SELECT <カラム名> FROM <テーブル名>';
    $results = mysqli_query($link, $sql);

    while ($<配列名> = mysqli_fetch_assoc($results)) {
        echo '書籍名:' . $<配列>['title'] . PHP_EOL;
        echo '著者名:' . $<配列>['author'] . PHP_EOL;
    }
    mysqli_free_result($results);
}
 ```

PHPとMySQLの**接続〜登録&削除〜取得**をまとめてみました。
※間違ったところがありましたらコメントで教えていただけますと嬉しいです！
【MySQL】phpMyAdminのテーマランキング【MariaDB】

以下からテーマを試せます
https://demo.phpmyadmin.net/master-config/

# 1998/09/09 Original

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/ad3af7df-f89f-9077-7b11-df6390181971.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/c5ea7930-9e60-8783-ea2b-17494bea2c67.png)


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

# 2015/01/21 pmahomme

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/549345cf-439b-0d35-8233-897479f0d38d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/e751c437-d5e9-a44b-b4f8-59a7dc79ec15.png)

https://1day1tip.yeno.net/2015/01/phpmyadmin-theme/

# 2021/05/18 Metro

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/b7c30439-ea9c-5a9c-64ff-13f54ba5e16a.png)

## Win
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/0adb32f8-7e94-d1d7-0ae3-ce88b69240ce.png)

## Teal
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/ab6dcd5c-0ff2-c970-24a7-25c278d6628e.png)

## Redmond
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/81a95820-1b95-c24a-dee4-a994333e7b35.png)

## Blueeyes
ほろびのバーストストリーム～～
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/0b025f8d-3706-86ed-fadc-063a893d9345.png)

## Mono
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/31967d4f-932a-6c8a-5c62-1a33448419ac.png)


https://www.tairaengineer-note.com/xampp-phpmyadmin-change-color/

# 2022/02/18 Bootstrap

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/656d47ea-8ecf-47b1-a69b-5921dd59698a.png)

## ライト 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/147d0d19-c985-0179-dd5d-70bd747da3ef.png)

## ダーク

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/3c5a5a3a-0b8c-8980-2e6b-b970fc29f28d.png)


https://github.com/phpmyadmin/themes/issues/68

# まとめ

新しいBootstrapテーマ使っていきたいですねー

※正確なテーマの導入時期は未調査
vuu3でカスタムアイコンComponentを作る

以下の記事の使い方ですが、
https://qiita.com/shiba_mitue/items/460652ccbb625c42bac1

```vuejs
<icon name="alert" />
```
よくあるアイコンタグですが、アプリ上数個しか使わないのにWebFontで読み込んだりIconMoonで管理したりがちょっと面倒なので、svgをフォルダに入れればOKなコンポーネントを用意します。


```vue:icon.vue
<script setup lang="ts">
import { defineAsyncComponent, h } from 'vue';

interface Props {
  name: string // svgfile名と同じにする
  size?: number // 大きさはwithDefaultsでいれるので、任意
}
const props = withDefaults(defineProps<Props>(), {
  name: '',
  size: 32
});

const icon = defineAsyncComponent(async () => {
  return await import(`./icons/${props.name}.svg`).then(() => {
    return import(`./icons/${props.name}.svg`);
  }).catch(e => {
    console.warn(e);
    return h('div', props.name); //　SVGが無い場合はdevでnamaを表示
  });
});
</script>

<template>
  <component
    :is="icon"
    v-bind="$attrs"
    class="m-icon"
    :height="size"
    :name="name"
    :width="size"
  />
</template>

<style scoped>
.m-icon {
  display: block;
  fill: var(--color-text);
}
</style>

```

前提として、SVGローダー導入済み、.vuefileと同位置にiconsフォルダを用意している状態。
※vue3+vite環境なのでvite用のSVGローダーを入れています。

```
┝ composables
    ┝ icon.vue
    ┝ icons
        ┝ alert.svg
```

```terminal
yarn add -D vite-svg-loader
```

```ts:vite.config.ts
import svgLoader from 'vite-svg-loader';

export default defineConfig({
  plugins: [
    svgLoader()
  ],
})
```
[Flutter]providerの情報取得方法

こんにちは。
今回は、RiverPodの備忘録を書きます。


# 概要
![スクリーンショット 2023-08-13 20.18.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524120/ce57fee2-1687-ea40-8538-b4c8b9db94e0.png)

RiverPodでproviderの情報を取得するには、3つの方法があります。
* ref.watch
* ref.read
* ref.listen


# ref.watch
providerの変更を監視する際に、使用します。
```dart
ref.watch([ 取得するprovider ])
```

# ref.read
providerの監視が不要な場合に使用します。
また、値を更新する際に使われたりします。
buildの中に記載するとエラーの原因になるそうです。
以下参考。
https://zenn.dev/welchi/scraps/502ce58d996ca5
```dart
ref.read( [取得するprovider] )
```

# ref.listen
provider更新を監視し、更新タイミングで何かしらの処理を実行したい時に使います。
例えば、 例えばダイアログで、providerで管理した値の変化を取得するときです。
変更前と変更後を取得できるので、「〇〇を[変更前]→[変更後]に更新しました」と表示することができます。
```dart
ref.listen([ 取得したいprovider ], ([ 変更前provider ], [ 変更後provider ]){ [実行したい処理] })
```



# 最後に
ここまで読んでいただき、ありがとうございました！
いいねしてくれたら、スキップして喜びます:heartpulse:
Androidからスマートウォッチにデータを送ってみよう！（MessageClient）

WearOS開発において、教材や実装例は2014年～2015年付近のものが多く、特にAndroidからWearOSにデータを送信するコードが載っているサイトも数多くありません。
そこで初心者の方にもわかりやすくほぼコピペでできるアプリ実装例を書きました。
WearOS開発に詰まっている方に是非チェックしていただきたいです。
https://note.com/bakugui_inago/n/nc9cd083e4918?sub_rt=share_pw

アプリご紹介
Androidで値を入力し、ボタンを押したらWearOSに値を送って表示させるシンプルなアプリ。

![スクリーンショット 2024-03-06 155048.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510524/3654add6-d459-5667-7562-091fc73aa5ae.png)

　　　　　　　　　　　　　　　　　　　　　　↓
                      
![スクリーンショット 2024-03-06 155126.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510524/065db9d1-9aa8-7a6e-db25-2d9987032451.png)
ADからユーザー情報を抽出するVBS

これを使えばAD内のユーザーがどこに所属しているかがわかるよってメモ

```Search.vbs
Option Explicit
Const SearchUser = "testusera"
Dim baseDN, objRootDSE
Dim objConnection, objCommand, strCommandText
Dim objRecordSet, strUserDN
baseDN = ""

' ベースDNの取得
On Error Resume Next
Set objRootDSE = GetObject("LDAP://rootDSE")
If Err.Number <> 0 Then
  WScript.Echo "ドメイン接続に失敗しました。終了します。"
  WScript.Quit
Else
  baseDN = objRootDSE.Get("defaultNamingContext")
End If
On Error Goto 0

' DCに接続して検索
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
objCommand.ActiveConnection = objConnection
strCommandText = "<LDAP://" & baseDN & ">;" & _
	"(&(objectClass=user)(sAMAccountName=" & SearchUser & "));" & _
	"distinguishedName;" & _
	"subtree"
objCommand.CommandText = strCommandText
Set objRecordSet = objCommand.Execute

' 検索結果を表示
If objRecordset.EOF Then
  strUserDN = "ログオンアカウント " & SearchUser & " は見つかりませんでした。"
Else
  strUserDN = objRecordset.Fields("distinguishedName")
End If
WScript.Echo strUserDN
objConnection.Close
Set objCommand = Nothing
```
【MySQL】phpMyAdminでデータベースの容量サイズを表示【MariaDB】

https://demo.phpmyadmin.net/master-config/

# 1. データベースを押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/b6b0cc6d-3699-1b93-7fae-fe1963151beb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/44517538-537b-8956-bfb2-46f68f38e6e7.png)

# 2. 統計を有効にする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/f0e01d69-69ba-f4cb-bff4-491e29831627.png)

# 3. データベースの容量を確認する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/d785cf29-b9e1-4298-c6e1-c22b8a0a75b8.png)

`合計`を押すと並び替えできます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/0e8d3f45-ded3-5341-27ad-3ca91b7adfcb.png)
rút tiền vietcombank

Thẻ tín dụng Vietcombank có thể rút tiền được và tại Sk POS có hỗ trợ rút tiên thẻ này. Với mức phí rút tiền thấp và đảm bảo an toàn trong giao dịch.

https://quatangchosuckhoe.net/the-tin-dung-vietcombank-co-rut-tien-mat-duoc-khong
pipreqsを使用してrequirements.txtを自動生成する

pythonで個人開発でローカルでいろいろ作ってたので依存管理自動でできないかなと思ったらちゃんと`pipreqs`っていう自動生成できるってのがあったので使ってみる。
`pipreqs`の中身はこちら
https://github.com/bndr/pipreqs


pipreqsをインストール
`pip install pipreqs`
requirements.txtを以下のコマンドで作成
`pipreqs .`（ディレクトリ内で実行）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655530/e4f72bdd-9ca1-19f2-6a4d-f1a6007c3b4d.png)
更新すると自動作成されます。


追記
`INFO: Not scanning for jupyter notebooks.
WARNING: Import named "azure_storage" not found locally. Trying to resolve it at the PyPI server.
WARNING: Import named "azure_storage" was resolved to "azure-storage:0.37.0" package (https://pypi.org/project/azure-storage/).
Please, verify manually the final list of requirements.txt to avoid possible dependency confusions.
WARNING: Import named "python-dotenv" not found locally. Trying to resolve it at the PyPI server.
WARNING: Import named "python-dotenv" was resolved to "python-dotenv:1.0.1" package (https://pypi.org/project/python-dotenv/).
Please, verify manually the final list of requirements.txt to avoid possible dependency confusions.
INFO: Successfully saved requirements file in .\requirements.txt`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655530/3d3b1e50-8aff-a9c8-fc9e-ccfbcc1b4dd5.png)
ん？なんかいらないものあるし、なんか少ないので見てみると警告が出ていた。
要約するとpipreqsが自動でパッケージ名を推測したものの、その推測に完全ではないから確認してねと言っている。
azure_storageってのがあるらしいので入れたから確認してねと言っている。
実際はazure-search-documentsなのに、比較的新しいライブラリだから知らないんだろうか。
結局手動で確認して正しいのはこっちでした。完全自動は無理なようでした。
```
openai==0.27.0
pandas==1.5.1
python-dotenv==1.0.1
streamlit==1.24.0
azure-core==1.29.4
azure-search-documents==11.4.0
```
javascriptでオブジェクトが入った変数をコピーする方法


JavaScriptでオブジェクトが入った変数をコピーするには、いくつかの方法があります。

## 1. 浅いコピー（シャローコピー）

オブジェクトの参照をコピーする方法です。オブジェクト内のプロパティは共有されます。

方法

- Object.assign()

```javascript
const obj1 = {
  name: "John",
  age: 30,
};

const obj2 = Object.assign({}, obj1);

// obj1とobj2は同じオブジェクトを参照している
console.log(obj1 === obj2); // true

// obj1のプロパティを変更すると、obj2も変更される
obj1.name = "Mary";
console.log(obj2.name); // "Mary"
```

コードは注意してご使用ください。
- スプレッド構文
```javascript
const obj1 = {
  name: "John",
  age: 30,
};

const obj2 = { ...obj1 };

// obj1とobj2は同じオブジェクトを参照していない
console.log(obj1 === obj2); // false

// obj1のプロパティを変更しても、obj2は変更されない
obj1.name = "Mary";
console.log(obj2.name); // "John"
```
コードは注意してご使用ください。
## 2. 深いコピー（ディープコピー）

オブジェクトとそのプロパティすべてを新しいオブジェクトにコピーする方法です。

方法
- JSON.parse(JSON.stringify())
```javascript
const obj1 = {
  name: "John",
  age: 30,
  address: {
    city: "Tokyo",
  },
};

const obj2 = JSON.parse(JSON.stringify(obj1));

// obj1とobj2は異なるオブジェクトである
console.log(obj1 === obj2); // false

// obj1のプロパティを変更しても、obj2は変更されない
obj1.name = "Mary";
console.log(obj2.name); // "John"

// obj1.addressのプロパティを変更しても、obj2.addressは変更されない
obj1.address.city = "Osaka";
console.log(obj2.address.city); // "Tokyo"
```
コードは注意してご使用ください。
## Lodashなどのライブラリ
Lodashなどのライブラリを使用すると、簡単に深いコピーを行うことができます。

```javascript
const _ = require("lodash");

const obj1 = {
  name: "John",
  age: 30,
  address: {
    city: "Tokyo",
  },
};

const obj2 = _.cloneDeep(obj1);

// obj1とobj2は異なるオブジェクトである
console.log(obj1 === obj2); // false

// obj1のプロパティを変更しても、obj2は変更されない
obj1.name = "Mary";
console.log(obj2.name); // "John"

// obj1.addressのプロパティを変更しても、obj2.addressは変更されない
obj1.address.city = "Osaka";
console.log(obj2.address.city); // "Tokyo"
```
コードは注意してご使用ください。
## 3. その他の方法

上記以外にも、特定の状況で使用できる方法があります。

- 手動でコピーする
オブジェクトのすべてのプロパティを手動でコピーします。

- 自作の関数を使用する
深いコピーを行う自作の関数を作成します。

どの方法を使用するべきか

使用する方法は、状況によって異なります。

浅いコピーで十分な場合は、Object.assign()やスプレッド構文を使用するのが簡単です。
深いコピーが必要な場合は、JSON.parse(JSON.stringify())やLodashなどのライブラリを使用するのが便利です。
特定の状況に合わせた方法が必要な場合は、手動でコピーしたり、自作の関数を作成したりします。
VBSを使用し、特定のファイルを抽出する

下記コードを使用し、ネットワークドライブから自身のCドライブにファイルを持ってきたのでメモ
```copy&paste.vbs
Dim strFilePath
Dim strDir
Dim objSysInfo, objUser
Dim objShell, strDesktopPath

' フォルダのパス
folder = "C:\***"←保存したい自身のパス

' ファイルシステムオブジェクトの作成
Set fso = CreateObject("Scripting.FileSystemObject")

' フォルダが存在しない場合のみ処理を実行する
If Not (fso.FolderExists(folder)) Then
    ' フォルダの作成
    fso.CreateFolder(folder)
End If

' ユーザー情報取得
Set objSysInfo = CreateObject("ADSystemInfo")
Set objUser = GetObject("LDAP://" & objSysInfo.UserName)

' コピーするファイルのパス
strFilePath = "\\***\***\***\" & objUser.sAMAccountName & ".pst"←今回はユーザー名.pst
ファイルを抽出
' コピー先のパス
strDir = "C:\***"

' ファイルシステムオブジェクト作成
Set objFS = CreateObject("Scripting.FileSystemObject")

' ファイルコピー
If fso.FileExists(strFilePath) Then
    objFS.CopyFile strFilePath, strDir & "\", True
    WScript.Echo "ファイルが正常にコピーされました。"
Else
    WScript.Echo "コピー元のファイルが見つかりませんでした。"
End If

' ユーザーのデスクトップフォルダパスを取得
Set objShell = CreateObject("WScript.Shell")
strDesktopPath = objShell.SpecialFolders("Desktop")

' コピーするファイルのパス
strFilePath = "\\***\***\\****.url"←urlファイルを抽出
' コピー先のパス
strDir = strDesktopPath & "\"

' ファイルコピー
If fso.FileExists(strFilePath) Then
    objFS.CopyFile strFilePath, strDir, True
    WScript.Echo "ファイルが正常にコピーされました。"
Else
    WScript.Echo "コピー元のファイルが見つかりませんでした。"
End If
```
Sentry カスタマイズ

## スコープを区切ってカスタマイズ
SQSのキューイングが失敗した際の例

`Sentry.with_scope do |scope|` を利用するとこの中で `set_`したものは
このスコープの中でだけ有効になります。

```rb
failed_context = response.successful.map { |entry| [entry[:id], entry] }.to_h
message = "SQS送信に失敗したユーザID: #{failed_context.keys}"

Sentry.with_scope do |scope|
  scope.set_tags(failed_ids: "タグ")
  scope.set_context('送信に失敗したID', failed_context)
  Sentry.capture_message("SQSへの登録に失敗しました")
end

```


| メソッド名 | 説明 |
| --- | --- |
| configure_scope | このメソッドを使うと、その後発生する全てのエラーログに対して適用されるグローバルなスコープを設定することができます。例えば、すべてのエラーに共通のユーザ情報を追加したいときに使います。 |
| with_scope | このメソッドを使うと、一時的(そのブロック内限定)なスコープを作成できます。ブロックが終了すると、そのブロック内で設定したスコープはクリアされます。独自のエラーメッセージや一時的なエラー処理に追加情報を提供したい場合に使います。 |
| push_scope | `push_scope`も新たなスコープを作るメソッドで、`with_scope`と同様に一時的なスコープを作成します。ただし、`push_scope`は新たなスコープをスタックに積む（push）ため、複数のスコープを重ねて利用することができます。そのため、深いネストの中で一時的なスコープを作成しつつ、外側のスコープへの影響を避けたい場合に有用です。 |


## 意図的な raise とともにエラーを送りたい
raise すると Sentry に自動で通知されると思います
なので Sentry capture exception を実行すると多重送信になってしまうのを
こちらで防いでます。

```rb
failed_context = errors.index_by { |entry| entry[:id] }

Sentry.with_scope do |scope|
  scope.set_context("送信に失敗したID", failed_context)
  begin
    raise "SQSへの登録に失敗しました"
  rescue StandardError => e
    Sentry.capture_exception(e)
    raise e
  end
end
```
js 数値にsort()使ってもうまくいかない理由

## jsのソートがうまくいかない
kintoneカスタマイズのために、javascriptを練習しているとこんな現象が起きた

```js
const array = [2, 99, 80, 2, 19, 22];
array.sort();
console.log(array); // 出力 Array(6)[ 19,2,2,22,80,99 ]
```
うまくいけば
```js
// Array(6)[ 2,2,19,22,80,99 ]
```
と出力されるはずだ。

## sortメソッドはデフォルトだと文字列として要素を比較する
sort()メソッドは本来、デフォルトだと文字列を比較するメソッド。つまりアルフォベット順にする。数値として比較したいときは、比較関数を用いる

## 比較関数とは？
sort()メソッドに指定するコールバック関数。[MDM](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)では`compareFn(a, b)`と表現されている。比較関数を指定しないと、文字列として比較される

```js
const array = [2, 99, 80, 2, 19, 22]
const array = [2, 99, 80, 2, 19, 22]
array.sort( compareFn = (a, b) =>  a - b )
console.log(array); // Array(6)[ 2,2,19,22,80,99 ]
```
`array.sort( compareFn = (a, b) =>  a - b )`は省略して`array.sort((a, b) =>  a - b)`とすることもできます。
シリアル受信データに「０」がない

シリアル通信でデータを取得しようとしたけれど、既定のデータが取れなかった時の話です。
初心者っぽいハマり方でちょっと恥ずかしい話ですが...。同様の現象でお困りの方の参考になれば幸いです。

#### 環境：
・Windows API

#### 現象：
あるデータを取得しようとしたところ、56バイトあるはずのデータが25バイトしかない。
データを確認したところ「0x00」がない（イメージデータ↓）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703624/00ee8950-d3b6-1833-064d-30b069f2c11a.png)

#### 原因：
シリアルポート設定でfNULLをTRUEに設定していた。

```:NGコード
    /* シリアルポートを開く */
    hComPort = CreateFile(com, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
    // エラーチェックコード省略

    /* 送受信バッファ設定 */
    ret = SetupComm(
        hComPort,     // COMポートハンドラ
        1024,         // 受信バッファサイズ:1024byte
        1024          // 送信バッファ:1024byte
    );
    // エラーチェックコード省略

    ret = PurgeComm(
        hComPort, // COMポートのハンドラ
        PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR // 出入力バッファをすべてクリア
    );
    // エラーチェックコード省略

    /* シリアルポートを設定する */
    DCB dcb;
    ret = GetCommState(hComPort, &dcb); // 現在の設定値を読み込み
    // エラーチェックコード省略

    dcb.DCBlength = sizeof(DCB);
    dcb.BaudRate = speed;      // 速度
    dcb.ByteSize = 8;          // データ長
    dcb.Parity = NOPARITY;     // パリティ
    dcb.StopBits = ONESTOPBIT; // ストップビット長
    dcb.fBinary = TRUE;        // バイナリモード:TRUE

    dcb.fNull = TRUE;          // NULLバイトの破棄:破棄する　←これ
    以下、省略
```

#### 対応
fNullをFALSEに変更
```:修正
    dcb.fNull = FALSE;          // NULLバイトの破棄:破棄しない　←これ
```
#### 結果
「0x00」のデータも受け取れるようになりました↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703624/1db551ad-a86d-8946-f1eb-beb75df0fa24.png)

現場からは以上です。
可変FPSなUnityで指数関数による速度変化

例えばあるキャラクターが速度speed、
位置posという値を持っているとします。

で「ググーッと急ブレーキで止まる」みたいなことやらせたいからと、
毎フレームの位置と速度の更新を
下記のようにやってしまうとFPSが変化した時に挙動が変わってしまう。
```
float speed = 1;　// 初速
Vector3 pos; // 現在位置
const float breakPow = 0.05f; // ブレーキ力。1未満。大体0.001から0.05ぐらいが実用的

// 毎フレーム呼び出し
void Update()
{
    // 速度更新
    speed *= (1 - breakPow); // 掛け算でブレーキ。ググーッと止まる

    // 位置更新
    pos.x += speed * Time.deltaTime;
}
```
FixedUpdateを使う、速度ではなく位置をイージングするなど対処方法はあるのですが、今回は数学で。

ということで、まず速度の変更はこうします。
```
// 指数関数で補間
float Interpolate(float from, float to, float pow, int fps, float t)
{
    float rate = 1 - Mathf.Pow(1 - pow, fps * t);
    return Mathf.Lerp(from, to, rate);
}

// 毎フレーム呼び出し
void Update()
{
    const int FPS = 120; // 基準となるFPS

    // FPSが変わっても大丈夫なように速度更新
    speed = Interpolate(speed, 0, breakPow, FPS, Time.deltaTime);

    // さて、移動量は・・・積分が必要！
    //pos.x += speed * Time.deltaTime;
}
```
あとは位置の更新ですが、こちらは定積分が必要。
もはや積分のことなんてとっくに忘れてしまったので、
ChatGPTさんにやってもらいました。

これが結果。
```
// fromからtoに向かって変化する場合の[0からt]までの定積分
float CalcDefiniteIntegral(float from, float to, float pow, int fps, float t)
{
    var a = to;
    var b = from - to;
    var p = 1 - pow;
    var q = fps;
    return a * t + b / (q * Mathf.Log(p)) * (Mathf.Pow(p, q * t) - 1);
}
```
ということでまとめるとこんな感じ。
```
// 毎フレーム呼び出し
void Update()
{
    const int FPS = 120; // 基準となるFPS

    // FPSが変わっても大丈夫なように位置更新
    pos.x += CalcDefiniteIntegral(speed, 0, breakPow, FPS, Time.deltaTime);

    // FPSが変わっても大丈夫なように速度計算
    speed = Interpolate(speed, 0, breakPow, FPS, Time.deltaTime);
}
```
Lambda（AWS Lambda）について

# はじめに
こんにちは！開発部のMです。
今回はサーバーレスサービスの一つである「Lambda」についてご紹介します。

# Lambdaとは
FaaSサービスの一つです。本来、アプリケーションを開発するためには自社内でサーバを準備しなければなりません。しかし、FaaSではインターネットを介してサーバを利用できるため、サーバレスな開発が実現します。
これはアプリ開発者によるサーバ管理が不要、存在を意識する必要がないということであり、サーバがなくてもアプリ開発ができるという意味ではありません。

# AWS Lambdaの特徴
AWS Lambdaでは、まず実行したいアプリケーションコードをLambda関数で開発し、Lambda上にデプロイします。するとアプリケーションが実行可能になります。

### サポート言語
Java、Go、PowerShell、Node.js、C#、Python、Rubyなど
その他のプログラミング言語を使用できるようにするための Runtime API も提供されています。

### 処理のトリガー
* 　**ファイル処理:**　Amazon Simple Storage Service (Amazon S3) を使用して、アップロード後に Lambda データ処理をリアルタイムでトリガーします。
* 　**ストリーム処理:**  Lambda と Amazon Kinesis を使用して、アプリケーションアクティビティの追跡、取引注文の処理、クリックストリーム分析、データクレンジング、ログのフィルタリング、インデックス作成、ソーシャルメディア分析、モノのインターネット (IoT) デバイスデータのテレメトリ、および計測のためにリアルタイムのストリーミングデータを処理します。
* 　**ウェブアプリケーション:**  Lambda と他の AWS サービスを組み合わせて、自動的にスケールアップおよびスケールダウンし、複数のデータセンターにまたがる高可用性設定で実行される強力なウェブアプリケーションを構築します。
* 　**IoT バックエンド:**  Lambda を使用してサーバーレスバックエンドを構築し、ウェブ、モバイル、IoT、およびサードパーティの API リクエストを処理します。
* 　**モバイルバックエンド:**  Lambda と Amazon API Gateway を使用してバックエンドを構築し、API リクエストを認証して処理します。AWS Amplify を使用すると、iOS、Android、ウェブ、React Native フロントエンドと簡単に統合できます。

### 料金体系
関数へのリクエストの数とコードの実行時間に基づいて課金されます。Lambda は、コンソールからのテスト呼び出しを含む、イベント通知や呼び出しに応答して実行を開始するたびにリクエストを登録します。関数全体の合計リクエスト数に対して課金されます。

# メリット
リクエスト数が変動的で処理の稼働時間が短時間であるシステムの場合コストパフォーマンスに優れています。
また一つのリクエストを処理している間に再度呼び出されると別のインスタンスが割り当てられ同時実行数の上限まで自動スケールアウトします。

# デメリット
Lambdaの最大稼働時間は15分、メモリ容量は128MB〜10GBであるため軽量なステートレスアプリケーションには向いていますが常時稼働しているようなシステムやタイムアウトの上限15分よりも長い処理、10GBよりも多くのメモリを必要とする処理には向いていません。

# 最後に
AWS Lambdaは軽量なステートレスアプリケーションを求める方にはおすすめのサービスであるということがわかりました。ニーズに合わせて最適な提案ができるよう今後も様々なサービスをご紹介していきます。

はつかぜ株式会社では、IT学習や業務に役立つ情報を定期的にお届けしていきたいと思っています。
システム開発のお問い合わせ・ご相談はこちら
https://www.hatsukaze.co.jp/inquire/
プログラマー35歳定年説があるけど... 今年で54歳だがまだまだコーディングするなぁ


今年で54歳になりますねぇ。Qiitaのイベントがあるので、ちょっと自分のキャリアを振り返ってみたいと思います。ITに関係ない職種の部門にも在籍していたのですが、その部分は割愛します。

# 大学時代

大学は学部としては情報系ですが、専攻は生物化学だったので　プログラミングはしていましたが測定装置のシーケンス制御用にコーディングしてました。確かPC98にボードを差してN88 Basicで制御していたかな。

あと、データをきれいにグラフにするためにTurbo Pascalのグラフ作成ライブラリーを改造して使ってました。卒研の発表はOHPで行っていた時代ですから... パワーポントはまだ無かったよ。

# 就職　1993年

大学の先輩方が多かったこともあって、機械メーカーに就職。しかし専攻が生物化学と全く会社では関係なかったので、システム部門（システム子会社）に配属でした。そこで工場のシステム部門だったので生産管理を一から勉強しましたね。

担当した主なシステムがIBMの大型汎用機だったので開発言語はPL/IとJCLでした。PL/IはTurbo Pascalに似ていたのですんなり覚えられましたね。基本的に半角カナの世界でしたが、ちょうどオンライン画面の表示を漢字化している時期だったのでたくさんのオンラインシステムを改修したことを覚えています。画面表示だけでなくロジックを見直して処理速度を上げることもしました。

バッチ処理も多かったし、自分の担当するシステムの夜間処理が早く終わるように結構書き直しましたね。処理がアベンドして真夜中に呼ばれるのは嫌だったので、自分のためにもがんばって作業しました。

そうそう、ここではパンチカードにプログラムが書き込まれていて、処理を流すときは慎重に行ってましたね。カードを落として順番が分からなくなったら大変です。この処理って年に１回しか流さない固定資産の処理だったような... FORTRAN 77のコードもあって、たまに修正依頼があって対応していました。

# 1回目の転勤　1996年

生産管理については中小企業診断士のテキストで勉強して、非常に面白かったです。ただシステム子会社での仕事は自由度が少なくずっと続けていくのも問題だなと思って、退職届を出したら破られてしまいましたね。出向を解除してくれて本体に戻ることに... 赤字事業部の管理部門に異動となりました。

赤字事業部のつらいところは、業務改善でシステムを改修したいんだけど後回し、いやいや順番は回ってこなかったです。元システム部門ということで、何とかしろという流れになって、とりあえず自分でLinux サーバーを立ててPHPでシステムを組みました。　サバーも費用を抑えるために自作PCで行いましたが、24時間つけっぱなしですぐに壊れました。　結局は中古のサーバーを買って対応しました。中古とはいえ業務用は丈夫でしたね。

# グループの基幹システムの再構築　2003年

この頃から古くなったグループの基幹システムの再構築のプロジェクトで事業部の窓口をしてました。途中から本社の情報システム部門に異動になったので基幹システムのあるサブシステムの要件定義から初期値の移行やマニュアル作成などを行っていました。その後は基幹系として再構築しなかったシステムの企画を色々しながらパワーポイントばっかり作ってましたね。まぁ、予算と実際に作ることができないと言われてほとんど実現しなかったです。やっぱり自分で手を動かさないと進まないなぁっていう思いが強かったのを覚えています。結局はまた事業部の管理部門に戻りました。

この頃は上級シスアド、アナリスト、ITステラジストの高度情報処理試験の資格も取りました。上流工程を意識してましたね。でも実際にシステムが実現しないのはかなりのストレスでした。


# 古巣の事業部に戻る。開発するための道具を作る 2012年

製品の在庫と営業のフォーキャスト、工場の生産計画を動的に引き当てて過不足を検索するシステムを作りました。このときはPHPのMojavi ver3を使ってました。途中でこのプロジェクトが中止になって、無い機能は自作してましたね。あと画面の定義はExcelシートに記入したら自動で変換するプログラムも作って省力化してました。

このシステムは私が転職した後にベンダーさんが別のツールに移植して準基幹系のシステムに昇格したらしい。

# シェルを使ってシステムを作る　2015年

このころは謎テクノロジーとして紹介されているユニケージ開発手法を使ってWEBシステムを作っていました。主に基幹システムからエクスポートして大量のデータを集計して画面から確認できるような仕組みです。このときは中古でなく新品のサーバーを使ってました。マルチコアだったのでシェルで組んだジョブも早くて感動したものです。シェルも元々は大型汎用機でJCLを使っていたので似ていたのですぐに覚えることができました。

# Salesforceを使ってみる　2017年

基幹系のシステムをスマホやタブレットでも使いたいという話がだんだんと出てきました。特にサービス部門が使っているシステムでは修理に行っている社外でも使いたいというニーズがあったのです。しかし私自身がスマートデバイス用のネイティブアプリを開発できなかったことと、デスクトップ環境と２つもシステムを作ることは避けたかったので当時からスマートデバイスに対応していたSalesforceをプラットフォームに使う提案をしたら珍しく採用でした。しかし、予算がないのでカスタマイズが必要な場合は私自身が行うことが条件でしたね。

IT部門が紹介してくれたベンダーさんからはユーザ部門での自社開発は無謀だと言われましたが、どうにかフルスクラッチで完成できました。基幹システムとのリアルタイム連携のところは予算外でしたがベンダーさんに頼んで実装できましたね。バッチ連携は私がcurlコマンドを駆使して作りました。ここではLinuxで遊んでいた経験が大いに役に立ちました。


# 転職 2018年

50歳を前に転職しました。ちょうどSalesforceの管理者&開発者を希望されていたので応募してすぐに決まりました。今でもコーディングをしていますね。標準の機能でできないことを自分で作ることができるのは楽しいです。

# ここ最近は

APIを操作するときはずっとシェルでcurlコマンドを使っていましたが、最近はPostmanを使っています。



Leaflet.js をAuraコンポーネントに組み込んでみました。モバイルでも問題なく表示されるのもいい感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6a6b25ec-df80-e225-ca1a-7c0917e98954.png)
ベルトコンベアでオブジェクトを運ぶ

一定間隔で生成されるオブジェクトをベルトコンベアのような床に乗せて運べるように実装します。動作環境はUnity2022.3.10fです。

# ベルトコンベアを作る
Hierarchyビューで右クリックし、3D Object → Cubeを選択してベルトコンベアのオブジェクトを作ります。次にInspectorビューのTransformコンポーネントからパラメータを調整してベルトコンベアっぽく見えるような細長い形状にします。この環境ではベルトコンベアのInspectorビューのTransformコンポートでPositionをX=-2, Y=0, Z=0に、ScaleをX=25, Y=0.5, Z=3に設定して動作確認しています。
以下のスクリプトを作成してベルトコンベアにアタッチします。

```C#:BeltConveyor.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BeltConveyor : MonoBehaviour
{
    public float speed; //ベルトコンベアの速度

    void Start()
    {
        GetComponent<Renderer>().material.color = Color.black; //ベルトコンベアの色を黒にする
    }

    void OnCollisionStay(Collision collision)
    {
        Rigidbody rb = collision.gameObject.GetComponent<Rigidbody>();
        rb.velocity = Vector3.right * speed; //ベルトコンベアに乗っているオブジェクトを(1, 0, 0)方向に移動させる
    }
}
```

当たり判定にOnCollisionStayを使用しています。OnCollisionEnterだとオブジェクトが衝突した時だけしか処理が実行されないので、オブジェクトが摩擦ですぐに減速します。OnCollisionStayを使えばオブジェクトが当たっている間、ずっと処理が実行されます。ベルトコンベアのような一定速度の動きを再現する場合はOnCollisionStayの方が適しています。

# オブジェクトを自動生成する
ベルトコンベアを作っただけでは動作を確認できないのでベルトコンベアで運ぶためのオブジェクトも作ります。運ぶオブジェクトはスクリプトから一定間隔で動的に生成します。以下のスクリプトを作成してMain Cameraにアタッチします。

```C#:ObjectCreater.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjectCreater : MonoBehaviour
{
    Rigidbody rigidbody;
    Color[] colors = { Color.white, Color.red, Color.green, Color.blue, Color.cyan, Color.yellow, Color.magenta }; //色を配列で管理

    void Start()
    {
        InvokeRepeating("CreateCube", 0, 2); //CreateCube関数を2秒間隔で呼ぶ
    }

    void CreateCube()
    {
        GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube); //Cubeを生成
        cube.transform.position = new Vector3(-10, 8, 0); // Cubeが生成される座標を(-10, 8, 0)に設定
        cube.GetComponent<Renderer>().material.color = colors[Random.Range(0, 7)]; // 色の配列からランダムにCubeの色を選択
        rigidbody = cube.AddComponent<Rigidbody>(); //CubeにRigidbodyをアタッチする
        rigidbody.constraints = RigidbodyConstraints.FreezeRotation; //オブジェクトの回転を防止
    }
}
```

CubeなどのInspectorビューから作ることができる基本的な3DオブジェクトはGameObject.CreatePrimitive関数で生成できます。PrimitiveTypeのフィールドを変えることでSphereやCapsuleを生成することもできます。

# 実行
オブジェクト及びスクリプトの作成とアタッチが出来たら、ベルトコンベアオブジェクトのInspectorビューからパラメータSpeedが出来ているので適当な値を入力します。
実行すると以下のようにCubeが一定間隔で生成され、ベルトコンベアで運ばれていきます。

![Image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3644510/2231323a-3d13-1328-56e8-3d10fea23c14.png)

# 参考
https://docs.unity3d.com/ja/2021.1/ScriptReference/GameObject.CreatePrimitive.html
https://nosystemnolife.com/untiy_movefloor/
【小ネタ】VoiceOverで読み上げをチェックしたい頭痛持ちの人へ

## これは何

Webを開発する時に、スクリーンリーダーの読み上げをチェックするためにMacの読み上げ機能であるVoiceOverをオンにすることがよくあります。

https://support.apple.com/ja-jp/guide/voiceover/vo2682/mac

ただ、私は頭痛持ちのため高い音や大きい音が苦手で、初期設定のままだとVoiceOverを使うことができません。

そこで、頭痛持ちの人におすすめのVoiceOver設定を紹介します。

:::note warn
飽くまで自分の場合はこれが楽という設定です
:::

## VoiceOverのおすすめ設定

まずVoiceOverの細かい設定はシステム環境設定 →  アクセシビリティ →  VoiceOverの中にある「VoiceOverユーティリティ」から変更できます。

![Macのシステム環境設定のVoiceOverのページのスクリーンショット。VoieOverユーティリティのボタン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/1d54a0c0-6ebd-056a-1dde-18937bb24e96.png)

### 声の高さを低く・音量を小さくする

VoiceOverユーティリティの声のタブで「編集」ボタンを押すと、読み上げる声の設定を細かく変更できます。

声の種類が5パターンから選べるのと、読み上げの速度、ピッチ、音量が数値で設定できます。

自分の場合、声は「Kyoko」・速度は50、ピッチを1・音量を20にしています。

ピッチを一番下まで下げた時に、「Kyoko」が一番聞き取りやすかったので選んでいます。
また、速度も早すぎると頭が痛くなるのでギリギリ大丈夫な50にしています。

この辺りの感じ方は人それぞれだと思うので、いろいろ試してみて調整するのが良いと思います。

![Macのシステム環境設定のVoiceOverユーティリティのスクリーンショット。デフォルトシステム言語用の声の設定のモーダル、カテゴリがデフォルト、声がKyoko、速度が50、ピッチが1、音量が20。](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/5ff59376-756b-7fdf-3996-e02507c49769.png)

### （頭痛がひどい時は）音声をオフにする

頭痛がひどくて音声を聞けない時はVoiceOverユーティリティのスピーチのページ内の声のタブにある「スピーチを消音」のチェックボックスをオンにすると、読み上げ音量を0にできます。

VoiceOverをオンにしている時は読み上げ内容がテキストでも表示されるので、その内容を確認すれば最低限の読み上げの内容は分かります。

![Macのシステム環境設定のVoiceOverユーティリティのスクリーンショット。スピーチのページ、声のタブ、スピーチを消音にチェックが入っている。](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/74feb60c-4160-453e-720e-b788f101b56d.png)

### サウンドエフェクトを消音する

VoiceOverを利用中、フォーカスを切り替えた時などにエフェクト音が鳴ります。
自分の場合この音が苦手なので、VoiceOverユーティリティのサウンドのタブで、「サウンドエフェクトを消音」のチェックボックスをオンにして、音が鳴らないようにしています。

![Macのシステム環境設定のVoiceOverユーティリティのスクリーンショット。サウンドのタブ、「サウンドエフェクトを消音」のチェックボックスがオンになっている。](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/c38842c7-63f3-2e8a-5a94-bfbc42a8eaea.png)
MySQLのODBCドライバ実行時に「Microsoft Visual C++ 再頒布可能パッケージが必要」と言われたときの解決方法

# エラー内容
MySQLのODBCドライバのインストーラーを実行しようとしたらこんなエラーが。
``This application requires Visual Studio 2019 x64 Redistributable. Please install the Redistributable then run this installer again.``

# 解決方法
「Visual Studio 2019 の Microsoft Visual C++ 再頒布可能パッケージ」をダウンロードすればOKです。Visual StudioがPCに入ってなくても大丈夫です。

[Microsoftのダウンロードページ](https://visualstudio.microsoft.com/ja/downloads/)から `Microsoft Visual C++ Redistributable for Visual Studio 2022` をダウンロードしてインストールしましょう。2022と書かれていますが、VisualStudio2015～2022が対象ならこのバージョンをインストールして大丈夫です。
インストールが終われば通常通りドライバのインストーラーを実行すればエラーは出ないはずです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303641/a879c7e9-a952-009f-6889-c1f8f83fe4bd.png)

念のためダウンロードの直リンクを貼っときます。
・[Microsoft Visual C++ Redistributable for Visual Studio 2022 x64](https://aka.ms/vs/17/release/VC_redist.x64.exe)
・[Microsoft Visual C++ Redistributable for Visual Studio 2022 ARM64](https://aka.ms/vs/17/release/VC_redist.arm64.exe)
・[Microsoft Visual C++ Redistributable for Visual Studio 2022 x86](https://aka.ms/vs/17/release/VC_redist.x86.exe)
[変換] 通貨の異なる株価を比較したい[為替] 


通貨の異なる株価を比較したい.

株価の具体的な比較方法は別記事で。orほかの方のを参照いただければ。

## 解決方法

# 通貨変換APIをつかう

より正確だけど　呼び出すのが面倒かもしれない

Copilotに聞いた感じ、下記のAPIが有名とのこと


### Currency Converter API:
150以上の通貨に対応し、毎時更新されるデータを提供します。無料プランでは1時間に100リクエストまで可能。
### currencylayer API: 
168カ国の通貨のリアルタイム為替レートと通貨変換を提供。
### Alpha Vantage API: 
リアルタイムおよび歴史的な株価データに加えて、通貨変換機能も提供。
### Fixer API: 
リアルタイムの為替レートデータを提供し、無料プランでも利用可能。

##### Code

~~~
    # 通貨がUSDでない場合、変換する
if currency_code != currency:

        # 仮の変換方法（実際の通貨変換APIなどを使用する必要があります）
        conversion_rate = 1.25  # 仮の変換レート
        price = float(price) * conversion_rate
       
~~~

# 為替を探して自分で当てはめる
ちょっと面倒なバージョン


##### Code例

~~~
    # 通貨がUSDでない場合、変換する
if currency_code != currency:

 
        # USDとの為替
def convert_to_usd(amount, currency):
    conversion_rates = {
        'EUR': 1.106,    
        'JPY': 0.0071   
~~~
BicepでマネージドIDに「Cosmos DB組み込みデータ共同作成者」ロールを付与する

マネージドIDにCosmosDBへのアクセス権限を付与する方法です。
CosmosDBの管理プレーンへのアクセス権限はAzureポータルからRBACで付与できますが、データプレーンへのアクセス権限はCLIやPowerShellを利用する必要があります。
[マネージド ID を使用して Azure 仮想マシンから Azure Cosmos DB に接続する方法](https://learn.microsoft.com/ja-jp/entra/identity/managed-identities-azure-resources/tutorial-vm-managed-identities-cosmos?tabs=azure-cli)

今回はBicepで付与する方法を残します。

* 例としてAzure Container AppsのマネージドIDに付与します
* まずは以下のようにACAのシステムマネージドIDを有効にします

```text:ACAのマネージドID設定(一部抜粋)
resource containerApp 'Microsoft.App/containerApps@2023-05-01' = {
  name: appName
  location: location
  identity: {
    type: 'SystemAssigned'
  }
  properties: {
    managedEnvironmentId: environment.id
    configuration: {
      ingress: {
        targetPort: 80
        external: true
        ipSecurityRestrictions: [ for list in ipAllowList : {
          name: list.name
          action: list.action
          ipAddressRange: list.ipAddressRange
        }]
      }
    }
    template: {
      containers: [
        {
          image: 'nginx:latest'
          name: 'sample-apps'
          resources: {
            cpu: json('${cappDedicatedCpu}')
            memory: '${cappDedicatedMemory}Gi'
          }
        }
      ]
      scale: {
        minReplicas: 1
      }
    }
    workloadProfileName: 'Consumption'
  }
}

output acaPrincipalId string = containerApp.identity.principalId
```

* ACAのマネージドIDプリンシパルIDに「Cosmos DB 組み込みデータ共同作成者」ロールを付与します

```
resource cosmosdbRoleDefinition 'Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions@2023-04-15' existing = {
  parent: cosmosDb
  name: '00000000-0000-0000-0000-000000000002'
}

resource roleAssignment 'Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments@2023-04-15' = {
  parent: cosmosDb
  name: guid(cosmosDb.id, acaPrincipalId, cosmosdbRoleDefinition.id)
  properties: {
    roleDefinitionId: cosmosdbRoleDefinition.id
    principalId: acaPrincipalId
    scope: cosmosDb.id
  }
}
```

以上です。
A failure occurred while executing com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask$TaskAction


モジュール作成し、ビルドしようとしたら起きたエラー

## 🚑エラー内容
```
Execution failed for task ':app:processDebugResources'.
> A failure occurred while executing com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask$TaskAction
   > AAPT2 aapt2-8.1.0-10154469-osx Daemon #0: Unexpected error during link, attempting to stop daemon.
     This should not happen under normal circumstances, please file an issue if it does.
```

## 🩹エラー対処
module配下の`build.gradle.kts`を編集

**変更前**
```Gradle:build.gradle.kts
plugins {
    id("com.android.application")
}
```

**変更後**
```Gradle:build.gradle.kts
plugins {
    id("com.android.library")
}
```

## 最後に
module配下の`build.gradle.kts`の`defaultConfig`内にあった`applicationId`なども削除しないと怒られた
Salesforce認定アドミニストレーターを受験することになったから過去問を解いてアウトプットしていこうと思う。Q31 ~ Q40

## Q31. A社は, 連絡先の関連付けを表示するために契約階層を使用したいと考えている. 管理者は連絡先階層に関して何を考慮する必要がある？
A: 連絡先階層の連絡先表示は, ユーザーによるレコードレベルのアクセスに限定される.
### 解説
　ユーザーが特定の連絡先にアクセスする権限がない場合, その連絡先は連絡先階層に表示されない. 連絡先階層は, ユーザーのセキュリティ設定やアクセス権に基づいて連絡先を表示させる.

 ## Q32. APIおよびインポートウィザードを使用して, データ検証ルールもされますか？
 A: はい
 ### 解説
 データの整合性や品質を保つために, 検証ルールは重要. 

 ## Q33. データローダについて正しいのはどれ？
 選択肢 : 
    Aカスタム オブジェクトをロードできません
    Bロード後にエラーレポートを生成します
    Cカスタム オブジェクトを含むすべてのオブジェクトをロードできます。
    Dレコードの重複排除と挿入
    E salesforce.com アプリケーションと共にインストールされます。
    
A: B,C
### 解説
エラーレポートの生成によって, 問題のトラブルシューティングに役立つ. また, データローダはカスタムオブジェクトを含むすべてのオブジェクトをロードできる. これによりユーザーはカスタムオブジェクトにデータをインポートしたりエクスポートしたりすることができる.

## Q34. Spring11のService CloudおよびService Cloudコンソールの拡張機能のうち, セットアップを必要とせずにすべての管理者に自動的に表示されるのはどれ？
選択肢 : 
    Aレポートおよび記事関連リストで使用できる追加のケース記事フィールド
    B Service Cloud コンソールのグローバル検索
    C Salesforce ナレッジ記事番号
    D Service Cloud コンソールの Salesforce ナレッジ サイドバー (コンテキスト ナレッジ)
    E Salesforce ナレッジの複数言語

A: A, D, E
### 解説
Spring11のリリースでは, ケース記事に関する追加のフィールドがレポートや記事関連リストに自動的に追加された. また, Service CloudコンソールにSalesforceナレッジサイドバーが追加され, これによりエージェントはケースの文脈に基づいて関連するナレッジ記事を簡単に検索・参照することができる. さらに, Spring11のリリースでは, Salesforceナレッジが複数の言語をサポートするようになった.

## Q35. Salesforce.comでキャンペーンを表示できるユーザーは？
A: キャンペーンオブジェクトにアクセスできるSalesforce.comのすべてのユーザー.
### 解説
「キャンペーン」とは, マーケティング活動によって発生した見込み客の連絡先や反応、商談数と結果、獲得できたセールスパイプランなどを詳細に追跡するための機能である.

## Q36. ○○は, ユーザーがユーザーインターフェースで何を表示できるか, 何を実行できるかを決定する設定と, アクセス許可のコレクションを定義する. ○○に当てはまる言葉は？
A: プロファイル
### 解説
プロフィルは, Salesforceでのユーザーのアクセス権限を定義するものである. ユーザーがシステム内で何を見ることができ, どんな操作を行うことができるのかを制御する.

## Q37. あなたは, Professional Edition組織で作業をしています. 彼らは4つのカスタムタブ, 3つのカスタムオブジェクト, および1つのカスタムアプリを使用する必要がある. Expense Trackerをインストールしたいと考えているが, 会社がすでに4つのアプリケーション, 36個のカスタムオブジェクト, および7個のカスタムタブを使用している場合, Expense Trackerをインストールしようとするとどうなる？
A: カスタムタブの最大数に達したため, インストールプロセスを完了できない.
### 解説
Edition(エディション)とは, 異なるサイズやニーズの組織が利用できるように設計された, 様々な機能セットと価格設定のバージョンのこと. 
Professional Edition組織におけるカスタムタブの最大数は5個だが, すでに7個のカスタムタブを使用しているので, 設問ではインストールプロセスが完了しない.

-- Professional Editionでできること, できないこと --
https://sf.forum.circlace.com/articles/620330098079305728

## Q38. 管理者が権限セットグループを含む管理パッケージをインストールした. インストールされた権限セットグループにはいくつかのオブジェクトに対する削除アクセス権が含まれており, 管理者は権限セットグループのユーザーがレコードを削除できないようにする必要がある. 管理者は削除アクセスを制御するために何をするべき？
A: 権限セットグループでミュート権限セットを使用して, 選択した権限をミュートする.
### 解説
ミュート権限セットを使用すると, 権限セットグループに含まれる特定の権限を無効にすることができる.

## Q39. Salesforceで新しいカスタムオブジェクト「プロジェクト」を作成し, 既存の「アカウント」オブジェクトと関連付ける必要がある. この関連付けを実現するために最も適切な方法とは？
A: ルックアップ関係を使用して「プロジェクト」から「アカウント」へのリンクを作成する.
### 解説
設問の文脈において, マスターディティール関係のような強い関係を結ぶことは必ずしも適切でない. なので, 一方が他方を所有するわけではない柔軟な関係を結べる「ルックアップ関係」で関連つけることが適切. 

## Q40. ケースが削除されると, 次のものを除いて削除される. 削除されず残るのは、　次のうちどれ？
選択肢 : 
    Aケースタスク
    Bケース活動
    Cケースコメント
    Dソリューション

A: D
### 解説
ソリューションは, ケースとは別のオブジェクトなので削除されず残る.
VSCode + Flutter でデバイスの切り替えが出来ない場合の解決法

## 問題点
既にAndroidとiOSに対応したFlutterプロジェクトで、右下の接続済デバイスを切り替えようとしても`Enable Android for this Project`や`Enable iOS for this Project`などと表示されて切り替えられない。

## 解決方法
`command(⌘)`+`shift`+`P`で`コマンドパレット`を表示。
`Reload Window`でウィンドウ再読み込みすればOK。
ZED SDK で処理の再現性を確認する

アルゴリズム開発をしていると、アルゴリズムの違いによって何が生じるのかを確認したい。
そのためには、アルゴリズムを変えても同じ入力データを与えることである。
カメラデバイス入力だけでアルゴリズムを開発していると、再現性の確認がしづらいのが難点である。
そのため、カメラデバイス入力を想定した場合でも、動画ファイル入力をも前提としたツールを作る。
その際には、動画だけでなく、IMUなどのセンサデータも含めて保存して、再現性がとれることが有用だ
ZED SDK にはそのような手段が提供されている。

# 想定する読者
stereolabsのzed2, zed mini, zed x などのステレオカメラの利用者
いまどきのステレオカメラは何ができるのかを知りたい人

# 前提
ZED SDK 4.0

## 入力データのsvoファイルへの保存
svo_recording.py の利用

https://github.com/stereolabs/zed-sdk/blob/master/recording/recording/mono/python/svo_recording.py

```
$ python svo_recording.py -h
usage: svo_recording.py [-h] --output_svo_file OUTPUT_SVO_FILE
optional arguments:
  -h, --help            show this help message and exit
  --output_svo_file OUTPUT_SVO_FILE
                        Path to the SVO file that will be written
```

https://www.stereolabs.com/docs/video/recording

動画の圧縮率を高めるには、[Compression Modes](Compression Modes)を設定する。
```
recordingParameters = sl.RecordingParameters()
recordingParameters.compression_mode = sl.SVO_COMPRESSION_MODE.H264
recordingParameters.video_filename = output_path
err = zed.enable_recording(recordingParameters)
```

H.264のcodecが予め用意されていることはうれしい。
もし、そうでなかったら、C++やPythonでH.264を処理できるライブラリをインストールして、それを使えるように環境設定をしなければなからなかっただろう。




## svoファイルの再生

https://github.com/stereolabs/zed-sdk/blob/master/recording/playback/mono/python/svo_playback.py

```
$ python svo_playback.py -h
usage: svo_playback.py [-h] --input_svo_file INPUT_SVO_FILE
optional arguments:
  -h, --help            show this help message and exit
  --input_svo_file INPUT_SVO_FILE
                        Path to the SVO file```
```

## svoファイルを入力としたアルゴリズムの実行
例
https://github.com/stereolabs/zed-sdk/tree/master/depth%20sensing/depth%20sensing/python

```
python depth_sensing.py --input_svo_file example.svo
```

## 通常の動画ファイルじゃない理由
- ZED2iなどは、ステレオ画像の他に、姿勢センサなどのデータを持っています。(ほんとうか？)
- ZED SDKではそれらの値を利用します。
- そのため、svo ファイルを用います。

## 自作のツールの改造のポイント
- ZED SDK にある各種の例題には--input_svo_file のオプションを持つものがあります。
- それを参考に自作スクリプトを改造してください。


## TODO 
以下の場所のpython スクリプトでsvoファイルを入力して動作を検証すること。

https://www.stereolabs.com/docs/positional-tracking

## 同じ入力データ・同じ設定ファイルで動作させたら本当に同じ結果になるのか？
- 同じ結果にならないことがある。
- 理由：
	- アルゴリズムの中で乱数を指定している。
	- 他の負荷によって、timeoutの影響を受ける可能性がある。
Amazon S3上にアップロードされているファイルの存在確認は、アクセス権限が無いとできない

## はじめに
この記事はLaravelアプリケーションの実装において、
Amazon S3(以下、S3と記載)にファイルがアップロードされているかをチェックしようとして、
3時間近く沼ってしまった今日の自分に捧げます。

## 環境
Laravel: 8
PHP: 7.4
PC: MacOS14(Sonoma)

## 結論
S3のバケットポリシーによって、S3にアップロードされているファイルへのアクセス権限がない状態だと、
LaravelのStorageクラスを使用してもファイルの存在が確認できなくなる。

```php
// ファイルへのアクセス権限がないと、結果は必ずfalse(ファイルが存在していない)になる
Storage::exists('S3上のファイルパス');
```

バケットポリシー以外のアクセス権限でも、同様の影響を及ぼすかは不明。

## 経緯
S3で同じ名前のファイルが既に存在するかどうかの確認が必要だったため、以下のコードを実装しました。

```php
if (Storage::exists('ファイルパス')) {
    // 同じ名前のファイルがS3上にあった場合の処理
    return;
}

// 同じ名前のファイルがS3上にない場合の処理
```

実装はサクッと終わり、いざ動作確認を開始するも、
if文の中の処理が実行されない現象に直面しました。

最初は、existsメソッドに渡していた引数の問題ではないかと考え、
階層ごとにexistsメソッドの動きをチェックしてみると、このような結果になりました。
```php
Storage::exists('最上位ディレクトリパス'); // true、期待通り
Storage::exists('最上位ディレクトリパス/次の階層ディレクトリパス'); // true、期待通り
Storage::exists('最上位ディレクトリパス/次の階層ディレクトリパス/確認したいファイル'); // false、期待外れ...
```

ディレクトリの存在確認は期待通りに機能していましたが、ファイル自体の存在確認になると、
ファイルが存在していないとなってしまう...なぜだ。

この段階で一旦仮説を立てました。
S3バケットに設定されている、ファイルへのアクセス権限が影響しているのではないかと。

というのも今、ファイルの存在確認をしているS3バケットには、
S3バケットポリシーによってIPアドレス制限がかけられていたため、自宅で作業していた私はファイルへアクセスする権限がなかったのです。

ということでS3バケットへアクセスできる、
会社に出社しているメンバーに動作を確認してもらうと...

```php
Storage::exists('最上位ディレクトリパス/次の階層ディレクトリパス/確認したいファイル'); // true、期待通り！
```

はい、期待どおり動きました！！！
ファイルへのアクセス権限がない場合、まさかファイルのダウンロードだけではなく、
ファイルの存在確認まで制限されているとは思ってもいませんでした...

[こちらの](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-policies.html)S3のドキュメントにも、
この点については明記されていなかったため、完全に見落としていました...
まあ、ダウンロードができないなら、ファイルの存在確認もさせないのは理にかなっているのか...

## 終わりに
今日の自分へ。
S3バケットポリシーでアクセス制限をされている場合には、
ファイルのダウンロードだけではなくファイルが存在しているかの確認もできないぞ！

S3バケットポリシー以外のアクセス制限でも、
同じようにファイルの存在が確認できないようになるのか、
知っている方がいると教えていただけると幸いです。
AWSデータレイク

データレイクサービスのまとめ、構成について

ハンズオンで適当な環境でしか実行をしていなかったのでAWSのベストプラクティス的要素とそのたデータレイク関連のサービスについて調べ、まとめることに

最終回で今回の学習をもとにした簡単なデータレイク基盤の作成、glue+Athena+Quicksightの流れを発表したいと思います

今までは単純にS3でデータを取ってくる、前回はSecuritylakeにフォーカスしましたが


AWS Lake FormationとData Lake Foundation on AWS
Partner Solution Deployment Guide

https://aws-ia.github.io/cfn-ps-datalake-foundation/

AWS Lake Formation の特徴

AWS Lake Formation を使用すると、分析や機械学習 (ML) 用のデータを一元管理、保護、およびグローバルに共有することが容易になります。

Lake Formation では、AWS Glue データカタログを使用してデータのセキュリティとガバナンスを一元化できます。

データの管理保護、監査をしつつ、権限の管理を行う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688241/f8620c9f-35a1-678c-0aa3-a22faff66c3a.png)



良い点として
データ権限を一元化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688241/1330a4db-c17f-0fd3-a2cc-9b40ab288c4f.png)
実際にsecuritylakeだったり、Glueで読み込んだところをlake formationのところで参照ができる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688241/cef6896e-45b1-a504-0175-5fb9cdc86f10.png)
権限についても参照することができる


セキュリティ管理とカバナンスを簡素化
データ共有の簡素化
包括的なデータアクセスと監査ロギング
Lake Formation は、CloudTrail で包括的なログ監査をオンにして、アクセスをモニタリングし、一元的に定義されたポリシーに準拠していることを示すことができます。

データ分析のサービスを使用する際に直接的に使用するわけではないが、権限分離、管理などができるため
実際のサービス導入については結構必要になっていくサービスであるとの認識です

ちなみにJPモルガンチェースも導入しており
https://aws.amazon.com/jp/blogs/big-data/how-jpmorgan-chase-built-a-data-mesh-architecture-to-drive-significant-value-to-enhance-their-enterprise-data-platform/


Data Lake Foundation on AWS
Partner Solution Deployment Guide

クイックスタートでは、Amazon Simple Storage Service (Amazon S3)、Amazon Redshift、Amazon Kinesis、Amazon Athena、AWS Glue、Amazon Elasticsearch Service (Amazon ES)、Amazon SageMaker、Amazon QuickSight などの AWS のサービスを統合するデータレイク基盤を構築します


もちろんではあるがクイックスタートではAWSのサービスをすべて使っているほうが良いと


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688241/51654a6b-8cea-02be-e547-ae28b4b35ee2.png)
2 つのアベイラビリティーゾーンにまたがり、2 つのパブリックサブネットと 2 つのプライベートサブネットを含む仮想プライベートクラウド (VPC)。*
インターネットへのアクセスを提供するインターネットゲートウェイ。*
パブリックサブネットに配置される、マネージド NAT ゲートウェイ。プライベートサブネット内のリソースへのアウトバウンドのインターネットアクセスを提供します。*
パブリックサブネットの Auto Scaling グループに含まれる Linux 踏み台ホスト。パブリックサブネットおよびプライベートサブネット内の EC2 インスタンスへのインバウンドのセキュアシェル (SSH) アクセスを許可します。*
AWS リソースへのアクセス許可を提供する AWS Identity and Access Management (IAM) ロール。例えば、キュレートされたデータセットに対して Amazon Redshift と Amazon Athena から読み書きできるようになります。
プライベートサブネットに配置される、データ集約、分析、変換、新規にキュレートおよび公開されるデータセットの作成のための Amazon Redshift。
AWS 認証を使用してアクセスできる Amazon SageMaker インスタンス。
Amazon S3、Amazon Athena、AWS Glue、AWS Lambda、Amazon ES with Kibana、Amazon Kinesis、Amazon QuickSight など、他の Amazon サービスとの統合。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688241/676303eb-353e-e611-5222-cf58854197c5.png)
PythonでOpenGL

マウス座標を取得して、その場所になにか描画するサンプルをpythonでしたくて、openGLを使った話です。

# 環境
Mac
PyOpenGL
glfl

# ライブラリのインストール
```
pip install PyOpenGL PyOpenGL_accelerate
pip show PyOpenGL
```
Version: 3.1.7

```
pip install glfw
pip show glfw
```
Version: 2.7.0

```python:python
import glfw
from OpenGL.GL import *

def main():
    glfw.init()
    window = glfw.create_window(640, 640, "title", None, None)

    glfw.make_context_current(window)
    glfw.set_cursor_pos_callback(window, mouseFunc)
    glfw.set_key_callback(window, keyFunc)

    while not glfw.window_should_close(window):
        # pyOpenGL Command
        glfw.swap_buffers(window)
        glfw.poll_events()

    glfw.terminate()

def keyFunc(window, key, scancode, action, mode):
    if key == glfw.KEY_ESCAPE:
        glfw.set_window_should_close(window, True)

def mouseFunc(window, mouseX, mouseY):
    print(str(mouseX)+","+str(mouseY))

    glViewport(0, 0, 1280, 1280)
    glClear(GL_COLOR_BUFFER_BIT)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glOrtho(-1, 1, 1, -1, 1, -1)
    glMatrixMode(GL_MODELVIEW)

    glLoadIdentity()
    glTranslatef(mouseX/320.0-1, mouseY/320.0-1, 0)

    glBegin(GL_TRIANGLES)
    glColor3f(1, 1, 1)
    glVertex3f(0, 0, 0)
    glColor3f(1, 0, 0)
    glVertex3f(0.1, 0, 0)
    glColor3f(0, 1, 0)
    glVertex3f(0, 0.1, 0)
    glEnd()

if __name__ == "__main__":
    main()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/ce0f6bf0-3b1b-72d6-719a-2a512cbf07a6.png)

# その他
20年以上前のCの知識から、飛んできたので、ちょっとぐちゃぐちゃです。
webサーバーはフレームワークに組み込まれている

# はじめに
webアプリケーションフレームワークはwebアプリ開発を助けるツールとして広く用いられています。例えばPythonのDjangoやRubyのRuby on Rails, JavaのSpring bootなどが挙げられるでしょう。それらはアプリケーションサーバーにおけるMVCモデルを提供するフレームワークであると多くの場合説明がされますが、実は簡易的なWebサーバーも持ち合わせています。勉強した今考えれば当たり前なのですが、勉強しながら少し混乱したところでもあるのでここにまとめます。

# 3層構造とMCVモデル
まず復習ですが、webアプリケーションは三層構造になっています。
①プレゼンテーション層
②アプリケーション層
③データ層
ここで①はクライアントから来たリスエストを捌き、クライアントのウェブブラウザ上に情報を提供する働きを、②はプレゼンテーション層から送られてきた指示に従って動き、アプリケーションの動的部分を担います。③はデータを管理している層で、アプリケーション層からの指示(例えば顧客情報を出す)に従ってデータベースからデータを提供します。そして、これらの3つにはそれぞれ　webサーバー、アプリケーションサーバー、データベースサーバーが対応しています。

次にMCVモデルですが、これは**アプリケーション層**において、データを処理する流れのモデルです。MはModel、CはControll、VはViewの頭文字を表します。Modelはデータベースとやり取りを担い、Viewは入出力に関わるインターフェースを担います。それらをまとめ上げるのがControll層であり、Model ⇔ Control ⇔ Viewというような関係性を持っています。

上にあげたDjangoやRuby on Railsはこのアプリケーション層の構造を提供するフレームワークであり、基本的にはこのMCVモデルを採用しています。

# Xampp
さて、少し話はそれますが、Xamppと呼ばれるパッケージが存在します。これはApache(webサーバーを担う)やMySQL(データベース管理システムを提供する)といったwebアプリケーション開発に欠かせない道具を一挙にダウンロードすることができる便利ツールです(なおMCVモデルは採用していません。PHPでアプリケーションサーバーを操作します)。私も初めてwebアプリを作る時はこれを使いました。このパッケージは3層それぞれで必要なものがApache,PHP,MySQLとわかりやすく提示されているので直観とよく合うのではないかと思います。

# Djangoを触って混乱
私は初めてのwebアプリ(未公開)をXamppを使って作成したのですが、そのあとにより便利だと聞くPythonのDjangoを用いて開発をすることにしました。このDjangoはwebアプリケーション開発に必要なシステムをコマンドひとつですべて行ってくれるので非常に便利だったのですが、Xamppがはじめてのパッケージだった私には便利すぎて何が起こっているのかよくわかりませんでした。
特に混乱したのが
**アプリケーション層のフレームワークを提供するDjangoを入れただけでなぜwebアプリケーションを作れるようになったのか**、です。Xamppの経験からデータベースを使わないにしても少なくともwebサーバーを構築する必要があると思っていた私には、Apache等webサーバー構築を担うパッケージを入れずに勝手に動き出すDjangoはもはや気持ち悪い代物でした。

# フレームワークは独自のwebサーバーを構築できる
結論から言うと、webアプリケーションフレームワークは、もちろん主な役割としてアプリケーション層の構築を担うわけですが、それ以外にもwebサーバーの機能も提供してくれるということが分かりました。例えばDjangoであれば内蔵の開発サーバーを提供しますし、javaのSpring bootはTomcatなどの組み込みサーバーを提供します。
ただ、開発サーバーなどは性能でApacheに劣るため大規模な開発などを行う場合はこの組み込みサーバーではなく、Apache等のそれに特化したパッケージをダウンロードする必要があるとのことでした。
AWS DynamoDB テーブル内のデータを確認する方法のメモ

## 概要

AWSのDynamoDBにてAWSマネジメントコンソール上からテーブル内部のデータを確認する方法をメモ的にまとめる。

## 方法

1. DynamoDBのコンソールを開く。
1. 左サイドバーの「項目を検索」をクリックする。

    ![項目___Amazon_DynamoDB_Management_Console___DynamoDB___us-east-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/aa3625fe-a5eb-05df-260e-bb5f842fcebb.png)

1. ラジオボタンでテーブルを選択する。

    ![項目___Amazon_DynamoDB_Management_Console___DynamoDB___us-east-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/6a05480e-ae7e-ea3a-5250-04dfb37f4838.png)

1.  「実行する」をクリックする。

## 参考文献