OmniAICreator/Qiita-1.07M huggingface dataset:
【Laravel】bladeファイル上でjQueryが効かない時の対処法

自分用

`resource/js`直下にある`app.js`やら
```javascript:app.js
import './bootstrap';
```

`bootstrap.js`ファイルやらを見てみると
```javascript:bootstrap.js
import 'bootstrap';

import '@popperjs/core';

import 'jquery';
/**
 * We'll load the axios HTTP library which allows us to easily issue requests
 * to our Laravel back-end. This library automatically handles sending the
 * CSRF token as a header based on the value of the "XSRF" token cookie.
 */

import axios from 'axios';
window.axios = axios;

window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';

/**
 * Echo exposes an expressive API for subscribing to channels and listening
 * for events that are broadcast by Laravel. Echo and event broadcasting
 * allows your team to easily build robust real-time web applications.
 */

// import Echo from 'laravel-echo';

// import Pusher from 'pusher-js';
// window.Pusher = Pusher;

// window.Echo = new Echo({
//     broadcaster: 'pusher',
//     key: import.meta.env.VITE_PUSHER_APP_KEY,
//     cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER ?? 'mt1',
//     wsHost: import.meta.env.VITE_PUSHER_HOST ?? `ws-${import.meta.env.VITE_PUSHER_APP_CLUSTER}.pusher.com`,
//     wsPort: import.meta.env.VITE_PUSHER_PORT ?? 80,
//     wssPort: import.meta.env.VITE_PUSHER_PORT ?? 443,
//     forceTLS: (import.meta.env.VITE_PUSHER_SCHEME ?? 'https') === 'https',
//     enabledTransports: ['ws', 'wss'],
// });

```

`import 'jquery'`してあるんだしこれjquery効いてるんだよね～？
と思い下記のスクリプトをF12のコンソール上で実行してみた。

```js
    $(document).ready(function() {
        console.log('tes');
    });
```

**が・・・**

```
script-xxxxxxx.js:1 Uncaught ReferenceError: $ is not defined
    at script-xxxxxxx.js:1:1
```
おっとぉ？
その後構文の記載場所が悪いのかとファイルの読み込む順番が悪いのか試行錯誤するも中々解消できず・・・。

解決方法を調べていたら、以下に気になる情報が。

https://terakoya.sejuku.net/question/detail/32142

という訳で、上記の手順通り以下のようにしたらちゃんと効くようになりました。

```javascript:bootstrap.js
import 'bootstrap';

import '@popperjs/core';

import jQuery from 'jquery'
window.$ = jQuery;

~~~以下略~~~
```
Pythonコードを美しく保てていますか？: Flake8, Black, isort を使ったフォーマット

Python でコードを書く際、可読性と一貫性は非常に重要です。  Flake8, Black, isort を使うことで、コードスタイルを自動的にチェック・修正し、クリーンで読みやすいコードを維持できます。この記事では、これらのツールを組み合わせて使う方法と、そのメリットについて解説します。

## 1. なぜコードスタイルが重要なのか？

一貫性のあるコードスタイルは、複数人での開発時におけるコードの理解と保守を容易にします。スタイルガイドに従うことで、バグの早期発見や、コードレビューの効率化にも繋がります。

## 2. 各ツールの役割

 - **Flake8:**  PEP 8 (Python のスタイルガイド) への準拠、潜在的なバグ、複雑なコードなどを検出するリンターです。エラーや警告を表示することで、コードの品質向上を支援します。
 - **Black:**  意見の分かれるフォーマットに関する議論をなくすため、コードを自動的にフォーマットするツールです。設定オプションが少なく、一貫したスタイルを強制的に適用します。
 - **isort:**  import 文をアルファベット順にソートし、標準ライブラリ、サードパーティライブラリ、ローカルライブラリをグルーピングすることで、import 文の整理整頓を行います。

## 3. ツールのインストール

`pip` を使ってインストールします:

```bash
pip install flake8 black isort
```

## 4. 設定ファイル (`.flake8`, `pyproject.toml`)

`.flake8` ファイルで Flake8 の設定を、`pyproject.toml` ファイルで Black と isort の設定を行うことができます。

`.flake8`:

```ini
[flake8]
ignore = E203, W503  # 必要に応じて無視するエラーコードを指定
max-line-length = 88  # 行の長さの最大値 (Blackのデフォルトに合わせて88を推奨)
exclude =
    .git,
    __pycache__
    # 除外ファイル
```

`pyproject.toml`:

```toml
[tool.black]
line-length = 88
target-version = ['py37', 'py38', 'py39', 'py310', 'py311']  # 対象のPythonバージョン

[tool.isort]
profile = "black"  # Blackとの互換性のために"black"プロファイルを指定
multi_line_output = 3  # import文が複数行になる場合のスタイル (3が推奨)
line_length = 88  # Blackに合わせて88に設定
```

## 5. Git hooks の活用 (pre-commit)

`pre-commit` を使用すると、コミット前に自動的に Flake8, Black, isort を実行し、コードスタイルの問題を修正できます。

```bash
pip install pre-commit
pre-commit install
```

`.pre-commit-config.yaml` ファイルに設定を記述します:

```yaml
repos:
-   repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.4.0  # 最新のタグを使用
    hooks:
    -   id: trailing-whitespace
    -   id: end-of-file-fixer
    -   id: check-yaml
    -   id: check-added-large-files
-   repo: https://github.com/psf/black
    rev: 24.10.0 # 最新のタグを使用
    hooks:
    -   id: black
-   repo: https://github.com/pycqa/flake8
    rev: 7.1.1  # 最新のタグを使用
    hooks:
    -   id: flake8
-   repo: https://github.com/PyCQA/isort
    rev: 5.13.2 # 最新のタグを使用
    hooks:
      - id: isort
```

## 6. まとめ

Flake8, Black, isort を導入することで、Python コードのスタイルを自動的に管理し、可読性と一貫性を向上させることができます。これらのツールをワークフローに組み込むことで、よりクリーンで保守しやすいコードベースを構築できます。


この記事が、Python 開発をよりスムーズで効率的なものにする一助となれば幸いです。


## 付録: 例

整形前のコード:

```python
import requests
import       os
import   sys



def my_function(a   , b):
    print(   a+  b  )




if __name__ == '__main__':
    my_function(1 ,2)

    print(os.path.abspath(__file__))
```


整形後のコード:

```python
import os


def my_function(a, b):
    print(a + b)


if __name__ == "__main__":
    my_function(1, 2)

    print(os.path.abspath(__file__))

```


エディタやpre-commitを活用することで、保存時やコミット時に自動で整形され、常に綺麗なコードを保つことができます。

