OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScriptで配列を総当りの配列に変換する方法

配列を総当りの配列に変換する機会があったので、備忘録として残します。

# やりたいこと

例えば以下のようなイメージです。
元の配列から全てのパターンの配列を作ります。

```javascript
// 元の配列
const originalList = [
  ['柴犬', 'チワワ', 'コーギー'],
  ['茶', '白', '黒'],
  ['3', '5', '9'],
]

// 総当りに変換後の配列
const formattedList = [
  ['柴犬', '茶', '3'],
  ['柴犬', '茶', '5'],
  ['柴犬', '茶', '9'],
  ['柴犬', '白', '3'],
  ['柴犬', '白', '5'],
  ['柴犬', '白', '9'],
  ['柴犬', '黒', '3'],
  ['柴犬', '黒', '5'],
  ['柴犬', '黒', '9'],
  ['チワワ', '茶', '3'],
  ['チワワ', '茶', '5'],
  ['チワワ', '茶', '9'],
  ['チワワ', '白', '3'],
  ['チワワ', '白', '5'],
  ['チワワ', '白', '9'],
  ['チワワ', '黒', '3'],
  ['チワワ', '黒', '5'],
  ['チワワ', '黒', '9'],
  ['コーギー', '茶', '3'],
  ['コーギー', '茶', '5'],
  ['コーギー', '茶', '9'],
  ['コーギー', '白', '3'],
  ['コーギー', '白', '5'],
  ['コーギー', '白', '9'],
  ['コーギー', '黒', '3'],
  ['コーギー', '黒', '5'],
  ['コーギー', '黒', '9'],
]
```

# コード
```javascript
const originalList = [
  ['柴犬', 'チワワ', 'コーギー'],
  ['茶', '白', '黒'],
  ['3', '5', '9'],
]

// 全パターンの数を計算し、空の配列を作成
const arrayLength = originalList.map(x => x.length).reduce((a, b) => a * b, 1)
let formattedList = [... new Array(arrayLength)].map(() => [])

originalList.forEach((item, index) => {
  // 対象の配列を追加する時の数を計算
  const restList = originalList.slice(index + 1) // 対象の配列より後ろの配列
  const addNumber = restList.map(item => item.length).reduce((a, b) => a * b, 1)

  // addNumberずつ配列に追加していく
  formattedList = formattedList.map((formattedItem, formattedIndex) => {
    const addItemIndex = Math.floor(formattedIndex / addNumber) % item.length
    // 追加するアイテム
    const addItem = item[addItemIndex]

    return [...formattedItem, addItem]
  })
})
```

# 処理のイメージ図

`originalList.forEach((item, index) => {`以降のループ部分のイメージ図です。
①->②->③の順番で追加していきます。

![Web 1920 – 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1125523/894d0925-8cbf-47b2-c956-488c310ffea4.png)


# まとめ

処理が少しややこしいですが、全てのパターンの配列が作れました。
もっと良い方法があれば教えて下さい。


# 最後に
### GoQSystemでは一緒に働いてくれる仲間を募集中です！
ご興味がある方は以下リンクよりご確認ください。

https://goqsystem.recruit.site?qiita=a2f9748fc9d3672105d4
PCやサーバーにインストールされている.NET Frameworkのバージョン確認

# 概要

.NET Frameworkバージョン **4.8** でexe作った！
でもサーバー側は **4.7** までだったから動かなかった…。
なーんてことが無いように事前調査する時とか。

# やり方

レジストリエディタで下記フォルダーまで行く。

```
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP
```

例えば3.5なら ↓ こんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ddfb58ee-2de6-b26d-e8c4-806058ab2fb0.png)

例えば4.8なら ↓ こんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/8d648014-6090-ef40-f946-9f5fab7bfe59.png)


# 参考サイトさん

https://blog.treedown.net/entry/2022/05/10/010000

https://docs.uipath.com/installation-and-upgrade/lang-ja/docs/finding-the-net-framework-version

# バージョン

Windows 10 Pro 21H2 OSビルド 19045.2311
PHP8.1でDeprecatedの警告が出る件 #[\ReturnTypeWillChange]

## こういうやつ
```php
Deprecated Error: Return type of Foo\Bar\Hoge\Hoge::jsonSerialize() should either be compatible with JsonSerializable::jsonSerialize(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice
In [/var/www/html/api/vendor/Foo/Bar/src/Hoge/Hoge.php, line 179]
```

業務で使っているCakePHP4.1のレポジトリをPHP8.0からPHP8.1にしたタイミングで大量に発生した。


これは何なのかっていうのを調べると、PHPのマニュアルに行き着いた。

https://www.php.net/manual/ja/migration81.incompatible.php#migration81.incompatible.core.type-compatibility-internal

> PHP のバージョン間の互換性を保ちたいがために、 戻り値の型を宣言できない場合、 アトリビュート #[ReturnTypeWillChange] を追加することで警告を抑止できます。

継承元のクラスと異なる戻り値が返る場合にこの警告が出る様子。


マニュアルのとおりに使っているメソッドに `[\ReturnTypeWillChange]` というアノテーションをつけてあげれば回避はできる。

```php:アノテーションつける

/**
 * json_encodeされたらvalueを返す
 *
 * @return string|int getValue()の値
 */
#[\ReturnTypeWillChange]
public function jsonSerialize()
{
    return $this->getValue();
}
```

このサンプルは `JsonSerializable` を継承しているんだけど、 `jsonSerialize` メソッドの戻り値は `mixed` になっているのよね。
アノテーションをセットするのは適切な戻り値に設定できない場合の苦肉の策なのね。
POPで作成したParticleのうち何割かを消したいと言われたときの対処方法

エフェクト屋さんが仕事でありがちなので

「Particleの数半分くらいにしたい。」とか「多いので量を減らしたい。増やしたい」
というのがチェックバックで起きますよね。

わざわざシミュレーションしなおしてまでしたくない小さな素材だったらちゃちゃっと減らして修正したいですよね:confused:

自分は最近だと「自分的に出したい量」より多めにParticleを出してシミュレーションしておいて、レンダリング前に減らしておいて早くリテイクに対応できるようにしてます（リードがやってて頭がいいと思いました:innocent:）
そのときに使う数行のwrangleの紹介です
こんな感じでサクッと減らせます
![2022-12-01_00h35_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997785/a81d317e-7af1-7a20-4249-b9002a8ca192.png)



***
前提知識として、POPでParticleをEmitしたとき、無限寿命や尺内に死なないような寿命なら下記のように書いても大丈夫なのですが（ptnumが変わらないため）、
```
f@randomNum = rand(@ptnum);

if(f@randomNum < chf("thresh")){

    removepoint( 0, @ptnum);

}
```

途中で消したりするとptnumが変わるので、決まった半分を消すことができなくなります。。。
（LifeTime１とかで上のやつを実行していただければどういうことかわかりまする！！）

***
Particleはptnumとは別にIDをParticleに持たせれるので、それを使ってあげれば決まった半分を消しておくようにできます。
IDはここで作成するかどうか決めれます。
![2022-12-01_00h19_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997785/f575f271-bbfb-1581-41af-e081a7216567.png)



こんな感じでpoint wrangleに記載してあげればいいです。

![2022-12-01_00h16_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997785/3c1ff6f1-67cf-e35e-476b-04c543740455.png)


![2022-12-01_00h21_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997785/b4a3092a-20fc-28a4-3132-3e2e450e91d6.png)

```
if(rand(i@id + chi("seed")) < chf("thresh")){

    removepoint( 0, @ptnum);

}
```

※seed をrandに足しているのはここでSeedをいじれば半分消すとしても、これは嫌だな。。。ってやつをSeedを変えることで変更できるからです。


すごいサクッとした記事で申し訳ないですが、結構仕事で使えるHoudiniの小技でしたー

もしゃこ
初投稿

## 自己紹介
- 今年新卒で入社したMLエンジニア1年目です！
- 学生時代はロボット系の研究室で組み込みをかじっていたのでCを使用していました。
- 現在はJava、Pythonを主に業務で使用するので勉強中です
- クラウドはGCPを主に使用しており、こちらも勉強しています
- 機械学習やコンテナ関連の技術も興味を持って取り組んでいます


## 投稿目的
今までROM専でとてもお世話になってきましたが、
- 自身のスキルアップ
- 得たノウハウの定着
- 誰かの役に立てば...

という3つの思いでこれからアウトプットしていければと思っています。

間違いがあった際にはご教授頂けると幸いです！
PDOを使用したバルクインサートのサンプルコード


