OmniAICreator/Qiita-1.07M huggingface dataset:
三菱電機のタッチパネルGOT2000のいろいろ


###　表面のUSB
三菱電機のHMI(タッチパネル)GOT2000シリーズは表面にUSB接続口があり、制御盤を開けなくてもPLCとつながる。

![62fd11652fb6925cc256314f36b164a5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141264/2c6231c2-6a13-f5d7-828f-395213e177f3.png)

GXworksの接続先指定で
シーケンサ側I/Fを「GOT」
「GOTトランスペアレント機能を利用する」
「Ethernet内蔵型CPU-192.168.3.39」
とする。このIPアドレスはQやRのCPUを買ったときの初期IPアドレス。
この状態で保存しておけばタッチパネルから通信できます。GT Designer側は特別な設定不要。

### GT Designerの表示オプション
初期状態だと使いにくい点がいくつかある(画面につぶつぶが出たり、16ドットずつ動く。)
ツール→オプションから設定することをお勧めします。
https://i.gyazo.com/a2edf7f49e4f1c21dbeb44f5e81bec56.png

### SoftGOTはライセンス買わなくても便利
PCにGOTの画面を映しクリックで操作するソフト。
https://www.mitsubishielectric.co.jp/fa/download/software/detailsearch.page?mode=software&kisyu=/got&shiryoid=0000000155
ライセンスがないと連続3時間制限があるが、逆にいうと3時間以内なら好きに使える。
立ち上げ時前の動作チェックや、設備のメンテナンスに使おう。

PLCのIPアドレスと通信できるかpingで確認する(USB接続でもいい。)

GT Designer側の設定
・機種設定でSoftGOTを選択、解像度を設置予定の機種に合わせる。
・接続機器設定でPLCの型式とIPアドレスが入力されていることを確認。NET.Noが1、局番が1を確認

SoftGotの設定
・通信設定でNET Noが1で同一、PC No(局番)が1以外を確認。

GTXファイルをSoftGOT2000のショートカットにドラッグドロップ

詳しくはこちら。
https://www.mitsubishielectric.co.jp/dl/fa/members/document/manual/got/sh081193/sh081193aq.pdf

### 実機ならワイドタイプを選ぶ
GT2512-WXTBD
GT2510-WXTBD
GT2107-WTBD
この3機種が圧倒的にコスパがいい。ほかは買わない。

### ブザーが鳴らせる
![タッチパネルのブザー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141264/ad1151a2-24ad-d8b8-bd4c-4d8b5d4c333d.jpeg)
b0 自動スクリーンセーブ無効信号
b1 強制スクリーンセーブ信号
b2 強制スクリーンセーブタッチ解除信号
b3 入力キー読み出し完了信号
b4 数値入力読み出し完了信号
b5 バーコード入力無効信号(CH8)
b6 外部機器入力完了信号(CH8)
b7 使用禁止
b8 ブザースリーショット出力信号
b9 キー入力禁止信号
b10 ハードコピー設定有効信号
b11 使用禁止
b12 ハードコピー白黒反転信号
b13 GOTエラーリセット信号
b14 ブザー出力信号
b15 ブザーワンショット出力信号

b0 スクリーンセーブ中
b1 GOT準備完了
b2 使用禁止
b3 キー入力信号
b4 数値入力信号
b5 人感センサ検出60秒間
b6 外部機器入出力信号(CH8)
b7 ハードコピー機能の印字中
b8 レポート機能の印字中
b9 - 使用禁止
b10 レシピ処理中
b11 キーウィンドウ表示中。
b12 ハードコピー補助信号
b13 GOTエラー検出信号
b14 数値入力値エラー検出信号
b15 プリンタエラー検出信号
キュービクル進相コンデンサ容量の選定

電気技術者協会では「変圧器容量の１／３位にする場合が多いようです。」と記載があるが
近年の実情に合わない場合が多い。
https://jeea.or.jp/course/contents/06201/

30年ほど前、産業で使う負荷の大半は誘導モーター。
誘導モーターの力率の負荷特性は無負荷で70％、定格負荷で90％程度)
85％→96％への力率改善は負荷の33％コンデンサが必要。

同期機は力率が調整できるため大抵は100％近くで運用している。
サーボモーターやインバーターの採用が多いほど元から力率が良い。
元から92％くらいのことが多い。
92％→96％の力率改善は負荷の17%コンデンサが必要。

改善前遅れ位相θ　改善後遅れ位相φとすると
必要なコンデンサ容量は
$$有効電力×(\tanθ-\tanφ)$$

力率=cosθ　で表記すると

$$有効電力×(\sqrt{\frac{1}{\cos^{2}θ}-1} - \sqrt{\frac{1}{\cos^{2}φ}-1})$$
さくらVPS yum update できない Out of memory

# さくらVPS yum updateできない Out of memory
さくらVPSをレンタルしたので、ssh通信をして、yum updateをすると、ログアウトさせられました。
ログを確認すると以下のようにメモリ不足でyumがkillされていました。

```
Out of memory: Killed process 
```

## 試したこと

### 1. ディスクの使用状況確認
vpsレンタルして、sshの設定をしただけなので、使用状況等の問題は無いだろうと思いつつ、確認して問題はありませんでした。
```
df -h
```

### 2. Yumキャッシュのクリア
キャッシュ消えたことは確認できたが、yum updateは失敗した
```
yum clean all
```

### 3. メモリの使用状況確認
たぶん、これ一番最初にするべきだった。Swap領域が登録されていないことがわかった。
```
free -h

       total        used        free      shared  buff/cache   available
Mem:           457Mi       158Mi       254Mi        10Mi        77Mi       299Mi
Swap:             0B          0B          0B
```

## 解決方法
### 4. スワップ領域の追加
```
sudo dd if=/dev/zero of=/swapfile count=2048 bs=1MiB
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

#Swapファイルの永続化
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
```

4.のスワップ領域を追加後に、yum updateできました。VPS借りてすぐにupdateできないということに遭遇したことなかったので、自分への備忘録として、残しておきます。

▽サーバースペック
CPU	仮想1Core
メモリ 512MB
SSD	50GB
OS CentOS Stream 9 x86_64
アナログ防犯カメラの規格

同じBNCコネクタを使っていても規格が複数ある。

## アナログ
市販品はネットワークカメラが主流になってきているが、
店舗や工場内で使う場合は費用の都合上アナログにすることが多い。1個3000円～いろいろある。

### CVBS : Composite Video, Blanking, and Sync
2011年まで使われていた地上アナログ放送と同じ規格。単にアナログのカメラと言うとこれを指すことが多い。
フレームレートが2種類あるので中国製を買うと合わないことがある。注意。
PAL:25fps(ヨーロッパ、中国、オーストラリアなど)
NTSC:30fps(北米、日本など)
BNC-RCA変換コネクタを買えば、コンポジット端子の黄色に刺して見れる。
https://www.monotaro.com/g/01144842/
BNCP-RCAP
安い。ただしいわゆるアナログ画質。

- 下3つの規格はアナログで高画質化を目指して生まれたもの。
これらは対応するモニターは少なく、大抵コンバータやレコーダーが別途置かれている。
### AHD
普及してる。割と対応モニターもある。

### (HD)CVI
2012年に韓国のDahuaが出した規格。
高画質でコスパも良いがあんまり見ない。

### (HD-)TVI
2012年に米国のTechpointが出した規格
高画質で伝送距離も長い。やや割高。あんまり見ない。

## デジタル
カメラが3万円くらいからと高価。
### HD-SDI
衛星放送と同じハイビジョンデジタル信号規格。
ノイズ対策必須、ケーブルにシールドがついた5C-FBが指定されている。
外径が8mmくらいあって天井裏施工が面倒。
伝送が100mまで。

### EX-SDI
韓国のENYNIXが出した規格。
HD-SDIの画質そのまま、伝送を改良しており500mまで届く。

### HDMI
どうしてもプロジェクタで見たいときに使う。
書画カメラという名前でわずかに出てる。
HDMIパススルー機能付きのデジカメ/ハンディカムを買った方がいいかも。
https://www.ampita.net/2020/09/12/hdmi_pass_through_item/
AWS FastAPI+Lmabda+APIgateway+DynamoDBで簡単にTODOアプリのBackendを構築した話①

# AWS FastAPI+Lmabda+APIgateway+DynamoDBで簡単にTODOアプリのBackendを構築した話

### 自己紹介
- 22卒でエンジニアになり、社会人1年目を終わり、来月からの住民税に怯えているヒト
- 業務では、VB.NET、Terraformを少し触った
- 趣味は、バレーボールと個人開発（自己満足の低レベル）
- 資格（AWS SAA SOA DVA CLF、高校教員免許）
- 好きな言語・興味ある言語：Python、Typescript、Terraform

### 目的
- AWS Summit2023でpaypayがserverlessで運用していることを知り、serverlessに興味を持った
- serverless framewarkを使って、なるはやで、TODOアプリのbackendを作成する

### 注意
- 本記事の内容は、ChatGPT（GPT-4）を全力で使って、作成したものです

### 環境
```
Windows10
VSCode
AWS
Docker（デプロイ時にDocker Desktopを起動しておく必要がある）

serverless frameworkバージョン
serverless -v
Running "serverless" from node_modules
Framework Core: 3.31.0 (local) 3.31.0 (global)
Plugin: 6.2.3
SDK: 4.3.2 
```

### フォルダ構成
root/
　├ src/
　│　├ __init__.py　空っぽ
　│　├ database.py　boto3でDynamoDBとの接続を行う
　│　├ main.py　　　FastAPIの機能の中身
　│　└ models.py　　Modelの定義
　├ .gitignore
　├ requirements.txt
　└ serverless.yml


### requirements.txt
- FastAPIを使う理由
    - 興味があった（←これが一番の理由）
    - APIgatewayの設定が手間
- LambdaでFastAPIを使うために
    - Mangumというのを使う
    - 詳しくは、ChatGPTに聞いてください
```
fastapi==0.68.1
mangum==0.12.1
pydantic==1.8.2
boto3==1.18.45
uvicorn==0.15
```

