OmniAICreator/Qiita-1.07M huggingface dataset:
中古マンションの価格予測について

# 1. はじめに
私はこの半年間データサイエンスを学習しましたが、その技能を幅広く社会貢献として利用出来る業務の中でも、中古マンションの物件価格の推移を予測する事で経済が不安定な時期でも人々の快適な生活のサポートが出来ると考え、分析を行いました。
<br>
# 2. 解決したい社会問題
中古マンション価格は市況や金融政策、人口動態の変化などの影響も受けるため、価格決定の要因が複雑に入り組んでいます。そのような点から、マンション購入を思案されている人々は自分達に納得できる事案を見つける事が難しいと思います。そこで将来の価格を分析して予測する事になれば、購入する計画をスムーズに立てる事が出来るようになり、今後の生活も充実できると思います。
<br>
# 3. 分析するデータ
以下の都道府県の中古マンションの部屋面積や最寄り駅の距離等の情報が記載されたデータを分析し、取引価格の予測値と実測値を比較します。

（北海道の住所データを一部抜粋）
![スクリーンショット 2024-09-24 002645.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891012/9b1ad984-0f19-93a6-2d44-cb573257af90.png)
<br>
# 4. 実行環境
パソコン：Surface Laptop 3
開発環境：Google Coraboratory
言語：Python
ライブラリ：Pandas, Sklearn(Scikit-learn), Numpy, Matplotlib
<br>
# 5. 分析の流れ
(1) ライブラリのインポート
(2) CSVファイルの読み込み
(3) データ値の補正
(4) モデルの定義
(5) 予測実測プロットの作成
(6) 予測値と実測値の可視化
<br>
# 6. 分析の過程
(1) ライブラリのインポート
　Pandas, Sklearn, Numpy, Matplotlibをインポート
![スクリーンショット 2024-09-22 134723.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891012/cf3cb6e7-bc96-8f2e-6c0f-a981196d46d8.png)
<br>
(2) CSVファイルの読み込み
　CSVファイルである学習データとテストデータの読み込み
![スクリーンショット 2024-09-24 003753.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891012/67b3fb54-98e9-5f79-e415-b18daefe0def.png)
<br>
(3) データ値の補正
　学習データとテストデータに空白の箇所があったので目的変数を箇所を中心に補正しました。
![スクリーンショット 2024-09-22 134555.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891012/441bef26-a9aa-8129-0022-15593ac21a1e.png)
<br>
(4) モデルの定義
　予測精度の評価をMAEで行う形式となっています。
![スクリーンショット 2024-09-22 135124.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891012/b724fdc8-d3ec-9766-7a13-4f174c8fbab6.png)
<br>
(5) 予測実測プロットの作成
![スクリーンショット 2024-09-22 135341.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891012/8517d9ef-1a12-72c7-4c80-01d26293acd6.png)
<br>
(6) 予測値と実測値の可視化
![スクリーンショット 2024-09-24 003535.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891012/d009ede2-17d3-f32f-7e42-f01e24184ae1.png)
<br>
# 7. 分析したデータから得られた情報
MAEでの評価の結果、予測値と実測値が一致している箇所が多く、これまで収集したデータでも十分に将来の価格を導き出すことが判明しました。その一方で、さらなるデータを追加やモデルを複数用意するとより精度が高く、別の結果が出る事もあり得ます。
<br>
# 8. まとめ
・今後より精度の高い未来価格を導くには、例えばマンションに関する情報だけでなく周辺地域の特色（観光名所の有無や県外の人の出入り）、または住民の所得等の経済情報を盛り込むと違った価格予想が出る可能性もあります。
・学習モデルを一つだけではなく、ランダムフォレストの様にいくつかの内容の異なる決定木を集めて、それらの結果の平均を取る事によって新たな価格を出力させます。
投稿 88 placeholder 2024/09/26

本日の勉強時間　5H

placeholder 属性は、フォームコントロールに値が無いときにコントロールに表示するテキストを定義します。
プレースホルダーテキストは、ユーザーにコントロールに入力するべきデータの種類に関する短いヒントを提供するのに使われる。
投稿 87 <input type="date"> 2024/09/25

本日の勉強時間　3H

<input> 要素の type="date" は、ユーザーに日付を入力させる入力欄を、検証付きのテキストボックスまたは特殊な日付選択インターフェイスのどちらかで生成します。

結果の値には年、月、日が含まれますが、時刻は含まれません。 time および datetime-local 入力型は時刻や日付と時刻の入力に対応しています。


<input type="date" id="date-input"  />

↑i put type="text"にはしないようにする。
応用情報の令和6年春期システムアーキテクトから学ぶ、静的ファイルの最適化

フロントエンドのチューニング部分は実務で担当したことがなかったため、個人的に難問と感じた。
同じ問題が出るとは考えづらいが、学ぶきっかけになったので記録しておく。

## 静的ファイルの最適化とは
最終目的はブラウザ上で、極力速くレンダリングを行うこと。
静的ファイルのレンダリングにおいて、一番時間のかかるのが、Webサーバーから送られてくるデータの送受信。
そのためにHTMLやCSSなどのサイズを小さくする必要がある。

### ファイルをgzipで圧縮する
HTMLには同じような文字が多い（タグ）。
それらの文字を置換することによって、サイズを圧縮するのがgzip。
圧縮はサーバー側で行う。CDNを利用している場合はCDNが圧縮する。
解凍するのはブラウザ。

https://blog.redbox.ne.jp/cdn-gzip-compress.html

### 圧縮可能な画像フォーマットを使用する
BMPはフルカラーに対応していたり、圧縮に対応していないことでサイズが大きい。
なので、圧縮に対応しているJPG、PNG、SVG（XMLで表現された画像）を使う。

### 各ファイル内の不要なコメント、改行、空白を削除
シンプルにファイル内の記述を減らすことでサイズを小さくする。

## なんでもかんでも圧縮すればいいわけではない
圧縮・解凍するということはサーバ・クライアント、双方のCPUに負担がかかるということ。
結果として処理が遅くなることもある。
なので、適切なコンテンツのみを圧縮し、合計ファイルサイズを小さくすることを心がける。
システム監査を一枚の図にまとめてみた

一枚の図にまとめてみたシリーズ（？）、今回はシステム監査を一枚の図にまとめてみました。

```plantuml
@startuml
|利用者|
split
    -[hidden]->
    :情報システムの中期計画;
split again
    -[hidden]->
    :システム開発・更改計画;
split end
|監査人|
:中長期計画;
group 年度活動
:年度計画;
group 個別監査の活動
group 個別監査計画
group リスク・アプローチ
:リスクの識別;
:リスクの分析;
:リスクの評価;
end group
:監査範囲の絞り込み;
:監査計画の策定;
end group
group 監査手続
group 予備調査
split
    :チェックリスト法;
split again
    :ドキュメントレビュー法;
split again
    :ウォークスルー法;
split again
    :突合・照合法;
split again
    :現地調査法;
split again
    :ペネトレーションテスト法;
split again
    :コンピュータ支援監査技法;
split again
    :インタビュー法;
split end
end group
end group
group 監査証拠の入手
:本調査;
end group
group 結論の記録
:監査調書の作成;
:監査の結論;
:監査報告書の作成;
|監査対象部門|
split
    :改善計画の作成;
split again
    :改善提案の作成;
split end
end group
|監査人|
split
    :監査報告書の提出;
|利用者|
    :監査報告書の受領;
|監査人|
split again
    :監査報告書の回覧;
|監査対象部門|
    :監査方向書の閲覧;
split end
group フォローアップ
:改善の実施;
:改善状況報告書の作成;
|監査人|
:改善状況のモニタリング;
:フォローアップ報告書の作成;
end group
end group
end group

@enduml
```
MacBookにJDKをインストール~設定確認まで

MacBookでJavaを利用するためにJDKをインストールし、設定確認まで行います。
※今回はHomebrewでインストールしていきます。

### 手順１ Homebrewを使用してJDKをインストールします。
MacBook標準搭載のターミナルに以下のコマンドを入力します。
```
$ brew install --cask adoptopenjdk/openjdk/adoptopenjdk8
```

### 手順２ JAVA_HOMEの設定
システムが適切なJava実行環境を利用できるようにするため、JAVA_HOMEを設定します。
まず以下のコマンドでインストールしたJDKのパスを確認します。
```
$ /usr/libexec/java_home -V
```
※この際、出力されたパスにJavaAppletPluginという文言がある場合、それはWebブラウザ用のプラグインで通常の開発環境で利用するためのJDKとは異なります

出力されたパスがJDKのものであることを確認したら、そのパスを使って.zshrcにJAVA_HOMEを設定します。
※.zshrcは隠しファイルのため、lsコマンドに「-a」を追加することで確認できます。

では、ホームディレクトリから以下のコマンドを入力します。
```
$ nano ~/.zshrc
```
.zshrcが開けたら、以下のように、JAVA_HOME を正しいJDKのパスに設定します。
※ ***の部分に先ほど確認したJDKのパスを設定します。
```
export JAVA_HOME=***
export PATH=$JAVA_HOME/bin:$PATH
```
設定を保存しファイルを閉じた後、ターミナルに以下のコマンドを入力します。
```
$ source ~/.zshrc
```

### 手順３ 最終確認
ターミナルで以下のコマンドを入力し、JAVA_HOME が正しく設定されたか確認します。
正しくパスが表示されればOKです。
```
$ echo $JAVA_HOME
```
最後にJavaのバージョンを確認しておきましょう。
```
$ java -version
```

ここまでの手順で、JDKが正しくインストールされ、環境変数も設定されました。
各テンソルのかたちと具体的なデータの種類を知ろう！

