OmniAICreator/Qiita-1.07M huggingface dataset:
[PHP]foreach文

# foreach文
foreach文とは、配列や連想配列に対して先頭のデータから順番に繰り返し処理するための命令。

```php:foreach文
$towns = ("東京", "大阪", "福岡")

foreach($towns as $town){
    echo $town;
}
//変数$town(以降「値変数」と呼ぶ)に東京、大阪、福岡が順番に格納される。
//結果：東京大阪福岡
```

また、連想配列の場合はキー名も「キー変数」に格納することができる。
なお、キー名は省略可。

```php:連想配列におけるforeach文
$colors = array("Apple" => "Red","Banana" => "Yellow","Grape" => "Purple");

foreach ($colors as $key => $value) {
    echo $key.":".$value." ";
}
//結果：Apple:Red Banana:Yellow Grape:Purple
```
【全人類へ】お前らはスペルミスが多すぎるッッ！！絶対に入れて欲しい拡張機能！【VisualStudioCode】

みなさん、おはようございます:runner:！
@f0lstです！

さてさて、いきなりですが。

## :japanese_ogre: よく聞くんだ…

**お前らはスペルミスが多すぎるッッ！！！！！**
**スペルミスしすぎじゃないかッッ!?!?!?!?**

と言っておりますが、**僕自身もスペルミスとっても多い**です:head_bandage:

そんな我らに**救世主**を:lifter:

## :angel_tone1: 我は救世主 「Code Spell Checker」 だ...

これこそが、**全人類に使ってほしい**VSCodeのExtention、「[Code Spell Checker](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker)」です！

これを使えば、**タイポの悩みから解放**されます:mortar_board:

## :vulcan: それぞれの世界線を見てみよう

### まず、Code Spell Checkerがない世界線

:santa:「さてさて、いつも通りコード書くかのぉ〜〜〜！」

:santa:「カタカタカタ〜〜」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003760/9ddd3579-d50d-7f53-c232-4929fb7a6a17.png)
:santa:「**フォッフォッフォッ〜〜**」
:santa:「**完璧**じゃのぉ〜〜〜」

~ 数日後... ~

:horse:「おい！ここ**タイポ**してるぞ！！」
:horse:「**誰だ！やったのは！！**」

:santa:「(**わしじゃない、わしじゃない**)」
:santa:「(けど、一応見てみるか)」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003760/9ddd3579-d50d-7f53-c232-4929fb7a6a17.png)
:santa:「あッ、`World`じゃなくて`Wordl`やないか〜〜！！！」
:santa:「**わしでした！！！**」
:santa:「**すみません！！！トナカイさん！！！**」

:horse:「**何回言えばわかるだ〜〜〜！！！！**」

これでは**解雇**です。

### Code Spell Checkerがある世界線

:santa:「さてさて、いつも通りコード書くかのぉ〜〜〜！」

:santa:「カタカタカタ〜〜」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003760/0bf416a8-f3f5-f6b8-f9d9-0ed243cfb927.png)

:santa:「**フォッフォッフォッ〜〜**」
:santa:「**!?**」
:santa:「**青い線**が出ておるぞ、なになに？」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003760/50627380-bfba-121f-74b6-123ade933f00.png)
:santa:「おお！！`Wordl`**なんて単語ないと教えてくれとる！**」
:santa:「これで**間違えず済んだ**のぉ〜！」

:horse:「**QuickFix**押してみ」

:santa:「**トナカイさん！？！？！？**」
:santa:「**はいッ！！！**」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003760/11beec74-79c1-597f-4c80-47435c5d864a.png)
:santa:「**なんじゃと！？！？！？**」
:santa:「**候補を表示してくれとる！！！**」
:santa:「**すごすぎ**んか、これ!?!?!?」

:horse:「**気ぃつけてな**」

:santa:「**はいッ！！！**」

サンタさんは**事前にタイポに気がつく事**が出来ました！
これで**解雇は免れます！**

:::note
:point_up:**トナカイさんのワンポイントアドバイス**
:horse:「独自の略語もエラーが出るけど、**例外パターンとして登録**することもできるぞ！」
:::

## :horse::santa: まとめ

これさえあれば、**コードレビューで「ここタイポしてます」とコメントもらう**こともありませんし、
**タイポ修正**なんてissueを切って、**修正対応する必要もなくなります**:helmet_with_cross:

ぜひ、みなさん**いますぐインストール**を！！

https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker
Action Required: You must set a build name and number in the pubspec.yaml file version field before submitting to the App Store.

# エラー内容
ビルド時に以下のエラー文が表示される。
```
Action Required: You must set a build name and number in the pubspec.yaml file version field before submitting to the App Store.
```

# 解決方法
pubspec.yamlにバージョン名とバージョンコードを追記する。
（例）version: 2.0.0+8

# 参考
https://stackoverflow.com/questions/54357468/how-to-set-build-and-version-number-of-flutter-app/54357469#54357469?newreg=5a22fe8018284e17a79a5b73d5c3ca90
[Biopython]細菌ゲノムの簡単なstatistics (ID、ゲノムサイズ、遺伝子数など) を出力する

