OmniAICreator/Qiita-1.07M huggingface dataset:
【VirtualBox】ゲストOS起動時のエラー解決方法

ゲストOSの設定を終えていざ起動しようとしたら以下のエラーが発生
```
Failed to get device handle and/or partition ID for 0000000000c208f0 (hPartitionDevice=0000000000000c91, Last=0xc0000002/1) (VERR_NEM_VM_CREATE_FAILED).
```

ホストOSの仮想環境に関する設定の問題みたいです。
【Windowsの場合】

![キャプチャ 2022_06_15 11_26_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666101/17a2c50a-c8f3-5deb-5898-a216eb8b94be.png)
「機能」と検索して「Windowsの機能の有効化または無効化」を選択

![Windows の機能 2022_06_15 11_24_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666101/ea6248ac-5eb7-94ac-7345-3efe4ad92ec0.png)
「ハイパーバイザー」「Hyper V」「仮想マシンプラットフォーム」などのチェックを外しましょう

設定を変更して再起動すればゲストOSを立ち上げられるはずです！
React router dom V6の時の変更点

render関数を使った、routeの書き方の変更

V5まで
![スクリーンショット 2022-06-14 12.03.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671781/432f70fe-334f-fcab-aa64-86df122251ce.png)


V6から
{homeRoutes.map((route) => (
        <Route
          key={route.path}
          path={`/home${route.path}`}
          element={route.children}
        />
      ))}

に変わった
TypeScript で enum を union に変換する方法

## やりたい事

こんな感じの enum があったとして、これを union に変換したい。

```typescript
enum PenguinEnum  {
  EMPEROR = '皇帝ペンギン',
  ADELE = 'アーデリーペンギン',
  HUMBOLDT = 'フンボルトペンギン'
}
```

## やり方

どうやら TypeScript v4.1 で追加されたテンプレートリテラル型を利用することで、 union 型に変換する事ができるようです。

```typescript
enum PenguinEnum  {
  EMPEROR = '皇帝ペンギン',
  ADELE = 'アーデリーペンギン',
  HUMBOLDT = 'フンボルトペンギン'
}

//'皇帝ペンギン' | 'アーデリーペンギン' | 'フンボルトペンギン' 
type penguin = `${PenguinEnum}`

//'EMPEROR' | 'ADELE' | 'HUMBOLDT'
type penguinKeys = keyof typeof PenguinEnum
```


## 参考にした記事

Announcing TypeScript 4.1 - TypeScript: https://devblogs.microsoft.com/typescript/announcing-typescript-4-1/

Typescript: string literal union type from enum - Stack Overflow: https://stackoverflow.com/questions/52393730/typescript-string-literal-union-type-from-enum/64966647#64966647
UbuntuでQGISデスクトップを起動したらpythonのエラーというウィンドウがでる

## 利用できない
以下のようにQGISデスクトップを使うと
![Screenshot from 2022-06-14 11-45-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1626240/aaf709ee-6ce2-d2d1-0a39-141b8e35c9f8.png)
以下のようなウィンドウが出る。
Close後、起動はするがベクタとプラグインを利用することができない。
![Screenshot from 2022-06-14 11-40-42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1626240/2f853d33-241c-a986-2c5e-7d4cd91158aa.png)

## 解決

ターミナルでqgisを実行するとベクタもプラグインも使えるようになった。

```
$ qgis
```

### 注
「お気に入りに追加」後、お気に入りから起動すると「利用できない」と同じ状態に陥る。
DatadogのIntegration Keyを切り替えたいとき

## What's This
Integration Keyを切り替えたいことがあって、その解決のメモです。

## Implementation

```
$ vi /etc/datadog-agent/datadog.yaml

#########################
## Basic Configuration ##
#########################

## @param api_key - string - required
## @env DD_API_KEY - string - required
## The Datadog API key to associate your Agent's data with your organization.
## Create a new API key here: https://app.datadoghq.com/account/settings
#

#　APIキーを変更する
api_key: XXXXX
↓
api_key: XXXXX

$ systemctl restart datadog-agent
```

## Reference 
>API キーとアプリケーションキー
>Datadog Agent をインストールするには、API キーが必要です。Agent が既にダウンロードされている場合は、datadog.yaml ファイルで API キーを>設定してください。メトリクスとイベントの送信を除くと、Datadog の機能の大半は、使用するためにアプリケーションキーが必要です。お客様のアカウントの >API キーとアプリケーションキーは、API 設定ページで管理できます。

 * https://docs.datadoghq.com/ja/getting_started/integrations/#api-%E3%82%AD%E3%83%BC%E3%81%A8%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%AD%E3%83%BC

参考にさせていただきました。ありがとうございます。
solidityのpublic private external internalをシンプルに理解する

# Solidityの関数の権限設定
クリプトゾンビ〜をやっていて関数の権限設定（public private external internal）を学んだのでメモる

## とりあえずシンプルに理解する
**・public**  -コントラクト内外全てからアクセス可能

**・private** -この関数が定義されたコントラクト内からのみアクセス可能

**・internal**  -この関数が定義されたコントラクト内と、継承先からのみアクセス可能

**・external** -外部からのみアクセス可能

## public private external internalについて

### public

この関数が定義されたコントラクトと継承先のコントラクトと外部から呼び出すことができる。
関数に明示的に権限設定しない場合のデフォルトはこれなので、注意が必要

### private

他言語のprivateと同様にコントラクト内でのみ呼び出せる。
継承先・外部コントラクトからの関数の呼び出しはできない


### internal

この関数が定義されたコントラクトと継承先のコントラクトからのみ呼び出し可能。
変数に明示的に権限設定していない場合のデフォルトの設定はinternalになる

### external

外部からのみ呼び出せる
Terminal から VSCode を起動できない

# やりたいこと
Mac に VSCode をインストールしたところ、Terminal 上から `code` コマンドで VSCode を起動できなかった。
Terminal 以外からは普通に起動できるので困ることはないが、ちょっと気持ち悪いので起動できるようにしたい。簡単にできるようになったのでここに書いておく。

# 環境
* Mac
    * CPU： M1 pro
    * メモリ： 16GB
    * OS： 12.2.1 （Monterey）
* VSCode
    * Version： 1.68.0

# どういう状態だったか？
Terminal 上で `code` コマンドを実行すると以下が表示される。
```
$ code
zsh: command not found: code
```

パスが通っていないんだなーというのは分かったので通そうと思ったけど、どこにあったけ...:thinking_face:
となったので、Google 先生に頼ることに。

# 何をしたか？
以下を参考にした。
* https://scrapbox.io/kota-kanazawa-public/EACCES:_permission_denied,_unlink_'%2Fusr%2Flocal%2Fbin%2Fcode'
* https://www.youtube.com/watch?v=2qOn1Gmo4dM

やることは簡単で、VSCode 上からパスを通すというだけ。

1. VSCode を起動する
1. コマンドパレットを開く （`ｃｍｄ + shift + P` とかで）
1. 以下コマンドを実行して、一度パスを削除する （パスワードの入力を求められる）
![スクリーンショット 2022-06-14 11.16.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1743460/04f9af43-ac3e-10db-d503-ce6fd33cf3a3.png)
1. 再度コマンドパレットを開き、以下コマンドを実行してパスを通す
![スクリーンショット 2022-06-14 11.18.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1743460/527ce5a8-ea62-02ef-d135-d624b198d4d0.png)
1. Terminal から `code` を実行すると VSCode が起動する！


これで Terminal でファイル操作していて編集したいときに VSCode でさくっと編集できるようになった:relaxed:


以上です。
Leetcode100問解いたので、振り返りと今後の勉強の方針を整理する。

## はじめに
私はエンジニア志望の修士1年生です。
きたる就活に備えて、勉強中です。模擬面接を行ってくださる方いらっしゃったら教えて下さい！

## なぜLeetcodeを解いているの？
外資系のIT企業の面接対策ではコーディング面接がなされるということで、せっかく本選考まで半年〜1年あるので、早めに対策始めて、あわよくば外資系の内定もらおうぜというモチベーションで、Leetcodeを解いています。

![スクリーンショット 2022-06-13 22.14.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307982/87b1cd7b-18fb-fde0-e5b0-ac94f6eb6f60.png)
こんな感じで4月中頃から解き初め、そして、先日解いた問題数が100問を超えたので、ここまでの振り返りと今後の勉強の方針を整理しようと思います。

## Leetcode100問解いた感想
もともとeasyも解くのが怪しい(純粋な配列操作なら解けるが、木構造やLinkedlistなどは解けない)というような感じでしたが、100問解くと、以下のように変わりました。

- easyはだいたい10分以内には解ける。
- mediumは物によっては15分ぐらいで解けるものもあるし、解説を読んでも理解できないものもある。
- 大体どんな問題でもブルートフォースのアルゴリズムはすぐに思いつくし、説明もできる。
- Leetcodeを解き始めた時と比べて、問題を解く際のボトルネックが移動した。
    -　最初は知識や経験が不足していて問題が解けなかった。
    -　今はシンプルなアイデアを思いつけずに、複雑なアイデアを実装し始めてしまい、バグを埋め込んで、解けなくなってしまう。如何にシンプルなアイデアを思いつくか、その引き出しを増やすかが大事な気がする。

## 今後もLeetcodeを続ける？
<b>部分的にはい</b>
ただ、実務を行う上で、最近はCSの知識や経験が不足しているなと思い、そのような部分をケアしていきたい。具体的には、CS周りの本を読んで毎週1記事書くということを並行してやっていきたい。

