OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel9でLaravel Excelインストール時に、maatwebsite/excelバージョン依存でエラー

Laravel9で、Laravel Excelをインストールしようとしたら、エラーが起こったので、残す。

# 環境
- Rocky Linux release 9.3
- PHP 8.0.30
- Laravel 9.52.16

# 手順
## Laravel Excel インストール
```
$ composer require psr/simple-cache:^2.0 maatwebsite/excel
```
```
$ composer require maatwebsite/excel
```
## `config/app.php`のproviders, ailiasesに追記
```config/app.php
    'providers' => [
        /*
         * Package Service Providers...
         */
        Maatwebsite\Excel\ExcelServiceProvider::class,  // 追記
    ],
    'aliases' => Facade::defaultAliases()->merge([
        'Excel' => Maatwebsite\Excel\Facades\Excel::class,  // 追記
    ])->toArray(),
```
## `config/excel.php`を作成
ここで、エラーが発生した

```
$ php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider" --tag=config

   BadMethodCallException

  Method Illuminate\Foundation\Application::share does not exist.

  at vendor/laravel/framework/src/Illuminate/Macroable/Traits/Macroable.php:113
    109▕      */
    110▕     public function __call($method, $parameters)
    111▕     {
    112▕         if (! static::hasMacro($method)) {
  ➜ 113▕             throw new BadMethodCallException(sprintf(
    114▕                 'Method %s::%s does not exist.', static::class, $method
    115▕             ));
    116▕         }
    117▕

  i   Bad Method Call: Did you mean Illuminate\Foundation\Application::isShared() ?

      +9 vendor frames
  10  artisan:37
      Illuminate\Foundation\Console\Kernel::handle()
```

# 原因
- `maatwebsite/excel`のバージョンに問題があった様子
- `"maatwebsite/excel": "^3.1.48"で、解決した

```composer.json
    "require": {
        "maatwebsite/excel": "^3.1.48",  // バージョン指定
    },
```

# 確認
```
$ php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider" --tag=config

   INFO  Publishing [config] assets.

  Copying file [vendor/maatwebsite/excel/config/excel.php] to [config/excel.php] ................................ DONE
```
ESP32-C3用DIP化キットを作ったよ

秋月電子通商で販売されているWi-Fiモジュール ESP32-C3-WROOM-02-N4用のDIP化キットを作ってみました。
# ESP32-C3-WROOM-02-N4用DIP化キットを作る理由
__ESP-WROOM-02__ の後継品とも言える __ESP32-C3モジュール__ が発売されました。

https://akizukidenshi.com/catalog/g/g117493/

__ESP32-C3__ は __コア__ が __RISC-V__ になるとともに __USB__ の __ペリフェラル__ が搭載されました。
これによりUSBシリアルのICを使用せずに書込みも可能となりました。
さらに、__ESP32-C3-WROOM-02-N4__ は __310円__ と格安です。　
__ESP-WROOM-02__ は __DIP化キット__ が販売されていましたが、レイアウトが近い __ESP32-C3-WROOM-02-N4__ には存在しない為、__DIP化キット__ を作ってみました。
# 資料
回路は __ESP32­C3­WROOM­02 Datasheet__ を参照しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/b2cc4784-1d64-dd5e-dc84-84c153826fc1.png)
IO2,IO8,ENにプルアップ抵抗10kΩが必要です。
__電源__ と、 __MicroUSB__ を追加しました。
__C5,C6__ はリファレンスに合わせて追加しています。
__R1,R2,R3抵抗__ は突入電流対策およびポカミス用に用意しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/76c5378d-b71b-cb63-9c8c-8f438a314b4c.png)
# 基板
ESP-WROOM-02DIP化キットと同じような形にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/d6be9b1b-0e4f-1358-360c-8035e953079c.png)
# 完成状態
__C5,C6__ は __NC__ となります。
__R1,R2__ 適当なサイズの抵抗を __R3__ は __０Ω抵抗__ にします。
![ESP32-C3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/2c391de8-8f69-9675-621b-6879e5052da2.jpeg)
# 検証
__USBケーブル__ を接続すると __USBシリアルデバイス__ と認識すると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f1d18a6c-6cd0-e2e0-989b-478d1446f5d0.png)
続いて __ArduinoIDE__ 等でプログラムを書き込んでみましょう。
# あとがき
今回LEDをつけていないため、動作状態がわからないのが少し失敗でした。
Git操作備忘録

## はじめに
Gitの使い方について、基本的なコマンドや流れについて、備忘を兼ねてまとめました。

## 目次
| 項番 | 目次 |
|:----:|:-------------|
| 1 | [はじめに](#はじめに) |
| 2 | [Git管理の流れ](#Git管理の流れ) |
| 3 | [用語](#用語) |
| 4 | [その他コマンド](#その他コマンド) |
| 5 | [参考サイト](#参考サイト)|

### Git管理の流れ

![図3_git.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305763/44833e00-59e8-86fc-197f-b1ef17b1cf58.png)
＜図：Git管理の流れ（イメージ）＞

1 git init・・・リポジトリの作成
2 git add・・・ステージングエリアへの追加
3 git commit・・・ローカルリポジトリへの追加
4 Git Hub操作・・・リポジトリの作成（Git Hub）
5 git remote add origin・・・GitとGitHubの連携
6 git push -u origin master・・・リモートリポジトリへの追加


#### git init
目的：リポジトリの新規作成
結果：＜管理対象フォルダ＞に.gitフォルダが作成される
```
cd <管理対象フォルダ>
git init
```
#### git add
目的：ステージングエリアへの追加
結果：-
```
git add <追加対象ファイル>
```
変更ファイル全件をステージングエリアに追加する場合
```
git add .
```
変更ファイルをステージングエリアから削除する場合
```
git rm　<削除対象ファイル>
```

#### git commit
目的：ローカルリポジトリへの追加
結果：Vimが立ち上がる。（commitのコメントもここで追加）
```
cd <管理対象フォルダ>
git commit
```
何の変更を行ったか確認を可能にするには、-vを付ける
```
git commit -v
```


#### Git Hub操作

Git HubでNew Repositoryを作成する。


#### git remote add origin
目的：GitとGitHubの連携
（originという名前でリモートリポジトリに登録※GitHubはデフォルトでoriginを設定）
結果：-
```
git remote add origin <Git Hub リポジトリページで指定されたURL>
```

#### git push -u origin master
目的：リモートリポジトリへの追加（masterはブランチ名・変更反映時は-uは不要となる）
結果：Git Hubのサイトにて、ファイルが保存される(Git Hubサイト上ファイル確認可能)
```
git push -u origin master
```
ブランチを変更する場合
```
git push origin <ブランチ名>
```

### 用語
| 用語 | 説明 |
|:----:|:-------------|
|リポジトリ|ファイルやディレクトリの状態・変更履歴を記録する場所|
|ステージングエリア  |ファイル変更時に、コミットするファイルを選択する領域|
|コミット|変更をリポジトリに記録する。一つの変更ごとに実施|
<!-- 
|ローカルリポジトリ  |  |
|リモートリポジトリ  |  |
-->

### その他コマンド
#### 状況管理で使用するコマンド
#### git status
目的：リポジトリ状況の確認（最新のコミットからの変更の差分）
結果：-
```
git status
```
#### git log
目的：コミット結果の確認
結果：-
```
git log
```
１行で表示するとき
```
git log --oneline
```
＜数字＞行まで表示するとき
```
git log -n <数字>
```
どのファイルの何の個所が変更されたか見たいとき（＜ファイル名＞は省略可）
```
git log -p<ファイル名>
```
#### git diff
目的：ファイルの変更差分の確認(ローカルとステージングエリアの差分を表示)
結果：-
```
git diff
```
ステージングエリアと最新コミットの差分を確認
```
git diff HEAD
```

#### 管理対象から外す場合に使用するコマンド
#### git rm <ファイル名>
目的：Git管理対象から削除する(ローカルリポジトリ・ステージングエリアから削除される)
結果：ファイル自体がローカルからも消される
```
git rm <ファイル名>
```
ファイルをローカルから消さずにGit管理対象から外す場合(ローカルリポジトリ・ステージングエリアから削除される)
```
git rm --cached <ファイル名>
```

#### git reset HEAD <ファイル名>
目的：Git管理に戻す。
結果：ローカルからファイルは消えたまま
```
git reset HEAD <ファイル名>
```

#### git checkout <ファイル名>
目的：ローカルにファイルがもどる。
結果：ローカルに消えたファイルがもどる。
```
git checkout <ファイル名>
```



### 参考サイト
・[Attlassian社のGitチュートリアル](https://www.atlassian.com/ja/git/tutorials/what-is-version-control)
・[Git公式ドキュメント](https://git-scm.com/book/en/v2)

<!--
# コミット例
１行目：変更内容要約
２行目：空白
３行目：変更した理由
-->
Minecraft Forge 1.18.2 Part0 EpitapのMOD開発忘備録について

こんにちは！DegeneracyCraft開発者のEpitapです！
マインクラフトのMOD…
・いざ作ろうとしても、そもそもどこを調べたらいいのかわからない。
・YouTubeでもmodding(MOD製作の意)解説はあるが、大体英語なのでよくわからない。
・やりたいことを思いついてもその実現方法についてよくわからない。
↑その結果折れてしまう…

正直めちゃくちゃ大変だと思います。
なので、ここでは私Epitap(初心者)が
**超絶ゴリ押し(コードが端麗ではなく煩雑という意味)**
ながらもなんとか実装に漕ぎつけたものを一度振り返ってみようというものです。
また、MOD開発を志す人にほんの少し助力にでもなれれば幸いであるというものです。

ここに書き連ねることについての注意点は
・McJty氏、Kaupenjoe氏、henkelmax氏、桜鬼神氏、柊ラッセルつばさ氏らのコード・解説を参考にして、**ゴリ押しで**実装しているものがほとんどであること
・参考にしてもらっても構いませんが、以下の開発環境で開発しているということが前提である

:::note info
開発環境 IntelliJ Community Edition 2022.2.4
SDK temurin-17 
Java version 17.0.4
Minecraft Version Forge ~~1.18.2-40.1.51~~ 1.18.2-40.2.0 mdk
:::
:::note alert
なぜMinecraftVersionが最新ではないか…
理由はおそらくわかると思います
:::
:::note info
↑Minecraft Version Forge 1.18.2-40.2.0 mdk
に移行成功しました！
:::

・再度申し上げますが、コードに自信はありません…
・更新は不定期であること

そんな感じです。
Docker×Laravel×MySQLでHPを作ったらデータが全て消えた話

## 技術選定の理由
- Dockerの勉強のため
- Laravelを使って何か作ってみたかった


## 発生したこと
ホームページには自作CMSを用いてブログ機能をつけた。
デプロイから1日程度は問題なく見ることができたが、**データがテーブルごと吹っ飛んだ**
管理アカウントも消えている...

仕方なくもう一度サーバーにログインしアカウント作成。
しかし、また消える....

# 解決策
以下の記事を参考にしながら、なんとか自力でやってみた

https://kiyobl.com/docker-mysql-persistence/

## コンテナ構成(docker-compose)
コンテナは以下のように構築した
```yaml
version: '3'

