OmniAICreator/Qiita-1.07M huggingface dataset:
デザインパターンについて

# はじめに
　デザインパターンについて学んだので、まとめていきます。


# デザインパターンとは
　デザインパターンとは、オブジェクト指向言語(Java, C++, C#など)でよく使われる設計をパターン化して、最適な方法でプログラミングを行えるようにするテクニックです。
 　複雑化するソフトウェア開発の効率化および信頼性向上のためにパターンの利用が有効であるという考えのもとに、広く知られています。

 # デザインパターンを学ぶ上で、理解しておくべき概念
　デザインパターンを理解する上で、OOP言語を使用する上で必須となる、以下のテクニックについて解説します。
### 継承
　継承とは、他のクラスを継承することで、継承したクラスに定義している関数を利用できるようにする仕組みです。これにより、コードの再利用性や拡張性が向上します。
 詳しくはこちらを見てみてください。
 
 https://medium-company.com/java-%E7%B6%99%E6%89%BF/
 
### ポリモフィズム
　ポリモフィズムとは、ある一つの関数の呼び出しに対し、オブジェクトごとに違う動作をすることを指します。以下の記事でわかりやすくまとめられているので参考にしてください。

 https://medium-company.com/%E3%83%9D%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%95%E3%82%A3%E3%82%BA%E3%83%A0/
 
### コンポジション
　コンポジションは、異なるクラスのオブジェクトを組み合わせて新しい機能を提供する方法を指します。これは、継承に代わるオブジェクトの再利用の手段として利用されることがあります。
以下を参考にしてください。

https://qiita.com/mikamikuh@github/items/1cdcd8b25a2e23f10525

# デザインパターンを使用する目的
### 再利用性の向上
　デザインパターンは、特定の文脈で成功している設計アイディアやソリューションを提供するため、これらを再利用することができます。
　再利用性が高まることで、同じまたは類似の問題に対して同じパターンを適用することができ、コードの冗長性を減少させます。

### 柔軟性と拡張性の向上
　デザインパターンは、ソフトウェアの変更や拡張に対して柔軟で堅牢な設計を提供します。
 　新しい機能や要件が追加された場合、デザインパターンを使用することで、既存のコードを変更する必要が少なくなり、容易に拡張できるようになります。

### 共通の語彙の提供
　デザインパターンは、共通の語彙やアーキテクチャを提供します。これにより、開発者やチームがコミュニケーションを円滑に行うことができ、共通の理解を持つことができます。
 　これはプロジェクトのコミュニケーションと協力を促進し、開発者間の一貫性を保つのに役立ちます。

### パターンの理解による設計スキル向上
　デザインパターンを理解し、適切な文脈で使用できるようになることで、開発者の設計スキル向上に繋がります。これにより、より効果的で効率的なソフトウェア設計が可能となります。

# 主なデザインパターンの種類
　デザインパターンは、23種類存在します。以下がその種類をまとめた参考記事になります。

https://qiita.com/ichi-nakashima/items/ee09c9341f85c18f748a

　デザインパターンには23種類ありますが、それらは、「生成」、「構造」、「振る舞い」3種類に分類されます。
## 生成デザインパターン
　オブジェクトは必ずはじめに生成されます。その生成をどのように行うかという問いに対するパターンになります。
 　これらのパターンは、オブジェクトの生成と初期化の方法を隠蔽し、柔軟性と再利用性を向上させることを目的としています。代表的な生成デザインパターンには以下が含まれます。以下が代表例です。
### ・Builderパターン
　元となるオブジェクトを生成し、それをもとに複数のオブジェクトをを生成するパターン。
### ・Abstract Factoryパターン
　インスタンスの生成をサブクラスに委任し、具体的な生成処理をサブクラスで実装するパターン。
### ・Singletonパターン
　クラスが一つのインスタンスのみを持つようにするためのパターン。

## 構造デザインパターン
　オブジェクトは一つだけでなく複数のオブジェクトが必ず使われますが、構造デザインパターンは、その組み合わせのパターンに焦点を当てています。
 　これにより、システムの構造を柔軟に変更できるようになります。以下が代表例です。
### ・Adaptorパターン
　互換性のないクラス同士を関連付けるパターン。
### ・Bridgeパターン
　機能を拡張するクラスと、実装をするクラスを分離し、相互の橋渡しを行うパターン。
### ・Decoratorパターン
継承は使用せず、オブジェクトに新しい機能を次々に追加して、拡張ができるようにしたパターン。

## 振る舞いデザインパターン
　それぞれのオブジェクトは、必ずやり取りをします。振る舞いデザインパターンは、オブジェクトが協力し、役割を分担する方法に焦点を当てています。以下が代表例です。
 
### ・Command
　操作をオブジェクトとして定義するパターン。
### ・Iterator
　コレクションに対する、探索の振る舞いを定義し、イテレータと呼ばれるオブジェクトへ抽出するパターン。
### ・Observer
　一対多の依存関係を定義し、状態変化に応じて処理を実行するパターン。

# まとめ
　デザインパターンは、効果的なソフトウェア設計を行う上で、必須になってきます。かなり奥が深いので、これからも学び続けていきたいなと思います。

# 最後に
他にも色々な記事を書いているので、よければ読んでいってください、、、

https://qiita.com/hukuryo/items/97797a91d7e2ee0bcabc

https://qiita.com/hukuryo/items/2c07c52ff3386d5d75b9

https://qiita.com/hukuryo/items/ebeb26823f944f143b11
PythonでSeleniumを使ってFirefoxのプロキシを通したい！

## この記事で伝えたいこと
::: note info
↓↓↓httpsにプロキシを設定したいときはこれを使おう↓↓↓
profile.set_preference("network.proxy.type", 1)
profile.set_preference("network.proxy.ssl", "hogehoge")
profile.set_preference("network.proxy.ssl_port", 8080)
:::

::: note warn
なんでhttpsじゃなくてsslなのかは調べてないよ
(単純にそういう名前じゃないからって言われたらそうなのかもしれない)
プロキシについてうまく理解してないので、そもそもプロキシを通すとか間違ってたらごめんなさい。
:::

## 大事なこと
~~スクレイピングの話題ってなんとなく、危ない気がしなくもないですが・・・~~
**スクレイピングを使用するときは用法用量を守りましょう。
サイト側で定められていることなどは、ちゃんと読みましょうね...。**

## 概要
備忘録がてら、微妙に詰まったのでまとめてみました。

ところで、会社とかに所属してるとサイトによってはプロキシ通さないと接続できないとかありますよね？
(この辺正直ちょっと曖昧です。)

自分のPC自体の設定でプロキシ通ってたりしても実際スクレイピングしてるPC(リモート接続してる時とか？)はプロキシ通ってない、って場面ありませんか？~~ありますよね？~~

また、PCの設定を直接いじるのはみんな使ってるし億劫だななんて事あると思います。

## 本題
そんなときはこれ！

```Python
profile.set_preference("network.proxy.type", 1)
profile.set_preference("network.proxy.ssl", "hogehoge")
profile.set_preference("network.proxy.ssl", 8080)
```

このコードを使うことで、下記のようなFirefoxの設定を書き換えたのとおなじになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676003/9ea8a403-b7f6-ea6c-ee57-d6f79717bb7c.png)
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676003/bb90c34b-06b6-6f6d-b31b-27ffb4da0dc7.png)

スクリーンショットでは何も書き込んでいませんが、これは「手動でプロキシーを設定する」「HTTPSプロキシー」に「hogehoge」と入れて、「ポート」は「8080」とすると同意義です。
※「http\://hogehoge:8080/」のような形の場合の話です。

逆に言ってしまえば、Firefoxの設定を手でいじれる環境だとするならばここの設定をいじってあげればよいのです。
また、以下のように変えるとHTTPやSOCKSの項目にも値を入れることができます。
```Python
profile.set_preference("network.proxy.type", 1)
profile.set_preference("network.proxy.http", "hogehoge")
profile.set_preference("network.proxy.http", 8080)
# もしくは・・・
profile.set_preference("network.proxy.type", 1)
profile.set_preference("network.proxy.socks", "hogehoge")
profile.set_preference("network.proxy.socks", 8080)
```

## 余談
冒頭にも書きましたが、なんで「https」ではなく、「ssl」なんでしょうかね？
調べてないのでわかりませんが、どこかに書いてあったりするんでしょうか？
筆者はなんで「network.proxy.https」じゃ動かないんだろうと地味に悩まされました。

なんだか、短い気がしなくもないですが・・・
また前回から1ヶ月近くあいちゃったし、とにかく書くのが大事やろの精神で書きました。

## 参考
https://kb.mozillazine.org/Network.proxy.type

https://docs.proxymesh.com/article/142-using-selenium-in-the-proxy
【ChatGPT無＋MS-ImageCreator】プロンプトを作成して、与えてみる。


　どうも、カーブミラーです。

　今回は、ChatGPT無料版にプロンプト作成を依頼して、それをImageCreatorに渡して描画をしてもらいます。

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　以前に、
　　Bingを使って、
　　　ImageCreatorに
　　　　描かせる、という
　　　　　ことをやりました。

　もちろん、
　　Bingにプロンプトを渡して、
　　　描画してもらうことも
　　　　可能です。
***
　それなら
　　なぜ、ここで書くのか。

　Bingが遅いから、ですw
　　これはBingが検索に
　　　時間を掛けるため。

　検索するつもりはなくとも、
　　Bingは与えられたプロンプトを
　　　まずは検索するもの、として
　　　　解析します。
　　　　　（私感ですが）

　それで、
　　プロンプトが検索目的ではない、
　　　と判断すると、
　　　　そこでようやく
　　　　　ImageCreatorに
　　　　　　プロンプトを
　　　　　　　渡すわけです。

　おそらく、
　　渡す前に、
　　　検閲していることでしょうねw

　ImageCreatorに渡すまでに
　　時間が掛かるのは、
　　　このためです。

