OmniAICreator/Qiita-1.07M huggingface dataset:
Intel 12世代のCPUを搭載したサーバにWindowsServerでHyper-Vを有効にしたら起動しなくなった

# 概要
- 自宅サーバをIntelの12世代に変えるときにHyper-Vを有効にしたらOSが起動しなくなっていろいろ詰まったのでメモ。
- 自分と同じようにCorei7-12700などの12世代のCPUでWindowsServerのHyper-Vを使うときの注意点
- ちなみにWindows11でHyper-Vを有効にしたら普通に起動する。

# Intel 12世代CPUの特徴
- P-CoreとE-Coreの2つのコアがあって、いい感じに使い分けるようになっている。
- P-Coreは高性能コア、E-Coreは高効率コアとか言われている。

# 対応方法
- [WindowsServerのHyper-VはE-Coreが有効だと動かないという報告がある。](https://techcommunity.microsoft.com/t5/windows-server-for-it-pro/alder-lake-12th-gen-intel-cpu-won-t-boot-on-windows-server-2022/m-p/3010622)
- BIOSでE-Coreを無効化するしか方法はなさそう。
- 実際、自分もそれで動いた。

# 感想
- WindowsServerのHyper-VもE-Coreに対応してほしい。
- 現状自宅サーバはE-Coreを使えなくなってしまった。
少なくともドメイン駆動開発ではないもの – 連番命名

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/cdba7e79-51eb-aeb2-be1d-f00340feb87a.png)

「良いコード/悪いコードで学ぶ設計入門」より

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
Windows10 ICMP 関連のパケットフィルタをコマンドプロンプトで操作

```cmd:ICMP 反応状況確認
netsh advfirewall firewall show rule name="コア ネットワーク診断 - ICMP エコー要求 (ICMPv4 受信)"
netsh advfirewall firewall show rule name="ファイルとプリンターの共有 (エコー要求 - ICMPv4 送信)"
netsh advfirewall firewall show rule name="コア ネットワーク診断 - ICMP エコー要求 (ICMPv6 受信)"
netsh advfirewall firewall show rule name="ファイルとプリンターの共有 (エコー要求 - ICMPv6 送信)"
```

```cmd:ICMP 反応許可
netsh advfirewall firewall set rule name="コア ネットワーク診断 - ICMP エコー要求 (ICMPv4 受信)" new profile=private,public enable=yes
netsh advfirewall firewall set rule name="ファイルとプリンターの共有 (エコー要求 - ICMPv4 送信)" new profile=private,public enable=yes
netsh advfirewall firewall set rule name="コア ネットワーク診断 - ICMP エコー要求 (ICMPv6 受信)" new profile=private,public enable=yes
netsh advfirewall firewall set rule name="ファイルとプリンターの共有 (エコー要求 - ICMPv6 送信)" new profile=private,public enable=yes
```

```cmd:ICMP 反応拒否
netsh advfirewall firewall set rule name="コア ネットワーク診断 - ICMP エコー要求 (ICMPv4 受信)" new profile=private,public enable=no
netsh advfirewall firewall set rule name="ファイルとプリンターの共有 (エコー要求 - ICMPv4 送信)" new profile=private,public enable=no
netsh advfirewall firewall set rule name="コア ネットワーク診断 - ICMP エコー要求 (ICMPv6 受信)" new profile=private,public enable=no
netsh advfirewall firewall set rule name="ファイルとプリンターの共有 (エコー要求 - ICMPv6 送信)" new profile=private,public enable=no
```
[Docker] seleniumでUserProfileを利用する

## 前置き

　こんにちは。Dockerを用いたpython環境でseleniumを利用しようとした際、UserProfileを利用するところで詰まったので共有します。調べたところによると、この不具合はlinux環境のみで生じるようです。

## TL;DR

```Dockerfile
FROM joyzoursky/python-chromedriver:3.7-selenium

ARG UID=1000
ARG GID=1000
ARG USERNAME=hoge
ARG GROUPNAME=fuga
# UID, GIDはDockerを利用するユーザーに合わせる
# `id`コマンドで確認可能

RUN groupadd -g $GID $GROUPNAME && \
    useradd -m -s /bin/bash -u $UID -g $GID $USERNAME

COPY . /home/$USERNAME/
WORKDIR /home/$USERNAME/

RUN pip install --upgrade pip
RUN pip install --upgrade setuptools

RUN python -m pip install -r requirements.txt

USER $USERNAME
CMD ["python", "main.py"]
```

```python:main.py
from selenium import webdriver

user_profile = '/home/${USERNAME}/UserProfile' #USERNAMEは先程Dockerfileで指定した名前にしてください, dotenvを利用するのも可
options = webdriver.ChromeOptions()

options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument("--disable-setuid-sandbox")
options.add_argument('--user-data-dir=' + user_profile)

driver = webdriver.Chrome(options=options)

```

## 解説
　linuxの場合、dockerコンテナ内で作成・編集されるファイルはrootユーザーで作成されます。その権限がホストコンピュータにも影響するため､`docker-compose up --build`する度に`./UserProfile/`ディレクトリに権限がなく、コピー出来ない旨のエラーが表示されます。

　これを回避するために、ホストコンピュータと同じUID/GIDを持ったユーザーを作成し、pythonファイルを実行することによってホストコンピュータで権限を持った状態の`./UserProfile/`が作成されます。

　注意点としては、pipを使用するまではrootユーザーでいることと、`./UserProfile/`フォルダをユーザーの権限のある場所(ユーザーフォルダの下)に作成することです。`./UserProfile/`フォルダを適切な位置に配置しなかった場合、
`Python Selenium --user-data-dir option ERROR: could not remove old devtools port file`と怒られます。

## 備考
　もしかしたらホストコンピュータで`id`コマンドを実行した結果をそのまま渡したりなどが可能かもしれません。
え、明日からリモート！？ってなったときに。

## 突然のリモートワーク化
突然、チームメンバーからのコロナ発症報告が届いた。ずっとオフライン、ずっと対面で仕事を進めてきたので、いきなりリモートと言われても…。そんなとき、この記事の内容を意識してみたら、意外と困らなかったぞって話

## 準備編
### 日頃からチームで取り組むタスクの優先度や判断基準を明確にしておくこと
　これは、今回リモートで作業してみて初めて気づくことができたことです。私たちのチームは、スクラムで作業を進めています。その中で日々、1つの開発タスクをしっかりと作業レベルまで分割して明記し、リスクなどを明確にしてから、取り掛かるように努めています。
　今回は、いきなり明日から！しかもメンバーの欠けた状態でリモートワークすることになったのですが、メンバーそれぞれが理解しているタスクの内容や優先度にあまり差異がなかったので、リモートワークになったからといって、質問・確認が極端に増えることなく、スムーズに作業を進めることができたと感じています。
### オンラインワークツールを複数用意する
　リモートワークする上で欠かせないのが、オンラインワークツール。ただ実際に使ってみると、設定がうまくいかなかったり、家などの普段とは違う環境との組み合わせで、思ったように動作してくれなかったりすることが、よくよ〜〜〜くあります。
　そのため、オンラインワークツールは「これを使おう」と1つに決めるわけではなく、これがダメならこれ、このツールとこのツールの機能を併用するなど、1つのツールでうまくいかない場合でも作業が滞ることのないように、リスク分散しておくことが非常に大事です。
　以下に、今回メインで使ったツールをご紹介します。また、リモートワークを始めるまでに時間的余裕のある際は、使用予定のツールを実際に使ったリハーサルを対面で実施しておくと、想定外のトラブルが減るのでおすすめです。
### オンラインワークツール
#### CodeWithMe（[リンク](https://www.jetbrains.com/ja-jp/code-with-me/)）
　主にRailsを使って開発していますので、RubyMineというIDEを使用しています。そのIDEに付属している同時編集機能です。コードを複数人で同時編集することができ、音声通話、ビデオ通話、チャット、画面共有（IDE内だけ）などが可能です。ここまで機能が揃っていると「完璧じゃないか！」と思うのですが、改善してほしい点もいくつかあります。「ホスト以外の参加者が日本語変換すると反映されるまでのラグが長いときがあること」「ホスト以外の参加者が実行するとIDEを再起動するまで二度と実行できなくなる」「ブラウザなどでデザイン、動きを確認したいときは別ツールでの共有が必要」などです。ホストに負荷が集中しますが、気をつけていれば、そこまで煩わしく感じることもありませんでした。なんだかんだ、今回の作業のほとんどはCodeWithMeでコミュニケーションをとっていたので、今後のさらなる改善を期待しています。
#### Slack（[リンク](https://slack.com/intl/ja-jp/)）
　言わずとしてれたコミュニケーションツールで、社内の公式コミュニケーションツールとして採用されています。Slackはチャットなどのテキストメッセージ専用ツールと思われがちですが、通話機能も充実しています。音声通話、ビデオ通話、チャンネル内の全員が参加でき、画面共有できる機能など、オンラインで作業する際にも十分有用でした。今回の作業では、ブラウザ上でのデザイン確認や、チームでのミーティング全般などで多用しました。
#### Miro（[リンク](https://miro.com/ja/)）
　オンラインホワイトボードツールです。複数人で同じボード内で、付箋を張り合ったり図をかけたりします。私のチームでは、普段からデイリーの進捗確認と連絡共有などに用いていたので、オンラインになっても引き続き活用いたしました。今回は使用しませんでしたが、ビデオ通話機能もあり、リモートワークでのミーティングや打ち合わせなどで、非常に活躍できるツールだと思います。