## はじめに
こんにちは！この記事では「テンソルのかたち」について、具体的なデータの種類に触れつつ、面白く分かりやすく解説していきます。テンソルと聞くと難しそうに感じるかもしれませんが、実は身の回りのデータもテンソルとして表現できるんです！数学的な概念としてのテンソルが、実生活のどんなデータに対応しているのか、具体例を交えて見てみましょう。

## テンソルって何？

まず、「テンソル」という言葉の定義をおさらいしましょう。テンソルとは、簡単に言うと**多次元配列**です。  
1次元配列（ベクトル）や2次元配列（行列）を、さらに高次元に拡張したものがテンソルです。Pythonなどのプログラミング言語では、NumPyやPyTorchのライブラリで扱えます。

### 次元ごとの具体例

1次元、2次元、3次元といったそれぞれの次元が何を意味するか、具体的なデータ例を見ていきましょう！

---

### 1. **スカラー（0次元テンソル）**

**形状：`()`**

これは単純に1つの数字を表します。0次元テンソルとは、いわゆる「スカラー」値です。  
**具体例：**

- 気温（25度）  
- 年齢（30歳）

```python
import torch
# スカラーの例
scalar = torch.tensor(25)
print(scalar.shape)  # ()
```

---

### 2. **ベクトル（1次元テンソル）**

**形状：`(n)`**

1次元テンソルは、n個の要素からなるリストのようなものです。  
**具体例：**

- 生徒のテストの点数 `[85, 90, 78]`
- 時間ごとの温度変化 `[25, 26, 27, 28]`

```python
# ベクトルの例
vector = torch.tensor([85, 90, 78])
print(vector.shape)  # (3,)
```

---

### 3. **行列（2次元テンソル）**

**形状：`(m, n)`**

2次元テンソルは、いわゆる「行列」です。表形式でデータを持つことができます。  
**具体例：**

- 画像のピクセル情報（白黒画像）  
  例：`[[255, 0, 0], [0, 255, 0], [0, 0, 255]]` (3×3のグリッド)
- 学校の成績表（各生徒の各教科の点数）

```python
# 行列の例
matrix = torch.tensor([[85, 90, 78], [80, 75, 85], [90, 88, 92]])
print(matrix.shape)  # (3, 3)
```

---

### 4. **3次元テンソル**

**形状：`(l, m, n)`**

3次元になると、データの層が追加されます。3次元テンソルは、複数の2次元行列が積み重なったような形になります。  
**具体例：**

- カラ―画像（RGB画像）：3つのチャンネル（赤、緑、青）の情報を持つ
  例：`(高さ, 幅, チャンネル)` -> `(256, 256, 3)`
- 動画データ：フレームごとに画像を持つ

```python
# 3次元テンソルの例
tensor_3d = torch.randn(3, 256, 256)  # 3枚の256×256の画像
print(tensor_3d.shape)  # (3, 256, 256)
```

---

### 5. **4次元テンソル**

**形状：`(b, l, m, n)`**

さらにもう1つ次元を増やすと、4次元テンソルになります。これは、例えば**バッチ処理**に使われるテンソルの形です。機械学習で、複数の画像やデータを一度に処理する場合、各データが3次元（高さ、幅、チャンネル）のテンソルであり、そのデータがバッチとしてまとめられると4次元になります。

**具体例：**

- 複数の画像をまとめてバッチ処理
  例：`(バッチサイズ, チャンネル数, 高さ, 幅)` -> `(32, 3, 256, 256)`  
- 音声認識の入力データ（複数のサンプルごとに特徴量）

```python
# 4次元テンソルの例
tensor_4d = torch.randn(32, 3, 256, 256)  # 32枚の3チャンネルの256×256画像
print(tensor_4d.shape)  # (32, 3, 256, 256)
```

---

## テンソルの応用例

テンソルは機械学習やディープラーニングの基盤となるデータ構造です。画像処理、自然言語処理、音声認識など、さまざまな分野でテンソルが使われています。

### 画像認識

画像は通常、2次元または3次元テンソルで表現されます。白黒画像の場合は2次元（高さ×幅）、RGB画像の場合は3次元（高さ×幅×チャンネル）です。これを畳み込みニューラルネットワーク（CNN）に入力することで、画像のパターンや特徴を捉えます。

### 自然言語処理

単語の埋め込みや文の解析は、1次元や2次元テンソルとして表現されます。単語はベクトル（1次元テンソル）で表現され、文は単語の列として2次元のテンソルになります。

### 音声認識

音声データは通常、時間軸に沿った2次元または3次元のテンソルで表されます。特徴抽出を行うとき、複数の音声データをまとめて処理するために4次元テンソルが使われることもあります。

---

## まとめ

テンソルはただの数の配列と思いがちですが、現実世界のデータを効果的に扱うための強力なツールです。今回紹介したテンソルのかたちや次元ごとの具体例を押さえておくことで、機械学習やディープラーニングをもっと身近に感じられるはずです！

テンソルを理解することは、データ処理やAIの世界で非常に役に立ちますので、ぜひ使いこなしてみてくださいね！

この記事が面白かったら、ぜひ「いいね」や「ストック」をお願いします！
Husky導入

## Huskyの導入について


:::note info
version
Next.js 14.2.9
Typescript 8.5.0
ESLint 8.57.1 
Husky@9.1.6
:::

## 目的
#### pre-commitを使用して、commit時にeslintとprettierの整形を適用させる



## 参考記事

https://typicode.github.io/husky/get-started.html

<br>

#### 1.インストール
```terminal
npm install --save-dev husky
```
<br>

#### 2.Husky をプロジェクトにセットアップし、Git フックの管理を簡単にするための初期化コマンドを実行
```terminal
npx husky init
```

<br>

#### 3. .huskyディレクトリ内にpre-commitファイルがあることを確認し下記のように記述

```
# .husky/pre-commit

prettier $(git diff --cached --name-only --diff-filter=ACMR | sed 's| |\\ |g') --write --ignore-unknown
git update-index --again

npx lint-staged

```
<br>

## 動作チェック

#### 1.VSCodeでPrettierの拡張機能を導入している場合は、Disableで無効にする

#### 2.プロジェクトのpage.tsxで改行などを行い変数も用意
```react
const sample = 1;

export default function Home() {
  return <div>Hello Hello2
    
  
  
  </div>;
}

```
<br>

#### 3.変更したファイルをStagedさせる
```terminal
git add .
```
<br>

#### 4.Stagedされたファイル群をコミットする
```terminal
git commit -m "feat: コミットメッセージ"
```

<br>

:::note alert
正常にコミットされた場合は、Huskyが正常に動作をしていない
:::

<br>

#### 下記のようにエラーが出力された場合は、Huskyが正常に動作している
```terminal
$ git commit --file="C:/Users/projects/app/.git/COMMITMESSAGE"

.eslintrc.json 50ms (unchanged)
package-lock.json 111ms (unchanged)
package.json 2ms (unchanged)
src/app/page.tsx 53ms
[33m[STARTED][39m Preparing lint-staged...
[32m[COMPLETED][39m Preparing lint-staged...
[33m[STARTED][39m Running tasks for staged files...
[33m[STARTED][39m package.json — 6 files
[33m[STARTED][39m **/*.{js,jsx,ts,tsx} — 1 file
[33m[STARTED][39m eslint --fix
[31m[FAILED][39m eslint --fix [FAILED]
[31m[FAILED][39m eslint --fix [FAILED]
[32m[COMPLETED][39m Running tasks for staged files...
[33m[STARTED][39m Applying modifications from tasks...
[33m[SKIPPED][39m Skipped because of errors from tasks.
[33m[STARTED][39m Reverting to original state because of errors...
[32m[COMPLETED][39m Reverting to original state because of errors...
[33m[STARTED][39m Cleaning up temporary files...
[32m[COMPLETED][39m Cleaning up temporary files...

✖ eslint --fix:

"C:/Users/projects/app/\src\app\page.tsx
  1:7  error  'sample' is assigned a value but never used  @typescript-eslint/no-unused-vars

✖ 1 problem (1 error, 0 warnings)

husky - pre-commit script failed (code 1)
```
<br>
<br>

ChatGPTを活用した際は、質問が悪くHuskyが動作せずに時間がかかり解決しなかった為、
プロジェクトを一新し今回の流れで正常に動作することが確認できた為、自分の備忘録として投稿です！

Husky関連の記事も少なかった為、どん詰まりで導入するのに時間かかりました、、、
RealSense D455 vs D455F

# RealSense D455Fとは
通常のRealSense D455のIRカメラ部分にIRフィルターを取り付けたバージョン。なんかDepthの質が良くなるらしいので検証していきます。

細かいところはデータシート読んでください。

https://dev.intelrealsense.com/docs/intel-realsense-d400-series-product-family-datasheet

![82635DSD455FMP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/899689/f099ad11-7a93-198f-b8b0-224b8b3a207e.jpeg)

# シーリングライト
RealSenseを床に置き天井を見てみました。シーリングライトをオンとオフにした場合を比較しました。日没後に計測しているため太陽光の影響はありません。

**オフ**👇
![Depth_Light_OFF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/899689/efeaffae-1044-8d18-81b1-df54995c8732.png)

**オン**👇
![Depth_Light_ON.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/899689/070dff8a-a0c5-c188-6162-9091dd3c390e.png)

D455Fの方がシーリングライト周辺のDepthを綺麗に取得できています。

# スマホの照明とデスクライト

これは一目瞭然だと思います。D455だとIRカメラの露出が照明に引っ張らてドットパターンが見えにくくなっています。そして照明による白飛びの範囲も多いです。

