OmniAICreator/Qiita-1.07M huggingface dataset:
パフォーマンス改善のフレームワーク

こんにちは。 [ぬこすけ](https://twitter.com/nuko_suke_dev) です。

フロントエンドであれ、バックエンドであれ、パフォーマンスのボトルネックを発見し、改善の施策を考えるケースがあるでしょう。

例えば、調査した結果、ある関数の処理がめちゃくちゃ時間かかっていたことがわかったとします。
あなたはこのボトルネックに対して、この関数のロジックを工夫して処理時間を下げるような施策を思いついて、ソースコードを試行錯誤して修正していきます。

![job_kouji_stop2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164159/c361754c-69e7-89ec-89d9-6503bd01cbb2.png)

**待ってください**。
本当に関数のロジックを工夫するだけが施策なのでしょうか？
実はもっとたくさん施策があったりするんじゃないでしょうか？

例えば、「そもそもこの関数は必要ないから削除する」「メインスレッドだけでなく別でスレッドを立ち上げて関数を実行する」など色々施策はありそうです。

ビジネスの世界ではよく「 **フレームワーク** 」という言葉が出てきます。
「 3C 分析」や「 SWOT 分析」、「 4P 分析」などがよくフレームワークの例として挙げられます。

>ビジネスにおけるフレームワークとは、意思決定、分析、問題解決などを行うときに活用でき、経営戦略や問題解決、業務改善などに役立つ、共通の考え方や思考の枠組み、分析ツールのことを指します。
https://www.ohmae.ac.jp/mbaswitch/_mba_framework/

フレームワークって、なんか強そうですね。
使う目的は色々ありますが、 1 つ挙げられるのは「 **抜け漏れをなくすこと** 」があります。
決まった枠組みで思考することで、「この問題の原因ってこれだけじゃないよね」「解決策はこれもあるよね」という感じに抜け漏れをなくすのです。

**パフォーマンス改善の施策を考えるときもフレームワークに当てはめて思考できる** と思うのです。

## リスクマネジメントにおける 4 つの対応戦略

![finger_count04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164159/2ce71d8e-5d31-a970-2f78-ea68fb59ce6d.png)

本題に入る前に、ちょっとリスクマネジメントのフレームワークについて説明します。

プロジェクトマネジメントの知識を体系化した [PMBOK](https://ja.wikipedia.org/wiki/PMBOK) には、リスクに対応するために **「回避」「転嫁」「軽減」「受容」** という 4 つの戦略が紹介されています。

### 回避

リスクの発生を抑える戦略です。
例えば、「発注先が倒産しそうなのでその会社に発注しない」というのは「回避」に当たるでしょう。

### 転嫁

リスクを第三者に転嫁させる戦略です。
例えば、保険の契約は保険会社にリスクを移転しているので「転嫁」に当たります。

### 軽減

リスクの発生確率や影響範囲を抑える戦略です。
雨が降ったらびしょびしょになるリスクがありますが、傘を持つことでびしょびしょはある程度防げます。
これは「軽減」です。

### 受容

リスクに対して特に何も対策はしない戦略です。
「降水確率 10 %だし、傘持つのも荷物になるので傘は持ってこない」というシーンは「受容」になります。

このようにリスクに対する対応戦略には **「回避」「転嫁」「軽減」「受容」** という 4 つの戦略があるのです。

## パフォーマンス改善の施策を考えるフレームワーク

パフォーマンスが悪化しているというのは、ある意味「リスク」と捉えられるんじゃないかと思います。
例えば、 EC サイトで画面の表示が遅いと購買意欲のあったユーザーが離脱する可能性が高まります。

パフォーマンスの悪化を「リスク」と捉えることによって、「[リスクマネジメントにおける 4 つの対応戦略](#リスクマネジメントにおける-4-つの対応戦略)」でお話した **「回避」「転嫁」「軽減」「受容」という 4 つの戦略で施策を「抜け漏れなく」考えられます**。

### 回避

**「そもそもこの機能いる？」** というところから話は始まります。
あまりユーザーから使われていないのにも関わらず、パフォーマンス悪化のボトルネックなのであれば、そもそも機能の削除を検討できるでしょう。

全部の機能は削除できなくても、一部だけ削除するといった施策も考えられます。

### 転嫁

転嫁は第三者にリスクを移転する戦略とお話しました。
この **第三者は色々考えられます** 。

スレッドを第三者と捉えるのならば、マルチスレッド化は「転嫁」でしょう。

あるいは、サーバーも第三者と捉えることができます。
処理の負担が大きいので機能を API として分割して別サーバーを立てるのも「転嫁」ですし、
外部の高速な API サービスを使うのも「転嫁」と考えられます。

### 軽減

冒頭では次のような例を挙げました。

>例えば、調査した結果、ある関数の処理がめちゃくちゃ時間かかっていたことがわかったとします。
あなたはこのボトルネックに対して、この関数のロジックを工夫して処理時間を下げるような施策を思いついて、ソースコードを試行錯誤して修正していきます。

この関数のロジックを工夫する施策は「軽減」といえるでしょう。

### 受容

あえて何もしないのも 1 つの施策です。
「費用対効果的に割に合わない」「やろうと思えば改善できるがコード量が増えたり複雑になる」など色々な事情があって対応を見送るのは「受容」です。

## さいごに

リスクマネジメントのフレームワークである **「回避」「転嫁」「軽減」「受容」をパフォーマンス改善に転用することで、施策を「抜け漏れなく」考えられる** ことをお伝えしました。

ブレインストーミングなどで **パフォーマンス改善の施策を洗い出すときに役に立つ** のではないかと思っています。

今回はフロントエンドやバックエンド関係なく、あらゆる分野のパフォーマンス改善に関わるお話でしたが、 Web のフロントエンドについてはたくさん施策を紹介していたりもしているので、ぜひこちらの記事もご覧ください！

https://qiita.com/nuko-suke/items/50ba4e35289e98d95753

今後の情報発信していくので、ぜひ [ぬこすけ](https://twitter.com/nuko_suke_dev) のフォローをお願いします！

## 参考

https://www.pmi-japan.org/topics/pmi1/pmbok_5_9.php
GASでGMailを操作するいろいろ

## まずは、メールを取得してみる

```js
const mailSearch = () => {
  const threads = GmailApp.search('Amazonギフト券プレゼント')
  const messagesForThreads = GmailApp.getMessagesForThreads(threads)
  for (const messages of messagesForThreads) {
    console.log(messages[0].getSubject())
  } 
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282054/6e8bab17-22cd-b217-5e8b-002846605fcf.png)

## メール送信（メチャクチャ簡単）

```js
const sendMail = () => {
  GmailApp.sendEmail('xxxxx@gmail.com', 'テストだよ', 'これを送信する！')
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282054/74b7f3fe-59cf-22c8-ac55-d2359ed8ffd7.png)

## 新着メール(10分以内の未読)をSlackに通知する。

*メール検索部分*
```js
const newMailSearch = () => {
  const condition = []
  condition.push('is:unread') // 未読
  condition.push(`after:${Math.floor((new Date()).getTime() / 1000) - (5 * 60)}`) // 5分前以降
  const threads = GmailApp.search(condition.join(' '))
  const messagesForThreads = GmailApp.getMessagesForThreads(threads)
  const unreadMessages = []
  for (const messages of messagesForThreads) {
    const lastMessage = messages[messages.length - 1]
    unreadMessages.push({
      date: Utilities.formatDate(lastMessage.getDate(), 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss'),
      subject: lastMessage.getSubject(),
      from: lastMessage.getFrom()
    })
  }
  const message = `新着メール（１０分以内の未読メール）お知らせ\n\`\`\`${
    unreadMessages.map(element => `[${element.date}] ${element.subject} | from: ${element.from}`).join('\n')
  }\`\`\``
  sendMessage(message)
}
```

*Slackメッセージ送信部分*
```js
const SLACK_URL = 'https://hooks.slack.com/services/xxxxxxxxxxxxxx/xxxxxxxxxxxxxx/xxxxxxxxxxxxxx';
const SLACK_CHANNEL = '#bots';

const sendMessage = (message) => {
  UrlFetchApp.fetch(SLACK_URL, {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify({
      channel: SLACK_CHANNEL,
      text: message,
    })
  });
}
```


## 最後に

GMail操作も、GAS✖︎〇〇で、できることは段違いに増えるので、また何か作ったら記事書こうと思います。
個人開発のFlutterアプリをリリースした時のツイートまとめ

### ここから始まりました
https://twitter.com/rcat_app/status/1527416598985748480

### デザインを考え出して
https://twitter.com/rcat_app/status/1527942657716068352

https://twitter.com/rcat_app/status/1528401535276683264

### 少し作り出した時
https://twitter.com/rcat_app/status/1529833330195111936

https://twitter.com/rcat_app/status/1530610371022639104

https://twitter.com/rcat_app/status/1530897482947112962

### そこそこできてきた

https://twitter.com/rcat_app/status/1531066265904721920

https://twitter.com/rcat_app/status/1531406230941364225

https://twitter.com/rcat_app/status/1531779586186694656

https://twitter.com/rcat_app/status/1532124457036177410

https://twitter.com/rcat_app/status/1532486914250403841

https://twitter.com/rcat_app/status/1532756130094428161

https://twitter.com/rcat_app/status/1533065325456990210

### ついにアプリリリース

https://twitter.com/rcat_app/status/1533354073142898688

https://twitter.com/rcat_app/status/1533607579208667136

## 作ったアプリ

https://hastodo.rcat.app/
paiza.ioでelixir その69

# 概要
paiza.ioでelixirやってみた。
Ray Tracerやってみた。

# 参考にしたページ

https://qiita.com/masatam81/items/eb638eee5a8a8c8589a4

# サンプルコード

```

IO.puts """
<!doctype html>
<html>
  <head>
    <link rel="stylesheet" href="lib/style.css">
  </head>
  <body>
    <canvas id="canvas" width="80" height="60"></canvas>
    <script>
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var img = ctx.createImageData(80, 60);
var data = img.data;
var v = [
"""
nx = 80
ny = 60
for y <- ny - 1..0 do
    for x <- 0..nx - 1 do
        [x / nx, y / ny, 0.2]
        |> Enum.map(fn n ->
            255 * n
            |> floor
            |> IO.write
            IO.write ","
		end)
		IO.write "255,"
    end
end
IO.puts """

0];
for (var i = 0; i < 80 * 60 * 4; i++) 
{
	data[i] = v[i];
}
    ctx.putImageData(img, 0, 0);
alert(v[2]);
    </script>
  </body>
</html>
"""


```

# 実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/089f98cf-1535-04d7-f1f2-4e500874c456.png)


# 成果物

https://paiza.io/projects/gGCfcpYivULliWOrExarjw

以上。
Kintoneのデータをスプレッドシートに出力する

## 作るもの

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282054/9783ab34-1f4c-b451-c8a0-556df442214d.png)


## 事前準備

- 対象のKintoneアプリでAPI Tokenを発行する。

## ポイント

### `doGet` で、HTMLファイルを返却する

```javascript
const doGet = (param) => {
  const template = HtmlService.createTemplateFromFile('index')
  template.url = ScriptApp.getService().getUrl()
  return template.evaluate()
}
```

### htmlにて、Javascriptを定義した別ファイルを読み込む
`<?!= HtmlService.createHtmlOutputFromFile('client_js').getContent(); ?>`

### GoogleAppsScriptに定義したFunctionを実行する

```javascript
google.script.run.withSuccessHandler((response) => {
  console.log(response)
}).withFailureHandler((e) => {
  console.log(e)
})
.exportKintoneAppData({
  param
})
```

## 動くものはこちら

https://github.com/Yamamoto-Shohei/kintone_samples/tree/main/src/kintone-export-to-spreadsheet
GASからKintone REST APIを呼び出す

## GASからKintoneのREST APIを呼び出す

https://developer.cybozu.io/hc/ja/articles/360000313406
https://developer.cybozu.io/hc/ja/articles/360035992312

## GASからデータを１件操作する

*レコードを1件取得する*
```js
const getKintoneRecord = (app, appApiToken, id) => {
  const apiResponse =  UrlFetchApp.fetch(`${KINTONE_URL}/k/v1/record.json?app=${app}&id=${id}`, {
    method: 'get',
    headers: {
      'X-Cybozu-API-Token': appApiToken
    }
  })
  return apiResponse.getContentText()
}
```

*レコードを1件登録する*
```js
const createKintoneRecord = (app, appApiToken, record) => {
  const apiResponse =  UrlFetchApp.fetch(`${KINTONE_URL}/k/v1/record.json`, {
    method: 'post',
    contentType: 'application/json',
    headers: {
      'X-Cybozu-API-Token': appApiToken
    },
    payload: JSON.stringify({app, record})
  })
  return apiResponse.getContentText()
}
```

*レコードを編集する*
```js
const updateKintoneRecord = (app, appApiToken, id, record) => {
  const apiResponse =  UrlFetchApp.fetch(`${KINTONE_URL}/k/v1/record.json`, {
    method: 'put',
    contentType: 'application/json',
    headers: {
      'X-Cybozu-API-Token': appApiToken
    },
    payload: JSON.stringify({app, id, record})
  })
  return apiResponse.getContentText()
}
```

サンプルソース

https://github.com/Yamamoto-Shohei/kintone_samples/blob/main/src/gas_get_record.js
2022/11/14主にITとかセキュリティの記事

LenovoノートPCのUEFIファームウェアに重要な脆弱性、確認とアップデートを(11/12)
https://news.mynavi.jp/techplus/article/20221112-2510137/

DellやHPE製品に影響、複数のUEFIに高い特権で任意コード実行の脆弱性(11/12)
https://news.mynavi.jp/techplus/article/20221112-2510135/

FTXでの資金移動でハッキングの疑い、テザーは流出したUSDTをブラックリスト化(11/12)
https://jp.cointelegraph.com/news/tether-blacklists-31-4m-usdt-following-ftx-s-alleged-hack-musk-reacts

「戻してほしいなら金払え」…医療機関に「ランサムウェア」ウイルス　電子カルテのアプリ起動せず　静岡・沼津市(11/11)
https://news.yahoo.co.jp/articles/86a5bde099bce642393c85201f80b8b9660f8f44

FTX関連の資金に謎の動き： 破産手続きの一環か？ インサイダーによる流出？それとも外部からのハッキング？ネット上でも憶測(11/12)
https://jp.cointelegraph.com/news/ftx-funds-on-the-move-bankruptcy-proceedings-insider-threat-or-a-hack

【重要】FTX：公式テレグラムで「ハッキング被害」を報告｜サイト・アプリにも要注意(11/12)
https://bittimes.net/news/134585.html

昔使ったことがあるポートスキャンツールを想い出しながら使ってみた。(11/11)
https://qiita.com/s-toyomura/items/7f238b02218854043f92

サイバー保険、中小の加入急増　供給網停止に備え(11/12)
https://www.nikkei.com/article/DGXZQOUC128XD0S2A011C2000000/

NTTデータのスペイン子会社がGDPR違反、取引先による情報漏洩で制裁金(11/11)
https://xtech.nikkei.com/atcl/nxt/news/18/14124/

今年10月の暗号資産業界における不正流出額、過去最大規模の1,100億円超に(11/11)
https://zuuonline.com/archives/242454

《自治体DX推進計画における“6つの重点”～1》情報システム標準化のポイント
https://www.jt-tsushin.jp/article/dxguide-ktakahashi_02/

「年金」と「マイナンバー」の関係って？ひも付けるとどんなメリットがあるの？(11/11)
https://financial-field.com/living/entry-168735

ビットコインが金（きん）のデジタル版「デジタルゴールド」と呼ばれる理由(11/12)
https://news.nicovideo.jp/watch/nw11686143
Ubuntu 20.04 に Anaconda3 をインストールする 

# はじめに
ubuntu20.04に __Anaconda Distribution__ をインストールします。Anaconda DistributionはPythonのディストリビューションの一つで、パッケージ管理をGUIで行うことができる __Anaconda Navigator__ が搭載されていることが特徴です。


# インストール
下記リンクの「__ダウンロード__」からLinux用のインストーラーをダウンロードします。

https://www.anaconda.com/products/distribution

ターミナルからインストーラーを実行します。

```shell
cd Downloads
bash Anaconda3-2022.10-Linux-x86_64.sh
```

以下のようなメッセージが複数回表示されるので、すべてエンターを押します（もしくは「Yes」を入力します）。
```shell
Welcome to Anaconda3 2022.10
 In order to continue the installation process, please review the license
 agreement.
 Please, press ENTER to continue
>>>
```

インストールできているか確認します。
```shell
which python
which ipython
which pip
which conda
```

バージョンを確認します。
```shell
conda -V
```


# Navigatorを起動
conda環境を起動しターミナルからAnaconda Navigatorを起動します。
```shell
conda activate
anaconda-navigator
```


# よく使うコマンド
conda環境の自動起動を有効or無効にします。
```shell
conda config --set auto_activate_base true
conda config --set auto_activate_base false
```

環境を切り替えます。
```shell
conda activate <パッケージ名>
```

conda環境を終了します。
```shell
conda deactivate
```
Object reference not set to an instance of an object.

```
Object reference not set to an instance of an object.,
```
「オブジェクトの参照がオブジェクトのインスタンスに設定されていない」

初期化する前の`List`に`AddRange`メソッドでオブジェクトを追加しようとするとエラー

## 解決方法

2行目を追加するとエラーが消えた

```cs
var list = new SampleData();
list.SampleLists = new List<List<double>>();

for (int i = 0; i < len; i++)
{
    string url = GeneratePath();
    string json = await GetJsonAsync(url);

    var result = JsonSerializer.Deserialize<SampleRootModel>(json);
    var sampleLists = result?.SampleData.SampleLists;

    if (sampleLists != null)
    {
        list.SampleLists.AddRange(sampleLists);
    }
}

string jsonString = JsonSerializer.Serialize(list);
File.WriteAllText("sample.json", jsonString);

```
VSCodeでエディタ上に表示される線で改行されてしまう

VSCodeでエディタ上に縦線が表示され，そこで勝手に改行されてしまう問題の解決について．

# 状況
以下のようにエディタの中心に現れる線によって勝手に改行されてしまう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791697/a27e331f-3716-5b2a-f2a0-8ffa9e6157f9.png)

# 解決策
1. VSCodeの設定を開く．
2. 設定の検索欄に`wordwrap`と入力する．
3. Editor: Word Wrap Columnの部分を適当に大きな値に設定する．(200以上?)
4. Editor: Word Wrapのプルダウンからをboundedを選択する．

これでWord Wrap Columnかエディタの右端のどちらか小さい方で改行してくれる．

また，中心の線は
1. command+Shift+Pでコマンドパレットを開き，settings.jsonを開く．(設定ページの右上のドキュメントに矢印がついたアイコンをクリックしてもOK)
2. "editor.rulers": [ ],の部分を消せば消える．



# 解決策(スクショつき)
1. VSCodeの設定を開く．
2. 設定の検索欄に`wordwrap`と入力する．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791697/f2578084-765e-fab0-d603-b02f5e693b8d.png)
3. Editor: Word Wrap Columnの部分を適当に大きな値に設定する．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791697/34345b4d-da53-6bd0-57dd-e8eb9e5edce2.png)
これにより，よくわからないところで改行されてしまうのは解消できる．
しかし，これだけだとめちゃめちゃ長いものを入力した場合，
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791697/0d167f02-3815-301e-7c0b-3e70e246e8df.png)
こんな感じで右にぶっ飛んでしまう．そこで，
4. Editor: Word Wrapのプルダウンからをboundedを選択すると，
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791697/9e656255-17fa-70d0-2187-abbf80fb3c23.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791697/2075cc3f-3c7b-5e01-ff62-26a69cdc389f.png)
設定値とエディタの右端のどちらか小さい方で改行してくれるようになる．
CDKでCodeDeployによるECSデプロイ構築できるようになったみたいなので試す


## 背景

ここ最近までCDKでCodeDeployをL2で作成できるのはEC2とLambdaのみであったが、ECSもデプロイできるようになったため早速試した。

（Pythonで書いてます）。

## つくったコード

https://github.com/octop162/cdk-ecs-codedeploy

## CodeDeploy部分のコード

いままで手動で作成していたアプリケーション、デプロイメントグループを定義できる。
ECSサービスとメインリスナー、テストリスナーを指定する。

```
# アプリケーション
ecs_application = codedeploy.EcsApplication(self, "CodeDeployApplication",
                                            application_name="MyApplication"
                                            )
# デプロイメントグループ
ecs_deployment_group = codedeploy.EcsDeploymentGroup(
    self, "BlueGreenDG",
    application=ecs_application,
    service=service,
    blue_green_deployment_config=codedeploy.EcsBlueGreenDeploymentConfig(
        blue_target_group=blue_target_group,
        green_target_group=green_target_group,
        listener=main_listener,
        test_listener=test_listener,
        deployment_approval_wait_time=Duration.minutes(30),
        termination_wait_time=Duration.minutes(30),
    ),
    deployment_config=codedeploy.EcsDeploymentConfig.ALL_AT_ONCE,
)

```

CodePipeline部分。パイプラインの構成にもよるが今回はECRとS3をSourceとして、S3にappspec.ymlとtaskdef.jsonを格納する方式にしたため、それぞれのファイル場所を指定した。imageDetail.jsonはECRが自動生成してくれるアーティストを指定した。

```python

# deploy
code_deploy_ecs_deploy_action = codepipeline_actions.CodeDeployEcsDeployAction(
    action_name="actionName",
    deployment_group=ecs_deployment_group,
    app_spec_template_file=s3_output.at_path('appspec.yml'),
    task_definition_template_file=s3_output.at_path('taskdef.json'),
    container_image_inputs=[codepipeline_actions.CodeDeployEcsContainerImageInput(
        input=ecr_output,
        task_definition_placeholder="IMAGE1_NAME"
    )],
)
pipeline.add_stage(
    stage_name="Deploy",
    actions=[code_deploy_ecs_deploy_action]
)
```

## 感想
いままで手動でつくらなければならなかったので、これからは手軽に作ったり消したりできて嬉しい。

## リンク
* https://docs.aws.amazon.com/cdk/api/v2/python/aws_cdk.aws_codedeploy/EcsApplication.html
* https://docs.aws.amazon.com/cdk/api/v2/python/aws_cdk.aws_codedeploy/EcsDeploymentGroup.html
* https://docs.aws.amazon.com/cdk/api/v2/python/aws_cdk.aws_codepipeline_actions/CodeDeployEcsDeployAction.html
論文を提出する際の注意点メモ

# はじめに
自分が筆頭著者として論文や国際会議の予稿を出した際に指導教員や共著者の先生に注意されたことをメモします。
**私は工学の実験系の研究室所属(執筆当時)ですので、理学や理論の研究室の場合は慣習が異なる可能性があります。**
あくまで参考程度に

# 提出まで
## 研究をして成果が出た
- 学会誌は指導教員に指定してもらっていた
- 基本的にフルペーパー(卒業要件)、非常に優れた成果の場合はレターという扱いだった
## 原稿を書く(Microsoft Word)
- Wordの校閲機能が便利なため、周りの先生方はLaTeXではなく、専らWordを用いていた
- (個人的意見) 一度、(ほぼ毎回Wordでの原稿受け取りをしているだろう)工学系のジャーナルにLaTeXで提出をしたとき、編集プロセスにやけに時間がかかったので、自分の分野ではWordで提出するのがよいと思った
- 学会誌のページを確認して、提出可能フォーマットを確認。
    - 理学系だとLaTeX限定のところもある
    - `.tex`ファイルを提出するため、WordをPDFにしての提出はできない
    - 両方とも提出できる場合は指導教員に確認をしたほうがよい
- 原稿のテンプレートはジャーナルのサイトにある
    - 文献をZoteroで管理している場合は[文献目録のテンプレートの追加方法](https://qiita.com/boronspoon/items/a89dd66b872c40156ee4#%E6%96%87%E7%8C%AE%E7%9B%AE%E9%8C%B2%E3%82%92%E4%BD%9C%E6%88%90)を確認
## 指導教員と何回かやり取りをして原稿を修正する
- イニシャルと番号を書いてバージョンを管理していた
    - `journalname_AS2_ST3.docx`のような形
    - LaTeX等でバージョン管理を使用できる場合は必要ないと思う
- Slackやメールでのやり取りをした

## 共著者とやり取りをして原稿を修正。
- 共著者に個別に原稿を送信したとき、共著者全員をメールのTo:(あるいは指導教員をcc:)に入れる必要があると怒られた
    - 議論を共著者間で共有する必要があるため
- このプロセスは返信待ちに結構時間がかかる

## ジャーナルに提出
- 提出する際には以下の項目を(結構な頻度で)入力するため、まとめて指導教員に確認をとる
    - 新規性のアピール
        - abstractとは別に新規性や先行研究との比較を書く必要がある
    - レビューアーの指定(複数人)
        - 自分の論文のテーマに詳しいレビューアーを指定できる機能
    - レビューアーの除外
        - 同じプロジェクトにかかわったなど、レビューアーになると利益相反につながりそうな人を指定。
    - ジャーナルの中の分野
        - ジャーナルのサイトに載っているため、どの分野を指定するかを確認

## レビューアーからの評価、質問事項への返信
- 国際会議の場合はここで口頭発表に採用されたかポスター発表に採用されたか不採用かが伝えられる。
- 論文の場合はまだ続く
- 自分の場合は軽微な修正でアクセプトされる評価をもらったため、質問事項に丁寧に答えた
    - 共著者と共有する
    - https://peerj.com/benefits/academic-rebuttal-letters のように質問事項への回答方法には共通のやり方が存在する
        - 修正箇所の修正前、修正後の文面を訂正原稿のみでなく、rebuttal letterにも記載する

## 最終決定
- アクセプトされるかが最終決定
- この後、エディターからの軽微な修正事項や原稿の最終確認への回答がある
- 掲載されるジャーナルの号まではauthor's manuscriptという状態
- 掲載されれば完了
CloudFrontで特定のディレクトリにIP制限をかける

サーバー全体に制限をかける場合はファイアウォール等を使いますが、CMSの管理コンソールだけ等ディレクトリに制限をかけたい場合、通常はWebサーバ側で制限をかけたいディレクトリに .htaccess を設置するなりして制限していたと思います。

AWS を使っている場合は AWS WAF を使って制限をかけることができます。ここでは CloudFront と AWS WAF を使ってIP制限をかける手順を解説します。

## ① IP sets で新規にIPアドレスの一覧を作成する。

AWS ＞ WAF & Shield ＞ AWS WAF ＞ IP sets で新規にIPアドレスの一覧を作成します。
このときCloudFrontで制御するのでリージョンはグローバルにしておきます。
許可したいIPアドレスの一覧を登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9064/71196c59-ae90-492c-037c-8dbe1c266828.png)

## ② URI（パス）の正規表現パターンを作成する。

AWS ＞ WAF & Shield ＞ AWS WAF ＞ Regex pattern sets で新規に正規表現パターンを作成します。
CloudFrontで制御するのでここでもリージョンはグローバルにしておきます。
正規表現なのでディレクトリセパレーターは \/ とエスケープが必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9064/0e865742-b91f-4b20-1d54-8de6b50a36f5.png)

## ③ 新規にルールグループを作る。

AWS ＞ WAF & Shield ＞ AWS WAF ＞ Rule groups で新規にルールグループを作します。
しつこいですがCloudFrontで制御するのでリージョンはグローバルにしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9064/5e29abf0-2d98-6405-35c0-29efc754a79c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9064/49b92d5f-ad61-4a35-36c8-ecc6c7ab8b78.png)

②で作成したURI（パス）の正規表現パターンに一致しない場合 OR
①で作成したホワイトリストに一致する場合に許可し、
それ以外を拒否するルールを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9064/03f0f747-cf9d-1c29-fc86-84f89e026a3c.png)

## ④ 新規にACLを作成する。

AWS ＞ WAF & Shield ＞ AWS WAF ＞ Web ACLs で新規にACLを作成します。
リソースタイプはCloudFrontを選びます。
CloudFrontのディストリビューションにACLが未設定であれば、ここで設定できます。
すでにACLが設定されていれば、それに追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9064/2cadf12f-816d-4fe7-78b5-66cc2cb03965.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9064/cde988ff-025c-c8eb-0196-c9735468f562.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9064/2e462776-089e-1b05-dbd7-53dd272a9391.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9064/b8241d9b-a4be-2034-7155-f90e627ed667.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9064/d996f8f6-f7a5-4fa6-bf87-22a33ca2caee.png)

## ⑤ 確認

CloudFrontのディストリビューションにACLがあるか確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9064/3f6013f0-7b0d-f82b-03a2-a3a5f4f1f95d.png)

設定したパスにホワイトリスト以外のIPアドレスでアクセスすると弾かれること、
ホワイトリスト記載のIPアドレスでアクセスできることを確認してください。
GitHubのissueでサブタスクを自動で作成するスクリプトを作ってみた

## 背景
GitHub　issueでサブタスクを作成するためには、サブタスク別途をissueとして作成し、親タスクの説明欄にサブタスクをリストとして記述する必要があります（もっといい方法あるのかもしれませんが）。
しかし、サブタスクのissueを作成して親タスクに紐付ける作業は地味に面倒なのでスクリプトを作ってみました。

## 作ったもの

認証周りの実装をしたくなかったので、APIではなくGitHub CLIを内部で使う方式を取っています。
そのためghコマンドで認証を済ます必要があります。

https://github.com/octop162/github_issue_create_subtask

## 使ってみる

setup.pyを作成したのでpipでインストールできます。

```bash
# インストール
pip install -e .
# アンインストール
pip uninstall gh-subtask
```

サブタスクのタイトルをファイルで作成します。

```plaintext:subtask.txt
Subtask-1
Subtask-2
Subtask-3
```

親となるissue番号、サブタスクにつけるラベル名、サブタスクのタイトルを書いたテキストファイルの名前を指定して実行します。
コマンド実行はissueを管理しているリポジトリのディレクトリで行う必要があります。

```bash
gh-subtask --issue 32 --label subtask --issue_file subtask.txt
```

成功するとサブタスクが作成されます。指定したラベルも付加されます。

![screen1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359375/949eff24-8a29-a99d-5d2d-c049cfa2c8f3.png)

親タスクの説明欄にもサブタスクのリストが追記されます。

![screen2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359375/c7d7f317-9649-d686-468a-b8e81b700b6e.png)

動作は以上です。

## 感想

Pythonでコマンド叩く系のツールを作成するのに便利なpython-fireを使用ましたが、関数の名前付き引数がそのままコマンドライン引数になるためとても便利でした。
setup.pyも使う機会ありませんでしたが、pipでインストールするとどこでもコマンド使えるようになるのでこちらも便利でした。
ツールを作ったもののテキストファイル弄ったりディレクトリ移動が面倒なのでGitHub Projectsなどで簡単に追加できると嬉しいです。

## リンク
* https://cli.github.com/
* https://docs.python.org/ja/3.10/distutils/setupscript.html
* https://github.com/google/python-fire
線形分離可能を10秒で解説

# はじめに
<!-- 発端や概要を記載 -->
みなさんこんにちは。marosです。今日は、簡単に線形分離可能って何？ってお話をします。
# 本題
<!-- タイトルとアンカー名を編集 -->
大量のデータについて、それぞれのデータを$x$としたとき($x$はベクトルです)、重み$w$について(これももちろんベクトルです)
$$y=w^Tx$$
で計算される$y$(これはベクトルじゃないです)が「ある定数よりも大きいか小さいか」でそれぞれのデータを区別できるようにデータが分布している場合のことを、線形分離可能といいます。ちなみに、$w$は$x$によらないベクトルであることに注意するとわかりやすいかもしれません。

今日は以上です。では、また。
Windows10 22H2 ストアをみたらWSL2のベータがあるので 導入してみたが、windows10のそのバージョンでは動かないぜと怒られた

Windows10 22H2 ストアをみたらWSL2のベータがあるので
導入してみたが、、

windows10のそのバージョンでは動かないぜと怒られた

https://apps.microsoft.com/store/detail/windows-subsystem-for-linux-preview/9P9TQF7MRM4R?hl=en-nf&gl=nf

これかな、導入と動作のWindowsバージョンが違うのね？

これが入るとwslgが使えてsystemdが素で動くはず

insiderのwindows10は環境壊したくないし
windows11のノーマルは無いし、確認めんどくさいな

どのWSL機能がどのWindowsで動くのかマトリックスはないのか？
イラストの線画部分を抽出して虹色に光らせるという社会的に有意義なプログラム

あなたがご覧になっているのは[クソアプリ Advent Calendar 2022　カレンダー1](https://qiita.com/advent-calendar/2022/kuso-app) の7日目の記事です。

# はじめに

|  現状(As-Is)  |  あるべき姿(To-Be)  | 問題 | 解決策 |
| ---- | ---- | ---- | ---- |
|  線画が虹色に光らない  |  線画が虹色に光る  | 線画が虹色に光ってない  | 線画を虹色に光らせる | 

それでは、やっていきましょう。

## やっていった結果

### 元の絵（自分で描いたもの）
![localstingray.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166855/d19f7d5f-93c4-2e9a-ddc9-18a16159d763.jpeg)

### 変換後の絵
![localstingray.jpg.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166855/2f60e6f0-8f21-f93d-0071-4767c3173512.gif)

最高ですね。

## どのように解決したか

以下、Python 3.9を使っています。

### 1. イラストから線画部分を抽出するために Anime2Sketchを使用する
Anime2Sketchはアニメイラストの線画部分を抽出する技術。 ->  [Anime2Sketch](https://github.com/Mukosame/Anime2Sketch)

この段階で出力されるのはこんな感じのもの。

![middle.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166855/c7b9b6ed-214a-cef5-5d1e-053e9759dbc5.jpeg)


### 2. 抽出した線画の色を変更して、線画部分以外は透過する

これが光る部分の元になります。

この段階で出力されるのはこんな感じのもの。

![test2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166855/a49de500-5502-d50b-0740-751f38550acd.png)

### 3. 色を変えた線画部分を元のイラストに合成する

線画以外を透過した画像を元画像の上に被せると線画の部分だけ光ってる感じになります。
![test3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166855/fe9dd248-173f-3f5a-2efd-823f30761fbc.png)

### 4. 色を変えながら2, 3を繰り返す

最後にピカピカ光ることを意識しながらCyan -> Magenta -> Yellow -> Cyanを行き来する感じに
色を被せた画像を作っていきます。

ソースコード上ではベタッとこんな感じに書いてます。

``` python
color_styles = [
    (255,0,255, 255), # magenta
    (255,25,225, 255 ),
    (255,50,200, 255 ),
    (255,75,175, 255 ),
    (255,100,150, 255 ),
    (255,125,125, 255 ),
    (255,150,100, 255 ),
    (255,175,75, 255 ),
    (255,200,50, 255 ),
    (255,225,25, 255 ),
    (255,255,0, 255 ), # yellow
    (225,255,25, 255 ),
    (200,255,50, 255 ),
    (175,255,75, 255 ),
    (150,255,100, 255 ),
    (125,255,125, 255 ),
    (100,255,150, 255 ),
    (75,255,175, 255 ),
    (50,255,200, 255 ),
    (25,255,225, 255 ),
    (0,255,255, 255 ), # cyan
    (25,225,255, 255 ),
    (50,200,255, 255 ),
    (75,175,255, 255 ),
    (100,150,255, 255 ),
    (125,125,255, 255 ),
    (150,100,255, 255 ),
    (175,75,255, 255 ),
    (200,50,255, 255 ),
    (225,25,255, 255 ),
]

```

### 5. 十分な枚数が用意できたら、アニメーションgifに変換する

特別なことをしなくても、Pillowで普通にアニメgifにできるのでさくっと作ります。

```py
gif_sources[0].save(f"{dest_dir_path}/{file_name}.gif",
           save_all=True, append_images=gif_sources[1:], optimize=False, duration=40, loop=0)
```

### 結果（再掲）

![localstingray.jpg.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166855/2f60e6f0-8f21-f93d-0071-4767c3173512.gif)


## ソースコード

https://github.com/TASKIH/gaming_sketch

## まとめ

線画が虹色に光るプログラムを開発したことにより、これまでユーザーが無意識下に抱えていた「線画が虹色に光らなくてつらい」というペインを解決することができました。

なぜ作者が線画を虹色に光らせたいと思ったのか、クラスの皆さんで考えてみましょう。

## 終わりに

今年はAIによるイラスト生成が大きな話題になり、激しい議論が行われた年でもありました。
来年はよりよい形で技術とクリエイティブが付き合っていけるような、良い年になるといいなと思います。

明日以降も引き続き[クソアプリ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/kuso-app)をお楽しみください！
餃子に目がない男性が、今度は自身が制作したWebアプリを改良した

# 前書き
先日、人生で初めてWebアプリを制作した。
（もし宜しければご覧いただけると幸いである。）

https://qiita.com/Yuki-Tamura-85/items/14d6a1d0c987b8882f6a

「餃子専用レビューページ」と題してひとまずは形にすることはできたが、「今自分の技量でできること」という点を意識しすぎた分、アイデアに自分らしさや餃子に特化した要素を取り込むことができていなかった。

そこで今回は、前回制作したものをレベルアップさせるべく、新たに学んだ技術を取り入れて改良を試みた。

# 改良したアプリ
下記のような仕上がりになったので、ぜひ叩いていただきたい。

https://rainbow-lokum-d0b848.netlify.app

https://twitter.com/Yuki_Tamura_85/status/1591805449493688321

### 追加した機能
* 入力項目
より餃子に特化させるべくニンニクの有無や値段などを入力欄に設定
* QRコード生成ページ
「こちら」をクリックすると、筆者の独断と偏見と趣味嗜好で選定した餃子7選の食べログサイトをQRコード化してランダムに表示

# 使用したもの
* CodePen
* Netlify
* Vue.js
* QRコード生成
* bootstrap

# CodePenのソースコード
<p class="codepen" data-height="300" data-default-tab="result" data-slug-hash="dyKvymj" data-user="Yuki-Tamura" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/Yuki-Tamura/pen/dyKvymj">
  餃子専用レビューページ&lt;改&gt;</a> by Yuki Tamura (<a href="https://codepen.io/Yuki-Tamura">@Yuki-Tamura</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# 改良をしてみた結果
### 見た目
今回bootstrapを使用したことで、少なくとも前回制作分よりも見やすくはなったのではないか。
特にボタンを色付けすることによって、ユーザーに潜在的な動作制御を促すことができるようになったことが個人的には満足している点だ。

### 使いやすさ
正直なところ、私がユーザーであれば少し不便に感じる点がいくつか存在する。
一点目として、出力されるレビュー一覧がそれぞれ個々となって表示されるという点である。
私としては、一ユーザーのレビューとして入力されたレビューを一つのまとまりにして、それぞれ区別をさせる仕様に仕上げたかった。が、今一つ知識が及ばなかった。
二つ目としては、すべて手入力で実施しなければならないのかと感じてしまう点である。
特に日にちやニンニクの有無など、プルダウンとして実装できればユーザーとしては利便性が向上することは間違いない。
ユーザーの立場に立って気づいたこととして、今後の課題の一つとすることとする。

# 後書き
一通りWebアプリの改良に取り組んだが、総じてとても楽しく実装することができた。
やはり「餃子」を目の前に作業をするだけあって、改良へのモチベーションは息を止めることが無かった。
また一度制作したものを改良、レベルアップするということで、前回と今回とでのクオリティの差や実装スキルの変化が目に見えて分かるため、できるようになったことや自分が得意なことの発見にも繋げることができた。

私の餃子への愛は、まだまだ発展途上である。
仮想マシンスケーリングの特徴

●自動スケーリングの設定変更
仮想マシンスケーリングの特徴は、自動スケーリングできることである。
Azureポータルでの仮想マシンスケールセットの作成時に、スケーリングポリシーでカスタムを選択することでCPUの使用状況に基づく自動スケールング設定が可能だが、次の様なシナリオではスケールセットの作成後に自動スケーリングの設定を変更する。

・CPU以外のメモリやディスクなどのメトリックに基づいてスケーリングしたい
・曜日や日時によって異なる条件でスケーリングしたい
・CPUとメモリの様に複数の規則を使用したい
・スケールセットの作成時に指定したCPUの閾値を変更したい

※仮想マシンスケールセット作成時にはCPUの閾値に基づく自動スケーリング設定のみが可能。

自動スケーリングの設定か国にゃ変更は仮想マシンスケールセットのスケーリングのメニューで行う。
スケーリングでは、スケールアウトおよびスケールインを実行する規則の追加や変更などを行い、上記のシナリオに対応する自動スケーリングを構成できる。
規則とインスタンス数の範囲、スケジュール設定など、スケーリングに関わる設定は自動スケールプロファイル（スケーリング条件）と呼ばれる単位で管理使用される。
Powershell 今日のトリビア Powershellの環境変数を直接Splitする方法

# 確認したバージョン
5.0 Windows 10 64bit
# Psmodulepath
これは複数のフォルダが列挙され、セミコロン区切りとなっている。
# VBAのSplit
VBAでは Split("A,B,C",",")(0)という表記が可能である。
# ここで問題
このような機能はPowershellにはないのか。
# 答え
次のようになる。

本来は代入した方が確実だが

```powershell
$c1=$env:PSModulePath;$ar=$c1 -split ';' ; $varMyDoc=split-path $ar.item(0)
```

以下のようにPowershellらしくドル記号カッコを重ねることで実現できる。
これで複数のフォルダ（Powershellではコンテナというらしい）が取得できる。

```powershell
$($($env:PSModulePath) -split ';').item(0)
```

# 使用する方法
仮想端末のDocumentsフォルダを取得するときに使用する。
【サーバ構築】SSL化とwebサーバのportについて

## はじめに
SSLを導入したのでメモ程度に残します。
また、フロントサーバのポートを4200から80に変更しました。
4200はangularのローカルサーバのportなのでどうにか変更できないかと思っていました。


### フロントサーバ（httpd）
①sslのプラグインをインストール
```# yum install mod_ssl```

②webサーバを再起動する
```# systemctl restart httpd```

③mod_sslがインストールされていることを確認する
```httpd -M```

④https用のportを開放する
```# firewall-cmd --add-service=https --zone=public --permanent```

⑤firewalldを再起動する
```systemctl restart firewalld```

⑥serviceにhttpsが追加されていることを確認する
```# firewall-cmd --list-all```

⑦Let’s Encryptのインストール
```# yum install certbot python2-certbot-apache```

⑧証明書の取得（example.comは自分のドメインにしてください）
```# certbot --apache -d example.com```
※基本的に全部「y」で進めて大丈夫です。

以下のようなエラーが出た場合は、
Unable to find a virtual host listening on port 80 which is currently needed for Certbot to prove to the CA that you control your domain.
Please add a virtual host for port 80.


```vim /etc/httpd/conf/httpd.conf```

※example.comは自分のドメインにしてください。
　DocumentRootはフロントのsrcの場所です。
　httpd.confの一番最後に記載してください。
```shell:httpd.conf
NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin root@example.com
DocumentRoot /var/www/html
ServerName example.com
</VirtualHost>
```

文法チェックを行って
```httpd -t```

問題がなければ、webサーバを再起動してください。

```# systemctl restart httpd```

※以下の2つのファイルがキーになります。
/etc/httpd/conf
・httpd-le-ssl.conf
・httpd.conf

↓こんな感じです、443がhttpsのportだということですね。
　pemが拡張子のファイルはそれぞれ秘密鍵やら、証明書の類です。
　うまくいかない場合は、パスが間違っているかもしれません。
　いずれにしてもhttpd-le-ssl.confかhttpd.confをいじれば治ったので、参考に。。
```shell:httpd-le-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin root@example.com
DocumentRoot /var/www/html
ServerName example.com
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
</VirtualHost>
</IfModule>
```

### バックエンドサーバ（spring boot）

①pkcs#12ファイルというものを作成します
```shell
$openssl pkcs12 -export -in fullchain.pem \
-inkey privkey.pem \
-out keystore.p12 -name \
Tomcat -CAfile \
chain.pem -caname root \
```

②上記のコマンドを実行してenterを押すと、パスワードを要求されるので入力します。
　このパスワードはapplication.propertiesに記載するものなので、メモをしておいてください。

③keystore.p12というファイルが作成されるので、springプロジェクトのresource直下に置きます。

④application.propertiesを設定します。（passwordは先ほど設定したパスワードを入力する）

```java:application.properties
server.port = 443
server.ssl.enabled=true
server.ssl.keyAlias=tomcat
server.ssl.key-store=classpath:keystore.p12
server.ssl.protocol=TLSv1.2
server.ssl.key-store-password=password
server.ssl.keyStoreType=PKCS12
```

以上で終了です。
http⇒httpsになったので、URLの設定箇所の修正が発生すると思いますが、
焦らず、デベロッパーツールやこれまで設定したファイルを見直しましょう。
※websocket（ws⇒wss）

### フロントサーバのport変更について
４０行目ですかね、、（私のファイルでは42行目でした。）
今まで4200でしたが、80に変更しました。
なので、```https://ドメイン:4200```ではなく、```https://ドメイン/```でアクセスできるようになり、port番号は省略できるようになりました。

```shell:httpd.conf
Listen 80
```

## 最後に
今回も一筋縄ではいきませんでしたが、最終的にはできました。
あきらめないことが重要です。原因はどこかあります。
何度も試すことになりますが、着実に答えには近づくのであきらめないでやり切りましょう。
GitHub Actionsを使ってHello World!を表示させてみた

# はじめに
こんにちは、都内でソフトウェアエンジニアをしている[YSasago](https://qiita.com/YSasago)と申します。
今回は、GitHubでGitHub Actionsを使って、Hello Worldを表示する方法をまとめようと思います。

# GitHub Actionsとは
* GitHub Actions はGitHubが提供している```CI/CD(継続的インテグレーションと継続的デリバリー)```のプラットフォーム
* GitHub Actions を使うことで、ビルド、テスト、デプロイ等の自動化ができる 

https://docs.github.com/ja/actions/learn-github-actions/understanding-github-actions


# 使用料金
気になるGitHub Actions の料金です。
* ```パブリックリポジトリでは無料```
* ```プライベートリポジトリは無料枠＋従量課金```

https://docs.github.com/ja/billing/managing-billing-for-github-actions/about-billing-for-github-actions


# GitHub Actionsを使って、Hello World!してみる
## 1. GitHubにリポジトリを作成します
今回、GitHubにパブリックリポジトリを１つ作成しました。

![スクリーンショット 2022-11-12 21.25.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95954/a2197cfd-6797-6504-9ece-854a88866b55.png)

## 2. 作成したリポジトリをCloneして、workflowのファイルを作成します
最初に、```.github/workflows/```フォルダを作成し、そのフォルダ内に任意の名前のyamlを作成します。
今回は、```helloworld.yml```を作成しました。

![スクリーンショット 2022-11-12 21.28.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95954/1b27c4c6-ef88-acf6-4451-7d0dcc4be6fb.png)

yamlファイルの中は下記のように書きました。
* ```on:```に動くきっかけを記載します。
    * 今回は、pushのタイミングで動かしたかったのでpushと書きました
* ```runs-on:```に実行環境を記載します
    * 今回は、最新のUbuntu環境で動かしたかったのでubuntu-latestと書きました
* ```steps:```に実行したい内容を書きます
    * 今回は、画面にHello World!を表示させたいのでechoを書きました

まとめると、「pushが実行された時にGithubが用意した最新のUbuntu環境でecho "Hello World!"というコマンドを実行する」という内容になります。

```yaml:helloworld.yml
name: "Hello World"

# 動くきっかけ
on: [push]

# 動かす内容
jobs:
  sample:
    name: Hello World Job
    runs-on: ubuntu-latest # 実行環境
    steps: # 実行する内容
      - run: echo "Hello World!"
```

変更は以上となるので、commitして、pushします。
```zsh
git add .
git commit -m "Hello World Job作成"
git push
```

## 3. 動作確認
GitHub上のActionsを選択すると、作成したHello Worldというワークフローが作成されているのがわかります。


![FireShot Capture 117 - Actions · sasayoshi_hello-world-cicd - github.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95954/a208c137-723c-0c1f-c9b8-b109097d511a.png)

Hello Worldのワークフローをクリックして中を見ると、Hello World Jobが動いて、echo "Hello World!"が実行されているのがわかります。
![FireShot Capture 118 - Hello World Job作成 · sasayoshi_hello-world-cicd@e2c3826 - github.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95954/0e03087c-0600-aa66-4a32-1fb89ea8e737.png)

# おわりに
今回、GitHub Actionsを使ってHello World!を表示するワークフローを作成しました。
GitHub Actionsを活用すれば、CI/CDを手軽に実現できると思いました。GitHub Actionsはとても便利ですね。
最後まで読んでくださりありがとうございました。

# 参考
https://www.udemy.com/course/devops-gha-aws-infra/
AWSハンズオン_３_IAMの３_ユーザにアクセス権限の境界設定


AWSの初心者のさとしです
ハンズオンで勉強メモとして投稿いたします。
ご覧になったみんなさんにお役に立てればうれしいです
※：間違うところがあれば、ご指摘していただければ幸いです
#本文
アクセス権限の境界設定はIAMユーザに対して権限境界（Permissions boundary）を設定して、付与可能な権限範囲をあらかじめ制限できる。

事前にアクセス範囲を決めて、仮にユーザに誤ったポリシーを付与した場合は、このアクセス権限の範囲の権限でなければ、誤った付与したポリシーが効きしないというふうに認識しました。

それでは検証します
例えば、下記のユーザが開発のポリシー（ec2,rds...）を付与されていて、
IAM権限が明らかに付与されていなかったです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/88f8cad4-9144-12a5-3855-fdc7da9f7800.png)

では、アクセス権限の境界（開発ユーザだけ）の設定を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/5d16cb8c-c7ca-e13f-5935-342fc3af07fc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/6748c648-85a5-7efc-dd4c-db6ab7f02a25.png)

そしたら、IAMのフルアクセス権限を付与します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/3e2b1204-6646-8fab-0616-b04701fa66f8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/1afac506-8f50-bd04-ac7c-4fc602f6a70b.png)

アクセス権限を付与しました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/63538ae2-85ea-0a27-1112-c2d993cb434d.png)