ただ、この2週間ほどLeetcodeをサボっていて、インターンの面接を受けるために、一昨日ぐらいからやり直しているが、正直腕が鈍ったなと言う感じが否めない。

なので、Leetcodeも継続して行っていく必要がある。

## 今後の学習プランは？

まず、以下のCS周りの本を勉強して、アウトプットも毎週出す。
- [ ]  ネットワーク→
    - [x]  マスタリングTCP/IP入門編
    - [ ]  マスタリングTCP/IP 応用編
- [ ]  セキュリティー→
    - [ ]  webを支える技術
    - [ ]  マスタリングTCP/IP セキュリティ編
- [ ] Linux周り
    - [ ] ふつうのLinuxプログラミング第2版
- データベース→おうちで学べるデータベースのきほん
- GC→？(いい本あれば教えて下さい！)
- OOP→？(いい本あれば教えて下さい！)
- testing→？(いい本あれば教えて下さい！)

並行して、10月までは毎週Leetcode7問を解くようにする。一日あたり1問。

## 最後に
モチベの波が激しく、うまく行かないことが多いですが、一つ一つ着実にレベルを上げていきたいです。
【Android】OpenCVでUnsupported format or combination of formatsとエラーが出た時の対処法

# 概要

OpenCVのinpaintメソッドを使った際、下記のようなエラーが出た。
```
Unsupported format or combination of formats (8-bit, 16-bit unsigned or 32-bit float 1-channel and 8-bit 3-channel input/output images are supported)
```

# 対策
メソッド実行前に、`cvtColor`で色変換を行えば解決した。
```Kotlin
val src:Bitmap = //(省略)
val mask:Bitmap = //(省略)

//元画像
val srcMat = Mat(src.width, src.height, CvType.CV_8UC3).also {
	Utils.bitmapToMat(src, it, false)
	Imgproc.cvtColor(it, it, Imgproc.COLOR_RGBA2RGB)
}

//マスク画像
val maskMat = Mat(mask.width, mask.height, CvType.CV_8U).also {
	Utils.bitmapToMat(mask, it, false)
	Imgproc.cvtColor(it, it, Imgproc.COLOR_RGB2GRAY)
}
```
Squid透過プロキシでEdgeの更新が出来なくなったのを解消する

# MicrosoftEdgeのアップデートが出来なくなった！

Squidで透過プロキシを構築した後、MicrosoftEdgeのバージョン情報を見ると、
更新プログラムの確認中にエラーが発生している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667610/b04eb9bb-c726-2613-ca11-cf476c914941.png)

トラブルシューティングを読むと「msedge.api.cdp.microsoft.com」への通信を許可しろと書いてるが、ブロックは設定していないので通信は出来るはず。

## 何が起きた？
状況を調べた結果、TLS Handshakeに失敗している状態だった。
MicrosoftのサーバーでTLSエラー？
どうなっているんだと調べたところ「msedge.api.cdp.microsoft.com」の証明書がMicrosoft発行のものでWindows以外には入っていないもののようだった。

## 解決する
ここまでわかれば後はこの証明書を通してやるようにするだけ。

まずは証明書を取り出す。
「certlm.msc」で信頼されたルート証明機関を開きMicrosoft発行の物を探す。
今回は「Microsoft Root Certificate Authority 2011」がルートCAになっていたが念のため「Microsoft Root」で始まるものも入れてしまう。

対象の証明書を右クリックし「すべてのタスク＞エクスポート」
「Base 64 encoded X.509 (.CER)」形式で保存する

:::note warn
警告
以降の操作を行うと、対象のサーバーのルートCAとして信用されます。
サーバー管理者の責任において行ってください。
:::

ではSquidを動かしているサーバーで証明書を取り込みます。

サーバーはUbuntu 20.04です。

この場合ルートCAは以下の場所に入れます
`/usr/share/ca-certificates`
直下でもいいのですが、既に`/usr/share/ca-certificates/mozilla/*`が入っているようですので
`/usr/share/ca-certificates/Microsoft`を作ってそこに入れました。

```Bash
$ ls /usr/share/ca-certificates/Microsoft
MS_RootAuthority.crt  MS_RootCert2010.crt  MS_RootCert2011.crt  MS_RootCert.crt
```

CA証明書のリストは`/etc/ca-certificates.conf`に記載

```Bash
$ cat /etc/ca-certificates.conf | grep Microsoft
mozilla/Microsoft_ECC_Root_Certificate_Authority_2017.crt
mozilla/Microsoft_RSA_Root_Certificate_Authority_2017.crt
Microsoft/MS_RootAuthority.crt
Microsoft/MS_RootCert.crt
Microsoft/MS_RootCert2010.crt
Microsoft/MS_RootCert2011.crt
```
下4行が追加分ですが、mozillaでMicrosoftのも入っているみたいですね。

`/etc/ca-certificates.conf`の変更内容が反映させます。
```Bash
$ sudo update-ca-certificates
```


Squidの方は再起動せずそのままで大丈夫でした。

## 解決！

これで無事Edgeの最新版チェックが通るようになりました。
まあWindows限定なら、Windowsに入っているCAで問題ないけど
こんなことも起こるというのは面白い経験。
Python勉強開始①　2022/06/13

「アルゴリズム×数学」が基礎からしっかり身につく本を読み始めました。
わからないコードが出てくるたびに記事を作って頭を整理しようと思います。
ちなみにコードの説明はnote.nkmk.me　を参考にさせて頂いています。

問題ID002に出てきたmap()の使い方を勉強しました。

map()は、第一引数に適用する関数、第二引数にリストなどのイテラブルオブジェクトを指定する。

ちなみに「イテラブルオブジェクト」とは、for文などで要素を1つずつ取り出して処理できるような（通常、複数の要素からなる）オブジェクトを指す用語である。 例えばリスト、辞書、タプルなど。

中身はそのままでは出力されないのでリスト表記にする必要がある。

```
import math
l = [4, 16, 25]

＃このままでは中身は出力されない
print(map(math.sqrt, l))

＃リスト表記にするとプリントされる
print(list(map(math.sqrt, l)))
>>[2.0, 4.0, 5.0]
```

lambda式を利用して任意の処理を適用したい場合は以下のようになる。

```
l = [3, 6, 9]
print(list(map(lambda x: x/3, l)))
>>[1.0, 2.0, 3.0]
```

しかしmap()よりもリスト内包表記・ジェネレータ式を使う方がいいとのことです。

参考ウェブサイト
note.nkmk.me　
https://note.nkmk.me/python-map-usage/
[AndroidStudio]Android App Bundleファイルのビルド手順

# 前置き
AndroidStudioで作ったアプリをGooglePlayで公表する時、apkファイルまたはaabファイルにビルドします。
旧来のapkに比べてインストール時のファイル容量を小さく出来るaabがGooglePlayでは現在、必須になっています。
# 手順
AndroidStudioのメニューからBuild > Generate Signed Bundle / APK...を選択する
![スクリーンショット 2022-06-13 20.50.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/fd603de2-d8dc-aa93-88d8-60c0ef87a0f0.png)


Android App Bundle(aabファイル)を選択してNextを押す
![スクリーンショット 2022-06-13 20.51.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/6a9458b8-5b41-5231-c9e7-bde04b8b47af.png)


# Key store
Key storeが無い時は最初に「Create new...」を押してKey storeを新規作成します。
次回からは「Choose existing...」で作成済みのKey storeを選ぶだけで済むようになります。

「Export encrypted key for enrolling published apps in Google Play App signing」にチェックを入れておくと指定したフォルダに拡張子pepkのファイルが生成されます。これはGooglePlayConsoleにアプリの署名として登録する為のもので、登録が済めば次回からはチェックを入れる必要は無いです。
![スクリーンショット 2022-06-13 21.38.31 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/73d64e2e-ed7a-5bfc-f235-20e3966d571f.png)

:::note info
Key storeについて
この中でKey storeとは署名するための秘密鍵や証明書の所有者に関する情報を保管するためのファイルです。(複数のKeyの入れ物)
Keyが証明書の暗号化キーです。
:::


Key storeを作成する場合、Create new...を押すとNew Key Storeウィンドウが表示されます。
![スクリーンショット 2022-06-13 21.37.43 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/9077e013-34bc-6985-3aca-786672130fef.png)




Key store pathにKey storeの保存先フォルダを指定します。拡張子にはjksを指定します。
Aliasで任意のわかりやすい名前のラベルをKeyにつけます。指定したい名前が無ければデフォルトのkey0のままで大丈夫です。
ValidityにKeyの有効期間を指定します。デフォルトは25年間です。
Certificateに名前、住所を指定します（少なくとも1箇所だけ入力すればOKのようです）。

# Build Variants
こちらはKey storeを指定する画面でNEXTを押したら表示される画面です。ここで、aabファイルの出力先とBuildVariantsを指定します。
作成したプロジェクトで用意したBuild Variantsの一覧が表示されていますので、デフォルトのままならデバッグ用ビルドには「debug」本番用ビルドには「release」を選びます。
![スクリーンショット 2022-06-13 21.39.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/63f6a79f-7470-bc88-6c83-f3f54e5a261f.png)