## 別れてそれぞれで作業する編
 　チームのメンバー数は4人で、作業内容に合わせてぺア・ソロを切り替えて進めていましたが、対面でも行っていたデイリー（夕方に1回の進捗報告的ミーティング）だけでは、お互いの作業の進捗状態を把握できずに、どう作業を進めるか悩むことによる時間のロスや、個人で判断して進めた作業の手戻りが発生することが、懸念されました。そこで取り組みを行ってみたところ、うまく懸念を解決できました。
    
- **朝会**
- **こまめな進捗報告**

 
　まず「朝会」でその日1日のメンバーの動きを決めて共有します。どの作業を誰がどんな体制で行うかを細かく話し、また他のメンバーへ連絡する際の基準も明確にしておきました。「〜まで終わったら一旦報告ください」「この実装で詰まったらすぐに連絡ください」など。そしてSlack上に、各作業ごとの進捗報告スレッドを作成して、担当作業が進むたびに「〜実装完了」「〜作業中」など書いてもらうようにしました。
    
## 2人以上で一緒に作業する編

　普段の対面で作業を進めているときから、ペアプロやモブプロに取り組んでいるのですが、リモートワークになることで、相手の表情が確認できない、確認しづらい状態になるので、特に次のことに気をつけて取り組んでみました。

- **会話中の相槌をいつもの倍の音量で、倍の量でやる**
- **独り言を呟く**
- **こまめな休憩**
- **「オーバー」**

　表情がわからない分、相手が今何を考えているのか察することができないので、「相槌」「独り言」を意識的にやってみました。結果、無い時より明らかに相手の状態が把握できるようになり、実際やってみたチームメンバーも大変好評でした。

 また、オンラインは音声情報に常に集中状態にあるため、意外にもオフラインよりも疲れやすくなります。なので、対面で作業しているときよりも、こまめな休憩を心掛けると、そこまで疲れることなく作業を続けられたと、ふりかえりでの発言がありました。

　リモートワークのふりかえりの中で出た意見として面白いと思ったものに、自分の発言が終わった際は、トランシーバーの通信のように「オーバー」というと、発言被りが少なくなり良いのではないかと意見が出て、そのふりかえり内で実験してみました。実験中は効果を感じるより、慣れない気恥ずかしさが勝ってしまいました笑 ただとても空気が和むというメリットもあったので、慣れていけばメリットを感じれるのかもしれません。

## もしかしたら明日から！？
　突然のオンラインワーク、何の備えもなく突然くると大変ですので、「もしなったら…」ということをチームで話しておき、今回ご紹介したツールなどを準備しておくと、心配が減るかなと思います。
初心者　Flutter x MySQL8 に挑戦する 24 with mysql_client

# やった、やった〜！　

　というほどのことかどうかわからないけれど、自分的にはけっこう「やった〜！」な気分。って、何ができましたか。　

- 前回まで　セレクト文で、id以外のcolumnではうまく絞り込めなかった。
    - セレクト文がうまく走り、年表全体から「○○に関するものだけ」をピックアップし、そのうちの一つを表示できるようになった。　
        - 修正したところ　条件語をシングルクオートで囲った。文字列だからねえ。idはintだから、クオートなしでセレクト文が成立していた。

- 前回まで　insert文を自前のwidgetで走らせようとして失敗した。
    - 今回は自前widgetを断念することで、insertに成功。


- 新しく　update文を書いて既存のデータを変更できる入力ページがうまく機能した。

## ここまでで学んだこと　

　conn.excute()の括弧内に、正確なsql文を書くこと。


## まだまだ先は長いぞ　
 
- なんとしても、セレクト文で取れているList全部をListviewで表示する。
- 接続関数を独立させて、各ページをシンプルにする。
- 自前widget不具合の原因を突き止めて、各ページをシンプルにする。
- providerを使って各ページをシンプルにする。
- 自前のプロジェクトに適用する。

## そしてdotenvで撃沈　

　mysql_clientの使ってみた記事は、私の知る限りまだネット上にない。なので、ほんとはこれを「ちゃんとした技術記事」に仕上げたい。そのためにはコードをGitHubに上げたい。　

　まあ、これはlocalのMySQL8に繋いでいるコードだから、接続関連のコードはだれの役にも立たないし、GitHubに上げるときに全部消してしまえばいい話なのだが、せっかくだから.env fileをつくろう、などと欲を出して撃沈。.envから読み込んだパスワードが接続関数の中で機能しない。まあ、仕方がないので、今日はここまで。

![スクリーンショット 2022-09-05 17.46.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1646810/e61063d8-9208-3b1c-9ff7-a3fdaa4382b8.png)

https://qiita.com/dongri727/items/422a07e83e21c34a1d68

https://qiita.com/dongri727/items/412b97eed4943006a0a0
82.関数コンストラクタ

## 関数コンストラクタの記述方法
```javascript
const func = new Function("a","b", "return a + b + d");
```
## 実験
#### 関数宣言/コンストラクタで生成された関数は、ともにオブジェクトであり、コンストラクタであるか
#### instanceofで確認してみる
```javascript
//　スコープに注意！
let d = 99; //Functionをd
const fn1 = new Function("a","b", "return a + b + d");

function fn2(a,b){
	return a + b
}
const result = fn1(1,2);
console.log(result)
// オブジェクトであるかどうか
console.log(fn1 instanceof Object)
console.log(fn2 instanceof Object)
// 関数コンストラクタから生成されたものであるか
console.log(fn1 instanceof Function)
console.log(fn2 instanceof Function)
```
![スクリーンショット 2022-09-05 16.45.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714631/f745fcff-f7bb-0337-d646-ab86f3de40c3.png)

## 注意すること1
→グローバルコンテキストにあるコンテキストを読み込んでしまう。
```javascript
let d = 99; //Functionのd
const func = new Function("a","b", "return a + b + d");
→この場合のスコープが
//　d=99はFunction内で普通に反映されますよ
```
## 注意すること2
thisを反映させるには、newを２回行う
```javascript
const func = new Function("a","b", "console.log(a + b)");
const obj = new func()
```
こんな感じです
ミニPCにUbuntu server 22.04をインストール

Ubuntu Server 22.04.1 LTS をUbuntu.comのチュートリアルを見ながらインストールしてみます。
Server版だと日本語が選べないとは知らんかった。

# 概要
ミニPCにUbuntu server 22.04をインストール。
SSHでメインPCからリモートアクセス。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/4d1b28db-6d0a-fbe2-0fc3-5f868a63ae55.png)


# 参考文献
https://ubuntu.com/server/docs/installation

# 材料
ミニPC　Beelink Minis : 2万ちょい こちらにUbuntuをインストール
　・Win11, 8GB DDR, 128G SSD, Intel N5095

# 1. Basic installation
## 1.1. システム要件
amd64 (Intel/AMD 64-bit)　： OK
CPU: 1 gigahertz：OK 2.00 GHz 4 Core 
RAM: 1 gigabyte ：OK 8GByte
Disk: 2.5 gigabytes： OK 128GByte

## 1.2. Desktop版とServer版の違い
repositoryは一緒。Serverはグラフィカルではない＝コマンドライン

## 1.3. Preparing install media
・isoイメージをダウンロード
https://releases.ubuntu.com/20.04/?_ga=2.16476596.366750257.1662323541-361458439.1662067984
・balenaEtcherでUSBメモリisoを焼く

## 1.4. Booting the installer
・USBをミニPCに刺して、電源ON、起動画面でF7を押しっぱなし。
・USBを選択してUbuntu Serverをインストール

## 1.5. インストーラー詳細
・言語選択：日本語がないので、泣く泣く"English"を選択して Done
・キーボード：日本語キーボードがない"English(US)"を選択して Done
・Ubuntu Severをチェック"x"して Done
・Network connection：Wifiも選べた
　wlpis0でスペース, 
　SSID選ぶ：Choose avisible network
・Proxy? arhchive mirror？　わからないので、そのまま Done
・名前、サーバ名、ユーザ名、パス
・OpenSSHのインストール チェック"x" Done 
　//多分後でメインのWindowsマシンから　リモート接続したくなるだろう
## 1.6. Snap（おすすめソフト？）
　とりあえず何も選ばずにDone。下記あたりが気になる。
　microk8s（コンテナ管理）
　docker（コンテナ作成）
　Canonical Livepatch 
　Powershell
　slcli(Python base API)
## 1.7. インストール終わり
 Please remove boot media と出たらUSBを抜いてreboot

