OmniAICreator/Qiita-1.07M huggingface dataset:
自分専用、2桁、3桁、4桁で数字の前に「0」ゼロを付ける。


いろいろ、注意
----

- UNO での　予定は、未定

プログラム
----

オンラインコンパイラpaiza

```c++

#include <iostream>
using namespace std;

void z4(char *str){
    if(str[0] == 0) return;
    if(str[1] == 0) {
        str[4] = 0;
        str[3] = str[0];
        str[2] = '0';
        str[1] = '0';
        str[0] = '0';
        return;
    }
    if(str[2] == 0) {
        str[4] = 0;
        str[3] = str[1];
        str[2] = str[0];
        str[1] = '0';
        str[0] = '0';
        return;
    }
    if(str[3] == 0) {
        str[4] = 0;
        str[3] = str[2];
        str[2] = str[1];
        str[1] = str[0];
        str[0] = '0';
        return;
    }
}

void z3(char *str){
    if(str[0] == 0) return;
    if(str[1] == 0) {
        str[3] = 0;
        str[2] = str[0];
        str[1] = '0';
        str[0] = '0';
        return;
    }
    if(str[2] == 0) {
        str[3] = 0;
        str[2] = str[1];
        str[1] = str[0];
        str[0] = '0';
        return;
    }
}

void z2(char *str){
    if(str[0] == 0) return;
    if(str[1] == 0) {
        str[2] = 0;
        str[1] = str[0];
        str[0] = '0';
        return;
    }
}

int main(void){
    // Your code here!
    char a1[16] =    "1";z4(a1);printf(a1);printf("\n");
    char a2[16] =   "12";z4(a2);printf(a2);printf("\n");
    char a3[16] =  "123";z4(a3);printf(a3);printf("\n");
    char a4[16] = "1234";z4(a4);printf(a4);printf("\n");

    char b1[16] =    "1";z3(b1);printf(b1);printf("\n");
    char b2[16] =   "12";z3(b2);printf(b2);printf("\n");
    char b3[16] =  "123";z3(b3);printf(b3);printf("\n");

    char c1[16] =    "1";z2(c1);printf(c1);printf("\n");
    char c2[16] =   "12";z2(c2);printf(c2);printf("\n");
}


```

```

0001
0012
0123
1234
001
012
123
01
12

```
宅配で例えるネットワーク入門

## ことはじまり

この記事ではネットワークの仕組みを宅配に例えて解説します。

ネットワークはよく配達サービスに例えられますが、ここでは無理やりにでもすべてを宅配で例えて説明します。

なので多少は現実の仕様と食い違うところも出てくるかと思いますが、入門なので読んだ人がなんとなくネットワークについてのイメージを持てたらそれでよしということにします。

## 登場人物紹介

### 配送会社

この会社は全国規模の配送会社です。日本全国どこにでも荷物を届けます。

頼まれれば依頼者の家にまで行って荷物を受け取り、配送します。

全国各地に事業所があり、たくさんの配達員を抱えています。

ここでの配達業者は**ネットワークとその仕組みそのもの**です。

<br>

### 配達員

配達員は会社から指示を受けて荷物を届けます。

届け先は住居とは限りません。事業所から事業所に運ぶこともあれば、住居から事業所に運ぶこともあります。

ここでの配達員は**データの流れ**です。

<br>

### お客さん

お客さんは基本的に配達員から荷物を受け取るか、逆に荷物を渡す可視化しません。

自分で荷物を運ぼうとは毛ほども思わない怠け者です。

ここでのお客さんは皆さんが普段使っているPCなどの**端末**です。

スマホが自分で歩いてサイト探しに行ったりしないですよね。

<br>

## ことはじめ

ある日一人のお客さんが最新のゲーム機が欲しいと思いました。

売っているゲーム会社の名前はわかるのですが、困ったことにそのゲーム機がどこに置いているのかわかりません。

そこでいつもお世話になっている配送業者を利用してどこにそのゲーム機がおいてあるのかを調べようと思いました。

## ゲーム販売会社（サーバー）はどこにありますか

お客さんはまず、ゲーム販売会社がどこにあるのか、**情報屋**に聞きに行ってもらうように宅配業者にお願いしました。

配達員さんはゲーム販売会社の名前が書かれたメモをもってすぐに出発しました。

情報屋さんに着くと、メモに書かれたゲーム販売会社の名前を情報屋に見せました。

情報屋は住所を書いたメモを用意し、別の配達員さんをお客さんのもとへ向かわせました。

:::message
情報屋とはここでは**DNSサーバー**のことになります。ゲーム販売会社の名前は**ドメイン名**です。

ブラウザの検索欄でよく見る**https://～.com** は **URI** の **～.com** の部分がドメイン名になります。

このドメイン名だけではサーバー（ゲーム販売会社）はどこにあるのか知ることはできません。なので情報屋さんにゲーム販売会社の住所（**アドレス**）を教えてもらうわけです。
:::

:::message
メモという紙切れ一枚だって立派な荷物（**パケット**）です。

パケットは通信における伝送単位のことを指します。
:::

## ゲーム機の注文

ゲーム販売会社の住所がわかったお客さんは大喜びです。

しかしよくよく考えると今度はその住所が実際にどこにあるのかわかりません。

ここでまた配送業者の出番です。

お客さんは配達員さんにゲーム販売会社の住所とほしいゲーム、それから自分が住んでいる場所の住所を書いたメモを渡し、ゲームを注文してくるようお願いしました。

ですが今度は配達員さんもこの住所がどこにあるのか知りません。

しかしご心配無用、配送業者は全国各地に事業所を構えており、そこでは住所がどこにあるのかも調べることができます。

配達員さんは事業所へ向かうことにしました。

:::message
ここでの事業所は**基地局**にあたります。

基地局はインターネット業者が管理していて、各基地局はほかの基地局とケーブルでつながっています。

電柱をみると太い電線の上にもう一つ細い線が通されていますが、あれがネットワーク用の**ファイバーケーブル**です。

私たちはこの基地局に仲介してもらうことでインターネットを利用できるようになっています。
:::

## パケッツリレー

事業所についた配達員さんは事業所の受付口（**ポート**）に行き、もらったメモを係の人に渡します。

この配達員さんのお仕事はここで終わり。あとは事業所内の係員に任せます。

係員はその住所がどっちの方向にあるか知っていたので、一番近いほうの窓口に行き、そこでまた配達員さんにメモを渡しました。

しかし困ったことにこの配達員さんはその住所を見てもどこにあるのかわかりません。そこでここから一番近い別の事業所に向かうことにしました。

...といったことが何回か繰り返され、使命を託されし最後の配達員さんが目的のゲーム販売会社にメモを届けることに成功しました。

:::message
IPアドレスが分かったからと言って真っすぐ目的のアドレスにたどり着けるわけではありません。

目的のサーバーにケーブル一本で直接つながっているなんでことはそうそうないわけですから。

そういうわけで必然的にネットワーク通信はバケツリレーになります。

ルーターが別のルーターにデータを送り、またそのルーターも別のルータに送り...。

このような繰り返しでやっとデータが送り届けられるのです。
:::

## ゲーム機の発注

メモを受け取ったゲーム販売会社はさっそくゲームの配送を配達員にお願いします。

メモにはお客さんの住所が書かれていたので、どこに届ければいいかはわかります。

ゲーム販売会社はお目当てのゲーム機と一緒にお客さんの住所が書かれたメモを配達員さんに渡しました。

そしてまた注文するときと同じようにバケツリレーをして、ようやくゲーム機がお客さんのもとに届きました。

めでたしめでたし。

## ことじまい

ネットワークの働きについていくらかでもイメージを持っていただけたでしょうか。

実際はここで紹介したよりももっと多くの仕組みがかかわっています。

それについてはまた別の機会に取り上げることにして、もし説明の間違いや分かりにくい部分があれば気兼ねなくコメントで教えていただけますとありがたい限りです。
Reactでスクロール方向を検知する超シンプルなカスタムフック

Reactでスクロール方向を検知するhooksについて紹介・解説をします。

## 結論のコード

```tsx
export type ScrollDirection = 'up' | 'down';

export const useScrollDirection = (
  initialDirection: ScrollDirection = 'up',
) => {
  const [scrollDirection, setScrollDirection] =
    useState<ScrollDirection>(initialDirection);

  useEffect(() => {
    const bodyElement = document.querySelector('body');
    if (!bodyElement) return;

    const onWheel = (e: WheelEvent) => {
      // 不要な更新を防ぐ
      if (e.deltaY < 0 && scrollDirection === 'up') return;
      if (e.deltaY > 0 && scrollDirection === 'down') return;

      if (e.deltaY < 0) setScrollDirection('up');
      if (e.deltaY > 0) setScrollDirection('down');
    };

    bodyElement.addEventListener('wheel', onWheel, { passive: true });
    return () => bodyElement.removeEventListener('wheel', onWheel);
  }, []);

  return scrollDirection;
};
```

スクロール方向が`'up'`か`'down'`かを返す単純なhooksです。
現在のスクロール位置がたとえページのスクロールし切った下端であっても上方向へのスクロールを検知して`ScrollDirection`の値を変更させることができます。

レイアウトシフトが発生してもバグのでにくい状態にするため、wheelイベントの`deltaY`値を使うようにしています。

不要なsetStateを防ぐためのコードも思いつきで書いた割にかなりコスパよくイベントを抑えてくれます。


## 使用例

```tsx
const Header = () => {
  const scrollDirection = useScrollDirection();

  return (
    <header
      style={{
        position: 'fixed',
        top: 0,
        transition: 'transform 0.3s',
        transform: scrollDirection === 'down' ? 'translateY(-100%)' : 'translateY(0)',
      }}
    >
      My Awesome Header
    </header>
  );
};
```

