OmniAICreator/Qiita-1.07M huggingface dataset:
ラズパイでプリンタサーバを作ってみました！（一応プリントスプーラの脆弱性パッチに対応したつもり）

# はじめに
WindowsからBrowser製プリンタHL-2365DW（以降、プリンタ）を用いた印刷をする際に、うまくいかないときがあるため、ラズパイでプリンタサーバ（cups）を建ててみました。本記事に簡単にその記録を残すことにします。

# Who am i ?
しがないエンジニアです。Qiitaには主にセキュリティ系の資格について書くことが多いです。

# この記事の想定読者
特になし

# 本題

既存の我が家のネットワークはこんな感じ（端末とプリンタ間）です。
```
端末（Windows、Linux、Mac）⇔Router⇔プリンタ
```

プリンタサーバは大体こんな感じで配置します。ちょっと文字列だけなのでわかりにくいですが、プリンタサーバを同一セグメント内に配置して、端末からの印刷はプリンターサーバが代理するようにしました。前述した通り、プリンタサーバはラズパイ上にcupsを使用して建てています。
ただし、ファームウェアのアップデートなどでメンテナンス用のLANは残しました。

```
プリンタサーバ経由の通信経路：
端末（Windows、Linux、Mac）⇔Router⇔プリンタサーバ⇔プリンタ

メンテナンス（ファームウェアアップデートや設定変更等）用の通信経路：
端末（Windows、Linux、Mac）⇔Router⇔プリンタ
```

Windows側のプリントスプーラ脆弱性修正パッチの影響なのか、Windows側からプリンタへの印刷がうまくいかないときがあります。Windows側でプリンタセットアップした直後は正常に印刷できるのですが、WindowsUpdateした後などではうまく印刷できなくなってしまいます。なおLinuxやMacからは正常に印刷できます。WindowsはWindows10とWindows11を使用しており、この記事を書いている2023年8月ではパッチについて最新の状態です。

Windowsからプリンタサーバ経由で印刷をさせるように設定してから、特に印刷できなくなるという事象は起こっていません。20年近く前の古いプリンタなどでも効果ありかもしれません。

# 使用したラズパイ

今回、プリンタサーバを建てるために使用したラズパイは以下になります。

https://www.iodata.jp/product/pc/raspberrypi/ud-rp3/spec.htm

やってませんが、ラズパイゼロなんかでも似たようなことができるはずです。

# ラズパイの設定（cups)

OSのインストールは事前に行っていると仮定して話を進めます。
以下rootユーザで編集します。
```
$ sudo su -
```

cups入っていない可能性を考慮して、念のためインストール。
```
# apt update
# apt upgrade
# apt install cups
```
IPアドレスの固定
作業しにくいので、IPアドレスを固定します。事前に「ip a」コマンドでIPどのネットワークインターフェースにIPアドレスが紐づいているか確認しておく。

```
# vi /etc/dhcpcd.conf
```

以下を追記します。
```
interface XXX
static ip_address=XXX
static routers=XXX
static domain_name_servers=XXX
```

cupsの設定ファイルを編集します。
```
# vi /etc/cups/cupsd.conf
```

シャープ記号のコメントで記載している、直後の部分を編集する。
```
# Only listen for connections from the local machine. 

#change Listen <ip>:631
Listen localhost:631 

Listen /var/run/cups/cups.sock 

# Restrict access to the server…
<Location />
Order allow,deny

#add Allow all
Allow all
</Location>

# Restrict access to the admin pages…
<Location /admin>
Order allow,deny

#add Allow all
Allow all
</Location>
```

再起動しておく。
```
# systemctl enable cups
# reboot
```

ウェブブラウザからcupsのサービスにアクセスし、プリンタの登録をする。

```
http://<IP>:631
```
わりと直感的に操作可能です。

上記の設定については以下のサイトを参考にさせて頂きました。

https://mugeek.hatenablog.com/entry/2019/05/27/230256

https://deviceplus.jp/raspberrypi/raspberrypi_entry_011/

http://ckenko25.jp/2018/04/ubuntu-16-04-cups

# 最後に
セキュリティパッチをあてることは大切ですが、パッチが原因で動作しなくなるリスクも考える必要があると思います。パッチマネジメントは難しいですね！
【VSCode】Notebookにおいてライブラリの中身まで入ってデバッグする方法

## はじめに

VSCode上のNotebook（.ipynbファイル）ではデバッグが可能となっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194534/646df7b8-bf9e-d18d-1301-988ba0be4881.png)

ただデフォルトの設定だと、ライブラリの中身までデバッグができない。

## ライブラリの中身まで入ってデバッグする方法

`.vscode\settings.json`に以下の内容を追加する。

```.vscode\settings.json
{
    "jupyter.debugJustMyCode": false,
}
```

## 余談

この設定でデバッグすると、ただソースコードを読むよりもライブラリの挙動を理解しやすい。
なので「このメソッドの実装どうなっているんだろう？」というときなどに便利。
本来のデバッグ機能の用途ではない気がするけど。
`Actor`と`Sendable`の違い (Swift)

# `Actor`と`Sendable`の違い (Swift)

`Swift`に限らず参照型が保持する内部データに対して、複数スレッドによるアクセスはデータ競合が起こり得ます。`Swift`では、参照型の内部データに対するアクセスは同時に一つのみにするために導入したのが`Actor`です。`Class`と同じ参照型ですが、この点が違います。

これは`Actor`内部のデータに対しては、データ競合が起きないだけです。`Actor`のメソッドの引数や戻り値が、thread-safeでない場合はデータ競合が起こり得ます。その問題を解決するために導入したのが、`Sendable`です。

実際に、`swift-evolution`の`Actor`と`Sendable`のproposalを見てましょう。

https://github.com/apple/swift-evolution

## [`Sendable`のproposal](https://github.com/apple/swift-evolution/blob/main/proposals/0302-concurrent-value-and-concurrent-closures.md)

>This proposal describes an approach to address one of the challenging problems in this space — how to type check value passing between structured concurrency constructs and actors messages. 

## [`Actor`のproposal](https://github.com/apple/swift-evolution/blob/main/proposals/0306-actors.md)

>This proposal introduces actors into Swift. An actor is a reference type that protects access to its mutable state, and is introduced with the keyword actor:

## 参考

https://github.com/apple/swift-evolution/blob/main/proposals/0302-concurrent-value-and-concurrent-closures.md

https://github.com/apple/swift-evolution/blob/main/proposals/0306-actors.md
Crystalで多次元配列を作る

## 概要

