OmniAICreator/Qiita-1.07M huggingface dataset:
scipy.stats: 回帰分析 linregress

# scipy.stats: 回帰直線 `linregress`

単回帰分析を行う。

`linregress(x, y=None, alternative='two-sided')`


```python
from scipy.stats import linregress
import numpy as np

x = np.arange(15)
y = x**2

res = linregress(x, y)
res
```




    LinregressResult(slope=13.999999999999998, intercept=-30.333333333333314, rvalue=0.9644093612193901, pvalue=6.916724428470525e-09, stderr=1.0645812948447575, intercept_stderr=8.757219244080245)



名前付きタプルで，以下のものが返される。

- slope=13.999999999999998 は回帰直線の傾き
- intercept=-30.333333333333314 は回帰直線の切片
- rvalue=0.9644093612193901 は二変数間のピアソンの積率相関係数
- pvalue=6.916724428470525e-09 は，相関係数=0の検定，および回帰直線の傾き=0の検定，および重相関係数=0の検定の $p$ 値（3 つの検定はすべて同じ）
- stderr=1.0645812948447575 は，回帰直線の傾きの標準誤差
- intercept_stderr=8.757219244080245 は，回帰直線の切片の標準誤差


R で分析すると以下のようになる。

<pre>> x = 0:14
> y = x^2
> res = lm(y ~ x)
> summary(res)

Call:
lm(formula = y ~ x)

Residuals:
    Min      1Q  Median      3Q     Max 
-18.667 -14.667  -2.667  11.833  30.333 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)  -30.333      8.757  -3.464   0.0042
x             14.000      1.065  13.151 6.92e-09

Residual standard error: 17.81 on 13 degrees of freedom
Multiple R-squared:  0.9301,	Adjusted R-squared:  0.9247 
F-statistic: 172.9 on 1 and 13 DF,  p-value: 6.917e-09</pre>

# R の出力にあって `linregress` にないものを計算する

- Multiple R-squared　決定係数


```python
res.rvalue**2
```




    0.9300854160075921



- Adjusted R-squared　自由度の調整済み決定係数


```python
n = len(x)
((n-1)*res.rvalue**2-1)/(n-2)
```




    0.9247073710850992



- t value of Intercept　切片の検定の $t$ 値


```python
t_intercept = res.intercept / res.intercept_stderr
t_intercept
```




    -3.4638088287943933



- Pr(>|t|) of t value of Intercept　切片の検定の $p$ 値


```python
from scipy.stats import t
t.sf(np.abs(t_intercept), n-2) * 2
```




    0.00419543767710724



- t value of x　傾きの検定の $t$ 値


```python
t_slope = res.slope / res.stderr
t_slope
```




    13.150710112788095



- Pr(>|t|) of t value of x(ie. slope)　傾きの検定の $p$ 値


```python
t.sf(abs(t_slope), n-2) * 2
```




    6.916724428470525e-09



- Residual standard error　残差標準誤差と自由度


```python
predicted = x * res.slope + res.intercept
Se = sum((y - predicted)**2)
St = np.var(y) * n
Sr = St - Se
df = n-2; np.sqrt(Se/df), df

```




    (17.813852287849848, 13)



- F-statistic, df1, df2, p-value　回帰の分散分析の $F$ 値，自由度，$p$ 値


```python
from scipy.stats import f
F = Sr*(n-2)/Se
F, 1, n-2, f.sf(F, 1, n-2)
```




    (172.94117647058823, 1, 13, 6.916724428470249e-09)



**これだけ余計なことするなら，最初から関数書いたほうが速い**
まだ PostgreSQL の開発で疲弊してるの？