スクロールを検知してheaderのスタイルを変化させることができます。
REST API Operationの基本


REST API（Representational State Transfer）は、Webサービスとクライアント間でデータの送受信を行う際に広く使われている設計スタイルです。

## REST APIの主要操作と違い

| メソッド | 説明                               | 主な用途                             |
|----------|------------------------------------|--------------------------------------|
| GET      | データの取得                       | リソースの情報取得                   |
| POST     | 新しいデータの作成                 | 新規リソースの追加                   |
| PUT      | データ全体の更新                   | 既存リソースの完全な上書き           |
| PATCH    | データの一部更新                   | リソースの部分的な更新               |
| DELETE   | データの削除                       | リソースの削除                       |

## PythonによるREST API操作サンプル（`requests`使用）

まずはライブラリのインストール：

```bash
pip install requests
```

### 1. GET（取得）

```python
import requests

url = 'https://jsonplaceholder.typicode.com/posts/1'
response = requests.get(url)

print(response.status_code)
print(response.json())
```

### 2. POST（新規作成）

```python
url = 'https://jsonplaceholder.typicode.com/posts'
data = {
    'title': '新しい投稿',
    'body': 'これはサンプルの投稿本文です。',
    'userId': 1
}
response = requests.post(url, json=data)

print(response.status_code)
print(response.json())
```

### 3. PUT（全体更新）

```python
url = 'https://jsonplaceholder.typicode.com/posts/1'
updated_data = {
    'id': 1,
    'title': '更新されたタイトル',
    'body': '更新された本文です。',
    'userId': 1
}
response = requests.put(url, json=updated_data)

print(response.status_code)
print(response.json())
```

### 4. PATCH（一部更新）

```python
url = 'https://jsonplaceholder.typicode.com/posts/1'
partial_update = {
    'title': 'タイトルのみ更新'
}
response = requests.patch(url, json=partial_update)

print(response.status_code)
print(response.json())
```

### 5. DELETE（削除）

```python
url = 'https://jsonplaceholder.typicode.com/posts/1'
response = requests.delete(url)

print(response.status_code)  # 通常は204（No Content）が返る
```

## 補足：PUTとPATCHの違い

| 項目           | PUT                                  | PATCH                                |
|----------------|---------------------------------------|--------------------------------------|
| 更新範囲       | リソース全体                          | 指定した一部のみ                      |
| 送信データ     | 全フィールドを含める必要がある         | 更新したいフィールドのみでOK         |
| 用途の一例     | 全体的な書き換え（例：投稿全体更新）   | 一部修正（例：タイトルのみ変更など） |


## 補足：typicode

typicode（正式には JSONPlaceholder） は、APIの学習やテストに使える無料のモックAPIサービスです。

- モックAPI = 本番のAPIの代わりに使える「ダミーAPI」
- https://jsonplaceholder.typicode.com/
【CLI】Macのショートカットを操作する方法

## ショートカットを実行する

```terminal
shortcuts run "ショートカット名"
```

```terminal
shortcuts run "Combine Images"
```

`-i`を使用するとパスを渡せます。

```terminal
shortcuts run "Combine Images" -i ~/Desktop/*.jpg
```

## ショートカットのリストを表示

```terminal
shortcuts list
```

```terminal
$  shortcuts list
ショートカットとは?
休憩する
最新の写真をメッセージで送信
Shazamショートカット
...
```

## ショートカットを表示

```terminal
shortcuts view "Combine Images"
```
オンプレエンジニアが毎月70時間残業しながら4ヶ月でAWS solution architect professional に合格したので勉強方法をひけらかします

# はじめに
2025年4月、AWS solution architect professionalに合格しました。
AWS未経験+本業で毎月70時間残業するような繁忙の中での合格なので、やってきた勉強方法や気の持ち方をひけらかしてみようと思います。

# 勉強期間
2025年1月1日〜4月18日

