OmniAICreator/Qiita-1.07M huggingface dataset:
コマンド記号（⌘）の起源：Appleキーボードのシンボルがどのように選ばれたか

---
コマンド記号（<font color="orange">⌘</font>）の起源：Appleキーボードのシンボルがどのように選ばれたか
---

**四葉のクローバー**

幸運の象徴、四葉のクローバー。

昔、少し齧ったことがありますが、あんまり美味しくなかったです。

三つ葉は美味しいのに......。

**目次**
- [1. この記事を書いた理由](#1-この記事を書いた理由)
- [2. ⌘はどのようにして選ばれたのか](#2-はどのようにして選ばれたのか)
- [3. おわりに](#3-おわりに)

## 1. この記事を書いた理由

　私は日々、Macパソコンを使って作業をしています。
 

　その中で、特に頻繁に使うのがコマンドキーです。
 
　このコマンドキー、<font color="orange">⌘</font>という記号で表されるこのキーを使いながら、ふとした瞬間に「この記号は一体誰が、どのような経緯で選んだのだろう？」という疑問が湧きました。


　Macを使い始めた当初から、この記号の存在は当たり前のように受け入れてきましたが、実際にこの記号にはどのような意味が込められているのか、その起源や背景については全く知りませんでした。
 
　そこで調べてみると、この記号が北欧の道路標識と関連があるという説を見つけました。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493200/c3544dfc-b70d-3b06-f720-e0359c57d1ad.png)

 
　しかしそこでは、なぜAppleがこの記号を選び、キーボードに採用したのかについての詳細は明らかではありませんでした。

　そこで、<font color="orange">⌘</font>記号がどのようにして選ばれ、今日に至るまでにどのような意味を持つようになったのかについて調べてみたので（と言ってもそんなに深くはないが）、次のセクションでそれを書いていきます。


> 参考
[コマンド記号 Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E8%A8%98%E5%8F%B7)
[⌘ ⌥ ⇧ ⌃ この記号 何か知ってますか？](https://note.com/apple_training/n/nf6372ceef874)

 
## 2. ⌘はどのようにして選ばれたのか


_<font color="orange">⌘</font>記号はどのようにして選ばれたのか。_
 
　その起源は意外なほどドラマティックでした。
 

　この物語の中心には、スーザン・ケア、Appleの伝説的なデザイナーがいます。

　彼女はMacintoshチームの初期メンバーとして、その革新的なグラフィカルユーザーインターフェイスの多くをデザインしました。

<font color="low blue">**創造の瞬間**</font>

　ある日、Appleのキーボードのために、全く新しい修飾キーのシンボルをデザインする任務がケアに課せられました。

　当時、AppleのMacintoshキーボードにはAppleのロゴが修飾キーとして使用されていましたが、ジョブズはこの使用法がブランドを過剰に露出させていると考えました。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493200/aea045fa-f7cb-5ec6-2a35-9a8b1d07f0c6.png)


　彼は、ユーザーが頻繁にこのキーを使うたびにAppleのロゴを見ることが、ブランドを安っぽく見せかねないと懸念しました。
 
　しかし、この新しいキーのためのシンボルを見つけることは、想像以上に難しい挑戦でした。
 
　彼女とチームは、コントロールキーのためのメタフォーとして、さまざまなアイデアを模索しましたが、どれも彼らの求める解答ではありませんでした。
 
　それらはすべて、なんらかの形で不適切であるか、あるいは単純に魅力に欠けるものでした。


<font color="low blue">**啓示**</font>

　挫折を重ねる中、ケアは「もっと抽象的なアプローチを試してみよう」と提案しました。

　彼女は古いシンボルの本をめくり始め、そこで運命的な出会いを果たします。
 
　スウェーデンのキャンプ場で使用されていた標識 - 「面白い特徴」という意味の記号に目が留まったのです。

　このシンボルは、一見して観光地や名所を示す北欧の標識として用いられていましたが、ケアにとってはそれ以上の意味を持ちました。


<font color="low blue">**選択**</font>

　このシンボルは、彼女が探していた解答でした。デジタル表示に適しており、視覚的にも魅力的で、何よりも抽象的な美しさを持っていました。

　この記号は、デジタル表示に適しており、かつギザギザしていないため、グラフィカルに魅力的であると判断されました。
 
　ケアは、この記号がコントロールキー、そして後に<font color="orange">⌘</font>キーのための完璧なシンボルであると直感しました。
 
　彼女は、ただ形を描くのではなく、意味を持つシンボルをキーボードに取り入れたいと願っていました。

　そして、この<font color="orange">⌘</font>記号は、まさに彼女が求めていたものだったのです。

<font color="low blue">**そして伝説へ...**</font>

　こうして、<font color="orange">⌘</font>記号はAppleのキーボードに採用され、今日に至るまでMacユーザーに親しまれています。

　この記号は単なる機能的な役割を超え、Apple製品のデザイン哲学とクリエイティビティの象徴となりました。
 
　スーザン・ケアの直感と創造性によって生み出されたこのシンボルは、テクノロジーとアートの融合を示す永遠の証となったのです。

（完）

> 参考
[スタンフォード大学図書館　スーザン・ケアに関するインタビュー](https://web.archive.org/web/20100721013859/http://library.stanford.edu/mac/primary/interviews/kare/mac.html)

## 3. おわりに

　要するに、

『スーザン・ケアが「面白い特徴」を象徴するマークを探していたら、「面白い特徴を示す」と言う意味を持った標識に出会い、運命を感じて採用した』

と言う風な感じです。

　補足等あればコメント欄で教えていただけると幸いです。


　私も今回、何か「面白い特徴」のある記事のネタないかな〜と探していたら、まさにドンピシャのものが出てきたので、運命を感じました。

　ありがとう、ケア。ダンケア（独）。
開発したアプリを共有できる個人開発者向けの交流場を作りました！！

# Circle4Devs: 個人開発を一歩先へ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533458/0a0b243e-e1c1-e5bf-2b4f-567cd31db8c4.png)

https://circle4devs.com/

個人開発者向けのアプリ紹介プラットフォーム、「Circle4Devs」を立ち上げました！

初めてZennに投稿するので、みなさんに読んでいただけると嬉しいです！

## はじめに

**Circle4Devs**は、簡単に言えば**個人開発者が開発しているアプリを一覧できるプラットフォーム**です。現在、App StoreやXなどにアプリが散在しており、これらの情報は開発者の熱意で溢れています。しかし、個人開発者としては、自分と似たような人がどんなアプリを開発しているのか把握するのが難しいと感じています。

そこで、これらの情報を一元化することで、個人開発者同士がお互いのアプリを見つけて利用し、フィードバックを交換しながら改善を進めるサイクルを生み出せると考えました。これにより、開発者同士がアプリを通じてコミュニケーションを取り、より便利なアプリが生まれると思います。開発者の最大のモチベーションは他人に使ってもらうことなので、それを実現することでより良いアプリが生まれることを期待しています。

## アプリの概要

**Circle4Devs**は、個人開発者が自分の作ったアプリを紹介し、他の開発者と共有できるプラットフォームです。現在の主要な機能は、自分のアプリを登録し、他のアプリを見ることです。これにより、個人開発者は他の開発者のアプリを見つけやすくなり、自分のアプリを広めることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533458/f2c060f0-9155-2b51-81d1-cc34d35a7f19.png)

https://circle4devs.com/app/WTF4CzxU6wPyxarPQ8RU

こんな感じで自分のアプリを紹介することができます。このあいだ冗談半分で開発し終えた「ツイター」っていうSNS（笑）のような個人単位で開発したアプリをこのような形で掲載できます。リンクをコピペしてXなどに貼って共有することもできますし、検索機能でアプリを調べることもできます。

さらに、開発者同士のコミュニケーションやフィードバックの交換などの機能を追加する予定で、これにより開発者同士がアイデアを共有し、アプリを改善していきます。

## 使い方

### アプリの出版

1. ダッシュボードを開いて上のプラスアイコンを押す
![Screenshot 2024-02-15 at 21.31.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533458/03cd0890-ffed-6b6b-91fa-ae912856cf73.png)

2. 出版画面からアプリの情報を埋めていく。下書きボタンを押さないと保存されないので注意してください！※自動保存機能も作ります！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533458/9a50e830-3ebd-cbb3-b8e4-d8e0ca0306aa.png)

3. 一番下の出版ボタンを押すと公開できます。公開したアプリは上のユーザーアイコンを押してプロフィールから確認できます

## 技術スタック

開発には、フロントエンドに**Nuxt.js**、バックエンドに**Firebase**を使用しました。

### Nuxt.js
Nuxt.jsはVue.jsベースのフレームワークで、モダンなウェブ開発に必要な機能を提供してくれます。開発効率の高さやSSR（Server Side Rendering）、静的サイト生成などの機能があり、パフォーマンスの高いウェブサイトを効率よく構築できます。Vue.js単独での開発には経験があったので、採用しました。

https://nuxt.com/

### Firebase
FirebaseはGoogleが提供するクラウドサービスで、アプリ開発に必要な機能を提供してくれます。スケーラビリティや開発速度が魅力で、サーバーサイドの開発を最小限に抑えてクラウド上でデータを管理し、ユーザー認証を行うことができます。今まではSpringBootでバックエンドを構築していたのですが、ユーザー管理やデータベース管理が面倒だったので、Firebaseを試してみることにしました。

https://firebase.google.com/

## 開発プロセス

私のアプリの開発は、のんびりと空いた時間でコーディングを進めるというスタイルで、2ヶ月程かかりました。Vue.jsからNuxt.jsへの移行は一部苦労しましたが、その過程でNuxt.jsでの開発に慣れることができ、良い経験になりました。

具体的に苦労したのは、SEO改善のためのMetaタグの追加でした。APIからデータを取得してMetaタグを埋める工程が難しかったですが、調べまくってStackOverflowなどで質問するなどして乗り越えました。根気よくやることがコツだと思います。

## アプリの未来

**Circle4Devs**の今後のアップデートでは、出版したアプリに対するいいね機能や閲覧回数、コメント機能を追加する予定です。
また、個人開発者が作ったアプリを紹介する場を提供し、さまざまな需要に応えることを目指します。


最後まで読んでいただきありがとうございました。
AWS CLF入門 - コンテナ編 

## はじめに
AWS CLF (AWS Certified Cloud Practitioner) を取得した際の学習記録をアウトプットとして以下に記す。

## リンク
[ネットワーク](https://qiita.com/yashiuri/items/31b2c9c3c49c2584cd01)
[セキュリティ](https://qiita.com/yashiuri01/items/73e5310b09ff41912862)
[コンピューティング](https://qiita.com/yashiuri01/items/9eaf71a1590e7815f9ef)
[コンテナ](https://qiita.com/yashiuri01/items/708b57ee179ae29e72a9)
[スケーリング](https://qiita.com/yashiuri01/items/79050093aff66b0f0665)
[ストレージ](https://qiita.com/yashiuri01/items/6d48d81f5a1651dcc999) 
[データベース](https://qiita.com/yashiuri01/items/159ea63b197f7a836d1c)
[メッセージ](https://qiita.com/yashiuri01/items/d98772b540ef2201c4e2)
[モニタリング](https://qiita.com/yashiuri01/items/64f6dbf38603cdb4828a)
[デプロイ](https://qiita.com/yashiuri01/items/85151311897d6afd429c)
[コストとサポート](https://qiita.com/yashiuri01/items/bac23130a43d62677330)
[移行とイノーベーション](https://qiita.com/yashiuri01/items/6e327034a7c50d56ca88)
[AWS用語集](https://qiita.com/yashiuri01/items/bd36c99623ca596b76e4)


## コンテナ
### **AWS Lambda**

- サーバーのプロビジョニングや管理を行うことなく、コードを実行できる
- 上限
    - メモリ10GB
    - vCPU 6
    - 15分未満の実行時間
- 指定したIPアドレスからの不正なリクエスト数を設定でき、IPアドレスをブロックするようにAWS WAFのルールを自動的に更新し、IPアドレスからのリクエストをブロックできる。
- ユースケース
    - Webサービスのバックエンド

### **Amazon ECS**

- Dockerコンテナをサポート
- EC2かFargateで管理

### **Amazon EKS**

- Kubernetesをサポート
- コンテナ化されたアプリケーションを大規模にデプロイして管理

### **AWS Fargate**

Amazon ECS と Amazon EKSで動作するホストマシンを意識せずにコンテナを実行できる環境
ネフラをしていたので各ベンダーの感想

### Cisco Systems

言わずとしれたネットワーク機器の王様。ネットワーク関連の仕様を策定してきたから業界の影響力パない。
シスコにできないことはない。
そんなシスコは王道を行くツンデレ系。
ツン（お金）は激しいけどデレ（安定感）はたまらない！

### ヤマハ
扱いやすいネットワーク製品（主にルーター）を提供する。
楽器作ったりバイク作ったりする会社なのに普通にすごい。地味に国内のネットワークベンダーで唯一ansibleに対応している。
初心者はこれから始めるのがいいんじゃないかな.
癒やし系のお姉さんタイプ。
ユーザー会があったり優しく導いてくれるぞ♪

### バッファロー
比較的小さめの拠点で使われているイメージ。
大体無線絡みで使われていた気がする。
特に感想はないけど無線まわりはアクセスポイントいっぱい導入しないといけないからめんどくさかったなあ。
電波タイプ？？

### NEC
あまり使わなかったなあ。
インターフェイスはCiscoそのもの。
後は…なにも言えない…

### 富士通
使ったことない

### アライドテレシス
かなり使う機会があった。
インターフェイスはCiscoと同じ。
だけどいっぱいコマンド流すとおかしくなるバグがある！
今は直っているといいが。
変なことするとおかしくなるけど基本的なネットワーキングなら不具合起こしたところを見たことない。
ドジっ子タイプ。


### Juniper Networks

セキュリティ製品によく使われるらしい（個人的にはそんなんでもない）。
Junos OSはとっつきにくいが慣れると設定戻したり、ciscoだとコマンドの順番考えたりしないといけないときでもJunos OSだと気にせず設定できたり便利なところがある。
ansibleにも対応していたので意外としっかりしている。

はじめは無口だけど徐々に笑顔を見せてくれる文学タイプ。
好き。

### Fortinet
セキュリティの王様。
セキュリティ製品のイメージが強いが割となんでもできるバケモノ。
FortiASIC-NPという専用ASICも持っているので単なるセキュリティ製品に留まらずネットワーク機器としても普通に使える。そうなったらFortinetじゃなくてもよくね？ってなるのでやっぱりセキュリティ周りで呼ばれる。

実は天才的な不思議ちゃん系。

### ALAXALA
やはりインターフェイスはCiscoと同じ。
でも他に特筆するほど使ってない…


## 総合して
自分は設定作ってansibleでコンフィグ作って設計書に落とし込むタイプのため、いかにansibleに対応しているかに関心があった。

* Cisco
* Juniper
* Fortinet
は公式で対応している。(https://docs.ansible.com/ansible/latest/collections/)

yamahaも非公式で対応している。(https://github.com/yamaha-network/ansible-collection-rtx)

個人的にはこの４つが好き。
[python] 縄跳びの回数を入力順に順位を出力する②

# 1分間の縄跳びの回数を入力順に並び替える処理

## はじめに

前回の記事は、実装の早さを競う大会に提出したソースコードをそのまま投稿したため、分かりにくく、メンテナンスしにくいため、メンテナンスしやすいソースコードを投稿いたします。

https://qiita.com/nogizakapython/items/7d4e6a39218bff6f0a23.md

## ソースコード

```python
#################################
####  並び替え処理
#################################

# 入力データリストの定義
jumper_data = []

# 縄跳びに参加する人数を入力、及び入力データのチェック関数
def input_jumper_count():
  print("人数を0より大きい整数で入力してください")
  while True:
    try:
      num = int(input())
      if num > 0:
        return num
      else:
        print("0より大きい整数を入力してください")
    except TypeError:
        print("0より大きい整数以外、入力しないでください")

#１分間に縄跳びを飛んだ回数を入力する関数
def input_jump_data(data_count):
  for i in range(data_count):
    print("1分間の縄跳びの回数を0以上の整数で入力してください")
    while True:
      try:
        jump_times = int(input())
        if jump_times >= 0:
          break
        else:
          print("0以上の整数を入力してください。")
      except TypeError:
        print("0以上の整数以外、入力しないでください")
    jumper_data.append(jump_times)

# メイン関数
def main():
  num = input_jumper_count()
  input_jump_data(num)
  #回数データを降順に並び替え,ランキングリストに格納する
  ranking = sorted(jumper_data,reverse=True)
  # 順位を決定し、標準出力に出力する。
  for degree,data in enumerate(jumper_data,1):
    rank = ranking.index(data) + 1
    print(f"{degree}番目の人の順位は{rank}位です")


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

## enumerate関数について

「enumerate()関数の引数にリストなどのイテラブルオブジェクトを指定し、順番とイテラブルオブジェクトの値を要素数の小さい順(0番目)からとります。」
```python
enumerate(イテラブルオブジェクト名,開始番号)
```
で指定します。開始番号を省略した場合は0から始まります。

## 最後に
見やすく、他の人がメンテナンスしやすいソースコードを書くのが鉄則ですね。
Ruby の `and` と `&&` は違う

`&&` と `and` とか、`!` と `not` とか、一緒じゃんって思ってるとバグることがあるので注意

# 何が違うか

https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html

演算子同士の優先度が違う。要は演算子を並べたときのくっつく順序が違う。

>```
>高い   ::
>       []
>       +(単項)  !  ~
>       **
>       -(単項)
>       *  /  %
>       +  -
>       << >>
>       &
>       |  ^
>       > >=  < <=
>       <=> ==  === !=  =~  !~
>       &&
>       ||
>       ..  ...
>       ?:(条件演算子)
>       =(+=, -= ... )
>       not
>低い   and or
>```
>左の「高い」「低い」は演算子の優先順位です。

# 代入(`=`)より優先度が低い演算子

代入 `=` より優先度が低いもの(`not`, `and`, `or`)とかは割と罠にハマると思う。たとえばある値が範囲内にあるかをチェックし、その結果を変数に代入する処理を考えてみる。

```ruby
# value が min ~ max の範囲内にあるか調べる
max = 100
min = 1
value = 1000

# この式は `false` が返る
in_range = min <= value and value <= max
# => false
```

`and` を `&&` だと思っていると正しそうに見えるが、変数 `in_range` には `true` が代入されている！！

```ruby
puts in_range
# => true
```

これは `=` の優先順位より `and` の優先順位が低いため起こる。

```ruby
in_range = min <= value and value <= max
# これは以下と等価
# in_range の代入後に and 以降が評価される
(in_range = min <= value) and (value <= max)
```

`&&` は `=` より優先順位が高いので、上記のようなことにはならない。
```ruby
in_range = min <= value && value <= max
# => false
puts in_range
# => false

# これと等価
in_range = (min <= value && value <= max)
```

# まとめ

演算子の優先順位に注意！ とくに `=` より優先順位の低い `and` `or` `not` には気をつけたほうがよさそう
Salesforceでスケジュールトリガーフローを作成しよう～とあるオブジェクトのレコードの項目を一括更新する方法

今回の内容は動画でも解説します

https://youtu.be/Qnc5VGHPEFI?si=teX9F5MNII9A_0q0

<iframe width="560" height="315" src="https://www.youtube.com/embed/Qnc5VGHPEFI?si=teX9F5MNII9A_0q0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

こんにちは
本橋孝昭です

皆さんはSalesforceでデータの一括更新をするさいどのようにしてますか？

よくある方法は

・インポートウィザード
・データローダ
ですね


※データローダ、インポートウィザードの詳細はこちら

https://qiita.com/Takaa/items/4d4f1494790778f7adcb


しかしながら、インポートウィザードはケースや商談など特定オブジェクトの更新や作成ができないです

データローダはパソコンにダウンロードなど初期設定が大変ですね


そのような中で、今回はあえて「スケジュールトリガーフロー」を作成し一括で項目更新する方法を解説します


※詳細ヘルプ

https://help.salesforce.com/s/articleView?id=sf.flow_concepts_trigger_schedule.htm&language=ja&type=5

今回は例として
・ケースの状況をすべて「Closed」に設定するスケジュールトリガーフローを作成します


フローの全体像はこのようになります

![ケース001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/cb53f88d-d937-ccfc-e90b-444c098a20e3.png)

オブジェクトはケース
開始時間は、任意に設定（今設定している日時より少し後に設定しましょう）

![ケース002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/5899b9a3-1e4b-7bdd-a46b-50b6780803ec.png)

最後にレコード更新を選択し、Statusを「Closed」に設定します

後は保存と有効化をお忘れなく


こうすることで、先ほど設定した日時になれば勝手にすべてのケースレコードは状況が「Closed」になります
【Apple Silicon】Live2D Cubism SDK for Unityをインストールした際に、CubismCore is not loadedと表示される。

# 開発環境
- Mac Book Pro(Apple M1 Pro(Apple Silicon)搭載)
- Unity Editor 2021.3.35f1(Apple Silicon)

# 事象
- Live2D 公式ページより提供されている、Live2D Cubism SDK for Unity(CubismSdkForUnity-4-r.7.unitypackage)を上記Unityへインポートすると、下記メッセージが表示されました。

![スクリーンショット 2024-02-16 20.19.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681751/c515ff9b-ebbc-c44a-afcb-cfe9ddf6434a.png)


> Live2D CubismCore is not loaded
> Please reboot this Unity project if it is just after import of the SDK. If it's not, please check if platform settings of dll is correct. dll cannot be used on platform which is different from its own build settings.


https://www.live2d.com/en/sdk/download/unity/


# 解決策
1. `Assets/Live2D/Cubism/Plugins/macOS/Live2DCubismCore.bundle`をクリックする。
![スクリーンショット 2024-02-16 20.10.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681751/eb4d2b3e-a806-2051-a691-a16199dfa4f5.png)


1. インスペクタ上で、Platform settings上の、CPUを**Apple Silicon**か**Any CPU**を選択し、Applyする。
![スクリーンショット 2024-02-16 20.09.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681751/e4aaf9ec-a97b-9146-785b-e7eddcd1fe41.png)

1. Unityを再起動する。

公式リポジトリの宣言(NOTICE.ja.md)によりますと、Apple Silicon版Unity Editorでは上記の操作が必要です。

https://github.com/Live2D/CubismUnityComponents/blob/4-r.7/NOTICE.ja.md


# 補足
最新のベータ版(CubismSdkForUnity-5-r.1-beta.4.unitypackage)では、上記対応は不要っぽい?です。

https://github.com/Live2D/CubismUnityComponents/blob/develop/NOTICE.ja.md
回帰結合型ニューラルネットワークと再帰的ネットワーク【E資格対策】

### <font color="rgb(107, 142, 35)">回帰結合型のニューラルネットワーク(RNN) </font>
時系列データを考慮できるニューラルネットワーク。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/ea04aa01-8ab9-d57e-d800-d616b9744627.png)


### <font color="rgb(107, 142, 35)"> 双方向 RNN</font>

過去の情報だけじゃなくて、未来の情報も使って精度を上げているモデル。
たとえば、入力が文章とかの場合は、一気に未来の情報とかも入ってくるので、こういったモデルを使用することができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/23fe725b-d689-5da2-738c-96dd58878262.png)


### <font color="rgb(107, 142, 35)">Encoder-DecoderモデルとSequence-to-Sequenceモデル</font>

#### Encoder-Decoderモデル 
Encoder-Decoderモデルは、入力シーケンスを固定次元の意味ベクトルに変換するEncoderと、その意味ベクトルを使って出力シーケンスを生成するDecoderから構成される。

Encoder : 入力単語(x)をRNNで固定次元の意味ベクトル(c)に変換

Decoder : 意味ベクトル(c)と隠れ層(Si)とそれまでの単語(yi-1)を入力に、RNNで単語(p(yi))を出力する

#### Sequence-to-Sequenceモデル
Sequence-to-Sequenceモデルは、Encoder-Decoderアーキテクチャを応用し、入力シーケンスから出力シーケンスを直接生成する。機械翻訳や要約生成などに利用される。


### <font color="rgb(107, 142, 35)">長期依存性の課題</font>
長期依存性の課題とは、RNNが長いシーケンスデータを扱う際に、初期の情報が後の層にうまく伝わらないことだ。これにより、モデルが過去の重要な情報を「忘れてしまう」ため、性能が低下する。

### <font color="rgb(107, 142, 35)">ゲート付きRNN</font>

ゲート付きRNNは、長期依存性の問題を解決するために開発された。これには、LSTMやGRUなどのモデルが含まれる。ゲートとは、情報の流れをコントロールするための仕組みで、どの情報を保持し、どの情報を忘れるかを決定する。


#### LSTM

LSTMは、時系列データを扱うことができるニューラルネットワークの一種。長期的な依存関係を学習することができる特別な構造を持っており、自然言語処理や株価予測などの分野で活用されている。

LSTMの仕組みは、セル状態(CEC)と呼ばれる変数に情報を保存し、忘却ゲート、入力ゲート、出力ゲートという3つのゲートでその情報を制御する。これにより、LSTMは過去の情報を現在のタスクに関連付けることができる。

**↓のサイトに超詳しく書いてあるので、これを読めばOK**
https://i-main.net/emmanote-ai-lstm/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/7270f89c-b875-a162-c8c8-d341e871fa81.png)


#### GRU
記憶セルを使わずに、「LSTM同等かそれ以上」の高機能化を実現したやつ。

**↓のサイトに超詳しく書いてあるので、これを読めばOK**
https://i-main.net/emmanote-ai-gru/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/555437ef-7120-cc27-9c1d-09c7e33dcddd.png)



### <font color="rgb(107, 142, 35)">長期依存性の最適化</font>
長期依存性の問題を解決するために、いくつかの技術的な工夫がなされている。これらの工夫は、RNNが長いシーケンスデータを扱う際に、初期の情報を後の層に効果的に伝えることを可能にする。

### <font color="rgb(107, 142, 35)">勾配のクリッピング</font>

勾配のクリッピングは、勾配爆発を防ぐために勾配の値を制限する手法である。要素ごとにクリッピングする方法と、ノルムをクリッピングする方法がある。

##### ・要素ごとにクリッピング
勾配gを、要素g_i(重み)ごとに閾値を超えている/超えていないを計算し、閾値で抑える。

##### ・ノルムをクリッピング
勾配𝑔のL2ノルム|𝑔|(二乗の総和の平方根)をクリッピングする手法。

「要素ごとにクリッピングを行う場合と比べて、勾配の方向が変わらない。」という利点はあるが、実は大して変わらないらしい。

### <font color="rgb(107, 142, 35)">Attention</font>

連続したデータ(特に自然言語)を扱う際に、過去の重要なポイントに着目(Attention)する手法。
注意機構(Attention Mechanism)とも呼ばれる。
これにより、モデルは重要な情報に焦点を当て、無関係な情報を無視することができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/c337bd82-9160-c87f-458c-f664fb0b74f8.png)
https://zero2one.jp/ai-word/attention/

以下で超わかりやすく説明してるので、これを見ればOK。

https://nlpillustration.tech/?p=185


### <font color="rgb(107, 142, 35)"> Additive Attention</font>

Additive Attentionは、Attentionの重みを隠れ層1つのフィードフォワードネットワークで求める手法である。特に長いシーケンスデータに対して効果的である。


# 参考にしたページ
https://i-main.net/emmanote-ai-lstm/

https://cvml-expertguide.net/terms/dl/rnn/lstm/

https://nlpillustration.tech/?p=185
VSCodeで「tailwind intellisense」の補完が効かないときの対応方法

「tailwind intellisense」の補完が効かない場合の対応方法についてです。
補完が効かない理由と対策について調べてわかったことをまとめておきますので誰かの役に立てると幸いです。

## 補完が効かない「理由」
「tailwind intellisense」は`tailwind.config`の設定を確認して補完します。
デフォルトの設定ではルート配下に設置されている`tailwind.config`の設定を反映させるようです。

つまりモノレポで作成されたプロジェクトの場合、反映させたいConfigがルート配下にない場合「補完が効かない」という事態が起こります。

## 解決方法
調べると下記の設定をVSCodeのsetting.jsonに書き加えることで解決するとあります。
```json
"editor.quickSuggestions": {
  "strings": true
}
```

ただ、先ほど述べた反映させたいConfigファイルの位置がルートではない場合は設定しても反映されません。
なのでsetting.jsonに下記の記述を加えてください。

```json
"tailwindCSS.experimental.configFile": "path/to/your/tailwind.config.js",
```

これで独自で設定した設定も含めてtailwindのclassが補完されるようになると思います！

## まとめ
TailwindCSSを利用してのコーディングに慣れていない状況で「tailwind intellisense」が使えるのと使えないのでは作業効率がかなり変わります！

それ以外にもたくさん便利なプラグインがあるので積極的に導入して試してみてください！
Lispを学ぶメモ

# Lisp
を学ぶことで、手続き型言語を触っているだけでは得られないような考え方発想などが身につくらしい（？？）。
試しにAtCoderに挑戦してみる。

# AtCoder
Common Lisp使えるらしい助かる

練習問題１　とりあえずむちゃ簡単そうなやつ

https://atcoder.jp/contests/typical90/tasks/typical90_v

# 参考
大変助かります 🙏

https://qiita.com/t-sin/items/054c2ff315ec3b9d3bdc
【Apple Silicon】Unity Editorをバージョンアップしたら、オーディオ音量が小さい

# 1. 開発環境
- Mac Book Pro(Apple M1 Pro(<font color="red">**Apple Silicon**</font>)搭載)
- Unity Editor: 2019.4.29f1(<font color="blue">**Intel**</font>)

# 2. 事象
- Unity Editorを2021.1.28f1(<font color="blue">**Intel**</font>)へアップデートしたら、オーディオ音量が極端に小さくなりました。
- 2019.4.29f1(<font color="blue">**Intel**</font>)をはじめ、2019.4.35f1(<font color="blue">**Intel**</font>)までは、オーディオ音量は問題ありませんでした。

# 3. 解決策
- Unity Editorを2021.3.35f1(<font color="red">**Apple Silicon**</font>)へアップデートしましたところ、解決しました。
:::note warn
Unity Editorを2021.**1**系ではなく、2021.**3**系(Apple Silicon)とする必要があります。ご利用しているパッケージの要件、プロジェクト要件によってはご注意!
:::

# 4. 補足: よくある、オーディオ音量が小さい場合のチェック項目
私のケースでは下記方法で解決できませんでしたが、調べた内容をまとめます。

### **ビルド先の音量設定**
- ハードウェア側の音量をチェックする。(音量が小さくなってない?マナーモードになっていない?)

### **インポートする音声ファイル**
- Unityへインポートする前の音声ファイルの音量はそもそも適切かをチェックする。

### **Project Settings**
- カテゴリAuidoの**Global Volume**が下がっていないかをチェックする(最大値は1)。

https://docs.unity3d.com/ja/2019.4/Manual/class-AudioManager.html

- (iOSの場合)カテゴリPlayerの**Prepare iOS for Recording**のチェックを外す。

https://docs.unity3d.com/ja/2018.4/Manual/class-PlayerSettingsiOS.html

https://forum.unity.com/threads/audio-volume-to-low.183659/


### **Audio Source**
- Audio Sourceを作り直す。
- プロパティ**Spatial Blend**の値が3D(=1)ならば、Audio ListenerとAudio Source間の距離をチェックする。遠いと音が小さくなります。

https://docs.unity3d.com/ja/2021.3/Manual/class-AudioSource.html


### **Audio Listener**
- Audio Listenerが複数箇所にアタッチされていないかをチェックする。Audio ListenerはScene1つにつき、1つまで。

### **Audio Clip**
* **Force To Mono、Normalize**をチェックし、Applyする。

https://forum.unity.com/threads/audio-volume-to-low.183659/


# 5. 補足: Unity Editorをアップデートせずに解決する方法はある?

- dBを上げるようなAudio Mixerを作成し、それをAudio Sorceのプロパティ"Output"へアタッチしたならば、多少マシになります。しかし、声が音割れしたり、こもった印象があったので、こちらは採用しませんでした。

![スクリーンショット 2024-02-16 19.44.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681751/3671e8be-113f-bc79-67e4-131233d8d047.png)

https://gametukurikata.com/se/audiomixer


* 音声生成サーバ(Python3)側で調整するアプローチも微妙でした。
```shell
pip install pydub
```

```python
from pydub import AudioSegment

Audio = AudioSegment.from_wav(f"output/test.wav")
newAudio = Audio + 5
newAudio.export(f"output/test.wav", format='wav')
```
アーカイブファイル(zip,rar)を開いた時に7-zipを使い指定したフォルダに解凍するようにする

# はじめに
Lhaplusの移行先を探していたのですが、
ワンクリックで指定したフォルダに解凍してくれるようなツールが中々見つからなかったため、7-zipのコマンドライン版からバッチを作ることにしました。
実はバッチファイルでもファイル関連付けは行えます。

# 仕様
- SEVEN_ZIP_PATHにはデフォルトのインストール先が入っています。
- OUTPUT_PATHに解凍したいフォルダを指定して下さい。
- 解凍先が既に存在しているフォルダの場合、末尾に(1)のように数字が追加されます。（どんどん数字が増える）
- 解凍後、自動的にフォルダが開かれます。

# コード
````bat
@echo off
setlocal

set "SEVEN_ZIP_PATH=C:\Program Files\7-Zip\7zG.exe"
set "OUTPUT_PATH=D:\一時\"

if not "%~0"=="%~dp0.\%~nx0" (
    start /min cmd /c,"%~dp0.\%~nx0" %*
    exit
)

set "making_folder=%~n1"
set count=0

:loop
If not exist "%OUTPUT_PATH%%making_folder%" goto loop_end
set /a count+=1
set "making_folder=%~n1 (%count%)"
goto loop

:loop_end
"%SEVEN_ZIP_PATH%" x "%~1" -aos -o"%OUTPUT_PATH%%making_folder%"
explorer "%OUTPUT_PATH%%making_folder%"
````

# (おまけ)ファイルのアイコンをLhaplusと同じものに変更する
[Lhaplus](https://www7a.biglobe.ne.jp/~schezo/)(アーカイブ版もあります)のLplsIcon.dllから、[Icon Explorer](https://www.mitec.cz/iconex.html)のようなツールでアイコンを抜き出して、[FileTypesMan](https://www.nirsoft.net/utils/file_types_manager.html)から拡張子ごとに変更できます。
![icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/476971/4d7b6b8d-0454-f5dd-5712-f4c55c75d3d8.png)

# 参考文献
https://qiita.com/YMT2520/items/5a0811e5ccee922b7192
【これだけ見れば記事が書ける！】マークダウン記法

# 【マークダウン記法って何！？】

この記事はOiita初心者の方に向けた記事となっています。

みなさん、Qiitaを書く際はマークダウン記法を使用しますよね！

でも、マークダウン記法なんて使ったことないし、
調べても結局何を使えばいいのかわからない！

そう思ったことはありませんか？

今回はそんな皆さんに向けて【これだけ使えれば記事が書ける】
というマークダウン記法をご紹介します！
（記事が書けることを目的としていますので、難しい記法は掲載していません。）

# ①見出し

見出しを付けたいときは、文章の先頭に「＃」を入れることで変換することができます。
例）#(半角スペース)見出し

# ②箇条書き
箇条書きで記載する際は、文章の前に「*」を入れます。
例）＊(半角スペース)エンジニア1年目

# ③改行
文の途中で改行をしたい場合は、行末で半角スペースを2個連続入力します。

# ④太文字
太文字に変換したい場合は該当の単語部分を＊＊で挟みます。
そうすることで、一部分を強調したり目立たせることができます。
例）** Qiita ** （文字との間にスペースは入れません）



# 最後に
いかがでしたでしょうか。
これさえ覚えてしまえば、気軽に、そして簡単に記事を書くことができます！
慣れてきたら、次は応用的なマークダウン記法にも挑戦してみてくださいね＾＾
スペースとファイル末尾の改行周りのvscode設定

## 不要なスペースを削除してくれる

![スクリーンショット 2024-02-16 19.29.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328421/740aee19-cbdc-0252-2827-b3684a03942d.png)


## ファイルの末尾に空行を挿入してくれる

![スクリーンショット 2024-02-16 19.29.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328421/d45a0363-61ef-c2df-9364-2aea7f56b1db.png)


## settings.jsonに直接追加する場合

```json
{
  "trailing-spaces.trimOnSave": true,
  "files.insertFinalNewline": true,
}
```
pythonのライブラリー使ってポモドーロツールを作る

# 概要
:::note info
pythonのライブラリー使ってポモドーロツールを作ります
・PySimpleGUI
・pygame
:::





# アナコンダをインストール
pythonを使うのにanacondaをダウンロードしてインストールします
https://www.anaconda.com/download

# 環境変数を編集を設定する
windowsメニューで「環境変数を編集」を入力して起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771936/5a486cdd-9902-3167-61c7-af0107e92764.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771936/8b99ff20-1d06-2834-4a2c-800654503f71.png)
ユーザー環境変数のPathにanacondaのインストールした場所を設定する

Path=C:\work\anaconda3

# 音をダウンロードする
魔王魂からダウンロードします。音の利用は魔王魂のルールに従ってください
https://maoudamashii.jokersounds.com/archives/se_maoudamashii_onepoint30.html

# 必要なライブラリーをインストール
「anaconda prompt」を起動して、コマンド実行してインストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771936/b16c1641-d6e3-f061-76a3-d94a972965d5.png)

```shell
# pip3 install PySimpleGUI
# pip3 install pygame
```


# 実行
任意の作業フォルダーに「pomo.py」のファイルを作成
※先ほどダウンロードした音も一緒のフォルダーに入れてください

作成したpythonのファイルの場所に移動する

```python
import PySimpleGUI as sg
import pygame.mixer
import time
from datetime import datetime, date, timedelta
 
layout = [
   [sg.Text('ポモドーロ')],
   [sg.Text('時間', size=(15,1)),sg.Text('25:00:00', key="time", size=(15,1))],
   [sg.Text('間隔', size=(15,1)), sg.InputText('25')],
   [sg.Text('休憩', size=(15,1)), sg.InputText('5')],
   [sg.Submit(button_text='開始'),sg.Submit(button_text='一時停止'),sg.Submit(button_text='停止')]]
 
pygame.mixer.init(frequency = 44100)
pygame.mixer.music.load("maou_se_onepoint30.mp3")
 
dtAdd = ''
startFlg = 0
status = 2
win = sg.Window('ポモドーロ', layout)

while True:
   event, values = win.read(timeout=1)
   if dtAdd != '':
     if startFlg == 1:
       win["time"].update((dtAdd - datetime.now()))
       minuteAdd = dtAdd.minute
       if dtAdd.hour > datetime.now().hour:
         minuteAdd += 60
 
       if ((minuteAdd - datetime.now().minute) <= 0 and (dtAdd.second - datetime.now().second) <= 0) :
           if status == 1:
               dtAdd = datetime.now() + timedelta(minutes=int(values[0]))
               status = 2
           elif status == 2:
               dtAdd = datetime.now() + timedelta(minutes=int(values[1]))
               status = 1
           
           pygame.mixer.music.play(3)
   
   if event is None: break
   if event == '開始':
     dtAdd = datetime.now() + timedelta(minutes=int(values[0]))
     startFlg = 1
   elif event == '一時停止':
     startFlg = 1 if startFlg == 0 else 0
   elif event == '停止':
     startFlg = 0
     status = 2
     pygame.mixer.music.play(1)
     time.sleep(1)
     pygame.mixer.music.stop()

```

実行すると下記の画面が表示されます

```
# python pomo.py
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771936/f78ad799-4ca5-9c15-1bac-6802f9bb42e7.png)
Go言語におけるマルチバイト文字の扱い

Go言語はUnicodeテキストをネイティブにサポートしており、世界中のどの言語のテキストでも扱うことができます。これはstring型とrune型を通して実現されています。しかし、マルチバイト文字を扱う際にはいくつか注意点があります。

### string型
- string型はイミュータブル（変更不可能）で、UTF-8でエンコードされた文字列を保持します。
- string内の文字は直接インデックスを使ってアクセスすることができますが、これはバイト単位でのアクセスであり、マルチバイト文字を構成する個々のバイトに分割される可能性があります。
- string型はテキストデータの読み込み、保存、伝送に適していますが、マルチバイト文字を一文字ずつ処理する場合には不便な場合があります。

### rune型
- rune型は、Unicodeのコードポイントを表すためのint32型のエイリアスです。これは、Go言語において1文字（Unicodeスカラー値）を表します。
- rune型を使うと、UTF-8エンコードされたマルチバイト文字列を構成する各文字に対して、そのUnicodeコードポイントに基づいた操作を行うことができます。
- 文字列をruneスライスに変換することで、マルチバイト文字を含む文字列に対して文字単位で反復処理を行うことが容易になります。
### string型とrune型の違い
- 表現の違い: string型はバイト列としてテキストデータを表現しますが、rune型はUnicodeコードポイントとして文字を表現します。
- 用途の違い: string型はテキストの格納や伝送に適しています。一方、rune型はテキストの文字単位での処理や解析に適しています。
- アクセス方法の違い: string型のインデックスアクセスはバイト単位ですが、rune型を使った処理では文字単位でのアクセスが可能です。



### マルチバイト文字の反復処理

マルチバイト文字列を反復処理する際には、rangeループを使用すると便利です。rangeループは、string内の各rune値とそのインデックスを返します。これにより、UTF-8エンコードされた文字列内のマルチバイト文字を正しく扱うことができます。
```go
package main

import "fmt"

func main() {
	s := "こんにちは"          // これはstring型
	for i, r := range s { // `s`を`rune`として反復処理
		fmt.Printf("%d: %q (%[2]U)\n", i, r)
	}
}

```

出力
```
0: 'こ' (U+3053)
3: 'ん' (U+3093)
6: 'に' (U+306B)
9: 'ち' (U+3061)
12: 'は' (U+306F)
```
注意点：インデックス順位
- 〇　0, 3, 6, 9...
- ✖　0, 1, 2, 3...

### 文字列とバイトスライスの変換

Go言語では、文字列をバイトスライスに変換することがよくあります。これは[]byte型を使用して行われます。しかし、マルチバイト文字が含まれる場合、単純なキャストでは文字が意図しない形で分割される可能性があります。正しく変換するには、文字列をruneスライスに変換し、それから必要に応じてバイト表現に変換することが推奨されます。

```go
package main

import "fmt"

func main() {
	s := "こんにちは"
	runeSlice := []rune(s)
	byteSlice := []byte(string(runeSlice))

	for index, runeValue := range byteSlice {
		fmt.Printf("%d\t%U\t%c\n", index, runeValue, runeValue)
	}
}
```
出力
```
0	U+00E3	ã
1	U+0081	
2	U+0093	
3	U+00E3	ã
4	U+0082	
5	U+0093	
6	U+00E3	ã
7	U+0081	
8	U+00AB	«
9	U+00E3	ã
10	U+0081	
11	U+00A1	¡
12	U+00E3	ã
13	U+0081	
14	U+00AF	
```


Go言語でマルチバイト文字を扱う際には、stringとruneの違いを理解し、適切な方法で文字列を反復処理したり、バイトスライスに変換することが重要です。


オンラインデバッグ

https://go.dev/play/
非データサイエンティストがコンペを完走できたわけ ～ありがとうDataiku～

みなさん、こんにちは！
私は、保険会社勤務10年目、脳筋新規開拓保険営業マンを経て、現在はCS部門で企画業務に従事しているSaitoと申します。

どういうご縁か業務の中でデータサイエンス（的な業務）に関わらせていただいたり、生成AIに関わらせていただいたりと、もともと筋肉でできていた脳みそが徐々に溶けていっているところで今回、第2回金融データ活用チャレンジコンペティションに参加させていただくこととなりました。


業務の中で軽く触れているとはいえ、統計学を学んだわけでもなく、コーディングができるわけでもない素人がデータサイエンスの世界に足を踏みいれてしまいました。

本記事では、そんな私がDataikuを活用してどのようにコンペを完走できたのか赤裸々に記していけたらと思っています。

https://signate.jp/competitions/1325


# Dataikuとの出会い

コンペにエントリーしたが、コーディングはできない。SIGNATEのチュートリアルページを見ても難しそう。どうしたものか…。と頭を抱えていました。

そんなとき、提供された素晴らしいツールたちの中で一番最初にハンズオンを実施したのがDataikuさんでした。
藁にもすがる思いでハンズオンに参加したところ私のようなコーディングができない非データサイエンティストでもスイスイと操作できるではありませんか…！

こんなにも簡単にできるのか！と感動しながらの初提出。
スコアは0.61ほどでした。
非データサイエンティストの自分にしては、もう十分やった…と燃え尽きそうになりましたが、Dataikuを使えばこんなこともできるんじゃないかな？と、沸々と沸き上がる好奇心とともに、結局Dataiku1本でコンペ終了まで闘いぬきました。

▼記念すべき初投稿時のフロー
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714283/fc5f3654-3ab8-3774-c859-8a3cb0f7619d.png)


# いろいろいじってみた

どうやら、予測をするうえで特徴量エンジニアリングは欠かせないらしい…
最初はエクセルでポチポチと特徴量を作ってみたりしていましたが、膨大な量のデータをいじるのはめんどくさすぎるうえにデータ量が膨大で作業時間がかかりすぎる…。
Dataikuのハンズオンではどうやっていたっけ？と何回もYoutubeに残されたハンズオンの動画を見直しました。（VHSなら擦り切れていました）

prepareには無限の可能性があるのではないか…と思いprepareをひたすらにいじり、特徴量を作ったり削ったり、時にはまとめたり…
エクセルでやっていた作業がスイスイできる、しかもサジェストもしてくれる…ありがとうDataiku。


▼気が付けば1度のprepareで39stepも…
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714283/48e6173f-9060-cfde-6ae6-1ed63e5a3830.png)


# いろいろいじってみた2
ハンズオンに従順な私は、毎回同じモデル（Random ForestとLogistic Regression）でフローを回していました。
Slackを見ているとどうやら決定木という手法がイケているらしい。
Dataikuにも絶対にあるはずだ。とモデルがいじれる場所はないか探しているとあるではありませんか、モデルをいじるところ。さすがDataiku…

せっかくなのでDecision Treeのほかにもいくつか試してみようと思い、Light GBMも仲間に入れてあげて4モデルで競い合わせてみたところ、少しずつスコアが上がっていきました。

もう、これ以上は上がらない…限界だ…と思いながらまたSlackを眺めていると、Dataikuでは、モデルとモデルを掛け合わせてアンサンブルモデルも作れるらしい。やるじゃないかDataiku。

そこからは馬車馬のようにDataikuを回し続け最終的には0.68までスコアを上げることができました。

▼最終日のフロー…もう何が何だか自分でもわかりませんでした。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714283/6828f2ce-56cd-24d0-d2cc-618bfa0df6ee.png)


# おわりに

Dataikuのハンズオンを受講して初めて提出したスコアは、0.61。
試行錯誤を重ねているのに叩き出してしまった0.51。
馬車馬のようにDataikuを回してようやく到達した0.68。
Dataikuのおかげで楽しく学びながらコンペを完走し、順位は346位と上位には入れませんでしたが、データサイエンス初心者にしては及第点だと考え、大いに満足しています。
Dataikuがなければ、社会人として初めて会社の命令に背きコンペを放り投げていたかもしれません。
ありがとうございました。

最後に会社では生成AIの業務にも片足突っ込んでいるので生成AIにアウトロを生成してもらいました。

# 今後の目標
今回学んだことを活かし、データ分析スキルをさらに磨いていきたいと思います。
そして、将来的には、データ分析を仕事に活かせるよう、努力を続けたいです。
Dataikuは、データ分析初心者にとって非常に強力なツールです。
これからデータ分析に挑戦したいと思っている方は、ぜひDataikuを活用してみてください！
Dataikuを使えば、あなたもデータ分析の楽しさを実感できるはずです！

おわり
自分用　ポストプロセス導入方法

Unity 2022.3.18f1

PackgeManagerから
UniversalRPをインストール


右クリックから　作成Create→Rendering→URP Asset(with UniversalRender)
GraphicsのScriptable Render PipelineSettingに設定


Project Settings　→ Player→OtherSettingsのColorSpaceをLinearにする
（しなくてもGame画面でポストエフェクトは出る）


カメラ　RenderingのPost Processingに☑

HierarchyでVolume→GlobalVolume作成
Profileからエフェクト指定など

マテリアルの作成
HDRやIntensityを上げるなど


レイヤーについてはここ
https://okamochi-storage.com/2021/02/22/%E3%80%90unity%E3%80%91bloom%E3%81%AE%E5%8F%8D%E6%98%A0%E5%AF%BE%E8%B1%A1/



※ポストエフェクト導入は複数やり方があって本文がURP
他にもHDRPとPost Processing
とかを使った方法があるっぽい
redux toolkitのthunkとfirebaseのMFA認証は相性が悪い

# 背景
firebaseで認証機能を作成している。
二要素認証の作成をしている。
グローバル変数にredux toolkitを使用している。

# パスコードを使ってサインインしようとするとauth/internal-errorになる
### 原因
redux toolkitのthunk関数でスローされるエラーのはシリアライズエラーになってしまうため。
MFA認証でresolve.signInを行うにはMultiFactorErrorが必要となる。

### やったこと
- thunkでエラーはthrowする　→ シリアライズされたエラーになり、operatorTypeがundefinedと言われる
- rejectWithValueでMultiFactorErrorを返す　→ payloadがnon-serializableと言われる（サインインはできる）
- MultiFactorErrorをシリアライズしたオブジェクトに変換してrejectWithValueに返す　→ サインインするとauth/internal-errorになる


## 解決策
serializableCheckをfalseにする。
```react.js
middleware: (getDefaultMiddleware) =>
    getDefaultMiddleware({ serializableCheck: false }).prepend(listenerMiddleware.middleware);
```
【豆知識/Windows】タスクバーが吹き飛ぶ原因・改善方法

Windows使ってる全員が一度は体験したことはあると思います。
タスクバーが消えて、数秒から10秒くらいすると復活するあれ。
# なぜタスクバーは吹き飛ぶのか
前提として、タスクバーはWindowsシステムの`explorer.exe`(ファイルエクスプローラー)が管理・制御しています。
そして、`explorer.exe`には致命的な弱点があります。
それは、**デバイスの応答なしに極端に弱いこと**です。非同期処理が苦手なんです、エクスプローラーくんは。
なので、基本的にデバイス応答なしになったらタスクバーが落ちます。NASにアクセスできなくてもたまに落ちます。
# タスクバーが吹き飛ばないようにする方法はあるのか
**あります**
「別のプロセスでフォルダーウインドウを開く」というオプションを有効にすると全く落ちなくなります。
※**Windows10のエクスプローラーの安定性は非常に高いので画像解説では割愛します**
①ファイルエクスプローラーを開き、中央上部にある3点アイコンのボタンを押す
![スクリーンショット 2024-02-16 182559.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620623/b2b35a5f-5e75-626f-8769-b3d0d9848c1f.png)

②クリックしたら表示される項目の最下部にある「オプション」をクリックする。
③フォルダーオプションの全般タブが開くため、**表示タブ**に切り替えて
表示された詳細設定内の下のほうへ移動して赤色下線部の項目を有効にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620623/52f89bb0-c5cb-7c05-05c8-3442eb3bc27d.png)
※保護されたオペレーティングシステムファイルのところは無効にしなくて大丈夫です。てか無効にするのは非推奨です

④これでOKを押すとファイルエクスプローラーのウインドウが再起動します。
**大体これで安定性は100倍くらい上がると思います**
実際に自分では不安定と言われるWindows Insiderバージョンでも落ちることは滅多にないくらい効果抜群だと感じているのでおすすめです。

改善したり、ストレスが減ったらコメントしたり共有してくださいね
あなたの小さなストレスがまた一つ解決に向かうことを願っています。
Open CVの二値化について

## はじめに

IOSアプリ開発でOpen cvをインストールして画像の二値化処理を行ったので、私がより理解するため簡単に分かったことを記事引用しながら纏めてみる
※あくまでも簡単に

以下記事で画像を二値化する為にSwiftへOpen cvをインストールから二値化までを簡単に纏めてます。

https://qiita.com/web05891254/items/298c1903277979267a91

それでは上記記事でのコードを使いつつ纏めていきます。

## 二値化ってそもそも何？

言葉のままですが、画像の色を【白】と【黒】のみにすること。
iPhoneのカメラなどで撮影すると次の画像のように色付きで写真が撮影される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645607/8da56661-6f99-bde9-560d-4e84ef39bc41.png)



私はまだ画像処理を多用した事がないので明確に体感した事はないのですが、画像処理する理由としては次のようになります。
・色情報が入ってる為、画像処理を行う際にサイズが大きくなり処理速度への影響がある。
・ノイズ等もあり適切な画像処理や認識ができないらしいです。

以下GPT君に聞いてみた結果です。いやぁ優秀で分かりやすい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645607/b97d8619-3c44-3472-b0bd-915a2fa7efe8.png)


## 実際に二値化してみる。
今回はSwiftへ埋め込んでいるのでobject-c++で書いてます。
全コードは最初に記載した記事へ飛んでもらうと、見ることができる。
```obj-c++
#import <opencv2/opencv.hpp>
#import <opencv2/imgcodecs/ios.h>

#import "OpenCVSample.h"

@implementation OpenCVSample

+(UIImage *)GrayScale:(UIImage *)image{
    // convert image to mat
    cv::Mat mat;
    UIImageToMat(image, mat);

    // convert mat to gray scale
    cv::Mat gray;
    cv::cvtColor(mat, gray, cv::COLOR_BGR2GRAY);

    //2値化処理
    cv::Mat binary;
    cv::threshold(gray, binary, 110, 255,  cv::THRESH_BINARY);
    
    // swift側で使用する用画像をUIImageで作成
    UIImage * grayImg = MatToUIImage(binary);

    return grayImg;
}

@end
```

撮影時の画像はいつ撮ったか覚えてないのでUIが違ったり微妙に画像違うのは無視してください。

![6E66DDFE-EF62-4604-AB3F-D4DDBF3C49A5_1_102_o.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645607/231715de-6c3d-51f5-240a-5302431bcbba.jpeg)

以下部分で二値化をしているが、この部分のtypeについて書いてみる
```obj-c++
cv::threshold(gray, binary, 110, 255,  cv::THRESH_BINARY);
```

【cv::threshold】で二値化の命令が出来る。
第４引数までは割愛するとして第五引数で二値化を行うtype指定が可能。
以下公式ドキュメント

https://docs.opencv.org/4.x/db/d8e/tutorial_threshold.html


| type |   説明|
|---|---|
|cv2.THRESH_BINARY	  |画素の輝度値が閾値を超える場合は maxval、そうでない場合は 0 に設定。  |
|cv2.THRESH_BINARY_INV |画素の輝度値が閾値を超える場合は 0、そうでない場合は maxval に設定。  |
| cv2.THRESH_TRUNC | 画素の輝度値が閾値を超える場合は閾値に、そうでない場合はそのままの値に設定。|
| cv2.THRESH_TOZERO| 画素の輝度値が閾値を超える場合はそのままの値に、そうでない場合は 0 に設定。|
| cv2.THRESH_TOZERO_INV| 画素の輝度値が閾値を超える場合は 0 に、そうでない場合はそのままの値に設定|
| cv2.THRESH_OTSU|  大津の二値化。画像のヒストグラム解析を用いて自動的に閾値を決定する手法です|
| cv2.THRESH_TRIANGLE|トライアングル アルゴリズムにより自動的に閾値を決定する手法です。 


大津の二値化記事があったので参考までに
簡単にいうと、閾値探すの大変だけど大津の閾値使えば楽！

https://qiita.com/haru1843/items/00de955790d3a22a217b
FlashアプリケーションをHTML5に変換する方法

![rectangle_large_type_2_b60af63bf166ca93b5af63cd6bf80d85.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486144/69e7bcd0-ca7f-356a-3ded-400cb811a10a.jpeg)
3年半前に発表された通り、2021年1月12日、Adobe Flash Playerは「EOL（End of Life）」に突入し、Adobeは全ユーザーに直ちにアンインストールするよう呼びかけ、私たちはAdobe Flash Playerに別れを告げた。

では、Flashベースのエンタープライズアプリケーションにとって、これはどのような意味を持つのでしょうか？

現在、社内アプリケーションには、次のような短期的なソリューションを使用しているかもしれません：

・Flashの「Enterprise Enablement」とドメインホワイトリストを使用したInternet Explorerの使用（Microsoftが2021年後半にアップデートを提供するまで使用可能です。）

・ロックされたブラウザ＋Flash Playerソリューションのライセンス供与（社内アプリケーションにのみ使用可能）

中長期的な解決策をお探しの場合、あるいは一般向けのアプリケーションをお持ちの場合、Flashを置き換えるには、HTML5でゼロからアプリケーションを書き直すという、コストと時間のかかるプロセスが唯一の解決策だと思われるかもしれません。

しかし、**CheerpX for Flash**は、ユーザーが特別なソフトウェアをインストールしたり、レガシーブラウザを使用したりすることなく、既存のFlashアプリケーションの寿命をシームレスに延長する、簡単に統合できるソリューションです。

![1707926713843-Z55WiPGVhC.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486144/f313eb92-1f40-6427-f418-5d0900312527.jpeg)

**CheerpX for Flashとは何か？**

CheerpX for Flashは、要するにJavaScript/WebAssemblyミドルウェアライブラリで、[あらゆるFlashページを純粋なHTML5に変換します](https://leaningtech.com/cheerpx-for-flash/)。つまり、ユーザーはどのブラウザからでもアクセスすることができます。

CheerpX for Flashが、社内外のB2B/B2C顧客向けアプリケーションをサポートし続けるために最適な3つの理由をご紹介します。

1 - CheerpX for Flashは、どんなFlashベースのアプリケーションでも動作

Adobe Flash Playerとそのランタイムをベースにしているため、CheerpX for Flashは、FlexやSparkなどのフレームワークを含めて、あらゆるAS2/AS3 Flashアプリケーションと互換性があります。

2 - 統合が簡単

CheerpX for Flashは、<embed>タグ、<object>タグ、またはswfobject.jsライブラリを介してFlashを埋め込む既存のHTMLページに簡単に統合できます。どのようなネットワーク、どのようなHTTPサーバーでもホストできます。アクティブなバックエンドや高価な仮想化アーキテクチャは必要ありません。

3 - エンドユーザーはインストール不要

ユーザーやクライアントのIT部門が、カスタムブラウザや拡張機能、ネイティブアプリケーションをインストールする必要はありません。

**結論**
FlashをHTML5に置き換える場合、アプリケーションの書き換えは長く複雑なプロセスとなり、重要なアプリケーションであれば現実的ではありません。CheerpX for Flashを使えば、特別なブラウザやユーザーの操作なしに、アプリケーションの寿命を無期限に延長することができます。

CheerpX for FlashがFlashアプリケーションの保存にどのように役立つかをお知りになりたい方は、こちらのリンクから[デモをご体験ください](https://leaningtech.com/contact-us/?subject=CheerpX%20for%20Flash%20information%20request#mailus)　。

https://leaningtech.com/legacy-modernisation-jp/

引用元：https://leaningtech.com/how-to-convert-your-flash-to-html5/
【React】react-springでいい感じのアニメーションをつくる

# はじめに
画面のコンテンツに良い感じの動きをつけたいな～と思って調べていたところ、簡単に動きを試せそうなライブラリを見つけたので触ってみました。

# やりかた
まずは公式サイトのチュートリアル通りに進めてみます

https://www.react-spring.dev/docs/getting-started



```tsx
import { useSpring, animated } from '@react-spring/web'

export default function MyComponent() {
  const springs = useSpring({
    from: { x: 0 },
    to: { x: 100 },
  })

  return (
    <animated.div
      style={{
        width: 80,
        height: 80,
        background: '#ff6d6d',
        borderRadius: 8,
        ...springs,
      }}
    />
  )
}
```

チュートリアルでは上のコードがサンプルとして記載されていました
画面にアクセスすると図形が左からスライドしてくるアニメーションを確認できると思います

これに少し手を加えて、左右にスライド＆無限ループさせてみたいと思います

```tsx
import { animated, useSpring } from '@react-spring/web'

export default function MyComponent() {
    const springs = useSpring({
        from: { x: 0 },
        to: async next => {
            while (true) {
                await next({ x: 100, config: { duration: 1000 } })
                await next({ x: 0, config: { duration: 1000 } })
            }
        }
    })

    return (
        <animated.div
            style={{
                width: 80,
                height: 80,
                background: '#ff6d6d',
                borderRadius: 8,
                ...springs,
            }}
        />
    )
}
```

# ポイント
- useSpringでアニメーションの状態を定義
- 今回は画面上で常に動かすため、非同期で動きをつける
- animated.divというコンポーネントにuseSpringとstyleを渡す


# おわりに
公式サイトに色々なアニメーションがサンプルコード付きで紹介されているので手軽に試すことができました！
ssh接続先のファイルを接続元のVisual Studio Codeで開こう！

## AWS EC2やオンプレマシンにあるファイルをviで編集するのきつい問題

AWSのEC2のソースコードファイルをviでいじると普段使用しているVisual Studio Codeのショートカットは当然使用できないわけで若干手間に感じていました。そんな中良さげなVisual Studio Codeのプラグインを見つけたので紹介したいと思います。

## プラグイン「Remote Development」

自分のニーズに合った最高のプラグイン「Remote Development」を発見しました。簡単に言うとssh接続先のファイルをssh接続元のVisual Studio Codeのウインドウで開くことができるのです！！

![無題のスプレッドシート_-_Google_スプレッドシート-1024x406.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/4c42af7b-92d6-b3c7-ad85-df3fee67cbeb.png)

## EC2だけではなくオンプレサーバへの接続も可能

AWSに限らず基本的にsshが繋がる環境ならssh先のファイルを開くことができます！本プラグインの仕様上Dockerコンテナ内のファイルも開くことは可能らしいですが、Dockerコンテナはドキュメントのディレクトリをマウントして開発することが多いので今回は説明を割愛します。

## 本プラグインの導入方法

下記に作業概要をまとめます。

1. プラグインを導入
1. ssh configファイルの記載
1. 確認

### 1. プラグインを導入

- こちらのリンクにアクセスします。→https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack
- 「Install」をクリックしVisual Studio Codeを開いてもいいか聞かれるので「OK」をクリックします。
- 自動でVisual Studio Codeのウインドウが開きプラグインがインストールされます。

### 2. ssh configファイルの記載

- ~/.ssh直下にあるconfigファイルを開きます。
- 下記に準ずる記載方法でssh接続先の情報を記載し、保存して閉じます。

```.ssh/config
Host 任意のわかりやすい接続先名
    HostName IPアドレス
    User 接続先ユーザ名
```

- AWS EC2のAmazonLinux2インスタンスにssh接続する際は下記の様にconfigファイルに記載します。※AmazonLinux2以外のインスタンスはUserの記載が異なる可能性があります。

```.ssh/config
Host 任意のわかりやすい接続先名
    HostName ブラウザでの接続URL
	User ec2-user
	IdentityFile 拡張子が.pemの接続キーのフルパス
```

- 記載完了後、下記コマンドを実行してssh configに記載した内容に誤りがないか確認します。ssh接続することができれば正しく記載できています。

```shell
ssh Hostの後に記載した接続先名
```

### 3. 確認

Visual Studio Codeを開き再度バーのPCモニターの様なアイコンをクリックします。

![実装する_md_—_miriwo_qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/512d7f5b-d1f9-90b0-1f21-2c99991bdc8e.png)

そうすると「SSH TERGET」の欄にssh configファイルに記載したHost名の一覧が表示されます。

![スクリーンショット_2020-08-26_18_25_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/2e04caf6-7113-95d1-568c-6fdfcca0f0e5.png)

Host名の部分にマウスポインタを持っていくとHost名右側にファイルの様なアイコンが表示されるのでクリックします。

新しくVisual Studio Codeのウインドウが開きssh接続先にログインします。（ssh接続時にパスワードなどの認証情報の入力が必要な場合、このタイミングでパスワードの入力を求められます。）本ウインドウはssh接続先にログインされており、ターミナルも接続先の物になっています。

![Visual_Studio_Code.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/3df35695-62fd-6c4d-dc02-1d57c089130d.png)

ちなみにssh接続先のHost名がウインドウ左下に表示されているのでどのウインドウがリモートのウインドウか一目瞭然です。

![Visual_Studio_Code-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a364800a-b049-42ff-fe8f-8f4e4bd2c350.png)

あとは編集したいソースコードファイルを「codeコマンド」でも「フォルダーを開く」からでも開いて編集するだけです。以上で作業完了になりました。お疲れ様でした！

## あとがき

自分が最近多用しているとっても便利なプラグインの紹介でした！！
自分自身最高に便利と思って使っていますが、「こんなプラグイン使わなくてももっといい方法あるのに！」などありましたら教えていただけたら幸いです！
DroidKaigi の開発体制に関する発表資料まとめ

#

過去の DroidKaigi の発表のうち、開発体制に関する発表のみをまとめました。
今の開発体制に課題があると感じている人のヒントになれば幸いです。

- DMM
  - 2023 年
    - [DroidKaigi 2023 突撃！隣のコードレビュー](https://speakerdeck.com/satotaichi/droidkaigi2023-tu-ji-lin-nokodorebiyu)
  - 2021 年
    - [DMMでのAndroidアプリ開発について](https://ninjas.droidkaigi.jp/post/dmm/)
- メルカリ
  - 2022 年
    - [Android/iOSアプリを協調開発するチーム 〜スクラム開発の実践とその先へ〜](https://speakerdeck.com/fumiyakume/droidkaigi-android-iosahuriwoxie-diao-kai-fa-surutimu-sukuramukai-fa-noshi-jian-tosonoxian-he-1)
  - 2021 年
    - [メルカリ・メルペイのAndroid開発の特徴と実態](https://ninjas.droidkaigi.jp/post/mercari/)
- Timers
  - 2021 年
    - [職能/職種横断でチームの生産性を高める](https://speakerdeck.com/akatsuki174/zhi-zhong-heng-duan-tetimufalsesheng-chan-xing-wogao-meru)
- ゆめみ
  - 2021 年
    - [ゆめみの開発事例](https://ninjas.droidkaigi.jp/post/yumemi/)
- 楽天
  - 2021 年
    - [日本のEC市場を牽引する楽天サービスのAndroidアプリ開発](https://ninjas.droidkaigi.jp/post/rakuten/)
- Mobility Technologies
  - 2021 年
    - [タクシーアプリ「GO」を支えるAndroidアプリ開発チーム](https://ninjas.droidkaigi.jp/post/mobility-technologies/)
- クックパッド
  - 2021 年
    - [クックパッドでの多様なAndroid活用事例と開発上の取り組み](https://ninjas.droidkaigi.jp/post/cookpad/)
- サイボウズ
  - 2021 年
    - [サイボウズの Android アプリ開発 3 年間の軌跡](https://ninjas.droidkaigi.jp/post/cybozu/)
- メドピア
  - 2021 年
    - [医療をテクノロジーで変革できる会社がここにある！](https://ninjas.droidkaigi.jp/post/medpeer/)
- ヘイ
  - 2021 年
    - [STORES 決済 開発事例紹介　〜決済サービスを支える Android アプリの裏側〜](https://ninjas.droidkaigi.jp/post/hey/)
- ココナラ
  - 2021 年
    - [急成長するサービスでマルチモジュールを導入する](https://ninjas.droidkaigi.jp/post/coconala/)
- ウォンテッドリー
  - 2021 年
    - [「はたらくすべての人のインフラ」を目指して](https://ninjas.droidkaigi.jp/post/wantedly/)
- ビズリーチ
  - 2021 年
    - [ビズリーチのリニューアル時のアーキテクチャ選定と、ストアの評価を上げるグロース体制](https://ninjas.droidkaigi.jp/post/bizreach/)
- リクルート
  - 2021 年
    - [大規模飲食アプリ『ホットペッパーグルメ』のフルリプレイスにおけるKMM活用事例](https://ninjas.droidkaigi.jp/post/recruit/)
- チームラボ
  - 2021 年
    - [課題を解決することに全力を尽くす](https://ninjas.droidkaigi.jp/post/teamLab/)
- サイバーエージェント
  - 2021 年
    - [新しい未来のテレビ「ABEMA（アベマ）」の開発事例紹介](https://ninjas.droidkaigi.jp/post/cyberAgent/)
- ヤプリ
  - 2021 年
    - [ノーコードのアプリプラットフォーム「Yappli」開発事例](https://ninjas.droidkaigi.jp/post/yappli/)
- ビットキー
  - 2021 年
    - [餅は餅屋、BLEはBLE屋](https://ninjas.droidkaigi.jp/post/bitkey/)
- ルームクリップ
  - 2021 年
    - [チーム力で挑む！妥協しないコミュニケーションでプロダクト開発の最適解を追求](https://ninjas.droidkaigi.jp/post/roomClip/)
- ミクシィ
  - 2021 年
    - [スピードと品質でブレないプロダクト開発](https://ninjas.droidkaigi.jp/post/mixi/)
- ZOZO
  - 2021 年
    - [ZOZOの開発事例](https://ninjas.droidkaigi.jp/post/zozo/)
【個人開発】マイクラの建築物配布サービスを作ったメモ part2

### はじめに

https://qiita.com/soradore_/items/a7caa7a371fc25181a6f

先日投稿した記事からさらに色々追加したのでメモ

作ったサービスは以下です
https://poscra.com/


### 追加要素
- 記事への埋め込み画面
- 3Dモデルのカメラ設定保存

### 記事への埋め込み画面
こちらは何かというと3Dモデルをiframeで読み込めるようにした形です。
Figmaとかの埋め込みを参考にデザインしました。
詳細ページに埋め込みタグをコピーできるボタンを設置してます。

![スクリーンショット 2024-02-05 6.52.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178346/ab6cfcdd-6d47-721b-fc57-3ca3bedfd8c5.png)

やった内容としては画面いっぱいにCanvasを広げて表示することと、
Figmaのように下部にロゴやリンクなどを置きました。

埋め込む際のセキュリティ的な設定の部分では
レスポンスヘッダに X-Frame-Options で SAMEORIGINが設定されていると外部サイトに埋め込めないので
埋め込みページだけ除外してヘッダを設定するように LaravelのMiddlewareを設定しました。


```Kernel.php
<?php
// 省略
protected $middlewareAliases = [
                :
                :
                :
    'xframe' => \App\Http\Middleware\XFrameSameOriginMiddleware::class,
];
```

```XFrameSameOriginMiddleware.php
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class XFrameSameOriginMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {
        $response = $next($request);
        $response->headers->set('X-Frame-Options', 'SAMEORIGIN');
        return $response;
    }
}
```

```web.php
Route::group(['middleware' => ['xframe']], function() {
    // 埋め込みページ以外に上記のMiddlewareを設定
});

Route::get('埋め込みページ', function(){});
```
自分の場合Nginxの設定を見るとデフォルトで上記のヘッダが付くようになっていたので、合わせてチェックしました。

### 3Dモデルのカメラ設定保存
埋め込みも追加したことで、3Dモデルを表示する際の画角などを設定できるようにしたいということで、
調べてやりました。

結果としては以下の記事を参考にしました。
https://discourse.threejs.org/t/how-to-save-the-exact-position-of-camera/26815/3

やった内容ですが、
まずLivewireのコンポーネントの変更とテーブルのカラム追加で
画角やカメラの位置などをDBに保存するので、それ用のプロパティを追加しました。
中身はJSONです。

投稿時と編集時のサムネイルを設定するボタンを押した際に上記のプロパティに反映されるようにjsを修正

$wire はそのままだと使えなかったんですがスクリプト部分を
```@script  @endscript``` で囲めば使えました
```javascript
document.addEventListener('サムネイル設定イベント', (ev) => {
    // このイベントはコンポーネントで発火してます

    // コンポーネントに　$attachment_options　を追加してます
    $wire.$set(
        'attachment_options',
        {
            position: camera.position,
            rotation: camera.rotation,
            zoom: camera.zoom,
            target: controls.target
        }
    );
});
```

あとは表示部分でDBから取ってきたJSONをいい感じにして
camera, orbitcontroleに入れる

### 今後追加したい機能
- 記事投稿機能
    - 埋め込みを使って記事を書けるようにしたい
- ユーザごとのページ作成
    - あわよくばフォローしたりされたりできれば
Hexabase Flutter SDKの使い方（ラジオ・選択肢・チェックボックスの値指定）

[Hexabase（ヘキサベース）](https://www.hexabase.com/)は企業向けのBaaS（Backend as a Service）を提供しています。認証やデータストア、ファイルストレージ、リアルタイム通知などの機能があり、企業向けのシステム開発に必要な機能をまるっと提供しています。

APIはREST APIとGraphQLを提供しています。そのAPIをラップしたSDKも開発を進めています。SDKは現在、TypeScriptとDart向けに開発しています。Dart向けのSDKは、もちろんFlutterでも利用できます。

この記事ではFlutter SDKについてインストールと、ラジオ・選択肢・チェックボックスの値指定を行う方法を解説します。

## パッケージとソースコード

パッケージはpub.devで公開しています。

[hexabase | Flutter Package](https://pub.dev/packages/hexabase)

ソースコードはGitHubにて公開しています。ライセンスはMIT Licenseです。

[hexabase/hexabase-dart: Hexabase SDK for Dart & Flutter](https://github.com/hexabase/hexabase-dart)

## インストール

インストールは `dart pub get` で行えます。

```
dart pub get hexabase
```

## インポート

SDKをインポートします。

```dart
import 'package:hexabase/hexabase.dart';
```

## 初期化

まずインスタンスを作成します。

```dart
var client = Hexabase();
```

別なファイルで再度インポートした場合には、以下でインスタンスを取得してください。

```dart
var client = Hexabase.instance;
```

## アイテムの作成

データストア（クラウドデータベース）の行相当のデータがアイテムです。以下のようにして、新しいアイテムを作成します。

```dart
await client.setWorkspace('YOUR_WORKSPACE_ID');
var project = await client.currentWorkspace.project(id: 'YOUR_PROJECT_ID');
var datastore = await project.datastore(id: 'YOUR_DATABASE_ID');
// アイテムを作成
var item = await datastore.item();
```

## ラジオ・選択肢・チェックボックスの値を作成

ラジオと選択肢は一つの値を設定します。チェックボックスは複数の選択肢を設定できます。いずれも管理画面にて、項目を作成します。


項目は日英、どちらも作成できます。

## 選択肢の取得

選択肢の内容は、データストアオブジェクトから取得できます。

```dart
var field = await datastore.field('test_select');
var options = field.options;
```

`options` は `List<HexabaseFieldOption>` で、たとえば以下のプロパティがあります。これらの項目を使えばラジオボタンやチェックボックスを表示できるでしょう。

- id
- value
- displayId

## 値の設定

ユーザーが項目を選択した場合には、以下のように値を設定します。

```dart
item.set('test_select', value);
```

この時 `value` は以下のいずれかを指定します。

- HexabaseFieldOption
- id
- value
- displayId

### チェックボックスの場合

チェックボックスは複数の選択肢を取れるので、Listで指定します。指定できる項目は上記と同じです。

```dart
item.set('test_checkbox', [value1, value2]);
```

## まとめ

Hexabaseでは管理画面で項目を設定することで、アプリケーション側を修正することなく選択肢を変更したり、値をセットする際にバリデーションが行えます。柔軟なシステム開発に役立ててください。

HexabaseのFlutter SDKを使って、堅牢なWebアプリケーションを開発してください。

[hexabase \| Dart package](https://pub.dev/packages/hexabase)