#### PDOを使用したバルクインサートのサンプルコード
- CSVファイルを読み込み、CsvImportModel モデルの bulkinsert 関数を呼び出しバルクインサート処理を行うサンプルコードです。
- `$bulk_cnt` にバルクインサートの単位を宣言します。
```php:任意
// CSVファイルからのインポート処理
$handle = fopen($file_path, "r");
$bulk_cnt = 100; // バルクインサート設定値
$bulk_arr = array();
$lineNo = 1;
while (($fields = fgetcsv($handle)) != false) {
  // Log::debug("CSVデータ {$lineNo}行目:". print_r(mb_convert_encoding($fields, 'UTF-8', 'SJIS'),true));
  if ($lineNo !== 1) $bulk_arr[] = mb_convert_encoding($fields, 'UTF-8', 'SJIS'); // 1行目ヘッダースキップ
  $lineNo++;

  if (count($bulk_arr) >= $bulk_cnt) {
    $result = CsvImportModel::bulkinsert($dbh, $bulk_arr);
    if ($result === false) {
      Log::debug('バルクインサート処理エラーが発生しました。');
    }
    $bulk_arr = array();
  }
}
if (count($bulk_arr) > 0) {
  $result = CsvImportModel::bulkinsert($dbh, $bulk_arr);
  if ($result === false) {
    Log::debug('バルクインサート処理エラーが発生しました。');
  }
}
unset($bulk_arr);
fclose($handle);
```

- CsvImportModel モデル
```php:CsvImportModel
  /**
   * レコード挿入処理（バルクインサート対応版）
   * 
   * @param object $dbh
   * @param array $params
   * @return int,bool
   */
  public static function bulkinsert(&$dbh, $params) {
    $bulk_sql = array();
    $placeholder = array();
    for($i=0;$i<count($params);$i++) {
      $bulk_sql[] = <<< SQL
( 
  :column_hoge_{$i}                             -- ほげ
  , :column_fuga_{$i}                           -- ふが
  , :column_piyo_{$i}                           -- ぴよ
  , now()
  , now()
)
SQL;
      $placeholder[":column_hoge_{$i}"]           = !empty($params[$i][0])   ? $params[$i][0]   : NULL;
      $placeholder[":column_fuga_{$i}"]           = !empty($params[$i][1])   ? $params[$i][1]   : NULL;
      $placeholder[":column_piyo_{$i}"]           = !empty($params[$i][2])   ? $params[$i][2]   : NULL;
    }


    $sql = <<< SQL
INSERT 
INTO sample_table ( 
  column_hoge                                   -- ほげ
  , column_fuga                                 -- ふが
  , column_piyo                                 -- ぴよ
  , created
  , modified
) 
VALUES 
SQL;
    $sql .= implode(',', $bulk_sql);

    try {
      $stmt = $dbh->prepare($sql);
      $stmt->execute($placeholder);
    } catch (Exception $e) {
      report($e);
      return false;
    }
    return DB::getPdo()->lastInsertId();
  }
```

- SQL
```sql
--
-- Table structure for table `sample_table`
--

DROP TABLE IF EXISTS `sample_table`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `sample_table` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `column_hoge` varchar(191) DEFAULT NULL COMMENT 'ほげ',
  `column_fuga` varchar(191) DEFAULT NULL COMMENT 'ふが',
  `column_piyo` varchar(191) DEFAULT NULL COMMENT 'ぴよ',
  `created` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  INDEX `index_search` (`column_hoge`, `column_fuga`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='サンプルテーブル';
/*!40101 SET character_set_client = @saved_cs_client */;
```
未経験の韓国人が日本のIT会社エンジニア１年目になりました！

## はじめに
オークファンの@mino-zzangです！
今年4月から入社されてどんどん成長しているエンジニアでございます。
初めて`Advent Calendar`に参加することになってとても嬉しいです！

## 自己紹介から...
- 高校から大学まで建築デザイン&設計を勉強　
- 卒業後、建設会社1年半ぐらい経験
- 人生に新しい環境が必要と思い、ITに挑戦
- ITエンジニアとして日本生活を開始しました!🥳

## エンジニアとして1年は...
入社前に韓国でITスクール約1年、IT勉強したことがありまして少し自信ありました！！が...仕事にはまだ実力が不足でした。でも毎日先輩のお手伝いをいただいて成長しております。自分が知らないことがあることはまだ成長する楽しみがあるって言うことでしょー。どんどん成長して私の3年後の様子を見ることが楽しみです。

## 入社前と入社後のギャップ
#### 1. ITのギャップ
建築すら知らなかった私はIT勉強前のITはただインターネット言語で作ってオンラインで動いている簡単なイメージしかなかったです。実際にはオンラインで動くために様々なことが必要でした。画面を管理する部分と機能を管理する部分、そしてデザインを適用している部分などがそれぞれ存在して一部としてIT業界が動いていました。そしてIT業界はみんな同じではなくてEC開発、AI開発、金融ITなど様々な業界がありました。自分が経験できないことをセミナーに参加して情報を得ることも面白いです。

#### 2. 情報守りのギャップ
IT系に入ることになった後からは情報を守る認識が深くなりました。不思議な宛先から来たメールは読めない、不思議な番号から電話かけてきても無視するなどの危険な行動をしない方で気をつけております。メールはそもそもあんまり使ってなかったので大丈夫でしたが、電話は不思議な番号が来たら気になりまして受けましたんですが、今は無視しています。

#### 3. gitのギャップ
gitの作業は友達と一緒にプロジェクトする時だけ簡単に利用しまして慣れてなかったです。友達とは協力する時のプロジェクトはそんなに大きなことがなかったので心理的に安心して作業しましたんですが、入社後には自分のgit使い方でレポジトリの内容が反映されて大変なことも起きる可能性もありますので最初は怖かったです。でも現在はgitに少しずつでも慣れましたので怖くはないですが、いつも緊張しながら見ています。

## ITと建築のギャップ
建築エンジニア時もPCで作業するので環境としてはITと変わらないですが、デザイン的には少し違います。建築は危険なことは見やすくデザインしますが、ITは逆でした。建築しながらできた習慣は人を観察することと新しい場所でトイレはどこにあるのか探すことでした。(笑)家族はみんな私と旅するときはいつもトイレはどこか私に聞いたりします。

IT系にきた後からは技術に関心が深くなりました。どのシステムが流行っているのか、どのスキルが流行っているのか。普通に使っているkakao talkやLineを使うとき、「これはどの処理をしたか？」などの疑問を自ら出すようになったことが今の習慣になりました。(笑)

## 日本と韓国のギャップ
「ご注意」　この内容はミノだけの経験で100%事実とは言えないですー!

#### :house_with_garden: 家のタイプで「トイレ別」がある！
韓国では「トイレ別」のルームは多分ホテルしかないと思います。旅行で日本来たとき、トイレ別のルームを見て驚きましたが、今は家を探すときの好みになりました。とても便利です！

#### :taxi: タクシーのドアは私が開けなくても良い！
最初、5年前に友達とタクシーに乗る時、タッチもしてなかったのにタクシーのドアがオープンされまして驚きました。
韓国には自分でやりますのでもし旅行する方は気をつけてくださいませ。

#### :coffee: cafeのメニューで「あ・ば・ら」がほぼない
韓国には「アイスバニララテ」を「あ・ば・ら」で呼びます。最初スタバではないcafeで探しましたが、なかったので悲しいでした😭　でも最新の好みはBlackに変わったのであばらなくても良いです！

#### :beers: お酒の種類が多い！！！！(天國)
私は普通ビールとチャムイルを飲みましたが、日本来てサワ系のお飲み物がありまして毎回何を飲むか楽しみです！

#### :santa_tone1: クリスマスは休日ではないけど休日が多い！！！！
韓国より日本の休日は多いと思います！山の日、海の日...など。その時々に私は韓国にいる友達に「今日も休むんだーよー！」って言いながら自慢したりします(笑)

## まとめに
ITエンジニアとしても日本生活にもまだ学ぶことがたくさんですが、成長している自分を見ると嬉しいです。今年１年間はミスしたり、せっかちで色々迷惑をかけていると思いますが、2年目の時は今の通りのよりもっと成長したMINOを見せたいと思います！来年のAdvent Calendarを書く時はこの記事を読んで「その時もありましたねー」を言いながら笑うように頑張ります！🙇🏻‍♀️
アウトプットにハードルを設けてはいけない、って話　～もっと気軽に書いていこうぜ～

さて、Qiitaを愛しているみなさまは「アウトプット」の大事さをよく理解していらっしゃると思います。

その中でも、実際に書いている方はあまり多くないという話も聞きました。

今回は、「でも記事書くのムズカシイ・・・」って思っている方向けの記事です。

## アウトプットは難しい？

まず、「ネットに全公開される記事を書くのはちょっと・・・」という方は非常に多いことでしょう。

実際に、後輩や部下に「何かQiita書いたれ」とぶん投げてもなかなか書いてもらえません。

そらそうですよね。「アウトプットする」ということに**慣れていないん**ですから。

アウトプットに躊躇しているあなた。それが正常です。


## そもそも「アウトプット」ってなんやねん

### アウトプットの本質は「公開」ではなく「書く」こと

まず、大前提としてあなたのアウトプットを世界にさらす必要は**ありません**。

ぶっちゃけた話、手書きのノートだって立派な``アウトプット``です。

### 考えや事実を「まとめる」ことが重要

アウトプットの本質は、自分の考えを整理するということです。

手書きのノートでも「アウトプット」だよ！とは言いましたが、
割と板書的な書きうつしだったり、その場で考えたことをそのまま書いたりしていませんか？
~~え？そんなクソノート書いてるの俺だけ？？？~~

### 別に「記事」である必要はないが・・・

よくあるアウトプットの例が、QiitaやZennなどの記事公開や、SlideShareなどでの発表資料公開です。