![Depth_Beam.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/899689/fea4f36f-3ab1-a894-c755-5782abe41788.png)
![Infra_beam.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/899689/0383e8e0-f4cd-e1dd-c953-0ee3396f34a6.png)
![RGB_Beam.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/899689/f533dcf4-4d54-dff5-3c1b-e8fe69bcb92b.png)

# デプス品質チェック



**撮影環境**👇
机に置いてあるものは左からAnkerのモバイルバッテリー、ANAアロマ(良き、買おう)、RealSenseの三脚。
![IMG_0721.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/899689/19f99d08-56bc-baa6-dcf5-aa9e7533ccad.jpeg)


**848x100 100FPS**👇
![848x100-100fps.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/899689/83cc941b-44fc-9373-7baa-d047ff34035c.png)

**640x360 90FPS**👇
![640x360-90fps.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/899689/54d1fe55-359f-c7aa-635d-8332e7afc2ff.png)

**848x480 60FPS**👇
![848x480-60fps.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/899689/a144dbcf-f945-7400-1be9-23792a2a8ce9.png)

**1280x720 30FPS**👇
![1290x720-30fps.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/899689/ff3bea82-8717-5e95-dcde-ebfb5844f397.png)


# 光沢のある表面に天井からの光が反射して輝点が見えている状況
IR画像です。D455FについているのはIRパスフィルターで偏光フィルターではないので入射角度などは適当です。
**撮影環境**👇
![IMG_0723.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/899689/915bc7b7-7bdb-9aab-113e-07985e203f0f.jpeg)

**Infra画像**👇
![IR.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/899689/a902c4b4-e616-b597-24a9-f9a305d9c75e.png)


# 終わりに

~~カメラを上方向に向けて設置して照明が映り込む感じに設置しようとしている人やロボコン関連で撮影用照明の影響を最小限に抑えたい人にとってRealSense D455Fはとても良い解決手段になるのではないでしょうか。~~

室内照明の影響を徹底的に排除したい方には良い選択肢だと思います。ただし、すべての状況でD455の方が優れたデプス品質を提供するわけではないので、ご自身の環境に合った製品を選んでください。多くの方にとっては、D455で十分かと思います。


今回検証したRealSense D455FはTakumi-san@3Dcamera(@Takumi3Dcamera)様よりお貸しいただきました。
ネットワーク階層完全ガイド：コア層、ディストリビューション層、アクセス層の役割を理解しよう！

#### 概要
ネットワーク階層は、効率的なネットワーク設計において重要な概念です。この記事では、コア層、ディストリビューション層、アクセス層の3層について、それぞれの役割と機能を解説します。

---

#### 1. コア層

- **説明**: コア層は、ネットワーク全体のバックボーンとして機能し、トラフィックを高速かつ信頼性高くルーティングする役割を担います。
ルーターやスイッチなどの高速で高容量のデバイスで構成されており、複雑な処理や意思決定を行わずに、あるポイントから別のポイントにできるだけ早くデータを転送します。
- **特徴**: 高スループット、低遅延、信頼性を重視。
高度な光保護と復旧メカニズムが組み込まれている。
スケーラビリティが組み込まれており、ネットワーク容量の増大に対応できる
- **用途**: 大規模ネットワークやデータセンターのバックボーン。

#### 2. ディストリビューション層

- **説明**: ディストリビューション層は、コア層とアクセス層の中間に位置し、トラフィックの集約やポリシーの適用を行います。
通常L3（マルチレイヤ）スイッチで構成されますが、外部との接続にはルータを配置します。
また、L3スイッチ間ではリンクアグリゲーションなどにより通信経路の冗長性や帯域の拡大も構成します。
- **特徴**: トラフィックの制御やフィルタリングが可能。
QoSの実装を行う。
アクセス層の各ネットワークを集約する
- **用途**: 部署やセグメント間の通信を管理。

#### 3. アクセス層

- **説明**: アクセス層は、エンドユーザーやデバイスが直接接続される層で、ネットワークに最も近い部分です。
通常L2スイッチで構成され、VLANによってネットワークを分割するといった利用が多くなります。
- **特徴**: ユーザーやデバイスに対するアクセス制御を行う。
認証やセキュリティポリシーなどの機能を提供するほか、ローカルトラフィック処理も実行。
- **用途**: PCやスマートデバイスの接続。

---

#### 総括
ネットワーク階層の設計は、ネットワークのパフォーマンスとセキュリティに直接影響を与えます。コア層、ディストリビューション層、アクセス層の役割を理解することで、効率的なネットワーク設計が可能になります。
ネットワークセグメント完全ガイド：サブネットとVLANの基本をマスターしよう！

#### 概要
ネットワークセグメントとは、ネットワークを効率的かつ安全に管理するために分割されたサブネットや仮想LAN（VLAN）のことです。この記事では、サブネットとVLANの役割やメリットについて解説します。

---

#### 1. サブネット

- **説明**: サブネットは、大きなネットワークを小さな部分に分割することで、IPアドレスの管理を効率化し、トラフィックを制限する役割を持ちます。
- **特徴**: IPアドレスを使った論理的な区分けが可能で、トラフィックの増加やセキュリティを向上させるために使用。
経路制御テーブルの大きさを縮小し、ホストアドレス空間の一部をネットワークアドレスに割り当てることでネットワーク数を増やす。
- **用途**: オフィスネットワークの分割、大規模ネットワークの管理。

#### 2. VLAN

- **説明**: 「Virtual Local Area Network」の略
VLANは、物理的な接続に依存せずにネットワークを仮想的に分割し、特定のユーザーやデバイスをグループ化して管理できる技術です。
- **特徴**: 柔軟なネットワークセグメンテーションが可能で、物理的な制限に縛られずにセキュリティやパフォーマンスを向上できる。
- **用途**: 部署ごとのネットワーク分離、セキュリティ強化。

---

#### 総括
ネットワークセグメントを適切に活用することで、ネットワーク管理がより効率的になり、セキュリティやトラフィックの管理が容易になります。特にサブネットとVLANは、現代の複雑なネットワークにおいて不可欠な技術です。
PythonにおけるEarly Returnの利点と使い方

# Early Returnとは
関数の処理の途中で特定の条件が満たされた場合、残りの処理を行わずに即座に値を返して終了させるプログラミング手法のこと。条件が複雑な場合や、早期にエラーチェックを行う際に使用される。主なメリットは、ネストされた条件分岐を避け、コードの可読性を向上させることにあります。また、不要な処理をスキップすることでパフォーマンスが向上する場合もあります。

# 例
関数がNoneまたは空文字列を受け取った場合に早期リターンして処理を終了させるとこんな感じになります。。
```python
def process_data(data):
    if data is None or data == "":
        return "No data to process"
    
    # 通常の処理
    return f"Processing {data}"
    
# 使用例
print(process_data(None))  # 出力: No data to process
print(process_data("Hello"))  # 出力: Processing Hello
```
これだけだといまいち恩恵を感じにくいですが条件が複雑になるとメリットが増します。例えば関数内で複数の条件をチェックして、それぞれのケースで早期リターンを行ったときのコードが以下の感じです。

```python
def validate_user_input(user_input):
    if not user_input:
        return "Error: Input is empty"
    if not isinstance(user_input, str):
        return "Error: Input must be a string"
    if len(user_input) < 3:
        return "Error: Input is too short"
    
    return "Input is valid"

# 使用例
print(validate_user_input(""))  # 出力: Error: Input is empty
print(validate_user_input(123))  # 出力: Error: Input must be a string
print(validate_user_input("Hi"))  # 出力: Error: Input is too short
print(validate_user_input("Hello"))  # 出力: Input is valid
```

エラーハンドリングの時にも有効で、早期にエラーをRaiseさせて異常な状態を即座にキャッチすることもできます
```python
def process_user_input(user_input):
    if not isinstance(user_input, str):
        raise ValueError("Input must be a string")
    if len(user_input) == 0:
        raise ValueError("Input cannot be empty")
    if len(user_input) > 100:
        raise ValueError("Input is too long")
    
    # 通常の処理
    return f"Processed: {user_input}"

# 使用例
try:
    result = process_user_input(123)  # ValueError: Input must be a string
except ValueError as e:
    print(e)

try:
    result = process_user_input("")  # ValueError: Input cannot be empty
except ValueError as e:
    print(e)
```

# 注意点
Early Returnを多用しすぎると、関数の中に多数のreturnが散在し、逆にコードが追いにくくなる可能性があります。そのため闇雲に使うのはかえって悪手になる可能性もあります。関数が複雑になりすぎる場合は、そもそもの分岐をもっとスマートにできるか等現在の記述方法が本当に最適かどうかを俯瞰してみたほうが良いと思います。
JavaScriptを動かすために必要なこと

# JavaScriptとは

まずJavaScriptとは、webブラウザ上で動くプログラミング言語です。
Webサイトといえば、htmlとcssで構成されますが、サイトに動きを加える際にJavaScriptを使用します。

JavaScriptには様々なフレームワークが存在しており、有名なものはReact.js、Vue.jsなどがあります。

# JavaScriptのコーディング
## 変数宣言
constやlet、varを使用することで変数宣言ができます。

constは初期値が必須で、変数に値を再代入できません。同じ変数名を定義するとエラーが起きます。

letは初期値を設定しなくても良く、変数に再代入ができます。同じ変数名を定義するとエラーが起きます。

varは初期値を設定しなくても良く、変数に再代入ができます。同じ変数名を定義してもエラーにならず、値が上書きされます。

```javascript
// 正常なパターン
const c1 = 1;
let l1 = 2;
let l2;
var v1 = 3;
var v2;
var v1 = 5;

// エラーパターン
const t;
const c1 = 5; // 2回目の呼び出し
let v1 = 5; // 2回目の呼び出し
```