# 2. Attaching your subscription to Ubuntu
https://ubuntu.com/server/docs/install/subscription

Ubuntuに登録がおすすめされているので、とりあえずしておく。
## 2.1. Installing the UA client
~~~
$ sudo apt update
$ sudo apt install ubuntu-advantage-tools
~~~

## 2.2. Ubuntu one Accountを作る
メインPCで、アカウントを作成
https://login.ubuntu.com/
ダッシュボード　https://ubuntu.com/advantage
にアクセス。
Free personalで3マシンまでは無料っぽい。tokenを使えばよいっぽい・
目で見て手打ちするのは無理。SSHで接続しよう。SSH接続は3章へ。

~~~
sudo ua attach C1xxxx
~~~

livepatchがenableになって、少しセキュアになりました。

# 3. OpenSSH Server のインストールとSSHでリモート接続

https://ubuntu.com/server/docs/service-openssh
~~~
sudo apt install openssh-client
sudo apt install openssh-server
~~~

https://inab818.site/ubuntu-server/ubuntu-server-20-04-lts-ssh-connection/

上記を参考にミニPCのipアドレス確認
~~~
ip addr
~~~
192.168.68.87/22

Win PCに Teratermをインストール
Teratermを使って、ubuntu serverセットアップ時のIDとパスでSSHアクセス。

接続できました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/ee75d7d2-40c3-1212-4426-0ba94b102afa.png)

終わり。
【シェルスクリプト】シングルクォートとダブルクォートの違い

## `'`（シングルクォート）
シングルクォートで囲んだ部分をすべて文字列として処理します。
変数が含まれていても展開することなく変数がそのまま文字列として処理されます。

```zsh:ターミナル
＄ export GREETING=Hello ; echo '$GREETING'
$GREETING
```

## `"`（ダブルクォート）
ダブルクォートは変数が含まれている場合には展開されます。

```zsh:ターミナル
＄ export GREETING=Hello ; echo "$GREETING"
Hello
```
Microsoft365のエクセルで特定のファイルだけシートの見出しが表示されない時

# 概要

下記が表示されない時。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/30598727-8e31-1b8a-3980-c39cd5d2c425.png)

# やり方

左上の『ファイル』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/6170b934-a136-2a8e-1569-f495c11a8fb3.png)

左下の『オプション』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/42f65aa7-5477-ba75-41f3-466dbba8600f.png)

『詳細設定』の『シート見出しを表示する』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/18265984-c04d-d4be-a1ec-20d35819975f.png)

この設定はソフト単位ではなく **ファイル単位の設定** 。

# バージョン

Windows 10 Pro 21H2 OSビルド 19044.1889
Microsoft Excel for Microsoft 365 MSO (バージョン 2207 ビルド 16.0.15427.20166) 32 ビット
カスタム通知を設定する

ありがとうございます。かなり参考にさせて頂いた。　うまく行かなかったらApexでコーディング予定でした。以前にApexで通知をできるようにそたことがあるのでその方法で... やっぱりフローは好きになれませんね。設定がよく分からん。Apexの方がコードだけなんで楽だな。

[フローで実装するカスタム通知](https://qiita.com/takoyaki_v/items/a5a591776120188b5241)


# カスタム通知の設定

通知の配信設定もしないとモバイルアプリに通知が飛ばない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2c18db7f-70da-9f8b-91ca-49cbdb1cc87b.png)

何でいっぺんに設定できない変な作りをしてんだよ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c6e5a0d2-f13d-339b-86f6-e197e0389b4d.png)

