OmniAICreator/Qiita-1.07M huggingface dataset:
hygenでテンプレート作成する時に実行時オプションを整理する

# そもそもhygenって何

hygenはテンプレートファイルからボイラープレートを生成するためのライブラリです。

https://www.hygen.io/

# 前提

hygenでは実行時にオプションを指定できます。
このオプションによってテンプレートファイル内の処理を変えたり、あるオプションが指定されていたらテンプレートファイルをスキップしたりするみたいなことができます。
オプションの値はテンプレートファイル内で処理できますし、ファイル数が少ない場合は同じような処理があっても大した手間では無いですが、ファイル数が多くなってくると一律で最初に処理しておきたくなってきました。

# index.jsファイルで前処理

これらのオプションは各テンプレートファイルに渡す前にindex.jsファイルで整理することができます。

```js:index.js
module.exports = {
  prompt: ({ prompter, args }) => {
    const prompts = [];
    !args.path &&
      prompts.push({
        type: 'input',
        name: 'path',
        message:
          'パス(~~/以降)を入力してください。ex.) foo/_slug@string/bar',
      });
    !args.auth &&
      prompts.push({
        type: 'select',
        name: 'auth',
        message:
          'タイプを選択してください。',
        choices: [TYPE.FOO, TYPE.BAR, TYPE.BUZZ],
      });
    args.get &&
      !args.option &&
      args.option !== 'false' &&
      prompts.push({
        type: 'confirm',
        name: 'option',
        message: 'オプションを定義しますか？',
      });

    return prompter.prompt(prompts).then((res) => {
      const merged = {
        get: null,
        post: null,
        put: null,
        del: null,
        ...args,
        ...res,
      };
      return {
        ...merged,
        hasOption: merged.option && merged.option !== 'false',
        hasPathParam: merged.path.indexOf('@') !== -1,
        withAuth: merged.auth !== TYPE.BUZZ,
        hasMethod:
          !!merged.get || !!merged.post || !!merged.put || !!merged.del,
        overwrite: !!merged.overwrite,
      };
    });
  },
};


```

例えばオプションAが指定されている時はオプションBを無視したりとか、オプションAとオプションBの値を組み合わせてオプションCの値を作ったりとかできます。
その他、必須入力にしたいオプションが指定されていない場合はプロンプトで入力を促したりもできます。
これで複雑な設定があっても各テンプレートファイルが汚れないようにできますね。

# 余談

## index.tsが使える

index.jsの代わりにindex.tsが使えるようなのですがpromptの型定義がよくわからなくて断念しました。無念…
時間ができたら再チャレンジしてみたいと思います。
linuxコマンドのmodule

Ubuntu22.04LTS

初投稿です。宜しくおねがいします。
linuc201の勉強で、modprobeを使ってzfs.koというモジュールの依存関係を表示しようとしましたが、

`modprobe -D zfs.ko`
modprobe: FATAL: Module zfs.ko not found in directory /lib/modules/5.15.0-50-generic

ディレクトリに存在しないみたいです。でもmodules.depには
kernel/zfs/zfs.ko: kernel/zfs/zunicode.ko kernel/zfs/zzstd.ko kernel/zfs/zlua.ko kernel/zfs/zavl.ko kernel/zfs/icp.ko kernel/zfs/zcommon.ko kernel/zfs/znvpair.ko kernel/zfs/spl.ko

依存関係と記載されていました。

```
ls /usr/lib/modules/`uname -r`
```
配下を見直してみるとmodules.aliasがあったので、エイリアスが設定されていると考え、

 ```
cat /usr/lib/modules/`uname -r`/modules.alias | grep zfs.ko
```

何も出力されませんでした。

そこでhttps://www.silex.jp/blog/wireless/2015/08/linux.html

の記事に「modprobe は insmod とよく似ていますが、２つの点で大きく違います。insmod では「*.ko ファイルのファイル名」を引数として指定しますが、modprobe は「モジュール名」を引数とします。通常はモジュール名に拡張子 .ko を付けたものがファイル名になりますが、たまに違うものがあったりします」

つまり、modprobeの引数にファイル名で叩いていたので、出力されなかったみたいです。

```
modprobe --show-depends zfs
insmod /lib/modules/5.15.0-50-generic/kernel/zfs/spl.ko 
insmod /lib/modules/5.15.0-50-generic/kernel/zfs/znvpair.ko 
...etc
```
Amazon CodeGuruで静的解析を試してみる

DevOpsと合わせてセキュリティ対応で、DevSecOpsという言葉を耳にする機会が増えてきました


# Amazon CodeGuru で脆弱性等のチェックに使えるかどうか試してみた

- まず、使えるリージョンが限られています2022年10月時点では、

欧州 (ストックホルム)
欧州 (ロンドン)
欧州 (アイルランド)
アジアパシフィック (シンガポール)
アジアパシフィック (シドニー)
欧州 (フランクフルト)
アジアパシフィック (東京)
米国東部 (バージニア北部)
米国東部 (オハイオ)
米国西部 (オレゴン)

- <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/f6cd4ed7-fb95-c373-d987-24d4e2f2326c.png" width ="400"/>
 
## OSSのソースに対してやってみます
- 結果から言いますと、脆弱性は出ていません
 
### 順序
1. GitHubのリポジトリを、自分でフォークします
1. Code Guruの左メニューで、リポジトリ を選択
1.  「リポジトリを関連付けて分析を実行」ボタンを押す
1.  GitHubのリポジトリを選択、ブランチを指定し、「リポジトリを関連付けて分析を実行」ボタンを押す
1.  10分くらい待つと解析が終わります
1. Code Guruの左メニューで、コードレビュー を選択
1. タブ「フルリポジトリ分析」で結果を見る

## 詳細な画面説明

### CodeGuruでリポジトリ選択

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/5ba9aa02-804a-a3e4-aa44-25329f7ebe1f.png)

GitHubを例に、リポジトリとブランチを指定します（GitHubへのコネクトを完了させた後の状態の画面です）
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/fc57c3ef-7a3d-dba7-3930-c7bebd9aaf01.png)

### 解析後
![06_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/48eb8540-784d-6ca4-ba54-a2de09bc3b60.png)

