OmniAICreator/Qiita-1.07M huggingface dataset:
docker worker 停止


Localで開発してるときに、Workerを停止したいと思う今日このごろなお年頃

前提

```supervisord.d/worker.conf
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/artisan queue:work --daemon
numprocs=2
などなど...
```
こんな感じで作ってる

####停止

```
/var/www# supervisorctl
cron                               EXITED    Xxx 00 00:00 PM
laravel-worker:laravel-worker_00   RUNNING   pid 00000, uptime 00:00:00
laravel-worker:laravel-worker_01   RUNNING   pid 00000, uptime 00:00:00
php-fpm                            RUNNING   pid 00000, uptime 00:00:00
supervisor> stop laravel-worker:laravel-worker_00 # ← Workerを停止
laravel-worker:laravel-worker_00: stopped
supervisor> stop laravel-worker:laravel-worker_01 # ← Workerを停止
laravel-worker:laravel-worker_01: stopped
supervisor> status # ← ステータスを再取得して確認する
cron                               EXITED    Xxx 00 00:00 PM
laravel-worker:laravel-worker_00   STOPPED   Xxx 00 00:00 PM # 停止しているのを確認
laravel-worker:laravel-worker_01   STOPPED   Xxx 00 00:00 PM # 停止しているのを確認
php-fpm                            RUNNING   pid 00000, uptime 0:00:00
supervisor> exit  # 抜ける
```


####再起動

```
/var/www# supervisorctl restart all
laravel-worker:laravel-worker_00: stopped
laravel-worker:laravel-worker_01: stopped
php-fpm: stopped
cron: started
laravel-worker:laravel-worker_00: started
laravel-worker:laravel-worker_01: started
php-fpm: started
```
敬老の日と秋分の日が重なることはあるのか？

# ２０２１年９月
2021年９月は、20日が敬老の日、23日が秋分の日で休みがいっぱいありましたね。
敬老の日が月曜、と秋分の日水曜になったときに、シルバーウィークになるのはありましたが、

ふと、両者が重なることはあるのか？と思って調べてみたら、あるそうです。
http://deztec.jp/x/10/faireal/d60916.xml

```
2876年 9月21日 23時20分51秒1 = 月曜日
```

ただ、なんでこうなるかが分からん。。
というか、私の計算と合わない。

# 計算根拠
>回帰年は、最近の値では、平均して、 約365.24219日

これはこうなんだろう。
つまり、1年は365日と0.24219日(=約5時間49分)長いので、ある年の秋分の日が9/23 0時きっかりだったとすると、翌年は9/23 5:49ということになる。

```
蛇足ですが
　2年後は、9/23 11:38、3年後は9/23 17:27、4年後は9/23 23:16
　4年たつと、大体1日になるので、これを補正するために閏年が入る。
　ただし、44分多く戻しているので、100年間で18時間戻しすぎている。
　　44分*25回(100年の閏年回数)＝1100分=(18時間)
　そのため、100で割り切れる年は閏年では無いようにして、戻しすぎをプラスに変えている。
　それでも100年間で6時間長くなっている(24-18 = 6)ので、400年に1回は閏年としている。
　これが、閏年定義の考え方で、各国が採用しているグレゴリオ暦。
```

# 私の計算
1980年の秋分の日は、9月23.2488日だったそうです。
これに毎年、0.24219を足して、閏年の日は1日引く。
という計算を繰り返すと、未来の秋分の日が計算できるはず。
こうして計算すると、私の計算だと秋分の日が第3月曜日(21日)になるのは、4076年になった。

### 1980年からの秋分の日
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441104/ca7109f7-d049-ff84-f6ed-fac8b320ab63.png)

### ９月２１日になるとき
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441104/c93dc7f6-b40d-b5bc-6c9a-5c0085db2640.png)

### ９月２１日かつ月曜日
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441104/9737ca10-a1dd-96b8-1363-bac8d81d8a81.png)


## 重複
なお、祝日が重複したときどうするかは決まっていないそうです。
1日しか無いってなったら嫌だなー。。

### 最後に
最後に今回は、1980年の秋分の日は、9月23.2488日だったそうです。を基準に計算しましたが、実際の秋分の日計算は、前年の秋分日がいつだったかを観測した結果から計算しているそうで、今回の計算結果とは異なる可能性があります。
Windowsでgit commit時にCan't find a default Python.

Windowsで`git commit`時に`Can't find a default Python.`とのエラーが表示された
コマンドプロンプトで`py --version`すると同じメッセージ

コントロールパネルからpythonとかpython launcherとかを一旦アンインストールしてから
https://pythonlinks.python.jp/ja/index.html のインストーラで再インストールしたら治った
Gtk3アプリ GtkMenuを利用する

###GtkMenuを利用する

####GtkMenu設置例
<img width="500" alt="Screenshot from 2021-09-29 15-12-01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/c2db3dde-8e27-f5ef-bace-6cfe5c667be6.png">
######コンテナーからGtkMenuBarを設置する
<img width="500" alt="Screenshot from 2021-09-29 15-10-27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/86e7aca1-60c0-8be3-a505-0c189a30c687.png">
#####パッキングで位置を指定する
0を指定します。高さは共通から設定します。
<img width="350" alt="Screenshot from 2021-09-29 15-11-35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/5bc44223-2135-a970-f21c-c166a5ec8724.png">
#####MenuItemにイベントを追加する
ファイルにイベントを追加してみます。
<img width="500" alt="Screenshot from 2021-09-29 15-19-13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/079a060f-51d6-01e9-ac24-6c6b60fe6d8d.png">
activateにイベントを追加する。selectは選択した状態で反応します。
<img width="500" alt="Screenshot from 2021-09-29 15-11-03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/ece33f79-d263-8989-f016-093f00f950f4.png">
C#側にもコールバック関数を書きます。

```cs
private void on_newBtn_activate(object sender , EventArgs e){
	Console.WriteLine(" on_newBtn_activate ");
}
```
#####MenuItemの追加と削除

MenuItemの追加削除は右クリックのメニューから行います。
Gladeのメニューの中に項目がないため、右クリックのメニューのコピーを選択。削除する場合は削除を押す。
<img width="300" alt="Screenshot from 2021-09-29 15-10-38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/b1acc9c8-4b50-2937-5b5f-e39d65e94912.png">

https://qiita.com/iota_11/items/3318fa527065d4c73a3f

[Gtk3アプリ イベントハンドラー自動生成ツール GUI版](https://qiita.com/iota_11/items/4e4d77e91ca3e2223cfe)へ続く
herokuデプロイ（自分用メモ）

<h1>githubにコードを載せて、herokuでデプロイする方法</h1>
<code>git init
git add -A
git commit -m "コメント"</code>

githubでリポジトリを作る。
<code>git remote add origin (githubに乗ってるurlを貼る)</code>
<code>git push origin master</code>

<code>heroku login
heroku create
git push heroku master</code>

アプリ名を変える
<code>heroku rename （アプリ名）</code>
【Laravel6】モデルをModelsディレクトリに移動する際の修正箇所

デフォルトではartisanコマンドでモデルを作ると、appディレクトリに作成される。
モデルをapp/Modelsディレクトリ配下にまとめる際に修正する箇所について。

バージョン：Laravel 6.20.32

## 修正箇所

1. composer.json
1. モデルに記載のnamespaceを変更
1. コントローラ（ファクトリ、シーダ）に記載のモデルのディレクトリを変更
1. auth.phpに記載のモデルのディレクトリを変更


### 1. composer.json
"autoload"部分にModelsディレクトリを追記（```"Models\\": "app/Models/"```）

```
"autoload": {
    "psr-4": {
        "App\\": "app/",
        "Models\\": "app/Models/"
    },
    "classmap": [
        "database/seeds",
        "database/factories"
    ]
},
```

### 2. モデルに記載の、namespaceを変更

```
namespace App;
```

を下記のように変更。

```
namespace App\Models;
```

### 3. コントローラ（ファクトリ、シーダ）に記載の、モデルのディレクトリを変更

```
use App\モデル名;
```

を下記のように変更。（ファクトリを作成している場合、同様に修正。）

```
use App\Models\モデル名;
```

シーダを作成している場合、下記修正例。

```
public function run()
{
    factory(App\Models\モデル名::class, 1)->create();
}
```

### 4. auth.phpに記載のモデルのディレクトリを変更
認証機能を実装している場合は、config/auth.phpのUser Providersの'model'部分の修正が必要。

```
'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],

    // 'users' => [
    //     'driver' => 'database',
    //     'table' => 'users',
    // ],
],
```

を下記のように修正。

```
'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\Models\User::class,
    ],

    // 'users' => [
    //     'driver' => 'database',
    //     'table' => 'users',
    // ],
],
```
【入門】ElasticSearch


＊この記事は2021年9月24日(金)に社内で行った[Another works LT会](https://www.youtube.com/watch?v=GnYf-fRhIR0?t=5360)のスライドを元に作成しています。

[![thumbnail](https://image.slidesharecdn.com/elasticsearch-210929044552/95/slide-1-1024.jpg)](https://www.slideshare.net/ssuser690f84/elasticsearch-250326077)


弊社サービス複業クラウドでは全文検索エンジンとして、ElastciSearchを導入しています。
自分はこの知見が乏しかったので今回記事に纏めました！

### ElasticSearchとは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943494/e2f7fdf6-1483-d3c6-249c-dc1d3196568d.png)
複数のデータベースを横断して検索、なおかつ柔軟な検索をすることが可能になる。

### RDBとの比較
例えば、文章の中で`カツオはサザエの弟`といった文があったときにRDBで検索することを考えてみます。
検索は以下のSQLで前方一致、後方一致で行います。

```sql
SELECT text FROM テーブル名 WHERE text LIKE '%検索文字列%'
```

すると以下のように本来ヒットさせたくない'カツ'はヒットする。
ヒットさせたい'鰹'はヒットされないといった事案が発生して、検索柔軟性に欠けてしまいます。

■検索文字列
かつお　→　ヒットする
サザエ　→　ヒットする
カツ　　→　ヒットする(ヒットさせたくない
鰹　　　→　ヒットしない(ヒットさせたい)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943494/d5694afa-0aa2-16ac-171b-450cb3001502.png)

そのためElasticSearchでは柔軟な検索を可能にするために文章を意味のある単語に分割してドキュメント(RDBでいうレコード)に保存させます。
ただ、意味のある単語に分割することは日本語の場合難しいです。
英語の場合は半角スペースなどである程度区切られていますが。

そこで出てくるのが`形態素解析`や`N-gram`です。

### 形態素解析

自然言語で書かれた単語を予め登録された辞書で分割して、品詞などを割り出す方法。
ex)kuromoji、sudachi

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943494/d74380fd-0145-7f8b-b92d-ffe4b7942f5c.png)


### Ngram
N(1以上の数字)文字ずつ文章で区切る方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943494/aa03ad68-1f25-21b1-d0c9-2568a06e9059.png)


### 検索精度を上げていくには

検索ノイズが少なく、検索漏れが多い`形態素解析`と`検索ノイズ`が少なく検索漏れが少ない`Ngram`を組み合わせてドキュメントに登録する。
又は単純に`形態素解析`の辞書の精度を高める方法が考えられるかなと思います。

弊社では後者の方法でで検索精度を高めて行きたいと考えています！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943494/bbd8fa2a-3821-fa98-fdcd-60712f6c5939.png)

