OmniAICreator/Qiita-1.07M huggingface dataset:
(Node18) npx ts-nodeでTypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts"エラーが出る

# はじめに

tsファイルの実行につまったのでまとめます

# 問題

以下のコマンドを実行したところエラーが出ました

```
$ npx ts-node --esm ./batch/index.ts 
```

```
TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for /home/watanabejin/workspace/business_card/batch/index.ts
    at Object.getFileProtocolModuleFormat [as file:] (node:internal/modules/esm/get_format:160:9)
    at defaultGetFormat (node:internal/modules/esm/get_format:203:36)
    at defaultLoad (node:internal/modules/esm/load:143:22)
    at async nextLoad (node:internal/modules/esm/hooks:750:22)
    at async nextLoad (node:internal/modules/esm/hooks:750:22)
    at async Hooks.load (node:internal/modules/esm/hooks:383:20)
    at async handleMessage (node:internal/modules/esm/worker:199:18) {
  code: 'ERR_UNKNOWN_FILE_EXTENSION'
}
```

# 解決方法

Node.js 18.16.0では以下の方法でうまく動きました

```
$ npm uninstall typescript ts-node
```

そしてグローバルに入っていなければts-nodeをいれます

```
$ npm i -g ts-node
```

そして以下のコマンドで実行できました

```
$ npx node --loader ts-node/esm ./batch/index.ts
```

# おわりに

Node20系では以下のやり方で動いたと言っていたのでそちらも真似てみてください

https://qiita.com/shunii/items/1863bb65a463783b3213
mysql コマンド集

# 初めに
mysqlを勉強しているので、そのアウトプットでmysqlのコマンド集を作りました。
ぜひ参考にしてください。

# mysqlコマンド集

## mysqlにログイン
```
mysql -u ユーザー名; 
```
-pをつけることでパスワード付きでログインできます。

例: ユーザー名がrootでパスワードがpasswordの場合

```
mysql -u root -p;
```
を入力後
passwordと入力するとログインできます。

## mysqlをログアウト
```
exit;
```

## mysqlサーバー起動

```
mysql.server start;
```

## mysqlリスタート

```
mysql.server restart;
```

## mysqlユーザー削除

```
drop user ユーザー名@ホスト名;
```

例: ユーザー名がuser2でホスト名がlocalhostの場合

```
drop user user2@localhost;
```
でユーザー名を削除できます。

## データベースを作成する
```
create database データベース名;
```
databaseのところをdatabasesにしないように注意してください。

## データベースの一覧を見る

```
show databases;
```

## データベースを切り替える

```
use データベース名;
```
テーブル一覧やデータベース内のテーブルを確認する時などに使用します。

## テーブル一覧を確認する

```
show tables;
```

## カラムを確認する

```
describe テーブル名;
```

## カラムの挿入

```
ALTER TABLE テーブル名 ADD 新規のカラム名 型指定 ;
```

## カラムの順番を指定して挿入
既存カラムの後に挿入
```
ALTER TABLE テーブル名 ADD 新規のカラム名 型指定 AFTER 既存のカラム名;
```
先頭にカラムを挿入
```
ALTER TABLE テーブル名 ADD 新規のカラム名 型指定 FIRST;
```

## カラムを複数挿入
```
ALTER TABLE テーブル名 ADD (新規カラム名１ 型指定, 新規カラム名２ 型指定, ...);
```

## カラム削除
```
alter table テーブル名 drop column カラム名;
```
例: テーブル名sample カラム名idとすると
```
alter table sample drop column id;
```
でカラムを削除できます。

## テーブルを削除する

```
drop table テーブル名;
```

## テーブル内のデータを確認する

```
select * from テーブル名;
```



# 最後に
今後も勉強していくので、追記していきます！
【Java】jakarta.servlet.ServletException: java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/TagLibraryValidator【エラー解決】

# はじめに
JSPで表題のエラーが出て苦戦したので、エラー解決方法をメモ。

## やろうとしたこと
Eclipse上でこういうJSPを用意して、全てのJSPにインクルードするようにweb.xmlの方で設定。
```jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
```
```web.xml
<web-app>
    <!-- JSP共通ファイルをインクルード -->
	<jsp-config>
		<jsp-property-group>
			<url-pattern>*.jsp</url-pattern>
			<page-encoding>UTF-8</page-encoding>
			<include-prelude>/WEB-INF/include.jsp</include-prelude>
		</jsp-property-group>
  	</jsp-config>
</web-app>
```

## おこった事象

作ったアプリのどの画面でもいいのでアクセスすると、下記のエラーが発生。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526202/60f85826-b2ca-f502-ceeb-1a86f4f68320.png)

# やることその１（JSTLライブラリの入手）
https://qiita.com/arubaito/items/f5feede0e113c7df5d78

この記事にある通り、JSTLのライブラリを入手する。

# やることその２（入手したライブラリをビルド・パスに設定）
プロジェクトを右クリック⇒「ビルド・パス」⇒「外部アーカイブの追加」を選択。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526202/27e89b87-7ebe-4f8b-3ef0-f6a160b096f6.png)

エクスプローラが開くので、入手したライブラリを選択する。
「参照ライブラリー」で表示されるようになります。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526202/4cc87a9c-db00-b4cb-7eda-fba20a0b9be7.png)

# やることその３（デプロイメント・アセンブリーの設定）
プロジェクトの「プロパティー」を開く。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526202/7c661028-3414-3eb3-5a4e-f1e17c75b675.png)

「デプロイメント・アセンブリー」⇒右側の「追加」を押下。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526202/f6363b55-4d29-8878-8fe2-515c2be1f342.png)


「Javaビルド・パス・エントリー」を選択して「次へ」を押下。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526202/d8b66062-4142-22f6-b2bf-629198e9df2f.png)

ライブラリを選択して、「完了」を押下。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526202/8e2458fa-03cf-7770-e88a-2894823cc5fb.png)

「適用して閉じる」。

おしまい。

このエラーに１日かかっちまったぜくそう

よくよく考えるとMaven使ってJSTLのライブラリ取得すればデプロイメント・アセンブリーの設定不要じゃん。まあいいや。
Go言語の基礎 S1

# Go言語の導入
これらの記事を書くにあったって、Go言語の初心者向けのサイトを作成してもらったすべての人に感謝を表し、これを謝辞とさせていただく。

## Go言語の特徴
* コンパイル型言語
* 静的型付け言語
* 並行処理に強い
* C言語みたいに一文かいたらセミコロン(;)というのはない
* C言語などの言語と少し似ているため他の言語と少し似ている部分があり理解しやすい
* try-catchがない

## 学習サイト

### A Tour of Go

https://go-tour-jp.appspot.com/list

Goの公式が出しているもの。日本語訳されていてすでに他の言語を触ったことがある人ならこれをすべき!!

### Progate(プロゲート)

https://prog-8.com/courses/go

他の言語を触ったことがない、または初心者の方はこのサイトから始めるとよいだろう。一部**有料**という欠点はあるが、わかりやすいのでおすすめである。

## Go言語の環境構築

https://go.dev/dl/

上記のサイトから環境にあったものをダウンロードしよう。

エディターは有料だがGolandがおすすめ。

## Go言語の基礎知識

### import
Go言語は、使用するパッケージをファイルの始めに宣言する。

### mainパッケージ
慣習として``main.go``というファイルにmainパッケージのmain関数を置き、プログラムが始まる。

### 命名規則

https://zenn.dev/keitakn/articles/go-naming-rules

