OmniAICreator/Qiita-1.07M huggingface dataset:
【10日目】discord.jsで送られてきたメッセージをすべて勝手に英語に翻訳する

# はじめに
こんにちは、なりかくです。
今回は、discord.jsで受け取ったメッセージをすべて勝手に英語に翻訳するプログラムを作っていこうと思います。

# 翻訳に使うAPI
今回使う翻訳APIは、GAS(Google Apps Script)の中にあるGoogle翻訳のAPIです。
今回はこの記事にあるコードを活用して作成していきます。

https://qiita.com/tanabee/items/c79c5c28ba0537112922

翻訳するのに今回作ったコードは以下のようになります。（URLは自身で作成したものに置き換えてください。）
簡単に使えるように作っています。コードの解説は...まあ省略します。
```js
function gasTranslate(text, source, target) {
    return new Promise((resolve, reject) => {
        request({
            url: `https://script.google.com/macros/s/<自身のやつ>/exec?text=${encodeURIComponent(text)}&source=${encodeURIComponent(source)}&target=${encodeURIComponent(target)}`,
            json: true
        }, function (error, response, body) {
            if (error) {
                reject(error);
            } else {
                resolve(body);
            }
        });
    });
}
```

# メッセージを受け取る
メッセージを受け取るには、メッセージインテントを有効にする必要があります。このことについては6日目の記事に詳しく記載しているのでそちらをお読みください。

https://qiita.com/narikakun/items/7c22881d9464bb236fa5

# 出来上がったコード
出来上がったコードがこちらになります。
```js:index.js
const request = require("request");
const { Client, GatewayIntentBits, IntentsBitField } = require('discord.js');
const { token } = require('./config.json');

const client = new Client({ intents: [GatewayIntentBits.Guilds, IntentsBitField.Flags.GuildMessages, IntentsBitField.Flags.MessageContent] });

client.on('ready', () => {
	console.log(`${client.user.tag}でログインしました。`);
});

client.login(token);

client.on('messageCreate', async message => {
	try {
        if (message.author.bot) return;
        let trans = await gasTranslate(message.content, "ja", "en");
        message.reply(trans);
	} catch (error) {
		console.error(error);
	}
});

function gasTranslate (text, source, target) {
    return new Promise((resolve, reject) => {
        request({
            url: `https://script.google.com/macros/s/<自身のやつ>/exec?text=${encodeURIComponent(text)}&source=${encodeURIComponent(source)}&target=${encodeURIComponent(target)}`,
            json: true
        }, function (error, response, body) {
            if (error) {
                reject(error);
            } else {
                resolve(body);
            }
        });
    });
}
```

実際に動かしてみると、このように送ったメッセージがすべて自動で翻訳されるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549951/9a2d3c94-1218-7014-392d-4007a4836aae.png)

# さいごに
まあ需要は知りませんが、コードをいい感じに改善するといい感じになると思います。
以上です、最後までお読みいただきありがとうございました。
[記事紹介] SPFをワイルドカード(*)で設定するのは悪なのか?!

@qualitia_cdevの中の一人、@hirachanさんが書いた記事をみなさまにご紹介します。


### SPFをワイルドカード(*)で設定するのは悪なのか?!
https://qiita.com/hirachan/items/34a56e7b535fbae97751
IBM CloudでAIX環境を立ててみた話

# はじめに
AIXの検証環境を作成するのにIBM Cloudを利用して環境を構築したので書いてみます。

# 課題
AIXで動作するアプリケーションの検証環境を作りたい。

# 考えたこと
最初に構成を検討しました。

構成案A　:　自端末－インターネット－AIX
![Plan_a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983762/1d00ea0e-b594-e2c4-0e1b-bee954a461de.png)

ただ、これだと、インターネットに面しているところをポート全開放しておくとかはセキュリティ上のリスクになるので、AIXで確認したいアプリケーションの要件によって、AIXと自端末の間の開放ポートを都度変更することになる。
そこで下記のようなことを考える。

構成案B　:　自端末－インターネット－Windows端末－AIX
![Plan2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983762/ef5c4531-a960-3aeb-432e-092a34c96b94.png)

この構成だと、Windows端末とAIXの間のポート開放はALLにしておいて、確認をWindows端末上で行うことにすればインターネット経路の開放ポートを設定するのは最初にWindowsにつなぐところだけで大丈夫なはず。
また、そんなに多くのことをやらないのでVPNとかは選択肢にはしたくない。

ということで、案Bの構成をIBM Cloud上に構築しました。

# やったこと

１．AIXのInstanceをPower Systems Virtual Server Service上に構築します。
![AIXInstance.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983762/74a1d68c-e295-c8f1-c752-ea5e9367e263.png)
こんな感じ。


２．Windows環境は、今回はVPCで構築しました。
![vpc_instance.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983762/1263abeb-a616-6535-9007-911b7ea20dc4.png)
セキュリティグループも設定する。
![securityGroupforVpcInstance.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983762/8e4965a3-3abf-239a-94b9-dc6f76173ffb.png)
FromをIPで指定して特定ポートだけ開放。

３．１と２の環境をDirect Linkという機能を利用して接続！
![DirectLinkBase.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983762/4f13746c-6778-25d7-d0ea-b30b57511b9a.png)
接続先のVPCを指定する。
![DirectLinkTo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983762/96ecaa26-1e89-03aa-a63c-51e1094dfecb.png)
DirectLinkでこの接続をするときはブラウザ画面からの設定だけでは足りなく、ブラウザでの作業後、Caseを上げてパラメータを伝えてサポートの人に繋げてもらう必要があるようです。
![case.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983762/90901f1b-0b61-205a-44e2-84517bbed6aa.png)
詳細な方法はこの辺の資料を参考にやりました。
[技術よりな人が最初に読む_IBMCloud柔らか層本](https://ibm.ent.box.com/v/ibmcloud-yawaraka)
※これを書いている時に見たら私が見た（3.xだった気が・・）ときよりVersionが上がってわかりやすくなっているようです。
あと、もちろん[IBMのドキュメント](https://cloud.ibm.com/docs)もしっかり読む。



４．無事接続できてWindows端末（確認用踏み台）からAIXに接続して検証するベースの作成が完了しました。
![Done.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983762/c937d4bb-e07d-6694-4315-ce41e99e4371.png)
これで利用の時だけで使えるAIXの環境が用意できました。

# おわりに
IBM CloudのAIXはインスタンスを停止していてもインスタンス費用が掛かるようです。([最下部重要のところ。](https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-pricing-virtual-server&locale=ja))長時間停止する場合はBootImageを取得してインスタンスを削除しておきましょう。


#参考
https://ibm.ent.box.com/v/ibmcloud-yawaraka
https://cloud.ibm.com/docs
【Flutter】Webでcsvファイルをダウンロードする

# はじめに
よくあるWebページからcsvをダウンロードする機能ですが、この記事はFlutterを用いてcsvダウンロード機能とnodejsを用いてawsのWebAPIに実装について書いています。

# Flutter Webからダウンロード
## AnchorElementクラス

使うSDKはdart:htmlライブラリAnchorElementクラスです。

https://api.flutter.dev/flutter/dart-html/AnchorElement-class.html

## 実装

### BOM
エンコードしたファイルの先頭にBOMを設定しないと文字化けすることがあります。
>バイト順マーク (バイトじゅんマーク、英: byte order mark) あるいはバイトオーダーマークとは、通称BOM（ボム）といわれるUnicodeの符号化形式で符号化したテキストの先頭につける数バイトのデータのことである。このデータを元にUnicodeで符号化されていることおよび符号化の種類の判別に使用する。

[バイト順マーク - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E9%A0%86%E3%83%9E%E3%83%BC%E3%82%AF)

[各符号化形式（符号化スキーム）ごとのバイト順マーク](https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E9%A0%86%E3%83%9E%E3%83%BC%E3%82%AF#%E5%90%84%E7%AC%A6%E5%8F%B7%E5%8C%96%E5%BD%A2%E5%BC%8F%EF%BC%88%E7%AC%A6%E5%8F%B7%E5%8C%96%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%A0%EF%BC%89%E3%81%94%E3%81%A8%E3%81%AE%E3%83%90%E3%82%A4%E3%83%88%E9%A0%86%E3%83%9E%E3%83%BC%E3%82%AF)

UTF-8の場合、BOMは下記です。
```dart
 List<int> excelCsvBytes = [0xEF, 0xBB, 0xBF]
```

### CSV SDK
CSVの整形は下記のSKDを使うと便利です。
https://pub.dev/packages/csv

```yaml
dependencies:
  csv: ^5.0.1
```

### 実装例

- ModelmからCSVファイルをダウンロード
```dart
import 'package:csv/csv.dart';
import 'dart:html';
import 'dart:convert';
// csvデータ
List<List> users = [["姓", "名", "性別"], ["テスト", "太郎", "男"]];
// SDKによるCSVデータ整形
String csvString = const ListToCsvConverter().convert(users);
// utf-8バイト変換
List<int> excelCsvBytes = [0xEF, 0xBB, 0xBF, ...utf8.encode(csvString)];
// base64エンコード変換
String base64ExcelCsvBytes = base64Encode(excelCsvBytes);
// CSVダウンロード
AnchorElement(href: 'data:text/plain;charset=utf-8;base64,$base64ExcelCsvBytes')
    ..setAttribute('download', 'user.csv')
    ..click();
