OmniAICreator/Qiita-1.07M huggingface dataset:
rails s時の「Address already in use」の解決方法

rails s でローカルホスト3000を立ち上げようとした時に、「Address already in use」というエラーが出て起動ができない問題が派生しました。
その際に実施した解決法について備忘録としてまとめます。

以下エラー文です

```ruby:qiita.rb
Address already in use - bind(2) for "127.0.0.1" port 3000 (Errno::EADDRINUSE）
```
翻訳すると、ローカルホスト3000は既に立ち上がっている。という意味なので、ターミナルを全て終了させたのですが、改善しませんでした。

エラーの原因としては、アプリの動作中にctrl cで強制終了させた事のようです。
その際に行った対処法は
①lsof -i:3000コマンドで、ローカルホスト3000を使用しているアプリを見る
②kill -9 PID番号で該当するPID番号のプロセスを終了させる
という手順です。
順番に説明します。


#「lsof -i:3000」 コマンド
 

まずはlsof -i:3000 コマンドを実行してローカルホスト3000を使用しているアプリを確認します。

```ruby:qiita.rb
 % lsof -i:3000
```
実行してみると以下のような情報が出力されました。

```ruby:qiita.rb
COMMAND  PID          USER   FD   TYPE            DEVICE SIZE/OFF NODE NAME
ruby    6455 user            14u  IPv4 0xb13e455940b92b7      0t0  TCP localhost:hbci (LISTEN)
ruby    6455 user            15u  IPv6 0xb13e455924f2e87      0t0  TCP localhost:hbci (LISTEN)
ruby    6455 user            27u  IPv6 0xb13e455924f4707      0t0  TCP localhost:hbci->localhost:53230 (CLOSE_WAIT)
ruby    6455 user            30u  IPv6 0xb13e455924f40e7      0t0  TCP localhost:hbci->localhost:53244 (CLOSE_WAIT)
```

実行結果としてPID：6455　が占有してしまっている事が分かります。

#「kill -9 PID番号」 コマンド
　PID：6455を強制終了するために、kill -9コマンドを使います。

```ruby:qiita.rb
  % kill -9 6455
```
実行して、rails sをすると無事にサーバーを立ち上げる事ができました。

#補足① 「lsof -i:3000」の意味
　さて今回使った「lsof -i:3000」とはどのような意味なのでしょうか。
まず「lsof」は、オープンしているファイル一覧を示すコマンドです。
lsofコマンドは　lsofには様々なオプションを指定する事ができます。
今回はオプションに ポート番号などを指定できる「-i」を指定しました。
従って「lsof -i:3000」とするとローカルホスト3000を指定できます。

*参考文献
lsofコマンドについて
https://atmarkit.itmedia.co.jp/ait/articles/1904/18/news033.html

#補足② 「kill -9　PID番号」の意味
　killコマンドは実行しているプロセスを終了させるコマンドです。
続く「-9」はプロセスを強制終了させるオプションです。
今回は「kill -9　6455」とする事で、PID番号6455を強制終了させました。

*参考文献
killコマンドについて
https://eng-entrance.com/linux-command-kill

#まとめ
　今回のエラーは、アプリの動作中にctrl cで強制終了させた事が原因でした。　
対処法として、lsofコマンドでポート番号3000を参照して、killコマンドでプロセスを終了させました。
Vue.jsで開発する際のVSCodeの拡張機能

# はじめに
Vue.jsの開発にオススメのVSCodeを紹介します

# 前提
開発環境構築が終わっていること
手順は下記参考
https://qiita.com/wooooo/items/0186ac57b025611c63a5

# 拡張機能

# Vetur
.vueファイルがシンタックスハイライト（色付き表示）されます

# vue-peek
Vueコードの編集を拡張。
コンポーネントの移動が楽になります。

# Auto Rename Tag
HTMLの開始タグと終了タグが同時に生成される

# Beautify
コード整形がキレイに

# Vue 3 Snippets
コードヒントが増える

# Code Spell Checker
スペルミスを防いで、typoエラーから逃れる

# Duplicate action
ファイル複製用の拡張機能

# Live Server
WEBサーバをローカルで起動

#Code Runnne
JavaScriptの実行結果を表示
GCP gcloud auth application-default login ができない

# 環境
macOS Monterey 12.0.1

# はじめに
下記問題に対する解決法を書きましたが、同エラーに対する原因は場合によって違うと思われます。
ここではそのなかで自分が突破した方法のみご紹介します。

# 問題
下記コマンドでGCPの認証を得ようとしたがエラーが返る。

```zsh
gcloud auth application-default login
```
以下エラー内容

```zsh
ERROR: (gcloud.auth.application-default.login) UNAUTHENTICATED: Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.
- '@type': type.googleapis.com/google.rpc.ErrorInfo
  domain: googleapis.com
  metadata:
    method: google.cloudresourcemanager.v1.Projects.[Test]
    service: cloudresourcemanager.googleapis.com
  reason: CREDENTIALS_MISSING
```

# 解決方法
認証を使用する設定に変える。

```zsh
gcloud config set auth/disable_credentials false
```
確認

```zsh
$ gcloud config list
〜
[auth]
disable_credentials = false
〜
```

# 原因
認証を使用する設定になっていなかった。

```zsh
$ gcloud config list
〜
[auth]
disable_credentials = true
〜
```

# 背景
Cloud Spanner のドキュメントを手を動かしながら進めようとしてこうなりました。
GCP 使いこなせるようになりたい。
Linux で IronPython を使ってみる

