OmniAICreator/Qiita-1.07M huggingface dataset:
【ルール説明・shared】ignore-errors

こちらの記事は[Ansible lint Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ansible-lint) 20日目の記事になります。

今回はルール [ignore-errors](https://ansible-lint.readthedocs.io/rules/ignore-errors/) について説明します。

### ignore-errors

[ignore-errors](https://ansible-lint.readthedocs.io/rules/ignore-errors/) は [ansible.builtin.command](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/command_module.html)モジュールおよび [ansible.builtin.shell](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/shell_module.html) モジュールにおいて [ignore-errorsディレクティブ](https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_error_handling.html#ignoring-failed-commands) が付与されることによりコマンド実行時のエラーが無視されないかどうかを検証します。

コマンドが`failed`を返すにも関わらずエラーを無視すると実際の失敗を隠したり、タスクを誤って失敗と出力したり、予期しない副作用や動作が発生します。

注意する点として [ignore-errorsディレクティブ](https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_error_handling.html#ignoring-failed-commands) はコマンド実行時のエラーを無視するのみでシンタックスエラーや接続エラー、ファイルが存在しない等のコマンド実行に関わらないエラーは無視されずそのままエラーになります。

#### 問題のあるコード

```yaml
---
- name: Example playbook
  hosts: all
  tasks:
    - name: Run apt-get update
      ansible.builtin.command: apt-get update
      ignore_errors: true # <- コマンドのエラーを全て無視する設定になっている
```

#### 修正されたコードその１

`"{{ ansible_check_mode }}"`を付与して[エラーを無視](https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_checkmode.html#skipping-tasks-or-ignoring-errors-in-check-mode)します。


```yaml
---
- name: Example playbook
  hosts: all
  tasks:
    - name: Run apt-get update
      ansible.builtin.command: apt-get update
      ignore_errors: "{{ ansible_check_mode }}" # <- Ignores errors in check mode.
```

#### 修正されたコードその２

エラー情報を変数へ登録します。

```yaml
---
- name: Example playbook
  hosts: all
  tasks:
    - name: Run apt-get update
      ansible.builtin.command: apt-get update
      ignore_errors: true
      register: ignore_errors_register # <- エラー情報を変数へ登録する
```

#### 修正されたコードその３

`whenディレクティブ`を付与しエラーになる条件を定義します。

この書き方が一番良いみたいだと言う旨のブログ記事がいくつか観測されています。恐らく [ignore-errorsディレクティブ](https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_error_handling.html#ignoring-failed-commands) を利用せずにこのように処理を記述するのが良いのだと思います。

```yaml
---
- name: Example playbook
  hosts: all
  tasks:
    - name: Disable apport
      become: "yes"
      lineinfile:
        line: "enabled=0"
        dest: /etc/default/apport
        mode: 0644
        state: present
      register: default_apport
      failed_when: default_apport.rc !=0 and not default_apport.rc == 257 # <- エラーになる条件を定義する.
```



### 参考サイト

* [ignore-errors — Ansible Lint Documentation](https://ansible-lint.readthedocs.io/rules/ignore-errors/)
* [Error handling in playbooks — Ansible Documentation](https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_error_handling.html#ignoring-failed-commands)
* [Validating tasks: check mode and diff mode — Ansible Documentation](https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_checkmode.html#skipping-tasks-or-ignoring-errors-in-check-mode)
* [ Ansible ignore_errors are evil - Sorin Sbarnea's Crib / Ansible lintのメインコントリビューターの記事 ](https://sbarnea.com/ansible/ignore-errors-are-evil/)
Python のデコレーターで関数以外を返した場合

デコレーターで関数以外を返した場合はどうなるのかを確認します。

# 結論
* エラーは起きない
* 受け取った関数名で、渡した値が定義される

```python
def decotator(func: Callable):
    return 'test'

@decorator
def test_func():
    return 1

>>> test_func
'test'

# メソッドの場合も同様
class Test:
    @decorator
    def test_method(self):
        return 1

>>> Test.test_method
'test'
```

これを利用して`callback`をデコレーターでラップしてオブジェクトを定義する、ということをやってみました。
Djangoの`ModelForm`のようにCSVを扱える自作nパッケージ`model-csv`で以下のような使い方を実装してみました。

```python
# 今までの使い方
class BookCsv(ModelCsv):
    # Column インスタンスを定義していた
    title = columns.MethodColumn(header='title')

    # callback は別にメソッドで定義していた
    # field_<名前> で探している
    def field_title(self, *args, **kwargs):
        return ...
```
`title` というクラス変数の名前をもとに`callback`メソッドを探していたのですが、
デコレーターでも定義できるようにしました。

```python
# 新しい使い方
class BookCsv(ModelCsv):
    # デコレーターの内部で Column インスタンスを作成して返している
    # Column オブジェクトの callback に定義した title メソッドを渡している
    @columns.as_column(header='title')
    def title(self, *args, **kwargs):
        return ...
```

いろいろとできることは増えますが、混乱を招く危険性もあるので注意が必要です。
rubyの検索問題 バイナリーリサーチ

# 問題
- 以下の配列に任意の値が存在するかどうか、そして何番目に存在するのか、検索するコードを作成する。

- 添字が0の要素、つまり以下の配列における「1」は「配列の0番目に存在する」と表現します。

~~~ruby
array=[1,3,5,6,9,10,13,20,26,31]
~~~

- 任意の値が配列内に存在しない場合は、「値は配列内に存在しません」と出力する。
- 存在する場合は、配列の何番目に存在するのか表示する。

検索にはバイナリーリサーチ（2分割検索）を使用して行う。

# 補足(バイナリーリサーチとは？)

ソート済みのリストや配列に入ったデータに対する
検索を行う時に用いられる手法のこと
まず中央の値を確認し、検索したい値との大小関係を用いて
検索したい値が中央の右にあるか左にあるかを判断する。
それを繰り返し、片側に存在しない事を確認しながら検索する方法。


# 解答
~~~ruby
def binary_search(array, right, target)
  left = 0
  while left <= right
    center = (left + right) / 2
    if array[center] == target
      return center
    elsif array[center] < target
      left = center + 1
    else
      right = center - 1
    end
  end
  return -1 
end

array=[1,3,5,6,9,10,13,20,26,31]

puts "検索したい数字を入力してください"
target = gets.to_i
number_of_elements = array.length

result = binary_search(array, number_of_elements, target)

if result == -1
  puts "#{target}は配列内に存在しません"
else
  puts "#{target}は配列の#{result}番目に存在します "
end
~~~

# 解説
~~~ruby
def binary_search(array, right, target)
  left = 0
  while left <= right
    center = (left + right) / 2
    if array[center] == target
      return center
    elsif array[center] < target
      left = center + 1
    else
      right = center - 1
    end
  end
  return -1 
end
~~~

この部分で中央値の設定と検索したい値の大小を条件分岐を用いて記述している。
target(検索したい値)が中央の値より大きい場合は、左から＋1する。
target(検索したい値)が中央の値より小さい場合は、右から-1する。

return -1の記述は検索したい値が配列内に存在しなかった場合の戻り値として記述している。

その結果を
~~~ruby
result = binary_search(array, number_of_elements, target)
~~~
の変数resultに代入している。

~~~ruby
if result == -1
  puts "#{target}は配列内に存在しません"
else
  puts "#{target}は配列の#{result}番目に存在します "
end
~~~
上記で-1だった時、つまり配列内に存在しなかった場合と
配列内に存在した場合とに条件分岐している。

# 最後に
バイナリーリサーチの概念は非常に難渋したので、
備忘録として残しておきました。
[React] Material UI(MUI)でドロップダウンを作る2つの方法 

みなさんこんにちは、
今回はReactのライブラリ、MUIを使ったドロップダウンの書き方について
```<TextField>```と```<Autocomplete>```の2種類の方法をメモ程度に記します。
あくまでサンプルなので内容は適宜変更してください。

表示するデータは以下を前提として進めます。
```javascript
const selectBox = [
  { label: "label1", value: "value1" },
  { label: "label2", value: "value2" },
  { label: "label3", value: "value3" }
];
```


1. **TextFieldを使った書き方**
```javascript:
import { TextField, MenuItem } from "@mui/material";

<TextField id="selectbox" 
  label="初期設定のラベル"
  select  // ← このselectが要
  fullWidth
>
// 以下セレクトの内容を一つ一つMenuItemに格納
  {selectBox.map((item, index) => (
    <MenuItem key={index} value={item.value}>
      {item.label}
    </MenuItem>
))}
</TextField>
```
2. **Autocompleteを使った書き方**
```javascript:
import { TextField, Autocomplete } from "@mui/material";

<Autocomplete
  id="selectBox"
  name="AutoComplete で作ったプルダウン"
  fullWidth
  options={selectBox} // ← このoptionsの内容が要
  renderInput={(params) => <TextField {...params} label="初期設定のラベル"/> }
  value={selectBox.label}
  // 以下ドロップダウンに必要な要素を記述 
  renderOption={(props, option) => (
    <li {...props} key={option.value}>{option.label}</li>
  )}
  // これがないと警告が出るらしい
  isOptionEqualToValue={(option, value) =>
    value.value === "" || option.value === value.value
  }
/>
```

上記2種類のコードを記載したCodeSandBoxを以下に載せておきます。

https://codesandbox.io/embed/cranky-phoebe-r2kynr?fontsize=14&hidenavigation=1&theme=dark


##### 最後に
今回はドロップダウンの内容についてでした。
正解はいろいろあるので必要に応じて書き換えていくのがよいのでしょうか…
おそらく他にも書き方は何通りもあると思うので他の書き方も学んでいきたいです。


ドロップダウン、プルダウン、セレクトボックスいろんな呼び方があってどれが正解かいまいち難しい…
【Flutter】Android StudioでLogcatがなぜか存在しない

# はじめに
普段はVScodeでFlutter開発してるのですが、ある事情によりAndroid Studioを使ってみることになりました。

するとLogcatがない。。。。
![Screen Shot 2022-12-19 at 21.34.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/9e247cf6-082a-7269-6945-d8f91c472bee.png)

# Event Logにも何もない
https://zenn.dev/fukutan/articles/33e45b48cf8fa6

![Screen Shot 2022-12-19 at 21.39.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/064e3c5b-5605-fdca-bc35-a0dd4e3fcfa4.png)
Event Logに何も表示されません。。。

どうしたら良いんですか？ずっとLogcatなしで開発していけというのですが？

# 別のやり方がありました！
`File > Project Structure > Modules`で+ボタンを押して「Android」を選んでデフォルトのままOKを押すと

![Screen Shot 2022-12-19 at 21.52.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/1e7cf178-09a6-8db0-7a18-3193426905fc.png)
![Screen Shot 2022-12-19 at 21.53.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/2e1ce3a7-dcb7-d713-5e7a-00ed804df9d0.png)


**Logcatが現れました！！！**

![Screen Shot 2022-12-19 at 21.32.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/8d2a1740-2382-ded0-a934-167eb39c01cc.png)

# 参考
https://piedcipher.medium.com/how-to-enable-logcat-in-android-studio-for-flutter-projects-917eb0dbf46d
育休中のジーズ生活

## はじめに
はじめまして！ジーズアカデミー福岡校DEV１２期のすえまつさきです。
[ジーズアカデミー Advent Calendar 2022](https://qiita.com/advent-calendar/2022/gsacademy)の２０日目の記事を担当させていただきます。
昨日は同期で我らが幹事リーさん（@guolam）の[YOUは何しにジーズへ？](https://qiita.com/guolam/items/28275dfbc9c52aa126ed)でした！
大好きな彼女からのバトンをもらい、２０日目の記事を書きたいと思います。

## 本記事について
育休中にジーズアカデミーに入るまでと、入ってみて感じていることを書いてみます。
技術的なことは書けそうにないのでポエムのようなものです。

## 読んでほしいのはこんな方
育休中の勉強を考えている方
育休中に寂しさを感じている方

## 自己紹介
私は２０２２年５月に次男を出産して、現在育休中の兼業主婦です。
小４の長男、小２の長女、６ヶ月の次男と三児の母やってます。
夫は単身赴任で、週末だけ自宅に帰ってくるというスタイルのため、平日はワンオペでバタバタと生活しています。
長男出産前は某メガバンクのシステム子会社のプログラムは書かないでいい部署で働いていました。
入社時の研修でPL/1とJavaはがっつりやったはずですが、正直何も覚えていません。
業務で使っていたSQLとEXCELだけは身につきました！
長男出産後、夫の転職も東京から福岡に帰ってくることになり、泣く泣く退職。
長女を出産後、派遣社員を経て、建設コンサルタントで交通系ビックデータを分析する仕事をパートタイムでしています。

SQLはある程度できる、でもプログラムはなんとなーく読めるだけでイチから書くのはできない、というエンジニアもどきのような中途半端な自分にもやもやを抱えていました。

## ジーズアカデミーとの出会い
今から遡ること４〜５年前。中学・高校の先輩にもやもやの相談をしたところ、ジーズを紹介してもらいました。
東京DEV８期卒業の先輩曰く「めっちゃキツい。キツいけど力になるし、ためになる。めっちゃキツいけど」とのこと。
福岡校もあるから興味があったら調べてね、と言われホームページを見たところ興味津々！
チャレンジしてみたいけど、時間の確保が難しそうだなと思い、その時は断念しました。

## ジーズアカデミーとの再会
第３子を出産後、地下鉄に乗っているときにジーズアカデミーの広告を見かけて、また興味がむくむくと湧いてきました。
この時、赤ちゃんは２ヶ月。まだまだ頻回の授乳で生活のリズムも赤ちゃん中心で、今はその時ではないなと思っていました。
でも諦め悪く、ジーズアカデミーのホームページや卒業生インタビューを舐めるように読んでいましたw
赤ちゃんが３ヶ月になる頃、夜に寝て朝になったら起きるというリズムが出来上がってきて、これはもしかしてチャンスなのではと考え始めました。

## ジーズアカデミーにチャレンジ
赤ちゃんがいる生活では、赤ちゃんが寝ている時間＝自由時間です。
日中の赤ちゃんが寝ている時間は家事や上の子たちのお世話で潰れてしまいますが、夜子供達が寝ている時間はフリータイム！赤ちゃんと寝起きを共にする生活を辞めて、最低限の睡眠時間を確保しつつ、勉強の時間を取ることができるなと見込みがたったところで10/8の説明会に申し込み、説明会翌日のIQ試験を経て、10/15に入学と相成りました。

## 家族の理解あってのジーズ生活
入学を前に夫と小学生の子供たちには、土曜日に４時間の授業を受けること、宿題がたっぷり出るから夜は私の勉強の時間になることを説明しました。
幸い、システム職の夫は「リスキリング大事！行っといで！」と快く送り出してくれて、週末はがっつり子供たちに向き合ってくれています。
リスキリングって何？と夫に隠れてググった思い出（笑）
子供たちは「今週の宿題なーに？なに作るの？いつ出来上がるの？」と、毎週ヒィヒィ言っている私に圧をかけてきます。
応援として受け止めて日々頑張っています！

## わかっちゃいたけど大変だった
日々の家事育児に加え、最低限の睡眠時間を確保しつつの課題制作、わかっちゃいたけど大変です。
上の子たちの宿題がなかなか終わらず、私の勉強がなかなか始められなくてイライラなんてこともよくあるし、赤ちゃんは夜ぐずることも当然あるので課題をやる手を止めてあやすこともしばしばだし、赤ちゃんと一緒に寝落ちしてしまって課題の進捗がピンチ！なんてことは毎週のようにあります。
睡眠時間を急に減らしたせいか体中に湿疹ができて、皮膚科で「あなた疲れているのよ、ちゃんと寝なさい」と叱られたりもしています。
でも、ジーズ生活、楽しいです！

## 育休中のジーズ生活の良いところ
育休中にジーズって正気の沙汰じゃないという意見もあるかと思いますが、個人的に育休中でよかったなと思うところがいくつかあります。

### ジーズのコミュニティの温かさ
産休・育休中に孤独感を感じるお母さんは多いと思います。
会社からは事務連絡しか来ないし、日中はおしゃべりできない赤ちゃんと二人きり。産後しばらくは外出もままならないし、自分の体調が落ち着いてもコロナ禍で赤ちゃんを連れての外出は気が引けるしとなると、どんどん社会から切り離されているような気さえしてくることもあります。
でも、ジーズのコミュニティがあれば大丈夫！
いろんな世代、背景の同期が一緒に頑張ってくれるし、担任や講師の先生、チューターの方達にはがっつり支えてもらえるし、SNSではジーズの先輩たちが励ましてくれる。
この繋がりと温かさは本当にありがたい！みんな大好きです！！

### 働いてないから温存される体力、精神力
１日働いて、家事育児して、それからジーズの課題に取り組むという体力は私にはきっとありませんでした。
育休中は基本的に自宅とその周辺での生活なので通勤で体力を削られることもないし、課題を提出した後の金曜日は赤ちゃんと一緒に昼寝して体力回復もできます。
しかも、会社の人間関係からも解放されてストレスフリーです！
働きながらジーズに通っている方、みんなすごい。尊敬しています！

### できることが増える喜び
日々できることが増えていく赤ちゃんや子供たちを見ていると、仕事から離れている自分は何も成長してないなとなぜだか凹んだことがあります。
でも、ジーズのある生活をしていたら触るSNSも増えて新しいことを知れるし、何よりプログラミングで何かを生み出せるようになっていく。
大人になっても、正社員じゃなくても、お母さんでも、まだ成長できるんだというのは大きな喜びです。

## おわりに
とりとめなく書いてきましたが、育休中のジーズ生活も悪くないと思っていただけたら幸いです。
日々の生活に加えてのジーズ、大変です。
この記事を書いている今日、娘が数年ぶりに発熱してバタバタしてしまい、作業できる時間の確保が難しい時もあります。
そんなこんなでもなんとか最後まで走り抜けたらなと思っています。

明日は同期の中でヤバい（褒め言葉！）一角を担っている変態（褒め言葉！！）こと、島田さん（@Yuhei0909）の記事です。
是非そちらもご覧ください！どんなお話だろう（わくわく）
社内データ活用を普及するまでの2大つまづきポイント

データサイエンス界隈では「PoC貧乏」という言葉があるように、PoCの結果が実用化するまでには壁があるのが現状です。
弊社でもたくさんつまずいてきましたが、実用化に至った事例も出てきているので、どうつまずき、どう乗り越えたのかについて経験したことを書きたいと思います。
この記事は[リンクアンドモチベーションアドベントカレンダー2022](https://qiita.com/advent-calendar/2022/mcs)の17日目の記事です。

# PoCしていたもの
弊社では[モチベーションクラウド](https://www.motivation-cloud.com/)というSaaSを開発していますが、月額課金サービスとなっていて、その継続率を向上・維持するために「ヘルススコア」という仕組みを社内実装しています。
顧客ごとの継続確率を機械学習を用いて予測しており、その実用化を目指していました。結果的には全社指標になっているものの、その過程についてお話ししましす。
（ヘルススコアの仕組みについては別記事にまとめます。）

# 実用化に向けたつまずきポイント
PoC〜実用化までにたくさんつまずいたのですが、今回は以下にまとめていきたいと思います。
1. ユーザの初期反応に過度に一喜一憂してしまう
1. 「ユーザの感覚vsデータ」の対立構造になってしまう

# つまずき1. ユーザの初期反応に過度に一喜一憂してしまう
特に社内プロダクトや社内ツールなどにとっては「あるある」かなと思うのですが、「PoCの成果を共有した時の反応に一喜一憂してしまう」というのがあるかなと思います。
例えば、以下のような経験はないでしょうか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542786/6189ebd6-8f4b-1c02-a99a-fd0144839164.png)
こうした反応をいただけること自体は嬉しいことですが、これに慢心し、PoCの成果物（継続率予測モデル）のビジネス活用について思考を怠ると、実用化はすすみませんでした。
なぜかというと、ユーザ側にとっては、これまでの業務フローを変えるコストを支払う必要性があるためです。

## 解決策
### 価値を言語化し、UI・UXをデザインする
アプリケーション開発では当たり前のことではあるのですが、これがデータサイエンス系のPJTでは抜けがちだったり、タイミングがズレていたりします。
実際に私たちも、PoCをしてからユーザ体験を考え始める、という順番で進めてしまっていました。
そうではなく、最初から価値の言語化と、価値に一貫性のある形で「PoCの要件」と「最終的なUI案・UX案」を同時にプロトタイプとして作成してみたところ、より使ってもらいやすいものになったと思います。
### メトリクスを用いて利活用度合いを検証する
こちらも当たり前のことではありますが、上記のステップで価値から逆算された機能を設計できたら、その機能の利用率を測定することが重要です。
ユーザが「活用します！」って言ってくれてたしなぁ、、、社内プロダクトだしなぁ、、、と思ってしまっていた時期がありました。
しかし、DAU・WAU・MAUなどを測定し、しっかり問題を解決するような社内ツールになっているか？を数字・データを元に検証することで、より具体的な改善行動をとることが出来ました。

# つまずき2. 「ユーザの感覚vsデータ」の対立構造になってしまう
こちらは、作業自動化系のデータ活用プロダクトだと起きづらい事象かもしれません。例えば、単純な反復作業を代替する場合などは、人間の感覚とデータが示す示唆のズレがないことが多いと思います。
一方でヘルススコアの場合は、これまでCS（担当コンサルタント）が直接顧客とやり取りする中で得た感覚値と、モデルが示す継続確率の値が一致しない場合もあります。
そうした場合に、「このデータって正しいの？」という純粋な疑問が生じてしまうことがあり、結果として実用化に至らない、といったことがありました。

## 解決策
### いきなりデータ上の示唆を押し付けるのではなく、一緒に改善する仲間になる
実際にモチベーションクラウドの顧客を最も知っているのはCSの皆さんです。なので、そもそもモデル自体も彼らと一緒に育てていくべきものです。
まずは、純粋に「皆さんの役に立つ良いものを作りたいので、どうしたら精度が上がりそうか、教えてください！」と共通の目的を設定しました。
その上で精度が高まったら、実用化に向けた業務フロー整備と、その業務フローの導入・浸透を行います。弊社では組織人事コンサルティングの知見があり、組織変革の際にはクルト・レヴィンの理論に基づき以下の3ステップで行ってみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542786/f050d640-8013-0f28-4016-11757ea85787.png)

### 最初の利用のハードルを徹底的に下げる
かっこいいBIツールを用意して使ってもらいたいなと思う気持ちもあるかもしれませんが、実際にユーザにとって使いやすいツールを選定することが重要です。最初はAmazon Quicksightの導入を試みましたが、プロトタイプ段階で利用状況が芳しくなく、結果的に最もシンプルなGoogleスプレッドシートに切り替えたところ、格段に利用率が上がりました。


# まとめ
上記に書いた以外にもたくさんのつまずきがありましたが、なんとか解決して全社指標としての実用化までたどり着きました。
壁がある度に、多くの方々のご支援・お力添えがあっての今なので、本当に感謝しています。ありがとうございます。
業界全体として、まだまだPoCをビジネスに紐づけるのは課題が多いですが、ぜひ知見をシェアしながら、データドリブンな社会を目指していきましょう！
LINE WORKS連携ソリューション2022

2022年に「LINE WORKS」と連携したソリューションをご紹介します！
※プレスリリースを配信したものを掲載します。
https://line.worksmobile.com/jp/pr/

全ての連携ソリューションはこちらのページをご参照ください。
https://line.worksmobile.com/jp/feature/integration/


「防災盤」
https://line.worksmobile.com/jp/feature/integration/zerosai/

「Mail２Link」　※すでに連携していましたが、「アプリディレクトリ」※に追加
https://line.worksmobile.com/jp/feature/integration/mail2link/
※アプリディレクトリとは
https://line.worksmobile.com/jp/appdirectory/

アルキラーNex
https://line.worksmobile.com/jp/feature/integration/alkillernex/

AxisIoT
https://line.worksmobile.com/jp/pr/20221011/

スマート介護
https://line.worksmobile.com/jp/pr/202201004/

CData
https://line.worksmobile.com/jp/pr/20220906/

i-Rental注文アプリ
https://line.worksmobile.com/jp/pr/20220804/

「LINE WORKS」・「奉行クラウド」・データ集計・通知システム「旗振〜hata free〜」の連携ソリューション
https://line.worksmobile.com/jp/pr/20220721/

freee勤怠管理Plus
https://line.worksmobile.com/jp/feature/integration/freee-time-tracking-plus/

「宅急便を送る」
https://line.worksmobile.com/jp/pr/20220512/
「アプリディレクトリ」※にも追加
https://line.worksmobile.com/jp/pr/20220711/
※アプリディレクトリとは
https://line.worksmobile.com/jp/appdirectory/

らくしふ　※すでに連携していましたが、「アプリディレクトリ」※に追加
https://line.worksmobile.com/jp/feature/integration/rakushifu/
※アプリディレクトリとは
https://line.worksmobile.com/jp/appdirectory/

Claris FileMakerからLINE WORKSの メッセージ送受信を可能とする連携支援ツール「ChatBotMaster」
https://line.worksmobile.com/jp/pr/20220530/

『Marsys Sales Tech（マーシス・セールステック）』ソリューション
https://line.worksmobile.com/jp/pr/20220207/

以上です。

「LINE WORKS」と連携するサービス・ソリューションは140を超えています。
今後とも「LINE WORKS」および連携ソリューションをよろしくお願いいたします！
全ての連携ソリューションはこちらのページをご参照ください。
https://line.worksmobile.com/jp/feature/integration/

LINE WORKSについてはこちら
https://line.worksmobile.com/jp/
[Unity]update関数の罠


# Update関数でやりがちな罠

Unityでソースコードを書こうとするなら

まず初めに触れ合うことになる馴染み深い関数、Update。

でも、知っているようで忘れがちな細かい仕様について紹介します。

Update関数は毎フレーム実行されます

当たり前だけど、これが重要。

例え、Update関数の中身がなくてもバックエンドでは

毎回処理が走っています。

# 空のUpdate関数を消せ！

空のupdate関数は消しましょう.

ただの負荷発生装置になっています。

初めにMONOで用意されてるテンプレートを

出してコーディングをする人が多数かと思いますが。

その時に必ずupdate関数がテンプレートに付随しており。

この仕様のせいで多くの人が使わなかったにもかかわらず

コーディング終了後もupdate関数を消すのを忘れています。

消すようにしてください。

そしてそのようなコードがネットで配布されていたり、

学習用の記事で載せられているのを見た人が、

ああ、update関数は消さなくても問題ないんだなという

暗黙の了解が広まります。

これが今回言いたかったことです。

初学者のためにテンプレートにupdate 関数を用意したい気持ちはわかるのですが、

それは調べればすぐにわかることですし、

今のEditorは便利なsnippetなども多く拡張機能で入ってるので

わざわざupdate関数まで含める必要はないのではないでしょうか。
自分たちに丁度いいReactテーブルを考えたい

こんにちは、React でテーブルライブラリは使ってますでしょうか。

私の現場では UIコンポーネントに [Material UI](https://mui.com/)(v4) を使っていることもあって [material-table](https://material-table.com/#/) を使用しています。

よく使う機能は網羅されていて使いやすいのですが、不具合も残る中あまりメンテされておらず  
Material UI V5、React V18 対応等を考えると、不安要素もあり打開策を考えたいところです。

とはいっても、管理画面の中でもコアな機能で、簡単にUIを変えることは難しいし、中途半端なものに乗り換える事もできません。

## 自分達で作ってみる？
`material-table` は多機能ですが、そもそも使用していない機能もいくつかあります。

面倒な実装も [TanStack Table](https://tanstack.com/table/v8) の [useReactTable](https://tanstack.com/table/v8/docs/adapters/react-table#usereacttable) を使えば多くは省けそうです。  
ドキュメントやデモが豊富なのも助かる。

せっかくなら material-table では少し頼りなかったデータ構造や型、拡張性等も自分たちに使いやすく作り込んで行きたいところです。

管理画面向けなので、おしゃれさは必要なく なんとか作ることはできそう。たぶん。

## 別のライブラリも考えてみる
Material UI × Table 関連の npm trends
![npmtrends.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342335/b40eb00d-59d8-18f0-9d26-2089fb33c0bf.png)

+ [material-table](https://material-table.com/#/)
+ [@material-table/core](https://material-table-core.com/docs/material-ui-v5/)
+ [mui-datatables](https://github.com/gregnb/mui-datatables)
+ [@mui/x-data-grid](https://mui.com/x/react-data-grid/)
+ [material-react-table](https://www.material-react-table.com/)

### @mui/x-data-grid
トレンドでは群を抜いてますね。
公式から出てる安心感と機能面も豊富で管理画面で使う分には十分物足りそうです。

一つだけ難点が、`material-table` にある [グルーピング](https://material-table.com/#/docs/features/grouping) 機能がないところです。  
有料版だとUIは違うものの同等の機能があるみたいですが、、

グルーピング機能が外せないことも簡単に乗り換えられない理由の一つなので見送っちゃってます

### material-react-table
トレンドでは一番下の棒です。

安定版のファーストリリースが 2022年9月 と新しいライブラリで、
TanStack Table V8 と Material UI V5 で構築された、パフォーマンスや軽量化、スタイルの拡張性等を売りにしてるみたいです。  
material-table と同等の機能もほとんどサポートしてます。

リファレンス内でも使われていたりしてテーブル愛を感じますね。

今の所マイナーバージョンのリリースが頻繁に行われていて、よく見ると少しずつ伸びているので3、4番手には追いつくのはそう遠くないのでは？


### その他
material-react-table に分かりやすい比較ページがありました  
https://www.material-react-table.com/#let's-compare

## まとめ
結論は出ていません。

自分で作るにしても実装やメンテの手間もあるし、出来ることならOSSに頼りたい気持ちが強いです。

`material-react-table` は気になるところですが、material-table の二の舞にならないためにも、
今後もメンテが続いて安心して使用できるかの判断は慎重になってしまいます、、

ライブラリ問題以前に、material-table 前提な作りになってるところもあるので、まずは自分の書いたコードの見直からしていきたいと思います。

皆さんのテーブル事情やご意見もいただけると嬉しいです。参考にさせていただきます🙏
Go言語 環境構築  (Windows) GOPATH設定・実行確認まで

Windowsでの Go言語 の環境構築の方法をまとめました。

# Goをインストール

まず下記リンクのGoのサイトからインストーラをダウンロードします。

https://go.dev/dl/

下のような画面が出たら、自分のPCのOSに合ったインストーラをダウンロードしてください。

今回はWindows（一番左「MicrosoftWindows」）を選択した場合で説明を進めていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2388259/24703acb-7ca1-b94d-978a-5e57c5bb78ca.png)

ダウンロードできたらそのファイルをクリックして実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2388259/eed12749-91d5-87a8-7a19-5d48bfe33ce8.png)

↑ここから何回か「Next」を押したら、「Install」と出るのでそのままインストールします。

途中出てくるインストールするフォルダの選択はデフォルト（そのまま）のものでいいです。筆者はユーザー名のフォルダ直下（User/harry/Go）にインストールしました。

インストールが完了したら「Finish」と出るので押して終了します。

# 環境変数を編集

↓Windowsボタンを押して検索欄に「システム環境変数」と検索してシステム環境変数の編集を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2388259/82389b6f-57f0-de3b-3caa-e0f0983d59dc.png)

↓「環境変数(N)」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2388259/236620b8-7c75-d45d-f9f9-6a2f7e6e9e3a.png)

↓円で囲った部分（システム環境変数(S)の変数名のところ）を見てください。
ここの「Path」に新たな値を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2388259/40d3c11c-ab9d-8900-bc22-362f004028b9.png)


「新規(W)」から変数名「Path」とGoのインストール先で設定したフォルダのbinフォルダのパスを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2388259/a2cd4275-a18b-5694-d3cc-93c7fcdf8191.png)

次はGOPATHを設定します。

↓先ほどの環境変数の画面の上部「ユーザー環境変数」に新規で設定します。
Pathと同じ要領で変数名はGOPATH、変数値は任意のフォルダパスを設定します。筆者は先ほどのGoフォルダにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2388259/62cdcc43-0434-541e-a60c-f7e5d878d90e.png)

# 実行確認

任意のフォルダにtest.goという名前で以下の内容のファイルを作成します。

~~~go:test.go
package main
 
  import (
    "fmt"
  )
 
  func main() {
    fmt.Println("Hello World!")
}
~~~
コマンドプロンプトを立ち上げて、test.goを保存したフォルダまでcdコマンドで入ってから
~~~
$ go run test.go
~~~

を実行してください。「Hello World!」と表示されれば成功です。
【Playdate】Animatorを使ってスプライトをアニメーションさせる

![sample_animator.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100912/da86eace-0a77-de22-188d-add6450b8012.gif)
Animatorを使うことで指定した地点までの移動をスムーズに行うことができます。
今回は上記キャプチャのように離れたスプライトを中央に引き戻すAnimatorを実装します。


```main.lua
import "CoreLibs/object"
import "CoreLibs/graphics"
import "CoreLibs/sprites"
import "CoreLibs/timer"

import "CoreLibs/animator"
import "CoreLibs/easing"

local gfx <const> = playdate.graphics

local playerSprite = nil

local animator = nil
local duration = 1000
local oldPoint = nil
local newPoint = nil

function myGameSetUp()

	local playerImage = gfx.image.new("Images/playerImage")
	assert( playerImage )

	playerSprite = gfx.sprite.new( playerImage )
	playerSprite:moveTo( 200, 120 )
	playerSprite:add()
	
	-- アニメーション
	oldPoint = playdate.geometry.point.new(200, 120)
	newPoint = playdate.geometry.point.new(200, 120)
	animator = gfx.animator.new(1, oldPoint, newPoint, playdate.easingFunctions.inBack)

	local backgroundImage = gfx.image.new( "Images/background" )
	assert( backgroundImage )

	gfx.sprite.setBackgroundDrawingCallback(
		function( x, y, width, height )
			backgroundImage:draw( 0, 0 )
		end
	)

end

myGameSetUp()

function playdate.update()
	if animator:ended() ~= true then
		playerSprite:moveTo( animator:currentValue() )
	end

	if playdate.buttonIsPressed( playdate.kButtonUp ) then
		playerSprite:moveBy( 0, -2 )
	end
	if playdate.buttonIsPressed( playdate.kButtonRight ) then
		playerSprite:moveBy( 2, 0 )
	end
	if playdate.buttonIsPressed( playdate.kButtonDown ) then
		playerSprite:moveBy( 0, 2 )
	end
	if playdate.buttonIsPressed( playdate.kButtonLeft ) then
		playerSprite:moveBy( -2, 0 )
	end
	
	if playdate.buttonIsPressed( playdate.kButtonA ) then
		if animator:ended() == true then
			local x, y = playerSprite:getPosition()
			oldPoint = playdate.geometry.point.new(x, y)
			animator = gfx.animator.new(duration, oldPoint, newPoint, playdate.easingFunctions.inBack)
		end
	end
	
	gfx.sprite.update()
	playdate.timer.updateTimers()

end
```

Animatorを使うには`import "CoreLibs/animator"`で読み込みます。
更にイージング関数が書いてある`import "CoreLibs/easing"`も読み込みます。
`animator`に`gfx.animator.new(1, oldPoint, newPoint, playdate.easingFunctions.inBack)`と指定したAnimatorを新規作成します。
第一引数がアニメーションするミリ秒、第二引数が始点、第三引数が終点、第四引数がイージングとなります。
（ここでアニメーションするミリ秒を1に指定しているのは、初期化のため）

`playdate.update()`にてAボタンが押されたときにアニメーションするようにしています。`animator:ended()`はアニメーションが再生済みかどうかをbool値で返します。
Fortran 規格に関する知識のアップデート用資料まとめ

Fortran 90, Fortran 95 等は勉強したが、その後の Fortran 規格がどうなっているのか、差分情報だけを知りたいという人のために役に立ちそうな情報を紹介します。

# 前置き

Fortran の ANSI/ISO 規格は、FORTRAN 66 から存在します。これが世界最初の電子計算機言語の規格となります。その後、現在までに FORTRAN 77, Fortran 90, Fortran 95, Fortran 2003, Fortran 2008, Fortran 2018 の規格が存在します。また来年 Fortran 2023 規格が採決されることがほぼ確定となっており、さらにその先の Fortran 202X 規格に向けての話し合いが始まっています。 

FORTRAN 77 から Fortran 90/95 へは文法的に大きな飛躍がありますが、和書の教科書も多く出版されているため知識のアップデートは難しくないと思われます。

Fortran 90/95 から Fortran 2003/08 へも文法的な飛躍が大きいのですが、こちらは余り和書も出ておらず、知識のアップデートが簡便に出来なくなっています。

Fortran 2003 のオブジェクト指向についての和書は、Qiita でもおなじみの implicit none さんの同人誌「Fortranによる実践オブジェクト指向プログラミング」があげられます。最近出た「みんなのFortran」（松本敏郎・野老山貴行著）は、Fortran 2008 対応で coarray にも触れられていますが、オブジェクト指向の記述は略されています。

以下では、英文献になりますが、Fortran 90 以降の各規格の差分情報を挙げます。

# みっちりコース　Fortran Explained シリーズ

Michhael Metcalf と John Reid (のちに Malcolm Cohen 参加)が各 Fortran 規格毎に出し続けている Fortran Explained 本は、おおよそ本の前半がこれまでの規格の内容、後半に新しい規格に関わる内容が書かれています。差分情報を知るには後半部分を読めばいいことになります。

+ Fortran 90 Explained （差分無し）
+ Fortran 90/95 Explained 1st edition （11章より 95 の差分）
+ Fortran 90/95 Explained 2nd edition （12章より Techinical Report 拡張の差分）
+ Fortran 95/2003 Explained（13章より 2003 の差分）
+ Modern Fortran Explained（18章より 2008 の差分）
+ Modern Fortran Explained  Incorporating Fortran 2018（20章より 2018 の差分）

文法書に近い内容で、新しく入った関数なども網羅的に載せてありますが、通読するには退屈だと思います。しかし規格制定の中枢にいる人たちが書いているので、例題などは的確なものになっていて理解が深まります。

# お手軽コース　The New Features of Fortran シリーズ

Fortran Explained の著者の一人、John Reid が出している The New Features of Fortran XX は新規格の差分の目玉だけをまとめたもので、無料で手っ取り早く情報を得るのに適しています。ISO の Fortran Working Group のサイトにあります。

https://wg5-fortran.org/documents.html

Working Group での話し合いの進展とともに内容が更新されるので、同じ表題の文書が複数存在していますが、最新のものだけを見ればよいと思います。


+ The New Features of Fortran 2003
https://wg5-fortran.org/N1601-N1650/N1648.pdf

+ The New Features of Fortran 2008
https://wg5-fortran.org/N1851-N1900/N1891.pdf

+ The New Features of Fortran 2018 (Reid - Replaces N2145)
https://isotc.iso.org/livelink/livelink?func=ll&objId=19867230&objAction=Open

+ The new features of Fortran 202x（Fortran 2023 相当）
https://wg5-fortran.org/N2151-N2200/N2194.pdf

Fortran 95 版は見当たらないので SilverFrost のまとめページを貼っておきます。
+ What's new in Fortran 95
https://www.silverfrost.com/ftn95-help/f95/contents.aspx
 
なお、英文を何ページも読むのはだるいという場合は、同趣旨の内容の発表スライドが代用になると思われます。

+ the latest Fortran Standard (Fortran 2003)
https://www-users.york.ac.uk/~mijp1/COL/fortran_2003.pdf

+ The new features of Fortran 2003
https://fortran.bcs.org/2007/jubilee/newfeatures.pdf

+ The new features of Fortran 2015
http://armnlib.uqam.ca/PDF/The_new_features_of_Fortran_2015_Reid.pdf

+ Further interoperability features in Fortran 2015
https://fortran.bcs.org/2015/BCS15interop.pdf


# まとめ

以上、Fortran 規格の知識のアップデートに役に立つと思われる差分情報をまとめてみました。

Modern Fortran Introduction 等で検索すると、世界各国のスパコンセンターの講座が引っかかりますが、初歩から始まる迂遠なものも多いので、すでに旧規格を知っている場合、差分情報だけの方が役に立つこともあろうかと思います。
【Rails6】formヘルパー内で、submitボタンにCSSをつけたい場合・button_tag要素を使ってtypeにsubmitを指定する場合

# やりたいこと
* font awesomeを利用して以下の表示４のようになボタンを設置したい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710373/362a96d9-3c83-e8a3-a1d3-4e441e48ad60.png)

# 困ったこと
* どうもうまく反映されない。以下それぞれすべてやってみたが、どれも正常にCSSが反映されなかったり、ちゃんと送信がされなかったり。
    * <% f.submit>
    * <%=button_tag>
    * \<button type>
   
```erb
<%= f.submit "表示0", class: 'back-btn-update' %>
<%# 送信はできる。font awesomeは使用せず自作CSS。 %>

<%= button_tag :type => "submit", :class =>"btn btn--red btn--radius btn--cubic" do %>
  <i class="fas fa-angle-right fa-position-right"></i>表示1
<% end %>
<%# 送信はできるが、font awesomeの表示が反映されない。 %>

<%= button_tag '<i class="fas fa-angle-right fa-position-right"></i>表示2'.html_safe, :type => "submit", 
    :class =>"btn btn--red btn--radius btn--cubic" %>
    <%# 送信はできるが、font awesomeの表示が反映されない。 %>

<% f.submit class: "btn btn--red btn--radius btn--cubic" %>表示3<i class="fas fa-angle-right fa-position-right"></i>
    <%# クリックできない。 %>

<a type="submit" class="btn btn--red btn--radius btn--cubic">表示4<i class="fas fa-angle-right fa-position-right"></i></a>
    <%# 正常に表示されているが、送信処理がされない。 %>

<button type="submit" class="btn btn--red btn--radius btn--cubic">表示5<i class="fas fa-angle-right fa-position-right"></i></button>
    <%# 送信はできるが、font awesomeの表示が反映されない。 %>
```

# 解決方法
* \<button>で直接記述した場合でさえCSSが適用されていないので、CSSに原因があるのでは？
    * どこかにfontawesomeで適用したいCSSより優っているものがあるのではと思ったが、とくにそれらしいものは見つからず。
    * しかし、反映させたいCSSに`!important;`をつけたら綺麗に表示されたので、これで解決とした

* teratailでも質問しました
    * [form_withのsubmitにfont awesomeのCSSが反映されない](https://teratail.com/questions/tpdr79fjzssbcw)


# formヘルパー内で、submitボタンにCSSをつけたい場合
* 以下のようにすれば適用できる
```erb
<% f.submit "表示0", class: 'btn' %>
```

* :valueを入れたくない場合は以下のようにすればよい
```erb
<% f.submit :class=>"btn" %>
<% f.submit nil, class: 'btn' %>
```

# formヘルパー内で、button_tag要素を使ってtypeにsubmitを指定する場合
* どういう時にこのパターンがあったかというと、formヘルパーを使った「送信する！」というsubmitボタンの中にFontAwesomeのアイコンを設置したかった時。button_tag要素を使ってtypeにsubmitを指定し、ブロックでFontAwesomeのコードを書いたら適用できた。
```erb
<%= form_with model: @review, url: item_reviews_path(@item.id), local: true do |f|%> 
 <%= f.text_area :comment, class: "m-form-text", placeholder: "ご自由に記載ください", id:"comment_content" %>
 <%= button_tag :type => "submit", :class =>"btn btn--red btn--radius btn--cubic" do %>
  <i class="fas fa-angle-right fa-position-right"></i>送信する!
 <% end %>
<% end %>
```

* しかし、button_tagは公式Docはあるものの、ほとんど記事がない...

# form内のbutton要素について
* button 要素はデフォルトで type='submit' が割り当てられる
* 上記の理由により、以下二つは同じ意味になる

```erb
<button>ボタン</button>
<button type='submit'>submit ボタン</button>
```
Spring Boot 個人的によく使うアノテーション集

## はじめに
Spring Bootでよく使うアノテーションをまとめてみました。



## @&#xFFF0;GetMapping("URL名")
()内のURLかつgetアクションの呼び出しがあった時に処理を行う

## @&#xFFF0;PostMapping("URL名")
()内のURLかつpostアクションの呼び出しがあった時に処理を行う

## @&#xFFF0;Controller
Spring Bootにコントローラークラスであることを認識させるアノテーション


## @&#xFFF0;Service
Spring Bootにサービスクラスであることを認識させるアノテーション

## @&#xFFF0;Repository
Spring Bootにリポジトリクラスであることを認識させるアノテーション

## @&#xFFF0;Entity
Spring Bootにエンティティクラスであることを認識させるアノテーション

## @&#xFFF0;Autowired
Springが自動的にインスタンスを注入してくれるアノテーション(DI)
例えば、ControllerクラスにServiceクラスの機能を注入したい場合、
```SampleController.java
@Autowired
private SampleService sampleService
```
と記述すると、SampleController.javaのファイルでSampleService.Javaのインスタンスが使えるようになる。

## @&#xFFF0;Validated
バリデーションを使えるようにするアノテーション。
投稿機能や登録機能に関係しているメソッドに使うことが多い。

## @&#xFFF0;NotBlank,@&#xFFF0;NotNull

この3つは、バリデーションに関するアノテーションです。
@NotBlankは、String型の入力欄にバリデーションをかけるアノテーション。
@NotNullは、Int型などの数値を扱う入力欄のにバリデーションをかけるアノテーション。

## @&#xFFF0;Size
こちらもバリデーションに関するアノテーション。
例：@Size(min = 0, max = 100)
例えばこういった記述をすると、フォームに対して0文字以上100文字以上で入力しなければならないというバリデーションをかけることができる。
QAエンジニアである私の転職理由

## はじめに
みなさま、はじめまして！
株式会社HRBrainでQAエンジニアをしておりますhh（@hh_hrb）です。

と自己紹介させていただきましたが、
実は今年12月に仲間入りしたばかりです。ホヤホヤです。
せっかくなので、今回は入社したてのホットな私の転職理由について書いていこうと思います。

この記事は、HRBrain Advent Calendar 2022の22日目の記事です。

https://qiita.com/advent-calendar/2022/hrbrain

## そもそもなんで、QAエンジニア？
お恥ずかしながら、数年前の私は「テスター」「QAエンジニア」という言葉すら知りませんでした。
元々事務の仕事をしており、心機一転キャリアチェンジをしようと思った時に出会った仕事でした。「こんな仕事があるんだ！」と知ったときに感じた、これだ！やりたい！！という強い気持ちは今でも覚えています。
私自身が慎重派で細かいところが気になる性格をしているので、どんな小さな違和感も見逃さないQAエンジニアは自分にとても合うという点で強く惹かれたのだと思います。
また、常に新しい技術が出る中でそれに合わせてテスト手法や考え方、最適なプロセスも変化していくため、現状で満足せずより良い方法を考え続けることは自分自身の成長にもつながると感じたのです。

その思い通り「品質」の奥深さやQAの幅の広さにハマっていき、今なおQAエンジニアを続けています。

## 「品質」に対してもっと向き合いたい
今回お話しする転職理由はずばりこれです。
「品質」といっても不具合がない、ユーザーが求めている、組織として求める等々…いろんな角度から見た品質があると思いますが、どれもQAが向き合わなければならないものです。

これまでの私は事業開発のQAではなかったこともあり、「テスト」をする部分に特化していました。
テストを計画して、期日通りに設計（実装）、実施をする、不具合の修正確認をする等々…その先の不具合の傾向や分析といった改善活動までしっかり目を向けられていなかったように思います。
もっといってしまうと、そもそもどういう品質であるべきか。目指したい品質がどこなのかを知る機会も少なかったように思います。
その点、事業開発のQAはまず製品に対して深い理解が必要で、どういう品質であるべきか、目指したい品質がどこなのかを自分たちで考え、そこに向かって改善をしていける環境です。

QAとして上述したような様々な「品質」に対して深く向き合うための環境に身を置き、ユーザーにとって良い品質を追求していきたいと思いたち今回の転職に至りました。

ざっくりですが、やりたいことがたくさんあります。笑

- ユーザーのリアルな声に耳を傾け、実際のQA活動に取り込んでいくこと
- 品質を上げるためにテスト活動自体を改善していくこと
- 開発工程の上流から入ることでより製品理解を深めリリース前の品質を上げていくこと
- 組織の中の「品質」に対する意識をより深く根付かせること

まだ入社したばかりですが、チームとともにまず「テスト活動の改善」として
テストケースの見直しや各担当プロダクトの情報共有（担当外プロダクトの理解を深める）など少しずつ進めはじめています。

一つずつ、周りを巻き込みながらユーザーにとってより良い「品質」は何なのかを軸に
考え続けていきたいと思っています。

## なぜHRBrainなの？
現在のQAチームは、今まさにその品質に対して向き合うための土台を整えているところだと思っています。
私が向き合いたいものは形もなく、おそらく正解もないものです。
そして、私一人だけでは作り上げることができないものです。

HRBrainでは、周りの協力を得ながらチームとしてそれらを作り上げていくことができると思いますし、そんな貴重な経験をしながらQAエンジニアとしてさらに成長し、チャレンジをしていける環境であると思っています。


## さいごに
QAの方も、そうでない方も「仕事に対する思い」を振り返るきっかけになれば幸いです。
そして、もし次のステージを探されるようでしたらぜひ一度HRBrainをご検討いただければと思います。

最後までご一読いただきましてありがとうございました。

https://www.hrbrain.co.jp/recruit
【Xcode】エラー文や警告文をカスタムする

# はじめに
Xcodeで文字を適当に打ってたら面白いものを見つけたので記事にしておきます。

![スクリーンショット 2022-12-19 21.22.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/78edcf66-cf95-4b81-8ca7-0f973884a9dc.png)

# 実装
```swift
#warning("これは警告です")
#error("これはエラーです")
```

# 使い所
あんまり思いつきませんが、こんな使い方ができそうです。
```swift
#warning("あとで修正")
```

# おわり
もっといい使い方があればコメントください！
クラウドの不具合が長引いて困った話

謎のアドベントカレンダー、最終話です。

筆者の職場のオンプレ時代末期、近隣のデータセンターが提供していたクラウドメニューを利用していた頃の話です。

## 仮想マシン 1 つ分のシステムを預けていた

そのクラウドにはごくごく小さいシステムを 1 つだけ、VMware の仮想マシンとして預けていました。

もともとオンプレのマシンの上で動かしていた仮想マシンを変換したものです。

しばらくは何の問題もなく運用できていました。

## ある日から

唐突にネットワーク越しの接続が不安定になりました。

**「まあすぐに直るだろう」**

と思って静観していたのですが、3 日経っても 5 日経っても不安定なままでした。

そして、当初は「そんなに重要なシステムじゃないから」と同じく静観（という名の放置を）していた上司が「いつになったら直るんだ💢」とキレ始めて（たまたま上司からの電話を取ってしまった）同僚 H さんがとばっちりを受けたのを機に、ポータブル HDD を持って仮想マシンイメージを引き取りに行き、別のデータセンターで稼働中のオンプレ VMware 上に引っ越しました。

（H さんみたいな貧乏クジを引く人、職場に必ず一人は居る説）

このシステムには機密情報が入っていなかったので、週末の夜中に車に乗って一人で引き取りに行き、その足で引っ越し先データセンターのラック内にポータブル HDD を保管、翌日移設を完了させました。

（仮想マシンイメージを引き取りに行く際、栄養ドリンクを差し入れしてきました）

![drink.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/4bc48ef1-bb62-be73-9fab-49f26865e031.png)

## 後日

この件を機に契約は終了していたのですが、復旧後に障害原因について報告をいただきました。

そのシステムの中に、

- 1 台だけ、以前のシステムのときに予備機として未通電状態で保管していたスイッチを流用していた
- そのスイッチが、 **物理的な見た目（各ポートのリンク・送受信ランプなど）と SNMP 上はあたかも正常動作しているように振る舞っていたが、実は壊れていた**
  - どんな役者だよ
- そこだけ流用だったが故に、ベンダーによる障害箇所特定の調査対象からも外れていた

とのことでした。

流用ダメ、絶対。

---

以上 25 日間、完走しました！

（完走…と言って良いのか？）
既存のS3バケットにオブジェクトロック有効化しようとして微妙に苦労した話

# オブジェクトロックとは

AWSさんが書いてるので詳しくは[こちら](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/object-lock-overview.html)を見てください<br>
簡潔に言うとS3のオブジェクトが削除されたり改ざんされることを、一定期間または無期限に防ぐやつ

バケット作成時に同時に設定することは普通に可能ですが、
既存S3のオブジェクトロック有効化はAWSへ問い合わせ必須になります＞＜

# 前提

すでにS3バケットとオブジェクトが存在している

監査に使うかもしれないログなので削除できない

バージョニングは設定済

# やってみる

### ①準備

オブジェクトロック有効化するにはバージョニングの有効化が必要らしい。これはすでに設定してたので大丈夫そう。

バケット名をメモしとく。

### ②AWSにお問いあわせしてみる

こんな感じ

>お世話になっております。
既存のバケット（<ばけっとめい>）のオブジェクトロックを有効化したく、ご連絡いたしました。
すでにこちらのバケットはバージョニングを有効にしております。
そのほか事前に対応すべきことがございましたら、ご教示いただけますと幸いです。
バケット名: <ばけっとめい>

返答があった！
要約すると

オブジェクトロックを有効化すると無効にする手段がないですが大丈夫ですか？（もし無効化したければ再作成になる）
バージョニングを停止できないですが大丈夫ですか？

大丈夫ですと返答したら該当S3のオブジェクトロック有効化専用のトークンが届きました！　（超長い）

### ③設定してみる

やりたいこととしては以下の通り
　①オブジェクトロック有効化
　②コンプライアンスモードに設定　※これはケースバイケースなのでガバナンスモードなのかコンプライアンスモードなのかはしっかり公式ドキュメントを読んで決めてね☆
　③保管期間は1年半

うきうきとCLIを実行してみる

* 1回目Try
認証ではじかれる・・・え・・・
お問い合わせしたら認証情報が適切に設定されているかご確認いただけますかとのこと・・・
tokenで一発でできないんかーい！
ってことでAWSコンソールからユーザーのアクセスキー情報を発行しローカルにaws configの設定を追加

* 2回目Try
認証ではじかれる
やっべMFAの設定入れてたの忘れてたわ・・・ってことでaws-mfaを追加
※アクセス時にMFA必須とするIAM制御を入れているため

* 3回目Try
CLIで一気に設定できるかなって以下の通り実施してみた
`aws s3api put-object-lock-configuration --bucket <ばけっとめい> --token <とーくん> --object-lock-configuration '{"ObjectLockEnabled":"Enabled", "Rule":{"DefaultRetention":{"Mode":"COMPLIANCE", "Days":540}}}'`
すると
Unknown options
とか言われてできなかった・・・まじか・・・

* 4回目Try
有効化以外の設定値をはずして以下の通り実行したらできた！
`aws s3api put-object-lock-configuration --bucket <ばけっとめい> --token <とーくん> --object-lock-configuration ObjectLockEnabled=Enabled`
期間設定、モード設定はAWSコンソールから別途実施

# まとめ

1. 権限を持ってるユーザーでアクセスキー発行しaws configを設定
1. aws-mfaで一時セッションを有効化
1. （一応）aws s3 ls で権限があることを確認（MFA通ってなければはじかれる）
1. 以下記載のコマンドを実行
`aws s3api put-object-lock-configuration --bucket <ばけっとめい> --token <とーくん> --object-lock-configuration ObjectLockEnabled=Enabled`
1. AWS コンソールから期間設定、モード設定を変更

って感じで既存バケットにオブジェクトロック有効化するのに微妙にめんどくさかったです・・・
最初から必要だってわかってたらバケット作成時にやっておくとよいです
どなたか同じように躓いてる方のヒントになれば幸いです(´・ω・｀)
GoogleColabの猫モードとは何か

Google Colabの「設定」「その他」タブには、「猫モード」というチェックボックスが存在する。

猫モード？

![スクリーンショット 2022-12-19 12.41.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/b01f1bc8-8071-0684-6078-23931f560886.png)

チェックボックスを選択して設定を保存すると、Colabの画面の上に猫が歩くようになる。

![Dec-19-2022 12-45-42.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/ad2a8f77-4b27-7dee-a205-40eda3686f66.gif)

「コーギーモード」と「カニモード」もあって、
選択すればコーギーとカニも歩くようになる。

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

機械学習、ARアプリ（Web/iOS）を作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
AUTOSAR(120)といえばYまたはZで始まる用語は。

AUTOSARといえばYまたはZで始まる用語は。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">AUTOSARといえばYまたはZで始まる用語は?</p>&mdash; wocs2017 (@wocs2017) <a href="https://twitter.com/wocs2017/status/1609016109532938240?ref_src=twsrc%5Etfw">December 31, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Zone
ZIP
Z
Y

# Countdown Calendar 2022
今年企画した6つのCountdown Calendarと、それぞれの記事一つをご紹介します。

AUTOSAR Countdown Calendar 2022
https://qiita.com/advent-calendar/2022/autosar

AUTOSAR References to ISO, IEC, ITU, IEEE, RFC and SEA etc.
https://qiita.com/kaizen_nagoya/items/d7d252211e10a79516df

Automotive Handbook Countdown Calendar 2022
https://qiita.com/advent-calendar/2022/automotivehandbook

Basic principles, ボッシュ自動車handbook(英語)11版まとめ<2>
https://qiita.com/kaizen_nagoya/items/24a1ba5da3d09b2a95d1

2022 いいねをいただいた記事ランキング(O.K.版) Countdown Calendar 2022
https://qiita.com/advent-calendar/2022/goods

2022年１月下旬　いいねをいただいた記事　16
https://qiita.com/kaizen_nagoya/items/0ee589a8edaeab24fd2a

AdCale(O.K.) Countdown Calendar 2022
https://qiita.com/advent-calendar/2022/adventcalendar2022

「会議は15分未満」に。小耳にはさんだ話。
https://qiita.com/kaizen_nagoya/items/510c47c5d1e8d03145db

ABC language (O.K.版）  Calendar 2022
https://qiita.com/advent-calendar/2022/abc_ok

LLVMソースコードのコンパイルをしようと思ってハマった罠とそこから脱出するための努力
https://qiita.com/kaizen_nagoya/items/16f270e42b947756ced3

ABC maker(O.K版）  Calendar 2022
https://qiita.com/advent-calendar/2022/abcmaker

JAXA/IPA クリティカルソフトウェアワークショップ WOCS言語関連発表(改定版)
https://qiita.com/kaizen_nagoya/items/4789832baf494cb74626

CountdownCalendar2022 報告
https://qiita.com/kaizen_nagoya/items/5b4b99cb9ad571f4094b

誤差の評価が苦手（専門分野以外）
https://qiita.com/kaizen_nagoya/items/cc3a50827b24ab80985f

This article is not completed. I will add some words in order.
ver. 0.01 初稿 20221221
ver. 0.02 URL追記　20221231
ver. 0.03 ありがとう追記 20230620
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
今日のDocker error: the following signatures couldn’t be verified because the public key is not available



Fix apt-get update “the following signatures couldn’t be verified because the public key is not available”

https://chrisjean.com/fix-apt-get-update-the-following-signatures-couldnt-be-verified-because-the-public-key-is-not-available/


```ubuntu:bash
#  apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5
E: gnupg, gnupg2 and gnupg1 do not seem to be installed, but one of them is required for this operation
# apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
E: gnupg, gnupg2 and gnupg1 do not seem to be installed, but one of them is required for this operation
#
```
ZabbixでApacheのserver-statusを手軽に監視してみた

# はじめに
先日、[Zabbix Conference Japan 2022](https://www.zabbix.com/jp/events/conference_japan_2022)に行ってきたんですが、そこで渡邉さんが便利なTemplateの紹介をしていて「やや！私ったらいつまでも自前のシェルスクリプト書いてzabbix_senderで送る一昔前の方法でやってた！」と気づき、せっせこ設定をしてみました。
この記事はその作業内容をまとめたものです。

# 概要
テンプレート「Template App Apache by HTTP」を使用します。
Apacheが稼働しているWebサーバでserver-statusを有効にし、その値をZabbixで監視できるようにするテンプレートです。

# 手順

### Zabbixサーバの準備
まず、Zabbixサーバを用意します。でもそこの手順は割愛します（何）
手っ取り早くテンプレートを試したかったので、私は以下の構成でZabbix6.2を立ち上げました。

- EC2：AlmaLinux OS 9 (x86_64)
- インスタンスタイプ：t3.small
- Zabbix：6.2.4
- Apache：Apache/2.4.53
- DB：MySQL 8.0.30
- PHP：8.0.20

### 監視対象ホスト側の設定
- status_moduleが読み込まれているか確認。

```
# httpd -M 2>/dev/null | grep status_module
status_module (shared)
````
- server-statusの設定
  - /etc/httpd/conf.d/httpd-info.confの設定
```
    <Location "/server-status">
    SetHandler server-status
    Require local
    </Location>   
```

※server-statusのパスが `/server-status` じゃなかったりする場合は、Zabbixサーバ側のホストマクロに{$APACHE.STATUS.PATH}を設定してあげましょう。

### 確認
監視データ＞最新データ で、以下のような「Apache: なんちゃら」といったデータが取得できています！
・Apache: Bytes per request
・Apache: Bytes per second
・Apache: Connections total
・Apache: Requests per second
…などなど

![スクリーンショット 2022-12-19 20.44.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128331/e523a2e0-54e9-f23c-50e1-c866ae52b0cf.png)

# おわりに

既存の知識もたまには棚卸しをして新しいものに入れ替えていかないと、化石みたいなエンジニアになってしまいますね🦖
日々精進です！
【FORTRAN】運動方程式を解く

![IMG_2685.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989559/0a6ca6cd-7aa1-d23e-9258-ca81cec4929f.jpeg)

:::note info
試しに、FORTRANで一質点の時刻歴応答解析を行うコードを書いてみようと思います
:::

## 運動方程式
古典力学分野で解析系の研究をしていた人にとっては、馴染みの深い式かと思います。

```math
m \frac{d^2 x}{dt^2} + c \frac{dx}{dt} + kx = -m\frac{d^2 x_0}{dt^2}
```
という形が一般的でしょうか。
(mは質量、cは粘性減衰定数、kはバネ剛性、右辺は地動加速度による外力項)
これを、

- 一質点モデル、バネは弾性
- 入力地震波は阪神大震災の観測波(JMA Kobe NS)
- ニューマークのβ法は平均加速度法(β=1/4)

で、解いてみようかと思います。
また、減衰力を合わせた応答スペクトルを用いて、解析の妥当性を確認します。

## FORTRANでコードを書く

早速、コードを書いてみようと思います。
まずは文字の定義から。

```FORTRAN
program equationOfMotion
implicit none
!---文字の定義------
integer :: i, n, step
real(8) :: ydd_EqNS(20000), ydd_EqEW(20000), ydd_EqUD(20000) !地震波(gal)
real(8) :: y(20000), yd(20000), ydd(20000), time(20000) !変位(m)、速度(m/s)、加速度(m/s/s)、時間(s)
real(8) :: beta, dt, omega, T, h, m, k, c, pi, delta_p,epsilon, delta_y
```
`implicit none`忘れずに書きましょうね。

平均加速度法なのでβ=1/4、減衰は5%で剛性比例型減衰としました。
ちなみに、一次固有周期は1.0sになるよう、質量とバネ剛性を決めました。

```FORTRAN
beta = 0.25                       !β法(平均加速度法なので1/4)
h = 0.05                          !減衰定数(5%の減衰を与える)
c = 2.0 * h * k / omega           !粘性係数(剛性比例型)
```

解析部分は以下のように記述しています。次ステップの変位を仮定して一度運動方程式を解き、その後、誤差が一定の値以下になるまで、収斂計算をしていきます。収斂計算の誤差はε以下として、
```math
 \epsilon = 1.0 \times 10.0^{-5.0}
```
と設定しました。

```FORTRAN
!---次ステップの値を求める----------
do n = 1, step, 1
    y(n+1)   = y(n)                                                                                          !変位を仮定
    ydd(n+1) = (y(n+1) - y(n)) / (beta * dt**2) - yd(n) / (beta * dt) - ydd(n) * (1.0 / (2.0 * beta) - 1.0)  !加速度を求める
    yd(n+1)  = yd(n) + 0.50 * (ydd(n) + ydd(n+1)) * dt                                                       !速度を求める

    !---収れん判定（収れんしていない場合にはループの計算を続ける）---
    do
        delta_p = (-1.0) * m * ydd_EqNS(n+1) * 0.01 - (m*ydd(n+1) + c*yd(n+1) + k*y(n+1)) !不釣合力を計算
        
        if (abs(delta_p).lt.epsilon) exit
            delta_y = delta_p / (k + m / (beta * dt**2) + c /(2.0*beta*dt))
            y(n+1) = y(n+1) + delta_y                                                                               !変位修正
            ydd(n+1) = (y(n+1) - y(n)) / (beta * dt**2) - yd(n) / (beta * dt) - ydd(n) * (1.0 / (2.0 * beta) - 1.0) !加速度を求める
            yd(n+1)  = yd(n) + 0.50 * (ydd(n) + ydd(n+1)) * dt                                                      !速度を求める
    end do
```

## 解析結果
今回作ったモデルでの解析結果を以下に記します。

**FORTRANでの解析結果**
![equationOfMotion.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989559/9d98a4ff-cee4-413e-b21c-723772b2b57d.png)
青線が入力地震動、赤線が応答値です。

最大応答加速度(絶対値):**14.967(m/s/s)**
となっており、かなり揺られていることがわかります。

**加速度応答スペクトル**
![Sa_NS_JMAKobeWave.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989559/31d1e9bb-75f9-3985-7ba4-4180ba551ccb.png)
今回は一次固有周期1.0sなので、グラフからは **約15(m/s/s)** と読み取れます。
これより解析モデルの妥当性が確認できました。

久しぶりにFORTRANでコードを書いたので、割と手こずりましたが、解析できるまでコーディングできたので良かったです。
@direct.labs.play-with-docker.com: Permission denied (publickey).

https://labs.play-with-docker.com に接続できなかったのでメモ

```bash
ssh-keygen -q -t ed25519 -P "" -f ~/.ssh/id_ed25519
```
<details><summary>PowerShell</summary>

```bash
ssh-keygen -q -t ed25519 -P '""' -f $HOME/.ssh/id_ed25519
```
</details>

![ezgif-1-fe8ca0f433.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/12d77e08-0a2a-e947-33be-eb4d240f887b.gif)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/734525f1-b5a1-b244-538d-528a61cee77f.png)
SSHキーを作成すると接続できるようになります。

https://stackoverflow.com/a/74081516/5602117

SSHキーを作成しないとエラー`Permission denied (publickey)`になります。

```bash
ssh ip172-18-0-115-ceg41f63tccg009vkarg@direct.labs.play-with-docker.com
The authenticity of host 'direct.labs.play-with-docker.com (40.121.45.0)' can't be established.
RSA key fingerprint is SHA256:vCbhEjmYQhtNzuuuh7TmGAPfe9T+JdGnGaVquQJUphY.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'direct.labs.play-with-docker.com' (RSA) to the list of known hosts.
ip172-18-0-115-ceg41f63tccg009vkarg@direct.labs.play-with-docker.com: Permission denied (publickey).
```
NPF(NetBSD Packet Filter)のrndblock拡張機能でパケットをランダムにドロップしてみる

[NetBSD Advent Calendar 2022](https://qiita.com/advent-calendar/2022/netbsd) 18日目の記事です。今日はNPF(NetBSD Packet Filter)の拡張機能として提供されている、randblock機能を紹介しようと思います。

## NPFのrndblock機能

NetBSDの拡張機能として、rndblockという機能が提供されています。ソースコードは[src/sys/net/npf/npf_ext_rndblock.c](https://github.com/NetBSD/src/blob/trunk/sys/net/npf/npf_ext_rndblock.c)にあり、機能としては一定の確立でランダムにパケットをドロップするというもので、コメントをみると拡張機能のデモ的な位置づけで用意されているようです。

```c
/*
 * NPF random blocking extension - kernel module.
 * This is also a demo extension.
 */
```

とはいえ、NPFの拡張機能の設定方法や実装手順のサンプルとして有用な感じがします。

## rndblockを試してみる

実際にrndblock機能を試してみましょう。例として、ICMP echoパケットに対し、rndblockを適用してみます。
NPFでの設定は以下のようになります。

```
procedure "rndblock" {
  rndblock: percentage 50.0
}

group "icmp rule" {
  pass in  final on $ext_if proto icmp icmp-type echo all apply "rndblock"
  pass out final on $ext_if proto icmp all
}
```

注意点としては、どうやらrndblockは `pass` ルールに対して適用する類の機能となっているようです。ソースコードを見ると、 `block` ルールにrndblockを `apply` した場合は、単にブロックされるルールとして処理されています。以下のコードの106行目～109行目の部分で、すでにブロックされるルール(という判定になっている)なら、そのままブロックする、という挙動になっています。そのため、NPFのフィルタルールでも `pass` ルールに対してrndblockを `apply` しています。

```c
sys/net/npf/npf_ext_rndblock.c:
 96 /*
 97  * npf_ext_rndblock: main routine implementing the extension functionality.
 98  */
 99 static bool
100 npf_ext_rndblock(npf_cache_t *npc, void *meta, const npf_match_info_t *mi,
101     int *decision)
102 {
103     npf_ext_rndblock_t *rndblock = meta;
104     unsigned long c;
105
106     /* Skip, if already blocking. */
107     if (*decision == NPF_DECISION_BLOCK) {
108         return true;
109     }
...
```

さっそくrndblockによるパケットフィルタの挙動を試してみます。先述したルールをリロードします。

```sh
$ sudo npfctl reload
```

外部ネットワーク側から `ping` を実行してみます。 `ping -c 10` と試行回数が小さいので結果に若干のぶれがありますが、おおよそ半分のICMP echoパケットがブロックされている(NPF側では `rndblock: percentage 50.0` という設定)ということが分かります。

```sh
$ ping -c 10 172.16.0.1
PING 172.16.0.1 (172.16.0.1): 56 data bytes
64 bytes from 172.17.0.1: icmp_seq=2 ttl=255 time=0.603397 ms
64 bytes from 172.17.0.1: icmp_seq=4 ttl=255 time=0.768500 ms
64 bytes from 172.17.0.1: icmp_seq=7 ttl=255 time=0.702710 ms
64 bytes from 172.17.0.1: icmp_seq=8 ttl=255 time=0.640894 ms

----172.16.0.1 PING Statistics----
10 packets transmitted, 4 packets received, 60.0% packet loss
round-trip min/avg/max/stddev = 0.603397/0.678875/0.768500/0.072434 ms
```

## まとめ

NPFの拡張機能として提供されている、rndblock機能を試してみました。パケットフィルタの機能を拡張できるという仕組みは、実際に動かしてみないとイメージしづらいこともあるため、このようなサンプルの形で具体的な機能が提供されているのはありがたいですね。
コンテナに環境変数を渡せるように実装した話

# 自己紹介
はじめましてSREとして従事しているもいもいと申します。

私はインフラエンジニアとして約7年ほど金融系のSIerとして業務に従事してきました。
割とガチガチな運用要件やセキュリティ要件の対応を主務としており、前職では書物(設計書)などを書いたりすることが多かったです。

ずっとSIerとして業務に従事してきて自社開発やSaasビジネスをしている企業で
看板を背負って働きたいという思いから現職に転職しました。

今ではSREとしてコンテナ開発のリプレイスや運用などを担当しています。
SREと言っても私自身全然フルスタックではなくインフラ部分を担当しています。
(現在アプリ領域も勉強中！！)

# この記事の目的
PRJでEC2での開発からECSへの基盤リプレイスを実施しました。
その中で環境変数の引き渡す方法を検討してました、
様々な方法がある中で、割とユニークな選択をしたと思うので、
設計する中で学んだことや考慮したことを残しておきたいと思います。
この記事がコンテナの環境変数周りを設計・実装する人にとって有益な情報になるように善処します。

# 環境変数って
環境変数とは、OSが設定値などを永続的に保存し、利用者や実行されるプログラムから設定・参照できるようにしたもの。プログラムの実行時などに必要となる、利用者やコンピュータごとに内容が異なる設定値などを記録するために用いられる。

例えば、DBの接続情報等を環境変数でコンテナに渡したいという場面とかありますよね。

# コンテナに環境変数を渡す方法の選択肢
一般的にはECSコンテナには以下の2つの方法で環境変数を設定することが出来ると思います。

1. ベタ書き
1. パラメータストア/Secrets Managerからインポート


上から順に簡単に渡し方を記載していきます。

## ベタ書き
タスク定義の環境変数欄に環境変数をベタ書きするという内容です。
シンプルでわかりやすいという一方で秘匿情報などの記載に関してセキュアじゃないというデメリットがあります。

公式マニュアルは以下の通り
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/taskdef-envfiles.html

## パラメータストア/Secrets Managerからインポート
タスク定義の環境変数欄に記載するという意味では上記のベタ書きと変わりませんが、環境変数の内容をそのまま書くのではなく、あらかじめパラメータストアやSecretsManagerに環境変数を記載しておき、そのArn情報を記載するという方式です。
このやり方であれば、秘匿情報も記載できるため、セキュアに環境変数を渡すことが出来ます。

公式マニュアルは以下の通り
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/specifying-sensitive-data-parameters.html


# じゃあ実際にどの方法を選択したの？

今回のPRJでは上記のいずれでもない方法で実装しました。
理由はインフラ側に都度依頼せずともアプリ側でも環境変数を追加したかったからです。

# どうやってコンテナに環境変数を渡している？

[ssm-bypass※](https://github.com/hixi-hyi/ssm-bypass)というツールを使用して実装しました。

このツールをコンテナイメージに組み込むことで起動時にパラメータストアに登録されている環境変数を呼び出すことが出来ます。

※知り合いが開発した個人ツールですので注意

# まとめ
インフラ担当者に依頼せずとも環境変数を追加できる方法は既存の選択肢には有りませんでしたが、[ssm-bypass](https://github.com/hixi-hyi/ssm-bypass)というツールを使うことで要件を満たすことが出来ました。

ECSではなく、kubernetesだともう少し細やかに環境変数をコンテナに引き渡せるのですが、ECSだと中々今回のような要件を充足することが難しいです。
(もしかすると他の方法でもこの要件は満たせるかもしれないですが...)

本ツールは個人で作成しているため、保守性の観点から使用できる企業は限られてくるとは思いますが、参考にして自社で作成しても良いかもしれません。