OmniAICreator/Qiita-1.07M huggingface dataset:
MacにFTPソフトをインストールしてみた(FileZilla)

## 参考にしたサイト
https://aprico-media.com/posts/1367

## ダウンロード
↓公式サイトからダウンロードできます。
https://filezilla-project.org/download.php?type=client

自分がダウンロードした際のlatestは以下のバージョンでした。
FileZilla_3.47.2.1_macosx-x86.app.tar.bz2

## インストール
ダウンロードした圧縮ファイルをダブルクリックで解凍すると、FileZilla.appというファイルが出てきます。

これをドラッグしてアプリケーションに入れます。
※操作イメージとしては↓と同じ感じです。
https://youtu.be/ZrU5bKf3gN4

これでLaunchpadに追加されるので後は普通に使えます。

## 操作感
画面イメージは以下の感じです。
![スクリーンショット 2020-04-25 12.27.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531046/cbc1d8a0-343e-f7a7-a4e8-ff4de40cd50f.png)

左側が自分のPCで右側がサーバになります。
ドラッグ＆ドロップやショートカットでのコピー＆ペーストもできるので、Finderでファイル整理するのとそんなに変わらない感じです。

また、左上のアイコンがサーバマネージャとなっており、よくアクセスするサーバはここに設定しておけば良さそうです。

## 終わりに
私は普段windowsでwinSCPを使用しており、Mac使い始めてwinSCPが使えないことに気づき、今回FileZillaを試してみました。
操作感としてはそこまで差もなく、UI的にはこっちの方が好きだなーと感じました。

P.S.
今回初めてQiitaに画像をアップロードしたのですが、qiitaはaws使ってるんですね。
Tamepermonkey用スクリプトは1clickで配布できた

　Javascriptで既存サイトを自由にカスタマイズできる[TameprmonkeyというChrome拡張機能](https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=ja)がありますが、この配布が1clickでできることを知りました。

　配布方法は簡単で、作成したスクリプトをjsファイルとしてネット上に公開して、そのリンクを貼ればよいだけでした。（※インストールするには、Tampermonkeyを事前にChromeにインストールしてもらう必要はあります）

