OmniAICreator/Qiita-1.07M huggingface dataset:
husky+lint-stagedでpre-commitフックを作成する

# はじめに
Viteを使用してReact + Typescript環境でWebアプリの開発をチームで行っています。
私はファイル保存時にlintを自動実行するようにしていますが、メンバー全員がそうしているわけではありません。
そのため、commitにlintによる修正が含まれていることもあります。
こうなると、重要な修正箇所が分かりづらくなってしまいます。

また、他の人が編集した箇所をpullしてくるとテストが通らないといったことがたまにありました。
commit前にテストを実行しなければいけないですが、人間なので忘れることもあります...

そこでpre-commitフックを作成して、commit前にlintの修正およびテストを自動実行したいと思います。

# 環境
node v20.10.0
vite v5.2.0

# husky + lint-stagedのインストール
## 前提条件
- `yarn create vite`および`git init`が実行済み

## 1. `devDependencies`にhuskyとlint-stagedをインストール
```bash
yarn add -D lint-staged husky
```

## 2. `npx husky init`の実行

```bash
npx husky init
```

上記コマンド実行後、package.jsonのscriptsに以下が追加されます。
```package.json
"prepare": "husky"
```

また、プロジェクト内に`.husky`ディレクトリが作成されます。
    
## 3. pre-commitファイルを編集
`.husky/pre-commit`を編集します

```diff_c: .husky/pre-commit
- npm test
+ npx lint-staged
+ CI=true yarn test -o
```

`npm test`はデフォルトで書かれているもので、今回は使用しないため削除しました。

2行目はlint-stagedを実行するための命令です。

3行目について、`CI=true`を指定することによりCI環境で実行され、Warningをエラーとして扱います。
また`-o`は変更があるファイルに関連するテストのみを実行するためのオプションです。

# lint-stagedの設定

lint-stagedに関連する記述をpackage.jsonに追加していきます。
eslintとprettierを使用しています。

```package.json
"lint-staged": {
  "src/**/*.{ts,tsx}": [
    "eslint --fix"
  ],
  "src/**/*.{css,ts,tsx,json}": [
    "prettier --write"
  ]
}
```

以上でpre-commitフックの作成ができました。
あとは、コードの編集をしてテストを作成すればcommitの度に、lintの修正とテストが自動実行されます。

# 余談
基本的に上記のやり方で問題ないですが、`yarn test`のコマンドにウォッチモードが指定されている状態だと、pre-commitが終わらない現象に遭遇しました。

```package.json: package.jsonの記載例
"scripts": {
  "test": "jest --watch"
}
```

```bash
git commit -m "hogehoge"
> No tests found related to files changed since last commit.
```

ウォッチモードはファイルの変更を監視し続けるので、いつまで経ってもフックが終わらない状況に陥っていたようです。
`--watch`を削除することで、この問題は解決しました。

ウォッチモードは便利なので、私はpre-commit用のtestコマンドを作成しました。

```package.json
"scripts": {
  "test": "jest --watch",
  "test:pre-commit": "jest"
}
```

```./husky/pre-commit
CI=true yarn test:pre-commit -o
```
識別子と文字データ型、char型と文字コード

識別子（IDは）データ構造、データベース、メモリなど、多くのコンピュータの領域で使用される。
識別子の主な目的は、データやオブジェクトを一意に識別すること。
例えば、データベースの各レコードには一意の ID があり、それによってレコードを特定できる。

文字データ型は文字や文字列をコンピュータ上で扱うためのデータ型。
コンピュータは直接的には理解できないので文字エンコーディングで文字をビットの並びに変換する。
文字エンコーディングという変換は特定の文字とビットの並びとの間に一対一の関連性を保つことで実現できる。（識別子やIDが一意であることと同じ概念に基づく）

# 文字型
コンピュータは文字を２進数に変換して表現する。
この際に用いられるのがchar型であり、ビットによって文字を表現する。
char 型において、どの 2 進数のデータにどの文字に対応させるかは、決められたルールに従う。例（'あ' : 00000001）

# 文字コード
通常、世界的に決められた対応表を使用することで、他のコンピュータにも共通して同じ情報を与えることができる。
これを文字コードという。
ASCII と Unicode は、コンピュータが文字を表現するためのルール（文字コード）の一種。UTF-8 で表現した文字を Shift-JIS で表示しようとすると、意図しない文字を出力することがある。これが文字化けの原因である。
int型とは

０と１のみを使ってより多くの情報を表現したい。
０と１では２通りの情報しか表現できないので、その数を増やすことで表現できる要素が一気に増える。

# ビットとバイト
コンピュータは１と０しか表せない。
１つの組み合わせでは0, 1の２通りしか表現できない。
その最小単位をビット(bit)と呼ぶ。
1ビット増やして２ビットにすると
01,10,11,00の４通りになる。
3ビットにすると
111, 000, 100, 110, 001, 010, 101, 011、の８通りになる。
nビットは２のn乗通りの０と１の組み合わせがある。
そして８ビットのことをbyteと呼ぶ。（キロバイト、メガバイトのバイト）
1byteは2の8乗通りの０と１を表現できる。（２５６通り）
２５６通りの０と１の組み合わせに、０から２５５を組み合わせて数字を表現できるようになると考えられる。

# ２進数と１０進数
2進数で数値を表現する事によってコンピュータが数値演算を行うことができる。
２進数で10進数を相互に変換する事によって、コンピュータで整数を扱える。
このように整数を表現できるデータ型を整数型(integer type)と呼ぶ。

# int型の値の範囲
## 負の値
一般的に整数型は３２bit（4byte）の長さを持つ。32ビットは2の32乗通りの数値を扱える。
しかし、一般的に整数は負の数も扱うため、正負の識別に１ビット使うので半分の２の31通りになる。

## 大きなint型
int型の範囲を超える整数を扱う場合には６４ビットの長さを持つデータを扱えるlong型を使用することができる。
long型は2の64乗（8byte）の長さを持つ。
符号付きなら2の63乗。

## 16進数
{0, 1, 2, 3, 4 ,5, 6, 7, 8, 9, A, B, C, D, E, F} の 16 個の記号を使って数値を表す。
IPv6アドレスは１６進数で表す。
booleanとは

コンピュータの世界では０と１を使用することができます。
０と１を使用するとどのようにデータを表現できるでしょうか。

真を１、偽を０として表現することで、ブーリアン型のデータをバイナリ（０と１の文字列）として表現できます。このようなデータ型をboolean data typeと呼びます。

多くの言語ではtrueやfalseのリテラル（値）で表現されます。
VsCode – 複数選択モードで複数の行を削除するコマンド

Command + D で文字を複数箇所で選ぶ

コマンドパレットで `Delete Line` を実行する

ショートカットを覚えるよりこちらの方が覚えやすい気が