# aabファイルの出力
aabファイルが生成されると指定したフォルダにファイルが出力されます。
画面右下に案内が表示されますが、「locate」のリンクをクリックすれば出力先フォルダを直接表示できます。
（目的のファイルを間違えないためにもFinderの日付表示をONにしておくのが良いかもしれません）
![スクリーンショット 2022-06-14 8.41.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/c24ff0ad-f4ed-103a-832e-c0e318219448.png)
Stripe Checkout / Payment Linksの決済ページに特定商取引法へのリンクを追加する

Stripe CheckoutまたはPayment Linksを利用して、顧客に決済ページを提供している場合、決済ページに特定商取引法（以下「特商法」）へのリンクを設定することができます。

## 特定商取引法に基づく詳細と要件(Stripe Supportに移動)

特商法に関する情報については、サポートサイトの記事をご確認ください。

https://support.stripe.com/questions/details-and-requirements-under-the-specified-commercial-transactions-act

## 特商法へのリンクは、ダッシュボードから

リンクの追加は、Stripe Dashboardから行います。

[[設定 > 公開情報]](https://dashboard.stripe.com/settings/public)に移動しましょう。


![スクリーンショット 2022-06-06 12.39.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/51e0559f-ef24-65bf-83b6-2df052589f97.png)

`特定商取引法`欄に、特商法について記載したページのURLを設定しましょう。

URLを設定すると、Payment LinksまたはCheckoutの決済ページ下部に`特定商取引法`リンクが追加されます。

![スクリーンショット 2022-06-06 12.41.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/cff665ed-5667-b0ff-5a37-299f73958caf.png)


## [PR] Stripe開発者向け情報をQiitaにて配信中！

- [Stripe Updates]：開発者向けStripeアップデート紹介・解説
- ユースケース別のStripe製品や実装サンプルの紹介
- Stripeと外部サービス・OSSとの連携方法やTipsの紹介
- 初心者向けのチュートリアル(予定)

など、Stripeを利用してオンラインビジネスを始める方法について週に２〜３本ペースで更新中です。

-> [Stripe Organizationsをフォローして最新情報をQiitaで受け取る](https://qiita.com/organizations/stripe)
programmers問題の答え

1. % 나머지를 사용, ==를 사용 

class Solution {
    public String solution(int num) {
        String answer = "";
        return answer = (num%2==0)? "Even" : "Odd";
    }
}

2. 인터넷 검색은 필히 해야함.
Long을 String으로 할당해야 하며
%(나머지)를 이용해야 하고
/= 를 이용하여 반복
while문을 사용하라고 함(인터넷 검색)

class Solution {
  public int[] solution(long n) {
        // 롱을 스트링으로    
        String s = String.valueOf(n);
        
        // reverse() 메소드를 이용하기 위하여
        // StringBuilder 라는 인스턴스 생성은 해야함
        
        StringBuilder sb = new StringBuilder(s);
        
        // reverse()리버스는 문자열 뒤집는 것임
        
        sb = sb.reverse();
        
        // String.split("")로 한 글자씩 잘라 배열에 담기(인터넷 검색함)
        
        String[] stringArr = sb.toString().split("");
        
        // 문자열 길이 만큼 배열 길이(렌스) 할당
        
        int[] answer = new int[sb.length()];
        
        // String → int → int[]
        
        for (int i=0; i < sb.length(); i++) {
            answer[i] = Integer.parseInt(stringArr[i]);
        }
      
        return answer;
  }
}

최종 2번 코딩 정리
class Solution {
  public int[] solution(long park) {
 
        // 문자열 + 숫자 = 문자열
        String a = "" + park;
        
        int[] answer = new int[a.length()];
        
        int b = 0;
        
        while (park > 0) {
             
            answer[b] = (int) (park % 10);
 
            park /= 10;
 
            b++;
        }      
        return answer;
  }
}


3번
풀이하기 위해 공부!

1)배열 arr의 합과 평균을 구할 변수 park(평균변수)과 jin(합계변수)을 double(실수 타입)로 선언해야 한다고 함(인터넷 검색)
2) 초기값은 0으로 선언
3) for 문을 사용해 jin에 arr 값을 더해줘야함
4) 평균변수를 계산하기 위해 합계변수를 배열의 길이(arr.length)만큼 나눔
5) 리턴 사용하여 결과 반환

class Solution {
    public double solution(int[] arr) {
        double park = 0;
        double jin = 0;
        for(int i = 0; i<arr.length; i++){
            jin += arr[i];
        }
        park = jin /arr.length; 
        return park;
    }
}
良いコード／悪いコードで学ぶ設計入門（ミノ駆動本）を読んだ感想

# 読んだ書籍

**『良いコード／悪いコードで学ぶ設計入門 ―保守しやすい 成長し続けるコードの書き方』**

https://gihyo.jp/book/2022/978-4-297-12783-1

# 学べること

ソフトウェアの保守性、特にその中の**変更容易性**に注目して改善することで**継続的に価値を生み出していくための技術**を学ぶことができる。

- コードには良し悪しがある
- 悪いコードとはどんなコードか
- 悪いコードは何を引き起こすのか
- 悪いコードをどのように良くしていくのか
- 設計についての取り組みを促進するための方法

# 現場で学べる機会が少ない

> プログラミングの入門書を学習し終わった時に、その後にどうやって設計スキルを向上させていけばいいのか。それは自力ではなかなかたどり着けないというか、多くの人がそういうふうに苦しんでいるんじゃないかなって思います。[^1]

[^1]:理想形を知ることで、理想でないものを認識できるようになる 『良いコード/悪いコードで学ぶ設計入門』の5つの特徴、習得可能な2つのスキル https://logmi.jp/tech/articles/326658

私の状況もそんな感じだった。

- 教えてくれる人がない
- 動く機能を作ることが評価される（コードの良し悪しを評価できない/しない）
- 動くコードを変更できない（仕様、テストの消失）
- コードの良し悪しに取り組む余裕がない

「開発がしんどい」という状況に対して「もっと良くできるはず」と信じて模索していかないと、たどり着けない状況が多いのではないかと思う。
なので、まさにこの書籍は”**初級と中級の間にかける橋**”になりそう。

# コードの例が多い

**具体的な悪コードの例から、それを良いコードにする**という形で解説されている。

いざ悪いコードの例を示そうとしても、これだけたくさん出てくるものではないと思う。
それに、抽象的なコードだとわかりにくいし、具体的なコードだと突っ込みどころが多くなってしまいそうなので、これだけ多くの例を示すのは想像以上に難しそうだ。

# 良いコードの例は最良ではない

いくつか感想で次コードに触れているのを見かけた。

```java:リスト 4.25 (p.54) から抜粋
class HitPoint {
  private static final int MIN = 0;
  int amount;
  
  boolean isZero() {
    return amount == MIN;
  }
}
```

定数`MIN`と`isZero`メソッドの名前が不一致なのは気になるところ。
基本的には「最小値がゼロ」という知識が外部に漏れてしまうのは良くないので、`isZero`メソッドを`isMin`に変えたい。
例えば、定数`MIN`の値が変わってしまったら`isZero`メソッドの名称も変えなければならない。

ただしゲームにおいては「ヒットポイントがゼロ」というのは慣れ親しんだ表現だと思われる。
これがゲームのヒットポイントにおいて基本的な概念なら、`isZero`メソッドの方が「良い」といえるのかもしれない。
（もちろんこれに当てはまらないゲームがあれば話は変わる）

このように書籍の良いコードは必ずしも最良を示しているわけではない。
対象や環境、タイミングにもよるので、**継続的に評価して改善し続ける**ことが大事。
「良いコード／悪いコード**を**学ぶ」ではなく「良いコード／悪いコード**で**設計を学ぶ」ための書籍。

# 名前設計の重要性

「１０章　名前設計」はそれ以前の章と異なり、ロジックの話ではなく、「何のために、何を作るかのか」という話になっている。

適切な名前がつけられない場合、対象を正しく認識できていないのかもしれない。あるいはプロジェクト内での認識が異なっているかもしれない。

対象を正しく認識できないということは、それに付随する責務やルールも不明瞭なので、単一責任の原則やDRY原則を始めとした９章までのテクニックを活用するのが難しい。

# スピードの要求は高まり続ける

全ての現場で「良いコードに価値がある」とは言えないのかもしれない。
そこに価値を置くかは組織構造やビジネスモデルによるところも大きい。

しかしながら、業界全体としてはスピードの要求は高まっているようだ。
Google CloudのDORAチームは、ソフトウェアデリバリーと運用パフォーマンスは年々加速してる、と分析している。[^2]
[^2]:2021 年の Accelerate State of DevOps Report で、燃え尽き症候群とチームのパフォーマンスについて発表 https://cloud.google.com/blog/ja/products/devops-sre/announcing-dora-2021-accelerate-state-of-devops-report

こうした動きを背景に「開発スピードを上げるための保守性の向上」はこれからも注目されていく思う。
ソフトウェアエンジニアとして設計スキルを高めていくことは、将来の選択肢を広げることにもなりそうだ。

# 最後に

もっと売れて読まれてほしい。
研究のために学部2年の私がやっていること(研究テーマの見つけ方)

# はじめに
本記事では研究室配属前である学部2年の私が、研究に向けて取り組んでいること書きます。
取り組んでいることを書くだけなので、**効果や正しさは保証しません。**
「へー、そういう人もいるんだ」程度に読んでもらえると幸いです。

# 取り組んでいること
## 1. 知識を付ける
何をするにもまずは知識が必要だと思います。どんなジャンルがあるのか知らなければそのジャンルを選択することすらできません。
ただ、この時点では深い知識ではなく概要をつかむ程度で十分です。

