OmniAICreator/Qiita-1.07M huggingface dataset:
スーパークラスの乱用：Javaにおける密結合とその解消方法

## はじめに
Javaプログラミングでは、よく継承を使用してコードの再利用を促進し、保守性と可読性を向上させるためにクラス間の関連性を表現します。しかし、適切に管理されていない継承は、システム全体を「密結合（Tight Coupling）」状態に陥れる可能性があります。この記事では、無闇にスーパークラスを使用した継承がどのように問題を引き起こすのか、そしてその解消方法について考察します。

## 密結合とは
密結合は、一部の変更がシステム全体に広範囲な影響を及ぼす状態を指します。密結合のシステムでは、単一のモジュールの変更が他のモジュールに直接影響を及ぼし、予想外のエラーやバグを引き起こす可能性があります。

## スーパークラスの乱用と密結合
スーパークラスの乱用は一般的に二つの形で発生します：過度な継承と不適切な継承です。

**過度な継承:** スーパークラスからあまりにも多くの機能を継承すると、サブクラスは過剰な責任を負うことになり、その結果、スーパークラスに変更があるたびにサブクラスも修正する必要が出てきます。

```java
class Animal {
    void eat() { ... }
    void sleep() { ... }
    void walk() { ... }
    void swim() { ... }
}

class Dog extends Animal {
    // Dog doesn't need swim, but still inherits it.
}
```

**不適切な継承:** 一部の機能を再利用するためにスーパークラスを継承すると、それが不必要な依存性を作り出す可能性があります。

```java
class Vehicle {
    void startEngine() { ... }
    void stopEngine() { ... }
}

class Bicycle extends Vehicle {
    // Bicycle doesn't need an engine, but still inherits startEngine and stopEngine methods.
}
```

これらのパターンは、システム全体を密結合の状態にし、変更と拡張を困難にします。

## 解消方法
継承の乱用からの解放は、"Composition over Inheritance"（継承よりも構成）というプログラミング原則を適用することで可能です。この原則は、必要な機能を継承するのではなく、それらを含むオブジェクトを作成することを推奨します。

```java
class Engine {
    void start() { ... }
    void stop() { ... }
}

class Car {
    Engine engine;
    
    Car(Engine engine) {
        this.engine = engine;
    }
    
    void startEngine() { 
        engine.start();
    }
    
    void stopEngine() { 
        engine.stop();
    }
}
```
このアプローチは、クラス間の関係をより柔軟で疎結合な状態に保ちます。

## スーパークラスの変更とその影響範囲
スーパークラスを継承したサブクラスは、スーパークラスのプロパティとメソッドを引き継ぐため、スーパークラスの変更は全てのサブクラスに影響を与えます。したがって、一つのスーパークラスが変更されると、その影響範囲が非常に広範にわたることがあります。

たとえば、スーパークラスに新しいメソッドが追加された場合、すべてのサブクラスでこの新しいメソッドが利用可能になります。しかし、新しいメソッドがサブクラスの一部にしか適用されない場合や、サブクラスが新しいメソッドを上書きする必要がある場合などは、影響範囲が広がり、エラーやバグを引き起こす可能性があります。

## スーパークラスでの場合分け
スーパークラス内で特定のサブクラスを特定するための場合分けを行うと、コードはさらに複雑になり、保守性が損なわれます。これは、スーパークラスがサブクラスついて知る必要性がでてきて、プログラムの全体的な柔軟性が失われるためです。

例えば、以下のようなコードは、犬のサブクラスの振る舞いをスーパークラスで制御しています。

```java
class Animal {
    String type;

    void makeSound() {
        if (type.equals("Dog")) {
            System.out.println("Woof!");
        } else if (type.equals("Cat")) {
            System.out.println("Meow!");
        } 
        // Additional conditions for other types of animals
    }
}

class Dog extends Animal {
    Dog() {
        this.type = "Dog";
    }
}
```
これは、`Animal` スーパークラスが `Dog` サブクラスの詳細について知っている必要があるため、理想的な設計ではありません。

## 解消法
これらの問題を解消するための方法もまた、「継承より構成」の原則を適用することです。また、ポリモーフィズムを利用して、スーパークラスでサブクラスの詳細を知る必要がないように設計することも重要です。

例えば、以下のような設計では、サブクラスが自身の振る舞いを制御しています。

```java
abstract class Animal {
    abstract void makeSound();
}

class Dog extends Animal {
    void makeSound() {
        System.out.println("Woof!");
    }
}

class Cat extends Animal {
    void makeSound() {
        System.out.println("Meow!");
    }
}
```
このように設計することで、サブクラスが増えてもスーパークラスのコードを変更する必要がなく、コードは柔軟性と保守性を保つことができます。

## まとめ
継承の使用が適切でないと、システム全体が密結合になり、保守性と拡張性が損なわれる可能性があります。スーパークラスの変更が広範囲に影響を及ぼすことや、スーパークラスでサブクラスの詳細についての場合分けを避けるために、「継承より構成」の原則を適用し、必要に応じてポリモーフィズムを利用することが推奨されます。これにより、システムはより疎結合な状態を保つことができます。
モダンアクティビティを使ってみた(Excel編Part7～シートを入れたり消したり～)

## はじめに
①本記事は、2023年7月開催の「UiPathブログ 発信チャレンジサマー」の12日目のブログです。
ブログの詳細、参加方法については以下のブログを参照ください。

https://note.com/shumpei_w/n/nd082bdf28853

②このブログ情報は、2023/7時点の情報です。
③UiPathはCommunity Edition、Versionは2023.6.1を使用しています。

## Excelのシート処理
これまでExcelでできることの中で、UiPathの場合シートのコピーはできたのですがそれ以外の挿入や、削除、変更等といった細かい作業は.netを使う、もしくは力技？で対応していたという方も多いかと思います。
モダンアクティビティ登場後、シートに関するアクティビティも多く実装されました。
これからちょくちょく紹介していきます。

## シートを挿入アクティビティ
「シートを挿入」アクティビティは、シートを新規で挿入できるアクティビティです。
（そのまんまですねは置いておいて）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/56ec3e68-8d47-0082-902d-1f82372c49fc.png)

早速やってみましょう。
以下は、今回のブログ記事で度々登場しているExcelの表です。
ここに"Sheet4"を入れてみたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/16c0af1c-9b41-0747-61a9-f73e25738c4a.png)


設定はこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/59e53713-d96f-b2bb-2415-e66a485f538c.png)
あと、最後にシートの名前を変数で取得しているので、ログに出してみましょう。
シート名は<b>変数(引数).Name</b>で出せます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/aae659e1-6757-b1bb-397b-f2bd78a60742.png)

結果は...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/74c35be7-465f-68f5-3ed0-fffe77e6a383.png)
新規で作成できましたね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/c0043b0a-fe66-0025-d5fa-e0b6a2735c49.png)
シート名も出ました！
## シートを削除アクティビティ
「シートを削除」アクティビティは、指定したシートの削除をしてくれるアクティビティです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/796c5fb8-5d00-56a1-aa4d-b0039e3a22f4.png)

早速削除してみましょう。
プロパティも細かいことはなくて削除するシートを選択すればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/022ac717-4244-eb95-d7d9-5e44db59c7ee.png)

実行結果は...消えてる！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/76c7004d-b63b-8b91-4567-93464f9a78a4.png)



## まとめ

シートの挿入や削除が簡単にできるようになってとっても便利になりましたね！
シートの参照名の表記が変数(引数).Nameというのは、デバッグ時に気づきました。
皆様もぜひ使ってみてくださいね！
最後までお読みいただきありがとうございました。
[Stylelint] PostCSS,Sassで定義したmixinを使用することを強制する

## はじめに
PostCSSやSCSSを使用して開発するときに、mixinを使って共通のCSSスタイルを繰り返し使用したい時などがあるかと思います。
例えば下記のベンダープレフィック付きのtransformのような場合です。
```scss
// mixinの定義
@mixin transform($property) {
  -webkit-transform: $property;
  -ms-transform: $property;
  transform: $property;
}

.class { 
  @include transform(rotate(30deg));  // mixinの使用
}
```

このようなmixinを定義したとき、プロジェクト全体でmixinを介してtransformを使用するコーディングルールにしたくなると思います。今回はそれを実現する方法を紹介します。