```
- APIリスポンスからデータをダウンロード
```dart
// データリクエスト省略
...
// APIResponseからデータを受け取るときはresponse.bodyBytesで受け取る
// base64エンコード変換
String base64ExcelCsvBytes = base64Encode(response.bodyBytes);
// CSVダウンロード
AnchorElement(href: 'data:text/plain;charset=utf-8;base64,$base64ExcelCsvBytes')
    ..setAttribute('download', 'user.csv')
    ..click();
```

# NodejsによるWebAPIのCSVデータダウンロード

## SDK

https://www.npmjs.com/package/csv

package.json
```json
{
    "dependencies": {
        "csv": "^6.0.4"
    }
}
```
## 実装

csvデータを作成する関数をWrapする
```js
const CSV = require('csv')

function createCsvData(data) {
  return new Promise(resolve => {
    CSV.stringify(data, { bom: true, quoted: true, header: true }, (error, csvData) => {
      resolve(csvData)
    })
  })
}
```

ダミーデータ
```js
const rows = [
    {
       "姓": "テスト",
       "名": "太郎",
       "性別": "男", 
    }
]
const csv = await createCsvData(rows)
```
リスポンスでデータを送信する
```js
res.setHeader('Content-disposition', `attachment; filename=user.csv`)
res.setHeader('Content-Type', 'text/plain')
res.send(csv)
```

# 参考
https://github.com/close2/csv/issues/41#issuecomment-899038353
システムエンジニアの評価についてのポエム

## はじめに

この記事はNE Advent Calendar 2022のカレンダー2枚目25日目の記事です。
最終日なのでポエムでも書こうと思います。

## 免責

:::note warn
ポエムです。
個人の感想です。
:::

## 筆者バックグラウンド

* 33歳のシステムエンジニアです。
* エンジニア歴は9年。
* 最近はリーダーを担うことが多いです。
* エンジニアリングマネージャー等の経験はありません。
* 30歳くらいまで毎年のように上がっていた給与が30歳を過ぎてから停滞しはじめた。
* 自分は評価されてないんだと思っていたが最近そうでもなさそうと思い直したのでその共有。

## 評価=給与 ではない

まず大前提として評価と給与はイコールではないです。
一定の相関関係はあるとは思いますが、例えば個人としてはすごく頑張ったし社内からも評価されていたとしても業績が悪く赤字の場合に、昇給というのは難しい話です。
結局会社がビジネスをして得た利益を労働者に雇用対価として渡す、ただそれだけです。
当たり前じゃんって思う人が多いかと思いますが、これをちゃんと念頭においておかないと
「給与が上がってない！私は評価されてないんだ！」と思いがちです。

## 給与は収束グラフ

30歳まで毎年のように給与が上がっていましたが、30歳を超えてから急に停滞しはじめました。
でもこれは割と自然なことで、その上がり幅のまま行くと比例グラフのように上がっていき、青天井になってしまいます。
実際そういう会社や業種はあるかもしれませんが、一般的な会社はそうではないです。
給与には上限があり、年々上がりにくくなっていくものだという理解になりました。
これも当たり前じゃんって思う人が多いと思いますが、なにぶん30歳になったのは初めてなもので、30歳を超えて初めて気付きました。

※図はあくまでイメージです。

比例グラフだと毎年一定額コンスタントに上がっていくが、これだと青天井でどんどん給与が際限なく上がっていく。
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67471/84bccee4-6007-521d-8997-ec93c3be1d2d.png">

収束グラフだと序盤はグンと伸びるが徐々に停滞していく。
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67471/dd7da393-ee13-724f-589d-36c689cc7f00.png">

## 年々当たり前のハードルが上がっていく

今回の評価タイミングで評価者の方から言われたことが印象に残っています。

私「今期はxxxの機能を開発しました」
評価者「確かに良い開発でした。でもそれって前期のあなたでもできたことですよね？」
私「…はい、前期でもできたと思います」
評価者「とても良い成果ですしすごく助かっています。もちろん評価もしてますが期待通りで、期待以上ではなかったです」

私がその成果を出すのは「当たり前」のことであり、それができたからといって直接評価には繋がらない、ということです。

### 子供の話

ちょっと脱線して私の子供の話をします。
私には2歳半の子供がいます。
生まれたばかりの頃は「寝返りをうった」「座った」「立った」「歩いた」「走った」「しゃべった」
それら全てに驚いたし拍手したし動画撮ったし「すごいね！」って褒めました。
2歳半現在の子供がイスに座って自分でゼリーを食べたとて、私は褒めません。
それは子供にとってそれができるのは「当たり前」になったからです。

### システムエンジニアの当たり前

新卒1年目のシステムエンジニアがプロダクトに対して修正をコミットしプッシュしデプロイし世の中にリリースされお客様の役に立った場合
それが1行の修正だろうが、文言修正だろうが、めちゃくちゃ褒めると思います。
だってそれは新卒1年目のシステムエンジニアができるのは「当たり前」じゃないから。
これが9年システムエンジニアをやってる私が同じことをして褒めて欲しいというのはさすがに無理があります。
私がそれをできるのは「当たり前」になっているからです。

## まとめ

年々期待のハードルが上がっていく中
どう成長し、どう期待以上の成果を出すか
がこの先の成長/評価において大事になってくると考えています。

## 参考

30代になり成長の鈍化を感じている中、こちらの記事を読み大変励みになりましたので参考として載せておきます。
[もっと成長したいソフトウェアエンジニアへ、出会いと経験で自分を変える「キャリアの螺旋」の歩み方](https://engineer-lab.findy-code.io/career-spiral)

## おわりに

これにてアドカレ終了です！
25日間お付き合いいただいた方ありがとうございました！
about librariesでライセンスを追加する

# 初めに
今回は`about libraries`ライブラリを使う際に自動では読み取ってもらえないライブラリのライセンス等を追加する方法を紹介していきます
### 本文
まず、プロジェクト直下に`config`という名前でフォルダを作成します。
その中に`libraries`と`licenses`という二種類のフォルダを作成します。
`libraries`には追加したいライブラリのjsonを、`licenses`には追加したいライセンスのjsonを作成します。
あとは`app`の`build.gradle`に対して以下のコードを追加します
```kotlin
aboutLibraries { configPath = "config" }
```
`configPath`に指定したフォルダを参照するようになるので、`config`となっている部分を自分のわかりやすい名称に変更することも可能です
### 最後に
自分が今回、ライセンス画面を作成するときに追加したいライセンスがあったのですが、一昔前の追加方法しか日本語記事が存在しなかったのでわかりやすいように備忘録として残しておきます
誰かのお役に立てれば幸いです
php オブジェクトで使われる用語

①クラス
```php
class Post
{
private $text //プロパティ

  public funtction show() //メソッド
  {
    printf($this->text);
  }
}

$posts = new Post('hello'); //インスタンス
```

・クラスの中で宣言した変数「プロパティ」
・クラスの中で定義した関数「メソッド」
・クラスからnewして作った値「インスタンス」

クラス内で変数にアクセスするには　$this->変数名　とする


②コンストラクタ
```php
class Post
{
private $text //プロパティ

public function __construct($text) //コンストラクタ
{
  $this->text = $text;
}
  public funtction show() //メソッド
  {
    printf($this->text);
  }
}