記事という方はあくまでも一つの例でありますが、「読む」という点で考えると技術記事としてののまとめ方は非常に勉強になります。

困ったコトや問題点から、その解決策を提示する。それだけでも立派な記事になります。

自分が困ったコトでよいので、どんどんまとめていくと良いでしょう。
記事として書いておくと、あとから自分で追えたりするので、結構便利です。

## アウトプットの重要性

エンジニア職に限らず、社会人たるもの「成果物」が求められます。

「○○を勉強しました！以上！」

で許されるのは学生までです。なんなら学生ですら「テスト」がありますし、成果が何もないという状況はほぼないかもしれませんね。

そんな中で、重要視されるのが「アウトプット」です。

ソフトウェア開発の場合、多くは

- 動作するソフトウェア
- ソフトウェアの仕様書

が求められますが、障害や問題の報告時にはその内容と対策などが求められます。

この時に大事になるのが「まとめる力」です。

このまとめる力は、ただ技術力があるだけでは実現することは難しく、ある程度の文章構成力が望まれます。

そしてその文章構成力も、一朝一夕では身につかないと言えるでしょう。

つまり、普段から**うまく説明できる練習をする**ことが大事ということですね。

## まずは限定公開から

うまくできる人はそれでも良いのですが、いきなりQiitaなどで記事を作れと言われても躊躇する人は多いでしょう。

というかそれが普通です。（繰り返し）


そのため、まずは　``自分だけ見れる``、または``チームメンバーだけ見れる``領域へのアウトプットからチャレンジしてみましょう。

とにかく、「なんでもいいから書いてみよう」という簡単な気持からはじめてみると良いです。

例えば、自分のNotionに書いてまとめておくだけで良いでしょう。
そのうえで、慣れてきたらSlackや社内Wikiなどで公開してみましょう。。


チームに公開すれば、やさしい人がフィードバックなどをくれることでしょう。

貰えないなら「俺は大丈夫なんだ」と自信を持ちましょう。

### 完璧な記事なんて存在しない

結局のところ、ツッコミどころが一切ない記事というのは皆無です。

「明らかなウソ」さえなければいいのです。

また、技術系の記事の多くは1年もたてば使い物にならないこともあります。

「完璧さを求めて公開を躊躇する」のは愚の骨頂であると言えるでしょう。

ただし、~~何度も言いますが~~

「根も葉もないウソを書いてはいけません」

## さいごに

アウトプットすることで、自分のことをたくさん知ってもらえるというメリットもありますが、
稀に攻撃を受けることもあります。

ですが、1つでも「いいね」をもらえると非常にうれしい気分になります。

バズる記事を作る必要なんてありませんので、気軽にどんどんアウトプットしていったらよいと思います。
p5.js フレームレート（FPS）と関数の処理時間を測定する

---
### p5.jsのdraw関数のフレームレートを測定する

---
#### はじめに

現在p5.jsを学習しているのですが、draw関数のフレームレートを測定する便利な機能の紹介です。

draw関数に関して、下記の2点を検証したいと思います。

---

- draw関数は、setup実行後1秒間に60回のレートで繰り返し実行される

- 1秒間に draw() を実行する回数は、frameRate() 関数で制御することができます

---
#### FPS meterでframeRateを測定する

1.p5.js Editorを開き、測定するコードを記述する
2.developer toolを開く
3.Ctrl+Shift+P でコマンドメニュを開き、"Show frames per second(FPS) meter" と入力する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/e46ca35d-7730-44cd-b005-e2026facb06f.png)
4.Show frames per second(FPS) meterがでてきたらクリックする
5.クリックするとrenderingタブの"Frame rendering Stas"のチェックボックスにチェックが入る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/700cdec9-ab49-841a-a891-889dc5ac9e2b.png)
6.p5.js Editorに戻るとFrame Rateと表示されたwindowが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/ff3408cc-f11e-9a23-597c-dbd5005fe77d.png)
7.コードを実行する（期待値は60fps）

```
function setup(){
  createCanvas(100,100);
}
function draw(){
  background(255);
}
```
59.4fps の値が確認できた。

---

#### frameRateを変更してみる

frameRateは0-60の値を指定でき、frameRateが小さくなるにつれ粗いアニメーションになる。

frameRate60で実行した時は、下記の縦線が滑らかに動いていましたが、Rateを１に変更して実行するとｶｸｶｸしていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/aad4f7d2-fc1a-6d4d-6f6c-ee41170c95bb.png)

---

【結果】

draw関数のframeRateは1secに60回実行される -> 59.4fpsが確認でき、約60回実行されることが分かった。

frameRateを変更すると、粗いアニメーションになり1secに実行される回数（60回）が変わるわけではないことが分かった。

---
### 関数の処理時間を測定する

---
#### Javascrip Profilerで関数の処理時間をを測定する

1.p5.js Editorを開き、測定するコードを記述する
```
function setup(){
  let start = millis();
  createCanvas(100,100);
  let end = millis();
  let func_count = end - start;
  console.log(func_count);
}
function draw(){
  background(255);
  text(str(frameCount), 30, 50);
  if(frameCount > 59){
    noLoop();
  }
}
```
2.developer toolを開く
3.Javascrip Profilerタブを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/2536164a-74db-6167-c50a-c95b3b8a19fa.png)

4.start ButtonをClickし測定開始する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/f6991211-01c8-693d-a8b5-b5bb2ef19fd7.png)
5.p5.js Editorに戻りプログラムを実行する
6.再度、Javascript profilerに戻りStop ButtonをClickする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/471689cb-6a57-fc74-2e75-0fe1170550e2.png)

7.set関数の処理時間を確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/e38c5992-8bb0-5df9-33d2-4d58d137e488.png)
8.millis関数と比較する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/1b03f95b-8934-8ce8-3e78-657aa0395f54.png)

---
#### 最後に
setup関数の処理時間には少々ばらつきはありますが、概ね0.2msだという事が確認できました。

【参考記事】

