OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu18.04でMultipass使おうとしてエラーが出た件

私がVirtualBoxで使っているUbuntu１８.０４に、画像のようにアイコンが増えていました。

![Ubuntu−１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20977/02fe47d6-4088-649c-f1cf-224b66b8d4f7.png)

どうやらmultipassが、使えるようです。

色々ネットで記事を読み、試してみようと思いました。

下記の記事を参考にしました。

https://zenn.dev/kujirahand/articles/f70183a6f19879

https://zenn.dev/kujirahand/articles/57c367702ed1f2

https://zenn.dev/kujirahand/articles/f70183a6f19879

https://blog.amedama.jp/entry/multipass-ubuntu-vm


インスタントの作り方の参考になりました。

https://note.com/ryoma_0923/n/ncc3712446a43

コマンド一覧があり、助かりました。

https://kazuhira-r.hatenablog.com/entry/2020/02/08/013130

## いざ試したら、エラーが出ました。
```bash
launch failed: The check_kvm_support script failed to start. Ensure it is in multipassd's PATH.
```

この記事を見つけました。

https://stackoverflow.com/questions/70575250/check-kvm-support-script-failed-to-start-error-when-attempting-to-create-vm

https://github.com/canonical/multipass/issues/2336

調べていて仮想化の許可がされていないのでは？と思いました。

```bash
sudo kvm-ok
```
を実行したら、仮想化が無効と出ました。
そのため、VirtualBoxの画像の設定に、チェックをしました。
![スクリーンショット 2022-03-24 23.46.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20977/ca8ecf27-2b18-4bbc-a032-56fa14e2fce5.png)

そして、こちらの記事を参考に、KVMパッケージのインストールをしました。

https://hamamuratakuo.blog.fc2.com/blog-entry-714.html


そして、再び試しました。
```bash
~$ sudo kvm-ok
[sudo] hoge のパスワード: 
INFO: /dev/kvm exists
KVM acceleration can be used
```
そして、試したら出来ました。
```bash
:~$ multipass launch -n test1
Launched: test1  
$ multipass ls                                             
Name                    State             IPv4             Image
test1                   Running          *******        Ubuntu 20.04 LTS
                                                           
```
そして気になるアイコンをクリックして、プライマリのシェルを選択しました。
なんと仮想マシンの準備が、始まりました。
私は、先ほど作った仮想マシンがプライマリになるのかと思いました。

でも、この画像のように、2台の仮想マシンができたようです。
![VirtualBox_Ubuntu0319_24_03_2022_23_59_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20977/9162d77e-be33-5a50-49c9-974336a35620.png)

気になるアイコンをクリックして、メニューを確かめました。
![ubuntu-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20977/7521b6ec-9ef3-e382-f2a3-899cbc3f8c1b.png)

確認したら、２台出来ていました。
```bash
Name                    State             IPv4             Image
primary                 Running           *************    Ubuntu 20.04 LTS
test1                   Running           *************    Ubuntu 20.04 LTS
```

## Ubuntuなら簡単にMultipassが使える。
Multipassのアイコンが増えているUbuntuなら、仮想化が許可されている場合、コマンドで仮想マシンのインスタンスを作らなくても、アイコンのシェルを起動するだけで、仮想マシンのインスタントができることを知りました。

これは、便利だと思います。

VirtualBoxで仮想マシンを作るよりも、早くて簡単に作ることが出来ました。
etherscan のトランザクションページをバッチで落としたいがダメだったメモ

## 背景

DeFi トランザクションの確認に etherscan 使いたい(いろいろ visual がわかりやすいケースがあるので).
手動でページひらくのめんどいのでバッチで処理したい

=> ダメでした

## Crawler とか

SeleniumとHeadless ChromeでページをPDFに保存する
https://qiita.com/mochi_yu2/items/a845e52b8aa677f132bf

ありがとうございます.

このあたり参考にして PDF で保存しようとしました.

etherscan Selenium とかで一応アクセスいけるっぽいようですが, bot と判断されるようで結局 cookie とか capcha 要求されてまともに落とせませんでした :cry:

PDF として落とすと以下のような内容でした...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/a450396c-4f56-0bf7-ac4c-40b9e3e28c64.png)

ある程度手動でがんばるしかなさそうです....
違う2つのEC-CUBEサイト間で商品CSVデータを共有する

# やりたいこと
「サイトA」というEC-CUBEサイトから、「サイトB」というEC-CUBEサイトにCSVファイルで商品データを移し共有したい

### 事例

・サイトAから、サイトBへEC-CUBEサイトをお引越し
・公開しているサイトAの開発をするため、開発用にサイトBサイトを立ち上げ

# 課題
商品IDを空にしてアップロードすると新規登録され、商品IDは自動採番されてしまいAとBの商品IDが違ってしまう
あとから商品IDの変更は不可
A→B、あるいはB→Aと商品CSVでコピーするためには、商品IDを共通にする必要

# 下準備
### サイトA=サイトB間で合わせる項目

商品一覧で商品数、商品名、商品IDを合わせる
カテゴリ構造を合わせる（ID含む）
規格構造を合わせる（ID含む）

### サイトAで商品詳細を登録

# サイトAから商品CSVをダウンロード

商品CSVのデータを商品ID列を基準に整列（昇順か降順）

# サイトBから商品CSVをダウンロード

商品CSVのデータを商品ID列を基準に整列（昇順か降順）

# データのコピペ

サイトAの商品CSVデータを、サイトBの商品CSVにコピペ

# サイトBへアップロード

コピペが終わった商品CSVをサイトBへアップロード

# 画像の引越

サイトAのroot/html/puload/save_imageにある商品画像を、サイトBのroot/html/puload/save_imageへコピペ

# 確認
サイトBの商品一覧からデータの相違がないかチェック
useStateだらけのコードをスッキリリファクタした話

### はじめに
- 個人開発しているアプリでガリガリコードを書いていたら、いつの間にかuseStateだらけになったので、スッキリさせた。
- ちなみに実際にリファクタしたcommit。

https://github.com/chillout2san/next_laravel_todoapp/commit/7ee3ed30871bca80e66094788d817692cda30010


### リファクタ前の状況
- こんなログインフォームを作った。
![スクリーンショット 2022-03-01 22.17.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/973482/c2a5f952-235b-c72e-fcb5-5ef5fa3975e4.png)

- コードはこんなイメージ。実際はもっとstateが多く、コードの見通しが悪い状況でした。
あくまでイメージなので色々省略しまくっているのはご了承ください。useStateに焦点を当てるためです。

```SignIn.jsx
const SignIn = () => {
  const [ mail, setMail ] = useState('')
  const [ pass, setPass ] = useState('')
  const handleMail = (event) => {
    setMail(event.target.value)
  }
  const handlePass = (event) => {
    setPass(event.target.value)
  }

  return (
    <div>
      <p>メールアドレスとパスワードでログイン</p>

      <div>
        <p>メールアドレス</p>
        <input
          value={mail}
          onChange={handleMail}
        />
      </div>

      <div>
        <p>パスワード</p>
        <input
          value={pass}
          onChange={handlePass}
        />
      </div>

        <button>ログインする</button>

        <button>入力内容をクリア</button>
    </div>
  )
}

export default SignIn
```

### 複数のuseStateを一つのuseStateにまとめてしまう。
- ReduxのreducerやHooksのuseReducerの考え方に近いと思います。ちなみに感じたメリット・デメリットは以下のとおり。
    - Vueで例えると複数のdataを一つのstoreにまとめてしまうイメージ。
- メリット
    - 実装が簡単。
    - 関連性のあるstateを一つのオブジェクトにまとめることで可読性アップ。
    - 関連性の薄いプロパティをまとめてしまうと逆に可読性が落ちるので、その場合は分けたままの方が良い。