## Another worksでは一緒に働ける仲間を探しています

https://www.wantedly.com/projects/729427

https://www.wantedly.com/projects/617507

https://www.wantedly.com/projects/683778

https://www.wantedly.com/projects/691559
【AWS】EC2,RockyLinux8の初期ユーザ名

# AWS EC2で作成したRockyLinux8インスタンスへの初回SSH方法

インスタンス作成したはいいもののユーザ名が分からなかったのでメモ

## rockyユーザが作成されているのでそれでSSHする

結論から書くと rocky ユーザでログインできる

```
$ ssh -i aws-ssh-key.pem rocky@54.xxx.xxx.xxx
The authenticity of host '54.xxx.xxx.xxx (54.xxx.xxx.xxx)' can't be established.
ECDSA key fingerprint is SHA256:
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '54.95.165.106' (ECDSA) to the list of known hosts.
Activate the web console with: systemctl enable --now cockpit.socket

Last login: Wed Sep 29 05:01:56 2021 from 35.213.38.0
[rocky@ip-192-168-2-106 ~]$ 
```

## 試行錯誤

最初、とりあえずec2-user とか root を試した

```
$ ssh -i imade-aws-key.pem 54.xxx.xxx.xxx
user名@54.xxx.xxx.xxx: Permission denied
  →permissiondenyされる

$ ssh -i imade-aws-key.pem ec2-user@54.xxx.xxx.xxx
ec2-user@54.xxx.xxx.xxx: Permission denied
  →permissiondenyされる

$ ssh -i imade-aws-key.pem root@54.xxx.xxx.xxx
Please login as the user "rocky" rather than the user "root".
  →固まった後、勝手にログアウトされる
```
rootでログインしようとしたときに`rockyでログインしてね！`っていうメッセージがでたのでわかった
[Vue3] Vue-CLIでQuasarを使ってみた 第1章 導入と実装

プログラミング初心者の備忘録です。

# Vue3で作成したWebサイトにUIフレームワークを導入したい
現状

- 機能面を作ろうと思い、Vue.jsでJavaScriptをゴリゴリ書きながらFirebaseとの連携を作った
- ある程度の機能が完成したので、乱雑に並べた出力を整形したい
- UIフレームワークを導入しよう

UIフレームワークと大層な事を言っていますが、CSSを書くの面倒だし既存のパーツを外から取ってきたい程度のノリです。

# UIフレームワーク選定をするにあたって

何も考えずにVue.jsで書いて、後からUIフレームワークを選定するという行き当たりばったりです。
でもプログラミング初心者だから分からんかったんや許して…。

機能要件は、

- Vue.jsの既存プロジェクトに導入が容易
- パーツを並べるだけでよく、整形や配色を任せたい
- Webサイト、モバイルアプリ双方で扱える

の3点です。

フレームワーク候補は、

- Nuxt.js
- Vuetify3
- Quasar Framework

の3つです。
Nuxt.jsはVue.js関連の統合フレームワーク(?)のようで、Vuexとか盛ってるようです。
既に機能面を作っていて、新しいプラグインを導入されると困りそうなのでやめました。
VuetifyはVue3対応版のVuetify3が2021年9月29日現在まだリリースされていないので却下しました。（10月完成が翌年2月に延期になりました。）

という事で残ったQuasar Frameworkにしました。
調べていくと、Quasar FrameworkはElectronアプリを作成するのに向いているらしく、Webサイトとモバイルアプリ双方にリリースを予定するのにいいみたいです。
ですが、Quasar CLIでプロジェクトを初期化するのが推奨されていて、Vue CLIからプラグインとして導入すると制限的な機能になるらしいです。

まあよくわからんけどQuasar Frameworkにしました！よくわからんし！