- 対象ブランチは、master , feature/enhance1 のような実在するブランチは指定可能ですが、feature/* のような指定はできません

- 実行完了後の１つの行を選択すると、サマリー情報が表示され、指摘事項がゼロでない限りは下部に指摘が表示される。今回では、推事項19件が該当している。

![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/2c729675-7d2d-bb21-b14a-9c9f5d373f6e.png)


- 指摘の例を見てみる
![08-security.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/45f51efa-2e07-8402-e185-1d21dfb7fd8a.png)

- ソース行ののリンクを押すと、リポジトリの該当行に遷移する（地味に便利機能）

![08_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/4b2cc651-ac81-c923-f0e6-14c883ef5f06.png)
envからパスワードを取得しているので、好ましくないよ　という指摘です
その対応方法として、「 Protect your credentials 」ボタンを押すと、AWS Secrets Mangerの画面にいき、シークレット情報を登録しましょう　という状況になる


![08_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/ce350585-bfad-ab5b-c3e1-1d8d0fee3e9b.png)

## 試してみて運用上の課題となりそうなのは、
- ブランチごとにどのタイミングで解析するのか
- いったん無視といったことはできなさそう
- CodeBuildと組み合わせる運用が必要
- GitHub Actions使っていると https://github.com/marketplace/actions/codeguru-reviewer のようなことも可能

### 今後の期待
- 何らか押すと、issue作成の入力された状態、タイトルが入った状態になると便利
- 該当行をGitリポジトリ側に遷移するのではなく、吹き出しのような感じで、前後10行くらい含めて表示してくれるとありがたい
Unityで "JAVA_HOME is not set and no 'java' command could be found in your PATH." が出たときの対処法

UnityでAndroid用アプリ開発中、 Android ResolverのForce Resolveを実行しようとして、タイトルのエラーが出たときに行った対処法です。
パスは通っているはずなのにこのエラーが出てました。

結論から言うと、
**Edit > Preferences > External Tools > Android にあるパス関係のチェックボックスを一度外して再度チェックしなおす**
で解決しました。

## 環境
・Windows 10
・Unity 2021.3.10f1

## 対処方法
### 1. Javaのパスを通す
パスが通っていない場合、JAVA_HOME、Pathを設定する。
Unity HubでOpenJDK、Android SDKをインストールした場合も、このパスは手動で設定する必要があります。

設定方法は既にネットにたくさん記事があると思うので省略します。
設定内容は以下です。
・JAVA_HOME・・・以下の3.の画像の枠の中の１つ目のパス(JDKのパス)を設定
・Path・・・%JAVA_HOME%\bin を追加

上記を設定できたら新規コマンドプロンプトを立ち上げて、下記コマンドを実行。
```
javac -version
```
Javaのバージョンが表示されたら、**一度ここでPCを再起動してください**。
これだけで解決するかもしれません。

↓↓↓ 再起動しても駄目な場合 ↓↓↓

### 2. UnityでPreferencesウィンドウを開く
メニューバーのEditの中にあります。
![20221022.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2931232/d1d21bfb-cfbc-f946-e3ca-6e7b13469470.png)

### 3. External Tools>Android の中のパス関係のチェックを一度外してまたつける
下の方にある「Copy Path」ボタンが付いているすべての項目について、チェックを外す→もう一度チェックする、を行いました。
![20221022-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2931232/bea5cac0-cc5e-01c9-3bfa-2da68030ed21.png)
本当は全部やらなくていいかもしれない。
とりあえず全部やってみたら直りました。

### 4. エラーが出た操作を再度行ってみる
恐らくもう"JAVA_HOME is not set～"とは言われないはず。

このあとUnity再起動したらまた同じエラーが出たんですが、PCを再起動したら出なくなりました。


## 終わりに
日本語の記事が見つけられなかったので書きましたが、ないということはあんまり発生しないエラーなのかも？
自分は1.でJavaのパスを通したあと、PC再起動はせず2.の手順に進んだんですが、その前に再起動しておいたら2以降は不要だった気もします。
元々Java入れてないような初心者開発者にしか起こらないのかもしれないですね。
React Developer Tools：再レンダリング可視化（ハイライト）の使い方とバグ？回避

本記事は「フロントエンドの開発効率を向上するヒントを教え合おう！」イベントの参加記事です。

https://qiita.com/official-events/5fdc281997d5754d8ac9

今回は、↓の記事で再レンダリングを確認するときにReact Developer Toolsを使ったのでその紹介と、バグにハマったのでその回避方法を紹介しますー

https://qiita.com/ckbys/items/14082104a5ff84ce1d7d

# React Developer Toolsのインストール

Chromeを使ってる場合はこちらから

https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=ja

一応Firefoxはこちらですが、自分は使ってません。すみませんー

https://addons.mozilla.org/ja/firefox/addon/react-devtools/

以下説明はChromeで行っていきます。

# 設定

ChromeのDevToolsを開くとメニューの最後の方にComponentsとProfilerが表示されるのでどちらかを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835840/2349335f-a18e-a148-c140-c703617d2fb0.png)

そうするとReact Developer Toolsが表示されるのですが、ヘッダ部分にオプションボタンがあるのでそれを開きます。（画像の赤枠部分）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835840/d4edbced-b5ee-35dd-7c06-0dcc6660678f.png)

オプションが表示されたら、Generalタブを開いて、その中にある「Highlight updates when components render.」にチェックを入れます。（赤枠部分）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835840/7ad186d2-b9d4-7f2d-351b-8882c8197620.png)

これでレンダリング要素がハイライトされるようになります。

# 実際に使ってみる

上の記事でハイライトされるのを確認しようとしましたが、最初は下記のようにしていました。

```tsx
const Child = () => {
  return <div>child</div>;
};

const Parent = () => {
  const [_count, setCount] = useState(0);

  const onChange = useCallback(() => {
    setCount((prev) => prev + 1);
  }, [setCount]);

  return (
    <>
      <input onChange={onChange} />

      <Child />
    </>
  );
};

```

inputで入力をするとChildコンポーネントが再レンダリングされてハイライトされました。
ここまではよかったのですが、次にChildコンポーネントをmemo化して再レンダリングされないのを確かめようとしました。

```tsx
const Child = memo(() => {
  return <div>child</div>;
});

const Parent = () => {
  const [_count, setCount] = useState(0);

  const onChange = useCallback(() => {
    setCount((prev) => prev + 1);
  }, [setCount]);

  return (
    <>
      <input onChange={onChange} />

      <Child />
    </>
  );
};

```

これでinputで入力すると、Childコンポーネントは再レンダリングのハイライトをされないはず、と思っていたらハイライトされてしまいました。

？

なんか書き方まずいのかとかやり方間違ってるのかとか、そもそも想定が間違っててmemo化しても再レンダリングされるのかとか色々考えたり試したりしましたが、console.logとかで確認してみるとどうもChildコンポーネントのレンダリングはされてなさそうでした。

これはReact Developer Toolsの使い方が間違ってるのかと思って調べていたらGitHubの方にIssueがありました。

https://github.com/facebook/react/issues/19778

[こちらのコメント](https://github.com/facebook/react/issues/19778#issuecomment-801580629)によると、React.Fragmentを使うとこのように実際にレンダリングされていなくてもハイライトされるということでした。


というわけで、コードを下記のようにReact.Fragmentからdivに変更してみるとハイライトされなくなりました。

```tsx
const Parent = () => {
  ... 省略

  return (
    <div>
      <input onChange={onChange} />

      <Child />
    </div>
  );
};

```

Issueの対応はされていないようなので、React.Fragmentを使っている箇所ではレンダリングの確認をする時は気をつけたほうがよさそうですね。
[Git] コミットの整理をしよう

開発ブランチで開発を進めているときにバグが見つかることがあると思います。

![Screen Shot 2022-10-22 at 12.53.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/949101/69df8d10-792b-1223-6130-75d395ba3307.png)

こう行った時の整理方法をここに書いていきます。

# git rebase -iでfixupする
git rebase -i を使いfixupコマンド（f）を使うことで、直前の pick となっている commit に統合することができます。

![Screen Shot 2022-10-22 at 13.07.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/949101/c52b3690-36e3-9dce-ceea-1d165c7b1fa8.png)

# git rebase -i --autosquash
バグの修正をした時、`git commit --fixup 一緒にしたいターゲットコミットのハッシュ`とします。

すると、`fixup!`と頭についたコミットメッセージが生成されます。

![Screen Shot 2022-10-22 at 13.50.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/949101/047e9573-eadd-3bf0-9b59-5d053c30cc40.png)

そして`git rebase -i --autosquash`を実行すると先程のコミットに fixup コマンドが付与された状態でエディタが開かれます。

![Screen Shot 2022-10-22 at 14.02.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/949101/f3dbe3ce-ba06-d49c-01bb-3f5424857126.png)

あとはそのままリベースするだけです。
タスク管理ツールをReact + ASP.Coreで作る 01コンセプト検討

# 概要
プログラミングの勉強も兼ねて、自作しているアプリについてここに記録していこうと思います。
(正確には2022年4月ごろからもっと行き当たりばったりに進めていたのですが、流れを整理しながら「もっとちゃんとやるならこんな風か?」という感じで書いています。)

### [index](https://qiita.com/mosuma/items/88e40dc44e7bff1a54d8)

## 作ろうとしているもの

簡易的なタスク管理ツール。
Webアプリ構築の勉強と実益を兼ねて作ろうと思っています。

## 現状の完成度
(記事No 32終了時点)
<iframe width="560" height="315" src="https://www.youtube.com/embed/NUSAE0s6zkw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## 基本要件
タスク管理をするためのWebアプリケーション。

### どんなことがしたいか
- タスクをリストで管理できる
- 進捗を管理できる
- 認証管理し、ログインしたユーザーのみ編集・閲覧を可能にする


### アーキテクチャ
- フロントエンド：React
- その他主要なライブラリなど
    - [Formik](https://formik.org/) : (入力フォーム類)
    - [Yup](https://github.com/jquense/yup): (値検証)
    - react-datepicker:(日付入力)
    - Bootstrap：(スタイリング)
    - Axios：(サーバーサイドとの通信)
    - react-router-dom：URL処理
    - react-toastify：(通知類)
- バックエンド：ASP.NET Core + Sql Server

上記のアーキテクチャにした理由ですが、私がASP.NET MVCでの開発経験が多少あること、バックエンドがASPなら社内システムを作る際にも応用出来る技術が習得できそうなこと、Reactが分かれば世間のトレンドを相当キャッチアップできそうだと思ったことなどが背景です。



### 画面イメージ

主要な操作で使用する画面イメージは以下の感じです。(ここからまた、ユーザー登録とかマスタ編集などで色々増えていくとは思います)
①ログイン前の画面、②ログイン後のタスクのリストを表示する画面、③ログイン後のタスクの詳細を表示・編集する画面の3つです。
②と③は画面が遷移するというより、詳細ウインドウがタスクを選択しているかどうかに従って出てきたり隠れたりするようにしたいので、実質1画面で基本動作を完結させたいという意図です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664470/08e5d26d-7bc6-9c44-7195-8367d3ac5c5f.png)


### 画面遷移とURL

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664470/2d945e21-d05b-a1ed-a023-f68f774a80df.png)


## まとめ
今回はここまでです。
[次回](https://qiita.com/mosuma/items/0afda530de5e8f979a20)に続きます
配列内の重複要素を削除して一つにするスニペット

# 重複したものは一つにしたい

以下のようなリストがあるとします。

> ["orange", "apple", "grape", "apple", "strawberry", "strawberry"]

appleとstrawberryが重複してリストにあります。
一種類につき一つだけ残したい場合は次のようにします。

# for loopで処理

```python
fruits = ["orange", "apple", "grape", "apple", "strawberry", "strawberry"]
for i, f in enumerate(fruits): # 基準となるフルーツとインデックスを取得
  for compared_i, compared_f in enumerate(fruits): # 比較対象のフルーツとインデックスを取得
    
    if i != compared_i and f == compared_f: # 両者のインデックスが同じではなく、要素が同じ場合、比較対象を削除
      fruits.pop(i)

print(fruits)
```

> ['orange', 'grape', 'apple', 'strawberry']

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

機械学習、ARアプリ（Web/iOS）を作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
ASP.NETのIIS パス '\\***\***\***.jpg' へのアクセスが拒否されました。

An error occured while export output confirm to PDF.
パス '\\***\***\***.jpg' へのアクセスが拒否されました。

ASP.NETのIISで、ディレクトリのアクセス拒否が発生した時のエラー

## 原因
- アプリケーションが扱うフォルダに対してのアクセス権がない

## 対処法
1. フォルダのアクセス権を付与する
2. IISの認証にASP.NET偽装を設定する

## フォルダのアクセス権を付与する

[プロパティ]->[セキュリティ]でアクセス権を確認後、必要に応じて編集する
![windows_dir_security.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/4eb98d9c-8941-4b9c-0b71-54847eacab45.jpeg)


## ASP.NET 偽装
IIS 認証アカウントまたはユーザーを偽装する
```
<identity impersonate="true" />
```

ASP.NET アプリケーションのすべての要求に対して特定のユーザーを偽装する
```
<identity impersonate="true" userName="accountname" password="password" />
```
IISマネージャーの認証メニューからASP.NET偽装を設定する
## 

## Reference
https://learn.microsoft.com/ja-jp/aspnet/whitepapers/denied-access-to-iis-directories

https://learn.microsoft.com/ja-jp/troubleshoot/developer/webapps/aspnet/development/implement-impersonation

https://learn.microsoft.com/ja-jp/troubleshoot/developer/webapps/aspnet/development/permissions-connect-a-remote-access-database

https://learn.microsoft.com/ja-jp/troubleshoot/developer/webapps/aspnet/www-authentication-authorization/troubleshoot-permissions-security-issues?source=recommendations
【備忘録】GnuPGでファイルを妥当性確認する

おはようございます。
~~前回に引き続き、朝の投稿です。~~
すでにオヤツの時間です(汗)

#### 【経緯】
Linuxを使い始めてから、わからないところはネットで検索しながら少しずつ知識を蓄積してきたのですが、最近公式リポジトリではパッケージのバージョンが古くてソースからより新しいバージョンのソフトウェアをインストールする機会が増えてきました。
ただ、解説サイトでビルド手順を解説してあっても、ファイルの妥当性チェックについては、他のサイトを参照してくださいとか、そもそもファイルの妥当性チェックについて書かれていないことも多く、確認の方法がよく解っていなかったのでファイルの妥当性チェックについて備忘録的にまとめようと思った次第です。

#### 【手順】

##### 1.ソースファイルのダウンロード
```bash:bash
cd ~/Downloads
wget https://xxx.yyy.zzz/aaa.tar.xz
```

##### 2.公式サイトからpgp sign(署名)ファイル(以下、例としてRELEASE.asc)をダウンロード
※サイトによってファイル名が違ったり、そもそもpgp署名ファイルがない(ユーティリティのようなあまりセキュリティに影響しないようなソフトウェアなどの)場合もある。
もし、pgp署名ファイルがない場合はファイルの妥当性チェックは(あれば)sha256ファイルをsha256sumコマンドなどで改ざんされていないかチェックしてください。

##### 3.ファイルの妥当性チェック
```bash:bash
gpg --verify RELEASE.asc aaa.tar.xz
```
```bash:例) 出力結果
gpg: 2022年10月22日 10時57分41秒 JSTに施された署名
gpg:                RSA鍵836C886D513EAEC1454FD7BB0EBB8EA6EF2766E1を使用
gpg: 署名を検査できません: 公開鍵がありません
```
このように、『公開鍵がありません』と表示された場合、手順4を実施する必要があります。

##### 4.公開鍵のダウンロード
ブラウザで『key server』をキーワードに検索すると幾つかキー(公開鍵)サーバが出てくるのですが、次のURLがその中の１つになります。

[https://keyserver.ubuntu.com/](https://keyserver.ubuntu.com/)

画面中央にある入力フィールドに手順3で表示されたRSA鍵(836cから66E1まで。検証をおこなうファイルによってこの文字列は変わる)を貼り付け、検索すると該当の公開鍵が一覧で表示されます。
検索結果には該当のユーザID(氏名)がグループで表示されるので、検索一覧の中の『sig sig』の右側の該当するフィールド(RSA鍵)があるグループの先頭にあるuidのリンクをクリックしてください。これで対象の公開鍵ファイル(以下、例でファイル名をpubkey.ascとします。)がダウンロードできるので、わかりやすいところに保存します。

##### 5.公開鍵のインポート
```bash:bash
gpg --import pubkey.asc
```
公開鍵のインポートができたら、次の操作で公開鍵が確かにインポートできたか確認すると良いでしょう。
```bash:bash
gpg --list-keys
```

##### 6.ファイルの(再)妥当性チェック
```bash:bash
gpg --verify RELEASE.asc aaa.tar.xz
```
```bash:例) 出力結果
gpg: 2022年10月22日 13時06分21秒 JSTに施された署名
gpg:                RSA鍵D84C69F8D61E0F4212960C75418B7698A4174470を使用
gpg: "Yoshihiro Nakahara <abc@def.jp>"からの正しい署名 [不明の]
gpg: *警告*: この鍵は信用できる署名で証明されていません!
gpg:          この署名が所有者のものかどうかの検証手段がありません。
主鍵フィンガープリント: D84C 69F8 D61E 0F42 1296  0C75 418B 7698 A417 4470
```
３行目に『正しい署名』と表示されたらファイルが改ざんされておらず、署名が正しいということになります。
あとは展開して、ビルドするだけです。

なんか、4-5行目で警告が出てますが、とりあえずファイルを署名するのが目的ではなく、妥当性チェックをすること(!)なので、いまはスルーします。
また時間が出来たときにきちんと調べます。

とりあえず、ざっくり調べたものをまとめただけなので、おかしいところやもっとこうした方が良いというのがあれば、ぜひコメントへお願いします。

#### 参考にしたサイト
http://bluearth.cocolog-nifty.com/blog/2020/03/post-ac76cf.html
https://qiita.com/y518gaku/items/435838097c700bbe6d1b
https://qiita.com/umi/items/2074aac509a6e78c4ef4

さいごまでご覧いただき、ありがとうございます！

それでは、また次の投稿でお愛しましょう！
Firefox 106のプライベートブラウジング周りの変更点を元に戻す

先日リリースされた[Firefox 106]では特にプライベートブラウジング周りに複数の変更が加えられており、便利な面もあるでしょうが今まで通り使おうとすると厄介に感じてしまう（慣れる必要がある）点も存在するように思います  
これらは現状設定画面などからの変更もできず、about:configからの設定しかできないようなのでその項目を列挙しておきます（日付を見るに今更感はありますが...）  

## プライベートウィンドウが分離される
これは正直人によって好みが分かれそう、今まで通りに使おうとするならば以下の項目を設定する  
- `browser.privateWindowSeparation.enabled`をfalseに

## 右上にプライベートブラウジングのロゴに加え「プライベートブラウジング」という文字まで表示される
特に意味もなくタブ領域を狭めるだけな気がするので、以下の設定を適用することを推奨  
インジケーターというのは恐らく右上のプライベートブラウジングの表示を指しているものと思われる（それ以外にもあるかもしれない）  
- `browser.privatebrowsing.enable-new-indicator`をfalseに

## about:privatebrowsingのロゴを元に戻す
これはお好みでいいと思う  
以前は通常のFirefoxのロゴが表示されていたところが新しいロゴに切り替わっている  
- `browser.privatebrowsing.enable-new-logo`をfalseに

## まとめてみる
まとめるとこんな感じ  
about:configの検索欄に`browser.private`と入力すると全部でてくる  

```c
// プライベートウィンドウを分離するかどうか
browser.privateWindowSeparation.enabled
// 新しいインジケーターを使用するかどうか
browser.privatebrowsing.enable-new-indicator
// 新しいプライベートブラウジングのロゴを適用するかどうか
browser.privatebrowsing.enable-new-logo
```
user.js風にやるならこんな感じかな？（自信がない）  
```js
// プライベートウィンドウを分離するかどうか
user_pref("browser.privateWindowSeparation.enabled", false);
// 新しいインジケーターを使用するかどうか
user_pref("browser.privatebrowsing.enable-new-indicator", false);
// 新しいプライベートブラウジングのロゴを適用するかどうか
user_pref("browser.privatebrowsing.enable-new-logo", false);
```

## おまけ
設定画面にこそ項目はないものの、about:config上の項目は見つけやすかったので予想ほど手間取らなくて助かった  

ちなみにですが、規定で左上（ピン留めタブの左）に配置されている[Firefox View]は「ツールバーをカスタマイズ」から位置や有無を変更できます  
同期機能が主なようですが、それを抜きにして見ると今まで`Ctrl-Shift-T`とかタブの右クリック→閉じたタブを開きなおすなんかで地道にやってたりしたものが、アドオンなどなくとも規定で今までで閉じたタブの中から開きなおせるようになったもののようです（各タブの現在のセッション内か何かでの機能なので、私のように履歴無効でも使えます）  
便利そう（ただしプライベートウィンドウでは使用できず、私は普段そちらを常用しているのであまり関係ないか...）  


[Firefox 106]: https://www.mozilla.org/en-US/firefox/106.0/releasenotes/
[Firefox View]: https://support.mozilla.org/ja/kb/how-set-tab-pickup-firefox-view
Vim初心者が最低限覚えるVimコマンド（20選くらい）

会社の低スペックパソコンでいちいちVisual Studio Codeを開くとしんどいので、やっぱりVimは困らない程度に使えるようになりたいと思いました。

ネットでVimコマンドを調べても多すぎて覚えられないので、かなり絞って覚えることにしました。Vim入門の2歩目（※1歩目は [モード切替・ファイル操作](#モード切替ファイル操作)）として以下のコマンドを覚えていきましょう。

## 操作・コマンド

### モード切替・ファイル操作

操作|コマンド|備考
-|-|-
カーソルの次/前で挿入モードに切り替え|a/i|append/insert
ノーマルモードに切り替え|Esc|
保存|:w|write
閉じる|:q|quit
保存して閉じる|:wq|
保存せず閉じる|:q!|

### 移動

矢印やHome、Page Upなどで何とかなります。参考：

操作|コマンド|備考
-|-|-
移動|←/↓/↑/→|
ページ送り|Page Up/Page Down
次/前の単語に移動|Ctrl+→/←|
行頭/行末に移動|Home/End|
ファイル先頭/末尾に移動|Ctrl+Home/End|

追加で覚えておきたいもの：
操作|コマンド|備考
-|-|-
画面の上/中/下に移動|H/M/L|high/middle/low

### 検索

操作|コマンド|備考
-|-|-
後方検索|/word|
前方検索|?word|
続けて後方/前方検索|n/N|next

### 置換

操作|コマンド|備考
-|-|-
一括置換|:%s/word1/word2/g|%（全行）、substitute、global

### 編集

操作|コマンド|備考
-|-|-
行を切り取り|dd|delete
3行切り取り[^3dd]|3dd|
カーソルから行末まで切り取り|D|
行をコピー|yy|yank
次/前に貼り付け|p/P|paste
元に戻す|u|undo
やり直す|Ctrl+r|redo

### 範囲選択

範囲選択するには、ビジュアルモードに切り替えてカーソルを移動します。

操作|コマンド|備考
-|-|-
ビジュアルモードに切り替え（文字選択/行選択）|v/V|
選択範囲切り取り|d|
選択範囲コピー|y|

## カーソル位置の注意

最近のエディターでは、カーソルは文字と文字の間にありますが、Vimでは文字と同じ位置にあります。

カーソルの見た目が縦棒（文字と文字の間にあるように見える）だと分かりにくいため、文字にカーソルがあるように見える形に変更しておくと良いかもしれません。Windows Terminalでは外観設定でカーソルの形を変更できます。

[^3dd]: 他の多くのコマンドも、このように数字を付けて繰り返せます。
renameコマンドで複数フォルダのファイルを一括リネームする

Macでrenameコマンドを使い、複数フォルダ内にあるファイル名を一括で変更する方法を学びました。
※使う際は、あらかじめbrew install rename でインストールしておくこと

<h2>やりたいこと</h2>
<p>これを</p>

```diff_javascript
/test/1/1a.jpg
/test/2/2a.jpg
/test/3/3a.jpg
```
<p>こうrenemeしたい</p>

```diff_javascript
/test/1/1_01.jpg
/test/2/2_01.jpg
/test/3/3_01.jpg
```
<p>こうすればできた</p>

```diff_javascript
cd test
// renameしたい複数フォルダの親階層に移動

rename 's/(.*)\/(\d)*a/$1\/$1_01/' */*
```
<h2>解説</h2>

```diff_javascript
/(.*)\/ 
// フォルダ階層の1/を表す。/を正規表現としてではなく階層の意味で使いたいので打ち消しの意味で前に\を入れる