[「カスタム通知」でPC/モバイルに通知を出し分けてみた](https://base.terrasky.co.jp/articles/gSsfj)

# テスト中に保存できなくなった。


salesforce モバイル　待機中の更新でエラーだよ。嫌がらせとしか思えない。こうやってユーザに諦めさせる手法だな。

[オンライン中またはオフライン中の Salesforce モバイルアプリケーションでのレコードの作成、編集、および削除](https://help.salesforce.com/s/articleView?id=sf.salesforce_app_work_offline.htm&type=5)


# 未解決

+ [公開グループへのカスタム通知について](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Ywag1)
VSCodeとGitHubを連携させる

# はじめに
GitHubを使用してまだ１ヶ月ほどで今のところ保存するような機能しか利用しません。しかし、会社でエンジニアとして働くにあたって必ず必要になるそうなので、とりあえず触ってみました。
GitHubとはソースコード管理ツールで、チームで開発を行う時に利用されるそうです。使用する理由は、履歴を残しながら更新したり、自分以外のエンジニアも修正を加えることが可能という点です。
最初はこのGitHubをCloud9と連携させて使用していましたが、VScodeでも連携させて使用してみたいと思ったので、実際に試してみました。

# 連携方法
## ターミナル上での操作
自身のターミナル上で
```
git --version
```
と入力して
```
git version 2.*.*(Apple Git-*)
```
のように表示されていればインストール済みであると確認できます。

まだインストールしてない方は、[こちらのサイト](https://git-scm.com/downloads)からインストールしてください。

続いて下記項目を入力してください
```
 git config --global user.name 'username'
 git config --global user.email 'username@example.com'
 git config --global core.editor 'code --wait'
 git config --global merge.tool 'code --wait "$MERGED"'
 git config --global push.default simple
```

上から順番に
- ユーザー名
- メールアドレス
- エディタをVSCodeに指定
- マージツールをVSCodeにして
- pushuのデフォルト方式を指定（追跡ブランチに対してpush）
というものになっています。

## VSCode上での操作
VSCode上での操作は[こちらの記事](https://pengi-n.co.jp/blog/vscode-github/)がとてもわかりやすく書いてあるので、この通りに実行してみてください。

# 最後に
masteブランチからcommitしてpushをしようとすると、プルリクエストがうまくいかなかったので（対処法は調べれば出てきます）、ブランチを新たに作成してそちらのブランチからcommit,pushを行うのが分かりやすいかと思います。
今後、GitHubについて理解を深めていき、記事も書いていきたいですね。
QC七つ道具と呼ばれる品質管理手法たち

# QC七つ道具
主に数値データなどを統計としてまとめ、これを分析して、品質管理に役立てる手法。
## 手法の種類
### 層別
データを属性ごとに分けることで特徴を掴みやすくする　。

### パレート図
項目を件数の多い順に棒グラフとして並べ、その累積値を折れ線グラフとして重ね合わせることで、重要な項目をa把握する手法。
#### ABC分析
* 在庫商品の金額、売上などの指標の中から```重視する評価軸を決めて分類し、管理```する方法です。重点分析と呼ばれることもあり、複数ある商品に対して```重要度や優先度を決める```ことで効果的に管理できます。
出典 https://it-trend.jp/inventory_control/article/97-0035#:~:text=ABC%E5%88%86%E6%9E%90%E3%81%A8%E3%81%AF%E3%80%81%E5%9C%A8%E5%BA%AB,%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

* パレートの法則に基づいた分析フレームワークで、売上高・コスト・在庫などの```指標を大きい順にランク付け```し、```優先度を決めて管理```するためのものだ。```ABC分析は別名「重点分析」```とも呼ばれ、```重要度の高いものからA、B、Cに分類し管理```する。もともとは在庫管理で行われていた分析方法だが、やがて品質管理、得意先管理などにも取り入れられるようになった。
出典 https://www.sbbit.jp/article/cont1/53364
### 散布図
相関関係を調べた```２つの項目を対としてグラフ上に点を打ち、点のばらつき具合によって両者の相関関係```を判断する。
正の相関、負の相関、相関なしの関係がある。

#### 正の相関
```一方の要因の数値が大きくなると、他方の要因の数値も大きくなる```相関関係のことです。
出典 https://backlog.com/ja/blog/what-is-scatter-plot/

#### 負の相関
```一方の要因の数値が大きくなると他方の要因の数値が少なくなる```相関関係のことです。
出典 https://backlog.com/ja/blog/what-is-scatter-plot/

#### 相関なし
各データのプロットが```図全体にバラバラ```になっているものです。
出典 https://backlog.com/ja/blog/what-is-scatter-plot/

##### プロットとは？
書く、描画する、点を打つ、置くなどの意味を持つ。
出典 https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%83%83%E3%83%88#:~:text=%E3%83%97%E3%83%AD%E3%83%83%E3%83%88%EF%BC%88%E8%8B%B1%3A%20Plot%EF%BC%89%E3%81%AF,%E3%82%B0%E3%83%A9%E3%83%95%E3%81%AE%E3%81%93%E3%81%A8%E3%80%82

### ヒストグラム
収集した```データをいくつかの区間に分け```、その区間ごとの```データ個数を棒グラフ```として書くことで、品質のばらつきを捉えることができる。

### 管理図 
```時系列に発生```するデータの```ばらつきを折れ線グラフ```であらわし、上限と下限を設定して異常の発見に用いる手法。
### 特性要因図

https://qiita.com/masatom86650860/items/2e883797b9d43da784ef#%E7%89%B9%E6%80%A7%E8%A6%81%E5%9B%A0%E5%9B%B3%E3%83%95%E3%82%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%83%9C%E3%83%BC%E3%83%B3%E5%9B%B3%E3%81%A8%E3%81%AF

### チェックシート
あらかじめ```確認すべき項目を列挙しておいたシート```を使って、```確認結果を記入```していく手法。

# 新QC七つ道具
言語データ(顧客からのクレームなど)をもとに定性的な分析を行う手法。

### 手法の種類
* 系統図法
* マトリックス図法
* マトリックスデータ解析法
* PDPC法
* アローダイアグラム法

調べなくちゃいけない時に調べます。

# 問題を解いた時の気づき
### 回帰式とは？
回帰分析において、x、yの観測値の組を点に記した座標平面上で、それらの点の分布を近似的に表す```直線の方程式```。
出典　https://kotobank.jp/word/%E5%9B%9E%E5%B8%B0%E5%BC%8F-224364#:~:text=%E3%81%8B%E3%81%84%E3%81%8D%E2%80%90%E3%81%97%E3%81%8D%E3%80%94%E3%82%AF%E3%83%AF%E3%82%A4%E3%82%AD%E2%80%90,%E5%9B%9E%E5%B8%B0%E6%96%B9%E7%A8%8B%E5%BC%8F%E3%80%82

出典

https://gihyo.jp/book/2020/978-4-297-11781-8
setIntervalとsetTimeoutの使う際には注意を

Javascriptで定期実行させたい場合、下記のように ```setInterval``` を利用することが多いと思います。

```javascript:1秒おきにコンソールに文字列を出力
setInterval(() => {
  console.log("Hello!")
},1000)
```

こんな便利な ```setInterval``` ですが、非同期処理を実行する場合は注意が必要です。

下記のコードを見てください。

```javascript:1秒おきにサーバへリクエスト
setInterval(async () => {
  const response = await fetch("<APIエンドポイント>")
  const data = await response.json()
  console.log("OK")
},1000)
```

1秒おきに「OK」が出力されるでしょうか？答えはNoです。リクエストからレスポンスまでの時間が1秒未満であれば、1秒おきにメッセージが出力されますが、それ以上になると出力されるタイミングはバラバラです。これは、```setInterval``` の仕組みが、指定された関数の処理時間に関係なく指定されたインターバルで実行されるようになっているからです。これの何が問題かといいますと、サーバからのレスポンス待ちのときに次々とリクエストされてしまいサーバへの負荷に繋がってしまいます。では、遅延を考慮した定期実行を行う場合はどうしたらよいでしょう？

再帰呼び出し + ```setTimeout``` を利用しましょう。```setTimeout``` は指定された時間経過後に関数を一度実行するものです。そのため、定期実行するためには再帰呼び出しの仕組みも必要になります。

先ほどのコードを書き換えてみます。

```javascript
const polling = () => {
  setTimeout(async () => {
    const response = await fetch("<APIエンドポイント>")
    console.log("OK")
    polling() // 再帰呼び出し
  },1000)
}

polling()
```

これで問題なく遅延を考慮した定期実行ができます。ただし、SPAを利用している場合さらに注意が必要です。

画面Aから画面Bへ遷移させるケースを考えてみます。

```plantuml
@startuml
left to right direction
title SPAによる画面遷移

[*] -down-> 画面A
画面A -down-> 画面B
@enduml
```

※例としてVue3ベースで説明します。

```vue:画面A
<template>
  <div><router-link to="/画面B">画面B</router-link></div>
</template>

<script setup>
const polling = () => {
  setTimeout(async () => {
    const response = await fetch("<APIエンドポイント>")
    console.log(response.status)
    polling()
  },1000)
}

// コンポーネントがDOM要素にマウントされた際に呼ばれる
onMounted(() => polling())
</script>
```

```router-link``` は画面遷移させる、またはコンポーネント差し替える際に利用するaタグです。

ここで画面に表示される画面Bへのリンクをクリックして画面遷移しても、定期実行処理は止まりません。
SPAの特性上、```location.href``` とは違い、メモリは明示的な処理を記述しない限りクリアされません。そのため、画面Aの定期実行も継続されてしまいます。

では、画面遷移する際に ```clearTimeout``` を実行してみましょう。```clearTimeout``` は ```setTimeout``` を初期化（実行させないようにする）する関数です。

```vue:clearTimeoutによる初期化
<template>
  <div><router-link to="/画面B">画面B</router-link></div>
</template>

<script setup>
let timeout
const polling = () => {
  timeout = setTimeout(async () => {
    const response = await fetch("<APIエンドポイント>")
    console.log(response.status)
    polling()
  },1000)
}

onMounted(() => polling())

// コンポネントが破棄された際に呼ばれる
onUnmounted(() => if(timeout) clearTimeout(timeout)) // timeoutが設定されている場合のみclearTimeoutを実行
</script>
```

```clearTimeout``` は ```setTimeout``` に指定した関数が実行される前では有効ですが、実行中では初期化（停止）はできません。つまり、サーバへのリクエスト中に ```clearTimeout``` が呼ばれても、レスポンス後の ```polling()``` により ```setTimeout``` が設定されてしまい継続されてしまいます。

じゃあどうするの？

あくまでも現時点の暫定的な対応になると思いますが、VueRouterの```currentRoute.path```が自画面でない場合に早期リターンを行うことで対応可能です。

```vue:自画面判定による早期リターン
<template>
  <div><router-link to="/画面B">画面B</router-link></div>
</template>

<script setup>
import { useRouter } from 'vue-router'
const router = useRouter()

const polling = () => {
  setTimeout(async () => {
    // 現在表示されているコンポーネントが画面Aでない場合はreturn
    if(router.currentRoute.path !== '/画面A') return
    const response = await fetch("<APIエンドポイント>")
    console.log(response.status)
    polling()
  },1000)
}

onMounted(() => polling())
</script>
```

他にもいい案があれば、教えていただけると幸いです。
Sales Enablement（旧My Trailhead）でモジュールを非表示（archive）にする方法

SalesforceにはSales Enablementがあります
今回はSales Enabementのモジュールを非公開（archive）にする方法をおすすめします


### 備考
※Sales Enablementは削除することはできません。あくまでユーザに非公開にすることしかできません
なので、Releaseする前は気をつけてください
※Sales Enablementは2022年9月現在英語のみの設定画面です。なので今回の解説も英語の文字が多いです。ご了承ください



### そもそもSales Enablementってなんだ？

Sales Enablement（旧My Trailhead）は自分でTrailheadのモジュールみたいなものが作成できてユーザに公開して楽しく簡単にTrailheadのような学習方法を提供できるツールです



![step000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/2bd20cbb-4129-2675-ce8a-9b6ad263ac1b.png)

Sales Enablementは削除できない（非公開（（archive））にしかできない）し設定画面が英語で厄介なうえ、解説記事も乏しいので今回解説させていただきました

それでは確認しましょう

### ステップ01 非公開にしたいModuleのAPI Nameを確認しコピーをしてAPI Nameを残しておく
（ここでコピーするAPI Nameを一文字でも間違えたら失敗するのでご注意ください）
![step09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/4a469aeb-6833-7942-9f73-71ef238b9f84.png)




### ステップ02 Releaseに移動して「New Release」をクリックします
![step08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/e99f38b7-922f-317f-26a8-c6f8c1812217.png)


### ステップ03 Add to Releaseを確認

API NAMEを　「ステップ01」で残したAPI NAMEを記載
TYPE　を「Module」に選択
OPERATIONを「Archive」に選択

最後に「Save」をクリックします
 ![step10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/7f98e50c-5842-10d0-b220-4bb2b72820da.png)



### ステップ04 Publishをクリック

![step11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/6b626db7-bce0-5814-eac6-150e9282acfb.png)


### ステップ05 Let's do this!をクリック
 ![step12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/c9fbd6b4-fb75-b603-3f16-c8dff61f74a5.png)


### ステップ06 All Releases をクリック
![step13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/e7003b73-ec05-3ae3-725a-20cffdfaaeb8.png)


これでモジュールが非公開（Archive）になりました
![step14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/0cb8a58c-72cc-b548-cff6-115e9f9e97dc.png)
Linux環境におけるGurobiのバージョンアップ・インストール

# 前提

この記事ではLinux（Redhat8.5）にインストールしたPython3.9.7で使用している、Gurobiを9.0.1から9.5.1にアップデートした際の備忘録です。


9.0.1を使用しているときは探索時間が長い、とにかく長い
9.1以上にすることでNoRelHeuristicアルゴリズムを使っての探索が可能になり、探索時間の短縮を見込めるため、9.5にアップデートを決定


# 手順
1. ライセンス・インストーラを取得
2. Linux環境下で展開
3. 環境変数を修正
4. pythonモジュールのインポート


# 1. ライセンス・インストーラを取得
環境・目的に応じてご準備ください
インストーラはtar.gzのパッケージを使用しました
Gurobiは[Octobersky](https://www.octobersky.jp/products/gurobi "Octobersky_Gurobi")社の数理最適化製品です。


# 2. Linux環境下で展開

Gurobiを構築したいディレクトリに移動します
ここでは/optをカレントディレクトリとします
```cmd:linux_コマンド
cd /opt
```

準備したソースファイルを展開します
バージョンによってファイル名・ディレクトリ名が変わりますので、適宜読み替えてください
```cmd:linux_コマンド
tar xvfz gurobi9.5.1_linux64.tar.gz
```
/opt/gurobi951/linux64/.....とファイルが展開されていることを確認します


/opt/gurobi951/linux64/gurobi.licとなるようライセンスファイルを格納します

:::note warn
古いライセンスファイルはリネームするか削除してしまいましょう
:::




# 3. 環境変数を修正
環境変数を以下になるように修正します
>GUROBI_HOME=/opt/gurobi951/linux64
>PATH=＄{PATH}:＄{GUROBI_HOME}/bin
>LD_LIBRARY_PATH=＄{LD_LIBRARY_PATH}:＄{GUROBI_HOME}/lib

```cmd:linux_コマンド
export GUROBI_HOME=/opt/gurobi951/linux64
export PATH=${PATH}:${GUROBI_HOME}/bin
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${GUROBI_HOME}/lib
```

:::note warn
この時、古いバージョンのパスが残っていると正しい挙動にならないため注意
:::

**環境変数の永続化**
.bashrcファイルなどのファイルに書き込み、永続的に環境変数を登録するようにしておきましょう
バージョンアップの場合、旧バージョンで永続化されていると考えられるので、それを上記に修正すること

**環境変数の確認**
envコマンドで環境変数を確認しておきましょう
```cmd:linux_コマンド
env
```







# Gurobiインストール完了

ここまででGurobiのインストールは完了です。
gurobiが起動するか確認します
```cmd:linux_コマンド
gurobi.sh
```
問題なくIntractive Shellが起動することを確認します






# 4. pythonモジュールのインポート

3\.までではpythonからの使用がまだできないので使えるようにします

${GUROBI_HOME}へ移動します
```cmd:linux_コマンド
cd ${GUROBI_HOME}
```

セットアップコードを実行して、pythonでGurobiを使えるようにします
```cmd:linux_コマンド
python setup.py install
```



pythonを起動し、問題なくimportできるか確認します
```cmd:linux_コマンド
python
～Intractive Shellの起動～
>>>import gurobipy
>>>
```

エラーなくインポートできればPythonでの使用も問題ありません。


後は実際に動かしていきましょう。お疲れ様でした。
【初・個人開発】公園検索コミュニティアプリ　「COMO（コモ）」　作りました

# はじめに  
こんにちは、ご覧いただきありがとうございます。@Rei33_Qiitaと申します。
このアプリは、私の実体験とママ友からの意見を元に、子供と公園に遊びに行く前にしている、「ある」ことを時短できたらいいなと思い作ったアプリです。

「ある」こと、とは、そう「リサーチ」です！

小さな子供がいる家庭は事前の下調べをしっかりする傾向にあります。
その下調べが意外と時間がかかるのです。
このアプリは下調べを時短し、公園をもっと楽しむ目的で制作しました。


# 使用環境
ruby 3.0.4
Ruby on Rails 6.1.6
PostgreSQL 14.4

# 問題の洗い出し
ヒアリングで出てきた、下調べの主な内容
- 遊びたい遊具があるか（赤ちゃんブランコなど）
- 必要な施設があるか（トイレ、休憩所）
- 季節の遊びは始まっているか（じゃぶじゃぶ池）
- 周辺情報（食事が取れる場所はあるかなど）
- イベントやっているか（盆踊り・シャボン玉・自然体験など）

# 問題解決のために実装した機能と使いかた
- 住所から公園の検索
- 遊具・施設から公園の検索
![検索.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2683201/e7bf2965-1987-e24a-4184-9c7f2fbac419.gif)


- 公園コミュニティで情報交換
- 口コミのカテゴリー検索
![スクリーンショット 2022-09-05 12.15.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2683201/76bb3990-11ca-1acd-3237-c167784caa0b.png)
- 口コミに対して質問もできます（Ajaxで実装）
![スクリーンショット 2022-09-05 12.16.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2683201/2f80cfa3-609f-4b6b-33ff-7f46216d2367.png)

- マイページでお気に入り公園の管理![スクリーンショット 2022-09-05 16.08.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2683201/3e3f622e-d8e8-03bb-2eff-53ffa8d77448.png)


# 今後の展開
- ログイン機能のセキュリティ強化
- 公園情報の充実
- コミュニティ部分のデザインをもっと素敵に
- 天気予報実装
- 地図から検索実装
- 口コミ情報に地図機能実装
- 季節の遊びお知らせ機能


# 最後に
最後までご覧いただきありがとうございました。
スクールの卒業制作として制作をスタートさせたアプリですが、機能を実装するたび愛着が湧いてきました。
このアプリはこれからも開発を続けていきます。もっと便利に使いやすくしていきたいと思いますので、下記アドレスまで遊びに来ていただけると幸いです。またご意見などいただけるととても嬉しいです！！
https://fast-peak-21206.herokuapp.com/
【エラー】プロキシ環境内でのGit コマンド使用【備忘録】

# はじめに
会社内などのプロキシ環境内から Git コマンドを使用する機会があったのですが、
「fatal: unable to access 'https://github.com/hoge/hoge.git/': Failed to connect to github.com port 443 after 21110 ms: Timed out
というエラーが発生しました。

解決策を備忘録として記録します:pencil2:

# 解決方法
https://maku77.github.io/git/settings/proxy.html
↑こちらの記事を参考に解決しました。
※以下、上記の記事を引用

次のようにプロキシサーバーのアドレス（とポート番号）を設定すると、エラーが解消されました。

#### プロキシサーバーのアドレス（とポート番号）を設定
```
$ git config --global http.proxy http://proxy.example.com:8080

# "proxy.examle.com:8080"の部分は適宜変えてくださいね！
```

#### 設定されているか確認
```
$ git config --global --list
...
http.proxy=http://proxy.examle.com:8080
```
```
$ cat ~/.gitconfig
...
[http]
	proxy = http://proxy.examle.com:8080
```
「 http.proxy=http://proxy.examle.com:8080 」が設定されていればOK :point_up:

## 補足

#### Git のプロキシ設定を削除するには
```
$ git config --global --unset http.proxy
```
プロキシ設定を削除するには、git config --unset コマンドを使用すればいいみたい:point_up::point_up:

#### Git のプロキシ設定を一時的に無効にするには
```
$ git -c http.proxy= pull
```
リモートワークなどで、一時的にプロキシ設定を無視して git コマンドを使用したい場合は、
-c オプションで http.proxy 設定を空に指定すればいいみたいです:point_up::point_up:

※http.proxy= の後ろには空であることを示すスペースがあることに注意
※明示的に http.proxy="" としてもOK

# まとめ
以上、Gitコマンド実行時のプロキシエラーの解消方法でした:bow:
M1にpythonをインストールしてみた

## はじめに
今回の投稿がQiitaの初めてなので、markdown記法に慣れていないので申し訳ございません。
今後、勉強したことや困ったことを投稿していきますので、よろしくお願いします。

## pythonを入れる方法
今後、競技プログラミングの方でpythonを使って行なっていきたいと思ったのですが、先日いきなりpythonの方でやろうとしたら、M1にはpythonが元々入っていない？という状態に気づいて、急遽Javaの方でやりました。
そのため、今回の記事はM1にpython環境を入れるのに参考にした記事を貼っておこうと思います。
[参考記事](https://hitori-sekai.com/python/mac-python-install/)
※いつもの感覚でバージョンを確認するときに`python -v`と入力するとpythonが起動してしまいました。原因としては`-v`が大文字の`-V`でないといけないことを知りませんでした。

## 最後に
最近、macを買い替えてM1チップ搭載のMacBook Airにしたのですが、友人に聞いたところpython以外にもdockerを使うときに少し苦労するようなところがあると聞いたので、そのような部分も勉強する時が来たら記事にすると思います。
UiPath ThrowしたのにCatchされない問題の解消方法

BusinessExceptionを利用して

ThrowしたのにCatchされない状態の解消方法をお伝えします。


◆現象
シーケンス内にスローを設置すると
Catchで拾われない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2826228/74efee4c-7938-84c1-2bcc-9a1bca1657b9.png)

◆原因
GlobalErrorHandlerが悪さをしていた

◆解消方法
新規>グローバルハンドラー　で作成し、project内からグローバルハンドラーのxamlを削除することで解消された。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2826228/a669ce9e-eb90-172e-9323-4bf9ceb96caa.png)

◆そのほか
実行時にデバッグをするとthrowで止まるので、「実行」ボタンを押しましょう
[Action required] 2019 年 1 月より前に作成したIBM Cloud上のSPSS Modeler Flowのマイグレーション

## はじめに

IBM Cloud の Watson Studio で SPSS Modeler Flow がご利用になれることはご存じでしょうか？
このSPSS Modeler Folow はブラウザで動作するもので、SaaSで提供されています。

2022/8/18、[Action required]としてマイグレーションの情報がでていましたので、こちらでもアナウンスさせていただきます。

## ドキュメント

[こちらに記載があります。](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/whats-new.html?context=cpdaas&context=cpdaas%3Fcontext%3Danalytics%3Fcontext%3Dcpdaas%3Fcontext%3Dwdp&locale=en&audience=wdp)
(What's New のページなので、「Migrate older SPSS Modeler」でWebページを検索してください）



Migrate older SPSS Modeler flows before 18 November 2022
![Migrate older SPSS Modeler flows before 18 November 2022.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/8525e6cc-58fe-7a54-45f1-d26e50390d5a.png)

##### 2019 年 1 月より前に作成した SPSS Modeler フローがある場合は、2022 年 11 月 18 日までにそれらを開いてマイグレーションしてください。そうしないと、フローが使用できなくなる可能性があります。


使えなくなると、大変ですので、該当する場合は、2022 年 11 月 18 日までにSPSS Modeler Flowを開いて、マイグレーションの手続きをしてください。（確認はできていませんが、開いて保存するオペレーションか、マイグレーションするか聞かれる流れになると予想されます。）


どうぞご注意ください。以上IBM Cloud上のSPSS Modeler Flowのマイグレーションのご案内でした。
80.new演算子を生成する時

オブジェクト
return { }
新しくオブジェクトが生成される
オブジェクト以外
__proto__
prototypeをコピー


## return付きのコンストラクターを生成時の挙動の違いについて
#### ＜条件1-1＞
1.return 内が空の{}→空のオブジェクトが生成
2.オブジェクト内のthisにプロパティを設定→undefindが返される
3.プロトタイプを指定→__proto__には保存されていない
```javascript
function F(a,b){
 this.a = a;
 this.b = b;
 return {};
}
F.prototype.c = function(){console.log("C")}
const ins = new F(1,2);

console.log(ins); 
console.log(ins.a); 
console.log(ins.b); 
console.log(ins.c);  

```
![スクリーンショット 2022-09-05 14.27.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714631/afd8d8f0-2128-2b42-eda7-cd9c3c21f54b.png)



#### ＜条件1-2＞
1.return 内に{キー:バリュー}→オブジェクトが生成
2.オブジェクト内のthisにプロパティを設定→undefindが返される
3.プロトタイプを指定→__proto__には保存されていない
```javascript
function F(a,b){
 this.a = a;
 this.b = b;
 return {d:2,e:4};
}
F.prototype.c = function(){console.log("C")}
const ins = new F(1,2);

console.log(ins); 
console.log(ins.a); 
console.log(ins.b); 
console.log(ins.c); 
```
![スクリーンショット 2022-09-05 14.19.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714631/2a871fb3-7b7c-b369-587a-19445a4241de.png)

#### ＜条件2＞
```javascript
1.return 内が値→値が生成
2.オブジェクト内のthisにプロパティを設定→thisが設定される
3.プロトタイプを指定→__proto__に処理が設定される
function F(a,b){
 this.a = a;
 this.b = b;
 return 1;
}
F.prototype.c = function(){console.log("C")}
const ins = new F(1,2);

console.log(ins); 
console.log(ins.a); 
console.log(ins.b); 
console.log(ins.c); 
```

## プロトタイプを切り離してオブジェクトをコピーする方法
1.プロトタイプをコピー　C.prototype
2.オブジェクトを生成　Object.create
3.2を空の_thisに代入
4.applyオブジェクトで__thisに格納する
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/apply

```javascript
function F(a,b){
 this.a = a;
 this.b = b;
}
F.prototype.c = function(){console.log("C")}
const ins = new F(1,2);

console.log(ins); 
console.log(ins.a); 
console.log(ins.b); 
console.log(ins.c); 

function newOpe(C,...args){
	const _this = Object.create(C.prototype);
    C.apply(_this,args);
	console.log(result,_this)
}

const instance = newOpe(F,2,30)
console.log(instance)
```
ADLS Gen2の1コンテナだけに閲覧権限を付与する

# やりたいこと

ユーザーをAzure Data Lake Storage Gen2 にある、コンテナ1つだけに閲覧権限を付けたい。
（閲覧権限のついているコンテナ以外のデータは見えないままにしたい）

# やること

1. ADLS Gen2（リソース）に「閲覧者」権限を付与する。
1. 閲覧権限付けたいコンテナで「ストレージ BLOB データ閲覧者」権限を付与する。

# ロール説明

## 「閲覧者」ロールにデータの読み込み権限はない

> 閲覧者ロールは Azure Resource Manager のロールであり、ユーザーにストレージ アカウントのリソースの表示を許可しますが、変更は許可しません。 これは Azure Storage 内のデータに読み取りアクセス許可を提供しませんが、アカウント管理リソースに対してのみです。 ユーザーが Azure portal 内の BLOB コンテナーに移動できるようにするには、閲覧者ロールが必要です。
> [BLOB データにアクセスするための Azure ロールを割り当てる \- Azure Storage \| Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/storage/blobs/assign-azure-role-data-access?tabs=portal#assign-an-azure-role)

リソースに対して「閲覧者」を付けておくことで、リソースの閲覧ができるようになる。が、データのアクセスはこのロールは関係なさそう。

## 「ストレージ BLOB データ閲覧者」ロールがデータの読み込み権限を付与する

> たとえば、ストレージ BLOB データ共同作成者ロールを sample-container という名前のコンテナーのレベルで Mary というユーザーに割り当てると、Mary にはそのコンテナー内のすべての BLOB に対する読み取り、書き込み、および削除のアクセス権が付与されます。 ただし、Mary が Azure portal で BLOB を表示する場合、ストレージ BLOB データ共同作成者ロール自体は、BLOB を表示するためにポータル内でその BLOB に移動するための十分なアクセス許可を提供しません。 ポータル内を移動し、そこに表示されている他のリソースを表示するには、追加のアクセス許可が必要です。
> [BLOB データにアクセスするための Azure ロールを割り当てる \- Azure Storage \| Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/storage/blobs/assign-azure-role-data-access?tabs=portal#assign-an-azure-role)

データの読み込みを許可するには「ストレージ BLOB データ閲覧者」ロールが必要。ただし、このロールだけしかついていない状態では、リソースの表示（「閲覧者」ロール）がそもそもできないので、データの閲覧もできなくなりそう。

# 注意点

リソースにつけた「閲覧者」ロールによって、ストレージ内のコンテナの一覧はユーザーが見ることができますが、コンテナ内にアクセスできるのは「ストレージ BLOB データ閲覧者」ロールのついているコンテナのみになります。
maya python world transform

```python
from maya.api.OpenMaya import MVector, MMatrix, MPoint
import maya.cmds as cmds

def get_world_transform (obj):
 return MMatrix ( cmds.xform( obj, q=True, matrix=True, ws=True ) )

selected_object = (cmds.ls(sl=1,sn=True))[0]

print ( get_world_transform( selected_object ) )
```
【GitLab】CICDのymlファイルの書き方②

# はじめ

　　gitlabのCICDを勉強しています。
　　.gitlab-ci.ymlの書き方と注意点をメモしました。
　　例を参考しながら、tags/allow_failure/when/retry/timeout/parallelの書き方をまとめてみました。
# CICDのymlファイルの書き方
## tags

- 実行するrunnerを指定する
- jobにtagsを書く
```yml
windows job:
  stage:
   - build
  tags:
   - window_runner
  script:
   - echo "Hello"
```

## allow_failure

- allow_failure:ture -> job失敗を許す。失敗したら、オレンジびっくりマークが表示され、次のjobが実行する。
- デフォルト値はfalse（job失敗はだめ）。
- jobにallow_failureを書く。
  
## when
- jobの実行操作を設定
- on_success：前のjobは全て実行する場合、該当のjobを実行する
- on_failure：前のステージの少なくとも1つのジョブが失敗した場合にのみジョブを実行する。
- always：前のjobの結果に関わらず、該当のjobを実行する。
- manual：手動で該当のjobを実行する。
- delayed：遅延してから該当のjobを実行する。遅延時間を「start_in」で設定する。
- jobに書く
```yml
deploy:
  stage: deploy
  script:
    - echo "hello"
  when: manual

codescan:
  stage: codescan
  script:
    - echo "codescan"
    - sleep 5
  when: delayed
  start_in: '30'


```

## retry

- 失敗したjobを何回重複実行させる。
- jobに書く
- 最大回数を「max」で設定できる。
- 「when」で失敗原因によって重複実行する。例えば：scriptが町がいた場合、再実行する。→ 「when: script_failure」とretryに追加する。
```yml
job:
  省略
  retry: 2

job2:
  省略
  retry: 
    max: 2
    when: 
      - script_failure
```

## timeout 

- タイムアウトを設定
- jobレベルのタイムアウト設定の場合、jobに書く。

```yml
job:
  timeout: 1 hour 10 minutes
  省略

job2:
  timeout: 1h 10m
  省略

```

- runnerレベルのタイムアウト設定の場合、runnerの設定画面で設定できる。

## parallel
- jobを並列実行する
- 設定数字は50より小さくにする。

```yml
job:
  parallel: 5
  省略
```
Athenaで先月月初、先月月末、今月月初、今月月末を出す

Athenaで日付周りの扱いでハマったので備忘録です。
current_dateではうまく行かず。current_timestampを使うのがポイント。

```
-- Athena 先月、今月
SELECT 
   date_trunc('month', current_timestamp) - interval '1' month                      AS "先月月初",
   date_trunc('month', current_timestamp) - interval '1' day                        AS "先月月末",
   date_trunc('month', current_timestamp)                                           AS "今月月初",
   date_trunc('month', current_timestamp) + interval '1' month - interval '1' day   AS "今月月末"
;

```
【Blue Prism】空欄にならない項目に値を入力できないときの対処法

## はじめに
項目に値を設定する際に、書き込みステージや操作ステージのアクション「グローバルキー送信」で入力するといった方法があるかと思います。
しかし、項目にデフォルトで値が設定されており、且つ、空欄にしたはずなのに一度フォーカスが外れると自動でデフォルト値が設定され上書きできない場合があったので、そのときの対処方法を書いていこうと思います。

## 対処方法
対処方法は、**フォーカスを一度別の項目に移動させ、再度フォーカスをあて直し、入力する**というやり方です。
具体的に一例をご紹介します。

以下の画像の「予定原価」に値を入力していきます。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820916/d7f887ec-5a52-04f1-4547-93e36d1f10ab.png)

手順は以下になります。

1.既に入力されている値を削除する
2.予定原価をクリップボードに貼り付ける
3.Tabを押下してフォーカスを別の項目に移動させる
4.予定原価のテキストボックスをクリックする
5.コピーした文字を貼り付ける


#### 要素をスパイする
必要な要素をブラウザモードとUIオートメーションナビゲーターでスパイしていきます。

テキストボックスをブラウザモードでスパイ(要素の名前は、text_予定原価(ブラウザ)としました)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820916/79acaf67-48f1-148a-613c-3169c41a6015.png)

テキスト内の編集可能な要素をUIオートメーションナビゲーターでスパイ(要素の名前は、予定原価入力(UIA)としました)
![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820916/56456e10-ebeb-f26a-fea3-9e0c95c90e70.png)


#### 実装
手順をもとに実装していきます。

![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820916/35b88b74-3328-489c-b93d-a526439993b6.png)

操作ステージ「項目の値を削除」の詳細は以下になります。
![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820916/bcb3fe6d-50a1-f4cd-f23e-26e658ca8a9e.png)

まず、ブラウザをアクティブにします。
その後項目にフォーカスをあて、特殊キーをグローバルキー送信を使用して押下します。
押下順は、Ctrl+a → Ctrl+delete です。以下の画像のように画面下の項目に``` "^(a)" ```を入力します。

![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820916/1f792fec-edfc-cc8e-68f3-723ab864037e.png)

「各ステップの後に一時停止(秒)」に0.05を設定しています。
これは前のアクションが処理しきれず、次のステップを行ってしまうことを防止するために設定しています。他のステージでも同様です。

もう一つのグローバルキー送信には画面下の項目に``` "{delete}" ```を入力します。
![画像7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820916/2a8abe82-89c8-e787-c66d-1b93f3b5eee0.png)

次に、アクションステージ「クリップボードに張り付け」を設定します。詳細は以下になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820916/896e42ab-74f1-de93-35b4-dd0c67d825a2.png)


最後に、操作ステージ「予定原価入力」を設定します。
ここでは一度テキストボックスにあたっていたフォーカスをTabキーを押下することで外し、再度フォーカスをあてなおし値を貼り付ける操作をしています。値を入力する際は要素「予定原価入力(UIA)」を使用します。
詳細は以下になります。
![画像9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820916/20308ab1-a739-1b18-ae6c-a89bbb7505ba.png)

グローバルキー送信で使用する特殊キーは以下になります。


Tabキーを押下する場合は、値に``` "{tab}" ```
Ctrl+aを押下する場合は、値に``` "^(a)" ```
Ctrl+vを押下する場合は、値に``` "^V" ```
を設定します。

![画像10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820916/b7a26658-04fe-eb86-5b28-a6cd51feb09a.png)
![画像11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820916/aa5be708-8306-4a12-d9be-6c1ab3c1b652.png)


実行してみます。
![画像12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820916/11c04256-4bb6-f9ac-63f1-75971675c571.png)

予定原価に値を入力することができました。
(予定原価を入力すると自動的に単価が入力されるようになっています)

## まとめ
自動的に値が入力されてしまう項目で、上書きがうまくできない場合に一度フォーカスを外してから再度フォーカスして入力するという方法をご紹介しました。

本記事内のグローバルキー送信で特殊キーを押下する際に使用した値を以下にまとめておきます。ご活用ください。
```
Tabキーを押下する場合
 "{tab}" 

Ctrl+aを押下する場合
"^(a)"

deleteキーを押下する場合
"{delete}"

Ctrl+vを押下する場合
"^V" 
```
本記事が参考になれば幸いです。
[RHEL/CentOS] 複数NICに同じセグメントの異なるIPを割り当てると？

# 複数NICに同じセグメントの異なるIPを割り当てると？
NIC とは「ネットワーク・インターフェース・カード」の略です。
「ネットワークアダプタ」などとも言われます。
複数 NIC を利用する目的・用途はネットワークの冗長化や負荷分散、異なるセグメントとの直接接続（バックアップ LAN、管理 LAN など）があります。

## 今回検証する構成
下図のとおり、異なる NIC に同じセグメントの IP アドレスを設定します。
２つ目の IP アドレスが必要であれば、通常は同一の NIC にセカンダリ IP アドレスを設定しますが、今回は実験ということで試してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83224/20165bb8-ac62-81d9-5322-1b0f326f03c9.png)
## 結論から言うと
一番若い番号の NIC しか使われません。
この例ですと ens192 です。
他の NIC は用無しです。何の役にも立ってません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83224/335659a5-d0fb-2b79-82ed-13e7b2d38631.png)


## 他の NIC に割り当てられている IP との通信は？

他の NIC（ens224）に割り当てられている IP アドレス（10.0.0.2）との通信は可能です。
ただしその場合も、使われる NIC は一番若い番号のものになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83224/bb44f121-88c5-8eff-880f-4ad8453e1dad.png)
イメージとしては Linux OS の中でブリッジ接続（HUB やスイッチみたいな）していると考えて下さい。
ただし他の NIC は使われないのでネットワークループはしません。

ARP 応答も一番若い NIC で行うので、他 NW 機器の ARP エントリーには、一番若い NIC の MAC アドレスだけが登録されます。

## 他の NIC の LAN ケーブルを外すと？

何の影響もなく通信できます。
LAN ケーブルを外した NIC に割り当てられてる IP も使えます。
この例ですと 10.0.0.2 ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83224/fca5ef58-93d6-9f2b-0461-da595522546d.png)

