OmniAICreator/Qiita-1.07M huggingface dataset:
【Sinatra】アプリにファビコン(favicon)を設定しよう

### はじめに

以前、Railsでfaviconを設定しました。→（[こちら](https://qiita.com/mihooo24/items/380cc2b9c6980bfd0bfa)）
今回はSinatraでfaviconを設定しようと思い探したものの、エラー関連の記事が多く
時間が掛かったので備忘録として記録します。

### 環境

- mac.os バージョン10.15.6
- Ruby 2.7.3
- psql (PostgreSQL) 12.6

### 手順
#### ①faviconにしたい画像を探して、保存する
このときに、ファイル名を`favicon.ico`にしておきます。

#### ②アプリ内に格納する
今回は`app/public/image`内にfaviconを格納しました。
※格納はドラッグ&ドロップでできます。

#### ③コードを記述する
`app/views/layout.erb`
※ビュー（ERB）のheadタグ内に以下の一文を書きます。

```erb
<html>
  <head>
    <!--(省略) -->
    <!--(場所はfaviconの格納場所に合わせて指定する) --> 
    <link rel="shortcut icon" href="/image/favicon.ico"> 
  </head>
  <body>
    <!--(省略) -->
  </body>
</html>
```

#### ④faviconが適用される
サーバーを起動させると、faviconが適用されていることが確認できます。

### 参考
1.[Sinatra でメモアプリ](https://mistyrinth.hatenablog.com/entry/2019/04/18/180832)

### 最後に
記事の感想や意見、ご指摘等あれば伝えていただけるとありがたいです。
読んでいただき、ありがとうございました。
pytestを使ってみる

## 前提
* pythonインストール済み

## pytestのインストール

```python
pip install pytest
```

## テストファイルの作成

* testで始まる関数名を作成する
* testで始まる名前の関数自動的にテスト対象となる
* テストしたい関数内に　assert　で評価式を記述する

```sample.py
def add_number(x):
    return x + 1

def test_sum():
    result: int = add_number(4)
    assert result >= 5
```

## pytestの実行

```python
pytest sample.py
```

##　成功した場合
![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914798/e71be310-ecc8-5d31-4f8e-c405d4dcaa43.png)

## 失敗した場合
![sample 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914798/a27994ff-df52-6315-aebf-adb9780cdd1a.png)


# pythonのカバレッチを調べる

単体テストには処理ルートや分岐条件が網羅されているかという観点のテスト(ガバレッジテスト)をしたい場合は以下のコマンドでpytestのプラグインをインストールする。

```
pip install pytest-cov
```

## pytest-cov 実行オプション

```
-s: print文を出力
-v: 冗長なログ出力
--cov=CODE_DIRECTORY: ディレクトリ内をテストコードを指定する場合
--cov: C0カバレッジの表示
--cov --cov-branch: C1カバレッジの表示
--cov-report=html　: HTML形式のカバレッジレポートを出力
```

## 実行コマンド例
```python
pytest -s -v　--cov　sample.py
```

### カバレッジのhtml出力

```python
pytest -s -v --cov=../src --cov-report=html
```

## pytestでテストをスキップする

テストが必要ないコードの場合(テストコード内で呼び出すサブルーチンなど)

```python
@pytest.mark.skip(reason="このテストは無条件でスキップします。")
def test_sample():
    hoge = "hoge"
    return hoge

@pytest.mark.skipif(True, reason="[スキップする理由]")
def test_function_1():
    moge = 1
    return moge
```

## 失敗すると期待されるテストにマークを付ける

```python
@pytest.mark.xfail()
def test_unique_id_is_a_duck():
    uid = tasks.unique_id()
    assert uid == 'a duck'
```
Thumbalizr APIでウェブサイトのサムネイル

ウェブサイトのサムネイル画像を提供するAPIです。

FREEプランもあり、100回/月が使えます。

https://www.thumbalizr.com/features
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146872/64999c64-2a68-ee10-9e4d-9b5ee1890c18.png)
2021年10月時点で

サイトにサンプルコードがありますが、Python3では動作しませんでした。
下記はPython3で動作確認しています。

```python:sample.py
import hashlib
import urllib.parse


def thumbalizr(url='', options={}):
  embed_key = 'your_embed_key' # replace it with you Embed API key
  secret = 'your_secret' # replace it with your Secret
  
  query = 'url=' + urllib.parse.quote(url)

  for key, value in options.items():
    query += '&' + key + '=' + urllib.parse.quote(str(value))
    
  token = hashlib.md5((query + secret).encode('utf-8')).hexdigest()
  
  return "https://api.thumbalizr.com/api/v1/embed/%s/%s/?%s" % (embed_key, token, query)

print (thumbalizr("https://www.yahoo.co.jp/wordpress/", { 'width': 300, 'size': 'page' }))
```

コードに埋め込むAPIは、ユーザーのProrileページ（https://thumbalizr.com/member/profile）で確認できます。
Secretは非表示になっており、"show"のリンク押下で表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146872/87fad199-5dec-b3f6-2ac3-609edbdb0120.png)

サンプルを実行すると、下記のようなURLが発行され、サイトのサムネイル画像をAPIで取得できます。
https://api.thumbalizr.com/api/v1/embed/********/?url=https%3A//www.yahoo.co,jp/&width=300&size=page
[01] "非K8s環境" で Prometheus を導入してみる ... Zabbix4.0との比較


|本シリーズのトップページ|
|:--|
|https://qiita.com/items/dfb16ffcbbe7745e765e|

## 概要

変則的だが、職場の "**非K8s環境**" で Prometheus を導入することになったので
調査・導入検討をしてみた.

なお、職場の "**非K8s環境**" ではすでに「Zabbix 4.0」を導入しているが、
将来に備えて Prometheus を使ってみたいらしい.

ここでは Zabbix ユーザ視点で Prometheus を見てみたときの記録である.

　

## 用語の比較

Zabbix と Prometheus の用語の比較.
そこまで正確では無いかも知れない.

|Zabbix|Prometheus|補足|
|:--|:--|:--|
|ホスト|ターゲット|監視対象マシンのこと|
|Server|Server|監視元マシンのこと|
|Agent|Exporter||
|10051番ポート|9090番ポート|Zabbix Server側が LISTEN しているポート番号|
|10050番ポート|9100番ポート|Zabbix Agent側が LISTEN しているポート番号|
|Passiveチェック|Pull型監視|Server <font color="green">**→**</font> Agent での監視のこと.|
|Activeチェック|Push型監視|Server <font color="red">**←**</font> Agent での監視のこと.|
|アイテム|メトリック|監視項目の呼称のこと.|
|アイテムのキー|・クエリ<br/>・PromQL<br/>・セレクタ|Zabbix での `system.cpu.util` など.<br/> `key[param1,<param2>,<param3>]` の場合の `key` のこと. 
|アイテムのキーのパラメータ|ラベル|Zabbix で `key[param1,<param2>,<param3>]` とあれば `param1`、`<param2>`、`<param3>` のこと.|
|アグリゲート|範囲ベクトル|Zabbix での 10分平均の CPU負荷率(下記)を算出するような指定範囲での値のこと<br/>`grpavg["Linux servers","system.cpu.load",avg,10m]`|
|トリガー|Alertルール|アイテムで取得したデータに対する閾値のこと|
|イベント|Alert||
|アクション|AlertManager||
|シンプルチェック|・NodeExporter<br/>・BlackboxExporter|・ping チェック<br/>・TCPポートチェックなどと|
|ローレベルディスカバリ(LLD)|Service Discovery||
　


## アーキテクチャでの比較


### Prometheus (v2.30.3時点) のオリジナル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/a73de0ca-294c-32fc-cd8f-a765a4b9ad97.png)



### Zabbix 用語に置き換えた図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/744b0f09-6ad7-fbf8-486e-5babb22bce50.png)


## 参考にした情報

