OmniAICreator/Qiita-1.07M huggingface dataset:
Leetcode easy: 1480. Running Sum of 1d Array(JavaScript)

[Leetcode](https://leetcode.com/)を始めたので記録しています。

## やった問題
1480.Running Sum of 1d Array
>Given an array nums. We define a running sum of an array as runningSum[i] = sum(nums[0]…nums[i]).
Return the running sum of nums.

Example:

>Input: nums = [1,2,3,4]
Output: [1,3,6,10]
Explanation: Running sum is obtained as follows: [1, 1+2, 1+2+3, 1+2+3+4].

https://leetcode.com/problems/running-sum-of-1d-array/
## 処理の流れをざっくり考える
- 配列を初期化して乗算の結果を追加していく
- 前の計算結果を使うようにする

## 最初に書いたコード
```javascript
/**
 * @param {number[]} nums
 * @return {number[]}
 */
var runningSum = function(nums) {
    let total_so_far = 0;
    let sum_nums = [];
    for (let i=0; i<nums.length; i++){
        total_so_far += nums[i];
        sum_nums.push(total_so_far);
    }
    return sum_nums;
};
```
結果
>Runtime: 75 ms, faster than 76.20% of JavaScript online submissions for Running Sum of 1d Array.
Memory Usage: 42.3 MB, less than 72.38% of JavaScript online submissions for Running Sum of 1d Array.

## 調べたこと
Complexityについてよくわかっていないので調べた。
今回はTimeComplexityもSpaceComplexityもとてもシンプルだけど・・・

https://qiita.com/cotrpepe/items/1f4c38cc9d3e3a5f5e9c

## 答えを見て改善したこと
ビデオを見て書き換えてみる。配列を上書きする方法。
```javascript
/**
 * @param {number[]} nums
 * @return {number[]}
 */
var runningSum = function(nums) {
    for (let i=1; i<nums.length; i++){
        nums[i] += nums[i-1];
    }
    return nums;
};
```
complexityは変わらないけどとてもシンプルにかけた。
>Runtime: 77 ms, faster than 72.91% of JavaScript online submissions for Running Sum of 1d Array.
Memory Usage: 42.6 MB, less than 37.54% of JavaScript online submissions for Running Sum of 1d Array.
【Rails】【Rspec】トランザクションのロールバックをテストする


## はじめに
未経験からエンジニアに転職して、3ヶ月経つエンジニアです。

![アイコンバー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916052/83c7015b-1f42-605a-ff4c-c500bcad1656.jpeg)

今回は業務で経験した「トランザクションのロールバックをテストする」方法について書きます。

## トランザクションとは
>ブロック内のすべての処理が正常に行われた場合に保存
エラーが発生した場合は、ロードバック

https://railsdoc.com/page/transaction

これだけだとわかりませんよね、、
↓の記事などが参考になるかもしれません！

https://qiita.com/tomokiyao/items/8697b523a0a5b9cf0bec

## テストしていく
トランザクションを使っているということは、重要な処理をしている可能性が高いです。
つまり、コードにバグが含まれていると取り返しのつかないことになり得る危険性が高いともいえます。
テストを堅牢にしたくなるのが自然な流れですね。

#### 結論
~~~ruby
describe 'transfer' do
  # 必要なデータを用意する
  let!(:user) { create(:user) }
  create(:money, ...)
  ...

  it 'should rollback if raise Error' do
    allow(Money).to receive(:update_statuses!).and_raise(StandardError)
    expect { XXXXX }.not_to change(Money, :count)
  end  
end
~~~
**トランザクション内の処理をスタブして、例外を吐くようにする。例外を検知したトランザクションはロールバックをする。**
　**→　レコードの数に変化がないか検証する（テストする）**

~~~ruby
class Money < ApplicationRecord

enum status: [:pending, :completed]

 def transfer
   ... # お金を振り込む処理
 end

def update_statuses!
 ... # 振り込みが完了したらステータスを更新する
end
~~~

上記のような、
お金を振り込む
→ 振り込みが完了したらステータスを更新する
というプログラムがあるとします。
下記のような感じでトランザクションで囲っているとします。
~~~ruby
ActiveRecord::Base.transaction do
  Money.transfer
  Money.update_statuses!
end
~~~

トランザクション内でなんらかの理由でエラーが起きた時に、
ちゃんとロールバックしているかテストしていきます。
~~~ruby
describe 'transfer' do
  # 必要なデータを用意する
  let!(:user) { create(:user) }
  create(:money, ...)
  ...

  it 'should rollback if raise Error' do
    allow(Money).to receive(:update_statuses!).and_raise(StandardError)
    expect { XXXXX }.not_to change(Money, :count)
  end  
end
~~~

ポイントはスタブするという点です。
~~~ruby
allow(Money).to receive(:update_statuses!).and_raise(StandardError)
~~~
スタブとは、「防ぐ」「止める」というようなイメージで考えてみてください。
ここではトランザクション内の２つ目の処理でスタブしています。
.and_raise(StandardError) することで、例外を吐くようにしました。
これで、ロールバックが発生するので、あとはレコードが増えていないことを検証すればOKです。
~~~ruby
expect { XXXXX }.not_to change(Money, :count)
~~~

### 参考

https://techracho.bpsinc.jp/hachi8833/2018_04_25/55467

http://strix01.blogspot.com/2012/07/rails-rspecdb.html
Salesfroce入力規則を作成しよう～特定の選択リスト値の場合テキスト項目に値が入る設定

Salesforceで
・特定の選択リストの時（例：AとBの場合）に特定のテキスト項目の入力を徹底してほしい。
という場合があります。
今回はそんな時に使える入力規則を紹介します


前提：
・選択リストのAPI参照名はtest01
・テキスト型のAPI参照名はtest02


入力規則数式：

OR( AND( ISPICKVAL( test01__c,"A"), ISBLANK( test02__c ) ) , AND( ISPICKVAL( test01__c,"B"), ISBLANK( test02__c ) ) )
RLoginで手軽にポートフォワード

RLoginを使ったポートフォワードの設定について書いています。

### 読者の想定
- 開発環境を利用するために多段のポートフォワード接続が必要
- TeraTermなどで毎回接続するのが大変
- ポートフォワードのことをあまりよくわかっていない

### 概要
- 公式ページ
https://kmiya-culti.github.io/RLogin/
- GitHub(公式ページに記載あり)
https://github.com/kmiya-culti/RLogin/releases/

RLoginはTeraTermと同じようなターミナルツールです。
簡単に複数の接続先がある場合にタブで分類したりできて、設定ファイルをエクスポートすることで他の人にも共有できるので便利です。
![](https://i.imgur.com/dmxp2av.png)

### ポートフォワードの設定

RLoginは簡単にポートフォワードの設定ができます
ポートフォワードの設定は、「サーバー」＞「プロトコル」＞「ポートフォワード」でおこないます。
![](https://i.imgur.com/O8C7iiX.png)

設定は次のようにおこないます。
- Listened
    - Host Name : 自端末のためlocalhost
    - Port : 使用してない適当なポートを指定します
- Connect
    - Host Name : ポートフォワード先のサーバーIPアドレス
    - Port : ポートフォワード先のポート番号
![](https://i.imgur.com/t0JWC01.png)

ポートフォワード設定をした状態で接続することでこのように自端末からサービスにアクセスできます
![](https://i.imgur.com/eR94tXl.png)

### ファイル転送も簡単に
ポートフォワード先とのファイル転送は、通常scpコマンドでコツコツ転送する必要がありますが、
自端末とポートフォワード先を直接繋いでいるように転送することができます。

### 鍵管理もわかりやすく
鍵認証のサーバーの場合、多段で接続しているとそれぞれのサーバーに鍵を配置する必要がありますが自端末の鍵を指定して認証するため、それぞれのサーバーに鍵を配置する必要がありません
202207版環境構築メモ

Mac が壊れてしまい、新しい PC で環境を再構築した時にはまったポイントなどの自分用メモ
基本的には読ませて頂いた記事などを記載する

# 前提

使っている環境やソフトウェアなどを記載
なお、ソフトウェアは AppStore や `homebrew` を使ってインストール

+ macOS Monterey
+ Alfred
+ oh-my-zsh
+ iTerm2
+ peco

# Alfred の移行

[Alfredの環境設定の同期・バックアップの方法](https://webrandum.net/alfred-syncing/)
[Syncing Your Alfred Settings Between Macs](https://www.alfredapp.com/help/advanced/sync/)

この辺りを読んでバックアップファイルを作成し、新しい PC で読み込ませることで成功

# AWS CLI v2 で Pager 無効化

[AWS CLI v2 でページ分割（less）を無効化できることを最近知った件](https://dev.classmethod.jp/articles/aws-cli-v2-disable-pagination/)

[How to use the cli_pager setting](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-pagination.html)

基本的に不要であるため、上記にあるように `~/.aws/config` に以下を追加

```
[default]
cli_pager=
```

# tmux を使っている時だけ peco が panic になる

[peco on tmux が動かなくなったので、調べてみた](https://zenn.dev/sho7650/articles/8b1b4553eb0129)

[Installing tmux-256color for macOS](https://gist.github.com/bbqtd/a4ac060d6f6b9ea6fe3aabe735aa9d95)

上記にあるように `~/.tmux.conf` に以下を追加して解消

```
set-option default-terminal "screen-256color"
```

# zshの起動と同時にtmuxも起動

[zshの起動と同時にtmuxも起動してほしい](https://saitodev.co/article/zsh%E3%81%AE%E8%B5%B7%E5%8B%95%E3%81%A8%E5%90%8C%E6%99%82%E3%81%ABtmux%E3%82%82%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BB%E3%81%97%E3%81%84/)

`~/.zshrc` に以下を追加

```
[[ -z "$TMUX" && ! -z "$PS1" ]] && tmux
```
Google Apps Scriptで、SlackにGoogle Formの回答を匿名postする

[Google Apps Scriptで、Slackに(またはLINE Botにも)ﾈｺﾁｬﾝをpostする - Qiita](https://qiita.com/e99h2121/items/56b9d7a9db88e0b4744a) と合わせて、ごくごく簡単にSlackとの連携をさせる作り方メモ。


## 作り方
### Google Form

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/1f2151b0-61e3-68d1-9f82-7efd2f71a78f.png)

ひとまずシンプルにつくります。

### Slack投稿

[ワークフロービルダーからWebhookを用いる](https://qiita.com/e99h2121/items/56b9d7a9db88e0b4744a#n%E6%99%82%E9%96%93%E3%81%8A%E3%81%8D%E3%81%ABslack%E3%81%AE%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E3%81%AB%EF%BE%88%EF%BD%BA%EF%BE%81%EF%BD%AC%EF%BE%9Dpost)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/24ccf316-5f0d-7786-a42a-8660eef72e75.png" width=50%>

変数を設定しておきます。ここでは `text`。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/0c000d81-c6db-3f7b-4b7a-e525d7d52c72.png" width=50%>

任意のチャンネルに送信することにします。
メッセージには先に設定しておいた変数、`text` を利用します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/66bfa129-aefb-00ae-cc0c-7a3e3e72fc9c.png" width=50%>

ワークフローを保存するとURLが表示されます。GAS側にて使います。

### Google Apps Script

```js
function onFormSubmit(event) {
    var message = "";
    var items = event.response.getItemResponses();
    for (var i = 0; i < items.length; i++) {
      //message += items[i].getItem().getTitle() + ": " + items[i].getResponse() + "\n";
      message += items[i].getResponse();
    }

    UrlFetchApp.fetch(
    // Webhook URLを入れる
    "https://hooks.slack.com/workflows/xxxxx", // ここ
    {
        "method" : "POST",
        "contentType" : "application/json",
        "payload" : JSON.stringify({"message": message})
    }
    );
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/264ff6e4-1aad-41d5-01ee-7e3f193573d8.png)

### トリガー設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/144280b9-3366-4490-3fd4-71a38e0691e4.png)


## 完成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/3d5f9908-ccbc-ca24-beb6-db499b6867b5.png)

何故これをおもいついたかというと社内Peing（匿名投稿） https://peing.net/ja/ が作れるよなあと思ったからでした。

以上です～
2022春のネットワークスペシャリスト試験の結果とメモ

# 結果
2022/6/25 合格！
| 試験 | 得点 |
| --- | --- |
| 午前Ⅰ|免除|
| 午前Ⅱ|60|
| 午後Ⅰ|60|
| 午後Ⅱ|62|

## VPN
VPNにより、暗号化、なりすまし、改ざんを防げる。

- IP-VPN
NTTなどの通信キャリアが提供する。専用線。閉域IP。MPLSがIPパケットでラベルを付加する。ラベルで顧客を識別する。
- インターネットVPN
インターネット上に構築する。

1. IPsec（レイヤー3）
IPパケットを以下プロトコルでカプセル化
する。
使用するプロトコル：ESP、AH
ESP(Encapsulating Security Payload):暗号化、認証
AH(Authentication Header)：認証のみ
ESPにはポート番号がないため、NATトラバーサルが必要。UDPでカプセル化する。
2. SSL-VPN
暗号化にTLSを使用する。レイヤー5のため、httpsなどで使用され、ブラウザでの通信が可能。

■セッション終端
1. L7ロードバランサ
HTTP情報を取得するために、LBでTCPコネクションが終端する
クライアントとLB
LBとバックエンドサーバ
2. L4ロードバランサ
セッション終端しない
3. TSLターミネイト
セッション終端する

・トランクポート
複数のVLANの通信が可能なポート
・ARP
IPアドレスからMACアドレスを取得する。
自分と同一セグメントにブロードキャストする。
レスポンスはユニキャストで返ってくる。
・RARP
MACアドレスからIPアドレスを取得する。
自分のIPアドレスがわからない場合、MACアドレスをブロードキャストしルーターなどに教えてもらう。
・GARP
自分のIPアドレスの重複を検知するためのプロトコル。ブロードキャストし、パケットのIPが同じならレスポンスが帰ってくる。
・MACアドレステーブル
MACアドレスとポートの対応表
スイッチ、ルーターが持つ
・ARPテーブル
IPアドレスとMACアドレスの対応表
PC、ルーターが持つ
・スタック接続
複数の機器を論理的に一つにする接続

サーバを追加
→DNSにAレコードを追加する（メールサーバならMXレコードも追加する）
→FWに通信許可を追加する
→LBに振り分け先を追加する（NAPTテーブルには通信パケットが飛んできたときに追加される）

■NAPT,NATしない
PC送信パケット
| 送信元MACアドレス| 宛先MACアドレス| 送信元IPアドレス| 宛先IPアドレス|
| --- |---|---|---|
|MACpc|MACrt|IPpc|IPsv|

ルーター通過後
| 送信元MACアドレス| 宛先MACアドレス| 送信元IPアドレス| 宛先IPアドレス|
| --- |---|---|---|
|MACrt|MACsv|IPpc|IPsv|


■NAPT,NATする
PC送信パケット
| 送信元MACアドレス| 宛先MACアドレス| 送信元IPアドレス| 宛先IPアドレス|
| --- |---|---|---|
|MACpc|MACrt|IPpc|IPsv|

ルーター通過後
| 送信元MACアドレス| 宛先MACアドレス| 送信元IPアドレス| 宛先IPアドレス|
| --- |---|---|---|
|MACrt|MACsv|IPrt|IPsv|

■MACアドレス
イーサネットパケットの宛先MACアドレスと送信元MACアドレスはネットワークを超えるたびに変化する

■午前2対策
- OFDM
　直交周波数分割多重の
- IGMP
　Internet Group Management Protocol：IPネットワークでマルチキャスト通信を行うため、ルータとホストが使用するプロトコル。ホストはマルチキャストグループへの参加や離脱を通知するために、IGMPメッセージを送信する。ルータはホストの存否を定期的に（デフォルト６０秒）チェックするために使用する。
- CSMA
　送信する前にキャリア信号の有無を検出する仕組みを採用。キャリア信号を検出したら送信を控えることで、衝突を未然に防ぐことができる。データリンク層の技術。
- SDN　OpenFlow
　ネットワーク機器の機能をソフトウェアで定義。
　１．ネットワーク機器は、パケット受信を契機に、コントローラからの指示を仰ぐために当該パケットをコントローラに転送する。その後、コントローラは当該パケットに応じたコマンドを送り、経路制御の動作をネットワーク機器に指示する。
　２．通信に先立ち、コントローラは、ネットワーク機器が行う経路制御の動作を登録しておく。
- Websokcekt
　webコンピューティングにおける双方向のプッシュ配信を実現する技術。
　HTTP通信（GETメソッド）を用いて、クライアントがサーバにWebSocket通信の開始を要求する。サーバがこの通信を受理した旨を応答し、Websocketによる双方向通信が行われる仕組み。
- L2TP
　トンネリングプロトコル。UDPで伝送される。PPPの延長とした認証ネットワーキングで使用される。
- GRE
  新しいIPヘッダとＧＲＥヘッダでトンネリングする（送信元ＩＰアドレスと宛先ＩＰアドレスがトンネリングの始点と終点になる）。ルーティングプロトコルのトンネリングで主に使用される。GRE over IPSecなど
- TLS

### ルーティングプロトコル
- RIP
アルゴリズムはディスタンスパスベクタ法。
- OSPF
リンクステート型。LSAを交換してLSDBを更新する。
アルゴリズムはダイクストラ法
- BGP
### 無線LAN

### スパニングツリー
bpdu
ループ防止
再構築するのに時間がかかる
再構築時にMACアドレステーブルを更新する
DB設計 テーブル定義書 テンプレート

## はじめに
初学者用のテーブル定義書のテンプレートです。
自分が初めて設計書を作成するときに、良いテンプレートがあまりなかったため共有します。
個人での開発やスクールでの課題作成時に参考にしてください。

## 参考文献
このテーブル定義書のテンプレートは、下記のリンクの「データベース研究室」のHPに載っている表をモデルに作成されています。
気になる方はチェックしてください。

https://fulfillment-c.com/database/table-definition-document/

## 設計書の構成

① 表紙
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1270216/2b55af38-4809-3e23-4085-7c55565ffa46.png)

② 項目・概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1270216/311f8629-e38d-db90-5048-9e21798bd0a7.png)

| 項目 | 説明 |
|:-:|:-:|
| 物理名  | データベース上での名称   |
| 論理名  | 人間によって識別しやすい名称  |

③ 各テーブル詳細
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1270216/9f771f95-99e0-8961-c636-fcb1e2f4924f.png)



※PK（主キー）・FK(外部キー)・NOT NULLは〇を記入欄に入れます。


上記のようになっています。

## テンプレート
下記のリンクからサンプルをみることが出来ます。（ダウンロード可）

https://docs.google.com/spreadsheets/d/1BV33M50ALMXI2M1TsOkUI8WuQ8tHxuZkcXGOXlFOZrU/edit?usp=sharing

## 最後に
今回紹介したテーブル定義書よりも良いものがありましたら、コメント欄で共有お願いします。
2022/7/10主にITとかセキュリティの記事

アジアのサイバー攻撃、4分の3が外部指摘で発見(7/8)
https://www.nikkei.com/article/DGXZQOUC01APS0R00C22A6000000/

読売IDのセキュリティーを強化しました(7/8)
https://www.yomiuri.co.jp/topics/20220708-SYT8T3152130/

エディオンに不正アクセス、顧客情報流出痕跡確認できず(7/8)
https://www.nikkei.com/article/DGXZQOUF0885L0Y2A700C2000000/

システムを点検 サイバー攻撃対策を警察官が企業に指導(7/7)
https://www3.nhk.or.jp/tokai-news/20220707/3000023537.html

蘭マーストリヒト大学、ランサムウェア攻撃の身代金を一部奪還--暗号資産の差し押さえで(7/8)
https://japan.cnet.com/article/35190192/

ヘルスケア分野の組織を狙うランサムウェア「Maui」、CISAらが警告(7/8)
https://japan.zdnet.com/article/35190150/

サイバー攻撃対策強化を　全国の病院で頻発、県警「被害防ぐ」(7/8)
https://www.chunichi.co.jp/article/503993

OpenSSLに複数の脆弱性、アップデートを呼びかけ(7/8)
https://scan.netsecurity.ne.jp/article/2022/07/08/47864.html

認証済みTwitterアカウント悪用したフィッシング詐欺に注意(7/8)
https://news.mynavi.jp/techplus/article/20220708-2392564/

ウクライナ侵攻で露呈--衛星など狙うサイバー攻撃をなぜ警戒すべきなのか(7/8)
https://japan.cnet.com/article/35190172/

Discordユーザーを狙った招待詐欺に注意(7/8)
https://news.mynavi.jp/techplus/article/20220708-2392550/

ダウンロードしたVBAマクロ入りファイル、デフォルト無効化が取り消し。MicrosoftがOfficeの仕様を再度変更(7/8)
https://pc.watch.impress.co.jp/docs/news/1423419.html

成績優秀者は防衛省サイトに名前掲載、サイバーコンテスト開催(8/21開催予定)
https://scan.netsecurity.ne.jp/article/2022/07/08/47867.html

エコシステム　サイバーセキュリティ情報局(7/8)
https://eset-info.canon-its.jp/malware_info/term/detail/00174.html

Google WorkspaceでMicrosoft Officeのファイルを直接編集する(7/8)
https://news.mynavi.jp/techplus/article/google_workspace-38/

米財務省、暗号資産に対する国際的連携のフレームワークを発表(7/8)
https://www.coindeskjapan.com/154165/

シスコに緊急の脆弱性、ただちにアップデートを(7/8)
https://news.mynavi.jp/techplus/article/20220708-2393716/

オープンソースアプリの販売を禁止？ Microsoft Storeのポリシー改定が物議を醸す(7/8)
https://forest.watch.impress.co.jp/docs/serial/yajiuma/1423240.html

ワンクリック詐欺に注意、アダルトサイトの登録画面が出ても払わない-IPA(7/8)
https://news.mynavi.jp/techplus/article/20220708-2392432/

FacebookとInstagram、欧州でサービス停止に直面(7/8)
https://news.mynavi.jp/techplus/article/20220708-2394049/

「盛った」営業トークはリスク　マカフィー敗訴の教訓(7/8)
https://www.nikkei.com/article/DGXZQOUC2983A0Z20C22A6000000/

中国１０億人情報、販売打診　闇サイト、専門家が分析　別に９千万人、史上最悪か(7/8)
https://www.sankei.com/article/20220708-3AM6P5GHUJOLHMS3SPHDI5YXTU/?ownedutm_source=owned%20site&ownedutm_medium=referral&ownedutm_campaign=ranking&ownedutm_content=%E4%B8%AD%E5%9B%BD%EF%BC%91%EF%BC%90%E5%84%84%E4%BA%BA%E6%83%85%E5%A0%B1%E3%80%81%E8%B2%A9%E5%A3%B2%E6%89%93%E8%A8%BA%20%E9%97%87%E3%82%B5%E3%82%A4%E3%83%88%E3%80%81%E5%B0%82%E9%96%80%E5%AE%B6%E3%81%8C%E5%88%86%E6%9E%90%20%E5%88%A5%E3%81%AB%EF%BC%99%E5%8D%83%E4%B8%87%E4%BA%BA%E3%80%81%E5%8F%B2%E4%B8%8A%E6%9C%80%E6%82%AA%E3%81%8B

害を与えるリンクとその否認方法についての完全ガイド(7/8)
https://www.seojapan.com/blog/toxic-links-disavows-seo-383324

301リダイレクトとは？SEOへの影響と転送の書き方・設定後の留意点(7/9)
https://lucy.ne.jp/bazubu/301redirect-seo-41094.html

Chromeブラウザ、指紋認証でのパスワード管理に対応〜Macでも利用可能(7/8)
https://iphone-mania.jp/news-468273/

Azureデータセンターでリソース不足発生　一部で新規顧客受け入れ停止とも(7/8)
https://www.zaikei.co.jp/article/20220708/680180.html

ソラナ上のDeFiプロトコル「Crema Finance」、盗まれた仮想通貨12億円相当を回収(7/8)
https://coinpost.jp/?p=366152

「秀丸エディタ」v9.16が正式公開 ~「秀丸スペルチェックアドイン」を標準搭載／コマンドの拡充や改善も(7/8)
https://gunosy.com/articles/eNwr7
【C++】基礎を学ぶ➉～for文～

# `for`文
繰り返し処理を行うための構文

## `for`文の使い方
```cpp
for (初期化; 条件式; 更新){
  // 繰り返す処理
}
```
### N回繰り返すときの`for`文
```cpp
for (int i = 0; i < N; i++) {
  // 処理
}
```
### break
ループを途中で抜けられる
### continue
後の処理を飛ばして次のループへ行ける

## `for`文を使ったプログラム
```cpp
#include <iostream>

using namespace std;

int main(){
  for (int i = 0; i < 15; i++) {
    if (i % 2 ==0) {
      cout << i << "は偶数" << endl;
    } 
    else {
      cout << i << "は奇数" << endl;
      // 奇数の場合は次のループに行く
      continue;
    }

    cout << i << " / 2 = " << i / 2 << endl;
    
    if (i >= 6) {
      // iが6以上になったときループから抜ける
      cout << "iは6以上です" << endl;
      break;
    }
  }
	return 0;
}
```
```
0は偶数
0 / 2 = 0
1は奇数
2は偶数
2 / 2 = 1
3は奇数
4は偶数
4 / 2 = 2
5は奇数
6は偶数
6 / 2 = 3
iは6以上です
```

## 次の記事
[【C++】基礎を学ぶ⑪～while文～](https://qiita.com/drafts/e526299c73ef84adf844/edit)
【Jest】commit時にJestを実行する【Lefthook】

## パッケージのインストール
以下のコマンドを実行して`Lefthook`をインストールします。
```:ターミナル
$ yarn add -D lefthook
```

## Lefthookの設定
Lefthookの設定をします。
`lefthook.yml`を作成し、以下のように記述します。
```lefthook.yml
pre-commit:
  parallel: true
  commands:
    tests:
      files: git diff --name-only @{push}
      glob: "*.{js,ts, jsx, tsx}"
      run: jest --findRelatedTests {files}
```

## 動作確認
以下のコマンドを実行し、正常に動作するか確認します。
```:ターミナル
＄ npx lefthook install && npx lefthook run pre-commit
```
【C++】基礎を学ぶ⑨～switch文～

# `switch`文
**条件分岐**を書くときに使う
3つ以上に条件分岐させたいときに使う

## `switch`の使い方
```cpp
switch (条件) {
  case 値1 :
    処理1 // 条件が値1と一致したときの処理
    break;
  case 値2 :
    処理2 // 条件が値2と一致したときの処理
    break;
  default:
    処理3 // 条件がどのcaseの値とも一致しないときの処理
    break;
}
```
### 実際のプログラム
```cpp
#include <iostream>

using namespace std;

int main(){
	int num = 2;

	switch (num) {
		case 1:
			cout << "1つめ";
			break;
		case 2:
			cout << "2つめ";
			break;
		default:
			cout << "3つめ";
			break;
	}
	return 0;
}
```
```
2つめ
```
## 次の記事
[【C++】基礎を学ぶ➉～for文～](https://qiita.com/rapirapi/items/37cfec0dd8b3392d7bfe)
【C++】基礎を学ぶ⑧～if文～

# `if`文
**分岐処理**を行うプログラムである
**分岐処理**とは、条件判定を行いその結果によって異なる処理を実行すること
**条件式**は真(`true`)と偽(`false`)のどちらかになる
### `if`文の使い方
```cpp
if (条件式) {
  処理; // 条件式が真の場合に実行する処理
}
```

## 条件式について
条件式は**比較演算子**と**論理演算子**で書く

## 比較演算子
左右の値を比較して、結果を真偽値で返す

| 構文   | 意味           | 
| ------ | -------------- | 
| x == y | 等価           | 
| x != y | 非等価         | 
| x > y  | 大なり         | 
| x < y  | 小なり         | 
| x >= y | 大なりイコール | 
| x <= y | 小なりイコール | 

### 数値の大小を比較するプログラム
```cpp
#include <iostream>

using namespace std;

int main(){
  int x = 10;
  if (x<10) {
    cout << "10より小さい" << endl;
  }
  if (x==10) {
    cout << "10と等しい" << endl;
  }
  if (x>10) {
    cout << "10より大きい" << endl;
  }
  return 0;
}
```
```
10と等しい
```


## 論理演算子
複数の条件式の統合や条件の反転を行う

| 構文                          | 意味                           | 
| ----------------------------- | ------------------------------ | 
| !(条件式)	                    | 条件式の結果の反転             | 
| 条件式1 && 条件式2            | 条件式1が真 かつ 条件式2が真	  | 
| 条件式1 &#124;&#124; 条件式2	 | 条件式1が真 または 条件式2が真 | 
### プログラム
```cpp
#include <iostream>

using namespace std;

int main(){
  int x = 7;
  if (x > 5 && x < 10) {
    cout << "5より大きく、10より小さい" << endl;
  }
  return 0;
}
```
```
5より大きく、10より小さい
```
## `else`句
条件式が正しくなかったとき処理を実行する

### `else if`
前の`if`文の条件が偽で、`else if`の条件が真のときに処理を実行する

### プログラム
```cpp
if (条件式1) {
  処理1
}
else if (条件式2) {
  処理2
}
else {
  処理3
}
```

## 次の記事
[【C++】基礎を学ぶ⑨～switch文～](https://qiita.com/rapirapi/items/dfe024044045a45bb5b2)
JavaScriptでconstのみでのRGB-HSV相互変換関数

RGB-HSVの色空間変換をconstのみで簡潔に書きたかった備忘録。
三項演算子を多重ネストするよりはスマートじゃないかな。

canvasのImageDataで使うの前提なのでUint8Arrayで扱えるよう、Hの範囲は180度です。
360度の場合は`30->60, 180->360`に置き換えます。

参考: [RGBからHSVへの変換と復元](https://hooktail.org/computer/index.php?RGB%A4%AB%A4%E9HSV%A4%D8%A4%CE%CA%D1%B4%B9%A4%C8%C9%FC%B8%B5)

```js
const rgb2hsv = (r,g,b) => {
  const max = Math.max(r, g, b);
  const min = Math.min(r, g, b);
  const d = max - min;
  const h = d && 30 * ({
    [r]: (g - b) / d + 6,
    [g]: (b - r) / d + 8,
    [b]: (r - g) / d + 10
  })[max] % 180;
  const s = (max - min) / max * 255;
  const v = max;
  return [h, s, v];
}

const hsv2rgb = (h,s,v) => {
  const hi = Math.floor(h/30);
  const f = h/30 - hi;
  const m = v * (1 - s/255);
  const n = v * (1 - s/255 * f);
  const k = v * (1 - s/255 * (1-f));
  const a = [v,n,m,m,k,v];
  return [a[hi%6], a[(hi+4)%6], a[(hi+2)%6]];
}
```
なんとなくnpmを使うのはもう終わりにする。

# はじめに
本記事では**npm**と**その周辺の知識**をまとめたものになります。
なんとなく使っていたのでこの機会に学び直してみました〜〜:hatching_chick:

# ①npmとはなんだ

* Node.jsの<font color="Red">**パッケージ**</font>を管理するツール。
* Node.jsに組み込まれているので、`brew install node`でNode.jsをインストールすればnpmも一緒にインストールされる。

# ②パッケージとはなんだ
* package.jsonに記述されたファイルやディレクトリのこと。
* モジュールが誕生した（細かく機能を分けて開発できるようになった）ことにより、**よく使う機能を再利用できるようにしたもの**。1から機能を作らなくても良いので効率良く開発することができる。
* パッケージを一言でまとめると、<font color="Red">**再利用できる機能の塊。**</font>

![package.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632517/aa3f64c0-1608-96a2-a155-d1f36de1e42d.png)
※イメージ


# ③つまり...?【npmの存在意義とは】
* 通常の開発ではパッケージは複数使うことになる。
* パッケージ同士は依存しており、**依存関係が複雑過ぎて、到底人間が管理できるものではない**。
* そこで**パッケージを良い感じにインストールし管理してくれる**のがパッケージ管理システムnpmである（神）。

例えば[express](https://www.npmjs.com/package/express)というパッケージ1つを見ても、以下のように依存関係がたくさんあることがわかる。（パッケージを2~3使うだけでも膨大な依存関係になり手に負えないことがわかる。）⬇︎
![express.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632517/99501f53-1d10-4585-44d4-40eea0169fff.png)



# node_modulesとはなんだ
* **パッケージの依存関係が入っている場所**。
* 通常膨大なファイル数になるので、**チーム開発での共有**や**GitHubに上げることはない**。
* チーム開発の際はGitHub等からクローンして、`npm install`や`yarn`でnode_modulesを作る。
* package-lock.jsonやyarn.lockにバージョンが指定されており、これを参照してnode_modulesが作られるためチーム開発で環境を揃えることができる。

# npmとyarnの違いはなんだ
* npmはJavaScriptの公式パッケージマネージャー。yarnは非公式のパッケージマネージャー。
* yarnはMeta社（元Facebook）が開発したもの。
* yarnの方がインストールが速い。（npmインストールは今でこそだいぶ速くなったが、初期の頃はとんでもなく遅かったらしい。）
* **どちらを使うかは個人の好みによるっぽい**。
* Rails6以降はWebpackerが標準になったことによってyarn（とNode.js 10.13.0〜）のインストールが必須になった。

# npxとはなんだ
* **n**ode **p**ackage **e**xecuterの略。
* **自分のPCにパッケージをインストールせずに使う**ことができる。
* 例えば`npx create-nuxt-app test`のように、**一度しか使わない時に便利**。

# おわりに
基本的な内容ですが、なんとなく使っている自分に危機感を抱いたのでまとめてみました。
なるべく噛み砕いて書いたつもりなのでどなたかのお役に立てれば幸いです。

間違っている箇所がありましたら教えてくださいませ〜〜:pray:

# 参考
https://zenn.dev/antez/articles/a9d9d12178b7b2

https://www.youtube.com/watch?v=izrTW0bO-hc&list=PLwM1-TnN_NN4SV6DEs4OtfA51Up6XzTfB&index=11
ReactからSqlite3を参照して一覧データを返すAPIを作る

DynamoDBの方が慣れていますがSqlite3を使ってDBからデータを取得して返す仕組みを実装します。以下を参考にさせていただきました。

https://qiita.com/tashxii/items/7c86f39fced68ea9903d

## やりたいこと
・リクエストを受けてDBの特定テーブルを参照する
・参照結果をJSONの形に整形してレスポンスで返す

### 環境の確認
Sqlite3はMacに最初から導入済みのものを利用します

```sh
$ sqlite3 -version
3.37.0
```
### Sqlite3の準備

```sql:test.db
CREATE TABLE Test(
  id TEXT PRIMARY KEY,
  name TEXT,
  create_at TEXT
);

insert into Test values ('1','test', datetime('now', 'localtime'));
insert into Test values ('2','テスト', datetime('now', 'localtime'));
insert into Test values ('3','テスト3', datetime('now', 'localtime'));
insert into Test values ('4','テスト4', datetime('now', 'localtime'));
```

### API部分の修正
リクエストを受けてテーブルからデータを取得してJSONの形で返す仕様で、typeでテーブル定義を作りORMapしています。

```typescript:hello.tsx
type Test = {
  id:string,
  name:string,
  create_at:string,
}

export default function hello(req, res) {;
  const sqlite3 = require('sqlite3');
  const db = new sqlite3.Database('./test.db');
  const result = new Promise((resolve, reject) => {
    db.serialize(() => {
      db.all(`select * from Test`, (err, tests) => {
          if (err) return reject(err)
          return resolve(tests)
      })
      db.close();
    })
  })
  result.then((responsetest) => {
      res.status(200).json(responsetest);
    }
  )
}
```

### 画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110457/5298016c-2de3-c538-71a5-a5d8eb88479b.png)
表示項目を増やして上記画面になっています

今回はAPIのDB接続部分の話なのでそれ以外は省略します。画面の表示部分は過去の記事か以下などを参照していただければと存じます。
https://github.com/kusakari-kai/rgforcommunication/blob/main/pages/index.tsx
https://github.com/kusakari-kai/rgforcommunication/blob/main/pages/wlist.tsx

今回NodeやTypeScriptを使っていて非同期か同期かの違いで挙動を確認するのに時間がかかりました。特にDB接続や外部へのHTTP通信などは非同期で動きコールバックで結果を受け取るような仕様になっていますし、非同期の処理において対処する方法がいくつかあるので最適な方法を選択できるように選択できる基準と実績を作っておきたい。
【雑多】各種開発時の仕様などの管理方法について

# はじめに
ツールやゲームを開発する際、まず頭にあるものを早く実現させたいがために手を動かしがちだが、途中での仕様変更、追加が発生するとどんどん作業が長引いてしまう。
その他の理由もいくつかあり、いったん作業のゴールを可視化させるため、管理用の簡易な設計書を作成することにした。

# 内容
あれこれ追加するのも面倒なので、とりあえず「概要」「仕様」を記載したエクセルファイルを作成することにした。

## 1. 「概要」
字のごとく、制作物についての概要を記載する。
記載内容は、「タイトル」「ジャンル」「対象ハード」「開発言語」など。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585804/179d9ab9-0377-334e-4f8c-fe218235fd21.png)


## 2. 「仕様」
仕様と言いつつ、かなり大雑把な内容を記載する。
記載内容は、「画面一覧」「オブジェクト」など。
オブジェクトについては、ツールやゲームで表示されるテキストやボタン、またスプライト（ここでは前述以外の画像などのことを指している）などのオブジェクトの分類と、その役割（例えば、ボタンであればどんな挙動をするかなど）を記載する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585804/1406deed-219b-43f5-6b1a-9671460cd3a2.png)


# まとめ
自身の開発活動の効率化などの目的で設計書を作成してみた。
長続きするかは正直わからないが、せめて現在制作中のものに関しては作業効率が向上することを願っている。

P.S. おまけ的な記事になってしまったが、今後も【雑多】のタイトルでこういったことを発信していく予定。
slackでrss購読して情報収集

slackって、今やどこの会社でも使ってるんじゃないかと思いますが。
友達に聞くと、teamsを使ってるとか、chatworkを使ってるとか色々あるみたいですね。
私は転職前の会社でもslack使ってたのでそのままslackです。
元々は、hipchat使ってたんだけど買収されたりなんだりで。

なんだかんだ、フルリモではないので、会社に行くことも多いんですよね。
で、会社で仕事してる間も、技術系の情報収集したかったりするじゃないですか。
slackを見る時間が多いから、やっぱslackでみたい、っていう。


で、本題です。
slack x rss見るにはどうするか？

# slack appのRSSを入れる

https://slack.com/intl/ja-jp/help/articles/218688467-Slack-%E3%81%AB-RSS-%E3%83%95%E3%82%A3%E3%83%BC%E3%83%89%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B

既にslack様がまとめ書いてくれてる。
まとめによると、全てのプランで利用できるらしいですね。

https://slack.com/apps/A0F81R7U7-rss?tab=more_info

![スクリーンショット 2022-07-10 1.40.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1026740/0ee97ee9-8c68-b03b-a161-02d26e96824e.png)

で、これをSlackのアプリに入れる。
会社によっては、インストール自体を会社で制限かけてる場合があるから注意、ぐらいでしょうか。
で、インストールすると、feedの設定画面へアクセスできる。

やることは簡単。

`1. feedのURL入力`
`2. feedを流すチャンネル名を指定`

これだけ。
会社情報が入ってるから見せられないけど、これだけでSlackのチャンネルにRSSがせっせと流れてくる。

qiitaのフィードの場合、TOPページのfeedはないみたいで、`タグまたは、ユーザー`指定になるみたい。
例えば、私だったら

```
https://qiita.com/bluelemmon/feed
```

タグは、gitだったら
```
https://qiita.com/tags/git/feed
```
というURLだそうで。

TOPはないのかな？？
力強い超解像FeMaSR

***input / output***
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/0297097f-0f72-bde1-c788-9e50461a1ef0.jpeg width=512> <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/0014f520-bca8-1b4a-1565-0653a76177e1.jpeg width=512>

## 写真をリアルに超解像したい

## FeMaSRは強力補完

https://github.com/chaofengc/FeMaSR

## 使い方

リポジトリをクローンし、以下のスクリプトで使えます。

```shell
git clone https://github.com/chaofengc/FeMaSR.git
cd FeMaSR
pip install -r requirements.txt
python setup.py develop
python inference_femasr.py -s 4 -i ./testset -o results_x4/
```

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

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
LaravelのバリデーションRule::inのパラメータをEnumで表現する

Laravelのバリデーションルール `Rule::in` の定義にEnumで指定できないかと思い試してみました。

## 検証バージョン
PHP8.1.6
Laravel9.16.0


## 定義方法
PHPのEnumは内部インターフェースとしてUnitEnumを持っており、`cases()`メソッドを用いてEnumの配列を取得することができます。
しかし、`Rule::in`の引数はstringもしくはintの配列のみ許容しているのでarray_columnでEnumから値を取得して指定してあげる必要があります。


### Pure Enumの場合
```php:Pure Enum
<?php

declare(strict_types=1);

namespace App\Enum;

enum Suit
{
    case Heart;
    case Diamonds;
    case Clubs;
    case Spades;
}

```

```php: Pure Enumの値でバリデーションする場合
    public function rules()
    {
        return [
            'suit' => [
                'required',
                /**
                 * array_columnした時の値
                 * [
                 *   0 => "Heart"
                 *   1 => "Diamonds"
                 *   2 => "Clubs"
                 *   3 => "Spades"
                 * ]
                 */
                Rule::in(array_column(Suit::cases(), 'name'))
            ],
        ];
    }
```

### Backed Enum(値を定義するEnum)の場合
```php:Backed Enum
<?php

declare(strict_types=1);

namespace App\Enum;

enum Suit: int
{
    case Heart = 1;
    case Diamonds = 2;
    case Clubs = 3;
    case Spades = 4;
}

```

```php: Backed Enumでバリデーションする場合
    public function rules()
    {
        return [
            'suit' => [
                'required',
                /**
                 * array_columnした時の値
                 * [
                 *   0 => 1
                 *   1 => 2
                 *   2 => 3
                 *   3 => 4
                 * ]
                 */
                Rule::in(array_column(Suit::cases(), 'value'))
            ],
        ];
    }
```

## まとめ
今回はサンプルということでバリデーション定義でarray_columnを呼んでいますが、Enum側にvaluesメソッドを作って呼ぶのもありだと思います。
<font color="lightgray">せっかくEnum定義しているのに値だけ取るというのもアレですが。。</font>

本当はarray_columnとか呼ばずにEnumだけで完結できればいいんですが思いつかなかったのでもし知っている方いたらコメントもらえると嬉しいです！
SES企業に勤めながらWEBエンジニアに転職するブログ ~1day

<h1>はじめに</h1>
初めまして。

私はSier企業に勤め始めて3年目になる社会人のpoyoと申します。

2020年4月より社会人デビューし、SES企業に就職し3年目になります。

この記事は、私と同じく<B>WEBエンジニアへ転職したい</B>方をターゲットとしています。
<b>「SES企業に日々勤めながら、WEBエンジニアへの転職活動を成功させる」</b>ために
何をしてきたのかをQiita上に日々投稿していきます。
私と同じ目標をもっている方の力になれば幸いです。


現時点で私が思い描いているWEBエンジニア転職は下記のとおりです。

１．2022年7月：基礎学習
　　HTML,CSS,ruby,コンピューターサイエンス基礎...等々

２．2022年8月～10月：ポートフォリオ作成①
　　ウェブサイト作成

３．2022年11月～1月：ポートフォリオ作成②
　　IOSアプリ開発

４．2022年2月～6月：ポートフォリオ作成③
　　webアプリケーション開発

５．2023年7月～8月：webエンジニアへの転職活動

頭の中でざっくりと立てたスケジュールなので、今後更新されるかもしれませんが
とりあえずこのスケジュール感でまずは頑張ってみようと思います。
Unityゲーム制作奮闘記 - StateMachineBehaviourを使ったアニメーションと音の同期

## はじめに

「アニメーション」と「効果音/声」を同期させたい場面って多々ありますよね。

方法自体は色々あると思うのですが、今回制作しているゲームの場合、
アニメーションや音声の数が膨大なのが問題でした。
※ちなみにアニメーションはAnimatorを使って制御しています。

## 同期方法の検討
まず同期方法ですが、一番初めに検討したのは「Animation Event」です。
この方法なら確実に同期が取れる訳なのですが、
**アニメーションが多いと対応しきれません！**

そもそもアニメーションを更新したり差し替えたりする可能性も高かったため、
今回のゲームに限って言えば、あまり現実的な方法とは言えませんでした。

音声とアニメーションの同期をもっとシンプルに考え、
事前にアニメーションと音声を、タイミングを合わせた状態でそれぞれ作成しておき、
「同時に再生」するだけで十分だろう、という方向で検討する事にしました。


## 同時再生方法の検討

今回実装しているアニメーションをカテゴライズすると、以下の種類に分かれます。

A. トリガー駆動用モーション
B. アイドリング用モーション
C. ブレンド用モーション

「A. トリガー駆動用モーション」については、
アニメーションのトリガーを有効にするタイミングで、
同時に音声の再生を開始すれば良い為、特別な実装は必要ありません。
※今回の場合は、シナリオ側で同時に呼び出せば良いだけです。

問題は「B. アイドリング用モーション」と「C. ブレンド用モーション」です。
この2つは常時ループで再生している為、どこかに
**アニメーション開始を検知して音声を再生する**という実装が必要でした。
そこで目を付けたのが「StateMachineBehaviour」です。

## StateMachineBehaviourの検討

StateMachineBehaviourはAnimatorのステート変更を検知し、
CallBackとして処理を走らせることが出来るクラスです。

しかもサブステートマシンやブレンドツリーでも使用できるため、
今回の方法には打って付けです！

今回使うのは以下です。
・OnStateEnter：ステートに入ったとき実行（AnimationClip/ブレンドツリー用）
・OnStateExit：ステートから出たときに実行（AnimationClip/ブレンドツリー用）
・OnStateMachineEnter：レイヤーに入ったとき実行（サブステートマシン用）
・OnStateMachineExit：レイヤーに入ったとき実行（サブステートマシン用）

## StateMachineBehaviourの実装
現状の実装はかなりシンプルで、
Enter時に音声の再生、Exit時に音声の停止をしているだけです。
（下記の内容は、かなり省略して書いてます）
```C#
    override public void OnStateMachineEnter(Animator animator, int stateMachinePathHash)
    {
        SoundManager.PlayVoice("ボイス");
        SoundManager.PlaySE("効果音");
    }

    override public void OnStateMachineExit(Animator animator, int stateMachinePathHash)
    {
        SoundManager.StopVoice("ボイス");
    }
```
ただ上記の実装は、少し見直そうか悩んでいます。
上記の実装でも音声の同時再生は出来ているのですが、
本作ではキャラクターが切り替わる=Animatorが切り替わるので、
その際に問題が生じる可能性があります（=OnStateMachineExitに到達しない可能性）

今回は音声の事しか書いていませんが、
実際はBehaviourを使って他にも色々処理をしており、若干不都合があります。

なのでBehaviourから直接処理を制御するのではなく、
Behaviourは監視専用、もしくはフラグ更新だけにして、
別の常駐するクラスで処理を制御する方が都合が良いかもしれません。

## おわりに

タイトルで同期と言いながら、よく考えると単純な同時再生でしたね（すみません）
完全に同期させるのは…正直、手間が掛りすぎます。

でもアニメーションと音を合わせるだけなら、
同時再生でも何とかなるし、実装も簡単なのです。
（アニメーションに合わせた音を作るのは若干面倒ですけどね。。）

ここまで読んで頂き、本当に有難うございました。
Cocos Creatorで時計アプリを作る

今回は、Cocos Creatorを使って時計アプリを作ってみました。
使用したスクリプトはTypeScriptです。本編のブログからはサンプルプログラムをGitからダウンロード可能です。

今回書いたプログラムはこれだけで、簡単な時計アプリを作ってみました。

```
const {ccclass, property} = cc._decorator;

@ccclass
export default class Clock extends cc.Component {
    private hoursToDeg: number = -360 / 12;
    private minutesToDeg: number = -360 / 60;
    private secondsToDeg: number = -360 / 60;

    @property(cc.Label)
    label: cc.Label = null;

    // LIFE-CYCLE CALLBACKS:

    // onLoad () {}

    start () {

    }

    update (dt) {
        let now_dt: Date = new Date();      // 現在の日時を取得
        let children = this.node.children;  // Clock_BG（Node Treeパネル上）の下の子ノードを取得する

        for (let i = 0; i < children.length; ++i) {
            children[i].zIndex = -3;
            if (children[i].name == "r_tile16x16") {
                // 長針のノードの場合の処理（分）
                // 360度を60分割した角度（要は1分毎の角度）を現在の分に掛けて現在の分の角度を計算
                children[i].angle = now_dt.getMinutes() * this.minutesToDeg;
            } else if (children[i].name == "g_tile16x16") {
                // 短針のノードの場合の処理（時）
                // 現在の分により、短針の角度を徐々に次の時間まで動くよう微調整角度を計算
                let addVal: number = ( now_dt.getMinutes() / 12 ) * 6;
                // 現在の時に合わせて角度を計算。１時間あたり-30度づつ角度が変わるが、addValの数値を減算して、角度を微調整する
                // 例えば、現在の時刻が30分だとすると、30 / 12 * 6 = 15、現在の時が6時の場合、
                // 6 * -30（１時間毎に進む角度）= -180度
                // -180 - 15 = -195度が短針の角度（6時と7時の中間あたりに短針がくる）になる
                children[i].angle = ( now_dt.getHours() * this.hoursToDeg ) - addVal;
            } else if (children[i].name == "b_tile16x16") {
                // 秒針のノードの場合の処理
                // 360度を60分割した角度（要は1秒毎の角度）を現在の秒に掛けて現在の秒の角度を計算
                children[i].angle =now_dt.getSeconds() * this.secondsToDeg;
            }
        }
    }
}
```

できたアプリはこちら。
FireFoxで実行したところです。

![時計アプリ再生.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708476/5a3d9c70-028a-a914-aa76-7fa9d987f908.png)

本編の記事は、以下のブログをご覧ください。

https://panda-ringo.com/?p=1146
【Python】 defaultdictを使ってリストの集計をする

この記事は筆者が勉強したことを、自分のなかで理解を深めるために書いています。
間違った解釈、表現などありましたら、コメントいただけますと幸いです。

# 辞書型のおさらい

d = {key1 : value1, key2 : value2, key3 : value3,...}
>・要素(value)へのアクセスはkeyを使って参照
>・一つの辞書の中に同じkeyを重複して持たせることはできない
>・集合と同じく、可変、重複なし、順番なし

https://qiita.com/yuto-naga/items/ecb151c39bd54c73038a

https://www.shibutan-bloomers.com/python-basic-dictionary-2/690/

# defaultdict()について
・辞書型を拡張したデータ型
・キーが存在しない要素にアクセスした時の挙動を定義しておくことができる

https://teratail.com/questions/150160



## defaultdict()の使用例 ~リストを集計する~
~~~python:main.py
# collectionsモジュールからdefaultdictを読み込む
from collections import defaultdict
# リスト
results = ["tomato", "tomato", "potato", "tomato", "potato", "tomato"]

# 関数の定義
def init():
    return 0 #とにかく0を返す

# ()の中にキーが存在しない要素にアクセスしたときに0を返すように設定
# 関数を渡すことになっているので上記defにて定義
stats = defaultdict(init)
for result in results:
    stats[result] += 1 # リストの中のtomatoとpotato数える

print(stats)
~~~
~~~terminal:main.pyを実行・出力結果
~ $ python main.py
defaultdict(<function init at 0x7fa268a7d9>, {'tomato': 4, 'potato': 2}) # 集計結果
~ $ 
~~~

「function init at 0x7fa268a7d9」の0x7fa268a7d9はメモリ番地

https://hibiki-press.tech/python/reference_copy/590

https://codor.co.jp/python/program-and-memory

## lambda・intを使って短く表現する
defaultdict の引数には、「単に0を返す処理」を記述する。

つまり「0を返す関数」になるので、初期値が 0 になる。
以下2つは、どちらも0を返す。
・lambda: 0
・defaultdict(int)

~~~python:main.py
from collections import defaultdict
results = ["tomato", "tomato", "potato", "tomato", "potato", "tomato"]

# 単に0を返す処理、intは引数なしで渡すと必ず0を返す
# int:組み込み関数、整数型に変換する
stats = defaultdict(int)
# 引数がなく、return一行の処理なので、lambdaで短く表現可能
# stats = defaultdict(lambda: 0)、こちらも0を返す

for result in results:
    stats[result] += 1

# 辞書型で表示、組み込み関数のdict()を使う
print(dict(stats))
~~~
~~~terminal:main.pyを実行・出力結果
~ $ python main.py
{'pass': 4, 'fail': 2}
~ $ 
~~~

# 参考にしたサイト
https://qiita.com/xza/items/72a1b07fcf64d1f4bdb7

https://note.nkmk.me/python-dict-keys-values-items/

https://www.delftstack.com/ja/howto/python/initialize-a-dictionary-python/

https://teratail.com/questions/150160

https://atmarkit.itmedia.co.jp/ait/articles/2101/08/news014.html

https://techacademy.jp/magazine/28104
Swift StoryBoardからUIViewやUIButtonの枠線の太さ、色の設定を行う

StoryBoardからUIViewやUIButtonの枠線の設定を行う事が増えたのでメモ


# 角丸にする
任意の部品のUser Defined Runtime Attributesに直接書く
今回はUIButton
```
Key Path：cornerRadius 
Type:Number 
Value:5
```
これだけ。
**UIView、imageViewなどはclipsToBoundsにチェックを入れないと反映さえないので注意!!!!**

# 枠線をつける
任意の部品のUser Defined Runtime Attributesに直接書く
```
Key Path：layer.borderWidth
Type：Number 
Value：1

Key Path：borderColor
Type：Color 
Value：red(実際は色を直接選択)
```
**しかし、これだけでは反映されない.**

layer.borderColorプロパティにはcgColor値を設定しないといけないが、StoryBoardで指定している色はUIColorのため
コードで変換してあげないといけない。

```Swift
extension UIButton {
    
    @objc var borderColor: UIColor? {
        get {
            return layer.borderColor.map(UIColor.init)
        }
        set {
            layer.borderColor = newValue?.cgColor
        }
    }
}

```

extensionに書いてあげると無事に枠線に色がつく。


以上、便利だったので忘れないようにメモ
asdfでFlutterのバージョン管理をする


# 更新履歴
- 2025/03/19 local でのバージョン指定方法を local -> set に変更

# 事前準備
Homebrewから「jq」を追加しておく。

# 開発環境
PC：macOS Monterey(M1 Macbook Pro 2020)
インストール方法：zsh＆Homebrew

IDE
Visual Studio Code: Version 1.68.1
Android Studio: Android Studio Chipmunk

# 内容

### asdfをインストールする
```
brew install asdf
```

### asdfのパスを通す
```
echo -e "\n. $(brew --prefix asdf)/libexec/asdf.sh" >> ${ZDOTDIR:-~}/.zshrc
```
※※※Homebrew以外でインストールする場合や、シェルがzsh以外の場合は[こちら](https://asdf-vm.com/guide/getting-started.html#_3-install-asdf)を参照する。

### Flutterのプラグインを追加する
```
asdf plugin add flutter
```
※※※これを実行しないと、Flutterがインストールできない。

### Flutterを追加する
まずはインストールできるバージョンを確認する。
```
asdf list all flutter
```

続いて、Flutterをインストールする。
今回はflutter3.0.0をインストール。
```
asdf install flutter 3.0.0-stable
```
※※※この時「jq」がHomebrewにインストールされていないと以下のようなエラーが発生する。
```
/Users/hogehoge/.asdf/plugins/flutter/bin/install: line 25: jq: command not found
/Users/hogehoge/.asdf/plugins/flutter/bin/install: line 2６: jq: command not found
/Users/hogehoge/.asdf/plugins/flutter/bin/install: line 27: [: -gt: unary operator expected
Cannot find the download url for the version: 3.0.0-stable
```
※hogehogeは自分のユーザー名に置き換えること


### インストールしたFlutterの確認
```
asdf list flutter
```

### プロジェクト毎にインストールしたFlutterのバージョンを指定する
```diff
cd [アプリプロジェクトディレクトリ]

- asdf local flutter 3.0.0-stable
+ asdf set flutter 3.0.0-stable
```

### プロジェクトのFlutterのバージョンを確認する
.tool-versionsファイルが作成されて、先ほど指定したバージョンが記載されている。
```.tool-versions
flutter 3.0.0-stable
```

### コマンドでFlutterのバージョンを確認する。
```
flutter --version
```
ここでは、Pathを通す必要はない。

# IDEの設定

### VS Code
Code -> Preferences -> Settingsに移動する
Flutterで検索する
Dart: Flutter Sdk Pathsの箇所で「Add Item」ボタンをクリックして、以下を追加する

```
/Users/hogehoge/.asdf/installs/flutter/
```
※hogehogeは自分のユーザー名に置き換えること

### Android Studio
Preferences > Languages & Frameworks > Flutter > Flutter SDK Pathに以下を設定する
```
/Users/hogehoge/.asdf/installs/flutter/2.0.5-stable
```
※Android Studioのダウンロード直後は上記の方法ではなく、プロジェクト作成から設定する場合もあり
※hogehogeは自分のユーザー名に置き換えること

# 参考記事

https://asdf-vm.com
ロータリーエンジンのローターおよびハウジング生成

# 背景
特徴的な構造であるロータリーエンジンは、技術者なら一度は憧れるエンジンですよね。
そんなエンジンをいざ作ろうと思うと、作図ができない・・・
ならば、生成用のスクリプトを作ろう。

# 本編
ロータリーエンジンのローター及びハウジングの形は[こちらのサイト](https://opeo.jp/library/onepoint/calc/func_curve_pt/)を参考にしました。

作成したスクリプトとそれをもとにした設計例(Fusion360)は下記githubに公開しました。
[github](https://github.com/j4312043/GenRotery)　※GenRotery.pyはGPLライセンスとします

## dxfファイル生成
CADでの使用(インポート)を考慮すると、汎用的に使用可能なdxf形式がベストです。
pythonでは、dxfファイルを操作する以下のライブラリが公開されており、
そちらを利用しました。

## ハウジング
ロータリーエンジンは、固定されたハウジングと運動するローターとから構成されます。
ハウジングに関しては、解析解が掲載されており、そちらをdxf化するスクリプトとしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203155/5cbe3f07-cc87-27eb-feed-08f32ea8de53.png)


## ローター
解析解が見つからず、解いてみましたが解けなかったため、
ハウジングを大量に描画し、3DCAD側の押出操作でデータを作成する仕様としました。
なお、巷ではルーローの三角形を使うとよく言われますが、
特定の条件下の場合だけです(詳細は参考文献を参照ください)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203155/ba74ce4c-9104-19e9-86b2-6f79ecff588f.png)

## 実際に作ってみた
3Dプリンタを使って実際に作ってみたものが以下の通りです。

![写真 2022-07-07 23 38 23.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203155/db0337ac-60dc-8892-e5f4-0b1c7b437fde.jpeg)


![写真 2022-07-09 22 28 19.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203155/08be85df-5765-a7af-2b64-60417ace6fb6.jpeg)

本来の出力軸側から手で回してあげれば動きます。
ただ、エンジンとして滑らかに動かすためには、NCフライスで加工する必要がありそうです。

# 感想
大学入学当初からいつか作ってみたいと思いつつ放置していたロータリーエンジンのデータを
10年越しくらいで作ることができてよかったです。
MATLABでdxf生成した方が楽だった説もありますが、
機械設計者でMATLAB環境ある人も少ないと思いますので・・・


# 参考文献
[1]https://opeo.jp/library/onepoint/calc/func_curve_pt/
　作図に関して参考にしました
Node.jsでAPIを呼び出すときの同期処理のメモ


毎回、同期処理で悩みます。

Promise とか async とか意味わからんし・・・。

用語の意味から混乱します。

同期処理は、最初のコードから次のコードへと順次処理（実行）されていくこと。 
非同期処理は、ある処理が終了するのを待たずに、別の処理を実行すること。

　<br>
今日は冷静になって、同期処理を研究してみました。
私はど素人なので、もっといい方法があれば教えてください。


## APIを呼び出すときの同期処理の研究

### 利用API

気象庁のAPIからデータをとる事例でいろいろ試してみました。

https://www.jma.go.jp/bosai/forecast/data/overview_forecast/340000.json

こんなJSONファイル
```
{
"publishingOffice":"広島地方気象台",
"reportDatetime":"2022-07-09T21:27:00+09:00",
"targetArea":"広島県",
"headlineText":"",
"text":"　中国地方は、湿った空気の影響で概ね曇り、雨の降っている所があります。\n\n　９日夜の広島県は、低気圧や湿った空気の影響で曇り、雨の降る所がある見込みです。\n\n　１０日は、湿った空気の影響で概ね曇るでしょう。"
}
```


### require-promise モジュール

まず。require-promise モジュールを使ったケース

```main.js
'use strict';
const request = require('request-promise');
let apiURL = "https://www.jma.go.jp/bosai/forecast/data/overview_forecast/340000.json";
    
let values = getData(apiURL);
console.log(values);

function getData(apiURL){
  return new Promise((resolve,reject) => {
      var options = {
        url: apiURL,
        method: 'GET',
        json: true
      }
  
      request(options).then(function (body) {
        let bodyStr = JSON.stringify(body); //JSON 文字列に変換
        let values = JSON.parse(bodyStr); //Parseする

        resolve(values);
      });    
    });
}

```

これの実行結果
```
Promise { <pending> }
```

当たり前ですね。
関数は同期処理をしてますが、
そもそも呼び出すところが同期処理されていません。

ここです。
関数getDataの処理が終わる前に先にconsole.log を実行しています。

```main.js
let values = getData(apiURL);
console.log(values);
```

ここをこう変えてみると

```main.js
getData(apiURL).then((values) => {
    console.log(values);
});

```

実行結果
```
{
  publishingOffice: '広島地方気象台',
  reportDatetime: '2022-07-09T21:27:00+09:00',
  targetArea: '広島県',
  headlineText: '',
  text: '　中国地方は、湿った空気の影響で概ね曇り、雨の降っている所があります。\n' +
    '\n' +
    '　９日夜の広島県は、低気圧や湿った空気の影響で曇り、雨の降る所がある見込みです。\n' +
    '\n' +
    '　１０日は、湿った空気の影響で概ね曇るでしょう。'
}

```

おお、同期されて、ちゃんとデータとれました。
　<br>

### Axiosモジュールを使う

先ほどの例では、getData関数が大掛かりなので、axiosモジュールを使えば、こうスリムになります。

``` main.js
'use strict';
const axios = require("axios");
let apiURL = "https://www.jma.go.jp/bosai/forecast/data/overview_forecast/340000.json";
    
getData(apiURL).then((values) => {
    console.log(values.data); //requireと違うのが values.dataとなるところ
});

async function getData(apiURL){    
  let values = await axios.get(apiURL);
  return(values);
}


```

axios　は改めて調べると、便利ですね。

以上です。
ファイル スコープ名前空間のために C#10 を使おう

# はじめに
C#を学び始めて2年ちょっとが過ぎました。
C++からジョブチェンジしてきた僕は、C#の「ある仕様」がとても苦手だったのです。

# 何かっていうと・・・
さくっと簡単なクラスを書いてみます。
```csharp
namespace Amdek.Models
{
    internal sealed class Product
    {
        internal string ModelName { get; }
        internal string SerialNumber { get; }

        internal Product(string modelName, string serialNumber)
        {
            ModelName = modelName;
            SerialNumber = serialNumber;
        }
    }
}
```

う～ん・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107938/b9bcf534-9c9e-6f61-1d5e-a6ca5c05fc4f.png)

・・・なんすかこの空白。
デフォルトでインデントがひとつ追加されてしまう。
ネストは浅くと口酸っぱく先達に教えてもらいましたが、言語の使用で見かけのネストが深くなってますやん。

# 現れた救世主
ところが、C#10 で導入された「ファイル スコープ名前空間」を使ったらどうでしょう。

```csharp
namespace Amdek.Models;

internal sealed class Product
{
    internal string ModelName { get; }
    internal string SerialNumber { get; }

    internal Product(string modelName, string serialNumber)
    {
        ModelName = modelName;
        SerialNumber = serialNumber;
    }
}
```

ワォ！ベリナイス！！

・・・あれ、そうでもない？

# Visual Studio 2022 で簡単に変換できます
### クイックアクションとリファクタリング
namespace を右クリックして「クイックアクションとリファクタリング」を選択するか、`Ctrl` + `.` でメニューから選択できます。

### セミコロンをつけるだけ
対象の namespace を選択してセミコロン `;` を追加するだけです。

# 要するに
皆さん今すぐに .NET 6/C# 10 を使い始めましょう。
嗚呼、次のバージョンも楽しみですね。
GitHubの学生プランに登録できないとき、学生証の写真に学校名を英語で入れればいい

# GitHub 学生開発者パックとは
教育機関ドメインのメールアドレスと学生証を持ってる場合に受けることのできるプランです。
GitHub Proが無料で手に入り、他にも[様々な割引](https://education.github.com/pack/offers)を受けることができます。
僕が気に入ってるものとして、
- [Gitpod](https://www.gitpod.io/)の[Personal plan](https://www.gitpod.io/pricing)が6ヶ月無料
- [GitKraken Pro](https://www.gitkraken.com/git-client/pricing)、[GitLens Pro](https://www.gitkraken.com/gitlens/pricing)が無料
- ほぼ全てのJetBrains製IDEが無料

など様々な特典があります。

# 申請が通らない
僕の周りでいくつか例を見たのですが、申請後すぐ申請が却下された旨のメールが見られました。
すべての例において、メールに書かれている申請却下の理由に「学生証の写真から学生である旨の記述が見られなかった」がありました。

# なぜ通らなかったのか？
申請後すぐ却下されていたので、おそらく人ではなくAIがチェックしていたのでしょう。
AIは恐らく、
- 氏名
- 顔写真
- 有効期限
- 学校名

などを見ていたのではないでしょうか？

申請ページでは、メールアドレスのドメインに紐付けられた学校名が予め入力され編集不可になっていました。

![Screenshot 2022-07-09 at 22-58-10 Discounted and free plans are available for educational use.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244946/ac85fbd6-3f6f-140d-1dc5-61c6e0f6cc0f.png)

ここでの学校名は**英語**でしたが、学生証に記入されている学校名は**日本語**です。
なので、学生証から学校名が検出されなかったのではないかと考えました

# 対策

早速実験をしてみます。
学生証の写真を撮り、PowerPointで上から学校名のテキストボックスを余白に重ね合わせました。

![unknown (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244946/261a62cd-5a68-64df-7846-f8fb20cb1960.png)


これを学生証の写真として提出し申請したところ、受理されました。

![unknown (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244946/cb55dee3-eaf3-193f-0486-d2ee9c33a554.png)

# まとめ
GitHubの学生プランの申請が受理されない時は、**パワポで学校の英語名を上から記入しましょう。**
多分それで通ります。
Oracle Database 12c以降で、テーブルの列に配列型を定義する方法

# 手順
1. ユーザ定義の型を作成する
1. テーブル作成時の列の型に、作成したユーザ定義型を指定する

# 手順ごとのサンプルSQL
1. ユーザ定義の型を作成する
    ~~~sql
    CREATE TYPE array_type AS VARRAY(30) OF VARCHAR2(100);
    ~~~
1. テーブル作成時の列の型に、作成したユーザ定義型(**array_type**)を指定する
    ~~~sql
    CREATE TABLE dept_phone_list (
      id NUMBER(5), 
      array_sample array_type);
    ~~~

詳細は[公式ドキュメント](https://docs.oracle.com/cd/E82638_01/adobj/collection-data-types.html#GUID-399C8571-3BAC-493D-8A3A-C839DD2D3C0F)を参照して下さい。
C#/.NET エンジニアは頼むからこれ買って

# はじめに
C# を学び始めて2年ほどの僕がいくつか手にとった C#/.NET の本の中で最も役に立った、そしてこれからも役に立ち続けるであろう渾身の一冊を紹介します。

# その本はずばり・・・

### .NETのクラスライブラリ設計 改訂新版

https://www.amazon.co.jp/NET%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E8%A8%AD%E8%A8%88-%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%BD%E3%83%95%E3%83%88%E9%96%A2%E9%80%A3%E6%9B%B8-Krzysztof-Cwalina%E3%80%81Jeremy-Barton%E3%80%81Brad/dp/4296080040/ref=sr_1_4?crid=34XVC4KMH2DI9&keywords=.net&qid=1656080022&s=books&sprefix=%2Cstripbooks%2C173&sr=1-4

・・・ため息やツッコミが片田舎の我が家まで聞こえた気がします。
この改訂版が出版された当時は Microsoft の中の人達なども多く話題に挙げていましたし、C#/.NET のエンジニアにこの本を知らない人はいないでしょう。

でも、C#/.NET エンジニアの皆さん、**ひとり一冊持っていますか？**

## この本は・・・
#### C#/.NET の先達が記す黄金パターン集
自分でコーディングするとき、ソースコードレビューで人の書いたコードを読むとき、「これってどう書くのがいいのだろう」といった些細な疑問を一撃で解決してくれるのがこの本です。頭から読むもよし、辞書的に使うもよし。これはもはや**コーディング規約**です。（恥ずかしながら弊社ではコーディング規約を制定中で、ほぼこの本の内容が反映されています。）

似たような内容は [Microsoft Docs](https://docs.microsoft.com/ja-jp/) にもありますが、この本は校閲を通った（であろう）きれいな日本語で書かれており、格段に読みやすいです。索引も使いやすく、ネットで調べるよりも早く答えにたどり着けます。（弊社調べ）

#### キーワード
以下のキーワードにピンときたら、手に取って読んでみてください。
- シナリオ駆動設計
- 命名規則
- クラスかインターフェイスか
- プロパティかメソッドか
- 標準の例外の使い方
- 非同期パターン
- コーディングスタイル

地味に面白いのが、巻末の特別付録。訳者・監訳者による副音声解説的な雑感集です。
こういうので一冊本出しても面白いのではないでしょうか。

#### C# のバージョンにはご注意
日進月歩の C#/.NET ですから、新バージョンの機能についてはどうしても情報が落ちてしまいます。
そこは MS Docs などで継続的にフォローアップしていく必要がありますね。

#### 一番の難点は金額か？
なかなかにボリュームのある本で、値段もそれなりです。
僕の場合はまずチームで一冊買いました。先述の通り、実装中やレビュー中に書棚へ足を運ぶことは数え切れず、付箋の数も増えていき・・・

**「あ、これ買ったほうがいいやつだわ・・・」**

翌営業日には机の上に届いておりました。帯や表紙をひっぺがし、付箋を移し替え、レビュー指摘の根拠資料として持ち歩く日々が始まったのです。

# 要するに
業務・趣味を問わず、C#/.NET のエンジニアの皆様、この本はぜひお手元に一冊置いておいてください。
チームリーダー、マネージャーの皆様、ぜひメンバーに配布してください。 ~~それに合わせて本を広げっぱなしにできる広いデスクも買ってください。~~

そして、**みんなで熱く語り学びましょう**。
ペネトレーションテスト とは

## 勉強前イメージ

初めて聞いた・・・！

## 調査

### ペネトレーションテスト とは

日本語では侵入テストや侵入実験と呼ばれ
ネットワークに接続されているシステムに対して既知のサイバー攻撃を疑似的に行うなど侵入を試みることで脆弱性があるかのテストを行う手法のことを指します。

ペネトレーションテストの目的は実際にどの程度攻撃できてしまうのかの確認を行うことで
今システムに侵入された際に被害が大きいところから優先的に対処することができ、
今後のセキュリティ対策や対策コストの方針を決めることができます。

### 脆弱性診断との違い

他にもシステムがセキュリティ的に問題ないかの確認として脆弱性診断があります。
脆弱性診断は、セキュリティ上の不備を網羅的に調べるものです。
使用されているサーバのOSやミドルウェア、フレームワークなど緊急的なものから潜在的なリスクになってるものまでまとめて確認することができます。

ペネトレーションテストとの違いは以下になります。

- ペネトレーションテスト : 脆弱性などから実際にシステムに侵入可能かどうかをシナリオに基づいて確認
- 脆弱性診断 : システム全体のセキュリティ不備を網羅的に調べる

## 勉強後イメージ

実際に攻撃者になってあの手この手で入れるかやってみるテストってことか。
DDoS攻撃したりとか・・・ってことね。

## 参考

- [ペネトレーションテストサービスとツール11選。何を使うべきか？](https://www.aspicjapan.org/asu/article/10476)
- [ペネトレーションテストとは？脆弱性診断との違いを徹底解説](https://cybersecurity-jp.com/security-measures/31895)