　ならば、
　　ImageCreatorに
　　　直接、プロンプトを
　　　　渡せばいいじゃないか。

　でも、
　　そのプロンプト、
　　　ImageCreatorに
　　　　渡せるものに
　　　　　なっていますか？
***
　そこで、
　　ChatGPTさんに要望を伝えて、
　　　渡すプロンプトを
　　　　作成してもらうわけです。

　ちなみに、
　　ImageCreatorの中身は、
　　　DALL-E3ですよね。

　しかし、
　　今現在のChatGPT無料版は、
　　　DALL-E3を知りません。
　　　　DALL-E2までの
　　　　　知識なんです。

　その点は、
　　加味するべきですね。

　それでも
　　万全を期すために
　　　番号を外して、
　　　　DALL-Eへのプロンプトだと
　　　　　ChatGPTさんには
　　　　　　言います。

　まずは、
　　Promptから。
```Text:ICに渡すプロンプト作成Prompt
DALL-Eに渡すプロンプトを以下の情報から考えてください。
・（箇条書きで描画する内容を）
・　︙

出力内容
・英文プロンプト
・それを和訳したもの
```

　では、
　　やり取りです。
***
***User***
DALL-Eに渡すプロンプトを以下の情報から考えてください。
・断崖絶壁に掘られた像
・像は自由の女神

出力内容
・英文プロンプト
・それを和訳したもの

***ChatGPT***
もちろんです。英文プロンプトは次のようになります:

"Create an image of a statue carved into a sheer cliff, depicting the Statue of Liberty."

それを和訳すると:

「断崖絶壁に掘り込まれた、自由の女神を表す像を作成してください。」
***
　この出力された内容を
　　チェックしてください。

　依頼内容とは違う場合、
　　入力したPromptを修正して、
　　　再度、出力してみてください。

　整ったら、
　　ImageCreatorに
　　　英語プロンプトを渡します。

　日本語でも構わないのですが、
　　英語の方が、出力結果が
　　　いいようです。←私感ですw

　描画の結果に
　　不満があれば、
　　　またPromptを修正します。

　あるいは、
　　英語プロンプトを
　　　直接修正するか、
　　日本語プロンプトを
　　　修正してから、
　　　　ChatGPTさんに
　　　　　英訳してもらってください。
***
　ちなみに、
　　上記のやり取りで
　　　生成されたのが、
　　　　こちらです。
![_e23d6b5c-1f91-4439-8e4c-bfe471b0f248.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/ffcf8701-3b3d-5e8d-1e88-d9666582012f.jpeg)

　なんか、
　　映画『猿の惑星』の
　　　ラストシーンを思い出しました。

　今回は、ここまで。
Vue3で子エレメントの外側を別のエレメントでラップする方法1 - 子エレメントが静的に固定で渡される場合

# 導入
今日の話題はVue3で子エレメントの外側を別のエレメントでラップする方法についてです。

:::note info
※ 私が株式会社愛宕 Advent Calendar 2023に書く記事は主に社内向けに共有しておきたいけど勉強会をするまでもないちょっとしたTipsにしたいと思います。
:::

言葉で表すとわかりにくいのでコードを例示します。

次のような構造になるようなコンポーネントを作りたいとします。`<div>hoge</div>`の部分は子エレメントとして用途に応じて差し替えるようにしたいです。
```html
<div class="group">
  <div class="group-item">
    <div>hoge</div>
  </div>
  <div class="group-item">
    <div>fuga</div>
  </div>
  <div class="group-item">
    <div>piyo</div>
  </div>
</div>
```

そこで、次のように書いてみることにします。Vue3のSFC(single file component)を想定しています。

```vue: app.vue
<template>
  <ExampleGroup>
    <div>hoge</div>
    <div>fuga</div>
    <div>piyo</div>
  </ExampleGroup>
</template>
```

```vue: ExampleGroup.vue
<template>
  <div class="group">
    <div class="group-item">
      <slot/>
    </div>
  </div>
</template>
```

と書いても当然、
```html
<div class="group">
  <div class="group-item">
    <div>hoge</div>
    <div>fuga</div>
    <div>piyo</div>
  </div>
</div>
```

となるだけで、目的の構造にはなりません。
子エレメントをそれぞれ分解してその一つ一つを別のエレメントでラップするにはどうすればいいでしょうか？

# 解決

slotの中のvnodeを取り出して`v-for`でループします。取り出したvnodeは`<component>`の`is`に渡して描画しましょう。

```vue: ExampleGroup.vue
<template>
  <div class="group">
    <div class="group-item" v-for="vnode in $slots.default()>
      <component :is="vnode"></component>
    </div>
  </div>
</template>
```

こうすることでslotに渡した子エレメント全てに`<div class="group-item">`でラップすることができます。
Google Play (Androidアプリ)の新しい個人アカウントのルールについて考える

> as well as steer users away from lower-quality ones
> Googleは、ユーザを低品質なアプリから遠ざける取り組みを発表しました。

https://android-developers.googleblog.com/2023/11/ensuring-high-quality-apps-on-google-play.html

# Google Playの新しい個人アカウントのルール

この時点でかなりのパワーワードなのですが、そのための新しい個人アカウントのルールが発表されました。この背景には、アプリのインストール数と、ユーザのエンゲージメントの量が約3倍も変わるアカウントのアクティビティの差があったということです。そのアクティビティとは、 __公開前にアプリのテストツールを使うか使わないかだったということです。__

Google Play Consoleのテストツールには「内部テスト」「クローズドテスト」「オープンテスト」がありますが、個人開発者アカウントがアプリをリリースするためには、「クローズドテスト」を少なくとも2週間、少なくとも20人でアプリをテストすることが義務付けられます。以前はアプリの即時公開が許可されてたので、とても大きな変更となります。

https://support.google.com/googleplay/android-developer/answer/14151465?hl=en

個人的には、詐欺や不正行為が法人アカウントと個人アカウントで大きな差があったのかなとか、個人開発者のプロダクトがあまりに低品質なものが多く、レビューでは対応しきれなかったのかなとか背景にいろいろ想像を巡らせるところですが、一方で個人が20人以上のアプリテストユーザを確保して、毎リリース毎にテストしてもらうのはかなりハードルが高くなるのではないかと思っています。

> テスターが14日間継続してオプトインする必要があります
> テスターに参加したものの14日未満のテストユーザと、14日を15日以上かけたテストユーザ（※1日でも間があいたユーザ）はカウントされません
https://support.google.com/googleplay/android-developer/answer/14151465?hl=en#zippy=%2Care-there-any-more-best-practices-for-testing-that-i-might-find-helpful%2Cwhat-do-you-mean-when-you-say-testers-must-be-opted-in-for-the-last-days-continuously-before-i-can-apply-for-production

~~多分テスト20ユーザ代行ビジネスが流行ります。~~


# Java/Kotlin開発者は苦難の時代に

将来的には様々な対応法が生まれるかとは思いますが、正直なところ、個人開発でJavaやKotlinを本番で使うのは現実的ではなくなったように感じます。使う場合は、誤字脱字レベルの修正レベルでも、2週間、少なくても20人でのテストが求められるって本当？！と思い続けてるのですが、現時点では本当のようです。

JavaやKotlinではLive Updateの仕組みは規約違反になるので、このベストプラクティスに従ってテストを行う以外に現時点では選択肢はないようです。


## CapacitorやReact NativeユーザはLive Updateを使おう