![image](https://github.com/YumaInaura/YumaInaura/assets/13635059/e99ee0e9-9cff-4be7-90a5-961652e51f3f)


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
「では、それで。」と言ってもらえたら勝ちゲーム

## 私達がコミュニケーションで意識していること

近年は、工程や作業が明確な定型業務の割合が減り、問題解決の道筋を考えるところからはじまるプロジェクト型の業務のニーズが一段と増えてきました。

このような仕事の場合、断片的な情報や関係者の考えを収集し、どうあるべきかの道筋を立てることが重要となります。
この道筋をたてるときには、効果的なコミュニケーションが必要不可欠となります。

### 受け手のコスト・負荷をなるべく軽減する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426622/d3c7be72-fa7c-0d99-21b1-76436926eb01.png)

コンテキストがチグハグ、適切なタイミングでない、必要な前提情報が欠如している、などがあれば、情報の受け手が推測し補完する必要があり、やりとりのキャッチボールも増えます。

なるべく情報の受け手のコストが低いコミュニケーションを意識しています。

### 「では、それで。」となる提案を考える

白紙の状態から「どうしましょう？」とならないように心がけています。

例えば、注文住宅を買う場合に間取りや外壁、建具など、すべてを自由に膨大なカタログの中から選んでください。
となった場合、一般的な人にとって選択が難しいでしょう。

家族構成やライフスタイル、予算、敷地面積からある程度のアウトラインを組み立てて提案がほしいと感じるはずです。

私達も、相手の状況や要望を想像し流れを組み立てて、「では、それでお願い。」と言ってもらえるものを伝えるように努めています。

この言葉を得られると、まずは最初の一歩を踏み出せたと判断することもできます。

物事のアウトラインをひくときには「では、それで。」と言ってもらえたら勝ちのゲームとして捉えるのも良いでしょう。
このゲームを円滑に進めるためのヒントは様々なところに散らばっており、それを探すのもゲームの醍醐味です。

### 「状況がわからないストレス」「コミュニケーションストレス」のバランスを考える

作業報告（Slackでいうとスタンプを付けるくらいの返答で済むもの）は受け手のコストが低いと考えています。
一方で、知りたいことの状況が不明と感じるストレスはある程度大きいものと捉えています。

このため、返答コストが低いコミュニケーションは不要かなと迷う場合も行うようにしています。（もしくは、どこかで状況が可視化される仕組みを用意するのも良いでしょう。）

受け手がコストのかかるような連絡、考えることが多いもの、入り組んだ話で、かつ急ぎでないものは定例のお打ち合わせや口頭で補足しながら共有することを意識しています。

### 適切な分割

沢山の伝えたいことが頭にある場合でも、まずはそのうちのいくつかだけ伝えて、状況が進んだのちに残りの事象を伝えたほうが受け手に負担なく、違和感なく進められるのではないかと考えられる場合はそのように進行します。

### 色々な例外

受け手にとって負担になるもの（答えがすぐにでないこと、抽象的な問題、解決に至っていない出来事、不快な事）でも、予め頭の片隅にいれておいてほしいことは伝えるようにしています。

自分たちが道筋をたてられないもの、初動で役に立つことが難しい場合は素直に助けを求めることも大切です。

## 道筋をひくということの難しさ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426622/5396cc1d-eb23-2722-996d-fe298ab4ab47.png)

明確な作業や仕組みが確立された仕事はその多くを機械やAIが担う時代になりました。

このため、抽象的な物事を具体化する、作業化する工程がますます重要になります。

これらの仕事は（いまのところ）機械化は難しいでしょう。
それは道筋をひくときに関わる情報量が莫大すぎて、何を入力データにすべきか取捨選択が難しいからです。

コミュニケーションにおける返答までの間の置き方、声のトーン、表情、さらには社会的環境、文化、立場など、主要な変数か気にするべきでないノイズかの境界線が曖昧なものに溢れているからです。

これは勿論、人間にとっても難しい問題です。

だからこそ、私達はコミュニケーションを大切にしています。

株式会社add moreでは、行動指針の中に下記のものがあります。

> **仕事の繋がりを大切にする**
> 目の前の仕事だけでなく、そこから繋がるチームの仕事、お客様の仕事を意識し大切にする。常に相手の立場に立って考え、コミュニケーションは細やかに丁寧に行う。

関係する変数が多く、未知で不確定なことは、多くの思考と試行が求められます。

株式会社add moreではこの思考と試行の旅を一緒に歩む仲間を探しています。
ご興味のある方は[コーポレートサイト](https://www.add-more.co.jp/recruit/engineer/)または[Wantedly](https://www.wantedly.com/companies/add-more)からご応募ください。
パタン・ランゲージを僕たちは随分オミットして捉えているのではないか（DevOpsDays Tokyo 2024 感想）

だいぶ投稿が遅くなってしまいました。先日、DevOpsDays Tokyo 2024に参加させていただきました。

https://www.devopsdaystokyo.org/

こういった大きなカンファレンスにオフライン参加するのは本当に久しぶりで、色々刺激もらえてよかった！のですが。

その中の1セッションが自分にとってあまりに衝撃が大きすぎて、自分の中で未だに反芻しているものがあります。

それがアレグザンダーの直弟子である中埜博先生からのパタン・ランゲージに関するセッション[『「パタンランゲージ」から「センタリング」へ』](https://confengine.com/conferences/devopsdays-tokyo-2024/schedule/rich#session-31760-info)でした。

実際このセッションを受けようかどうかは結構悩んでいたのですが、川口さんが二日目のKeyNoteでもかなりおすすめされていたのもあり、パタン・ランゲージの強力さに最近改めて気づいてきたこともあり、参加しました。

改めて公開されていたセッション概要をよむと、まさに中埜先生の伝えたいことが書いてあったように思います。

>　パタンは理解するモノ、共感するモノで止まってしまっています。パタンが指示していることは変革です。パタンを使用するということは、使う本人とその対象世界の変革を目指すコトであり、パタンはそういう影響力を持ちます。それが本質なのです。


自分自身、このセッションの内容を理解できたとはこれっぽちも思っていないのですが、自分への課題提起として、自分が感じたことをつらつらまとめてみようかと思います。

## 「ユートピア」としてのパタン・ランゲージ
まず聞いていて違和感というか、「自分が知っているものと違うぞ？」という印象を受けたのが、パタンおよびパタン・ランゲージの捉え方です。

パタンはそもそも建築の世界においてはビジュアルでした。講演では「厚い壁」というパターンが例に出されていましたが、パタンはそもそもビジュアル表現として考えられていたもので。非常に視覚的なイメージと関係がある、と捉えました。こういうのような視覚的なイメージを我々が「デザインパターン」や「組織パターン」を考えるときに使っているかというと、あんまりそうじゃない気がしています。

正確に言えば、それらのパタンを元々引き出した著者には、結構明確なビジュアルイメージがあったと思います。それがどうしても、パタンを利用するっていう立場になるとすごくふわっとしたゆるい印象になってしまう。

そしてそれらのビジュアルに言葉を足して汎用性を増したり伝えやすくしたものがパタン・ランゲージなわけですが、ここに至ってパタン・ランゲージは「ユートピア」となります。

パタン・ランゲージを「ユートピア」と言えるまで突き詰めて考えているのか？となると私は正直そういったレベルでパタン・ランゲージを捉えたことはありませんでした。あくまで便利な伝え方のフォーマットとしてこれらを捉えてきていた節が多い印象です。

ただ逆に言えば、自分が本当の意味で使いこなせているパターンというのは、自分の中でそこまで落とし込めているものなのかな、というのも少し思います。例えば私は23のデザインパターンだとなんだかんだで[Builderパターン](https://qiita.com/tanakahisateru/items/ed07bb0f766f6e1c2453)を使うことが多いと思いますが、これは自分の中で一つの「ユートピア」として、有効な場面をビジュアル的にイメージできますし、それがどういう意義を持っているのかを活き活き語れると思います。

逆にこれをちゃんと語れないパターン、例えば名前がかっこいいのでお馴染み[Chain of Responsibility](https://qiita.com/tanakahisateru/items/a65d37ab04144345a621)パターンなんかは、実際にどんなものかは説明できるし使うことも（無理やりなら）できるけど、こういった噛み砕きができているか、とわれると怪しいですね。

**パターンの需要において我々は軽く考えすぎているのではないか？** というのが最初に浮かんだことでした。

## 「ユートピア」を現実化するセンタリング
次がこのセッションの肝でもあった「センタリング」という概念です。センタリングてそのまま翻訳すれば中央寄せなわけですが、じゃあ何が「中央」なのかというと、それは建築に置いては建築用地そのもの、なわけです。

しかもこのとき、土地が適さないなら土木工事をしてのぞみの土地にする、ではなくて**その土地の適正に合わせてパターンそのものを変容させる**んですね。

今回例に出されていた盈進学園東野高校の例でいいえば、

- ここにいい感じの高地があるからこれを建てた方が良い
- この湿地を活用して憩いの場を作ろう

というように、土地の特性をいかに活かしていくのか、という変容の様子が語られていました。

このパターン側を変容させ、個々の事情に合わせていくというのは、他のパターンの適用に於いても考慮しないといけない話ではないかと思います。

## 僕たちがオミットしたものはなにか
このセッションを聞いて、強く感じたのは**「パタン・ランゲージをあまりにもまとめるための道具にしすぎているのではないか」**というところです。

パタン・ランゲージのテンプレートがある種使いやすいというのに甘えて、単に考えをまとめるフォーマットやチェリーピックしやすいサンプルのような、便利ツールとして使っているのはなんかちょっと違うのでは？という気がしています。

もちろん知識として新しい考え方を身につけるのに使うことも良いと思うのですが、そこを単なる字面として流してしまうのは、おそらく先人の言葉をあまりにも軽く捉えすぎている、という気がします。

だから何だ、というのを提示できるわけではないのですが、とりあえず「組織パターン」を改めて読んで、自分のユートピアを発見できるようにダイブしたいな、と考えています。
Engine Simulatorの作法 その6

# 概要
Engine Simulatorの作法を調べてみた。
ここまでに、わかった事をまとめてみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a18dba45-a27e-48ea-43d0-bba2a68aafc2.png)

# たぶん、エンジンの構成要素を持って、燃焼室をシュミレーションしてる。

# エンジンの構成要素

ワイヤー（プラグ）
ピストン
コンロッド
シリンダー
シリンダーヘッド
カムシャフト
クランク
吸気装置
排気装置
点火装置

# アダーシリンダーバンクで追加するグループ
ワイヤー（プラグ）
ピストン
コンロッド
シリンダー
シリンダーヘッド
カムシャフト
吸気装置
排気装置

# アダークランクシャフトで追加するグループ

クランク

# アダーイグニッションモジュールで追加するグループ
点火装置

# 排気量と圧縮比はどこで決める。
cylinder_bank_parameters のboreが、ボア
crankshaft のthrowがストロークの半分
piston_parameters のcompression_heightが圧縮比に関わる

# チューニングするのは
排気量
圧縮比
吸気装置
点火装置
カムシャフト

# 操作法
aキーでイグニッションのオン、オフ
sキーで起動
dキーでダイナメーター
q - Light throttle
w - Light/part throttle
e - Part throttle
r - Full throttle

# 別のエンジンを読み込む
load engineボタンを押す
ファイルの拡張子は、mr

# 音がプツプツ途切れる場合

simulation_frequencyを 4000にする。

# みんなの作ったエンジンを探す方法。

https://catalog.engine-sim.parts/parts?q=

または、youtubeで探す。


以上。
RPi5(bookworm)でpicamera2にlibcameraがない

# 背景
新しい自動運転ミニカーをラズパイベースで作成した際、[donkeycar](https://docs.donkeycar.com/guide/robot_sbc/setup_raspberry_pi/)を新しくインストールしなおしたら、picamera2の設定でつまずいた。

# 環境
| モデル | OS |　Donkeycar Ver |
|:-:|:-:|:-:|
| Raspberry Pi 5 Model B Rev 1.0  | bookworm  |　donkeycar v5.1

# 問題：libcameraがない
    "/home/hoge/hoge/lib/python3.11/site-packages/picamera2/__init__.py", line 3, in <module>
    import libcamera
    ModuleNotFoundError: No module named 'libcamera'

## 解決方法
    sudo apt install -y libcamera-dev
    pip install rpi-libcamera

pykmsも併せて必要でした。

    sudo apt install -y python3-kms++
    sudo apt install -y libkms++-dev libfmt-dev libdrm-dev
    pip install rpi-kms

＊pipする際は下記のように仮想環境内で実施してください。

    python3 -m venv --system-site-packages my-env


# 参考
- https://pypi.org/project/rpi-libcamera/
- https://github.com/raspberrypi/pykms
SwiftUIのPreviewで `Failed to build the scheme "youappname"`

### 実行環境

- Xcode 15.4
- Sonoma 14.4.1

### エラー文言

```
`Failed to build the scheme "youappname"`
```

### 修正内容

Xcodeの右上に表示されている赤の❎をクリックして、個々のエラーメッセージを表示する。

![Screenshot 2024-06-10 at 5.45.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88114/29f9e680-9efa-4d43-18a9-9fab6a242700.png)

`Cannot find type 'YourType'` というエラーがいくつかあるので、当該ファイルを開く。

ファイルのInspectorからTarget Membershipに `yourappnameTests` を追加する（= 単体テストをTarget Membershipに追加する）。ファイルのInspectorが表示されていない場合は、ファイルを開いた後にXcodeの右上にある以下のアイコンをタップするとInspectorが表示される。

![Screenshot 2024-06-10 at 5.48.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88114/b4f0fa32-fc21-6681-c43e-4ff0702ce03e.png)

Previewを更新すると、Previewが表示される。
2024/6/10主にITとかセキュリティの記事

仮想通貨ベンチマークCoinGeckoがエアドロップ詐欺に注意喚起　データ流出受けて(6/8)
https://coinpost.jp/?p=536781

ジャネット・イエレンは、金融セクターにおけるAIの使用の重大なリスクについて警告しています(6/7)
https://voi.id/ja/teknologi/387920

サイバー犯罪の対策学ぶ　あいおいニッセイ同和損保、松阪でセミナー(6/8)
https://www.isenp.co.jp/2024/06/08/111497/

ドイツ企業はオープンAIソリューションによるデータプライバシーのリスクに直面します(6/7)
https://elblog.pl/ja/2024/06/07/%E3%83%89%E3%82%A4%E3%83%84%E4%BC%81%E6%A5%AD%E3%81%AF%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3ai%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AB%E3%82%88%E3%82%8B%E3%83%87%E3%83%BC/

チェック・ポイント、生成AIの活用に関する独自調査結果を公開(6/7)
https://news.biglobe.ne.jp/economy/0607/prt_240607_7226430971.html

LINE経営巡る日韓のギャップ【平井久志×リアルワールド】(6/8)
https://www.kyodo.co.jp/col/2024-06-08_3863390/

若者が利用する「無料VPNアプリ」で個人データが中国に売られる危険性(6/8)
https://forbesjapan.com/articles/detail/71463

偽の『dカード』利用停止メールに要注意。クレカを乗っ取られる恐れあり(6/8)
https://ascii.jp/elem/000/004/202/4202994/?rss

バイト募集かと思った…韓国の就活生・主婦を泣かせる「企業詐称」フィッシング(6/8)
https://www.afpbb.com/articles/-/3523366?cx_part=top_category&cx_position=3

ネット上での個人情報の提供、約7割の人がキャンペーン申し込み時に抵抗あり(6/8)
https://otona-life.com/life/234000/

TikTokはマルウェアに攻撃されたが、これはアカウントのハイジャックを避けるためのヒント(6/7)
https://voi.id/ja/teknologi/387996

業界別の最新AI導入事例16選！AI市場の現状と導入AIの種類を理解してビジネスを加速させよう！(6/8)
https://xrcloud.jp/blog/articles/business/20256/

民間通信データの適正利用　独立機関が監督(6/8)
https://www.nikkei.com/article/DGKKZO81260970X00C24A6EA3000/

サイバー防御、国が一元的に　米欧参考に民間引き込み(6/7)
https://www.nikkei.com/nkd/company/article/?DisplayType=1&ba=1&ng=DGXZQOUA066TA0W4A600C2000000&scode=6701

サイバー防御、国が主導
法整備へ有識者会議、米欧参考に民間と協力(6/8)
https://www.nikkei.com/article/DGKKZO81260910X00C24A6EA3000/

岸田首相がサイバー攻撃に関して関連法案とりまとめを指示　「通信の秘密」などとの整合性が課題に(6/7)
https://news.livedoor.com/article/detail/26557107/

「ニコニコ動画」で障害 原因は大規模なサイバー攻撃「経路および情報漏洩の可能性を調査中」(6/8)
https://www.newscafe.ne.jp/article/2024/06/08/2911087.html

ディープフェイクによる「偽情報」に注意を...各国で、選挙の妨害を狙った「サイバー工作」が多発(6/8)
https://www.newsweekjapan.jp/kumar/2024/06/post-6.php

激増中のサイバー犯罪”自分は大丈夫”は過信　「個人情報」の漏洩に気がついたら優先的にすべき対応とは(6/8)
https://news.yahoo.co.jp/articles/827ba28c3cc52ff0f6daa66897a1eee714cfa600?source=rss

女性政治家の「偽・ビキニ写真」に、蔡英文の「偽・性スキャンダル」…各国の選挙を狙うサイバー脅威の実態(6/8)
https://news.yahoo.co.jp/articles/5b02cc0fb8c4f11e202fff95bc3f55ef35465a5c?source=rss

町田徹のふかぼり!(2024.6.7放送分)
https://www.radionikkei.jp/podcast/fukabori/2024531.html

【横須賀市】委託業務受託事業者のサーバーに対する不正アクセスが発生(6/8)
https://shonanjin.com/news/yokosuka-fraud-access-20240608-2/
DIVER OSINT CTF 簡易Writeup

# はじめに
2024/06/08 (土) 12:00 (JST) - 06/09 (日) 12:00 (JST)の期間で開催された[DIVER OSINT CTF](https://ctfd.diverctf.org/)に参加したので備忘録的に。
面白かった問題だけ書きます。

# introduction
## ad_directiare
> この名刺の人物が、東京出張時に食べた昼ご飯の値段を答えよ。
Flag形式: Diver24{値段}
1000円の場合、Flagは Diver24{1000} となります。
Answer the price of the lunch this person on the business card had on a business trip to Tokyo.
Flag format: Diver24{price}
If it is 1000 JPY, the flag should be Diver24{1000}

![ad_directiare.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901407/b09d3565-23fc-aee0-17a4-392bf4623150.jpeg)

yone.junの昼食の値段を当てよという問題。
まずヒントになりそうなものとして「よねくらデザイン事務所」を検索するもヒットせず。
Google Mapsで住所を検索しても、こちらもヒットしない。
ほかには何かないかと探していた時、ふとGmailアドレスから何か情報が得られるのでは？とひらめいた。

yone.jun.0727@gmail.comをただ検索してもなにもヒットしなかったので、ツールを探すことに。

https://osintframework.com/
> OSINT framework focused on gathering information from free tools or resources. The intention is to help people find free OSINT resources. Some of the sites included might require registration or offer more data for $$$, but you should be able to get at least a portion of the available information for no cost.

OSINT関連のツールをまとめてくれているサイトがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901407/7cf490f1-52dd-f0b0-c656-102193c2a817.png)

Email Address > Email Search > GHunt(T)を使用します。

https://github.com/mxrch/GHunt

なんやかんやのインストールを済ませ、`ghunt email yone.jun.0727@gmail.com`でGmailを調査してみます。

![VirtualBox_kali_10_06_2024_02_48_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901407/d4f1b4bf-cb51-6c74-5320-7914506dbf14.png)

`https://www.google.com/maps/contrib/104607974422086075165/reviews`という興味深いURLが見つかりました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901407/11367f11-47c2-58e3-c2de-ff1e9c38137f.png)

URLを開いてみるとレビューが残されています。お昼ご飯の金額もそこに記載されていました。


# おわりに
ちょっとしか参加できなかったですが、OSINT問は技術力のない自分でも結構解ける問題があって面白いです。
なおかつ深めようと思えばどこまででも深められます。
CTF参加の入り口として皆さんも参加してみてはいかがでしょうか。
ResponseEntityのgetHeaders()メソッドはHttpHeadersオブジェクトを返すが読み取り専用。変更するには

```java
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;

...

// 既存のResponseEntityからHttpHeadersを取得
HttpHeaders headers = responseEntity.getHeaders();

// 新しいHttpHeadersオブジェクトを作成して、既存のヘッダーをコピー
HttpHeaders newHeaders = new HttpHeaders();
newHeaders.putAll(headers);

// Content-Typeヘッダーのcharsetを変更
newHeaders.set("Content-Type", "application/json; charset=UTF-8");

// 変更したヘッダーと元のBodyで新しいResponseEntityを作成
ResponseEntity<String> newResponseEntity = new ResponseEntity<>(responseEntity.getBody(), newHeaders, HttpStatus.OK);

// 新しいResponseEntityを返す
return newResponseEntity;
```

HttpHeaders.writableHttpHeadersはやめたほうがいい
理由は、Spring Framework 6.2に非推奨になるため

Deprecate HttpHeaders.writableHttpHeaders #32116
https://github.com/spring-projects/spring-framework/issues/32116
Snowsightダークモードの設定方法、そしてダークモードの歴史

SnowsightはSnowflakeのWeb UIです。そのSnowsightがダークモードに対応しました！2024年6月時点ではPublic Preview (PuPr)です。  
このPuPrは2024/6/4のData Cloud Summit 2024のPlatform Keynoteのラストで大々的に発表されて会場を沸かせていました。なんでエンジニアはそんなにダークモードが好きなんだ！  

https://x.com/SnowflakeDB/status/1798446610709688470

ダークモードに切り替えると文字の配色はこれまでグレーだった文字は白に、それ以外の色付きの文字は少し明るい色になります。  
個人的にはクエリハイライトの背景色が少し目立つようになった印象。  

![Example](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/18bf4949-ae22-8145-ef46-d5711c747b8b.png)

## Snowsightダークモードの設定方法

初回ログインのときに必ず聞かれるのでそこで選択するだけです。  

![Dark-mode first setting](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/b880f8e8-b263-48a6-e8bb-7d9ec7fa4e48.png)

また、変更したいときは左下のユーザをクリックして「外観(Appearance)」メニューから設定できます。  

![Dark-mode change setting](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/0d427d1d-c70d-1c4d-95bc-9990ca894896.png)

なお、SQLでSnowsightの設定を変更する方法は見つかりませんでした。  
ダークモードはともかく、デフォルト言語は設定できてもいいような気がする[^1]んですが…方法をご存じの方は教えてください。  

[^1]: 社内に展開するときは日本語に設定する方法を毎回教えています。でも稀に日本語だとバグるときがあるんですよね…

## Snowsightダークモードのドキュメント

[ドキュメント](https://docs.snowflake.com/en/user-guide/ui-snowsight-profile#specify-appearance)も更新されています。  

https://docs.snowflake.com/en/user-guide/ui-snowsight-profile#specify-appearance

## ダークモードの歴史

初期のコンピュータはもともとブラウン管で情報を表示していました。ブラウン管は蛍光物質が塗られたガラスに電子ビームを当てて発光させる仕組みなのですが、この時代はまだ画面全体を発光させる能力がなかったので、黒い画面に記号だけを光らせるものでした。  
ダークモードこそがディスプレイの起源だった…！  

https://youtu.be/cozcXiSSkwE?t=244

しかしながら、その後、表示機器が徐々に液晶ディスプレイにシフトしていきます。  
液晶ディスプレイは電圧を加えると光を遮断する液晶を用いてバックライトからの光をピクセル単位ごとに遮断することで情報を表示するという仕組みです。  

https://www.youtube.com/watch?v=8R9yQTqEvN4

https://www.tel.co.jp/museum/exhibition/principle/liquid-crystal.html

この仕組み上、画面上に占める黒いピクセルが多いほど電力を消費する…ということなのですが、例えばOSのGUIがライトモードを採用したのはそのことが理由なのかどうかは定かではないです。意外と「今までのデザインよりモダンに感じるから」というデザイン上の理由だったのかもしれませんね。  

なお、有機EL(OLED)ディスプレイは有機EL素子そのものが発光することで情報を表示する仕組みなので、画面上に占める黒いピクセルが多いほど電力を節約できます。  
ダークモードは省エネだ！という論説は有機ELディスプレイが前提になっています。  

https://www.youtube.com/watch?v=xAMhX3Drq14

https://developer.android.com/develop/ui/views/theming/darktheme?hl=ja

その後、2019年頃からiOSやGoogle Chromeなどがダークモードに対応したことがダークモードブームに繋がったようです。  

https://support.apple.com/ja-jp/118392

https://developer.chrome.com/blog/new-in-chrome-73?hl=ja

### ダークモードは本当に目にやさしいのか、集中できるのか

これらのテーマに関する研究はちょこちょこ行われているようです。しかしながらそれを理解できるだけの知見が私にはありません…  
現状は状況によってはという感じで、決定打はないような印象です。  

https://www.sciencedirect.com/science/article/abs/pii/S0003687016302459

## ダークモードについての先行記事

ダークモードについては以下の記事がより分かりやすく詳細にまとめられています！  

https://qiita.com/pon_u/items/d5222201c87f1706ea5c

https://zenn.dev/overflow_offers/articles/20220519-thinking-about-dark-mode
[FlutterFlow] Supabase Edge FunctionsをDartで書くための手順

# 背景＆目的
以前はFirebase × FlutterFlowでアプリ開発を行っており、バックエンドインフラは主にGCP(Firebase・Cloud Run・CloudScheduler等)を使っていました。

しかし、NoSQLだとサービス規模の肥大化に伴い、使われていないフィールドが溜まってしまうことや、マーケターがSQLでの分析を行いづらいことからFirebase→Supabaseへの移行を検討しています。

そこで、今回はSupabaseでCloud Runのようなバックエンド構築を行う手順をまとめました。

今回はSupabase CLIをPCのローカル環境にインストールするまでの手順を解説します。

# 1.ローカル開発環境の構築
Supabase CLIをPCにインストール→開発→デプロイの流れで解説します。

### Supabase CLIをPCにインストール
現在(2024/6月時点)Supabase CLIにはインストーラーが存在しないため、PowerShell(Windows)もしくはターミナル(Mac)を使用してインストールを行います。また、Windowsの場合はScoopというパッケージ管理ツールを経由してインストールを行う必要があります。

また、Windowsの場合はMacのhome brewのように最初からパッケージ管理ツールがインストールされているわけではないので、scoopのインストールが必要になります。

#### 1.Scoopをインストールする(Windowsのみ) - Macの方はスキップしてください
まず、以下のコマンドを実行する。
```
Set-ExecutionPolicy RemoteSigned -scope CurrentUser
```
上記を実行すると以下の様に聞かれるので、yと入力してEnter

```
Execution Policy Change
The execution policy helps protect you from scripts that you do not trust. Changing the execution policy might expose you to the security risks described in the
about_Execution_Policies help topic at https:/go.microsoft.com/fwlink/?LinkID=135170.
Do you want to change the execution policy?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"): Y
```

次に以下のコマンドを実行する
```
invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')
```

以上でScoopのインストールが完了します。

```
'scoop' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

上記のようなエラーが出てしまった方は【コントロールパネル】→右上のサーチバーに"環境変数"と入力し、【システム環境変数の編集】→【詳細設定タブの環境変数をタップ】→ユーザーの環境変数のPATHに「C:\Windows\system32」を追加しましょう。

![スクリーンショット 2024-06-10 020320.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778942/5c8f4748-d4e0-5d8c-9a0f-4ca2b150c065.png)

#### 2.Supabase CLIをインストールする
Supabase公式ドキュメント(https://supabase.com/docs/guides/cli/getting-started?queryGroups=platform&platform=windows) に従い、Supabase CLiをインストールしましょう。


##### ・Windowsの場合
まず、以下のコマンドを実行します
```
scoop bucket add supabase https://github.com/supabase/scoop-bucket.git
```

次に、以下のコマンドを実行します。
```
scoop install supabase
```

##### ・Macの場合
まず、以下のコマンドを実行します
```
brew install supabase/tap/supabase
```

次に、以下のコマンドを実行します。
```
brew upgrade supabase
```

以上でSupabase CLIのインストールが完了します。
AlfredからDeepLを使う（無料版、追加インストールなし）

以下の記事を参考に作る

https://qiita.com/zeero/items/bb32d5baeb3ae5b01977

1. Alfred Preference > Features > Web Search > Add Custom Search
1. ``https://www.deepl.com/translator#en/ja/{query}``をSearch URLに置く
    - 日本語→英語にしたかったら，``#ja/en/``に変えてください

たとえば「c」で呼び出しにし「c this is a pen」とすると「これはペンです」が出力される
情報処理学会の神LINEスタンプ

ゼミ発表や学会発表で教員から右ストレートを喰らったことはないだろうか。
「その新規性って何？」
「〇〇でよくない？」

技術者あるある（？）のLINEスタンプが情報処理学会から発売されているので共有。
https://store.line.me/stickershop/product/1347780/ja

このスタンプでチームのコミュニケーションが活性化すると思われるが、使い所を間違えると相手のトラウマを抉ることになるので要注意。
弊研究室の同期で使っているが、好反応が返ってくることはまず無い。
【Python】便利なenumerate関数の使い方

# はじめに
本記事ではPythonの enumerate() 関数の使い方について紹介します。


# enumerate関数とは？
enumerate() 関数はリストなどのイテラブルなものをループ処理する際に、要素のインデックスと値を同時に取得する事が可能な関数です。

https://docs.python.org/ja/3/library/functions.html#enumerate


# 使用例1（インデックスと値を同時に取得する）

以下のようにenumerate()関数を使うことで、リスト要素とそのインデックスを取得できます。
```python:main.py
fruits_list = ['apple', 'banana', 'orange']

for index, value in enumerate(fruits_list):
    print(f'インデックス: {index}, 値: {value}')
```

上記のソースを実行すると次のように出力されます。

```:出力
インデックス: 0, 値: apple
インデックス: 1, 値: banana
インデックス: 2, 値: orange
```

# 使用例2（インデックスの開始値を変更する）
enumerate()関数は、第二引数で開始するインデックスを指定することができます。デフォルトでは0から始まりますが、任意の値に変更することができます。
次のソースでは`start=3`でインデックスを`3`から始めています。

```python:main.py
fruits_list = ['apple', 'banana', 'orange']

for index, value in enumerate(fruits_list, start=3):
    print(f'インデックス: {index}, 値: {value}')
```

上記のソースを実行すると次のように出力されます。
```:出力
インデックス: 3, 値: apple
インデックス: 4, 値: banana
インデックス: 5, 値: orange
```
【Flutter】デバッグ時に画面が真っ黒になってしまう場合の対処法

# はじめに
Flutterで開発をしているとエミュレータが突然真っ黒になり、開発中のアプリが表示できなくなりました。
本記事はその際に対処方法をまとめたものになります。

# 環境
- エミュレータ：Pixcel 3a API34
- Android Studio Jellyfish | 2023.3.1

# 事象
以下の画像のように突然エミュレータの画面が真っ黒になった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/58587bbc-94a9-4d72-45e4-c063bf797ff5.png)

# 結論
android studioから対象のエミュレータを選択し`wipe data`で初期化すると事象は解決した。

# WipeDataでの初期化
android studioを開きます。
More Action > Virtural Device Manager を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/14985886-a8d9-7135-8c06-e37a1bad5c18.png)


「：」をクリックすると、`wipe data`の項目が表示されるのでこれを選択し初期化する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/7988b644-5956-9806-51b7-ee6a5d8750bf.png)

ここまでやった後、再度エミュレータを起動しデバッグを行ってみると事象は改善しました。


# 参考
- https://qiita.com/suzutsuki0220/items/a54f4966574e38ec26f9
【AWS】Lambdaから別のLambdaを同期的に呼び出す

# はじめに
本記事ではLambdaから別のLambdaを同期的に呼び出す方法について備忘録も兼ねてまとめたものになります。


# 環境
- python: 3.12


# 関数を呼び出す側のLambda

Lambda > 関数 > 関数の作成から呼び出す側のLambdaを作成します。
今回は名前を`call_lambda`としています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/75b0097e-7a0e-1ed6-86ed-21934d3a4d5a.png)

別のLambda関数を呼び出すのにデフォルトのロールだけだと権限が足りないので追加します。
設定タブ > アクセス権限 > ロール名をクリックしIAMに移ります。
IAM側では許可を追加 > インラインポリシーを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/8c596088-1b3d-3541-d6da-d0fdbe281c4f.png)

別のLambda関数を呼べるようにポリシーを修正します。

```json:json
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"lambda:InvokeFunction"
			],
			"Resource": [
				"*"
			]
		}
	]
}
```
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-api-permissions-ref.html


### Lambdaのソース（呼び出す側）
下記のソースで別のLambda関数（今回は`called_lambda`）を呼び出します。

```python:lambda_function.py
import boto3
import json

def lambda_handler(event, context):
    client = boto3.client('lambda')
    
    item1 = event['item1']
    item2 = event['item2']
    
    payload = {'item1':item1, 'item2':item2}
    
    response = client.invoke(
        FunctionName='called_lambda',
        InvocationType='RequestResponse',
        Payload=json.dumps(payload)
    )
    
    response_payload = json.loads(response['Payload'].read())
    
    return response_payload
```

<details><summary>イベントJSON</summary>

```json:イベントJSON
{
  "item1": "apple",
  "item2": "banana"
}
```

</details>

:::note info
InvocationTypeについて
- 同期的に呼び出す場合：RequestResponse
- 非同期の場合：Event

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/lambda/client/invoke.html

:::




# 呼び出される側のLambda

Lambda > 関数 > 関数の作成から呼び出される側のLambdaを作成します。
今回は名前を`called_lambda`としています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/7933de16-85bf-9626-4a4c-b53fb641a765.png)


### Lambdaのソース（呼び出される側）
この関数（今回は`called_lambda`）が呼ばれた際には、以下のようにレスポンスを作成します。

```python:lambda_function.py
import json

def lambda_handler(event, context):
    item1 = event.get('item1')
    item2 = event.get('item2')
    
    response = f'レスポンス：called_lambda関数に{item1}と{item2} は正常に渡されました'
    
    return response
```

# 実行 & 結果確認
関数を呼び出す側のLambda（call_lambda）においてイベントJSONを設定後にテスト実行します。
結果を確認すると、呼び出される側のLambda（called_lambda）で設定した文言が返ってきている事が確認できました。


```:Response
"レスポンス：called_lambda関数にappleとbanana は正常に渡されました"
```
【Python】python-dotenvを使用し環境変数を読み込む

# はじめに
外部に公開したくないAPIキーなどの情報はgit管理の対象から外し、`.env`ファイルに記載した環境変数として使用したいです。


# 環境
Python 3.12.2

# モジュールのインストール

次のコマンドでインストールします。

```
pip install python-dotenv
```

https://pypi.org/project/python-dotenv/


# envファイルの準備

サンプルとして次のように`SAMPLE_KEY`を記載した`.env`ファイルを準備します。

```:.env
SAMPLE_KEY='hello_test_key'
```

# .envファイルをgit管理の対象から外す
`.env`ファイルはgit管理の対象としたくないので、次のように`.gitignore`ファイルを作成する。

```:.gitignore
.env
```


# envファイルの読み込み

```python:main.py
# dotenvの読み込み
from dotenv import load_dotenv
import os

# .envファイルの読み込み
load_dotenv()

# 環境変数の取得
sample_key = os.getenv('SAMPLE_KEY')
print(sample_key)
```

上記ソースを実行すると、`.env`ファイルに記載した環境変数が出力される事が確認できた。

```:ログ
hello_test_key
```
【Python】json.dumps() でJSON形式に変換する方法

# はじめに

本記事ではPythonの enumerate() 関数の使い方について紹介します。

# 環境
Python 3.12.2

# json.dumps()とは？
json.dumps()はPPythonの標準ライブラリであるjsonモジュールに含まれる関数で、データ構造をJSON形式に変換するために使用できる。

https://docs.python.org/ja/3/library/json.html

# 使用例1（JSON形式に変換）

辞書型のオブジェクトをJSON形式の文字列に変換します。

```python:main.py
import json

# 辞書型のオブジェクト
data = {
    "name": "tarou",
    "hobby": "baseball",
    "city": "tokyo"
}

# JSON形式の文字列に変換
json_string = json.dumps(data)

print(json_string)
```

上記のソースを実行すると次のように出力されます。

```:ログ
{"name": "tarou", "hobby": "baseball", "city": "tokyo"}
```

# 使用例2（インデントをつける）

インデントを付けることでJSONを見やすく整形する。

```python:main.py
import json

# 辞書型のオブジェクト
data = {
    "name": "tarou",
    "hobby": "baseball",
    "city": "tokyo"
}

# JSON形式の文字列に変換

json_string = json.dumps(data, indent=4)

print(json_string)
```

上記のソースを実行すると次のように出力されます。
使用例1より見やすくなりました。

```:ログ
{
    "name": "tarou",
    "hobby": "baseball",
    "city": "tokyo"
}
```

# 使用例3（キーのソート）

JSONのキーをアルファベット順にソートする。

```python:main.py
import json

# 辞書型のオブジェクト
data = {
    "name": "tarou",
    "hobby": "baseball",
    "city": "tokyo"
}

# JSON形式の文字列に変換
json_string = json.dumps(data, indent=4, sort_keys=True)

print(json_string)
```

上記のソースを実行すると次のように出力されます。

```:ログ
{
    "city": "tokyo",
    "hobby": "baseball",
    "name": "tarou"
}
```
スプレットシートでQRコードの生成

# はじめに
・ここではスプレットシートにURLを入力するとQRコードを生成する方法を紹介します
・スプレットシートはセルにやってほしいことを入れると、その指示に従って何かしらの出力をしてくれます。
・今回の場合、指示はImage関数を使ってQRコードを生成して表示します。

## Image関数について
・セルに画像を挿入できる関数です。
・そのほかにも画像の大きさを変更することができます。
[公式リファレンス](https://support.google.com/docs/answer/3093333?hl=ja "Google Chart API")



```
=IMAGE("https://support.google.com/docs/answer/3093333?hl=ja")

=IMAGE(A2,2)

=IMAGE(A2,4,120,200)
```


<table>
  <caption>Imageの構文</caption>
  <thead>
    <tr>
      <th>パラメータ</th> <th>内容</th>
    </tr>
  </thead>
  <tr>
    <td> URL </td> <td>画像の URL です。プロトコル（http:// など）も含めます。</td>
  </tr>
  <tr>
    <td> モード </td> <td>[省略可 - デフォルトは 1] - 画像のサイズモードです。</td>
  </tr>
  <tr>
    <td> 高さ </td> <td>[省略可] - 画像の高さをピクセルで指定します。<br>カスタムの高さを設定するには、モードを 4 にする必要があります。</td>
  </tr>
  <tr>
    <td> 幅 </td> <td>[省略可] - 画像の幅をピクセルで指定します。<br>カスタムの幅を設定するには、モードを 4 にする必要があります。</td>
  </tr>
</table>

<table>
    <thead>
        <caption>モードの種類</caption>
    </thead>
        <tr>
          <th>パラメータ</th> <th>内容</th>
        </tr>
        <tr>
            <td>1</td> <td>アスペクト比を維持しながら、セル内に収まるように画像のサイズを変更します。</td>
        </tr>
        <tr>
            <td>2</td> <td>アスペクト比を無視してセル内に収まるように画像を引き伸ばすか縮めます。</td>
        </tr>
        <tr>
            <td>3</td> <td>画像を元のサイズのままにします。その場合、画像がトリミングされることがあります。</td>
        </tr> </tr>
        <tr>
            <td>4</td> <td>カスタムサイズに変更できます。</td>
        </tr>
</table>
<details><summary>イメージ画像</summary>

![スクリーンショット 2024-06-09 234310.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658955/a4fa4c1b-cfe9-8bd1-ddfc-7bfb080d2590.png)

</details>

## QRコードの生成
・QRコードを生成するためにImageとGoogle Chart APIを利用します。
・A1のセルにURLを書いて別のセルにしたのコードをコピペするだけで大丈夫です。

[Google Chart API](https://developers.google.com/chart?hl=ja "Google Chart API")

```
=image("https://api.qrserver.com/v1/create-qr-code/?data="&ENCODEURL(A1))
```
Qiita APIを使用し過去に自分が書いた記事一覧情報を取得する

# はじめに
本記事では、Qiita APIを使用して、自分が書いた記事の一覧を取得し、それをJSON形式で出力する方法についてまとめてます。

# 対象の方
- Qiita Apiを叩いて自分が書いた記事一覧を取得したい方
- Qiita Apiを触ってみたい方
- タイトルが気になった方


# 本記事のゴール
以下のように自分が作成した記事のタイトル、作成日時、リンクの一覧をJSON形式で出力する。

```json:qiita_articles.json
[
    {
        "title": "記事のタイトル",
        "created_at": "記事の作成日時",
        "url": "記事のリンク"
    },
    {
        "title": "記事のタイトル",
        "created_at": "記事の作成日時",
        "url": "記事のリンク"
    },
    {
        "title": "記事のタイトル",
        "created_at": "記事の作成日時",
        "url": "記事のリンク"
    },
]
```

# 前提
Qiita Apiのアクセストークンが取得できている事

# 環境
Python 3.12.2

# 環境変数の準備

Qiita Apiのアクセストークンを環境変数として管理したいので`.env`ファイルを作成。

```:.env
QIITA_ACCESS_TOKEN="XXXXXX"
```

`.env`ファイルはgit管理の対象外としておきます。

```:.gitignore
.env
```

# モジュールのインストール
環境変数を読み込むために`python-dotenv`をインストールします。

```
pip install python-dotenv
```
https://pypi.org/project/python-dotenv/

# ソース

以下のソースで自分の書いた記事のタイトル、記事の作成日、記事のURLの3点を取得し、JSONファイルに書き出します。詳細はソース内のコメントの通りです。

```python:main.py
import os
import json
import requests
from dotenv import load_dotenv

# .envファイルの内容を読み込見込む
load_dotenv()

# Qiitaのアクセストークンを設定
def get_qiita_token():
    qiita_token = os.environ.get('QIITA_ACCESS_TOKEN')
    if not qiita_token:
        print('環境変数 QIITA_ACCESS_TOKEN が設定されていません。')
        return None
    return qiita_token

# Qiita記事の一覧を取得
def get_qiita_articles():
    qiita_token = get_qiita_token()
    headers = {
        'Authorization': f'Bearer {qiita_token}'
    }

    articles = []

    # 全ての記事を取得
    page = 1
    while True:
        url = f'https://qiita.com/api/v2/authenticated_user/items?page={page}&per_page=100'
        response = requests.get(url, headers=headers)

        if response.status_code == 200:
            page_articles = response.json()

            # 記事がない場合、取得を終了
            if not page_articles:
                break
            articles.extend(page_articles)
            page += 1
        else:
            print('取得に失敗しました。')
            return None

    article_details = [
        {
            'title': article['title'],
            'created_at': article['created_at'],
            'url': article['url']
        } for article in articles
    ]
    return article_details

# 本スクリプトを実行
if __name__ == "__main__":
    result = get_qiita_articles()
    if result:
        with open('qiita_articles.json', 'w', encoding='utf-8') as f:
            json.dump(result, f, indent=4, ensure_ascii=False)
        print('JSONファイルが生成されました: qiita_articles.json')
```

# 実行 & 結果確認

次のコマンドでスクリプトを実行し結果を確認します。

```terminal
python main.py
```

スクリプトを実行すると`qiita_articles.json`ファイルが生成されます。
JSONの中身は以下のようになっているところまで確認。

```json:qiita_articles.json
[
    {
        "title": "記事のタイトル",
        "created_at": "記事の作成日時",
        "url": "記事のリンク"
    },
    {
        "title": "記事のタイトル",
        "created_at": "記事の作成日時",
        "url": "記事のリンク"
    },
    {
        "title": "記事のタイトル",
        "created_at": "記事の作成日時",
        "url": "記事のリンク"
    },
]
```


# 参考
https://qiita.com/api/v2/docs
【Bledner】オブジェクトの結合と分離をショートカットキーで手軽に行う

# はじめに
本記事はBlednerでオブジェクトの統合と分離を行うショートカットを備忘録もかねてまとめたものになります。


# オブジェクトの統合

### ◆ショートカットキー： `Ctrl+J`

https://docs.blender.org/manual/ja/latest/scene_layout/object/editing/join.html


オブジェクトを2つ準備します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/837b1bde-8d80-7fe7-5f0d-cb7a31dde948.png)


2つのオブジェクトを選択します。`Shift`キーを押下した状態で2つ目のオブジェクトは選択できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/86f1d7cf-2b9e-6fd6-fb7c-a3110849992c.png)


オブジェクトを選択した状態で`Ctrl+J`を押下し、2つのオブジェクトを統合できました。
これで統合したオブジェクトをまとめて移動させることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/b11a71d3-314c-f6d2-3936-0271070dd7a0.png)




# オブジェクトの分離

統合したオブジェクトを分離させ統合前の状態に戻したい時は編集モードから、対象のオブジェクトを選択しショートカットキー`P`から分離できます。

### ◆ショートカットキー： `P`

https://docs.blender.org/manual/ja/latest/modeling/meshes/editing/mesh/separate.html


編集モードから対象のオブジェクトを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/46d4af3e-87f5-d77b-bba6-a5e30d7ae0b0.png)


ショートカットキー`P`から`選択`を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/7730f3a5-5e74-9796-b89c-0df9cf128b08.png)


オブジェクトを分離させて別々に選択できるよう事を確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/cb19d197-913f-f599-0d2c-511e1ec57e2c.png)
【AWS】BedrockのClaudeモデルを使用してLambdaからリクエストを送信する方法

# はじめに
本記事は、Amazon BedrockのClaudeモデルを使用してLambda関数からリクエストを送信し、生成されたレスポンスを取得する方法について備忘録も兼ねてまとめたものです。

# 環境
Python 3.12

# 前提
- Bedrockのclaude2.1が使用できる状態であること

# Lambda関数の作成
マネジメントコンソールからLambda関数を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/4d00c7f2-fb53-94c3-7b43-409c0ef12a99.png)

デフォルトの権限ではIAMポリシーが不足しているため権限を追加します。
今回はBedrockのフルアクセス権限付与しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/73aff17f-d5e0-77cc-4af0-fa5d27652bff.png)

Lambdaにデフォルトで設定されてるタイムアウトの設定は3秒ですが、これではBedrockへのリクエスト時にタイムアウトしてしまうことがあるので、20秒くらいにしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/06b518f4-91d0-bbe4-6fb8-d4b05d325d87.png)


# ソース

下記のソースではBedrockのClaudeモデルにプロンプトを送信し生成された回答を取得します。
プロンプトはLambda関数のイベントJSONに記載しておきます。

```python:
import json
import boto3

def invoke_claude_model(prompt):
    bedrock_runtime = boto3.client(service_name='bedrock-runtime')
    
    # モデルのIDと最大トークン数を設定
    model_id = 'anthropic.claude-v2:1'
    max_tokens = 1000

    # リクエストボディを作成
    body = json.dumps(
        {
            "anthropic_version": "bedrock-2023-05-31",
            "max_tokens": max_tokens,
            "messages": [
                {"role": "user", "content": prompt}
            ]
        }
    )
    
    # Bedrockモデルを呼んでレスポンスを取得
    response = bedrock_runtime.invoke_model(body=body, modelId=model_id)
    response_body = json.loads(response.get('body').read())
    
    # レスポンスから生成された回答を抽出
    text_content = response_body["content"][0]["text"]
    
    return text_content


def lambda_handler(event, context):
    try:
        # イベントからプロンプトを取得
        prompt = event['prompt']
        
        # Bedrockモデルを呼び出して回答を取得
        response = invoke_claude_model(prompt)

        return {
            'statusCode': 200,
            'body': json.dumps(response, ensure_ascii=False)
        }

    except Exception as e:
        # エラーが発生した場合
        return {
            'statusCode': 500,
            'body': json.dumps({'error': str(e)})
        }
````

# 実行 & 結果確認
LambdaのイベントJSONにはBedrockモデルに渡すプロンプトを記載しておく。

```json:イベントJSON
{
    "prompt": "claudeは何が得意ですか？一言で簡単に教えてください。"
}
```

プロンプトを設定出来たらLambdaでテスト（ctrl+shift+i）実行をさせてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/0674c462-3511-06aa-dc9b-36a7a7e25caf.png)