$posts = new Post('hello'); //インスタンス
```

・コンストラクタはnewしたときに実行されるメソッド
mariadb の max_connections

DB Connection Failed... 的な画面になったという話があり、現在の設定を確認した。
デフォルトの、151 となっている。

```
MariaDB [(none)]> SHOW VARIABLES WHERE `variable_name` = 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 151   |
+-----------------+-------+
```

どれだけ使われたのかを、次に確認したら、天井を打っていた。デフォルトが 151 だが、プラス 1 された値になっていた。これは、スーパーユーザーの分が足されたためみたいだ。

```
MariaDB [(none)]> SHOW STATUS WHERE `variable_name` = 'Max_used_connections';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| Max_used_connections | 152   |
+----------------------+-------+
```

設定ファイルに以下を記述して、サービスを再起動したら、変更できた。

```
[mysqld]
...(snip)...
Max_connetctions = 500
```

増やしたことの影響は？

他の設定で、この値をもとに計算しているところがあり、かなり使われているみたいなので、その辺を考慮する必要がありそう。

（参考）
https://mariadb.com/kb/en/server-system-variables/
Livebook公式アナウンスを公開から0.7まで見た感想

この記事は「Livebookを楽しむための前説」というスライドを作成するにあたり、v0.7までの公式アナウンスを読んだので、その機能と感想をまとめたものです。

https://speakerdeck.com/nako_sleep_9h/livebookwole-simutamenoqian-shuo

## Livebookとは

* インタラクティブで共同編集可能なコードノートブックアプリケーション
* ElixirとPhoenix LiveViewで実装されている
* PythonでいうところのJupyter Notebook


## 公式アナウンスと動画を見る一連の感想

### 最初の公式アナウンス（2021/4/14発表）

https://news.livebook.dev/announcing-livebook-42B3uU

https://twitter.com/nako_sleep_9h/status/1594212236004061184?s=20&t=1uDfJMc4P6eEApkV1-Qa3g

https://twitter.com/nako_sleep_9h/status/1594214378030911488?s=20&t=1uDfJMc4P6eEApkV1-Qa3g

https://twitter.com/nako_sleep_9h/status/1594215925481623553?s=20&t=1uDfJMc4P6eEApkV1-Qa3g

### v0.5: Flowcharts, custom widgets, intellisense, and UI improvements（2022/1/2発表）

https://news.livebook.dev/v0.5-flowcharts-custom-widgets-intellisense-and-ui-improvements-4FcvbG

https://twitter.com/nako_sleep_9h/status/1594227962655956992?s=20&t=SBomk-JM79HnpPVs6v830Q

https://twitter.com/nako_sleep_9h/status/1594229217809793027?s=20&t=SBomk-JM79HnpPVs6v830Q

### v0.6: Automate and learn with smart cells（2022/5/12発表）

https://news.livebook.dev/v0.6-automate-and-learn-with-smart-cells-mxJJe

https://twitter.com/nako_sleep_9h/status/1594232092111831041?s=20&t=SBomk-JM79HnpPVs6v830Q

https://twitter.com/nako_sleep_9h/status/1594233350541422596?s=20&t=SBomk-JM79HnpPVs6v830Q

### What's new in Livebook 0.7（2022/10/11発表）

https://news.livebook.dev/whats-new-in-livebook-0.7-2wOPsY

https://twitter.com/nako_sleep_9h/status/1594235374616076290?s=20&t=SBomk-JM79HnpPVs6v830Q

https://twitter.com/nako_sleep_9h/status/1594237406345334784?s=20&t=SBomk-JM79HnpPVs6v830Q

https://twitter.com/nako_sleep_9h/status/1594240506632241154?s=20&t=SBomk-JM79HnpPVs6v830Q

https://twitter.com/nako_sleep_9h/status/1594241938592784385?s=20&t=SBomk-JM79HnpPVs6v830Q

https://twitter.com/nako_sleep_9h/status/1594242471449743361?s=20&t=SBomk-JM79HnpPVs6v830Q

https://twitter.com/nako_sleep_9h/status/1594245917708005376?s=20&t=SBomk-JM79HnpPVs6v830Q

## さいごに

私はJupyter Notebookも知らないので、スライドを作成するために公式アナウンスで発表されたリリース動画をそれぞれ視聴しました。

バージョンを追う毎にLivebookの機能が増えていく様子が分かって、ざっくりひととおりの機能を追うことができました。

また、「Livebookがインタラクティブである」というワードは私も使うのですが、それは個人的な体験としてインタラクティブなだけでなく、共同編集ができることでのチームにおけるインタラクティブでもあります。
これはとても強力なツールです。
ユーザー？ データベース？

こんにちは！

デプロイメントされたTeradata Vantageにデータをロードする、その手順について考えましょう。今日はその最初のステップ、データベースとユーザーのお話。。。

# Vantageにおけるデータベースとユーザー

恐らく初めてVantageをご利用になる場合に「どういうこと？」となる最初のポイントがVantageでいうデータベースとユーザーの定義でしょう。
普通はデータベースといえばデータを格納するための領域を持ったオブジェクト、ユーザーはそのデータにアクセスするためのアカウント、と理解されているかと思います。

ところがVantageではそれとは少し違った定義になります。「だからVantageは解らないんだよ」という声も聞こえてきそうですが、その言葉はこの記事を読み終えるまでグッとこらえてください。

Vantageではデータベースとユーザーの間にはとても限られた違いしかありません。何が違うかというと、データベースの中でパスワードが定義されているものがユーザーです。
名前とパスワードが揃うと何が可能になるでしょうか？そう、システムへのログインが可能になります。ですので言い換えるとデータベースの拡張版でシステムへのログインが可能なものをユーザーというと覚えていただいて構いません。

# なぜユーザーがデータ領域を持つのか？

どうしてユーザーが自分のためのデータ格納領域を持つなどという考えがあるのでしょうか？
おの答えはVantageはデータを分析し活用するためのシステムだから、です。
データの分析を行う際にどのようなことを行うか考えてみましょう。概ね次のようなことが行われるはずです。

・ 大きなデータセットから自分が分析する対象のデータだけを抜き出す
・ そのデータに対して必要な分析加工を行う
・ そのようなデータの加工をいくつか行う
・ 加工されたデータ同士の比較を行う

このような分析ステップを行うとき何が必要になるかわかりますよね？それぞれのステップで作られた結果セットをどこにどのように置いておくのか考えるたとき、同じデータベースシステムの中にテーブルとして保持するのが最も効率的であることはすぐにご理解いただけると思います。
それではそれをどこに置いておきますか？自分の作業用のテーブル、自分の管理する場所に置きたくないですか？
それがVantageのユーザーが領域を持っている理由です。個人用のデータベースをアカウントと別に管理する必要がないってちょっとラクだと思いませんか？

# データベースの階層構造

VantageのデータベースはDBCというスーパーユーザーを兼ねたユーザーを頂点とした階層構造になります。ユーザーDBCは自身が持つ領域の一部を子に与えて2階層目となるユーザー/データベースを作成します。
作成された2階層目のユーザー/データベースはこれも自身の領域の一部を与える形で3階層目のユーザー/データベースを作成することができます。
このようにしてDBCユーザーの下に多階層の構造的なデータベースを作成することができます。

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/07675f9f-d495-9b3a-2de2-ebf93c25c385.png)

# まとめ
Vantageではテーブルを格納する領域をユーザーとして定義した方が後々便利なことが多いです。ですのでこの後のお話はテーブル等はユーザーに格納する形で進めていきます。

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
UnityWebRequestを使って変数でPOSTする



Step１：request body -> GetContext()でContextを取得する
Step２: response body -> SetContext()Contextをセットする


```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using System;


namespace UnityPostTest
{
    public class TestAPIManager : MonoBehaviour
    {
        [SerializeField, Header("入力欄")] TMP_InputField m_InputField = default;
        [SerializeField, Header("レスポンス")] TextMeshProUGUI m_ResponseText = default;
        

        public class Item
        {
            public string testResponse;
            public Item(string testResponse)
            {
                this.Response = Response;
            }

            public override string ToString()
            {
                return string.Format("{0}", Response);
            }

        }

        private string m_testContext;
        private const string baseUrl = "XXXXXXXX";
        private const string url = "/api/v1/test";
        
        //Contextをセット
        public void SetContext(string testContext)
        {
            m_testContext = testContext;
        }
        
        //Contextを取得
        public string GetContext()
        {
            if (string.IsNullOrWhiteSpace(m_testContext))
            {
                m_testContext = "";
            }

            return m_testContext;
        }

        //コルーチンを呼び出す
        public void OnClick(){
            Debug.Log("Sending Post Request");
            StartCoroutine(Post((result) => {
                print("Result from Coroutine:" + result);
            }));
        }

        public IEnumerator Post(Action<string> result)
        {

            string targetUrl = baseUrl + url;
            
            //request body
            WWWForm form = new WWWForm();
            form.AddField("test", m_InputField.text.ToString());
            form.AddField("testContext", GetContext());

            using(UnityWebRequest request = UnityWebRequest.Post(targetUrl, form)){
                request.SetRequestHeader("AUTHORIZATION", "XXXXXXX");
                request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();

                // APIリクエストが返ってくるのを待つ
                yield return request.SendWebRequest();
                    
                //エラーのチェック
                if (request.result != UnityWebRequest.Result.Success) {
                    result(request.error);
                }
                else {
                    Debug.Log("Form upload complete!");
                    var item = JsonUtility.FromJson<Item>(request.downloadHandler.text);
                    m_ResponseText.text = item.Response.ToString();
                    //Contextをセットする
                    SetContext(item.Context.ToString());
                    result(request.downloadHandler.text);
                }
            }
        }
    }
}
MicroStrategyにおける動的日付プロンプト「前月」抽出方法

# はじめに
こんにちは。
本記事ではMicroStrategyにおいてレポートフィルタを日付で動的に切り替える
動的日付プロンプトをご紹介します。

# レポートフィルタとは
レポートフィルタとは過去の記事で紹介していますのでご確認ください。
https://qiita.com/__hskw/items/f1ca133d2eabd5c3dcc0

# ケース
以下のようなテストデータを作成しました。
たとえば毎月1日に前月のデータを集計する業務があるとします。
過去の記事をみると、レポートフィルタは固定条件のため毎月設定値を変える必要があるのでは？と思いますが、日付型に関しては動的日付プロンプトを利用することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/78871dea-1af7-c062-70dd-01fb76034dbd.png)

# 操作方法
①デザインモード（編集モード）で開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/cfac45cf-aeaf-7339-bbcc-4bed43b31a8f.png)
②日付項目をレポートフィルタに設定し、Betweenを選択します。そして赤枠のカレンダマークを押下したのち「動的日付に切り替え」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/bf508ab5-8fdc-b5ed-991a-26e0a5307b45.png)
③赤枠のように入力し、プレビューで前月の1日になっていることを確認しOKを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/508a08e4-6c57-030d-e473-244cda409370.png)
④ハイライトのように「;」を入力します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/fbc127ed-4763-af6b-724a-6f65b931010e.png)
⑤続けて動的日付プロンプトを開き、赤枠のように入力し、プレビューで前月の末日になっていることを確認しOKを押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/69869516-e717-05d0-e1e8-387e8a8d7a12.png)
⑥下記のように動的な条件が設定されていることを確認します。
 実行すると前月のデータが抽出できることを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/e3692e10-b46f-e6e1-14ca-dfd41c64d6ba.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/419a70e2-c238-b432-1198-a5b96fde1515.png)