# Vue-CLIでQuasar Frameworkを導入
Vue-CLIのバージョンが古い場合はアップデートしましょう的な事が公式に書いてあります。
[公式ドキュメント](https://quasar.dev/start/vue-cli-plugin)

```console
$ vue add quasar
```

そうすると初期化が始まります。

```
✔  Successfully installed plugin: vue-cli-plugin-quasar

? Allow Quasar to replace App.vue, About.vue, Home.vue and (if
 available) router.js? Yes
? Pick your favorite CSS preprocessor: Sass
? Choose Quasar Icon Set Material
? Default Quasar language pack - one from https://github.com/q
uasarframework/quasar/tree/dev/ui/lang en-US
? Use RTL support? Yes
? Select features: Roboto font, Material
```
各設定は以上のようにしました。
```Icon Set```はホームボタンやグラフボタン等、アイコン群をまとめたライブラリのようです。
Material Iconが推奨だと書いてあったので、とりあえずMaterialにしました。
一風変わったアイコンを使用したい場合は、[公式ドキュメントに対応しているIcon Setへのリンクがあるので見てみてください。](https://quasar.dev/options/quasar-icon-sets)

# Quasar Frameworkをどう使えばよいか

「導入は終わったものの、ここからどう使えばいいの？」
僕はこのために1時間以上悩んだんですが、ある程度分かったので流れを書いておきます。

1. 入れたいHTMLタグを[Quasar API Explorer](https://quasar.dev/api-explorer)で検索
2. 入れたいタグと似たようなタグが出てきたら、Docsのリンクを踏んでそのタグのドキュメントに飛ぶ
3. ページの下のほうにUsageがあるので、その実例から自分が実装したいものを探す
4. 見つかったら、View Source(```<>```)ボタンを押してソースコードを引っ張ってくる or Edit in CodepenボタンからCSS実装結果を直に見ながら編集する
5. 自分のサイトに貼り付ける

という手順みたいです。 
Vue.jsの```<router-link>```や```<router-view>```等も探せば```QRouteTab```等で出てくるようです。

# これからQuasar + Vue3 で開発する方のためになれば
僕はこれからQuasarでゴリゴリ整形していくので、また何かあれば第2章に書きたいと思います。
それでは。
asp.net coreでサービス作ったから宣伝兼ねて技術公開する -終わり-

本日をもって、サービスを終了いたしました。

https://app.zero-one-system.co.jp/TanaToru/

また、サービス開発時には、Qiitaに書きます。
少数でしたが、アクセスしていただいた方、ありがとうございました。
graphviz でシンプルな分類木を描く

#はじめに
根拠の説明しやすさ，理解のしやすさと言った観点から，決定木は意思決定に当たって便利な手法の１つです．こういった中で，生成した分類基準を図として表す場合に，余計な情報が不要な場合があると思います．今回は，各種情報を除くシンプルな決定木のことを分類木と呼び，生成する手法についてまとめます．

#やりたいこと
情報を減らして分類木を描画する．

#例題
アヤメのデータセットに対して，深さが３のシンプルな分類木を描画する場合，以下のようになると思います．（プログラム割愛）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/511606/51d17b82-1c1b-5170-1d48-887c00805bbf.png)

今回は，gini不純度や全データ数，各データ数などを除いた，シンプルな分類木の作成を目指します．

# スクリプト
sklearn の tree.export_graphviz 関数で得たデータに変更を加えることで決定木の形式を変更します．

```python
#! env python
# -*- coding: utf-8 -*-

import graphviz
from sklearn.datasets import load_iris
from sklearn import tree

def remove_gini_to_value(str, n):
    for _ in range(n):
        start, end = str.find('gini = '), str.find('class = ', str.find('gini = '))
        rm_str = str[start:end]
        str = str.replace(rm_str, '')
    return str

if __name__ == '__main__':
    iris = load_iris()
    # 決定木の作成
    clf = tree.DecisionTreeClassifier(max_depth=3)
    clf = clf.fit(iris.data, iris.target)
    # 決定木の描画
    data = tree.export_graphviz(clf, feature_names=iris.feature_names,
                            class_names=iris.target_names,impurity=True,
                            filled=False, rounded=True)
    # gini不純度，合計データ数，各データ数を削除
    data = remove_gini_to_value(data, clf.tree_.node_count)
    graph = graphviz.Source(data)
    display(graph)
    graph.render('tree',format='png')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/511606/29cb9fd2-fcd5-c708-3be3-8c3289d0d568.png)

#参考
決定木の作成と可視化に当たって参考になったサイトをまとめておきます．
DecisionTreeClassifier関数の中身，パラメータ説明など
https://github.com/scikit-learn/scikit-learn/blob/2beed55847ee70d363bdbfe14ee4401438fba057/sklearn/tree/_classes.py#L612
export_graphviz関数の説明
https://github.com/scikit-learn/scikit-learn/blob/2beed5584/sklearn/tree/_export.py#L665
決定木の内部要素抽出
https://scikit-learn.org/stable/auto_examples/tree/plot_unveil_tree_structure.html
prometheus/exporter-toolkit を使って自作exporterを簡単にTLS対応させる方法

Prometheusはpull型のメトリクス収集を特徴としており、メトリクスを公開するプログラム（Exporter）がWebサーバとして振る舞います。

ExporterはHTTPのことが多いですが、センシティブなメトリクスを収集する場合などは、その内容を盗み見されないようにTLS対応が必要ということもあります。

Expoterの前段にリバースプロキシを設置してTLS対応するという方法もありますが、Exporter自身がTLS通信できれば、そっちの方が嬉しい場合も多いです。

Prometheusの公式のExporterは多くがTLS対応しています。

https://prometheus.io/docs/instrumenting/exporters/

- https://github.com/prometheus/consul_exporter
- https://github.com/prometheus/memcached_exporter
- https://github.com/prometheus/mysqld_exporter
- https://github.com/prometheus/node_exporter
- https://github.com/prometheus/haproxy_exporter
- https://github.com/prometheus/collectd_exporter
- https://github.com/prometheus/blackbox_exporter

READMEを見ると、どうもこれは同じライブラリを利用しているようです。

> To use TLS and/or basic authentication, you need to pass a configuration file using the --web.config.file parameter. The format of the file is described in the exporter-toolkit repository.

同じ仕組みでTLS対応していると、同じ設定ファイルが使えるし、車輪の再発明を防げるので良さそうと感じ、もう少し深堀りして調べることにしました。

# exporter-toolkit

言及されているライブラリはこれです。

https://github.com/prometheus/exporter-toolkit

> This repository is currently WIP and experimental.

まだ作業中ということで、利用には注意が必要そうです・・・

https://pkg.go.dev/github.com/prometheus/exporter-toolkit

このライブラリは今のところwebというパッケージを提供しているだけのようです。

中を見てみると・・

- kingpinというコマンドライン引数処理のライブラリを使うための便利関数が用意されている
- `http.Server.ListenAndServe` を置き換える関数が用意されており、これだけでTLS対応ができる
  - ただし引数が違う `func ListenAndServe(server *http.Server, tlsConfigPath string, logger log.Logger) error`


対応時のdiffを見ると簡単さが伝わると思います↓

https://github.com/prometheus/mysqld_exporter/pull/522/files#diff-d7a0fbdd3c713c73ff720da8c35b95b0365c48ef0ab0c3f756215ce51be77da1L301

# loggerの互換性

3つ目の引数のLoggerが少し曲者です。

exporter-toolkitが利用しているのは go-kit/log のLogger。
このLoggerがすぐに用意できるならexporter-toolkitは簡単に利用できます。

※goのlogger無茶苦茶種類があるな・・ （ https://github.com/avelino/awesome-go#logging ）

# go-kitとは？

http://gokit.io/

マイクロサービスのためのツールキットと書かれている。

- https://pkg.go.dev/github.com/go-kit/kit
  - auth, circuitbreaker, endpoint, metrics. ratelimit, sd, tracing, transport, util などのパッケージがある。
  - logもその一つだが、リポジトリが分かれています。

prometheusの公式exporterはgo-kit/logを使うポリシーのようです。
（さらに調べるとpromlogというライブラリでgo-kit/logを簡単に使えるようにしています。 https://pkg.go.dev/github.com/prometheus/common/promlog)


# どうなん？

たまたま手元にあったexporterはLoggerがgo-kitのものではありませんでした。これを気にgo-kitに描き直すか、うまく共存させる必要がありそうです。

どうなん？ と思って少し調べているとこのような記事を発見しました。

https://www.kaoriya.net/blog/2018/12/16/

> 既存のロギングライブラリは絶対にNG
> ライブラリを書く際に既存のロギングライブラリを使うのは絶対にやめましょう。 あなたのライブラリのユーザーはあなたが提供する機能を使いたいのであって、 あなたが使いたいロギングライブラリを使いたいわけではないのです。

ですね・・

# わかったこと

- 独自のexpoterをTLS対応するにはexpoter_toolkitを使うのが良さそう
- ロギングライブラリはgo-kit/log （またはpromlog）にするのが良い
- exporter_toolkitはExperimentalなので動向に注意
[初投稿]AWS上でブログサービスを構築する 

##はじめに
　この記事はAWS初学者を導く体系的な動画学習サービス「AWS CloudTech」の課題カリキュラムで作成しました。
　https://aws-cloud-tech.com

##概要
　AWS主要サービスとして以下を学習、おさらいとしてハンズオンをこなす形で身体に染み込ませています。
　・AWS講座
　・VPC講座
　・EC2講座
　・IAM講座
　・RDS講座
　ハンズオン1（基本的なブログサービスを構築する（シングル構成））
　　・AWS上にVPCを作成、中にPublicSubnetを2つ、PrivateSubnetを2つ。
　　・PublicSubnet1にEC2を設置、それにWordPressをインストールさせブログサイトを立ち上げる。
　　・EC2はインターネット側からアクセスさせるので、VPCにInternetGatewayを設置。
　　・WordPress用のDB(MySQL)はインターネット側からアクセスさせないので、PrivateSubnetに設置。
　　・DBへのアクセスはセキュリティグループで絞っている。
![課題1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115027/4d3be87e-faec-cfa5-c845-1a25e06898e8.png)

※カッコ内の文字列は設定値です（後で振り返るときに無いと困りそうで💦）
図を描くことで投入した設定値も反映できますし、後で見たい時に引っ張り出せるので必要と感じています。
そのうち、図を見て環境構築できるようになれればと思っていますので、細かいですが色々と書くのもありかなと。

###操作環境
　Windows10 21H1 + TeraTerm

###画像作成
　Visual Studio Code + Draw.io

###やりながら書き留めたことなど
・EC2がインターネットに出るためにはInternet Gateway、デフォルトルートが必要
・RDSはサブネットが2つ以上必要、なので先にサブネットの追加が必要
・セキュリティグループのRDS-SG-1のインバウンドルールは肝ですね、ここをWebServerのみアクセスとすること。
だがしかし！エラー表示！
**You may not specify a referenced group id for an existing IPv4 CIDR rule.**
*(既存のIPv4CIDRルールの参照グループIDを指定することはできません。)*
一度、デフォルト設定を削除、新規作成することで事なきを得ました。
・Wordpressインストール、コマンド操作などは問題なし
・ブラウザからパブリックIPを叩いてWordpress初期設定画面表示！！（ヤッホー）
![Welcome-WordPress.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115027/bff608f5-be89-a221-b0db-5700d5137201.png)

##結果
説明通りに進めて、AWSブログが稼働しました！
![Hello_world!.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115027/08b37b5b-3b2d-d08d-8a58-2f14809a98a1.png)

##所感
動画を見ては止めを繰り返しながら、課題の目的であるブログサービスを構築できました。
動画による解説はわかり易いし具体的なので、初めての経験でしたが何とかゴールすることができました。
多分ですが、今まで通り例題が載っている専門書を買っていたら、途中で投げ出していたと思います💦

#####最後に
ここで喜んでいると構築した環境が課金されますので、くろかわさんが言ってる通り設定したオブジェクトは削除します。
次のハンズオンがあるので環境保存しておきたいところですが、また1から構築するのも学びのためには必要ですね。

以上です。
iOS15 ATT(App Tracking Transparency)が表示されない問題

#Appleさんより、リジェクトでこのようなメッセージが届きました。
```text:Appleさん
We're looking forward to completing our review, 
but we need more information to continue. 
Your app uses the AppTrackingTransparency framework,
 but we are unable to locate the 
App Tracking Transparency permission request when reviewed on iOS 15.0.
```
要するにATTが表示されないということですね。

自分のiPhoneとテスト用iPhoneをまだアップデートしていなかったので
Xcode13にてiOS15のエミュレーターで確認しましたが...

ちゃんとアラートが出ました:thinking:

Appleのスタッフにスクショ付きで伝えましたが
やっぱり表示されないようで、実機でやってほしいとのこと。

しかし実機をアップデートしたところ...なんと表示されました:thinking:
それでもAppleの端末では表示されないのだろうと思ったので、調べましたところ...

やっとたどりついたのが下のリンクたちです:cracker:

しかし、これは...

:::note warn
アラートの表示を1秒遅らせるという簡易的な方法
:::

なので...そんなにいい方法ではないかもしれません。
でも、とりあえずこれで審査は通りました。

https://developer.apple.com/documentation/apptrackingtransparency/attrackingmanager/3547037-requesttrackingauthorization

こちらにも書いてある通り、これからはもうちょっと表示するタイミングを考えなければいけないようです:thinking:...


```swift:ViewController
  if #available(iOS 15, *) {
            //ここで1秒だけ遅らせる
         DispatchQueue.main.asyncAfter(deadline: .now() + 1.0){
             ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
                    switch status {
                    case .authorized:
                        print("OK")
                    case .denied, .restricted, .notDetermined:
                        print("だめでした。")
                    @unknown default:
                        fatalError()
                    }
                })
                
             }
        } else if #available(iOS 14, *) {
            ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
                switch status {
                    case .authorized:
                        print("OK")
                    case .denied, .restricted, .notDetermined:
                        print("だめでした。")
                @unknown default:
                    fatalError()
                }
            })
        }