services:
  app:
    container_name: mapworks_hp
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8000:8000"
      - "5173:5173"
    volumes:
      - .:/var/www/html

  db:
    container_name: mapworks_hp_db
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ***
      MYSQL_DATABASE: ***
      MYSQL_USER: ****
      MYSQL_PASSWORD: ***
      TZ: Asia/Tokyo
    volumes:
      - ./data:/var/lib/mysql
    ports:
      - "3306:3306"

  certbot:
    image: certbot/certbot:latest
    volumes:
      - /etc/letsencrypt:/etc/letsencrypt
      - /var/www/html:/var/www/html
    command: ["--version"]
  
  nginx:
    image: nginx
    volumes:
      - ./server/conf:/etc/nginx/conf.d
      - /etc/letsencrypt:/etc/letsencrypt
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - app
```

着目点は**dbのvolumesのところ**
同階層にdataディレクトリを配置しといた。
この状態で`docker-compose up -d`を実行したら、中になんか生成された。

### volumesとは?
>~Chat GPTに聞いた~
Dockerのvolumes（ボリューム）は、Dockerコンテナとホストマシンの間でデータを永続化するための仕組みです。Dockerコンテナは通常、コンテナ内にデータを保存する仮想的なファイルシステムを持ちますが、コンテナが削除されるとデータも失われます。ボリュームを使用すると、コンテナ内のデータをホストマシン上のディレクトリにマウントし、データの永続性を確保できます。

### volumesの「:」の意味について
> Chat GPTに聞いた
Dockerのvolumesにおける:は、ホストマシンとコンテナ内のファイルシステムの間でデータを共有するための区切り記号です。具体的には、以下のような形式で使用されます。

とのこと。

なるほど。

# 結論
簡単にいうとdocker内のデータベースは再起動だったり、色々でリセットされてしまうけど
その影響を受けないところにデータベースを配置してアクセスさせればいいんじゃね？みたいなことかな..

**追記**
やっぱり消えた...
なのでDockerコンテナからMySQLを除いた
これでなんとかなりそう...
AWS CLIとSSOでIAM Roleを切り替える設定手順

## はじめに

AWS CLIとAWS SSOを組み合わせて使用する際に、IAM Roleを切り替えて利用するケースがあります。
ここでは、その設定方法を備忘録として記載します。

この記事を読む前提条件として、AWS CLI v2が既にインストールされていることを前提とします。

## 1. SSOでログインする

まず、以下のコマンドを使用してSSOでログインします。

```
aws configure sso
```

ログイン成功後、`~/.aws/config`に以下のような設定が生成されます。

```
[profile profile1]
sso_start_url = https://my-sso-portal.awsapps.com/start/
sso_region = us-east-1
sso_account_id = 123456789012
sso_role_name = readOnly
region = ap-northeast-1
output = json
```

## 2. スイッチしたいロールを登録する

次に、使用したいロールにスイッチするため `~/.aws/config`を編集します。

以下のように追記してください。

```
[profile profile1]
sso_start_url = https://my-sso-portal.awsapps.com/start/
sso_region = us-east-1
sso_account_id = 123456789012
sso_role_name = readOnly
region = ap-northeast-1
output = json