Assembly statsといえば[QUAST](https://kazumaxneo.hatenablog.com/entry/2017/08/22/231007) がポピュラーだが、今回ほしいのはQUASTが出してくれる内容とは微妙に違う。
細菌ゲノムアセンブリの比較ゲノム解析に使うため、NCBIからダウンロードしたgenbank形式ファイルを入力として
- 種名
- 株名
- Accession no.
- 全長
- コンティグ数
- タンパク質をコードする遺伝子の数
- tRNA遺伝子の数
- rRNA遺伝子の数
- CRISPRの数

を羅列したテーブルを出力したい。

# genome_stats.py
https://github.com/satoshikawato/bio_small_scripts/blob/main/genome_stats.py
## Requirements
- [Biopython](https://biopython.org/)
## Usage
```sh
./genome_stats.py -h
usage: genome_stats.py [-h] -i [INPUT ...] [--output FILE]

Produce a simple TSV summary file for microbial genome assemblies

optional arguments:
  -h, --help            show this help message and exit
  -i [INPUT ...], --input [INPUT ...]
                        Genbank/DDBJ flatfile (required)
  --output FILE, -o FILE, --out FILE, --output FILE
                        output TSV file
```
```sh
./genome_stats.py -i GCF_000006925.2_ASM692v2_genomic.gbff GCF_000005845.2_ASM584v2_genomic.gbff -o results.tbl
```

```tab: results.tbl
Species	Shigella flexneri 2a str. 301	Escherichia coli str. K-12 substr. MG1655
strain	301	K-12
Accession	GCF_000006925.2	NC_000913.3
Length	4828820	4641652
num_contigs	2	1
GC%	50.65	50.79
CDS	4313	4315
rRNA	22	22
tRNA	97(22)	86(21)
CRISPR	0	0
```
[PHP]break文とcontinue文

# break文
break文とは、ループを強制的に中断する命令で、
for文やwhile文などの繰り返し文の中で、if文と一緒に使うことが多い。

```php:break文
for($i = 1; $i <= 100; $i++){
    if ($i >5){
     break;
    }
    echo $i;
}
//結果：12345
```

# continue文
continue文とは、現在のループだけ抜け出すことができる文。
百聞は一見にしかずだと思うので、詳細は下記参照。

```php:continue文
for($i = 1; $i <= 10; $i++){
    if ($i & 3 == 0){
     continue;
    }
    echo $i;
}
//結果：12457810 (3の倍数の数字だけループから抜け出している)
```
環境変数を設定する方法（VB.NET）

# 手順
以下の手順を試すことで、設定できます。またWindows10上で「環境変数」と検索すれば、環境変数の設定画面が開きます。

## コントロールパネルを開き、システムとセキュリティを開く。
![無題aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/5f61c967-27d4-a71c-0b48-7667bddcf5a3.png)

## システムを開く。
![無題bb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/df4736bb-bc24-94cf-ca36-e0e0427f5dd2.png)

## システムの詳細設定を開く。
![無題cc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/b93861c4-2641-7938-20b1-4016f582cbf5.png)

## 詳細設定タブから、環境変数を開く。
![無題dd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/969dfcfc-7715-95ef-a575-63b884bfa342.png)

## 環境変数から環境変数を新規登録する。
今回は個人的な開発になるので、ユーザー環境変数に新たに設定しました。全てのユーザーに共通する設定の場合は、システム環境変数に設定する必要があります。
![無題ee.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/912c1de7-1f49-8bd5-1fbe-595922baf04e.png)

## 新しい環境変数の変数名と変数値を設定する。
![無題ff.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/109efb0f-fa75-2a47-b13b-fc3c36b80c19.png)

## 環境変数が追加されたことを確認し、設定を完了する。
![無題gg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/1609c616-9a67-0a15-fd9f-72e9f614970e.png)

## Visual Studioから環境変数を読み込めることを確認する。
読み込みがうまくいかない場合は、Visual Studioを再起動してください。
![無題hh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/181603c1-d966-bccf-5a33-565efd22711a.png)
```VB
Dim test As String = System.Environment.GetEnvironmentVariable("DEV_TEST")
MessageBox.Show(test)
``` 

# 注意事項
- この記事では、windows10における設定の方法を記述しています。

# この記事は誰向けの記事か？
- Windows10で環境変数を設定する方法を知りたい人

# 環境
- OS：Windows10
- 開発プラットフォーム：[visual studio 2022](https://visualstudio.microsoft.com/ja/vs/)

# 本記事における注意事項
- 本記事は、備忘録としてまとめたものになります。
- 他の方の参考になる可能性も踏まえて、一般公開も行なっております。
- また記載内容はすべて、正しい内容が記載されているとは限りません。
- 誤った内容を見つけた場合は、ご指摘をお願いいたします。
nlohmann json でバイナリを受け渡しする場合は、bson を使えば良い

バイナリデータを受け渡しする C++ プログラムが必要だったので nlohmann json の bson を使いました。
尚、bson なら C# や Java でも読み書きができます。(cbor もあるけどまた今度)
これは、コードの書きぶりのメモです。

```cpp:main.cpp
#include <iostream>

#include <nlohmann/json.hpp>
using json = nlohmann::json;

int main(int argc, char *argv[])
{
    // (1)バイナリデータ書き込み
    std::string abc = "abc";
    std::vector<std::uint8_t> vec = std::vector<uint8_t>(abc.begin(), abc.end());
    json j;
    j["bin"] = json::binary(vec, 0);
    std::cout << j.dump(2) << std::endl;
    std::vector<std::uint8_t> bson = json::to_bson(j);

    // 通常は、ここで bson(バイト列)をファイルに書き込み、相手に転送して読み込む処理が入る
    std::vector<std::uint8_t> bson2 = std::vector<std::uint8_t>(bson.begin(), bson.end());

    // (2)バイナリデータ読み込み
    // j2 に読み込む
    json j2 = json::from_bson(bson2);
    std::cout << j2.dump(2) << std::endl;
    json::binary_t bin = j2["bin"].get_binary();
    std::vector<std::uint8_t> vec2 = std::vector<uint8_t>(bin.begin(), bin.end());
    std::string s = std::string(vec2.begin(), vec2.end());
    // std::string s = std::string(bin.begin(), bin.end()); // std::vector<std::uint8_t>型の変数が要らなければこれでもいける
    std::cout << s << std::endl;

    return 0;
}
```

```text:実行結果
{
  "bin": {
    "bytes": [97, 98, 99],
    "subtype": 0
  }
}
{
  "bin": {
    "bytes": [97, 98, 99],
    "subtype": 0
  }
}
abc
```
【GAS】スプレッドシートのセル範囲を画像にする【Spreadsheet】

## 概要
スプレッドシートの情報を自動で取得して日報送信している。

その際、表をそのまま表としてメールに貼り付けたい。セルの文字や数字を引用することは簡単だけど表そのものを貼り付けることができない。

ググっても良い方法が見つからず、無理やりHTMLで表を記述し引用した情報を入れ込んでいた。

そういえば、表をそのまま表としてグラフ化する「表グラフ」なんてのがある。それを画像化すればいいじゃないかと思いついて試してみたのがこの記事。

## 基本形
まずは適当に表を用意して表グラフを作成、画像化してシートに貼り付けてみる。

とりあえず表はこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708687/1c147f8c-f39d-6688-5146-a1b7e5443a67.png)

で、コードはこちら。
```javascript
function imagerange() {

  //シートを指定
  var sheet = SpreadsheetApp.getActiveSheet();

  //表のヘッダーとデータ範囲を取得 ※１
  var header = sheet.getRange("A1:E1").getDisplayValues();
  var values = sheet.getRange("A2:E4").getDisplayValues();

  //データテーブルを作成
  var table = Charts.newDataTable();

  //ヘッダー行を入力
  for(var i=0; i<header[0].length; i++) {
    table.addColumn(Charts.ColumnType.STRING, header[0][i]);
  }

  //データ範囲を入力
  for(var j=0; j<values.length; j++) {
    table.addRow(values[j]);
  }

  //表グラフを作成＆画像化
  const blob = Charts.newTableChart()
    .setDataTable(table.build())
    .setDimensions(400, 150)
    .build()
    .getBlob();

  //画像をシートに挿入
  sheet.insertImage(blob, 1, 1);
}
```
良い感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708687/4938a53e-73f8-f5ac-e409-14532687aa3e.png)
Blobしているので、どのままドライブに保存もできちゃう。

### ※１について
`getValues()`だと日付や小数点などの書式が生きないので、書式ごと受け取れる`getDisplayValues()`を使っている。
するとデータが文字列になるので、ヘッダー行のタイプもSTRINGにしている。

## メールへ添付
作った画像を添付するだけなら
`GmailApp.sendEmail(address,subject,body,{attachments: [blob]});`
で挿入してやれば良い。

けど、せっかくなので本文中にインライン表示させたい。

コードはこんな感じ。
「表グラフを作成＆画像化」部分まではさっきと同じなので省略。
```javascript
  //メール本文を作成
  var body = "速報値です。<br><img src='cid:inlineImg'>";

  //オプションでHTML本文とインライン表示させる画像を指定
  var options = {htmlBody: body, inlineImages: {inlineImg: blob}}

  //メール送信
  GmailApp.sendEmail("test@gmail.com","速報値","",options);  
```

本文は直接HTMLで記述。
メール送信メソッドは`(宛先, 表題, 本文, オプション)`となっていて、HTMLで本文を記述する場合はオプション内に本文があるけど、そもそもの本文を設定しないと送信できないのでとりあえず空文字を入れている。

実行したメールはこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708687/77b393b4-77e4-3d3c-9d5a-68ab9877e9f7.png)
完璧！

## おまけ
「表グラフを作成＆画像化」部分で、交互の背景色や並び替え、行番号の表示などオプション指定できる。

例えば交互の背景色について、デフォルトはtrueになっているのでオプションでfalseにしてみる。コードはこんな感じ。
```javascript
  const blob = Charts.newTableChart()
    .setDataTable(table.build())
    .setDimensions(400, 150)
    .setOption("alternatingRowStyle", false)
    .build()
    .getBlob();
```
実行結果がこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708687/486d4f50-cc1d-fe90-c674-e274bb7f3aa0.png)