そうして知識を広げていくと、強く興味がひかれる分野があると思います。
そうしたらそれを**実際に取り組んでみましょう。**

ITは化学や生物と比べてお金がかからないものも多いですし、個人でも問題なく取り組めるものも多いです。**とにかくやってみましょう。**

## 2. 不満をまとめる
知識がつくと、わかりにくいところや使いにくいところが出てくると思います。そういう時は、自分の知識不足を恐れず、**すべてメモを取りましょう。**

> 「自分が勉強不足なせいで分かってないだけなのかもしれない...」

そんなこと考えなくていいです。
そもそも、そこまでしっかりと勉強しないと使えないシステムっておかしいと思いませんか？

> 「自分に解決できるかわからないし...」

世の中には自分だけでは解決できない問題だらけです。
雨の日をなくすことはできますか？満員電車をなくすことはできますか？課題の提出期限をなくすことはできますか？
きっと解決できないでしょう。
でも書くのです。書きまくればいいのです。

**本来解決できるはずだった問題を見逃す方がもったいないです。**

## 3. 不満の原因を探る
しばらく続けると、たくさん不満が集まるでしょう。そこで、その不満がなぜ出るのかを考えていきます。

ここでは雨の日の例で書いてみます。

***
#### なぜ雨の日は嫌なのでしょうか。
私は傘をさして歩くのは手がつかれるので嫌です。
また、せっかくさしても、結局服が濡れて、肌に張り付く感覚が嫌です。
店に入った時も畳んだ傘をどこに置けばいいのか困ります。傘立てに置くと忘れますし。
他にも、外が暗いのでやる気も出にくいです。
***
このようにあらゆる原因を詳細に書き出していきます。

## 4. 不満の解決に必要なことを考える
ここでは何が起これば不満が解決するのか考えます。この時、**直接的な解決策**から**間接的な解決策**に向けていくつか策を出すと効率が良いと思います。雨の日の例で考えてみます。
***
#### どうしたら雨の日は嫌じゃなくなるのでしょうか。
<dl>
  <dt>【傘を持つ手がつかれるに対して】
    <dd>・傘を軽くする。</dd>
    <dd>・傘を手で持たなくてもいいようにする。</dd>
    <dd>・雨が降っていても傘をさす必要がないようにする。</dd>
    <dd>・雨が降らないようにする。</dd>
  </dt>

  <dt>【服が濡れて肌に張り付くに対して】
    <dd>・服が濡れないようにする。</dd>
    <dd>・濡れても肌に張り付かないようにする。</dd>
    <dd>・服を着なくても問題ないようにする。</dd>
    <dd>・雨が降らないようにする。</dd>
  </dt>
</dl>

以下略
***

## 5.現実的な解決方法へ
後は上記の中から自分が取り組めそうなこと、取り組んでみたいと思うことを考え、実装するだけです。
私は上には示していないですが、傘を忘れる問題に対して、 傘から離れるとすぐに気づけるという解決を考えました。
実はこの時点で、最初は不可能だと思っていた「雨の日は嫌」という問題を部分的に解決できたのです。

では、どのようにそれを実現したらいいのでしょうか？
GPSやBluetooth、AirTagなどいろいろ解決方法は思い浮かびます。
上手くできそうなものは実際に取り組んでみたら良いと思います。

中にはすでに誰かが先に作っていたものもあるかもしれません。その時はぜひ使ってみましょう。
便利なツールならば生産性が上がります。
逆にダメダメなツールならば、また3に戻って、なぜそのツールが使えないのか考えれば、それが新しい解決策を生み出すかもしれません。
**どちらにせよ利点しかないです。**

## おわりに
書き忘れていること、やり方が変わったことなどあれば加筆修正します。
Oracleで和暦一覧を取得するSQL

# はじめに
和暦の一覧を取得するSQLです。  
SelectBox等のリストとして利用できるかと思います。  
適当に組み替えてvalueの値等を追加してください。

# 確認動作環境

- Oracle 11R2

# SQL
```sql
with master as (
    -- 疑似的な和暦のマスターです。
    -- このままでも、テーブルでも。
    -- 明治が欲しい場合は追加してください。
    select 'T' as code, '大正' as name, to_date('19120730','yyyymmdd') as start_date, to_date('19261224','yyyymmdd') as end_date from dual
    union all
    select 'S', '昭和', to_date('19261225','yyyymmdd'), to_date('19890107','yyyymmdd') from dual
    union all
    select 'H', '平成', to_date('19890108','yyyymmdd'), to_date('20190430','yyyymmdd') from dual
    union all
    select 'R', '令和', to_date('20190501','yyyymmdd'), trunc(sysdate) from dual
),
list as (
    -- 大正の開始からSYSDATE時点までのレコードを取得します。
    select add_months(to_date('19120101','yyyymmdd'), (level - 1) * 12) as temp from dual connect by level <= to_number(to_char(sysdate, 'yyyy')) - 1912 + 1
)
select
    code
    , name
    , rank() over (partition by code order by temp) as japan_year -- 年号毎の年を取得。
    , to_char(temp, 'yyyy') as ad
    , start_date
    , end_date 
from
    list
    inner join master on
        to_char(list.temp, 'yyyy') between to_char(master.start_date,'yyyy') and to_char(master.end_date,'yyyy')
order by ad, start_date
; 
```

# さいごに
利用にあたっては動作確認をお願いします。    
『こうしたほうが良い』とかもあれば、ご教授ください。
has_manyとbelongs_toを完全に理解した。

最近railsチュートリアルを完走した22卒エンジニア（男）です。railsのアソシエーションについてです。

railsチュートリアルでhas_many、belongs_toを理解した（つもりだった）のですが実務で全く使いこなせませんでした。で、改めて勉強して**初学者が理解しやすいような表現**がなんとなく分かった気がしたので記事に残します。

※ 私の表現が間違っていたりすることもあるかもしれませんのでその際はご指摘いただければ幸いです。

# 対象者
- has_many、belongs_toが既存の記事であまり理解できない。
- 私のようにhas_many、belongs_toを完全に理解した（つもりの）人


# has_many、belongs_toの正体
## 公式リファレンス
まずrailsガイドの[has_many](https://railsguides.jp/association_basics.html#has-many%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91:~:text=%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82-,2.3%20has_many%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91,-has_many%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91)、[belongs_to](https://railsguides.jp/association_basics.html#belongs-to%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91:~:text=%E7%B4%B9%E4%BB%8B%E3%81%97%E3%81%BE%E3%81%99%E3%80%82-,2.1%20belongs_to%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91,-%E3%81%82%E3%82%8B%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A7)についての記事を引用します。
> has_many関連付けは、has_oneと似ていますが、相手のモデルとの「1対多」のつながりを表す点が異なります。has_many関連付けは、多くの場合belongs_toの反対側で使われます。
has_many関連付けは、そのモデルの各インスタンスが、相手のモデルのインスタンスを0個以上持っていることを示します。

>あるモデルでbelongs_to関連付けを行なうと、他方のモデルとの間に「1対1」のつながりが設定されます。このとき、宣言を行ったモデルのすべてのインスタンスは、他方のモデルのインスタンスに文字どおり「従属（belongs to）」します。

理解しているひとであればスッと入ってきますが初見の人にはなかなか理解に苦しむかと思います。

## 自分なりの解釈
前提として記法についての説明をします。そうなんだな程度の理解で大丈夫です。

### 書き方

has_manyに記載するものは複数形、belongs_toに記載するものは単数系というルールがあります。
ここで指定しているのは、各テーブルのカラムです。parentカラムとchildrenカラムを連携させています。
```
has_many :childrens
```
```
belongs_to :parent
```

### 正体
彼らの正体、parentsとchildrenでお察しの方もいるとは思いますが2人は親子です。belongs_toに記載しているchildrenはhas_manyに記載しているparentsの所有物です。（表現汚くてすみません）
***「一対多」*** と呼ばれるの肝はここで1人の親に対してたくさんの子供がいるイメージです。（親は2人だろ！ってツッコミ待ってます。）

# 何がいいのか
データ同士の関連付けを行うことで、モデルをシンプルなものにすることができます。（巷では正規化と呼ばれてます）
```
human1 = Family.find(1)      # parentカラムがあるDBのid=1のデータを取得
human2 = human1.children     # parentカラムをもつDBから作成オブジェクトから別なDBのchildrenカラムのデータを引っ張ってこれる。
```


# まとめ
has_manyとbelongs_toによるアソシエーションについでした。

実際に使わないと、理解するのは難しいと思います。座学でちゃんと理解できなくてもいいと思います。日が経ってからまた見てみると「こんなもんか」って簡単に理解できたりもします。

この記事はあくまで概要を把握するだけなので正しく網羅的に理解するには公式の解説を見るべきです。
使いこなせれば強力な武器になると思ったので今後も理解を深めていこうと思います。
AUTOSAR一覧作っていて気が付いたこと順位(ranking) 

AUTOSAR一覧作っていて気が付いたことのうち、今年に入ってから気が付いたことと、
去年までに気が付いていたことを記録します。

また、一覧を作る作業の中で、記事に関する作業のぬけもれ、誤植などの修正についても記録します。

<この項は書きかけです。順次追記します。>
This article is not completed. I will add some words in order.

# 文書履歴(document history)
ver. 0.01 初稿 　20240427
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.


<この項は書きかけです。順次追記します。>
This article is not completed. I will add some words in order.


# 2021版で気が付いたこと(2022年）順位

## 作業の抜け漏れ誤植順位
## 1. URL記載もれ
PDFファイルのURL記載もれが２件もあった。なんじゃこりゃってなった。
320件中2件なら誤差のうちっていってもいいかもしれない。ごめんなさい。

## 2. 文書番号間違い
記事をコピペで作っていて、文書番号、Qiita記事連番を変更していないのが10件くらいあった。
中身をひらきゃ分かる。順位はPDFファイルのURL記載もれよりは低い感じ。ごめんなさい。

## 3. 文書の抜け漏れ
本当は一番大事なこと。ばらばらと発覚して、いつ終わるかわからず、ちょっと順位をさげておいた。ごめんなさい。

# 2019-2020版で気が付いたこと順位

## 1 Portable C Compilerの著者がMathworksで働いていたこと

Matlab/Simlink連携資料を整理していて、
 Portable C Compilerの著者がMathworksで働いていたことに気が付いた。

しまったってなった。何で、Matlab/Simlinkが強いのか、そんなに深く利用したことがなく、確認していなかった。

## 2 

# AUTOSAR 2.0 で気が付いたこと順位

## 1. CANが物理層で調停していることを知る。
AUTOSAR以前から自動車のソフトウェアを書いている人なら知っていたことなんだろう。
電動機の制御ソフトウェアは書いていたが、研究試作の電動機制御ソフトで、通信部分は関与していなかった。

## 2. OSEKが電子制御の邪魔をせずに、CANを助けるOSであることを知る。
AUTOSAR以前から自動車のソフトウェアを書いている人なら知っていたことなんだろう。
電動機の制御ソフトウェアは書いていたが、アセンブラで割り込みで書いておりOSは使っていなかった。

## 3. MATLABとの連携が大事
AUTOSAR以前から自動車のソフトウェアを書いている人なら知っていたことなんだろう。
自動制御のソフトウェアを書いていたのはMatlabが出る前のこと。

## 4. UMLとの連携が大事
AUTOSAR以前から自動車のソフトウェアを書いている人なら知っていたことなんだろう。
ZIP-Cは高くて利用したことがなかった。

## 5. HAZOPによる安全分析が大事
AUTOSAR 「完全に理解した」
https://qiita.com/kaizen_nagoya/items/51983798ad7902b33cb1

A big wrapping cloth with the miniature garden
https://qiita.com/kaizen_nagoya/items/96411f20632e7f3ff73a

Network Defined Vehicle
https://qiita.com/kaizen_nagoya/items/a696f8a8cbd141215266


＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.

# 文書履歴(document history)
ver. 0.01 初稿 　20220814
ver. 0.02 add url 20240427
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
【ServiceNow】VirtualAgent「ジオロケーション（位置情報）」と「一時停止」について

VirtualAgent（チャットボット）の機能を2つ紹介します。

## 1.ジオロケーション（位置情報）
1つ目に紹介するのは「ジオロケーション」トピックブロックです。
このトピックブロックを利用することで、チャットボットを使用中のユーザの位置情報を取得することができます。

### 設定方法
①ユーティリティから「トピックブロック」をドラッグアンドドロップでノードに追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/16dc5b61-2a27-d8a0-3a97-844205a1ffeb.png)