[profile rolename]
role_arn = arn:aws:iam::123456789012:role/rolename
credential_source = profile1
```

この設定により、profile1の認証情報を使用してrolenameロールに切り替えることができます。

### 3. 実行

設定が完了したら、以下のコマンドを使用して、新しいロールでAWSコマンドを実行できます。
`-profileオプション`には、設定したプロファイル名（この例ではrolename）を指定します。

```
aws s3 ls --profile rolename
```

## まとめ
本記事では、AWS CLIとAWS SSOを組み合わせて使用する際に、IAM Roleを簡単に切り替える方法について解説しました。



## 参考文献

- https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-role.html#cli-configure-role-mfa
【面接対策】今更聞けない！基本的なIT用語解説！

今回は未経験でのエンジニア就活に向けて知っておいた方が良い用語をまとめてみました！

## IPアドレス、ドメイン
**IPアドレス**は、インターネット接続中のコンピュータを識別する番号で、いわばインターネット上の住所です。自分のコンピュータのもつIPアドレスは世界に１つしかなく、それぞれのコンピュータで被ることはありません。
**ドメイン**はIPアドレスを分かりやすい名前に変更したものです。ドメインもIPアドレスと同じく世界に1つしか存在しません。しかし、ドメインではコンピュータどうしの接続ができないため、ドメインをIPアドレスに変換する仕組みを**DNS**といいます。

## MVC
Model、View、Controllerの略。

## OS
Operating Systemの略で、コンピュータを動かすために必要なソフトウェアを指します。

## ミドルウェア
OSとアプリケーションの中間に位置し、OS上で動作するソフトウェアです。ミドルウェアでは、OSの機能を拡張したり、アプリケーションの共通の処理を提供します。
ミドルウェアの中でも代表的なものがいくつかあります。**webサーバーソフト**はWebサービスの通信を行います(例：Apache、IIS、Nginx)。**データベース管理ソフト**はデータの保存や検索を行います(例：MySQL、Postgres、Oracle)。**メールサーバーソフト**では電子メールの受信や送信を行います(例：Postfix、Sendmail)。

## HTTPメソッド(Verb)
HTTPリクエストをする際に通信のやり取りの要求を定義したもので、代表的なHTTPメソッドはGET(データ取得), POST(新規データ作成),PUT(既存のデータ更新),PATCH(既存のデータ一部更新),DELETE(既存のデータ削除)があります。

## CRUD機能
Create、Read、Update、Destroyの頭文字をとったものです。機能の例を挙げるとcreateは`xxx.save`、readは`xxx.all``xxx.find(params[:id])`、updateは`xxx.update(xxx_params)`、destroyは`xxx.destroy`などがあります。

## 環境
プログラムやソフトウェアが稼働するために必要なものが揃っている状態(使用しているエディタ, フレームワーク、ライブラリ等)です。また、パソコン自体やその性能、周辺機器などのハードウェアも環境の一つです。本番環境はユーザーが実際にシステムを使う環境を示します。

## ロードバランサ―
複数のサーバに負荷を分散させる装置のこと。

## デプロイ
アプリケーションをネット上に公開する作業のことです。

## UI/UX
UI(ユーザーインターフェイス)は、ユーザーとサービスなどをつなぐもので、ユーザーの目に触れるものはすべてUIといえます。画面やマウス、キーボード、タッチ画面も含まれます。
UX(ユーザーエクスペリエンス)は、ユーザーが商品やサービスを通じて得られる体験を示します。
UXを高めるためには、品質の高いUIが必要です。UIはUXの質を左右する要因の一つと言えます。
これらが重要視されている理由は、商品やサービスを利用したユーザーの満足度に大きく関わり、利用率アップに影響するためです。優れたUI・UXはユーザー目線で情報が多すぎず、デバイスごとの使いやすいことなどのポイントを押さえて設計されているものです。

## IoT(Internet of Things)
様々なものをインターネットにつなぐことです。例えば、スマートフォンを家のエアコンと連携させ、外出先で操作することができるのもIoTです。
詳しくは[こちら](https://www.ntt.com/business/services/application/crm-dm/bconnection/lp/article-uiux-invoice.html)。UX/UIとの関係についても載っています。

## RPA(ロボティック・プロセス・オートメーション)
>ロボティックプロセスオートメーション(Robotic Process Automation)、通称RPAは、これまで人間のみが対応可能と想定されていた作業、もしくはより高度な作業を、人間に代わって実施できるルールエンジンやAI、機械学習等を含む認知技術を活用して代行・代替する取り組みです。

日本RPA協会より引用
## RDS
>RDSは、社内のパソコンに社外にあるパソコンやタブレットなどの端末から指示を送り、その結果を端末側に表示される画面で確認するサービスである。リモートアクセスを可能にする技術やサービスはほかにも多数存在するが、特別にインフラを整備しなくても、手軽に短期間で社内の端末を操作できるようになるという特徴が評価されている。

参考記事は[こちら](https://active.nikkeibp.co.jp/atcl/act/19/00217/070800019/)

## EIP(Enterprise Infomation Portal)
企業内にある情報システムにあるデータやアプリケーションを一括して閲覧することが可能で、業務に必要な情報を一括表示するものです。EIPの導入によって、業務の効率を向上させることができます。また、利用者ごとの内容表示選択や、パソコン以外(スマホなどの端末など)でも利用可能です。
【CSS】子要素が指定の数以下の場合にのみスタイルを適用する方法

以下のように記述すると指定した数以下の場合にのみスタイルが適用されます。

```css
ul:has(> :nth-child(-n+N):last-child) li { ... }
```

子要素が３つ以下の場合にのみスタイルを適用したい場合には以下のように記述します。

```css
ul:has(> :nth-child(-n+3):last-child) li { ... }
```
【小ネタ】shiftr.io Desktop と UIFlow1.0 の MQTT を組み合わせて軽く動作確認（ローカルネットワーク内）

## はじめに

過去の試作でよく利用して、Qiita の記事も書いてきた「shiftr.io」のデスクトップ版アプリと、「UIFlow1.0（以下、単に UIFlow とだけ記載）」とが関連する話です。

●「shiftr.io user:youtoy」の検索結果 - Qiita
　https://qiita.com/search?q=shiftr.io%20user%3Ayoutoy&sort=created

●「UIFlow user:youtoy」の検索結果 - Qiita
　https://qiita.com/search?q=UIFlow%20user%3Ayoutoy&sort=created

### 今回やること
今回の内容をもう少し書くと、具体的にはローカルネットワーク内での片方向通信です。
通信は、「UIFlow のプログラムを動かしている M5Stack系デバイス」から「shiftr.io Desktop を動かしている PC」に向けて行います（通信は　MQTT のパブリッシュ）。

## 今回の構成
今回のお試し用の構成は、以下の通りです。

- ハードウェア
   - MacBook Pro
   - [M5StickC Plus2](https://www.switch-science.com/products/9350)
- ソフトウェア・アプリなど
   - [shiftr.io Desktop](https://www.shiftr.io/desktop)
   - UIFlow1.0

とりあえず、MQTT のパブリッシュを軽く試すだけ、という構成です。
（MQTTブローカーと、そこにつながった1台の端末との間での通信）

サブスクライブは今回は取り扱いません。

### shiftr.io Desktop のバージョン
今回用いる shiftr.io Desktop は、記事執筆時点の最新版を用いました。

以下の公式サイトからダウンロードすることもできますが、自分は、過去にインストールしていた古いバージョンのアプリがあったので、そのアプリ経由でバージョンアップしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/ee6da77a-8932-26f9-1d66-862242b79ddb.png)

アップデート後のバージョン確認をした画面は以下のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/8085a5fb-4845-6795-d949-c8da000cb18c.png)

## シンプルな手順でのお試し
それでは、UIFlow でブロックのプログラムを組んで、それを動作させつつ、shiftr.io Desktop のほうとの間での通信を試します。

### UIFlow で最小限のブロックを組む
それでは、UIFlow で最小限のブロックを組んで、接続確認だけやってみます。

利用したブロックは、以下のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/191fb612-a852-6129-714f-6e69585220bd.png)

プログラムの処理の内容は、以下となっています。

まずは、Setup の部分です。

1. shiftr.io Desktop（MQTTブローカー）との通信を行うためのセットアップ処理
   - クライアントID： 適当な文字列で設定（今回は「M5CP2」）
   - サーバーアドレス： shiftr.io Desktop を動かしている PC のプライベートアドレスを設定
   - サーバーのポート番号： 1883 【デフォルト値】
   - ユーザー名／パスワード： （空）
   - キープアライブ： 300 【デフォルト値】
   - SSL： False 【デフォルト値】
1. 通信の開始
1. Setupの処理が進んだことを確認するための、画面の色を変える処理

ボタン押下時の処理は以下の通りです。

1. Aボタンが押された時に処理を実行
1. MQTT のパブリッシュ
   - トピック： 適当に決めた文字列（今回は「test」）
   - データ： 適当に決めた文字列（今回は「abc」）
   - QOS： 0 【デフォルト値】

このプログラムを実行後、M5StickC Plus2 の Aボタンを押せば、MQTT を用いたデータ送信（パブリッシュ）が行われます。

### shiftr.io Desktop側
あとは、shiftr.io Desktop側のほうを見ていきます。

先ほどの UIFlow で組んだプログラムを動かしている状態だと、既に shiftr.io Desktop との間で通信が確立された状態になっています。
それがアプリ上の表示で分かります（アプリ上に「M5CP2」という名称のものが、図的につながっている状態になっているのが分かります）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/74c9d8f1-0675-f091-851c-7e2e86b94737.png)

ここで M5StickC Plus2 の Aボタンを何度か押してみます。
そうすると、shiftr.io Desktop の表示が以下のようになり、先ほどの画面から少し変化した状態になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/414f73e6-c66f-1449-3c97-9cace9b71cdf.png)

画面の左上を見ると、「トピック test、データ abc」という MQTT を使った通信内容を、shiftr.io Desktop で受けとれていることが分かります。

## おわりに
とりあえず、ローカルネットワーク内で MQTT のパブリッシュを、小さい構成で試すことができました。

あとは、M5StickC Plus2 以外のデバイスを shiftr.io Desktop に　MQTT でつないで、同じトピックを用いた受信処理（サブスクライブ）を行えば、これを別デバイスで受けとることもできます。

インターネットを介さない構成なので、遅延もあまりなく、端末間をつないだやりとりができます。

### 活用事例？： デバイスの傾きをブラウザ上のキャンバスの背景色に連動させてみる
以下は、「M5StickC Plus2 の傾き（ロール角を利用）を、ブラウザ上の p5.js のキャンバスで受けとるようにして、受けとった値を背景色に連動させてみる」という例です。

簡易な値の送受信をする事例になるような変更を、少し加えてみました。

https://twitter.com/youtoy/status/1762139565182369941
PlanetScaleが地獄の改悪へ...

:::note warn
2024/2に書いた記事です、2024/3/7時点ではもっと改悪されました...
この改悪を機にタイトルを「PlanetScaleが改悪されました」→「PlanetScaleが地獄の改悪へ...」へ変更しました
:::

# Scalerプランが廃止となりました

2024/2/5、PlanetScaleは「Scalerプラン」の廃止を発表しました。なんのことかわからない方向けに伝えるとPlanetScaleの最安値プランが29ドルから39ドルになりました。要は改悪です。

https://planetscale.com/blog/deprecating-the-scaler-plan

# 何が変わったのか？
もともとHobby、Scaler、Scaler Pro、Enterpriseと4つのプランがありましたが、有料プランで一番低価格なScalerプランが廃止になりました。Scalerプラン廃止に伴い2024/4/12までにScaler Proプランにアップグレードするよう通知されました。

# 具体的に何が変わったのか？

表にしてみました。もしかしたら間違っている部分があるかもしれないのでご了承ください。

| | Scaler | Scaler Pro |
|:-----------|:-----------|:------------:|
|　読み込み/月　|10億|<font color="red">無制限</font>|
|　書き込み/月　|1000万|<font color="red">無制限</font>|
|　ストレージ　|10G|10G|
|　本番ブランチ　|2|<font color="red">1（2つ目以降は従量課金）</font>|
|　開発ブランチ　|5|<font color="red">1440？</font>|
|　Query insights　|7日間|7日間|
|　ログの保持　|15日間|15日間|
|　バックアップ　|12時間毎|12時間毎|
|　CPU|?|<font color="red">1/8</font>|
|　RAM|128M？|<font color="red">1G</font>|

読み書きは余程のアプリケーションでなければ超えないので恩恵受ける人が少ないかもしれません。唯一の改良はRAM、CPUぐらいでしょう。

# 改悪？

10ドルアップに見合うアップグレードされてるじゃないかと思われるかもしれませんが**元々Scaler Proプランは存在していた**ので単純にScalerプランが無くなっただけです。改悪です。

# 本当に10ドルだけなのかい？

**いいえ、東京リージョン以外の話です**

Scalerプランでは東京リージョンが29ドルだったのに対してScaler Proプランで東京リージョンにすると47ドルになります。その差18ドル、今は円安（2024/2時点）なので3000円近い値上げになります。改悪です。

# ~~唯一の救いHobbyプラン（無料）~~

~~Hobbyに関しては私が観測した限り、なにも変わってません。アプリケーションの構成にもよりますが、開発時やあまりユーザーに利用されないローンチ直後など活用できるので十分実用的かと思います。~~

:::note warn
2024/3/7にHobbyプランも廃止になりました。唯一の救いも無くなってしまった...
:::

https://planetscale.com/blog/planetscale-forever

# 他のサービス使った方がよい？

正確に比較出来ないので一概に言えませんが、PlanetScaleを利用している方はそのままアップグレードするのが無難かと思います。AWS、GCPなど同じぐらいの値段設定、もしくは高くなってしまう可能性があるので、機能が豊富なPlanetScaleから他のDBaaSに変える必要はないかなと個人的に思います。

# チョット気になる

PlanetScale Incは2021年に1億ドル以上の資金調達をしてるのですが3年経った今、プランが変えることを想像するにマネタイズがうまく機能していないと考えられます。目論見としてはユーザーの大多数であるScalerプランの単価を上げることかと思います。PlanetScaleがなくなることはないと思いますが、Herokuのような結末を迎える可能性が十分にあり得るのでエンターブライズで利用するのは少し懸念かなと思ったりします。ただ、今後対抗馬は出ないと思いますし、3大クラウドはRDBに力を入れることは無さそうなのでそこまで気になることは無いかなと感じます。ワーストシナリオはHobbyプランが廃止されるぐらいでしょう。

2024/3/7追記

まさかのワーストシナリオが実施されたことに加え、レイオフも行っているそうです。思ったより重症ですね...

https://twitter.com/flybayer/status/1765439510517539252

# 最後に

今回は改悪となってしまいましたが、DBaaSの中ではダントツに使いやすいのでこのまま使い続けても良いと思いました。ただ、個人的に使うには47ドルは辛いので勘弁していただきたい😭
Z世代新卒2年目で転職したお話

# はじめに
昨年新卒2年目（勤務年数としては1年半）で転職しましたので将来振り返りする際にふと当時の考え方が残っていればいいかなあと思い、書き留めました。

採用関係の方や同年代の方の参考になれば幸いです。

# 私のキャリア
* 学歴: 学部卒（機械系）
* 英語力: TOEIC630点、論文とか読めるけど会話となると絶望
* 使用言語: PHPメイン、たまにPython
* 資格：基本情報技術者、AWS（CCP・SSA)

# 職歴

### 1社目（新卒採用）
* 典型的なSES企業
* 年収280万ぐらい 
* 業務内容としては認証基盤の開発、詳細設計から実装テストまで
1年目の割にはゴリゴリ実装をさせてもらい、OIDC認証や自動テストの知見がモリモリ吸収できた。
SESの中では当たりだったかも？同期の話を聞いてもひたすらテストでエビデンスをペタペタするかExcel作成ばかりだったので実装メインで動けたのはかなりレアケース

    **ｽｺﾞｲｱﾘｶﾞﾀｲ**

### 2社目 現職（中途扱い）
* IT企業ではなく事業会社
* 年収は330万（固定残業込みなので1社目とはほぼ変わらず）
* 業務内容としては社内SEからバックエンド等々広範囲、言語も1社目と同じくPHP/Laravel
* 社内SEの経験が詰めるので中々面白い。あとは"これやりたいです!"と言えば割と何でもさせてもらえる。
1社目と比べるとかなりゆるふわ系かつリモートメインでストレスフリー。

# なぜ転職したのか
さてここからがメインとなります。

**単刀直入言うとキャリア戦略です。**

そもそも機械系学部卒にもかかわらずIT業界に参入した理由ですが
卒業研究で画像認識をかじった際に「**プログラミング楽しいな**」と思ったからです。ただそれだけ。。。

CADで設計図の作成、応力計算よりソフトウェアの実装のほうが遥かに楽しかったですし、明らかに自分に向いていると感じたからです。自分の直感を信じた結果ですね。

ただ1つ問題が。
```nginx```の読み方もわからないIT未経験の人間が開発をゴリゴリしているメガベンチャーのような会社に行けるのかとなると。。。

**まあほぼ無理だろうと。**

そこでIT未経験という経歴を払拭するために未経験歓迎のSES企業に入った次第です。
1~2年ならどんなにしんどくても耐えよう決心で入社しました。

そして約1年半SES企業で業務を行い、これ以上新しいことはないだろうというタイミングが今回の転職タイミングとなりました。

# 今回の転職目標
あまり目標・条件を固めてもしんどいだけかと思いましたのでひとまず

**SES(客先常駐)は嫌だ、自社開発がいい**

だけにしました。
まだ年収にこだわるタイミングではないと判断したので条件一本で絞りました。

# 転職方法

* スカウト系
* エージェント1社

最終的に内定をゲットしたのはエージェント経由の企業でした。
年齢関係なく声を大にして言いたい

**初めての転職はエージェントと1度は話したほうがいい**

特に転職エージェントの回し者ではないので固有名詞はあげませんが、
エージェントとの会話を通じて
* 現在の年齢で求められる経歴
* トレンド
* 私とマッチしそうな企業

がタダで知れるので使うに越したことはないです。これはオススメ。

# 転職面接で聞かれたこと

こちらに関しては基本的な中途面接と同様かと思われます。

新卒2年目なこともあり人柄メインで見られている感はありました。
開発強め?な企業だと過去の開発内容の質問がかなり多かった印象です。

* これまでの経歴
* 携わったプロジェクト（何をやったか）
* Laravelのこういう機能知ってる?
* 今後どういうエンジニアになりたいか
* うちで何をしてみたいか
* 大学の研究は何したの?
* 学生時代取り組んだことは?

等々

# 転職して良かったこと
* 新卒2年目というある程度社会に慣れてきた段階での転職だったのでかなり自己分析・将来のキャリアプランの構想ができた。~~というか新卒就活の時点で社会を知らないのに将来のこと考えるのは無理っす~~
* 同年代に比べるとキャリアに対する考え方が深まり、**一皮むけてかなり大人になった気がする**（個人比）
* 様々なエンジニアキャリア、○○エンジニアがどういう仕事かかなり理解が深まった
* 転職に対する抵抗がなくなったのでもし何かあっても**転職する**という方法が採択できるのでキャリアの幅も広がりかなり将来が楽しみになった
* 1つの企業に依存しなくてもやっていけるんだという自信になり、精神的に楽になった（気がする）

# 転職して悪かったこと（気になったこと）
* アウトプットが一切無かったので個人開発などをすればもう少し上を目指せたかもしれない
* 割と書類選考で落とされた感はあるので1つ目にも上げたように目に見える物が必要だったかも
* どれぐらい英語力があれば外資系も視野に入ってくるのか
* PHP以外の言語の企業で修行したほうがキャリアとしては広がった可能性

# 今後
現在の企業ではかなり幅広く、好き放題させてもらえそうなのでできることはやりたい。

次は30歳手前ぐらいに転職したい感。これまで中小だけなので大きめの会社がいいかなあとぼんやり。。。

or

個人開発で何かしら収益を上げたい
こちらに関してはプライベートな目標。一先ず、アウトプットを行う癖をつけたい。

# まとめ
人生初めての転職でしたので今後振り返れるようにまとめさせていただきました。
割と日本語がへたくそな認識はあるのでそれの改善も兼ねて今後とも書いていきたいと思います。

どうぞよろしくお願いいたします。
ずれなくWebページを印刷させるためのCSSティップス集

用紙の大きさはA4とかって決まっているとき、その決まった大きさにずれずに収まるように印刷できるようなウェブページを作るときのティップス集。複数のページにしたいときにも対応。

# `@page` を書く
[`@page`](https://developer.mozilla.org/ja/docs/Web/CSS/@page) はCSSの@ルールの一つで、印刷するときの用紙の大きさ等を指定できる。

```css
@page {
  size: 297mm 210mm;
  margin: 0;
}
```

[`size`](https://developer.mozilla.org/ja/docs/Web/CSS/@page/size) プロパティでA4横向きの大きさで印刷することを表している。A4以外の大きさの紙に印刷しようとすると縦横比を保ったまま拡大縮小される模様。縦横比を保ってくれるので、別の大きさの用紙を使っても余白はできるがレイアウトが崩れることはなくせる。

`margin` プロパティで印刷するときの余白を指定できる。余白にはヘッダーやフッターを入れることができるようだが、やったことない。`margin` を0以外に設定するなら印刷できるページの領域が狭まるので次セクションではそれを考慮する必要が出てくる。

`size` は以下のような書き方もできる。

```css
@page {
  size: A4 landscape;
  margin: 0;
}
```

# 各ページのブロックの縦横サイズを用紙に合わせる
```html
<body>
  <div class="page">
    1ページ目
  </div>
  <div class="page">
    2ページ目
  </div>