# 使った教材
1. [AWS認定資格試験テキスト＆問題集　AWS認定ソリューションアーキテクト - プロフェッショナル　改訂第2版 (ＡＷＳ認定資格試験テキスト)](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%EF%BC%86%E5%95%8F%E9%A1%8C%E9%9B%86-AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB-%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88-%EF%BC%A1%EF%BC%B7%EF%BC%B3%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E5%B1%B1%E4%B8%8B%E5%85%89%E6%B4%8B/dp/4815617929/ref=asc_df_4815617929?mcid=63e51dbf50543210878bbe2496f2c34a&th=1&psc=1&tag=jpgo-22&linkCode=df0&hvadid=707442440817&hvpos=&hvnetw=g&hvrand=10849113332127337215&hvpone=&hvptwo=&hvqmt=&hvdev=m&hvdvcmdl=&hvlocint=&hvlocphy=9198804&hvtargid=pla-1945183960042&psc=1&gad_source=1&dplnkId=d8ef9432-5265-4ecf-993f-48509476b073&nodl=1)
1. [cloudtech](https://kws-cloud-tech.com/)
1. [AWS試験問題サンプル](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-sa-pro/AWS-Certified-Solutions-Architect-Professional_Sample-Questions.pdf)
1. [AWS skillbuilders模擬問題](https://explore.skillbuilder.aws/learn/courses/13272/AWS-Certified-Solutions-Architect-%E2%80%93-Professional-Official-Practice-Question-Set-SAP-C02-Japanese-)
1. [udemy模擬問題集](https://www.udemy.com/course/sap-c02-2024aws/?couponCode=V2JPLETSLEARN)

# やったこと
1. 1の参考書を通読
1. udemyの模擬問題を5周
1. cloudtechを3周
1. AWS試験問題サンプルとskill buildersの模擬問題を1周

# どのくらいまで勉強したか（取り組んだ順）
### AWS認定資格試験テキスト＆問題集
一度通読する→あーこんな感じなのね、くらいでざっくり読む。巻末の問題は解かない
＊問題が本番の形式と違いすぎるので

### udemy模擬問題集
全5回をひたすら解く
試験本番とほぼ同じ問題も入っていたのでやった方がいいかも。
ただ全体的には本番より難しくいる印象・・・
正答率は7割くらいになるまで周回した。

### cloudtech
1番本番の問題形式と似ていた。本番とほぼ同じ問題も出題されていたので、これをやるのが一番の近道な気がした（同じすぎて本番で冒頭見た瞬間に答えられたのもあった）
最終的な正答率は9割くらい。

### AWS試験問題サンプル
試験問題サンプルなので一番本番の形式にはあってたと思う
10問だけなので周回するものでもないと思った。試験前日に解いて正答率7割。

### AWS skillbuilders模擬問題
サンプルと同じく本番の形式にあっていると思う
同じく一周して正答率8割

# 取得した感想
インフラエンジニアである以上、業務でAWS触らなくてもSAPくらい取っておくか、くらいの気持ちで始めた勉強でしたが、これまで勉強してきた資格の中でも相当しんどい部類でした。
ただアーキテクトの試験なので、AWSに限らず普遍的なアーキテクチャの考え方や構成の勉強にはなった印象です。
一定の難度はあるので、努力や根気のアピールにもいいんじゃないでしょうか。
「Wan AIのWan 2.1でテキストを驚くべきビデオに変える：AIビデオ生成の未来」


インスピレーション

Wan AIのWan 2.1に挑戦するインスピレーションは、技術と創造性の融合への長年の興味から来ています。コンテンツクリエイターとして、AIがビジュアルコンテンツの制作方法を革命化する可能性に常に魅了されていました。単純なテキスト記述を高品質でダイナミックなビデオに変えるというアイデアは、夢のようなものでした。オープンソースであるWan 2.1が、コミュニティ協力による継続的な改善の機会を提供し、アクセスしやすさを約束していることに特に引き寄せられました。

学びのプロセス

Wan 2.1に飛び込むことは、刺激的で挑戦的なものでした。AIビデオ生成の基本を理解し、拡散トランスフォーマーや変分オートエンコーダー（VAE）などの基礎技術を学ぶところから始めました。Wan 2.1のアーキテクチャと機能の奥深さを理解するために、技術文書、研究論文、コミュニティフォーラムを読み漁りました。

学んだ中で最も貴重な教訓の1つは、詳細で正確なテキストプロンプトの重要性でした。生成されるビデオの品質は、入力テキストの明確さと具体性に大きく依存します。この認識から、ビデオ生成プロセスを効果的にガイダンスできるような、説得力のあるテキストを練りに練って書くスキルを磨くために、さまざまなプロンプトを実験しました。

プロジェクトの構築

プロジェクトを構築するには、まずWan 2.1に対応する開発環境をセットアップしました。これは、必要なソフトウェアをインストールし、GPUを構成し、すべての依存関係が正しく設定されていることを確認することを意味しました。その後、消費者向けGPUにも対応しているT2V-1.3Bモデルから異なるモデルバリエントを実験し始めました。

テキストプロンプトと画像リファレンスの組み合わせを使用して、一連のビデオを生成し始めました。各イテレーションは学習経験であり、解像度、フレームレート、モーションの複雑さなどのパラメーターを微調整しました。また、マルチリンガルなテキストエフェクトを生成するモデルの機能を探求し、ビデオコンテンツに新しい次元を加えました。

面臨した課題

道のりにはいくつかの課題がありました。最大の障壁の1つは、ビデオ生成プロセスを最適化してパフォーマンスを向上させることでした。Wan 2.1は非常に強力ですが、高品質のビデオを生成することはリソース集約的です。ビデオ品質を犠牲にせずに、受け入れ可能な生成時間を達成するための異なるハードウェア構成と最適化技術を実験する必要がありました。

別の課題は、生成されたビデオの正確さとリアリズムを確保することでした。Wan 2.1は多くの分野で優れていますが、生成されたコンテンツが私のビジョンと完全に一致しない場合がありました。これは、テキストプロンプトとモデルパラメーターの反復調整を必要とし、モデルのトレーニングデータと事前トレーニング戦略に深く切り込む必要がありました。

 結論

Wan AIのWan 2.1との経験は、変革的でした。それは私の創造的な地平を広げただけでなく、AI駆動のコンテンツ制作の理解を深めました。テキスト記述から高品質なビデオを生成する能力は、ストーリーテリング、教育、エンターテインメントの分野に新しい可能性を開きました。課題にもかかわらず、この旅は非常に報われるものであり、この技術が私たちの未来にどこへ連れて行ってくれるかを楽しみにしています。
https://www.wan-ai.org/
CCNA　無線LAN（自己学習　備忘録）

**無線LANの通信方式**

無線LANは電波を利用したネットワーク通信であり、配線不要で使いやすいが、壁や他の通信の影響でネットが届きにくくなる可能性がある。その対策として、適切な無線ネットワークを構築する。

**CSMA/CA（衝突回避制御）**

- 無線LANは半二重通信のため、CSMA/CAを用いてコリジョン（データ衝突）を回避する。
1. **利用状況の確認**（PC ⇔ AP）
2. **APが利用されていないことを確認した後、ランダムな時間待機してデータ転送**
3. **データ転送中、APがACK（受信確認応答）を全端末に送信**
- PCはACKを確認し、利用状況を把握する。

**電波の種類**

**周波数（Hz）の特徴**

- **5GHz**：直進性が強く、障害物が少なければ安定。
- **2.4GHz**：障害物が多くても安定しやすいが、電子機器（電子レンジ等）と干渉する可能性あり。

**無線LANの規格（IEEE 802.11）**

| 規格 | 周波数 | 最大伝送速度 | 登場時期 |
| --- | --- | --- | --- |
| 802.11b | 2.4GHz | 11Mbps | 1999年 |
| 802.11a | 5GHz | 54Mbps | 1999年 |
| 802.11g | 2.4GHz | 54Mbps | 2003年 |
| 802.11n | 2.4GHz/5GHz | 600Mbps | 2009年 |
| 802.11ac | 5GHz | 6.9Gbps | 2013年 |
| 802.11ax | 2.4GHz/5GHz | 9.6Gbps | 2020年 |

**無線LANの接続モード**

**アドホックモード**

- AP（アクセスポイント）を使用せず、機器同士を直接無線接続する。
- 例：PSPやDSでのインターネットを介さない通信。

**インフラストラクチャモード**

- APを介して無線接続を行う一般的な方式。

**ワイヤレスネットワーク構成**

**BSS（Basic Service Set）**

- 1台のAPと接続された機器によるネットワーク構成。
- APのMACアドレスを**BSSID**とし、所属するBSSを識別。

**ESS（Extended Service Set）**

- 複数のBSSが統合された広域の無線ネットワーク。
- **ESSIDとSSID**を用いて識別。

**無線接続の流れ**

**ビーコン（Beacon）**

- APが定期的に送信する制御情報（SSID、チャネルなど）。
- 2.4GHzは14チャネルがあり、5チャネル間隔で配置。

**認証と接続確立**

1. **ビーコン送信**（AP → PC）
2. **認証送信**（AP ← PC）
3. **認証応答**（AP → PC）
4. **アソシエーション要求**（AP ← PC）
5. **アソシエーション応答**（AP → PC）

*ビーコン非送信時は**プローブ要求**を利用して接続する。*

**無線LANのセキュリティ**

**データ暗号化**

共通鍵暗号方式のプロトコルを利用

- **AES**（安全）
- **RC4**（脆弱性あり）

**認証方式**

- **パーソナルモード**（PSK）：SSIDとパスワードを用いる。
- **エンタープライズモード**（EAP）：RADIUSサーバでユーザー認証。

　　　　　　　　　　　　　　　　　（事前にradiusサーバーへを登録したID,PASSで認証）

**認証コンポーネント（構成要素）**

クライアント端末（サプリカント）→認証装置（Authenticator,WLC,AP）→認証サーバ（RADIUS）

**無線LANの管理方式**

**自立型**

- APごとに個別設定（小規模ネットワーク向け）。

**集中管理型**

- WLC（Wireless LAN Controller）により一括管理。

**WLCの端末設計**

**仮想ポート（vNIC）**

- **WLAN1、SSID1 - ダイナミックインターフェース**

　　ワイヤレスLAN（WLAN）はVLAN毎に区切られ、

　　ダイナミックインタフェースを通じてディストリビューションシステムポートへ接続

- **バーチャルインターフェイス（インオブバンド管理）**

　　ワイヤレスコントローラ（WLC）の冗長化が可能で、

　　複数のWLCを同一IPアドレスでモビリティグループとして構成し、

　　必要に応じてコントローラを切り替えることができる

- **管理インターフェイス（インオブバンド管理）**
- **サービスポートインターフェイス（アウトオブバンド管理）**
管理インターフェイスおよびサービスポートインターフェイスは管理をするためのもの
- **アウトオブバンド管理**：通常の通信とは別に管理用インターフェイスを確保。
- **インオブバンド管理**：通常の通信で管理インターフェイスを起動、設定を行う

**物理ポート（NIC）**

- **ディストリビューションシステムポート**：ダイナミックインターフェースと接続。
　　　　　　　　　　　　　　　　　　　トランクポートで、複数のVLANへ対応する
- **サービスポート**：管理者アクセス用。

**ローミング**

- APから離れると、同じESSID内の別APへ自動接続切り替え。

**CAPWAP**

- APとWLC間の通信を制御するプロトコル。

**FlexConnect**

- APがWLCとの接続が切れてもAPの独立動作可能。
AutoHotkey によるテンキーへのキー割り当て覚書

# 概要
Chatgpt の力を借りつつ、AutoHotkey でテンキーへのキー割り当てを実施した。テンキーは、Digio の TNK-SU236GYBK を使用した。

# インストール
https://www.autohotkey.com/
からインストーラーをダウンロードし、インストーラーを起動してインストールする。

# コード作成方法
1. AutoHotkey Dash を起動する
2. New script を実行し、ファイル名をつけて Create を押す
3. コードを書く

デフォルトでは、C:\Users\（ユーザー名）\Documents\AutoHotkey フォルダに 作成した ahk ファイルが保存される。

# コードの実行
- ahk ファイルをダブルクリックで実行できる
- 終了したい場合は、タスクバーメニューで表示される AutoHotkey のアイコンから Exit を選択すればよい

# コード例
Ctrl キーは下記のように繰り返し処理をしないと Ctrl キーが押されっぱしと認識されてしまうので注意が必要である。
```
; Numpad0が押されている間にCtrlを押し続ける
$Numpad0::
    SendInput, {Ctrl down}  ; Ctrlを押し込む
    While GetKeyState("Numpad0", "P")  ; Numpad0が押されている間
    {
        ; zキーが押されている場合にCtrl + Zを送信
        if GetKeyState("Numpad4", "P")  ; zキーが押されている間
        {
            SendInput, ^z  ; Ctrl + Z（元に戻す）を送信
        }
        Sleep, 50  ; 50ミリ秒ごとに繰り返し処理
    }
    SendInput, {Ctrl up}  ; Numpad0が離されたらCtrlを離す
return

; テンキー1〜9 ショートカット
Numpad1::SendInput, p
Numpad2::SendInput, e
Numpad3::SendInput, g
Numpad4::SendInput, m
Numpad5::SendInput, h
Numpad6::SendInput, r
Numpad7::SendInput, z
Numpad8::SendInput, ^j
Numpad9::SendInput, {Del}

; テンキー. を Ctrl + Shift + H 割り当て
NumpadDot::
    SendInput, ^+h  ; Ctrl + Shift + H
return

```
Windows+RTX5070Tiの環境でFramePackを動かしてみた

# はじめに
動画生成AIであるFramePackが早速話題ですね。

RTX50シリーズの環境だと[作者GitHub](https://github.com/lllyasviel/FramePack)のオールインワンパッケージは使えないので、自前で環境構築をしました。

https://github.com/lllyasviel/FramePack

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066818/8d6bf8a3-b8df-4a99-9be1-753b4a70537d.png)

RTX40シリーズ以前だと、作者GitHubのオールインワンパッケージを使えばすぐに動かすことができるのですが、このオールインワンパッケージに内蔵されているのはCUDA12.6であり、RTX50シリーズはまだサポートしていません。
なのでCUDA12.8の環境を自前で用意してやる必要があります。

# 私の動作環境
|  |  | 
|-----------|------------|
| OS       | Windows11 Home |
| GPU       | NVIDIA RTX5070TI (VRAM16GB) |
| Python       | 3.12.9 |

# FramePack環境構築

### 1. Python環境のセットアップ

私はpyenvでセットアップしました。(後でバージョン変更するときに楽なので)
セットアップ方法は下記のQuick startを見てもらえばすぐわかると思います。
Pythonのバージョンは**3.12**を選択しました。

https://github.com/pyenv-win/pyenv-win

### 2. CUDAツールキット12.8のインストール

https://developer.nvidia.com/cuda-downloads

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066818/5ec09e08-bdf3-43c7-892c-6ed00c5dad19.png)

上記からインストーラを落としてきて、ウィザードに従いインストール。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066818/c601a122-3aa8-425f-9e91-3e59b1ab1ecc.png)

カスタムにしたうえで、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066818/f5a81a3e-fb64-4f61-99c3-782920da3901.png)

CUDAのみをインストールするとしたほうが良いと思います。
(ディスプレイドライバが更新されてしまうので)

### 3. FramePackをgit clone & Python仮想環境の起動

適当なディレクトリでPowerShellを開き、下記を実行。

```
git clone https://github.com/lllyasviel/FramePack
cd FramePack
python -m venv venv
.\venv\Scripts\Activate.ps1
```

### 4. PyTorchのセットアップ

