OmniAICreator/Qiita-1.07M huggingface dataset:
パッケージ管理システム#2

# npm インストールのオプションを使い分ける
前回の記事でpackage.jsonとpackage-lock.jsonの違いやnode_modulesをまとめました。今回は、
・npm install
・npm install ＜package＞
・npm install -D ＜package＞
・npm install -g ＜package＞
の使い分けをまとめます。

## npm install 
用途・・・package.json及びpackage-lock.jsonが共有されていて、自分のディレクトリでまだpackageがインストールできていない時にnode_modulesを生成（packageをインストール）する。
もしくは、package.jsonが更新され、新たに全てのパッケージをインストールするとき

## npm install ＜package＞
ローカルインストール
用途・・・グローバルインストールでもdevインストールでもない時に使用する。基本的にはこのインストールコマンドを使用する。
packageは、.node_modules/.bin/配下にインストールされる

※共同開発するときは基本的にローカルインストール。
package.jsonを自動的に更新でき、package.jsonとpackage-lock.jsonを他の人に共有し、各々がnpm installで全く同じpackageをnode_modulesに書くのできるので、全く同じ開発環境を整えることができる。

## npm install -D ＜package＞
これもローカルインストール。
用途・・・開発でしか使わないpackageをインストールするときに使用する。こちらも同様にpackage.jsonが自動的に更新されるが、package.jsonにはdev-dependciesと記載される。
パッケージは、.node_moduless/.bin/配下になる

※開発者でない人が、npm installを使用すると開発でしか使わないパッケージもインストールしてしまうが、
npm install -productionを使って開発用パッケージを除外してインストールできる。そのため、開発用とそうでないパッケージのインストールは使い分ける必要がある。

## npm install -g ＜package＞
グローバルインストール。
自分のPC環境ならどこでも使えるようになる。
package.jsonは更新されない。よって、なにもかもグローバルインストールするのはダメ。（パッケージ情報を共有できないので他のPCで同じ環境が作れない）
パッケージは、/usr/local/bin/配下に格納される
CLIツールで使用するにはpackage.jsonのscriptに定義する必要がある。
※一人で開発するときは、他人にパッケージを共有しないので、グローバルインストールでも良い。

# 余談
## チーム開発の流れ
ファイルサイズがデカくなってしまうため、チーム開発でnode_modulesは共有しない。package.jsonとpackage-lock.jsonのみを共有する。

手順
１.node_modules以外をgithubにアップする
２.メンバーはローカル環境にプロジェクト全体ファイルをダウンロード。
３.npm install を使用して、node_modulesを作成（パッケージをインストール）

ex) scssをcssに変換（ビルド）するためにはsassが必要。
状況に応じて、グローバルもしくはローカルインストールする

## npmとyarnの違い
yarnはnpmの後に登場したJSのパッケージマネージャ。
npmの上位互換のツールで、npmとの互換性があり、package.jsonが使える
### yarnが優れている点
・インストールの高速化
npmもアップデートされているがyarnの方が高速
・高いセキュリティ
yarnはライブラリの整合性をチェックする
・バージョン管理しやすい
yarnにしかない機能がある
upgrade-interactive・・・アップデートできるパッケージを表示する。

次回の記事では、npmとyarnのコマンドをまとめます。
【C言語】再帰で組合せを求めるプログラムを作ってみた

初めまして。僕はプログラミングの勉強中です。

再帰プログラムを作りたいと思い、再帰で組合せを求めるプログラムを挑戦してみました。

`実際に作成したプログラム`

```saiki3.c
#include <stdio.h>

//順列を求める
int N(int n, int r){ //関数Nにnとrを入れたので、nとrを両方とも使える
	int m;
	if(r == 0){
		return 1;
	}
	m = N(n - 1, r - 1);
	return n * m;
}

//rの階乗を求める
int R(int r){ //関数Rにrだけ入れたので、rだけしか使えない
	int m;
	if(r == 0){
		return 1;
	}
	m = R(r - 1);
	return r * m;
}	

//組合せを求める
int NR(int n, int r){ //関数NRにnとrを入れたので、nとrを両方とも使える
	return N(n, r) / R(r);
}

int main ( void ){
	int n, r;
	printf("n>>");
	scanf("%d", &n);
	printf("r>>");
	scanf("%d", &r);
	printf("n : %d\n", N(n, r)); //関数Nにnとrを入れる
	printf("r : %d\n", R(r)); //関数Rにrだけ入れる
	printf("組み合わせは %d 個です", NR(n, r)); //関数NRにnとrを入れる
	return 0;
}
```

```（結果）result.
n>>6
r>>3
n : 120
r : 6
組み合わせは 20 個です
```

こんな感じで作りました。再帰関数は初めて使いました。

`失敗したこと`

最初に作成したのは、int main(void)にN(n), R(r)を別々に入力しました。別々にしたためにscanf型のnとrに入力された数値がN(n)はnだけ、R(r)はrだけしか使えなかったためにint N(int n, int r)を入力したらエラーが表示されました。

```（ダメな例）error.c
#include <stdio.h>

//順列を求める
int N(int n, int r){ //int main(void)でN関数にnだけしか入力されていないのでエラーになる！
	int m;
	if(r == 0){
		return 1;
	}
	m = N(n - 1, r - 1);
	return n * m;
}

//rの階乗を求める
int R(int r){ //関数Rにrだけ入れたので、rだけしか使えない
	int m;
	if(r == 0){
		return 1;
	}
	m = R(r - 1);
	return r * m;
}	

//組合せを求める
int NR(int n, int r){ //関数NRにnとrを入れたので、nとrを両方とも使える
	return N(n, r) / R(r);
}

int main ( void ){
    int n, r;
    printf("n>>");
    scanf("%d", &n);
    printf("r>>");
    scanf("%d", &r);
    printf("n : %d\n", N(n)); //←　Nの関数はnだけしか使えない
    printf("r : %d\n", R(r)); //←　Rの関数はrだけしか使えない
    printf("組み合わせは %d 個です", N(n), R(r));
    return 0;
}
```

最初はどうしてエラーが表示されたのか意味が分からなくて頭を抱えました。インターネットで再帰関数を使って作成しているプログラムを調べてみました。調べてみると。int nとint rを両方とも使いたければ、int main(void)のNの関数にnとrを入力すれば、解決することができました。

再帰関数は使ったばかりなので、まだまだ分からないことがあります。再帰関数を使いこなせるように他のプログラムを試しに作り、挑戦していきたいです。

説明は上手にできなくて分かりづらいな部分があると思います。分かりづらいな部分がありましたら教えてください。または、間違っている部分があれば教えていただけると嬉しいです。どうぞよろしくお願いします。

ここまで読んでいただきありがとうございます。次のプログラムを作成したら、また投稿したいと思います。お待ちください。ではまたね！
ゼロからNode.js環境をHomebrew、nodenv経由で構築(MacOS)