# さいごに
こちらは上記ケースのような業務がある場合、有効的な操作です。
こちらの記事が、みなさまの調査・業務のお役にたてれば幸いです。
知らんかったワードまとめ

プロジェクトで見た知らんかったワードまとめ(完全に自分用)。随時更新(サボらない)。

#### 【<a href=https://www.acronis.com/ja-jp/promotion/backup/sem-split/?utm_content=sfdc%3A7011T000001pnQF%3A7011T000001pnQP&gclid=EAIaIQobChMI86Pz2sn6-wIVRq2WCh1IsgPpEAAYASAAEgKzvfD_BwE>Acronis</a>】
・データとかイメージのバックアップとか復元ができる

#### 【[AIDE(Advanced Intrusion Detection Environment)](https://www.designet.co.jp/faq/term/?id=YWlkZQ)】
・OSSのIDS
・ファイルの改ざん検知とかができる

#### 【<a href=https://www.itmedia.co.jp/enterprise/articles/0902/04/news127.html>BAC(Business Availability Center)</a>】
・webシステム監視ソフト
・<b><a href=https://japan.zdnet.com/article/20082920/>TOPAZ</a></b>というソフトの後継らしい


#### 【<a href=https://shinkufencer.hateblo.jp/entry/2019/02/28/233000>BOK(Body of Knowledge)</a>】
・知識体系のこと


#### 【<a href=https://www.fujitsu.com/jp/products/network/lan-switch/cisco-sh/>Catalyst</a>】
・Cisco社製のスイッチ

#### 【<a href=https://jpn.nec.com/soft/trendmicro/tmds/index.html>Deep Security</a>】
・Trend Micro社製の統合型サイバーセキュリティ
・FW/IDS/IPS/アンチウィルス機能などによりサーバを保護する。

#### 【<a href=https://www.fortinet.com/jp/products/next-generation-firewall>Fortigate</a>】
・Fortinet社製のNGFW機器の1つ
・<a href=https://www.ueip.co.jp/solution/fortigate-vs/>paloaltoとFortigateではFortigateのほうがコスパがいいらしい？(あまりよく調べてない)</a>

#### 【<a href =https://www.suzu-ha.com/entry/2019/11/06/011659>ghettovcb(ghetto VMware Consolidated Backup)</a>】
・仮想マシンのバックアップツール
・ghettoでゲットーと読むらしい。ゲッソーみたい。

#### 【<a href=https://anken-hyouban.com/blog/2020/10/25/integrated-operation-management/#the_post_19>JP1</a>】
・日立製zabbix(統合運用管理ツール)みたいなやつらしい

#### 【<a href=https://jp.tenable.com/products/nessus>Nessus</a>】
・脆弱性診断ツール
・Nessusの派生でありオープンソースの<b><a href=https://thinkit.co.jp/article/12948>OpenVAS</a></b>というものもある

#### 【NGFW(Next Genelation FW)】
・従来のFW機能に加えてアプリケーション層レベルで通信の可否を制御できるとか
・UTMとは異なるらしい(が、厳密な違いは定められていなさそう)

#### 【<a href=https://www.hitachi-solutions.co.jp/paloalto/sp/products/ngfw/pa/>paloalto(PA)</a>】
・Palo Alto Networks社製のNGFW機器の1つ
・<a href=https://www.ueip.co.jp/solution/fortigate-vs/>paloaltoとFortigateではFortigateのほうがコスパがいいらしい？(あまりよく調べてない)</a>

#### 【[AR System(Remedy Action Request System)](https://www.toshiba-tden.co.jp/system/ar-system/index_j.htm)】
・ヘルプデスクやコールセンターの業務支援ツールっぽい。具体的にどう使われているかは知らない。

#### 【<a href=https://www.johnsoncontrols.com/ja_jp/tools-and-downloads/jennifer-column/jennifer-column22>ROC(Remote Operating Center)</a>】
・システム運用センター
・顧客の設備やシステムを遠隔監視する

#### 【<a href=https://www.lrm.jp/security_magazine/soc_role/>SOC(Security Operating Center)</a>】
・セキュリティオペレーションセンター
・顧客のシステムのセキュリティを遠隔監視する

#### 【<a href=https://centossrv.com/tripwire.shtml>Tripwire</a>】
・ファイル改ざん検知ツール



#### 【】
#### 【】
#### 【】
#### 【】
#### 【】
[Day18] ジェネレータ, 高度なイテレーション