<b>【スクリプトのインストールリンクの例】</b>
　「Google検索結果画面にPocketの「todo」タグをつけた記事一覧へのリンクを追加するスクリプト」への[リンク](https://ssatoh17.work/scripts/tampermonkey/AddPocketLinkToGoogleSearchResult.tampermonkey.user.js)（スクリプトインストール後の画面イメージは下のキャプチャにあります）をクリックすると、インストール画面が表示されるので、そこで「インストール」をクリックすればインストール完了です。

<b>Tampermonkeyスクリプトのインストール画面の例</b>
![Tampermonkeyスクリプトのインストール画面例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86792/b349593c-cab7-82d9-aac8-5ac201fb49f1.png)

<br>
<b>サンプルスクリプトをインストールした後のGoogle検索結果画面の例（Pocketへのリンクが追加されます）</b>
![↑のスクリプトをインストールした後のGoogle検索結果画面の例](https://gyazo.com/7e3f0a3439f612850d5fe44dc9cdb3a9.png)

  
これでTampermonkeyスクリプトの配布・インストールがとても簡単になり、使ってもらいやすくなるはず❗
Azure CloudShellをつかってみる

# **Azure CloudShellをつかってみる**
## **CloudShellとは**
CloudShellとは、Azureポータル上でBashやPowershellを実行することができるシェル環境です。
[Azure CloudShell](https://docs.microsoft.com/ja-jp/azure/cloud-shell/overview)

ブラウザベースで実行することができるため、検証用に構築したサーバへのSSH接続なんかもポータル上からできてしまいます。

CloudShellはAzureAD上のユーザーごとに割り当てられ、
起動したタイミングでAzureADでの認証も完了します。
起動ユーザーの権限に沿って、そのままAzureの操作ができます。便利！！

## **CloudShellを有効化する**
CloudShellの有効化は、ポータル上から行います。  

1. ポータル画面右上の「＞」マークをクリックします。
   ![icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482671/83d70699-2312-2dd0-4f56-1d0a56029db2.png)

2. ログインしているユーザーにCloudShellが紐付いていない場合、登録ウィザードが開始されます。
   ![maunt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482671/5fc6b8d1-520e-b835-77f5-c9b780eb5957.png)

3. サブスクリプション、リージョン、リソースグループ、ストレージアカウント、ファイル共有を選択します。
   リソースグループやストレージアカウントの設定は既存のものを選択しても良いし、新規で作成しても良いです。  


   ※ファイル共有はストレージアカウント上に作成するパーティションのことで、CloudShell起動時にマウントされます。

## **CloudShellを実行してみる**
実際にCloudShellを実行して見ます。  
起動時に、AzureADへの認証は完了しているため、そのままコマンドを実行できます。 

```Get-AzResourceGroup | ft```
![reslut.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482671/42080596-5fa6-9dd9-954a-83b47783ec39.png)

リソースグループ一覧を表示することができました。
CloudShellのPowershellには、Azure PowershellのモジュールやAzureADモジュールがインストールされています。
また、Azure CLIもインストールされているので、そちらを使用することも可能です。  


## **Tips**

### モジュールのバージョン
* Powershellバージョン  
  ```$PSVersionTable```
  ![PSversion.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482671/5962d610-fd28-bebb-6a29-f987e785d47d.png) 
  Powershellのバージョンを見ると、7.0のPowershell Coreがインストールされていることがわかります。OSはUbuntuのようですね。  

* モジュール一覧  
  ```Get-Module |ft -Property Name,Version```
  ![module.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482671/0ac56134-aeba-c671-4b3e-62fb919bd263.png)

* Azure CLIバージョン  
  ```az --version```
![azure-cli.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482671/e0751185-f6ee-1f34-9284-edc5265554c1.png)


### マウントの解除
ストレージアカウントのマウントを解除したい場合は以下コマンドを実行する。  
```$token= ((Invoke-WebRequest -Uri "$env:MSI_ENDPOINT?resource=https://management.core.windows.net/" -Headers @{Metadata='true'}).content |  ConvertFrom-Json).access_token```

```Invoke-WebRequest -Method Delete -Uri https://management.azure.com/providers/Microsoft.Portal/usersettings/cloudconsole?api-version=2017-12-01-preview -Headers @{Authorization = "Bearer $token"}```

CloudShellを再起動すると、ストレージアカウントの選択画面からスタートになる
Ruby on Rails チュートリアル 13日目

##13日目
今日は、チュートリアルの9章を終わらせました。
最近はなれてきたのかそこまで突っかかることがなくなってきた。毎日進めていくことが大切だと感じる。
つぎは、10章をやっていこうと思います。
【Docker】docker-compose buildの際のエラー文The Compose file './docker-compose.yml' is invalid because: Unsupported config option for services.volumes: の解決法

docker-compose buildをしたところ次のエラー。

```
The Compose file './docker-compose.yml' is invalid because:
Unsupported config option for services.volumes: 'mysql-data'
```



##考えられる要因は2つ。

###インデントがそろってない。
こちらはひたすら見て探す。
今回だとmysql-dataの部分にエラーがあるということで、インデントミスがないか探しましょう。



###Dockerのバージョンを更新する。

現在のバージョンを確認し、

```
$  docker-compose -v

$  docker-compose version 1.25.4, build 8d51620a
```

Docker公式サイトで最新のバージョンを確認し、バージョンを更新します。

```
$  curl -L "https://github.com/docker/compose/releases/download/バージョン/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
```
【ざっくり速報】Mastodon Ubuntu 20.04 で動きました

Mastodon Ubuntu 20.04 で動きました。動いていますという記事です。元は19.10の Non-Docker 環境です。
https://www.nekotodon.com/web/getting-started
## 20.04下 動作中の環境

```
mastodon@www:~$ cat /etc/issue
Ubuntu 20.04 LTS \n \l
```

```
mastodon@www:~$ ruby --version
ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-linux]
```

```
mastodon@www:~$ node --version
v12.16.2
```

みなさんの腕前をもってすれば晒す必要のあるのはこれくらいかと思います。

## ざっくり手順

```
hogehoge@www:~$ (マストドンサービスの停止)
hogehoge@www:~$ sudo do-release-upgrade -d
```

(いいなりでYで答えて完了して再起動して)

```
hogehoge@www:~$ (マストドンサービスの停止)
```

```
hogehoge@www:~$ sudo apt update
hogehoge@www:~$ sudo apt upgrade
```

(再起動して)

```
hogehoge@www:~$ (マストドンサービスの停止)
```

### v3.1.3 (最新) に仕向ける
https://github.com/tootsuite/mastodon/releases
https://gist.github.com/momoseijin/0388742083d0ee7eb605b576275a779c

### bundler の gem 一括削除
弊鯖は、これで救われました。libなんちゃらso.なんちゃらを個別に対応しに行って最初はハマりましたが、結果的にこれで一件落着。余計なことはしないほうがいい(らしい)(という学び)。

```
hogehoge@www:~$ sudo rm -rf /path/to/project/vendor/bundle
```

### 入れ直し

```
mastodon@www:~$ cd live
mastodon@www:~/live$ bundle install
mastodon@www:~/live$ yarn install
```

(再起動して)(ブラウザで象の机バンバン出たら強制読み込みして)(おしまい)

### 以下は当社環境では不要でした

```
# RAILS_ENV=production bundle exec rails db:migrate*
# RAILS_ENV=production bundle exec rails assets:precompile*
```

(公開後追記)が、基本的には公式に従ってください。
https://github.com/tootsuite/mastodon/releases
(その後、実行して問題ありませんでした。)

## 付記
今回、要は動いているという実績を示せばみなさんどうにかなさる方ばかりと思い、速報することにした次第です。よき social distance, social networking life を!
AWSアカウント・IAMの管理方法こうしたらちょっといけてた


## この記事のスタンス
今まで実際にやってきたことを `べき論` や何処かを批判する目的ではなく、こうしたらちょっといい感じだった、というスタイルで公開していきます。
セキュリティと利便性の天秤をいい感じにバランスとることは日頃の努力であり、どこがいい感じかは運用によるのでそこは匙加減。
実際の使用者と管理すべき内容を秤にかけていい感じに各々やっていることと思います。

## この記事で説明すること

- AWSアカウントの管理運用方法
- ~~実際のRole/Policyの管理運用方法~~
- ~~自動化について~~

取り消し部分はそのうち別記事で書きます

## AWSアカウントの管理運用方法
実稼働しているAWSがガンガン増えている昨今、大小様々なところでAWSが使用されていますが、その管理方法をちょっとみていきたいと思います。

### よくあるパターン
![usual_aws_account.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625523/c5ce6daa-9d40-9e35-3c80-7691a05f2512.jpeg)
*一個のAWSアカウントの中で様々なサービス(プロジェクト)が同居している状態。*


---
もちろん、規模によりけり運用によりけりではあるものの上図のようなパターンはよく見かけます。
ユーザーアカウント(IAM User 以降Userとする)が大量に作られ、`直接` AWSサービスを駆使するような格好。

無論、これも場合によっては特別まずいパターンではない。

このような時のメリット・デメリットは次の通り

#### よくあるパターンのメリット
- 一個のアカウントだからあちこちを気にしなくてOK
- User側もクロスアカウントとか考えなくていい
- TerraformやServerlessFlameworkを使うときにproviderだったりprofileを分けなくて済む

#### よくあるパターンのデメリット
- Userに対するIAM Policyの管理が複雑になりがち
- 間違えてデプロイして悲惨なことになる確率UP
- しっかりとした管理を行いたい場合にUserをコンソールから締め出したりする必要も出てくる

他にも説明が必要だったり列挙できるものは沢山あるけど、ただの概要説明なので割愛。(いずれちゃんと書くかも)

このパターンの良い所をまとめると、余計なこと考えないでとりあえず使うにはもってこい。
Organizationsや、IAMRole, IAM Policy等のやりだすと時間かかる部分をとりあえず使うところまで持っていける。
これをクロスアカウントにするとS3のオブジェクト一つにしても、クロスアカウントになるだけで書くべきポリシーは増える(≒必要知識も増える)ので、ちょっとした修行が必要になる。


## やってて良い感じだなと思うパターン
![good_patern.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625523/82baf6ff-6d83-d1a4-e712-e345f379209e.jpeg)
*プロジェクト(サービス)毎にAWSアカウント自体が分かれていて、ログインユーザーを配置するアカウントも別途用意*
*図描いてても気持ちいい....*

---
### いい感じだったパターンのメリット
- 権限や管理の中央集権制がアカウント単位でなされる
- 実際のAWSユーザーに不便を強いる必要がない
    - アカウント丸ごと渡すのであとは好きにしてね
        - 但し、CloudTrail等のログは[AWS アカウントのポリシーベースの管理](https://aws.amazon.com/jp/blogs/news/aws-organizations-policy-based-management-for-multiple-aws-accounts/) で制限
- Login用アカウントを管理者チームが管理することでLogin用アカウントにポリシーを必要に応じて作成すればグループでの管理も用意(この辺はよくあるパターンでも同様)
- *RootアカウントのCloudTrailのログ・AWS Config等による作成するサービスへの制限* によって**法人監査**にも簡単に対応可能
- 各アカウントごとにサービスが分かれているのでコスト管理がタグよりも大きな枠で可能(目視も簡単)
- 各アカウントのサービスを連携したときにどうなっているか比較的把握しやすい
- 各種サービスのクオータが他のプロジェクトに邪魔されない(これ重大)
    - S3のバケット作成数の上限は1000個で、分析とかやるようなプロジェクトが複数あるとすぐ逼迫する

### いい感じだったパターンのデメリット
- 作るときに必要な知識がそもそも多い
- 自動化しないと運用がかったるい
    - AWSアカウントの作成自動化
    - OrganizationAccountAccessRoleの調整
        - 誰がAssumeRoleできるの？とか
    - loginアカウントへのIAM ユーザー追加
    - loginアカウントよりも先のアカウントで自前でCloudTrailしたい！みたいな要望への対応
        - これは今現在(2021/03/12)SCPが大分使い勝手良くなったのでよしなにやれる=> [SCP](https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_manage_policies_scps.html)
- 管理したがるタイプの人が管理すると使い勝手が激しく悪くなる(なんでもそう)
- 各アカウントの管理者を立てる必要がある
- 別アカウントのS3等からLambdaをキックする時の設定がめんどくさい

## いい感じだったパターン時のユーザーから見たAWSの扱い方
1. login用のAWSアカウントにログイン(コンソール画面)
2. 必要なプロジェクト用のAWSアカウントへスイッチロール
3. あとは自由！

この時、あとは自由！になる人が本番環境の場合は当然絞られるべきだし、開発環境だからといって好き勝手やると消し忘れたリソースが溢れて費用的に悲しい結末を迎えたりするので要注意。

***もうちょっときれいにどこかで書き直します***
dockerizeでコンテナが立ち上がる順番を制御してみた

#はじめに
dockerizeを利用してコンテナの立ち上げ順を制御したので記事にしたいと思います。docker-composeを使用してRails+mysqlのコンテナを立ち上げた際に、Mysqlのコンテナが立ち上がる前にrailsサーバーを立ち上げようとして、エラーでコンテナが立ち上がらないということがあったのでodckerizeを使用して確実にコンテナが立ち上がるようにしました。(下のようなエラー)

```
can't connect to mysql server on 'db' (115)
```

dockerizeの詳細はこちらを参照ください。
https://github.com/jwilder/dockerize

###なぜdockerizeが必要？
docker-composeの公式にもあるとおり、depens_onでコンテナの依存関係を指定しても、コンテナ内のサービスの準備が整うまでは待ってくれない。その為、コンテナ内のサービスが受け入れる準備が整うまで待つ必要があります。その待つ動作をdockerizeがしてくれます。
http://docs.docker.jp/compose/startup-order.html

###環境
今回は自分が以前記事にしたRails+Mysqlの環境で行いました。
[Dockerを使用して既存のRailsプロジェクト開発環境構築してみた](https://qiita.com/E6YOteYPzmFGfOD/items/7f9ec4e0f48171e351bd)
[Docker+Rails+HeadlessChromeでRSpecのSystem Testしてみた](https://qiita.com/E6YOteYPzmFGfOD/items/905cce063b0d21a0eccb)

#1.dockerizeのダウンロード
dockerizeのパッケージをrails用のdockerfaile内でダウンロードします。
wgetから下三行目と環境変数ENV DOCKERIZE_VERSION v0.6.1を追記します。

```dockerfile:Dockerfile
#既存のプロジェクトのrubyのバージョンを指定
FROM ruby:2.6.3 

ENV DOCKERIZE_VERSION v0.6.1

#パッケージの取得
RUN apt-get update && \
    apt-get install -y --no-install-recommends\
    nodejs  \
    mariadb-client  \
    build-essential  \
    wget \
    && wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /myproject

COPY Gemfile /myproject/Gemfile
COPY Gemfile.lock /myproject/Gemfile.lock

RUN gem install bundler
RUN bundle install --without production

COPY . /myproject

```

#2docker-composeの修正
docker-compose内のrailsサーバーを立ち上げるときのコマンドに「dockerize -wait tcp://db:3306」を加えます。タイムアウトまでの時間も変えることができます。（デフォルトは１０秒）

```yml:docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.7
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    ports: 
      - '3306:3306' 
    environment:
      MYSQL_DATABASE: docker_development
      MYSQL_ROOT_PASSWORD: password
      MYSQL_USER: rooｔ
      MYSQL_PASSWORD: password

  web:
    build:
      context: .
      dockerfile: Dockerfile
    command: dockerize -wait tcp://db:3306 -timeout 5s bundle exec rails s -p 3000 -b '0.0.0.0'
    tty: true #pry-byebugを使えるようにする
    stdin_open: true
    depends_on:
      - db 
    ports:
      - "3000:3000" 
    volumes:
      - .:/myproject:cached
```
これでコンテナを立ち上げます。

```
docker-compose build 
dokcer-compose up -d
```

ログをみてみるとこのようにdb側が受入可能か確認してからrailsサーバーを立ち上げるようになりました。

```
web_1 | 2020/04/25 03:34:09 Waiting for: tcp://db:3306
web_1 | 2020/04/25 03:34:09 Problem with dial: dial tcp 192.168.0.3:3306: connect: connection refused. Sleeping 1s
web_1 | 2020/04/25 03:34:10 Connected to tcp://db:3306
web_1 | => Booting Puma
web_1 | => Rails 5.1.6 application starting in development
```

###終わりに
今回のようにdbが立ち上がるのを待つという使い方以外にも、http通信ができるようになるまで待つとか、特定のファイルができるまで待つとか使い方があるようです。最後までお読みいただきありがとうございました。
HTTPS HTTP Mixed content Ajax not working

Mixed Content: The page at 'https://example.com' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint 'http://XX.XXX.XX.XXX/vicidial/non_agent_api.php?queries=query=data'. This request has been blocked; the content must be served over HTTPS.

```
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> 
```

👍😁
CloudWatch SyntheticsでURL監視をする

気になるAWS INFOを見つけたので、試してみます。
>https://aws.amazon.com/jp/blogs/aws/new-use-cloudwatch-synthetics-to-monitor-sites-api-endpoints-web-workflows-and-more/

# CloudWatch に新機能！
Cloudwatchのコンソール上に、追加されている機能がありました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/0136bc63-dc86-3198-8868-e8dfe2b850ef.png)

「*CloudWatch Synthetics*」というものらしく、Syntheticは、合成という意味らしい。

## CloudWatch Synthetics
コンソール上のTOP画面には、こう記載されています。

>壊れたリンクやデッドリンクの完全なトランザクション、ステップバイステップのタスク完了、ページロードエラー、UI アセットのロード遅延、より複雑なウィザードフロー、またはチェックアウトフローをモニタリングします。

## 実際に何ができるのか
簡単なWebテストが可能みたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/70885890-04b1-7247-5a1b-08c908542b3b.png)


## 料金
枠名 | 内容
--------- | ---------
無料利用枠|1 か月あたり 100 回の Canary 実行
有料利用枠|Canary 実行ごと0.0019USD

# 実際に試します
## 監視するサーバを作成
今回は、作成済みであるWordpressサーバを対象にします。

## Canary作成
「Canary作成」 ボタンを押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/e2bd3f73-57c2-8d28-d9a8-e7d2cb4d1b3f.png)

### Canaryの作成方法はデフォルト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/c9e9a97e-3236-ab34-2a2e-384e27b0327c.png)

###  Canary名とテストエンドポイントを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/4953293f-0058-8772-c636-2e8d0f3697e9.png)
エンドポイントは、自動でスクリプトに入力されるみたいです。
最後の方を見ると、下記の通り、200ステータスが返ってきたら、OKとしているみたいです。

```
if (response.status() !== 200) {
        throw "Failed to load page!";
    }
```

### スケジュール設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/1e2455e4-27f0-c5de-7e44-70d457835e40.png)
選択肢は、

-  1 度実行
-  定期的に実行（分単位で選択可能）

### Canaryの成功失敗の実行情報の保持期間
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/f90ee337-a893-4076-be95-e5707a587ffa.png)
指定できる範囲は 1～455 日です。

### 保管場所（S3）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/34b6b77a-8a25-5615-2136-90511a97261d.png)
Canary名と同一の名前で、S3バケット名が記入されます。
既存のバケットに変更は可能です。

### アクセス許可
デフォルトのままで行きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/f4d38c35-88e0-3689-20b6-bfa99a9b46a2.png)
Canaryを作成ボタンをクリックしたら、1分くらいで作成されます。

## 確認
### 成功時
成功すると、水色になりますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/63a313d0-26c1-3eac-e8b9-5dc620be056d.png)

