OmniAICreator/Qiita-1.07M huggingface dataset:
NEXT.JSで静的サイトを作る方法（格安レンタルサーバーにもデプロイできる）

# 静的サイト（Static Site）とは
静的サイト（Static Site）とは、事前にHTML、CSS、JavaScriptなどのファイルを生成し、そのままサーバーに配置してアクセスする形式のウェブサイトです。
静的サイトは動的な処理や、データベースのやり取りがなく、訪問者に対して同じ内容を表示します。
静的サイトであれば、ロリポップなど、ほとんどの格安レンタルサーバーにもデプロイできます。



# 手順1  NEXT.JSのプロジェクト作成
ターミナルでプロジェクトを作りたい階層で下記のコマンドを打つ。JSとtailwind CSSを選択。あとは、基本、全部yesで
```:terminal
npx create-next-app@latest
```
![スクリーンショット 2024-05-19 1.51.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623923/e9d46933-7387-d33a-5dc5-01676beeb280.png)



# 手順2  プロジェクト直下の.eslintrc.jsonにimgタグの使用を許可する記述を記載
静的サイトでは、NEXT.JSのImage Componentが使えません。build時にエラーが出ます

```:.eslintrc.json
"rules": {
    "@next/next/no-img-element": "off"
  }
```
![スクリーンショット 2024-05-19 5.44.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623923/61e7be55-8629-5741-c605-330b755c896f.png)


appフォルダ直下のpage.jsやlaytout.jsに記述



# 手順3  全体のページ構成を作成
### ・ルート直下のlayout.js、page.js

appフォルダ直下のpage.jsやlaytout.jsに記述

**layout.js** 複数の画面間で共有されるUIを実装する場所
**page.js** Reactコンポーネントをexport defaultする

**layout.js　コード例** 
```js:layout.js
import "./globals.css";
import Header from "../components/Header";
import Footer from "../components/Footer";
import PageMetadata from "../components/Metadata"; 

export default function RootLayout({ children }) {
  const { title, description } = PageMetadata(); 

  return (
    <>
      <html lang="ja" className="scroll-smooth">
        <body>
          <Header />
          <main>{children}</main>
          <Footer />
        </body>
      </html>
    </>
  );
}
```

**page.js　コード例** 
```js:page.js
import Slider from "../components/Slider";
import Features from "../components/Features";
import Access from "../components/Access";
import Overview from "../components/Overview";

export default function Home() {
  return (
    <>
      <Slider />
      <Features />
      <Access />
      <Overview />
    </>
  );
}
```

### ・サブディレクトリ

**app直下のフォルダ名=サブディレクトリ名**

サブディレクトリ・フォルダ直下のpage.jsやlaytout.jsにコンテンツを記述

**＊今回は、静的サイトのデプロイが目的のため、個々のページ作成については解説しません。**



# 手順4  各コンポーネントを作成

例 appフォルダ内、componentsフォルダ内
![スクリーンショット 2024-05-19 6.05.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623923/7cb6da54-0ee4-6657-fec0-af3acd52f8c8.png)

**＊今回は、静的サイトのデプロイが目的のため、個々のコンポーネントやページ作成については解説しません。**



# 手順5  プロジェクト直下のnext.config.mjsにbasePathを指定し、output: "export"を記載
```js:next.config.mjs
/** @type {import('next').NextConfig} */
const nextConfig = {
  // デプロイ先のパス名を記載。ルートディレクトリなら記載の必要なし
  basePath: "",
  // 必ず下記を追記
  output: "export",
};

export default nextConfig;
```



# 手順6  ビルドして静的ファイルを生成する

下記のコマンドを打つ
```:terminal
npm run build
```

### プロジェクト直下のoutフォルダ内に静的ファイルが生成される
![スクリーンショット 2024-05-19 6.16.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623923/036087a7-a50f-3953-d20a-2756f0222924.png)


### outフォルダ内の全てのフォルダをデプロイ先にアップロードする
![スクリーンショット 2024-05-19 6.19.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623923/4c5706cf-bbb8-e867-46f1-793013bca8b5.png)
CML２が使えません

# はい、これは100%自分の知識不足です。
表題通りです。CMLで正常にisoを読み込んでいないっぽい(？)のでCMLが使えません
３時間ほど格闘しましたが、如何せん自分に仮想化に関する知識不足で解決方法が見えず困っています。助けていただけると幸いです。

使用しているPCのスペックは以下です。
・OS：Windows 11 Pro
・CPU：Intel(R) Core(TM) i7-14700F   2.10 GHz
・RAM：64.0 GB

# やったこと
### ライセンス購入
買いました。円安のせいで実質値上がりしていて辛いです。

### イメージのダウンロード
https://software.cisco.com/download/home/286290254/type/286290305/release/CML-Personal%202.7.0
上記リンク先から以下2ファイルをダウンロードしました。
・cml2_p_2.7.0-4_amd64-20.ova
・refplat_p-20240225-fcs-iso.zip

### 仮想マシンの設定
最近無料になったでおなじみのVMware Workstation Pro 17を使用しています。
落としてきたovaファイルを開き、isoイメージファイルはさっき落としてきたrefplatファイルを解凍した物の中にあるisoファイルを指定しました。
![スクリーンショット 2024-05-19 025037.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768522/5e71eea7-af6e-3f5a-5d64-61526bfbed66.png)
その他の設定はこんな感じです。
(雑な編集ですみません)

### CMLを立ち上げ、初期設定を行う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768522/ca382db8-f25a-0cba-4d21-a8f24b7067f7.png)

hostnameをcml-controller(デフォルト値)に設定するところまでEnterを押して設定を進めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768522/b76826ca-e8e0-0f29-49f8-e7851a30f9ea.png)
なんで？

Continue anywayを選択し、無理やり設定を進めるとやっぱりISOがアタッチされていないことを突っ込まれました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768522/c8739521-740d-7ffa-b3ba-38ffc63f3e45.png)

CML自体は開くがイメージがないことでエラーが出ています。(それはそうですが)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768522/44948bdc-704d-ccbd-ebed-18fcb736acb6.png)

### Hyper-Vについて
上記手順はHyper-Vを無効にして行いました。有効にすると仮想マシン起動時に以下メッセージが出力され、はい、いいえのどちらを選択しても仮想マシンの起動に失敗します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768522/a9449b9f-84f0-e62d-ec1e-def6da0a7f6c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768522/14ddd7f9-0aad-bc44-7df2-f53f277e7d8d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768522/2f01b4c0-1607-4078-381f-f696151b5163.png)

Intel VT/…を仮想化のチェックを外して仮想マシンを起動すると、KVMのエラーが増えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768522/ca739b9d-35b6-138f-2e18-15c13e9e3189.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768522/6620f812-08f0-a0ee-6c3b-1e58fa0c79f6.png)


## なんと、dotさんが助けてくれました！
この場をお借りしてお礼申し上げます。ありがとうございます。
筆者は深夜28時まで悩んでいたのですが、dotさんが神の一手を打ってくれました。


それがこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768522/f4f7a4b0-941c-3ebf-a32c-5e550ab25219.png)

<br>
<br>
<br>
<br>
<br>
流石にバカすぎるだろ

ライセンス認証させて寝ます。おやすみなさい～
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768522/66059c98-b267-3956-9232-0dd9ba322212.png)
リモートのdockerでEarthlyを実行する

# TL;DR
サーバー側でDockerデーモンをtcpで公開し、ファイアウォールの設定を適宜行った後、Earthlyを実行するクライアント側で環境変数`DOCKER_HOST`にサーバーのアドレスを設定するとリモートのDocker上でビルドを走らせることができる。
# 経緯
出先のノートパソコン(16GB RAM)で開発をする際、Earthlyを動かすためにDocker DesktopをIDEやブラウザと同時に起動するとRAM不足に陥ってしまった。また、ノートパソコンを閉じている間に時間のかかるビルドプロセスを実行できると何かと便利なため、自宅に設置したサーバーのDocker上でビルドを行えばよいと考えた。
# 実現方法
サーバーを直接公開するのは不安なので、Raspberry PiでVPNサーバーを立て、VPN経由でDockerサーバーに接続することとした。VPNサーバーを構築する過程については省略し、VPNなどでLANに接続できることを前提とする。

Dockerデーモンがtcpで公開は、/lib/systemd/system/docker.serviceの以下の項目で設定することができる。