```
pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu128
pip install -r requirements.txt
pip install sageattention
```

これで環境構築完了！

### 5. 動作確認

```
python .\demo_gradio.py
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066818/8f09230c-9a23-49eb-922b-14be39242ce8.png)

エラーなく動いてそうな感じですね。
http://localhost:7860/ にアクセスしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066818/c2724761-1cb8-47bb-a551-88f694c26472.png)

動きました！
早速、動画生成を動かしてみましょう。

![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066818/da77a334-faa0-418b-a632-74fee9e8534c.png)

モデルは我が家のやすけくんです。

![250420_150526_558_9983_27 (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4066818/85e37f6b-9907-4f19-8e93-d98f8147a9c0.gif)

若干違和感を感じますがこんなもんでしょう。
さて、遊ぶぞ！
Tableau Conference 2025の振り返り

2025年4月15日から3日間にわたって開催されたTableau Conferenceに参加してきました。雑感ですが参加しての感想を書き出したいと思います。

https://www.salesforce.com/tableau-conference/

# 生成AI時代のデータ分析について
生成AI時代のデータ分析の在り方について考えさせられる内容でした。Tableau NextはAgentforceとの連携について多く語られており、生成AI時代のデータ分析の形を作ろうとしているんだと思います。 ただ、まだ正解のないことなのでSalesforceもユーザーからのフィードバック強く求めているし、製品自体も開発途上にある。我々自身も生成AIの活用方法について真剣に考えないといけないと感じました。

# コミュニティの熱さと暖かさ
去年同様多くのコミュニティリーダーの方と交流させて頂きました。みなさん本当に情熱的かつフレンドリーでとても温かい気持ちになりました。Tableauを愛し、データ可視化の力を信じている「仲間」とのつながりに感動しました。

# データビジュアライゼーションの力
生成AIにより分析の在り方が変わろうとしている中で、IronVizは変わらぬ輝きを持っていると感じました。一人の人間が深くデータと向き合って獲得したインサイトを分かりやすく美しく表現し、情熱的にプレゼンする。どういった観点でストーリーを構築するのか？分かりやすくインパクトのあるビジュアライズは？聴衆の心に届けるための言葉は？トーンは？こういった内容は生い立ちや思想や意思をもつ一人の人間にしかできないし、その人が行うからこそ意味が出るものだと思います。生成AIで様々な知的活動の在り方が変わっていく今だからこそ、IronVizの本質的な価値を感じられました。

# Tableau Nextについて
生成AIとの連携以外にも魅力的なコンセプトを持っていると感じました。セマンティックレイヤーを具備し、データソースやメトリック、ビジュアライゼーションの再利用性を高めるという方向性は良いと思いました。またアクションにつなげるための機能強化として、Slack連携やSalesforce連携を強めている点もデータ活用の観点では大きな強みになると感じました。ただしSalesforceのプラットフォーム上で動くためこれまでのTableauの延長性上にない点は気になっています。Server→Cloudの移行ハードルも高い中、Salesforceへの移行はさらに難易度が高いはず。既存ユーザーがNextへ移行するのはだいぶ先になるのではと感じました。

# 既存サービスとコミュニティへのコミットメント
KeynoteではTableau Serverをはじめとした既存サービスへの機能強化について何度か言及されていました。Tableau NextがSalesforceのプラットフォーム上で動くことから、既存サービスの機能強化が疎かになるのではないかという不安へのアンサーだと感じます。加えてコミュニティについても新たにコミュニティSlackが立ち上がるなど、コミュニティへのコミットメントを強く感じました。コミュニティはTableauの最も重要なものの一つなのでそこをないがしろにしないという気持ちを感じられ嬉しかったです。

# まとめ
Tableauとしては非常に難しい局面に入っていると感じました。VizQLによるインタラクティブな分析フローはTableauの最大の強みであり、もっとも愛されている部分だと思います。しかし生成AIの登場により、そういった試行錯誤をするケースは減っていくのかもしれません。ただ今すぐ生成AIに全て持っていかれる気もしていません。でも1，2年もすればTableauよりももっと効率的な分析ツールが生成AIによって登場するかもしれません。そしてその兆しをいち早くキャッチできるのは生成AIを使っている人だと思うので、生成AIをどう活用するか、これまで以上に考えていく必要があると感じました。

# 参考情報

[Tableau Conference 2025 Keynote@YouTube](https://www.youtube.com/watch?v=ROwf5jS1MZY)

[Tableau Conference 2025 アーカイブ@Salesforce+](https://www.salesforce.com/plus/experience/tableau_conference_2025)
MacでLenovo TrackPoint keyboard2(JIS)を使うためのKarabiner KeyBoard設定

問題のあるキーをKarabiner KeyBoardというツールで変換する
アプリSimple Modifyタブにて設定する

以下は変更が必須なものを抜粋
| 物理表示 | 内部キー | 変換後キー |
| ---- | ---- | ---- |
|CapsLock|(Modifier keys)<br>caps_lock|(Modifier keys)<br>left_contrl|
|(左)Ctrl|(Modifier keys)<br>left_contrl|(Modifier keys)<br>left_command|
|無変換|(Japanese)<br>PCキーボードの無変換キー|(Japanese)<br>英数キー|
|変換|(Japanese)<br>PCキーボードの変換キー|(Japanese)<br>かなキー|
|カタカナ/ひらがな|(Japanese)<br>PCキーボードのかなキー|(Japanese)<br>かなキー|

変更後の画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4059878/51e7d2da-4058-4ebb-977c-806e722cb4e1.png)

キーボードビューアで最終確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4059878/41c6d172-d9f9-4abf-bc36-4568fe3a405b.png)

<br>
<br>
<br>
以下は応用編

内部的で何が押されているか確認する方法
Karabiner-Key Viewerで確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4059878/27f1aa57-b20b-40a4-8db0-ef7dde9195ee.png)


以下キーの全リスト
|必要性| 物理表示 | 内部キー | 変換後キー |
| ---- | ---- | ---- | ---- |
|任意|半角/全角|(Contrl and Symbol)<br>grave_accent_and_tilde|任意|
|必須|CapsLock|(Modifier keys)<br>caps_lock|(Modifier keys)<br>left_contrl|
|不可|Fn|※割り当て不可<br>(イベントが出ていない)|※割り当て不可<br>(イベントが出ていない)|
|必須|(左)Ctrl|(Modifier keys)<br>left_contrl|(Modifier keys)<br>left_command|
|任意|Windowsキー|(Modifier keys)<br>left_command|任意|
|任意|(左)Alt|(Modifier keys)<br>left_option|任意|
|必須|無変換|japanese_pc_nfer<br>(Japanese)<br>PCキーボードの無変換キー|(Japanese)<br>英数キー|
|必須|変換|japanese_pc_xfer<br>   (Japanese)<br>PCキーボードの変換キー|(Japanese)<br>かなキー|
|必須|カタカナ/ひらがな|japanese_pc_katakana<br>(Japanese)<br>PCキーボードのかなキー|(Japanese)<br>かなキー|
|任意|右Alt|right_option|任意|
|任意|PrtSc|print_screen|任意|


ファンクションキーはアプリの「Function Key」タブにて設定する
All devices設定
|物理表示 | 内部キー |
| ---- | ---- |
|F1|(Media Control)<br>display_brightness_decrement|
|F2|(Media Control)<br>display_brightness_increment|
|F3|(Media Control)<br>mission_control|
|F4|(Media Control)<br>spotlight|
|F5|(Media Control)<br>dictation|
|F6|(key_code)<br>f6<br>|
|F7|(Media Control)<br>rewind|
|F8|(Media Control)<br>play_or_pause|
|F9|(Media Control)<br>fast_forward|
|F10|(Media Control)<br>mute|
|F11|(Media Control)<br>volume_decrement|
|F12|(Media Control)<br>volume_increment|

Lenovo設定
|物理表示 | 内部キー |
| ---- | ---- |
|F1|(Function Key)<br>f1|
|F2|(Function Key)<br>f2|
|F3|(Function Key)<br>f3|
|F4|(Function Key)<br>f4|
|F5|(Function Key)<br>f5|
|F6|(Function Key)<br>f6|
|F7|(Function Key)<br>f7|
|F8|(Function Key)<br>f8|
|F9|(Function Key)<br>f9|
|F10|(Function Key)<br>f10|
|F11|(Function Key)<br>f11|
|F12|(Function Key)<br>f12|
Raspberry Pi Pico(W) / Pico 2(W) をPlatformIOで開発する方法

# はじめに
こんにちは、Wadoyokaといいます。今回、Raspberry pi pico2wを、PlartformIOで開発したいなと考えたときに、あまり記事が見当たらなかったので、ここに備忘録として書いておきます。
私は、pico2wを使用していますが、pico2でも同様の方法でできると思います。
最終的に、以下の環境でプログラムを書き込むことができました。
- PlatformIO
- mac book pro M1
- Micro USB Type-B（2.0）コネクタで書き込み
※Windowsでは、まだ未検証ですが後ほど試そうと考えています。また、これは2025年4月20日時点で有効な方法です。後ほど変わる可能性がございます。

# 目次
1. [参考になった資料](#1参考になった資料)
1. [プロジェクトビルド](#2-プロジェクトビルド)
1. [PIO HomeでPlatforms](#3-pio-homeでplatforms)
1. [導入手順](#4-導入手順)
    1. [platformsを追加](#4-1-platformsを追加)
    1. [platformio.iniを編集する。](#4-2-platformioiniを編集する)
1. [最後に](#5-最後に)

# 1．参考になった資料
まず最初に参考資料のご紹介です。

https://magnolia-tech.jp/raspberry-pi-pico_vscode-platformio/

こちらの資料では、本格的なデバック環境を実現するために、Pico-Probeを使用していますが、USB microBコネクターだけで行きたいと思います。

# 2. プロジェクトビルド
以下の画像のようにプロジェクトをビルドします。

- Name(プロジェクト名・自由につける): testPico2w
- Board: Raspberry Pi Pico
- Framework: Arduino

![platformSetup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944784/8c728bb4-541a-45d3-b4b0-9d5fe5cf99c9.png)

# 3. PIO HomeでPlatforms
maxgerhardtさんが作成した以下のgithubをplatformIOに導入します。

https://github.com/maxgerhardt/platform-raspberrypi?tab=readme-ov-file

READMEの最初に書いてある部分をGoogle翻訳しました。
> このフォークは、PlatformIO 用の Raspberry Pi RP2040 および RP2350 Arduino Core の継続的なアップストリーム開発が不足しているために作成されました。

# 4. 導入手順
ここから、実際の導入手順を紹介します。

## 4-1. Platformsを追加
まずは、platformIOの虫のアイコンをクリックします。

![platform_install1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944784/9736b84a-174f-47ba-a017-857bb14f19b6.png)

Quick Access　→　PIO Home →　Platformsを押します。

![platform_install2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944784/123de917-6665-4f15-8e8c-b830f8fb63c6.png)

Advanced Installationを押す

![platform_install3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944784/515184c7-078e-47f7-8714-173b25015e45.png)

以下のURLを入力して、Installを押す。

```shell
https://github.com/maxgerhardt/platform-raspberrypi.git
```

![platform_install4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944784/4f65cd94-91ab-49af-90fd-31200c1f0ef8.png)

以下の画像のように、Raspberry　Pi　RP2040が追加されてたらOK!

![platform_install5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944784/d4801d5c-751d-44e6-95f7-e97211673659.png)

## 4-2. platformio.iniを編集する。
platformio.iniを以下のように書き換える。

```ini:platformio.ini
; RP2350 based 
[env:rpipico2w]
platform = raspberrypi
board = rpipico2w
framework = arduino
```

これで、platformIoで、Rasberry Pi Pico 2wを開発できると思います。

# 5. 最後に
ここまで、読んでいただき、ありがとうございます。
platformIoで開発すると、追加ライブラリ等の設定の共有が楽にできて好きです。
またね！
Qiita記事の補足方法


# かきかけ
３０年をめざし、かきかけて、残りの７０点分を、すこしづつ書き足す。

# 英語・スペイン語表現
日本語で記述した内容を、英語またはスペイン語に直すと、意味がわかりやすくなることがある。

# 単語帳
英語文献の単語帳を後から追記することがある。

# 参考資料
参考資料を後から追記する。

# 誤字・脱字訂正
初心者を抜け出す！Railsバリデーションエラーの仕組みを理解しよう

はじめに
---
今回は、バリテーションのエラーメッセージがどのようなプロセスを経て、表示されているのかを記事にしてみました。私自身もポートフォリオを作成している中で、ネットの記事などを見て、コードを書いてみて表示させていましたが、実際に裏側でどのようなことが起こっているのか分からずに使っていました。もし、私のようにRails初心者でバリテーションのエラーメッセージを表示させるのは分かったけど、仕組みまでは分かっていない方のお役に立てたら幸いです。

1バリテーションとは
---
まず、DBにどんなデータでも保存されてしまうと、困ってしまうことがあるかと思います。（例えば、Todoリストであれば、期限やタスクの名前などが無いなど）そこで、一定のルールでデータの正誤性を取り扱いやすくするものがバリテーションです。そして、ActiveRecod、ActiveModelの機能を用いれば簡潔に書くことができます。下記が、実際に使用されたコードです。

app/models/task.rb
```ruby
class Task < ApplicationRecord

  belongs_to :user

  validates :expired_at, presence: true#expired_atは空ではない
  validates :user_id, presence: true#user_idは空ではない
  validates :name, presence: true, length: { maximum: 20 } #nameに20文字数以内の制限を実装