3秒程度でレスポンスが返ってくる事を確認できました。

```json:Response
{
  "statusCode": 200,
  "body": "\"はい、ClaudeはAIシステムですので、その機能に関して一言で簡単に説明すると「会話」が得意です。\""
}
```





# 参考

https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/model-parameters-anthropic-claude-messages.html
Databricks にて開発時などにデータエンジニアリングパイプラインのノートブックを実行する際には dbutils.notebook.run で実行することがおすすめ

## 概要

Databricks でデータエンジニアリングパイプラインのノートブックを開発時に実行する際は、`dbutils.notebook.run` を使用することを推奨します。Databricks ノートブックでは、実行環境（`prd`、`stg`、`dev` など）に応じてカタログを切り替える必要がある場合や、更新日列に静的なタイムスタンプ文字列を設定する場合に、Databricks ウィジェットの利用が有効です。ノートブック上で Databricks ウィジェットの値を変更することも可能ですが、多くのパラメータを設定する際には誤りが生じる可能性があります。`dbutils.notebook.run` を用いてパラメータを渡すことで、パイプラインの実行をより確実かつ容易に行うことができます。

## 手順

### 実行するノートブックの絶対パスを取得

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ca6c8dfd-1f7d-36c7-e74b-210a81ef800d.png)

### ノートブック実行に必要な変数を定義