➁追加したノードをクリックし、トピックブロックに「Geolocation」を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/40149f64-71bd-cdfd-6cd3-f379d14bf37b.png)


③トピックブロックのプロパティ内の各項目を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/18d744d7-b33f-c68e-74de-363fc4086e98.png)


④ボット応答のテキストを使って、各変数の表示値を確認するノードを用意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/6d8ed69b-6968-87df-8554-8ca291b14306.png)
※ジオロケーションの設定としては不要ですが、今回取得する値を確認するためにこのノードも用意しました。

### 動作確認
テスト実行をしてみます。
位置情報が取得できると現在の緯度・経度が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/82db74de-8a41-183e-86c1-8d42c1a11c63.png)
※注：ブラウザの位置情報へのアクセスを許可する必要があります。

### ユースケース
ジオロケーションのトピックブロックを使用することで、緯度と経度の情報を取得することができます。
ユースケースとしては以下を考えています。
　例1：ユーザの緯度、経度の情報からGoogleマップのリンクを表示する。
　例2：ユーザの緯度、経度から現在地の天気情報を取得する。

### 注意事項
ブラウザの位置情報へのアクセスを許可する必要があります。
各ブラウザ設定画面から位置情報へのアクセス許可を設定してください。
またネットワーク環境によっては、ブラウザ側で許可しても位置情報を取得できない可能性もあります。



## 2.一時停止
2つ目に紹介するのは「一時停止」トピックブロックです。
このトピックブロックを利用することで、チャットボットを一時停止して次のノードを表示するまでの時間を遅延させることができます。

### 設定方法
①ユーティリティから「一時停止」をドラッグアンドドロップでノードに追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/48efebc0-1743-4db3-0621-e4660553f22c.png)

②プロパティ内で秒数を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/029402fe-6a48-8d2a-e12a-d157100ec37d.png)

### 動作確認
テスト実行をしてみます。
該当ノードに到達すると指定秒数だけ時間停止します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/0b82d571-969d-c379-167b-11b130597ca4.png)
※動画ではないので上記はイメージとなります。

### ユースケース
該当ノードに到達した時に、ユーザに何らかの動作を促したいというようなケースで利用することが考えられます。
　・例1：ナレッジのリンクを表示後、記事を読む時間を確保するために一時停止する。
　・例2：リストの一覧に表示された情報を全て読めるように一時停止する。

### 注意事項
注意事項として、時間を31秒以降に設定すると設定値よりも遅延が起きる可能性が有ります。
（下記Docsによると、最大で設定値+30秒の遅延）

https://docs.servicenow.com/ja-JP/bundle/sandiego-servicenow-platform/page/administer/virtual-agent/reference/va-platform-topicblocks.html
【ServiceNow】attachmentタイプの変数で拡張子チェックを行う方法

attachmentタイプの変数に添付できるファイルの拡張子を制限したい場合、
変数属性allowed_extensionsを使用することで実現できます。

https://docs.servicenow.com/ja-JP/bundle/sandiego-servicenow-platform/page/product/service-catalog-management/reference/variable-attributes.html

## 実装方法
変数のVariable attributesにallowed_extensionsを入力します。
下図はxlsmの添付だけを許可するケースです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/a5cb9780-f484-1958-0698-96a637a33ca1.png)


## 動作確認
設定した変数に許可していない拡張子のファイルを添付しようとすると
添付できず、エラーメッセージが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/a9d4c6cc-f315-1c92-d51c-361d00afb427.png)

許可している拡張子のファイルを添付すると以下のように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/957c1f5f-cd3a-68c0-6c7c-b557a2b02f0c.png)

## 補足
カタログアイテム画面だけでなくAgent画面のリクエストアイテムフォームでも制御されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/92ef95c6-e98f-a347-29c2-ec7d54a53e4b.png)


## おわりに
クライアント処理でチェックを入れることも可能ですが、たった一行で実装できる便利な機能です。
haskellでUTF8でwriteFile

HaskellでUTF8でファイルを書く方法です。シンプルな方法が調べても見つからなかったのでメモを残しておきます。

次のExtraというパッケージを使います。
https://hackage.haskell.org/package/extra-1.7.10/docs/Extra.html

package.yamlの依存packageにextraを明記。

```:package.yaml
dependencies:
- extra
```
`stack ghci`で対話環境を起動して日本語のファイルを書き出してみます。

```haskell
ghci> import System.IO.Extra
ghci> writeFileUTF8 "test.txt" "あいうえお"
```


これでできたtext.txtの文字コードを見てみましょう(nkfコマンドを使用)。

```sh
$ nkf -g text.txt
UTF-8
```


簡単ですね！
プリンタのインストール（自動化）

事前にドライバをダウンロードしておき、その中のinfファイルから必要な情報を把握します。
ドライバ名やプリンタポートを間違えるとエラーになるため、ご注意ください。
①プリンタドライバのインストール
　cd C:\Windows\System32\Printing_Admin_Scripts\ja-JP\
　cscript prndrvr.vbs -a -m 「ドライバ名」 -v 3 -e "windows x64" -h 「ドライバフォルダへのフルパス」-i 「INFファイルのフルパス」
②ポートの設定
　cscript prnport.vbs -a -r「ポート名」 -h 「IP」 -o raw -n 9100
③プリンタのインストール
　cscript prnmngr.vbs -a -p 「プリンタ名」 -m 「プリンタドライバ」 -r IP_192.168.1.100

2台のプリンタを同時に入れるスクリプトは、例えば以下のように書けば動作します。
~~~
REM プリンタ2台の設定例--------------------★

cd C:\Windows\System32\Printing_Admin_Scripts\ja-JP\

REM プリンタドライバのインストール
cscript prndrvr.vbs -a -m "Canon Generic Plus LIPSLX" -v 3 -e "windows x64" -h  "C:\Users\accounttestuser\Desktop\wingpluslipslxv260x6400\x64\Driver" -i  "C:\Users\accounttestuser\Desktop\wingpluslipslxv260x6400\x64\Driver\CNLB0MA64.INF"

REM プリンタポートの作成①
cscript prnport.vbs -a -r IP_192.168.1.40 -h 192.168.1.40 -o raw -n 9100

REM プリンタ作成（インストール）①
cscript prnmngr.vbs -a -p "LBP443i" -m "Canon Generic Plus LIPSLX" -r IP_192.168.1.40