## メソッドの定義
メソッドはfunctionで定義できます。
メソッドを呼び出す際はメソッド名()で呼び出せます。
また、メソッドを定義する際にデフォルト引数を設定でき、メソッドを呼ぶ際に引数を指定しなかった場合はデフォルト引数の値が設定されます。

```javascript
function hello(str){
// 処理を書く
}
hello('値');
```

## 配列とオブジェクト
配列は、[x]を変数に代入することで使用できます。
初期化したい場合は、[]を代入する必要があります。
配列に値を追加したい場合は.push(x)をすることで、追加できます。
配列には数値と文字列、Booleanなど型を区別することなく入れられます。

```javascript
const ary = [1,2,3,"four"];
ary.push(ture);
```

オブジェクトは、配列とは違う形でデータを複数入れられます。
オブジェクトの中で変数をさらに定義して値を設定しているイメージです。
```javascript
const person = {
  name: ["sato", "gojo"],
  age: 25,
  pro: function () {
    console.log(`${this.name[0]} ${this.name[1]} is ${this.age}`);
  }
};

person.name;
person.name[0];
person.age;
person.pro();
```

## ループと分岐
ループは、Javaのfor文とほとんど同じ認識です。

```javascript
const ary = [1,2,3];

for(let i = 0; i < arry.length; i++) {
    console.log(i);
}

for(let num of ary) {
  console.log(num);
}
```

分岐も、Javaでいうif文と同じ認識です。

```javascript
const result = true;

if(result){
  console.log('true');
} else {
  console.log('false');
}
```

## アロー関数とコールバック関数

アロー関数は、`=>`を使用して省略した関数リテラルを記載しています。
```javascript
// アロー関数使用しない場合
let profile;
function pro(name, age) {
  profile = '${name} ${age}';
}
console.log(pro('sato',25))

// アロー関数使用する場合
const profile = (name, age) => '${name} ${age}';
console.log(profile('sato',25))
```

コールバック関数は、引数に関数を渡すような関数を指します。
```javascript
function profile(age, firstName, lastName, callback) {
    const result = callback(firstName, lastName);
    console.log(age + result);
}

function name(firstName, lastName) {
    return firstName + lastName;
}

profile(25, 'sato', 'rikido', name);
```

## Webサイトが実際に動くようにhtmlとJavaScriptを組み合わせる
実際に、HTMLの要素に対してJavaScriptを反映させる場合は、`document.querySelector()`を使用する。

```html
<h1 class="main-title">タイトル</h1>
<h2 class="sub-title">サブタイトル</h2>
<div id="description">内容</div>
<script src="main.js"></script>
```

```javascript
// 要素の場合はそのまま指定
const h1 = document.querySelector('h1');
// classを指定する場合は最初に.を指定
const subTitle = document.querySelector('.sub-title');
// idを指定する場合は最初に#を指定
const description = document.querySelector('#description');

// 文字の色を変える
function color() {
    description.style.color = 'red';
}
```
SQLで想定外の値が設定されていた時にエラーを出力する

SELECTでcase文を使用して「特定カラムの値の判定結果」を取得するクエリにおいて、その特定カラムに不正な値が設定されている場合にエラーを発生させたい状況があった。

少し強引なやり方ではあるが、以下のようにすることで不正な場合にエラーと表示することができる。

テーブル名:test_table
|name|boolean|
|---|---|
|sato|true|
|taro|false|
|12345|aiueo|


```SQL
select 
    *,
    case boolean
    when 'true' then 'myouji'
    when 'false' then 'namae'
    else convert(varchar,convert(int,'error boolean'))
    END AS boo
from 
  test_table;
```

SQLを実行すると以下のようなエラーとなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3419180/0ec6fb52-f03d-dc43-97cd-38719cfb3f75.png)
SQLでxxxの後にyyyが行われたデータを抽出したい

日付情報を持つ複数のレコードがあって、例えば以下のようなテーブルがあり、id順でactionが「meal」の前に「wake」が行われたユーザー名を探したいみたいな状況があった。

その場合はlag関数を使用することで解決できる。

|id | user| action|
|---|---|---|
|1|sato|sleep|
|2|sato|wake|
|3|gojo|meal|
|4|yamada|wake|
|5|sato|meal|
|6|yamada|sleep|
|7|gojo|sleep|
|8|yamada|meal|


```Sql
select
  user_name
from
  test_table
where
  id in (
  select
    id as target_id
  from
  (
    select
      id
      , action as now_action
      , lag(action) over (partition by user_name order by id asc) as before_action
    from
      test_table
  ) as subquery
  where
    now_action = 'meal' and before_action = 'wake'
  );

```

### SQL実行結果
以下のSQL FiddleというDBを使用して、SQL Serverで確認した。

https://sqlfiddle.com/


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3419180/7f354f33-6fea-6131-2b95-07ff5127f923.png)


### さいごに
lag関数は1個上のレコードの値を取得してくるが、逆に1個下のレコードを取得するlead関数もある。
lead関数も同じような感じで使用できる。
【HTML・CSS】画像の中央配置で苦戦した件

# はじめに
こんにちは。
最近Webサイト制作の学習をしていたのですが、画像(imgタグ)の中央配置がうまくできず、苦戦した話を記事にします。
結論を言うと**ブロック要素**、**インライン要素**の理解が足りていないことが原因で起きた話になります。

# 苦戦した話
サンプルコードを使用して当時の話を説明します。
まずはimgタグで画像を表示。
```html:html
<body>
  <img src="./example.jpg" alt="サンプル画像" class="example">
</body>
```
imgタグにスタイルを適用していない時は左側に配置される。
これを中央揃いにするため、左右の余白(margin)に``auto``を指定。
```css:css
.example{
  width: 80%;
  margin-left: auto;
  margin-right: auto;
}
```

ここで問題発生。
<font color="red">**画像が中央に配置されない！**</font> 
以前、divタグはこの方法で中央揃いにできたはず…。
とりあえずググった所、``display: block``を追加することで、imgタグは中央揃いにできるとのことでやってみる…。

```diff_css:css
.example{
+ display: block;
  width: 80%;
  margin-left: auto;
  margin-right: auto;
}
```
<font color="red">**.........中央揃いになった！**</font>
でも何故中央揃いにできたのか分からない。
さらに調べると原因が判明した！
それは…
<font color="red">**インライン要素にmargin:autoは効かない**</font>

正直に言うとこれは認識していなかった。
imgタグはインライン要素であり、``margin:auto``が効かない訳だ。
後に分かったことだが、<INS>インライン、ブロック、インラインブロックの3要素には、marginが指定できる要素とできない要素がある。</INS>
ブロック要素には``margin:auto``が効くため、``display:　block``でブロック要素に変更したことで、中央揃えができたことに納得した。

