OmniAICreator/Qiita-1.07M huggingface dataset:
OACの分析ホームページが権限不足で開けない場合の解決方法

このシリーズの他の記事は、[オラクル・クラウドの個人ブログ一覧 ](https://qiita.com/letian/items/10152a4fec813c1b7d98)からご覧いただけます。

## 問題現象
OACインスタンスの詳細画面から、「<strong>分析ホームページ</strong>」をクリックすると、以下のようなメッセージが表示され、アクセスできません。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/fba0fdc1-feb6-facb-0d03-488b3404ad9f.png", width="600">

## 解決方法
管理者ユーザーでログインし、「<font color=blue>追加詳細</font>」のタブに、<strong>アプリケーション</strong>のリンクをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/ff2550be-1da8-df86-9288-c02c11fa92d2.png)

アプリケーションの詳細画面が表示されたら、リソースのメニューから<strong>アプリケーション・ロール</strong>を選択します。"<font color=blue>ServiceAdministrator</font>"の行を展開し、「<strong>管理</strong>」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/c30ec8ed-3128-d730-4e6e-250348aceb1b.png)

次に、「ユーザー割当ての管理」画面が表示されます。デフォルトでは、<strong>インスタンス作成者</strong>のみが管理者権限を持ちます。他のユーザーに管理者権限を付与したい場合、「使用可能なユーザーの表示」をクリックして、ユーザー一覧をリストします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/c3b7f229-1a6f-709f-0309-f162c03b5e37.png", width="500">

対象ユーザーをチェックし、「<strong>割当て</strong>」てをクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/093b5d85-15c3-ce33-f891-6a7e343ba855.png", width="500">

追加後、割当て済ユーザーの一覧から確認できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/7abf1d4f-2ebf-5e4a-9461-86bdaff25ddb.png", width="500">

割当てられたユーザーでログインし、もう一度「分析ホームページ」を試していただき、正常に開けるかを確認してください。

以上です。

