OmniAICreator/Qiita-1.07M huggingface dataset:
境界値分析のOnポイントとOffポイント

[ソフトウェアテストの小ネタのカレンダー | Advent Calendar 2023 - Qiita](https://qiita.com/advent-calendar/2023/software-testing-koneta)の２日目の記事です。

こんにちは、
テスト技法の一つである境界値分析を勉強していると、OnポイントとOffポイントという言葉が出てきます。難しくてよくわからないと感じたことが皆さん少なからずあるのではないでしょうか。私もそうでした。
特に新しいトピックではないですが、今日は、私なりにOnポイントとOffポイントという言葉を解釈して境界値分析について解説しようと思います。

# Onポイント
Onポイントは、どこでもいいのですが、仕様書に書いている値や着目しようとしている境界値のことです。
例1:「15以上」と仕様に書いてあった場合は、15がOnポイントです。
例2:「16未満」と仕様に書いてあった場合は、16がOnポイントです。

# Offポイント
Offポイントは、Onポイントに隣接する別の同値パーティションの境界値です。
Offポイントは、Onポイントに従って決まります。同値パーティションは領域と言い換えても問題ないと思います。
先程の「15以上」の例ですと、Offポイントは、14になります。（整数しか存在しないと仮定しています）。
図にするとこのような形になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42567/d5fa8975-e651-42fb-3211-bd1891d520b5.png)

# Inポイント
OffポイントとOnポイントが決まると、Inポイントという言葉が出てきます。
Inポイントは、OnポイントまたはOffポイントではない、同値パーティションの中の値です。
つまり、13や16などの数字です（他の数字でもいいです）。


# ここまでのまとめ
ここまでの話をまとめると次のようになります。
- Onポイント：　仕様書に書いてある境界値（着目しようとしている境界値）
- Offポイント：　Onポイントに隣接する別の同値パーティションの境界値
- Inポイント：　OnポイントまたはOffポイントではない、同値パーティション中の値

# よくある勘違い

ここで、次の勘違いをよくしてしまいがちだと思っています。

- Onポイントならば有効同値パーティションに属する。
Onポイントと有効同値パーティションか無効同値パーティションかは、関連しない概念です。Onポイントであっても無効同値パーティションになりますし、有効同値パーティションにもなりえます。
- Offポイントならば無効同値パーティションに属する。
こちらもOnポイントと同様です。Offポイントと有効同値パーティションか無効同値パーティションかは関連しない概念です。Offポイントであっても有効同値パーティションになりえるし、無効同値パーティションにもなりえます。


# 境界値分析でのテストケースの作り方

テストケースの作り方は他にも色々あると思いますが、よくいわれている２種類のやり方について紹介します。

# Beizerの方法

境界値のOnポイントとOffポイントをテストケースとする方法です。
OnポイントごとにOffポイントは何か選ばなければいけないので、テストケースの選択ミスが起きやすいです。

「>=」を「>」や「<=」や「<」に書き間違えたり、
「<=」を「<」や「>=」や「>」に書き間違えたケースを見つけることができます。

==　などを見つけたい場合は、Inポイントをテストケースに含める必要があります。
[GIHOZ](https://gihoz.com/)だと、こちらの方法に基づいて、テストケースを生成していますね。

# Jorgensenの方法

Onポイントの前後を加えた３つのポイントをテストケースとする方法です。
Offポイントは何か選ばなくても、Onポイントの前後を選べばよいので、テストケースの選択ミスが起きにくいです。

Beizerの方法で見つけることができる問題に加えて、「==」にしていた間違いを見つけることができるようになります。

テストケース数がBeizerの方法に比べて多くなります。一つのOnポイントごとにテストケースは、３つ必要になります。

# どちらを使うべきか？


[こちらの記事](https://ameblo.jp/sendai-test/entry-11417704966.html)によると、
>どちらを使うか？ ですが、私は、開発者本人が行うコンポーネントテストでは3値が良いと思っています（コーディングとテストで同じ間違えを犯すことを救うため）。
第三者がテストする際には仕様をきちんと読み直し2値で実施するのが良いと思っています。

ということだそうです。



つまり、開発者本人が行うテストでは３値（Jorgensenの方法）でやるほうが良く、なぜならば、コーディングする際とテストする際にどちらともに、同じ間違いをしてしまいバグが見つからない可能性があるからだそうです。
QAなどの第三者がテストする際は、仕様をきちんと読み直し、２値（Bezierの方法）で実施するのが良いそうです。

# 最後に

この記事が理解の助けになれば幸いです。何か間違いがあればご指摘ください。
Power BIのアクションバーとExplore（探索）の追加

## はじめに
　Power Appsのモデル駆動型アプリを実行すると、キャンバスアプリとは違って上部のメニューのバーが表示されます。
 ビュー（一覧）表示ではこちら。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/89a539e2-72c1-141f-b3d0-445eafcc5f03.png)
　フォーム（明細）表示ではこちら。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/55072773-f041-0457-fa70-695eafcfa0b6.png)
　先日、[気ままに勉強会](https://kimamani.connpass.com/event/300750/)で、「変なボタンがいろいろありますが（気にせず）...」とおっしゃっていてちょっと受けました。「慣れないうちは意味のわからないボタンは過度に気にしないで」ということかと考えますが、スルーしてメイン機能を使うことにフォーカスすることは大事ですね。

このバーは**コマンドバー**というようです。

 https://learn.microsoft.com/ja-jp/power-apps/user/chart_on_form?WT.mc_id=DP-MVP-5004418

 　尚、コマンドバーの中にはPower BIのアイコンがあり「このビューを視覚化する」ことができます。

 https://learn.microsoft.com/ja-jp/power-apps/user/visualize-in-power-bi?WT.mc_id=DP-MVP-5004418
 

さて、本QiitaではPower BIでも、Power BIサービスに発行後のレポートの上部にあるバーを取り上げます。また、バーの内容はアップデートされることがあり、2023年11月に追加された新機能について触れます。

## アクションバー

  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/99301ef8-7f95-265a-2b4b-d4e1262f718e.png)

  このバーの呼び名は**アクションバー**のようです。

  https://learn.microsoft.com/ja-jp/javascript/api/overview/powerbi/embed-for-organization?WT.mc_id=DP-MVP-5004418

  発行前のPower BI Desktopにはなかったものが、発行後には出てきます。こちらもPower Appsのモデル駆動型のコマンドバーと同様に慣れないうちはスルーで大丈夫かと思います。
　ただ慣れてきたら、このメニューでは何ができるのか見ていくとよいと思います。

- pbixファイルのダウンロード
- エクスポート
- 共有
- 編集
- 購読
- ブックマーク
などなど、必要に応じて使える機能が沢山あります。ワークスペースによってはユーザーに割り当てられた権限（ロール）によって一部メニューが表示されないということもあります。

## Explore（探索）

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/f99afdb9-f124-ead1-9f3f-6e4f5ca64783.png)

[2023年11月の Feature Summary（機能更新）](https://powerbi.microsoft.com/ja-jp/blog/power-bi-november-2023-feature-summary/#post-25061-_Toc150157954)で、Exploreという新機能がパブリックプレビューされました。この機能は、セマンティックモデルのメニューからだけでなく、アクションバーからも使えます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/84c8c4bd-ef3f-3d9d-2c83-13c170fb48ae.png)

Exploreはデータをオンデマンドでざっと確認する機能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/4ff6a8fc-8db2-f31e-e36b-b8bd931742f4.png)

上部がマトリックスで下が視覚化されたビジュアルです。使い方は直感的にすぐにわかりますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/6ff6bed9-4ec8-e3b9-d5b0-c0fa5eef28d3.png)

作成したExploreは保存することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/0a8ca2c9-1f6c-b3b9-2603-5927ebe615c1.png)

保存されたExploreはこちら。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/d44bd795-35c0-58f5-1c70-994f4241e43e.png)

詳しくは下記のブログもご参照ください。

https://powerbi.microsoft.com/ja-jp/blog/introducing-explore-public-preview/

## おわりに

Power BIのいろんなメニューは触って確認することが大事です。元データまで壊れることはありませんので、怖がらずに遠慮なく～。
吉祥寺.pm35 にオフライン参加したので、そのメモ