CapacitorやReact NativeユーザはLive Updateが可能なので、これを更新戦略の軸に取り入れる必要があります。Google Playでは、 [更新アルゴリズムでJavaやKotlinのネットワーク経由での更新は禁止していますが](https://support.google.com/googleplay/android-developer/answer/9888379?hl=en)、これはWebアセットには適用されません。

> This restriction does not apply to code that runs in a virtual machine or an interpreter where either provides indirect access to Android APIs (such as JavaScript in a webview or browser).
> Android API (Web ビューやブラウザーの JavaScript など) へのアクセスが制限されているコードには適用されません。

ですので、Webアセットはネットワーク経由で更新し、プラグイン等のネイティブ部分は審査を受けるという切り分けを行うことができます。そのため、今まで以上にメジャーアップデートとマイナーアップデートの区別が重要になるでしょう（ここでのメジャーバージョンなどの考え方は、セマンティックバージョニングに従っています）。

まずメジャーアップデートは、プラグイン等ネイティブ部分の更新を含むものです。これは審査を受けるしかないので、20人2週間を前提にプランを立てましょう。多くのコミュニティでは、相互にテストをするチャンネルの用意がはじまってるようです。例えば、Capacitorは [discordに #app-testers](https://discord.gg/8e2Kf27T) というチャンネルを用意したようです。友人知人だけではなく、こういったコミュニティに参加して相互にテスターになるのはひとつの手です。

そして、マイナー、パッチアップデートはLive Updateを利用しましょう。Webアセットの更新ですので、Capacitorの場合、Ionic teamが公式で提供しているAppFlowの利用が可能ですし、またコミュニティで `capacitor-updater` というプラグインがでているので、これも利用可能です。

https://github.com/Cap-go/capacitor-updater

# まとめ

この変更に対するGoogleの根拠は正当であり、この変更により、Google Playを利用するユーザはより優れた体験を得ることができると思います。開発者が徹底的にテストを推奨しているだけですので。

一方、私たち開発者としてはこの流れ（※個人的に法人アカウントもいつこの変更がきてもおかしくないと思っています）の中で、どのようにアプリの質を高めたまま、より早いリリースサイクルをつくっていくか、いろいろな方法を考えていきたいですよね。

それではまた。
Filemakerで[URLから挿入]でファイルをアップロードする

## 結論
multipart/form-dataで送信するには、cURLオプション-Fをつかいます。

```shell
-F image=@$file
```
$fileには、オブジェクトフィールドを転記しておいてください。
imageは、フィールド名なのでアップロード先にの仕様に合わせてください。

## 経緯

multipart/form-dataで送信しようとしたところ嵌まりましたので、解決先を載せておきます。
Filemakerの[URLから挿入]でファイルをアップロードする方法を調べると、
[公式](
https://help.claris.com/en/pro-help/content/insert-from-url.html?Highlight=Insert%20From%20URL)でもcURLオプションで--upload-file $fileを使うように書いてありますが、リクエストヘッダのcontent-typeがapplication/jsonになってしまいます。

## 環境

Filemaker 19
計算物理班紹介

PhysicsLab. 2024 計算物理班の紹介記事です。
## 計算物理について
計算物理は、計算機[^comp]を用いて物理系を調べる物理の一分野です。

物理理論が解析的に解ける系は単純で性質が良いものがほとんどですが、実験で扱う系は一般に複雑で[^comple]、理論の適用できる形に持ち込むためには大胆な近似が必要になってしまいます。計算物理は実験系に理論式を当てはめて、計算機でゴリゴリ解いてやることでより正確な予測結果を得て、理論と実験の間をつなぐことができます。いわゆる物理シミュレーションというものです。

計算物理の取り扱う範囲は、具体的な系のシミュレーションが主領域ではありますが、周辺にシミュレーションの最適化、シミュレーションそのものの性質の研究など、情報科学や数学に近しい領域も広がっています。これは計算機を用いたことから生える制約のためです。計算機には時間と誤差がつきまといます。つまり、計算速度と計算精度がトレードオフを成します。そこでより優れた手法(アルゴリズム)を使って高速・高精度を同時に実現しようとしたり、或いはこのトレードオフの限界を探ったり[^neu]するわけです。

物理系を実際のシミュレーションプログラムに落とし込むとき、一般には
1. 数学的問題への帰結
2. アルゴリズムの最適化[^calc]
3. 計算資源の活用[^calc]
 
の順に行い、扱う対象は物理理論→数学的問題→アルゴリズム→プログラムと変遷していきます。以下ではそれぞれのステップをより詳しく見ていくことにします。

### 数学的問題への帰結
物理の基礎方程式を数学的問題に変換することで数値解析の適用範囲に持ち込むわけですが、系の性質を考えることで用いるべき計算手法の指針を得ることができます。
基礎方程式に頻出する微分方程式を例とすると、高周波成分がなければフーリエ変換して解く、ハミルトン系であればシンプレクティック解法を用いる、というように、系の性質から比較的誤差が小さいが計算量を大きく落とせる方法を選べるわけです。

### アルゴリズムの最適化
計算機以前から存在し、また計算機とともに更なる発展を遂げた数値計算には無数の計算手法が存在します。主要な問題に対しては典型的な解き方が定まっているものの、現在でもアルゴリズムの改善が行われています。ここでは代表的な問題について主な手法を紹介します。

- 微分方程式
物理で頻出する微分方程式は、基本的に差分化して解くことになります。差分化とは、例えば関数$f$の微分$\frac{df}{dx}$があった時に、$\frac{f_{i+1}-f_i}{\Delta x}$のように、$f$の離散的なサンプル点での値で近似する操作です。極論すれば、微分方程式の数値計算はこの近似誤差をいかに抑えこむかということに尽きます。大きく陽解法と陰解法の2本があって、陰解法の方が誤差が発散しないなど安定なのですが、連立方程式に帰着してそのままでは計算が困難なことが多く、次で述べる行列計算の助けを借りることになります。
- 行列計算
差分法の陰解法から現れる連立方程式が一次であれば、これは逆行列を求めることに等価ですし、量子系で頻出の固有状態を求める問題は、同じく差分化を通して固有値問題に帰着します。このように行列計算は数値計算におけるサブルーチンとしての色が強く、あちこちで頻出する重要な要素です。
連立一次方程式には専らLU法が使われますが、固有値問題ではQR法やヤコビ法、べき乗法など複数の手法が使い分けられています。また疎行列は密行列と違うアルゴリズムを選ぶことで無駄がなくなり、大きく高速化できます。
- 乱数
統計力学や多体量子系で扱うような自由度の莫大な空間では、精度を上げようと迂闊に系を大きくすると、たちまち計算量が指数的に爆発します[^count]。このような系では全体を調べるのを諦め、乱択アルゴリズムから平均的な振る舞いを見るモンテカルロシミュレーションがよく使われます。前回の五月祭で統計物理班が演示していたMCMC法([同記事](https://qiita.com/nattyo_1226/items/a789ee782756d9fe2ef6))もその一種です。また、当班の最終目標でもある格子QCD(格子量子色力学)もモンテカルロ法を用いています。
### 計算資源の活用
問題の形式やアルゴリズムの改善にも限界があり、本質的に大きな問題を解くには計算資源を増やす他ありません。かつての計算速度向上は専らクロック周波数の(指数的)増大によって担われていましたが、これが2000年頃に頭打ちになって以降、大規模な計算資源では並列計算ユニットが使われています[^masa]。近年ではGPGPUが使われることも多いですし、またメモリキャッシュやパイプライン処理などの最適化技術も速度に影響してきます[^opt]。こうした高速化技術の多くは適切な実装によって初めて活きてくるもので、実装がアーキテクチャを考慮しているか否かで計算速度が大きく変わってきます。

近年では高水準言語の数値計算ライブラリも充実してきており、詳細な実装に踏み込まずとも計算資源の恩恵を受けられるようになってきていますが、低レイヤの知識を持っていることは計算機をよりよく活用する実装を書くには欠かせないでしょう。
## 班について
計算物理班は今年新設の班です。Phyics Lab. ~~2017~~ 2019にもあったらしく、~~7~~ 5年ぶりの復活ということになります。
### 普段の活動
色々な系のシミュレーションを通して数値計算の手法を学んでいます。また型理論ゼミのような情報数学に近しい領域のゼミもあります。また内部Discordやホームページ整備等を担当するWeb班のメンバーは計算物理班のメンバーから構成されており、事実上の裏方担当でもあります。
### 五月祭
五月祭ではシミュレーションの展示とポスター解説を予定しています。計算の実行場所として、Web上、パソコン上、物理学科計算サーバ上を考えています。

[^comp]: コンピュータ。
[^comple]: 原因として、観測装置の影響・粒子数の多さ・歪な外場などが挙げられる。
[^neu]: フォン・ノイマンの安定性解析など。
[^calc]: この辺りは数値計算と共通。
[^count]: 例：[数え上げお姉さん](https://www.youtube.com/watch?v=Q4gTV4r0zRs)。
[^masa]: ちょっとマサカリが飛んできそうで怖い。
[^opt]: 行列行列積のループ処理などは顕著な例だろう。
デジタルキューブに転職したら学習意欲が増し増しになった

この記事は デジタルキューブ ＆ ヘプタゴン Advent Calendar 2023 の 12月8日分の記事として執筆しています。
https://qiita.com/advent-calendar/2023/digitalcube-heptagon
***

2023年11月1日付でデジタルキューブに入社、2023年4月から立ち上げた営業企画部所属の藤田です。

Advent Calendarは、エンジニアの方々が技術的な内容を書くもの、と勝手に思っておりましたが、「誰が何書いてもいいんだよ」と、広報の<a href="https://qiita.com/DigiTak/items/f8b7a9d629b571343aeb">タカバシさん</a>に教えてもらい、チャレンジしたいと思います。せっかくの、デジタルキューブ ＆ ヘプタゴン Advent Calendar 2023 なので、会社の事を書きます。

デジタルキューブに入社して良かった事はたくさんあるのですが、学習意欲が増し増しになった事が、個人的には大きい事でした。

デジタルキューブには、６つの行動指針があり、その中の一つに　「常に学び続ける」　というものがあります。

https://www.digitalcube.jp/company/vision-mission-values/

この指針の評価する項目としての資格手当（業務に関係がある資格）があるため、何から手を付けようと思っていた自分とっては、ありがたい指針となりました。

![資格手当](https://www.digitalcube.jp/wp-content/uploads/2023/06/%E3%83%86%E3%82%99%E3%82%B7%E3%82%99%E3%82%BF%E3%83%AB%E3%82%AD%E3%83%A5%E3%83%BC%E3%83%95%E3%82%99%E8%B3%87%E6%A0%BC%E6%89%8B%E5%BD%93%E4%B8%80%E8%A6%A7_20230610-2048x867.png)

デジタルキューブはWordPressに関連したサービスが多いため、フロントエンドの知識が必要と判断し、「Web検定（アソシエイト）」の取得を目指し勉強を開始。また、英語はどこで働くにも出来た方が良いので、TOEICの勉強も始めました。

TOEICは試験日が2024年1月なのでこれからですが、Web検定は、前職で得たバックエンド、インフラの知識があったおかげで、約1ヶ月で取得、1つ目の資格手当となりました。さらに、Web検定で使っていた時間を、AWS認定（ソリューションアーキテクト　–　アソシエイト）にあて、こちらも11月末に取得しました。（取れて当たり前かもですが。）

デジタルキューブに入社して、もちろん資格手当も嬉しいのですが、自分にとっては毎日空いた時間で勉強する習慣が出来た事は、本当に良かった事でした。（この年齢で、通勤の電車の中で英単語帳を必死に見るとは思いませんでしたw）

今後も「常に学び続ける」という姿勢を継続しつつ、もっと会社に貢献できるよう精進していきたいと思います。
【TestCafe Studio】インストール備忘録。

試験的な利用を業務内で行ったため、その備忘。

## 早速インストールしてみよう
公式ページに遷移。
https://www.devexpress.com/products/testcafestudio/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818285/c2d3570e-49e0-bf0e-6846-a76893e2ec52.png)

「START YOUR FREE 30-DAY TRIAL」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818285/b2d0dfe2-937e-d8ff-9bd7-234111296568.png)
<br>

ダウンロードされたDevExpressTestCafeStudioSetup-win-1.8.3.exeを実行。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818285/25991f7d-e142-a4bc-ba62-2d91341c2f66.png)
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818285/bc88aee6-87a3-0f26-559d-43e2639b3053.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818285/fb0339a1-2ef3-8675-e461-ca9d7f4715c6.png)
インストール後は「実行」にチェックを入れたまま、ウィザードを完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818285/9a4dd532-00e4-aa7d-91d1-55447239c557.png)

画面が表示される。今回は試用版を利用したいため、「Start Your Free 30-Day Trial」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818285/78a55b9b-1d3e-036b-e1fe-199a96644631.png)

次の画面はYesでOK。利用画面が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818285/49606384-fd50-813e-407b-1167644ddf4e.png)



## 始め方
下記を参考に実施（英語だが、Chromeで開いて「日本語」で表示すれば雰囲気で読める）。
https://docs.devexpress.com/TestCafeStudio/400160/getting-started

URL部分にテストしたいWEBページのURLを入れてスタート。
ブラウザが表示される。接続を待つ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818285/660d1322-bd86-11e5-8eb6-3cf8c1685d2c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818285/0d074e0f-8929-1d42-ae78-5ecc33552e33.png)