## 一番若い NIC の LAN ケーブルを外すと？
全て通信できなくなります。
LAN ケーブルがつながっている ens224 の IP アドレスとも通信できません。
冗長化されているから切れても安心なんて事もありません。
単一障害点となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83224/e7c5bd32-356b-79c2-4c9b-97e51d8d0cf6.png)

## 最後に
検証するまでは、なんとなく「それぞれの NIC でそれぞれの IP」が使えるのかな？
なんて想像していましたが、想定外の挙動でした。
冗長化や負荷分散が目的であれば、ネットワークボンディング（チーミング）したほうが良いですね。
LaravelのPHPUnitテストでキャッシュ一覧を取得する(CACHE_DRIVER=array編)

## PHPUnitでキャッシュドライバを配列するときの設定

```xml:phpunit.xml
<env name="CACHE_DRIVER" value="array" force="true"/>
```
## キャッシュ一覧を取得する方法

```php:test.php
    $store = Cache::getStore();
    $reflection = new \ReflectionClass(get_class($store));
    $property = $reflection->getProperty('storage');
    $property->setAccessible(true);
    $cache = $property->getValue($store);
```

これですべてのキャッシュされたキーと値の配列が取得できる。

## Example

```php
// キャッシュ
Cache::add("hoge", "value1");
Cache::add("hoge2", "value2");

// すべてのキャッシュを取得
$store = Cache::getStore();
$reflection = new \ReflectionClass(get_class($store));
$property = $reflection->getProperty('storage');
$property->setAccessible(true);
$cache = $property->getValue($store);

print_r($cache);
//Array
//(
//    [hoge] => Array
//        (
//           [value] => value1
//           [expiresAt] => 0
//        )
//    [hoge2] => Array
//        (
//           [value] => value2
//           [expiresAt] => 0
//        )
//
//)
```
JavaScript 日時フォーマッタ