ABC317(ゲームフリーク Programming Contest 2023）のF問題で多次元配列が必要な問題が出題されました。特に工夫せずにやると7次元配列が必要です。

https://atcoder.jp/contests/abc317/tasks/abc317_f

Crystal言語で配列の作り方はRubyと基本は同じです。2~3次元だとその場で書いてしまいますが、4次元を超えてくると辛いのでmacroを制作したので紹介します。

## 基本

Crystalの普通の１次元配列は
```crystal
ar = Array(Int64).new(n, 0i64)
```
が基本です。ただ、型推論が効くので、
```crystal
ar = Array.new(n, 0i64)
```
のように型を省略しても良いです

２次元の場合は、
```crystal
ar = Array.new(n1) {Array.new(n2, 0) }
または、
ar = Array.new(n1) {Array.new(n2) { 0 } }
```
です。２つ目の配列をブロックにせずに
```crystal
# これは間違いです！
ar = Array.new(n1, Array.new(n2, 0) )
```
と書いてしまうと、大変なバグになるのはRubyと同じです。

参考：
https://qiita.com/konchan_exbaka/items/46fde0869d3d5ec7d365

以上を踏まえると３次元は
```Crystal
ar = Array.new(n1) {Array.new(n2) { Array.new(n3) {0} } }
```
という感じです。４次元以上は明らかですね

## 多次元配列作成macro

Crystalにはmacroという仕組みがあり、コンパイル前にコードを展開してくれる方法があります。

https://ja.crystal-lang.org/reference/syntax_and_semantics/macros/index.html

これがかなり高機能で、ifやforなど基本的なプログラミングができます。そこで、多次元配列を生成するmacroを作ってみました。

```crystal
macro make_array(initial, *a)
  {% for i in 0...a.size %}
    Array.new({{a[i]}}) {
  {% end %}
    {{initial}}
  {% for i in 0...a.size %}
    }
  {% end %}
end
```

使い方は
```crystal
ar = make_array(初期値, １つ目の次元の大きさ, 2つ目の次元の大きさ, ...)
```
という感じです。型は初期値の型で決まるので注意してください。

例えば
```crystal
ar = make_array(0, 2, 3, 4)
```
とすると、型は１つ目の0のInt32で初期値が0で2×3×4の３次元配列が作れます

## まとめ

４次元以上の配列を作ることは滅多にないですが、たまに作るときに役立つと思います。何かの役に立てば幸いです。
【React】DBを使用しないデータ永続化

### はじめに

ReactでDBを使用せずにデータの永続化を実現する方法を調べてまとめました。

### LocalStrageを使用したデータ永続化

今回は、JavaScriptでブラウザにデータを記録するweb APIである[localStrage](https://developer.mozilla.org/ja/docs/Web/API/Window/localStorage)を使用して実現します。

localStrageでは、主要なブラウザであれば5MBまでデータを永続的に保存できますが、

「クロスサイトスクリプティング（XSS）攻撃に対する脆弱性」などのセキュリティ上のリスクもあるため、個人情報などの機密情報の取り扱いには注意が必要です。

### 実装方法

**Todoアプリ**でのデータ永続化の実装例を挙げます。

下記コードは、LocalStrageでのデータ永続化を実装したTodoアプリのカスタムフック**useTodo.js**です。

```jsx
import { useState, useEffect } from "react";

// LocalStrageに保存されたtodoが0件の場合に表示する初期todo
const DEFAULT_TODO = [
  { id: 1, todoTitle: "ジムに行く" },
  { id: 2, todoTitle: "植物の水やり" },
  { id: 3, todoTitle: "部屋の掃除" },
];

// LocalStrageのtodo取得
// 取得件数が0件の場合はDEFAULT_TODOを表示対象とする
const STORED_TODO = localStorage.getItem("todo");
const INITIAL_TODO = STORED_TODO
  ? JSON.parse(STORED_TODO).length === 0
    ? DEFAULT_TODO
    : JSON.parse(STORED_TODO)
  : DEFAULT_TODO;

export const useTodo = () => {
	// INITIAL_TODOを最初に表示する
  const [todo, setTodo] = useState(() => ６７INITIAL_TODO);
  const [inputValue, setInputValue] = useState("");
  const [idCounter, setIdCounter] = useState(todo.length + 1);

  useEffect(() => {
		// todoステートが更新されるたびにその内容をLocalStrageに保存する
    localStorage.setItem("todo", JSON.stringify(todo));
  }, [todo]);

	// todoの追加処理
  const addTodo = () => {
    setIdCounter(idCounter + 1);
    const newTodo = {
      id: idCounter,
      todoTitle: inputValue,
    };
    setTodo([...todo, newTodo]);
    setInputValue("");
  };

	// todoの削除処理
  const deleteTodo = (id) => {
    const newTodoList = [...todo].filter((item) => item.id !== id);
    setTodo(newTodoList);
  };

  return [todo, inputValue, setInputValue, addTodo, deleteTodo];
};
```

LocalStrageを使用している箇所に絞って説明します。

まずtodoステートの初期値にセットしている定数INITIAL_TODOには、最初にLocalStrageから取得した値をセットしています。

```jsx
// LocalStrageのtodo取得
// 取得件数が0件の場合はDEFAULT_TODOを表示対象とする
const STORED_TODO = localStorage.getItem("todo");
const INITIAL_TODO = STORED_TODO
  ? JSON.parse(STORED_TODO).length === 0
    ? DEFAULT_TODO
    : JSON.parse(STORED_TODO)
  : DEFAULT_TODO;
```

この時、LocalStrageにtodoというキーが存在しない場合、またはLocalStrageから取得したtodoに何も入っていない(todo配列の要素数が0)の場合は、下記DEFAULT_TODOをINITIAL_TODOにセットするようにしています。

```jsx
// LocalStrageに保存されたtodoが0件の場合に表示する初期todo
const DEFAULT_TODO = [
  { id: 1, todoTitle: "ジムに行く" },
  { id: 2, todoTitle: "植物の水やり" },
  { id: 3, todoTitle: "部屋の掃除" },
];
```

useEffectを使用して、todoステートの値が変わるたび(todoが追加/削除されるたび)にLocalStrageに最新のtodoをLocalStrageに保存しています。

```jsx
  useEffect(() => {
		// todoステートが更新されるたびにその内容をLocalStrageに保存する
    localStorage.setItem("todo", JSON.stringify(todo));
  }, [todo]);
```

これで、画面を再読み込みしても、追加したtodoが消えずに表示されるようになりました！

### 参考サイト

[mdn web docs: Window.localStorage](https://developer.mozilla.org/ja/docs/Web/API/Window/localStorage)
[Local Storageを使ってみる](https://qiita.com/masuda-sankosc/items/cff6131efd6e1b5138e6)
[useState と localStorage で永続化する方法](https://zenn.dev/ignorant_kenji/articles/7348a0811c479f)
[localStorageがセキュリティ面で使わない方がよいと言われる理由](https://hoshino-wp.com/risks-of-localstorage-security/)
VsCodeでJavaScript をデバッグする時のlaunch.jsonの設定

### 前提
こちらの拡張機能のインストールが必要です
※今までvscodeの標準機能だと思ってました。　2023/12/17 追記

https://marketplace.visualstudio.com/items?itemName=ms-vscode.live-server


```json-doc:launch.json
{
  // IntelliSense を使用して利用可能な属性を学べます。
  // 既存の属性の説明をホバーして表示します。
  // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "type": "chrome",
      "request": "launch",
      "name": "作業中のhtmlファイルを開く", //任意の名前（実行とデバッグに表示される名称）
      //http://127.0.0.1:3000の部分は下記参照
      "url": "http://127.0.0.1:3000/${fileBasename}" //カレントのhtmlファイルを開く
    }
  ]
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/e2671695-546a-54c1-2983-b8d6bbb5234e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/d2096813-ef14-4f79-29fd-1c4564e79099.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/3330cc89-b536-42ab-5250-7efa4dbe6e79.png)
ExcelVBAをUiPathから動かす際にトラブルが生じやすいケースとは？

# 趣旨

　今回、ExcelVBAをUiPathから呼び出す際に止まりやすいと感じるケースをいくつかあげたいと思います。

　そのケースは主に以下の３つのケースかな？と思います。
１，VBAでポップアップが出てきてUiPathでボタンを押下させるもの
２，VBAがある画面に対して「sendkeys」を実行するもの
３，Excelのマクロブックを開く際に自動でマクロが走るもの

# １，VBAでポップアップが出てきてUiPathでボタンを押下させるもの

　このケースは、VBAマクロで「MsgBox」を使用しているものです。
　この「MsgBox」で出てきたポップアップのボタンを押下する際に「並列処理」を使うことが多いですが、その時にそのポップアップのボタンが引っかからないもしくはボタンは押下されているものの押し方が微妙で次に進まないなどの事象が考えられます。

# ２，VBAがある画面に対して「sendkeys」を実行するもの

　「sendkeys」の対象画面は常に「active」でないと反応しないためUiPathで別の画面がアクティブ化していると誤動作が発生してしまいます。

# ３，Excelのマクロブックを開く際に自動でマクロが走るもの

　これは、Excelマクロブックに「auto_open」マクロが入っている場合マクロが走っている間にUiPathから次の命令が飛ぶためExcelからエラーを出てきてその後UiPathも止まる流れです。

　Excelアプリケーションスコープで実行部分の最初に待機アクティビティを入れるか外部にVBSマクロを走らせて、そのマクロに「DisplayAlert」※を操作する部分を入れるかどちらかが対応策になるのではと思います。

※DisplayAlert
　VBAマクロで、Excelから出てくるアラームの表示を行うかどうかの変数です。
・True→アラーム表示
・False→アラーム非表示

以上、ご参照までに。
【ChatGPT無】7R（簡易）で、長話を短くするには、と聞いてみた

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　どうも、カーブミラーです。

　今回は、
　　下記の動画を見て、
　　　ちょっと思ったことです。

　この番組は、
　　いろんな話が聞けるので、
　　　いつも楽しみなのですが。

　YouTuber動画（2020/11/30）
　『西崎康平 ブラックな社長』
[【簡単】話し下手でもすぐに伝わる会話術を教えます。](https://youtube.com/watch?v=GHoBpVrpZlI&si=FbAb9L-IcjVUpUnM)

　動画では、
　　以下のことが
　　　語られました。
　　　　まぁ、抜けもあるかと
　　　　　思いますけどね。
***
　話が長い人がどうすれば短くなる？
　・結論から話す。
　・句点を多めにつける。
　　、を。にしていく。
　　　コンパクトにすると人に伝わる
　・箇条書きもGood！
　・語尾に気を遣う（言い切る）

　テクニックよりも実践
　「喋ることに慣れる」
　「喋る量を増やす」
　「聞く時間を増やす」
　「相手を笑顔にする」
　「名前の呼び方を大事にする」

　中身がなくなるのが怖いので、
　・興味を持って話す
　・会話を楽しんだ方がいい

　できるだけその場を楽しもう、
　　って自分から望む意識は
　　　変わってきた
***
　これを聞いて、
　　ならば、ChatGPTさんは、
　　　どんな助言をくれるのか、
　　　　知りたくなりました。

　まずは、
　　Promptです。
```Text:長話を短くするにはPrompt
# Request（依頼）
話が長い人が、話を短くするには、どうすればいいか？

# Role（役割）
あなたは、優秀な{誰々}です。

# Regulation（形式）
ポイントを箇条書きで。

# Rule（ルール）
・特になし

# Review & Refine（評価・改善）
なし

# Reference（参照知識・例）
なし

# Run Scenario（シナリオ）
なし
```
　{誰々}は、
　　三つ当てはめてみました。

　経営者と科学者と精神科医です。

　まずは、
　　経営者です。
```Text:長話を短くするには、の経営者
長い話を短くするためのポイント：

1. 要点を絞る: 本質的な情報だけに絞り込み、余計な詳細を省く。
2. 簡潔な表現: 短い文や単語を選んで情報を伝える。
3. 構造を整理: ロジカルな順序で話を進め、論理的な流れを保つ。
4. 例を用いる: 複雑なアイデアを具体的な例で説明することで、理解しやすくなる。
5. 読者の関心に合わせる: 相手の興味やニーズに合わせて情報を選ぶ。

これらのポイントを意識して話を整理すれば、効果的に話を短くまとめることができます。
```
　次に、
　　科学者です。
```Text:長話を短くするには、の科学者
長い話を短くするためには次のポイントがあります：

- 要点を押さえる：主要なアイディアや情報を絞り込みましょう。
- 冗長な表現を省く：同じ意味を持つ言葉やフレーズを削除してシンプルにします。
- 簡潔な表現を選ぶ：単語やフレーズを選ぶ際に、できるだけ簡潔なものを選んでください。
- 具体的な例を使用する：抽象的な概念を具体的な例で説明することで、理解が容易になります。

これらのポイントを考慮することで、長い話を効果的に短くまとめることができます。
```
　次に、
　　精神科医です。
```Text:長話を短くするには、の精神科医
長い話を短くするための方法について、ポイントを箇条書きで説明します：

- 要点を絞る: 本質的な情報だけを伝えるように意識しましょう。
- シンプルな言葉を選ぶ: 難しい言葉や専門用語を避け、分かりやすい言葉を使います。
- 話の流れを整理する: ロジカルな順序で話を進めることで、聞き手がついていきやすくなります。
- 肯定的な言葉を強調する: 否定的な要素よりも肯定的な要素を強調することで、話が明るく短くなります。
- 余計な詳細を省く: 聞き手にとって不必要な詳細や補足を省くことで、話がスッキリします。
- 視覚的な手助けを活用する: グラフや図を使って情報を補完することで、言葉数を減らしつつ伝えることができます。

これらのポイントを意識することで、長い話を短くまとめることができます。
```
***
　箇条書きの出力が違いますが、
　　そこまでの指定をしていない
　　　ので、誤差の範囲ですねw

　内容を読むと、
　　基本は同じですけど、
　　　精神科医の方がいいのかな。
***
　私もちょっと話が長くなる
　　傾向があるので、
　　　西崎さんの話は、
　　　　参考になりました。

　おそらく、
　　ChatGPTさんも
　　　もっと限定してやれば、
　　　　よりいい回答を
　　　　　してくれるはず。

　以上。
***
『7Rプロンプトに
　　関して、書いた記事』

　最初の記事。
[【ChatGPT】野口竜司氏提示、7Rプロンプト](https://qiita.com/kabumira/items/77bcfeac699673d99c09)

　次の記事。
[【ChatGPT無】深津式→7Rに書き直す](https://qiita.com/kabumira/items/83a6999b21e9484016ea)

　次の記事。
[【ChatGPT無】7R（簡易プロンプト）を簡単な指示と比較した](https://qiita.com/kabumira/items/a4cd4ec25a7cefbb95c7)

　次の記事。
[【ChatGPT無】7Rプロンプトで、ワードミキサーPrompt。](https://qiita.com/kabumira/items/67928a476c259de7701a)

　次の記事。（この記事）
[【ChatGPT無】7R（簡易）で、長話を短くするには、と聞いてみた](https://qiita.com/kabumira/items/8d807cda0ca5ff1dea25)
***
Railsのコントローラ名を正しい複数形にしないとどうなるか？

## はじめに
kekiと申します。

Railsでコントローラの名前を入力する際、「正しい複数形にしなかった場合どうなるのか？」と素朴な疑問が湧いたので調べてみました。
結論としては「**動くが、手動で書く項目が増えてしまいデメリットしかない**」となりました。

解決には下記の質問、ならびに公式ガイドを参考にさせていただきました。

[【Rails】Controllerの命名規則について](https://teratail.com/questions/211338)

[コントローラの命名規約(公式ガイド)](https://railsguides.jp/action_controller_overview.html#%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%81%AE%E5%91%BD%E5%90%8D%E8%A6%8F%E5%89%87)

## 検証
propertyというモデルに対し、propertysという誤表記でコントローラ名を登録した時の挙動を調べました（正しい複数形はproperties）。
コントローラは最低限new, create, indexのみ用意し、それぞれのアクションが動くのかをチェックしていきます。
Rubyのバージョンは3.0.1、Railsは6.0.3を使用しています。

### 1. ルーティングは通るか
まずルーティングでresources設定した時通るか？と疑問でしたが、ここは誤表記の方でちゃんとパスが生成されていました。
![スクリーンショット 2023-08-25 18.59.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729110/a332f535-27d2-ce72-6a65-73e8a4a068c2.png)
作成直後のビューファイルがほぼ何も書かれていないindex, new画面は問題なく起動していたので、少なくともresources上のパスが合っていれば誤表記でも動くことがわかりました。

### 2. new.html.erbが見れるか
さて、では`form_with`を含んだnew画面に変更するとどうなるか？というと、**途端にエラーを吐きます**。
![スクリーンショット 2023-08-25 19.06.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729110/0d2380e6-b2d5-e0bc-3c7e-80db4e098dfb.png)

エラー文をよく見てみると、二行目に"undefined method 'properties_path' for..."と書かれています。ルーティングには記載してない**正しい複数形**です。
この時form_with内の記述は以下のようになっていました。
```
<% form_with(model: @property, local: true) do |form| %>
    <%= form.text_field :string %>
    (略)
    <% form.submit %>
<% end%>
```
`form_with`を追加した直後にエラーが出たので、**推察するに`form_with`の送信先パスはmodel内の単数系を参考に、自動的に正しい複数形のパスを想定しているのでは**と考えました。ところが今回は実際のルーティングは'propertys_path'と誤表記のためにエラーが起きているのではないでしょうか。

### 3. form_withのパスを手動変更するとどうなるか
「では手動で'propertys_path'と誤表記のパスを指定してあげるとどうなるか」とパスを追記したところ、**今度はnew画面もその後のcreateもうまくいきました**。
```
<% form_with(model: @property, local: true, url: propertys_path) do |form| %>
    <%= form.text_field :string %>
    (略)
    <% form.submit %>
<% end%>
```
うまく行った時のログは以下のとおりです。
![スクリーンショット 2023-08-27 11.23.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729110/2dae8d07-5b0f-46ec-c643-a16187a81ba1.png)
きちんと（？）誤表記のpropertys_pathを通してPOSTされ、index画面に飛んでいるのが確認できました。

というわけで手動で強引にurlを指示してあげると誤表記のコントローラでも起動することがわかりました。わかりましたが、このようにデフォルトで単数系→複数形の変換を自動で行ってくれるヘルパーメソッドなどを全て手動で修正する必要があるので、はっきり言って**手間しかありません**。

### 4. 複数形が特殊なモデル名をscaffoldするとどうなるか
最後に、複数形が特殊な英単語、例えばnew, man, waterなどですね。これらでscaffoldした場合のコントローラ名はどうなるのか？という疑問で締めたいと思います。

試しにmanでscaffoldしてみました。
![スクリーンショット 2023-08-25 19.19.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729110/d5feed08-3cae-cecf-845a-a129f4e947d9.png)
ちゃんと**複数形のmenで自動生成されている**ことがわかります。
ということは不加算名詞であるwaterもwater→waterとなりそうですね。

## まとめ
まとめますと、「**railsのコントローラの命名規則である複数形を使うことは守ることを推奨する**。理由はヘルパーメソッドやscaffoldなどで自動的に正しい複数形が用意・要求されるからである。守らない場合手動でパスを変更する必要があり、非常に手間である」とわかりました。

water, news, Japaneseのような不可算名詞はモデル名とコントローラ名が同じになることもわかったので、そう言った単語は選ばない方がいいのかもしれない、という気がします。しかし、これはまた別の機会に確認してみようと思います。

読んでくださりありがとうございました。
SharePoint Onlineに.aspxファイルをアップロードするときは、アップしたユーザーの権限に注意。

## はじめに
SharePoint OnlineにHTMLページをアップロードして公開する際、.aspxファイルのアップロードを許可する「カスタムスクリプトの有効化」を実行されるかと思います。

この「カスタムスクリプトの有効化」を実行してもなお、ぺージが開けずに.aspxファイルがダウンロードされてしまう・・・

そのような現象が起こった際に確認いただきたい **権限設定** に関するメモです。

## 対応策

.aspxファイルのアップロードユーザーの権限を **「デザイン」権限以上** にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781744/470d3144-4fc0-8c89-7ae0-daf460155efe.png)

正式なドキュメントが見つけられなかったのですが、色々調べているとこちらのpdfページに到達。発行元は(株)テンダさんです。

https://support.tepss.com/wp/wp-content/uploads/SharePoint%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AC%E3%83%BC%E3%83%88_%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E3%81%94%E6%A1%88%E5%86%85.pdf

資料に以下のような記載がありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781744/b4d261ad-cb9d-fe48-974b-4d1ea3e521fa.png)

> 成果物をアップロードしたユーザーは、"デザイン"もしくは"フルコントロール"権限を有しているか。


**「編集」権限では足りない** のですね。ここが盲点でした。

## 結論

SharePoint Onlineに.aspxファイルをアップロードするときは、
アップしたユーザーの権限が **「デザイン」権限もしくは「フルコントロール」権限** であることが必要。

カスタムスクリプトを有効化しても、ファイルの再アップロードを試しても、なぜか上手くいかない・・。そのような時は、今一度適切な権限付与がされているかの確認も実施してみてください。

## 【補足】.aspxファイルのアップロード方法
SharePoint Onlineに.aspxファイルをアップロードする方法については、以下の記事が非常に分かりやすかったです。

https://art-break.net/tech/?p=1972

こちらはMicrosoftのDocsです。

https://learn.microsoft.com/ja-jp/sharepoint/allow-or-prevent-custom-script#to-allow-custom-script-on-onedrive-or-user-created-sites
【React/Python】２年がかりで完成した個人開発サービスの話【ChatGPT】

個人開発でサービスを作り始めて、気がついたら２年も経っていました。
気軽な気持ちで作り始めたのですが、思いの外色々なことに手を出してしまったので、
利用した技術などをまとめてみます。


## 作ったもの
YouTubeのライブ配信風の画面に向かって話しかけると、
音声を認識してAIがスーパーチャットを送ってくれる、
その名も「**AIスパチャ**」です。

https://ai-super-chat.naniyon.com/

良かったら遊んでみてください。

## 作るきっかけ
YouTubeでひろゆき氏の配信を見ていた時に、

> 「私もひろゆきさんみたいに質問回答の配信をやってみたいです。
> けれどいざ配信をしてみても視聴者が少なく、質問なんて全くきません」

といった質問がありました。

確かに、ひろゆき氏のように、何千人も視聴者がいて、ガンガンとスパチャが送られてきたらそりゃ楽しいですが、
普通の人はまずスパチャなんて送られません。
そもそも実際にYouTubeライブをやることのハードルが高すぎます。

ということで、
誰でも気軽にYouTubeライブっぽいことができて、
ダミーでもいいからスパチャをもらえる体験ができたら面白いんじゃないかと思い、
このサービスを作ってみました。

https://www.youtube.com/@hirox246


## システム全容

フロントエンドはReact、バックエンドはPythonを使っています。

### React
YouTubeライブ風の画面を作っています。
内蔵カメラの起動や、画面共有ができるようになっています。
チャット欄とスーパーチャットの描画がやっかいでした。
また音声認識ライブラリで音声をテキスト化しAPIでPOSTする、といった実装もしています。

### Pyhton
APIで送られてきたテキストから、OpenAIのAPIに渡すプロンプトを作成。
返ってきた回答をフロントエンドに渡しています。

図にするとこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486548/3101d40b-4205-0aa5-2729-8912a89fef4b.png)


## 使ったもの
実際に使った技術の詳細です。

### 内蔵カメラ
MediaDevices.getUserMedia()メソッドを使用して、内蔵カメラを起動します。
これで顔出し配信ができるようになりました。
https://developer.mozilla.org/ja/docs/Web/API/MediaDevices/getUserMedia

![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486548/d49e4c18-c20e-cfc6-2c5c-c53a1998a320.png)


### 画面共有
MediaDevices.getDisplayMedia()を使うとディスプレイのキャプチャを表示することができます。
これでゲーム実況もできるし、ライブコーディングなんかもできますね。
https://developer.mozilla.org/ja/docs/Web/API/MediaDevices/getDisplayMedia

![test22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486548/5b8b3397-a66e-51e1-46a0-b74f38a68433.png)

### 音声認識
音声をテキストに変換する必要があるので、
react-speech-recognitionという音声認識ライブラリを使用しました。
とてもいい精度です。
https://www.npmjs.com/package/react-speech-recognition

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486548/ebfa12c4-c014-f1a6-f274-1a29a0848d3f.png)

### Flask
簡単なAPIを作るのに向いているとのことだったので、
バックエンドはPythonのFlaskフレームワークを使用しています。
https://flask.palletsprojects.com/en/2.3.x/

### OpenAI
生成AIの種類もだいぶ増えてきましたが、今回はOpenAIのAPIを使用しています。
この開発を始めた頃は、まだChatGPTなんてなくて、
とりあえずYouTubeライブ風の画面をReactで実装するところから始めました。

肝心の「AIがスパチャを送る」という機能をどうしようか…？
一から機械学習の勉強をするべきか…？

などと考えていたら、いつの間にかChatGPTなるサービスが生まれました。
そしてAPIも提供されたので、もうこのためにあるとしか考えられず、即座に導入しました。
https://openai.com/

### 終わりに
今回はざっくりとシステムの全容をまとめてみました。
また気が向いたら、実装の細かいところや、ハマったポイントなど記事にしていこうと思います。

気になることがあったらコメントで教えてください！
VyOSによるパケットロス、パケット遅延、FWの書式が変わった？

# 2023年8月以降のvyosのコマンド書式が異なっている？
以下環境でVyOSによるパケットロス、パケット遅延、ファイアウォール設定を試してみたが、参考文献の書式では書式エラーとなってしまう。

```shell
show version
Version:          VyOS 1.4-rolling-202308220020
Release train:    current
```

少なくともファイアウォールは"1.4-rolling-202308040557"で書式や考え方が変わってしまった模様。とりあえず動かしたときのメモを念のため共有する。

## パケットロス、パケット遅延のエミュレーション
当初参照していたページ
[VyOS でネットワーク遅延やロスを発生させるには-らくがきちょうv3 様](https://sig9.org/archives/754)
### パケットロス(VyOS 202307以前向けと思われる書式)
```
# set traffic-policy network-emulator LOSS-50 packet-loss 50
# set interfaces ethernet eth2 traffic-policy out LOSS-50
# commit
```

### パケット遅延(VyOS 202307以前向けと思われる書式)
```
# set traffic-policy network-emulator DELAY-100 network-delay 100
# set interfaces ethernet eth2 traffic-policy out DELAY-100
# commit
```

### パケットロス(VyOS 1.4-rolling-202308040557以降向けと思われる書式)
・traffic-policyがqosに変わった
・ingress/egressのうちegress(外向き)のみ設定可能
```
# set qos policy network-emulator LOSS-50   loss  50
# set qos interface eth2 egress DELAY-100
# commit
```

### パケット遅延(VyOS 1.4-rolling-202308040557以降向けと思われる書式)
・traffic-policyがqosに変わった
・ingress/egressのうちegress(外向き)のみ設定可能
```
# set qos policy network-emulator DELAY-100 delay 100
# set qos interface eth2 egress DELAY-100
# commit
```

### おまけ
・パケット遅延とパケットロスを同時に設定も可能
・以下には例示しないが、他にもcorruptやburstなんかもある
・詳細は参考文献（本家）を参考
```
# set qos policy network-emulator DELAY-100-loss50 delay 100
# set qos policy network-emulator DELAY-100-loss50 loss 50
# set qos interface eth2 egress DELAY-100-loss50
# commit
```

## ファイアウォールのエミュレーション
当初参照していたページ
[VyOSでFirewallを作ってみる- @nagano_m 様](https://qiita.com/nagano_m/items/f31f194f16a702545126)
### ファイアウォール設定(VyOS 202307以前向けと思われる書式)
・やりたいこと（PostgreSQLのみ許可したい）に向けて想定コマンドを改変（destination-portを5432/tcpを指定）
```
# set firewall name rule_eth1_in default-action drop
# set firewall name rule_eth1_in enable-default-log
# set firewall name rule_eth1_in rule 10 action accept
# set firewall name rule_eth1_in rule 10 source address 192.168.0.0/24
# set firewall name rule_eth1_in rule 10 destination address 192.168.10.0/24
# set firewall name rule_eth1_in rule 10 destination port '5432'
# set interface ethernet eth1 firewall in name rule_eth1_in
# commit
```


### ファイアウォール設定(VyOS 1.4-rolling-202308040557以降向けと思われる書式)
・set interface ethenetによるデバイスへの設定ができない模様
・vyosをL2スイッチ兼ファイアウォールとして動作させる場合は、 forward ルールとして設定が必要
・本来はネットワークグループやポートグループなど、用途をグループ化して設定する模様
・参考文献(Qiita記事)にあるような簡易的DOS攻撃の定義は未確認
・とりあえずポートフィルタリングのマネごとができればいいレベルでやった
・実際には参考文献(本家)を参照することを強く推奨

```
# set firewall ipv4 forward filter default-action drop
# set firewall ipv4 forward filter rule 10 source address 192.168.0.0/24
# set firewall ipv4 forward filter rule 10 destination address 192.168.10.0/24
# set firewall ipv4 forward filter rule 10 protocol tcp
# set firewall ipv4 forward filter rule 10 destination port '5432'
# set firewall ipv4 forward filter rule 10 action accept
# commit
```


## 参考文献(本家)
2023年8月27時点で参照した文献だが、以下ページはVyOS最新版(latest)を対象としている。
導入したVyOSのバージョンによっては本記事の書式がさらに変わる可能性もあることに注意したい。
[VyOS-TrafficPolicy](https://docs.vyos.io/en/latest/configuration/trafficpolicy/index.html)
[VyOS-Firewall](https://docs.vyos.io/en/latest/configuration/firewall/index.html)
plunkerでvue その56

# 概要
plunkerでvueやってみた。
vueファイルを使いたい。

# 参考にしたページ。

https://github.com/vikseriq/requirejs-vue


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/896aeb5d-8561-acf5-b529-fcdb66672594.png)

# サンプルコード

```
require({
  paths: {
    'Vue': 'https://unpkg.com/vue@2.5.11/dist/vue.min',
    'vue': 'https://unpkg.com/requirejs-vue@1.1.5/requirejs-vue'
  }
},
['Vue', 'vue'],
function(Vue, vue) {
  require(['vue!app'], function(theApp) {
    theApp.$mount('#app');
  });
});




```

# 成果物

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


以上。
ラズピコのもう一個のコアを使ってみた

# ラズピコのコードを書いててちょっと困ったことに

[ラズピコ](https://www.raspberrypi.com/products/raspberry-pi-pico/)でシリアル・バスを監視するコード書いてみてる．信号を入力したピンをポーリングで監視するようにしてるんだけど，まぁだいたい動いてる．しかし..

# CORE0だけで動かした場合

処理ループの中に下のようなコードを仕込んでバイタル・サインをピンに出力．これでCPUの動きを見てみる
```c
  pinMode(VITAL_OUTPUT_PIN, OUTPUT);

  int toggle = 0;
  int count = 0;
  while (1) {
    //  この場所で本来やらせる処理（入力ピンの監視とイベントの記録）をしてるのだけど省略

    if (!(count++ & 0xF))
      gpio_put(VITAL_OUTPUT_PIN, (toggle = !toggle));
  }
}
```
そうするとこんな感じなんだな．1msに十数マイクロ秒の隙間が空く．これのおかげで，この間のポーリングが止まってしまい取りこぼしがでる．
下の図のD2チャンネル(CORE0_vital_sign)で上記ピンの出力をみてるのだけど，トリガ後の0.05ms，さらに1.05ms付近に停止期間が見れる．
![core0_only.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/6213a420-c27c-1266-4700-99ecd1b932c8.png)


この隙間ができるのは，デフォルトで設定されてしまってる1ms毎のタイマー割り込みのせいみたい．試しに全部の割り込みを停止させてみた．割り込み停止は`save_and_disable_interrupts()`をコールする．（[ここ](https://forums.raspberrypi.com/viewtopic.php?p=1997773&sid=0c626f605cc31cefbd5156823098bcc0#p1997773)を参考にPico SDKのAPIコールを使ったのだけど，あとで試してみたらCMSISの`__disable_irq()`も使えた）

しかし問題が..
割り込みを禁止すると，開発環境から認識できなくなって，Arduino IDEからの実行コードの書き込みができず，シリアル出力も得られない ┐(´～｀)┌ 

# 問題回避をCORE1で

ラズピコってCPUコアが2個入ってる．しかしこれまで1個しか使ってこなかった．だってその必要がなかったから．
でもここにきて「ひょっとしてもう一個のコアも使えばいいんぢゃね？」って思って調べてみたら，なんか超簡単に使えるみたい．
マネして書いてみたらあっさりいごいた（´(ｪ)｀）

https://jhalfmoon.com/dbc/2021/11/22/%E9%B3%A5%E3%81%AA%E3%81%8D%E9%87%8C%E3%81%AE%E3%83%9E%E3%82%A4%E3%82%B3%E3%83%B3%E5%B1%8B147-%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4pico%E3%80%81c-csdk%E3%80%81%E3%83%9E%E3%83%AB%E3%83%81%E3%82%B3/

これまでの処理を`core1_main()`って関数にまとめ直して，下のようなコンパイルオプションを用意した．まず`#if 1`でこれまで通り動くか試してから，`#if 0`でCORE1での実行に変えてみる．
```
#if 0
  core1_main();
#else
  multicore_launch_core1(core1_main);
#endif
```
CORE0側のループにもバイタル・サイン出力を入れておいて，それぞれの状態を見たのがこれ↓↓ 
![core1_count_on_D2_and core0_count_on_D3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/e2d39de1-b11d-c9b4-fcbf-29fa3e638f9d.png)

CORE0の出力はD3(オレンジ：CORE0_vital_sign)に，CORE1出力はD2(赤：CORE1_vital_sign)に．
割り込みはCORE0には居るけどCORE1には影響してないのがわかる． 
CORE0はカウンタを回すだけのループなんで周波数が高い． 
CORE1は入力の監視をしてるのでその分だけ周波数は低く，信号状態の変化があるとそれを記録するための処理を行うので，さらに周波数が下がる． 

# まとめ

これまでは必要もないし，ややこしそうだから手を出してなかったマルチコア使用． 
あっけないほど簡単だった．

この例では処理を単純に別コアに移しただけなので，何もややこしいことは起こらなかった． 
ここまでできたら，メモリ共有とかをしながら結構遊べそうな気がするけど，先に「お作法」的なのを調べておかないといけないな．
.NET：基本知識のいろいろ(継続更新)

## 前書
* 個人勉強メモです。ご参考まで。

## .NET ダウンロード
* 「.NET Core」では 3.1 が最後のバージョンであり、その後は、「.NET」として名称を変更しリリースしたそうです。
* 製品開発では、.NETを使用することをお勧めします。（MS公式サイトの記載）

* .NET Core / .NET 最新版ダウンロード（MSの公式サイト）

https://dotnet.microsoft.com/en-us/download/dotnet

* .NET Framework 最新版ダウンロード（MSの公式サイト）

https://dotnet.microsoft.com/ja-jp/download/dotnet-framework

## IISにデプロイ手順
* 下記の記事で、詳しい手順がある。@YoshijiGatesありがとう。

https://qiita.com/YoshijiGates/items/3febee15d66aae028f09
Postman localhostにリクエストが送信できない

# 経緯
[こちらの記事](https://qiita.com/KNR109/items/7e094dba6bcf37ed73cf#openapi%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)でSwaggerとOpenAPIの勉強をしているときに発生した備忘録です。

`http://localhost:3001/users`にPostmanからリクエストを送信してもエラーになってしまう。

:::note 
Could not send request
Cloud Agent Error: Can not send requests to localhost. Select a different agent.

リクエストを送信できませんでした
クラウドエージェントエラー： localhost にリクエストを送信できません。別のエージェントを選択してください。
:::

🤔「エージェントって誰だよ」

# 解決策

画面下部の「Auto-select-agent」を選択して「Desktop-agent」を選択すると解決できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3351724/b5a00484-356e-6bf7-fe97-de4b51784037.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3351724/46652c3a-2ba2-1088-5fce-0f88c1398a82.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3351724/9af5cf6f-ad74-3117-e979-a6ac5f2f3fc7.png)
pip install ができないときは、python -m pip install が無難


以下、自分の場合にうまくいったことなので、１００％内容に信頼性があるか分かりませんが、ご参考まで。


パッケージをインストールしようと、
```
pip install XXXX
```

とすると、
こんなエラーが出る。
```
pyenv: pip: command not found
The `pip' command exists in these Python versions:
```


こんな場合は、以下でインストールするのが無難
```
python -m pip install XXXX
```


以上です。
デスクトップアイコンから一発で特定のディレクトリ＆conda環境のプロンプトを開く

![SS 192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png) パッと始まって気持ちよい

## やること
パイソンで作業をするとき、作業ディレクトリに移動してcondaなどの環境を開くのは面倒です。
そこで、デスクトップアイコンをダブルクリックしたら特定のconda環境とディレクトリが一発で開くようなショートカットを仕込んでみます。

## 作業環境

* Windows10 Home 22H2 (64bit x68ベース)
* conda-forge

## 方法

### STEP:1
まず、コマンドプロンプトを開いたときに移動を済ませていたいディレクトリに移動します。
フォルダを開いてもよいですし、コマンドプロンプトのCDで移動してもよいです。

### STEP:2
STEP:1で開いたディレクトリの中で、
[わかりやすいアイコン名].bat 
というファイルをVSCodeなどのエディタで作成します。
内容は下記のようにします。
ディレクトリパスはあくまで一例ですので、ご自身の環境でactivateなどのコマンドが入っているディレクトリを調べてください。（だいたい同じような場所だと思います）
おそらく、envでも同じようなことができると思います。

```clickopen.bat
@echo off
cd /d %1
call C:\Users\[username]\anaconda3\Scripts\activate.bat conda310
cmd
```

### STEP:3
できたファイルをダブルクリックして、狙い通りの動きになるか確かめます。
うまく動くようであれば、ファイルを右クリックして「送る」→「ショートカット」でデスクトップなどにショートカットを置きます。

完了です。

## 参考URL
https://a-zs.net/inuwaka-batch-01/

https://www.yutaka-note.com/entry/anaconda_bat
Googleサービスアカウントの秘密鍵を使用してPythonでJWTを生成


<br>
四苦八苦してやっと動いたものなので、責任は持てませんが、自分用メモおよび、もしかしたらご参考になるかもと思い掲載。


## やること

Googleサービスアカウントの秘密鍵を使用して1時間の有効期限を持つJWT（JSON Web Token）を生成します。


## Googleサービスアカウントの秘密鍵作成

- Google Cloud Platform Console のナビゲーション メニュー で、
APIs & Services > Credentials に移動

- 目的のプロジェクトを選択し、[Create Credentials > Service account] をクリック。

- Service account details で、新しいアカウントの名前を入力して [Create] をクリック。

- Service account permissions ページで、Select a role プルダウンに移動。
- [Service Accounts > Service Account Token Creator] を選択して、[Continue] をクリック。

- [Grant users access to this service account] ページで [Done] をクリック。

- APIs & Services > Credentials に戻り、
Service Accounts セクションまで下にスクロールして、作成したアカウントの名前をクリック。

- Service account details ページで、Keys セクションまでスクロールして Add Key > Create new key を選択。

- 鍵のタイプとして JSON を選択し、[Create] をクリック。


これで、秘密鍵を含む JSON ファイルがPCにダウンロードされる。


## 準備

必要なライブラリのインストール

```
$ pip install pyjwt
$ pip install cryptography
```




## コード

```createJWT.py
# coding: utf-8

import jwt
import time
import json  
from datetime import datetime, timedelta

# サービスアカウントの秘密鍵とそのメールアドレスを含むJSONファイルから情報を読み込む
with open('秘密鍵JSONファイルのパス', 'r') as f:
    service_account_info = json.load(f)

# 以下 'private_key'と'client_email'は秘密鍵のJSONファイルにある。長ったらしいキーやemailを記入するのではなく、これを変えずにそのまま'private_key'と'client_email'でいい、
private_key = service_account_info['private_key']
client_email = service_account_info['client_email']

current_time = datetime.now()
# 1時間期限を設定
expiration_time = current_time + timedelta(hours=1)

# JWTのペイロードの作成
payload = {
    'iss': client_email,
    'sub': client_email,
    'iat': int(current_time.timestamp()),
    'exp': int(expiration_time.timestamp()),
    # 必要に応じて、その他のペイロード情報を追加
}

# JWTの生成
token = jwt.encode(payload, private_key, algorithm='RS256').decode('utf-8')
print(token)

```

## 実行結果

```
$ python createJWT.py

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJwbGF0ZWF5YXItYXBwQHBsYXRlYXUtYXIuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzdWIiOiJwbGF0ZWF5YXItYXBwQHBsYXRlYXUtYXIuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJpYXQiOjE2OTMwOTM0ODMsImV4cCI6MTY5MzA5NzA4M30.YMWwCbCenFZW638CTOs2V0zmywovMOutYViijaX3rXDd7ENYV_lLYxzwasAURE31uBzkaRGk3_qeqgYiHbhOlmEdD3Mttq_cB7rD0HS1yjm4D7unZcemVUxDg7I18LjX-PIQ1FyiyqlAN42wgoYezTUOG4vIbprxt1IpGc0qA27TTD95yOW8JtzUIBQQW6WvRoMmi1Kuw_TNC5gUPzSeNnfl8pRo_xvnmJsmzNjaOhqL3Ba5PQe0Kr4sFwWAWVQOfjb7yWXthfpNeRzE4H_ICfS2ExLbzCvwo8Qmc47uiXH01ujIqRFlyVrnkG5qVs0NXmdTBZdybH9P8Cp2Nu_KDA
```

JWTが生成されました。

以上です。
[Unity]3Dオブジェクトのスケールを変更してもテクスチャを綺麗にタイリングする方法

# 概要
例えばこんな感じの３Dオブジェクトがあって
![スクリーンショット 2023-08-27 8.48.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/3b224fd8-cd35-4451-5f72-1c9e34dfa668.png)

XYZ全方向へ均等に拡大縮小する場合はテクスチャも綺麗に伸び縮みしますが１方向にだけ拡大したりするとテクスチャがいびつに伸びてしまったりします。
![スクリーンショット 2023-08-27 8.48.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/6de7a98e-2510-e644-b8ed-4bd6cc2bde19.png)
マテリアルのTilingを調整すれば正しい縮尺にできますが、サイズの違うオブジェクトを大量に作る場合、用意するマテリアルがたくさん必要になり手間がかかる上、処理の負担も大きくなります。
こんな場合は専用のシェーダーを用意すればオブジェクトのスケールを気にする必要が無く、マテリアル一つで済むようになります。

# 本文
細かい説明は書きません！ShaderGraphの完成図だけ共有します:raised_hands_tone2:
（→ShaderGraphの書き方は[こちら](https://qiita.com/kazuma_f/items/f82e98b7d0ee53ccd4c8)）
![スクリーンショット 2023-08-27 8.32.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/cdbfde42-8ecb-a9ce-1e8f-35180d87ae02.png)
これを３Dオブジェクトのシェーダーに設定すれば１方向に拡大したりしても均一なテクスチャで表示されます。Tilingを修正する必要もありません。
![スクリーンショット 2023-08-27 8.48.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/430f6f3a-8b6e-4f73-9bd8-726442767ed6.png)


:::note info
チェックポイント
（画像テクスチャ）
・ WrapModeはRepeatにして下さい。
（ShaderGraph）
・ EmissionColorのModeはHDRにして下さい。
・ NormalMapのTextureはTypeをNormalにして下さい。
・ PositionのSpaceはAbsolute Worldにして下さい。
:::

# 参考にさせて頂いたサイトのリンク
[【Unity】Shader Graphを使って「テクスチャが伸びる問題」を解決する](https://kurokumasoft.com/2022/03/16/unity-triplanar-shader/)
[ShaderGraphを使った投影マッピングの拡張 - Material Tips #2](https://www.youtube.com/watch?v=HvrMofJMJ38)
[【Unity】Shader Graphを使った自作シェーダの解説をします！（Emission編）](https://glasses202.blogspot.com/2020/06/unityshader-graphemission.html)
[UntiyShaderGraphでクリスタルなシェーダーを描く　その②](https://redhologerbera.hatenablog.com/entry/2022/12/30/221040)
[【Unity】Shader Graphで、テクスチャーを設定する](https://note.com/info_/n/n5600564cc221)
Qiita Organizationに登録するまでの社内調整（おもいで）

# はじめに

[株式会社ハウインターナショナル](https://www.haw.co.jp/)は、[Qiita Organization](https://qiita.com/organizations)に登録をしました。

https://qiita.com/organizations/haw

2023年08月24日(木)に申請を行い、翌日の8月25日(金)に[Qiita](https://corp.qiita.com/)さんに承認していただきました。
**ありがとうーーーーッ**ございます :tada::tada::tada: 
この日は**8.25**として私たちの記憶に永く刻まれることでしょう。

![スクリーンショット 2023-08-27 9.24.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/d470d8d9-e663-9042-f7b0-596a0a5138d4.png)


この記事では、登録までの社内調整（つまりは「おもいで」）を書きます。

# What is [Qiita Organization](https://qiita.com/organizations) ?

[Qiita Organization](https://qiita.com/organizations)とは一体何でしょうか。

ヘルプに書いてあります。

https://help.qiita.com/ja/articles/qiita-org-1

最初の一文を抜粋します。

[Qiita Organizationとは](https://help.qiita.com/ja/articles/qiita-org-1)

> 会社・組織等の団体メンバーの投稿をまとめることができる機能（無料）です。

詳細は、[リンク先](https://help.qiita.com/ja/articles/qiita-org-1)をご参照ください。

# 登録までの社内調整

実際に[Qiita Organization](https://qiita.com/organizations)の画面や[Qiita Organization](https://qiita.com/organizations)付きの記事を上司に見てもらいながら説明をしました。
会社の名前の露出が増えますし、 **「おもしろそうだ。[やりましょう](https://group.softbank/do)！」** で即決まりました。

上司への説明にあたり、[株式会社 オーイーシー](https://www.oec.co.jp/)の@RyoWakabayashiさんの記事を参考にさせていただきました。
@RyoWakabayashiさんとは、[Elixir](https://elixir-lang.org/)という素敵な世俗派関数型言語[^1]のコミュニティでごいっしょさせていただいております。
その素敵具合は「[Elixir Saves Pinterest $2 Million a Year In Server Costs](https://paraxial.io/blog/elixir-savings)」によく現れています。開発者も経営者もこの事実に瞠目することでしょう。**$2 Million/年の節約ですってよ！、奥さん。**

厚かましくも[Qiita Organization](https://qiita.com/organizations)のことについてちょっと気になったことを質問をさせていただいたところ、丁寧にご回答をいただきました。

[^1]: @kikuyuta 先生の「[世俗派関数型言語 Elixir を関数型言語風に使ってみたらやっぱり関数型言語みたいだった](https://qiita.com/kikuyuta/items/afa4c264720eb29d9760)」より。[Elixir](https://elixir-lang.org/)はコワくないですよ〜。

https://qiita.com/RyoWakabayashi/items/74254ce834afdc75d799

**ありがとうーーーーッ**ございます！！！
この場をお借りして御礼を申し上げます。

@RyoWakabayashiさんの記事は、[Qiita Organization](https://qiita.com/organizations)の登録申請をしようとされている方は参考になる部分が多いとおもいますのでぜひご参照ください。
オススメです。そしてこの記事を紹介することが本記事の一丁目一番地、レゾンデートルです。

私たちの組織でも、「[記事の投稿ルール](https://qiita.com/RyoWakabayashi/items/74254ce834afdc75d799#%E8%A8%98%E4%BA%8B%E3%81%AE%E6%8A%95%E7%A8%BF%E3%83%AB%E3%83%BC%E3%83%AB)」を参考に、私たちの会社にあったルールを定めることにしました。自由には責任が伴いますので、ルールがあったほうが上司、部下双方みんなが安心して記事を投稿できます。

# 申請

[Qiita Organization](https://qiita.com/organizations)への申請はここから行います。

https://qiita.com/organizations/new

私が申請を行いました。
申請から「3営業日以内に運営が確認・承認」されるとのことです。(2023-08-27現在)

私たちの場合は、1営業日で承認していただけました :rocket::rocket::rocket: 


# さいごに

[Qiita Organization](https://qiita.com/organizations)に登録するまでの社内調整（つまりは「おもいで」）を書きました。

https://qiita.com/RyoWakabayashi/items/74254ce834afdc75d799

の記事がオススメです。[Qiita Organization](https://qiita.com/organizations)への登録申請を検討されている方はぜひご覧になってください。

それではごいっしょに！
「いやぁ、[Qiita](https://qiita.com/)って本当にいいもんですね～。それではまたご一緒に投稿を楽しみましょう」

<iframe width="960" height="540" src="https://www.youtube.com/embed/TsYL6oN8SXs" title="水野晴郎さん　映画って本当にいいもんですね" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
2章　[エンドポイントの設計とリクエスト設計]

1 APIの公開方法を確認
APIの内部構造を公開するのは、セキュリティ面を考慮すると、不適切である。
公開するには、APIがどのように使われているのか*ユースケース*を考えること。

API設計の考えかた
-APIの構造を思考するために、機能を洗い出す
-APIを考えるにあたり、　URIを考える。
    -URIは、APIのアクセス場所、すなわち住所を考えること、と同一である
*POINT*
    -URIは覚えやすいURIの名前にする。(短く、人間が理解しやすいURI)
    -
    -
    -
    -改造しやすいURI (回はtruncateしゃが目で見て、わかるURI)
ドキュメントをみないとわからないURIは開発者側にとって、不便である。
    -
    -ルールが統一されたURI

※URIの住所の命名のルールなど、考えなければいけない部分はあるので、注意する。

2. HTTPメソッドとエンドポイント
[HTTPメソッドとエンドポイント(URI)の関係性]
一言で言えば、「切っても切り離せない関係性」。うまく表現できないので、
英語を用いて、表現する。

*結論*
HTTPメソッド・・　動詞 (V)
エンドポイント・・目的語 (O)

つまり、O(目的語)をVする(どうする)」という関係性である。

HTTPメソッドは以下の4つがある

- 取得する (GET)
    URIで指定された情報を取得する。
- 登録する (POST)
    - 新しい情報を利用するために利用するのが本来の目的である。
- 更新する (PUT)
    - PUTとPOSTの違いは?
    -PUTは従属関係する情報をy登録するので、
　　　　　　　　　　　URIの構成が、すでにあるURI配下に新しく作られるイメージです。
EX
前提: 「全国サイトの美味しいグルメを公開しているサイトがあった」

*URI一覧*
TOPページ:「https://www.japan.food.net/」
都道府県別 グルメサイト

新潟県グルメ
「https://www.japan.food.net/niigata/グルメID」

埼玉県グルメ
「https://www.japan.food.net/saitama/グルメID」

名古屋サイトグルメサイト
「https://www.japan.food.net/nagoya.グルメID」

上記のように、ディレクトリ配下にファイルが連なる構成である。

しかし、PUTでは異なる。
URL自体を変更することを意味する。つまり、、、

名古屋県グルメの
「https://www.japan.food.net/saitama/hitsumabushi」
↓                ↓
nagoya「https://www.japan.food.net/nagoya/hitsumabushi/11」


に変更するということである

- 一部変更する (PATCH)
- 削除する (DELETE)→ これは説明なし

PATCHメソッド
PATCHメソッドは、URIの一部を更新する意味合いである。

名古屋県グルメの
「https://www.japan.food.net/saitama/hitsumabushi」
↓                ↓
nagoya「https://www.japan.food.net/nagoya/misokatsu」

これで言えば、ひつまぶし→味噌カツに変更しているということである。

※PATCHメソッドは、使えないケースに出くわすこともあるため、注意が必要である。

EX
登録Formである。
登録Formでは、GETやPOSTしか使えないので有名である。GETは取得に対して、POSTは、更新する意味合いで使われる。
またクライアントを開発している際に、「GETやPOST」でしか使えないケースにも出くわす。

APIで、DELETEやPATCHなどを使えないようにするには、不便である
そこで、2つの方法がある

-1 X-HTTP-Method-Override
POSTメソッドを使う方法である。
POSTメソッドを*メタ情報*として、サーバに送信する方法である。
    -「X-HTTP-Method-Override」というHTTPリクエストヘッダを利用する方法である。
    EX

POST: v1/users/123/ HTTp1.1
Host: api.exaple.com

X-HTTP-Method-Override:
DELETE

-2 「_methodパラメータ」は、「Formノアパラメータ」の一つとして、利用する。
*application/x-www-form-urlencode*というContent-typeで表されるデータの一部として送信される。 (*Ruby on Rails*で採用されている)


どちらを採用する?

筆者が言うには、「X-HTTP-Method-Override」である。 「_method」では、
「application/x-www/-form-urelencode」*形式*以外で送信する場合に使うことができないからである。と言う。
Javaで「ArrayListの使い方」の動作を確認してみた

# 概要
Javaで「ArrayListの使い方」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/collection/index1.html

# 実装
以下のファイルを作成しました。
```JSample1_1.java
import java.util.ArrayList;
import java.util.List;

class JSample1_1{
  public static void main(String[] args){
    List<String> list = new ArrayList<>();

    list.add("Apple");
    list.add("Orange");

    for(String s: list){
      System.out.println(s);
    }

    System.out.println("-- --");

    list.add(1, "Grapes");

    for (int i = 0; i < list.size(); i++){
      System.out.println(list.get(i));
    }

    System.out.println("-- --");

    list.remove(0);

    for(String s: list){
	System.out.println(s);
    }
  }
}
```
以下のコマンドを実行しました。
```
$ javac JSample1_1.java 
$ java JSample1_1 
Apple
Orange
-- --
Apple
Grapes
Orange
-- --
Grapes
Orange
```

# まとめ
何かの役に立てばと。
o3dtut

Open3Dの<a href="http://www.open3d.org/docs/release/tutorial/geometry/mesh.html">tutorial</a>をGoogle Colaboratoryで動かす際に、o3dtutが使用できなかった件を解決したのでメモ。

軽く検索すると https://github.com/isl-org/Open3D/blob/master/examples/Python/open3d_tutorial.py をインポートすると良さそうだが、現在は404エラーになるようだ。
代わりに https://github.com/isl-org/Open3D/blob/master/examples/python/open3d_example.py をインポートすることで上手くいった。

`!git clone https://github.com/isl-org/Open3D`
`%cd /content/Open3D/examples/python`
`import open3d_example as o3dtut`

あとは `o3d.visualization.draw_geometries` を `o3d.visualization.draw_plotly` に変更すればok。
NLP emotion-classification using a pre-trained model - 組み込みAI セルフサービス型デジタル共創体験(DSCE)

# 組み込みAI セルフサービス型デジタル共創体験(DSCE)とは

[組み込みAI セルフサービス型デジタル共創体験](https://qiita.com/trtrbohz/items/356a5a4b66624b2c94a2)に記載しておりますが、現在STT(speech-to-text)、TTS(test-to-speech)、NLU(natural-language-understanding)等のAIがサーバーに接続しなくても組み込んで利用することが可能となりました。

その情報がこちらの[サイト](https://dsce.ibm.com/)、DSCE([Digital Self-Serve Co-Create Experience](https://dsce.ibm.com/);"組み込みAI セルフサービス型デジタル共創体験"？)にて紹介されております。

今回はそのDSCEの中から、「NLP sentiment analysis library using a pre-trained model」 の実施方法を説明します。
※個人的な利用は無償ですが、商用利用は有償となります。

# 今回は 「NLP emotion-classification using a pre-trained model」 
Plotly社製のOSSウェブフレームワークDashを使いNLP( Natural Language Processing (自然言語処理)) を利用したウェブアプリを構築します。

# 1. 前提
* ターミナル環境
mac : ターミナルを使います。[ココ](https://support.apple.com/ja-jp/guide/terminal/apd5265185d-f365-44cb-8b09-71a064a42125/mac) を見てターミナルを起動できるようにしてください。
windows : powershellを使います。[ココ](https://learn.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.3) を見てpowershellを起動できるようにしてください。
* リソース取得
下のURLにアクセスしリソースを取得します。
https://github.com/IBM/dsce-sample-apps/tree/main
※コード改変＆プルリクをするのであれば「git clone」コマンドを使うのですが、今回はソースコードの入手が目的ですので以下の様に Zip 形式でリソースを入手します。
![スクリーンショット 2023-08-12 22.28.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/e97bd8bc-0767-b52e-9914-d11c0af69259.png)
リソース取得後、zipファイルを展開すると以下のようなフォルダ構成になっていると思います。今回はその中の[sentimet-analysis]配下にあるリソースを使用します。

# 2. 手順
# 2.1. [emotion-classification]フォルダに移動
* zipファイルを解凍した場所を起点として[sentiment-analysis]フォルダに以下のようにして移動します。

      %cd dsce-sample-apps-main/emotion-classification

# 2.2. 必須ライブラリのインストール

      %pip3 install -r requirements.txt

# 2.4. アプリ実行

     %python3 emotion_classification_demo.py
     Dash is running on http://0.0.0.0:8050/

     * Serving Flask app 'emotion_classification_demo'
     * Debug mode: on

# 2.5. Access the local application
ブラウザを開き、[localhost:8050](localhost:8050) にアクセス
以下の様な画面が表示されます。

1. [Build Text]欄に文章を入力
    起動時にはデフォルト文章が記載されていますが、この欄にご自身で文章を入力することも可能です。
2. [Get Sentiment]ボタンをクリック
3. 文章の中にどのような感情が含有されているのか分類してくれます。

※ちなみに下記の例では、DSCEのトップ画面にある最初の一文を分類しました。これを見ると喜びの感情が一番大きくあらわれていますね。一方で、悲しみの感情もある。。。なんでだろう？

![スクリーンショット 2023-08-27 7.07.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/ce15bcb7-3ae9-0071-b27c-3401c4f2fcbc.png)


参照：[NLP emotion-classification using a pre-trained model](https://github.com/IBM/dsce-sample-apps/tree/main/emotion-classification)
【Rails/JavaScript】アクティブストレージの画像をプレビュー表示させるときに出会ったエラー

# はじめに
アクティブストレージの画像をプレビュー表示させるときに出会ったエラーについてその解決法をまとめました。

# プレビュー表示の方法
これは色々な記事でまとめてましたので[こちらの記事](https://qiita.com/study_matome/items/7831961de214c8935f09)を参照。

# 出会ったエラー
## ①Uncaught TypeError: Cannot read properties of null (reading 'addEventListener')at HTMLDocument.<anonymous>

Javaのファイル内容を以下のように書いたときにローカル環境にて確認時にコンソールに表示されたエラーです。

```javascript
document.addEventListener('DOMContentLoaded', function(){
  const orderForm = document.getElementById('item-image');
  const previewList = document.getElementById('previews');
  if (!orderForm) return null;
  console.log("preview.jsが読み込まれました");
  const fileField = document.querySelector('input[type="file"][name="post[image]"]')
  fileField.addEventListener('change', function(e){
   console.log("input要素で値の変化が起きました");
   // console.log(e.target.files[0]);
  });
});
```
7行目の
```javascript

const fileField = document.querySelector('input[type="file"][name="post[image]"]')
```
この部分でエラーが発生していました。
エラーを翻訳すると、「プロパティを読み取れません (「addEventListener」の読み取り)HTMLDocument.」となっており、要素が見つからないといっているようです。

改めてコードを確認すると、[name="post[image]　の要素名の指定が間違っていそうです。

ブラウザの検証機能を使いname要素の名前を改めて確認します。
![プレビュー実装中エラー1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310854/90017b3c-4494-a713-24bb-e6282e6b2994.png)

やはり要素の名前name="item[image]"となっていました。
jsファイルの記述を

```javascript

 const fileField = document.querySelector('input[type="file"][name="item[image]"]')

```
としたら無事にエラー解決です。

その後参照記事通りに編集すれば、実装完了！
お疲れさまでした。

```javascript
document.addEventListener('DOMContentLoaded', function(){
  const orderForm = document.getElementById('item-image');
  const previewList = document.getElementById('previews');
  if (!orderForm) return null;

  const fileField = document.querySelector('input[type="file"][name="item[image]"]')
  fileField.addEventListener('change', function(e){
   const alredyPreview = document.querySelector('.preview');
   if (alredyPreview) {
    alredyPreview.remove();
   };
   const file = e.target.files[0];
   const blob = window.URL.createObjectURL(file);
   const previewWrapper = document.createElement('div');
    previewWrapper.setAttribute('class', 'preview');
   const previewImage = document.createElement('img');
   previewImage.setAttribute('class', 'preview-image');
   previewImage.setAttribute('src', blob);

   previewWrapper.appendChild(previewImage);
   previewList.appendChild(previewWrapper);
  });

});

```
[Node.js] node.jsとnpmのアップデート

# 実行環境
- OS: macOS Ventura 13.0
# Node.jsのアップデート
nというnode.jsのバージョン管理ツール使う。nodebrewと同じ役割。

➀　nのグローバルインストール
```
npm install -g n
```
② インストールできるnode.jsのバージョン確認
```
 # 安定番
n --stable

# 最新版
n --latest
```
③ Latestのインストール
```
n latest

# 切り替わったか確認
node -v
```

# Nodeのバージョン切り替え
nコマンドでインスローつされているバージョンの切り替えを行う。
nコマンドを実行して上下の矢印でバージョン選択。
```
$ n

  node/15.11.0
  node/15.14.0
ο node/16.0.0
```

#### インストールされているバージョンの確認
 ```
 n ls
```

#### 不要になったバージョンの削除
```
n rm 18.2.0
```

# npmのアップデート

```
npm update -g npm
```

# 参考にさせていただいた記事
- [Node.jsとnpmをアップデートする方法](https://parashuto.com/rriver/tools/updating-node-js-and-npm)
PlatformIOでSTM32のUART書き込みができない

# 状況

PlatformIOのSTM32でUART書き込みができない。MacやLinuxで発生するっぽい。

```s
Auto-detected: /dev/cu.usbserial-1420
Uploading .pio/build/genericSTM32F446RE/firmware.bin
Unknown/unsupported device (Device ID: 0x421)
stm32flash Arduino_STM32_0.9

http://github.com/rogerclarkmelbourne/arduino_stm32

Using Parser : Raw BINARY
Interface serial_posix: 115200 8E1
```

# 原因

書き込みのstm32flashがくそ古いから![スクリーンショット 2023-08-27 5.26.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628782/9c1736ae-6f80-31d4-49fb-5f37a9e91282.png)

# 解決策

https://sourceforge.net/projects/stm32flash/files/

から最新のバイナリを落として、さっきのやつを置き換える。ファイル名の末尾の_OS名は捨てて、`stm32flash`にする。

![スクリーンショット 2023-08-27 5.29.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628782/97be7fe7-ec3c-11bc-3807-41700bc793f6.png)

こんな感じに怒られたらそれっぽくぺろぺろして対処する。

![スクリーンショット 2023-08-27 5.32.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628782/0210734a-b013-3cf6-8617-cfd0ee108b67.png)

うれしいね。

# 終わりに

うごいてうれしいきもち

![](https://media.giphy.com/media/kyLYXonQYYfwYDIeZl/giphy.gif)
【Git】Gitリポジトリを作成する手順

最近こんなツイートをしました。流れはわかるかもしれないけど詳しいやり方がわからないと思います。

普段はプログラミングや、フリーランスについて発信しています。<a href="https://twitter.com/div_tomo?ref_src=twsrc%5Etfw" class="twitter-follow-button" data-lang="ja" data-show-count="false"> フォローする </a><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



<blockquote class="twitter-tweet">
 <p lang="ja" dir="ltr">
  Gitリポジトリの作成方法<br><br>
  1. コマンドラインを開く<br>
  2. プロジェクトのディレクトリ（フォルダ）に移動<br>
  3. git init を実行<br>
  4. [.git]ディレクトリが作成される<br><br>
  Gitは、チーム開発では必須のスキルだから必ず覚えてほしい！<br><br>
  未経験で入ってくる人にありがちなのですがgitコマンドすごい聞いてくる。
 </p>&mdash; Tomoya@Web系フリーランサー (@div_tomo) 
 <a href="https://twitter.com/div_tomo/status/1695484710858928271?ref_src=twsrc%5Etfw">
  August 26, 2023
 </a>
</blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## リポジトリを作成するための流れ

1. コマンドラインを開く
2. プロジェクトのディレクトリ（フォルダ）に移動
3. `git init` を実行
    1. .gitディレクトリが作成される

# ①コマンドラインを開く

［Windows］＋［R］キーを押してから、入力ボックスに [cmd] と入力して [Enter] キーを押すとコマンドラインが開きます。

# ②プロジェクトのディレクトリ（フォルダ）に移動

今回僕は、「D:\xampp\htdocs\test」にプロジェクトがあるので `cd` コマンドで移動していきます。

```html
cd D:\xampp\htdocs\test
```

## ③リポジトリを新規に作成

`git init` でリポジトリを新規に作成

```html
D:\xampp\htdocs\test>git init
Initialized empty Git repository in D:/xampp/htdocs/test/.git/
```

git init と入力すると「空のGitリポジトリが新規に作成されました。」と表示されます。

### 実際に作られたか確認

エクスプローラーを開き「D:\xampp\htdocs\test」まで移動して隠しフォルダを表示します。

隠しフォルダの表示方法がわからない人は以下の記事にのっています。

https://helpx.adobe.com/jp/x-productkb/global/show-hidden-files-folders-extensions.html

隠しフォルダを表示したらフォルダの中に「.git」が新しく作成されていればOKです。

# .gitの中を少しだけ見ていきます

- 「objects」は、リポジトリの本体
    - この中に圧縮ファイル、ツリーファイル、コミットファイル、が保存されていきます。
- 「config」は、Gitの設定ファイル