``` /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// -H=tcp://0.0.0.0:2375 --containerd=/run/containerd/containerd.sock
```
この例ではデーモンがtcpのポート2375に公開されている。これを利用するため、適宜ファイアウォールの設定を行う。
``` bash
sudo ufw allow 2375
```
次にクライアント側の設定を行う。設定といっても`DOCKER_HOST=tcp://サーバーのアドレス:ポート`という風に環境変数を設定するだけでよい。適切に環境を構築できたかどうかはクライアント側で`docker version`を実行することで確認できる。
``` bash
// 設定前
>docker version
Client:
 Cloud integration: v1.0.35+desktop.11
 Version:           25.0.3
 API version:       1.44
 Go version:        go1.21.6
 Git commit:        4debf41
 Built:             Tue Feb  6 21:13:02 2024
 OS/Arch:           windows/amd64
 Context:           default

Server: Docker Desktop 4.28.0 (139021)
 Engine:
  Version:          25.0.3
  API version:      1.44 (minimum version 1.24)
  Go version:       go1.21.6
  Git commit:       f417435
  Built:            Tue Feb  6 21:14:25 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.28
  GitCommit:        ae07eda36dd25f8a1b98dfbf587313b99c0190bb
 runc:
  Version:          1.1.12
  GitCommit:        v1.1.12-0-g51d5e94
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

>set DOCKER_HOST=tcp://192.168.1.10:2375
//設定後
>docker version
Client:
 Cloud integration: v1.0.35+desktop.11
 Version:           25.0.3
 API version:       1.41 (downgraded from 1.44)
 Go version:        go1.21.6
 Git commit:        4debf41
 Built:             Tue Feb  6 21:13:02 2024
 OS/Arch:           windows/amd64
 Context:           default

Server:
 Engine:
  Version:          20.10.25
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.18.1
  Git commit:       20.10.25-0ubuntu1~22.04.1
  Built:            Thu Jun 29 21:21:05 2023
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.7.2
  GitCommit:
 runc:
  Version:          1.1.7-0ubuntu1~22.04.2
  GitCommit:
 docker-init:
  Version:          0.19.0
  GitCommit:
```
これでサーバーのDockerを利用するように設定できたので、Docker DesktopやWSLを終了しメモリを節約することができる。
Victoria 3 modding 備忘録

## 概要
Victoria 3 moddingの際の、文法を確認するための備忘録的な記事です。
詳しいmoddingの方法等は公式wiki等を確認してください。

## create_building (1)
```
build_university_decision.1 = {
	is_shown = {
        exists = c:JAP
		c:JAP = THIS
        
        #関東かつ大学がない州があるか
		any_scope_state = {
			state_region = s:STATE_KANTO
			not = { has_building = building_university }
		}
	}
	when_taken = {
		every_scope_state = {
			if = {
				limit = { state_region = { this = s:STATE_KANTO } }
				create_building = {
					building = building_university
					level = 3
				}
			}
		}
	}
    # AI操作国の場合は実行しない
	ai_chance = { base = 0 }
}
```
「関東地方にレベル3の「大学」を建設する」というものです。
 ` state_region = { this = s:STATE_KANTO } `という記述方法を見つけるのに苦労しました。

直接対象の州を指定して`create_building`を実行できる訳ではなく、**全ての州をチェック**して、条件に合う州に対して`create_building`を実行すると記述する点も厄介です。


## create_building (2)
```
build_administration_decision.1 = {
	is_shown = { any_scope_state = { tax_capacity < tax_capacity_usage } }
	when_taken = {
		every_scope_state = {
			if = {
				limit = {
					tax_capacity < tax_capacity_usage
					any_scope_building = {
						is_building_type  = building_government_administration
						level < 5
					}
				}
				create_building = {
					building = building_government_administration
					level = 5
				}
			}
		}
	}
}
```
課税キャパシティを超えている州の、行政府のレベルを5に変えるものです。
（すでに5を超えている場合は変わらない）

課税キャパシティなどの州の変数は、直接`tax_capacity`と書くようです。
（buildingsのように`state.tax_capacity`としなくてよい）

ゲームファイルの`events\test_events.txt`内に`add_building_level`という関数がありますが、wikiに記載も見つからないので実行できなそうです。
これが使えれば楽だったのですが……

## 領土操作
```
ethiopia_unification.1 = {
	is_shown = { exists = c:HAR }
	when_taken = {
		c:SHW = {
			annex = c:HAR
			annex = c:WLG
			annex = c:BRN
			annex = c:KFA
			annex = c:SDM
			annex = c:BGM
			annex = c:WLO
			annex = c:TGR
			annex = c:GJM
		}
		s:STATE_GONDER.region_state:AWS = {
			set_state_owner = c:SHW
		}
		s:STATE_ERITREA.region_state:EGY = {
			set_state_owner = c:SHW
		}
	}
	ai_chance = {
		base = 0
	}
}
```
上記はソロモン朝シェワ国が、エチオピア統一する内容です。

hoi4ではジブラルタルのような地域も「州」となっていますが、vic3では州を複数の領有国で分割した「分割州」となっています。
そのため、`s:STATE_ERITREA.region_state:EGY`のように領有国まで指定する必要があります。

## 従属国
```
if = {
    limit = {
        OR = {
            is_country_type = recognized
            is_country_type = colonial
        }
    }
	create_diplomatic_pact = {
		country = c:HAW
		type = puppet
	}
}
else = {
	create_diplomatic_pact = {
		country = c:HAW
		type = vassal
	}
}
```
上記はハワイを保護国にする内容です。
宗主国側が列強国に承認されているか、未承認国であるかによって`type`が異なります。
誤ったものだといきなり独立されてしまうので、注意が必要です。

| 自治度 | 承認国 | 未承認国 |
|:-:|:-:|:-:|
| 高 | protectorate | - |
| 中 | dominion | tributary |
| 低 | puppet | vassal |

2024/05/23 追記
植民地を持つ国は `colonial` のようです。
OR条件で追加しましたが、反転して、`is_country_type = unrecognized` でいいかも（未確認）

## 請求権
```
s:STATE_PALESTINE = {
    remove_claim = c:TUR
}
```
上記はパレスチナ州から、オスマン帝国の請求権を削除するEffectです。
請求権の操作は直感と逆だったので記載しておきます。

## 終わりに
ミス等ありましたら、コメントなどでご指摘ください。

## 修正履歴
+ 2024/05/19 :  `country_type` を `is_country_type` に修正
+ 2024/05/23 : 傀儡タイプの条件に、`is_country_type = colonial` を追加
+ 2024/06/22 : 請求権操作のEffectを追加
【小技】TwitterをSolarized Darkに染め上げる。他者よりおしゃれに，他者より見やすく，他者より上へ!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/b693543c-e395-ea87-57fd-1b6f27f07999.png)

## できること

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/d84ec431-271b-7b62-05e4-505dfce88ec6.png)

今回は真ん中はうまく染め上げられなかったがサイドだけ染め上げてスタイリッシュにすることができた。
真ん中も頑張れって?「知らぬさ!所詮人は己の知ることしか知らぬ!」(CSS詳しい人助けて)