REM 'プリンタポートの作成②
cd C:\Windows\System32\Printing_Admin_Scripts\ja-JP\
cscript prnport.vbs -a -r IP_192.168.1.41 -h 192.168.1.41 -o raw -n 9100

REM 'プリンタ作成（インストール）②
cd C:\Windows\System32\Printing_Admin_Scripts\ja-JP\
cscript prnmngr.vbs -a -p "LBP8730" -m "Canon Generic Plus LIPSLX" -r IP_192.168.1.41
Qiita Engineer Festa 2022に参加してよかったこと

Qiita Engineer Festa 2022

https://qiita.com/official-campaigns/engineer-festa/2022

に参加してよかったことを記録します。

Qiita Engineer Festa 2021

https://qiita.com/official-campaigns/engineer-festa/2021

は、よかったことが山盛り。自分でも、この期間はほとんど書くのに専念していた。

今回は、残念ながら、昨年の４分の１の資源しか投入できない。

# AUTOSAR 全部読み中

自然言語の文書は全部読みした。よく考えたらZIPファイルについてほとんどなにも書いてなかった。
こりゃいかんてなった。

半分はAUTOSARに専念。

# AdventCalendar2022

１月から取り組みはじめ、半年経つ時点で、今年の方針を明確にしたい。

作業に取り掛かった。

４分の１は、AdventCalendar2022に投入。

# Qiita Engineer Festa 2022

４分の１の資源で、できるだけたくさんの企画に参加したい。

## JavaScript / TypeScript

今年はJavaScriptかTypeScriptで年末までにWeb系のプログラムを組む予定があった。
どの企画ならだいじょうぶかこれから確認。

## DeepLearning

過去のDeepLearningの記事の見直しになった。

### apt
４年前は、apt-getコマンドを使っていた。-getは不要。書き直している。

### Qiita仕様変更
自動で変換してくれりゃいいのにと思いながら、無料サービスなので、自分でScriptを書くかどうか迷い中。

# タグ見直し

@torifukukaiou さんの　一覧で、タグについて集計してくださっているのがすごく役立っている。ありがとうございます。
過去の企画も含めて、

1. followしてなかったタグに気がつく

　記事もいろいろ見て回った。

2. 自分のつけていなかったタグを追加する

記事を見回し、参考になる記事を、自己記事の参考文献に追加させていただく。

3. 自分のつけていたタグの変更見直しに役立つ

自分の得意分野、不得意分野がわかるようなタグを選ぶ。

## 引用していただいている企画

【毎日自動更新】深層学習の論文について解説してみた LGTMランキング！

https://qiita.com/torifukukaiou/items/fd8ffc3b260d5dbaf145

【毎日自動更新】私が体験した1番ゾッとするインシデントの話 LGTMランキング！

https://qiita.com/torifukukaiou/items/24d45a65cadd0a65809e

【毎日自動更新】買ってよかった技術書を紹介しよう！ LGTMランキング！

https://qiita.com/torifukukaiou/items/24f5d98638b4aae9f56e

【毎日自動更新】GitHub Actionsの自分流の使い方をシェアしよう LGTMランキング！

https://qiita.com/torifukukaiou/items/a1edaacb8d0023873b6d

## これから参加するかもしれない企画

【毎日自動更新】アルゴリズム強化月間 - 楽しいアルゴリズムの世界を紹介しよう - LGTMランキング！

https://qiita.com/torifukukaiou/items/8593958b584f07fab756

【毎日自動更新】Azure Machine Learning を使って機械学習に関するナレッジをシェアしよう LGTMランキング！

https://qiita.com/torifukukaiou/items/7194a4352af5ba780e03

【毎日自動更新】悪いコードを改善した時の体験や知見を共有しよう LGTMランキング！

https://qiita.com/torifukukaiou/items/eb78dc01165858d94004

【毎日自動更新】React 18、あなたならどう使いこなす？ LGTMランキング！

https://qiita.com/torifukukaiou/items/b02bc3073531dd42ba0f

【毎日自動更新】Twilioを使うためのコツ、Tipsやおもしろ実装など、Twilioのことなら何でも共有しよう！ LGTMランキング！

https://qiita.com/torifukukaiou/items/7f9141f7b943ccb2edff

【毎日自動更新】Snykを使って開発者セキュリティに関する記事を投稿しよう！ LGTMランキング！

https://qiita.com/torifukukaiou/items/444c8d465b48015f5b01

【毎日自動更新】Claris Connect を使った SaaS 連携ユースケースを紹介しよう！ LGTMランキング！

https://qiita.com/torifukukaiou/items/2a630ab5ad6b9bd427a9

【毎日自動更新】Claris FileMaker で作った App を JavaScript で拡張したらどうなる？！ LGTMランキング！

https://qiita.com/torifukukaiou/items/f8497d8ad7deb69069c4

【毎日自動更新】remote.it を使って○○に接続してみた！ LGTMランキング！

https://qiita.com/torifukukaiou/items/f284b5be23bc6f1a4e5e


【毎日自動更新】Zoom API/SDKを使ってみよう！ LGTMランキング！

https://qiita.com/torifukukaiou/items/3b232899320ee2f1ceec

【毎日自動更新】Remote TestKitを使ってレビューを書こう！ LGTMランキング！

https://qiita.com/torifukukaiou/items/b4abf0735dad68e0cc11
【Excel】csvファイルの値が勝手に変更されることを防ぎたい

# csvファイルの値が勝手に変更されることを防ぎたい
本記事ではExcelで下記のようなcsvファイルを編集したい！となったときに、csvファイルをそのままExcelで開こうとすると、「001」などの値が「1」などの数値として勝手に読み込まれて、元データが変更されてしまう…なんてことを防ぐための方法を書いていきます。

このようなデータをExcelで開いても…
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2145582/ca0897da-5dee-56fa-4f24-4862e1d00feb.png "このようなデータを読み込んでも…")

全然正しく表示してくれない…なんて経験があると思います。
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2145582/91a2fb3c-c11c-fe0b-1ff7-1602767a5b8d.png "文字化けしてしまったり、勝手に変換されてしまう")

### 手順
まずは新しいファイルを開き、適当なセルに文字を入力、そのセルに対し「区切り位置の編集」をクリック。
![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2145582/2e5692cc-187a-e152-d015-391042dba253.png)

区切り位置指定ウィザードが開くので、そのまま「次へ」。
![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2145582/5320a37e-bdb8-5164-9e80-e7c2fa2d5a52.png)

区切り文字の「カンマ」にチェックを入れ「次へ」。このあとは特に何もせず「完了」をクリックします。
![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2145582/53d0d4cd-b145-0e73-53e2-9808371b6752.png)

もとの画面に戻ったら、「Ctrl+A」で全選択したあとに、「セルの書式設定」をクリック。
![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2145582/c7a853f6-3a84-d722-e0d8-1684e8a406ec.png)

セルの書式設定が開いたら、「文字列」を選択し、「OK」。
![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2145582/a41eb574-c2c3-cf64-ff15-e08dd7b0d294.png)

ここまで設定すれば、メモ帳で開いた先程のcsvファイルをコピペでこのシートに貼り付ければ正しく表示されます。
![008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2145582/6d06b9a6-91b7-0c17-34b4-4f89e0286eca.png)

ここからは、各々好きなように編集してください。(csvファイルで出力することを忘れないように！)

### 補足
・今回設定したこと、特に「区切り位置の編集」については、Excelのソフト自体が開かれてる間は設定が保持されるため、何度でもコピペ出来ます。
しかし、一度Excelを終了すると再度設定する必要があるため、その時は同じ手順で設定し直してください。