日付操作系の大がかりなライブラリ等を導入するまでもないようなケースで扱いやすいよう、必要最低限の機能をコピペで簡単に利用できそうなサイズを意識して組んでみました。

```js:dateFormat.js
const dateFormat = (format, date = Date.now()) => {
  const d = new Date(date);
  d.setMinutes(d.getMinutes() - d.getTimezoneOffset());

  const r = {};
  d.toJSON().match(/\d+/g).forEach((v, i) => r[['YYYY', 'MM', 'DD', 'hh', 'mm', 'ss', 'ms'][i]] = v);
  [...'MDhms'].forEach(k => r[k] = +r[k + k]);
  r.YY = r.YYYY.slice(-2);
  r.hh12 = `0${r.h12 = (+r.h + 11) % 12 + 1}`.slice(-2);
  r.ap = (r.AP = r.h < 12 ? 'AM' : 'PM').toLowerCase();
  r.apj = r.h < 12 ? '午前' : '午後';
  r.w = d.getUTCDay();
  r.wj = '日月火水木金土'[r.w];
  r.wes = (r.we = `${['Sun', 'Mon', 'Tues', 'Wednes', 'Thurs', 'Fri', 'Satur'][r.w]}day`).slice(0, 3);
  r.mes = (r.me = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'][r.M - 1]).slice(0, 3);

  return format.replace(/%(\w+)%/g, (a, b) => r[b] ?? a);
};
```