#### serverless.yml
- serverless frameworkは、serverless.ymlの内容に沿って、AWSのリソースを作成する
```
service: todo-app

provider:
  name: aws
  runtime: python3.8
  region: ap-northeast-1
  stage: ${opt:stage, 'dev'}
  environment:
    TABLE_NAME: todos

functions:
  app:
    handler: src.main.handler
    events:
      - http:
          path: /
          method: ANY
          cors: true
      - http:
          path: /{proxy+}
          method: ANY
          cors: true

resources:
  Resources:
    TodosDynamoDbTable:
      Type: "AWS::DynamoDB::Table"
      Properties:
        AttributeDefinitions:
          - AttributeName: name
            AttributeType: S
        KeySchema:
          - AttributeName: name
            KeyType: HASH
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1
        TableName: ${self:provider.environment.TABLE_NAME}

plugins:
  - serverless-python-requirements

custom:
  pythonRequirements:
    dockerizePip: non-linux
```

## 続く。。。
https://qiita.com/Kazu758/items/fcb939bc0ef6d67cdcb6
絶対に画像をダウンロード&スクレイピングさせないWebページを突破してみる


ちょっと面白そうだったので[絶対に画像をダウンロード&スクレイピングさせないWebページを本気で作ってみた](https://blog.potproject.net/2023/05/26/never-scrape-image)を突破してみようと思う。

# 方法
方法としては下記の3つくらいが簡単そうだけど、いちばん簡単な1つ目でやってみます。
1. HTML,JS,JSONをDLしてHTML書き換え、ダウンローダとして使う
1. Chrome Extensionを書く
1. Puppeteerなどを使う

とりあえず、仕組みは書かれているので下記でcanvasのtextを無効化 + DL用のボタンを追加します。
```html
    <button id="dl">Download</button>
    <script>
        const canvas = document.getElementById('canvas');
        const ctx = canvas.getContext('2d');
        // ctxのfillTextをなにもしない関数に置き換える
        ctx.__proto__.fillText = () => { };
        // png画像として保存するためのボタンのアクション
        document.getElementById('dl').addEventListener('click', () => {
            const a = document.createElement('a');
            a.href = canvas.toDataURL();
            a.download = 'image.png';
            a.click();
        });
    </script>
```

あとは画面を表示します。そうするとこれが
![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122922/53d93583-d579-a713-fd43-bfa9d3c7a109.png)

こうなる
![after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122922/6c50dfcd-6ac6-b7cf-817e-b7a7f6cac299.png)

あとはDownloadボタンを押せばめでたくコピーライト抜きのpngがDLできます。

# まとめ
HTMLに表示しているデータを守るのはかなり厳しいのではないかと思います。
ただ、今回の例だと画像に直接コピーライト書いちゃえば良さそうではある。
クラウド型生産管理システムについて

# はじめに
毎週1本様々な技術に関する記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiixta.com/7_inai_)

# 生産管理システムとは
生産管理システムは、`製造業界における生産プロセスの効率化と管理を支援するためのシステム`です。生産計画、生産実行、品質管理、在庫管理、サプライチェーン管理など、製造業のさまざまな側面を統合的に管理します。
クラウドベースの生産管理システムは、`インターネットを介してリモートでアクセスできるクラウド環境で提供されるため、柔軟性とスケーラビリティに優れています。`

# 生産管理システムに含まれる機能
クラウドベースの生産管理システムには、以下のような機能が含まれています。
- 生産計画管理
生産計画の作成と管理、生産スケジュールの調整、需要予測などを支援
- 生産実行管理
生産ラインや工程の監視、生産作業のスケジューリング、生産進捗の追跡、品質管理などをサポート
- 在庫管理
在庫の管理と追跡、在庫レベルの最適化、在庫補充の計画、在庫のロケーション管理などを行う
- 品質管理
品質検査や品質管理プロセスの管理、不良品のトレーサビリティ、品質データの分析などを行う
- サプライチェーン管理
サプライチェーン全体の可視化と管理、サプライヤーとの連携、調達プロセスの最適化、ロジスティクス管理などをサポート

# システム例
クラウドベースの生産管理システムの例をいくつか紹介します。
- SAP S/4HANA Manufacturing Cloud
SAPが提供する生産管理ソリューションで、製造業向けの包括的な機能を提供
- Oracle Manufacturing Cloud
Oracleが提供するクラウドベースの生産管理プラットフォームで、生産計画から品質管理までを統合的に管理

# 終わりに
クラウドベースの生産管理システムは、製造業界において効率的な生産プロセスを確立し、競争力を高めるための重要なツールです。柔軟性、スケーラビリティ、リアルタイムなデータ共有と可視化などの特徴により、企業は生産計画の最適化、生産ラインの効率化、在庫管理の最適化などを実現できます。クラウドベースの生産管理システムの選択は、企業のニーズと要件に合わせて慎重に行う必要があります。

最後までお付き合いくださりありがとうございました。
MongoDBのデータをmongo_fdwを使用してPostgreSQLのテーブルにインポート

## 概要

PostgreSQLの拡張機能FDWを使用して、MongoDBのデータに連携することができる。mongo_fdwを使用し、外部のMongoDBのデータの一部をPostgreSQLのテーブルにインポートした。

https://github.com/EnterpriseDB/mongo_fdw


## 環境
* PostgreSQL 14
* CentOS9 Stream(docker)
* MongoDB server 4.4.6

## mongo_fdwの設定
githubのREADMEに従ってコンパイル、インストールする。
ソースコードは、git cloneで、/tmpフォルダに配置した。

### mongo-c/json-のインストール
以下のコマンドでビルドからインストールまで実行する。
```bash
autogen.sh --with-master
```

が、途中エラーで止まるたびに以下をインストールしていった。
```bash
dnf install wget
dnf install cmake
dnf install gcc
dnf install openssl
dnf install openssl-devel
dnf install rpm-build
dnf install ccache
```

### mongo_fdwのインストール
環境変数に設定を行ったのち、ビルド、インストールを実行する。
PKG_CONFIG_PATHは、/tmpフォルダ配下にコードをダウンロードして作業をしている前提で環境変数を設定。LD_LIBRARY_PATHは、libmongoc-1.0.soとlibbson-1.0.soのインストール先を設定した。

```bash
export PKG_CONFIG_PATH=/tmp/mongo_fdw/mongo-c-driver/src/libmongoc/src:/tmp/mongo_fdw/mongo-c-driver/src/libbson/src
export LD_LIBRARY_PATH=/lib64:$LD_LIBRARY_PATH
export PATH=/usr/pgsql-14/bin/:$PATH

make USE_PGXS=1
make USE_PGXS=1 install
```

上記実行して、またエラーになったので以下インストールしたのち再度make 
を実行した。
```bash
wget https://rpmfind.net/linux/centos-stream/9-stream/CRB/x86_64/os/Packages/perl-IPC-Run-20200505.0-6.el9.noarch.rpm
wget https://rpmfind.net/linux/centos-stream/9-stream/CRB/x86_64/os/Packages/perl-IO-Tty-1.16-4.el9.x86_64.rpm

rpm -ivh perl-IO-Tty-1.16-4.el9.x86_64.rpm
rpm -ivh perl-IPC-Run-20200505.0-6.el9.noarch.rpm

dnf install postgresql14-devel*
```

## MonogDB接続用の外部テーブルを作成

### 接続先のMonogoDBの接続情報

* 接続IP 192.168.11.4 
* ポート　27017
* データベース　webcam
* コレクション　webcam
* ユーザ/パスワード　webcam/webcam