```

#参考リンク

https://developer.apple.com/forums/thread/690607

https://www.reddit.com/r/iOSProgramming/comments/pt41jz/att_prompt_not_showing_on_ios_15/

https://qiita.com/shindyu/items/10f5ee8d92eea9f80be4

https://qiita.com/marijuana/items/091f3fc31ec7e7e3bb63
Docker 

メモとして

###Dockerとは
Dockerは、Linuxのコンテナ技術を使ったもので、よく仮想マシンと比較されます。VirtualBoxなどの仮想マシンでは、ホストマシン上でハイパーバイザを利用しゲストOSを動かし、その上でミドルウェアなどを動かします。それに対し、コンテナはホストマシンのカーネルを利用し、プロセスやユーザなどを隔離することで、あたかも別のマシンが動いているかのように動かすことができます。そのため、軽量で高速に起動、停止などが可能。

###Dockerのメリット
####開発ライフサイクルの改善に強い
　Dockerを使用すると、開発者はコンテナを利用して標準化された環境で作業できるようになります。その結果、開発ライフサイクルが改善され、CI/CD（継続的インテグレーション／継続的デリバリー）につながります。

####開発環境が簡単に用意でき、かつ本番環境と共通化できる
　Dockerは「Docker Registry」「Docker Export／Import」という機能を有しています。これは、コンテナの元となるDockerイメージ（後述）を異なるホスト間で共有する機能です。例えばチームで開発をする際、開発用マシンで作成したDockerイメージを他のメンバーのマシンに簡単にコピーできます。これにより、アプリケーションの移植性や相互運用性を高めることができます。

####アプリケーション実行環境を高速にデプロイできる
　コンテナは、Dockerを実行するホスト上で他のアプリケーションと同じプロセス単位で管理されます。そのためコンテナでは、ハイパーバイザー型の仮想マシンでいうところのOSのブート処理が不要です。より少ないリソースでより多くのことができるため、アプリケーションの実行環境を高速にデプロイすることが可能になります。

###参考サイト
https://docs.docker.jp/about.html

https://atmarkit.itmedia.co.jp/ait/articles/2108/23/news022.html

https://knowledge.sakura.ad.jp/13265/

https://tech.nri-net.com/entry/using_docker_containers_with_vscode
Pythonでif条件の中で変数への代入も行いたい

この記事では Python3.8 以降の機能である__代入式__を使っています。

# 問題のコード
ある変数の値がNoneでなければ、処理を行いたいケースがよくあるとおもいます。
代入式を用いないで書くと、一度(*1)if文の外で変数を宣言し、(*2)if文の条件に利用し、(*3)if文内の処理に利用する、というコードになります。
if文の中で使いたいのにif文の外で一度変数に格納してから使うというのが、冗長な感じがします。

```py
user = {'name': 'Taro', 'gender': '1'}
name = user.get('name') # ...(*1)
if name: # ...(*2)
    print(name) # ...(*3)
```


# 代入式 x := y を用いる
そんなときは代入式を用いましょう。
プログラミングではざっくり、文⇒返り値無し、式⇒返り値有りと考えられます。
`x := y` の代入式では、代入した値が返ってきます。

```py
user = {'name': 'Taro', 'gender': '1'}
if name := user.get('name'):
    print(name)
```

# 参考
代入式について詳しく知りたい場合、以下のQiita記事が丁寧で分かりやすいので参考にしてください！
https://qiita.com/ksato9700/items/d37efc6982365e24f6af
Swiftでコラッツ数列

``` Swift

func col(n: Int) -> [Int] {
    if n == 1 {
        return [n]
    }else if n%2 == 0 {
        return [n]+col(n: n/2)
    }else{
        return [n]+col(n: 3*n+1)
    }
}
print(col(n:27))