## やること
1. [ブラウザのエクステンションstylus](https://addons.mozilla.org/ja/firefox/addon/styl-us/)をインストールする。これによってサイト毎のカスタムcssを設定できる。
2. stylusにx.comのcssを設定する。現状は[gistにおいてあるこれ](https://gist.github.com/RyosukeDTomita/5244e4d90d77f0d6dc11dcb2dc30f271)をコピペするだけでOK

## 補足
- トレンド機能，フォローのレコメンド，Premiamの宣伝がうざかったのでついでに消去している。
RubyでPHPのvar_dumpライクな機能を提供するGem『ruby_var_dump』をリリースしました

# Gem「ruby_var_dump」を作成＆リリースしました
RubyでPHPのvar_dumpライクな機能を提供するGem『ruby_var_dump』をリリースしました

RubyGems.org
https://rubygems.org/gems/ruby_var_dump

Github
https://github.com/hirokiyam/ruby_var_dump

## 特徴
変数をグラフィカルに出力する機能をRubyで実現します。
入れ子構造になっているような変数オブジェクトの内容を詳細に表示するためのGemです。

## 使い方
Gemfileに以下を追記します。
```ruby
gem 'ruby_var_dump'
```

gemをインストールします。
```terminal
bundle install
```

### 使いたいクラスで呼び出す場合

ruby_var_dumpを使いたいクラスに以下を追加して、RubyVarDumpモジュールのメソッドを組み込みます。
```ruby
require 'ruby_var_dump' #ファイルの先頭に追加

include RubyVarDump # classの先頭に追加
```

### 設定の例
以下は ruby_var_dump を使うサンプルのクラスの例です。
```ruby
require 'ruby_var_dump'

class ExampleClass
  include RubyVarDump

  def demonstrate_dump
    # 変数に値を代入
    my_hash = {key1: "value1", key2: 123}
    my_array = [1, 2, 3, {nested_key: "nested_value"}]

    # vdump というメソッドで実行
    vdump my_hash
    vdump my_array

    # または、エイリアスの vpp というメソッドで実行
    vpp my_hash
    vpp my_array
  end
end
```

先頭で require 'ruby_var_dump' をして
クラス内部に include RubyVarDump を記述してください。

メソッド名は「vdump」ですがエイリアスの「vpp」でも実行できます。
エイリアスなので挙動は全く同じです。

### 出力
上記の出力は以下のようになります。

```
{
  :key1 => "value1",
  :key2 => 123
}
=> nil

[
  1,
  2,
  3,
  {
    :nested_key => "nested_value"
  }
]
=> nil
```

## Railsでの使い方
Railsに組み込む場合は以下のように設定します。

１. イニシャライズ用のファイルを作成
```
touch config/initializers/setup_ruby_var_dump.rb
```
config/initializers フォルダに、上記のように任意の名前でファイルを作成します。
上記は touch コマンドで setup_ruby_var_dump.rb という名前のファイルを作成しています。

２. ruby_var_dump をオブジェクトクラスに組み込む
```
# config/initializers/setup_ruby_var_dump.rb
require 'ruby_var_dump'
Object.include RubyVarDump
```

上記を記述して ruby_var_dump のモジュールをRubyのオブジェクトクラスに組み込みます。これにより dump メソッドがRailsアプリケーション内でグローバルに使えるようになります。

#### 1 と 2 をワンライナーで行う場合
以下をコマンドラインで実行してください。
```
echo -e "# config/initializers/setup_ruby_var_dump.rb\nrequire 'ruby_var_dump'\nObject.include RubyVarDump" > config/initializers/setup_ruby_var_dump.rb
```

## メソッドの使い方
出力は「vdump」または「vpp」というメソッドで行います。

実行
```ruby
vdump "abc"
vpp "abc"
```

出力
```ruby
"abc"
=> nil
```

実行
```ruby
item = {key1: "value1", key2: 1024, key3: {key4: {key5: "value5", key6: [11,22]}}}
vdump item
vpp item
```

出力
```
{
  :key1 => "value1",
  :key2 => 1024,
  :key3 => {
    :key4 => {
      :key5 => "value5",
      :key6 => [
        11,
        22
      ]
    }
  }
}
=> nil
```

このように配列はハッシュなどのオブジェクトがグラフィカルに出力されます。

バージョン0.1.4でActive Recordの出力に対応しました。
バージョン0.1.5で dump というメソッド名から vdump というメソッド名に変更しました。
バージョン0.1.6で エイリアス vpp を作成しました。「visual pretty print」の略です。

バグ報告などがございましたらお気軽にご連絡いただけますと幸いです。
Unity Screen NavigatorでSNSを作る - サイバーエージェントエンジニア研修で行ったこと

# はじめに
この記事では設計について言及がありますが、あくまで個人的な見解であり、思想や個人を否定する意図はありません。

# 研修について
こちらのNoteに記載があります！

https://note.com/seiya_zls/n/n7e1d6b122ff3

# Unity Screen Navigatorとは
https://github.com/Haruma-K/UnityScreenNavigator/blob/master/README_JA.md
UnityのuGUIで画面遷移、画面遷移アニメーション、遷移履歴のスタック、画面のライフサイクルマネジメントを行うためのライブラリです。

# やったこと

### 進行管理

Githubの活用

|Issue|
|---|
|<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2649682/65b39e02-2751-8e3a-c154-c3e5afa72511.png">|

| マイルストン|
|---|
|<img width="1000" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2649682/cd0435fa-51e9-9e43-10cf-53c948176011.png">|

| Projects |
|---|
<img width="1000" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2649682/160c7284-6628-6295-93c3-2965036720ed.png"> |

Issueでタスクを起票し、プルリクに該当のIssueを付け、マイルストンにIssueを紐づけることにより制作進行が非常にしやすかったです。
Projectsでカンバンや、ガントチャートを見ることができ、非常にやりやすかったです。


### 設計
Unity Screen Navigatorのデモのコードを参考に設計を行いました。
MVPとクリーンアーキテクチャの一部の層を取り入れました。


PresenterがMonoBehaviourを継承していないことに納得感を感じたり、[View](https://github.com/Haruma-K/UnityScreenNavigator/blob/master/Assets/Demo/Core/Scripts/View/Top/TopView.cs)と[ViewState](https://github.com/Haruma-K/UnityScreenNavigator/blob/master/Assets/Demo/Core/Scripts/View/Top/TopViewState.cs)という概念が存在することにより、PresenterとView間での密結合を防げていて開発終盤のバグ修正や変更等が非常にやりやすかった印象です。

[1画面ごとにデバッグできる](https://github.com/Haruma-K/UnityScreenNavigator/tree/master/Assets/Demo/Development/View/Home)ような設計にもなっていて、開発中も非常に楽でした。

# こだわりポイント

### コンポーネント

Imageをラップし、ラップしたImageコンポーネントを直接触れなくなるようにしました。

[uPalette](https://github.com/Haruma-K/uPalette/blob/master/README_JA.md) (色などを一元管理できるライブラリ) のカラーのエントリをImageコンポーネントで触れたり、コードから書き換えられるようにしたかったので、ラップを行いました。


<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2649682/619b2e60-4b32-01ab-fb3e-27ee1857ab33.png">

https://qiita.com/ItoSeiya/items/ed48f5ec1e112570afdd

### ローカライズ
UnityのLocalizationを使用しました。

https://light11.hatenadiary.com/entry/2021/12/02/200205

動的なテキストはコード上でエントリを取得したり、エントリのIDの自動生成のエディタ拡張を行いました。

https://qiita.com/ItoSeiya/items/347b99a18ff2e494c509

スプレッドシートでローカライズを管理できたのも非常に効率が良かったです。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2649682/d1f24039-34b4-c08b-1796-71ad7f60f64b.png">

https://light11.hatenadiary.com/entry/2022/03/31/195900

### アセンブリ

MVPパターンにおける、Model、View、Presenterなどでそれぞれアセンブリ分けを行い、参照の管理を行うことにより、設計の担保を行いました。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2649682/1e6940e3-0ba1-61ed-0f10-2afd4657ae01.png">

# さいごに

ここまで読んでいただきありがとうございました！
学びや感じたことはNoteに載せてますので、ぜひご覧ください！

https://note.com/seiya_zls/n/n7e1d6b122ff3
振動データの周波数解析によるベアリングの状態監視2（原因究明編）

# 前回の復習と本稿の目的

振動センサーを用いて、回転機器の状態監視をしているとしましょう。もし、異常に高い振動が計測されたら、周波数解析が必要になります。生の振動データからどうやってスペクトルを計算するか、を[前回](https://qiita.com/ytt/items/fa354b0154f95dd0f933)まとめました。得られたスペクトルを再度、下図に示します。このスペクトルから、どのようにして異常振動の原因を明らかにするか、をここでは記述したいと思います。

![fft.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791585/ceae3bdc-7fb1-51fc-718f-ebd88775387f.png)

# ベアリングの固有振動数の導出

ベアリング（軸受）は、内径や外径、転動体（コロ）の数や直径など、その幾何形状で決まるいくつかの固有振動数を持ちます。それらと、前回導出したスペクトルのピーク周波数の一致を調べることで、どのベアリングのどの部分が損傷しているかを特定することが可能になります。

そのため、まずは(1)振動センサーで監視しているベアリングの型番、(2)シャフトの回転周期の2点を調べましょう。筆者らのユースケースでは、(1) 異常振動が計測された振動センサーの直近のベアリングは、NSK社のNF205でした。(2) シャフトの回転周波数は3550 (rpm, rotation per minutes) でした。

この2つの情報があれば、ベアリングの特性周波数が計算できます。手計算でも導出できるのですが、もっと簡単な方法をここでは紹介します。


ベアリングメーカーは、たいてい自社のベアリングに対して、"bearing frequency calculator"のようなweb pageを持っています。例えば、NSK社だと[こちら](https://www.acousnavi.nsk.com/jp/technology-info/)に行くと、下に示したような「振動周波数の計算」というページを見つけることができます。

![nsk_calculator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791585/c30d5869-61b2-da42-b8ed-8046d46458ed.png)

そちらにアクセスし、ベアリングの型番（ここではNF205）を選んだあと、シャフトの回転周期 (3550 rpm) を入れると、当該ベアリングの固有振動数が、下図のように得られます。

![bearing_freq.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791585/e39c9c15-66b5-8171-8d4f-ad672a903699.png)

注目していただきたいのが、赤線で囲った部分です。

- 保持器の回転周波数 [s^-1] = 1475.325 / 60 = 24.6 Hz
- 転動体の自転周波数 [s^-1] = 10213.786 / 60 = 170.2 Hz

これにより、得られたスペクトルのピークは、上の2つの周波数とその高調波に一致することがわかりました。つまり、ベアリングの保持器と円筒ころが損傷しているため異常振動が検出されたのではないかと推測できました。

# 根本原因の解明

この推論に無理のある仮定は含まれておらず、すんなり受け入れられるものではあると思います。しかしながら、保守的にみると、ここまではあくまでデータ解析と理論に基づいたspeculationでした。


解析が正しいかを実際に確認することが何よりも重要ですので、筆者らは実際に、ベンダーの協力のもとでオーバーホール期間に当該ベアリングを取り出し、同型機の同一ベアリングと比較しました。その結果、円筒ころや保持器が異常に摩耗していること、その摩耗した鉄粉の混入により、白いグリスが真っ黒に変色していることを確認しました。

その後、当該ベアリングを交換し、再度振動計測をスタートしたところ、振幅が約1/10の通常レベルに低下したことも確認しました。


このあたりの写真を公に公開してよいかどうかは微妙だと思いましたので、ここには載せませんでした。興味のある方はDMいただけますと幸いです。
Macで音楽ファイルをm4aに変換してiTunesに追加する

## 概要
Macで音楽ファイルをダブルクリックで追加していたのですが、なぜかiTunesやiPhoneで再生すると再生時間が短い事がありました。
対策としてm4aに変換して転送するとうまく行ったので手順を残します。
毎回VLC等で作業していましたが、面倒でしたのでAutomatorでファイルを右クリックしてiTunesに追加できるようにしました。
あと毎回メタデータを編集するのは面倒だったのでそれも自動でコピーするようにしています。
すごいニッチだと思うので需要はないかもですが、備忘録として残します。

### やったけどだめだったこと
- iTunes上でmp3等に変換する。

## 手順
### ffmpegをインストール
ffmpegでlibfdk_aacを利用するので以下のサイトを参考にインストールします。

https://scrapbox.io/craftmemo/mac_%E3%81%A7_ffmpeg_%E3%81%A7_libfdk_aac_%E3%82%92%E4%BD%BF%E3%81%86

#### インストールしている場合はアンインストール

```
brew uninstall ffmpeg
```

#### コンパイルオプションに対応した物をtap

```
brew tap homebrew-ffmpeg/ffmpeg
```

#### ライブラリごとインストール

```
brew install homebrew-ffmpeg/ffmpeg/ffmpeg --with-fdk-aac
```

#### ffmpegにPATHを通す

~/.zshrcに以下を追加する。
```
export PATH=/opt/homebrew/bin:$PATH
```

#### .zshrcを再読み込み

```
 source ~/.zshrc
```

### Automatorの設定
#### Automatorでクイックアクションを選択

クイックアクションで右クリックのメニューに追加できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266075/5fa68aac-a511-7ca9-7290-e6eca60b2598.png)

#### 右クリックのメニューを表示する対象を設定
ワークフローが受け取る現在の項目：オーディオファイル
検索対象：Finder
※ ここは好みで設定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266075/5fa13620-4490-7bc8-1b91-7bd6671a897e.png)

#### シェルスクリプトの設定
左ペインのアクション→ライブラリ→ユーティリティ→シェルスクリプトの実行を右ペインにドラッグアンドドロップします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266075/6fc5eb94-247b-e208-47a3-317e7202ae57.png)

入力の引き渡し方法は引数としてを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266075/8224fb25-6231-3b2d-eed9-dc40ca3fec5a.png)

#### スクリプトを記述
以下のスクリプトを記述します。
```
/opt/homebrew/bin/ffmpeg -i "$@" -acodec libfdk_aac -c:v copy -ar 48000 -ab 320k -cutoff 20000 ${@%.*}.m4a

echo ${@%.*}.m4a
```
##### 1行目
ffmpegで引数(受け取ったファイル)をm4aに変換しています。
```
/opt/homebrew/bin/ffmpeg
```
PATHを通したのにフルパスを書いていますが、スクリプト内でffpmegを認識してくれないのでこのように記述しています。
```
-i "$@"
```
"$@"で引数(右クリックで選択したファイルのフルパス)を入力ファイルに設定しています。

```
 -acodec libfdk_aac -c:v copy -ar 48000 -ab 320k -cutoff 20000
```
aacに変換するためのオプションです。
アートワーク含むメタデータをいちいち書き換えるのが面倒だったので、メタデータのコピーを行っています。

##### 2行目
```
echo ${@%.*}.m4a
```
次のアクションの引数に渡すため、標準出力へ変換後のファイルのフルパスを出力しています。

#### iTunesへ取り込み

左ペインのアクション→ライブラリ→ミュージック→ファイルを"ミュージック"に読み込むを右ペインにドラッグアンドドロップします。
追加先はライブラリにしていますが、好みのプレイリストに追加してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266075/8346293d-c6d5-692e-49fe-985094d07d77.png)

#### 保存
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266075/6510139e-5d2f-6126-2e11-05c098c48100.png)

ここまでできたら名前をつけて保存してください。
保存した名前が右クリックのメニューに表示されますのでわかりやすいやつがいいです。
あと一度保存したら名前を変更できないぽいので、複製して保存するときに名前をつけ直す必要があります。
もしいい方法があったら教えて下さい。

### 実行
うまくできていたらFinderでmp3等の音楽ファイルを右クリックするとクイックアクションに↓のように表示されますので、選択すると音楽ファイルと同じパスにm4aファイルが出力されiTunesにも追加されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266075/69e5c5b4-0773-3173-3647-3c93d762b41f.png)