</body>
```

```css
body {
  margin: 0;
}

.page {
  box-sizing: border-box;
  width: 297mm;
  height: 210mm;
  margin: 0;
  padding: 30px;
}
```

各ページに対応するHTMLのブロック要素を作って、そのサイズをページのサイズと同じに設定する。周囲に余白を取るときは `box-sizing: border-box;` を設定した上で `padding` を設定すると内側の領域のサイズを計算する必要がなくなるのでわかりやすくなる。

前セクションで `@page` の `margin` を0以外に設定した場合、このブロック要素のサイズ指定はそのマージンを引いた分の大きさにしないといけない。

`body` 要素にはデフォルトのスタイルシートでマージンが設定されているので0にセットしておかないとずれる。

# `break-***` 系のCSSプロパティを使用する
`break-before` 等のプロパティを使って改ページする部分を指定する。

```css
.page {
  box-sizing: border-box;
  width: 297mm;
  height: 210mm;
  margin: 0;
  padding: 30px;
  break-inside: avoid-page;
}
:nth-child(1 + n of .page) {
  break-before: page;
}
```

`break-before: page;` によって各 `.page` の前で改ページするように指定している。`break-inside: avoid-page;` で各 `.page` 内では改ページがされないように指定している。

# 合わせたボックスの縦横サイズからはみ出ないように注意する
当然設定した縦横のサイズをはみ出す要素を置けば印刷時に表示が崩れることになるので、はみ出ないように注意する。内部ではなるべく絶対値は使用せずに`%`や`fr`など相対値で大きさを指定するようにする。私がハマったこととして、`display: none;` が指定されていて表示されない要素でも、印刷時にはその要素の存在領域を確保した状態で印刷しようとするようなので注意。


# 小さい文字を印刷したい場合
:::note warn
このセクションの話は Google Chrome の仕様変更により実質的に問題になることはなくなった模様。今は意味のないティップスかもしれない。
:::

ブラウザのフォントサイズには最小値が設定されていて、小さなフォントサイズを指定しても実際の文字サイズが最小値以下にはならないという仕様がある。例えば Google Chrome だと10px以下には~~できない~~できなかった→[Chrome 118 から制限がなくなった](https://developer.chrome.com/blog/chrome-118-beta?hl=ja#consistent_minimum_font_size_across_languages)模様。

最小値10pxは印刷すると十分すぎるほど大きく、もっと小さな文字を印刷したいこともある。

その場合、ウェブページを2倍の大きさで作成して印刷時には縮小されるようにすることで、小さな文字を印刷させるという方法がある。

```css
@page {
  size: calc(297mm * 2) calc(210mm * 2);
  margin: 0;
}