（2024.2.15 更新）
.NET 8 + IronPython 3.4 に絞って内容を修正しました。
[IronPython の使い方に関する簡単な紹介記事](https://qiita.com/Mt_SQ/items/ddbcf39c19ad6591bd96)を投稿しました。(2024.2.19)

## はじめに
IronPython 3.4 を次の２台にインストールした際の記録です。
+ Chromebook ASUS CX1500CKA-EJ0015(Celeron N4500、メモリ4GB) + debian 11
+ Raspberry Pi 4 8GB + Ubuntu 22.04.3 （以下、ラズパイ）

## .NET Runtime 8 のインストール
IronPython 3.4 は .NET Runtime 6 以上で動作します。

私は .NET SDK をインストールしていますが、IronPython を使うだけの目的であれば Runtime だけのインストールで構いません。
#### 【Chromebook ASUS CX1500】
公式ドキュメントを参照します。

https://learn.microsoft.com/ja-jp/dotnet/core/install/linux-debian#debian-11

CX1500 の Linux 開発環境は Debian 11 + x64 アーキテクチャなので、上記説明どおりにパッケージリポジトリを追加するとパッケージマネージャーが使えます。

```bash:bash
sudo apt install dotnet-runtime-8.0
```
インストールの確認は
```bash:bash
dotnet --list-runtimes
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209885/69657080-2d6f-5ac4-ff63-9677f30835f7.png)
最低限 **Microsoft.NETCore.App 8.x.x** が確認できれば .NET Runtime のインストールは完了です。

#### 【ラズパイ】
ラズパイは arm64 アーキテクチャですので、手動インストールします。

まずはバイナリをダウンロードします。

https://dotnet.microsoft.com/download/dotnet/8.0

下のスクショで赤丸のファイルです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209885/f438a51d-071d-7c72-6e12-ea4bcb9bc4e9.png)

公式の手動インストール手順に沿います。といっても、ダウンロードしたファイルを展開してパスを通す程度です。

https://learn.microsoft.com/ja-jp/dotnet/core/install/linux-scripted-manual#manual-install

最後に~/.bashrc を編集し、再起動しておきます。
インストールの確認は CX1500 の場合と同じです。

+ [環境変数をシステム全体に設定する
(https://learn.microsoft.com/ja-jp/dotnet/core/install/linux-scripted-manual#set-environment-variables-system-wide)](https://learn.microsoft.com/ja-jp/dotnet/core/install/linux-scripted-manual#set-environment-variables-system-wide)

## IronPython 3.4 のインストール
こちらに解説されています。

https://github.com/IronLanguages/ironpython3/blob/master/Documentation/installing.md#installing-ironpython-released-binaries

手動でも簡単にインストールできるので、ここでは手動インストールを紹介します。

以下より *IronPython.3.4.1.zip* をダウンロードします。

https://github.com/IronLanguages/ironpython3/releases/tag/v3.4.1

展開したら `net6.0`, `lib` の２つのディレクトリを任意のディレクトリにコピーします。
以上で完了です。

```text:配置例
~/ironpython
└── 📁 3.4
     ├── 📁 net6.0
     └── 📁 lib
```
## 起動
dotnet コマンドに **_net6.0/ipy.dll_** を渡すことで起動します。
ただし、.NET 8 では **`--roll-forward LatestMajor`** が必要です。
```bash:bash
dotnet --roll-forward LatestMajor ~/ironpython/3.4/net6.0/ipy.dll
```
起動メッセージが表示されれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209885/0bcfd7fa-fdf5-892c-b5b4-f33613acff1e.png)
終了は、Ctrl + d です。
Javaを利用して既存のPDFドキュメントにページ番号を追加する方法


##背景
PDFドキュメントは世界中に広く使われていて、毎日無数のPDFドキュメントが人々に閲覧したり、処理したりしています。しかし一部のPDFドキュメントにはページ番号がないため、ユーザーが読むのは非常に不便です。この記事では、無料のPDF JavaコンポーネントであるFree Spire.PDF for Javaを使用して既存のPDFドキュメントにページ番号を追加する方法を紹介します。

##下準備
jarパッケージをインポートします

まず、Free Spire.PDF for Javaコンポーネントパッケージを**[ダウンロード](https://www.e-iceblue.com/Download/pdf-for-java-free.html)**して解凍し、次の2つの.jarファイルをlibフォルダーからJavaアプリケーションに引用します。

Spire.Pdf.jar
Spire.Common.jar
処理するドキュメントは次のとおりです。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/73d558bf-432d-35ee-1469-fcecdb65ae74.png)

##Javaコード一覧
```
import com.spire.pdf.PdfDocument;
import com.spire.pdf.automaticfields.PdfPageNumberField;
import com.spire.pdf.graphics.*;

import java.awt.*;

public class AddPageNumber {
    public static void main(String[] args)
    {
        //PDFをロードする
        PdfDocument pdf = new PdfDocument();
        pdf.loadFromFile("C:\\Users\\Administrator\\Desktop\\Input.pdf");

        //マージンを設定する
        PdfUnitConvertor unitCvtr = new PdfUnitConvertor();
        PdfMargins margin = new PdfMargins();
        margin.setTop(unitCvtr.convertUnits(2.54f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point));
        margin.setBottom(unitCvtr.convertUnits(2.54f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point));
        margin.setLeft(unitCvtr.convertUnits(3.17f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point));
        margin.setRight(unitCvtr.convertUnits(3.17f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point));

        //AddPageNumberメソッドを呼び出して、ページ番号を追加する
        AddPageNumber(pdf, margin);

        //ドキュメントを保存する
        pdf.saveToFile("AddPageNumber.pdf");
    }

    /**
     *
     * @param document
     * PDFドキュメント
     * @param margin
     * PDFドキュメントページの余白
     */
    public static void AddPageNumber(PdfDocument document, PdfMargins margin)
    {
        int pageCount = document.getPages().getCount();
        for(int i = 0; i < pageCount; i++)
        {
            PdfBrush brush = PdfBrushes.getBlack();
            PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Arial Unicode MS",Font.PLAIN,14),true);
            PdfStringFormat format = new PdfStringFormat(PdfTextAlignment.Left);
            int x = (int)document.getPages().get(i).getCanvas().getClientSize().getWidth() / 2;
            int y = (int)(document.getPages().get(i).getCanvas().getClientSize().getHeight() - margin.getBottom());
            Rectangle bounds = new Rectangle(x,y, 50, 20);
            PdfPageNumberField field = new PdfPageNumberField();
            field.setFont(font);;
            field.setBrush(brush);
            field.setStringFormat(format);
            field.setBounds(bounds);
            field.draw(document.getPages().get(i).getCanvas());
        }
    }
}
```
コードを実行し、生成されたドキュメントを開くと、結果は次のようになります：
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/f3c276cc-05f4-1d10-70e6-d47af96e2201.png)

以上は今回のPDFドキュメントにページ番号を追加する方法でした、最後まで読んでいただきありがとうございます。
Docker学習備忘録

# 基礎知識
##Dockerのメリット
チームの」個々人の開発環境と、本番環境を全く同じ環境を楽して作れる。
(OS、マシン,バージョンだったりの違いを気にする必要がない)

## バージョン確認
```
docker version
```

達筆者のバージョンは以下
 Version: 20.10.11


## Docker image
### 概要
コンテナの元となるもの。

### imageのダウンロード
Docker Hubのリポジトリから取得。

```
docker pull リポジトリ名(ex: hello-world)
```

### ホスト上のimageの確認
```
docker images
```

## コンテナ
### 概要
>標準化されたユニットにソフトウェアをパッケージ化します。コンテナには、ライブラリ、システムツール、コード、ランタイ>ムなど、ソフトウェアの実行に必要なすべてのものが含まれています。Docker を使用すると、どのような環境にもアプリケーションをすばやくデプロイおよびスケールでき、コードを実行することができます。
>https://aws.amazon.com/jp/docker/

### コンテナの作成
```
docker run <ホスト上にあるimage>
```

bash起動時は以下のオプションをおまじないとして付けるとよい。

```
docker run -it ubunts bash
```

-i : 標準入。オプション指定しないとstdinをオープンしない（入力を受け付けない）。
-t : 擬似端末

### コンテナの確認
アクティブなコンテナの確認。

```
docker ps
```
全てのコンテナの確認。
```
docker ps -a
```

## 実際に動かしてみる
コンテナの作成。imageがない場合はhubから取得される。

```
docker run -it ubuntu bash
```
exitでbashから抜ける。508535ce1e3dはランダム生成のコンテナID。

```
root@508535ce1e3d
exit
```

コンテナを確認すると、ステータスがExitedに。
docker restartでUpにする。

```
docker restart 508535ce1e3d
```

ステータスがUpになったコンテナに再度入る。

```
docker exec -it 508535ce1e3d bash
```
OpenCVのオプション変更、ssh接続する人はccmakeもいいかも！

この記事は[OpenCV Advent Calendar 2021](https://qiita.com/advent-calendar/2021/opencv)の1日目の記事です。
他の記事は目次にまとめられています。 

今日は大晦日ですが、気にせず参りましょう！

■ はじめに（モチベーション)
=============================

◯linux desktop上で行われる普通のOpenCVオプション変更
--------------------------------------------

OpenCVをcmakeでコンパイルするときに、cmakeのオプション変更はどうやっているだろうか？コマンドラインごりごりはともかく…　普通のやり方だとこんな感じではないだろうか？

```bash:desktop
$ cmake -S opencv-4.5.5/ -B build
$ cd build
$ cmake-gui .
$ make -j8
$ sudo make install -j8
$ sudo ldconfig
```

これが全部linux desktop上ならばまあ普通の作業だ。qt baseの設定画面が表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89434/dbdb34ff-09ee-bb48-25b5-44a724ec6d7a.png)

◯ssh termianl上で行われる普通のOpenCVオプション変更(めんどい)
--------------------------------------------

しかし、ssh接続で作業をしたい人からすると、途中でGUI/X上でcmake-guiを動かす必要があり、とたんに切り替え作業が発生する。 **思考が分断されるうう** ！

```bash:ssh
$ cmake -S opencv-4.5.5 -B build
```

```bash:desktop
$ cd ＜sshで作業していたフォルダ＞
$ cd build
$ cmake-gui . 
<GUI上でConfigurationを設定>
```

```bash:ssh
$ make -j8
$ sudo make install -j8
$ sudo ldconfig
```

ましてや、**全てのlinuxにGUIがあるとは限らない** のです。この設定変更のためだけに、X11やらなにやらをインストール？無駄ですよね……

ましてや、他でcmake-guiを実行してコピーしてくるとか、トリッキーなこともしたくない……　困ったもんだ。

◯SSH terminal上で、OpenCVの設定をWYSIWYGで変更したい!
-------------------------------------------------------

:::note info
WYSIWYGって、今日日聞かないな‥What You See Is What You Get, 、見たままのものが取得できる、ってことです.
:::


そこで今回は、tui版cmake-guiともいえる、cmake-curses-guiを紹介したい。あ、tuiとはterminal user interfaceだと思います。

helpを見ると、`Welcome to ccmake, curses based user interface for CMake.` とのこと。


■ ubuntu21.10での導入方法
=======================

いつも通り、ubuntuだったらaptで導入できる。簡単、ヤッター！

```
sudo apt install cmake-curses-gui
```

■ ccmakeを使ってみる
===================
こんな感じで、全部terminalで完結できる、素敵！

```bash:ssh
$ cmake -S opencv-4.5.5/ -B build
$ ccmake build
$ make -j 8
$ sudo make install -j8
$ sudo ldconfig
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89434/59c61daa-8ada-e1f5-fd34-29b8f5e6fe3f.png)

◯ ポイント
-----------
どうやら、現状の設定を保存だけする機能は無いっぽい。

`[c] Configure` ⇒ `[g] Generate` の順番に実行。

ここで、configureをやらないとGenerateが生えてこないので要注意。

以下、ccmakeのヘルプより引用

```plaintext
 Commands:
  q : quit ccmake without generating build files
  h : help, shows this screen
  c : process the configuration files with the current options
  g : generate build files and exit, only available when there are no new options and no errors have been detected during last configuration.
  l : shows cmake output
  d : delete an option
  t : toggles advanced mode. In normal mode, only the most important options are shown. In advanced mode, all options are shown. We recommend using
 normal mode unless you are an expert.
  / : search for a variable name.
```

■ まとめ
=========

`ssh接続`で使っているユーザーの皆さんは、`cmake-gui` の代わりに、`ccmake`を使うと、ちょっとだけ幸せになれるかもしれません（ごりごり make Optionでどうこうする派でなければ）

以上になります。
【2021年版】エンジニアがよく閲覧する情報収集サイトとは？【分析してみた】

# はじめに
本記事では、下記の悩みに答えます。

* エンジニアとして、日々情報収集をしたいけど、どのサイトを確認するべきなのかな。
* エンジニア関連の情報ってどこのサイトで得られるのかな。
* エンジニアがよく閲覧している情報収集サイトを知りたい。

# 本記事の対象者
ITエンジニア(特に情報収集が好きな人)

# 分析方法
分析方法に関してですが、下図のように分析しました。

![分析方法.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1801139/e16a3642-a6ad-2f7a-a14d-25431d2d3122.jpeg)

上記の分析方法の各流れに関して、以降で簡単に説明しますね。

## はてなブックマーク
分析する対象として、「はてなブックマーク」を選びました。
「はてなブックマーク」を分析対象として選んだ理由は、以下のためです。

