OmniAICreator/Qiita-1.07M huggingface dataset:
WSL で aws, aws-vault コマンドを使うなら Homebrew でインストールしよう

「Homebrew は Mac で使えるパッケージ管理ツール」と思っている方も多いと思いますが (私がそうでした) 、実は Linux でも使えます。なんなら Windows 上の WSL でも使うことができます。

`apt` コマンドでは簡単にインストールできないパッケージがインストールできることも多いので、使えるようにしておくと何かと便利です。

以下は WSL で Homebrew を使い、aws, aws-vault コマンドを使えるようにするまでの流れのメモ。

## 利用環境

```sh
# Windows 側
❯ wsl --version
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47
MSRDC バージョン: 1.2.3575
Direct3D バージョン: 1.606.4
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windowsバージョン: 10.0.22621.963

# WSL 側
❯ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.5 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.5 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
```

## WSL に Homebrew をインストールする

[Homebrew on Linux](https://docs.brew.sh/Homebrew-on-Linux) に書かれた内容に沿ってインストールします。かいつまんだコマンドリストは以下のとおりです。
 
```sh
# インストールに必要なパッケージのインストール
sudo apt-get install build-essential procps curl file git
# インストールスクリプトの実行
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# PATHを通す
test -d ~/.linuxbrew && eval "$(~/.linuxbrew/bin/brew shellenv)"
test -d /home/linuxbrew/.linuxbrew && eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
test -r ~/.bash_profile && echo "eval \"\$($(brew --prefix)/bin/brew shellenv)\"" >> ~/.bash_profile
echo "eval \"\$($(brew --prefix)/bin/brew shellenv)\"" >> ~/.profile
# Shell を再起動して brew が実行できるようになったことを確認する
exec $SHELL -l
brew --version
```

## Homebrew を使って WSL に aws, aws-vault コマンドをインストールする

```sh
# aws, aws-vault コマンドをインストールする
brew install awscli aws-vault
# バージョン確認
aws --version
aws-vault --version
```

## aws-vault で認証情報をファイル保存にする

ここはお好みでどうぞ。
通常、aws-vault では OS に搭載された資格情報マネージャーに情報を登録しようとします。そのため、WSL で使うには資格情報マネージャー相当のものを用意する手間がありますが、以下の設定を加えておくとそういった下準備なしにすぐ使えます。 `AWS_VAULT_FILE_PASSPHRASE=hoge` は暗号化／復号化するときのパスフレーズなので、自由に設定してください。

```sh
echo 'export AWS_VAULT_BACKEND=file' >> ~/.bashrc
echo 'export AWS_VAULT_FILE_PASSPHRASE=hoge' >> ~/.bashrc
exec $SHELL -l
```

## 終わりに

はい、いくつかのコマンドだけで、Homebrew のセットアップから aws, aws-vault コマンドまで使えるようになりました！

aws コマンドは言わずもがな AWS リソースを操作するコマンドですが、aws-vault は聞き慣れない方もいらっしゃると思います。これは、aws cli を使う際の認証情報を暗号化して保持するためのツールです。使ったことが無い方は [クラスメソッドさんの記事](https://dev.classmethod.jp/articles/aws-vault/) なんかで分かりやすく解説されているので、ぜひ使ってみてください。

## 参考リンク

- [The Missing Package Manager for macOS \(or Linux\) — Homebrew](https://brew.sh/)
    - [Homebrew on Linux](https://docs.brew.sh/Homebrew-on-Linux)
- [AWS Vaultで端末内のAWSアクセスキー平文保存をやめてみた \| DevelopersIO](https://dev.classmethod.jp/articles/aws-vault/)
【Rails】インスタンス一覧と新規インスタンスを同時に取得するときの挙動が少し意外だった

# はじめに
先日、一覧を取得するページで新規レコードも登録できるフォームを設置する必要に迫られたのですが、その時Railsが自分としては意外な動きをする部分があったので紹介します。
# 完成形イメージ

- `User`と`Task`モデルは1対多の関係
- `Task`の一覧を表示しつつ、同じページに新規タスクの入力フォームを設置

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051539/c58768c4-a081-21fb-4dfd-8cba4e7530c4.png)

# エラーが発生するコード

```ruby:tasks_controller.rb
def index
  current_user = User.find(params[:user_id])
  @tasks = current_user.tasks
  @task = @tasks.new
end
```
`@task`の書き方を変えた下記でも同じです。

```ruby:tasks_controller.rb
def index
  current_user = User.find(params[:user_id])
  @tasks = current_user.tasks
  @task = current_user.tasks.new
end
```
### 発生したエラー
上記のように書いたところView側でエラーが発生しました。

```
ActionController::UrlGenerationError in Tasks#index

No route matches {:action=>"show", :controller=>"tasks", :id=>nil, :user_id=>"2"}, missing required keys: [:id]
```

`id`が`nil`で、タスク詳細へのリンクを作れない、というエラーでした。

# 原因はタスクの一覧データに新規インスタンスを含んでしまっていたこと

調べると、原因は、
**コントローラで`@task = @tasks.new`をしたタイミングで`@tasks`に新規インスタンスが突っ込まれてしまうこと**
でした。

```ruby:tasks_controller.rb
def index
  @tasks = current_user.tasks
  @task = @tasks.new
  # ここで@tasksを見ると、↑でnewしたインスタンスが入っている.
  # @tasks => <ActiveRecord::Associations::CollectionProxy [#<...略..., #<Task id: nil, user_id: 2, created_at: nil, updated_at: nil, title: nil>]>
end
```

一覧を表示するときに`@tasks`を`each`で回して各レコードのデータを表示しているのですが、その`@tasks`に`new`したインスタンスが入ってしまっていて、バグが混入するという具合です。

これは、関連づけがない場合には起こらないです。
（`ActiveRecord::Associations::CollectionProxy`あたりの仕組みを調べれば分かりそうな感じがしますが、根本的な究明まではできていません。）
例えば、以下のコードは何の問題もなく動きます。
```ruby:tasks_controller.rb
def index
  @tasks = Task.all
  @task = @tasks.new
  # @tasksにnewしたインスタンスは入っていない
end
```

## 補足：`current_user`をprivateメソッドで生成すると少し結果が変わる

この記事を書こうと思って色々触っていて気づいたのですが、先述のコードで、`current_user`を変数ではなくprivateメソッドで生成すると結果が少し変わりました。

下記の書き方だと変わらず失敗します。

```ruby:tasks_controller.rb
def index
  @tasks = current_user.tasks
  @task = @tasks.new
  # この時点で、@tasksにnewしたインスタンスが入ってしまう
end

private

def current_user
  User.find(params[:user_id])
end
```

しかし、`@task`の定義を変えると、今度は成功するようになります。

```ruby:tasks_controller.rb
def index
  @tasks = current_user.tasks
  @task = current_user.tasks.new
  # @tasksにnewしたインスタンスは入らない
end

private

def current_user
  User.find(params[:user_id])
end
```

この書き方だと、`current_user`をその都度作るので、`@tasks`に`new`したインスタンスが含まれないということのようです。

# バグの回避方法

このバグの回避方法は簡単です。どちらかの定義について、関連づけのさせ方を変えてあげれば良いです。
いくつか紹介します。

①`Task.new`を使う
```ruby:tasks_controller.rb
def index
  current_user = User.find(params[:user_id])
  @tasks = current_user.tasks
  @task = Task.new(user: current_user)
end
```

②`Task.where`を使う
```ruby:tasks_controller.rb
def index
  current_user = User.find(params[:user_id])
  @tasks = Task.where(user: current_user)
  @task = @tasks.new
end
```

③`@tasks`を配列にする
以降の処理で、ActiveRecordである必要が必ずしもない場合は、配列にするという方法もあります。
```ruby:tasks_controller.rb
def index
  current_user = User.find(params[:user_id])
  @tasks = current_user.tasks.to_a
  @task = current_user.tasks.new
end
```

# さいごに
本当はなぜこうなるのか、という仕組みの部分まで究明したかったのですが、今回はそこまではできなかったです。
もしかしたら「そりゃそうなるでしょ」という話なのかもしれないですが、自分としては知らない挙動で勉強になりました。
goでblockchain実装してみた

もういろんな人がやっているかもしれませんが、goでブロックチェーンを実装してみました。
レポジトリはこちらです。

https://github.com/greenteabiscuit/go-blockchain

本ネタはこちらでpythonで実装していたものをgoに移植してみた感じになります。

https://hackernoon.com/learn-blockchains-by-building-one-117428612f46

普通のチュートリアルと違うところ
- httpサーバーにして、インタラクティブにしてみました。
- ノードを複数立ち上げて、コンセンサスを取る処理も実装しています。
- 一応テストコードを部分的に書いています。(timeのところが怪しいままになっていますが)

## コンセンサスを取るところまでのシミュレーション

readmeにも書かれていますが、シミュレーションをしてみます。
複数ノード立ち上げてみます。

```
$ go run main.go :8080

別セッションで：
$ go run main.go :8081
```

8080のほうに8081のノードを登録します。

```
$ curl localhost:8080/nodes/register -d \
'{"Nodes": "localhost:8081"}'

New nodes have been added. Total nodes: map[localhost:8081:{}]
```

8081をわざと長くしてみます。

```
$ curl localhost:8081/mine

New block forged, block index 2, transactions [0xc00011c840] proof 35293, previousHash 2aa689b29c7e3bef87216b319de7a09aa5916da4f47586e46d4444c3e58c6583
```

これで8081のほうのチェーンは長さ2、8080はチェーンの長さが1のため、8081が正とされます。
8080はいやでも8081に従わなければいけません。
これは以下のAPIを叩くことでわかります。

```
$ curl localhost:8080/nodes/resolve

chain was replaced, [0xc00007c980 0xc00007c9c0]
```

## 最後に

ブロックチェーンとgo両方について理解する良い機会になりました！
ノード同士のコンセンサスは実装することでさらに理解が深まりました。
Watson自然言語分類どっちが強い？ AutoAI vs. NLU・NLC

# はじめに
ノーコードで学習データをアップロードするだけでIBM Cloudが色々良きに計らってモデルを作ってくれるAutoAI。当初は数値だけでしたが、いつの間にか自然言語も扱えるようになっている！
とくれば、比較したくなりますよね、NLC・NLUとの精度の違いを。

# 試してみること
NLC、NLUで一定の精度がでてきる学習データをAutoAIに与えると、どんなモデルを作ってくれるのか？
2021年9月にIBM Cloud上の自然言語系サービス Natural Language Classifire(NLC) と Natural Language Understanding(NLU)の精度比較をしたので、この時の学習データ、テストデータを使ってAutoAIの精度を見てみましょ。
[Watson NLCとNLUの精度を比べてみた](https://qiita.com/mihoicchi/items/4b7a96d801526a2ffe11)

# 利用データのおさらい
訓練データに使ったのは[ライブドアニュース](https://news.livedoor.com/)から取得したニュースタイトル。対象は5カテゴリで、1カテゴリにつき100件ずつ。合計500件です。
テストデータは同じく各ジャンル20件ずつ、合計100件を準備しました。
・スポーツ
・海外
・経済
・グルメ
・宇宙

表1.訓練データのカテゴリ別文字数

|サービス|スポーツ|海外|経済|グルメ|宇宙|
|--|--:|--:|--:|--:|--:|
|平均|36|32.41|29.5|32.04|31.4|
|中央値|34|32|29|34|32|
|最頻値|33|36|23|16|33|
|標準偏差|6.76|6.32|7.99|10.91|4.28|

# AutoAIでモデルを作る
学習データ、テストデータは比較のため前回と同じものを利用。
ありがたく以下の記事を参照しながらAutoAIが使えるように準備します。
[IBM Developer Learning Paths 日本語サイト AutoAIによるモデル構築の自動化](https://ibm.github.io/japan-technology/Code-Tutorials/automate-model-building-with-autoai/)

※メモ※
Machine Learningサービスインスタンスを同じリージョンに作成しておかないと、資産追加でAutoAIが出てこない。

AutoAIが準備できたら、早速学習データをアップロード。後はほぼワンクリックで自動的にモデルが構築されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25840/2a2f6d6e-2e54-4555-cbfa-f3449f3a69a2.png)


モデルがもりもり作られていく過程が楽しくてつい眺めてしまう。待つこと数分。よしできたぞー！
AutoAIが8つのモデルを作ってくれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25840/398590af-35f2-732d-378f-42bc25efe0ae.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25840/d2eb03fc-ce08-5e74-67e9-7de7e68b4ee0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25840/d5d9093b-89c3-c30a-8505-74d51142ce7f.png)

想定していたような精度のモデルができず、というかグルメと経済にしか興味ないモデルとか、宇宙一択のモデルとかできちゃってる……？
これは何かデータの準備かAutoAIの使い方に問題があった気がしてならない……。こんな正解率低いわけない。もう少し調べて、ここは再度チャレンジしてみよう。
が、いったんモデルもできたので、良さげなものを選んでテストデータを流した結果を見てみたいと思います。

# モデルをテストする
モデルをデプロイすると、もうテストデータ流して使える画面ができてるとか、本当に使いやすくて感謝しかない。
テストデータのCSVをアップロードして予測ボタンを押すだけ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25840/9cd5498e-e5d5-dc26-66e9-7fb26f14bb30.png)

各ジャンル20ずつのテストデータに対して、予測結果は殆どグルメと経済。私の遺伝子の問題か？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25840/be32a76f-bf60-8902-8158-c548d23b09b7.png)

うーん、どこで間違えたんだろう。これかな？と思って文字コードかえて試してみたけど結果はほぼ変わらず。しばらく調査してみます。
[AutoAI の既知の制限事項](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/known-issues.html?locale=ja#autoai-issues)

# まとめ
想定外に正解率が低い結果に。どこかに原因がありそう。
もう少しAutoAIとの仲を深めてから、リベンジする。
というわけで、 AutoAI vs. NLU・NLCの勝負は次回に持ち越しです！


# 参考サイト
[AutoAIでお手軽機械学習(その1) 準備編](https://qiita.com/makaishi2/items/d63f0bbac32a975c391e)
[IBM Developer Learning Paths 日本語サイト AutoAIによるモデル構築の自動化](https://ibm.github.io/japan-technology/Code-Tutorials/automate-model-building-with-autoai/)
[Flutter]Blockchainウォレットの接続方法

# 使用したパッケージ
* [walletconnect_dart](https://pub.dev/packages/walletconnect_dart)
* [url_launcher](https://pub.dev/packages/url_launcher)

# ウォレット接続関数
![carbon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987391/df0c66ba-f0f6-39cc-00a5-22f19a20ac41.png)

```dart
SessionStatus? session;
String? account;
```
上記の2つの変数を用いて関数を呼び出せばウォレットに接続することができます。

# 詳細
https://github.com/shungo0222/flutter-metamask
新卒テスターがテスト業務で楽しいと感じること

## はじめに

AIQVE ONE ゲームテスト/QA Advent Calendar 2022の24日目を担当させていただく
[@adeki_m](https://qiita.com/adeki_m)と申します。
私は2022年4月に新卒としてAIQVE ONE株式会社に入社しました。

入社後にテスト業務や社内で感じたことをお話させていただきます。
あくまで私個人が感じたことを元にしたお話になりますので、ご認識のほどよろしくお願いいたします。

## 入社後に楽しいと感じたこと

**①チェックが楽しい**📝
チェックリストが埋まっていくところが達成感があり、とても楽しいです。
テストケースも同様で、Excelのシートを使用しているためか目視でチェック項目が
減っていくことが実感でき、仕事へのモチベーションに繋がっていると感じています。

入社直後に入った案件では、結果項目をOKやNGにすると色が変わる設定になっていたので、
項目の着手状況もわかりやすく見落とし発生が少ない印象でした。

**②ゲーム画面が華やかで飽きがない**🎮
現在テストを行っているゲームの画面はカラフルでデザイン性があるため、
業務の際に楽しく作業ができます。
新規キャラクターやゲーム性能などのコンテンツの追加も行われるので、
長い期間案件に携わって同じテストを行っていても飽きがないです。

プライべートではゲームは長く続かない方なので、
画面が華やかだと作業が進んでとても助かります。

**③業務にルーティンができる**📚
何回もチェックを行うことで自分の中に作業のルーティンができ、
前回よりも効率よくテストに着手することができます。
また、いろいろな不具合を知っておくことで、似た不具合が発生していた場合
どのような対処を取ればいいのかがわかってくるので、一つのことに対して
悩んでいる時間が減っているように感じます。

**④社内に活気がある**💬
お菓子を交換したり、休憩の合間に会話をしたりなど、とても明るい雰囲気な印象です。
案件内のメンバーとも会話のしやすい距離にあるので、質問や相談がしやすいです。
仕事中はパソコンに向かって無言で作業しているイメージがあったのでこの部分はギャップでもあります。

**⑤ギャップ**🕖
楽しいと感じることとは少し違いますが、入社前はゲーム関連業界は厳しく、
残業が多いイメージだったので、19:00になると一斉に社員が帰宅するところが小さなギャップです。
定時で業務を終えることが多く、残業する機会が少ない弊社ですが、19:15くらいには誰もいない状況に驚きます。
終業前の少しにぎやかな雰囲気が好きだったりします。

## 最後に
以上、新卒でゲームテスト会社に入社後に楽しいと感じたことでした。
もちろん仕事ですので楽しいことばかりではありませんが、
このような機会にどんなことに対して楽しいと思っているのか、
業務のどういったところにやりがいを感じているかを考えることで、
仕事へのモチベーションに繋がると感じました。
これからもいろいろな発見をしていくために、常に考える力を養っていきたいと思います。

最後まで読んでくださり、ありがとうございました。
新卒テスターが意識していること

# ☁はじめに

皆さまはじめまして。
今年の4月に新卒でAIQVE ONE株式会社に入社しました、 [@510e](https://qiita.com/510e) と申します。
なんと社会人、そしてテスターになりたての私が最終日を担当させていただくことになりました。


まだまだ知識と経験不足のためテスト技術に関することはお話難しいので、
新卒テスターの私が、  **『テスターとして、業務を行う上で今意識していること』** をお話させていただきます。
そんな初歩的なこと！？社会人として当たり前では！？と思われる方が多いかと思いますが、
少しでも意味のある記事になればなと思います。どうか温かい目で見守っていただけますと幸いです。

# ☁頻出する不具合を把握しておくこと

日々テスト業務を行っていて感じることは、
「以前にも似たような不具合が出てた気がするな」ということです。

テストを行っていて、「これって不具合なのかな？」と悩むことがありますが、
調べてみると同じような内容の不具合の質問が以前にも上がっていたなんて経験が多々あります。
類似の不具合を知っていると、その分不具合を見落とさずに済んだり、テスト実行の効率が上がったりします。
「このテストをする時はこれを意識する」というのがあるだけで、自分のテストへの自信にも繋がるなと感じます。

そのため、チーム内で行われているやり取りには全て目を通すようにしています。
自分だったら気づけなかったかも、と思う不具合が上がってくることもあるので、
日々それらを吸収して、パワーアップしていけたらいいなと思ってお仕事しています:peach:

# ☁ユーザーの反応を見ること

弊社のツイート監視ツール「Oreo」で、毎日ユーザーのツイートを見ています。
これは、もちろんバグ情報やネガティブな情報を日々のテストに活かすこともできますが、
単純に、自分のモチベーションにも繋がっています。

テスターは、裏方の裏方のような仕事だなと感じることが多いですが、
ユーザーの反応を見ると、私たちが行っているテストはすごく意味のある仕事だなと感じます。
イベントが始まった時に盛り上がる人たちや、終わった時に感謝ツイートをしている人たちを見ると
すごくほっこりして良いです:tulip:

「Oreo」について、詳しくはこちらから
https://www.aiqveone.co.jp/news/2022/397/


# ☁相手に伝わる文章を書くこと

私は、現在アサインしている案件がテスターとして業務するほぼはじめての案件です。
そのため、他の案件の事情はあまりわからないのですが、私のような新米テスターでも先方とのやり取りが非常に多いです。
それまでの私は、先方とのやり取りは主にリーダーがやるのかな、なんて考えていたのですが、
今はやり取りしない日はないほどで、初めの頃は驚きでした。

日々の業務の中で、チーム内でも、先方に対しても質問をすることが多いので
相手に伝わる文章にすることを意識しています。
質問する際は、最終的に〝何が聞きたいのか〟が明確な文章ですね。
質問の際に情報を詰め込みすぎても伝わらないし、
情報が少なすぎると相手が資料を探したりする時間や手間を取らせてしまうので、
必要な情報を選択して、簡潔に丁寧に、を心掛けています。

直接やり取りをしていると、自分の発言・仕事への責任感も強くなります。
これは約8ヶ月経って、強く実感していることです。
ちょっとした言葉の言い回しで印象が変わってくると思うので、これからも気を付けていきたいです:dizzy:

# ☁自分のスケジュールを立てること

案件全体としてのスケジュールを把握しておくのはもちろんのこと、
当たり前ではありますが、自分のタスクのスケジュールを立てることは意識しています。

私はチェックの項目ごとに「これを何時までに終わらせる」とか、「何分で起票する」とか決めながら進めています。
目標時間をこまめに設定しないと、どうしても気持ちがだらっとしてしまうことがあるので、
大事なことだなと思っています。
いくつかタスクが重なってしまった時に優先順位を決められることも、大事だと思います:hibiscus:


# ☁おわりに

 **『テスターとして、業務を行う上で今意識していること』** を4つお話させていただきました。
「テスターとして」というより「社会人として」に寄った内容になってしまったかなと思いますが、
まだテスターとしても、社会人としても1年生なので
日々の業務の中でいろいろなものを吸収して、成長していきたいと思います。

ラストに相応しい内容ではなかったかと思いますが、
最後まで読んでくださりありがとうございました:santa_tone1:
CRC(OpenShift Local)のロールバック＆コロコロバージョンを変える場合の留意点

環境：RHEL8 Workstation

サクッと動作検証できて便利なCRC(OpenShift Local)ですが、バージョンアップするとガッツリ不具合が出ることがあります。

CRCのバージョンアップは、バイナリを新しいものに交換して再セットアップする形となるので、あれ手順間違えたかな？？、みたいなところで悩んだりして時間を費やしたりすることも多いんですが、調査困難な身も蓋もないようなエラーが発生した場合は、さっくり旧バージョンに戻して確認してみた方がいいケースはありますよね。

### [トラブル事例]

事象は様々だとは思うんですけど、タイムリーな話では、CRC-linux-2.12.0-amd64で、OpenDataHub1.4をデプロイすると、DashboardのPodが立ち上がってきませんでした。他のPodは普通に立ち上がって、これだけ基本的なバグみたいなエラーで立ち上がってこないですし、Parseing云々のログ内容より、ODH側の問題かなと、2日位悶絶していました。今回、前バージョンや他環境での動作実績も無かったことも、問題切り分けをややこしくしました、、

```
Environment:
DEV_MODE=false
NODE_ENV=production
DEBUG_PORT=5858
Launching via npm...
npm info it worked if it ends with ok
npm info using npm@6.14.15
npm info using node@v14.18.2
npm ERR! code EJSONPARSE
npm ERR! file /opt/app-root/src/package.json
npm ERR! JSON.parse Failed to parse json
npm ERR! JSON.parse Unexpected end of JSON input while parsing near ''
npm ERR! JSON.parse Failed to parse package.json data.
npm ERR! JSON.parse package.json must be actual JSON, not just JavaScript.
npm timing npm Completed in 296ms
npm ERR! A complete log of this run can be found in:
npm ERR! /opt/app-root/src/.npm/_logs/2022-12-19T17_39_48_632Z-debug.log
```

CRCを１つ前の2.11.0にしたら、直りました。

### [古いCRCに戻す]

前述の通り、CRCのバージョンアップは、バイナリを新しいものに交換して再セットアップする形です。なので、古いバイナリを手に入れればいいだけです。

が、RedHat公式のダウンロードページでは最新リリースしかダウンロードできません。
https://console.redhat.com/openshift/create/local

こちらのGitHubから該当バージョンのCRCを入手できます。
Linux、Windows、MacOS全て置いてあるようです。
https://github.com/crc-org/crc/releases

導入手順は、新規導入の手順と同様。

### [留意点]

異なるCRCバイナリを導入する場合には、現環境の初期化が必要です。その際は、変に前バージョンのものが残っているなどが原因でハマったりしないように、慎重に行いたいところです。

CRCの削除は、基本的には、crcのdeleteコマンドと~/.crcをザックリ消せばいいと思いますが、vmの方まで確認して削除するのがベストと思います。

手順は以下です。
1.crc stop
2.crc delete -f
3.crc cleanup
4.rm -rf ~/.crc ➡pull-secret.txtとかをここに入れてる場合は、全部消すことは無いかもしれませんが、、
5.sudo virsh list --all ➡通常、crc deleteでVMも無くなくなるので、念のためです、以降も残った時のためのもの
6.sudo virsh destroy crc
7.sudo virsh undefine crc

vmが残っている場合には、5.sudo virsh list --allを打った時に以下のようにcrcのVMが残っている状態になると思います。
通常は、残らないです。
```
 Id   名前   状態
---------------------
 1    crc    xxx(シャットオフとかかな、、)
```
【Power BI】日本語のリスト名、列名に URL クエリ文字列パラメーターでフィルターをかける

リスト名、列名が日本語の場合、そのままフィルター URL に使用できません。
SharePoint リストで日本語列を作った際に使われる列の內部名と同じ書式の文字列に変換する必要があります。

https://learn.microsoft.com/ja-jp/power-bi/collaborate-share/service-url-filters#special-characters-in-url-filters

> ### テーブル名と列名に含まれる特殊文字
> テーブル名と列名に含まれる特殊文字とスペースには、追加の書式設定が必要です。 クエリにスペース、ダッシュ、またはその他の非 ASCII 文字を含める場合は、それらの特殊文字の前に、アンダースコアと X ( **_x**) で始まる "*エスケープ コード*" を付け、その後に 4 桁の **Unicode** を続け、さらにもう 1 つのアンダースコアを付加します。 Unicode が 4 文字未満の場合は、それをゼロで埋める必要があります。 次に例をいくつか示します。

URL でフィルターする場合は以下のような書式で指定します。値は日本語でも OK ですが、`テーブル/フィールド` の部分は、変換する必要があります。

```
?filter=<テーブル>/<フィールド> eq '<値>'
```

✖ `?filter=商品マスタ/商品名 eq 'りんご'`
⭕ `?filter=_x5546__x54c1__x30de__x30b9__x30bf_/_x5546__x54c1__x540d_ eq 'りんご'`

# 変換

**PowerShell** で文字列を **Unicode** (16進数) をつなげた文字列に変換します。

```powershell
$str = 'Column 商品名'
-join ($str.ToCharArray() | % {
  if ($_ -match '[a-zA-Z_0-9]') {
      $_
  } else {
      "_x{0}_" -f [convert]::ToString([int][char]$_, 16).PadLeft(4, "0")
  }
})

Column_x0020__x5546__x54c1__x540d_
```

# 参考サイト

- [URL のクエリ文字列パラメーターを使用してレポートをフィルター処理する - Power BI | Microsoft Learn](https://learn.microsoft.com/ja-jp/power-bi/collaborate-share/service-url-filters#special-characters-in-url-filters)
- [SharePointの内部列名を確認する方法 | Japan Dynamics CRM & Power Platform Support Blog (jpdynamicscrm.github.io)](https://jpdynamicscrm.github.io/blog/powerautomate/Look-up-internal-column-names-in-SPO/#内部列名の確認方法)
RubyonRailsチュートリアル：実践メモ【第三章】

<br>
<b>Ruby on Rails チュートリアル</b>(Webサービス開発が学べる学習サービス)に従って、MVCフレームワークアプリケーションを作成していく。<br><br>

**使用ツール** ：
AWS Cloud９
## ローカルサーバーの使用方法
ローカルサーバーについてのまとめ。

※サーバーウィンドウの出し方
1. 一番上のメニューバーから、**preview**を選択する
1. **Preview Running Application**を選択する

#### **サーバーを立ち上げる**
```
$ rails server
```
※サーバーを立ち上げる際は、サーバー用とコマンド用のターミナルを分けると良い。
[新しくターミナルを開く方法](https://qiita.com/suzuki_q/items/59fea2e882197f562ead)
#### **サーバーをシャットダウンする**
`ctrl + C`

#### **ローカルサーバーが立ち上がらない時の対処法**
ポートが使用中というメッセージが出た場合、コマンドで実行中のファイルを確認する
```
$ lsof -i :○○○○　←メッセージ内に書かれているポート番号を入力
```
実行中のファイルが表示されるので、以下コマンドでPID接続しているファイルを終了する。
```
$ kill -QUIT ○○○○　←PIDの番号を入力
```

<br>
<br>

参照：RubyonRailsチュートリアル
: [ローカルサーバー起動できない！時の対処法](https://qiita.com/Gori_deen/items/b22c036a716bfd96959d)
Javaで何か作ってみる(2022/12/19 Day60)

## 今日やった事
- 何もしなかった。
## 参考にしたもの
- 特になし。
## 所感
- 今日は本当何も勉強しなかった、ただただ反省。。。
## 明日の予定
- 引き続き、Springの勉強を進めていく。
Javaで何か作ってみる(2022/12/18 Day59)

## 今日やった事
- 何もしなかった。
## 参考にしたもの
- 特になし。
## 所感
- 今日は本当何も勉強しなかった、ただただ反省。。。
## 明日の予定
- 引き続き、Springの勉強を進めていく。
Javaで何か作ってみる(2022/12/17 Day58)

## 今日やった事
- 何もしなかった。
## 参考にしたもの
- 特になし。
## 所感
- 今日は本当何も勉強しなかった、ただただ反省。。。
## 明日の予定
- 引き続き、Springの勉強を進めていく。
Javaで何か作ってみる(2022/12/16 Day57)

## 今日やった事
- 何もしなかった。
## 参考にしたもの
- 特になし。
## 所感
- 今日は本当何も勉強しなかった、ただただ反省。。。
## 明日の予定
- 引き続き、Springの勉強を進めていく。
配列の勉強する

１次元配列の定義、値変更、配列全体の参照渡し
```sample.java
public class Mavenproject1 {
    int i1[];
    int i2[];
    public Mavenproject1() {
        i1 = new int[2];
        i2 = new int[2];        
    }
    public static void main(String[] args) {
        Mavenproject1 m = new Mavenproject1();
        m.i1[0] = 1;
        m.i1[1] = 1;
        m.i2[0] = 2;
        m.i2[1] = 2;
        m.putlog();
        m.i2 = m.i1;
        m.i1[1] = 3;
        m.putlog();
    }
    public void putlog(){
        System.out.println("i1[0] = " + i1[0]);
        System.out.println("i1[1] = " + i1[1]);
        System.out.println("i2[0] = " + i2[0]);
        System.out.println("i2[1] = " + i2[1]);
        System.out.println("------------------");
    }
}
```
```
i1[0] = 1
i1[1] = 1
i2[0] = 2
i2[1] = 2
------------------
i1[0] = 1
i1[1] = 3
i2[0] = 1
i2[1] = 3
------------------
```
配列初期化子
```sample.java
    public static void main(String[] args) {
        int i1[] = {1,2,3};
        System.out.println("i1[0] = " + i1[0]);
        System.out.println("i1[1] = " + i1[1]);
        System.out.println("i1[2] = " + i1[2]);
    }
```
```
i1[0] = 1
i1[1] = 2
i1[2] = 3
```

２次元配列の定義
```sample.java
    public static void main(String[] args) {
        int i1[][] = new int[2][2];
        i1[0][0] = 1;
        i1[0][1] = 2;
        i1[1][0] = 3;
        i1[1][1] = 4;
    }
```
Javaで何か作ってみる(2022/12/15 Day56)

## 今日やった事
- 何もしなかった。
## 参考にしたもの
- 特になし。
## 所感
- 今日は本当何も勉強しなかった、ただただ反省。。。
## 明日の予定
- 引き続き、Springの勉強を進めていく。
HERE Javascript APIの逆ジオコーディングで現在地を教えてくれるWEBサービスを作る

これは [【HERE WeGo!】ジオファン集まれ！地理空間情報、地図に関する記事を募集しています by HERE Advent Calendar 2022](https://qiita.com/advent-calendar/2022/here)　20日目の記事です

## 動機について
自分が今どこにいるのかすぐわかるモノが欲しいなと思い、HEREの逆ジオコーディングサービスを使ってできそうだなと思いました

## HEREのアカウントおよびAPIキーの準備

https://qiita.com/advent-calendar/2022/here

そのあたりは、このカレンダーの記事でみなさんが書いてくださっているので割愛します

## まずは現在地の取得
JavascriptのGeolocation APIを使います

https://developer.mozilla.org/ja/docs/Web/API/Geolocation_API

Webブラウザに位置情報の取得許可がされていないとgeolocationが使用不可になっているので、その場合の処理を行います
```javascript
if('geolocation' in navigator) {
  // geolocationが使用可能になっている場合の処理
} else {
  // geolocationが使用不可になっている場合の処理
}
```

現在位置の取得は
`getCurrentPosition`で行います
位置情報の取得処理を合わせると以下のような記述になります
```javascript
function success(position:any) {
// 位置情報の取得が成功した場合の処理
    const latitude  = position.coords.latitude;
    const longitude = position.coords.longitude;
}

function error() {
// 位置情報の取得でエラーが発生した場合の処理
}

if('geolocation' in navigator) {
  // geolocationが使用可能になっている場合の処理
  // 現在の位置情報の取得
  navigator.geolocation.getCurrentPosition(success, error);
} else {
  // geolocationが使用不可になっている場合の処理
}
```
## 逆ジオコーディングで住所を取得
現在地の座標が取れましたので、逆ジオコーディングを行い、住所を取得します

https://jp.developer.here.com/documentation/geocoding-search-api/dev_guide/topics/endpoint-reverse-geocode-brief.html

まず、HEREのMapsAPIを導入します
```
npm install @here/maps-api-for-javascript --save
```

で、インポートして
```javascript
import H from '@here/maps-api-for-javascript';
```
逆ジオコーディング
```javascript
const platform = new H.service.Platform({
  'apikey': 'あなたのAPIキー'
});
const service = platform.getSearchService();
// 逆ジオコーディングを行う
service.reverseGeocode({
  // 取得した緯度経度を設定
  at: `${latitude},${longitude}`,
},
(result: any) => {
  const locationLabel = result.items[0].address.label;
  console.log(locationLabel); // 取得した住所が入っている
},
(error) => {
  alert(error);
});
```

## できたもの
こちらです

https://northprint.net/where-am-i/

位置情報の取得許可をしないと取得できませんのであしからず
今UIが全く無い状況ですが、少しづつ改修していくつもりです。。。

ちなみに逆ジオコーディングのリクエスト数が１日1,000回を越えるとエラーとなって取得できなくなりますが、おそらく大丈夫でしょう

ソースコードはこちらになります

https://github.com/northprint/where-am-i

## 感想
こういうサービスが数時間で作れるのは魅力的ですね
精度も高く、個人的には満足なサービスができました

---
明日は@miyauchiさんが投稿予定ですね！お楽しみに
AWS Inspectorにて対応したのにも関わらず、Inspector上から表示が消えない件の対応

Amazon Inspectorは、「AWSのEC2インスタンス等において脆弱性診断を自動で行ってくれるサービス」のことです。
AWS Inspectorにて、 Kernel系の脆弱性が検出されたので、最新版にアップデートして、インスタンス再起動（kernelは再起動しないと最新版が適用されない）したのにも関わらず、いつまで経ってもInspector上から脆弱性の表示が消えないので、サポートに問い合わせました。

どうやら原因は、古いkerlenパッケージがアンインストールされていないと、Inspectorがそれも検知してしまうとのことでした。
以下の通り、古いkernelパッケージも削除して、Inspector上から脆弱性の表示も消えたことを確認しました。

```
■　確認
$ uname -r
3.10.0-1160.81.1.el7.x86_64
　　※今現在、適用されているKernelはこれ。

$ rpm -q kernel
kernel-3.10.0-862.3.2.el7.x86_64
kernel-3.10.0-1160.80.1.el7.x86_64
kernel-3.10.0-1160.81.1.el7.x86_64
　　※インストールされているkernelはこの3つ

↓↓↓↓↓↓↓↓↓

■　古いKernelパッケージ削除 CentOS7の場合
$ sudo package-cleanup --oldkernels --count=1
・・・
完了しました!

or

■　古いKernelパッケージ削除 Rocky Linuxの場合
$ sudo dnf remove --oldinstallonly
・・・
完了しました!

↓↓↓↓↓↓↓↓↓

■　再確認
$ rpm -q kernel
kernel-3.10.0-1160.81.1.el7.x86_64
　　※インストールされているkernelが3つから、1つに減った。めでたし。
```


以上、どなたかの参考になればと思い、ここに残しておきます。
Git　ブランチ関係のコマンド

<h3>ブランチを確認</h3>

```Git
git branch
```

<h3>ブランチを作成</h3>

```
git branch <ブランチ名>
```

<h3>ブランチを変更</h3>

```
git checkout <ブランチ名>
```

<h3>ブランチを作成して変更</h3>

```
git checkout -b <ブランチ名>
```

<h3>ローカルのブランチをリモートに作成</h3>

```
git push -u origin <ブランチ名>
```
JavaScript 日時系input要素への初期値設定 簡易版

日時系のinput要素に対し、現在日時に基づく初期値を設定するためのコードです。
過去に投稿した[日時系のinput要素に対し現在日時に基づく値を初期値として設定](https://qiita.com/akebi_mh/items/5875b5f84df6cecd04e1)ではvalueプロパティに入れる文字列を生成する方向で実装しましたが、使う機会も滅多に無さそうな`type=week`のためのiso8601週番号の計算も省きたい気がしたので、今回は別の方向で。

日時系のinput要素に対しては、`valueAsNumber`プロパティに対して適切な値を入れることでも設定が可能なので、これを利用してみます。

```js:input_date_default_set.js
'use strict';
window.addEventListener('DOMContentLoaded', () => {
  const d = new Date();
  d.setMinutes(d.getMinutes() - d.getTimezoneOffset());

  document.querySelectorAll('input[data-now]').forEach(e => {
    if (e.value !== '' || !['time', 'date', 'week', 'datetime-local', 'month'].includes(e.type)) return;

    e.valueAsNumber = e.type === 'month' ?
      (d.getUTCFullYear() - 1970) * 12 + d.getUTCMonth() : Math.floor(d / 6e4) * 6e4;

    e.defaultValue = e.value;
  });
});
```

### 利用方法 ###

現在日時を初期値として設定したい日時系のinputタグに、`data-now`属性を追記します。

```html:example
<input type='time' data-now>
```

対応するtypeは`time` `date` `datetime-local` `month` `week`の5種です。
ブラウザが非対応のtypeであったり、value要素に既に何らかの値が入っている場合は何もしません。

[元記事](https://qiita.com/akebi_mh/items/5875b5f84df6cecd04e1)で対応していた`type=text`に対してのテンプレート設定も今回は省いています。

----

#### [設置デモ](https://akebi.jp/temp/input_date_default_set_s/) ####

```html:example.html
<!DOCTYPE html>
<html lang='ja'>
<head>
    <meta name='viewport' content='width=device-width,initial-scale=1'>
    <meta charset='utf-8'>
    <title>日時系input要素に現在日時をデフォルト設定</title>
    <script src='input_date_default_set.js'></script>
</head>
<body>
<form>
    <!-- data-nowを追記で現在日時に基づく各typeに合った値を設定 -->
    time<br>
    <input type='time' data-now><hr>
    date<br>
    <input type='date' data-now><hr>
    datetime-local<br>
    <input type='datetime-local' data-now><hr>
    month<br>
    <input type='month' data-now><hr>
    week<br>
    <input type='week' data-now><hr>
<input type='reset'>
</form>
</body>
</html>
```

----
ProxyCommandで多段ssh接続を試してみた


本記事は[新卒エンジニアによる全部俺カレンダー2022](https://qiita.com/advent-calendar/2022/arie_onlyme2022)　21日目投稿記事です。

***
## 前提

踏み台サーバのホスト名: `step`
踏み台からSSH接続するホスト名: `server1`

ローカル -> step -> server1 といった流れでSSH接続する。

## ワンライナーコマンド

`ssh user@server1 -o ProxyCommand='ssh -W %h:%p user@step'`

`ProxyCommand`で踏み台サーバにSSHした上で、server1へSSH接続する。
`%h:%p`はそれぞれ、ProxyCommandの中で**ホスト名・ポート**を表すプレースホルダーである。

## ~/.ssh/configで設定する

`~/.ssh/config`で設定することによって、より短いコマンドで多段ssh接続が可能となる。

```~/.ssh/config
Host step
    HostName xxx.xxx.xxx.xxx
    User user
    Port 22

Host server1
    HostName xxx.xxx.xxx.xxx
    User user
    Port 22
    ProxyCommand ssh -W %h:%p step

```

以下コマンドでSSH接続！
`ssh server1`

これでいつも接続しているサーバに簡単にSSH接続できるようになる。
（もっと早く知りたかった）

## 参考

https://kaworu.jpn.org/security/ssh_ProxyCommand%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9F%E5%A4%9A%E6%AE%B5ssh

https://til.swfz.io/entries/multi_ssh_command/
logrotate でのローテション時に ローテーション済みのファイルをs3へバックアップする

# 概要
* EC2上で logorotate を使ってログのローテーションを行っている環境で
* サーバー上には最近のログだけ残すようにしたい。
* logrotateでローテートされた過去ログは 毎日S3にバックアップする状態にしたい。
* という要求を過去にざっくり実現した時のメモです。

# この記事でやっている事
1. アップロード先のS3バケットを用意する
2. AWS CLIでs3にアップロードを行える環境を用意する 
3. logrotate の設定ファイルを編集する
4. dry run、強制実行で動作チェック

# 1. アップロード先のS3バケットを用意する
* ログファイルのアップロード先となるS3バケットを用意します。
* 基本的に今回試している内容ではアップロードは行うが、消し込み処理は行われないのでデータは蓄積される一方となる。
* s3上の古いファイルの消し込みや異なるストレージタイプへの移動は、S3バケットのライフサイクルポリシーで制御すると簡単に実現できます。

# 2. AWS CLIでアップロードを行える環境を整備する 
* AWS CLIの `aws s3`コマンドを使って実現します。
* アップロード元の logrotateを動作させている環境にAWS CLIのインストールが必要。
* AWS CLIはAmazonLinuxで起動したEC2ならデフォルトで導入済みだとは思います。
    * https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html
* １.で作成したアップロード先 S3バケットへの書き込み権限をインスタンスロールで設定する。
* EC2やECSコンテナ等であれば インスタンスロールで権限を付与すればOS上での認証情報の用意は不要です。
* 検証時は`AmazonS3FullAccess`ポリシーを追加したインスタンスロールをEC2に適用しました。
* IAMで実装したい場合は適切な権限を持ったIAMのCredentials情報を取得しましょう。

# 3. logrotate の設定ファイルを編集する。
* ディストリビューションによりますが logrotate の設定ファイルは `/etc/logrotate.d/`などにあることが多いです。
* 例えば AmazonLinux2 でhttpdを導入した場合は、httpd のアクセスログ、エラーログをローテートするための設定がインストール時に `/etc/logrotate.d/httpd` として追加されます。
* logrotate設定で`lastaction`のセクションを追加する事で ローテート処理実行後に任意の処理を追加することができます。
* 今回の例では dateextで日付情報が付与され gzでCompressされてアーカイブされたファイルを、S3へアップロードしたいのでそのような処理を追加します。
* 以下の設定は各種オプションで毎日強制ローテートさせ、dateextでの日付情報付与と、compressでのgz圧縮を行っている設定の例です。　
```shell
/var/log/httpd/*log {
    missingok
    sharedscripts
    compress
    minsize 0
    rotate 8
    daily
    ifempty
    dateext
    postrotate
      /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
    endscript

    lastaction

      S3Bucket="用意したS3バケット名"
      HOSTNAME=`hostname`

      read DAY MONTH YEAR <<< `/bin/date "+%d %m %Y"`
      DATEEXT="${YEAR}${MONTH}${DAY}"

      for fullpath in $1
      do
        logfile=`/bin/basename ${fullpath}`

        if [ -f ${fullpath}-${DATEEXT}.gz ]; then
          /usr/bin/aws s3 cp ${fullpath}-${DATEEXT}.gz s3://${S3Bucket}/${YEAR}/${MONTH}/${DAY}/${logfile}-${DATEEXT}-${HOSTNAME}.gz
        fi
      done

    endscript
}
```
* `lastaction`の処理中は ローテート対象となったファイルのパスを `$1`で取得できるので、それを元に ローテートされて gz圧縮されたファイルがあれば s3バケットへcpしています。
* もっと雑にやるなら無条件で gzファイルを s3 sync するとかでいいかもしれない。

# 4. dry run、強制実行で動作チェック

### dry run
* 編集したファイルを `/etc/logrotate.d/httpd` 等として設置後に下記のコマンドを実行すると dry run で動作を確認できます。
* -d オプションを付与することで dry run を実行できます。
```shell
logrotate -dvf /etc/logrotate.d/httpd
```

### 強制実行
* -d オプションを除くと -f オプションにより強制実行できます。

```shell
logrotate -vf /etc/logrotate.d/httpd
```
* S3バケットを確認し、ファイルがアップロードされていれば成功です。
* cronで回す場合はcronでもちゃんと回るかは確認しましょう。 直接実行では問題ないのにcronで環境変数周りが違っていて...といった事はよくある。

#### ログを取りたい
* ちゃんと動いているのか不安。
* cron で動かす場合は cron のログに出ているとは思います。
* 個別に取りたいなら lastaction の処理中で `aws s3 cp` の処理結果をテキストファイル等にリダイレクトしたりもできます。
```shell
/usr/bin/aws s3 cp ${fullpath}-${DATEEXT}.gz s3://${S3Bucket}/${YEAR}/${MONTH}/${DAY}/${logfile}-${DATEEXT}-${HOSTNAME}.gz >> /tmp/log.txt
```
* もう少しちゃんとやるなら`logger`などで syslogに出力されるようにしても良いかもしれない。

# まとめ
* 以上、logrotate のローテートのタイミングで、アーカイブをS3へバックアップする方法のメモでした。
新卒エンジニアがAPIをザックリ解説

# そもそもAPIとは
APIとは「Application Programming Interface」の略語
・APIはソフトウェアの一部を公開して、他のソフトウェアと機能を共有できるようにしたものです。
・つまりは、異なるソフトウェア同士連携ができる便利なものと覚えておきましょう。

- APIを賃貸不動産で例えてみる
 
お客様が店舗に入り、仲介会社に希望条件の賃貸物件を探してもらいます。仲介会社はその賃貸物件を管理会社に伝えます。
管理会社は契約書を作ります。仲介会社のおかげでお客様は希望物件に住むことができる。

この例において、お客様に相当するのがAPIの利用者、仲介会社がAPI、そして管理会社(厳密にいうとオーナー)に相当するのがAPI提供元のサーバーです。

API(仲介会社)に希望条件の賃貸物件を探してもらう（リクエスト）ことで、
サーバーから出されたデータや情報が、API(仲介会社)を通じて利用者(お客様)に届けられます（レスポンス）。


詳しい説明はこちらでのURL
https://www.sbbit.jp/article/cont1/62752
https://blog.hubspot.jp/api

# APIの中身は覗けるよ
API連携の開発をする際にレスポンスデータがどう返ってくるか実際に覗く便利ツールがあるため記録。
実際にどんなデータが返ってくるかわかればもう怖くなんかない！

Postman
https://kageura.hatenadiary.jp/entry/hazimetepostman#Postman-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6-OReilly-BookList-%E3%81%AE-Web-API%E3%82%92%E5%8F%A9%E3%81%84%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86

curl
https://qiita.com/akane_kato/items/34b408336f4ec372b139
# APIを連携してみよう
1.  リクエストデータを送信する
まず自分から相手にデータを送信します。

押さえておくべきこと
- Webサービスに接続するための情報（サービス登録時に手に入る）
  - API エンドポイント（サービスに接続するためのURL）
  - API キー（接続に必要なパスワード）
- Webサービスに送信する情報（APIの仕様書で確認できる）
  - メソッド（主にPOSTかGET）
  - クエリパラメータ（使用するAPI・サービスの種類など詳細を指定）
  - ヘッダ（データの種類や、API キーなどの認証情報を入力　※POSTメソッドで指定する）
  - ボディ（APIと送受信したい情報を入力。※POSTメソッドで指定する）

- 架空で各地の天気を取得できるAPIを使用するとして東京の天気の情報をとってくるとしたら下記のように情報を飛ばします。


        // APIに接続するための情報
        $header = {'content-Type: application/json', 'key: abcdefghi12345678'}
        $url = "https:/world_weather.com/api";
        $post = {date='today', area=Tokyo}

        // APIの実行
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

---



２. レスポンスデータを送信する
相手から返答(レスポンス)が返ってくる
- 届いたレスポンスデータから東京は雨だということがわかりますね。

        // レスポンスデータの取得
        {'status: sucess', 'result: rain'}
---



API連携にあたり、ざっくりAPIの大まかな流れとしては
・データを成形
・リクエストデータ投げる
・レスポンスデータが返ってくる
・レスポンスデータを運用しているサービスの型にデータを成形する
だけなのです。

つまり、普段、開発でしているようなデータ成形と仕様が読めさえすれば実は何も怖くないのです。
「たのしいRuby」の著作権

# 「たのしいRuby」の著作権
快調に投稿してきましたが、ふと著作権が気になりました。
Qiita、@dosaidon
## 参考文献
この記事は以下の情報を参考にして執筆しました。
-[たのしいRuby、高橋征義、後藤裕蔵著、 まつもとゆきひろ監修、SBクリエイティブ株式会社、第6版2019年](https://www.amazon.co.jp/%E3%81%9F%E3%81%AE%E3%81%97%E3%81%84Ruby-%E7%AC%AC6%E7%89%88-%E9%AB%98%E6%A9%8B-%E5%BE%81%E7%BE%A9-ebook/dp/B07PNN3TYF/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=1671278506&sr=8-1)
-[『たのしいRuby 第6版』サポートページ、ソースコード](https://tanoshiiruby.github.io/6/index.html)


## 著作権（第5版）
著作権について軽くネットで調べたら、
✅文章は丸写しすることはできない
✅プログラムも丸写しすることはできない
✅引用はできるが改変は一切できない
らしい…

もちろん「たのしいRuby」(第5版)は著作権を放棄していません。
>©2016 Masayoshi Takahashi, Yuuzou Gotou
>本書のプログラムを含むすべての内容は著作権法上の保護を受けております。著者・発行者の許諾を得ずに、無断で複製・複写することは禁じられております。

えっ！
プログラムを改変して使用できない…。いままでQiitaに費やした時間は全て無駄になります。
## 著作権（第6版）
ところが「たのしいRuby」(第6版)は著作権についての書き方が少し違います。
（裏表紙に、2016年版と同じ著作権の文言がありますが、奥付けでこの本はわざわざ2019年3月22日版だと訂正しています）

>2019年4月1日 電子第1版発行
>※この電子書籍は同名印刷物の2019年3月22日第6版第1刷発行のデータを利用しています。
>※元の印刷物と一部異なる場合があります。あらかじめご了承ください。
>
>本書に掲載されているコンテンツの著作権は、著作権法により保護されています。これらについて、著作権法で認められるもの、規約等により許諾が明示されているものを除き権利者に無断で転載・複製・翻訳・販売・貸与・印刷・データ配信（Webページへの転載など送信可能化を含む）・改ざん等する行為は、固く禁じられています。

微妙に変わっています。2016年版にはあったプログラムの文字が無いですし代わりにコンテンツになっています（まあプログラムも広く取ればコンテンツと言えなくはないが）。
つまり、著作権法で認められるものがあるのでしょう。で調べたら著作権法に以下のような文言がありました。

>著作権法第10条
>3.第1項第九号に掲げる著作物に対するこの法律による保護は、その著作物を作成するために用いるプログラム言語、規約及び解法に及ばない。この場合において、これらの用語の意義は、次の各号に定めるところによる。
>一 プログラム言語　プログラムを表現する手段としての文字その他の記号及びその体系をいう。
>二 規約　特定のプログラムにおける前号のプログラム言語の用法についての特別の約束をいう。
>三 解法　プログラムにおける電子計算機に対する指令の組合せの方法をいう。

https://www.hanketsu.jiii.or.jp/hanketsu/jsp/hatumeisi/news/200305news.html
>コンピュータプログラムの複製権，
翻案権侵害の判断の基準を示した事例
「東京地方裁判所　平成１５年１月３１日判決」 
>プログラムの具体的記述が、誰が作成してもほぼ同一になるもの、簡単な内容をごく短い表記法によって記述したもの又は極くありふれたものである場合においても、これを著作権法上の保護の対象になるとすると、電子計算機の広範な利用等を妨げ、社会生活や経済活動に多大の支障を来す結果となる。

https://note.com/gladiator/n/n13001f0324de
>数行から数十行のプログラムについて、きわめて簡単な内容をごく短い構文で表現したものとして創作性はなく、著作物ではない。

なお、数十行を検索したところ
>「数行」とは1～9行
>「十数行」は10行～19行
>「数十行」は20行～99行


がありました

一連の投稿は、Rubyというプログラム言語にあたるのか、あるいは規約に該当するのでしょうか？
自分は投稿はプログラム言語の規約に該当すると考えました。
さらに今回のプログラムは短い（数十行未満）が個人的な結論です。（違っていたらごめんなさい。その場合はコンテンツは削除します。）

## 蛇足
Rubyのマニュアル「オブジェクト指向スクリプト言語 Ruby リファレンスマニュアル」はCC by3.0の元で許諾しています。
個人的には本書のプログラムもCC by3.0である宣言してあったら良かったと思います。
C#.NETで『NULLなら〇〇を代入』に使える合体演算子

# 例えばこんな使い方

```c#:動作確認用サンプル
string tester_1_ = null;

//コンマ区切りでリスト化する時、ぬるぽにならないようにtester_1_がNULLなら空文字を代入。
//ここで登場してる『??』が合体演算子。
//『左の値がNULLなら右の値』といった挙動。
string tester_2_ = tester_1_ ?? "";

//『.Split(',')でぬるぽになってほしくない』
//『tester_1_がNULLなら要素が0のListができあがるという動作でよい』
//といった要件の時。
List<string> list_ = tester_2_.Split(',').ToList();
```

# 蛇足

時にぬるぽで例外吐いてもらった方がよい場合もある。（要件次第）
例外を恐れるあまり『エラー（不備）の握り潰し』をやってしまわないように注意だよ！

# バージョン

Windows 10 Pro 21H2 OSビルド 19045.2364
Microsoft .NET Framework Version 4.8.04084
enebularでnode-red その3

# 概要
enebularでnode-redやってみる。
練習問題やってみた。

# 練習問題
本日、https//qiita.com/itemsが、消えたので
apiを叩いて、新着一覧を手に入れろ。

# フロー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/451299dd-8ef9-3098-8d44-f5ef0875d1f2.png)


# 実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/ed62a831-c728-4861-710c-673725403a87.png)


# 成果物

https://ev2-prod-node-red-79f9e15a-ab8.herokuapp.com/new



以上。
Solana CPIsとは

# 🔀CPI - Cross Program Invocation
CPIは、あるプログラムから別のプログラムへの直接呼び出しのことです。クライアントがJSON RPCを使用して任意のプログラムを呼び出すことができるのと同様に、任意のプログラムが他のプログラムを直接呼び出すことができます。

CPI は基本的に、Solanaエコシステム全体を開発者が自由に使える1つの巨大なAPIに変えます。

# 🤔 How to make a CPI
CPIは、`solana_program`クレートの`invoke`または`invoke_signed`関数を使用して作成されます。

CPI は、呼び出し元の署名者特権を呼び出し先に拡張します。

* `invoke`は、元のトランザクション署名を呼び出しているプログラムに渡します。(https://docs.rs/solana-program/1.10.19/solana_program/program/fn.invoke.html?utm_source=buildspace.so&utm_medium=buildspace_project)
* `invoke_signed`はPDAを使用して、プログラムに命令を「署名」させます。(https://docs.rs/solana-program/1.10.19/solana_program/program/fn.invoke_signed.html?utm_source=buildspace.so&utm_medium=buildspace_project)

![carbon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987391/014a247c-efc2-5d0f-4ed4-4a4272b40e67.png)

`instruction`タイプは以下の定義がされています。
* `program_id`　呼び出すプログラムのパブリックキー
* `account`　呼び出させたプログラムが読み書きする全てのアカウント
* `data`　ベクトルとして呼び出し先プログラムに渡されるデータを表すバイトバッファー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987391/cf7004b5-96e1-c841-504e-46af2623a253.png)

`Instruction`構造体の`accounts`フィールドは`AccountMeta`タイプのベクターです。

![carbon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987391/138e92ae-4d25-ae14-0487-00b32bec7f60.png)

例えば
* `AccountMeta::new`　書き込み可能
* `AccountMeta::read_only`　書き込み不可能
* `(account1_pubkey, true)`　アカウントは署名者
* `(account2_pubkey, false)`　アカウントは署名者でない

`Instruction`作成例
![carbon (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987391/b8d21d7f-4d40-7845-5dfd-2dff96de7978.png)

# 最後に
![Frame 9 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/87f2a488-c5cd-549d-f07f-01b44a1317b8.png)
<b>Veroo</b>は、Blockchain技術を活用した「想いの巡るグルメSNSアプリ」です。食に対する熱量、例えばラーメンがめちゃくちゃ好きで年間400杯食べているとか、変態的に具材にこだわった中華料理を作っているなどのような、今まで直接お金にはならなかった食に対する情熱や熱量、その裏側にある想いがトークンを使うことで巡る世界。自分のラーメンに費やす熱量がコミュニティに承認される。自分がほんとにいいと思って作った食べ物がコミュニティで広まる。Verooは単なるSNSアプリではなく、クリエイターたちの想いが紡がれるソーシャルグルメアプリです。

##### Homepage: https://veroo.xyz/
##### Discord URL：https://t.co/VoT0gpsflA
【Alpine.js】Persistで簡単にlocalStorageへプロパティを保存する

# PersistはAlpine.jsのプラグインです
https://alpinejs.dev/plugins/persist


# Persistでできること
<b><font color="red">Alpine.jsのデータをlocalStorageにデータを保存できます</font></b>

# 導入方法
CDNの方が楽な気がします。
## CDN
HTMLファイルに張り付けるだけです。
<b><font color="red">ただし以下のようにAlpine.js本体のscriptの前に配置する必要があります。</font></b>

```html
<!-- Persistプラグイン -->
<script defer src="https://unpkg.com/@alpinejs/persist@3.x.x/dist/cdn.min.js"></script>
 
<!-- Alpine本体 -->
<script defer src="https://unpkg.com/alpinejs@3.x.x/dist/cdn.min.js"></script>

```
## npm
まずnpmでインストール
```
npm install @alpinejs/persist
```
その後、バンドルするjsファイルにこう書きます。
```js
import Alpine from 'alpinejs'
import persist from '@alpinejs/persist'
 
Alpine.plugin(persist)
```
これで使えます。

# 使用例

このページに飛んで「incrementをクリック」→「ページリロード」をして下さい。
リロードしてもincrement後の数字が残っていることを確かめてみましょう。

https://alpinejs.dev/plugins/persist#magic-persist

::: note
なぜリロードしても保存される?


これはブラウザのlocalStorageに保存しているからです。
Persistを使えばこのようにページをリロードしてもプロパティの値を保存することができます。
:::

# 使い所
公式に載っている使い所なので、気になる用途があればぜひ公式ドキュメント見てみて下さい。

### ①ダークモードの変更維持
アクセスする度にライトモードに戻ってるのはメンドイですよね。Alpine.store()と組み合わせてpersistで維持しちゃいましょう。


https://qiita.com/yowatsuyoengineer/items/ce17131f3d38b27de711


### ②開いたタブの維持
開いたタブやドロップダウンリストが毎回閉じられるとメンドイ場面もあります。persistで維持しちゃいましょう

# 使い方
最後に軽く使い方だけ説明しておきます。
基本的にはプロパティの値を$persistで囲むだけです。

```html
                       ここ⤵︎ 
<div x-data="{ count: $persist(0) }">
    <button x-on:click="count++">Increment</button>

    <span x-text="count"></span>
</div>
```

その他色々使い方が公式ドキュメントに載ってますので見てみて下さい

# まとめ
persistと言えば、redux-persistっていうReduxでローカルストレージを扱うライブラリもありますねぇー(関係ない)
Amazonコネクト　フロー図構築参照記事まとめ

営業時間内でも受付オペレーターがいない場合にはコールバックの設定をしてほしい。
↓

https://dev.classmethod.jp/articles/tips-amazon-connect-improve-customer-ux/


オペレーターが応答できない場合、アナウンスをしてから切断設定
↓

https://blog.serverworks.co.jp/amazon-connect-customer-queue-flow#:~:text=%E3%82%AA%E3%83%9A%E3%83%AC%E3%83%BC%E3%82%BF%E3%81%8C%E5%BF%9C%E7%AD%94%E3%81%97%E3%81%AA%E3%81%84%EF%BC%88%E3%81%BE%E3%81%9F%E3%81%AF,%E3%82%8F%E3%82%8C%E3%81%A6%E5%88%87%E6%96%AD%E3%81%97%E3%81%BE%E3%81%99%E3%80%82




それ以外の構築手順、フロー図参照先
↓

https://dev.classmethod.jp/articles/amazon-connect-bootcamp-step1/
【備忘録】Macの初期セットアップ完全版

Macを貸与とかされたタイミングで今後迷わないようにセットアップする項目をまとめます🔥

<br>

## システム環境設定
### トラックパッド
- タップでクリックをON
- クリックを「弱い」に設定
- 軌跡の速さを「速い」に設定
[![Image from Gyazo](https://i.gyazo.com/a3ecb5a25c4f6d2674323eb42f9c8ec8.png)](https://gyazo.com/a3ecb5a25c4f6d2674323eb42f9c8ec8)

<br>

### キーボード
- キーのリピートを「速い」に設定
- リピート入力認識までの時間を「短い」に設定
- ショートカット→「Spotlight検索を表示」をOFF
[![Image from Gyazo](https://i.gyazo.com/cb6e3b7b257c5ed14a594cea3280d333.png)](https://gyazo.com/cb6e3b7b257c5ed14a594cea3280d333)

<br>

### ディスプレイ
- Night ShiftをONにして色温度を暖かめに設定
[![Image from Gyazo](https://i.gyazo.com/0ef78ea44f413361bb49b1d0ccc7b746.png)](https://gyazo.com/0ef78ea44f413361bb49b1d0ccc7b746)

<br>

### Bluethooth
自分のガジェットの登録
[![Image from Gyazo](https://i.gyazo.com/ce3deaa5b22721587b68bb0f41f3f34a.png)](https://gyazo.com/ce3deaa5b22721587b68bb0f41f3f34a)

<br>

### Dockとメニューバー
- Dockサイズを小さくする
- 「Dockを自動的に表示/非表示」をON
- Dockにある不要なアプリの削除
[![Image from Gyazo](https://i.gyazo.com/00395cee1848a6cf6e95edd564d6114b.png)](https://gyazo.com/00395cee1848a6cf6e95edd564d6114b)

<br>
<br>

## ブラウザ
Google Chromeをダウンロード

https://www.google.com/intl/ja_jp/chrome/


<br>
<br>


## アプリ
### ランチャーアプリ
Raycast
今までAlfredを使っていましたが、ぶっちぎりでRaycastがおすすめです🔥
Alfred, Clipy, Spectacle→Raycastに乗り換えました！
詳細は↓記事で！

https://www.raycast.com/

https://zenn.dev/toono_f/articles/45d2a49650ebf9


<br>


### ターミナル

Warp
今までiTermを使っていましたが、Warpの方がデフォで補完機能などが付いているので便利です！
詳細は↓記事で！


https://zenn.dev/toono_f/articles/03cc961bfd64c1

<br>

### 翻訳

DeepL

https://www.deepl.com/ja/app/shortcut-edit/

<br>



### エディタ

VSCode
初期設定は↓記事を参考にさせていただきました🙏


https://code.visualstudio.com/download

https://qiita.com/yamaguchi2000/items/76060c08764ce4c704f9

VSCodeのターミナルの補完機能などにFigを入れておいた方が便利です！

https://fig.io/

<br>


### 入力補助ツール
キーボードの任意のキーにホットキーなどを設定できるKarabiberを入れています！
USキーボードの左Command→英字・右Command→カナ文字に紐付けてます。

https://karabiner-elements.pqrs.org/

https://misc-log.com/karabiner-elements/


<br>

### リポジトリ管理

使いこなしてないけど、pecoとghqが便利らしい…！

https://zenn.dev/obregonia1/articles/e82868e8f66793

<br>

### その他
必要に応じて、
- Slack
- Docker
- Postman
- table plus
- Notion
- kindle
- Logi Options

などなど

<br>
<br>


## エイリアス

お好きなエイリアスを設定してコマンド入力を短縮します🏃
```terminal:.zshrc
## git
alias g='git'
alias gs='git status'
alias gb='git branch'
alias gc='git checkout'
alias gcb='git checkout -b'
alias ga='git add'
alias gaa='git add -A'
alias gcm='git commit -m'
alias gme='git merge'
alias gp='git push'
alias gg='git graph'

## Rails
alias r='rails'
alias be='bundle exec'
alias bi='bundle install'
alias rs='rails s'
alias rc='rails c'

## Docker
alias d='docker'
alias c='clear'
```

<br>
<br>


## 最後に
そんなもんかな。。。？
忘れているものあったら随時更新します！
他におすすめのツールとか設定があれば是非コメントで教えてほしいです🙏
Apexの日付フォーマットの意外な落とし穴


Apexで日付を取得する関数がありますが、意外な落とし穴があるので注意が必要です。

結論：正確な日付を出力する場合、年のフォーマットは必ず「yyyy」にしましょう。

簡単な例で説明します。
    DateTime nowDate = System.now();
    String strDate1 = nowDate.format('yyyy-MM-dd');
    String strDate2 = nowDate.format('YYYY-MM-dd');
    System.debug('■■■■ Date1 ■■■ ' + strDate1);    
    System.debug('■■■■ Date2 ■■■ ' + strDate2);

これの実行結果は両方同じです。
17:55:05:013 USER_DEBUG [7]|DEBUG|■■■■ Date1 ■■■ 2022-12-20
17:55:05:013 USER_DEBUG [8]|DEBUG|■■■■ Date2 ■■■ 2022-12-20

次にこれを実行してみましょう
    Datetime dt = Datetime.newInstance(2020 , 12, 27, 00, 00, 00);
    String strDate1 = dt.format('yyyy-MM-dd');
    String strDate2 = dt.format('YYYY-MM-dd');
    System.debug('■■■■ Date1 ■■■' + strDate1);    
    System.debug('■■■■ Date2 ■■■' + strDate2);    

フォーマットがYYYYの場合、2021年になりました。
18:05:13:010 USER_DEBUG [15]|DEBUG|■■■■ Date1 ■■■ 2020-12-27
18:05:13:010 USER_DEBUG [16]|DEBUG|■■■■ Date2 ■■■ 2021-12-27

これはApexというより、Javaの仕様によるものです。

年を取得する際、yyyyとYYYYでは取得できる年が異なります。
yyyyはカレンダーの年を取得する。
YYYYは暦週の基準年を取得する。

暦週の基準年は1月1日がある週を基準にしているので、2021年1月1日の週にある2020年12月27日の基準年は2021となります。

実際に私も経験して、大騒ぎにはなりませんでしたが原因がわからず苦労しました。
（元上司が調べてくれて解決しました）

これから年末年始を迎えますが、トラブルにならないようフォーマットをチェックしておきましょうーー

参考URL

https://docs.oracle.com/javase/jp/8/docs/api/java/text/SimpleDateFormat.html

https://kojinjigyou.org/15333/#:~:text=%E5%B9%B4%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E9%9A%9B,%E5%9F%BA%E6%BA%96%E5%B9%B4%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E3%80%82
[Oracle] SQL*Plusで@を含むパスワードを使用するには

# 発生した問題

SQL*Plusで@を含むパスワードを扱うとORA-12154エラーが発生する。

```
[oracle@XXXXXX ~]$ sqlplus USERNAME@SERVICENAME

SQL*Plus: Release 21.0.0.0.0 - Production on Tue Nov 29 14:42:00 2022
Version 21.6.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Enter password:
ERROR:
ORA-12154: TNS:could not resolve the connect identifier specified
```

# 環境

```
[oracle@XXXXXX ~]$ sqlplus -V

SQL*Plus: Release 21.0.0.0.0 - Production
Version 21.6.0.0.0
```

# 解決策

`Enter password:`というパスワードプロンプト時に入力するパスワードの前後をダブルクォートで囲む。

```
[oracle@XXXXXX ~]$ sql /nolog


SQLcl: Release 21.2 Production on Tue Nov 29 16:51:37 2022

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

SQL> connect / as sysdba
Connected.
SQL> ALTER SESSION SET CONTAINER = pdb1;

Session altered.

SQL> CREATE USER PWDTEST IDENTIFIED BY "ABCDefgh1234@$";

User PWDTEST created.

SQL> GRANT CREATE SESSION TO PWDTEST;

Grant succeeded.

SQL> exit
Disconnected from Oracle Database 21c Standard Edition 2 Release 21.0.0.0.0 - Production
Version 21.6.0.0.0
[oracle@XXXXXX ~]$ sqlplus PWDTEST@SERVICENAME

SQL*Plus: Release 21.0.0.0.0 - Production on Tue Nov 29 16:55:18 2022
Version 21.6.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Enter password: ←ここでABCDefgh1234@$と入力し、Enter
ERROR:
ORA-12154: TNS:could not resolve the connect identifier specified


Enter user-name: [oracle@XXXXXX ~]$
[oracle@XXXXXX ~]$ sqlplus PWDTEST@SERVICENAME

SQL*Plus: Release 21.0.0.0.0 - Production on Tue Nov 29 16:55:33 2022
Version 21.6.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Enter password: ←ここで"ABCDefgh1234@$"と入力し、Enter

Connected to:
Oracle Database 21c Standard Edition 2 Release 21.0.0.0.0 - Production
Version 21.6.0.0.0

SQL> exit
Disconnected from Oracle Database 21c Standard Edition 2 Release 21.0.0.0.0 - Production
Version 21.6.0.0.0
```

なお、その他ダブルクォートで囲む必要があるパスワードには、

- マルチバイト文字を含む
- 数字または特殊文字で始まり、英字を含む
- 英字、数字、および特殊文字以外の文字を含む

場合があるようだ。
https://support.oracle.com/knowledge/Middleware/2761789_1.html

@を含む場合については、

- SQLcl
- Oracle Data Pumpのexpdp, impdpコマンド

では、ダブルクォートで囲む必要はなく、SQL*Plus固有の問題であった。
rails　テストのGreenとRedが見やすくなるコード

rails newを実行すると、以下のファイルが自動で生成されます。

```Ruby:test/test_helper.rb
ENV['RAILS_ENV'] ||= 'test'
require_relative '../config/environment'
require 'rails/test_help'

class ActiveSupport::TestCase
  parallelize(workers: :number_of_processors)
  fixtures :all
end
```

このファイルに以下のコードを追加します。

```Ruby
,
,
require 'rails/test_help'
#↓この部分です。
require "minitest/reporters" 
Minitest::Reporters.use!
,
,
class ActiveSupport::TestCase
```

するとテストを実行した時の表示が変わります。

```Bash:Before
rails test
Running via Spring preloader in process 78091
Run options: --seed 32468

# Running:

...

Finished in 3.046170s, 0.9848 runs/s, 1.9697 assertions/s.
3 runs, 6 assertions, 0 failures, 0 errors, 0 skips
```

```Bash:After
rails test
Running via Spring preloader in process 77920
Started with run options --seed 19772

  3/3: [======================================================] 100% Time: 00:00:03, Time: 00:00:03

Finished in 3.34285s
3 tests, 6 assertions, 0 failures, 0 errors, 0 skips #←ここの文字もハイライトが入ります。
```
テストが見やすくなるのでおすすめです。
応用情報技術者試験の学習

2022年4月の応用情報技術者試験に合格したのでそれまでにどう勉強したかを書いていきたいと思います。

# 前提
試験を受ける上で筆者にどれだけ事前知識があるかのイメージが湧けばいいなと思い、軽く経歴を書いてみます。
* 文系、経済学部出身
* 2019年4月の基本情報技術者試験に合格している
* SQLの知識がちょっとある（DMLを業務の中で使った経験あり）

# 勉強方法
1月の末くらいから勉強を開始したので3ヶ月くらい学習時間を確保して試験に臨みました。
勉強メニューは次の2つだけを集中して取り組みました。
* __網羅的に知識のインプットを行う__
    * [キタミ式イラストIT塾 応用情報技術者](https://amzn.asia/d/jkz4zuQ)
    
基本情報の受験から時間が経ってしまっていたこともあって、網羅的に知識のインプットを行いたかったのでまずは1ヶ月くらいかけて参考書を1冊読み込みました。最終的に2周読んだのですが、2周目はテスト直前の１,2週間で一気に読み直しをして覚えたことの再整理をしました。キタミ式の参考書は「最低限の知識を理解しながら覚える」ために使うイメージでした。

* __過去問をひたすら解く__
    * [応用情報技術者過去問道場](https://www.ap-siken.com/apkakomon.php)

個人的にこれがかなり大事でした。情報処理試験では問題文や選択肢もそのまま過去問から引っ張って来ることがあるので、過去問を解くことでかなりの得点力アップにつながります。午後問題は3年分解くと決めて、それ以外の勉強時間は全て午前問題に充てました。ちなみに午後試験は問題を見て以下の6個中から選択しようと決めていました。
*  経営戦略
*  ネットワーク
*  データベース
*  プロジェクトマネジメント
*  サービスマネジメント
*  システム監査

# 受験当日の感想
午前試験では過去問で見たまんまじゃん！という問題が肌感で5問くらい出てくれたので自信につながりました。私は午前試験の結果が明らか6割を下回っていたら帰ろうと思っていたので、試験が終わったらすぐに解答速報を見ながら自己採点をしました。（確か午前試験を合格していないと午後試験は採点してくれないはずです。）

ひとまず午前を乗り切ったことを確認して午後試験へ。午後の選択問題は結局文章を読んで答えられる4つを選択しました…。ネットワークとデータベースの勉強は結果的に午後試験では使いませんでしたが、解けそうな問題を見てから選ぶことができるので、多めに学習しておいてよかったなという印象です。


# おまけ
午前試験の知識はほとんど頭から抜け落ちていて、基本情報の時勉強したはずなのに…という気持ちになりました。基本受かった後すぐに応用も受ければよかったかも…