.page {
  width: calc(297mm * 2);
  height: calc(210mm * 2);
}
```

上のようにきっちり2倍の大きさでウェブページを作成する。この状態で10pxの大きさの文字を書けば、A4印刷時には縮小されて1/2の5px相当の大きさで印刷できる。
AWS SOA-C02合格体験記

AWS SOA-C02に合格したので、アウトプットとして合格体験記を書きました。
これから受験される方のお役に立てればと思います。

# 筆者について
- エンジニア3年目
- AWSを触り始めて1年半くらい
- AWS資格はSAA・DVA・SAPを取得済み

# 使用した教材
- [AWS Certified SysOps Administrator - Associate 公式練習問題集](https://explore.skillbuilder.aws/learn/course/external/view/elearning/12555/aws-certified-sysops-administrator-associate-practice-question-set-soa-c02-japanese?syops=sec&sec=prep)(無料)
    - AWS公式の20問の練習問題
- Udemyの「[【SOA-C02】AWS Certified SysOps Administrator - Associate 模擬試験](https://www.udemy.com/course/soa-c02aws-certified-sysops-administrator-associate/?couponCode=ACCAGE0923)」
    -  1回50問の模擬試験が3回分
- AWSのドキュメント
- QiitaやDevelopersIOなどの技術ブログ

# 勉強時間
- 約11時間（期間は1ヶ月）

# 勉強の流れ
1. 「AWS Certified SysOps Administrator - Associate 公式練習問題集」を解いて、出題される問題の雰囲気をつかむ
2. Udemyの「【SOA-C02】AWS Certified SysOps Administrator - Associate 模擬試験」を2周する
3. アウトプットとして、問題でよく出る内容をQiitaの記事としてまとめる
    - 実際に書いた記事：[AWS SOA 取得に向けて覚えておいた方がいいこと](https://qiita.com/Yamato1923/items/15b92fed77f458d2ccfe)

# ポイント
問題演習で間違えた内容は、解説だけではなくAWSドキュメントや技術ブログなど複数のドキュメントを読んで理解しました。
特にやってみた系の技術ブログはイメージがつきやすいのでおすすめです。（可能であれば実際にリソースを作って動かす）
問題を3周4周するより、間違えた内容について時間をかけて理解していく方がいいと思います。

# 余談
Qiitaの記事を書くのは時間がかかりましたが、頭の整理になったと思います。
前日や受験会場へ向かうときの復習にも役立ちました。（自己肯定感も上がります。）
M75q-1のBluetoothが繋がらなくなるトラブルの解決

# はじめに
ThinkCentre M75q-1 Tiny を使っているとき、起動して数日から数週間でBluetoothが繋がらなくなる症状に悩まされていました。
いくつか解決策がインターネットに転がっていたものの筆者環境では解決できておらず、あるとき自力解決したのでその記録をここに残します。

# 環境
* 機種：Lenovo ThinkCentre M75q-1 Tiny
* OS：Windows 10
* APU：AMD Ryzen 5 PRO 3400GE
* メモリとSSDは換装済
* 購入時にカスタマイズで「インテル Wireless-AC 9260 + Bluetooth」を追加

# 症状
1. M75-qを起動してから数日は問題なく稼働する
1. 数日から数週間が経過したとき、Bluetooth機器が接続しなくなる
1. 設定ではBluetoothがオンの表示になっている
1. 一旦オフにして再度オンにしようとすると、「このコンピューターに最後に接続された USB デバイスが正しく機能していないため、Windows によって認識されていません。」と通知が出る
1. デバイスマネージャーにBluetoothが表示されなくなる（「非表示のデバイスを表示」をオンにしないと出ない）

# 応急対策
1. Shiftキーを押しながらシャットダウンまたは再起動する

筆者環境では、完全シャットダウンをすることでBluetooth機能が復活します。ただ、この場合も数日から数週間でまたBluetoothが繋がらなくなるので、対症療法的です。

数年間ずっとこれで耐えてきましたが、さすがに根本的な解決をしたくなり以下の方法に辿り着きました。

# 恒久対策
（以降の手順ではレジストリエディタを操作します。操作を誤った場合はPCの動作に影響しますので注意してください）

1. Bluetoothが生きている状態でデバイスマネージャーを開き、「インテル(R) ワイヤレス Bluetooth(R)」のようなBluetoothデバイスのプロパティを開く

1. 「詳細」タブで「親」プロパティを選択し、値をメモする（画像の場合は `USB\VID_05E3&PID_0610\6&dfdeee3&0&3`）
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565515/a8e43038-4f18-07d5-334e-4ec666cd7c87.png)

1. Win+Rなどで「ファイル名を指定して実行」を開き、`regedit` と入力してレジストリエディタを開く
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565515/5adf692b-01b7-e13b-07f0-d7f62970a6dc.png)

1. `コンピューター\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\（手順2でメモした値）\Device Parameters` に飛ぶ

1. 適当な場所を右クリックして「DWORD (32ビット)値」を新規作成し、値の名前を `DeviceSelectiveSuspended` とする
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565515/6de493a2-281c-47b4-0920-3b646bf3b7c8.png)

1. `DeviceSelectiveSuspended` の値を `1` にする 
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565515/3e3d0281-790b-df8a-c823-a3de4bedda78.png)

1. OKボタンを押下して、値が1になっていることを確認する
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565515/738e41c5-85e8-30d3-ced2-50d2883495f9.png)

1. 「応急対策」の手順で完全シャットダウンする
1. おわり

# おわりに
以下のマイクロソフトコミュニティを見つけたことが解決のきっかけでした。どうやらデバイスごとにUSBセレクティブサスペンドを設定する必要があったようです。

[USBのセレクティブサスペンドが無効にならない - Microsoft コミュニティ](https://answers.microsoft.com/ja-jp/windows/forum/all/usb%E3%81%AE%E3%82%BB%E3%83%AC%E3%82%AF%E3%83%86/8de8829e-a316-46d4-8d0b-bf3d2f358bf9)

# Appendix
電源オプションで「USB のセレクティブ サスペンドの設定」を無効にしただけでは改善しませんでした。レジストリエディタの設定が優先されるのでしょうか。

また、デバイスマネージャーでBluetoothや関連してそうなUSBデバイスの「電力の節約のために、コンピューターでこのデバイスの電源をオフにできるようにする」チェックを洗いざらい外した場合も、改善しませんでした。

さらに価格.comの掲示板に同じような悩みをされている方がおり、解決策としてデバイスマネージャーでの電源管理設定を変更するものが掲載されていました。かなり答えに近そうではあったのですが、筆者環境では改善しませんでした。

[価格.com - Lenovo ThinkCentre M75q-1 Tiny 価格.com限定 AMD Ryzen 5 PRO 3400GE・8GBメモリー・256GB SSD搭載 パフォーマンス 11A4CTO1WW のクチコミ掲示板 (12ページ目)](https://bbs.kakaku.com/bbs/K0001218252/SortRule=1/ResView=all/Page=12/#23427186)
Excelで指定範囲のランダムな整数を返す関数

# RANDBETWEEN()

## 使用例

```RANDBETWEEN(最小値, 最大値)``` のような使い方。

最小値の値は **出現します。**
最大値の値は **出現します。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c06b548f-3e0e-f98a-053e-456d30b66810.png)

## 何かアクションが起きるたびに乱数が生成される

例えば…

* ブックを開く。
* RANDBETWEEN()が無い別セルの値が変わる。

など、何か起きるたびに ```RANDBETWEEN()``` は新しい値を返します。

# 蛇足

7割くらいは〇〇で3割くらいは△△みたいな条件の大量テストデータ作る時に役立ちます。

# 参考サイトさん

https://too-support.my.site.com/faq/s/article/knowledge24060

# バージョン

Microsoft Windows [Version 10.0.19045.4046]
Microsoft Excel for Microsoft 365 MSO (バージョン 2401 ビルド 16.0.17231.20236) 32 ビット
自己証明書を発行しSpringBootで使用する

# 概要
いわずと知れた、いわゆるオレオレ証明書の発行手順を
数年周期でなにかしらで必要になるけれども、どうやって作るかを毎回忘れてしまうので備忘録として残しておきます
また証明書の使い方としてSpringBoot設定を例として記載しておきます

#### 実行環境
Windows11

## 自己証明書発行
方針としてはKeyToolから証明書を発行し、SpringBootで使用する

### KeyToolの準備
Java SDKに同胞されているkeyToolを使用したいため
インストールされてなければ下記とかからjdkをダウンロードしインストールする
https://www.oracle.com/java/technologies/downloads/#jdk21-windows

### SSL証明書の発行
上記でインストールしたJavaJDKフォルダのkeytoolのあるディレクトリに移動
※コマンドプロンプトは管理者で開く
`````
>cd C:\Program Files\Java\jdk-21\bin
`````

keytoolを実行する　
※引数の有効期間、証明書のファイル名は任意
`````
>keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
`````

いろいろ聞かれるが、パスワード以外はすべてEnterで、最後のみ「y」で入力
`````
RSA -keysize 2048 -keystore keystore.p12 -validity 3650
キーストアのパスワードを入力してください:
新規パスワードを再入力してください:
識別名を入力します。サブコンポーネントを空のままにする場合はドット(.)を1つ入力し、中カッコ内のデフォルト値を使用する場合は[ENTER]を押します。
姓名は何ですか。
  [Unknown]:
組織単位名は何ですか。
  [Unknown]:
組織名は何ですか。
  [Unknown]:
都市名または地域名は何ですか。
  [Unknown]:
都道府県名または州名は何ですか。
  [Unknown]:
この単位に該当する2文字の国コードは何ですか。
  [Unknown]:
CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknownでよろしいですか。
  [いいえ]:  y
`````

下記のように生成しましたメッセージが表示され
実行フォルダに証明書ファイル（keystore.p12）が作成される
`````
3,650日間有効な2,048ビットのRSAのキー・ペアと自己署名型証明書(SHA384withRSA)を生成しています
`````
## SpringBootに設定する

証明書ファイル（keystore.p12）を配置し
「application.properties」ファイルに書きのように証明書の読みこみ設定を追記する
`````
# 接続ポート番号（任意のポート名）
server.port=9443

# SSL証明書を保持するキーストアへのパス（※作成したkeystoreのパス＋ファイル名）
server.ssl.key-store=keystore.p12
# キーストアにアクセスするためのパスワード（証明書発行時に設定したパスワード）
server.ssl.key-store-password=xxxxx
# キーストアのタイプ
server.ssl.key-store-type=PKCS12
# キーストア内のキーを識別するエイリアス
server.ssl.key-alias=tomcat
`````
※上記の場合はプロジェクトのルートフォルダに配置、JAR配布の場合はJARと同一フォルダに配置

下記のようなURLでアクセスする
`````
https://localhost:9443/xxxx
`````

# 参考
https://jp.globalsign.com/support/ssl/confinfo/rootcert-import-java.html
https://blog.fire-sign.info/1695/
Sidecarが機能せず困った話

# はじめに
Sidecarを利用してMacbookの作業画面をiPadに拡張しようとしたところ、iPadをディスプレイとして認識せず、試行錯誤したため書き記すことにした。
　
## デバイスの詳細
- Macbook　Pro(M1) 
    - macOS:14.3.1（2024/02/25時点最新)
- iPad(第10世代) 
    - iPadOS:17.3.1 （2024/02/25時点最新)

## 試してみたが、解決しなかったこと
とりあえず、[公式サイト](https://support.apple.com/ja-jp/guide/ipad/ipad2b1aa3be/ipados)に記述されている設定方法と、[ITHOOK](https://itojisan.xyz/trouble/25891/)さんのサイトに記述されている解決策、サポートセンターに教えてもらった解決策を一通り試したので、以下に簡単にまとめておく。

1. MacとiPadで同じApple IDを使ってサインインしていること
2. MacとiPadでWi-FiとBluetooth®がオンになっていること
3. 双方のWi-FiとBluetoothを再度オンにすること
4. 同じWi-Fiを利用していること
5. Handoffを有効にすること
6. AppleIDの2ファクタ認証を有効にする
7. 双方の再起動
8. MacOSの再インストール
9. 初期化・Time Machineを利用したバックアップ
10. Apple IDのサインイン・サインアウト

## 結局
最後のダメ押しでApple IDを新規作成するとなんかできた...
（元々、Apple IDを使ってサポートセンターにログインできなかったので、今考えるとIDの挙動がおかしかった）
サポートセンターにも電話でサポートして頂いたが、対応7,8に関してはほぼダメ元感があった。
同じような事象で困っている人はApple IDを再作成すると解決するかもしれない。
Tableauの計算フィールドでコメントアウトを残すには

# はじめに
プログラミングで過去に書いたコードを見直すと、なんでこの処理を書いたんだろうと思ったことが誰しも1回はあると思います。
その対処として、コメントアウトを利用してそのコードの内容や記載した意図を書くようになるでしょう。

私は、本記事執筆までTableauの計算フィールドでは、コメントアウトはできないと思っていました。(数年前調べた際見つからなかったため)
そのため、複雑な処理や複数の計算フィールドをまたぐ項目を見直したり改修しようとした際、
処理の意図を失念し、思い出すまで時間を要すことが多々ありました。
しかし、コメントアウトができるということを最近知り業務の効率が上がったため、紹介します。

# やりたいこと
Tableuの計算フィールドなどで記載した関数などの処理について、
その意図や内容を記載する方法を説明します。
※データはTableauのサンプルデータのスーパーマーケットを使用

# 手順
手順としては、関数の処理などを記載し、計算フィールド内でどこでも良いので「//」を記載することで、その後ろをコメントアウトすることができます。
また、「/＊ ＊/」の*の間をコメントアウトとして残すこともでき、作成する関数の処理の内容や意図などを残せます。

例えば、シンプルですが、以下のように活用できます。
![pic4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522066/8d969675-2b4d-b2d2-1482-1240bf587b87.png)
//以降がコメントアウトした箇所となります。

ただ、上記のように短いコメントだと問題ないのですが複雑な処理や注釈を加える場合、説明の文章が長くなることが多いでしょう。
実際私自身も思い出しやすいよう記載するため、説明が長くなることが多いです。
その場合、以下の画像の赤い四角のように「//」を行ごとに記載するか「/＊ ＊/」の*の間に記載するという方法で対処可能です。
どちらを採用するかは好みです。

![pic2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522066/a68a7ca2-4e78-164e-03be-fcb1a08626de.png)

![pic3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522066/01be82bd-cd32-d14d-3b15-05b043a21337.png)

また、上記コメントアウトの処理はTableauでできるならTableau prepでもできるのではと思い確認しました。
結果、Tableau prepの「計算フィールドの作成」・「値のフィルター」の両方で「//」の場合のみコメントアウトすることができました。
「/＊ ＊/」を記載するとエラー処理となりました。
※こちらについてはTableauやTableau prepのバージョンに依存している可能性もあるため
　自身の環境で試してみることをお勧めします。

# 終わりに
コメントアウトは初めのうちは記載しなくてもそこまで影響のないものですが、
慣れてきて難しい・複雑なものを作る場合や、複数人で作成・管理する場合などなくてはならないものだと思います。

今回の記事はとても初歩的なものではありますが、
本記事でコメントアウト機能を知り、活用いただきTableauの活用がより良いものになれば幸いです。
PowerShellでyarnをインストールしようとしたら、「yarn : このシステムではスクリプトの実行が無効になっているため～」とエラーが出た

# 今回困ったこと
タイトルの通りですが、PowerShellで`yarn`を使おうと`npm`でインストールしようとしたら、以下のようなエラーが出て手詰まりになりました。
```
yarn : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Users\hogehoge\nodejs\bin\yarn を読み込むことができません。詳細については、「about_Execution_Policies」(https://
go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:3
+ . 'C:\Users\hogehoge\nodejs\bin\yarn
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
```

# 今回の環境
なんかエラーが出たら、また社内プロキシかとプロキシに対して常に疑いの目を向けていますが、ここは自宅です。
というわけで、環境としては以下の具合です。
* Windows10
* PowerShell 7系
* `npm`と`yarn`はインストール済み

# 原因
`about_Execution_Policies`とありましたので、もしやポリシー云々ではとあたりをつけてみたら……
```
> Get-ExecutionPolicy
Restricted
```
ビンゴでしたね。スクリプトの実行ポリシーが制限されていました。

# 対応手順
* というわけで解除していきましょ。
```
> Set-ExecutionPolicy RemoteSigned
```
* 制限が解除されたか確認。
```
> Get-ExecutionPolicy
RemoteSigned
```
`* yarn`も使えるようになったか確認。
```
> yarn -v
1.22.19
```

以上で解決しましたね。
相関係数から多重共線性が発生してそうな組み合わせを抜き出す

# 多重共線性が発生していそうな組み合わせを抜き出す

まず相関係数をcorr()メソッドで出してあげる
```
train_corr = train.corr()
train_corr = train_corr.mask(train_corr[train_corr.columns] == 1.0)
train_corr
```
実行結果(kaggleのNotebook画面)

![スクリーンショット 2024-02-26 22.04.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562534/24bcb070-29cf-7ba4-59b4-ac2526031d4a.png)

##### この実行結果からfor文を利用し、多重共線性が発生している要素の組み合わせを求める
今回の多重共線性が発生しているとする基準は相関係数が0.8より大きい要素の組み合わせとする。
```Python
# for文で実行した相関係数の値を格納するために宣言
corr_list = []

# for文開始を2行目から始めたい為、変数に1を渡し、後に配列番号として利用する。
# 2行目から開始したい理由としては同じ要素同士の相関係数は1になり、計算にリソースを取られた
# くないことに加えてfor文の中で1ずつ加算することによって必要のない計算はスキップできる。
ind_st = 1

# カラムでfor文を回す。最後の列は計算に含めたくなため、:-1で指定している
for col in train_corr.columns[:-1]:

    # カラムfor文の中でインデックスfor文を回すことで1列毎に対して指定した分の行を回すことができる
    for ind in train_corr.index[ind_st:]:
        # [col][ind]で列と行の相関係数を見ることで相関係数をtmpに渡す
        tmp = train_corr[col][ind]
        
        if tmp > 0.8:
            print(tmp)
            
            #appendの際に(())で二重括弧にしているのはタプル形式で変数に追加するため。
            corr_list.append((col, ind, tmp))
            
    #次の周回の時に一つ下の行で処理を行うために、1加算する
    ind_st += 1
    

```

実行結果
```
0.8256674841743408
0.8195299750050339
0.8254893743088425
0.882475414281462
```

これだけではどの組み合わせかわからないので、for文の中のif文で定義づけた、相関係数が0.8より大き要素名と、相関係数を渡した変数corr_listを呼び出す
```
corr_list
```
実行結果
```
[('YearBuilt', 'GarageYrBlt', 0.8256674841743408),
 ('TotalBsmtSF', '1stFlrSF', 0.8195299750050339),
 ('GrLivArea', 'TotRmsAbvGrd', 0.8254893743088425),
 ('GarageCars', 'GarageArea', 0.882475414281462)]
 ```
 カラム名, インデックス名, 相関係数といった形がタプルとして保管されている。  

## ハマったところ
今回個人的にハマってわからなかった場所としては列x行総当たりのような処理。
```Python
for col in df.columns:
    for ind in df.index:
```
こういった書き方で1列に全行という処理ができることを学習した。
今後も使うことがあると思うのでメモ
【Flutter】スネークケースのAPIレスポンスをキャメルケースで管理する

# はじめに
こんにちは。Flutter開発2年目のエンジニアです。
とある開発で、APIレスポンスを受け取った時に、返却されているはずのデータがNullで通過する減少に陥りました。
これの対策方法についてご紹介します。

# 原因
結論、json形式のAPIレスポンスのkeyがスネークケースなのに対して、Flutter側のモデルのパラメータがキャメルケースだったことでNullとなって通過していました。

# 対策
モデルのパラメータを修正していかないといけないと思ったのですが、調べたらありました。

### パッケージのインストール

https://pub.dev/packages/json_serializable

### build.yamlファイルを作成

プロジェクトのルートディレクトリにbuild.yamlファイルを作成

### field_renameの設定

```build.yaml
targets:
  $default:
    builders:
      json_serializable:
        options:
          field_rename: snake
```

### .gファイルの更新

以下コマンドを叩いて、.gファイルを更新

```
flutter pub run build_runner build --delete-conflicting-outputs
```

上記手順で、.gファイルのパラメータ名がスネークケースに変換されたと思います！


# 最後に

以上、他のオプションも用意されているみたいなので、色々試してみると便利かもしれません。

https://zenn.dev/yamatatsu10969/articles/c4a5f05cc38806
GitLab RunnerでQEMUを使ってクロスコンパイルする際のエラー対策

# はじめに
* GitLab RunnerでQEMUを使った際にエラーが出たのでその対策のメモ

# 環境
* GitLab Runner
* QEMU (qemu-user-static)

# 解決したい問題

* GitLab Runner上で、QEMUを使ってクロスコンパイルする際に、sh:write errorが出て、CIが止まってしまう問題

https://github.com/multiarch/qemu-user-static/issues/118 

# 解決策

Dockerビルドの例
```yaml

docker-build:
  stage: build
  before_script:
    - QEMU_COMMAND="docker run --rm --privileged multiarch/qemu-user-static --reset -p yes"
    - until ${QEMU_COMMAND};do sleep 1;done
  script:
    - docker buildx build .
```

* ポイント
  * before_scriptで、qemu-user-staticの実行コマンド「```docker run --rm xxx```」を成功するまで繰り返す。

# まとめ

qemu-user-staticの実行コマンド「```docker run --rm xxx```」を成功するまで繰り返すことで、エラーを回避できた。

# 参考

https://orebibou.com/ja/home/201706/20170617_001/
Djangoのテンプレートでデバッグモードを判定する


Djangoのテンプレートすべてのページから、`{% if DEBUG %}` を用いてデバッグモードを判定できるようにする方法を紹介します。`context_processors` を用いることで行います。

:::note warn

※ これは2019/7/23に[個人ブログ](https://bicstone.me)で公開した記事を移植し、[CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.ja)で提供しています。情報は古い可能性があります。

:::

## ビューでデバッグモードを判定する方法

Djangoのビューでデバッグモードを判定する方法として下記があります。

```py
from django.conf import settings
DEBUG = settings.DEBUG
print(DEBUG)  # True
```

いちいちこの変数をテンプレートに渡すのは面倒なので、`context_processors` を用いて `DEBUG` 変数を定義してみます。

## `django.template.context_processors.debug` は微妙

似たような機能として、標準でも `django.template.context_processors.debug` が存在します。

https://docs.djangoproject.com/ja/2.2/ref/templates/api/#django.template.context_processors.debug

しかし、この機能は `INTERNAL_IPS` を適切に設定していないと機能しません。

https://docs.djangoproject.com/ja/2.2/ref/settings/#internal-ips

Dockerなどを用いると、ローカル開発環境でさえも様々なIPからアクセスされるのでなかなか使いにくいです。

## context_processors を用いた DEBUG 変数定義

そこで、`INTERNAL_IPS` を気にせずsettings.pyのDEBUGを問答無用でテンプレートから呼び出せるcontext_processorsを作ってみます。

app/context_processors.pyに次のプログラムを追加します。

```py
from django.conf import settings

def is_debug(request):
    return {"DEBUG": settings.DEBUG}
```

そして、setting.pyの `TEMPLATES['OPTIONS']['context_processors']` に今回追加したcontext_processorsを追加します。

```py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',  # ←消して良い
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'app.context_processors.is_debug',  # 追加
            ],
        },
    },
]
```

以上で、`{% if DEBUG %}` が利用できます。
Connpassで説明欄に画像を添付するには

# はじめに
Connpassでイベントを作る際、画像をどのように表示するのかわからず、
時間がかかったため、備忘録代わりとして記述する。

# 結論
Connpassの説明欄はマークダウン形式なので、画像を保存した元のURLをHTML形式、もしくはMarkdown形式で表示させれば良い。

## HTML形式
<img alt="いらすとや 生ドーナツ" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD0uj85RCDDCNQip8uPrjeaDIjSaSsnJ5J_d3m1f9YQTDIISmPthp4jii7LJd_Rrn9aiG3undaoPqE7iQppq4gZ7x9ZSsTSJGw18PTwgYIasc3EEzYbT_Xwq6L1jkTuUGILWQ_-0i1oQ3PQkQ2kQC9twmn9Cnkzvpaq3s260teI9zj8ZIo8fKkhKZTL-gg/s400/sweets_nama_donuts.png" width="55">  

```
<img alt="いらすとや 生ドーナツ" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD0uj85RCDDCNQip8uPrjeaDIjSaSsnJ5J_d3m1f9YQTDIISmPthp4jii7LJd_Rrn9aiG3undaoPqE7iQppq4gZ7x9ZSsTSJGw18PTwgYIasc3EEzYbT_Xwq6L1jkTuUGILWQ_-0i1oQ3PQkQ2kQC9twmn9Cnkzvpaq3s260teI9zj8ZIo8fKkhKZTL-gg/s400/sweets_nama_donuts.png" width="55">  
```
### Markdown形式

![いらすとや生ドーナツ](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD0uj85RCDDCNQip8uPrjeaDIjSaSsnJ5J_d3m1f9YQTDIISmPthp4jii7LJd_Rrn9aiG3undaoPqE7iQppq4gZ7x9ZSsTSJGw18PTwgYIasc3EEzYbT_Xwq6L1jkTuUGILWQ_-0i1oQ3PQkQ2kQC9twmn9Cnkzvpaq3s260teI9zj8ZIo8fKkhKZTL-gg/s400/sweets_nama_donuts.png)

```
![いらすとや生ドーナツ](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD0uj85RCDDCNQip8uPrjeaDIjSaSsnJ5J_d3m1f9YQTDIISmPthp4jii7LJd_Rrn9aiG3undaoPqE7iQppq4gZ7x9ZSsTSJGw18PTwgYIasc3EEzYbT_Xwq6L1jkTuUGILWQ_-0i1oQ3PQkQ2kQC9twmn9Cnkzvpaq3s260teI9zj8ZIo8fKkhKZTL-gg/s400/sweets_nama_donuts.png)
```

# そもそも論（いつか調べること）
MarkdownをWebページで表示する場合、どのような処理がなされているか簡単に調べる。
また、画像の取得を外部サーバーに行う等の知識があればこんなにはつまづかなかったように思う。

Qiitaでは別で画像サーバーを立てて、エディタに画像アップロードの機能を搭載しているんではないかな。
Connpassにはそれがないために「よくわからない」が発生したのだと思う。

# 補足
画像を自分でアップロードする場合、AWS S3 もしくは imgur と言うサービスを使うことが望ましい模様。
AWS S3は無料利用枠が12ヶ月分しかなかったので、どのようにするかは微妙。

ちなみにTwitterに挙げた画像もそのまま表示できる。
特にこだわりがなければ、Twitterからの画像をそのまま表示するのも良いだろう。
<img alt="ツイッターからの画像" src="https://pbs.twimg.com/media/F4dU0GQbwAAByq3?format=jpg&name=large" width="55">  

# 参考資料
https://qiita.com/nekoniki/items/90885979896a166b712b  

https://qiita.com/tatsuya1970/items/1d1ad8fe4c67b88282c6

# 雑記
今までは編集履歴を律儀につけていたが、Qiitaの機能で編集履歴が基本的にはついている模様。今後つけなくて良いかも。
Djangoでログイン必須サイトにする方法


Djangoですべてのページにおいてログインをしていなければログインページにリダイレクトする方法を紹介します。

:::note warn

※ これは2019/7/19に[個人ブログ](https://bicstone.me)で公開した記事を移植し、[CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.ja)で提供しています。情報は古い可能性があります。

:::

## 標準ではデコレータを使用する

公式ドキュメントによれば、ビュー層のデコレーターを使用すれば実装が可能です。

https://docs.djangoproject.com/ja/2.2/topics/auth/default/#the-login-required-decorator

```py
from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    # ...
```

しかし、これをすべてのビューに実装するのは手間ですし、1ページでも実装を忘れてしまったら大変なことになります。

## ミドルウェアの追加

下記を参考に、ミドルウェア(プラグインのようなもの)を追加し、対処します。リクエストを受けた段階でログイン済みか判定し、ログインしていなければリダイレクトするミドルウェアを追加します。

https://docs.djangoproject.com/ja/2.2/topics/http/middleware/

例えば `/app/middleware/auth.py` にミドルウェアのPythonファイルを作成します。リダイレクトループを防ぐため、ログインのURL`/login/` にアクセスされた場合はログインしていない場合もリダイレクトしません。

```py
from django.http import HttpResponseRedirect
from django.utils.deprecation import MiddlewareMixin