# あとがき
セクション2(続き)は[こちら](https://qiita.com/LaciaRD000/items/6f16023758d1237dffd5#%E6%BC%94%E7%AE%97%E5%AD%90)
Apple silicon(M1/M2/M3)にPython3.7系をインストールする

## 概要
とあるニーズでPython3.7系をApple silicon(M1/M2/M3)にインストールした。その際意外と大変だったためメモ。

### 大変だった理由：
* Python3.7のApple silicon向けpre-buildがなく、x86のものを使う必要がある。
* Python3.7系は2023年にサポート終了しているため、各種パッケージ管理ツールでインストール対象から外れている。

以上から、x86コマンド互換のHomebrewを用意して対処する方針とした。

## インストール手順
### x86版Homebrewのインストール
```sh
$ arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
画面に指示が出るとおり、`/usr/local/bin/brew` にbrewコマンドが用意される。
つまり、通常のApple silicon用brewと共存できる。

### x86版用のaliasを用意
共存するために、.bashrcなどに`ibrewという`別名コマンドを用意する

```bash
alias ibrew="arch -x86_64 /usr/local/bin/brew"
```
これで`ibrew`コマンドx86系パッケージを使える。

ただし、サポート終了となっているPython3.7は標準brewには含まれていないため、`tap`コマンドでリポジトリを追加する。

[sashkab/homebrew-python](https://github.com/sashkab/homebrew-python)というところで古いPythonフォーミュラが提供されているので、それを追加。
```sh
$ brew tap sashkab/homebrew-python
```
これで、ibrew install sashkab/{{package}}とすることでインストール可能に。

### Python3.7のインストール
```sh
$ ibrew install sashkab/python/python@3.7
```

これで`python3.7`コマンドがインストールされた。

```sh
$ python3.7 -V
Python 3.7.13
```

他のバージョンのpythonとも共存できる
```sh
$ python3 -V
Python 3.12.2
```

### 補足：pipのインストール
同様に、python3.7に引き渡せば`pip3.7`コマンドが作られる：
```sh
$ curl -kL https://bootstrap.pypa.io/get-pip.py | python3.7
```
PHP7.4 → PHP8.2にバージョンアップする手順


# 動作環境
- MacBook Air M1 2020
- macOS Sonoma 14.2.1
- Homebrew 4.1.18
```
$ brew --version
Homebrew 4.1.18
Homebrew/homebrew-core (git revision addae16383c; last commit 2023-11-03)
```
- PHP homebrewのパッケージphp@7.4を使用
```
$ php -v
PHP 7.4.30 (cli) (built: Jun  9 2022 09:20:03) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.30, Copyright (c), by Zend Technologies
$ which php
/opt/homebrew/opt/php@7.4/bin/php
```

# php7.4からphp8.2へバージョンアップ
こちらの記事を参考にバージョンアップを行いました。

https://kimoba.com/kasegu/php-version-up.html

php8.2をインストールします。
```
$ brew install php@8.2
$ brew unlink php@7.4
$ brew link php@8.2
```

`.zshrc`ファイルに下記を追加し、`source`で更新します。
```
// php8.2インストール後に出力されていたメッセージに従ってPATHを追加する
$ echo 'export PATH="/opt/homebrew/opt/php@8.2/bin:$PATH"' >> ~/.zshrc
$ echo 'export PATH="/opt/homebrew/opt/php@8.2/sbin:$PATH"' >> ~/.zshrc
$ source ~/.zshrc
```
これで7.4→8.2に切り替わると思ったのですが、まだ切り替わっていませんでした。

その後も下記の通り色々試したのですが切り替わらず、、
```
$ brew uninstall php@7.4
$ brew link --force php@8.1
```

いろいろなサイトを漁っていたら「ターミナルを再起動する」と記載されている記事があり、言われるがまま再起動したら見事反映されました！わーい
```
$ php -v
PHP 8.2.16 (cli) (built: Feb 13 2024 15:22:59) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.16, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.16, Copyright (c), by Zend Technologies
```
`source ~/.zshrc`で更新してるから反映されるはずと思っていたけどターミナルの再起動も必要なのですね。
画像投稿プレビュー機能

# はじめに
プログラミング初心者です。
温かく見守ってください。
# 画像投稿プレビュー機能
画像投稿を以前実装しました。
これにプレビュー機能を実装したいと思います。
### 事前準備
まずはJavaScriptが読み込まれるようにします。
・appディレクトリ→JavaScript内にprevire.jsのファイルを作成します。
・config/importmap.rb
```
pin "preview", to: "preview.js"
```
・app/javascript/application.js
```
import "preview"
```
#### コードを実際に書きます
```js
const preview = () => {
  // 新規投稿・編集ページのフォームを取得
  const postForm = document.getElementById('new_post');

  // プレビューを表示するためのスペースを取得
  const previewList = document.getElementById('previews');

  // 新規投稿・編集ページのフォームがないならここで終了。「!」は論理否定演算子。
  if (!postForm) return null;

  // input要素を取得
  const fileField = document.querySelector('input[type="file"][name="post[image]"]');
  // input要素で値の変化が起きた際に呼び出される関数
  fileField.addEventListener('change', function(e){
    // 古いプレビューが存在する場合は削除
    const alreadyPreview = document.querySelector('.preview');
    if (alreadyPreview) {
      alreadyPreview.remove();
    };

    const file = e.target.files[0];
    const blob = window.URL.createObjectURL(file);

    // 画像を表示するためのdiv要素を生成
    const previewWrapper = document.createElement('div');
    previewWrapper.setAttribute('class', 'preview');

    // 表示する画像を生成
    const previewImage = document.createElement('img');
    previewImage.setAttribute('class', 'preview-image');
    previewImage.setAttribute('src', blob);

    // 生成したHTMLの要素をブラウザに表示させる
    previewWrapper.appendChild(previewImage);
    previewList.appendChild(previewWrapper);
  });
};

window.addEventListener("turbo:load", preview);
window.addEventListener("turbo:render", preview);
```

ここで個人的ポイント
１、画像を選択した後に、選択し直すとき
　古い方の画像はプレビューに残ったまま、新しく選択しなおした方もプレビューに表示されてしまうので、そんな時は　
 ```js
 // 古いプレビューが存在する場合は削除
    const alreadyPreview = document.querySelector('.preview');
    if (alreadyPreview) {
      alreadyPreview.remove();
```
こちらを追記します。

２、何らかが原因でエラーになり、再入力が必要になった際のもプレビューが表示されるようにしなければなりません。
```js
const preview = () => {

省略

};

window.addEventListener("turbo:load", preview);
window.addEventListener("turbo:render", preview);
```
previewという関数に置き換えて、一番最後に呼び出す時にrenderで画面が飛んだ時もプレビューが表示されるようにしました。

以上
chromeで検索するときになぜか検索エンジンがyahooになってしまった話

# 背景
いつものようにパソコンを立ち上げ、chromeを開いたときにちょっとした違和感が

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637403/dce124cd-5c70-3981-312e-cd6d37aa8524.png)
**中央に検索ボックスがない！**
いつもなら画面中央にでかでかとGoogleの文字があるはずなのに…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637403/33abd9cd-bbf2-9b02-b131-7711d4c1ff2d.png)

# 原因
調べてみると**McAfee**が悪さをしているらしい…

公式にも専用の記事が存在します。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓

**マカフィー ウェブアドバイザーによって検索エンジンが変更される**

https://www.mcafee.com/support/?locale=ja-JP&articleId=TS102755&page=shell&shell=article-view

一部の地域では、 マカフィーウェブアドバイザーのデフォルトの検索エンジンとして、Yahoo!が採用されており下記が画像のチェックボックスにチェックを付けて完了すると検索エンジンが変更されてしまうみたいです。



**攻撃を阻止するために検索保護機能を追加しますか？**
* はい、ブラウザーの再起動後に安全な検索を有効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637403/e9349d2e-ed28-e952-0e88-e30b3bd6fc88.png)

# 変更方法
chromeを開いて右上の三点部分をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637403/a8dccc25-a265-c60d-0b1c-6fb5be4a8b87.png)

そこから設定をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637403/74cf06b7-e3da-2fc5-90a3-e40888e4c7b2.png)

左タブの検索エンジンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637403/dd5e58ef-2ad4-1a7d-98dd-120cd25c0c8d.png)

画面中央の「アドレスバーで使用する検索エンジンです。 」のドロップダウンから
「セキュアサーチ」→「Google」に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637403/83746622-532b-1cdf-e140-d71753ccc44d.png)

これで解決です。いつもの景色が見れて実家のような安心感ある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637403/fd4b0732-ef56-4327-f34e-2853e59dbd6b.png)

### ソース
https://50yokatta-blog.com/pc-chrome-google-yahoo-auto-change/

https://www.mcafee.com/support/?locale=ja-JP&articleId=TS102755&page=shell&shell=article-view
awkコマンドでファイルの行数を使いたい

# この記事は？

awkコマンドを使っている時、**条件にファイルの行数を使いたい** 場面がありました。しかし、awkコマンドにはファイル行数を表す予約語などありません。その時調べた解決方法を備忘録として残しておきます。awkコマンドの使い方については割愛します。

# awkとは？

テキスト処理のためのプログラミング言語およびコマンドラインユーティリティです。テキストデータの「パターンマッチング」と「データ加工」を行うことができます。
LinuxやMacのほとんどで追加インストールなしに使うことができます。

# サンプル

```txt:sample.txt
aaa
bbb
ccc
ddd
eee

```
sample.txtファイルの中身は５行


```shell:サンプルコマンド

awk -v line_count="$(wc -l < sample.txt)" '{
   print $0 line_count;
}' sample.txt

```


```txt:実行結果
aaa       5
bbb       5
ccc       5
ddd       5
eee       5

```

実行結果の「５」がsample.txtの行数


# サンプルコマンド説明

wcコマンドを使って行数を取得し、それをawkの変数に代入しています。
```
-v line_count="$(wc -l < sample.txt)"
```

# END ではダメなの？

awkの “END” ブロックを使うと最終行だけ特別な処理を書くことができます。
しかし、通常の行ではある処理を行って、最終行だけはその処理を抑制したいといったケースがあります。そういった場合は”END” ブロックだけでは実現できません。


# どうしてawkの標準機能にないんだろ？

awkコマンドそのものにファイルの行数を表す予約語などがあれば嬉しいのですが、そうするとファイルを二度読みしなくてはならないので、そういった機能は組み込まれていないのかなと思いました。
（パイプ処理などでも二度読みは都合が悪そう）

今回紹介した方法以外にもawkのファイルの行数を取得する方法があると思いますので教えていただけると幸いです。
dbt Coreのインストール方法について

dbt Coreのインストール手順をまとめました。

## dbt Coreとは
dbt (Data Build Tool) Coreは、データ変換（ETLプロセスの「変換」を担当する）ツールです。
データエンジニアリングの分野でよく使われますね。

コマンドラインで操作ができ、データウェアハウス内のデータを変換します。
SQLを用いてデータモデリングを行い、データ品質のテスト、ドキュメンテーションの生成、およびデータ変換の自動化をサポートできます。


## インストール手順

※任意
dbt Core用の環境を準備します。

```bash
Dbt# python3 -m venv env
Dbt# ls
env
```

Dbt用の環境を有効化します。

```bash
Dbt# source env/bin/activate 
(env) Dbt# 
```

pipを使いdbt-coreをインストールします。

```bash
(env) Dbt# python3 -m pip install dbt-core
Collecting dbt-core
  Downloading dbt_core-1.7.9-py3-none-any.whl (1.0 MB)
(env) Dbt# dbt --version
Core:
  - installed: 1.7.9
  - latest:    1.7.9 - Up to date!

Plugins:
```

dbtのバージョンも確認できました。

データウェアハウス用のdbtもインストールします。

対象
- Snowflake
- BigQuery

```bash
(env) Dbt# python3 -m pip install dbt-snowflake dbt-bigquery  
Collecting dbt-snowflake
  Downloading dbt_snowflake-1.7.2-py3-none-any.whl (46 kB)
(env) Dbt# dbt --version
Core:
  - installed: 1.7.9
  - latest:    1.7.9 - Up to date!

Plugins:
  - bigquery:  1.7.6 - Up to date!
  - snowflake: 1.7.2 - Up to date!
```

Snowflake, BigQueryどちらもインストールできましたね。
これでdbtコマンドラインが使えるようになりました。

## 参考

https://docs.getdbt.com/docs/core/pip-install
学生時代に地方からフルリモートでスタートアップのバイトをした話とその結果

# 初めに

私は2021年1月~2022年3月まで地元の愛媛県からフルリモートで東京のスタートアップ企業で学生バイトをしていました。

今回はその時の話とそれによって得られたものを話します。

# それはある日の担任教員がバイト募集を持ち掛けた

私が通っていた専門学校は高校みたいに担任教員がいます。

その担任教員が授業前に卒業が所属しているスタートアップのバイト募集を持ち掛けました。

私はそれに手を挙げ、応募者が私しかいないため簡単な面接をして無事働くことになりました。

# なんでバイトを始めたの？

理由は2つです。

## 学校の授業が飽きて実務を積みたいと思っていたから

私は4年過程の専門学校にいました。

成績は上位の方で2年後期になると授業をしなくても独学でキャッチアップできるようになりました。

なので学校の授業に飽きていました。

だから早めに実務経験を積みたいと感じました。

## 実務経験によって就活を有利にしたい。

有名企業になると倍率が高いため就活で有利になると感じていました。

## 遅い時間まで働きたくないから

当時コンビニバイトをしていましたが、シフトの都合で17時~22時退勤をしていました。

そのため家に帰るときは11時になっていました。

ですがスタートアップはシフトを自由に決めやすかったため、早く働いて早く退勤できると思いました。

# どんな業務したの？

モール型ECサイトを新規開発しました。

私の担当は購入者画面のフロントエンドと決済機能を主にしました。

技術面ではTypeScript, Vue.js(3.2), Serverless Framework(AWS Lambda), Stripeを触りました。

シフトは基本的に学校終わりの16時~20時まで、学校が休みの場合は10~16時まで週4で働いていました。

# 実際働いてみてどうだったの？

**最高でした。**

フルリモート・実質フルフレックスだったので自由度が高かったです。

また実務で書くコードはとても刺激的でした。

当時は景気が良かったので今よりもフルリモート・フルフレックス求人が多かったのでまさにその恩恵を受けた感じになりました。

## しかし

以下の難しさや問題を感じました。

### コミュニケーションが難しい

フルリモートなのでテキストコミュニケーンがメインになります。

当時の私は日本語力がとても低かったです。

なのでよく**何を言っているのかわかりません**と言われました。

### 学校にPCをたまに忘れることもあった

授業用PCを家に持ち帰ってバイトをしていました。

しかしそのせいで学校にPCをたまに忘れることもあり、授業を遅刻してしまいました。

### 人間関係はコンビニバイトの方が良かった

フルリモートかつペアプロ文化がなかったのでメンバーと交友を深める機会がありませんでした。

なので人間関係としては面白くなかったです。

むしろコンビニバイトはお客さんから差し入れをもらったり、同僚とゲームしたりすることが合ったので楽しかったです。

# 働いた結果、こんなメリットがあった

## 実務のコード作法について学べた

実務経験がないと意味もなく改行がたくさんになります。

でもそういったことを指摘されたので様々なことを学べました。

## CIとは何なのかを知れた

バイトする前にJenkinsについて学校で授業がありました。

使い方だけ授業をして、運用・設計については教わらなかったので具体的にCIはどんなものか分かりませんでした。

恐らく応用情報と情報処理安全確保支援士を1発合格した当時の同期も分からなかったと思います。

そのため生で運用されているCIを見てどんなものか理解しました。

## 新卒短期離職の保険ができた

学校を卒業してバイト先とは違う会社に新卒入社しました。

なぜバイト先でそのまま働かなかったかと言うと、それは機密事項なので言えません。

そんな新卒入社した会社を短期離職して、現職に中途入社しました。

当時は未経験募集をしていなかったので、バイト経験が実務と認められて入社することができました。

## 現職でTypeScriptのリードができた

バイトでは主にTypeScriptを触ることが多かったので、その経験を活かして現職でリード業務を行うことができました。

# 最後に

自分のエンジニア基礎力に強く影響を受けているので働いてよかったです！

もし学生でエンジニアバイトをやろうか迷っていたら、すぐに行動して働くことをお勧めします！
BizRobo!　KCUポイント（消費ポイント）の確認方法について

## 概要
#### KCUポイント（消費ポイント）の確認方法について

<br>
今回はBizroboのKCUポイント（消費ポイント）の確認方法についてです。

KCUは1秒間にどれだけの操作を行うことができるのかを表します。
（1KCUは5000KCUポイントとなります。）
<br>

ロボの処理はステップ内容により消費するKCUポイントが変わりますので、
消費するKCUポイントを意識することで安定稼働にも繋がってきます。
<br>

どちらのアクションステップでも対応可能な場合は、
どちらを選択するか迷う方もいるかと思います。
<br>

直近で私は、
BizroboでSQLからデータ抽出を行いたいと考えたときに、
Execute SQL　と　Query Database
どちらのステップで実装しようかと悩みました。

<br>


## 確認手順
<br>
消費ポイントの確認方法は下記です。

まずお馴染みのDSの画面

![001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291018/c36dbb1c-c534-6b68-0ba4-64a4839ec298.png)
<br>


上の方にある
Helpをクリックし、
プルダウン内のShow KCU Information...をクリック
（日本語の場合はKCU情報をクリック）

![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291018/47f1e1a2-3efc-1c62-a541-116ab4d1e198.png)

<br>
<br>
KCUポイントの情報が一覧で表示されます。

![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291018/efed1155-586d-87f0-57e4-704f1ce874fa.png)


<br>
<br>

それでは今回の
Execute SQL　と　Query Databaseを比べてみます。
<br>
![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291018/74803678-52eb-ec82-b557-accd310381cb.png)

![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291018/39f3170f-a0f9-c9b4-7924-c3c9465badee.png)


<br>
Execute SQLは1000pointを消費するのに対し、
Query Databaseは初期コスト 1 point。
最初の 1000 レコードのイテレーション コスト が 1pointで、
以降のレコードのイテレーションコスト が 0pointとなることが確認できました！


## まとめ

KCUポイントを意識することで、
ロボット処理の遅延を防ぐことにも繋がります。

KCUwaitが多く発生しているロボットについては、
改善できる点がないか確認してみてはいかがでしょうか。

私自身も今後のBizrobo開発に活かしていきたいと考えています。

最後まで見ていただきありがとうございました。
Pythonで「range関数の使い方(開始から終了までの連続した数値を要素として持つrange型オブジェクトを作成する)」の動作を確認してみた

# 概要

Pythonで「range関数の使い方(開始から終了までの連続した数値を要素として持つrange型オブジェクトを作成する)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/python/function/index6.html

# 実装

以下のファイルを作成しました。
```sample.py
r = range(10)
for i in r:
    print("num : " + str(i))
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
num : 0
num : 1
num : 2
num : 3
num : 4
num : 5
num : 6
num : 7
num : 8
num : 9
```

# まとめ

何かの役に立てばと。
ポート競合時のプロセス特定と強制終了【PowerShell × Windows】

# ポート競合時のプロセス特定と強制終了【PowerShell × Windows】

## 概要

ローカル開発中、ポート番号の競合（conflict）が原因でアプリケーションが起動しないケースはよくある。  
特にバックエンドアプリケーションやフロントエンド開発サーバなど、指定ポートへのバインドが失敗する際、以下のようなエラーが出力される。

- `Error: listen EADDRINUSE: address already in use :::3000`
- `bind: Address already in use`

このようなエラーに対して、**原因プロセスの特定と強制終了**というアプローチは即効性があり、再発防止のための分析材料としても有効だ。

本記事では、**Windows環境 × PowerShell** 上で、対象ポートを占有しているプロセスを見つけ、的確にタスクを終了させる手順を解説する。

---

## 対象環境

```text
OS   : Windows 10 / 11  
Shell: PowerShell 5.x / 7.x  
```

---

## 利用するコマンド群

以下の2ステップで処理する。

1. ポートを使用しているプロセスを特定
2. 特定したプロセスID（PID）を強制終了

```powershell
# Step 1: 特定のポート番号を使っているプロセスを調査
```
```powershell
netstat -ano | findstr :3000
```
```powershell
# Step 2: 該当プロセス（PID）を強制終了
```
```powershell
taskkill /F /PID 1234
```

---

## 解説

### 1. `netstat -ano | findstr :<port>`

- `netstat -ano`  
  - `-a`: すべての接続とリスニングポートを表示  
  - `-n`: アドレスとポートを数値形式で表示  
  - `-o`: 各接続に関連するプロセスID（PID）を表示  
- `findstr :3000`  
  - 出力結果からポート`3000`を使っている行をフィルタ

このコマンドで、対象ポートにバインドされているプロセスIDを把握できる。

### 2. `taskkill /F /PID <pid>`

- `/F`: 強制終了（Force）を指定  
- `/PID`: 終了対象のプロセスIDを指定

たとえばPIDが1234なら以下のように入力：

```powershell
taskkill /F /PID 1234
```

---

## 注意点

- **PIDの特定には管理者権限が必要な場合がある。**
  - `PowerShell`は「管理者として実行」推奨。
- **誤ってシステムプロセスをkillしないよう、`netstat`出力をよく確認すること。**
- **アプリケーションによっては終了しても自動再起動される場合がある（サービス設定等）。**

---

## 応用：ポートを指定して自動終了スクリプト化

以下のようにスクリプト化して、任意のポートを指定して自動的に対象プロセスをkillすることも可能だ。

```powershell
$port = Read-Host "Enter port number"
$line = netstat -ano | findstr ":$port"
if ($line) {
    $pid = ($line -split '\s+')[-1]
    Write-Output "Killing PID: $pid"
    taskkill /F /PID $pid
} else {
    Write-Output "No process found using port $port"
}
```

---

## 結語

ポート競合のトラブルは開発の初期段階で頻出する。  
その都度、原因を手動で探るのではなく、**即応できるPowerShellスニペットを習慣化しておくこと**が、スマートな開発者としての第一歩だ。

ローカル環境での安定した開発体験は、こうした細やかなオペレーションの積み重ねによって支えられている。
Parse Serverの使い方（クラウドコードの使い方）

[ニフクラ mobile backendは3月末で終了します](https://mbaas.nifcloud.com/info/2023/12/post-171.html)。

ニフクラ mobile backendからの移行先として、お勧めしているのが[Parse Server](https://parseplatform.org/)です。設計思想が近く、変更するコード量が少なく済むのではないかと思います。

NCMBではスクリプト機能と呼んでいたFaaS（Function as a Service）ですが、Parse ServerではCloud Codeと呼ばれています。JavaScriptで書かれた関数をサーバー側で実行できます。

今回はParse ServerのCloud Codeの使い方を解説します。

## 起動時の設定

Parse Serverはデフォルトでは `./cloud/main.js` にCloud Codeを配置します。このファイルを作成し、関数を書いていきます。これを変える場合には、起動時のオプションで指定してください。

環境変数の場合は `PARSE_SERVER_CLOUD` にて指定します。コードの場合は以下のように `cloud` キーで指定します。

```js
const express = require('express');
const { ParseServer } = require('parse-server');

// Parse Serverの起動オプション
const config = {
	// 省略
};
const app = express();
const api = new ParseServer({...config, {
	cloud: './path/to/cloud.js' // cloudキーで指定
});
api.start()
  .then(() => {
    app.use('/parse', api.app);
  });

const port = 1337;
app.listen(port, function() {
  console.log('parse-server-example running on port ' + port + '.');
});
```

## 関数の作成

コードの基本の形です。 `Parse.Cloud.define` を使い、1つ目の引数が関数名になります。最終的に文字列や数字を返せば、それがレスポンスとなります。

```js
Parse.Cloud.define("averageStars", async (request) => {
  const query = new Parse.Query("Review");
  query.equalTo("movie", request.params.movie);
  const results = await query.find();
  let sum = 0;
  for (let i = 0; i < results.length; ++i) {
    sum += results[i].get("stars");
  }
  return sum / results.length;
});
```

## 関数の呼び出し

関数の呼び出しは、各SDKを利用するのが簡単です。

### Javaの場合

```java
HashMap<String, Object> params = new HashMap<String, Object>();
params.put("movie", "The Matrix");
ParseCloud.callFunctionInBackground("averageStars", params, new FunctionCallback<Float>() {
   void done(Float ratings, ParseException e) {
       if (e == null) {
          // ratings is 4.5
       }
   }
});
```

### Swiftの場合

```swift
PFCloud.callFunction(inBackground: "averageRatings", withParameters: ["movie":"The Matrix"]) {
	(response, error) in
	let ratings = response as? Float
	// ratings is 4.5
}
```

### Unityの場合

```csharp
IDictionary<string, object> params = new Dictionary<string, object>
{
    { "movie", "The Matrix" }
};
ParseCloud.CallFunctionAsync<IDictionary<string, object>>("averageStars", params).ContinueWith(t => {
  var ratings = t.Result;
  // ratings is 4.5
});
```

### JavaScriptの場合

```js
const params =  { movie: "The Matrix" };
const ratings = await Parse.Cloud.run("averageStars", params);
```

## NCMBとの相違点

NCMBのスクリプトとParseのCloud Codeは、基本的な使い方は似ています。似ているのは以下の点です。

- HTTP呼び出し
- Node.jsが利用できる

違う点は以下になります。

- ParseにはRubyが利用できません
- ParseはHTTPメソッドを指定する必要がありません
- ParseのCloud RunではSDKが利用しているアプリで初期化済みです

## まとめ

Parse ServerのCloud RunはNode.jsを手軽に実行するのに便利です。もちろんTypeScriptで書いてmain.jsにトランスパイルすることもできます。ただし、ParseのJavaScript SDKは型情報がないので、自作する必要があります。

データの管理方法などはParse ServerとNCMBで似ています。他のmBaaSと比べると、全体の修正量はそこまで多くないと思われます。載せ替え先として検討に挙げてください。

[Cloud Code Guide \| Parse](https://docs.parseplatform.org/cloudcode/guide/)
AlibabaCloudと他のクラウドのVPCの考え方の比較

各パブリッククラウドはクラウド上で論理的に分離され、自由にプライベートIPアドレスのCIDRブロックを利用できるように、VPCを提供しています。それぞれのパブリッククラウドはVPCの適用範囲や、利用できるCIDRブロックの範囲には違いがあります。１つのクラウドに慣れていて、他のクラウドを使い始めると注意点があります。
その違いを整理していきます。
※AzureではVPCをVnetと読んでいます。用語をVPCに統一します。
※AlibabaCloudでサブネットをVSwithと読んでいます。用語をサブネットに統一します。

### 目次
1. VPCの適用対象の比較
2. VPCで利用できるCIDRブロックの比較
3. さいごに

### 1.VPCの適用対象の比較
||AWS|Azure|GoogleCloud|AlibabaCloud|
|:--|:--:|:--:|:--:|:--:|
|VPC<br>適用対象|リージョン|リージョン|グローバル|リージョン|
|サブネット<br>適用対象|ゾーン|リージョン|リージョン|ゾーン|
|VM単位<br>アクセス制御|セキュリティ<br>グループ|NSGをNICに適用|FWをタグ適用|セキュリティ<br>グループ|
|サブネット単位<br>アクセス制御|ネットワーク<br>ACL|NSGをサブネット<br>に適用|FWをすべて<br>に適用|ネットワーク<br>ACL|

各パブリッククラウドにおけるネットワークの考え方を見ていきます。まずGoogleCloudのVPCはグローバルなリソースです。全てのリージョンが最初から接続済みのようなイメージです。リージョンごとにサブネットを作成できます。リージョンにサブネットを作成する場合、新規に作成したサブネットはルートテーブル設定済みの状態で追加されます。グローバルのネットを楽に構築できます。次に、AzureはVPC（Azureの場合はVNET）とサブネットいずれもリージョン単位で、複数のAZを跨ぎます。AWSとAlibabaCloudは一番細かく分かれています。VPCはリージョン単位ですが、サブネット（AlibabaCloudの場合はvSwitch）はAZ単位になっています。
各パブリッククラウドのアクセス制御について、AzureとGoogleCloudは同じコンポーネントを使って、適用対象あるいはタグで制御して、VM単位あるいはサブネット単位でアクセス制御できます。AWSとAlibabaCloudはVM単位ならセキュリティグループ、サブネット単位ならネットワークACLで分けています。AWSとAlibabaCloudの違うところは、拒否の制御をしたい場合、あるいは優先度を付けたい場合、AWSはネットワークACLが必要に対して、AlibabaCloudはセキュリティグループで拒否設定と優先度設定ができ、ネットワークACLを使わなくても、セキュリティグループだけで完結できます。

### 2.VPCで利用できるCIDRブロックの比較
||AWS|Azure|GoogleCloud|AlibabaCloud|
|:--|:--|:--|:--|:--|
|VPCの<br>IPアドレス範囲<br>※RFC1918想定|/16~/28|/8~/29|/8~/29|/8~/29|
|サブネットの<br>IPアドレス範囲<br>※VPCと同じ<br>設定で最大範囲<br>※RFC1918想定|/16~/28|/8~/29|/8~/29|/8~/29|
|サブネットごと<br>に予約済みIP数|5|5|4|4|
|予約済みIP①|最初の4つ:<br>・NWアドレス<br>・ルーター<br>・DNS<br>・将来用|最初の4つ:<br>・NWアドレス<br>・デフォルトGW<br>・DNS<br>・DNS|最初の2つ:<br>・NWアドレス<br>・デフォルトGW|最初の1つ:<br>・NWアドレス|
|予約済みIP②|最後の1つ:<br>・ブロードキャスト|最後の1つ:<br>・ブロードキャスト|最後の2つ:<br>・将来用<br>・ブロードキャスト|最後の3つ:<br>・デフォルトGW<br>・将来用<br>・ブロードキャスト|

比較表を見ると、AlibabaCloudは一番特徴的で、ネットワークアドレス以外の予約済みIPは後ろから予約しています。利用者はこのように1番(10.0.0.1)から、クラウド側の予約済みIPアドレスを意識せず、気軽に利用できます。GoogleCloudは最初の２つと最後の２つを予約しています。AWSとAzureは前から予約しています。AlibabaCloudを使い慣れている場合、AWSとAzureを使うと10.0.0.1や10.0.0.2このあたり使えないの、という問題に引っかかる可能性があります。

### 3. さいごに
それぞれのパブリッククラウドのVPCの特徴を比較してみました。使い慣れているほうから別のクラウドを使い始めるときに、ある程度特徴を把握するほうがいいと思います。
【Swift】【Xcode】プロジェクト名を一瞬で変更する

## Xcodeでプロジェクト名を変更したい
プロジェクト名を変更するとき、プロジェクトのルートディレクトリの名前を置換して、ファイル内の全ての既存プロジェクト名を置換して・・・
と何かと面倒だと思います。
プロジェクト名を1発で置換する、シェルスクリプトを作成したので、良かったらお役立てください！


## プロジェクト名を1発で置換するシェルスクリプト
```sh
#!/bin/bash

# 新しいプロジェクト名
# !!!!ここを変更したいプロジェクト名に変更してください!!!
new_project_name="NewProjectName"

# 置換対象の旧プロジェクト名
old_project_name="story_board_template"

# プロジェクトディレクトリ
project_directory="story_board_template"

# プロジェクトファイルのパス
project_file_path="$project_directory.xcodeproj/project.pbxproj"

# プロジェクトファイル内のプロジェクト名を置換
sed -i '' "s/$old_project_name/$new_project_name/g" "$project_file_path"

# ソースコード内のプロジェクト名を置換
find "$project_directory" -type f -name "*.swift" -exec sed -i '' "s/$old_project_name/$new_project_name/g" {} +

# その他のファイルやフォルダ内のプロジェクト名を置換
# 例: find "$project_directory" -type f -name "*.txt" -exec sed -i '' "s/$old_project_name/$new_project_name/g" {} +

# Storyboardファイル内のプロジェクト名を置換
find "$project_directory" -type f -name "*.storyboard" -exec sed -i '' "s/$old_project_name/$new_project_name/g" {} +

# Info.plistファイル内のプロジェクト名を置換
find "$project_directory" -type f -name "Info.plist" -exec sed -i '' "s/$old_project_name/$new_project_name/g" {} +

# ディレクトリ名を新しいプロジェクト名に置換
mv "./$old_project_name" "./$new_project_name"
mv "./$old_project_name.xcodeproj" "./$new_project_name.xcodeproj"

echo "プロジェクト名を変更しました：$old_project_name → $new_project_name"
```

## 使用方法
- 名前を変更したいプロジェクトに移動する
```
cd {変更したいプロジェクト}
```
- 以下をコピーする
```sh
#!/bin/bash

# 新しいプロジェクト名
# !!!!ここを変更したいプロジェクト名に変更してください!!!
new_project_name="NewProjectName"

# 置換対象の旧プロジェクト名
old_project_name="story_board_template"

# プロジェクトディレクトリ
project_directory="story_board_template"

# プロジェクトファイルのパス
project_file_path="$project_directory.xcodeproj/project.pbxproj"

# プロジェクトファイル内のプロジェクト名を置換
sed -i '' "s/$old_project_name/$new_project_name/g" "$project_file_path"

# ソースコード内のプロジェクト名を置換
find "$project_directory" -type f -name "*.swift" -exec sed -i '' "s/$old_project_name/$new_project_name/g" {} +

# その他のファイルやフォルダ内のプロジェクト名を置換
# 例: find "$project_directory" -type f -name "*.txt" -exec sed -i '' "s/$old_project_name/$new_project_name/g" {} +

# Storyboardファイル内のプロジェクト名を置換
find "$project_directory" -type f -name "*.storyboard" -exec sed -i '' "s/$old_project_name/$new_project_name/g" {} +

# Info.plistファイル内のプロジェクト名を置換
find "$project_directory" -type f -name "Info.plist" -exec sed -i '' "s/$old_project_name/$new_project_name/g" {} +

# ディレクトリ名を新しいプロジェクト名に置換
mv "./$old_project_name" "./$new_project_name"
mv "./$old_project_name.xcodeproj" "./$new_project_name.xcodeproj"

echo "プロジェクト名を変更しました：$old_project_name → $new_project_name"
```

- スクリプトファイルを作成する
```
vim changeName.sh
```

- コピーしたものを、ターミナルにペーストする （変更後のプロジェクト名を設定する）
```
コマンド　+ v で 貼り付け
このとき、変更後のプロジェクト名は、「 NewProjectName 」になります。
NewProjectName を、お好きなプロジェクト名に置き換えてください。
```

- シェルスクリプトファイルを実行できるように権限を与える
```
chmod +x changeName.sh
```

- シェルスクリプトを実行する
```
 ./changeName.sh
```

### 以上です！
e-Tax 確定申告　株・FX・ふるさと納税　画像で解説

## 環境
- パソコン（Windows）
- ブラウザやマイナンバーの読み取り関連はできるようにしてください．ここには書きません．
- ここでは株やFxでの損益があるため確定申告の必要なサラリーマンを対象としています．

## 画像での解説
ホームページに行きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242971/d3e718aa-3ce0-b77c-f9f6-e785b7966cda.png)

「確定申告等の作成はこちら」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242971/526456d9-17fe-ac53-1bff-4432af41df20.png)

作成開始
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242971/ae42cae1-1c84-101b-d6c5-23692cd85b9c.png)

提出方法は使えるやつをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242971/7d060ef3-bd0f-64d5-c3d8-114fedaef3ba.png)

所得税，赤いやつをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242971/a258b20c-7ff8-038a-3f4f-db56e42a2262.png)

マイナポータル連携の選択．気分で決めて，次へ
（現在のマイナポータルで連携できるものは大抵の場合，手動でXMLファイルをダウンロードしてきてそのままアップロードすればいいので，あまりメリットは感じられませんでした．）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242971/caa44213-4df4-adca-b580-bf0bcacf8ae8.png)

利用規約に同意→マイナンバーカード読み取り→住所氏名などの個人情報確認→・・・

会社からもらった源泉徴収票を見ながら給与所得等を入力．
証券会社の年間取引報告書や取引履歴を見ながら．．．

最後に送信前確認用のPDFが表示されるので，しっかり確認すること．

## メモ書き
- 一般株式・・・上場株式等を除く**非上場株式など**，なので一般的な人が取引することはまれだと思われる．
- 基本的には証券会社の年間取引報告書を見ながら入力することになる．「○○証券　確定申告」など検索すると良い．
- 上記の一般株式など，日ごろから利用しない用語があり，あいまいな単語は検索したほうが良い．
- ふるさと納税はXMLファイルをダウンロードしてアップロードするだけでいい．例えば楽天ならすべての返礼品のデータを一つのファイルにまとめてくれるため，1つのファイルをeTaxにアップロードすればよい．

株やFXの所得は総合課税か分離課税か選べるらしい
- 総合課税：総所得900万円程度まで総合課税の方が税金が安いらしい．**損益通算できない**．いわゆる上限45％の累進課税．
- 分離課税：**損益通算ができる**．いわゆる一律20%の課税．

何か間違いなどあればコメントしてください．
未経験でのエンジニア転職活動開始！

初めましての方も多いかもしれません。
Gintaroと申します。(飼っていたハムスターの名前を借りています。太郎ですが中身は女です。)
これから完全未経験からエンジニア転職を目指すということで、
上手くいくかそうでないかはわかりませんが記録を残そうと思い執筆しています。

## 背景
(興味がある方は読んでください。無い方は飛ばしていただいて結構です。)
まず私は前職全くエンジニアと縁の~~ない~~ないこともない不妊治療のクリニックで働いていました。
内容は不妊治療の技術職です。簡単に言うと体外受精とかする人です。身バレが怖いのでここまでにしておきます。前職の退職理由は、体調を崩してしまったからです。というのも、清潔で体内と同じような環境を求められる職場にいたので、陽圧で日光に一切当たらない、建物の中でも最深部？のような場所で働いていました。日光に当たらないのでメラトニンが合成できず、その影響で夜も眠れず出勤して陽圧の部屋に行くと体調を崩すを繰り返していました。

なんとか1年弱耐えましたが、さすがに将来のことを考えると続けられないですし、転職するなら早く決断した方が良いと思い退職を決断しました。また、23歳というのもあり、今から再スタートすれば特殊な職業以外は何にでもなれる可能性があると考えていました(当時)。

## なぜエンジニアを目指そうと思ったか
前職の影響もあり、専門性があり学ぶことが面白そうなエンジニアにすぐ興味を持ちました。逆に他の職業だと何を極めればいいのか分からないなとか、自分が興味を持てない内容であったりだとか、将来のビジョンが見えないなど色々思うところがありました。

学生時代から性格以外で自分のいいところが勉強をストイックに頑張れるところぐらいしかないと思っていたので、エンジニアは日々学ぶことが大事でそれを続けられれば自分の理想のキャリアを築けるのではないかと思いました。それだけでは補えないところもあるかもしれませんが。

また、人と関わる仕事をしたいと考えていたので、そこが前職との大きな違いだと思います(前職は閉鎖空間に少人数で仕事をしていたので、実は就職後の大きなギャップでした。)。前職にいたときも社員の方に転職するならコミュニケーション能力活かせるところがいいよと言っていただけたので、そこは謎に自身を持っています。

そんなこんなで、まずはやってみないと分からないということでプログラミングスクールを受講し始めました。幸いなことに、プログラミングの学習はとても面白く、現在は順調に進んでいます。

## 現在の学習・転職活動状況
1月からプログラミングスクールを受講しており、3月で卒業予定です。現在3か月目で絶賛PF作成中です。少し学習を振り返りつつ現在に至るまで書きます。

1月にはHTML,CSS,Ruby,Ruby on Railsなどを主に学び、その傍らでJavascript,jQureyの勉強をしていました。

2か月目からはチーム開発が始まり、ECサイトの制作を行いました。チーム開発が正直楽しすぎて衝撃でした。仲間がいるなか学習できるとアウトプットもできますし、エラーが起きたらみんなで解決していたので対応力もつき、GitやGit hubの勉強にもなりました。チームだと開発の仕方が個人と異なるので、そういった部分の勉強にもなりました。実際、私が所属していたチームはチームメンバーに恵まれたおかげか自分の努力も一部あるか分かりませんが、とても良い作品が作れたと思っています。それも込みでスクールでのいい思い出ができました。
また、Qittaで技術ブログを始めたのもこの頃でした。自分の学びを深めることができ、さらに言語化の練習ができるのでまさに一石二鳥でした。また、自分がつまずいたり分からなくなったとき、過去の自分の投稿が助けてくれます。

3か月目に入りもう3分の1が終わりますが、PF制作をしつつ転職活動の準備を始めています。転職エージェントにも登録し、スクールの転職サポート以外も駆使して転職活動をしようと思っています。
というのも新卒で入って1年弱で退職してしまったので、スクール代(70万ぐらい)と生活費(家賃など含め月13万ぐらい)をどちらも自分の貯金から出すとなると転職活動が長引くほど困るので早めに内定を決めて、働きたいという気持ちが強いからです。一応6月ぐらいまでは自力で生きられる予定です笑　
そこまでに内定決まっていなかったら~~ちょっと~~非常にマズイ！です。

## 最後に
少し赤裸々に語りすぎたかもしれないので、恥ずかしくなって投稿するか迷っていますが後で自分が見返したときに人生で大変な時あったけど頑張ったねと言えるように残そうと思います。
未経験かつ前の職歴が短いのでどうなるか分かりませんが、これから全力で頑張ろうと思います。

ここまで読んでくださった方には伝えますが、スクールはDMMWEBCAMPを受講していて転職エージェントは就職Shopというエージェント(リクルートが運営している？)を利用しています。利用している転職サイトは有名どころを登録して求人やオファーを見ている状況です。
(全くPRではありません。)

利用してみての感想ですが、スクールでは確かに完全未経験からエンジニアを目指すというところでカリキュラムの充実と分からないところはメンター利用ができるところがプログラミング初心者に対してとても親切で心強いです。一方で転職サポートに関しては面接指導などは今のところ話に出ていないので、スクール卒業してすぐ転職を始めたい方向けではないような気はします。一応転職補償なるものがありますが私を含め周りの人はみんな補償対象になれなかったらしいので、条件がとても厳しいのではないかと思います。

一方、転職エージェントさんは転職のための面接練習や面接でどんな内容で伝えるかを考えてくださったり、書類の添削もしてくださるのでとても転職に特化していて心強い印象です。私が使っているエージェントさんは無料で、企業さんに直接情報を伝えてくださるので書類審査をパスできる仕組みのようです。

少しでもお役に立てる情報を発信できていたら嬉しいです！
明日からまた技術ブログに戻りますが、4月以降で選考が始まったら情報共有するかもしれないです。
Parse Server JavaScript SDKの使い方（JavaScriptでの位置情報オブジェクト利用）

[ニフクラ mobile backendは3月末で終了します](https://mbaas.nifcloud.com/info/2023/12/post-171.html)。

ニフクラ mobile backendからの移行先として、お勧めしているのが[Parse Server](https://parseplatform.org/)です。設計思想が近く、変更するコード量が少なく済むのではないかと思います。

Parse ServerではWebアプリやCordova（Monaca）アプリ向けにSDKを提供していますが、ドキュメントは英語のみとなっています。そこで、各機能の使い方を解説します。今回は地図アプリなどで使える位置情報オブジェクトの使い方を解説します。

## JavaScript SDKのインストール

JavaScript SDKはCDN版を使うか、npmでインストールする方法があります。CDNの場合は、下記のタグでインストールできます。

```html
<script src="https://npmcdn.com/parse/dist/parse.min.js"></script>
```

npmの場合は、下記のコマンドでインストールできます。

```sh
npm install parse
```

ただし、JavaScript SDKはTypeScript用の型定義を提供していませんので注意してください。

## 初期化

SDKの初期化は任意の場所で行えますが、npmの場合はまずインポートが必要です。

```js
const Parse = require('parse');
// または
import Parse from 'parse';
```

React Nativeの場合は下記になります。

```js
const Parse = require('parse/react-native.js');
// または
import Parse from 'parse/react-native';
```

さらにNode.js向けは以下になります。

```js
const Parse = require('parse/node');
// または
import Parse from 'parse/dist/parse.min.js';
```

初期化はアプリIDとJavaScriptキーを指定します。さらにサーバーURLを指定します。

```js
Parse.initialize("YOUR_APP_ID", "YOUR_JAVASCRIPT_KEY");
Parse.serverURL = 'http://YOUR_PARSE_SERVER:1337/parse'
```

## 位置情報オブジェクトの作成

Parseの位置情報オブジェクトの作成は `Parse.GeoPoint` になります。緯度経度をオブジェクトで指定します。

```js
const point = new Parse.GeoPoint({latitude: 40.0, longitude: -30.0});
placeObject.set("location", point);
```

取得する際には `get` メソッドを使います。

```js
placeObject.get("location");
```

## 位置情報検索

位置情報検索は複数のメソッドがありますが、基本は `ParseObject.GetQuery` を使った方法で変わりません。

```js
// ユーザーの位置情報を取得
const userGeoPoint = userObject.get("location");
// クエリーを作成
const query = new Parse.Query(PlaceObject);
// ユーザーの位置情報から近いデータを取得
query.near("location", userGeoPoint);
// 検索実行
const placesObjects = await query.find();
```

二つの位置情報を指定する、 `withinGeoBox` メソッドなども用意されています。

```js
const southwestOfSF = new Parse.GeoPoint(37.708813, -122.526398);
const northeastOfSF = new Parse.GeoPoint(37.822802, -122.373962);

const query = new Parse.Query(PizzaPlaceObject);
query.withinGeoBox("location", southwestOfSF, northeastOfSF);
const pizzaPlacesInSF = await query.find();
```

他、位置情報検索系は以下のようなメソッドがあります。

- withinKilometers(key, point, maxDistance, sorted)
- withinMiles(key, point, maxDistance, sorted)
- withinRadians(key, point, maxDistance, sorted)

## ポリゴン

複数の位置情報を用いたポリゴンを利用できるのはParse Serverのみです。

```js
const points = [[0,0], [0,1], [1,1], [1,0]];
const inside = new Parse.GeoPoint(0.5, 0.5);
const outside = new Parse.GeoPoint(10, 10);
const polygon = new Parse.Polygon(points);
// trueが返ってくる
polygon.containsPoint(inside);
// falseが返ってくる
polygon.containsPoint(outside);
```

検索する場合には `withinPolygon` を使います。

```js
query.withinPolygon("location", [geoPoint1, geoPoint2, geoPoint3]);
const robjectsWithGeoPointInPolygon = await query.find();
```

## まとめ

Parse Serverの位置情報オブジェクトは、NCMBと変わらず利用できます。なお、Parseにはポリゴンという複数の位置情報を利用したオブジェクトがあります。

データの管理方法などはParse ServerとNCMBで似ています。他のmBaaSと比べると、全体の修正量はそこまで多くないと思われます。載せ替え先として検討に挙げてください。

[JavaScript Developers Guide \| Parse](https://docs.parseplatform.org/js/guide/)
Elixir: mix の使い方

こちらを参考にしました。
[Elixir のはじめ方](https://blog1.mammb.com/entry/2015/08/04/004748)

## バージョンの確認

```bash
elixir -v
mix -v
```

## プロジェクトの作成

```bash
mix new example01
```

プロジェクトのフォルダーに入る

```bash
cd example01
```

## プログラムの作成

次のコードを lib/example01.ex に加える

```exs
  def main([]) do
    IO.puts "こんにちは"
    IO.puts "Hello world."
    IO.puts "Mar/08/2024"
  end
  ```

  ```exs:lib/example01.ex
（省略）
  def main([]) do
    IO.puts "こんにちは"
    IO.puts "Hello world."
    IO.puts "Mar/08/2024"
  end

end
```

## コンパイル

```bash
mix compile
```

```text
$ mix compile
Compiling 1 file (.ex)
Generated example01 app
```

## 実行

>Example01 と大文字になっていることに注意

```bash
mix run -e "Example01.main([])"
```

```text
$ mix run -e "Example01.main([])"
こんにちは
Hello world.
Mar/08/2024
```
ストラテジパターン

```
public enum MethodType {
    METHOD_A,
    METHOD_B
}

public interface MethodStrategy {
    void execute();
}

public class MethodAStrategy implements MethodStrategy {
    @Override
    public void execute() {
        // methodA の実装
    }
}

public class MethodBStrategy implements MethodStrategy {
    @Override
    public void execute() {
        // methodB の実装
    }
}

public class MethodExecutor {
    public static void execute(MethodType methodType) {
        MethodStrategy strategy;
        switch (methodType) {
            case METHOD_A:
                strategy = new MethodAStrategy();
                break;
            case METHOD_B:
                strategy = new MethodBStrategy();
                break;
            default:
                throw new IllegalArgumentException("Invalid method type: " + methodType);
        }
        strategy.execute();
    }
}

public class Test {
    public static void main(String[] args) {
        MethodExecutor.execute(MethodType.METHOD_A);
        MethodExecutor.execute(MethodType.METHOD_B);
    }
}

```
SourceTree をアップデートしたら SSH 経由でのプル、プッシュが出来なくなった

長期間アップデートをしていなかった SourceTree を気まぐれに更新したら SSH 経由で利用しているリポジトリでプル、プッシュが出来なくなった。

# 発生した環境
- Windows 10 Enterprise 22H2
- SourceTree 3.4.17

# エラー内容
プル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/f33cba65-fb26-5f3c-fbff-99afb22f2081.png)

> git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks fetch --tags origin
fatal: protocol error: bad line length character: XXXX
FATAL ERROR: Error reading from console: Error 109: �p�C�v�͏I�����܂����B
>
>
> エラー終了しました。エラーの内容は上記をご覧ください。

プッシュ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/1fd33bd9-05e0-cfc7-ff5c-bfae29b51ad7.png)

> git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks push -v --tags origin master:master
Pushing to ssh://XXXXX.git
fatal: protocol error: bad line length character: XXXX
FATAL ERROR: Error reading from console: Error 109: �p�C�v�͏I�����܂����B
>
>
> エラー終了しました。エラーの内容は上記をご覧ください。

迫真の文字化け

# 原因
[Sourcetree newer than 3.4.7 can't fetch/pull with a fatal protocol error: bad line length character](https://stackoverflow.com/questions/76709045/sourcetree-newer-than-3-4-7-cant-fetch-pull-with-a-fatal-protocol-error-bad-li)

上記の Stack Overflow によると SourceTree にバンドルされている plink.exe の影響らしい。

# 解決策
Stack Overflow で記載してくれている手順と同じ。

https://www.sourcetreeapp.com/download-archives から Windows 用 SourceTree 3.4.7 をダウンロードする。

SourceTreeSetup-3.4.7.exe をダブルクリックする。

SourceTree が 3.4.7 にダウンデートされる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/f7a06ce3-f45a-afe3-537a-273402426f0a.png)

`C:\Users\ユーザー名\AppData\Local\SourceTree\app-3.4.7\tools\putty\plink.exe` を適当な場所へコピーして退避する。

SourceTree をアップデートする。

念の為、SourceTree を再起動して、バージョンが上がっていることを確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/eb60eed6-cf53-e1a3-2834-7647b3083df5.png)

退避しておいた 3.4.7 の plink.exe で `C:\Users\ユーザー名\AppData\Local\SourceTree\app-3.4.17\tools\putty` 内の plink.exe を上書きする。

プル、プッシュが正常に行えることを確認する。
voicevoxエンジンをたたいてみるの巻

voicevoxエンジンをpostman経由で叩いてみる。作ったものがうまく動かなかったときの問題点切り分けに使おうかと思ったけどこちらも供養

## postmanのインストール

みんな大好きpostman
https://www.postman.com/downloads/

## リクエストの設定①
postで以下のURLに投げるとjsonが返ってくる
```
http://localhost:50021/audio_query?text=テスト&speaker=1
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109016/b056983f-3c5c-4291-595f-c9bb6aabc6fb.png)

## リクエストの設定②

そのままjsonをコピペして「ボディ＞Raw」に貼り付け。パラメータは１と同一のものを設定しておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109016/51506038-b425-08e5-138f-8f0c9926abbc.png)