### データフォーマット
MongoDBには、以下の形式のデータを追加している。
(ここではデータについては説明しないが、Webカメラ情報の一部、元ネタはhttps://api.windy.com/webcams)

```json-doc
{
    _id:string
    id:string;
    status: string;
    title:  string;
    location : {
        latitude: number;
        longitude: number;
    }
    player : {
        day:{
            available:string;
            link:string;
        }
    } 
    image : {
            current : {
            thumbnail:string;
        }
    };
};
```

### PostgreSQLからMongoDBとの接続
```bash
CREATE SERVER mongo_server FOREIGN DATA WRAPPER mongo_fdw OPTIONS (address '192.168.11.4', port '27017');

CREATE USER MAPPING FOR postgres SERVER mongo_server OPTIONS (username 'webcam', password 'webcam');
```

### 外部テーブルの作成
webcamという名前の外部テーブルを作成。カラムは、MongoDB側のデータの全部ではなく一部を定義。
```bash
CREATE FOREIGN TABLE webcam
	(
		_id name,
		id text,
		"player.day.link" text,
		"image.current.thumbnail" text
	)
	SERVER mongo_server
	OPTIONS (database 'webcam', collection 'webcam');
```
### データインポート先のテーブルを作成

PostgreSQLの実テーブルとして、サムネイル画像へのリンク"image.current.thumbnail"をインポートするテーブルを作成する。また、MongoDB側には存在しないが、独自のカラムを追加。

 ```bash
create table thumbnail_link(
	link varchar(100),
	download_flag integer default 0 );
```

### インポートの実行
INSERT INTO文でデータを登録する。
```bash
INSERT INTO thumbnail_link (link) SELECT "image.current.thumbnail" FROM webcam;
```
機械学習でなんとかしようと安易に考えてみよう

先に、[「機械学習でなんとかしようと安易に考えるな」](https://qiita.com/nonbiri15/items/cfc6909ff71273b63f5e)という記事を書いた。「機械学習だから、学習させればなんとかなるよね」という安易に考えすぎないことを述べた。機械学習でなんとかなるに違いないという安易すぎる考えで、不十分な品質のデータを収集する仕組みを作ってしまったり、機械学習が失敗したままになって改善が見込めないときに対するバックアッププランが用意できなくなってしまうことが恐れたための記事です。

しかし、この記事では、安易に考えてみようと主張します。


理由：
- やってみれば意外となんとかなることがある。
- やってみて失敗すれば、なにかしらの知見が得られる。
- 最初からうまくいくことはほとんどない。
- うまくいっている機械学習にしても、何度も学習データを追加するとか、学習条件を変更するとか、うまくいっていない状況から改善を繰り返すことで実現している。
- 経験することで得られる知見は、web記事で得られる知見よりも自分自身にひびくものである。
    - 口頭で説明してわかってもらうよりは、実際に実行してみた結果を示した方が伝わりやすいこともある。

ほとんどの技術開発は、うまくいくことの証拠が開発着手前にあることはない。こうやればうまくいくに違いないという開発者の信念（もしくは思い込み）があるにすぎない。うまくいくことの証拠が得られるのは、開発が進んだ後である。だから、機械学習でなんとかしようと安易に考えてみよう

成功する確率を上げたい人は、失敗事例の記事が世の中には大量に存在するので、読んでみるとよい。

失敗事例についての記事

[【ホワイトペーパー】なぜ上手くいかなかったのか 機械学習プロジェクトが失敗した5つの原因](
https://www.canon-its.co.jp/column/detail/datarobot_column_05.html)


[【具体例あり】AIプロジェクトの失敗する原因3つと失敗しないで進める方法！](https://toukei-lab.com/ai-project)

[機械学習のトレーニングに失敗したしくじり事例](https://webbigdata.jp/post-10734/)

[AI導入の失敗例と、成功のポイントとは？](https://www.matrixflow.net/case-study/28/)

[AI導入の失敗あるある、「PoC死」の罠とは？](https://business.aidemy.net/ai-can/news-17/)

[機械学習プロジェクトが失敗する9つの理由](https://tjo.hatenablog.com/entry/2018/08/03/080000)
ARC161回答メモ

0.はじめに
　ARCは難しいなと思いながら取り組んだら、意外とABでACをもらえて
　びっくりしました。
　ARC160も参加してたのですが記事を書けるまでの感触すらなく
　Qiita投稿もスルーしました・・・。
　C問題以降は、歯が立つ感じがしなかったので1時間ですっきり終わりました。

　コンテスト後レートが更新され、+34で過去最高の713を頂きました。

1.A - Make M
　解き方をいろいろ考えたのですが、最終的に以下の考え方で進めました。

　考え方
　　1.リストAを読み込み、大きい順に並べる。
　　2.大きい方からyc(=(N-1)//2)個を山候補として変数yamaに格納。
　　　(A[yc]以降は谷候補となり、理論上リスト先頭から埋めていき
　　　山候補を最後まで超えなければYesだめならNoとなる)
　　3.以下変数iを0からyc-1まで繰り返し
　　　3-1.yama[i]>A[yc+i] and yama[i]>A[yc+i+1]の時次のｉへ
　　　3-2.3-1を満たさない時は、山を形成できないので”No”を出力して終了
　　4.3で終了しなければ”Yes”を出力して終了

　点数的に考えてもビギナーのC問題と考えればまぁ納得の難易度でした。

　https://atcoder.jp/contests/arc161/submissions/41804987

2.B - Exactly Three Bits
　あまりBまで解けたことないのでちらっと見たら、意外と簡単そうだったので
　取り組んだら、すんなり解けました。

　考え方
　　1.Nを2進数にした時の１の数をカウントする関数
　　　bit_countを準備
　　以下T回繰り返し
　　2.Nを入力
　　3-1.Nが7より下の時、条件を満たせないので-1を出力
　　3-2.Nが7以上の時
　　　3-2-1.bit_count(N)=3の時、Nを出力して次の繰り返し
　　　3-2-2.bit_count(N)>3の時
　　　　3-2-2-1.Nを2進数に変換したのち、文字列として先頭から読んでいく
　　　　　3-2-2-1-1.先頭から3つ目までの1を活かしそれ以外は0とした2進数
　　　　　　　　　　　文字列ansを作成
　　　　　3-2-2-1-2.文字列ansを10進数で出力して次の繰り返し
　　　3-2-3.bit_count(N)<3の時
　　　　(最初は文字列操作で答えを求めようとしましたが、1の数が
　　　　　2以下になる数は稀であるので以下の方法に)
　　　　3-2-3-1.Nから1をマイナスし
　　　　　　　　 3-1.～3-2-2-1-2.と同様の処理を行う。
　　　　　　　　 Nから1マイナスした数も、bit_count(N)<3の時は
　　　　　　　　 さらに1マイナスを繰り返す

　https://atcoder.jp/contests/arc161/submissions/41809308


以上
Isarで`NoSuchMethodError: class QueryBuilder has no instance method 'findAll'.`が出るときは、importが不足しているかも

# 事象
Isarのドキュメントに従って以下のようなコードを書いていたら
`findAll()`の箇所で標題のNoSuchMethodErrorが出て、QueryBuilderにそんなメソッドはないと怒られた。

```dart
isar.users
  .where()
  .nameEqualTo('Taro')
  .findAll();  
```

たしかにコード補完でもfindAllは出てこず、公式のサンプルコード通りにやっているのになぜ？と混乱した

# 原因
上記クエリを記述しているファイル内でIsarをimportしていないのが原因だった。
ファイル構成としては以下のとおり。

- ファイルA(プロバイダ): Isarをopenしてインスタンスを共有 ※ここでIsarをimport
- ファイルB(リポジトリ): プロバイダからIsarのインスタンスを受け取って上記コードのように使用

ファイルBでもIsarをimportして解決した。

# 原因詳細
GitHubのIssueに同じ内容があったが、そこでもはっきりとは書かれていなかった。  
https://github.com/isar/isar/issues/1094
  

Dartのimportはファイルごとにスコープを持つから〜みたいなことが書かれていたが、
`isar.users.where().nameEqualTo('Taro')`まではチェーンできているので
本質的には、IsarのQueryBuilderクラスがQueryクラスを作る仕組みとかそのへんがいろいろ関係してるんだろう。
25000 Contributions! 感謝

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">25000 Contributions! | <a href="https://twitter.com/naokiakutagawa?ref_src=twsrc%5Etfw">@naokiakutagawa</a> <a href="https://t.co/cS2dIZCCK5">https://t.co/cS2dIZCCK5</a></p>&mdash; Qiitaマイルストーン (@qiita_milestone) <a href="https://twitter.com/qiita_milestone/status/1662619698045788164?ref_src=twsrc%5Etfw">May 28, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

6000投稿。25000Contributions.記念。

https://qiita.com/kaizen_nagoya/items/9872095dda2a36de0a2f


おかげさまで、6001投稿。です。　

投稿が完了して、25000Contributionsになりました。ありがとうございます。


![スクリーンショット 2023-05-28 9.20.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/9cf5b17e-c1ed-4bbf-ea1c-58a526d0797a.png)

なんでそんなに沢山記事を書くんですか？

https://qiita.com/kaizen_nagoya/items/e291196f9b692757f2cc

出力(output)と呼ばないで。これは状態(state)です。

https://qiita.com/kaizen_nagoya/items/80b8b5913b2748867840

凡人は天才、秀才と違うことをして生きていく

https://qiita.com/kaizen_nagoya/items/0502aebb7610fef584f5

# 小川メソッド

@kazuo_reve 私が効果を確認した「小川メソッド」

https://qiita.com/kazuo_reve/items/a3ea1d9171deeccc04da

「@kazuo_reve 私が効果を確認した「小川メソッド」」引用確認記事

https://qiita.com/kaizen_nagoya/items/233f81ebe9166ea44d09

小川メソッド　覚え（書きかけ）

https://qiita.com/kaizen_nagoya/items/3593d72eca551742df68

## DoCAP

試行錯誤の一種を、PDCA, CAPDoとかいう流派にからめて、DoCAPと銘打っただけ。　
試行錯誤ができない人が、PDCPとかCAPDoって言っているのに腹が立たなくなる。


DoCAP（ドゥーキャップ）って何ですか？

https://qiita.com/kaizen_nagoya/items/47e0e6509ab792c43327

DoCAP(Check Action Plan) 芸術でも技術でも運動でも

https://qiita.com/kaizen_nagoya/items/28321da8285a5884c7ca

# 参考資料　
views 20,000越え自己記事一覧

https://qiita.com/kaizen_nagoya/items/58e8bd6450957cdecd81

Views１万越え、もうすぐ１万記事一覧 最近いいねをいただいた213記事

https://qiita.com/kaizen_nagoya/items/d2b805717a92459ce853

を作ったら、viewsが4000未満の記事でも、内容がいいものがいろいろあることを思い出した。よい記事は、数学、物理、自動車、言語・文学、医工連携に存在している。そこで、それぞれの分野の「推し」をviewsにこだわらずに一覧にすることにした。

Qiitaに書いた記事で
数学。
物理。
自動車。　
言語・文学。
医工連携。
５つについて、それぞれ上位１００を一覧にする。

物理記事　上位100

https://qiita.com/kaizen_nagoya/items/66e90fe31fbe3facc6ff

数学関連記事１００

https://qiita.com/kaizen_nagoya/items/d8dadb49a6397e854c6d

自動車　記事　１００

https://qiita.com/kaizen_nagoya/items/f7f0b9ab36569ad409c5

言語・文学記事　１００

https://qiita.com/kaizen_nagoya/items/42d58d5ef7fb53c407d6




 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞


# 文書履歴(document history)
ver. 0.01初稿　　20230528

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
【Splatoon3】Power BIでナワバトラーの発火カタログを作ってみた

# はじめに

### 要約


Splatoon3のナワバトラーの発火表をPower BIでレポート化しました。

閲覧はPCのブラウザ推奨
Splatoon3のアップデート終了時期までは公開。


### 2024/05/30追記

**2024年夏 アップデート対応版(ガエンFFカスタムまで)。**


https://app.powerbi.com/view?r=eyJrIjoiYjQyY2FiMmQtNzRiMy00Mjg5LTg3ZWMtZTM4N2E3Njg2Njc4IiwidCI6IjdhNWU4NmVhLTY4NDItNGVhMy04YTdlLWViMGZhOWY4ZTMzYSJ9



### 本記事について

Splatoon3のナワバトラーの記事です。

以下の記事の続きですが、読むのは本記事のみで大丈夫です。

- [【Splatoon3】ナワバトラーのスペシャルマスの発火表を作る【part1 データ取得編】](https://qiita.com/gigi/items/1dcb7198b61ead2772a2)
- [【Splatoon3】ナワバトラーのスペシャルマスの発火表を作る【part2 壁編】](https://qiita.com/gigi/items/4ef836727d007c329eda)




# 背景

以前ナワバトラーのカード間の発火表を作成しました。
しかし、発火の組み合わせが膨大でスプレッドシートやエクセルでの可視化に限界があるという課題がありました。
そこで、発火表をPower BIでレポート化して可視化しやくしました。

# 目的
本記事では、作成したPowerBIレポートの**使い方**を共有します。


# そもそもPower BIとは


>Power BIはMicrosoftが提供するビジネスインテリジェンス（Business Intelligence, BI）ツールで、データの視覚化、分析、共有を可能にするソフトウェアです。
>
>主な機能は次のとおりです：
>
>1. データ集約： Power BIは様々なデータソース（例えば、Excelスプレッドシート、クラウドベースのサービス、ストリーミングデータ、オンプレミスデータベースなど）からデータを取り込み、それらを一つのビューに統合できます。
>
>2. データ変換： Power Queryを用いて、データを分析に適した形に変換することが可能です。また、DAX（Data Analysis Expressions）という式言語を用いて、より複雑なデータ操作を行うこともできます。
>
>3. データ視覚化： Power BIでは、取り込んだデータをグラフやチャートなどに視覚化することができます。これにより、データの傾向やパターンを一目で理解することが可能になります。
>
>4. レポートとダッシュボードの作成： Power BIでは、視覚化したデータをレポートとして作成し、それを組み合わせてダッシュボードを作ることができます。作成したレポートやダッシュボードは、他のユーザーと共有し、コラボレーションを行うことも可能です。
>
>以上の機能により、Power BIは非常に柔軟性と強力な分析能力を提供し、ユーザーがビジネスデータを深く理解するのに役立ちます。

以上、ChatGPTによる説明。


# レポートでできること


### ナワバトラーのカード一覧の確認


発火表を見ているときに「このカード何だっけ…」となることがありました。
そのため、カード情報をすぐ把握できるよう以下のようなカード一覧を作成しました。

![カード一覧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539787/e780efe4-f07d-cff3-650f-2ad508eeca6c.png)




お馴染みの分類指標である`レア度`、`マス数`、`必要SP`でフィルタやソートができます。
加えてカードの形状の分類指標として、`長軸`、`短軸`、`矩形面積`、`密度`、`穴`を採用しています。こちらでもフィルタやソートが可能です。

- 長軸：縦幅と横幅の**大きい方**のマス数。
- 短軸：縦幅と横幅の**小さい方**のマス数。
- 矩形面積(面積)：長軸×短軸
- 密度：マス数÷矩形面積
- 穴：マスで囲まれた空間があるか(True or False)

形状の分類指標は他にもあると思います。
アイデア募集中です。


### ナワバトラーの発火の組み合わせ・パターン一覧の確認


どのカードとの組み合わせでSPマスが発火するか/発火させるか、発火したときのカードの形状はどうなっているかを調べることができます。


![発火表.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539787/0d4fc2f1-0b63-af70-1998-4a9567bd472f.png)


# デモ

例えば、`スペースシューター`の発火関係を調べたい場合
<iframe width="896" height="520" src="https://www.youtube.com/embed/DEV2rPUXZg8" title="" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>


スペースシューターって縦横の壁含めてもジェットパックでしか発火しないんですね…。
ナワバトラーでも使いづらい…。

# 結果

PowerBIでナワバトラーの発火表のレポートを作成しました。
クリックポチポチで素早く検索できるため、スプレッドシートより使いやすくなったと思います。


使ってみての感想、質疑、アドバイス、クレームなどなど是非お聞かせください。



# 追記
シーズンごとに組み合わせが爆発的に増えるので対策を考えたいです。
Power BIで大容量データ扱う際のいい方法を模索中。
VBSではい、いいえの質問の後にEdgeでサイトに移動

```vb
Option Explicit
If MsgBox("＊＊＊＊＊", vbYesNo) = 6 Then
    ' ブラウザで開くURL
    Const URL = "https://www.yahoo.co.jp/"

    ' ShellApplicationオブジェクトの作成
    Dim objShell
    Set objShell = CreateObject("Shell.Application")

    ' Edgeの起動と指定したページを開く
    objShell.ShellExecute ("microsoft-edge:" & URL)

    ' ShellApplicationオブジェクトの破棄
    Set objShell = Nothing
Else
    MsgBox "確認してから再度お試しください"
End If
```
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614609/5fc02527-c45f-8e60-380f-52c71580595a.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614609/ffbef205-8eec-3c18-2cf7-f666f316a348.png)
SVNカルチャーからGitカルチャーにマインドチェンジを図るためのメモ（作成中）


# 前提

- 本記事は、SVNの利用経験はあり、Gitのコンセプトをなんとなく理解できているが、まだGitを使った経験がないエンジニア向けに書かれています。

- Gitを使いこなしているわけではないので、その点、割り引いて読んでいただけると幸いです。

# はじめに

- Gitは、SVN(Subversion)とは違い、分散型のバージョン管理システムのため、開発者は割り当てられたローカルリポジトリを用いて必要な作業をローカルで行うことができます。このことから、オフラインで作業したり、他の開発者への影響を回避しやすいというGitのコンセプトは理解できていました。

- しかし、概念的な理解に留まっていたため、実際の運用において注意すべきポイントが何であるか、実際にGitを触れてみて気づいたことをまとめてみました。

# GitとSVNの違いは？

- ブランチ作成粒度（頻度）
   
　個人的にはここが一番大きいのかなと思っていて、私が過去担当した案件だとSVNの場合１つの機能追加案件で複数の開発者が同時にブランチを共有して開発するケースが一般的でした。
　Gitの場合ブランチ戦略にもよるものの、Redmineにある小さな機能改修レベルであってもブランチを新規作成することを前提とした設計思想をとっているように思えます。（その分ブランチのライフサイクルも短い）

|比較表|SVN|Git|
|-|-|-|
|ブランチ作成粒度|一大作業|こまめに作成|
|ブランチ内部構造|ファイルコピー（完全なディレクトリ構造）|ポインタ（参照）|

- Gitにはリモートサーバ(GitHub等)への変更内容反映に至るまでに3段階ある（SVNは1段階のみ）

　ステージングエリアを設けているのは、反映したくない更新を除外するだと思いますが、都度addが必要なのは少し面倒な気もしています。

|段階とコマンド|SVN|Git|
|-|-|-|
|ステージングエリアへの登録|なし[^1]|git add|
|ローカルリポジトリへの反映|なし|git commit|
|リモートリポジトリへの反映|svn commit|git push|

[^1]: svn addはバージョン管理対象としての登録に限定した用途でGitのそれとは異なります。

- （TBD)気づきがあれば適宜追加
ニューラルネットワークの知識の蒸留 distilling the knowledge in a neural network

# 1. 知識の蒸留とは

「ニューラルネットワークの知識の蒸留」とは、大きなニューラルネットワークモデルから、より小さくて効率的なモデルを作成する手法です。このプロセスでは、元の大規模なモデルの「知識」が、より小さいモデルに移されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/447d1318-11db-1538-7b38-be482f13d61c.png)


通常、大きなニューラルネットワークモデルは、数百万または数十億のパラメータを持っており、高度なタスクを実行するのに必要な複雑さを持っています。しかし、これらのモデルは計算リソースとメモリの面で高い要件を持ち、デプロイや使用には制約があります。

# 2. 教師モデルと生徒モデル

このような場合、蒸留技術は大きなモデルの「知識」を捉え、それをより小さいモデルに伝達することで、効率的なモデルを作成します。一般的には、教師モデル（大きなモデル）と生徒モデル（小さなモデル）が関与します。


# 3. 生徒モデルのトレーニング過程
蒸留プロセスでは、教師モデルの出力や中間表現を使用して、生徒モデルをトレーニングします。教師モデルは、高い精度を持つために多くの学習データや計算リソースを使用してトレーニングされています。生徒モデルは、より少ないパラメータを持ち、よりコンパクトでリソース効率の高いモデルです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/5128759a-5c53-cd54-235a-aece103c9429.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/563a1198-20d4-0d74-1f6e-ec1d830cba85.png)



#4 蒸留の目的とメリット

蒸留の目的は、生徒モデルが教師モデルと似た振る舞いをするようにすることです。生徒モデルは、教師モデルの予測や中間表現との間で類似性を最大化するようにトレーニングされます。このプロセスにより、生徒モデルは教師モデルと同等のタスクパフォーマンスを達成できることが期待されますが、より小さなモデルサイズや高速な推論が可能となります。

蒸留は、デプロイメントの制約がある環境でニューラルネットワークモデルを使用する場合に特に有用です。また、モデルの可解釈性や解釈可能性を向上させるためにも使用されることがあります。
初心者エンジニアがモチベーションを保つアプリを考えてみた（Udemy:GASとChatGPT）

# はじめに

何か面白いWebアプリを作れないかなと思いプログラミングの学習を始めました。
しかし、初心者の私がいきなり何かを作れるわけもないので、Udemyで初心者向けのコースを受講しました。

プログラミングや新しいスキルを学ぶことは、大変で難しいものです。実際に、プログラミングを学ぼうとする多くの人が挫折してしまうと言われています。

私も自分自身がどれだけ続けられるのか不安になりました。試行錯誤しながら進めていくものの、「１日中頑張ってもほとんど進んでいない」と感じたり、「周りを見ると優秀な人ばかり」と比べてしまったり、モチベーションを保つことが難しくなりました。

そこで、最近話題のChatGPTさんに何とかしてもらおうと思い、アプリを作りました。

# 学んだ教材について

簡単にWebアプリを作って公開できそうということでGoogle Apps Scriptを選びました。

以下は教材の内容です（Udemy）
【Google Apps Script 超入門講座】2時間で知識ゼロから基礎をマスター


https://www.udemy.com/course/googleappsscript/


この教材は、様々なアプリと連携して業務効率化を図るためのGoogle Apps Script（GAS）を学ぶのに最適です。初めてプログラミングに取り組む方にもおすすめです。

この講座では、環境の構築から詳しく解説されており、非常にわかりやすいです。
以下の内容が学べます:
・LINEやSlackへの通知
・GoogleカレンダーやGmailとの連携
・スプレッドシートをデータベースとして使用する方法
・WebアプリやAPIの作成など

Google Apps Scriptを利用することで、Googleが提供する様々なサービスの自動化や連携が簡単に行えます。また、この教材を通じて簡単なWebアプリの作成と公開にも挑戦することができます。



# 作成したアプリについて

①作成したアプリの全体像
②アプリの処理の流れ
③実際の使ってみた結果

## ①アプリの全体像

「頑張ったこと」を投稿すると、ChatGPTが褒めてくれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/37d5d76f-3de2-0ddf-08df-72d94583e79e.png)

## ②処理の流れ

1. ユーザーはGoogleフォームに「何でもいいので頑張ったこと」を入力します。
2. 入力されたフォームの内容は、Google Apps Script（GAS）によって受け取られます。
3. GASは受け取った入力内容を処理し、ChatGPTにAPIを介して渡します。
4. ChatGPTは受け取った内容を解析・処理し、適切な応答を生成します。
5. GASはChatGPTからの結果を受け取ります。
6. 受け取った結果はLINE Notifyを使ってユーザーに送信されます。

ユーザーがGoogleフォームを通じて頑張ったことを入力し、それがChatGPTによって処理された後、結果がLINE Notifyを通じてユーザーに送信されます。

# ③アプリの実行結果（LINE通知のイメージ）

![LINE通知.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/dfdcb53e-855d-e78f-ba1f-308cd9b8da51.png)

# その他の実行結果

同じ投稿でもChatGPTの返答が色々変わってくれていい感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/69ad8674-c1a9-7ea0-69d0-260d3e0d5aa2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/e5d5ae31-d11f-b9da-9af5-54c8f4c28dd6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/8183703a-e694-af08-f695-82e074048967.png)



# 機能追加

いい感じにはなりましたが、まだまだChatGPTの良さが引き出せていませんので少し改良したいと思います。
アプリがシンプルすぎるのでオリジナリティもないですし・・・

モチベーションを保つのに褒められることはとても重要ですが、無理に褒めちぎられてもやる気が出ない場合もあります。時には厳しい意見も欲しかったりします。

ということで、アクセスしたユーザーに応じて振る舞いを変えてみることにします。（やり方は以前書いた記事を参考に）

https://qiita.com/firesign2023/items/64570dc4dd4a3f26a1c7


人によって３段階のレベル設定（初期パラメータ）
①ひたすら褒めるのみ
②たまに厳しい意見＋褒める
③厳しい意見＋褒める

<b>「厳しい意見＋褒める」の実行結果です</b>

少し日本語があやしい部分もありますが、概ねいい感じになりました。
最後にちゃんとフォローしてくれるのでやる気がでます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/48d8ca50-f441-e3d7-e304-b0073cd03dc9.png)



# おまけ

逆にChatGPTを褒めてみた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/4baad5a8-2665-e1a3-dbbf-7e8250a6a962.png)



# まとめ

最後までお読みいただきありがとうございました！
非常に簡単なアプリですが、作成するのにかなり時間が掛かりました・・・。何とか形にできてよかったです。
アイデア次第でもっと面白いものを作れそうなのですが、全然レベルが足りてないので今後も引き続き頑張っていきたいと思います。

ChatGPTさんのお陰で挫折しそうになってもモチベーションを保ちながら、継続して勉強を続けられそうです。
アプリの中身についても書きたかったのですが、長くなってきたので別途書くようにします。

本記事が何かの参考になれば嬉しいです。


# 参考ページ

https://dev.classmethod.jp/articles/easy-googlespreadsheet-gas-to-chatgpt-api/

https://qiita.com/harunan0913/items/c5300260974b594b28cd
【ChatGPT】今更だけど本を要約してもらった

# 目的

過去に読んだ本の要約をしてもらったあと、いいかんじに推敲してもらうことにしました。
対象とした本はこちら
> [成功する人ほどよく寝ている 最強の睡眠に変える食習慣](https://www.amazon.co.jp/%E6%88%90%E5%8A%9F%E3%81%99%E3%82%8B%E4%BA%BA%E3%81%BB%E3%81%A9%E3%82%88%E3%81%8F%E5%AF%9D%E3%81%A6%E3%81%84%E3%82%8B-%E6%9C%80%E5%BC%B7%E3%81%AE%E7%9D%A1%E7%9C%A0%E3%81%AB%E5%A4%89%E3%81%88%E3%82%8B%E9%A3%9F%E7%BF%92%E6%85%A3-%E8%AC%9B%E8%AB%87%E7%A4%BE-%CE%B1%E6%96%B0%E6%9B%B8-%E5%89%8D%E9%87%8E/dp/4065208645)

# 実施方法

過去にハイライト機能をコピペしたものをそのまま投げ、Markdown形式で要約してもらう。

# 結論

課題が２つほど。
１つ目はメモったハイライト部分が局所的すぎて、文脈が破綻している箇所が多かった。
２つ目は上記に付随して、意味不明なテーマで区切られていた。

内容については整合性が担保されていたので、教える側に問題がありましたね…

以下要約です。

# 成功する人ほどよく寝ている 最強の睡眠に帰る食習慣

## **日本人の睡眠時間と睡眠不足の状況**

2018年の厚生労働省「国民健康・栄養調査」によれば、20歳以上の日本人の平均睡眠時間は7時間未満であり、睡眠不足の状況にある人が7割以上を占めている。

## **睡眠の質と栄養**

睡眠の質を向上させるには栄養素の摂取が重要。

特にタンパク質、鉄、ビタミンB群などは睡眠を助けるホルモン、メラトニンの生成に関与しており、これらの栄養素が不足すると睡眠の質が低下します。

## **理想的な睡眠時間とパターン**

理想的な就寝までの時間は16分であり、この間に呼吸と脈拍が落ち着くとされています。

また、睡眠とアンチエイジングの観点からは、ゴールデンタイムではなく、睡眠の最初の段階である深いノンレム睡眠が重要であり、この期間中に成長ホルモンが大量に分泌されます。

## **睡眠不足の影響**

睡眠不足の影響は大きく分けて２つある。

- 認知能力の低下
- 感情の抑制力の低下

## 認知能力の低下

6時間以下の睡眠が2週間続くと、認知能力が大幅に低下し、24時間寝ていない状態と同様のミスが増えることが報告されている。

## 感情抑制力の低下

睡眠不足は感情の抑制力を低下させ、怒りやイライラが増す傾向があることが示されています。

カリフォルニア大学の研究では、睡眠不足の状態では怒りを生み出す脳の部分「扁桃体」の反応が60％も増えることが明らかにされています。

## **睡眠の質を下げる要因**

「寝つきが悪い」についての原因は、大きく分けると８つあげられる。

- 偏食による睡眠ホルモン不足
- 緊張が続く交感神経の過活動
- 脳が休息できないスマホ依存
- 体内時計を乱す人工の光
- 眠気を止めるカフェイン
- 眠気を消し去るうたた寝
- 深部体温が下がらない冷え性
- 眠りの質を下げる室内温度

## **メラトニンの分泌方法**

メラトニンをしっかりと分泌するためには、朝食でのタンパク質の摂取が重要です。

体内時計が最も敏感に太陽光に反応する時間（午前6時～8時半）に少なくとも30分間、屋外で日光を浴びて体内時計をリセットすることが推奨されています。

## **リラクゼーションのための呼吸法**

リラクゼーションと良質な睡眠のために、「4-7-8」呼吸法が推奨されています。この呼吸法はヨガの呼吸法に基づいています。

## **光と睡眠の関係**

ホワイトライトやイエローライトは体内時計に影響を与える可能性が高いとされています。その一方で、光の強さが光の色よりも体内時計に与える影響が大きいため、睡眠への影響を考慮する場合、画面の明るさを下げることが推奨されています。

## **照度と睡眠の影響**

スマートフォンやテレビの画面だけでなく、部屋の明かりも睡眠に影響を与えます。

研究によると、0.3lxのときに睡眠の深さが最高になるとの結果が出ています。

しかし現代の生活環境では、リビングの照明でも50lx前後と、月夜の160倍以上もの光を就寝直前まで浴びることになり、メラトニンの分泌は遅れてしまいます。

また、コンビニエンスストアの店内は500lxにもなるので、寝る2～3時間前からは、コンビニエンスストアに行かない方が良いとの指摘があります。

## **うたた寝と睡眠の質**

夕方以降にうたた寝をすると、それまで溜まっていたアデノシンによる睡眠圧が一気に解放されるため、眠気が消えてしまいます。

## **冷え性と睡眠**

冷え性の場合、タンパク質、ビタミンB群、鉄、ビタミンEなどの栄養素が不足している可能性が高いので、それらが含まれる食材を摂取することが推奨されています。

また、足湯は血管を拡張させ、深部体温を下げるのに効果的です。

## **室温と湿度の設定**

夏はエアコンを使用して、室温26℃、湿度50～60％に設定することが睡眠を妨げない環境作りに繋がると指摘されています。

## 夜中に起きてしまう原因

夜間頻尿以外の原因については、次の７つがあげられる。

- メラトニン不足による浅い睡眠
- 寝酒による脳の覚醒
- 窓から差し込む明かり
- 中途覚醒を呼ぶ真
- 睡眠の質を下げる騒音
- いびきによる酸素欠乏

音に関しては、一般的に40dBを超えると睡眠に悪影響が出ると言われている。40dBは図書館内部の状態と同じレベルなので、睡眠の質を上げるには静かな環境が必要なのだ。

## **昼寝と睡眠リズム**

昼寝が長時間になると夜の睡眠リズムを乱す可能性があります。

その影響を避けるためには、午後2時までに20分以内の昼寝をとることが推奨されています。

## **血糖値と睡眠**

血糖値の乱高下は午後の睡魔を引き起こすだけでなく、それを毎日のように続けると低血糖症を発症し、寝つきや睡眠の質にまで影響を与えることがあるとされています。

## 昼食時で買っても良いもの

コンビニで購入するものに関しては、容器の処理が容易なものを選ぶと良いです。

サラダチキン、厚焼き玉子、チョリソーなどはその例となります。

## **夜食と栄養バランス**

夜食や就寝前の食事については、タンパク質を中心に考えると良いです。

わかめスープに卵を落とす、木綿豆腐の上に海藻をのせた冷ややっこなどが推奨されています。

## **現代人の食事と栄養バランス**

現代人は食事を好きなだけ食べてお腹いっぱいになることが多いですが、栄養が偏っていることに気づいていない場合があります。

適切な栄養バランスを保つことが大切です。
シェルスクリプトでtmuxの開発環境を立ち上げる

# はじめに

突然ですが皆さん、開発環境を立ち上げるために毎日同じようなコマンドを打っていませんか？

クライアント、サーバーだけでもディレクトリ移動と起動コマンドを2回ずつ打たなければいけないし、ましてや最近流行りのマイクロサービスとかになってしまうと、5回, 6回とサーバーを起動しなければなりません。

そこで今回は、シェルスクリプト一発でtmuxの開発環境を立ち上げる方法をご紹介します。

tmuxを知らない方や、インストールしていない方は下の記事が参考になります。

https://qiita.com/maachan_9692/items/a9f81398e0d457c9e48c

# 環境
- ubuntu22.04
- tmux 3.2a

# ディレクトリ構成
次のようなディレクトリ構成を想定しています。
今回作成するのは<b>setup.sh</b>です

```
homedir/
    ├── setup.sh
    ├── ...
    └── project-dir
        ├── app-client/ (react-app)
            ├── node_modules/
            ├── package.json
            ├── ...
            └── src/
        └── app-server/ (go server)
            └── main.go
```

# スクリプトの作成
```shell:setup.sh
#!/bin/sh

cd /path/to/project-dir

# セッションの作成
tmux new-session -d -s session_name

# ウィンドウ名の変更
tmux rename-window server
tmux send-keys -t session_name:1 "cd app-server" Enter
tmux send-keys -t session_name:1 "go run main.go" Enter

# 新しいウィンドウの作成
tmux new-window -t session_name
tmux rename-window client
tmux send-keys -t session_name:2 "cd app-client" Enter
tmux send-keys -t session_name:2 "yarn start" Enter

# 最初のウィンドウを選択
tmux select-window -t session_name:1

# セッションをアタッチ
tmux attach-session -t session_name

```

# 実行
```bash
$ source setup.sh
```

![Screenshot from 2023-05-28 20-05-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359441/98758d49-b9b3-38e1-14e5-eb397fc99373.png)

![Screenshot from 2023-05-28 20-06-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359441/b70a206d-f77d-7911-f22a-13c684fa8b24.png)

これで、めんどくさいコマンドを毎日打たなくてもよくなりますね！

tmuxのカスタマイズは、[こちらの記事](https://qiita.com/youichiro/items/dd54c38c2f3873348c78)を参考にしています。
【SwiftUI】Listの灰色の部分の色を変更する

# はじめに
リストの灰色部分の色を変更したいことがあったのでやり方を記録しておきます。

# 灰色の部分ってどこ？
リストのセル以外の部分です。
![Simulator Screenshot - iPhone 14 - 2023-05-28 at 22.07.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/7bc78532-f310-4d47-4a02-210fa5ba6e31.png)

# 実装
今回は灰色の部分を緑にしてみます。
```diff_swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        List {
            ForEach(0..<10) { index in
                Text("セル\(index)")
            }
        }
        .listStyle(.insetGrouped)
+       .scrollContentBackground(.hidden)
+       .background(Color.green)
    }
}
```

![simulator_screenshot_041DD2B7-B3C5-41B8-8DEC-CEDD9202A30C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/b6497a3a-04c4-3b7c-058d-3cdf9a14f904.png)

# おわり
いい感じに緑になりましたねー
Udemy　【ピーコックアンダーソンのプログラマ仕事の流儀】の感想

# はじめに
セールで半額になっていて、コースの内容見て面白そうだなと思って買ってみました。
思いのほか参考になる部分が多々あったのでまとめます。

気になる方はぜひ講座買ってみてください。
[ピーコックアンダーソンのプログラマ仕事の流儀](https://www.udemy.com/share/104AI43@zub-dQ5prSbrlPCAv8Y8Ua5JwNZ1FqJ6C2nWbmn0EC4DgcUUbpieo02Lq4KK0TrCMg==/)

# 内容
全部書くわけにはいかないので参考になったとこだけ抜粋します。
#### 1.時間の流儀
<dl>
  <dt>ファーストチェス理論</dt>
  <dd>「ファーストチェス理論」という、チェスの名人が「5秒で考えた打ち手」と「30分で考えた打ち手」のうち、86%は同じ打ち手であったことが実証されたことから導かれた理論のお話です。</dd>
  <dd>悩んで100％を目指すよりはとにかく早く75点とか80点とかを目指しましょうというお話。</dd>

  <dt>2割の時間で8割造り、8割の時間で精度を高める</dt>
  <dd>50時間で完成させるべき仕事がある場合は10時間で8割方できている状態にしないとなかなか上手くいかない。後の40時間で精度を高めていく。これが逆だと工数を超過しかねない。</dd>
  <dd>この考え方は見積にも応用が可能。仮に集中して頑張ってある程度動くプログラムを作るのに16時間(2日)かかる気がするのであればその5倍の80時間(10日)位を見積工数になる。</dd>
</dl>

#### 2.デスクトップはゴミ箱だけにする
<dl>
  <dt>デスクトップは整理しよう</dt>
  <dd>デスクトップがゴチャゴチャしてる人がよくいるけど基本整理しましょう。</dd>
  <dd>特性ごとにフォルダを分ける。
</dl>
フォルダ名は「カテゴリ(製品名やプロジェクト名)+年月日+○○(打ち合わせ資料・仕様書など)」</dd>
  <dd>作ったフォルダを以下のフォルダに振り分けて管理する。場所はドキュメントフォルダの下</dd>
<table>
  <thead>
    <tr>
      <th>フォルダ名</th> <th>説明</th>
    </tr>
  </thead>
  <tr>
    <td> project</td> <td>作業中のフォルダを入れる</td>
  </tr>
  <tr>
    <td> archive </td> <td>完了したフォルダを入れる</td>
  </tr>
  <tr>
    <td> format</td> <td>よく使う手元に置いておきたいやつ(申請書・報告書等)</td>
  </tr>
  <tr>
    <td> shortcut </td> <td>共有ファイルやよく使うショートカット等</td>
  </tr>
</table>

#### 3.保守の流儀
<dl>
  <dt>ソース憎んで人を憎まず</dt>
  <dd>昔のコードは質も低くレベルも低い。時代的にもそんなものなので馬鹿にしたり嘆いていても始まらない。
なのでリファクタリングやアーキテクチャを学びどうアプローチを仕掛けていくか学ぶしかない。</dd>
  <dd>大がかりな改修があるときに直したいところも直す。テストも一緒にしっかりやる。</dd>
  <dd>ソフトウェアにメスを入れる勇気も必要→リーダーの仕事。リーダーが責任を持つ。バグってクレームが出ても責任を負うぜって気持ちでやるしかない。</dd>

  <dt>テストするために実装がある</dt>
  <dd>設計は実装のためにあり、実装はテストのためにあり、テストは運用のためにある。</dd>
  <dd>実装してからどうやってテストしようはおかしな話。(ウッ。。てなりました。笑)</dd>
  <dd>テストのことを考えて実装しないといけない。ロジックもそうだけどインフラ的な話も。負荷や限界値は設計段階で決める。</dd>
  <dd>これがないとテストできないっていうものは、それがなくても動くようにプログラミングする。仮想で何か作ってそこと通信して検証できるような造りにする。</dd>
</dl>

#### 4.質問の流儀
<dl>
  <dt>相手の頭の中をセットアップしてから話す</dt>
  <dd>質問する前にこういうことを話します。という概要を話さないと相手は理解できない。相手は全く違う仕事をしている。その温度差を感じること。</dd>
  <dt>質問した人には結果を必ず報告する</dt>
  <dd>質問に答えた人も100％大丈夫だとは思ってない。多分これでいいと思うよって感じで答えてる。</dd>
  <dd>なので実践してみてできたら結果を報告すること。そうすることで答えた人も再認識できる。</dd>
  <dd>Aさんに聞いて分からないと言われ、Bさんに聞いて教えてもらって出来た場合、Bさんには当然報告する。この時Aさんにも報告・共有すること。結果が分かったのに教えないって、それはやめましょうよ。</dd>
  <dt>質問するときは私心を捨てる</dt>
  <dd>あの人忙しいかなとか、嫌な顔されるかなかそういう思いは捨てましょう。</dd>
  <dd>どうやって捨てるか。これは仕事なんだと、質問が仕事なんです。</dd>
  <dd>あなたは仕事として質問するし相手は仕事として質問に答える。</dd>
</dl>

# さいごに
講座の内容を振り返りながら、共感したことや参考になったとこを超ざっくり簡単にまとめました。
コース全体も1時間ちょっとしかなく、明日から取り入れられそうな考え方も多いので気になる方はぜひリンクから飛んで見てみてください。
余談ですが、ピーコックアンダーソンの講座セールになってたのでまとめて買っちゃいました。
デザインパターンはいつか全部まとめて欲しいなとは思っていたのでこのタイミングで買えてよかったです。
オブジェクト指向の理解が深まったら勉強してみようと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3427437/3d51fc2c-facd-612b-b862-c1908a05ddcc.png)
Failed to get D-Bus connection: No such file or directory

以前作ったシステムをメンテしようとしたとき
Dockerコンテナをdocker-compose up -dで立ち上げようとしたら
DockerfileでsystemctlでenableにしたHTTPDもmysqldが起動してねぇ・・

あれ？手動でapache立ち上げてたかな？と思い
コンテナ内に入って

```
# systemctl start httpd
Failed to get D-Bus connection: No such file or directory
```

またこれだよ・・
まいどまいど苦しめられる問題。。

前回の記憶が無いのでググって試したがうまく行かず
たどり着いたのはこの記事！

https://yossi-note.com/how_to_start_apache_in_a_docker_image_on_amazon_linux_2/


~/Library/Group\ Containers/group.com.docker/settings.json
内の設定を
```
  "deprecatedCgroupv1": true,
```
に書き換えてDocker Desctopからrestartすることで
再度docker-compose up -dしたら立ち上がりました！

ほんとありがたい。



systemctlを使わずにapacheやmysqldを立ち上げるのってどうしたらいいのかな？
って思うけど、そもそもcentos7でゴニョゴニョしたdockerイメージを作ること事態が
多分NGなんだろうな・・
古い人間だから”サーバを立ち上げる”ってことをDockerにやらせてるからなぁ・・
RubyでAtCoder ABC303(A, B, C)を解いてみた

# はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC303のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。

# A - Similar String
https://atcoder.jp/contests/abc303/tasks/abc303_a
```ruby:a-303.rb
gets
s = gets.tr("01", "ol")
t = gets.tr("01", "ol")
puts s == t ? "Yes" : "No"
```
## 解説
trメソッドを使って、0をoに、1をlに置換した後のsとtが一致しているかどうかを判定すればOKです。

# B - Discord
https://atcoder.jp/contests/abc303/tasks/abc303_b
```diff_ruby:b-303.rb
n, m = gets.split.map(&:to_i)

- sum_pair = Array.new(m){ gets.split.each_cons(2).map{ |pair| pair.sort! } }.flatten.each_slice(2).uniq.size
+ sum_pair = Array.new(m){ gets.split.each_cons(2).map(&:sort!) }.flatten(1).uniq.size
- puts [*1..n].combination(2).size - sum_pair
+ puts (n * (n - 1)) / 2 - sum_pair
```
## 解説
`each_cons`メソッドと`flatten`メソッドおよび`each_slice`メソッドを組み合わせることで、隣り合った人の組み合わせを求めることができます。このとき求める答えは、(1..n)から２つ選んでできる組み合わせの数から先ほどの隣り合ったことのある人の組み合わせの数を差し引いた値となります。

# C - Dash
https://atcoder.jp/contests/abc303/tasks/abc303_c
```ruby:c-303.rb
n, m , h , k = gets.split.map(&:to_i)
s = gets.chomp.chars
hash = {}
m.times do
  x, y = gets.split.map(&:to_i)
  hash[[x, y]] = true
end

nx = ny = 0
s.each do |c|
  h -= 1
  break if h < 0

  case c
  when "R"
    nx += 1
  when "L"
    nx -= 1
  when "U"
    ny += 1
  when "D"
    ny -= 1
  end

  if h < k && hash[[nx, ny]]
    hash[[nx, ny]] = false
    h = k
  end
end
puts h >= 0 ? "Yes" : "No"
```
## 解説
連想配列を使って、問題文の通りに実装することで高橋くんが倒れることなくN回の移動ができるかどうかを判定することができます。

https://qiita.com/shoya15/items/50fd17e37d7c64f2b166
【情報セキュリティ】暗号化

# ０．はじめに											
大学で情報セキュリティの講義を受講している者です。
"広く浅く"情報整理したいため投稿。
内容のレベルは超入門編、個人的な感情も少し入り混じった備忘録。

# １．暗号化について
### 1-1.公開鍵暗号と共通鍵暗号
公開鍵暗号の方が共通鍵暗号より安全性が高い
暗号化と復号の鍵を別にしているため
秘密鍵でのみ復号が可能
ドメイン認証やSSL証明書に利用されている

だが、計算量が多く複雑化するため全て公開鍵暗号で補う訳にいかない
そのためインターネット通信の暗号化やデータベースの暗号化には
比較的処理速度が速い共通鍵暗号が用いられる





### 1-2.共通鍵暗号
共通鍵暗号は``ブロック暗号、ストリーム暗号``に分類ができる
この2つが最もポピュラーな暗号化であり使い分ける明確な基準はない
他にも``ハッシュ関数``を取り上げる
特徴が分かりやすい部分を主に記述
- ``ブロック暗号``
- ``ストリーム暗号``
- ``ハッシュ関数``

# ２．ブロック暗号
長いデータを暗号化できる、安全性を追求している
公式内で以下を扱う
平文|M
:--|:--|
**暗号文**|**C**

### 2-1.特徴
3構成で成り立つ
鍵スケジュール部で鍵を作り、ラウンド関数を用いてデータ攪拌部で暗号化する流れ
- ``データ攪拌部``	
平文をブロック分けして暗号化する部屋みたいなもの
- ``ラウンド関数``
アルゴを用いた関数
- ``鍵スケジュール部``	
鍵を生成する部屋みたいなもの

平文と暗号文のブロック長が等しい
安全性はストリーム暗号より高い
ストリーム暗号に比べて暗号化が低速、要は重たい処理
それぞれ累乗することにより処理

- **``暗号化		C = 平文 × 暗号化``**		
- **``復号		M = 暗号文 × 復号``**


# ３．ストリーム暗号
共通鍵暗号のひとつ
比較的短い暗号化に用いる、平文に乱数を挿入する形式がある

### 3-1.特徴
2構成で成り立つ
- ``疑似乱数を生成する「鍵ストリーム生成」部分``
- ``疑似乱数と平文を排他的論理和する「結合部分」``

予測が可能な場合、暗号文から簡単に復号ができる可能性がある
処理が高速
それぞれ排他的論理和を使い処理
排他的論理和⊕（ざっくりと）
いずれかの一方が真のときは真、0と0など両方とも真/偽の場合は偽

- **``暗号化		C = 平文 ⊕ 鍵``**	
- **``復号		M = 暗号文 ⊕ 鍵``**


# 4．ハッシュ関数
### 4-1.特徴
**目的は改ざん検知**
改ざんされたかどうかを確認できる
感知する目的のため攻撃による防止はできない

**定められた数値長を出力する関数**
その際に圧縮を行っているためデータの逆算や復元は不可能


**2つの組み合わせで構成**
- ``圧縮関数``
　入力データを固定長のハッシュ値に変換する関数
- ``定義域拡張構造``
　圧力関数を利用しハッシュ値に圧縮する


**異なる入力に対して異なるハッシュ値が生成**
入力それぞれが1bitでも異なる場合、出力が大きく変わる特徴がある

**短い圧縮値を使用した場合、高速な処理が可能**
検索/改竄の検知が高速で行うことが可能となる

### 4-2.利用方法
**PWにハッシュ関数を累乗することでハッシュ値を保管**
認証時にはサーバ側に元々保管してるハッシュ値を利用し一致しているかしてないか確認するために使用
仮にPWを保管しているDBに攻撃された場合、ハッシュ値から元のPWを復元することはできない
プログラミングを真面目にやり始めようと思う〜プログラム問題はmap関数と共に〜

##### 火がつくのが遅かったけど、間に合わないことはないはずだ

ということで、プログラミングスキルの上達のために、独学で行えるpaizaを始めることにした。　<br>

就活スタートを機にもう一度自分を見つめ直して、逃げてきたことに色々挑戦してみようと思う。
Qiitaを始めたのもそれが理由である。
だんだん記事の作成も上手になるはずである。

まずは三年位触っていなかったpaizaを久しぶりに開き、いくつか問題を解いてみた。

まずCランク問題である「プレゼント応募企画の実施」をおこなった。
アルゴリズムはかけたが標準入力の数字を数値としてリストに格納する方法がわからなかった。

map関数とsplitを使って解決した。
map関数、めちゃくちゃ便利である。
引数に、適用したい関数と使うリストを入れることで簡単に操作を行える。
そしてかなり見やすく、わかりやすい。


```Python
input_list = list(map(int,input().split()))
```
これで横に標準入力された数値たちをそれぞれ分けて、int型の整数にしてリストに格納することができた。

サマーインターンのESを書きながら休憩にpaizaをやっていこうと思う。
GCPの監査ログに入門する【Cloud Audit Logs】

# そもそも監査ログとは
「監査」を目的に出力されるログ。
「監査」とは、システムがルール通りに動いているかを、第三者が確認すること。
「ルール」とは、会社のルール、お客さんとのルール、はたまた法律、などなど

# GCPの監査ログの種類

| 種類 | 概要 | デフォで有効？ | 課金 | 場面の例 | 
| --- | --- | --- | --- | --- |
| 管理アクティビティ監査ログ | ユーザーのアクションでリソースが更新された時に出る | 有効。無効化したくてもできない | 無料 | VMを作成した時、IAM権限を変更した時
| システムイベント監査ログ | Google側のアクションでリソースが変更された時に出る | 有効。無効化したくてもできない | 無料 | オートスケールが行われた時
| データアクセス監査ログ | リソースへの読み取りが行われた時に出る | 無効 | 有料 | GCSオブジェクトデータ取得時
| ポリシー拒否監査ログ | セキュリティポリシー違反の操作があった時に出る | 有効(無効にしたくてもできないが、除外フィルタを設定できる。） | 有料 | サービス境界外からのアクセスがあった時

### データアクセス監査ログの種類
- `ADMIN_READ`: メタデータを読み取った時に出る
- `DATA_READ`: ユーザが作成したデータを読み取った時に出る
- `DATA_WRITE`: ユーザがデータを書き込んだ時に出る

#### [GCSにおける監査ログの種類（公式ドキュメント）](https://cloud.google.com/storage/docs/audit-logging?hl=ja#operations)

# 監査ログの保存先
- Cloud Logging のログバケット
  - ログバケットとは、Cloud Loggingにおけるストレージ機能。GCSのバケットとは無関係なので注意！
  - ログバケットに保管されているログのみを、Cloud Loggingの画面で見れるという関係。

| 種類 | 保存期間 | デフォルトで保存される監査ログの種類 | 補足 |
| --- | --- | --- | --- | 
| `_Required`ログバケット | 400日（変更不可） | 管理アクティビティ監査ログ・システムイベント監査ログ | 最初から自動で作られている | 
| `_Default`ログバケット | 30日（3650日=10年まで延ばせる) | データアクセス監査ログ・ポリシー拒否監査ログ | 最初から自動で作られている | 
| ユーザー定義ログバケット | 1~3650日(=10年) | |
- Cloud Storage
- BigQuery
誤った情報をcommitしてしまった場合の修正方法

はじめに
日々の勉強をアウトプットしていきたいと考えております。自分なりの理解した表現でアウトプットしていくので、初学者のため、誤りもあるかと思います。その際はご指摘頂けると幸いです。

commitが終わると、「Commit to master」の下に、下記図のように「Undo」というボタンが出てきます。Pushする前であれば、「Undo」というボタンをクリックするとcommit前の状態に戻ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/34fb79d9-c153-ce6b-7f73-1b6ea33dcd3c.png)
エクセルのVBAで複数の特定シートをPDF出力

# やり方

下記のようなシートがある場合の例。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/7381eccd-9db2-9840-956d-f6300526cdfd.png)

```vb:サンプル
'『左から〇番目』という指定だとシート位置を変更した時にバグる。
'（余計な改修が発生）
'なので、シート名で指定の方が良いと思う。
'『無関係シート』のようなPDF対象外のシートが間にあっても例外にならない。
Dim sheet_list_(1) As String
sheet_list_(0) = "pdf対象1"
sheet_list_(1) = "pdf対象2"

'xlsmファイルと同じフォルダーにtest.pdfという名前で出力。
Dim file_path_ As String
file_path_ = ThisWorkbook.Path & "\test.pdf"

'対象シートを選択。
Worksheets(sheet_list_).Select

'PDF出力。
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=file_path_

'複数シート選択状態のままだと誤編集の恐れがあるので、
'一番左のシートを選択した状態にリセット。
Worksheets(1).Select
```

# 配列で指定した名前のシートが存在しない場合

下記のように例外。

>インデックスが有効範囲にありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/62a9ad42-bcaf-3d73-0509-ab9a3f66a585.png)

# PDFファイルの上書きが発生する場合

* 例外にならない。
* 『上書きが発生しますけどよいですか？』のような確認ダイアログは出ない。

**問答無用で上書きされる** ので注意。

# 参考サイトさん

https://tech-paclab.com/exportpdf/

https://qiita.com/waokitsune/items/3e703c2f18a79e34587c

# バージョン

Windows 10 Pro 22H2 19045.3031
Microsoft Excel for Microsoft 365 MSO (バージョン 2304 ビルド 16.0.16327.20200) 32 ビット
大学生が自分のプログラミング学習の見直しをする話

# はじめに
こんにちは。大学１年のフラットと申します。
今回が初投稿です。
私は入学当初からプログラミング学習を続けていています。
HTML,CSSは一通り終わり、現在はJavaScriptを学習している状態です。
バックエンド志望なので、RubyとRailsにも手を出す予定です。

さて、今回の内容はJavaScriptを勉強していたとき、壁にぶち当たり、今までの学習の仕方に疑問を持ち、改善策を考えるものとなっています。少しでも参考になれば幸いです。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [HTML,CSSまでは何とかなったが...](#Chapter1)
1. [原因と改善策](#Chapter2)
1. [終わりに](#Chapter3)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# HTML,CSSまでは何とかなったが...
これらのマーケアップ言語については、一番最初はProgateの道場以外は２週程しました。
そして、Udemyの講座を一つ購入し学習しました。基本的には動画を見ながらひたすら写経するといった学習をしていました。たまに自分でホームページを作ることもありました。<br>
<font color="red">プログラミング学習はインプットよりアウトプットのほうが重要だ</font><br>
と言われていますが、Udemyで進めていく中でHTML,CSSであれば結構理解できましたし、先ほども言った通り自分でホームページを作ることもできました（簡易的ではありますが）。でも、この時点で<font color="blue">アウトプットよりもインプットのほうが多かった</font>ように思います。

そして、そのままJavaScriptの学習に突入！
講座もみるみる進むぞ！いける！と思ったのですが...

### 自分でコンテンツが作れねえ...
講座の内容は何とか分かるんだけど、いざ自分で作るとなると何を書けばいいんじゃ...
あれが作りたいから、constで定数を指定して、if文を使って...あれ、上手くいかないや。
調べてみてもよく分かんねえ。
#### もうやーめた。

のループになってしまいました。

ああ、自分ってプログラミング向いてねえのかな...

### 待てよ、まだ諦めるには早い！
まずは何がダメだったのか考えてみよう。話はそれからだ。


<a id="#Chapter2"></a>
# 原因と改善策
### アウトプットよりもインプットの量が多かった
ここまで見てわかった人がほとんどだと思いますが、まさにこれです。
講座を見ながらコードを写していく、というのはインプットに入ります。
アウトプットは、なんでもいいから学習した内容を使って自分でコンテンツを作ることです。
JavaScriptを勉強していたときは

#### 講座1→講座2→講座3→講座4...→講座終わり→よし、何か作ってみるか！

という風に、ひたすらインプットに時間を使っていました。HTML,CSSのときは多少アウトプットできていたのにね。次。

### とにかく終わらせることに集中していた
JavaScriptの講座は、HTML,CSSの講座に比べて多く、面倒くさかったので「とにかく終わらせよう」という気持ちでどんどん進んでいきました。確かに、効率よく学習するにはそれも必要なことかもしれません。しかし、限度があります。
講座で分からないことがあってもほとんど自分で調べることもせず、ちょっと考えることも面倒くさかったので「まあいっか！」というスタンスで進めてしまった結果、今の状況にあるわけです。

さて、改善策を考えてみようじゃないか。

### <font color="green">言語の学習に入る前にそれで何を作れるか、それにはどの構文が必要かを調べるなど</font>
まず、これから学習する言語について調べてみて、「何ができるの？」「どの構文が必要なの？」「それを見た上で自分は何を作ってみたい？」を考えてみるのがいいと思います。
具体的に作りたいと思うことがない自分は、その言語を使って他の人が作ったものを見てみて「これ面白そう」「これならできるかも」と小さくてもいいからゴールを決めるといった戦法をとります。

### <font color="green">講座（学習）を進めるごとにアウトプットに入る</font>
今までは講座を全て終わらせてから、あるいはかなり進めてからアウトプットをしていました。
これからは講座ごとにアウトプットすることを心掛けたいと思います。基礎の基礎のチョー簡単な内容は別にしなくていいかもしれませんが、特に重要なところ、自分が作りたいコンテンツに必要な内容であれば徹底的に取り組むつもりです。

### <font color="green">そもそもインプットの量が足りないので増やす</font>
全体的な勉強時間がそもそも足りていません。始めたばかりなので当然ですが、インプットである講座を進めるときに書いたコードだけで満足していたところもあると思います。ということは、そもそもインプットの時間が足りていない可能性もあります。
インプットは増やすが、アウトプットの量の方が多くなることを意識すれば、身に付きやすいですし、コードを書く量も自然と増えると思います。


<a id="#Chapter3"></a>
# 終わりに
ここまで挙げた３つの改善策を用いて学習を進め、ダメだったらまた練り直して、を繰り返せばきっとエンジニアへの道は開かれると思います。
これからも諦めず学習に励みたいです。
ChatGPTをターミナルですくすくたたけるCLI

## ブラウザ開くのって大変ですよねー　
最近慣れていない言語を業務で書く機会があり、頻繁にOpenAIのChat GPTをブラウザで開き質問していました。ブラウザを開くの旅を取り除いて直接ターミナルで叩きたいと思いました。この数秒単位の節約をするべく、１０時間ほどの開発をするのがプログラマという生き物なので、[GoLLMと言うCLI](https://github.com/chavdim/gollm)が組み立てられました

## ターミナルからchatGPTと会話
OpenAIは[API](https://platform.openai.com/docs/guides/chat)を提供しており、そちらのAPIも用いてターミナルでかいができるはず。と言うことで少し調べらさまざまなSDKが存在しました。Golangも[コミュニティのライブラリ](https://github.com/sashabaranov/go-openai)がありそちらを利用しております。

### cliのセットアップ
[Readme](https://github.com/chavdim/gollm)に記載されていますが、homebrewでインストールできます。Go使いはgoでもできます

```
brew install chavdim/taps/gollm   
```

### API keyの設定
利用するにはOpenAI様でAPIキー取得が必要になります。記載当時は決済情報を登録しないと提供してくれませんでした。個人でちょいちょい利用する分には数円ぐらいしかからずあまりダメージを感じていないです。
＊gpt 3.5を利用しています、gpt４がともう少し高い気がします
個人的に怖いので利用上限を設けてます、お勧めします。

登録後、こちらでキーを取得できます　https://platform.openai.com/account/api-keys
`OPENAI_API_KEY`の環境変数を期待してるので入れておきます

```
// 例
export OPENAI_API_KEY=xxxxxxx
```

### その他の設定
下記で初回に設定が行われモデルとチャットGPTに装ってもらうペルソナをオプショナルで設定します。
```
❯ gollm
Use the arrow keys to navigate: ↓ ↑ → ←
? Select model:
  ▸ gpt-3.5-turbo
    gpt-4
```
```
? Select PersonaDescription:
  ▸ None
    SoftWareEngineer
    HealthCareAdvisor
    FinancialPlanner
↓   MarketingManager
```
### どうしても毎回忘れることを質問する
```
❯ gollm
### interaction: 1
Enter prompt: cssでdivを画面の真ん中にするにはどうしたらいいんだっけ
div要素を画面の中央に表示するためには、CSSで以下のようなプロパティを使用します。

css
div {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}


このCSSは、`div`要素がページの中心に配置されるようにします。`position: absolute;`は、要素をページに固定します。`top: 50%;`と`left:50%;`は、要素をページの中央に位置するようにします。最後の`transform: translate(-50%, -50%);`は、要素を正確に中央に揃えるためのものです。

ただし、ウィンドウのサイズが変わると、要素が画面から外れる可能性があります。この問題を解決するには、親要素に`position: relative;`プロパティを設定することができます。

### interaction: 2
Enter prompt: flexboxみたいなやつできないんでしたっけ？
はい、Flexboxを使うことでも、要素を中央に配置することができます。以下は、Flexboxを使った方法です。

css
.container {
  display: flex;
  justify-content: center;
  align-items: center;
}
```


## ちなみに、cliとGo言語はいいコンビ
これはただの偏見で視野が狭いだけかもしれないが、個人的にはGolangのエコシステムと CLIはすごく相性が良く簡単に高性能かつクロスプラットフォームの生産物が非常に作りやすかった
生産物のパブリッシュも非常に簡単で[goreleaser](https://github.com/goreleaser/goreleaser)をGithub actionsで動かせば、プッシュするだけでマルチブラットフォームのディストリユーションが作成される世界線が簡単にできました。

## 最後に
みてくれてありがとうございます。普通に楽しいのでぜひ試してみてください、バグっていたら教えてください！
Unityでゲームのキャラを保存する

個人作成のRPGゲームで出てくるキャラをセーブで保存する方法が、簡単だったのでメモ。

ざっくりいうとポケモンやドラクエモンスターズみたいなゲームなのですが、パーティのモンスターはUnityのインスペクターから設定していました。
が、モンスターを新たに仲間にする処理や、セーブ機能の実装を考えた時に、仲間にしたタイミングで手持ちのデータを保持しておきたいなと考えました。

今日そのソースをかけたので簡単に共有します。

セーブ・ロード機能
セーブ：モンスターデータをJson形式に変えて、Jsonファイルに書き出し
ロード：Jsonファイルのデータを読み込んでモンスター生成

以下ソース。
```c#:セーブ
StreamWriter writer;
// monster <= Monster型
string jsonstr = JsonUtility.ToJson(monster);// モンスター情報をJson形式に変換
writer = new StreamWriter(Application.dataPath + "/savedata.json", false);
writer.Write(jsonstr);
writer.Flush();
writer.Close();
```

```c#:ロード
string datastr = "";
StreamReader reader;
reader = new StreamReader(Application.dataPath + "/savedata.json");
datastr = reader.ReadToEnd();
reader.Close();
Monster monster = JsonUtility.FromJson<Monster>(datastr); // JsonデータをMonter型にパース
// monsters <= List<Monster>
monsters.Add(monster);
```

JsonファイルはAssetフォルダ内に`savedata.json'というファイル名で保存されます。
（すでにある場合は上書き保存）

実際のソースは手持ちのモンスター分書き出し・読み込みを繰り返していますがもっと効率の良い方法がありそうですね。
マップ（プレイヤーがどこにいるか）、ストーリーのセーブロードも考えないといけないので、どんなデータをJsonファイルに書き出せばいいのか考えないといけませんね。