## 参考文献
- [flake8](https://flake8.pycqa.org/en/latest/)
- [Black](https://black.readthedocs.io/en/stable/)
- [isort](https://pycqa.github.io/isort/)
- [pre-commit](https://pre-commit.com/)
デザインパターンを教えるときに気を付けること　ー自分で考える時間を持たせるー

最近、新人にデザインパターンを教えているため、その時に気を付けていることの一つをここに書きます。

### 自分で考える機会を増やす

これはよく聞く話ですが、実際、ただ聞くだけ・読んだだけ・指示されたとおりにやるだけだと、後から振り返ったときに内容が定着していないことが多いと感じています。

たとえば、朝にニュース番組を何気なく聞き流しても、その内容を夜まで覚えていることはほとんどありません。でも、自分の関心ごとに関連していたり、何か気づきがあったニュースについては、夜になっても覚えていることが多いです。トラブル対応の場面でも、マニュアルを見ただけでは覚えられず、実際に試行錯誤しながら対処したときにしっかり定着するものです。

### 実際に行っている指導方法

たとえば、デザインパターンを教えるときは以下のような段階で進めています。

- **事前に調べてもらう**：まずデザインパターンについて自分で調べてもらい、どのように理解したかを説明してもらいます。
- **適用事例を考えてもらう**：次に、デザインパターンが使えそうな事例を自分で考えてもらいます。
- **設計に落とし込む**：その後、考えた事例に実際にデザインパターンを適用し、設計してもらいます。

このように宿題として取り組んでもらうことで、ただ知識を覚えるだけでなく、実践の中で考えながら身につけてもらえるよう工夫しています。
「そんな電話あったこと聞いてないよ」をなくせ。問い合わせ電話を一括管理！！

## ①AppSheetに出会った。
私はとあるスーパーマーケットで人事部をしております。
自己紹介はnoteにて掲載しておりますので是非ご覧ください😄
〔note〕（https://note.com/keita0308)
〔X〕（https://x.com/Av2Tuq)

前回の記事ではGASに出会いました。
この記事の応用は現在の実務で使用しています。GASに出会えて本当に良かったです！！


https://qiita.com/keita0308/items/7b18083af06a77a470c6

デジタル化が進んできていますが、私が未だにアナログであると思う象徴が**電話**:telephone_receiver:です。
在社している時は電話が色々なところから掛かってきます。
しかし、私は電話が非常に苦手（半分嫌い）です:sob:

:::note warn
苦手な理由
・電話番号を聞きそびれる。
・引継ぎが面倒くさい。
・伝言忘れが発生する。
:::

電話を受けるときはメモを出し、筆記具:pencil2:を出し、内容をメモしなくてはいけません。
パソコンでメモを取ってもよいのですが、受話器を持ったままキーボードを打つことは
至難の業です。というか、無理です:tired_face:
そこで何か良い案はないかと模索していたら、ありました。
それが**AppSheet**です:raised_hands:
自分自身でアプリが作れると学びました。

今回は電話の悩みを**AppSheet**を使用して解決していきたいと思います。
もし良いアプリが完成したら、部署内でも普及させたいです:star:


## ②完成　AppSheetによる電話引継ぎアプリ
### 1.使用ツール
・***AppSheet***
・***Google Spread Sheet***
・***ChatGPT***
***
### 2.完成品がこちら
**実際に作成したアプリの入力画面です。**

https://x.com/Av2Tuq/status/1853770109879500901

## ③完成までの道程
### 1.スプレッドシートの作成

:::note warn
1行目にタイトル、２行目以降にはデータを入力します。
あくまでサンプルデータですので、後で編集可能です。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892718/e4bda27b-3858-93eb-6396-406ebae5dda8.png)
### 2.AppSheetの準備/完成
:::note info
スプレッドシートの拡張機能よりAppSheetを選択します。
AppSheetの詳しい説明は、記事の最後の参考記事に載せておりますので、
そちらを確認ください。
:::
ここからは自分が思い描いているアプリへ近づけるために設定を変更していきます。
英語ばかりでどこを触れば、どのようになるのかさっぱり分からないので、
翻訳機能や前回相棒になった**ChatGPT**大先生を頼りに、作業を進めていきました。
そして完成したのがこちらです。（検索機能も付けてみました。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892718/c79c9ca6-41b2-4473-6d48-39740cfce664.png)
## ④職場の仲間に実際に使ってもらいました。
実際に電話の引継ぎアプリのプロトタイプを試してもらいましたー！
直接フィードバックをもらう予定でしたが、まさかの会えずじまい
ということで、メールでアプリを共有し使ってもらうことにしました。
### 1.事前説明
このアプリは、電話がかかってきた際に使用するものです。
引継ぎを受けた方の対処法を全員が共有でき、同じ内容の電話がかかってきたときに
引継ぎをすることなく対応できる機会が増えると思います。
  （※すぐに電話を引き継ぐことができるときは必要なし）
### 2.聞き方について
実際にアプリを使用していただき、以下のような観点でフィードバック
・アプリの操作は簡単だったか？
・タスク管理や報告に役立ったか？
・改善してほしい点や追加してほしい機能はあるか？
また、自由に思ったことを記載いただいても構いません。
### 3.職場の仲間からのフィードバック
①F1さん（上司）
・操作性はいい感じ。
・氏名、社員Noなど限られた組織内なら事前に登録し、選択式の方が楽。
・引継ぎ後対応もいくつかの選択肢にして、選択肢にない場合はその他として
　入力するようなものにした方が良い。
 
 ②F2さん（同僚：先輩）
・難しさはないと思います。初スタッフになって電話を受ける人も聞くことが
　分かりやすいかなぁと思います。
・アプリに入力した情報を、対応すべき担当者が見た場合に
　見たよ！などの反応ができると良い。欲を言えば、対応してほしい人へ
　メンションのような機能があると見忘れが防止されそう。
・電話を受けた人の社員番号は不要で、社内の人で電話をかけてきた人の
　社員番号はあるといいかもしれないです。→聞き間違いとかが無いよう確認として

③F3さん（同僚：後輩）
・基本的には使いやすい。
・日本語がまどろっこしい。
・引継ぎの進捗状況ステータスが分かりにくい。

### 4.フィードバックを受けて感じたこと・学んだこと
今回、職場の仲間から忌憚のないフィードバックを頂き、改善点がたくさん出てきました。
電話に対する課題は共通しており、アプリにすることは良いとの意見もありました。
操作性は評価いただきましたが、やはり内容はもっと精査しブラッシュアップが必要です。
user目線に立って、どんどん改善・改良をしていきます。
## ⑤最後に
小さな業務改善でも、自分で解決できると実感しました。
今後はデジタルをより深く学び、多くの人のために学んでいきます。
**自分の学びは独り占めせず、誰かの役に立つよう頑張ります！！**

【参考記事】

https://appsheet-apps.jp/appsheet/mytask-02/

https://qiita.com/yuuki1009/items/d6a0d784bdafd817a1f6
エンジニア向けおすすめメガベンチャー研修資料３つ

# 今回はエンジニア向けおすすめメガベンチャー研修資料を3つ紹介したいと思います。

# 株式会社サイボウズ

https://blog.cybozu.io/entry/2023/07/14/170000

**こちらはテストや自動化、仮想環境などプログラミング以外のことも幅広く書かれている印象でした。**


# 株式会社リクルート

https://techblog.recruit.co.jp/article-256/

**ReactやTypescriptなどのモダンな技術が特に濃く書かれている印象です。
心構えというところからかかれていますので、技術以外のところでも参考になると思いました！**

# 株式会社ミクシィ

https://mixi-developers.mixi.co.jp/23-technical-training-20a6f610140c

**こちらはGitやスマホアプリについて特に濃く書かれている印象です。
特にGitは初めは理解しにくい分野だとこちらの資料はとても参考になりました。**


# まとめ
**どの資料もすごく濃い内容になっていますので、まずは気になるものがないか確認してみることを
オススメします！**

**最後までよんでいただきありがとうございます。
@y-t0910をフォロー,いいねしていただけると嬉しいです！**
Media over QUIC Transportのmoq-wasmを動かす

:::note warn
※2024/11現在。未プルリク
:::

以下のものをWindows11環境で動かす

https://note.com/skyway/n/n5c1b3bdf43dc

https://github.com/nttcom/moq-wasm

Windows11のバージョン
- windows11 24H2 26100.2161

## 環境のインストール
Node.js / Cargo / wasm-packが入ってること

### Node.js
https://nodejs.org/en/download/prebuilt-installer

:::note warn
※この時は v23.1.0 を利用
:::

### Cargo
https://www.rust-lang.org/tools/install/

### wasm-packのinstall
Cargoをインストール後に以下のコマンドを実行

```
cargo install wasm-pack
```

## 実行
1. git clone
1. readmeの通りだが以下の修正
    - opensslのコマンドで'を"に変更
1. package.jsonを以下の変更
    - RUSTFLAGSの環境変数を設定方法を変更
    ```
    RUSTFLAGS=--cfg=web_sys_unstable_apis
    ```
    ↓
    ```
    SET RUSTFLAGS=--cfg=web_sys_unstable_apis && 
    ```
1. もろもろインストール＆起動
1. chromeの起動時に以下のbatを使い自己証明をあてた形で起動する
    ※現状のbatはChromeを新規で立ち上げないといけないため既存に立ち上がってるchrome.exeは落とすかkillしてから起動する必要がある
    ```
    echo off
    setlocal enabledelayedexpansion
    
    echo Starting localhost test in Chrome
    
    openssl x509 -pubkey -noout -in "%~dp0../moqt-server-sample/keys/cert.pem" | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary > "%~dp0.tmp"
    certutil -encode "%~dp0.tmp" "%~dp0.out" >NUL
    for /f %%i in ('findstr /b /c:"-" /v "%~dp0.out"') do set certbase64=%%i
    del "%~dp0.tmp" "%~dp0.out"
    
    set /A num=0
    for /f "tokens=2 delims= " %%i in ('tasklist /fi "imagename eq chrome.exe"') do set /A num=num+1
    if %num% gtr 1 (
        echo [ERROR] Chrome is already running. please close all chrome.exe.
        exit /b
    ) else (
        echo Starting Chrome
        start chrome --auto-open-devtools-for-tabs --test-type --origin-to-force-quic-on=localhost:4433 --ignore-certificate-errors-spki-list=!certbase64! --use-fake-device-for-media-stream --new-window http://localhost:5173/
    )

    ```
Go言語のlogパッケージまとめ

# はじめに
個人開発の中で、Goの`log`パッケージを使用する機会があったので、それぞれの関数の使用用途を以下にまとめてみました。

## log パッケージの主要な関数と使用用途

### log.Println
- **用途**: 一般的な情報メッセージをログに出力するのに使います。改行を含むメッセージを出力します。
- **例**:
    ```go
    log.Println("This is an informational message.")
    ```

### log.Printf
- **用途**: フォーマットされたログメッセージを出力するのに使います。`fmt.Printf`と同様のフォーマット指定子が使えます。
- **例**:
    ```go
    log.Printf("This is a formatted message: %s", "Hello, World!")
    ```

### log.Fatal
- **用途**: 重大なエラーメッセージをログに出力し、プログラムを終了するのに使います。出力後、`os.Exit(1)`が呼ばれます。
- **例**:
    ```go
    if err != nil {
        log.Fatal("Fatal error occurred: ", err)
    }
    ```

### log.Fatalf
- **用途**: フォーマットされた重大なエラーメッセージをログに出力し、プログラムを終了するのに使います。
- **例**:
    ```go
    log.Fatalf("Fatal error: %s", err)
    ```

### log.Panic
- **用途**: 重大なエラーメッセージをログに出力し、`panic`を引き起こします。出力後、`panic`が呼ばれるので、デファーされた関数が実行されます。
- **例**:
    ```go
    if err != nil {
        log.Panic("Panic occurred: ", err)
    }
    ```

### log.Panicf
- **用途**: フォーマットされた重大なエラーメッセージをログに出力し、`panic`を引き起こします。
- **例**:
    ```go
    log.Panicf("Panic: %s", err)
    ```

### log.SetPrefix
- **用途**: ログメッセージに付加するプレフィックス（前置詞）を設定します。ログメッセージを識別しやすくするために使います。
- **例**:
    ```go
    log.SetPrefix("INFO: ")
    log.Println("This message has a prefix.")
    ```

### log.SetFlags
- **用途**: ログメッセージに付加する情報（タイムスタンプ、ファイル名、行番号など）を設定します。`log.Ldate`、`log.Ltime`、`log.Lshortfile`などのフラグを組み合わせて使用します。
- **例**:
    ```go
    log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
    log.Println("This message includes date, time, and file info.")
    ```

### log.SetOutput
- **用途**: ログ出力の宛先を設定します。例えば、ファイルやネットワーク先にログを記録する際に使います。
- **例**:
    ```go
    file, err := os.OpenFile("app.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()
    log.SetOutput(file)
    log.Println("This message is logged to a file.")
    ```

# まとめ
これらの関数を使い分けることで、状況に応じたログ出力が可能となり、アプリケーションのデバッグや運用時のトラブルシューティングがしやすくなると思います！
リファクタリング スターターマインドデッキ

## 始めに
お久しぶりです、るんるんです。
エンジニアの皆さんはリファクタリングについてどうお考えでしょうか。
私は面倒臭い印象しかありません。そして実際にやってみて、面倒臭かったです。
新卒エンジニア一年目の6月に2件ほどリファクタリングを任され、その時の苦悩は今でも覚えているものです。
そこで、その苦悩から生まれた**肥やし**を披露したいと思います。
ある日突然上司から「ここリファクタリングしといて！」と言われて、「...辞めさせてもらいます」と言わないで済みます(多分)

## リファクタリングとは
### そもそも
そもそもから参りましょう。リファクタリングとはなんぞやについてです。
[IT用語辞典 e-words](https://e-words.jp/w/%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0.html)では以下のように紹介されています
> リファクタリング（refactoring）とは、ソフトウェア開発で、プログラムの動作や振る舞いを変えることなく、内部の設計や構造を見直し、コードを書き換えたり書き直したりすること。

「プログラムの動作や振る舞いを変えることなく」とありますが、これがリファクタリングの根幹です。リファクタリング前後で同じ挙動を担保しつつ変更を行うのです。
「ユーザーからは変更を感知できない変更」とも言い換えることができます。
そのため、バグ修正はリファクタリングとは言わないのです。

### エントロピー増大の法則
リファクタリングしたところで結果は同じなのに、元々動いているプログラムをわざわざ一度壊して再構築するのでしょうか。
エンジニアが「リファクタリングしたい！」という衝動に駆られる瞬間は
- コードが読みづらい...
- コードの構造が複雑すぎる...
- パフォーマンスが低い...

などが挙げられるでしょうか。
なぜこのような瞬間を迎えるのでしょうか。
その答えは、ソースコードに**エントロピー増大の法則**なるものが働きます。
小難しい話が始まりますが...
エントロピー増大の法則とは、「時間経過や量の増加により物事の煩雑さが増大する」ことを指します(元々は熱力学の考え方で、そこからプログラミングにもこの考え方が浸透しました)。
ソースコードの量が増えれば増えるほど、複雑さが増していく。自然な出来事です。
放置することも可能ですが追加開発の際にその複雑さが邪魔をして、開発スピードに大きく影響を及ぼします。
リファクタリングは先行投資のようなもので、リファクタリングの行為自体に価値を見出しにくいですが、今後の開発で複利の力が働きます。

## スターターマインドデッキ
前置きが長くなってしまいました...

ここからはそんな面倒臭いくせに大事な作業であるリファクタリングに臨む際のマインドセット **「リファクタリングスターターマインドデッキ」** を紹介します。
このマインドカードを持ち合わせることで、リファクタリングの際に失敗することなく、タスクを終えることができると思います。

### 1. 羅針盤を得る ~リファクタリングをする意義を知る~
リファクタリングに臨む際に、まずはなぜやるのかを明確にしましょう。
「可読性が向上する」と言うような抽象的な捉え方ではまだ甘いです。
一例ですが、こんな感じでしょうか

***可読性を向上させる → これから入ってくる新人エンジニアがコードを読んだ時に、理解スピードが上がる！***

「リファクタリングをすると未来にどんな良いことがあるのだろう」と想像しながら作業を行うことで、自然と目標が明確になると思います。

### 2. 敵を知る者は百選危うからず ~ソースコードの理解~

リファクタリングをする時は、ソースコードの理解が不可欠です。
コツとしては、一旦細かなロジックの理解は無視することです。まずは全体感を掴み、どこがなんのために存在するかを把握します。

全体感を掴んだ後はコードの背景を理解することです。

- なぜこのコードは存在しているのか
- なぜこのコードはこんな構造なのか
- なぜこのコードはこのロジックなのか

といったところでしょうか。
これらを理解するには、実装者に聞くのが一番早いです。
実装者が退社している可能性もありますが、なるべく関係ありそうな人に聞いて回りましょう。
コードの背景を知ることで、破壊して良い場所なのか等、リファクタリングを行う際の解像度が高まります。

### 3.来た時よりも美しく ~破壊と再構築~

リファクタリングをするとは、「破壊と再構築」なのです。
再構築の結果目標が **「来た時よりも美しく」** です。
遠足を思い出しますね。この考えは、リファクタリングにも有効です。
コードを破壊して再構築する際に、破壊前よりも美しくする事を念頭に作業を行います。と同時に破壊前と挙動が変わらないことを担保することも忘れてはいけません。

```
# 挙動が変わってしまっている
A → A'
A → B

# 来た時よりも美しい!!
A → A(Clear and Simple)
```

挙動が変わっていないかを担保するには、ユニットテストが有効です。
ソースコードは変更したが、ユニットテストで挙動が同じであること、ロジックが妥当であることを担保するのです。
コードの構造を変えることで、該当箇所のユニットテストが全て失敗します。ユニットテストに変更を加える場合は、あくまで挙動が同じであることを担保しつつテストの修正を行わなければなりません(ここが私は一番難しかったです)。

## 結び
今回は、私がエンジニア1年目に経験したリファクタリング業務を思い返してみて特に大事なマインド、スタンスを書き出してみました。
リファクタリングする際に少しだけでも参考になると幸いです。
複数の提出物をスマホで報告！確認はパソコンで共有もできちゃいます！

# 机の上が用紙で散らかってはいませんか？

こんにちは。年末調整の季節がやってまいりましたね！
自分の部下で誰が完了していて誰が未提出なのか確認しているうちに
今度は別の提出物・・・・
こんな感じで机の上が用紙で占領されてはいませんか？

今回は Googleスプレットシートを基盤にAppSheetを使って簡単に管理できる
管理ツールになります。
発展途上にはなりますが、今後アップデートも含め少しでも業務改善のお役に立てればと思います。

ちなみに<font color="red">**無料**</font>でできるので安心してください！

# １完成動画はこちら
https://x.com/ohashi198/status/1854010322698514502

# 用意するツール
・AppSheet
・Google スプレッドシート
・Google アカウント持ちのデバイス (スマホ・iPhoneなど)

# ２設定までの流れ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/5341f502-a50c-a6a2-8fa7-c6ed1192d686.png)

まずはシートの準備をします。

https://x.com/ohashi198/status/1854021247967047824

毎回更新するのは手間なので **シート1** を原紙として使うようにしておけば
今後提出物など追加したい場合 **シート1** に入力すれば全員に反映できるように
このように設定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/dd9815a1-978e-8007-c674-657f709de869.png)

拡張機能 AppSheet アプリを作成 の順に選択します。

ちなみに**拡張機能**が出ない場合はこちらの記事をどうぞ。

https://qiita.com/candallorjun1025/items/09e8df5afa27e3402664

https://x.com/ohashi198/status/1854016221139861547

デバイス画面の登録の仕方。
私は2回目ですのですんなり入れましたが、
初回は使用するアカウントを求められます。


# ３ここからパソコン本体の設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/7c196451-e498-749f-e2c6-180585555935.png)

まずはここを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/c19c5c46-f100-083d-ce7e-79599f3433e5.png)

Google　Sheetsがあるので選択します。
選択するとシートの選択画面が出るので今編集中のシートを選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/d05410f7-560e-1ea0-7d62-353633dccf95.png)