```
Salesforceでファイルを簡単にアクセスできる！「Image Uploader」を試してみた

Salesforceには便利な標準機能がありますが、拡張機能を使えばより便利なことが可能です。

今回は無料で使えるAppExchange「Image　Uploader」を試してみました。
https://appexchange.salesforce.com/appxListingDetail?listingId=a0N3u00000MRwSJEA1

「Image　Uploader」を使用すれば、効率よくSalesforce内のファイルにアクセスが可能です

![イメージ１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f388c6bf-4aa3-f709-bafe-b38b992b51bd.png)



それでは、「Image　Uploader」の使い方や設定方法をまとめます！


※注意※
AppExchangeを実際に本番環境でインストールする前にSandboxや1Playground環境で動作確認することをおすすめします。


##設定してみよう

インストールした後にファイル添付したいオブジェクトのレコードページを開いてください。
そして右上の歯車マークをクリックし「編集ページ」をクリックしてください

![編集ページ１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/fb06dd54-b7fc-fda1-2c4f-59bcd8afeed2.png)

その後「カスタムー管理」から「Image Unploader」コンポーネントを探してドラッグ&ドロップをしてページに挿入します
![編集ページ２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/09e15ce3-330c-9c6b-26e8-f0c33efe7942.png)

このLightningページを保存&有効化　すれば設定は完了です。

ファイルのサムネイルが大きく表示されるのでファイルが見やすくなります。
また、ファイルをいくつかの検索条件にソートをかけることができるので探しやすくなります。

また、チェックボックス「Hide File Uploads」にチェックを入れると
「ファイルをアップロード」のボタンがなくなるなど、ある程度設定が変更できることが分かりました
![アップロードなくす.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/2d580bdb-09c7-d2f2-3d02-63523688eb2f.png)

いかがでしょうか。
「Image　Uploader」を使えばレコードページに紐づくファイルの検索が容易になり、最終更新日などで昇順、降順の絞り込みも可能です。
![ソート可能.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/d0411c7c-9940-89e6-ee56-10291db336c0.png)

せひSalesforceを使いこなすためにご活用ください！
「一度行った処理をなかったことにする機能」を実装する際の参考メモ書き

##結論
####どのように運用される「なかったことにする機能」なのかが大事
・**いつ**
・**誰が**
・**なにがどんな状態**のとき、
・**どうなかったことにする**のか。
・なかったことにする機能を**使う為の条件**はどうするのか。
・なかったことにする**元の処理にはどんなパターン**があり、
　それに対して、なかったことにする機能は**どう対応しているのが望ましい**か


上記を漏れなく考慮できていることが、実装時に必要。
考慮できていないと、実運用において、役に立たないor使い勝手の悪い機能になってしまう。

特に**条件**は、
「このパターンだと**ボタンが表示されない**よー！
　このパターンだと**いじって欲しくないデータまで手が入っちゃう**よー！！
　とほほ～！！！」
ということにも繋がるので、

**どういった運用をゴールにする**のか、
をきちんと詰めて(場合によっては使う人たちの意見も取り入れて)から実装し始めると、
スムーズに実装を終えられる。


……ような気がします！！
【個人開発】「お好み焼きをひっくり返すだけのアプリ」を作ってみた

# はじめに
現在はスワイプのみの操作になっていますが、PCでもできるように近日中に修正予定です。(2021/9/30現在)

作り直しました。URLは変えていないですが、現在こちらが運用されています。↓

https://qiita.com/cabacho/items/e11ebc7472869b166af5

コロナになってから、外でお好み焼きを食べてないなぁと思い、気持ちだけでもお好み焼きを食べに行った気持ちになれるようにお好み焼きをひっくり返すアプリを作りました。

今回も名前の通りお好み焼きをひっくり返すだけのアプリです。今回は約2日で作成しました。

https://zen-sinoussi-c18c33.netlify.app/

# **構造**
HTML、CSS、JavaScriptのみのお手軽実装。UIフレームワークとしてはbootstrapを使ってます。

# **作ってみての感想**

初めてスワイプで動かす機能を使ったので、なかなか手こずりました。
さんまを焼くだけのアプリ同様、simple is bestにしました。
ひっくり返す時の動きが一番手間取り、どういうanimationにしたらひっくり返し感が出るか試行錯誤しました。
また成功したときに表示されるgifアニメーションを作り、取り入れました。

絵は手書きで作成し、ipadのアプリのibisPaint Xを使いました。
レイヤー機能を使って鉄板やお好み焼きの絵を作成し、透過pngで保存して、それを微調整する形で使いました。

# **おわりに**
暇な時間のお供に是非。

↓さんまアプリを焼くだけのアプリも暇な時間のお供に是非。

https://gifted-curran-aecac2.netlify.app/
NuGetのパッケージの復元エラーの回避方法

github から落としてきたサンプルソースをビルドしようとしたらエラーになった。
それを解決するのにずいぶんかかったので備忘録として残す。

# 落としてきたものをビルドしたらエラー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115525/a8f36c27-f6c2-08e0-c819-06303f015714.png)
※この時のエラーメッセージがなんでCドライブの下にあるなしのメッセージになっているのかは気になってはいた。

## MSのドキュメント通りにパッケージの復元を行うが、解決しない
パッケージも自動ダウンロードになっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115525/6884851d-c7db-b561-7007-88a4108307ab.png)

# 原因：オンラインに接続して取得してくる設定になっていない。
[ツール] - [NuGetパッケージマネージャ] - [ソリューションの NuGetパッケージの管理] を開くと パッケージソースが offline になっている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115525/802b40a2-3e52-32be-7982-c6fe2d7ce8de.png)

# 解決方法
横の設定（歯車マーク）をクリックするとパッケージソースを選択するウインドウが開くので、「＋」マークをクリックする。
するとパッケージソースが追加される。
名前：任意でつける
ソース：NuGetのurlを指定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115525/bb5650c7-5cc4-2b92-0542-b699c8ddcfac.png)

これでビルド成功。

久しぶりにVisual Studio使ったから戸惑ったし、手間取った。
【Unity】MeshをAssetBundleビルドすると付加情報が削られてしまう件


# 事象
Unityで **頂点アルファが付加されたMeshをAssetBundlleビルドしてロードすると頂点アルファが消えている** ，という現象が起こることがあります．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170854/5f26178f-5e4c-76b4-db6b-1960e6ac1e49.png)



# 原因
PlayerSettingsの `Optimize Mesh Data` オプションがtrueになっているのが原因でした．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170854/b5aaf816-383a-1b47-f527-48611c8185a7.png)

https://answer.uwa4d.com/question/5985785a46dafb521451bd85
上記のページによると， `Optimize Mesh Data` は以下のような挙動をします．

> 一般的には、「メッシュデータの最適化」オプションをオンにすることで、エンジンは発行時にすべてのメッシュデータを繰り返し処理して、余分なデータを削除し、データサイズを小さくすることができます。 なお、「冗長な」データとは、レンダリングのためのShaderでは必要のないデータがメッシュデータに含まれていることを意味します。つまり、メッシュデータに位置、uv、法線、色、接線などの頂点データが含まれているが、そのデータが メッシュデータに位置、uv、法線、カラー、タンジェントなどの頂点データが含まれていて、レンダリングに使用するシェーダーには位置、uv、法線しか必要ない場合、メッシュデータのカラーとタンジェントは「冗長」であり、ゲーム公開時にエンジンによって自動的に削除されます。
このオプションをオンにすることは、両刃の剣であることに注意する必要があります。 開発チームは、ランタイムの状況でのシェーダーの変更に特に注意を払うことをお勧めします。 より多くの頂点プロパティへのアクセスを必要とする複雑なシェーダをランタイム中に特定のGameObjectに置き換える必要がある場合は、ランタイムで使用されるメッシュデータをエンジンが削除しないように、これらのシェーダを適切なPrefabにマウントしてからリリースすることをお勧めします

つまり，UnityはこのオプションがONの状態でAssetBundleをビルドするとPrefabで使用されているMesh, Material（Shader）を静的解析し使用していない付加情報をStrippingする，ということだと思われます．

# 解決
1つのAssetBundleの中に頂点情報を使用するMaterialをアタッチしたPrefabを含むようにして解決しました．

改善前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170854/2bf345b1-7922-942d-9095-b082bdba835f.png)

改善後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170854/8eac1c1b-03d9-388b-0a4f-679eecd7c137.png)


これによりPrefabで使用しているMesh, Shaderが解析され，Shaderで使用している頂点情報がビルド時に残ります．
ただし，こちらの場合でも  **Prefabに付けたShaderで使用していない頂点情報はStrippingされてしまう** ので注意してください．

ランタイムでShaderを切り替えてそれぞれ別の頂点情報を使用する，といった用途だとかなり不便ではあるので必要に応じて `Optimize Mesh Data` は無効にするのもアリかと思います．
（というか，トラブルのもとになるかと思うので特に必要なければ無効にしておくのが良いのではないかと思います）
Gtk3アプリ ファイルダイアログを利用する

###ファイルダイアログを利用する

#####ダイアログ系は表示の仕方には複数あります。

####プログラムで表示するタイプ

右上と左上にボタンがOkボタンとキャンセルボタンが表示されます。

<img width="400" alt="Screenshot from 2021-09-29 13-02-34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/0763e9a0-d3ef-7005-9f5b-d1b10f97d44c.png">

ダイアログ関数宣言時にボタンのタイプと動作を指定します

```cs
Gtk.FileChooserAction.Open
Gtk.Stock.Cancel
Gtk.ResponseType.Cancel
Gtk.Stock.Open, Gtk.ResponseType.Ok
```

```cs
Gtk.FileChooserDialog chooseDialog1 = new FileChooserDialog ("Open file", this,  Gtk.FileChooserAction.Open, Gtk.Stock.Cancel, Gtk.ResponseType.Cancel, Gtk.Stock.Open, Gtk.ResponseType.Ok);
chooseDialog1.LocalOnly = true;
int response = chooseDialog1.Run ();

//OKボタンが押された時の動作
if ((Gtk.ResponseType) response == Gtk.ResponseType.Ok)
{
	Console.WriteLine(chooseDialog1.Filename);
	chooseDialog1.Destroy ();
}
//Cancelボタンが押された時の動作
if ((Gtk.ResponseType) response == Gtk.ResponseType.Cancel)
{
	chooseDialog1.Destroy ();
}
```
####Glade上に配置して利用するタイプ

ファイルダイアログの右下にボタンが表示されます。
<img width="400" alt="Screenshot from 2021-09-29 13-36-36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/84ec5f77-c098-d1f1-b969-e5e3f9c1c77c.png">
GUI上で細かい設定ができます。
<img width="550" alt="Screenshot from 2021-09-29 13-12-13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/e38a0024-6e99-5ef5-1b40-42fb815644f3.png">

#####ファイルダイアログにGtk.Buttonを配置する
ファイルダイアログにGtk.Buttonを配置します。
配置後ストックボタンのところをクリックし、プリセットのデザインを利用すると便利です。
<img width="500" alt="Screenshot from 2021-09-29 13-14-17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/2ceb568b-c207-03e5-225a-60a0d3d8d347.png">

#####Gtk.Buttonにイベントハンドラーも設定する
Gtk.Buttonにシグナルを記入する必要があります。
<img width="300" alt="Screenshot from 2021-09-29 13-17-10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/da572802-8b13-b4b2-9651-dacbace457a7.png">
#####C＃側にもコールバック関数を書く

```cs
[UI] private readonly Gtk.FileChooserDialog openDialog1 = null;

openDialog1.Show();

openDialog1.Hide();

private void on_okBtn_clicked(object sender , EventArgs e){

}
```

イベント文を自動で生成するツール

ダイアログにも対応しています。

https://qiita.com/iota_11/items/3318fa527065d4c73a3f

[Gtk3アプリ GtkMenuを利用する](https://qiita.com/iota_11/items/b3443474695e8b01c968)へ続く
[Ruby] AtCoder過去問 C - Lower

##はじめに
AtCoder過去問のc問題をRubyで解いてみました。
よろしくお願いします。

問題はこちらから確認してください↓

https://atcoder.jp/contests/abc139/tasks/abc139_c

##C - Lower
まずは入力を受け取ります。
2行目は配列として受け取ります。

このあと繰り返し処理を行い、繰り返した回数をカウントしたいので変数cntを用意して0を代入します。
また、続けて移動できた回数を配列の中で記録していくので配列cnt_aryを用意しておきます。

```ruby
n = gets.to_i
h = gets.split.map(&:to_i)
cnt = 0
cnt_ary = []
```

timesメソッドを使ってn回繰り返します。ブロック変数を用意して配列の先頭から順番に処理をしていくようにします。


if文で指定した数字がその右隣以上の数字であれば移動できるのでcnt＋１します。連続で移動できる限りはcnt+1し続けます。

移動できなくなったところでcnt_aryにcntを入れて、cntを0にリセットします。

```ruby
n = gets.to_i
h = gets.split.map(&:to_i)
cnt = 0
cnt_ary = []


n.times do |i|
  if i != n-1 && h[i] >= h[i+1]
    cnt += 1
  else 
    cnt_ary << cnt
    cnt = 0
  end
end
```

h[i+1]はiが繰り返しの最大値の時に存在しないので```i != n-1```という条件式も含めておきます。

timesで出来上がったcnt_aryの中の一番大きい要素が移動できる回数の最大値となります。

```ruby
n = gets.to_i
h = gets.split.map(&:to_i)
cnt = 0
cnt_ary = []


n.times do |i|
  if i != n-1 && h[i] >= h[i+1]
    cnt += 1
  else 
    cnt_ary << cnt
    cnt = 0
  end