----
__関連記事__
[Oracle Analytics Cloud に関するFAQ](https://qiita.com/letian/items/eaca95c40a24c9d2027a)

__参考資料__
[My Oracle Suport (MOS) Doc ID 2944586.1](https://support.oracle.com/knowledge/Oracle%20Cloud/2944586_1.html)
discordアプリの作成とサービス登録(debian)

とあるゲームのボス討伐時間と次の出現時間をdiscordのチャンネル上で管理するBOTを作成してみた。

使用言語は、Python
データ管理はPandasのデータフレームで検索や結合処理もできるので、データベースまでは必要ないかなとおもったので一旦CSVファイルを活用。

## サービス登録する際に躓いた点

1.systemctlへの登録方法
aptなどでインストールしたサービスの起動、停止などの方法は理解していたが、自分で作ったスクリプトを登録する方法などは今回始めて知った。
### systemctlに設定するファイルを作成
```
$ sudo vi /etc/systemd/system/hogehoge.service
```


```config
[Unit]
Description = *****

[Service]
ExecStart = path_to_file
ExecStop=/bin/kill ${MAINPID}
Type = simple
Environment=PYTHONPATH= pythonライブラリへのPATH
User= 実行ユーザ名
[Install]
WantedBy = multi-user.target
```
|パラメータ|値|
|---|---|
|ExecStart|実行するファイルへのフルパス。ファイルには実行権限を付与|
|ExecStop|stop時のコマンド|
|Environment|Pythonライブラリへのパス。pip show discordなどしてパッケージのlocationを記述|


サービスとして認識されているか確認する。
```
$ sudo systemctl list-unit-files --type=service
```


サービスを有効化して、起動する。
```
$ sudo systemctl enable サービス名
$ sudo systemctl start サービス名
```


2.サービス登録するとrootユーザでの実行環境になるため、システムデフォルトのpythonへのパスでうごいてしまうので、pyenvで用意したpythonのユーザ実行環境がそのまま使えないので、rootユーザ起動時の環境変数の読み込み、特にPATHの書き換えて実行する必要がある。

```shell
$ sudo visudo
```

以下を追加して、ログインユーザの環境変数を追加
```
Defaults    env_keep += "PATH"  # 追加
Defaults    env_keep += "PYENV_ROOT"  # 追加
```

参考（そのままかも）
* [Pythonで書かれたDiscord用Botスクリプトをsystemdでサービス化する](https://blog.fascode.net/2021/02/03/python-discordbot-systemd/)
* [Systemdを使ってさくっと自作コマンドをサービス化してみる](https://qiita.com/DQNEO/items/0b5d0bc5d3cf407cb7ff)
* [linuxに、root userでも使えるpyenv環境の構築](https://qiita.com/u_kan/items/d7e602bf1cf52f6b0935)
* [誰でも作れる！Discord Bot（基礎編）](https://note.com/exteoi/n/nf1c37cb26c41)
値オブジェクトを知らない見習いエンジニアが多すぎる

## はじめに

値オブジェクトを知らずにコードを書いている見習いエンジニアが多すぎる！！
私のことです、ごめんなさい。
n番煎じな上にお粗末な記事ですが、見習い・駆け出しエンジニアの0→1になればと思います。

## 値オブジェクトとは

値オブジェクト（Value Object）とは、アプリケーション内で使用する値をそのルールや制限に基づいて扱うための専用クラスです。

簡単にいうと、こういうことです。本当は他にも色々な定義がありますが、それらを考えるのは今は良いです。
決して、説明できないということではないです。決して。

## とりあえず具体例

javaでクレジットカードを扱うアプリケーションを開発するとしましょう。
あなたは、カード番号をLong型で定義しますか？String型で定義しますか？
値オブジェクトを用いる場合、CreditCardNumber型で定義します。
実装例は以下です。
（カード番号の定義は12桁の数字、ただし先頭の数字は1~9とします。）

```java
class final CreditCardNumber {
    String value;

    CreditCardNumber(String value) {
        this.value = value;
    }

    private void checkValue(String value) {
        if (!isCorrectValue(value)) {
            throw new IllegalArgumentException();
        }
    }

    private boolean isCorrectValue(String value) {
        if (value == null) {
            return false;
        }

        if (value.matches("[1-9][0-9]{11}")) {
            return true;
        }

        return false;
    }
}
```

## 値オブジェクトを使用するメリットって何なの？

値オブジェクトを利用することで、以下のようなメリットが得られます。

- 定義上不適切な値が混入することを避けられる
- コードが分かりやすく、安全になる
- 定義の変更もそのクラスに閉じ込めやすくなる
- 業務ロジックを閉じ込めることができる

## またまた具体例

文章だけだと分かりにくいので具体例を示します。
先ほどの例を引き続き使い、CreditCardクラスを定義します。

まず、javaの基本型だけで定義します。

```java
class final CreditCard {
    String firstName;
    String lastName;
    String creditCardNumber;
    LocalDate cardExpiration;

    CreditCard(String firstName, String lastName, String creditCardNumber, LocalDate cardExpiration) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.creditCardNumber = creditCardNumber;
        this.cardExpiration = cardExpiration;
    }
}
```

上記の実装には、以下のようなデメリットがあります。
- 定義上不適切な値が混入する可能性がある。例えば、「カード番号は12桁の数字」という定義があってもそれ以外の値が混入する可能性があります。
- このクラスのコンストラクタを使用する際、分かりにくく、バグ混入の可能性がある。例えば、第1〜3引数は全てString型であり、それぞれの順番を間違えて代入する可能性があります。
- カード番号などの定義適用がどこでされるのかが不明瞭であり、変更の工数（影響範囲調査も含む）、バグの混入可能性が増えます。

先程列挙した値オブジェクトのメリットも見るとこれらのデメリットが解消できそうです。
それでは、値オブジェクトを使用した実装を見てみましょう。

```java
class final CreditCard {
    UserName userName;
    CreditCardNumber creditCardNumber;
    CardExpiration cardExpiration;

    CreditCard(UserName userName, CreditCardNumber creditCardNumber, CardExpiration cardExpiration) {
        checkNull(userName, creditCardNumber, cardExpiration);
    
        this.userName = userName;
        this.creditCardNumber = creditCardNumber;
        this.cardExpiration = cardExpiration;
    }

    private void checkNull(Object... args) {
        for(Object obj : args) {
            if (obj == null) {
                throw new NullPointerException();
            }
        }
    }
}
```

上記のように実装することで、基本型のみの実装におけるデメリットを解消できていることがわかります。
- カード番号は、nullでなければCreditCardNumberクラスで値の検証がされていることが保証されています。
- コンストラクタの引数はそれぞれの型で明確であり、誤った値の代入は起こりにくいです。
- 値の定義検証がどこでされているかは明確であり、変更箇所の特定も容易です。（場合によっては影響調査は同様に大変な可能性もあるが、バグの混入可能性は減ると思います。）

## さいごに

今回は未熟者なりに「値オブジェクト」について記事を書いてみました。
値オブジェクトを意識して実装することは大切ですが、何でもかんでも値オブジェクトで実装すればよいというわけでもないので、試行錯誤しながらより良い実装を目指しましょう。（私も人のことは言えないですが）

また、もし間違っている箇所や、追記したほうが良い箇所がありましたらコメントしていただけると嬉しいです！
CのdllをCのコンソールアプリケーションから呼び出す際のヘッダファイルの書き方

# はじめに
この記事のお題はCのdllをCのコンソールアプリケーションから呼び出す際のヘッダファイルの書き方の備忘録です。

## この記事内容の作業環境
Windows11 Pro 22H2
CPU Intel(R) Core(TM) i3-5005U 2.00 GHz
Microsoft Visual Studio Community 2022 Version 17.4.4
Microsoft Visual C++ 2022


# お題のソースコード
Cのコンソールアプリケーション
```c:consoleApp.c
#include<stdio.h>

#include "dllMain.h"

__declspec(dllimport) void exec();

void main() {
	exec();
}
```

Cのdll（ダイナミックリンクライブラリ）
```c:dllMain.c
#include<stdio.h>

#define _EXPORTING

#include "dllMain.h"

__declspec(dllexport) void exec(){
	printf("Hello World!\n");
}
```

Cのdll（ダイナミックリンクライブラリ）のヘッダファイル
```c:dllMain.h
#pragma once

#ifdef _EXPORTING
#define FUNC_DECLSPEC    __declspec(dllexport)
#else
#define FUNC_DECLSPEC    __declspec(dllimport)
#endif

FUNC_DECLSPEC void exec();
```
当初VS2022のプロジェクトひな形にC++のDLLを指定したので、ヘッダファイルにC++のプリプロセッサディレクティブ#pragma onceが残っています。細かいことは気にしない。


 # ビルド結果
 それではビルドしてみます。ビルド成功のための構成は後でご説明いたします。
```
 リビルドを開始しました...
1>------ すべてのリビルド開始: プロジェクト:mssqlodbc32, 構成: Debug Win32 ------
1>dllMain.c
1>   ライブラリ C:\developments\dllMain\Debug\dllMain.lib とオブジェクト C:\developments\dllMain\Debug\dllMain.exp を作成中
1>dllMain.vcxproj -> C:\developments\dllMain\Debug\dllMain.dll
2>------ すべてのリビルド開始: プロジェクト:ConsoleApp, 構成: Debug Win32 ------

2>consoleApp.c
2>ConsoleApp.vcxproj -> C:\developments\dllMain\Debug\ConsoleApp.exe
========== すべて再構築: 2 正常終了、0 失敗、0 スキップ ==========
=========== 経過時間 00:07.608 ==========
```

 # 実行結果
 それでは実行してみます。
```
Hello World!

C:\developments\dllMain\Debug\ConsoleApp.exe (プロセス 15144) は、コード 0 で終了しました。
デバッグが停止したときに自動的にコンソールを閉じるには、[ツール] -> [オプション] -> [デバッグ] -> [デバッグの停止時に自 動的にコンソールを閉じる] を有効にします。
このウィンドウを閉じるには、任意のキーを押してください...
```

無事にdll経由でHello World!できました。

 # 配置情報
 このビルドを成功させるためのソリューション、プロジェクトの配置についてご説明します。
 こんな感じです。dllMain.hはConsoleApp側にもコピーして配置しています。
```
 C:.
│  dllMain.sln
│
├─ConsoleApp
│  │  ConsoleApp.vcxproj
│  │  consoleApp.c
│  │  dllMain.h
│  └─Debug
│
├─Debug
│      ConsoleApp.exe
│      ConsoleApp.pdb
│      dllMain.dll
│      dllMain.exp
│      dllMain.lib
│      dllMain.pdb
│
└─dllMain
    │  dllMain.vcxproj
    │  dllMain.c
    │  dllMain.h
    └─Debug
```
dll側のCソースには下記の定義があるため
```c
#define _EXPORTING
```
dll側のヘッダファイルdllMain.hでは
```c
#define FUNC_DECLSPEC    __declspec(dllexport)
```
が処理され、
コンソールアプリ側のCソースにはこの定義がないため
コンソールアプリ側のヘッダファイルdllMain.hでは
```c
#define FUNC_DECLSPEC    __declspec(dllimport)
```
が処理され、
```c
FUNC_DECLSPEC void exec();
```
は、それぞれの意味となって、双方で共通のヘッダファイルとしてインクルードできるようになります。

 # よくあるビルドエラー


 C:\developments\dllMain\Debug\dllMain.libのパスをコンソールアプリ側のプロジェクトのプロパティの
 リンカー->入力->追加の依存ファイル
 に設定し忘れているとConsoleApp側のビルドが下記のように失敗します。
```
2>consoleApp.c
2>consoleApp.obj : error LNK2019: 未解決の外部シンボル __imp__exec が関数 _main で参照されました
2>C:\developments\dllMain\Debug\ConsoleApp.exe : fatal error LNK1120: 1 件の未解決の外部参照
2>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(1096,5): error MSB6006: "link.exe" はコード 1120 を伴って終了しました。
2>プロジェクト "ConsoleApp.vcxproj" のビルドが終了しました -- 失敗。
```

 # おわりに
C言語でのdll作成の情報は少ないので何かの参考になれば幸いです。
【Android】Warning: debug info can be unavailable. Please close other application using ADB: Monitor, DDMS, Eclipse 解消方法

## デバッグする時の、このエラーを解決したい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917260/df78fc1e-4261-f5f2-d8a0-5c737bac8c87.png)


## (わたしは)解決しなかったパターン😒
:point_right_tone2: ADB（Android Debug Bridge）の再起動してみる
```
adb kill-server
adb start-server
```

## (わたしは)解決しなかったパターン😒
:point_right_tone2: AndroidStudioを再起動する

## (わたしは)解決したパターン🚀
 :point_right_tone2: スマホを再起動する

 ## おわりに
エラー解決がんばるぞい！
AndroidスマホでTermuxでマイクラサーバー（PaperMC）を起動する方法

今回はAndroidスマホのTermuxというアプリでマイクラサーバーであるPaperMCを起動する方法について書いていく。

## 事前準備

あらかじめルータの画面でスマホのローカルIPアドレスをポート開放設定をしておく。
開けておくポートは25565（TCP）と19132（UDP）。
そしてスマホのWi-Fi設定でスマホのローカルIPアドレスを固定しておく。
これは検索して調べてみよう。

## Termuxのダウンロード

以下のページからTermuxのF-Droidストアのボタンをタップすることでダウンロード出来る。

Termux | The main termux site and help pages.
https://termux.dev/en/

## Termuxの起動

Termuxをタップして起動しよう。

## ubuntu-in-termuxのダウンロードと起動

以下のURLの「【活用編】Ubuntuの導入」のところを参照するとubunutu-in-termuxがダウンロード出来る。

個人的Termuxのセットアップメモ
https://zenn.dev/ryuu/scraps/6b2584294674b7

Termuxを開いた状態で、以下のコマンドを1行ずつ入力してEnterを押す。

```
# パッケージの更新
apt-get update && apt-get upgrade -y

# wget・proot・Gitのインストール
#すでにpkgでインストールしている場合はスキップ可
apt-get install wget proot git -y

# ホームディレクトリに移動
cd

# スクリプトをクローン
git clone https://github.com/MFDGaming/ubuntu-in-termux.git

# 作成されたディレクトリへ移動
cd ubuntu-in-termux

# スクリプトに実行権限を付与
chmod +x ubuntu.sh

# インストールスクリプトを実行
./ubuntu.sh -y

# Ubuntu を起動
./startubuntu.sh

# Ubuntu が起動
root@localhost:~#
```

## OpenJDK21のインストール

以下のページでは（Termux上でインストールする為）`openjdk-17`となっているが、ubuntu-in-termuxを起動した状態で以下のコマンドを入力すると良い。

Androidスマホで完結！Minecraftサーバ立上げてAndroidで接続 #Android - Qiita
https://qiita.com/tatuya911/items/840107699190451a4651

```
apt install openjdk-21-jdk
```

※OpenJDK19からOpenJDK21へ2025年03月14日に更新

## PaperMCの起動

PaperMCはダウンロードしたいバージョンの上でリンクをコピーをするとURLがコピー出来る。

Paper Downloads | PaperMC
https://papermc.io/downloads/paper

```
mkdir /data/data/com.termux/files/home/minecraft
cd /data/data/com.termux/files/home/minecraft
wget https://api.papermc.io/v2/projects/paper/versions/1.21.4/builds/211/downloads/paper-1.21.4-211.jar
java -jar paper-1.21.4-211.jar nogui
```

起動したらストップコマンドを入力して決定をタップ
```
stop
```

## vimのインストール

vimをインストールしてeula.txtを編集可能な状態にしよう。

```
apt install vim
vim eula.txt
```

## Eula.txtに同意する

iキーを押して挿入モードになる
矢印キーで`eula=false`のfalseを削除して`eula=true`にする
Escを押して`:wq`を入力して保存して終了するコマンドをEnterする
そして2回目のPaperMCの起動

```
java -jar paper-1.21.4-211.jar nogui
```
入るIPアドレスは自宅で接続する場合はポート開放時に設定したローカルIPアドレスだ。

外出時からアクセスする場合はグローバルIPアドレスを調べると良い。

アクセス情報【使用中のIPアドレス確認】
https://www.cman.jp/network/support/go_access.cgi

入るポート番号はPaperMCはJAVA版なので25565。

## 統合版からアクセス出来るようにする

統合版からもアクセス出来るようにするには、Geyser-SpigotとFloodgate-Spigotをダウンロードすれば良い。

```
stop
```

GeyserMC: Download
https://geysermc.org/download

## プラグインのダウンロード

pluginディレクトリに移動して、`wget`コマンドでGeyser-SpigotとFloodgate-Spigotをダウンロードしよう。

```
cd plugins
wget https://download.geysermc.org/v2/projects/geyser/versions/latest/builds/latest/downloads/spigot
wget https://download.geysermc.org/v2/projects/floodgate/versions/latest/builds/latest/downloads/spigot
```

## server.propertiesを変更

最後にserver.propertiesで記述を変更する必要がある。

```
cd
cd minecraft
vim server.properties
```

## enforce-secure-profileの変更

iキーを押して挿入モードになる。
矢印キーで

```server.properties
enforce-secure-profile=true
```

これを`false`に変更する。

```server.properties
enforce-secure-profile=false
```

Escを押して保存して終了する。
```
:wq
```

## 起動確認

3度目の起動をする。

```
java -jar paper-1.21.4-211.jar nogui
```

これで統合版でスマホサーバーに参加が可能になった。
統合版からアクセスする場合は自宅の場合はローカルIPアドレス、外出時からアクセスする場合はグローバルIPアドレス、ポート番号は19132。
【Tips】Macの矢印を入力するショートカットキー

## はじめに
表題通り、Macで矢印を入力する際のショートカットキーを紹介します。

## ショートカット
![yajirushi.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/0c2efb2a-1b87-9a5a-07aa-9f0632e7bed1.gif)

←（左矢印）:zh
↑（上矢印）:zk
↓（下矢印）:zj
→（右矢印）:zl
30代未経験がAzure Fundamentals AZ-900 に挑む話(1)

みなさんこんばんは
【30代未経験がAzure Fundamentals AZ-900 に挑む話1】
こんな記事タイトルで書き始めたいと思います。

1\.まず簡単な自己紹介から

年齢: 33歳
最終学歴: 高卒
資格: パソコン検定　（もはや死語でしょ）
現職: 運送（主任）
PC経験: エクセル、ワードなどは使える、自作PCとかそっちの知識は10年程ある。
プログラミング経験:Java linuxが毛の生えた程度（javaは殆ど覚えてない）

2\.動機
業務に関係ないAWSやAzure,GCPなどは少し前から気になっていました。今働いている会社は
あと10年もするとかなり厳しい環境になり私も43歳となって管理職かと思います。
会社からはかなり良い評価を貰っていてお給料は同僚と比べると+100万円~ぐらい差があるので高給取りと呼ばれてます。
こんな人がなぜクラウド関係の資格を取ろうかと思っているかというとこの会社に見切りをつけたからです。
（見切りをつけた理由はグチになってしまうで書きません）

3\.なぜAzure？
AWSでもGCPでも良かったのですが、Azure 公式ドキュメントやMicrosoft Learnなど教育環境が整っているだろうと感じました。Microsoft Learn の「Azure の基礎」を少し見て小テストなどやってみると意外と間違わなかったってのもあります。

4\.勉強環境
Uedemyが1月10までセールをやっていたのでAzuruの動画とAWSなど興味のある資格を買いました。
今現在はUedemyの合格への近道！Azure Fundamentals AZ-900 試験対策講座の動画を見て勉強しています。
とりあえずざーっと見て
今2週目が終わったら問題集を解いてみたいと思います。


5\.試験日
まだ決めていませんが、問題集で8.5~9割行けるまで少し勉強したいと思っています。
1週間や2週間で合格！って記事を見ると少し焦りますが、1か月程勉強してみたいと思います。
未経験と言っても全然分からない用語が出てくるのは7割どこかで聞いた概ね知っているような用語が3割あるような感じです。

6\.プログラミング経験:Java linuxがあるのはなぜ？
私が中学の時だと思いますが、（この頃からPCは触ってた）Javaが出来れば年収1000万円とかって本が結構出ててやってみよ～って感じで本を買って簡単なゲームを作りました。
高校の頃はC語を少しやって自作PCの時にOS買うお金ないな…とLiunx mintに手を出してすこし触れる程度です。sudo apt-get updateとか基礎ぐらいしか分かりませんが。

こんな人が資格に挑戦してみます。合格出来れば沢山ある合格記の中の1つに慣れればと思っております。
モノリスとは何か(1)

この文に先立ち、最近新しいプロジェクトを進めながら初めてMSAについて知り、実際にMSArchitectureに従ってプログラミングをしました。 プロジェクトを進めながらMSAについて魅力を感じてもっと深く調べたいと思ったのでMonolithic Architectureと共にMSAについて勉強した内容を記録していきたいと思います！

## Monolithic Architectureとは
 - MSA(micro service architecture) という用語ができる前は存在しなかった。（なぜならモノリスアーキテクチャを当たり前のように使用したから）
 - 基本的に、あらゆる種類のサービスが1つのアプリケーションで構成されているアーキテクチャを意味
 - 特徴
     - 一つのプロセスで構成
     - すべてのサービスが一つのdb endpointを使用
         - dbに問題が生じると関連したサービスが一度に死んでしまうディメリット
         - dbを管理するリソースはMSA環境よりはるかに少ないリソースで管理できるというメリット
     - 1行だけコード修正されても、すべてのアプリケーションの再配布が必要です
     - シングルあるいはマルチモジュールで構成することはできるが、ciの単位が変わるだけで、cd（配布）の範囲は全体

## Monolithic Architectureが  Generalだったわけ
- Easy
    - 開発してビルドして出たoutputをサーバーでrun
- No time, No Human Resource
    - 考慮するのがそんなに多くない
- [IDC server](https://www.elite-network.co.jp/dictionary/idc.html) が一般的=> サーバーが多いほど多くのリソースが要求される
    - on-premise方式のidcを使用（モノリスだから1つのサーバのリソースで十分！）

## Monolithic Architecture
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3097775/ce0d5f21-1bae-7d5e-9c5a-bb23090274f2.png)

## シングルモジュールとマルチモジュール
モノリスアーキテクチャでモジュールの構成方法が異なるが、代表的にシングル/マルチモジュールアーキテクチャが存在し、特徴が少し異なる

- シングルモジュール
    - すべてのソースが単一モジュール内に存在
    - 凝集性結合度が非常に高い
    - 設計/具現が単純
    - 柔軟性、拡張性が制限的
    - 最上位シングルパッケージ
- シングルモジュールアーキテクチャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3097775/581d22a6-0f91-1c33-daa0-758378cad161.png)

<br>

- マルチモジュール
    - 役割、サービスごとにモジュール化されている
    - 凝集性、結合度が低い
    - モジュール間インタフェース定義が必要
    - 最上位マルチパッケージ
    - 柔軟性、拡張性が比較的よい
- マルチモジュールアーキテクチャ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3097775/6548304e-fece-ec7c-03e4-130054f48854.png)
マルチモジュールアーキテクチャの場合、mvcアーキテクチャがドメインまたはサービスごとにパッケージ構造が組まれることになる。
モジュール別にビルドされて複数のjarファイルができるようになる。そして、普通マルチモジュールが参照するcommonモジュールがあるが、commonモジュールが修正されると、commonモジュールを使用するそれぞれのモジュールも一緒に修正する必要がある。

**結局、マルチモジュールであれシングルモジュールであれ、共通して使われるソースが修正されれば、これを使用するすべての部分が一緒に影響を受けることになるモノリスという限界は同じ！**
Qwikで子コンポーネントにもScopedなstyleを継承させる方法

Qwikの`useStylesScoped$`はコンポーネント内で局所的に閉じたスタイルを適用できて便利なのですが、そのまま使うと子コンポーネントにはスタイルが適用されず、最初は`<Link>`が言う事を聞かなくて難儀したりします。
正しく子コンポーネントにもスタイルを継承させるには明示的に以下のように`scopeId`を指定する必要があります。

```ts
const {scopeId} = useStyleScoped$(styles);
...
return (
  ...
  <Link class={scopeId}>
```

若干面倒なので以下のようなQrl関数を用意しておくと、

```ts
export const useStyledQrl = (styles:QRL<string>) => {
  const {scopeId} = useStylesScopedQrl(styles);
  return {class:scopeId};
};
export const useStyled$ = implicit$FirstArg(useStyledQrl);
```

こんなふうにシンプルに記述できるようになります。

```ts
const styled = useStyled$(styles);
...
return (
  ...
  <Link {...styled}>
```
アラーム音声を毎回ランダムに再生する機能

## 実装した機能
アラーム音声を毎回ランダムに再生する機能


## 中身
```react
const voiceFiles = {
  1: require("../voice/voice1.mp3"),
  2: require("../voice/voice2.mp3"),
  3: require("../voice/voice3.mp3"),
  4: require("../voice/voice4.mp3"),
  5: require("../voice/voice5.mp3"),
  6: require("../voice/voice11.mp3"),
  7: require("../voice/voice12.mp3"),
  8: require("../voice/voice13.mp3"),
  9: require("../voice/voice14.mp3"),
  10: require("../voice/voice21.mp3"),
};

//AlarmScreenコンポーネント内
//checkAlarms関数内
// ランダムなインデックスを取得
const randomIndex = Math.floor(Math.random() * 10) + 1;

// ランダムに選択された音声ファイルを再生
playAlarmSound(voiceFiles[randomIndex]);

// 10秒ごとに音声を再生
const intervalId = setInterval(() => {
  playAlarmSound(voiceFiles[randomIndex]);
}, 10000);

```

### Math.floor(Math.random() * 10) + 1
1. Math.random()関数は[0, 1)の範囲で浮動小数点数を返す
　ex.)0.123456789

1. Math.random()に10を掛けることで、[0, 10)の範囲の浮動小数点数が得られる
　ex.)0.123456789 * 10 = 1.23456789

1. Math.floor()関数は、与えられた数値以下で最大の整数を返す
 ex.)Math.floor(1.23456789)は1

1. 1を加えることで、最終的に1から20までの整数が得られる

### playAlarmSound();
```react
const playAlarmSound = async (file) => {
    try {
      const { sound } = await Audio.Sound.createAsync(file, {
        shouldPlay: true,
      });
      setSound(sound);
    } catch (error) {
      console.error("音声ファイルの読み込みまたは再生に失敗しました", error);
    }
  };
```
##### Audio.Sound.createAsync
引数で、ファイルの指定、即時再生のbooleanを指定する。
また、createAsyncメソッドはPromiseを返す。
成功の時は、解決値としてサウンドオブジェクトが返される。このオブジェクトには、soundというキーが含まれており、これが再生や停止、情報の取得などを行うためのサウンドオブジェクトとなる。エラーの際はcatchでエラーログを返す。
https://docs.expo.dev/versions/latest/sdk/audio/


## 詰まったこと
当初はmp3ファイルを変数で指定して、ランダムに呼び出そうと考えていたが、requireが静的パスしか受け付けていない点で詰まった。最終的に上記記載の通り、`オブジェクト{ID：require("静的パス")｝`で指定し回避した。

以下ダメな例をメモとして残します。

`${randomNumber}`があると無効な呼び出しとされ、そもそもexpo appの画面が表示されない。また、`loadAsync()`を使っても回避不可でした。

```
screens\AudioScreen.js: screens\AudioScreen.js:Invalid call at line 18: require(`../assets/audio${randomNumber}.mp3`)
```

```react
const AudioScreen = ({ navigation }) => {
  useEffect(() => {
    const playRandomAudio = async () => {
      // 1から3のランダムな番号
      const randomNumber = Math.floor(Math.random() * 3) + 1; 
      const soundObject = new Audio.Sound(); 
      try {
        // ランダムに選ばれた番号に基づいて、対応する音声ファイルを読み込む
        await soundObject.loadAsync(
          require(`../assets/audio${randomNumber}.mp3`)
        );
        await soundObject.playAsync();
      } catch (error) {
        console.error("Error loading sound", error);
      }
    };
```

```react
const playRandomSound = async () => {
  // 1から3のランダムな番号
  const randomNumber = Math.floor(Math.random() * 3) + 1;
  const soundObject = new Audio.Sound();

  try {
    const soundPath = `./assets/audio${randomNumber}.mp3`;
    const requirePath = require(soundPath);
    await soundObject.loadAsync(requirePath);
    await soundObject.playAsync();
    setSound(soundObject);
  } catch (error) {
    console.error("サウンドの読み込みエラー", error);
  }
};

```
ChatGPTでGPT storeがリリースされるかもしれない！！

ChatGPTのOpenAIから「GPT store」がリリースされるというニュースが先週アメリカのメディアで報道されました。
日本ではITmediaなどでも報道がありました

https://www.itmedia.co.jp/news/articles/2401/05/news061.html

この「GPT store」はカスタマイズしたAIチャットボットを公開できるプラットフォームです。
コーディングなし、いわゆるノーコードで構築したカスタムGPTを公開できることができます。
スマホのAppStoreやGoogleストアのGPT版だと思えば分かりやすいでしょう。

カスタムGPTを作成するにはOpenAIのGPT Builderを作成する必要がありますが、前述の通りノーコードで作成することができ、コードを書けない(ソフトウェア)エンジニア以外でも作成可能となるでしょう。
![DALL·E 2024-01-08 18.44.11 - A dynamic scene in a tech startup office showing a group of diverse individuals engaged in developing an AI chatbot. The team, consisting of both men .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/b93b607a-1c79-93f3-6bc4-0f213d56e6e9.png)


また、GPT Builderで作成したカスタムGPTは「GPT store」で公開でき、共有リンクからも公開できます。
共有リンクがあることで、X(旧Twitter)などのSNSや有料noteなどの情報商材で様々な人々に公開できることで、わざわざGPT storeにアクセスすることなくカスタムGPTを提供でき、ChatGPTに疎い人に対しても手軽に共有できるようになることでしょう。
つまり...


海外のメディアの記事によると
GPT storeで有料アプリを販売できるようにする可能性があります。
これにより自作で作成したカスタムGPTアプリで収益化できるようになるでしょう。

「GPT store」は元々11月にリリース予定でしたが、サム・アルトマンCEOの解任劇〜復帰劇があり、内部でゴタゴタしていたため1月へと後ろに流れてしまいました。
2024年は「GPT store」のリリースを皮切りでChatGPTがどのようなサービス強化されていくのか注目です。

また、別件ですがAndroid版のChatGPTに新機能がリリースされるかもしれません。
音声アシスタントの類いですがリリースはいつなんでしょうか？

p.s.
「エンジニア」というとWEBなどのアプリケーションを作成するソフトウェアエンジニアをイメージする現代ですが、
自動車などを造るハードウェアのエンジニアもいるので、「エンジニア」という単語を使うにはハード界の方々に失礼なんですかね。
Vercelデプロイ時の No Output Directory named "dist" found エラー

# はじめに
<!-- 発端や概要を記載 -->
Nuxt3で作成したアプリをVercelにデプロイしようとしたところ、
`"Error: No Output Directory named "dist" found after the Build completed."`というエラーでつまづいたので、その解決策を共有します。
### 開発環境
* MacOS 13.4.1 (Ventura)
* pnpm 8.11.0
* Vue 3.3.8 / 3.4.3
* Nuxt 3.8.2 / 3.9.0

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [原因と解決策](#Chapter1)
1. [まとめ](#Chapter2)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 原因と解決策
### .gitignoreでdistディレクトリが排除されていた...
gitignoreからdistディレクトリをコメントアウトして再ビルド・プッシュ・デプロイすれば解決する。
```text:.gitignore (Nuxt3.9~)
# .nuxtディレクトリ配下のもののうち、distディレクトリのみignoreから除外する。
.nuxt/*
!.nuxt/dist/

# Nuxt3.8以下は、ルートにdistディレクトリが生成されるので、そのままコメントアウトする。
# dist
```

<a id="#Chapter2"></a>
# まとめ
今回の原因は、`npx nuxi init`で新規Nuxt3プロジェクトを立ち上げた際に自動生成される.gitignoreが原因でした。
Vercelのような慣れないサービスを利用しているときも、焦らずにエラー文を丁寧に読んで原因を探っていくのが大切なんだなぁと...
すぐググる癖を治したい！

<a id="#reference"></a>
# 参考文献
- [No Output Directory named "dist" found after the Build completed Error when deploying the project to vercel?](https://github.com/nuxt/nuxt/issues/20717)
『プロになるためのWeb技術入門』を読んで

書籍『[プロになるためのweb技術入門](https://amzn.asia/d/dudJMh6)』を読み終えたため、アウトプットのためにも学んだ用語をまとめてみようと思う。
今回は以下の用語をまとめていく。

1. リクエストとレスポンス
1. プロトコル
1. ポート番号
1. ステートフルとステートレス
1. クッキー

# 用語

### リクエスト と レスポンス
ホームページやWebサイトなどの閲覧と公開は、「Webクライアント」が閲覧したいページなどを要求し、「Webサーバ」がその要求に従って必要なHTMLファイルを渡すという仕組みにより実現している。

そして、クライアントからサーバーに対する要求のことを「**リクエスト（request）**」、サーバーからクライアントに対する応答のことを「**レスポンス（response）**」という。 

### プロトコル
通信を行う時にどのように情報をやり取りするか取り決めた規約のことを「**通信プロトコル（Communications protocol）**」という。
現在幅広く利用されているプロトコルが `HTTP` だ。

### ポート番号
TCP/IP通信によって情報を受け取る場所を示しているのが「**ポート番号**」だ。
よく使われるプロトコルでは、ポート番号を指定しなくても使用するポート番号が決まっている。
例）HTTPプロトコルのポート番号は80番


### ステートフル と ステートレス
状態を持つプロトコルのことを「**ステートフル・プロトコル（Stateful Protocol）**」という。
前回のリクエスト結果などを覚えており、その結果を踏まえてリクエストを実行するプロトコルだ。
ステートフル・プロトコルを利用することで、ログイン状態を保持することができる。
代表的なステートフル・プロトコルとして `FTP` などがある。

一方、状態を持たないプロトコルのことを「**ステートレス・プロトコル（Stateless Protocol）**」という。
1回のリクエストだけで完結し、通信手順も不要なプロトコルだ。
認証などが不要なため、実装も比較的簡単になっている。
代表的なステートレス・プロトコルとして `HTTP`  などがある。

### クッキー
WebサーバとWebブラウザの間で交換できる情報を「**クッキー（Cookie）**」という。
Webブラウザ側で、Webブラウザごとにクッキーは保持している。

Webアプリケーション上でセッション状態を管理し、クッキーにセッションIDを格納することで、
クッキーを受け取ったWebサーバがセッションIDをもとに状態を復元することができる。

セッションIDだけのやり取りになるため、安全性も高い。
【初心者向け】生成AI勉強会で使用した資料を公開 #3（新規事業の計画をChatGPTを用いて効率化する方法）

---

:::
### <font color="#03B47E">ChatGPTを業務で活用して効率化する方法</font>
ChatGPT含む生成AIを業務で活用したい方は勉強会を行なっておりますので、以下のフォームからお問い合わせください⭐️
:::

https://tenho7.jp/contact/

---

## 勉強会の内容
「新規事業の計画をChatGPTを用いて効率化する方法」について勉強会を行ったのでその時の資料を公開します。
（2023年の10月に行ったため、内容が変わっている場合もありますが）誤字脱字や気になった部分がありましたらご連絡ください。

## 資料
<details><summary>目次</summary>

* はじめに
    * 会社概要
    * スピーカー紹介
* ChatGPTで新規事業企画を効率化する方法
    * こんなお悩みありますか？
    * 【雑談】GPT4Vアップデートについて
    * ハンズオン（下に動画を掲載しています）

</details>

#### 実際の資料

<script defer class="speakerdeck-embed" data-id="ebee535292e1405097f8645cb623c723" data-ratio="1.7777777777777777" src="//speakerdeck.com/assets/embed.js"></script>

#### ハンズオン動画

<iframe width="560" height="315" src="https://www.youtube.com/embed/6IBqI3mnnwE?si=CnHTM0NPZ1AEo5rJ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

## 生成AI学習カリキュラム無料公開中
ChatGPTや生成AIを業務で活用するための無料カリキュラムを無料で提供しております。
受講したい方は以下のリスキリングコンソーシアムで会員登録してお申し込みください⭐️

https://japan-reskilling-consortium.jp/register/request

:::note warn
**お問い合わせ数1位**
リスキリングコンソーシアム様にて提供させていただいております
『【ChatGPTを活用しよう】プロンプトエンジニア入門』
が年間お問い合わせ数1位をいただきました
:::
![IMG_2553.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670666/4e7aee1e-4df9-68c9-44db-b5db84663cf4.jpeg)

無料で提供させていただいておりますので、以下のリンクからお問い合わせください⭐️

https://japan-reskilling-consortium.jp/register/request

---

:::
### <font color="#03B47E">ChatGPTを業務で活用して効率化する方法</font>
ChatGPT含む生成AIを業務で活用したい方は勉強会を行なっておりますので、以下のフォームからお問い合わせください⭐️
:::

https://tenho7.jp/contact/

---

## 導入事例
弊社は企業様や行政様に向けて、生成AIの研修や導入支援を行っております。

**三重県伊勢市様**
伊勢市の職員の方や、伊勢市内の企業様に向けて「ChatGPTの業務での活用方法と使用する際に注意するリスク」についてセミナーと「プロンプト一覧集」の提供を行いました。

https://markezine.jp/article/detail/42973

**JR九州鉄道（九州旅客鉄道株式会社）様**
JR九州様の従業員様や関連企業様に向けて、「ChatGPTや生成AIの業務での活用方法や活用事例」についてセミナーを行いました。

https://prtimes.jp/main/html/rd/p/000000014.000116947.html

**JR九州コワーキング「Q」様**
JR九州様が運営されているコワーキングスペース「Q」にて事業者様に「ChatGPTを業務で活用する方法とリスクの対処法」についてセミナーを行いました。

https://prtimes.jp/main/html/rd/p/000000010.000116947.html

**株式会社シード様**
株式会社シード様の従業員様に向けて、「ChatGPTの基本と業務でのプロンプト活用術」についてセミナーを行いました。

https://tenho7.jp/case/nbnqt7-Z/

**株式会社CINC様共催**
マーケター向けに「Webマーケティングで活用できるChatGPT活用事例」についてのセミナーをCINC様と共同で開催しました。

https://techplay.jp/event/908478

**株式会社D4c Academy様共催**
個人向けに「ChatGPTの業務活用とリスクの対処法セミナー」をD4c Academy様と共同で開催しました。

https://tenho7.jp/case/lebuhbWH

**デジタルシティ株式会社様**
デジタルシティ株式会社様の従業員様に向けて、「ChatGPTの業務での活用方法と使用する際に注意するリスク」についてセミナをー行いました。

https://tenho7.jp/case/FynteYF9/

**青山学院大学様**
青山学院大学の生徒様に向けて、「ChatGPTを用いた事業戦略方法」について授業を行いました。

https://tenho7.jp/case/1g3Q6I4/

**愛媛県今治市様**
今治市の職員様に向けて、「ChatGPTの業務での活用方法」について勉強会を行いました。

---

:::
### <font color="#03B47E">ChatGPTを業務で活用して効率化する方法</font>
ChatGPT含む生成AIを業務で活用したい方は勉強会を行なっておりますので、以下のフォームからお問い合わせください⭐️
:::

https://tenho7.jp/contact/

---
Deno: SMTP over SSL でメールの送信

denomailer 1.6.0 を使いました。
日本語は文字化けをおこすことがあります。

## 参考ページ
[Denomailer - an SMTP client for Deno](https://deno.land/x/denomailer@1.6.0)

## プログラム

```ts:smtp_ssl.ts
// ---------------------------------------------------------------
//
//	smtp_ssl.ts
//
//					Jan/08/2024
//
// ---------------------------------------------------------------
import { SMTPClient } from "https://deno.land/x/denomailer/mod.ts"
import { config } from "https://deno.land/x/dotenv/mod.ts"

console.error ("*** 開始 ***")

const config_env:any = config()


const client = new SMTPClient({
	connection:
{
  hostname: config_env.SERVER,
  port: parseInt(config_env.PORT,10),
  tls: true,
  auth: {
	username: config_env.USR,
	password: config_env.PASSWORD,
  	},
}
})

console.error ("*** aaa ***")

var str_out = "Mail Content\n"
str_out += "Jun/08/2024\n"
str_out += "PM 17:58\n"
str_out += "こんにちは\n"
str_out += "今日は良い天気でした。\n"
str_out += "\n"
str_out += "\n"
str_out += "飴だま\n"
str_out += "新美南吉\n"
str_out += "\n"
str_out += "春のあたたかい日のこと、\n"
str_out += "わたし舟にふたりの小さな子どもをつれた女の旅人がのりました。\n"
str_out += "舟が出ようとすると、\n"
str_out += "「おオい、ちょっとまってくれ。」\n"
str_out += "と、どての向こうから手をふりながら、さむらいがひとり走ってきて、舟にとびこみました。\n"
str_out += "舟は出ました。\n"
str_out += "\n"
str_out += "End\n"
str_out += "\n"
str_out += "\n"
str_out += "\n"

console.error ("*** bbb ***")
await client.send({
  from: config_env.FROM,
  to: config_env.TO,
  subject: "Hello from Hi-ho Jan/08/2024 PM 17:58",
  content: str_out,
})

console.error ("*** ccc ***")

await client.close();

console.error ("*** 終了 ***")
// ---------------------------------------------------------------
```

```text:.env
SERVER = 'mail.aaaa.co.jp'
PORT = 465
USR = '****@aaaa.co.jp'
PASSWORD = '****'
FROM = '****@aaaa.co.jp'
TO = 'sample@example.com'
```

## 送信結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/dfa79999-7dee-c94a-ccfd-bf6962d8c9b6.png)

## 確認したバージョン

```text
$ deno --version
deno 2.2.6 (stable, release, x86_64-unknown-linux-gnu)
v8 13.5.212.4-rusty
typescript 5.7.3
```
known_hosts の鍵が変わっていた場合に自動的に削除して接続するsshコマンド拡張

## はじめに

接続したことのあるホストのIPアドレスが変わってしまった時などに、以下のような警告が出ます。
※よくあるケースだと思いますが、ECS on EC2 で運用していると、EC2ホストの更新をした際に毎回この警告が出る状態になります。

```
$ ssh example.com
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**.
Please contact your system administrator.
Add correct host key in /Users/user/.ssh/known_hosts to get rid of this message.
Offending RSA key in /Users/user/.ssh/known_hosts:1
RSA host key for example.com has changed and you have requested strict checking.
Host key verification failed.
````

この警告を解除するためには、 `$HOME/.ssh/known_hosts` の該当の行の鍵情報を削除するか、 `$HOME/.ssh/config` に `StrictHostKeyChecking no` の設定をする必要があります。

毎回、`$HOME/.ssh/known_hosts`の該当の行の鍵情報を削除するのも手間ですし、 `StrictHostKeyChecking no` を設定すると接続はできますが接続時にwarningが出るのが煩わしいというのがあります。

## 利用における注意

本ツールは運用におけるちょっとした手間を省略できる反面、中間者攻撃をされていることに気づかなくなるリスクがありますので、十分ご注意ください。

## $HOME/.ssh/known_hosts 該当行の削除

そこで、通常のssh 実行時に、 $HOME/.ssh/known_hosts 該当行を削除するようにしました。

https://github.com/koda-h/ssh_known_host_delete

以下の要領で利用可能になります。
```
$ git clone https://github.com/koda-h/ssh_known_host_delete

$ cd ssh_known_host_delete

## $HOME/bin/ssh を配置しに行きます。 $HOME/binにPATHを通します。
$ ./setup.sh

## PATH更新(zsh利用の場合)
$ source ~/.zshrc

## PATH更新(bash利用の場合)
$ source ~/.bashrc
```


ssh コマンド実行時、ログをファイル出力しておき、 known_host のエラーが出た場合は `ssh-keygen -R` を実行して、 `$HOME/.ssh/known_hosts` の該当のホストの鍵を削除します。

```
#!/bin/bash

export PATH=$PATH:$HOME/bin

TMP_FILE=$(mktemp)

/usr/bin/ssh $* 2> $TMP_FILE
RET=$?

if [ "$RET" = "255" ]; then
  DELETE_HOST=$(grep "Host key for" $TMP_FILE |awk '{print $4}')
  if [ -n "$DELETE_HOST" ]; then
    echo "REMOTE HOST IDENTIFICATION HAS CHANGED! DELETE HOST KEY FROM ~/.ssh/known_hosts"
    ssh-keygen -R $DELETE_HOST
    /usr/bin/ssh $*
  fi
fi

rm $TMP_FILE
```

## 利用方法

`/usr/bin/ssh` ではなく `$HOME/bin/ssh`を実行するように設定されたので、
通常通り、 `ssh example.com` のようにssh実行します。

実行時に `$HOME/.ssh/known_hosts` の鍵情報が削除された場合はこのように出力されます。

```
$ ssh example.com
REMOTE HOST IDENTIFICATION HAS CHANGED! DELETE HOST KEY FROM ~/.ssh/known_hosts
# Host example.com found: line 312
# Host example.com found: line 313
/Users/user/.ssh/known_hosts updated.
Original contents retained as /Users/user/.ssh/known_hosts.old
The authenticity of host 'example.com (<no hostip for proxy command>)' can't be established.
ED25519 key fingerprint is SHA256:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
```

最後の
`Are you sure you want to continue connecting (yes/no/[fingerprint])?`
で `yes` を入力することで、接続できます。

※この部分も自動的に `yes` として勝手に接続されるようにすることも可能ですが、意図しない変更があることの可能性も考え、手動で `yes` を入力する判断をするほうが好ましいと考えます。
JDLA Generative AI TEST 2023 #2　合格体験記

## JDLAのGenerative AI TESTってぶっちゃけどうなのよ？！
って思ている人たちが結構いそうな気がするので、2023#2の合格体験記（というかただの感想）を綴ろうと思います。

### 受験しようと決意したワケ
1.安い（2,200円）
2.自宅で受験可能
3.オープンバッジ有
4.試験時間が短い（20分）
5.問題数が少ない（20問）
が最も大きなポイントでしょうか。一言で言いますと、手軽に気軽に受験できそうだったから！個人的にはオープンバッジが有ったのがポイント高いです。

### 勉強時間
1時間！
確かスキルアップAI社から模擬問題が数問公開されていましたので、それを解いて解説読んで終わり。
※ただし前提としてG検定とE資格に合格するレベルの知識は持っていましたので、AIについてまったくの素人というわけではございません。

### 試験当日
20分で20問って結構時間にシビアだよなぁと試験前に覚悟はしていましたが、案の定でした。
ザ・時間との勝負って感じで、解答に迷っている時間なんてぜんっぜんありません！
わからない問題はさっさと諦めて（選択肢にマークはちゃんとしておいて）次々に進めていかないと、最後の問題までたどり着けない感じでした。
※試験内容については公言してはならない決まりですので、ここでは触れません、悪しからず。

### 受験してよかったか？
結論、よかったです。合格通知きたときは純粋に嬉しかったし、ミニテストのレベルだけど第三者に試験合格したぜって言えるのは素直に良いと思います。

### 改善してほしいこと
試験時間と問題数のバランス！もう少し時間に余裕が欲しい気はします。
自宅受験だからわからない時はググればいいか～って楽観的に思っていましたが、ググっている時間全然ありません！(笑)
もしかしたら、調べながら受験させないために、主催者側が意図的にシビアな時間設定にしたのかもしれないですね。

### おわりに
おススメ度
★★★★☆
星4つにしておきます。

受験迷われている方はぜひご参考にしてみてください。
JavaScript学習の記録3

# はじめに
復習も兼ねて，JavaScriptの学習内容をアウトプットしていきます．

# mapを使った配列の処理
mapメソッド：配列・オブジェクト内のすべての要素に処理を行い，新しい配列・オブジェクトを作成するメソッド．
```javascript
// 使用例
const numbers = [1, 2, 3];

const doubleNumbers = numbers.map((number) => {
    return number * 2;
};

console.log(doubleNumbers);
```
```javascript
//実行結果
[2, 4, 6]
```

# 三項演算子 : ?
使い方は，
`(ある条件) ? (trueの時返す部分) : (falseの時返す部分)` 
```javascript
//使用例
const val = 3 > 0 ? "trueです" : "falseです";
console.log(val);
```
```javascript
//実行結果
trueです
```
Unityで斜方投射を実装した

# 前置き
自分は「物理も数学もわからん人」なので分かりやすく記事書けるかなと思って書いてみました。早く完全に理解したいものです。

# 斜め上にボールを投げたときの実装をしてみたい！
ということで斜方投射を実装してみました。
> 斜方投射とは物体をある初速度をもって空中に投げ出す動作である。空気抵抗が十分小さく無視できる場合、斜方投射された物体の軌跡は放物線を描く。(Wikipediaより)

# 斜方投射の物理公式
斜方投射は縦方向、横方向にそれぞれ移動が行われています。そのためXに進んだ距離とYに進んだ距離を求める必要があります。
公式がこちらです。

```math
vx(x方向にt秒後に移動した距離) = v0cosθt　
```

```math
vy(y方向にt秒後に移動した距離) = v0sinθt−(1/2)gt2
```
>※v0は初速度　tは時間　gは重力

この公式をもとに**縦横それぞれ出発地点からt秒後にどれ位移動したのか。**
を求めてあげればいいのです。

# C#で早速書いてみる
それでは公式に沿ってコードを書いてみます。
Mathf.SinとMathf.CosというMathfクラスを使用して実装していきますが、
**Mathf.Sin()/Cos()/Tan()はラジアンを使用している**ので「度」の形のままで渡しても正しく挙動しません。

:::note info
補足
ラジアンとは、ざっくりいうと
角度を ° とは別の単位であらわしたものだよ
:::

度からラジアンに変換する定数の`Mathf.Deg2Rad`が、Ｍathfクラスには用意されています。
（度数にMathf.Deg2Radを掛ければラジアンになる）

以下が、公式をコードに落とし込んだときのものです。

```cs
float vx = Mathf.Cos(Mathf.Deg2Rad * degree) * v0 * time;
float vy = (Mathf.Sin(Mathf.Deg2Rad * degree) * v0) * time - (1 / 2) * gravity * Mathf.Pow(time, 2);
```

# 完成図
移動距離の求め方が分かったので、毎フレームごとに移動距離をもとめてボールをその位置に移動させます。
以下が実装したときのコードです。

```cs
    float gravity = 9.8f; // 重力
    [SerializeField] private float degree = 30f; // 角度
    [SerializeField] private float v0 = 10; // 初速度
    private IEnumerator ProjectileMotion(Transform ballTransform)
    {
        // 経過時間 
        float time = 0;
        // 開始位置
        Vector3 startPos = ballTransform.position;
        while (true)
        {        
            time += Time.deltaTime;
            float vx = Mathf.Cos(Mathf.Deg2Rad * degree) * v0 * time;
            float vy = (Mathf.Sin(Mathf.Deg2Rad * degree) * v0) * time - (1 / 2) * gravity * Mathf.Pow(time, 2);
            
            // ボールの位置を移動。(画面左方向に投げたいのでXは移動距離を引いている)
            ballTransform.position = new Vector3(startPos.x - vx, startPos.y + vy, ballTransform.position.z);
            
            // y方向への移動がなくなったら終了。
            if (vy <= 0)
            {
                // ボールのy座標は0にして調整　
                ballTransform.position = new Vector3(ballTransform.position.x, 0, ballTransform.position.z);
                yield break;
            }
            yield return null;
        }
    }
```
完成系はこちら。
ボールをセットしたあとに斜方投射しています。
![斜方投射.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2882297/70f51a8e-7aec-9c8e-b24c-f92930fd29ba.gif)

# 最後に
物理と数学を調べながらやってると学生時代のわずかな記憶が呼び覚まされかけた気がしました。
調べて→実際に動かすのは面白いですね
この後は、応用として決められた秒数・着地位置・角度から逆算してスピードの調整をしていこうと思います。

# 参考
- [5分で解ける！斜方投射の立式に関する問題](https://www.try-it.jp/chapters-8001/sections-8036/lessons-8062/practice-3/)
- [ラジアン（弧度法）の意味と「度」への変換方法](https://sci-pursuit.com/math/radian.html)
【初心者向け】生成AI勉強会で使用した資料を公開 #2（ChatGPTとCanvaでSNS投稿を大量生産する方法）

---

:::
### <font color="#03B47E">ChatGPTを業務で活用して効率化する方法</font>
ChatGPT含む生成AIを業務で活用したい方は勉強会を行なっておりますので、以下のフォームからお問い合わせください⭐️
:::

https://tenho7.jp/contact/

---

## 勉強会の内容
「ChatGPTとCanvaでSNS投稿を大量生産する方法」について勉強会を行ったのでその時の資料を公開します。
（2023年の9月に行ったため、内容が変わっている場合もありますが）誤字脱字や気になった部分がありましたらご連絡ください。

## 資料
<details><summary>目次</summary>

* はじめに
    * 会社概要
    * スピーカー紹介
* ChatGPTとCanvaを使ってたった1時間で投稿100個作成する方法
    * SNS投稿画像を大量作成する流れ
    * ハンズオン（下に動画を掲載しています）
    * フィード動画の大量作成方法

</details>

#### 実際の資料

<script defer class="speakerdeck-embed" data-id="b25a6eb3fc9e45cc80009419e24a6f19" data-ratio="1.7777777777777777" src="//speakerdeck.com/assets/embed.js"></script>

#### ハンズオン動画

<iframe width="560" height="315" src="https://www.youtube.com/embed/6g_w0plDiFU?si=ZnoUycHC88T-Efqg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

## 生成AI学習カリキュラム無料公開中
ChatGPTや生成AIを業務で活用するための無料カリキュラムを無料で提供しております。
受講したい方は以下のリスキリングコンソーシアムで会員登録してお申し込みください⭐️

https://japan-reskilling-consortium.jp/register/request

:::note warn
**お問い合わせ数1位**
リスキリングコンソーシアム様にて提供させていただいております
『【ChatGPTを活用しよう】プロンプトエンジニア入門』
が年間お問い合わせ数1位をいただきました
:::
![IMG_2553.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670666/4e7aee1e-4df9-68c9-44db-b5db84663cf4.jpeg)

無料で提供させていただいておりますので、以下のリンクからお問い合わせください⭐️

https://japan-reskilling-consortium.jp/register/request

---

:::
### <font color="#03B47E">ChatGPTを業務で活用して効率化する方法</font>
ChatGPT含む生成AIを業務で活用したい方は勉強会を行なっておりますので、以下のフォームからお問い合わせください⭐️
:::

https://tenho7.jp/contact/

---

## 導入事例
弊社は企業様や行政様に向けて、生成AIの研修や導入支援を行っております。

**三重県伊勢市様**
伊勢市の職員の方や、伊勢市内の企業様に向けて「ChatGPTの業務での活用方法と使用する際に注意するリスク」についてセミナーと「プロンプト一覧集」の提供を行いました。

https://markezine.jp/article/detail/42973

**JR九州鉄道（九州旅客鉄道株式会社）様**
JR九州様の従業員様や関連企業様に向けて、「ChatGPTや生成AIの業務での活用方法や活用事例」についてセミナーを行いました。

https://prtimes.jp/main/html/rd/p/000000014.000116947.html

**JR九州コワーキング「Q」様**
JR九州様が運営されているコワーキングスペース「Q」にて事業者様に「ChatGPTを業務で活用する方法とリスクの対処法」についてセミナーを行いました。

https://prtimes.jp/main/html/rd/p/000000010.000116947.html

**株式会社シード様**
株式会社シード様の従業員様に向けて、「ChatGPTの基本と業務でのプロンプト活用術」についてセミナーを行いました。

https://tenho7.jp/case/nbnqt7-Z/

**株式会社CINC様共催**
マーケター向けに「Webマーケティングで活用できるChatGPT活用事例」についてのセミナーをCINC様と共同で開催しました。

https://techplay.jp/event/908478

**株式会社D4c Academy様共催**
個人向けに「ChatGPTの業務活用とリスクの対処法セミナー」をD4c Academy様と共同で開催しました。

https://tenho7.jp/case/lebuhbWH

**デジタルシティ株式会社様**
デジタルシティ株式会社様の従業員様に向けて、「ChatGPTの業務での活用方法と使用する際に注意するリスク」についてセミナをー行いました。

https://tenho7.jp/case/FynteYF9/

**青山学院大学様**
青山学院大学の生徒様に向けて、「ChatGPTを用いた事業戦略方法」について授業を行いました。

https://tenho7.jp/case/1g3Q6I4/

**愛媛県今治市様**
今治市の職員様に向けて、「ChatGPTの業務での活用方法」について勉強会を行いました。

---

:::
### <font color="#03B47E">ChatGPTを業務で活用して効率化する方法</font>
ChatGPT含む生成AIを業務で活用したい方は勉強会を行なっておりますので、以下のフォームからお問い合わせください⭐️
:::

https://tenho7.jp/contact/

---
ubuntuでaptした時などのデーモン再起動を確認なしで実行する

デーモンの再起動は、必要なら勝手にやってもらって構わない。

```shell
echo "\$nrconf{restart} = 'a';" | sudo tee /etc/needrestart/conf.d/50local.conf
```

参考記事：https://blog.n-z.jp/blog/2022-04-22-needrestart.html
mkdirとchmodとchownをいっぺんにやる

ルートユーザで、一般ユーザ用の作業ディレクトリを作成したいとき、
なじみのコマンドだと3コマンド実行する必要がある。

```shell
mkdir /home/ubuntu/work
chmod 755 /home/ubuntu/work
chown ubuntu:ubuntu /home/ubuntu/work
```

これと同じことが、下記コマンドで一発でできる

```shell
install -d -m 0755 -o ubuntu -g ubuntu /home/ubuntu/work
```
React(Next.js)でTailwindが効かないときにみるべきところ

# はじめに

自分でも何度も同じところで引っかかっているのでまとめておきます

# 問題

ReactやNext.jsでTailwindCSSを導入したのですが、なぜかスタイルが効かないということが起きていました。

Viteを使ったReact環境やNext.jsで起きていることが多いです。

# 解決方法

自分の中では解決方法として2つをやってだいたいスタイルが当たるようになっています。

## 1. postcssをいれる

以下のコマンドを実行するとうまくスタイルが当たりました

```
$ npm install -D tailwindcss postcss autoprefixer
$ npx tailwindcss init -p
```

postcssがないとスタイルが効かないときがあり、tailwindの公式サイトにはココは乗っていませんでした

## 2. tailwind.confを見直す

Next.jsのプロジェクトによくありがちなミスです。Tailwindの公式サイトの設定は以下のようになっています。

```js:tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: [
    "./src/**/*.{js,jsx,ts,tsx}",
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}
```

しかし、この設定では`src`以下に設定が反映されるようになっています。
Next.jsでは`app`以下に設定する必要があります

```js:tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: [
    "./app/**/*.{js,jsx,ts,tsx}",
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}
```

# おわりに

だいたいこの2つが原因になることが多かったので書いてみました
また何か追加があれば更新する予定です。
pep8抜粋

# pep8とは？
pythonのコードを記載する際のスタイルガイド
https://pep8-ja.readthedocs.io/ja/latest/

あくまでガイドなのですべて順守する必要はない。
が、守ったら可読性が上がると感じたものを抜粋して記載する。
pythonに限らない、リーダブルコードに乗っているようなものもあるが気にしない。

# インデントはスペースを使う
視覚的に見た通りの文字が記載されているほうが好ましい。
エディタによってはタブが表示されるが、エディタに依存せずに空白は見た目通りスペースであるほうがよい。

# 1行の長さは79文字以内
長すぎると、読むのがつかれる。
厳密に文字数を守る必要はないが、エディタをモニターの半分で表示したときに、折り返さずに表示しきれる長さが大体これくらい という目安で記載するとよい。

# パッケージの記載順は標準→サードパーティ→ローカル特有

```python
# 標準ライブラリ
import os
import sys

# サードパーティ
import requests

# ローカル特有
import mypackage
```

アルファベット順にするとよい。

# 演算子のスペース

優先度が最も低い演算子の前後に、1つだけ半角スペースを入れる。
2スペース以上は使わない

```python
i = i + 1
submitted += 1
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)
```

# not ... is ... ではなく、 is not 演算子を使う

論理的には同じだが、二重否定はわかりづらい(日常会話も同じ)。

```python
# わかりやすい
if foo is not None:
# わかりにくい
if not foo is None:
```
Google ファミリーリンクのウェブサイト制限がWindowsでも有効になっていた

# いつのまにかWindowsで対応していた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329842/9373b67a-cfc2-c2d0-08d4-1d318f7be01a.png)

「新規」 と書いてあるので最近のアップデートと推測してよいかもしれませんが明確なアップデート情報を見つけられませんでした。もっと大々的にアピールして良いことだと思うのですが。

---

# 以前はAndroidかChrome OSしか対応していなかった
公式サイトの表記は2023年12月現在「AndroidやChrome OS」と記載されています。

https://safety.google/intl/ja/families/parental-supervision/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329842/934358ca-b915-da52-c342-299db5b77bbc.png)

https://safety.google/intl/en/families/parental-supervision/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329842/f063f35c-f0d7-585c-4850-8f7783148432.png)

外部サイトのHow toでも、"on Chrome for Androids and Chromebooks" と記載されています。

https://www.bark.us/tech-guide/browsers-chrome/

[twitterで探してみたところ](https://twitter.com/search?q=chrome%20%E3%83%95%E3%82%A1%E3%83%9F%E3%83%AA%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%AF%20until%3A2023-12-01&f=live) 、11月にとある方が使えなくなったとのことでこの時期のアップデートだったかもしれません。

https://twitter.com/Nekkar_hosiyomi/status/1725067442798665742


---

少なくとも2023年6月時点ではWindows非対応でした。子供用のPCを設定する際にいろいろ検討していてこの辺りの仕様とにらめっこしており、以下のような図を作っていたほどです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329842/a10c01d5-5129-6134-445b-648834a13666.png)

YouTubeへのアクセス制限をしたところで、Windowsにインストールしたchromeからはアクセスできてしまうのを避けるためにこうしていました。

それがWindowsも含めてchromeに統一してもアクセス制限下に出来るようになりました。やりやすいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329842/2cee32ce-ce44-4db3-93ee-9124a0e7f2bd.png)

# わずかな挙動の違い
chromeのアクセス制限はブラウザのログインアカウントに紐づいています。
Edgeのアクセス制限は **OSのログインアカウント** に紐づいています。

後者が少しややこしいと感じました。以下のパターンだとアクセス制限がなされないのを確認しています。
- Windowsを親のアカウントでログイン
- Edgeを子どもアカウントでログイン

共有PCでログインユーザーが1つの場合、望んだ制御にならないかもしれません。各位ご確認ください。
フロントエンド と バックエンド の デバッガ 方法（サンプルプロジェクト）

フロントエンド　　
debuggerは、JS言語（げんご）のデバッグに使われる重要な用語である。
![截屏2024-01-08 16.13.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666047/c1110cd0-5532-ec0f-9b4b-4d82aaa459d5.png)



バックエンド  
デバッガポイント。 確認したいコードの前の列番号にマウスを合わせてクリックする。
クリック前
![截屏2024-01-08 16.34.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666047/30cb9628-6e40-8086-2872-fe3185698757.png)
クリック後
![截屏2024-01-08 16.35.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666047/e51bb67a-a5a2-27e1-f937-601e0452b971.png)
Swiperでループにしているのに次のスライドが表示されない

# はじめに

Swiperを利用していて困ったことがあったのでまとめます

# 問題

Swiperでスライダーを作成しました
ループに設定したのですが、末尾まで行くと次のスライドがなぜか表示されませんでした

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/1f9196d3-5e81-0bc1-4cd6-1b574684ad24.png)

(画像はサンプルでサッポロビールからお借りしました)

本来であれば右に最初のスライドが表示されるはずでした


# 解決方法

コンソールに以下の注意がでていました

```
Swiper Loop Warning: The number of slides is not enough for loop mode, it will be disabled and not function properly. You need to add more slides (or make duplicates) or lower the values of slidesPerView and slidesPerGroup parameters
```

スライド数が少ないと症状が出ることが判明
スライド数を3から7にかえたところうまく行くようになりました。

# おわりに

以下のサイトでスタイルを整えるといい感じになります。

https://junpei-sugiyama.com/swiper-summary/

# 参考

https://www.sapporobeer.jp/

https://junpei-sugiyama.com/swiper-summary/
ヒューリスティック/マラソン コンテスト Codingame (Fall Challenge 2023) 初参加記　229th / 4669

# やった事
- Codingame (fall challenge 2023)に参加
- 最終順位
    - 229th / 4669
    


![15c3m-cn0i5 (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292016/48175b58-2083-b25a-3eff-fd1e97220d88.gif)



# 初めに
最近AHC029を参加したこともあり、ヒューリスティック熱が入ってしまいました。

AHC以外にもヒューリスティックコンテストが開催されてないかと調べた所、今回ちょうどよくCodingameで開催されていた為、参加しました。

# Codingameとは？
簡単に述べると各自が作成したBotをゲーム内で競わせるコンテストが開かれている場所です。

## AHCとの違い
- 国外参加者が多い
- 最大スコアではなく最大勝利数を目指す
- 参加者はリーグに分けられる(Wood{1,2,3},Blonze,Silver,Gold,Master)
- 各リーグにいるBossを倒すと次のリーグに進める
- リーグが上につれてにルールが解禁される
- **提出記録の日時表示がかなりアバウト**

![スクリーンショット 2024-01-08 15.38.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292016/c717f8dd-b744-18a5-de32-6a9a78fc3838.png)

## 感想
- 次々と追加されるルールはやっていて面白かった
    - 標準入力は最終ルールと同じ為、現時点で使う変数がわかりにくい
- Bossというわかりやすい目標がある為、モチベが保ちやすい

AHCに参加が多い自分にとっては新鮮でしたし、別の楽しさがあると思いました。


# Fall Challenge 2023
- 12/19 ~ 1/9 

![fall2023.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292016/e56bef5d-82a3-8d4b-57b5-2ee4c306f702.jpeg)


## ルール
- 深海で遠隔ドローンを用いて魚を探し出す
- ドローンにはライトが付いており、範囲内の魚を見つけ出せる
- 対戦相手のドローンも存在する
- 魚の種類、色を揃えると追加点が存在する
- ドローンの音で魚が逃げ出す
- 最大200ターン

## ゲーム画面

![15c3m-cn0i5 (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292016/83744aa3-34eb-0f48-d415-dbf24ef5192d.gif)

- https://www.codingame.com/replay/763348946

## やった事 (うろ覚え)

### Wood リーグ
- Wood{3}
    - ライト関係なしに位置がわかる為、ドローンが全ての魚を見つけられるように動かした
- Wood{2}
    - 魚の位置はわからない
    - 魚の位置がソナーで4方向判別できるようになる
    - 4方向の中で反応数が多い方向に移動
- Wood{1}
    - ドローンを攻撃する魚が追加
    - できるだけその魚がいない場所に行く

### Blonze リーグ
- ドローンがそれぞれ二台になる
- 左と右を分担作業させるようにした

### Silver ~ Gold リーグ
- ルール追加はなし
- 一度発見した魚の移動を見えないところでも予測し、移動の優先順位を変更
- 無駄のない移動を心がける


## 反省点
- 対人戦なのに相手の点数による行動変化を実装しなかったのでできていたらもっと勝利できた可能性がある
- 英語の翻訳を間違えた事を最終日に気がついたのでもっと確認すべきだった
- 問題の仕様でFor文を多用したかったが、PyPyが使えない為、速度の面ですこし妥協した実装になっている


# まとめ
- Codingame初参加
- 最終順位
    - 229th /4669
- PvP側面が大きいヒューリスティック
- サンプルコード+リーグ毎で初参加もしやすい
- AHCとは異なる面白さがあるからみんなもやろう！！！！！！！
vim コマンド

ファイルを開くときに、tabでパス補完する。新しいタブで開く
:tabfind ~/hoge 

:qa タブを全部閉じる
:wqa　保存してタブを全部閉じる

:sp ウィンドウを上下に分割
:vs ウィンドウを左右に分割

DIFF表示する
vim -d hoge.c hoge1.c
「現代数理統計学の基礎」演習問題解法メモ　第4章問1～6

第4章に入ります。問6は、どうも範囲の考え方がよくわかりません。
なお、緑文字は根拠・説明です。
![第4章問1　P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/03d09011-09f5-18e1-032c-2c6bf0d2493f.jpeg)
![第4章問1　P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/93c050df-c621-051b-8bc4-7065adf20f36.jpeg)
![第4章問2(1) P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/af2bc3f4-2d46-5be0-8b07-3f7259122ec1.jpeg)
![第4章問2(1) P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/b795a354-744f-196e-b29b-1b7734f2b992.jpeg)
![第4章問2(2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/1f907ff5-8865-7c3d-69ea-9782f270053e.jpeg)
![第4章問3(1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/0bed7bab-26ab-09a7-72a7-cad82b008a19.jpeg)
![第4章問3(2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/841e46ca-3432-895e-58db-c5265244c7e8.jpeg)
![第4章問4　P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/a12d0a87-434e-5ec3-f76d-4efcd3217f61.jpeg)
![第4章問4　 P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/1311d4b8-414f-51fb-d433-887c1f3401ba.jpeg)
![第4章問5　P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/54e4f794-fea6-6825-2ddb-47c4f1cfabfd.jpeg)
![第４章問5　P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/f7124768-e061-8423-4d49-0170f2b49158.jpeg)
![第4章問5　P3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/0d7b5382-b9bf-3eab-0102-f8d20f6de47e.jpeg)
![第4章問6　P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/dd81b2f2-3da4-1045-cd64-6784c02abd0f.jpeg)
![第4章問6　P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/4a1a7680-ad4b-d18a-2015-51ed1bccd5ea.jpeg)