### 書式

`dateFormat(フォーマット文字列 [,dateオブジェクト])`

#### 引数

- **フォーマット文字列**

以下のフォーマット文字が使用できます。

**%YYYY%** 年 西暦4桁
**%YY%** 年 西暦下2桁

0パディングあり
**%MM%** 月: 01～12
**%DD%** 日: 01～31
**%hh%** 時: 00～23
**%hh12%** 時: 01～12
**%mm%** 分: 00～59
**%ss%** 秒: 00～59

0パディングなし
**%M%** 月: 1～12
**%D%** 日: 1～31
**%h%** 時: 0～23
**%h12%** 時: 1～12
**%m%** 分: 0～59
**%s%** 秒: 0～59

**%ms%** ミリ秒: 000～999
**%AP%** AM/PM
**%ap%** am/pm
**%apj%** 午前/午後
**%w%** 曜日: 0(日)～6(土)
**%wj%** 曜日 日本語: 日～土
**%we%** 曜日 英語: Sunday～Saturday
**%wes%** 曜日 英語3文字: Sun～Sat
**%me%** 月 英語: January～December
**%mes%** 月 英語3文字: Jan～Dec

- **dateオブジェクト**

**Dateオブジェクト**、または**Date()コンストラクター**が解釈できる日時文字列や**UNIXエポックからのミリ秒**が渡せます。
省略した場合は実行時の日時になります。