class authMiddleware(MiddlewareMixin):
    def process_response(self, request, response):
        if not request.user.is_authenticated and request.path != '/login/':
            return HttpResponseRedirect('/login/')
        return response
```

## setting.py を編集

`setting.py` の `MIDDLEWARE` 変数に今回追加したミドルウェアを追加します。

```py
MIDDLEWARE = [
    'app.middleware.auth.authMiddleware',
]
```

## 動作の様子

ログインしていなければ次のとおりログイン画面にリダイレクトされます。

![HTTP レスポンスヘッダーに `/login/` へのリダイレクトが含まれている](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/452d29cf-bb0e-2fd8-0c5e-9a7b083ce16e.png)
さわって理解するDocker入門 failed to solve: process

備忘録。
エラーのトラブルシューティングを並べました。

これをやりました。
https://www.ogis-ri.co.jp/otc/hiroba/technical/docker/part1.html

1. ERROR: failed to solve: process "/bin/sh -c apk add --update py2-pip" did not complete successfully: exit code: 1
    1.現行のpythonはversion3なので、dockerfileを以下に変更する
    ```
    # our base image
    FROM alpine:3.5

    # Install python and pip
    RUN apk add --update py3-pip

    # upgrade pip
    RUN pip install --upgrade pip

    # install Python modules needed by the Python app
    COPY requirements.txt /usr/src/app/
    RUN pip install --no-cache-dir -r /usr/src/app/requirements.txt

    # copy files required for the app to run
    COPY app.py /usr/src/app/
    COPY templates/index.html /usr/src/app/templates/

    # tell the port number the container should expose
    EXPOSE 5000

    # run the application
    CMD ["python", "/usr/src/app/app.py"]

    ```
1. ERROR: failed to solve: alpine:3.5: no match for platform in manifest sha256:66952b313e51c3bd1987d7c4ddf5dba9bc0fb6e524eed2448fa660246b3e76ec: not found
    1. バージョン互換が切れてるっぽいのでバージョンをlatestに変更する
    ```
    # our base image
    FROM alpine:latest

    # Install python and pip
    RUN apk add --update py3-pip

    # upgrade pip
    RUN pip install --upgrade pip

    # install Python modules needed by the Python app
    COPY requirements.txt /usr/src/app/
    RUN pip install --no-cache-dir -r /usr/src/app/requirements.txt

    # copy files required for the app to run
    COPY app.py /usr/src/app/
    COPY templates/index.html /usr/src/app/templates/

    # tell the port number the container should expose
    EXPOSE 5000

    # run the application
    CMD ["python", "/usr/src/app/app.py"]

    ```
これで正常に動いてるっぽい。
Djangoで全ページキャッシュ禁止にする方法


WSGIサーバで動作させているDjangoのWebサイトで、全ページにHTTPヘッダーを付加し、キャッシュ禁止にする方法を紹介します。

:::note warn

※ これは2019/7/17に[個人ブログ](https://bicstone.me)で公開した記事を移植し、[CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.ja)で提供しています。情報は古い可能性があります。

:::

## キャッシュ禁止にしたい

WSGIサーバで動作させているDjango2.2のWebサイトにおいて、全ページにキャッシュ禁止のHTTPヘッダーを付加し、キャッシュ禁止にしたいときがありました。

下記を参考に、ミドルウェア(プラグインのようなもの)を追加し、対処します。

https://docs.djangoproject.com/ja/2.2/topics/http/middleware/

## ミドルウェアの追加

モダンブラウザであれば、`Cache-Control` ヘッダーのみで十分なキャッシュ制御ができます。

https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Cache-Control

`Cache-Control` ヘッダーを追加するために、例えば `/app/middleware/nocache.py` にミドルウェアのPythonファイルを作成します。

```py
from django.conf import settings
from django.utils.deprecation import MiddlewareMixin

