OmniAICreator/Qiita-1.07M huggingface dataset:
RaspberryPiにNode-redをインストールする

簡単に考えていたらちょっとはまったのでメモ。

## 1. Node-redのインストール
GUIからインストールしました。
設定→Add/Remove Softwareを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/6750ad1f-f844-f1d3-795d-4202e46f7f67.png)

検索窓に`node-red`で検索→表示されるNode-REDを選択→Applyを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/1600ba20-c036-a542-a9c5-5f60ba7d4963.png)

## 2.Node-RED起動
こちらもGUIから。
プログラミング→Node-REDを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/2dec5de0-12c8-9b62-e06c-0fca0b9233a6.png)

### 起動失敗１：Failed to determine user credentials表示
これで起動できるはずが・・・途中で以下が表示されてしまう
「nodered.service: Failed to determine user credentials: No such process」

上記原因はユーザ名をpiから変更していたためと判明。
[こちらの記事](https://nodered.jp/docs/faq/customising-systemd-on-pi)を参考にサービス定義`/lib/systemd/system/nodered.service`を編集し、 User、GroupおよびWorkingDirectoryの行変更したユーザ名に合わせて修正してみる

### 起動失敗２：Unit is masked表示
再度Node-RED起動させるが、今度は以下が表示されNG。
「Failed to start nodered.service: Unit is masked」

以下コマンドで確認すると確かにmaskedと表示される。

```
# systemctl list-unit-files | grep nodered
nodered.service                        masked
```

以下コマンドでマスクを外す

```
# systemctl unmask NetworkManager
```
上記で再々度、Node-REDを起動するとやっと正常起動しました。
AWS Pricing Calculator とは

## 勉強前イメージ

そのまま訳したら価格の計算？見積もりツール？
[こちら](https://calculator.s3.amazonaws.com/index.html?lng=ja_JP) の計算ツールと何が違うんだろう

## 調査

### AWS Pricing Calculator とは

AWSのサービスについての費用見積もりツールになります。
簡単に直感的な見積もりが可能になります。

### SIMPLE MONTHLY CALCULATOR は？

SIMPLE MONTHLY CALCULATORは従来の見積もりツールで、
そろそろ廃止になるようです。

### 見積もりをしてみる

[こちらのURL](https://calculator.aws/#/) からアクセスしてみてください

![1AWS Pricing Calculator - Google Chrome 2021-07-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/6cbff948-c39d-87f2-ea39-f67ec7089121.png)


β版ではEC2のみでしたが、現在は100サービス以上あります。
今回は、EC2を見積もりしてみます。

![2AWS Pricing Calculator - Google Chrome 2021-07-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/b729721c-c4a3-0705-4511-31aa3abd84db.png)


説明と、EC2を見積もりするリージョンを変更します。

![3AWS Pricing Calculator - Google Chrome 2021-07-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/8e82581c-9b8f-b424-9db5-e16bf8640293.png)


EC2の数量やインスタンスタイプなど設定します。

![4AWS Pricing Calculator - Google Chrome 2021-07-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/5c3c6909-00de-8826-c158-3a242d40f0ea.png)


価格はオンデマンドインスタンスにしてみます。

![5AWS Pricing Calculator - Google Chrome 2021-07-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/7cf66873-a571-0a9b-e6fb-9d8420a92f5e.png)


EBSのストレージを設定してみます。

![6AWS Pricing Calculator - Google Chrome 2021-07-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/abe51600-65f4-0c3a-fcb1-9553d1d43d35.png)


設定を記載したら見積もりを追加。
出力された見積もりが以下になります。

![7AWS Pricing Calculator - Google Chrome 2021-07-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/b7a9a785-6ab6-423c-d3fc-f940982ea293.png)


見積もりを共有することもできます。

![8AWS Pricing Calculator - Google Chrome 2021-07-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/07ebe5f4-d332-23ba-f525-257936711220.png)

## 勉強後イメージ

SIMPLE MONTHLY CALCULATORで見積もり出してたこともあるけど、
AWS Pricing Calculatorのがわかりやすいかも？
ファイルに出力できるのも残せるので良いなぁと思います。

## 参考

- [AWS Simple Monthly Calculator がついに勇退するようです！](https://dev.classmethod.jp/articles/retire-simple-monthly-calculator/)
- [AWS Pricing Calculator に新しいサービスが追加されています！](https://dev.classmethod.jp/articles/aws-pricing-calculator-add-new-services/)
C#で日付を和暦で表示したい場合

C#のコードを書く際に、日付を和暦で表示したい場合の方法についてまとめた。

## 日付を和暦で表示するための準備

まずは名前空間に

~~~csharp
using System.Globalization;
~~~
を定義する。

そして、クラスやメソッド内にCultureInfoクラスを定義する。引数は「ja-JP」。

~~~csharp
var culture = new CultureInfo("ja-JP"); 
culture.DateTimeFormat.Calendar = new JapaneseCalendar();
~~~

こうすることで、日付を和暦で表示する準備が整った。

## 日付を和暦で表示する。

~~~csharp
var date1 = new DateTime(2001, 12, 25);
Console.WriteLine(date1.ToString("ggyy年M月d日", culture));　// 平成13年12月25日
~~~

元号は「gg」で取得できる。

## 曜日を日本語で取得する

~~~csharp
var dayOfWeekJapanese = culture.DateTimeFormat.GetDayName(date1.DayOfWeek);
Console.WriteLine(dayOfWeekJapanese); // 火曜日
~~~

## 元号名を取得する

また、ただ元号名を取得したい場合は、

~~~csharp
var gengo = culture.DateTimeFormat.Calendar.GetEra(date1);
var gengoName = culture.DateTimeFormat.GetEraName(gengo);
Console.WriteLine(gengoName);// 平成
~~~

## 参考文献

https://gihyo.jp/book/2017/978-4-7741-8758-7
【React】styled-componentsにstyled-media-queryを適用する

<h2>導入</h2>
まず、前提としてstyled-componentsをインストールしていることとします。もししていない場合は、下記でインストールしましょう。

```terminal:yarn
yarn add styled-components
```

npmを使うなら下記コマンドを実行して、インストールします。

```terminal:npm
npm install styled-media-query
```

yarnを使うなら下記コマンドを実行します。

```terminal:yarn
yarn add styled-media-query
```

これでインストールは完了です。

<h2>実装</h2>
実装は下記のようにできます。(公式より引用)
styled-componentsで通常通り、backgroud-colorを黒で指定し、styled-media-queryで各画面サイズごとにスタイルをそれぞれ適用しています。

```react:styled-media-query
import styled from "styled-components"; // You need this as well
import media from "styled-media-query";

const Box = styled.div`
  background: black;

  ${media.lessThan("medium")`
    /* screen width is less than 768px (medium) */
    background: red;
  `}

  ${media.between("medium", "large")`
    /* screen width is between 768px (medium) and 1170px (large) */
    background: green;
  `}

  ${media.greaterThan("large")`
    /* screen width is greater than 1170px (large) */
    background: blue;
  `}
`;
```

ちなみに、それぞれのブレイクポイントのデフォルトサイズは下記のように設定されています。
このサイズはカスタム可能です(方法については今回割愛)

```react:size
{
  huge: '1440px',
  large: '1170px',
  medium: '768px',
  small: '450px',
}
```

<h2>lessThan</h2>
指定されたブレークポイントまたはサイズよりも小さい画面サイズのスタイルを追加できます。

```react:lessThan
media.lessThan('medium')`
  /* styles ... */
`
```

<h2>greaterThan</h2>
このメソッドでは、指定されたブレークポイントまたはサイズより大きい画面サイズのスタイルを追加できます。

```react:greaterThan
media.greaterThan('small')`
  /* styles ... */
`
```

<h2>between</h2>
このメソッドでは、指定された2つのブレークポイントまたはサイズの間に画面サイズのスタイルを追加できます。

```react:between
media.between('small', 'medium')`
  /* styles ... */
`
```

<h2>参考</h2>

https://github.com/morajabi/styled-media-query
コメント件数を表示させる

# はじめに

![スクリーンショット 2021-07-28 22.46.40（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264460/e19a91f1-8d78-3519-6387-7e4c374eacc1.png)

投稿に対してコメントがあった場合、件数が表示されるようにしました。
すごく簡単ですがアウトプットしていきます。

#countメソッド

```erb
 <%= review.comments.count%>
```
結論上記の記述で表示させました。

この時`countメソッド`を使用しました。

```.rb
model.count
```
このような記述でモデルのテーブルのレコード数を取得することができます。

今回は`review`に該当する`comments`のレコード数を取得することになりました。

![スクリーンショット 2021-07-28 22.56.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264460/325a164e-9eb6-1202-69be-975d8ff730e8.png)

DBの中に`review_id：16`という投稿に対し,content(comments)が2件保存されています。
なので２件コメントがあるということで最初のスクショには`2`と表示されています。

#参考

https://pikawaka.com/rails/count#%E3%83%A2%E3%83%87%E3%83%AB%E5%90%8D#count%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9
JavaScriptで任意の長さのランダム文字列を生成する方法

0-9,a-z,A-Zを用いて任意の長さのランダム文字列を生成したい。
JavaScriptはイケてる書き方ができますが、ここではだれでもわかるソースコードを提示します。
#ソースコード
```javascript:準備用コード
function getRandomInt(max) {
  return Math.floor(Math.random() * max);
}

let candidateCharactor=new Array();//利用文字の一覧となる変数
  
for(let i=48;i<=57;i++){
  candidateCharactor.push(i);//0-9を配列に追加
}
for(let i=65;i<=90;i++){
  candidateCharactor.push(i);//A-Zを配列に追加
}
for(let i=97;i<=122;i++){
  candidateCharactor.push(i);//a-zを配列に追加
}
```
```javascript:文字列生成関数
function randomStringGenerator(length){
  let randomString="";
  for(i=1;i<=length;i++){
    randomString+=String.fromCharCode(candidateCharactor[getRandomInt(candidateCharactor.length)]);
    //getRandomIntにより、0-61の中からランダムな数字になります。
  }
  return randomString;
}
```

#解説
今回の肝は「fromCharCode関数」です。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode

実引数(数値)から、UTF-16文字を返します。
このプログラムでは、0-9,a-z,A-Zを表すコードを配列にまとめます。
それから添え字をランダムに生成し、その要素を取得するプログラムです。

##利用文字一覧の生成
```javascript
let candidateCharactor=new Array();
for(let i=48;i<=57;i++){
  candidateCharactor.push(i);
}
for(let i=65;i<=90;i++){
  candidateCharactor.push(i);
}
for(let i=97;i<=122;i++){
  candidateCharactor.push(i);
}
```
cadidateCharactorは利用文字の一覧になる配列（Array）です。
それに対して、Arrayクラスのpushメソッドを使って、次々と末尾に要素を追加していきます。

```javascript
candidateCharactor=["0","1" ... "9" ... "A" ... "Z" ... "a" ... "z"]
```

上記のような書き方でも結果は変わりません。
ただ、ほかの文字をランダム生成文字列に使いたい場合、A-Zは生成文字列に使わなくなった場合などのことを考慮したため、プログラム実行時に毎回一覧を生成するようにしました。

##文字列生成
```javascript:文字列生成関数
function randomStringGenerator(length){
  let randomString="";
  for(i=1;i<=length;i++){
    randomString+=String.fromCharCode(candidateCharactor[getRandomInt(candidateCharactor.length)]);
    //getRandomIntにより、0-61の中からランダムな数字になります。
  }
  return randomString;
}
```
引数に生成する文字列長を指定すると、その長さのランダム文字列が生成される関数です。
以下の部分が少しわかりづらいかもしれませんので、少しかみ砕きます。

```javascript
randomString+=String.fromCharCode(candidateCharactor[getRandomInt(candidateCharactor.length)]);
```

getRandomInt関数は、以下のページに記載の関数です。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Math/random

簡単に言えば、0~[実引数-1]までの値を生成します。ここでは、3が生成されたとしましょう。

```javascript
randomString+=String.fromCharCode(candidateCharactor[3]);
```

candidateCharactor[3]は51です。

```javascript
randomString+=String.fromCharCode(51);
```

この場合右式は、3になります。
randomStringの一文字目は3になります。これが指定された文字列長分だけ繰り返されます。
C#の基本イディオムについてその6~DateTime構造体~

C#での日時・時間の設定・取得をできるDateTime構造体についてまとめた。

## DateTimeに値を設定する
DateTimeには、
・年
・月
・日
・時
・分
・秒
・1/1000秒(ミリセカンド)
の値をセットすることができる

~~~csharp
var date1 = new DateTime(2007, 7, 7);
DateTime date2 = new DateTime(2011, 1, 1, 11, 3, 5);
var date3 = new DateTime(2000, 1, 1, 12, 24, 36, 123);
~~~

~~~csharp:出力結果
7/7/2007 12:00:00 AM　　// date1
1/1/2011 11:03:05 AM // date2
1/1/2000 12:24:36 PM // date3
~~~

○年月日をセットすると、「セットした年月日 + 時間は午前12時」を返す。
○年月日と時分秒をセットすると、「セットした年月日　+ セットした時分秒」を返す。
※時間は24時間単位でセットするのだが、返ってくる値は、「12時間単位 + AMかPM」
(例)
時→９、分→5、秒→1
なら、「9:05:01 AM」というように返ってくる。
なぜか、時だけ、0埋めされない。
そして、ミリセカンドはセットしても、時間には表示されない。

また、時分秒を入れる場合は、全部セットしないといけない。
不思議なのが、年月日だけ日、月、年の順で表示される。

~~~csharp:以下の書き方は構文エラーになる
var date3 = new DateTime(2007, 7, 7, 1);　　// 分と秒がセットされていない
var date4 = new DateTime(2007, 7, 7, 1, 1); // 秒がセットされていない
~~~

### 「今」と「今日」を取得する場合は特殊

~~~csharp
var now = DateTime.Now;
var today = DateTime.Today;
~~~

~~~csharp
7/28/2021 9:51:57 PM　 // now
7/28/2021 12:00:00 AM // Today
~~~

Nowの場合、今の日付と今の時間を返す。
Todayの場合、今の日付を返すが、時間は「12:00:00 AM」を返す。

## DateTime構造体のプロパティ
DateTime構造体はいくつかプロパティを持っている。

~~~csharp
var date3 = new DateTime(2000, 1, 1, 12, 24, 36, 123);
date5.Year; // 年 2000
date5.Month;　// 月 1
date5.Day;　// 日 1
date5.Hour;　// 時 12
date5.Minute; // 分 24
date5.Second; // 秒 36
date5.Millisecond; // 1/1000秒 123
~~~

ただし、上記のプロパティは読み取り専用なので、値を書き換えることはできない。

~~~csharp:構文エラー
date5.Hour = 21;
~~~

「CS0200: Property or indexer 'DateTime.XXXX' cannot be assigned to -- it is read only (CS0200) (xxxxxxxxxxx)」という「読み取り専用の値は変更ができない」といった旨の構文エラーになる。

## 曜日を取得する

~~~csharp
date3.DayOfWeek; // Saturday
~~~

曜日は英語で返ってくる。

## うるう年かどうかを判定する
なんと、C#の日時操作には、年がうるう年かどうかを判定するメソッドがある。

~~~csharp
DateTime.IsLeapYear(2016); // True
DateTime.IsLeapYear(2018); // False
~~~

## 文字列からDateTimeのオブジェクトを作成する
この場合は、DateTime構造体に含まれている静的メソッドであるTryParseを使用する。
また、TryParseメソッドで値が変換されれば、Trueが返り、変換ができないと例外が発生する。

第一引数に変換する日時の文字列、第二引数にoutキーワード付きのDateTime型の変数を指定する。

~~~csharp
Console.WriteLine(date2);
// この時点では、「1/1/2011 11:03:05 AM」が返ってくる

// date2はDateTime型なので、変換され、Trueが返るので条件を満たす。
if(DateTime.TryParse("2020/1/1 14:15:30", out date2)) { 
  　Console.WriteLine(date2);
　　　　　// この時点で、「2020/1/1 2:15:30　 PM」が返ってくる
}
~~~

~~~csharp:出力結果
1/1/2011 11:03:05 AM
1/1/2020 2:15:30 PM
~~~

## DateTime型の変数をフォーマットを指定して文字列に変換する

~~~csharp
var date3 = new DateTime(2000, 1, 1, 12, 24, 36);
date3.ToString("d"); // 1/1/2000
date3.ToString("D");　　// Saturday, January 1, 2000
date3.ToString("yyyy-MM-dd") // 2000-01-01
date3.ToString("yyyy年MM月dd日(ddd)");　// 2000年01月01日(Sat)
date3.ToString("HH時mm分ss秒"); // 12時24分36秒
date3.ToString("f"); // Saturday, January 1, 2000 12:24 PM
date3.ToString("F"); // Saturday, January 1, 2000 12:24:36 PM
date3.ToString("t"); // 12:24 PM
date3.ToString("T"); // 12:24:36 PM
~~~

※フォーマットについてはいろいろある。

## 参考文献

https://gihyo.jp/book/2017/978-4-7741-8758-7

https://gihyo.jp/book/2019/978-4-297-10458-0
Elmerによる練習１：書籍『例題で極める非線形有限要素法』より

# はじめに
CAEに関する本を購入しました。

例題で極める非線形有限要素法
CAEで正しい結果を導くための理論トレーニング
発行元：丸善出版　　発行年月日：2020年10月
https://www.maruzen-publishing.co.jp/item/?book_no=304000

しかし、脳が付いていかないので、Qiita諸先輩の記事を参考に読解を進めます。
[Salome-Meca2019による練習１：書籍『例題で極める非線形有限要素法』より](https://qiita.com/Sagittarius_Chiron/items/75915bb2c4f58d11fe48)
# Salome
![20210728a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/58893163-5117-64f5-e3f1-3bbb429ae130.png)
`Salome`でメッシュを切ります。
エッジへのsub-meshが分からないので、Salomeでは６面体要素メッシュの生成のみに留めます。
ソルバーは`Elmer`です。
![20210728c10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/177f9ad2-9861-edda-f543-2fb2a7a3cec6.png)
![20210728c20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/817568dc-4078-865d-46be-f2fda541c317.png)
![20210728c50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/fc51ddbd-c6c8-5756-f761-ee930b580a2b.png)

```
６面体要素の場合
   3D Hexahedron(I.J,K)
   2D Quadrangle:Mapping
   1D Wire Discreation
        Local Length
        lengthで値を設定しました　0.001, 0.002, 0.005
```
本によりますと、一番上の10要素の場合、1.34e-05 になるそうです。
`Salome`か`Elmer`か`ParaView`の使い方を間違っているような気がします。
# Elmer
![20210728b_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/24a00db6-64ae-180a-2d78-6177c97b7768.png)
![20210728b_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/91f57dbd-61fa-792e-c292-8ef7dac9acb2.png)
![20210728b_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/428add11-b9e4-323d-6c4d-d309d63f7b02.png)
![20210728b_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/ddbd1650-1599-d8e6-1ce4-f8d557cb8603.png)
![20210728b_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/c1a76621-9f66-8a83-4b40-f1f5be59a8e3.png)

こちらは、Elmerでメッシュを切っています。
それらしい結果が出てほっとしていますが、まだまだ未熟です。
# まとめ
+ Elmer さんありがとう
+ Salome さんありがとう
+ 例題で極める非線形有限要素法 さんありがとう
+ S さんありがとう
PythonをAlpineイメージで安易に動かす問題点

## サマリ
- Alpine × Pythonの問題点については度々指摘されています🤔
    - [Using Alpine can make Python Docker builds 50× slower](https://pythonspeed.com/articles/alpine-docker-python/)
    - [軽量Dockerイメージに安易にAlpineを使うのはやめたほうがいいという話](https://blog.inductor.me/entry/alpine-not-recommended)
    - その原因のほとんどがAlpine同梱のCライブラリ「[musl（マッスル）](https://ja.wikipedia.org/wiki/Musl)」に由来します
- **ビルド時間が遅延したり、謎のバグを踏んだりします**
- AlpineイメージのPythonを安易に導入した結果、その全ての問題をツモり悲しくなったので共有します👶

## 事象①：異常にビルド時間がかかる😨
### 起きたこと
Dockerイメージのビルドにメチャクチャ時間がかかりました。
ビルドのログを眺めていると、gRPC関連ライブラリ[^1]の`pip install`に**30分程**時間を要しているのが確認できました🤔

### 原因
前述したこちらの記事に答えがありました。
[Using Alpine can make Python Docker builds 50× slower](https://pythonspeed.com/articles/alpine-docker-python/)

>Standard PyPI wheels don’t work on Alpine

簡単にまとめると、

- PyPIにはC拡張ライブラリのバイナリがホストされている（なので`pip install`で素早くインストール可能）
- ただしこのバイナリはAlpine非対応のため使えない。Cコードをイチからコンパイルする必要アリ

ということです。
通常のライブラリならAlpineでも問題ないですが、C拡張ライブラリの場合は毎回一生懸命コンパイルすることになり、結果として鬼のようにビルド時間がかかってしまっていたわけです。

[こちら](https://future-architect.github.io/articles/20200513/)の記事にも同様の説明がありました。

>PyPIはLinux向けにはmanylinux1という形式でバイナリを提供しており、DebianでもRedHatでも高速にインストールできます。しかし、この形式はAlpineには対応していないため、C拡張を使うライブラリを使うと、Dockerイメージのビルド時間が伸びまくってしますわけです。

>それでも、どうしても、PurePythonで処理速度はどうでも良い/お金がたくさんある、あるいはC拡張を使う場合でも人生を犠牲にしてでも、イメージサイズをどうしても減らしたいみたいな選ばれし者はAlpineを使う感じでしょうかね。


## 事象②：Segmentation Faultが起こる😨
### 起きたこと
AlpineイメージのPythonをCloud Runにデプロイし遊んでいたのですが、`Uncaught signal: 11`なるエラーを吐きCloud Runくんが昇天することが多発しました。
`Uncaught signal: 11`は[Segmentation Fault](https://ja.wikipedia.org/wiki/%E3%82%BB%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%81%95%E5%8F%8D#:~:text=%E3%82%BB%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%81%95%E5%8F%8D%EF%BC%88%E8%8B%B1%E8%AA%9E%3A%20segmentation%20fault,%E3%81%97%E3%82%88%E3%81%86%E3%81%A8%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AB)を表しています。
余談ですが、厄介だったのは、ローカルでは再現しなかったことと、Cloud Run上でも数回に一度しか再現しなかったことです。

### 原因
muslのスレッドのスタックサイズに問題があったようです。

[![thumbnail](https://image.slidesharecdn.com/golangbinaryhacks-190618140218/95/golang-binary-hacks-12-1024.jpg)](https://www.slideshare.net/yaegashi/golang-binary-hacks-150386886)
[golang binary hacks](https://www.slideshare.net/yaegashi/golang-binary-hacks-150386886)

>・muslはスレッドに対して極端に少ないスタックを割り当てる
（中略）
・Ruby・Python含む様々なプロジェクトがmuslのスタックオーバーフローに辛酸を舐めさせられている

スタックオーバーフローはセグフォの一因になり得ますのでこちらの影響を受けた可能性が高いです。

## 結論
余程のことがない限りPythonならAlpine以外を使用しましょう。
（補足ですが、使い方に依ればAlpineイメージでもPythonは問題なく動きます。全てを否定するわけではありません🙅‍♂️）

[^1]: grpcio
Flutter web:認証されてなかったらログインページへ移動的なこと

FutureBuilderで認証されいてるか調べて、認証されていない場合`/login`へNavigatorで移動すればよい。

* builderはWidgetを返す必要があるので、`/login`へ移動する場合もとりあえずWidgetを返している
* `Future.microtask`を使っているのは、移動したあとにWidgetのreturnが実行されるとエラーになるので。

```dart
return FutureBuilder<int>(
    future: Future.delayed(Duration(seconds: 5), () => 1),
    builder: (context, snapshot) {
      if (snapshot.data == null) {
        return Scaffold(
          body: Center(
            child: Text("require_login:WAITING"),
          ),
        );
      } else {
        Future.microtask(() =>
            Navigator.of(context).pushReplacementNamed("/login"));
        return Scaffold(
          body: Center(
            child: Text("require_login:redirecting..."),
          ),
        );
      }
    });
```
rosrunを使わずros c++プログラムをバイナリから実行する

### はじめに

ros c++で作成したプログラムはrosrunを使用せずにバイナリファイルから実行することもでき、ここではそのやり方を記載します。

### 内容

例えば,以下の記事で作成した```my_hello```パッケージの```my_hello```というプログラムを実行してみます。

https://qiita.com/hoshianaaa/items/560954265ed826678d95

```bash 
roscore
rosrun my_hello my_hello
```
そしてプロセス名を確認します。

```bash 
$ ps -aux | grep my_hello
hoshina     7466  0.7  0.2 348852 19244 pts/3    Sl+  09:02   0:01 /home/hoshina/catkin_ws/devel/lib/my_hello/my_hello
hoshina     7584  0.0  0.0  17672   724 pts/1    S+   09:06   0:00 grep --color=auto my_hello
```

すると実際に動作しているプロセスは```/home/hoshina/catkin_ws/devel/lib/my_hello/my_hello```であることがわかります。

実際にバイナリファイルから実行してみます。

```bash
$ cd ~/catkin_ws/devel/lib/my_hello/
$ ./my_hello

[ INFO] [1627477760.933650008]: Hello world
[ INFO] [1627477761.033929098]: Hello world
[ INFO] [1627477761.133818627]: Hello world
...

```

正常に動作することがわかりました。


### まとめ

ros c++プログラムは```/home/{ユーザ名}/catkin_ws/devel/lib/{パッケージ名}/{実行ファイル名}```のファイルから実行することができることが確認できました。

これを使用すると,例えばROSで作成したプログラムのバイナリだけ他のPCに共有することができ便利かもしれません。

### おまけ
ちなみに```roscore```プログラムの実行プロセスはどのようになっているかというと次の様になります。

```bash
$ ps -aux | grep roscore
hoshina     6077  0.3  0.5 295360 43912 pts/0    Sl+  08:41   0:07 /usr/bin/python3 /opt/ros/noetic/bin/roscore
hoshina     7706  0.0  0.0  17672   656 pts/1    S+   09:18   0:00 grep --color=auto roscore
```
roscoreの実行ファイルは```/opt/ros/noetic/bin```内にあることがわかりました。

そしてこのフォルダ内を見てみるとROSのコマンドの実行ファイルが色々と用意されていることが分かりました。

```bash
$ ls /opt/ros/noetic/bin/
catkin_find               rosmake       rqt_console
catkin_init_workspace     rosmaster     rqt_dep
catkin_make               rosmsg        rqt_graph
catkin_make_isolated      rosmsg-proto  rqt_image_view
catkin_test_results       rosnode       rqt_logger_level
catkin_topological_order  rospack       rqt_plot
rosbag                    rosparam      rqt_shell
rosboost-cfg              rosrun        run_selftest
rosclean                  rosservice    rviz
rosconsole                rossrv        selftest_example
roscore                   rosstack      selftest_rostest
roscreate-pkg             rostest       stage
rosgraph                  rostopic      tf_remap
roslaunch                 rosunit       view_frames
roslaunch-complete        roswtf        xacro
roslaunch-deps            rqt
roslaunch-logs            rqt_bag

```
Azure Functionsのセキュリティ関係の情報メモ

Azure Functions のセキュリティ関係の教材的な Learn が無いか質問された際に調べた、Azure Functions のセキュリティ関係で見ておくべき情報と、ソリューションとしてAzure Functions のセキュリティに関する Learn などのリンクをメモとして残します。 

## Microsoft Docs
- Azure Functions のセキュリティ保護
  - https://docs.microsoft.com/ja-jp/azure/azure-functions/security-concepts

- サーバーレスな Functions のセキュリティ
  - https://docs.microsoft.com/ja-jp/azure/architecture/serverless-quest/functions-app-security

- お使いの Function App の管理 / 認証
  - https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-how-to-use-azure-function-app-settings?tabs=portal#auth

- Azure Functions のネットワーク オプション
  - https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-networking-options

- Azure App Service および Azure Functions での認証と承認
  - https://docs.microsoft.com/ja-jp/azure/app-service/overview-authentication-authorization

- Azure Functions の HTTP トリガー
  - 関数のアクセス キー
    - https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-http-webhook-trigger?tabs=csharp#function-access-keys

  - 運用環境で HTTP エンドポイントを保護します。
    - https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-http-webhook-trigger?tabs=csharp#secure-an-http-endpoint-in-production

- App Service と Azure Functions でマネージド ID を使用する方法
  - https://docs.microsoft.com/ja-jp/azure/app-service/overview-managed-identity?toc=%2Fazure%2Fazure-functions%2Ftoc.json&tabs=dotnet

- チュートリアル:マネージド ID を使用して Azure Spring Cloud アプリから Azure Functions を呼び出す
  - https://docs.microsoft.com/ja-jp/azure/spring-cloud/tutorial-managed-identities-functions

- Use Key Vault references for App Service and Azure Functions
  - https://docs.microsoft.com/en-us/azure/app-service/app-service-key-vault-references
  - App Settings での Key Vault参照の参考になる。

## Microsoft Learn
- Azure Static Web Apps を使用してユーザーを認証する
  - https://docs.microsoft.com/ja-jp/learn/modules/publish-static-web-app-authentication/

- Azure API Management で API の認証を制御する
  - https://docs.microsoft.com/ja-jp/learn/modules/control-authentication-with-apim/
  - 演習は App Service の WebAPI だが、API Management の使い方としては、Functions でも参考になる。

- Azure API Management で API を保護する
  - https://docs.microsoft.com/ja-jp/learn/modules/protect-apis-on-api-management/
  - 演習は App Service の WebAPI だが、API Management の使い方としては、Functions でも参考になる。
  - 特にスロットリングは過剰コストを狙った攻撃の対策の参考になる。

- Azure でクラウド アプリケーションをセキュリティで保護する
  - https://docs.microsoft.com/ja-jp/learn/paths/secure-your-cloud-apps/
  - クラウド アプリケーションのセキュリティの考え方や Key Vault、ID フレームワーク、API キーとクライアント証明書認証など参考になる。

## BLOGなど
- Microsoft MVP 大平さん（ @dz_ ）の記事
  - Check! Azure Functions のセキュリティ保護について再確認する
    - https://zenn.dev/dzeyelid/articles/e117f3483db3ed94f3a2
AtCoderログ：0039 - ABC 144 B

# 問題

https://atcoder.jp/contests/abc144/tasks/abc144_b

## 問題文
> 高橋君は九九を覚えたので、$1$ 以上 $9$ 以下の $2$ つの整数の積を計算することができます。
> 整数 $N$ が与えられるので、$N$ を $1$ 以上 $9$ 以下の $2$ つの整数の積として表すことができるか判定し、できるなら Yes を、できないなら No を出力して下さい。

## 制約
> ・$1 \le N \le 100$
> ・$N$ は整数である。

## 収録されている問題セット
- [AtCoder に登録したら次にやること](https://qiita.com/drken/items/fd4e5e3630d0f5859067) ([第04問類題](https://qiita.com/drken/items/fd4e5e3630d0f5859067#%E7%AC%AC-4-%E5%95%8F--abc-087-b---coins-200-%E7%82%B9))

# 回答
## 回答1 (AC)
受け取った整数 n が九九の表にあるかを調べるわけですが、九九の表を作成し、n が含まれているかをチェックしていけば良いでしょう。コードは以下のようになりました。今回は関数を利用しています。

```C++:abc144b-1.cpp
#include <bits/stdc++.h>
using namespace std;
 
string is_in_table( int n ) {
  for ( int i=1; i<=9; i++ ) {
    for ( int j=1; j<=9; j++ ) {
      if ( i*j==n ) {
        return("Yes");
      }
    }
  }
  return("No");
}
 
int main() {
  int n;
  cin >> n;
 
  cout << is_in_table( n ) << endl;
}
```

## 回答2 (AC)
九九の表に現れる値をあらかじめ計算してテーブルに保管し、与えられた整数 n がそのテーブルに含まれるかをチェックする方法でもコードを書いてみました。回答1の繰り返し回数は 9x9=81 回と少ないので、テーブルを使っても計算時間・メモリにほとんど差はありませんでした。

```C++:abc144b-2.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int n;
  cin >> n;
 
  vector<int> kuku{ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10,
                   12, 14, 15, 16, 18, 20, 21, 24, 25, 27,
                   28, 30, 32, 35, 36, 40, 42, 45, 48, 49,
                   54, 56, 63, 64, 72, 81}; 
  if ( find(kuku.begin(),kuku.end(),n)==kuku.end() ) {
    cout << "No" << endl;
  } else {
    cout << "Yes" << endl;
  }
}
```

# 調べたこと
## [AtCoder の解説](https://atcoder.jp/contests/abc144/tasks/abc144_b/editorial) → [ユーザ回答](https://blog.hamayanhamayan.com/entry/2019/10/27/233410)
回答1と同じ方針でした。

## [AtCoder の解説](https://atcoder.jp/contests/abc144/tasks/abc144_b/editorial) → [コンテスト全体の解説](https://img.atcoder.jp/abc144/editorial.pdf)
回答1と同じ方針でした。

# 学んだこと
- vector における探索 (find 関数)

# リンク
- 前の記事 → [AtCoderログ：0038 - ABC 211 B](https://qiita.com/RoadLynton/items/773ee51fc696ab576b5c)
ros c++ で hello world

ros c++ でhello worldをする手順です。

### 開発環境の設定

```
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace
$ cd ~/catkin_ws
$ catkin_make
```

### パッケージの作成

```
$ cd ~/catkin_ws/src
$ catkin_create_pkg my_hello std_msgs roscpp
$ cd my_hello
```

### ビルド設定ファイルの修正

```CMakeLists.txt
cmake_minimum_required(VERSION 3.0.2)
project(my_hello)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
)
catkin_package(
  CATKIN_DEPENDS roscpp std_msgs
)
include_directories(
  ${catkin_INCLUDE_DIRS}
)
add_executable(my_hello src/my_hello.cpp)
target_link_libraries(
  my_hello
  ${catkin_LIBRARIES}
)
```

### ソースファイルの作成

```c++:src/my_hello.cpp
#include <ros/ros.h>

int main(int argc, char **argv) {
  ros::init(argc, argv, "my_hello");
  ros::NodeHandle n;
  ros::Rate r(10);
  while (ros::ok())
  {
    ROS_INFO("Hello world");
    r.sleep();
  }
  return 0;
}
```

### パッケージのビルド

```
$ cd ~/catkin_ws
$ catkin_make
```

### パッケージの実行

```
$ source ~/catkin_ws/devel/setup.bash
$ rosrun my_hello my_hello

[ INFO] [1627477251.605944564]: Hello world
[ INFO] [1627477251.706078609]: Hello world
...
```

### 参考

こちらを参考に作成しました。

http://joe.ash.jp/program/ros/prog/build_hello.htm
VTKとopencv-vizのインストールのためのメモ（opencv4.2.0,VTK8.2.0)

opencv-vizを使うのに少し苦戦したため備忘録

### VTKのインストール

まず、以下のリンクからVTK8.2.0.zipをダウンロード
VTKのダウンロード
https://vtk.org/download/

そして、zipファイルを好きなところに展開
以下のように、cmakeのフォルダを指定する
![VTKcmake.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838281/7bb8294a-7000-543b-6be2-5f126574df62.png)

まず、configureする
次に、CMAKE_INSTALL_PREFIXが最初は「C:/Program Files(X86)/VTK」とかになっているが、ここを変えないとうまくいかなかった。
具体的には、「VTK-8.2.0/build/install」と設定した。また、このinstallフォルダを事前に作っておかなければ、ビルドした後にinstallしたファイルが作成されなかった。なので、事前にinstallフォルダをbuildフォルダ直下に作っておきましょう。

あとは、configureして、generate。
そして、visualStudioで開いて、INSTALLプロジェクトをビルド。

### opencvのビルド
以下のリンクからopencvをダウンロード
https://opencv.org/releases/page/2/
以下のリンクからopencv-contribをダウンロード
https://github.com/opencv/opencv_contrib/releases?after=3.4.11

opencvのexeを使って、opencvを展開
次に、opencv-contribも展開
cmakeのフォルダを以下のように設定
そして、VTK_DIRを下図のように書き換える
![VTKcmake2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838281/85b77dd2-1f05-0bae-2530-5d5600227921.png)

そして、OPENCV＿EXTRA＿MODULES＿PATHにopencv-contribのmoduleのパスを設定
![opencvCmake2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838281/ef6e13a7-b6d4-584b-58a1-d839343d21f8.png)
configureすると、下図のように、opencv_vizが現れるので、チェックが入っているのを確認する
![opencvCmake3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838281/a1133691-110e-1c0d-0603-c9f08d634d7f.png)
また、WITH＿VTKにチェックが入っていることも確認して、configureしてgenerate
![opencvCmake4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838281/aeffa179-b50b-643b-bd60-90c68c0fcbd8.png)
そして、visualStudioで開いて、INSTALLプロジェクトをビルド。
buildフォルダ下のinstallフォルダ内にファイルが生成される。
GeneXus Access Manager(GAM) #4 GAM Authorization


[GeneXus Access Manager(GAM) #2　ユーザアプリ認証設定（Web）](https://qiita.com/sgtrducky/items/076a0c19794af6b0b3c5)にて、Webアプリに対するGAMの認証適用方法を確認しました。今回はAuthorizationの基本を確認します。

## GAMのAuthorizationの概要
- [GAM アクセス許可 (wiki.genexus.jp)](http://wiki.genexus.jp/hwiki.aspx?GAM+%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E8%A8%B1%E5%8F%AF,)
- [
GAM Authorization (wiki.genexus.com)](https://wiki.genexus.com/commwiki/servlet/wiki?17918,Category%3AGAM+Authorization)

ざっくり理解では
- 実行時に自動的にチェックされるアクセス許可
- プログラムでチェックされるアクセス許可

の2種類があるとのこと。
いずれもGAMのPermissionをUserに直接付与、またはRollに関連付けしてそのRollをユーザに付与することで、オブジェクト起動時、またはプログラムの中で明示的に必要なPermissionを持ったユーザかをチェッするという趣旨です。

## 実行時の自動チェック
Webパネル等のIntegrated SecurityプロパティをAuthorizationに変更するとPermission Prefixという関連プロパティが設定できるようになります。デフォルトではそのオブジェクト名が設定されます。例えばWpAuth00というWebパネルで設定すると以下のようになり
![GAM01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168717/1ab10532-6d08-b8a8-f000-128a5e90bb60.jpeg)
この状態でこのオブジェクトをビルドして、GAMBackendアプリで確認すると、「wpauth00_Execute」というPermissionが作られます。User直なり、User-Rollなりにこのwpauth00_Executeが「付与されていない」状態で、このWebパネルを起動しようとすると、「実行時の自動チェック」が動作してUnauthorized画面に遷移します。
![GAM02.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168717/14d34803-7dc6-ec8a-0080-59c1709cb61b.jpeg)

当然この調子で全ての画面にAuthorized設定をしていくと1 画面：1 Permission　ができてしまい煩雑ですので、以下のようにしてみました。

- WpAuth00でPermission Prefixに「WpAuth0X」を設定
- WpAuth10でPermission Prefixに「WpAuth1X」を設定

この状態でビルドすると以下の2つのPermissionが生成されます。
![GAM03.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168717/8767e243-bf60-1b45-2e88-a8635fb9ac14.jpeg)

そして、WpAuth00に加え、WpAuth01、WpAuth02のPermission Prefixに「WpAuth0X」を設定、WpAuth10に加え、WpAuth11，WpAuth12のPermission Prefixに「WpAuth1X」を設定。

これで文字通り0X系の画面はWpAuth0Xが付与されたユーザ、1X系の画面はWpAuth1Xが付与されたユーザにより起動できることを確認しました。

Permissionの親子関係等、追加で確認必要ですが複数のPermissionをRollで束ねれば一通りの権限制御はできそうな感触です。

## プログラムでのチェック
GAMRepositoryオブジェクトのCheckPermissionメソッドで、プログラム中でユーザが権限を持っているかのチェックが可能です。

```
Event 'Save'
	If GAMRepository.CheckPermission(!"Save")
		Msg(!"Saved!")
	Else
		Msg(!"You don't have enough permission to save!")
	EndIf
Endevent
```

のようにイベントの中でチェックしたり、Startイベントの中でそもそものボタンの表示・非表示の制御等にも使えますね。

2021年07月28日　初版
3値論理における論理演算の、私なりの覚え方

自分用まとめ
厳密には違うのかもしれないが、ひとまずわかりやすさ重視で考えてみる。

## お約束
間違いが含まれる可能性がほどほどにあります。
間違いを見つけたら「どこを」「どのように」修正すべきか教えてください。

## 3値論理
RDBMS では2値論理ならぬ**3値論理**が採用されている。
true, false に **unknown (不明)** を加えたものである。

2値論理における論理演算は CS の基本だが、3値論理の論理演算はちょっとだけ複雑。

## 3値論理における論理演算

### NOT

`NOT unknown` は `unknown` になる。
**不明なものは否定しても不明なまま**ということ。

|  | (NOT) |
| :-: | :-: |
| true | false |
| **unknown** | **unknown** |
| false | true |

### OR と AND
覚えるのは1つだけ。
**真の度合い**（勝手に作った造語なので、そんなもの存在しないが） 
`true > unknown > false` という関係。
（true が 1, false が 0 なら、 unknown は 0.5 くらいのイメージ）

あとは、普通の論理演算と同じ

- OR 演算では、より真に近いものを選ぶ
- AND 演算では、より真から遠いものを選ぶ

| (OR) | true | **unknown** | false |
| :-: | :-: | :-: | :-: |
| true | true | **true** | true |
| **unknown** | **true** | **unknown** | **unknown** |
| false | true | **unknown** | false |

| (AND) | true | **unknown** | false |
| :-: | :-: | :-: | :-: |
| true | true | **unknown** | false |
| **unknown** | **unknown** | **unknown** | **false** |
| false | false | **false** | false |
アラサー未経験フリーターがITインフラ業界に放り込まれてawsの資格をプロフェッショナルまで取った話　③プロフェッショナル2種

アラサーIT未経験の私がawsプロフェッショナル系を取得した時の勉強法まとめです。私と同じくIT経験の浅い方の参考になればと思います。
取得した資格は以下

1. ソリューションアーキテクト・プロフェッショナル
2. DevOpsエンジニア・プロフェッショナル

今回2つの試験は自宅でのオンライン受験でした。

クラウドプラクティショナー編はこちら

https://qiita.com/instant_baby/items/cf39b67c044417d611b4

アソシエイト編はこちら

https://qiita.com/instant_baby/items/ee0c98df8071db2d8045

# ソリューションアーキテクト・プロフェッショナル


勤続約2年程で受験しました。
この時の技術レベルはLDAPサーバー構築、CF-S3を使って静的webサイトを構築したり
Terraformでインフラをコード化する等結構いろんな技術を触っている段階でした。

受験しようとしたきっかけは、費用が会社持ちということと、合格すれば資格手当が出るからという金銭的な面からでした。
たまたまこの時期は業務的に余裕があり、時間が取れるタイミングだった事もあって受験してみようという流れでした。

今回もアソシエイト系と同じく下記サイトをメインに進めました。

https://aws.koiwaclub.com/

1. ココの問題集を解く
2. 問題に出てきたawsサービスの公式ドキュメントを総ざらい
3. 改めて問題集を解く
4. 間違えた問題に出てきたサービスの公式ドキュメント以下略

進め方はもう全く一緒ですね。

学習としては、ひたすら広範囲を深く掘り下げていくという何とも気の遠くなりそうな内容でした。。。
ハイブリッドクラウドや、オンプレからAWSに移行するときのベストプラクティス、オンプレのLDAPからSSO等々、普段業務で触らない範囲の出題がとても多い印象でした。

兎にも角にもAWSの公式ドキュメントを隅から隅まで網羅しましょう。ひたすら根気勝負です。

学習期間は2ヶ月ほどで受験しました。
前日に友人と泥酔してしまい、当日は試験時間前まで自宅のトイレで過ごしました。
モニターにピントが合わず苦戦しました。
ここまでの試験全てで前日泥酔からの合格だったので、
もうここまで来たら受験前日に泥酔した方が受かるんじゃないかと泥酔しながら考えていました。

結果は合格。

受験者スコアは798点でした。
![スクリーンショット 2021-07-28 21.20.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1526421/14b89391-dea2-ccd7-1f0f-2da8e0ce69cb.png)

やはり普段触らないコスト管理が厳しい結果となりました。

とにかく問題文が長い！長ーい！！
問題を一周した時点で120分ほど消化してしまっており、見直しにあまり時間をかけることだ出来ませんでした。

長文読解が非常に多いので、違う選択肢を素早く見つけて2択位に絞ってから長考に入った方が効率的に進められるかと思います。

# DevOpsエンジニア・プロフェッショナル

SOPに合格してから1ヶ月の期間で受験しました。

SAPよりも範囲は絞られます。
SAPで学習した内容と集中力が途切れないうちに受けることをお勧めします。

基本的にはSAP+SysOps+Developerの範囲を総ざらいしました。
正直SAPに合格していれば何とかなると思います。

前日に友人と泥酔してしまい、当日は試験時間前まで自宅のトイレで過ごしました。
モニターにピントが合わず苦戦しました。

結果は合格。

受験者スコアは835点でした。

![スクリーンショット 2021-07-28 21.29.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1526421/852a0d1d-1136-63b4-c419-91177e11569a.png)

感想はSAPより遥かにスムーズに進行出来ました。SAPの長文問題を突破できるなら何とかなる範囲かと。

ここまでで5つの資格を取得できました。
全3回に渡って更新しましたが、少しでも誰かの参考になれば幸いです。

......試験前に酒飲むと合格できるらしい

最後まで閲覧いただきありがとうございました。
ではまた。

---

追記
SCSに合格しました

https://qiita.com/instant_baby/items/5eb30beed98965ea516c
チームラボ社の面接を受けてみて

今回はチームラボのオンラインプログラミング採用から応募して面接を受けました。
選考フローは下記の通りでした。
プログラミングテスト→面接→最終面接→内定
実際、面接を受けてみた感想と改善点を考えてみました。

#聞かれた質問
・自己紹介を2分〜3分程度でお願いします
・アート以外でチームラボのどんな作品が好きですか
・なぜその作品が好きですか
・挫折した経験はありますか
・ポートフォリオについてどんな内容で作りましたか
・データベースやサーバーは何を使っていますか
・AWSは何を使いましたか
・どんな人と働きたいですか

#自分が実際に答えた内容
・自己紹介を2分〜3分程度でお願いします
→高校卒業後4年間コンクリートの研究開発を行なっています。
具体的な業務内容はコンクリートの品質向上のための研究を行なっています。
学習としてはRubyから学習を始めPHPを学習しました。最近はAIに興味がありますのでpythonを学習しております。

・アート以外でチームラボのどんな作品が好きですか
→acure pass、Vegan(ヴィーガン) Ramen UZU KYOTOです。

・なぜその作品が好きですか
acure passは実際に飲み物に触れられてめっちゃ面白いと思いました。
Vegan(ヴィーガン) Ramen UZU KYOTOは食事しながらアートの空間にて食べるので別世界にいる感じがしました。コロナが落ち着いたら行ってみたいと思いました。

・挫折した経験はありますか
会社の人と揉めてしまった経験があったが相手の感情に配慮しつつ自分のメリットを伝えたところ収まった。

・ポートフォリオについてどんな内容で作りましたか
若手技術者の育成の効率化を図るもので専門用語や試験方法といった知識を吸収し、クイズ問題にてアウトプットして記憶の定着を図るものです。

・データベースやサーバーは何を使っていますか
データベースはMySQLでサーバーはAWSです。

・AWSは何を使いましたか
はい、EC2、ROUTE53を使いました。

・どんな人と働きたいですか
プログラミングが好きな人、集まって自己研鑽できる人がいいです。

#改善すべきところ
・自己紹介において今まで1分しか話さなかったので過去の経歴に加えプログラミング学習状況について語って合わせて志望動機も伝えるべきだと思いました。

・好きな作品について理由まで準備したものの個人的に味気ないなと思いました。

#今後のアクションプラン
・2分以上の自己紹介においては、「経歴→プログラミング学習状況→志望理由」といった構成で準備したいと思いました。
・逆質問については余計なことをいわず、相手の話の趣旨にあった回答をする必要があったと思いました。
・会社の作品の理由を自分のエピソードと交えて理由を述べるべきかと思いました。
【TypeScript】型定義の一部プロパティのみ利用したい（Pick,  Omit）

# はじめに
``TypeScript``の``Pick``と``Omit``の基本的な使い方について書きます。

両方とも使い方を簡単に言うと、
「すでに存在する型から、利用したいプロパティをのみを抽出して新しい型を定義する」イメージ

便利でした。

# 書いてみる

このTodoオブジェクト型を元に、利用したいプロパティのみで構成された新たな型を定義する。

```tsx
// interface はオブジェクト型に名前をつけることができるもの
interface Todo {
    title: string;
    description: string;
    completed: boolean;
    createdAt: number;
}
```

## Pick
書き方： ``Pick<型名（元の）, "利用するプロパティ名" | "利用するプロパティ名">;``

```tsx
type TodoInfo = Pick<Todo, "title" | "completed">;
```

下記のような型が定義されたことと同じになる。

```tsx
type TodoInfo = {
    title: string;
    completed: boolean;
}
```

## Omit
書き方： ``Omit<型名（元の）, "利用しないプロパティ名" | "利用しないプロパティ名">;``

```tsx
type TodoInfo = Omit<Todo, "description" | "createdAt">
```

下記のような型が定義されたことと同じになる。

```tsx
type TodoInfo = {
    title: string;
    completed: boolean;
}
```

# 最後に
ありがとうございました！！

- https://www.typescriptlang.org/docs/handbook/utility-types.html
- https://qiita.com/k-penguin-sato/items/e2791d7a57e96f6144e5
[Ruby]renderメソッド記述時のインスタンス変数の動き

# はじめに
本記事では、renderメソッド記述時のインスタンス変数の動きをまとめました。
初学者の方々はとても重要な部分になります。
ぜひ覚えましょう。

# renderメソッドとは
`部分テンプレートを呼び出す`際に利用するメソッドです。
呼び出す部分テンプレートは、partialというオプションで指定します。

###partialオプション
部分テンプレート名を指定することで、該当する部分テンプレートを表示できます。
（例）_form.html.erbという部分テンプレート呼出

```ruby
<% render partial: "form" %>
```

###localsオプション
部分テンプレート内でその変数を使えるようになります。

**local『s』です！！**
**localではありません。**
sを忘れてはなりません！！

```ruby
<% render partial: "sample", locals: { post: "Sunplaza_Nakano" } %>
```
上の記述では、
部分テンプレート内において「Sunplaza_Nakano」という
文字列の代入されたpostという変数が使えるようになります。


# 本題です
インスタンス変数がいろんなところで受け渡しされます。

（例）
今回は、newアクションを焦点にしていきます。
コントローラーでインスタンス変数「@prototype」を生成し、ビューへ渡します。


```ruby
class PrototypesController < ApplicationController
  def index
    @prototypes = Prototype.all
  end

  def new
    @prototype = Prototype.new
  end
・
・
・
省略
・
・
・
end
```

ビューが「@prototype」を貰います。
その後、部分テンプレートを生成する機会があったとし、renderメソッドを使用します。

そこで、部分テンプレート用にlocalsの部分で、
「@prototypes」をさらに「prototype」という変数にします。

その後、前述で説明した「partialオプション」にて"form"の指定があるので、
_form.html.erbへ「prototype」を渡します。

```ruby
<div class="main">
  <div class="inner">
    <div class="form__wrapper">
      <h2 class="page-heading">新規プロトタイプ投稿</h2>
        <%# 部分テンプレートでフォームを表示する %>
        <%= render partial: "form", locals: { prototype: @prototype } %>
    </div>
  </div>
</div>
```

_form.html.erbにて「prototype」を貰います。
formメソッドに着目すると、
「model:prototype」

と記述されています。

```ruby
<%= form_with model: prototype, local: true do |f|%>
  <div class="field">
    <%= f.label :title, "タイトル" %><br />
    <%= f.text_field :title, id:"prototype_title" %>
  </div>
・
・
・
省略
・
・
・
<% end %>
```

このように変数たちは移動しています。

この移動は、アクションごとに追う必要があります。
注意しましょう。

# 終わりに
現在、学習中のカリキュラムをほぼ終え、
自分の手で、コードを記述しているフェーズになっています。

その際に、理解しているようで理解していなかった部分を今回記事にしました。

引き続き、頑張りましょう！！
ローカルサーバーを外部に公開しよう

#ローカルサーバーを外部に公開！

今回は業務で使用したngrokというサービスについて紹介します。
タイトルにもある通り、このngrokというサービスを使うことでローカルサーバーを外部に公開することができます。
例えば、よくある
http://localhost:5500/
などのURLでローカル上でテストだったり動作確認をしていると思いますが、
このURLではあくまでも自身のローカル端末でしかアクセスできません。

しかし、ngrokを使用することで外部からアクセスできるURLを発行してくれるのです！
ちょっと作ったページを友人に見せることも可能なります！

では、さっそく使い方について説明していきます。

##ngrokをダウンロード

以下のサイトより、インストールする端末のOSに合ったものを落としてきます。
https://dashboard.ngrok.com/get-started/setup

zipファイルなので落とした後は任意の場所へ解凍します。
私はCドライブ直下へ解凍しました。
すると以下のようにexeファイルが配置されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031387/46daa37f-7e62-2853-bedc-95bf91f9af2b.png)

これで準備は完了です。

##いよいよローカルサーバーを外部に公開しよう！！

準備ができたところで、ngrok.exeをクリックするか、ngork.exeファイルがある階層でコマンドプロンプトを開きます。
するとこのような画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031387/4bb77544-9fc7-9023-0004-299b8058e7a2.png)

ngrokのコマンドの叩き方だったりバージョン情報が表示されます。

あとは公開したいローカルサーバーのport番号をngrokのコマンドを使用して叩くのみです。

```
ngrok http 5500
```

実行するとコンソールにURLが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031387/dbd34139-ffd1-6bfe-8df0-cdf48ef173eb.png)

httpとhttpsの両方のURLが発行されます。
実際にこのURLにアクセスすると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031387/32cec9ab-8f72-2f69-e94b-796c9ec87283.png)

画面が表示されました。
※今回は個人的に作成中のサイトを公開してみました。


###まとめ
今回たまたま、業務中にngrokを使用しこんなに便利なサービスがあるのかと驚きました。
新卒で入社した会社の研修でサーバーを外部に公開するという課題が最後まで解けませんでしたが、
これを使えばできたかも？（正規のやり方ではないと思うが、、）
ngrokを使うことで友人へ作ったものをサクッと紹介できたりするので勉強のモチベーションが
少し上がりました。（笑）

簡単にできるので皆さんもぜひ使ってみてください！
Slackでチャンネルに（ほぼ）全員を招待する方法

# はじめに
新しくチャンネルを作った時に、沢山いるメンバーを一気に招待する方法です。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [手順](#Chapter1)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 手順

① 追加したいメンバー全員が参加しているチャンネルで `/who`と送信 （自分にしか見えません）
② メンバーのリストをコピー
③ 新しく作ったチャンネルにて「メンバーを追加する」をクリック
④ メンバーのリストをペースト

<a id="#reference"></a>
# 参考文献
- [チームメンバー全員を新しいSlackチャンネルに招待するにはどうすればよいですか
](https://www.it-swarm-ja.com/ja/slack/%E3%83%81%E3%83%BC%E3%83%A0%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E5%85%A8%E5%93%A1%E3%82%92%E6%96%B0%E3%81%97%E3%81%84slack%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E3%81%AB%E6%8B%9B%E5%BE%85%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B/965258520/)
- [Qiita記事投稿用テンプレート](https://qiita.com/tkrtmy1031/items/80c292fab5d631c6d4ba)
Swift　メモリ管理

Swiftのメモリ管理
--
Swiftはメモリ管理する際はARC（Automatic Reference Counting）という方法になっている.

ARCとは
--
オブジェクトが他のオブジェクトから参照されている数を参照カウントとしてゲットしてきて、この参照カウントを追跡してインスタンスを解放をするかどうか判断する。
この参照カウントが一つでもあるとオブジェクトが破棄されることはなくインスタンスは解放されない。
０になった際にオブジェクトは破棄されてガーベジコレクタにいく。
Swiftではオブジェクトが参照した際はデフォルトで強参照になっている。

解放されたかどうかを確かめるには
--

deinitを使用する。解放されたprintされる。

書き方

```swift
class Fish {
  var name: String
    init(name: String) {
        self.name = name
    }
    
    // デイニシャライザを定義する
    deinit {
        print("deinit!")
    }
}
```

強参照の循環、循環参照
---
参照型同士のオブジェクトが参照しあっていると循環参照になり、参照カウントが絶対に１にならないようになってしまう。

```swift
class Fish {
  var animal: Animal?
  init() {}

  deinit {
    print("Fishクラスのインスタンスが解放されました")
  }
}

class Animal {
  var fish: Fish?
  init() {}

  deinit {
    print("Animalクラスのインスタンスが解放されました")
  }
}
```

AnimalクラスとFishクラスが参照しあっているため、どんなに少なくても参照カウントが１となり、メモリが解放されることはなくなってしまう。
また循環参照は別名、強参照の循環とも言われる。

循環参照の解決
---
手段は２つ
1weak（storyboardでよくみるあれ）
2unowned

```swift
class Fish {
  // 弱参照させる
  weak var animal: Animal?
  init() {}
  deinit {
    print("Fishクラスのインスタンスが解放されました")
  }
}
```
var、letの前に```weak```をつけることで弱参照にし、参照カウント煮含めないようにする。参照しあっているオブジェクトが他にいなければカウントがゼロになり解放される。

weakに対して```unowned```はクラスがオプショナル型ではなくnilであることを許容しない場合に使う。

```swift
class Fish {
  var animal: Animal?
  init() {}

  deinit {
    print("Fishクラスのインスタンスが解放されました")
  }
}

class Animal {
  unowned var fish: Fish//nilを許容しない
  init() {}

  deinit {
    print("Animalクラスのインスタンスが解放されました")
  }
}
```

クロージャー内の循環参照
--

クロージャーもインスタンスなのでクロージャー内でインスタンスを利用する場合は循環参照になる


```swift
class Animal {
    let name: String
    init(name: String) {
        self.name = name
    }
    lazy var getInfo: () -> String = { [weak self] in
        return "\(self.name)" // selfの参照カウントが+1になり解放されない
    }
}
```

Animal→getInfo,getInfo→Animal（self)で循環参照してしまっていたため```[weak self]```をつける（キャプチャリストという）ことで弱参照にできる。
ロジスティック回帰 penaltyについて

# はじめに
Kaggleでロジスティック回帰を使用してモデルのスコアを向上させようともがく中でGridsearchという方法を知った。
ロジスティック回帰のパラメータを全通り実行することで、最もいいパラメータを求めるというやり方だ。

~~なんてCPUと時間にものを言わせたやり方なんだ！全く理解していなくとも脳死でできるじゃないか！最高！~~

流石に社会にでて脳死で全パラメータやりました！意味は知らないですけど！とは言えないので簡単に理解することを目的とする。

#ロジスティック回帰とは
線形回帰にロジット関数をかけることで説明変数がどんな値でもなんらかの目的変数を取るようにするやり方。

$$ロジット関数 : log(\frac{p}{1-p})$$

2値分類、説明変数1つと仮定すると

$$log(\frac{p}{1-p}) = \beta_0 + \beta_1x$$
$$\beta_0 : 切片,  \beta_1 :傾き$$

で表される。さあこれをp(目的変数が1である確率)について解くと

$$p=\frac{1}{1 + exp(\beta_0 + \beta_1x)}$$

になる。このβ0とβ1を最適化していきたいっていう話。

ここで使うのが尤度関数と呼ばれる関数。(大学で学んだ気もする)
それっぽい値にしていくっていう関数のイメージ

$$p_n = y_n^{t_n}(1-y_n)^{1-{t_n}}$$
$$t_n : Positiveなら１ Negativeなら0をとる値$$

仮にtnが1(正解)ならyn(正解を取る確率)を上げていきたいよねっていうイメージ
これの積を求めて多変数に対応させると

$$L(\beta) = \prod_{n=1}^{n}y_n^{t_n}(1-y_n)^{1-{t_n}}$$

になる。掛け算は計算量が膨大になることと、-を取ることで最小化問題にしたいので-logを掛ける。

$$-logL(\beta) = -\sum_{n=1}^{n}(t_nlog{y_n} + (1 - t_n)log(1-y_n))$$

という式になる。この式を交差エントロピー誤差関数と呼ぶらしい。
これのynに含まれるβで微分すると

$$\frac{d}{db}L(\beta) = \sum_{n=1}^{n}x_n(y_n - t_n)$$

になる。この式は勾配降下法の式らしいけどよく知らない。
求め方は微分の分配だけど描くの面倒なので画像でも貼る。

![Imgur](https://i.imgur.com/2viFfP1.jpg)

# 本題
かなり前置きが長くなったが、本題であるパラメータの話に移る。
公式docmentから

- penalty
- dual
- solver...

とparamが並ぶが今回はpenaltyの話。
時間があったら全パラメータ解説していく。

# penaltyの種類
公式より
[https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression)


penalty : {‘l1’, ‘l2’, ‘elasticnet’, ‘none’}, default=’l2’
Used to specify the norm used in the penalization. The ‘newton-cg’, ‘sag’ and ‘lbfgs’ solvers support only l2 penalties. ‘elasticnet’ is only supported by the ‘saga’ solver. If ‘none’ (not supported by the liblinear solver), no regularization is applied.

New in version 0.19: l1 penalty with SAGA solver (allowing ‘multinomial’ + L1)

L1,L2,elasticent,noneの4つがあるらしい。
調べていくと


- L1  (Rasso)
    いくつかの特徴量を0にしてしまって過学習を防ぐやり方
    課題としてサンプル数nより特徴量pが大きい場合、pの取れる最大値はnになってしまう

- L2  (Ligge)
    数値の絶対量を減らすことで過学習を防ぐやり方。イメージとして標準化と同じ？    
- elasticnet
    L1,L2の両方を使用して使うやり方。L1とL2bの前に重みをつけることによって最適な値を回数を回すことで求めようとするやり方。
    L1が使えてないのであれば、L２に自動的に切り替えてほしかったけどそういうわけにもいかないのかな
    とりあえずこれを使えばいいと思うのだけれどdefaultがl2なのでなんらかの欠点があるのかもしれない

- NONE
    多分なんの正則化も行なっていない  

公式に出てくる‘newton-cg’とかは最適化問題に使う関数の種類のこと。使える組み合わせと使えない組み合わせがあるっぽい。
次はsolverについて書こうと思う。
[UE4] メンバ変数の初期化について

#【概要】
「UE4では明示的な初期化をしなくても、メンバ変数はに0に初期化されるもの」
勝手にそう思い込んでいたが、実際そんなことはなく、理解が浅いまま危ない実装をしていたので、これを期にメンバ変数の初期化についてまとめてみた。

動作環境はUE4.24、VisualStudio 2019を使用。

#【公式ドキュメントを読んでみる】
まずは公式ドキュメントを読んでみる。
https://docs.unrealengine.com/4.26/ja/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Objects/Optimizations/
>#####プロパティの自動初期化
>コンストラクタが呼び出される前に、UObjects は初期化時に自動的にゼロになります。これはクラス全体、UProperties、ネイティブ メンバでも同様に起こります。

つまり、UObjectを継承したクラスのメンバ変数は、明示的に初期化をしていなくても、0に初期化されるということが分かった。

逆に言えば、**UObjectを継承していないクラスや、構造体などのメンバ変数は、自動的に初期化されない**ことになる。

#【実践】
上記を踏まえた上で、実際にコードを書いてみる。

```Test.h
//UObjectを継承しないクラス
class Test
{
public:
	Test(){};

	bool BoolVal;
	int32 IntVal;
	float FloatVal;
	class AActor* Ptr;
};

//UObjectを継承したクラス
UCLASS()
class UTest_UObject : public UObject
{
	GENERATED_BODY()

public:
	UTest_UObject(){};

	bool BoolVal;
	int32 IntVal;
	float FloatVal;
	class AActor* Ptr;
};
```

```Player.cpp
APlayer::BeginPlay()
{
	//適当な場所でインスタンス生成
	Test* TestPtr = new Test();
	UTest_UObject* TestPtr_UObject = NewObject<UTest_UObject>(this, UTest_UObject::StaticClass());

	UE_LOG(LogTemp, Log, TEXT("TestPtr BoolVal:%d, IntVal:%d, FloatVal:%.2f, Ptr:%d"), (int32)TestPtr->BoolVal, TestPtr->IntVal, TestPtr->FloatVal, TestPtr->Ptr);
	UE_LOG(LogTemp, Log, TEXT("TestPtr_UObject BoolVal:%d, IntVal:%d, FloatVal:%.2f, Ptr:%d"), (int32)TestPtr_UObject->BoolVal, TestPtr_UObject->IntVal, TestPtr_UObject->FloatVal, TestPtr_UObject->Ptr);
}
```

実行結果

```
LogTemp: TestPtr BoolVal:96, IntVal:342, FloatVal:0.00, Ptr:6619236
LogTemp: TestPtr_UObject BoolVal:0, IntVal:0, FloatVal:0.00, Ptr:0
```

ドキュメント通り、UObjectを継承したクラスは全てのメンバ変数が0に初期化されたが、継承していないクラスは初期化されなかった。

#【初期化の方法】
明示的に初期化する方法はいくつかあるので、軽く触れておく。

```Test.h
class Test
{
public:
	Test();
	//一番最初に初期化される
	int32 IntVal = 1;
};
```

```Test.cpp
Test::Test()
	//初期化リスト。ヘッダーの次に初期化される。
	:IntVal(2)
{
	//初期化リストの次に初期化される。代入と同じなので負荷は他に比べて重い。
	IntVal = 3;
}
```

#【結論】
初期化されなかった場合、元々メモリに存在していた値がその変数の値になる。
ローカル変数はメモリの書き換えが多いスタック領域に作られる為、初期化しないとゴミが入ることが多く、コンパイラによっては初期化しないとエラーになる場合がある。
ただし、ヒープ領域に作られるから大丈夫というわけではないので、**明示的に初期化する習慣を付けることをオススメ**する。
穴埋め問題で、Bert(日本語)の威力を体感する。

# はじめに

タイトルのとおり、
穴埋め問題で、Bert(日本語)の威力を体感する。

**『今日は最悪の一日だ。』**
**『今日は最高の一日だ。』**

の前振りに対するBertの反応をみた。


## 環境
OS: windows
transformers: 4.9.1
GPU: I do not have a GPU.

# 検証結果

## 問題1
### 問題文

(今日は最悪の一日だ。財布を XXX した。)

```py
input_ids = tokenizer.encode(f'今日は最悪の一日だ。財布を{tokenizer.mask_token}した。', return_tensors='pt')
```

### 回答

```
[CLS] 今日 は 最悪 の 一 日 だ 。 財布 を 紛失 し た 。 [SEP]
[CLS] 今日 は 最悪 の 一 日 だ 。 財布 を 用意 し た 。 [SEP]
[CLS] 今日 は 最悪 の 一 日 だ 。 財布 を 破壊 し た 。 [SEP]
[CLS] 今日 は 最悪 の 一 日 だ 。 財布 を 発見 し た 。 [SEP]
[CLS] 今日 は 最悪 の 一 日 だ 。 財布 を 回収 し た 。 [SEP]
```

⇒⇒ 100点かな。。。

## 問題2
### 問題文

(今日は最高の一日だ。財布を XXX した。)

```py
input_ids = tokenizer.encode(f'今日は最高の一日だ。財布を{tokenizer.mask_token}した。', return_tensors='pt')
```

### 回答

```
[CLS] 今日 は 最高 の 一 日 だ 。 財布 を プレゼント し た 。 [SEP]
[CLS] 今日 は 最高 の 一 日 だ 。 財布 を 購入 し た 。 [SEP]
[CLS] 今日 は 最高 の 一 日 だ 。 財布 を 用意 し た 。 [SEP]
[CLS] 今日 は 最高 の 一 日 だ 。 財布 を 交換 し た 。 [SEP]
[CLS] 今日 は 最高 の 一 日 だ 。 財布 を 準備 し た 。 [SEP]
```

⇒⇒100点かな。。。
「なくした財布を」ならば、「発見」したとかだろうけど、、、、この文なら、
「プレゼント」は、面白いと思う。

# コード

```py
import torch
from transformers import BertJapaneseTokenizer
from transformers import BertForMaskedLM

tokenizer = BertJapaneseTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking')

model = BertForMaskedLM.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking')

input_ids = tokenizer.encode(f'今日は最悪の一日だ。財布を{tokenizer.mask_token}した。', return_tensors='pt')

masked_index = torch.where(input_ids == tokenizer.mask_token_id)[1].tolist()[0]

result = model(input_ids)
pred_ids = result[0][:, masked_index].topk(5).indices.tolist()[0]
for pred_id in pred_ids:
    output_ids = input_ids.tolist()[0]
    output_ids[masked_index] = pred_id
    print(tokenizer.decode(output_ids))
```

上記は、
https://www.koi.mashykom.com/bert.html
などを参考にさせて頂きました。
（他のサイトもいろいろ、参考にしています。）

# 余談
以下の記事で、ネガティブに（笑）に、引用されていた。でも、内容は面白い。
https://ai-de-seikei.hatenablog.com/entry/2022/01/10/111614


# まとめ
それなりな感じ。。。
ES Lintのエラーが治らないとき、古いエラーを吐き続けているときの対処法

# はじめに
Nuxt.jsでメディアをよく運営しています。
ES Lintを使っていると、極稀にエラーを修正したのにも関わらず。古いエラー（昔のエラー）がでたりし続けたりして、非常に時間が取られたので対処法をここに書きます。

# 意味のなかった解決策
 - `npm run dev`　を停止してもう一度起動
 - エディタの再起動
 - Mac（PC本体）の再起動

# 実際に解決した方法
`npm run dev`を停止後に
 `.eslintcache`と`node_modules`を削除後に
`npm install`を実行

一度`node_modules`を消すとエディタのプラグインがエラー吐いたりするので、
エディタを再起動後に`npm run dev`を実行すると解決しました！