## まとめ
変換してAutomatorで実行するだけだから簡単だろうと思っていたのですが、試行錯誤してたら時間がかかってしまいました。
最初はm4aに変換するだけでやっていたのですが、メタデータもコピーしたいな、アートワークもコピーしたいなといろいろ便利にしようとして何度も作り直しました。
Automatorはあまり使わないのですが、なんとなく調べながら進めていたらでき優秀でしたのでもっと使っていきたいです
wsl上にdockerでjupyterlab環境構築


忘れないように忘備録として

# 実行環境
- windows11
- wsl2  Ubuntu 22.04.4 LTS
- docker 26.1.0 

# ディレクトリ構成

docker-jupyterlab
├── compose.yml
├── python
│   ├── Dockerfile
│   ├── requirements.txt
│   └── root_jupyter
└── workspace

# ファイル作成

Dockerfile、compose.yml、requirements.txt を作成

```Dockerfile
# パッケージをインストールするためのイメージ
FROM python:3.11.9-slim-bullseye as builder

COPY python/requirements.txt .

# パッケージの追加とタイムゾーンの設定
# libgomp1を入れないと、lightgbmをimportしたときエラーが出る
RUN apt-get update \
    && apt-get install -y \
    tzdata \
    libgomp1 \
    &&  ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \
    &&  apt-get clean \
    &&  rm -rf /var/lib/apt/lists/*

ENV TZ=Asia/Tokyo

# pythonパッケージ
RUN python3 -m pip install --upgrade pip \
    &&  python3 -m pip install --no-cache-dir -r requirements.txt

```


```compose.yml
services:
  python:
    container_name: docker-jupyterlab_python
    build:
      context: .
      dockerfile: python/Dockerfile
    restart: always
    entrypoint: >
      jupyter-lab --allow-root --ip=0.0.0.0 --port=8888 --no-browser --NotebookApp.token='' --notebook-dir=/workspace 
    expose:
      - "8888"
    ports:
      - "127.0.0.1:8888:8888"
    volumes:
      - ./python/root_jupyter:/root/.jupyter
      - ./workspace:/workspace

```


```requirements.txt
jupyterlab==4.2.0
jupyterlab_code_formatter==2.2.1
black==24.4.2
isort==5.13.2
icecream==2.1.3
polars==0.20.26
plotly==5.22.0
lightgbm==4.3.0
```

# 実行方法

compose.ymlファイルのあるdocker-jupyterlabディレクトリで以下コマンドを実行