選択するとシート欄の人が自動で追加できるのでこのままテーブルに追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/c2885e6c-65ac-67af-6700-d42d979e792d.png)

左側に追加されたのを確認出来たら右側のくるくるを押してスキーマを再生成しましょう。


# ４デバイス側の設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/e98029e9-1c73-4ddd-603b-539928a177cd.png)

まずは左の設定からスマートフォンのマークを選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/c7e8d474-ff73-cba0-b4a4-cb3c1d8b6b70.png)

選択したら左の<font color="red">**〇**</font>を押して<font color="red">**▢**</font>は空欄のままでOKです。
これを人数分作り

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/ff565fdd-0a5c-5bfb-62ce-6e131cdbe5cb.png)

このように設定しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/8020fba9-bbf9-5581-609c-31cdf5b44db3.png)

最後に**シート１**は原紙のため非表示にしたいので、<font color="red">**delete**</font> して右上の<font color="red">**▢**</font>の　
**SAVE**すれば完了です！
追加の提出物などが増えた際は**シート１**に日付と内容と期限に入れておけば
全員に反映されます。


# ５実際に使用してもらったら。

　**良かった点**
・デスクトップ経由で 部門チーフ と 管理者 が共有できるので
　あと誰が提出していない？
 　OOさんとOOさんです・・・ ではなく、
 　○○さん遅れ気味だからに声かけといてねと具体的に共有できる。

・用紙じゃないからなくす心配がない。

・無料ならええやん！


 　**改善点**
・管理する側はいいけど、いちいちログインするのめんどくさいから
　バーコードリーダーにして読み取ったらすぐそのページに行くとかしてほしい。

・個人別はわかりやすいからいいんだけど、提出物を選択したら全体の状況が
　見れるようにしてほしい。

・シフト表とリンクさせて期限アラートとかでるようにならないか？

# ６フィードバックに対しての感想。

３つの改善点はどれも機能的には必須項目であり、作成できたら
もっと便利になるのでバージョンアップしている最中です。
今回は管理する側に特化した内容で、実際に使う人の方の満足度を
考慮しきれなかったのが悔やまれます。時間はかかるかもしれませんが
さらに便利なものになるように挑戦していきます。
OpenAMでIAM Identity CenterでのSAMLによるSSO

# OpenAMでのIAM Identity Center でのSSO

## できるようになること

組織構成のAWSアカウントの認証を、外部Idプロバイダー（OpenAM）により一元管理し、複数AWSアカウントを扱いやすくする

## 結論

問題なく動作します。
SCIMでの自動プロビジョニングは試せていません。


## SAML連携設定手順

1. IAM Identity Centerを有効化します

2. [設定]を選び、[アクション]-[アイデンティティソースの変更]を選択します。

![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96182/21b8b329-c512-ceb8-c65f-3dd74f500b19.png)

3. [外部IDプロバイダー]を選択します

![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96182/53ca3297-bad5-c51c-ea06-902637c912fc.png)