[FPS測定](https://himco.jp/2020/04/12/p5-js%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9C%80%E9%81%A9%E5%8C%96/)

[frameRate](https://processing-fan.firebaseapp.com/refs/env.html#frame)
MySQL闇歴史　MySQL 7.0

6.0はおろか5.2すらリリースの気配もない段階で計画が進んでいたのがMySQL 7.0である。当時のMySQLの開発チームの迷走っぷりからすると実は堅実かつ今の姿につながっていたりするのが幻のMySQL 7.0である。

知名度：★☆☆☆☆
闇度　：★☆☆☆☆
計画は堅実だった度：★★★★☆


MySQL 7.0のテーマはセキュリティ。公開されたロードマップに載っていた機能はこんな感じ
* ロール
* 透過的データ暗号化 (テーブル/列)
* 監査
* 外部認証 (OS認証)
* オンラインDDL
* オプティマイザの改良によるサブクエリ高速化

このうち列レベルでの透過的データ暗号化は未実装ではあるものの、ロールや透過的データ暗号化、監査やオンラインDDLは今のMySQLに実装されている。外部認証はOS認証だけではなくLDAPやActive Directoryに加える形で実装済み。オプティマイザの改良も6.0での大失敗を捨て、MySQL 8.0に至るまでにそれなりにうまく改良ができたと思われる。

その後もバグデータベースに残された外には出ない(外には出せない)罵詈雑言と数々の実装失敗を乗り越えて改良を進め、指示されたものとは異なる実装をした上に仲間を撃って出て行ったエンジニアに代わって、メジャーではない某フォークから帰還したエンジニアによってようやくハイパーグラフオプティマイザが日の目を見ることになったのは感慨深い。しかしログインせずにバグデータベースでhypergraphで検索してもいろいろあったあれやこれやが全然出てこなくて逆に驚いた。まぁ外には出せないわな。

ちなみにMySQL 5.7の次が8.0まで飛んだのは6.0がアルファ版まで出た過去があることやMySQL Clusterが6.xや7.xでリリースされていたためという説が有力。5.8の下一けたから取った感じにもなるしとか。少なくともこのMySQL 7.0のことは中の人のほとんども忘れていたことでしょう。知らんけど。
いまさらだけどDockerの基本を理解する

業務で「`docker-compose up`で立ち上げて」とか言っていますが本当のところあまり理解できていません…。

バックエンドの方が用意してくださった開発環境がDockerを利用してできているので言われるがままやってきましたが、**そろそろ本当に恥ずかしいな…と思ったので基礎ぐらいは理解しておきたい**と思います。

## Dockerってなに？
Docker社によると「コンテナを使ってアプリケーションを構築、共有、実行する」と説明があります。
アプリケーションに必要なものをパッケージにして誰でも同じ環境を構築できるイメージでしょうか。

https://www.docker.com/resources/what-container/

### 仮想化について
コンテナ技術も仮想化技術の一種です。
仮想化についてはいろいろ記事を読みましたが1台の物理サーバー上に用途などに応じて分割や統合する技術。

仮想化が普及していない時代はウェブサーバー、メールサーバー、ファイルサーバーなど用途ごとにサーバーが必要になって増え、それに伴って費用や管理が大変になる状態だったのが1つのサーバー上で同じことが可能になったのが仮想化の技術だそうです。

ニフクラさんの記事がわかりやすいと思いました。

https://pfs.nifcloud.com/navi/beginner/virtualization.htm

### 比較に出てくる仮装マシンとコンテナについて
仮装マシン（以後Vertual Machine：略VM）はPCの中にもう一台PCがあるイメージが近いでしょうか…。
Macの中でVMによってWindowsを動かすということをした記憶があります。
VMはOSやアプリケーション、それを動かすのに必要なライブラリなどが含まれるものです。

対してコンテナはOSを共有し、その上にアプリケーションを実行する環境があるのでVMとことなりOSやアプリケーションを実行するためのライブラリが共通なためVMを使うよりも軽量なのが特徴です。
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/59b1e6c5-9b04-2f86-e544-160cbc119b82.png)
引用元：[コンテナを使ってアプリケーションを構築、共有、実行する](https://www.docker.com/resources/what-container/)

## どうやって使うの？
Dockerfileを使用してコンテナイメージを作成します。
コンテナイメージは、コンテナを作成するための指示書で、Dockerfileにはコンテナイメージを作成するためのスクリプトが記述されたファイルです。

`docker build`コマンドを実行すると処理が実行されます。

コンテナを起動するには`docker run up`を実行します。

### Docker Composeについて
複数のコンテナを起動する場合に使われるComposeというものがあります。
その場合`docker compose up`のコマンドを実行することで全体を起動し、実行します。
設定は`docker-compose.yml`に定義するそうです。

:::note info
`docker run up`を実行して一つずつ立ち上げることも可能だけど、コンテナに依存関係（起動の順番）があった場合にymlに立ち上げの順番や設定を記述できるので複数コンテナの場合はComposeを利用するのが良さそうです。
:::

## エラーになったときのデバッグコマンド
もしこれからDockerを使うことになって、何かわからないけど環境が立ち上がってないぞ…ってなったときに実行するコマンドです。

### `docker ps`
コマンドを実行すると下記のような表示がターミナルに表示されます。
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/c84372cb-dd0a-7c60-3e8a-d45978c13b81.png)
引用：　[https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/ps/](https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/ps/)

もしコンテナが立ち上がっていない場合は「STATUS」の項目にEXITと表記されるはずです。
となればerrorの詳細を確認するステップに移ります。

optionも指定することが可能なので利用する場合は確認してください。

https://docs.docker.jp/engine/reference/commandline/ps.html

### `docker logs`
コンテナを立ち上げた時から現在のログが出ます。
開発中にエラーが発生して画面が表示されなくなった場合はlogsにエラー内容が表示されるはずです。

`docker ps`と同様にoptionが設定できるので適切なoptionを付与してください。
開発中でエラーがでたならずっとログを出し続ける`docker logs -f`なんかが良いかもしれません。

https://docs.docker.jp/engine/reference/commandline/logs.html

## まとめ
理解が間違っていたらぜひコメントをいただけると大変嬉しいです！
今後自分で環境を立てることは業務ではないかもしれませんが、**自分が何をしているのかを理解して問題が発生した時に修正カ所がわかることで業務効率は上がる**と思っています。

Dockerに限らず自分が業務で扱っているものに関してはわかりやすく人に説明できるエンジニアであり続けたいなと思います。
macOS Ventura + uplatex in MacTeX(texlive) 2022 + ヒラギノフォント

# 理由
macOS VenturaのローカルTeX環境(uplatex)でヒラギノフォントを使いたい

# 調べてみた
Mojaveにおける方法を発見．
https://qiita.com/sira/items/d7f5c411ccb0f90c43d8#%E3%83%92%E3%83%A9%E3%82%AE%E3%83%8E

上記サイトによると，
```shell
sudo tlmgr repository add http://contrib.texlive.info/current tlcontrib
sudo tlmgr pinning add tlcontrib '*'
sudo tlmgr install japanese-otf-nonfree japanese-otf-uptex-nonfree ptex-fontmaps-macos cjk-gs-integrate-macos
sudo cjk-gs-integrate --link-texmf --cleanup
sudo cjk-gs-integrate-macos --link-texmf
sudo mktexlsr
sudo kanji-config-updmap-sys --jis2004 hiragino-highsierra-pron
```

しかしこの方法だけではVenturaでヒラギノフォントは使えなかった．

# 追加でやったこと
```shell
sudo cjk-gs-integrate-macos --link-texmf --fontdef-add=cjkgs-macos-highsierra.dat
```

結局以下のようになる（と思う）
```shell
sudo tlmgr repository add http://contrib.texlive.info/current tlcontrib
sudo tlmgr pinning add tlcontrib '*'
sudo tlmgr install japanese-otf-nonfree japanese-otf-uptex-nonfree ptex-fontmaps-macos cjk-gs-integrate-macos
sudo cjk-gs-integrate --link-texmf --cleanup
sudo cjk-gs-integrate-macos --link-texmf
sudo cjk-gs-integrate-macos --link-texmf --fontdef-add=cjkgs-macos-highsierra.dat
sudo mktexlsr
sudo kanji-config-updmap-sys --jis2004 hiragino-highsierra-pron
```

# テスト
例えば`test.tex`として以下の内容を保存．
```tex
\documentclass[uplatex,a4paper,10pt]{bxjsarticle}
\usepackage[dvipdfmx]{graphicx}

\begin{document}
\section{日本語だよ．}
日本語English
\end{document}
```

つづいて
```shell
uplatex ./test.tex
dvipdfmx test.dvi
open test.pdf
```

私の環境では以上でOKでした．
Azure DevOpsでストアドプロシージャをデプロイする

この記事は [セゾン情報システムズ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/sisco) 2ページ目1日目の記事です。

SQL ServerのストアドプロシージャをGit管理し、デプロイを自動化できないか検討してみました。

## Azure DevOpsのパイプライン
azure-pipelines.yml
```yaml
trigger:
- main

variables:
  - group: DB_VALUE

pool:
  vmImage: windows-latest

steps:
- powershell: |
    Write-Host "##vso[task.setvariable variable=sql;]$(TYPE $(Build.SourcesDirectory)\test.sql)"

- task: SqlAzureDacpacDeployment@1
  displayName: 'contosoSQL'
  inputs:
    azureSubscription: "<service connection name>"
    AuthenticationType: 'server'
    ServerName: $(SERVER_NAME)
    DatabaseName: $(DB_NAME)
    sqlUsername: $(USER_NAME)
    sqlPassword: $(PASSWORD)
    deployType: InlineSqlTask
    sqlInline: $(sql)
```

ポイント
- DBへの接続情報はLibraryで管理します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/e7f1c452-d9b7-32be-23b3-206e71675647.png)
- vmImageはWindowsである必要があります
    - SqlAzureDacpacDeploymentタスクの仕様制限
    - https://learn.microsoft.com/ja-jp/azure/devops/pipelines/tasks/reference/sql-azure-dacpac-deployment-v1?view=azure-pipelines&viewFallbackFrom=azure-devops

- SqlAzureDacpacDeploymentタスクの`InlineSqlTask`オプションにファイル指定ができないので、PowerShellで無理やりファイルの中身を抽出して変数に格納しています
    - https://learn.microsoft.com/en-us/azure/devops/pipelines/process/set-variables-scripts?view=azure-devops&tabs=powershell

SQLの中身
テストなのでめちゃくちゃシンプルですが、既存のプロシージャを更新する場合は`ALTER PROCEDURE <プロシージャ名>`を使います
```sql
ALTER PROCEDURE [dbo].[test]
AS
BEGIN
SELECT * FROM usr
WHERE id = 001
END
```

これでmainブランチに変更がコミットされるとパイプラインが動き、SQL Server上のストアドプロシージャが更新されます。
ストアドプロシージャもGitで構成管理でき、デプロイの自動化もできました！
paiza.ioでelixir その109

# 概要
paiza.ioでelixirやってみた。
練習問題やってみた。

# 練習問題
Agentを使わないで、Forthインタープリタを書け。

# サンプルコード