他にもビジュアル設定が色々あるみたい。
GAS公式：[表グラフのビジュアリゼーション](https://developers.google.com/chart/interactive/docs/gallery/table)

### おしまい
MAMPのPHPをダウングレードしたらエラー(403)になる

貰ったデータのPHPが古くて、それに合わせてMAMPのPHPをダウングレードしてMyWebSiteで開こうとすると、エラー(403)が表示されます。

やったことは、Web ServerをApacheからNginxにしました。
Outlook 2013 と Gmail の連携の設定をやり直した話（予定の「分類」による色分けを有効にする）

# はじめに

Outlook と Gmail を組み合わせて使っていたのですが、いつの頃からか、メールの取得ができなくなっていました。

それに加えて、
　「IMAP プロトコルのメールアドレスだと予定の「分類」による色分けができない」
という Outlook の謎仕様があり、分類が使えない状態になっていました。

そんなわけで、一念発起して、設定し直そうとしたら意外と面倒だったという話です。

# なんでエラーになっていたのか？

以前に Outlook の設定をしてからだいぶ経っていたので記憶があいまいでしたが、これが原因でした。
「安全性の低いアプリの許可」をオンにすることで Outlook と Gmail を連携させていたようです。

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987944/3680b013-35f6-097a-cefe-861901c3c314.png)](https://support.google.com/accounts/answer/6010255#zippy=%2C%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%A7-%E5%AE%89%E5%85%A8%E6%80%A7%E3%81%AE%E4%BD%8E%E3%81%84%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E8%A8%B1%E5%8F%AF-%E3%81%8C%E3%82%AA%E3%83%95%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E5%A0%B4%E5%90%88)

# 設定のやり直し

大きく分けて以下の二つでした。

1. Google アカウントのアプリパスワードの作成
1. Outlook の設定のやり直し

### Google アカウントのアプリパスワードの作成

上記のとおり、二段階認証を使用しているアカウントだと「安全性の低いアプリの許可」をオンをすることはできないようです。そこで使用するのが Google アカウントの「アプリパスワード」です。

設定は Google のアカウントの管理から行えます。

1. [セキュリティ]-[2段階認証プロセス]-[アプリパスワード] に移動します
1. [アプリを選択] で「メール」を選択します
1. [デバイスを選択] で「Windows パソコン」を選択します
1. [生成] をクリックします
1. 16ケタのアプリパスワードが生成されます

このパスワードは記憶しておく必要はありませんが、次の Outlook の設定で必要なのでコピペしておきます。

### Outlook の設定のやり直し

基本的に以下の通りに設定していくだけですが、少々わかりにくいところがあったので書き残しておきます。

[POP を使用して他のメール クライアントで Gmail のメールを読む - Gmailヘルプ](https://support.google.com/mail/answer/7104828?hl=ja#zippy=%2C%E3%83%A1%E3%83%BC%E3%83%AB-%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%81%AB%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88)

1. アカウントの追加で「自分で電子メールやその他のサービスを使うための設定をする」を選択する
（POP3を使った設定を行いたかったのでこちらを選択してあります）
1. 「POP または IMAP(P) 」を選択する
1. 以下の設定をして次へをクリックする
  ```
// POP と IMAP のアカウント設定
名前：適当で大丈夫
電子メールアドレス：[Gmailのアドレス]
アカウントの種類：POP3
受信メールサーバー：pop.gmail.com
送信メールサーバー：smtp.gmail.com
アカウント名：自動で入力される
パスワード：[アプリパスワードで生成した16文字のパスワード]

// [詳細設定] をクリックして以下の設定をする
送信サーバーは認証が必要：オン
「受信メールサーバー」と同じ設定を使用する
受信サーバのポート：995
このサーバーは暗号化された接続が必要：オン
送信サーバのポート：587
暗号化の種類：自動
サーバーのタイムアウト：5分
```

次へをクリックするとサーバへのテスト接続が行われ、問題なければ、作業完了です。

# さいごに

以上、Outlook の謎仕様に振り回された話でした。
まあ、設定を見直すきっかけになったのでいいんですけど、なんなんですかね、まったく。
２．ひろはすさんの超実践オンラインセミナーを見て

　4/9にYoutuberひろはすさんの超実践オンラインセミナーを受講しての学びと感想に関する記事です。
# 超実践オンラインセミナーとは
　インディーゲームクリエーターを目指す人のために、インディーゲームクリエーター兼Youtuberのひろはすさんが開催したオンラインセミナーです。
# 学びと感想
　オンラインセミナーを受講しての学びと感想について、まとめます。
## 学び
### インディーゲームクリエーターの仕事
　ゲームを作るには、３つの過程がある
　1. 企画
　2. 制作
　3. 販売
　この中で、企画が一番重要
　売れるゲームと作りたいゲームは違う
### 企画について
　1. ターゲット
　2. 有料or無料
　3. どのハードで出すか
　4. どこで売るか
　5. 世界観
　世界観は最後に作る
　とにかく作るまくること
## 感想
　長いキャリアを持つ本物のインディーゲームクリエーターの話を聞けて、かなりためになった。
ゲームを作って売るための具体的なイメージができた。
# まとめ
　エンジニアを目指して、コードを書いてアプリを出すだけでなく、ゲームエンジンを使ったゲーム制作に関しても関心が強くなったいい機会でした。
　これからゲーム制作を行う中で分かってきたことも記事にしていきたいと思います。
display: block;とは？

# ```display```
display は CSS のプロパティで、```要素をブロック要素とインライン要素```のどちらとして扱うか、およびその子要素のために使用されるレイアウト
# 出典
https://developer.mozilla.org/ja/docs/Web/CSS/display#:~:text=display%20%E3%81%AF%20CSS%20%E3%81%AE%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%81%A7%E3%80%81%E8%A6%81%E7%B4%A0%E3%82%92%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E8%A6%81%E7%B4%A0%E3%81%A8%E3%82%A4%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E8%A6%81%E7%B4%A0%E3%81%AE%E3%81%A9%E3%81%A1%E3%82%89%E3%81%A8%E3%81%97%E3%81%A6%E6%89%B1%E3%81%86%E3%81%8B%E3%80%81%E3%81%8A%E3%82%88%E3%81%B3%E3%81%9D%E3%81%AE%E5%AD%90%E8%A6%81%E7%B4%A0%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB%E4%BD%BF%E7%94%A8%E3%81%95%E3%82%8C%E3%82%8B%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88

# プロパティとは？
p94 ```セレクターで指定された部分の何を変えるかを書きます。```

# セレクターとは？
p94 ```セレクターではどの部分を装飾するかの指定をします。```

# ブロック要素とインライン要素とは？
### ブロック要素
p82 ```<h1>```、```<P>```タグのように```前後に改行が入りブロックとしてみなされる```もの

### インライン要素
p82 ```<a>```、```<img>```タグのように```テキストの一部```として扱われるもの

# 出典
https://www.sbcr.jp/product/4797398892

通常フローでは、```インライン要素はインライン方向、つまり文書の書字方向```に従って、文の中で言葉が表示される方向に表示されます。```ブロック要素は、文書の書字方向の中で、段落として一つが他の物の後に表示```されます。従って英語では、インライン要素は左から始まり、一つが他の物の後に表示され、ブロック要素は上から始まり、ページの下に向かいます。

# 出典
https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Flow_Layout#:~:text=%E9%80%9A%E5%B8%B8%E3%83%95%E3%83%AD%E3%83%BC%E3%81%A7%E3%81%AF%E3%80%81%E3%82%A4%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E8%A6%81%E7%B4%A0%E3%81%AF%E3%82%A4%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E6%96%B9%E5%90%91%E3%80%81%E3%81%A4%E3%81%BE%E3%82%8A%E6%96%87%E6%9B%B8%E3%81%AE%E6%9B%B8%E5%AD%97%E6%96%B9%E5%90%91%E3%81%AB%E5%BE%93%E3%81%A3%E3%81%A6%E3%80%81%E6%96%87%E3%81%AE%E4%B8%AD%E3%81%A7%E8%A8%80%E8%91%89%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%E6%96%B9%E5%90%91%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E8%A6%81%E7%B4%A0%E3%81%AF%E3%80%81%E6%96%87%E6%9B%B8%E3%81%AE%E6%9B%B8%E5%AD%97%E6%96%B9%E5%90%91%E3%81%AE%E4%B8%AD%E3%81%A7%E3%80%81%E6%AE%B5%E8%90%BD%E3%81%A8%E3%81%97%E3%81%A6%E4%B8%80%E3%81%A4%E3%81%8C%E4%BB%96%E3%81%AE%E7%89%A9%E3%81%AE%E5%BE%8C%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%E5%BE%93%E3%81%A3%E3%81%A6%E8%8B%B1%E8%AA%9E%E3%81%A7%E3%81%AF%E3%80%81%E3%82%A4%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E8%A6%81%E7%B4%A0%E3%81%AF%E5%B7%A6%E3%81%8B%E3%82%89%E5%A7%8B%E3%81%BE%E3%82%8A%E3%80%81%E4%B8%80%E3%81%A4%E3%81%8C%E4%BB%96%E3%81%AE%E7%89%A9%E3%81%AE%E5%BE%8C%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%80%81%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E8%A6%81%E7%B4%A0%E3%81%AF%E4%B8%8A%E3%81%8B%E3%82%89%E5%A7%8B%E3%81%BE%E3%82%8A%E3%80%81%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AE%E4%B8%8B%E3%81%AB%E5%90%91%E3%81%8B%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

# 感想
この部分をブロック要素として扱うのか。
[PHP]配列

# 配列の定義
配列を覚えることで、複数の情報をひとまとまりで表現することが可能となる。
また、配列内の情報は「インデックス番号」により簡易的に管理することが可能となる。
インデックス番号の詳細は下記参照。

```php:配列の定義
$names = array("Jhon","Kante","Taro");
```

#### インデックス番号とは
配列に格納されたデータに対し、自然と`先頭から振り分けられる数字`。
０から振り分けられる。
上記で定義した配列を参照すると、Jhon → 0, Kante → 1, Taro → 2
この番号が配列から値を取り出すのに役立つ。

# 配列の値の取り出し方
```php:配列から値を取り出す方法
echo $names[0];
//結果：Jhon
```

また、値は追加、上書きすることができる。

# 配列への値の追加、上書き
```php:追加
$names[] = "Mary";
//配列の末尾に追加される
```

```php:上書き
$names[2] = "Ziro";
echo $names[2];
//結果：Ziro(Taro→Ziroに置き換わっている)
```

# 連想配列
連想配列とは、配列のようにインデックス番号で値を管理する訳ではなく、キーと呼ばれる文字列などの値で、値を管理する方法。

```php:連想配列の作成方法
$user = array("name" => "太郎","age" => 14,"gender" => "男");
// キーと値のセットは、,(カンマ)で区切る。

値の追加は
$user["追加するキー名"] = "追加する値"
```

```php:連想配列から値を取り出し、出力する方法
echo $user["name"];
//結果：太郎
```
PythonでWebアプリケーションを簡単に作成するpywebIOについて

**pywebIOでPythonでWebアプリケーションを作ろう！** 
---

こんにちは！今回は、PythonでWebアプリケーションを作成するためのフレームワーク「pywebIO」についてご紹介します。pywebIOは、PythonのコードをWebブラウザ上で実行し、インタラクティブなWebアプリケーションを簡単に作成できるように設計されています。

**pywebIOの概要**
---

pywebIOは、PythonでWebアプリケーションを作成するためのフレームワークです。Webブラウザ上でPythonコードを実行することができ、ウィジェットを使用して、簡単にグラフやテーブル、入力フォームなどのUIを作成できます。

また、pywebIOは、Jupyter Notebook上でも利用可能であり、データ解析や可視化のためのインタラクティブなWebアプリケーションを簡単に作成することができます。さらに、WebSocketを使用したリアルタイムな通信にも対応しており、リアルタイムなWebアプリケーションの作成にも役立ちます。

**pywebIOの使い方**
---

pywebIOを使うには、まずpywebIOのインストールが必要です。pipを使用してインストールすることができます。

```shell
$ pip install pywebio
```
次に、以下のコードをFlaskアプリケーションに追加します。

```python:python
from flask import Flask
from pywebio.platform.flask import webio_view
from pywebio import STATIC_PATH
from pywebio.input import *
from pywebio.output import *

app = Flask(__name__)

# Webアプリケーションの定義
def main():
    name = input("What's your name?")
    age = input("How old are you?", type=NUMBER)
    hobby = checkbox("What's your hobby?", options=['Reading', 'Music', 'Sports'])
    put_text("Your name is:", name)
    put_text("Your age is:", age)
    put_text("Your hobby is:", hobby)

app.add_url_rule('/webio', 'webio_view', webio_view(main), methods=['GET', 'POST', 'OPTIONS'])
```

このようにFlaskアプリケーションにWebアプリケーションを追加することで、ブラウザ上で実行することができます。

**終わりに**
--- 

以上が、pywebIOの概要や使い方についてのご紹介です。
pywebIOは、PythonでWebアプリケーションを作成するための非常に便利なフレームワークです。簡単なUIを作成することができるため、データ解析や可視化のために使用することができます。また、リアルタイムな通信にも対応しているため、リアルタイムなWebアプリケーションの作成にも役立ちます。

是非、pywebIOを使ってPythonでWebアプリケーションを作成してみてください！
JAVA学習の記録⑩　【継承】


前回までの学び[JAVA学習の記録⑨【拡張for文でリストを繰り返し処理】](https://qiita.com/rion0726ittoti/items/62d35d37011b9d34bd9e)

# 継承とは
元となるクラスのフィールドとメソッドを引き継いだ新たなクラスをつくるための仕組みのこと。
継承元となるクラスのことを***スーパークラス***。
継承したクラスのことを***サブクラス***という。
## 継承の書き方
```java
class 継承先のクラス名 extends 継承元のクラス名 {
}
```
※複数のクラスの継承はできない。下記のように記述するとエラーとなる。
```java
public class A extends B, C {

}
```

実際の記述例
```java:Saiyan.java
public class Saiyan {
   String nama ="サイヤ人";
  
  public void attack(String name) {
    System.out.println(name +"の攻撃がヒット");
    System.out.println(name +"はダメージを与えた");
  }
}
```

```java:Gokuu.java
public class Gokuu extends Saiyan {
  String name ="悟空";
  public void fight(String name) {
    System.out.println(name+"は戦った");
  }
}
```

```java:Main.java
public class Main {
  public static void main(String[] args) {
    Gokuu gokuu = new Gokuu();
    gokuu.fight(gokuu.name);
    gokuu.attack(gokuu.name);
    
  }
}
```
Mianクラスで、Gokuuクラスがインスタンス化されるときに、Saiyanクラスのattackメソッドを持っているとみなされ、呼び出されます。

参考文献・サイト
「いちばんやさしいJAVAの教本」著者　石井真
https://camp.trainocate.co.jp/magazine/java-extends/
Googleデータアナリティクス：オープンデータ

# はじめに

本記事は、Googleデータアナリティクスのプロフェッショナル認定証のプログラムより、参照させて頂いています。興味を持った方は、是非受講してみてください。

https://www.coursera.org/professional-certificates/data-analytics-japanese

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/36b2ca51-67fa-7818-756d-a4a47431a4c6.png" width="800">

# オープンデータの基準

データアナリティクスにおいて、オープンデータはデータ倫理の一部であり、データを倫理的に使用することと関係しています。オープンネスとは、データへの自由なアクセス、使用、共有を意味します。

データがオープンであるとみなされるためには、次の3 つの基準をすべて満たす場合です。

### <font color="MediumBlue">完全なデータセットとして一般公開されており、アクセスできる</font>

オープンデータは丸ごと使用でき 便利かつ変更可能な形式で できればインターネット経由で ダウンロードできるもので なければなりません。 data.gov というウェブサイトが 良い例です。 ここでは、さまざまな業界の 科学・研究データを スプレッドシートのような 簡単なファイル形式で ダウンロードできます。 

https://data.gov/

### <font color="MediumBlue">再利用や再配布が可能な条件のもと、提供されている</font>

オープンデータは 他のデータセットとの併用も含めて 再利用や再配布を可能とする条件で 提供されなければなりません。 

### <font color="MediumBlue">あらゆる人がデータを利用し、再利用し、再配布できるといった、普遍性がある</font>

誰もがデータを利用し、再利用し、 再配布できるものであるべきです。 分野や個人、グループなど そこにはいかなる差別も あってはなりません。 また、特定の産業でしか使えない といった制限をかけることも 許されません。 

# オープンデータのメリット

### <font color="Darkcyan">信頼性の高いデータベースを より幅広く活用できる</font>

優れたデータを すべて活用、共有し 他のデータと組み合わせることもできます。 これが科学分野における 共同研究や研究の進歩、 分析能力、そして 意思決定に与える影響を 想像してみてください。 

例えば、人の健康に関していえば、 オープンネスにより、 多様なデータにアクセスし、 それらを組み合わせれば、 病気の早期発見や早期治療につながります。 行政の分野では、リーダーが 説明責任を果たしたり、 コミュニティサービスへの アクセスを向上させたりすることが 可能になります。 

その可能性とメリットは、ほぼ 無限大といってよいでしょう。 しかし、どんな素晴らしい構想にも 課題はあります。 オープンデータへの技術的な移行には、 膨大なリソースが必要です。

### <font color="Darkcyan">異なる分野の知識を組み合わることができる</font>

そこで、オープンデータの 成功の鍵となるのが相互運用性です。 相互運用性とは、 データシステムやサービスが オープンに接続されること、また データを共有する能力のことを表します。 

- 病院や診療所、 薬局、研究所など 複数の組織がデータにアクセスし 共有する必要がある医療情報システムでは、 患者が必要な治療を 受けられるようにするために、 データの相互運用性が 重要な役割を果たします。 
- 医師が 処方箋のデータを薬局に送り 薬局が処方箋の処理を進めるのも、 この仕組みの一例です。 

彼らは情報を共有するための 互換性のあるデータベースを持っています。 しかし、このような相互運用性には、 多くの協力が欠かせません。 

オープンでタイムリーかつ フェアでシンプルな データの共有には 大きな可能性が ありますが、 その未来は、より大きな課題に いかに効果的に対処できるかに かかっています。
coroutineのasync内で通信失敗した際にキャッチアップする方法

# 初めに
今回は非同期処理でよく使われている`coroutine`の`async`内で通信に失敗した時にクラッシュしてしまう時の対処法を紹介していきます
### 本文
```kotlin
val exceptionHandler = CoroutineExceptionHandler { _, e ->
            timber.e(e)
        }
viewModelScope.launch(exceptionHandler){}
```
上記のようにすることで`async`内で通信に失敗した場合でも`exceptionHandler`内に入りやりたい処理をすることができます
### 最後に
自分が実装してる時にクラッシュが発生してしまって調べたところ`try/chatch`ではダメなことを知ったので備忘録程度に残しておきます
「Knative実践ガイド」で実践する開発者体験

<font color=red>#2023.08.25　追記</font>

[インフラエンジニアBooks](https://infra-eng-books.connpass.com/event/287104/)にて「30分で分かるKnative実践ガイド」ということで解説させていただきました。
スライドは以下をご参照ください。

https://speakerdeck.com/yudaiono/about-knative-practice-guide

<iframe width="560" height="315" src="https://www.youtube.com/embed/8pxQN7Xz4dE?si=pkON6rGgDuL3tkqN" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

# はじめに
　みなさん、こんにちは。
　この度、2023年4月11日に、「Knative実践ガイド」を出版しました！


![knative実践ガイド](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559968/f11c84c7-9867-bffc-5056-a18af4c3bb4c.jpeg)

https://amzn.asia/d/cyOfCjV

https://book.impress.co.jp/books/1122101070

　この書籍が僕にとって初めての執筆です。
　Knativeと出会って5年弱。正直言いたいことはたくさんあるし、どう表現したら言いたいことが伝わるか…等々悩みが尽きませんでしたが、多くの方のたくさんのご助言で何とか書き切ることができました。この場を借りて改めてお礼申し上げます。　

　ここでは、出版にあたり、書籍のテーマであるKnativeの提供する開発者体験を簡単にご紹介します。

# 書籍のコンセプト
　Knativeはノウハウも公式ドキュメントもそれなりに充実している中、このタイミングでKnativeの書籍を出版するにあたり、どんな内容を提供すべきか…
　改めてKnative関連のネット上の情報を見渡すと、下記の状況を感じました。

- Knative Servingは自動化を手軽に体験できる反面、裏では一体全体何が起こっているのか理解し難い（ブラックボックス感がある）
- Knative Eventingはサンプルやドキュメントが少なく、どう使うのが良いのか体験しづらい（PingSourceでのバッチは分かりやすいけども…）
- 上記故に、公式ドキュメントに記載される各設定パラメータがKnativeの挙動にどの様な影響を及ぼすのか直感的に分かりづらい

　英語の本やハンズオンもそれなりにある中で、「Knativeって実際どんな感じで使うの？」というときに、結構想像力が求められます。これを一から調べていくのはKnativeの実践まで遠いと感じていました。
　今回、僕が求められたことは「実践ガイド」の執筆です。2021年に記念すべきv1.0がリリースされ、いよいよKnativeに関心を持ち始めた方が、Knativeを実践するために何が足りないのか…？
　そんな自問自答を繰り返した結果、辿り着いたのが、「一通りKnativeのアプリケーション開発者体験を実践し、体感できるもの」というコンセプトです。
　したがって、本書では、Knativeの全てを網羅的に細かく解説できていない側面もあります。一方で、読者の方がKnativeの活用イメージを持てる様、本書では、おさえるべき仕様はおさえて、実際のユースケースをサンプルにKnativeを体験できることを重視しました。

# 今だからこそ知っておきたい！Knativeの開発者体験
　Knativeは「サーバレス」の文脈で語られることが多いのは確かです。このサーバレスの仕組みをサポートすることで、Knativeは、端的に言えば「Kubernetesアプリケーションの簡単・お手軽デプロイ」な開発者体験を提供します。もう少し具体的に言うと、例えば、以下が挙げられます。

- Function実装用のテンプレート提供、コンテナイメージのビルド
- Kubernetesへ簡単にアプリケーションをデプロイ
- HTTPSのアプリケーションエンドポイントを簡単に設定
- リクエスト数に応じた迅速なオートスケール
- アプリケーションのリビジョンに応じたトラフィックの管理
- イベント駆動の非同期アプリケーションの簡単実装

![Knativeの開発者体験](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559968/e78f1fef-e271-dd99-4b30-028f896edbc7.png)

　Knativeの良いところは、開発者がコンテナやKubernetesに精通していなくても、Kubernetesを活用したシステム構築を手軽に始められるプラットフォームを実現できる点にあります。
　Knativeを実践するには、まずこれらの開発者体験が実際どんなものなのか把握することが大切です。そして、そのためには考えるよりも手を動かして体験してみる、というのがいちばんの近道になります。
　したがって、書籍では、Knativeがこれらの体験をどの様に実現するのか、Knativeの実現する開発者体験は、実際どのようなものなのか、サンプルアプリケーションをベースに解説しています。

# まとめ
　KnativeはKubernetesを使う上で面倒臭いポイントを簡素化するプラットフォームです。アプリケーションによってKnativeへの向き不向きはあるものの、コンテナのことをよく知らない人でも、簡単にコンテナを用いたアプリケーションをデプロイできる、と言う点で、Kubernetesの利用、更にはクラウドネイティブ開発を促進するのに役立ちます。
　ぜひ「Knative実践ガイド」にて、Knativeの開発者体験を一通り把握し、業務での検討に少しでもお役に立てましたら幸いです！
Googleデータアナリティクス：データの匿名化

# はじめに

本記事は、Googleデータアナリティクスのプロフェッショナル認定証のプログラムより、参照させて頂いています。興味を持った方は、是非受講してみてください。

https://www.coursera.org/professional-certificates/data-analytics-japanese

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/36b2ca51-67fa-7818-756d-a4a47431a4c6.png" width="800">

# データの匿名化とは？

個人を特定できる情報（PII）とは、それ自体または他のデータと組み合わせて、個人の身元を追跡するために使用できる情報のことです。 

データの匿名化とは、 

***<font color="MediumVioletRed">『個人を特定できる情報を排除することで、人々の個人情報や機密情報を保護するプロセスのこと』</font>***

通常、データの匿名化には、個人情報の空白化、ハッシュ化、マスキングが用いられ、データ列を特定するために固定長のコードを使用したり、改変された値でデータを隠すことが多々あります。

### データの匿名化における、データ アナリストの役割

組織には、データおよびそのデータが含む可能性のある個人情報を保護する責任があります。データアナリストとして、どのデータを匿名化すべきか理解しているよう期待はされるかもしれませんが、たいていは、データ匿名化そのものに責任を持つことはありません。ただし例外として、テストや開発のためにデータのコピーを使用する場合は、そのデータを扱う前に匿名化することを求められる可能性があります。 

# どのようなデータを匿名化すべきか？

- ヘルスケア
- 金融

のデータは、最も機密性の高いデータのうちの 2 つです。

これらのデータの取り扱いに対するリスクは非常に高いため、データの匿名化技術に大きく頼っており、通常、個人を特定できるデータをすべて消去する「非識別化」を行いデータを保護しています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/d3002596-afde-f70d-375b-27924511332a.png" width="500">

データの匿名化は、ほぼすべての業界で行われており、データアナリストがその基本を理解しておくことは非常に重要なことです。ここでは、匿名化されることが多いデータの例をご紹介します。

- 電話番号
- 名前
- ナンバープレートと免許証番号
- 社会保障番号
- IP アドレス
- 医療機関の受診記録
- 電子メールアドレス
- 写真
- 口座番号

:::note info
データの匿名化は、データのプライバシーと安全性を維持するための方法の一つです。
:::
KtorでAcceptやContent-Typeヘッダーに応じてルーティングする

ActivityPub実装作っていて欲しくなったので作りました。
## Acceptヘッダーを見て判断

```kotlin
import io.ktor.http.*
import io.ktor.server.application.*
import io.ktor.server.request.*
import io.ktor.server.routing.*

class AcceptContentTypeRouteSelector(private vararg val contentType: ContentType) : RouteSelector() {
    override fun evaluate(context: RoutingResolveContext, segmentIndex: Int): RouteSelectorEvaluation {

        val requestContentType =
            ContentType.parse(context.call.request.accept() ?: return RouteSelectorEvaluation.FailedParameter)
        return if (contentType.any { contentType -> contentType.match(requestContentType) }) {
            RouteSelectorEvaluation.Constant
        } else {
            RouteSelectorEvaluation.FailedParameter
        }
    }

}

```
## ContentTypeで判断
```kotlin
import io.ktor.http.*
import io.ktor.server.application.*
import io.ktor.server.request.*
import io.ktor.server.routing.*

class ContentTypeRouteSelector(private vararg val contentType: ContentType) : RouteSelector() {
    override fun evaluate(context: RoutingResolveContext, segmentIndex: Int): RouteSelectorEvaluation {

        val requestContentType = context.call.request.contentType() ?: return RouteSelectorEvaluation.FailedParameter
        return if (contentType.any { contentType -> contentType.match(requestContentType) }) {
            RouteSelectorEvaluation.Constant
        } else {
            RouteSelectorEvaluation.FailedParameter
        }
    }

}

```
## 使い方
この例の場合 `/json`にAcceptヘッダーが`application/json`でGETリクエストが来たときにマッチします。
```kotlin
fun Application.routing(){
    routing {
        get("/json"){
            createChild(AcceptContentTypeRouteSelector(ContentType.Application.Json)).handle {
            //ここからは通常のルーティング処理と同じ
                call.respond(HttpStatusCode.Ok)
            }
        }
    }
}
```

## 参考
https://zenn.dev/xfan/articles/a84b66373a2e40
Googleデータアナリティクス：データ倫理

# はじめに

本記事は、Googleデータアナリティクスのプロフェッショナル認定証のプログラムより、参照させて頂いています。興味を持った方は、是非受講してみてください。

https://www.coursera.org/professional-certificates/data-analytics-japanese

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/36b2ca51-67fa-7818-756d-a4a47431a4c6.png" width="800">

# データ倫理入門

倫理とは、 人間が何をすべきか規定する 根拠ある善悪の基準であり、 通常は権利や義務、 社会への利益、公平性、 特定の美徳とされています。 人間と同じように、 データにも守るべき基準があります。 

***<font color="MediumVioletRed">『データ倫理とは、 データの収集、 共有、使用方法を左右する、 根拠ある善悪の基準のこと』</font>***

データ倫理は、 企業が収集したデータを保護し、 責任を持って使用する際に負う、 説明責任の根幹に迫るものです。 データ倫理には ６つの側面があります。

- 所有権
- 取引の透明性
- 同意
- カレンシー
- プライバシー
- オープンネス（or オープンデータ）

### <font color="MediumBlue">所有権</font>

これはつまり「データを所有するのは誰か」 ということです。 データを収集、保存、 処理、分析するのに 時間とお金を費やしたのは、 組織ではありません。 ローデータを所有するのは個人であり、 その使用や処理、 共有の方法などに関する 主な管理権は個人にあります。 

### <font color="MediumBlue">取引の透明性</font>

これは、データ処理に 関するすべての活動とアルゴリズムは、 データを提供する個人に 完全に説明され、 理解されるべきである、 という考え方です。 これは、特定の方向に結果を歪める データのバイアスに関わる 懸念に応えるものです。 バイアスのかかったアウトプットは、 ネガティブな結果につながります。 これを避けるために、 特にデータを共有してくれた人々に対して 透明性をもって分析を提供します。 そうすれば、その人たちは 結果が公正かつ 偏りがないかどうかを判断し、 懸念があれば提起することができます。 

### <font color="MediumBlue">同意</font>

これは、データ提供に同意する前に、 自分のデータがなぜ、どのように 使用されるかについての詳細説明を 知ることができる という個人の権利のことです。 すべての人に、 なぜそのデータが収集されるのか、 どのように使用されるのか、といった 疑問の答えを知る権利があります。 同意を形成する最も良い方法は、 データを提供する人と データを必要とする人で 口頭で話すことでしょう。 しかし、最近はオンラインで 多くの取り組みが行われているため、 同意は詳細リンクの付いた 利用規約のチェックボックスの 形式で行われることがほとんどです。 実際は、誰もが そのようなリンクをクリックして 詳細を読んでくれるわけではありません。 同意は、母集団が 不当に攻撃されるといったことを 防ぐためにも重要です。 これは、偏ったデータによって 不当な扱いを受けることがある、 社会的弱者のような人々にとっては 非常に大きな問題です。 

### <font color="MediumBlue">カレンシー</font>

個人は、自分の個人情報を 利用することによって生じる 金融取引、またその規模を 認識すべきだというものです。 もし、自分のデータが企業の 取り組みに金銭的に寄与する場合、 その取り組みがどのようなものかを知り、 オプトアウトする権利を持つべきなのです。 

### <font color="MediumBlue">プライバシー</font>

プライバシーとは、 データ取引が発生するたびに、 対象者の情報と活動を 保護することを意味します。 具体的には、データへのアクセス、 使用、および収集に関わるものです。

また、データに対する 個人の法的権利も含まれます。 

- 個人情報への 不正アクセスからの保護、 個人情報が不適切利用されないこと
- 個人情報の閲覧・更新・訂正をする権利
- 個人情報使用に 同意する権利
- 個人情報にアクセスする 法的権利

などが保証されています。 

企業にとっては、 個人のデータを保護する プライバシー関連対策が 求められます。 自分のデータを企業に託すさいに 信頼できるかどうかが重要です。 信頼がなければ、 その企業の製品を使いたい、 自分の情報を共有したいと 思うことはできません。

### <font color="MediumBlue">オープンネス</font>

いわばデータへの自由なアクセスや使用、 共有といった考え方です。
簡易的にRADIUSサーバーを構築する

# RADIUSサーバー構築

## 機器構成
.3    192.168.1.0/24  .1 | .2   10.0.0.0/24     .1
PC -------------------- RT_1 ---------------- Desktop_PC (freeradius)

## 検証手順
Desktop_PC (freeradius)
1. 必要なパッケージをインストール
   1. `sudo apt install freeradius freeradius-utils freeradius-mysql`
2. 一時的に`root`ユーザーに変更して、/etc/freebsd/3.0ディレクトリへ移動する
   1. 編集するファイルは`mods-config/files/authorize`と`clients.conf`
3.  `mods-config/files/authorize`に次の記述を追加する（RADIUS認証で使用するuser, passwordの登録）
    1.  [username] Cleartext-Password := [password]
4.  `clients.conf`を以下の変更を加える
     ``` 
        client localnet { 
                ipaddr = [IP Address  that is permitted]
                sercret = [secret password]            
            }
     ```
5. `freeradius`を再起動する
   1. `sudo systemctl restart freeraidus.service`
6. PCからtelnetでRT_1にログインする時[username]と[password]を使用してログインできるか確認する

## 検証ログ
### 接続失敗時(freeradiusのログ)
`/var/log/freeraius/radius.log`
```
Mon Apr 10 11:01:26 2023 : Error: Ignoring request to auth address * port 1812 bound to server default from unknown client 10.0.0.2 port 1645 proto udp
```

### 接続失敗時 (RTのログ)
```
2023/04/10 11:28:05: [RADIUS] Receive Access-Reject (id: 14)
2023/04/10 11:28:04: [RADIUS] Send Access-Request to 10.0.0.1 (id: 14, name: ya
maha1, count: 1)
```

■原因
3.1の[username]が間違っていた

### 接続成功 (RTのログ)
```
2023/04/10 13:03:24: [RADIUS] Receive Access-Accept (id: 17)
2023/04/10 13:03:24: [RADIUS] Send Access-Request to 10.0.0.1 (id: 17, name: yamaha, count: 1)
```

# その他
Linuxの詳細なログを表示したいときは
sudo journalctl -u [service name]
Segmentation Anything Model(SAM)をGoogleColabで試してみた

# Zelo Shotのセグメンテーションモデル爆誕

今回はMeta Research(旧facebookresearch)から発表されたとんでもないSegmentation ModelであるSegmentation Anything Model(SAM)をGoogle Colab試してみました。

感想としては、ラベルはつかないもののセグメンテーションとしての精度はとんでもないと感じました。

# 準備
必要なノートブックはGithubのほうに上がっていました。
https://github.com/facebookresearch/segment-anything

Notebooksの中にいくつかipynb形式のノートブックがあります。残念ながら追加学習のコードなどはなかったのですが、今回は画像のセグメンテーションマスクを作成するautomatic_mask_generator_example.ipynbを試してみます。

# 実装
実装も何もほとんどノートブックそのままで動きます。
Colabで実行する際はOpen in Colabのボタンを押すだけで自動でブラウザ上で立ち上げてくれます。

変更しなくては行けない点は


```python
using_colab = False
```

で忘れずにTrueにしておきましょうってことぐらいでした。
あとは自分の画像にしたい人はPathを書き換えましょう。

# 結果

これは趣味のボルダリングの石を上手くセグメンテーションできないかなーと試してみたものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379123/1ed86824-e3d7-303e-a798-9cb598f7319e.png)


やはり精度が圧倒的ですね。大きい石の一部にマスクがついてないですが、基本的にはほぼすべての石にマスクが付いています。

以前はDetectron2を使って、手作業で20枚のラベル付けを行った上で上手くいかなかったものが、Zero Shotでここまでの精度が出ちゃうのは素直に驚きました。


# まとめ
今回はMeta Research(旧facebookresearch)から発表されたSegmentation Anything Model(SAM)をGoogle Colab試してみました。

あまりのできの良さに正直嘘かと思いました。実はこのモデルはChatGPTとかと同じTransformerを用いた画像モデルであるVision Transformer(ViT)を利用しているものになっています。

画像のTransformerモデルで精度が出るということは、今後出てくるGPT4以降のMulti Headでは画像も期待できてしまうというものです。

やはりTransformerから目を離せませんね。

# 参考
https://github.com/facebookresearch/segment-anything

https://gigazine.net/news/20230406-meta-ai-segment-anything/
MySQLにおけるint型IDの限界とクラッシュ回避のための対策

### 問題発生

IDをDBに保持しているが、IDがintを超えた値を持つアプリが発生し、オーバーフローでクラッシュした。

### 問題の原因

- DB（データベース）では、MySQLを使用
- MySQLでは、データに「文字列」「整数」などの"型"を設定し保存することで、DBの効率性と品質を向上
- 問題が発生したのは「int」型で、これは整数型の一種であり、整数値を4バイト（32ビット）で保存する
- 4バイト（32ビット）で保存している都合上、最大値は2,147,483,647までしか保存できない
- アプリのIDが2,147,483,647を超えたため、オーバーフローエラーが発生し、クラッシュが発生
  - 参考: https://dev.mysql.com/doc/refman/8.0/ja/integer-types.html

### 対応策

IDを保存するデータ型を「int」から「bigint」に変更する。
「bigint」は8バイト（64ビット）で整数を保存し、最大値が9,223,372,036,854,775,807まで拡張される。
これにより、オーバーフローの問題が発生しなくなる。ただし、ストレージ容量が増加する。

### MySQLの整数型について

- TINYINT
  - 符号付き: -128から127まで
  - 符号なし: 0から255まで
  - 1バイト（8ビット）を使用
- SMALLINT
  - 符号付き: -32,768から32,767まで
  - 符号なし: 0から65,535まで
  - 2バイト（16ビット）を使用
- MEDIUMINT
  - 符号付き: -8,388,608から8,388,607まで
  - 符号なし: 0から16,777,215まで
  - 3バイト（24ビット）を使用
- INT
  - 符号付き: -2,147,483,648から2,147,483,647まで
  - 符号なし: 0から4,294,967,295まで
  - 4バイト（32ビット）を使用
- BIGINT
  - 符号付き: -9,223,372,036,854,775,808から9,223,372,036,854,775,807まで
  - 符号なし: 0から18,446,744,073,709,551,615まで
  - 8バイト（64ビット）を使用

### "INT"の最大値が2,147,483,647である理由

- INT型の最大値
  - 4バイト（32ビット）の整数を格納できる
  - 32ビットを使って、符号付き整数（正数と負数の両方を含む）を表現する
  - 最初の1ビット（最上位ビット）は符号ビットとして使われ、残りの31ビットで数値を表現する

  符号付き整数の場合
  - 最上位ビットが0の場合は正の数を、1の場合は負の数を示す
  - 残りの31ビットで表現できる整数の最大値は、2の31乗から1を引いた値
  - 2^31 - 1 = 2,147,483,648 - 1 = 2,147,483,647

　　したがって、INT型の最大値は2,147,483,647となります。
　　
　　同様に、負の数の最小値は、最上位ビットが1で、残りのビットがすべて0です。
　　これは以下のように計算できます。

　　-2^31 = -2,147,483,648
　　よってINT型の範囲は-2,147,483,648から2,147,483,647となる

　　※整数 2,147,483,647 を32ビット符号付き整数として表現するには、2進数（バイナリ）で次のようになる
　　　→01111111 11111111 11111111 11111111
　　※整数 -2,147,483,647 を32ビット符号付き整数として表現するには、2進数（バイナリ）で次のようになる
　　　→11111111 11111111 11111111 11111111 

### デフォルトでBIGINTで記録しない理由

- データベースで全ての整数型をデフォルトでBIGINT型にすると、必要以上に大きなストレージ容量やリソースを消費することになる
  - 特に大規模なデータベースや高いパフォーマンスが求められるシステムでは問題となることが考えられる
  - 1つデータを保存するのに、INTと比較して2倍のデータ量が消費される

- 例）整数 2,147,483,647 を32ビットと64ビットで表示した場合
  - 32ビット符号付き整数: 01111111 11111111 11111111 11111111
  - 64ビット符号付き整数: 00000000 00000000 00000000 00000000 01111111 11111111 11111111 11111111

- 例）1から2,147,483,647までのIDを保存する場合
  - 32ビットで保存する場合: 2,147,483,647（個） x 4（バイト） = 8,589,934,588バイト
  - 64ビットで保存する場合: 2,147,483,647（個） x 8（バイト） = 17,179,869,176バイト
  
- リソース消費量の違い
  - 64ビットで保存した場合のストレージ容量は、32ビットで保存した場合のストレージ容量の2倍になる
  - 17,179,869,176（バイト） - 8,589,934,588（バイト） = 8,589,934,588バイト
  - つまり、1から2,147,483,647までのIDを64ビットで保存する場合、32ビットで保存する場合に比べて、約8.59GB（8,589,934,588バイト）の追加ストレージが必要になる

このため、データベースのストレージ容量やリソースは限られており、ストレージとリソースの効率性を良くするため、多くのアプリケーションでは、INTを使用することが多いです。
[golang][備忘録] workerパターン

# 並列処理の初期理解用コード

- 何かしらのタスクしたい処理があるとして
- 並列で行いたい
- そのやり方、理解に悶え苦しんだ結果の理解


```golang:main.go

package main

import (
	"fmt"
	"time"
)


// 影分身
func tProc(tasks []int) <-chan int {
	tChan := make(chan int)

	go func() {
		defer close(tChan)
		var value int
		for _, v := range tasks {
			value += v
		}
		time.Sleep(waitTime * time.Second)
		tChan <- value
	}()

	return tChan
}

// 影分身を解除し本体に戻す
func tFanin(chanels []<-chan int) <-chan int {
	sumChan := make(chan int)

	fnin := func(c <-chan int) {
		for {
			v, ok := <-c
			if !ok {
				return
			}

			sumChan <- v
		}
	}

	for _, c := range chanels {
		go fnin(c)
	}

	return sumChan

}


// n体分の影分身の結果を出力し経験値を解放する
func allProc(stream <-chan int, count int) {

	for i := 0; i < count; i++ {
		fmt.Println(<-stream)

	}
}


func startFanOutA() {
	// two task
	a := []int{1, 2, 3}
	b := []int{4, 5, 6}

	multitask := [][]int{a, b}
	finders := make([]<-chan int, len(multitask))

    // ワーカーそれぞれに多重影分身を行ってもらう。
	for i, v := range multitask {
		finders[i] = tProc(v)
	}

	faninStream := tFanin(finders)

	allProc(faninStream, len(multitask))
}

const (
	waitTime = 2
)

func FanOutSampleA() {
	fmt.Println("start")
	startFanOutA()
}


```


# 結果
- すぐ理解できる人すごい
【AWS】Clean Roomsとはどのようなサービスなのか？

## はじめに

こんにちは。
AWS Clean RoomsがGA版となりました。気になっていたサービスなのでサービス内容を調査して概要を纏めました。
詳細な検証は実施していないため間違った点がある場合はご容赦ください。


## Clean Roomsの概要

Clean Roomsはパートナー間（AWSアカウント間）でのデータ共有・利用を支援するサービスです。
例えば以下の様な要件がある場合、AWS Clean Roomsを利用することで簡単、安全、高速にデータの共有と利用が可能です。

- 自社、パートナーともにAWSアカウントを持っている
- 自社のデータとパートナーのデータを組み合わせて知見を得たい
- 全てではなく一部のデータのみ共有したい
    - 集計したデータは許可するがローデータにはアクセスさせたくない
    - テーブルの一部のカラムのみ利用を許可したい
- データを暗号化することでセキュアにデータを共有したい
- データを移動させずに共有したい
- 共有用のデータを別途作成したくない

## Clean Roomsの主要キーワード

Clean Roomsの全体イメージは以下となります

![Cleanrooms.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3300248/bfa94596-a1c7-a694-af6e-8fa32af6c518.jpeg)
- `Collaboration`
    - データの提供と利用を行うセキュアな論理空間のこと
    - データの共有と利用のためCollaborationにMemberを招待する
    - データ提供MemberはCollaborationに参加しデータを共有する
    - クエリ実行可能Memberは共有されたデータに対してクエリを実行する
- `Collaboration creator`
    - Collaborationの作成者（管理者）のこと
    - Collaboration creatorはMemberの削除が可能
- `Member(Membership)`
    - Collaborationに参加する主体（AWSアカウント）のこと
        - クエリ実行可能Member：関連付けられたテーブル（共有されたデータ）へクエリが可能。Collaborationに参加しているMemberのうち1名のみがクエリ実行可能メンバーとなる
        - データ提供Member：その他メンバー。Collaborationにテーブルを関連づけてデータを共有する
    - 招待されたMemberはMembershipを作成してCollaborationに参加する
- `Configured table`
    - AWS Clean Rooms用に構成されたGlueテーブルのこと
- `Analytics rules`
    - Configured tableに紐付けるクエリ制限のこと
    - クエリに利用できるカラムや集計結果の粒度を設定することができる
        - Aggregation analysis rule：集計のみを許可するテーブルに紐づけるルール
        - List analysis rule：ローデータの利用を許可するテーブルに紐付けるルール
    - テーブルがクエリされた時にルールが適用され制限される
        - 例えば、許可されていないカラムをSelectするとエラーになる
- `C3R`
    - AWS Clean roomsで利用可能なデータ暗号化・複合化の仕組みのこと
    - C3Rクライアントを利用してローカルでデータファイルへ暗号化•複合化を行う
    - Clean Roomsの利用において必須ではなく、必要な場合に使用する
    - 「Cryptographic Computing for Clean Rooms」の略

## Clean Roomsの利用の流れ

- `Collaboration creator`
    - Collaborationを作成する
    - Collaborationに参加して欲しいMember（AWS Account）を招待する
- `Member`
    - Membershipを作成してCollaborationに参加する
    - Collaborationに提供するデータを準備する
        - S3ファイルをソースとしたGlueテーブルが対象
    - 準備したデータ（Glueテーブル）をConfigured tableとして登録する
    - Configured tableにAnalytics rulesを適用する
    - Analytics rulesが適用されたConfigured tableをCollaborationに関連付ける
- `クエリ実行可能Member`
    - Collaborationに関連付けられたConfigured tableに対してクエリを実行する
        - クエリされたConfigured tableはAnalytics rulesで制限される
    - 必要に応じてクエリ結果をS3に保存する
    - S3に保存されたデータをAthenaやQuicksightで参照する
- `その他`
    - C3Rによる暗号化を利用する場合は以下の手順も必要
    - Collaboration creatorは、C3Rに対応した形でCollaborationを作成する
    - データ提供Memberは、C3Rクライアントを利用してデータファイルを暗号化する。暗号化したデータファイルをソースとしてGlueテーブルを作成する。後は通常の手順と同じ
    - クエリ実行可能Memberは、C3Rクライアントを利用してクエリ結果の保存ファイルを複合化する
    - C3Rクライアントでの暗号化、複合化には秘密鍵が必要。秘密鍵を作成してMember間共通で利用する

## 終わりに

データを移動せずに、パートナー（AWSアカウント）間で簡単にデータの共有ができるのは良いですね。
弊社でもお客様とデータのやり取りはよく発生します。簡単かつ安全にデータを共有できるので活用の機会はありそう！と思いました。

## 参照

AWS公式ドキュメント

https://docs.aws.amazon.com/clean-rooms/latest/userguide/what-is.html

***
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
 
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area
C++ で間違いがリンクエラーになってしまうのをコンパイルエラーに留める方法

<!--
\# 本題に入る前に・・・こちらもオススメです。

https://qiita.com/javacommons/items/1d71b0f2c12ef4713617

----

\# ここから本題・・・
-->

以下のようなソースを開発したいときに・・・

```cpp
#include <iostream>

static int add(int a, int b);

int main(int argc, char *argv[])
{
    std::cout << add(11, 22) << std::endl;
    return 0;
}

static int add(int a, int b)
{
    return a + b;
}
```

間違って・・・

```cpp
#include <iostream>

static int add(int a, int b);

int main(int argc, char *argv[])
{
    std::cout << add(11, 22) << std::endl;
    return 0;
}

static int add(int a, int b, int c) // int c という引数が多い
{
    return a + b;
}

```

・・・のように書いてしまってもコンパイルエラーにはなりません。(リンクエラーになって修正すべき所がわかりにくいことがあります)
これは、C++ では同じ関数名で引数の数や型が違う関数の定義が許されているからです。
今回は、static 関数として add を定義していて同じソース内なので比較的簡単にエラーを訂正できますが、extern で複数のファイルにまたがって関数呼び出しをしている場合には(コンパイルの)デバッグが大変です。

このように複数の引数のバリエーションが許されてしまう状況を是正したい場合は、クラス関数にしてしまいましょう。

```cpp
#include <iostream>

class Calc
{
public:
    static int add(int a, int b);
};

int main(int argc, char *argv[])
{
    std::cout << Calc::add(11, 22) << std::endl;
    return 0;
}

int Calc::add(int a, int b)
{
    return a + b;
}
```

こんな感じにします。オブジェクト指向っぽく使うわけではないので、コンストラクタやデストラクタもなく public の static 関数があるだけです。

これで以下のように、引数の数(または型)が違う定義で書いてみると・・・

```cpp
#include <iostream>

class Calc
{
public:
    static int add(int a, int b);
};

int main(int argc, char *argv[])
{
    std::cout << Calc::add(11, 22) << std::endl;
    return 0;
}

int Calc::add(int a, int b, int c) // int c という引数が多い
{
    return a + b;
}
```

・・・「error: no declaration matches 'int Calc::add(int, int, int)'」というコンパイルエラーがでました。
ファイル名と15行目ということもわかり、すぐに訂正すべき箇所がわかります。

私は、(それが不合理でなければ) C言語のように関数呼び出しだけでプログラムを書くことが好きですので、C++ を使うときでもそうすることが多いのですが、あえて class の static 関数にしておくことで、プロトタイプによるチェックがうまく働くようにしています。

以上、細かな tips でした。

----

追伸1・・・

@Nabetani さんのコメントにあるようにクラス関数でなく「名前空間(この場合は Calc)」で書くのもありです。
オブジェクト指向を使うのでなければ、よりスマートな記法と言えるでしょう。

```cpp
#include <iostream>

namespace Calc
{
    int add(int a, int b);
}

int main()
{
    std::cout << Calc::add(11, 22) << std::endl;
    return 0;
}

int Calc::add(int a, int b)
{
    return a + b;
}
```

ただし、add関数の実体定義を以下のように書かないでください。引数が違ったりしてもコンパイルエラーにならずに、(この記事で回避したい)リンクエラーとなってしまいます。

```cpp
namespace Calc
{
    int add(int a, int b)
    {
        return a + b;
    }
}
```

----

追伸2・・・

@fujitanozomu さんのコメントにあるように、警告をエラーにするようなコンパイルオプションを使えば上記の単純な例ではリンクエラーになる前にコンパイルエラーとして検出できますが、実際には(コメントの返信に書いたように)以下のようにソース分けされていて extern でリンクされている場合にはコンパイルエラー(コンパイル警告)とはならずに、やはりリンクエラーなってしまいます。
以下が現実に即した本当のサンプルです。

```cpp:main.cpp
#include "add.h"

#include <iostream>

int main() // 余計な警告がでないように argc, argv を削除しました
{
    std::cout << add(11, 22) << std::endl;
    return 0;
}
```

```cpp:add.h
#ifndef ADD_H
#define ADD_H

extern int add(int a, int b);

#endif // ADD_H
```

```cpp:add.cpp
#include "add.h"

int add(int a, int b, int c) // int c という引数が多い
{
    return a + b + c; // 余計な警告がでないように c を使ってます
}
```

----
可変長引数とは

## 可変長引数とは

プログラム内の関数や引数のうち、値があらかじめ固定されていない任意の数、または事前に定めた範囲の数を取ることができるもの

- Java

仮引数の型名を仮引数名の間に ... をつける
→実引数は配列に格納されて、型には制限が付く
Googleデータアナリティクス：データの信頼性を追求する（ROCCCプロセス）

# はじめに

本記事は、Googleデータアナリティクスのプロフェッショナル認定証のプログラムより、参照させて頂いています。興味を持った方は、是非受講してみてください。

https://www.coursera.org/professional-certificates/data-analytics-japanese

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/36b2ca51-67fa-7818-756d-a4a47431a4c6.png" width="800">

# ROCCC

データソースを特定する方法について 学ぶ必要があります。 私はこのプロセスを ROCCCと呼んでいます。 

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/173b0346-ba85-4141-f9de-af33437a221e.png" width="４00">

- R は ***<font color="MediumVioletRed">信頼性（Reliable）</font>*** を 意味します。 良い友人と同じように、 良いデータソースは信頼できるものです。 このデータによって、 正確かつ完全で偏りがなく、 吟味され、使用に適したものであると 証明された バイアスのない 情報を得ることができます。 
- O は ***<font color="MediumVioletRed">独自性（Original）</font>*** を意味します。 あなたは、セカンドパーティ、 サードパーティの ソースを通して データを見つける可能性が高いです。 扱っているのが「良きデータ」 であると確認するため、 必ず独自のソースで検証してください。 
- 最初の C は、 ***<font color="MediumVioletRed">包括的である（Comprehensive）</font>***  という意味です。 最も優れたデータソースには、 問いかけに答えたり、 解決策を見つけたりするために必要かつ 重要な情報がすべて含まれています。 このように考えてみましょう。 ネットである会社の 素晴らしいレビューを見たからといって その会社で働きたいとは思わないでしょう。 自分が合うかどうか知るため その会社のあらゆる面を調べますよね。 データ分析でも 同じようにすることが大切です。 
- 次の C は、 ***<font color="MediumVioletRed">最新（Current）</font>***  です。 データの有用性は、 時間が経つにつれて低下します。 例えば、今いる顧客全員を ビジネスイベントに招待しようと思った時 10 年前の顧客リストは使わないでしょう。 データも同じです。 最適なデータソースは、最新のものであり、 目の前のタスクに 関連するものであるべきです。 
- 最後の C は ***<font color="MediumVioletRed">引用（Cited）</font>***  です。 ある映画の続編公開について どこで知ったかを 友人に話したことがあるなら、 それは出典を引用している、 ということになります。 引用をすることで、 あなたが提供する情報の 信頼性が高まります。 

データソースを選ぶときは、 次の 3 つのことを考えてください。 
- そのデータセットを作成したのは誰か？ 
- 信頼できる組織が作成したものか？ 
- データが最後に更新されたのはいつか？

です。 信頼できる組織から提供された 独自のデータがあり、 それが包括的で最新かつ引用元があれば、 それは ROCCC です。 良きデータが揃っている 場所はたくさんあります。 ベストなのは、 吟味された公開データセット、 学術論文、財務データ、 政府機関のデータなどです。 

# 不良データとは

ROCCC ではないデータソース、 つまり「不良データソース」について考えてみましょう。 言い換えれば、信頼性が低く、 独自性がなく、 包括的でもなければ最新でもない、 そして引用元のないデータです。 

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/dea1b214-4fcd-14ea-4689-218b1b623411.png" width="４00">

- この場合の R は not Reliable、 信頼できないという意味です。 不正確、不完全、バイアスがかかっている などの理由で信頼できないデータを指します。 あるいは母集団全体を反映しておらず サンプル選択にバイアスがある データかもしれません。 また、データ ビジュアライゼーションや グラフが誤解を招くものかもしれません。 例えば、次の 2 つの棒グラフを 見てください。 左の図は Y 軸の始点を 3.14% としており、 右の図は 0 としています。 一見すると、 4 年間で金利が急上昇したようにも 感じますが、実際にはほぼ横ばいです。 

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/ad4ee17d-eda5-1b9a-3725-45c358e50630.png" width="700">

- そして、次は O です。 この O は not Original、 独自性がないことを意味します。 元のデータソースが見つからず、 サードパーティや セカンドパーティの情報に頼っている場合、 データを理解するのに特別な注意が 必要であることを示しています。 

- 次に、C は not Comprehensive、つまり 包括的でないという意味になります。 不良データソースには問いかけに答えたり、 解決策を見つけたりするのに必要な 重要な情報が欠落しています。 さらに悪いことに、ヒューマンエラーも 含まれている可能性があります。

- 次の C は not Current、最新でない、です。 不良データソースは古く、関連性がありません。 多くの信頼できるデータソースは、 定期的にデータを更新しているため、 活用に適し、かつ最新の情報である という安心感があります。 例えば、アメリカ合衆国政府の オープンデータを公開している Data.gov は、常に信頼できる データソースです。 

- 最後の C は not Cited、つまり 引用元がないことを意味します。 引用元がない、あるいは 吟味されていない情報源は、 使ってはいけません。優れた解決策は、悪いデータを 避けることによって生まれます。 良きデータを得るには、 吟味された公開データセットや 学術論文、財務データ、 政府機関のデータなどにこだわることです。
Java

## メソッド
メソッド：一連の処理の流れをまとめたもの

・長いコードを分割する
　→わかりやすく、再利用しやすくした

## メソッドを定義
```
main method
   public static void main(String [] args)
```
- 新しいメソッドを定義するとき
　→クラスブロックの中、メソッドブロックの外

## プログラムの実行順とmainメソッド

main method aka エントリーポイント

・順番
定義した順番は関係なく、mainメソッドから処理が始まる
:star: エントリーポイントがないプログラムは実行できない

## メソッドを呼び出す
```
メソッド名（）；
```
で呼び出せる

## メソッド呼び出し準の制御とメモリ構造

・JVMは、スタック領域（＜メモリ領域）でデータやメソッドなどの出し入れをしている
・1つのメソッド内に同じ名前の変数を複数宣言するとエラーになる
・プログラムはmainメソッドから始まり、やるべき処理が終わったら終了


## スタック
積み木と同じ
- スタックフレーム：スタックに積まれるメソッドの定義
→メソッドで実行すべき処理とその処理で使われる変数　2つの領域で構成される

## プログラムのライフサイクル

##### Javaのプログラムは必ずmainメソッドから始まる
→スタックの一番下に積まれるのは必ずmainメソッドからメソッドを呼び出すたびにスタックフレームが積まれていく
それが実行されて終了するとスタックフレームがなくなっていく

## 引数を使ったデータの受け渡し

引数：呼び出した先のメソッドに渡されるデータのこと
　　　→呼び出し元のメソッドからコピーされてる
・複数の引数を宣言するときは , で区切る
```
public static void メソッド名　(引数のデータ型　引数の変数名){
　　メソッド内で実行したい処理
}
```
EX）
・int型の引数を受け取るメソッドを宣言
```
public static void test(int num){
  System.out.println(num);
}
```
・このtestメソッドを呼び出すとき
```
public static void main(String[] args){
  int 1 = 10;
  test(a);
}
```
→メソッド名だけじゃなく、渡したい値やその値が入っている変数を（）の中に記述
拡張for文

## 拡張for文

拡張for文：集合からひとつずつ値を取り出す
　　　　　→すべての値を取り出したら自動で繰り返し処理を終了する
```
for(データ型　変数名：　集合){
　繰り返し処理
}
```
コロンを挟んで
左側：一時変数（繰り返している間だけ使う）
右側：値の集合（配列を記述）

##### ☆最初から最後まですべての値を1つずつ取り出すときに便利な構文