end

```
このようにすることで、各カラムごとのデータの正誤性がチェックされます。（例えば、expired_atは空ではないなど）

2エラーメッセージを表示させよう
--
上記のようにバリテーションで条件を付けくわえただけでは、データの正誤性をチェックした際にデータに誤りがあった場合、エラーメッセージは表示されません。表示させるには、「errors」というメソッドでどのようなエラーが起こったのか、どのようなフィールドで発生したのか情報を取得できます。
また、「変数名.errors.full_messages」と記述すると、人間が読みやすい形に成形されたエラーで表示されます。実際に書いてみたコードが下記のコードです。

app/views/tasks/new.html.erb
```ruby

 <div>
    <%= form.label :expired_at %><br>
    <%= form.datetime_field :expired_at %>
    <% if @task.errors.any? %>
    <ul>
      <% @task.errors.full_messages_for(:expired_at).each do |message| %>
      <li><%= message %>  
      <% end %>
    </ul>
    <% end %>
  </div>
```
まず、 <% if @task.errors.any? %>で「any?」を付けることで、エラーの有無を判定しています。もし、エラーがあれば、条件内の<%@task.errors.full_messages_for(:expired_at).each do |message| %>
に移動し、<%= message %>が実行されます。

3メソッドを分解しよう
--
ここからが、実際にエラーメッセージが表示される仕組みのメソッドを分解して解説していきます！ここが一番伝えたかったことです！
<% @task.errors.full_messages_for(:expired_at).each do |message| %
上記のコードは、RubyでいうところのEachメソッドです。eachメソッドの定義は以下です。
```ruby
配列の変数名.each do |変数名|
```
このメソッドは配列から要素を順番に受け取り、|変数名|に入れていきます。つまり、@task.errors.full_messages_for(:expired_at)でエラーについての配列が作られて、|message|にエラーが入れられます。当然、エラーの内容によって、配列は変わるので、表示されるエラーの内容は変わります。そして、<%= message %>によってビューにエラーメッセージが表示されるという分けです。実際に表示されている様子が以下です。![スクリーンショット 2025-04-20 222224.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4020032/707de71d-5ea4-49ed-b537-d13598acc456.png)

4最後に
---
いかがだったでしょうか？バリデーションエラーの仕組みを理解できたでしょうか？ネットなどでは多くのバリデーションエラーの参考記事が見られます。しかしながら、このメソッドを使えば表示される、ある程度前提の知識が無いと理解できない記事があるのも事実かなと思います。なので、私みたいな初心者は一つずつかみ砕いて理解する必要があると感じ、今回、記事を執筆しました。まだまだ、勉強の身なので、間違っている箇所などありましたら、ご教授いただけると幸いです。

[仕様]ruby 3.3.4/Rails 7.0.8.5
参考文献：すがわらまさのり/前島真一/橋立友宏/五十嵐邦明/後藤優一　（2022）
　　　　　　　　　　　　　　『パーフェクトRuby on Raila[増補改訂版]』
　　　　　伊藤淳一　（2024）『プロを目指す人のためのRuby入門[改定2版]』
参考資料：Railsガイド：https://railsguides.jp/active_record_validations.html
チームのパフォーマンスは3年がピーク

論文メモ

## 前口上: プロジェクトベースにチームメンバーをガチャガチャ入れ替えるのは効果的か
ベンチャーで働いていると慢性的人手不足ゆえプロジェクトベースにチームができては解散しメンバー構成が安定しないことがあります。逆に大企業で異動があまりなく見知った顔と仕事するだけで日々に変化がないこともあります。

**The Effects of Group Longevity Project Communication and Performance : Administrative Science Quarterly** はR&D プロジェクトにおけるグループ存続期間（メンバーが共に働いた平均在籍期間）がコミュニケーション行動、技術的成果（パフォーマンス）にどのように影響するかをまとめた論文です。

1982年の論文なので古い論文なのですが、今でも通じるところはあるので読み解いていきます。

## 背景: 口頭・対人コミュニケーションが情報伝達手段として重要という仮説
論文の中ではエンジニアリング分野では口頭・対人コミュニケーションが報告書や論文よりも強力な情報伝達手段と仮定しています。ここはインターネットの発展によってありようが多少は変わっている部分かもしれないですね。

(当時の)過去研究から、社内コミュニケーションの活性化はプロジェクト成果向上に寄与する一方、外部専門家との交流はプロジェクト特性によって効果が分かれることがわかっています。

**グループ存続期間が長くなるにつれてチームが安定志向になり、外部情報から隔絶されるのでは？** というのが仮説です。

## 米国大手企業R&D施設のプロジェクトを対象
米国大手企業R&D施設の50プロジェクトグループ（各3〜15名）  を対象に測定。

**プロジェクト内／部門内／研究所内／組織内／外部専門家／ベンダーの コミュニケーションがパフォーマンスにどう影響与えるか**を測定しています。パフォーマンスは部署長・研究所長による7段階主観評価です。
  
グループ存続期間はメンバー個々のプロジェクト在籍期間の平均とし、在籍期間を0–1.5年／1.5–4.9年／5年以上に区切り解析しています。

## 結果: 在籍期間が2〜4年でパフォーマンスがピーク
![Screenshot 2025-04-20 at 22.46.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103496/2ceeb104-aa0e-4a11-87ef-e02c2cee5a73.png)

結果は**在籍期間が2〜4年でパフォーマンスがピーク**となり山形カーブが確認できました。1.5年未満もしくは5年以上でパフォーマンスは有意に低下。

長期在籍グループほどプロジェクト内コミュニケーション、組織内（他部門）コミュニケーション、外部専門家とのコミュニケーションが減少しました。その他の部門内／研究所内／ベンダーとのコミュニケーションには顕著な差がありませんでした。

これは長期在籍→コミュニケーション減少→成果低下というモデルで説明できます。

## 対策: どうやれば長期存続チームのモチベーションを上げられるか
長期存続グループほど自分たちのやり方が最善、外部情報は不要で新情報への感度が低下するNot Invented Here（NIH）症候群がみられました。

これを防ぐためにプロジェクトごとに平均在籍期間をモニターし、**5年超の長期在籍チームには定期的に外部または新規要員をアサイン**することで固定化した価値観を破壊し、コミュニケーション活性化することを提言しています。

## 補足: その後の研究&個人的考察
その後の研究では長期チームでも**外部との接点を意図的に設計すればパフォーマンス悪化を防げる**という主張もあるようです。確かにチーム全体でカンファレンスへや勉強会に参加している企業もありますね。

一方でブルックスの法則：ソフトウェア開発において遅延しているプロジェクトに人員を追加するとかえってプロジェクトがさらに遅れてしまう は未だ崩れた話を聞きません。プロジェクトベースにチームができては解散が非効率な部分は不変でチームが安定化するには時間がかかるという認識はもっておく必要がありそうです。
故障したarduino unoの再利用

## 目的
故障したarduino、故障inoを手に入れたので原因を解明し、修理します。
環境はwin11 , arduino IDE 2.3.5 , arduino uno R3です。
## 仮説
症状はPC側でarduinoを認識できなくなったとのことです。
arduino IDEでcomポートを指定できなくなり、デバイスマネージャーを見てもarduinoが認識されてないようです。
comポートの欄にarduinoが認識されてない。
![スクリーンショット 2025-04-20 193039.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922522/142f3946-4384-49ec-bff2-681e18c53018.png)
他のarduino unoでは動作するそうなので、原因はarduino側にありそうです。
考えられる理由は、
1. ATmega328pが壊れた
2. ATmega16u2が壊れた
あたりです。

## 検証
ATmega328pが壊れた可能性を検証するため、別のATmega328pに置き換えて検証します。
ちょうど部屋にブートロード済みのATmega328pが転がっていたので差し替えてみます。
ダメです、状況変わらずです。
どうやら原因はATmega328pじゃないようです。

ではATmega16u2が壊れた可能性を検証したいのですが、これは表面実装なので置き換えるのはハードルが高いです。
なので以前制作したシリアル変換を用いて接続してみます。

https://qiita.com/kurumi18891/items/5b6e5757dc77e96e7b9a

5V,GND,TX,RXを接続してシリアル変換器をPCに挿すと、arduino IDEで認識されました。
![PXL_20250420_133925187.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922522/cd92057b-4ac6-4011-a0d2-7273fc590290.jpeg)

原因はATmega16u2だったようです。
このまま書き込みたいところですが、arduinoとCH340ではリセット信号の形式が違います。

https://qiita.com/Antareskkudo/items/9654e2de2b920f497e00#fn-1

詳しいことはこの方が調べてくださっているので割愛します。

コンデンサ、ダイオード、抵抗を挟むだけでできます。
もし、これがうまくいかない、めんどくさいならば無理やり書き込むこともできます。
方法は簡単。コンパイルされた後、書き込まれる直前にリセットボタンを目押しします。

##
書き込めるようになったのでしばらくはこのまま使うつもりですが、毎回ジャンプワイヤーを挿すのは面倒なので、16U2のファームウェアを書き換えてみるか、Arduinoのシールドを作成したいと思います。
いつか。
FileNotFoundErrorというエラーについて

# FileNotFoundErrorが起きた状況
APIキーをハードコーディングしていましたが、セキュリティの面で推奨されないので、.envファイルを作成しそこで管理するように変更したところエラーが起きました。

# 解決方法
`pubspec.yaml`に追加できていない項目があったのでそれを追加した。
```
dependencies:
  flutter:
    sdk: flutter
  flutter_dotenv: ^5.2.1   //ここは追加していた