```

defmodule Main do
    def add(stack) do
	    po = length(stack) - 2
	    top = List.last(stack)
		stack = List.update_at(stack, po, &(&1 + top))
		stack = List.delete_at(stack, po + 1)
	end
	def sub(stack) do
		po = length(stack) - 2
		top = List.last(stack)
		stack = List.update_at(stack, po, &(&1 - top))
		stack = List.delete_at(stack, po + 1)
	end
	def mul(stack) do
		po = length(stack) - 2
		top = List.last(stack)
		stack = List.update_at(stack, po, &(&1 * top))
		stack = List.delete_at(stack, po + 1)
	end
	def div(stack) do
		po = length(stack) - 2
		top = List.last(stack)
		stack = List.update_at(stack, po, &(&1 / top))
		stack = List.delete_at(stack, po + 1)
	end
	def dup(stack) do
		top = List.last(stack)
		stack ++ [top]
	end
	def drop(stack) do
		po = length(stack) - 2
		stack = List.delete_at(stack, po + 1)
	end
	def get(stack) do
		List.last(stack)
	end
	def push(stack, n) do
		{v, _} = Integer.parse(n)
		stack ++ [v]
	end
    def run(str) do
        Enum.reduce(String.split(str, " "), [], fn s, stack ->
            cond do
	        s == "+" ->
		        stack = add(stack)
	        s == "-" ->
		        stack = sub(stack)
	        s == "*" ->
		        stack = mul(stack)
	        s == "/" ->
		        stack = div(stack)
	        s == "dup" ->
		        stack = dup(stack)
	        s == "drop" ->
		        stack = drop(stack)
	        s == "." ->
		        IO.inspect get(stack)
	        true ->
                stack = push(stack, s)
            end
        end)
    end
end

Main.run("9 9 - 9 9 / .")
Main.run("9 9 / 9 9 / + .")
Main.run("9 9 + 9 + 9 / .")
Main.run("9 9 9 + 9 / dup + .")
Main.run("9 9 9 + 9 / dup + - .")
Main.run("9 dup 9 + 9 + 9 / - .")
Main.run("9 9 9 + 9 / - .")
Main.run("9 9 9 drop 9 / - .")
Main.run("9 9 - 9 * 9 + .")
Main.run("9 9 / 9 dup 9 / + .")
Main.run("9 9 9 + 9 / + .")
Main.run("9 dup 9 9 + + 9 / + .")
Main.run("9 9 9 + 9 / dup + + .")
Main.run("9 dup 9 9 + 9 / dup + - + .")
Main.run("9 dup dup 9 + 9 + 9 / - + .")


```

# 実行結果

```
1.0
2.0
3.0
4.0
5.0
6.0
7.0
8.0
9
10.0
11.0
12.0
13.0
14.0
15.0
```

# 成果物

https://paiza.io/projects/Gm-L-RSPpvp0AIcUAsvtBA?language=elixir


以上。
MacのDocker環境をLimaで構築する

## Limaってなに？
https://github.com/lima-vm/lima

virtualboxやwindowsのWSL2のようにlinuxの仮想環境をmac上に構築するツールです。
mac上でdocker環境を構築するにはいくつか方法がありますが、あまりにもDocker Desktopのパフォーマンスが悪いため（主にマウント周り）他の方法を試していきます。

これまでにDocker Desktopの代替として、
* Podmanで構築
* vagrant+virtualboxで構築
* リモートのlinux環境で構築

を試してきました。
そのなかでもvagrant+virtualboxが一番ストレスがないかなといった印象。
ただこの方法だとコンテナにsshしてdockerコマンドを実行するといったワンクッションが入ります。

ざっと調べた感じ、limaはpodmanと同様に、macのターミナル上から直接dockerコマンドを実行しつつマウントやらファイル転送やらが遅くならないようになるはず。


## 準備
homebrewでコマンドをインストールします。

```
$ brew install lima
$ limactl --version
limactl version 0.13.0
```

dockerのコマンドのみをインストールしておきます。
```
$ curl -O https://download.docker.com/mac/static/stable/x86_64/docker-20.10.21.tgz
$ tar zxvf docker-20.10.21.tgz
$ mkdir -p ~/.docker/bin
$ mv ~/docker/docker ~/.docker/bin/
```

docker compose(v2)も利用するのでインストールします。

```
$ curl -SL https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-darwin-x86_64 -o ~/.docker/cli-plugins/docker-compose
$ chmod +x ~/.docker/cli-plugins/docker-compose
```

仮想環境を立ち上げるためのテンプレートというものがあり、今回はDocker環境を構築したいのでdockerテンプレートを利用します。
```
$ curl -O https://raw.githubusercontent.com/lima-vm/lima/master/examples/docker.yaml
$ vim docker.yaml

# ディスクサイズ
disk: "10GiB"
# 共有するディレクトリ
mounts:
- location: "~/projects"
  writable: true
```
ディスクサイズをいったん10GBにして、共有したいディレクトリを指定しつつwritable: trueを書き加えます。

変更した設定ファイルをもとに環境構築をします。
```
$ limactl start ./docker.yaml
...
------
docker context create lima-docker --docker "host=unix:///Users/runeleaf/.lima/docker/sock/docker.sock"
docker context use lima-docker
docker run hello-world
------
```

仮想環境が立ち上がるとdockerを利用するための設定コマンドが最後の方に出力されるので、そのままそれを実行します。

```
$ docker context create lima-docker --docker "host=unix:///Users/runeleaf/.lima/docker/sock/docker.sock"
$ docker context use lima-docker
```

mac上からdocker infoで確認します。

```
$ docker info
Client:
 Context:    lima-docker
 Debug Mode: false
 Plugins:
  compose: Docker Compose (Docker Inc., v2.12.2)

Server:
  ...略
```

## 試す

いちど構築が済めば、以下のコマンドで確認・操作ができます。
```
$ limactl ls
NAME      STATUS     SSH                ARCH      CPUS    MEMORY    DISK     DIR
docker    Running    127.0.0.1:49351    x86_64    4       4GiB      10GiB    /Users/runeleaf/.lima/docker

$ limactl stop docker
$ limactl start docker
```

立ち上げた仮想環境には
```
$ limactl shell docker
```
上記コマンドで入ることができます。

dockerやcomposeはいつもどおり実行できる状態になっていました。

```
$ docker run hello-world
$ docker ps -a
CONTAINER ID   IMAGE                           COMMAND                  CREATED          STATUS                      PORTS     NAMES
a0320ee09576   hello-world                     "/hello"                 24 seconds ago   Exited (0) 23 seconds ago             trusting_wu

$ docker compose run --rm app /bin/bash
```

## 所感
割とすんなり構築できました。
writable: trueの記述がなくてGemfile.lockが更新できずにrailsが起動しない、というところで詰まったくらい。
dockerコマンドをsshしてから実行することもなく、vscodeもRemote-sshを使わずにコードを編集できるので楽です。
マウント周りやrails sなどの実行速度は、やはりlinux環境やvirtualbox環境に比べると若干遅く感じます。ただしDocker Desktopよりは格段に速いので、ストレスはそこまで感じませんでした。
symfony/rate-limiterを使ってみた

EC-CUBE4.2.1の開発で、symfony/rate-limiterを使ってみたのでメモ。

## symfony/rate-limiterとは？

試行回数制限の機能を実装できるライブラリです。
30分間に5回までアクセス許可する、というような試行回数制限の機能を簡単に実装できます。

公式ドキュメントは↓
https://symfony.com/doc/current/rate_limiter.html

## 使い方

symfony/rate-limiterのインストール
```bash
$ composer require symfony/rate-limiter
```

rate_limiter.yamlに設定を記載します。
以下は30分間に5回までの制限をかけるサンプルです。

```yaml
framework:
  rate_limiter:
    hoge:
      policy: fixed_window
      limit: 5
      interval: '30 minutes' 
```

コントローラなどの利用したい箇所でインジェクションし、処理を実装します。
以下はIPアドレスをキーとして試行回数制限をかけるサンプルです。

```php
class HogeController
{
    /**
     * @Route("/hoge")
     */
    // $<yamlで定義したキー名>Limiterでインジェクションする
    public function index(RateLimiterFactory $hogeLimiter, Request $request) 
    {
        // ipアドレスをキーとしてlimiterを生成
        $limiter = $hoge->create($request->getClientIp());

        // 試行回数をカウントし、超過したらアクセスを拒否する
        if (！$limiter->consume()->isAccepted()) {
            throw new TooManyRequestsHttpException()
        } 
    }
}
```

以上で完了です！

EC-CUBE 4.2.1ではスロットリングの機能が追加されますが、このsymfony/rate-limiterを利用して実装しています。機能に対するご要望や、実装へのご意見あればぜひコメントお願いします！

https://github.com/EC-CUBE/ec-cube/pull/5881


## メモ

デフォルトでは試行回数のログはファイルシステムに保存されますが、DBやredis等に保存することも可能です。以下はDBに保存する設定のサンプルです。webサーバを冗長化する際に利用するとよいかと思います。

```yaml
framework:
  cache:
    pools:
      rate_limiter.cache:
       　adapter: cache.adapter.pdo
  rate_limiter:
    hoge:
      policy: fixed_window
      limit: 5
      interval: '30 minutes' 
      cache_pool: rate_limiter.cache
```
PL-900：データ損失防止、コンプライアンス、プライバシー、およびアクセシビリティ

この投稿はMicrosoft PL-900の受験に向けた勉強資料をMS Learnページを参考にして作っています。
一発合格に向けて頑張りましょう！

[公式ページ: データ損失防止、コンプライアンス、プライバシー、およびアクセシビリティ][MS-Learn]

[MS-Learn]: https://learn.microsoft.com/ja-jp/training/modules/introduction-power-platform/3a-data-loss-prevention-compliance-privacy-accessibility

## データ損失防止ポリシー (Data loss prevention policies)
* データ損失防止ポリシー(DLP)を作成すると、ユーザーが誤って組織データを露出してしまうことを防ぐことができる
* 環境またはテナントレベルで範囲を指定可能　→　保護と生産性のバランスを適切に取る合理的なポリシーが柔軟に作れる
* テナントレベルでは以下の要素をスコープ定義できる
    * すべての環境
    * 指定された環境
    * 特別に除いたもの以外のすべての環境