そしたら、このユーザを使って、アクセスしたら、
下図のように、IAMのフルアクセス権限があっても
アクセス権限の境界が制限されますので、アクセスできません
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/9fb63da4-2f22-f330-6729-bcc800db3726.png)
Intersection Observer API(監視対象を増やす)

・queryselectorAllを使い全部を取得する。
・forEachを使い全部やる。

ちなみに、、、、
entriesには監視している全ての要素が入ってくるわけではない。
entriesは複数の要素を持つ配列で、監視開始時点では全てのtargetが、交差した時では交差したtargetだけが要素として入ってくる。
```Javascript
const targets = document.querySelectorAll('img');

  function callback(entries, obs) {
    console.log(entries);

    if (!entries[0].isIntersecting) {
      return;
    }

    entries[0].target.classList.add('appear');
    obs.unobserve(entries[0].target);
  }

  const options = {
    threshold: 0.2,
  };

  const observer = new IntersectionObserver(callback, options);

  targets.forEach(target => {
    observer.observe(target);
  });
```
上のままだと全ての要素に対して影響を与えていない。

変更すると、、、
```Javascript
  const targets = document.querySelectorAll('img');

  function callback(entries, obs) {
    console.log(entries);

    entries.forEach(entry => {
      if (!entry.isIntersecting) {
        return;
      }
  
      entry.target.classList.add('appear');
      obs.unobserve(entry.target);
    });
  }

  const options = {
    threshold: 0.2,
  };

  const observer = new IntersectionObserver(callback, options);

  targets.forEach(target => {
    observer.observe(target);
  });
```
これで全てがふわっとくるようになる。
SalesforceのWeb-to-リードでサーバーにリクエストを通してから、Salesforce に登録する。