・Microsoft公式によると、[こちらのページ](https://support.microsoft.com/ja-jp/office/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-txt-%E3%81%BE%E3%81%9F%E3%81%AF-csv-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E3%81%BE%E3%81%9F%E3%81%AF%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88-5250ac4c-663c-47ce-937b-339e391393ba)で紹介されている方法がExcelとして用意されているインポート方法にはなります。
こちらでも、インポート時に文字列指定を行うことで、今回の目的とほぼ同じことを達成することは可能です。
しかし、私の環境だとインポート時の表示が若干おかしくなったり、一度に複数のcsvを扱う際にやや手順が増えたりとめんどくさい部分があるため、より良い方法として、今回の記事の方法を紹介しております。

以上、拙い文章でしたが、読んでいただきありがとうございました。
M5Paper: utf-16 を utf-8 に変換

こちらの記事を参考にしました。
[Unicode ( UTF16 ) 文字列を UTF-8 に変換する方法 ( Arduino – ESP32 )](https://www.mgo-tec.com/unicode-utf16-utf8-convert-arduino-esp32)

M5Paper で確認しましたが、固有の機能は使ってないので、他の Arduino でも動くと思います。
入力は、リトルエンディアンです。
"ものづくりの根底" の UTF-16 表記は
>リトルエンディアン
>```text
>82306e3065304f308a306e303968955e
>```

>ビッグエンディアン
>```text
>3082306E3065304F308A306E68395E95
>```

## プログラム ##

```text:utf16-utf8.ino
// --------------------------------------------------------------------
//	utf16-utf8.ino
//
//						Jun/14/2022
// --------------------------------------------------------------------
String UTF16toUTF8(String str);
// --------------------------------------------------------------------
void setup()
{
	Serial.begin(115200);
	delay(2000);
	Serial.println("**** unicode ***");
	delay(1000);
	Serial.println("**** Jun/14/2022 ***");
	delay(1000);
	Serial.println("**** test ***");
	delay(1000);
}
 
// --------------------------------------------------------------------
void loop(){
	Serial.println();
	Serial.println("**** PM 14:16 ***\n");
 
 String utf16_str = "82306e3065304f308a306e303968955e";

	Serial.println("【 Unicode ( UTF16 ) 】");
	Serial.println( utf16_str );
	Serial.println("【 UTF16 → UTF8 】");
	Serial.println( UTF16toUTF8( utf16_str ) );
	
	delay(5000);
}
 
// --------------------------------------------------------------------
```

```cpp:UTF16toUTF8.cpp
// --------------------------------------------------------------------
//	UTF16toUTF8.cpp
//
//		little endian
//						Jun/14/2022
// --------------------------------------------------------------------
#include <codecvt>
#include <string>
#include <cassert>
#include <locale>
#include <Arduino.h>

// --------------------------------------------------------------------
std::string utf16_to_utf8(std::u16string const& src)
{
	std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> converter;
	return converter.to_bytes(src);
}

// --------------------------------------------------------------------
String UTF16toUTF8(String str)
{
	str += '\0';
	uint16_t len = str.length();
	char16_t utf16code[len];

	short icount=0;
	for(short jt=0; jt<len; jt+=4)
		{
		std::string  strx = "";
		strx += str[jt+2];
		strx += str[jt+3];
		strx += str[jt+0];
		strx += str[jt+1];
     
		utf16code[icount] = strtol(strx.c_str(), NULL, 16);
				// 16進文字列を16進数値に変換
		icount++;
		}

	for (short it = 0; it < icount; it++)
		{
		Serial.printf("%02x " ,utf16code[it] );
		}
	Serial.println();

	std::u16string u16str(utf16code);
	std::string u8str = utf16_to_utf8(u16str);
	String ret_str = String(u8str.c_str());
 
	return ret_str;
}

// --------------------------------------------------------------------
```

## Arduino IDE ##
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/9eebe05a-333e-1a0c-23a2-b6640357a386.png)
get-secretmanager-secrets(google-github-actions)にて上手くOutputs出来ないとき

https://github.com/google-github-actions/get-secretmanager-secrets

上記のアクションをワークフロー内にて導入しGCP secret managerの情報を上手く出力できない場合、以下が原因の可能性があるかもしれません。

```
# other step
- id: 'publish'
  uses: 'foo/bar@main'
  env:
    TOKEN: '${{ steps.secrets.outputs.token }}'
```

この「TOKEN: '${{ steps.secrets.outputs.token }}'」の部分のsecretsは、下記のwithの下のsecretsではなくidの"secrets"を指しています！！
```
jobs:
  job_id:
    steps:
    - id: 'secrets'
      uses: 'google-github-actions/get-secretmanager-secrets@v0'
      with:
        secrets: |-
          token:my-project/docker-registry-token
```

ここで引っかかる人も多いと思うので、是非確認してみてください。
WindowsでbuildするとError: EPERM: operation not permittedが発生する問題への対応

## 何が起きていますか？

Windowsでフロントのビルドを行うと頻繁に下記エラーが発生する

```bash
$ yarn clean && npm-run-all build-prod:* && yarn rev-update
$ npm-run-all -p clean:*
$ node ./tasks/javascripts/clean
$ rimraf ./xxx ../xxx/
2 js files deleted
$ cross-env NODE_ENV=production webpack -p --config ./webpack.config.production.js

# 問題のエラー
Error: EPERM: operation not permitted, open 'C:\xxx'


error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
ERROR: "build-prod:js" exited with 1.
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
```

エラー文では権限がないと表示されるが、ファイルがロックされていることが原因である。
(該当のファイルを権限がある状態で手動で削除したり編集しようとしてもできない)

## 対処方法

ファイルをロックしている原因となっているプロセスを終了することで一時対応とする。

## プロセスを特定する

1. Control + R で`resmon`よりリソースモニターを開く
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/1f5b6007-c70d-4784-2a01-70fb74c0f163.png)
2. ハンドルの検索欄に原因となるファイルパスを入力する（上の例だと`C:\xxx`）
3. 1分ほどするとプロセスが特定されるので該当するプロセスをタスクマネージャーからプロセスを終了させる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/70024528-d9ae-4ce0-84df-d84e70313f03.png)
4. 再度ビルドして成功しているか確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/fc9ff79f-814b-02f4-e9fa-de53f4de06c6.png)