```
```
flutter:
  uses-material-design: true
  assets:
    - .env    //ここが追加できていなかった
```

# 解決理由
- Flutter では、アプリ内で使用する静的リソース（画像、フォント、JSON ファイルなど）を **アセット**として管理します。
- `.env`ファイルも静的リソースの一種であるため、Flutter にその存在を認識させる必要があります。
- そのため、`.env`ファイルを見つけることができずに`FileNotFoundError`というエラが表示されました。
supabaseのデータベース読み込みが失敗する

# はじめに
supabaseを使用して、データベースを読み込もうと思ったのですが```supabaseのURL/rest/v1/テーブル名?select=*401 (Unauthorized)``` のよう認証エラーがでたので解決した経緯をまとめました。

# 問題
supabaseのクライアント設定(URL、KEY）は合っているはずなのに、認証エラー(401)が出る。
```.env``` ファイルはvite環境なので以下の通りで合っているし、、、
```.env
VITE_SUPABASE_URL = supabaseのURL
VITE_SUPABASE_ANON_KEY = supabaseのAPI KEY
```
[Uncaught ReferenceError: process is not definedが表示される](https://qiita.com/gantarooou_js/items/6fc638fc27feb1246bea)を参考に ```vite.config.js``` を以下のように設定もしている。。
```vite.config.js
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import env from "vite-plugin-env-compatible";

export default defineConfig({
    plugins: [react(), env({ prefix: "VITE", mountedPath: "process.env" })],
});
```

クライアント設定をしている部分は下記
```supabaseFunctions.js
import { createClient } from "@supabase/supabase-js";

const supabaseUrl = process.env.VITE_SUPABASE_URL;
const supabaseKey = process.env.VITE_SUPABASE_KEY;

export const supabase = createClient(supabaseUrl, supabaseKey);
```
なぜだ、、



# 解決方法
```npm i vite-plugin-env-compatible``` をするのが抜けていました。


```vite.config.js``` を手書きでコピーしたのを思い出し、見返した際に
インストールをしたか怪しかったので実行すると直りました。
なぜこのコマンドが必要なのかはこちらを参照ください。
https://qiita.com/shunii/items/b00d556f3730e6b88708



# おわりに
一つ一つ確実に進めなければ、失敗の原因を突き止めるのも遅くなりますね。

# 参考
https://qiita.com/gantarooou_js/items/6fc638fc27feb1246bea
https://qiita.com/shunii/items/b00d556f3730e6b88708
PowerShellでクラウドアプリ持ち出し禁止(CloudEgress対応)のDLPポリシー作成


## 概要

Microsoft Purview や Endpoint DLP などで使われるルール構成は、実際には PowerShell を使って柔軟に管理・可視化できます。
本記事では、**Cloud Egress（クラウド経由の持ち出し）対策を含むDLPルール構成を、PowerShellで簡単に確認・出力する方法**を紹介します。なぜかCloudEgressのところだけネットで記事が見つからなかったので。

---

## 🔧 コード例：DLP構成の定義と出力

```powershell
# DLPルール構成をそのまま定義（Cloud Egress対策込み）

$dlpRule = @{
    Name       = "BlockCloudEgressExample"
    Comment    = "Cloud Egress 対応ルールのサンプル"
    Conditions = @(
        @{
            Type  = "ContentContains"
            Match = "Confidential"
        }
    )
    Restrictions = @(
        @{
            Setting           = "CloudEgress"
            Value             = "Block"
            IsAnyFile         = $true
            CloudEgressGroup  = @(
                @{ AppName = "Dropbox"; Destination = "External" },
                @{ AppName = "GoogleDrive"; Destination = "External" }
            )
        },
        @{
            Setting = "UnallowedApps"
            Value   = "Block"
        }
    )
}
```

CloudEgressGroupのパラメータの書き方がMS公式ドキュメントだとわかりづらかったので、ここに放流しておきます。

ちなみに、GUI上だと下記[機密性の高いサービス ドメイン グループの制限が構成されました。]に反映されます。(2025年5月時点)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349101/88ad3359-f9e9-44d8-9231-5346da792f6e.png)
Gitのデータ管理とは？圧縮ファイル・ツリーファイル・コミットファイルを理解する


# はじめに

Gitは単なるファイル管理ツールではありません。  
裏では、**圧縮ファイル（Blob）**、**ツリーファイル（Tree）**、**コミットファイル（Commit）**という特別なデータ構造を駆使して、ファイルのバージョンを効率よく管理しています。

この記事では、Gitの内部データ管理の仕組みを、初心者にもわかりやすく丁寧に解説します。

---

# Gitのデータ保存場所

Gitでバージョン管理を開始すると、プロジェクト内に `.git` という隠しディレクトリが作られます。  
その中でもデータ管理の中枢となるのが、**`.git/objects/`** というディレクトリです。

```plaintext
your-project/
└── .git/
    ├── objects/    # ← Gitオブジェクト（保存データ）
    ├── refs/
    ├── HEAD
    └── その他設定ファイル
```

ここに、Gitが作成する3種類のオブジェクト、

- 圧縮ファイル（Blob）
- ツリーファイル（Tree）
- コミットファイル（Commit）

が保存されています。

---

# Gitオブジェクトの3種類と役割

## 1. 圧縮ファイル（Blobオブジェクト）

ファイルの中身をそのまま記録するオブジェクトです。

- **作成タイミング：** `git add` を実行したとき
- **保存内容：** ファイルの中身だけ（ファイル名やパスは持たない）
- **ファイル名：** ファイルの中身を元に計算されたSHA-1ハッシュ値

### 特徴

- 内容が同じであれば、ファイル名が違っても同じハッシュ値になり、一度だけ保存されます。
- `git add` をしても、同じ中身なら新たなBlobオブジェクトは作成されません。

### イメージ

```plaintext
[hello.txt] → "hello world" → ハッシュ計算 → Blobオブジェクト作成
```

### 確認コマンド例

```bash
# ステージング時にBlobが作られる
git add hello.txt

# インデックス内Blob確認
git ls-files --stage