送信すると画像のように音声が返ってくるのでtextの文字列が再生されてるかどうか確認する。
上極限集合と下極限集合

# はじめに

いつも上極限集合と下極限集合で躓くので、備忘録で残す。

# 上極限集合と下極限集合

集合列$\lbrace A_n \rbrace$に対し, 

```math
\begin{eqnarray}

\lim \sup_{n\rightarrow\infty} A_n = \bigcap_{n=1}^{\infty}\bigcup_{k=n}^{\infty} A_k \\
\lim \inf_{n\rightarrow\infty} A_n = \bigcup_{n=1}^{\infty}\bigcap_{k=n}^{\infty} A_k \\

\end{eqnarray}
```

をそれぞれ、上極限集合、下極限集合という。両者が一致するとき、極限集合という。

イメージは下の通り。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139678/36053e10-7c5a-ddd5-c3dd-537c937071fc.png)


# 上極限集合の意味

$\lim \sup_{n\rightarrow\infty} A_n = \bigcap_{n=1}^{\infty}\bigcup_{k=n}^{\infty} A_k$
$\iff$  任意の$n\geq 1$に対して、ある$k\geq n$が存在して、$a\in A_k$が成り立つ。
$\iff$  $n$を自由にとっても、$k\geq n$となる$a\in A_k$が存在する。
$\iff$  $a\in A_k$となる$k$が無限個ある
$\iff$  無限個の$A_k$に属する元全体の集合