* 「はてなブックマーク」を利用しているサイトが多いと感じているため
* 「[その日多くブックマークされたサイト](https://b.hatena.ne.jp/hotentry/it/20211230)」を紹介するページがあるため

はてなブックマークの詳しいサービス内容に関しては、以下を参照してください。
[参照：はてなブックマークとは(公式サイト)](https://b.hatena.ne.jp/guide)

## データベース(SQLite)
はてなブックマークの「テクノロジー」ページに掲載された下の情報を取得し、データベースに格納するPythonプログラムを実装しました。ちなみに、2021年1月1日から2021年12月28日までの下記情報を取得しました。

* テクノロジー(エンジニアな方は、テクノロジー部分を見るだろうという想定)
* ブックマーク数(下図の赤枠部分)
* ブックマークされたサイトのURL(下図の黄緑枠部分)

![はてなブックマークで利用する情報.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1801139/cedf5398-4887-9c8c-c7f2-78dbfa7f40bc.jpeg)


はてなブックマークから情報を取得するPythonプログラムは、以下のサイトを参考にして実装しました。

* [ChromeのHTTPリクエストをcURL形式で取得する手順](http://kakedashi-xx.com:25214/index.php/2021/04/13/post-2230/)
* [curlコマンドをPythonプログラムに変換する手順](http://kakedashi-xx.com:25214/index.php/2021/04/11/post-2219/)
* [PythonでXPathを使ってスクレイピングする手順](http://kakedashi-xx.com:25214/index.php/2021/04/18/post-2260/)

ちなみにSQLiteを使った理由としては、「今まで使ったことがなかったから」です。
Pythonを使った理由としては、「自分がサクッと利用できる言語だから」です。

## 集計
SQLiteに格納したデータを用いて、Pythonで以下のように集計しました。

1. SQLiteからデータ取得(ブックマーク数、サイトURL、日付)
1. サイトURLからドメイン部分を抽出(例：https://qiita.com/xxxxからhttps://qiita.comを抽出)
1. 日付をもとにして集計

ちなみに、以下のサイトを参考にして、PythonでSQLiteを使いました。
[PythonでSQLiteを利用する方法](https://docs.python.org/ja/3/library/sqlite3.html)

```
上記の流れで、「エンジニアがよく閲覧している情報収集サイト」を分析してみました。
```

# 分析結果【エンジニアが情報収集でよく閲覧するサイトTOP10】
分析結果をご紹介しますね。
分析したところ、「エンジニアが情報収集でよく閲覧するサイトTOP10」は、以下のようになりました。

## 10位 ログミー
https://logmi.jp

## 9位　TechCrunch
https://jp.techcrunch.com

## 8位　Engadget
https://japanese.engadget.com

## 7位　ガジェットを紹介している海外のサイト
https://omar.website

## 6位 Zenn
https://zenn.dev

## 5位 Qiita
https://qiita.com

## 4位 ASCII
https://ascii.jp

## 3位 てくなべ
https://tekunabe.hatenablog.jp

## 2位　gigazine
https://gigazine.net

## 1位 Fox on Security
https://foxsecurity.hatenablog.com


# まとめ
いかがでしたでしょうか？
「はてなブックマークを用いて、エンジニアが情報収集に利用しているサイトを明らかにする方法」を解説しました。

個人的には、「こんなサイトもあるのか！」と気づきを得られたので、今回の分析結果に関しては、「かなり満足」しています。

本記事が、少しでも皆様のエンジニア生活（主に情報収集面）に貢献できれば幸いです。


# 今後の展望
つよつよエンジニア(エンジニアとしてスキルセットが高い人)が、「情報収集のためにどのような情報媒体を利用しているのか？」を明らかにしたいです。
Crystalに実験的なREPLが導入される

Crystal言語を触っていて、Rubyと開発体験が違うなと感じていたのは、REPLの有無でした。Rubyではirbやpryを使いながらコードを書くのが普通だと思いますが、Crystalは静的言語なのでREPLがありませんでした。

しかし、Crystal公式からついにREPLがCrystal本体に搭載されることが発表されました。すでにマスターにはマージされており、自分でCrystalをコンパイルすれば利用することができます。（コンパイル時に `make interpreter=1` とフラグを指定します。2021年12月31日の時点では、まだ公式のパッケージには含まれていないようです。）

詳しい内容については下記の公式ブログを参照ください。

https://crystal-lang.org/2021/12/29/crystal-i.html

この記事は以上です。
Excel VBA のモジュールを一括保存する VBA コード

ADINとして忍ばせておくと意外と重宝する。

```vb:ExportModule.bas
'［セキュリティセンター／マクロの設定］の
'［VBA プロジェクト オブジェクト モデルへのアクセスを信頼する］に
' チェックを入れておく。
```

```vb
Option Explicit

'// アクティブブック（アクティブブックがない場合はこの Module が書かれているブック（ADINなど））
'// の全モジュールをエクスポート

Sub SaveModule()

    Dim parentFolder As String   '-- 親フォルダのパス
    parentFolder = "C:\VBA\Excel"

    '-- アクティブブックがない場合
    Dim bookName As String       '-- ブック名   
    If ActiveWorkbook Is Nothing Then
        bookName = ThisWorkbook.Name
    Else
        bookName = ActiveWorkbook.Name
    End If

    Dim bookBaseName As String   '-- 拡張子を除いたブック名
    Dim saveFolder   As String   '-- 保存フォルダ
    Dim xlMod        As Object   '-- モジュールオブジェクト
     
    With CreateObject("Scripting.FileSystemObject")
        bookBaseName = .GetBaseName(bookName)
        '-- ブック名＋日付を保存フォルダ名にする。
        saveFolder = MakeFolder(.BuildPath(parentFolder, bookBaseName & "_" & Format(Date, "yyyymmdd")))
        For Each xlMod In Workbooks(bookName).VBProject.VBComponents
            xlMod.Export .BuildPath(saveFolder, xlMod.Name & GetModuleExt(xlMod.Type))
        Next xlMod
    End With

    '-- 保存フォルダを開く
    Shell "explorer.exe " & saveFolder, vbNormalFocus

End Sub
```

```vb
'// モジュールタイプに対応する拡張子を返す

Private Function GetModuleExt(ByVal module_type As Integer) As String

    Select Case module_type
        Case 1
            GetModuleExt = ".bas"
        Case 2, 100
            GetModuleExt = ".cls"
        Case 3
            GetModuleExt = ".frm"
    End Select

End Function
```

```vb
'// 作成したフォルダのパスを返す

Private Function MakeFolder(ByVal folder_path As String) As String

    CreateObject("WScript.shell").Run "cmd /c md " & chr(34) & folder_path & chr(34), 0, True
    MakeFolder = folder_path

End Function
```

［更新履歴］
---
+ ［2022/01/07］SaveModuleプロシージャのエラートラップ修正
URLはどうしてぐちゃぐちゃになるの😡

皆様はURLを共有する時にこちら↓のようになったことはありませんか？

**https://〇〇.com/%E3%83%9B%E3%83%BC%E3%83%A0%E3%83%9A%E3%83%BC%E3%82%B8**

**こら〜〜〜〜😡😡😡
なんてスマートじゃない長さ😡😡😡
許せない😡😡😡**

今回は**どうしてこんな長さになってしまうのか**について簡単に説明していきます。

#パーセントエンコーディング
先ほどのようなURLを見ると
「**文字化けした**」
と言われる方が稀にいますが、これは文字化けではなく**「パーセントエンコーディング」**または**「URLエンコーディング」**と呼ばれるものになります。

##パーセントエンコーディングとは
パーセントエンコーディングは、URIの中に**「使用できな文字列」が含まれた際になんとかその文字列を決められた（使用できる）文字列だけで表現しようとする方法**のことです。
ちなみにURLとURIの違いについてはこちらの記事が最強にわかりやすいです↓

https://ferret-plus.com/4637

##エンコード方法
実はURLでは日本語文字などの非アスキー文字や、空白文字などの記号はURIとしては使用できません。
そのため、以下のような手順で使用できる文字に変換（エンコード）します。

1.使用できない文字列を16進数の文字コードに分解
2.文字コードの各バイトを「**%XX**」という文字列への変換(XXは十六進数)
3.変換した文字列をURLに載せる

例えば、「にほん」という文字列を変換すると・・・
※UTF-8の文字コードに準拠

**に　→　E381AB**
**ほ　→　E381BB**
**ん　→　E38293**

となり、各バイトを％で区切ると・・・

**に　→　%E3%81%AB**
**ほ　→　%E3%81%BB**
**ん　→　%E3%82%93**

となるので、それらをつなげて

**にほん → %E3%81%AB%E3%81%BB%E3%82%93**

となります！
ということで、本記事の最初に掲載していたURLをデコードしてみると・・・

**%E3%83%9B%E3%83%BC%E3%83%A0%E3%83%9A%E3%83%BC%E3%82%B8**

**→E3839B / E383BC / E383A0 / E3839A / E383BC / E382B8**

**→ホ / ー / ム / ペ / ー / ジ**

となります。※文字コードの変化は以下サイトが便利です。

http://ash.jp/code/unitbl21.htm

##回避方法
**URLは全部半角にする。**

これに越したことはないです。

**全角は敵だと思っていてください。**
コレクションの理解を深める

##　ArrayList 
- ArrayListの書き方について、下記どちらの書き方でもOK！！なのでもちろん短い方がよさそう！

```java
List<Integer> list = new ArrayList<Integer>();
List<Integer> list = new ArrayList<>();
```

- 基本データ型は格納できない　例：int
- addメソッドは第一引数にインデックスを指定して上げることができ、挿入する位置を指定できる
- setメソッドは上書きできる
- containsで指定要素が含まれるか判定できる
- indexOfメソッドで指定要素が何番目にいるか判定できる
Reactを基本からまとめてみた【21】【Vite】

```
# npm の場合
% npm init vite

# yarn の場合
% yarn create vite
```
1. react を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939638/1ce7a2fa-f306-e99a-0289-8bae8ee00185.png)

2. react-ts を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939638/9c66fb86-3210-a6ff-1a84-77097185365d.png)

```
Scaffolding project in /Users/zenn/Downloads/zenn...

Done. Now run:

  cd zenn
  yarn
  yarn dev

✨  Done in 10.32s.
```

3. 指示にしたがう

```
% cd zenn
% yarn
% yarn dev
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939638/440b2e6e-0fab-495f-e183-6f2d70280976.png)


##参考サイト
[Vite で最速 React & TypeScript]
(https://zenn.dev/sprout2000/articles/98145cf2a807b1)
macOS Monterey(12.0.1)にapacheとphpを設定する

Montereyからapacheのデフォルトでphpがオフになってしまった。
いろんなサイトで情報を継ぎはぎしたので、自分の場合、うまくいった方法をメモる。

brewを更新

```
$ brew update
```

#H2 apacheをインストール
```
$ brew install apache2
```

/usr/local/etc/httpd/httpd.confの以下を設定/変更。
 * Listenを80
 * Servernameをlocalhost:80
 * mod_include.so がコメントアウトしてあるので、有効化する。
 * DocumentRootを設定する

apacheをリスタートする。

```
$ sudo apachectl restart
```

#H2 PHPをインストール
元々、php 8.1が入ってたんだけど、どうやってもapacheとの連携ができなかったので、7.4バージョンを落として環境を作った。

```
$ brew uninstall php
$ brew install install php@7.4
```

/usr/local/etc/httpd/httpd.confの以下を設定/変更。
LoadModuleいっぱい書いてあるブロックの下の方に以下を追記。

```
LoadModule php7_module /usr/local/Cellar/php@7.4/7.4.26_1//lib/httpd/modules/libphp7.so
```

IfModule mime_moduleの項目に以下を追記。

```
AddType application/x-httpd-php .php
```

apacheを再起動したら、phpinfoは動きました。
java localdatetimeクラスを理解

- 僕たちが普段使う分にはlocaldatetimeで問題ないみたい。
- タイムゾーン情報がない
- nowメソッドで現在日時取得
- ofメソッドで時間を指定できる
- durationクラスとperiodクラスで２つの日時の間隔を格納することができる
ssize_tについて

mrubyでssize_tが使われてコンパイルエラーになってしまいました。

issueを上げてみたのですが、matzさんが対応してくれました。

https://github.com/mruby/mruby/issues/5617

環境はgcc4+newlib3です。

C言語のintやlongはCコンパイラーの中で解釈されます。

しかしssize_tはコンパイラーの中ではなくて、libcのヘッダーで定義されたものになります。newlib3の場合

```c:newlib/libc/include/sys/types.h
typedef _ssize_t ssize_t;
```

となっています。_ssize_tは

```c:newlib/libc/include/sys/_types.h
typedef long _ssize_t;
```

となっています。

これまでmrubyでlibcのsys以下のヘッダーをincludeしているのはsrc/gc.cだけでした。

libcはnewlibが代表的な実装になりますが、他にもいろいろあります。私はsys以下のヘッダーはlibcの実装に依存する可能性が高くなりできる限り使わないほうが良いのではないかと思います。
VBA : ファイル名操作、特定の記号追加 （見たよマーク）

## はじめに

多くの人からファイルを提出してもらい、内容を確認したデータから **(事務局 確認済み)** とファイル名に印をつけていくような仕事をしています。自分にとっては刺身の上にタンポポを乗せる仕事よりも責任を感じる重要な仕事だと考えていましたが、「それ、自分でもできますよ(by エクセル)」との事で。

人工知能の高度化によって日々お払い箱になっていくのでしょうか...。

といったように、内容が定型化できない地味な情報集約でも確認済みのファイルに印をつけわかるようにしておく状況が多く存在しております。

## こんな時に使える

- 確認済みのファイルには印をつけておきたい

### 期待される動き

関係者が全員アクセスできるフォルダにファイルが提出されるとして、エクセルのマクロを使用して順番にデータを取り込むなどの印をつける作業をするとします。

```
提出ファイル(営業部).xlsx
提出ファイル(技術部).xlsx
```

提出が確認されたファイルには下のような●をつけるとしましょう。すると下記のようにファイルに全て●がつきます。

```
提出ファイル(営業部)●.xlsx
提出ファイル(技術部)●.xlsx
提出ファイル(企画部).xlsx
```

さらに別の部署からファイルの提出がありました。このファイルだけ取り込むなどの作業がマクロで行われる等のあと、運用次第では確認が2回目であることを明示したいときは●を二つつけたりしますね。

```
提出ファイル(営業部)●.xlsx
提出ファイル(技術部)●.xlsx
提出ファイル(企画部)●.xlsx
```

## ソースコード

```vb:標準モジュール内に記載
Option Explicit
Private Const HANAKUSO As String = "●" ' 見たよマーク
' 見たファイルの末尾に見たよマークをつける
Public Function addMitayo(str As String, _
        Optional flgCHAR As String = HANAKUSO, _
        Optional surpressDup As Boolean = False) As String

    Dim posLastDot As Integer
    Dim strExt As String

    ' ファイル名を調べ拡張子以外の文字数を調べる
    posLastDot = InStrRev(str, ".")
    strExt = Right(str, Len(str) - posLastDot)

    ' 動くかな？未検証
    If surpressDup Or Mid(str, posLastDot - 1, 1) <> flgCHAR Then
        addMitayo = Left(str, posLastDot - 1) & flgCHAR & "." & strExt
    Else
        addMitayo = str
    End If

End Function
```

変数 HANAKUSO に別の文字列を用意すると、別の見たよマークをつけることができます。
【ERROR!!!】ValueError: badly formed hexadecimal UUID string

# 目的
DjangoRestframeworkを使って、APIの実装を行うこと。
そのためにモデルのマイグレーションを行いたいが、```ValueError: badly formed hexadecimal UUID string```のエラーによって困っている。
# 結論
既にidがuuidでないレコードが存在する場合はそのレコードを削除すると無事にマイグレーションが行える。

# 実施環境
### ハードウェア環境
| 項目 | 情報 |
|:-:|:-:|
| OS  |macOS Catalina(10.15.7)   |
|ハードウェア   |  MacBook Air (11-inch, Early 2015) |
|プロセッサ   | 1.6 GHz デュアルコアIntel Core i5|
|メモリ   |  4 GB 1600 MHz DDR3 |
|グラフィックス   |  intel HD Graphics 6000 1536 MB |
### ソフトウェア環境
| 項目 | 情報 |
|:-:|:-:|
| homebrew  | 3.3.8 |
| mysql | Ver 8.0.27 for macos10.15 on x86_64 |
| python  | 3.8.12 |
| django  | 3.1.2 |
| anaconda  | 4.10.1 |
| pip  | 21.2.4 |



# 経緯
djangoのmodels.pyのidフィールドを元々ただの自動採番の数字(1,2,3...)にしていたが、idは外部から読まれないようにuuidかつ編集不可に設定しようと思い、下記のように設定した。

```
id = models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True)
```
しかし```ValueError: badly formed hexadecimal UUID string(16進数UUID文字列の形成がうまくできない)```このエラーが表示されてしまったという経緯だ。

# 原因究明
少し調べると役に立ちそうな情報を見つけた。

> The problem is that I had an existing record in the DB with a default integer autoincrement id, before I had specific that the id field on my model was a UUIDField. The value of this field was just 1, which was not a valid UUID hex string.
Removing this record fixed my issue.

おそらく自分も同じようにidをuuidにする前に、自動採番のidのレコードをいくつも追加していたため、これが原因であるとわかった。
models.pyでdefault=uuid.uuid4と設定しているにも関わらず、既存のコードはuuidではなかったため、このようなエラーが出ているようだ。


# 解決

上記のコメントと同様に、mysqlにログインし、既存のレコードを削除していく。

```
mysql> delete from users where id=1;
```
もう一度マイグレーションを実行してみる。

```
$ python manage.py makemigration
$ python manage.py migrate
```
無事マイグレーション完了！！解決！！
眼鏡っ娘か、眼鏡っ娘ではないか？それが問題だ


# はじめに
この記事は[創作+機械学習 Advent Calendar 2021](https://adventar.org/calendars/6442) の記事です。アドベントカレンダー31日目にしての投稿になってしまった上に完全に途上の記事ではありますがとりあえず手を動かしたので共有します。コードは現時点では貼ってませんが後で貼るかもしれません。
もし、この記事を見て「こっちの手法を使ったら良いんじゃないか」「こういうデータもあるとうまくいくんじゃないか」的なアドバイスがありましたら教えていただければと思います。
※使っている手法が概ね出現頻度を加工して使っているだけ(tf-idfもどき)なので、もしかしたら機械学習というよりデータ分析の範疇かもしれないです。もし趣旨に沿っていなければお手数ですがカレンダーからremoveしていただければと思います。


# ポエムとモチベーション
あなたは眼鏡っ娘はお好きですか？私は超好きです。最近の話題作だとゆるキャンの大垣千明や各務原桜さんや鳥羽先生、ウマ娘にもビワハヤヒデやイクノディクタスといったキャラクターが名を連ねています。ゆるゆりの千歳やまどマギのほむほむ(メガネの姿)も好きです。更に新規開拓をしようと「眼鏡」「メガネ」のタグをクエリにpixivで日夜検索するというのはあるフェティシズムを持った人間にとって日常的なことでは無いでしょうか。

しかし、このようなフェティシズムを起点に作品を探すという仕草をするには少々現状には問題があります。それは**あるキャラクターの創作に属性が紐付いてるケースというのはあまり多くはない**という問題点です。
例えば、タグ「イクノディクタス」で調べると789件ですがタグ「イクノディクタス 眼鏡」で調べると42件しか出てきません。このことから
一般に属性ベースでキャラクターを探すのは中々に難しいかと思います。

このような状況が発生する原因については例えば以下の様の感じでしょうか
1. 一般にキャラクターxxが属性yyを持っていることはファンにとって自明である
2. 二次創作はファンに対して行われるものである
3. それ故にわざわざ属性のタグ付ける必要がない

この状況はキャラの属性からキャラを発見する機会の損失、またその延長にある作品自体にのめり込むといった機会の損失につながるのでは無いか私は考えます。
ということで、**属性的特徴からキャラクターを引けるようにする**ことを目的にあるキャラクター、およびそのキャラクターが出てくる作品のタグ情報を分析していきたいと思います。なお、今回は属性=主に外見的属性を示します。(例:メガネ、メイド、巫女)

# 目標

## 究極目標
- あらゆるキャラクターについて、実際には付随している属性から逆引きしてキャラクターを発見できるようにする
- 「作品」に出てくる「キャラクター」に「属性」のタグを付与することを目的とする
    - 例: 江戸川コナン→眼鏡 野比のび太→眼鏡 博麗霊夢→巫女 

## 今回の目標
- 究極目標のための第一歩として、ゆるキャンの登場人物の一人である大垣千明(眼鏡っ娘)について「メガネ」のタグの紐付けをタグを分析することによってできるようになる
- 作品→ゆるキャン キャラクター→大垣千明 属性→メガネ
   
 
# 用意したデータ
- そのキャラクターが出てくる作品について、以下の2軸でデータを分け、計2*2区分のデータを用意した
    - 作品がイラストか小説か (イラスト、小説)
    - 対象キャラクターのタグが含まれているか否か(対象、非対象 とする)
- 非対象のデータについては多すぎて全量取ってくるのが大変だったのでランダムにをピックアップ
- データの内訳は以下の通り
    - イラスト_非対象:885件
    - イラスト_対象:885件
    - 小説_非対象:360件
    - 小説_対象:68件


# 実験1
## 概要
- キャラクターの外見的特徴を表すタグはイラストに比較的付き、ノベルにはあまりつかないという仮説を立てた
- そのため、タグの出現割合について 小説_対象 - イラスト_対象 で差分を取れば差の大きさ上位 = キャラの外見的特徴を表すタグが抽出できるのでは無いかと考えた

## 実験1_方法
1. 各データについて各タグの出現頻度を集計
1. タグの出現頻度を割合に変換
1. 各タグについて イラスト_対象における割合 - 小説_対象における割合を計算
1. 上位に来たものを確認した


# 実験1の結果について
- 目的の「メガネ」のタグが9番目に来てます。
- 逆にそれより上に来てるタグについては「ゆるキャン」「野外活動サークル」といった**ゆるキャン△の創作全般に出てくるであろうタグ**であることが見受けられます(作品特有性が高いタグ)
    - こういったタグは除去したい
    - 一方、今回抽出を目的としているタグである「メガネ」やその他の属性は作品特有性は低いと考えられる
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100303/432762ae-b8bd-3ca1-84bc-b218c865a441.png)

# 実験2
## 概要
- 実験1の結果から作品に特有のタグがノイズになっているようである
- 作品特有のタグを除去するために、タグの作品特有性を計算し利用することを考えた

## 実験2_方法
1. データ「イラスト_非対象」について各タグの出現割合を集計
1. 各タグについて  実験1の結果 - 「イラスト_非対象」におけるタグの出現割合を計算
1. 結果について上位を確認した


## 実験2の結果について
- 「メガネ」のタグが9番目から6番目に来てるので結果は改善
- 一方でゆるキャン△の創作全般に出てくるであろうタグの除去はしきれなかった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100303/0143b013-1fbf-ac62-ddb4-faf791f9841e.png)

# 今後の展望
-  「作品名とある属性の共起回数」と「作品関係なしのある属性の出現回数」を元に、タグの作品特有性を計算し使用
    - タグの作品特有性を求めるならこっちの方が正しそうですね 
- メガネ以外の属性のキャラ、また別の作品についても同一手法を適用してどんな結果になるかを見てみる
    - 特にキャラ数が多い作品、属性がそもそもニッチな場合に適用してみたい
- 最終目標:色々な作品、色々なキャラに適用しメガネのデータベースを作る
    - 作れたら良いな

# 最後に
- 完全に途上のものを締め切りを過ぎ、年の瀬に上げてしまって本当に申し訳ないです
- ロジックやら解決しようとしていることに穴があると思うのでガンガン指摘していただければと思います
- メガネっ娘はいいぞ
#programming　#html　#css　#Javascript　#　ゲーム外でマップを見るツール

本内容を利用した場合の一切の責任を私は負いません。

# 機能
ゲームのマップは大きいこともあって、ゲームの独自のUIによって見ることができるようになっている。
このため、ゲームを起動せずに、ゲームを使わずにマップを見ることができない。
当然、ゲームが使えなくなっても見ることができない。
マップのスナップをタイル状に取得し、それをブラウザ上に並べてマップのように見るためのツールです。
(スナップはゲーム上で予め取得しておく必要があります。
通常の任意ウィンドウスナップ(Windowsキー+Altキー+PrintScreenキー)で構いません。)
ゲームにレイヤーがある場合、レイヤー切り替えにも対応しています。
(当然、その場合はレイヤー分のスナップも予め取得しておく必要があります。)
欠けないことを意識するくらいで、ドット単位の正確なタイルである必要はありません。
(もちろん、その分、見やすさは下がります。)

# ブラウザ
Google Chrome
バージョン: 96.0.4664.110（Official Build） （64 ビット）

# スナップファイル名のルール
下記のルールに合っている必要があります。
`<横位置>,<縦位置>[,<レイヤー>][.拡張子]`
位置は、マップ左上を横0、縦0で、右に行くと横が増加、下に行くと縦が増加した値です。
例えば、左上の右は1,0になります。
レイヤーが無い場合はカンマを含めてファイル名に含めないようにして下さい。
レイヤーの基点も0です。
拡張子は必ずしも必要ではありません。
というのは、ブラウザがファイル内容を自動判別する場合があるためです。
(ChromeはPNGファイルの拡張子を削ってもPNGとして認識する。)

# バージョン
* ブラウザ
Google Chrome
バージョン: 96.0.4664.110（Official Build） （64 ビット）

# 準備
1. 下記のリポジトリをダウンロード  
[https://github.com/github895439/MapViewer](https://github.com/github895439/MapViewer)
1. ダウンロードしたものを展開

# リポジトリの内容
* ONI_Mission5フォルダ  
サンプルデータです。

# 使い方
1. ブラウザでMapViewer.htmlをオープン
1. フォームに入力するか、「設定ロード」ボタン押下
1. 「ビューオープン」ボタン押下
1. ビューウィンドウをキーで操作  
"k: キー割り当てを表示",  
"i: 現位置を表示",  
"h: ホームへ移動",  
"w: 上へ移動(半スナップ分)",  
"a: 左へ移動(半スナップ分)",  
"s: 下へ移動(半スナップ分)",  
"d: 右へ移動(半スナップ分)",  
"1～0: ショートカットへ移動",  
"zxcvb: レイヤー0～5を表示",

# 補足
ファイル名以外の位置情報は、半スナップ単位です。
例えば、ホーム2,10という位置は、ファイル名1,5になります。
iキーの情報も半スナップ単位の値です。
当然、サンプルデータのスナップを変えて、ファイル名をスナップファイル名のルールに従った名前にすれば他のマップも見れます。
ブラウザ上での動作で設定をファイルに保存することができないため、texareaタグ内にJSONで保持しています。
これをファイルに保存し、保存したものをtexareaタグに貼って「設定ロード」ボタンを押せば、同一動作を行えます。

# 主な履歴
無し。
健康：「体に良い」「体に悪い」の正体はどちらでもないということ　～水素水の例～

#導入
ニュースやテレビ、新聞やネットの健康についての記事で「体に良い」「体に悪い」という表現がたくさんある。しかし、生物は、科学の観点ではとても複雑な仕組みであり、1＋1＝2のように簡単に表すことができません。複雑なため、「体に良い」「体に悪い」と専門家が断言できることは少ない。

#体に良いとは？
実際に「体に良い」や「体に悪い」ことは図1のような状態のときに説明できる。
体に良いといっても、体調が悪くなる場合もある。逆に体に悪いと言われることも健康になることもある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480551/01bad0a7-f443-4cba-8f6e-5fea3199a05b.png)
図1　体に良い悪いの考え方

図1を見て感じていただきたいことは健康になる場合も、体調が悪くなる場合も両方含まれるということ。逆に、体に悪いとされていることも、一部の事例では健康になる事例もある。

#例えば水をたくさん飲むこと
体に良い事例だと、例えば「水をたくさん飲むこと」は体に良いとされている。実際に「1日2L飲みましょう」ということが言われており、水は生物に必須なものなので水を飲むことは健康になることがかなり多い。しかし、体調が悪くなる場合は、短時間に大量に飲む場合はおしっこに流れるだけ(変化なし)であったり、おしっこで排出することができないほど大量に飲むと体を壊したり、最悪の場合、死ぬ場合もある(体調が悪くなる)。

#例えば水素水
図1で示した割合に目盛りを記載していないのは意図的なもので、「体に良い」「体に悪い」とされることによっては上記以外の割合になる場合がある。例えば、「水素水は体に良い」といわれているが、実際は図2のように緑色の「変化なし」がほとんどである。実は、極々一部の事例で健康になることを取り上げて、あたかも水素水を飲むとすべての場合で体に良いと言われている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480551/2a8a8882-7e30-3399-c374-897849c62efc.png)
図2　水素水の考え方

#結論
以上のように ニュースやテレビ、新聞やネットの記事で「体に良い」「体に悪い」という表現を見つけたときにこの図を思い出して欲しい。その用言の中には水素水のようなものを体に良いと主張しているものがたまにあるので、「どれぐらいの割合で体に良いの？」と自分で調べることが大切である。
**結局は程度の問題なのである。**
機械学習で使えるモデルまとめ

scikit-learnを使いながら、機械学習について基礎から学んでいるところです。機械学習のモデルは数多くあるので、主要なものをまとめておきます。学びを進める過程で、随時加筆していきます。

#教師あり学習
元になるデータとともに、回答情報も与えて学習させる方法。

## 回帰
株価や売上高、得点などの数値の場合に使うモデル。

<dl>
  <dt>線型重回帰分析</dt>
  <dd>一次式で表すことができるモデル。学習前に特徴量を手動で選択した上で、外れ値をデータから除いておく必要がある。</dd>
  <dt>リッジ回帰分析</dt>
  <dd>線形重回帰分析における学習後の係数が小さくなるように学習をさせるモデルの一つ。重回帰分析よりテストデータでのごさを小さくしやすい。</dd>
  <dt>ラッソ回帰分析</dt>
  <dd>線形重回帰分析における学習後の係数が小さくなるように学習をさせるモデルの一つ。不要な特徴量
については係数を0にすることができるため、意味のある特徴量を選択するためにも利用できる。</dd>
  <dt>回帰木分析</dt>
  <dd>二分木の形で表すことができるモデル。各分岐の正解データの平均値を予測結果とする。分岐条件が多くなる傾向があるため、ランダムに条件のサンプリングをする処理を行う。</dd>
  <dt>ロジスティック回帰分析</dt>
  <dd>各分類に当てはまる確率を算出する計算式を学習していくモデル。</dd>
  <dt>ランダムフォレスト分析</dt>
  <dd>複数の分類木分析を組み合わせ多数決をとらせるアンサンブル学習型（複数のモデルを組み合わせる方式)のモデル。</dd>
</dl>

## 分類
データをいくつかの区分に分ける場合に使うモデル。結果がYes/Noやいくつかのグループに分類される場合に使う。

<dl>
  <dt>分類木分析</dt>
  <dd>二分木の形で表すことができるモデル。外れ値の影響は受けにくいが、データ間の不均衡への考慮が必要。分岐条件が多くなる傾向があるため、ランダムに条件のサンプリングをする処理を行う。標準化処理はほとんど影響がない。</dd>
  <dt>ロジスティック回帰分析</dt>
  <dd>各分類に当てはまる確率を算出する計算式を学習していくモデル。</dd>
  <dt>ランダムフォレスト分析</dt>
  <dd>複数の分類木分析を組み合わせ多数決をとらせるアンサンブル学習型（複数のモデルを組み合わせる方式)のモデル。</dd>
</dl>

#教師なし学習
正解がない状態でデータをモデルに渡すことで、それをグループ分けしたり、有益な別の情報を付加するよう学習を進めるモデル。

## 次元削減
データのいくつかの列を参考に新たな概念情報を付加する。例えば個人情報やこれまでの自己情報から、保険金を決定するための新たなスコアを計算するなど。

<dl>
  <dt>主成分分析</dt>
  <dd>次元削減において最も代表的な手法。新しい軸での分散が大きくなるような軸を学習する。</dd>
</dl>

## クラスタリング
データをいくつかのグループに分ける。これにより、例えばマーケティングでグループごとにアプローチ方法を考えるなどの戦略立案に利用できる。

<dl>
  <dt>k-means法</dt>
  <dd>クラスタリングにおいて一番有名な手法。事前にいくつのクラスタを作成するかを決める必要がある。</dd>
</dl>

##補足
機械学習の上での基本的な情報も載せておきます。

:::note
学習データの20〜30％のデータは学習結果の評価用に使う
学習結果として80%を超えるとうまく学習できていると言える
:::

---

<<参考>>『スッキリわかる機械学習入門 掲載コード』

https://sukkiri.jp/books/sukkiri_ml#downloads
【PHP】filter_inputを使用したサニタイズ

#背景
ユーザーからの入力を取得することは基本だと思うので、学んだついでに自分の忘備録として書いています。
#フォームからの入力
入力フォームでユーザーが入れた値を、取得する。

```html:メモの入力画面
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>メモの入力</title>
</head>
<body>
    <form action="input_do.php" method='post'>
        <textarea name="memo" cols="50" rows="10" placeholder="メモを入力してください"></textarea>
        <br>
        <button type="submit">登録する</button>
    </form>
</body>
```
```PHP:入力を登録する操作
<?php
    //MAMPを使用しlocalhostに、あらかじめ作ったmydbというデータベースに接続
    $db = new mysqli("localhost:8889", "root", "root", "mydb");


    $memo = $_POST["memo"];
?>
```
このように、入力された値をそのままスーパーグローバル変数の

```PHP:
$_POST["memo"];
```
で受け取ってしまうと、SQLインジェクションなどをされてしまう恐れがあるため、値をチェックするために `filer_input()`メソッドを使用します。ここでは、以下の通りに書きます。

```PHP:
filter_input(INPUT_POST, 'memo', FILTER_SANITIZE_SPECIAL_CHARS);
```
引数は今回３つあり、
第一引数：入力のタイプ（GETやPOST、COOKIE、SERVE、ENVがある）
第二引数：フィルタリングしたい変数の名前（ここでは 'memo' ）
第三引数：適用するフィルタのID（省略した場合、何もフィルタリングされないので注意）

戻り値は、成功した場合はフィルタリングした変数の値、フィルタリングに失敗した場合は false、 あるいは変数 var_name が設定されていない場合に null を返します。

他の引数は以下のサイトを参照
[PHP公式](https://www.php.net/manual/ja/function.filter-input.php)
また、以下のサイトを参考にさせていただきました。
[php filter_input POST や GET などの変数をフィルタリングする](https://wepicks.net/phpfunction-filter-filter_input/)
AWS Lambdaで、クエリーパラメータから値を取得する

# クエリーパラメータから値を取得する
Lambda関数に、以下のコードを追加します。

```
let {lang, ...info} = event.queryStringParameters;
console.log(lang, info);
```
# WebStormを使って、ローカル環境で実行する
「Edit Configurations...」をクリックします。
![スクリーンショット 2021-12-30 7.25.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/a83bb106-c6f6-0a66-99fc-7cb46b18d46a.png)

「API Gateway AWS Proxy」をクリックします。
![スクリーンショット 2021-12-30 7.26.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/7b58b840-1637-9df0-5643-6cc65c93801c.png)

「queryStringParamters」に、langやその他の値を追加します。
![スクリーンショット 2021-12-31 5.53.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/cc273c77-c36f-620a-6249-59c3224fc38d.png)


Lambda関数を実行します。
クエリーパラメーターから取得した値が出力されました。
![スクリーンショット 2021-12-31 5.55.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/cfbec0f2-9d2a-cc33-368a-7e623b758bb9.png)
【Git】VSCode上でgit commitを実行するとエラー発生。解決方法

# はじめに
Gitの操作方法を学ぶため、Udemyの教材を見ながらGitを動かしていたところ、git commitを実行した際にエラー発生！
git addまではうまく動作したのに何故！ということで原因を調べて、解決したのでその方法について書きます。
前提として、以下のことはできていました。
①git addまでは問題なく実行できていた
②git config --global core.editor "code --wait"でVSCodeをデフォルト設定していた

# エラー内容
```:zsh
hint: Waiting for your editor to close the file... code --wait: code: command not found
error: There was a problem with the editor 'code --wait'.
Please supply the message using either -m or -F option.
```

「ファイルを閉じるのを待っている？？」と考え、VSCodeで開いていたファイルを閉じて再度git commitするも同じエラー。

次に'code --wait'という文面を見て、「さっきVSCodeをデフォルトに設定したけど、方法を間違ってたか？」と考え、cat ~/.gitconfigで確認すると「editor = code --wait」と表示され間違ってはなさそう。

# 解決方法
原因が全くわからなかったので、「vscode git commit hint: Waiting for your editor to close the file...」で調べてみるとQiita記事で同じようなエラー発生している人を発見。

結果的には、コマンドラインでVSCodeを開くためのCodeコマンドがインストールされていなかったのが原因でした。

解決方法としては、VSCode内で「Command + Shift + p」を押し、コマンドパレットを開き、
Shell Command: Install 'Code' command in pathと入力し、Codeコマンドをインストール。
その後、無事git commitすることができました。

# 参考記事
以下の記事を参考にさせていただきました。

- [git commitしたら"Waiting for your editor to close the file..."と怒られた話](https://qiita.com/crispypanda/items/d2e6bc280d8a8ec8747a)
卒論を絶対に消さないための環境構築

# 前提
- LaTexを利用して卒論を書いている人に有用な記事になっています。
- LinuxとWindowsで試しました。
- GitHubとGoogle Driveを使用します。アカウントを作ってください。
- 共著者がいる場合はoverleafを使用したほうがいいと思います。この場合は著者が1人であり、ローカルの強いパソコンでoverleafよりも速くコンパイルがしたい人向けです。

# 卒論が消滅するリスクは以下の通り
1. パソコンが壊れる&rarr;クラウドにバックアップを取ることで解決
1. バックアップを忘れた状態でパソコンが壊れる&rarr;バックアップを自動化することで解決
1. 誤ってパソコンから卒論を消去してそれがバックアップされてしまう&rarr;版管理を行い解決
1. リモートのバックアップサービスが停止する&rarr;Google Drive(Google社)とGitHub(Microsoft社)のサービスを同時に使用することで冗長性を実現、そもそもインタネット環境に執筆が依存しない構成

- 機械の故障だけではなく、ヒューマンエラーによる消滅も考慮に入れた構成にしました。
- overleafを使用すればすべてリモートで管理されるためにデータが消滅しないですが、コンパイルが遅くサービスがよく落ちるというデメリットがあります。特にサービスが落ちるのは本末転倒です。

# バックアップを自動で取る
- データ消滅を防ぐ第一手としてバックアップを取りましょう。ただし人間は忘れやすい生き物なのでバックアップは手動ではいけません。バックアップを取るのを忘れた状態でパソコンが壊れるでしょう。

## Windows(Mac)
- Google DriveのWindows版のソフトをインストールして卒論のファイルを同期させてください。
- 具体的な操作方法は以下のリンクです。
    - https://kakakumag.com/pc-smartphone/?id=17434
    - 同期方法はミラーリングをおすすめします
- これでバックアップを自動でとることができます

## Linux
- 多少面倒ですがrcloneを使ってローカルの卒論ファイルを同期します。またcronで同期を自動化します。
- rcloneの使い方は以下のリンクにあります
    - https://takuya-1st.hatenablog.jp/entry/2017/12/27/205346
    - rclone copyよりrclone syncの方がおすすめです。
- crontabの使い方は以下のリンクにあります。
    - https://www.server-memo.net/tips/crontab.html
    - crontabに一定周期でrclone syncコマンドを実行させましょう。
- これで一定周期で卒論がGoogle Driveに同期されます。

# 人為的な消滅を防止する
- 人間は消してはいけないファイルを消してしまう生き物です。更にバックアップ側にも安全機構がついている場合もありますが、それも無視してしまうのが人間の性です。版管理をして消去してしまったファイルを復活させましょう。
- Windows(Mac)で使用したGoogle Driveのソフトはバックアップからも消去するかを聞いてくれます。しかし、ワンクリックで消去できるため無視してしまうかもしれません。
- 以下のGitとGitHubの操作をこまめに定期的に行うようにします。

## Gitを使用しよう
- Gitは自分の卒論にバージョンを作ることができます。ファイルを複製することで版管理をする人がいますが、めんどくさいのとフォルダが汚れるため忘れてしまう可能性があります。
- 以下のようなVSCodeを使ったgitはGUIで操作できるためおすすめです。
    - https://qiita.com/y-tsutsu/items/2ba96b16b220fb5913be

## GitHubを使用しよう
- 卒論のフォルダをすべて消去してしまい、それがバックアップされるたときに困るのでGitHubにバックアップするようにしましょう。
- 先ほどのリンクにGitHubの使い方も記述されています。
    - https://qiita.com/y-tsutsu/items/2ba96b16b220fb5913be
- 発展的な内容として、コミットも自動化したい場合は以下のリンクの通り
    - https://livingdead0812.hatenablog.com/entry/2019/05/09/175748

# 実際にトラブルが起きたとき
## パソコンが壊れた!!
- 他のパソコンを貸してもらって、Google Driveのバックアップから卒論をダウンロードして、GitHubのレポジトリと同期させましょう。

## 卒論のファイルやファイルの中身を間違えて消してバックアップされちゃった!!
- GitやGitHubから更新の履歴を見て消した内容を復旧しましょう。

## 卒論消しちゃった!!
- バックアップから再度ダウンロードしよう

## 卒論のフォルダごと消してバックアップされちゃった!!
- GitHubからcloneしましょう。
- コミットを忘れると大分進捗が消えるので、定期的な自動コミットをするとよいかもしれないです。

## Google DriveとかGitHubが落ちた!!
- すべてのデータはローカルにあるので、作業に影響はゼロです。
- バックアップができないので注意して作業する。

## 以上が2つ以上発生する
- これは大分しんどい

# Tips
- トラブルが起きたときの対処をより迅速にするためにREADMEにパソコンの環境構築のやり方を書いたり、Dockerを使っている人はdockerfileごとバックアップをとることがおすすめです。

# まとめ
- 自分も今修士論文を書いているので大変です。執筆が大変でこのような環境構築はおっくうに感じてしまいますが、論文は提出するのがゴールなので何か提出できるものが手元にあることが一番重要です。論文を絶対消えないようにしておいて後顧の憂いを断つのはいかがでしょうか？
OpenCV with QtのDLLジェンガ

# はじめに
OpenCVのGUIはQtと一緒にコンパイルすると非常に便利です．
ですが，Qtは，環境に応じて色々なものがダウンロードされるため，数十GBくらい落ちてきます．
不必要なbuild環境を削除しても，手元は12GBもありました．

コンパイル済みのOpenCVのDLLをいろんな場所で使おうとしてコピーするにもQt本体をインストールしなおすことはちょっとあれです．

そこで，[OpenCV ジェンガ](https://qiita.com/tomoaki_teshima/items/2a85bc4de7a68e5b8268)のように，大量にあるQtのDLLを最小構成にしてみます．

なお，OpenCVをwith Qtでコンパイルするためのジェンガではありません．with QtでOpenCVをコンパイルするには本体のかなりを要します．
with Qtで作られたOpenCVのDLLを使って，アプリケーションを実行するためのものです．

# 本当に必要だったもの

削除しては実行を繰り返して，本当に必要だったものは以下のたった5つのDLLで合計20MBくらいです．
1/1000くらいになりました．

* Qt5Core.dll
* Qt5Gui.dll
* Qt5Test.dll
* Qt5Widgets.dll
* plugins\platforms\qwindows.dll

なおデバッグモード時は，dのついた下記5つが必要です．

* Qt5Cored.dll
* Qt5Guid.dll
* Qt5Testd.dll
* Qt5Widgetsd.dll
* plugins\platforms\qwindowsd.dll

さぁこれを適当なパスの通ったところにコピーして実行しても残念ながら下のように言われて怒られます．

```
qt.qpa.plugin: Could not find the Qt platform plugin "windows" in ""
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
```

plugin内のDLLは，パスではなく，どこかから相対指定されている必要がありそうです．
いろいろググった結果環境変数QT_PLUGIN_PATHを定義すればよさそうです．

環境変数として，`QT_PLUGIN_PATH`として値を例えば`C:\Qt\plugins`とします（場所は任意）．
そうしたら，指定した値の場所に`qwindows.dll`をplatformsのフォルダ内に置けば動きます．
`C:\Qt\plugins\platforms\qwindows.dll`

結構難易度高めでした．
【合格体験記】AWS Certified Solutions Architect – Associate受けてきた

#はじめに

新しい部署に配属されてから早半年
年内区切りがいい状況で12月という年はまさに
資格試験を受けるに相応しい月
ということで受験

#主のスペック

以前の部署は
ストレージ、サーバ、ネットワーク周りの運用保守担当
L1,L2を主にみているということで典型的なTheオンプレエンジニア。なのでクラウド知識は乏しい。
AWSというサービスは知ってたけど、S3って何？美味しいの？というレベル

#勉強方法
[@hamham](https://qiita.com/hamham/items/fbbae7a3b81b03c2ed8f)さんの受験記を一部参考に

**★参考書(読み物)**
[AWS認定資格試験テキスト AWS認定ソリューションアーキテクト - アソシエイト](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88-NRI%E3%83%8D%E3%83%83%E3%83%88%E3%82%B3%E3%83%A0%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE/dp/4815607389/ref=sr_1_4?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=aws+%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88&qid=1640883525&s=books&sr=1-4)
勉強時間：5時間

:::note info
どういったレベルを求められるか網羅的に判断するにはピッタリ。図式化もされておりちょっとした辞書がてらにはよい
:::

:::note alert
付録である問題集は使えない。日本語がしっかりしており実試験にはそぐわない
:::

:::note warn
辞書がてらと追記したがこの参考書に載らない問題が割と出てくるから要注意
:::

**★問題集**
ヤフ〇クとかにある問題集
勉強時間：20時間

:::note info
問題レベル、形式はほぼここから出てきているように感じた。2～3週ぐらいで解き回した
:::

:::note alert
解説がないので辛い。問題が膨大で後半は疲れ気味
:::

:::note warn
暗記という奇行に走ると意味がないのでなぜその答えになるのか
自分で解説しながら取り組まないといけない
:::

**番外**
[AWS認定資格 無料WEB問題集＆徹底解説]
(https://aws-exam.net/saa/)
安物買いの銭失い。無料だからお金失ってないけど時間失った

#受験当日
クリスマス後ということもありやや気持ちはナイーブに
眠すぎて当日はお布団に包まれながら勉強を。
会場は渋谷の道玄坂にあるところ
~~ホントは別日に受けたかったのだが仕事の繁忙期もあり
已む無くこの日にした~~っていうのもあるけど想像以上に会場が狭くてビックリした笑
会場15分前に来いよって地味に受付の人に怒られた。(開始15分後までに来ればいいって書いてたようなと思いながら陳謝)

試験は見事に***合格***。時間は50分ほど余

この手のIT試験は**日本語が崩壊してるのが定石だが
少しはマシに感じた**(~~某ストレージベンダの資格が一番崩壊してた~~)一方で、長文で日本語崩壊しているものは流石にしんどかった。「〜に対する○○の○○の○○がの」といったどう見ても直訳しすぎてゲシュタルト崩壊したのもあったが単語を拾いながら回答

**参考書はバイブルとして買っておく、日本語崩壊試験に慣れるためにも過去問は必須**

#所感
AWSの一連のサービスを理解ができたと感じた。問題に対する理解は参考書よりも**業務を通して得た理解が圧倒的だった**。時間は多少かかったとしても丸投げエンジニアにならず、**自分で手を動かしたり、本質的なレビュー参加が大事だと改めて感じた**。

#今後
年度内にはプロフェッショナルも早めに取得も視野。最悪の事態を想定して転職にも有利かと思うし

#終わりに
コレで優雅に年末過ごせる
ハッピーニューイヤー('ω')ノ
RailsチュートリアルでのAWS Cloud9初期設定

#新しいワークスペースを作成する
Create environmentをクリック

#新しいワークスペースに名前をつける
Name environmentの画面のNameのところにrails-tutorialと入力し、DescriptionにA cloud IDE for the Ruby on Rails Tutorialと入力

#Ubuntu Serverを選択する
Environment settingu画面でPlatformのところをUbuntu Serverにチェックをする

#Create environment
名前と設定の確認

#初期画面が表示される
作成したワークススペース

#インデントをスペース2つに設定する
Rubyの世界では、インデントに2つのスペースを使うのがほぼ常識になっているそうなので、このエディタのインデント設定をデフォルトの4から2に変更
画面右上の歯車のアイコンをクリック
Project SettingsのSoft Tabsのところのマイナスをクリックして４→２に変更

#Railsをインストールする
Cloud9画面の下の方にあるbashなんちゃらのコマンドライン領域に下記コマンドを入力
Rubyドキュメントをスキップする設定を.gemrcファイルに追加

```
$ echo "gem: --no-document" >> ~/.gemrc
```

#バージョンを指定してRailsをインストール
-vというオプションでインストールするバージョンを正確に指定できる

```
$ gem install rails -v 6.0.3
```
インストールされているかの確認

```
$ rails -v
Rails 6.0.3
```

#bundlerのバージョンを指定してインストール

```
$ gem install bundler -v 2.2.17
```

#Cloud9環境のディスク容量アップと、クラウドIDEへのYarnインストール
JavaScriptソフトウェアの依存関係を管理するYarnというプログラムのインストール
Cloud9環境でディスク容量が不足しないよう、ワークスペース環境に容量を追加するコマンドも事前に実行

```
$ source <(curl -sL https://cdn.learnenough.com/resize)
$ source <(curl -sL https://cdn.learnenough.com/yarn_install)
```



以上でした
GithubActionsでdocker composeを使いつつimageをキャッシュする(2021/12)

## 前提

開発環境を`docker compose up`一発で立ち上がるようにすると大変便利です。
当然GithubActions環境下でも同じようにコンテナを起動し、testやlintを実行したいところです。

しかし2021年12月31日現在、GithubActionsではdocker composeは何もしなくても使えるものの、BuildKitはデフォでは入っておらず、dockerのlayer cacheも勝手にはやってくれません。

ということで、毎回`docker compose up -d`でコンテナビルドをやり直さなくて済むようにBuildKitのcacheをgithub actionsに残していきたいと思います。

### とりあえず成果物
https://github.com/Yasu-umi/github-actions-test/blob/676e77d03c942e271860e7e8c4859f3e000233b3/.github/workflows/test.yml

[この辺](https://github.com/Yasu-umi/github-actions-test/blob/676e77d03c942e271860e7e8c4859f3e000233b3/.github/workflows/test.yml#L20:L33)がキャッシュしてる部分になります

1つずつ何をしてるか確認していきます。
### まずはcache
`actions/cache`を使ってBuildKitのcacheを保持します。
ここでは`poetry.lock`のhashをkeyにしていますが、適宜パッケージマネージャのlockファイルなどに読み替えてください。
キャッシュするpathはどこでも構いません。

### 次にBuildKitのcache更新
ここが1つ目のミソです。
`actions/cache`によってrestoreされたBuildKitのキャッシュを使ってコンテナイメージを作成したいところですが、このままコンテナイメージ作成を行うとキャッシュに変更があった場合に追加されます。
このまま開発していくとキャッシュがどんどん増え、GithubActionsのキャッシュ上限に引っかかるところまで行ってしまいます。
そこで一手間挟み、現在のキャッシュを使ってbuildを行いそこで発生したキャッシュのみを保存することにします。
まず,[`docker builder build`コマンドの`--cache-from`で先程restoreしたディレクトリを指定し、`--cache-to`で新しいBuildKitのキャッシュを作ります。](https://github.com/Yasu-umi/github-actions-test/blob/676e77d03c942e271860e7e8c4859f3e000233b3/.github/workflows/test.yml#L31)
そして、[新しく作ったBuildKitキャッシュディレクトリを`actions/cache`が保存してくれるディレクトリに上書きしてしまいます。](https://github.com/Yasu-umi/github-actions-test/blob/676e77d03c942e271860e7e8c4859f3e000233b3/.github/workflows/test.yml#L32：L３３)
こうすることで古いキャッシュを消し新しいキャッシュのみを保存します。

### そして`docker compose up`
なのですが、何故かGithubActions上のdocker composeはBuildKitを使ってくれませんでした。(原因掘ってないのでご存知の方はご一報を)
ということで、2つ目のミソです。
BuildKitを使う`docker builder`以下には[bakeコマンド](https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/buildx_bake/)があり、これはHCLやjson, ymlなどからbuildを行うことができます。
この機能を使って`docker compose up`前に[コンテナイメージを作成してしまいます。](https://github.com/Yasu-umi/github-actions-test/blob/676e77d03c942e271860e7e8c4859f3e000233b3/.github/workflows/test.yml#L38)
オプションが良くわからない感じですが、`--load`はドキュメントにあるようにローカルのdocker daemonにイメージを保存するということで、`-set *.cache-from=type=local,src=/tmp/.buildx-cache`はビルド時のcacheを先程上書きした`actions/cache`から読み込むという指定です。


これにより、BuildKitのキャッシュを使ってdocker daemonにイメージを作ることができ、ようやく`docker compose up`する準備が整いました。


## 追記
`docker builder build`で古いキャッシュから新しいキャッシュを作っていましたが、これだとdocker-compose.ymlに書いたことが使えないので[ここでもbakeコマンドを使った方が楽でした。](https://github.com/Yasu-umi/github-actions-test/blob/3629369810a52515302caf01f0361f9d2bca1e2d/.github/workflows/test.yml#L31)
オンプレエンジニアSES歴５年の私がクラウド系受託企業に転職するまでの過程

2021年12月にオンプレメインのインフラエンジニアからAWSエンジニアに転職しました。

SESメインで5年ほどインフラエンジニア（オンプレサーバ）です。開発もしくはAWSエンジニアを目指して転職活動をしました。振り返りと、似たような境遇の人の参考になることを願い、投稿します！！

以下あくまで私の所感であることをご留意ください。

まず結果からいうと、開発にはいけなくもないです。ただしSESだったり、年収をそれなりにもらえてるエンジニアだと年収ダウンは要覚悟です。AWSならそこまで年収も落とさずにSESからのキャリアップが望めます。

○：いける　△：いけるかも　×：厳しい
**SES**　　開発△ AWS○　※開発は年収ダウン
**受託**　　開発× AWS○
**自社サ**　開発× AWS△

なんでこういう結果になったのかっていう考察を以下に記載していきます。
## 自分のステータス
私の情報がわからないと話にならないので書きます。

**■SES**
大手の企業が多かったです。まさにウォーターフォールな現場がほとんどでした。

・金融系：システム保守/半年
・ネットワーク印刷機：システム保守/1年
・大学の情シス：システム保守/1年
・建設業の社内システム：データ移行/半年
・官公系：システムリプレイス（設計/構築/保守）/2年

**■その他自社でやったこととか**
SESと並行してやってたのでとても大変でしたが、ここが+αでのびれたポイントでもあります。

・Web周りのインフラ（AWS、ドメイン管理）
・オンプレ環境の構築
・既存開発サイトの保守
・Office365への移行
・動画制作（FinalCut）
・顧客フロント対応

また転職にむけて、友人からフロント系の開発案件に半年ほど携わらさせてもらいました。
↓当時のGitHub Contributions
![スクリーンショット 2022-01-09 15.59.17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984662/b613ec67-a8f5-bdfb-37a6-dd513d899fe1.jpeg)

**■スキル**
5年前に予想していたスキルレベルはこえましたが、いざなってみると色々足りなさもあって、もっと専門性を伸ばしたかったなと感じました。

※★☆☆：1年以下　★★☆：3年以上　★★★：5年以上
・オンプレ（OS導入まで）★★☆
・ネットワーク★☆☆
・OS★★☆
・仮想（VM、HV）★☆☆
・AWS★☆☆
・DB★☆☆
・ミドルウェア全般★★☆
・コーディング★☆☆

**■年収**
１億。うそ。知り合いがたくさん見てるので詳細は秘密だけど、SES、自社受託、管理職といろいろやってたので、世の中の水準よりも多く頂けている方でした。前職における評価と待遇には本当に感謝しております。

## いざ、転職活動へ
転職活動は仕事をしながら半年くらいかけてじっくりやりました。ターゲットは開発・インフラの自社サービスもしくは受託サービスの企業です。私はオンプレよりのサーバエンジニアだったので、まだサーバでくくれるクラウドはまだしも、開発は畑違いの転職ということになります。なので、年収は15%くらいまでのダウンを許容しました。

**利用した転職サイト**
上からよく利用した順です。とりあえず登録すると、捌き切れないほどの直オファーが来ます。

①Wantedly
企業様から直メッセージがきます。一番話が早いです。

②Green
オファーがくるので、こちらが希望を出せば企業からメッセージがきます。①と同じように直でメッセージがくることもあります。最終的にここで決まりました。

③Findy（マッチング）
②とほぼ同じです。直メッセージはあまりありません。ここは「ハイレベルな人材」をうたってます。

④リクルートエージェント、ギークリー
募集が多すぎるのと、応募までが手間だったのですぐやめました。①〜③でオファーくるなら、エージェント系は使わなくていいかなと思います。担当してくれた方、ごめんなさい。応募を止めるときはちゃんと伝えましょう。

**内定までの流れ**
①直オファー
登録当初と、あとは更新をこまかくかけてればバンバンきます。半年で100以上は間違いなくきてました。

②カジュアル面談
書類選考の前に軽くお話させてもらえます。20~30社くらいやりました。いろんな企業からいろんな話がきけるので、この辺りでもう既に世界が広がってる感覚を持てます。

③書類選考
10社くらい出しました。7割くらいは通った印象です。

④1次面談
ここで半分くらい落ちました。オファーしてきているとはいっても、やはり普通に落とされます。

⑤2次面談→内定
2次で落ちたところはなく、残りは内定を頂けました。

**面談のポイント**
上から順に面談でよく聞かれた内容です。これらが深堀されます。**これまで何をやってきて、これから何ができるのか？** をいかに高いレベルで確立できているかが重要だなと感じました。

①転職理由
②自分の将来像
③なぜその企業に入りたいのか
④過去の実績例
⑤今後やってみたいこと
⑥自分の強み
⑦仕事で重んじていること、またその実例

## 最後に
やっぱり転職はおすすめです。キャリアップという意味でももちろんそうなのですが、こうやって自分の棚卸しができたり、そして何より新しい環境で新しいシステムに携わるというのがとても良いです。最初はもちろん大変ですが、後々トータルでみたときに得るものが圧倒的に多いです。また、働き方の体系がよくなれば裁量の大きくなる可能性が高くなることも大きな魅力ですね。

私が転職した先ではハイスキルの人たちや、周りの会話もいままでになかったような進んだ会話がよく聞こえてきます。今は自分が望んだ環境に飛び込めたことを強く実感してます。生きてる世界がかわった感じがしました。

私と同じような境遇で悩んでる人がいたら、その助けになる記事になれば嬉しいです。迷ったらまずは行動してみるといいです。転職サイトの登録からカジュアル面談までやってみるといろいろ見えてくるものがあるはずです！！