OmniAICreator/Qiita-1.07M huggingface dataset:
Rの%>%の恐ろしい挙動

# はじめに

こんにちは、事業会社でデータサイエンティストをやっている人です。

業務でも自分の研究でも基本的にはRを利用しています。

（もちろんSQLも書きますが）

この記事を書きました。

https://qiita.com/Gotoubun_taiwan/items/d958623d09100ea8095e

RはPythonとは違うプログラミング言語で、異なる開発方針を持っているため、PythonのユーザーはRの文法に違和感を感じるのは当たり前です。

このような記事を通じて、RとPythonのコミュニティの相互理解を促進できれば幸いです。

Python使いがキモいと思うRの挙動はまだ数えきれないほどあるので、また別の機会で紹介したいと思います。

では本題に入りましょう。

# 御指摘

記事の中で、@koguusさんから以下のコメントをいただきました。

https://qiita.com/Gotoubun_taiwan/items/d958623d09100ea8095e#comment-43d8d204acd5415fb4e7

別のコードになりますが

```r
> `%>%` <- magrittr::`%>%`
> pipe_before_return <- function(x){
     x %>%
         sin %>%
         return
     123456789
 }
> pipe_before_return(12)
[1] 123456789
```


あれ？sin関数の出力が123456789になっている、、、？

@koguusさんが指摘していただいたように、%>%の後にreturnをつなげても、結局一般的に我々が期待するreturnの「値を返却して関数の実行を終了させる」役割を果たしておらず、最後に実行された123456789が返却されてしまいました。

これはどういうことなのでしょうか？

# 思考回路

まずは、そもそも関数外でreturnを呼び出したらどうなるかを試しました：

```r
> return(12)
Error: no function to return from, jumping to top level
```

まあ、エラーは出ますね。

ではprefix形式で%>%の挙動を確認してみましょう：

```r
> `%>%`(12, return)
[1] 12
> `%>%`(19, return)
[1] 19
```

あれ？そのまま前の値が出ましたね。

しかも関数を定義していないのにエラーが出なかったんですね。

Rのreturnがおかしいのか、それとも%>%がおかしいのか？

あ、そういえばここでreturnに何か入れてみたらどうなるでしょう？

```r
> `%>%`(19, return(12))
[1] 19
```

お？

エラーがなかっただけでなく、12の値もなんか無視されていますね。

では今度は定義していない変数を入れましょう！

```r
> hahaidontevenexist
Error: object 'hahaidontevenexist' not found
> `%>%`(19, return(hahaidontevenexist))
[1] 19
```

あら。

これはそもそも%>%がreturnを評価していない可能性がありますね。

やはりソースコードを確認しましょう！

# 原因

https://github.com/cran/magrittr/blob/master/R/pipe.R

![Screen Shot 2023-09-26 at 18.57.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257087/71761350-c18d-2943-7b8b-ef46ad558f9a.png)

これだとわからないので、勇気を出してC言語の方に行きましょう。

https://github.com/cran/magrittr/blob/master/src/pipe.c

![Screen Shot 2023-09-26 at 18.58.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257087/1642759a-a373-0835-126f-3790d6924fbd.png)

あ！理由がわかりました！

「For compatibility, allow last expression to be return(). Substitute it with . to avoid an error.」

エラーを避けるために、裏でreturnを「.」に変換しました。だからreturnはそもそも実行されておらず、ただ単に最後に実行されただけで返却されたということです。

なるほど、前回の記事で紹介した恐ろしい関数：

```r
strange_function <- function(x){
  x %>%
    sum %>%
    return
}
```

を書き方を許容するため、裏で恐ろしいことをやっているんですね、、、

# 考察

個人的には、returnを裏で「.」に変えるやり方はあまり好きではありません。開発者がreturn関数が実行されたと思っているのに、裏では全く違うことが起きているというのは、場合によってはデバッグしにくいエラーにつながる可能性もあります。

これはまさに恐ろしい挙動です。

これに対して、base Rに実装された新しいパイプ「|>」が右側にreturn関数を入れることをそもそも禁止しています。

magrittrパッケージのパイプは他にも色々キモい挙動があります。

たとえばパイプの左側の変数を右側の関数の複数の引数に入れる機能なんですが：

```r
> 2 %>%
     rnorm(n = 5, mean = ., sd = .)
[1] 1.565627 2.426024 1.528327 3.819079 3.667789
```

この規模の関数だったら問題ないですが、引数が多い場合、2は一体どこまで使われているかがわかりにくくなるため、お勧めしません。

base Rのplaceholder「_」は右側の関数の中で一回だけ使える仕様になっています。複数回使いたいなら別の関数を作るべきだと個人的に思います。

# 結論

前回の記事でも述べたように、Rは後方互換性を重視する言語のため、過去の機能をあまり捨てない開発方針を取っています。

なので今後もmagrittrのパイプとbase Rのパイプが共存することになりますが、個人的にはmagrittrのパイプのキモい挙動からの教訓を学んだbase Rのパイプの利用を推奨します。
Excel-DNAで、アドインを作成しセットアップする

![20230922fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/f5f6e72f-62c0-f51d-3d7a-a9236623e30a.png)

https://ganges.pro/customer/blog/yuubinhelper/