## Web-toリードとは
Salesforceにリードを登録するときに直接フォーム->Salesforceに登録できるものです。
フォームの作成もポチポチ設定すればできるので非常に便利ではあるものの、
フォームのバリデーションはフロントのみでバックエンドを通さないのでできなかったりするのでそのまま使うと少々不便だったりします。

## どうやったか
フォームの作成で生成されたパラメータを元に
バックエンドでGuzzleでリクエストしただけです。
これについて調べると、curlでの英語の記事しかなかったので、サクッと記事にしました。

```php5
use GuzzleHttp\Client;
...
...
.
class SalesforceWebToLeadService
{
    public function post(array $params)
    {
        // $params は key-valueでパラメータを作成してください　例: first_name => 'HOGE' など
        // oidは必ず入れる
        $params['oid'] = "個別の識別子";

        $options = [
            'http_errors' => true,
            'verify'      => false,
            'form_params' => $params,
            'headers' => [
                'Host' => "webto.salesforce.com",
            ]
        ];

        try {
            $client = new Client();
            $client->post("https://webto.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8", $options);
        } catch (\Exception $e) {
            \Log::error($e->getMessage());
        }
    }
}
```

こうすれば、フォーム->バックエンド->salesforceへデータを流せて、バックエンドのバリデーションやレコードを作成したり、いろいろしたうえでsalesforceへレコードを作成できます。
[JavaScript]名前付きexportとデフォルトexportの違い