end

puts cnt_ary.max
```
Microsoft365 メールの追跡方法

# 概要
Microsoft Office３６５のサーバー管理時、利用者から指定アドレスからのメール受信できないという問い合わせがあったため、受信メールの追跡方法をメモしておく。

# 操作手順
1. Exchange管理センターにアクセスする
1. 左メニューの「メールフロー」 > 「メッセージ追跡」を開く
1. 画面上の「＋追跡を開始」をクリックする
1. ポップアップ画面の各項目を入力する
    - 送信者欄：送信元メールアドレス
    - 受信者欄：受信先メールアドレス
    - 時間の範囲：追跡する時間の範囲（デフォルトでは2日間）
    - レポートの種類：出力するレポート（デフォルトではようやくレポート）。基本、要約レポートで良い。
1. ポップアップ上の「検索」ボタンをクリックする

# 実行結果
上記操作により、メールが届いているか否か、届いている場合はどこに保存されているかなどが表示される。

# 注意点
- 10日以上前のメールはすぐにチェックはできない様子。その場合、上記操作の「時間の範囲」で「カスタムの時間範囲」を指定する
エンジニア歴2年の私が今まで受けてきたコーディングテストについて

## イントロダクション

初めまして！harakazu_nanfgです！
先日、私のTwitterにダイレクトメッセージでいい感じの質問をいただき、こちらQiitaにも書けそうな記事だと思ったので、共有します。

それではお聞きください、「私が今まで受けてきたコーディングテストについて」です！

## 質問文

harakazu_nanfgさんが受けた会社で、コーディングテストはあったのでしょうか。もし受けたことがあったらどのくらいの数学力があれば良いかなどを教えて頂きたいです！


## harakazu_nanfgが受けた会社でコーディングテストはあったか
→ 今まで20社ぐらい企業を受けてきましたが、コーディングテストがある企業を「学習未経験のとき」「Ruby経験1年のとき」「Ruby経験2年のとき」の3パターンで3社ほど受けたことがあります。

3社の概要をざっくり説明。

### 学習未経験のとき
Web制作会社だったので、HTMLでのサイトの模写のテストでした。当時は何の準備もせずにガチガチの学習未経験だったので、「調べてもいいよ」と言われていたものの、調べ方も分からず敗北。結果はもちろん不採用。

### Ruby経験1年のとき 
受けた企業はC#で開発をしているSIerだったので、C#でのプログラム修正テストでした。「このプログラムは３箇所間違っているからちゃんと動かないんだ。直してみてね」と言うテストでしたが、前夜に勉強したC#の記述とは全く関係ない箇所が出てきて全く分からずコーディングテストは敗北。ただし、「キミ人柄がいいね」という理由で、その場で採用となった…

### Ruby経験2年のとき 
受けた企業はRubyで開発している自社開発企業だったので、Rubyプログラムの記述テストでした。問題は全部で3問あり、1問目は「FizzBuzz」プログラム、あとの2つは全く覚えていないぐらいの難しい問題でした。1問目は難なく解けた（多分）んですが、そのあと2問は全く分からず敗北。結果はもちろん不採用でした。

### ps

おまけですが、私の友人が受けてきた企業の中にはC言語で「再帰呼出し」のプログラムを書くテストがあったとか聞きました、、（聞きたくなかった真実）

再帰呼出しについて
https://ylb.jp/2006b/proc/recursion/　

<br>

というように、コーディングテストは重要ですが、「コーディングテスト3敗」で「採用1勝2敗」となることもあるので、最後まで諦めずやってみると良いかもしれません！（謎アドバイス）



## どのくらいの数学力があれば良いか
→結論から言うと、「コーディングテストの問題は数学力が必要だが、いきなり数学力を上げるのは難しいので、コーディングテストでよく出題される問題をあらかじめ把握しておく」のが良いと思っています！

やはり、いきなり大まかに数学力を上げるのは難しいだろうから、あらかじめ出題されるものを予想しておくのが良さそうですねd(￣ ￣)



### 参考になりそうな記事
コーディングテストでよく使いそうなアルゴリズムメモ(Python、初級レベル) - Qiita
https://qiita.com/anoiro/items/d333c8b8b6162a5d62c3
【Ruby】FizzBuzz問題 - Qiita(FizzBuzzはコーディングテストでよく出題されます) 
https://qiita.com/suzu12/items/6012d84affedb5ed021b
再帰呼出しについて（先ほどの話に出てきたやつ）
https://ylb.jp/2006b/proc/recursion/　


## 最後に

以上が「私が今まで受けてきたコーディングテストについて」です。

やはり、コーディングテストは重要ですが、「コーディングテスト3敗」で「採用1勝2敗」となることもあるので、最後まで諦めずやってみると良いかもしれません！（２度目の謎アドバイス）


ここまで読んでいただきありがとうございましたm(__)m
pyenv利用バージョンの指定と解除方法

# 特定のディレクトリのみで有効なpythonバージョンを指定

## 指定方法

```bash
$ cd test
/test$ pyenv local 3.9.5
/test$ python --version
Python 3.9.5
```

## 解除方法

```bash
$ cd test
/test$ pyenv local --unset
/test$ python --version
No global python version has been set yet. Please set the global version by typing:
pyenv global 3.7.2
```

# 全体で有効なpythonバージョンを指定

## 指定方法

```bash
$ pyenv global 3.9.5
/test$ python --version
Python 3.9.5
```

## 解除方法

```bash
$ pyenv global --unset
$ python --version
No global python version has been set yet. Please set the global version by typing:
pyenv global 3.7.2
```

# 参考

- https://www.yoheim.net/blog.php?q=20170204
- https://slow-starter.hatenablog.com/entry/2020/08/13/000000
新しいPythonパッケージマネージャPDMのお勧め

PDMっていう新しいPythonパッケージマネージャが出ているのでこれをお勧めしてみたい。
- [PDM - Python Development Master](https://pdm.fming.dev)
- [PDM Project on GitHub](https://github.com/pdm-project/pdm/)

# Poetryとの比較
僕もお勧めしているPythonパッケージマネージャの Poetry と比べていいところと悪いところを挙げてみます。

## いいところ

### 1. インストールが楽（macOS限定）

Poetry も Homebrew からインストールできるんですが，開発元サイトでは curl を使ってGitHubからインストールする方法を推奨していて，実際，その方法でないと `poetry self update` ができないので，新しい変更に追随できません。

一方，PDMも curl を使ってGitHubからインストールする方法が標準ですが，その方法だと逆にPDMをアップデートする方法が提供されていません。素直に Homebrew でインストールする方が楽ですし，アップデートも最新のものに追随しているのでお勧めです。

### 2. 仮想環境を作らない

これがPDMの一番の特徴だと思いますが，PDMはデフォルトでは仮想環境を作りません（設定で仮想環境を利用するようにはできる）。

PDMも基本的には，プロジェクトフォルダ（何も指定しなければ，最初に `pdm init` を実行したフォルダ）に必要なファイルが生成され，プロジェクトフォルダ内で `pdm run` でプログラムを実行するとそのフォルダにインストールしたパッケージが使われます。これだけをみていると，Poetry で，仮想環境をプロジェクトフォルダに作るように設定（ `poetry config virtualenvs.in-project true` ）した時と似てるんですが，ちょっと違います。

仮想環境を作らないのがなぜいいかというと，同じメジャーバージョンであれば，Python インタプリタを切り替える際にライブラリをインストールし直す必要がありません。

仮想環境は，内部で Python インタプリタを参照しています（より正確にいうとシンボリックリンクを貼っている）。ですから，マイナーバージョンひとつであっても，バージョンが異なれば，仮想環境から作り直す必要があります。このおかげで Python のバージョンを 3.9.6 から 3.9.7 に挙げただけで `poetry update` （または `poetry install`）し直す必要があります。

### 3. 依存パッケージのバージョンチェックが緩い？

Poetry はなんかよく分からないところでバージョンのコンフリクトが発生してパッケージをインストールできないことがあります。パッケージの内容とか依存パッケージの中身とか見ても，コンフリクトしないはずなんですが，追いきれていないところでバージョンのコンフリクトが発生しているのかもしれません。とにかく，厳密なのかそれともうまくコンフリクト解消できないのか分かりませんが，Poetry だとインストールできないパッケージがあります。

そういった場合にPDMを使ってみるとすんなりとインストールできたりします。

これまでしばらく使ってみていますが，PoetryでインストールできないパッケージがPDMでインストールできる例はありますが，逆のパターンはありませんでした。

もしかするとPDMのバージョンチェックが甘いのかもしれませんが，今のところ実用上問題はないんで，PDMの方が精神衛生上良いな...と思います。

### 4. 速い

Poetryも速いですが，PDMも相当に速いです。比べてはいませんが，多分同等には速いんじゃないかと思います。

## 悪いところ

### 1. 手軽なアップデート方法がない（macOS以外）

Poetry はいったんインストールしてしまえば `poetry self update` で Poetry 自身をアップデートできますが，PDMにはそういったアップデート方法は提供されておらず，最新版に追いつくためにはインストールと同じ，curl を使った手順を踏むことになります。

# 使い方

ぽちぽちと追記していきたいと思います。
ECR にイメージをpushしてみた

# はじめに
今回の内容は、 AWS CLI バージョン２を想定しています。
バージョン２でない方はバージョン２を使用するか、適宜バージョン１の対応するコマンドに置き換えて実行してください。
現在のバージョンは下記コマンドで確認できます。

```shell
$ aws --version
aws-cli/2.1.35 Python/3.8.8 Darwin/20.6.0
```

[バージョン１とバージョン２の違い](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cliv2-migration.html)

### ※注意事項
AWSは従量課金制なので、使った分だけ料金がかかります。
AWSに登録後は無料枠などありますが、ご自身の状況を確認した上で使用してください。

# ECR とは
公式によると
>Amazon Elastic Container Registry (Amazon ECR) は、完全マネージド型のコンテナレジストリです。このレジストリを使うと、コンテナイメージとアーティファクトをどこにでも簡単に保存、管理、共有、デプロイできます。

https://aws.amazon.com/jp/ecr/

つまりコンテナイメージを保存できる場所というイメージです。
（DockerHub みたいなイメージ。もっと色々できるみたいですが自分はまだ十分理解できていないので。）

# ターミナルからAWSにログインする為の情報の設定


```shell:shell
$ aws configure

