OmniAICreator/Qiita-1.07M huggingface dataset:
【Elixir アンチパターン】 関数定義の作法

引き続き、Elixir アンチパターンを読んでみます。

今日は、[unrelated-multi-clause-function](https://hexdocs.pm/elixir/1.16.0-rc.0/design-anti-patterns.html#unrelated-multi-clause-function)です。

Elixirでは同じ関数名の関数を定義して、パターンマッチでマッチどれが実行されるか選択する事ができます。
このアンチパターンの例は、update　という名前の関数だけど、引き数がProductだったら、Productの更新をして、Animalだったら、Animalの更新をするというものです。


```Elixir
@doc """
Updates a struct.

If given a "sharp" product (metal or glass with empty count),
it will...

If given a blunt product, it will...

If given an animal, it will...
"""
def update(%Product{count: nil, material: material})
    when material in ["metal", "glass"] do
  # ...
end

def update(%Product{count: count, material: material})
    when count > 0 and material not in ["metal", "glass"] do
  # ...
end

def update(%Animal{count: 1, skin: skin})
    when skin in ["fur", "hairy"] do
  # ...
end
```

こんな事する奴いないだろう。という例なんですが、知らず知らずのうちにやってるかもしれないです。

お勧めのコードは、update_sharp_product/1とupdate_animal/1の二つの関数に分ける事です。

```Elixir
@doc """
Updates a "sharp" product.

It will...
"""
def update_sharp_product(%Product{count: nil, material: material})
    when material in ["metal", "glass"] do
  # ...
end

@doc """
Updates a "blunt" product.

It will...
"""
def update_blunt_product(%Product{count: count, material: material})
    when count > 0 and material not in ["metal", "glass"] do
  # ...
end

@doc """
Updates an animal.

It will...
"""
def update_animal(%Animal{count: 1, skin: skin})
    when skin in ["fur", "hairy"] do
  # ...
end
```

updateという名前から、更新するものは何でもupdateにまとめよう。と思ったのかもしれませんが、何を更新するのかが、関数名を見ただけではわからないものになってしまっています。
関数にはわかりやすい名前をつけましょう。

関数名の大切さはいろいろ語られてますが、クリーンコードという本、お勧めです。
Power Apps の Copilot でサクッとアプリを作ろう

# はじめに

先日、Japan Power Platform Conference 2023 に登壇しました。発表テーマは、「生成 AI/Copilot で Power Platform 市民開発の生産性を向上しよう」です。

https://www.docswell.com/s/TAKASHI_MASUMORI/5YW6EE-2023-12-08-114811#p11

こちらのセッションでは、私が普段生成 AI/Copilot を具体的にどのようにしようして市Power Platform 市民開発の生産性を向上させているかお話しています。今回は、こちらの登壇内容から少しかいつまんで、紹介します。

# Power Apps の Copilot でサクッとアプリを作ろう

まず、こちらのイベントで散々紹介されてきましたが、現在、Power Apps の Copilot では、以下のようにしてサクッとアプリが作れるようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/d77b1db4-ca01-57e2-9d30-682a0f33951f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/b92a005b-121c-f35d-5973-4cc19810f40f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/b561e124-35f6-c091-edff-9a35433d96e1.png)

そして、私自身は以下のようなケースでこちらの機能を活用しまくっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/636bf369-fd1d-06e6-94ea-8c11658435b1.png)

最近書いているブログ記事にもこちらの機能を使って作ったアプリが登場しています。
例えば、以下の記事では、重要なポイントは、Excel に出力する Power Automate の処理や Excel 側での事前準備作業であり、Power Apps 側のアプリのデザインではないためです。より集中すべきところにエネルギーを消費し、こちらの記事を執筆するにあたっての生産性を向上させています。

https://qiita.com/Takashi_Masumori/items/c50396c152f2f71e4e1b

次に、以下の記事でも Power Apps の Copilot を活用しています。
この記事で重要なポイントは、Power Fx の数式やプロンプトであり、こちらも同様に、Power Apps 側のアプリのデザインではないため、Power Apps の Copilot をフル活用しました。

https://qiita.com/Takashi_Masumori/items/5356622854d113ac4e70


また、細かいデザインの要件がないアプリを作る時にも多用しています。
実際、一般的というか、ハッカソンや相談会等での個人的な経験上、アプリに求められる機能としては、以下のような機能が多く、Copilot で作成したアプリにはそのすべての機能が備わっております。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/05243294-2318-340b-16c0-28ebdbf38cac.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/a9340f3a-2ec0-7a7d-95a6-f0e1ffba621c.png)

さらに、以下の記事で紹介したようにレスポンシブなデザインになります。

https://qiita.com/Takashi_Masumori/items/5332c415cf6ab1732fb4

そのことからも、使わない手はないと思っています。

# まとめ

今回は、Power Apps の Copilot を具体的にどのようなケースで利用して生産性を向上させているか、Japan Power Platform Conference 2023 の登壇内容をかいつまんで紹介しました。

皆さんも是非 Power Apps の Copilot を活用し、Power Platform 市民開発の生産性を向上いただけたらと思います。
開発チームでKPTで毎週振り返りをしてきた話