* コネクタ
    * ビジネス、非ビジネスに分類
        * ビジネス　→　ビジネス用データをホストするコネクタ
        * 非ビジネス　→　個人用のデータをホストするコネクタ
        * ブロック済み　→　1つ以上の環境での使用を制限したいコネクタ
    * 新しいポリシーを作成すると、非ビジネスグループに分類される　→　必要に応じてビジネスまたはブロック済みに移行可能
    * DLPポリシーのプロパティを[Microsoft PowerPlatform管理センター][PowerPlatform管理センター]で作成・変更する時にコネクタを管理できる

[PowerPlatform管理センター]: https://admin.powerplatform.microsoft.com/home

* DLPポリシーを作成するのに必要な権限　→　テナント管理者もしくは環境管理者ロール

## コンプライアンスとデータのプライバシー (Compliance and data privacy)
### データ保護 (Data Protection)
* Microsoftデータセンターに転送されたユーザーデータはセキュリティで保護される
    * データセンターへの接続は暗号化される (TLS) 、また全てのパブリックエンドポイントは業界標準のTLSで保護される
* TLS
    * セキュリティ機能付きブラウザからサーバーへ接続することでデスクトップとデータセンター間でデータの機密性と整合性を確保することができる
    * サーバーのエンドポイントにアクセスするには、現時点ではTLS1.2 (またはそれ以上)が必要

### Microsoft Power Platform のアクセシビリティ (Accessibility in Microsoft Power Platform)
* アプリで発生しうるアクセシビリティの問題に関する確認は以下のリンク
    *  [アクセシビリティ チェッカー][アクセシビリティ チェッカー]

[アクセシビリティ チェッカー]: https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/accessibility-checker

* キャンバス アプリのアクセシビリティを高めるための詳細および提案については以下のリンク
    *  [Power Apps でアクセス可能なキャンバス アプリを作成する][Power Apps でアクセス可能なキャンバス アプリを作成する]

[Power Apps でアクセス可能なキャンバス アプリを作成する]: https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/accessible-apps
ActiveRecordのvalidationとbefore_saveの実行順序

順番は以下。

```
validation1 -> validation2 -> before_save1 -> before_save2
```

- validation1 でinstaneのerrosにエラーを追加しても、validation2は続いて呼ばれる。
- validationが全て終わった時点で、そのinstanceのerrorsが空でない場合、before_saveは呼ばれない。
- before_save1 で throw(:abort)した場合、before_save2は呼ばれない
- before_save1 内で errosにエラーを追加することもできる。
GROUP BYで1対1対応の文字データをまとめる関数はどれでもいい【Snowflake SQL】

## 初めに

数値データであれば合計を取ったり，平均を取ったりすればいいですが，
文字データの場合は合計も平均も取れないので，大抵は中身を全て配列に入れてしまうかすると思います．

例えば，以下のようなデータがあるとします．
（適当に作成したので旬がいつとかは無視でお願いします．）
「果物」の項目で集計したい場合，

| 日付 | 果物 | 英名 | 収穫担当 | 収穫量(kg) | 
|:-:|:-:|:-:|:-:|:-:|
| 9月1日 | りんご | apple | 鈴木 | 4 | 
| 9月5日 | みかん | orange | 佐藤 | 2 |
| 9月10日 | りんご | apple | 鈴木 | 3 | 
| 9月12日 | もも | peach | 田中 | 5 | 
| 9月14日 | りんご | apple | 高橋 | 3 | 
| 9月18日 | みかん | orange | 佐藤 | 2 | 

以下のようにするのがよさそうです．（日付は表示しないようにする）

| 果物 | 英名 | 収穫担当 | 収穫量の合計(kg) | 
|:-:|:-:|:-:|:-:|
| りんご | apple | [鈴木，高橋] | 10 | 
| みかん | orange | [佐藤] | 4 | 
| もも | peach | [田中]| 5 | 