```python
# 実行するノートブックの絶対パスを定義
tgt_notebook_path = "/Workspace/Shared/qiita/db_auto_loader_by_parameters"

# ソースファイル
file_dir = "dbfs:/FileStore/manabian_test/files"
checkpoint_location = "dbfs:/FileStore/manabian_test/_checkpoint"
row_of_input_tbl_name = "hive_metastore.auto_loader_test.nation__row_of_input"
raw_of_output_tbl_name = "hive_metastore.auto_loader_test.nation__row_of_output"
row_of_error_tbl_name = "hive_metastore.auto_loader_test.nation__row_of_error"

# タイムアウト時間を定義
timeout = 0

# ノートブックに渡すパラメータを定義
ut_conf_json = json.dumps(
    {
        "src_file_path": file_dir,
        "checkpoint_location": checkpoint_location,
        "tgt_row_of_input_tbl_name": row_of_input_tbl_name,
        "tgt_row_of_output_tbl_name": raw_of_output_tbl_name,
        "tgt_row_of_error_tbl_name": row_of_error_tbl_name,
    }
)
nb_para = {
    "deploy_env": "ut",
    "ut_conf": ut_conf_json,
    "trigger_ts": "2024-01-01 12:34:56",
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f5e68733-73e9-0833-829a-ece56743b241.png)

### `dbutils.notebook.run`によりノートブック実行

```python
# ノートブック実行
nb_results = dbutils.notebook.run(
    tgt_notebook_path,
    timeout,
    nb_para,
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8736e251-0378-840f-207e-77ffd3be415a.png)
2024年上半期のWi-Fi事情