# それぞれ入力する
AWS Access Key ID [None]: #IAMユーザーのアクセスキーを入力
AWS Secret Access Key [None]: #IAMユーザーのシークレットアクセスキーを入力
Default region name [None]: ap-northeast-1 # リージョン(近いところの方がいい)
Default output format [None]: json # コマンド結果の出力形式

# 下記コマンドで設定されている値が先ほど入力された値になっているか確認
# 入力した値と違っていて TYPE の部分が env になっている場合はシェルを立ち上げ直せば反映されると思います
$ aws configure list
access_key     ****************HE44 shared-credentials-file    
secret_key     ****************yqE1 shared-credentials-file    
    region           ap-northeast-1      config-file    ~/.aws/config
```

# イメージの準備
ECR にpushしたいイメージが準備できている方はこの部分は飛ばしてください

Docker Hub の nginx:latest のイメージを使用します

```shell:shell
$ docker pull nginx
```
イメージ一覧表示して、nginxのイメージがpullできたか確認

```shell:shell
$ docker images
```

# ECRにイメージをpush

```shell:shell
# nginx という名前のリポジトリを ECR に作成
$ aws ecr create-repository --repository-name nginx     
```
リポジトリ作成成功すると、json形式でレスポンスが返ってくる

```json:json
{
    "repository": {
        "repositoryArn": "arn:aws:ecr:ap-northeast-1:[AWSアカウントID]:repository/ngix"
        "registryId": "[AWSアカウントID]",
        "repositoryName": "nginx",
        "repositoryUri": "[AWSアカウントID].dkr.ecr.ap-northeast-1.amazonaws.com/nginx"
        "createdAt": "2021-09-29T11:30:45+09:00",
        "imageTagMutability": "MUTABLE",
        "imageScanningConfiguration": {
            "scanOnPush": false
        },
        "encryptionConfiguration": {
            "encryptionType": "AES256"
        }
    }
}
```
`ap-northeast-1` の部分は `aws configure` で `ap-northeast` 以外を入力している場合は、入力したリージョンに置き換わります。

返却されたjson の repositoryUri を使用して、イメージにタグ付けします。

```shell:shell
# ローカルの nginx:latest イメージを　「ECRのnginxリポジトリ」 の 「latest」 とタグ付け
# [AWSアカウントID]の部分は実際に入力する時は、[]は不要です
$ docker tag nginx:latest [AWSアカウントID].dkr.ecr.us-east-1.amazonaws.com/nginx:latest
```

ECR にログインします

```shell:shell
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin [AWSアカウントID].dkr.ecr.ap-northeast-1.amazonaws.com/nginx
# Login Succeeded と表示されれば成功
```

ECR にイメージをpush

```shell:shell
$ docker push [AWSアカウントID].dkr.ecr.us-east-1.amazonaws.com/nginx:latest
```

ここまで実行したらAWSのコンソールで ECR のところから、nginx という名前のリポジトリが作られていて、
その中に latest でタグ付けされたイメージが存在するのが確認できると思います。

![スクリーンショット 2021-09-29 12.03.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470307/af93e0ae-da92-2713-30b5-4cd36d2b6a10.png)

# まとめ
ECRにイメージをpushしてみました。
Azure IoT Edge 運用とトラブルシューティングコマンド(v1.2以上)

# はじめに

Azure IoT Edgeデバイス上で運用するコマンドリストを整理しておきます。
IoT Edge バージョンがv1.2以上で使えるコマンドです。

![Cloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/d22e4e59-374d-e902-431d-9421ea08f992.png)


# モジュール関連コマンド

### 実行されている全てのモジュールを表示します。

```bash:Shell
sudo iotedge list
```

### モジュールのメッセージを確認します。

```bash:Shell
sudo iotedge logs -f <MODULE_NAME>
```

### モジュールを再起動します。

```bash:Shell
sudo iotedge restart <MODULE_NAME>
```

### モジュールログをクリアします。

```bash:Shell
sudo sh -c 'echo "" > $(sudo docker inspect --format='{{.LogPath}}' <MODULE_NAME>)'
```

# セットアップコマンド

### デバイスの構成と接続を検査します。

```bash:Shell
sudo iotedge check
```

### 構成ファイルをインポートする。

v1.1以下のバージョンから/etc/iotedge/config.yamlが対象です。

```bash:Shell
sudo iotedge config import
```

### 手動プロビジョニング向けの接続文字列を設定する。

```bash:Shell
sudo iotedge config mp --connection-string '<CONNECTION STRING>'
```

### 構成ファイルの変更を適用する。

```bash:Shell
sudo iotedge config apply
```

### IoT Edge システムサービスの状態を確認する。

```bash:Shell
sudo iotedge system status
```

### IoT Edge システムサービスのログを取得する。

```bash:Shell
sudo iotedge system logs -- -f
```

バッグレベル変更

```bash:Shell
sudo iotedge system set-log-level debug
sudo iotedge system restart
```

```bash:Shell
sudo iotedge system set-log-level info
sudo iotedge system restart
```

### IoT Edge システムサービスを再起動する。

```bash:Shell
sudo iotedge system restart
```

### IoT Edge システムサービスを削除する。

```bash:Shell
sudo apt-get remove --purge aziot-edge aziot-identity-service -y
```
Unity Application.internetReachabilityは正確な通信状況を取得できない

# はじめに
特定のユーザーで、通信エラーと判定されてしまうことがあったのでその原因を本記事にまとめます。

# 問題の処理
通信処理で以下のような判定で、NotReachableの場合は通信処理を行わず、通信エラーという判定をしていました。

```c#
if (Application.internetReachability == NetworkReachability.NotReachable)
{
    // ネットに繋がっていないので通信エラー
}
```

しかし、Unity公式ドキュメントによると
https://docs.unity3d.com/ScriptReference/Application-internetReachability.html
>Do not use this property to determine the actual connectivity. 

実際の接続状態を判定するときには使用しないこととのことでした。

# 対策
そもそも、上記の判定を入れなくても処理上問題なかったので削除しました。
UnityWebRequestでネットワークが切断されている状態でリクエストを投げた際、

```c#
webRequest.isNetworkError
```
でネットワークのエラーかどうか判定できて、

```c#
webRequest.error
```
でエラーメッセージを取得できるので、リクエストを投げる直前で判定する必要がありませんでした。

# 最後に
**Application.internetReachability**は正確な接続状態を取得するのには使用できませんが、
不具合を調査する際に、ユーザーの通信環境(Wifiかキャリアか)をログで残しておくような用途に使うのは問題ないと思います。
アプリの進行に影響がある処理の判定に使うのは避けたほうがよさそうです。
また、リクエストを投げる直前で通信可能か判定したい場合はそれ用のAPIを作って判定するのが良さそうです。
openshift TroubleShootingでよく使うコマンド

デプロイメントの状況をや問題を確認するには下記のコマンドをよく使っています。

##現在のprojectを確認します。
```
$ oc project
Using project "XX" on server "https://XXXX".
```

##現在定義されているサービスの完全な一覧を返します。
```
$ oc get svc
NAME                       TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
operator-controller        ClusterIP   172.21.116.228   <none>        443/TCP                      4d12h
```


##現在のプロジェクトの概要を表示します。
```
$ oc status
In project XXXX-project on server https://XXXXX.jp-tok.containers.cloud.ibm.com:XXXXX

svc/operator-controller - XXX.XX.XXX.XXX:XXX -> 9443
  deployment/operator-controlle deploys icr.io/cpopen/iaf-ai-operator@sha256:XXXXXXX
    deployment #1 running for 6 weeks - 1 pod
```




##実行される Pod の名前を一覧表示します。
```
$ oc get pod
NAME                                                              READY   STATUS      RESTARTS   AGE
secrets-job                                         0/1     Completed   0          35d
```



##特定のビルド、デプロイメント、または Pod のログ出力を取得します。
```
$ oc logs -f <pod>
```

##イベントなどを表示します
```
$ oc get events 
$ oc get storageclass
$ oc get pvc
```

##podの詳細を確認できます
```
$ oc describe pod <pod name>
```

## secret の確認方法
例：

```
$ oc get secret | grep wfs-server-db-secret

