OmniAICreator/Qiita-1.07M huggingface dataset:
X の ブロックした人からXへ報告をする方法

#

[ここをクリックすると他の技術投稿の目次に行きます](https://qiita.com/FUKUTAKA7938/items/2312362e44dbcecd11ca)

# X の ブロックした人からXへ報告をする方法

これは、PCの X からしかできません。

やり方、

1. X の左下の「もっと見る」をクリック
2. 「設定とサポート」をクリック
3. 「設定とプライバシー」をクリック
4. 真ん中の「プライバシーと安全」をクリック
5. 右側の「ミュートとブロック」をクリック
6. 「ブロックしているアカウント」をクリック
7. ブロックしている名前をクリックするとその人のツイート部屋の
赤文字で「ブロック中」となっていますのでのその左側の「・・・」をクリック
8. すると項目に「＠〜さんを報告」とあると思います。
9. ここから「報告する問題の種類を教えてください」がでますので、選択（私は、性的嫌がらせを受けましたので、「攻撃的な行為や嫌がらせ」を選択）しました。
10. 「次へ」
11. 「情報収集中」になるので、項目が当てはまるものを選択
12. 「送信」をクリック
13. 「完了」をクリック

ここからは、私なりのやり方です。
私は、嫌がらせの投稿をされるたびに名前とアカウント（＠〜）を紙に書いています。
その後、ブロックして 7.〜13. の方法を取っています。

理由：ブロックはしたものの報告するのは良くないかもしれないし、
アカウントは、それだけのたった一つなので、同じ名前があったらもう一度送らないようにするためです。

あとは、ある程度貯めて、連続して報告する方法もあるかと・・・

#

[ここをクリックすると他の技術投稿の目次に行きます](https://qiita.com/FUKUTAKA7938/items/2312362e44dbcecd11ca)
JavaScriptにおけるundefinedとnullの違い

## これはなに

値がないときに利用する `undefined` と `null` ですが、いつも違いについてぱっと思い出せなくなるので、記事化して整理したいと思います。

## 意味の違い

`undefined` と `null` の違いを検索したときに、「２つの違いは曖昧である」と表現する記事は多かったです。
[undefinedとnullの違い | TypeScript入門『サバイバルTypeScript』](https://typescriptbook.jp/reference/values-types-variables/undefined-vs-null)では、このように表現していました。

- undefined
    - 値が代入されていないため、値がない
- null
    - 代入すべき値が存在しないため、値がない

## 発生タイミング

- undefined
    - 自然発生する = 定義されていない
- null
    - 自然発生しない = 定義された「空」を返す

nullは開発者が「空である」という状態を意図的に表すための値です。

undefinedは開発者が意図的に使わなくても自然発生します。
そもそも参照することを想定されていません。
変数を宣言したときに初期値がなければ、undefinedが代入されます。

### 例:変数が初期化されてないとき

```javascript
let x;
console.log(x); 
//結果 undefined
```

### 例:プロパティが存在しないとき

```javascript
let obj = { a:123 }
console.log(obj.b);
//結果 undefined
```

### 例:配列の添字の場所が存在しないとき

```javascript
const arr = [];
console.log(arr[0]);
//結果 undefined
```

## 例：関数の戻り値がないとき

```javascript
function func() {}
console.log(func());
//結果 undefined
```

## 変数と関数

- undefined
    - 変数
- null
    - リテラル

## typeof演算子

```javascript
typeof undefined;
//結果 "undefined"
typeof null;
//結果 "object"
```

## どっちを使えばいい？

TypeScriptの開発チームのコーディングGuideにはundefinedを使うという記述がありました。

>null and undefined
1.Use undefined. Do not use null.

https://github.com/Microsoft/TypeScript/wiki/Coding-guidelines#null-and-undefined

とはいえ、各開発チームの方針があると思うので、準拠していくと良いと思います。

---
この記事が誰かのお役に立てると幸いです。

## 参考

- [undefinedとnullの違い | TypeScript入門『サバイバルTypeScript』](https://typescriptbook.jp/reference/values-types-variables/undefined-vs-null)
- 山田 祥寛."データ型." 改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで. 技術評論社,2016, 57.
- [null - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/null)
UIデザインで大事にしていること＆おすすめ書籍３選

# ユーザーにストレスを与えないこと
例えば、スーパーなどのセルフレジのタッチパネルは誰でも操作しやすいUIになっており、行いたいことを達成することに適したタスク指向での設計になっています。
これを実現させるために以下のようなことが大事になってきます。
`タスク指向＝行いたい事（タスク）を起点に設計したUI`
`オブジェクト指向＝目当てとなるオブジェクトを起点に設計したUI`

**〈直感的なデザイン〉**
ユーザーが直感的に理解しやすいデザインが重要。アイコンやナビゲーションが分かりやすく、予測可能な振る舞いを示すことで、ユーザーが迷うことなく操作できる。

**〈整合性と一貫性〉**
デザイン要素や操作が整合性を持ち、一貫性が保たれていることが重要。同じ操作に対して同様の反応が得られることや、同じタイプのコンテンツが同じ方法でアクセスできることなどが含まれる。

**〈負担の少ないデザイン〉**
ユーザーが情報を見つけやすく、理解しやすいようにデザインされたUIは、ストレスを軽減。必要な情報や機能が素早く見つかるようなデザインにする。

**〈読みやすさと視認性〉**
テキストやコンテンツのフォントサイズ、色、配置などが、読みやすさと視認性を向上させます。適切なコントラストや適度な余白を使用することで、情報を見やすくする。

**〈ユーザーの誤操作を防止〉**
デザインが誤操作を最小限に抑えること。ユーザーが意図しない操作を行わないように、適切なフィードバックやアクションの確認をする。

# UIデザインを学ぶ理由
サイトやアプリ、デジタル製品などのユーザーのニーズを理解し、それに応じてデザインを構築し、提供することでユーザーに心地よさやまた使ってもらえる利便性を与え、それを追求しいくためだと思っています。

**〈ユーザーエクスペリエンスの向上〉**
UIデザインはユーザーエクスペリエンス（UX）の一部であり、良いUIデザインはユーザーがウェブサイトやアプリを使いやすく、楽しいと感じるための鍵となる。

**〈創造性を発揮〉**
UIデザインは芸術性と科学的アプローチの両方を取り入れた創造的なプロセス。ユーザーの問題を解決し、魅力的で使いやすいデザインを作り出すことができる。

**〈キャリアの多様性〉**
UIデザインは幅広い産業や分野で必要とされており、ウェブサイト、モバイルアプリ、ゲーム、自動車、家電製品など、さまざまな分野で活躍できる。


# 読んでおきたいUIデザインを学ぶ3冊
上記を踏まえて、おすすめの書籍を3点紹介します。


**『オブジェクト指向UIデザイン ――使いやすいソフトウェアの原理』**
・ソシオメディア株式会社/上野学/藤井幸多　著
・上野学　監修（2020）
https://www.amazon.co.jp/dp/4297113511/

>〈要点〉
オブジェクト指向プログラミングにおいてUIデザインを行う際に重要な考え方や手法について、具体的な事例を交えて解説しています。オブジェクト指向プログラミングの設計思想をUIデザインにも応用することで、より使いやすく、保守性の高いソフトウェアを実現することができることを言及しています。

***

**『だから、そのデザインはダメなんだ。 WebサイトのUI設計・情報デザイン 良い・悪いが比べてわかる』**
・エムディエヌコーポレーション/香西 睦　著（2016）
https://www.amazon.co.jp/dp/4844365827/

>〈要点〉
良い例と悪い例を並べ、その理由とポイントを3つに絞って紹介していく構成になっているため、内容が頭に入ってきやすいです。メニューの作り方、新規ユーザーに見てもらうための工夫、FAQやフォームの作り方なども分かる。ディレクター、デザイナーは一読してしとおくと◎

***

**『UXライティングの教科書 ユーザーの心をひきつけるマイクロコピーの書き方』**
・キネレット・イフラ　著
・翔泳社/仲野 佑希　監修
・郷司 陽子　訳（2021）
https://www.amazon.co.jp/dp/4798167339/

>〈要点〉
Webやアプリなどのデジタルプロダクトで目にするボタン、会員登録フォーム、操作上のアドバイス、エラーメッセージなどのテキストについて、ユーザーに行動意欲を高め、実行をサポートし、エンゲージメントを強化してくれるのがマイクロコピーの役目だとわかる一冊です。

# まとめ
いかがでしたでしょうか。ユーザーのタッチポイントとなるUIの作成には客観的にみる感覚が必要になってきます。どうしても作成側は主観的に作りがちですが常に「どうしたら心地よく使ってもらえるか」を意識することでUIの質がグンと上がると思います。
また、記事でご紹介した3冊も機会がありましたら是非チェックしてみてください。

そんなこんなで今日は25日！“アドベントカレンダー”ラストとなりました！
メリークリスマス！素敵な一日をお過ごしください！！


![wc_christmas.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981429/dd195f69-ef3a-14f1-4c1e-d86aca21200b.jpeg)
節目の時期の振り返りにおいて、結局一番大事だと思うこと

本記事は[リンクアンドモチベーションAdvent Calender2023](https://qiita.com/advent-calendar/2023/lmi ) の23日目になります。

## はじめに
みなさんこんにちは。株式会社リンクアンドモチベーションで[モチベーションクラウド](https://www.motivation-cloud.com/?gclid=CjwKCAjwlJimBhAsEiwA1hrp5gz4Lg2HOMD5RxHjetpx3ccJW-oMKsm9Na6jSSlvQ6Cw0wFl6yem2BoCQBQQAvD_BwE#argument=WQSypepR&ai=617b9e0861a89&utm_source=Google&utm_medium=cpc&utm_campaign=brand)のUX/UIデザインを担当している[mizo](https://twitter.com/mizodesign_0607)です。時期も時期ですので今回は「振り返り」に関して書こうと思います。特に今回は「節目」の時期に行う振り返りにフォーカスしてまとめていきます。

## 日常的に行われる振り返り
私のチームでは週に一度KPTを用いてプロジェクトの振り返りを行っています。チームメンバーそれぞれが1週間の活動の中で良かったこと(Keep)、課題(Problem)を洗い出し共有、そして出てきた課題に対してどう解決していくか(Try)を議論し次の週に実施するアクションを決めていきます。参加者は9名で45分で実施しています。日常的に行う振り返りでは、次の週に **問題を持ち越さないように、すぐ修正行動をチームとして取っていくこと** を目指して実施しています。

また単純に振り返り内容を羅列するだけなく、空間軸と時間軸で分けて整理することで話を進めやすくなります。

**↓ポイント↓**

:::note info
良かったことは適度に共有し、課題に対しての打ち手まで議論できている。アクションが明確で担当者や期限まで設定できている。
:::

:::note alert
良かったことにばかり時間を使いすぎて上げられた課題について話せていない。同じ課題が次の週も上がる。
:::

![Frame 627013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641301/4e891b3b-765a-8ab8-5b87-0f94917c3274.png)
![Frame 627014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641301/64784830-d77c-e1bd-947f-7e51b9248ce6.png)


## 節目の時期の振り返りは設計や目的を変えている
節目の時期の振り返りでは **「できたこと」や「成長したこと」などにフォーカス** をしています。毎週課題に向き合っている分、ちゃんとチームとしてできたことに目を向けることも重要です。ずっと課題に向き合うのは人間辛いですからね。個人単位やチーム単位で成長したことなどをみんなで共有しあったりするようにしています。その際、「裏でAさんこんなに頑張っていたんだ」「BさんとCさんってこんなに関係性良くなってたんだ」など様々な気づきがあります。課題と向き合うことだけでは見れないチームの成長を見ることができるのでおすすめです。

**↓ポイント↓**

:::note info
課題は適度に共有し、個人やチームの「成長したこと」に時間を使えている。お互いが賞賛し合えている。
:::

:::note alert
課題ばかりに着目しチームの雰囲気が落ち込んでしまう。
:::

![Frame 627012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641301/ab8fc130-6e86-212c-c599-05590624c3cc.png)

## 結局一番大事なこと
結論から述べますと、私が節目の時期の振り返りで一番大事だと思っているのは **「周囲への感謝」** です。これに尽きます。今の自分の成果や成長があるのは周りサポートがあるからこそです。1人で完結するような仕事はほぼないと思います。アイデアの発散や途中の壁打ち、最終意思決定など様々な場面で「他者」が関わってくると思います。この他者とのコミュニケーションを無しに良い仕事はできません。感謝を周囲に伝えることは様々な良い効果をもたらします。

- 人間関係の強化
- ポジティブな組織文化の形成(チーム内外共に)
- チームワークの促進

ポジティブな組織文化の形成に関しては、自チーム内で感謝を伝え合っていただけで他のチームも参考にしてくれることがありました。最初は自チームのメンバーに、いつの間にか他チームのメンバーにも感謝を伝えていてそれをきっかけに一緒に仕事を進めることになったりもしました。

## 振り返りを円滑に進めるためのTips
#### 事前依頼
まずは確実に振り返り内容記入してもらうことを徹底します。 これはかなり重要なことです。ミーティング中に1週間をさらっと振り返り、思いつきで記入するのでは意味がありません。直前までミーティングがびっしり入っていて、当日の記載が無理なのであれば前日までにちゃんとお願いしましょう。チーム全員がちゃんと振り返っていることに意味があります。

#### 投票性
みんなが記載した振り返りに対して、関心のある内容に各人が投票できるようにしておくことをおすすめします。限られた時間の中で全てのものに触れるのではなく、みんなの関心度が高いものから順に議論するとうまく進みます。話さなければならないことに時間が割けなくなることは回避しましょう。

#### 雰囲気作り
どうしても振り返りを行うと少し雰囲気が重たくなることもあるでしょう。その場合は最初にアイスブレイクから始めたり、BGMをかけながら実施しても良いかもしれません。直接声を出さなくても、チャット欄などを用いて発言を促してもいいとおもいます。気づいたらファシリテーターだけが話をしている振り返りは避けたいものですね。

#### 曖昧にしない
課題を取り扱ったのに次のアクションや納期を曖昧にするのは逆効果になります。参加している全員の認識を揃えることを心がけましょう。また記載してくれたことを正しく深掘ることも重要です。表層の課題ではなく深層にある真の課題を突き止めましょう。


## まとめ
振り返りは目的やタイミングによってフォーカスするポイントを変えることを紹介しました。特に節目の時期に課題ばかりに着目してしまうと、チームの雰囲気も落ち込んでしまうことがあります。適度に「できたこと」や「成長したこと」にフォーカスする設計にしましょう！そして周囲への感謝を忘れずに！みなさん今年1年本当にお疲れ様でした!
PowerAutomateでTeams会議チャットにメッセージを投稿

PowerAutomateを使うと自動化されたワークフローからTeams会議を作成して参加者に会議出席依頼を送信することができます。
そうして送信したTeams会議についてPowerAutomateからさらなるあれこれをしようとしたときに見つけたTIPSです。

# Problem

PowerAutomateを使って、Teams会議のチャットにメッセージを投稿したい。
すでにあるグループチャットやチャネルではなくて、Teams会議のチャットにメッセージを投稿したい。

# Solution

Teams for Business（PowerAutomateの画面表示上は単に「Teams」）コネクターの「チャットまたはチャネルでメッセージを投稿する」アクションを利用する。

ワークフローとしてはこんなふうになる：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/8a761a26-6269-f44b-4aba-964d3afa2a5e.png)

まず Teams会議を作成する。
このとき、アクションの出力に含まれる `body/onlineMeeting/joinUrl` を後続アクションで利用する。

この値は以下のような内容になっていて・・・：
```
https://teams.microsoft.com/l/meetup-join/19%3ameeting_OThh...5MGEw%40thread.v2/0?context=%7b%2...
```

エンコードされている部分を解除すると・・・：
```
https://teams.microsoft.com/l/meetup-join/19:meeting_OThh...5MGEw@thread.v2/0?context={"...
```

この`19:meeting_OThh...5MGEw@thread.v2`の部分がTeams会議チャットを特定するために必要なID（Conversation ID）となる。

このIDを切り出しエンコードを解除するために上記のフローでは組み込みの「作成」アクション内で以下のような式を順次実行している：

| ステップ名 | 式 |
|:-|:-|
| 作成 startIndex  | `add(indexOf(outputs('Teams_会議の作成')?['body/onlineMeeting/joinUrl'], '/19%3ameeting_'), 1)`  |
| 作成 endIndex  |  `add(indexOf(outputs('Teams_会議の作成')?['body/onlineMeeting/joinUrl'], '%40thread.v2/'), length('%40thread.v2'))` |
|  作成 encodedConversationIdLength | `sub(outputs('作成_endIndex'), outputs('作成_startIndex'))`  |
| 作成 encodedConversationId  | `substring(outputs('Teams_会議の作成')?['body/onlineMeeting/joinUrl'], outputs('作成_startIndex'), outputs('作成_encodedConversationIdLength'))`  |
| 作成 conversationId  | `replace(replace(outputs('作成_encodedConversationId'), '%3a', ':'), '%40', '@')` |

この切り出したIDを使用してチャットを特定しメッセージを投稿する：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/ce928ed0-e1d7-23a5-60a7-e6ee67361229.png)


:::note info
この例では「Teams会議の作成」アクションから地続きで（同じフローの中で）「チャットまたは～メッセージを投稿する」アクションを実行していますが、「Teams会議の作成」アクションの出力 `body/onlineMeeting/joinUrl` をどこかしらに保存できるのであれば、別フロー化も可能です。
:::

:::note info
この例では説明をしやすくするため、「Teams会議の作成」アクションの出力 `body/onlineMeeting/joinUrl` を加工する過程を step by step で組み込みの「作成」アクションで表現しています。実際には式の書き方次第でステップを少なくする（あるいはなくす）ことが可能です。
:::

ちなみに、ここでTeams会議出席者にメンションをすることも可能。
その場合は、以下のような流れになる：

1. Office 365 Outlookコネクターの「イベントの取得 (__V3__)」を利用し、イベント情報とともに出席者の情報も取得
1. 出席者の情報をもとにTeams for Businessコネクターの「ユーザーの @mention トークンを取得する」を利用してメンショントークンを作成（宛先が複数ある場合は 配列変数にトークンを格納）
1. トークンを「チャットまたは～メッセージを投稿する」アクションのメッセージ（Message）内で利用（宛先が複数ある場合は 配列化したものを `join()`関数などを利用して連結）

残念ながら「皆様」宛になる `@all` は利用できない。

:::note warn
Teams会議のチャットでメンション付きメッセージを送信しても、当該のTeams会議が開始されていないとメンションの相手に通知が送信されないことに注意。
ほかに宛先のTeamsユーザーが To（必須参加）か Cc（任意参加）か、承諾済みかそうでないかなども関わるかもしれない。しかし少なくとも会議が一度は開始されていることが必要。2023/12/20現在。
:::

:::note warn
Office 365 Outlookコネクターの「イベントの取得 (__V4__)」は単一のイベントではなく複数のイベントを取得するためのアクション。ここでは取得したいイベントは1つのため V3 を利用する。2つのアクションの機能はまったく違うのだが、英語→日本語への翻訳の問題か、バージョン表記の違いをもって区別するしかない。2023/12/20現在。
:::
敷かれたレールを辿るだけなんてガラケーチックじゃね〜？ - 就活せずにアメリカに行く - 

# はじめに
タイトルのインパクトに惹かれて、もしくはこのフレーズを聞いたことがあるな、
と思ってこの記事を読みに来てくださった方、ありがとうございます。
Life is Tech！Webデザインメンターのbabygirlです。

私からは「敷かれたレールを辿るだけなんてガラケーチックじゃね〜？」
ということで、IT、プログラミングとは全く関係なく
**敷かれたレールから外れる人生を楽しんでいる私**
が考えていることについてお話しします。

Life is Tech！の皆様は本当に優秀な方ばかりが集まっていて、
特にお仕事に対して志が高い方がたくさんいらっしゃるように思います。
そのような優秀な方々だからこそ、中には見落としてしまっている人もいるのでは、
と感じたことを書きました。
私の記事を読んで、少しでも皆さんに何か発見があればとても嬉しく思います。

# あなたの夢は何ですか？

ところで皆さんは小さい頃、どんなことをしてみたかったですか？
少し考えてみて下さい。

私はペットショップの店員さんになってみたかったり、
ファッションデザイナーになってみたかったり、

#### *どれも本気でなりたいと思っていたわけではないけれど、「どれにでもなってみたい」と気軽に言うことができていたのではないでしょうか？*

では、皆さんはこれからどんなことをしてみたいですか？
留学に行ってみたかったり、オーロラを見てみたかったり。
自分のキャリアのことが良ければそれでもいいですが、
ただ単に、車のサイズくらいのケーキが食べてみたいと言ったような
些細なことでも、何でもいいです。
お金のことは一旦考えずに自由に考えて、書き出してみて下さい。


![Screenshot 2023-12-21 at 2.59.11 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629872/784a924f-ba59-f94e-f122-33fc9008d33b.png)


私は大学1年生の頃に、このようにたくさん書き出して、
なぜやってみたいのかの理由も書き出しました。
例えば「フランス語を話せるようになってみたい」
→「フランス語の音がおしゃれだから」
といったようにあまり深くは考えずに書き出していたものもあれば
詳しく考えたものもあったのですが、とにかく書き出しました。

大学生になると「**シュウカツ**」を考え始めて、
「自分は一体何になりたいのだろうか」と
彷徨う時期が必ず訪れるのではないかと思います。

そうなると、「**シュウカツ**」以外にやってみたかったことについて
自然と夢を見て考える機会が減ってしまっているのではないかなと思います。

もちろん、起業したいと思っている人もいるかもしれないし、
将来的にこういったアプリを作りたいからここの企業に行きたい、
などお仕事に生きるモチベーションを持っている人もいると思うし、
その人はその人でとっても素敵なことだと思います。

しかし、私が伝えたかったのは、お仕事は人生の一部であって、
人生はお仕事の中の一部ではないと言うことです。

![work life balance (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629872/dd8e6dd8-9027-c857-4f2e-09dfb7756925.png)


決して働かなくてもいいじゃないかということを言いたいのではなく、
お仕事だけに囚われすぎていませんか？という事をお伝えしたいのです。


# 生きるためにはお金が必要だから働かないといけない

もちろん、自分のしたいことだけを全部できるなんてそんなに良い話はありません。
例えば私がインドでヨガ修行がしたくても、
インドに行くための航空券を買うだけのお金がなければ実現できません。

では、お金を頂くにはどうすれば良いのか？
私が最近読んでいた本の中に
#### *「お金を儲けるということは <ありがとう> を集めるということだ。」*
と書いてありました。
この <ありがとう>のもらい方は、人それぞれだと思います。

何かモノやサービスを販売して直接 <ありがとう> をもらったり、
企業で <ありがとう> をもらえる行動をして評価されることで、
結果 <ありがとう> をもらえたり。。。

いずれにせよ、常に 

*「どうしたら自分は <ありがとう> を届けることができるかな？」*

と考えていれば少しずつ <ありがとう> をもらうことが出来ます。

そんな都合の良い話でお金持ちになれるわけではないと思う人もいるでしょう。
もちろん、同じ1時間でも、ひとつ <ありがとう> をもらえる人もいれば
ふたつ、みっつ <ありがとう> をもらえる人もいるのは事実です。

だから、「どうしたらこの一時間のうちに <ありがとう> をたくさんもらえるかな」
と考えて、スキルを高めたりコミュニケーションの取り方を変えたりすれば
より効率的に <ありがとう> がもらえるでしょう。


# NO PAIN NO GAIN
お金の稼ぎ方はわかりました。
あとは自分のやりたいことに向けて行動を移すのみです。

もしあなたが自分の家庭などの
「自分が守らなければいけないもの」を持っていないとしたら。。。
**今挑戦して失うものはあなたが50代になって失うものに比べたら**
**レベルが格段に異なると思いませんか？**

もちろん、もう20代の頃のように自分のことだけを考えていればいい年ではないから
と言い訳をして、挑戦してはいけないというつもりは全くありません。
皆さんにとって今日が一番若い日なのですから。

# デジタルノマドになる21歳
私は旅をしながら生活がしたいです。
大学を卒業したあとは、アメリカに移住して
そして、家庭を持つまではもっと世界を旅してみたいです。

新卒で日本で就職するという一般的なレールから外れることは
もちろん不安になることもあります。

大学のキャリアセンターに相談すると、
フリーランスになった人の事例がないと言われ
焦って以前登録した就活サイトからは25卒向けのメールが届いて、、、。

だけど、NO PAIN, NO GAIN。
自分が今ワクワクすることを選択しなければ、
きっと後悔すると思うので
私はこの方向に進むことを決めました。

来年10月から1月の3ヶ月間、まだ移住ではありませんが
アメリカに少しだけ滞在してクリスマスを過ごす予定です。
来年のアドベントカレンダーには、
ぜひフリーランスとしての活動についてや
旅をしながら働いてみた感想などをシェアできるように
来年も最高の1年を過ごそうと思います。

# 最後に

ここまで読んでいただき、本当にありがとうございました。

社会経験もたいしてなく、まだまだ社会を理解していないただの大学生ですが
だからこそ、余計な不安や言い訳を考えずに
小学生の頃、純粋に「私はサッカー選手になりたい」と宣言いた時のように
思いのまま書くことが出来たのではないかと思います。

これから社会に出て、特に来年はフリーランスとして挑戦することで
私の夢は決して容易ではないことを身にしみて感じることになるとは思うのですが
今このワクワクした気持ちを忘れないようにしたいと思います。
エンジニアではない人事がエンジニア新卒採用で気を付けていること

この記事は [レコチョク Advent Calendar 2023](https://qiita.com/advent-calendar/2023/recochoku) の25日目の記事となります。

**はじめに**
--
メリークリスマス！
株式会社レコチョクでエンジニア新卒採用を担当している伊藤です。
まずは簡単な自己紹介を

歌うことが好きで「音楽でご飯を食べていけたらなー」なんて夢に思っておりましたが、当時付き合っていた彼女との未来を想像し「やっぱり働くか」と就活をはじめた男です。

・2014年に総合職新卒としてレコチョクに入社（無事そのまま2年目に結婚）
・6年間ほど [レコチョク](https://recochoku.jp/) 、[dミュージック](https://dmusic.docomo.ne.jp/) 、[dヒッツ](https://dhits.docomo.ne.jp/) 、[WIZY](https://wizy.jp/) などのサービス企画/運営/CRM施策を担当
・2020年から人事として総合職新卒採用を担当
・2021年から総合職とエンジニア両方の新卒採用を担当
・2022年からエンジニア新卒採用をメインに担当（いまココ）

見ていただいてわかるように、エンジニア職入社でもなく、エンジニアに関連する業務を担当していたわけでもありません。

本日は、そんな**私のような人事の方**であったり、**これからエンジニア新卒採用の担当**をやります。
といった方に向けて、私がエンジニア新卒採用で気を付けていることについて、少し書かせていただければと思います。

**結論**
--
エンジニア新卒採用で効果を出す為には、**エンジニア社員と一緒にやること**が大切です。

やはりエンジニアとしての経験がないと、勉強してもわからないこと、答えられない（上手く伝えられない）ことがあります。

なので、その場合には積極的に
・エンジニア社員に助けを求めています
・エンジニア社員に話を聞くようにしています

**現場社員を巻き込む**努力をすることで、結果的に**学生さんにとって効果的なコミュニケーション**をとれるようになり、自分自身の負担も分散することができています。

改めて、大切なのは**一緒にやる**ことです。
全てを丸投げするわけでもなく、エンジニア社員の意見を鵜呑みにするわけでもありません。

人事経験として培った
・学生さんや世の中のトレンド
・学生さんとのコミュニケーションノウハウ
・各掲載メディアなどの有効性や情報収集
などを掛け合わせて、共有と提案をしながら、役割分担をしていきます。

**なぜ人事だけだと難しいと感じたのか**
--
大きく下記2点です。

・**学生さんに対して魅力を伝えきれていない**
・**学生さんの技術力を正しく評価してあげられない**

やはり自分自身がエンジニアとして働いていたわけではないので「自社のエンジニアとして働くメリット」や「遣り甲斐、楽しさ」などは、人から聞いた言葉をただ伝えるだけになってしまい、想いまで伝えることができませんでした。

また、エントリーシートや面接では技術的な部分は見えにくく、正直判断できません。
「●●で■■技術を▲年間経験してきました」
「◆◆を開発しました」
この内容について質問しても、本当に技術力があるのか判断できませんでした。

**どのように改善したのか**
--
**相談して巻き込みます。**

会社説明会など直接学生さんと接点を設けられる機会では、**エンジニア社員にも同席をお願い**したり、説明会の進行自体もお願いしてしまったりして、より具体的で学生さんが「知りたい」と思われるような内容を伝えるようにしました。

他にも技術力の部分では、**選考フローの設計から巻き込み**を行いました。
結果としてプログラミングテストを導入し、**直接エンジニア社員にコードの中身まで確認**してもらうことで
・どのような点を気を付けて書いたのか
・どのような工夫をしたのか
などを学生さんに質問できるようにしました。

そうすることで、エントリーシートや面接では見えにくかった、**エンジニアとしての「技術力」を一緒に確認**できるようにしました。

**まとめ**
--
**新卒採用を人事だけでやらない、現場社員を巻き込む努力をする**。
ことが学生さんの為にもなるはずだし、気を付けていることです。

これを読んでいただいている人事の方で、エンジニア新卒採用に悩みがある方は、是非エンジニアの方に相談してみてください。
（これを読んでいただいているエンジニアの方は、是非人事の方の相談にのってあげてください！）

結果として「求めている人物像」も明確になっていき、入社した新卒が大活躍して、将来の自分を助けてくれる！

そんな未来がくることを願っております。

**最後に**
--
ここまで読んでいただきありがとうございました！

このような記事は今まで書いたことがなかったので、読みにくかったら申し訳ございません。
少しの暇つぶしとして楽しんでいただけたらと思います。

今回のAdvent Calendar 2023のような技術記事であったり、レコチョクの技術関連トピックについては、定期的に X（Twitter）[レコチョク《エンジニア広報》](https://twitter.com/reco_info_e)でも投稿しております。
ご興味ある方はフォローいただけますと幸いです。
（はじめたばかりなので、めっちゃ喜びます）

改めて [レコチョク Advent Calendar 2023](https://qiita.com/advent-calendar/2023/recochoku)をお楽しみいただき、ありがとうございました。

それでは、良いクリスマスを！

--
この記事はレコチョクのエンジニアブログの記事を転載したものとなります。 
 
https://techblog.recochoku.jp/10177
Home healthcare services in Carson City,Nv

Discover comprehensive hospice, home healthcare and medical staffing services in Carson City, Nv with Interim HealthCare. Personalized care for the comfort and health of your loved one.![Interim 2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658616/8d4b7fc3-81cc-deb1-0fd8-5cac6ada549d.jpeg)
Power Automateで現在地の天候情報を取得するフローの作成

## はじめに
MicrosoftのPower Automateを活用して、Microsoft Teamsに現在地の天候情報を表示させるフローを作成します。
今回はより短いアクションでのフロー作成を実施しました。

## 作業
PowerAutomateのサイトにアクセスし、[作成] -> [マイフロー] -> [インスタント クラウド フロー]を選択します。
![スクリーンショット 2023-12-20 3.32.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635301/de5c8955-91c3-822b-f65f-9a1a67956463.png)

<br>
次に、[フローを手動でトリガーする]を選択します。<br>
[フローを手動でトリガーする]を選択することによって、ボタンを押すと操作が実行されるトリガーが設定する事ができます。

![スクリーンショット 2023-12-21 13.52.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635301/40a287ed-1c00-c89f-ff52-27e3c132ccf4.png)
<br>
全体のアクションは以下の図の通りで、3つのアクションで実行可能です。
![スクリーンショット 2023-12-21 13.56.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635301/7df8aa44-8cbd-2e77-8fe8-32f1a899541b.png)
<br>

[現在の天気を取得する]と[チャットまたはチャネルでメッセージを投稿する]の設定は、以下の図のようにします。
黒く塗りつぶしてある部分は、teamsのメールアドレスを入力してください。
![スクリーンショット 2023-12-21 14.08.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635301/d826b5cf-a5de-1bf3-aa82-3565902c32fb.png)

## 実行結果
フローが完成したら、[テスト]を選択し、テスト実行を行います。
フローが正確に実行されるとteamsのチャットに実行された場所の天気の情報が送信されてきます。
![実行結果_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635301/9a63afeb-1437-807c-4ebd-2b9ec8e079b3.gif)

teamsに送信された結果。
![スクリーンショット 2023-12-21 16.03.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635301/92c7359e-e201-454e-b1e5-7f3df280e289.png)


実行が完了すると、実行した際のアクションでどのような処理が行われたのか、実行情報を確認することが可能です。
![実行結果_2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635301/c13f04a2-adcd-04e0-d696-e20e55f10329.gif)


## まとめ
今回は、より短いアクションで実行結果を表示させることに重点を置き作業を行いました。
今まではプログラミングなどで作業を行なっていましたが、ローコードでの開発を経験し、こんなにも簡単に作業を行う事ができることに感動しました。
Power Automateは、プログラミングの知識がなくても、視覚的なユーザーインターフェースを使用して自動化フローを構築できます。
サーバーの容量がいっぱいになって困った時に探す方法

ちょっと、サーバーが最近止まる案件が連続して起こったので、その時に使った方法を備忘録がわりに書いておきます。

## まずはサーバーが止まった原因を探す

これは、基本ですが、メモリが無くなるとかもあるので、サーバーの監視画面でその辺りを調べる必要がありますが、サーバーのHDが100%とかになっていた場合の解決方法です。

## サーバーのHDの使用量を見る

```
[root@ssec-jp ~]# df
ファイルシテム        1K-ブロック      使用   使用可 使用% マウント位置
devtmpfs           3902784        0  3902784    0% /dev
tmpfs              3941200       84  3941116    1% /dev/shm
tmpfs              3941200    16996  3924204    1% /run
tmpfs              3941200        0  3941200    0% /sys/fs/cgroup
/dev/sda2         30938360 30815932   122428  100% /
/dev/sda3           499432       16   499416    1% /boot/efi
/dev/sdb1         76829444  2097184 70783820    3% /mnt/resource
tmpfs               788240        0   788240    0% /run/user/1002
```

上記のコマンドで HD の使用量を知ることができます。/dev/sda2 が 100%になっていることが分かりますよね。こいつが原因か！ってなるわけです。

## 次にどのフォルダが占有しているのだ！？！
占有しているデータがどのフォルダに入っているのだろうかと言うことでそれを調べる必要があります。

```
[root@ssec-jp ~]# sudo du -h --max-depth=1 /
450M	/boot
84K	/dev
0	/proc
17M	/run
0	/sys
37M	/etc
104K	/root
5.3G	/var
2.6G	/usr
21G	/home
0	/media
2.1G	/mnt
183M	/opt
0	/srv
4.0K	/tmp
31G	/
```

上記のコマンドで、一階層でのフォルダごとの仕様状況を把握していきます。これで、一目瞭然で` home `フォルダ(21G)が原因だなとわかるわけです。そして、その下のフォルダを` / `の部分を次のステップとして`/home/`として同じ処理をしたら、その下の階層の一階層でのサイズの大きなフォルダを探してくれるので、それで解決できると言うことになります。
「現代数理統計学の基礎」演習問題解法メモ　第3章問10～11

そもそも自分のメモとして書き留めていたので、文字も大きく余白も多いため、ページ数が増えています。
それでも、自分のようになかなか解答を見ても途中経過がわからず苦労する方もいるかなと思いアップすることにした次第です。
![第3章問10　P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/d6e13308-92d5-4473-2d58-2c2bf00e2771.jpeg)
![第3章問10 P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/ef882db6-3a93-6a18-cf22-68b4ed31a6a2.jpeg)
![第3章問11　P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/f8752964-019f-b412-aa83-76c97b03c197.jpeg)
![第3章問11　P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/932a0ed5-d80c-329c-3516-375ff9ff2040.jpeg)
数式なし！ブロックチェーンSymbolで採用されている電子署名アルゴリズム「Ed25519」の１シート図解

![LP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658424/0c2224a4-7b7b-2f21-dc1b-e267e61ca39c.png)

:::note warn
本記事はZennから移行し、アドカレ向けに加筆しました。
:::
https://zenn.dev/baydot/articles/9c400af0839133

# はじめに
　本記事は読み易さ重視のため、数式や定量的な事は書いていません。さて、RSA暗号に関する情報は多いが、EdDSA Ed25519に関してはそうではなく、数式を伴った難しい説明が添えられ、全体像を掴むのに時間が掛かった。細かいことは置いておいて１枚に図解した。普及型のECDSAとの対比で説明する。
 
# ブロックチェーンごとの暗号方式
:::note warn
チェーンごとに署名アルゴリズムと曲線は違う。
:::

署名アルゴリズム
　Symbol：EdDSA(Ed25519)
　bitcoin：ECDSA
　Ethereum：ECDSA
 ・・・
曲線
　Symbol：Curve25519
　bitcoin：secp256k1
　Ethereum：secp256k1
 ・・・
参考：http://ethanfast.com/top-crypto.html

# EdDSAとEd25519の表記の使い分け
EdDSAはデジタル署名アルゴリズムの名称。
Ed25519は、特定のアルゴリズムと曲線(Curve25519)のセット。つまり、具体的な署名や検証に使用される際にはEd25519という名前が使われます。
※RFC 7748 RFC 8032 に記載されている。



# EdDSA(Ed25519)の特徴
- 高いセキュリティ
- 高速な署名生成および検証
- 鍵と署名が短い
:::note info
高いセキュリティをもちながらも、構造がシンプルなので署名生成/検証が高速。
鍵と署名データが短いので、利用する際のデータ転送やストレージコストが低い。
:::

# ECDSAとの関係
- ECDSA：標準的なセキュリティを提供し、広く採用されている。
- EdDSA(Ed25519)：ECDSAを改良しており、モダンな設計である。
総じて、どちらがよいとは一口には言えず、状況や要件に依存する。
:::note warn
既存のセキュリティ要件に合わせる場合はECDSAを使う事になるだろうし、一から設計する場合は、EdDSA(Ed25519)を使うべきである。
:::

# ECDSAからの主な改良ポイント
秘密情報を使用してメッセージを署名する際などに、内部乱数（ノンス）が必要。そのノンスの生成方法が改良されている。
ECDSAが擬似ランダム関数を使うのに対して、EdDSAは、**秘密情報とメッセージのハッシュ値を組み合わせて、ノンスの代わりに使用する**。これにより、ノンスが外部から予測されることがなくなる。

### 過去にこんなことがあった
> ECDSAを採用した国内ゲーム機では、擬似ランダム関数を固定化してしまい、解析されてしまったことがある。

→EdDSAであれば、そもそも外部（デバイス）の擬似ランダム関数を使わずに、メッセージと秘密情報・ハッシュ値に基づいて署名を生成しているので機密性が確保されている。

> 一般的に使われていた乱数アルゴリズムにバックドアが存在する疑惑が浮上した事があった。

→そこから「乱数を使わない」という考え広まり、その観点からもEdDSAが注目されている。

:::note warn
※EdDSAでもなんであっても、実装の仕方によって脆弱になってしまう。(当然)
:::

# こんな側面も
安全性に関してECDSAに劣る点はないが、
署名作成の際に、平文のハッシュ化を２回しているので、平文が長い場合にECDSAに比べて署名作成に時間がかかるという側面はある。検証時間に関しても平文の長さに影響を受けるがその場合でもECDSAより遅くなることはない。
※単独署名者の署名検証をバッチ処理できるメリットがある。
※「平文の長さ」に関して具体的な目安はわからなかった。

# ブロックチェーンSymbolではどこで活躍しているのか
**署名を扱うとき、つまりアカウント作成やトランザクション発行時に使われる。

# EdDSAの図解
署名アルゴリズムによって、楕円曲線の種類があり、またそれぞれに共通パラメータが用意されている。署名時に秘密鍵、パラメータ、メッセージを使い署名を作成。メッセージに署名を付加。検証時には秘密鍵ではなく、公開鍵の情報を合わせて検証する。メッセージは暗号化されておらず、検証側では、なりすまし/改竄がされているか？いないか？だけを確認する。

:::note info
オレンジ色<font color="orange">**■**</font>の「ランダム性確保」の箇所において、擬似乱数関数を使わず、秘密鍵と平文のハッシュ値を使っているのが改良ポイントのひとつ。
:::

![](https://storage.googleapis.com/zenn-user-upload/18aa5a9d353f-20230521.png)

# 最後に所感
後発のsymbolが、bitcoin、Etheriumより高度なアルゴリズムを採用出来るのは当然とも思えるが、新しいものを採用する事のリスクもあるので、よく検討されたのだと推測する。ECDSAからEdDSAに改修するのは大変そうに感じるがどう対応していくか興味がある。

# 参考サイト
参考：https://www.nic.ad.jp/ja/newsletter/No60/0640.html
参考：https://www.cryptrec.go.jp/exreport/cryptrec-ex-3002-2020.pdf
参考：https://portswigger.net/daily-swig/dozens-of-cryptography-libraries-vulnerable-to-private-key-theft
参考：Symbol解体新書
requestsモジュールを使用してSheet DBのAPIをCSVファイルに出力する

Sheet DBで作成したAPIをpandasではなくrequestsを使用してCSVファイルに出力するPythonコードを書いていきます。
# APIの作成
まず、Sheet DBで以下のようなAPIを作成します。
![Sheet DB API.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658533/ac861a11-5d0a-cc21-53a7-1e076ca0aa42.png)
今回はこれを利用したプログラムがメインなので、APIの作成方法は省略します。

# モジュールのインストール
今回はrequestsモジュールを使用するため、モジュールをターミナルでインストールします。
```
pip install requests
```

# 作成したPythonコード
APIをCSVファイルに出力するコードを書きます。
### 記述例
```python
import requests
import csv
import json

# APIのURL
url = "https://sheetdb.io/api/v1/endpoint"

# APIからデータを取得
response = requests.get(url)
data = response.json()

# CSVファイルに書き込み
with open('output.csv', 'w', newline='') as file:
    if data:
        # ヘッダーを書き込み
        writer = csv.DictWriter(file, fieldnames=data[0].keys())
        writer.writeheader()
        
        # データを書き込み
        for item in data:
            writer.writerow(item)
```

# 出力結果
上記コードを出力した結果、同じフォルダ内に'output.csv'というファイルが作成されます。
以下は、作成したCSVファイルの内容です。
![CSVアウトプットスクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658533/4d06ad1c-42dd-a92e-4a66-5cafa9edc365.png)
このように、APIの内容をCSVファイルとして出力することができました。

# まとめ
今回は簡単にAPIをCSVファイルにするプログラムを組んでみました。
こういった技術はそこそこ企業でも使用すると思われるため、試しにやってみるのも良いと思います。
このコードはrequestsを使用しているのですが、一般的にはpandasを使用しているためあまり必要ないかと思いますが、普段はしないrequestsモジュールの使い方をしているため、少し幅が広がったのではないでしょうか。

# 参考文献
https://dev.classmethod.jp/articles/json2csv_from_api_python_data_collection/

https://atmarkit.itmedia.co.jp/ait/articles/2209/27/news035.html
GCPの監査ログからOrganization全体のjob_idとクエリ文字列の対応表を作成する

BigQueryの `INFORMATION_SCHEMA.JOBS_XXX` 系のメタデータビューを使うとジョブに関する様々なデータを取得できます。
しかし、queryはJOBS_BY_PROJCETにしか存在しないので少々不便です。

https://cloud.google.com/bigquery/docs/information-schema-jobs

なので、監査ログからjob_idとquery相当の文字列を取得してみることにします。

queryやjob_idが格納されている場所がクエリの投げ方によって異なるので、可能性のある箇所を列挙してcoalesce関数に入れています。

```sql
    select
      coalesce(
        protopayload_auditlog.servicedata_v1_bigquery.jobInsertRequest.resource.jobName.jobId,
        protopayload_auditlog.servicedata_v1_bigquery.jobInsertResponse.resource.jobName.jobId,
        protopayload_auditlog.servicedata_v1_bigquery.jobQueryResponse.job.jobName.jobId,
        protopayload_auditlog.servicedata_v1_bigquery.jobGetQueryResultsResponse.job.jobName.jobId,
        protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobName.jobId
       ) as job_id,
      coalesce(
        protopayload_auditlog.servicedata_v1_bigquery.jobInsertRequest.resource.jobConfiguration.query.query,
        protopayload_auditlog.servicedata_v1_bigquery.jobInsertResponse.resource.jobConfiguration.query.query,
        protopayload_auditlog.servicedata_v1_bigquery.jobQueryResponse.job.jobConfiguration.query.query,
        protopayload_auditlog.servicedata_v1_bigquery.jobGetQueryResultsResponse.job.jobConfiguration.query.query,
        protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobConfiguration.query.query
      ) as query,
      timestamp,
    from <Data Access Audit log> where protopayload_auditlog.methodName in('jobservice.insert', 'jobservice.query', 'jobservice.getqueryresults', 'jobservice.jobcompleted')
```

あとは、 `INFORMATION_SCHEMA.JOBS_ORGANIZATION` にクエリを実行するときにjob_idを使ってJOINすればqueryを補うことができます。
【UiPath】ChatGPTと連携してみた

こんにちは。RPAエンジニアのRPAたろうです。
今日はUiPath × ChatGPTの記事を3つご紹介したいと思います。
　
　
### 初級編
***
# [【UiPath】Integration Service のOpenAIコネクタを利用して、ChatGPTに質問を投げるロボットを作成してみた](https://licensecounter.jp/engineer-voice/blog/articles/20230425_UiPath-IntegrationService-OpenAI-ChatGPT.html)
こちらの記事は、まずはIntegration Serviceを使って、話題のOpenAI ChatGPTへプロンプトから入力した質問を自動で投げてくれるロボットを作ってみよう！という入門編記事です。
順を追って、一緒にロボットを作成することができます。

# [【UiPath】UiPath Apps を使用して、Azure OpenAIへ質問を投げるロボットを画面から動かしてみた](https://licensecounter.jp/engineer-voice/blog/articles/20231130_UiPath_Apps_AzureOpenAI.html)
続いてこちらの記事は、１つめの記事の応用編となります。
今度はAzure OpenAIのChatGPTを用いて（もちろんOpenAIの方でも作成することができます）、
UiPath Appsで作成した画面から入力を受け付けた質問をChatGPTへ投げ、
返ってきた答えを画面に表示させる、というUiPath AppsとChatGPTを組み合わせた作ってみた記事になります。
　
　　
### 中級編
***
# [【UiPath】ChatGPTを利用したニュース要約ロボットの作成](https://licensecounter.jp/engineer-voice/blog/articles/20230523_UiPath-ChatGPT-NewsSummary-Robot.html)
続いて紹介するのは、さらにChatGPTを活用したロボットをUiPathで作る方法を紹介している記事になります。

> 【フロー概要】
> ①Googleニュース検索を行い新着ニュースのタイトルとURL一覧を取得
> ②ニュースを開いて記事本文を抽出
> ③ChatGPTで記事を要約
> ④Excelファイルに記事タイトルや要約結果を記録
> ⑤メールで結果を通知

上記フローを持つロボットを作成する手順を詳しくご紹介しています。
実際に業務として応用が利くロボットになっていますので、ぜひ触って作ってみてください。



以上、３つのUiPath × ChatGPT で実際にロボットの作成手順を詳しく記載している記事のご紹介でした。


## おまけのご紹介
今回紹介した記事は、SB C&S株式会社が運営する
[**「EngineerVoice」**](https://licensecounter.jp/engineer-voice/)内にアップされています。
今後もAI/RPA関連の記事のみならず、色々な製品のご紹介記事をアップしていきますので、
ぜひお手すきの際にご覧ください。

[EngineerVoice内AI/RPA記事カテゴリはこちら](https://licensecounter.jp/engineer-voice/blog/category/ai-rpa/)

 　
　
それではまた。
個人的Webで使うファイルの種類/その3：音声

# はじめに

この記事は、Qiita Advent Calendar 21日目の記事です。
以下の記事より、すべての記事をご覧になれます。

https://qiita.com/0_terarin_0/items/0f367210e2465f7772c9

# 筆者について

- 現在高校２年生
- 水泳部マネージャー
- 生徒会長
- とある団体の代表

# 本編

## 音声形式一覧
|拡張子|種類|名称のもと|詳細|
|---|---|---|---|
|.wav|無圧縮|Riff waveform Audio Format|MicrosoftとIBMによって開発された方式です。音声は無圧縮のため非常に重たいファイルとなります。（参考元の文献によると、5分の音声で100[MB]もするだとか！)|
|.mp3|非可逆圧縮|MPEG-1 Audio Layer-3|1990年台に開発された音声フォーマット形式です。よく利用されている形式で、iPodやウォークマンなど携帯音楽再生機荷保存されているのに利用されています。比較的軽めのデータ量となっています。|
|.ogg|非可逆圧縮|Ogg Vorbis|MP3がライセンス料が必要だったのに対して、Xiph.orgが開発したオープンソースの音声ファイル形式となっています。どちらかとゲーム用の音源に利用されていることが多いようです。|
|.gsm|非可逆圧縮|Global System for Mobile Audio Format Files|欧州電気通信標準化機構 (ETSI) によって開発された、2Gネットワーク用に作られた音声ファイル形式です。現在では電話での会話や音声メッセージの録音を保存するために使用されています。|
|.flac|可逆圧縮|Free Lossless Audio Code|oggを開発したXiph.orgが2000年代に開発したオープンソースかつロスレスの音声形式です。通常よりも少ないデータ量を利用する音声フォーマット形式で、Sony製品に利用されることも多いんだとか。|
|.aiff|無圧縮|Audio Interchange File Format|Appleによって90年台に開発された音声フォーマット形式です。無圧縮のためデータ量は大きくなりますが、高音質のまま音声を保存することができます。|
|.wma|非可逆圧縮方式|Windows Media Audio 9|Microsoftが作成したWindows向けの音声フォーマット形式です。Web経由の音声配信に利用されることが多く、さまざまなメタデータを含むこともできます。|
|.aac|非可逆圧縮方式|Advanced Audio Coding|MP3の後継音声フォーマット形式として開発されたものになります。より広範囲の音声の記録する分データ容量は大きくなる傾向がありますが、その分高品質の音声を記録することができます。|
|.alac|可逆圧縮|Apple Lossless Audio Codec |Appleによって開発された音声フォーマット形式で、FLACよりも高い圧縮率を誇ります。AACやMP3よりもより良質な音声を聴くことができ、Windowsでも利用することができます。|

引用元一覧は以下の通りです。

https://note.com/masatsumu/n/n4547afb9ff4b

https://www.justsystems.com/jp/beatjam/whats/mp3.html

https://tokusengai.com/_ct/17402798

https://soundengine.jp/wordpress/tips/glossary/454/

https://docs.fileformat.com/ja/audio/gsm/

https://docs.fileformat.com/ja/audio/flac/

https://docs.fileformat.com/ja/audio/aiff/

https://docs.fileformat.com/ja/audio/wma/

https://docs.fileformat.com/ja/audio/aac/

https://docs.fileformat.com/ja/audio/aac/

https://docs.fileformat.com/ja/audio/alac/

## 各変換方法

各種変換には動画の時と同じようにFFmpegを使うことをお勧めします。以下のように利用するだけです。

```zsh:shell
ffmpeg -i input.webm output.mp4
```

なお、同じく詳細は以下のサイトをご覧ください。

https://developers.play.jp/entry/2023/08/18/155602

ちなみに、インストール方法などは以下の通りです。Macの方はHomebrewでインストールすることができます。

```zsh:shell
brew install ffmpeg
```

https://ffmpeg.org/

# 最後に

本日は音声形式に触れてみました。僕個人としてはそもそもWebで音声を公開するということが非常に少ないためあまりこのことについてはわからにのですが、実際は何が利用されるのでしょうか？ということで、今後のアドカレ 23 の記事をお楽しみにしてください。

https://qiita.com/0_terarin_0/items/0f367210e2465f7772c9
ペアプロ・ペアワークで安心して働けている新人の話

## はじめに
　こんにちは。2023年度から東京のどこかでエンジニアをしているものです。今年の7月に部署に配属されてから、先輩方のフォローのもと、ペアプロ・ペアワークを業務に積極的に取り入れて働いています。
　この記事では、新人の私が感じたペアプロ・ペアワークによるメリットについて「安心」を主に記述します。「安心」にフォーカスしていますが、その他に感じたメリットやデメリットなんかも記述しておきます。

## この記事に記述しないこと
　記述しない点を以下に明記しておきます。
- ペアプロ・ペアワークの概要、説明
- 具体的なペアプロ・ペアワークのやり方

## メリット
**1. 安心できる**
　タイトルにもあるよう、一番はこれです。安心できるというのは、非常に重要だと思います。発言やリアクションにハードルが存在せず、自然にできるかどうかは業務に影響します。これは、本人の性格や能力にも依存しますが、安心して発言できる環境であるか、にもとても依存すると思います。
 　私が所属している部署は、リモートワークが中心です。そのため、オフィスワークと比較し、コミュニケーションを取る機会は少ないです。無駄な打ち合わせもあまり増えないようにしていただいている部署で、集中して作業できる時間が十分にあります。しかしこうなってくると、新人の私にとってはコミュニケーションの機会が少なく、皆さんの人となりがあまり見えない状況で不安な気持ちで働くことになります（配属当初にチームビルディングや懇親会を開催してもらったりはしているので、かなり不安は取り除いてもらっている方だとは思います）。
 　この働き方で、ペアプロやペアワークは非常に有効的です。ペアプロ・ペアワークを通して皆さんとコミュニケーションを取りながら業務に取り組めると、人となりが見えてきて、打ち解けていきます。こうなると不安もなくなり、安心して日々の業務に取り組むことができます。この安心は、何か仕事でチャレンジする発言をする時などに私の背中を押してくれる要因の1つになっています。

**2. 細かなtipsが日常的に交換できる**
　言わずもがなだと思います。会話をしながら、時に画面を見せながら作業を行うので、お互いに持っていない知識が共有されていきます。新人ながらも、私の知っている知識を共有できる機会もあります。（少しながらでも貢献できると非常に嬉しい気持ちになります。）

**3. 作業の手戻りを少なくできる** 
　業務の過程を見て議論することができるため、作業の手戻りを少なくできます。視野や思考法が広がっていくため、今後1人で作業する時にも大きなメリットをもたらします。この点については、私が学びを得ているケースばかりです。私からも知見を提供できるようになりたい…

 ## デメリット
**1. その場/その時の単位時間当たりの業務効率が下がる**
　2人で同じ業務に取り組むため、その場では効率が下がることもあります。しかし、上記のメリットが得られることを考えれば、(特に、メリットの2、3 ）あまりデメリットとは感じません。

## おわりに
　この記事では、主に新人の観点でペアプロ・ペアワークがもたらすメリット/デメリットを記述しました。最近ふと、今の部署で安心して働けている理由はなんだろうと思い、思いついた理由について書いてみました。将来の自分や誰かにとって少しでも役に立つものになれば嬉しいです。

## 雑記
　大学を卒業して論文を書く機会が無くなり、外に文章を出さなくなりました。なんだか寂しいので、たまに記事を投稿していこうと思います。
（今回は初めての投稿なので、投稿することに意義がある！と思こみ勢いで投稿しました。色々経験しているはずなのに、ありきたりなことを書いてしまったかもしれないです。今後は、TS/React/Azure辺りの知見を深めて、技術的な投稿をたくさんしていきたい…）
Discordの危険人物検索サイトができたらしい！APIも使える！？

こんにちは。今回は、Discordの危険人物サイトについての記事をわかりやすく紹介します。

<h2>Discordとは</h2>
まず最初に、Discordはオンラインでコミュニケーションや交流をするためのプラットフォームです。もともとはゲーマーのために作られましたが、現在では様々な目的で広く利用されています。

Discordでは、テキストチャットや音声通話、ビデオ通話などさまざまな手段でコミュニケーションが取れます。グループやコミュニティはサーバーと呼ばれ、異なるチャンネルでトピックごとに議論することができます。

<h2>危険人物検索サイトの開発元</h2>
危険人物検索サイトは「Starlight Project」というグループが開発しているようです。

<h2>危険人物検索サイトの仕組み</h2>
このサイトの仕組みはシンプルで、管理者や運営が危険人物の情報を追加しています。

<h2>危険人物検索サイトの紹介</h2>
2023年12月にスタートした危険人物検索サイトは、既に1000人以上の危険人物の情報を持っています。さらに、Starlight APIというものが開発され、これを使用したグローバルBAN BOTの開発も進行中です。特に大量の荒らしの幹部が登録されており、非常に有益なサービスと言えるでしょう。サイトへのリンクは<a href="https://xs295123.xsrv.jp/index.php">こちら</a>。

<h2>APIを使った危険人物検出BOT</h2>
Starlight APIの使い方を紹介します。<Br>
以下が危険人物（荒らし）がサーバーに入ってきたら自動でキックしてくれるBOTのサンプルコードです。<br>
discord.js v13を使用しています。

``` bot.js
const { Client, Intents } = require('discord.js');
const client = new Client({ 
  intents: [
    Intents.FLAGS.GUILDS,
    Intents.FLAGS.GUILD_MEMBERS
  ]
});

const token = 'TOKENをここに挿入';

async function fetchDataFromAPI() {
  // 危険人物検索サイトのAPIを使用しています
  const apiUrl = 'https://discord-abuser.deno.dev/?feat=荒らし';
  const { default: fetch } = await import('node-fetch');
  const response = await fetch(apiUrl);
  const data = await response.json();
  return data.contents;
}

client.once('ready', () => {
  console.log('Bot is ready!');
});

client.on('guildMemberAdd', async (member) => {
  // 参加したメンバーのIDが外部APIのデータに含まれていればキック
  const apiData = await fetchDataFromAPI();
  if (apiData.some((userData) => userData.id === member.id)) {
    member.kick('荒らしユーザーの可能性あり')
      .then(() => console.log(`Kicked ${member.user.tag} (${member.id})`))
      .catch(console.error);
  }
});

client.login(token);

// Created by Zero using Starlight API

```
```const apiUrl = 'https://discord-abuser.deno.dev/?feat=荒らし';``` の荒らしの部分を「出会い厨」や「R18目的」などにすることでキックする対象ユーザーを変えることが出来ます。

<h2>最後に</h2>
荒らし行為が増える中で、このようなサービスが登場することは驚きです。開発者に感謝の意を示すとともに、記事はここまで。お読みいただきありがとうございました。
体育館の空き状況を監視した話

# 体育館の空き状況って？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166345/e9ac1681-b644-1a5d-344e-220dd495a069.png)

普段何かしらの社会人サークルに入っている人なら分かると思いますが、そうではない人にとってはなんのことかさっぱり分からないと思います。体育館はその体育館がある市に住んでいれば誰でも利用申請ができ、任意の日時の枠が空いていれば予約して利用することができます。申請のためには利用登録をする必要があり、各都道府県によってその方法は異なります。公共の体育館は誰でも利用することができるようになっているのです。

つまり、空き状況とは予約可能枠のことを指しています。

# どこで確認できるの？
全ての都道府県の事情を知らないので明言はできませんが、一般的には各公共の体育館の予約を束ねる専用のHPが存在し、利用者はHP経由で体育館を予約することができます。

例）　福岡市　[HPリンク](https://www3.11489.jp/fukuoka/user/Home)
![スクリーンショット 2023-12-21 13.12.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166345/8e0508b8-bbd1-ea8a-a15d-a2ef1e023be8.png)


# なぜ監視するのか？
体育館を利用したいと思っている人は実はたくさんいます。その大半が社会人です。体育館自体は朝から夜まで枠がありますが、社会人が利用するとなると少なくとも18時以降の利用がメインになります。ですのでその狭い枠を大勢が争って予約をしているのが現状です。また、予約がキャンセルになっても通知がくるようにはなっていませんので、予約が空いているかを確認しなければいけないという超ハードなことを皆さんやられています。本気で取りたい人の中には数分おきにサイトへアクセスして確認しています。


# 開発
ここからは開発について書いていきます。

## 開発環境

```
使用言語: Python
ライブラリ等: Selenium, Chromedriver, LineBotSDK
クラウド: AWS
フレームワーク: AWS Chalice
```

`AWS Chalice`はシンプルなサーバーレスアーキテクチャを実現するためのフレームワークです。手の込んだことをするには向いていませんが、シンプルなものであれば1分もあればAPIエンドポイントを作成することができるのでめっっっちゃおすすめです。

参考
[AWS Chalice](https://aws.github.io/chalice/)

## アーキテクチャ
今回は監視が目的なので、クローリングを`Lambda`で行い、その`Lambda`の定期実行を`CloudWatch Events`で実現しています。`AWS SSM Parameter Store`を使っている理由として、状態として前回の空き状況を保存していないと空いたかどうかを判別できないため、その情報を保持するのに利用しています。

最後に通知する内容を整理し、`LINE Messaging API`を利用して通知を飛ばすようにしています。
![architecture1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166345/e55e4dc7-c108-086d-e122-96082fd02313.png)


# 実際に運用してみて
以下が実際の`LINE`の画面です。空いた日時が通知されるのでそれを元にHPにアクセスして取りに行っています。予約を取るところまで自動化することはできるんですが、闇雲に予約してしまうと使わないところまで予約してしまいキャンセル料が取られてしまうので予約自体は手動で行っています。

![IMG_2724.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166345/34175395-0e8d-e116-3c1c-5dd6ae6b44a0.jpeg)

# 最後に
身近なペインを技術を使って解消するのは凄く楽しいしそれを実現する過程で得られる知見も多いと思うので皆さんも是非挑戦してみて欲しいです！
個人的Webで使うファイルの種類/その2：動画

# はじめに

この記事は、Qiita Advent Calendar 20日目の記事です。
以下の記事より、すべての記事をご覧になれます。

https://qiita.com/0_terarin_0/items/0f367210e2465f7772c9

# 筆者について

- 現在高校２年生
- 水泳部マネージャー
- 生徒会長
- とある団体の代表

# 本編

## 動画形式一覧

|拡張子|動画コーデック|音声コーデック|名称のもと|詳細|
|---|---|---|---|---|
|.webm|VP8/VP9/AV1|Vorbis/Opus|-|2010年代にGoogleによって開発されました。動画ファイルの容量をかなり減らすことができるため、Webでの利用に非常に向いています。最近ではiOSデバイス上のSafariでも再生されるようになったので、これからの時代にはもってこいの動画ファイルではないでしょうか。|
|.mov|H.261/H.263/MPEG-4/H.264/ 3GPP/3GPP2 /Pixlet/HEVC|MP3/AAC/Apple Lossless|-|主にApple製品で利用される動画コンテナの方式で、音声と動画ともにさまざまなコーデック形式をサポートしています。クロスプラットフォーム対応。|
|.mp4|MPEG-1/MPEG-2/MPEG-4 Visual (MPEG-4 Part 2)/ H.264/MPEG-4 AVC (MPEG-4 Part 10)/H.265 (H.265/HEVC)/AV1 etc...|AAC/HE-AAC/MP3/MP2/MP1/MPEG-4 ALS/TwinVQ/CELP/Opus etc...|MPEG-4 Part 14|2001年に国際標準化されたコンテナ形式です。様々なデバイス上での再生をサポートされており、現在では一番利用されているファイル形式です。色々なデバイス上でサポートされているため、一番利用率が高い形式となっています。|
|.wmv/.avi|WMV9|WMA9/MP3|Windows Media Video|1980年代にMicrosoftによって開発された動画コンテナ方式の名称で、音声コーデックのWMAとともに利用されます。主にWindowsで利用される動画形式。ストーリミングやDRMでの管理に向いている。なお、音声コーデックにWMA9を利用する場合は拡張子が```.wmv```となり、MP3を利用する場合は拡張子が```.avi```となります。|
|.flv, /f4v|Sorenson H.263 (FLV1) /On2 VP6 (FLV4)/Screen Video/H.264 or H.264|MP3/ADPCM/Linear PCM,/Nellymoser/Speex/AAC/HE-AAC/G.711 or AAC/HE-AAC/MP3|Flash Video|Adobeが開発した動画コンテナ方式です、FlushPlayer上で再生することができる方式でかつてはよく利用されていたが、Adobe Flush Playerのサポート停止により利用されることは少なくなりました。|

引用元一覧は以下の通りです。なお、参照できる元が少なすぎてWikipediaが多めなので、あくまで参考までにしてください。

https://www.webmproject.org/

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

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

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

https://atmarkit.itmedia.co.jp/aig/07wcr/flv.html

## 各変換方法

各種変換にはFFmpegを使うことをお勧めします。以下のように利用するだけです。

```zsh:shell
ffmpeg -i input.webm output.mp4
```

なお、同じく詳細は以下のサイトをご覧ください。

https://developers.play.jp/entry/2023/08/18/155602

ちなみに、インストール方法などは以下の通りです。Macの方はHomebrewでインストールすることができます。

```zsh:shell
brew install ffmpeg
```

https://ffmpeg.org/

# 最後に

本日は動画形式に触れてみました。僕自身は学校で動画を配布するときはできるだけネットワークに負担を減らすためにWebMを利用することが多いです。ということで、今後のアドカレ 23 の記事をお楽しみにしてください。

https://qiita.com/0_terarin_0/items/0f367210e2465f7772c9
AndroidのRecyclerViewについて概観を書く

# はじめに

授業課題でAndroid開発をしたときにRecyclerViewの使い方とかカスタマイズの仕方がよく分からないという人が多く、私もすぐに噛み砕いた説明をすることができなかったので記事にまとめます。

## 執筆時のツール・SDKのバージョン
Android Studio Flamingo | 2022.2.1 Patch 2
Android 13.0 API 33
AGP 8.0.2
Gradle Version 8.0

# RecyclerViewとは?

RecyclerViewは大量のデータセットや、リスト内のアイテムを簡単に作ったり消したりすることができる動的リストを実装するためのクラスです。

実装には、リスト全体を包括する`RecyclerView`とリストのレイアウトを変更する`LayoutManager`、リストアイテムの見た目や動作を定義する`ViewHolder`、配列などに格納されているデータを`ViewHolder`と関連付ける`Adapter`の計4つのクラスを利用する必要があります。
アプリに合わせたRecyclerViewを制作するために、開発者はそれぞれのクラスを継承したクラスを作りカスタマイズを行います。

# 実装手順
RecyclerViewを利用するにあたって必要な手順は以下の通りです。
1\. リストの外観を設計(一次元なリストなのか二次元なリストなのか、縦に伸びるリストなのか縦に伸びるリストなのかなど)
2\. アイテムのテンプレートとなる`ViewHolder`を継承したクラスを作り拡張
3\. `ViewHolder`とデータ配列(`ArrayList<E>`のような`List<E>`インターフェースを利用したもの)を結びつける`Adapter`を継承し拡張
4\.それぞれ拡張したクラスを`RecyclerView`に存在するメソッドを使って紐づけ

最低限、以上の４つは必ず行わなければいけません。
さらにリストをカスタマイズする場合は、`RecyclerView`の子クラスとなる`LayoutManager`や`ItemDecoration`を継承したクラスを利用し`RecyclerView`に紐づけましょう。
# 終わりに
ざっくりと
- RecyclerViewとはなんなのか
- 実装にあたりどんな手順を踏む必要があるのか

について書きました。
各手順でどのようにカスタマイズを行っていけばいいのかは次の記事以降に書いていきます。
【Rails】TailwindCSSでフラッシュメッセージを実装してみた

この記事は「[RUNTEQ Advent Calendar 2023](https://qiita.com/advent-calendar/2023)」の22日目に参加しています:christmas_tree: 
## はじめに
こんにちは、あっぴー(@super-appy)と申します。
プログラミングスクールに通ってRuby on Railsを学習しています。
初学者のため、内容に誤りや不足がある場合はコメント等いただけますと幸いです。
宜しくお願い致します。

## 記事の概要
現在、ポートフォリオとなるアプリを開発しています。
カリキュラムではBootstrapを使っていましたが、今回はTailwindCSSを使用しています。
TaillwindCSSでのフラッシュメッセージの実装についてまとめてみました。

### 完成イメージ
[![Image from Gyazo](https://i.gyazo.com/0c83c11508d3a8bab5870aff64a85746.gif)](https://gyazo.com/0c83c11508d3a8bab5870aff64a85746)
（Googleのアラートが入っていますが、ご容赦ください...）




## 環境
- Rails 7.0.8
- TailwindCSS 3.3.5

## 実装

### 1.　ヘルパーメソッドとして背景の色を指定する関数を定義
```ruby:app/helpers/application_helper.rb
module ApplicationHelper
  def flash_background_color(type)
    case type.to_sym
    when :notice then "bg-green-500"
    when :alert  then "bg-red-500"
    when :error  then "bg-yellow-500"
    else "bg-gray-500"
    end
  end
end
```
`to_sym`：文字列で受け取った`type`をシンボルの形に変換して条件分岐をしています。
お知らせは緑、警告は赤、エラーは黄色、そのほかはグレーを指定しました。
他のパターンが増えても簡単に追加できるのはTailwindCSSのメリットですね！

### ２. フラッシュメッセージのパーシャルファイルを用意する
```erb:app/views/layouts/_flash_messages.html.erb
<% flash.each do |message_type, message| %>
  <div class="<%= flash_background_color(message_type) %> px-4 py-2 rounded-md text-white mb-4">
    <%= message %>
  </div>
<% end %>
```
複数のフラッシュメッセージが出現することを想定し、パーシャルファイル内でフラッシュメッセージをループ処理します。
`<%= flash_background_color(message_type) %>` この部分にヘルパーメソッドの関数で指定した`bg-green-500`などが入ります。

### 3. メインのレイアウトファイルでパーシャルファイルを呼び出す
```erb:app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
    <head>
      <!-- 中略 -->
    </head>
    <body>
      <%= render 'layouts/flash_messages' %>
      <%= yield %>
    </body>
</html>
```

### 4. コントローラでの記述方法
```ruby:app/controllers/user_sessions_controller.rb
class UserSessionsController < ApplicationController
  def create
    @user = login(params[:email], params[:password])

    if @user
      redirect_to root_path, success: 'Login successful'
    else
      flash.now[:alert] = 'Login failed'
      render :new
    end
  end
end
```
記述方法はBootstrapと同じです！
ログイン機能の実装には[sorcery](https://github.com/Sorcery/sorcery)のgemを使っています。

### 完成！
今回は背景色を変えるだけのシンプルな実装でしたが、他にもいろいろなパターンがあるので気になる方はぜひそちらも試してみてください。

https://v1.tailwindcss.com/components/alerts


## ちなみに
フラッシュメッセージ**だけ**を実装するのであれば、Bootstrapの方が圧倒的に簡単です。
処理が成功したことのアラートは以下の通り。
```ruby
<div class="alert alert-success" role="alert">
  A simple success alert—check it out!
</div>
```

参考

https://getbootstrap.jp/docs/5.3/components/alerts/#icons


## 最後に
TailwindCSSを上手く使ってユーザーが快適に使えるアプリを作りたいです！
ご参考になれば幸いです。
pygameとNintendoSwitchコントローラーでエージェントを動かすメモ

# 背景
 コントローラーからの入力をもとにエージェントを動かすコードを作りたいと思い、Nintendo Switchコントローラーを使って、エージェントを動かすプログラムを作成してみました。

## 環境

- Ubuntu22.04
- python3.7.9

# 準備
## コントローラー
 今回は以下のコントローラーを使いました。joy-conでも接続は可能ですが、左右両方を接続する場合、Bluetoothのマルチペアリングが必要になるため一体型を使用することにしました。
 
https://www.amazon.co.jp/gp/product/B0CB5H8WCM/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&psc=1
 
## jstest-gtk のインストール
 コントローラーとの接続確認のため jstest-gtkをインストールします。
```
sudo apt install jstest-gtk
```
 コントローラーのホームボタンを数秒間押し続けたあと、青いランプが点滅するのを確認します。その後、PCの設定>Bluetooth より, "Pro Controller" を選択し接続します。

次にターミナルから、jstest-gtkを起動し接続確認をします。
```
jstest-gtk 
```
Joystick Preferences の”更新”を押し、コントローラーを選択します。
以下の画面で、コントローラーの入力にしたがって、動きがあれば接続完了です。

![Screenshot from 2023-12-21 13-42-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737512/8b553395-38c5-05a2-bf47-1ff2bfe02552.png)

## pygame
 コントローラーからの操作を受け取るために、今回はpygameを使用します。

```
pip install pygame
```

 # 実行
 
 結論として、以下のスクリプトを作成しました。
 ```control_agent.py
 import pygame
import sys

# Pygameの初期化
pygame.init()

# ゲームウィンドウのサイズ
width, height = 800, 600

# ボールの初期位置と速度
ball_x, ball_y = width // 2, height // 2
ball_speed = 5

# ボールのサイズ
ball_size = 20

# ゲームウィンドウの作成
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("Moving Ball Game")

# ジョイスティックの初期化
pygame.joystick.init()

# 利用可能なジョイスティックの数を取得
joystick_count = pygame.joystick.get_count()

if joystick_count == 0:
    print("ジョイスティックが見つかりません。")
    sys.exit()

# 0番のジョイスティックを取得
joystick = pygame.joystick.Joystick(0)
joystick.init()


# ゲームループ
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    
    # 左スティックの入力を取得
    ball_x += joystick.get_axis(0)
    ball_y += joystick.get_axis(1)

    # 右スティックの入力を取得
    ball_x += joystick.get_axis(2)
    ball_y += joystick.get_axis(3)

    # ボタンの入力を取得
    A_button = joystick.get_button(0) # Aボタン
    B_button = joystick.get_button(1) # Bボタン

    # Aボタンでボールが拡大
    if A_button:
        ball_size += 0.5

    # Bボタンでボールが縮小
    if B_button:
        ball_size -= 0.5

    # 画面外に出ないように制御
    ball_x = max(0, min(ball_x, width))
    ball_y = max(0, min(ball_y, height))

    ball_size = max(min(ball_size, 30.0) ,10.0)

    # 描画処理
    screen.fill((255, 255, 255))  # ゲームウィンドウを白で塗りつぶす
    pygame.draw.circle(screen, (0, 0, 255), (ball_x, ball_y), ball_size)  # 青いボールを描画

    # 画面更新
    pygame.display.flip()

    # フレームレートの制御
    pygame.time.Clock().tick(60)
 ```

 # 結果
 実行結果は下記になります。
<iframe width="560" height="315" src="https://www.youtube.com/embed/94RwVbJeRlQ?si=V60letc1O1XVwH9T" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
QlikSenseで、複数のファイルをループの処理で取り込む方法

# これは何か。
複数のファイルをまとめて取り込む時に毎回めっちゃ苦労するので、やり方をメモしておいたです。

# QlikSenseで複数のファイルを一気に取り込みたいとき
ふつうはワイルドカード(*)を使います。
```QlikSense:ワイルドカード使うときの書き方
LOAD
  	ID AS key_ID, 
 	Date(Date#(Text(日付), 'YYYYMMDD')) AS hiduke,
  	Today() AS kyou
FROM ['lib://ここにファイルパスを書いてください/*']
		(ooxml, embedded labels, table is sheet1);
```

ですが、条件を入れたいときとかに、全然うまくいかないことがあります。
そういう時は、Loop処理で取り込みましょう。

ちなみに、JOINとか別に要らなかったり、ファイル名自体が固定の場合は、下記をご参照ください。
[【Qliksense】フォルダにある複数のエクセルファイルをfor文で簡単に読み込む](https://qiita.com/waihaiwai/items/40e022774dd13c62e239)	


今回は、ファイル名はばらばらだけど、カラム名は（少なくとも抽出分は）共通の場合の処理になります。

```QlikSense:書き方

// フォルダのパスを設定
SET vFolderPath = 'lib://ここにファイルパスを書いてください/';

// ファイルのリストを取得
FileList:
LOAD
    FileName() as FileName
FROM [$(vFolderPath)*];

// ループ処理でファイルを取り込む
FOR i = 0 TO NoOfRows('FileList') - 1
    LET vFileName = Peek('FileName', $(i), 'FileList');

    //ファイルを読み込む処理。ここは、普段のLOADで書いてるのと同じかきかたでOK
    Data: //ここで名前を付けておくと、どんどんConcatenateされていってる。はず。
		LOAD
            //↓ここには好きなカラムをいれてくださいね
  			ID AS key_ID, 
 			Date(Date#(Text(日付), 'YYYYMMDD')) AS hiduke,
  			Today() AS kyou
		FROM [$(vFolderPath)$(vFileName)]


    // ここで必要に応じてデータの処理を行う
    // Dataテーブルに取り込まれたデータに対して行う

NEXT;
```

正直、BIツールはビジュアライズに能力を振ってるので、ゴリゴリとコードを書くものではないと思います。

こういう書き方はできますが、使わずに済むならそれに越したことはありません。
Load * FROMで済む処理を、わざわざこんな風にゴリゴリ書いてしまうと、再現性もないし、メンテナンスもたいへんです
ぜひ、データとして読み込む前に、前処理をしていただければと思います。

ただ、前処理をする、とかそういうことがわからない人たちに囲まれてしまった場合の誰かのお役に立っていれば、、、うれしいです。
開発環境のpumaでhttps接続をを有効にする

## はじめに
開発環境のpumaを自己署名証明書でhttps対応させます。任意のFQDNでアクセスし、証明書はブラウザ側で例外指定する想定です。

## 環境
* AlmaLinux 9.3
* Ruby 2.7.8
* Rails 6.1.4.7
* puma 5.5.2

## 自己署名証明書の作成
```
$ cd /path/to/app
$ mkdir -p config/ssl && pushd $_
$ openssl req -x509 \
              -newkey rsa:4096 \
              -keyout server.key \
              -out server.crt \
              -days 3650 \
              -noenc \
              -subj '/CN=dev.example.com' \
              -extensions san \
              -config <( \
                echo '[ req ]'; \
                echo 'distinguished_name=req'; \
                echo '[ san ]'; \
                echo 'subjectAltName=DNS.1:dev.example.com';)
$ chmod 400 server.*
$ popd
```
アプリの config/ssl ディレクトリに鍵とCertを生成しています。最近のブラウザはCNだけでなくExtensionsセクションのDNS情報もチェックするため、そちらも記載しています。

dev.example.comを任意のFQDNに置き換えてください。

## pumaの起動設定
```ruby:config/puma.rb
ssl_bind '0.0.0.0', '3443', {
  key: 'config/ssl/server.key',
  cert: 'config/ssl/server.crt',
  verify_mode: 'none'
}
```

## pumaの起動
```
$ bundle exec pumactl start
```

## 参考
* https://qiita.com/zaru/items/ccf328e87c768168134d