#### example

```js:
console.log( dateFormat('本日は%M%月%D%日 %wj%曜日です') ); // 本日は9月5日 月曜日です
console.log( dateFormat('%YYYY%-%MM%-%DD% %hh%:%mm%:%ss%') ); // 2022-09-05 14:04:50
console.log( dateFormat('%YYYY%年%M%月%D%日 %apj%%h12%時%m%分', '2000-01-02 15:04:00') ); // 2000年1月2日 午後3時4分
```

----

#### 日付フォーマッタ系の過去の投稿記事
[JavaScript Dateオブジェクトに書式指定メソッドを追加](https://qiita.com/akebi_mh/items/d9a8984c5665dd839cb7)
[PHPのdate()やmktime()をjavascriptでも使いたい](https://qiita.com/akebi_mh/items/b9e62d66d70555f37b43)
ffmpegで動画から画像に変換するときの出力ファイル名の連番を0からスタートさせたい

ffmpegでは連番が1からスタートするので，0からスタートさせたいときは以下のようにしてあげます．

# コマンド
```
$ ffmpeg -i (動画ファイル名) -f image2 -start_number 0 frame_%06d.PNG
```
以上のようなコマンドを打つと

frame_000000.PNG, frame_000001.PNG, framge_000002.PNG

と連番が0からスタートします．
FMOD failed to get number of drivers ... って出て Unity で音が出なくなったら

# tl; dr
- `/Library/Audio/Plug-Ins/HAL/` 以下にある不要なものを全部消して再起動

# こんな感じのエラーメッセージ

```
FMOD failed to get number of drivers ... : "Error enumerating the available driver list. List may be inconsistent due to a recent device addition or removal. " (58)
```

# references
- https://projecthospital.forumotion.com/t3270-mac-osxworkaround-mac-mini-no-sound
- https://issuetracker.unity3d.com/issues/mac-audio-fmod-console-error-is-thrown-and-there-is-no-audio-in-the-editor-when-a-specific-audio-device-is-added
k6でKeyCloakのログインとログアウトを負荷試験するスクリプト

[k6](https://k6.io/)を使ってKeyCloakの負荷試験を実行するスクリプトです。

```javascript
import http from 'k6/http';
import { sleep, check } from 'k6';

export default function () {
  const authData = { username: 'hoge', password: 'hoge!' };

  // show login page
  const loginPage = 'https://keycloak/auth/realms/my-realm/profile'
  const loginResponse = http.get(loginPage)
  check(loginResponse, {
    'is login page status 200': (r) => r.status === 200,
  });
  const cookies = loginResponse.cookies;

  // extract session code from a form
  const regex = new RegExp('session_code=([a-zA-Z0-9].*)"');
  const matchedPattern = regex.exec(loginResponse.body);

  check(matchedPattern, {
    'is session code matched with regex': (matched) => matched[1] !== undefined,
  })

  const sessionCode = matchedPattern[1];

  // authenticate
  const authenticateUrl = 'https://keycloak/auth/realms/my-realm/login-actions/authenticate?session_code=' + sessionCode + '&client_id=client_id';
  const authResponse = http.post(authenticateUrl, JSON.stringify(authData), {
    cookies: {
      KC_RESTART: cookies.KC_RESTART[0].value,
      AUTH_SESSION_ID: cookies.AUTH_SESSION_ID[0].value,
      AUTH_SESSION_ID_LEGACY: cookies.AUTH_SESSION_ID_LEGACY[0].value,
    }
  });
  check(authResponse, {
    'is authentication status 200': (r) => r.status === 200,
  });

  // logout
  const logoutUrl = 'https://keycloak/auth/realms/my-realm/protocol/openid-connect/logout';
  const logoutResponse = http.get(logoutUrl);
  check(logoutResponse, {
    'is logout status 200': (r) => r.status === 200,
  });

  sleep(1);
}
```
GWAPT受験記

# はじめに
無事にGWAPTに合格できましたので、いつものとおりの受験記です。といっても、攻略法はすでに確立されており、以下のとおりです。

https://qiita.com/log0417/items/78f1e3136f508d54784d

GWAPTについては公式サイトにあるとおりです。

https://www.giac.org/certifications/web-application-penetration-tester-gwapt/

## 全体的な感想

GPENよりもさらに簡単だと思いました。実務経験があり、合格するだけであればSANSのトレーニングを受けなくても良いかもしれません。トレーニングを受けないなら特にBurpの使い方は知っておく必要があります。
なお、今回は94%という高得点で合格できました。たまたま問題が簡単だったのかもしれませんが、思った以上の高得点で苦手意識のあったWebアプリのペンテストに自信がつきました。

# CyberLiveについて

GPENと違い、試験用のVMが遅いといった問題はありませんでした。困ったらリセットするということだけ覚えておいた方が良いでしょう。
試験対策はトレーニング内のラボを実施することです。また、模擬試験でもハンズオンは出題されるので、模擬試験でも対策可能です。
ハンズオンは得点が高いようなのでハンズオンに時間を十分残しておき、確実に得点できるようにした方が良いでしょう。

なお、GPENでもGWAPTでも問題によっては解き方は複数あります。1つのツールがうまくいかない場合は別のツールを使ってみたり、手動で試してみたり色々やってみることが重要かと思いました。

# 次の目標
トレーニングを受けられるかわかりませんが、GCFEやGCIHあたりを受けてみたいなぁと思います。
conposer install時にline-bot-sdkのエラーが出る

LINE MESSAGING APIのあるLaravel環境を構築する際にcomposer installでエラーが出た。


```
Problem 1
    - linecorp/line-bot-sdk is locked to version 7.5.0 and an update of this package was not requested.
    - linecorp/line-bot-sdk 7.5.0 requires ext-sockets * -> it is missing from your system. Install or enable PHP's sockets extension.
```

## 解決方法


### 方法①
php.iniに以下を追加

```
extension=sockets
```

### 方法②
①でダメだった場合は以下

dockerfileに以下を追加

```Dockerfile
docker-php-ext-install sockets
```

追加したらbuildからやり直す。
以上です。

## 参考
https://qiita.com/mktro/items/d164bd4a88fc51f2a99d
https://sotaryoutarou.github.io/laravel-require-line-sdk-error/