を公開しました。
[Excel-DNA](https://excel-dna.net/)を利用しました。Excelアドインを慣れたC#で作成できるので、とてもいいです。VBAだと遅いですが.NETなので速いし、開発環境はVisual Studioを使えるし、素晴らしいです。

郵便番号から住所へ変換する本体のプログラムはさほど難しくはなかったのですが、[Excel-DNAのWiXInstaller](https://github.com/Excel-DNA/WiXInstaller)で作成するアドインセットアップに難儀した部分がありました。

## Microsoft Visual C++ Runtime Library エラー
:::note info
(2023-12-14追記) Excel-DNA Ver1.7以降から、下記現象は解決したようです。つまり、`<ExcelDnaUnpack>true</ExcelDnaUnpack>`で、分割する必要はありません。`.xllファイル`のみ配置すればOKです。
:::

![20230925fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/355b168f-ab4d-8905-8b1d-32a38afe50c7.png)

アドインをインストール後、Excelを起動した時に、`Microsoft Visual C++ Runtime Library
Assertion failed!`が、次の環境で発生しました。
Windows 10 Home(64bit), Excel 32bit

開発環境のPCでは問題ありません。


最新の、[Microsoft Visual C++ 再頒布可能パッケージ](https://learn.microsoft.com/ja-JP/cpp/windows/latest-supported-vc-redist?view=msvc-170)では解決できませんでした。

[.NET 6.0 add-in load failure](https://groups.google.com/g/exceldna/c/pzcQ6KMOn-4/m/Pr-WKBYPAwAJ)によれば、ProjectのPropertyGroupに次を設定すると良いです。

```c#
<ExcelDnaUnpack>true</ExcelDnaUnpack>
```

すると、
`bin\Release\net6.0-windows\publish`に

- ExcelDna.Integration.dll
- ExcelDna.Loader.dll
- ExcelDna.ManagedHost.dll

が配置されます。
これらを、アドインのフォルダに最初からセットアップ時に配置しておくことで、Visual C++ランタイムエラーを回避できました。

エラーになる理由は、Excel-DNAが作成するファイル(.xllファイルか？)を、Excel起動時・アドインをロードする時に解凍するのですが、それをアンチウイルスソフトが誤検知するからだそうです。
ですので、最初からファイルをばらばらにしておいてアドインのフォルダに配置しておけば良いようです。


## .NET 6.0で作成したアドインのセットアップ
:::note info
(2023-12-14追記) Excel-DNA Ver1.7以降から、`publishフォルダ`に作成された、`.xllファイル`のみ配置すればOKです。
:::

[Excel-DNAのWiXInstaller](https://github.com/Excel-DNA/WiXInstaller)のテンプレートで作成すると、アドインは、

`C:\Users\<ユーザー名>\AppData\Roaming\HOGE\FUGA`

に配置されます。
ただし、.NET 6のアドインの場合、.xllファイルを配置するだけでは起動しません。

- HOGE-AddIn64.dna
- ExcelDna.IntelliSense.dll


といったような幾つかのファイルも、アドインフォルダに配置する必要があります。
しかも、ファイルをレジストリに登録しつつインストールしないといけないようです。
WiX4の、`Product.wxs`ファイルで、例えば次のようにコードを追加します。

```C#
<Component Directory='AddinFolder' Guid='ここにGUIDを設定'>
   <RegistryValue Root="HKCU" Key="Software\!(loc.ProductManufacturer)\!(loc.ProductNameNoSpace)" Name="IntelliSense" Value="AddIns" KeyPath="yes" Type="string" />
   <File Source='..\FUGA\bin\Release\net6.0-windows\ExcelDna.IntelliSense.dll' />
</Component>
```

WiX4についてもある程度知識が必要になります。ですので、Windows インストーラーでインストールする必要が無いのでしたら、ユーザーに手動でアドインをインストールしてもらうなり、他の方法も良いでしょう。
参照：[Installing Your Add-in](https://excel-dna.net/docs/guides-basic/installing-your-add-in)

## ユニットテスト
私はまだ試していませんが、[Excel-DNA Testing Helper](https://github.com/Excel-DNA/Tutorials/tree/master/Testing)が利用できます。
通常の、xunitのプロジェクトでは、動きませんでした。


## 確認環境
- ExcelDna.AddIn 1.7.0-rc6
- ExcelDna.IntelliSense 1.7.0-rc6
Qiitaで記事を書いていきたいので、先にQiitaの記事の書き方を勉強する編

新卒２年目Androidエンジニアです。
最近(?)、株式会社DonutsのOrganizationができました。
Qiitaで記事を書いていこう！のための準備編です。

## 経緯

![スクリーンショット 2023-09-26 0.13.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/721314/901814ba-3681-81a8-c282-507a6c53057b.png)

なにこれどうやってやるの…？
`Qiita 緑 背景` とか`Qiita チェックマーク`とかでググっても出てこない……

## TL;DR
公式のチートシートを見れば本記事を読まずともすべて理解ります。

https://qiita.com/Qiita/items/c686397e4a0f4f11683d

また、**「この記事のそれ、どうやってやるの！？」** と、私のようになったらまず`Markdown で本文を見る`機能を使いましょう。
![スクリーンショット 2023-09-26 13.26.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/721314/dba6aa99-571e-512d-00a0-886a64a8bc72.png)
大体解決します。

<!-- 早速この記事で実践してくれてBIG KANSHA!-->
<!-- ちなみに `TL;DR` は `Too Long, Didn't Read` の略で、要約とかを書くところらしいです。-->

## 基本のキ

は割愛します。GitHubのIssueを書くときに使う記法は大体できるので、
そこから更にQiitaを書く時に使えそうなテクニックを抜粋しました。

## コードブロック

よく使うのがコードブロックですね。
GitHubでもシンタックスの指定は出来ますが、Qiitaではタイトルの指定ができます。

~~~md:Qiita
```シンタックス:タイトル
本体
```
~~~

例えば、Kotlinのシンタックスハイライトで`hoge.kt`というファイル名の`HogeView`クラスを書きたい場合はこうなります。

~~~md:Qiita
```Kotlin:hoge.kt
class HogeView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyle: Int = 0,
) : ViewGroup(context, attrs, defStyle) {
    ...
}
```
~~~

実際にはこのように表示されます。

```kotlin:hoge.kt
class HogeView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyle: Int = 0,
) : ViewGroup(context, attrs, defStyle) {
    ...
}
```

使えるシンタックスについてはQiitaのエディタで候補を出してくれます（便利〜）
シンタックスハイライトが可能な言語については公式の記事をご確認ください。

http://qiita.com/Qiita/items/e84f5aad7757afce82ba

## 脚注

本文中でするほどではない用語説明や補足説明をするときなどによく使われます。
具体的な使い方はこう

```md:Qiita
**この文章に注釈をつけます。番号を押すと脚注に飛べます。**[^hoge]
[^hoge]: 注釈内容だよ。↩ を押すと元の文章に戻れます
```

そのまま使うとこんな感じになります。

**この文章に注釈をつけます。番号を押すと脚注に飛べます。**[^hoge]
[^hoge]: 注釈内容だよ。↩ を押すと元の文章に戻れます

[^fuga]: 注釈内容と脚注へのリンクは前後していても名前が同じであれば大丈夫です。呼び出した箇所が複数の場合、戻るボタンも複数つけてくれます

脚注は本文中のどこでもよく、自動でページの末尾にまとめてくれます。
数字は`[^1]`のように数字でつける必要はなく、登場順で番号を振ってくれます。[^fuga]
複数回呼び出してもOKです。[^fuga]


## 絵文字

絵文字、とてもよく使います。普段一番使うのは`:bow:`[^bow]です。
[^bow]: `:bow:`→:bow:。日々感謝と謝罪

Qiitaの場合もそこは変わらず、エディタで`:`から打ち始めると候補を出してくれます。:baby:


## Note

本日の一応のゴールになります。Note記法というそうです。
補足説明を目的とした機能になります。

３種類あり、それぞれ以下のように記述します。
(例文はQiita公式のチートシートからお借りしました。)


```md:info
:::note info
インフォメーション
infoは省略可能です。
:::
```
```md:warn
:::note warn
警告
○○に注意してください。
:::
```
```md:alert
:::note alert
より強い警告
○○しないでください。
:::
```

表示させるとこんな感じになります。

:::note info
インフォメーション
infoは省略可能です。
:::
:::note warn
警告
○○に注意してください。
:::
:::note alert
より強い警告
○○しないでください。
:::

すごい、本当に出来ました。効果的に使えば視覚的にわかりやすい記事にできそうですね。
ちなみにnote内でもある程度のmarkdown記法が使えます。

こういう使い方をたまに見ますね。

:::note info
**こんな人におすすめ**

- Androidアプリを作ってみたい人
- 新卒エンジニアとしての振る舞いに悩んでいる人
:::

ちなみにこれはこんな感じ

```md:Qiita
:::note info
**こんな人におすすめ**

- Androidアプリを作ってみたい人
- 新卒エンジニアとしての振る舞いに悩んでいる人
:::
```

## おわりに

Qiitaの記事を書くに際していいな！と思ったテクニックがあれば随時更新していこうと思います.
アウトプット、頑張ります！


## 参考

https://qiita.com/Qiita/items/c686397e4a0f4f11683d

https://help.qiita.com/ja/articles/qiita-show-raw-body
セキュリティ対策足りていますか？被害事例をご紹介

こんにちは。私は、2023年4月からエンジニアとして、IT業界に飛び込みました。

研修や現場で口酸っぱく言われてきたのが、セキュリティ対策の重要性です。
セキュリティ対策は完璧に出来ていますか？
今回は、2022年に起きたセキュリティ被害の事例をご紹介しますので、
セキュリティ対策の重要性について今一度見直してみましょう！

# ランサムウェアの感染事例
2022年2月、自動車部品メーカーがランサムウェア被害を受けたことをきっかけに、国内有数の大手自動車メーカーの創業停止にまで発展しました。ランサムウェアとは、簡単に言うと身代金を要求するコンピュータウイルスの一種です。
きっかけは、部品製造企業の子会社のリモート接続機器の脆弱性だったとのことです。
部品製造企業がランサムウェア被害により、操業ができなくなるため、部品の納品先である大手自動車メーカーの工場も創業停止の事態になりました。

大手企業を狙うのではなく、セキュリティ対策が手薄な企業を狙う手口です。

# 不注意や内部不正による情報漏えい事例
2022年6月に、ある自治体の外部委託企業が、自治体の全住民の個人情報が入ったUSBメモリを紛失する事故が起きました。
きっかけは、
作業者がデータ移管作業のためにデータをUSBメモリに記録→USBメモリを持ち出す→データ移管完了→飲酒→USBメモリが入った鞄ごと紛失
という流れだそうです。
また、USBメモリ紛失以外にも問題が続出しました。この作業者が外部委託先企業の再々委託先に所属しておりその再々委託先自体は市から未承諾であったり、未承諾の再々委託先企業の作業者が市の機密情報に容易にアクセスできる状態であったことなどです。
情報の取り扱いに関して数々の問題が露見したことで、市は市民からの信用低下を招きました。

# テレワークに関連する機器の脆弱性を利用した攻撃
コロナ禍により、テレワークで働く人が増えていますが、セキュリティ対策が万全でなかったことで、セキュリティ事故を起こしてしまっている事例もあるのをご存知でしょうか？

テレワークを行っていた従業員が、社用パソコンで社内ネットワークを経由せずにSNSに接続し、第三者から受け取ったファイルをダウンロードしたことで、社用パソコンがコンピューターウイルスに感染しました。
その後、従業員が出社し、ウイルス感染した社用パソコンを社内ネットワークに接続したことで、社内の他のパソコンにも感染が拡大したというものです。
流出した情報は、従業員の個人情報（氏名・メールアドレス）、サーバのログ、通信パケット、サーバ情報設定などです。
個人情報流出による企業に対する信頼性の低下を招きました。

# 最後に
ここまで読んでいただきありがとうございました。
小さな出来事が、莫大な損害を招くことを忘れてはいけないです。
今後も十分注意していきましょう。
社内SE、ラズパイ4を買う。パート1（購入編）

立派なITエンジニアもすなる Qiitaという物を社内SEもかいてみんとてするなり

* 記事の概要
社内SEがラズパイ4を買って勉強を始めるよ。
まずは「なぜ勉強するのか」「何をしたいのか」「何を買うのか」まで決めたところ。
Noteにも書いたけど、Qiitaのほうが多くのエンジニアに見てもらえると気づいたため清書している（今ここ）

* 筆者略歴
新卒で製造業の会社に入り、なんやかんやあって社内SEになって4年（ITエンジニア歴4年）
大学で情報系の授業はほぼなし（Cをちょろっとやったぐらい）

* 仕事内容
社内では非常に古いaccessで出来た生産管理システムを改修したり、DbSheetClientというマイナーなソフトで入力画面～DB～出力まで一気通貫で作成したり、ネットワークの設定をしたり、パソコンの購入管理をしたり、とにかくITの何でも屋。悪く言えば専門性が低い。

* なぜ勉強するのか？
    1. このままダラダラと生きていたらどこにも転職できない中途半端な能力しかない人間になりそうだったので、一念発起して勉強することにした。（本当に転職するかどうかは別にして、転職できる実力は身につけておきたい）
    2. 古い製造業の会社ということもあり、社内情シスの立場は現場より低い。その中でさらに若造の自分はまさにちいかわ（地位が低くて代わりがいくらでもいる人間）
現場の人間から「お前らみたいなパソコンが得意な人間なんていくらでも代わりがいる」とまで言われる始末。(パワハラだろ）
よって、これ以上立場が悪化する前に転職できる地力をつけておきたい。
    3. 基本情報技術者試験とセキュリティマネジメント試験には合格したが、実務でやるようなこともやりたくてラズパイに手を出した。

* スキルセット
ExcelVBA　accessVBA　SQL（クエリ、ビュー、ストアド）　DbSheetClient Powerhsell(追記）

* 買ったもの
当然、ラズパイは家に転がっているようなことはない。買わないと家にないのは当たり前ですね？

    1. 8GB Raspberry Pi 4
本体。4GBか8GBか悩んだけど大は小を兼ねるしどうせ4000円ぐらいしか違わないので。
https://www.amazon.co.jp/dp/B089GSG8Y1?tag=note0e2a-22&linkCode=ogi&th=1
    2. SDカード(64GB　U3)
当然ラズパイの記憶容量として必要。
https://www.amazon.co.jp/dp/B08BNFZ7BG?tag=note0e2a-22&linkCode=ogi&th=1&psc=1
    3. Raspberry Pi 4(Model B)用アルミヒートシンクケース
24時間つけっぱなしにするつもりなので、ファンレスである程度熱を冷やせることを前提として選んだ。
https://www.amazon.co.jp/dp/B086JY4NZJ?tag=note0e2a-22&linkCode=ogi&th=1&psc=1
    4. MicroHDMIケーブル to HDMIケーブル　1.8m
家にMicroHDMIケーブルがなかったので。
どうせエンジニアの9割はリモート操作するのだから、端子一個でいいのでHDMIであってほしかった。
https://www.amazon.co.jp/dp/B014I8U33I?tag=note0e2a-22&linkCode=ogi&th=1&psc=1
    5. Anker USB-C to USB-Cケーブル(1.8m)
給電用。なんでも3A5Vじゃないと動作が不安定になるらしいので、ちゃんとしたケーブルを購入。さらに環境にも良い。
自分が使っているメインPCに電源オフ時でも3A5Vで給電できるType-C端子があるので、そこから給電予定。
https://www.amazon.co.jp/dp/B0B391QLXX?tag=note0e2a-22&linkCode=ogi&th=1&psc=1
    6. USB3.0 MicroSD/SDカードリーダー
最初にSDカードにOSを焼く用。
https://www.amazon.co.jp/dp/B01H00CFUU?tag=note0e2a-22&linkCode=ogi&th=1

* Minisforumでいいのでは？
色々付属品まで買っていると2万円ぐらいしてしまったのだが、今時2万円も出せばラズパイ以上のCPUに、8GBメモリ＋128GBのSSDを積んだミニPCが買えてしまう。すごい。
https://store.minisforum.jp/collections/office-mini-pc/products/minisforum-un100-un305
正直、かなり悩んだ。これ買ってUbuntu入れてしまえばこっちのほうが圧勝しているのでは？とも思った。
ただ、Amazonのほうでレビューを見てみると、ファンの音がうるさいという内容が複数あった。
24時間つけっぱなしにするつもりなので、ファンの音がうるさいと困る（もちろん、私のような限界独身男性はワンルームに住んでおり、書斎と寝室が分かれているわけがないので、ファンの音は死活問題である）
よって、かなり悩んだが、ファンレスでラズパイを運用することとした。
（どうせそんな負荷がかかるようなことをするつもりもない）

* 最初に何をするか。
    1. ラズパイのOSを焼いて使えるようにする。
    2. メインPC(Windows10)からリモート操作できるようにする（今後の操作が楽になるため必須）
    3. メインPCから電源オフ状態で給電する設定をやる（DeepSleepオフ）
    4. メインPCをWake On Lanで起動する。
    5. 4.の後に、メインPCのバックアップを起動する。バックアップが終わったらメインPCをシャットダウンする。

とりあえずここまでやりたい。今、定期スケジュールでバックアップ組んでもその前にシャットダウンしてしまうし、だからといって24時間つけっぱなしは電気代もかさむし寝れなくなる(私のメインPCはファン音がうるさいしピカピカ光る、今時の自作ゲーミングPCなのだ）

とりあえず明日ラズパイが届くので、少しずつやっていき、備忘も兼ねて記事にしておこうと思う。
今日はここまで。
UdonSharpを書く準備

なんとなくUdon触ってみたい人向けに、これから色々書いていきます。

目次
１．プロジェクトの設定
２．ワールドの準備
３．動作確認

VCCバージョン2.1.3、Unityバージョン2019.4時の状況で解説してます。
VCCの大規模アプデやSDK3→SDK4とかにならない限り大して変わらないと思います。
大きな変更あったら書き直します。

# １．プロジェクトの設定

### 新規プロジェクトの場合

`Create New Project`を押したら、赤枠で囲っている`Worlds U#`を押しましょう。
プロジェクト作成と同時にU#に必要なものを入れてくれます。
![スクリーンショット 2023-09-25 115146_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884829/89768e60-e438-2098-d5ae-abac94a48e11.jpeg)

### 既存プロジェクトでU#を使いたい場合

プロジェクトの`Magnage Project`を開いて`UdonSharp`を探しましょう。
![ManageProjectButotn.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884829/eaac7a17-3d3c-ec7e-01b0-4f7ef46afe4e.jpeg)

一番右のアイコンが赤いマイナスになっていれば特にやることはありません。
プラスになっている場合はプラスを押して、UdonSharpをインストールしましょう。
![UdonSharpAddButton.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884829/4bfa6f84-9e16-b36c-48b0-41b0104a1f48.png)



# ２．ワールドの準備

### 地面の設置
プロジェクトを開いたら、まずヒエラルキーで`右クリック`→`3D Object`→`Plane`を選択して白い地面を置きましょう。
![Plane追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884829/6e84d19b-5a34-1a2d-ea5e-c86b4a95d8e5.png)

### Worldプレハブの設置
次に、Projectウィンドウで`VRCWorld`と検索して赤枠で囲っているプレハブを見つけます。
![VRCWorldPrefab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884829/4b701162-3a09-53de-85bb-98d18a5a8285.png)

:::note warn
`VRCWorld`が見つからない場合は、赤枠の上にある`Search:`をAllに設定してください。
ここがIn Assetsになっている場合は見つかりません。
:::

`VRCWorld`プレハブをワールドに設置しましょう。
このプレハブがプレイヤーのスポーン位置になっているので、さきほど設置したPlaneの上に置くのが良いです。
![スクリーンショット 2023-09-26 170111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884829/89e97f59-5994-af57-0ec1-0d271fdb80e2.png)


# ３．動作確認
画面上部にある再生ボタンを押してみましょう。
`Scene`には自分が動かしているプレイヤーが映っています。
`Game`にはプレイヤーの視点が映り、WASDで移動できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884829/3c6e075c-70e2-3284-492b-53810f398f3b.png)
この２つが確認できたら準備完了です！
`Escape`ボタンでメニューを開き、`Exit Playmode`で動作確認を終わりましょう。


# 他の記事
Udonの準備ができたら、コチラを読みながら実際にUdonに触れてみましょう。
細かい説明はしてないですが、なんとなく「あ～こういう事ができるのか～」と分かってもらえるかと思います。

https://qiita.com/sabamame_vrc/private/0252df9ca228743693c6


__これから書く予定__
・オブジェクトの表示/非表示を切り替える
・プレイヤーをテレポートさせる
・プレイヤーを吹っ飛ばす
・オブジェクトをプレイヤーに追従させる
【備忘録】Laravel Breezeを使用した、ログイン認証機能作成

# Laravel Breezeとは

Laravelのログイン認証機能の中で新しいものであり、JetStreamの簡易版なのでは？と言われるパッケージ。
特徴は、
・Blade,Vue,Reactをサポートし、APIバージョンもある
・オーバーヘッドを最小限にしたシンプルかつ、カスマイズ可能

# Laravel Breezeの機能

ログイン
登録
パスワードリセット
メール認証
編集可能なプロフィールページ

# Laravel Breezeのインストール

```
cd プロジェクト名
composer require laravel/breeze --dev
```

# Bladeファイルにスキャフォールド

スキャフォールドとは？
↪︎ Laravelのコントローラー、モデル、ビューを自動生成してくれるもの

```
// bladeファイルを指定
php artisan breeze:install blade

// 依存関係のインストール(yarn/npmどちらか)
yarn install
npm install

// マイグレーションを作成
php artisan migrate
```
※今回は、LaravelのテンプレートエンジンのBladeファイルを指定しています。（Vue,Reactにも対応可能）

上記を実行すると、
![スクリーンショット 2023-09-26 17.49.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/96ce6e19-782c-f0d1-06f3-432d37048e2c.png)
色々生成してくれています。

中身は、
・認証
・パスワードリセット
・メール認証を処理するルートやコントローラー、ビュー
が含まれているそうです。

# 実行して確認してみよう

![スクリーンショット 2023-09-26 17.52.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/1605bbf7-0fbb-80f7-f71e-fa84ba2a43bc.png)
ここに表示されていて、
![スクリーンショット 2023-09-26 17.53.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/d7d3e7b6-f789-e117-e194-a8235c751588.png)
![スクリーンショット 2023-09-26 17.54.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/00cc1008-f712-a0da-6d49-3506b4fe5579.png)
機能が出来上がっていました。
これすごい・・！

あとは、使用するオリジナルアプリに沿ってカスタマイズするだけとはびっくりしました😂

# 日本語ファイルの追加

画面上が英語表記になっているので、日本語化します。
現時点で、lang/内にはenディレクトリが存在します。
このlang/内に日本語ファイルを追加します。

```config/app.php
'timezone' => 'Asia/Tokyo',
'locale' => 'ja',
'fallback_locale' => 'ja',
'faker_locale' => 'ja_JP',
```
app.phpファイルの編集後、Laravel-langを使用。
```
composer require --dev laravel-lang/lang laravel-lang/publisher
```
```
php artisan lang:add ja
```
ファイルの追加後は、ライブラリ不要なので削除。
```
composer remove --dev laravel-lang/lang laravel-lang/publisher
```
ja.jsonの編集
```lang/ja.json
"Already registered?": "すでに登録済み",
"Email": "メールアドレス",
"Forgot your password?": "パスワードを忘れた方はこちら",
"Log in": "ログイン",
"Remember me": "ログイン状態を保持する",
```
これで、日本語化表記に変更になります。
【タスク管理アプリを作る】⑦UnitTestを追加。

UnitTestを追加しました。
Controllerの処理が正しく動いているかをチェックします。

UnitTestの作り方がまだ良く分かりません。
機能ごとにメソッド分けましたが、もっと細かく分けた方がいいのかどうか。

あまり業務で使ったことがないので、良い方法がないかWEB情報見てみます。

UnitTest知らない方に簡単に説明すると。
自分が作った処理が期待通り動くかどうか、
VisualStudioでチェックする機能があります。

①例えば、int Add(int a, int b)というメソッドをテストしたい場合、
期待動作としては、aとbの値の合計を戻り値として返すとなります。
テストのやり方は、UnitTest専用のプロジェクトを作成し、以下のようなコードを書きます。
```cs:UnitTest例
var result = Add(10, 5);
Assert.AreEqual(result, 15);
```

②VisualStudioのテストエクスプローラーでテスト実行します。
すると、Add(10, 5)の結果が正しくなければ赤●印が付いて、テストエラーになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545817/80b397c3-0324-fa8b-743b-cdb0b933d44b.png)

③これの何が良いかですが。
まず、単純にAddメソッドが仕様通りに動作する事が確認できます。
また、Addメソッドを間違って変更した場合にバグに気が付けます。
開発環境が大きくなるほど、結構効果があると思います。
ただ、作るのが面倒というのもあります。

以下はタスク管理に追加したUnitTestの一部です。
もっと分かり易いやり方があればいいのですが、これが普通なのでしょうか。

```cs:UnitTest1.cs
[TestMethod]
public void タスク追加()
{
    var model = new MasterModel();
    var controller = new MainController(model);

    var taskModelList = new List<TaskModel>()
    {
        new(new TaskID(1), "タスク①", "タスク①の説明", TaskType.Active),
        new(new TaskID(2), "タスク②", "タスク②の説明", TaskType.Deactive),
        new(new TaskID(3), "タスク③", "タスク③の説明", TaskType.Active),
        new(new TaskID(4), "タスク④", "タスク④の説明", TaskType.Deactive),
        new(new TaskID(5), "タスク⑤", "タスク⑤の説明", TaskType.Active),
    };

    // タスク追加
    taskModelList.ForEach(v => controller.AddTask(v));

    // 追加するタスク数が正しいこと
    Assert.AreEqual(model.TaskData.Count, taskModelList.Count);

    // 追加したタスクデータが正しいこと
    Assert.AreEqual(controller.GetTaskData(new TaskID(1)).Name, "タスク①");
    Assert.AreEqual(controller.GetTaskData(new TaskID(1)).Description, "タスク①の説明");
    Assert.AreEqual(controller.GetTaskData(new TaskID(1)).Type, TaskType.Active);
    Assert.AreEqual(controller.GetTaskData(new TaskID(4)).Type, TaskType.Deactive);
}
```

https://github.com/kunisan222/TaskManage1
見守り番犬システムの運用（TWE-LITEによる見守り③ドア開閉）

# １．はじめに
遠隔地に住む祖母の暮らしを見守るため、設置したセンサー情報をモニタする取り組みを行ってましたので、主として備忘のためにまとめます。

モノワイヤレス株式会社の[**「TWE-Lite（トワイライト）」**](https://mono-wireless.com/jp/products/twelite-pal/sense/openclose-pal.html)を使用して、親機である「RaspberryPi」からセンサ情報をスマホへ通知する仕組みです。

https://mono-wireless.com/jp/products/TWE-LITE/index.html

# ２．入退室機能
`元気に外出してるかな、遠くにいても気になる出入り`
　玄関ドアに設置した「磁気センサ（ドア開閉）」の情報から、自宅への出入りの状況を把握することができます。

→[**「トワイライトキュー（TWELITE CUE）」**](https://mono-wireless.com/jp/products/twelite-cue/index.html)を使用。

https://mono-wireless.com/jp/products/twelite-cue/index.html

扉に設置したトワイライトキューは「扉の開閉ステータス」を取得できるので、「ドアの戸締まり」や「外出確認」をすることが出来ます。
ドア側に付けたマグネットが、建物側に取り付けたセンサーから離れることによりステータスが変化します。
![30-1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2944244/3a70c47d-0bb0-74d7-16c7-29d5a01db846.jpeg)


# ３．実装
・**準備するもの**
<table>
  <thead>
    <tr>
      <th>区分　</th> <th>　　　　名前</th> <th>説明</th>
    </tr>
  </thead>
  <tr>
    <td> 親機 </td> <td>Raspberry Pi 4 Model B</td> <td>親機となって、センサー情報を記録・発信する本体</td>
  </tr>
  <tr>
    <td>  </td> <td> MONOSTICK </td> <td> センサー情報を受信するデバイス。<BR>「App_PAL」をインストールしておくこと </td>
  </tr>
  <tr>
    <td> 子機 </td> <td>トワイライトキュー（TWELITE CUE）</td> <td>磁気・加速度センサーを内蔵した無線装置。<BR>別途、コイン型電池（CR2032）が必要</td>
  </tr>
</table>

# ４． DBからグラフ画像を作成する
① MySQLへ「ドア開閉」のレコードを記録する。

> レコード追加については[「見守り番犬システムの運用（TWE-LITEによる見守り①寝起き動き）」](https://qiita.com/kiryuuyuudai/items/3cbde04f56e89229f8b3)の手順①②をご確認ください
> 

②「ドア開閉」が行われた日時を、グラフ上へ縦の破線で追加した
![30-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2944244/41e5a511-103b-3087-0055-786605df6ab9.png)

```python:#グラフ画像作成（ドア開閉追加）
#1.データ集計処理
import pymysql.cursors
connector = pymysql.connect(
    #ここに「データベース接続」の処理を書く#
)
YESTERDAY=datetime.date.today()+ datetime.timedelta(days = -1)
TOMORROW=datetime.date.today()+ datetime.timedelta(days = +1)
sql = "select DATE,DATA1 from DATA_TABLE where DATE>"+str(YESTERDAY)+" and DATE<"+str(TOMORROW)
cursor.execute(sql)
result = cursor.fetchall()

#2.グラフ出力処理
import matplotlib
import matplotlib.pyplot as plt
time_x=[]
temp_y=[]
fig, ax = plt.subplots()

for row in result:#ドア開閉のデータを破線でグラフに追加する
   plt.vlines(row[1], 0, 40, color='k', linestyles='dotted',linewidth=0.5,alpha=0.5)

fig.savefig("/home/グラフ画像保存フォルダ/datas.png")
```
# ５．考察
磁気センサーではドアの開け閉めは確認できても、部屋にいるのか・外出中なのかは分かりません。それでも朝のゴミ出しや定期的な通院等の外出が確認できるので便利ですが、思ったより使い方が難しいセンサーだなと感じました。
在室・外出状況のリアルタイムの把握のため、次の機能に繋げていきます。

# ●次回予告（見守り御守り）
 `お守りに内蔵したでんしのちから、ハイテクお守りで在室を確認`
　「加速度センサ」を内蔵したお守りを渡しておき、リアルタイムで部屋に居るか、外出中かを判定してお知らせすることができます。
→[**「トワイライトニコニコ（TWELITE 2525A）」**](https://mono-wireless.com/jp/products/TWE-Lite-2525A/index.html)を使用。
【UWP】図形の一部を背景色でくり抜いて表示する【Canvas + Path + GeometryGroup】

### Xamlのコード例

```xml
<Canvas Width="1200" Height="1200">
    <Path Fill="{ThemeResource SystemChromeGrayColor}">
        <Path.Data>
            <GeometryGroup FillRule="EvenOdd">
                <RectangleGeometry Rect="0, 0, 1200, 1200" />
                <RectangleGeometry Rect="200, 200, 500, 500" />
            </GeometryGroup>
        </Path.Data>
    </Path>
</Canvas>
```

### 解説

GeometryGroup の FillRule="EvenOdd" によってくり抜きが表現できます。FillRule のデフォルトは EvenOdd です。

ベン図における 排他的論理和 のように、２つの図形が重なっている部分がくり抜かれるように表示されます。


### 参考

FillRule の解説。WPFの記事ですがおそらく考え方は同じだろうと思います。

https://learn.microsoft.com/ja-jp/dotnet/desktop/wpf/graphics-multimedia/how-to-control-the-fill-of-a-composite-shape?view=netframeworkdesktop-4.8

画像切り取りのコミュニティ実装は Windows Community Toolkit の nuget から利用可能です。実装の参考にもなります。

https://learn.microsoft.com/en-us/windows/communitytoolkit/controls/imagecropper#syntax
リーダブルコードの実践



プログラムの可読性は、チームでの開発において非常に重要です。以下は、私の経験をもとにリーダブルコードのポイントを、具体的な例と共に解説します。

## 1. 明瞭な命名

### 変数や関数の命名
- *悪い例*：`image`
- *良い例*：`image_file_path`
- **理由**：`image`だけでは、画像データそのものか、そのパスか、その名前かが分かりにくい。具体的な名前にすることで意味が明確になる。

### ファイルの命名
- *悪い例*：`userprofile_name`
- *良い例*：`userprofile_path`
- **理由**：ファイルのパスを示す場合、`_name`よりも`_path`の方が適切。

### 関数名の工夫
- *悪い例*：`check_if_exists()`
- *良い例*：`is_object_exists()`
- **理由**：関数がブーリアンを返す場合、`is`を接頭辞にすることで直感的に理解しやすくなる。

## 2. コードの構造

### ネストの深さ：

- *悪い例*：

```python
if user_logged_in:
    if user_has_permission:
        # 実行する処理
```

- *良い例*：

```python
if not user_logged_in:
    return
if not user_has_permission:
    return
# 実行する処理
```

- **理由**：ネストが少ない方が読みやすい。

### データ構造の利用：

- *悪い例*：`person = ["Alice", 25, "Engineer"]`

- *良い例*：

```python
class Person:
    def __init__(self, name, age, job):
        self.name = name
        self.age = age
        self.job = job

person = Person("Alice", 25, "Engineer")
```

- **理由**：クラスを使用することで、属性ごとに名前を付けてデータを管理でき、可読性が高まる。

## 3. 関数の設計
### 関数の戻り値：

- *悪い例*：`get_data()`

- *良い例*：`get_user_profile_data()`

- **理由**：関数の名前から、どのようなデータを返すのかが明確になる。

### 関数の使用：

- *悪い例*：

```python
exists = check_object_exists(object)
if exists:
    # 処理
```
良い例：

```python
if check_object_exists(object):
    # 処理
```

- **理由**：コードがシンプルになり、何を評価しているかも分かりやすい。

## 4. システムの設計

### ディレクトリやパラメータの構造：

- *悪い例*：`/app/moduleA/code/files/userdata/...`

- *良い例*：'/app/user/data/...'

- **理由**：ディレクトリの構造をシンプルにすることで、ファイルの場所を探しやすくなる。

### 環境変数：

- *例*：Djangoを使用する場合、データベースの接続情報やAPIキーなどをsettings.pyに直接書くのではなく、環境変数から取得する。

- **理由**：環境ごとに設定を変更しやすく、セキュリティも向上する。

## 5. パフォーマンスと安全性

### 計算量：

- *注意点*：ループ処理の中で、外部APIの呼び出しやデータベースのクエリを大量に行わない。

- **理由**：計算量が増加し、システムのパフォーマンスが低下する可能性がある。

### リソースの利用：

- *良い例*：

```python
with open('file.txt', 'r') as f:
    data = f.read()
```
- **理由**：with構文を使用することで、ファイルやデータベースの接続などのリソースを確実に解放できる。

## 6. ドキュメント

### docstringの記述：

```python
def add(a, b):
    """
    二つの数値を加算する。
    :param a: 加算する数値1
    :param b: 加算する数値2
    :return: 加算結果
    """
    return a + b
```
- **理由**：docstringを記述することで、関数の目的や使用方法が一目で分かり、他の開発者が利用しやすくなる。

## まとめ

こうしてまとめてみると、どれも当たり前すぎて書くまでも無いと思える内容ですが、全て実際に注意を受けた部分です。一度に大量にコードを書いたり、癖であったりなど、要因はいくつか考えられますがプルリクエストを出す前に一度確認をすべきだと思いました。
【生成AIアプリのためのベクトル検索】 ⑧ 分類問題へのLLMの適用

# はじめに

## 背景 〜 ベクトルデータベースとしてのApache CassandraとDataStax Astra DB

2022年からの生成AIの隆盛に対して、[Apache Cassandra](https://cassandra.apache.org/_/index.html)に対して、[DataStax](https://www.datastax.com/jp)エンジニアにより[ベクトル検索機能の拡張提案](https://cwiki.apache.org/confluence/display/CASSANDRA/CEP-30%3A+Approximate+Nearest+Neighbor%28ANN%29+Vector+Search+via+Storage-Attached+Indexes)が提案され、DataStax社のCassandraマネージドサービスである[Astra DB](https://www.datastax.com/lp/astra-registration)で利用可能になっています。
本記事シリーズは、このような動向の一環として同社から発表されたホワイトペーパーの内容に基づきます。

## 出典と日本語版

このシリーズ記事の原典は、以下で入手可能です。

https://www.datastax.com/resources/whitepaper/vector-search-for-generative-ai-apps

ブログ記事では、忠実な訳出ではなく、読みやすさを重視して、一部省略しています。
省略のない日本語版のホワイトペーパーの入手を希望される方はinfo-jp@datastax.comまでご連絡いただければ、提供させていただきます。

# 【生成AIアプリのためのベクトル検索】⑧ 分類

分類問題には多くのユースケースがあります。テキスト解析における分類問題として、ドキュメントのトピック分類があります。例えば、ドキュメントの内容がスポーツ、政治、エンターテインメント等、どのジャンルに関するものであるかを判断します。
以下、LLM を使用した分類に対するいくつかの異なるアプローチと、それぞれのメリットとデメリットについて解説します。まずは、実装の面で最も簡単なものから始め、より複雑なアプローチへと進んでいきます。

## 分類のためのFew-shot学習
LLMは、Few-shot学習プロンプトを用いて、テキスト分類のためにそのまま使用できます。Few-shot学習のプロンプトでは、分類用のさまざまなラベルの例をLLMに提供します。
ポジティブな感情とネガティブな感情を分類する簡単な例を見てみましょう。ここでは、OpenAI プラットフォーム 上で、gpt-3.5-turboモデルを使用して、これがどのように可能になるかを例示します。
Few-shot学習の例を示すために、まず、プラットフォームが提供しているタスク定義機能の使用例を示します。

［システムプロンプト］
（ここで、文章を肯定的なものと否定的なものとに分類しています）
```
Document:
This movie was horrible.
Sentiment: 
Negative.
Document:
I loved the movie I saw this weekend, it was so exciting!
Sentiment:
Positive.
Document:
Worth every penny!  It was soooo good!
Sentiment:
Positive.
```

これで、ユーザー プロンプトから新しいドキュメントを提示し、LLM にそのドキュメントに内在するセンチメントを返すようにリクエストする準備が整いました。
［ユーザープロンプト］
```
Document:
I hated that movie, it was so boring.
Sentiment:
```

この場合、LLM からの応答は「Assistant: Negative」になります。
## 分類のためのLLMファインチューニング
ファインチューニングでは、モデルに大規模な入出力ペアを提供し、目的に合わせて、モデルに実行させたい内容をチューニングします。 LLM の動作をファインチューニングするには、通常、少なくとも数百以上のサンプルを提供する必要があります(一般に、このように大量のサンプルをFew-shot学習用のプロンプトから渡すことは、入力テキストサイズの制限や、トークンに掛かるコストの面から、現実的ではありません)。

以下では、Few -shotプロンプトでは役不足であり、ファインチューニングが必​​要となる場合について、考えます。例として、 特定の製品がテキスト内で議論されたかどうかをラベル付けする分類の問題を検討します。 Stripe社（金融サービスを提供するSaaS企業）は、Payments、Checkouts、Billingなどの製品を提供しています。ご覧の通り、製品名には一般名詞が使用されています。このような場合、LLMにとって、固有名詞としての製品名と、一般名詞としての会計用語とを区別することは難しいものになります。
ここで、「My stripe payments failed.」というフレーズを考えてみましょう。
ユーザーは、「Stripe Paymentsをセットアップしようとしたが、うまくいかなかった」と言っているのかもしれませんし、仔細に表現すると「Stripeからの請求書を支払おうとしたが、失敗した」という内容を伝えようとしていたのかもしれません。
この単純な例では、フレーズを「Stripe Payments」という製品に関する議論として分類すべきかどうかを判断することは困難に見えます。
対策として、文書内で Stripe paymentsという製品について説明しているまとまった量のサンプル（正事象）と、Stripe という単語の近くに「payments」という単語が出現しているが、製品の名称としてではなく会計用語として使用されている同規模のサンプル（反事象）からなる、十分な量のサンプルでLLMをファインチューニングすることが考えられます。これによって、LLMは、これら 2 つのケースを区別できるようになる可能性があります。

このアプローチには、以下のようなメリットとデメリットがあります。

 - メリット - 分類器の精度向上
 - デメリット - 少なくとも数百のトレーニングサンプルのセットを維持する必要性
 - デメリット - クラウドベンダーの提供するファインチューニングモデルは標準のLLMより高額
せんせー、ソーラーウィンドエネルギーってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、ソーラーウィンドエネルギーってなに？

# ソーラーウィンドエネルギーとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## ソーラーウィンドエネルギーって何？

みんな、太陽はとっても暖かくて明るいよね？太陽からは、光だけでなくて、風のようなものも飛んできているんだ。この風のようなものを「ソーラーウィンド」と言うんだ。そして、このソーラーウィンドからエネルギーを取ることができるんだよ。

## どういうこと？

太陽から飛んでくるソーラーウィンドは、とても速くて、小さな粒々がたくさん入っているんだ。この粒々は、特別な機械を使って、エネルギーに変えることができるんだよ。

## どうしてそれがすごいの？

地球にはたくさんのエネルギーが必要だよね。電気や車を動かすためには、エネルギーがいるんだ。ソーラーウィンドエネルギーは、新しいエネルギーの取り方で、宇宙の力を利用しているんだ。

## だから、ソーラーウィンドエネルギーってなに？

ソーラーウィンドエネルギーは、太陽から飛んでくる風のようなものを使って、エネルギーを作る方法なんだ。宇宙の力を使って、地球のために新しいエネルギーを作ることができるんだよ。

# まとめ

このように、ソーラーウィンドエネルギーは、太陽の風を利用して新しいエネルギーを作る方法なんだ。未来には、このエネルギーでたくさんのものを動かすかもしれないね。
RustのAxumのtimeoutの設定を知りたい

# はじめに

Rustのアプリケーションのタイムアウト時間を知りたく検索していて時間がかかったので簡素にまとめます

# デフォルトの時間

<h3>デフォルトで30秒</h3>です

以下のコードをみたことでわかりました

https://github.com/tokio-rs/axum/blob/main/axum/src/docs/error_handling.md

# おわりに

過去一少ない文字数の記事になり、投稿するか迷いましたが、
調べる時間がもったいないと思うので、誰かのためになっていればうれしいで

# 参考
https://github.com/tokio-rs/axum/blob/main/axum/src/docs/error_handling.md
せんせー、ペロブスカイト太陽電池ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、ペロブスカイト太陽電池ってなに？

# ペロブスカイト太陽電池とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## ペロブスカイト太陽電池って何？

みんな、太陽の光が大好きだよね？太陽の光を受けて電気を作る特別な板があるんだ。その板を使って作られる電池の一つが「ペロブスカイト太陽電池」というものなんだよ。

## どういうこと？

普通の太陽電池は、太陽の光を受ける板がとても高価で作るのも難しいことがあるんだ。でも、「ペロブスカイト」という特別な材料を使った太陽電池は、作りやすくて、お金もあまりかからないんだ。

## どうしてそれがすごいの？

ペロブスカイト太陽電池は、新しい技術で、とても効率的に太陽の光を電気に変えることができるんだ。そして、この電池は薄くて、色々な形に作れるから、色んなところで使えるんだよ。

## だから、ペロブスカイト太陽電池ってなに？

ペロブスカイト太陽電池は、太陽の光を電気に変える特別な板で、新しい技術を使っているんだ。この板は作りやすく、色々な形や大きさにできるから、たくさんの場所で使えるよ。

# まとめ
このように、ペロブスカイト太陽電池は新しい太陽電池の技術で、未来のエネルギーをもっと便利に、そして環境にやさしく使うための一つの方法なんだよ。
QuarkusでPostリクエストをするとボディが could not be converted to 'String' for REST Client interfacとなる

# はじめに

QuarkusでPOSTリクエストを送る実装をしてつまづいたのでまとめます
結果的にはQuarkus関係ないところも含まれています

# 問題

以下のように外部のAPIにPOSTリクエストを送る実装をしました

```kotlin:UserDriver.kt
    fun findUser(request: Map<String, Any?>): UserResultJson {
        val userIds = if (request["userIds"] === null) emptyList<String>() else request["userIds"] as List<String>
        return ObjectMapper().readValue<UserResultJson>(
            userClient.getUser(
              userIds,
            )
        )
    }
    
    

interface UserClient {
    @POST
    @Path("/users")
    fun findUser(
        @RestForm userIds: List<String>,
    ): String
}
```

しかし以下のエラーが発生しました

```
java.lang.IllegalStateException: A proper implementation of 'jakarta.ws.rs.ext.ParamConverter' needs to be returned by a 'jakarta.ws.rs.ext.ParamConverterProvider' that is registered with the client via the @RegisterProvider annotation on the REST Client interface.
```

なぜかデータをJSONにしようとしたときに失敗しているようです


# 解決方法

大きく2つの要因がありました

1. レスポンスのJSONがそのそも正しく設定できてなくてnullが返ってきてた
レスポンスとして受け取る想定のJSONの構造が正しくなっていなかったの直しました

2. @RestFormはいらない
インターフェースを以下に修正しました

```kotlin:UserDriver.kt
interface UserClient {
    @POST
    @Path("/user")
    @Consumes(jakarta.ws.rs.core.MediaType.APPLICATION_JSON)
    @Produces(jakarta.ws.rs.core.MediaType.APPLICATION_JSON)
    fun findUser(
        body: UserRequest,
    ): String
}[

data class UserRequest {
    @JsonProperty("userIds") val userIds: List<String>
}
```

`@RestForm`をつけていたのも問題でした
これはフォームデータを受け取るために使うアノテーションのようです

またdata classを使ってbodyを切り離しました

# おわりに

今回最も困ったのはJSONレスポンスを正しいと思ってしまっていて、Quarkusばかりを調べてしまったところでした
早めに気づいていればすんなりじっそうできたきがしまｓ
「リーダブルコード」を読んで

リーダブルコードを読んだので、印象に残ったポイントをまとめていきます。

# リーダブルコードって？

本書は「リーダブルコード―より良いコードを書くためのシンプルで実践的なテクニック」とタイトルにもあるように、コーディングをするうえで意識しておきたいポイントを学ぶ教科書のようなものです。
コーディングに関して学び始めたばかりのタイミングで一度目を通しておくべきとの記事を見かけたので、手に取ってみました。

https://www.amazon.co.jp/dp/4873115655/ref=as_sl_pc_as_ss_li_til?tag=sutabaopen-22&linkCode=w00&linkId=a36e0d8d544fc6c1ef5fa162e2f7ad4a&creativeASIN=4873115655

# 「理解しやすい」って？

コードを書くにあたって「理解しやすい」コードとはどのようなものを指すのでしょうか。
本書では、読みやすさについて以下のように定義しています。

> **鍵となる考え**
> コードは他の人が最短時間で理解できるように書かなければならない。

言われてみれば当たり前ではありますが、他の人が理解できるように書くには自分の思考を他者へ伝える努力が必要となり、初学者の場合はその表現に迷います。
そんな表現方法について、どういったことを意識したら良いのかが詳しく載っていました。

# 印象に残ったポイント

コーディングの改善方法について、以下のポイントを抑えて取り組みたいと思いました。

:::note info
印象に残ったポイント
* 短いコードを書くよりも理解しやすいコードを書く
* 誤解されない命名法
* コーディングの意図をコメントで残す
:::

それぞれ詳しく説明します。

## 短いコードを書くよりも理解しやすいコードを書く

問題を解決するにあたって、コードの解読に必要な文量は短い方が望ましいです。
1行で完結したコードと50行読まなければ処理の理解ができないコードでは、
まず1行で完結したコードの方が取り掛かる労力・理解するまでの時間共に少なく済みます。

しかしながら、必ずしも短い方が良いという訳でもありません。
同じ処理を扱うとしても、理解するまでの時間に差が生まれるようなコーディングの場合は、短いコードよりも理解しやすいコードの方が望ましいです。

## 誤解されない命名法

名付けについて、以下のように記述されています。

> 最善の名前とは、誤解されない名前である。
> つまり、君のコードを読んでいる人が、君の意図を正しく理解できるということだ。

多くのアドバイスがありましたが、個人的な抑えておきたいポイントは以下2点です。（もちろん他の項目も大切です。）

【個人的な抑えたいポイント】
1\. 汎用的な名前は避ける
2\. 名前に情報を追加する

内容について触れていきます。

### 汎用的な名前は避ける

`tmp`や`retval`などの汎用的な名前は避け、エンティティの値や目的を表した名前を使いましょうというお話です。
自分がよく使う名前だと`result`ですかね。これだけだと何の結果なのかわかりません。

`tmp`は「一時的な保管」という意味で使われることが多く、何度も書き換えられてしまうような変数に用いることは望ましくありません。
また、`retval`は「戻り値」を指しますが、それ以上の情報がありません。
変数の値を表すような名前を使うべきです。

汎用的な名前を使うこと自体が悪いわけではなく、使用する方が良いケースももちろんあります。
名付けの際には目的に沿った命名をすることが必要とされています。

### 名前に情報を追加する
```rb
let start = (new.Date()).getTime();
console.log(`開始時間は${start}秒`);
```
このコードは開始時間を読み上げてくれる変数`start`が用意されています。
しかしながら、`getTime()`で返す値はミリ秒であるため、開始時間は秒を返すはずだというこのコードは間違っていることになります。
このように単位で誤解を生みかねない変数に対しては、あらかじめ情報を追加しておくことが望ましいとされています。

### おまけ

かの名高きゲームクリエイター 桜井 政博氏（[桜井 政博 / Masahiro Sakurai](https://twitter.com/Sora_Sakurai)）も名付けに関して触れています。
「初めて見た人が、一目でわかるように」名前を決定することは、その後の保守を行う上でも大切なことだと分かりますね。

https://youtu.be/V40sMUAE5ek

## コーディングの意図をコメントで残す

コメントの目的は、以下のように記述されています。

> **鍵となる考え**
> コメントの目的は、書き手の意図を読み手に知らせることである。

ただ各コードの動作を説明するのではなく、読み手に理解してもらうために必要な情報を残したいという話です。
コードを書いていた時に「考えていたこと」を記録し、読み手へ伝えることが優れたコメントの残し方とされています。

# まとめ
リーダブルコードを読み、個人的に印象に残ったポイントを整理しました。
まだまだ経験が少なく共感できるような項目は少なかったですが、
経験を積んだうえで再度本書を読んでみたいと思います。
（~~全然呑み込めていない項目もありますので…~~）
エンジニアの世界：知られざる豆知識集

こんにちは、テクノロジー愛好者の皆さん！今日は、エンジニアリングの舞台裏で繰り広げられる、ちょっと変わった豆知識をご紹介します。これらの知識は、エンジニアの方々にとっては日常茶飯事かもしれませんが、一般の方には新鮮かもしれませんね。

バグの起源
「バグ」という言葉は、プログラムにエラーがあることを指しますが、この言葉の起源は実際の虫に関連しています。1945年、コンピュータの中で実際の虫（モス）が見つかり、それがシステムのトラブルの原因となっていました。これが「バグ」という言葉の始まりです。

コーヒーとコード
エンジニアにとって、コーヒーは欠かせない存在です。コーヒーは集中力を高め、長時間の作業をサポートしてくれます。実際、プログラミング言語の一つであるJavaは、開発者たちのコーヒー愛にちなんで名付けられました。

404 Not Found
Webサイトを訪れる際、ページが見つからないと「404 Not Found」というエラーメッセージが表示されますが、この404番号は、最初のインターネットサーバーが置かれていた部屋の番号（404号室）に由来しています。

キーボードのQWERTY配列
キーボードの最初の一列は「QWERTY」と並んでいますが、これはタイプライターが発明された当時、キーが詰まりにくくするための工夫から来ています。現代では、この配置は効率が悪いとされているため、Dvorak配列などの代替が提案されています。

Linuxのペンギン
オープンソースのオペレーティングシステムであるLinuxのマスコットはペンギンの「Tux」ですが、これはLinuxの創設者、リーナス・トーバルズがペンギンに噛まれた経験から来ています。

これらの豆知識は、エンジニアリングの面白さや奥深さを感じさせてくれますね。エンジニアの皆さん、これからも私たちの生活を豊かにするために、素晴らしいテクノロジーを創り出してください！

[ラブスク](https://love-sc.com/)	代表の[神河るい](https://love-sc.com/kamikawarui/)
API Gatewayとlambdaを使用してみる

## 目的
AWS Certified Developer - Associateの勉強をしている中で
理解が浅いサービスについて実際に使用してみます

今回はAPI GatewayとLambdaを使用して、リクエストを送れるまでをやってみます

## 手順
- Lambda関数の作成
- API Gatewayの設定

## Lambda関数の作成
**1. Lambdaのページに移動、左のメニューから関数を選択**
**2. 右上の関数の作成を選択**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1997750/f26b8a57-ac66-56fb-9ae7-e47d2e259681.png)

**3. 下の設定で作成（記載していないものはデフォルト設定です）**
関数の作成:一から作成
基本的な情報
関数名:test_lambda
ランタイム:Python


コードは作成時に用意されているサンプルをそのまま使用します

```
import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

```


## API Gatewayの設定

### APIの作成
**1. API Gatewayのページに移動、左のメニューからAPIを選択**
**2. 右上のAPIを作成を選択**

![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1997750/69703297-fc5a-deae-5c99-5b04961f9378.png)


**3. 下の設定で作成（記載していないものはデフォルト設定です）**
API タイプを選択:REST API
名前と説明
    API 名:test lambda API

### メソッドの作成
**1. 作成されたAPIを選択、左のメニューからリソースを選択**
**2. アクションからメソッドの作成を選択、GETで作成**

![image-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1997750/8259ba2b-76f2-b5c0-be16-14f6c877aa9d.png)

**3. 以下の内容でセットアップ**
Lambda関数の作成で作成した関数が見つからない場合、
Lambda関数の名前やリージョンが正しいことを再確認します

![image-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1997750/ea0e0acb-6f27-073a-8c54-e07b840e6455.png)


### テスト
**1. テストを選択**

![image-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1997750/7537dbc2-90f7-a3b1-eb92-f66d48a9fe77.png)


**2. 下のテストを選択し、レスポンス本文にLambdaの内容があることを確認**

![image-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1997750/52404ac1-8b88-0093-d1df-a25b16343dc7.png)
![image-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1997750/c35763a1-701b-76d3-7cfe-d457b26b3d45.png)

### IP制限
このままだと外部に公開した際に、誰からでもアクセスできる状態のため制限をします
今回はリソースポリシーでIPによる制限を試してみました


**1. 作成されたAPIを選択、左のメニューからリソースポリシーを選択**
**2. ポリシーを設定し、保存を選択**
今回は以下のサイトのサンプルを参考に設定します
https://repost.aws/ja/knowledge-center/api-gateway-resource-policy-access

sourceIpOrCIDRBlock部分を許可したいIPに変更します
例
> ["52.95.36.0/22", "15.230.39.196/31", "52.93.178.219/32"]

```
{
  "Version": "2012-10-17",
  "Statement": [{
      "Effect": "Allow",
      "Principal": "*",
      "Action": "execute-api:Invoke",
      "Resource": "execute-api:/*/*/*"
    },
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "execute-api:Invoke",
      "Resource": "execute-api:/*/*/*",
      "Condition": {
        "NotIpAddress": {
          "aws:SourceIp": ["sourceIpOrCIDRBlock", "sourceIpOrCIDRBlock"]
        }
      }
    }
  ]
}

```


### デプロイ
外部からアクセスできるようにするための作業です

**1. 作成されたAPIを選択、左のメニューからリソースを選択**
**2. アクションからAPIのデプロイを選択**

![image-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1997750/1b7fe157-dfd2-b5d9-8600-e7578a3be4d9.png)

**3. 下の設定でデプロイ**
デプロイされるステージ:[新しいステージ]
ステージ名:test

**4. URLの生成が行われる**
画面上あたりに生成されたURLが記載されています
デプロイ後にリソースポリシーを変更した場合、再度デプロイが必要なので注意が必要です

### アクセス確認
生成されたURLにアクセスし、うまく表示されていれば成功です

またIPによる制限がうまくいっている場合、
許可されていないIPからのアクセスは以下のようなメッセージが表示されます

`{"Message":"User: anonymous is not authorized ~省略~ with an explicit deny"}`
PythonプログラムでExcelドキュメントを作成する

Excelドキュメントは、Microsoftが開発した非常に便利なスプレッドシート形式であり、データの組織化、分析、管理に主に使用されます。このチュートリアルでは、Pythonコードを使用してExcelドキュメントを作成する方法を紹介します。以下の内容を参照してください。
## ツール
* Visual Studio Code
* [Spire.XLS for Python](https://www.e-iceblue.com/Introduce/xls-for-python.html)
このライブラリは、[Excel の読み取り](https://www.e-iceblue.com/Tutorials/Python/Spire.XLS-for-Python/Program-Guide/Document-Operation/Python-Create-Read-or-Update-Excel-Documents.html)、[Excel から PDF への変換](https://www.e-iceblue.com/Tutorials/Python/Spire.XLS-for-Python/Program-Guide/Conversion/Python-Convert-Excel-to-PDF.html)もサポートしています。
## インストール方法
* まず、[Python](https://www.python.org/downloads/) をダウンロードしてインストールします。
* VS Code で「Extensions」をクリックし、「Python」を検索してインストールします。
* 「Explorer」-「NO FOLRDER OPENED」-「Open Folder」をクリックします。
* 既存のフォルダーをワークスペースとして選択するか、新しいフォルダーを作成することもできます。
* そのフォルダーに「.py」 ファイルを追加し、任意の名前を付けます。
* 「Terminal」-「New Terminal」をクリックします。
* 次のコマンドを入力して、Spire.XLS for Python と plum-dispatch v1.7.4 をインストールします。
```python
pip install Spire.XLS-for-Python
pip install plum-dispatch==1.7.4
```
## コード：
```python
from spire.xls import *
from spire.common import *

#Workbookオブジェクトを作成する
wb = Workbook()

#デフォルトのワークシートを削除する
wb.Worksheets.Clear()

#ワークシートを追加する
sheet = wb.Worksheets.Add("test 1")

#A1からE1までのセルを結合する
sheet.Range["A1:E1"].Merge()

#A1にデータを書き込み、書式を適用する
sheet.Range["A1"].Text = "Test"
sheet.Range["A1"].HorizontalAlignment = HorizontalAlignType.Center
sheet.Range["A1"].VerticalAlignment = VerticalAlignType.Center
sheet.Range["A1"].Style.Font.IsBold = True
sheet.Range["A1"].Style.Font.Size = 13

#最初の行の行の高さを設定する
sheet.Rows[0].RowHeight =20 

#データを書き込む
sheet.Range["A2"].Text = "日付"
sheet.Range["B2"].Text = "氏名"
sheet.Range["C2"].Text = "年齢"
sheet.Range["D2"].Text = "住所"
sheet.Range["E2"].Text = "本籍"

sheet.Range["A3"].Text = "2023/9/26"
sheet.Range["B3"].Text = "A"
sheet.Range["C3"].Text = "25"
sheet.Range["D3"].Text = "東京都渋谷区渋谷1-2-3"
sheet.Range["E3"].Text = "東京都"

sheet.Range["A4"].Text = "2023/9/26"
sheet.Range["B4"].Text = "B"
sheet.Range["C4"].Text = "26"
sheet.Range["D4"].Text = "東京都渋谷区渋谷4-5-6"
sheet.Range["E4"].Text = "東京都"

#行の高さを設定する
sheet.Range["A2:E3"].RowHeight = 15

#列の幅を設定する
sheet.SetColumnWidth(4, 20)

#枠線のスタイルを設定する
sheet.Range["A2:E4"].BorderAround(LineStyleType.Medium)
sheet.Range["A2:E4"].BorderInside(LineStyleType.Thin)
sheet.Range["A2:E2"].BorderAround(LineStyleType.Medium)
sheet.Range["A2:E4"].Borders.KnownColor = ExcelColors.Black

#.xlsx ドキュメントとして保存する
wb.SaveToFile("output/CreateExcel.xlsx", FileFormat.Version2016)
```
上記のコードでは、Worksheet.Range.Text プロパティを通じてワークシート内のデータとコンテンツを設定できます。 最後に、Workbook.SaveToFile()メソッドを呼び出して、.xlsx ドキュメントとして保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/01153312-ea78-2c43-bff4-c340cc2f7773.png)
エクソーラ、日本のゲーム市場の成長にコミットし、東京ゲームショウ2023で日本市場での存在感をアピール

エクソーラは今年5月に日本法人を設立し、日本市場に正式参入しました。日本のゲーム市場は世界市場で重要な地位を占めており、ユーザー数は5,000万人で世界第3位の規模となっています。エクソーラは、今後の日本市場の潜在力に注目しています。
この戦略は、エクソーラのグローバルネットワークにとってメリットとなる地域パートナーシップを育むというエクソーラの取り組みが形になったものです。また、エクソーラが中国、韓国、マレーシアで確立した存在感を基として、アジアのゲーム業界を繁栄させるべく今後も尽力していくことを裏付けるものでもあります。
| ![Jin Jeong_Headshot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784576/407d3507-4d90-cfeb-4b2a-135ceb9c9435.jpeg) |
|:--:| 
| *エクソーラ日本支社のJin Jeong社長* |

東京にオフィスを新設するにあたって、エクソーラは現地の業界専門家を迎えます。これにより、成長する日本の顧客ベースに向けてサービスを提供し、日本のデベロッパー向けに製品とソリューションを適合させ、世界有数のゲーム市場におけるサービス提供の強化を目的として現地パートナーシップを構築することが可能になります。
日本のゲーム市場への関心が高まっていることを踏まえ、日本で最も権威あるゲームショウの1つである東京ゲームショウ2023に参加するエクソーラ日本支社のJin Jeong社長にお話を伺いました。
### Q.　エクソーラは、APAC地域の韓国とマレーシアへの進出に続き、今年初めに日本に法人を設立しました。エクソーラはなぜ日本市場に参入したのでしょうか。

A.　エクソーラがAPAC地域内に初めて進出したのが韓国市場でした。韓国で成功を収めた後、私たちは日本のゲーム市場がエネルギッシュに拡大し続けているのを目の当たりにしてきました。私たちはこの成長の可能性と、ゲームデベロッパーやパブリッシャーにツールやサービスを提供する機会を積極的に受け入れました。
特に、日本のゲーム会社は国内市場では強固なユーザーベースがあるものの、世界市場への参入となるとローカライズや収益化に関する課題を抱えていることがわかりました。エクソーラは日本企業のニーズを理解しており、エクソーラの決済ソリューションが日本のデベロッパーの問題を解決する鍵となると確信しています。
![IMG_8407-_1_.jpg](https://i.ibb.co/f1LjKG0/P2.jpg)

### Q.　東京ゲームショウにエクソーラがブースを出展したのは昨年に続き2回目となります。東京ゲームショウ2023への参加は、エクソーラにとってさらに意義のあることになりそうですね。

A.　はい。私は昨年、日本法人の設立に乗り出しました。当時、エクソーラチームのメンバーで日本語を話せるのは私だけでしたので、デベロッパーと直接ミーティングを行い、彼らのニーズを理解することに注力しました。日本の文化的特徴とビジネスニーズを理解し、それを世界中のエクソーラの仲間たちと共有する貴重な機会となりました。
それ以来、実に多くのことが変わりました。日本法人の設立以来、日本の文化に合わせた現地サービスを提供するため、社員を3名増員しました。私たちは、日本のデベロッパーのニーズに正面から適応する、日本に合うソリューションの提供を目指しています。
今年の東京ゲームショウでは、日本のゲーム市場におけるエクソーラのブランド認知度を向上させ、対面やリモートでの商談を通じてできる限り多くのゲーム業界関係者とのコミュニケーションを図る予定です。さらに、エクソーラはカンファレンスで講演を行い、ゲーム会社が世界的に成功するためのベストプラクティスを紹介する予定です。

### Q.　エクソーラの決済ソリューションの詳細についてお伺いします。決済ソリューションとはどのようなもので、このソリューションを実際に利用する日本のゲームデベロッパーにもたらすメリットはどのようなものでしょうか。

A.　エクソーラの決済ソリューションは、デベロッパーが世界中のさらに多くのプレイヤーに自社ゲームを売り込み、複数のプラットフォームでのグローバルな支払いを安全に行うことができる、スムーズな支払いを可能にするソリューションです。弊社の決済ソリューションを利用していただくことで、日本のゲームデベロッパーは世界市場に参入し、さらに多くのユーザーを確保し、収益を最大化することができます。
エクソーラの決済ソリューションは200か国の700の支払い方法と20の言語に対応しているため、世界中のユーザーがいつでもどこでも簡単に支払いを行うことができます。Roblox、Epic Games、Ubisoft、Steamなどの世界中の主要なデベロッパーが、すでにエクソーラの決済ソリューションを使用して成功を収めています。
日本のゲーム市場に目を向けると、ゲームの品質は優れているものの、多くのデベロッパーやパブリッシャーがローカライズや収益化に限界を感じ、支援を必要としています。エクソーラの決済ソリューションは、こうした問題を解決し、世界中のユーザーの安全性を確保する実績のある方法であると、私たちは確信しています。
![IMG_8417-_1_.jpg](https://i.ibb.co/CwJZHZ9/P3.jpg.jpeg)
### Q.　最後になりますが、エクソーラ日本支社の今後の展望を教えてください。

A.　私たちはまだ船出をしたばかりで、日本進出を嬉しく思っていますが、この先も多くのことに取り組んでまいります。私たちの第一の目的は、エクソーラのソリューションの導入に関心のある日本のデベロッパーがゲームをリリースする際の支援をすることです。また、今後もさまざまなチャネルでのマーケティング活動を通じてエクソーラブランドのプロモーションを進めていく予定です。私は、パートナー企業の皆様と実際にお会いしていきたいと考えていますので、それが私の目下の優先事項です。
エクソーラの日本での事業が拡大するにつれて、現地向けのソリューションやサービス、現地の社員も増え、日本支社も成長していくことでしょう。

エクソーラは、事業をレベルアップさせるために新しい収益化ソリューションをお探しの日本のゲームデベロッパーやゲームパブリッシャーが必要としておられる、信頼できるパートナーです。専門家チームメンバーにお問い合わせの上、エクソーラのさまざまなツールやソリューションをご覧いただき、御社が日本国内外において存在感を高めていく上でエクソーラがどのように役立つか、ぜひともご自身の目でお確かめください。

エクソーラは、新しい収益化ソリューションを探してビジネスをレベルアップしたい日本のゲーム開発者やパブリッシャーにとって、信頼できるパートナーです。エクソーラの豊富なツールやソリューションを探索し、エクソーラが日本や世界でのあなたの存在感を高めるのにどのように役立てるかを専門家のチームメンバーに相談してください: japan@xsolla.com。
DynamoDBを使用してみる

## 目的
AWS Certified Developer - Associateの勉強をしている中で
理解が浅いサービスについて実際に使用してみます

DynamoDBの作成とデータ取得までをやってみます

## 手順
- DynamoDBの作成
- データ取得

## DynamoDBの作成
**1. DynamoDBのページに移動、左のメニューからテーブルを選択**
**2. テーブルの作成を選択**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1997750/4231f44f-2a66-b383-af43-e3e1ca7a36a1.png)

**3. テーブルを作成**
今回はパーティションキーのみのテーブルを作成します
テーブル名:test_book
パーティションキー:id
その他はデフォルト


### ざっくり用語解説
- パーティションキー
    データが格納されるパーティションを決定するのために使用
- ソートキー
    ソートのために使用
- プライマリキー
    パーティションキー、またはパーティションキーとソートキーの複合キー
- セカンダリインデックス
    作成時とは別のパーティションキー・ソートキーを設定することで効率的にアクセスできるようにする
    - グローバルセカンダリインデックス（GSI）
        作成時とは別のパーティションキー・ソートキーを設定可能
    - ローカルセカンダリインデックス（LSI）
        パーティションキーは作成時と同じで、ソートキーは別のものを設定可能


**4. 作成されたテーブルを開き、アクションから項目を作成を選択**
値をてきとうに作成し項目を作成します
登録する値を追加するためには、新しい属性の追加から追加します

![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1997750/610d93b2-f563-90b8-f106-e37bb35ab78c.png)


同じパーティションキー(今回の場合は1)で項目を追加しようとすると以下のエラーが発生しました
`条件付きリクエストは失敗しました。指定したプライマリキーを持つ項目は既に存在しています。`


### おまけ

ソートキーを設定した場合のキー重複について確認してみました
以下の設定でテーブルを作成します
テーブル名:test_book2
パーティションキー:id
ソートキー:category

idとcategoryの複合キーになるようなので、idとcategory両方が同じ場合は、追加できずエラーが発生しました
ただパーティションキーやソートキーのみの重複であれば問題なく登録はできました

![image-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1997750/b20d0d5d-f692-2015-03a6-fe377e1ab306.png)
【Flutter】Android StudioでiPhone実機がDeviceの候補に出なくなったときの対処法

# 背景
**Xcodeをアンインストール、再インストール後**、Android StudioからiPhone実機が読み込まれなくなった。


# 確認項目
上から順に試してみてほしい
- Andorid Studioを再起動する
- iPhoneを再起動
- iPhoneがデベロッパーモードに切り替えられているか確認する
- XcodeとFlutterが連携できているか


## iPhoneがデベロッパーモードに切り替えられているか
iPhoneのデベロッパーモードがOFFの場合、Android Studioはデバイスの検知をしてくれないため、デベロッパーモードへ切り替える

### 切り替え方の参考記事
https://www.delasign.com/blog/how-to-turn-on-developer-mode-on-an-iphone/

## XcodeとFlutterが連携できているか
初期設定でFlutterとXcodeを連携するコマンドを入力する必要がある。
まずは`flutter doctor`で現在の連携状況を見てみる
```
$ flutter doctor
[✓] Flutter (Channel stable, 3.3.6, on macOS 13.5.1 22G90 darwin-arm, locale ja-JP)
[✓] Android toolchain - develop for Android devices (Android SDK version 33.0.2)
[!] Xcode - develop for iOS and macOS
    ✗ Xcode installation is incomplete; a full installation is necessary for iOS development.
      Download at: https://developer.apple.com/xcode/download/
      Or install Xcode via the App Store.
      Once installed, run:
        sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
        sudo xcodebuild -runFirstLaunch
[✓] Chrome - develop for the web
[!] Android Studio (version 2022.3)
    ✗ Unable to find bundled Java version.
[!] Android Studio (version 2022.2)
    ✗ Unable to find bundled Java version.
[✓] VS Code (version 1.82.2)
[✓] Connected device (2 available)
[✓] HTTP Host Availability

```
`[!]`はFlutterと連携ができていない項目

```
[!] Xcode - develop for iOS and macOS
```

エラーメッセージに従って、コマンドを入力
```
$ sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
$ sudo xcodebuild -runFirstLaunch
```

もう一度`flutter doctor`
```
$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.3.6, on macOS 13.5.1 22G90 darwin-arm, locale ja-JP)
[✓] Android toolchain - develop for Android devices (Android SDK version 33.0.2)
[✓] Xcode - develop for iOS and macOS (Xcode 14.3.1)
[✓] Chrome - develop for the web
[!] Android Studio (version 2022.3)
    ✗ Unable to find bundled Java version.
[!] Android Studio (version 2022.2)
    ✗ Unable to find bundled Java version.
[✓] VS Code (version 1.82.2)
[✓] Connected device (3 available)
    ! Error: KaitoのiPhone14Pro is busy: Fetching debug symbols for KaitoのiPhone14Pro. Xcode will continue when KaitoのiPhone14Pro is finished. (code -10)
[✓] HTTP Host Availability

```
これにより実機が読み込まれるようになりました。