$ oc describe secret wfs-server-db-secret
Name:         ibm-baw-wfs-server-db-secret
Namespace:    XXXX-project
Labels:       <none>
Annotations:  <none>
Type:  Opaque
Data
====
dbUser:    8 bytes
password:  8 bytes

$ oc get secret wfs-server-db-secret -o yaml | grep dbUser
```

##Operator のログ取得方法1
参考：[こちら](https://www.ibm.com/docs/en/cloud-paks/cp-biz-automation/20.0.x?topic=icep-troubleshooting)

```
#deployment_nameを取得
$ kubectl get cluster | awk '{print $1}' | grep -v "NAME" deploy

#operator_pod_nameを取得
$ kubectl get pod|grep operator | awk '{print $1}' operator

$ touch cluster.log

#Operatorのログをlocalに保存
$ kubectl cp $operator_pod_name:/logs/$operator_pod_name/ansible-operator/runner/icp4a.ibm.com/v1/ICP4ACluster/<namespace>/$deployment_name/artifacts /<local_logpath>
例：
kubectl cp operator:/logs/operator/ansible-operator/runner/icp4a.ibm.com/v1/ICP4ACluster/project/deploy/artifacts/latest/stdout <localdir>/cluster.log
```

##Operator のログ取得方法2
```
$ oc get pod
operator
$ oc rsh operator
$ cd /logs/operator/ansible-operator/runner/icp4a.ibm.com/v1/ICP4ACluster/project/icp4adeploy/artifacts/latest
$ cat stdout
```
##configmapの検索方法

```
$ oc get configmap | grep cpe-ums
cpe-ums-config

$ oc get configmap cpe-ums-config -o yaml
apiVersion: v1
data:
  UMS_REGISTERED: "True"
  UMS_REGISTERED_UPDATE_21.0.2: "True"
kind: ConfigMap
metadata:
...
略
```
tensorflow画像分類でハマったので対処法をメモ retrain image classifier

## TensorFlow を用いた画像分類

tensorflowを用いた画像分類で花の画像を分類するチュートリアルでてこずったためをメモします。

今回、特にversionがネットの情報と違うだけで、エラーを吐いたためバージョン情報を先に載せておきます。

Version
---
python 3.7.6
tensorflow 1.15.0
tensorflow-hub 0.12.0
tensorflow-estimator 1.15.1

インストールしたもの
---
初めにAnaconda環境を構築して、Anaconda prompt（仮想環境）を立ち上げます。
その後、pip install ~を用いてtensorflow(1.15), tensorflow-hubをインストールしました。

:::note warn
ここで、注意しなければならないのがバージョン情報で下記のサイトなどを参考に進めていくと"tensorflowにappが存在しません"というようなエラーが出てしまいます。
:::
https://qiita.com/quotto/items/645b01cf9c3919a52b12

tensorflowは最新バージョンが2.~~で、ネット上にある情報はほぼすべてv1のtensorflowのため

```.py
pip install tensorflow==1.15
```

とバージョンを指定してインストールしました。

そのあとは、下に示すサイトに従って、コードを実行していきます。

https://docs.w3cub.com/tensorflow~guide/tutorials/image_retraining

retrain.pyで分類器を再度訓練して、label_imgae.pyで実際にdaisy,sunflowers,dandelion,tulips,rosesの中からdaisyを見分けられるかテストするのですが

```
"The name 'import/finalresult' refers to an Operation not in the graph."
```

このエラーで詰まりました。
https://stackoverflow.com/questions/46325799/tensorflow-for-poets-the-name-import-input-refers-to-an-operation-not-in-the

stack overflowに似たようなエラー文が投稿されており、
input_layer = "input"を
input_layer = "Mul"に変えることで無事daisyを99.7%で特定することができました。
10年後のために身につけたい技術

# 現在
10年後のためにいま勉強しておきたい技術を書く前に、私のいまをお話しします。
私は今、工学系の大学院で情報工学を専攻しています。
研究内容は、ざっくり言うと、機器の稼働状況と位置情報を管理して、それをうまくユーザにリターンして管理の効率化を図るという少し実務的なものかと思います。
サーバ管理、ハードウェア設計(基板設計)、ソフトウェア開発、WEB開発、データ分析を行っています(流行りのAIはあまり触れていません)

よく使っている言語や技術は以下のようです。

| 技術 | 用途 |
| --- | --- |
| Linuxコマンド全般 | サーバ管理には必須です．環境構築のときに理解していると便利です |
| Linuxに関して | サーバセットアップするときに，HDDをマウントしたり，RAIDを組んだり，時刻同期したり，IPアドレスを設定するのにLinuxやそのOSへの理解が求められます． |
| 基板設計技術 | EAGLEとKiCadという基板設計のフリーソフトウェアを用いて基板設計する技術． 趣味で自作キーボードなども作れるので，身につけておくと便利． |
| プロトタイピング | 最適な言葉が見つかりませんでした．Arduinoなどでセンサを動かして，研究の前段階のプロトタイプをしています．|
| C, C++ | 設計した基板に乗ったマイコンを制御するのは，CとC＋＋です．Arduinoかその拡張を使っているので，Arduino言語とも言えます．|
| Python | WEB開発とデータ分析に使っている言語です．一応，機械学習などもします．|
| Django | Pythonで書かれたWEBフレームワークです． これがないとWEB開発できないレベルの知識レベルです |
| HTML,CSS,Javascript | WEB開発には必須の言語です．CSSはBootstrapに依存しているので，あまり理解していないですが，勉強中です．|
| Docker | コンテナ型仮想環境．本当に便利．これがないともう生きていけないレベルでマストになってしまいました．Pythonのデータ分析の環境構築や，サーバのWEB開発環境構築に用いています．|

 他にも，色々あると思いますが，主要なものを一覧にしました．

# 身の回りの未来予想
本題ではないので簡単に．
10年後に世の中はどうなっているでしょうか．自動車は空を飛んでいるかもしれません．
情報系はさらに，需要が増し，その分野に関わる人が多くなっているかと思います．
10年前はOSはWindows一強でしたが，この10年でMaｃOSが浸透したように，Linuxも5％くらいの人が使うOSになっていると思います．
いま流行りのAIは第n次AIブームを迎え，AIはより主流に，一般的になっているのではと思います．

# 10年後のために身に着けたい技術
10年後は，社会人として働いているころだと思います．それを加味して，身につけたい技術を考えます．
就職先にもよると思いますので，いま保有している技術が，オーパーツ化し，どのように進化しているかを考えながら書きます．

## 英語力
まずは，やはりこれではないでしょうか．
ポケトークやGoogle翻訳，DeepLがどれだけ進化しても，英語力，読む力，聞く力，話す力はグローバル化に伴い，必須です．
もし，十代の方がこの記事に目を通していただけているのであれば，英語は嫌いでも勉強しておくべきです．
論文を読むにしても，学会で発表するにしても，英語力がないとどうしようもありません．
また，英語力があれば，就職でも幅広く見ることが出来ると思います．
目新しいことではないですが，技術として，英語は身につけておくべきです．
(この記事を書こうと思った理由は，もはやこれを伝えることにあります)

## 数学関係
Qiita10周年の他の方の記事でも言及されていましたが，数学は理解しておくべきです．
私自身も，高校，大学では，こんな数学なにに使えるんじゃ！と思っていましたが，院で研究を始めると，もっと勉強しておけばよかったと後悔しました．
データ分析でも，AIなどの機械学習でも，ゲーム開発でも，ソフトウェア設計でも，なんなら簡単なプログラミングでも数学が求められます．
ゲームの動作は物理演算で行われています．
データ分析は，回帰や箱ひげ図，カーネル密度など挙げたらきりがないレベルで数学の知識が関与します．
Pythonを使っていると，行列が平然と出てきます．

## Docker
コンテナ型仮想環境Dockerは，環境構築を楽にします．
Dockerを用いて他の人が開発した環境を完全再現可能なので，環境構築に悩まされることが減ります．
使いこなすためにはLinuxなどの様々な知識が必要なので，少し学習コストは高いかもしれませんが，使いこなせればそれ以上のリターンがあります．
まだ，私も学習中ですし，今後さらに進化していくと思われるので，私自身も身につけたい技術としました．
ただ，現状はDockerにも限界はあるので，依存しすぎないようにしたいと思っています．

## Typescript
JavaScriptをよりわかりやすく安全に書く言語のようなものです．
この言語はWEB開発においては，マストになるのではと思っています．

## Python?
Python?としました．というのも最近，JuliaというPythonの上位互換のような言語が少しずつ台頭してきています．
変わったとしても，Pythonとあまり変わらないので，Pythonを学んでおくのが大事だと思います．

## データ分析手法
データ分析出来ずして，なにをするのか，というレベルで必須の知識だと思います．AIをするにしてもまずはデータ分析をし，傾向を見る必要があります．
また，常に発展しつづける技術ですので，勉強し続ける必要があります．
最新の動向を捉え，そのデータに適切な手法を適用する．簡単そうで，一番むずかしいことです．


# 終わりに
人によって身につけたい技術，勉強する必要がある技術は様々だと思います．（英語を除く）
技術者として身につけたい技術を抜粋して記載しました．
また，機会があれば，私が思う社会人として身につけたい技術もかけたらなと思います．
Qiita１０周年イベントに合わせて，本記事を思いつく限りに書きましたが，時間があるときに更新したいと思います．
ぜひ，あなたのご意見をお聞かせください．