## 内容

JavaScriptのモジュールエクスポートについて、名前付きexportとデフォルトexportの違い・使い分けがどっちだっけ？となることがあるためまとめます。

## 目次
- [名前付きexport](#名前付きexport)
- [デフォルトexport](#デフォルトexport)

## 名前付きexport・デフォルトexportの違いまとめ

|  | 名前付きexport | デフォルトexport |
|:-:|:-:|:-:|
| 書き方  | export const 変数名<br>export const 関数名  | export default function App() {}  |
| エクスポート数  |　制限なし　| モジュールごとに１つ |
| インポートの{}  | {}が必要  | {}が不要  |
| インポートする名前  | エクスポートする名前と合わせる<br>エイリアスを設定  | 任意の名前  |


## 名前付きexport

名前を付けて作成した変数や関数をエクスポート
```javascript:namedExport.js
const sampleVar  = 'Variable'
const sampleFunc = () => console.log('Function')
// 作成した変数や関数をexport
export {sampleVar, sampleFunc}

// 変数や関数の宣言と同時にエクスポートすることも可能
export const sampleVar  = 'Variable'
export const sampleFunc = () => console.log('Function')
```

`namedExport.js`からエクスポートされた変数や関数をインポートする
```javascript:namedImport.js
import { sampleVar, sampleFunc } from "./namedExport.js"

console.log(sampleVar)    // Variable
console.log(sampleFunc)   // sampleFunc() {}
console.log(sampleFunc()) // Function
```

### 名前付きexportとimportのエイリアス

`as`を使うことで、エイリアスを使用することが可能
```javascript:namedImport.js
import {
    sampleVar as myVar,
    sampleFunc as myFunc
} from "./namedExport.js"
```

名前付きエクスポートをオブジェクトとしてまとめてインポートすることも可能
```javascript:namedImport.js
import * as myModule from "./namedExport.js"

// 呼び出し
console.log(myModule.sampleVar)    // Variable
console.log(myModule.sampleFunc)   // sampleFunc() {}
console.log(myModule.sampleFunc()) // Function
```

## デフォルトexport
 - デフォルトエクスポートは、モジュールごとに１つだけエクスポートできる

```defaultExport.js
export default function App() {
    console.log('Hello!')
}
```

- デフォルトインポートの場合、`{}`は不要
- 名前付きエクスポートの場合、指定したモジュールから同じ変数名や関数名でインポートが必要だが、デフォルトエクスポートは任意の名前を付けられる
```javascript:defaultImport.js
// Appは任意の名前でOK
import App from "./namedExport.js"

console.log(App)    // App() {}
console.log(App())  // Hello!
```
【初心者向け】モジュール作成時に気をつける10のこと

# 始めに
アーキテクチャ根本技法について記載する。
尚、解説時には、以下の3つの形式に分けて解説する。
* what??
* why??
* how??

# アーキテクチャ根本技法
### what??
良いソフトウェア・アーキテクチャ構築のモジュール設計方針である。
以下の10個がある。

①抽象
②情報隠蔽
③パッケージ化
④関心の分離
⑤充足性・完全性・プリミティブ性
⑥ポリシーと実装の分離
⑦インターフェースの実装の分離
⑧参照の一点性
⑨分割統治

### why??
プログラマが蓄積された過去から導き出した優れた解決だから

### how??
根底技法をコードに適用する


# ①抽象
### what??
モジュールを区別する概念的な線引きを行うこと

抽象は以下の2つに分けることができる
* 捨象：枝葉を取り除き、対象物の本質を把握すること。
* 一般化：複数のものを共通点でグルーピングし、汎用的な概念にすること。

### why??
* 捨象：複雑さを下げ、集中すべき問題に集中できるため。
* 一般化：他の場面でも応用するため。

### how??
捨象：今着目している側面からの本質を捉える
一般化：複数の事柄をパターン化して応用する。

# ②カプセル化
### what??
モジュールの構成要素は、関連性のあるデータとロジックのみにすること。

### why??
* コードの可読性アップ。
* コードが変更しやすい。
* 再利用性が高まる。
* 複雑な問題に対処しやすい。

### how？？
モジュールに入れるのは、関連のある要素のみにする。


# ③情報隠蔽
### what??
モジュールの内容をクライアントから隠蔽すること。
クライアントからは必要最小限に公開された関数でしか操作できないようにする。

### why??
* コードの複雑性を下げるため
* クライアントの使い勝手を上げるため
* コードの変更の波及を最低限に

### how??

公開範囲は必要最小限にしてカプセル化し、情報を隠蔽する。

# ④パッケージ化
### what??
モジュールをさらに意味のある単位でグルーピングすること。

### why??
* コードの複雑性が下がる
* モジュールの管理度がアップ
* コードが変更しやすい
* 再利用しやすい

### how??
最初にグルーピングせず、モジュールが増えてきたらボトムアップ的にパッケージの設計を始めるようにする。

# ⑤関心の分離
### what??
モジュールを、ソフトウェアの機能や目的ごとに集めて、分離すること。

### why??
* 変更が容易
* 変更時の品質が安定
* 分業で並行して作業可能

### how??
モジュール作成時は、関心ごとに作成する。
モジュールが異なる前提ごとに異なる役割を果たしている場合は、役割ごとに分割する。

# ⑥充足性・完全性・プリミティブ性
### what??
モジュールは以下の3つの要件を満たすべき。
* 充足：モジュールが表現しようとしている抽象が、それを伝えるために十分か
* 完全性：モジュールが表現しようとしている抽象画、全ての特徴を備えているか
* プリミティブ性：モジュールが表現しようとしている抽象が、全て純粋であるかどうか。

### why??
* 使用者に意図を伝えるため
* 使用者が本質を把握するため
* 使用者が安心して活用するため
* 使用者が使用用途を明確に理解するため

### how??
モジュール作成時に、どのような抽象を表現しているか明確にしながら作成し、余分なものは入れないようにする。

# ⑦ポリシーと実装の分離
### what??
1つのモジュールで以下の2つについて扱わない。
* ポリシーモジュール：ソフトウェアの前提に依存し、ビジネスロジックや、その他のモジュールに対する引数の選択を行う部分
* 実装モジュール：ソフトウェアの前提に依存しない、独立したロジック部分

### why??
他のソフトウェアで再利用可能な実装モジュールが、ポリシーモジュールと混ぜると再利用できなくなるため

### how??
モジュール作成時、「ポリシー」と「実装」を意識して設計、別モジュールにて実装を行う。
分離不可能な場合、モジュール内で、どちらがどちらか明確にしておく。

# ⑧インターフェースと実装の分離
### what??
モジュールは以下の２つの分離したパートで構成する。
* インターフェース：モジュールが持つ機能を定義し、モジュールの使用方法を定める部分であり、クライアントからアクセス可能
* 実装：モジュールが持つ機能を実現し値得るコード部分であり、クライアントからアクセスは不可能

### why??
* 使用者がモジュールを容易に使用できるようにするため。
* クライアントへの影響を考えることなく、実装の修正を行うため。

### how??
コードを設計する際は、インターフェースを用いる。
モジュール同士の呼び出しにはインターフェースが使用されるようにする。

# ⑨参照の一点性
### what??
モジュールの要素について宣言され定義されるのは一回限りにする。

### why??
* 副作用のないプログラミングを可能にするため。
* コードの可読性を上げるため

### how??
変数に対して、値の再代入を行わない「単一代入」を行う

# ⑩分割統治
### what??
そのままでは解決することの難しい問題は小さく分割する。

### why??
問題を単純化し、効率性を上げるため。

### how??
問題を分割してから解決する。
* ソフトウェア全体を設計するときは、独立して設計できる部分に分割してから取り組む
* モジュールを設計するときは、「責任」・「債務」の観点からモジュールを分割
* アルゴリズムを設計するときは、ボトムアップで分割してから問題解決できないか検討
* 大量なデータを処理するときは、計算を小さい単位の分割して、分散環境で並行して実行できないか検討。
Ubuntuのバージョンによってtopコマンドのデフォルト単位サイズが違う

## はじめに
今回、Ubuntu18.04に作成したメモリ量確認シェルをUbuntu20.04で使用すると失敗するということがあった。
確認するとUbuntu18.04ではtopコマンドで表示されるはずの単位がKiBだったようだが、Ubuntu20.04ではMiB表示となっていた。
![topcmd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960583/6aa1469a-fb54-e53a-f68f-7c207a6541e7.png)

## 解決策
topコマンドを実行したのち「SHEFT + e」で単位をKiBまで変更し、「SHIFT + W」で変更を保存(~/.toprc)することで解決した。

## 原因調査
そもそも何の影響でtopコマンドのデフォルトが変わったのか。

Ubuntuのマニュアルを確認すると
https://manpages.ubuntu.com/manpages/xenial/man1/top.1.html

>  Regardless  of  which  of these forms memory may take, all are managed as pages (typically
       4096 bytes) but expressed by default in top as KiB (kibibyte).  The memory discussed under
       topic  `2c. MEMORY Usage' deals with physical memory and the swap file for the system as a
       whole.  The memory reviewed in topic `3. FIELDS /  Columns  Display'  embraces  all  three
       memory types, but for individual processes.

と記載があり、デフォルトはKiBだと書いてある。
また、各Ubuntuのバージョンでのprocpsのバージョンは以下となっている。
18.04　procps_3.3.12-3ubuntu1_amd64 
20.04　procps_3.3.16-1ubuntu2_amd64 

3.3.12～3.3.16のバージョンのどこかで変更が入っているのではないだろうか。。。
(この辺で調査が力尽きた。。)


### 追記
どうやらkernelバージョンによって初期表示が違うとの情報を頂いた。
kernelバージョンが4.18以上はMiB、4.18未満であればKiBという表示になるとのこと

以下の投稿を確認すると
https://askubuntu.com/questions/517136/list-of-ubuntu-versions-with-corresponding-linux-kernel-version

     20.04   Focal Fossa       5.4
     19.10   Eoan Ermine       5.3
     19.04   Disco Dingo       5.0
     18.10   Cosmic Cuttlefish 4.18
     18.04   Bionic Beaver     4.15

ということで18.04でKiB表示となっていたわけですね。
【AWS】CloudFront経由でS3のファイル更新が反映されない場合の対処法（一時的なキャッシュ無効化）

# AWSの機能はどんどんバージョンアップされる
個人請負で運営しているシステムにて、久しぶりに静的コンテンツ（CSS）を含んだリリースが発生。
CloudFront経由でS3に置いたコンテンツを参照する場合、キャッシュによってリリースしてもすぐには反映されないのは既知の事象。
なので、ブラウザですぐに確認するためにキャッシュを再作成することにしました。
1年以上振りに行う作業・・・・・・あれ？　まったく画面が違う！！
いつも行っていたキャッシュ再作成の手順が行えなくなりました。。。

AWSの機能がどんどんバージョンアップされるのは良いことですが今までの手順がゴミになるのはやっかいですね。

# キャッシュ設定の確認
まずは新しくなったCloudFrontのキャッシュ設定を確認します。

CloudFront > ディストリビューションを選択 > ビヘイビアタブ > 対象を選択 > 編集
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1203022/3c4c47a5-9344-b053-9bc7-0bcf3c6da264.png)

キャッシュキーとオリジンクエストキャッシュポリシーを確認します。
キャッシュポリシーが「CachingOptimized」になっていました。キャッシュを利用している状態です。
![1.5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1203022/b4c6354f-5f95-4db2-cec6-1180ad10417e.png)
※ラジオボタンが「Legacy cache settings」を選択されている場合もキャッシュを利用している状態です。
「Legacy cache settings」はバージョンアップされる前の設定で、キャッシュキーとオリジンリクエストの一部しか制御できない設定です。

# キャッシュの無効化
「Cache policy and origin request policy (recommended)」の「CachingDisabled」を選択するとキャッシュを使用しない状態になります。
そのまま「変更を保存」ボタンを押下し、少し待てばS3のコンテンツが反映されます。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1203022/6b6204ca-c380-569d-98cd-3bba2e9c5bbd.png)