4. [メタデータファイルのダウンロード]を選択し、AWS側のメタデータをダウンロードします

![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96182/bf648cb7-9db0-b9c4-370a-dea6c3c59e3a.png)

5. OpenAMの管理者画面にログインし、[リモートサービスプロバイダを登録]から4.のメタデータを登録します。
    * NameIDを送付する際は、[ `urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress` ]でメールアドレス形式のNameIDを送付する必要があります
     
![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96182/d6552626-a6b3-5293-4a0e-3b5d6a283f5b.png)

6. 以下のURLにアクセスし、OpenAM側のIdPメタデータを取得します
    * https://<OpenAMのデプロイURL>/saml2/jsp/exportmetadata.jsp?realm=<該当のレルム>

7. [アイデンティティプロバイダーのメタデータ]の[IdP SAML メタデータ]の[ファイルを選択]を選択し、6.のメタデータをアップロードします

![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96182/7de0803b-a73a-e5a0-78f7-ead1db762b9b.png)

8. [次へ]を選択し、設定を作成します。

9. 設定変更の確認ダイアログが表示されるので、[アイデンティティソースの変更]を選択します。
    * 既存設定が消えるといった旨の内容が表示されます。

## ユーザーのプロビジョニング

1. [ユーザーを追加]を選択し、SAMLでの認証元に対応するユーザーを作成します

![101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96182/88116bcc-51aa-6ee8-8dc2-9f6d723f9d26.png)

  *  [ユーザー名]の欄は、前述の「 `urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress` 」で送付するメールアドレスの値で作成します。
  * その他のフィールドは適宜入力します。 

2. [ユーザーをグループに追加]では、適宜グループに追加を行います。不要な場合は [次へ] で問題ありません。

3. 作成したユーザーをAWSアカウントに割り当てます。[AWS アカウント]を選択し、割り当てたいAWSアカウントを選択し、[ユーザーまたはグループを割り当て]を選択します。

![102.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96182/58d70c33-abd4-82be-b24f-d354b11b6fa8.png)

4. 割り当てるアカウントを選択します。デフォルトでは[グループ]がフォーカスされているので、先ほど作成したユーザーに割り当てる場合は[ユーザー]を選択し、1.で作ったユーザーをチェックし、[次へ]を選択します。

5. 権限の割当をおこないます。実際の運用にあわせて適宜設定すべきですが、今回は[AdministratorAccess]で設定し、[次へ]を選択します。

6. 設定内容の確認が表示されるので、内容に問題がないことを確認し、[送信]を選択します。

## 動作確認

SAML連携設定と、アカウントのプロビジョニングが終わったら、動作確認を行います。

1. IAM Identity Center の [設定]を開き、[アイデンティティソース]の欄を確認します。

2. [AWS アクセスポータルの URL] があるので、記載のURLを表示します

3. OpenAMに転送されるため、認証を行います。

4. 以下のようなポータルが表示されれば成功です。

![301.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96182/27ad0680-152e-cef2-c73e-c0c7308ce238.png)
Open3Dを使い始めてみた

## はじめに
自前のコードは書かずに、なるべく標準に寄せたいと思っている。

ステレオカメラの視差の表示のために視点を変えた画像の生成や、点群データの保存をしたくなったので、Open3Dを使い始めることになった。
　そのなかで感じた雑感を記す。

 ## OpenCVでも深度データから点群を作れるけど