→うまくいかない場合
プロキシを確認する。
hostnameは、社内LANなどでIPアドレスが固定の場合は自分のPCのものを記載する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818285/2cd65fc0-542f-0114-cd7b-e0c56eac008f.png)
【AWS】Auto Scaling

# Auto Scalingとは
あらかじめ決めておいた条件に従って，サーバの負荷の上昇や故障を検知した際にITリソースを増減するもの
EC2やDynamoDBなどで利用。これにより，実際の需要に合わせたオートスケールが可能。

## 構成要素
* Auto Scaling Group
EC2インスタンスの集合で，最大インスタンス数や最小インスタンス数を設定

* Launch Configuration/Launch Template
Auto Scaling Groupに関連づけられたインスタンスの起動ルールを定めた設定。

* Scaling Plan
インスタンスをスケールするルールを設定。オプションとして最小台数の維持・手動スケーリング・スケジュールリング・動的スケーリング・予測スケーリングがある。

## 動作原理
* 指定キャパシティの維持(台数維持) + 条件に応じた自動スケール
指定された数のEC2インスタンスを維持。Auto Scaling GroupでEC2インスタンスを管理している。

:::note info
**自動スケール**
負荷に応じて自動的にAuto Scaling Groupを増減する仕組み
:::

* インスタンスの分散(AZ間リバランシング)
使用できるAZの間で均等にインスタンスを配置。スケールアウト(システムを構成するサーバーの台数を増やす)する時インスタンス数が最も少ないAZに新規起動。

# ライフサイクル
Auto Scalling Groupに組み込まれたインスタンス

| ステータス | 説明 |
| ---- | ---- |
| Pending | インスタンスの起動や初期化処理を行っている |
| InService | インスタンスが正常起動している |
| Terminating | インスタンスの終了処理を行っている |
| Terminated | インスタンス終了 |
| Detaching | Auto Scaling Groupからデタッチ処理されている |
| Detached | インスタンスのデタッチが完了 |
| EnteringStandby | Standbyへ移行 |
| Standbt | インスタンスが一時的に削除されている |

# メリット
* 耐障害性の向上
設定したインスタンスの数を維持できる。1台インスタンスが故障すると，故障したインスタンスを停止して新しく正常に動作するインスタンスを起動することができる。

* 可用性
システムにアクセスが集中する時間帯に合わせてインスタンスを増やすことができる。

* コスト
アクセスが少ない場合は無駄なリソースの使用を防ぎ，コストを抑えることができる。

# 料金
利用料金は無料。

# 参考
https://www.youtube.com/watch?v=B8RIZmTH7dk
https://www.youtube.com/watch?v=2ULl1BV0I68&list=PLPzcoMdqG5noLR7rAc552mvPADUmmdSt1&index=6
AWSの基本・仕組み・重要用語が全部わかる教科書
何番目にある? 1 Python3編

https://paiza.jp/works/mondai/array_primer/array_primer__search_i-th_step1

短くするなら
```py
A =[1,10,2,9,3,8,4,7,5,6]
print(A.index(8)+1)
```
ただ、この練習を活かすには


```py
A =[1,10,2,9,3,8,4,7,5,6]
for i in range(len(A)):
    if A[i] == 8:
        print(i+1)
```
コンポーネントの共通化で後々困った話

こんにちは、ファンタラクティブアドベントカレンダー9日目担当の清水です。

フロントエンドエンジニアとして働き始めてちょうど1年ほど経つのですが、今思うと「どうすればもっと上手くいったのかなあ」と思うことがちらほらあります。今回はその中からコンポーネントの共通化で困ったお話を書いていきます。

### 共通化したい！

実装上、共通のレイアウトがあったりするとコンポーネントとして管理したいなあとよく思います。簡単に表現すると以下の画像のような感じです。オレンジ色の共通的な部分をコンポーネントとして切り出します。

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617055/a3bc715a-6a5b-c501-f386-4569d4494b53.png)

共通化するとこんなメリットがありそうです。

- 1つのコンポーネントの修正で複数ページの修正が可能
- コード量が減る、可読性上がる

コード量も減って、修正範囲も減るなんてやるしかない！と思っていたのですが、後々逆に不便に感じたので、なんでそう思ったのか振り返りも兼ねてまとめたいと思います。

### 1. レイアウト変わると結構大変

共通化していても、改善していく中でレイアウトが変わっていくことは割とあると思います。その変更内容に共通化したコンポーネントが含まれている、かつページ間でレイアウトが違う場合、「どう修正しよう？もしくは別々に分けた方がいいかな？」など考えることが増えて個人的には面倒でした。変わった時点で共通化は解除するのが基本的には良さそうだと思うのですが、一度共通化したために「どう共通化するか」と考える方向に行きがちでした。

### 2. 逆に意図していない変更が入る

今度は共通化しているコンポーネントを使用しているページのうち、一部のページのみで変更が入った場合です。冒頭で「修正箇所が減って便利！」と書きましたが、裏を返せばそのコンポーネントの担当範囲が広いがために、修正が入った際はコンポーネントを使用しているページ全部を一度確認する必要があります。このようなシチュエーションがある時点で、修正に対する心理的な負荷が個人的には高くなった気がします。ビジュアルリグレッションテストのように、変更を検知できる仕組みがあれば改善できるかもしれません。

### まとめると、修正段階で大変になりがち

共通化自体にはメリットがあるのに、その共通化にメンテナンスが必要になると気にすることが増えて思うようにスムーズにいかないことがあるなあと思います。実装目線での悩みを考えてみたので、少し角度を変えてデザイン目線で考えてみます。

### デザイン目線で考えてみる

ファンタラクティブではエンジニア・デザイナー両方が在籍するプロジェクトが多くあります。その中でコンポーネントの共通化についてデザイナーの方にお聞きした機会がありました。聞いてみると、基本的に共通化はしておらずページ単位でデザインを進めていることが多いとのことでした。このことから、デザインと実装で共通化する単位が異なっていそうです。

共通化する単位が異なっていても、デザインと実装に乖離がなければ基本的に問題ないと思います。しかし、修正段階においてはデザインと実装で見ている範囲が違うように思います。軽くまとめると以下のような感じです。

| |修正対象|影響範囲/考える範囲|
|-|-|-|
デザイナー|ページ内のデザイン|修正したページ
エンジニア（自分）|共通化したコンポーネント|コンポーネントを使用しているページ全て

上の話を元にすると、デザイナーの見ている範囲は修正したそのページのみです。一方自分の見ている範囲は、そのコンポーネントを使用している複数のページでした。この認識がずれていると、デザイナー側からすると以下のように思うことがありそうです。

- 🔴 ページのちょっとした変更でも、実装に思いのほかインパクトがある
    - 共通化部分に手間取ったが故に、実装が遅れた
- 🔴 意図していない部分にも修正が入っている
    - 共通部分修正後の確認ミスで意図しない変更が入っている
    - 場合によっては、デザインの修正漏れに気付けることもある
        - 共通化している故に、そのコンポーネントが持つ意味合いは他のページに行っても同じことが多いため
- 🟢 複数ページ変更したけど、実装修正が早い！
    - 共通化されていたことで、実装の修正が思いのほか早かった
    - 工数の見積に誤算があるので、これもあまり良くはないかも

このように、見ている範囲の認識だけでなく実際の作業や成果物にも影響が出ることが考えられそうです。もらったデザインファイルを見て実装すれば、作業自体は完了するため、積極的にコミュニケーションを取らずとも成果物はできると思います。（僕自身タスクに集中しすぎて、会話しにいかないみたいな日が少なくありません、反省。。）ですが、よりスムーズに良いプロダクトを作るには、認識を合わせていくことは大事だなとこの一件からも学びました。

### デザイナーと同じものを見るために

最後に、デザイナーと見ている範囲を合わせていくためにどうすればいいのか考えてみます。

- 会話する

会話することは当たり前のことではありますが、タスクが忙しかったりするとなかなか忘れがちな自分がいます。。「この単位で共通化しようと思うんだけど、デザイナーさん的に認識合いそうですか？」と会話するだけでも認識齟齬が減りそうです。

- ロジックはなるべく切り出す

UI 定義の責務範囲がデザイナーによるとすれば、ロジック定義の責務範囲はエンジニアが担当することになりそうです。UI の定義はコンポーネントファイルに、ロジックを hooks などに切り分けて管理することで、依頼されている修正単位で見る範囲が限定されて、より見やすくなりそうだなあと思いました。

### おわり

僕自身勢いでコーディングするタイプなので、後々なんでこんな実装をしたんだろうと思うことは少なくないなと思います。ちゃんと意図を読み解いて、今後の流れも考慮して、より保守性の高いコードを書いていけるようになりたいなと思いました。