# 確認後
コンテンツが反映されていることを確認したら、キャッシュの設定を戻すことをおすすめします。
特にこだわりがなければ「CachingOptimized」にしておけば良いと思います。

https://advancedweb.hu/cloudfront-cache-problems-and-how-to-solve-them/
【Linux】セキュアなサーバ構築シリーズ①

## はじめに

既に4台の仮想マシーンにネットワーク設定済みの状態で、これから次のサーバーを構築していく。

①DNSサーバー
②WEBサーバー http/https 認証局(CA)
③メールサーバー SMTP/POP・IMAP
④ファイル共有サーバ
  →Samba(Win-Linux)
  →NFS（Linux-Linux）
⑤FTPサーバー
⑥SSHサーバー


![FhTK9nNagAEacBr.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935967/e9b74bde-d048-2b53-7e99-d750dc2aa53c.jpeg)

●ドメイン：yuzo.study.local(172.15.1.0/24)
●4台の仮想マシーンにネットワーク設定済み（IPv4&IPv6）
●各々のSVの`/etc/resolv.conf`内のネームサーバ指定は172.15.1.202になっている。
しかしDNSサーバをまだ構築してないので名前解決できない状態。

```
[root@sv ~]# cat /etc/resolv.conf 
# Generated by NetworkManager
search d000.mgt.local
nameserver 172.15.1.202
nameserver 2001::ca

[root@sv ~]# ping 8.8.8.8 -c 1
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=55 time=106 ms
~
1 packets transmitted, 1 received, 0% packet loss, time 0ms

[root@sv ~]# ping www.google.com
ping: www.google.com: 名前またはサービスが不明で
```