[吉祥寺.pm35【吉祥寺に集合！オフライン開催！】 - connpass](https://kichijojipm.connpass.com/event/298081/)

ということでオフライン参加してきたのでそのメモです。

```
19:30-19:35(5分) オープニングトーク (Magnolia.K)
19:35-19:55(20分) TBD (ariaki)
19:55-20:15(20分) 「自分が本当にやりたかったこと」 (kabukawa)
20:15-20:35(20分) TBD (yu_mi0825)
20:35-20:55(20分) 「とりあえず、嫌がらずに Powershell を使ってみよう。」（Anubis_369z）
20:55-21:00(5分)  休憩
21:00-21:05(5分)  TBD (yamato_sorariku)
21:05-21:10(5分)  「ベストプラクティスと組織とIaC(仮)」 (masasuzu)
21:10-21:15(5分)  「お前もコンテナにしてやろうか」 (わいとん)
21:15-21:20(5分)  TBD (papix)
21:20-21:25(5分)  「初めて登壇した話」 (saka)
21:25-21:30(5分)  TBD (MadoWindaheadz)
```

https://x.com/e99h2121/status/1730531365358272888?s=20


## メモ

https://x.com/hmatsu47/status/1730533799300407588?s=20

- 今年を振り返って、やったこと、やれなかったこと、やるはずだったこと
- 10 周年…大吉祥寺.pm 開催の機運
- 自分をこっそり振り返ると…
	- やったこと
		- 健康維持
	- やれなかったこと
		- ある
    		- でもそれはやらなかったことかもしれない

https://x.com/e99h2121/status/1730538362417840428?s=20

- ariaki さん
	- https://x.com/ariaki4dev/status/1730448401102405693?s=20
	- ネガティブ発言をしたときにネガティブノートをつける
	- https://x.com/e99h2121/status/1730538362417840428?s=20
- kabukawa さん
	- 転職した話 続編
	- 「顧客が本当に必要だったもの」
	- 入ってみたらエンジニア辞めちゃってた
		- やったことをひたすらドキュメントに残す
		- 突然の Notion  https://x.com/e99h2121/status/1730542085198221416?s=20
		- Notion のカレンダー ビューでアドベントカレンダー
	- 個人メンションをやめる
	- Fun Done Learn
- yu_mi0825 さん
	- 爆速変化、爆速俯瞰力
	- System of Systems
	- 途中から何言ってんのかわからなかった (褒め言葉
- Anubis_369z さん
	- 劇団 Powershell 
	- PowerShell をつかえるとどんな現場でも使える
	- PowerShell のコマンドレットはVerb-Noun Get-ほげほげ
		- この場合変更がないことが保証される
	- AWS の管理もできるんだなあ
		- https://docs.aws.amazon.com/ja_jp/powershell/latest/userguide/pstools-getting-set-up.html
	- https://qiita.com/tatsuki1112/items/110c7ad2a4c4a2a6d3ae
- yamato_sorariku さん
	- 転職と移住
- masasuzu さん
    - 日本は庭
    - 組織の数だけプラクティスはある
- わいとん さん
- papix さん
- saka さん
- MadoWindaheadz さん
- メモと充電追いつかなくてすみません。。。


https://x.com/e99h2121/status/1730561544432545891?s=20

https://x.com/e99h2121/status/1730554374802624902?s=20

https://x.com/e99h2121/status/1730552016462905656?s=20

句会は楽しい。



## 参考

[吉祥寺.pm28 をながら視聴したので、その感想 #イベント - Qiita](https://qiita.com/e99h2121/items/d794f5a006ea5853f912)
[吉祥寺.pm31 の感想 #イベント - Qiita](https://qiita.com/e99h2121/items/85ab3f94afb9275b6ef0)
[吉祥寺.pm - connpass](https://kichijojipm.connpass.com/)

https://madowindahead.info/2023/12/kichijojipm35/


## つづく
コミュニティ参加楽しいですよね。昨晩の小話でした。つづく。
保守運用から"ノーベル平和賞"を目指すワケ

# 何を言っているのか？
と思われた方、、、すいません。これから説明するので是非最後まで読んでいただけますと幸いです。
2017年頃から言い続けていて、出版した書籍の「おわりに」に書くほどマジなのです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473422/38838064-2927-0843-e46e-444def806886.png)


# 結局どういうこと？
私の志はシステム障害対応に限らず
**「緊急時に助け合う文化へ変える」**
です。

この後、記載があるのですが、システム障害対応、救急医療等の緊急時に「もっと助け合えれば良い世界になる」と思っていて、**そのためには「ノーベル平和賞を取る」ぐらいのインパクトが必要**だと思ったためです。

少し長くなりますが、是非最後まで御覧ください。


# 大学・大学院時代
私は大学・大学院時代、地震防災の研究室に所属していました。宮城県沖で地震が発生したり、スマトラ沖の地震が起きたり、、、そんな時期でした。

**そして、私が卒業する直前2011年3月11日に東日本大震災が起きました。**

テレビで見る津波の光景は映画のようで、津波で流されてあたり一面本当に何もない世界を見て、衝撃を受けたのを覚えています。

**その中で、私が感動したのはボランティアによる助け合いでした。**

何もない地域に、全国からボランティアで人が集まる。私には理解できず、その光景に感動したことを覚えています。

# 社会人時代（入社～5年目）
私は某SIreに入社して、金融システムの開発・保守・運用を担当しました。
最初は寮に入っていましたが会社まで１時間30分ぐらいかかっていたので、1年目の12月ごろに会社の事務所の隣のアパート？マンション？に引っ越しました。
家が近いこともあり、私自身が望んだことではあり、システムで障害が発生すると駆けつけて対処をしていて、どんどんスキルが上がっていきました。

あるときニュースやtwitterで騒がれるほどの大障害が発生しました。
現場は大混乱で私も障害対応に当たったのですが、その時にお客様からかなり怒られた記憶があります。
確かに私たちがシステム障害が起こしたのが悪いのですが、

**「エンドユーザーを向いて一緒に助け合いながら復旧をしたい」**
と思いました。
ただ、私自身もまだまだ未熟で、世の中で大きなシステム障害が起きると「うちの会社か・・・？」とか「うちの会社が原因じゃなくてよかった・・・」と思ってしまっています。
エンドユーザーからしたらそんなの全く関係ないのに、

**「私自身も世の中のシステム障害に対して助けられていないな」**
**「自然災害の時はあんなに助け合えたのに、なぜ助け合えないんだろう」**

と思いました。

# 社会人時代（6年目～11年目）
そんな思いを胸に事業部内の保守運用の改善を進めるチームに異動をしました。
はじめは「助け合う」なんて崇高なことはできず、システムアラートをうまく管理できるようにしたり、お客様への連絡をスムーズにしたり、業務効率化をしたり、、、
保守運用に関することは一通りやって来たのかなと思っています。

その中でも特に、システム障害対応の改善のためのツールが社内の他事業部からの好評で、サービス化をして社内展開を始め、無事社内では広がってきて、2022年度中には社外販売をするために準備を進めています。
まだ道半ばですが、このサービス広がっていけば、「助け合う」ことができるようになる仕掛けをしていこうと思っています。

このサービスのビジョンが
**「エンドユーザーがシステムインシデントで困らない世界へ変える」**
です。
その手段として「緊急時に助け合う文化」が必要だと思っています。

これは最初はシステム障害を対象にしていますが、救急医療とか、火事の消防とか、緊急時の飛行機コックピットとかに広げていきたいなと思っています。

# ノーベル平和賞？

そんなこんなで、じゃぁなんでノーベル平和賞なの？という話です。

技術が進むと人を殺めるという歴史が繰り返されており、
**今後システムは人を殺める時代が来る**と思っています。

先日トヨタ関連の工場がサイバー攻撃にあい、工場が止まりました。
もちろん工場が止まるのは大変でしたが、今後時代が進めば工場が止まるぐらいで済まなくなるだろうと思っています。
たとえば、近い将来自動運転が完全に達成すると言われており、そのシステムが攻撃されシステム障害が起きると、過去に類を見ない交通事故が起きて、多くの方が亡くなるのではないかと思っています。

サイバー攻撃とかシステム障害には１企業が世界と戦うのは厳しい時代がすぐそこまで来ています。

**みんなで助け合ってシステム障害に立ち向かう**
そんなことを目指してこのブログも書いています。

ただ、「緊急時に助け合う文化」を作るのはかなり難しいように思っています。自然災害のように「誰に責任があるかわからないもの」は助け合えるのですが、「誰かに責任がある」と明確になると急にみんな助け合えなくなって、それって文化で簡単には変わらないんだろうなぁって思っています。

そのために、私が2046年に「システム兵器防止キャンペーン」でノーベル平和賞を取り「緊急時は助け合う文化」を作ろう！とスピーチをして、世界を平和へ１歩近づけたいと考えています。

ここまで長文を読んでいただきありがとうございました！
Career Reflection for Gophers 参加記

# はじめに
どうもKizukuです
この記事では,12/1に京都で開催された「[【学生向け】Career Reflection for Gophers【京都開催】](https://moneyforward.connpass.com/event/302342/)」について参加者目線でまとめたいと思います！
ちなみに私は運営のお手伝いの学生ボランティアとしても関わらせていただきました！貴重な体験をありがとうございます！
(記事書く用の写真を撮り忘れてたので，写真はないです...もしどこかで入手できたら追加します)

# タイムライン
## 18:30 開場
マネーフォワードさんの京都開発拠点がイベント会場でした．
メインでイベントが行われたのは落ち着いた和室のお部屋．
和室があるオフィスいいなぁと思いました．こういうオフィスだと出社したくなりますね
またその夜はGo Conference miniの前日ということもあり，名だたるGoエンジニアの方が会場にいて少し緊張してしまいました．いつか私もあっち側に立ちたいと思いつつイベントが始まるまで近くの学生同士で雑談をしていました．

## 19:00 Opening
いよいよイベントが開始しました．
まずは協力してくださっている企業さんの紹介です．
全6社ありましたが，どの企業も1度は聞いたことのあるような有名な企業ばかり！！
豪華すぎます！
CyberAgentさん，freeeさん，Hatenaさん，_KNOWLEDGE WORKさん，merpayさん，Money Forwordさんありがとうございました！

## 19:20 ディスカッション
今回のイベントのメインコンテンツとなる学生同士でのディスカッションが始まりました．
2つの運営から与えられたテーマについて3,4人のチームに分かれて30分ずつひたすら議論を行いました．
回答に関しては，「自分に必要なスキルを身につける」のような抽象度の高いものではなく「k8sの勉強をする」のような今日からでも始められるような具体的なものが求められました．
また今回はチームで1つの回答を出すというのも，1つの課題として与えられていたため，チームの意見をまとめる必要もありました．んーこれがまた難しい．

### テーマ１「理想のエンジニアになるために今1番必要なことは？」
チームに分かれ簡単な自己紹介を済ませた後は，テーマ1について議論していきます(私のチームは私以外の学生の方が文系の方で驚きました)
まずは，各々の思う「理想のエンジニア」について意見を交わしました．フルスタックエンジニア，ブリッジエンジニア，スペシャリストetc．それぞれが思い描くエンジニア像は異なるものでしたが共通して今の自分にできることは，技術力の向上ということになりました．具体的な手段としては技術系のイベントや勉強会に参加して，登壇を行ったり，エンジニア同士での交流を行ったり，イベントの内容をブログにまとめたりといった**Output**に力を入れようということになりました．そうすることで技術力だけでなく情報発信力やコミュニケーション能力などのソフトスキルも高めることができていいよね．という感じにまとまりました．
他の班の発表では「とりあえず積読を1つ消費する」と言ったような超具体的な意見もあって面白いなと思いました．

### テーマ2「新卒で入る企業に求める3つのこと」
まずは各々が思う企業に求める3つのことを書き出してみました．
因みに僕は
- 社内外のイベント参加が盛んか
- 新卒研修で幅広い分野に触れることができるか
- 勤務形態に多様性があるか

の3つを挙げました．他の人だとコミュニケーションの近さであったり，自社開発が行える等が上がりました．
ただ，全員共通して入社後も成長し続けることのできる環境について言及しており**新卒研修が充実しているかどうか**は，全員が挙げていました．また，誰も給料に関しての言及がなかったのも印象的でした．
また，新卒で入る企業は同期が多い方がいいかという議論も行われ，メンターのエンジニアの方も前の職場の人とも未だに飲みに行ったりするとのことだったので，エンジニアという職業は改めて人との繋がりが大事になるなぁと感じました．
他の班の発表では「事業について(ゲーム事業は嫌だ)」や「給料が高いところ」などがあり，テーマ1よりも各チームの個性が出ているように感じました．

## 20:20 Closing
1時間にもわたるディスカッションの時間が終わりイベントもクロージングに移りました．
今回の議論に関してはどれも正解が存在するような問いかけではなかったので，他の人の意見を聞くことのできる貴重な経験となりました．
また，懇親会のピザが届くまでの時間で急遽始まったメンターさんへの質問会．それぞれのエンジニアの方の今の会社に入ろうと思ったきっかけや転職を考えるポイントなどについてのリアルなお話が聞けました．

## 20:25 懇親会
技術系のイベントの最大の楽しみといえばやっぱこれですよね笑
みんなでピザを食べお酒を飲みながらワイワイ話しました．
憧れだった[sivchari](https://twitter.com/sivchari)さんともたくさんお話しすることができて大満足でイベントを終えました．

# 最後に
このイベントを企画してくださった[tenntenn](https://twitter.com/tenntenn)さん，[luccafort](https://twitter.com/luccafort)さん並びに協力していただいた各企業のエンジニアの方々ありがとうございました．自分のキャリアについて考え直すいいきっかけともなり，関西圏の学生の方や，Goのﾂﾖﾂﾖエンジニアの方ともお話しすることもできとても満足しています！参加してよかったです！
【忘備録・深層学習】 GPUの計算速度・クラウドリソースに関してまとめてみた

深層学習のGPU計算リソースに関してまとめます．

Kaggleに挑戦したい時期になると，クラウドリソースが選択肢に上がってくるのですが，どこが良さそうか，またベンチマークの理解に毎回時間がかかってしまっているので，必要な情報を簡単にまとめました．

ざっくり書いた程度ですが，時間があれば清書できればとは思います（）

# 計算速度に関して
## GPUベンチマーク
一覧: https://www.hpc.co.jp/product/wp-content/uploads/sites/3/2022/07/GPU-list_A3.pdf

## 手法
FP16の半精度に落とすだけでなく，Tensor Float-32やAutomatic Mixed Precisionなどの手法が存在する．

TF32・AMPについて: https://www.slideshare.net/SaSakiKuninobu/a100-gpu-p4d
GPTとの会話: https://chat.openai.com/share/13c9d30d-7c38-4e52-86c7-a89d3c035e0c
Pytorch-TensorFloat: https://pytorch.org/docs/stable/notes/cuda.html#tensorfloat-32-tf32-on-ampere-devices
Pytorch-AMP: https://pytorch.org/docs/stable/amp.html

## 計測
計測記事: https://qiita.com/MotonobuHommi/items/f12a500d6c475ce59790

## アーキテクチャ
Ampereについて: https://www.nvidia.com/ja-jp/data-center/ampere-architecture/

# クラウドリソース
## A4000
詳細が記述されているわけではないが，Ampereアーキテクチャの利点を活かしたTP32への展開や疎性計算によってかなりの高速化ができるGPUであるという認識．

**webarena**
URL: https://web.arena.ne.jp/indigogpu/
時間単価47円とコスパが良い．

## A100
よく知られたバケモノ．H100が最近は出てきているようだが．．．
### 3大クラウド
**AWS・Azure**
最低8台から（？）．
大規模な計算を前提とする．
GPUの並列利用を行うときに候補に上がってくる？

**GCP**
1台からの利用が可能であるが，おそらくwebarenaより高価

### その他
**Colab**
時間単価約140円．使い勝手は悪いがコスパはかなり良い．

**webarena**
時間単価341円．Colabの使い勝手が悪い場面でこちらが選択肢に上がってくる．
ウェブサービス設計の甘さからユーザーが自ら個人情報漏えいした事例紹介（電子カルテとAirbnb）

## 2023年1件目は電子カルテ・予約情報の漏洩

ウェブサービスの個人情報漏えいは不正アクセスが原因と思う方が多いですが、**自分で漏洩するパターン**も報告されないだけでかなりあると思います。

2023年の個人情報漏えい1件目は企業なら一度は使ったことがある、または利用を検討したことのある企業が医療機関向けに提供している電子カルテサービスで、名古屋在住の同姓同名（検索したら漢字は異なる）の生年月日や顔写真（ネット上で本人特定できました）など偽IDを作るには十分の情報が漏れた件です。

大手クリニックでAGA治療をされていた方なので、完治されるのを願っております。

https://qiita.com/skillsharejp/items/26887acac0c6c88bf1a1

これは**個人がメールアドレス入力を間違えた結果、似ているアドレスに予約確認URLが送信されてしまい、そこを第三者がパスワード不要で閲覧できる状態**がもたらした漏洩でした。

当時開発元には注意喚起し、Twitterでも経営陣2名のアカウントがありましたのでDMもしました。その後Twitterでは2名ともお礼もありませんでしたが・・・。

パスワードレスで電子カルテの予約情報見れるなんてセキュリティ専門家じゃなくても危ないと思います。対策をアドバイスしましたがその後どう対策されたかについて同社から詳細な報告はありませんでした。

**二段階認証のない医療機関ウェブサービスは利用しないことをおすすめします**。

## 2023年2件目は民泊で誰もが知るAirbnbの漏洩

さて2023年2件目はAirbnbのユーザー（以後、A）がメールアドレス変更において、私が所有するメールアドレスを誤入力により指定してしまい、このAが予約した日程の確認メール、そしてホストから予約に関して送信されたメール、Airbnbサポートからのメールが8月から1ヶ月ほど届き続けました。

![airbnbleak.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431047/d5809595-09da-97a0-7a3c-99873dc79c15.png)

AirbnbのサポートからAに対してメールアドレス変更してもらうように伝えましたが、12月になった今でも私のメールアドレスが紐づけられているので仮に私が新規登録したくでもこのメールアドレスは使用できません。

Airbnbも**強制的に会員が登録したメールアドレスを無効化し、再登録を促す仕組みを作れば良いと思う**のですがあまりそこに対しては熱心ではなさそうです。

こちらのAさん、Airbnbログイン画面で本人画像を確認できるのでユーザー名を調べたところFacebookが見つかりました。ニューヨーク在住の中華系です。

息子はボストン大学を出てアクセンチュアのテクノロジー戦略コンサルタントとして勤務しています。Aさん自身は写真を1枚しか公開していませんが息子がネットリテラシー低いのか全体公開なので、Aさんを含む家族で食事している写真などを確認できました。

（テクノロジー戦略担当なのにプライベート丸見えやん・・・）

試しにLinkedInで調べてみましたがAのアカウントはありませんでしたが、息子は3rdコネクションで割りと近い存在でした。世界各国の洞窟などを家族で探検旅行したり、日本への渡航歴もあると記載されています。

中華系で世界を旅行し、ニューヨーク在住で家族旅行も何回も・・・となるとそれなりの家庭です。父親の情報が少ないですが、それなりに裕福でないとこの生活は難しいでしょうね。

家族構成はA、妻、息子二人、娘一人です。

誕生日ケーキを囲んだ写真などもありますので、息子の誕生日特定も投稿日前後から予測できます。

このように情報が流出すると、関連情報から家族構成や家族写真まで特定が容易です。**個人情報を預かるウェブサービスは一時的に一人の会員情報が流出しただけだろう**・・・と考えてますが、そこからいくらでも漏れるのです。

まあ最初にAがメールアドレスを間違えたのがそもそもの問題ですが、ユーザー側が間違えても情報漏洩を防ぐ仕組みというのはウェブサービス運営元の責任なので**漏れない仕組み、漏れてもさらに漏れない仕組み**を意識してほしいです。
React100本ノックをFlutterでやってみた #01 Hello World

# はじめに
@Sicut_study(Watanabe Jin)さんが公開しているReact100本ノックを見かけたので、Flutterでも可能な範囲で、同じものを作っていきたいと思います。

https://qiita.com/Sicut_study/items/3c5cd798313854a471a0

元記事の方では
> React, TypeScriptを使う

というルールがありますが、こちらを無視する形となりますが、ご容赦ください🙇‍♂️

# 実装
## 完成品
![Simulator Screenshot - iPhone 15 Pro Max - 2023-12-02 at 04.12.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2230776/33420a66-1167-71cb-ed22-ed3b4758731b.png)

## 実装
以下のように実装を行いました。
```dart:hello_world.dart
import 'package:flutter/material.dart';

class HelloWorld extends StatelessWidget {
  const HelloWorld({super.key});

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text(
        'Hello World',
        style: TextStyle(
          fontSize: 48,
          color: Colors.pink[200],
          fontWeight: FontWeight.bold,
        ),
      ),
    );
  }
}
```
Textウィジェットで文字の表示と装飾を行い、Centerウィジェットで中心に配置しています。


# さいごに
flutterで実装できる範囲（でかつ、自分の能力でできる範囲）で、react100本ノックに追従していこうと思うのでよろしくお願いします！

コードや記事の内容について、何かご指摘やアドバイス等ありましたら、コメントや編集リクエスト等で教えて下さい！
【AWS re:Invent 2023】一人黙々と進めるワークショップと思ったらAWS JAM（チーム戦）だった話

# はじめに
現地時間の2023年11月30日は re:Invent 2023 の4日目です。
ワークショップ系を中心に複数の会場を練り歩いたこともあり、かな～り疲れがたまってしまいました。
帰りの飛行機での過ごし方を考えると、楽しみにしていた re:Play は念のために不参加としました:frowning2:

「大丈夫、また来年も来れる」と自分に言い聞かせて大事を取りました。

本来 re:Play に参加している時間を使って、参加したワークショップが実はAWS JAMだった話を書きたいと思います。

# ワークショップの概要
参加したワークショップの概要は AWS Events のアプリ上では以下の通りでした。
ちなみにこれは 11月28日火曜日（現地時間）のワークショップでした。

セッション ID: ENT301 
タイトル：Application modernization challenge
所要時間：2時間
レベル：Level 3
セッションタイブ：Workshop

>【セッション概要】
>Showcase your modernization skills in this workshop. Decompose monolithic applications and deploy them as microservices using AWS Lambda. Move your data tier from relational self-hosted to fully managed cloud-native. Containerize existing workloads and deploy them using Amazon ECS and Amazon EKS. Add observability and automate it all with CI/CD pipelines using AWS CodePipeline, AWS CodeBuild, and AWS CodeDeploy. In this team-based event (you can join a team in the workshop), score points for successfully completing modernization challenges using the AWS Management Console in accounts provided for you. You must bring your laptop to participate
>
セッション概要をざっくり要約すると、Lambdaをはじめとしたサーバレスアーキテクチャの構築体験が可能、といったところでしょうか:rolling_eyes: 
ECSとEKSも触れると読み解けたので、私としてもそれらのサービスの理解を深めたいと想いがあり、そのワークショップに参加を決めました。

# ちゃんと読むとチームベースのイベントって書いてある
セッション予約する時にはまったく気が付かなかったのですが、

` In this team-based event (you can join a team in the workshop)`
`日本語訳：チームベースのイベントです（ワークショップではチームに参加します）`

と記載があり次回からセッション概要はしっかり読み込もうと心に誓いました:angel::angel::angel::angel:

# どんな内容だったのか
1チーム4名で自分以外日本人ではない、かつ予期せぬチーム戦ということもあり、JAMの全体のチャレンジを控えておくのを失念するという痛恨のミスをしています:angel::angel::angel::angel:
私たちノチームでは自分がやるタスクを表明し、そこから各自もくもくを進めるやり方を取りました。
私が担当したチャレンジは以下の通りです。

- チャレンジ名：MOVE THIS DB TO MANAGE

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822205/86d5a6a7-04b2-af0d-1243-7e8f6568d6f2.png)

# 結果は惨敗
「あー全然わかんねぇや」
「そっちはどう？」
「あ、わかったかも。。。あ、全然違うわ」

みたいな会話をしながら、もくもくと進めた結果は全員がチャレンジの中にあるすべてのタスクをクリアできない、という惨敗でした:angel::angel::angel::angel:

私はタスクが4つあるうち、1つだけクリアした状態で終了の時間を迎えてしまいました。
以下が私のタスク遂行状況です。

:::note info
画像が一部見切れている、言語設定が異なっている部分についてはご了承ください。
かなり焦ってました。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822205/36cfd9d9-ed86-2577-76ac-0b0ed376d1be.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822205/6e9db8be-31f5-1a6b-e33f-8436165916c9.png)

最初にタスクを読んだ時は、

「これはいける。勝った。」

と思ってました。
それはチャレンジの内容が Amazon RDS で日頃触れる機会のあるサービスというのが理由でした。
ただ、今回は触れたことのない Amazon RDS for **SQLServer** だったのが惨敗の大きな要因でした。

今は出来なさっぷりに自信を失っています:innocent::innocent::innocent::innocent:

# 惨敗だけど楽しめた
概要に記載があったECS/EKSの部分には触れられなかったですが、チームメンバーと会話をしながら進めるという体験ができてよかったと思っています:grinning:

終了したあとに少しチームの人と、

「楽しかったねー」

と感想を言い合って解散となりました。

その後、大いなる自信を失った私はトボトボと認定者ラウンジへ向かいました:runner_tone4:

https://qiita.com/masaki_seyama_POHD_CCoE/items/06c28775e84cc1430761

# 最後に
re:Invent ではワークショップを中心に参加をしてきました。
そこで英語を「読み書き」だけではなく「聞いて話せる」ことも大事だ、と強く感じました。

AWSは世界中の人が利用するプラットフォームの一つです。
交流するコミュニティは日本以外にも数多く存在しているので、英語の勉強を少しずつ進めていきたいですね！
[python]の:=について(セイウチ演算子)

# はじめに
pythonのコードで`:=`という見慣れない演算子を見かけたので、端的に備忘録として残します。


# `:=`の正体
これはセイウチ演算子と呼ばれていて、左辺に右辺の値を割り当てるという意味を持つ数学の記号のようです。

pythonではどのように使うのかというと、主に、条件式で代入処理を行うことができます。
例を示します。

n に値を代入して、それを比較したいと思います。
```py
# これはsyntaxエラーを出します
if n = int(input()) > 3:
    print(f'{n} > 3')
else:
    print(f'{n} <= 3')
```

pythonでは条件式内で通常の代入はできないようです。
そこで`:=`を利用することで、これを実現します。
```py
if (n := int(input())) > 3:
    print(f'{n} > 3')
else:
    print(f'{n} <= 3')
```
こうすると、nに入力を受け取り、それが3より大きいかを比較することができます。

## おまけ
C言語でいうとこんな感じのイメージになります。
これは条件式中でpに対する代入が行われ、値が評価されますね。
```c
#include <stdio.h>
int main()
{
    char str[128];
    char *p;
    while ((p = fgets(str, 128, stdin)) != NULL)
        puts(p);
    return 0;
}
```
VS Code でのカラー絵文字表示

## 問題

コード中でのコメントにカラー絵文字を使うと重要なメッセージを目立たせる事ができ、またどのカラー絵文字かによってテキストを読む事なくそのカラー絵文字だけで、その情報の大まかなカテゴリを知る事もでき、とても便利なモノです。

そして ⚠️ のような絵文字はコード中のコメント内で特に目立って欲しいところなのですが、普通にやるとカラー絵文字版ではなく単色の絵文字が表示されて残念なことになる場合があります。
現状、環境のアップデートにより、この問題の再現環境は減りつつはあるのですが、この記事ではこの問題の対処方法をご紹介します。

![⚠️がモノクロなスクショ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146335/4dbadb82-4ae6-333e-fc1e-68836d7394ea.png)

## 原因

そもそもなぜ他の多くの絵文字はカラー表示されるのに、一部の、それも より古くから存在していた絵文字が単色で表示されてしまうのか？　これは古くから存在していた事によって、カラー絵文字に対応してない多くの一般的なフォントに単色版の絵文字が存在しており、それが表示されてしまう為です。

## 対策

対策は２つあり、１つは UNICODE のバリエーションセレクターでカラー絵文字版を指定する事なのですが普通に IME から絵文字を入力するとカラー絵文字版でない方が入力されてしまいます。もちろん、辞書登録するなり、外部ツールを使うなりする手もありますが、検索や正規化の問題もあります。

今回、この記事でフォーカスするのはもう１つの方法で、フォント指定を工夫する方法です。

## カラー絵文字フォント

環境によって次のようなカラー絵文字フォントが存在しています。

|フォント|環境|
|---|---|
|`Apple Color Emoji`|Mac or iPhone or iPad|
|`Noto Color Emoji`|Linux or Android|
|`Segoe UI Emoji`|Windows|

ようはこれらのフォントを優先的に指定すれば良いのですが、これらのフォントを真っ先に指定すると、今度はこれらのフォントが半角の空白文字や数字のデータを持っており、それが全角の様な文字幅になっていたりする為(恐らくカラー絵文字として全てが真に等幅フォントになっている)、

![カラー絵文字を優先した為に他が残念な事になってるスクショ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146335/603942fd-5cf0-3f80-24fe-21fd913b3fee.png)

このようにこれはこれで残念な事になってしまいます。それじゃぁと今度はこれらのフォントを最後に指定すると、他の指定フォントにもよりますが、単色版の絵文字が適用されてしまい、意味がありません。

そこでフォントの指定する順番として次のようにする必要があります。

1. 絵文字を含まないフォント
2. カラー絵文字フォント
3. その他のフォント

「絵文字を含まないフォント」としては主に半角の英数記号(ASCIIの範囲)ぐらいしかデータを持ってない多くのプログラミング向けのフォントがちょうど向いてます。お好みのプログラミング向けのフォントを指定してください。( 特にこれと言った好みのプログラミング向けのフォントが無ければ [Monaspace](https://monaspace.githubnext.com/) あるいは [Cascadia Code](https://github.com/microsoft/cascadia-code) でもダウンロードして利用してください。 )

「カラー絵文字フォント」はこのセクションの最初にリストアップしたヤツで、手元の環境に存在するヤツを指定してください。( 手元の環境に無ければ [Noto Color Emoji](https://fonts.google.com/noto/specimen/Noto+Color+Emoji) でもダウンロードして利用してください。 )

「その他のフォント」は指定しなくとも概ね問題ないかと思いますが( 例えば日本語文字データを持たないフォントしか指定してなくても、通常、システム上のフォントで補完されて正常に表示されます。 )、お好みの日本語文字データを持っているフォントを指定しておくことを推奨します。( 手元の環境に無ければ [Noto Sans Japanese](https://fonts.google.com/noto/specimen/Noto+Sans+JP) でもダウンロードして利用してください。 )

指定例：

```json
{
    "editor.fontFamily": "'Monaspace Neon', 'Cascadia Code', 'Apple Color Emoji', 'Noto Color Emoji', 'Segoe UI Emoji', Menlo, Monaco, 'Courier New', monospace",
    ...
}
```

![全ていい感じになってるスクショ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146335/d65feb88-5d1d-f617-5f76-234455676af5.png)

## フォント リンク集

- Monaspace (プログラミング用フォント): https://monaspace.githubnext.com/
- Cascadia Code (プログラミング用フォント): https://github.com/microsoft/cascadia-code
- Noto Color Emoji (カラー絵文字フォント): https://fonts.google.com/noto/specimen/Noto+Color+Emoji
- Noto Sans Japanese (日本語フォント): https://fonts.google.com/noto/specimen/Noto+Sans+JP

## 参考情報

- https://necomesi.jp/blog/tsmd/posts/154
- https://moji-memo.hatenablog.jp/entry/20120802/1343876603
私的GitHub Copilot活用方法紹介

こんにちは。プロダクト開発本部の初鹿です。

:::note warn
この記事は、[Supershipグループ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/supership)の2日目の記事になります。
:::

## はじめに
皆さんはGitHub Copilot使いっていますでしょうか！？
ChatGPTが2022年11月末に花開き、Stable Diffusionにはじまる画像生成AIブーム。
2023年はAIの単語を聞かなかった日は無いほど世の中を席巻していました。

巷ではAIで仕事が奪われるなどの記事が目につくようになりました。
かくいう私も日々の業務で似たようなコードの生成やデザインパターンでの実装を行う度に
パターンや繰り返しなら自動生成できるんじゃないのか？としばしば思っていました。

そこで、このAIビッグウェーブを期にうまくAIと付き合っていく方法を探ることがこれからのエンジニア人生に重要なんじゃないかと思いました。

幸いにも弊社ではGitHub Copilotを使用する機会があり、気軽に試せる環境があったので、他の人のTipsなどを聞きながら自分に適した付き合い方を模索いたしました。
私なりの使い方を共有しようと思います。

:::note info
今回はVSCodeにGitHub Copilot拡張を導入されている前提で話を進めます。
:::

### Prompt Craftingを意識する

GitHub Copilotも基本的には情報を渡し、如何に精度の高いレスポンス（提案）を返してもらうかが重要になってきます。
Prompt CraftingというのはGitHubの社内用語のようでしてどのような情報を渡すかCraftできるかがキーになっているようです。
その指針として以下の4つが提唱されています。

* Language Marker
    * プログラミング言語情報
        * 現状だと、GitHub Copilotは同じプログラミング言語のファイルを読んで提案をしてきます。ですので、このファイルはどの言語なのかなどの情報を読み込んで判断しています。rubyですと`#! /usr/bin/env ruby`などの記述のこと
* Path Marker
    * 現在のファイルパス
        * このファイルはlib配下なのかmodule配下なのかファイルがどの階層にあるかなどの情報のことです。
* Neighboring Tabs
    * 非アクティブなオープンしているタブ
        * こちらは現在コーディングしている以外に開いているタブのことです。GitHub Copilotでは最大20ファイルの非アクティブなタブ（ファイル）を参照することができます。FIFOでファイルをアクティブにするなど順番ごとにキャッシュしてこのファイルの次はこのファイルを参照したってことは... などとファイルをアクティブにするという行為も学習の一環として利用されています。
* Code Retrieval
    * コードベースの中の他の場所のコード
        * 文字の類似性でファイル内を検索しているので一貫性のある命名規則や関数名を意味のあるシンプルなものにすると精度が上がっていくそうです。

このような、裏側でのちょっとした仕組みを意識して使ってみると精度が上がるかもしれません。

### 宣言ファイルをなどをピン留めする

これは、TypeScriptだとわかりやすいですが、型の定義ファイルなどをVScodeのタブを右クリックしてメニューの`ピン留めする`を選択。するととピン留めすることができ、関数内の情報を類推して提案精度を高めることができるというTipsです。

### ショートカットを駆使する

macOS のキーボード ショートカット
|アクション|ショートカット|
|:-:|:-:|
| インライン候補を受け入れる  |  タブ |
|インライン候補を無視する	| Esc      |
| 次のインライン候補を表示する	| Option (⌥) または Alt+]    |
|前のインライン候補を表示する   |	Option (⌥) または Alt+[   |
|インライン候補をトリガーする|	Option (⌥)+\      |
| GitHub Copilot を開く (別のペインに追加の候補)	 |Option (⌥) または Alt+Return    |

このようにいくつかの候補の中から提案を受け入れたり次の候補に進んだりなどショートカットを駆使することによってサクサクとサイクルを回していけます。

[環境での GitHub Copilot の構成](https://docs.github.com/ja/copilot/configuring-github-copilot/configuring-github-copilot-in-your-environment)

### GitHub Copilot Chatを使いこなす

私が今一番使っているのがこちらになっています。
こちらはいわいるチャット形式で質問に対してCopilotくんが返答を返してくれるもので何が便利かというとコード選択して`コードの説明`を選択するだけでこの関数は何をやっているものかを説明してくれて更に追加の質問内容まで提案してくれます。

例:
![スクリーンショット 2023-12-02 3.03.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14450/e6430335-c86c-ab6a-8657-fa06f1bcac4c.png)

更にテストを書いてや、ドキュメントを書いてなどを依頼すると文句も言わずに回答してくれます。
これを駆使し、使用したことのない言語やライブラリなどでいろいろ質問し理解のスピードが格段に上がり大変感動しました。

しかし、局所的な知識は得られても体系的には知識は得られないので体系的に学ぶにはやはり書籍等などで保管する必要があるなと感じました。

## おわりに
一部ではありますが、私なりに便利だと思った機能、Tipsを紹介させていただきました。
皆様のより良いプログラミング体験の参考になれば幸いです。

参考：
* [GitHub Copilot パターン&エクササイズ](https://patterns.hattori.dev/ja/)
* [GitHub Copilotで拓く開発生産性](https://logmi.jp/tech/articles/329426)

:::note
**最後に宣伝です。**

Supershipではプロダクト開発やサービス開発に関わる人を絶賛募集しております。
ご興味がある方は以下リンクよりご確認ください。
[Supership 採用サイト](https://supership.jp/recruit/)
是非ともよろしくお願いします。
:::
【体験記】私がモバイルエンジニアになった経緯

## はじめに
初の一人アドベントカレンダーの記念すべき１日目となります。(うっかりしていて、日付を超えてしまったのは内緒:innocent:)

１日目ということで、少し自分の過去について考えてみようと思います。
もしよければ最後までお付き合いいただけると幸いです！:writing_hand:

## 情報系の学校に入学した経緯
私は幼い頃から、PCと触れ合っていて機械大好き！！という人間ではありません。
初めて自分のPCを持ったのは専門学生になる際に学校から言われた時です。
それまで家庭ではPCに触れ合う機会は全くなく、中学や高校での情報の授業で触るくらいのレベルでした。

ですので、ローマ字入力もまともにできない。そんな状態で情報系の専門学校に行きました。
(正直いうと第一志望校に落ちてしまい、家庭事情などからその専門学校しか行ける学校がなかった:rolling_eyes:)

では入ってみてどうだったかというと。。。
- 周りはPCに詳しい連中が多い。
- 既にプログラミングを齧ってきている人が半数以上。
- タイピングの実力テストでは**ダントツの最下位**。

と中々のハードモードでの専門学生生活がスタートしました。

## 転機になった専門2年生
1年目の前半はプログラミングが全く楽しくなく、苦痛以外の何者でもありませんでした:fearful:
しかし毎日居残りして(時には友達に支えられ)なんとか課題をこないしていくうちに、
1年目の後半〜2年目前半位から、少しずつ自分の実現したいことを上手くプログラミングに落とし込むことができるようになりました。

そして、上手くロジックを組めるようになってくると、**まるでパズルを解いている**ような感覚になりました。
(上手く解けた時の快感が忘れられなくなりました:stuck_out_tongue_closed_eyes:)

そんなこんなで「将来はエンジニアになろう！」と考えるようになり、就活を始め、無事にエンジニア職に採用されました。

## モバイルとの出会い
無事に新卒で入った会社での3ヶ月の新人研修を終える頃、配属に関するアンケートが取られました。
その会社では、上記のアンケートの内容などを加味して配属先を決めてくれる会社でした。

私は初め組み込み系のエンジニアになりたいと考えていました。(一番の希望は自動車関連)
ただ家庭の事情で、実家から通う必要がありました。
そして組み込み系になってしまうと、実家とは違う市に配属になってしまうため、組み込み系は諦め勤務地を優先してほしいという内容でアンケートを回答しました。

そして、配属された先がモバイルアプリを開発しているチームでした。(Androidチームに配属になりました。)

配属になりモバイルアプリの開発が開始しますが、これまでモバイルアプリの開発経験が全くない私は、正直全く役に立たない(なんなら先輩に質問していたため、先輩の足を引っ張る)新人でした。

そこからなぜ今もモバイルエンジニアを続けているのか。。。については2日目のアドカレで記載します！

では、また明日:open_hands:
【Rails】DBのdate型とdatetime型を型変更したときの値の変化

# はじめに
Ruby on Railsの開発では、日付や時間情報を扱う際に、date型やdatetime型を使うことが多いです。
その時に、date型からdatetime型、datetime型からdate型に型変更したときにタイムゾーンによって値がどのように変更されるのかを残します。

# 前提
- Ruby on Rails：7.0
- PostgreSQL：14.9 (MySQLでも同様の結果になると予想されます)
- **アプリケーション側(Rails)のタイムゾーンはJSTで、DBサーバ(PostgreSQL)のタイムゾーンはUTC**

# カラムの型をdate型からdatetime型に変更する
DBのカラムの型をdate型からdatetime型に変更すると、どうなるのでしょうか。

今回は例として、ユーザの誕生日に時間情報を追加したいと思います。(自分の誕生時間を知ってる人がいるかは置いておきます)

usersテーブルとbirthdayカラムを作成します。
```
create_table :users do |t|
    t.date :birthday
end
```

データを見ると、Rails側では以下のようなデータになります。

```                      
birthday: Sat, 02 Dec 2023
```

PostgreSQL側では以下のようなデータになります。
```                      
birthday: 2023-12-02
```

同じ日付になってますね。

では、マイグレーションでdate型からdatetime型を変えます。
```
change_column :users, :birthday, :datetime, precision: 6
```

このとき、birthdayカラムには日付情報しかなかったレコードに時間情報が追加されます。
データを見ると、Rails側では以下のようなデータになり、「09:00」が追加されています。

```                      
birthday: Sat, 02 Dec 2023 09:00:00.000000000 JST +09:00
```

PostgreSQL側では以下のようなデータになり、「00:00」が追加されています。
```
birthday: 2023-12-02 00:00:00
```

## 結果
表にまとめると、以下のようになりました。
| カラム型 | アプリケーション側(JST) | DB側(UTC) |
|:-:|:-:|:-:|
| date型　| 2023-12-02 | 2023-12-02 |
| datetime型| 2023-12-02 **09:00:00** | 2023-12-02 **00:00:00** |

DBのカラムの型をdate型からdatetime型に変更すると、データベース側で自動で00:00が追加されます。

DBサーバのタイムゾーンはUTCなので、JSTでは9時の時間となります。

# カラムの型をdatetime型からdate型に変更する
新しくデータを入れ、datetime型のbirthdayカラムに、JSTで「12/02 00:00」を入れました。
```                      
birthday: Sat, 02 Dec 2023 00:00:00.000000000 JST +09:00
```

そして、PostgreSQLから見ると、タイムゾーンはUTCなので「12/01 15:00」になっています。
```
birthday: 2023-12-01 15:00:00
```

このdatetime型のbirthdayカラムをdate型に変更します。

すると、Rails側から見ると、datetime型では「12/02」だったのに対し、「12/01」になっています。
```                      
birthday: Sat, 01 Dec 2023
```

そして、PostgreSQL側から見ると、「12/01」のままで日付に変更はなく、時間情報のみなくなっています。
```                      
birthday: 2023-12-01
```

## 結果
表にまとめると、以下のようになりました。
| カラム型 | アプリケーション側(JST) | DB側(UTC) |
|:-:|:-:|:-:|
| datetime型| **2023-12-02** 00:00:00 | 2023-12-01 15:00:00 |
| date型　| **2023-12-01** | 2023-12-01 |

DBのカラムの型をdatetime型からdate型に変更すると、時間情報がなくなり、日付情報だけが残るようになります。
このとき、タイムゾーンはDBサーバのタイムゾーンを元に変更されるため、JSTでは0時を超えていても、UTCでは0時を超えていないという状況が発生します。

# まとめ
date型→datetime型では、「DBサーバのタイムゾーンでの00:00が追加」され、
dattime型→date型では、「DBサーバのタイムゾーンで時間情報のみなくなる」という結果になりました。

設定したタイムゾーンによってはインシデントやデータの不整合につながるため、型変更する際は既存データの値を修正する作業が必要になると思います。

# おわりに
date型、datetime型の型変更での値の変化について見てみました。タイムゾーンと型変換は割とトラブルが起きやすいところだと思うので注意が必要ですね。
マザーボードのROM焼き

皆さんこんばんは，やっぱりPC修理が大好き！なんでも研究所です．

[創作世界とか，いろいろ Advent Calendar 2023](https://adventar.org/calendars/9397) 2日目です．なぜか二日連続PCネタですが，頑張ってます．

マザーボードのROM焼き方法についてまとめました．[BIOSが起動しないPC（AT互換）の修理](https://qiita.com/anythinglab/items/acc16651922ccf2f7454) の補足記事です．

指摘や試しても治らなかった場合にはコメントお願いします．より良い記事にするため，ご協力お願いします．

自己責任でお願いします．

# 1. 必要なもの
必要なものは以下です．
- ROMライター CH341A
- Windows PC (CH341Aを動かすPC)
- マザーボードのBIOS

CH341Aは1500円くらいで買えます．自作PCやPCの修理をする，という方は一台持っておいて損はないでしょう．
[amazon CH341A](https://www.amazon.co.jp/KeeYees-ROM%E3%83%A9%E3%82%A4%E3%82%BF%E3%83%BC-Flash%E3%83%A9%E3%82%A4%E3%82%BF%E3%83%BC-USB-TTL%E3%82%B3%E3%83%B3%E3%83%90%E3%83%BC%E3%82%BF-IC%E3%83%86%E3%82%B9%E3%83%88%E3%82%AF%E3%83%AA%E3%83%83%E3%83%97/dp/B07W7RQ53X)

マザーボードのBIOSは各メーカーサイトからダウンロードしてください．"(マザーボード名)"と調べれば大抵はメーカーサポートサイトが出てくるので，そこからダウンロードしましょう．

※ASUS，ECS製マザーボードの場合はBIOSの編集が必要です．以下を参考に，BIOSを編集してください．
ASUSの場合：[LGA1151 ASUSマザーボードBIOS復旧 2/2 BIOS編集](https://datyotosanpo.blog.fc2.com/blog-entry-104.html)
ECSの場合：[【 ROM焼き ( ROMライター )】復旧不可能（BIOS破損） ECS なマザーボードに BIOS 叩き込む動画](https://www.youtube.com/watch?v=ePRkKla8TME)

# 2. ドライバーのインストール
[CH341A Driver](https://www.wch.cn/downloads/CH341PAR_EXE.html) に移動します．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626637/c929feb2-6371-8f01-602d-7c2943f33671.png)
”下载”をクリックして，ダウンロードしてください．"CH341PAR.EXE"というファイルがダウンロードされます．

ダウンロードできたらCH341Aを挿した状態で実行して，
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626637/849468f5-f009-944e-b849-3db5a0cd7c1e.png)
”INSTALL”をクリックしてください．

インストールが終わったら閉じてください．

# 3. ROM焼き

[Asprogrammer](https://github.com/nofeletru/UsbAsp-flash/releases) をダウンロードしてください．執筆時の最新バージョンは2.0.4です．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626637/c504f32c-59de-149b-10ad-4ac5dbb72ada.png)
"Asprogrammer_XXXXX.zip"をダウンロードして展開し，実行してください．

実行したら，CH341AをROMチップに接続します．
(画像準備中)

クリップで挟むときにずれてしまって認識できないことがよくあるので，調整しながら何度も"Read IC"(左から7番目)を押しましょう．![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626637/707c306a-9627-b8a5-231d-347d8bff86dc.png)
チップが認識されたら，Read IC(右から3番目)して一度保存してください．念のためのバックアップです．
バックアップ出来たら，ダウンロードしてきたBIOSを開き，"write IC"(左から4番目)しましょう．

終わったら"Verify IC"して書き込んだ内容が正しいことを確認します．
問題なく書き込んだことを確認して，マザーボードの起動確認をしましょう．

BIOSが起動すれば修理成功です．お疲れさまでした．

# おまけ
今回はちょっと早く書き終わりました．やった！

2といえば，最小の素数ですね．そういえば，『魔法使いと黒猫のウィズ』にて，"すべての素数の積は偶数"というのが回答になる問題が出題されて話題になったことがありました．

理由は全ての素数の積を考えると2 *3 *5....だから，素因数に2が含まれる．よって偶数．というものでした．これは明確に誤りなのですが，あなたはちゃんと答えられますか？

はい，全ての素数の積というものは発散し，また自然数として定義不能である（背理法で簡単に示せます，練習にいい問題かも）ので，偶奇は定義不能，が正しい答えになります．
この問題の良い改題としては”10000までの素数の積”など，高々有限個になるような制約を設けることです．
（ちなみに全ての素数の積を解析接続すると4π^2になります．）

無限に対して有限の法則なり直観を適用するというのは非常に危険なことでもあります．バーゼル問題のオイラー解法も（答えは正しいですが）同じ詭弁を孕んでいます．

選択公理を有限の選択とは別に仮定する必要があるのもこのためですね，やはり無限は気持ち悪い．
いや～やっぱり数学は面白いです．
文書分類におけるGPUの違いによるモデルの精度差について

# はじめに
 大学の研究で、機械学習を用いた文書分類を行なっています。今回課題となったのは、GPUの違いによる精度の差です。
 Google Colaboratoryを用いて実験を回していたのですが、GPUを変えたことで明らかに精度に差が出ていました。
 具体的には、2値分類のタスクで、それぞれGPUを**Tesla-T4** / **NVIDIA-A100** を利用して行ったところ、評価指標Accuracyにおいて、以下のような結果になりました。
|| T4 | A100 |
|----|----|----|
|Accuracy|0.8236|0.8469|

　実験設定はGPU以外全て同じで、訓練・テストデータセット共に全て同じですが、約2%も差が生じてしまいました。私が行なっている文書分類のタスクにおいては、2%の差はかなり大きいもので、原因を探ることが必要となります。

こちらの対応について、昨日の研究室ゼミで議論したので、共有させていただきたいと思います。意見等ございましたら、コメント頂けますと幸いです。


# 精度差が生じてしまう原因を調べるには
　精度差が生じてしまう原因として考えられるのは、「**初期値**が変わることによる、モデルの精度のばらつき」が挙げられました。
 
機械学習をする際には、シード値の設定をすると思いますが、たとえそのシード値が同じであったとしても、GPUの種類・アーキテクチャが違えば、異なる乱数値で実験されているとのことでした。そのため、精度としてばらつきが生じてしまうということです。

上の仮説が正しければ、モデルがシード値を変えて実験した際にかなり精度に差が生じる、つまり「モデルの揺れ」が大きいということで、良くない状況といえます。


# シード値を変えて「モデルの揺れ」の大きさを確かめてみた
実験が終わり次第、追記したいと思います。



# 最後に
 今回は、GPUの違いによるモデルの精度差についてお話ししました。非常に有益な内容だったと思います。
 
 まだまだ初心者（とはいえ4年生の冬）で、勉強も正直あまりできていません。卒論の締め切りが近づいてきていますので、頑張っていきたいと思います。

 間違いや意見等ありましたら、コメントをしていただけますと幸いです。

 ありがとうございました。
Ubuntu 20.04でもタッチパッドでジェスチャを使いたい

# あれ？Ubuntuってマルチタッチジェスチャできなかったっけ？
5,6年ぶりにラップトップにUbuntuを入れて触ったら、3本指スワイプどころかピンチイン/ピンチアウトもできなくてびっくりした。
MacやWindowsに洗脳されてたのかもしれないが、やはりジェスチャは使えたほうが便利なのでなんとかしたい。

# libinput-gesturesで出来るっぽい
3年前の記事が見つかった。三年経てば文殊の知恵もあてにならないとか言われているので記事として残しておく。

## 参考記事
- [Linuxのタッチパッドでピンチ・3本指・4本指ジェスチャーを使う](https://qiita.com/onokatio/items/c386da501d11a9735915)

## 環境
- OS
    - Ubuntu 20.04.6
- その他
    - Python 3.8.10 (pyenv)
    - libinput 1.15.5-1
    
# 事前準備

1. inputグループに追加
    ```bash
    sudo gpasswd -a $USER input
    ```

1. なんか必要なやつを入れる
    ```bash
    sudo apt install wmctrl xdotool
    # 入ってなければlibinput-toolsも入れるらしいけど今回の環境には入ってた
    ```

# libinput-gesturesの導入

1. 本体のインストール
    ```bash
    git clone https://github.com/bulletmark/libinput-gestures.git
    cd libinput-gestures
    sudo ./libinput-gestures-setup install
    libinput-gestures-setup autostart start # 自動起動
    sudo reboot
    ```
1. ジェスチャの設定
    デフォルトは好みじゃないのでいじる。
    ジェスチャに対応させるコマンドはwmctrlとxdotoolのドキュメントを読むといい。
    ```bash
    touch ~/.config/libinput-gestures.conf
    nano libinput-gestures.conf
    libinput-gestures-setup restart
    ```

    中身

    ```conf
    gesture swipe up    xdotool key super
    gesture swipe down  xdotool key ctrl+w
    gesture swipe left  xdotool key ctrl+Tab
    gesture swipe right xdotool key ctrl+shift+Tab
    gesture pinch in    xdotool key ctrl+minus
    gesture pinch out   xdotool key ctrl+plus
    ```

# 終わり
windowsやmacのピンチイン/ピンチアウトのような無段階?のズームができないけどひとまず満足できた。
【ldaps】有効期限が１００年の LDAPS の証明書を作る

# 有効期限が１００年の LDAPS の証明書を作る
有効期限が 100年の SSL 証明書を利用して ldaps の動作検証を行う必要があったので、環境のセットアップ成方法についてメモを残しておきます。

### まずは AD CS を構築する

先ずは Windows Server の役割と機能の追加から「AD CS」を追加します。
単純に ldaps を使いたいだけなら AD CS を構成するだけでも使えます。手順は以下の記事を参考とさせて頂きました。

https://t-dilemma.info/how-to-adcs-2019/

ただ、注意しておかないといけない点が一つあって、**AD CS の構成ウィザードの中で「CA の有効期限」を100年 にしておかないと、後に有効期限が100年の証明書を作成することができません。**
構成が終了すると、デフォルトとなる有効期限が１年の証明書が作成されています。

### デフォルトの証明書を手動で置き換える
デフォルトで作成される期限が一年の証明書を期限が100年のものに手動で入れ替えます。
手順はこちらの「AD CSから配布されるデフォルトの証明書を利用してはいけない理由」以下の項を参考とさせて頂きました。

https://t-dilemma.info/setting-ad-ldaps-windows2019/#AD_CS%E3%81%8B%E3%82%89%E9%85%8D%E5%B8%83%E3%81%95%E3%82%8C%E3%82%8B%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%AE%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%A6%E3%81%AF%E3%81%84%E3%81%91%E3%81%AA%E3%81%84%E7%90%86%E7%94%B1

ただ、この作業でも１点注意が必要です。上記の手順で証明書テンプレートを編集する際、有効期限を100年にしますが、実はこのテンプレートを使って証明書を作成しても、期限が２年の証明書しか作ることができません。
**実は Windows CA ではデフォルトだと２年以内の期限となる証明書しか発行できないようになっています。それ以上の期限の証明書の発行が必要な場合は、レジストリの設定を以下のように変更する必要があります。**

>・レジストリ：HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\CertSvc\Configuration\
>・値の名前：ValidityPeriodUnits
>・値データ：100（10進数）

変更後は、以下の DOS コマンドにて Windows CA を再起動して設定変更を反映します。

```ruby:
net stop certsvc
net start certsvc
```

以上の作業で有効期限が100年のSSL証明書を利用して LDAPS 接続が使えるようになります。
OS入門01_オペレーティングシステムをわかりやすく解説

# OS入門01

こんにちは！かっつーです。

最近大学でOSについての授業を取っているのですが、OSの授業を軽い気持ちで取ってしまいました。
「OSなんだか面白そうだなああ。学部関係ないけど受けてみよう！」という安易な気持ちで取ってしまった僕は途中で投げ出しかけています。
おそらくこれは情報学科の生徒でもOSについての理解が深い人は多くはないのではないでしょうか？

プラグラミングはできるけど、OSの理解は深くないという人は少なからずいらっしゃるかと思います。

しかしOSについて理解してより深くプログラミングができるようになりたい！コンピューターの真髄を理解したい！という気持ちがある人はたくさんいらっしゃると思います。

今回のシリーズでは僕がOSについて理解したことをひたすらアウトプットしていき、寝っ転がりながらでも読めばわかるように解説していきたいと思います。

ここで紹介することはすべてOSの基本的な土台でありコンセプトであることは先に述べておきます。

この記事のターゲットは下記の人になります。

- **OSの概要について簡単に理解したい人**
- **ソフトウェア開発者**
- **パソコンの背後にある原理を理解したい方**

などです。

### そもそもコンピューターに対してこんな疑問持ちませんか？

- どうして入力した文字が画面に出力されるんだろ？
- どうしてアプリが同時に二つも立ち上げられるんだろ？
- ハードウェアは入力に対してどう対応しているだろ？
- 音楽聞きながらメールしたり、ウェブを閲覧できるのはどうしてなんだろ？

上記のように思ってみればコンピューターの内部で起こっていることを理解しなくても我々は多くのアプリケーションやサービスを享受できます。

オペレーティングシステムの行っていることはずばりこういうことです。

「ハードウェアの集合体であるコンピューターを**抽象化し**、人間にとって**使いやすくする**コンピューターに見せかけること」

そもそもコンピューターは細かい小さなチップやメモリ、電池などのハードデバイスの集合体です。そんな物理的で人間に馴染みのないものが、人間にとって使いやすい形で提供されていることに驚きませんか？

ハードウェアの集合体であるコンピューターを抽象化してあげて、人間にとって馴染みあり、理解ができ、使えるように見せかえるシステムこそオペレーティングシステムなんです。

オペレーティングシステムの役割は大きく分けて3つあります。

1. **ハードウェア内部で起こっていることを隠蔽すること**
2. **ハードウェアの持つ物理的な制約を緩和すること**
3. **ハードウェアの共有を可能にすること**

#### 1. ハードウェア内部で起こっていることを隠蔽すること

1は、もともとPCはコードで操作していたが、それを今は直感的に操作することができますよね。さらに、キーボードで入力したものを読み込んで、描画するためにも本来は複雑な操作と手順が必要ですが、それすら必要ないのは、OSがその操作を隠蔽しているからです。

#### 2. ハードウェアの持つ物理的な制約を緩和すること

2は、ハードウェアにはそもそも物理的な制約があります。

AppleのMacbookなどを購入しようとすると、メモリやコアのことを調べると思いますが、それらの容量は必ず有限です。例えばメモリ16GBのMacbookがメモリ64GBになることは決してありません。（あたりまえ体操

しかし、こうした物理的な制約を緩和することができるのがOSの役割の一つです。OSが提供する仮想記憶という機能を使うと、メモリ容量よりも多く使うことができます。

そうパソコン側に見せかけることができます。

#### 3. ハードウェアの共有を可能にすること

3は、上記で書いた疑問にあるようになぜ音楽を聞きながらニュースを見れたりするのかという疑問を解消する役割です。本来コンピューターは1命令ずつしかCPUによって解釈実行されません。それなのになぜ同時に複数アプリを立ち上げられるのかというと、ハードウェアの共有をOSによって可能にしているからなんです。一つしか無いCPUをうまく共有させています。どのプログラムも公平にCPUを使えるようにしているんです。
（仮にChromeがCPUリソースすべてを食い荒らしたら、ムカつきますよね。それ以外なんにもできないんですから。）

このように、ハードウェアの詳細を隠し、物理的な制約を緩和し、リソースを共有可能にしているのがOSの役割です。

ではこれらを実現している技術を大きく分けて4つ紹介します。すべて抽象化しています。

#### OSを支える4つの技術
1. **CPUの抽象化**：物理的には一つのCPUを複数プログラム実行できるようにする技術
2. **メモリの抽象化**：データやプログラムを記憶するメモリが抽象化され、実際に搭載されているメモリ容量よりも多く見せかける技術
3. **ディスクの抽象化**：データやプログラムを保存しているディスクを抽象化し、ファイルやフォルダを実現している技術
4. **入出力の抽象化**：入出力装置を操作するために必要な詳細を隠蔽し、汎用的で人間にとって使いやすくする技術

上記とそれをさらに実現する要素技術についてそれぞれ解説していきます。

最後にコラムとしてアウトプットしますが、

オペレーティングシステムにも色んな種類があります。

電車の改札でカードをかざすと瞬時に通信して、改札の外に出ることが許可されるのもすごくないですか？

飛行機の航空制御をしているOSもすごくないですか？

そういったリアルタイム性の必要なOSのことを、**リアルタイムオペレーティングシステム**と呼びます。

普段普通のPCで使われるのは**汎用オペレーティングシステム**ですが、そうではないOSもあるんですね。

ということで、今回はOSの概要と役割、それを実現する技術について簡単に紹介しました。

内容量が多すぎると読むのに時間がかかるので、今回はこれくらいにしたいと思います。
本番環境にてlaravel内のviteのビルドを行う

### はじめに

個人開発メモ📝
今回は、前記事に行ったherokuを使用したデプロイ作業の続きです。
前記事↓
https://qiita.com/kuro_maru/items/34bab426fdc81e4459ae

### 今回起きたエラー

```
// マニフェストが見つかりません というエラーメッセージ
Vite manifest not found at: /app/public/build/manifest.json (View: /app/resources/views/layouts/guest.blade.php) (View: /app/resources/views/layouts/guest.blade.php)
```

本番環境では、viteのビルドはmanifest.jsonというファイルで行われるらしく、このファイルがなかったことにより起きたエラーでした。

```package.json
// ビルド情報を更新
"scripts": {
   "dev": "vite",
   "build": "vite build --mode production"
},
```

上記を更新したら、ターミナル上で以下を実行します。

```
cd プロジェクトディレクトリ
vite build --mode production
```

実行が完了すると、laravelプロジェクト内のpublicディレクトリ内に、新たに/build/.viteというディレクトリが生成され、その中にmanifest.jsonが生成されています。



### manifest.jsonの参照先の変更

今回、ベースとなるbladeファイルにviteを読み込むような設定にしていたので、ベースのbladeファイルの記述を変更します。

```resources/views/layouts/guest.blade.php
// 元々は、@vite[]の書き方をしていた箇所を以下に変更します
<!-- Fonts -->
<link rel="stylesheet" href="/build/assets/生成されたcssのファイル">

<!-- Scripts -->
<script src="/build/assets/生成されたjsファイル" type="module"></script>
```

このように設定をしたらエラーは消え、画面が表示されました。
人の知覚特性を考慮した色の指標「CIE DE2000」に関するメモ（DeltaE という JavaScriptライブラリの話も）【完走賞ゲット-2】

:::note info
※ [Qiita の完走賞をゲットするための条件は「単一／複数のカレンダーに投稿した記事が合計25」です](https://twitter.com/Qiita/status/1593441648796524545)
:::

この記事は、「[完走賞ゲットのため小ネタ 25記事を投稿しようとチャレンジ v2 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/youtoy)」の 2日目の記事です。

## 今回の内容
今回の記事の内容は、2年前くらいに途中まで調べていた「色の距離」に関する話です。

以前、色の距離について調べていた時がありました。色の距離の話の中でも、特に「人の知覚特性を考慮した色の距離」についてです。
それに関して、当時、以下のようなポストをしていました。

https://twitter.com/youtoy/status/1440485850660229121

https://twitter.com/youtoy/status/1440489472085291011

当時、何らか情報を記事に残していた気でいたのですが、それをやっていなかったようでした。そのため、あらためて「人の知覚特性を考慮した色の距離」に関する話を記事化します。

## 色の距離について
色の距離を計算するという話に関して、単純な方法の事例では「RGB のそれぞれの値の差をとる」という方法があります。

しかし、それだと問題が生じる場合があります。その話に関して、まずは以下の図をご覧ください。
※ この図は、[上で掲載していたポストの中に出てきている記事の 1つ](https://yuki-koyama.hatenablog.com/entry/2018/05/04/135347)から抜粋しました

![人の知覚特性を考慮した色の距離](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/6a52ce20-f6eb-adc0-5369-2b07db96c104.png)

この図は、今回の記事のメインの話になる「CIEDE2000」に関するものです。

図の中で「赤・オレンジ系の 2つの色」と「緑系の 2つの色」が示されています。おそらく、それぞれの色の違いを見比べると、「赤・オレンジ系の 2つの色」のほうが差が大きいように見えるのではないかと思います。

しかし、これを RGB の差で比較すると、差分が同じになります。そこで、色の距離を比較する時に、人の知覚特性を考慮した指標というものがあるようです。

その 1つが、今回の記事で扱う「CIE DE2000」です。その内容については、以下のサイトを見ると詳しく書いてあります（以下の記事「セクション2-6」以外に、[「セクション1-1」](https://www.konicaminolta.jp/instruments/knowledge/color/section1/01.html) や [「セクション 2-1」](https://www.konicaminolta.jp/instruments/knowledge/color/section2/01.html) などを見てみるのもオススメです）。

●新しい色差式（CIE DE2000）について。-楽しく学べる知恵袋 | コニカミノルタ
　https://www.konicaminolta.jp/instruments/knowledge/color/section2/06.html

## CIE DE2000 を JavaScript で扱う
上で出てきた CIE DE2000 をプログラムで扱う話を書いていきます。

言語は、自分がよく使っている JavaScript とします。GitHub で検索をかけてみると、以下の結果がでてきました。

![GitHub での検索結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/d9d7684c-1bf8-5612-d614-1654180fa046.png)

そして、検索のトップに出てきているのが、以下の「DeltaE」です。

●zschuessler/DeltaE: CIE color difference formulas in JavaScript
　https://github.com/zschuessler/DeltaE
●zschuessler.github.io/DeltaE/
　https://zschuessler.github.io/DeltaE/
![DeltaE](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/3d28123f-d081-4184-75e8-dbedf3a25ff9.png)

使い方の説明などを見ていると、 `DeltaE.getDeltaE00()` を使うと「CIE DE2000」が扱えるようです。
![使い方](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/a445c508-5954-f546-8a4e-7ff8c9bc3120.png)

## おわりに
今回の記事では、「人の知覚特性を考慮した色の距離」の話と、それを JavaScript で扱う方法について書きました。。

今後は、実際にこの DeltaE を使っていければと思います。
積読本 『xUnit Test Patterns』を紹介する

積読Advent Calendar第三弾ということで、今回は僕が積読している『xUnit Test Patterns』という本を紹介します。
どこに書くか悩んだのですが、今回はとりあえずQiitaに書くことにしました。

Amazonから買えますので、気になった方は是非↓
https://www.amazon.co.jp/xUnit-Test-Patterns-Refactoring-Addison-Wesley/dp/0131495054

# この本は何？

タイトルの通り、UnitTestのデザインパターン集です。UnitTestだけを取り扱った本ですが、紙本だと**¥15,267**もします。(kindleだと¥4,147で買えます。)

2007年と古めの本ですが、UnitTestについて網羅的に書いてここまで網羅的に買いてある本は他にありません。この本に比べると『[単体テストの考え方・使い方](https://book.mynavi.jp/ec/products/detail/id=134252)』すらかかすみます。一部はhttp://xunitpatterns.com/ で読めるみたいです。

# なんで積読したの？

あまりに分厚いからです。UnitTestしか扱っていないのに、**942ページ**もあります。すごい分量です。しかもこの本**翻訳版がなくて、英語版しかありません。**
UnitTestしか扱ってなくて、本自体も古くて、しかも全部英語。これは積読も仕方ないでしょう（？）

# なんで買ったの？

**UnitTestについて、ここまで網羅的に扱っている本が他にない**これにつきます。
最近のUnitTestの本で有名な本には『[単体テストの考え方・使い方](https://tatsu-zine.com/books/unit-testing-principles-practices-and-patterns)』がありますが、個人的にはこれでもまだ満足し切れませんでした。

保守しやすいテストを書くにはどう書いたらいい？テストの網羅性はどこまで追求するべき？レガシーコードにテストコードを追加するとき、どう書いていけばいい？

いろんな疑問が消えない中で、ふとこの本を見つけた時、「これだ！！」と思いました。

[ブログ](http://xunitpatterns.com/index.html)を見ただけでも、ありとあらゆる状況に対して、どのようなテストコードを書けばよいか網羅されてそうです。

本の目次を見ても、「テストコードの臭い」から始まって、「効果的なテストを書くまでのロードマップ」、「デザインパターン」など、テストコードを書くのに役立ちそうな要素が盛りだくさんです。

# 目次だけ紹介

全部で27章ある！

- Chapter 2 Test Smells (テストの臭い)
- Chapter 14 A Roadmap to Effective Test Automation (効果的なテスト自動化のロードマップ)
- Chapter 15 Code Smells (コードの臭い)
- Chapter 24 Test Organization Patterns (テストの組織パターン)
- Chapter 27 Value Patterns (値パターン)

Appendixも盛りだくさん！AからGまであるよ！ここでは一部だけ紹介。

- Appendix A Test Refactorings (テストのリファクタリング)
- Appendix G Patterns, Aliases, and Variations (パターン、エイリアス、バリエーション)

# で、どこまで読んだの？

10ページくらいです、、汗
多分頭から全部読むんじゃなくて、かいつまんで興味があるところを読む本なんだと思います。

# ちなみに

実はこの本、**積読アドベントカレンダーへ登録した後に購入しました。**
元々積読しまくりだったのでネタには困らなかったのですが、欲しくなって仕方がなくて。。
こうして積読は増えていくんですね。

# 最後に

みなさんもぜひ買いましょう！そしてできれば翻訳版を！（古いけど）
自衛官からエンジニアへ Elixirから始める Web開発 Part 3

この記事は「Elixir Advent Calendar 2023」3日目の記事です
東京にいるけどfukuokaexのYOSUKEです。

普段は 合同会社TheWaggle で教材開発・システム開発・研修講師などマルチに活動してます。

このシリーズでは、文系ですらない、体育会系でも始められるプログラミング学習　というテーマで元自衛官だった僕が
自衛官からエンジニアになってもらいたいという気持ちを込めて、普段は大人しいですが、このコラムシリーズでは、あえて、体育会系のノリで、貴様ら理屈で覚えるなら体で覚えろ！というノリで書いてみたいと思います。

なので、初学者向けですが、理論は後回し、まずは動かして体感しろってノリの第3回目です。

それでは、いくぞ！

## プログラミングを理解しよう！
よし、貴様ら！これから本格的にElixirのプログラミングの訓練を始める！と、その前にそもそもプログラミングとはどんな特性を持っているかを知る必要がある。

プログラミングとは、人間が作ったルールに従って処理を実行する為の命令だ！
貴様らが部隊を動かす際の号令と同じようなものだ。

右むけ、右！という号令を出したらこう動け、と決められているように、プログラミングもあらかじめ機械が解釈できるように決められた命令やルールに従う必要がある。

## Elixirのプログラミングを理解しよう。

```elixir
1 = 1
```
数学と同じようにElixirでは```=```を使って、左辺と右辺が一緒か？という意味だ。
したがって、以下のように ```4 = 1 + 3```も右辺と左辺が同じだから問題ない。

```elixir
4 = 1 + 3
```
では左辺と右辺が違う場合はどうなる？　よく見ておけ！

```elixir
4 = 1
** (MatchError) no match of right hand side value: 1
    (stdlib 5.0.2) erl_eval.erl:498: :erl_eval.expr/6
    iex:1: (file)
```

MatchErrorと怒られる。 きさまー！ 右向け右と言ったろう！ 左を向くなぁ！と言ったところだ。

![スクリーンショット 2023-12-02 0.52.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/4ff42c32-9193-726d-1fec-cb8de9758762.png)

いいか、きさまら！ 右辺と左辺は同じ と言ったら同じにしろ！　今度間違えたら腕立て100回だ！

何？ ```1 + 3 = 4```としたら怒られただと？　よし、勘の良いきさまに特別に教えてやろう。

```elixir
1 + 3 = 4
** (CompileError) cannot compile cell (errors have been logged)
```

これは、ルールだ！頭の弱いきさまらは、理屈で覚えるな！まずはルールで覚えろ！

「右向けー右！」と普段から慣れている号令を突然「右、右向け！」と号令されても、ふざけてるのか！と怒られるのと同じだ！

左側には計算はこない、計算などごちゃごちゃするのは右に書け！ いいなわかったか！

![スクリーンショット 2023-12-02 0.57.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/cfaca514-0649-a5f8-bb5d-93e6ec92326e.png)

よし、今日はここまで、それでは次回 Part4でまた会おう！
大体０から始めるRuby入門その３ 

この記事は[【完走したい】楽しくいろいろやる Advent Calendar 2023](https://qiita.com/advent-calendar/2023/notbeginner)の３日目です。

# おみくじ
ランダムな数字の生成の仕方を学んだので、おみくじを作ります。
せっかくなので、運勢だけでなくランダムにメッセージが出るようにします。

# 配列
配列は、[]でくくって、中に「,」区切りで入れたいものを入れます。
例)
```
Test1=["a","b","c"]
```
Test1には、aとbとcの文字列がそれぞれ入っています。
ほかの言語と大体同じでした。
中身を一つ取り出すときは
```
puts Test[0]
```
これで0番目のaを取り出せました。
Rubyも、配列は0から始まるようです。
ランダムに文字を出すようにしてみます。
```
Test1=["a","b","c"]
A=rand(0..2)
puts Test1[A]
```
これでaからcが出てきます。
３行目のputsするTest1の[]の中に直接rand(0..2)を入れても動きました。
# switchがない
おみくじのメッセージを作る際、運勢ごとに選ばれるメッセージを変えるようにします。
こんな時、C#ではswitchとかと使うとスマートにかけました。
Rubyでは、caseを使うようです。
↓使ってみた
```
Unsei=["超大吉","大吉","中吉","小吉","吉","末吉","凶"]
Test1=rand(0..6)
case Test1
when 0 then
  puts Unsei[0]
when 1 then
  puts Unsei[1]
when 2 then
  puts Unsei[2]
when 3 then
  puts Unsei[3]
when 4 then
  puts Unsei[4]
when 5 then
  puts Unsei[5]
when 6 then
  puts Unsei[6]
end
```
こんな感じで動きました。
最後にendが必須です。
# おみくじを作る
1.超大吉
2.大吉
3.中吉
4.小吉
5.吉
6.末吉
7.凶
とします。
メッセージの中身はコードを見てください
↓実際に書いたもの
```
Unsei=["超大吉","大吉","中吉","小吉","吉","末吉","凶"]
Msg=["やったね！超大吉","今日はいいことあるかも？","やったー、大吉","おめでとう大吉だよ","中吉、まあまあだね","それなりにいいことがあるかも？","小吉か。まあ、凶よりはましだよね","ちょっといいことあるかも","吉、いい方なんじゃない？","それなりにいい感じのことがありそう","末吉...","わずかにいことがあるかも","凶です、悲しい","もう一回占っとく？"]
# Unseiを占う
Omi1=rand(0..6)
# メッセージを選ぶ


case Omi1
when 0 then
  RandMsg=rand(0..1)
when 1 then
  RandMsg=rand(2..3)
when 2 then
  RandMsg=rand(4..5)
when 3 then
  RandMsg=rand(6..7)
when 4 then
  RandMsg=rand(8..9)
when 5 then
  RandMsg=rand(10..11)
when 6 then
  RandMsg=rand(12..13)
end

puts "今日の運勢は" + Unsei[Omi1] + "だよ。" + Msg[RandMsg]
```
できた。
# まとめ
Rubyの配列の使いかたを学びました。
お正月にどうぞ。
参考

https://udemy.benesse.co.jp/development/system/ruby-array.html

https://style.potepan.com/articles/30466.html
他部署の困りごとを鮮やかに解決して、担当者の工数を約10時間/月も削減した話


本日は、吉田紗羅 （ヨシダサラ）が担当します。
わたしは、株式会社DELTAにてプロジェクトマネジャー/ ディレクターをしています。

https://speakerdeck.com/delta_tech/zhu-shi-hui-she-delta-hui-she-shuo-ming-zi-liao


グループ会社全体で利用している、DELTAが開発した会計システムの問題解決をしました。
お客さまである会計システム担当者からの機能改修要望を、言われた内容そのまま受け取ってシステム改修を行うのではなく、
業務で“本当に困っていることは何か”という問題の本質を突き詰め、システムを改修する以外の方法で解決しました。

その結果、改修コストを下げて短納期での納品を実現したことに加えて、
担当者の工数が約10時間/月も削減できることになりました!!

下記noteに詳細をまとめたので、ぜひご一読ください。

https://note.com/delta_sevenrich/n/nabee7d8809be?sub_rt=share_h

最後までお読みいただきありがとうございます!
DELTA全員でアドベントカレンダーに参加しておりますので、
ぜひ他のDELTAメンバーの記事も探して読んでいただけると嬉しいです!