- dockerイメージをビルド
`docker compose build`
- dockerコンテナを起動
`docker compose up -d`
- ブラウザで [http://localhost:8888](http://localhost:8888) にアクセス

以下の画面が表示されれば、jupyterlabの起動成功

![Pasted image 20240519000618.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780466/af0109dd-4636-39d1-0052-e55c57c721c9.png)

# おまけ

## pythonコンテナに接続したいとき

`docker exec -it docker-jupyterlab_python bash`を実行
## dockerコンテナの停止

`docker compose down`を実行

## コードフォーマッタの使い方

![Pasted image 20240518222506.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780466/276112de-a16b-724d-9d5f-f50d78db2e72.png)

赤い線で囲ったところをクリックするだけ


# 参考

[DockerでJupyterLabの環境を作ろう | インフォメーション・ディベロプメント](https://www.idnet.co.jp/column/page_187.html)

[３部: Docker Compose｜実践 Docker - ソフトウェアエンジニアの「Docker よくわからない」を終わりにする本](https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59/viewer/3-8-docker-compose)
[rockylinux8.9] NFSでファイル共有を行う手順

## 　[rocky linux 8.9]NFS(Network File System)でファイル共有を行う手順まとめ
ChatGPTに聴きまくってなんとか実装したNFSのログ
研究室の初心者輪講用にまとめましたが、備忘録も兼ねています。

## 前提
VM1~VM4が172.16.1.1~4の固定IPアドレスを持っています。
それぞれは外部（8.8.8.8等）への通信および他VMとの相互通信が可能です。

Rocky Linux release 8.9 (Green Obsidian)上に立てたRocky Linux release 9.4 (Blue Onyx)のVMで作業します。

NFSはバージョン4.2


## サーバー側の設定手順

### 1. 必要なパッケージのインストール

NFSサーバーパッケージをインストールする。

```bash
sudo dnf install nfs-utils　-y
```

例としてVM1の/homeを共有する。

### 2. `/etc/export` ファイルの編集

エクスポート設定を行うために `/etc/export` ファイルを編集する。
`/etc/export`はNFSでどのファイルをエクスポートするかの設定が書いてあるファイルである。

```bash
sudo vim /etc/export
```

以下の行を追加する。ここでは、172.16.1(人によっては172.16.2)のネットワーク全体に共有できるようにしたいので172.16.1.0/24とする。

```
/export/nfs 172.16.1.0/24(rw,sync,no_root_squash)
```
もしくは
```
/export/nfs 172.16.2.0/24(rw,sync,no_root_squash)
```
ちなみに。
rw=Read and Write 読み書き可能であることを指す。
sync=データがディスクに書き込まれる際にすぐにディスクに書き込まれることを保証する。順番が崩れないのでデータの一貫性が保たれるらしい。
no_root_squash=クライアント側のrootユーザがサーバ上のファイルシステムにフルアクセセスできるようにする。
(root_squash=クライアントのrootユーザが書き込む際にそのユーザを匿名ユーザにマッピングする)

### 3. エクスポート設定の再読み込み

設定を反映させるためにエクスポート設定を再読み込みする。

```bash
sudo exportfs -r
```

エラーがでなければ成功。

### 4. NFSサービスの起動と有効化

NFSサービスを起動し、自動起動を有効にする。これはそんなにやらなくてもいいけど一応。

```bash
sudo systemctl start nfs-server
sudo systemctl enable nfs-server
```

私の環境ではskipping,みたいなのが表示されたが、無視してもできた。解決できた人がいたら教えてください。
### 5. NFSサービスの状態確認

NFSサービスが正しく動作していることを確認したいならこれ。

```bash
sudo systemctl status nfs-server
```

active(runnning)と出れば成功。

### 6. エクスポート状態の確認

エクスポートされているディレクトリを確認する。

```bash
sudo exportfs -v
```
```
/home          	172.16.1.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
```
このような表示があれば成功。

### 7. `showmount` コマンドでエクスポート確認

サーバー上でエクスポートされているディレクトリを確認する。

```bash
showmount -e localhost
```
以下のように表示されたら成功
```
Export list for localhost:
/usr 172.16.1.0/24
```
## クライアント側の設定手順

### 1. 必要なパッケージのインストール

NFSクライアントパッケージをインストールする。

```bash
sudo dnf install nfs-utils
```

### 2. マウントポイントの作成

NFS共有をマウントするディレクトリを作成する。例えば、`homeVM1`を作成する。

```bash
sudo mkdir homeVM1
```

tips:
ディレクトリ内のディレクトリを作りたいときは-pで一発作成可能。
```bash
sudo mkdir -p NFS/homeVM1
```

入れないと親ディレクトリが存在しないと言われる。
```bash
sudo mkdir NFS/homeVM1
mkdir: cannot create directory ‘NFS/homeVM1’: No such file or directory
```

### 3. マウントコマンドの実行

サーバーのエクスポートされたNFSディレクトリをマウントする。

```bash
sudo mount -t nfs 172.16.1.1:/home homeVM1
```

### 4.確認
```bash
ls homeVM1
```
ファイルが見れれば基本的には成功している。ファイルを作成して反映されるか。読み書きができるかなどチェックしてください。

## デバッグのコツ
### 1.変更は必ず反映しよう。
ファイルを変更しただけではサーバに反映されないことはいままでもよくあったと思います。
今回であれば`exportfs -r`やdaemonの再起動により反映を行いました。

### 2.firewallは忘れた頃に邪魔してくる。
mountを実行してもサーバにアクセスできない、pingは通るのに。
そんなときはきっとfirewallがポートを塞いでいます。
```
sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --permanent --add-service=rpc-bind
sudo firewall-cmd --permanent --add-service=mountd
sudo firewall-cmd --reload
```
この辺りを実行して、firewall設定を行ってください。


## 要注意
マウントコマンドの実行は十分に気をつけて行うこと！！
```bash
sudo mount -t nfs 172.16.1.1:/home /etc
```
とかしないように！
(意図的に行う方は自己判断でお願いしますね。)
大事なファイル※をマウントポイントにすると、最悪linuxがお亡くなりになります。

大事なファイル以下を参照。
Linux基礎(ファイルシステムの構成&ファイル検索)
https://qiita.com/kakkie/items/6f81d8916a61aa49a47b
ConoHa VPSでのサーバー構成直後から一般ユーザssh接続まで【Ubuntu 22.04】

※正確に記録をとっていないため、一部冗長・不足のある可能性がある。

## 状態
- サーバーを 構成 or 再構成 した直後

## 要件
[port-number]番ポートでユーザ[username]がsshログインできるようにする

## ブラウザでの作業
![スクリーンショット 2024-02-18 090826.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694480/12c23cd6-b5b1-d681-129b-b395a3eee116.png)

## シェルでの作業
### ユーザ追加等
ブラウザからルートログインして作業する。
```bash
useradd [username] -d /home/[username] -m
passwd [username]  # パスワード設定
usermod -aG sudo [username]
```

### sshd_configの編集

```bash
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.old
sudo vim /etc/ssh/sshd_config
sudo systemctl restart sshd.service
```

sshd_config[に追記/で変更する]内容
```
Port [port-number]
PubkeyAuthentication yes
Protocol 2
PermitRootLogin no
PasswordAuthentication no

Match User [username]
    AuthorizedKeyFile /home/[username]/.ssh/authorized_keys
```

### ユーザ認証情報の設置

```bash
mkdir /home/[username]/.ssh
touch /home/[username]/.ssh/authorized_keys
vim /home/[username]/.ssh/authorized_keys  # 使う公開鍵を追記する
chown [username] /home/[username]/.ssh/authorized_keys
chown -R [username]:[username] /home/[username]/.ssh/*
chmod 600 /home/[username]/.ssh/authorized_keys
chmod 700 /home/[username]/.ssh/
```

### ファイアウォールの設定

```bash
ufw enable
ufw reload
ufw allow [port-number]
ufw reload
```

### エラー"sudo: unable to resolve host [hostname]"が出る場合

```bash
sudo vim /etc/hosts
```

以下を追記する。
```
127.0.0.1 localhost
127.0.1.1 localhost
127.0.1.1 [server-ip in the format: www-xxx-yyy-zzz]
```

## 参考文献
   - https://www.codelab.jp/blog/?p=1588#toc5
   - https://t-dilemma.info/windows-openssh-limit-groups/
   - https://remylog.com/ufw/
   - https://techracho.bpsinc.jp/annotunzdy/2022_09_20/4837
   - https://hyperschool.net/textbook/vccw/6010_vccw_public_key.html
WSL2でWindows上のUbuntuを動作させてngnixでWebサーバーを立ち上げる方法

# Phase1. Webサーバーをつくる方法

### STEP1. WSL2でWindows上にUbuntuをインストールする
https://learn.microsoft.com/ja-jp/windows/wsl/install

### STEP2. Ubuntu上にngnixをインストールしてngnixでWebサーバーを立ち上げる。

 ```
sudo apt update
sudo apt install nginx
```
インストールが完了したら`nginx -v`でインストールが正常に完了したか確認できる。

 ```
sudo service nginx start
```
でサーバーを起動できる。

ここまでの設定で手元のWindowsパソコンでhttp://localhost あるいは http://[UbuntuのローカルIPアドレス]でngnixのサンプルサイトにアクセス可能になる。


# Phase2. 同一LAN内の他のPCでサンプルサイトにアクセスする方法

### STEP3.  Windows PCのローカルIPのパケットをUbuntuの仮想マシンにポート転送(ポート解放する)


http://[Windows PCのローカルIPアドレス]でngnixのサンプルサイトにアクセスできるようになる。

もしできない場合, ルーターの設定に問題があるのかもしれない。ルーターの設定で同一LAN内から他のPCに対してアクセス制限がかかる設定がある。その設定を解除する必要がある。

# [Phase3] 世界中からサンプルサイトにアクセスする方法

### STEP4.  ルーターからのWindows PCのパケットを仮想マシンにポート転送(ポート解放)する。
ルーターを設定するにはふつうは[http://192.168.1.1](http://192.168.1.1)にブラウザーを開けばルーターの設定画面に到達する。ルーターのメーカーによって方法が異なるから, 「ルーターの機種　ポート解放」などでGoogle検索する。


### STEP5. Windowsのファイアウォールの設定を変更する. 

これでhttp://[グローバルIPアドレス]でngnixのサンプルサイトにアクセスできるようになる。


【おまけI】手元のPCから構築したUbuntuにシェルでアクセスする方法

https://qiita.com/yabeenico/items/15532c703974dc40a7f5



【おまけII】SSH接続で公開鍵, 秘密鍵方式を用いて安全にSSHでログインする方法



【おまけIII】作ったサイトをhttps化する方法
ゆめみの1dayインターンに参加してきた(サーバーサイド)

# はじめに

2024年5月18日開催の「【5/18 春のゆめみ1dayインターン】脱個人開発！プロの設計手法を学ぼう！1dayワークショップ」に参加してきました！
学校のプログラムで行ったインターンを除けば初めてのインターンということで、多くの学びがあったため忘れないうちにアウトプットしておきます！

# 参加した理由

1. 元々インフラに興味があり、サーバーサイドの技術について学びたかった
2. DBやAPIをきちんと設計したことがなかったため、実際に業務ではどのような考えで設計が行われているのか学びたかった
3. ゆめみという会社を知り、企業選びの参考にしたかった

# 参加までの道のり

1. サポーターズから申し込み
2. Webテスト

# 1dayインターンのスケジュール

## 午前

- 会社紹介
- グループ別交流

## お昼ご飯

ゆめみさんが高級うな重弁当や高級サーロイン弁当などを支給してくださったため、学生には手の届かない美味しいお弁当を自宅で食べることができました。ちなみに私は、うな重を頼ませていただきました。非常に美味しかったです！ゆめみさんありがとうございました！

## 午後

- グループワーク(約4時間)
- グループ発表
- 振り返り会

## インターン概要

- 参加人数 : 12人(学生)　+ 4人(社員)

## グループ別交流

グループ別交流では簡単な協力型のゲームをアイスブレイクとして行いました！
チームとしての連携や戦略が求められるためいい感じに会話が生まれ、楽しかったです。
予想外の攻略法などもあり、意外と奥が深いのも魅力の味のあるゲームでした。
気になった方はぜひインターンに参加してみてください！

## 昼食タイム

昼食の時間も社員の方がZoomを繋げて話してくださったため、弁当は美味しいし話は楽しいしで最高でした！

## グループワーク

詳しい内容を言うことはできないので、ざっくりと概要のみお伝えします。
私たちが与えられた課題は、ある商品販売システムのDB,APIの設計です。途中まで書かれた設計書と要件定義書が与えられるので、要件に従って設計していく形になります。
作成しなければならなかったものは、

1. ER図
2. APIの設計
3. シーケンス図

でした。

グループワークではメンターさんが一人ついてくださり、つきっきりで相談に乗ってくださいました！

## グループ発表

最後のグループ発表では、正直なところ他のグループの完成度に圧倒されました。
スコープの広さ、DB設計の緻密さ、要件で抜け漏れがないかのチェックなど、ただ要件通りに設計することに一杯一杯だった自分には思いもよらないことだらけでした。
しかし、私たちのチームもメンターさんの力も借りながら精一杯できることをやったため、この経験は必ず次に生きると考えています！
貴重な経験をさせてくださったゆめみさんには本当に感謝しています！

## 振り返り会

最後に社員の方が設計例とその理由を解説してくださいました。
今まではシーケンス図やER図を見てもなんとなく意味がわかる程度でしたが、今回は4時間必死に頭を使っていいものにしようと考えていたため、設計例を見て「なるほどそうすればよかったのか！」と、目から鱗が落ちる思いでした！

# 1dayインターンシップ(サーバーサイド)から得られた学び

特に技術に関して得られた学びとしては、以下のようなものが挙げれらます。

- ER図やシーケンス図のMermaid記法を用いた書き方
- 多対多のリレーションはデータベースを破綻させてしまうため、中間テーブルを置いて解決する必要があるということ(これが一番難しかった！)
- シーケンス図に示すような動作を行うAPIのBodyやResponseの設計
- APIの設計からDBの設計を考えること
- どこまでを考慮対象に入れるかを最初に話し合ってスコープを共有する重要性
- 時間配分、タイムキープの重要性(特に午後は気がついたら終わってました)

特にスコープの概念や多対多のデータベース設計については、まだまだ理解が甘いため今後も研鑽を積む必要があると感じました。また、時間が限られた1dayインターンシップでは所定の成果を出すために時間配分が非常に重要であるため、このようなイベントの場合にはタイムキープを強く意識する必要があると感じました。

# 初めて1dayインターンに参加した感想

今回のイベントを通じて、DBやAPIの設計についてのイメージを持つことができました。
正直、最後のグループ発表では自分の力の低さを痛感しましたが、本選考までには力をつけてレベルアップして就活に臨みたいと考えています！
また、イベント中ゆめみの社員さんは気さくに話してくださり、非常に気持ちよくインターンに参加することができました！

本当にありがとうございました！
【TailwindCSS】背景色と文字色を反転する方法

以下のように`mix-blend-*`を使用すると背景色に合わせて文字色が変更されます。

```html
  <div className="h-6 w-12 bg-[linear-gradient(to_right,_white_50%,_black_50%)]">
    <h1 className="font-bold text-white mix-blend-difference">テスト</h1>
  </div>
```

![スクリーンショット 2024-03-21 1.22.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/5cdc6959-cc25-60c5-a415-5b3904c60c13.png)
ABC354をPythonで（A～E）

パナソニックグループ プログラミングコンテスト2024（AtCoder Beginner Contest 354）の解答等のまとめ

https://atcoder.jp/contests/abc354

# A問題
問題文通りにシミュレーションする
```python:A
h = int(input())

t = 0
i = 0
while h >= t:
    t += 2 ** i
    i += 1

print(i)
```
# B問題
問題文の通りにする
```python:B
n = int(input())
t = 0
lst = []
for _ in range(n):
    s, c = input().split()
    lst.append(s)
    t += int(c)

lst.sort()
print(lst[t % n])
```
# C問題
カードを強いほうから降順にソートする
強いほうから見たときにすでに出たコストより大きいものがあったときは対象にならないので除外
```python:C
n = int(input())
card = [tuple(map(int, input().split())) for _ in range(n)]

d = {c_i: i for i, c_i in enumerate(card, 1)}

card.sort(reverse=True)
cost = float("inf")
ans = list()
for a, c in card:
    if cost >= c:
        cost = c
        ans.append(d[(a, c)])

print(len(ans))
print(*sorted(ans))
```
# D問題
ぱっと見で面倒そうだったからさきにEを解いてから解き始めた
$4 \times 2$で繰り返しているのを使って累積和のように解こうとしたがうまくいかなかった

# E問題
とってないカードのパターンはbitの範囲で収まるから

$dp[bit] = $とってないカードが$bit$の時に勝てるか

として各局面でとれるペアを取ったその先の盤面が負け盤面だったらTrueにする
```python:E
n = int(input())

card = [list(map(int, input().split())) for _ in range(n)]
ANSWER = ["Takahashi", "Aoki"]

edge = [[False] * n for _ in range(n)]
for i in range(n):
    for j in range(i):
        if card[i][0] == card[j][0] or card[i][1] == card[j][1]:
            edge[i][j] = True
            edge[j][i] = True

dp = [False] * (1 << n)  # 勝てる手があるならTrue
for bit in range(1 << n):
    for j in range(n):
        if bit >> j & 1:
            for i in range(j):
                if bit >> i & 1 and edge[i][j] and not dp[bit - (1 << i) - (1 << j)]:
                    dp[bit] = True

print(ANSWER[dp[-1] ^ 1])
```
Amazon EventBridge

# はじめに
この記事はAWS SAA試験勉強のための、AWS EventBridgeに関する知識のまとめです。

# Amazon EventBridgeとは
Amazon EventBridge は、コードを作成せずに、AWS のサービス、独自のアプリケーション、Software as a Service (SaaS) アプリケーションのデータの変更にリアルタイムにアクセスできるサービスです。
以前は Amazon CloudWatch Events と呼ばれていました。

# Amazon EventBridgeの基本的性質


Amazon EventBridgeでは、スケジュールに基づいて **AWS Lambda 関数を実行する**ルールを設定できます。その際は、lambda:InvokeFunctionをアクションに設定し、EventBridge サービスプリンシパル (events.amazonaws.com) のアクセス許可を使用してルールを実行するには、add-permission コマンドを使用します。

# Amazon EventBridge スケジューラ

EventBridge スケジューラでは、繰り返しのパターンに cron やレート式を使ってスケジュールを作成したり、1回限りの呼び出しを設定したりできます。配信の時間枠を柔軟に設定したり、再試行制限を定義したり、失敗したトリガーの最大保持時間を設定したりできます。

# Amazon EventBridgeルール

イベントがイベントパターンに一致したときに処理を実行させるときは、スケジュールではなくルール。

# Amazon EventBridge API 送信先(API destinations)

EventBridgeから<font color="red">**サードパーティAPIを呼び出す場合**</font>は、Amazon EventBridge API 送信先を利用します。


# Amazon EventBridgeの使用例
Amazon EventBridgeを利用することで、有効期限が切れる予定の証明書を検出して、直接Amazon SNSと連携したアラーム通知を実施することが可能です。その時はLambda関数は必要ありません。
Ajax通信とSOPについて

今回は、Ajaxとそれに伴って学んだ同一オリジンポリシー（SOP)についてアウトプットしていきます。

## Ajaxとは

JavaScriptからHTTP通信ができるオブジェクト **XMLHttpRequest** を利用し、サーバ通信を行う技術のこと。

非同期でサーバとデータの通信を行うのでユーザビリティが向上するらしいです。
また、ページの遷移や再読み込みをしないで、DOMを書き換えて表示を変化させるため、処理スピードも早くなります。

## Ajax通信の準備

- **htmlファイル**

実装させたい機能に応じて作っておきます。

- **JSONファイル**

データフォーマットの一つ。Ajaxを用いたデータの送受信に使われており、今回もこちらを使用していきます。
昔はXMLHttpRequestオブジェクトの名前にもあるXMLが主流だったらしいけれど、最近はJSONに代わってきたとのこと。

この中に、オブジェクトなどの引っ張ってきたいデータを入れておきましょう。

- **JavaScriptファイル**

基本的な記述の流れはこんな感じ。

```jsx
//1.XMLHttpRequestオブジェクトを作る
const request =new XMLHttpRequest();

//2.イベントハンドラを設定
request.onload = function () {
//処理
}

//3.リクエストを送信(この時、必要に応じて追加設定も行う）
request.open('GET','bbb.json');
request.send();
```

ただ、このままブラウザでファイルを表示させるだけだと、エラーが出てしまい、正常に動作はしません。

なぜかというと、ブラウザの仕組みとして、同じオリジンのみ通信を許可する**同一オリジンポリシー(Same Origin Policy)** というものが存在するからです。

## 同一オリジンポリシー（SOP）

同一オリジンポリシーとは、MDNではこのように説明がなされています。
>同一オリジンポリシーは重要なセキュリティの仕組みであり、あるオリジンによって読み込まれた文書やスクリプトが、他のオリジンにあるリソースにアクセスできる方法を制限するものです。

引用：[同一オリジンポリシー](https://developer.mozilla.org/ja/docs/Web/Security/Same-origin_policy "MDN")

始めに見た時に正直あんまり良くわからなかったので、イラスト付きで表現してみました。

まず、 **くまさん組(kuma.com)** というサイトと **うさぎさん組(usagi.com)** というサイトがあります。

![うさくま.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788428/0e0de6f1-7a2b-5b48-0038-cccdf49b9680.png)


くまさん組は、自分の組の集会(サイト)にくまさん組とうさぎさん組のメンバーを呼びたいと考えましたが、果たしてメンバーを呼ぶことはできるのでしょうか？

![クロスオリジン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788428/6e9c7876-46b1-572e-c4f0-9ab185f96f79.png)

くまさん組のメンバーを呼ぶことはできましたが、うさぎさん組のメンバーを呼ぶことはできませんでした。
なぜなら、 **うさぎさん組のメンバーとくまさん組のメンバーはオリジンが違うので、同一オリジンポリシーの制限に引っかかってしまうのです。**

さて、それではなぜこのような制限がされているのかというと、もしも仮にくまさん組が悪い組織だったとすると、この制限がかかっていなければ、勝手にうさぎさん組の情報を抜き出されてしまうかもしれないからです。

![悪いくまさん.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788428/1d9e01ee-37f8-fb68-9b8b-f334bb79fb22.png)

自分の個人情報をうさぎさん組に預けていたのに、それを勝手に悪いくまさん組によってばら撒かれてしまったりしたら大変ですよね。

同一オリジンポリシーがなければ、うさぎさん組のメンバーは悪いくまさん組に連れて行かれて、情報を奪われてしまうかもしれません。
しかし、同一オリジンポリシーがあると、少なくとも勝手に連れて行かれることがないので、悪用されることを減らすことができるのです。

ちなみに、異なるオリジンからリクエストを送信することを**クロスオリジン通信** と言い、上記の同一オリジンポリシーの観点から、ブラウザでは基本的に**クロスオリジン制限** がかけられています。

なお、このクロスオリジン制限を回避する方法として、 **CORS** という手法がありますが、今回は使わないので、割愛させていただきます。

## クロスオリジン制限の回避

 でも、今回はディレクトリ内の通信をするだけなのにどうしてクロスオリジン制限を回避するの？と疑問に思うかもしれません。

実は、Chromeなどではスキームが`file:`になっているオリジンは、 **ローカル内のAjax通信も規制がかかってしまうのです。** 
そのために、今回はNode.jsを活用してスキームを`file:`から`http:`へ変更して表示する方法を使っていきます。

まず、準備として Node.jsとnpmのダウンロードを行います。

次に、`npm install -g http-server`とターミナルで入力して、インストールをしましょう。
そして、インストールが無事に終了したら、ターミナルで対象のディレクトリへ移動し、`http-server -c-1`とコマンドを入力すれば、サーバが起動します。

試しに、起動した`http://127.0.0.1.8080/`へアクセスをしてみてください。エラーが出ないで自分の作った先ほどのファイルがしっかりと開くことができていれば、もう大丈夫です。

このあとは、存分にコードをあれこれ書いていって、理想の機能を実装していきましょう。
AI Builderのプロンプトビルダーカスタマイズ機能

AI Builderのプロンプトビルダーカスタマイズ機能が追加されました！
この機能によりすごく便利になったプロンプトビルダーを試してみましょう
https://aka.ms/tryprompts

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/d39b7764-c68e-49df-31c6-d0200053404a.png)


# モデルの種類について

設定セクションのドロップダウンメニューでは、カスタムプロンプトの回答を生成する生成AIモデルの中から選択することができます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/4cd4cbae-241f-fa3a-49f0-24e068bc8070.png" width=50%>

2024年5月現在、デフォルトのモデルはGPT 3.5 turboです。
これまでにプロンプトビルダーで作成されたカスタムプロンプトは、このデフォルトモデルに依存しています。

::: note

正確なバージョンはGPT 3.5 turbo 0613です。
GPT 3.5 turbo 0613が非推奨になるため、6月中にGPT 3.5 turbo 0125モデルに切り替わる予定です。
::: 

GPT 3.5モデルは、Power AppsまたはPower Automateで使用する場合、AI Builderクレジットを消費します。

2024年5月現在、利用可能なもう1つのモデルはGPT 4です。
**プレビューモデルである間は、Power AppsまたはPower Automateで使用してもAI Builderクレジットは消費されません**。

プレビューモデルであるため、環境設定のAI Builderプレビュートグルに連動をオンにしているかどうかで使用を制御できます。

細かい機能については以下の表でご確認ください。
|   |  GPT 3.5|GPT 4|
| ---- | ---- |---- |
| ステータス |  GA - デフォルト | プレビュー|
|  バージョン  |  gpt-3.5-turbo-0613  |gpt-4-32k-0613|
|  ライセンスルール |  Power AppsとPower Automateのクレジットを消費。|プレビュー中は消費しない|
| 詳細 |  2021年9月までのデータで学習。文章は16kトークンまで|2021年9月までのデータで学習。文章は32kトークンまで。多言語に対応。|

::: note
GPT4.0は技術的な情報をもとに文書を作る力と創造性においてGPT3.5より優れているといわれています。場合を分けて、使い分けてみてください。
:::

# プレビューモデル(GPT-4)をオン・オフする方法
[Power Platform 管理センター](https://admin.powerplatform.microsoft.com/environments) にサインインし、設定したい環境を選択します。
[設定] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/644f97aa-dd34-3733-6502-0178915cde22.png)

[製品]を開き、[機能] を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/cde87b4a-b39b-ed53-7c5e-e124e523dca2.png)

[AI Builder]の[プレビューモデル]のトグルでオン・オフを切り替えます。
プレビューモデルがオフの場合、GPT 4はドロップダウンメニューで選択できず、GPT 4で作成されたプロンプトはブロックされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/20cdc628-8653-52b7-0d2a-002250cb11ef.png)