# 下極限集合の意味

$\lim \inf_{n\rightarrow\infty} A_n = \bigcup_{n=1}^{\infty}\bigcap_{k=n}^{\infty} A_k$

$\iff$ ある$n\geq 1$が存在して、任意の$k\geq n$に対して、$a\in A_k$が成り立つ。
$\iff$ ある一定以上の$k$について、それ以上では必ず$a\in A_k$になる。
$\iff$ $a\notin A_k$となる$k$は有限個しかない。
$\iff$ $A_k$に属さない$k$が有限個しかない元全体の集合


# 参考

https://mathlandscape.com/limit-set/

https://www.yasuhisay.info/entry/20080606/1212745941
[Windows 10] AzureVMにおけるCドライブとDドライブの違い

### 環境
***
- Windows 10 Enterprise
- Azure VM

### まとめ
***
- Cドライブ：データ保管用のドライブなので、VMをリブートしても消えない領域（容量不足の際は、追加課金が必要）
- Dドライブ：テンポラリ領域なので、VMを再起動すると消える可能性がある領域（Azure VMの場合は、DドライブをOSドライブとして使用している。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955010/823cf595-ab8e-dfa4-6940-47db66aae3f1.png)

### 補足
***
#### ドライブとは
- 物理ドライブ：HDDやSSD
- 論理ドライブ：一つのHDDやSSDをPC設定で領域を分けること及び、分けた領域
- Cドライブ：一般的にOSを保存
 Cドライブはシステム（OS）ドライブとして使用され、システム（OS）ファイル以外にも、各種アプリケーションをインストールして使用
