OmniAICreator/Qiita-1.07M huggingface dataset:
PHP Fatal error:  Uncaught Error: Call to a member function prepare() on null

phpでtodoアプリを作っていたら
`
PHP Fatal error:  Uncaught Error: Call to a member function prepare() on null
`
というエラーに出くわしたので原因と解決策を記録に残します。
結論から言うと自分の場合は`$pdo = db_connect();`の部分で$pdoオブジェクトが null だったためにこのエラーが発生していました。
# 全体コード
db_connect.phpでDBに接続するコードを書いています。
login.phpでDB接続用の関数を呼び出しています。
```db_connect.php
<?php
    //DB名
    define('DB_DATABASE', 'todo-search');
    //Mysqlのユーザー名
    define('DB_USERNAME', 'root');
    //Mysqlのログインパスワード
    define('DB_PASSWORD', 'root');
    //DNS
    define('DSN', 'mysql:host=localhost;charset=utf8;dbname='.DB_DATABASE);

    function db_connect(){
        try{
            //PDOインスタンスの作成
            $pdo = new PDO(DSN, DB_USERNAME, DB_PASSWORD);
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }catch(PDOException $e){
            echo $e->getMessage();
            die();
        }
    }

?>
```
↑この関数内ですでに間違えていますね🤫


```login.php
<?php
    require('db_connect.php');

    $name = $_POST['name'];
    $password = $_POST['password'];
    $submit = $_POST['submit'];

    if(!empty($submit)){
        try{
            $pdo = db_connect();
            $sql = "SELECT * FROM users WHERE name = :name AND password = :password";
            $stmt = $pdo->prepare($sql);
            $stmt->bindParam(':name', $name);
            $stmt->bindParam(':password', $password);
            $stmt->execute();

        }catch(PDOException $e){
            echo $e->getMessage();
            die();
        }
        if($stmt->fetch(PDO::FETCH_ASSOC)){
            header("Location:main.php");
            exit;
        }else{
            echo '<font color="red">パスワードか名前に間違いがあります。</font>';
        }
    }

?>
```


# エラーの原因
冒頭でも述べましたが、login.phpファイルの`$pdo`がnullになっていたことが原因でした。
```db_connect.php
function db_connect(){
        try{
            //PDOインスタンスの作成
            $pdo = new PDO(DSN, DB_USERNAME, DB_PASSWORD);
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            //returnが抜けてた！
            return $pdo
        }catch(PDOException $e){
            echo $e->getMessage();
            die();
        }
    }
```
db_connect()関数でreturnするの忘れてました、、
returnを追記したらエラーが解消しました！！
読書感想文『プログラマー脳』