本記事は一人アドベントカレンダー企画の一つです。
[30代未経験エンジニアが25日後にJavaScriptをマスターするカレンダー](https://qiita.com/advent-calendar/2022)

[JAVASCRIPT.INFO](https://ja.javascript.info/)を元にJavaScriptを勉強していき、そこで学んだ知識をアウトプットしていきます。
２５日でJAVASCRIPT.INFOをやりきり、未経験エンジニアがJavaScriptをマスターする過程を投稿していきます。



## 12.1 ジェネレータ
### 知らない単語
- データストリームとは
　　　　　- データの入出力の経路や入力・出力それぞれにおけるデータの流れそのもの

### 学んだこと
ジェネレータは、要求に応じて複数の値、または無限の数の値を返すことができる

- ジェネレータ関数

ジェネレータを作成するには、特別な「function*」、ジェネレータ関数を使用する必要がある
```javascript
function* generateSequence() {
  yield 1;
  yield 2;
  return 3;
}
```
generateSequence() が呼ばれたとき、コードは実行されず、代わりにジェネレータを返す
ジェネレータオブジェクト作成時に、処理は最初の部分で一時停止し、
ジェネレータのメインのメソッドであるnext()呼ばれると、最も近い yield <value> 文まで処理を再開する

- yield 演算子
ジェネレータ内部にのみ yield 演算子が存在する

外部のコードとジェネレータは nextとyield 呼び出しを通して結果をやり取りすることができる
ジェネレータは処理中に呼び出しコードとデータをやり取りする関数の機能が便利である

### 感想
ジェネレータではfunction*で表す、ジェネレータ関数　と　yieldがとても重要だとおもうが、次の章で非同期との関係性についても学ぶと思うので、難しいがしっかり覚えたい。


## 12.2 非同期イテレーションとジェネレータ
### 知らない単語
- チャンクとは
　　　　　- 大きなデータを分割して制御情報を付加したひとまとまりの断片などの事

### 学んだこと
非同期イテレーションを使用すると、要求に応じて非同期に来るデータに対して反復処理することができる

- 反復可能（iterable）を思い出してください

オブジェクトに 反復する機能 を追加する時、
Symbol.iterator というメソッドを使って実装できる
このメソッドはループが開始されたときに for..of で呼び出され、next メソッドをもつオブジェクトを返す必要がある
イテレーションのたびに、メソッドが実行され、値を取得する
next() は {done: true/false, value:<loop value>} の形式の値の返却が必要で、done:true はループが終わりであることを意味する

- 非同期の反復可能

オブジェクトを非同期的に反復可能とするには、
Symbol.iterator の代わりに、Symbol.asyncIterator を使用する
next() は promise を返さなくてはならない
async が処理し、 async next() とできる
このオブジェクトをイテレートするには、for await (let item of iterable) ループを使用する
await も使用する

### 感想
非同期処理の所でも学んだが、イテレーションのたびに、メソッドが実行され、値を取得するという処理など、今一度ループ処理を思い出し、sync/awaitを絡めた処理も忘れないようにしたい。

# 最後に
ジェネレータはjavascriptの中では、そこまで多用されるわけではないようだが、使うべき所が来た時すぐに思い出せるようにしておく。
AWS CDK：CfnTagのちょっとした共有

## はじめに
今回は仕事でちょっと触る機会があった、AWS CDKのちょっとした共有になります。
Document見てもこれ結局どうやって使うんだ？となったので、記事にまとめておこうと思い立ちました。
（AWSのドキュメントって基本的に分かりづらいって思ってるのは自分だけですか。。？）
CDKのCfn系の記事は以外に少ないので、誰か悩んだ方の助けになると幸いです。

## 環境
* AWS CDK 2.47.0
* TypeScript 4.8.4
* [AWS CDKのドキュメント](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.CfnBucket.html#example)

## やったこと
* CfnBucketを使ったS3のバケット作成
* CfnTagを使ったバケットに紐付けるTagの作成

## コード
s3を作成するコードと、実行するコードは分けたほうがわかりやすいと教えてもらったので、今回は２つのファイルを作成しています。
ここを分けてると、他のリソース（EC2とか）を作るときも書きやすくなりますよね。

### コード全体
今回のコードの動きは、バケットを作ってタグを付与するだけです。
ちなみに実行する上ではAWSのアクセスキーを払い出してから実行してください。

```main.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';

import { S3 } from './resource/s3';

export class TestStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    //アカウントID取得
    const accountId = cdk.Stack.of(this).account;

    //s3作成
    const cfn_s3 = new S3('Test', accountId);
    cfn_s3.createResouces(this);
  }
}
```

```s3.ts
import * as cdk from 'aws-cdk-lib';
import { CfnBucket, CfnBucketPolicy } from 'aws-cdk-lib/aws-s3';
import { Construct } from 'constructs';

export class S3 {
    bucketName: string;
    accountID: string;

    constructor(bucket: string, account: string) {
        this.bucketName = bucket;
        this.accountID = account;
    };

    createResouces(scope: Construct) {

        // Tag作成
        const cfnTag: cdk.CfnTag = {
            key: 'TestTag',
            value: 'Test',
        };
        // bucket作成
        const bucket = new CfnBucket(scope, 'CreateBucket', {
            bucketName: this.bucketName,
            // Tag付与
            tags: [cfnTag]
        });
    }
}
```

### ちょこっと解説
`CfnBucket`を使ってバケットを作成するための設定を色々書くことができます。
Cfn系はCDKのL1にあたるので、設定したものしか反映されません。<font color='gray'>（ここではL１とかL2の話は置いときます）</font>
その中でバケットにタグをつけるときは

スコープの中でなにかしらの変数を定義してあげて（ここはドキュメントのまんま：[ドキュメント](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.CfnTag.html)）
```.ts
const cfnTag: cdk.CfnTag = {
            key: 'TestTag',
            value: 'Test',
        };
```

CfnBucketの中で以下のように指定して上げる必要があります。
```.ts
tags: [cfnTag]
```

~~以下の書き方はできないみたいなのでご注意ください。~~
新しいバージョン（おそらく2.47.0より上）だとできました。
```.ts
tags: [{
        key: 'hogehoge',
        value, 'fuga'
      }]
```

## 終わりに
今回はAWS CDKのことについて記事を書いてみました。
初めて触るということもあり、結構理解するのに時間がかかってしまいましたが、yamlでCFNを書かなくて良いのは個人的には助かるなと感じています。
Javaで何か作ってみる(2022/12/14 Day55)

## 今日やった事
- 何もしなかった。
## 参考にしたもの
- 特になし。
## 所感
- 今日は本当何も勉強しなかった、ただただ反省。。。
## 明日の予定
- 引き続き、Springの勉強を進めていく。
Javaで何か作ってみる(2022/12/13 Day54)

## 今日やった事
- オブジェクト指向の動画教材を見た。（**J2-99_さいごに** まで見た。）
- Springの動画教材を見た。（**セッティング～学習環境を準備しましょう～** まで見た。）
## 参考にしたもの
- [Spring 入門 ～ SpringBoot 2 を使ってお問い合わせアプリとToDoアプリを作る ～](https://www.udemy.com/course/java_spring_beginner/)  
- [【超初心者も必見】Javaプログラミングの「オブジェクト指向」が絶対理解できる講座【プロ講師が丁寧解説】](https://www.udemy.com/course/uz-java-obj/)  
## 所感
- オブジェクト指向は完璧ではないものの、ある程度は理解出来たと思う。
- Springは、動画教材だと、Eclipseをインストールする方法しか紹介されていなかったから、  
Eclipseをインストールしなくてもいい方法を模索したい。

## 明日の予定
- 引き続き、動画教材を進めていく。
そのIPv4アドレスはシェアされています

この記事は、[ニフティグループ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/nifty) 15日目の記事です。

私は株式会社セシールの技術推進グループでエンジニアをしています@spicy_laichiです。

14日目の記事は @ike_chan さんの「[リモートモブプロ支援ツール「mob」を使ってモブプロしてみた](https://engineering.nifty.co.jp/blog/14004)」でした。
最近では、モブプロを導入している会社も多いと聞きますので支援ツールの紹介は非常にありがたい記事でした。



# 記事の目的

従来の固定回線が主流のインターネット接続では、1契約につき1個のIPv4アドレスが払い出されるのが一般的でした。
しかし、IPv4の枯渇によるCGNの活用などが起因し1個のIPv4アドレスがシェアされることが今の時代では当たり前になってきました。

今回は、そういったIPv4アドレスのシェアが一般化したことによる問題をいくつか紹介したいと思います。

# 問題
## 送信元の特定が困難

IPv4アドレスがシェアされている場合、IPv4アドレスだけ分かっていても送信元を特定するのは難しく、ポート番号の記録も必要になっております。
現実の世界だと、マンション名だけ分かっても部屋番号がないと特定できないのと一緒ですね。

この問題を特に気にしないといけないのは口コミ等含めた電子掲示板の管理者になるか思います。
近年ネットでの誹謗中傷やプライバシー侵害が増加してきており、それに伴い発信者情報開示請求が増加している傾向があります。
電子掲示板管理者は、発信者情報開示請求に対して適切な対応を取るために日頃アクセスログをきちんと取っておくことが重要とされています。

総務省でも、2015年前後から議論されはじめIPアドレスやタイムスタンプだけではなく、ポート番号も開示対象となっています。

https://www.soumu.go.jp/main_content/000381080.pdf


ちなみに[RFC6302](https://www.rfc-editor.org/rfc/rfc6302)でも、送信元ポート番号の取得が推奨されていますね。


送信先元ポートは標準ログで取得できているんじゃないの？と思う方もいらっしゃるかと思いますが、例えばApacheでよく使われるCombined Log Formatなどは送信元ポートは取得しておりませんので注意が必要です。
https://httpd.apache.org/docs/2.4/ja/logs.html

:::note warn
最近の話ですが、プロバイダ責任制限法改正が2022年10月1日に施行されました。
https://www.soumu.go.jp/main_content/000836903.pdf
この記事をみて不安になった管理者はアクセスログの見直しを推奨します。
:::


## IPブロックが難しい

問題がある1ユーザーにしか影響が及ばないと思いIPブロックを実施してしまうことがあると思うのですが、善良な数十人または数百人のユーザーに影響が及ぶ可能性があることを考える必要あります。
提供しているサービスの性質にもよるとは思うのですが、基本的にはIPブロックは一時的なものとし短期間のブロックとしたほうがいいです。
長期的・半永久的にブロックするときは、明らかな攻撃目的のIPに限定しましょう。

IPヘッダーにホストIDの情報を追加するという議論も昔あったような気がするのですが・・・
詳しい人いましたらコメントお願いします。

## IP Geolocationの精度が落ちる
Proxyなどでも同様の問題がありますが、IPを元にした位置推定は精度が落ちてしまいます。
位置推定を利用しているサービスを管理している人は、CGNに普及にともない精度が比例して落ちることを意識する必要があります。


# 今後
今回の記事の中で紹介した問題は、IPv4の枯渇が発端となっています。
CGNはIPv4からIPv6の過渡期を支える重要な技術ではありますが、問題が出てきてしまうので根本解決としては業界全体でIPv6への移行を進めることが大切だと思っています。


# 豆知識
CGNに関連して`100.64.0.0/10`という特殊なプライベートアドレスの話で盛り上がりました。
用途を鑑みるに普段目にすることはないとは思いますが、このIP帯もプライベートアドレスなので覚えておくといいかもです。

https://www.rfc-editor.org/rfc/rfc6598


明日は、@udoncatさんの記事です。お楽しみに！
Salesforce カスタムオブジェクトをタブに追加する

:::note info
この記事は[miriwoお一人様 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/miriwo)の15日目の記事です
:::

# 概要

- Salesforceにて追加したカスタムオブジェクトをタブに追加する方法をまとめる。

# 前提

- カスタムオブジェクトが追加されていること。

# 方法

1. 右上の歯車マークをクリックする。
1. 遷移先ページの左サイドバーのプラットフォームツールの中の「ユーザインターフェース」をクリックし、表示された項目の「タブ」をクリックする。
1. 「カスタムオブジェクトタブ」の「新規」をクリックする。
1. 「オブジェクト」の項目でプルダウンを開きタブに追加したいカスタムオブジェクトを選択する。
1. 「タブスタイル」の項目で任意のスタイルを選択する。
1. 「次へ」をクリックする。
1. 「1 つのタブ表示をすべてのプロファイルに適用する」を選択し、プルダウンで「デフォルトで表示」を選択し「次へ」をクリックする。
1. 当該のカスタムオブジェクトを表示したいタブのアプリケーションにチェックをつけ「保存」をクリックする。
1. タブにカスタムオブジェクトが追加される。
カーネルアップデート対応方法メモ

# アップデートが必要なパッケージを確認
```
$ yum updateinfo list | grep -e important -e critical
ALAS2-2021-1722             critical/Sec.  nspr-4.32.0-1.amzn2.x86_64
ALAS2-2020-1406             important/Sec. openssl-1:1.0.2k-19.amzn2.0.3.x86_64
.
.
.
```

# アップデートが必要なパッケージの現在のバージョンを確認
```
$ yum list installed | grep hoge
nspr.x86_64                           4.21.0-1.amzn2.0.2             installed
```

# アップデートを実行
```
# yum update -y nspr
```

# アップデート後に再起動が必要なサービスを確認
```
$ needs-restarting -s
chronyd.service
network.service
postfix.service
sshd.service
rngd.service
```

必要なものは再起動
```
# systemctl restart network.service
```

# アップデート後にOS再起動が必要か確認
```
$ needs-restarting -r
不要な場合
No core libraries or services have been updated.
Reboot is probably not necessary.

必要な場合
後で追記
```

# 注意点
サービス再起動後、それに関係するサービスを再起動しないと意図通り動かない場合もある
例えばnetwork.serviceの再起動後、docker.serviceの再起動も実行しないと(多分dockerネットワーク周りの情報で不都合が出るとかで)コンテナ通信が不通になる
再起動するサービスの数が多い場合は追いかけきれないのでサーバ再起動が丸い気がする
Google UXデザイン：レイアウト（モバイルアプリ）

# はじめに

わたしが[Google UX Design Certificateで得られた素晴らしい体験][google]を、特に重要だと思われるポイントを小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ Google UX Design Certificateを受講してみてください。

[google]: https://qiita.com/mapami/items/7a0d0a3d4661c50f8bec

https://www.coursera.org/professional-certificates/google-ux-design

<details><summary>これまでの振り返り</summary>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/2f16ac26-fc78-5b4a-fd0c-bfd540a86c90.jpeg" width="700">


</details>

# モバイルアプリの共通デザインパターン

デザインするアプリをレイアウトする際に、既存のアプリで使われている一般的なレイアウトやパターンを知っておくと役に立つ場合があります。これらのレイアウトを知ることで、ビジュアルデザインプロセスを開始し、時間を節約し、デザイン作業を向上させることができます。

モバイルアプリには、ある種の共通した画面があることにお気づきでしょうか。アプリによってレイアウトや外観は異なりますが、目的やデザイン上の配慮は共通しています。

以下に、最も一般的なモバイルアプリの画面の種類をいくつか紹介します。モバイルアプリのポートフォリオプロジェクトでワイヤーフレームを作成する際には、これらを念頭に置いてください。

### Home screen

ホーム画面は、ユーザーがアプリケーションを開いたときに最初に目にする画面です。ホーム画面は、アプリの主なコンテンツや機能を表示し、ユーザーがさらに探索するための出発点となるものです。

ホーム画面は、ユーザーにアプリの内容を知らせるものなので、コンテンツは理解しやすく、使いやすく、ナビゲートしやすいものである必要があります。下部のナビゲーション・メニューや検索アイコンのような一般的なナビゲーション要素は、多くのユーザーにとって馴染みがあるため、アプリを使い始めるのが容易になります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/f67ff28b-6994-4094-51d3-f4813d86cd29.png" width="250">

ホーム画面を多くのコンテンツで埋め尽くしたくなるかもしれませんが、それではユーザーにとって雑然とした、圧倒されるような体験になりかねません。***<font color="MediumVioletRed">必要なコンテンツに絞り、余白を有効に活用する</font>*** ことで、ホーム画面をより使いやすくすることができます。

### Onboarding screens

オンボーディング画面は、初めてアプリを使うユーザーに、アプリの主な構成要素や機能を紹介するものです。特に、アプリにユニークな機能や馴染みのない機能がある場合、ユーザーがすぐに使い始められるようにすることができます。

また、オンボーディング画面では、よりパーソナライズされたユーザーエクスペリエンスを実現するために、情報を収集することもできます。この画面は、デザイナーが多くの選択肢を持っているため、特定のアプリのエクスペリエンスに合わせてカスタマイズする必要があります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/8401a87e-8475-fc81-eff1-67a1ee4f5908.png" width="450">

優れたオンボーディングフローは、ユーザーのエンゲージメントとリテンションを向上させることができます。しかし、多くの場合、複数の画面で構成されているため、ナビゲートが容易であることが必要です。デザイナーは、明確で簡潔なコピーと魅力的なグラフィックスを使用して、シームレスで印象的な体験を作り出すことで、離脱を最小限に抑えることができます。

### Profile/Account screen

プロフィール（アカウント）画面には、ユーザーの個人情報（氏名やメールアドレスなど）やアプリの設定（注文履歴やアクセシビリティ設定など）が含まれます。

プロフィール画面には多くの重要な情報が含まれるため、明確に整理され、簡単に操作できることが必要です。そのため、プロフィール画面はできるだけシンプルですっきりしたデザインにすることが望ましいのです。

#### Checkout Screen

チェックアウト画面は、ユーザーが購入を完了するための画面です。通常、支払いや配送に関するいくつかのフォームが含まれるため、チェックアウトはアプリの他の部分よりも複雑になる可能性があります。このステップはストレスになる可能性があるため、ユーザーができるだけ安全だと感じることが重要です。

デザイナーは、各フォームフィールドに必要な情報を明確にし、フィールドが正しく入力されたことを示すビジュアルアイコンを追加することで、その手助けをすることができます。

また、個人情報が安全に保護されていることをユーザーに知らせたり、購入が完了したときに確認メッセージを表示したりすることもできます。

# 参考

- [Basil](https://material.io/design/material-studies/basil.html) (recipes)
- [Owl](https://material.io/design/material-studies/owl.html) and [Fortnightly](https://material.io/design/material-studies/fortnightly.html#shape) (news content)
- [Crane](https://material.io/design/material-studies/crane.html#shape) and [Rally](https://material.io/design/material-studies/rally.html) (analytics)
- [Shrine](https://material.io/design/material-studies/shrine.html#shape) (eCommerce)
- [Reply](https://material.io/design/material-studies/reply.html#shape) (social media)
PhotonChat 参考サイト一覧


・Photon chat 公式 document
https://doc.photonengine.com/ja-jp/chat/current/getting-started/chat-intro

・How to Use Photon Chat for Unity Lesson 1
https://www.youtube.com/watch?v=rFkEkuOy5Fo&list=PLWeGoBm1YHVjY3vZ2qMFb95rAmyiVtBdz

・Photon Chatをこれから利用しようとしている方にぜひ知っていただきたいこと
https://tech.griphone.co.jp/2020/12/05/photon-chat-unity/

・Photon Chat taiwan
https://www.youtube.com/watch?v=VSZgig42Pl8

・線上多人聊天室 Photon Chat (1)  --chat 功能介绍
https://medium.com/photon-taiwan/%E7%B7%9A%E4%B8%8A%E5%A4%9A%E4%BA%BA%E8%81%8A%E5%A4%A9%E5%AE%A4-photon-chat-1-237680218bb0

・中文Blog教學 Photon Chat (2)
https://medium.com/photon-taiwan/%E7%B7%9A%E4%B8%8A%E5%A4%9A%E4%BA%BA%E8%81%8A%E5%A4%A9%E5%AE%A4-photon-chat-2-c2671e86192c

・Photon Chatのwebhookを使って、PHPサーバーで過去ログの作成とメッセージの改変をしてみた
https://tech.griphone.co.jp/2020/12/22/photon-chat-webhook-publish-message/
【Flutter】Firebaseからデータを取得したい！！

## 初期設定
インストール
[firebase_core](https://pub.dev/packages/firebase_core/install)
[cloud_firestore](https://pub.dev/packages/cloud_firestore/install)

```dart
firebase_core: ^2.3.0
cloud_firestore: ^4.1.0
```

FirebaseFirestoreのインスタンスを作成

```dart
final FirebaseFirestore _db = FirebaseFirestore.instance;
```

[firestoreについて](https://firebase.flutter.dev/docs/firestore/usage)


## データをとってくる

### どんなデータをとってくるの？
とってくるデータには主に2種類ある。QuerySnapshotとDocumentSnapshotだ。

collectionはグループの名前で、documentはそのグループに含まれる一つ一つの要素だ。たとえば、collectionはusers, posts, followersみたいにsをつけるのが一般的。documentはそれぞれ固有のIDが指定され（自分で指定もできる）、キーと値のペアをいっぱい持っている。

![data_model.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1444537/a99f7aca-8529-30b2-2ec3-32c591fb200f.png)


上の画像で言うと、「dogs」collectionの中に、「XLfnw0faPK7q4IOl3LtC」みたいな固有IDをもつdocumentが何個かある。そしてその中に、color(キー):brown(値)のペアが色々格納されている。

まとめるとこんな感じになる。複数のdocumentをとってくる時の戻り値はQuerySnapshot、一つのdocumentをとってくるときはDocumentSnapshotになる。
![flutter-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1444537/5b54069b-d017-2b7b-61ae-34d86e9bbe27.jpeg)


[QuerySnapshotの説明](https://firebase.flutter.dev/docs/firestore/usage/#querysnapshot)


> A QuerySnapshot is returned from **a collection query**, and allows you to inspect the collection, such as how many documents exist within it, gives access to the documents within the collection, see any changes since the last query and more.
> To access the documents within a QuerySnapshot, call the docs property, which **returns a List containing DocumentSnapshot classes.**


[DocumentSnapshotの説明](https://firebase.flutter.dev/docs/firestore/usage/#documentsnapshot)

>A DocumentSnapshot is returned from a query, or by **accessing the document directly.** Even if no document exists in the database, a snapshot will always be returned.
If the document exists, you can read the data of it by calling the data method, which **returns a Map<String, dynamic>**, or null if it does not exist:


### データの取得方法

以下のように、whereで探したdocumentたちを変数queryに格納しておいて、必要に応じてそこのdataをとり出していく、という使い方が一般的だと思う。この場合、queryにはQuerySnapshotが入っているので以下の[プロパティ, メソッド](https://pub.dev/documentation/cloud_firestore/latest/cloud_firestore/QuerySnapshot-class.html)にアクセスできる。

```dart
 final query = await _db.collection("users").where("userId", isEqualTo: firebaseUser.uid)
        .get();
```

とってきたデータはこんな感じで使うことができる。これはdataがあったら、trueを返す関数の一部を抜粋したものだ。

```dart
if(query.docs.isNotEmpty){
      return true;
    }
```
setのように、値を狙い撃ちする場合は、DocumentSnapshotがshotが返って来るので、以下の[プロパティ, メソッド](https://pub.dev/documentation/cloud_firestore/latest/cloud_firestore/QueryDocumentSnapshot-class.html)にアクセスできる。


```dart
 _db.collection("users").doc(user.userId).set(user.toMap());
```

## 終わりに
cloudFirestoreからデータをとって来る方法を、まとめました。
僕も手探りでやってるので、間違いがあれば指摘してくれると助かります。
Excel VBAでUTF-8でファイル出力

あちこちにサンプルコード落ちてますが、いちいち検索するのも面倒なので書いておく。
``` 
Sub WriteToFileWithEncodingUTF8(filename As String, text As String)
    With CreateObject("ADODB.Stream")
        .Charset = "UTF-8"
        .Open
        .WriteText text, 1
        .SaveToFile filename, 2
        .Close
    End With
End Sub
```
Windowsで特定サービスの起動or停止状態をコマンドで確認

# 概要

Windowsの検証機にSSH接続して、サービスの起動や停止をよくやってる。
SSH接続した時「サービス起動してたっけ？それとも今停止させてるんだっけ？」ってなっちゃう。

また、ローカルにおいてもタスクマネージャーのサービスを開いて、スクロールして確認するのが面倒。

起動or停止状態をコマンドでサクッと確認したい。

# やり方

```bat
sc query "サービス名"
```

サービス名とは ↓ ここの値。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/5e37584d-1242-61e2-2ee6-73585e655526.png)


停止時は ↓ こう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/da4e2377-fb82-9ecb-71b6-b2ca86ab9dcd.png)

起動時は ↓ こう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ca21a052-5326-21f2-e0fa-1b2b1fff9bb3.png)

# バージョン

Windows 10 Pro 21H2 OSビルド 19045.2311
話しやすい雰囲気を作るために意識していること

クラウドワークス Advent Calendar 2022の15日目の記事です。
crowdworks.jpでEM（エンジニアリングマネージャー）をしている久村です。

昨年からEMをしており、引き続きEMとして日々を過ごしております。

マネージャーをしている多くの方は日々1on1をされていると思います。
メンバーの考えていることを知る重要な機会ですよね。

1on1をうまく行うために、傾聴が大事だよねという考えを聞いた事がある人も少なくないと思いますが、そもそも話してもらえる状態じゃないと傾聴もできないように思います。

そんなことを考えている時に、同僚から話しやすい雰囲気と評価をもらえる機会がありました。
> 温和な雰囲気から話しかけやすく、人の話を積極的に聞き相手の話に耳を傾けるなどメンバーの信頼がある

有難いですね！

いい機会なので、話しやすい雰囲気を作るために意識していることを今回は言語化してみようと思います。
1on1時に意識したことをベースに書いております。


## 話しやすい雰囲気を作るためのポイント
大きく分けると以下の2点が話しやすい雰囲気を作るためのポイントです。
- 話すハードルを下げること
- 話す意欲を削がないこと

それぞれに対して意識していることを整理していこうと思います。
## 話すハードルを下げること

話すハードルを下げることとは、そんなことでも話して良いんだと思ってもらえることです。
この人にだったら、オープンに話しても良いなと思ってもらえるイメージです。

話すハードルを下げるために意識していることは以下です。
- 自分の失敗を先に伝える
- 教えを求める
- リアクションする

順に説明していきます。

### 自分の失敗を先に伝える
人間関係が築けていないメンバーにオープンに色んなことを話してほしいと思っても、それは過度な期待だと思います。
加えて私がマネージャーかつ30代という事もあり、若手のメンバーにとっては言いづらい人になり得えます。

よって相手から話してもらうことを期待する前に、まずは自分のことを話すことを意識しています。
その際に良い面やうまくいった点ではなく、悪い面や失敗したところを話すようにしています。

自分もこんなしょうもない失敗をするので、気軽にそう言うこともを話しても良いですよと言う想いです。

仮に自分の良い面を話したとすると、受けたメンバーも同様の良いことを話すことを期待されると感じ、話すことにプレッシャーを感じる可能性があります。それは避けたいですよね。
なので進んで失敗を話し、こんなことを話しても良いんだと思ってもらえることを期待しています。

### 教えを求める

「最近の気になることをありますか？」と言う相手の状況を把握する質問だけではなく、「ここで悩んでいるんですが、〇〇さんだったらどうするか教えてくれませんか？」と自身の課題に対して意見を求めることを行っています。

自身の無知をオープンにし、畏まる必要はないと感じてもらうことを期待しています。（そもそも畏まっていない気もしますが）
また物を頼むのが苦手な人は多いようですが、頼まれることには抵抗がない人は多いようなので、自分から積極的に助けを求めることで、話しやすくなることを期待しています。

余談ですが、弊社の文化に「ばぶばぶ」というものがあります。
これは赤ちゃんがばぶばぶ〜と泣くのが由来であり、特に結論を求めてるわけではない前提の元、まとまってない発言、事実のない解釈のみの発言などをおこなうことを意味します。

自分からばぶばぶの発言も積極的に使っており、相手からもばぶばぶで発言しても良いんだと思ってもらいたいと考えています。


### リアクションをする
表情と相槌を意識しています。

これは聞いていることを表現する上で大切です。
聞いてもらっていると感じてもらえると、より話しやすい状態になると思います。

表情 = 笑顔だと思います。
喜怒哀楽を表現するのが良いかなと思いつつ、そこまで怒りや哀しみを感じることはないので、必然的に喜び、楽しみを笑顔で表現することが多いと思います。

相槌は「うん、うん」と実際に声に発し、首も動かすのが基本です。
そんなことしなくても1on1なんだし、聞いてるのはわかるでしょ？と思うかもしれないですが、あった方が話しやすいと感じるので行っております。

## 話す意欲を削がないこと
話す意欲を削がないことことは、話そうと思ったけど辞めようとならないことです。

話す意欲を削がないために意識していることは以下です。
- 相手に集中する
- 明るく挨拶する
- フィードバックを受け入れる

以下でそのために意識している点を整理します。

### 相手に集中する
相手に集中するとは、相手との会話に関連すること以外はやらないと言う意味です。

相手との会話関連以外としてやりがちなのは、別件のslackに返信することです。
手元で1on1のメモは取っているので、タイピングしていることには違和感はないと思いますが、slackや別のこと書いていることは意外とわかるものです。
そうすると、相手は会話に集中していないと感じ、話す意欲も削がれます。

新卒の会社でもbe here nowという行動規範があり、今に集中することは信頼関係を気づく上で重要というのがあり、今でも意識しているものになります。

ミーティング続きで、どうしてもその時間に返答したい場合は、「すいません、1件slackの返信をさせてください」等の断りを入れて行うのが良いと思います。

### 明るく挨拶する
「〇〇さん、お疲れ様です！よろしくお願いします！」が自分の挨拶の基本です。

明るくというのは大事だと思っていて、今日は元気なさそうと思われると自分のコンディションによって発言内容が変わる可能性があるからです。
なので、なるべくいつも明るいことは意識しております。

自分はやったことはないですが、どうしても明るく振る舞えない時はその事情を伝えて、相手が原因でないことを明示することも良さそうに思います。


### フィードバックを受け入れる
時には自分に対して、手厳しい意見をもらう事があります。
その時に、絶対反論はしないようにしています。

そんなことをしてしまうと二度とフィードバックはもらえなくなります。

瞬間的に自分の言い分を伝えたくなる時もありますが、そんな自分のちっぽけなプライドは置いておいて、真摯に言ってもらえることに感謝する事が大事です。


## まとめ
話しやすいを作るために意識していることを整理しました。
1on1の主役は相手と思っているのが前提にあり、そのために脇役の自分ができることは何だろう？を考えての言語化になります。
何かの参考になれば嬉しいです！

メンバーがポジティブに働くためのメンタリングなどのピープルマネジメントに興味がある方は、EMも募集しておりますので是非求人を確認してみてください！
https://jobs.forkwell.com/crowdworks/jobs/18652
未経験から始めての振り返り

## １、はじめに
初めまして！北浦です。
Udontech Advent calendarも後半に突入しましたね。
私は今年７月から4ヶ月間香川コーディングブートキャンプを受講した未経験エンジニアです。
今回が初投稿となりますがよろしくお願いします。
記事は7月から現在にかけての振り返りにしたいと思います。

## ２、7~11月　ブートキャンプ受講
主な内容はブートキャンプでは環境構築から始まり、Rubyを使ったプログラミングの基礎、Ruby on railsによるMVCの基本、特にバックエンドについて学びました。
最終課題ではチーム開発でfurimaアプリと個人ではオリジナルアプリを作成しました。
オリジナルアプリは友人のうどん屋のHPを作成しましたが現在、友人と話し合いながら修正しているのでデプロイはしていませんが完成したら紹介できたらと思います。
このHPではRailsを使用した基本的なCRUD機能、gemでページネーションやログイン機能を実装しました。
フロントエンドはあまり学習がなかったためBootstrapを使用しスタイルを調整、トップページの画像はcarouselを使ってスライド機能を実装しました。


## ３、11月以降
ブートキャンプ受講後はRubyから一旦離れPHPを勉強を始めました。理由としては４ヶ月間慣れ親しんだRubyよりPHPの方が需要があると思ったからです。
PHPはLaravelのフレームワークを使用して基本的なMVCの流れCRUDを使った実装をRailsと比較しながら学んでおり、docker composeを使ってLaravel sailで実装したり、現在はUdemyの講座でLaravelにvue.jsを使いInertiaでSPA(シングル・ページ・アプリケーション)での実装をハンズオン形式で勉強しています。
使った参考書、講座は以下になります。
プロフェッショナルWebプログラミング Laravel〈最新Laravel 9対応〉
https://www.amazon.co.jp/gp/product/4295202835/ref=ppx_yo_dt_b_asin_title_o08_s00?ie=UTF8&psc=1

こちらの参考書ではdocker composeを使用しているので環境構築でスムーズにできすぐにLaravel sailを立ち上げることができました。
dockerは理解するのは難しいですがこうやって簡単に立ち上げられるのは初心者からしたらとても助かります。
Laravel sailでの構築や簡単なアプリ開発に役に立ったサイトも載せておきます。

https://readouble.com/
https://chigusa-web.com/

---

【Laravel】【Vue.js3】で【CRM(顧客管理システム)】をつくってみよう【Breeze(Inertia)】
<https://www.udemy.com/course/laravel-vue3-crm/>

こちらの講座は中級者向け、しかもvue.jsは初めてだったため途中から点と点が結びつかないことが多かったため１回制作してから２回目でじっくり理解していこうと思っています。
この講座は現場で使われているような技術が多いと思ったためチャレンジしてみました。

簡単にですがアウトプットも兼ねて環境構築までの流れも簡単にですが載せようと思います。
まずは新規のプロジェクトを作成します。
```
$ composer create-project laravel/laravel example-app
```
データベースはmysqlとMAMPを使用しております。
DB設計や初期設定については今回は省略します。
次にLaravel/BreezeでInertiaをインストールします。
```
$ composer require laravel/breeze --dev
```
```
$ php artisan breeze:install vue
$ npm install && npm run dev
```

ホットリロードができるように
```
$ npm run dev
```
サーバーを立ち上げるために
```
php artisan serve
```
を入れると環境が整います。

簡潔に書きましたがLaravelでvue.jsを動かす用意ができました。
ここから講座ではvue.jsのCompositionAPI機能をメインに使って実装を行なっていく流れとなっています。

---
**補足** :調べていたらスターターキットのLarastarterをインストールすると一発で環境構築できることがわかりました。
https://www.larajapan.com/2022/03/14/lara%e3%82%b9%e3%82%bf%e3%83%bc%e3%82%bf%e3%83%bc-bootstrap-5/

```
$ composer require laraveldaily/larastarters --dev
$ php artisan larastarters:install
```


---
<dt>よかった点</dt>
初めてのPHPでしたが取っ掛かりやすかった。参考書と同じような内容が記事として多かった。
kindle unlimitedにも参考書があったためそこからも探すことができた。
<dt>悪かった点</dt>
PHPの基礎をあまり学習せずに初めてしまったこと。
参考書とバージョンが違い解決するのに時間がかかったこと（参考書ではフロントビルドアップツールがLaravel mixを使用していますがLaravelの最新のバージョンではviteが使用されています。）


## まとめ
今回ブートキャンプ受講後違う学びを始めましたが基礎を学んでいたことで新しいスキルへの以降も苦なく進めることができました。また、受講することで受講生やいろいろな方々と繋がることができました。
今後の課題としては一気に勉強する内容を広げてしまったので少しずつ理解してちゃんとした記事が作れるくらいになりたいです。
これからも学習を続けIT業界の道へ進めるようにしたいです。
Twilio Studio で SSML を使う

:::note alert
2023年5月1日を持ちまして、株式会社KDDIウェブコミュニケーションズのTwilioリセール事業が終了したため、本記事に記載されている内容は正確ではないことを予めご了承ください。
:::

# はじめに

みなさん、こんにちは。
KDDIウェブコミュニケーションズ、Twilioエバンジェリストの高橋です。

この記事は、[Twilio Advent Calendar 2022](https://qiita.com/advent-calendar/2022/twilio)の5日目の記事となります（空いていたので書いてみた）。

みなさん、[Twilio Studio](https://www.twilio.com/ja/docs/studio) 使ってますか？
Twilio Studio はいわゆるノーコードツールで、ドラッグ・アンド・ドロップだけで簡単にコールフローが作れます。
特に、テキストの読み上げ機能などはとても便利で、最近では Polly.Takumi-Neural が使えるようになったので、より自然に発話できるようになりました。

## Studio の発話に関する要望

しかし、この部分はもう少しゆっくり喋らしたいとか、もう少し間を長く取りたいなど、細かい要望が出てくることがあります。
そんなときに重要なのが SSML です。

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

## Studio でも SSML（Speech Synthesis Markup Language）が使える

実は、Twilio の TTS（Text-To-Speech）機能の音声エンジンには、Amazon Polly が使われており、TwiML をガリガリとコーディングすれば、SSML で音声を調整することが可能でした（Polly が SSML に対応しているため）が、残念ながら Studio では使えませんでした。

しかし、2022年12月12日から、Twilio Studio の Say/Play ウィジェットと、Gather Input On Call ウィジェット内でも SSML が使えるようになりました！パチパチ。（ん？この記事はアドベントカレンダーの5日目だな。時系列がおかしいけど、まぁいいか）

## 試してみた

ということで、さっそく以下のような Studio フローを作ってみました。
![スクリーンショット 2022-12-15 8.34.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/c70624d9-1b27-08bf-5d62-b00d84536be0.png)

肝心の発話内容は以下のようになっています。

```text:発話内容
こんにちは。<break time="3s" />
<prosody rate="x-fast">生麦生米生卵生麦生米生卵生麦生米生卵</prosody>
<break time="1s" />
電話番号は、<say-as interpret-as="telephone">05012345678</say-as>です。
暗証番号は、<prosody rate="slow"><say-as interpret-as="digits">0468</say-as></prosody>です。
```

なにやら見かけないタグがいっぱい書いてありますね。そう、これが SSML です。
先程も書いたように、Say/Playウィジェットで、**Polly**の話者を選んだ場合、これらの SSML が有効になります。

:::note info
ちなみに、話者に Alice を選んだ場合は、SSML は効きませんが、タグが読み上げられることもありません。
:::

では早速、この音声を聞いてみましょう。

https://skillful-pancake-7200.twil.io/assets/ssml_sample.mp3

とくに電話番号の読み上げとか、感動しますね。
逆に、暗証番号はもう少し間を開けて読んでほしいです。

細かい要望はありますが、今回の機能拡張はかなりイケてるはずです。

Say/Play ウィジェットで使える SSML の一覧は以下のページに記載があります。

https://docs.aws.amazon.com/ja_jp/polly/latest/dg/supportedtags.html

ちなみに、読み上げのテストをするときは、Studio フローの Webhook URL を TwiML Apps に設定して、TwiML Apps の**Call using Twilio Client**機能を使うと良いです。

![スクリーンショット 2022-12-15 9.09.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/f7a9e28d-bdad-060a-7d87-f618de5fddbe.png)

# まとめ

今回の SSML 対応によって、TTS の性能？が格段に向上します。ぜひ色々とチャレンジしてみてください。

---
### Twilio（トゥイリオ）とは

https://cloudapi.kddi-web.com
Twilio は音声通話、メッセージング（SMS /チャット）、ビデオなどの 様々なコミュニケーション手段をアプリケーションやビジネスへ容易に組み込むことのできるクラウド API サービスです。初期費用不要な従量課金制で、各種開発言語に対応しているため、多くのハッカソンイベントやスタートアップなどにも、ご利用いただいております。

Twilioに関するご相談などがございましたら、ぜひ相談会をご利用ください。
[Twilio相談会](https://cloudapi.kddi-web.com/contact/consultation?hsLang=ja-jp)

自己紹介|　
:--|:--
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/b51a8b88-abd5-ce5e-195a-de3564ba2ae6.png" height='200' width='150'/>|高橋克己（Katsumi Takahashi） 自称「<font color='red'>赤い芸人</font>」<br />グローバル・インターネット・ジャパン株式会社　代表取締役<br />株式会社KDDIウェブコミュニケーションズ　Twilio事業部エバンジェリスト<br /><br />2001年より大手通信事業者の法人サービスの教育に携わり、企業における電話のしくみや重要性を研究。2016年よりTwilio事業部にジョインし、Twilioを使ったスマートコミュニケーションの普及活動を精力的に行っている。<br />2015 Hall of Doers<br />2019 Twilio Champions