# ゼロからNode.js環境をHomebrew、nodenv経由で構築
大学入学時に購入して何もわからず環境構築したMacBook Pro。
何かがおかしいと気づきつつ無理矢理使ってきましたが本当に限界を感じたので一旦出荷状態まで戻して全てを最初からやり直します。
**この記事ではNode.js環境をHomebrew、nodenv経由で構築していきたいと思います。**
一連の投稿のハブになる記事は[こちら](https://qiita.com/TakayoshiK/items/ae53424b788c8fcb645b)

**参考にさせていただいた記事**
[MacにHomebrew経由でnodenvを導入する（＋PHPStorm対策）](https://qiita.com/alice37th/items/989af6749264de50bb85)

## 環境
MacBook Pro (13-inch, 2018)
macOS　Monterey Version 12.5
メモリ intel Core i5
zsh 5.8.1 (x86_64-apple-darwin21.0)

## 経緯
バージョン管理しつつnode.jsを使いたいと思っての環境構築。過去にてきとうにやりすぎて時々謎のエラーを吐いてたので今回は綺麗に環境構築を目指します。

## Xcodeをインストール
**既に完了している場合はスキップしてください**
Xcodeを入れとくと色々なライブラリーが使えるらしいのでXcodeをインストール。
インストールは[AppleStore](https://apps.apple.com/jp/app/xcode/id497799835)からできる。
そこそこ時間がかかるので進んでいるか不安になりますが多分大丈夫です。

終わったらComand Line Toolをダウンロードしていきます。
terminal(わからない人はcomand+spaceを押してterminalと検索)を開いて下のコマンドを実行。
```:terminal.app
user@host $ xcode-select --install
xcode-select: error: command line tools are already installed, use "Software Update" to install updates
```
既に入っているらしい。(入っていない場合があるのかは知らない。入っていなければ指示に従って入れてください)
次にEULAに同意する。
```:terminal.app
user@host $ xcode-select -license
```
`space`を押して進めて大丈夫そうなら`agree`と入力して`Enter`を押しましょう。

最後にインストールされているのを確認します。
```:terminal.app
user@host $ xcode-select --print-path 
/Applications/Xcode.app/Contents/Developer
```
こんな感じでpathが出力されればOKです。
確認してないですがdeveloper toolsのインストールを求められる場合があるらしいので指示に従ってインストールしましょう。
(私は別のものをいじっている時に求められて入れていたので必要なかった？)

## Homebrewのインストール
**既に完了している場合はスキップしてください**
次はHomebrewをインストールします。
[Homebew公式](https://brew.sh/index_ja.html)に記載されているコマンドを入力してインストールします。(パスワードを求められます)
```:terminal.app
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
必要に応じて.zshrcファイルを作成してpathとかを書き込んでください。

Homebrewのインストールを確認しましょう。
```:terminal.app
user@host $ brew doctor
Already Up-to-date.
```
上のようにAlready Up-to-dateと出ればOKです。warnigが出た場合は適時解決しましょう。
私の場合はwarningが出て下のコマンドの実行を求められました。
```:terminal.app
user@host $softwareupdate --all --install --force
```

## nodenvのインストール
次にhomebrewを使ってnodenvをインストールします。
必要に応じてhomebrewをアップデートしてください。
```:terminal.app
user@host $brew install nodenv
```
~/.zshrcに書き込んでいきます。(/zprofileに書き込むパターンもあり、詳しくは適時調べてください)
まずは.zshrcが存在するか確認しましょう。
```:terminal.app
user@host $la -a
```
無い場合は作ります。(ある人はスキップ)
```:terminal.app
user@host $touch .zshrc
```
~/.zshrcに書き込みます。
```:terminal.app
user@host $echo 'export PATH="$HOME/.nodenv/bin:$PATH"' >> ~/.zshrc
user@host $echo 'eval "$(nodenv init -)"' >> ~/.zshrc
```

## Node.jsのインストール
nodenvを使ってNode.jsをインストールしましょう。
まずは利用できるバージョンを確認します。
```:terminal.app
user@host $nodenv install -l
```
いっぱい出てくると思うのでその中からインストールするバージョンを決めます。
今回はv18.7.0をインストールします。
```:terminal.app
user@host $nodenv install 18.7.0
```
バージョンを切り替えてインストールしたNode.jsを使えるようにします。
```:terminal.app
#ユーザー全体で設定
user@host $nodenv global 18.7.0
#フォルダ内で設定
user@host $nodenv local 18.7.0
```
(おまけ)設定されているバージョン・インストールされているバージョンの確認
```:terminal.app
user@host $nodenv versions
* 18.7.0 (set by /Users/takayoshi/.nodenv/version)
```
## 終わりに
今回はHomebre、nodenv経由でNode.jsをインストールしました。
誤字等あったらご指摘ください。
記事を参考にさせていただいた方々本当にありがとうございます。
【日付計算】Rubyで◯時間前、◯日前、◯ヶ月前、◯年前と計算するメソッド

業務で更新日（updated_at）と今日の差分を計算して○日前と返すapiを作成することがあったのですが、この仕様とマッチする記事がなかったのでQiitaに残しておきます！

以下の記事を参考にさせていただきました。
基本的なロジックやコードの解説はこちらの記事を参考にしてください。

[満経過月数を計算するロジック(Ruby)](https://qiita.com/tomoya_sakusaku/items/71801ad618394ca3cbc7 "満経過月数を計算するロジック(Ruby)")

## 今回の仕様

**最終更新日から今日の差分を計算して○日前と返す**

『0~24時間前』 『1~30日前』 『1ヶ月~12ヶ月』 『1年~』の単位で区切る

例) Today：2022/07/30/10:00
Last_updated：2021/07/30/19:00
⇨『一年前』を返す


例)Today：2022/07/30/10:00
Last_updated：2022/06/30/19:00
⇨『一ヶ月前』を返す

例)Today：2022/07/30/19:00
Last_updated：2022/07/29/19:00
⇨『一日前』を返す

例)Today：2022/07/30/10:00
Last_updated：2022/07/29/19:00
⇨『15時間前』を返す

#### ※注意点
『◯年前』と『◯ヶ月前』はTodayの時間がLast_updatedの時間を**超えていなくても**日付が更新される。
⇨日付が変わったタイミングで更新される。

Today：2022/07/30/**00:00**
Last_updated：2021/07/30/10:00
⇨『一年前』を返す


『◯日前』はTodayの時間がLast_updatedの時間を**超えたら**日付が更新される。
⇨時間を超えるまで更新されない。

Today：2022/07/30/**10:00**
Last_updated：2022/07/29/19:00
⇨『15時間前』を返す

例)Today：2022/07/30/**19:00**
Last_updated：2022/07/29/19:00
⇨『一日前』を返す



## コード

```ruby.rb
    NUMBER_OF_MONTHS = 12
    SECONDS_PER_HOUR = 3600
    HOURS_PER_DAY = 24

  def calculate_date(last_updated)
    today = Time.current

    diff_years = calculate_diff_years(today, last_updated)
    return "#{diff_years}年前" if diff_years >= 1

    diff_months = calculate_diff_months(today, last_updated)
    return "#{diff_months}ヶ月前" if diff_months >= 1

    diff_days = calculate_diff_days(today, last_updated)
    return "#{diff_days}日前" if diff_days >= 1

    diff_hours = calculate_diff_hours(today, last_updated)
    "#{diff_hours}時間前"
  end

  def calculate_diff_years(today, last_updated)
    calculate_diff_months(today, last_updated) / NUMBER_OF_MONTHS
  end

  def calculate_diff_months(today, last_updated)
    (today.year - last_updated.year) * NUMBER_OF_MONTHS + today.month - last_updated.month - (today.day >= last_updated.day ? 0 : 1)
  end

  def calculate_diff_days(today, last_updated)
    (today.to_i / SECONDS_PER_HOUR - last_updated.to_i / SECONDS_PER_HOUR) / HOURS_PER_DAY
  end

  def calculate_diff_hours(today, last_updated)
    (today.to_i / SECONDS_PER_HOUR - last_updated.to_i / SECONDS_PER_HOUR) % HOURS_PER_DAY
  end
```

### 最後に

よくある実装なので何かgemあると思ったのですが、無くて意外でした笑
同じような実装する時があれば参考にしてもらえると幸いです。

参考になったよって方はLGTMや[Twitter](https://twitter.com/Jackpackeeer "ジャックのTwitter")をフォローしていただけると嬉しいです！
VueのビルトインサーバーをDockerコンテナ内で動かしているときにホットリロードが利かない問題

# 環境
Nodeコンテナ：16.16.0-bullseye
npm 8.15.1
@vue/cli 5.0.8

# 前提

`npm run dev`でサーバーが立ったとか、サーバー再起動すればソース更新分は反映されるとかそういう状態。

# 対処

プロジェクトフォルダのてっぺんにある`vue.config.js`に、以下を追記する。

```js
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,

  // 以下を追記

  configureWebpack: {
    watchOptions: {
      aggregateTimeout: 300,
      ignored: /node_modules/,
      poll: 1000
    }
  }

  // ここまで

})
```
参考

> If watching does not work for you, try out this option. This may help issues with NFS and machines in VirtualBox, WSL, Containers, or Docker. In those cases, use a polling interval and ignore large folders like /node_modules/ to keep CPU usage minimal.
[Watch and WatchOptions \| webpack](https://webpack.js.org/configuration/watch/#watchoptionspoll)

ファイル変更の監視がうまく働かない場合はポーリングを試してみろ。これはDockerで使われるようなNFS（ネットワークファイルシステム）で動いている場合にうまくいくかもよ。その場合、`ignored`を入れると、そこは監視しないからCPU使用率が下がるぞ

って書いてある。
[Blender]画面レイアウトをデフォルトに戻す方法

# 概要
Blenderを触っていると不意に画面枠がどんどん増えてしまい、収拾がつかなくなる事ってあると思います。
![スクリーンショット 2022-07-30 17.06.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/49085bf5-2f91-2172-ac79-9e4cfc099236.png)

# 本文
そんな時は右上の「＋」ボタンを押して
![スクリーンショット 2022-07-30 17.07.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/78a64a89-ffeb-9955-e6bc-9bde8896b715.png)
表示されたメニューからGeneralを選んだ後、元に戻したいデフォルト画面の項目を選ぶとデフォルトの画面配置に戻す事ができます！
（今回の例ではShading画面で作業をしていたのでShadingを選びました）
![スクリーンショット 2022-07-30 17.07.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/49dd4bc8-08a4-fefd-2081-9ad42200a59f.png)
#include "N4910.h"

C++N4910資料の改善点
https://qiita.com/kaizen_nagoya/items/fb4ceb5d117a54641af3

で、大きくなりすぎた資料を半分にする計画の最終兵器。
ヘッダファイルを共通化する。

```c:N4910.h"
#include <cstddef>
#include <iostream>
#include <cstdio>
#include <cstdlib> 
#include <cstring>
#include <cassert>
#include <coroutine>
#include <vector>
#include <complex>
#include <map>
#include <atomic>
#include <unordered_map>
#include <optional>
#include <memory>
#include <variant>
#include <any>
#include <bitset>
#include <typeinfo>
```

もう３つくらい増えるはず。
# 目的
## 各ファイル文字数削減
それぞれのソースファイルでも、Qiitaの記事でも、同じ文字列が現れるのは面倒。
保守に手間取る。　

ヘッダファイルで一括すれば、ここさえ直せばよい。

## ヘッダファイルの相互依存性の確認
ヘッダファイルの設計として、相互依存性がある場合は、　
自分より先に読み込んである必要があるファイルは、
自分のファイルの先頭に書く。　
そうしてあれば、どんな依存性があっても、どの順番で読んでも困らないはず。　

逆に、自分より先に読み込んである必要があるファイルを、直接的または間接的に読み込んでない場合にはエラーがでる。　

今回の作業で、ヘッダファイルの相互依存性の確認

### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Intel MacからApple Silicon Macに移行したら変えるRustの設定

# TL;DR

以下をターミナルで実行する

    rustup default stable-aarch64-apple-darwin

# Apple Silicon移行時の問題

Apple Siliconを搭載した新しいMacを購入し、Intel Macからデータを移行したとします。
一部のソフトがIntel版のバイナリで動作しており、Apple Siliconならではのパフォーマンスが引き出せないかもしれません。
Rustも同様です。Apple Silicon向けのツールチェーンをインストールし、Rustからさらにパフォーマンスを引き出しましょう。

> ツールチェーンとは？
> 
> Rustでいうツールチェーンは、実行環境に係る一連のソフトウェアを指します。
> Rustのツールチェーンには以下のソフトが含まれています。
> - コンパイラー `rustc`
> - ディペンデンシー管理とビルドツール `cargo`
> - ドキュメント生成 `rustdoc`
> - 標準ライブラリー
> 
> 参考: https://stackoverflow.com/questions/62417389/what-exactly-is-a-rust-toolchain
> 
> なお、現時点でサポートされているプラットフォームはここで確認できます：
> https://doc.rust-lang.org/rustc/platform-support.html
> Apple Silicon向けのビルドはTier 2 Supportであるので、ビルドが成功しても実行が成功するとは限りません。今後のApple Silicon Macの普及と共にサポートが向上すると期待できるでしょう。
ノブ「はよsolidityでHelloWorldをデプロイするどぉ！」

# とある大学内の千鳥の会話


ノブ「大吾もうsolidity書いたんか？」
大吾「おう！[CryptoZombies](https://cryptozombies.io/jp/)は一通りやったぞ！」
ノブ「もう学習済なんか？！陰で努力するタイプのニコ太郎やん。」
大吾「まだ学習してないなら教えたろか？」
ノブ「おう！ まず醍醐味のHelloWorldの出力を教えてくれい！」

# エディタの準備

大吾「まず[Remix](https://remix.ethereum.org/#optimize=false&runs=200&evmVersion=null&version=soljson-v0.8.7+commit.e28d00a7.js)にアクセスしてみぃ。エディタはこれ使うど。」

https://remix.ethereum.org

ノブ「左の"Create New File"でええんか？」
大吾「おう！そうじゃ！」
![88197C6E-F307-4FFE-A2AC-AAB9C195156F.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737070/fbdc4f28-99f1-ca59-4aa5-e0099822fa96.png)

大吾「ファイル名は`HelloWorld.sol`じゃ。」
ノブ「ファイル作ったぞ！コード書いていくんじゃな！」

# コードの記述

大吾「そうじゃ！以下のように記述してみぃ！」
```solidity:HelloWorld.sol
pragma solidity^0.4.26;

contract HelloWorld {
    
    function hello() public pure returns (string) {
        return "Hello World!!";
    }
}
```
ノブ「おい大吾！！」
大吾「どうした？」
ノブ「日本人には理解できんエラーが出とるどぉ！」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737070/223e43c3-f2e6-cf70-378b-21fc814240c8.png)

![69871093-57E8-4BFE-B4E3-941454E1EA13.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737070/3ae2657f-71d1-3af6-cc8e-2c8e302ca718.jpeg)

大吾「見せてみい。ああこれか。」
大吾「左上の「COMPILER」を[0.4.26]にするんじゃ。」
![D886B306-2E86-4DCA-B846-F3F24695588A.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737070/28a9f032-a137-4856-1438-eed5448739c9.jpeg)

ノブ「おお！直った。」

大吾「そしたらデプロイしていくど。」

# デプロイ

大吾「「DEPLOY & RUN TRANSACTIONS」を開いてみい。」
大吾「上の「ENVIRONMENT」を`RemixVM(London)`にするんじゃ。」
![C5DB14D6-086D-458A-A252-E7C3B0DB41C5.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737070/5eebf7a0-ccca-6747-a9f5-bc07b4701a33.jpeg)

ノブ「他サイトで「JavaScriptVMにする」って書いてあるけどええんか？」
大吾「`RemixVM(LODON)`は旧JavaScriptVMやから気にせんでええ。」
![AB0D4880-35E0-4B69-B859-79ACAD168950.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737070/d86b4521-65ef-f53b-23de-1fb173f08f57.jpeg)
ノブ「そしたら下の`Deploy`を押すんやな。」
大吾「そうじゃ！感が鋭いのぉ。井上尚弥のジャブくらい鋭いわ。」
![3A74F520-3B24-4535-AB8B-D9FFFFBEF149.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737070/eee82b2b-01ac-1e2d-e435-8cc1eb6c6145.jpeg)
ノブ「そういうつまらんギャグはTwitterで言えぇ！ここはQiitaじゃ！」

▼筆者のTwitter▼
https://twitter.com/uni_on_tw

大吾「`Deploy`を押して画面下がこんな感じになっとったらデプロイ成功じゃ！」
![741B90D6-1DE8-4534-8C3D-42316C1B5A07.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737070/3cd15e6d-8f41-6c06-69b5-a94f3ec24b33.jpeg)
MacにMySQLの開発環境を構築する手順まとめ

# はじめに
最近自社プロダクトのバックグラウンドを担当して開発を進めています。
その際にMySQLの開発環境を構築したのですが、その手順をまとめておこうと思います。

# 手順１：MySQLをインストールする
ターミナルにて以下を実行してMySQLをインストールする。

```
$ brew install mysql@5.7
```

※brewがインストールできていない場合は[こちら](https://brew.sh/index_ja)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/79f87edc-a6a7-0219-00fe-445af832fc4a.png" width="520px">

こんな感じの文章が出て、入力ができるようになっていればインストールは終了です。

# 手順2：MySQLのパスを通す
インストールしただけでは使用できないので、パスを通します。
パスを通すには以下を実行すれば可能です。

```
$ echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.bash_profile
```
以下を実行して上記パスが記載されていれば問題ありませんので、`:q`でvimを閉じて次のコマンドでパスを反映させます。

```
$ source ~/.bash_profile
```
以下を実行し、バージョン情報が出ていればパスを通す作業は終了です。

```
$ mysql --version
```

# 手順3：パスワードを設定
パスワードを設定する為には、まず以下を実行し、MySQLを起動します。

```
$ brew services start mysql@5.7
```
起動することができたら、以下コマンドを実行しパスワードの設定を行います。

```
mysql_secure_installation
```
上記を実行すると、`VALIDATE PASSWORD PLUGIN `というパスワード設定を助けるプラグインを使用するか問われますが、一旦ローカルを前提としてご説明を進めたいと思いますので、何も入力せずエンターでパスします。

上記をパスすると管理者パスワードを設定に移ります。
ここで任意のパスワードを入力します、入力している文字は表示されませんが、入力はできていますので注意です。

また、設定するパスワードは以下の条件を満たしている必要があります。

```
長さ8文字以上
数字、大文字、小文字、特殊文字（%や_など）を全て含んでいる
```

入力が終わったら、再度同じパスワードを入力する項目が表示されますので、設定しパスワード設定は完了です。
再度入力した時点で色々聞かれますが、とりあえずエンターでスキップして問題ありません。
All Done! と出れば設定完了です。

# 手順4：MySQLへログイン
最後の手順として、正しくログイン可能か確認します。
MySQLを起動していない場合は以下を実行してください。

```
$ brew services start mysql@5.7
```
次に以下を実行してログインします。

```
$ mysql --user=root --password
```
上記コマンドを実行し、パスワードを入力して`mysql>`と表示されていればログイン完了です、あとはデータベースを作成したりテーブルを作ったりする形になります。

# さいごに
ずっとフロント側の対応をメインに行ってきたのでMySQLの環境構築は試したことがなかったですが、比較的簡単に可能なのでなかなか良いですね。
せっかくサーバーサイド側の実装を行うので、色々畑の違いを楽しもうと思います。
高校生で基本情報技術者試験に合格した話

# はじめに
高校三年生の時に基本情報技術者試験を合格しました。
いつか合格の記録を記事にしようと思っていたら一年経過してしまい、いつの間にか高校卒業していたので、やばいと思い書きました。

# 私の経歴
* 小4の時、Scratchを始める(主にゲームを作っていた)
* 中学生でC/C++、D言語、Python、JSを始める。D言語教信者へ
* 高校生、Goに目覚める
* 高1の冬、ITパスポートを取る
* 高2の春に基本情報を申し込むもコロナで中止
* 高2の秋に基本情報を申し込むも今度は延長、高3の春(2021年4月27日)に基本情報を合格​

プログラミング言語の学習は独学です。
記憶が曖昧なところもあるので間違っていたらごめんなさい…(記事にするならしっかり記録を取っておけばよかった)
高3からは受験に集中したため、コロナが無く高2の春に基本情報を取れていれば、高2の秋に応用情報に挑戦できていたかもしれないので悔やまれます。

[詳しいやつ](https://penguincabinet.com)
​
# 結果
|午前・午後|点数|
|---|---|
|午前|80点|
|午後|80.50点|

両方ともちょうど8割です。
## 午前の内訳
|分野|正答率|
|---|---|
|ストラテジ系|85%|
|マネジメント系|50%|
|テクノロジ系|84%|​

~~Iパスの時も爆死したマネジメント系。今回も死亡~~
得点の高いストラテジとテクノロジがしっかりとれてよかったです!!
​
## 午後の選択
* 情報セキュリティ(必須)
* ソフトウェア設計
* システム戦略
* データ構造及びアルゴリズム(必須)
* ソフトウェア開発(必須)(言語選択はC言語)​

僕の世代からちょうどPythonを選択できるようになり、そちらで行くつもりでしたが、本番問題を見たらC言語のほうが簡単そうだったのでCにしました。
言語ごとの難易度の差異は年度によって異なる気がします。
# 学習スケジュール
* 「情報処理教科書 出るとこだけ！基本情報技術者 テキスト＆問題集」を2周読む
* 過去問を2年分解く
  * 確かこの時は午前7割、午後6.3割くらい
  * 過去問はPDFで公開していますが、印刷すると40枚近くになるのでiPadで映してノートに解きました
* 「基本情報技術者 試験によくでる問題集【午前】」「基本情報技術者 試験によくでる問題集【午後】」を2周
   * 過去問をやったところ時間的には余裕がありそうだったので、なら気軽に進められる問題集形式でやったほうがいいなと思いこれにしました
   * 1周目は全部解いて間違えた問題にチェック、2周目は間違えた問題だけやりました
   * 今思えば2周目のころには最初の問題を忘れてしまうので、1周目の時点で見直しと新しい問題を解くのを並行して進めるべきでした
 * ここで過去問を3年分解く
​
# 午前問題を解く上で個人的な助言
**問題文をよく読みましょう**
なんなら問題文にそのまま答えが書いてあるようなものまであります。
逆にろくに読まずに解くと、凡ミスするので気をつけてください。(経験談)
​
# 午後問題を解く上で個人的な助言
文章が長くて萎えますが、午前と比べて難易度的に大きく上がっているわけではないです。
必要な情報を取捨選択しましょう、問題の選択肢を先に見てから問題文を読むといいかもしれません。
​
# まとめ
僕のやり方ですので、再現性は保証できないです。
ただ多くの方の指摘である通り、インプットよりも問題を解く方に勉強の重点を置いたほうがいいと思います。
​
​
​
​
Mac標準アプリで可能！画像拡張子のwebpをpng/jpgに変換する方法

Macなら、画像ファイルwebpをpngやjpgにすぐに変換（書き出し）できます。

1. プレビューアプリでwebpを開く
![スクリーンショット 2022-07-30 17.13.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30859/3e6382c0-9ece-414c-cde8-d0c2c3982b37.png)


2. ファイル→書き出すを選択
![スクリーンショット 2022-07-30 17.12.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30859/e415bec8-2df2-6674-20b4-c731246fb418.png)



3.フォーマットを選択する
 ![スクリーンショット 2022-07-30 17.12.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30859/17c93934-abac-b17c-1355-07bc5c1760b0.png)
VMware ESXiの設定メモ

# はじめに
- ESXi7.0u2eで設定しています
- これは設定しておいた方が良いな、と思ったものを記載しています
- 他に必要な設定を学んだら追記します

# 日付と時刻の設定(NTP同期) ※HostClientで設定
1. ホストの管理ページを開く
2. システムタブ > 日付と時刻 > NTP設定の編集 を選択
3. NTPを仕様にチェック
NTPサービス起動ポリシーは、`ホストと連動して起動および停止します`を設定
NTPサーバに`ntp.jst.mfeed.ad.jp`を設定
※NICT(stratum1)を同期元とするstratum2のpublicNTPサーバです
4. 保存を選択
5. サービスタブを開く
6. ntpdのデーモンがあるので、右クリック > 起動 を選択

# ライセンスの設定  ※HostClientで設定
1. ホスト > 管理を選択して管理ページを開く
2. ライセンスタブ > ライセンスの割当を選択
3. ライセンスキーを入力し、ライセンスの確認を選択
ライセンスキーはvSphere7 Hypervisorに対して有効です、と表示されたら、
ライセンスの割り当てを選択で設定完了

# IPアドレス設定 ※ESXi本体で設定
1. 起動画面でF2キー
2. rootユーザーのパスワード入力を求められるので入力
3. Configure Management Networkを選択
4. IPv4 Configurationを選択
5. Set Static IPv4 address and network configurationでスペースキー
6. IPv4 Addressを編集できるようになるので編集してEnter
AWS全サービスの簡単な説明 

# AWSのサービス
## サーバー関連
### Amazon EC2
仮想サーバー
### Amazon Elastic Container Service
Dockerコンテナの実行および管理
### Amazon Lightsail
仮想サーバーとネットワーク一式の起動と管理
### AWS Batch
バッチジョブの実行
### Amazon VPC 
ネットワーク環境
### Amazon API Gateway
WebAPIを構築するサービス
### Amazon CloudFront
コンテンツキャッシュサービス（CDN）
### Amazon Route 53
DNSサービス
### Amazon Direct Connect
AWSネットワークに専用線で接続
### AWS Transit Gateway
VPC同士などの接続
### Elastic Load Balancing(ELB)
負荷分散装置
### Amazon Simple Email Service(SES)
メールサービス
### Amazon GameLift
ゲームホスティングサービス
### AWS Amplify
モバイルアプリとWebアプリのデプロイ

## メディア
### Amazon Elastic Transcoder
メディア変換サービス
### AWS Elemental MediaLive
ライブビデオコンテンツの変換
### AWS Elemental MediaPackage
動画の配信パッケージ

## ストレージ
### Amazon Simple Storage Service(S3)
汎用的なクラウドストレージ　
### AWS Transfer for SFTP
SFTPサービス
### Amazon Elastic Block Store(EBS)
ES2で用いるストレージ
### Amazon FSx for Windows ファイルサーバー
Windowsファイルシステムのサービス
### Amazon S3 Glacier
S3の長期保存サービス
### AWS Backup
バックアップサービス

## データベース
### Amazon Aurora
Amazonによってカスタマイズされた高性能なRDS
### Amazon DynamoDB
NoSQLデータベース
### Amazon DocumentDB
MongoDB互換のドキュメントデータベース
### Amazon ElastiCashe
インメモリキャッシュシステム
### Amazon RDS
リレーショナルデータベース

## セキュリティ
### AWS Identity and Access Management(AIM)
ユーザー機能
### Amazon Cognito
アプリケーション認証機能を提供するサービス
### Amazon GuardDuty
脅威を検出
### AWS Certificate Manager
証明書を生成
### AWS Firewall Manager
ファイアウォールの一元管理
### AWS WAF
Webのファイアウォール機能

## データの集計・分析
### Amazon Athena 
S3に保存したデータの集計サービス
### Amazon Redshift
大量データの集計サービス
### Amazon Kinesis
リアルタイムのビデオやデータストリームを分析
### Amazon Elasticsearch Service
ログのモニタリング、セキュリティなど、データ分析サービス

## アプリケーション連携
### AWS Step Functions
順次プログラムを実行する仕組み
### Amazon Simple Queue Service(SQS)
アプリケーション同士を連携するキューイングサービス
### Amazon Simple Notification Service(SNS)
アプリケーション同士で通知メッセージを送信するサービス

## 機械学習
### Amazon SageMaker
機械学習モデルの構築、トレーニング、デプロイ
### Amazon Lex
音声やテキストに対応するチャットボットの構築
### Amazon Polly
テキストを話し声に変換
### Amazon Textract
ドキュメントからテキストデータを抽出
### Amazon Translate
自動翻訳
### Amazon Transcribe
自動音声認識

## IoT
### AWS IoT Core
IoTデバイスをクラウドに接続するための基本サービス
### Amazon FreeRTOS
マイコン向けリアルタイムOS
### AWS IoTボタン
クライドでプログラミングできるダッシュボタン
### AWS IoT　Thing Graph
デバイスとWebサービスを相互接続するサービス

## クライアント向けサービス
### Amazon WorkSpaces
仮想デスクトップ環境
### Amazon AppStream２.0
デスクトップアプリケーションをWebブラウザにストリーミング
### Amazon WorkLink
社内のWebサイトへのモバイルアクセスを可能にするサービス

## 開発ツール
### AWS Cloud9
Webブラウザで操作できる統合開発ツール
### AWS CoreBuild
プログラムのビルドやテストツール
### AWS CodeCommit
プライベートなGitサービス
### AWS CodeDeploy
開発したプログラムを配備するツール
### AWS CodePopeline
開発したツールをビルドして配備するまでを自動化するツール
### AWS CodeStar
ビルドから配備までを一式提供するツール
### AWSコマンドラインインターフェース
コマンドでAWSを操作するツール

## コスト管理
### AWS Cost Explorer
コストと使用状況を確認
### AWS Budgets
予算を設定して超えそうになった時に通知
vsftpdにアップロードしたら"426 Failure reading network stream."エラーが出るときの解決法

# 問題

自分で立てたvsftpd（FTPサーバー）にFFFTP（FTPクライアント）から接続し、ファイルをアップロードしたら`426 Failure reading network stream.`エラーが出た。

サーバーを見るとアップロードしたファイルはあるためアップロードには成功している模様。

# 環境

サーバー：Linux Mint 20.3 & vsftpd version 3.0.3

クライアント：Windows 11 & FFFTP Ver.5.7 64bit

# 解決法

`strict_ssl_read_eof=NO`を設定ファイル (`/etc/vsftpd.conf`) に明記する。

マニュアルのstrict_ssl_read_eofの項目には`Default: NO`と書いてあるがマニュアルの誤記で実際にはデフォルトYESである。

# 調査

vsftpdの公式サイト (https://security.appspot.com/vsftpd.html) からソースコードを落として見たらtunables.cに

```c
void
tunables_load_defaults()
{
  // 略
  tunable_strict_ssl_read_eof = 1;
  tunable_strict_ssl_write_shutdown = 0;
  // 略
}
```

とあり、デフォルトOnだった。

`strict_ssl_write_shutdown`はデフォルトOffなので`strict_ssl_write_shutdown=NO`は明記しなくても動くはず。

※確認したソースのバージョンは3.0.5

# 参考

* [vsftpd: 426 Failure reading network stream | Support | SUSE](https://www.suse.com/support/kb/doc/?id=000020678)
Kotlinでアローラロコンをアーロンにする

## 元ネタ

https://qiita.com/tadsan/items/828cf43ec902440255cb

## やってみる

```Kotlin
fun main() {
    "アローラロコン"
        .filterIndexed { i, _ -> i % 2 == 0 }
        .also { println(it) }
}
```

出力:
```
アーロン
```

／以上
Brewfileを使ったパッケージ移行方法

<h2>はじめに</h2>

homebrew-bundleはその名の通りhomebrewのbundlerです。
Homebrew自体の解説はほぼありません。
まだ使ったことがないよ、という方は公式や解説サイトに目を通すことをおすすめします。

<h2>公式</h2>

<b>Homebrew</b>
<a href="https://github.com/Homebrew/brew">https://github.com/Homebrew/brew<a/>
<a href="https://brew.sh/index_ja">https://brew.sh/index_ja<a/>

<b>Homebrew Bundle</b>
<a href="https://github.com/Homebrew/homebrew-bundle">https://github.com/Homebrew/homebrew-bundle</a>

<h2>手順</h2>

```
❯ brew -v                                                                                                                                              tharanoMacBook-Pro@thara[15:39:46]
Homebrew 3.5.6
```

<h4>STEP1</h4>

移行元・移行先にCLTを導入します。
Xcodeを利用している場合は既に導入されています。
<pre><code>xcode-select --install</code></pre>

<h4>STEP2</h4>

移行元でBrewfileを出力します。
生成先はユーザーフォルダ直下です。
--globalオプションをつけなければ現在のディレクトリ下に出力されます。
<pre><code>brew bundle dump --global</code></pre>
また、mas-cliを使うことで、App Store経由で導入したappも一括ダウンロードできるようになります。
移行元で導入していなければ、先に```brew inatall mas```してから出力させます。

<h4>STEP3</h4>

Brewfileを編集し、明らかに不要なものがあれば該当行を削除しておきます。
また、Homebrew管理外のappがあれば追記するか、別途移行先でinstallします。
さらに、tapでHomebrew公式以外のリポジトリからformulaを登録できます。
脱線するためここでは扱いませんので、詳しく知りたい方は```brew tap```などで検索してください。
移行元にこれらの変更を反映しておきたい場合はcleanupしましょう。
<pre><code>brew bundle cleanup</code></pre>

<h4>STEP4</h4>

Brewfileを移行先へ持っていきます。
この時点で自前のgithubへpushしておき、dotfile等と一緒に管理しておくのがおすすめです。

<h4>STEP5</h4>

移行先でパッケージのinstallをおこないます。
Xcodeなどサイズの大きいappを記載している場合は相応の時間がかかります。

<pre><code>brew bundle</code></pre>

<h2>さいごに</h2>

パッケージはこれで移行できました。
しかし、他に.sshや.awsなどのcredential類、環境変数など移行しなければいけないものはたくさんあります。
全てが自動化できれば大変魅力的ですが、メンテナンスの手間からは逃れられません。
とはいえ、移行作業を文書ファイルを眺めながら一つ一つ手動実行するのは時間がかかります。
まだhomebrew-bundleを使ったことのない方は、次回の移行時に触ってみることをおすすめします。
ブラウザを開きたくなくてGitHub CLIをインストールした話

どうも`hrak0x59`です〜
期末試験中でなかなか更新できていなかったのですが、今日少し時間が取れたのでメモがわりにQiitaに殴り書きしていこうと思います〜

# 経緯
普段GitHubを使うときはブラウザからリモートレポジトリを作成しているんですが、これがめんどくさいんですよね...
てなわけでちょっと調べてみたらなんとあるじゃないですか、便利そうなものが！

https://cli.github.com/

`これを使えばブラウザを開かなくてもリモートレポジトリ作ったりissueいじったりプルリクを送ったりGitHubで使う操作をコマンドラインからいじれちゃうわけですね！`

# GitHub CLI
## インストールしてみよう
どうやらmacの場合はbrew経由でインストールすれば自動的に補完機能(gh completion)もセットアップしてくれるようなので自分の場合はbrewでインストールしてみます。
```zsh
brew install gh
```
## アカウントにログインしてみよう
次にgithubのアカウントにログインしてみます。
```zsh
gh auth login
```
すると4つほど質問をされるので順次回答していきましょう。
自分の場合はこんな感じに表示されて無事成功しました〜！
![スクリーンショット 2022-07-30 16.19.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515298/e06844eb-3dc8-53c3-2871-ecbfba392312.png)

一応確認してみて大丈夫そうだったら次のステップに行きます。
```zsh
gh auth status
```


# リモートレポジトリ一覧を早速表示させてみようっと思ったが...?
さてでは確認がてらにリモートレポジトリを確認してみましょう
```zsh
gh repo list
```
うんうん、ちゃんと動いて....ってあれ補完機能が効いていなくないか？
おかしいですねbrewでインストールされた場合はちゃんと/opt/homebrew/share/zsh/site-functionsに...ちゃんとありますね...

なんでだろう？　マニュアルから確認してみます

https://cli.github.com/manual/gh_completion

自分はzshを使っているのでzshの欄を見てみます
![スクリーンショット 2022-07-30 16.27.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515298/247cea06-b886-f7fe-09d7-9875e227009c.png)

うんうん
```
gh completion -s zsh > ...
```
はbrewでインストールされたので必要ないですね...
あとは下のEnsure~の部分ですね
```zsh
autoload -U compinit
compinit -i
```

vimで~/.zshrcを確認してみます
```zsh
vi ~/.zshrc
```
あれ....?確かにない...
なんでだろう？

## homebrewを調べてみる

https://docs.brew.sh/Shell-Completion

あ！homebrewでインストールしたプログラムの補完機能はhomebrewの補完機能サポートを有効化してからじゃないと使えないんですね！

![スクリーンショット 2022-07-30 16.33.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515298/9817f4d2-6dd6-8dca-0ed2-41cf1a823fb4.png)

早速書き込む
```vim:~/.zshrc
if type brew &>/dev/null
then
  FPATH="$(brew --prefix)/share/zsh/site-functions:${FPATH}"

  autoload -Uz compinit
  compinit
fi
```
追加した~/.zshrcを反映させる
```zsh
source ~/.zshrc
```

# 最後に
はいこれでghの補完機能が効きました！
いや〜いいものですねコマンドラインから色々操作できるっていうのは！
ではめでたし〜めでたし〜！

# 参照
https://cli.github.com

https://cli.github.com/manual/gh_completion

https://docs.brew.sh/Shell-Completion
「A Tour of Go」 の Exercise: Maps を解きました

引き続きGo公式のチュートリアル「[A Tour of Go](https://go-tour-jp.appspot.com/list)」を読み進めています。その中に練習問題がいくつか用意されています。当記事は、Mapに関する練習問題「[Exercise: Maps](https://go-tour-jp.appspot.com/moretypes/23)」を解いた記録です。

## コード
```go
package main

import (
	"golang.org/x/tour/wc"
)

func WordCount(s string) map[string]int {
	ret := make(map[string]int)
	left := 0
	for i, val := range s {
		// 空白を見つけてsの left ~ i-1番目まで(i番目は空白) の単語の値をインクリメントして
		// leftを更新する。leftの更新時に+1 しているのは空白をスキップするため
		if ' ' == val {
			ret[s[left:i]]++
			left = i + 1
			// 最後の単語だけ特別扱い
		} else if i == len(s)-1 {
			ret[s[left:]]++
		}
	}
	return ret
}

func main() {
	wc.Test(WordCount)
}

```

# 解説
コードとコメントを見ていただけると大体わかると思いますが、できる範囲で解説を書きます。
```go
for i, val := range s
```
forを使って文字列sを先頭から末尾まで、1文字ずつ巡回します。iはindexで、valはsのi番目の文字です。
```go
ret[s[left:i]]++
```
ここが肝だと思います。各単語の出現回数を記録します。retはreturnするmapです。WordCountの先頭で定義しています。
```go
s[left:i]
```
retの中身であるこれはスライスで、文字列sのleft文字目からi-1文字目までの部分文字列を表します。iが指している文字は含まれません。この時iは空白を表しているので、単語の先頭から末尾までの部分列を取得することができます。
```go
// 最後の単語だけ特別扱い
} else if i == len(s) - 1 {
	ret[s[left:]]++
}
```
これは、iが末尾の文字を指している時は特別に扱う処理です。末尾だけ特別な処理が必要な理由は、スライスが右端を含まないからです。
例えば文字列"Don't repeat your self"を考えます。"your"までは順調に分解できますが、"self"を切り出したい時、iはfを指しているのでそのままスライスしようとすると、"sel"が切り出されてしまいます。
当然切り出したいのは"sel"ではなく"self"なので、特別に処理を設けるに至った次第です。
:の右側に何も書かないと、末尾まで切り出してくれます。
# 最後に
else if の処理が綺麗じゃないので、良い書き方があったら教えていただけると嬉しいです。
今のところGoって完結でわかりやすい言語だなーと思っております。
ActiveDirectoryを搭載したImage Templateで仮想サーバーをオーダーした時は適切に動作しないようです

# はじめに
IBM Cloudには、仮想サーバーの環境をImage Templateとして保存するサービスがあります。「Active Directoryが動作しない！」という話を聞き、調べたところ、Image Templateをバックアップのように使っていることがわかったので、注意喚起も兼ねて、動作検証してみました。

# 仮想サーバーのImage Templateについて

「IBM Cloud® のイメージ・テンプレートを使用すると、仮想サーバーのイメージを取り込んでその構成を素早く複製できるので、注文プロセスで行う変更が最小限になります。 イメージ・テンプレートは、オペレーティング・システムに関係なく、すべてのVirtual Servers用のイメージ・オプションを提供します。 」だそうです。
 [イメージ・テンプレート入門](
https://cloud.ibm.com/gen1/infrastructure/virtual-server/131923344/create-image-template)

# 誤解するポイントと正しい理解（結論）

イメージテンプレートを使用すると、仮想サーバーのイメージをエクスポート・インポートできるわけなので、複数生成できる（＝バックアップにも使えそう）という推測ができると思います。
ところが、厳密には、イメージをそのまま使うわけではなく、内部的には、イメージテンプレートを使って環境をロードしても、OS導入後にCloud -initなどの初期導入処理は実行されますので、厳密には同じものが複製されるわけではありません（具体的にどんな動作かは不明）。

そのため、一部のソフトウェアは複製したとしても、適切に動作しないケースがあります。
例えば、Windowsサーバー環境ですと以下のように、期待しているようなGUIだが、実際には適切に動作していないケースがあります。

- Active Directoryを含むイメージテンプレートを取得し、別サーバーにイメージテンプレートを使ってオーダーした場合
    - OSにログインすると、ADは正常稼働しているように見える。しかし、実際にはADとしては適切に機能しておらず、降格・昇格が必要となる。
- Active Directoryに所属したWindows Serverのイメージテンプレートを取得し、別サーバーにイメージテンプレートを使ってオーダーした場合
    - Active Directoryに所属しているように見えるが、実際には所属できていないケースがある。


# おまけ：実際にやってみた（非推奨）

Active Directoryを搭載した仮想サーバーをイメージテンプレートでオーダーしてみました。その後、Windows ServerにDomain Adminユーザーでログインしようとしてみると、ログインできません。仕方がないので、KVMからログインしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3168/d839a4df-d257-905a-2ae0-f9b4ae796f34.png)

見た目上は、Active Directoryは動いているように見えます。（が、動いていない）
![スクリーンショット 2022-07-30 16.38.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3168/960f779d-dce2-b61b-7d80-e183e3365e6d.png)

この環境を復旧したい場合は、一旦、降格するしかなさそうです。
なお、ドメインコントローラーを降格におけるパスワードは、IBM CloudのPortalで確認できるAdministratorの自動生成パスワードで実行できました。

![スクリーンショット 2022-07-30 16.37.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3168/cb565c68-9ca5-2455-85d1-6036974caaa3.png)

そのままADDS/DNSを削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3168/a2867f6d-d675-ad5d-2638-662363825272.png)

削除したことで、リモートデスクトップでログインできるようになっていますので、必要に応じてホスト名と所属ドメインを変更したり、改めてADDS/DNSを導入したりしましょう。
【Docker】networkとかの基礎的な理解

もろもろの基礎的な理解のために。
今回はpythonコンテナからmysqlコンテナのデータを取ってきます。

networkについてはこれがわかりやすかった。

https://lazesoftware.com/blog/220224/

自分的要点
- 同じネットワーク内のコンテナ同士なら通信できる。
- コンテナは複数のネットワークに所属できる。
- ネットワーク内のコンテナにはIPが振られる。
- ネットワーク内のIPの代わりに`--network-alias`で接続できる。

## network作成
コンテナが所属するためのネットワークを作成する。

```:コマンド
docker network create test-network
```

## MySQL
mysqlコンテナを作成、起動する。

```:コマンド
docker run --name test-mysql --network test-network --network-alias n-mysql -e MYSQL_ROOT_PASSWORD=password -d mysql
```

`--network`に`test-network`を指定して、作成するコンテナを`test-network`に所属させる。
MySQLのパスワードは「password」
pythonから指定するためのエイリアス`--network-alias`に`n-mysql`を指定している。

### レコード追加
コンテナに入って適当なレコードを追加。

```:コマンド
docker exec -it test-mysql bash
mysql -u root -p
```

パスワードを聞かれるのでコンテナ作成時に指定した「password」を入れる。
そうするとmysqlに入る。
「Potato Head」というレコードを追加しておく。

```sql
create database test_db;
use test_db;
create table users(id int auto_increment not null primary key, name varchar(100));
insert into users(name) values("Potato Head");

exit
```

mysqlを抜けてbashに戻ってくるので再度`exit`でローカルPCに戻る。

```
exit
```

## Python
プロジェクト用に`main.py`、`requirements.txt`を作成。

```
+ PROJECT_FOLDER
  - main.py
  - requirements.txt
``` 

`main.py`でDB接続、データ取得のコードを書く。
MySQLのエイリアスで指定した`n-mysql`を`host`に指定する。

```python:main.py
import mysql.connector
print('hello')

cnx = mysql.connector.connect(
    user='root',
    password='password',
    host='n-mysql',
    port='3306'
)
cursor = cnx.cursor()
cursor.execute('select * from test_db.users')

for id, name in cursor:
    print(f'{id}: {name}')
```

## Python実行
プロジェクトのディレクトに移動して下のコマンドを実行。
MySQLに追加した「Potato Head」が出ればOK。

```ps:コマンド
docker run -it --rm -v "$(pwd):/usr/src/myapp" --network test-network -w /usr/src/myapp python:3 bash -c "pip install -r requirements.txt && python main.py"
```

解説

`test-network`に所属させてコンテナを実行する。
すると、先ほど作成した`test-mysql`コンテナと通信ができるようになる。

後ろの方の`bash -c "~~"`はコンテナ起動時にコンテナ内で実行するコマンド。
`-c`で複数のコマンドを同時に実行させられるらしい。

Pythonのコードで`host`に`n-mysql`を指定しているので`test-network`内の`n-mysql`、つまり`test-mysql`コンテナに接続するようになる。

あとはSELECT文が流れて出力されるという流れ。
[書評]インフラ設計のセオリー

以下の本読了しましたので、書評を以下に記します。

https://www.amazon.co.jp/%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E8%A8%AD%E8%A8%88%E3%81%AE%E3%82%BB%E3%82%AA%E3%83%AA%E3%83%BC-%E8%A6%81%E4%BB%B6%E5%AE%9A%E7%BE%A9%E3%81%8B%E3%82%89%E9%81%8B%E7%94%A8%E3%83%BB%E4%BF%9D%E5%AE%88%E3%81%BE%E3%81%A7%E5%85%A8%E5%B1%95%E9%96%8B-JIEC-%E5%9F%BA%E7%9B%A4%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E4%BA%8B%E6%A5%AD%E9%83%A8-%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E8%A8%AD%E8%A8%88%E7%A0%94%E7%A9%B6%E3%83%81%E3%83%BC%E3%83%A0/dp/4865941886

#### この本を読もうと思ったきっかけ　
エンジニア経験８年目に差し掛かり、初めてのインフラ構築プロジェクトにアサインされました。
製造等ではなく、基本設計という上流からの参画であり、作った経験のないものの設計に苦戦し、この本で体系的なINPUTをしようと思い購入しました。

#### ざっくり内容紹介
インフラで一般的に必要とされている設計項目を一通り紹介されています。
可用性、性能・拡張性、運用・保守性の３大トピックについて紹介。

#### 特に有用だと思った知識
* アプリエンジニアは機能要件を実現し、インフラエンジニアは非機能要件を実現する。
* 非機能要件はユーザ企業から出しづらく、後々に問題が出やすい。
* 拡張性とは、性能逼迫した際にどのように拡張するかを定めるものであり、そのため「性能・拡張性」と２つセットで語られる。
* このように、一般的に必要とされる非機能要件の一覧は、「[非機能要求グレード](https://www.ipa.go.jp/sec/softwareengineering/std/ent03-b.html)」という確立したドキュメントがすでにある。

#### 感想
いきなりググって出てきた知識を読むより体系的な知識が手に入ったように思います。
特に、性能・拡張性はあまりピンときていなかった（アプリエンジニアの視点では確保されていて当たり前）だったので、考え方が手に入りました。

おそらく、インフラエンジニアからすると当然のことが書かれているのかと思います。「可用性設計とは」「保守性設計とは」というところまでしか理解できません。

地味に、ベンダ試験では手に入らないような知識を手軽にINPUTできるので、これからインフラ領域に挑戦したいエンジニアにはおすすめの一冊です。

また、JIEC（現SCSK）という会社が出している点、共著であるという点もポイント高いです。
個人的な考えや思いの丈は（それはそれで重要なのですが）あまり入っておらず、一般に通用していることだけを書いてくれています。
教科書的に読めて私好みでした。

#### 次に読みたい本
この本で基本的な知識は一通り入れることができたので、
続いては各論的な知識を入れていきたいです。本屋行って、次の本探してきます。
対応がない3群間比較の備忘録

# はじめに
* 今回3群間の比較することがあったので、本記事に簡易的にその手法を記載する。
* 今回の動作環境は以下である。

Windows 11
Python 3.8.5
numpy 1.22.3
scikit-posthocs 0.7.0
scipy 1.5.2
pandas 1.1.1

# ライブラリのインポート
```python
from scipy import stats
import numpy as np
import pandas as pd
import scikit_posthocs as sp
from statsmodels.stats.multicomp import pairwise_tukeyhsd
```

# データ例
* csvデータからデータを読み込んでデータを用意。
* A列、B列、C列の3列あるとし、データ例は同じ数とする。
```python
df = pd.read_csv('sample.csv')

group_A = df['A']
group_B = df['B']
group_C = df['C']
```

# 1. Shapiro-Wilk（シャピロ・ウィルク）検定：正規性検定
* 3群それぞれ検定。p値が0.05以上であれば正規分布に従う。
* p1, p2, p3すべてが0.05以上 → 3群すべてで正規性あり → 2. Bartlett（バーレット）検定
* p1, p2, p3すべてが0.05以上ではない →3群すべてで正規性なし → 5. Kruskal-Wallis検定
```python
#Shapiro-Wilk検定
s1,p1 = stats.shapiro(group_A)
s2,p2 = stats.shapiro(group_B)
s3,p3 = stats.shapiro(group_C)

print('A:' + str(p1) + ', B:' + str(p2) + ', C:' + str(p3))
```

# 2. Bartlett（バーレット）検定：等分散性検定
* p4 > 0.05 → 分散が等しい → 3. 一元配置分散分析：ANOVA
* p4 < 0.05 → 分散が等しくない → 5. Kruskal-Wallis検定
```python
Bartlett検定
s4,p4 = stats.bartlett(group_A,group_B,group_C)

print('p値'+ str(p4))
```

# 3. 一元配置分散分析：ANOVA
* 分散分析を実施。
* p5 < 0.05 → 3群間どれかの組み合わせに有意差がある → 4.Tukeyの検定
```python
#ANOVA
s5,p5 = stats.f_oneway(group_A,group_B,group_C)
print('p値'+ str(p5))
```

# 4. Tukeyの検定：多重比較
* 多重比較によりどの群間で有意差があるかを確認
* p-adjの値が0.05以下が確認
```python
#Tukeyの検定
group = ['group_A' for _ in range(len(group_A))] + ['group_B' for _ in range(len(group_B))] + \
        ['group_C' for _ in range(len(group_C))]
df1 = pd.DataFrame({'group': group, 'score': pd.concat([group_A, group_B, group_C])})

print(pairwise_tukeyhsd(df1.score, df1.group))
```
```python
#Output sample
 Multiple Comparison of Means - Tukey HSD, FWER=0.05 
=====================================================
 group1  group2 meandiff p-adj   lower  upper  reject
-----------------------------------------------------
group_A group_B   1.3531 0.4975 -1.4773 4.1835  False
group_A group_C   3.8686 0.0044  1.0248 6.7124   True
group_B group_C   2.5155 0.0924 -0.3149 5.3459  False
-----------------------------------------------------
```

# 5. Kruskal-Wallis（クラスカル・ウォリス）検定
* ノンパラメトリック法
* p6 < 0.05 →3群間のどれかの組み合わせに有意差がある → 6. Steel-Dwass（スティール・ドゥワス）検定 
```python
#Kruskal-Wallis検定
s6,p6 = stats.kruskal(group_A,group_B,group_C)

print('p値:' + str(p6))
```

# 6. Steel-Dwass（スティール・ドゥワス）検定：多重比較
* 多重比較によりどの群間で有意差があるかを確認
```python
data = pd.DataFrame({"A": group_A, "B": group_B, "C":group_C})
data = x.melt(var_name='groups', value_name='values')

print(sp.posthoc_dscf(data, val_col='values', group_col='groups'))
```
```python
#Output sample
          A         B         C
A  1.000000  0.900000  0.062225
B  0.900000  1.000000  0.109268
C  0.062225  0.109268  1.000000
```

# 参考文献
- [第3回 3群以上の平均値の比較](http://www.saturingi.gr.jp/seminar/statistical/vol3.pdf)
- [Pythonで統計検定（多重検定） : scikit_posthocs](https://qiita.com/rola_satoru/items/af2bcad7826672891f80)
- [統計学入門：3群以上の差の検定〜検定方法の選び方〜](https://kirakunurse.com/statistics-anova/)
AWSのサービス 

# 165種類以上のサービスを提供
AWSではITに関わるインフラのほとんどのサービスが提供されている。

## 目的別にさまざまなサービスを提供 
・Webサービスを作りたい
サーバー（EC2）
サーバーOS（AMI）
IPアドレス（Elastic IP）
ストレージ（S3）
ドメイン（Route 53）
DBサーバ（RDS）

・コンテンツを配信したい
サーバー（EC2）
キャッシュレスサーバー（CloudFront）
IPアドレス（Elastic IP）
ドメイン（Route 53）

・機械学習をしたい
機械学習モデル（machine Learning SageMaker）
画像動画認識（Rekognition）
音声認識（Transcribe,Lex）

## AWSの代表サービス
### Amazon EC2（Amazon Elastic Compute Cloud）
Amazon EC2は、コンピューティングキャパシティを提供するサービス。サーバー、OS、ソフトウェアなどの一式レンタルができる。
### Amazon S3（Amazon Simple Storage Service）
Amazon S3は,
オブジェクトストレージサービス。Webサーバーやファイルサーバー用のファイルの保管場所として利用できる 
### Amazon VPC 
Amazon VPCはAWSアカウント専用の仮想ネットワーク。ネットワークやサブネットの範囲、ルートテーブルやネットワークゲートウェイの設定などをして、仮想ネットワーキングの構築をする
### Amazon RDS
Amazon RDSはリレーショナルデータベースで定番と言われる６種類の製品（AmazonAurora, PostgreSQL, MySQL, MariaDB,　OracleDatebase, SQLserver）をクラウド上で使用できる。
### Amazon Route53
Amazon Route53はDNS（ドメインネームサービス）。
Webサーバーに必要なDNSを提供する
### Elastic IPアドレス
Elastic IPアドレスはサーバーに必須な静的なグローバルIPアドレスを提供。EC2やELBと組み合わせて使用する

※他のサービスは次回の記事にて説明します。。。
【例外処理】専用の例外クラスを作るとエラー後の分岐処理が実装しやすい

## :bulb: **CAUTION!**
- 当記事は[イベント](https://tonihome.connpass.com/)のLTで発表したものです
- システムの開発方針によっては紹介する実装が適さないことがあります
- 実装例はPHPですが、簡易なコードなのでプログラミング言語を問わずお読みいただけます

---

※ @error_401さんから[コメント](https://qiita.com/y_sone/items/99a014943776a75366ad#comment-c2cd957e040494ccfb2b)を頂きました。ご指摘ありがとうございます！
- 紹介する実装は保守性が下がる可能性があります
- 専用の例外クラスを作成する際は、エラーの対象範囲をよく検討してください

---

## :woman_tone1: **自己紹介**
- Webエンジニア歴4年
- 主な使用言語はPHP
- たまにITイベントにスタッフ参加しています

---

## :love_letter: **伝えたいこと**
特定エラー専用の例外クラスを作ると、エラー発生後の分岐処理が実装しやすいです！

---

## :question: **例外処理とは**
プログラムの実行中に発生した問題・エラー（例外）を解決するため処理

---

## :thinking: **例外処理では何を行うのか**
- ロールバック
- 画面上へエラーメッセージを表示する
- 関係者宛にツールやメールで通知する
- エラーログに記録する

---

### **ロールバック**
不安定な状態でデータベースへレコードが保存されるのを防ぐ

---

### **画面上へエラーメッセージを表示する**
ユーザーへ通知して何かしらの操作を促す

---

### **関係者宛にツールやメールで通知する**
問題が発生した直後に関係者による何かしらの対応を促す

---

### **エラーログに記録する**
原因を調査し問題を解決する

---

### **結論**
- 次の行動につながる処理を行う
- やるべき行動・処理はエラーの種類によって異なる

---

## :elephant: PHPで例外処理を実装する

---

### 基底クラスのみで例外をキャッチする

---

#### **要件**
- 記事の投稿処理でエラーが発生した場合は画面にエラーメッセージを表示したい

---

#### **実装**
```php
try {
    $article = new Article('hogehoge');
    $article->create();
} catch (Exception $e) {
    return display_message($e->getMessage());
}

return display_message('記事の投稿に成功しました');
```

---

#### **解説**
- エラーの種類を問わず例外が発生した場合は同じ処理を行う
- 例外は基底クラスによる一律キャッチでOK

---

### **要件が追加されたら？**
- 記事のアップロード処理でエラーが発生した場合は担当者へ通知したい
- それ以外のエラーはログに記録したい

---

先述の方法では実装が難しい...

---

### 特定エラー専用の例外クラスを追加して例外をキャッチする

---

#### **実装**
```php
try {
    $article = new Article('hogehoge');
    $article->create();
} catch (ArticleUploadException $e) {
    notify_alert($e, debug_backtrace());  # 担当者へ通知
    return display_message($e->getMessage());
} catch (Exception $e) {
    record_log($e, debug_backtrace());    # ログに記録
    return display_message($e->getMessage());
}

return display_message('投稿に成功しました');
```

---

#### **解説**
- 記事のアップロード処理でエラーが発生した場合は専用の例外を投げる
- アップロード処理エラー専用の例外をキャッチした場合は担当者へ通知する
- それ以外の例外（基底クラス）をキャッチした場合はログに記録する

---

### **例外クラスの種類が増えたら**
系統別に整理すると分かりやすい
![diagram-11013646065879133561.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654760/577a68c7-95ea-fd76-888e-f1771c0c8338.png)

---

### **結論**
特定エラー専用の例外クラスを作成すると、エラー後の分岐処理が実装しやすくなる 

---

## :candy: おまけ

---

### 例外のメッセージはそのまま出力してOK？

---

#### **メッセージの内容は様々**
- 必ずしも画面表示に適したフォーマットではない
- 英語の可能性が高い
- ライブラリ・フレームワーク独自の例外は開発者向けの文言がセットされていることも

---

#### **結論**
- 例外を一律でキャッチしてそのままメッセージを表示するのはやめよう
- 例外の仕様を把握し、メッセージを画面上へ表示させるか、開発者用のログに記録すべきかなどを検討しよう

---

## :pencil: **まとめ**
- 適切な例外処理はユーザー・開発者の両方を幸せにします
- ご清聴・ご精読ありがとうございました！
暗号の実質的強度についての考察

# まとめ
- 現代暗号の主流は、**計算量的安全性**に基づく方式
  - 復号方式（公開）＋復号鍵（非公開）の構成
  - 力ずくの解読法である全鍵探索を事実上不可能にする、復号鍵の多様さが必要
- ただし、**全鍵探索 ≠ 解読** に着目した戦略もある
  - 全鍵探索できても、解読できない場合もある
  - 典型的には[ワンタイムパッド](https://qiita.com/ozaki_physics/items/2df99c7b9bc2fd05f49e)
- イメージとしては
  - **主流暗号の強度（bit数） ≒ ゲーム機のスペック**
  - **実質的な暗号強度 ≒ ゲーム機の面白さ**

# 背景
[クロム拡張作成](https://qiita.com/largetownsky/items/ee9db46b372e5adb20f0)で、他者とのノート共有をリリース予定です。他者との共有で問題になるのは、メールや名前などの情報の扱いです。うっかりDOM上やログ上に出そうものなら、そのページの他のスクリプトに漏れてしまいます。

情報自体の扱いに気を付けるのはもちろんですが、生で情報を持つこと自体がリスクであるため、暗号化について復習・考察してみました。

# 暗号が解けるという事
## 現代の主流暗号（共通鍵）の場合
| 元データ | 暗号鍵 | 暗号データ | 復号鍵 | 復号データ |
|:-:|:-:|:-:|:-:|:-:|
| こんにちは | A | l�3��t | A | こんにちは |
| こんにちは | A | l�3��t | B | ��U�B |
| こんにちは | A | l�3��t | C | 2C�l� |

暗号鍵に対応した正しい復号鍵を用いた場合、当然元データが復元されます。ここで違う鍵で復号処理を行った場合、一見ランダムのデータになるため、ほとんどの場合で文字化けが発生します。つまり、**復号鍵が間違っている、というヒントを与える**事になります。

このヒントは、元データの性質について文脈から予測できるほど、元データが長いほど大きな情報になります。
- メールアドレスと分かっていれば、UTF16の1文字の16bitの中、高々6bitしか有効な文字がない
- メールアドレスが30文字もあれば、300bit分の情報になるので、256bit鍵なら正解か不正解かがほぼ確実にわかる

もちろん、鍵のbit数を安全性の根拠とした主流暗号の場合、こういうヒントを与えても、なお十分な強度を持つように設計されています。つまり、ヒントを与えるという質的弱点を、圧倒的な鍵という量でカバーしていることになります。~~DQで言えば、必ず痛恨の一撃を食らっても、[味方が10<sup>77</sup>人](https://qiita.com/zaburo/items/074995ae8cb81d506222)もいれば大丈夫~~

## ワンタイムパッドの場合
| 元データ | 暗号鍵 | 暗号データ | 復号鍵 | 復号データ |
|:-:|:-:|:-:|:-:|:-:|
| こんにちは | A | l�3��t | A | こんにちは |
| こんにちは | A | l�3��t | B | さようなら |
| こんにちは | A | l�3��t | C | お腹減った |

ちょっと強調して書いていますが、重要なのは元データと同じ長さの、あらゆるデータに復号される可能性があることです。このため、**仮に全鍵探索できたとしても、妥当な復号データ候補が事実上無数**にあって、どの鍵が正しいか分かりません。~~DQで言えば、マヌーサ掛けているので攻撃が当たらない~~

## ~~マヌーサをかける~~鍵数以外で実質的な暗号強度を上げるには
例えば、メールアドレスを暗号化しようと思ったら、以下の様な点に気を付けると、実質的な暗号強度が上がるでしょう。
- 使われる文字種だけを最小限のbit数に押し込めるshrinkされたバイナリ表現に変換してから暗号化
- 文字種だけでなく、複数文字のパターン（.comとか.co.jpとか）を最小限に押し込める様、辞書固定の圧縮をする

上記の様な点に気を付ければ、復号パターンに「correct@sample.co.jp」以外に「wrong@test.net」や「foo-bar@baz.com」などが多数混ざります。~~攻撃者に対するこうかはばつぐんだ~~
Salesforceのレポート集計条件を設定しよう～「30～45日前」のように日数の括りを分けて表示する方法

こんにちは。
本橋孝昭です。

Salesforceのレポートの検索条件で「30～45日前」のように日数の括りを分けて表示する方法をご紹介します

今回は
「商談の完了予定日が「30～45日前」の商談一覧の表示」
とします


### ステップ１　商談オブジェクトに数式項目を作成

まずは商談オブジェクトに数式項目を作成しましょう

「30～45日前」の場合、数式項目（チェックボックス型）で下記数式を作成してください

AND( CloseDate <= TODAY()-30, CloseDate >= TODAY()-45)
![商談０１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/80b5fccc-8664-99cd-cbf6-19685c163db5.png)


### ステップ2 レポートを作成　検索条件で　数式項目＝TRUE　に設定する
![test02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/35e2405c-d564-0d1b-ffae-01b1d9bf7d4b.png)


上記数式項目を作成し設定すると「30～45日前」のように日数の括りを分けて表示することが可能です。
WindowsPC を起動した瞬間からできる C# で Hello World!

Windows に標準でインストールされている下記の C# コンパイラを使用します。
```
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe
```

①デスクトップ上に Hello という名前のフォルダを作成する。
②すべてのアプリの中から「コマンドプロンプト」を起動する。（ウィンドウボタン → cmd と入力）
③作成した Hello フォルダの場所へ cd コマンドを使って移動する。
```
C:\Users\xxx>cd C:\Users\xxx\Desktop\Hello
C:\Users\xxx\Desktop\Hello>
```
④すべてのアプリの中から「メモ帳」を起動する。（ウィンドウボタン → memo と入力）
⑤下記のプログラムを書き、「Hello.cs」として作成した Hello フォルダに保存する。
```Hello.cs
using System;

class Hello{
	public static void Main(){
		Console.WriteLine("Hello World!");
	}
}
```
⑥Windows に標準でインストールされている C# のコンパイラを使って、コンパイルする。
```
C:\Users\xxx\Desktop\Hello>C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe Hello.cs
```
⑦「Hello.exe」ファイルが作成されるので、それを実行する。Hello World! と表示されれば成功！
```
C:\Users\xxx\Desktop\Hello>Hello
Hello World!
```
パッケージ管理システム #1

# パッケージ管理システム
## npm（Node Package Manager）とは？

Node.jsで外部パッケージをインストールして使うためのマネージャ。
package.jsonを読み込んで、npmのリポジトリにパッケージを取りに行く。
npmを使うと、依存しているパッケージを一度にインストールできる。
似たようなパッケージ管理システムにyarnがある。
以前はBowerというものが使われていたが、今ではnpm,yarnが一般的。

## package.jsonとpackage-lock.json
### package.json
自身のパッケージを管理するために使われるファイル
package.jsonは npm init　コマンドによって生成される
インストールすべきパッケージのバージョンのの範囲や対応ブラウザのバージョン指定、npm-scriptなどが記入される。
また、package.jsonが存在するディレクトリにnpmを使って新たにパッケージをローカルインストールすると自動的にpackage.jsonの情報が更新される。※グローバルインストールでは記入されない。
devインストールはpackage.jsonにdev-dependenciesと記載される

### package-lock.json（lockファイル）
npm installでpackage.jsonに基づいて各種パッケージが実際にインストールされた結果のみが記載されている。
※lockファイルの存在意義
package.jsonではインストールするパッケージの範囲を指定していたが、package-lock.jsonではインストールされたパッケージのバージョンが記述されている。つまり、共同開発にて全く同じパッケージバージョンを使うためにはlockファイルの共有が必要。

## Node_modulesとは
package.jsonを元にインストールされた各種パッケージが格納されるディレクトリ先のこと。情報量と変更が膨大になるので、.gitignoreを活用しnode_modulesはgithubにあげない。
package.jsonを共有し、各々のPCでnode_modulesを作成し、環境を整える。
package.jsonを元にインストールする方法が４つあるがそれぞれ目的が異なるので、次回の記事で整理する。
※グローバルインストール、ローカルインストールどちらもPCにパッケージはダウンロードされている。

## 余談
### npxとは
パッケージをダウンロードせずに使用できるコマンド。
一度きり実行したいときによく使う。
Diskの容量を節約できる・グローバル汚染しない、パッケージをダウンロードしていないのでパッケージのバージョン等の管理が必要ない。
ex)未インストールのパッケージにあるコマンドをインストールしないで使える
※npm（バージョン5.2.0以降）をインストールすると、npxはプリインストールされる。

ex)Reactプロジェクトを開始する手順
①npx create-react-app [プロジェクト名]
②cd [プロジェクト名]
③npm start
④ブラウザでhttp://localhost:3000/
【Python】進捗状況をprogress bar で表示(tqdm)

# はじめに

今回は、tqdm というプログラムの進行状態をプログレスバーに表示するライブラリの使い方をメモしておきます。
これが使われているプログラムを見て、自分のコードにも導入しようと思い調べました。


# tqdm の動作確認

## 準備

### 名前について

[こちら](https://pypi.org/project/tqdm/)によると、tqdm は

- the Arabic word taqaddum (تقدّم) which can mean “progress,”
- an abbreviation for “I love you so much” in Spanish (te quiero demasiado)

だそうです。なんて発音したら良いのかな。。



### Install

pip で何のトラブルもなくインストールできました。

## 使ってみた

Iterator にかぶせると、自動で表示してくれました。

```python:test01.py
from tqdm import tqdm
from time import sleep

print('range(10)')
for i in tqdm(range(10), desc="proc1", postfix="range", ncols=80):
    sleep(0.2)
    pass

print("----------------------------------------------------")

print('range(10)')
dics = {0: 'a', 1:'b', 2: 'c', 3:'d'}
for k, v in tqdm(dics.items(), desc="proc2", postfix="dict", ncols=80):
    sleep(0.2)
    pass
```

実行すると、下記のように表示されました。

```
$ python test01.py
range(10)
proc1: 100%|█████████████████████████████| 10/10 [00:02<00:00,  4.93it/s, range]
----------------------------------------------------
range(10)
proc2: 100%|████████████████████████████████| 4/4 [00:00<00:00,  4.90it/s, dict]
----------------------------------------------------
```

また、より細かく進捗を制御することもできます。

- total で全体の
- update で進捗状態を更新する
- close する。

最後のclose も必要とのこと。
で、下記のように実装してみました。

```python: test02.py
from tqdm import tqdm
from time import sleep
from random import randint

pbar = tqdm(range(10), desc="myprog", postfix="postfix", ncols=80, total = 100)
i = 0
while i<100:
    sleep(0.1)
    p = randint(0, 10)
    i += p
    if i > 100:
        p = p - (i-100)
    pbar.update(p)
pbar.close()
```

結果、下記のように表示されました。

```
$ python test02.py
myprog: 100%|████████████████████████| 100/100 [00:02<00:00, 43.07it/s, postfix]
```

今回、カウンターが１００を超えないようにしていますが、ここでupdate で最初に設定した total を超えてインクリメントしてしまうと、バーが消えました。別に問題はないのですが、最後100/100 でバーを表示したままにしたかったので、調整を入れました。

# まとめ

あっさりとtqdm を使えた。今度、使ってみよう。
(2022/07/30)