- OpenCVにも
    - 深度データから点群を生成する関数
    - 点群から2Dの画像を生成する関数があります。
    - ascii形式のplyファイルを出力することは簡単。
    - [OpenCV-Python Tutorialsの「カメラ校正」への補足](https://qiita.com/nonbiri15/items/e36c12d444d7cc4a00b7)

```
>>> import cv2
>>> help(cv2.reprojectImageTo3D)

 reprojectImageTo3D(...)
    reprojectImageTo3D(disparity, Q[, _3dImage[, handleMissingValues[, ddepth]]]) -> _3dImage
    .   @brief Reprojects a disparity image to 3D space.
```

ですから、最初のバージョンはOpenCVで書いて見ました。

## OpenCV での不安
- OpenCVでの2D-3D関係の関数は少ない。
- そのため自作コードが増えてしまう。
- 品質の確保に不安が出てくる。

## Open3Dでの書き換えへの期待
- 自作コードを減らしたい。
- Open3Dが予め用意している枠組みを使ってもっと楽をしたい。
- さまざまなバックエンド対応はOpen3Dのコミュニティに任せられる。
    - マルチコア対応、GPU対応、ARM対応など

## どう使えばいいらしいのか
- o3d.geometry.PointCloud
- o3d.t.geometry.PointCloud
の２つがある。
o3d.t.geometry.PointCloudが最近の推奨
o3d.geometry.PointCloudはlegacy という位置づけらしい。
o3d.t.geometry.PointCloud型のクラスにはto_legacy()というメソッドがある。
to_legacy() の戻り値は、o3d.geometry.PointCloud　型になる。

o3d.io.write_point_cloud()の関数は、legacyの方の型にしか対応していないようだ。
（この記事の執筆時点では）
だから、次のようなコードとなる。

```:.py
# legacyの型への変換
pcd = stereo_camera.pcd.to_legacy()
o3d.io.write_point_cloud(str(plyname), pcd, format='auto', write_ascii=False, compressed=False, print_progress=True)
```

#### 現時点での私の理解
- なるべく、legacyではない方の実装を利用してコードを書く。
- ただ、IO関係で、うまくいかない場合には、to_legacy() してlegacy型に変換して、legacyにあるIOの実装を使った方がいいようだ。


## 今後使っていきたいもの
- ステレオ計算で生じたartifact(手前の物体と背景の境に生じる不自然極まりない余計な点）を削除したい。
[Point cloud outlier removal](https://www.open3d.org/docs/latest/tutorial/Advanced/pointcloud_outlier_removal.html)
- メッシュを作成したい。
[Mesh](https://www.open3d.org/docs/release/tutorial/geometry/mesh.html)


## 自前の関数で不要になったコードは学習用のコードと割り切る
- OpenCVベースで処理を行えば、行列(np.ndarray型)での明示的な演算をすることになる。
- そのため、depth画像から3Dの点群を生成するには、実際にはどう計算するのかを知るのには適している。
- Open3Dで書き換えていくと、そのような明示的な操作は、Open3Dのライブラリの内部に隠れていく。
- だから、自前の関数で不要になったコードは学習用のコードと割り切る。
初めて参画するプロジェクトPM(PMO) 要件定義の工程

こんにちは、小磯と申します。
プロジェクトの中にいくつかの工程があります。
その中にある要件定義について纏めようと思います。
初めて業務を行うPM(PMO)の方へ参考になればと思います。

### システム開発の上流工程プロセス

システム開発に重要な工程でありプロジェクトを大きく左右する要素です。
内容や目的を正確に理解していないと失敗してしまう可能性があります。

### 1.要件定義

要件定義とはプロジェクトの指針を決めることです。
クライアント(ユーザ)から要望を聞き出し、どのような機能をシステムに実装するのかを決めます。
その過程で業務フローや要求機能一覧といった資料の作成も行います。
クライアントと話し合いをし要望だけではなく、現在抱えている課題やシステム開発をする背景まで聞き出し理解することが大事です。
最終的には基本設計につなげるための仕様書を作成しクライアントからの承認を得られれば、
次のフェーズに進むことができます。

### 2.要件定義の流れ

クライアントから要件をヒアリングして内容を整理します。
内容を整理して仕様書を作成するという流れです。
　①クライアントから要件をヒアリングする
　　→現状の業務フローや課題、システム開発を依頼した背景などをじっくりと聞き出します。
　　　クライアントに資料を作成してもらうとヒアリングがスムーズに進みます。
　　　プレ要件定義で大まかに要望をまとめて、より詳細な要件定義を行うという流れです。
　②ヒアリングした内容を整理する
　　→ヒアリングで聞き出した内容は分かりやすく整理する必要があります。
　　　それぞれのヒアリング項目について優先順位を付けます。必須要件と希望要件に分類すると良いです。
　　　予算と期間が限られるため、クライアントの要望を全て取り入れると上限を超えてしまうため、
　　　優先順位を付けて、実現可能な落としどころを見出すことが必要です。

### 3.仕様書の作成

要件の整理が出来た後に仕様書を作成します。
仕様書にはシステムの概要や構想、システムを開発する目的、システム導入後のフローといった項目を入れるとよいです。
要求機能一覧や非機能要件をまとめておくと良いです。
仕様書は何度もクライアントにレビューしてもらい認識齟齬が無いようにします。
クライアントから承認を得られれば要件定義が完了となります。

### まとめ
要件定義は方向性や予算を決める重要な工程です。
クライアントから追加の要望が出る場合は、仕様書や機能一覧、費用を提示して説明することもあると思います。
それでもクライアントが引き下がらない場合は、担当者より説明いただくよう相談するとよいです。

他にもプロジェクトに関する記事を投稿しておりますのでお役に立てればと思います。
[プロジェクト ウォーターフォールとアジャイルの違い](https://qiita.com/pesysyon/items/e77b869b5c90b667680b)

[初めてプロジェクトに参画する方へプロジェクトとタスクの意味について](https://qiita.com/pesysyon/items/a7da021a7d596df5e5fd)


以上、小磯でした。
ターミナルで処理がとまったら呼んで欲しい

Pythonで時間がかかる処理をしていると、
気がついたらエラーで止まってしまい、時間を無駄にしてがっかりすることがあります。
処理の完了まで画面をずっと眺めているわけにもいかないので、Macの`Say`コマンドを使い、処理が止まったら呼んでもらうことにしました。


```powershell
% say "こんにちは"
```

このようにファイルの実行時に `&&` や `||` をつけて、成功時と失敗時で異なるメッセージを読み上げてもらうことができます。

```powershell
% python generate.py && say "無事におわりました" || say "失敗みたいですよ"
```

これで安心して画面から目を離すことができますね。
これだけでもいいのですが、音声の変更もできるようなので、少し調整してみます。

## 音声の変更

デフォルトの音声は「システム設定 > アクセシビリティ > 読み上げコンテンツ」から指定できます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3166965/f1223471-1aa9-1789-215e-8664a760779a.png" width="400px">


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3166965/179c768c-4fea-10d8-712d-7e2a8fba6eab.png" width="400px">


日本語だと"Hattori", "Kyoko", "O-Ren", "Otoya", "Siri”が選択できるようです。

また、`say`コマンドのパラメーターを使って声を変更することもできmす。

```powershell
% say -v Kyoko "こんにちは"
```

利用可能な音声一覧は`-v '?'`で確認できますが、システム設定で選べた他の音声は表示されず、"Kyoko"のみが選択可能でした。

```powershell
% say -v '?'
```

# パラメーター

`[[ ]]`で囲むと、文章の途中で音声の調整が可能です。

| パラメーター | 効果 | 値 |
|:-:|:-:|:-:|
| volm | 音量 | 0.000 ~ 1.000 |
| rate | 速度 | 0.000 ~ 65535.999 |
| pbas | 音程 | 0.000 ~ 127.000 |
| pmod | 抑揚 | 0.000 ~ 127.000 |


```powershell
# 音量 volm
say "[[volm 0.1]]こんにちは、いい天気ですね [[volm 1]]こんにちは、いい天気ですね"

# 速度 Speech rate
say "[[rate 100]]こんにちは、いい天気ですね [[rate 300]]こんにちは、いい天気ですね"

# 音程 Baseline pitch
say "[[pbas 0]]こんにちは、いい天気ですね [[pbas 127]]こんにちは、いい天気ですね"

# 抑揚 Pitch modulation
say "[[pmod 0]]こんにちは、いい天気ですね [[pmod 127]]こんにちは、いい天気ですね"
```

複数のパラメーターをまとめて指定することもできます。
```powershell
say "[[rate 160]][[pbas 70]][[pmod 100]]こんにちは、いい天気ですね"
```
PowerApps 変数の曖昧性の除去

# 曖昧性の除去
1.入れ子になったレコード スコープの値にアクセスするには、次のパターンを使用した操作対象のテーブルの名前の @ 演算子を使います。
Table[@FieldName]

2.データ ソース、コレクション、およびコンテキスト変数などのグローバル値にアクセスするには、[@オブジェクト名] のパターンを使用します (テーブルは指定しません)。

# サンプル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/0d3d0bd4-afd1-e2a1-69dc-adba4c827551.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/9459c582-8c76-2f12-af3c-cb130d95d336.png)

さらに、Value という名前のコンテキスト変数を次の数式を使用して定義します: UpdateContext( {Value: "!"} )

```
Ungroup(
    ForAll( X,
        ForAll( Y,
            //Yコレクションの値と、Xコレクションの値とローカル変数の値を連結する
            Y[@Value] & Text( X[@Value] ) & [@Value]
            
        )
    ),
    "Value"
)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/31880fe6-94b1-cb4d-49d2-59056e29dd0b.png)

# 参考サイト
https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/working-with-tables
define文で式の値がおかしいときにチェックすべきこと1選

## define文に式を書くなら括弧で囲め！！
define文は計算結果を格納しているのではなく、文字として置き換えるだけ！
```
#define HOGE 100 / 20
#define FUGA HOGE / HOGE
```
とした場合、FUGAは$ 5 / 5 = 1$ではなく$100 / 20 / 100 / 20 = 0.0025$になる。
FUGAを1にしたいなら
```
#define HOGE (100 / 20)
#define FUGA (HOGE / HOGE)
```
にしよう！
FUGAを使ったdefineがおかしくなるのも防ぐためにFUGAにも、すべてに括弧をつけよう！
悪いことは言わない。**俺みたいになるな！！！！**
【ネットワーク基礎 #5】ネットワークの構成モデル


## 2階層設計（Two-Tierキャンパス設計）
Ciscoが提唱する3階層モデルにおけるコア層を省略ネットワーク設計
コラプストコア（Collapsed core：つぶれたコア）設計とも呼ばれている

![k37983.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3908715/b91f52bd-1bdc-06f9-b996-c054348298d6.jpeg)

## 3階層キャンパス設計（Three-Tier Campus Design）
以下3つの層で構成される大規模な環境向けのネットワーク設計

![kk37983.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3908715/6283f31b-088f-4fe8-a342-11e2cd27e184.jpeg)

## 各ティア（階層）の主な特徴
![kkk37604.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3908715/1248a180-b3a8-d4f0-55fc-cd42feed3367.jpeg)

## スパイン＆リーフ
スパイン層とリーフ層の2階層で構成するモデルで、主にデータセンタで採用されている

![k38997.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3908715/96ec84b7-379e-b879-d81f-234b9a0298f8.jpeg)

#### 【主な機器】
・リーフ層のスイッチとスパイン層のスイッチは全て接続する
・リーフ同士、スパイン同士の接続はしない
・エンドポイント（サーバなど）はリーフ層に接続する
・同じホップ数で全ての宛先に到達可能（送信元のリーフスイッチから見て、スパインスイッチを1つ経由するだけで宛先となるリーフスイッチに到達できる）
・帯域幅を増強したい場合はスパイン層にスイッチを追加する
・エンドポイント用のポートを増やしたい場合はリーフ層にスイッチを追加する
・リーフ層の機器もレイヤ3プロトコルに対応している（OSPFやBGPの負荷分散などが使用可能）
・3階層の構成と比べて、障害の影響を抑えられる
・3階層の構成と比べて、機器やケーブルの数を少なくできる

## SOHO（Small Office / Home Office）

小きっぼオフィスや自宅兼事務所（在宅ワーク等）のような小規模なネットワーク構成を指す

#### 【主な機器】
1．サービス統合型ルータ
　スイッチやファイヤーウォールなどの機能も併せ持つルータ）

 2．自立型AP
 　WLCなしでWLANを構築できるアクセスポイント

※WLC（Wireless LAN Controller）とは、無線LANの管理を集中化するためのネットワーク機器の一種

  ![k38784.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3908715/1afef394-a9d6-12bd-0aca-18bc0378ee3b.jpeg)

インターネットに接続するための回線は、帯域幅が大きく費用も抑えられるブロードバンド回線が適している

#### 【主なブロードバンド回線】
1．光回線
2．ケーブルテレビ
3．WiMAX
Next.jsでpino-prettyを使う

`instrumentationHook` は先んじて `next.config.mjs` で有効にしておく

```instrumentation.ts
export const register = async () => {
  if (process.env.NEXT_RUNTIME === "nodejs") {
    /* eslint-disable @typescript-eslint/no-require-imports */
    await require("pino");
    await require("next-logger");
  }
};
```

本番ではpino-prettyは有効にしない

```next-logger.config.js
const pino = require("pino");

module.exports = {
  logger: (defaultConfig) => {
    const opts =
      process.env.NODE_ENV === "production"
        ? {}
        : {
            transport: {
              target: "pino-pretty",
              options: {
                colorized: true,
              },
            },
          };

    return pino({
      ...defaultConfig,
      ...opts,
    });
  },
};
```
marketing cloud how to send sms

0.setup--->InstalledPackages--->new



1. api request code 
 ~~~
        String clientId = 'clientId';
        String clientSecret = 'clientSecret';
        String tokenUrl = 'https://[get this from step 0].auth.marketingcloudapis.com/v2/token';
        
        HttpRequest req = new HttpRequest();
        req.setEndpoint(tokenUrl);
        req.setMethod('POST');
        req.setHeader('Content-Type', 'application/json');
        
        String body = '{"grant_type":"client_credentials","client_id":"' + clientId + '","client_secret":"' + clientSecret + '"}';
        req.setBody(body);
        
        Http http = new Http();
        HttpResponse res = http.send(req);
        

            Map<String, Object> responseMap = (Map<String, Object>) JSON.deserializeUntyped(res.getBody());



Object accessToken =responseMap.get('access_token');
system.debug(accessToken);
// リクエストJSON
        String smsReqJson = '{"ContactKey": "[step 3]",'
                          + '"EventDefinitionKey":"get it from journey builder",'
                          + '"Data": {'
                          + '         "contactkey":"required",'
                          + '         "sentdate":"' + String.ValueofGmt(Datetime.now()) + '",'
                          + '         "country":"JP",'
                          + '         "phone":"yourphone",'
                          + '         "name":"yourname"'
                          + '}}';  
 
        // エンドポイント
        String endpoint2 = 'https://[get this from step 0].rest.marketingcloudapis.com/interaction/v1/events';
        // HTTPリクエスト
        HttpRequest req2 = new HttpRequest();
        req2.setEndpoint(endpoint2);
        req2.setMethod('POST');
        req2.setHeader('Content-Type', 'application/json');
        req2.setHeader('Authorization', 'Bearer ' + String.valueof(accessToken));
        req2.setBody(smsReqJson);


Http http2 = new Http();
        HttpResponse res2 = http2.send(req2);
        
        System.debug(res.getBody());

 ~~~


 2.journey builder
 api event---> SMS


 3.mobile connect
 add contacts--->manually or input file

 ensure your phone number is correct and your contact key is equal to your api request code
[VBA]ListObjectを2列以上選択したい

## ListObject(テーブル)で複数列を選択する

VBAで制御する場合
1列を選択（Listcolumn） or 全部を選択（DataBodyRange/Range）するのはすごく簡単なのに
複数列を選択するのってどうやるかわからない！！！
VLOOKUPで2列目を先頭にしたいとき困りますよね…

https://indoor-nekura.work/vba_listobject_vlookup/
電磁気の基礎　課題　001

### 問題文
1 Cの電気量をもち、1 m離れている2つの電荷の間に働く電気力は、約何 kgの質量の物体に働く重力に等しいか。

---

### 解説

1. **電気力の計算**  
   2つの電荷の間に働く電気力 \( F \) はクーロンの法則を使って求められます。

$$ F = \frac{k \cdot q_1 \cdot q_2}{r^2} $$

   ここで、  
   $ \( k = 8.99 \times 10^9 \, \text{N} \cdot \text{m}^2/\text{C}^2 \)$（真空中のクーロン定数）  
   $\( q_1 = q_2 = 1 \\, \text{C} \)$（各電荷の電気量）  
   $\( r = 1 \, \text{m} \)$（距離）

   代入すると、
   $$
   F = \frac{8.99 \times 10^9 \times 1 \times 1}{1^2} = 8.99 \times 10^9 \\, \text{N}
   $$

2. **重力との比較**  
   次に、質量 \( m \) の物体に働く重力 \( F_g \) を次の式で求めます。
   $$
   F_g = m \cdot g
   $$
   ここで、$\( g = 9.8 \, \text{m/s}^2 \)$（重力加速度）とし、$\( F_g = F \)$ とすると、
   $$
   m = \frac{F}{g} = \frac{8.99 \times 10^9}{9.8} \approx 9.17 \times 10^8 \, \text{kg}
   $$

---

### 答え
この電気力は、約 $\( 9.17 \times 10^8 \\, \text{kg} \)$（約9億1700万 kg）の質量に働く重力に等しいです。
プロジェクト炎上あるある

こんにちは！いつの間にか40を過ぎた**IT関係を仕事にするおじさん**です。  
プロジェクトをいくつも手がけてきましたが、いつの時代も炎上する案件には共通の「お決まり」があります。10年越しの既視感なんてのもあったりします。経験者のみなさんなら、「**あ〜、あるある！**」と共感してもらえるはず。

今回は、プロジェクト炎上の特徴を、**笑いあり涙あり**（時には諦めあり）で語っていきます。誰のためでもありません。愚痴をいう相手もいないので、画面に向かって愚痴ります。

---

## 1. 「仕様が変わった、またですか？」問題

最初の打ち合わせで決めたはずの仕様が、進めば進むほど「**ちょっと待って、やっぱり…**」と変更されるパターン。最初は小さな「微調整」ですが、気がつくと**別プロジェクト並み**に膨らんでいます。営業から「大丈夫です、これだけで最後ですから！」と言われ、もう**3回目、4回目…あれ、何回目だっけ？** 「これも追加しといて！」って上司からメールが来るたび、心の中で「またか〜」とぼやいている自分がいますね。

---

## 2. 「言ったはず！」vs.「聞いてない！」の泥試合

開発陣が「**仕様通り作った**」と言えば、営業やクライアントは「そんな話、**聞いてない！**」。会議でちゃんと説明したのに、「そんな風には理解してない」と返されるやりとりは、もはやプロジェクト炎上の**恒例行事**。この手の言い合いで進行が止まり、**誰もがイライラ**している状況は、まさに地獄絵図。おじさんも「念のため録音しとこうか」なんて冗談を言う始末です。

---

## 3. 「新人の教育？それより手が足りないんだ！」問題

炎上し始めると必ずと言っていいほど、「このプロジェクト、どうにかしてくれ！」と**新人が応援**に入ってきますが、正直言って、「**教育に時間をかける余裕なんてないんだよ…！**」というのが本音です。でも、手伝ってもらわないと終わらないのも事実。新人の「何をすればいいですか？」という質問がどんどん増えて、結局こちらが**仕事の手を止めて説明**していると、「あれ、さっきよりもタスクが増えてる？」という悪循環が生まれるんですよね。これ、**業界あるある**じゃないですか？

---

## 4. 資料の山と「見てませんでした」地獄

「これで大丈夫ですよね？」と**確認のために資料を送る**と、返信なし。会議の場で「その内容、**見てませんでした…**」と言われるこの地獄も炎上あるあるの一つです。資料を作って送るのに**何時間もかけた**のに、結局誰も目を通していない。資料が山積みになって、それぞれがどれを読めばいいか分からない状態に。「何度目だよ、これ」と内心イライラしながら、「それでは簡単に説明を…」と**表向きは冷静**を装いますが、心の中では泣いてます。

---

## 5. やっぱり来たか「納期は動かせません！」の鉄板

「これ、**予定通り終わらないね**」という相談をクライアントにすると、「**そちらで調整お願いします**」と軽く返されるやつです。いやいや、こっちも**何度も調整してるからもう限界なんですよ！** 「納期を遅らせると上司に怒られちゃうんで…」とあっさり断られるたび、内心「上司も巻き込んで説得してよ！」と思うわけです。でも、クライアントの方も社内で厳しい立場なのは知ってるので、怒りもどこにぶつければいいのか分からず、そのまま**心にしまい込むおじさん**です。

---

## 6. 神対応のはずが「この機能もつけてください」おかわり祭り

頑張って「今、プロジェクト大変だけど、これができれば大丈夫です！」と要望をすべてクリアして提供したのに、「**じゃあこの機能も追加でお願いできます？**」と軽い感じで次々リクエストが来る現象、ありませんか？しかも、やればやるほど当然のように「**ついでにこれは？**」と続くんです。これ以上手をかけると全体の**スケジュールがズレる**のに、サービス精神で応じると結局、案の定**炎上の火種**になりがちです。

---

## 7. 上層部からの突然の「重要な変更」指示

チーム全員で徹夜して作り上げたものが、「**上からの指示で**」全然違う方針に変更になることも多々あります。さすがに「**それは先に言ってくれ**」と言いたいところですが、上司も上司でいろいろ事情があるので我慢して受け入れます。こういう場面では、「もうちょっとで完成だったのに！」と**肩を落とす開発メンバー**の背中をなだめつつ、新たな計画を立て直します。これも経験と思いつつ、内心ではもう**やめてくれ**と叫んでます。

---

## 8. 「これ、上司に直接聞いてみてください」作戦

進行中、うるさく口出しをしてくる人がいるときに発動する「**これ、上司に直接聞いてみてください**」作戦。要は、こちらで抱えきれない案件を上司に持って行かせる**最終手段**です。上司も直接言われると簡単には「いいよ」とは言えないので、自然と**要求が収まる**のを狙います。自分で解決できないと悟った時、あえて上司に投げる作戦は、この歳になるとちょっとした「**奥の手**」ですね。

---

## 9. 終盤の「もう少しだけ」要望で延長戦

やっと**終わりが見えてきた**と思ったら、「**最後にこの修正だけお願い**」と追加が来るパターン。これが繰り返され、終盤なのに実質的に**延長戦**が始まるのもよくあることです。期限が迫っているのに、「これが済めば解放される…」と思いながら「**最後のひと踏ん張り**」を何度も重ねる自分が、いつの間にか**疲れ果てている**のに気づきます。

---

## 10. 終わったと思ったら、次のプロジェクトが…

なんとか炎上プロジェクトを終わらせて、「やっとゆっくりできる！」とホッとしたのも束の間、すぐに**次のプロジェクト**が控えているのが現実です。終わった瞬間に次の案件の**キックオフメール**が来ると、「**ちょっと休ませてくれ〜！**」と叫びたくなります。でも、これもプロジェクトマネージャーの**宿命**。燃え尽きたけど、また立ち上がって次へ向かう。これが我々おじさんの仕事です。

---

いかがでしたか？

炎上プロジェクトに巻き込まれることも、**成長の糧**と言えばそうなのですが、できることなら**穏やかに仕事を進めたい**ものですよね。今回の「あるある」を読んで、少しでも「こんなことあるよね〜」と**共感**してもらえたら幸いです。

と、実はこういう問題って、**プロジェクトの透明性**が濁ってきた時に発生しがちなんですよね（英語で最近トランスペアレンシー（transparency）なんて言われるやつです）。明るく元気に**全員で同じ情報**を見ていると、合意形成がしやすかったりします。

まあ、**組織的に炎上を仕掛けてくる場合**も有るには有りますが。。。

**透明性を保つ**には、時に**ツールを入れてみる**のも手ですね。
最近気になったツールを紹介：[**ONES.com**](https://ones.com/ja/) コストと機能のバランスが良いツールです。
コマンドラインからOpenFOAMテキストファイルを編集する方法

# コマンドラインからOpenFOAMテキストファイルを編集する方法

## はじめに
OpenFOAMの設定ファイルの入力形式は「辞書」です。
具体的には、
```bash
	  Dict{
		  keyword value;
	  }
```
みたいな形です。
このように構造化済みであり、foamDictionaryコマンドで編集できます。
つまり、エディタを立ち上げずにコマンドラインまたはシェルスクリプトから値の変更ができます。
foamDictionaryコマンドの使い方と具体例を示します。

## 動作環境
- WSL2 + Ubuntu 22.04
- OpenFOAM 10

## 下記のコマンド実行に用いたサンプルモデルの場所
念のため、コマンド実行に用いたサンプルモデルの場所です。
```
  /opt/openfoam10/tutorials/multiphase/interFoam/RAS/weirOverflow
```

## コマンドの説明
- foamDictionary
  - 説明：辞書ファイルの中身の確認や変更を行う。

## コマンド具体例

### 使用例：非定常流れ解析の最終時刻の変更
- 個人的に一番便利だと思って使っている場面
```
  foamDictionary -entry endTime -set 300  system/controlDict
```

### 使用例：コマンドラインから設定ファイルを閲覧
- 「-value」オプションでentryのvalueを表示
```bash
  foamDictionary -value 0/include/initialConditions
```

```bash
# 実行結果
inletFlowRate   75;

pressure        0;

turbulentKE     0.00414;

turbulentEpsilon 4.39e-05;
```
- ちなみにcatコマンドで表示させた場合
  - foamDictionary -valueはentryのみ表示される。

```bash
/*--------------------------------*- C++ -*----------------------------------*\
  =========                 |
  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
   \\    /   O peration     | Website:  https://openfoam.org
    \\  /    A nd           | Version:  10
     \\/     M anipulation  |
\*---------------------------------------------------------------------------*/

inletFlowRate        75;
pressure             0;
turbulentKE          4.14e-03;
turbulentEpsilon     4.39e-05;

// ************************************************************************* //
```

### 辞書の一部分を表示させたい場合
- 「entry」オプションを使う。
```bash
foamDictionary -entry boundaryField 0/U
```

```bash
# 実行結果のサンプル
boundaryField
{
    inlet
    {
        type            variableHeightFlowRateInletVelocity;
        flowRate        $inletFlowRate;
        alpha           alpha.water;
        value           uniform ( 0 0 0 );
    }
    outlet
    {
        type            inletOutlet;
        inletValue      uniform ( 0 0 0 );
    }
    lowerWall
    {
        type            noSlip;
    }
    atmosphere
    {
        type            pressureInletOutletVelocity;
        value           uniform ( 0 0 0 );
    }
    defaultFaces
    {
        type            empty;
    }
}
```

### さらに深いDictを表示させたい場合
- 「entry」オプションに与える引数をスラッシュで区切り、Dictの中のSubDictを表示させる。
```
  foamDictionary -entry boundaryField/inlet 0/U
```
```
# 実行結果
inlet
{
    type            variableHeightFlowRateInletVelocity;
    flowRate        $inletFlowRate;
    alpha           alpha.water;
    value           uniform ( 0 0 0 );
}
```

### Dictの中のkeywordを抽出するには
```
  foamDictionary -entry boundaryField/inlet/value 0/U
```

```bash
# 実行結果
  value           uniform ( 0 0 0 );
```
### 値を変更する場合
- 「set」オプションで値を変更する。今回の場合はダブルクォートで括って値を変更します。
```bash
foamDictionary -entry boundaryField/inlet/value  -set "uniform ( 1 0 0 );" 0/U
```
```
# 実行結果
  New entry value           uniform ( 1 0 0 );
```

## さいごに
- foamDictionaryコマンドの使い方を示しましたが、いかがでしたか。
- 個人的にfoamDictionaryってタイプ数長いやんって思います。
- 基本的にBashのAutocompleteが効くので問題ないですが。。。
- Aliasを書くのもアリかもしれない。
- たとえば、こんなの（でもこれって嬉しいのか？もっと短いほうが使いやすい？）
```bash
	alias foamDict='foamDictionary'
```
新卒３年目で転職し、無事内定をもらったので色々書きます

# はじめに
お久しぶりです。僕です。
こんなよくある釣りタイトルみたいなの、やってみたかったのでやってミマス。

:::note info
本記事は「みすてむず Advent Calender 2024」での投稿記事です。
「みすてむず」とは「Misskey」というサービスにおけるエンジニアコミュニティです。
:::
https://misskey.systems/



こちらの記事は転職ドラフト体験談投稿キャンペーンに参加しています
https://job-draft.jp/articles/251

# 僕は誰なのか
僕について軽く説明すると、高専卒の22年卒のエンジニアです。
やってきたことで言うと、
- Webアプリの構築（バックエンドとフロントエンド）
- ネットワークについて
- DNSやMailサーバの構築
- セキュリティについて

簡単に言うとこんな感じで、幅広く学んできました。
そんなこんなでとある縁でインターンを実施させてもらった企業さんに入社したって感じです。

# なぜ転職したのか
僕は新卒で入った会社は結構規模の大きい会社でした。
インターン→バイト→正社員というエスカレーターでの入社でした。
大きい会社の中の社内ベンチャーのような部署にて活動していました。
そこは人数も少なく、その割には運用しているサービスは多いみたいな状況でした。
転職の動機としては大きく２つあります。

１つ目は **「エンジニアとしての成長の限界を感じた」** です。
僕の将来のエンジニア像としては、

**「コミュニティを牽引できるようなエンジニア」**

と言うイメージです。
Twitterとかにいるつよつよさんみたいになりたいなーって感じです。

このようなエンジニア像になるには現職では限界があるなと感じたのが大きなポイントです。

２つ目は **「給与が少ないと感じた」** です。
結局金かい。みたいなことはありますが、まぁ金は金なんで。
入社した会社ではエンジニア採用のような枠がなく、営業職やエンジニアが同じ枠で採用していることもあり、初年度の年収が学歴によって決まっていました。
僕のいた部署では僕ともう一人の大学卒が配属してました。
僕はもちろん経験者なのでコード書いたり設計したりレビューしたりとしてました（人少なすぎない？）が、大学卒の方はあまり経験がない状態でした。
経験がないと言うことは、僕は指導したりする場面が出てきます。しかし、年収ベースで行けば僕とさほど変わりない、なんなら彼の方が多いという状況でした。

この状況が長く続き、上司からも「年収はすぐあげられない」と言われ、限界を感じました。

以上の２点が転職を決意した大きなポイントです。

# 転職先に求めたもの
転職先に求めたのは２つです。
1. 現職以上の給与か
1. エンジニアの人数やモチベーションはどうか

です。
1は転職あるあるなので割愛します。
2のモチベーションに関してです。
僕の言うモチベーションは **「技術について興味があるか」** と言うのを指しています。
エンジニアという仕事でもありますが、個人開発を少しでもやっている僕としては、趣味を仕事にしていると思いながら活動しています。その方が楽しいですし。
前述した僕のなりたいエンジニア像になるためにも、自分の周りにはエンジニアとして技術に興味のある人が多くいて欲しいなと思ったので、そのような雰囲気や人のいるようなところに行こうと思っていました。

先ほど紹介した「みすてむず」では、日常的なつぶやきもあれば急に技術の話を真剣にする。このような温度差、温度感がたまらん好きなのです。

この辺の転職先に求めるものはしっかりと言語化した方が良いかと思います。

# 転職時に活用したもの
## findy
https://findy-code.io/home

Findyはよくある転職エージェントサービスです。
Findyの良い点はメンターさんがついてくれて都度カウンセリングを実施してくれるところです。
わからないところ、何か自分の条件にマッチする企業さんの紹介、自己アピール文の修正等、自分に寄り添ってくれるので大変助かりました。

面接前の不安さや、この企業はこのようなポイントを重視してます！とか教えてくれるので、メンタル的に助かりました。


## 転職ドラフト
https://job-draft.jp/

転職ドラフトは名前の通り、ドラフト形式の転職サービスです。
自分のプロフィールを登録して、毎月あるドラフトに参加すると、企業様の方からスカウトが来るといった流れのサービスです。

このサービスの良い点は、指名された時に、「なぜ指名したのか？」「どのような領域を任せたいか」といった業務に関する内容が詳細に書かれているので、どのような企業でどのようなサービスを作っているのかがわかりやすく、判断材料にしやすかったです。

また、指名される形式なので、いい気分になれます。

# 結果
転職活動自体は2023年の12月から始動して、本格的に動き出したのは7月末からでした。
１２月に始動→５月〜７月末まで休憩→10中旬内定　
といったスケジュールでした。

カジュアル面談：１８社（Findy：１３社、転職ドラフト：５社）
一次面接落ち（面接、技術面接）＋ 辞退：１５社
最終面接：３社
内定：２社

といった感じでした。

カジュアル面談はやればやるだけいいと思います。いろんな企業さんがあって面白いですし、単純にエンジニアの人と喋るのは面白いですからね。


# 転職活動を通して感じたこと
転職するにあたって自分を見つめ直すことが多くありました。
仕事以外に自分でやりたい領域の勉強をするとか、気合を入れるためにMacBookを買ってみたり。（20万）

まだ若いってこともあり、「チャレンジして失敗しても大丈夫っしょ！」の精神で転職活動しましたが、良い結果が来て満足です。

プログラミングの領域はやっぱ好きなんだなー俺って、と再確認できたのもよかったです。

では。
Linuxmintでファイルタイプアイコンの一括変換のメモ

## nemoでファイルタイプをわかりやすくするために

Nemoで、JavaScriptとシェルスクリプトのファイルアイコンが同じなので、判別しやすいように変更してみました。
システムのアイコンテーマは、フルアイコンテーマを使っています。

### 1. MIMEフォルダーの以下のファイルを開く

`/usr/share/mime/packages/freedesktop.org.xml`
を開く

### 2. 変更したいファイルタイプの該当の箇所を変更

JavaScriptのアイコンを変更したい場合

JavaScriptの
`<generic-icon name="text-x-script"/>`
の箇所を
`<generic-icon name="text-x-javascript"/>`
に変更し、管理者権限で保存

※perl等、他でも"text-x-script"を使っているので、
一括変換はやめましょう。

### 3. キャッシュ更新

MIMEのファイルだけ変えても、これをしないと変わりません。mimeのキャッシュを更新しましょう。

```shell
sudo update-mime-database /usr/share/mime
```
しばし待ったら完了です。


※ちなみにこれは、デスクトップアプリケーションを変更した場合。今回は不要。

```shell
sudo update-desktop-database /usr/share/applications
```

以上です。
エンジニアの学習について誤解していたこと

今まで取り組んでいるタスクに関する知識が不足している場合、そのタスクを後回しにして業務時間外でキャッチアップしていた。
しかし、そのやり方だとなかなか自分の成長につながるタスクに取り組むことができない。
マネージャーとのMTGの中で、そのようなキャッチアップは業務時間内でもやっていいとわかった。
ただ、マネージャーの立場からすると、そのキャッチアップがきちんと業務に活きているかというのは知りたいので、それをわかるように共有するのはこちら側の責任だと思った。
arcブラウザでもsearchGPTをコマンドパレットで使いたい


# arcブラウザでもsearchGPTをコマンドパレットで使いたい

先日searchGPTというものがリリースされました．

https://openai.com/index/introducing-chatgpt-search/

これによってchatGPTが検索エンジンとして使えるようになりました．

そして同時にchrome拡張機能もリリースされました．

この拡張機能を使うことで，chromeの検索バーからでchatGPTを使うことができます．

しかし，arcブラウザはchromeベースではありますが，コマンドパレットが少し特殊なため，この拡張機能を使うことができません．

そこで，arcブラウザでもsearchGPTをコマンドパレットで使えるようにする方法を紹介します．

![search GPT](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670528/c08eb659-5499-3283-9a0b-4294e12f2a54.png)

## 方法

https://arc.net/l/quote/ufgldmrl

このように検索エンジンの設定を変更することで，コマンドパレットでsearchGPTを使うことができます．

:::note warn
2025/02/03 追記
searchGPTのurlが`https://searchgpt.com/?q=%s`に変更されていました。
`https://chatgpt.com/?q=%s`で検索を行うと単純なchatGPTへの質問ができます。
:::

arcのコマンドパレットでサイト内検索を使う方法は以下の記事を参考にしてください．

https://qiita.com/soranjiro/items/c8c94649523531b0a053


こんな感じで設定すると楽かもしれません．

名前：searchGPT
ショートカット：searchGPT.com
URL：https://searchgpt.com/?q=%s

![site search setting](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670528/c6944f77-ab15-ca91-2a3c-5b480fb2d305.png)

:::note warn
spotify検索を使っている人は，はじめの`s`の文字だけだと競合が起きる（どちらかが優先されてしまう）ので，spotify検索を無効にするか，searchGPTのショートカットを変更してください．
:::

## まとめ

デフォルトにするには時間が少しかかるのもあるので，ショートカットで呼び出せるくらいがちょうどいいかもしれませんね．
tmuxコマンド一覧（メモ）〜セッション, ウィンドウ〜

# セッション

#### アタッチ

```
tmux a -t セッション名
```

#### デタッチ

```
[Prefix] d
```

#### セッションを新規作成する

```
tmux new -s セッション名
```

#### セッション一覧を確認する

```
tmux ls
```

または

```
tmux list-sessions
```

または、tmuxセッション内にいる場合

```
[Prefix] s
```

#### セッション名を変更する

```
tmux rename-session -t 旧セッション名 新セッション名
```

または、tmuxセッション内にいる場合（但し、現在のセッションのみ変更可）

```
[Prefix] $
```

#### 特定のセッションを削除する

```
tmux kill-session -t セッション名
```

または、tmuxセッション内にいる場合（但し、現在のセッションのみ削除可）

```
exit
```

すべてのセッションを削除

```
tmux kill-server
```

#### セッションの保存

```
[Prefix] Ctrl + s
```

# ウィンドウ

#### ウィンドウを新規作成する

```
[Prefix] c
```

#### 特定のウィンドウ名を変更する

```
[Prefix] ,
```

#### 特定のウィンドウ番号を変更する

```
tmux move-window -s 元の番号 -t 新しい番号
```

または、tmuxセッション内にいる場合（但し、現在のセッションのみ変更可）

```
[Prefix] .
```

#### 特定のウィンドウを削除する

```
tmux kill-window -t ウィンドウ番号
```

または、tmuxセッション内にいる場合（但し、現在のセッションのみ削除可）

```
[Prefix] &
```
【C言語】定数と列挙体(enum)

## 定数
- 用途
プログラム内で頻繫に使用される**マジックナンバーを、
あらかじめ定義した内容に置換する**

※**マジックナンバー**
ソースコードに直に記述された数値で、
その意図や意味が書いた人にしかわからない数字のこと 

### マクロ定義(非推奨)
**用途 : コンパイル時の前処理として、マクロ名で指定した文字列を定数や式で置き換える**

- 定義
```C
#define マクロ名 値 または 式
```

- 注意点
``` C:example.c
#include <stdio.h>

#define ONE 1
#define TWO 2
#define ONE_PLUS_TWO ONE + TWO

int main(void)
{
    // ONE(1) + TWO(2) * 4を出力する
    printf("%d\n", ONE_PLUS_TWO * 4);
    
    // 4 * ONE(1) + TWO(2)を出力する
    printf("%d\n", 4 * ONE_PLUS_TWO);

    return 0;
}
```
以上のように、内容が置換されるだけで、計算結果が定義されているわけではない。
結果を返したい場合は、
```C
#define マクロ名 (値) または (式)
```
で計算の優先順位を上げる。

### const定数
**用途 : コンパイル時に宣言した値を書き換えることができなくする**
- 宣言
```C
const 型　変数名 = 値;
```

### constexpr定数(C++11以上)
**用途 : コンパイル時に宣言した値を書き換えることができなくする**
`constとの違い : 柔軟性の向上`
- 宣言
```C++
constexpr 型　変数名 = 値;
```

### readonly定数(C#)
**用途 : インスタンスの初期化時に宣言した値を書き換えることができなくする**
`constとの違い : バージョニング問題の回避、柔軟性の向上`
- 宣言
```C#
readonly 型　変数名 = 値;
```

## フローチャート
**列挙体**を効果的に活用するためには、`プログラムの流れを可視化`し、
**ロジックを整理する能力**が求められます。
そこで、列挙型を学ぶ前に、フローチャートを簡易的に解説します。

例)カップラーメンをつくる
※□は次へ進む、△は条件であり、達成されたら次へ進む

□カップラーメンを用意する
□ケトルに水を入れる
□湯を沸かす
□蓋を半分までめくり、かやくを入れる
□沸いた湯を入れる
△湯を入れた時間>3分
完成

## 列挙体
**用途 : 複数の異なる定数を一つの集合として定義する**
### enum
- 宣言
```C
enum 列挙体名
{
    列挙定数1,
    列挙定数2,
    .
    .
    .
};
列挙体名　変数名;
```
列挙定数には0から自動的に数字が割り振られる。
- 値を特別に変更したい場合
```C
列挙定数 = 数字,
```

- 列挙定数の取り出し
```C
変数名.列挙定数1
```
※列挙体の中(メンバ)を指定する場合、
　繋ぐために.(ドット)を用いる

#### 命名規則
列挙体名は**アッパーキャメルケース**が推奨される。
また、列挙定数は**全て大文字**が推奨。
※アッパーキャメルケース
　単語の先頭を大文字にしてつなげる表記方法（**キャメルケース**）の分類のひとつ。
　**最初の文字を大文字**にしたキャメルケースのこと。

### enum class(C++11以上)
`enumとの違い : 変数をint型の変数に代入しても「暗黙的な型変換」が行われなくなった`
```C++
enum class 列挙体名
{
    列挙定数1,
    列挙定数2,
    .
    .
    .
};
列挙体名　変数名;
```

## switch文
- int型で管理する場合
```C:example_i.c
#include <stdio.h>

int main(void)
{
    int tmp = 数字;
    switch(tmp)
    {
    case 0:
        処理
        break;
    case 1:
        処理
        break;
        .
        .
        .
    default: // ≒条件分岐のelse(書かなくても良い)
        処理
        break;
    }

    return 0;
}
```

- 列挙体(enum)で管理する場合
```C:example_enum.c
#include <stdio.h>

int main(void)
{
    // 列挙体の宣言
    enum Week
    {
        SUNDAY,    // 日曜日
        MONDAY,    // 月曜日
        TUESDAY,   // 火曜日
        WEDNESDAY, // 水曜日
        THURSDAY,  // 木曜日
        FRIDAY,    // 金曜日
        SATURDAY,  // 土曜日
        NONE,      // 未設定
    };
    Week week;

    week = 列挙定数のどれか;
    switch(week)
    {
    case SUNDAY:
        printf("日曜日\n");
        break;
    case MONDAY:
        printf("月曜日\n");
        break;
    case TUESDAY:
        printf("火曜日\n");
        break;
    case WEDNESDAY:
        printf("水曜日\n");
        break;
    case THURSDAY:
        printf("木曜日\n");
        break;
    case FRIDAY:
        printf("金曜日\n");
        break;
    case SATURDAY:
        printf("土曜日\n");
        break;
    default:
        printf("未設定です\n");
        break;
    }

    return 0;
}
【基本情報】DHCPサーバーとは

## DHCPサーバーとは
### DHCP(Dynamic Host Configuration Protocol)とは
* ネットワーク接続に必要な設定を自動化するプロトコル
* 1つの端末(DCHPサーバー)に必要な設定を行い、個々の端末はDHCPサーバーから、必要な設定を自動的に入手して接続ができる
* IPアドレス・サブネットマスク・デフォルトゲートウェイ・DNSサーバーのアドレスなどの配信が可能

### DHCPサーバーとは
* IPアドレスなどのネットワーク接続に必要な情報(設定)を個々に送信するサーバー
    * DHCPサーバーから設定を受け取る端末はDHCPクライアント
#### 基本的な設定方法
1. クライアントに割り当てるIPアドレスを設定
1. リース時間の設定
    * クライアントにIPアドレスを割り当てる時間(リソース時間)を設定
3. ルータのIPアドレスを設定
3. DNSサーバーのIPアドレスを設定
3. 設定を保存
SpringBootにおけるコントローラからの画面遷移（超基本）

# 概要
表題の件について、基本がわかっていなかったので、まとめてみました。

# 前提条件
コントローラのクラスに`@Requestmapping("/home")`を設定、`doGet()`メソッドに`@Getmapping("/foo")`を設定している場合に、`return "記述部分";`の記述部分に何を書くかという前提条件です。

# パスのみ記述した場合
例えば、`home/foo`と記述した場合、それをビュー名として解釈し、ビューリゾルバによって適切なビュー（Thymeleafであれば、resources/templatesフォルダの中のhome/foo.html）を探してレンダリングします。ビューリゾルバは、ビュー名をどのように解釈するかを設定ファイルやビューテンプレートエンジンに基づいて判断します。

# forward:パスと記述した場合
現在のリクエストが/homeであり、`forward:home/foo`を指定した場合、Springはこれを相対パスとして解釈し、/home/home/fooのように/homeを基準に相対的に解決することになります。

# redirect:パスと記述した場合
リダイレクトは、ブラウザに新しいリクエストを発行させるため、完全なURLとして解釈されます。
redirectで遷移する場合、最初の/をつけることで、アプリケーションのルートパスを基準にリダイレクトが解釈されます。もし最初に/がないと、現在のパスを基準にリダイレクトが行われ、意図しない遷移が発生する可能性があります。