- デメリット
    - イベントハンドラー（ここで言うhandleMail等）はプロパティ毎に必要なので、ここは一つにまとめられない。
        - **【2022/4/5追記】**
        [コメント](https://qiita.com/2san/items/e21afa9cfcf098f81fb3#comment-f755e99f70f8ffb2d520)でイベントハンドラーを一つにまとめるコードをご提案いただきました。まさにreducerっぽい実装ですね。
    - setter（ここで言うsetUser）の引数が冗長になる。

```SignIn.jsx
const SignIn = () => {
  const [ user, setUser ] = useState({
    mail: '',
    pass: ''
  })
  const handleMail = (event) => {
    setUser((user) => {
      return {
        ...user,
        mail: event.target.value
      }
    })
  }
  const handlePass = (event) => {
    setUser((user) => {
      return {
        ...user,
        pass: event.target.value
      }
    })
  }

  return (
    <div>
      <p>メールアドレスとパスワードでログイン</p>

      <div>
        <p>メールアドレス</p>
        <input
          value={user.mail}
          onChange={handleMail}
        />
      </div>

      <div>
        <p>パスワード</p>
        <input
          value={user.pass}
          onChange={handlePass}
        />
      </div>

        <button>ログインする</button>

        <button>入力内容をクリア</button>
    </div>
  )
}

export default SignIn
```

### 参考文献
- [React公式ドキュメント/useReducer](https://ja.reactjs.org/docs/hooks-reference.html#usereducer)
- [useStateとuseReducerって実は大きな違いがある](https://zenn.dev/tis1116/articles/8b04672a0221bb)
- [useStateとuseReducerの関係（どっちが強力？同じ？わずかな違い？決定的な違い？）](https://qiita.com/daishi/items/2b56905ce16ea6d9252f)
- [【React Hooks】useReducerで複雑なstate管理を簡単にしよう](https://tyotto-good.com/blog/usereducer)
AMCI Develop Note : Three.jsを利用した3D都市モデル活用チュートリアル

![top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2585263/579dfbf6-5b0b-3b70-3fde-bfa385c8e12a.png)
# はじめに

本解説ではPLATEAUで公開しているCityGML（FBX,OBJ）データをWebサイト上で使用する方法を、AMCIでの事例を参考にし、5回に分けて説明していきます。

#### AMCI

https://amci.tokyo-omy-w.jp/

WebでのPLATEAUの3Dモデル表示から、AMCIサイト内でThree.jsを用いて表現されているエフェクトの利用方法を解説しています。本解説では3DとHTML、JavaScript（Three.js）の基礎的な知識が必要です。予めご注意ください。
# 目次

- AMCI Develop Note #00 PLATEAUモデルを表示するまで
    - https://qiita.com/ProjectPLATEAU/items/a5a64d681045ea2f76b6
- AMCI Develop Note #01 背景と地面の色の変更方法
    - https://qiita.com/ProjectPLATEAU/items/eb2f402dad4b1670a176
- AMCI Develop Note #02 射影テクスチャマッピング演出
    - https://qiita.com/ProjectPLATEAU/items/8c5c53a2892ea96b2e85
- AMCI Develop Note #03 木の葉のパーティクルを動かす
    - https://qiita.com/ProjectPLATEAU/items/2bbfcdf40b3f22c02ea9
- AMCI Develop Note #04 ビル毎に色を変えて動かす
    - https://qiita.com/ProjectPLATEAU/items/c3c596563e0f3db66fa1
【備忘録】サクラレンタルサーバでPHPとPukiwikiのアップデート

サクラのレンタルサーバーで個人的なPukiWikiを利用していたのですが、いろいろとバージョンが古くなっていたため、この機会にアップデートをしました。

基本的に各サービスの公式サイトに掲載されている手順で問題なくアップデートできますが、今後の備忘録としてまとめておこうと思います。

### アップデート前の状態
* PHP：5.6
* Pukiwiki：1.5.0

# サクラレンタルサーバーのPHPアップデート

PHPのバージョンの変更はとても簡単で、コマンドの実行等は必要なくweb上から行うことができます。
手順については、以下の公式サイトにバージョンアップの方法が掲載されています。
[PHPのバージョン変更](https://help.sakura.ad.jp/360000208581/)

簡単に説明すると以下の手順になります。
1. コントロールパネルにログイン
2. スクリプト設定->言語のバージョン設定
3. 設定でバージョンを選択する

以上の操作のみでPHPのバージョンアップは完了です。


# PukiWikiのバージョンアップ

### 事前準備
バックアップ中に不具合が起こった際、もとに戻せるようPukiWikiのディレクトリをtarコマンドなどでバックアップしておきます。

`$ tar zcvf wiki.tar.gz wiki/`

### バージョンアップ
PukiWiki1.5.0はPHP 5.6までしか対応していません。
そのままサクラのPHPの推奨となっているPHP7.4まで上げてしまうと、PukiWikiのページが表示できなくなってしまいました。
そのため、PukiWikiのバージョンアップも行っておきます。

PukiWikiのバージョンアップ方法も基本的には公式サイトに掲載されている手順で行うことができました。

[PukiWiki 1.5.0から1.5.1にバージョンアップする手順](https://pukiwiki.osdn.jp/?PukiWiki/Install/Update/1.5.1)

公式サイトにあるリンクから、「update_pukiwiki_150to151_utf8.patch」をダウンロードします。
zip版の場合はunzipで解凍しておき、PukiWikiが格納されているディレクトリと同階層に格納します。

以下の例の場合、「wiki」がPukiWikiが格納されているディレクトリになります。

```
www/
├ wiki/ 
│ ├ pukiwiki.ini.php
│ ├・・・
│ └・・・
├ update_pukiwiki_150to151_utf8.patch
├・・・
```

上記の状態になったら、次はPukiWikiの格納ディレクトリに移動し（上記の例だとwikiディレクトリ内）、以下のコマンドを実行します。

`$ patch -p1 < ../update_pukiwiki_150to151_utf8.patch`

特にエラーコマンドが出なければ、上記コマンド実行後にPukiWikiのページが表示されるようになるはずです。



# まとめ

サクラサーバーもPukiWikiも公式が充実していたため、特に問題なくバージョンアップを行うことができました。
1.5.1以降へのバージョンアップも今回と同様の手順で行えるようなので、今後も定期的にメンテナンスを行いたいと思います。
Googleで記号を検索する際のコツ

### この記事について
この記事では, 検索できない記号を調べるときのちょっとしたコツを書きます
自分も以前は記号を検索するのに一苦労してました....

## 目次

[1.はじめに](#はじめに)
[2.記号が検索できない理由](#そもそもなんで検索できない？)
[3.記号を検索するためのコツ](#じゃあどうすれば？)
[4.最後に](#最後に)

## はじめに
``` git add . ``` ←このコマンドを調べるときに
苦労したことありませんか？

苦労したことがない !?? 素晴らしいです
自分は一つ調べるのにかなり時間がかかるときがあります...

ということで同じように困ってる方がいたら
少しでも力になれるよう, この記事を書きました！

## そもそもなんで検索できない？
先に結論から述べると
**記号を検索できると, 検索するつもりなのに別のプログラムが動く可能性があるため**です

もう少し詳しく説明すると
**SQLインジェクション対策**です

記号が利用できると
悪意があるユーザーにより**不正なプログラムが実行される可能性**があります

以下で簡単な例をあげます

> ex)
> id 入力のフォームに```1' or '1' = '1';--```と入力(passwordはいらない)
>
>```sql:sql
>SELECT * FROM table
>WHERE id='1' or '1' = '1';--password=... 
>```
>上記の例ではorの後ろに'1' = '1'という条件がつき, **常にtrue**になる
>(--以降はコメントとなるためpasswordがいらない)

このように記号は使い方を間違えると危険です
興味本位でやっちゃだめですよー (大体のサイトでは対策されてると思いますが...)


## じゃあどうすれば？

記号ではなく, **言葉で表しましょう!!**

例えば
```git add . ```  のように検索するのではなく
```git add dot``` や ```git add ドット```と調べましょう！

ちなみに dot は single dot や period などでも表すことができるみたいです

ほかのよく使われる記号は下の表にまとめておきます

|記号|英語|日本語|
|:---:|:---:|:---:|
|'|single quotes / apostrophe|シングルクォーテーション|
|"|double quotes / quotation mark|ダブルクォーテーション|
|#|number sign |シャープ|
|*|asterisk|アスタリスク|
|,|comma|カンマ|
|.|dot / single dot / period |ドット|
|/|slash|スラッシュ|
|:|colon|コロン|
|;|semicolon|セミコロン|
|[]|brackets|カギ括弧|
|{}|curly braces|波括弧|
| \\ |backslash|バックスラッシュ|
|^|caret / caret operator|キャレット|
|~|tilde|チルダ|
|_|underscore|アンダースコア|
|`|grave accent|バッククオート|
| \| |vertical bar|パイプ|


余談ですが, 記号で検索できる検索サービスもあるみたいです
[『Symbol Hound』](https://orebibou.com/ja/home/201411/20141118_001/)


## 最後に
最後まで読んでいただきありがとうございました

検索サーバーは奥が深いですね...
今後は[Apache Solr](https://solr.apache.org/)あたりを勉強していきたいです！

もし間違いなどあれば, お手数おかけしますが
[@sino0042900](https://twitter.com/sino0042900)までご連絡お願いいたします

___

### 参考文献
> - [Googleで検索できる記号と出来ない記号](https://wisdomtrees.net/?p=95)
> - [SQLインジェクションとは | 具体的な攻撃例と対策方法](https://medium-company.com/sql%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3/)
> - [US English ASCII code page](https://www.ibm.com/docs/en/cobol-zos/6.3?topic=sequences-us-english-ascii-code-page)
data 関連自己記事の分類


データに関する記事を書こう！

https://qiita.com/official-events/30be12dd14c0aad2c1c2

テーマ2『データに関する記事を書こう！』参加記事です。


data で　検索にひっかかる　自己記事を分類する。

期間中に100記事までは集める予定です。

<この項は書きかけです。順次追記します。>

# 確率・統計

統計と確率一覧（０）プログラマによる、プログラマのための、統計と確率のプログラミングとその後

https://qiita.com/kaizen_nagoya/items/6e9897eb641268766909

# data analist, data scientist, 機械学習

データサイエンティストの気づき「勉強だけして仕事に役立てない人。大嫌い！」。『それ自分かも ? 』ってなった。

https://qiita.com/kaizen_nagoya/items/d85830d58d8dd7f71d07

データサイエンティストへの５つの門。あなたはいくつの門をくぐりましたか？統計と確率(8)

https://qiita.com/kaizen_nagoya/items/ee5fa7b2a7f7c2b450d4

Data Scientist の基礎(2)参考文献

https://qiita.com/kaizen_nagoya/items/8b2f27353a9980bf445c

与件解析(data analysis)入門。仮説（195）統計と確率(14)

https://qiita.com/kaizen_nagoya/items/d9474c3bdb8ea0029bee

dockerでR 難関いくつ？ docker(125) dockerで機械学習(104) 環境構築(4)

https://qiita.com/kaizen_nagoya/items/5fb44773bc38574bcf1c

Data ScientistのためのPython, R, Machine Learning/Deep Learning環境構築。docker(20)

https://qiita.com/kaizen_nagoya/items/ff16ce6f2a1af43c77f3

解析と分析の違い

https://qiita.com/kaizen_nagoya/items/1cbec26c185351b2ce3b

今、与件採り作業中の事案

https://qiita.com/kaizen_nagoya/items/7abe19fd52a7db21c9cf

# 社会

与件網(data network)が凡人網(ordinary people network)

https://qiita.com/kaizen_nagoya/items/9ca08075fb424efdc559

現場の新人教育：新人から学んで欲しいこと

https://qiita.com/kaizen_nagoya/items/4feb9af8a02074d16dc3

失敗してもめげないプログラマになるには。仮説（174）

https://qiita.com/kaizen_nagoya/items/fd4515cfb6efa769661d

プログラム初心者が知らなくてもいいこと。仮説(63)

https://qiita.com/kaizen_nagoya/items/3eaeb88e583898b8aae7

# プログラミングにおけるデータ

「@rana_kualu 2020年の開発者が知っておくべき11の必須技能」→回答編 → 並べ替え→項目合併(8項目)→内容追記。仮説（170）

https://qiita.com/kaizen_nagoya/items/39e1c69bddb8e608b42b

C++N4741 (126)12.2.3.2 Static data members [class.static.data]p223

https://qiita.com/kaizen_nagoya/items/38ec3724289f5d42cba5

言語処理100本ノック 2015 落ち穂拾い 第3章: 正規表現

https://qiita.com/kaizen_nagoya/items/1642b6a3ee4d31b7d56a

# Qiitaのデータ記事

仮説一覧 （0-202）

https://qiita.com/kaizen_nagoya/items/f000506fe1837b3590df

2018年版。立ち位置記事百(100 position papers on 2018) Qiita(19)

https://qiita.com/kaizen_nagoya/items/3fcc327f7c77cff0cfec

連休中の記事数は目標達成した。質向上のために集計。平均が無意味なことを再確認。転職(14)

https://qiita.com/kaizen_nagoya/items/138c543c5e74e380d31d

views一覧を作るまで(第一日目) Qiita(27)

https://qiita.com/kaizen_nagoya/items/7de46ac898e776834605

資料集 [あなたもdocker私もdocker一覧] docker(0) to 166+61=227

https://qiita.com/kaizen_nagoya/items/45699eefd62677f69c1d

data という文字列がある記事

https://qiita.com/kaizen_nagoya/items/cb599f716c3c25268d6f

与件(data)で当たる記事

https://qiita.com/kaizen_nagoya/items/514fbbaa91f76bc1de07

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
Git push できなかったときの対処　（個人備忘）（初心者）

# やったこと
### ローカルリポジトリ作成とGitHub上のリモートリポジトリを紐づけて、push

コマンド
``` git
git push -u origin main
```

GitHubにログインを求められる
ユーザーネームと、アクセストークンを入力（アクセストークンは事前に準備済み）

エラー
```
Logon failed, use ctrl+c to cancel basic credential prompt.

```

## どうやらGitのバージョンが古かっただけっぽい
gitをアップデート

```
git update-git-for-windows

```

vs codeのGit Bashから再度push を実行したが、失敗した。

:::note info

エクスプローラーからGit Bashを開いてpush したら成功した。

:::

****
C++のstructの比較関数の書き方メモ

# メモ
Atcoderでこちらの問題を解いていた時に分からなくなったので自分用にメモ
https://atcoder.jp/contests/abc187/tasks/abc187_d


std::sort()の第3引数に比較関数を使いたかった。

# 実装
・2022/03/22追記
[コメント](https://qiita.com/GEX777/items/25370e25c448affb0a3b#comment-08eea7b082591c469662)で良い書き方を教えていただいたので変更

~~~
struct mydata
{
	ll score;
	ll aoki;
	ll takahasi;
};

//score, aoki, takahasiの順に昇順ソート
bool mycomp(const mydata &a, const mydata &b)
{
	if (a.score != b.score)
	{
		return a.score < b.score;
	}
	if (a.aoki != b.aoki)
	{
		return a.aoki < b.aoki;
	}
	return a.takahasi < b.takahasi;
}

int main()
{
    int N;
    cin >> N;
    vector<mydata> A(N);
    //入力とか
    sort(A.begin(), A.end(), mycomp);
}
~~~

<details><summary>最初のコード</summary>

~~~
struct mydata
{
	ll score;
	ll aoki;
	ll takahasi;
};

//score, aoki, takahasiの順に昇順ソート
bool mycomp(const mydata &a, const mydata &b)
{
	if (a.score < b.score)
	{
		return true;
	}
	else if (a.score == b.score && a.aoki < b.aoki)
	{
		return true;
	}
	else if(a.score == b.score && a.aoki == b.aoki && a.takahasi < b.takahasi)
	{
		return true;
	}
	return false;
}

int main()
{
    int N;
    cin >> N;
    vector<mydata> A(N);
    //入力とか
    sort(A.begin(), A.end(), mycomp);
}
~~~

</details>

# 備考
・mycomp()内の比較が<=ではなく, <の理由は ~~これ？？？~~ よく分からない
~~http://stlalv.la.coocan.jp/sort.html~~

コメントでの補足
>>sort は同値であることをどのように判断するのでしょうか。答えは、A と B が同じであるという判断は、!(A < B) && !(B < A) で行われます。
>
>私は違うと思います. libc++をざっと見ても同値比較している箇所はありません. 比較関数に"<="を使用すると, ソート対象に同値の値があった場合に計算回数が多くなるアルゴリズムがあるからではないでしょうか. "<="でも正しくソートされるはずです.


・tupleを使うほうが楽
A5:SQL Mk-2で一時的に最大行数制限を解除

[A5:SQL Mk-2](https://a5m2.mmatsubara.com/) はデフォルトでは結果セット最大行数しか返さないが、CSVで全件出力したい場合など一時的にその最大行数制限（設定 -> オプション -> 結果セットグリッド -> 結果セット最大行数）を解除したい場合がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31934/c8d95d26-b394-011e-ffbf-680edeee8d75.png)

これをしたい場合、上記キャプチャの赤枠の下向き三角ボタンを押すと出てくる「結果セット最大行数（xxxx）の制限を一時的に無効化」にチェックを入れる。そのあと、右に三つ隣のCSV出力ボタンを押せばよい。

Version 2.17.1で確認。
go generics の練習

# これは何？

go 1.18 が正式リリースになり。
以前から無くて困っていた generics がようやく入ったので、その練習

# 最大値関数

`math.Max` が `float64` しか受け入れない厳しい世界からようやく脱却。

```go:go1.18
package main

import (
	"fmt"
	"time"

	"golang.org/x/exp/constraints"
)

func Max2[T constraints.Ordered](x, y T) T {
	if x < y {
		return y
	}
	return x
}

func main() {
	fmt.Println(Max2(1, 2))                                       //=> 2
	fmt.Println(Max2(1.11, 2.22))                                 //=> 2.22
	fmt.Println(Max2("hoge", "fuga"))                             //=> hoge
	fmt.Println(Max2(333*time.Millisecond, 444*time.Millisecond)) //=> 444ms
}
```

ここに到達するまでだいぶ時間がかかった。
`constraints` は `"constraints"` ではなく `"golang.org/x/exp/constraints"` になった模様。

`constraints.Ordered` は 比較演算子（ `<` とか）が使えるもの全部ということらしい。

# big.Int でも Max したい

`int` 用と `float32` 用を同じ定義で書けることがはわかった。
しかし `big.Int` とかもある。もちろん `big.Int` を上記の `Max2` に入れたらエラー。

```go:go1.18
Max2(big.NewInt(1), big.NewInt(2))
//=> *big.Int does not implement constraints.Ordered
```

まあそうだよね。むしろそうじゃなきゃ困る。
やりたいことは

```go:go.1.18(希望)
a := Max2(1, 2)
b := Max2("hoge", "fuga")
c := Max2(big.NewInt(1), big.NewInt(2))
```

ができる `Max2` を定義すること。
それが無理なら以下のような

```go:go.1.18(せめてこれぐらい)
x := BigMax2(big.NewInt(1), big.NewInt(2))
y := BigMax2(big.NewRat(10, 7), big.NewRat(14, 10))
z := BigMax2(big.NewFloat(1), big.NewFloat(2))
```

`BigMax2` を定義したい。これぐらいは書けるべきと思う。

しかしまだ書けていない。

「引数の型がレシーバと同じであるメソッド `Cmp` を持つ型 `T`」
という制約が必要だと思うんだけど、今の所これが書けない。

難しい。

進展があったら加筆する予定。

# BigMax への道（🍊未完🍊）

## Generics がない場合

`big.Int` だけなら、こうする。

```go:go1.18
package main

import (
	"fmt"
	"math/big"
)

func BigMaxInt2(x, y *big.Int) *big.Int {
	if x.Cmp(y) < 0 {
		return y
	}
	return x
}

func main() {
	fmt.Println(BigMaxInt2(big.NewInt(1), big.NewInt((2))))
}
```

この `BigMaxInt2` の型 `big.Int` を引数にすればいいと思うよね。

## first trial (失敗）

まずはこう書くと

```go:go1.18
type BigNumber interface {
	big.Int | big.Float | big.Rat
}

func BigMax2[T BigNumber](x, y *T) *T {
	// ↓ x.Cmp undefined (type *T is pointer to type parameter, not type parameter)
	if x.Cmp(y) < 0 { 
		return y
	}
	return x
}
```

エラー。ちょっと何を言っているのかわからない。なんかわからないけどこうしてみると

```go:go1.18
type BigNumber interface {
	*big.Int | *big.Float | *big.Rat
}

func BigMax2[T BigNumber](x, y T) T {
	// ↓ x.Cmp undefined (type T has no field or method Cmp)
	if x.Cmp(y) < 0 {
		return y
	}
	return x
}
```

メッセージが変わった。
でもどうしたらいいのかわからない。
413 Request Entity Too Large 解決方法

## エラーの原因
このエラーは、`アップロードしようとしたデータのサイズが大きすぎる`ことが原因で発生していて、Nginxの設定を修正することで解決できます!

## Nginx修正
`nginx.conf`に`client_max_body_size`の設定を追加してあげます。
・下記のパスにnginx.confが配置されてるかと思います。

```
[root@ip-???-??-??-??? ~]# cd /etc/nginx
[root@ip-???-??-??-??? nginx]# vi nginx.conf
``` 

1.nginx.confに追加

```
server {
    client_max_body_size 20M; # 追加
    listen       80;
    listen       [::]:80;
    server_name  _;
    root         /var/www/current/backend/public;
```

2.nginxをリロード

```
[root@ip-???-??-??-??? nginx]# service nginx reload
```

3.nginxの起動確認
`緑文字でactive (running)`が表示されれば正常にnginxが動作しています。

```
[root@ip-???-??-??-??? nginx]# sudo systemctl status nginx.service
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/nginx.service.d
           └─php-fpm.conf
   Active: active (running) since Thu 2022-03-24 12:43:45 UTC; 10min ago
  Process: 17808 ExecReload=/usr/sbin/nginx -s reload (code=exited, status=0/SUCCESS)
  Process: 17701 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 17697 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 17696 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
 Main PID: 17703 (nginx)
   CGroup: /system.slice/nginx.service
           ├─17703 nginx: master process /usr/sbin/nginx
           └─17809 nginx: worker process

Mar 24 12:43:45 ip-???-??-??-???.ap-northeast-1.compute.internal systemd[1]: Starting The nginx...
Mar 24 12:43:45 ip-???-??-??-???.ap-northeast-1.compute.internal nginx[17697]: nginx: the confi...
Mar 24 12:43:45 ip-???-??-??-???.ap-northeast-1.compute.internal nginx[17697]: nginx: configura...
Mar 24 12:43:45 ip-???-??-??-???.ap-northeast-1.compute.internal systemd[1]: Started The nginx ...
Mar 24 12:54:35 ip-???-??-??-???.ap-northeast-1.compute.internal systemd[1]: Reloading The ngin...
Mar 24 12:54:35 ip-???-??-??-???.ap-northeast-1.compute.internal systemd[1]: Reloaded The nginx...
Hint: Some lines were ellipsized, use -l to show in full.
```

4.ファイルのアップロード確認
再度ファイルをアップロードしてエラーが出なければ成功です！

## 参考記事

https://qiita.com/takecian/items/639deeae094466de6546
GO言語　インストール　Windows10　

# 自分のメモ代わりに

# 検証環境
OS:Windows 10 HOME
Visual Studio Code

# Go言語のダウンロード

公式サイトへアクセスし、msiファイルをダウンロードする。
https://go.dev/dl/

インストーラーを開き、基本的に「Next」→ 「Next」→ と押していけば問題ありません。
※保存先については、あとでパスの設定で必要になる恐れがあるで、メモしておく。



# インストールの確認

インストールが終了したら再起動をする。
再起動しないとパスが反映されない場合があるため。
※自分は反映されなかった。

再起動したら
コマンドプロンプトを起動してインストールした階層まで移動し以下を入力
```
go version

```
バージョンが表示されればOK。
※表示されない場合は環境変数を設定


## プログラム作成
テキストエディタでプログラム作成し、任意のフォルダー内に置く。
コマンドプロンプトでgo run hello.goと入力し「Hello!」と表示されれば成功。


hello.go
```
package main

import (
    "fmt"
)


func main() {
    fmt.Println("Hello, World!")
}
```

# Visual Studio CodeでGO拡張機能のインストール

マーケットプレイスの検索窓に「GO」と入力して「Go for Visual Studio Code」でインストールします。

![スクリーンショット 2022-03-24 215128.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200760/b9fcf931-39ea-b848-8dad-814550a328a4.png)

Ctrl + Shift + P キーを同時に押下して、検索窓より「Go:Install/Update Tools」をインストール。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200760/ddfc50c0-7abe-0757-3031-e74ab75ea8f3.png)



![スクリーンショット 2022-03-24 215655.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200760/63298c9a-6259-27b3-fb00-78793a1bf347.png)

「All tools successfully installed.」と表示されれば完了

## Go言語のソースを実行
作成したプロジェクトをVSCodeで動かして連結を確認
※F5キーで実行できます。

エラーがでたら、以下のコマンドを入力

go mod init

駄目だった場合は

go mod init github.com/castaneai/gomodtest



## 参考サイト
https://castaneai.hatenablog.com/entry/2019/02/22/151213

https://qiita.com/Topiman/items/5016048f7c0e437c0a3b#go%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

https://qiita.com/melty_go/items/c977ba594efcffc8b567

https://qiita.com/suke_masa/items/0c45c92934b9a2807ddb

https://lemon818.com/go-start/
Eclipseにおけるテーマの変更

# Eclipseにおけるテーマの変更
メニュー>ウィンドウ>設定より設定画面を表示し、一般>外観 を選択し、ルック&フィールを切り替える。
下図はクラシックを選択した場合。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/ae5cdbdb-2523-fb66-f399-1af06b9a2120.png)
良いデータ、悪いデータ、普通のデータ（２）


データに関する記事を書こう！

https://qiita.com/official-events/30be12dd14c0aad2c1c2

テーマ2『データに関する記事を書こう！』参加記事です。

良いデータ、悪いデータ、普通のデータ

https://qiita.com/kaizen_nagoya/items/7c3a919d86ad4508accd

投稿日 2019年05月02日　に投稿し、1089 views でいいねもstockともに0

# 書き直し


## 良いデータ
良いデータというものに会ったことがあるだろうか。

自分が主張したいことを、主張してくれるデータがよいデータだろうか。

それは、「都合がいいデータ」であっても、「良いデータ」かどうかはわからない。

「良いデータ」とは、複数の立場、できれば三つ以上の立場にとって、価値があるデータだと仮定しよう。

## 悪いデータ

「悪いデータ」というものがあるだろうか。「都合の悪いデータ」というのは、ときどき思い当たるかもしれない。組織にとって都合の悪いデータは、しばしば抹殺する人がいて、出会ったことがないかもしれない。

悪いデータには、いろいろ思い当たることがある。

### 重要なデータに欠落がある。

例えば、過去１０年のデータといいながら、２年前の７年前のデータがないとか。全体の２割以上の欠損があるデータは悪いデータと言えるかもしれない。

ただし、火災、戦争など、データ所有者の意図しない欠損は、「悪いデータ」と決めつけるとかわいそうなことがあるかもしれない。

### 明らかな偏りがあり、その理由がわかりにくいデータ

ある調査では、無作為抽出でAとBの選好が50%対50%だった記録があった。
それとは別にどういう抽出法を採用したかをかかずに、AとBの選好が70%対30%という記録があったとする。

抽出法などで比較できれば、貴重なデータなのに、抽出法がわからないと分析に用いることができず、無視せざるを得ないデータは悪いデータに分類しておこう。

# 普通のデータ

良いデータ、悪いデータ以外を、普通のデータに分類する。

良いデータかどうかの判定は難しく、悪いデータの判定も場合によっては難しい。

ひとまず、どんなデータも普通のデータという仮定のもとに分析するとよいかもしれない。



# 添削

元記事の評価がよくない理由を検討する。なお、上の文章は、下記検討の結果、書き直したものである。

>データ処理をする場合、良いデータ、悪いデータ、普通のデータが問題になることがある。
その前に、業務目標(business goal)または最終目標(goal)が大事。
あるいは、制約条件(constraints)が大事。分野によっては要件(requirements)ということもある。

「良いデータ、悪いデータ、普通のデータが問題になることがある。」

と書いている。具体的ではない。

「良いデータ」だと思ったことが一度もない人は、ここで脱落。
「悪いデータ」だと思ったことが一度もない人は、ここで脱落。
「普通のデータ」だと思ったことが一度もない人は、ここで脱落。

「その前に」って書くくらいなら、それを最初に書けば。

こういう文書を書く人は好きになれない。あ、自分だ。

「あるいは、制約条件(constraints)が大事。分野によっては要件(requirements)ということもある。」

断定するほどのことじゃなくね。
EclipseにおけるVimキーバインド利用方法

# はじめに
こんばんわ、きりです。
本記事は[Nablarchを使ってみよう](https://qiita.com/kirin1218/items/242ee0f174f1cb12ef17)のサブ記事として作成しております。

今回はEclipseでVimバインドを利用するための記事となります。
そもそも、Vimを利用しない方には無用な記事となりますので、[こちら](https://qiita.com/kirin1218/items/242ee0f174f1cb12ef17#nablarch%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E8%A8%98%E4%BA%8B%E4%B8%80%E8%A6%A7)より、ぜひ他の記事を御覧ください。

# Vrapperのインストール
メニュー→ヘルプ→新規ソフトウェアのインストールをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/42afb8df-9bc6-fd19-64ce-7c16b7a3fb58.png)

作業対象の追加ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/6253cce6-46e6-3fec-d4d2-4b31f929f3db.png)

名前とロケーションを入力して追加ボタンをクリック

|キー|値|
|---|---|
|名前|Vrapper|
|ロケーション|http://vrapper.sourceforge.net/update-site/stable|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/0bf936a9-53d2-db2e-11f2-1e98f5cff859.png)

「Optional Vimscript Plugins」と「Vrapper」を選択してインストールを実施

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/eebaef3b-1d68-2708-d6d8-ed62faef605e.png)

信頼に関する確認ダイアログが表示されたら、確認の上、信頼して処理を進める。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/a8531eb1-864a-cb49-9e82-6c92058c3364.png)

# vimの設定
## ESCキーの代わりにjjでインサートモードから抜ける
jjをESCキーの代わりに利用したい人なので、バインド設定をカスタマイズします。

ユーザーフォルダ(C:/Users/XXXX/)の直下に.vrapperrcファイルを作成し、以下の用に編集して保存します。

```.vrapperrc
inoremap jj <ESC>
```

Eclipseを再起動すると、編集モードでjj入力すると通常モードに戻れば成功です。

## tabをspaceに置き換える
※こちらは備忘録程度の内容です、ご自身の環境にて動作確認をお願いします。
```.vrapperrc
set tabstop=2
set shiftwidth=2
set expandtab
```

# 最後に
ほぼ、私の備忘録のような記事となってしまいましたが、お役に立てたら幸いです。

# 参考URL
[Eclipse を vi ライクに操作するプラグイン Vrapper を導入する](http://dotnsf.blog.jp/archives/1064005589.html)
data という文字列がある記事


データに関する記事を書こう！

https://qiita.com/official-events/30be12dd14c0aad2c1c2

テーマ2『データに関する記事を書こう！』参加記事です。


与件(data)で当たる記事

https://qiita.com/kaizen_nagoya/items/514fbbaa91f76bc1de07

と対比するため、Qiitaで「data」検索で出てきた自己記事以外をの一部を一覧する。
本文で「data」がある行を「>」で引用。

ただし、一人１記事までとする。数行の記事は省略しています。ごめんなさい。

本文中に「data」という文字列がなかったり、タグにdataがあるだけの記事は掲載していません。ごめんなさい。

『データに関する記事を書こう！』行事への勧誘の意味もあるかもしれません。

# data

curlのオプション--data, --data-binary, --data-raw, --data-urlencodeの違い

https://qiita.com/aosho235/items/d89bb027db0c5662d8c5

>--data, --data-binary, --data-raw, --data-urlencode はどれも似ているが、下記の点で微妙な違いがある。

[Swift] DataはSubSequenceもDataなので…

https://qiita.com/YOCKOW/items/fe412c9020f3ef0f5c7e

>「DataのSubSequenceもData」という事実1。知らないとバグを作る。知っていてもついうっかりバグを作る。なるべくそのバグを減らそうというための記事。

jQuery の data() と data- attributes

https://qiita.com/marcie001/items/8bdd4f59bb5a47f1b8bd

>data-attributes.html

Vue - data() { return {} } vs data:() => ({ })

https://qiita.com/moonlightbox/items/121e4ed00a58fc0561bb

>  data: () => ({

(data1 === data2)と(data1 != data2)の判定は、どちらが速いのか。

https://qiita.com/HadaGunjyo/items/db5db5749fc5db7587f8

>let flg = (data1 === data2);

Uipath datatableで特定の列だけ抜き出す

https://qiita.com/monolith8/items/5e934150a9525fa2f12f

> <AssemblyReference>System.Data.DataSetExtensions</AssemblyReference>

data属性の使い方

https://qiita.com/ttaka66/items/57f6929bb890bcb0249b

>data属性を使用することにより変数をタグに埋め込むことができる

デブサミ秋2015行ってきた

https://qiita.com/tora470/items/dd1af8bba41d07c8e7ab

>BigQuery & Dataflow

Data Volume と Data Volume Container

https://qiita.com/sokutou-metsu/items/b83b275198fc9594f5a4

>まずは関係ありそうな Data Volume と Data Volume Container について公式マニュアルを読んで理解してみる。なお、英語が得意でないので間違って解釈している箇所があるかもしれない。 Docker のバージョンは 1.0.0 である。

$.dataと$.attr('data-*')の違い

https://qiita.com/nyawach/items/18dc38535da36adbbff1

>jQueryの$.dataと$.attr('data-*')で取得できる値が違うのは知っていたけど、実際どこまで違うのかわからなかったので調べました。

【Android】/data/dataからファイルを読込む

https://qiita.com/katsuhisaishii/items/34ad239d47dc59ae2cd9

>アプリ専用のディレクトリである/data/data/パッケージ/filesでファイルの読み書きをすることは多いかと思います。

Data.Binary.Get with Data.Conduit

https://qiita.com/liquid_amber/items/7c69271ae5c19beee383

>import Data.Binary.Get

# まとめに変えて

反省点としては、タグを自動収集してタグ一覧をつけると、面白かったかもしれない。
どのプログラミング言語でdata という文字列を使った記事が多いかわかったかも。

ごめんなさい。下記記事を見習わなくてはいけなかった。

@torifukukaiou 【毎日自動更新】データに関する記事を書こう！ LGTMランキング！

https://qiita.com/torifukukaiou/items/b10fa94764aaaa2c6db1
浅ぁいネットワーク講座　第１回

この記事はネットワークのことをゆっくり解説していきます
その度合いは浅い（ｱｻｧｲ！！！）のでご了承ください

#### ■概念ざっくり理解していこう編

ネットワークというと何が思い浮かびますか？
いろいろ種類が多いと思いますが、我々ITエンジニアなんで
TCP/IPのことを思いだすんじゃないでしょうか

TCP/IPと言うのは世界標準的に利用されている通信プロトコルのことです。
簡単に言ってしまえば、IPを使った通信です。

他にもAppleTalkなどありますが、私はapple製品あまり使ったことないのと
対して興味がないので割愛します
まぁ、こういうネットワークのプロトコルがあったというのを理解していただければよいです

***
※apple talkとは
Mac OSに標準で搭載されていたネットワーク機能および通信プロトコルのこと。Mac OS 9までのいわゆるクラシックOSに搭載されていました。Macintoshは1984年の発売時からAppleTalkを搭載し、ファイル共有やプリンタ共有を手軽に行えました。

※プロトコルとは
コンピュータでデータをやりとりするために定められた手順や規約、信号の電気的規則、通信における送受信の手順などを定めた規格を意味します。幅広い意味合いなので適当にプロトコルって言っても大体許されたりすることもあります。
***

**じゃあ、IPはわかりましたがTCPはなんじゃい？** って思う方いると思いますが（IPは今後詳細を書きます）
TCPとは通信プロトコルのひとつで簡単に説明すると「送ったデータが相手に届いたか、その都度確認しながら通信するやり方」や「正確な信号を送信する通信の規格を定めたもの」と言えます。
この確認方法はスリーウェイハンドシェイクっていっていいます

下図のどこからか引用してきたような図をご確認していただければうっすらイメージがわかると思います

<img width="600" alt="3wayhandshake.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603003/3e4108cc-d3fc-04ea-d164-b173600a3b46.jpeg">


反対にUDPっていうのもあって、これは通信を都度確認しません
使っているサービスはntpとかdhcpなどが

例えば、以下の引用してきた図があります
なんとなく眺めてください

<img width="700" alt="portnumber.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603003/f38d2360-a4ac-16be-b5c1-66d891bc7c33.png">

>https://ipwithease.com/common-tcp-ip-well-known-port-numbers/

ひらめいた方もいるかもしれませんが、プロトコルはTCPとUDPがあって
サービス（http,ftp,sshとか）はポート（番号記載のもの）に紐づけられているので **「このポートを使えばこのサービスを使っている」** ということになります（わからないものもある）
ポートは65535まであり、1023まではウエルノンポート（Well-known Port）といい、ポート番号は予約されています

<font color="Red">**『ポート』『プロトコル（サービス）』の考え方はファイアウォールやアプリなどで重要になってくるので覚えておいて損はない！**



ちなみに「世界標準」って言葉を冒頭で使いましたが、インターネットの標準化または標準を『RFC』と言う単語で表します。
下記はRFC説明ですがめんどくさかったら読み飛ばしてOK！

***
RFCの説明
Request for Commentsの略。「コメントを求める」という意味。インターネット技術の標準的な仕様を記した文書のこと。
インターネット技術を議論し標準化を進める任意団体「IETFInternet Engineering Task Force）」が作成し、インターネット上で公開して・・・
>[Request for Comments（RFC）](https://ja.wikipedia.org/wiki/Request_for_Comments)
***


#### ■今回のまとめ
 
・我々が現在よく使っているのはTCP/IPというもの
・TCP/IPにはTCPとUDPという種類のプロトコルがある
・TCPとUDPは各サービス（http,smtp,ssh・・・など）にあり、各サービスはポートに予約されている
・RFCってのがある


#### ■おすすめの書籍

CCNA勉強してればネットワークの知識が学べますが
より詳細でもっと概念的なものはこちらになります

これシリーズでいろいろあるので本屋で手に取ってみてみましょう
私のこの記事が<font color="Red">**すぐさま過去のものになるでしょう**</font>
それぐらいの粒度です

マスタリングTCP/IP―入門編―

<img width="150" alt="tcpipmasuter.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603003/83d23937-c4cb-5821-cff7-f16b2e9337f9.png">

https://www.amazon.co.jp/%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0TCP-IP%E2%80%95%E5%85%A5%E9%96%80%E7%B7%A8%E2%80%95-%E7%AC%AC6%E7%89%88-%E4%BA%95%E4%B8%8A-%E7%9B%B4%E4%B9%9F/dp/4274224473/ref=sr_1_5?crid=10JBE5R167A1Y&keywords=tcp+ip&qid=1648706963&sprefix=tcp+%2Caps%2C417&sr=8-5

#### ■今回の問題（”気付き”を与える問いかけ）

ポート1024~65535の範囲のものを何て言いますか？名称を答えましょう



今回はこれで終わりです
ネットワークは対象のレベルによって教えることが幅広くなってきますので
**うっすい**感じでお送りします

byebye ヾ(❛ᴗ˂ )⌒♥

powered by Mすた
https://m-suta.com/
受験談 AWS Certified Advanced Networking - Specialty 認定

AWS Certified Advanced Networking - Specialtyを受験しました。

受験される方の参考になりましたら。

# 前提
2021年
8月：SAA [(受験談)](https://qiita.com/h2m_kinoko/items/5179bcb73b6773771f79 "受験談 AWS Certified Solutions Architect – Associate 認定")
9月：SAP
11月：SOA [(受験談)](https://qiita.com/h2m_kinoko/items/0b05378d96f4246bbdd0 "受験談 AWS Certified SysOps Administrator - Associate 認定")
12月：SCS [(受験談)](https://qiita.com/h2m_kinoko/items/20f06a746ab15540cd37 "受験談 AWS Certified Security – Specialty 認定")
2022年
1月：DVA[(受験談)](https://qiita.com/h2m_kinoko/items/67ec0a97039570524574 "受験談 AWS Certified Developer - Associate 認定")
2月：MLS[(受験談)](https://qiita.com/h2m_kinoko/items/1f6028f302c879293870 "受験談 AWS Certified Machine Learning - Specialty 認定")
3月：ANS（←今回ココ）

SAA受験談に私のAWSの事前知識・経験が書いてありますが、業務等での経験はほぼゼロです。

#### これまでの認定試験と違い感じたこと

ネットワーク関係ということもあり、実際に試してみたいと思ってもオンプレのサーバーがなかったり、手を動かして試せることが少なかったです。
あとは何故かこの試験だけ公式の模擬試験が無いので、問題数をこなすという意味でも足りなかったです。

#### koiwa clubと書籍の2つに絞って

この2つに絞って、3、４周繰り返しました。
いつもお世話になっているUdemyだと日本語のコースが無いので諦めました。
とはいえ、koiwa clubと書籍からの類似問題が2、3割は出題されていた印象です。


# 活用したもの

#### 公式サンプル問題

10問ではありますが、雰囲気や難易度をつかむには十分かなと思います。

https://d1.awsstatic.com/ja_JP/training-and-certification/docs-advnetworking-spec/AWS-Certified-Advanced-Networking-Specialty_Sample-Questions.pdf

#### AWS BenchPrep認定試験練習

ネットワーク試験だけ存在しないんです・・

#### koiwaclub

全26節。１節７問なので合計182問。
ひたすら繰り返しました。

https://aws.koiwaclub.com/

#### 書籍

発売されたての対策本です。
一通り熟読し、模擬問題を繰り返しました。

https://www.amazon.co.jp/%E8%A6%81%E7%82%B9%E6%95%B4%E7%90%86%E3%81%8B%E3%82%89%E6%94%BB%E7%95%A5%E3%81%99%E3%82%8B%E3%80%8EAWS%E8%AA%8D%E5%AE%9A-%E9%AB%98%E5%BA%A6%E3%81%AA%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AD%E3%83%B3%E3%82%B0-%E5%B0%82%E9%96%80%E7%9F%A5%E8%AD%98%E3%80%8F-Compass-Books%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-NRI%E3%83%8D%E3%83%83%E3%83%88%E3%82%B3%E3%83%A0%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE/dp/483997571X

#### Googleスプレッドシート

毎度おなじみのチートシートです。
ひたすら用語や問題を解いていてわからなかったことなどをまとめています。

# 感想

問題文が長文のものも多く、サブネットやオンプレやらDirectConnectやらと、どのような構成を問われているのか？、まずは全体像を把握することが正解率を上げる方法だと思います。あとは、やはり手を動かして確認できることが限られていたため、想像力をフル稼働し実際にメモに構成を書き起こしたりして頑張りました。

# まとめ

ネットワークの基本的な知識は少し持っていたのはありましたが、全くのゼロからだともう少し苦戦した気がします。
ひとまず受かってホッとしましたが、ここまできたら全冠制覇がちょっと視野に・・。
ノーヒットノーランのピッチャーが6回くらいで意識し出したみたいな笑
今後の受験談でまたお会いできましたら！
UiPath ブラウザIE11からEdge変更のノウハウ_2

前回お話しましたところからスタートします。
事前設定を完了して全く同じシナリオでIE11とEdgeでどう動作が変更されるかを記載していきます。

(20220427 追記)
この記事は3部構成です。
ノウハウ_1
https://qiita.com/rpa_hanako/items/3146a7cec384a071cf24
ノウハウ_3
https://qiita.com/rpa_hanako/items/0df4ab88b9cbd7ca335e


# ダウンロード
## シナリオ_IE11
サイトを開いてPDFファイルをダウンロードをクリック、保存でファイル名変更、サイトを閉じる。
UiPathで作るとなるとこんな感じです。(写真が途中で切れちゃっています。)

![IE11_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35333/e58b7dd9-c555-66ee-32c2-1345ae834e78.png)
![IE11_2 (2).PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35333/de78fc63-a38c-83cf-7277-2aac35a22d84.png)

## シナリオ_Edge
IEは上記の図のような感じですがEdgeに変更したことで下記のように変わります。
![Edge_セレクター1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35333/f371628f-a8a6-7a96-e973-48c70905ecba.png)
![Edge_セレクター2 (2).PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35333/d35c830e-cf8d-6cf6-086a-855d5f1b4805.png)

アクティビティの数が減ってすっきりしました。
ブラウザを変更したことで通知バーがなくなったので別タブでPDFファイルが開かれ、「ホットキーを押下」で保存しています。アクティビティを文字で示しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35333/d05c1e60-b17e-b10d-98e4-2d1e2657587b.png)



Edgeでも通知バーを画面右上に表示させることが可能です。表示方法はブラウザ設定で変更できます。
下記のように「開く」か「名前を付けて保存」で対応できます。
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35333/9e3849f8-28a4-84c5-0a90-3b77ea59c1a9.png)
「開く」か「名前を付けて保存」のボタンが押せないケースもあったりしました。
その場合はセレクターで「要素を選択」してF4をおしてUIフレームワークをAAかUIAを選択してみてください。
詳しくはUiPathフォーラムで私が質問しています。
https://forum.uipath.com/t/ie11-edge/379590

では、次は「セレクター」について記載します。
Eclipseにおけるエンコードと改行コードの設定

# Eclipseにおけるエンコードと改行コードの設定

メニュー>ウィンドウ>設定をクリックし、設定ダイアログを表示します。
設定ダイアログにて、一般>ワークスペースを　選択するとワークスペース設定の下の方に
・テキスト・ファイル・エンコード設定
・新規テキスト・ファイルの行区切り文字・・・つまり改行コード
の設定があります。

デフォルトが下記の画像の状態で、
・UTF-8
・Unix・・・つまりはLF

になっているようです。

Unixと書かれているとWindowsに変えた方がよいと思うかもしれませんが、Unix=LF　のようなので、特に変更する必要はありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/7ac3ff1d-fbb4-353b-63fa-6731466ebd5d.png)

エンコードや改行コードは目に見えないので、分かりづらいですが、文字化けやツールの改行コードのエラーがでることがあれば、
こちらの設定を確認してみてはいかがでしょうか。
UiPathで「今日からn日前」を1行で書く

# はじめに

仕事で「今日より10日前のファイルを○○する」とか、結構使うんですが、
いまいち覚えられないのでメモに残します。

# AddDaysを使う

実際に書いてみます。
今日の10日前の日付をコンソールに出力するだけ。

コードはこんな感じです。

```
Now.AddDays(-10).ToString("yyyyMMdd")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/7138f27d-71e6-81ab-f928-02f0e2541bac.png)

# 結果

想定通り、今日（3/24）の10日前の日付である3/14がyyyyMMdd形式で出力されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/923c4186-bb5f-854e-5536-df9bf8953ae1.png)

# 月をまたぐ場合

月をまたぐ場合でも、ちゃんと出力されます。
以下のようにコードを変えたとします。

```
Now.AddDays(-32).ToString("yyyyMMdd")
```

これを実行してみると…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/20eee921-5f37-e2ef-a42e-bdd7f89ee497.png)

ちゃんと月をまたぐ場合でも、32日前の2/20が出力されました！！

非常に楽な日付操作方法ですので、今後はこれを使っていこうと思います。
Python　Openpyxlを使ったExcelファイル操作（ブックの作成と保存・シートの選択）

PythonでExcel操作を行う為の"openpyxl"の使用方法についてまとめています。

## 本記事の記載内容
- [エクセルを操作するライブラリ"openpyxl"のインストール方法](#使用するライブラリ)
- [ファイルの作成](#ファイルの作成)
- [ファイルの保存](#ファイルの保存)
- [ファイルの読み込み](#ファイルの読み込み)
- [シートの選択](#シートの選択)
- [公式サイト](#openpyxl公式サイト)


### 環境
python3 --version : 3.9.10
openpyxl : 3.0.9

## 使用するライブラリ
```python:openpyxl のインストール
pip3 install openpyxl
```
## ファイルの作成
```python:
import openpyxl as px
wb = px.workbook()
```
* as pxは"openpyxl"を以降は"px"と記載するという意味
* "import openpyxl as px" は一個の実行ファイルにつき一回記載すればOK（以降のコードでは省略します）

## ファイルの保存
```python:アクティブなbookの保存
name = "Sample.xlsx"
wb.save(name)
```
## ファイルの読み込み
```python:保存したbookの読み込み
name = "Sample.xlsx"
wb = px.load_workbook(name)
```
## シートの選択
シートの選択方法として、
-名前で指定する方法
-インデックス番号で指定する方法
がある

```python:名前が「Sheet1」のシートを選択する
ws = wb["Sheet1"]
```
```python:インデックス番号で指定する（シートのタブ左から「0」、「１」、・・・）
ws = wb.worksheets[0]
```
今選択しているシートのインデックス番号を取得する方法
```python:インデックス番号の確認
wb.index(ws)
```


# Openpyxl公式サイト
「openpyxl - A Python library to read/write Excel 2010 xlsx/xlsm files — openpyxl 2.5.2 documentation」
https://openpyxl.readthedocs.io/en/stable/


## おまけ
自分用のメモという要素があるので必要だなと思ったら随時更新します。
初めて書いて見ました！何か参考になるような記事をいつか書けていけたらと思います。
（ ^ ω ^）
KotlinでJSONをシリアライズ / デシリアライズする【Kotlin Serialization】

# はじめに

KotlinでJSONを解析するにはJacksonやGsonなどのライブラリを使用する方法が有名かと思います。

しかしながら、これらはJavaの資源なのでKotlin/JS やKotlin/Native などでは使用することが出来ません。

そこでKotlin Serialization を使用します。

これはKotlin の開発元であるJetBrains が開発しているライブラリで、マルチプラットフォームで動作します。

今回はこのライブラリを使用してシリアライズ/デシリアライズする方法を紹介します。

https://github.com/Kotlin/kotlinx.serialization

# 使ってみる

## 導入する

使用するためにはGradle やMaven などに依存関係を追加します。

こちらの[Maven Central](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-serialization-core/1.3.2/pom)を参考にしてください。

今回の例ではGradle を使用します。

```kotlin:build.gradle.kts
plugins {
    kotlin("jvm") version "1.6.10"

    // For Serialization
    kotlin("plugin.serialization") version "1.6.10"
}

repositories {
    mavenCentral()
}

dependencies {
    // For Serialization
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2")
}
```

## シリアライズするクラスの作成

シリアライズしたいクラスをシリアライズ可能なクラスとして作成します。

```kotlin
@Serializable
data class Fruit(
    @SerialName("name")
    val name: String,

    @SerialName("value")
    val value: Int,

    @SerialName("amount")
    val amount: Int
)
```

シリアライズするクラスに``@Serializable``アノテーションを付けます。

対応する値に``@SerialName``アノテーションをつけてバインドします。このアノテーションはシリアライズ前後で名前が同じ場合は省略可能です。

## シリアライズ / デシリアライズ する

クラスを作成することができれば、あとはシリアライズするだけです。

シリアライズするためには以下のように記述します。

```kotlin
val apple = Fruit("りんご", 100, 1)
val json = Json.encodeToString(apple)
```

``encodeToString()``を用いてインスタンスをJSONにシリアライズしています。

また、デシリアライズするには``decodeFromString()``を用いて以下のように記述します。

```kotlin
// シリアライズ
val apple = Fruit("りんご", 100, 1)
val json = Json.encodeToString(apple)

// decodeFromString() でデシリアライズ
val fruit = Json.decodeFromString(json)

println(fruit.name) // 結果: りんご
```

## リストを使う場合

リストを用いた場合でも、シリアライズ / デシリアライズを行うことができます。

リストをシリアライズするには以下のように記述します。

```kotlin
val list = listOf(Fruit("りんご", 100, 1), Fruit("みかん", 500, 3))
val json = Json.encodeToString(list)
```

デシリアライズを行う場合は、以下のようにListSerializerを用いて記述します。

```kotlin
// シリアライズ
val list = listOf(Fruit("りんご", 100, 1), Fruit("みかん", 500, 3))
val json = Json.encodeToString(list)

// デシリアライズ
val obj = Json.decodeFromString(ListSerializer(Fruit.serializer()), json)
```

## 詳しくは

Kotlin Serialization ではこの他にも様々な機能があります。

詳しくはドキュメントを参照してください。

https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/serialization-guide.md

# おわりに

Kotlin Serialization はJSON以外のフォーマットもサポートしています。

非常に便利なライブラリなのでもっと有名になってくれると嬉しいです。

# 参考文献

https://kotlinlang.org/docs/serialization.html

https://github.com/Kotlin/kotlinx.serialization
pretty_midiを使って16分音符のピアノロールを取得する

# はじめに
pythonでmidiを扱う際に，（秒数ではなく）テンポを考慮し，16分音符単位で区切ったピアノロール（音高と時間で区切って，どの音がどの時間に鳴っているのかというデータ）を取得する方法です．

前に[pretty_midiのget_piano_rollを使ってみる](https://qiita.com/muyomuyo/items/52264ca0cba94200e8eb)記事を書きました．

このget_piano_rollは時間（秒数）に基づいたピアノロールの取得をサポートしていました．
しかし，私は秒数の指定ではなく16分音符単位で区切ったものが欲しかったので，いろいろ組み合わせてやってみました．

# ピアノロールとは？
例えば以下のような楽譜があったとすると，
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600580/4dd8c2de-2f8f-e2b1-3f19-25692b236492.png)

ここで言うピアノロールは，
```python:　piano roll
...
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 0
1 1 1 0 0 1 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 1 1 0 0 1
0 0 0 0 0 0 0 0
...
```
みたいな感じです！
縦は音高，横は時間ですね．
ちなみに今は，1の部分が音が鳴っている，0の部分が音の鳴ってない部分となっています．
この後紹介する方法だと，1ではなく，音量を表現することもできます．

# コード概観
```python:pianoroll.py
import numpy as np
import pretty_midi

def get_tatum_pianoroll(midi_file):
    """midiファイルの読み込み"""
    p_midi = pretty_midi.PrettyMIDI(midi_file)

    """テンポを取得"""
    change_time, tempo = p_midi.get_tempo_changes()

    """曲終わりの秒数を最後に追加"""
    change_time = np.append(change_time, p_midi.get_end_time())

    """サンプリング周波数の計算"""
    fs = tempo * 4 / 60

    """区切る秒数の計算"""
    times = [
        np.arange(change_time[i], change_time[i+1], 1./fs[i])
        for i in range(len(fs))
    ]

    """ピアノロールの計算"""
    piano_roll = [
        p_midi.get_piano_roll(times=times[i], fs=fs[i])
        for i in range(len(fs))
    ]

    """音量なしの２値に変換"""
    piano_roll = [
        (i > 0).astype(np.bool)
        for i in piano_roll
    ]

    """繋げる"""
    piano_roll = np.concatenate(piano_roll, 1)
```

# 説明
まず，初めにpretty_midiでmidiファイルを読み込みます．

次にget_tempo_changes()でテンポの変化を取得します．
ここで，change_timeは，テンポが変わる秒数（曲はじめの0秒を含む）を表しています．
つまり，テンポがずっと変わらない曲であれば，初めの0秒のみ（`array([0.])`）が返ってきます．
tempoの方はテンポが変わるタイミングでの実際のテンポを表しています．

曲終わりの秒数を追加というところは，この後の区切る秒数の計算のところで秒数の区間が必要になってくるので，一番最後を表すために追加しています．

次にサンプリング周波数の計算です．
[pretty_midiのget_piano_rollを使ってみる](https://qiita.com/muyomuyo/items/52264ca0cba94200e8eb)の記事の方に詳しく書いています．
曲のテンポと，秒数をつなぐ大事な役どころです．
`tempo * 4`の`4`は１６分音符4つ分で４分音符を表すというところから，4になっています．
もし８分音符単位にしたければ，`tempo * 2`にすることでできます．

区切る秒数の計算は，
[pretty_midiのget_piano_rollを使ってみる](https://qiita.com/muyomuyo/items/52264ca0cba94200e8eb)の記事の方に詳しく書いています．
ざっくり言うと，ピアノロールの横軸の各データが，曲の何秒のタイミングなのかを表現しています．

ピアノロールの計算も
[pretty_midiのget_piano_rollを使ってみる](https://qiita.com/muyomuyo/items/52264ca0cba94200e8eb)の記事の方に詳しく書いています．
この操作が終わった段階では，数値の大きさが音量を表しています．
さっきの例で言うと，
```python:　piano roll（音量Ver.）
...
 0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0 90
 0  0  0  0  0  0 85  0
80 80 80  0  0 80  0  0
 0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0
 0  0  0 80 80  0  0 90
 0  0  0  0  0  0  0  0
...
```
みたいな感じになります．（音量の数値は適当です．）

音量なしの２値に変換の部分は，音量情報を無くして，音の有無の情報だけを２値で表します．
コード内ではbooleanで表現しているので音があればTrue，なければFalseとなっていますが，
イメージ的には最初に示したピアノロールのようになるわけです．

最後は途中でテンポの変わる曲だった場合に，concatをしてつなげています．
SwiftUIでライトモードとダークモードで画像を切り替える　Light / Dark mode


```swift
@Environment(\ .colorScheme)var colorScheme
var body: some View {
    Image(colorScheme == .light ? "lightImage":"darkImage")
}
```

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

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。
【Chrome】サイドパネルを消す

↓このゴミを消す方法。

| ![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/78f08fc6-3fa9-690b-f774-af414ca6d96d.png) |
|---|

URLに[chrome://flags](chrome://flags)と入力。

検索欄に`side panel`と入力。

| ![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/f801a9b7-a458-0ffb-3f30-a142ba5b0ba6.png) |
|---|

出てきた3項目を全てDisabledにして再起動。

| ![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/d5920a63-cbcf-8c98-ea2f-2bd224f573c5.png) |
|---|

無事に消えました。
めでたし。

隣の顔を消したい。
jekyll リンクの掲載方法

jekyllでリンクを文章の中に掲載したいと思い、下記のように記載しました。

```md
[sitename]: https://hoge.com
```
でも、リンクがページに掲載されないのです。

色々と調べていて、気がつきました。

最初に生成されたページをよく見てみたら、下記のように書かれていました。

```md
Check out the [Jekyll docs][jekyll-docs] for more info on how to get the most out of Jekyll. File all bugs/feature requests at [Jekyll’s GitHub repo][jekyll-gh]. If you have questions, you can ask them on [Jekyll Talk][jekyll-talk].

[jekyll-docs]: https://jekyllrb.com/docs/home
[jekyll-gh]:   https://github.com/jekyll/jekyll
[jekyll-talk]: https://talk.jekyllrb.com/
```

つまり

```md
[sitename]: https://hoge.com
```
とリンクを予め設定します。
そしてリンクを挿入したいところに、下記のように書きます。

```md
[sitename][sitename]
```

このように記載すると、リンクが貼られた言葉としてページに表示されます。

### ハマった理由
```md
[jekyll-docs]: https://jekyllrb.com/docs/home
[jekyll-gh]:   https://github.com/jekyll/jekyll
[jekyll-talk]: https://talk.jekyllrb.com/
```
と書かれているのを見て、つい[]にリンクを貼るテキストを書き、続けてリンク先のURLを書くのだと思い込んでしまったのです。
EclipseにおけるSpotbugsの利用方法

# はじめに
こんばんわ、きりです。
本記事は[Nablarchを使ってみよう](https://qiita.com/kirin1218/items/242ee0f174f1cb12ef17)のサブ記事として作成しております。

今回はEclipseにおけるStopBugsの使い方について整理します。

本記事以外のコンテンツは[こちら](https://qiita.com/kirin1218/items/242ee0f174f1cb12ef17#nablarch%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E8%A8%98%E4%BA%8B%E4%B8%80%E8%A6%A7)から閲覧可能です。

なるべく、初心者目線で作成するつもりですが、分かりづらい部分ありましたら、コメント頂きたいです。

# 動作環境
|種類|バージョン|
|---|---|
|OS|Windows Professional 20H2|
|Eclipse|2022 Full Edition|

※Eclipseのダウンロードについては、[こちら](https://qiita.com/kirin1218/items/02bfeb333335842c56ae)の記事をご確認ください。

# SpotBugsとは
SpotBugsはソース内のバグが内包されていないかを確認してくれる静的解析ツールです。
検知＝障害ではないと思いますが、SpotBugsを利用することで障害発生を未然に防ぐことができます。
また当然、検知しない＝障害がないでもないので、ご注意ください。

# SpotBugsのインストール
SpotBugsはEclipseのプラグインとしてインストール可能ですが、「Pleiades All in One」を利用する場合はインストール済みのようです。

# SpotBugsの利用方法
プロジェクト名を右クリック>SpotBugs>バグを検索　をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/eb5c692b-f484-21ef-8084-7859fc8ac4dc.png)

試しに、以下のクラスを追加して、SpotBugsを実行してみましょう。
```Sample.java
package helloworld;

/**
 * サンプルクラス.
 */
public class Sample {
  int nval;

  /**
   * sam.
   *
   * @param a dummy comment
   */
  public HelloWorld(int a) {
    this.nval = a;
  }

  @Override
  public boolean equals(Object o) {
    if (!(o instanceof HelloWorld)) {
      return false;
    }
    return ((HelloWorld) o).nval == nval;
  }
}
```

SpotBugsを実行すると、以下の画像のように虫アイコンが行番号の左に表示されるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/de192a25-d35d-373d-012c-7c2c2dffa742.png)

# SpotBugsの自動設定
プロジェクト名を右クリック>SpotBugs を選択し、SpotBugs設定内の「SpotBugsを自動的に実行する」をチェックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/803458/dc4a9e22-b37b-878b-6ffe-aca5c60d79bd.png)

# 最後に
本記事ではStopbugsについて、整理しました。

大規模開発では第三者の作成したコードをコピー＆ペーストで利用することも多いと思います。
自分でコーディングしたソースにも潜在的なバグが潜んでいる可能性があります。
SpotBugsを利用して、そのような潜在的なバグを早めに発見できるようにしてみてはいかがでしょうか。

本記事以外のコンテンツは[こちら](https://qiita.com/kirin1218/items/242ee0f174f1cb12ef17#nablarch%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E8%A8%98%E4%BA%8B%E4%B8%80%E8%A6%A7)を御覧ください。

# 参考URL
[SpotBugs(FindBugs)のWarningに対処する](https://www.gwtcenter.com/using-spotbugs-2)
【Laravelエラー】Add [ ] to fillable property to allow mass assignment on

## 環境
Laravel v9.5.1 (PHP v8.1.3)

## 状況

Articleをcreateするとき下記のエラー

```
Add ['title'] to fillable property to allow mass assignment on
```

```app/Models/Article.php
class Article extends Model
{
	use HasFactory;

	public function comments()
	{
		return $this->hasMany(Comment::class);
	}

	public function user()
	{
		return $this->belongsTo(User::class, 'user_id');
	}

	public function likes()
	{
		return $this->hasMany(Like::class);
	}
}
```


## 原因

modelに```protected $fillable```を定義してないから。

> ただし、createメソッドを使用する前に、モデルクラスでfillableまたはguardedプロパティを指定する必要があります。すべてのEloquentモデルはデフォルトで複数代入の脆弱性から保護されているため、こうしたプロパティが必須になります。


https://readouble.com/laravel/9.x/ja/eloquent.html


## 解決方法

```app/Models/Article.php
class Article extends Model
{
	use HasFactory;

    #追記　   
	protected $fillable = [
		'title',
		'content',
		'user_id'
	];

	public function comments()
	{
		return $this->hasMany(Comment::class);
	}

	public function user()
	{
		return $this->belongsTo(User::class, 'user_id');
	}

	public function likes()
	{
		return $this->hasMany(Like::class);
	}
}
```

## Railsでいうと

Mass Assignment脆弱性の対策として

```
Laravel -> modelに$fillableを設定
Rails -> controllerにストロングパラメータを設定
```

ということかなと。
Railsから入ったのでその違いがわかるのが楽しい。