## はじめに
Felienne Hermans著『プログラマー脳　～優れたプログラマーになるための認知科学に基づくアプローチ』
[プログラマー脳 ～優れたプログラマーになるための認知科学に基づくアプローチ](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E8%84%B3-%EF%BD%9E%E5%84%AA%E3%82%8C%E3%81%9F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E8%AA%8D%E7%9F%A5%E7%A7%91%E5%AD%A6%E3%81%AB%E5%9F%BA%E3%81%A5%E3%81%8F%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81-%E3%83%95%E3%82%A7%E3%83%AA%E3%82%A8%E3%83%B3%E3%83%8C%E3%83%BB%E3%83%98%E3%83%AB%E3%83%9E%E3%83%B3%E3%82%B9-ebook/dp/B0BVDQM5H1/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3BRFWT7YKUR8D&dib=eyJ2IjoiMSJ9.wjLDWpHBTCAGc1opETJVavDN991IdKK0S1rd7JrODlPzg4TqNbKFqcMwedMA35hRc6zPBOv9nLEbregY2P4zo8xQA2ncyWm7lFkZTWy02k5Kn7m75CQYnO-4VucSy3QySFIVlPfXRDNxXKykX81M0mMydM0M1sWFU-TGAmcwV9qEpD7tXTD3ExqrP7bmSyteoK_38fyHRs8ZTKIpqzFDLo9IBt-UTv_BgsL_frPpdVnuAdHIUY6VbtZVjzhQAd8GfiYTpc81ryFnNhC2O7DDoRlX-EVh_UBKgCVm9Lm0oA8.OXu7UFWq75ZjtIyMfLN25AJH61VMqiDOxjDNs9lYbMo&dib_tag=se&keywords=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E8%84%B3&qid=1709337838&sprefix=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E8%84%B3%2Caps%2C221&sr=8-1")
を読みました。
きっかけは図書館にあったからです。出版から新しくてきれいな状態でした。
翻訳本で少し読みづらかったですが、認知科学からのアプローチで興味深い内容でした。
以下はメモ兼感想になります。

## 認知プロセス
- 長期記憶
- 短期記憶 (30秒以上保持できない）
- ワーキングメモリ　（実際の思考）

プログラミング時には長期記憶と短期記憶の両方をワーキングメモリで処理する

## コードの速読
**コードを正確に早く読むことがプログラミングのスキルを向上させるのに役立つ**
- コードを読むときに最初に情報が格納されるのが短期記憶
短期記憶を鍛える（何度も読む）のと同時に記憶に残りやすくする（わかりやすい単語、デザインパターン、コメント）

## 忘却に対する対応
- 忘却曲線
感覚をあけて繰り返す
積極的に思い出そうとする
能動的に考える

## 複雑なコード
ワーキングメモリに認知的負荷がかかる
負荷を軽減する方法
認知的リファクタリング(コードの保守性を高めるためではなく、自分がわかりやすくするために行う）
使い慣れない言語構造の置き換え
PDFなどに印刷してマーカーをつける
サポートアプリケーションの活用（PythonTutor）
変数の役割を考える
## コードの読み方
- 理解できたところ、理解できなかったところをはっきりさせる
- コードの中の重要な行を判断する
- 変数の意味を推論する
- 自問自答を行う
- コードの要約を行う

## 問題解決
問題解決には長期記憶が用いられる
- 問題をどのように表現するかがその問題を考えるのに大きな影響を与える
- 見慣れた問題なら、脳はより簡単に解決できる
- 他の人の問題解決を研究する
- 同僚と共同作業を行う

記憶の種類　
潜在記憶
顕在記憶　エピソード記憶
   　　　　意味記憶


潜在記憶の強化　意図的な練習を行う

## 熟達者と初心者の違い
長期記憶に蓄積されている記憶の量が違う
→初心者にとっては認知的負荷が過剰になり、コードの全体像を見れない状況

- 認知的負荷を正しく管理するために活動を１つずつ行ってもらう
探索：コードベースの全体像を把握
検索：特定のインターフェイスの実装箇所を探す
転写：作業の手順について明確な計画を与える
理解：特定メソッドを自然言語で要約するなどでコード内容を理解する
増強：クラスへの機能追加

 - 新人の記憶をサポートする
 長期記憶のサポート：関連情報の説明
 短期記憶のサポート：１つのことに特化したタスクの用意
 理解するだけのタスクを割り振る
 コードを一緒に読む

## 感想
脳科学的な記憶領域がプログラミング作業でどう使われるかの説明だけではなく、強化するための具体的な方法まで示してくれていて素晴らしいと思いました。
良いコードのためのレビュー観点につかえるものもまとめられていて活用していきたいです。
また、変数名の付け方については１章分割り当てられていて、重要性が伝わりました。
DockerでUbuntu22.04のイメージを取得して起動するーDockerfile利用編

# はじめに
[前回](https://qiita.com/kurokoya/items/1dc40d35fc62bdd7c21b)は、Dockerイメージをpullして、起動する方法を記事にしました。

今回は、Dockerfileを利用して、Dockerイメージを作成して、コンテナを起動する方法を記事にします。なお、作成するDockerイメージのタイムゾーンを日本時間に変更しています。

### Dockerfile作成

```Dockerfile
# Use the official Ubuntu 22.04 base image
FROM ubuntu:22.04

# Set the timezone to Asia/Tokyo
RUN apt-get update
RUN apt-get install -y tzdata
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

### Dockerイメージ作成
```bash
docker build -t my-ubuntu22.04-image .
```

### コンテナ起動
```bash
docker run -it -d --name my-ubuntu22.04-container my-ubuntu22.04-image 
```

### コンテナに入る
```
docker exec -it my-ubuntu22.04-container /bin/bash
```

以上です。
CodeIQ:「ウッド・キーパー」問題の解答

Kawazoe(@riverplus)さんのCodeIQの問題です。
問題はこちらのお世話になりました。解答もあります。
->https://sw-logic.com/Portfolio/Programing/CodeIQ/3314.php
こちらに関連の情報があります。
->https://togetter.com/li/1125965
テストケースはあちこちからかき集めたような気がします。

左下から右上に上がる斜線ごとに右端から積み上げます。
ある線上の数<=右隣の線上の数+1となります。
ある状態から①と②の両方を試みる事を繰り返します。
①残りの丸太の数をc、左端の数をnとするとc-nとn+1の小さい方を左に並べる
②左端の丸太を一つ除く
最後に①の場合の数と②の場合の数を足します。
prologでかきました。
functor/3とtwoar/3を使って二次元配列を作りメモ化します。
キーはcとn、値はその時点までの場合の数です。

```Prolog
%:-initialization(start).    %ideone
%start.

twoar(F,0,_).      % 二次元配列、メモ化に使用
twoar(F,X,Y):-arg(X,F,V),functor(V,z,Y),X1 is X-1,twoar(F,X1,Y).
data(F,X,Y,V):-arg(X,F,V1),arg(Y,V1,V).　%データの入出力

tum1(0,_,_,1):-!.
tum1(_,0,_,0):-!.
tum1(C,N,F,R):-
    data(F,C,N,R),nonvar(R),!.
tum1(C,N,F,R):-
    C1 is C-N,M is min(C1,N+1),tum1(C1,M,F,R2),N2 is N-1,
    tum1(C,N2,F,R3),R is R2+R3,data(F,C,N,R).

solve(C,B):-
    functor(F,x,C),N1 is integer(sqrt(C*2)),twoar(F,C,N1),
    (tum1(C,1,F,R)->(R=:=B->Str=" ok  ";Str=" no  "); write(fail)),
    write(" "),write(Str),writeln(R),!.   

start:-f(C,B),solve(C,B),fail.

f(1,1).
f(3,2).
f(4,3).
f(5,5).
f(10,78).
f(11,135).
f(60,72875530905117).

```
ビルマんちゅ：「ついでショップ」（グループ9）

### アプリの一言紹介
- 課題
公共交通機関が少ない都市部ではないところの買い物手段が限られてしまっている。
メンバーの学校である高専は交通手段がバスしかなく、気楽に使うことができない。
- 解決案
買い物を代行させる
- こんなアプリを作りました！
ユーザーでマッチングできる買い物代行アプリ
- アプリの一押しポイント！
代行する側、させる側で同じUIを使用しているのでシンプルで使いやすい
ステータスで代行することができるお店を指定できる、
すべてmapで確認することができる
お互いにwinwinの状態である。
### アプリの背景
人口が少なかったり、高齢化が進む地域でのお店や交通の不便が多く、買い物手段が限られている。それらを手助けする意味でこのアプリを作りました。
### アプリの紹介
- アカウント新規登録・ログイン機能
![Screenshot_1709304085.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731867/ebc03a9a-bc27-63e5-ac50-75a509f5bad9.png)
![Screenshot_1709304088.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731867/19f9e92c-0d71-c873-71bb-3838ce5c8a4f.png)
- map・依頼機能 
![Screenshot_1709304107.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731867/52bfc317-7a67-86fa-a2c6-de200194e02e.png)
![Screenshot_1709304126.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731867/61902796-2ef8-1ca5-f745-c4b3b585dc19.png)
![Screenshot_1709304151.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731867/d4b09453-0ab7-4dab-b521-85aaa4524493.png)
![Screenshot_1709304164.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731867/5dd6d548-fdd1-d7cd-5f03-abbfd09e9592.png)
- チャット機能
![Screenshot_1709304156.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731867/217a3960-bb90-1a57-888b-8236f9dabec1.png)
- 設定機能
![Screenshot_1709304169.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731867/1f2762de-9dd2-e2f8-c278-8e5f19cfd641.png)
![Screenshot_1709304170.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731867/5a7df021-1f3c-b5d0-1577-275032d75618.png)
![Screenshot_1709304175.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731867/70dfeba1-d593-8881-d965-3f719a2af7fc.png)
### アプリの技術紹介
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731867/37f7eefd-a79a-a6bb-0413-8058d757ac57.png)
### こだわり
シンプルで使いやすい、わかりやすいを目指して、頼むまでのやり方を工夫したり、ユーザー目線で機能を考えたりしました。map機能を取り入れることで、情報が見てすぐわかるのがこだわりです。
### 今後の意気込み
初めてのハッカソンで、自分たちで考えたものを形にしていくことの楽しさを知れた。
今回は短期間で詰め込んでたけど、今度は人数を増やしてゆっくり丁寧に開発してみたい。
オンラインの影響もあってチームでのコミュニケーションをとる機会が少なかったのでもっと時間とって、話ながら開発していきたい。
ハッカソン最高！！！　　　　　　　　　　　　　　　　　　　　れん　　　　　
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
久しぶりにコードを書いたからワクワクした。
同じ高専だけど知らない人と話し合って友達になったことが良かった。
今回のハッカソンはきっかけでFlutter 言語と Firebaseを初めて触った。調べて書いてエラーになって時間が多くかかったときもあったけど、いい経験になった。短期間でもう無理だと思ったことがあるけど、最後まで諦めず頑張れた。今後はある程度の機能やエラーはすぐに解決できるようになるくらい経験を積んでいきたい。
もっとスキルアップしてまた参加したい！　　　　　　　　ティンザー
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
プログラミングとは今まで縁がなくて少し不安だったけど、チームの仲間と協力して課題解決やプログラミングをして一つの目標に向かってみんなで進んでいくところがすごくおもしろかった。他学年とかかわることのできたいい機会だと思った。また、短期間だけど、アプリ開発について知ることができたのもよかったと思う。自分のスキルはまだまだ低いのでこれを機会に自分で勉強してまた参加できるといいなと思いました。　　　　　そうた
Linux ショートカットキー



# ショートカットキー一覧表

| ショートカットキー | 説明 |
|:-------------:|:----:|
| Ctrl + A | 行の先頭にカーソルを移動 |
| Ctrl + E | 行の最後にカーソルを移動 |
| Ctrl + F | カーソルを1字右に移動 |
| Ctrl + B | カーソルを1字左に移動 |
| Ctrl + D | カーソルの部分の文字を1字削除 |
| Ctrl + H | カーソルの左の文字を1字削除 |
| Ctrl + U | カーソルから行頭までの文字を削除 |
| Ctrl + K | カーソルから行末までの文字を削除 |
| Ctrl + W | カーソル位置の単語を削除 |
| Ctrl + Y | 直前に削除した文字を貼り付け |
| Ctrl + L | 画面をクリアにする |
| Ctrl + S | コマンドを見えなくする |
| Ctrl + Q | コマンドを見えるようにする |
| Ctrl + C | 実行中のコマンドを強制終了 |
| Tab | コマンドやファイルなどの候補を表示 |
| ↑↓ | コマンド履歴の参照 |

CLIにおいて、ショートカットキーを使いこなせるかどうかで作業効率が変わってくるということを痛感しております。
Ubuntuでユーザーを作成する時にエラーが返ってくる

Docker Desktopが起動できなくなり、この記事を見ながらWSLの再インストールを試したときに発生したエラー
https://qiita.com/hwatahik/items/132ee3f6c4d131156b60

```
adduser: Please enter a username matching the regular expression configured
via the NAME_REGEX[_SYSTEM] configuration variable. Use the `--force-badname'
option to relax this check or reconfigure NAME_REGEX.
```

大文字を使ったのがまずかったよう。
Rubyの基本（配列 Part2）

# `map`による配列の操作
配列を操作する方法として、`each`メソッド以外に`map`メソッドを使う方法がある。
以下の例のように、配列の各値に5ずつ足すとき、`each`メソッドでは空の配列を用意してからその配列に追加するが、`map`メソッドでは新しい配列にそのまま代入できるため、`each`メソッドに比べより簡潔に書くことができる。
また、元の配列を直接更新することも可能。
```ruby:sample_01.rb
scores = [70, 90, 80]

# eachの場合
updated_scores_01 = []
scores.each do |score|
  updated_scores_01 << score + 5
end
p updated_scores_01
# 出力：[75, 95, 85]

# mapの場合
updated_scores_02 = scores.map do |score|
  score + 5
end
p updated_scores_02
# 出力：[75, 95, 85]

# 元のデータを直接更新
scores.map! do |score|
  score + 5
end
p scores
# 出力：[75, 95, 85]
```
::: note warn
元データ直接更新の場合、メソッド名の後の`!`が必須となる。
:::

# `filter`による配列の操作
配列の中から条件に合致する値のみ取り出す場合、`each`メソッドだけでなく、`filter`も使える。
```ruby:sample_02.rb
scores = [70, 90, 80, 65, 85, 77]

# eachの場合
pass_score_01 = []
scores.each do |score|
  if score >= 80
    pass_score_01 << score
  end
end
p pass_score_01
# 出力：[90, 80, 85]

# mapの場合（使えない？）
# pass_score_02 = scores.each do |score|
#   if score >= 80
#     pass_score_02 << score
#   end
# end
# p pass_score_02
# ※※※ エラーとなる ※※※

# filterの場合
filterd_scores = scores.filter do |score|
  score >= 80
end
p filterd_scores
# 出力：[90, 80, 85]

# 元データの直接更新
scores.filter! do |score|
  score >= 80
end
p scores
# 出力：[90, 80, 85]
```
.envと.env.exampleの違い

# 初めに

laravelの開発中に
.envと.env.exampleの違いがわからなかったので、調べてみようと思いました。
この二つの違いがわからない方へ参考にしてほしいと思います。

# .envと.env.exampleの違い<br><br>

## .env とは
環境ごとに異なる環境変数を定義しておくファイルです。


## .env.exampleとは
チーム開発で使う環境変数を定義するファイルです。

それぞれ詳しくみていきます。

## .envについて詳しく

.envファイルは環境ごとに異なる環境変数を定義するファイルです。
ローカル環境でのデータベースの接続はsqlite
本番環境でのデータベースの接続はmysqlなどです。

また、機密情報が.envに書かれている場合があるのでgitに上げないようにしましょう。


## .env.exampleについて詳しく

.env.exampleファイルはチーム開発で環境変数を共有したい時に使います。
.envファイルはgitにあげられません。
なのでチームの開発者たちは.envファイルの中身をみることができません。そんなときに.env.exampleファイルで環境変数を定義して開発していくことになります。


# 終わりに

.envと.env.exampleの違いについての記事を書きました。
間違い等ございましたら、ぜひコメントしてください。

## 参考文献

https://readouble.com/laravel/10.x/ja/configuration.html

https://reffect.co.jp/laravel/env-file-basic-understanding
【Laravel】PHPstanを使う

# はじめに

こんにちは、エンジニアのkeitaMaxです。

静的解析ツールのPHPStanのLaravel版のlarastanを使用していこうと思います。

https://supersoftware.jp/tech/20220920/17734/

この記事を参考に進めていきます。

# larastanをインストールして実行する

まずは下記コマンドでLaravelにlarastanをインストールします。

```
composer require nunomaduro/larastan --dev
```


次にcomposer.jsonと同じ階層に`phpstan.neon`を作成します。
```neon:phpstan.neon
includes:
    - ./vendor/nunomaduro/larastan/extension.neon
parameters:
    paths:
        - app
    # The level 9 is the highest level
    level: 5
    ignoreErrors:
        - '#PHPDoc tag @var#'
    excludePaths:
        - ./*/*/FileToBeExcluded.php
    checkMissingIterableValueType: false
```
参考元と全く同じように作成しました。

次に、下記コマンドで解析を開始します。
```
./vendor/bin/phpstan analyse
```

すると下記のようなエラーが出てしまいました。

```
PS C:\develop\docker-laravel-app\src> ./vendor/bin/phpstan analyse
Note: Using configuration file C:\develop\docker-laravel-app\src\phpstan.neon.
 21/21 [============================] 100%

 -- ----------------------------------------------------------------------------- 
     Error
 -- -----------------------------------------------------------------------------
     Ignored error pattern #PHPDoc tag @var# was not matched in reported errors.
 -- -----------------------------------------------------------------------------
     
 [ERROR] Found 1 error
 ```


https://tech.yappli.io/entry/phpstan_error

>ignoreErrors に設定したエラーパターンがマッチするファイルがない場合に発生します。 すでにエラーが解消されているので、該当のignoreErrorsの設定を削除すればOKです。
>
>ちなみに reportUnmatchedIgnoredErrors: false を設定すればこのエラー設定を無効化できます。ただし、無>効なignoreErrorsの設定が増える可能性があるので注意が必要です。詳細は以下のリファレンスを参照ください。
https://phpstan.org/user-guide/ignoring-errors#reporting-unused-ignores



このURLによると、下記を追加すると治ると書いてありました。


 
```
    reportUnmatchedIgnoredErrors: false
```

>reportUnmatchedIgnoredErrorsオプションをfalseにしておかないと、ignoreErrorsオプションに指定した正規表現にマッチするエラーが発生しなかった場合に解析失敗になってしまうので注意が必要です。
(参照：https://qiita.com/ngmy/items/1a8ef21c76d74c1d4dfe)

今回ignoreErrors使っていないと思うので、削除して対処しました。

```neon:phpstan.neon
includes:
    - ./vendor/nunomaduro/larastan/extension.neon
parameters:
    paths:
        - app
    # The level 9 is the highest level
    level: 5
    excludePaths:
        - ./*/*/FileToBeExcluded.php
    checkMissingIterableValueType: false
```

次にLevelを７に上げてみます。

一度指定したレベルを上げるのは大変なので、７に上げておきます。



# さいごに

結構すぐにPHPStanを入れることができました。

やり方が違ったり、もっといいやり方があるというご指摘がある方はコメントしていただけると幸いです。

最後まで読んでいただきありがとうございました。


# 参考文献
https://supersoftware.jp/tech/20220920/17734/

https://phpstan.org/user-guide/ignoring-errors#reporting-unused-ignores

https://qiita.com/ngmy/items/1a8ef21c76d74c1d4dfe


# 次の記事

https://qiita.com/keitaMax/items/a63e3a93f1d2f2d10473
唐突に勤怠管理システムの続きを作りたくなった有給

> あー、そういえばちょうど良い具合の勤怠管理システム欲しいな～！

https://qiita.com/e99h2121/items/ae2743613128bacf7909

有給を頂いたので、少し進めました。
上の続きです。

## Cosmos DB
Cosmos DB 無料枠を使います。

https://azure.microsoft.com/ja-jp/pricing/details/cosmos-db/autoscale-provisioned/

データ エクスプローラー から簡単にデータが見られます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/45e07bdf-925a-cfbb-a8ee-75ce16a65b90.png)

## データを入れてみる

前回 ([唐突に勤怠管理システムが作りたくなった休日 #ChatGPT - Qiita](https://qiita.com/e99h2121/items/ae2743613128bacf7909)) 同様 、Logic Apps からデータを入れてみましょう。

「ドキュメントを作成または更新 (V3)」コネクタがあります。

https://learn.microsoft.com/ja-jp/connectors/documentdb/

https://learn.microsoft.com/ja-jp/azure/connectors/connectors-create-api-cosmos-db?tabs=consumption

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/c785901c-9bc6-44a1-9433-bc4bf4eca627.png)

関数はこの辺を参照。

https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference

DAKOKU にデータが入りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/d8f5f9c1-a329-d45c-55a5-1f1e7520f9c7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/41ceb274-3006-54ab-131f-5c2aad3d8a2d.png)



## Forms トリガー応答の詳細を Cosmos DB に連携

これまた前回 ([唐突に勤怠管理システムが作りたくなった休日 #ChatGPT - Qiita](https://qiita.com/e99h2121/items/ae2743613128bacf7909)) 同様 、Forms をトリガーにします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/1265d1bf-d7bd-a8f6-cbe1-8b2283c7073c.png)

ぽちっと「出勤」すると、ワークフローが実行されます。

![dakoku2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/61de672c-f552-8edd-400b-2cb67bdfff64.gif)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/17b2c8d1-07e4-d184-c922-d1cb5efab181.png)


## クエリ

さてこの「[勤怠管理システム](https://qiita.com/e99h2121/items/ae2743613128bacf7909)」、改めて以下のご要件を頂いていたのでした。

> - 就労管理
> - Azure を使う
> - Azure OpenAI も使う
> - あとは自由

データは入れたら終わりではありません。むしろデータをどう生かすか、帳票にしたり、分析したり、活用するために入れるのです…

https://learn.microsoft.com/ja-jp/azure/cosmos-db/nosql/powerbi-visualize

[[Power BI] データをAzure Open AIで拡張しよう😀 #ChatGPT - Qiita](https://qiita.com/akihiro_suto/items/85b6e43bc12cd8bc4631)
[How to use Azure Open AI to Enhance Your Data Analysis in Power BI](https://techcommunity.microsoft.com/t5/educator-developer-blog/how-to-use-azure-open-ai-to-enhance-your-data-analysis-in-power/ba-p/4041036)

この辺りの野望を膨らませて次回とします。


## その他

以下辺りもご参考

https://jpazinteg.github.io/blog/LogicApps/LogicApps-CosmosDB/

以上です～
(str) => と書く理由（JavaScript）

Youtubeで英語で出題された外国人が運営しているチャンネルでJavaScriptの問題を解いていますが、
解答例を見ても、なぜ、こう書くことが正解なのかが分かりません。
問題は以下の通りです。

Q.アルファベット順にアルファベットを入力し、
　最初の文字を削除したうえで、最後に書いたアルファベットの次のアルファベットが
　表示されるコードを書いてください。

const alphabet = (str) =>
	str.split('').map(char=>String.fromCharCode(char.charCodeAt(0) + 1)).join('');

console.log(alphabet('hijk'));
→　ijkl

分からないのは、「const alphabet = (str) =>」 の部分です。
変数のalphabetは分かりますが、
＝の後の、「(str)　=>」 が分かりません。　

なぜ
(str) =>
と書くのでしょうか？

JavaScriptの基本的な構文の書き方は勉強しましたが、
それでも分かりません（身についていないと言えばそうかと思います）。
それ以降については、なぜこう書くのかが分かるだけに、
最初の方で分からないので歯がゆいばかりです。

どなたが解説をお願いします。
VSCにSTM32C011は、まだなんにもない。(20240302)(STM32C011J4M7)


目的
STM32C011のサポート状況


![o_cop974.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/6939e989-6184-fc96-ad8a-e7d0b76e32ec.jpeg)
Apple製品の履歴

#今まで買ったApple製品
これまでに買って今も持っているものについてのリスト。
過去に買ってみたものの手放したものはリストに入れてないです。

### Mac系
MacBook Pro（2012　Intel）
MacBook Pro(2020 M1)
MacBook Pro(2022 M2Pro)
MacBook Air(2020 Intel)
Mac mini (2012 Intel）

### iPad系
iPad (2世代）
iPad(第7世代）
iPad Air(第4世代）
iPad mini(第6世代）

### iPhone系
iPhone7Plus
iPhoneXsMax
iPhoneXr
iPhone12ProMax
iPhone15ProMax

### iPod系
iPod touch(第2世代）
iPod touch(第4世代）
iPod touch(第5世代）

### apple watch系
series3
series5
series8

### その他
Apple TV　4K
HomePod
Magic Keyboard
Magic Trackpad
AirPods Pro
AirPods Pro2

今思い出すのはこれくらいです。
現在運用として使用しているのは限られていますが、今後とも増やしていきたいです。

#今後欲しいもの
新しく欲しいというよりも買い替えとして欲しいものになります。

Mac mini (M1)
→家のデスクトップの新調。このスペックだと使用用途としてはオーバースペックですが、快適に作業をしたいということからこれが欲しい。
でも今のも最新OSは入らなくてもサポートがあるので、しばらくは様子見。

AppleWatch
→これは今のseries7ではなく、もう少し先のモデルを想定。
現在の形から変わったりしたら欲しいかなっていう感じです。
ただし、今のものでも十分に使えているのと、シルバーのアルミが現行ではないのが残念

現時点ではこの辺が欲しいものになるかと思います。
それ以外は現在のスペックでも十分に発揮できるので。
特にM1チップ搭載のMacBook Proについては消費電力がかなり低いので、どこで使っていても満足できる状態ですね。
ちなみに普段持ち歩いているものとしては
iPhoneXsMax
iPhoneXr
iPhone12ProMax
MacBook Pro(2020 M1)
iPad Air(第4世代）
iPad mini(第6世代）
このセットになります。
これがあればどこでも楽に作業ができるセットになります。
iPadAirはディスプレイがわりに使いデュアルディスプレイを行なっています。
そしてサブ機としてminiを使うことで、情報の収集も楽になります。
cscの作法 その462

# 概要
cscの作法、調べてみた。
raytrace見つけたので、やってみた。


# 参考にしたページ
https://github.com/lukehoban/LINQ-raytracer


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/1dbaff0e-f437-4672-3b91-edbe9a5ab731.png)


以上
Yolov8をトレーニングする

# かんたん
新しいモデルは色々あるけど、とはいえYolov8は強力で、
簡単に使えて便利なので、すぐ使えるように手順をシンプルに。

### インストール

```bash
pip install ultralytics
```

### データセット準備

以下のディレクトリ構成で準備します。

```
datasets
   |__my_data
         |__images
         |    |__train
         |    |__val
         |
         |__labels
              |__train
              |__val
          
```

データyamlファイルを作ります。
path:は頭に自動的にdatasetsというディレクトリがつくので注意。

```yaml
path: my_data # dataset root dir
train: images/train2017 # train images (relative to 'path') 128 images
val: images/train2017 # val images (relative to 'path') 128 images
test: # test images (optional)

# Classes
names:
  0: person
  1: bicycle
  2: car
  3: motorcycle
  4: airplane
  5: bus
  6: train
  7: truck
  8: boat
  9: traffic light
  10: fire hydrant
  11: stop sign
  12: parking meter
  13: bench
  14: bird
  15: cat
  16: dog
  17: horse
  ...
```

### 学習

```python
from ultralytics import YOLO

# Load a model
model = YOLO('yolov8s.pt')  # load a pretrained model (recommended for training)

# Use the model
results = model.train(data='my_data.yaml', epochs=100)  # train the model
```

### 検証

```python
model = YOLO('runs/detect/train/weights/best.pt')
model.val(data='my_data.yaml')
```

### 推論

```python
model = YOLO('runs/detect/train/weights/best.pt')
model("datasets/my_data/images/val/",save=True)
```

🐣
****
フリーランスエンジニアです。
AIについて色々記事を書いていますのでよかったらプロフィールを見てみてください。

もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習／AR関連の情報を発信しています。

[X](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
Vimを覚える【vimtutor Lesson 7】

# はじめに

前回の記事はこちらです。

https://qiita.com/kohki_takatama/items/db39de072e8ad908cf7d

# Lesson 7.1

<font color="Orange">`helpキー` / `F1` / `:help` でヘルプの表示！</font>ですね。

`s`ってなんのコマンドだっけ・・・とか、
`replace`ってどうやるんだっけ・・・って時によさそうです。

# Lesson 7.2

Vimの機能を解放しよう！ですね。

1. `:e ~/_vimrc` (win) / `:e ~/.vimrc` (unix)
   `vimrc`（`rc`は`runtime configuration`の略）の編集画面を開く
   `:e`は`:edit`と同義
2. `:r $VIMRUNTIME/vimrc_example.vim`
   設定例を読み込む
   `:r`は`:read`と同義
 3. `:w`
    ファイルを保存
    `:w`は`:write`と同義

Vimtutorで触れられているのはここまでです。
vimrcの編集からvimtutorに戻りたいときは、

4. `:ls` / `:buffers`
   バッファ（一時的に保持している作業）のリストを表示します。
5. `:b バッファ番号` / `:buffer バッファ番号`
   該当のバッファに移動します。
# Lesson 7.3

<font color="Orange">`Ctrl + d`で補完リストの表示！</font><font color="Orange">`TAB`で補完！</font>です。

例として、`:e`と入力してから`Ctrl + D`を押すと、`:e`で始まるコマンドのリストが表示されます。`TAB`を押すと、リストから順に適用されます。
# Lesson 7 修了！

おつかれまでした！！

# おわりに

vimtutor 修了です！おつかれさまでした！！
cscの作法 その461

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
ボタンが一個だけのForm

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/39196940-ffff-b610-e4bd-fbb724bba15a.png)

# サンプルコード

```
using System;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;

namespace App
{
	public class Form1: Form {
		Button button1;
		private NotifyIcon notifyIcon1;
		private ContextMenu contextMenu1;
		private MenuItem menuItem1;
		private IContainer components;
		public Form1() {
			this.Text = "test";
			this.StartPosition = FormStartPosition.Manual;
			this.BackColor = Color.Red;
			this.Size = new Size(100, 100);
			this.Location = new Point(1000, 100);
			button1 = new Button();
			button1.Location = new Point(20, 20);
			button1.Text = "test";
			button1.BackColor = Color.Aqua;
			button1.Click += new EventHandler(button1_Click);
			this.Controls.Add(button1);
			this.Shown += new System.EventHandler(this.Form1_Shown);
			this.components = new Container();
			this.contextMenu1 = new ContextMenu();
			this.menuItem1 = new MenuItem();
			this.contextMenu1.MenuItems.AddRange(new MenuItem[] {
				this.menuItem1
			});
			this.menuItem1.Index = 0;
			this.menuItem1.Text = "E&xit";
			this.menuItem1.Click += new EventHandler(this.menuItem1_Click);
			this.notifyIcon1 = new NotifyIcon(this.components);
			notifyIcon1.Icon = new Icon("dolphin.ico");
			notifyIcon1.ContextMenu = this.contextMenu1;
			notifyIcon1.Text = "Form1 (NotifyIcon example)";
			notifyIcon1.Visible = true;
			notifyIcon1.DoubleClick += new EventHandler(this.notifyIcon1_DoubleClick);
		}
		private void button1_Click(object sender, EventArgs e) {
			MessageBox.Show("ok");
		}
		protected override void Dispose(bool disposing) {
			if (disposing)
				if (components != null)
					components.Dispose();
			base.Dispose(disposing);
		}
		private void notifyIcon1_DoubleClick(object Sender, EventArgs e) {
			if (this.WindowState == FormWindowState.Minimized)
				this.WindowState = FormWindowState.Normal;
			this.Activate();
		}
		private void menuItem1_Click(object Sender, EventArgs e) {
			this.Close();
		}
		private void Form1_Shown(object sender, EventArgs e) {
			FormBorderStyle = FormBorderStyle.None;
			this.TransparencyKey = this.BackColor;
		}
		[STAThread]
		static void Main() {
			Application.Run(new Form1());
		}
	}
}


```

以上
cscの作法 その460

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
タスクトレイアイコンで、猫を走らせろ。


# 方針
64X16のビットマップを用意して、タイマーで切り出す。

# 参考にしたページ

https://qiita.com/kob58im/items/89dac161d5ea6e655002

# 写真
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/52e02dd3-2b03-7b23-8d74-8d1ec81ef35f.png)


# サンプルコード

```
using System;
using System.ComponentModel;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

static class MyIconUtil {
	static class NativeMethods {
		[DllImport("user32.dll", CharSet = CharSet.Auto)]
		public extern static bool DestroyIcon(IntPtr handle);
	}
	public static Icon CreateIcon(byte[,] iconDot) {
		Bitmap bmp = new Bitmap(iconDot.GetLength(0), iconDot.GetLength(1));
		using (Graphics g = Graphics.FromImage(bmp))
		{
			g.Clear(Color.White);
		}
		for (int y = 0; y < iconDot.GetLength(1); y++)
		{
			for (int x = 0; x < iconDot.GetLength(0); x++)
			{
				if (iconDot[x, y] != 0)
				{
					bmp.SetPixel(x, y, Color.Black);
				}
			}
		}
		IntPtr Hicon = bmp.GetHicon();
		return Icon.FromHandle(Hicon);
	}
	public static void DestroyIcon(Icon icon) {
		NativeMethods.DestroyIcon(icon.Handle);
	}
}

class TaskTrayTest {
	static readonly int W = 16;
	static readonly int H = 16;
	NotifyIcon trayIcon;
	byte[,] iconDot;
	System.Windows.Forms.Timer timer;
	int n = 0;
	Bitmap cat;
	TaskTrayTest() {
		trayIcon = new NotifyIcon();
		iconDot = new byte[W, H];
		cat = new Bitmap("cat.bmp");
		Icon tmpIcon = MyIconUtil.CreateIcon(iconDot);
		trayIcon.Icon = tmpIcon;
		trayIcon.Visible = true;
		trayIcon.Text = "cat";
		var menu = new ContextMenuStrip();
		var menuItem = new ToolStripMenuItem();
		menu.Items.AddRange(new ToolStripMenuItem[] {
			new ToolStripMenuItem("E&xit", null, (s, e) => {
				timer.Stop();
				Application.Exit();
			}, "Exit")
		});
		trayIcon.Click += (s, e) => {
		};
		trayIcon.ContextMenuStrip = menu;
		timer = new System.Windows.Forms.Timer();
		timer.Interval = 200;
		timer.Tick += (sender, e) => {
			UpdateBoard();
		};
		timer.Start();
	}
	void UpdateBoard() {
		n++;
		if (n > 3) 
			n = 0;
		int i = n * 16;
		Rectangle rect = new Rectangle(i, 0, 16, 16);
		Bitmap bmpNew = cat.Clone(rect, cat.PixelFormat);
		IntPtr Hicon = bmpNew.GetHicon();
		Icon oldIcon = trayIcon.Icon;
		trayIcon.Icon = Icon.FromHandle(Hicon);
		MyIconUtil.DestroyIcon(oldIcon);
	}
	[STAThread]
	static void Main(string[] args) {
		new TaskTrayTest();
		Application.Run();
	}
}





```

以上
VSCodeにLeetCodeを入れようとしたら「invalid password」が出てくる問題

## 結論、クッキーからログインする

答えはすでに過去のissue[#478](https://github.com/LeetCode-OpenSource/vscode-leetcode/issues/478#issuecomment-1693332438)から出ていました。

やり方としては、

1. leetcodeにログインする
2. Chromeの検証ツール(右クリック⇒検証) -> ネットワーク -> Fetch/XHRを開く
3. leetcodeのページを、リロードし "Nameもしくは名前"タブの下にある "graphql "を見つけて選択し"Header もしくはヘッダー"タブの下の "Request Headers "部分で、その巨大なクッキー文字列全体を選択してコピーする
4. VSCodeでユーザー名もしくはEメールと先ほどコピーしたクッキーを使ってログインする

黄色い部分を取得！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3304752/a8e72e3d-a5a8-162b-9e56-092a0bd6848e.png)

LeetCodeにVSCodeからSigninする時、LeetCode Cookieを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3304752/676e31b6-510c-2b0b-1bfc-af2c9f9896ea.png)

私はこれでログインができました！
C++でif分岐, min(), max()を使わない畳み込み計算

二次元・反射パディングです。imgにkerを畳み込んでimfに格納します。

```cpp
#include<iostream>
#include<random>

int main() {
    int n=3,px=100,py=120;
	std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_real_distribution<float> dis(0.,255.);

    //配列作成
    float** img=new float*[py+2*n]+n;
	float** imf=new float*[py];
	float** ker=new float*[1+2*n]+n;
	for(int y=-n;y<=py+n;y++)
	{
		img[y]=new float[px+2*n]+n;
	}
	for(int y=0;y<py;y++)
	{
		imf[y]=new float[px];
	}
	for(int y=-n;y<=n;y++)
	{
		ker[y]=new float[1+2*n]+n;
	}
	//初期化
	for(int y=0;y<py;y++)
	{
		for(int x=0;x<px;x++)
		{
			img[y][x]=dis(gen);
		}
	}

	for(int x=0;x<px;x++)
	{
		for(int k=1;k<=n;k++)
		{
			img[py-1+k][x]=img[py-k][x];
			img[-k][x]=img[k-1][x];
		}
	}

	for(int y=-n;y<=py+n;y++)
	{
		for(int k=1;k<=n;k++)
		{
			img[y][-k]=img[y][k-1];
			img[y][px-1+k]=img[y][px-k];
		}
	}

	for(int y=0;y<py;y++)
	{
		for(int x=0;x<px;x++)
		{
			imf[y][x]=0.;
		}
	}

	for(int y=-n;y<=n;y++)
	{
		for(int x=-n;x<=n;x++)
		{
			ker[y][x]=1./((2*n+1)*(2*n+1));
		}
	}
	//畳み込み
	for(int y=0;y<py;y++)
	{
		for(int x=0;x<px;x++)
		{
			for(int ky=-n;ky<=n;ky++)
			{
				for(int kx=-n;kx<=n;kx++)
				{
					imf[y][x]+=img[y+ky][x+kx]*ker[ky][kx];
				}
			}
		}
	}
	//動作確認
	int Y=12,X=20;
	float S=0;
	for(int y=Y-n;y<=Y+n;y++)
	{
		for(int x=X-n;x<=X+n;x++)
		{
			S+=img[y][x]/((2*n+1)*(2*n+1));
		}
	}
	std::cout<<S<<std::endl;
	std::cout<<imf[Y][X]<<std::endl;
	//配列破棄
	for(int y=-n;y<py+n;y++)
	{
		delete[] (img[y]-n);
	}
	for(int y=0;y<py;y++)
	{
		delete[] imf[y];
	}
	for(int y=-n;y<=n;y++)
	{
		delete[] (ker[y]-n);
	}
    delete[] (img-n);
	delete[] (ker-n);

    return(0);
}
Amazon Web Services 基礎からのネットワーク&サーバー構築 個人的に詰まったところ

# 経緯
- 「Amazon Web Services 基礎からのネットワーク&サーバー構築 第4版」でインフラとAWSの基礎を勉強しています
- ハンズオンを進める中で詰まった箇所を備忘録的に残しておこうと思い記事を書いています

# 詰まった箇所一覧&解決方法

## 第6章「プライベートサブネットを構築する」
### 4節「踏み台サーバーを経由してSSHで接続する」
- 「秘密鍵をアップロードする」でローカルPCからWEBサーバー用インスタンスに秘密鍵をコピーする際に失敗
- 実行コマンド
```
scp -i local-key.pem local-key.pem ec2-user@instance_url:~/
```

- エラーメッセージ
```
ec2-user@instance_url: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
lost connection
```
- 解決方法：-rpオプションをつけることで解消（なぜ解消されたかは引き続き調べます・・・）
```
scp -rp -i local-key.pem local-key.pem ec2-user@instance_url:~/
```

## 使用している本
Amazon Web Services 基礎からのネットワーク&サーバー構築
https://www.amazon.co.jp/Amazon-Web-Services%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%EF%BC%86%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89%E6%94%B9%E8%A8%82%EF%BC%94%E7%89%88-%E5%A4%A7%E6%BE%A4-%E6%96%87%E5%AD%9D/dp/4296202049/ref=tmm_pap_swatch_0?_encoding=UTF8&dib_tag=se&dib=eyJ2IjoiMSJ9.FC3Rfr-5VTioQyIjjeff8uj4AaJqDwQuMc_nIbxP-zZIxsxJ4VrAVnm_wvvWwRMJmNMGgwKQYfva-Y5093pnC6jXbluKg6QbLGDLuqW3eoILhL4eoFmwya9eoa_AEzpV5vfUn4UCNRUa0xerXr5SCP0WVzZxiDt6UK9z44o57fn7bZbKWZOAe4ktFRAoF6zI0_z9U3_oz8MR4sMfaV4MHJ-K6tMuZxD89U4Iq3CVkiVLuqLGJbYoAaR0hse16H_x3oYVla8fCGR2TUqfJKcqe3UK4VCJsiHymKu4CbSJziQ.pQrWceXhPBsWWfQqzZY7w7DYqsvXXR4R8KWyyh1EF74&qid=1709311176&sr=8-1
相加・相乗平均のグラフ化

# はじめに
相加・相乗平均は、不等式の証明などに多用される。証明方法としては、左辺-右辺が0以上になることを示すのだが、それには、実数の2乗は0以上であるという条件を使用する。そこで今回は、3パターンの証明方法で相加・相乗平均を証明した後に、Pythonを用いてグラフ化することで、視覚的に不等式が成立することを体感することを目的とする。　

# 導入
以下に相加・相乗平均の定義を述べる。

まず、$a>0,b>0$としたとき以下の式が成立する。

```math
\frac{a+b}{2}\ge \sqrt{ab}
```

ただし$a=b$のとき等号が成立する。

この式では、分数がややこしいので、以下の形に変形したものが多用される。

```math
a+b\ge 2 \sqrt{ab}
```

# 証明
今回は、以下の3パターンで考えた。ただし、いずれの証明も実数の2乗は0以上であるという原則を用いる。

## 2変数関数
左辺から右辺を引くことにより証明することができる。ただし、a,bは正なので、$\sqrt{a},\sqrt{b}$は実数の領域に存在する。
```math
(a+b)-2\sqrt{ab}=\sqrt{a}^2+\sqrt{b}^2-2\sqrt{ab}= (\sqrt{a}-\sqrt{b})^2\ge 0
```


## 1つの変数
左辺から右辺を引いたものをaで除する。これによって、$\sqrt{\frac{b}{a}}$という一つの変数によって$f(a,b)$の正負が決定される。($a>0$より)
したがって、以下のようになる。

```math
f(a,b)=(a+b)-2\sqrt{ab}=a(1+\frac{b}{a}-2\sqrt{\frac{b}{a}})=a(1-\sqrt{\frac{b}{a}})^2\ge 0
```
ただし、等号成立は$a=b$のとき

## 微分法
$b$を定数とし$a$を変数として$f(a,b)$を$a$で微分する。

```math
\frac{df}{da}=1-\sqrt{\frac{b}{a}}

```
ここで、以下の場合について考える。

$0<a<b$のとき
```math
\frac{df}{da}<0
```
$a\ge b$のとき
```math

\frac{df}{da}\ge 0
```

したがって、$a=b$のときこの関数は最小値を取ることが分かる。したがって、
```math
f(a,b)\ge f(a=b,b)=0
```

# グラフ化
さて、今度は$f(a,b)=(a+b)-\sqrt{ab}$を$a,b,f$空間に描写してみよう。

```　python souka_soujou.py
import matplotlib.pyplot as plt
import math 
import numpy as np
import japanize_matplotlib

n=100
a=np.linspace(0,10,n)
b=np.linspace(0,10,n)

a,b= np.meshgrid(a,b)

plt.contourf(a,b,(a+b)/2-(a*b)**0.5)
plt.colorbar()
plt.show()
```

これを実行すると以下のようなグラフが出力される。
![souka_soujou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/ae6bfb05-bb3a-2db5-f1a9-e5e52aaf409e.png)

$f(a,b)$ は$a,b$に関して対称なので、$a=b$に関して対称である。また、そのとき最小値0を取ることも分かる。

一方で、3次元のグラフを描くプログラムは以下の通りである。
``` python souka_soujou_3d.py
import matplotlib.pyplot as plt
import math 
import numpy as np
import japanize_matplotlib
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(6, 6))
ax = fig.add_subplot(111, projection='3d')

n=100
a=np.linspace(0,10,n)
b=np.linspace(0,10,n)

a,b= np.meshgrid(a,b)

c=(a+b)/2-(a*b)**0.5

surface = ax.plot_surface(a,b,c, rstride=1, cstride=10, cmap='jet', alpha=0.4)
# カラーバーを設定
fig.colorbar(surface, ax=ax, shrink=0.5)
plt.show()
```
これを実行すると以下のようなグラフが作成される。
![souka_soujou_3d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/481a7e3e-e9ed-9aeb-ada5-e77d420e71ab.png)

これは、ある意味で放物線に似ている。ということを考えると、相加・相乗平均はある意味で、$y=x^2$の最小値が(0,0)であるということを3次元に拡張したモデルであると考えることができるかもしれない。



# まとめ
今回は、相加・相乗平均を理解するために公式の証明をした後、グラフ化することを試みた。結果、左辺引く右辺を描写した場合、$a=b$で対称のグラフが描けた。また、最小値は0以上であることも分かった。ただし、相加・相乗平均は、$a>0,b>0$という前提の上でしか議論できないことに注意したい。
KC3Hack2024 体験談

## 導入
　初めまして、朝倉氏です。最近はラーメン食べ歩きと散歩にハマっています。なんか若者と老人の趣味みたいですね。今回Qiita初投稿となりますので、拙い文章の記事となっています。ですが、最後まで楽しみながら読んでもらえれば幸いです。

## 概要
　今回僕が参加したのはKC3（関西情報系学生団体交流会）が主催するハッカソンに参加しました。このハッカソンで参加3回目となるのですが、やはり周りの学生さんの実力に毎度圧倒されます。今回、チームで参加とのことでしたので（個人参加もOKでした）、僕含め同級生4人で参加することとなりました。期限は2週間、長めじゃないかと感じますが、やってみると意外と時間がないことに気づきました。

　また、今回のハッカソンのテーマなんですが、「関西をええ感じに」とのことです。~~あいかわらず訳のわからない漠然としたテーマですね。~~

## 技術選定
　テーマが「関西」とのことなので、食い倒れにちなんでランダムに飲食店を検索してくれるLINEBotを作成しました。技術選定としてLINEBotを作成するためのLINEDevelopersAPIおよびGAS（あとホットペッパーAPI）を使いました。どうしてGASなのかと思うかもしれません。でも実はなかなか強みがあるんですよ、

・GoogleSpreadSheetの拡張機能のため、環境を揃える必要がない（web上でできる）
・なおかつサーバーレスで開発できる
・なおかつスプレッドシートがデータベースとなる（Firebaseを設計しなくて良い）
・プロパティ設定でキー管理が楽

など色々な理由でGASを選びました。発表後、技術選定が素晴らしいと審査員に褒められたのは嬉しかったです。

https://github.com/kc3hack/2024_N

## 予想外
　期間は2週間とのことで最初の1週間は良い感じに進んでました。しかし、徐々に進行が悪くなっていき、まさかのデスマーチを迎えてしまいました。今回僕がリーダー的立ち位置でチームを動かしていたのですが、うまく指示できていなかったのが原因だと考えます。設計やらフローチャートをしっかりやっていたつもりが、なかなかチームに伝わっていなかったのがまずかったですね。

## 最後に
　結果として賞は貰えなかったですが、チーム開発においての経験およびリードする大変さを学びました。今現在進行形で他のチーム開発を行っているので、今回の経験が糧になればと考えています。
Cloud 9 でVSCodeを使う

:::note warn
やってみたらできました。
実用的ではないと思います。
:::

Cloud 9を起動します。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/67d82e67-e4d2-854d-8083-eb9087ccac80.png)

VSCodeのCLI版をダウンロードします。

```shell
curl -L "https://code.visualstudio.com/sha/download?build=stable&os=cli-alpine-x64" -o vscode_cli_alpine_x64_cli.tar.gz
```

展開します。

```shell
tar zxvf vscode_cli_alpine_x64_cli.tar.gz
```

場所を移動します。

```shell
mkdir -p ~/.local/bin
mv code ~/.local/bin/
```

VSCodeをサーバーとして起動します。ポート番号はCloud 9の仕様に合わせて`8080`に変更します。

```shell
code serve-web --port 8080 --without-connection-token --accept-server-license-terms
```

上部の`Preview` -> `Preview Running Application` をクリック

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/8d1548ea-819e-ebe3-433c-58a280d28520.png)

出ました！

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/a2c8cef1-01c5-c30f-0a5c-072aebeb046d.png)


注意：Cloud 9の便利機能であるプレビュー機能を使ってしまっているので、Webアプリ開発には使えません。。

https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/app-preview.html


## 参考

https://qiita.com/ku_suke/items/07b67bd710b17a3a7cf3
オブジェクト指向とは

## :ledger:オブジェクト指向
効率よく開発するための考え方の1つであり
プログラミングを「`モノの集まり`」として捉えてモノ同士の関係性を定義しながら
システムを作り上げようとする発想です。

## :ledger:オブジェクト指向の三大要素
オブジェクト指向には特徴があります。

・継承
・カプセル化
・ポリモーフィズム

それぞれをもう少し掘り下げて説明します。

### 継承
既存のクラスを元に変数メソッドを追加したクラスを作ることです。

継承関係にある親クラスを`スーパークラス`
子のクラスを`サブクラス`といいます。

新たに定義するクラスである`サブクラス`では
あらかじめ定義されているクラスである`スーパークラス`が持つ
フィールドやメソッドを引き継ぐことができます。

:::note info
継承できるのは１つのクラスだけです。
またコンストラクタは継承できません。
:::
***
### カプセル化
他のプログラムから勝手にデータを変更されるのを防ぐ仕組みのことです。

修飾子でアクセス範囲を制限することで勝手に値に触れることを防止することができ
安全性を高めることができます。


| 修飾子 | 意味 |
|:-:|:-:|
| public  |  すべてのクラスからアクセス可能 |
|  protected |  同じパッケージ内のクラスとサブクラス（後述）からアクセス可能 |
|  指定なし |同じパッケージ内のクラスからアクセス可能   |
|private|同じクラス内からのみアクセス可能（外からアクセスできない）|
***
### ポリモーフィズム
オーバーライドやオーバーロードにより，`一つのメソッドに応じた振る舞い`をすることです。

これによってプログラムの書き方を統一することができます。

***

## :ledger:オブジェクト指向のメリット

### 効率よくプログラムを設計・開発できる
オブジェクト指向で開発されたクラスは、再利用しやすく、新しく同じような仕組みのプログラムを作る場合、効率よく開発が可能です。
また、機能ごとに分かれているため、複数人で作業を分担して開発を進めることができます。


### エラーを特定しやすい
オブジェクト指向は、「モノ」と「操作」に分かれています。
そのためどこでエラーが起こったのか、どんな操作をした時にエラーが起こったのかすぐに特定できます。


## 最後に…

オブジェクト指向は理解するのに時間がかかります。
抽象的な言い回しが多く最初は苦戦することも多いと思いますが
現場で活躍できるよう理解を深めていきたいです！
【TypeScript】配列型の型ガード関数

以下のように型ガード関数を作成すると文字列の配列に絞り込めます。

```ts
function isStringArray(value: unknown): value is string[] {
  if (!Array.isArray(value)) {
    return false
  }
  return value.every((e) => typeof e === 'string')
}
```

## 参考

https://typescriptbook.jp/reference/statements/unknown#unknown%E5%9E%8B%E3%82%92%E9%85%8D%E5%88%97%E5%9E%8B%E3%81%AB%E7%B5%9E%E3%82%8A%E8%BE%BC%E3%82%80

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray
情報Ⅰ ソートアルゴリズム

情報のテストがあるのでソートのところの解説を作りました
間違いがあればコメントとかで指摘してください

ところで、ここで書いてるプログラムは教科書とかと同じのにしたんですけど
配列を後ろから見てるの分かりにくくないですかね
あとなんで降順なんだろう
あと`for i in range()`も個人的には分かりにくい

## ソートとは何か
ここでいうソートとは、「与えられた配列を一定の規則に従って並び替えること」です
今回は、
「任意個の整数がの配列」を「先頭ほど大きく、末尾ほど小さく」なるように並び替えます

## 交換法(バブルソート)

(これは昇順のアニメーションです)
<a title="Cocrider69, Public domain, ウィキメディア・コモンズ経由で" href="https://commons.wikimedia.org/wiki/File:Bubblesort_Animation.gif">
<img width="256" alt="Bubblesort Animation" src="https://upload.wikimedia.org/wikipedia/commons/d/d3/Bubblesort_Animation.gif">
</a>

バブルソートは棒がどんどん横にスライドしていくので
横にすると気泡が上っていくように見えます

### アイデア
```mermaid
flowchart TD
ia["配列の並び替え"]
pa["並び替えが完了するまで繰り返す"]
pb(("隣り合う二項の並びを直す"))
pba{"a[j],a[j+1] を比較"}
pbaa["a[j],a[j+1] を入れ替える"]
pbab["何もしない"]
pca["n-1周すればいい"]
pcb["一周はj=n-2からj=i-1まで"]
pd["一周したら先頭(a[i])が確定する"]

ia --> pb
pb .- pa
pb --> pba
pba --逆になってる--> pbaa
pba --合ってる--> pbab
pa --- pca
pa --- pcb
pca .- pd
pcb .- pd
```

### プログラム
コードの挙動とは逆になっているところがあるけど本質は同じなので、分かりやすいアニメーションあるので載せておきます
(これは昇順のアニメーションです)
(プログラムでは左に行くほど大きくなって、赤枠も右から左に動きます)
<a title="Swfung8, CC BY-SA 3.0 &lt;https://creativecommons.org/licenses/by-sa/3.0&gt;, ウィキメディア・コモンズ経由で" href="https://commons.wikimedia.org/wiki/File:Bubble-sort.gif">
<img width="256" alt="Bubble-sort" src="https://upload.wikimedia.org/wikipedia/commons/0/06/Bubble-sort.gif">
</a>

赤枠は、プログラムのjとj+1で、現在着目している場所を示しています
赤枠内が逆になっていたら入れ替えをし、赤枠をずらしながら配列全体を確認しています

黒枠は、値が確定した場所です
黒枠がどこで誕生するか(どこで値が確定するか)確認すると、赤枠が端から端まで動いて終わったあと、右端が黒枠にしていることが分かります
これは、赤枠が移動していく途中で出会った、より大きい値を右へ動かしているからです
この黒枠は、プログラムでは配列の0からi-1までに該当します
確定した場所はもう確認する必要がないので、i-1の手前で処理を打ち切っています




#### 説明付きのコード
```python
a = [5,9,2,48,63,5,78,6,50] # 並び替える配列
n = len(a) # 配列の長さ

for i in range(0,n-1,1): # 並び替え完了まで周回する (n-1回)
    for j in range(n-2,i-1,-1): # 配列を一周する (n-2からi-1まで)
        if a[j] < a[j+1]: # 入れ替えるかを判断 (a[j]とa[j+1]の大小関係)
            # 順番が違うとき
            # a[j]とa[j+1]を入れ替える
            temp = a[j]
            a[j] = a[j+1]
            a[j+1] = temp
```
#### 日本語だけ
```text
並び替える配列がa
配列の長さがn

並び替え完了まで以下を周回
    配列を一周する
        j番目とj+1番目を比較して、入れ替えるかを判断
            j番目とj+1番目を入れ替える
          又は
            何もしない
```
JTFほんやく検定受けたらIPAの情報処理資格がめっちゃ役立った

# はじめに
JTFほんやく検定っていう翻訳の検定を受けたんだけど、セキマネとか応用情報とかの資格の知識がめっちゃ役立ったので、短いけど受験体験記書くンゴ。

# 試験の概要
5級、4級、1～3級がある。1～3級には①日英翻訳と②英日翻訳があって、日付は一緒だけど時間が違うので併願が可能。日英と英日について、それぞれ5つの分野から1つを選択し、クオリティに応じて1級、2級、3級、不合格が判定される。ネットで受けられて、ネット検索とかも自由にしていい感じ。

分野は以下がある。
・政経・社会
・科学技術
・金融・証券
・医学・薬学
・情報処理

# ワイの受験
ワイは今回、1～3級の日英翻訳と英日翻訳の両方を「情報処理」を選択して受けた。

分野の選択は、試験中に各分野の問題を見てから決められるんだけども、「科学技術」と「医学・薬学」は全く分からないので論外。「金融・証券」は、財務会計関連以外はそんな詳しくないし、めっちゃムズそうだったからナシだった。残るは「政経・社会」と「情報処理」だけど、「政経・社会」はけっこう簡単そうというか直観的に楽しいトピックだし一番とっつきやすいのではという感じだった。けどレッドオーシャン狙ってもというか、IT界隈のはしくれとしてみたいなアレで思い切って「情報処理」に挑戦してみた。

# 感じたこと
英日ではその内容からセキマネとか応用情報が役立った（日英ではその内容から開発関連の経験が役立った）。具体的には用語の概念とかをしっかり理解してたので、知識でだいたい文意を推測できるので、時間短縮的なメリットがすごかった。どこまで書いていいか分からないからぼやかすけど、こんなに？ってくらいドンピシャというかモロなトピックだったので、資格のメリット感じすぎて受けるか分からんけど情報処理安全確保支援士の参考書買ってしもた。そういえば応用情報受けてから2年以内は午前Ⅰが免除されるらしいし、そんなら受けてみてもいいかも。

# 今後に向けて
この資格、合否基準がけっこう厳しいらしいことを受験後に知った。それを知らず気を抜いて受けてしまったので、目標の級をとれない可能性があるので、再受験する可能性は大いにある。そこで再度情報処理を選択して受ける場合を想定して、フレームワークやライブラリのドキュメントなどは原文で読みたい。ワイはNode.jsのORMであるSequelizeのドキュメントを原文で読み込んでいたんだけども、これも結構役立った気がするのでというのもある。これは特に日英翻訳で役立った。専門用語は翻訳元言語と翻訳先言語で対応してる（会計でもそうンゴよね。減価償却費はDepreciation Amountとしか訳しようがない）ので、知ってるだけで時間省ける。


というか英日翻訳に比べて日英翻訳のほうが普通に難しい。英日翻訳とかはイマージョンとか普段してれば、文章読んで得られる非言語状態の概念を母語で表現すればいいだけなんだけど、日英翻訳は英語独特の表現に精通してかつ染みついてないと難しいし、できたとしても時間がかかる。ちなみに試験はどちらも2時間で、問題文の総量はぱっと見そんな多くないんだけど、普通に時間ぎりぎりだったしけっこう疲れた。
【Rails初心者】いつものform脱却！Action Textとdatetime_fieldの紹介

こんばんは！
今回の紹介は以下の通りです。
1. Action Text
2. 時間のform(datetime_field)

# 環境
AWS Cloud9
Rails 6系

## Action Text
![スクリーンショット 2024-03-01 231109.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677302/c75a7f19-b638-8334-433d-b63891352dcd.png)
普段のformと違い、太字や斜体、箇条書きなどを感覚的に入力できるものです。こちらは導入しないとこのように表示できないため、下にあるURLを参考に導入してください。導入自体は簡単です！

::: note warn
実装時の注意点
Actiontext用のカラムはテーブル作成時に作成しないでください！
モデルに直接書き込みます。
:::

https://autovice.jp/articles/36

## 時間のヘルパーメソッド
カラムのデータ型datetimeにしている場合有効ですが、時間を編集や登録する際、`datetime_field`を使うとこのような表示をさせることができ、選択した日付を格納できます。
![スクリーンショット 2024-03-01 230902.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677302/923d3d58-5131-92bd-a7aa-6f6842cc0b69.png)

```erb
<div class="form-group row">
  <%= f.label :deadline, '期限を設定', class: 'col-sm-3 col-form-label' %>
  <div class="col-sm-9">
  <%= f.datetime_field :deadline, class: 'form-control' %>
</div>
```

:::note warn
実装時の注意点
タイムゾーンの変更がされていない場合は、config/application.rbのタイムゾーンの記述をTokyoに変更してください！
:::

このほかにも時間を入力できるヘルパーメソッドはいくつかあるので、こちらを参考にしてみてください！

https://qiita.com/pyon_kiti_jp/items/747496d02bdb1eff1ce8
[Go] Echo+NginxのDockerCompose環境

# はじめに

Go言語フレームワーク[Echo](https://echo.labstack.com/)のローカル開発環境の簡易テンプレートを作成しました。（目的は、今後触る必要が出たときに速やかに開始するためです。）

https://echo.labstack.com/

[Gin](https://gin-gonic.com/ja/)か[Echo](https://echo.labstack.com/)かで悩みましたが、ドキュメントが整理されている雰囲気があったためEchoを選択しました。
[Go言語の本家ではGinが紹介されていますが、それはさておき...。](https://go.dev/doc/tutorial/web-service-gin)


違う言語ですが、PHPの[LaravelのAPIリファレンス](https://laravel.com/api/10.x/index.html)は、リファレンスから該当するフレームワーク内ソースコードまで追いやすいため、かなり親切かと思います。自分の実装の問題か、フレームワークの問題かの切り分けを行う際は、フレームワーク内の処理まで追いやすいと助かります。

# 前提環境

https://qiita.com/perilla/items/ef73cf57ade24bc94f19

https://qiita.com/perilla/items/a2c969640fee4c223076

# Docker Compose 構成

Docker Composeの構成を記述します。

## サービス一覧

- app
- web
- db_mysql
- db_mysql_admin

### app

Echoのアプリケーションサーバー。
8000番ポートを使用し、nginxからの中継に応答します。（server.goファイルを参照）

### web

[nginx](https://hub.docker.com/_/nginx)サーバー。
HTTPリクエストをappコンテナへとフォワード（中継）します。

### db_mysql

[MySQL](https://hub.docker.com/_/mysql)サーバー。

### db_mysql_admin

[phpMyAdmin](https://hub.docker.com/_/phpmyadmin)サーバー。

# Github

https://github.com/perilla0/echo_template
【PHPフレームワークFlow】パッケージを分けてモジュラーモノリスみたいにしてみる

# 初めに
PHPフレームワークFlowは大規模エンタープライズ向けのWebフレームワークと公式ドキュメントに記載されています。大規模向けと聞くと、モノリシックなソースをイメージしますが、Flowはパッケージを分けることでモジュラーモノリスのような運用も可能なのかなと想像してます。
運用したことがないので想像ベースですが、今回はFlowでパッケージを分ける方法と、そのメリットについてまとめようと思います。

# モジュラーモノリスとは
モジュラーモノリスとはソフトウェアのアーキテクチャの1つです。モノリシックとマイクロサービスの中間に位置し、マイクロサービスのようにランタイムが分かれているわけではないけど、責務や機能ごとにリポジトリ内でモジュールを分割して管理しやすくするというアーキテクチャになります。

以下の記事が分かりやすかったです。

https://r-kaga.com/blog/what-is-modular-monolith


# Flowにおけるパッケージ
Flowでは、パッケージの種類が以下の3つに分けられます。

| 種類 | 説明 |
|:-:|:-:|
| Application| Controllerなど、ユーザが書くソースコードが格納されている |
| Framework  | Flowのフレームワークのソースが格納されている |
| Libraries  | Flow以外のライブラリが格納されている |

以下のようなイメージです。
モジュラーモノリスのために追加するのは、Application配下のパッケージになります。

```sh
Project/
  └ Packages/
      ├ Application/
      |    ├ User.Package1/
      |    └ User.Package2/
      |
      ├ Framework/
      |    └ Neos.Flow/
      |
      └ Libraries/
           ├ doctrine/
           ├ phpstan/
           ├ .....
           └ and more

```

# パッケージを分けてみる
パッケージを分割してみましょう。
といっても、コマンドを打って新規でパッケージを作るだけです。

初期状態はこんな感じです。
```
Project/
  └ Packages/
      ├ Application/
      |    └ Neos.Welcome/
      |
      ├ Framework/
      └ Libraries/
```


## 新規パッケージを作成
パッケージを作成するには、以下のコマンドを実行します。

```sh
$ ./flow package:create Added.Package
Created new package "Added.Package" at "C:/Path/to/project/Packages/Application/Added.Package/".
```

これだけでパッケージを追加することができます。
```
Project/
  └ Packages/
      ├ Application/
      |    ├ Neos.Welcome/
      |    └ Added.Package/（★追加された）
      |
      ├ Framework/
      └ Libraries/
```

追加されたパッケージには`Classes`や`Configration`などのディレクトリと、`composer.json`が作成されています。
`configure`と`composer.json`が作られてるということは、パッケージごとに異なる設定をすることができそうですね！

```
Added.Package/
  ├ Classes/
  ├ Configuration/（★）
  ├ Resources/
  ├ Tests/
  |   ├ Functional/
  |   └ Unit/
  |
  └ composer.json（★）
```



# パッケージを分けるメリット
Flowでパッケージを分けるメリットを紹介します。


## 1. 設定ファイルを分けることができる
パッケージ配下に`Configration`ディレクトリがあるため、設定ファイルを分けることが可能です。
```Routes.yaml```や```Caches.yaml```などをパッケージごとに定義することで、一つのファイルが肥大化することを防ぐことができます。


:::note warn
試したところ、`Settings.yaml`の一部の内容は、パッケージごとに定義することができなそうでした。例えば、**DB接続情報などを複数持つことができません**。
:::


## 2. Package.phpを分けることができる

### Package.phpとは
Package.phpは、APIが呼び出されてからControllerにたどり着く前に呼び出されるクラスです。
デフォルトだとFlow標準の[Package.php](https://github.com/neos/flow/blob/8.3/Classes/Package.php)が呼び出されるのですが、こちらの[Package](https://github.com/neos/flow/blob/8.3/Classes/Package/Package.php)クラスを継承すればパッケージごとに作成することが可能になります。

### Package.phpを分ける利点
Package.phpは、Controllerよりも前に呼び出されるということもあり、パッケージの全体的にかかわる処理を記載することが可能です。パッケージごとにルールを変えることができるのは嬉しいですね。

* どのRequestHandlerを使うか
* SignalとSlotを用いたイベントの定義
* コンテキストごとに実施する処理

などなど

## 3. composer.jsonを別で用意できる
composer.jsonを分けることができるため、パッケージごとに異なるバージョンのライブラリを用いることが可能になります。既存のパッケージと新規作成するパッケージで、バージョンを分けることができるのは、使い勝手がよさそうですね。



# 終わりに
今回はFlowでパッケージを分けることでモジュラーモノリスのようなアーキテクチャを実装できるのではないかというテーマで書きました。想像ベースでしたが、Flowが大規模エンタープライズ向けと謳っている理由が少しわかった気がします。

全然関係ないですが、ずっと「モジューラモノリス」だと勘違いしてました。

以上です。
Dydoooo : 「Yahoooo!!!!」（グループ１）

## アプリの一言紹介 
#### ▼課題
海外旅行への夢と興奮と共に、不安もついてくることが多いですよね。言葉の壁、文化の違い、価格の不透明性…これら全てを解消したい。

#### ▼解決案
旅行で起こりうる不安全てを一つひとつ洗い出し、それぞれの対策を明確に示したアプリを作成しました。これであなたの海外旅行がより安全で楽しくなります。

#### ▼こんなアプリを作りました！
海外の文化、服装のコーディネート、タクシーの適正価格など、旅行に必要な情報が詰まったアプリです。これ一つあれば、あなたの海外旅行はもっとスムーズに！

#### ▼アプリの一押しポイント！
現地の気温に合わせた最適なコーディネートを見られる点が当アプリの一押し！さらに、為替相場の情報も提供します。これで、現地の人々と同じく自由に楽しむことができます。

## アプリの背景
今回のハッカソンで優勝し、海外研修に行けることを前提として海外に行った時、困ることはなんだろうと考えこのアプリを開発しました！

## アプリの紹介
https://appdistribution.firebase.dev/i/6ac93e46a3ad2ee8
![QR_331039.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527547/250ec6b6-718b-3a2d-0255-ba50d681581f.png)

## アプリの技術紹介
![ハッカソン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527547/e11af933-619c-fc1c-ecf0-505b64ad3c87.png)

## こだわり
![ハッカソンicon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527547/9aebb600-6a77-40e4-7ff0-2d94a6f817d2.png)

アイコンを自作したこと

![MicrosoftTeams-image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527547/6a78415c-62be-6f3e-9d4a-4778c40de855.png)

![MicrosoftTeams-image (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527547/027a559b-f494-2088-f4fc-4dd4be1b9400.png)

![MicrosoftTeams-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527547/faa5e03d-e4c9-b5e4-b3b0-2dac8f1ca91b.png)

![MicrosoftTeams-image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527547/43ad70ce-285b-1216-422a-98e9c2e401c1.png)

![MicrosoftTeams-image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527547/bd2a540e-5643-f4b7-1084-304dbb01609d.png)

![MicrosoftTeams-image (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527547/c35dd90d-c512-d688-7c97-55141aecf06f.png)

## 今後の意気込みについて
・GitHubにこまめに上げるという作業をやっていなかったので、これからの開発の時は気をつけたい

・開発が初めてだったので、調べながらで時間がかかったが、少し技術を身につけることはできた。
エラーが出た時の解決方法を早く見つけられるようになりたい

・ハッカソンの勉強期間でしっかりやっていれば...など後悔が少し残ったので常に早くやることを意識づけて行動してきたい

・アプリ開発が初めてだったので、わからないことが多く、躓くことが多かったがチームで助け合ったりエラーを直す取り掛かる気持ちなど今後はめげずに頑張りたい。