::: note
正確なバージョンは変更される場合があります。
2024年5月現在、GPT-4 0613バージョンを使用しています。

:::

# temperature
設定セクションのスライダーは、生成AIモデルのtemperatureを選択することができます。
0から1の間で変化し、生成AIモデルが出す回答を、創造性のある回答にする(1)のか、決定論的な回答(0)にするのかをガイドします。

デフォルトの温度は 0 です。
これまでにプロンプトビルダーで作成されたカスタムプロンプトも同様に 0 になっています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/5a96832d-b6c8-2e00-f96d-99be0a5b2c9b.png" width=50%>

temperatureは、AIモデルによって生成される出力のランダム性を制御するパラメータです。
- temperatureが低いほど、予測可能で保守的な出力になる
- temperatureが高いほど、回答に創造性と多様性が生まれる

これは、モデルの出力におけるランダム性と決定性のバランスを微調整する方法となります。
Unityデフォルトのコンポーネントを触れなくする方法

# はじめに
特に規模が大きいプロジェクトだと、Unityのコンポーネントを直接使わずに、プロジェクトごとでラップすることがあると思います。

しかしUnityのコンポーネントをラップするだけでは、そのラップしたコンポーネントを使ってくれるとは限りません。
その解決案として今回は、Unityデフォルトのコンポーネントを触れなくしてみようと思います。