## 結論、Stylelintの`"property-disallowed-list"`を使用する
Stylelintの[property-disallowed-list](https://stylelint.io/user-guide/rules/property-disallowed-list/)を使用することで特定のプロパティの使用を禁止することが出来ます。

このルールでmixinを介して指定する必要のあるプロパティを禁止しつつ、lintのエラーメッセージをカスタマイズしてmixinを使用するよう促します。
```json
{
  "rules": {
    "property-disallowed-list": ["transform", {
      "message": "mixinを使用してください。"
    }]
  }
}
```

## おわりに
非常に薄い内容の記事になってしまい恐縮ですが、私がmixinを使用するよう強制するルールを使いたい時すぐにStylelintの`property-disallowed-list`を使用する発想に至れなかったため、同じような人の役に立てればと思い記事にしてみました。

おかしな点があればご指摘いただけますと幸いです、最後まで読んでいただきありがとうございました！
Webを支える技術まとめ

# Webの歴史について

### Web以前のハイパーメディア
ハイパーメディアとは、テキストや音声、映像などの様々なメディアをハイパーリンクで結びつけて構成したシステムのこと。

ハイパーメディアの起源は1945年に米国で発表された **Memex（メメックス）** という情報検索システムについての論文だと言われている。
Memexは実在するシステムではなくて、あくまで構想だったが情報が相互に結びついて、リンクを辿って情報を参照できるというWebを彷彿とさせるシステムだった。

Memexの構想に影響を受けたTed Nelsonは、現在のWebをさらに進化させた機能を持つ **Xanadu（ザナドゥ）** の開発を試みたが、複雑なシステムであっため失敗に終わった。
「ハイパーテキスト」や「ハイパーメディア」という言葉を考案したのは、Nelsonである。

Web以前に成功を収めたハイパーメディアとしては、Bill Atkinsonが1987年にAppleで開発した **HyperCard**がある。
HyperCardはネットワークを通じてデータをやり取りする機能はなかったが、カードと呼ばれる文章を単位として、相互にリンクを貼ってデータを参照することができた。
Flutterにおけるアーキテクチャを勉強します

結局MVVMってなんなの？使うメリットは？そもそもアーキテクチャって何？
という超初心的なところから学んでいく。

### アーキテクチャとは
ざっくりとした概要を下記リンクから抜粋

https://www.redhat.com/ja/topics/cloud-native-apps/what-is-an-application-architecture

アプリケーション・アーキテクチャは、アプリケーションの設計と構築に使用されるパターンと手法を記述したものです。アプリケーションを構築する際に従うべきロードマップとベストプラクティスが提供されるため、使用することでアプリケーションが適切に構造化されます。
とのこと。

### MVVMとは
アーキテクチャパターンにもさまざまあるが、今回はMVVMにスポットを当ててそのメリットや考え方について学んでいく。
#### 利用するメリット

https://paranoias.net/93/

上記のサイトより抜粋。
ーーー
・状態管理がシンプルになる
・テストが容易になる
・コードの再利用性が高まる
・コードの可読性が向上する
・開発効率が向上する
ーーー
コードの構成を大きくmodel、view、viewmodelと役割で分離させることで上記のメリットが生まれ、保守性も高まるということがわかった。

#### 考え方

https://wasabeef.medium.com/flutter-%E3%82%92-mvvm-%E3%81%A7%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B-861c5dbcc565

上記のサイトが１番初心者でも飲み込みやすかった。
抜粋すると↓
ーーー
MVVM の構成要素の基本的な考えは
View は UI (Widget) を描画（出力）し、ユーザからの入力データを受け取ります。
ViewModel は View から入力された状態（データ）を適切に変換して Model として持ちます。また、Model の状態（データ）を View 渡して画面の更新を促します。
Model は状態（データ）を保持し、それがどう変換されて画面に描画されるかは知りません。
であり View、ViewModel、Model の 3 つです。

なので厳密にいうとこの README にあるアーキテクチャの図は MVVM だけではなく Repository pattern も含まれています。
Repository pattern はデータソースへのアクセスを抽象化するためのデザインパターンです。ViewModel が持つことになりますが、ViewModel 側からすると Repository とデータの形式だけを取り決めるだけで、入手先がサーバからなのか、ローカルの DB なのか、オンメモリなのかなどは知りません。

ここまでが、MVVM + Repository pattern の簡単な説明です。
ーーー

### 関連パッケージ

大体の概要は把握できたのでMVVMを利用していくにあたっての重要なパッケージとその役割を学んでいく。
#### ① ``riverpod ``

https://pub.dev/packages/flutter_riverpod

状態管理とDI（依存性注入）を簡潔におこなうためのパッケージ。
グローバル定数としてProviderを宣言できるため、どこからでも状態にアクセスできるようになる。
``riverpod``に加えて``flutter_hooks``も同時利用する場合はこちら↓

https://pub.dev/packages/hooks_riverpod

Providerには複数の種類があり、それぞれに適した状態管理ができる。
・``FutureProvider``
　　非同期で取得した値を提供する
・``StreamProvider``
　　断続的に最新の値を提供する
・``StateNotifierProvider``
　　外部から変更可能な状態と、状態操作メソッドクラスを提供する
などなど

#### ② ``freezed``

https://pub.dev/packages/freezed

immutable（不変）なオブジェクトとそれに必要な機能を自動生成してくれるパッケージ。
詳しくはこちら↓

https://zenn.dev/sae_eng/articles/ed68107fdae18d#%E5%BF%99%E3%81%97%E3%81%84%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEfreezed

#### ③ ``dio``

https://pub.dev/packages/dio

API通信を実行するためのパッケージ。
通信ログを簡単に取ることができたり、タイムアウトの時間を指定することができる。

#### ④ ``flutter_hooks``

https://pub.dev/packages/flutter_hooks

UIの状態管理をサポートするパッケージ。
state情報へのアクセスが非常にしやすくまた、アクセスする際にさまざまなメソッドが良いされているため状況に合わせ柔軟な開発を実現することができる。
Amazonの商品ページURLを短くするChrome Extension

## はじめに

こんにちは。週末から夏休みに入る[@yug1224](https://twitter.com/yug1224)です。

**Amazonの商品ページって、ほんっっっっっっっっとURLが長いですよね！**

https://qiita.com/notakaos/items/d3058242c221882c303b

[@notakaos](https://twitter.com/notakaos)さんが公開していた記事と似たようなことを自分もしていたので紹介します！

![天井を見上げてそわそわする段ボールの中の猫のフリー素材](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106236/fa608364-ff8c-86fa-309b-cb6b25470d66.jpeg)
アイキャッチは[天井を見上げてそわそわする段ボールの中の猫のフリー素材](https://www.pakutaso.com/20220429101post-36967.html)

## 作ったもの

実際に作ったものは非常にシンプル。

`https://www.amazon.co.jp/*`の遷移時に`/dp/XXXXXXXXX`を見つけて、表示しているURLを変更するだけです。


```js:index.js
const url = location.href;

const [_, p1] = url.match(
  /https:\/\/www\.amazon\.co\.jp\/.*dp\/([0-9A-Z]{10})\/?/
);

history.replaceState(null, '', p1 ? `https://www.amazon.co.jp/dp/${p1}/` : url);
```

```json:manifest.json
{
  "manifest_version": 3,
  "name": "Pretty Amazon URL",
  "description": "",
  "version": "1.0",
  "content_scripts": [
    {
      "js": ["index.js"],
      "matches": ["https://www.amazon.co.jp/*"]
    }
  ]
}
```

manifest.jsonの`content_scripts[].matches`に`https://www.amazon.co.jp/*`を指定しているので、Amazonにアクセスした時のみindex.jsが実行されます。

index.jsでは`location.href`から`/dp/XXXXXXXXX`を探して、`history.replaceState()`で表示しているURLを変更するという処理が動きます。

簡単ですねー！

manifest.jsonの詳細については公式ドキュメントの「[Manifest file format](https://developer.chrome.com/docs/extensions/mv3/manifest/)」を参照してください。


## 使い方

https://github.com/yug1224/pretty-amazon-url

プログラムは[yug1224/pretty-amazon-url](https://github.com/yug1224/pretty-amazon-url)で公開しています。git cloneするかダウンロードをして、ブラウザの拡張機能ページで読み込んでください。

1. [yug1224/pretty-amazon-url](https://github.com/yug1224/pretty-amazon-url)をgit cloneかダウンロード
1. ブラウザの拡張機能のページを開く
    - [chrome://extensions/](chrome://extensions/) (Google Chrome)
    - [edge://extensions/](edge://extensions/) (Microsoft Edge)
1. デベロッパーモードを有効にする
1. 「パッケージ化されていない拡張機能を読み込む」をクリックして、ダウンロードしたフォルダを選択する

これでAmazonの商品ページにアクセスするだけでURLを短くしてくれるようになります。

![人が増えても速くならないがURLは変換される](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106236/58f193b7-7270-fd4a-e353-3df4c6c52966.gif)

ぜひ使ってみてください！Enjoy!
ブートストラップの導入方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/528624af-a989-c8e5-6f3b-f400449d4730.png)
１：Bootstrapの公式サイトからダウンロードする手順
①ダウンロードボタンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/b4b9b54f-21ac-3058-6534-e4dba4fcebb5.png)
②コンパイルされた CSS と JSのダウンロードボタンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/35655bd5-c346-5e05-c254-f368070dbd31.png)
③ダウンロードされたCSSとJSをVSコードに入れ込む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/32eff774-f6d3-aacf-b341-6e51055e57db.png)
【AWS】DBSに合格しました

スイカバーが美味しい季節になりました。

どーも、のぶこふです。

先日、AWS認定データベース−専門知識（DBS-C01）に合格したので、ふり返りをしようと思います。

専門知識に合格となると、界隈の反応も良いので、自身のモチベアップにも繋がりますね。
いいねしてくださった方々、ありがとうございます。
https://twitter.com/nobkovskii/status/1678743776247050240?t=BxeC5ZW50zElYxfNekIz4g&s=19

## 筆者情報
* 中堅エンジニア
* 業務でAWSを触ることは、あったりなかったり
* 社内の取組みで、AWSの勉強は年間を通して実施中
* CLF（2021/07）、SAA（2022/03）、DVA（2023/04）取得済
    * いつもギリギリで合格。今回もギリギリでした…

## きっかけ
* 社内の取組みの一環でDynamoDBを調べていて、「せっかくだし、資格も狙ってみるか」と思ったのがきっかけ

## 勉強期間
* 2ヶ月前後
    * 本格的に始めたのは、2023年4月にDVAを取得してから（GWあたりからだと思う）

## 教材
* 書籍
    * 要点整理から攻略する『AWS認定 データベース-専門知識』
    * https://www.amazon.co.jp/dp/4839975078/
* 問題集
    * TechStock（有料版）
        * DVA用に買っていて、途中で期限切れてしまったので、仕上げ問題はできず…
    * AWS SkillBuilder
* AWS公式
    * BlackBelt
    * 各サービスのよくある質問

## 学習方法
* はじめに（勉強計画）
    * 試験対象のサービス等の洗い出し。
    * Dynamoは別途学習していたので軽め。QLDBはブロックチェーン関連ということで軽め。（ブロックチェーンかじってたので）
    * その他、出題傾向が低いサービス（RedshiftやNeptune）も軽め。残ったのはAuroraとRDSなので、ここを重点的に実施。
* 書籍
    * 通勤時の電車内で実施。
    * 勉強を始めた頃はつまみ食いのようにRDSとAuroraを眺めてました。ただ、対象のサービスが絞られているので、「比較したいな」と思い、それぞれの比較表みたいなのを作りました。書籍に既に比較表があったので、それとは別に作りました。
    * 巻末の問題集の答えから「こういう時は、コレを選ぶ」というのをまとめました。問題は解かずに、はじめから答えを見てまとめていきました。
* 問題集
    * 通勤電車で、TechStockを計1.5週。正答率は、6割くらい。
    * SkillBuilderも同様に通勤電車で実施。3週して、最終的には1ミス（ケアレスミス）
* おわりに
    * 仕上げとして、比較表の修正/追記だったり、苦手な箇所（CloudWatchとかのログや監査周りが特に弱い）を勉強し直したりしました。

## 試験結果
* 760点くらい
    * 手応え的には、10問ミスくらいで、結果8割くらいだと思って余裕こいてたら全くそんなことはなかったというオチ
    * まだまだ理解が浅いですね

## 当日の問題の所感
* 全体的に、問題文は比較的短め。後半のほうが長くなってきて、集中力がきれてきてた。
    * 半分くらいまではすいすい行ってたのに、折り返してからが長かった。
    * 午前中に仕事してたのが、影響してるかも
* どのサービスを使いますか？みたいな問題は、１，２問くらい。各サービスの機能とかを問われるのが多かった。
* バージョンがまだ01ということもあってか、問題集と類似問題も数問出てきていたので、問題集はやっておくこと。
* AWS関係無い話も出るので、普通にDBの知識は別途必要（DDLが〜とか、MySQLのパラメータが〜とか）
    * DB歴5年くらいの知識が必要と記載あったきがします

## その他感想とか
* 出題範囲にも記載がありますが、CloudFormationといったIaCであったり、ログ周りではCloudWatchはもちろんKinesisあたりも出てきます。あと、普通にMySQLのパラメータとか。
* A4のコピー用紙を、100均のバインダーに挟んで、電車で座れたら、まとめてました。
    * そんな人を見かけてたら、おそらく私です（笑）

## ノート（一部）
* 比較表として作成したノートの一部を公開します(笑)
* チラッと日付が見えてますが、ギリギリになって「比較表みたいなの作ろう」となったので、色々と荒いです…


![IMG_20230712_220647.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/2b081849-d2ce-be6f-4095-017ea7e31798.jpeg)
![IMG_20230712_220659.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/5250af83-c6a1-d3c1-4da3-43228dd31218.jpeg)
![IMG_20230712_220720.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/aae9eba8-3a1a-0632-f2c4-c4023b3d5295.jpeg)

## おわりに
ということで、今回はDBSの勉強について振り返りを行いました。
似ている機能が多いので、どのユースケースで、どれを使うのか？は横並びで見ると分かりやすいと思います。（チャート図にしても面白いかも）

それでは、良いAWSライフを！

ありがとうございました。
【備忘録】AWSのサブネットのIPとサブネットマスクについて

# はじめに
AWSにポートフォリオをデプロイする過程でサブネットを作成する機会がありました。その際にサブネットマスクを分かっておらずIPアドレスをどう割り当てればいいかに悩みました。「192.168.0.0/24の『/』ってなんだ？」っていう状態でした。サブネットの設定を乗り切るための最低限の情報を備忘録として記載します。

# サブネットマスクとは
サブネットマスクはIPアドレスのネットワーク部とホスト部を分けるためのものです。
「192.168.0.0/16」とすると、「192.168」までをネットワーク部とすることができ、「0.0」をホスト部とすることができます。すなわち、192.168.0.1～192.168.255.254のIPアドレスを使用することが可能となります。
「192.168.0.0/24」とすると、「192.168.0」までをネットワーク部とすることができ、末尾の「0」をホスト部とすることができます。すなわち、192.168.0.1～192.168.0.254のIPアドレスを使用することが可能となります。
「192.168.0.0/16」の方が「192.168.0.0/24」よりも広いイメージです。

# AWSでの使用例
AWSでフロントエンド、バックエンド用のサブネットをそれぞれ２つずつ作る場合を想定します。
サブネットの前提としてVPCを作成する必要があります。サブネットはVPCを分割するものであり、VPCの中にあります。したがって、VPCに割り当てるIPアドレスのサブネットマスクはサブネットに割り当てるものより小さくすべきです。
そこで、先ほどの「192.168.0.0/16」の「192.168.0.0/24」関係を利用して以下のようにIPアドレスを割り当ててサブネットを作成することが考えられます。

![サブネットマスク.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3439167/7cecd400-d7fe-b850-8259-48ffbbdd43cc.png)

# 終わりに
サブネットではVPCよりもサブネットマスクの数字を大きくする(32まで)。

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

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

https://www.youtube.com/watch?v=28C3Djjx6ew
VRChatのアバターに"好きな画像を映す懐中電灯"を入れてみた

VRChatのアバターにFPS系ゲームによくあるスプレー的(壁に画像を映す)機能付けたいな～
そんな安直な感じで始まったやつです。

こんな感じのものができます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184264/8172f31d-02d7-1320-fb65-4864bd73cd0f.png)

# 画像の準備

表示したい画像を**正方形**で用意します。
ここで言う「正方形」は画像サイズの話で、
余白となってしまう部分は**黒塗り**でOKです。
(こんな感じで丸く囲ってもいいかも)
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184264/6d53dcfd-32e1-5ec0-a4a9-fbd539537163.png">
上に重ねてる画像です。よかったらどうぞ
<img width="100" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184264/bfc9b4cb-cefe-69c3-da35-17026ad7e4ff.png">
次に用意した画像を**RGB分離**させ、**グレースケール**にします。

ブラウザ上でやってくれるやつあるのでそれ使うといいかもですってか自分で作りました↓
[RGBGrayScaleGenerator](https://axtuki1.github.io/RGBGrayScaleGenerator/)

ここまでで、3枚の画像が新たにできているはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184264/84bcd50e-7573-9240-f138-f90baf4bf801.png)

# Unityで導入

赤、緑、青の3色のスポットライトを用意します。
各色のライトのCookieにそれぞれの色に対応する生成した画像を入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184264/aacbc92f-a1c1-625e-ded0-42e0e23f578a.png)
これでちゃんとした色で画像が出ているはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184264/8172f31d-02d7-1320-fb65-4864bd73cd0f.png)
が、ライトをCubeに近づけるなどして小さくすると下のように繰り返して表示される事があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184264/7a06fedd-d93a-97c1-2fc5-18331f27b498.png)
この場合は画像のインポート設定を変える事で解消できます。
`Warp Mode`を`Repeat`から`Clamp`に変えましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184264/39993765-fc33-3033-8174-d0979cb98183.png)
あとは懐中電灯とかにいれるなどして遊びましょう。