### 失敗時
極端ですが、インスタンスの停止をしております。
失敗となり、赤色になっていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/e56929d8-8960-6e03-6264-9b96a13acea1.png)


#### 監視スクリプトログ
ログを見る限り、Lambdaが裏側で動いていますね。
テストコードは、lambdaで実施しているみたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/5893d2d4-c2fe-aaf1-c0ac-f3e845cfb257.png)


#### スクリーンショット
テスト対象のエンドポイントのキャプチャもしてくれるみたいなので、エビデンスを残すのにも良さそうですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/c6d90e1d-70da-bd3e-e7f7-df05b7ae343e.png)

# まとめ
- Cloudwatchで、URL監視を実装できた
- 中身自体がlambda関数なので、カスタマイズができそう
- 監視エビデンスとして、ログやスクリーンショットが保存できる
Jupyter LABへのショートカットキーの割当て：Run Sellected Cell and All Below/Run All Cells

##背景
頻繁に使うことが多い、**Run All Below**にショートカットキーが割り当てられていないので作成方法を探りました。

■ **Run All  Below ⇒ 　　Command+Shit+Enter （好みで選択）**

**Jupyter Notebook**では簡単に作成出来るのですが、**JupyterLab**ではそれほど簡単ではないです。
**他のコマンド**のキー割り当ても同様に出来ます。
慣れれば難しいものではないです。

#### 追加
■ **Run All  Cells ⇒ 　　　Command+Option+Enter**