# Imageコンポーネントの場合

```cs
[CustomEditor(typeof(Image), true)]
[CanEditMultipleObjects]
public class HideImageComponent : ImageEditor
{
    public override void OnInspectorGUI()
    {
        EditorGUI.BeginDisabledGroup(true);
        DrawDefaultInspector();
        EditorGUI.EndDisabledGroup();
    }
}
```


<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2649682/619b2e60-4b32-01ab-fb3e-27ee1857ab33.png">

グレーアウトしている部分が触れなくなっています。
チェックボックスを数えて内容が違う場合にはツールチップを出す


```
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Rotate and Center with Proportional Div2</title>
    <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
    <style>
      .disabled {
        opacity: 0.5;
        pointer-events: none;
      }

      .tooltip {
        display: none;
      }
      .tooltip_wrap:hover .tooltip {
        display: inline-flex;
        background: #333;
        color: #fff;
        padding: 5px;
        border-radius: 5px;
        font-size: 12px;
      }
      .tooltip-visible {
        display: inline-block;
      }
    </style>
  </head>
  <body>
    <div class="selectbutton">
      <button class="selectall disabled">all</button>
      <button class="ikkatsu disabled">ikkatsu</button>
    </div>
    
    <div class="checkList">
      <input type="checkbox" class="selects" />
      <label for="selects">check1</label>
      <span class="product">pc</span>
    </div>
    <div class="checkList">
      <input type="checkbox" class="selects" />
      <label for="selects">check2</label>
      <span class="product">pc</span>
    </div>
    <div class="checkList">
      <input type="checkbox" class="selects" />
      <label for="selects">check3</label>
      <span class="product">tablet</span>
    </div>

    <script>
      $(document).ready(function() {
        $('.selects').on('change', function() {
          const checkedCheckboxes = $('.selects:checked');
          const checkedCount = checkedCheckboxes.length;

          // 更新 selectall ボタンの状態
          if (checkedCount > 0) {
            $('.selectall').removeClass('disabled');
          } else {
            $('.selectall').addClass('disabled');
          }

          // すべてのチェックされた product クラスの値を取得
          const products = checkedCheckboxes.closest('.checkList').find('.product').map(function() {
            return $(this).text();
          }).get();

          // すべての product クラスの値が同じかどうかを確認
          const allSameProduct = products.length > 0 && products.every(val => val === products[0]);

          // 更新 ikkatsu ボタンの状態
          if (allSameProduct && checkedCount > 0) {
            $('.ikkatsu').removeClass('disabled');
            $('.ikkatsu').parent('a').contents().unwrap(); // aタグとspanを削除
            $('.ikkatsu').siblings('span').remove(); // 既存のspanを削除
          } else {
            if (!$('.ikkatsu').hasClass('disabled')) {
              $('.ikkatsu').addClass('disabled');
              // aタグで囲み、spanを追加
              $('.ikkatsu').wrap('<a class="tooltip_wrap"></a>').after('<span class="tooltip">ここにツールチップが入ります</span>');
            }
          }
        });
      });
    </script>
  </body>
</html>
```
ソフトウェアと建築、映画との比較