# 蛇足

これ既に販売している[プロジェクター](https://axtuki1.booth.pm/items/3485505)でやってることなのよね…

あ、当たり前ですけどAvatar Detailsに表示されるLightのカウンタが
画像一つにつき+3されるので、『偏った知識をお持ちの方』に誤解されるかもです。
まぁそれだけで判断するのもどうかとは思いますがネ。

# 使用アセット
[ポンデロニウム研究所 - オリジナル3Dモデル「桔梗」](https://ponderogen.booth.pm/items/3681787)
AWSで負荷テストを試した(Distributed Load Testing on AWS)

先日fargateで運用しているシステムで負荷テストをDistributed Load Testing on AWSで実施しました。
初めての負荷テストとのことで分からないことだらけでしたが、備忘録的にブログを書こうと思います。

今回構築手順は説明しません。以下の記事が参考になりました。
https://aws.amazon.com/jp/builders-flash/202108/distributed-load-testing/?awsf.filter-name=*all
https://tech.connehito.com/entry/2022/08/23/115302

Distributed Load Testing on AWS とは
---
AWS公式ドキュメントによると以下の通りです。

> 大規模および負荷時のソフトウェアアプリケーションテストを自動化して、リリース前に性能上の潜在的なパフォーマンスの問題を特定するのに役立ちます。このソリューションは、一定のペースでトランザクションレコードを生成する数多くの接続ユーザーを作成およびシミュレートします。サーバーをプロビジョニングする必要はありません。

https://aws.amazon.com/jp/solutions/implementations/distributed-load-testing-on-aws/

要するに、負荷分散テストを効率的かつ効果的に実行するための優れたツールです。

Distributed Load Testing on AWSを使うことで、高負荷状況下でのアプリケーションのパフォーマンスを簡単にテストすることができます。AWSの計算リソースを活用することで、大規模な負荷をかけることも可能ですし、テストデータの分析も容易になります。

構成は以下の図のとおりで、負荷をかけているときだけタスクが起動し、終了すると全てのタスクが停止するようになっているため費用を抑えられるところが良かったです。
![distributed-load-testing-on-aws-architecture.f9ce398c930f3c737f3155816c4ce1ebdcebead2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1350459/5e95903c-4843-cb62-3d54-d9d17289e539.png)
WebサーバーにはALBが用意されており、複数のタスクが同時に接続されて負荷がかかイメージ。
![0-640x268.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1350459/4f8da625-c12c-34f8-db46-e811b3559f47.png)


負荷分散テストの重要性について
---
ウェブアプリケーションやシステムが、多数のアクセスに対しても円滑に動作し、性能が維持できるかどうかを確認することは極めて重要です。そのために、負荷分散テストは欠かせません。

負荷分散テストの重要性を十分に理解し、積極的に取り組むことが、ビジネスの成長や競争力向上に役立つことをまずお伝えしたいと思います。なぜなら、負荷分散テストは、システムのパフォーマンスや安定性を確保し、ユーザー体験を向上させるために重要だからです。

負荷分散テストの目的は、システムが大量のアクセスに耐えられるかを事前に検証し、負荷が高い状況での問題点を見つけ出すことです。これにより、アクセスが増えた際にシステムがクラッシュしたり、遅延が発生したりするリスクを抑えることができます。

また、負荷分散テストは、インフラの構成や設定の最適化にも役立ちます。テストを行うことで、リソースの消費やネットワークのボトルネックなどの問題を特定し、改善することができるのです。

さらに、負荷分散テストは、コスト削減にも貢献します。負荷が高い状況をシミュレーションすることで、適切なリソース量を見極めることができ、無駄な投資を抑えることが可能となります。

それでは、負荷分散テストを実施しない場合、どのようなリスクがあるのでしょうか。例えば、大規模なキャンペーンやプロモーションが成功し、急激にアクセスが増加することが考えられます。その際にシステムが対応できない場合、売上減少や企業のイメージ低下などの深刻な結果を招く可能性があるのです。

このように、負荷分散テストはビジネスにおいて非常に重要な役割を果たしています。ぜひ、負荷分散テストに注力し、システムの品質と安定性を向上させることで、競争力のあるビジネスを展開してください。
【GAS】Gmailの内容を定期的にスプレッドシートに出力したよ

Gmailでメールを受信したらスプレッドシートに項目を出力したいという業務依頼があり、実装しましたのでやったことを書いています。

# Gmailで受信したメールをGASで取得ってできる？

できます。

GmailAppというライブラリでGmailから検索をします。
https://developers.google.com/apps-script/reference/gmail/gmail-app?hl=ja

下記は過去30分以内のメールを最大30件取得する例です。

```js
// Gmailから特定条件のスレッドを検索しメールを取り出す
const unixTime = (new Date()).getTime();//UNIX TIMEに変換
const now = Math.floor(unixTime/1000); //ミリ秒を秒に変換
const term = now - 1800; //現在時刻から30分（1800秒）前
const termStr = term.toString(); //検索期間を文字列に変換

const strTerms = 'after:'+ termStr
var threads = GmailApp.search(strTerms, 0, 30);
```

下記はメールのタイトルと本文を取得してスプレッドシートに出力する例です。

```js
for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();
    
    for (var j = 0; j < messages.length; j++) {
      var message = messages[j];
      var subject = message.getSubject();
      var date = message.getDate();
      
      // スプレッドシートにデータを書き込む
      sheet.appendRow([subject, date]);
    }
  }
```

# GASで取得できるデータ項目

GASを使用してGmailから取得できるデータは以下の通りです:

### メールの情報:

- 件名 (Subject)
- 送信者 (From)
- 受信者 (To)
- CC
- BCC
- 受信日時 (Date)
- メールのID (ID)
- スレッドID (Thread ID)
- メールのサイズ (Size)
- ラベル (Labels)
- 重要度 (Importance)
- 未読/既読状態 (Read/Unread)

### 本文の形式:

- プレーンテキスト本文 (Plain Text Body)
- HTML形式の本文 (HTML Body)

### 添付ファイル:

- 添付ファイルのファイル名 (Attachment File Name)
- 添付ファイルのコンテンツタイプ (Attachment Content Type)
- 添付ファイルのサイズ (Attachment Size)

### スレッド情報:

- スレッド内のメールの数 (Number of Messages in Thread)
- スレッドのID (Thread ID)
- スレッドの件名 (Thread Subject)
- スレッドの初めのメッセージ (First Message in Thread)
- スレッドの最新のメッセージ (Last Message in Thread)
- スレッドの未読/既読状態 (Thread Read/Unread)

gasでGmailから取得できるデータは何があるかChatGPTさんに聞いた回答です。

# メールの受信時にGASの処理をトリガーすることはできる？

調べたところそのような方法は見つかりませんでした。

私がやった方法としては、30分おきにメールBOXを検索するバッチ処理を発火させるやり方です。

Apps Scriptの[トリガー]から設定が可能です。

![スクリーンショット 2023-07-12 21.59.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608177/c69ee5e9-316f-844e-1476-02ac6c3beecf.png)

今回は30分おきでも問題ありませんでしたが、最短で１分間隔の設定ができるのでほぼほぼリアルタイムでメールの内容がスプレッドシートに反映可能だと思います。

以上です。

ちなみに、「Gmailでメールを受信したことをトリガーにGASの関数を実行させることはできますでしょうか。」とChatGPTに質問したところ回答をもらえたのですが、、これは本当なのでしょうか？

```
はい、Gmailでメールを受信した際にGASの関数を自動的に実行させることは可能です。これを実現するためには、GASのトリガーを設定する必要があります。

以下に、Gmailでメールを受信したときにGASの関数を実行する方法を説明します。

GASのプロジェクトを開きます。

メニューから「トリガー」を選択します。

画面右下の「＋新しいトリガーを追加」をクリックします。

「トリガーを設定する関数を選択」のドロップダウンメニューから、実行したい関数を選択します。例えば、前回説明したprocessNewEmails関数を選択します。

「イベントのソースを選択」のドロップダウンメニューから、「Google Apps のトリガー」→「Gmail」を選択します。

「イベントの種類を選択」のドロップダウンメニューから、「受信時」を選択します。

トリガーの詳細を適切に設定し、保存します。

これにより、Gmailでメールが受信された際に指定した関数が自動的に実行されます。

ただし、この機能を有効にするためには、Gmail APIを有効にする必要があります。GASエディタで「リソース」→「高度なGoogleサービス」を選択し、Gmail APIを有効にしてください。

この方法で、Gmailの受信をトリガーにしてGASの関数を実行することができます。
```
ChromeのDevToolsでスマホ表示ができなかったので対処法

# 結論
Firefoxの開発者ツールを使う。ちなみにEdgeは無理だった。

:::note warn
追記(2023/07/12)
コメントにて、Chromeでもシークレットブラウジングを使って検証すると違った結果が得られる可能性があると教えていただきました。
[スマホ向けWebページの検証を行う方法](https://qiita.com/aqril_1132/items/4789bc12a511136d8bfa#pc%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%AE%E3%83%87%E3%83%99%E3%83%AD%E3%83%83%E3%83%91%E3%83%BC%E3%83%84%E3%83%BC%E3%83%AB%E5%86%85%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB%E3%83%A2%E3%83%BC%E3%83%89%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%82%B7%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)の「PCブラウザのデベロッパーツール内モバイルモードを使用してシミュレートする方法」の手順で行うとChromeでもうまく動作するかもしれません。
[コメント](https://qiita.com/sin471/items/8cda29cf7d5f48703df6#comment-c124c148ba52baf6bb80)も参照してください。
:::

# 経緯など(蛇足)
ChromeのDevTools(F12で出てくる開発者ツール)でモバイルエミュレーターを使うと、(サイトが対応していれば)PCからスマホ向けの画面を見られる。
しかしある日、スマホ向けの画面を見たいのに、画面サイズを指定してもなおPC向けの画面が表示されることがあった。
いろいろ考えた結果、Chromeの開発者ツールだからダメなのではと思い、Firefoxの開発者ツールを使った。そうしたら無事スマホ向け画面が表示された。ちなみに、「Edgeは内部的にはChrome」みたいに聞いたことがあったのでEdgeで試してみたら案の定ダメだった。

# 参考
https://qiita.com/aqril_1132/items/4789bc12a511136d8bfa
このページに、（Chromeに限らず）ブラウザの開発者ツールのエミュレート機能について、
>基本的に画面幅を変えた上でユーザーエージェント情報を偽装するだけの機能なので過剰な信用は禁物。油断するとヒドい目に遭います。

と書いてあったので、Chromeの開発者ツールに問題があるのではと考え、Firefoxを試した。
Qiita 記事の書き方

# 概要
初めてQiitaで記事を書くにあたり、MarkDown記法についてまとめる

# 目次
[文字サイズ](#文字サイズ)
[文字の装飾](#文字の装飾)
[リンク挿入](#リンク挿入)
[画像挿入](#画像の挿入)
[コードの挿入](#コードの挿入)

# 文字サイズ
▼概要
文字の大きさを変更することができます
▼使い方
「# 文字」のように、文頭に「#」を入れることで可能になります。
※#の数は6つまで使用可能です。
※#の後にスペースを入れてください

```:記入例
# h1
## h2
### h3
#### h4
##### h5
###### h6
```
# h1
## h2
### h3
#### h4
##### h5
###### h6

# 文字の装飾
▼概要
文字の様式に変化を与えることができます
▼例
1 文字の太さ
2 斜め
3 打消し

▼使い方
```:使い方（太さ）
文字を**太く**する
or
文字を __太く__ する
※両サイドのアンダーバーは1マス開ける
```
文字を**太く**する
文字を __太く__ する

<hr />

```:使い方（斜め）
文字を*diagonal*にする
or
文字を _diagonal_ にする
※英語のみ
```
文字を *diagonal* にする
<hr />

```:使い方（打消し）
この文字を~~打消し~~ます
```
この文字を~~打消し~~ます

<hr />

```:使い方（色）
<font color="red">赤色</font>
```
<font color="red">赤色</font>

▼参考文献
[Qiitaのマークダウンで色をつける方法[140色]](https://qiita.com/twipg/items/d8043cd4681a2780c160)
<hr />

# リンク挿入
▼概要
文字にリンクを挿入することができる

```:使い方（基本）
[表示させたい文字](リンク先のURL)
```
[Qiita](https://qiita.com/)

```:使い方（目次と連結）
[表示させたい文字](#参照先の見出し) 
[目次に戻る](#目次)
```
[リンクの挿入](#リンク挿入)

<hr />

```:使い方(サイト埋め込み)
(空白)
リンク
(空白)
```

https://qiita.com/Cookie_Iwate/items/7941a5d71a6c4c3af31a

<hr />

# 画像の挿入
▼概要
ページ内に画像を表示させることができる

```:使い方
## タイトルありの画像を埋め込む
![代替テキスト](画像のURL "画像タイトル")

## タイトル無しの画像を埋め込む
![代替テキスト](画像のURL)
```
![Qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3497194/4f5436c6-f067-70d1-f882-fc1d38c6f41a.png "Qiita画像")

<hr />

```:使い方（画像の大きさ変更）
<img width="50" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3497194/4f5436c6-f067-70d1-f882-fc1d38c6f41a.png">
```
<img width="50" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3497194/4f5436c6-f067-70d1-f882-fc1d38c6f41a.png">


# コードの挿入
▼概要
以下のようなものを作成する
```:JavaScript:コード
const profile = { "name": "cookie", "age": 22 }
console.log(profile.name)
```

▼以下のように書く
![スクリーンショット 2023-07-12 214314.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3497194/3b5e064b-f8d1-9ae9-4b54-9a1c53b69828.png)


# 終わりに
気が向いたら他にも記事を書く予定です
【Mac】ターミナルからリマインダーを操作する方法


## reminders-cliを使用する

reminders-cliを使用することでコマンドでリマインダーを追加できます。

Homebrewでインストールするには以下のコマンドを実行します。

```terminal
brew install keith/formulae/reminders-cli
```

リマインダーを追加するには次のように実行します。

```terminal
$ reminders add リマインダー reminders-cliで追加 --due-date "today 3pm"
Added 'reminders-cliで追加' to 'リマインダー'
```

上記の場合には「リマインダー」というリストに「reminders-cliで追加」というタイトルの当日の午後3時が期限のリマインダーが作成されます。

リマインダーの追加以外にも編集や削除などもできます。
詳細は以下をご参照ください。

https://github.com/keith/reminders-cli


## AppleScriptを使用する

以下のコマンドを実行することでリマインダーを追加できます。

```terminal
osascript -e 'tell application "Reminders" to make new reminder with properties {name:"AppleScriptで追加", allday due date:current date} at list "リマインダー"'
```

上記を実行すると「リマインダー」というリストに「AppleScriptで追加」という名前の当日終日が期限のリマインダーが追加されます。

リマインダーのプロパティ一覧は以下のとおりです。

| プロパティ | 説明 |
|:-|:-|
| name (text)  |リマインダーの名前 |
| id (text, r/o)  |  リマインダーの一意な識別子 |
| container (list or reminder, r/o)  |  リマインダーのコンテナ |
| creation date (date, r/o)  | リマインダーの作成日  |
| modification date (date, r/o)  |  リマインダーの変更日 |
| body (text)  |  リマインダーのメモ |
| completed (boolean)  |  リマインダーが完了したかどうか |
|  completion date (date) | リマインダーの完了日  |
| due date (date)   | リマインダーの期限。日付と時間の両方を設定する  |
| allday due date (date)  |  リマインダーの期限。日付のみ設定する |
| remind me date (date) | リマインダーの期日を指定する |
| priority (integer)  | リマインダーの優先順位。<br>0：優先順位なし、1〜4：高、5：中、6〜9：低 |
| flagged (boolean) |リマインダーにフラグを立てるかどうか |
物価だから自分で教材作ろう(経費削減)！

# 子育て中のエンジニアの皆様
## 給料は政府の言う通り上がりましたか？
- エクスポーターなわが社は上がるどころか実質下がりました・・・
- んでもって出張禁止令でQCの命も奪われ、社内無職です！で、AIに本腰入れます。
- Qiitaは社内非公式手順書の体を取っていますが、誰もフォロワーがいない！
- そう、非製造業なんで・・・メーカだったらなぁ

# 愚痴はさておき手を動かします。

- 今年はモノづくりと検査がメインテーマになっているので、その辺りの試行錯誤をしています。
- 異常検知はそれだけでは製品検査には厳しいみたい・・・

https://zenn.dev/manyan3/articles/c42e3651e9fe8d

## ひそかに師匠と呼ばせていただきますshinmura0さんのこの手法がいいのかな・・・

https://qiita.com/shinmura0/items/0b09aa66f58a12686a84

- 個別には動かせてはいる。ただし、製品単位でとなるとちょっと難しい
- 有料のサービス併用がホントは楽ですが、「エンジニア」なら気合見せろや！とすごまれたので、自分で作っております(苦笑)
- 進展ありましたら、私も先人に習ってヒントをご紹介できれば。
- すでに最新技術が出回っていますが、ひとまず枯れた技術で勝負します。

:::note info
インフォメーション
2020年に FasterGradCAMを社内で見せたら馬鹿にされた！悔しい。すごい良かったのに
- ROSに走る。ROSも楽しいので、何とかしたいけど肝心のロボットが使えないのでIssac＋ROS
- こういう事情でちょっとロボ系の優先度が下がっております。
- 非製造業でもロボットいじれるならいいよという若い方ご連絡お待ちしてます。
:::

# お受験するならお勉強
**お金がないのに無謀にもお受験**
- 私の幼少時代は小学校そばの学童に買って入り浸ってお金を取られた記憶がありません。
- ふつうの学童サービスはア〇製造機、家畜のブロイラーな感じが満載。
- 外国語もあんな調子なら～
- 不合格でも、勉強する習慣がつけばいいかなと思っています。

# 自分で教材作ろう！
**造りはおいといて、情熱で勉強の習慣をつけてもらおう**
- 子供が計算に興味を持ちだしたので、計算を作る
- 図形なんかつくってみたり
- 数年放置したWindows のAnacondaを活用しよう。

## ホントはスマホですが、こちらは製作難航
早めにお披露目したいと頑張っています。

:::note info
駄作おきました
:::

https://github.com/mi-kaneyon/man-yard

## 園児レベルにはこういうのが意外とうけました

https://github.com/mi-kaneyon/person_privacy

:::note info
自分にモザイクがかかるのが楽しいようです
:::

# 2023/9 追加
## 透明人間をつくろう

https://github.com/mi-kaneyon/man-yard/tree/main/kidimage

![toumin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2155177/c7d966c2-9255-6955-19a2-d442d4c565c3.png)

子供にはウケた・・・
初めてのJuliaインストール

## 初めに
https://qiita.com/baby-degu/items/7d4e295964ebb6e92de4

の記事を見てJuliaを知ったので試す。
なんかコードが簡潔で、C言語より早いらしい？
ついでにPythonも使えるらしいから、やってみる。

参考にしたサイトは下記
・https://qiita.com/ttabata/items/b05bb43d06239f968035
・

## インストール

Julia - 公式ページ
https://julialang.org/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327497/8209f0de-85d3-de17-1231-637611dbd215.png)

windows 64-bit

・ダウンロードしたインストーラーを実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327497/3b1239d3-4154-8a64-fe94-3ee25c0782c6.png)


## 実行する

インストーラーが完了して実行
Julicaのプロンプト画面が表示された

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327497/29754614-d08f-efa0-c0c8-65b7ef596268.png)

``1+1``入れてみた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327497/bf64803c-5856-7027-c3e0-b4f581a3e1c8.png)

``ans``と入れると、前の答えが返せる
（これが何に役に立つのかいまいちわからんが、、）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327497/cccda96d-ca26-21d7-9ed6-a5a860a7154a.png)

？を打つとヘルプモードになる
``if``とうったらヘルプが出た

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327497/f49a0783-4311-a180-9db6-43a4319592af.png)


## 終わり

いったんこんなもん
JupyterNotebookを実行できるらしいのでそれを試してみる
sar コマンドの基本

## sarコマンドとは
　sar（System Activity Reporter）コマンドは、システムのパフォーマンス監視に使用されるユーティリティです。さまざまなリソースの使用状況データを収集し、リアルタイムまたは過去の情報を提供します。
　sarコマンドを使用することで、システムのパフォーマンスやトラブルシューティングに役立つ情報を取得できます。

## sarコマンドの使用法
sarコマンドは、ターミナルで以下のように使用します：
```
sar [オプション] [インターバル] [回数]
```

インターバル: データの収集間隔を指定します。たとえば、-u 1 のように指定すると、1秒ごとにデータが収集されます。
回数: データの収集を行う回数を指定します。たとえば、-u 1 5 のように指定すると、1秒ごとにデータが5回収集されます。

## 主なsarコマンドのオプション
　以下に、sarコマンドでよく使用される主なオプションをいくつか紹介します：
```
-u: CPUの使用率を表示します。
-r: メモリの使用状況を表示します。
-n: ネットワークの統計情報を表示します。()
```
 これらは一部の例であり、sarコマンドには他にも多くのオプションがあります。man sar コマンドを実行すると、全てのオプションと詳細な説明を確認することができます。

## sarコマンドの出力と各項目
### CPU使用率  `sar -u`の出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2134351/8c9ed27d-33ce-4d31-97bc-1d81865f1cd5.png)

　`sar -u`の出力を載せました。CPUや%userとった項目があることが分かります。

| 項目  　　|      概要      |  
|----------|-------------|
| CPU     |  CPUの識別子              |  
| %user   |   CPUがユーザモードで実行された割合 |  
| %nice   |優先度の低いプロセスがCPUを利用している割合 |    
| %system |  カーネルがCPUを利用している割合 | 
| %iowait |    入出力待ちの状態でCPUを利用している割合  |  
| %steal  | 仮想環境のホストシステムが、仮想マシンからCPUを奪って利用している割合 | 
| %idle   | CPUがアイドル状態である割合 |       

### メモリ使用状況  `sar -r`の出力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2134351/ae4e1f86-dc7d-6af2-b9dc-22fd15b7d6fd.png)

| 項目     | 概要                                         |
|--------------|-----------------------------------------------|
| kbmemfree    | 空きメモリの容量（キロバイト単位）                |
| kbavail      | 非スーパーユーザーに利用可能なメモリ容量（キロバイト単位） |
| kbmemused    | 使用中のメモリの容量（キロバイト単位）            |
| %memused     | 使用中のメモリの割合（%）                       |
| kbbuffers    | バッファキャッシュのメモリ容量（キロバイト単位）  |
| kbcached     | キャッシュされたメモリの容量（キロバイト単位）    |
| kbcommit     | コミットされたメモリの容量（キロバイト単位）      |
| %commit      | コミットされたメモリの割合（%）                 |
| kbactive     | アクティブなメモリの容量（キロバイト単位）        |
| kbinact      | 非アクティブなメモリの容量（キロバイト単位）      |
| kbdirty      | ダーティ（変更された）メモリの容量（キロバイト単位） |

### ネットワークの統計情報  `sar -n`の出力

  `sar -n` の第一引数にはDEV、TCP、ETCPなどを指定する必要があります。
DEVはネットワークデバイスからの統計情報を表示し、TCPはTCPv4のトラフィックについての統計情報、ETCPはTCPv4のエラーについての統計情報を表示します。

EVの出力結果を載せます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2134351/d1a5c859-5367-3718-59f3-af95b296f3e1.png)


| 項目   | 概要                                       |
|-------------|--------------------------------------------|
| IFACE       | ネットワークインターフェースの名称                 |
| rxpck/s     | 受信パケットの平均速度（パケット/秒）              |
| txpck/s     | 送信パケットの平均速度（パケット/秒）              |
| rxkB/s      | 受信データの平均速度（キロバイト/秒）              |
| txkB/s      | 送信データの平均速度（キロバイト/秒）              |
| rxcmp/s     | 受信圧縮パケットの平均速度（パケット/秒）           |
| txcmp/s     | 送信圧縮パケットの平均速度（パケット/秒）           |
| rxmcst/s    | 受信マルチキャストパケットの平均速度（パケット/秒）   |
| %ifutil     | ネットワークインターフェースの利用率（%）          |



## まとめ
この記事では、sarコマンドの概要、使用法、主なオプション、および出力の解釈方法について紹介しました。sarコマンドは、Linuxシステムのパフォーマンス監視やトラブルシューティングに役立つ強力なツールです。さまざまなオプションを活用して、必要な情報を収集し、システムのパフォーマンスを評価することができます。
Git講習第9話「GitHubの秘密兵器：GitHub Actions」

# この記事について
本記事は社内で実施したGit講習のスライドを元に作成された記事です。
Gitを使ってはいるものの、どういう構造になっているかとか仕組みについてはあまりわかっていないという方たちを対象にしています。
# 前回
https://qiita.com/sho_fcafe/items/aa750549e67061539f5a
# イントロダクション
![スクリーンショット 2023-07-12 20.28.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476743/5b31fc09-4f35-6524-b4be-472470b4e576.png)
以前にも学んだ通り、GitHubはGitをベースとしたWebサービスですが、ファイル管理以外の機能も提供しています。
その中から今回はGitHubActionsについて学んでいきましょう。
# CI/CD
GitHubActionsについて学習する前にCI/CDについて説明をします。

CI/CDは、ソフトウェアをより高速かつ効率的にリリースするための方法です
## CI（Continuous Integration）
開発者が一日に何度もコードを共有リポジトリにマージするプロセスで、コードの自動ビルドと自動テストが含まれます。これにより、バグや他の問題が早期に発見され、修正が容易になります。
## CD（Continuous Delivery/Deployment）
本番環境に効率的にデプロイできるようにするプロセスです。"Delivery"は、本番環境へのデプロイが手動で行われることを意味し、"Deployment"は、デプロイが自動化されることを意味します。
# GitHubActionsとは
GitHub Actionsは、GitHubに組み込まれている機能の一つです。この機能を使うと、ソフトウェアを開発する際の作業を自動化できます(つまりCI/CDを実現するための機能ということです）。
たとえば、あなたが作ったプログラムのコードをGitHubにアップロードした時に、自動的にそのコードをテストするように設定できます。また、他の開発者があなたのプロジェクトに貢献しようとしてプルリクエストを出した時に、それを自動で確認する設定も可能です。
このように、GitHub Actionsは開発作業を自動化し、時間と手間を節約することができます。
そしてその設定はすべてコードで書くので、必要な作業を明確にし、それを再利用することが可能です。
# 次回？
今回で講習としては一通りの説明が終わりです。
今後は不定期にGit関連のケーススタディがあれば続編として掲載していこうと思います。
ここまで読んで頂いた皆様ありがとうございました！
個人的によく使うコードまとめ(順次追加）

# 基本使うモジュールのインポート
# データの準備
- 基本モジュール
```python 
#モジュールの読み込み
import pandas as pd 
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
```


- ディレクトリの確認
```python
#ディレクトリの確認
import os 
```

- データセットの読み込み（特にエンコーディング）

- デートセットの出力
```python
 df.to_csv('filename.csv', index=False)
```

ヘッダーが不要ならば `` header=False``
その他細かいことは( https://note.nkmk.me/python-pandas-to-csv/ )
- colaboratoryマウント
```python
from google.colab import drive 
drive.mount('/content/drive') 
```
- colaboratoryディレクトリ
``` python
%cd "/content/drive/My Drive/*
```

# データの確認
- データの一部を確認する
 ```python
 pd.set_option('display.max_columns', None) 
 df.head() 
```
- 欠損値確認
```python
print(df.isnull().sum() / len(df))
 ```
- データの重複を外す
```python
 df.drop_duplicates(inplace=True) 
```
- カテゴリカル変数の中身確認
``` python
df["column".value_counts() 
```
# データの加工
- データの抽出
- データの結合
- 対数変換
```python
 df["log_column"]=np.log(df["column"]) 
```
- ダミー変数
```python 
making_dummy=['colmn1','column2'] 
df_dummied= pd.get_dummies(df, columns=making_dummy)
```
- object型の変数
- データの確認
```python
# オブジェクト型の変数が格納された列のリスト
object_columns = []

# 列を反復処理してオブジェクト型の列を抽出
for column in df_raw.columns:
    if df_raw[column].dtype == 'object':
        object_columns.append(column)

# 各列の値の頻度を数える
column_frequencies = {}
for column in object_columns:
    frequencies = df_raw[column].value_counts()
    column_frequencies[column] = frequencies

# 結果の表示
for column, frequencies in column_frequencies.items():
    print("列:", column)
    print(frequencies)
    print()
```

# EDA
## 1変数
- 基本統計量
```python 
df["column"].describe()
 ```
## 2変数以上
# 検定統計
# 機械学習
## 教師あり
### クロスバリデーション
### 決定木系モデル
### 回帰モデル
### Balanced Bagging Classifier

```# BalancedBaggingClassifierを作成
from imblearn.ensemble import BalancedBaggingClassifier
from imblearn.under_sampling import RandomUnderSampler
base_estimator = LGBMClassifier() #用いたいモデル
bagging_model = BalancedBaggingClassifier(base_estimator=base_estimator, n_estimators=10, random_state=42)
```

## 教師なし
## ハイパーパラメタ
Git講習第8話「レビューの力：プルリクエストの利点」

# この記事について
本記事は社内で実施したGit講習のスライドを元に作成された記事です。
Gitを使ってはいるものの、どういう構造になっているかとか仕組みについてはあまりわかっていないという方たちを対象にしています。
# 前回
https://qiita.com/sho_fcafe/items/e349cfde9d1ea0ba02b0
# イントロダクション
![スクリーンショット 2023-07-12 20.11.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476743/e434605d-572c-c2e9-217c-ff89c3fd84fa.png)
前回作業ミスをリカバリーする機能について学びましたが、後輩ちゃんの心配もわかります。
今回はGitHubのプルリクエスト機能について学んでいきましょう。
# プルリクエストとは
プルリクエスト（Pull Request、PRとも略される）は、主にGitHubやGitLabなどのプラットフォーム上で利用され、自分が行ったコードの変更を他の人に知らせ、レビューしてもらい、マージを行うための手段です。
![スクリーンショット 2023-07-12 20.14.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476743/4b5c18d8-383a-695f-ec49-b425f0f51f6d.png)
## 実践
実際にプルリクエストを発行してみましょう
![スクリーンショット 2023-07-12 20.15.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476743/83ad53e2-87c7-a4c6-8023-9ccbc88eb848.png)
![スクリーンショット 2023-07-12 20.17.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476743/6c4b73d2-47d3-2193-57ff-4149a79268d6.png)
![スクリーンショット 2023-07-12 20.18.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476743/1a7f334b-7308-6d60-757a-dc6cb0ea5453.png)
![スクリーンショット 2023-07-12 20.19.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476743/d75986ad-b075-d7a3-ebac-9b495931b94c.png)
![スクリーンショット 2023-07-12 20.20.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476743/baf1d453-d90e-63ba-bba5-f6cf9a34278c.png)
![スクリーンショット 2023-07-12 20.20.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476743/f38c9bb3-93b5-2e3c-cda2-131b7d919169.png)
# 次回
第9話「GitHubの秘密兵器：GitHub Actions」へと続きます
https://qiita.com/sho_fcafe/items/fa9a4170c5e86452c938
Django学習備忘録 -開発時にCSSをHTMLに反映させる方法-

# はじめに
Djangoの私的学習メモです。
ChatGPTにて調べた内容と追加で調べた内容、実際に実装した内容を見返せるように記事としてまとめました。


# CSSの適用方法（開発時）

## 開発環境
- Djnago : 4.2
- アプリディレクトリ作成済み
- 各アプリ毎に"static"フォルダを作成しCSSを格納する

## 手順
1. "BASE_DIR"のディレクトリを確認
    デフォルトではプロジェクトフォルダが指定されている
    ```python:settings.py
    BASE_DIR = Path(__file__).resolve().parent.parent
    ```
2. "STATIC_URL"を確認
    デフォルトでは"static/"が指定されている
    ```python:settings.py
    STATIC_URL = "static/"
    ```
3. "STATICFILES_DIRS"を設定
    "STATICFILES_DIRS"にアプリ毎の静的ファイルのパスを指定する
    ```python:settings.py
    STATICFILES_DIRS = [
        BASE_DIR / "アプリ名" / "static",
    ]
    ```
4. アプリのディレクトリに"static"ファイルを作成しその中に"css"フォルダを作成
    ```
    "プロジェクト名"/
            ├ "プロジェクト名"/
            │        ├ ...
            │        └ settings.py
            ├ "アプリ名"/
            │        ├ ...
            │        └ static/
            │            　　　　└ css/
            ├ templates/
            ├ db.sqlite3
            └ manage.py
    ```
5. "templates"ディレクトリ内に"アプリ名"ファイルを作成しhtmlを作成
    ここでは例として"index.html"を作成する
    ```
        "プロジェクト名"/
            ├ "プロジェクト名"/
            ├ "アプリ名"/
            ├ templates/
            │        └ "アプリ名"/
            │                └ "index.html"
            ├ db.sqlite3
            └ manage.py
    ```
6. "css"ファイル内に"index.css"を作成
    ここでは例として"index.css"を作成する
    ```
        "プロジェクト名"/
            ├ "プロジェクト名"/
            ├ "アプリ名"/
            │        ├ ...
            │        └ static/
            │            　　　　└ css/
            │                　　　　└ index.css
            ├ templates/
            ├ db.sqlite3
            └ manage.py
    ```
7. "index.html"のhead内に以下の内容を記載
    - {% load static %}
    - cssのlinkタグ、hrefの参照先はcssファイル内のcssを指定
    ```html:index.html
    <!DOCTYPE html>
    <html lang="ja">
      <head>
        {% load static %}   #追加
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" context="IE=edge" />
        <meta name="viewport" context="width=device-width", initial-scale=1.0 />
          <title>Index</title>
        <link rel="stylesheet" href="{% static 'css/index.css' %}" />   #追加
      </head>
    
      <body>
        <h1>index.htmlのh1を表示中</h1>　　　#必要に応じて記載
      </body>
    </html>
    ```
8. "index.css"に任意のコードを記載
    ここでは例としてh1タグの文字の色を変更する
    ```css:index.css
    h1 {
        color:darkblue;
    }
    ```

    文字の色が変わっていれば無事終了です。

# まとめ
Djangoでcssを適用させるには"static"フォルダを作成しその中にcssを記載する。
そして、html内で"static"を読み込み、cssのパスを指定することでcssをhtmlに反映させることができる。
【SwiftUI】Textの文字同士のスペースを操作する

# はじめに
Textの使ったことのない機能を発見したので記事にしておきます

# 実装
```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack(spacing: 10) {
            Text("サンプル")
                .kerning(0)
            
            Text("サンプル")
                .kerning(10)
            
            Text("サンプル")
                .kerning(20)
            
            Text("サンプル")
                .kerning(30)
        }
    }
}
```

![simulator_screenshot_1CF7BB98-41FC-4C46-9A79-350D0B3DBA24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/e79be9b5-5f3c-2d3a-d5f6-a391f1e2766e.png)

# おわり
こんなことができたんですね、、、
AWS Lambda + Python でログ出力がうまくいかない件

AWS Lambda で Python 関数を作ったらログ周りでハマったのでメモ。

## 困りごと
こういう Lambda 関数を作って実行したが、ログが出力されない。

``` python
import logging

# ルートロガーのログレベルを設定する
logging.basicConfig(level=logging.INFO)

logger = logging.getLogger(__name__)

def lambda_handler(event, context):
    logger.info("foo!!!")
```

- 似たような Python スクリプトを普通の python コマンドで実行した場合は意図通り出力される
- Lambda の Python ランタイムだけでなく、 `public.ecr.aws/lambda/python` をベースに作った Docker コンテナでも同様の問題が発生する



## 原因
Lambda の Python ランタイムでは、**あらかじめルートロガーに StreamHandler が設定されている**のが原因だった。

そもそも `basicConfig` の挙動は「ルートロガーにデフォルト設定のハンドラを追加する (ただし、**既にルートロガーにハンドラが設定済みの場合は何もしない**)」[^basicConfig] なので、ルートロガーのハンドラが事前に設定されているのであれば `logging.basicConfig(level=logging.INFO)` が無視されるというのは仕方ない。

[^basicConfig]: https://docs.python.org/ja/3/library/logging.html#logging.basicConfig

じゃあなぜ AWS Lambda の Python ランタイムはルートロガーのハンドラがあらかじめ設定済みなのかというと、そのあたりはよくわからなかったのでご存じの方はコメントいただけると嬉しい。

## 対処方法
いくつかパターンがあるので、状況に応じて選ぶのがよい。

### `basicConfig` を使わずにルートロガーのログレベルを設定する
`getLogger()` は引数を省略するとルートロガーを返すので、これに `setLevel` すればログレベルを設定できる。

``` python
import logging

# ルートロガーのログレベルを設定する
logging.getLogger().setLevel(logging.INFO)

logger = logging.getLogger(__name__)

def lambda_handler(event, context):
    logger.info("foo!!!")
```

### ロガーに対してログレベルを設定する
``` python
import logging

logger = logging.getLogger(__name__)

# ロガーのログレベルを設定する
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    logger.info("foo!!!")
```

ただしこの場合、ルートロガーのログレベルを書き換えていないため、別のモジュールのロガーのログレベルはデフォルトのままとなる。

### `force=True` する (非推奨)
`basicConfig` に `force=True` を渡せば、ルートロガーにハンドラが設定済みであっても強制的にログレベルを設定できる。

``` python
import logging

# ルートロガーのログレベルを設定する
logging.basicConfig(level=logging.INFO, force=True)

logger = logging.getLogger(__name__)

def lambda_handler(event, context):
    logger.info("foo!!!")
```

ただし AWS Lambda が事前に設定したハンドラが消えてしまうので、何か挙動がおかしくなってしまうかもしれない。あまりやらないほうがよさそう。
Git講習第7話「ミスからの復活：Gitのリカバリー方法」

# この記事について
本記事は社内で実施したGit講習のスライドを元に作成された記事です。
Gitを使ってはいるものの、どういう構造になっているかとか仕組みについてはあまりわかっていないという方たちを対象にしています。
# 前回
https://qiita.com/sho_fcafe/items/104057c0c5e22d59527d
# イントロダクション
![スクリーンショット 2023-07-12 19.42.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476743/3606f6dd-7691-f49b-a11d-b5e18e3c1a8f.png)
Gitを使ってチームでファイルを共有することは便利ですが、作業ミスでチームに迷惑をかけてしまうこともあるかもしれません。
そんな時でもさっとミスをリカバリーできる便利な機能を学んでいきましょう。
# リバート
revertは、特定のコミットの変更を元に戻すためのコマンドです。これは過去のコミットの変更を取り消す新しいコミットを作成します。
![スクリーンショット 2023-07-12 19.46.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476743/44b25d88-8f5a-365f-4f57-3de0b1809b0b.png)
## 実践
リバートを実践してみます。
まずはファイルを変更してコミットします。
```bash
echo 'ABC' >> hello.txt
git add hello.txt
git commit -m "add ABC"
```
コミットができました。
次にリバートをするために必要なコミットIDを確認したいのでログを参照してみましょう。
```bash
git log –oneline
```
このコマンドを実行すると下記のようにログが表示されます。「ab5937f」の部分がコミットIDです。
```
128fe0b (HEAD -> main) add ABC
ab5937f add ABC
・
・
（省略）
```
コミットIDがわかったのでリバートを実行してみます
```bash
git revert 128fe0b
```
これでリバートができました。
ファイルを見ると先ほどのコミットが取り消しされているはずです。
# リセット
resetは、特定のコミットに強制的に移動するためのコマンドです。これにより、一連のコミットを一度に元に戻すことができます。
![スクリーンショット 2023-07-12 19.52.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476743/c4bf08c3-b8da-c54b-9462-6cadbba78041.png)
## 実践
リセットを実践してみます。
まずはログを確認します。
```
git log --oneline
```
下記のログが表示されました。
```
e39bfde (HEAD -> main) Revert "add ABC"
（省略）
95954ba ファイルの内容を変更したよ
ac4c113 初めてのコミット
```
今回は95954baの時点まで戻してみようと思いますので下記のコマンドを実行します。
```bash
git reset --hard 95954ba
```
これでリセットができました。
ファイルを見ると一気にファイルの状態が戻っているはずです。
# チェリーピック
cherry-pickは、他のブランチから特定のコミットを選び、現在のブランチに適用するためのコマンドです。これにより、全ての変更ではなく、特定のコミットだけを選んで取り込むことができます。
![スクリーンショット 2023-07-12 19.59.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476743/691bd3b8-476d-e125-a20b-9c5cc1d382f5.png)
## 実践
チェリーピックも実践してみます。

まずは新しくブランチを作成し、そこでファイルに２つの変更を行い、それぞれコミットをしてみます。
```bash
git checkout -b branchD
echo 'changeA' >> hello.txt
git add hello.txt
git commit -m "add changeA"
echo 'changeB' >> hello.txt
git add hello.txt
git commit -m "add changeB"
```
これでbranchDに２つのコミットが行われました。
ログを見てましょう。
```bash
git log --oneline
```
```
7ac268a (HEAD -> branchD) add changeB
7047eb2 add changeA
（省略）
```
２つのコミットが確認できましたね。
では、mainブランチに戻って7047eb2のコミットだけをmainに取り込んでみます。
```bash
git checkout main
git cherry-pick 7047eb2
```
これで7047eb2のコミットの内容だけがmainブランチに反映されました。
# 次回
第8話「レビューの力：プルリクエストの利点」へと続きます
https://qiita.com/sho_fcafe/items/aa750549e67061539f5a
分析モデルのタスクの種類と、対応する評価指標

初めて投稿します。
昨年から独学で少しづつPythonを触り始め、今年５月ころkaggleのタイタニックコンペで、ようやく初めてsubmitすることができました。
　タイタニックコンペのあと画像分析の賞金コンペに取り組んでみたのですが、モデル評価に２週間かけたあと、エラーが出た所で心が折れてしまい、サブミットまで至りませんでした。
　足りない所を補って再チャレンジしたかったのですが知識不足の部分が多く、何がわからないのかがわからない状態のまま、しばらく月日が経ってしまいました。
　kaggleマスターの方がおすすめしていた書籍で「kaggleで勝つデータ分析の技術」という本を読んだ際に、自分は分析コンペの種類に応じた予測方法や評価モデル、分析の流れを全く把握していなかったことがわかりました。
　データ分析の技術の２章の部分の内容をまとめてみました。アウトプットとして、こちらに投稿させていただきました。予測例など、ChatGPTを使って補足しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743575/b40264a6-a20c-e069-3b80-6644b6045c34.png)
Git講習第6話「ブランチの流れを整理：リベースの導入」

# この記事について
本記事は社内で実施したGit講習のスライドを元に作成された記事です。
Gitを使ってはいるものの、どういう構造になっているかとか仕組みについてはあまりわかっていないという方たちを対象にしています。
# 前回
https://qiita.com/sho_fcafe/items/fe3dc7b80e0622f61032
# イントロダクション
![スクリーンショット 2023-07-12 19.36.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476743/0c2e5dbc-4410-baa1-ce10-62a78fec1038.png)
確かにたくさんのブランチができる視認性が落ちる気がしますね。
今回はリベースについて学んで行きましょう。
# リベースとは
リベースは、一連のコミットを新しいベースに適用し直す操作を指します。

具体的には、あるブランチのコミットを、他のブランチの最新のコミットの上に「再適用」します。
これにより、ブランチ間のコミット履歴を線形に保つことが可能となり、プロジェクトの履歴を見やすくする助けとなります。
![スクリーンショット 2023-07-12 19.38.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476743/6a74e02b-70f6-4d95-fc2f-4cab14bea76f.png)
# 次回
第7話「ミスからの復活：Gitのリカバリー方法」へと続きます
https://qiita.com/sho_fcafe/items/e349cfde9d1ea0ba02b0
Reactでmap関数を使用する時に分かっていなかったこと

APIやデータベースから取ってきた配列を1個ずつ見るときにmap関数を使用しています。
その際にいつも同じエラーを出してしまっていることに気付いたので忘れないようにアウトプットすることにしました。

## map関数の中で親要素は1個でないといけない
記事を書くにあたって確認用に自分で書いたコードだとかなり分かりやすいエラーが出ました。
いつもはmap is not functionみたいなエラーで画面真っ白だった気がするのですがなぜなのでしょうか。

```react:動く
///
  return (
    <>
      {data.map((user, index) => (
        <div key={index}>
          <div>{user.first}</div>
          <div>{user.last}</div>
          <div>{user.born}</div>
        </div>
      ))}
    </>
  );
///
```


```react:動かない
///
  return (
    <>
      {data.map((user) => (
        <div>{user.first}</div>
        <div>{user.last}</div>
        <div>{user.born}</div>
      ))}
    </>
  );
///
```

## mapの=>の後はJSXの中では()、外では{}？
今日いくつかのチュートリアル動画を見てタイトルの通りだと思っていました。
ですが記事を書くにあたって自分でコードを書いてみるとなぜかどちらでも動きました。
使い分けが全く分からないのでまだまだ勉強が足りないのだなと感じます。
調べても思うような答えがヒットしないのでもし読んでいるあなたが知っていることがあれば教えてください。

```react:=>の後が{}
///
  return (
    <>
      {data.map((user, index) => {
        <div key={index}>
          <div>{user.first}</div>
          <div>{user.last}</div>
          <div>{user.born}</div>
        </div>;
      })}
    </>
  );
///
```

```react:=>の後が()
///
  return (
    <>
      {data.map((user, index) => (
        <div key={index}>
          <div>{user.first}</div>
          <div>{user.last}</div>
          <div>{user.born}</div>
        </div>;
      ))}
    </>
  );
///
```