(\d)*a
// ファイル名の1aを表す。(\d)*は数字の0文字以上の繰り返しという意味。
		
/$1\/
// ファイル名変更後のフォルダ階層1/を表す。
		
$1_01
// ファイル名変更後の1_01を表す
		
*/*　
// 階層に分けてファイル名変えたい時、最後に入れる
```
Vehicle aerodynamics, ボッシュ自動車handbook 11版(35) p.516

Vehicle aerodynamics , ボッシュ自動車handbook 11版(35)

人生で影響を受けた本100冊。
https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊
http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>
# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022

https://www.amazon.co.jp/dp/1119911907/

ボッシュ自動車handbook(英語)11版(0)＜エンジニア夏休み企画>【読書感想文】

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

# Vehicle aerodynamics
p.516 
## Aerodynamic forces 974
### Aerodynamic drag
### Buoyancy force(浮力)
### Lateral force(横力)

## Tasks of vehicle aerodynamics 977
### Motive power
### Directional stability
### Cooling and ventilation
### Comfort and convenience
### Component forces

## Vehicle wind tunnels
### Application
### Wind tunnel design
### Wind tunnel auxillary systems
### WInd tunnel variants

# Reference
なし


# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook

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

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

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

### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Energy demand for drives ボッシュ自動車handbook 11版(34) p.506

Driving-dynamics test proceduresEnergy demand for drives  , ボッシュ自動車handbook 11版(34)

人生で影響を受けた本100冊。
https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊
http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>


# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022

https://www.amazon.co.jp/dp/1119911907/

ボッシュ自動車handbook(英語)11版(0)＜エンジニア夏休み企画>【読書感想文】

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

# Energy demand for drives 
p.506

## Fuel comsumption of internal combstion engine

### Specific fuel consumption
### Consumption as sum of all losses and running resistances
### Determining the distance specific fuel consumption of conventional drive
### Units of fuel consumption
## Fuel consumption of hybrid vehicle
## Range and consumption of electric vehicles
## Well to Wheel analysis


# Reference
[1] SAE J2841 2010
Utility Factor Definitions for Plug-In Hybrid Electric Vehicles Using Travel Survey Data 

https://www.sae.org/standards/content/j2841_201009/  

[2] JEC Technical Report 2020, Appendix 1 Version 5

https://joint-research-centre.ec.europa.eu/welcome-jec-website/jec-publications/jec-version-5-2020_en

# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook

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

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

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


### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Plant uml　チートシート

```
@startuml
' 取引種別
actor A
database B
participant C
participant D
' 当事者をグルーピング
box イレギュラー
participant E
participant F
end box

' 変数
!$a = A
!$b = B
!$c = C
!$d_json = {"d":"D","one":1,"f":"F","ab":"A,B"}

$a -> $c:変数
$a -> $d_json.d :辞書呼び出し
note right :辞書呼び出しone=**$d_json.one**
note over $d_json.d ,$d_json.f
d to f
end note

note over $d_json.ab
a to b
end note

' コメント
/'
コメント
改行あり
'/
' ボール持ってる人をactivateで表現
$a -> $b:通常
activate $a
$a --> $c:点線
note right
注釈大
改行可
end note
$a -[#green]> F:色変
note left :注釈
deactivate $a

alt 分岐
$a -> D :
else $d_json.d = D
D -> E
end

loop ルーティン
C -> F
end

group 処理をグルーピング
$a -> $b
$c -> $b
end 


note over $a
Aのみ
end note

note over $a,$c
A～C
end note

note across
全体
end note
note over $b
[[link]]
end note



@enduml
```
隠蔽配線を前提とした無線LAN環境構築に関する製品選定

# はじめに
技術的な話はないです。
実製品よりも願望の混ざっているポエムです。

## きっかけ
今年の初め、父がリフォームをすると言いはじめて色々と検討している中で、家に2か所ある終端装置（弊宅では両親用と私個人用の2回線引いているため）周りの機器を隠したいと言い始めた。
箱だけなら単にボックスでも設けて壁に埋め込めばいいのだが、無線機器をボックスに埋め込むのは些か不安が残る。

リフォームということを含めて考えれば、今まで自力では通線しづらかった箇所も壁・天井のやり直しの際に通線できるだろうという見込みのもと無線LAN環境を見直す事とした。

## そもそも何故、無線LAN環境の見直し？
弊宅で現状活動している無線APは3台。Wi-Fi6を試したくて買った
Archer AX11000(TP-Link製、2階自室)、一人暮らし時にTP-Linkを知らなかったので試しに買ってみたArcher A2600(TP-Link製、1階和室)、私の終端装置（NEC製、1階リビング）自体の無線機能。かつては他の無線APもいくつかあったのだけれど、故障したり規格が古くなったので運用状態にあるのはこれらのみ。

現状の問題点は、以下。
* TP-Link製を信用できない
    * AX11000は定期的に再起動しないと繋がらなくなる事がある(買った当初から)
    * A2600の比較的近くの(ふすま2枚分離れた)部屋の通信がまったく安定しない(恐らくここ1年くらい)
    * 既に運用していないが10Gbe対応ハブTL-SX105が1年持たずに壊れた経験アリ
* 終端装置自体が大きくリビングに置かれているため、箱の中に隠したい
* axの電波を出せるのがAX11000だけのため、離れた箇所に行くと電波強度が弱く非常に遅い
    * かと言って、axやac、gでSSIDを共通化して自動切り替えされるのは気に食わない
        * IEEE802.11k/r/vは電波強度で物事を考えていると思ってる。これが誤解なら共通化した方がいいかも。

## 過去に起きた問題点
これまで述べた前提とは別ベクトルの話として、過去使ってきた無線APに関して起きた問題を羅列し、今後の展開についてどう考えるべきかの方針とする。
* 仕様の違いによりSSID、パスワードに使用できる文字が異なり、そのためにIEEE802.11k/r/vを活用できない
* 特定メーカーに対する不信感
    * 例えば[こういう事例](https://it.srad.jp/story/17/12/25/0813230/)みたいなバックドア系は気付きにくい
    * 特に根拠があるわけではないが、BUFFALO・ELECOMあたりの無線機器に漠然とした大丈夫？ がある
        * たしかどちらかはSSID・パスワードに使用したい文字を使えなかった

# 要件整理
ここまでの話を整理すると、達成したい事は以下のようになる
* 信用に足るメーカーを使う
* Wi-Fi設定に関する仕様を統一する
    * SSIDにハイフンやアンダーバー、パスワードに各種記号を使いたい
* 少なくとも自室では4800Mbpsの出る状態でaxを弊宅全体に拡げる
* 可能な限り、見える配線を減らす
* 無線AP自体がそこそこ小型(少なくとも、自室以外のもの)
    * かつ、有線LANの終端とならない事

また、できればではあるが今のSSID、パスワードを変更せずに運用できることが望ましい。帰省した兄弟に改めて設定を伝えるのが面倒くさいので。しかし次善策としてQRコードでSSID、パスワードを伝える手もある。

# 選定
## 信用に足るメーカー・仕様の統一
メーカーに関しては経験則や正確なレビューが必要となるため、現実的に個人で詳細な情報を集めるのは難しい。
この問題は『業務用として比較的よく見かけるメーカー』あたりを一つの信用度としての指標にしようか、等と考えている。
また、(OEM製品などを除けば)同じメーカーの型式違いで仕様が大きく違う事はないと考え、メーカーを統一することで仕様問題を解決としたい。

## 4800Mbpsを出したい
これは自室限定のため大きさなどの制約が弱く、そういう型式を選べばよい

## 見える配線を減らす
壁掛けや埋め込み式にすることで解決できると考える。

しかし埋め込み式は(有線ポートの実運用を考慮して常識的に)床付近に設置する事となり無線APの理想的な設置位置とは対極的な運用となってしまう。
ホテルなどの机上に設置する前提で設計されたものである事がうかがえる。

壁掛け式はかなり正解に近いと考えているが、配線の問題または終端の問題のいずれかを抱えている。
配線の問題に関して言うと、電源コンセントの隠蔽が問題になる。特にプラグ部分は固かったり大きかったりと、隠すのが難しい。
なにより見苦しい。

配線問題を解決する方策としてPoEがあるが、これはこれで終端問題を抱えている。

## 小型で有線の終端とならない無線AP

壁掛け式でPoE対応の無線APはこれを達成できないものが多い。
何故か？ 終端である事を前提に設計されているからだろう。
この思想は正しい。天井付近に設置する壁掛け時計みたいな存在から一時的だろうが有線ネットワークに繋ごうなどと言うのは正気の沙汰ではない。

# 結論
有線用ポートと無線用ポートを別々に用意しろ、というのが解答なのだろう。

上記を結論とした以上、ここから先はまた別の議論とした方が健全だと思うが、実は大きな問題がある。有線用と無線用のポートがどれだけ近くとも、2本の線を引かなければならないのだ。
内部に2ポート、外部に1ポートある壁コンセントでPoE++に対応したLANハブコンセントをくれ。
cdコマンドと相対path

### cdコマンド
Change Directoryの略

[~] ユーザー,ホームディレクトリ
[.] 現在いるディレクトリ　（cd使ってもカレントディレクトリは変わらない)
[..]　現在いるディレクトリの一階上(finderで開くと左側)に移動
[/]　最高位ディレクトリ

### 相対パスについて
##### 同じフォルダ内、同じ階層のindex2.htmlをリンク
```index.html
<a href ="./index2.html">アンカーリンク </a>
or
<a href="index2.html">アンカーリンク </a>
```
##### 1階層下のtestフォルダ内index2.htmlをリンク
```index.html
<a href="./test/index2.html">アンカー</a>
or
<a href="test/index2.html">アンカー</a>
```
##### 2階層下test/about/index2.htmlをリンク
```index.html
<a href="./test/about/index2.html">アンカー</a>
or
<a href="test/about/index2.html">アンカー</a>
```
##### 1階層上index2.htmlをリンク
```index.html
<a href="../index2.html">アンカー</a>
```
##### 1階層上Libraryフォルダ内index2.htmlをリンク
```index.html
<a href="../Library/index2.html">アンカー</a>
```
##### 2階層上index2.htmlをリンク
```index.html
<a href="../../index2.html">アンカー</a>
```
##### 2階層上accessフォルダ内index2.htmlをリンク
```index.html
<a href="../../access/index2.html">アンカー</a>
```
子豚検知による分類アルゴリズムの比較

### はじめに
先日、子豚の有無を判別する学習モデルをランダムフォレストで作成しましたが、ほかの分類アルゴリズムも教科書に掲載されていたので、それぞれの分類アルゴリズムを使って精度を比較してみようと思いました。

https://www.shoeisha.co.jp/book/detail/9784798158341

比較するモデル
・サポートベクタマシン　model_svc
・決定木　model_tree
・ランダムフォレスト　model_forest

#### 事前準備
同じデータを使って3種類のモデルを作成して、それぞれの結果を出力させます。
使用している画像やフォルダ構成についてはこちらの記事を参照してください。

https://qiita.com/hiratake_0108/items/6e21b7ddd0e23b166ea7

#### それぞれのモデルを作成

``` python
from sklearn.svm import SVC

model_svc = SVC()
model_svc.fit(X_train, y_train)
```
``` python
from sklearn.tree import DecisionTreeClassifier

model_tree = DecisionTreeClassifier(max_depth=3)
model_tree.fit(X_train, y_train)
``` 
``` python
from sklearn.ensemble import RandomForestClassifier

model_forest = RandomForestClassifier(random_state=123)
model_forest.fit(X_train, y_train)
```

#### それぞれのモデルでテストデータを検証

``` python:in
from sklearn.metrics import classification_report

pred_svc = model_svc.predict(X_test)
print(classification_report(y_test, pred_svc))

pred_tree = model_tree.predict(X_test)
print(classification_report(y_test, pred_tree))

pred_forest = model_forest.predict(X_test)
print(classification_report(y_test, pred_forest))
```

``` :out
              precision    recall  f1-score   support

           0       0.84      0.59      0.70        54
           1       0.67      0.88      0.76        51

    accuracy                           0.73       105
   macro avg       0.76      0.74      0.73       105
weighted avg       0.76      0.73      0.73       105

              precision    recall  f1-score   support

           0       0.67      0.85      0.75        54
           1       0.78      0.55      0.64        51

    accuracy                           0.70       105
   macro avg       0.72      0.70      0.70       105
weighted avg       0.72      0.70      0.70       105

              precision    recall  f1-score   support

           0       0.88      0.81      0.85        54
           1       0.82      0.88      0.85        51

    accuracy                           0.85       105
   macro avg       0.85      0.85      0.85       105
weighted avg       0.85      0.85      0.85       105
```

### 確認結果

| 項目 | サポートベクタマシン | 決定木 | ランダムフォレスト |
| ---- | ---- | ---- | ---- |
| 子豚なし(0)の適合率 | 0.84 | 0.67 | 0.88 | 
| 子豚なし(0)の再現率 | 0.59 | 0.85 | 0.81 |
| 子豚あり(1)の適合率 | 0.67 | 0.78 | 0.82 |
| 子豚あり(1)の再現率 | 0.88 | 0.55 | 0.88 |

概ね予想通りでしたが、このような結果になりました。
子豚のあり・なしの単純な２値分類ですが、子豚検知には写真を使っていて、案外複雑な画像認識のような気もするので、ランダムフォレストのようなアンサンブル学習の精度が良くなるのかなと思いましたか。
【個人メモ】Webサイト構築の際に活用したサイト

#### Webフォント
[Googleフォント(公式)](https://fonts.google.com/)
[NuxtでGoogleフォント使う](https://pankobo.me/blog/post/202102-how-to-use-google-fonts-on-nuxt-js)
[Googleフォントがスマホで反映されない](https://teratail.com/questions/185916)

#### レスポンシブ対応
[mixin](https://note.com/aliz/n/nacb19618cdf4)

#### DOM操作
[セレクタによるDOM取得](https://developer.mozilla.org/ja/docs/Web/API/Document_object_model/Locating_DOM_elements_using_selectors)

#### jQuery
[インストール](https://zenn.dev/cyber_hacnosuke/articles/0b72c2e996e450)
[エラー対応](https://github.com/nuxt/nuxt.js/issues/5607)


#### html要素にスタイルを追加する。
```javascript:layout
<script>
export default {
  head: {
    htmlAttrs: {
      class: ['single-html-class']
    },
  },
  name: 'Layout'
}
</script>

<style lang="scss">
.single-html-class {
  font-size: 62.5%;
}
</style>
```
git push してくれるEMOボタン型のBLEキーボードをESP32で作ってみた

# 目的
便利な左手用デバイスを作ってみようと思い、まずは一発ギャグでEMOボタン型のキーボード作ってみました。Bluetoothで接続されます。

<iframe width="560" height="315" src="https://www.youtube.com/embed/LuWMbTfNVak" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# ハードウェア
以下、Amazonで購入
[EMOボタン](https://www.amazon.co.jp/gp/product/B019F8DJSC/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1)
[ESP32ボード](https://www.amazon.co.jp/waves-ESP32-DevKitC-ESP-WROOM-32-ESP-32/dp/B06XWP81GP/ref=d_pd_sbs_sccl_4_1/357-5503350-8638757?pd_rd_w=ZN3Ud&content-id=amzn1.sym.b9a166d7-7482-4775-949d-b24eab648ff5&pf_rd_p=b9a166d7-7482-4775-949d-b24eab648ff5&pf_rd_r=4NZ9JT4D4MRBMDYJ46G6&pd_rd_wg=OKcg8&pd_rd_r=dbc0248f-a95b-49bc-bdac-716915b14673&pd_rd_i=B06XWP81GP&psc=1)

ESP32はなんでもいいんじゃないかと思います。Arduinoでも大丈夫です。PIN19を使ってます。

# リポジトリ
[https://github.com/takurot/EmoKeyboard](https://github.com/takurot/EmoKeyboard)

# ライブラリ
[https://github.com/T-vK/ESP32-BLE-Keyboard](https://github.com/T-vK/ESP32-BLE-Keyboard)

# コード
ほぼライブラリのサンプルコードのままですが、HIGH->LOWのエッジ検出だけいれてます。ボタンを押すとLOWでリリースされるとHIGHです。

```
#include <BleKeyboard.h>

BleKeyboard bleKeyboard("EMO Keyboard");
int curSwitchState = HIGH;
int prevSwitchState = HIGH;

void setup() {
  Serial.begin(115200);
  Serial.println("Starting BLE work!");
  bleKeyboard.begin();
  pinMode(19, INPUT_PULLUP);
  curSwitchState = digitalRead(19);
  prevSwitchState = curSwitchState;
}

void loop() {
  if(bleKeyboard.isConnected()) {
    curSwitchState = digitalRead(19);
    if(prevSwitchState == HIGH && curSwitchState == LOW){
      // git push
      bleKeyboard.print("git push");
      delay(100);
      bleKeyboard.write(KEY_RETURN);
    }
    prevSwitchState = curSwitchState;
  }

  delay(300);
}
```
# 使い方
PCでBluetoothで「EMO Keyboard」を探してペアリングしてください。Macだとキーボード認識のフローに入りますが、EMOボタンを一回押すと次に進み、標準101キーボードとかを選べば認識されます。EMOボタンはボタン上の矢印の方向に回すとボタンがリリースされて、押し込むと保持されます。

# 最後に
思いの外簡単にカスタムキーボードが作れることがわかりました。ESP32はなんでもできますね。もっといろんなものをカスタムキーボード化してみようと思います。
【初心者向】Gitでよく使うコマンド集

## ローカルリポジトリの操作について

## はじめにGitに保存するための流れについての説明
Gitは次の順番で保存される仕組みです
1. ワークツリー（PCの作業環境/ディレクトリ）
1. ステージ（Git内部の仮置き場/コミット前）
1. ローカルリポジトリ（Git内部の貯蔵庫/コミット後）

## ローカルリポジトリへ記録する

### ワークツリーからステージへ追加します

``` php
$ git　add .

 //ステージへ現在のファイルをアップします
 // $ git　add　ファイル名を指定
 // "."は全部変更しますという意味です

 //ファイル名やディレクトリ名を指定することもできます
 // $ git add ファイル名
 // $ git add ディレクトリ名

 //特定の拡張子ファイルのみ指定することもできます
 // $ git add *.php 
```
#### ＊ ステージに追加した変更を取り消したい
``` php
$ git restore --staged ファイル名

 // ディレクトリごと取り消したい
 // $ git restore --staged ディレクトリ名

 // 全変更を取り消したい
 // $ git restore --staged .
```

### ステージからローカルリポジトリへ追加します

```php
コマンドでファイル名を指定する場所にはディレクトリ名を指定することもできます
ドット　"."　を指定すれば全てのファイル/ディレクトリを指定します



$ git commit -m "コミットメッセージ"

// "コミットメッセージ"　は変更内容を記載します
```
#### ローカルリポジトリへコミットした履歴を確認する
```
$ git log
```

#### git log　から抜ける
- 半角の`q`キーを押してエンターを押す

### 直前のコミットの状態に作業ディレクトリの編集内容を戻す
**addする前の状態から、直前のコミットの状態に戻す**
```php
$ git restore ファイル名

// $ git restore ディレクトリ名

// 全選択
// $ git restore . 

```
### 特定のコミットまでPCの作業環境を戻す

``` php
//戻す対象のハッシュ値を調べる
$ git log 
// commit ************************

$ git reset --hard ハッシュ値
```



## ブランチについて

### ブランチを新規作成する
``` php 
$ git branch 任意のブランチ名

// 例
// $ git branch feature
```

### ブランチを新規作成した後に切り替える
``` php
$ git switch -c feature
// $ git switch -c 任意のブランチ名
```


### 分岐したブランチの内容を取込む

```php
$ git merge 存在するブランチ名
// 現在のブランチへ、対象ブランチのコードを取込む
//　git merge 対象のブランチ名
```
### ブランチを切り替える
```php
git checkout 存在するブランチ名
// ブランチの切り替え前に上書き（addおよびput)が
// 行われていない場合エラーとなります
// エラーが出た場合は、上書き操作が必要です
```
## Git Hubへアップロード

### GitHub（リモート）にアップロードする

- `git push`を実行することでリモートにアップロードができます

```
    $ git push origin
    //　”origin”はリモートサーバーを指します
```

#### もしも次のようなエラーが発生した場合

```
    fatal: The current branch main has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin main


//訳
//現在のブランチのメインには上流のブランチがありません。
//現在のブランチをプッシュし、リモートをアップストリームとして設定するには、次を使用します
//git push --set-upstream origin main
```

- `git push origin`だけではGitHubへpushすることができないことを指しています。
- 現在の作業ブランチにリモートリポジトリのブランチ（上流ブランチ）が無いためです

上流ブランチの紐付けは次のコマンドで確認できます

```
$ git branch -vv
```
- 上流ブランチが`main`であることが確認できます

![スクリーンショット 2022-10-07 22.12.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/eb6ca92e-e318-9c1c-1607-eab849b0b1f9.png)

- GitHubにpushしたい場合はよって今回の場合は上流リポジトリ名を追記する必要があります
- コマンドを実行する場合、SSHのパスフレーズが求められる場合があります

```
$ git push origin main
```

- 上流ブランチを省略できるよう恒久的に設定する方法がエラーにも表示された以下のコマンドです
- コマンドを実行することで`git push`のみで上流ブランチに対してpushができるようになります

```
git push --set-upstream origin main
// または
git push -u origin main
```

- `push`に成功するとブラウザのGitHubにpushした内容が表示されています

![スクリーンショット 2022-10-07 22.26.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/8a75b23f-d4aa-4de3-0b05-edb409ba17a0.png)

### 新規ブランチのコミットをリモートへプッシュする

GitHubにまだ登録されていない新規のローカルブランチを
GitHubへpushする場合、ローカル側でコミットが完了してから
次のコマンドを実行します

```
git push origin 新規ブランチ名
//ブランチ名、exampleを指定してプッシュする
```
Salesforce認定Platformアプリケーションビルダー試験の公式サンプル問題解説してみた-02

こんにちは

SalesforcePlatform認定アプリケーションビルダー試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

https://trailhead.salesforce.com/ja/content/learn/modules/platform-app-builder-pt1

今回はTrailhead

認定 Platform アプリケーションビルダー資格の受験準備: Fundamentals and User Interface (基本事項とユーザインターフェース) 
Salesforce の基本事項の学習

にある練習問題問目をご紹介します

なお今回の内容は動画でも公開しております

https://www.youtube.com/watch?v=elV2itL9AwE

<iframe width="560" height="315" src="https://www.youtube.com/embed/elV2itL9AwE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


今回の内容はこちらです


![スクショ02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/1e81e560-d36f-8500-dbd2-0299cd8f855d.png)


正解はAです
割り当てルールを作成すればキューに自動で割り当て可能です


Dについて
リードのデフォルトの所有者設定はキューの選択は出来ないので間違いです

Cについて
コード開発出なくても今回の場合可能なので間違いです

Bについて
手動で割り当てなくても自動設定は可能なので間違いです

詳細はこちらのヘルプもご参照ください


Web-to-リードの設定に関するガイドライン
https://help.salesforce.com/s/articleView?id=sf.customize_leadpreparation.htm&type=5
【UiPath」コード品質を上げるためにできること

# ビジネスロジックとUI操作ロジックを分離して設計
UiPath開発のみならず、RPA開発ではWebアプリのUI変更や実行環境の違いによりエラーが起きる可能性が高い。
データ操作などのビジネスロジック側は要件が大きく変わらない限りは変更が少なく、エラーになりにくい。

例）

| ビジネスロジック | UI操作ロジック |
|:-----------:|:------------:|
|システム情報を更新する      | 名前を入力する更新ボタンを押下      |
|     | 名前を入力する更新ボタンを押下      |

## ワークフローで分離する
具体的には、ワークフローからワークフローを呼び出すアクティビティを利用する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160956/c6aa7c4b-d6ce-0839-433a-4516522fed2a.png)
メリットとしては、
* ワークフローを分割することで効率的に開発ができる(機能単位での分担開発など)
* ワークフロー単位で品質管理できる(単体テストなど)
* ワークフローを再利用可能になる

## ディレクトリ構成も分離する
ワークフローを動作対象のシステムや画面単位で分離する。
この時に、共通ライブラリとして使えそうなものは命名の工夫で汎用的なものにもつながる。

# 命名の活用とスコープのコントロール
UiPathは変数だけでなくアクティビティなど様々なものに名前が付けられる。
ワークフローファイル、アクティビティ、変数、引数など

処理をワークフローにコピーするときに、内部のスコープ変数も同時にコピーされてしまう。
コピー先で変数を再定義する手間が発生したり、名前の重複によるバグ混入の危険があるある。
シーケンス単位でスコープを設定できるので、コントロールする必要がある。

# ワークフローの静的解析ツールの活用
[ワークフロー アナライザー](https://docs.uipath.com/studio/lang-ja/docs/about-workflow-analyzer)を活用して品質向上が見込める。
コードレビュー前には必ず実施することで、開発効率も向上する。
不要な変数、引数なども確認可能なため活用すべき。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160956/792ed08d-81c6-6879-67ab-c65ded87ad59.png)


# Delayコントロール
単純なDelay 1000msecは使わない。
こちら👇を使う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160956/0f75f931-73f9-9fae-12b1-dcb199dbef77.png)
これら👇はなるべく使わない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160956/21fb1af2-a2ed-2fbd-6fa3-2a5fc6c32bc4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160956/2a89918a-64fb-9afa-2f20-32f3a746a164.png)
[Flutter] 縦横スクロールできる表を作る

縦横スクロールできる表をつくってみたので紹介します。
![Oct-22-2022 10-07-47.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670405/13a585ed-67cd-1739-6b0d-bcb5e65b3780.gif)

## コード
```dart
Widget _table(List<DataColumn> columnList, List<DataRow> rowList) {
    // ListViewで縦スクロール, SingleChildScrollViewで横スクロール設定している
    return ListView(
      children: [
        SingleChildScrollView(
          scrollDirection: Axis.horizontal,
          child: DataTable(columns: columnList, rows: rowList),
        )
      ],
    );
  }
```
これだけでできるなんてFlutterすごい。。。

## 全文
```dart
class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  final labels = List<DataColumn>.generate(5, (int index) => 
    DataColumn(label: Text("ラベル$index")
  ), growable: false);

  final values = List<DataRow>.generate(20, (int index) {
    return DataRow(cells: [
      DataCell(Text("山田$index郎")),
      const DataCell(Text("男性")),
      const DataCell(Text("2000/10/30")),
      const DataCell(Text("東京都港区")),
      const DataCell(Text("会社員")),
    ]);
  }, growable: false);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: Padding(
          padding: const EdgeInsets.all(8.0),
          child: _table(labels, values),
        ));
  }

  Widget _table(List<DataColumn> columnList, List<DataRow> rowList) {
    // ListViewで縦スクロール, SingleChildScrollViewで横スクロール設定している
    return ListView(
      children: [
        SingleChildScrollView(
          scrollDirection: Axis.horizontal,
          child: DataTable(columns: columnList, rows: rowList),
        )
      ],
    );
  }
}
```
DataTableの基本的な使い方はこちらが参考になりました。

https://www.choge-blog.com/programming/flutterdatatable-datatable/

## TableをColumnやRowなどの子として使いたいときの注意点
tableウィジェットをColumnやRowなどの子として使いたいときは、そのまま配置すると表が見えなくなってしまいます。

```dart:ダメな例
Column(
    children: [
      const Text("顧客一覧"),
      _table(labels, values), 
    ]
)
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670405/049be518-b3fc-cb5b-a3a5-3f1472be6969.png" width=250dp>

これはテーブル自身が表示領域をどこまで広げていいのかわからなくなっているのが原因だと思います。
ので、改善案としてはExpandedウィジェットを使って 子ウィジェットが利用可能なスペースを目一杯埋めてあげるのが良さそうです。

```dart:改善例
Column(
    children: [
      const Text("顧客一覧"),
      Expanded(child: _table(labels, values)),
    ]
)
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670405/eac4af31-3a38-2d70-dd7b-d1fd4f22596a.png" width=250dp>


https://api.flutter.dev/flutter/widgets/Expanded-class.html
Excelの横持を縦持ちにする 

# とにかく便利
Pythonでもできるけれど、とにかく今すぐ横持データを縦持ちデータにしたいときは「Tableauアドイン」が便利です。アドインは無料で、アドインだけでも使えます。オープンデータの加工とか通常業務で扱うデータはだいたいこれで加工しちゃいます。

## ダウンロード先（zip形式）
https://community.tableau.com/s/question/0D54T00000G54lLSAR/installing-and-troubleshooting-the-tableau-addin-for-reshaping-data-in-excel

## 使い方の参考HP
http://tableaujpn.blogspot.com/2015/10/excel-tableau-tableau-add-in-in-excel.html


# pythonでちゃんと作りたい方向け
https://datumstudio.jp/blog/1722/#i-2

Pythonでデータ分析を始めたときに、とても参考になった記事です。

--------
Tableauアドイン、いつもお世話になってます。
【初心者向】qiitaの書き方まとめ

## コードを表示する方法

#### qiitaでコードブロックを表示したい

```
function helloWorld(){
  return "hello world!";
}
```

次の見本のように始まりと終わりを\`\`\`で囲む事で
Qiitaへコードブロックを記述することができます。

>\`\`\`
function helloWorld(){
　return "hello world!";
}
\`\`\`


#### コードブロックの種類とファイル名を入れたい
    PHP, Perl, Python, Ruby, SQL, 1C, AVR Assembler(avrasm), Apache, 
    Bash, C#(cs), C++(cpp), CSS, Diff, HTML, XML, Ini, Java, Javascript, 
    Axapta, CMake, DOS .bat(dos), Delphi, Django, Erlang, Erlang, REPL,
    Go, Haskell, Lisp, Lua, MEL, Nginx, Objective C(objectivec), Parser3,
    Python, profile, Scala, Smalltalk, TeX, VBScript, VHDL, Vala

次の見本のように\`\`\`php:ファイル名とすることで入力ができます
> \`\`\`php:hello.php
function helloWorld(){
　return "hello world!";
}
\`\`\`
```php:helloWorld.php
function hello(){
  return "hello world!";
}
```
Pythonでネットワークアドレスをより小さいサブネットに分割する

# はじめに
　前回はサブネットを集約する[スーパネット化の記事](https://qiita.com/aikamanami11/items/b63f9d663db0fdb34530)を書きましたが、今回は反対にPythonであるネットワークを特定のサブネットマスクでより小さいサブネットに分割する方法について書きたいと思います。

　手っ取り早くネットワークを分割したい方は[こちら](http://ossan.jp/ipaddr/split/)をご利用ください。

http://ossan.jp/ipaddr/split/


# ネットワーク分割


　ここでは<code>192.168.32.0/24</code>というネットワークを<code>/25</code>のサブネットマスクで分割してみたい。

・準備

　必要なライブラリのインストール。
```
pip install netaddr
```

・サブネット分割


```python:split.py
#便利なライブラリのnetaddrを読み込む
from netaddr import IPNetwork

#192.168.32.0/24のサブネットをIPnetworkクラスに渡してオブジェクトsubnetを生成。
subnet = IPNetwork('192.168.0.0/24')

'''
たったこの１行だけでネットワークを分割できる!
以下はプレフィックス/24のサブネットに対し、/25を指定してより小さいサブネットに分割する。
'''
splited_subnet = list(subnet.subnet(25))
print(splited_subnet)
```

・結果
　この様に<code>192.168.32.0/24</code>のネットワークを<code>/25</code>のサブネットマスクで分割した結果、<code>192.168.0.0/25</code>と<code>192.168.0.128/25</code>のサブネットに分割されることがわかる。
```:結果
[IPNetwork('192.168.0.0/25'), IPNetwork('192.168.0.128/25')]
```

　ちなみにこの記事はnetaddrで書き始めたが、[標準ライブラリ]()の[ipaddress](https://docs.python.org/ja/3/library/ipaddress.html)でも同じことができる上、インストール不要なので、こちらを使うのが良いかと思う。今更ながら...

```python:split2.py
from ipaddress import ip_network

subnet = ip_network('192.168.0.0/24')
#/24より1小さいプレフィックス長(/25)のサブネットに分割。
splited_subnet = list(subnet.subnets(prefixlen_diff=1))
print(splited_subnet)
```

```:結果
[IPv4Network('192.168.0.0/25'), IPv4Network('192.168.0.128/25')]
```

# さいごに
　この[netaddr](https://netaddr.readthedocs.io/en/latest/index.html)というライブラリはIPアドレスやネットワークアドレスに対する操作をするのにすごく便利なライブラリで、サブネット分割だけでなく、さまざまな操作ができます。これまでにいくつか記事を書きましたので、そちらもご参照ください。
　また、そのような操作をWeb上でできる[サイト](http://ossan.jp/ipaddr/)を提供しているので是非ご利用ください。

https://qiita.com/aikamanami11/items/b63f9d663db0fdb34530

https://qiita.com/aikamanami11/items/4e8348d7369d9dadb1c4

https://qiita.com/aikamanami11/items/d88183c7ced2df071ea0

IP Addr Tools: このサイトでIPアドレスやサブネットを操作するいくつかのツールを提供しています。

http://ossan.jp/ipaddr/

以上

参考サイト:

https://netaddr.readthedocs.io/en/latest/index.html

https://docs.python.org/ja/3/library/ipaddress.html
cscの作法 その286

# 概要
cscの作法、調べてみた。
aforge.dll使ってみた。
動画を再生してみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/3a4a45a7-4fe3-3a1a-48ac-944eb339ec3a.png)

# サンプルコード

```

using System;
using System.Windows.Forms;
using System.Drawing;
using System.Threading;
using AForge.Video;
using AForge.Video.VFW;

public class Form1 : Form {
	PictureBox pictureBox1;
	Button button1;
	AVIFileVideoSource source = new AVIFileVideoSource("test1.avi");
	public Form1() {
		Text = "aforge";
		ClientSize = new System.Drawing.Size(500, 400);
		pictureBox1 = new PictureBox();
		pictureBox1.Size = new System.Drawing.Size(320, 240);
		pictureBox1.Location = new System.Drawing.Point(50, 100);
		this.Controls.Add(pictureBox1);
		button1 = new Button();
		button1.Location = new System.Drawing.Point(190, 50);
		button1.Size = new System.Drawing.Size(50, 20);
		button1.Text = "play";
		this.Controls.Add(button1);
		button1.Click += button1_Click;
		source.NewFrame += new NewFrameEventHandler(video_NewFrame);
	}
	private void button1_Click(object sender, EventArgs e) {
		source.Start( );
	}
	private void video_NewFrame(object sender, NewFrameEventArgs eventArgs) {
		Bitmap image = (Bitmap) eventArgs.Frame.Clone();
		pictureBox1.Image = image;
	}
	[STAThread]
	public static void Main() {
		Application.Run(new Form1());
	}
}




```

以上。
未経験から転職したエンジニアが３人いるチームでやってみたこと！

# チームの構成（2022年10月時点）
・歴20年のベテランエンジニア１名
`フロントからバックエンド、インフラまですべてこなせるスーパーなエンジニア　（しかも優しい）`
・未経験から勉強して転職してきたエンジニア３名
`Railsを主に書いている`
`実務経験半年が２名` `実務経験３ヶ月が１名`

（他チームには経験豊富なエンジニアが多数在籍）

# この記事を書いている人物
`実務経験半年エンジニア`のうちの一人

# 未経験から転職したエンジニアが３人いるチームでやってみたこと！
##### 1. 未経験転職組３人でのアウトプット会
一人一人がタスクで経験したこと学んだことをアウトプットします。
毎週1回30分から1時間程度でオンライン会議でやっています。


**メリット**
・それぞれの学びの定着
・自分のタスク以外の知らないことを勉強できる
・上司からしたら、 1人に教えたことが3人に共有されているので、 時間の節約になる
・ お互いのタスクを知り刺激を受けることができる
・ 自分が書いたコードを説明するので、 より良い書き方に気づいたり指摘をもらったりすることができる

##### 2. 未経験転職組３人でのコードリーディング会

こちらも毎週一回1時間程度時間をとってコードリーディングをしています。
コードリーディングをする箇所は3人で相談しています。
1人では読み解いていくことが難しい難解な箇所を、 3人で分担して読んできてお互いに説明し合うというようなやり方です。

# まとめ
未経験からエンジニアになった人や新卒の人がいるチームでは教育に時間が割けないことがあるかと思います。
私たちのように未経験同士（新卒同士）が積極的に協力して仕事をしていくことで、
上司の負担を減らすだけでなく、自分たちの成長にもつながることが期待できます！

個人的にやっていて良かったなぁと思う事は以下の2点になります。
・ 自分が担当したタスク以外の知識を共有できるので成長速度が速くなること
・ 同僚同士の関係が良好になり仕事がスムーズに進むこと

未経験から転職した人や新卒の人は仕事に慣れず不安な気持ちを抱えることが多いかと思います。
同じような境遇の人同士が協力してお互いに成長しあい刺激を与え合う事が特に重要だと思っています。
同じようなチームを持っている方や、 同じようなチームに所属している人は ぜひ取り入れてみてください！
プログラミング初心者すぎてPythonで計算できるのにすげぇ！！って思ってた

Pythonで計算できるのに知ったのはネットサーフィン中に。
AIでも計算できるのは知ってたのに、まさかこれにすげぇと言うとは。
時代遅れ？？