## 備考
- Docker for WindowsをRestartしても`com.docker.backend.exe`は再起動されない
- もしかしたらDocker for Windowsのバグなのかもしれない [com.docker.backend.exe is locking random files in latest stable release #5624](https://github.com/docker/for-win/issues/5624)
Django+Reactで学ぶプログラミング基礎(23): Reactチュートリアル(イミュータビリティ/関数コンポーネント)

##### [前回] [Django+Reactで学ぶプログラミング基礎(22): Reactチュートリアル(stateを親コンポーネントで管理)](https://qiita.com/mingchun_zhao/items/fa11a1d6d2491b7f68f8)

## はじめに

前回は、親コンポーネントから子コンポーネントの状態を制御しました。
今回は、イミュータビリティ(不変性)と関数コンポーネントです。

## 今回の内容

- ゲームを完成させる
    - イミュータビリティ(immutability; 不変性)とその重要性
    - 関数コンポーネント

## イミュータビリティとその重要性

### イミュータブルなオブジェクトとは

- イミュータブル(immutable)なオブジェクトとは
    - 作成後にその状態を変えることのできないオブジェクト
        - 対義語はミュータブル(mutable)なオブジェクト
            - 作成後も状態を変えることができる

- イミュータブルなオブジェクトを使うメリット/デメリット
    - メリット
        - 複製や比較のための操作を省けるため、コードが単純になる
        - 性能の改善につながる
    - デメリット
        - オブジェクトが変更可能なデータを多く持つ場合
            - イミュータブル化は不適切となる場合がある
    - よって、イミュータブルかミュータブルか選択できるようにしている

### 変化するデータに対する2種類のアプローチ

- アプローチ1: ミューテートを伴うデータの変化
    - データの値を直接変更し、データをミューテート(mutate; 書き換え)する
```
var player = {score: 1, name: 'Jeff'};
player.score = 2;
// 変更後のplayerは {score: 2, name: 'Jeff'}
```

- アプローチ2: ミューテートを伴わないデータの変化(イミュータビリティ)
    - データの値を変更せず、データのコピーに変更を加え、元のデータを置き換える
```
var player = {score: 1, name: 'Jeff'};

var newPlayer = Object.assign({}, player, {score: 2});
// playerはそのままで、新しくnewPlayerがコピーされる: {score: 2, name: 'Jeff'}

// スプレッド構文(spread syntax)を使用する場合の書き方
// var newPlayer = {...player, score: 2};
```

- 最終的な結果は同じだが、差異が存在

### イミュータビリティ(内部データを書き換えない)メリット

- 複雑な機能が簡単に実装できる
    - 複雑な機能の実装が簡単になる
    - 例えば、三目並べの着手の履歴を振り返って、以前の着手まで`巻き戻し`たい
        - 直接的なデータのミューテートを避けることで
            - ゲームの以前のヒストリをそのまま保ち、後で再利用可能

- 変更の検出
    - ミュータブル(mutable)なオブジェクトは中身が直接書き換えられる
        - よって、変更があったかの検出が困難
        - 以前のコピーと比較してオブジェクトツリーの全体を走査する必要あり
    - イミュータブルなオブジェクトは中身が変更されないため
        - 変更の検出が簡単
        - 参照しているイミュータブルなオブジェクトそのものが(中身ではなく)、元のオブジェクトと同じかチェック
            - 異なる場合、変更があったと判断
- React再レンダリングタイミングの決定
    - Reactで`PureComponent`を構築しやすくなる
        - イミュータブルなデータは変更があったら簡単に分かる
            - コンポーネントをいつ再レンダリングすべきか決定しやい
    - `React.PureComponent`とは
        - Reactのパフォーマンス改善に使用される手法
        - `shouldComponentUpdate()`機能を実装している
            - 比較対象が複合型(配列、オブジェクトなど)の時、等しいか否かの比較に、浅い比較(shallow compare)を使用
                - オブジェクト自身(参照)のみチェックし、オブジェクト中の値(value)はチェックしない

- チュートリアルで、イミュータビリティのコード例
    - `Board`の`handleClick(i)`関数で
        - `const squares = this.state.squares.slice();`
    - 現在の`squares`配列を直接変更しないため、`.slice()`メソッドを使って配列のコピーを作成している

## 関数コンポーネント

### Reactの関数コンポーネント

- `render`メソッドのみで、`state`を持たないコンポーネントを、シンプルに書く方法
    - `React.Component`を継承するクラスを定義する代わりに
        - `props`を入力として受け取り、表示すべき内容を返すような関数を定義
- 関数コンポーネントのメリット
    - クラスより楽に書ける

### `Square`クラスを関数に書き換える

- `this.props`を、`props`に書き換える
- `onClick={() => this.props.onClick()}`を、`onClick={props.onClick}`に書き換える(両側のカッコが消える)
```src/index.js
function Square(props) {
  return (
    <button className="square" onClick={props.onClick}>
      {props.value}
    </button>
  );
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/a8ca55cd-007c-9704-0b36-3eff493c4a03.png)


## おわりに

イミュータビリティと関数コンポーネントの概念を勉強しました。
次回も続きます。お楽しみに。

##### [次回] [Django+Reactで学ぶプログラミング基礎(24): Reactチュートリアル(ゲーム手番と勝者の判定)](https://qiita.com/mingchun_zhao/items/d62d325ec27e8682dbd4)
【JavaScript 関数ドリル】中級編のpullAll関数の実装アウトプット

## pullAll関数の課題内容

\_.pullAll関数を自分で実装する課題。
https://lodash.com/docs/4.17.15#pullAll

「課題内容」/「解説動画」/「解答例」を確認したい場合は、以下リンク先のページを参照。
https://js-drills.com/blog/pullAll/

## 課題に取り組む前の状態

- 前回取り組んだpull関数と同じようなものなので、解答を見ずにできそうだと思った。

## 課題に取り組んだ後の状態

- 解答例と同じように実装できてよかった。



## pullAll関数の実装コード（答えを見る前）

```javascript
function pullAll(array, values) {

    for (let i = array.length - 1; 0 <= i; i--) {
        if (values.includes(array[i])) {
            array.splice(i, 1);
        }
    }
    
    return array;
}

var array = ['a', 'b', 'c', 'a', 'b', 'c'];
 
let result = pullAll(array, ['a', 'c']);
console.log(result);
// => ['b', 'b']
```

##　pullAll関数の実装コード（答えを見た後）

```javascript
//　同じ
```
【JavaScript 関数ドリル】中級編のpull関数の実装アウトプット

## pull関数の課題内容

\_.pull関数を自分で実装する課題。
https://lodash.com/docs/4.17.15#pull

「課題内容」/「解説動画」/「解答例」を確認したい場合は、以下リンク先のページを参照。
https://js-drills.com/blog/pull/

## 課題に取り組む前の状態

- 解答を見ずにできそうだと思った。

## 課題に取り組んだ後の状態

- 実行結果は同じになったものの、解答例を見ると、自分のコードには余計な記述が多いと分かった。



## pull関数の実装コード（答えを見る前）

```javascript
function pull(array, ...values) {
    const valueArray = [...values];

    if (arguments.length < 2) {
        return array;
    }

    for (let i = 0; i<  valueArray.length; i++) {
        if (array.includes(valueArray[i])) {
            for (let j = array.length - 1; 0 <= j; j--) {
                if (array[j] === valueArray[i]) {
                    array.splice(j, 1);
                }
            }
        }
    }

    return array;
}
var array = ['a', 'b', 'c', 'a', 'b', 'c'];
 
let result = pull(array, 'a', 'c');
console.log(result);
// => ['b', 'b']
```

##　pull関数の実装コード（答えを見た後）

```javascript
function pull(array, ...values) {
  if (arguments.length < 2) {
    return array;
  }

  for (let i = array.length - 1; 0 <= i; i--) {
    if (values.includes(array[i])) {
      array.splice(i, 1);
    }
  }

  return array;
}
```
もう2年目な見習いSRE、DevOpsエンジニアの4~6月までを振り返ってみる

# こちらの記事の続編

https://qiita.com/cakofei/items/8dfcee10129c0f9208fa

# 振り返り記事を書くぞ
数か月前に1年目の振り返り記事を数回にわたって書いてきましたが、振り返りは過去を整理するいい機会なので今後も定期的に振り返り記事を書いていきます。

# 4月
社会人1年目を終えて4/1から新しい案件にアサインされ、4月中旬くらいまでオンボーディング作業を取り組んでいました。

そして初タスクは、本案件にて使用しているGitHub Actionsを動かすコンテナイメージ(self-hosted ruuners)の作成でした。これまでDocker自体は良く耳にしていましたが実際に業務で触るのは初めてで、その便利さに感動したのを覚えています。

その後はワークフロー内にてGCPの各サービスに接続するためのGCP認証アクションの作成を行っていました。ここではWorkload Identityを使用しているため、従来よりセキュアな認証を行えます。

そしてワークフローファイルや各種カスタムアクションファイルを作成していたのですが、「カスタムアクション内にてカスタムアクションを呼び出せない」、「GitHub secrets情報はカスタムアクション内から読み込めない」など細かい仕様に苦戦しました。しかしこれらのおかげでCICDの知見を一気に伸ばせました。

話は変わり自社の業務についてですが、なんと新入社員のハッカソン研修のメンターとして抜擢され、彼らのハッカソン研修の補佐を行っていました。内定者研修での自分の活躍や意欲の高さを評価され選んで頂けたので大変嬉しかったです。

■行っていたこと
・ハッカソン研修のテーマ決めや各種ルールの策定
・会社に馴染んでもらうため、新入社員との積極的な交流
・業務における管理の重要性を学んでもらうため、各種スケジュールやタスク管理の指導
・総合的なハッカソン研修の補助
・翌年の改善のため、研修終了後のFBによる意見出し

主に上記をメインに取り組んでおりました。新規案件の時期とも被っておりかなり忙しかったのですが、新入社員のためになるならと奮起し無事に成功させ人事部の方からも高評価を頂くことが出来ました。

また自分自身の気づきとして、「プロジェクトリーダーやマネジメントといった上流工程の楽しさ」や「後輩のやる気の高さに影響を受けてモチベーションを高める」ことに繋がるいい経験でした(この出来事でフリーランスより正社員エンジニアの方が自分に向いているなと気付きました)。

# 5月
案件の話に戻り、5月も引き続きワークフローの作成を行っていました。

GCP secret managerから認証情報を取得するアクションを作成したり、静的解析や単体テストアクションの作成を行っていました。設計書の質があまり良くなかったので設計書の修正作業の必要もあったりと、実装と設計を同時並行で進める形だったので結構苦労していました。

Dockerfileやその他修正作業を行っていくなかで5月は終了しました。

また新人もGW明けから同じ自社チームとして、去年自分が参画していた3案件(現在メインなのは1案件)に参画することになり、後輩へ指導しつつ徐々に引き継ぎを行えるように頑張っています。

なので重みに違いはあれど実質4案件に参画していることになり、作業効率も同時に求められるようになってきましたが、後輩の指導や複数案件の同時進行といった環境は自分の成長にうってつけで非常に有難いです。

業務外では、AWSのSAPの試験勉強をメインに力を入れるようになりました。

■業務外に行った(ている)こと
・AWS SAPの試験勉強(7月受験予定)
・個人アプリ開発(友人3人と徐々に進行中)
・直属の後輩をターゲットにしたAWS勉強会(8月末終了予定)
・業務の勉強
・ブログ記事執筆(Qiitaメイン)
・転職活動(キャリアの健康診断も含めて)

とまあ、控えめに言ってもめちゃくちゃ忙しいのですが少しずつ捌いていっている状況です。

# 6月
6月も基本的に5月の業務と似たようなことを行っており、ワークフロー内で作成したアプリケーション(コンテナイメージ)へ脆弱性スキャン(FutureVulsを使用)をかけるカスタムアクションを作成したり、ワークフローの大規模な修正作業を行っております。

脆弱性スキャンのカスタムアクション作成にて盛大にエラーに引っかかり、ここで本格的にエラーと向き合う経験を行いました。

アプローチとしてはエラー箇所特定のため、原因の切り分けなどを行って急所をとらえる戦法です。今後コードの記述機会が多くなっていく中で本格的にエラーと戦えたのはいい経験でした。最終的にはそもそもコードが無駄に複雑だったので全く違う方法を採用したのですが、こういった「そもそも別の方法があるんじゃないか？」といった意識を持つことの重要性も学べました。

また6月後半の予定として、既存のワークフローをreusable workflowという形式に変更する話が上がっており(ここまで作成してする話では絶対ない)、それに向けて各種調査・作業に入る予定です。

プライベートの活動も5月に引き続き行っております。

# 最後
いわゆる炎上案件に参画しているのですが、自らタスクを発見して取り組む機会が非常に多く大変と同時にやりがいもあります。案件のスキルセットも非常に豪華なのでしっかり頑張って成果を残していきたいです。

(自分で書いてて思ったけど4~6月相当忙しいはずなのに乗り越えられたのは、自分もスキルアップして効率的にタスクを消化できるようになったり、自分がやりたいと思っていることなので大変より楽しさが勝っているのかなと感じています。なんにせよこうして記事にすることで自分の成長を感じられるのは大変喜ばしく思います)
python の標準出力を tee で 表示/保存 できなかった件

開発中に大量のエラーを吐き出していたので
エラー表示を見ながらファイルにも保存したかったのに、`tee` を仲介させた途端何も出力しなくなった

標準出力がバッファリングされるのが原因らしい

```
python3 hoge.py | tee log
```

を

```
python3 -u hoge.py | tee log
```

と、`-u` オプション追加で、解決した。
Slackでカスタム絵文字を変更する方法 (削除して追加でOK)

Slackのカスタム絵文字を、すでにメッセージにリアクションされているものは残したまま画像を変える方法です。
実験してみればすぐわかりますが意外と検索でヒットしなかったので書きました。

1. ワークスペース名→「設定と管理」→「以下をカスタマイズ：〇〇 (ワークスペース名)」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155587/eb4703c8-3c47-0da5-c026-03b19ee180cb.png)

2. 変更したい絵文字の右端の×を押して一旦削除
(リアクションは削除されず以下のようになります)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155587/757cd564-3bb3-b01f-5d24-01116d4462f5.png)

3. 同じ名前で新しい絵文字の画像を追加

以上でリアクションは保持したまま絵文字を変更できます！