# Blobオブジェクトの中身を確認
git cat-file -p <ハッシュ値>
```

---

## 2. ツリーファイル（Treeオブジェクト）

ディレクトリ構造やファイル名を記録するオブジェクトです。

- **作成タイミング：** `git commit` を実行したとき
- **保存内容：**
  - ファイル名
  - パーミッション
  - 対応するBlobやTreeへのリンク情報

### 特徴

- プロジェクト全体のファイル構成を表現します。
- サブディレクトリを持つ場合は、Treeオブジェクト内にさらにTreeオブジェクトを参照します。

### イメージ

```plaintext
ルートTree
├── hello.txt → Blobリンク
└── docs/ → サブTree
    └── intro.md → Blobリンク
```

### 確認コマンド例

```bash
git commit -m "First commit"

# コミット後のTreeオブジェクト確認
git cat-file -p <Treeのハッシュ値>
```

---

## 3. コミットファイル（Commitオブジェクト）

履歴情報を管理するオブジェクトです。

- **作成タイミング：** `git commit` を実行したとき
- **保存内容：**
  - ルートTreeのハッシュ
  - 親コミット（直前のコミット）のハッシュ
  - 作者、コミッター、タイムスタンプ
  - コミットメッセージ

### 特徴

- 親コミットを辿ることで、過去から現在までの履歴をたどることができます。
- これにより、Gitは「時間を巻き戻す」ことができます。

### イメージ

```plaintext
[Commitオブジェクト]
├── Tree: <Treeハッシュ>
├── Parent: <親Commitハッシュ>（初回コミットの場合なし）
├── Author: あなた
├── Committer: あなた
└── Message: "最初のコミット"
```

### 確認コマンド例

```bash
# 最新のコミット情報を表示
git cat-file -p HEAD
```

---

# Git内部でのデータ管理の流れ

ファイル編集からコミットまで、Git内部では次のような流れでオブジェクトが作成されています。

1. ファイルを編集する
2. `git add` を実行する  
   → ファイルの内容（中身）をもとにBlobオブジェクトが作成される
3. `git commit` を実行する  
   → ステージングエリアの状態からTreeオブジェクトを作成し、  
   → さらにそのTreeを参照するCommitオブジェクトを作成する
4. ブランチのHEADが新しいCommitオブジェクトを指すように更新される

---

# まとめ

| オブジェクト | 作成タイミング | 役割 |
|:---|:---|:---|
| Blob（圧縮ファイル） | `git add` | ファイルの中身を保存 |
| Tree（ツリーファイル） | `git commit` | ファイル名・ディレクトリ構成を保存 |
| Commit（コミットファイル） | `git commit` | スナップショットと変更履歴を保存 |

これらのオブジェクトはすべて `.git/objects/` に保存され、SHA-1ハッシュによって一意に管理されています。  
これにより、Gitは高速かつ堅牢なバージョン管理を実現しています。

---
音声認識ライト　DAISO

#### 初めに
DISOより音声認識ライトが発売されています。
分解や改造をしないでください。と注意書きされています。
しかし、どんなものか分解してみます。

#### 分解
ビスなどはなく片方のボス穴に他方の突起をはめ込む構造です。
複数個所あるので隙間にカッターの刃を入れて少しずつこじ開けます。
出てきたのは小さなUSB端子のある基板です。
音声認識チップ、マイク、LED と数点のチップ部品が載っています。
音声認識チップは SSOP 16pin WANSON VB6816D が使われています。  
( VB6816D 160MHz SRAM:176KB Flash:512KB BLE )
回路も調べてみました。　
テスターで接続を追っただけなので間違いがあるかもしれません。

![VB6816D_DAISO.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045440/7da61d35-d9b4-4e63-8a67-e8b0420acf4d.png)

音声認識受付時に12番PINより信号が出力されています。
シリアルで認識結果を出力しているのだと思いますが内容までは解析していません。
基板の裏表に実装された2個のLEDを3個の出力ポートを並列接続してON/OFFしています。
30Ωの抵抗で電流制限されています。
"スマ―トライト"を受け付けると200msecの間、信号を反転してライトを点滅させています。　
BEEP音で知らせる方法もありますが部品が増えるのでコスト削減の為と思います。

#### 改造案 (注意書きには改造しないでくださいと記載されています。)
大電流のLEDライト制御
![DAISO1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045440/e0e79252-84d3-4f95-b952-3ad63713f227.png)

音声認識チップの信号 HIGHレベルが 3.3Vなのでトランジスターを1段かませてNch MOSFETをドライブしています。
R2、R3 は取り除いてください。（LOWレベルが確保できない為）
エンジニアに向けた謎解き

# はじめに
久しぶりに謎解き街歩きをしたら謎解き欲が湧き上がってきたので、エンジニア向けの謎解き問題を作ってみました。
エンジニアの知識がないと解けない問題がほとんどです。
気が向いたら解いてみてください。

# 問題

## この絵は何を表しているでしょうか
![django.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253933/a7027023-3bcf-4a37-8f94-cd34b5e078b6.png)

## ？には何が入るでしょうか
![view.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253933/af2f26f7-fede-4dd9-8803-f9a89ae32d2c.png)

## 「Amazon Kinesis」はどちらに入るでしょうか
![あるなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253933/a8dd991d-d991-4d13-82b1-d3870a2df687.png)

## ？に入る英単語は何でしょうか
![decipher_aws_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253933/951cf3aa-3694-4b79-adfa-4680643bdefc.png)

## ？には何が入るでしょうか
![castle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253933/ad21f986-cd38-4da2-9ab2-923c78db5f66.png)

## ？に入る数字はなんでしょうか
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253933/5aca419a-225f-4335-81e4-fec909a60cbf.png)

# おわりに
見てもらえてそうな雰囲気だったら解答を書こうとおもいます。
貴著なお時間をいただきありがとうございました。
UnityでHPが0から始まる謎のバグ！？ -実は初期化タイミングに潜んでいた罠だった話

## この投稿で得られること

- Unityで状態値が正しく初期化されないバグの原因
- `Awake()` と `Start()` の正しい使い分け方
- 実行順がバグの引き金になる事例とその対処法

---

## 現象：敵のHPがいきなり0からスタート！？

ある日、Unityで敵ユニットを配置してゲームを再生したところ…

> え？ HPが0で始まってる！？

しかも、**起きるときと起きないときがある**  
→ プレハブは正常、設定値も正しい、なのになぜ…？

---

## 実際のコード

```csharp
void Start()
{
    stats = Instantiate(statsTemplate);
    currentHP = stats.maxHP;

    UpdateHPBars(currentHP, stats.maxHP, 0, false);
}
```
このコードの中で stats.maxHP は正しい値（例：100）を持っていますが、
再生した瞬間に currentHP が0のままでHPバーが表示されることがありました。

## 原因：Start() よりも先に他スクリプトが currentHP を参照していた
Unityの実行順は以下の通りです：

```csharp
Awake() → OnEnable() → Start()
```
この順序により、他のスクリプトの Start() や Update() が走る前に currentHP をセットしないと、0のまま参照されてしまうことがあるのです。

```csharp
void Awake()
{
    stats = Instantiate(statsTemplate);
    currentHP = stats.maxHP;
}