「収穫担当」の列は，Snowflakeなら[array_agg](https://docs.snowflake.com/ja/sql-reference/functions/array_agg.html)を，
「収穫量の合計」の列は，[sum](https://docs.snowflake.com/ja/sql-reference/functions/sum.html)を使えば良いかと思います．

ただ，「英名」の列は，「果物」の列の要素と1対1で対応しています．
「収穫担当」の列同様，配列としてまとめてしまうことも可能ですが，他にもいろいろ方法がありそうなので，いろいろ調べてみました．

※本記事はSnowflake上での話になります．

## 候補

<details><summary>MAXを使う(クリックでコードを表示)</summary>

```SQL:
SELECT 果物, MAX(英名), array_agg(DISTINCT 収穫担当), sum(収穫量)
FROM <テーブル名>
GROUP BY 果物;
```
</details>

列に格納された数値で最大のものを得るための関数ですが，文字配列に対しても使用可能です．
GROUP BYでまとめた時に，「果物」の値に対応する文字列が一つしかないならば，これでOKです．


<details><summary>GROUP BYに入れてしまう．(クリックでコードを表示)</summary>

```SQL:
SELECT 果物, 英名, array_agg(DISTINCT 収穫担当), sum(収穫量)
FROM <テーブル名>
GROUP BY 果物, 英名;
```
</details>

+ 「果物」 = りんご　というデータ
+ 「果物」 = りんご かつ　「英名」 = Apple というデータ

果物一つに対して英名が一つしかないのだから，上記でのどちらでまとめても得られる結果は同じになります．

<details><summary>array_aggを使う．(クリックでコードを表示)</summary>

```SQL:
SELECT 果物, array_agg(DISTINCT 英名), array_agg(DISTINCT 収穫担当), sum(収穫量)
FROM <テーブル名>
GROUP BY 果物, 英名;
```
</details>

[]がつきますが，「収穫担当」の佐藤，田中のような感じでまとめられます．

<details><summary>modeを使う．(クリックでコードを表示)</summary>

```SQL:
SELECT 果物, mode(英名), array_agg(DISTINCT 収穫担当), sum(収穫量)
FROM <テーブル名>
GROUP BY 果物;
```
</details>

最頻値を出力します．「果物」 = りんごのデータには，「英名」 = apple というデータしか入ってないので，当然りんごに対してはappleが得られますね．

他にも候補がありましたらコメントで教えていただけるとありがたいです．

## メリット・デメリット

職場のデータで実行速度をまとめてみました．（試行回数3回）
(500万件→4万件に集約）

| MAX | GROUP BY | array_agg | mode |
|:-:|:-:|:-:|:-:|
| 71 ms | 50 ms | 61 ms | 56 ms |
| 67 ms | 69 ms | 65 ms | 64 ms |
| 43 ms | 68 ms | 56 ms | 55 ms |

誤差！自分が試した限りではどれも変わらないっぽいです．

それぞれの関数に対してのメリット・デメリット(所感)ですが，

+ MAX : データ全件において，1対1対応していることを確認しないと使いづらい
+ GROUP BY : SELECTの部分にも，GROUP BYの部分にも列の名前を書かなければならないため面倒
+ array_agg : 1対1で対応していなくても使える
(「みかん」という値に対して，orangeだけじゃなく，tangerineという値が格納されていても集計時にそれに気づくことができる．）
（ただし，orangeに対してtangerineがごく少数でも，[orange, tangerine]とあたかも同数かのように表示されてしまう）
+ mode : 1対1対応していなくても使える．
(orengeというスペルミスが少量あっても，表示されるのは大多数を占める正しい表記「orange」である．ただ，集計時にスペルミスがあることには気付けない．）

これぐらいでしょうか．

## 総括

array_aggが，イレギュラーにも対応しやすいですし．やはり便利でしょうか．

ただ，関数の使い方に自分ルールを設ければ，後からコードを見返した時に列の対情報がわかるのはメリットだと思います．

自分ルールの例: 
・MAXを使っている列はGROUP BYで指定された列と1対1で対応している．
・array_aggを使っている列はGROUP BYで指定された列と1対1で対応していない．
・modeを使っている列はGROUP BYで指定された列とほとんどの場合1対1で対応しているが，例外もある．
・GROUP BYで複数の列が指定されている場合，その列同士は1対1で対応していない．

ここまで読んでいただきありがとうございました．
Linux(よく使うコマンド一覧)

# 基本的なコマンド
* date・・・本日の日付を表示
* echo 文字列・・・文字列を表示
## ファイルに関する操作
* pwd・・・カレントディレクトリの表示
* cd・・・カレントディレクトリを移動する
* ls・・・ディレクトリ内のファイルを表示する
* mkdir・・・新規ディレクトリの作成
* mkdir -p・・・深いディレクトリを一気に作成
* rm・・・ファイルの削除
* rm -r・・・ディレクトリの削除
* rmdir・・・(空の)ディレクトリを削除する
* rm -i・・・削除の確認をしてくれる
* cat・・・ファイルの内容を表示する
* cat -n・・・行番号を記載して表示する
* less・・・ファイルの内容をスクロール表示する
* cp・・・ コピー元 コピー先(コピー名)
* cp -r・・・ディレクトリのコピー
* mv ファイル名A ファイル名B・・・ファイル名の変更
* mv ファイル名　ディレクトリ名・・・ファイルの移動
* ln -s A B・・・Aに対してBというシンボリックリンクの作成
* ls -l・・・シンボリックリンクの確認
## lsコマンドのオプション
ls -l・・・ファイルの詳細情報を表示
ls -a・・・隠しファイルを含めたすべてのファイルの表示
ls -F・・・ファイルの種別を表す記号を追加して表示
ls -w桁数・・・表示する桁を指定して表示
## オプションの使い方
どちらでも大丈夫！！
ls -a -F
ls -aF
## カーソル移動、削除など
* ctrl + b・・・1文字左に戻る
* ctrl + f・・・1文字右に進む
* ctrl + a・・・行頭に移動
* ctrl + e・・・行末に移動
* ctrl + h・・・カーソル位置の後方に1文字削除
* ctrl + d・・・カーソル位置の1文字を削除
* ctrl + w・・・単語を削除
* ctrl + k・・・カーソル位置から行末まで削除
* ctrl + u・・・カーソル位置から行頭まで削除
* ctrl + y・・・削除した内容を挿入する(ヤンク)
* ctrl + s・・・画面表示をロックする
* ctrl + q・・・画面表示ロックを解除する
* ctrl + c・・・入力内容の破棄
* ctrl + l・・・画面を削除する
* ctrl + p・・・1つ前のコマンド履歴に移動
* ctrl + n・・・次のコマンド履歴に移動
* ctrl + r・・・履歴を遡ってインクリメンタルの検索
[GitHub]リポジトリ削除

[WEB版]リポジトリの削除手順、よく忘れるので備忘録。

歯車アイコンSettingタブに移動。
![無題２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/64a36caa-f064-f371-6c17-1ae12fcb9a65.png)

危険ゾーンまでスクロールし、「Delete this Repository」をクリック。
![無題２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/26967be5-ca44-7e5f-f38f-8701a66015a3.png)

これより先のリポジトリの削除は、自己責任で。

リポジトリのパスを入力①、正確に入力できたら②が押せるので、自己責任でクリックする。
![無題２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/087f8be7-f1bf-3214-064a-b2b74f99d792.png)


以上。
プロジェクト管理：マズローの欲求五段階説をプロジェクト炎上に例えてみた

マズローの欲求五段階説をご存知ですか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/94537fcf-7ee0-28ba-957d-f99b50f7231f.png)

１.生理的欲求
２.安全の欲求
３.親和の欲求
４.自我の欲求
５.自己実現の欲求

人間の欲求を5段階に分けて、数字が大きくなるにつれ、欲求のレベルが上がってくる事を定義した物です。
人間は、ある一定のレベルの欲求に満足すると、そのレベルの欲求だけでは、満足できなくなり、次のレベルの欲求を求めるという物です。

１は、食欲、睡眠欲、性欲とかの人として本能レベルの基礎的な欲求。
２は、安全な状況下を求めるレベルの欲求。
３は、仲間でいたい欲求です。集団に帰属したいという欲求。
４は、自分を他人に認めてもらって、尊敬されたり、他人を助けたりしたい欲求。
５は、自分の能力を高め、成長したい欲求。
このマズローの欲求五段階説を開発プロジェクトで考えて見ましょう。
# プロジェクトスタート
社会人としてなので、マズローの１，２は、当然、満足している状態です。
先ずは、**３.親和の欲求**が生じます。新しくプロジェクトに入った状態なので、先ずは、プロジェクトの仲間との交流が最も大事になるでしょう。
プロジェクトリーダーのあなたは、　この段階で、メンバーに頑張れとか、あれをヤレ！とか、言っては無駄です。何故なら、メンバーは、親和の欲求状態にあるからです。　先ずは、仲間と皆で認め、お互いが信頼できる状態にしてあげる事が最も重要です。
自己紹介をやったり、飲み会をやったり、キックオフ会議をやったり互いの信頼関係を構築します。

# お互いを知った後に
仲間との信頼感ができあがってくると、次に**４.自我の欲求**が発生します。仲間に対して、尊敬してもらったり、自分が組織の中で価値のある物と認めてもらいたいという欲求が出てきます。この状態では、その人の得意分野でチャンスを与えてあげる事が必要だと思います。**インセプションデッキ**を作って役割分担の整理し、お互いの自我を満足させます。

# 自我の欲求が満たされると
仲間から認められ、尊敬されてくると、次に**５.自己実現の欲求**が発生します。これは、仲間の中からの尊敬から、自分自身の心の中の成長や発展にフォーカスが移っていく状態です。プロジェクトの目的とは、違うスキルアップのための要望が出てきたりします。ここでコントロール出来ればプロジェクトは成功するでしょう。
当然、レベル３で満足する人やレベル４で満足する人もいる訳で、その人の欲求＆レベルに合わせてのマネージメントが大切です。

# プロジェクトが炎上し始めると
プロジェクトが上手く機能しなくなると、**５.自己実現の欲求**の状態所ではなくなります。プロジェクトの成功に向けて、全員一致で進む必要があります。
**４.自我の欲求**によりプロジェクト達成努力に意識がいき、やり遂げるという達成感のために努力し始めます。
それでも上手く行かないと、**３.親和の欲求**の状態で仲間のために頑張ろうと努力し始めます。
しかし、プロジェクトが炎上し始めると、残業が続き、休日出勤が続きます。次第に**２.安全の欲求**、**１.生理的欲求**とドンドン下がっていきます。そしてプロジェクトは頓挫します。。。

# プロジェクト炎上時は、マズローの欲求五段階の順に解除する
立上げ時よりもさかのぼり、第一段階から対応します。つまり、残業や休日出勤を減らし勤務を通常状態にし、プライベートも確保してあげて、通常のレベルまで持っていきます。
その後、再度、バラバラになったメンバーの気持ちをまとめ上げて、**３.親和の欲求**を満たします。余裕が出てくると**４.自我の欲求**まで満たせる様に意識します。**５.自己実現の欲求**までは必要ないと思います。
プロジェクト炎上時には、このマズローの欲求五段階を意識しないといけません。残業も減らさず、休日出勤も多いままの状態で仲間のために、プロジェクトのために頑張れと言っても誰も話しを聞きません。
プロジェクト炎上の際には意識してみてください
# 最後に
今後も続けていきますので、フォロー、イイね、シェアお願いします。
下記、説明会もご参加下さい。
[エンジニア年収アップ講習(転職サポート付き！)　無料説開会　12月6日　19時開催](https://cto-can-be.hp.peraichi.com/)
[github]リポジトリ作成直後にブランチとファイルを新規作成する

[WEB版]githubにて、新規環境構築ではまりがちな事象の備忘録。

リポジトリ作成後、mainブランチと新規ファイルを登録するときの手順。
 (新規ファイルとmainブランチは一括作成)

下の図の赤枠「uploading an existing file」をクリック。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/ed429b2d-4cd0-bc43-d0e3-48c272116092.png)

ファイルをアップロードすると、mainブランチも連動して作成される。

![無題２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759593/8be309cf-4ca1-42fb-06f3-b4ac7ffbc385.png)

以上。
(爆速で)Arduino IDE 2.0をそろそろ試してみたい人向け。ESP32環境構築してLチカする

IDE2.0が公開されて3カ月経ちますね。今更だけど・普段はVScodeだけど本家IDE2.0が気になる。
そして、ESP32を使っている人は設定が毎度面倒で結局試していない・・・
そんな人向け爆速でESP32をLチカさせましょう。

※普段Arduino/ESP32等のハードを使用している人向けです。詳細な説明は省きます※

# 早速ダウンロード
win10の人は**Win 10 and newer 64 bits**です。
 
https://www.arduino.cc/en/software#future-version-of-the-arduino-ide


# ESP32環境構築①


File→Preferencesにてjsonを貼り付ける

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342722/257c63db-37ce-d43c-3bf1-4d80bdbbbb9b.png)


```
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
```

#  ESP32環境構築②
ボードマネージャーで**ESP32**を検索してインストール
![スクリーンショット 2022-12-01 120847.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342722/1c4d0bf4-9cd0-f621-0f90-584a4cbc6dcc.png)

再起動しましょう


# ボードの選択

**ESP32 Dev Module**とポートを選択する
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342722/11c407d1-63ab-8b7d-0890-5dd0076ca16d.png" width=50%>

# Lチカさせる
コードを書いて、**書き込み** する
```javascript
int led = 5;

void setup() {
  // put your setup code here, to run once:
  pinMode(led, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(led, HIGH);
  delay(500);
  digitalWrite(led, LOW);
  delay(500);
}
```

### アノードカソード
いつも忘れるやつ。[引用元](http://www.my-craft.jp/html/aboutled/led_kyokusei.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342722/a8d25de0-2b13-61a2-7dc5-ab8ffe7870ff.png)


はい、完成！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342722/54798f97-dc69-ac1e-7467-fa52a9af00ee.png" width=50%>


# (おまけ)ダークモード&入力補完を設定する
ダークモード：**File→Preferences→Theme**
意外とかっこいい・・・

入力補完：**Editor Quick Suggestionsにチェック**

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342722/589f7968-63b9-4803-6515-cf8640905490.png" width=80%>
個人的に最もおすすめなEDAツール Sweetvizの使い方

# EDAって何？

EDAとは**探索的データ分析**（Exploratory Data Analysis)の略です。

データの中身をざっと理解したり、データの特徴を捉えたりすることを指します。

具体的には、

- 特徴量ごとに平均・分散・ヒストグラムなどを作成して、データ全体の傾向を理解する
- データの量や欠損値の数を計算し、データの品質を確認する
- 特徴量間の相関係数を計算し、特徴量の関係を捉える

といったことが挙げられます。

このように、データの全体像や傾向などを確認することで、データ分析上の有益な気付きを得ることができます。

しかし、pandasやmatplotlibでいちいちこれらのコードを書くのは面倒です。

そこで、基本的なEDAがたった数行でできてしまうEDAツールを使うと便利です。

# EDAツールの紹介

有名なEDAツールとしては

- Pandas-profiling
- Sweetviz
- Autoviz

が挙げられます。

個人的にはSweetvizがお気に入りです。

Sweetvizの強みは、**学習データとテストデータの比較ができる**ところです。

これはPandas-profilingやAutovizにはない機能です。

# Sweetvizを使ってみる

1. インストール

    ```
    pip install sweetviz
    ```

2. インポート
    ```py
    import sweetviz as sv
    ```

3. EDA実行

    データを1つ扱う場合は`sv.analyze()`を、データを2つ扱う場合は`sv.compare()`を使います。

    ```py
    # 1データの場合
    report = sv.analyze(df)

    # 2データの場合
    report = sv.compare(df_train, df_test)
    ```
   
    目的変数がある場合は、オプション引数`target_feat`にカラム名を指定すると、目的変数を考慮したEDAを行なってくれます。

    ```py
    # 1データで目的変数を指定する場合
    report = sv.analyze(df, target_feat="hogehoge")
    
    # 2データで目的変数を指定する場合
    report = sv.compare(df_train, df_test, target_feat="hogehoge")
    ```
    
    データフレームに別名をつけて出力することもできます。

    ```py
    # 1データの場合
    report = sv.analyze([df, "Data"])
    
    # 2データの場合
    report = sv.compare([df_train, "Train"], [df_test, "Test"])
    ```
    
4. 出力

    3で`report`を作成したら、EDAの結果を出力します。

    - HTMLファイルに出力する場合

        ファイルパスを指定しない場合は、`SWEETVIZ_REPORT.html`で出力されます。

        ```py
        report.show_html("eda.html")
        ```

    - ノートブックのセル内で出力する場合
        ```py
        report.show_notebook()
        ```

# 使用例

ここでは、カリフォルニアの住宅価格データを使います。

```py
# 2データを比較
report = sv.compare([df_train, 'Train'], [df_test, 'Test'], target_feat="median_house_value")

# HTMLファイルに出力
report.show_html()
```

すると、下のようにHTMLファイルが作成されます。

- 特徴量ごとの基礎統計量
- ヒストグラム
- 学習データとテストデータの比較

などが表示されました。

![SS.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1734810/284f29f1-32fb-1a11-0caa-275b6fd042cc.jpeg)


# おわりに

Sweetvizを用いることで簡単に基礎的なEDAをたった数行で終わらせることができました。

しかも結果が1ページにまとまっているので見やすいです。

ぜひみなさんもお試しください！
propsの更新が反映されない問題に直面した話

# はじめに

私はしばらく前からReactが気になっていて、この間ついに手を出しました。
まずは簡単なWebアプリを作ってみようと思い、コードを書いて動作確認していたのですが、嵌った点があるので書いていきます。

# やっていたこと

まず、アプリ全体のコンポーネントを作成しました。

```App.tsx
import {React} from 'react';
import ComponentA from './componentA.tsx';

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      fuga: /* Object */
    };
  }

  onEvent(e) {
    this.setState(
      () => {
        {fuga: /* new Object */}
      }
    );
  }

  render() {
    return (
      <div
        onClick={this.onEvent.bind(this)}
      >
        <ComponentA
          fuga={this.state.fuga}
        />
      </div>
    );
  }
}

export default App;
```

後で書くコンポーネントに、`prop`として`fuga`というオブジェクトを渡すというものになっています。

# ダメだった例

内部のコンポーネントのコードを、まず下記のようにしました。

```componentA.tsx
import {React} from 'react';

class ComponentA extends React.Component {
  constructor(props) {
    super(props);
    this.state = {hoge: this.fuga(this.props.piyo)}
  }

  fuga(piyo) {
    // 値の加工処理
  }

  render() {
    return (<div>{this.state.hoge}</div>);
  }
}

export default ComponentA;
```

そして実際にアプリを起動して動作確認をしたのですが、画面をクリックしても何も反応がありませんでした。
どこで問題が起こっているかを探ってみたところ、どうも`App`内の`this.state.fuga`の更新はされているものの、`ComponentA`の`this.state.hoge`が更新されず、従って`ComponentA`の更新もされていないようでした。

# 成功した例

色々方法を考え試した結果、以下のコードになりました。

```componentA.tsx
import {React} from 'react';

class ComponentA extends React.Component {
  constructor(props) {
    super(props);
  }

  fuga(piyo) {
    // 値の加工処理
  }

  render() {
    return(<div>{this.fuga(this.props.piyo)}</div>)
  }
}

export default ComponentA;
```

`constructor`内で`this.state`を`this.props`を用いて定義せず、`render`関数内に`this.props`を用いた処理を書くということで解決できるようでした。

# おわりに

Reactは奥が深いですね…。

この問題について上手く説明できる方がいらっしゃいましたら、コメント等頂けると有り難いです。
picoCTF Writeup picoGym Practice Challenges Some Assembly Required 2 (注意<spoiler>)

# Some Assembly Required 2
Description
http://mercury.picoctf.net:61778/index.html

問題からしてweb assemblyのことを聞かれているので
wasm->5655afae
を見るとコードの最後の方にxakgK\5cNs((j:l9<mimk?:k;9;8=8?=0?>jnn:j=lu\00\00
と書かれてる。

https://dencode.com/ja/
デコードしようとしても出てこない。

CyberChefを使う。

https://gchq.github.io/CyberChef/

https://am7cinnamon.hatenablog.com/entry/introduction-to-cyberchef

inputにxakgK\5cNs((j:l9<mimk?:k;9;8=8?=0?>jnn:j=lu\00\00を入力

OperationsからMagicを検索しRecipeにドラッグ

intensiv mode にチェックし

Cribにキーワード（ここではpico）を入力しoutputでフラグにあたりそうなのをさがす

```
picoCT=kF{  b2d14eaec72c31305075876bff2b5d}T88T88
```

いらなさそうな部分を消せばフラグとして提出できる。

picoCTF{  b2d14eaec72c31305075876bff2b5d}
Proxyサーバー経由でPythonライブラリをインストールする方法

# はじめに
社内等、外部ネットワークにプロキシサーバーを経由する必要がある場合、`pip install [package]`ではPythonライブラリのインストールができず、プログラミング履修の導入時に障壁になることなどがあります。
また、これまでは回避のためanacondaをインストールすることである程度のライブラリを予め揃えることができましたが、商用利用の有償化により、一つ一つライブラリを揃え環境の構築が必要になりました。

ここではプロキシサーバーを経由したPythonライブラリのインストール方法を2つご紹介します。
例として、`numpy`をインストールする場合のコマンドを例示します。

# 環境
OS: Windows10, または Ubuntu18.04LST
※Ubuntu以外のLinuxOSについては試していないため、保証できません。

Python: 3系 
※Anacondaではなく、[Pythonホームページ](https://www.python.org/)からダウンロード＆インストールしたものとします。

# 方法
#### 1. コマンドにオプションを付けて対応
##### Windows, Linux共通

```
$ pip install numpy --proxy "proxyserver:port"
```
オプションとして、`--proxy "proxyserver:port"`を追加してインストールします。`"proxyserver:port"`の部分はプロキシサーバーの設定毎に変更します。

#### 2. Proxy設定を行う
以下設定を行えば、プロキシサーバーの宣言無くライブラリインストールが可能です。
##### Windows
以下ディレクトリに`pip.ini`という名前で保存します。
保存先: `C:\User\$USER\AppData\Roming\pip\`
ファイル名:`pip.ini`
```C:\User\\$USER\AppData\Roming\pip\pip.ini
[global]
proxy = "proxyserver:port"
```
編集は任意のエディタで可です。簡単な方法だと、`pip.ini.txt`というテキストファイルを用意し、メモ帳で編集&保存後、ファイル名を変更すればOKです。

##### Linux
`pip.conf`でプロキシ設定を行います。
保存先: `~/.config/pip/`
ファイル名:`pip.conf`
```~/.config/pip/pip.conf
[global]
proxy = "proxyserver:port"
```

または、`proxy.conf`で設定しても通りました。`apt`のプロキシ設定のはずですが。
保存先: `/etc/apt/apt.conf.d/`
ファイル名:`proxy.conf`
```/etc/apt/apt.conf.d/proxy.conf
Acquire {
  HTTP::proxy "proxyserver:port";
  HTTPS::proxy "proxyserver:port";
}
```
### 
良きPythonライフを！

#### 参考
https://codechacha.com/ja/pip-install-beyond-proxy/