ソフトウェアと建築、映画との比較https://researchmap.jp/blogs/blog_entries/view/78772/4ec2fb4a77c7fc8cff040440cf8ed2c8?frame_id=416173

<p>ソフトウェアと建築、映画とを比べるといろいろなことがわかる。<br /><br />建築現場では、機械と人間がそれぞれ活躍する。<br />機械は、輸送機械ではトラックのような汎用的な機械もあれば、タンクローリーのような専用の機械もある。<br /><br />ソフトウェアでは、計算機と人間がそれぞれ活躍する。<br />計算機は、PCのような汎用的な計算機もあれば、オシロスコープのような専用の計算機もある。計算機能が豊富なオシロスコープの中には、PCになりうる基盤が入っていることもある。ちょうとタンクローリーの土台が、トラックと同じだったりするのと同じように。</p>
React初学者がTodoアプリの画面を作る

### はじめに
プログラミングコーチングJISOUでReactとTypeScriptの学習に取り組んでいます

### 課題
エンジニアとしての学習時間は1000時間が必要と言われています。そこで日々の学習の内容と学習時間を記録するアプリを作ることにしました。


![スクリーンショット 2024-05-18 20.27.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3502843/00a8f11b-a7a2-9260-9590-9ce4b4fdfd76.png)


### 書いたコード

```mvp1.js
import React from "react";
import ReactDOM from "react-dom/client";

const records = [
  { title: "勉強の記録1", time: 1 },
  { title: "勉強の記録2", time: 3 },
  { title: "勉強の記録3", time: 5 },
];

function App() {
  return (
    <div>
      <h1>学習記録一覧</h1>
      <ul>
        {records.map((record, index) => (
          <li key={index}>
            {record.title}：{record.time}時間
          </li>
        ))}
      </ul>
    </div>
  );
}

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<App />);

```

### 画面のプレビュー
![スクリーンショット 2024-05-18 20.28.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3502843/33a277fa-16fb-1c6f-e2e2-dcf5d7c010c2.png)

### 処理の説明

```mvp1.js
import React from "react"; // ReactライブラリをインポートしてReactコンポーネントを作成する
import ReactDOM from "react-dom/client"; // ReactDOMライブラリをインポート。Reactコンポーネントをブラウザ上に描画するために使用

const records = [
  { title: "勉強の記録1", time: 1 },
  { title: "勉強の記録2", time: 3 },
  { title: "勉強の記録3", time: 5 },
]; // 学習記録のテストデータを定義

function App() { // Appという名前の関数コンポーネント。Reactコンポーネントの中心となる部分
  return (
    <div>
      <h1>学習記録一覧</h1> {/* 学習記録一覧のタイトルを表示するh1要素 */}
      <ul> {/* 学習記録のリストを表示するul要素 */}
        {records.map((record, index) => ( // records配列に対してmap関数を適用して、各要素に対して処理。アロー関数を使用して、各要素（record）とそのインデックス（index）を受け取る。Pythonで慣れているforループじゃないのでここが一番戸惑った
          <li key={index}> {/* 各学習記録をli要素として表示 */}
            {record.title}：{record.time}時間 {/* 各学習記録のタイトルと学習時間を表示 */}
          </li>
        ))}
      </ul>
    </div>
  ); // Appコンポーネントの描画内容を返す。JSX使用。
}

const root = ReactDOM.createRoot(document.getElementById("root")); // ReactDOM.createRoot関数を使用して、ルートを作成
root.render(<App />); // ルートに対してAppコンポーネントを描画

```



### 困ったこと
ローカルのReactの環境構築がめんどくさくて心が折れたので、codesandbox　で画面確認をした。node.js入れて終わり！みたいな感じかと思っていたら、意外とやることが多くて明日に回す。


### 感想1
Notionを使い始めて5年ぐらい経つのですが、Notionに慣れているとQiitaでマークダウンを自分で書かないといけないのが**死ぬほど使いづらい**のですが、みなさんは何かツールを使って書いているのでしょうか。色々覚えないで装飾する方法があったら教えてください。覚えるの嫌なのでいまのところ「###」 と 「```」　しか使っていません...（あ、この感想で「**」も使いました。こうやっているうちに勝手に覚えるのでしょうか。）

### 感想2
JISOUのコミュニティ(slack)が熱量が高くていいコミュニティだなと思います。詳しくは↓のリンクで見られます。
プロジェクト管理における効果的なコミュニケーション技術

プロジェクトを成功させるためには、チーム内でのコミュニケーションが非常に重要です。プロジェクト管理において効果的なコミュニケーションを実現するための基本的な技術を紹介します。

### オープンコミュニケーションの促進

**オープンコミュニケーション**とは、チームメンバーが自由に意見や質問を言える環境を作ることです。これにより、問題が早期に発見され、チーム全体が協力しやすくなります。

**具体例**:
- **定期的なミーティング**: 毎週のミーティングを設定し、全員が意見を言える時間を作ります。
- **フィードバックの奨励**: チームメンバーからの意見やフィードバックを積極的に求め、それを元に改善します。

### 効果的なリスニングスキル

**効果的なリスニング**とは、相手の話をしっかりと聞き、理解することです。これにより、チームメンバーが安心して話せる環境を作り、重要な情報を見逃しません。

**具体例**:
- **質問をする**: 相手の話を聞いて、わからない点や詳細を確認するために質問をします。
- **メモを取る**: 重要な情報を逃さないように、話を聞くときにメモを取ります。

### クリアなメッセージング

**クリアなメッセージング**とは、重要な情報をわかりやすく伝えることです。これにより、誤解が生じることなく、全員が同じ目標に向かって進むことができます。

**具体例**:
- **視覚的なツールの使用**: 図や表を使って情報を視覚的に示します。例えば、プロジェクトの進捗状況をグラフで表示するなど。
- **ポイントを絞る**: Eメールや報告書では、重要なポイントを箇条書きにして強調します。

## 結論

効果的なコミュニケーションは、プロジェクトの成功に欠かせません。オープンなコミュニケーションを促進し、効果的なリスニングスキルを身につけ、クリアなメッセージングを行うことで、チーム全体の協力が深まり、プロジェクトがスムーズに進行します。これらの技術を活用して、プロジェクト管理をより効果的に行いましょう。