・[『[改訂3版] Zabbix統合監視実践入門 (技術評論社)』](https://gihyo.jp/book/2019/978-4-297-10611-9)
・https://kazuhira-r.hatenablog.com/entry/2019/04/29/025816
・[Prometheus 公式](https://prometheus.io/docs/introduction/overview/#architecture)
・[CentOS 8 実践ガイド［サーバ構築編］](https://book.impress.co.jp/books/1119101034)
・[Kubernetes実践ガイド　クラウドネイティブアプリケーションを支える技術](https://tatsu-zine.com/books/kubernets-jissen-guide)
・[PrometheusでKubernetesを監視する本 (電子版)](https://booth.pm/ja/items/1739498)

　

以上.
井の中から大海を知りました。サイバーエージェントのインターンがすごい良かった[サーバーサイド3days]

#はじめに
- 本記事では先日参加したサイバーエージェントさんのインターンシップの振り返りと参加することを迷っている方への参考にと思い書いています。
- 人事の方には許可をいただいています。

###**この記事の結論は、3日間魔法にかかったように楽しかったので、バック or ML/DSエンジニア志望の学生はぜひ行きましょうってことです！！**

#もくじ的なやつ
![CAInternQiita.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699416/1d80ab13-c9d5-0dea-40b9-3eeaa1d20b6c.jpeg)






#どんなインターンシップか？

- 3日間のうち1日目で実際のAbemaで使われているバックエンド、インフラ、ML/DSの仕組みをハンズオン形式で勉強する

- 2,3日目でチーム開発を通し、バックエンドorML/DSのどちらかで事前に自分で選択した課題に挑戦する
    - バックエンドとML/DSのどちらを担当するかは自分で選択できる
    - 課題はバックエンドなら負荷分散、責務の分離など、ML/DSならCI/CDツールの導入など
    - ML/DSとは =>![データサイエンティストはどこまでエンジニアリングをすべきか？](https://developers.cyberagent.co.jp/blog/archives/25162/)


# このインターンの何が良かったか

## 距離が近い！！
**人事の方、現場の方との距離が近く、自分がこの会社で働いたらというビジョンが持てる**

- ディスコードのルームが10個ぐらい用意されていて、DMを送ればいつでも現場のエンジニアさんと1対1で話せる

- 人事の方が積極的にイベント(就活講座、パネルディスカッションなど、アマングアス会)を開いてくださり、社内の雰囲気やサイバーのカルチャーなどがよくわかる


## 現場レベルをインプット
**現場レベルの技術、視点をインプットでき、学生の域を飛び越えた学びがある**

- 全員がAbemaに使用されている技術の仕組みをざっくり、網羅的に経験できる

- 参加者が興味ある分野では現場エンジニアからの手厚いサポートを受けながら現場レベルの取り組みに挑戦できる

## 井の中か大海か

**同世代の本当に強いエンジニアで出会える**

 - レベルの高い参加者とコネククションができる(今度一緒に開発したい、、、)

 - 自身の技術レベルを客観視できる(ボコボコにされてもっとがんばらなきゃってなりました)

 - チーム開発とは何かを経験できる
    - チームでアウトプットを作成するため、何を自分で開発し、何をチームメイトに任せるのか明確にする経験ができる
   


### まとめとして
- **同世代の本当に強いエンジニアで出会えて,もっと頑張ろうと思えた**
- **社員、人事の方と常にいつでも質問、雑談できて、実際に自分が働く姿が想像できた**
- **技術が強い会社のサービスの仕組みを学べて、どの開発で求めるべきクオリティが理解できた**
- **機械学習のサービスへの導入方法が理解できた**

### 本当に学びが多く、貴重な経験ばかりだったので皆さんもぜひ参加してください！！

# 参加するために
### まず、みなさんインターンシップやハッカソンに応募するとき、自分の技術力、頭の良さで受かるかな？？って思いませんか？

自分はまじでこれ毎回思うんですよね、、、

自分と同じことを思っている方がいることを願い、ベンチマーク的なものを残しておきます、、、

**正直、自分の経験なんて自慢できるものではなく、めっちゃ恥ずかしいのでこれを読んだ皆さんは今後インターンシップへの参加が決まった際にはQiitaにベンチマークを残してください、、、(私が参考にします、、)**

#技術的なところ(面接で言った、聞かれたこと)
#### 言語、実務経験
+ Pythonの使用経験
    + 深層学習(TensorFlow)
    + 簡単なサーバーサイドの経験(Flask、Django、DjangoRESTframework)
+ 実務でのバックエンドの経験
    + Ruby on Rails(1年 ベンチャーでWebアプリケーションを2個作成)
    + Node js(0.5年 TypeScript serverless express AWS Lambdaなど)
+ git,githubの経験
    + ブランチ切って作業、pullリク作れるなど最低限
    
**技術的なところは一次面接で聞かれます。作成したサービスの具体的な説明や、ざっくりとした技術の確認が中心であまり深ぼられなかった印象です。**

#マインド、モチベ的なところ(面接で言った、聞かれたこと)
+ なんでサーバサイドのインターンシップに参加したいのか？(自分の具体的な経験と絡めて聞かれます)
    + なんで参加したいのか？
    + その理由に至ったわけは？


+ チームで協力した経験を聞かせて？(これめっちゃ聞かれるから超深ぼった方がいいです)
    +  チームでの役割
    +  チーム内で自分が発揮したバリュー
    +　最初苦労したこととそれを解決するためにした行動

+ 挫折経験(挫折した時どのように考え、それからどのように行動してる？？)
    + 挫折経験ある？
    + そこからどのように行動してる？

**マインド、モチベーション関連の話は総じて具体例を聞かれます。面接前に具体例とともに上記の質問にちゃんと答えられるかチェックしてみるといいと思います。**

#最後に
**最後まで読んでくださり、本当にありがとうございます！！**

正直、筆者はこのインターンシップで同世代のエンジニアにボコボコにされたわけなんですが、なぜか嫌な思い出ではなく、いい思い出として今日の開発モチベになってます！！

この会社に勤めたら、、、が強烈に明確になるインターンシップでした。
特に、現場エンジニアの方との交流は一瞬自分はサイバーのエンジニアなんじゃないかって勘違いするぐらい自然に接してくれて本当に楽しかったです！！

拙い文章でしたが、ここまで読んでいただきありがとうございました！！良い開発ライフを！！
【初学者向け】JavaScriptのjoinについて

今回はJavaScriptの『join( )』について丁寧に解説していきます。

今回も基本<font color="red">イメージ</font>についてサラッと解説して、そこから具体的にコードでも解説して行こうと思います


##①join( )とは？
まず先に注意点になりますが**英語の「join」**という単語に引っ張られすぎて**単純に「何かが加わる」**と捉えない方が理解しやすいかなと思います。

大事なpointとしては２点。
**【point①: <font color="red">配列</font>を<font color="red">文字列</font>に変換する</font>】**
ここが最重要です。『配列→文字列』に変わるんです！
**イメージ**としては<font color="OrangeRed">『配列に丁寧に並べられた要素を**ぎゅぎゅっと**詰めて1つにくっつける』</font>でOKです

**【point②: 1つにくっつける際、<font color="red">間に指定したもの</font>を挟める】**
こちらは注意点で言及したようなjoinの意味から理解しやすい箇所かと思います。
何も指定しなければ要素がぎゅっと結合するとこを「:」や「-」や「,」で区切ったり改行もできたりします。その際『''』(クォーテーション)で囲う必要があるので注意!

##②コードで解説

**まずは配列を用意**

```javascript
const today = [2021, 10, 10];
```
この用意した配列に**join**でいろんな処理したものをconsole.logで表示させていきます。

**①何も入れない(空文字)**

```javascript
console.log(today.join(''));
// 20211010 　　　(このようにぎゅぎゅっと１つになります)
```

**②「/」を入れる**

```javascript
console.log(today.join('/'));
// 2021/10/10
```

**③「空白(スペース)」を入れる**

```javascript
console.log(today.join(' '));
// 2021 10 10  (①との違いに注意)
```
**④「-」を入れる**

```javascript
console.log(today.join('-'));
// 2021-10-10
```
**⑤「,」を入れる**

```javascript
console.log(today.join(','));
// 2021,10,10
//　ちなみに引数のデフォルトも ',' です

//　なので引数に何も渡さなくても結果は同じ
console.log(today.join());
// 2021,10,10
```

**⑥「\n」を入れる(改行させる)**

```javascript
console.log(today.join('\n'));
// 2021
// 10
// 10
```
ちなみに「\」は**　option + ¥　**です。

##まとめ
join()は**①配列を文字列に変換する。その際にぎゅっとまとまるという**イメージさえ掴めれば難しくないはずです。
今回の投稿も誰かの役に立つことを願っています
サイコロを振って出た目の平均値を求める

# サイコロを振って出た目の平均値を求める

$n$ 個のサイコロを $m$ 回振り，結果を $m \times n$ 行列に記録する。<br>
行方向の平均値は `mean(行列, dims=2)` で求められる。但し，結果は $m \times 1$ 行列なので，必要ならベクトルに変換する。 <br>
これを，1 行で書く。


```julia
means(n, m=10000) = mean(rand(1:6, m, n), dims=2);
```


```julia
using Plots
function f(n, m=10000)
    x = means(n, m)
    histogram(x, normalize=:pdf, ylabel="pdf", xlabel="mean of $n dice", label="")
    println("mean = $(mean(x)), sd = $(std(x, corrected=false))")
    savefig("fig$n.png")
end
```




    f (generic function with 2 methods)



1 個のダイス[^1]の場合は一様分布だが，要するに度数分布に過ぎない。<br>
平均値と標準偏差の理論値は 3.5 と std(1:6, corrected=false) = 1.707825127659933

[^1]: dice は複数形なので，「1 個のダイス」というのはおかしな言い方だそうだ。


```julia
f(1)
```
![fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653782/5615c1c5-1f79-fbce-7420-a79bd58ca9cc.png)

    mean = 3.5064, sd = 1.7084961340313296


2 個では，三角分布。


```julia
f(2)
```

![fig2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653782/7eb245f4-3578-1393-2243-8fbff74daf31.png)

    mean = 3.5129, sd = 1.2089803927276899


3 個だと，だんだん山型になる。


```julia
f(3)
```
![fig3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653782/3812e1e3-17a0-e7fe-8b4f-cd5a67cc3863.png)

    mean = 3.4931, sd = 0.9849857026599138



```julia
f(10)
```
![fig10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653782/68b61d25-8333-42d7-8382-44ec0ac72fe5.png)

    mean = 3.5003, sd = 0.5366059168514636



```julia
f(100)
```

![fig100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653782/604eea4f-f500-4dc8-3971-0ebb80c60492.png)


    mean = 3.5018859999999994, sd = 0.17010791575937903



```julia
f(1000)
```
![fig1000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653782/038ed6ee-f8ac-9e77-992c-424ba41c5170.png)

    mean = 3.4995860999999997, sd = 0.05413639429062486


$n = 1000$ のときの標準偏差の理論値は $n = 1$ のときの標準偏差の $1/\sqrt{1000}$ 倍。


```julia
std(1:6, corrected=false) / sqrt(1000)
```




    0.05400617248673217



# 中央極限定理

母集団の分布がどんな分布であっても、その誤差は標本の大きさを大きくしたとき近似的に正規分布に従う。<br>

母分布から $n$ 個のデータを抽出して標本平均を求めたとき，標本平均の平均値は母分布の平均値（母平均），標本平均の標準偏差は「母分布の標準偏差（母標準偏差）/ $\sqrt{n}$」になる。
windows11の右クリックをwin10のスタイルに戻す.batをつくってみた

# 概要

windows11で右クリックが左のやつになったのが不便です。
右の奴に戻すbatを作りました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/4062d489-f048-d2c5-5ad2-3fdd7f6b24d2.png" width="500px">

※レジストリをいじります。
 嫌だなと思った場合は、[アプリケーションキーで凌ぐ手もあります。](https://qiita.com/h1day/items/bfbe12fae3c1b009a9bd#%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%81%A7%E4%BB%A3%E6%9B%BF)

https://qiita.com/h1day/items/bfbe12fae3c1b009a9bd#%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%81%A7%E4%BB%A3%E6%9B%BF

# 使い方

① ここからzipをダウンロードするか git clone します。 -> [download](https://github.com/h1day/Old_Right_Click_Menu_For_Win11/archive/refs/tags/v0.1.zip)

  https://github.com/h1day/Old_Right_Click_Menu_For_Win11

② "install.bat"を実行します。

③ 警告が出るので「詳細情報」→ 「実行」で実行します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/167d4245-b20e-63bf-2dac-5dbb8847e6cd.gif" width="400px">

# 戻し方

① "uninstall.bat"を実行します。

② 警告が出るので「詳細情報」→ 「実行」で実行します。

# 仕組み

この記事の内容を実行するバッチファイルです。

https://www.pcgamer.com/windows-11-context-menu-fix-right-click/

レジストリを変更してエクスプローラーを再起動します。

# 参考

https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/reg-add

https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/reg-delete

https://stakiran.hatenablog.com/entry/2018/11/14/193053
Python(pandas)でファンチャートを作る

#0. はじめに

たまには小ネタ記事を。

よくテレビとかで出てくる「ある地点の＊＊を100としたときに」っていうグラフがあります。
これファンチャートって言うらしいんですが、これをPandasのMap関数等でどう作成すればいいか？にお恥ずかしながら30分くらい工数かかってしまったので、どこかの誰かの為に残しておきます。

`「pandas ファンチャート」でググってもHitしませんでした`ので・・(Excelは多かったけど)


参考：[ファンチャートとは？](https://www.weblio.jp/content/%E3%83%95%E3%82%A1%E3%83%B3%E3%83%81%E3%83%A3%E3%83%BC%E3%83%88)


#1. サンプルデータ作成

サンプルとして適当なデータを作成します
※この程度なら実際はごり押しでもできますが、カラム数がうん千だときついですよね。。

```Python:
import pandas as pd
df = pd.DataFrame({ 'A' : [1, 2, 3, 4, 5],
                    'B' : [10, 20, 30, 40, 50],
                    'C' : [500, 400, 300, 200, 100]
                  })

display(df.head())
display(df.plot())
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/e08a386e-c74f-0681-90b3-5db184157ab4.jpeg" alt="wordcloud" width=60%>



#2. ファンチャート作成

今回は0行目を「100」としてPandasのMAP関数を使用して処理していく。

数式は簡単で `変換後の値 = (*行目の要素 × 100) ÷ 0行目の要素` となるわけだが、`個人的に詰まったのはMAP関数でどうやって0行目の要素っていうのを処理すればいいか？`に関してです。

結論から言うと**`functools.partial() `を使用すれば部分的に変数を固定にできます。**

```Python:
from functools import partial

def fanchart(x, y):
    """計算関数"""
    return (x*100)/y

"""
・各カラムにMAP関数+partial関数を適応(for使わなくてもできるかもですが。。)
・y=df[i][0]で関数内の引数yを0行目の要素で固定している
"""
for i in df.columns:
    df[i + '_fan'] = list(map(partial(fanchart, y=df[i][0]), df[i]))

display(df.head())
display(df.plot(y=['A_fan', 'B_fan', 'C_fan']))
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/423a92d9-1728-7a15-d2d5-6e91e18f38e0.jpeg" width=60%>


#3.さいごに

Pandasも業務やプライベートで結構使ってるので、ようやく慣れてきたかなぁ・・・と思ってたけど全然そんなことなかったですね。
いつも小難しい記事ばかり書いてたので、たまにはと思って小ネタを今回は書かせていただきました。
**おっ、ちょうど困ってて参考になった！という人は私の30分との等価交換(笑)でぜひLGTMお願いします！**



#4.追記

コメントにご指摘いただきましたが、これわざわざMAP関数使わなくても以下で簡単に実現できましたね。。
まだまだ精進します。。

```Python:
df*100/df.loc[0]
```
新人エンジニアの備忘録(LINEBotをGASで作る)

新人エンジニアの備忘録。初投稿なので文面・内容等は随時更新します。

#GAS修正後に更新内容を反映したい場合は、以下の手順を行う
　1：[デプロイ]→[デプロイの管理]
　2：✐(エンピツマーク)を押す
　3：[バージョン]→[新バージョン]を選択
　4：[デプロイ]すると修正内容が反映される

#LINE Developers　→　Webhook設定の検証時にエラーが出る(エラー　ボットサーバーから200以外のHTTPステータスコードが返されました。（401　Unauthorized））
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
　事前確認
　1：[デプロイ]→[デプロイの管理]
　2：[アクセスできるユーザー]が「全員」になっているか？
　　（初期設定では「自分のみ」になっている？）
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
　1:[デプロイ]→[新しいデプロイ]
　2:[種類の選択]→[ウェブアプリ]
　3:[アクセスできるユーザー]→[全員]→[デプロイ]
　4:ウェブアプリのURLをコピー
　LINE Developersへ移動
　5:Webhook URL→[編集]からコピーしたURLを貼り付け
　6:[検証]を押し、[成功]とポップされれば反映完了
　→反映出来たら実際にLINEを開いて確認！

#通知BotであればdoPost(e)関数で作成可能
<details><summary>*doPost(e)とは？*</summary>
→WebアプリケーションにPostリクエストがきた時に実行される関数
</details>
ここを理解するには、GASではなくJavaのHttpSessionを勉強すると良い。
PyCharm CommunityでDjangoをインストールする方法

#無料版だとコマンドラインで環境を作る

PyCharm Community番だと、新しいプロジェクトからDjangoを作れないので、
コマンドライン上でDjangoプロジェクトを作る必要があります。

だいたいこんな感じ

#Python仮想環境をインストールする

まず、Python仮想環境を起動します。JavaでいうJava仮想マシンみたいな感じですね
このコマンドで、プロジェクトのディレクトリにenvフォルダが出来るはずです。

```.bash
python -m venv env 
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2007683/4246dfeb-cac2-2406-b3ce-edb8451a7df1.png)

#仮想環境を起動する


次にインストールした仮想環境を起動します

```.bash
env\Scripts\activate
```

すると、PowerShellの右側に(env)マークが出来るので
これが**仮想マシン**上で動いていることが分かるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2007683/c8b4be02-b727-ac80-571a-6e73a650b7f2.png)

#Djangoのインストール

次にDjangoをインストールして

```.bash
pip install django
```

プロジェクトテンプレートを作成します

```.bash
django-admin startproject pycharmtut
```

（この時、ウィルスソフトが反応することがありますが無視）

manage.pyを含む下記フォルダが出来ていたら完成です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2007683/d46d77b1-1f97-dc8f-f489-9fde48fd42d6.png)

無事、起動画面も作成できました！ヾ(｡>﹏<｡)ﾉﾞ✧*。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2007683/88273017-cfcf-71f5-78a8-0c5105a08759.png)

こんな感じで、無料版でもDjangoプロジェクトは作成できます！
どんどんWebサービスを作っていしまいましょう！

参考記事

https://www.tabnine.com/blog/how-to-create-django-projects-in-pycharm-community-edition/
Java Silverアウトプット

12月からエンジニアとして働くことになったnishioです。

正社員の条件として1年以内にJava silverの資格の取得が必須なので下記の2冊の本を使って学習しています。学習したことを章ごとや間違ったもの等アウトプットしていきたいと思います。ここでは紫本と呼ばれているオラクル認定資格教科書の1章で学習したことをアウトプットしていきます。

https://www.amazon.co.jp/%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8-Java%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E-Silver-SE11%EF%BC%88%E8%A9%A6%E9%A8%93%E7%95%AA%E5%8F%B71Z0-815%EF%BC%89-%E5%B1%B1%E6%9C%AC/dp/4798162043/ref=asc_df_4798162043/?tag=jpgo-22&linkCode=df0&hvadid=342428724851&hvpos=&hvnetw=g&hvrand=7509921977545161508&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009324&hvtargid=pla-841201003642&psc=1&th=1&psc=1

https://www.amazon.co.jp/dp/B07YWKWBBD/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

・JDKはJavaの環境構築で必要でOracle社だけでなくRed Hat社、Azul Systems社など様々なベンダから提供されており有償、無償とある

・Javaはどこでも動く

・main()メソッドは「public static void main(String[] args){...}」と記述する。

・「String[] args」は「String args[]」でも可

・「public static void main(string[] args){...}」、「public static main(String[] args){...}」、「public static void main(String[]){...}」はコンパイルエラーとなる。

・「public static void main(String args){...}」、「public void main(String[] args){...}」、「public static void Main(String[] args){...}」は実行時にエラーとなる。

.import分文とpackage文を同時に記述する場合はpackage文が先

・パッケージ名は大文字、小文字、単体名は使用可能
【Git】バイナリファイルがコンフリクトを起こした場合

## はじめに
チーム開発において、現在いるfeatureブランチに他のメンバーが更新したdevelopブランチをマージしようとしたとき、以下のようなコンフリクトが発生した。

```bash
$ git merge develop
warning: Cannot merge binary files: .DS_Store (HEAD vs. develop)
Auto-merging .DS_Store
CONFLICT (content): Merge conflict in .DS_Store
Automatic merge failed; fix conflicts and then commit the result.
```

ソースコードが書いてあるファイルの場合、手動で修正し、コミットすればいいが、`.DS_Store`のようなバイナリファイルの場合、コンフリクトをどのように修正するのか調べてみた。

## 方法
「**マージされるブランチ**もしくは**マージするブランチ**どちらか片方のブランチにあるファイルを全面的に採用する」というコマンドを使う。

* マージされるブランチ（= 現在いるブランチ）にあるファイルを採用したい時
`git checkout --ours 対象ファイル`

* マージするブランチにあるファイルを採用したい時
`git checkout --theirs 対象ファイル`

その後はいつも通り`add`して`commit`すればコンフリクトが解消される。

#### 追記
バイナリファイル等の手動で修正することができないファイルが複数あり、ブランチ単位で指定したい場合は以下のコマンドを使う

* マージされるブランチ（= 現在いるブランチ）を採用したい時
`git merge -Xours ブランチ名`

* マージするブランチを採用したい時
`git merge -Xtheirs ブランチ名`

# 参考

[[git]マージ時のコンフリクトで片側の変更だけ適用する方法](https://qiita.com/nantekkotai/items/2ed17c3d774211d234a49)
[マージでバイナリファイルがコンフリクトした場合のGitの動作と対処方法](https://blog.ruedap.com/2011/07/20/git-merge-conflict-binary-file)
20211010 Word 16.0.14430.20234 の表示が致命的にバグって対策がわからない

Language Japanese
Version 16.0.14430.20234
Place "C:\Program Files\Microsoft Office\root\Office16\WINWORD.EXE"

現象
この現象は起動したあと、しばらく使っていると2回発生した。
バックステージあらゆる表示がダブってわけがわからない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/41af10a2-cb55-0900-2980-8af16580aee7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/76b23c03-facc-9a72-6c3b-47bcb8759663.png)


通常の印刷レイアウト、ツールバー左側にページのサムネイルが現れて消えない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/efe9fa7a-2b68-4bc4-1a5f-7752f10958df.png)

今まで入力した文字が見えなくなるそして、サムネイルのようなものが表示される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/660fbf76-a041-706f-bb9a-61c40fdbce1c.png)

これはVBAを動かしたとかではなく、NotePad（メモ帳）からテキストをコピーしても発生する。

なお、印刷レイアウト表示にしても文字は見えないか、はるか下にある。

Wordを再度立ち上げ直して、ファイルを開くともとに戻るようだ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/056d6629-7d5a-09ba-b433-69d5f303f9e2.png)
さすがアジャイル開發。神経を逆撫でする素晴らしい機能だ。

原因
発生は10月3日医工らしく、Wordのアップグレードに起因しているようだ。
さらにこれが発生する条件は、箇条書き機能を使用していることらしい。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Wordで箇条書き機能使ってるのに、インデントだけ動いて行頭文字が表示されないの、不具合？履歴付きで動かしてるとよくなる気がする。困る。</p>&mdash; dozen (@dass718) <a href="https://twitter.com/dass718/status/1445688404348264452?ref_src=twsrc%5Etfw">October 6, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

このツィートでは箇条書きとは書いていないが、使っていると思われる。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">レポート最後の文章書いた瞬間にwordの表示バグって心臓止まりかけた</p>&mdash; みねすと (@minest_dayo) <a href="https://twitter.com/minest_dayo/status/1446834816905723912?ref_src=twsrc%5Etfw">October 9, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 


条件は不明だが、使っている途中で発生するということで同じことが起きているようだ。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">自分は自分でWordがバグって機能がゴミのようになり(互換モードとかいうよく分からん表示が急に出てきた)ボックスがグチャグチャになったの3日は恨むからな</p>&mdash; カズネ (@waon0918) <a href="https://twitter.com/waon0918/status/1445045096815030275?ref_src=twsrc%5Etfw">October 4, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 


当面はバックアップをこまめにして、使い終わったら、いったん終了させるしかないようだ。
【iOS】Metal Best Practicesの解説（14）パイプライン

[Metal Best Practices](https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/MTLBestPracticesGuide/index.html#//apple_ref/doc/uid/TP40016642-CH27-SW1)は、iOS／MacOS／tvOSのAPIであるMetalを用いた設計のベストプラクティスガイドです。

本稿では、何回かに分けてこのガイドを読み解き、コード上での実験を交えて解説していきます。
読んでそのまま理解できそうなところは飛ばしますので、原文を読みながら原文のガイドとしてご利用下さい。
また、iOSの記事なので他のOS(MacOS, tvOS)についての記載は割愛します。

他の記事の一覧は、初回記事よりご覧下さい。

https://qiita.com/TokyoYoshida/items/521619d6d8dd8d8ef9e4

### [Pipelines (パイプライン)](https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/MTLBestPracticesGuide/Pipelines.html#//apple_ref/doc/uid/TP40016642-CH25-SW2)

ベストプラクティス：レンダーパイプラインと計算パイプラインを非同期で構築します。

render pipelineやcompute pipelineの構築は非同期に処理すれば並列性が高まりパフォーマンスが向上するという話です。

Metal Best Practiceでは、遅延読み込みを回避するために使いましょうという書き方がされていました。つまり、パイプラインの構築はコストがかかるので遅延読み込みを使いたくなるけれど、それをするぐらいなら事前に非同期に構築しておけば、初期化の際に処理をブロックしないし、必要なときには用意されているので並列性が上がりますよ、ということですね。

### 結論

今回は適切なサンプルが思い浮かばなかったので、コードの検証はしませんでした。大量にパイプラインを作る必要がある場合は、非同期にパイプラインを構築する手法を使えばパフォーマンスが向上しそうですね。

### 最後に

今回でMetal Best Practiceの解説は終わりです。
これまで読んでくださった皆さま、ありがとうございました😄

iOSを使った3D処理やAR、ML、音声処理などの作品やサンプル、技術情報を発信しています。
作品ができたらTwitterで発信していきますのでフォローをお願いします🙏

Twitterは作品や記事のリンクを貼っています。
https://twitter.com/jugemjugemjugem

Qiitaは、iOS開発、とくにARや機械学習、グラフィックス処理、音声処理について発信しています。
https://qiita.com/TokyoYoshida

Noteでは、連載記事を書いています。
https://note.com/tokyoyoshida

Zennは機械学習が多めです。
https://zenn.dev/tokyoyoshida
【Vue.js】 v-bindについて 


#はじめに
こんにちは！　松本　佑大（まつもと　ゆうだい）と申します！
今回はv-bindについてアウトプットしていきます！

# V-bindとは
v-baindとは**要素に含まれる属性を動的に設定・変更することが出来る設定方法**です。
オプションに指定したデータを、**データバインディング**することでテキストが表示されます。

データバインディングとは**データと描画を同期する仕組み**のことです。

#書き方

基本的な書き方は以下のようになります。

```HTML
<div id ="app">
 <input type ="text" v-bind:value="message">
</div>
```

```Vue.js
var app = new Vue({
    el:'#app',
    data:{
        message:'Hello vue.js!'
    }
})
```

![スクリーンショット 2021-10-10 15.30.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/5ea34219-a073-006f-2935-48c19f17f9d5.png)


このように、`input`の`value`属性に`message`プロパティをバインドすることで、上記のように`input`の入力欄に`Hello vue.js!` と表示することができます。
※属性にマスタッシュ構文は使用できません


#まとめ
属性へのデータバインディングでは、
❌　マスタッシュ構文 {{ 〇〇〇〇〇〇 }}　
ではなく、
⭕️　v-bind:value="〇〇〇〇〇〇"
を使用しましょう！

#最後に
今回はv-bindについてアウトプットしました。
もし認識の仕方が間違っていましたら、コメント等頂けると幸いです。

今後ともQiitaにてアウトプットしていきます！
ユーザビリティなフォームの作成①


#Vue.jsを使用して、ユーザビリティなフォームの作成。

##完成例

###通常時
![ユーザビリティ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1061608/c0d50af0-eed2-19ec-b13f-e509836d05be.png)

###フォーカス後
![ユーザビリティ後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1061608/15b6d86f-de12-22b6-e0fa-65e998f7d6cb.png)

このように、フォーカス後にフォームの色をグレーから白に変えていきたいと思います。

##inputタグにV-onイベントを設定

- フォーカスされた時に@focusinを発火させ、startEditingを実行
- フォーカスされていない時は@focusoutを発火させ、finishEditingを実行
 
```vue
<input v-model="title" 
       type="text" 
       class="text-input"
       placeholder="Add new list"
       @focusin="startEditing"
       @focusout="finishEditing"
>
```

```js
data() {
  return {
    title: '',
　　// 通常時はフォーカスしていないのでfalseに設定
    isEditing: false,
　}
},
methods: {
  addList() {
　  this.$store.dispatch('addlist', { title: this.title })
    this.title = ''
  },
  // フォーカスされた時
  startEditing() {
    this.isEditing = true
  },
  // フォーカスしていない時
  finishEditing() {
    this.isEditing = false
  },
}
```
####isEditingの状態がtrueの時だけactiveクラスを動的に追加します

```css
.active .text-input {
  background-color: #fff;
}
```
## computedでdataにあるisEditingの状態を監視

```js
data() {
  return {
    title: '',
    isEditing: false,
  }
},
// ★ここから追加
computed: {
  classList() {
    const classList = ['addlist']
    // isEditingがtrueならactiveクラスを追加
    if (this.isEditing) {
      classList.push('active')
    }
    return classList
  },
},
// ★ここまで追加
methods: {
```
#### 上記で定義したcomputedをformにバインドさせる

```vue
<form :class="classList" @submit.prevent="addList">
  <input v-model="title"
          type="text"
          class="text-input"
          placeholder="Add new list"
          @focusin="startEditing"
          @focusout="finishEditing"
  >
  <button type="submit"
          class="add-button">
    Add
  </button>
</form>
```
フォーカス後、フォームの色が変わっていたら成功です！
JavaScript ECMA ES6 などの言葉を整理する


## ECMA
- **エクマ**と読む
- 情報通信分野の**標準化**を行う団体である
- 参考：[ECMAとは](https://kotobank.jp/word/ECMA-1401)

## ECMAScript
- ECMAが定義するJavaScriptに関する標準規格である。
- 標準規格とは言わば**基準**のことで「JavaScriptに関する動作はこれに従ってくださいね」と言うもの
- **各種ブラウザでJavaScriptが独自の動作をすることが問題となり**、ECMAScriptが登場した模様


> It is a JavaScript standard meant to ensure the interoperability of web pages across different web browsers.　(Google翻訳：これは、さまざまなWebブラウザ間でWebページの相互運用性を確保することを目的としたJavaScript標準です) - [ECMAScript](https://en.wikipedia.org/wiki/ECMAScript)

- 現在ECMAScriptのバージョンは下記のものがある


| Edition | 略称 | 公開日 |
|:-----------|:------------|:------------|
|ECMAScript 1    |ES1	             | 1997年6月  |
|ECMAScript 2    |ES2		     | 1998年6月  |
|ECMAScript 3    |ES3		     | 1999年12月 |
|ECMAScript 4    |ES4		     | 破棄       |
|ECMAScript 5    |ES5		     | 2009年12月 |
|ECMAScript 5.1  |ES5.1		     | 2011年6月  |
|ECMAScript 2015 |ES2015 / ES6       | 2015年6月 |
|ECMAScript 2016 |ES2016 / ES7       | 2016年6月 |
|ECMAScript 2017 |ES2017 / ES8       | 2017年6月 |
|ECMAScript 2018 |ES2018 / ES9       | 2018年6月 |
|ECMAScript 2019 |ES2019 / ES10      | 2019年6月 |
|ECMAScript 2020 |ES2020 / ES11      | 2020年6月 |
|ECMAScript 2021 |ES2021 / ES12      | 2021年6月 |
- 参考：
  - [JavaScriptとECMAScriptの違い](https://www.javadrive.jp/javascript/ini/index11.html)
  - [ECMAScript](https://en.wikipedia.org/wiki/ECMAScript)



## ES6
- 上記表によると、ES6はECMAScript 2015の略称となる

## 各種ブラウザとECMAScriptについて
- 各種ブラウザとECMAScriptの対応状況については下記サイトが参考になる
- [ECMAScript 6 compatibility table](https://kangax.github.io/compat-table/es6/)

## その他の用語
### TC39
- TC = Technical Committee = 専門委員会のこと
- TC39はECMAScriptを策定している委員会のことである
- ECMAは色々な技術に関する標準化を行っている。39番目の委員会がECMAScriptに関するもの
- TC39のgithub -> [Ecma TC39](https://github.com/tc39)
- 参考：[TC39](https://azu.github.io/slide-what-is-ecmascript/slide/4.html)

### ECMA-262
> - ECMAScriptの事
- 262はEcma Internationalでの管理番号
(参考：[ECMA-262](https://azu.github.io/slide-what-is-ecmascript/slide/3.html))
KeyCloakをarm64環境のDockerで動かす

# GitHubからDockerfileを取得
使用するリポジトリは以下

https://github.com/carlosedp/keycloak-containers.git

>$ git clone https://github.com/carlosedp/keycloak-containers.git

# Dockerfileを修正
利用するKeyCloakのバージョンを変更

> -ENV KEYCLOAK_VERSION 12.0.1
> +ENV KEYCLOAK_VERSION 15.0.2

# Docker build

>$ docker build -t kc:v15 .

# Docker Run

>$ docker run -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin -p 8120:8080 -d -it kc:v15
Amazon DynamoDBの新しいコンソールに対する不満点

# はじめに
2021/8/25にAWS DynamoDBは新しいコンソール画面がデフォルトとなりました。
https://aws.amazon.com/jp/about-aws/whats-new/2021/08/amazon-dynamodb-console-manage-data-resources/

見た目は非常にシンプルで良いのですが、如何せん使い勝手が悪いというのが印象です。
これから改善されていくとは思いますが、不満点について残します。

※本不満は2021/10/7時点の元です。
　すでに解決されている可能性もありますので、ご注意ください。

# 新しいコンソールに対する不満
## クエリ/スキャンの結果がリセットされない
DynamoDBでレコードの確認をよくする際に、パーティションキーでクエリ検索することがよくあります。
新コンソールでは「実行する」「元に戻す」があるのですが、「元に戻す」で検索結果がリセットされません。

旧コンソールでは他のテーブルに異動した後に戻ると検索結果がリセットされますが、新コンソールではリセットされません。
新コンソールではDynamoDBを再度開きなおす必要があります。

## 追加レコードが反映されない
APIやプログラムで新しいレコードを追加した後、追加先のテーブルを確認しても反映されない場合があります。

旧コンソールではテーブル画面の右上にある更新ボタンをクリックすると、すぐに反映されます。
新コンソールでは更新ボタンがテーブル一覧の部分にしかなく、この更新ボタンをクリックしてもテーブルが再度読み込まれることは内容です。


# 最後に
DynamoDBの左メニューの最下部には「ご意見をお聞かせください」という項目があり、新コンソールに対するコメントをフィードバックできます。
これにより、新コンソールが改善することを期待します。
正規乱数の生成法

# 正規乱数の生成法

正規乱数を生成する方法として，`rand( )` の第1引数に `Normal(μ, σ)` を指定する方法と，`randn( )` で標準正規乱数を生成して線形変換する方法がある。

## `rand( )` による方法


```julia
using Distributions
d = Normal(50.0, 10.0)
```




    Normal{Float64}(μ=50.0, σ=10.0)




```julia
x = rand(d, 1000000);
```


```julia
using Statistics
```


```julia
mean(x)
```




    49.992122684571775




```julia
std(x, corrected=false)
```




    10.011372632539898



## `randn( )` による方法


```julia
y = randn(1000000) * 10.0 .+ 50.0;
```


```julia
mean(y)
```




    49.998784228855804




```julia
std(y, corrected=false)
```




    10.001876233453125



## 速度比較

前述の 2 方法を `a`, `b` の関数とし，それぞれを 100 回繰り返して呼びだし，累積実行時間を求める関数 `f` を書き，実行する。


```julia
a(n) = rand(Normal(50.0, 10.0), n)

b(n) = randn(n) * 10.0 .+ 50.0;

function f(FUNC; n=1000000, loop=100)
    for i = 1:loop
        FUNC(n)
    end
end
```




    f (generic function with 1 method)



以下に示すように，`randn( )` の結果を線形変換する方法のほうが 1.7 倍ほど速い。


```julia
@time f(a)
```

      1.336329 seconds (200 allocations: 762.947 MiB, 2.74% gc time)



```julia
@time f(b)
```

      0.754293 seconds (600 allocations: 2.235 GiB, 13.41% gc time)



```julia
1.336329 / 0.754293
```




    1.7716311831078906



## 完全に指定した母平均，母標準偏差になる正規乱数を生成する

生成された正規乱数の平均，標準偏差が，指定した母平均，母標準偏差になるようにする。<br>
母平均値=0，母標準偏差=1 を指定しても，生成された標準正規乱数の平均値=0，標準偏差=1 ではない。<br>
そこで，まずこの正規乱数を標準化する。つまり，平均値=0，標準偏差=1 になる。<br>
次に，この標準正規乱数を指定された母平均，母標準偏差になるように線形変換する（標準化の逆）。


```julia
function c(n, μ, σ)
    x = randn(n)
    ((x .- mean(x)) ./ std(x, corrected=false)) .* σ .+ μ 
end
```




    c (generic function with 1 method)




```julia
x = c(10000, 50, 10);
println("mean = $(mean(x)), sd = $(std(x, corrected=false))")
```

    mean = 50.0, sd = 9.999999999999998


蛇足であるが，関数 `c` の中で `randn( )` を使ったが，ここは `rand( )` でも，極端な場合には `1:n` でもなんでもよい。それぞれ得られる乱数の分布の形は違うが，指定された母平均，母標準偏差と全く同じ乱数を作ることができる。


```julia
n, μ, σ = 100, 50, 10
y = rand(n) # 一様乱数
y = ((y .- mean(y)) ./ std(y, corrected=false)) .* σ .+ μ
println("mean = $(mean(y)), sd = $(std(y, corrected=false))")
```

    mean = 50.0, sd = 9.999999999999998



```julia
n, μ, σ = 100, 50, 10
z = 1:n # 等差数列
z = ((z .- mean(z)) ./ std(z, corrected=false)) .* σ .+ μ
println("mean = $(mean(z)), sd = $(std(z, corrected=false))")
```

    mean = 50.0, sd = 9.999999999999996
link_toでパラメーターを送信する

has_many belongs_toで関連付けを行っているモデルで、ちゃんと情報が取れるかの確認をしていたら結構時間がかかってしまったのでメモ

<h1>関連付け</h1>
belongs_toとhas_manyを使います。

基本的にhas_manyは親,belongs_toが子です。

例えばUserモデルとTweetモデルがあったとして、
Userは1つ以上のTweetがあることが想定されるので、User has many Tweet
Tweetは1人のユーザーしか持たないので Tweet belongs to User

みたいな感じになります。
わかりにくかったら公式を読んでください。

<h1>実装</h1>
今回使うのはPostとPostProductの2つのモデル

UserとPostだけであれば新規のPostデータに外部キーである(user_id)を含めるのは簡単なのですが、
今回はPostのデータを取得することから始めないといけなかったので苦戦しました。
postが持っている情報は確認できるのですが、それをpostproductで使おうとしたら情報が取れないのでエラーになりまくりでした。

formでhidden_fieldを使うことも考えましたがそもそも取れてないので却下

いろいろ調べてたところ、link_toでパラメーターが送れることがわかった。

```
<%= link_to "リンク名", example_path, カラム: カラムに対する値, class: "css" %>
```

この書き方で送れるとのこと。
僕はこんな感じで使いました。

```
<%= link_to "投稿に商品追加", post_post_products_path(@post) post_id: @post.id, class: "dropdown-item" %>
```

送るだけじゃ使えないので、レシーバーにも処理を書きます。

```ruby:post_product_controller.rb
  def index
    @post = params[:post_id]
  end
```

これでidを渡すことができました！
ですが、これだと @postに入っているのはidだけなので意味がありません。

```ruby:post_product_controller.rb
  def index
    post = params[:post_id]
    @post = Post.find_by(id: post)
  end
```

find_byを使うことでidに対応する情報を持ってくることができます。

以上です。
【AWS】EC2インスタンスのSSH接続時のタイムアウト問題の解決

#Operation timed out 発生

AWSで仮想サーバーであるEC2インスタンスを作成しました。
MACにターミナルでコマンドを打つ練習のため、SSHでネット接続を試みました。

![スクリーンショット 2021-10-10 2.55.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638561/a7b3aa3a-1f3b-2865-6328-79d00d1e975b.png)
ところが、下記画像のように接続がタイムアウトと表示されてしまいます。
EC2がSSH接続ができていません💦
何故ぇ？((((；ﾟДﾟ)))))))
![スクリーンショット 2021-10-10 2.45.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638561/dd27f25a-9115-f284-7a5e-9bf2108aef74.png)


#結論：原因はVPC
結論として、原因は自分のVPC環境に問題がありました。<BR> 
課金を避けるためにAWSで不要なリソースを削除した際に、 
**デフォルトのリソースの必要な部分まで削除してしまった**のがタイムアウトを招いていました。具体的にはインターネットゲートウェイを.....。
VPCとインターネットを繋げる為の出入り口を自ら破壊してしまったので、接続が出来るわけがないという💦

そうなると、インターネット接続するために、デフォルトのVPCで必要なリソースを作り直して再度アタッチするか、全て自分の手で作り直してみるのも良いと思います。
自分は後者にしました。

#VPCの主なリソース

VPCの最低限必要なリソースが下記です。
**※今回、IPアドレスを固定しないのでEIPは不使用**

| リソース名 | 説明 |
| :--- | :---: |
| VPC | Virtual Private Cloudの略<BR> インターネットの中で小分けに区切った空間内に必要なリソースを構築していく。| TD |
| サブネット | VPC内でさらに細かくネット空間を設定できる。<BR>公開用のアプリを載せるパブリックサブネットや、公開しないデータベースを載せるプライベートサブネットを用途に合わせて作成できる。 | TD |
| ルートテーブル | サブネットに関連づける。サブネットからインターネットに向ける通信を決めるルール。通信経路（ルート）となる宛先とゲートウェイを組み合わせる。 | TD |
| インターネットゲートウェイ | VPCにアタッチする。VPCとインターネットを接続し、通信を可能にする出入り口　**※超重要**| TD |

※下記はdrowioで作成した図です。
構成図を書くのも慣れが必要ですね((((；ﾟДﾟ)))))))
![vpc_drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638561/a39ce259-4190-d2d3-03b4-fae5826c9af2.png)

#VPC関連のリソースを作成したらリソース間でアタッチを忘れずに
上記のリソースたちを作成しただけだと、まだバラバラなリソースが存在しているだけです。そのため、リソース間の紐付けが必要です。

**①ルートテーブルにインターネットゲートウェイをアタッチします。送信先はインターネットゲートウェイ作成時に0.0.0.0/0としています。**

![スクリーンショット 2021-10-10 14.30.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638561/c3432b7f-f81b-1158-b25d-eb335690ae2c.png)

**②VPCにインタネットゲートウェイをアタッチします。**
![スクリーンショット 2021-10-10 14.34.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638561/5208e60a-bee9-9688-98ec-9f633e7724df.png)

これでVPC用に作成したリソースたちを紐づけたので、あとはEC２インスタンスを新たに作成するときにネットワーク欄に今回作成したVPCを選択します。

![スクリーンショット 2021-10-10 14.40.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638561/33241bce-ddec-bd7a-0eee-c07411c3b6db.png)

#SSH接続成功

![スクリーンショット 2021-10-10 14.52.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638561/97d65916-c78d-148e-6f20-63904f0b7057.png)

EC2インスタンスを新たに作ったので、パブリックIPv4アドレスを使って、MACのターミナルで再度SSH接続を行なってみます。

![スクリーンショット 2021-10-10 14.54.55のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638561/61623eca-b966-e527-6bf6-468cc990d2bc.png)

今度はEC2インスタンスがちゃんとSSH接続できました。

デフォルトのVPCでは通常問題なくSSH接続できるはずが、自分でリソースを弄った結果,
接続がうまくいかずに「？？？」となっていました。
VPCを自分で作るときはリソースの設定やアタッチをする事も出てくるので、何故タイムアウトが起きたのかを記録に残したく書いてみました。

___
この記事はAWS初学者を導く体系的な動画学習サービス
「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com
___
Reactを基本からまとめてみた【12】【React Context】

##React Contextとは

React Context は配下の子コンポーネントにデータを渡すための便利な方法で、従来は props を使用することで、子コンポーネントにデータを渡していたが、コンポーネントのネストが深くなると非常に面倒で複雑になる。 Context を使用することで 認証 や UI テーマ など多くのコンポーネントが使用する情報を共有して保持・取得できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939638/75497834-dd9f-6c93-956d-eb47a20cfa90.png)

##なぜ Context を使うのか

React Context を使うと、コンポーネントツリーの指定した部分で、共通に使えるデータストアを簡単に実装でき、ステート (state, 状態) をそのまま使うこともできる。
しかし、例えば、親ノードで定義したステートを孫ノードで変更しようと思ったら、 変更の要求を孫から親の親へと伝えないといけない場合が出てくる。これは煩わしく、仕組みも複雑になり、メンテナンスしにくいコードになる場合が多い。

そこで、Context を用意する。Context からデータをとって使い、変更が必要ならそこで行うようにする。

##Context API で登場するモノと役割

React では Context を使えるようにするための仕組みが、『Context API』 として用意されている。Context オブジェクトを作るには createContext() 関数を呼ぶ。
Context には、関連付けされた『プロバイダ (Provider)』と『コンスーマ (Consumer)』がある。
#####Provider の役割は大きく二つあり、『コンテキストの適用範囲を決めること』『コンテキストにデータを置くこと』である。
#####Consumer はコンテキストからデータを取り出して使うために使う。コンスーマでコンテキストからデータ変更用の情報も渡されれば、データの更新をすることもできるようになる。

##Provider の基本的な実装

Context オブジェクトの作成と Provider の基本形は次のようになる。

```sample.js
import React, { createContext } from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import './index.css';

const fruits = ['Apple', 'Orange', 'Banana'];
export const FruitContext = createContext();

ReactDOM.render(
  <React.StrictMode>
    <FruitContext.Provider value={{ fruits }}>
      <App />
    </FruitContext.Provider>
  </React.StrictMode>,
  document.getElementById('root')
);
```

7 行目で useContext() 関数を使って Context オブジェクトを作成する。
※後で Consumer で参照するので export する。
11 行目と 13 行目で App 要素を取り囲む。
これによりコンテキストのスコープが、コンポーネントツリーにおける App 以下になる。
また 11 行目で、 value プロパティに、データソースとなる配列を渡す。

##Consumer の基本的な実装

プロバイダ側でコンテキストにセットしたデータ (ここでは fruits) は、Consumer で受け取ることができる。

```sample.js
import React from 'react';
import './App.css';
import { FruitContext } from './index';

function App() {
  return (
    <FruitContext.Consumer>
      {(value) => {
        const { fruits } = value;
        console.log(fruits); // ["Apple", "Orange", "Banana"]
        return (
          <h1>...</h1>
        )
      }}
    </FruitContext.Consumer>
  );
}
export default App;
```

7 行目から 15 行目で Consumer を使う。
8 行目のアロー関数のパラメータとして、Provider 側で value プロパティに渡したオブジェクトが渡される。
9 行目で分割代入を使って、value から fruits を取り出す。

##useContext フックを使った Consumer の基本的な実装
さらに useContext フックを使うと、Consumer がシンプルにかくことができる。

```sample.js
import React, { useContext } from 'react';
import './App.css';
import { FruitContext } from './index';

function App() {
  const { fruits } = useContext(FruitContext);
  console.log(fruits); // ["Apple", "Orange", "Banana"]
  return (
    <h1>...</h1>
  );
}
export default App;
```
FruitContext.Consumer 要素を作成しなくても、useContext フックを使うことで、Consumer に渡される value が直ちに取得できる。



##参考サイト
[【レタ返】React Contextについて]
(https://www.youtube.com/watch?v=ei13nR-0b54)
[Everything you need to know about React’s Context API]
(https://morioh.com/p/81b0082d72cd)
[AWS Amplify での Cognito アクセスは React Context.Provider を使って認証処理を Hooks 化しよう]
(https://qiita.com/G-awa/items/99cb84c62fcd113943a6)
[React Context とは？]
(https://react.keicode.com/basics/context-basics-overview.php)
【初学者奮闘録】Gitのコマンド操作について復習（個人開発編）

#はじめに
この記事は、独学開始から約３ヶ月の実務未経験者が作成したものです。
よって、スキルは非常に未熟なため、決して本記事の内容を鵜呑みにされないよう、ご注意ください。
（未熟な私が記事投稿を行なっている背景については、本文の最後にお伝えします。）

#Gitを復習しようと思った理由
私が初めて自作Webアプリを開発した時にGit(Github)を使用いたしました。
しかし、どのような仕組みで動いているかをしっかりと理解せぬままに、使用しておりました。

ショボいアプリを１人で開発するのであれば、お粗末なコマンド操作で問題ありません（多分・・・）。
しかし、エンジニアとして就職したい私にとって、Gitの技術は必要不可欠です。
よって今回、私が個人開発した時に使用したGitコマンドを中心に復習します。

###参考資料
今回参考にした動画を下記に添付いたします。
https://www.youtube.com/watch?v=f4BRgGAXyek
Gitの流れが動画で解説されており、また図でも示されているため、非常に分かりやすいです。
まずはこの動画を視聴されることをおすすめいたします。
そして、復習のために、下記の稚拙な記事を読み、記載内容の不備を探しながら知識の定着に繋げていただければと思います。
（記事の内容については、不備のないように全力は尽くしております。）
よろしければコメント等でご指摘いただければ、嬉しいです。

##ローカルの基本操作；情報の輸送

　Gitは、ワークツリー➡︎ステージ➡︎リポジトリと３つの段階に分けて情報を輸送していきます。

###①ワークツリー➡︎ステージへ情報を輸送する際、以下のコマンドをターミナルに入力します。

```
git add "ファイル名、あるいはディレクトリ名（フォルダ名）"
```
ちなみに【git add .】とコマンドすると、ワークツリーで修正した全てのファイルをステージへ輸送されます。

###②下記コマンドを入力すると、現時点でステージ内にある全ての情報が、リポジトリへ輸送します。

```
git commit
```
また、以下のコードに変更すると、ステージの情報をリポジトリに輸送する際に、コメントを残すことができます。

```
git commit -m”２０２１/１０/１０ 村人Aがh1→pに修正”
```
修正理由が分かりやすいコメントを残すことにより、第三者が確認しても理解することができます。

###注意すべきポイント
①では、ワークツリー➡︎ステージへ情報を輸送する際、ファイルやディレクトリを指定することができるとお伝えいたしました。
しかし、ステージ➡︎リポジトリへ情報を輸送する際は、ステージにある情報全てがリポジトリへ輸送されてしまいます。
よって、任意で情報を小分けし、コメントを添付してリポジトリへと輸送したい場合、①でその処理を完了しておかなければなりません。

##ローカルの基本操作；変更の確認

続いては、ファイルの変更点を確認する方法について、解説します。

###①修正したファイル名を確認する
ワークツリーでファイルの内容を修正し、その修正内容をステージへ輸送したと仮定します。
上記のような修正サイクルを何度か繰り返すと、ふと「どのファイルの内容を修正して、ステージへ輸送したのか？」と疑問が湧きます。
その際に使うのが、下記のコマンドです。

```
git status
```
このコマンドを入力することにより、ワークツリーからステージへ情報を輸送したファイル名を確認することができます。
ただし【git status】では、修正したファイル名を確認することができますが、修正した内容を確認することはできません。
修正した内容を確認するためには、下記のコマンドを利用します。

###②ファイル内容の差分を確認する

リポジトリとワークツリーの内容の差分をターミナル内で確認する場合、以下をコマンド入力します。

```
git diff
```
また、ステージとワークツリーの内容の差分を確認する場合、以下をコマンド入力します。

```
gie diff --staged
```

##ローカルの基本操作；履歴の確認

次にリポジトリ内の変更履歴を確認するためのコマンドをお伝えします。

```
git log
```
上記を打ち込むことにより、リポジトリ内の変更履歴がターミナル上に表示されます。
コメントが記載された状態でリポジトリ内に輸送された情報については、そのコメントとともに履歴が表示されます。
また、【git log】には、様々なオプションが備わっております。
そのオプションを使用すれば、履歴の確認を効率的に行うことができます。
【git log】のオプションについてまとめてくれている記事を下記に添付いたしましたので、興味のある方はご確認ください。
https://qiita.com/take4s5i/items/15d8648405f4e7ea3039

##ローカルの基本操作；元に戻す

コードの修正途中でエラーが発生することは多々あります。
そんな時、全てを無にして、１からやり直したい場面もあります。
その場合、ステージやリポジトリでセーブしてあるデータをワークツリーに戻すことができるコマンドを紹介します。
まず、ステージでセーブしているデータをワークツリーへ戻すコマンドは以下の通りです。

```
git restore　--staged "ファイル名"
```
次にリポジトリでセーブされているデータをワークツリーへ戻すコマンドは以下の通りです。

```
git restore "ファイル名"
```
Gitコマンドの基礎理解は以上で終了です。


#最後に
上記でもお伝えいたしましたが、私は独学開始から約３ヶ月の実務未経験者です。
そんな未熟な私が記事を投稿しようと決意した理由は、以下の通りです。
・初学者の記事が多く出回るほどに、プログラミングの学習を検討している方の背中を押せると考えたから（私自身、学習を開始するまでに初学者の記事を読み漁っておりました）
・周りに同じ境遇の仲間がいない、孤独な初学者さんの競争心を掻き立てられるのではと考えたから（学習効率を上げるためにはライバルの存在は重要）
・あるいはこのような稚拙な記事を読んだ初学者さんが「自分のレベルはこいつよりも上」と優越感を与えられるのではと考えたから（学習効率を上げるためには自信を持つことも重要）

プロのエンジニア同様、初学者にもそれなりの努めがあると、私は思います。
今後も、下手くそながらも【初学者ページ】を上げ続けて参ります。

最後まで読んでいただき、誠にありがとうございました。
Doker-composeでMySQLコンテナを起動し、MySqlWorkbenchで接続する


## 環境
- MacOS Big Sur 11.6

## 目的
- 好きなようにSQLイジイジしたい

## すること

- Docker-composeでMySqlコンテナを起動する
- MySQL Workbenchで接続する
- MySQL WorkbenchでSQLをexportする
- MySQL WorkbenchでSQLをimportする



### Docker-composeでMySQLコンテナを起動する

- dockerコンテナを立ち上げるまでこれ通りに行う
  - https://blog.hiros-dot.net/?p=10469

```
docker 
  |---mysql
        |---data
        |---sql
```

```
% mkdir docker
% mkdir docker/mysql
% mkdir docker/mysql/data
% mkdir docker/mysql/sql
```

- mysql/my.cnfを作成

```
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

[client]
default-character-set=utf8mb4      
```

- ルートにdocker-compose.ymlを作成

```
version: '3'

services:
  mysqldb:
    image: mysql:5.7
    container_name: mysql_container
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: my_testdb
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      TZ: 'Asia/Tokyo'
    volumes:
      - ./docker/db/data:/var/lib/mysql
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
      - "3306:3306"
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
```

- Docker起動
- ルートでコンテナ立ち上げ

```
% docker-compose up -d
```

- コンテナ確認

```
% docker ps
```

``` 
% docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS          PORTS                               NAMES
d9fb41109241   mysql:5.7         "docker-entrypoint.s…"   26 minutes ago   Up 26 minutes   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql_container
```



### MySQL Workbenchで接続する
- こちらのサイトからダウンロードする
    - https://www.mysql.com/products/workbench/

- 以下の画像のように設定する
- 右下の Test Connectionで接続を確認する

![スクリーンショット 2021-09-30 10.19.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267662/439981f3-65eb-c616-ca23-791b8da305fb.png)


- パスワードは docker-compose.ymlで設定した `MYSQL_ROOT_PASSWORD: root`

![スクリーンショット 2021-09-30 10.21.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267662/81cf77df-6993-8743-0265-2b205cf7bf04.png)


- 接続が成功すると以下の画像が表示される

![スクリーンショット 2021-09-30 10.21.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267662/8a29f42c-2df8-1fd7-a51d-2b36082f989d.png)


### MySQL WorkbenchでSQLをexportする

- Server→Data Exportでdumpする
  - ExportするSchemaを選択する
- Start Exportでファイルが保存される



### MySQL WorkbenchでSQLをimportする

- 右クリックで Create Shemaを選択する
- Shema名を入力して、右下のApplyを押しShemaを作成する
- Server→Data Importで先程のdumpフォルダを選択する

以上、SQLでいじいじできるようになりました。
[メモ]RaspberryPiにUbuntuをインストールしSSH接続するまでが簡単だった

# 概要
以前手に入れて持て余していたRaspberryPiを勉強に使おうと思い、OSのインストールから行いました。
その際に「キーボードとかディスプレイ繋ぐのが面倒くさいな。。。」と思い、何とかならないかなーと調べてたら非常に簡単に何とかなったためメモとして残します。

行ったことはIPの固定だけです。
「Ubuntu 20.04 LTS」をインストールするだけでsshdは動いているので、
OS初回起動時からIPが固定されていると使い勝手が良いのでその設定だけ行いました。

# やったこと
cloud-initの設定ファイル「network-config」に固定したいアドレスを追記するだけ！

```yml:network-config
ethernets:
  eth0:
    addresses:          # ←ここを追記
      - 192.168.1.10/24 # ←ここを追記
#もとから記述してあったものはそのまま
```

# 感想
恥ずかしながらcloud-initというものを初めて知りました。
世の中便利ですね。

あまり自分で書くことがないため参考させていただいたURLをまとめて終わりにしたいと思います。

# 参考URL
[設定ファイルのドキュメント](https://cloudinit.readthedocs.io/en/latest/topics/network-config-format-v2.html)
[ラズパイのOSを「cloud-init」で簡単に設定（Ubuntu Server 20.04 LTS 64bit）](https://qiita.com/s8ta/items/ad1d8de95e8573194f95)
[Raspberry Pi に Ubuntu を入れて SSH でログインするまでの A to B](https://aquasoftware.net/blog/?p=1404)

関連記事に出てきてとても参考になったのでリンクを追加します
[【Ubuntu】 /etc/netplan/50-cloud-init.yamlを編集するの止めろ](https://qiita.com/yas-nyan/items/9033fb1d1037dcf9dba5)
AWS SOA落ちました。実技環境どうにかして欲しい

SOAの勉強を4ヶ月ほどして昨日受験しましたが、落ちてしまいました。
普通こういう記事は合格した人が何したとか書くと思うんですが、試験で思うところがあったので書きました。

今後受ける人の参考になればと思います

# SOA試験について

筆記試験と、今年7月から実技試験が入ってます。
実技試験の所感は、試験申し込むとラボ環境貸してくれるので、そこからわかると思います。

# 受けてみて

## 筆記試験

筆記の方はまあまあ良かった感触でした。
スムーズに終えて実技試験に130分くらい充てられる状態でした。

## 実技試験

ひどかった。
実技の仮想環境クソ重い。カーソルの動きは遅いし、何よりひどかったのが文字入力！
もう一文字打つのに10秒くらいかかってました。コピペを駆使する？コピーして貼り付けるのに1分以上かかってましたよ。あと全体の操作ももっさりだから辛い。

試験管に声かけて自分の端末の再起動はしたんですがダメでした。
というか、仮想環境の反応悪いんだからこっちいくら再起動してもダメだと思われます。

結局2回再起動して挙動が変わらず、試験管からは今回の試験の無効、払い戻しを提案されましたが、筆記終わってたしそちらはそこそこ良い点数になってるはずだし、実技も大問の2問中1問は何とか出来たから受かる可能性はあると思って続行しました。（2時間も時間使ってたしもったいないと思う気持ちもあった）結果ダメでしたが。。

# 最後に

私と同じように実技試験で操作が不自由するようなら試験官に伝えて無効にしてもらった方が良いと思います。筆記が早く終わったから不自由しながらやってましたが、トラブルがあったら実技に必要とされてる40分ではとても終わらないです。再起動中も時間は経過してますし。

ちなみに端末はMacのメモリ16Gのものでした。Mac自体に問題があったようには思えないのでこの情報はあんまり意味ないですが一応。

私はもう一回受ける予定です。筆記で補えなかった時点で思ったより理解度が浅かったと思うのでブラックベルト使って勉強します。

今回の試験は土曜日に受けたんですが、他にも試験受けてる人がいて回線が遅かったとかも考えられるので平日に受けます。また受けたら記事書こうと思います
Python シリアル値 日付変換

時々使用するシリアル値（例：44434.3412172569）から、
日付データ（yyyy/mm/dd HH:MM:SS）に変換する方法のメモです。

個人的に利用する頻度が高いので、備忘として残しておきます。

###シリアル値とは
超シンプルに言うと、「1900/1/1」から何日経過したかを数値で扱ったものです。
24時間を「1」として、「1900/1/1」からの経過日時を算出しています。

（シリアル値はExcelなどでもよく見かけます。）

###ソースコード

下記コードをコピペで利用可能です。

```python
def SerialToDateTime(serialVal:float) -> str:
    """日付シリアル値からyyyy/MM/dd HH:MM:ss 形式に変換
    Args:
        serialVal (float): シリアル値(Ex: 44434.3412172569)
    Returns:
        str: 時刻  yyyy/MM/dd HH:MM:ss 形式
    """      
    sDateTime = (datetime(1899,12,30) + timedelta(serialVal)).strftime('%Y/%m/%d %H:%M:%S')

    return sDateTime
```

以上、簡単ですがシリアル値から日付データに変更する方法でした！
PlantUML 環境構築 VSCode


##前提
* VisualStudioCodeが導入済み
* Javaの実行環境がある（PlantUMLはJVMで動いているため）
* 無い場合はOpenJdkを入れる。以下、導入参考ページ
    * windowsの場合：https://www.kkaneko.jp/tools/win/openjdk.html
    * Macの場合：https://hitori-goto.com/2021/01/27/mac-install-openjdk/

## PlantUMLのインストール
* Visual Studio Codeを開く
* 画面左部Extensionsを押下し、検索フォームに「PlantUML」と入力する
* 検索結果から「PlantUML」選択しインストールする。

![VSCode-PlantUML1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914798/c4d50df6-2746-2dd8-11b5-365d1a58d3b5.png)

![VSCode-PlantUML2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914798/e2b46596-c1fc-5a67-2fbb-942b7857d95c.png)


## シーケンス図の作成
* Visual Studio Codeを開く
* sample.pu で新規ファイルを作成する。
* 以下の内容をsample.puにコピーする
    * 書き方をより詳しく知りたい方はこちら：https://plantuml.com/ja/sequence-diagram

```sample.pu
@startuml
title シーケンス図
participant front
participant api

front -> api:リクエスト
api --> front:レスポンス
@enduml
```

## シーケンス図のプレビュー
* sample.puファイルを選択している状態で
* ”Alt + D”を同時押ししプレビューを表示する

![VSCode-PlantUML3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914798/e8788669-8d9d-8204-8741-b958473fd1d8.png)



## 画像ファイルとして出力
* "Ctrl + Shift + P" or F1 でコマンドパレットを開く
* PlantUML: Export Current Diagram と入力する
* png, svg, eps, pdf, vdx, xmi, scxml, html から出力形式を選択する
[Flutter]fvmで指定しているDart SDKバージョンが異なるエラーが発生する



## 概要

- fvmで指定しているDart SDKバージョンが異なるエラーが発生する



## 現象

- fvmのバージョンを指定しているのに、VS CodeでDart SDKバージョンが異なるので、pub getできないというエラーが起きる



## 原因

- VS Codeでfvm_config.jsonに以下の記載でSDKの場所を指定していなかったから

```
{
  "flutterSdkVersion": "2.5.0",
  /// ここから
  "search.exclude": {
    "**/.fvm": true
  },
  "files.watcherExclude": {
    "**/.fvm": true
  }
  /// ここまで
}
```

- 上記を更新した後、VS Codeを**再起動**する必要がある