明日は猫と車が印象強い黛さんが、 React で円形のプログレスバーを実装されます⭕️

リッチな UI で見かけますが、実装するとなるとパッと想像つかない印象です。[こちらのカレンダー](https://qiita.com/advent-calendar/2023/funteractive-inc)から確認いただけるので、ぜひご覧ください！
「SQLスクリプトの実行」を2倍使いこなすtips

# ACSのSQLスクリプト
IBM i Access Client Solutionsの一機能。

https://www.ibm.com/docs/ja/i/7.5?topic=solutions-overview-i-access-client

IBM iに対して直接SQLを実行できる。[CLも実行できる](https://qiita.com/gomAnomalocaris/items/4af39ba1b11b9a6f8f6b)らしい。IBM iで快適なSQLライフを送るためのtipsをいくつかまとめてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3112348/e5e6e1b9-d051-3cab-60de-ac02bd341217.png)


# デスクトップショートカットの作成
5250エミュレータのメニューバーで`アクション`>`SQLスクリプトの実行`で実行できるが、デスクトップショートカットも作成できる。
`Start_Programs`以下にある実行ファイル(`acslaunch_win-64.exe`とか)のショートカットを作成し、パラメータに`/PLUGIN=rss /SYSTEM=[システム名]`を設定することで直接起動することができる。
Windowsであれば`ショートカットのプロパティ`で`リンク先(T):`を以下のように設定すればOK。
```
"[ACSのフォルダ]\Start_Programs\Windows_x86-64\acslaunch_win-64.exe" /PLUGIN=rss /SYSTEM=[システム名]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3112348/ee24f670-39fd-8f6c-874e-79e9803d4dfb.png)


## 参考
ショートカットのパラメータについては以下に色々書いてあるので、他にも使えるものがあるかも。
```
[ACSのフォルダ]/Documentation/GettingStarted_ja.html
```


# キーボードショートカット
メニューバーに書かれているものもあるが、書かれていないものもある。よく使っているものを紹介します。

## `[Ctrl] + N` : 新規タブ
タブ切り替えは`[Ctrl] + [PageUp]`や`[Ctrl] + [PageDown]`でできる。
って書いてあるけど`[Ctrl] + [Tab]`や`[Ctrl] + [Shift] + [Tab]`でもできる。

## `[Ctrl] + R` : 選択済みステートメントの実行
`;`で区切ってあれば、カーソル位置のステートメントを実行する。
`;`がなければ全ステートメント実行、1タブ1ステートメントにして使うことが多い。

## `[F4]` : ステートメントのプロンプト(サジェスト)
って書いてあるけど `[Ctrl] + [Space]` でも同じことができる。DB名を忘れてもこれで安心。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3112348/e4ee9701-fad5-8ab3-c325-7bfb3cbd364a.png)

## `[Ctrl] + 7` : コメントの切り替え(行のコメントアウト)

って書いてあるけど `[Ctrl] + /` でも同じことができる。
行の先頭に`--`をつけたり外したり。複数行選択でもできる。

# その他
## `?`
バージョン1.1.9.2から使えるようになったっぽい。
WHERE区に入れておくと、実行時にポップアップで値を入力できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3112348/59277f77-2fdc-900b-3ddb-9ac534032a78.png)


## 閉じるときの挙動
SQLを実行して結果が表示されている状態で閉じようとすると確認メッセージが出る。~~閉じたくて閉じてるのでちょっとウザい。~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3112348/97f288f1-b03e-0523-c013-137eaf28cad1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3112348/489627d9-fbff-6f15-d6fd-cf9497e133ea.png)

これらの確認メッセージはカーソルキーが効かない。`Y/N/C`も効かない、書いてあるのに！
保存せずに閉じたいときの選択肢が逆なのもちょっとたちが悪い。
幸い[Enter]もしくは[Space]や[Tab]は効くので、閉じるときは`[Alt] + [F4] > [Enter] > [Tab] > [Enter]`を手癖にしましょう。

# 実行環境
OS: Windows10 22H2
ACSバージョン: 1.1.9.2
ACSビルドID: 3131
それ，numpy で書かない？--3--

## それ，numpy で書かない？--3--

Python ではリストがよく使われる。また，for ループが遅いのでリストに特化したリスト内包表記も推奨されることが多い。

それなりの根拠があるからではあるが...

課題：エラトステネスの篩を使って $n$ 以下の素数のリストを得る。

```python
from time import time
import numpy as np
import matplotlib.pyplot as plt

n = 100000
trial = 500
```

以下のプログラムは，この次に示す numpy によるプログラムをリストを使うように書換えたものである。


```python
def sieve1(n):
    tbl = [True] * (n + 1)
    tbl[0:2] = [False, False]
    for i in range(2, n + 1):
        if tbl[i]:
            for j in range(i * i, n + 1, i):
                tbl[j] = False
    return [i for i, x in enumerate(tbl) if x]

primes = sieve1(n)
print(f"Number of primes is {len(primes)}.")

times = []
for i in range(trial):
    s = time()
    sieve1(n)
    times.append(time() - s)
print(f"Mean execution time = {sum(times)/trial:.5g}")
```

    Number of primes is 9592.
    Mean execution time = 0.0085938


リストは一切使わない。結果の保存も numyp.ndarray を使う。


```python
def sieve2(n):
	tbl = np.ones(n+1, dtype=bool)
	tbl[0:2] = False
	for i in range(2, int(np.sqrt(n))+1):
		if tbl[i]:
			tbl[i*i::i] = False
	return np.arange(n+1)[tbl]

primes = sieve2(n)
print(f"Number of primes is {len(primes)}.")

times = np.zeros(trial)
for i in range(trial):
    s = time()
    sieve2(n)
    times[i] = time() - s
print(f"Mean execution time = {np.mean(times):.5g}")

```

    Number of primes is 9592.
    Mean execution time = 0.00028925


ほぼ 30 倍速である。
「xxx.comが許可を求めています」を許さない。通知要求を完全に拒否する。

# 通知しますか？を消滅させたい！！！！！
ネットサーフィンをしていると何気なく出てくるpush通知が邪魔すぎる。
そして、ブロックボタンを押すときにどうしても間違えそうになる。
本気で「消滅しろ！」とは思わないが、ミスで許可するのは怖いと普段から思っていました。

とはいえ、今まで消そうとまではしていなかったのですが、なぜ消そうと思ったのか。

## きっかけはこちらの記事

https://www.itmedia.co.jp/news/articles/2312/06/news163.html

社内のセキュリティGで不審な通信を発見し、確認するとアダルトサイトへの通信だった。
気まずいが問い合わせたところ・・・


といわけで、ついつい「許可する」を押してしまいそうになる誤操作や
思考の邪魔になる判断を求められる通知のONOFF
普段から消えてほしいと思っていたので、消すことにしました。
マウスコンピューターさんでテストします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492033/22366718-a07c-c693-4e33-a3323ce586b7.png)

https://www.mouse-jp.co.jp/


まずは消し方の紹介。
ほとんどの人は以下のURLで消せると思います。

https://support.google.com/chrome/answer/3220216?hl=ja&co=GENIE.Platform%3DDesktop

```
１，パソコンで Chrome を開きます。
２，右上のその他アイコン  次に [設定] をクリックします。
３，[プライバシーとセキュリティ] 次に [サイトの設定] 次に [通知] をクリックします。
４，サイトに通知の送信を許可しないを選択します。
```

# 画像で紹介しましょう

#### まずはchromeを開きます。
#### 開いたら右上の３つの点マークを押しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492033/92d965dd-224f-53fe-ce39-0a19b509d638.png)

#### 設定ボタンを押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492033/1299c85f-0b7e-cfc4-13e9-30d036d58484.png)

#### プライバシーとセキュリティを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492033/07216d3a-fc8c-d6c8-b087-fee677667a36.png)

#### 少しスクロールしてサイトの設定を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492033/b2d949bf-7bf2-9eba-4aef-5dbb79a80fb0.png)


#### またスクロールして通知を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492033/c719b95e-8ed1-e062-1ace-b21dbe502122.png)

#### 最後にサイトに通知の送信を許可しないを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492033/988aba97-5167-0160-0b53-11f9c909e5ea.png)


congratulation！！！
できましたね。

では確認してみましょう
https://www.mouse-jp.co.jp/


### 見事に通知が出てきません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492033/eacb8e76-ad94-81e8-5132-aa56c890471a.png)

おめでとうございます！
これであなたもエロサイトへの通信リスクを防止できましたね！

テストにマウスコンピューターさんを使ったので、勝手に宣伝します。
マウスコンピューターでは最低価格5万円くらいからパソコンを提供しています。
オンボードメモリなので拡張性低いため10万クラスからがおすすめです。

これでおわりです。


セキュリティ問題っていろいろ怖いですよね。
本の厚さを(だいたいで)可視化する拡張機能を作った話


## 要約

こんな感じで本の大きさを可視化できるようにする拡張機能を開発しました。

![スクリーンショット 2023-12-07 10.30.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207958/d8f30620-23a4-97bf-47b5-cb22fb1c97a8.png)

Chrome拡張はこちらで公開しています。
[thick book kindle](https://chromewebstore.google.com/detail/thick-book-kindle/jmjmgkjbmbcgdkpkhmflemnneeaefjgb?hl=ja)

## 作った背景

**会社での雑談**
私「最近何か本買った？」
同僚「買いたいけど場所がなくなってきてて」
私「Kindleいいよ〜」
同僚「Kindleだと本の厚さがわからなくて、終わりが見えない分読む気がなくなるんですよねー」

**有志の読書会で**
メンバー「次の本、この本にしてみよっかー」
みんな「おけおけ」
~ ２日後 ~
書籍で買った人「なんか武器になりそうなサイズの本がきた」
Kindleで買った人たち「まじか...」


ということで、買う前に本の厚さがわかれば購入意欲やその後のギャップがなくせるのでは！？と思って作成しました。

## 大変だったところ

### 1ページの厚さ問題

早速ですが、1ページあたり何ミリか皆さんご存知でしょうか？
正解は「本によって違う」です。

厳密には印刷所から推測や、ページ数によってこの厚さがいいという同人の人たちの知見はあるものの、確証を得ることはできません。
そのため、今回の実装では手元の本と比較し、一番ブレのなかった0.8mmを採用しました。

この辺、印刷の知見や論文ご存知の方いましたら教えてください🙏

### Chrome拡張機能のプライバシーポリシーページ

こちらの記事がわかりやすいですが、2021年ごろからプライバシーポリシーのページが義務付けられているようです。

https://qiita.com/eneko0513/items/3f953405e0cb54ba2903

私も上記の記事にならない、GithubPageを使い公開しています。

https://cuculu321.github.io/thick_book_kindle/

GithubPageも現在は専用のリポジトリを作る必要がなく、特定のブランチ・フォルダを指定して公開することができるため、1つのリポジトリ内に拡張機能とポリシーを設定できるのでこの運用がおすすめです。

![スクリーンショット 2023-12-07 10.52.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207958/06cedaaa-4f9c-91b8-179d-80cecf9f5350.png)

## 最後に

Chrome拡張は可視化だけでなく、何かと便利なので仕事で楽をするためや特定のSaaSの操作性の向上などどんどん作っていきましょう
【AWS】Bedrock で Titan から文書埋め込みを取得する

AWS の Bedrock と、基盤モデルの Titan を使って文書埋め込みの取得をします。

# コード (Python3)
```python
import json
import boto3
import numpy as np


class Bedrock:
    def __init__(
        self,
    ):
        self.model_id = "amazon.titan-embed-text-v1"

    def completion(self, text):
        session = boto3.Session(region_name="ap-northeast-1")

        bedrock = session.client(service_name="bedrock-runtime")

        body = json.dumps({"inputText": text})

        accept = "application/json"
        contentType = "application/json"

        response = bedrock.invoke_model(
            body=body, modelId=self.model_id, accept=accept, contentType=contentType
        )

        response_body = json.loads(response.get("body").read())

        return response_body["embedding"]


def test():
    bedrock = Bedrock()
    response_1 = bedrock.completion("Today is Friday in California.")
    response_2 = bedrock.completion("In California, it is Friday today.")
    response_3 = bedrock.completion("I am a pen.")

    # calculate these euclid distance
    return {
        "1 vs 2": np.linalg.norm(np.array(response_1) - np.array(response_2)),
        "1 vs 3": np.linalg.norm(np.array(response_1) - np.array(response_3)),
        "2 vs 3": np.linalg.norm(np.array(response_2) - np.array(response_3)),
    }


print(json.dumps(test(), indent=2))

```
`test()` では、以下の 3 つの文章のユークリッド距離を計算しています。
1. Today is Friday in California.
2. In California, it is Friday today.
3. I am a pen.

意味的には 1 と 2 の距離は近くて、3 は他の 2 つと遠い気がします。


# 実行結果
```json
{
  "1 vs 2": 6.021247346519345,
  "1 vs 3": 22.76307302608681,
  "2 vs 3": 22.32505996689041
}
```

期待通りの結果となりました。

# 応用
https://github.com/aws-samples/amazon-bedrock-workshop/blob/main/04_Chatbot/00_Chatbot_Titan.ipynb

Titan Embedding の埋め込み結果がちゃんと正規化されていればユークリッド距離を文書類似度とすることもできると思われます。
上記の workshop のように、埋め込みを FAISS に突っ込んで RAG にするという応用があります。

# おわり
Titan Embedding は補完用のふつうの Titan とは違ってマルチリンガルらしいです。日本語も使える～やった～（ほんとか？）
【サクッとER図】DBeaverを使ってSQLite3のデータベース見てみた


## データベース初学者でも、ER図を簡単に確認できました
ローカル環境前提条件
・DB Browser for SQLiteアプリがあること
・データベースファイルがディレクトリにあること

## DBeaverのインストールと使い方（参考サイト）
MySQL用で書かれていますが、すごくわかりやすく説明くださってたので
SQLite3の私でも参考にできました！ありがたやー！

**参考：インストール**

https://japbros-poco.main.jp/archives/6435

**参考：使い方**

https://japbros-poco.main.jp/archives/6557#DBeaver%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97

**DBeaverのインストール（公式サイト）**
私はMacOSなので、MacのIntel版をダウンロードしてセットアップします。
WinやLinux、Apple Silicon版もありましたよー！

https://dbeaver.io/download/

## DBeaver開いてセットアップ
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190311/171ad2ac-715e-11ef-4347-dade4cb0a8c5.png)
左上のプラグとプラスマーク（新規接続）クリック
データベースドライブ名（SQLite）クリック
次へ

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190311/95e59fcf-c5fc-5045-5b43-d8b2dbbebfe3.png)
ブラウズをクリック

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190311/c72fafe9-dbd7-0549-4a6c-c2a4f17d0cf0.png)
ローカルディレクトリからデータベースを選択してOpenをクリック、左上のパスにパスが表示されます（パス２回言うてる）

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190311/870d0f8e-84e6-8a79-676d-72db0ff293f8.png)
パス表示を確認したら、終了ボタンは押さずに、まず**テスト接続ボタン**をクリック

**接続テスト画面**が表示される
OKボタンを押さずに、**詳細ボタン**をクリック
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190311/3fa27c02-2508-35b7-706a-3ef6a24e5ad4.png)

:::note warn
**【接続テスト画面上の詳細ボタン】ファイル名の最終確認**
ファイル名は間違ってないか？違うファイルじゃないか？などをチェックします
:::

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190311/4856b9f4-d546-0a54-2973-4ac84799e4df.png)
**SQLiteのプロパティ画面上**のパスやファイル名を確認し、間違いがなければOKボタンをクリック

またこの画面に戻されます
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190311/503bc658-14ef-ef87-d07b-79e5a691b8bf.png)
テスト接続は終えているので、終了ボタンをクリック

読み込みされて、データベース名が左側に表示されているので
クリックしてビューなどをクリック、右側に情報や**ER図のタブ**が展開されます
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190311/aea2e749-5644-cb93-01fe-03680c553f0a.png)

できましたー！ER図。。。衝撃のシンプルさ！！
リレーションも発生していません。ええ、初学者なので伸び代しかありませんが何か。

## デフォルトで入っているサンプルを見ても面白い
Sample Databaseというものをのぞいてみました！
10個以上のテーブルがあるので
ER図リレーションやデータ型など設計の参考になるかもです！

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190311/4b91cc3c-83de-f72f-83b5-c842da5e6974.png)

## まとめ
・サーバーサイドの理解も必要なので、ER図は読めるようになっておきたい
・データの扱いがわかると処理コードの記述もなんとなく理解できそう
    （な気がする予感はしているかも多分なんとなく知らんけど）
・ER図を生成できるサービスは他にもある
・　英語ベースですが、言語選べます（今回の記事は日本語設定のものです）
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190311/9ecda371-0869-f641-9d93-22c324e7b302.png)

ググって試して数分で実現できたので、DBeaver簡単でした！
参考サイトのおかげもすごくあります！ありがとうございました！
インスタンスメソッド/クラスメソッド/モジュールの状況別呼び出し方

# インスタンスメソッドとクラスメソッドの呼び出し方

プログラミングにおいて、メソッドの呼び出し方は、そのメソッドがインスタンスメソッドなのか、クラスメソッドなのかによって異なります。ここでは、これらのメソッドをさまざまな状況でどのように呼び出すかについて解説します。

## インスタンスメソッドをクラス外で呼び出す

インスタンスメソッドは、クラスのインスタンスを介して呼び出します。まずはクラスのインスタンスを作成し、そのインスタンスを通じてメソッドを呼び出します。

```ruby
class MyClass
  def instance_method
    puts "インスタンスメソッドです"
  end
end

# インスタンスを生成
my_object = MyClass.new
# インスタンスメソッドを呼び出す
my_object.instance_method
```

## クラスメソッドをクラス外で呼び出す

クラスメソッドは、クラス自体をレシーバとして呼び出します。インスタンスを生成する必要はありません。

```ruby
class MyClass
  def self.class_method
    puts "クラスメソッドです"
  end
end

# クラスメソッドを呼び出す
MyClass.class_method
```

## インスタンスメソッドから他のインスタンスメソッドを呼び出す

同じインスタンス内の別のインスタンスメソッドを呼び出す場合、レシーバ（`self`）を省略してメソッド名だけを記述します。

```ruby
class MyClass
  def first_method
    puts "最初のメソッド"
    second_method
  end

  def second_method
    puts "次のメソッド"
  end
end

my_object = MyClass.new
my_object.first_method
```

## クラスメソッドから他のクラスメソッドを呼び出す

クラスメソッドから同じクラスの別のクラスメソッドを呼び出す場合も、レシーバを省略できます。

```ruby
class MyClass
  def self.first_class_method
    puts "最初のクラスメソッド"
    second_class_method
  end

  def self.second_class_method
    puts "次のクラスメソッド"
  end
end

MyClass.first_class_method
```

## インスタンスメソッドからクラスメソッドを呼び出す

インスタンスメソッド内でクラスメソッドを呼び出す場合、クラス名をレシーバとして使用します。

```ruby
class MyClass
  def instance_method
    puts "インスタンスメソッドからクラスメソッドを呼び出します"
    MyClass.class_method
  end

  def self.class_method
    puts "クラスメソッドです"
  end
end

my_object = MyClass.new
my_object.instance_method
```

## クラスメソッドからインスタンスメソッドを呼び出す

クラスメソッドから直接インスタンスメソッドを呼び出すことはできません。インスタンスメソッドは特定のオブジェクトに紐付いているため、まずインスタンスを生成し、そのインスタンスを通じ

てメソッドを呼び出す必要があります。

## モジュールをインスタンスメソッドとして利用する
モジュールをインスタンスメソッドとして利用する場合は、includeメソッドを利用します。

```ruby
module　MyModule
 def module_method
    puts "モジュール内のメソッドです。"
 end
end
class MyClass
  include MyModule
end

my_object = MyClass.new
my_object.module_method
```

## モジュールをクラスメソッドとして利用する
モジュールをクラスメソッドとして利用する場合は、extendメソッドを利用します。

```ruby
module　MyModule
 def module_method
    puts "モジュール内のメソッドです。"
 end
end
class MyClass
  extend MyModule
end

my_object = MyClass.module_method
```

## モジュールメソッドをモジュール外で呼び出す
モジュールメソッドは、モジュール自体をレシーバとして呼び出します。インスタンスを生成する事はできません。
```ruby
module　MyModule
 def self.module_method
    puts "モジュールメソッドです。"
 end
end

my_object = MyModule.module_method
```

## モジュール内のクラスメソッドを呼び出す
モジュール内でクラスメソッドを呼び出す際は、モジュールとモジュール内のクラスを::で結びます。

```ruby
module　MyModule
  class MyClass
    def self.class_method
      puts "クラスメソッドです。"
    end
  end
end

my_object = MyModule::MyClass.class_method
```

## まとめ

インスタンスメソッドとクラスメソッドは、それぞれ特定の方法で呼び出す必要があります。これらの基本的な使い方を理解することは、効果的なプログラミングのために重要です。クラスとインスタンスの概念を適切に活用し、メソッドの呼び出し方をマスターしましょう。
ユーザーのことを考える前に、まず自分達の思い込みをクリアにしよう

日ごろの生活の中で「あれ？これって自分の思い込みだったの？」と気づいてハッとするようなことってないでしょうか？

子どもと話していて、不意にくる「なんで？」「これはなんでなの？」の質問攻めに答えているうちに、よくよく考えると自分もちゃんと理解していないことに気づき、調べると実は少し違っていたというようなことが時々あります。

私は事業会社のデザイナーとして、サービスの改善や保守業務に従事しており、チームメイトとユーザー行動について考えることもしばしばあります。

## それって本当にそうだっけ？
仮説を立て、議論して物事を進めようとする中で、自分たちがいつしか「〜なはずなんだ」と認識していたことが、実はそうでもなかったようなケース

- これだけ工数がかかるんだから、きっと成果も大きいはず
- 前任の頃からずっと存在しているコンテンツだから、きっとサービスにとって欠かせないはず
- 解析ツールで見てもスクロールされているので、文章はしっかり読まれているはず

など、頭ではそんなことないと分かっていても、関わる人が変わり次第に個々の解釈が重なって、いつの間にかチーム単位で思い込みに囚われてしまったりするんですよね。

## プラスすることだけが正解じゃない

一例になりますが、弊社が運営している金融商材を扱うサービスで、サイトに流入した際にユーザーの経験や状況を問うポップアップを設置していました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1906673/52ad27db-d89f-01e7-8841-b2c54caea7c3.png" width="450">

最初に設置した理由としては「ランディング時にユーザーの経験や状況を聞き取ることによって、最適なページに誘導し、求められている情報を最短で提供することができる」といったところだと思います。

当初よかれと思って用意したコンテンツではありましたが、時間が経過し、次第にチームメンバーから「サイトに訪れていきなりポップアップが出るのって、ちょっと嫌だよね」といったネガティブな声が聞こえるようになりました。

実は運営側でもそう思っていた人が結構いたのでは？と今になって思いますが、このポップアップがあることである程度のユーザー属性のデータが蓄積され、施策考案に活かすことができたのも確かなので、なかなか外すという決断に至りませんでした。

ですが、UXの観点でも一定のユーザー行動を阻害してしまっている可能性を考え、一度外してみたところ、図らずも大きくCVRが改善する結果となりました。

工数面でも、あるものを外すだけなので小工数で済み、まさにローリスク・ハイリターンな施策となりました。



## サービスとしての軸を置いておく

あるサービスのデザインに携わっていた時に「この商材だと情報が整理されて見やすい状態よりも、ごちゃっとして雑多なデザインの方が何故か成果がでるんだよね〜」という話を耳にしました。

まぁ分かる気はするけれど、デザイナーとしてはなんかモヤモヤする。。

仮にそうだとしても、意図的に認知負荷を上げるようなことはしたくないし、アクセシビリティを低くするようなことを推奨しちゃうチームは嫌。。

確かに業種によっての「っぽさ」やメンタルモデルのような側面もあってとても難しい問題だなと思いますが、同時にサービスとしての軸をしっかり置いておくことが重要なんだなと感じます。

サービスの方針として「ここは譲れない」といった優先度を、チームの共通認識として持っておくだけで、物事は判断しやすくなるのではと思います。


これは全くの余談ですが、過去にパチンコ商材がメインの制作会社にいた頃、先輩に「岩、炎、雷とにかく何でもいいから埋め尽くせ」「隙間があったらダメだからな」と、これでもかという程言われたことを思い出しました。

業界あるあるでしょうか。。

## メンタルモデルについて

個人的に今年意識することが多かった「メンタルモデル」という概念。

元々は認知心理学の用語で、その人がこれまで生きてきて、見たり聞いたり経験したことから形成される物事の思い込みや価値観を指します。

例えば寒い冬の朝、窓を開けてみたら雪が積もっていたとします。
一面の雪景色に心が躍って駆け出したくなる人もいる一方、過去に雪道で転倒してしまった経験がある人はちょっと苦い顔をしてしまうかもしれません。

同じ事柄でもその人のバックボーンによって受け取り方や感じ方が違ってくる。

改めて意識できれば、サービスやユーザー行動について考える上で、大いに活用できる概念だなと思います。

メンタルモデルについてはこちらの記事がとても分かりやすかったので、興味がある方はぜひ見てみてください。

https://keeperz.jp/posts/vLTzTWGw


## たまには棚卸ししてみよう

仕事をする上で常にフラットな視点が持てればベストなのですが、人間どうしても「〜なはず」といった見方をしてしまいがちです。

意識することで回避できれば何よりなのですが、それが難しいのであれば、定期的に振り返りの時間を設けたり、過去の事象からなんとなくそのままにしているようなことも、改めて検証してみることで思わぬ結果が得られるかもしれません。

今このサービスにとって何が必要か？と考え、ついついプラスする施策に進みがちですが、時には引いてみるという選択を考えてみるのもいいかと思います。

何かと忙しい12月ではありますが、区切りのよいこのタイミングで一度棚卸ししてみて、来年に備えるのはいかがでしょうか。
Javaのprint()内で”＋”で数値と文字列の結合したとき出力されるのは文字列か数値か

# はじめに

Javaを学ぶため、Paizaのスキルアップ問題に取り組んでいたところ、うまくいかず少しだけ悩んだのでアウトプット


# 問題

スキルアップ問題で、
入力された数値を読み取り、0の数＝何個、１の数＝何個　....9の数＝何個
というように出現回数を出力する問題

問題URL
https://paiza.jp/works/mondai/data_structure/data_structure__dict_step1

自分の回答

```Java

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        List<Integer> a = new ArrayList<>();
        for(int i=0;i<n;i++){
            a.add(sc.nextInt());
        }
        for(int i=0;i < 10;i++){
            int count = 0;
            for(int j=0;j<n;j++){
                if(a.get(j)==i){
                count +=1;
                }
            }
            System.out.print(count+" ");
            if(i==9){
                System.out.println();
            }
        }
        
    }
}
```

動作確認で同様の値が出力され正解かと思ったが、正解にならなかった

# 解決方法
原因は
```System.out.print(count+" ");```

の部分
このように直したらOKだった
```
System.out.print(count);
            if(i==9){
                System.out.println();
            }else{
                System.out.print(" ");
            }
