OmniAICreator/Qiita-1.07M huggingface dataset:
LinuC 202受講後のメモ

約2年振りの投稿となりましたが、最近ようやくLinuCの202に合格したので、その際の苦労話や対策方法を軽く残しておこうと思います。
# 学習内容
LinuCの101から201までの間は、[過去に投稿した](https://qiita.com/fy406/items/09fbaffce95ee65839a5)学習方法で勉強して受講していましたが、それほど苦戦することなく1発で合格していました。

具体的には以下の流れで学習していました。

1.参考書を購入し、重要な部分を多色マーカーでマーキングしながら読み進める
2.参考書のマーキングした箇所を重点的に読み直す
3.ある程度覚えたらPing-tを利用し問題を解いていく
 Ping-tの自由演習モードではその場で回答を確認できるが、答えではなく解説をよく読み理解を深める
4.ある程度問題の正解率を高めてから模擬試験を実施

202の受講においても上記の流れで進めていました。
しかし初戦は不合格・・・

# 敗因
不合格となってしまった原因ですが、まず一番に出題範囲の圧倒的多さが挙げられます。
201の受講時は1ヶ月程度の学習でも合格できていたため、202も1～2ヶ月程度あれば合格できるだろうと舐めてかかっていた私ですが、全く足りませんでした。
出題されるジャンルの多さもさることながら、1章毎のボリューム自体も非常にヘビーであり、私の能力では1章毎で1ヶ月は必要なほどでした。

二点目は似たような意味なのにコマンド毎にオプションの記述や指定方法が異なるものや、設定ファイルの名前や書式が統一されていないことが多いためごっちゃになりやすい点です。

例えばnamedの管理コマンドrndcにおいて、強制終了させるサブコマンドは`halt`ですが(haltはLinuxのシャットダウンコマンドなので比較的わかりやすい)、postfixの管理コマンドによるサブコマンドの場合は`abort`(なぜ?)であったり、Squidのユーザ管理コマンドのsquidclientのオプションで、パスワードを指定するオプションが`-p`ではなく`-w`だったり(これは-pがポート番号を指定するオプションに割り当てられているため)、設定ファイルにおいても大抵はファイルの拡張子が`.conf`となっているのですが、Postfixの場合は`.cf`となっている(configの略？)等、間違えて覚えてしまいそうなものが多かったです。

以上のことから、従来の参考書で基礎を固めてからPing-tを解いていくという方法だけでは限界がありました。
そこで私は参考書とPing-tに加えて別の学習方法で受講に挑むこととしました。

# 学習方法
まず1点は、参考書とPing-tを解く際に自由演習モードで見ることができる解説に掲載されているオプション等の一覧表をExcelに写し書きを行い、とくに覚えにくいオプションに関しては太字や赤文字等にして徹底的に抑えることをしました。
自分でオプションや意味を自分なりに覚えやすく工夫しながら書いていくことによって1回目の受講時に比べてだいぶ覚えやすくなったと思います。

2点目ですが、実機に触れてみることです。
実は私は202合格まで業務以外ではあまり実機は使ってませんでしたが、仮想環境等にnginx等試験で出題されるソフトウェアをインストールして触ってみることでより理解が深まるはずです。
不明点をmanコマンドやソフトウェアの公式ドキュメント等で確認することで試験対策だけではなく今後の業務で利用する機会が発生した際に絶対に役立つはずですので、大事なことだと思います。

3点目に試験対策の問題集に、Ping-t以外の問題集も併用することです。
人によってはPing-tだけでも合格出来る方もいらっしゃるようですが、Ping-tだけだと段々と問題の回答そのものを覚えてしまうため、異なる問題集も併用した方がいいです。
おすすめはスピードマスターという書籍で、問題や回答だけではなく、解説もしっかりと掲載されているのでPing-tと同様に問題を解くのと知識を深めるという２つの学習が可能です。
[Amazon商品リンク](https://www.amazon.co.jp/Linux%E6%95%99%E7%A7%91%E6%9B%B8-LinuC%E3%83%AC%E3%83%99%E3%83%AB2-%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E5%95%8F%E9%A1%8C%E9%9B%86-Version-10-0%E5%AF%BE%E5%BF%9C/dp/4798167975/ref=sr_1_2?crid=3P5HKG1U2FUNB&keywords=linux+%E3%83%AC%E3%83%99%E3%83%AB2&qid=1694345330&sprefix=linuc%2Caps%2C165&sr=8-2)

4点目は、これは正直あまりオススメできないですが問題集を自分で作成して解いていくという方法です。
というのも、Ping-tだけだと出題される問題数に限界があるため、また少々難解なオプション等の暗記に利用するため私は自分で問題集を作ってしまいました。
なぜこれがあまりオススメできないかと言いますと、たしかに自分で作成することによって作成時に覚えづらかった内容を覚えやすくはなりましたが、問題集の作成自体にすごく時間をかけてしまったため、その時間を学習に充てるべきでは？と自問自答してしまいました・・・
結果的に問題集も約にはたちましたが。

私はこれでようやく202の合格が叶い、Level2の認定ができました。
202受講を目指す方のお役に立てれば幸いです。
フロントエンド開発の変遷② jQueryの全盛期と人気の低下

フロントエンド開発の変遷第2回です。今回はjQueryについてまとめました。
第1回はこちら

https://qiita.com/yusuke2310/items/2bbcee4c856d5dd628e3


### jQueryの全盛期
:::note info
何があった？？
2014年ごろの第2時ブラウザ戦争により、各ブラウザの挙動に対応した上で、開発をする必要があった。

そんな時に、各ブラウザの違いを吸収してくれるjQueryが登場し、フロントエンドエンジニアがjQueyを無条件に組み込むほど普及した。
:::
Ajaxによる非同期でHTTP通信が実現されてから、Webアプリケーションの進化が続きます。従来よりも多機能なアプリケーションとしてRIA（リッチインターネットアプリケーション）と称され、クライアントサイドの実装としてAjaxや高度なDOM操作が求められました。

DOM（Document Object Model）はブラウザがHTMLを解釈した際に生成されるツリー構造のオブジェクトモデルです。ブラウザには、DOMの各ノードを操作するためのAPIが提供されており、JavaScriptを用いて操作し、動的なUIの変更が可能になる。

JavaScriptによる大規模開発のニーズは日に日に増していき、開発の現場ではフロントエンジニアとして、JavaScriptでアプリケーション開発する担当者を専任で設ける企業も増えてきました。

２014年ごろにMozilla、Microsoft、Apple、Googleなどの大手ブラウザベンダーによる最新のWeb標準実装及び動作速度の高速化の競争が活発になります。第2次ブラウザ戦争と呼ばれ、各ブラウザベンダーが独自の実装を続け、JavaScriptエンジンやレンダリングエンジンの挙動に多くの差異が生まれてしまいました。

各ベンダーが提供するブラウザの性能や機能が進化することは良いことですが、一般ユーザーが利用する端末側のブラウザの多様化に伴い、フロントエンドエンジニアの開発で対応しなければならない工数が多くなりました。Webアプリケーション開発時に、各ブラウザの挙動を理解して、テストと修正をする工数にかなりの時間を割くようになりました。

そこで当時ブラウザ間の挙動の違いをある程度吸収してコードを書くことができるJavaScriptのライブラリ、jQueryが流行します。

例えば、JavaScriptでAjaxやDOMのイベント操作などの長いコードを書く際に、クロスブラウザ互換を考慮し条件分岐を多用するおまじないのような長いコードを書く必要がありました。そのようなケースもjQueryを利用することで、簡潔に記述可能になりました。

jQueryの画期的だったポイント
* クロスブラウザ互換を実現
* DOM操作を簡単にできる
* アニメーションを簡単に実装できる
* jQuery UIなど周辺ライブラリが充実している

### jQuery人気の低下
jQuery全盛期以降もますますフロントエンドに求められる要件は複雑化していきます。その流れの中で、次第にjQueryは影を潜めていきました。
なぜ大きく普及したjQueryが使われなくなったのか、以下のような背景がありました。

*　グローバルスコープを汚染する
*　DOM操作の実装が複雑化になりやすい
*　ルーティングなど、複数ページのWebアプリケーションを実装する仕組みがない
*　ブラウザ間の挙動の違いが以前よりも顕著ではなくなり、ブラウザ互換コードが不要になってきた（ブラウザの標準化）

jQueryを用いると大規模アプリケーション開発においてJavaScriptのグローバルスコープが汚染されるという点が問題視されました。これは、モダンなフロントエンド開発の軸となる、SPAやコンポーネント指向といった考え方と相性が良くないです。

SPAの登場に続く、、、

今回も以下の書籍を参考にしました。
書籍「TypeScriptとReact/Next.jsで作る実践Webアプリケーション開発」

https://www.amazon.co.jp/TypeScript%E3%81%A8React-Next-js%E3%81%A7%E3%81%A4%E3%81%8F%E3%82%8B%E5%AE%9F%E8%B7%B5Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-%E6%89%8B%E5%B3%B6-%E6%8B%93%E4%B9%9F/dp/4297129167
2**(3-2*x)-3*2**(1-x)+1>0「2023 福島大学後期 共生システム理工学類【2】(4)」をChatGPTとWolframAlphaとsympyでやってみたい。

(旧タイトル2023/09/14)
2**(3-2*x)-3*2**(1-x)+1>0「2023 福島大学後期 システム理工学類【2】(4)」をChatGPTとWolframAlphaとsympyでやってみたい。

・図(グラフ)を多く取り入れわかりやすく? してみました。

オリジナル 

https://kamelink.com/blog/2023/09/09/2-1-23-hukusimadai-kou-rikou-2-4/

上と同じです。大学入試数学問題集成 様＞共生システム理工学類 【２】(4)テキスト

https://mathexamtest.web.fc2.com/2023/202310141/2023101410200mj.html#top-0208


公式HP
https://nyushi.adb.fukushima-u.ac.jp/problem/Files/2023/05/R5_riko_shokuno_kouki2.pdf#pge=6
＜過去問題（学類入学試験）
https://nyushi.adb.fukushima-u.ac.jp/kakomon_gaku.html



# ChatGPT-3.5で(xxx できませんでした。xxx) 
入力文
```
不等式
2**(3-2*x)-3*2**(1-x)+1>0
をみたすxの範囲を求めなさい．
```
???＞したがって、与えられた不等式を満たすxの範囲は、x > log2(3)/2 です。

# WolframAlphaで
できました。
グラフがでません。数直線がでます。

https://www.wolframalpha.com/input?i=2**%283-2*x%29-3*2**%281-x%29%2B1%3E0&lang=ja

グラフがでます。

https://www.wolframalpha.com/input?i=2**%283-2*x%29-3*2**%281-x%29%2B1%3D0&lang=ja

# sympyで(数学入試問題 様の方法を参考に)
・グラフを作図しました。
・同値変形です。
・？？？ eq1で、値域、定義域が、必要かどうかわかりませんでした。
```python
from sympy import *
var('x,t',real=True)
eq1=Eq( t,1/2**x )
print("#1",minimum(eq1.rhs,x,Interval(-oo,oo)),
           maximum(eq1.rhs,x,Interval(-oo,oo)) )
(st,en)=(-5,5)
gt1=Gt( 2**(3-2*x)-3*2**(1-x)+1  ,0 )          ;print("#1",gt1)
gt2=Gt( gt1.lhs.subs({1/2**x:t} ),0 )          ;print("#2",gt2)
ans=solve(gt2)                                 ;print("#3",ans)
ans=solve([
          ans.args[0].subs({eq1.lhs:eq1.rhs}),
          ans.args[1].subs({eq1.lhs:eq1.rhs})
          ],x)                                 ;print("#4",ans)
# 
plot(eq1.rhs,
     (x,st,en),
     xlim=(st,en),ylim=(st,en),
     aspect_ratio=(1.0,1.0)
    )
plot(gt1.lhs,
     (x,st,en),
     xlim=(st,en),ylim=(st,en),
     aspect_ratio=(1.0,1.0)
    )
plot((8*t**2 - 6*t + 1),
     (t,st,en),
     xlim=(st,en),ylim=(st,en),
     aspect_ratio=(1.0,1.0)
    )
#
#1 0 oo
#1 -3*2**(1 - x) + 2**(3 - 2*x) + 1 > 0
#2 8*t**2 - 6*t + 1 > 0
#3 (1/2 < t) | (t < 1/4)
#4 (2 < x) & (x < 1)
```
1/2＊＊x
![0png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/f85030dd-2cd6-5b8c-2076-b2e146c3052e.png)
与式　-3＊2＊＊(1 - x) + 2＊＊(3 - 2＊x) + 1 
![1png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/c87e35ac-168d-7100-9c7f-f5340b177aa8.png)
8＊t＊＊2 - 6＊t + 1 > 0
![2png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/e83198a1-06b8-28f5-9d12-d8fea3ba17b0.png)

# sympyで(不等式をsolveで)
・グラフを作図を省略しました。
・以下の方が楽でした。
```python
from sympy import *
var('x',real=True)
print("#",solve( Gt( 2**(3-2*x)-3*2**(1-x)+1,0 ) ).simplify() )
# (x > 2) | (x < 1)
```
# sympyの実行環境
①私の環境は,pycharmです。
②よく聞くのは、Jupyterです。
③web上で、上記のソースを「SymPy Live shell」に、コピー貼り付けでもできました。
黒背景の右上に、マウスを移動すると、コピーマークが発生します。
???　タブレット環境で、コピー貼り付けが実行できませんでした。???

https://live.sympy.org/

# 参考

以下、いつもの?おすすめです。

https://qiita.com/mrrclb48z/items/75904cdc6e84ecef4d03#%E5%8F%82%E8%80%83wolframalpha-%E9%96%8B%E7%99%BA%E7%89%A9%E8%AA%9E


https://qiita.com/mrrclb48z/items/767bfd0f085cceaa12a3
転職ドラフトの光と闇

# はじめに
こちらの記事は[転職ドラフト体験談投稿キャンペーン](https://job-draft.jp/articles/251)に参加しています
転職ドラフト：https://job-draft.jp/
友達紹介コード`LAGN`

**良かったこと、悪かったことの体験談としての感想** を述べたものになります。

個人の特定対策として、記載の数字は、実際から少し変更しています。
**年収の上がり幅**　は変更していません。
あくまで個人の特定の避けるためです。ご了承ください。

# 転職ドラフトの光
#### 1. 年収が大幅にアップした
**400万円 → 550万円**

結果として15社ほど面談に進み、5社から内定を頂きました。
内定を承諾した企業では、最終的に　**年収が150万円アップ**　に成功しました。

転職ドラフトでなければ、ここまでの大幅アップはないと思っています。
この年収アップが、最大の特徴だと思っています。

今までより **毎月10万以上** も入金が増え、生活水準が上がりました。
転職ドラフトのサービスには、本当に感謝しています。

#### 2. 未知だった良い企業を知ることができた
転職ドラフトは、企業からのオファーを待つサービスです。
ベンチャー企業やBtoBのサービスを展開している会社など、
自分が知らなかった会社との巡り合わせが多くありました。
面談を通して、とても良い会社だと思ったのですが
接点がなく自分から探していたら、まず辿り着かなかったと思います。

#### 3. 自分のペースで進められる
担当者などがいないため、良くも悪くも自分のペースで進められます。
実際に私は、転職ドラフトに初回参加したあと、
転職の軸などが弱いと思ったので６ヶ月の間、転職活動を休止しました。
また、仕事をしながらの転職活動だったため、仕事が忙しいときも休止したりなど
誰かに急かされることがないのも、準備や企業を吟味する時間があり良かったです。

# 転職ドラフトの闇
※転職ドラフトというより、転職活動それ自体の闇も含んでいます。
※何かを批判するような意図はなく、また全ての人や企業に当てはまるとも思いません。
※あくまで個人の体験からくる感想になります。

#### 1. カジュアル面談（選考なし）が怪しい企業がある
オファーが来た企業に対して、カジュアル面談（選考なし） という面談があります。
転職ドラフトの説明にも、「結果通知はありません」という文言がありますが ... 

※勿論ルールを守って、選考要素抜きで面談している企業もたくさんありますが ...

個人的な感想ですが、「 これは選考じゃないか？　」 と思う企業がありました。
実際に体験として
`「該当のポジションが埋まってしまい、募集を締め切りました。」`
のような文言でお祈りされました。
もちろん、本当に自分が該当するポジションが埋まった可能性もありますし、
実際にそういったこともあると思います。
ただ、次の月も20人ほどにオファーを送っていたのですが、
自分の技術スタックと似たような人にオファーを送っていたので、ホンマか？となりました。
（どの企業が、どんな技術スタックを持っている人にオファーを送っているか、確認できる機能があります）

あくまで、自分の推測ですが ...
嘘も方便といいますか、選考の断り文句だと感じました。

カジュアル面談の前に
`志望理由、質問や気になること、その会社で自分が働けそうなイメージ`
など、しっかりと準備しておくことをお勧めします。

#### 2. 年収交渉について、駆け引きがある
年収の大幅アップが魅力的な転職ドラフトですが、その点で駆け引きがあるように感じました。
転職ドラフトに参加される方は、これを参考に悔いのない戦いをして頂けると幸いです。

駆け引きについて、実際の体験を元に説明します。
3社から内定をもらったときに、各社からの最初の提示年収は以下でした。

A社 : 550万円
B社 : 500万円
C社 : 600万円

その後
1. 最初に、A社から内定後のオファー面談にて **550万円** を確約されました。

2. 次にB社にて
どんなオファーをもらっているか聞かれたので
正直にA社から550万円のオファーを頂いていると話しました。
その後、B社からオファー面談にて、50万円アップの **550万** を提示されました。

3. 最後にC社にて
どんなオファーをもらっているか聞かれたので
同じようにA社から550万円のオファーを頂いていると話しました。
その後、C社からのオファー面談にて、50万円ダウンの **550万** を提示されました。

最終的な確約年収は以下になりました。

A社 : 550万円
B社 : 550万円
C社 : 550万円

果たして、3社が一致したのは偶然でしょうか？

もしB・C社との面談で、A社から600万円を提示されたと話したら
B・C社からは600万円のオファーを頂けたような気がしてなりません。

転職ドラフトでは、**提示年収から9割までダウンしていいルール** になっています。
つまり、600万円でオファーがきても、540万円までダウンできます。

提示年収を盛るのはアリか、嘘をつくことにならないか
私は、いつも誠実な人でありたいと思っています

**正直者はバカを見るのでしょうか ...**


#### 3. 他の選考と同じように、しっかりとした準備が必要
転職ドラフトでは、自分に興味をもった企業からオファーが届きます。
自分に興味があるから ... と慢心して面談対策をしなければ **普通に落ちます。**
志望理由なども聞かれますし、上手く答えれないと厳しいです。
あくまで **書類選考をスキップできる** だけのような気持ちで
普段と変わらず、しっかりと転職活動の準備をしましょう。

余談ですが、転職活動のブログをみていて
東大出身で大企業に勤めてるような人が、GAFAに転職する際に
競技プログラミングや模擬面接、システム設計について勉強し
半年間も準備して活動したことを知り驚きました。
すごい経歴や技術を持っている人でも、面接対策は必要なのに
なぜ自分には不要だと思っていたのか ... しっかり準備しましょう。


#### 4. 金融業界がなんか怪しい
ざっくりとした個人の感想です ...
1 でカジュアル面談からお祈りされた企業は、金融業界の企業になるのですが
他のユーザーの一覧をみても、`アダルトと金融業界`は避けている人が多いイメージです。
（一部の参加者について、どんな指向で企業を待っているか確認できる機能があります）

アダルトはまだ理解できますが、金融業界はなぜでしょうか。
避けている理由は人それぞれでしょうが、自分の体験からも、なんか怪しい気がします。

# 最後に
長々と書きましたが、転職ドラフトは本当に良いサービスだと思います。
年収が上がったことで、マイホームの購入や海外旅行など、できることが広がりました。
巡り会えた企業についても、ホワイト企業を超えるような、真っ白な良い企業だと思っています。

これから転職ドラフトを利用する方は、紹介コードを使うとお互いに良いことがあるようです。
友達紹介コード`LAGN`

皆様の転職活動に、眩いばかりの **光** があることを祈っています。
Thymeleaf + Springboot + Mybatis + MySQL + VSCodeー環境準備

# 1\. MySQL構築
## 1.1\. Install
参照サイト：[MySQLのインストール手順 | 分かりやすく図解で説明](https://medium-company.com/mysql%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%89%8B%E9%A0%86/#MySQL "MySQLのインストール手順 | 分かりやすく図解で説明")

## 1.2\. Create Database
### 1.2.1\. MySQL Workbench設定
#### 1.2.1.1\. 接続コネクション追加
<strong>MySQL Workbenchを開く、本ページの「MySQL Connection」右「⊕」をクリックして、下記設定情報を設定して、接続コネクションを追加する</strong>
<table>
  <caption>接続コネクション</caption>
  <thead>
    <tr>
      <th>No.</th> <th>属性</th> <th>値</th>
    </tr>
  </thead>
  <tr>
    <td>1</td> <td> Connection Name </td> <td>localhost</td>
  </tr>
  </tr>
  <tr>
    <td>2</td> <td> Connection Method </td> <td>standard(TCP/IP)</td>
  </tr>
  <tr>
    <td>3</td> <td> Hostname </td> <td>localhost</td>
  </tr>
  <tr>
    <td>4</td> <td> Port </td> <td>3306</td>
  </tr>
  <tr>
    <td>5</td> <td> Username </td> <td>root</td>
  </tr>
  <tr>
    <td>6</td> <td> Password※ </td> <td>「1.1. Install」で設定したパスワード</td>
  </tr>
</table>
<strong><font color="Red">※ 「Password」右の「Store in Vault」をクリックして、パスワードを入力する。</font></strong>

#### 1.2.1.2\. 業務データベース作成
SQLtabを開いて、下記コマンドを実行して、データベースを作る
```SQL:carete database
CREATE DATABASE training;
```


# 2\. JDK Install
ダウンロードサイト： [Download x64 Compressed Archive](https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.zip "x64 Compressed Archive")
※ダウンロードしたら、作業フォルダに解凍する
cmdを起動して、JDKの解凍ディレクトリに利用して、Javaのバージョンを確認する。
コマンド例：
```cmd:
cd JDKの解凍ディレクトリ
```
```cmd:
java.exe -version
```

# 3\. IDE構築
## 3.1\. IDE Installer
ダウンロードサイト：[Visual Studio Code をダウンロードする](https://code.visualstudio.com/download "Visual Studio Code をダウンロードする")

### 3.1.1\. Extensions

#### 3.1.1.1\. How to Install
参照サイト：[Install Visual Studio Code extensions](https://code.visualstudio.com/learn/get-started/extensions "Install Visual Studio Code extensions")

#### 3.1.1.2\. 必要なExtensions
<dl>
 <dt>Extension Pack for Java</dt>
 <dd>Popular extensions for Java development that provides Java IntelliSense, debugging, testing, Maven/Gradle support, project management and more</dd>
 <dt>Spring Boot Extension Pack</dt>
 <dd>A collection of extensions for developing Spring Boot applications</dd>
</dl>

## 3.2\. IDE Setting
### 3.2.1\. 実行環境のJDK設定
<dt>「Ctrl + ,」を押して、「Settings」を開く。</dt>

<dt>実行環境のJDKを設定する</dt>
<dd>「Settings」の「Search settings」欄に「jdk」を入力して、「Java > Configuration: Runtimes」下の「Edit in settings.json」リンクをクリックして、下記設置を「java.configuration.runtimes」後ろの[]に貼り付ける</dd>

```json:settings.json
        {
            "name": "JavaSE-17",
            "path": "JDKの解凍ディレクトリ※",
            "default": true
        }
```
※JDKの解凍ディレクトリは<strong>「2. JDK Install」</strong>の時、JDKの解凍ディレクトリのフルパス（<font color="Red"><strong>パスの\を/に変換する</strong></font>）。
【Android】Mathクラスについてpart１【Kotlin】

# はじめに
今回はabsメソッドという　絶対値を返すメソッドに出会いそこからMathクラスを見つけたので、それについて特に使いそうなものをまとめておく為に記事を書きます。

# 説明

# abs()
```
abs(-1)   // 1
```
abs()は Int,Long,Float,Double  の好きな型で絶対値を返します。

# floor()
```
floor(1.111)   // 1.0
```
小数点以下を切り捨て



# ceil()
```
ceil(1.111)   // 2.0
```
小数点以下を切り上げ

# round()

```
round(11.4)   // 11
round(11.5)   // 12

round(12.4)   // 12
round(12.5)   // 12

round(12.６)   // 13
```
round() は　小数点以下を四捨五入と勘違いしがちですが、厳密には違うらしく整数の整数の一の位が奇数か偶数かによって小数点以下を四捨五入するか切り捨てるかが変わるみたいです。
整数の一の位が奇数の場合 ４以下を切り捨て、５以上を切り上げ（四捨五入）
整数の一の位が偶数の場合 5以下を切り捨て、６以上を切り上げ

この方法を 「銀行丸め」 「最近接丸め」 「JIS丸め」などというらしく、詳しくはそれぞれ調べてもらえればと思いうます。

# roundToInt()

```
10.4.roundToInt()   // 10
10.5.roundToInt() //   11
```
四捨五入して Intにする

# 10.4.roundToLong()

```
10.4.roundToLong() //   10
10.5.roundToLong() //   11
```
四捨五入して Longにする



# 参考

https://developer.android.com/reference/kotlin/java/lang/Math


https://blog.interfamilia.co.jp/2022/12/01/Kotlin%E3%81%AE%E5%9B%9B%E6%8D%A8%E4%BA%94%E5%85%A5%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/
「sympyの|」を調べた。

# DOC
atoms(*types)
Returns the atoms that form the current object.

https://docs.sympy.org/latest/modules/core.html#sympy.core.basic.Basic.atoms

# |　と　atoms()

```python
from sympy import *
var('y,x',real=True)
y= (x > 2) | (x < 1)
print("#",y)
print("#",y.args[0])
print("#",y.args[1])
print("#",y.atoms())
# (x > 2) | (x < 1)
# x > 2
# x < 1
# {1, 2, x}
```
OpenSiv3DとRAW文字列

# はじめに
OpenSiv3Dでプログラムを書く際、特殊な文字やシンボルを扱うケースは多いです。特にJSONのようなデータ形式を扱うとき、エスケープシーケンスが多く必要になります。このような状況でRAW文字列が非常に有用です。

# RAW文字列の基本
RAW文字列はC++11以降でサポートされており、エスケープシーケンスを気にすることなく、文字列内で特殊な文字をそのまま使えます。

- 通常の文字列: `auto str = U"Hello \\ World";`
- RAW文字列: `auto str = UR"(Hello \ World)";`

# OpenSiv3DとRAW文字列のシナジー

1. **可読性の向上**: RAW文字列を使うことで、コードが直感的に読みやすくなります。
2. **修正が容易**: RAW文字列内でデータ構造を変更する際、エスケープシーケンスを追加や削除する手間が省けます。

# 実用例

1. **ファイルパス**
    ```cpp
    auto path = UR"(C:\Users\example\file.txt)";
    ```
   
2. **正規表現**
    ```cpp
    auto regex = UR"(\\d{2}-\\d{2}-\\d{4})";
    ```
   
3. **JSONデータ**
    ```cpp
    JSON json = JSON::Parse(UR"({"key":[5,6,7,8,9]})");
    ```
   
4. **SQLクエリ**
    ```cpp
    auto query = UR"(SELECT * FROM users WHERE name="John Doe")";
    ```

# まとめ
OpenSiv3DのプログラミングでRAW文字列を使うことは、特にデータ処理や特殊な文字が多い場合に有用です。JSONデータの操作が直感的でエラーが少なく、後の保守も容易になります。この機能を活用して、より効率的なコーディングを目指しましょう。

# 参考文献
https://learn.microsoft.com/ja-jp/cpp/cpp/string-and-character-literals-cpp?view=msvc-170
【備忘録】Raspberry PiにKali Linuxをインストール

## 使用したもの
- Raspberry Pi 4 Model B
- SDカード(64GB)
- SDカードリーダー
- [Rufus](https://rufus.ie/ja/) 
    > Rufus (ルーファス) とは、起動可能なUSBフラッシュドライブ（USBメモリなど）を作成したり、フォーマットをするためのソフトウェアです。

## インストール手順
### Kali Linuxのダウンロード
1. [公式ダウンロードページ](https://www.kali.org/get-kali/#kali-platforms)から、Kali Linuxの64bit版をダウンロード
        ![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1677523/e1f275b6-3adb-523c-9348-763b8933dd4f.png)

### ダウンロードしたイメージファイルをSDカードに書き込む
:::note warn
警告
SDカードのデータは初期化されるので注意
:::

1. Rufusを起動し、接続したSDカードとイメージファイルを選択する
1. 「スタート」を押下
    ![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1677523/d68615a3-d63a-8e24-92c3-bdd3afaa47cb.png)
1. 書き込み完了
    ![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1677523/66d3ca54-ffa5-8a2b-7b2e-81847b54e256.png)

### SDカードをラズパイに挿入し、電源を入れる
1. 正常に起動できると、ログイン画面が表示される

### ログイン情報
- 初期ユーザ：kali
- 初期パスワード：kali
- 
---
2023.09.10 初期設定は別記事に投稿予定
[SwiftUI] LazyVGridで一番下までスクロールしたら追加読み込みする

# 概要
![ecom-pagination-load-more-infinite-scroll.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213311/de2a13c2-41a9-c3da-3bfd-04840b99d15e.jpeg)
このように下にスクロールしていくとインジケーターが表示され、追加データが読み込まれるUIを実現したい。

しかし、ScrollViewやLazyVGridには一番下に到達した事を検知するイベントなどは用意されていません。
ScrollViewはGeometryReaderを駆使して現在のスクロール位置を検知できるようで、
それと表示行数分のgridの高さを計算すればなんとか一番下に到達したということはできそうですがスマートではないかなと思って良い方法を探りました。

# 方法
Sectionを使用する。
https://developer.apple.com/documentation/swiftui/section

Viewにヘッダーフッターを追加できるものだそうです。
今回はLazyVGridのフッターとしてProgressViewを追加し、
そのフッターが表示されたら追加読み込みを行います。

```

import SwiftUI

struct ContentView: View {
    
    /// 表示データ
    @State var dataList: [Int] = [Int](1...20)

    var body: some View {
         ScrollView {
             LazyVGrid(columns: Array(repeating: .init(.flexible()), count: 2)) {
                 
                 Section(footer: ProgressView()
                    .progressViewStyle(CircularProgressViewStyle())
                    .frame(height: 150)
                    .onAppear {
                        DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
                            dataList.append(contentsOf: [Int](dataList.count + 1...dataList.count + 20))
                        }
                    }
                 ) {
                     ForEach(dataList, id: \.self) { data in
                         Text(data.description)
                             .frame(width: 150, height: 150)
                             .background(Color.green)
                     }
                 }
             }
         }
    }
}
```

![15grgr.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213311/7daea43d-bcf8-9349-1bf5-64b3b1a0e8b2.gif)

実現できました:smiley:
LazyVStackでも同じことができると思います。
【Swift】SPMのマルチモジュールでカスタムフォントを読み込んで使いたい

# はじめに
マルチモジュール構成の際にカスタムフォントを使用したい時にやり方がわからなかったので記録しておきます

https://qiita.com/SNQ-2001/items/6531526ab3aa51855247

# 実装
フォルダ内にフォントファイルを追加します
![スクリーンショット 2023-09-10 18.14.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/99399899-6e9a-8e92-cd73-40d47e110a50.png)

`Package.swift`の`resources`に追加します
```Package.swift
import PackageDescription

let package = Package(
    name: "Package",
    defaultLocalization: "en",
    platforms: [.iOS(.v16)],
    products: [
        // ...
    ],
    dependencies: [
        // ...
    ],
    targets: [
        // ...
        .target(name: "AppFeature", dependencies: [
            "Resource" // ここで使いたいので、ここに追加
        ]),
        .target(name: "Resource", dependencies: [

        ], resources: [
            // ...
            .copy("DSEG7Modern-BoldItalic.ttf"), // ここに追加
        ]),
        // ...
    ]
)
```

Reourceの中にFontsを作成します
```Fonts.swift
import SwiftUI

public struct Fonts {
    public static func register() {
        guard let fontURL = Bundle.module.url(forResource: "DSEG7Modern-BoldItalic", withExtension: "ttf"),
              let fontDataProvider = CGDataProvider(url: fontURL as CFURL),
              let font = CGFont(fontDataProvider) else {
            fatalError("Couldn't create font from data")
        }
        
        var error: Unmanaged<CFError>?
        
        CTFontManagerRegisterGraphicsFont(font, &error)
    }
}
```

# 登録
```swift
import UIKit
import Resource // フォントを追加したモジュールをインポート

final class AppDelegate: NSObject, UIApplicationDelegate {
    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
    ) -> Bool {
        Fonts.register() // ここでフォントを登録
        return true
    }
}
```

# 使い方
### SwiftUI
```swift
.font(.custom("DSEG7Modern-BoldItalic", size: 10))
```

### UIKit
```swift
UIFont(name: "DSEG7Modern-BoldItalic", size: 10)
```

# おわり
使う前にフォントを登録しないといけないっぽいです
Vue.js emitについて理解する

## Vue.jsの`emit`とは何か？

親コンポーネントから子コンポーネントに対して値を渡すpropsに対し、
emitは子コンポーネントでボタンが押されたり、テキストボックスの変更などが発生したときに親コンポーネントに伝えることができる。
また、子コンポーネントから親コンポーネントにデータを渡したいときにも使われる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301963/aaf21c5d-44ef-7472-bcde-016855655698.png)
## なぜemitが必要なのか
→**親コンポーネントから渡されたpropsは子コンポーネントの中では読み取り専用であり、変更することができないから。**

例えば、子コンポーネントの以下のコードでsetNewCount関数が発火されるとエラーが起こる。

```jsx
const props = defineProps({
    count: Number
})

const setNewCount = () => {
		// 読み取り専用のcountを更新しに行くのでエラーが起こる。
		props.count++
}
```
これは、Vue.jsの設計上の仕様である。親→子への単一方向のデータ渡ししかできないようにすることで、データフローの複雑化を防止してシンプルになるようにしている。

では、親コンポーネントから渡されたpropsを子コンポーネント内のイベントで更新するにはどうすればいいのか。それを解決するのがemitである。

## emitを使ってみよう！

今回はemitを使って、子コンポーネント内のボタンを押すと、親コンポーネントのリアクティブ変数「count」が更新されるサンプルコードを作成しました。

- 親コンポーネント

```vue.js
<script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

// カウントを管理するリアクティブ変数
const count = ref(0);

// 子コンポーネントからのイベントをハンドリングするメソッド
const setNewCount = (newCount) => {
    count.value = newCount;
};

</script>
<template>
    <div>
        <p>カウント: {{ count }}</p>
        <ChildComponent :count="count" @set:newCount="setNewCount" />
    </div>
</template>
```

- 子コンポーネント
```vue.js
<script setup>
import { ref } from 'vue';

// 親コンポーネントから渡されるカウント
const props = defineProps({
    count: Number
})
// 子コンポーネントのカウントを管理するリアクティブ変数
const childCount = ref(props.count);


const emit = defineEmits(['set:newCount'])

// 子コンポーネントのカウントを増やすメソッド
const setNewCount = () => {
    childCount.value++;
    // 親コンポーネントにイベントを発火し、新しいカウントを通知
    emit('set:newCount', childCount.value);
};

</script>
<template>
    <div>
        <p>子コンポーネントのカウント: {{ count }}</p>
        <button @click="setNewCount">子コンポーネントのカウントを増やす</button>
    </div>
</template>
```
## 参考記事
- [[Vue3/TypeScript対応] emitで理解するVue.jsの本質](https://zenn.dev/rio_dev/articles/bc9dd92bfebe95)
- [【Vue.js】$emitメソッドの正体　コンポーネント(子→親)の間のデータ受け渡しでやってる事](https://qiita.com/yuta-katayama-23/items/5e0396df42a95ef96239)
Pythonを使って特定パターンの文字列が含まれるかを正規表現で判定する

正規表現で判定するために、re.findall()を使用する。

re.findall()はマッチするすべての部分を文字列のリストとして返す。
第一引数に正規表現パターンの文字列、第二引数に対象の文字列を指定する。
　import re
　re.findall(r'\d+', s)

\dは数字、+は直前のパターンを1回以上繰り返すことを表している。
\d+は連続した1文字以上の数字にマッチする。
rを付けてエスケープシーケンスを無効化するraw文字列を使う。

.は改行以外の任意の1文字、*は直前のパターンの0回以上の繰り返し。
例えば、a.*bはaで始まってbで終わる文字列にマッチする。

+は直前のパターンの1回以上の繰り返し。
a.+bの場合、abにはマッチしない。

?は直前のパターンが0回か1回。
a.?bの場合、abおよびaとbの間に1文字だけが存在している場合にのみマッチ

*, +, ?は貪欲（greedy）マッチで、できるだけ長いテキストを返す。
*?, +?, ??とすると、非貪欲（non-greedy）、最小（minimal）マッチとなり、できるだけ短いテキストを返す。

[]で文字列を囲むと、その中の文字のいずれか1文字にマッチする。*, +, ?などと組み合わせることも可能。

先頭から始まる文字列のみを抽出したい場合はメタ文字^（先頭にマッチ）、または、末尾で終わる文字列のみを抽出したい場合は $（末尾にマッチ）を使う。

複数のパターンのいずれかにマッチする部分を抽出したい場合は|を使う。

デフォルトでは大文字と小文字を区別して処理される。
引数flagsにre.IGNORECASEを指定すると、大文字と小文字が区別されなくなる。
統計検定2級 合格体験記 + チートシート

# はじめに
統計検定2級に合格しましたので、体験記＋チートシートの共有です。

# チートシート

チートシート作りました。印刷するなりして使ってください。
（こだわりポイントとしては、区間推定や検定は文字式だけだと抽象的で分かりづらいと考え、各手法で2つほど事例を載せています。）

https://speakerdeck.com/ofutonton/tong-ji-jian-ding-2ji-titosito-gong-shi-ji
<script async class="speakerdeck-embed" data-id="4796aa66a6ce4bb6bed7796395ca277d" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>

# 受けようと思った背景
現在の仕事でデータを使うことがあり、業務に生きるのではないと思い受験を決意。

# 勉強方法
勉強は2か月くらいかけました。（仕事が忙しくなったりして勉強をサボっていた時期を除く。。。）
以下3フェーズからなります。
**PHASE1. まずは統計の"勘所"を掴む（3週間くらい）
PHASE2. 何が試験で問われるかを把握し、必要な知識+解法をインプットする（1か月くらい）
PHASE3. 本番演習をする （1日）**
### PHASE1. まずは統計の"勘所"を掴む（3週間くらい）
結局これが一番大事なのかなと思います。
何冊か読みましたが、おすすめの本を以下で紹介します。
（上から順に読むことをおすすめします）
##### ①：完全独習　統計学入門（小島 寛之、ダイヤモンド社）
最初に一歩に最適。細かい手法は省略されている（が、統計検定2級の要所は抑えている）ので混乱しないですし心も折れない。まさに"勘所"を掴むことができる。最高。
https://amzn.asia/d/hRi44o7
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261941/45aa5178-4f0e-0433-40d1-c8b755ed672c.png)

##### ②：基礎から学ぶ統計学（中原 治、羊土社）
二歩目に最適。細かい手法について例や大量の図表を交えて丁寧に説明されている。ある程度統計が分かっている人は1冊目は不要でこの本からでも大丈夫かも。最高。
https://amzn.asia/d/ehKmkIT
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261941/e6dd7eb7-9612-b14d-f1c5-8820c7f03fd2.png)

##### ③：統計検定を理解せずに使っている人のために（池田 郁男、J-STAGE）
これは読まなくても良いかも。かなり実務に近い粒度でまとめてくれていて、統計に対する解像度が上がる。最高。

Ⅰ~Ⅲがある。
Ⅰ：https://www.jstage.jst.go.jp/article/kagakutoseibutsu/57/8/57_570808/_article/-char/ja
Ⅱ：https://www.jstage.jst.go.jp/article/kagakutoseibutsu/57/9/57_570906/_article/-char/ja
Ⅲ：https://www.jstage.jst.go.jp/article/kagakutoseibutsu/57/10/57_571007/_article/-char/ja
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261941/cb3564dc-d34e-7d2b-1ed7-79d9542e0dd1.png)


### PHASE2. 何が試験で問われるかを把握し、必要な知識+解法をインプットする（1か月くらい）
メインの箇所。"勘所"を掴んだところで、実際の細かい解法を理解し、問題を解けるようにします。
以下の3stepを永遠にやっていました。

**①公式問題集を1問ずつ解く
↓
②分からない箇所は前述の本を見てみる＋ググる
↓
③チートシートにまとめる**

##### ①：公式問題集を解く
公式問題集というか、過去問です。
公式問題集は5回分の試験がセットになっているが、1回分は本番演習用に取っておきました。なので、4回分の試験をこのフェーズでは解いたことになります。
1問解いて分からない箇所にぶち当たったら、次のステップ（②分からない箇所は前述の本を見てみる＋ググる）に進みます。
https://amzn.asia/d/3HnBRmP
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261941/a8ca25ce-49be-1555-54a7-2c3ddff9adb5.png)

※今はCBT対応版があるみたいですね。
それもでいいかもです。
https://amzn.asia/d/fLVRbu4

##### ②分からない箇所は前述の本を見てみる or ググる
解けなかった問題、分からない箇所が出てきたら、前述の本なりGoogleで調べます。
なんやかんやで「統計WEB ~統計学の時間~」にたどり着きがち。
かなり統計検定2級に寄った内容で、しかも例題があって定着しやすいです。

https://bellcurve.jp/statistics/course/

##### ③チートシートにまとめる
この作業が個人的には定着という意味ですごくよかったです。
丁寧にまとめると頭に残りますし、何よりまとめるには一定の理解が必要なので「分かった気になって終わらない」のがよかったです。
※作成したチートシートは本ページの最初にあります。


### PHASE3. 本番演習をする （1日）
前PHASEで取っておいた本番演習用の1回分を解きました。
（本番で時間配分ミスって時間がなかったので、ここで時間配分の練習もした方が良いと思います。）

# 受験時の感想
- 時間がなかった。
→時間配分の練習をするべし。
- CBT方式で受験したが、公式問題集の過去問と大きく形式は変わっていない印象。
→過去問を信じるべし。
- 電卓で戸惑った箇所もあった。
→電卓の練習もするべし。

# 最後に
頑張りましょう～～～。
X（旧ツイッター）のリストをスプレッドシートで抽出する

ツイッターのリストをエクスポートしたかった。諦めてコピペでなんとかした。

**■ちゃちゃっとスプレッドシートでやろう**
五分もかからないことを、無駄に冗長に書いてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689250/dfc828a0-c834-c6bc-4233-f84e659a8ad3.png)

**【スプレッドシート】**
見出し
A1セル「テキスト」
B1セル「正規表現」
C1セル「リンク」

**【A列】テキスト**
リスト一覧をテキスト形式でコピーする。
Twitter＞任意のリスト＞「〇〇人のメンバー」＞「リストに追加されているユーザー」
表示されている情報を、一行目から最終行まで適当にコピーし、スプレッドシートA2セル以下に貼り付ける

**【B列】正規表現**
正規表現でアカウント名だけを抽出する
B2セルに正規表現を記入し、セル選択状態でセル右下角をダブルクリックする。（オートフィルで正規表現を最終行まで挿入）
~~~
　=REGEXEXTRACT(A2, "^@.+")
~~~

**【C列】URL**
C2セルに関数を記入し、セル選択状態でセル右下角をダブルクリックする。（オートフィルで正規表現を最終行まで挿入）
~~~
　=("https://twitter.com/"&B2)
~~~

**【抽出】オートフィル**
アカウントのある記号だけ抽出
①フィルターでアカウント名だけをリスト化する
　A1,B1セルを選択し、スプレッドシート＞データ＞「フィルタを作成」押下
　※もしくはツールバーのフィルタマーク押下

②正規表現の列からエラー結果を除外する
　B1セルのフィルター記号を押下し、値の中から「#N/A」を押下してチェックを外す。

**【複数リンクを同時に開く】**
リンク情報を持つセルを選択し、Alt+Enterで全リンクのタブが開く。
※ポップアップブロッカーを有効にしている場合はエラーとなる

**参考**
[検索と置換.一般的な正規表現 Google ドキュメント エディタ ヘルプ](https://support.google.com/docs/answer/62754#regular_expression&zippy=%2C%E4%B8%80%E8%88%AC%E7%9A%84%E3%81%AA%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE[ "検索と置換 - パソコン - Google ドキュメント エディタ ヘルプ")
todoアプリ編集機能を作成してる時に起きたバグ

# 起きたこと

todoアプリの編集機能を作成中、編集機能を押すと追加したtodoアプリ分モーダルが表示されてしまうというバグが発生。

![todo編集機能バグ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2597943/abf0fdea-38a6-70c2-2d70-90db4f498b1c.gif)


よって、編集ボタンを押すと必ず２つ目のモーダルが表示されてしまっていた。

# 関連ある技術

- Vue3
- Vuetify3

# 解決したいこと

1つ1つのtodoのモーダルを表示できるようにしたい

## 考えるべきこと

今回は、なぜ2重に表示されてしまうのかを考える必要がある。

まず、todo自体の挙動の確認からすると…

1. todo追加
2. todoが画面に表示される
3. todo編集ボタンを押す
4. モーダルが表示される
    ・キャンセルボタンを押して閉じる
    ・更新ボタンを押して閉じる
5. モーダルを閉じる

単体のtodoを作成する手順はこんな感じ。

次に、コードの確認。

```js
<template> 
<v-dialog
   v-model="showDialog"
   persistent
   width="1024"
 >
  <template v-slot:activator="{ props }">
    <v-btn
      class="ma-2"
      color="blue"
      height="40"
      type="submit"
      v-bind="props"
     >
	     編集
    </v-btn>
	</template>
...
</v-dialog>
...
</template>
<script setup>
import { computed, ref } from 'vue';
import { useStore } from 'vuex';

const store = useStore();
const newTodoTheme = ref("");
const todoValues = computed(() => store.getters.todoList);
const showDialog = ref(false);
...
</script>
```

vuetifyの公式から、ダイアログがあったので、そのコードで必要な部分だけ抽出。

https://vuetifyjs.com/en/components/dialogs/			

上記コードで、**`<template v-slot:activator="{ props }">`** の部分は編集ボタンを押すとトリガーとなり、モーダル（特定のコンポーネント）が表示（アクティベート）される処理となっている。

showDialogで、refを使用していることからリアクティブにtrue/falseとすることができるが、このままだと単一のtodoしか指定ができない。

ここでのキーポイントは

- **showDialogをどう宣言していくかということ**
- **各todoのindex番号を用いる**

todoを複数追加ということは、オブジェクトでキーを各todoのインデックス、バリューに各todoのインデックスのbooleanを持たせればいいので、下記のような宣言に変更。

```jsx
const showDialog = ref({});
```

そして、今回は、親コンポーネントから値を受け取ってきたりすることはないので、template自体の数を少なくし可読性を良くするために、先ほどのコードも修正していくこととする。

編集ボタンを押したときに、clickイベントが発火し、各要素のインデックスを渡しやすいなと考えたので、以下のように変更。

```js
<template>
<v-btn
  class="ma-2"
  color="blue"
  height="40"
  type="submit"
  @click="handleOpenModal(index)"
>
    編集
</v-btn>
...
</template>

<script setup>
...
const showDialog = ref({});
...
const handleOpenModal = (index) => {
  showDialog.value[index] = true;
}
```

引数で、indexを渡すことで、各要素のインデックスの制御もしやすくなった。

ちなみに、showDialog.valueとすることで、vue3の場合は要素にアクセスできる。（vue2からvue3やってる人にとっては、初見殺しだったりする）

上記コードで、わかりづらい人向けにconsole.logで値を出してみると下記のようになります↓↓↓

![スクリーンショット 2023-09-10 16.41.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2597943/4d87f375-f483-5291-efdf-47af3455d7ca.png)

オブジェクト内で、インデックス毎に管理されているのがこれでわかるかと思います。

そして、再度挙動の確認をしてみると….

![todo編集機能バグ修正.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2597943/1aa91d90-e23f-351e-770b-da8272afa206.gif)


でけた！！！！

今回のバグが起きた原因としては、

- todoが複数になったときに対応してなかった
- 各todo毎にモーダルのデータ管理をしてあげなかった

以上が原因だったと思います。

vue3まだまだ理解が足りぬと感じることが多いですが、僕と同じような状況で困っている人がいたら、ぜひこの記事を参考にしてみてください！
/etc/hosts と /etc/resolv.conf

# 調べたこと

## 名前解決の方法について

- `/etc/hosts`内のマッピングを見て解決する
- スタブリゾルバ(`glibc/resolv`など)が、DNSサーバーに問い合わせて解決する
    - DNSサーバーのアドレスは`/etc/resolv.conf`に記されている。

`hosts`, `resolv.conf` の2種類の名前解決の優先順位を`/etc/nsswitch.conf`で指定する。[ref](https://riceplanting.hatenablog.jp/entry/2013/04/29/172835)

## `/etc/resolv.conf` について

以下のよう。ネットワーク環境に応じて、動的に生成される。

```
#
# macOS Notice
#
# This file is not consulted for DNS hostname resolution, address
# resolution, or the DNS query routing mechanism used by most
# processes on this system.
#
# To view the DNS configuration used by this system, use:
#   scutil --dns
#
# SEE ALSO
#   dns-sd(1), scutil(8)
#
# This file is automatically generated.
#
nameserver 2001:268:98ef:5b3d::c3
nameserver 192.168.134.52
```

この例だと、nameserverは、IPv4のものとIPv6のものの二つが記されている。

なお、「IPv4のネームサーバーによる名前解決時に返されるIPアドレスの配列に、IPv4のアドレスとIPv6のアドレスの両方が含まれる」ことはありうる。

例えば、以下のように`/etc/resolv.conf`を書き換えて`google.com`を名前解決すると、`142.251.222.14`と`2404:6800:4004:821::200e`が得られた。


```
# nameserver 2001:268:98ef:5b3d::c3
nameserver 192.168.134.52
```


# Ref. 

https://riceplanting.hatenablog.jp/entry/2013/04/29/172835
Google Nest Camのライブ映像を常時表示できるようにする

家の前のライブ動画を家にいる間は常時表示できるようにしておきたい！というセキュリティ意識の高い方向けの投稿です。やっていることは、[Google Home](https://home.google.com/)の余計なUIを取っ払っているだけです。これを、パソコン起動時にChromeが自動で起動するようにしたら常時見ておける環境ができあがります。

CSSをサイトにねじ込む拡張機能は色々ありますが[User Javascript and CSS](https://chrome.google.com/webstore/detail/user-javascript-and-css/nbhcbdghjpllgmfilhnhkllmkecfmpld) がおすすめです。Option → Hihetst CSS Prioryにチェックを入れるのをお忘れなく。

[duet](https://ja.duetdisplay.com/)とかで古いスマホをディスプレイ化して常時表示しておくのがおすすめです。

```CSS:style.css
body{
  background-color: #2a2c32;
}
.bottom-scrim,
 mat-sidenav-container {
  background: none;
}

GHW-STREAM-PLAYER , div.top-buttons.ng-star-inserted,
.main-content-wrapper, ghw-full-player{
  height: 100vh;
  width: 100vw;
  position: fixed;
  left:0;
  top: 0;
  padding: 0;
  margin: 0;
}
mat-sidenav
,ghw-toolbar-v2,body > ghw-root > ghw-home > main > ghw-navigation-rail > mat-sidenav-container > mat-sidenav-content > div.rail,ghw-cameras-header,.camera-control-buttons,#mat-tab-nav-panel-0 > ghw-full-player > div.bottom-buttons.v2.ng-star-inserted > div > div:nth-child(2) > button,
mat-toolbar,
.mat-drawer-inner-container{
  display: none !important;
}
ghw-stream-player{
  display: block;
}

ghw-full-player, .main-content-wrapper,.mat-drawer-container {
  background-color: transparent !important;
}

```

あとは、chromeをPowershell等お好みの方法で自動起動するだけ。

```Powershell: ShowCamera.ps1
start chrome.exe '--profile-directory="Default" --app=https://home.google.com/'
```

参考までに～
nuxt-authのlocal環境と本番環境の違い

# はじめに
本記事はnuxt-authを使ったlocal環境と本番環境の違いにろいろ躓いたので備忘録としてまとめた記事です。


# システム構成
システム構成は以下のようになっており、
なるべくお金をかけずにポートフォリオページを作ることを目標としてました。
- バックエンド：Nuxt
- フロント：Vue, Vuetify
- ホスティング+DB：vercel 
- CMS：Contentful

# nuxt-authを用いたlocal環境と本番環境の違い
localと本番環境で`nuxt.config.ts`と`server/api/authに[...].ts`の記述に違いがあります。
ソースコードは以前書いた[こちら](https://qiita.com/motoo1789/items/f0fe74e39c93f9b9a3f7)の記事を参考にします。
（2023/09/09時点での話です）

## local環境
local環境であれば以下のようなコードで動きます。

```nuxt.config.ts
auth: {
    enableGlobalAppMiddleware: false, // trueの場合は最初にログインページを表示
},
```

```server/api/authに[...].ts
export default NuxtAuthHandler({
	pages: {
		// 中身
	},
    providers: [
        // 中身
    ],
})
```

## 本番環境
local環境の書き方のままvercelにデプロイすると怒られます！[公式](https://sidebase.io/nuxt-auth/resources/errors)
下で紹介するエラーは、開発中に警告メッセージとして表示され運用中にはアプリケーションを停止するエラーとしてスローされるよう物のようです。

## Error: AUTH_NO_ORIGIN: No 'origin' - 
`origin`というものが `npm run build` もしくは `npm run generate` 時に存在しないとダメみたいです。
デプロイしているアプリにアクセスするためのurlを記述すれば大丈夫です。
![Error　AUTH_NO_ORIGIN.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691844/17e59d66-485d-a386-033f-b907f86b15b6.png)

```nuxt.config.ts
auth: {
    enableGlobalAppMiddleware: false, // trueの場合は最初にログインページを表示
    // デプロイしているアプリにアクセスするためのurlを記述
    origin: 'https://プロジェクト名とかになるはず.vercel.app' 
},
```






## [nuxt] [request error] [unhandled] [500] AUTH_NO_SECRET: No 'secret'
`secret`はアプリユーザーの cookies / tokens をエンコードするために使われるものです。
local環境では省略でき偽の値に置き換えられるので知りませんでした。
本番環境の際はユーザー独自で作成しvercelの環境変数に入れておけば大丈夫です
![[nuxt]　[request error]　[unhandled]　[500] AUTH_NO_SECRET.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691844/07681560-a2af-e310-0e4a-08f64fa99a0d.png)
`server/api/authに[...].ts`に1行追加、vercelの環境変数にも対応するトークンを追加するとエラーは消えます。
```server/api/authに[...].ts
export default NuxtAuthHandler({
    secret: process.env.AUTH_SECRET, // secretを追加
	pages: {
		// 中身
	},
    providers: [
        // 中身
    ],
})
```

# 追記
2024/08/05：
vercelの話をしてますがAWSとかでも同じです！
EC2でNuxtアプリを立てた時に同じエラーがでました。


# 参考文献
1. [Nuxt3：Nuxt-Authで認証機能作ってみた](https://qiita.com/motoo1789/items/f0fe74e39c93f9b9a3f7)
2. [sidebase：Errors and Warnings](https://sidebase.io/nuxt-auth/resources/errors)
[React Native/Web]MSWを用いてローカルでAPIモックの方法【導入編】

# はじめに
こんにちは。二ヶ月ぶりの投稿です。
Webを開発しているとき、画面のテストについて悩んでることがありますか？
- サーバから返したデータでUIを確認したいけど、サーバAPIがまだできていない、または不具合があって使えない
- テストのためソースコードを変えるのは面倒くさい
- サーバでダミーデータを作るのは面倒くさい
- 異常系、特にHTTPエラー系のテストが難しい
- クロスオリジンなどの制限がかけていて、リモート環境でなければテストができない

などなど…
APIモックを実装し、ローカルでダミーデータを作ってテストができれば良いな、って思っていることがないでしょうか？
こういう時、Mock Service Worker（MSW）がおすすめです。
MSWの利用について、投稿が長くなりそうなので、ここで【導入編】と【実装編】に分けて進んでいきたいと思います。

# MSWって、何？
MSWの公式サイトを見てみましょう。
https://mswjs.io/
> Mock Service Worker is an API mocking library that uses Service Worker API to intercept actual requests.

Mock Service WorkerとはService Worker APIを用いて実際のHTTPリクエストを遮るようなAPIモックライブラリーです。
> By bringing the ability of Service Workers to capture requests for the purpose of caching, Mock Service Worker enables API mocking on the highest level of the network communication chain. It is the closest thing to a mocking server without having to create one.

Service Workersはキャッシュのためにリクエストを捕獲するので、MSWはそれを利用してネット通信チェインの最上位レベルにAPIモックができるのです。これに通じで、モックサーバを構築しなくても、ほとんど同じなものができます。

> Since Service Worker is a standard API shipped by all modern browsers, integrating Mock Service Worker into your application, or testing setup, requires no extra configuration, but placing a worker file and declaring mocks.

現代のブラウザがすべてはService Workerを搭載しているため、webアプリにMSWの実装と利用は特別な配置とかが不要です。単にworkerファイルを入れて、モックを定義しては十分です。

まぁ、細かいとこはさておき、おおまかにこんな感じですね。
では、どうやってMSWを導入するか、見てみましょう。

# MSWの導入
ここで、React Native+Expoで開発しているwebアプリ（REST API）を例として、導入方法について紹介します。
MSWはブラウザーもnodeも利用可能ですが、それぞれ配置方法が異なります。Expoではローカルでテストする時に、HTML/CSS/JavaScriptを作成しSPAになるため、ブラウザーでの導入方法に従います。

## MSWのインストール
最初はもちろん、インストールです。
```bash
npm install msw --save-dev
```

## MSWの初期化
次に、MSWの初期化を行います。
```bash
npx msw init <PUBLIC_DIR> --save
```
ここで`<PUBLIC_DIR>`とはHTML/JS/CSSファイルを置いているフォルダーです。
私が使っているReact Native+Expoの場合、ルートに`web`というフォルダーを作成していたら、その`web`が`<PUBLIC_DIR>`となります。
フォルダーツリーはこういう感じです：

ルート（プロジェクトフォルダー）
├ assets
├ node_modules
├ src
│ ├ mocks：ここでMSW用のファイルを置く
│ └ ほかのソースファイル
├ web
│ ├ index.html
│ └ mockServiceWorker.js：初期化したらこのファイルが出る
├ web-build
├ App.js
├ package.json
└ その他

`mockServiceWorker.js`が`web`フォルダーの中にあれば、初期化が終わります。

## Workerの配置
上記`src/mocks`フォルダーに、必要な配置ファイルを入れます。
まずは`browser.js`です。
`browser.js`の内容は単純で、下記の通りに変更が不要です。
```js
// src/mocks/browser.js
import { setupWorker } from 'msw'
import { handlers } from './handlers'

// This configures a Service Worker with the given request handlers.
export const worker = setupWorker(...handlers);
```
次に`handler.js`を作成します。
```js
// src/mocks/handlers.js
import { rest } from 'msw'

export const handlers = [
  // ここでAPIモックを入れる
];
```
`handlers`にモックしたいAPIを追加します。追加方法は次の【実装編】に詳しく紹介します。

## MSWの有効化
上記の作業が終わったら（`handlers.js`は後で大丈夫）アプリにworkerを起動します。
`App.js`に下記のコードを入れておきます。
```js
const { worker } = require('./mocks/browser')
worker.start()
```
もちろんMSWが有効化したくない場合もあるので、上記ソースコードに条件を付きましょう。

# 最後に
導入が成功した場合、ローカルでアプリを起動すると、ブラウザーのコンソールに下記の情報が出ます。
```
> [MSW] Mocking enabled
```
以上、MSWの導入です。
次回【実装編】は具体的にAPIモックを実装する方法を紹介します。
与えられた文字列がbase64でエンコードされたデータか調べるPowershellスクリプト

元ネタ: [Base64 かどうか判定する](https://oboe2uran.hatenablog.com/entry/2019/02/08/224837)

ちなみに、これはChatGPDに投げたら作ってくれたものかつ、動作は適当にしか確認してないです。参考までに。

```Powershell: isBase64Stringl.ps1
# PowerShell版のB64Util
$decodeTable = @(
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, # 00-0f
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, # 10-1f
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, 62, -1, 63, # 20-2f + - /
    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, # 30-3f 0-9
    -1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, # 40-4f A-O
    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63, # 50-5f P-Z _
    -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, # 60-6f a-o
    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51                      # 70-7a p-z
)

$b64pattern = "^[a-z0-9A-Z/\\+]+={1,2}$"

function isBase64Byte($octet) {
    return ($octet -eq 61) -or ($octet -ge 0 -and $octet -lt $decodeTable.Length -and $decodeTable[$octet] -ne -1)
}

function isWhiteSpace($byteToCheck) {
    return ($byteToCheck -eq [byte]' ') -or ($byteToCheck -eq [byte]'\n') -or ($byteToCheck -eq [byte]'\r') -or ($byteToCheck -eq [byte]'\t')
}

function isBase64([byte[]]$array) {
    if ($array -eq $null) { return $false }
    if ($array.Length -lt 1) { return $false }

    foreach ($byte in $array) {
        if (-not (isBase64Byte $byte) -and -not (isWhiteSpace $byte)) {
            return $false
        }
    }
    return $true
}

function isBase64String($str) {
    if ($str -eq $null) { return $false }
    return (isBase64 -array ($str.ToCharArray() | ForEach-Object { [byte]$_ })) -and ($str -match $b64pattern)
}

# 使用例
$base64Str = "ChlJrYAyuNdhGGARbBYOMDc4P7M=="
if (isBase64String($base64Str)) {
    Write-Host "与えられた文字列はBase64です。"
} else {
    Write-Host "与えられた文字列はBase64ではありません。"
}
```
WindowsServerライセンスについて調べた話

初心者ながらWindowsSeverのライセンスについて調べてほしいというオーダーを受けたので調べてみた。だが解釈が難しいのでまとめておく。

（間違いあったらご指摘ください）

１、サーバライセンス
大前提として物理サーバー1つに最低16コアライセンスは必要。
また、物理コア数を満たすライセンスが必要。

２、仮想化
データセンターは無制限
スタンダードは物理コア数満たすライセンス分で２個のＶＭ（WindowsSever）を使用する権利がある。
LinuxやWindows10など異なるOSであればこの条件は適用されない。（つまりいくらでも立てられる。）

３、CALについて
アクティブディレクトリを使用していなければ不要。
HPCワークロードで使用している場合は不要。
仮想化ソフトウェア実行の用途のみなら不要。

４、仮想サーバ上のライセンスの使いまわしについて
特に非アクティブ化などの作業はなくインスタンスを削除し同じプロダクトキーを再度立てたVMに適用すればいい。ただし同じハード上でなければならない。また、短期間や一定数行うと電話認証になる場合がある。
Markdown PDFを見出し１で自動的に改ページさせる方法

ここ数年 Markdown で資料を書いています。16:9だけでなく従来通りの縦長の資料を作成する場合があります。以前はタグを入れていたのですが、見出し１で勝手に改ページしてくれる方法があるので紹介します。

# 方法

以下の style を設定すると見出し１で自動的に改ページしてくれます。

``` markdown
<style>
    h1 {
        page-break-before:always;
    }
</style>   

# 第一章
あああああ

# 第二章
いいいいい

# 第三章
ううううう

# 第四章
えええええ
```

# タグを入れる方法

以下のタグを入れることでも改ページできます

``` 
<div style="page-break-before:always"></div>
``` 

# あとがき

ここ数年 MS Word はほんとに使わなくなりました。PowerPoint は画像を生成するのに使っています。やはり管理やメンテにおいても Markdown は圧倒的に便利ですよね。
Relax-and-Recoverで作成したOSイメージから作ったPCのDHCPで振られるIPアドレスが重複した話

ミニPCの構築作業があり数が20台以上あったのでクローンを作成しUSBに焼いてブートメディアを作成して作業していくことになりました。

クローンはRelax-and-Recoverを使って作成しました。（ここもだいぶ詰まった笑）

ようやくブートメディアが作成でき、どしどしインストールして各々ごと設定をしていきました（IPやホスト名の変更など）

しかしテストでNWに何台か接続するとPINGやSSHが通りにくく「なぜ？？」となりました。

調べてみると、どうやらDHCPで振られるローカルIPが重複しているようでこれが原因のようでした。

ただ何が悪いのかわからず、調べてみるとこんな記事がありました。
https://t-dilemma.info/vsphere-clone-ubuntu-dhcp-ip-conflict/

どうやらmachine-idが重複していたことが原因らしくこれを直して解決しました。

直し方は上記URLを参照してください。
Bun 1.0の bun install の速さを調べる

## これなに

Bun 1.0が出たらしい。

https://bun.sh/blog/bun-v1.0

Twitter(現X)情報だと、`bun install`がとにかく早いらしいので調べてみた。


対象はAWS CDKのリポジトリとする。

https://github.com/aws/aws-cdk/tree/main


## 調べ方

Bunは公式記載の方法でインストールする。簡単。

https://bun.sh/docs/installation

```bash
curl -fsSL https://bun.sh/install | bash 
```


### yarn intall

`rm -rf node_modules/ && time yarn install`
を5回実行する。


```bash
# 1回目
real    0m42.060s
user    0m28.544s
sys     0m27.346s

# 2回目
real    0m37.307s
user    0m27.554s
sys     0m24.019s

# 3回目
real    0m34.631s
user    0m26.526s
sys     0m25.207s

# 4回目
real    0m38.309s
user    0m27.107s
sys     0m24.790s

# 5回目
real    0m36.132s
user    0m26.972s
sys     0m23.865s
```

### bun intall

`rm -rf node_modules/ && time bun install`
を5回実行する。


```bash
# 1回目
real    0m8.246s
user    0m0.195s
sys     0m6.060s

# 2回目
real    0m7.172s
user    0m0.198s
sys     0m6.036s

# 3回目
real    0m9.132s
user    0m0.217s
sys     0m7.234s

# 4回目
real    0m7.112s
user    0m0.179s
sys     0m5.813s

# 5回目
real    0m7.236s
user    0m0.262s
sys     0m5.917s
```

### 追記
パッケージinstallの後にlernaでビルドする部分があるが、`bun install`した場合はエラーが出てしまった点については触れておく。

```bash
# pre-build packages
npx lerna run build --scope=aws-cdk-lib --scope=@aws-cdk-testing/framework-integ --skip-nx-cache
```

リポジトリの[このへん](https://github.com/aws/aws-cdk/tree/main/tools/%40aws-cdk/yarn-cling)を読む限りYarnに依存している部分があるのかも。この辺はノウハウ待ちか。

```bash
 >  Lerna (powered by Nx)   Running target build for 2 projects and 21 tasks they depend on
 
    →    Executing 1/19 remaining tasks...
 
    ⠧    @aws-cdk/yarn-cling:build
 
 
 
    ✖  @aws-cdk/yarn-cling:build
yarn run v1.22.19
$ tsc
       ../../../node_modules/@types/glob/index.d.ts(29,42): error TS2694: Namespace '"/workspace/aws-cdk/node_modules/minimatch/dist/cjs/index"' has no exported member 'IOptions'.
       ../../../node_modules/@types/glob/index.d.ts(74,30): error TS2724: '"/workspace/aws-cdk/node_modules/minimatch/dist/cjs/index"' has no exported member named 'IMinimatch'. Did you mean 'Minimatch'?
error Command failed with exit code 2.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
       
       

 ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

 >  Lerna (powered by Nx)   Ran target build for 2 projects and 21 tasks they depend on (18s)
 
    ✔    4/5 succeeded [0 read from cache]
 
    ✖    1/5 targets failed, including the following:
         - @aws-cdk/yarn-cling:build

```

## まとめ

うーん、早い。ざっくり4～5倍速い。安定したらbuild周りも調べて、良さそうならCIサーバなどの置き換えだけでもしたいところ。

こういう使い方もよさそう。

https://twitter.com/__syumai/status/1700151156633174239
PHP ハイアンドロー・カードゲーム

# はじめに
paizaでハイアンドロー・カードゲーム問題での備忘録です。
問題が解決済みの方・わからなかった方のみ読むことを推奨します。


# Paiza C問題 ハイアンドロー・カードゲーム問題文
paizaカードゲームは、複数枚の子カードそれぞれが、1枚の親カードとの強弱関係で勝負するゲーム。
どのカードにも2つの番号が書かれています。
1つ目の番号は1から10の整数、2つ目の番号は1から4の整数で表されます。
また、2つの番号の各組み合わせは1枚だけカードの束に含まれています。(同じカードが2枚以上存在しません)

2枚のカードの強弱関係は、次のルールによって決まります。
・1つ目の番号が大きいカードのほうが強い
・1つ目の番号が同じ場合、2つ目の番号が小さいカードのほうが強い

親カードと子カードの情報が与えられるので、それらの強弱関係を調べるプログラムを作成してください。


# 入力される値
```
a b
n
A_1 B_1
…
A_n B_n
```
1行目では親カードの情報が与えられます。親カードの1つ目の番号は a、2つ目の番号は b で表されます。
2行目では整数 n が与えられます。
3行目から n 行の入力が続き、各行では、子カード i (1 ≦ i ≦ n)の情報が与えられます。
子カード i の1つ目の番号は A_i、2つ目の番号は B_i で表されます。


# 期待する出力 
出力の i 行目では、親カードと子カード i の強弱関係を調べたときに
親カードの方が強いならば "High"、そうでなければ "Low" と出力してください。
各行では、"High" または "Low" 以外の余分な文字、空白を含んではいけません。
最後は改行し、余計な文字、空行を含んではいけません。


# 条件
すべてのテストケースで以下の条件を満たします。

・1 ≦ a, A_i ≦ 10
・1 ≦ b, B_i ≦ 4
・1 ≦ n < 40


# 解くまでの順序1
まずは親カードと子カードの回数を取得
親カードは空白で数字が横に並んでいるので、配列でそれぞれを取得。

```php
$parent = explode(' ',trim(fgets(STDIN)));
$times = trim(fgets(STDIN));
```

# 解くまでの順序2
for文で$timesの回数分で繰り返す必要があり、
その繰り返す度に子カードを以下のように取得していく必要がありそう。
```php
for ($i = 0; $i < $times; $i++) {
    $children = explode(' ',trim(fgets(STDIN)));
}
```

# 解くまでの順序3
後はif文をfor文の中に入れる必要があるから親カードが勝つ時のif文を書く。
それは親カードの1枚目のカードが子カードの1枚目より大きい場合と、1枚目のカードの数字が親と子が同じ場合は、親カードの2枚目が子カードの2枚目より小さい場合が勝つのでそのif文に||と&&を加えて記述する。
それ以外は負けのLOWなので、else文で良い。

```php
if ($parent[0] > $children[0] || $parent[0] == $children[0] && $parent[1] < $children[1]) {
    echo "High";
}
else{
    echo "Low";
}
echo "\n";
```

# 完成文は以下
コードで何か間違った事を記載している、こうした方がいいなどありましたらご指摘して頂けると嬉しいです。
見て頂きありがとうございました。
```php
$parent = explode(' ',trim(fgets(STDIN)));
$times = trim(fgets(STDIN));

for ($i = 0; $i < $times; $i++) {
    $children = explode(' ',trim(fgets(STDIN)));
    if ($parent[0] > $children[0] || $parent[0] == $children[0] && $parent[1] < $children[1]) {
        echo "High";
    }
    else{
        echo "Low";
    }
    echo "\n";
}
```
Azure AD が Microsoft Entra ID に名称変更

# Microsoft Entra ID とは
今まで、Azure AD というブランドで提供されていた製品が Microsoft Entra ID としてリブランディングされました。

https://news.microsoft.com/ja-jp/2023/07/12/230712-azure-ad-is-becoming-microsoft-entra-id/

名称の差異は、以下も参照いただくと良いと思います。
（Azure Active Directory の新しい名前）
https://learn.microsoft.com/ja-jp/azure/active-directory/fundamentals/new-name#what-will-happen-to-the-azure-ad-capabilities-and-features-like-app-gallery-or-conditional-access

これによると、Azure AD テナントは、Microsoft Entra ID テナントでは無くて、Microsoft Enta テナント と呼ぶらしいです。なので、単純に "Azure AD" を、"Microsoft Entra ID" に文字列置換できるわけではないので注意が必要です。

（更新された用語）※ココに 新旧の用語比較が詳細に記載されています。
https://learn.microsoft.com/ja-jp/azure/active-directory/fundamentals/new-name#glossary-of-updated-terminology

私の見立てでは 主にライセンス名で使われている "Azure Active Directory" が、"Microsoft Entra ID"へ変更されていて、"Azure AD" という表記が機能の一部として扱われていたものは、"Microsoft Entra" に変更されているような気がするものの、用語集を見て覚えつつ 慣れていくしかなさそうな気がしますね。

# 省略形と呼び方は？
Azure AD の省略形は、AAD でしたが、Microsoft Entra ID の省略形はどうなるでしょうか？
先日(2023/8/2) のパートナーイベントに参加したときには、ME-ID（ミーアイディ）と呼んでもらうと良いと伺いました。
なお、"Entra" とか、"EID" と略されてしまうとよろしくない（他の意味になる）ので、必ず "Microsoft" と "Entra" は切り離さずに "Microsoft Entra" として使って欲しいとのことでした。
気を付けましょう。

# ご参考
こちらもどうぞ！

https://qiita.com/carol0226/items/69aefb55d7f5dcac1c4a
ChatDevをAnaconda環境で動かしてみた（windows)

# ChatDevとは

https://ai-scholar.tech/articles/agent-simulation/chatdev

仮想のソフトウェアテクノロジー会社であるCHATDEVを設立し、プログラマー・テストエンジニア・アートデザイナーなどの様々な役職の生成エージェント間の相互的なコミュニケーションを基にした開発プロセスにより一貫性のあるソフトウェア開発を可能にしたもの。

## セットアップ
Anaconda の仮想環境を想定しています。
基本はread meを
#### gitリポジトリ

https://github.com/OpenBMB/ChatDev

```
git clone https://github.com/OpenBMB/ChatDev.git
```
※私はDownload.zipを使いました。

#### 仮想環境構築
```
conda create -n ChatDev_conda_env python=3.9 -y
conda activate ChatDev_conda_env
cd ChatDev 
#※https://github.com/OpenBMB/ChatDev.gitで用意した
　ディレクトリのルートへ移動させる

install -r requirements.txt
```

#### APIキーの環境変数登録
公式readmeには下記とあるが、
```
Unix/Linux の場合:
export OPENAI_API_KEY="your_OpenAI_API_key"
Windows の場合:
$env:OPENAI_API_KEY="your_OpenAI_API_key"
```

openai_api not foundとなる
anaconda環境では下記のようにするとうまくいった
```
set OPENAI_API_KEY="your_OpenAI_API_key"
```

#### ソフトウェアビルド

下記のコマンドの実行でプログラムが出来上がる
```
python run.py --task "[description_of_your_idea]" --name "[project_name]"
```
[description_of_your_idea]：作りたいプログラムの内容に置き換える
[project_name]：任意の名前に置き換える
# 結果
WareHouseというフォルダの中に実行フォルダが出来上がる
```
python main.py
```
でプログラムを実行できる

# その他
online_log フォルダにあるapp.py
```
python app.py
```
を実行するとWEBサイトが立ちあがる。
WareHouseフォルダにあるログファイルをアップロードすると
要件定義～製造までの過程をモニタリングできる