# 日進月歩なWi-Fi
最近はWi-Fi 7なるものが登場したので整理する。

# 我々を取り巻く通信環境の変化
- 10 Gbpsの光通信対応エリアの増加
- 通信トラフィックの増加
- 新たな周波数帯の解禁
## 固定回線の進化
長らく固定回線は1Gbpsが主流だったが、数年前に10Gbps対応のサービスが登場し、ここ最近は対応エリアも広くなった。
## 増え続ける通信トラフィック
別に悪いことではないのだが、[総務省資料](https://www.soumu.go.jp/main_content/000929698.pdf)によるとトラフィックはここ数年で急増している。いつか1Gbpsの固定回線なんて考えられない時代が来るのだろうか。
## 6GHz帯の解禁
2022年9月、電波法施行規則等の一部が改正されWi-Fi 6Eで6GHz帯が使用可能となった。
6GHzの解禁によりさらなる通信速度の向上が見込まれる。
iPhone15など対応する端末も増加し、~~10,000人に1人も知らなそうな11adとは違って~~ 順調に普及が進んでいる。

# Wi-Fi 6E と Wi-Fi 7の比較
以下の資料がおすすめ。
https://www.e-nexty.com/special_pages/articles/column_wifi

# Wi-Fi 7の対応機器について
2024年6月現在のWi-Fi 7の対応機器について調査した。
## Wi-Fiルーター
価格.comで「Wi-Fi 7（11be）」のみの条件で絞ったところ、わずか11製品しか表示されなかった。
- Buffalo：2製品
- ELECOM：1製品
- IODATA：1製品
- ASUS：1製品
- TP-LINK：6製品

なんと国内組総出でもTP-LINK一社に敵わないのである。NECは対応ルーターの発売すらしていない。2023年12月に認可されたばかりとはいえ普及が進んでいない。
よく考えてみれば、10Gbpsのエリアが広がったとはいえ一般家庭では1Gbpsで問題なく、導入する理由が無い。
そのため、ルーターを発売したところで売れないとメーカーは予測しているのだろう。高いし。

## スマートフォン
（技適が付いてる中では）Xiaomi 14 Ultraしか対応端末を見つけられなかった。Galaxy S24 Ultraですら非対応なのに。
おそらくiPhone 16では対応するかと思われるが、ミドルエンドやローエンドの端末での対応はもう少し後になるだろう。タダでできることでもないし、そもそもWi-Fi 7に対応させるくらいならFeliCaを搭載した方がよっぽど売れる。

# まとめ
6GHz帯は使われ始めたがWi-Fi 7の需要はまだ無い。低レイヤーが進化しても上が必要とするのは先の話だろう。
【Git】リポジトリに登録するファイルに実行権限を与える

# はじめに

Dockerコンテナの起動時に実行したいシェルスクリプトファイル（.sh）をGitリポジトリに上げて、それをクローンした開発者が実行すると権限の問題で実行できないということがありました。

よく考えたら当然のことなのですが、今までこのような経験がなかったのでメモに残します。

# .shファイルの権限

言うまでもありませんが、リポジトリをクローンした開発者には.shファイルの実行権限がないため、Dockerコンテナの起動時にエラーとなります。

そのため、Gitリポジトリ上にファイルを追加する際は.shファイルの権限を明示的に付与してあげないといけません。

実現する方法としては下記の2種類があります。

- ```git update-index --chmod=+x path/to/file```
- ```git add --chmod=+x path/to/file```

通常 ```git add```したファイルは GitHubのInternal Storage上で```10644```で管理されているが、上記のコマンドを実行すると```10755```で登録されます。

上記の登録状況は ```git ls-files --stage``` コマンドで確認することが可能です。

```sh
$ git ls-files --stage

100644 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 0 README.md
100755 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 0 sample.sh
```

# 参考資料

https://blog-smatsuzaki.hatenablog.com/entry/2023/06/24/195707
makeとappendの特性と理解

## 実装

```go
  s := make([]int, 5)

  s = append(s, 1, 2, 3)
	 fmt.Println(s)
	 
	// [0 0 0 0 0 1 2 3]
```

上記はmakeメソッドでスライスを作成しました。第一引数を省略するとlenが5のスライスが作成されます。その結果ゼロ値`[0, 0, 0, 0, 0]`となります。そこに上記のようなappendメソッドで要素を実行すると、余計なゼロ値に値が加わってしまいます。対策としては、下記のような記述になります。

```go
	s := make([]int, 0, 5)

	s = append(s, 1, 2, 3)
	fmt.Println(s)
	
	// [1 2 3]
```

上記の実装だとmakeメソッドで、len0でcap5のスライスが作成されます。その結果`[]`となります。そこに上記のようなappendメソッドで値を追加すると、余分なゼロ値を取り除いたスライスが作成できます。

## 参考記事

[Go言語のmakeについて - Qiita](https://qiita.com/atsutama/items/8330a930a0c309281134)
LeetCode挑戦日記：Day3

# はじめに

最近、業務で実装する時間よりも資料作成やレビューをする時間が多くなってきました。
このままでは自身のコーディング能力が落ちそうで怖いので、LeetCodeを始めてみました。

自身の学習の記録 & LeetCodeに興味のある人が挑戦しやすいように、記事に残していきます。
このような競技プログラミングをした経験がないので、ひよってEasyからやっていきます...

# [Easy] 605. Can Place Flowers

インプット：数値の配列、数値
アウトプット：真理値

インプットの数値の配列から、1が隣接しないように1を入れる。
入力の数値の数以上に1を入れらればtrueを返す。

## 素直に解いてみる

### 考え方

0. インプットの配列に入れられる1の個数を算出する
0. 算出した個数とインプットの数値を比較する

### コーディング

```typescript
function canPlaceFlowers(flowerbed: number[], n: number): boolean {
    let canPlaceNumber = 0;
    let plot2d = 0;
    let plot1d = flowerbed.shift();
    flowerbed.push(0);
    flowerbed.forEach((plot) => {
        if ((plot2d === 0) && (plot1d === 0) && (plot === 0)) {
            canPlaceNumber++;
            plot1d = 1;
        }
        plot2d = plot1d;
        plot1d = plot;
    });
    return n <= canPlaceNumber;
};
```

途中で`flowerbed.push(0);`しているのは、配列が`[..., 0, 0]`のように終わっているときに、`canPlaceNumber`をインクリメントしたいためです。

### 結果

Runtime：61ms
Beats 67.92% of users with TypeScript

Memory：52.01MB
Beats 59.59% of users with TypeScript
ストレスを予測して先回りしたら想像以上に良かった

## はじめに

◆この記事は何？
この記事ではストレスの予測と対策方法について紹介します。

◆対象は？
ストレスに悩む人

◆この記事のねらい
少しでも「ストレスとの向き合い方が上手くなる」のが目的です。

:::note warn
私はデータサイエンティスト/エンジニアで、ストレスの専門ではありません。
もし誤り等あれば、ご指摘いただけると幸いです。
:::

## 先に結論
- ストレスはある程度予測できる
- ストレスを先回りして対策を打つ
- 結果、ストレスに強くなった

## 背景

働いていると、ストレスは避けられません。

もちろん私も例外ではなく、働いているときにストレスを感じることがあります。

普段、私はデータサイエンティストとして働いています。
データ分析業務では「過去のデータを分析して未来を予測」しています。

データ分析から着想を得て「**ストレスも過去から予測できるのでは？**」と気づきました。

## ストレスを分析する

自分がいつストレスを感じていたか、過去を振り返りました。

その結果、3つの傾向に気づきました。

1. ネガティブなフィードバック
1. 締切
1. 新しい環境

1つ目は、「**ネガティブなフィードバックを受けたとき**」です。

例えば、顧客に結果を報告して、想定よりもネガティブなフィードバックが返ってきたときです。
期待に応えられなかったと感じることで失敗感や無力感を感じることがあります。

2つ目は、「**締め切りが近いとき**」です。

例えば、要件定義フェーズで短い締め切りに追われているときです。
決めなければならないこと、そのために必要な準備がたくさんある状況です。

時間の制約があると、限られた時間でタスクを完了させなければならないため心理的なプレッシャーが増幅します。

3つ目は、「**新しい環境**」です。

例えば、新しい配属や新しいプロジェクトへの参画です。

新しい環境では予測不可能な要素が多く、不安を感じやすいです。
不確実性や不安からストレスを生じることがあります。

このように、**過去のストレスを分析することで、傾向が分かり、ストレスを自覚できる**ようになってきました。

## ストレスを予測する

自分のストレスの傾向がわかったので、**予定**からストレスの発生をある程度予測できるようになってきました。

例えば、ネガティブなフィードバックを受ける可能性があるのは、①報告②面談③不確実性の高い会議です。

「明日は報告がある」ということは「明日はストレスを感じる可能性がある」と事前にわかります。

「締め切り」や「新しい環境」も同様に予定からある程度は予測できます。

## 先回りして対策する

ストレスを予測できるようになると、「**先回りして対策ができる**」と気づきました。

例えば、「明日は〇〇への報告があるから、仕事終わりにサウナを予約する」「金曜は〇〇の締め切りなので、週末は友人と遊ぶ予定を入れておく」といった対策ができます。

まとめると、
①予定からストレスを予測する
②ストレスを予測して、先に対策しておく
です。

## 結果良かったこと

上記の予測と対策をした結果、端的に言えば、**ストレスに強くなりました**。

ストレスが来ることを予測しているので、いきなりストレスを感じることがなく、受け流せるようになりました。
いきなりストレスを感じなくなったのも、私にとっては大きかったです。

事前に予測しているため、心の準備ができているのか、ストレスを軽減できるようになりました。

実際にストレスを感じても、すでに対策を打ってあるので、すぐにリカバリーができるようになりました。

また、ストレスを感じなかったとしても、ストレス発散は無駄ではありませんし、次のストレス予測につながるようになりました。

レジリエンス(精神的回復力)が強くなったと思います。

## おわりに

この記事では、私のストレス対策について紹介しました。

「予定からストレスを予測して、先に対策する」ということが、少しでも参考になれば幸いです。

それでは。
Macでエビデンス撮る時、いちいちローカルに保存してない？

# クリップボードにキャプチャを持つショートカット
command + control + shift + 4 
そのまま、メモ帳やエクセルにcommand + Vでペーストできる。

※保存したい時はcommand + shift + 4 （controlを押さない）


# 参考
https://support.apple.com/ja-jp/102646#:~:text=%E7%94%BB%E9%9D%A2%E3%81%AE%E4%B8%80%E9%83%A8%E3%82%92,%E5%90%8C%E6%99%82%E3%81%AB%E9%95%B7%E6%8A%BC%E3%81%97%E3%81%97%E3%81%BE%E3%81%99%E3%80%82&text=%E3%82%92%E3%83%89%E3%83%A9%E3%83%83%E3%82%B0%E3%81%97%E3%81%A6%E3%80%81%E7%94%BB%E9%9D%A2,%E6%8A%BC%E3%81%97%E3%81%AA%E3%81%8C%E3%82%89%E3%83%89%E3%83%A9%E3%83%83%E3%82%B0%E3%81%97%E3%81%BE%E3%81%99%E3%80%82
はじめてのKaggle① Kaggle登録～タイタニックコンペのサンプルデータ提出

## 概要
Kaggleのアカウントを作成して、サンプルデータを提出するまでの手順です。

## ゴール
タイタニックコンペのサンプルデータを提出するまでを行います。


## Kaggleとは

Kaggle（カグル）とは、データサイエンスや機械学習のコンペティションを提供するプラットフォームです。

用意された課題・データセットを基にモデルを構築し、予測精度を競い合うことで、他のデータサイエンティストの手法を学びながら、実践的な経験を積むことができます。


## タイタニック生存者予測とは

タイタニック生存者予測とは、Kaggle入門として有名なコンペで、タイタニック号の乗客データを用いて、乗客が生存したかどうかを予測するコンペです。

※本記事は予測モデル構築は行わず、用意されているテストデータの提出までを行います。


## 手順
以下より、Kaggleのアカウントを作成し、入門コンペとして最もメジャーである「タイタニックの生存者予測」のサンプルデータ提出までを行っていきます。

### 1. Kaggleのアカウント作成

- [Kaggleのウェブサイト](https://www.kaggle.com/)にアクセスします
- "Register" > "Register with Email"の順にクリックして進みます
- ユーザー名、メールアドレス、パスワードを入力します
⇒ メールアドレスの認証ができたら、アカウント作成は完了です

### 2. タイタニック生存者予測のサンプルデータ提出

   - [Titanic: Machine Learning from Disaster](https://www.kaggle.com/c/titanic)ページに移動します

- コンペティションページ内にある「Data」タブから、"Download All"をクリックし、提供されているデータセットをダウンロードします
- ダウンロードした"titanic.zip"を展開します
- コンペティションページ内にある「Submissions」タブから、"Submit Prediction"をクリックします。
- 「Submissions」タブ内の"Drag and drop file to upload"と書かれている場所に、展開したzip内の"gender_submission.csv"のファイルをドロップして"Submit"をクリックします。

<br>
    ⇒以下の画面が表示されたら、サンプルデータの提出は完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3357979/21517303-a52a-978a-2eaa-9a8f7933b807.png)




## まとめ

今回はKaggleのアカウントを作成し、サンプルデータの提出までを行いました。
今回提出した「gender_submission.csv」は男性は全員死亡し、女性は全員生存したという単純な回答になっていて、約76%の精度となっています。
次回以降、より精度を上げるためにモデル構築などを行っていきたいと思います。