class noCacheMiddleware(MiddlewareMixin):
    def process_response(self, request, response):
        response['Cache-Control'] = 'private, no-store, no-cache, must-revalidate, no-transform'
        return response
```

## setting.py を編集

`setting.py` の `MIDDLEWARE` 変数に今回追加したミドルウェアを追加します。

```py
MIDDLEWARE = [
    'app.middleware.nocache.noCacheMiddleware',
]
```

## 動作の様子

Djangoレスポンスの例(developモードON)

![HTTP レスポンスヘッダに Cache-Control が追加された](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/ae5ffbcd-46bc-fd10-ee5a-4ad4748a597f.png)
【Salesforce】簡易版勤怠管理システムを作ってみる①

Saleforceの標準機能を使って簡単な勤怠管理を行います。
![minilibx_start.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3255462/660c316f-f34d-9192-a3d0-8c09f4ca4d1f.gif)

## 1.カスタムオブジェクトの作成
"勤怠管理"という名前のカスタムオブジェクトを作成します。
"レポートを許可"にチェックします。
"検索を許可"にチェックします。
"カスタムオブジェクトの保存後、新規カスタムタブウィザードを起動する"にチェックをして"保存"してください。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3255462/1c040232-3d52-028b-fec9-303ddba4b6a4.png)

## 2.カスタム項目の作成
"勤怠管理オブジェクト"に次の項目を作成します。
･出勤時間 : StartTime__c、日付/時間型
･退勤時間 : EndTime__c、日付/時間型
･休憩時間(h) : RestHours__c、数値型
　　　　　　 デフォルト値 : 1、文字数 : 2、小数点の位置 : 2
･労働時間(h) : WorkingHours__c、数式型(戻り値 : 数値、小数点の位置 : 2)
　　　　　　 数式 : (EndTime__c - StartTime__c) * 24 - RestHours__c
･従業員 : Employee__c、参照関係型(関連先 : ユーザーオブジェクト)
･ステータス : Status__c、選択リスト型
　　　　　　 値 : 出社、リモートワーク、有給(承認前)、有給休暇
･コメント : Comment__c、テキストエリア型

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3255462/2896dbcc-92ab-542e-cf9e-712801d08ec6.png)

## 3.ページレイアウトの修正
勤怠管理レイアウトの項目の配置を修正します。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3255462/9ef67865-4cf3-68f3-af36-c2bd14d0c20a.png)

## 4.リストの作成
"検索条件"を使って月別や従業員別のリストビューを作成します。
"表示する項目を選択"から次の項目を選択してください。
勤怠管理名、従業員、出勤時間、退勤時間、休憩時間(h)、労働時間(h)、ステータス、コメント

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3255462/86b888bd-ba8d-6635-6788-4d954b8e3e93.png)

## 完成
簡単ですが標準機能だけで従業員の勤怠を管理するシステムができました。
次回は、フローを使って"出勤"ボタンと"退勤"ボタンを実装します。
[簡易版勤怠管理システムを作ってみる②](https://qiita.com/yickey/items/22b1e4ce5a0719c68aba)
Djangoテンプレートで使えるコメントアウトメモ

# 1.はじめに
 djangoアプリの開発中にコメントアウトで引っかかって手間取ったのでまとめます.
 
# 2.ブラウザ側で無効になるコメントアウト

htmlやjsのコメントアウトがこれに当たります.このコメントアウトはブラウザの検証機能から見えるので残すときには注意が必要です.
```
<html>
    <body>
        <!--コメントアウト-->
    </body>
    <script>
        //　コメントアウト

        /* コメントアウト */
    </script>
</html>
```

# 3.テンプレートエンジン側で無効になるコメントアウト
Djangoのテンプレートタグなどを使ってもコメントアウトすることができます.こちらはテンプレートエンジンで無効になるのでブラウザの検証機能から見えるhtmlやjsのソース内から見ることができません.

```
<html>
    <body>
        {% comment %} コメントアウト {% endcomment %}
        {{# コメントアウト #}}
    </body>
</html>
```

# 4.引っかかったポイント
Djangoアプリでは,テンプレートエンジンで処理　→　ブラウザでレンダリングの順番で処理が走ります.


つまり,以下のようなコメントアウトの場合は想定する結果となりません.
```
<html>
    <body>
        <!-- {% if not "param" == "param" %} -->
            <div>
                せいじょうにひょうじされた
            <div>
        <!-- {% endif %} -->
    </body>
</html>
```
この場合テンプレートエンジンで"param","param"の比較文がまず動いて,そのあとにブラウザでのレンダリング処理が走るので実際には以下のようなhtmlが読み込まれます.

```
<html>
    <body>
        <!--  -->
            <div>
                せいじょうにひょうじされた
            <div>
        <!--  -->
    </body>
</html>
```

djangoタグによるコメントアウトを使えば正常に読み込まれます.
```
<html>
    <body>
        {% comment %} {% if not "param" == "param" %} {% endcomment %}
            <div>
                せいじょうにひょうじされた
            <div>
        {% comment %} {% endif %} {% endcomment %}
    </body>
</html>
```

上記がブラウザでレンダリングされる際にはテンプレートエンジンでコメント文が無効になるので以下のように読み込まれます.

```
<html>
    <body>
            <div>
                せいじょうにひょうじされた
            <div>
    </body>
</html>
```


# 5. おわりに
　わりと初歩的なことだとは思いますが,数百行以上のhtmlファイルで上記のミスをしてしまうと探すのに苦労します.htmlのコメントアウトとかを使ってブロック単位でまとめてコメントアウトする癖がある方は注意してください！（実体験