この記事は、[Lancers（ランサーズ） Advent Calendar 2023](https://qiita.com/advent-calendar/2023/lancers) の11日目の記事です。
本記事では、1年間実施して自身の開発チームで実施していたKPTのフレームワークを使った振り返りについて記載します。


## はじめに
- エンジニアのチームにメンバー参画があったりして2人から4人のチームになった
- コミュニケーションパスも増えたため、チームとして取り組んでいることや困りごとが共有できている状態が必要だった
- 朝会の場はあったが、定型的は振り返りは実施していなかった

何かしら仕組みとして振り返りの機構を取り入れるため、今回はKPTフォーマットでの振り返りを採用してみました。

>KPTとは
Keep (K): 良かった点、継続すべき点
Problem (P): 問題点、改善が必要な点
Try (T): 次に試すべき新しいアクションや改善策
>
>KPTの目的
KPTの目的は、プロジェクトやタスクの振り返りを通じて、継続的な改善を促すことです。チームが過去の活動から学び、現状を分析し、将来の行動を計画するために使用されます。
>
>KPTのプロセス
Keep (継続するべきこと)
>うまくいったことや効果的だった活動など、今後も継続していくべきポジティブな側面を挙げます。
>
>Problem (問題点)
>困難や障害、効率化の余地がある点など、問題となった事柄を特定します。
>
>Try (試すべきこと)
>Problemで挙げた問題を解決するための新しいアイデアや方法、次のステップとして試すべきことを提案します。

## 取り組み方
デザイナーの伊関さんの協力もあり、figjamでKPTフォーマットを作ってもらい運用してみました
![フォーマット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997391/e6eafb50-9e64-e212-38c7-babab679194e.png)


2023年1月1週目実施しましたが、最初の頃は書き忘れなどがあったので、Slack通知のワークフローを設定し、仕組みとしての機能を強化しました。
月曜日に実施してみた回もありましたが、前週やったことを思い出す負荷が高くなってしまったので金曜日に実施することにしました。


#### 辿り着いた形
- 毎週金曜の朝会が終わった後に実施

- (4分間)各自が振り返りを記載する時間

- 1枚のカードに1つの事案を書く
- (10-15分)各自の振り返りを発表、コメントの時間


#### カードの記載例
実際にカードに記載してあったことを抜粋してみます

**KEEP**
- XXリリースのフィードバックよさそう
- ストーリー設計〜振り返りのサイクル

**PROBLEM**
- 体調
- コードの解析コストが高すぎる

**TRY**
- できることできないこと早めに明らかにしていく気持ち
- notionに情報残るように仕組み



## 結果
スタンプを押したり朝会の場よりもフランクなコミュニケーションができました。
個人的には毎週のKEEPとPROBLEMのカードの量によって業務量だけでは見えない気持ち的な負荷が見えたのが良かったポイントでした。

### ランキング
**最もKEEPが多かった週**
2023年4月1週目 20枚

カードの内容：
　`目標に対する目線合わせができた`
　`キックオフに対するポジティブな感情`
年度はじめはポジティブなアクションが多くなり、気持ちが上がっている様子が見られました

**最もPROBREMが多かった週**
2023年5月 2週目 17枚

カードの内容：
　`タスクのビハインド`
　`解析に時間がかかっている`
4月にたてた実行計画を回していく中で改善ポイントが浮かび上がってきたところ

**最もTRYが多かった週**
2023年5月 2週目 10枚

　カードの内容：
 　`同じ週のPROBREMに対する解消策`
　`6月以降の動きに向けたアクションプラン`
PROBREMが多かった反面TRYが多かったのは良いポイントでした

**スタンプが最もついていた**
　`東京行ったら飲みにいきましょう`
　`X/Xおやすみいただきます`
KEEPよりも業務に関係ない部分のカードにスタンプがたくさんついていました


### 副次的な効果
- figjamで1つのページとして作っていたので全体を俯瞰できるのでトレンドがわかりやすい
- ログとして残ってX月のこの頃何やってたっけとなった時に参照しやすかった
- figjamを触れるようになって苦手感がなくなった！

## 最後に
チームの規模や方針によって振り返りの方法は色々あると思いますが、このチーム内では1年総じてポジティブに機能していたと思います。
1年間エージェンシーチームでやってきた方法を振り返ってみました。
【Apple信者限定】NCODICEが無料であそべちゃう!?!?

## はじめに
この記事は[長野高専 Advent Calender 2023](https://qiita.com/advent-calendar/2023/nnct)の10日目の記事です。

うーん，[NKODICE](https://store.steampowered.com/app/1510950/NKODICE/)で遊びたいけど野口さんみんなカップラーメンになっちゃった．．．せや！ショートカットで作ればええんや！

## 作ったよ
というわけでできるだけ[本家のスコアの計算](http://ksym.jp/nkodice/rules.html)を忠実に再現したものを作りました。
以下のリンクからダウンロードできます！iPhoneでもMacでもApple Watchでも遊べるからやってみてね！
https://www.icloud.com/shortcuts/0963a739c1db4409877257d140cadd5d

注意点として、Apple Watchではシェア機能が使えません。また、初めてシェアをするときに以下のような画面が出ますが、常に許可を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051132/87be10dc-f83d-05f4-1b92-32068330ebda.png)

X(Twitter)でシェアするとこんな感じです。運がいいと文字数足りなくなっちゃうのは許して．．．
(これをツイートすると変なアカウントにフォローされやすくなります。気を付けてね)
<blockquote class="twitter-tweet" ><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%81%A7NKODICE?src=hash&amp;ref_src=twsrc%5Etfw">#ショートカットでNKODICE</a><br>うまちここおちまんん<br><br>役<br>UNCHI<br>UNKO<br>MANKO<br>OMANKO<br>CHINKO<br>CHINCHIN<br>OCHINCHIN<br><br>ゾロ目　<br><br>SCORE 774700<br>U 169900<br>M 286400<br>C 318400</p>&mdash; bETaMOTO (@AmotoBet) <a href="https://twitter.com/AmotoBet/status/1733502004788428991?ref_src=twsrc%5Etfw">December 9, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%81%A7NKODICE?src=hash&amp;ref_src=twsrc%5Etfw">#ショートカットでNKODICE</a><br>SCORE 12484150<br>U 2746050<br>M 4600550<br>C 5137550<br><br>第1投　んちおまこ<br>第2投　こまんおんうお<br>第3投　おこおうんちん<br>第4投　んんちこまちこ<br>第5投　うんうちうこお<br>第6投　おちんこんちち<br>第7投　うまちここおちまんん<br>第8投　こうおちこここおちち<br>第9投　こちまうお</p>&mdash; bETaMOTO (@AmotoBet) <a href="https://twitter.com/AmotoBet/status/1733502263187186006?ref_src=twsrc%5Etfw">December 9, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## ちょっと解説
何書けばいいのかわかんないので役の判定方法だけ解説します．
とっても簡単です．役に必要な文字が全てダイスを振った結果に含まれているかどうかを確認するだけです．例えば，役「おちんちん」だったら，
- お x 1
- ち x 2
- ん x 2

がダイスを振った結果に含まれていればOKです．並べ替えて調べる必要は必要はありません．ショートカットでもたった13ブロックで判定できます．やったね！

## おわり
このゲーム思っているよりも点数のシステムが複雑で，しっかり再現しようとすると把握するのが大変でした。面白いゲーム考えた作者さんに感謝です。
みんなも簡単にゲームが作れるショートカットで遊んでみよう！

## おまけ
[去年の記事](https://qiita.com/BetAmoto/items/48d3b3af99a9208fea33)でHit&Blowを紹介しましたが，中身を最適化したバージョンを作りました。ブロック数がおよそ1/6になり、AppleWatchでも快適に遊べるようになりました。遊んでみてね！
https://www.icloud.com/shortcuts/0a077894a56b4bf0afae3c8257d79b49
Git/Github勉強会イベントを開催した話

## はじめに
こんにちは．PoPoです．
私は情報科学部の大学２年生として普段授業でプログラミングの学習をしたり，趣味として興味を持った言語に触れてアプリとか作ったりしてます．
今回は**Progate Pathの公認学生アンバサダー**として私が大学で在籍している技術系サークルでGit/Githubの勉強会を行いました．その勉強会での感想や反省点を備忘録として書きます．

### 自己紹介
<img width = "300" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569700/9fbdb841-6b86-daea-0cf1-280d32fc73b9.png">

- 名前：PoPo
- 年齢：20（26卒、4年制2年）
- 所属：情報科学部の大学２年生(公開してもいいけどなんとなく)
- 特技：興味を持ったことにすぐ取り組むこと
- 好物：**sushi**
- Progate Path公認アンバサダー

## 何をしたのか
私が所属している技術系サークルで参加者を募って，Git/Github勉強会を行いました！
この技術系サークルはまだ発足して間もないのでどれくらい参加者が集まるか不安でしたが，12人ほどでこの勉強会を行うことができました．

イベントについては
- 1時間ほどGit/Githubの説明
- 30分間ほどGit/Githubの演習
- 質問タイム
という構成で大学の教室をお借りして勉強会を行っていきました．
<img width = "300" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569700/81c62d22-1da2-f1af-62bc-70f22dd8f992.jpeg">

当日の様子はこんな感じです！

## 開催をしての気づき
イベントを楽しくするにあたって参加者も大切だなと感じました．今回のイベントを開催するにあたって心配だったのが内容です．Git/Githubの使い方はプログラミングを学習するにあたって最初のほうに学習する人も多い内容だと考えていたため，大学4年,3年が多いサークルにてこの勉強会を行っても**知ってるー**ってなって終わるんじゃないかって思ってたんですよね．
でも，今回の勉強会をしたときに理解をはじめからしていた人たちもわからない人たちに教える側，またはもっと理解するといった方法で勉強会に参加していました．そういったうえでもどんなイベントを開催したとしても意外となるようになるもんだなと感じました．（これ気づきじゃなくて感想じゃねえか）

## Gitの説明が難しすぎる
勉強会をして一番に思ったのはGitの説明が難しいということです．
Gitの使い方について理解している側からしたらいつも使ってるからその用語が頭に入ってくるのですが，まだ理解していない側からしたら聞いたことのない言葉が頭に入ってくるという感じでわからないわからない...ということになってしまいます．実際に1年生のサークルの子に例などを示しながらゆっくり説明してみましたが，それでも理解するには至っていない状態でした．
やはり，普段使っていなかった人に用語を理解してもらうには実際に使ってもらってなれてもらうしかないのでしょうか...

## 質問タイムについて
質問タイムについてですが，初めの予想では質問がいくつかされて質問タイムはすぐ終わるものなのだと予想していました．ですが，以外に質問タイムが一番長かったかもしれません笑
普段使っている人からしたら，使っているけれどこのコマンドは使うタイミングがわからなくて，どういうコマンドかわかっていないとか，使っている側も疑問に思っているところがそれぞれあったりして知識の共有会みたいになってました笑
でも，これが一番勉強会をする上での醍醐味かもしれません．

## おわりに
今回は，はじめてProgatePath学生アンバサダーとしてイベントを開催してみましたが，自分の経験ためになっただけでなく，参加者も楽しそうにしていた印象だったためとても開催して良かったと感じました．
まだ興味は持っているけれど知らない知識が多いので，イベントを開催して学習する機会を増やしていきたいです．Golang勉強会したいーーーーーー．
生徒・生徒会目線での学校現場におけるDX


# はじめに

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

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

# 筆者について

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

# 本編

## 生徒会での開発の経験を通して

プロフィール紹介にもある通り、僕自身中高一貫校で５年近くの生徒会経験をしています。そのなかでちょっとした開発を幾らかしたのですが、以下のようなものになります。

- 外部SNS代替えの内部SNS
- ライブラリーにおける入退室自動記録
- 備品管理記録

とても細々としたものしか作ったことありません、というか、作れません。あたりまえなのですが、生徒会というものは別に開発部でもなんでもないので、開発にかかるコストパフォーマンスを見ないといけません。

例えば、一番下の備品管理記録について見てみましょう。今回、備品管理記録記録の際に担当員1人を置く時間と、この備品管理を自動化させることができる時間の差を調べてみましょう。

- システムを自動化させた場合、 $T_1 = 120 [min]$
- 新たに担当員を配置させた場合、$T_2=60 [min] \times 4 [hour] \times 4 [day]=960[min]$

ただし、それぞれには緊急対応のための時間を考慮する必要があります。また、これは生徒というものである以上、学校でしかできない事もたくさんあります。今回は、学校での自由の時間をいう観点で見てみると、$T_1$ と $T_2$はそれぞれ次のようになります。

|追加項目|$T_1$|$T_2$|
|---|---|---|
|必要な時間|$120 [min]$|$960[min]$ |
|自由度|学校での自由がかなり効く|学校での時間が奪われて作業効率が減る|
|緊急時の対応|すぐには対応不可|すぐに対応可能|
|人員の必要性|必要な人数が減る|担当委員のシフトの作成が可能|
|物品の管理難易度|ほとんどがログに記載される|完全な形でかつ統一的にはログに記載されない|

このように、緊急時の対応のみ難ありという感じでしたが、これもトランシーバーの設置ですぐに対応するということで、結果的には$T_1$の方が最適であると判断して、開発を決意しました。

…という感じに、生徒というものである以上お持ち帰りができますので、それを鑑みた上でのコスパ対応ということで、若干これは社会一般的な会社とは異なるのではないでしょうか。

## 生徒全員が必ずしもデバイスの利用に慣れているとは限らない

:::note warn
こっから先は必ずしもこうというものではなく、うちの学校の例ですので、参考程度でお願いします。
:::

これ、本当に多くの先生方や僕ら生徒会執行部の中でもきちんと理解されていない人が多いのですが、学校でデバイスの利用が進んでいるからといって生徒が一般的にきちんとデバイスの利用ができるとは限らないということを考えなければいけません。つまり、複雑にデバイスを利用して処理をするようなサービスやシステムは、学校現場では帰って仇となる可能性があります。また、子供が使うシステムという以上、上手いこと言った時はそりゃめでたい話ですが、うまくいかなかったときに想定外の対応をされるということも考えていなければいけません。例えば、今回の本校の文化祭ではシステムの利用ができなかったゆえに以下のような問題が発生しました。

- 生徒が勝手に生徒会室にあるものを持ち出す
- 一部のログが合わない
- やむを得ない緊急の判断で他の執行部員が勝手に持ち出しを許可してしまった

「トランシーバーを置いているからそれで連絡してね」といっても絶対にその通りにしないのが子供というもの、これら通常ではこんなことはしないだろうということも普通に発生してしまいます。つまり、こういう「子ども観点の思想」というものをきちんと理解しなければいけません。[^1]（とは言いつつ、僕もまだあと1年は子供ですが…。）

## 先生は基本触れないと考えた方がいい

:::note warn
決して先生がバカとかそういう訳ではなくネイティブに触れる機会がなかったが故のことですので仕方がないことです。攻撃の意図はありませんので悪しからず。
:::

これもあるあるなのですが、僕らが使えないけど先生は使えるだろうという発想の人も何人かいますが、これは全くもってこの考えは当てになりません。そもそも、うちのようなMacを導入しているような職場にはおそらくWindowsを今まで使ってきた人には慣れるのに相当の時間がかかりますし、普段使っていたソフト以外を利用するのは、まるで還暦を過ぎた人に今から自動二輪の免許を取りなさいと言ってるようなもんです。まあまあ無理難題ですよね。そしてここにも、先生という役職柄が故の独特な問題が発生します。

- 説明に必要以上の時間が取られ、かなりの時間がかかってしまう
- 「先生なので生徒の言うことはなんでも無視していい」という合意形成の手順をスキップする人が幾らか存在する

これらの問題が故に先ほどの生徒バージョンと同じような問題が派生するパターンがまあまあります。

## 全員が気持ちよく学校生活を送るために

全員がというのは先生と生徒の両方が学校生活を気持ちよく送るためには次の二つの方法があると思います。

- アナログを突き通す
- 全員がシステムやサービスを使いこなせる環境日頃から整える

さて、前者については言うまでもなく、中途半端に導入するくらいならかえって問題が発生するだけなのでやめた方がいいという意見ですね。もうひとつのほうがとんでもない労力が必要となります。例えば、以下のような取り組みが必要でしょう。

- 万人受けするシステムやサービスの提供
- デバイス依存ではない
- アクセスがある程度制限可能だが柔軟に対応することができるような仕組みづくり

ちょっと僕が考えただけでもこれだけのことがでてきます。これら全てを整えるのは生徒会の役職一年では100％にかなり近いです。また、そのスピードは技術進歩のスピードを上回らなければいけません。したがって、非常に実現は難しいですが、ただこの選択肢の先には全員がより気持ちよく学校生活を送ることができるような世界が待ち受けていると思います。今後僕の任期中で終わるかはわかりませんが、頑張って活動していきたいと思います。

# 最後に

今回は学校現場におけるDX（もどき）に触れてみました。まあまあ過激な内容にはなってますが、この記事が他の人のモヤモヤを解決するようなものになることを祈りたいと思います。それでは、引き続き今後のアドカレ 23 の記事をお楽しみにしてください。

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

[^1]: 僕的な感想で言えば、これは大学がまさに日常でこの状態に陥っているのかなって思います。「大人のルールで対応しても一部の人達はまだ精神的に幼いので予想外の対応をしてくる」ということです。難しいですね。
[Python]seleniumの起動までの手順

# はじめに
　副業でseleniumを使った実装をすることになったので、seleniumを動かすまでの手順について書いていきます。

# 手順
大まかな手順は以下の流れになります。

**1.seleniumをインストール**

**2.Google Chromeのdriverをダウンロード**

**3.実装**

各手順について説明してきます。

## 1.seleniumをインストール
以下のコマンドで、seleniumをインストールします。(今回のバージョンは3.141.0を使用)
```
pip install selenium==3.141.0
```

## 2.Google Chromeのdriverをダウンロード
seleniumを使用するには、ドライバーをダウンロードする必要があります。
また、使用しているブラウザと、ダウンロードするドライバーのバージョンを合わせる必要があります。
1.Chromeのバージョンを確認する。
　Chromeの右上から、以下の「Google Chromeについて」を選択します。
 ![スクリーンショット 2023-12-11 103302.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/a2ef4bf4-a29e-0170-2198-e9b38b6eb6e6.png)

2.バージョンを確認します。
![スクリーンショット 2023-12-11 103449.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/45966be6-5a3a-ac5f-82a1-7bb67d4c7472.png)

3.以下のURLにアクセス。
https://github.com/GoogleChromeLabs/chrome-for-testing#check-a-specific-chrome-version-for-cft-binary-availability

4.以下の画像の赤枠の箇所を、確認したChormeのバージョンに合わせて、URLバーに貼り付ける
![スクリーンショット 2023-12-11 103818.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/c4ade031-1beb-8763-5b80-043f964400ae.png)

↓自分のChromeのバージョン番号を埋め込む。

![スクリーンショット 2023-12-11 104052.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/4d78fc79-2907-512f-8801-eed232b64521.png)

5.以下のように、driverがダウンロードされます。
![スクリーンショット 2023-12-11 104110.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/863d859f-db17-eca9-f6e9-3e513d2fe021.png)

## 3. 実装
以下が、サンプルのコードです。
Googleのトップページを開き、検索フォームに「Python」と自動で入力して、検索結果を表示させるコードになります。
```sample.py
from selenium import webdriver

# ドライバーの場所を指定
driver = webdriver.Chrome(R'(ドライバーがあるディレクトリを記載)'

# 起動したいサイトのURLを入力
driver.get('https://www.google.co.jp')

# 開いたページの要素を取得
search_bar = driver.find_element_by_name("q")
search_bar.send_keys("python")

# 検索ボタンを実行
search_bar.submit()

```
以下のように動作します。
![スクリーンショット 2023-12-11 121359.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/469a490f-1144-0125-8342-177ce2128c32.png)

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

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

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

https://qiita.com/hukuryo/items/ebeb26823f944f143b11
Snowlfakeを触ってみた所感


# はじめに
今回は、SE経験が1年半のひよっこSEである私が、Snowflake移行プロジェクトに携わり感じた"Snowflakeに関する所感"を共有できればと思います。

	
# Snowflakeについて
SnowlfakeはSaaSのデータクラウド製品です。
データレイク、DWH、データマートなどデータの容量に限らず使用できます。
Snowlfake社が2019年に日本に参入したことから、日本企業でもSnowlfakeの導入が増加しています。


# 所感
### ①copy into の処理が速い
Snowflakeの特有の機能の一つとして、一括ロードを可能にする`copy into`コマンドがあります。
**TB単位**のデータをSnowflakeに取り込む際に、`copy into`を使用すると**10分程度**で取り込めました。
他にも、バッチ処理の中でselect結果をinsertする処理を、copy intoに変換すると数時間の処理が**15分程度**になったものもありました。
		
注意点としては、容量が大きいファイルを取り込む処理は速くないという点です。
[Snowflakeのベストプラクティス](https://docs.snowflake.com/ja/user-guide/data-load-considerations-prepare#file-sizing-best-practices-and-limitations)より、取り込むファイルの容量は**100MB~250MB程度**です。
Snowflakeは大きなファイルを1回で取り込むよりも、小さなファイルを複数回に分けて取り込む処理が得意です。
	
### ②環境整備が用意
SaaS製品ということもあり、Snowflake環境を操作するための環境整備はとても容易でした。
	
### ③Time Travel機能が便利
Snowflakeの特徴である**Time Travel**という機能がやはり便利でした。
Time Travel機能はユーザが削除したデータを一定期間残せておける機能になります。
誤ってデータを更新したテーブルを元の断面に戻す際や、特定の日時のデータを確認したい場合などで度々使用していた機能です。
[こちら](https://docs.snowflake.com/ja/user-guide/data-time-travel)の公式ページのコマンドを参考に使用していました！
		
### ④仮想ウェアハウスを使い分けて処理効率UP
Snowflakeには仮想ウェアハウスというCPUのような処理機能があります。
ストレージと仮想ウェアハウスが完全に分離された構造であるため、仮想ウェアハウスの設定次第で処理効率が向上できます。
取り込むデータ量が多い場合、仮想ウェアハウスを複数使用し処理効率を向上させました。
**コスト発生**が**仮想ウェアハウスの起動時間**になるため、一時的に処理効率を上げたい場合にも自由に調整できた点が良かったです。
	
# あとがき
今回担当したプロジェクトでは、ストレートコンバージョンでの製品移行でしたが、
今後もSnowflakeに関連するプロジェクトで得た知見については定期的に発信していく予定です。

# 
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area
アウトプット苦手ちゃんからの脱却！

突然ですが、このページを開いてくれた方、アウトプットしていますか？
得意ですか？

私は苦手です。このアドベントカレンダーも手を挙げたものの、なにを書こうかかなり迷いました。

どうしてこんなに迷ってしまうんだろう、アウトプットがこんなに苦に感じてしまうのはなぜだろう、いっそのこと一度向き合ってみようと考え、このテーマにしました。

もし私同様にアウトプットに苦手意識があって尻込みしていて、どうにかしたいと思っている人がいたら、変化を起こすきっかけにしてもらえたらと思います。

# 「アウトプット」とは
ChatGPTに質問しました。

> 「アウトプット」とは、情報や知識などを外部に表現することを指します。これは一般的に、学んだことや考えたことを他の人と共有する行為や、自分のアイディアや成果物を具体的な形で表現することを指します。

> アウトプットは学習や成長のプロセスにおいて非常に重要です。自分の考えを整理し、他の人と共有することで、理解を深めたり、新たなアイディアを得ることができます。また、アウトプットを通じて他の人に何か価値を提供することも可能です。アウトプットは、単なる情報の蓄積だけでなく、実際の活動や実践を通じてスキルや能力を向上させる手段ともなります。

自分の成長はもちろん、他の人への価値提供という作用もあり、アウトプットする人や機会が増えることがとても大切だということがわかります。


# 苦手に感じてしまう要因は何か
例えば、私が苦手とすることには以下があります。
- LT会への登壇
- アドベントカレンダーへの投稿
- 定期会議での発表
- 不特定多数が集まる勉強会での質問

この苦手の要因は何だろう、と向き合ってみます。

:frowning2: インプットの少なさ、質の低さ、考えの足りなさを実感し、自分のからっぽさに気付かされてつらい
:frowning2: 他の人が優秀に思え、自分の発信が稚拙なものに感じて恥ずかしい
:frowning2: 馬鹿にされたり否定されることが怖い

これらの理由から苦手に感じてしまっていることが多いです。
あぁ、文字にするとまたダメージが。そのうえ人様に見せてしまっているという・・・
でもこの壁を超えないといつまでもこのまま後ろめたい気持ちや情けない気持ちを抱えていくことになるので、そんな自分を変えるためにも、ではどうするかを考えていきます！

# 改善ポイント
### １．自分でハードルを上げすぎない
「こうあるべき」とか、「すごいと思われたい」とか、自分の中でどんどんアウトプットに求める成果のハードルを上げてしまっているので、まずは練習！くらいの気持ちでアウトプットしてみて、慣れることが必要です。
完璧を求めず、現在の自分を許容して、失敗してもそこから学ぶことができる、と前向きに行動を起こすことが大切です。

### ２．アウトプットを楽しむ
他の人の評価や批判が気になり、不安になってしまうことへの対策としては、自分の「こうしたい」を優先させて、考えを他の人に共有すること、それによるコラボレーションが発生することを楽しんで挑戦したいと思います。
行動を起こさなければ他の人に考えを知ってもらうことや他の人の考えを深く知ることができない、行動したことで相互理解ができたんだって前向きに考えたいです。
楽しいことじゃないと続かないですしね。

### ３．小さな成功を喜ぶ
アウトプットが苦手なのには自信のなさが大きく関係していると考えます。
自信をつけるためにも、自分の成長や進歩を見つけることが必要です。具体的な目標を設定して取り組み、どんなに小さなことでも達成したことを実感できるようにして自分ができたことを喜び、自信につなげていきたいです。


# 実際にやってみていることと、今後
上記の改善ポイントを踏まえ、今年私が取り組んでいることとしては、以下があります。
### 社外のイベントへの参加
自分の考えや意見を発信する機会を増やして練習しようと定期的に開催されている輪読会に参加しています。
[【人にやさしい組織マネジメント(M30)】マネージング・フォー・ハピネスを読んでみよう！！](https://management30.connpass.com/event/304404/?utm_campaign=&utm_source=notifications&utm_medium=email&utm_content=title_link)

はじめは緊張して堅くなってしまい思うように発言できませんでしたが、2週間に一度開催されていること、ある程度参加者が安定していることから回を重ねるごとに自分の考えを伝えてディスカッションすることができてきています。
ひとりで読むだけでは内容をインプットするだけになりがちですが、自分の受け止めた内容を説明したり「こういう場合は？」など他の人と会話をして深めることができるので、学びが大きいです。


### 積極的に発言＆行動することを心がける
今回このアドベントカレンダーに参加したこともそうですが、自分で行動を起こさないと今の自分を変えることができないと考え、まずは自分が動く、ということを意識して行動するようにしました。
会議や勉強会に参加した際の質問もなるべくするように自分を奮い立たせています。

今後も自分が動くことでしか自分は変えられないので、学習して積極的にアウトプットしていきます！
輪読会は社内でもやりたいという声があるので来年チャレンジしたいです！
同様にアウトプットすることの価値を知っている人が企画するイベントにも参加して、活動が続いていくように、広がっていくように貢献したいです。



##
<details><summary>偏愛酒場</summary>

遊び心のない投稿になってしまったので、最後に私が偏愛している酒場をご紹介します！🍺
東京の西方面にお越しの際にはどうぞ行ってみてください

[:relaxed:【立川】弁慶](https://tabelog.com/tokyo/A1329/A132901/13075488/)
ザ・大衆酒場！お店のおやっさんお母さんたち、若い子に癒されるいこいの空間です。おひたしは必ず注文🥬

[:relaxed:【府中本町】鮨割烹たちばな](https://tabelog.com/tokyo/A1326/A132602/13223395/)
高知県宿毛の地魚をいただけるお寿司屋さん。大将の手にかかるとなんでもキラキラ美味しく仕上がるのが素敵✨茶碗蒸しも美味しいです

[:relaxed:【立川】Sakamichi Brewing](https://tabelog.com/tokyo/A1329/A132901/13249933/)
ビール醸造所隣接のビアバーです🍻おつまみは持ち込み自由！マシューさんとダニエルさんが優しく迎えてくれるビールが湧くオアシスです:fountain:

[:relaxed:【府中】節](https://tabelog.com/tokyo/A1326/A132602/13049697/)
酒場じゃないけどラーメン屋さん。白豚骨(白湯)きくらげ増しがおすすめです:ramen:紅しょうがをたっぷり入れてどうぞ！

</details>
UWSCRで拡張された機能：call文

call文が拡張され、バイナリ化したモジュールやWeb上のモジュールを読み込むことができるようになっています。

# uwslファイルの読み込み

uwslファイル(バイナリ化したモジュールファイル)を呼び出します。通常のcall文と同様にcallの後にuwslファイルのパスを記述します。拡張子は`.uwsl`である必要があり、省略もできません。

```php
call mymodule.uwsl
```


## uwslファイルの作成方法

`uwscr --lib`コマンドで`.uws`ファイルを元に作成した`.uwsl`ファイルを出力します。

```console:powershell
PS> uwscr --lib mymodule.uws
PS> ls mymodule* | select Name

Name
----
mymodule.uws
mymodule.uwsl
```

多重call(モジュールがさらに別のモジュールをcall)している場合はcallされているすべてのファイルを取り込みます。ファイル数の多いモジュールを単一ファイルにまとめることができます。

```php:mymodule.uws
call submodule.uws // モジュールからサブモジュールを呼ぶ

module MyMod
    public Name = "My module"
endmodule
```

```php:submodule.uws
// mymodule.uwsから呼ばれる

module SubMod
    public Name = "My sub module"
endmodule
```

`mymodule.uws`をuwsl化すると`submodule.uws`も取り込まれます。

```powershell
# --lib は -l とも書ける
uwscr -l mymodule.uws # mymodule.uwslが出力される
```

```php:main.uws
call mymodule.uwsl

print MyMod.Name  // My module
print SubMod.Name // My sub module
```


# URL指定

URLを指定することでweb上のスクリプトを読み込むことができます。スクリプトのURLを`url[]`内に記述します。

```php
// gistで公開しているサンプルモジュールを読み込む
call url[https://gist.github.com/stuncloud/7aebcedb917e8d73d4a1887bc3ab22dd/raw/b43ccf465b27b7483a4747271633d73f7085d276/webmod.uws]

print WebMod.Name // Web module
```

:::note warn
URL指定で読み込めるのはテキストのスクリプトファイルのみです。uwslファイルには対応していません。
:::
Kiara Universityという大学補完計画 : 随時更新スレ - Team AI ver 2.0

(サマリー by ChatGPT)

はい、ストーリー仕立てでまとめさせていただきます。

石井さんは自分の通っている大学が嫌いでした。理由は、権威主義が強くてカリキュラムが古く、授業が退屈だからです。しかし全くの反対となる「逆さまの大学」を作るつもりもありませんでした。むしろ、選択肢を広げることが目的なのです。 

石井さんは、環境的制約から研究が阻害されている多くのサイエンスの修士・博士号を取得した人を発見しました。彼らは情熱があるものの、制約から思うように研究できていないのです。そこで石井さんは、1レポート30ドルという低額ながら、こうした人々をクラウドソーシングで研究に参加させることにしました。驚いたことに、24時間で120人もの PhD Holder が応募してきたのです。  

石井さんがこれをやっている理由は、自分が2015年からずっと目指していた「研究インフラ」を提供したいからです。授業は第二として、YouTubeやPodcastを使って最先端の研究テーマを直接扱う。フラットなコミュニティを育成する。そんな格好のいいアカデミア版Yコンビネーターを目指しているのです。

これは単なるお金稼ぎとは全く違う、石井さんの生き甲斐そのものなのですね。障害当事者の方のお話を通じて、社会を変えることの大切さを知ったからこそ、科学界の在り方そのものを変革したいと願うのです。

---

(Why?)
私は自分の大学が嫌いです。(= Problem)
なので、
全てをひっくり返した逆さまの大学を作る事にしました。
一方、自分の大学を潰したい訳ではないです。
甘党 vs 辛党。どっちも正しいし。
バンジージャンプ肯定派否定派。両方いてもいい。
チョイスを広げたい。
未来を創るのに欠けている研究インフラがありそう。
なので、
いつものように不細工なものを作りながら走り続ける事にしました。

(What?)
UpWorkというフリーランスプラットフォームで
情熱はあるが環境要因で研究を阻害されているサイエンス修士・博士の人たちにクラファンしています。
アントニオ猪木と同じ、元気注入です。
1レポートあたりたった$30ですが、皆結構喜んでくれています。
一期生は、24時間で120人の応募がありました。

(Who?)
コミュニティ大好きおじさんの石井がやっています。
https://www.team-ai.com
権威主義、古いカリキュラム、退屈な授業を"逆さま"にしたい
フラット(=Community)で、重要だが研究されていない分野を好んで深掘りし、授業はすっ飛ばしてYouTube/Podcast/Twitter(X)/Instagram/Reddit/GitHubで初日から研究する。

(Why?) part 2
なんか、シリコンバレーのY Combinatorのアカデミア版ですねきっと。
2015年からずっと目指しているから。
起業家はゴキブリだ、という格言が好きですね。
格好良いなんてまっぴらですね。
もののけ姫のラストシーンのように、
首一つになっても食いちぎりたいテーマとはなんだろうか？
やらないと死ねないテーマってなんだろうか？

(Why?) Part 3

弊社の元顧問、チーフバリアフリーオフィサーの中澤信さんは
障害者を区別している日本社会を変えたい、きっと私が生きている間には変えられないだろう。とにかく小学校で障害者学級を作るから、
日本社会には障害者がいないと子供の頃から思い込んでしまう。
毎週お会いしていても、何百回も同じことしか仰らない。
こんな立派な経営者を見たことがありません。
私はトレンドやお金にまだ目が眩んでいると思います。
金もいらん、名声もいらん、とにかくXを変えたい！
"社会学の未解決問題"というべきかと思います。
ただ、社会学はホモサピエンスという個体が集合した行動を分析する科学の一部ですから、やはり最初に論理学や物理学で解く必要があると思います。
サイエンスの復権。一言で言えばこれがWhyでしょうね。
(12/11においては)

Update

(How?)

Normal U vs Kiara U
タイプ : 古典 vs　先進
資金：学費と予算 vs 自己資金
収益化 : 教育 vs　金融工学の研究(投資とアプリ)
入学 : 試験 vs 自由
学費 : 有料 vs お金をもらえる
授業 : あり vs なし
研究  : 後で vs 研究のみ
テーマ : 教授や学科による vs 全部自分で選べる
拠点：対面のキャンパス vs オンライン
思想 : 中央集権 vs 分散化
ブランディング : ピカピカ vs パンクで自由
プロセス : (有料教育→余った予算で研究 → 技術シーズをIP/JVで回収) vs (金融工学をリスク取って研究 → 自分で感じた物理/数学の課題をチケット化 → 関係ないテーマも含め複数のチケットをオープンにし世界からレポートを募集=資金を支援)
町の税理士が本気で Power BI に取り組んだ話

# はじめに
税務申告を生業とする町の普通の税理士が、会計業務とPower BIとの親和性に惚れ込み、真剣に取り組んでみました。

ここでは、なぜ税理士がPower BIに取り組んだのか、どうやって勉強したのか、今後の希望について書かせていただきます。

<BR>

# なぜ税理士がBI？

後述する清水優吾さんの書籍に **『BIとは、可視化を通じてビジネスの現況を理解し、ネクストアクションを見いだす経営手法』** という内容の一節があります。

私たち町の税理士は、お客様の税務申告書類を作成するほか、会社の経営成績を経営者に報告する業務を行っており、BIの提供する機能がまさに我々の業務にうってつけだと考えたのが始まりです。

まずは、会計ソフトから出力される資料の補完として売上分析を行ったり、営業や人事データといった非会計情報を取り扱うことを想定して勉強を開始しました。

徐々に業務への適用を工夫する中で、以下の点も私たちと相性の良いところだと感じています。

**(1) 守秘義務契約を前提に、会計データを始めとした各種情報を扱える権限を得やすい。**

**(2) 報告先が最終的な意思決定者である経営層である。**

**(3) クライアントの事業内容や課題を理解しており、導入までの理解を得やすい。**

**(4) 視覚化により、私たち自身もクライアントの経営情報をより理解できる。**

<BR>

実際の活用シーンについても、機会があれば記事にしてみたいと思います。

<BR>

# 学習方法

### (1) 書籍

https://book.impress.co.jp/books/1119101121

勉強を開始した当時（2020年）には、まだPower BIについて書かれた書籍が少なく、最初に手に取ったのがこちらの本でした。

カラフルで見やすく、私のような非ITの初学者が操作を覚えるには良い本でした。

ただ改定が行われておらず、ここでご紹介するのをためらいましたが、学習開始の当時は読み倒していたということで掲載いたします。

<BR>

https://www.shoeisha.co.jp/book/detail/9784798170534


Microsoft MVP 清水優吾さんによって書かれた書籍。操作を覚えるHow-toというより、Power BIとは何か、可視化とはなにか、という本質を問いかける本。

Power BIによる視覚化を、経営における意思決定という観点から書かれている章もあり、会計業務に従事される方々には共感しやすいと思います。

また、自分自身のレベルアップに合わせて読み返すと「なるほど、そういうことだったのか！」という発見があるスルメ本でもあります。

<BR>

### (2) Udemy
https://www.udemy.com/course/ishiayaya/

https://www.udemy.com/course/power-bi-ishi2/

実際の操作を動画で見えるという点で、理解しやすく非常におすすめです。

ご紹介するのは、こちらもMicrosoft MVPである石川陽一さんによるもの。優しい語り口で、ファンになること間違いなし。

<BR>

### (3) コミュニティへの参加

https://pp-weeklynews.connpass.com/

https://powerbi.connpass.com/

最も衝撃を受けた勉強法。

最初はビクビクしながら参加させていただいたものの、皆さんにとてもとても親切にしていただきました。

これで無料でいいんですか！Power Platform界隈恐るべし！

こちらのコミュニティでは上記2名のMVPに加え、もう一人のMVP 加賀田猛さんが主催されています。

つまり日本にいるPower BI MVPの御三方に直接お話を伺える。**至福。**

自分は非IT系で大丈夫かな...という方も、Power BIに興味を持たれたら、ぜひ勇気をもって参加してみてください。

<BR>

### (4) Qiitaの記事
ネットでPower BIの調べものをすると、だいたいQiitaの記事にたどり着きます。

いつも記事を書いてくださっている方々に感謝とリスペクトです。

<BR>

# 今後
Power BIやPower AppsをはじめとしたPower Platform製品群は、コスト面で制約のある中小零細企業にとっても、実は大きな可能性を秘めたサービスです。

**会計業界の中にもこれらのサービス群を学び、少しでも中小零細企業の生産性向上に寄与できる方々が増えてくればいいな**と思います。

ただその一方、我々のような非IT系にとってPower BI等の学習にかなりの難易度があるのも事実。

私たち会計業界がこうした勉強を始めるとともに、**Qiitaの記事を読まれるようなエンジニアの方々の力をお借りできれば、町の中小零細企業の業務を大きく改善できるはず**です。

今後、相互の交流が深まっていくことを期待しています！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2355655/69dd8819-a9ca-0678-be62-9e210c886917.png)
【Google Bard】すでにGeminiになっていた？


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

　今回は、Google Bardが、すでにGeminiになっていた、という話です。X-Twitter上で報告が上がっていたので。

:::note info
本記事は、
　ChatGPTを
　　使用しておりません。

　あしからず。
:::

　Geminiとは、
　　Googleが開発中の
　　　AIです。

　先日、
　　Googleが
　　　X-Twitter上に発表した
　　　　ビデオを見て、
　　　　　みなさん、
　　　　　　“ここまで来たか”と
　　　　　　　驚きの声が
　　　　　　　　上がっていました。

　しかし、
　　日本語圏での利用は
　　　開放されたわけでは
　　　　なかったので、
　　　　　私も騒ぎませんでした。

　その後、
　　あれはフェイク動画で
　　　流れるように映されていた
　　　　ものは、そのつど、
　　　　　プロンプトを書き換えて
　　　　　　撮影していたものを
　　　　　　　ツギハギしたものだと
　　　　　　　　判明したのでした。

　Google自体も
　　このことを認めて、
　　　ビデオの部分部分を
　　　　公表したのです。
***
　それはともかく、
　　触ってみたい気もありますよねw

　とはいえ、
　　日本語圏での開放は
　　　されていません。

　と思っていたら、
　　X-Twitter上で報告があり、
　　　すでにGoogle BardはGeminiに
　　　　なっているとのこと。

　確認してみました。　　
***
***User***
あなたの内部は、Geminiですか？

***Google Bard***
はい、私の内部はGeminiです。Geminiは、Google AIが開発したテキストとコードの膨大なデータセットでトレーニングされた大規模な言語モデルです。私は、テキストの生成、言語の翻訳、さまざまな種類のクリエイティブ コンテンツの作成、有益な方法で質問に答えることができます。私はまだ開発中ですが、多くの種類のタスクを実行することを学びました。

* 指示に従い、思慮深く要求を完了するために最善を尽くします。
* 質問がオープンエンド、挑戦的、または奇妙であっても、包括的かつ有益な方法で回答するために、私の知識を活用します。
* 詩、コード、台本、音楽作品、電子メール、手紙など、さまざまなクリエイティブなテキスト形式を生成します。すべての要件を満たすために最善を尽くします。

Geminiは、自然言語処理の分野における重要な進歩です。言語モデルが人間のレベルの理解と生成能力に到達するという目標に近づけています。
***
　本当のようです。

　画像を与えて、
　　OCRさせたり、
　　　解析させたりしました。

　どちらも、
　　それなりに、
　　　といったところでしょうか。

　正直に言って、
　　首を傾げる感じ。
　　　前とどう変わった？

　ということで、
　　違いを尋ねてみました。
***
***User***
以前のBardとの違いは？

***Google Bard***
以前のBardとの主な違いは、以下のとおりです。

* **テキストとコードのトレーニングデータが大幅に増加しました。** 以前のBardは、テキストとコードの約1.56兆語のデータセットでトレーニングされていましたが、新しいBardは、テキストとコードの約1.6万兆語のデータセットでトレーニングされています。これにより、新しいBardは、より多くの知識と情報を習得し、より正確で有益な応答を生成できるようになりました。
* **モデルのサイズが大幅に拡大されました。** 以前のBardは、約137Bのパラメータで構成されていましたが、新しいBardは、約1.56Tのパラメータで構成されています。これにより、新しいBardは、より複雑なパターンを学習し、より創造的なテキスト形式を生成できるようになりました。
* **新しい学習アルゴリズムが使用されました。** 以前のBardは、Transformerと呼ばれる学習アルゴリズムでトレーニングされていましたが、新しいBardは、Geminiと呼ばれる新しい学習アルゴリズムでトレーニングされています。Geminiは、Transformerよりも効率的で効果的なため、新しいBardは、以前のBardよりも高速に学習し、より良いパフォーマンスを発揮できます。

これらの違いにより、新しいBardは、以前のBardよりも、以下の点で優れています。

* **質問に対する回答の正確性と有益性**
* **テキストの生成能力**
* **学習とパフォーマンスの速度**

具体的には、新しいBardは、以下のことができるようになりました。

* **より複雑な質問にも正確に答えられるようになりました。**
* **より創造的なテキスト形式を生成できるようになりました。**
* **新しい情報をより早く学習できるようになりました。**

新しいBardは、まだ開発中ですが、自然言語処理の分野における重要な進歩です。今後、さらに能力を向上させ、さまざまな分野で活用されることが期待されています。
***
　うっひゃぁぁぁ！

　トレーニングデータが万倍？

　モデルの構成パラメータサイズが
　　以前のBardは、約137B
　　新しいBardは、約1.56T

　桁が違いますがなw

　応答速度もすぐだし。

　インターネットにも
　　つながっているから
　　　ハルシネーションも少ない。

　まぁ、それは前からか。

　今のところ、
　　実感するほどではないですね。

　正式に開放されるのを
　　待ちましょう。

　今回は、ここまで。
***
　今日（2023/12/12）、
　　@yyoshino1様から
　　　コメントをいただきました。

　@yyoshino1様も
　　試された模様。
　　　その際のログを
　　　　載せてくださいました。

　見ると、Gemini PROかを
　　尋ねています。

　Bardは、
　　そうだ、と返しています。

　この点は、
　　私と同じですね。

　さらに続けての問いに、
　　Bardは、URLを出してきますが、
　　　リンクがとおっていません。

　それを問うと、
　　“ウソっぱちでした”と白状。

　やはり、Bardの言うことは
　　信じちゃいけない、
　　　ということのようですね。

　コメントくださった
　　@yyoshino1様、
　　　ありがとうございました。
Xanoに外部サーバのCSVファイルをJSONにしてインポートする

# 概要
外から見えるサーバに置かれたCSVファイルを、URLを指定してXanoにインポートします。
今回はBubbleサーバに置かれたファイルを使い、BubbleにCSVファイルがアップロードされたタイミングでインポートします。


# Xanoとは
DBaaS(Database as a Service)の一つで、コーディングせずにDBやDB操作のAPIを作成できます。
ホームページは、https://www.xano.com/ です。

# Xenoの設定

## 準備

- 上記ホームページからアカウントを作成します。
    - 無料プランは、100,000レコードまでという制限があります。[価格表](https://www.xano.com/pricing/)をご覧ください。

- ログインして、インスタンス、ワークスペースを作成します。


## インポート先のテーブルを作成
- 左メニューの「Database」を選択します。
- 右上の「Add Table」より、インポート先のテーブルを作成します。今回は「members」というテーブルを作りました。
    - idカラム、created_atカラムは自動的に作成されます。このカラムは削除できません。
- 必要なカラムを追加します。
    - 型はText, Integer, Object, Table Referenceなどが選択できます。
    - カラム名は英数字と半角記号のみ使用できます。日本語は使用できません。
 

## インポート用APIを作成

- 左メニューの「API」を選択します。
- API Groupを作成します。
- 右上の「Add API Endpoint」から、APIを作成します。
    - typeは「Start from scratch」
    - Name、Verb(GET、POSTなどから1つを選択)を指定します。今回はPOSTでURLを投げる方式にします。
- APIの中身を作成します。
    - 1.Input
        - Text型で、「csvurl」というパラメタ名にします。必須にしたいので、Requiredを「yes」にします。
    - 2.Function Stack
        - 「External API Request」(API Request To)で、指定されたURLからCSVデータを取得します。
            - urlには、1.Inputで指定した「csvurl」を指定します。
            - Outputは、デフォルトのまま「api_1」とします。
        - 「Database Requests」ー「Database Transaction」で、以下の2つをトランザクションでくくって、両方成功、または両方失敗になるようにします。
        - 「Add function」で、トランザクションに入れる2つの処理を指定します。
            - 「Database Requests」ー「Clear All Records」で、membersテーブルを空にします。IDを1から振り直す場合は、reset=trueを指定します。
            - 「Database Requests」ー「Add Multiple Records in Bulk」(Add Bulk Records)で、 membersテーブルに一括登録します。
                - 「items」に、api_1.response.result」と指定します。
                - 「Return variable」は、デフォルトのまま「members_2」とします。
    - 3.Response
        - RETURNに「var:members_2」を選択します。他はデフォルトのまま「AS Self」とします。



# Bubbleの設定

## 画面
- File Uploaderを設置し、CSVファイルをBubbleのサーバにアップロードできるようにします。

## Workflow
- 必要に応じて、上記でアップロードしたCSVファイルのカラム名やカラムの並び順を変更し、JSONで保存ます。
    - [CSV chop and encode](https://bubble.io/plugin/csv-chop-and-encode-1691895493831x446794789974704100)というBubbleプラグインを作りました。
        - CSVファイルがアップロードされた際に、指定したカラムだけ取り出し、カラム名や順序や文字コードを変更し、100行ごと(変更可)に区切ってJSONファイルに出力します

- 上記で作成したXanoのAPIにそのJSONファイルのURLを渡します。
    - API Connectorで、上記のJSONファイルのURLを上記のAPIにPOSTで渡します。

# 動作確認
- Bubbleからファイルをアップロードして、Xanoのテーブルが書き換わることを確認します。


# 注意
- 上記のままでは、URLが分かれば誰でもCSVファイルをアップロードできてしまします。Bubble、XanoのAPIともに、認証機能を付けたり、APIキーを使ったり、IPアドレスを判断するなど、セキュリティ対策をとってください。
Node-REDしくじり先生 - 自作ライブラリ更新ミスでLINEノードが一瞬消えてしまった


まじで焦りました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">何かミスってLINEノード消えてしまってる... <a href="https://twitter.com/hashtag/linedc?src=hash&amp;ref_src=twsrc%5Etfw">#linedc</a> <a href="https://t.co/z1MAwAEpBb">pic.twitter.com/z1MAwAEpBb</a></p>&mdash; 菅原のびすけ （プロトアウト9期募集中) (@n0bisuke) <a href="https://twitter.com/n0bisuke/status/1734034407194013697?ref_src=twsrc%5Etfw">December 11, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

https://flows.nodered.org/node/node-red-contrib-line-messaging-api

↑のLINEの自作ライブラリです。今は復旧してますが半日くらいLINEのノードの新規インストールはできなかったと思います。

## 自作ノードを更新してみたら削除された

久々に更新しようと思い更新してみたら **missing 'node-red'**（後でよく見たら'node-red' keyword）というエラーが[flows.nodered.org/add/node](https://flows.nodered.org/add/node)のサイト側で発生しました。

> ![スクリーンショット 2023-12-11 11.37.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/6b0b7868-fe70-4713-d04c-4e6d683549d3.png "スクリーンショット 2023-12-11 11.37.06.png")


まぁでも更新できないくらいなら一旦あとで調べよーって思ってたのですが、
**なんと削除されている** という。

### ソースコードではなくpackege.jsonの説明書きの問題らしい

調べたら公式ドキュメントなどにありましたが、package.jsonに`"keywords": [ "node-red" ],`を入れることがマストになっている模様です。

> https://nodered.jp/docs/creating-nodes/packaging
> https://nodered.jp/blog/2022/01/31/introducing-scorecard

ほうほう、と思って自分の設定を見てみると確かに空になってました。

> ![スクリーンショット 2023-12-11 11.14.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/fea4254a-bc4a-b53c-c8b0-d6cb2199488e.png "スクリーンショット 2023-12-11 11.14.48.png")

とうことでここに`node-red`と追加して更新したら復帰してくれました。

### 普通にnpmは更新されてしまう問題

問題というか仕様ですが`npm publish`でnpmのレジストリ側を更新 -> Node-REDがそれを取得なのでnpm側で公開されたものに異常があるとNode-RED側で読み取ってくれないという感じみたい。。

**それにしても削除（Not Found)にされるのはちょっと、、** 前のバージョンのままにしておいてくれても良さそうだけど厳しいのかな

## まとめ: 何もプログラムを更新してなくても動かなくなる場合がある

という教訓。何もしてないけど壊れましたってやつですね。

ローカルで試す分には壊れてないんですけど、レジストリ側で受け付けてくれませんでした。
Node-REDのレジストリはそんな感じの更新をしているみたいなので注意が必要そうです。

とはいえ下位互換考えまくると負の遺産も増えていくのでこんな感じで方針示して過去のものを切っていくのも一つの方向性だと思います。

### どうするとよいのか

**久々に更新する時は機能追加など無しでも一旦publishしてみると良い**です。

コード変更してると中身の問題も疑ってしまいますからね


### 関連記事

https://qiita.com/n0bisuke/items/248e9817d5ac7037725e

https://qiita.com/n0bisuke/items/7a1ae5a95f9ce7e2e6fa
debian9 環境設定 再度新しいPCにインストールする2

Salesforceのレコードをインポートするために使っているLinux環境が入ったPCの調子が悪いですねぇ。壊れてしまったら大変なので別環境を作ります。不要になったPCを探すとあるのですが32bitしかないなぁ。今回も仕方ないのでdebian9をインストールします。

以前使ったインストールCDは手元に残っていたのでこれを使います。メモリーは6GBです。同じ型のPCが複数台あるので、4GBのメモリーを探して後で4x2 で8GBにしたいと思います。


# 過去の設定など
+ [Linux サーバー関連（すぐに忘れるため...）](https://qiita.com/Keiji_otsubo/items/88adee36a200106b658a)
+ [debian9 環境設定](https://qiita.com/Keiji_otsubo/items/a2617a6923ce6c605439)
+ [debian9 環境設定 再度新しいPCにインストールする](https://qiita.com/Keiji_otsubo/items/de15fea299e554d5fb10)

# インストールでも問題。

安いネットワークチップのせいか、ファームウェアが無いとでる。仕方ないので探してUSBに入れてみたけど認識しないですね。今回はWifiで接続できるのでそのまま続けても問題なさそうです。

# 文字化けが....

今までは特別なことをした記憶はないんですがね。updateしても文字化けです。

+ [第15課 XFCE を起動する!](https://linuxshugendo.wordpress.com/2012/03/01/%E7%AC%AC15%E8%AA%B2-xfce-%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8851c3ac-a9ba-9c72-f0eb-9253b26e5c9d.png)

背景で右クリックしてコンテキストメニューを表示し、一番下の項目をポイントするとサブメニューが開きます。その一番上の、ギアのアイコンが付いている項目をクリックすると、”コマンド名を指定して実行する” (とか何とか) のダイアログが表示されるので、”xterm” と入力して (文字化けしますが) エンターを押しました。

確かにxtermは文字化けしてない。


だんだん、面倒になってきました。

思い切って新しいバージョンにする？

[Debian 12 (bookworm) リリースノート (32 ビット PC 用)](https://www.debian.org/releases/stable/i386/release-notes/index.ja.html)
Active Recordのカラム名としてobject_idが使えるようになった 他(This week in rails 2023-12-08)

## これはなに
Railsコミッタが連載している[This week in Rails](https://world.hey.com/this.week.in.rails)の内容を、簡単な補足と併せて紹介する連載です。社内slackで毎週書いていたものですがもったいない気がしてきたので公開することにしました。

## 引用元
https://world.hey.com/this.week.in.rails/allow-object_id-as-a-column-name-for-active-record-and-a-lot-more-112f1943

## 今週のトピック

### [Active Recordのカラム名としてobject_idを使用できるようになった](https://github.com/rails/rails/pull/50162)
Active Recordの有効なカラム名としてobject_idを使用できるようになった。
(紆余曲折あったみたい)

### [Time.now/DateTime.now/Date.todayが#travel_toの後にシステムのタイムゾーンで結果を返すようになった](https://github.com/rails/rails/pull/50236)
Time.now、DateTime.now、Date.todayが、#travel_toの使用後にシステムのタイムゾーンで結果を返すように修正。

現在の#travel_toの実装にはバグがあり、引数のタイムゾーンを保持するため、すべてのスタブメソッドがそのタイムゾーンで結果を返してしまう。しかし、本来意図する動作は、これらのメソッドがシステムのタイムゾーンで結果を返すことだった。

### [Active StorageデータベースモデルでActive Recordのaffixを考慮する](https://github.com/rails/rails/pull/50167)
すべてのActive Storageデータベース関連モデルがActiveRecord::Base.table_name_prefixの設定に従うようにした。

### [分離エンジンにActive Record::Baseテーブル名のprefixを認識させる](https://github.com/rails/rails/pull/50247)
分離エンジンにActiveRecord::Base.table_name_prefixを組み込むように対処した。これにより、Active Storage 内を含むエンジン定義のモデルを Active Record のテーブル名プレフィックス構成に合わせることができるようになった。

### [field_set_tagヘルパーをfieldset_tagにエイリアスする](https://github.com/rails/rails/pull/50241)
<fieldset>HTML要素との一貫性を保つために、field_set_tagヘルパーの名前をfieldset_tagに変更した。

### [ActiveJob::Serializers::TimeWithZoneSerializer でデシリアライズするとき、シリアライズされたタイムゾーンを保持する](https://github.com/rails/rails/pull/50240)
ActiveSupport::TimeWithZone型の引数をデシリアライズするとき、シリアライズされたタイムゾーン情報を保持するようにした。

### [DATABASE_URLプロトコルをマップするためにActive Record.protocol_adapters設定を追加する](https://github.com/rails/rails/pull/50140)
DATABASE_URL を使用する場合、URL で指定されたプロトコルを特定のデータベース・アダプタに関連付ける設定オプションを導入した。この分離により、アプリケーションは展開環境で構成されたデータベース接続の詳細から独立してアダプタを選択できるようになった。

```
# ENV['DATABASE_URL'] = "mysql://localhost/example_database" 
config.active_record.protocol_adapters.mysql = "trilogy" # trilogyアダプターを使ってMySQLに接続する。
```
IPv6のみ(パブリックIPv4アドレスなし)のEC2をNagiosで監視する

パブリックIPv4アドレスのないEC2インスタンスをNagiosで監視できるように設定します。

# 監視対象ホストの設定
https://qiita.com/ran/items/7ae62f7dba2bba49e330

IPv6のみを設定したEC2インスタンスを用意し、snmpdとセキュリティグループを設定します。

## snmpdの設定
`/etc/snmp/snmpd.conf` を設定する時に、IPv4の時の設定に加えて、IPv6用の以下の設定も追加します。
```
agentaddress udp:161
agentaddress udp6:161
com2sec6 notConfigUser  default       public
```
(com2sec6の各値は、環境に合わせて変えてください。IPv4の時にcom2secに設定していたものと同じ値を設定すれば良いです。)

## セキュリティグループの設定
Nagiosサーバーからの問い合わせに応えられるように、セキュリティグループを設定します。
インバウンドルールに
* カスタムUDP 161
* すべてのICMP - IPv6

を追加し、ソースにはNagiosサーバーのIPv6アドレスを入力します。
![スクリーンショット 2023-12-11 9.48.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75498/9a02ea05-56ae-6e1e-6955-c0d82d79212d.png)

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/security-group-rules-reference.html#sg-rules-ping

インターネットゲートウェイを設定していない場合は設定してください。

# Nagiosサーバーの設定
元々IPv4で監視を行っていたNagiosサーバーでIPv6の監視も追加する場合は、IPv6通信もできるように設定する必要があります。
NagiosサーバーもAWSのEC2インスタンスの場合は、監視対象ホストと同様に、IPv6の設定(追加)をしてください。

```
ping6 監視対象ホストのIPv6アドレス
```
を実行して返事があれば設定できていると思います。

## コマンドの設定
IPv4ホストとIPv6ホストでコマンドが違う(オプションを追加しなければならない等)場合は、IPv4用の各コマンドと同様のIPv6用のコマンドを追加します。
コマンドは、自分の環境に合わせて設定してください。
以下は設定例です。

### check_ping
IPv4用
```
define command{
        command_name    check-host-alive
        command_line    $USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5
        }
```
IPv6用
```
define command{
        command_name    check-host-alive6
        command_line    $USER1$/check_ping -6 -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5
        }
```

### check_snmp_load.pl
https://github.com/SteScho/manubulon-snmp/blob/master/plugins/check_snmp_load.pl
最新版はIPv6に対応しています。(-Pオプションを指定)

IPv4用
```
define command{
        command_name check_aws_snmp_avg_load
        command_line $USER1$/check_snmp_load.pl -H $HOSTADDRESS$ -C コミュニティ名 -T netsl -w $ARG1$ -c $ARG2$
        }
```
IPv6用
```
define command{
        command_name check_aws_snmp_avg_load6
        command_line $USER1$/check_snmp_load.pl -H $HOSTADDRESS$ -C コミュニティ名 -P udp/ipv6 -T netsl -w $ARG1$ -c $ARG2$
        }
```

### check_snmp_storage.pl
https://github.com/SteScho/manubulon-snmp/blob/master/plugins/check_snmp_storage.pl
最新版はIPv6に対応しています。(-Pオプションを指定)

IPv4用
```
define command{
        command_name    check_aws_snmp_disk
        command_line    $USER1$/check_snmp_storage.pl -H $HOSTADDRESS$ -C コミュニティ名 -m / -r -w 80% -c 85%
        }
define command{
        command_name    check_aws_snmp_swap
        command_line    $USER1$/check_snmp_storage.pl -H $HOSTADDRESS$ -C コミュニティ名 -m ^Swap -w 80% -c 85%
        }
```
IPv6用
```
define command{
        command_name    check_aws_snmp_disk6
        command_line    $USER1$/check_snmp_storage.pl -H $HOSTADDRESS$ -C コミュニティ名 -P udp/ipv6 -m / -r -w 80% -c 85%
        }
define command{
        command_name    check_aws_snmp_swap6
        command_line    $USER1$/check_snmp_storage.pl -H $HOSTADDRESS$ -C コミュニティ名 -P udp/ipv6 -m ^Swap -w 80% -c 85%
        }
```

IPv4とIPv6でコマンドが違う場合は、使用しているテンプレート等もIPv6用を追加して、IPv6のみのホストはIPv6用のコマンドを使うように設定すれば、IPv4ホストとIPv6ホストの両方を監視することができます。
「サービス企画・システム開発への挑戦」

今回はAWS DIPの「サービス企画・システム開発への挑戦」のテーマについてお話します。

■自己紹介
ITデジタル部の劉(@Ryu-kato)です。店舗周りのシステムを担当しています。:relaxed:

■AWS DIPをスタートしたきっかけ
社内の事業変革を促進させる「文化」「仕組み」「プロセス」「ツール」を作り、自らサービスを生み出し、内製化を推し進めていきたいと思い、今回の取り組みをしました。
お客様に何が足りないのか、あったら良いサービスとは何かを事前にヒアリングして進むべき方向性を決めてチーム形成をしてスタートしました。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622221/0490bee1-7d0d-d268-bcde-d840abe5cbf8.png)




■サービス企画の立ち上げ
サービスを一つ新しく立ち上げるには以下の何点かを先ず、考えてスッキリさせました。
1．現状課題＆解決策（5W1H）
→現状の課題を整理して、明確にしました。それに伴った解決策の大枠をきめました。
2．サービスコンセプト
→決めたサービスが実際どういったお客様に当てはまるか、の詳細コンセプトを書き起こ
しました。
3．サービスプロセス
→実際お客様が最終購入に至るまでのフローを考えて、お客様の行動分析を行いました。
4．サービス方針
→サービスは顧客視点を第一に考えるのですが、それに関わるスタッフの視点や会社視点も含めた台座を考えました。


■サービス企画の難関
チーム形成したからと言ってすぐにスタートすることというのは出来ず、サービス企画として自分の考えや最終的たどり着きたいゴールの共有が必要でした。
サービス企画の立ち上げも全てスムーズに行えたのではなく、たくさんに壁にぶつかりながら形成しました。特に苦労したポイントとしては二つあります。
1．顧客視点を最優先に考える:pensive:
システムの実現可能性や工数コスト考えずに、お客様が本当に欲しいもの・お客様の役に立つものだけを考えたやり方に切り替えて、従来の流れと違うところに苦労した。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622221/03074b35-b51b-07f6-10bc-dbc94b5f9063.png)


２．文字だけでサービスの概要を簡潔に伝える:pensive:
実際のサービス内容を限られた文字数でかつ簡潔に伝わるようにすることや文章を見るだけでワクワクしてもらうようにPRを作成することもかなりの難関でした。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622221/a1f53b6d-3060-24d1-18a6-bf3a2340cc65.png)




■サービス企画の気づき
気づいたこととしてはチーム協力です。一人で生み出せるものは限られているが、チームで意見を出し合って話し合って、壁にぶつかり合ってより良いサービス企画構築することが可能になったと考えています。:muscle:

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622221/580abced-d0ae-c2bb-a6ea-df30c189b34e.png)






■システム開発への挑戦
今回のシステム開発手法として、スクラム開発を利用しています。
流れとしては以下の３つの流れでサイクルを回しました。
１．月曜日はスプリング開始して、各自が行うべきタスク課題の認識合わせを行います。
２．木曜日はスクラムマスターと一緒に来週以降のタスク課題の洗い出しを行います。
３．金曜日は各自行った成果物を報告して、週次のスプリングが終了します。
その中でも、開発メンバーとの認識ズレとスケジュールコントロールがとても難しく、自分から細かくヒアリングしたり、文字だけではなく図を使って意味や流れを示したりして壁を乗り越えられました。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622221/43784e59-eaf4-c4f0-d366-2c1224b2bc37.png)



動画も公開されているので、興味ある人は見て下さい:eyes::eyes:
https://aws.amazon.com/jp/blogs/news/eib-digital-innovation-230907/



■最後に
今回のプログラムで「巻き込み力」の鍛えと「顧客目線とシステム目線のバランス」の土台作りを勉強できて、挑戦したり壁にぶつかりチームで解決したりして、とても有意義なプログラムになりました。

明日は大間さんの記事を楽しみにしてください～～
Ruby オブジェクトのメモリ使用量

[Hubble Advent Calendar 2023](https://qiita.com/advent-calendar/2023/hubble) 9日目の記事です。
Hubble を運用する中で、Ruby のメモリ使用量を調べる方法とその制限について調べたので記録しておきます。

# 背景

Hubble にはバージョンという概念があり、契約書などの文書の版を管理できます。バージョンは親子関係で木構造になっていて、git log --graph のような外観を持っています。

https://help.hubble-docs.com/ja/collections/1892882-%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

このバージョン関係を走査してメンテナンスする際に、木構造の深さや高さによってどれくらいのメモリが必要なのかおおまかな把握が必要になりました。

# メモリ使用量が正確ではない？

まず、Ruby オブジェクトのメモリ使用量は ObjectSpace.memsize_of で取得できます。単位はバイトです。

```ruby
require "objspace"

ObjectSpace.memsize_of("hogehoge")
=> 40
```

ただし、ドキュメントに気になる一文がありました。

https://docs.ruby-lang.org/ja/latest/method/ObjectSpace/m/memsize_of.html
> 戻り値の内容は完全ではない事に注意してください。この内容はあくまでもヒントとして扱う必要があります。

memsize_of の出力は正確な値ではないようです。この値がどんなときにどれくらいずれるのかを調べてみました。

# Ruby 内部のデータ構造

## immediate value

Ruby の内部データ構造では immediate value という種類があり、たとえば一定範囲の整数や boolean、nil です。Ruby FAQ ではこのように解説されていました。

https://www.ruby-lang.org/en/documentation/faq/6/

> Fixnum, true, nil, and false are implemented as immediate values. With immediate values, variables hold the objects themselves, rather than references to them.

Ruby では全てのデータがオブジェクトで、C の実装レベルでは RObject という構造体がインスタンスの状態 = インスタンス変数を格納した領域へのポインタを ivptr として持っています。ただし immediate value は例外で、ポインタを格納する領域に実際の値を直接保存しているため、インスタンス状態の領域を持っていません。immediate value は複雑な構造を持たない単なる値なので、最適化のためにこういった実装になっているようです。

memsize_of ではインスタンス状態の領域の長さを集計しているので immediate value はカウントされず、その分がずれるようです。

```ruby
> ObjectSpace.memsize_of(100)
=> 0

> ObjectSpace.memsize_of(true)
=> 0
```

## Array のメモリ管理

他にも、Ruby のメモリ管理方針が原因でずれが生じる場合があるようです。

Ruby の Array は自由に要素を追加したり削除できる可変長配列ですが、配列の要素数が変わったときにメモリの割当をやり直します。より大きな連続したメモリ領域に改めてコピーし直したり、削除済みの要素を考慮して割り当てるメモリ領域を縮小します。

このメモリ領域の再割当やコンパクト化を、追加や削除のたびに毎回実行するのは負担が大きいので、その都度毎回ではなく何回かに一度まとめて実行します。下記のように、要素の数に比例してメモリ使用量が変わるのではなく、ある要素数を超えたときに一気に増えていることがわかります。

```ruby
> array = ["1", "2", "3", "4"]
> ObjectSpace.memsize_of(array)
=> 72

> array << "5"
> ObjectSpace.memsize_of(array)
=> 208

> array << "6"
> ObjectSpace.memsize_of(array)
=> 208

> array << "7"
> ObjectSpace.memsize_of(array)
=> 208

> array << "8"
> ObjectSpace.memsize_of(array)
=> 208
```

## そのほか

ガベージコレクションの状態など、ほかにも様々な条件でずれが生じるようです。

# まとめ

- 特定の種類の値 = immediate value の分がずれる
- 動的に Array の操作をするとずれる場合がある

今回の用途は概算なので、問題にならないことがわかりました。

また、ここには書いていないのですが、特定のクラスは要素数が 3 つ以下のときにメモリ使用量が最小になる、などの知識を得られました。別の機会に、業務での活用方法を含めて掘り下げてみたいと思います。

明日はフロントエンドの @beltway7 さんです！
NFCタグで日々の面倒なことをほんの少しだけ楽にする

この記事は[PONOS Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ponos)の11日目の記事です。

---

興味本位でNFCタグを買ってみたので、活用方法を模索中です。
使えそうなことがあったので紹介します。
なおこれから紹介するのは全てAndroidでの話です。

## 活用1: 指定したアプリを起動する
PONOSの業務ではGoogle Authenticatorを使用しての2段階認証が必要なサービスがあります。
画面をスワイプしてアプリのアイコンをタップするのが面倒なので、NFCタグをかざすだけでアプリを起動できるようにしました。

### 必要なもの
- NFCタグ
- NFCタグを書き込むためのAndroid端末
- [NFC Tools](https://play.google.com/store/apps/details?id=com.wakdev.wdnfc&hl=ja&gl=US)というアプリ

### 手順
NFC Toolsを起動してWRITEタブを選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98727/92fe4614-7792-f57c-94e1-ccc00c9537eb.png" width=50%>

その中のAdd a recordを選択すると何を追加するのか選べるので、Applicationを選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98727/21bad726-7be6-206c-732a-d5cff2e137e9.png" width=50%>

アイコンをタップするとアプリ一覧が表示されるので、Google Authenticatorを選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98727/5e02a512-199d-2e49-0cc6-0f0a9e062673.png" width=50%>

書き込みができるようになったので、Writeを選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98727/dc41033e-e30f-983c-dfbd-db4b683b0fc3.png" width=50%>

NFCタグをかざすと書き込みが始まります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98727/440a108e-2d0f-ef2d-5112-7ed9ab9cde84.png" width=50%>
これでNFCタグをかざすだけでGoogle Authenticatorが起動します。

できればこのまま認証コードを入力して欲しい…

## 活用2: 指定した画像を表示する
PONOSには食堂があり、そこで食事をするときには認証のためのQRコードを表示して読み取らせる必要があります。
毎回画像の一覧から探すのが面倒なので、NFCタグをかざすだけで画像を表示できるようにしました。

### 必要なもの
- NFCタグ
- NFCタグを書き込むためのAndroid端末
- [NFC Tools](https://play.google.com/store/apps/details?id=com.wakdev.wdnfc&hl=ja&gl=US)というアプリ
- [NFC Tasks](https://play.google.com/store/apps/details?id=com.wakdev.nfctasks&hl=ja&gl=US)というアプリ

### 手順
NFC Toolsを起動してTASKSタブを選択します。
Add a taskを選択して
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98727/90480808-742c-7f3c-c7f8-fc95df3d52ea.png" width=50%>
File operationsを選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98727/7393b3c7-5a20-f183-e0f6-4c94e4cdc729.png" width=50%>
開くファイルを選択する必要があるので画像を選択します。私は「PONOS/食堂.png」という名前で保存しているのでそれを選択しました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98727/5e43e3aa-e872-4b2f-fe82-662f5914046c.png" width=50%>
書き込みができるようになったので、Writeを選択します。
NFCタグをかざすと書き込みが始まります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98727/617231e6-794e-ea67-a47d-126508112988.png" width=50%>
これでNFCタグをかざすと食堂で使用するQRコードが表示されます。画像を開くアプリを選択する必要があるかもしれませんがそれはお好きなものを選択してください。


## あとがき
とりあえず活用方法を2つ紹介しました。
他にも活用方法があれば記事にしたいと思います。
NFCタグは余っているのでPONOSの方で興味がある人は声をかけてください。

---

明日は@iixd_pogさんです。