参考
[インラインブロック要素について](https://qiita.com/kuuuuumiiiii/items/f72237c23c276638ecaa)

# まとめ
今回の事象は、初心者が躓く事例としても多く挙げられています。
「私も躓いた経験がある！」という方は、これを機会に理解を深めていただけると、今後躓くことなくスムーズにコーディングできるようになるはずです。是非学んでもみてください。
長々とありがとうございました。
【React】clsxの使い方

# clsxって？
条件付きのclassName指定が簡単にできる関数です。

Next.jsでも紹介されてます。

https://nextjs.org/learn/dashboard-app/css-styling

# どんな書き方ができるの？
記載例はこちら

https://github.com/lukeed/clsx

classNameでは、こんな感じで使用します。
```react
    <span
      className={clsx(
        'inline-flex',
        {
          'bg-gray-100': status === 'OK',
        },
        [
          isClick && 'text-white',
        ]
      )}
    >
```

単語は半角スペースで区切られます。
ネストしても結果がtrueのものだけ残ります。
```react
clsx(
    'inline-flex' ,  
    [ true  &&  'items-center' ,  
        {  'rounded-full' : false ,  'px-2' : null  } ,
        [ 'py-1' ,  [ 'text-xs' ] ]
    ] 
); 
//'inline-flex items-center py-1 text-xs'
```

個人的には下記の２点の書き方以外は、グルーピングして見やすくために使うくらいでいいかなと思いました。
```react
<span
  className={clsx(
    {
      'bg-gray-100': status === 'OK',
    },
    isClick && 'text-white',
  )}
>
```

おしまい
Microsoft AzureでWindows環境をサクッと作る

# 前提

- 数時間だけクリーンなWindows環境を用意して、動作確認をする場合を想定しています
- クライアントOSは別途ライセンスが必要になるため、Windows Serverを使います
- 試すだけの用途のため、実用的な範囲でコストを抑えます

:::note info
実績として、１時間の使用で8.28円（1日換算で約200円）かかりました
:::

# 作成手順

1. Azureポータルにログイン
https://portal.azure.com/
1. 「リソースの作成」をクリック
1. 仮想マシンの「作成」をクリック
1. 以下の情報を入力
    | 項目 | デフォルト値 | 入力値 | 説明 |
    |:--|:-:|:-:|:--|
    | サブスクリプション | 従量課金制 | ← |   |
    | リソースグループ | (新規)リソースグループ | ← | 仮想マシン名を入力すると自動で入力される |
    | 仮想マシン名 | - | 任意の名前 | 例：WinServer |
    | 地域 | (US) East US | (Asia Pacific) Japan East |  |
    | 可用性オプション | 可用性ゾーン | ← |   |
    | ゾーンのオプション | 自己選択ゾーン | ← |   |
    | 可用性ゾーン | ゾーン 1 | ← |   |
    | セキュリティの種類 | トラステッド起動の仮想マシン | ← |   |
    | イメージ | Ubuntu Server 24.04 LTS - x64 Gen2 | Windows Server 2022 Datacenter: Azure Edition - x64 Gen2 | Hotpatchは短時間用途では不要 |
    | VMアーキテクチャ | x64 | ← |   |
    | Azure Spot 割引で実行する | OFF | ON | 混み合うと停止するが最大90%割り引かれる |
    | 削除の種類 | 容量のみ | ← | 価格要因では停止しない |
    | 削除ポリシー | 停止 / 割り当て解除 | ← | 停止してもディスクは保持 |
    | サイズ | - | Dシリーズ v5 - D2as_v5 | 2 vcpu 数、8 GiB のメモリ。[サイズの解説](https://qiita.com/himitune/items/57157b0200d480b5120c) |
    | 1 時間あたりの最大希望支払価格 | - | ← |   |
    | 休止状態を有効にする | OFF | ← |   |
    | ユーザー名 | - | 任意の名前 |   |
    | パスワード | - | 任意のパスワード |   |
    | パスワードの確認 | - | 任意のパスワード |   |
    | パブリック受診ポート | 選択したポートを許可する | ← |   |
    | 受信ポートを選択 | RDP (3389) | ← | リモートデスクトップに必要 |
    | 既存の Windows Server ライセンスを使用しますか? | OFF | ← |  |
1. サイズにある「価格履歴を表示し、近くのリージョンの価格を比較する」をクリック
1. 削除率の低い地域の「選択」をクリックして、画面下にある「OK」をクリック
1. 「次: ディスク >」をクリック
1. 以下の情報を入力
    | 項目 | デフォルト値 | 入力値 | 説明 |
    |:--|:-:|:-:|:--|
    | ホストでの暗号化 | OFF | ← |   |
    | OS ディスク サイズ | イメージの既定値 (127 GiB) | ← |   |
    | OS ディスクの種類 | Premium SSD (ローカル冗長ストレージ) | Standard SSD (ローカル冗長ストレージ) |   |
    | VMと共に削除 | ON | ← |  |
    | キーの管理 | プラットフォーム マネージド キー | ← |   |
    | Ultra Disk の互換性を有効にする | OFF | ← |   |
1. 「確認および作成」をクリック
1. 「作成」をクリックして、「デプロイが完了しました」と表示されるまで待つ
1. 「リソースに移動」をクリック
1. 「パブリック IP アドレス」をコピー

:::note info
削除率は今後 1 時間以内に削除（停止）される確率を表します
:::

#### Azure Spot 割引について

- 混み合うと停止される可能性がありますが、大幅に割り引かれます
- 価格は変動しますが、割引前の価格以上になることはありません

# 使用方法

- パブリック IP アドレスでリモートデスクトップ接続して使用します
- Macからも「Windows App」をインストールすると接続できます
    - キーボードがUS配列になってしまう場合、Windows Appのメニューから、「Connections -> Keyboard Mode -> Unicode」を選択します

# 削除手順

1. ホームまたは以下のURLで、「リソース グループ」に移動
https://portal.azure.com/#browse/resourcegroups
1. 削除するリソースグループをクリック
「WinServer」というVMを作った場合、「WinServer_group」が作られています
1. 「リソースグループの削除」をクリック
1. 「選択した仮想マシンと仮想マシン スケール セットに対して強制削除を適用する」をチェック
1. リソースグループの名前を入力して「削除」をクリック
1. しばらく待ってリソース グループに戻って、削除されていることを確認

:::note info
「NetworkWatcherRG」は残しても課金されませんが、気になる場合は削除しても大丈夫です
:::
VSCodeからEC2へのSSH接続が重すぎた話

# 背景
前回の記事では、ChatGPTを活用してReactとNodeでWebサービスを開発した体験について書きました。

前回の記事

https://qiita.com/travelclass0606/items/135263b166a0db7ca988

開発したサービス

https://travel-class.com

その際、VSCodeの拡張機能「Remote SSH」を利用して、EC2（無料枠）に接続しながらソースコードを編集していました。しかし、保存するたびに画面がフリーズし、仕方なくEC2を再起動するという面倒な手順を繰り返していました。具体的には、EC2再起動→VSCodeから再度EC2にSSH接続→ソースコード編集→保存→フリーズ、という状態に陥っていました。

# 原因
調べてみたところサーバーに負荷がかかっている？？ようで、同じような問題に悩まされているユーザーが多いことが分かりました。

https://tech.excite.co.jp/entry/2022/09/27/153341

https://blog.masuyoshi.com/【vscode使用者注意】サーバーリソース食い散らかす/

https://zaki-hmkc.hatenablog.com/entry/2021/01/06/230727

# 解決策
最終的に[Cyberduck](https://cyberduck.io/#google_vignette)をインストールして、Cyberduck経由でEC2に接続し、ファイルを編集することで問題が解決しました。これにより、スムーズに作業が進むようになり、フリーズの繰り返しから解放されました。よかった。。。。

https://qiita.com/okalog/items/8e5fb6de70f10ea96121
DatabricksでMeta Llama 3.2 11B Visionを動かしてみる

こちらの続きです。マルチモーダルのモデルを動かしてみます。

https://qiita.com/taka_yayoi/items/d37fb0c08784f2cdac1c

いろいろ試しましたが、現時点で動作を確認できたのはHugging Face経由のものです。

https://huggingface.co/meta-llama/Llama-3.2-11B-Vision

モデルをダウンロードするにはリクエストが必要となります。リクエストしてからすぐに承認されました。
![Screenshot 2024-09-26 at 21.15.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/14535125-fd1b-d0f9-1585-4739ca1711cc.png)

クラスターはこちら。
![Screenshot 2024-09-26 at 21.16.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2888f05a-9708-9176-32ae-a3fc48ccd621.png)

```py
%pip install -U transformers
%pip install 'accelerate>=0.26.0'
%pip install numba
dbutils.library.restartPython()
```

```py
# login to huggingface
from huggingface_hub import notebook_login
notebook_login()
```

使う画像はこちら。

![](https://huggingface.co/datasets/huggingface/documentation-images/resolve/0052a70beed5bf71b92610a43a52df6d286cd5f3/diffusers/rabbit.jpg)

OOMで困ってました。AIアシスタントにGPUメモリーをクリーンアップしたらとアドバイスいただいて、コードも書き換えてもらいました。

```py
import requests
import torch
from PIL import Image
from transformers import MllamaForConditionalGeneration, AutoProcessor
from numba import cuda

# Clean up GPU memory
cuda.select_device(0)
cuda.close()
cuda.select_device(0)

model_id = "meta-llama/Llama-3.2-11B-Vision"

model = MllamaForConditionalGeneration.from_pretrained(
    model_id,
    torch_dtype=torch.bfloat16,  
    device_map="auto",
)
processor = AutoProcessor.from_pretrained(model_id)

url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/0052a70beed5bf71b92610a43a52df6d286cd5f3/diffusers/rabbit.jpg"
image = Image.open(requests.get(url, stream=True).raw)

# これに対して俳句を書かなくてはいけないとしたら
prompt = "

If I had to write a haiku for this one"
inputs = processor(image, prompt, return_tensors="pt").to(model.device)

output = model.generate(**inputs, max_new_tokens=30)
print(processor.decode(output[0]))
```

```


If I had to write a haiku for this one, it would be:.\nA rabbit in a blue jacket.\nHops down a country lane.\nWith a basket of carrots.\n
```

> この画像に俳句を書くとしたら、次のようになります。\n青いジャケットを着たウサギ。\n田舎道を飛び跳ねる。\n人参の籠を持って。\n

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
Llama3.2 をローカルで動かしてみる


# やりたいこと

Meta 社から Llama3.2 が発表されました。軽量なモデルである Llama 3.2 1B および 3B とマルチモーダルモデルである Llama 3.2 11B および 90B です。
先日、OSS なモデルをローカルで動かす方法 (以下の記事) を試したので、今回の Llama3.2 も試してみようと思います。

https://qiita.com/coitate/items/d9035acd3cfcdae96e8b

# どんなモデル？

以下の記事によると、1B・3B はエッジやモバイルデバイス向けテキストモデル、11B・90B は小中規模のビジョンモデルだそう。

https://ai.meta.com/blog/llama-3-2-connect-2024-vision-edge-mobile-devices/

* 1B・3B
  * 128K トークンのコンテキスト長をサポート
  * 多言語テキスト生成とツール呼び出し機能に非常に優れている (らしい)
* 11B・90B
  * マルチモーダルモデル
  * Claude 3 Haiku などと比較して画像理解タスクで優れている (らしい)

# 動かす

:::note
Ollama のコンテナは立ち上がっているものとします
立ち上げ方はこの記事を参照: https://qiita.com/coitate/items/d9035acd3cfcdae96e8b
:::

以下コマンドでモデルを実行。タグを指定しない場合デフォルトで 3B になる。モデルサイズは2GBと軽め。

```sh
docker exec -it ollama ollama run llama3.2
```

後は、他モデルと同様にプロンプトを入力する。

```sh
>>> Hello
Hello! How can I assist you today?
```

非常に簡単ですね。

# ということで

Llama3.2 をローカルで実行してみました。1B・3B は Ollama の Library に登録されていたので簡単に実行することができました。11B・90B については Library にないものの Hugging Face には登録されているので、そちらから実行できると思います。性能面については検証できてはいませんが、いろいろと使ってみて確認してみます。
いろんな発表がされて目まぐるしいですが、できるだけキャッチアップしていきたいですね！
Pythonの kwargs による可変長キーワード引数

Pythonでは、関数を柔軟に設計するための便利な機能として、可変長引数があります。

例1: キーワード引数

```python
def print_kwargs(**kwargs):
    for key, value in kwargs.items():
        print(f"{key} = {value}")

print_kwargs(a=10, b=20, c=30)
# 出力:
# a = 10
# b = 20
# c = 30
```

例2: DB接続引数

```python
def configure(**kwargs):
    host = kwargs.get('host', 'localhost')
    port = kwargs.get('port', 3306)
    print(f"Host: {host}, Port: {port}")

configure(host="example.com")
# 出力: Host: example.com, Port: 3306
```
ファミチキで理解する0とNULL

# 目的
巷でよく話題になるトイレットペーパーの画像

https://nlab.itmedia.co.jp/nl/articles/2201/10/news048.html

こちらは変数の値でよくわからないものが一瞬でわかるとても素晴らしい画像です。

しかし、時と場合によってはその例えが相応しくないかもしれないので、今回はお食事中でも話せるように、ファミチキを例に変数の値を説明してみようと思います。

ファミチキを題材にした理由は、

>俺がnullと0の違いを世界一わかりやすく説明する
>
>1 ：名無しの話 ：2020/02/09(日) 01:37:58 ID:yceNSwaK0
>0
>ぼく「ファミチキください」
>ファミマ店員「すいませんファミチキ無いんですよ」
>
>null
>ぼく「ファミチキください」
>セブン店員「すいませんファミチキ無いんですよ」
>
>ほらわかっただろ？

という有名なコピペを膨らませてみたかったからです。

この記事の目的は**初学者でも0とNULL、underfinedの違いがイメージできるようになる**です。

# ファミチキください
### non-0-value
>ぼく「ファミチキください」
ファミマ店員「あいよ！ ファミチキ一丁！」

→ ファミマなのでファミチキを売ることができます（＝変数が定義されている）。
在庫があるようなので、「ぼく」は無事にファミチキを買うことができました。
これが0でない値です（今回は負の数や小数については割愛）。

### 0
>ぼく「ファミチキください」
ファミマ店員「申し訳ございませんが売り切れです」

→ ファミマなのでファミチキを売っていたようでした（＝変数が定義されている）。
しかし、在庫がないので「ぼく」はファミチキを買えませんでした。

### NULL
>ぼく「ファミチキください」
ファミマ店員「当店はファミチキの取り扱いがありません」

→ ファミマですがそもそもファミチキを置いていないようです。
ですが、ファミリーマートなのでファミチキ自体は仕入れようと思えば仕入れることができます（ファミリーマートにファミチキ自体は定義されているので）。

### Underfined
>ぼく「ファミチキください」
セブン店員「ファミチキ？ なんですかファミチキって？」

→ セブンイレブンなので、ファミチキを売ることはできません（定義されていない）。
冒頭のコピペでは「NULL」で説明されていましたが、こちらのほうが認識としては近いのではないでしょうか。

### NaN
>ぼく「ファミチキください」
>ドジっ子ファミマ店員「はわわ～！！！ ファミチキ売り場に間違えて炭火焼とりももタレを置いちゃっためぅ～>< これだとしばらくはファミチキを置いてもタレファミチキになっちゃって売り物にならないめぅ～><」

→ ファミチキ売り場にファミチキでないものが入っています。
しかも炭火焼とりももタレにファミチキを補充しても、タレがついてしまって売り物になりません。
NaNとは「非数」です。数で定義された変数に違うものを入れて、仮にそれに1を足してもそれは数にはなりません。使いものにならなくなってしまうので、タレファミチキを例に出してみました。

# まとめ
| 値 | 状態 |
|:-:|:--|
| non-0-value | ファミチキ買える |
| 0 | ファミチキ売り切れ |
| NULL | ファミチキがないファミマ |
| Underfined | セブンイでファミチキください |
| NaN | ファミチキ売り場に炭火焼とりももタレ |（）

という感じです。

ここまで読んでいただきありがとうございました。
クリスマスなどに使えるネタ……とかにでも使っていただけたら嬉しいです。

ちなみに私が一番好きなのはパリチキです。次点で揚げ鶏かな～！！！
親ディレクトリでリポジトリを1つ作り配下の複数ディレクトリでブランチを切って開発を進める方法


# 概要
Udemyなどの教材で不要なリポジトリを増やさずに、親ディレクトリに他人のGitHubリポジトリをクローンし、その中でブランチを切って作業を進める方法です。

※配下の複数ディレクトリは「サブモジュール」として管理しません。



# 手順


### 1. 親ディレクトリ(rspec)に移動
```bash:bash
cd /home/user/vscode/rspec
```
<br>

### 2. リポジトリをクローン
```bash:bash
git clone https://github.com/他人のユーザー名/リポジトリ名....

# クローンしたディレクトリに移動
cd ディレクトリ名
```
<br>

### 3. リモートブランチの確認
```bash:bash
# ローカルにGitHubリモートから最新の情報を取得
git fetch --all
# リモートとローカル全てのブランチ確認
git branch -a
# -> remotes/origin/main
```
※`remotes/origin/main`
リモートのmainブランチを追跡していることを意味している。

<br>

### 4. 新しいローカルブランチを作成
リモートの`01-first`ブランチの内容を基にして`my_02-second`というローカルブランチが作成される。
```bash:bash
git checkout -b my_02-second origin/01-first
```
<br>

### 捕捉
開発しプッシュするときは切ったブランチ名で
git push origin my_02-second

コミットプッシュする時は、子ディレクトリにリポジトリは作成していないので
リポジトリを作成した親ディレクトリまで移動する。

git checkout -b my_03-third origin/02-second
上記の場合、my_02-second での作業は、my_03-third には影響を与えません
ソフトウェアファースト第2版（第7章）の読書メモ

# はじめに

前回に続き、ソフトウェアファーストの第2版を読んで思ったことを書き連ねていきます。

https://amzn.asia/d/2fxjKjS

第7章（最終章）は「日本企業への提言」です。

# サイバーフィジカル領域を活かそう

デジタルツインと同義でしょうかね。

スマートストアの例がありました。私が思い浮かんだのは、カゴを置くだけで、一瞬で支払い金額が表示されるユニクロのセルフレジですね。
特許訴訟がありましたが、あの技術は、本当に便利なので、様々なお店に導入してもらいたいです。

あとは、生活の基本的なニーズが満たされていない部分もちらほらありますね。
* トイレに組み合わせて、検尿・検便を自動化
* 冷蔵庫にある残りの食材の量と賞味期限を、遠隔で表示

# 日本の強みをソフトウェア化しよう

本書で挙げられている通り、観光とサブカルが有力な資源になると思います。
ソフトウェアを通じて、それらの価値、顧客体験を最大化することができれば、他の先進国の遅れを取ることもなさそうです。

# 課題先進国であることを活かす

日本は高齢化社会ですが、そこを逆手に取って、世界中のご高齢のお金持ちの方に、来日していただき、楽しんで（安心して）お金を使っていただくことに、国を挙げて注力するのも良いのではないかな〜と思います。（もうやっているのかもしれませんが）

# 読み終えて

本書は、開発手法、組織マネジメント、ビジネスなどの、最新事例が豊富に載っており、大変参考になりました。

技術者の方にとっては、ビジネスサイドを学ぶ良い機会となり、それ以外の方にとっては、ソフトウェア開発の複雑さ・困難さを知る良い機会となるでしょう。

# さいごに

今回、章ごとに読書メモを付けてみました。
これをやらない時のいつもの読み方と比べると、深く読み込めたかなと思います。
（もし、誤解している箇所があったら、スミマセン:bow:）

また、本書を読んでいない人からすると、いったい何の内容かと思うかもしれません。あまり深く書くと、引用の域を超えてしまうので、難しいですね。

是非、本書を読んでみてください。

読書メモについては、今後もやっていきたいと思います。:muscle:
GROWI 7.0.20リリースノート

[オープンソースのWikiであるGROWI](https://growi.org/ja/)の最新版、7.0.20がリリースされました。大きな変更点はありませんが、リリースノートとして主な変更点を紹介します。

## 改善点

- ドロップダウンリストを有効にしたときの色を変更
- 管理ページの文言を一部修正
- アイコン付きクリップボードコピーボタン追加

## 不具合修正

- サイドバーの開閉時にPageControlsが予期せず動いてしまう不具合を修正
- CustomNavTabをレスポンシブ対応に

他、幾つかの不具合修正と各種メンテナンスも行われています。詳細は[Release v7.0.20 · weseek/growi](https://github.com/weseek/growi/releases/tag/v7.0.20)を参照してください。

## まとめ

GROWIはオープンソース、かつDocker composeなどで手軽に導入できます。ぜひ社内・研究室・自宅などで利用してみてください。

[OSS開発wikiツールのGROWI | 快適な情報共有を、全ての人へ](https://growi.org/ja/)
【SFDC】DML操作（データベース操作）とHTTPコールアウトを同じトランザクション内で同期的に実行することは許可されていない理由

Salesforceでは、DML操作（データベース操作）とHTTPコールアウトを同じトランザクション内で同期的に実行することは許可されていません。この制約は、主に以下の理由から生じます。

### 1. **トランザクションの整合性の問題**
DML操作（例：レコードの作成、更新、削除）はトランザクション内で実行されます。これに対して、HTTPコールアウトは外部システムと通信するため、レスポンスが遅延したり、外部システムの状態によっては応答が得られなかったりする場合があります。もしDML操作とコールアウトが同一トランザクション内で実行されると、外部システムの応答によってトランザクション全体が長時間ブロックされるリスクがあります。

このため、Salesforceではトランザクションが完了するまでの間、外部の依存関係がトランザクションの成功や失敗に影響を与えることを避けるために、DML操作と同期的なコールアウトの同時実行を禁止しています。
>デフォルトでは、必ず同じトランザクション内で DML 操作の後にコールアウトを実行することは許可されません。これは DML 操作によって、コミットされていない待機中の作業が発生してコールアウトの実行が妨げられるためです。
参考：https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_classes_restful_http_testing_dml.htm

### 2. **コールアウトの失敗がデータ整合性に与える影響**
もし、`after update` トリガー内で同期的なコールアウトを行い、そのコールアウトが失敗した場合、トリガー全体がエラーとなり、DML操作（この場合はレコードの更新）がロールバックされます。これにより、Salesforce内のデータが意図しない状態になる可能性があります。例えば、レコードの更新が完了していると思いきや、コールアウトが失敗したことでデータベース上の変更も取り消されてしまうという状況が発生します。

### 3. **非同期処理の推奨**
Salesforceでは、DML操作とコールアウトを組み合わせる必要がある場合、非同期処理（例：`@future` メソッドやQueueableクラス）を使用することが推奨されています。これにより、DML操作が完了した後に別のトランザクションとしてコールアウトを実行し、トランザクションの整合性を維持しつつ外部システムとの連携を実現できます。

### 4. **ガバナ制限の問題**
Salesforceは、プラットフォーム上でのリソース使用量を制限する「ガバナ制限」を設けています。DML操作と同期的なHTTPコールアウトを同じトランザクションで行うと、以下のようなガバナ制限に違反するリスクがあります。

- **トランザクションあたりのコールアウト数**: トランザクション内で許可されるコールアウトの数は同期Apex,非同期Apexどちらも100まで、トランザクション内のすべてのコールアウト (HTTP 要求または Web サービスコール) のタイムアウトの最大累積値は120秒です。これらを超過する可能性があります。
- **DML操作の組み合わせ**: あるトリガーで大量のレコード更新が行われる場合、さらにコールアウトが追加されるとリソース使用量が過剰になる可能性があります。
:::note info
もし一度に大量のレコードを更新し、さらにそのトリガーの中で外部システムと通信（コールアウト）しようとすると、Salesforceのシステムが「リソースの使いすぎだよ！」と判断してしまうことがあります。
例えば、ある営業担当者が管理しているお客様データ（レコード）を一度に100件更新するとします。その際に、更新されたデータを外部のシステムに通知する必要があると考えて、トリガーの中でHTTPコールアウトを100回行った場合、DML操作ではガバナ制限に引っかからないのに、コールアウトのガバナ制限に引っかかってしまいます。
:::

参考：ガバナ制限について
https://developer.salesforce.com/docs/atlas.ja-jp.salesforce_app_limits_cheatsheet.meta/salesforce_app_limits_cheatsheet/salesforce_app_limits_platform_apexgov.htm

### まとめ
「`after update`トリガー内での同期的なHTTPコールアウトがSystem.CalloutExceptionを引き起こす」というのは、DML操作とコールアウトが同じトランザクション内で行われることをSalesforceが許可していないためです。この制限を回避するためには、非同期処理を用いることが推奨されます。これにより、データベースの整合性を保ちながら、外部システムとの通信を適切に行うことができます。
初ハッカソンに参加して、2日でAIアプリを開発！

# はじめに
先日、参加しているコミュニティのハッカソンに参加しました。
「AIで日常を魔法に」というテーマのもと、2日間のうちにアイデアを出し、アプリを開発しました。

初めてハッカソンに参加してみての感想や、どのようなアプリを作ったのかを紹介していきたいと思います。

# テーマは「AIで日常を魔法に」
1日目の午前中にテーマが発表されました。

テーマ：AIで日常を魔法に

このテーマを聞いて、どのようなアプリを作るか悩みました。
AIといっても、ChatGPTのような自然言語処理をするものから、画像認識、音声認識と用途は様々です。
ある意味、色んなものが作れますが、2日間で形にできるものと考えると自分の今のレベルと照らし合わせて幾ばくか悩みました。

最終的には、Gemini APIを使いアプリを開発することにしました。
調べてみると、無料で使えるようなので、使いやすくアプリに取り入れやすいと考えました。

# 2日間で開発したアプリ：Memory teller
私が、2日間の開発を通して作成したアプリはこちらとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/fdd21240-8cc0-9efe-7580-a7af07b8e0df.png)

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/9be278a7-7c91-afd0-b5f9-fc5a3da7260f.gif)


**アプリ名**：Memory teller
**概要**：日常の思い出を特別なものに変えるAIアプリ。ユーザーが記録した思い出をもとに、AIが象徴的なストーリーを生成し、異なる視点から思い出を楽しむ体験を提供。
**機能**：思い出の記録（ユーザーが日々の思い出や出来事をテキスト形式で簡単に記録）、AIによる物語生成（記録されたテキストと選択されたカテゴリをもとに、AIがストーリーを自動生成）、ランダム表示（トップページに思い出をランダムに表示する）
**使用技術**:Gemini API, supabase, React, TypeScript

# なぜこのアプリを作ろうと思ったか
なぜ、このアプリを作ったかというと、日々経験としてたのしいこと、ありきたりなこと、つらいことなど様々なことを私たちは経験します。
その経験を基に、自分だけの物語をAIに作成してもらい、思い出をただ記録するだけでなく、AIが新たな物語的な解釈を加えることで、日常を特別なものとして記憶に刻みたいと思ったからです。

# ハッカソンに参加してみての感想
ハッカソンは残念ながら優勝できませんでしたが、得るものは多かったです。

2日間という短い期間で、アプリを開発することは今までやったことはありませんでした。
正直、ハッカソン終了までに機能が完成しないかもと思っていましたが、なんとか形にすることができました。

短い期間でしたが、その短い時間でアイデアを考え、要件を定義し、必要なライブラリ、DBのテーブルは何が必要か考えと思考を巡らせました。
**0からものをつくる大変さが分かり、世の中のアプリはこういうのを経て作られてるのだと自分の視野が広がりました。**

**とても、貴重な体験と経験ができました。**

また、ほかの参加者のアイデアや開発したアプリはどれも素晴らしく、こういった発想があるのか、こんな短い間にこのアプリを作れるのかと驚くことばかりでした。

どれもレベルの高いアプリばかりで、見ていて面白かったし、私もこういうのを作ってみたいと思ったりしました。

# アプリの改善案
ハッカソンが終わりアプリを見返してみて詳細画面を本に近いレイアウト（電子書籍形式等）にすればもっとユーザーによりよい体験ができるかなと思いました。
もっとアプリの世界観を大事にしたいです。

それと、本当はAIが生成した内容を基に、AIに画像を生成してもらってそれも詳細画面に載せたかったのですが、時間が足りず実装できませんでした。
画像が載っていればもう少し、没入感のあるものにできたかなと思います。

次回つくるアプリの参考にしたいと思います。

# 終わりに
初ハッカソンでしたが、自分のレベル感を図ることができ良かったです。
今度、どこかのハッカソンに参加する際は優勝出来たら良いなと思います。

# JISOUのメンバー募集中
プログラミングコーチングJISOUではメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？

気になる方はぜひHPからお願いします👇

https://projisou.jp
【資格試験】Python 3 エンジニア認定基礎試験に合格した話

## 1. はじめに

こんにちは！
2024年9月に**Python 3 エンジニア認定基礎試験**を受験し、
一発合格することができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2956452/32562c35-663a-06b1-a772-2d816a79060e.png)

今回は受験するにあたっての動機、
学習方法等について話していければと思います。

## 2. Python 3 エンジニア認定基礎試験とは
**Python 3 エンジニア認定基礎試験**は、Pythonの基礎知識を確認するための試験です。主にプログラミング初心者やPythonの基礎をしっかり学びたい方に向けた試験です。以下は試験の詳細です。

- **問題数**：40問
- **出題形式**：選択式
- **試験方式**：CBT方式（コンピューター上で実施）
- **試験時間**：60分
- **合格基準**：7割以上の正解
- **受験料**：  
  一般価格：11,000円（税込）  
  学割価格：5,500円（税込）

出題内容としてはPythonの文法や基本的なデータ構造、制御構文、モジュールの使用など、Pythonプログラミングの基本的な理解を問う内容で構成されています。
その他、試験の詳細については以下のサイトをご覧ください。

https://www.pythonic-exam.com/exam/basic

## 3. 受験の動機
受験動機として、まずプログラミングの基本的な知識や概念をしっかりと身に付け、実務で活用できるスキルを習得したいという思いがありました。
特に、現在業務でTableauを使用しているため、これと組み合わせてデータ分析などに応用できる手段を模索しており、その一環としてPythonに興味を持ち始めました。

また、今後受験を予定している「基本情報技術者試験」や「応用情報技術者試験」に向けた基礎固めとして、Pythonの理解を深めておくことが重要だと考え、この試験を受験することにしました。

## 4. 学習方法（勉強時間：3週間）
私が行った学習では、以下の3つの教材を使用し、**3週間**で試験対策を行いました。

### おすすめ教材

#### 1.動画

- **Pythonアカデミアさん「Python基礎文法入門（Python3エンジニア認定基礎試験 絶対合格の講座）」**  
   Python 3 エンジニア認定基礎試験の内容に沿って、基礎文法をしっかり学べる講座です。試験対策に非常に役立ちます。  
   
https://www.youtube.com/playlist?list=PLHPmh91LsTgyDBFW2XIXZG2BvV6QXilEg

#### 2.書籍
- **徹底攻略Python 3 エンジニア認定［基礎試験］問題集**  
   試験対策に特化した問題集です。試験範囲を網羅し、重要ポイントを効率よく学べます。  

https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5Python-3-%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E8%AA%8D%E5%AE%9A%EF%BC%BB%E5%9F%BA%E7%A4%8E%E8%A9%A6%E9%A8%93%EF%BC%BD%E5%95%8F%E9%A1%8C%E9%9B%86-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E3%83%93%E3%83%BC%E3%83%97%E3%83%A9%E3%82%A6%E3%83%89/dp/4295016055


#### 3.模擬試験
- **PRIME STUDY（3回分の模擬試験が無料で提供）**  
   試験対策として模擬試験を受けることで、実際の試験形式や難易度を確認し、弱点を補強することができます。  
   
https://study.prime-strategy.co.jp/

- **ExamApp（レベル別の試験形式で段階的に学習を進められる）**  
   すべての問題には解説が付いており、学習記録も無料で確認できます。進捗を見える化することで、効率的に学習を進められます。  

https://python-basic.com/

これらの教材を活用し、着実に知識を深めながら試験に備えてください。


## 5. 資格取得のメリット

Python 3 エンジニア認定基礎試験を取得するメリットには、以下のような点が挙げられます。

1. **Pythonスキルの証明**  
   資格取得により、Pythonの基礎知識を客観的に証明でき、就職や転職でアピールポイントになります。

2. **プログラミング基礎の習得**  
   資格取得の過程で、Pythonの基本文法やデータ構造など、プログラミングの基礎を体系的に学べます。

3. **キャリアアップに役立つ**  
   Pythonは需要が高い言語であり、資格を取得することでキャリアの幅が広がり、将来的な成長や昇進のチャンスが増えます。

これらのメリットが、資格取得を目指した大きな理由となります。

## 6. おわりに
Pythonは近年、非常に人気の高いプログラミング言語です。シンプルで学びやすい文法を持ちながら、データ分析やWeb開発、AIなど、幅広い分野で活用されています。

今後、**Python 3 エンジニア認定データ分析試験**や**Python 3 エンジニア認定実践試験**の受験も検討しており、さらにスキルを深めたいと考えています。
Mayaでメルカトル図から球になるアニメーション

ベンドを２回適用して、平面を球にする。

```c:mel
polyCube -w 180 -h 90 -d 1 -sx 90 -sy 45;
nonLinear -type bend;
select -r pCube1 ;
nonLinear -type bend;

setAttr "bend1.curvature" 180;
setAttr "bend1Handle.rotateY" 90;
setAttr "bend2.curvature" 180;
setAttr "bend2Handle.rotateY" 90;
setAttr "bend2Handle.rotateZ" 90;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/4850a54a-da53-e35a-29a0-4babd8841292.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/4cf1efe5-e428-577e-697f-fcdc118e6683.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/806cd641-0602-7fda-a43c-3a573af7ae69.png)

参考

https://vimeo.com/138956010

https://lesterbanks.com/2015/09/using-maya-svg-create-globe/

```c
select -r persp ;
setAttr "perspShape.nearClipPlane" 100;
file -import -type "mayaAscii"  -ignoreVersion -ra true -namespace "HumanBody" "/Applications/Autodesk/maya2024/Maya.app/Contents/Examples/Modeling/Sculpting_Base_Meshes/Bipeds/HumanBody.ma";

// Create objects
polyCube -w 3600 -h 1 -d 1800 -sx 90 -sz 45 -n "earth";
for($i = 0; $i < 10; $i++){
    polyCube -w 100 -h 100 -d 100 -sx 3 -sy 3 -sz 3 -ax 0 1 0 -cuv 4 -ch 1 -n "t";
    vector $v = <<rand(-1000,1000),
                  50,
                  rand(-1000,1000)>>;
    move ($v.x) ($v.y) ($v.z);
}

// Bend twice
select -all;

nonLinear -type bend;
select -all;
//select -r earth ;
nonLinear -type bend;
setAttr "bend1Handle.rotateX" 90;
setAttr "bend1Handle.rotateZ" 90;
setAttr "bend2Handle.rotateZ" -90;

// Animation
currentTime 0 ;
setKeyframe { "bend1.cur" };
setKeyframe { "bend2.cur" };

currentTime 100 ;
setAttr "bend1.curvature" -180;
setKeyframe { "bend1.cur" };
setAttr "bend2.curvature" 180;
setKeyframe { "bend2.cur" };

currentTime 300 ;
setAttr "bend1.curvature" 360;
setKeyframe { "bend1.cur" };

currentTime 0 ;



```
M5NanoC6でWS2812Bで遊ぶ。(M5Stackなんちゃらかんちゃらで貰った)(SONYの方であった)


結果




![o_coq4557.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c7f684c5-8557-555f-054b-6027e5e1c775.jpeg)

プログラム

```c++



//WS2812_test1_M5NanoC6_1


//初期化
void setup() {

  //GPIOの初期化
  pinMode(2, OUTPUT);

}//setup


//メインループ
void loop() {

  //白の点灯
  neopixelWrite(2, 64, 64, 64);
  delay(1000);

  //消灯
  neopixelWrite(2, 0, 0, 0);
  delay(1000);

}//loop


```
Android StudioのGitで特定のファイルをバージョン管理から外す方法

# 何をするのか
Gitで特定のファイルをバージョン管理から外したい
ターミナルを使うので、多分Android Studioに限らず同じやり方な気がする

# 環境
Android Studio Koala | 2024.1.1 Patch 2

# やり方
1. 消したいファイルを右クリックして、「パス/参照のコピー」を選択
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624480/9581b2b6-dad8-6e7b-d61d-64f24ab620a4.png)
2. 「リポジトリルートからのパス」を選択
   ![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624480/6cad72a1-7bd0-4f85-9155-6af2ba8a64b3.png)
3. 画面左下の「ターミナル」を選択
   ![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624480/bb0c5a11-0ea4-f00b-f16a-a43fdf550fba.png)
4. こんな画面が出たら
   ![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624480/b798139c-31ae-26be-3145-46a303aeaea6.png)
5. 以下のコマンドを打って、最後にペーストする
rmはremove（取り除く）の略称だね
    ```console:コマンド
    git rm --cached <ペーストしたパス>
    ```
6. 下のような感じに入力できたらEnterを押す
    ```console:例
    git rm --cached app/release/app-release.aab
    ```
7. 以下のような文字が出たらOK
    ```console
    rm '<ペーストしたパス>'
    ```

これで、消したかったファイルを変更しても、画面左のコミットを見た時に、表示されないはず。
表示されていたら、一回転した矢印を押してリフレッシュしよう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624480/91c02f86-3e84-17fa-5633-2a58a4605ade.png)

以上！誰かの役に立てれば嬉しいな。
HackTheBox/SolarLabでの仮想環境の使用について

# HackTheBox/SolarLabでの仮想環境の使用について

最近はじめてハマっています。HackTheBox!!
Qiitaでの記事を参考に攻略させてもらっていますので、自分も何か投稿してみたいと思い記事投稿に挑戦してみました。

SolarLabの攻略中に仮想環境を使ってみたことについて書いてみます。

![0_tA7VvgrFu9UlzF9Z.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894629/926baf65-31c5-bfe2-3238-03c4442296a8.png)

途中過程の記載はすっ飛ばして:runner_tone3:
chiselを通してのOpenfire Version 4.7.4の稼働確認のところまで作業を進めています:point_right_tone2:
それから”Openfire Version 4.7.4　exploit”で検索→CVE-2023-32315とたどり着き

![001-001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894629/adae39f4-0e2e-d7e4-1359-c515a9e14a58.png)

手順通り

```git clone https://github.com/miko550/CVE-2023-32315.git```

```cd CVE-2023-32315```

と、作業を進める。そして３行目

```pip install -r requirements.txt```

ここでエラー発生！

![001-002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894629/dc9a0b1c-73fd-7d2e-a736-4762f70fe95c.png)

なんのことだかよく分からないから、とりあえず無視して次の工程に突き進むと

![001-003.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894629/7aa4d21c-d8b5-5b8a-1e19-8463b1b7dce2.png)

やっぱりダメ:joy:

調べてみると「システム全体にパッケージをインストールする際に制約がある」とのこと
解決策として「仮想環境の作成」の天啓を受ける

早速、実行！

![001-004.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894629/4e40b649-08eb-0397-d7fd-1c6907605c82.png)

なんかうまくいきそう:yum:
そして期待を膨らませながら４行目の```python3 CVE-2023-32315.py -t http://127.0.0.1:9090```を実行する

![001-005.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894629/a957a76b-afcd-da93-cb24-dc12e1c6685b.png)

キターーーーって感じで上手にできました:ok_hand_tone3:
usernameとpasswordをゲットしたら```deactivate```で終了


:v_tone2:そして第２段

さらに作業を進めていってadministratorのパスワードの取得にまでたどり着く
ここまで来るのに私はもう相当疲れていましたが、最後の力を振り絞ってpsexec.pyでの接続を試みる

するとまた

![001-006.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894629/842cb7e7-2864-888d-16f3-2707e88e2aee.png)

エラーが出る:persevere:

```pip install impacket```を実行してみるが

![001-007.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894629/00e0291e-d6fe-6d7e-89ef-ad77c29f0c30.png)

(。´・ω・)ん?見たことあるような画面

「仮想環境」第２段始動！！

![001-008.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894629/331e012b-c5c1-6e14-9171-496523108ae3.png)

そして仮想環境内で再実行！

```python3 /usr/local/bin/psexec.py administrator@10.10.11.16```

![001-009.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894629/220ef682-9772-9ae3-0bf8-eb017233841b.png)

よーし、よし。で、侵入できました。
ACDLを提唱します。その7

# 概要
ACDLとは、アプリは、クラウド、大切なデータは、ローカルです。
素晴らしいアプリ見つけたので、plunkerに上げてみた。

# 参考にしたページ

https://qiita.com/G0nta/items/75e8de506e2d79a39853

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/f7cc7a74-dfcd-098d-5a53-bb4b7902e1af.png)

# 成果物

https://embed.plnkr.co/plunk/XO24S4xCkyx4qApD

以上。