void Start()
{
    UpdateHPBars(currentHP, stats.maxHP, 0, false);
}
```
Awake() はオブジェクト生成時に最も早く呼ばれるタイミングなので、
状態値の初期化はここで行うのがベストです。

## 学びポイント
Unityの実行順は Awake() → OnEnable() → Start() の順

Start() では既に他のスクリプトがアクセスしている可能性あり

状態（HPなど）を持つスクリプトは Awake() で初期化しておくと安全

## 補足：Script Execution Order でも制御可能
どうしても順番を制御したい場合は、

Edit > Project Settings > Script Execution Order

から EnemyController の実行優先度を上げることもできます。
ただし、原則はAwakeによる初期化の方がシンプルで安全です。

##  アイキャッチ付きでブログでも発信中

実際のUnity画面を再現したアイキャッチ画像も作りました。

## ブログでもUnityや開発ネタを発信中です！
開発ノウハウやアプリ制作過程、Unity連携系のハマりポイントなど
より深掘りした内容をブログでまとめています。
▶ https://syunpp.com

## 公開中のアプリ一覧はこちら！
▶ https://syunpp.com/公開中のアプリ一覧/

## コメント・ストック・LGTM大歓迎！
「自分も似た経験ある」「こんな対策してるよ」などあればぜひコメントで教えてください！
ストックやLGTMも励みになります！

## まとめ
状態値の初期化は Awake() が基本！

Start() に依存してると予期せぬバグの温床になることも

Unityの実行タイミングは奥が深いけど、一度覚えるとトラブルも回避しやすくなる！
BackstageをGCEで起動してIAP SSHポートフォワード経由でアクセスする構成メモ

Backstage の勉強をするにあたって Google Cloud 上で起動してみることにしました。
https://backstage.io/docs/getting-started/

料金をなるべく抑えつつ、サーバーに入ってファイル覗いたりもしたいので、GKE (Google Kubernetes Engine) や Cloud Run ではなく GCE (Google Compute Engine) を使い、ローカル端末から IAP (Identity-Aware Proxy) を使ってアクセスします。

忘れそうなので、最初の接続までだけですが、ざっくりメモしておきます。

※ 当初は IAP の TCP 転送（gcloud compute start-iap-tunnel）で接続しようとしましたが、うまく動作しなかったため SSH ポートフォワードに変更しました。

## Backstage を GCE で起動して IAP 経由でアクセスするまで
### 1. ローカル端末準備
最後に Backstage にアクセスするための、gcloud CLI を実行できてブラウザを利用できる環境を用意。

※ 最初 Cloud Shell でできないかと思ったが上手くいかず。

### 2. Google Cloud Project 用意
後で掃除しやすいように新しいプロジェクトを用意。
Compute Engine API, IAP API あたりを有効化した気がする。

### 3. Google Cloud 作業ユーザー権限付与
- Editor
	- 各種設定作業用
- Compute インスタンス管理者（v1）（roles/compute.instanceAdmin.v1）
	- IAP で SSH アクセスするのに必要
- IAP で保護されたトンネル ユーザー（roles/iap.tunnelResourceAccessor）
	- 同上

https://cloud.google.com/iap/docs/using-tcp-forwarding

### 4. VPC 作成
適当に VPC とサブネットを作成。

### 5. Google Compute Engine インスタンス作成
- Debian
- ネットワークタグ設定
	- 後でファイアウォールルールで使用するため適当に設定
- 外部 IP あり
    - 外部公開用ではなく、NAT を使わずに外部からパッケージやソースを取得するため。予約は不要
- 内部 IP アドレスを予約
	- Backstage 設定ファイルに記載するため、変わらないように予約
- サービスアカウントなし
    - 起動するだけなら無くて OK。必要なら後で割り当て可

### 6. ファイアウォールルール設定
以下の設定で Inbound 許可ルールを作成
- ネットワーク：4. で作成した VPC、サブネット
- ターゲットタグ：5. で設定したネットワークタグ
- ソースフィルタ：IP範囲 `35.235.240.0/20`
    - IAP の IP アドレス範囲)
- プロトコルとポート：`TCP 22`

### 7. Backstage インストール
5. のインスタンスに IAP 経由で SSH ログインして、下記の Prerequisites, 1. Create your Backstage App を実施。
https://backstage.io/docs/getting-started/

Debian だと Prerequisites に書いてあるパッケージは一通りインストールが必要。

この記事記載時点での Node.js の最新バージョン 23 では起動しない (※) ため、22 を使用
※ https://github.com/laverdet/isolated-vm/issues/515 など参照

### 8. app-config.yaml 確認
app.baseUrl, backend.baseUrl, cors.origin いずれも localhost のままで OK。

### 9. Backstage アプリ起動
getting-started の 2. Run the Backstage app に従い `yarn start` で起動

### 10. IAP で接続
ローカル端末のターミナルを開き、以下コマンド実行

```
gcloud compute ssh {5. のインスタンス名} --zone {5. のインスタンスの Zone} --tunnel-through-iap -- -L 3000:localhost:3000 -L 7007:localhost:7007
```

ローカル端末が Windows の場合
```
gcloud compute ssh {5. のインスタンス名} --zone {5. のインスタンスの Zone} --tunnel-through-iap -- --ssh-flag="-L 3000:localhost:3000" --ssh-flag "-L 7007:localhost:7007" 
```

ターミナルは開いたままで次へ。

### 11. ブラウザで Backstage にアクセス
```
http://localhost:3000
```
[Linux][system][command] 初期化システム_ランレベルの確認_runlevel

# runlevelコマンド
~~~terminal
# runlevel 
~~~

| オプション | 由来・意味      | 説明 |
|:--|:--|:--|
| default |  | 現在と直前のランレベルを表示<br>- 例：`N 5`<br>- `N`は前回が不明、`5`は現在のランレベル |
| `--help` | ヘルプ表示 | 使用方法を表示（サポートされる環境のみ） |
| `--version` | バージョン表示 | バージョン情報を表示（環境により非対応） |

# ランレベルとターゲット
||ランレベル|ターゲット<br>/etc/systemd/system|ターゲット<br>/lib/systemd/system|
|:--|:-:|:-:|:-:|
|対象初期化システム|init(SysVinit)|systemd|runlevel0.target|
|停止|0|poweroff.target|runlevel0.target|
|シングルユーザーモード|1/s/S|rescue.target|runlevel1.target|
|マルチユーザーモード<br>（テキストログイン）|2, 3, 4|multiuser.target|runlevel[234].target|
|マルチユーザーモード<br>（グラフィカルログイン）|5|grafical.target|runlevel5.target|
|再起動|6|reboot.target|runlevel6.target|

# Ping-t
- [3405_runlevel](https://mondai.ping-t.com/question_subjects/31/question_sessions/32850999/progressing_questions/503241138/edit?no_selection=false)
- [3410_runlevel](https://mondai.ping-t.com/question_subjects/31/question_sessions/32188376/progressing_questions/493138540)
vimの設定

## vim-plugのインストール
```vim:vim
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
  https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
```

```vim:windows
iwr -useb https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim | ni $HOME/vimfiles/autoload/plug.vim -Force
```

## 設定ファイル編集
```vim:.vimrc（Windowsは_vimrc）
set number
set showmode
set cursorline
set cursorcolumn
set ignorecase
set incsearch
set hlsearch
syntax on
set autoindent
nnoremap <C-t> :NERDTreeToggle<CR>
call plug#begin()
  Plug 'preservim/nerdtree'
  Plug 'ctrlpvim/ctrlp.vim'
  Plug 'simeji/winresizer'
call plug#end() 
```

## プラグインインストール
```
:PlugInstall
```
Javaをとりあえず書けるようになるまで #2

変数の中身が何なのか明記しないと、翻訳家が困ってしまいます。

# 変数とは？
「変数」というと、数学における$x, y$といったものを思い浮かぶと思います。プログラミングにおける変数も似たようなものです。

```example.
int x = 100;
double y = 10.2;
System.out.printf("%.2f", x*y); // 1020.00が出力
```
こんな感じで、変数`x, y`を「宣言」して、中に数値を「代入」でき、変数同士の演算によって中身の数値同士の演算を実行することが出来ます。

# 型とは？
上のプログラムにおいて、`x, y`の前についている`int`とか`double`とかは何のことでしょうか？これが「型」というものです。例えば`int`はinteger(整数)の略で、整数の「型」を表します。

変数`x, y`を定めただけでは、その中に整数が入っているのか、小数が入っているのか、はたまた文字列が入っているのか、コンパイラには知る由もありません。これを「`x`の中身には整数が入ってますよ～」とコンパイラに教えてあげるのが「型」の役割です。

一番最初に変数を「宣言」する際には
```
(型の名前) (宣言する変数名) = (変数の中身)
```
といった形をとります。2回目以降にこの変数へ値を「代入」する場合は、改めて型を明記する必要はありません。その変数の型は最初に明記されているためです。
```example.
int x = 100;                // 型をつけて宣言&代入
x = 200;                    // 宣言済み変数への代入なら型必要なし
System.out.printf("%d", x); // 200が出力
```

# いくつかの型

Javaにデフォルトで存在している型はたくさんありますが、最初に覚えておくべき型は以下の5つだと考えています。
|型|型の内容|
|-|-|
|int|整数|
|double|小数|
|String|文字列|
|boolean|真理値(true/false)|
|void|(関数において)返り値がないこと|

`boolean`は#4の条件分岐、`void`は#5の関数においてそれぞれ扱うため、存在を知っておくだけで大丈夫です。今回は`int, double, String`の3つについて扱いましょう。

`int, double`は上で扱った整数や小数に、`String`は前回扱った`"Hello World!"`といった、`"`(ダブルクォーテーション)で囲まれた文字列値に対応した型です。

# 変数同士の計算
それでは変数同士の計算を行っていきましょう。`section2/Test.java`を参照してください。
```Test.java
public class Test {
    public static void main(String[] args) {
        // 整数(int), 小数(double), 文字列(String)の変数を定義します。
        int integer        = 1;
        double doubleNum1  = 9.64;
        double doubleNum2  = 2.38;
        String str         = "Hello World!";

        // 整数の足し算
        int newInteger = integer + 4;
        System.out.printf("integer + 4 = %d\n", newInteger);

        // 小数の計算
        double newDoubleNum1 = doubleNum1 * 3.2;
        System.out.printf("doubleNum1 × 3.2 = %.3f\n", newDoubleNum1);

        double newDoubleNum2 = doubleNum1 / doubleNum2;
        System.out.printf("doubleNum1 / doubleNum2 = %.2f\n", newDoubleNum2);

        // 文字列のトリミング
        String substr = str.substring(3, 9);
        System.out.printf("substr: %s\n", substr);
    }
}
```

上のプログラムでは、`int, double, String`の3つの型について、変数を作成してそれぞれの間で計算を行っています。詳しい説明は省きますが、変数の中身をちょこちょこ変えていって様子を観察してみましょう。

# 教えてない物を黙って使っている件について
気づいた方もいると思いますが、ここまで全然説明していない内容をいくつか黙ってコードの中で使っています。例えば`System.out.printf`などは説明していないですね。

基本的にエンジニアが他人のコードを見る時、こういうことは日常茶飯事(のはず)です。そのたびにコピペしてネットで調べて、その一行の処理を理解し、そこからコード全体の処理の理解を進めていく、というのがエンジニアの常になってくると思います。この慣習に今から慣れていくためにも、過剰な説明は省き、各回のテーマに注目して説明していきたいと思います。~~説明書くのが面倒くさいというわけではないです。~~ 

とはいえさすがに不親切なので、1つだけ説明したいと思います。
## `System.out.printf`

これは前回扱った`System.out.println`や`System.out.print`などの仲間で、`f`はformatの頭文字を表しています。「指定子」と呼ばれる記号を用いて、文字列を装飾して表示する関数です。これを使うと、上でやっているように文字列の中に変数の中身を表示させたり、何行かにわたって表示する際、縦の列を揃えて表示をしたりすることが出来ます。

詳しくは[こちら](https://qiita.com/takahirocook/items/06d525be63eccd99ed49)へ！

# 課題
人間の身長と体重を表す変数(double)を定義して、その人のBMIを計算し、出力してください。
想定出力は下記のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4065456/448f43af-66ec-40f8-9d60-f995368c26b7.png)

解答例は`section2/Main.java`を参照してください。

# まとめ

今回は変数の型をいくつか学び、変数の中身をコロコロ変えながら出力の変化を観察しました。だんだんプログラミングしている感が出てきたのではないでしょうか。

次回は`for, while`を用いた繰り返し処理を学んでいきます。