##参考文献
####JupyterLABでのショートカット追加に関する記事
以下の2つのブログを参考にしました。
[Jupyter Lab ショートカット一覧(Windows) とキー割り当て変更方法](https://qiita.com/YH0132/items/7588479a3c979a1f287e)
[Expose Run Selected Cell and All Below handle for keyboard shortcut creation#5371](https://github.com/jupyterlab/jupyterlab/issues/5371)

####Jupyter Notebookのショートカット変更方法
Notebookの方は簡単に作成出来ます。
[Jupyter notebook ショートカット解説](https://qiita.com/forusufia/items/bea3f6fd6160cd2f5843)
##【1】 変更する場所

メニューで
**Setting -->Advanced Settings Editor-->New Notebook**
を選択します。
System Defalutsに数多くのショートカットが表示されます。
<img width="1027" alt="CA080319-2C2D-4B84-9199-9FF468EBC776.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106598/3044d52c-d436-2150-7b32-36e6115a2778.png">


##【2】コードを記入
**User Preference**にコードを記入-->**Saveボタン**（右上の小さいボタン）
syntax Error等があると同じく右下に表示されるのでNo Errorが出るまでつぶします。
<img width="1311" alt="A1301911-8304-4C79-B789-8415CB3398D1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106598/78a81dc8-86c1-cec4-4998-00f9b345743f.png">
**Run Selected Cell and All Below**の欄にショートカットキーが現れる（**再起動は不要**：そのまま出てくる）
<img width="1169" alt="B11728D3-8854-4A29-B5EA-8A726FCC5144.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106598/5b282a9b-526e-eac6-ef51-368c420fdab3.png">
以下からコピペが出来ます。

```json
{
    "shortcuts": [
        {
            "command": "notebook:run-all-below",
            "keys": [
                "Accel Shift Enter"
            ],
            "selector": ".jp-Notebook:focus"
        }
        ]
    
}
```
##コードの詳細
####**"keys"**
**Accel** (Macでは**Command**キー）
**Accel Shift Enter**
とそのまま打ち込む（Jupyter Notebookの様なハイフォン等は不要）

####**"command"と"selector"**
他の似たようなショートカットキーをまねて入れます。
セレクターは正しく入れることが重要です。

## 【3】追加
####Run All Cells
追加をする際には、**カンマ（,)**を入れるのがポイント
よく使う、**run-all-cells**を入れてみました。MACの**Option** Keyは**Alt**

```json
        },
        {
```

```json
{
    "shortcuts": [
        {
            "command": "notebook:run-all-below",
            "keys": [
                "Accel Shift Enter"
            ],
            "selector": ".jp-Notebook:focus"
        },
        {
            "command": "notebook:run-all-cells",
            "keys": [
                "Accel Alt Enter"
            ],
            "selector": ".jp-Notebook:focus"
        }
        ]
       
}
```



以上
【Rails】ActionMailerを用いたメール送信機能の実装

#目標

ユーザーがログイン後に、Googleメールを送信する。

# 開発環境
・Ruby: 2.5.7
・Rails: 5.2.4
・Vagrant: 2.2.7
・VirtualBox: 6.1
・OS: macOS Catalina

# 前提

下記実装済み。

・[ログイン機能実装](https://qiita.com/matsubishi5/items/5bd8fdd45af955cf137d)

#1.`「development.rb」`を編集

```ruby:development.rb
Rails.application.configure do
  # 34行目を「true」に変更
  config.action_mailer.raise_delivery_errors = true
  .
  .
  .
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    port:                 587,
    address:              'smtp.gmail.com',
    domain:               'gmail.com',
    user_name:            'メールアドレス',
    password:             'パスワード',
    authentication:       'login',
    enable_starttls_auto: true
  }
end
```

#2.`メーラー`を作成

```terminal:ターミナル
$ rails g mailer LoginMailer
```

#3.`メーラー`を編集

```ruby:login_mailer.rb
class LoginMailer < ApplicationMailer
  def send_when_login(user)
    @user = user
    mail to: @user.email, subject: 'ログイン完了'
  end
end
```



|  プロパティ  |  役割  |
| ---- | ---- |
|  to  |  送信先の指定  |
|  cc   |  一斉送信先の指定  |
|  bcc  |  非表示送信先の指定  |
|  from  |  メールの送信元名  |
|  subject |  メールタイトル |
|  date | メールの送信日時 |
|  reply_to  |  返信用アドレスの指定  |


#4.`「send_when_login.html.erb」`を作成し、編集

```erb:login_mailer/send_when_login.html.erb
<%= @user.name %> 様

<p>ログインが完了しました。</p>
```

#5.`「application_controller.rb」`を編集

```ruby:application_controller..rb
# 追記
def after_sign_in_path_for(resource)
  LoginMailer.send_when_login(current_user).deliver
  root_path
end
```
python、range()について

range()についてメモ

pythonで連番でfor文を回す場合、range()を使う。
例えば、0から19までを出力する場合は以下の通り

```.py
for i in range(20):
    print(i)

---（結果）---
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
```
テスト投稿

駆け出しエンジニアのIharaです。

現在Sierで働きながら、Web企業に転職できるように学習を進めています。
今後メモとしてや、自分の理解を深めるために情報発進をしていければと思っております。

下記がgithubのURLになります。
https://github.com/RyotaIhara
これからもっと良いものを開発できるように頑張っていきます。
MacBookAir (A1369)を初期化する

古い MacBookAir の初期化でひどい目に合ったのでメモっておく。やりたいことは、調子の悪くなったYosemiteをこのMacをサポートする最新OSのHigh SierraにしてAdobe CS専用マシンとしてもうしばらく頑張ってもらう。

## たぶん一番速い方法

- 準備
    - 12GB(8GBでもいい？) USBドライブ
    - Time Machineでバックアップ（必要であれば）
    - HDDを消去しておく？（クリーンインストール）
- High Sierra のInstall USBを作成する
    - 公式ガイド https://support.apple.com/ja-jp/HT201372
    - 同様の記事 https://ischool.co.jp/2019-10-15-how-to-create-a-usb-memory-for-macos-high-sierra-installation/
- Option キーを押しながらMac起動、Install選択、あとはよしなにクリーンインストール
- Adobe CS 再インストール (そのためのHigh Sierra)
    - SafariBookmarksS の終了をお願いされた場合の対処
        - https://ischool.co.jp/2018-09-28/
            - アクティビティモニタでSafariBookmarksSyncAgent終了すればOK
- OSアップデートしておく
    - 何回か起動を繰り返す。
        - その際、進捗バーの進みがおかしいかったり、ファンがブンブン回たっり、音も色々出たりするが、じっと我慢する。
- Time Machineでバックアップ開始
- 10年前のマシンだけど令和でも現役でもうひと仕事。

## トラブル一覧

他にもあるかもしれないけど

- CMD+RからのリカバリモードでのLionのインストールは失敗する
    - 殺し文句「必要なダウウンロードが見つかりません」
        - この場合、多分行き止まり
- OPT＋CMD+Rで、インターネットリカバリからのLionのインストールは失敗する
    - 20分ほど経過したところで、殺し文句登場「Mac OS Xをインストールするために必要な追加コンポーネントをダウンロード出来ません」 
        - この場合、多分行き止まり
- Lion のインストールUSBメモリからのインストールが失敗する
    - 殺し文句は「Mac OS Xのインストールで問題がおきました」
    - https://tomippe.jp/kb/747/
        - PRAMのリセット、両手を使って CMD+OPT+P+R 押しながら起動、ジャーン2回
        - 多分、色々失敗してるうちにPRAMが汚染されるのかな？
- LionからHigh SierraにはUpdateできない
    - https://yuzakasota.com/20180526-how-to-update-macbook-pro-late-2011-from-mac-os-x-lion-10-7-5-to-mac-os-high-sierra-10-13-4/
        - OS X El Capitan には出来るらしいが、、、
- LionからEl Capitan へのUpgradeは失敗する
    - 殺し文句は「インストールできるパッケージがありません、ソフトウェア製造元に問い合わせてください」 
    - 関連しそうな話
        - https://discussionsjapan.apple.com/thread/250890130
        - http://jetzt.way-nifty.com/blog/2019/12/post-753859.html
    - macOS の起動可能なインストーラを作成すれば良い模様
        - https://support.apple.com/ja-jp/HT201372
- Wacomの古いペンタブのデバドラがなくて調子が悪い
    - Wacomにこだわらないのであれば、XP-PENのタブレットが結構使える

## その他

- OS互換性
    - https://support.apple.com/ja-jp/HT201862
    - A1369 => 13-inch, Late 2010 => 最終対応のオペレーティングシステム：macOS High Sierra 10.13.6
【BigQuery】SQLで複雑な条件式が含まれたカウント文を書く、COUNT関数

## 概要
Queryで集計するときによく使うCOUNT関数の小技をご紹介します。（確認しているのはBigQuery）

### テストデータ
| event_id | user_id | prefecture | date |
|:-:|:-:|:-:|:-:|
|1|9214|石川県|2002/4/27|
|2|949|島根県|1989/9/18|
|3|9477|青森県|1981/9/23|
|4|4732|佐賀県|1994/10/29|
|5|870|神奈川県|1988/10/7|
|6|5381|長野県|1988/12/17|
|7|1341|神奈川県|1997/12/18|
|8|1341|神奈川県|1997/12/18|
|9|1341|神奈川県|1997/12/18|
|10|2755|奈良県|2010/12/18|

### 例1 レコードの数を数える
簡単ですね

```sql
select count(1) from test
```

### 例2 都道府県が何種類あるかを数える
**重複なしで数えるパターン**

```sql
select count(distinct prefecture) from test
```

### 例3 神奈川県の数を数える
**条件でフィルタしつつ数えるパターン**
多分これがよくあるパターン

```sql
select count(1) from test where prefecture = '神奈川県'
```

実はこうかけちゃいます

```sql
select count(if(prefecture = '神奈川県'),prefecture) from test
```

というかcountifがあります

```sql
select countif(prefecture = '神奈川県') from test
```

### 例4 神奈川県のユーザの数を重複なしで数える
神奈川県でユーザIDがいくつあるかを数えます。where句を使えば簡単なんですが、countとifだけでもかけちゃいます。

```sql
select count(distinct if(prefecture = '神奈川県', user_id, null)) from test
```

### 例5 神奈川県と青森県がそれぞれ全レコードの何％を占めているのかを数える
**異なる条件でそれぞれの出現回数を数えるパターン**

```sql
select
SAFE_DIVIDE(countif(prefecture = '神奈川県'), count(1)) * 100,
SAFE_DIVIDE(countif(prefecture = '青森県'), count(1)) * 100
from test
```

## まとめ
where句では一行で出すことが難しいパターンを表現できました。
是非ご参考までに！
tmuxのペイン分割線で文字が隠れてしまう問題の対処法

# 問題

tmuxのペイン分割線が破線となり文字が隠れてしまう。
具体的には、下図のように、右側のペインにおいて`abcde`という文字の出力が`bcde`となる。（`a`の文字が隠れてしまっている）

## 出力例

![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12788/0fca51f0-b052-7125-1846-e9056cffa63a.png)

## 環境

- Windows 10 1909
- Ubuntu-18.04 on Windows Subsystem for Linux
- mintty 3.1.0 (wsltty 3.1.0.2)
- tmux 2.6

# 対処法

`~/.tmux.conf`に以下の設定を追記する

```~/.tmux.conf
set -ag terminal-overrides ",*:U8=0"
```

## 出力例

![after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12788/5fc22bd7-cc8b-bd21-5e8f-86150fcfe8d4.png)

## 参考
- [Why are tmux pane separators dashed rather than continuous lines? - FAQ · tmux/tmux Wiki](https://github.com/tmux/tmux/wiki/FAQ#why-are-tmux-pane-separators-dashed-rather-than-continuous-lines)
rails 複数のviewに新規投稿フォーム render先がそれぞれのview

### 前提・実現したいこと
railsでちょっとしたブログサイトを作っています。
また、ログイン機能などはdeviseを用いて作っています。
モデルはUser(ユーザー情報)とBook(記事投稿の情報)の2つです。
今回は複数のページに新規投稿画面を搭載しようとしています。
そして投稿が規定の文字数を超えた時などのエラー時にはrender先としてその時のviewファイルを指定するのが目的です。

### 発生している問題・エラーメッセージ
複数のページに一つのcreateアクションを設定しているのですが、投稿の際のエラー時のrender先をその時のそれぞれのviewファイルに設定する方法が分かりません。
また、createアクション内でrender 'show'(投稿の際にえらーが起きた時)と記載したとします。showファイルでは新規投稿フォームとそのユーザーが投稿した情報の一覧が記載されています。その場合createアクション内に@user = User.find(params[:id])のように記載してユーザーのidを見つけてこないといけないのですがそうするとcreateアクションのurlにはid情報はないのでエラーになります。


### 該当のソースコード

```html
<div class="col-xs-3">
			<section class="users-info">
				<h2>User info</h2>
					<%= attachment_image_tag @user, :profile_image, format:'jpeg',fallback:"no_image.jpg",size:"100x100" %>
						<table class="table">
							<tr>
								<td><strong>name</strong></td>
								<td><strong><%= @user.name %></strong></td>
							</tr>
							<tr>
								<td><strong>introduction</strong></td>
								<td><strong><%= @user.introduction %></strong></td>
							</tr>
						</table>
						<div class="row">
							<%= link_to edit_user_path(@user.id) do %>
								<span class="col-xs-12 edit-icon" href=edit_user_path(@user.id)><i class="fas fa-edit"></i></span>
							<% end %>
						</div>
			</section>
			<div class="new-book">
				<h2>New book</h2>
				<%= form_for(@book,url: books_path, method: :post) do |f|%>
				<div class="field row" style="padding-bottom: 10px">
					<p class="book-title"><strong>Title</strong></p>
							<%= f.text_field :title, class:"col-xs-12" %>
				</div>
				<div class="field row" style="padding-bottom: 10px">
					<p class="book-opinion"><strong>Opinion</strong></p>
					<%= f.text_area :body, class:"col-xs-12" %>
				</div>
				<div class="actions row" style="padding-bottom: 10px">
						<%= f.submit "Create Book",class:"col-xs-12 btn btn-primary"%>
				</div>
				<% end %>
			</div>
		</div>
```
```controller
class BooksController < ApplicationController
  def create
  	@user = User.find(params[:id])
  	@books = @user.books.page(params[:page]).reverse_order
  	@book = Book.new(book_params)
  	if @book.save
  		flash[:notice] = "Book was successfully created."
  	   redirect_to book_path(@book.id)
  	else
  		render 'show'
  	end
```

### 試したこと

部分テンプレートを用いて新規投稿の部分を一つにまとめようとしていますが、対処としあっているのかいまいち分かっていません。
初心者で分からないことだらけなのでご教授いただけると幸いです。

### 補足情報（FW/ツールのバージョンなど）

ここにより詳細な情報を記載してください。
cactiのAdvanced Ping ( Smoke Ping ) の 枠線が無いのが気になったので修正した。

# すげー細かいところが気になってしまった

cactiの **[Advanced Ping] (https://docs.cacti.net/usertemplate:graph:advanced_ping_alt)** で、グラフの最下段の罫線が無いのが気になったので修正した。
再度構築の際に忘れないようにメモしておく。

Advanced Pingとは、Cactiのテンプレートで、遅延やらロスやらをグラフ化してくれる。
[![Screenshot from Gyazo](https://gyazo.com/c671e6336a21d3ea12253a9d2cd78548/raw)](https://gyazo.com/c671e6336a21d3ea12253a9d2cd78548)


普通のグラフはこのようにゼロ位置に黒い線がある。
[![Screenshot from Gyazo](https://gyazo.com/a258329212c6c5dff294ec895fe71d6a/raw)](https://gyazo.com/a258329212c6c5dff294ec895fe71d6a)

けど、Advanced Pingだと、これがない。
[![Screenshot from Gyazo](https://gyazo.com/df2910520526fe93e5a235b82bba1505/raw)](https://gyazo.com/df2910520526fe93e5a235b82bba1505)

ちょっとだけ、ほんのちょっとだけ気になる。


# 解決方法
Console -> Templates -> Graph -> Advanced Pingを探す。
（自分の環境では名前を *GT - Advanced Ping* に変えています）
[![Screenshot from Gyazo](https://gyazo.com/57e2bf6bbfe65462caa2412f43bd26ea/raw)](https://gyazo.com/57e2bf6bbfe65462caa2412f43bd26ea)

このようなテンプレートアイテムの編集画面がでるので、
[![Screenshot from Gyazo](https://gyazo.com/c016b0dbe3ef6e9252b54f14e7f0ca8c/raw)](https://gyazo.com/c016b0dbe3ef6e9252b54f14e7f0ca8c)

Item#35 を選択（HRULE:0 で #FFFFFF になっているところ）
[![Screenshot from Gyazo](https://gyazo.com/61c31714b637fb0ebbb60645700cb0ca/raw)](https://gyazo.com/61c31714b637fb0ebbb60645700cb0ca)

編集画面になるので、 Color を #FFFFFF から #000000 に変更して Save
[![Screenshot from Gyazo](https://gyazo.com/c58a2fecdb331a0eb0a20e22c7b5f392/raw)](https://gyazo.com/c58a2fecdb331a0eb0a20e22c7b5f392)


# 確認する
[![Screenshot from Gyazo](https://gyazo.com/de5d9c773eb6a1183b1a49facd10ca25/raw)](https://gyazo.com/de5d9c773eb6a1183b1a49facd10ca25)

これでOK

自前のカレンダー表示でもちゃんと表示されてる。
[![Screenshot from Gyazo](https://gyazo.com/8fbed1b46b75040f174f008e31fccc5e/raw)](https://gyazo.com/8fbed1b46b75040f174f008e31fccc5e)


おしまい

# なぜ罫線を消したのか
罫線付けてみたら、ちょっと見にくくなったような気がする。
だからわざわざ白に設定して消していたのかもしれない。
けど、UpperLimitつけてmin値を中央にしたり、カレンダー形式で表示しようとすると、軸線がないのが気になるんですよね。

# 出典
とくにありません
Unityの基本的な操作とプログラム

##Unityの用語集
- **Scene（シーン）**
オブジェクトとそのパラメータを記録し保持しているもの。
シーン = 場面

- **Hierarchy（ヒエラルキー）**
現在開いているシーンを編集するウィンドウ。

- **GameObject（ゲームオブジェクト）**
イメージは「ただの箱」
色々な機能を持たせられる。

- **Inspector（インスペクター）**
選択しているものの情報を見るウィンドウ。

- **Component（コンポーネント）**
オブジェクトに様々な機能を持たせられるもの。

##コンポーネントの種類
###標準
- **Transform**
位置回転大きさの情報を扱う。

- **Meshfilter**
3Dの情報を読み込む。

- **MeshRenderer**
読み込んだ3D情報を見えるようにする。

- **BoxCollider**
四角い当たり判定を設定する。

- **Material**
3Dオブジェクトの材質を設定する。

- **RigidBody**
ゲームオブジェクトを物理特性によって制御する。
使い方の詳細: https://www.sejuku.net/blog/51770

###Cluster Creator Kit
- **Despawn Height**
プレイヤーやアイテムをリスポーンする高さを決める。

- **Spawn Point**
ワールドに入った際とリスポーンした際の位置を決める。

- **Movable Item**
ワールド内のプレイヤー間でオブジェクトの位置を同期する
使い方の詳細: https://clustervr.gitbook.io/creatorkit/movableitem

- **Grabbable Item**
プレイヤーがオブジェクトを掴んて移動できるようにする
使い方の詳細: https://clustervr.gitbook.io/creatorkit/grabbableitem

##C#によるプログラム記述例
- コンソールに文字列を出力する

```C#:project.cs
Debug.Log("文字列");
```

- オブジェクトのx軸を1動かす (1,0,0)

```C#:project.cs
transform.position += Vector3.right;
```
- オブジェクトを回転させる

```C#:project.cs
transform.Rotate(new Vector3(0,0,30))
```

- オブジェクトのポジションを取得

```C#:project.cs
transform.position.x
transform.position.y
transform.position.z
```
##オブジェクトにテクスチャを適用する
1. マテリアルを生成し右クリックでImport New Assetを押し、テクスチャ画像を取り込む。
2. マテリアルのインスペクターのLocalImageのShaderをLegacy ShadersのDiffuseにする。
3. そしてテクスチャイメージをマテリアルのインスペクターのNone(Texture)のところにD&Dする。

**リファレンス:** https://book.mynavi.jp/manatee/detail/id=59718

##pngテクスチャの透過処理
Shader → Unlit → Transparent
**リファレンス:** http://mtimsno.hatenablog.jp/entry/2016/06/08/221539

##テクスチャを引き伸ばさずに並べる
マテリアルのインスペクターのTilingのx,y値がテクスチャを並べる数である。
おすすめの設定はオブジェクトのスケール値と同じ値を設定することだ。
**リファレンス:** https://increment-log.com/unity-texture-stretch/

## 重力を変更する
Edit > Project Settings > Physics > GravityからY値を変更
##動くオブジェクト一緒にプレイヤーを動かす
**リファレンス:** https://codegenius.org/open/courses/23/sections/90

##リンク
**cluster:** https://cluster.mu/
プラットフォーム

**VRoidHub:** https://hub.vroid.com/
無料でアバターをダウンロードできる。

****
DockerのMySQLを起動時にリセットしたい

## 問い
`/docker-entrypoint-initdb.d/`以下のsqlファイルを`docker-compose up`ごとに実行したい。


## 答え
`--renew-anon-volumes`オプションを使う。

```bash
docker-compose up --build --force-recreate --renew-anon-volumes
```

## 参考
[How to 'docker-compose up --force-recreate' without reusing previous volumes](https://github.com/docker/compose/issues/2127)
【Unity】newってなに？？　newが必要なシチュエーションまとめ

#環境
Unity 2019.3.7f1

#はじめに
ネットでコードを検索していると new がついているコードありますよね？？
今回は、
　**・newとは何か？**
　**・newが必要なシチュエーション**
を私がわかっている範囲でまとめておきます。


#newとは何か？
まずnewですが、
**インスタンスを作る演算子**
です。

**new 型名();**

でその型名のインスタンスを作成することができます。

設計図の状態から実体を持たせるらしいです。(雰囲気しかわかってない)

#newが必要なシチュエーション
今私が把握しているのは次の4つです。
**・空のゲームオブジェクトを作るとき**
**・自分で作ったクラスを使うとき**
**・配列を使うとき**
**・構造体(Vector3やVector2など)を使うとき**

※もとから作られているC#のクラスはnewでインスタンス化できないらしい


###コード例
**・空のゲームオブジェクトを作るとき**

```CSharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class test : MonoBehaviour
{
    void Start()
    {
        new GameObject();//空のオブジェクト作成　括弧内に文字列を入れることでオブジェクトの名前を指定できる
    }
}
```
　
**・自分で作ったクラスを使うとき**

```CSharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//ABCという名前のクラス作成
public class ABC
{    
    //関数作成
    public void Moji()
    {
        Debug.Log("newって難しい");
    }
}


public class test : MonoBehaviour
{
    ABC a;//作成したクラスABC型の変数aを宣言

    void Start()
    {
        a = new ABC();//変数aにABCクラスのインスタンスを作成
        a.Moji();//ABCクラスのMoji()関数を実行
    }
}
```
 　
**・配列を使うとき**

```CSharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class test : MonoBehaviour
{
    private int[] a;//int型の配列を変数aで宣言

    void Start()
    {
        a = new int[3];//配列を作りint型の配列変数aに入れる

        //配列 a[0]=0, a[1]=1, a[2]=2 にする
        for (int i = 0; i < 3; i++)
        {
            a[i] = i;
            Debug.Log("a[" + i + "]=" + a[i]);
        }
    }    
}
```
 
　
**・構造体(Vector3やVector2など)を使うとき**

#####Vector3

```CSharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class test : MonoBehaviour
{    
    void Start()
    {
        //このスクリプトがアタッチされたオブジェクトの位置を(1,2,3)へ変更
        transform.position = new Vector3(1, 2, 3);
    }    
}
```
　
#####Vector2
```CSharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class test : MonoBehaviour
{    
    void Start()
    {
        //このスクリプトがアタッチされたオブジェクトの位置を(10,20,0)へ変更
        transform.position = new Vector2(10, 20);
    }    
}
```

#おわりに
空のゲームオブジェクトを作ることは実際やらないと思うので、

**・自分で作ったクラスを使うとき**
**・配列を使うとき**
**・構造体(Vector3やVector2など)を使うとき**

の３パターンの場合、**new**するってのを覚えておけば開発に問題無いと思ってる私です。

そのうち深く理解できることを信じて今日も開発！！
ActiveRecordから任意のカラムの配列を取得する

#はじめに

Rails を使っている時に、where で検索した複数レコードの内、任意のカラムの配列を取得したい時がありました。

# pluckメソッドを使う

ActiveRecord のメソッドを色々見てると pluck というメソッドが有りました、日本語でむしるという意味らしいです。

引数にカラム名を指定して使います。

~~~ruby:users_controller.rb
 male_names = User.where(gender: "male").pluck(:name)
~~~

以下のように配列が取得できます。

~~~
  ["太郎", "次郎"]
~~~

ちなみに複数のカラムの指定もできます。

~~~ruby:users_controller.rb
 # id と name のみを取り出したいケース
 male_names = User.where(gender: "male").pluck(:id, :name)
~~~

以下のように取得できます。

~~~

  [[1,"太郎"], [3,"次郎"]]
~~~
wordpressの設定パラメータの一覧を表示する「options.php」

# 概要
タイトルのままなのですがwordpressで設定パラメータの一覧を表示させるページがあります。
普段そんなに使うことはないので自分のための備忘録です。

# 表示方法

表示させるには下記のURLへアクセスします。

http://ドメイン/wp-admin/options.php

<img width="1277" alt="スクリーンショット 2020-04-25 11.26.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145608/d4f99450-12b0-fe46-81c1-3ec9322ed8c2.png">

上記のページにアクセスすると各種パラメーターの一覧が表示されます。
例えば、「upload_path」を変更すれば、通常 /wp-content/uploads/ 配下に画像が置かれますが、これを別のディレクトリに変更することもできるのです。
そのほかにもパラメーターを一覧表示させているので一気に変更したいときなど重宝するかなと思います。

# 終わり
今日はこんな感じで自分のメモ的なお話でした。
第10世代 intel NUC10(NUC10i3FNH)にUbuntu 20.04 LTSをインストールする

# はじめに
* 2020/4月に発売された第10世代 intel NUC10(NUC10i3FNH)にUbuntu 20.04 LTSをインストールしてみました。現時点でのサポートOSはWindows10のみなのでインストールに苦労すると思いきや、自分の使用用途（ディスプレイ1920×1080、有線GigabitLAN、Wi-Fi接続、Bluetooth接続）においては追加でドライバを入れる必要もなく、すんなりインストールが完了しました。
* 使用パーツ  
メモリ Crucial 4GB DDR4-2400 SODIMM  
  ※某メーカのDDR4-2666は画面が乱れ動作不可でした。メモリは相性があるかも知れません。      
ＳＳＤ Crucial 120GB

# 1. インストール手順
参考例です。インストール用USBメモリを作る手順は色々あるのでお持ちの環境に合わせて選択してください。

* ISOダウンロード
wget https://releases.ubuntu.com/20.04/ubuntu-20.04-desktop-amd64.iso

* ISOハッシュ値確認
wget https://releases.ubuntu.com/20.04/SHA256SUMS
LANG=C sha256sum -c <(grep ubuntu-20.04-desktop-amd64.iso SHA256SUMS)


```
ubuntu-20.04-desktop-amd64.iso: OK
```

* USBメモリのデバイス名確認
fdisk -l

* USBメモリへの書き込み
dd if=./ubuntu-20.04-desktop-amd64.iso of=/USBデバイス名 bs=32M status=progress
※bs、statusはお好みで


# 2. 本体のBootメニュー表示
少し、わかりにくい操作になります。
まず、電源ボタンを長押します。LEDが青から赤に変わったら電源ボタンから手を離します。
![t_IMG_3956_cr.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60838/b7c3ddca-7e29-3eff-39bb-89f88d11d6a9.jpeg)

しばらく待つとBootメニューが表示されます。
[F10] Enter Boot Menu　を選ぶと、Boot Menuが表示されるのでOSが入っているUSBを選択します。
![t_IMG_3955_cr_cr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60838/c89d534d-3d4c-90de-bc8a-840b047d422a.png)


ただ、Bootメニューが表示されないこともあったので、電源ON時に[F2]キー長押ししてBIOS画面を表示。その後、BIOSで起動順を設定するほうが確実かもしれません。Bootの起動順は、下記で設定可能です。
方法1
Boot - Boot Priority を変更する。

方法2
Boot USB Devices First にチェックを付ける。
# 3. その他
起動をやり直したいときに電源キー長押ししても電源を切ることができませんでした。仕方なく電源コードを抜いて対応しました。電源ボタンでの電源OFFの方法、ご存知の方いらっしゃいましたらご教示ください。

試しにWindows10もインストールしてみましたが問題なくインストールすることができました。ただこちらはインストール後、NUC用のドライバを入れる必要がありました。
https://downloadcenter.intel.com/ja/product/198082/intel-nuc-mini-pc-with-10th-generation-intel-core-processors
そう考えると、Ubuntuはサポートもされてないのに追加ドライバ不要なのはすごいですね。

では、良いNUCライフを！
BigQueryに好きなデータを取り込むFirebase Functionsの作成

## 概要
データ分析の第一歩として「データ取り込みの（部分的）自動化」をしてみました！

GCSのCSVから自動でBigQueryに取り込んでくれる Functionsを作成します。
GUI・CLIでも同様の操作が行えますが、「特定のバケットに置くと自動で取り込み」を行うことで、社内やチーム内でも気軽にBigQueryを利用できるようになります。


## 実際に動かしてみる
#### 1. Google Cloud Storageにバケットを作成
こちらを参考にサクッと作成
https://cloud.google.com/storage/docs/creating-buckets?hl=ja

#### 2. BigQueryにデータセットを作成
公式ドキュメントが見やすいですね。「gcs_temporary_dataset」としました。
https://cloud.google.com/bigquery/docs/datasets?hl=ja

#### 3. Firebase Functions(Cloud Functions)を利用してデプロイ
取り込むCSVは「{ファイル名}_YYYYMMDD.csv」で一行目がフィールド名という規則です。
「特定にバケットにオブジェクトが作成された」ことをトリガーにする ことがコードで表現できます。最高！！！

#### 4. ストレージにCSVを配置してBigQueryに取り込んでみる
東京都オープンデータカタログサイトからCSVをダウンロードしてみました。
ファイル名の最後に「_20200425」をつけるのを忘れずに。
https://catalog.data.metro.tokyo.lg.jp/dataset/t000010d0000000068/resource/c2d997db-1450-43fa-8037-ebb11ec28d4c

#### 実際に取り込まれたデータ
ヘッダーが日本語なのでフィールド名が壊れちゃってますが一応成功。
<img width="1280" alt="スクリーンショット 2020-04-25 11.12.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622208/df66e075-9891-95dd-1246-49835c3d65b8.png">


## 実際のコード
firebase functionsとtypescriptを利用して作成しました。

``` typescript
'use strict';
import {BigQuery} from '@google-cloud/bigquery';
import {bigquery_v2} from 'googleapis';
import Schema$JobConfigurationLoad = bigquery_v2.Schema$JobConfigurationLoad;
import * as functions from 'firebase-functions';

const projectId = // GCPのプロジェクトID
const backetName = // GCSのバケット名
const datasetId = // BQのデータセットID

export const importBigqueryTemporaryTable = functions
  .runWith({timeoutSeconds: 300, memory: '1GB'})
  .storage.bucket(`${backetName}`)
  .object()
  .onFinalize(async (object) => {
    try {
      const name = object.name!;

      // ファイル名がテーブル名のイメージ
      // hoge_YYYYMMDD以外の名前は許さない
      const matched = name.match(/(.*)_\d{8}/);
      if (!matched) {
        console.log('filename not match.');
        return false;
      }

      const tableId = matched[0];

      const bigquery = new BigQuery();
      const configuration: Schema$JobConfigurationLoad = {
        destinationTable: {
          datasetId: datasetId,
          projectId: `${projectId}`,
          tableId: `${tableId}`,
        },
        sourceFormat: 'CSV',
        sourceUris: [`gs://${object.bucket}/${name}`],
        writeDisposition: 'WRITE_TRUNCATE',
        autodetect: true,
        encoding: 'UTF-8',
        skipLeadingRows: 1, // ヘッダーはカラム定義のイメージ
      };

      await bigquery.createJob({
        configuration: {load: configuration},
      });

      console.log('success to import bigquery temporary table.', tableId);
      return Promise.resolve('success');
    } catch (e) {
      console.log('Failed to import temporary table.', e);
      return Promise.reject(e);
    }
  });
```

## まとめ
たったこれだけのコードで、「特定のバケットに置くとBigQueryに取り込み」を自動化することができました。CSVのフォーマットが正しくないときには動作しないなどの問題はありますが、最小限の動作は行えると思います。
BigQueryのデータセットの設定でデフォルトの保存期限を設定すれば、データの消し忘れもなくなります。

質問・ご指摘お待ちしております！
グロスマンモデル

# グロスマンモデル
覚えておきたい点をメモ
グロスマン(Grossman)により1972年に提唱された。健康資本投資に関するモデル。

### 基本
・$T$: ある時点
・$t$: 0からTまでのある時点
以下添字の$t$は時点tであることを示す。
・$Z_t$: 消費財の消費水準
・$X_t$: 消費財生産のための市場材の購入量
・$M_t$: $I_t$分の健康資本量を増加させるために必要な医療サービスの購入
・$H_t$: 健康資本の量
・$I_t$: 健康投資の量
・$\delta_t$: 減耗率

・時点0における健康資本
$$
H_0 = \bar{H_t}　\tag{1}
$$
・健康投資$I_t$を考慮した時点$t+1$における健康資本
$$
H_{t+1} = (1-\delta_t)H_t+I_t \tag{2}
$$



### 利用可能な時間の考慮
・$\Omega_t$: 所有する時間
・$TW_t$: 労働時間
・$TH_t$: 健康の損失により損失する活動時間
・$TM_t$: $I_t$分の健康資本量を増加させるために必要な自分の時間
・$TZ_t$: 消費財生産に投入する時間
・$w$: 賃金率
・$wTH_t$:　所得
・$R$: 割引現在価値額
・$A$: 初期資産保有額

$$
TH_t = TM_t+TZ_t+TW_t+TH_t \tag{3}
$$

$$
R = A+\sum_{t=0}^T{}\frac{wTW_t}{(1+r)^t} \tag{4}
$$

医療サービスM_tの価格をP_tとすると
$$
\sum_{t=0}^T\frac{(P_tM_t+X_t)}{(1+r)^t} \tag{5}
$$

収入=支出と仮定すると(4),(5)より

$$
A+\sum_{t=0}^T\frac{w\delta_t}{(1+r)^t} = \
 \sum_{t=0}^T\frac{P_tM_t+X_t+w(TM_t+TZ_t+TH_t)}{(1+r)^t}　\tag{6}
$$

(6)を条件として、個人はZとHにおける効用を最大化する。


### 健康投資の最適条件に関して

・限界費用: 健康投資を限界的に増やした時に失う費用の変化分
・利子: 貯蓄に回しておけばえられたであろう利子


*日常生活時間✖️(限界的賃金収入＋限界的効用増加) =
粗限界費用✖️(利子率-時間経過に要る限界費用の変化分+資本減耗率)*

**純粋投資モデル(効用関数が含まれない)**は、
*日常生活時間✖️限界的賃金収入/粗限界費用=
利子率-時間経過に要る限界費用の変化分+資本減耗率*

*左辺: 限界的純金銭的収益率
*右辺: 資本コスト

![Screen Shot 2020-04-25 at 11.05.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180524/93ea6e82-d273-92ab-2240-af01a32f1859.png)


## 課題点

■医療の不確実性の考慮がない
Arrow(1963年)が指摘

■死亡する時点で$H_{T}=0$とならない
=> 年齢を増すごとに資本減耗率が大きくなるようにする
$$\delta_{t+1} > \delta_t$$

■初期保有資産の水準(貧富の差)の考慮がない



### 参考文献
医療経済学講義　補訂版 橋本英樹・泉田信行
個人wiki 目次

## 背景 
- 作業効率をあげるためにやったほうがいいこと（環境構築、ソースコードの管理方法・可読性の改善方法 etc...）をまとめようと思ったがどうまとめたらいいか分からなかったので、まず目次を作ってみた。


## 理想（エンジニアが素敵な時間をすごすために）
- 1人あたりの作業効率/領域 の 向上/拡大
    - 効率（対象者：全員）
        - 自動化の促進
            - 業務の流れ
                1. 初期設定
                    2. ハードウェア
                    3. ソフトウェア
                2. PJのキャッチアップ
                3. PJ進行
                    4. タスク管理・スケジュール管理
                    5. 業務
                    6. 検証
                    6. 成果物管理
                5. PJ完了・引き継ぎ
                6. 次のPJへ 　→　初期設定へ戻る
            - 改善活動
                - 本記事の執筆
    - 領域（対象者：興味がある人）
        - 上位職のクラスチェンジ
        - 環境構築〜サービスローンチまでのフルスクラッチ
        - 専門分野の深化（新技術のキャッチアップ）
        - 異分野への転職

## 目的達成のための必要条件（各wikiにおいて以下が達成されているか確認する）
- 汎用性を担保している
    - その結果、キャッチアップ時間が短くなる
- 可視性を担保している
    - その結果、集中するべき仕事が明確になる。集中力が無駄にならない。振り返り改善を実行できる。
- 再利用性を担保している
    - その結果、自動化が促進する。
- 残課題
    - 現状の技術・カルチャーでは、解決できないことをまとめる

## 効果検証
-
Vue- methodsとcomputedの違い

## methodsとcomputedの違い
- 値をキャッシュするかどうか

```html:index.html
 <div id="app">
    <button type="button" v-on:click="show=!show">表示／非表示</button>
    <div v-if="show">
      Method: <span v-text="GetDateMethod()"></span>
      <br>
      Computed: <span v-text="GetDateComputed"></span>
  </div>
```

```javascript:main.js
new Vue({
  el: '#app',
  data: {
    show: true
  },
  methods: {
    GetDateMethod: function() {
      return Date.now(); 
    }
  },
  computed: {
    GetDateComputed: function() {
      return Date.now(); 
    }
  }
});
```

-> フラグがtrueになって再描画するたびにメソッドの方は処理が実行されて値が変わる
【macOS: Catalina】初期設定メモ

# はじめに
春先にMacを購入しました。
その時行った初期設定を、個人の備忘録として残しておきます。

# 基本情報
macOS: Catalina
バージョン: 10.15.4
MacBook Air（Retina, 13-inch, 2020）

# Mac初期設定

## アップデート

### OSアップデート
アップルマーク→このMacについて→ソフトウェア・アップデート

### アプリアップデート
アップルマーク→App Store→アップデート→全てアップデート

## システム環境設定

### 壁紙を変更
システム環境設定→デスクトップとスクリーンセーバ→デスクトップ→任意の画像を選択

### Siriの音声を変更
システム環境設定→Siri→Siriの声 で任意の性別を選択

### ログイン時のアイコンを変更
システム環境設定→ユーザとグループ→パスワード→アイコンをクリック（編集）→任意の画像を選択

### キー入力の認識を速くする
システム環境設定→キーボード→キーボード→キーのリピート を一番右（速い）へ
システム環境設定→キーボード→キーボード→リピート入力認識までの時間 を一番右（短い）へ

### 日本語入力できるようにする
システム環境設定→キーボード→入力ソース→日本語 を追加

### キーボードのお節介を無効化
システム環境設定→キーボード→ユーザ辞書→文頭を自動的に大文字にする のチェックを外す
システム環境設定→キーボード→ユーザ辞書→スマート引用符とスマートダッシュを使用 のチェックを外す

### タップでクリックできるようにする
システム環境設定→トラックパッド→ポイントとクリック→タップでクリック にチェック

### マウスカーソルを速くする
システム環境設定→トラックパッド→ポイントとクリック→軌跡の速さ を一番右（速い）へ

### 天気アプリで情報を取得できるようにする
システム環境設定→セキュリティとプライバシー→プライバシー→位置情報サービス→天気 にチェック

### 解像度を変更
システム環境設定→ディスプレイ→ディスプレイ→解像度 で変更にチェック→スペースを拡大 を選択

### バッテリー駆動時、ディスプレイを暗くしないように変更
システム環境設定→省エネルギー→バッテリー→バッテリー電源使用時はディスプレイを少し暗くする のチェックを外す

### 右上に日付を表示
システム環境設定→日付と時刻→時計→日付を表示 にチェック

### コンピュータ名を変更
システム環境設定→共有→コンピュータ名  に任意の名前を入力

## Finder

### サイドバーに任意の項目を全て表示
Finder→左上のFinder→環境設定→サイドバー→サイドバーに表示したい項目に全てチェック

### ファイル名拡張子を表示
Finder→メニューバーの Finder→環境設定→詳細→すべてのファイル名拡張子を表示 にチェック

### タブバーを表示
Finder→メニューバーの 表示→タブバーを表示 をクリック

### パスバーを表示
Finder→メニューバーの 表示→パスバーを表示 をクリック

## ステータスバーを表示
Finder→メニューバーの 表示→ステータスバーを表示 をクリック

## その他

### ライブ変換をオフ
メニューバーのIMEアイコンをクリック→ライブ変換 のチェックを外す

### バッテリーの割合を表示
メニューバーのバッテリーアイコンをクリック→割合（％）を表示 にチェック

### 使わないアプリをDockから削除
アプリで右クリック→Dockから削除をクリック

## アプリインストール
以下アプリを任意でインストール

### [Google Chrome](https://www.google.com/intl/ja_jp/chrome/)
システム環境設定→一般→デフォルトのWebブラウザ→Google Chrome.app を選択

### [iTerm2](https://iterm2.com/)
以下を参考に設定

- [わたしのターミナルはかわいい - Qiita](https://qiita.com/may_u_23/items/097ff5acc690e8045c4f)

### [Alfred](https://www.alfredapp.com/)

# 参考元
[【Mac OS】新しい端末を使い始めるときの個人的初期設定 - Qiita](https://qiita.com/kuronekoieko0305/items/74c5404a0a9471375762)
Vue -データバインディングとは - 

##データバインディングとは...？
- データと対象を結びつけ、データあるいは対象の変更を暗示的にもう一方の変更へ反映すること、それを実現する仕組みのことである
→ 一方を変更するともう一方を自動的に変更することだな。

## Vueの基本的なデータバインディング
### 1/ v-bind

```inde.html
 <div id="app">
    {{ message }}
  </div>
```

```main.js
 new Vue({
  el: '#app',
  data: {
    message: "わーい"
  }
})

> わーい
> VueインスタンスのdataオブジェクトmessageがHTMLに渡って「わーい」が描画
```


![08bad38f-471c-476b-92e6-2ce224a09c41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563702/621c058c-028b-9b3c-f63b-0ad4abee8c0f.png)


### 双方向データバインディング

### 2/ v-model
```index.html
  <div id="app">
    <div>
      <input type="text" v-model="message">
    </div>
  </div>
```

```main.js
new Vue({
  el: '#app',
  data: {
    message: "わーい"
  }
})
```

![6e0750cd-8b3f-4c14-ab5b-9c32deafdcb2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563702/15633687-f1f2-1adb-1838-30085255dd56.png)

=> VueインスタンスのdataオブジェクトmessageがHTMLに渡って「わーい」が描画

先ほどと違いがないように思える

##双方向と単方向データバインディングの違い
###データオブジェクトの値を動的に描画する


```index.html
  <div id="app">
    <div>
      {{ message1 }}
      <input type="text" v-bind:value="message1"></br></br>
      {{ message2 }}
      <input type="text" v-model="message2">
    </div>
  </div>
```

```main.js
new Vue({
  el: '#app',
  data: {
    message1: "わーい",
    message2: "わーい"
  }
})
```


## 双方向データバインディングはデータオブジェクトの変化を動的に描画する

【流れ】
1. Vueインスタンスから渡されたdataオブジェクトをViewで描画
2. Viewで変更されたdataオブジェクトがVueインスタンスの値を更新
3. 更新されたVueインスタンスのdataオブジェクトを再描画


![246fda80-2cbb-4439-97e0-5cdaa300ea96.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563702/1cafb143-e160-56f7-6f95-51ccf92f7861.png)



### `v-model`の別記法
- `v-bind` + `v-on`

```index.html
  <div id="app">
    <div>
      {{ message1 }}
      <input type="text" v-bind:value="message1" v-on:input="message1=$event.target.value"></br></br>
      {{ message2 }}
      <input type="text" v-model="message2">
    </div>
  </div>
```


```main.js
new Vue({
  el: '#app',
  data: {
    message1: "わーい",
    message2: "わーい"
  }
})
```

- -> `v-bind`で単方向データバインディング
- -> `v-on` でVueにデータオブジェクトの変更を伝える
substring、substrメソッドの使い方


## 概要
文字列の一部を指定箇所を切り出す機能としてSubstringメソッドがある。
その他にもcharAtメソッドもある。
指定位置から始める文字列を任意長さを切り出す。

## Javaでの使い方
```java
public String substring(int Index)
public String substring(int startIndex, int endIndex)
```

JavaのsubStringメソッドは上記2点の使い方がある。
使い方は下記のような使い方がある。

```java
String s1 = "Hello World";
// o World
s1.subString(4)
// O World
s1.subString(4, 11);
```

# PHPでの使い方
``` php
string substr (String $string, int $start [,int $length ] )
```
string
入力文字列。最低１文字以上を指定する必要がある。

start
startが正の場合は、返却される文字列はStringの０から数えてstart番目から始まる文字列。
startが負の場合は、返却される文字列はStringの終端から数えてstart番目から始まる文字列。

length
lengthが正である場合は、返却される文字列はstartから数えてlengthの文字数となる。
lengthが負である場合は、stringの終端からその文字列分の文字が省略される。

```php
<?php
$rest = substr("Hello World", -1); // "d" を返す
$rest = substr("v", -2); // "ld" を返す
$rest = substr("Hello World", -3, 1); // "r" を返す
?>
```
### まとめ
筆者はJavaは業務で使っているので、ある程度はわかるが、PHPのsubstrメソッドは初めて知った。
そのため、そちらを詳しく書いた。
技術者と作業者の違い

社会人２年目にSEには技術者と作業者の２種類がいることに気づいた
プログラミングだけできればいいと思ってたところがあって、他の現場でほかの技術を使おうとするとわからない場合が多くて周りの技術的にできる人を観察していると、技術が好きな人が多かった
その頃の自分は技術が好きじゃなくてむしろどちらかと言ったら嫌いなほうだったから興味を持てずにただ言われたことだけを実現しようとする仕事の仕方だった

そこで感覚的に自分は作業者であって技術者ではなく、技術者というのは技術が好きで技術を用いている人のことだと気づいた



他の所でもちらほら技術者と作業者っていう話は聞くので、これは一般的な話なんだと思う



しばらく昔の話なので言語化が難しい