- Dドライブ：一般的に音楽・動画・画像といったデータや、アプリケーションのファイルを保存

### 参考リンク
***
- [CドライブとDドライブの違いと使い分けについて解説！](https://aprico-media.com/posts/5853)
- [一時ディスクって何？ Azure仮想マシン独自のストレージ構成を理解しよう](https://atmarkit.itmedia.co.jp/ait/articles/1706/01/news040.html)
SQL文と書き方

### SQL文とは
まずSQL文とは簡単に説明すると、データベースに対して指示を出し扱うための言語です。
今後、使う事が多いと感じるためざっくりまとめてみます

#### データベース作成
```sql:データベース作成
mysql> create database company;
```
mysqlログイン後に、SQL文を使用します。
今回、create databaseの後は例として、companyとしています。
これでcompanyというデータベースが作成されました。

#### 使用するデータベースの宣言
```sql
mysql> use company;
```
データベース作成後、これから使っていくデータベースの宣言をします。
上記の記述で、宣言完了です。

#### テーブル作成
```sql
mysql> create table employee
(
id int auto_increment primary key,
name varchar(32),
birth date 
);
```
上記でテーブルが作成されます。
id、nameがカラム名
int、varcharがデータ型
になります。
データ型にもさまざまな種類があるので、調べてみましょう。
またauto_increment primary keyについても調べてみましょう。


#### テーブルの確認
```sql
mysql> show tables;
```
上記の記述で、作成したテーブルを確認できます。

### カラムとは
テーブルにカラムを追加するという事もあると思います。
カラムを追加する手順の前に、簡単にカラムについて説明します。
データベースのカラムはテーブル内の列のことです。各カラムには、その列に格納されるデータの種類や制約が決められています。カラムのデータ型や制約にはいくつかの種類がありますが、基本的にはデータの形式やルールを決める役割を果たしています。


#### カラムの追加
```sql
mysql> alter table employee add tel varchar(32) default null;
```
上記の記述で、employeeテーブルにカラムを追加できます。

```sql:カラムの確認
mysql> show columns from employee;
```
上記の記述で、カラムを確認できます。

#### カラムの削除
```sql
mysql> alter table employee drop column tel;
```
上記の記述で、employeeテーブルからカラムを削除できます。

#### 最後に
SQL文に触れる機会があったのでざっくりまとめてみました。
データベースを使用することも今後たくさんあります。
今のうちに練習してスムーズかつ適切な作業が行えるように努力し続けます！
関数脳を身につけろ！「First-class Function (第一級関数) 」

![kansu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633992/8e695324-4179-5b7c-b6ed-ea0edf43cf8b.jpeg)

エスプリフォートでは、業務内でのシステム開発以外でも、日々アンテナを張りながら仲間同士お互いに技術力を磨き合っています。
そして高めた技術力を顧客のために如何に生かしていくのかということを考え、顧客から頼られる存在としてあり続けています。

今回は「第一級関数」をご紹介いたします。


# 第一級関数とは

第一級関数とは、関数を「第一級オブジェクト（first-class object）」として扱うことができるものを指します。

では、この「第一級オブジェクト」とは、何でしょうか？
ざっくりと説明すると、これは、以下の特徴を持つオブジェクトの事を指します。
（ここでいうオブジェクトとは、プログラム言語の要素、と思ってください）

+ 変数に代入できる
+ 関数のパラメータとして渡すことができる
+ 関数の戻り値として返すことができる

つまり、第一級関数というのは、以下の特徴を持つ関数を指します。

+ 関数を変数に代入できる
→ [プログラム例をすぐ見たい方はこちら](#関数を変数に代入しているプログラム例)

+ 関数のパラメータとして、関数を渡すことができる
→ [プログラム例をすぐ見たい方はこちら](#関数のパラメータとして関数を渡すことができるプログラム例)

+ 関数の戻り値として、関数を返すことができる
→ [プログラム例をすぐ見たい方はこちら](#関数の戻り値として関数を返すことができるプログラム例)

また、これらの特徴を組み合わせることで、関数を組み立てることもできます。
→ [プログラム例をすぐ見たい方はこちら](#関数を組み立てるプログラム例)

文章だけではイメージがつきにくいので、第一級関数を使用できるプログラム言語の一つである「JavaScript」で、プログラム例を見ていきましょう。

# 関数を変数に代入しているプログラム例
```javascript:sample1.js
var fn = function () {
    alert("hello");
}
fn();
```
関数（ここでは無名関数）を変数fnに格納後、実施しています。
これを実行すると、「hello」とダイアログが表示されます。

# 関数のパラメータとして、関数を渡すことができるプログラム例
```javascript:sample2.js
var fn = function(argFn) {
    argFn();
}
fn(() => alert("hello2"));
```
「argFnというパラメータ（関数）を受けてそれを実施する」という関数（ここでは無名関数）を変数fnに格納後、実施する関数を渡して実施しています。
これを実行すると、「hello2」とダイアログが表示されます。

# 関数の戻り値として、関数を返すことができるプログラム例
```javascript:sample3.js
var fn = function(argFn) {
    return argFn;
}
fn(() => alert("hello3"))();
```
「argFnというパラメータ（関数）を受けてそれをそのまま返す」という関数（ここでは無名関数）を変数fnに格納後、実施する関数を渡して実施しています。
これを実行すると、「hello3」とダイアログが表示されます。

# 関数を組み立てるプログラム例
```javascript:sample4.js
var repeat = function(...argParam) {
	return function(fn) {
		argParam.map(p => fn(p));
	}
}
repeat("hello41", "hello42")(alert);
```
「argParamいう複数のパラメータ（関数）を受けて、それを順番に実行する」という関数（ここでは無名関数）を変数fnに格納後、実施する関数をパラメータから一つずつ渡して実施しています。
無名関数内で関数を組み立てた関数を返しています。
これを実行すると、「hello41」「hello42」とダイアログが続けて表示されます。

# まとめ
今回はJavaScriptでのプログラム例を見てみましたが、「第一級関数」を使用できるプログラム言語は他にもあります（Python、Ruby、等）。

うまく活用することで、副作用が少なく、分かりやすいプログラムを作ることができるようになりますので、よければ試してみてください。

https://www.esprit-fort.co.jp/


https://www.esprit-fort.co.jp/recruit/
Lambda Layers で No module named 'pydantic_core._pydantic_core'

## 問題

anthropic を含んだ Lambda Layers を用意したが、以下のエラーが発生して困った。

```text
[ERROR] Runtime.ImportModuleError: Unable to import module 'app': No module named 'pydantic_core._pydantic_core'
Traceback (most recent call last):
```

## 解決方法(anthropic)

`fastapi==0.99.0`を先にインストールすると回避できるようです。

```diff
-pip install -t ./python anthropic
+pip install -t ./python fastapi==0.99.0 anthropic
```

## 解決方法(openai)

`openai`も同様です。

```diff
-pip install -t ./python openai
+pip install -t ./python fastapi==0.99.0 openai
```
Java複数バージョンの共存　対応環境Windows(VSCode)/Linux

ここで言う共存は単一プロジェクト内の共存ではなく、OS上での共存。
例えば、Java11とJava17を楽に切り替えて動作検証テストしたいとき。
システム環境変数でJDKを設定するとバージョン切り替える毎に再設定し端末再起動が必要になってしまう。

vscode(windows版)とlinuxの2パターンについて記載する。

## VSCode（Windows）
ワークスペースで使い分ける方法。
VScodeの設定画面からユーザータブではなくワークスペースタブ側にJava Homeを設定する。
なお、ユーザー側よりワークスペース側の設定の方が優先度が高い。

settings.jsonに設定される内容
```(Java11のワークスペース)settings.json
"java.jdt.ls.java.home":"C:〜11〜"
```
```(Java17ワークスペースの)settings.json
"java.jdt.ls.java.home":"C:〜17〜"
```
※VSCodeでJavaHomeを設定していなければOSのシステム環境変数が使用される。
※VSCodeのバージョンが古い場合のプロパティ名は"java.home"になる。

## Linux
セッション毎で使い分ける方法。
```:ウィンドウ1
export JAVA_HOME='~11~'
```
```:ウィンドウ2
export JAVA_HOME='~17~'
```
```:パスの設定確認
echo $JAVA_HOME
```
パスが表示されれば設定は成功している。
 
セッション切れても設定維持したい場合は
.bashrcファイルに記載する。
なければviで作成する。
```
vi ~/.bashrc
```

```.bashrc
export JAVA_HOME='~11~'

#１つしか設定できないので17はコメントアウト
#export JAVA_HOME='~17~' 

#おまけ
#エイリアスで入力を簡易化
alias java11='export JAVA_HOME='~11~''
alias java17='export JAVA_HOME='~17~''
```

補足
.bashrcを新規作成した場合、閉じて再立ち上げると.bash_profileが作成される。
.bash_profileはログイン時のみ実行され、.bashrcを読み込む。.bashrcはシェル実行都度読まれる。
参考：

https://qiita.com/shyamahira/items/260862743e4c9794b5d2
Lambda の provisioned concurrency をオートスケーリングする方法がある(ことを知って驚いただけの話)

## 答え

Application autoscaling を使えば良い。

ref. [[Lambda]Provisioned Concurrencyを使用率でAutoScalingさせる](https://dev.classmethod.jp/articles/lambda-support-provisioned-concurrency-autoscaling-2/)



## 感想


知らなかった。。。
(AWS management console のLambdaのページには表示されてない。)
Terraformインストール(tfenv)

## 前提

anyenvがインストールされていること

## tfenvをインストールする

```zsh
anyenv install tfenv
```

```
exec $SHELL -l
```

## tfenvを使ってTerraformをインストールする

ここでは最新バージョンのTerraformをインストールする

```zsh
terraform_version=$(tfenv list-remote | egrep -v 'alpha|beta|rc' | head -n 1)
```

```zsh
tfenv install ${terraform_version}
```

```
tfenv use ${terraform_version}
```

```zsh
terraform -version
```

```:出力
Terraform v1.7.4
on darwin_arm64
```