```

# 調査内容
理由の考察
- +演算子の仕様　文字列と数値が入れ子になってる？

理由がよくわからず、しらべてみた


### ＋演算子の仕様
下記らしい

- ＋演算子をつかって連結する場合、左から連結されていく
```Java
String s = 45 + 18 + "point";

System.out.println(s);  // 63point 計算されてから文字列になる
```
最初が文字列なら次も文字列として足していく
```Java
String s = "point" + 45 + 18;

System.out.println(s);  // point4518
```

しらべたけどあまり関係なさそう
 **printメソッドは文字列として出力**するので、数値が出力されているというわけではない

## 原因
単純に
```Java
System.out.print(count+" ");
```
で繰り返しの最後のところにスペースが入っていたので間違っていた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037238/feb616a7-0570-bf35-847e-843b840e5ae2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037238/cc341bb4-727f-93bf-3d01-fa669c82fc39.png)


# おわりに
原因は違っていたけど　＋　演算子の仕様や原因がわかってよかった

# 参考
https://www.javadrive.jp/start/ope/index14.html
Flutterの認証フロー管理から学ぶ非同期builder

## はじめに
Flutterはその柔軟性と多機能性で、モダンなアプリ開発において重要な役割を果たしています。特に、Firebase Authenticationの統合は、安全かつ効率的なユーザー認証フローの実装を可能にします。このセクションでは、Firebaseを用いた認証フローの構築と、`FutureBuilder`と`StreamBuilder`を活用した認証状態の管理方法について詳しく見ていきます。

## Firebase Authenticationの導入
Firebase Authenticationは、開発者がセキュアな認証システムを簡単に実装できるよう支援するサービスです。ユーザー名とパスワードに基づく認証から、GoogleやFacebookなどのソーシャル認証オプションまで、多様な認証メカニズムを提供します。FlutterアプリにFirebaseを統合することで、これらの認証オプションを簡単に利用できるようになります。

## `FutureBuilder`と`StreamBuilder`の利用
Flutterでの認証状態の管理には、`FutureBuilder`と`StreamBuilder`の二つのウィジェットが重要な役割を果たします。これらは、それぞれ非同期データソース（FutureとStream）に基づいてウィジェットのビルドを行うFlutterのウィジェットです。

### `FutureBuilder`の使用
- `FutureBuilder`は、単発の非同期処理（例えば、Firebaseからの初期ユーザー状態の取得）に使用されます。
- `FirebaseAuth.instance.currentUser()`のようなFutureを使用して、現在のユーザーがすでに認証されているかどうかを確認します。
- `FutureBuilder`は、非同期処理が完了するまでローディング画面を表示し、完了後に結果に基づいて適切なウィジェットをビルドします。

```dart
FutureBuilder<User?>(
  future: FirebaseAuth.instance.currentUser(),
  builder: (context, snapshot) {
    if (snapshot.connectionState == ConnectionState.done) {
      // 結果に基づいてウィジェットをビルド
    }
    return LoadingScreen(); // ローディング画面
  },
)
```

### `StreamBuilder` の使用
StreamBuilderは、時間の経過とともに複数回のデータが流れてくるストリームに基づいてウィジェットをビルドするのに適しています。
FirebaseのauthStateChangesメソッドは、認証状態の変更があるたびに新しいユーザー情報をストリームとして提供します。
このストリームをStreamBuilderに渡すことで、認証状態の変化にリアルタイムで対応し、適切な画面に遷移させることができます。

```dart
StreamBuilder<User?>(
  stream: FirebaseAuth.instance.authStateChanges(),
  builder: (context, snapshot) {
    if (snapshot.connectionState == ConnectionState.active) {
      // 現在の認証状態に基づいてウィジェットをビルド
    }
    return LoadingScreen(); // ローディング画面
  },
)
```

### 認証状態の変更への対応
FutureBuilderとStreamBuilderを組み合わせることで、アプリの起動時に一度だけユーザーの初期認証状態をチェックし、その後はユーザーの認証状態の変更にリアルタイムで対応することができます。これにより、ユーザーがログアウトしたり、別のアカウントにログインしたりすると、アプリが自動的に適切な画面（例えば、ログイン画面やホーム画面）に遷移します。

## まとめ
Firebase AuthenticationとFlutterのFutureBuilder、StreamBuilderを組み合わせることで、安全で効率的なユーザー認証フローを実装することができます。このアプローチにより、アプリはユーザーの認証状態に応じて動的に反応し、より良いユーザーエクスペリエンスを提供することが可能になります。

Flutterはわかりやすくこの概念を与えてくれます。他の言語で非同期ハンドリングするときにも応用が効くので結構感動しました。
FMX TGridLayout

## FMXのTGridLayout

こんにちは、この記事はDelphi Advent Calendar 2023 7日目の記事です。

皆さん、TGridLayoutは使われていますでしょうか。
横方向か縦方向に同じサイズでコンポーネントを配置してくれるLayoutです。

コンポーネントの並び順はOrientationプロパティ、コンポーネントのサイズはItemWidth, ItemHeightプロパティでで指定します。

で、この Item##### プロパティですが、OrientationがHorizontal(横並び)の場合はItemWidthに、Vertical(縦並び)の場合はIteHeightに負の値を設定すると、コンポーネントの数に合わせて自動でサイズ調整してくれます。(Helpには載っていません...)

が、しかし、サイズ調整する時にHeightやWidthをコンポーネント数で割って、その値をコンポーネントに設定するのですが、そのサイズはSingleです。

勘のいい方ならもうお気づきでしょうが、まれにサイズ調整がうまくいかずに意図せず次の行や列にコンポーネントが配置されてしまう事象が発生します。

これを回避するためにTGridLayoutのDoRealignプロシージャを書き換える必要が有ります。

簡単にはTGridLayoutを使用するUnitに

    TGridLayout = class(FMX.Layout.TGridLayout)
      procedure DoRealign; override;
    end;

として、FMX.LayoutsからDoRealignを丸ごとImplimentationの実装部にコピーします。

実装部でFItemWidthとFItemHeightがPrivateで宣言されているのでアクセスできませんので、
Fを取ってItemWidth, ItemHeightとします。

        CurPos.X := Self.Padding.Left;
        CurPos.Y := CurPos.Y + LItemHeight;
と

        CurPos.Y := Self.Padding.Top;
        CurPos.X := CurPos.X + LItemWidth;

の部分を

    if( 0 <= ItemWidth )then
    begin
        curPos.X := Self.Padding.Left;
        curPos.Y := curPos.Y + iHeight;
    end;

や

        if( 0 <= ItemHeight )then
        begin
          curPos.Y := Self.Padding.Top;
          curPos.X := curPos.X + iWidth;
        end;

のように改行、改列部分にItemWidthやItemHeightが負の値かどうかの判定を入れることにより思惑通りの動作になります。

以上であります。3maでした。
人と被りたくないブラウザを使いたい人、HP制作で少し役に立つブラウザを使いたい人に向けて

# そもそもブラウザとは
ブラウザはパソコンやスマートフォンでウェブサイトを閲覧するためのソフトウェアのことです。ウェブサイトだけでなくYouTubeなどのサイトで動画を見ることができたり、XやInstagramなどのSNSサービスも利用できたりします。

# マイナーなブラウザ『Vivaldi』
<img width="100" src="https://image.news.livedoor.com/newsimage/stf/5/a/5a017_1223_6f9b1631_eeccd1d1.jpg">

私が愛用しているブラウザはVivaldiというブラウザです。皆さんはご存知でしょうか？マイナーすぎて全世界でも0.05%(Chromeは62.85%)しか使用されていません。Vivaldiはざっくりいうとカスタマイズしたい人向けにおすすめなブラウザです。カスタムできる機能が多すぎて逆に全部使いこなすことができません...
以降は他ブラウザと違うおすすめな部分を紹介していきます

### タブを一つの画面で複数表示させることができる
下の画像はタブ１３個を一つの画面に表示させている画像
（逆にここまでやると見ずらいです）
![2023-12-06_15h52_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636180/342c6968-bc75-2247-6050-5f40fb345142.png)
例えば複数の画面で作業したいときに新しくウィンドウを開くのは面倒だというときにおすすめですタブ３つ～４つぐらいがおすすめです。１つのウィンドウでclassroomを開きながらgoogle meetを開きつつ、資料も見つつ、Youtu..というのはよく私もやっています。
#### やり方
![2023-12-11_09h08_34.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636180/b60fe94f-a108-05d0-cd78-1d06610481f1.gif)
①タイル（タブを分割することをタイリングといいます）したいタブをctrlキー+左クリックで選択する
②右下にある格子状のボタンをクリックし、タイルしたい方向を選択する
③あとはお好みで境界線をドラッグすることで画面の大きさを変えることができます
④タイリングを解除したいときはタイル解除というボタンをクリックすることで解除することができます
<br>
### マウスの動きで様々な操作ができる
どういうことかというと、ノートパソコンでトラックパッドでスクロールできたり、拡大縮小ができたりする機能をマウスでも実装することができるという機能です。また自分で実装したい割り当てを追加したり、いらないジェスチャーも削除できたりするので自分好みにカスタマイズできます。![2023-12-07_09h03_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636180/2bc08613-3992-0648-870c-825aeebae563.png)
#### やり方
![2023-12-11_09h17_40 (online-video-cutter.com).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636180/cc1b7c44-80cc-664c-0f0b-5f0479e76fb3.gif)
わかりやすいように右クリックされたら青い円形のマーク出るようにしています
①実行したいジェスチャーを右クリックしながら軌道を描く
このgifでは以下の順番でジェスチャーを実行しています
（１）リンク上で右クリックし、新しいタブで開く
（２）新しいタブをバックグラウンドで開く
（３）履歴を戻る
（４）履歴を進む


### 様々なページアクションを実行できる
私が一番推しているポイントがこのページアクションを実行できるという機能です。![2023-12-07_09h39_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636180/fdb63b69-a825-8630-dec1-a1176ccca24e.png)
様々なページアクションがあり、閲覧しているサイトにフィルターをかけることができたり、閲覧しやすかったりする機能などがあります。一番便利だと思うページアクションがCSSデバッガーという機能です。このCSSデバッガーを実行すると、下の画像ように要素ごとに色付き線で表示してくれます。わざわざコードを変えて開発者ツールを開かなくても、変更した部分が一目で分かるというのがHP政策を進めていく点でとても便利です。![2023-12-07_09h55_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636180/ba5d4a70-521d-f511-9fb3-1ee343aa3366.png)

# まとめ
vivaldiは紹介した機能以外にもサイドパネル機能や、標準でメモ機能、メール機能、トラッカー・広告防止機能、スクリーンショット機能、タブのスタック機能、さらにはchromeの拡張機能にも対応しているなど紹介してもしきれないぐらいたくさんの機能があります。またカスタマイズが好きな人にもお勧めで、とても細かい設定ができます。ほかの方がサイトで紹介しているものもあるので参考にしながら、自分好みにカスタマイズしてみてください。皆さんもぜひ気に入った点があったり、気になったりしたらダウンロードしてみてください。

参考サイト

https://gs.statcounter.com

https://www.seohacks.net/blog/907/

Vivaldi公式ホームページ（ダウンロードサイト）

https://vivaldi.com/ja/
【自分用メモ】「TextView.text ＝ ″文字列″」と「TextView.append( ″文字列″)」の違い

執筆中。帰宅後に追記。

「TextView.text ＝ ″文字列″」は
TextViewに文字列を『そのまま入れる』

「TextView.append(″文字列″)」は
TextViewに文字列を『追記する』

以下の天気アプリのコードのように

「TextView.text ＝ ″文字列″」のパターンと「TextView.append(″文字列″)」のパターンでは画面の表示のされ方に違いが出る。