OmniAICreator/Qiita-1.07M huggingface dataset:
4年目と2年目のエンジニアで対談してみた vol.1



# 目次
[1.この記事について](#1-この記事について)
[2.エンジニアデビューしてから](#2-エンジニアデビューしてから)
　　- 作業の細分化に関して by N先輩
　　- A5ショートカットキー紹介 by I後輩
[3. 第1回目対談まとめ](#3-第1回目対談まとめ)


#1. この記事について
エンジニア歴4年目と2年目で自らの成長を振り返り対談。
入社してから得た学びなどを共有していきます。
まずは簡単に自己紹介。

###N先輩
・新卒入社で4年目
・理系出身
・開発エンジニア
・最近PLデビューを果たした
・最近は散歩にハマっている

###I後輩
・新卒入社で2年目
・文系出身
・開発エンジニア
・ここ1年近くはJavaの案件を担当だが、まだプログラムに若干の苦手意識あり
・最近は様々なタレレシピの収集にハマっている


#2. エンジニアデビューしてから

**I後輩：**お疲れ様です！
**N先輩：**お疲れ様です。
**I後輩：**こんな私ももうすぐ3年目ですね。。また後輩が入ってくるのですね。。。
**N先輩：**早いよねぇ。
　　 　  2年間振返ってどう？
**I後輩：**入社当初からプログラムに少し苦手意識がありましたが、
　　　 ここ半年ちょっとはJavaを使ったPJでそろそろプログラムも見慣れてきました！
  　　 　でも正直、2年経ってもまだ出来ない事ばかりだなぁと日々痛感しています。
　　 　ついこないだも東名阪のPJメンバーを巻き込むやらかしをしてしまいましたし。。。
　　　  N先輩は4年間振返ってどうですか？
**N先輩：**最近ようやく「できるようになってきた」って思うことが増えたかなぁ。
　　 　  2年目まではＰＭや上司に作業を振ってもらうことが多かったけど、
　　 　 3・4年目は作業体制がガラッと変わって、ざっくりと作業の依頼を受けたり
　　　 自分で作業を探すことが増えたから、作業の細分化を意識して行うようになったね。
**I後輩：**なるほど。細分化っていうとタスクを書きだしたりして管理しているのですか？
**N先輩：**そうだね！それも含めて実際にやっているのはこんな感じ！

<code> **①自身の作業の洗い出し**</code>
　・作業前にテキストエディタ等に必要な作業を洗い出し、自分なりのカテゴリを決めて
　　作業内容をまとめる
　**POINT:**
　・必要だと思う作業が何かを考える
　・お客様、上司に報告することや納品物を意識して作業を洗い出す


<code>**②自分以外の人のタスクの洗い出し**</code>
　・自分だけでなくお客様、相手のタスクも洗い出す
　**POINT:**
　・お客様、相手のタスクを洗い出して確認することで、見落としているタスクを洗い出す

<code>**③作業内容の確認**</code>
　・作業に取り組む前に、追加作業が無いか考える
　**POINT:**
　・作業中にさらに追加で必要な作業が出てきたり思い出したりするときは、すぐに追加する

<code>**④タスクの相談および確認**</code>
　・洗い出した細分化したタスクに漏れがないかの確認や相談を上司、PMに行う
　**POINT:**
　・自分がやるべき内容、作業の不明点をなくす
　・作業のゴールが見えていても、実際にそこにたどり着くまでの方法が分からなければ
　　作業が進まない場合があるのでその都度相談する

**■作業細分化の例**
◎対応する作業内容：
　・お客様より動画やPDFファイル、画像データを移行してほしいと伺った。
　　その際、システムで使用出るようにデータの加工が必要だったため、
　　調査の上、データ移行用のツールも作成した。

◎1.自身の作業の洗い出し：
　【思いつく作業】
　　　・ツール、バッチの作成
　　　・検証
　　　・検証前準備
　　　・エラー発生時の対応
　　　・作業後確認
　【納品物、報告を意識して洗い出すタスク】
　　　・手順書作成
　　　・説明資料作成

◎2.自分以外の人のタスクの洗い出し
　　　・作成したツールやバッチのレビュー（PMや上司）
　　　　⇒レビュー指摘事項の修正（自身のタスク）
　　　・依頼データの準備（お客様）
　　　　⇒依頼データ確認（自身のタスク）
　　　・お客様確認（お客様）
　　　　⇒手戻り等の対応（自身のタスク）

◎3.作業内容の確認
　　　・ツールやバッチの作成
　　　　⇒"簡易設計書の作成"の追加
　　　・作業後確認
　　　　⇒"確認時チェックリストの作成"
　　　　確認する内容をまとめておくチェックリストを作成したほうがよいのではないか。

◎4.タスクの相談および確認
　　　・「〇〇の方法で実装するなら、XXなどインストールやセットアップをする必要があるよ。」by PM
　　　　⇒必要なツールおよびソフトウェア当のインストールおよびセットアップ
　　　・「バージョンによっては、XXはつかえなかったりするよ、確認した？？」　by上司　
　　　　⇒ツールバッチ作成前の調査

などなど・・・・・




**I後輩：**なるほど！自分以外のタスクも洗い出しするのですね！
　　　 今日から私もやってみようと思います！ ( ..)φﾒﾓ
　　　 他にも入社してからいろんなツールやエディタなども使うようになったと思いますが
　　　  使い方や便利機能などは誰かに教えてもらう機会とかありましたか？
**N先輩：**私は仕事の中で覚えたかなぁ！
　　　  先輩と一緒に作業する中で、こうするほうが便利だよー！って感じで。
**I後輩：**やっぱり実際に触らないと覚えられないですよね。
　　　 ちなみに私は一度やったことでもしばらく実践しないと忘れてしまうので
　　　 OneNoteにまとめて、いつでも見返せるようにしています！
　　　  A5のショートカットキーなどはよく見返したりしています。

###私がよく使うA5ショートカットキー
| ショートカットキー | 内容 |
|-------------------|------------|
| Ctrl + q          | SQL整形|
| Ctrl + g          | 条件を指定してテーブルを開く|
| Ctrl + Spaceキー  | テーブル名やカラム名の入力補完 
| Ctrl + r          | 文字列置換|
| Ctrl + h      　　| 実行履歴表示|
| Ctrl + k   　　　 | 行のコメントアウト|
| Ctrl + Shift + k  | コメントアウトの解除|


# 3. 第1回目対談まとめ
いざ自らの成長や学びを振り返ると、学んだことを再確認でき、これからのモチベーションにも繋がることを実感しました。
定期的に成長を振り返ることは今後も続けていきたいですね。
Flutterで画像が表示できないときに確認するべきこと

スペースがどうこうもあるんですけど、yamlに書く場所はこちら。


    name: flutter_app_test
    description: A new Flutter application.

    publish_to: 'none' # Remove this line if you wish to publish to pub.dev

    version: 1.0.0+1

    environment:
      sdk: ">=2.16.0 <3.0.0"

    dependencies:
      flutter:
        sdk: flutter


      cupertino_icons: ^1.0.2

    dev_dependencies:
      flutter_test:
        sdk: flutter

      flutter_lints: ^1.0.0
    
    flutter:

      uses-material-design: true
      //ここに書く


スペースとかちゃんとしてあるのに、どうも画像が表示されないなって思ったらそういうことでした

コメントアウトばかりでflutter始めたばかりの時はわかりにくいので、コメントアウト削除することから始めてもいいかもです
40 代おっさん GASのクラスとインスタンス化を学ぶ

## 本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## クラス、インスタンス、インスタンス化の定義を説明

### クラスとは

オブジェクトの特性を定義するひな形

### インスタンス化とは

クラスを元にしてオブジェクトを生成することをインスタンス化

### インスタンスとは

インスタンス化により生成されたオブジェクトをインスタンス

## クラス定義とnew演算子によるインスタンス化

クラス定義は、class分を使用して記述する。

```javascript
class クラス名 {
  //クラス定義
}
```

クラスをインスタンス化するには、new演算子を使って記述をする。

```javascript
new クラス名 (引数1, 引数2, ...)
```

クラスを使用する場合は、グローバル領域に記述してグローバルとすることが多い。
ローカルスコープだと、そのスコープ内でしか使えないため。

## コンストラクタ

クラスというのは、どのようなプロパティやメソッドをインスタンスに持たせるかを定義したものと言い換えることができる。
クラスにプロパティを定義するには、コンストラクタと言う特別な関数を使用する。

コンストラクタというのは、クラスをインスタンス化する際に、最初に呼び出される関数

コンストラクタを定義するにはclass文内にconstructorと言う名前のメソッドを定義する。
これをconstructorメソッドと言う。

構文

```javascript
class クラス名　「
  constructor(仮引数1, 仮引数2, ...) {
    //処理
  }
}
```

constructorメソッドはnew演算子を用いたインスタンス生成時に呼び出される。

構文

```javascript
new クラス名(仮引数1, 仮引数2, ...)
```

お試し

```javascript
function toshiki() {
  class Person {
    constructor(name, age) {
      this.name = name;
      this.age  = age;
    }
  };

  const p1 = new Person('利樹', 4);
  console.log(p1);

  const p2 = new Person('アッキー', 9);
  console.log(p2);
}
```

### thisキーワード

コンストラクタ内でthisと記述した場合、それはこれから生成されるインスタンスのことを表す。

### インスタンスのメンバーの変更

インスタンスはオブジェクトですから値の変更や追加が可能

お試し

```javascript
function toshiki() {
  class Person {
    constructor(name, age) {
      this.name = name;
      this.age  = age;
    }
  };

  const p1 = new Person('利樹', 4);
  p1.age += 5;
  p1.favorite = 'みかん';
  console.log(p1);
}
```

## 参考資料

<https://www.amazon.co.jp/s?k=google+apps+script+%E5%AE%8C%E5%85%A8%E5%85%A5%E9%96%80&adgrpid=110264232688&gclid=CjwKCAiA9aKQBhBREiwAyGP5lSl7AJJLCvOEHb4wQgMlyqW1fll5X8GDTT_Rkd1_soUAyIPMXQr26hoClHEQAvD_BwE&hvadid=553833563682&hvdev=c&hvlocphy=1009076&hvnetw=g&hvqmt=b&hvrand=4378489642044417389&hvtargid=kwd-594191211348&hydadcr=4106_13159878&jp-ad-ap=0&tag=googhydr-22&ref=pd_sl_2x1owglv0s_b_p52>
アイデンティティベースポリシー について

## 勉強前イメージ

人観点でのIAM？

## 調査

### アイデンティティベースポリシー

誰がどのリソースに対してどんなアクションを実行できるか を指定できます。
[こちら](https://qiita.com/miyuki_samitani/items/74c34ab5e98e2cd7e713) で設定しているのは
アイデンティティベースポリシーになります。

### リソースベースポリシー

アイデンティティベースポリシーに対して リソースベースポリシーというのもあります。
これは、 このリソースは誰がどんなアクションが実行できるか というのを指定できます。
だれがアクションを実行できるかのポリシーを作って、リソースにアタッチします。

### 違い

アイデンティティベースポリシーとリソースベースポリシーにいろいろ違いがあるので、確認していきます。

#### ポリシーを何に紐付けるか

- アイデンティティベース
	- グループ
	- ロール
	- ユーザ

- リソースベースポリシー
	- サービス
		- s3,SQS等一部

#### アクセスの許可を何に付与するか

- アイデンティティベース
	- グループ
	- ロール
	- ユーザ

- リソースベースポリシー
	- 自分のアカウント
	- 他のアカウントユーザ、アプリケーション

アイデンティティベースポリシーはアタッチしたユーザにアクセス権限が付与されますが、
リソースベースポリシーはプリンシパル(自分のアカウント,他のアカウントのユーザorアプリケーション)が付与先になります

#### 作成方法

- アイデンティティベース
	- [AWS管理ポリシー](https://qiita.com/miyuki_samitani/items/74c34ab5e98e2cd7e713)
	- [インラインポリシー](https://qiita.com/miyuki_samitani/items/74c34ab5e98e2cd7e713)
	- カスタマー管理ポリシー

- リソースベースポリシー
	- インラインポリシー

リソースベースポリシーはインラインポリシーのみの作成方法になります。

## 勉強後イメージ

とりあえず人にアクセス許可を与えてるいつものやつはアイデンティティベースってことかな。
リソースベースはあまりピンとこないけど、s3とかSQSにアタッチして誰にアクセスさせるかってことを許可させるものかなって感じ

## 参考

- [AWSのポリシーを使いこなそう　ポリシー設計につまづかないためのポイントを整理](https://devlog.arksystems.co.jp/2020/03/12/9338/)
Github Actionsでテスト結果を別ブランチに保存する

## 方針

 Github Actionsでテスト結果を別ブランチに保存するには以下の機能が必要です。

* Github Actions flowで、別々のブランチからプルしてくる。
* テスト結果を生成する
* テスト結果をブランチにコミット、プッシュする。

### Github Actions flowで、複数のブランチをプルする方法

https://github.com/actions/checkout#checkout-multiple-repos-side-by-side

 リファレンスに記述してあるように、2つのブランチからチェックアウトします。
一つはプルリクのブランチ、もう一つは'ref'で'doc'ブランチを指定します。'doc'ブランチは今回出力用のブランチです。
また、それぞれ別々のディレクトリを'path'で指定します。それぞれのパスごとにブランチのファイルが配置されます。
permissionsのcontentsをwriteに指定してください。指定しないと権限エラーが発生します。

```

  test:
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - name: Checkout
        uses: actions/checkout@v2
        with:
          path: build

      - name: Checkout doc
        uses: actions/checkout@v2
        with:
          ref: doc
          path: doc
```

### テスト結果を生成する

 Unitテストなどのレポート機能でHTMLなどを生成してください。Javaやnewmanなど必要な合わせて、それぞれ実行して生成してください。

```
      - name: newman run
        if: contains(github.event_name, 'pull_request')
        run: |
          newman run "./build/e2e/apitest.postman_collection.json" -e "./build/e2e/check-env.postman_environment.json" -r htmlextra --reporter-htmlextra-export --reporter-htmlextra-export ./doc/test_output/

```

### プルリクとは別のブランチにコミットとプッシュする。

 Git の config でコミットするために、ユーザ名とEmailを指定します。存在しないユーザ、メール、特に何を指定しても問題ありません。Gitのコミット履歴現れるだけです。
working-directoryでコミットするリポジトリのディレクトリを指定します。

```
      - name: doc git setting
        run: |
          git config --local user.email "githubaction@action.action"
          git config --local user.name "githubaction"
        working-directory: ./doc/test_output
```

 コミットするときはテストの失敗のときもコミットしたいため、if: always()を指定します。
他のアクションの実行で更新されているかもしれないのでgit pullしておきます。
テスト結果でファイルを新しく生成しする場合は、git addが必要です。
git commitでコミットします。メッセージに、プルリクの参照を作成しています。プルリクのタイムラインにコミットが出てきて、参照しやすくしています。
最後にプッシュしてください。

```
      - name: Commit files
        if: always() && contains(github.event_name, 'pull_request')
        run: |
          git pull
          git add .
          git commit -m "add action #"$(echo $GITHUB_REF | sed -e 's/[^0-9]//g') -a
          git push origin doc
        working-directory: ./doc/test_output
```

### 最後に

 Github Actionsでテスト結果をどこに出力するのがベストか？
とりあえず、開発ブランチとは別のドキュメント用のブランチに出力することで、外部から確認できるようになります。
github Pageで公開する事でウェブから確認できます。
また、ローカルでプルすることで、簡単に確認できます。

しかしながら、まだ課題として、テスト結果一回分では見れるけど、傾向など長期的な傾向が見ることはできない。そこら辺の良いツールないかね？
～memo～ vagrant up で JSON::ParserError

vagrant up 中にパソコンがエラーで強制終了されてしまった後、vagrant upの最後に下記のようなエラーが出るようになりました。

```
C:/HashiCorp/Vagrant/embedded/mingw64/lib/ruby/2.4.0/json/common.rb:156:in `parse': 751: unexpected token at '' (JSON::ParserError)
        from C:/HashiCorp/Vagrant/embedded/mingw64/lib/ruby/2.4.0/json/common.rb:156:in `parse'
        from C:/HashiCorp/Vagrant/embedded/gems/2.2.1/gems/vagrant-2.2.1/lib/vagrant/action/builtin/mixin_synced_folders.rb:237:in `cached_synced_folders'
        from C:/HashiCorp/Vagrant/embedded/gems/2.2.1/gems/vagrant-2.2.1/lib/vagrant/action/builtin/mixin_synced_folders.rb:77:in `save_synced_folders'
        from C:/HashiCorp/Vagrant/embedded/gems/2.2.1/gems/vagrant-2.2.1/lib/vagrant/action/builtin/synced_folders.rb:129:in `call'
        from C:/HashiCorp/Vagrant/embedded/gems/2.2.1/gems/vagrant-2.2.1/lib/vagrant/action/warden.rb:34:in `call'
        from C:/HashiCorp/Vagrant/embedded/gems/2.2.1/gems/vagrant-2.2.1/lib/vagrant/action/builtin/synced_folder_cleanup.rb:28:in `call'
        from C:/HashiCorp/Vagrant/embedded/gems/2.2.1/gems/vagrant-2.2.1/lib/vagrant/action/warden.rb:34:in `call'
        from C:/HashiCorp/Vagrant/embedded/gems/2.2.1/gems/vagrant-2.2.1/plugins/synced_folders/nfs/action_cleanup.rb:25:in `call'
        from C:/HashiCorp/Vagrant/embedded/gems/2.2.1/gems/vagrant-2.2.1/lib/vagrant/action/warden.rb:34:in `call'
        from C:/HashiCorp/Vagrant/embedded/gems/2.2.1/gems/vagrant-2.2.1/plugins/providers/virtualbox/action/prepare_nfs_valid_ids.rb:12:in `call'
:
:
(略）
```


ネットで少し調べたところ、vagrant destroyしてupしたら良いと書いてあったりしたのですが、今までのデータがなくなるのも嫌だし、特に困ることなく普通に使用できていたので見て見ぬふりをしていたのですがｗ、少し時間ができたので原因調査しました。

common.rbのエラー箇所の前に `p caller` を書いてvagrant upし辿っていくと、
「synced_foldersファイルがJSON::Parserでパースできない」 
とのこと。

synced_foldersは
`#{Vagrantfileがあるフォルダ}/.vagrant/machines/#{マシン名}/virtualbox`
の中にあり、開いてみるとnull文字のみが書かれていて中身が壊れてしまっていたようでした。

このマシンではsynced_foldersは使用していなかったので、synced_foldersの中にデフォルト設定の

```
{"virtualbox":{"/vagrant":{"guestpath":"/vagrant","hostpath":"#{Vagrantfileがあるフォルダフルパス}","disabled":false,"__vagrantfile":true}}}
```

と記述して保存、vagrant upを試すとエラーが出なくなりました♪

同じことはそうそう起きないかなと思うので、このエラー自体の備忘録というよりは、
ちゃんとエラー元追いかけたら解決できることも多いよ（しかもrubyやし）という備忘録です :sweat:
ActiveStorageでアップロードしたファイルの名前と拡張子を取得したい

## 前提
- `ActiveStorage`を利用しファイルをアップロード後<br>

※ `Active Storage`使用していなくてもOK

## やること
- アップロードしたファイルの拡張子を表示
- アップロードしたファイル名を表示

## 拡張子の取得
※(今回は`User`モデルに`has_one_attached :avatar`を記載した例です)
### 手順
```.rb
# アップロードしたファイルのurlを取得
avatar_url = rails_blob_path(@user.avatar)
# =>  "/rails/active_storage/blobs/xxxxxxxxxxxxxxx/ファイル名.jpg"

# ファイルの拡張子を呼び出す
File.extname(avatar_url).downcase
# => .jpg
```


## ファイル名の表示

```.rb
# アップロードしたファイルのurlを取得
avatar_url = rails_blob_path(@user.avatar)
# =>  "/rails/active_storage/blobs/xxxxxxxxxxxxxxx/ファイル名.jpg"

# ファイル名を取得する
File.basename(avatar_url, ".*")
# => ファイル名
```

### 参考文献
- [singleton method File.basename](https://docs.ruby-lang.org/ja/latest/method/File/s/basename.html)
- [Ruby - Fileクラスでファイル名や拡張子だけ取得](https://chulip.org/entry/20090524/1243180495)
サンプル用クラスタリング用のデータを作成しよう

# datasets.make_blobsでクラスタリング用のデータを作成
 sklearn.datasetsのmake_blobs関数をインポート
from sklearn.datasets import make_blobs

 Xには1つのプロットの(x,y)が、Yにはそのプロットの所属するクラスター番号が入る
X,Y = make_blobs(n_samples=150,   # データ点の総数
               n_features=2,          # 特徴量（次元数）の指定  default:2 
               centers=3,             # クラスター数
               cluster_std=0.5,       # クラスタ内の標準偏差 
               shuffle=True,          # サンプルをシャッフル
               random_state=0)        # 乱数生成器の状態を指定