## まず DNSサーバーから構築する

ドメインを取得したら、必ずそのドメインを管理するDNSサーバーが必要。
そうでないと、別のドメイン（NW）から問い合わせがあった場合や同じドメインから
問い合わせがあった場合に名前解決できなくなってしまう。

一番最初にDNSサーバを構築する理由は、WEBサーバー・メールサーバ構築後、クライアントが
動作確認する際に、ドメイン利用して動作確認できるようにするため。


## サーバー構築手順
それぞれのサーバー構築手順で利用するパッケージ名・設定ファイルは違えど、
基本の流れはどれも同じなので、今回はDNSサーバーを一例に構築手順を記述する。

【サーバー構築手順】

①最新PKGのダウンロード・インストール
```
dnf install bind -y
```
②設定ファイルの編集 `/etc/named.conf`
(DNS: zoneファイル)

③デーモンの（再）起動
```
systemctl restart/start named.service
```

④FWの許可

```
firewall-cmd --add-service=dns --permanent --zone=public

systemctl restart firewalled.service
```

⑤ 動作確認


今日はここまで。
次回から早速、DNSサーバー構築作業にはいる。
Intersection Observer API(監視をやめる)


スクロールするたびに、監視してしまい、PCに負荷がかかる。
監視をやめるためには、、
```Javascript
{
  const target = document.querySelector('img');

  function callback(entries, obs) {
    console.log(entries[0]);

    if (!entries[0].isIntersecting) {
      return;
    }

    entries[0].target.classList.add('appear');
    obs.unobserve(entries[0].target);
  }

  const options = {
    threshold: 0.2,
  };

  const observer = new IntersectionObserver(callback, options);

  observer.observe(target);
```

・引数をもう一つ渡す。
・unobserve()を使い止める。