この記事は、勉強会で発表したスライドを [Qiita Engineer Festa](https://blog.qiita.com/engineer-festa-2022-orgaznization) 向けに書き直したものです。
[PL/pgSQL Language Server を開発しました。](https://qiita.com/yan7010/items/74215a2a9e8d04f8419b)

## PostgreSQL の開発がつらい

弊社では RDS として PostgreSQL を採用しており、
ロジック部分を PL/pgSQL の Stored Function / Procedure を用いて書くことがあります。

しかし、これがつらい :face_with_rolling_eyes:

> まるでメモ帳で開発をしているかのようだ...(著者の感想)

TypeScript や Rust のような補完や構文チェックが欲しい～～～～ということで
VSCode 用に [PL/pgSQL の Language Server](https://marketplace.visualstudio.com/items?itemName=uniquevision.vscode-plpgsql-lsp) を作りました :tada: 

## PL/pgSQL Language Server

できたのがこれです。

<img width="800" alt="preview" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801258/a27f832f-14ad-6808-8c92-1ad3893b0672.gif">


### できること一覧

- テーブル名などの補完
- 定義への移動
- シンボルへの移動
- 定義のホバー表示
- 構文チェック
- 静的解析チェック（[plpgsql_check](https://github.com/okbob/plpgsql_check) を使っている時だけ）
- 「現在のファイルを実行」コマンド
- [マルチワークスペース](https://code.visualstudio.com/docs/editor/multi-root-workspaces) の対応

各機能の現在の対応表は下記です。

| | 補完 | 定義へ移動 | ホバー表示 |
| :--- | :---: | :---: | :---: |
| DOMAIN                    | ✔️ | ✔️ | ✔️ |
| FUNCTION                  | ✔️ | ✔️ | ✔️ |
| INDEX                     | - | ✔️ | ✔️ |
| MATERIALIZED VIEW         | ✔️ | ✔️ | ✔️ |
| PROCEDURE                 | ✔️ | ✔️ | ✔️ |
| TABLE                     | ✔️ | ✔️ | ✔️ |
| TRIGGER                   | - | ✔️ | ✔️ |
| TYPE                      | ✔️ | ✔️ | ✔️ |
| VIEW                      | ✔️ | ✔️ | ✔️ |

## 使い方
### ワークスペースで設定するだけ
VSCode のワークスペース毎に接続したいデータベースを設定します。

```jsonc:vscode/settings.json
{
  "plpgsqlLanguageServer.database": "データベース名",
  "plpgsqlLanguageServer.user": "ユーザ名",
  "plpgsqlLanguageServer.password": "パスワード",
  "plpgsqlLanguageServer.definitionFiles": [
    // glob をサポート。
    "**/*.sql",
    "**/*.psql",
    "**/*.pgsql"
  ],
  // Language Server が対応するファイルの拡張子はデフォルトで ['*.pgsql', '*.psql'] です。
  // （ SQLite など他の RDS と競合させないためです。）
  // '*.sql' のファイルも対応させたい場合は、下記の設定を追加してください。
  "files.associations": {
    "*.sql": "postgres"
  }
}
```

エディタを開くだけで補完などが効くようにデザインされています :sunglasses:  
ここは、既存の Postgres 拡張の操作が煩雑であったところを意識しています。

複数のデータベースに接続するアプリケーションの場合は、
データベースごとにワークスペースを分けて運用してください。

## 使用感
拡張がなかったころに比べて、はるかに快適になりました :rocket:   
気になったらすぐに定義に飛べるのはやはりいいです。

また、今までは更新したときに何が起こるのかを把握しにくくなるトリガーなどの使用を避ける傾向にありましたが、
テーブル名をホバーすることでインデックスやトリガーの一覧を確認できるので、開発スタイルそのものが変わりそうです。

<img width="600" alt="hover" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801258/66463ce1-4c68-df1c-1a19-9f770e4cdda7.png">

## 課題

あまり開発の工数を増やしたくないので、自前のパーサなどは作っていないのですが、それゆえの問題を抱えています :cry:

- コメントの場所を解析できない
- 関数名が始まる部分の位置情報などを教えてくれない
- コーティング中の未完成な状態での構文解析

それが原因で、下記の機能は実現できていません。

- 自動フォーマット
- 文脈を理解した補完(カラム名補完)
- より正確なシンタックスハイライト
- コメント文を利用した行単位の細やかな Language Server の制御

特に、**自動フォーマット** は欲しくてたまらない機能なのですが、パーサを開発するコストを懸念して実装していないままです。  
（できれば PL/pgSQL のフォーマッタは PostgreSQL 本体に対応してほしいところ...）

[libpg-query](https://www.npmjs.com/package/libpg-query) よりも優れたパーサをご存じの方がいればコメントをしていただけると幸いです。
ソリューションビジネスとシステム活用促進

## ソリューションビジネス
<b>企業が抱えている経営課題や業務上の悩みの解決を目的とした、サービス事業者が提供するサービスのこと。
自社が所有する施設内に、自社の情報システムを導入して運用することを<font color = blue>オンプレミス</font>という。
## ハウジングサービスとホスティングサービス
### ハウジングサービス
<b>耐震設備や高速回線、情報セキュリティなどを整備したサービス事業者の施設内に自社が所有しているサーバや通信機器を預けることができるサービス。
### ホスティングサービス
<b>サービス事業者が所有するサーバを貸し出すサービスのこと。
## クラウドコンピューティング
<b>インターネット上のハードウェアやソフトウェアなどを、物理的にどこにあるのか意識することなく、自社から利用する形態。
この形態でサービス事業者(クラウド事業者)が、サーバやOS、ソフトウェアなどを提供するサービスを<font color = blue>クラウドサービス</font>という。
### クラウドサービスの種類
#### IaaS
<b>クラウド事業者が、情報システムの稼働に必要なサーバやハードディスク、インターネットなどのインフラをネットワーク経由で提供するサービス。「サービスとしてのインフラ」
#### PaaS
<b>ソフトウェアの稼働に必要なOSやデータベース、プログラム実行環境などをネットワーク経由で提供するサービス。「サービスとしてのプラットフォーム」
#### SaaS
<b>ソフトウェアをネットワーク経由でサービスする提供するサービス。「サービスとしてのソフトウェア」
#### Daas
<b>シンクライアントシステムを、外部のクラウドサービスで実現するもの。「サービスとしてのデスクトップ仮想化」
### ASP
<b>業務アプリをネットワーク経由で提供する事業者のこと。
### パブリッククラウド
<b>不特定多数の利用者に提供するもの。安価だが自由度が低い
### プライベートクラウド
<b>特定の企業や個人だけに提供するもの
### オンラインストレージ
<b>クラウド事業者がインターネット経由でデータを保管するディスク領域を貸し出すサービスのこと。
Dropbox,OneDriveなど
## SOA
<b>業務プロセスの機能をサービスとして部品化し、そのサービスを組み合わせることのよって、情報システム全体を構築していく考え方。
### SI
<b>情報システムの企画から開発・運用・保守までの業務を請け負うサービスのこと。請け負うサービス事業者は<font color = blue>システムインテグレータ</font>という。
## システム活用促進
<b>情報を取り扱う能力のことを<font color = blue>情報リテラシ</font>という。
### ディジタルデバイト
<b>ITを利用する能力や機会の違いによって生じる経済的・社会的な格差のこと。「情報格差」
### RPA
<b>人がPC上で行う定型的な操作を、ロボットというソフトウェアで自動化・効率化すること。
JavaScriptのnew Date()で引数に時間を指定しないと時間はタイムゾーンを参照する

本番環境でやらかしたので備忘録として書きます。

# はじめに　　
JavaScriptではnew Date()と書くと現在時刻からDateインスタンスを生成できます。  
```
const now = new Date();
console.log(now);
// Wed Dec 08 2021 17:49:02 GMT+0900 (日本標準時)
```
一般的なブラウザ実行環境においては、タイムゾーンなどが日本のものに設定されていると思われます。　　

# 日付文字列を引数として渡す
引数に日付文字列（```yyyy-mm-dd hh:mm:ss```）を指定すると*2022/06/06 00:00:00*のDateオブジェクトが生成されます。
```
const now = new Date('2022-06-06 00:00:00');
console.log(now);
// Mon Jun 06 2022 00:00:00 GMT+0900 (日本標準時)
```
# 日付文字列を渡すが、時刻を省略する
引数に日付文字列（```yyyy-mm-dd```）を指定すると…　　
```
const now = new Date('2022-06-06');
console.log(now);
// Mon Jun 06 2022 09:00:00 GMT+0900 (日本標準時)
```
９時間ズレました。
時間を指定しないとUTC（協定世界時）を参照するようで、日本の時差９時間ズレてDateオブジェクトが生成されるようです。  

今回、画面上で日付が変わったタイミングで表示を切り替えるロジックを実装したところ、切り替わらないとの報告があったため調査しました。  

# まとめ　　
[MNS](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/Date)を見てみると
>注: Date コンストラクター (および同じように動作する Date.parse()) を使用した日付文字列の解析は、ブラウザーによって違いや矛盾があるため、使用を避けることを強くお勧めします。　　 

とのことなのでDate()に日付文字列を渡すのは避けるべきなのかもしれません。
Google Chrome印刷で用紙を横にする

## 使い方
- Chrome Driverで印刷したい箇所でこの関数を呼ぶ
- Chromeバージョン: 102.0.5005.63（Official Build）（64 ビット）


```vb:VB.NET
''' <summary>
''' Chrome印刷
''' </summary>
''' <param name="driver"></param>
''' <param name="loopSpan"></param>
''' <remarks></remarks>
Private Sub PrintPage(ByVal driver As IWebDriver, Optional ByVal loopSpan As Integer = 500)

    Dim whandles = driver.WindowHandles
    Dim oldLastTab = driver.WindowHandles.Last()
    Dim executor = CType(driver, IJavaScriptExecutor)
    executor.ExecuteScript("setTimeout(function(){window.print();}, 0);")

    While True
        Thread.Sleep(loopSpan)
        whandles = driver.WindowHandles
        Dim lastTab = driver.WindowHandles.Last()

        If lastTab <> oldLastTab Then
            driver.SwitchTo().Window(lastTab)
            Exit While
        End If
    End While

    Dim jsPath As String
    Dim selectElement As IWebElement

    '印刷縦横クリック
    jsPath = "return document.querySelector('body > print-preview-app').shadowRoot.querySelector('#sidebar').shadowRoot.querySelector('#container > print-preview-layout-settings').shadowRoot.querySelector('print-preview-settings-section > div > select')"
    selectElement = executor.ExecuteScript(jsPath)
    Thread.Sleep(2000)

    'ArrowDownで横を指定
    selectElement.SendKeys(OpenQA.Selenium.Keys.ArrowDown)
    Thread.Sleep(2000)

    '印刷開始
    jsPath = "document.querySelector('body > print-preview-app').shadowRoot.querySelector('#sidebar').shadowRoot.querySelector('print-preview-button-strip').shadowRoot.querySelector('div > cr-button.action-button').click();"
    executor.ExecuteScript(jsPath)
    Thread.Sleep(2000)

    'Windows切り替え
    driver.SwitchTo().Window(oldLastTab)

End Sub
```
システム監査

## システム監査
<b>システム監査人が、監査対象から独立した立場で行う情報システムの監査。
独立かつ専門的なさちばのシステム監査人が点検・評価・検証する。システム監査人には、外観上・精神上の独立性、職業倫理が求められている。
### システム監査基準
<b>経済産業省が策定したもの。
## システム監査の手順
### システム監査計画の作成
<b>監査手続の内容や時期、範囲などについて、適切な監査計画を立案する。
### システム監査の実施
<b><font color = blue>予備調査</font> -　アンケートなど
<font color = blue>本調査</font> - <font color = blue>監査証拠</font>を入手する
評価・結論 - <font color = blue>監査調書</font>にまとめる
### 監査証拠・監査調書
<b><font color = blue>監査証拠</font>は、システム監査人が被監査部門から得た情報を裏付けるための文書や記録
<font color = blue>監査調書</font>は、システム監査人が行った監査業務の実施記録で、監査意見の根拠となるもの
### システム監査の報告
<b>システム監査人は目的応じた<font color = blue>監査報告書</font>を作成する
### フォローアップ
システム監査人は改善案に対する改善状況をモニタリングする。改善命令を出すのは監査依頼者。
## 内部統制
<b>企業自らが業務が適正に遂行していくために、経営者の責任で体制を構築して運用する仕組み。役割や権限を明確にする。これを<font color = blue>職務分掌</font>
経営層の暴走や不正を防止するために、株主や監査役により企業経営そのものを監督・監視する仕組みがある。これを<font color = blue>コーポレートガバナンス</font>という。
Data Center Services and Its Different Types

Data Centers, for all intents and purposes, are structures that provide shared access to applications and data using a complex network, compute, and storage infrastructure.

From small server rooms to groupings of geographically distributed buildings, data centers come in all sizes and shapes, but one thing they all have in common is this: data centers are critical assets where companies often invest in and deploy the latest advances in data center networking, computing, and storage technologies.

Types of Data Centers

Rather than being a space dedicated to on-premises infrastructure, today’s data centers contain on-premises systems in conjunction with cloud infrastructures that will make use of virtualized networks, applications, and workloads across multiple private and public clouds.

Enterprise Data Centers are usually designed and maintained by a single organization for its own internal needs. Technology giants typically have them.

    Colocation Data Centers are rentals of data center space and resources that are made available to people who wish to access them.

    Managed Service Data centers take care of aspects such as data storage, computing, and other services directly for customers.

    Cloud Data Centers provide customers with distributed and managed services provided by third parties.

    Multi-tenant Data Centers also known as Wholesale Data Center profits for large companies that need big spaces than a typical colocation provider would     deal with. Wholesale colocation is generally offered at cheaper rates compared to retail colocation.

Source: https://www.esds.co.in/blog/data-center-services-and-its-different-types/
【GraphQL × Relay】Fragmentを@inlineで読み込む

### Fragmentをinlineで読み込む方法
主にRelayでFragmentを展開する方法として「useFragment」と「readInData」があり、useFragmentを使うのが基本ですが、useFragmentでデータがうまく取れず、代わりにreadInDataを試したところうまく動いたため、その時の備忘録です。
※この記事のAPIはGithub Graphql Apiを使っています


```tsx
import { graphql } from 'react-relay'

export const repositoryQuery = graphql`
  query repositoryQuery {
    repository(owner: "Yosuke23" name: "nextjs_relay_demo") {
      ...repositoryFragment
    },
    user(login: "Yosuke23") {
      ...userFragment
    }
  }
`
```
このrepositoryFragmentをuseFragmentではなくreadInDataで読み込みたい場合は、、、

```tsx

import { graphql } from "relay-runtime";

export const repositoryFragment = graphql`
    fragment repositoryFragment on Repository @inline{
         name
         url
         createdAt
    }
`
```
fragmentオブジェクトの頭に@inlineを指定してコンパイラーを走らせます

👇がこのfragmentの読み込み方法です
```tsx
import {repositoryFragment$key as repositoryFragmentRef} from '../../queries/__generated__/repositoryFragment.graphql';
import { repositoryFragment } from '../../queries/repositoryFragment';
import { useQueryLoader, readInlineData } from 'react-relay'
import type {repositoryQuery as repositoryQueryType} from '../../queries/__generated__/repositoryQuery.graphql';
import {repositoryQuery} from '../../queries/repository';

  const [, loadRepositoryQuery] = useQueryLoader(repositoryQuery, initialRepositoryRef!)
  useEffect
    (() => {
      loadRepositoryQuery({})
    }, [])
```
まず大元のクエリであり、repositoryFragmentを含むrepositoryQueryをロード。
repositoryQueryをロードしてもrepositoryFragmentは展開されないのでuseFragmentもしくは readInlineData（今回はこっち）でFragmentオブジェクトを「使える様に」展開。




```tsx

  const githubRepositoryData = readInlineData<repositoryFragmentRef>(repositoryFragment, githubDemoContext?.data?.repository ?? null);

```
repositoryFragmentRefはrepositoryFragmentコンパイル時に生成されるKey型
第一引数は、普通にrepositoryFragment自体のgraphqlファイルで第二引数は実際そのfragment
箇所にセットされる実データ。
$key型に合う様に渡してあげる。
これで、fragmentデータの取得ができました。

参考：https://relay.dev/docs/api-reference/graphql-and-directives/#inline
M5Stack Core2: UIFlow の使い方 (Blockly)

![blockly01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/d0869a6a-e7af-f0be-631f-bc40d7b464c2.png)

まず左の画面で、タイトル、テキスト、円を配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/42765aef-aa2b-db6d-e4b1-10f66615521d.png)

次に右の画面で、ブロックを組みます。
変数は、x と y　を使います。
![blockly02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/761faf14-9374-2ad0-df5d-8538a8d4cbcc.png)

これに対応する Python のプログラムです。

```py
from m5stack import *
from m5ui import *
from uiflow import *
import time

setScreenColor(0x222222)

x = None
y = None

Blockly = M5Title(title="Blockly Test", x=3, fgcolor=0xFFFFFF, bgcolor=0x0000FF)
circle0 = M5Circle(46, 182, 15, 0xFFFFFF, 0xFFFFFF)
label0 = M5TextBox(46, 57, "Text", lcd.FONT_DejaVu24, 0xFFFFFF, rotate=0)
label1 = M5TextBox(45, 100, "Text", lcd.FONT_DejaVu24, 0xFFFFFF, rotate=0)

x = 0
y = 0
while True:
  label0.setText(str(x))
  label1.setText(str(y))
  x = x + 1
  y = y + 2
  wait(1)
  wait_ms(2)
```

実行結果
![IMG_20220606_135345.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/f15d1081-6255-d770-1f8e-f3dbbf5a32bb.jpeg)
DX推進！リアルタイム画像認識（物体検出）

![DX.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633992/3ebd9faa-6bf5-f6f3-c674-a411eb973959.jpeg)

エスプリフォートでは、DX W（ディー・エックス・ダブル）ラボにてAI画像認識を用いたリアルタイムで自動検知するシステムを、デジタルトランスフォーメーション（DX）として推進中です。
これら技術や他の技術などの使いどころを見極めた上で、顧客への新しい付加価値を創っていっています。

本稿では、エスプリフォートでDX推進中のリアルタイム画像認識や取り組み事例を少しご紹介いたします。

## リアルタイム画像認識 YOLO

今までの画像認識のアルゴリズムである”R-CNN系”や”DPM”は、画像の領域推定と分類が分断されています。そのため処理が複雑であり、処理時間もどうしても長くなることも多かった。

そこで、「YOLO」では新しいアプローチとして、画像認識を回帰問題に落とし込み、”画像の領域推定”と”分類”を同時に行うことで実現しました。
「YOLO」のアルゴリズムは１つのCNNで完結するためシンプルであり、また既存の手法と比較して次のようなメリットを得ることができます。

## YOLOのメリット

:::note info
**１．シンプルなネットワーク構成による処理の高速化**
Titan X GPUの検証では45fps、高速なバージョンであるFast YOLOでは150fpsの結果が出ています。
これは他のリアルタイムシステムの2倍のmAP(mean average precision)を示しています。
:::

:::note info
**２．背景と物体の区別がしやすいため、背景を物体と誤認識しにくい**
Fast R-CNNではRegion proposalで抽出した領域のみのコンテキストしか見れないため、背景と判断すべき領域を間違うことがあったが、YOLOは画像全体を見るのでクラス（物体の種類）とその外観に関するコンテキスト情報を暗黙的にエンコード（暗号化）するため、背景の間違いが少ない。
以前トップの検出手法であったFast R-CNNと比較して、YOLOは半分以下の背景エラーであった。
:::

:::note info
**３．推測技術の正確性が高い**
花などの自然の画像を学習させてアート作品のような絵の画像でテストした場合、YOLOはDPMやR-CNNよりもはるかに優れている。
:::


## YOLOのデメリット

:::note alert
**最先端の手法と比較して精度が低く、「小さいもの」の検出が苦手**
YOLOは分割されたグリッドサイズは固定で、グリッド内で識別できるクラスは1つ、検出できる物体の数は2つという制約があります。
そのため、グリッド内に大量の物体（オブジェクト）が映ってしまうような画像や小さな物体の検出する場合は物体検出の精度が低くなり、検出が困難になります。
:::


## YOLOの活用事例としての一部を紹介します。
- 自動運転
- スマート監視システム
- 顔認識
- 来店顧客の来店者数及び属性分析
- ユーザーがアップロードした画像が不適切であるかの検出
- 展示会やスタジアムでのマスクの未着用者を検出
- 工場における製造製品の不良品検出

https://www.esprit-fort.co.jp/


https://www.esprit-fort.co.jp/recruit/
【ドキュメント作成に】矢印をかんたんに入力する方法【Mac】

# はじめに

矢印など、ドキュメント作成によく使う記号を、かんたんに入力する方法の覚書です。（Mac向け）
覚えておくと、議事録や仕様書の作成が捗ります:v:

# やりかた

* 日本語ローマ字入力モードにします
* あとは、下記のとおりの順番でキーを押せばOK

## 矢印
### →（右矢印）
```
z + l
```

### ←（左矢印）
```
z + h
```
### ↓（下矢印）
```
z + j
```

### ↑（上矢印）
```
z + k
```

## 隅付きかっこ（おまけ）

### 【　（左隅付きかっこ）
```
option + 8
```
※optionを押しながら

### 】　（右隅付きかっこ）
```
option + 9
```
※optionを押しながら
# さいごに

お読みいただき、ありがとうございました:relaxed:
ArgumentError: wrong number of arguments (given x, expected y)

# このエラーは何？

- 引数で求めている数が本来はy個なのに、x個与えられているよ
- 引数で必須の引数の数を入れてね。

# サンプル

以下のようなコードに対して、

```ruby

def add(a, b, c)
   a + b + c
end

```

引数が足りないものを呼ぶとエラーになる。

```

add(1,2)

# => ArgumentError: wrong number of arguments (given 2, expected 3)
```

# 今回ハマった問題

- メソッドの呼び出し位置によって、引数の数が変わる処理をした際

```ruby
def add (a, b, c)
   a + b + c
end

add(1, 2, 3) => 6 で出力される
add(1, 2) => 3で出力させたいけど、cがないのでArgumentErrorが起こる

```

- こういう場合は、cが存在しなければ0になるように代入してあげればよい。

```ruby
def add (a=0, b=0, c=0)
   a + b + c
end
```

```ruby

add(1,2) => 3 
add(1,2,3) => 6

```

- 引数の持ち方としてオプショナル引数にすれば、パラメーターの有無を考慮してデフォルト値を入れてくれるので、必須パラメーターの数は整合し、ArgumentErrorが起こらない

-  パラメーターが必ず入力されるものではない場合、必須引数（Required Parameter)ではなくオプショナル引数（Optional Parameter)を代入すべし

https://secret-garden.hatenablog.com/entry/2022/03/11/210246
Intel Fortran Compiler Classic & Intel Fortran Compilerのインストール方法

# はじめに

Intel Fortran Compiler ClassicおよびIntel Fortran CompilerはIntel oneAPIに含まれており、[Intel oneAPI Base Toolkit](https://www.intel.com/content/www/us/en/developer/tools/oneapi/toolkits.html#base-kit)および[Intel one API HPC Toolkit](https://www.intel.com/content/www/us/en/developer/tools/oneapi/toolkits.html#hpc-kit)をインストールすれば利用することができます。しかし、Base & HPC Toolkitには不要なライブラリやツールまで含まれているため、両方のToolkitをインストールすると20GB程度のディスク容量を消費してしまいます。これを避けるためにIntel Fortran Compiler Classic & Intel Fortran Compilerのみをインストールする方法を紹介します。

# インストール方法

Intel Fortran Compiler Classic & Intel Fortran Compilerをスタンドアローンでインストールするファイルを[Intel oneAPI standalone component installation files](https://www.intel.com/content/www/us/en/developer/articles/tool/oneapi-standalone-components.html#fortran)からダウンロードします。
Windows版はダウンロードしたexeファイルを実行して画面に従ってインストールしてください。Linux版はダウンロードしたshファイルをコマンドラインから実行します。引数をつけなければGUIモードで起動しますが、CLIモードで起動したい場合は下のようにオプションを加えてください。

```
$ sudo ./l_fortran-compiler_p_2022.1.0.134.sh -c -a
```

`-h`オプションを加えるとヘルプが表示されます。デフォルトのインストール場所`/opt/intel/`から変更したい場合などは、ヘルプを参照してオプションを追加してください。
VS CodeでのLaTeXの強制改行を召喚するスニペット

なかなか強制改行`\\`をスニペットで使える方法が無かったので，試行錯誤でやってみたらできたのでメモ程度に書いておきます．

方法としては，`\\\\\\\\`でできます．(`\`を8回)

以下は共同実験者が書けるスニペットです．
```latex.json 
    "共同実験者": {
        "prefix": "Collaborator",
        "description": "Insert Collaborator tabular",
        "body": [
            "% 共同実験者の表を作成",
            "\\begin{table}[hbtp]",
            "\t\\caption{共同実験者}",
            "\t\\label{table:Collaborator}",
            "\t\\centering",
            "\t\\begin{tabular}{lcr}",
            "\t\t\\hline",
            "\t\t学籍番号\t& 氏名 \\\\\\\\",
            "\t\t\\hline \\hline",
            "\t\t学籍番号$1 & hoge$2\t \\\\\\\\",
            "\t\t学籍番号$3 & fuga$4\t \\\\\\\\",
            "\t\t学籍番号$5 & hogegfuga$6\t \\\\\\\\",
            "\t\t\\hline",
            "\t\\end{tabular}",
            "\\end{table}"
        ]
    }

```

`latex.json`に記述すれば使えると思います．(カンマ`,`に注意！)

では．
Laravelのバリデーションルールで新規登録時と更新時で分けたい

# やりたいこと１
保存（store）、更新時（update）のメソッドで、バリデーションルールを追加すると思いますが、uniqueなどを使うときに、新規登録時と更新時で振り分けたい場合があります。
その場合に、必須チェックなど共有したいルールもあり、別のバリデーションを用意するのはちょっとなぁ...というときに使えます。

# 現在のルーティングによって分岐する方法

```php

public function rules() {
    $route = $this->route()->getName();

    \Log::info($route);
}

```

`user.store`などが返ってきます。


# フォームの入力値を取得して分岐する方法
```php

public function rules() {
    $postId = $this->id;
    $userId = $this->user_id;
}


```

`$this`で取れます！
更新時のみidがあるという作りであれば、こちらで分岐してもよいと思います。

# やりたいこと２
テーブル内で名前などを一意にしたい
やりたいこと１の分岐と組み合わせて使います。

新規登録時は、他のレコードと重複していてはいけない。
更新時は、自分のレコードとは重複していていいが、他のレコードと重複していてはいけない。
かつ、ソフトデリートも考慮。

```php
<?php
public function rules()
{
        if(isset($this->seminarId)) {
            $countRule = Rule::unique('seminars', 'count')->whereNull('deleted_at')->whereNot('id', $this->seminarId);
        } else {
            $countRule = Rule::unique('seminars', 'count')->whereNull('deleted_at');
        }
}

$rules = [
            'count' => ['required', 'numeric', $countRule],
         ];
```
access2000の作法 その29

# 概要
access2000の作法、調べてみた。
練習問題、やってみた。


# 練習問題
セキュリティの警告、「コンテンツの有効をクリック」を促せ。

# 方針
オープニングフォームを作る

# オープニングフォームを作る手順。
- 作成　フォームデザインを開く
- ラベルを設置
```
「セキュリティの警告」が表示されている場合は、「コンテンツの有効化」をクリックして許可して下さい。
```
- プロパティシートを開く
- イベントを開く
- ロード時、コードビルダーを開く
```
Private Sub Form_Load()
	DoCmd.Close acForm, Me.Name
	DoCmd.OpenForm "menu"
End Sub
```
- フォームを閉じる
- openingで保存する
- Accessのオプション画面を開き、「現在のデータベース」を選択します。
- Access起動時に開くフォームを指定するため、「フォームの表示」に「opening」を設定します。

以上。
Vue大好きマンがReactの勉強のために人生グラフメーカーを作ってみた

プロジェクトでReactが必要になったので勉強＆練習がてらアプリを作ってみました。

# この記事の中身
- React初学者のポエム
- 他人のアプリ制作プロセスに興味ある人向け
- フレームワークやツールの詳細な使い方などはありません
# 完成品
[LiGraph - 人生グラフメーカー](https://ligraph.web.app/)
# 使ったもの
React
Supabase(DB, StoredFucntion)
Firebase(Hosting)
# 経緯
今まで主にVueを使っていたけど、都合によりReactが必要になった。
習うより慣れろ！ということで簡単なアプリを作ってみることに。
個人的なプロジェクトで某社長にインタビューしたくて、人生グラフ（[厚労省： ライフラインチャート](https://www.mhlw.go.jp/file/06-Seisakujouhou-11800000-Shokugyounouryokukaihatsukyoku/0000199583.pdf)）を依頼したかったのだが、手描きしてもらうのも面倒だなぁと思い、アプリ化することに。
「3日で作った。」とか言いたかったけど、1ヶ月くらいかかった（1人月ではない）。

今見たら最初のコミットが5/6だったのでちょうど1ヶ月だった。
仕事終わりや土日にちまちま作ったので、5〜6人日くらい？

# 技術選定のポイント
## フロントエンド
プロジェクトの構成になるべく寄せて、Nextを使わずReactだけで。
TSは使用。
グラフは[Apex Charts](https://apexcharts.com/)を使用。

意外にハマったところは数値の入力。
単純に-100から100が入力できればいいのに、それ以外の数値や文字列を除外しようとすると案外面倒なことを知った。
HTMLの仕様。
あまり時間かけたくないので諦めて[ReactWidgets](https://jquense.github.io/react-widgets/)に頼った。
それでもまだちょっと挙動が微妙なので要改善。
## バックエンド
サーバレスかつ無料で行きたかったけどFunctionが使いたかったのでSupabaseを選択。
ストアドファンクションが使えて、データの出し入れ程度のfunctionなら十分使える。
ただしSQL苦手なので簡単なfunctionで結構苦戦した。
PstgreSQLのストアドファンクションに関する情報、意外と少ない。
ストアドファンクションさえ書ければ、フロントから呼び出すのは超簡単。

現時点で使用しているのは1テーブルのみ。
当初からスモールなアプリを計画していたので、正規化もせずJSONのまま突っ込んだりしている。
ただ、実際に使ってもらったりする中で、機能追加の要望等もあるので、拡張を検討中。

## インフラ
ホスティングにFirebaseを選んだのは単純に `.web.app` ドメインが使いたかったから。
初めに `project-id.firebaseapp.com` というドメインが割り当てられて、あとから ligraph.web.app を作成したら、表示されるまで1週間くらいかかって不安になった。
単にDNSの問題だと思うけど、https://www.whatsmydns.net/ 等で調べても正しいIPが出てくるし、表示されない理由がわからなくて困った。
あとはFirebaseHostingの仕様上、同じアプリがいくつものドメインに乗っかってしまっているので、リダイレクト設定しないとなぁと思っているけどまだできていない。

## Auth
現時点ではアプリにアカウントは設けていない。
自分で作った人生グラフは編集用パスワードを使って編集するという仕様。
今後どこかのタイミングでログイン機能は必要になってきそう。

# 今後の展望
妻がこのアプリを使ったイベントを企画してくれたりしたこともあり、ユーザーが増えつつある。
生の声が直で聞けるので、その声を開発に反映していきたい。
印象的には好評。
「使い方がわかりやすい」「簡単」という声が多い。
UIにはこだわりがあるので嬉しい。

現時点で出ている要望は、
- グラフを複数軸にしたい（仕事とプライベートなど）
- 未来のグラフを作りたい
- 今作ったグラフを保存しておいて、あとから作るグラフと比較する機能が欲しい
- UIの改善

など。

## 収益化
せっかくアプリを作ったのだから収益化したい。
広告？売却？
色々やり方はあるだろうけど、まだ個人開発アプリの収益化経験はないので少しずつ開発を進める中で探っていきたい。

ひとつ面白いアイデアを頂いたのが、このアプリを使った研修で儲けるというもの。
人生グラフはすでに企業の研修や就活生の振り返りなど様々なシーンで活用されているので、そういうところにアプリを持っていって、研修で稼いではという話。
自分は引きこもり開発者なのでそういうのは得意ではないが、やり方としては面白そうだと思った。

# まとめ
Vue大好きマンだけど、Reactも楽しかった。
多くのPJで使われているだけあって導入が簡単だし、学習コストもそれほど高くないのかなと感じた。
わからないところは `vue computed react` とかでよくググった。

今はコンポーネントの肥大化やパフォーマンス（メモ化など）、グローバルな状態管理に悩んでいるところ。
アプリを成長させる中でパフォーマンスを意識したリファクタとかもやっていきたい。

あと、関係ないけど[solidjs](https://www.solidjs.com/)が気になっている。

終わり。
【Fast Notion】スマホでさくっとNotionにメモする方法

# はじめに
ちょっとしたアイディアをスマホでNotionにメモしたいケースがよくあると思います。
そういう場合、時間をかけずにさくっとメモしたいのですが

- Notionを開く
- Notion起動待ち（★）
- メモ用のページを開く（★）
- メモを入力

など、パパッとメモしたいだけなのに意外と時間がかかってしまうなぁと感じていました。
（★の部分が特に時間かかる）

そんなとき、簡単にNotionへメモを送信できる便利なアプリを見つけたのでご紹介します。

# 解決法
Fast Notionというアプリを使用します。

![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/761132/a2244a5b-2173-2292-9e8a-43e55d466b45.gif)

上記gifのように、Fast Notion上でメモ入力・送信をすると
事前に指定したNotionのページに入力内容が反映されます。

Notionよりもアプリの起動時間が早く、ページを探す手間もないので重宝しています！

![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/761132/f84a7d2a-e3e5-fc00-2c03-7dc70883e7e9.gif)

TODO形式でメモすることも出来ます。
私は使ったことありませんが、有料プランだとデータベースへの投稿も出来るようです。

# 導入方法
公式サイトのApp Store、Google Playリンク経由でアプリをダウンロード
https://fast-notion.com/

設定方法や使い方は公式のマニュアルをご参照ください。
https://fast-notion.com/manual

:::note info
2022年6月現在はかんたん設定モードという設定方法が推奨されているようです。
:::
メタバースの普及について

## メタバースの普及について
メタバース交流会に参加し、LTに登壇したので、資料を共有。

<iframe src="https://docs.google.com/presentation/d/1FL7b4gDXQkcJgM2_dD2v8bnkfhxff_p-Xb8nvKBCa94/embed?start=false&loop=false&delayms=3000" frameborder="0" width="500" height="569" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>
sklearn　ラベルエンコーディングのやり方

```python
from sklearn.preprocessing import LabelEncoder
enc = LabelEncoder()
df['Honorific'] = enc.fit_transform(df['Honorific'])
```

## 参考

[sklearn.preprocessing.LabelEncoder — scikit-learn 1.1.1 documentation](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html)

[機械学習モデルにおけるカテゴリ変数の数値化手法4選～扱い方から注意点](https://thefinance.jp/datascience/201109-2)
AWSCloudwatchLogsでCSVダウンロード時のTimeStampを日本時間（JST）に置き換える方法

ググってもなかなか出てこなかったので、残します。
実は結構悩んでる人多かったりしませんかね？

Cloudwatchlogsだと、ちゃんと`YYYY-MM-DDThh:mm:ss.sss`　みたいな形で表示されるんですよね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213689/e8690faa-1d68-9952-27f5-655cfce0fad9.png)

CSVでダウンロードするとこんなUnixタイムスタンプになってます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213689/82fa078e-68c5-3870-4c17-cd8b94d12746.png)


`1654476988822`　を日付に変更しなきゃ人間には読めないですよね。

A2のデータをJSTにするなら以下の計算式を入れればOK
```
=((A2/1000)/86400)+DATEVALUE("1970/01/01")+TIME(9,0,0)
```


EXCELのセルの書式設定はユーザ定義で以下を指定。
```
yyyy-mm-dd hh:mm:ss.000
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213689/98975db8-2b61-c0fc-0cf3-de0dc8d11f92.png)

B2セルに日付と時間が出ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213689/4687509a-9145-e277-8ca0-94cd8e57cea2.png)
access2000の作法 その28

# 概要
access2000の作法、調べてみた。
練習問題、やってみた。

# 練習問題
ログを獲れ。

# 方針

ログ用、テーブルを使う。

# ログを作る手順。
- リボンの「作成」→「クエリデザイン」を選択します。
- 「テーブルの表示」が表示されますが、ここでは追加せずにそのまま閉じます。
- 画面左上の「SQL 表示」をクリックします。
- SQL を記述します。
```
CREATE TABLE ログ(発行日 DATETIME, 内容 TEXT(255));
```
- 画面左上の「実行」をクリックします。
- menuフォームを右クリック。
- デザインビューを開く
- ボタンを設置
- ウィザードが開く	キャンセル
- プロパティシートを開く
- イベントを開く
- クリック時、コードビルダーを開く
```
Private Sub コマンド19_Click()
    WriteLog "test ok"
    MsgBox "ok"
End Sub

Public Sub WriteLog(Message As String)
	Dim db As DAO.Database
	Set db = CurrentDb
	db.Execute "insert into ログ(発行日,内容) values(#" & Now & "#,'" & Message & "');"
End Sub
```
- フォームを閉じる
- 保存する


以上。
ocp4-helpernodeの使ってみたら便利だった機能



# はじめに
OpenShiftをUPI(User Provisioned Infrastructure)インストールする時、DNSやDHCPなどなどOCPの導入や実行に必要なサービスを用意する必要があります。ただ、こういったサービスを手動でいちいち構築するのは面倒です。そこで、OCP4 Helper NodeというAnsibleのPlaybookを利用すると、作業時間を非常に短縮できます。

>OCP4 Helper Node
>https://github.com/redhat-cop/ocp4-helpernode

このPlaybookは非常に優秀で、OCPをUPI導入するときの手間をかなり軽減してくれます。
一方、ドキュメントには最低限のことしか書いていない、という気がします。せっかく便利な機能があるのに、これまで気づかなかった！構築後に気づいた！みたいなことがありました（ちゃんとPlaybookを読んでから使え！という話もあります）。
そこで、備忘録も兼ねてこの記事に便利だった機能を書いておこうと思います。

# NTP

OpenShiftクラスター内のノードはNTP(chronyd)で時刻同期する必要があります。クラスターの導入後にMachineConfigを作って設定してもよいのですが、実はocp4-helpernodeでMachineConfigを作ってくれます。こちらの例に載っていました。

https://github.com/redhat-cop/ocp4-helpernode/blob/main/docs/examples/vars-chrony.yaml

~~~shell
chronyconfig:
  enabled: true
  content:
    - server: 0.centos.pool.ntp.org
      options: iburst
    - server: 1.centos.pool.ntp.org
      options: iburst

~~~

# レジストリーのミラー

OpenShiftクラスターがインターネットに直接アクセスできない環境の場合、OpenShift導入用のレジストリーをミラーしておいて、これを使って導入する必要があります。いままで、わたしは手動でセコセコ作っていたのですが、ocp4-helpernodeで自動的にミラーを作成可能だということに気づきました。
ちなみに、こちらはx86だけでなく、ppc64leアーキテクチャにも対応しています。

~~~shell
setup_registry:
  deploy: true
  autosync_registry: true
~~~


# Helper Nodeの冗長化

これはドキュメントに書いてないわけじゃないのですが、わたしはドキュメントを見逃していました（汗）。
以下のドキュメントにに冗長化する方法が記載されています。

>How to configure inventory for high availability environment
>https://github.com/redhat-cop/ocp4-helpernode/blob/main/docs/inventory-ha-doc.md

中身はkeepalivedで各サービスを冗長化しているだけなのですが、メンテナンスなどで停止できない環境の場合に重宝します。
構成完了後に一通りテストしてみましたが、きちんと冗長化出来るようです。
access2000の作法 その27

# 概要
access2000の作法、調べてみた。
練習問題、やってみた。


# 練習問題
パスワードを入力させ、正しいパスワードが入力されたときだけフォームを開く

# 方針

フォームの開くイベントを使う。

# フォームの開くイベントを作る手順。
- フォームを右クリック。
- デザインビューを開く
- プロパティシートを開く
- イベントを開く
- 開くイベント時、コードビルダーを開く
```
Private Sub Form_Open(Cancel As Integer)
	If InputBox$("パスワードを入力") <> "PASSWORD" Then
		Cancel = True
	End If
End Sub
```
- フォームを閉じる
- 保存する


以上。
【Matplotlib】Object-oriented API for Beginners

#### Introduction
Matplotlib has two interfaces:

1. Object-oriented (OO) interface 
2. State-based interface 
 
In this blog, I'll focus on 1. Object-oriented interface (OO interface).

#### What is Object-oriented interface?
In OO interface, there are two main instances:
    1. Figure
    2. Axes  
    
One Figure has more than one Axes, each of which is for an individual plot.
Briefly speaking, you make a Figure instance as a canvas, and then draw plots using Axes instances.

#### Environment 
- Python 3.7.12
- matplotlib 3.2.2
- pandas 1.3.5

#### Getting started 
(Data preparation)
Data source: https://www.kaggle.com/rishidamarla/cancer-patients-data

```python:plt_vis.py
import matplotlib.pyplot as plt
import pandas as pd # for data preperation

df = pd.read_excel("cancerDatasets.xlsx", header=0, index_col=0)
df_age = df.loc[:,"Age"]
```

At first, make a Figure and an Axes instances.
 
```python:plt_vis.py
fig, ax = plt.subplots()
```

![empty](https://user-images.githubusercontent.com/82998157/152667994-cc780653-cc57-447f-93c5-4b25f3cc8934.png)
 
Then, you can plot the data using an Axes instance.

 ```python:plt_vis.py
ax.hist(df_age, bins=range(0,81,5))
```
![hist](https://user-images.githubusercontent.com/82998157/152667999-429ab35d-eb3f-4305-afd8-e57d9f2af00b.png)

#### Customize
You can customize of figures by using methods that Axes class has.
Here, I'll introduce you some basic methods.

##### Add a title

 ```python:plt_vis.py
ax.set_title("Distribution of age of patients")
```

##### Add labels of axes

 ```python:plt_vis.py
ax.set_xlabel("Age")
ax.set_ylabel("Number of people")
```

##### Modify axis' tick locations

 ```python:plt_vis.py
ax.set_yticks(range(0,251,25))
```
![customized](https://user-images.githubusercontent.com/82998157/152668695-ceaf8174-b2a0-4045-afec-93c865294466.png)

Also, you can the same customization as above with one method.
 
```python:plt_vis.py
ax.hist(df_age, bins=range(0,81,5))
ax.set(title="Distribution of age of patients", xlabel="Age", ylabel="Number of people", yticks=range(0,251,25))
```
#### References
- https://matplotlib.org/stable/tutorials/introductory/lifecycle.html
access2000の作法 その26

# 概要
access2000の作法、調べてみた。
練習問題、やってみた。

# 練習問題
隠しフォームを表示せよ。

# 方針

ボタンは、使わない。
ラベルのダブルクリックイベントを使う。

# ラベルのダブルクリックイベントを作る手順。
- menuフォームを右クリック。
- デザインビューを開く
- ラベルを設置
- ウィザードが開く	キャンセル
- プロパティシートを開く
- イベントを開く
- ダブルクリックイベント時、コードビルダーを開く
```
Private Sub ラベル18_DblClick(Cancel As Integer)
    DoCmd.OpenForm "kanri"
    MsgBox "ok"
End Sub
```
- フォームを閉じる
- 保存する


以上。
LaravelでのWEBスクレイピング

この前から、オリジナルアプリ作成でスクレイピングまで行ったのですが、案外大変でした。

# 何が大変だったか？
## スクレイピング先ページの属性
スクレイピングするのに、属性（クラスやセレクタ）を指定しなければならず、
ページを検証ツール（デベロッパーツール）で見ながらやる必要がありました。
（Laravelでなくても基本は同じかもしれませんが）
## スクレイピング先ページのデータ構成
スクレイピングしようとしているのが、ヤフースポーツの該当プロ野球チームの選手データなのですが、
表（テーブル）になっているので、スクレイピングするときもテーブルの形式で表示させるようにする必要があります。
スクレイピングで使っているのが、Guotteなんですがコードの書き方が複雑です。
## 参考サイトを見ながら、コード記述
サイトにより、web.phpに記述したり、ScrapingControllerに記述したりといろいろです。
今回はweb.phpに記述する方法を取りましたが、書き方に苦労します。

こんな感じです。
GitHub Actionsで環境変数を設定したい時は

# はじめに

CICDなどで利用するGitHub Actions。
その中で、ユニットテストで接続するDBのURLや、パラメータ値などを設定したいというニーズが出てくることがあると思います。

Actionsが実行されている環境は、ユーザが管理するところではなく、直接環境変数を設定することができないので、どうやったらActionsの中で環境変数として動的に値を変えられるかを記載します。

# 手順

## Secretsの設定

1. リポジトリの[Settings]
1. [Secrets]-[Actions]
1. [New repository secret]
1. Name, Valueを入力してAdd

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647946/988cc568-078a-55f2-61e7-89fc8bca2efb.png)

## yml上で指定

`yml`上の`env`タグで指定することで、指定したsecretsが環境変数としてPGから読めるようになります。
こちらは、`yml`上のどのjobやstepからでも参照できます。


```.github/workflows/ci.yml
name: Node.js CI

# See: https://docs.github.com/ja/actions/using-workflows/events-that-trigger-workflows
on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main, develop]

env:
  DATABASE_URL: ${{secrets.TEST_DATABASE_URL}}
  SHADOW_DATABASE_URL: ${{secrets.SHADOW_DATABASE_URL}}

jobs:
  build:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [16.x]
        # See supported Node.js release schedule at https://nodejs.org/en/about/releases/

    steps:
      - uses: actions/checkout@v3
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'npm'
      - run: npm install
      - run: npm run lint
      - run: npm run build --if-present
      - run: npm test
```

### 特定のjobやstepでのみ使えるようにする

参考URLを見てもらえれば分かりますが、ある特定の箇所でのみ環境変数を有効にすることができます。
によって値を変えたいときに使えますね。

```yml
env:
  DAY_OF_WEEK: Monday

jobs:
  greeting_job:
    runs-on: ubuntu-latest
    env:
      Greeting: Hello
    steps:
      - name: "Say Hello Mona it's Monday"
        if: ${{ env.DAY_OF_WEEK == 'Monday' }}
        run: echo "$Greeting $First_Name. Today is $DAY_OF_WEEK!"
        env:
          First_Name: Mona
```


# 参考

- [GitHub Actions - 環境変数](https://docs.github.com/ja/actions/learn-github-actions/environment-variables)
Ubuntu20.04でTAG VLANの設定

# はじめに
Ubuntu Server 20.04 LTSでTAG VLAN(IEEE802.1Q)をしゃべらせてみようかと思ったのでメモ。

# untagのVLANが無い設定
ネットでググるとUbuntuでTAG VLANの設定例が多数ありますが、どれも untag + tag 混在環境でした。 主たる接続をuntagにして、追加の接続をtagにしてました。

今回は、すべてtagにしたかった。どうやるんだろ。いろいろ思考錯誤してみた。

こんな感じでいいようです。eth0は実際の環境に合わせて読み替えてください。

```
network:
    ethernets:
        eth0:
            dhcp4: false

    vlans:
        vlan.1234:
            id: 1234
            link: eth0
            addresses: [203.0.113.2/24]
            optional: false
            gateway4: 203.0.113.1
            nameservers:
               search: [example.jp]
               addresses: [198.51.100.1,192.51.100.2]
        vlan.4567:
            id: 4567
            link: eth0
            addresses: [192.0.2.1/24]
            optional: false
    version: 2
```

設定後 「netplan apply」して、エラーが出ないか確認してください。
tweepyのStreamListenerやStreamが色々使えない問題

# はじめに
最近、twitterのクローリングをお願いされ、tweepyを使用することにしましたが、色々タイミングが悪かったようなので同様にお困りの方は、バージョンを揃えて以下のとおり試してみてください。

# 背景
そこそこ新しい環境でtweepyを使用し、ストリーミングを受信したい。単にそれだけです。笑

# 環境
* MacBook Air (M1, 2020) macOS Monterey
* python: 3.7.9
* tweepy: 4.10.0
* forego: 20180216151118

# 方法
公式ページ[（tweepy:streaming）](https://docs.tweepy.org/en/stable/streaming.html)にも記載があるとおり、以下の２とおりのやり方があると記載されています。

* Stream allows filtering and sampling of realtime Tweets using Twitter API v1.1.
* StreamingClient allows filtering and sampling of realtime Tweets using Twitter API v2.

　***しかし、[参考](#参考)に記載がありますように、１つ目の機能（TWitter API v1.1）については22/4/29以降にアプリを作成した場合には使用することはできないため、２つ目のTwitter API v2を使用する必要があるとのこと（なお、それ以外の多くの機能は、今までとおりTwitter API v1.1でも使用できます。）。***

# 結果
## Twitter API v1.1 を使用
~~~python:Twitter API v1.1（ステータス読み出し）
import os
import tweepy

TWITTER_API_KEY = os.environ['TWITTER_API_KEY']
TWITTER_API_SECRET_KEY = os.environ['TWITTER_API_SECRET_KEY']
TWITTER_ACCESS_TOKEN = os.environ['TWITTER_ACCESS_TOKEN']
TWITTER_ACCESS_TOKEN_SECRET = os.environ['TWITTER_ACCESS_TOKEN_SECRET']
TWITTER_BEARER_TOKEN = os.environ['TWITTER_BEARER_TOKEN']

class IDPrinter(tweepy.Stream):

    def on_status(self, status):
        print(status.id)


printer = IDPrinter(
    TWITTER_API_KEY, TWITTER_API_SECRET_KEY,
    TWITTER_ACCESS_TOKEN, TWITTER_ACCESS_TOKEN_SECRET
)
printer.sample()
~~~
~~~bash:Twitter API v1.1（結果）
$ forego run python twitter_streaming_api_with_tweepy.py 
Stream encountered HTTP error: 403
Stream encountered HTTP error: 403
~~~

## Twitter API v2 を使用
~~~python:Twitter API v2（テキスト読み出し）
import os
import tweepy

TWITTER_API_KEY = os.environ['TWITTER_API_KEY']
TWITTER_API_SECRET_KEY = os.environ['TWITTER_API_SECRET_KEY']
TWITTER_ACCESS_TOKEN = os.environ['TWITTER_ACCESS_TOKEN']
TWITTER_ACCESS_TOKEN_SECRET = os.environ['TWITTER_ACCESS_TOKEN_SECRET']
TWITTER_BEARER_TOKEN = os.environ['TWITTER_BEARER_TOKEN']

class IDPrinter(tweepy.StreamingClient):

    def on_tweet(self, tweet):
        print(tweet.text)


printer = IDPrinter(TWITTER_BEARER_TOKEN)
printer.sample()
~~~
~~~bash:Twitter API v2（結果）
$ forego run python twitter_streaming_api_with_tweepy.py 
省略（成功）
~~~


# 参考
* [stackoverflow(Stream encountered HTTP error: 403 Twitter API, but I have elevated access)](https://stackoverflow.com/questions/72101437/stream-encountered-http-error-403-twitter-api-but-i-have-elevated-access)
* [Deprecation announcement: Removing compliance messages from statuses/filter and retiring statuses/sample from the Twitter API v1.1](https://twittercommunity.com/t/deprecation-announcement-removing-compliance-messages-from-statuses-filter-and-retiring-statuses-sample-from-the-twitter-api-v1-1/170500)
【CONEXIOBlackBearでこんなことをやってみた】BLEセンサーを初心者がつなげてみた！

<h2><i class="fa fa-link"></i></a>BLE接続は難しい？</h2>
<p>BLEは「Bluetooth Low Energy」のことで、通常のBluetoothよりも省電力での接続を実現できます。最初はBLEの意味すらわからず、プログラミングを本格的に始めて1年程度の私でしたが、やってみると数日でBLEセンサーを<strong><a href="https://conexio-iot.jp/serviceproduct/blackbear.html?utm_source=qiita&utm_medium=blog&utm_campaign=qiita&utm_id=qiita">CONEXIOBlackBear</a></strong>につなげることができました！先輩方からも助言をいただきましたが、振り返ってみれば意外に簡単という印象でした。</p>

※そもそも**CONEXIOBlackBear**ってなに？という方は下記の記事をご確認ください！

https://qiita.com/conexioIoT/items/6de49b078bf3a59436ba
<h2><i class="fa fa-link"></i></a>BLE接続の構成</h2>
<p>今回使用したセンサーは、ユニ電子の温湿度センサー (Loggta、LoggtaCable、LoggtaWR) と、CO2センサー(Logtta CO2)です。またBLE接続を実行するためには、bluepyと呼ばれるPython用ライブラリを用いると簡単です。</p><dr>
<dr>

■ユニ電子Logttaシリーズ紹介ページ　<a href="http://www.uni-elec.co.jp/logtta_page.html">http://www.uni-elec.co.jp/logtta_page.html</a>
<p>BLE接続の構成としては、BLEセンサーはアドバタイズ(ブロードキャスト通信)で、親機であるCONEXIOBlackBearに対して「私はここにいるよ」と知らせます。その知らせをCONEXIOBlackBear上でbluepyによって取得し、温度(℃)・湿度(%)・バッテリー残量(%)・CO2濃度(ppm)を、CONEXIOBlackBear上で表示させました。</p>

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637100/f0205c9c-6906-887e-0a5c-ab0e6a97a272.png)
<h2><i class="fa fa-link"></i></a>bluepyのインストール方法</h2>
<p>bluepyをインストールする手順については以下のコマンドを<strong><a href="https://conexio-iot.jp/serviceproduct/blackbear.html?utm_source=qiita&utm_medium=blog&utm_campaign=qiita&utm_id=qiita">CONEXIOBlackBear</a></strong>上で叩くだけなので簡単です。</p>

```
# apt-get install python3-pip
# apt-get install libglib-2.0-dev
# pip3 install bluepy
```
<h2><i class="fa fa-link"></i></a>センサーをアドバタイズモード(ビーコンモード)にする</h2>
<p>ユニ電子のBLEセンサーは、初期設定のままだとiPhoneでデータを受信する設定になっています。そのためiPhone上のユニ電子アプリを使用して、BLEセンサーをビーコンモードに設定します。詳しくは上記のユニ電子URLに掲載されている資料をご覧ください。</p>
<h2><i class="fa fa-link"></i></a>プログラムの実行(温湿度センサーの例)</h2>

```
import bluepy #bluepyをimportする
scanner = bluepy.btle.Scanner(0)
devices = scanner.scan(3)　#3秒間周辺をスキャンする
for device in devices:　　　　　  
　for (adtype, description, value) in device.getScanData() 　　
　#adtypeはアドバタイズデータの種別番号
　#adtypeの意味を記述するのがdescription
　#データ本体がvalue   
　　 com_id=valueの頭文字 
　　 if desc=="xxxx" and com_id == "xxxx":　#温湿度センサーであるかのチェック        	  		      	 		 
       temp=valueから計算
       print('Temperature: %f'% temp)　#温度の表示
       humid=valueから計算
       print('Humid: %f'% humid)　#湿度の表示
       Battery=valueから計算
       print('Battery: %d'% battery)　#バッテリー残量の表示 
```
<p>上記を読んでいただければ、何をしているかは大体わかっていただけると思います。(思ったよりもプログラム量は少ないと思いました！) CO2センサーも同じように実装することができます。</p>
<p>また、「valueからの計算」については、ユニ電子から情報提供していただいたアドバタイズデータの詳細から計算しました。</p>
<p>そして…いよいよ、このプログラム(scan3.py)の実行です！

![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637100/e76c72bb-1575-db73-49d4-3153d3825a70.png)
上図のように、このプログラムを実行すると、CONEXIOBlackBearのコマンドライン上へ、温度・湿度・バッテリー残量を表示することができました！夏の暑い時期に実施した結果ですので、温度と湿度が結構暑苦しい値になっています…</p>
<p>知識ゼロからでも（もちろんベテランの方でも）思ったよりも簡単ですので、是非BLE接続を試してみてください！</p>

<strong><p>BLEセンサーを、[**CONEXIOBlackBear**](https://conexio-iot.jp/serviceproduct/blackbear.html?utm_source=qiita&utm_medium=blog&utm_campaign=qiita&utm_id=qiita)でつなげてみませんか？</strong></p>
TelegrafでkubernetesのmetricsをinfluxDBに保存するぜ(仮)


# Telegrafの導入

telegrafをkubernetesのマスターにインストールをする．

```
wget -qO- https://repos.influxdata.com/influxdb.key | sudo tee /etc/apt/trusted.gpg.d/influxdb.asc >/dev/null
echo "deb https://repos.influxdata.com/debian stable main" | sudo tee /etc/apt/sources.list.d/influxdb.list
sudo apt-get update && sudo apt-get install telegraf
```
## telegraf.conf
telegrafの設定は，`/etc/telegraf/telegraf.conf`にあるが，とてもじゃないがいじれるファイルの大きさではないため別のファイルで作成しコピーすればよし．
設定するべき項目は，以下の2つである．(influxDBがv2未満の時，outputs.influxdbを設定するといいかも)
[[inputs.kubernetes]]
[[outputs.influxdb_v2]]
の設定をする．

次にtelegrafがたたくAPIを設定するがここが一番めんどい(kubernetesのRBACをいじるぜ)．

CLIでcurlを行いアクセスできるようにする．
`curl https://127.0.0.1:6443/api/v1/nodes/{nodename}/proxy --header "Authorization: Bearer $TOKEN" --insecure`
Telegrafはシステム上指定したURLの/stats/summaryにアクセスする．そのためアクセスしてmetricsが取れているか確認する必要がある．
アクセスできなければkubernetesのRBAC認証を確認してほしい．確認する内容は以下に置く
1つ目にkube-systemのPodしかmetricsをとれなかったらkubelet-api-adminのclusterroleがmetrics-serverにclusterrolebndingを作成する
2つ目TOKENのServiceAccountがいくつかの


# influxDBの作成

influxDBの作成する．

```
wget -qO- https://repos.influxdata.com/influxdb.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdb.gpg > /dev/null
export DISTRIB_ID=$(lsb_release -si); export DISTRIB_CODENAME=$(lsb_release -sc)
echo "deb [signed-by=/etc/apt/trusted.gpg.d/influxdb.gpg] https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/influxdb.list > /dev/null

sudo apt-get update && sudo apt-get install influxdb2
```
influxDBのサイトにアクセスする，
アクセスすると初期設定ができる．


# 何か不明な点や間違いがあればコメントお願いします

_______
何かと便利だったサイト集
API
https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
RBAC認証　公式Doc
https://kubernetes.io/ja/docs/reference/access-authn-authz/rbac/#rolebinding%E3%81%A8clusterrolebinding
resourceを並べる方法
https://stackoverflow.com/questions/49396607/where-can-i-get-a-list-of-kubernetes-api-resources-and-subresources
telegrafのkubernetesのinput pluginの公式
https://github.com/influxdata/telegraf/blob/master/plugins/inputs/kubernetes/README.md
telegrafの公式github
https://github.com/influxdata/telegraf/blob/master/docs/CONFIGURATION.md#metric-filtering
投稿用テンプレート

# 概要
投稿時のテンプレート作成しました。
テンプレートは「以下コピペ」を使用。

# ソースコード
```言語名:ファイル名.拡張子
コードブロック
```

# 完成イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681113/14b30e31-389f-c0fc-aa1f-9f5c5d825f3a.png)



## 以下コピペ
```
# 概要
pass

# ソースコード
```言語名:ファイル名.拡張子
コードブロック
(```)

# 完成イメージ
画像貼り付け等

```
Railsをデプロイする時、した時のトラブルシューティング

# 前提
開発環境はCloud9
デプロイはHerokuにするものとする
勉強時に置きたエラーと解決策を書いていく
デプロイの仕方は今回は割愛

# git pushするとエラーになる
### エラー内容
普通に書いてエラーなく操作できているファイルをアップしたとしてもこんなエラーが

```言語:タイトル
ArgumentError: wrong number of arguments (given 3, expected 2)
```
簡単に説明すると
>引数が2個のはずやのに3つ渡してるぞ！！

って怒られる
書籍や動画で学んでて仮にコピペしててもなるときはある
>んなもん無理じゃん

って思ったけど大丈夫
この記事で解決
https://qiita.com/yoppy_yophy/items/af0d9eea05e524e52922
もちろん全体の記事も大切だけどこの記事の「対処」の部分を読んでほしい



### エラー内容
さぁHerokuにデプロイできたぜ！
動作確認だ！
って気合入れたらこれ

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3736343932342f37623632313331392d373335622d396365612d303137332d6331323038656366313262622e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698398/c3939cc3-15e8-487e-8623-9ec4fa1048a1.png)

特定のページで起こりえます
まず現状整理
どのページのどの処理で引っかかるか
僕の場合簡単なCURDアプリを作ったときに投稿した書き込みの編集と削除等で起こりました
ってことはその部分のコントローラーが間違えてる
ログを確認しましょう
ターミナルで
```ターミナル
heroku logs -tail 
```
これで確認できます
基本的にはここに書いてますがエラーの原因は9割の確率で
・DB関係
・コード関係
です
僕の場合はコントローラーの

```Ruby
@user = User.find_by(params[:id])
```
がだめでした
_byが邪魔してましたね
findとfind_byは似ていますが厳密には違いますので興味のある方は調べてみてください
ちなみに同時の僕は興味無いから調べなかったです
後悔しました
Rails 地図を簡単に表示させよう　Maps Embed API, iframe, HTML埋め込み編

# 完成スクショ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/2a79a2a3-6757-8b10-3cd4-12f71860d943.png)

# 機能の概要
投稿ごとに地図を表示させる
表示させる地図は、HTMLの埋め込みで実装

# カラムの追加

```
$ rails generate migration AddDetailsToPost map_emb:string
$ rails db:migrate
```

# 投稿時に、Mapの埋め込みを保存させる

```erb:new.html.erb
  <div class="field">
    <%= f.label :map_emb %>
    <%= f.text_field :map_emb %>
  </div>
```

```ruby:posts_controller.rb
    def post_params
      params.require(:post).permit(~~~~~~~, :map_emb←追加)
    end
```

埋め込みのHTMLはMapの共有→地図を埋め込む→HTMLをコピーで取得する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/0178a6ad-a668-9eb8-b571-502ebf4bb7bf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/3c4a37ff-82a1-06a5-cac8-0028c971857f.png)

埋め込み時の大きさを選択することも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/29a519bb-050a-546a-ac5a-bd046f6b6a64.png)


# 埋め込んだHTMLを表示させる

```erb:index.html.erb
    <% @posts.each do |post| %>
        <%= post.map_emb.html_safe %>
    <% end %>
```
`html_safe`を使うことで、文字列をHTMLに変換できます。

# 完成
意外と簡単に実装可能でした！
お疲れ様でした！
OWASP Top10とASVSの比較

# はじめに
こんにちは、@okazu-dm です。
この記事では、以前に公開した [OWASP ASVSの紹介](https://qiita.com/AeyeScan/items/0a5ba6605daa92a6ddee) の補足として、 同じくOWASPが公開しているOWASP Top10との違いについて紹介していきます。
また、これら2つの違いに注目した上で双方の適切な活用方法についても検討します。
ASVSについての概要はこの記事内でも触れますが、以前の記事でもまとめているため、必要に応じて参照してください。

# この記事で言いたいこと
Webサービス開発時のチーム内スタンダードを作りたい方やセキュアコーディングに利用できるチェックリストを探している方には、OWASP ASVSの採用を推奨します。

# OWASP ASVSについて
まず最初にOWASP ASVSについて触れておきます。
OWASP ASVSは、OWASPコミュニティによって公開されているセキュリティ要件やテストのリストです。
設計や実装、CIや構成管理など幅広い分野について触れていて、セキュリティに限らず一般的なWebサービス開発のベストプラクティスのような項目もあり、Webサービスの開発者は一度参照することをおすすめします。

# OWASP Top10の紹介
この章では、OWASP ASVSと比較する対象の[OWASP Top10](https://owasp.org/Top10/ja/)の概要を紹介します。
OWASP Top10は、OWASPコミュニティによって開発者の意識向上を目的に公開されているセキュリティリスクのリストです。
この中ではOWASPが定量的なデータやコミュニティ自体の判断によって最も重要であると判断した10のリスクについて、それぞれ以下のような情報をまとめています。
* リスクの概要
* リスクの防ぎ方
* 攻撃が成立するシナリオの例
* 発生数などの定量的データ

各リスクの概要や攻撃シナリオが端的にまとめられており、全体的なボリュームとしてはすぐ読める範囲に収められているため、最新バージョンが出る度に目を通すことをおすすめします。
紹介されているリスクは実装ミスやインフラ面の設定ミスによる脆弱性のほか、テストによる検出が困難なリスクもあります。
テストが困難な項目の例としては ["A04:2021 - 安全が確認されない不安な設計"](https://owasp.org/Top10/ja/A04_2021-Insecure_Design/) などがあります

# 対象バージョン
- OWASP ASVS 4.0.1
- OWASP Top10 2021

# OWASP ASVSとの比較
## 目的の違い
まず、OWASP ASVSとOWASP Top10を比較する上で、それぞれが作られた目的に着目しましょう。
* OWASP ASVS: サービス開発時におけるチェックリスト、またはそのベースとしての用途などを想定している
* OWASP Top10: 主に意識向上を目的とした文書[^1]、という記述がある

以上のように、明確に目的が違うことがわかります。

[^1]: https://owasp.org/Top10/ja/A00_2021_How_to_use_the_OWASP_Top_10_as_a_standard/

## それぞれどのような用途が適切か
以上を踏まえて、以下にOWASP Top10のサイトからOWASP Top10のユースケースについて検討した表を引用します

| ユースケース | OWASP Top 10 2021 | OWASP ASVS |
| - | - | - | 
| 意識向上 | 推奨	| |
| 訓練 | 入門レベル | 包括的 | 
| 設計とアーキテクチャ | 適切である場合もある | 推奨 |
| コーディングスタンダード | 必要最低限	| 推奨 |
| セキュアコードレビュー | 必要最低限	| 推奨 |
| ピアレビューにおけるチェックリスト | 必要最低限	| 推奨 |
| ユニットテスト | 適切である場合もある	| 推奨 |
| 統合テスト | 適切である場合もある	| 推奨 |
| 侵入テスト | 必要最低限	| 推奨 |
| ツール支援 | 必要最低限	| 推奨 |
| セキュアサプライチェーン | 適切である場合もある	| 推奨 |

ここまでの比較内容から、以下のような使い分けをこの記事では提案いたします。
- OWASP Top10
  - セキュリティに不慣れな開発者への意識向上, 啓蒙活動の教材
  - 開発組織にセキュリティ観点のレビューを導入するためのごく初期のチェックリスト
  - 最新の動向の参考資料
- OWASP ASVS
  - Webサービス開発時のチェックリスト
  - ベストプラクティス集としてトレーニングの教材などに活用

ASVSとの差異がよくわかる記述として、OWASP Top10のサイトでは、「OWASP トップ 10 をコーディングやテストの基準として使用したい場合は、それが最低限のものであり、出発点に過ぎないことを知っておいてください」という一文があります。
また、同じページから別の記述を引用すると「アプリケーション・セキュリティにおけるスタンダードを採用したいと考えている人には、OWASP Application Security Verification Standard（ASVS）を使用することをお勧めします。」ともあります。
これらの記述からもわかるように、Webサービスの開発を意識して作られたOWASP ASVSの方が幅広い範囲をサポートしているため、開発時に使う場合にはOWASP ASVSの方を採用することを推奨します。

# まとめ
今回は、以前に公開したOWASP ASVSの紹介記事の補足として、 OWASP Top10との違いについて紹介しました。OWASP Top10は、あくまで意識向上の目的としてのドキュメントであるという前提を踏まえ、Webサービス開発時のチーム内スタンダードやチェックリストとしてはASVSの採用も検討してみてください。