OmniAICreator/Qiita-1.07M huggingface dataset:
【Angular】画像を縮小しつつ上下中央の正方形にトリミングして保存する

プロフィールのアイコンとかを保存したい時に容量削減しつつ、中央部分だけトリミングしたい…ということがあったので作ったサンプル。

![スクリーンショット 0004-01-07 11.24.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607742/7704ba55-6f98-7eba-adf3-ff521aed6f28.png)

```html:app.component.html
<div class="container">
  <div class="row">
    <div class="col">
      <label for="iconUploadForm" class="btn grey">画像をアップロード</label>
      <input id="iconUploadForm" type="file" accept="image/*" (change)="onChangeFileInput($event)" />
      </div>
    <div class="col">
      <button (click)="save()" class="btn blue">保存</button>
    </div>
  </div>
  <div id="canvas-box"></div>
</div>
```

```typescript:app.component.ts
  onChangeFileInput(event:any){
    const file = event.target.files[0];
    if(!file){
      return;
    }
    const reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = function () {
      // 縮小・トリミング後のサイズのキャンバスを作成
      const canvas = document.createElement('canvas');
      canvas.id = 'icon-canvas'
      const ctx = canvas.getContext('2d');
      const trimSize = 128; // 縮小後のサイズ
      canvas.width = trimSize; 
      canvas.height = trimSize;
      canvas.style.width = 100+'px'; // cssでの表示サイズ
      canvas.style.height = 100+'px';

      if(ctx){
        const image = new Image();
        image.src = reader.result as string;
        image.onload = () =>{
          let height = 0;
          let width = 0;
          let xOffset = 0;
          let yOffset = 0;
          if (image.width > image.height) {// 横長画像
            height = trimSize;
            width = image.width * (trimSize / image.height);
            xOffset = -(width - trimSize) / 2;
            yOffset = 0;
          } else { // 縦長画像
            width = trimSize;
            height = image.height * (trimSize / image.width);
            yOffset = -(height - trimSize) / 2;
            xOffset = 0;
          }
          // キャンバスに描画
          ctx.drawImage(image,xOffset,yOffset,width,height);        
        }
      }
      const div = document.getElementById('canvas-box');
      if(div){
        // キャンバスを追加
        div.appendChild(canvas);
      }
    }
  }

  save(){
    const canvas = document.getElementById('icon-canvas') as HTMLCanvasElement;
    if(canvas){
      const data = canvas.toDataURL();
      console.log(data);
    }
  }

```

１２８で画像は作成しているけど、画面表示上では100pxで表示している例
５４０kbくらいあった画像で１２８px四方のアイコンを作って、５３kbくらいになっていました。
データ収集とは？データ収集の目的と事例を紹介する

##データ収集の目的
スクレイピングはインターネット上の情報を収集して、取得した情報の加工できます。より詳しくデータを抽出すると、より深いデータ分析を行います。
##データ収集のツール
Webサイトで必要な情報を取得するように開発されてる[Webスクレイピングツール](https://jp.scrapestorm.com/)がたくさんあります。[ScrapeStorm](https://jp.scrapestorm.com/)には人工知能に基づき、[Webスクレイピング](https://jp.scrapestorm.com/)ツールです。プログラミングが必要なく、ほとんどのWebサイトからデータを[スクレイピング](https://jp.scrapestorm.com/)します。1-ClickでWebサイトからデータを自動的に抽出します。
![ScrapeStorm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/c65d7368-01fb-2f11-7f07-5f03574acbf7.png)
##人気話題を把握
この数年来、ティックトック、インスタグラムなどの動画メディアが流行っています。ただし、動画作者にとって、話題の更新もかなり速いです。こういう時、データ収集は今流行している話題が素早く把握するの役割を果たします。大人気の話題、アイデアを収集するか、コメント数、再生数などのデータも収得できます。
![gopro-M.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/2d16c36d-4638-65cd-913f-0fcafc1ac27b.jpeg)
##マーケティング
ネットショッピングは人々に大歓迎される以来、Amazon、Yahoo！ショッピング、楽天市場、色々なネットショッピングサイトが人々の日常生活に入ります。売り手にとって、商品レビュー、総合得点などのデータを収集するのはマーケティングに大切なものです。また、各ネット通販サイトに商品の価格対比も大切です。価格をタイムリーな調整はきっとデータ収集に切り離さないでしょう。
![online-marketing-M.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/df832776-f0e4-8136-9b08-81f1fe06f5b7.jpeg)
##ファイナンス
不動産投資、投資信託、株価などの投資には多量なデータが必要です。目まぐるしく変動している市場を予想するは大変難しいでしょう。数か月以来のデータを収集し、分析して、ファイナンス投資に役立つかもしれません。
![entrepreneur-M.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482909/21566788-78cd-e4db-f7bb-7b50f93caa6b.jpeg)
今回は、動画メディア、マーケティングなどの活用事例を紹介しますが、もちろん、以上の領域しかありません。一つ注意すべきことがありますが、スクレイピングで悪意リクエストを送ることは法律違反です！Robots協議、法律を守る上で正しく利用してください。
メモ：VSCodeでのgitの使い方


gitは使っていたが、主に[gitExtensions](https://sourceforge.net/projects/gitextensions/)というGUIツールで操作していた。
無料で、CVS時代の人でも理解しやすいインターフェースで割と良かった。（OSによってはGitKrakenとかも候補かも）
が、今後も考えてVSCodeでの扱い方を確認しておく。
Windows Server 2012

# git側の準備
gitが入っていない場合は
[https://gitforwindows.org/](https://gitforwindows.org/)
からインストール

CodeCommitを見る前提で
HTTPSなら[公式](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-gc.html)の手順で確認。
なお、DirectConnect経由でCodeCommitに繋いでいる場合は
https://vpce-xxx.git-codecommit.ap-northeast-1.vpce.amazonaws.com/v1/repos/XX
のようなアドレスになる。

事前にcloneする場合は
`git clone リポジトリ ローカルパス`
で。



## 基本機能
[参考](https://miya-system-works.com/blog/detail/128)
クローンしない場合は、ディレクトリを開いて、コマンドで`git init`でgit管理するように対応して
必要に応じて`git remote add origin`でリモートと紐付ける。

ファイルを変更すると左メニューの「ソース管理」にpushする対象として出てくる。

クリックすると差分表示
＋を押すとステージング
コメントを書いて上のコミットボタンでコミット
プッシュは「・・・」ボタンから選択

## その他拡張機能
GitLensを入れる事で、ソースの変遷が分かるようになる。
[参考](https://atmarkit.itmedia.co.jp/ait/articles/2111/19/news034.html)

プルリクエストを行う場合はgithub用の拡張パックGitHub Pull Requests and Issuesを導入する。
[参考](https://atmarkit.itmedia.co.jp/ait/articles/2111/05/news022.html)

グラフ表示を確認するにはGit Graphを入れるとよさそう。
[参考](https://dev.classmethod.jp/articles/vscode-git-graph-extension/)
グラフ右クリックからRebase,Resetなんかも出来る。

どこまでgitの機能を使うかどうかは所属する集団にもよるが、グラフ表示くらいは必要かも。
oneWEXのwlpログの拡張方法

oneWEXのエラー解析する際、wlpのログはデフォルトでは1ファイル20MBの2世代で合計40MBとなります。

サポートにログ連携しても既にローテーションされて無いと言われるケースもあると思いますが、その場合は、以下の方法でサイズや世代数を拡張できます。

/opt/ibm/wlp/usr/servers/defaultServer/bootstrap.properties
com.ibm.ws.logging.max.file.size=50
com.ibm.ws.logging.max.files=30

例えば上の設定をした場合、「1ファイルあたり50MBを30世代」（合計1500MB）となり、デフォルトの約37.5倍分のログが保持されるようになります。

ただし、ログ拡張した場合は、以下の点に注意が必要です。
・ディスクの空き容量
・ダウンロードするZIPファイルのサイズも増加する
[py2rb] re.match re.search

# はじめに
移植やってます。
# re.match re.search (Python)
```python
import re
print(re.match(r'aaa', 'aaab'))
print(re.match(r'aaa', 'baaa'))
print(re.search(r'aaa', 'aaab'))
print(re.search(r'aaa', 'baaa'))

<re.Match object; span=(0, 3), match='aaa'>
None
<re.Match object; span=(0, 3), match='aaa'>
<re.Match object; span=(1, 4), match='aaa'>
```
`re.match`は先頭からのマッチになります。
こちらの記事が分かりやすい。

https://qiita.com/halhorn/items/9e6599a3422e7dd94ec8
# match (Ruby)
```ruby
p 'aaab'.match(/^aaa/)
p 'baaa'.match(/^aaa/)
p 'aaab'.match(/aaa/)
p 'baaa'.match(/aaa/)

#<MatchData "aaa">
nil
#<MatchData "aaa">
#<MatchData "aaa">
```
先頭からにするかどうかは、正規表現側で定義します。

https://docs.ruby-lang.org/ja/latest/method/Regexp/i/match.html
# メモ
+ Python の re.match re.search を学習した
+ 百里を行く者は九十里を半ばとす
All-in-One WP Migrationで「エクスポートできません」と出たときの対処法

![出来ない.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485388/0b8f4074-b913-3060-80ea-3d02ff3470b5.png)

本番環境のデータをAll-in-One WP Migrationでバックアップしようとしたとき、こんな感じのエラーが出たときの解決方法です。
多分、無料レンタルスペース使ってる人だと目にするかもしれません。

All-in-One WP Migrationのバックアップをクリックすると、バックアップファイル名の一覧がでます。
それを消してください。
Out of disk space.と言ってるので、原因はサーバーの容量が足りないことのようです。
mkcert を試すリポジトリを作成した


# 概要

SSL証明書を利用したいと考えて、以下の記事を拝見しました。

数分でできる！mkcertでローカル環境へのSSL証明書設定
https://www.hivelocity.co.jp/blog/46149/

この記事を参考に自分で試したリポジトリと記事となります。説明は参考記事や mkcert リポジトリをご確認ください。

試したリポジトリ: https://github.com/junjanjon/mkcert-test

mkcert リポジトリ: https://github.com/FiloSottile/mkcert

# mkcert インストール

```sh
# Mac の場合 Homebrew でインストールできます。
brew install mkcert
# ローカル環境に認証局を作成します。
mkcert -install
```

# certs ディレクトリ以下に証明書を作成する

certs ディレクトリ以下に "*.dev01.dev" の証明書を作成します。

```sh
mkdir -p certs

cd certs
# ワイルドカードを指定する場合、ダブルクォーテーション（“”）で囲む必要がある
mkcert "*.dev01.dev" dev01.dev

# _wildcard.dev01.dev+1.pem と _wildcard.dev01.dev+1-key.pem が作成される
# ”+1″ はその他1つのドメインが指定されているという意味
```

リポジトリでは create-certs.sh で対応しています。

# docker-compose による nginx サーバを立てる

証明書を確認するためサーバ名 sample.dev01.dev で https アクセスを受け付ける nginx サーバを立てます。
リポジトリの conf/default.conf に設定を記載しています。

```sh
$ cat conf/default.conf
server {
    listen       443 ssl http2;
    server_name  sample.dev01.dev;
    ssl  on;

    ssl_certificate     /etc/nginx/ssl/_wildcard.dev01.dev+1.pem;
    ssl_certificate_key /etc/nginx/ssl/_wildcard.dev01.dev+1-key.pem;
    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
}

$ cat docker-compose.yml
version: '3'
services:
  nginx:
    image: nginx
    ports:
      - 8080:443
    volumes:
      - ./certs:/etc/nginx/ssl
      - ./conf/default.conf:/etc/nginx/conf.d/default.conf

$ docker compose up
```

# 動作確認

curl でアクセスをテストする。名前解決は curl の resolve オプションを利用している。

```sh
$ curl --resolve sample.dev01.dev:8080:127.0.0.1 https://sample.dev01.dev:8080/
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.21.5</center>
</body>
</html>
```

https でアクセスできていることが確認できました。
404 なのは nginx の location 設定がないためです。今回の主目的ではないので意図している挙動です。

ブラウザからアクセスを試す場合は hosts ファイルを編集してください。
Bladeでのループ処理/分岐処理

---
```php
// resources/views/index.blade.php

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>My BBS</title>
    <link rel="stylesheet" href="css/style.css">
</head>
<body>
    <div class="container">
        <h1>My BBS</h1>
        <ul>
/*
1.@foreach(配列 as 変数) ~ @endforeach
最後の@endforeachの後には ; がいらないので注意する。
このような@で始まる便利な構文をディレクティブと呼びます。
*/
            @foreach ($posts as $post)
                <li>{{ $post }}</li>
            @endforeach
        </ul>
        <ul>

/*
2. @forelse ~ @empty ~ @endforelse で配列が空の場合の処理を分岐することもできる。
@empty 以降で配列が空の場合の処理を記述し、@endforelseで締める。
*/
            @forelse ($posts as $post)
                <li>{{ $post }}</li>
            @empty
                <li>No posts yet!</li>
            @endforelse
        </ul>
    </div>
</body>
</html>
```
```php
// routes/web.php

<?php

use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    $posts = [
	// 3. 以下のように配列が空になっている。
        // 'TitleA',
        // 'TitleB',
        // 'TitleC',
    ];

    return view('index')
        ->with(['posts' => $posts]);
});
```

## 分岐処理(if文)
```php
/*
if文も文頭に@をつけることは変わらないが、{ }は必要ないことに注意する。
また、条件式の値を{{ }}で実体参照する必要はない。(文法エラーになってしまう。)
*/
@foreach($members as $member)
	@if ($mondayShift->morning1 === $member->name)
		<p>{{ $member->name }}</p>
	@else
		<p>名前が違います</p>
	@endif
@endforeach
```
csvのデリミタ、改行文字とかを推測


# csv定義　推測関数
```python

def sniffer(dat:str,
    delimiters = ['\t', ';', ',', ':', '|', ' '],
    quotechars = ['"', '\'', '`'],
    escapechars = ['\\', '^'],
    ):

    # guess lineterminator
    LF = ""
    lines = 1
    if ('\r' in dat):
        LF += '\r'
    if ('\n' in dat):
        LF += '\n'
        lines = dat.count('\n')
    if (LF == "" and '0x0' in dat):
        LF = '0x0'
        lines = dat.count('0x0')
    
    # guess delimiter
    mxdlm = 0
    delimiter = None
    _it_delim = ((dat.count(x), x) for x in delimiters if x in dat)
    try: mxdlm, delimiter = max((v, x) for v, x in _it_delim if (v / lines) >= 1)
    except ValueError: pass

    # guess quotes
    mxqt = 0
    quotechar = '"'
    _it_quot = ((dat.count(x), x) for x in quotechars if x in dat)
    try: mxqt, quotechar = max((v, x) for v, x in _it_quot if v % 2 == 0)
    except ValueError: pass

    # guess escapechar, etc
    if quotechar:
        escapechar, doublequote = next(((esc, False) for esc in escapechars if (esc + quotechar) in dat), (None, True))

    return dict(
        delimiter=delimiter,
        doublequote=doublequote,
        lineterminator=LF,
        quoting = 1 if quotechar and mxqt > mxdlm * 2 else 0,
        quotechar=quotechar,
        skipinitialspace = delimiter and (delimiter + ' ') in dat)

```

# 使い方
```python
>>> csvdat = """n,aa
1,1
2,あ
"""
>>> print(sniffer(csvdat))
{'delimiter': ',', 'doublequote': True, 'escapechar': None, 'lineterminator': '\n', 'quotechar': '"', 'quoting': 0, 'skipinitialspace': False}

>>> import csv
>>> from io import StringIO
>>> r = csv.reader(StringIO(csvdat), **sniffer(csvdat))
>>> print(list(r))
[['n', 'aa'], ['1', '1'], ['2', 'あ']]

```

以上csv.Sniffer 車輪の再発明
Amazon EC2でマインクラフトサーバー(Java版 ver.1.18)を作成する

# はじめに
マインクラフトサーバー(Java版 ver.1.18)の作成をしていたのでメモ。
ver.1.18からはJDK17が必要になりインストールの方法も色々あるので自分なりにいろいろ調べてAmazon Correttoを使用してインストールするのが楽そうだったので紹介。

https://aws.amazon.com/jp/corretto/

# 環境構築
適当なEC2インスタンスを立ててsshしてインスタンスに入ります。
今回は`Amazon Lunux2`の`c5a.xlarge`で作成。(インスタンスのサイズは以前サーバーを作成した時と同じものを使用。 5人くらいで遊んでました。)

```
# Amazon CorrettoでJDK17をinstall
$ sudo rpm --import https://yum.corretto.aws/corretto.key 
$ sudo curl -L -o /etc/yum.repos.d/corretto.repo https://yum.corretto.aws/corretto.repo
$ sudo yum install -y java-17-amazon-corretto-devel

# 確認
$ java -version
# 他のjavaがすでに入っているのであればversion切り替える
$ sudo alternatives --config java

# マイクラサーバー導入
# https://www.minecraft.net/ja-jp/download/server からurlを取得してwget
$ wget https://launcher.mojang.com/v1/objects/125e5adf40c659fd3bce3e66e67a16bb49ecc1b9/server.jar
$ java -Xmx1024M -Xms1024M -jar server.jar nogui
$ vi eula.txt
$ java -Xmx1024M -Xms1024M -jar server.jar nogui
```

あとはセキュリティーグループでTCP25565とUDP25565を解放してあげれば終わりです。
[py2rb] re.sub

# はじめに
移植やってます。
# re.sub (Python)
```python
import re
s = '1A2B3C'
print(re.sub(r'[A-Z]', '', s))
print(re.sub(r'[A-Z]', '', s, count=1))

# 123
# 12B3C
```
正規表現で一致した文字列を置換します。
`count`オプションで置換する回数を指定できます。
https://docs.python.org/ja/3.7/library/re.html#re.sub
# gsub (Ruby)
```ruby
s = '1A2B3C'
puts s.gsub(/[A-Z]/, '')
puts s.sub(/[A-Z]/, '')

# 123
# 12B3C
```
`Ruby`の場合、すべて置換する`gsub`/`gsub!`と最初に一致する文字列を置換する`sub`/`sub!`があります。

https://docs.ruby-lang.org/ja/latest/method/String/i/gsub.html

https://docs.ruby-lang.org/ja/latest/method/String/i/sub.html
# メモ
+ Python の re.sub を学習した
+ 百里を行く者は九十里を半ばとす
GETとPOSTについて

##HTTPメソッドが「GET」になるのはどんな時？
・アドレスバーにURLを入力した時。
・google検索で出てきたサイトをクリックした時。

##HTTPメソッドが「POST」になるのはどんな時？
・会員登録をする時。
・ブログの投稿を行う時。

###GET=サイトの表示を得る（GET）のがGETリクエスト
###POST=データの送信をする（POST）のがPOSTリクエスト
M1 Mac + MontreyでiCloud Driveが同期しなくなった

本件、ようやく解決したので簡潔に書きます。
何時間経ってもサムネイルデータ（クラウドのダウンロードアイコンが表示されている状態）にもならなかったので、AppleのCSとバトルした結果、解決に至らず、海外のAppleのサポートコミュニティで見つけた解決方法をベースに対処したら戻りました。
Montreyで昨年１０月から起きている不具合ぽいです。
たぶん、プライベートリレーというベータ機能が悪さをしているのではないかと
思っているのですが、CSが開発側にログ提供などをしっかり行わないため、本国の開発者が認識していないのではないか？と思われます。
これについて、エスカレーションルートをお持ちの方は是非、何とかして伝えてほしいと思います。
書き込みを読むと、海外のiCloud CSも日本と同じ雑な対応をしていました。

1. 同期がなされない場合は、リカバリーインストールが必要です。
2. 膨大なデータをシンクさせるには以下の条件が必要です。
   <dl>
     <dt>安定的で潤沢な高速ネットワーク（できれば有線が望ましい）</dt>
     <dt>潤沢な時間（寝てる間が望ましい）</dt>
   </dl>

3. iCloudのサインアウト/サインイン
4. DHCPのリフレッシュ
5. プライベートリレーのオン／オフ
6. iCloud ドライブのデスクトップと書類フラグをチェック
7. 先に写真が同期されていることを確認

   <dl>
    <dt>確認できればシンクはされる</dt>
   </dl>

8. iCloud.comのアカウントを見た時、自分のアイコン設定するところがあるが、表示されないのはバグだと認めているので、グレーアウトしていても気にしない。

9. 画面下の同期されている端末のMacのアイコンだけグレーアウトしているが、Payマークがひょうじされていれば同期できているので、問題ない。（バグだと認めなかったが、端末側ではきちんと色のついたアイコンなのでバグである）

10. 同期されるまで最低１５分かかるとあったが、多分、GoogleDriveなどと違って、操作をしていても同期をするタイプではなく、操作をしていない状態で○○分後という条件がついている可能性があり、寝静ず待ってからそっとやるという仕様の可能性がある。

11. そして、これらの同期条件はCSにも開示されていないため、顧客は不安しかない。

ということで、Appleの意味のない秘密主義のおかげでいらん時間を使いましたが、本問題が出た場合は再度入り直して、夜間に放置しておけば何とかなる、です。

めんどくさ。

:::note info
追伸
ちなみに、リカバリーしている時にDL用のCDNを参照しているのですが、どうも1stチョイスが、172から始まるIPを参照してエラーを１０回リトライしてからCDNにアクセスしているので、ローカルでやっていた時のまま出荷している可能性が高く、非常に品質が12.1に関してはやばいなと思いました。
:::

### 参考文献
[Apple Community Support: iCloud Drive not syncing with 2021 M1 Pro MacBook Pro](https://discussions.apple.com/thread/253294496?answerId=256629033022#256629033022)
改修に苦労したくない！楽をするためのコードを書く

## 初めに
日々の業務の中で保守対応をする機会がある。
時には機能追加の対応もする。
初めて何年も活用されているサービスのソースコードを見た時
僕はよくわからないスワヒリ語を読んでいるような錯覚にあった。
というのは冗談で当時はそれどころではなく
「クソコード」であることに気づけなかったです。
徐々に経験を積んだこと、勉強してきたことで感覚として
何が良くない状態なのかを意識するようになってきました。
そんな意識していることを纏めていきます。

## 改修したいだけなのに、、、
改修をする時にシンプルに実装できたらどんなに楽だろうか。
例えば商品を検索する機能に商品のステータス（在庫の有無や割引対象可否など）を条件に加えるといった
改修をする時にシンプルに
「商品のステータス（在庫の有無や割引対象可否など）を条件に加える」
だけをやって完了。とならないのが僕が経験してきた状況です。
何が苦労したかというと
ソースコードを理解するのにとにかく時間がかかったことです。
読み解く処理は「商品を検索する」だけのはずなのですが
とにかく理解に時間を費やしました。
なんで時間がかかったのかというと

- 名前付けが良くなくて変数に何が入っているのかがわからない
    - わからないから代入箇所までコードを追うことになった
- ネストが深すぎて今何を追っていたのかがわからなくなる
    - if文、for文、foreach文、switch文でのネストがハンパなかった
- 処理が長すぎて初めのコードが不明瞭になる
    - え〜と結局このメソッドは何をするんだっけ？となった

## もっと楽にコードを読みたい
僕自身のスキルが貧弱なのも多少なりとありますが
とにかく「クソコード」に出会っていい思いする人はいないと思います。
すんなり理解ができたら1番だろうし
尚且つ勉強になるコードに出会えたら職人としては嬉しいのではないでしょうか。
もっと楽にコードを読みたい
そのために自分が書くコードは楽できるように書いていきたいと強く思います。

## 名前付けが良くなくて変数に何が入っているのかがわからない
``` PHP
// 商品のステータス（在庫の有無や割引対象可否など）
$status
```
`$status`の中に何が入っているかわかるでしょうか？
現在の情報だけ言うならばステータスが入っているのは間違い無いでしょう。
だけど商品のステータスなのか、発送状況のステータスなのかは不明ですね。
あとは在庫の有無なのか割引対象なのかも不明です。
前後の情報で明確になるだろうけど下記のような代入をされていたら
流石に覚えてないでしょう

``` PHP
// 商品のステータス（在庫の有無や割引対象可否など）
$status = '在庫なし';
~
数百行後
~
$status
// 何のステータスだよ！！！
```
名前付けは奥が深いです。
代入するタイミングも考えものです。

今の自分なら下記のように書きます。
ステータスなのでEnumを使って進めるのが最適かとも思いますが
今回は名前付けの意識のために。

``` PHP
$noInventory = '在庫無し';
```
名前が長すぎるのも良く無いと思いますが
状況によりけり。1番は誰がみてもすぐに理解ができるのがベストですね。

## ネストが深すぎて今何を追っていたのかがわからなくなる
``` PHP
foreach ($array as $value) {
    if (条件) {
        // 何かしてる
        foreach ($arr as $val) {
            foreach ($hoges as $hoge) {
                if (条件) {
                    if (条件) {
                      // もう何書いてるのかわからないですw
                    }
                }
            }
        // 何かしてる
        }
    }
}
```
これはネタじゃなくてリアルで見たことのあるコードです。
一応気にはしていてコメントでこう書いてあった
`// もっといい書き方があるはず`
ん〜つらいです。
最近の自分はif文を書くのも躊躇っています。
でもif文無しは無理なので
ネストは1回だけを目標にしてます。
2回にしてしまったら罪悪感で夜しか眠れません。
不確かですが人間はマルチタスクができないみたいな情報を目にしたのですが
そんな人間にネストが深すぎるコードを理解させようだなんてドSの極みですね。

ネストが深くなる時はそもそもの設計に問題がある可能性も考えるといいと思います。

## 処理が長すぎて初めのコードが不明瞭になる
あくまでもイメージですが

``` PHP
A class {
    $loginUser = Auth::user();
    // めちゃくちゃコード書いてる

    // めちゃくちゃコード書いてる

    // めちゃくちゃコード書いてる


    // めちゃくちゃコード書いてる

    // めちゃくちゃコード書いてる

    // めちゃくちゃコード書いてる


    // めちゃくちゃコード書いてる



    // めちゃくちゃコード書いてる

    // めちゃくちゃコード書いてる



    // めちゃくちゃコード書いてる

    // めちゃくちゃコード書いてる

    // めちゃくちゃコード書いてる

    // めちゃくちゃコード書いてる

    // めちゃくちゃコード書いてる

    // めちゃくちゃコード書いてる

    // めちゃくちゃコード書いてる

    // めちゃくちゃコード書いてる

    // めちゃくちゃコード書いてる


    // めちゃくちゃコード書いてる



    // めちゃくちゃコード書いてる



    // めちゃくちゃコード書いてる


    // めちゃくちゃコード書いてる

    // 今何してるんだっけ？
}
```
お付き合いいただきありがとうございます。
一つのメソッドに詰め込みすぎの状態ですね。
処理していることに区切りをつけて
別メソッドとして切り出すことで読みやすくなります。
また、改修する時にも切り出されたメソッドだけに手を加えればいい場合も出てくるかと思います。

## まだまだ検討することはたくさんある
現時点でも実装する時に考えていることはありますが
まだ言語化ができないで感覚でやっていることがあるので
いずれは書き出して一人でも楽ができるコードが書けるようになれればと思っています。
最後までありがとうございます。

## 参考
[単一責任原則で無責任な多目的クラスを爆殺する](https://qiita.com/MinoDriven/items/76307b1b066467cbfd6a)
[うまくメソッド名を付けるための参考情報](https://qiita.com/KeithYokoma/items/2193cf79ba76563e3db6)
[現場で役立つシステム設計の原則](https://amzn.to/3JyP7QL)
GASとLINEBOTの連携(失敗)(備忘録)

***自分が失敗したからには他にもやってしまった人がいるだろう***
１匹いれば１０匹はいる。(ゴキブリ理論)
ということで備忘録です。

# gasとLINEBotを連携させてぇ！！！

参考にしたサイト
https://www.dcom-web.co.jp/lab/bot/make_a_line_bot_with_gas

上記サイトを取り合えずコピペ。
しかし、動作せず....

```動かなかったコード.gs
function myFunction() {
  var access_token = "YOUR_ACCESS_TOKEN"
  // リプライ先を特定するためのログ管理スプレッドシートID
  // ご飯リストのスプレッドシートID
  var spreadsheet_id = "spread_id"
 
  /**
   reply
  */
  function reply(data) {
    var url = "https://api.line.me/v2/bot/message/reply";
    var headers = {
      "Content-Type" : "application/json; charset=UTF-8",
      'Authorization': 'Bearer ' + access_token,
    };
    var text = "";

    if (data.events[0].message.text === "ご飯") {
      // ご飯リストスプレッドシートを取得
      var gohan = SpreadsheetApp.openById(spreadsheet_id).getSheetByName("ごはん");
      // A1セルから入力されている最終行まで一気に取得
      var gohanData = gohan.getRange(1, 1, gohan.getLastRow());
      // ランダムで候補を選ぶ
      var intRandomNum = Math.round(Math.random()*gohan.getLastRow());
      
      text = gohanData.getValues()[intRandomNum][0];
    }
    else {
      text = "「ご飯」って話しかけてね。"
    }
  
    var postData = {
        "replyToken" : data.events[0].replyToken,
        "messages" : [
          {
            'type':'text',
            'text':text,
          }
        ]
      };
  
    var options = {
      "method" : "post",
      "headers" : headers,
      "payload" : JSON.stringify(postData)
    };
  
    return UrlFetchApp.fetch(url, options);
  }
  
  /**
   LINEからのPOST受け取り
  */
  function doPost(e) {
    var json = JSON.parse(e.postData.contents);
    var data = SpreadsheetApp.openById(spreadsheet_id).getSheetByName('log').getRange(1, 1).setValue(json.events);
  
    reply(json);
  }
}
```

## 理由
***myFunctionで囲ってたから!!!***
はい、すみません。外側はいりませんでしたね。失礼しました。

解決してくれたteratail様
https://teratail.com/questions/299802
BigQueryのスケジュールクエリで節約する

クエリ実行でかかる費用が意外とばかにならないBigQueryですが、リアルタイム性など求めないデータはクエリのスケジュール機能を使うと節約できます。

### やり方
クエリエディタの「スケジュール」から「スケジュールされたクエリを新規作成」を選択します。
![スクリーンショット 2022-01-07 7.13.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144550/b7eb9dfd-8f4f-72e3-74b3-a7ad15e36b66.png)

抽出するスケジュールや抽出レコードを格納するテーブル名をつけて「スケジュール」を押すと作成されます。
![スクリーンショット 2022-01-07 5.30.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144550/7bca109f-339e-5d72-f8f5-72ff11195f13.png)

スケジュールをみると作成したものが入ってます。
![スクリーンショット 2022-01-07 5.24.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144550/e35aff44-edb1-2e12-7266-dd9c22d10144.png)

スケジュールの実行が完了すると書き込み先に指定した場所にテーブルが作られます。
![スクリーンショット 2022-01-07 5.21.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144550/fe17f0dc-755d-4603-e349-23c18531778f.png)

### 実行コスト比較

- 元のテーブル
![スクリーンショット 2022-01-07 5.27.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144550/b445a975-f59a-2288-c4bb-cfc115567b49.png)

- スケジュールで作成されたテーブル
![スクリーンショット 2022-01-07 5.28.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144550/f5bec316-4f83-3b86-91fa-c5fdda276572.png)

実行コストがだいぶ減りました。

### 小ネタ
ちなみにSQL書いてるとついやってしまいがちな`*`ですが、BigQueryで書いてしまうとコストかかるので、必要なカラムだけ書いてあげると良いです。

- `*`指定
![スクリーンショット 2022-01-07 5.28.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144550/2d67c32f-e4a6-9b47-92e3-51ce9ee8e02f.png)

- 特定カラム指定
![スクリーンショット 2022-01-07 7.42.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144550/7a6a546f-6f66-30ce-54f1-4a8750f55e09.png)

それでは。
Rails7 をちょっと試す（tailwindcss編）

## はじめに

Rails 7.0.0 では、[tailwindcss](https://tailwindcss.com/) が簡単に利用できるようになっています。
今回は、tailwindcss を試してみたいと思います。

tailwindcss を使うためには、npm と yarn が必要です。

以下のバージョンで確認しました。

- Ruby 3.0.2
- Rails 7.0.0
- npm 8.3.0
- yarn 1.22.17

## Rails プロジェクトを作る

新しくRailsプロジェクトを作ります。このとき `-j` と `--css` を指定します。
`-j` オプションを指定しないと途中でエラーになります。
( `--database` で postgresql を指定しているのに深い意味はありません。)

`esbuild` はインストールしておく必要はなく `rails new` でプロジェクト作成中にインストールされます。

```shell
mkdir rails_sandbox
cd rails_sandbox
rails new . --database=postgresql -j esbuild --css tailwind
```

## scaffold を実行する

scaffold を使って簡単なCRUDを作ります。 `tailwind` の確認をしたいだけなので適当です。

```shell
bin/rails g scaffold User name
```

## DBを作成し migration を実行する

```
bin/rails db:create db:migrate
```

## Rails を実行する

動作を確認するため、Rails を実行します。 `Procfile.dev` を指定して `foreman` を実行します。

```shell
foreman start -f Procfile.dev
```

## ブラウザからアクセスする

`http://localhost:3000/users` にアクセスします。

## tailwindcss が使えることを確認する

`tailwindcss` が使えることを確認するため、 `app/views/users/index.html.erb` を修正します。

`New User` のリンクをボタンっぽくしてみます。
また、 `Show this user` は、アンダーラインをつけます。

```erb:app/views/users/index.html.erb
<p style="color: green"><%= notice %></p>

<h1>Users</h1>

<div id="users" class="mb-6 mt-2">
  <% @users.each do |user| %>
    <%= render user %>
    <p class="mb-2">
      <%= link_to "Show this user", user, { class: "underline" } %>
    </p>
  <% end %>
</div>

<%= link_to "New user", new_user_path, { class: "ml-1 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 border border-blue-700 rounded" }%>
```

ブラウザの画面は以下のようになります。

![tailwind01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209941/1d5512d1-0639-de49-09db-d241e4e7c61b.png)

## tailwindcss のバージョン

`package.json` を調べてみたところ、tailwindcss の 3.0.8 になってました。

```shell
grep tailwind package.json
    "tailwindcss": "^3.0.8"
    "build:css": "tailwindcss -i ./app/assets/stylesheets/application.tailwind.css -o ./app/assets/builds/application.css"
```

## まとめ

今回は、tailwindcss が使えることを確認しました。
試したコードは、 https://github.com/suketa/rails_sandbox/tree/try_rails7_tailwindcss になります。

## 参考情報

- [CSS Bundling for Rails](https://github.com/rails/cssbundling-rails)
- [tailwindcss Buttons](https://v1.tailwindcss.com/components/buttons)
【Git】操作コマンド早見表　その2(Mac用)

#背景
前回作ったものの続きになります。
今回はブランチに関するコマンド、リモートリポジトリを使うコマンドをメインに作成しました。（2022年1月7日時点）
macOS : Monterey
git version : 2.34.1

#ブランチに関するコマンド
|コマンド|オプション|できること|
|:-:|:-:|:-|
|git branch|-|今あるブランチを確認する。|
|git branch ブランチ名|-|ブランチ名のブランチを作成する。|
|-|-d ブランチ名|指定したブランチを削除する（mergeしたは後は必須）。|
|-|-vv|ローカルのブランチとリモート追跡ブランチの対応関係を見る。|
|-|-r|リモート追跡ブランチを表示する。|
|git switch ブランチ名|-|指定したブランチ名のブランチにHEADを移動する（編集するブランチを変更する）。|
|-|-c ブランチ名|指定したブランチを作成し、そのブランチへ移動する。|
|git log|--all|全てのブランチも含めたログを表示する。|
|-|--graph|各ブランチのログの繋がりをグラフ状に表示する。|
|git log 現在のブランチ..比較したいブランチ|-|比較したいブランチのログのコミットメッセージを表示する。|
|git diff 現在のブランチ..比較したいブランチ|-|比較したいブランチのログの中身を表示する。|
|git merge ブランチ名|-|指定したブランチを現在のHEADがあるブランチに統合する(ファストフォワードマージとスリーウェイマージ)。|
|-|--squash ブランチ名|指定したブランチをスカッシュマージする。|
|git rebase ブランチ名|-|指定したブランチにリベースする。|

#リモートリポジトリを使うコマンド
|コマンド|オプション|できること|
|:-:|:-:|:-|
|git clone 自分のリモートリポジトリのURL|-|URLの位置にあるリモートリポジトリをローカルリポジトリにダウンロードする。|
|git branch|-r|リモート追跡ブランチ（リモートリポジトリからクローンした時につくorigin/〜のやつ）を表示する。|
|git remote|-|現在登録されているリモートリポジトリの一覧を表示する。|
|-|-v|fetchやpushをする際のURLまで表示する。いちいちURLを打ち込まなくても、originと打てばこのURLのことを指す。|
|git fetch (origin)||リモートリポジトリのコミットを取得する(originはなくてもデフォルトで設定される)。この後ローカルリポジトリでmergeしてHEADに指定したブランチを統合するか、rebaseして指定したブランチにリベースする(rebaseの方が履歴がすっきりする)。|
|git pull||fetchとmergeを同時に行う。|
|-|--rebase|fetchとrebaseを同時に行う。|
|git push|origin(プッシュ先のリモートリポジトリ名)　プッシュしたいブランチ名|リモートリポジトリにローカルリポジトリの変更をプッシュする|
|-|origin プッシュしたいタグ名|リモートリポジトリにローカルリポジトリのタグをプッシュする|
|-|origin --delete 削除したいタグ名|リモートリポジトリにある指定したタグを削除する（ローカルリポジトリのタグは削除されないので注意）|
|-|-u origin　プッシュしたいブランチ名|リモート追跡ブランチを作りながら、リモートリポジトリにローカルリポジトリの変更をプッシュする|
|git remote prune origin||リモートリポジトリで削除されたブランチを、ローカルリポジトリ上で一度に削除する。|

前回分含めて以下の教材、書籍を参照しました。
１　Git・GitHub入門:GitとGitHubを基礎から完全マスター【2021最新版】【VSCode対応】
　　https://www.udemy.com/course/2021gitgithubvscode/
２　『改訂2版 わかばちゃんと学ぶ Git使い方入門〈GitHub、SourceTree、コマンド操作対応〉』
【DRF】スロットリングでAPIを叩く回数に制限をかける方法

# 目的
APIを叩く回数に制限をかけないとユーザーに想定以上にAPIを叩かれてしまい、DBに大きな負荷がかかる可能性が実際の業務では起き得ると考え、スロットリングを実装してみることとした。

# 実施環境
### ハードウェア環境
| 項目 | 情報 |
|:-:|:-:|
| OS  |macOS Catalina(10.15.7)   |
|ハードウェア   |  MacBook Air (11-inch, Early 2015) |
|プロセッサ   | 1.6 GHz デュアルコアIntel Core i5|
|メモリ   |  4 GB 1600 MHz DDR3 |
|グラフィックス   |  intel HD Graphics 6000 1536 MB |
### ソフトウェア環境
| 項目 | 情報 |
|:-:|:-:|
| homebrew  | 3.3.8 |
| mysql | Ver 8.0.27 for macos10.15 on x86_64 |
| python  | 3.8.12 |
| anaconda  | 4.10.1 |
| django  | 21.2.4 |
| pip  | 3.1.2 |

# 概要
setting.pyでスロットリングの情報をデフォルトのものに上書きをして、APIの呼び出し回数に制限をかけることができる。

自由度が高く、認証済みユーザー/非認証ユーザー別、ページ別などで制限回数を変更することができる。

# 詳細
### プロジェクト内全てのAPIへのスロットリング(Global Throttling)

```setting.py
REST_FRAMEWORK = {
    # throttlingでユーザーによってAPIにアクセスする回数を制限する
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ],
    'DEFAULT_THROTTLE_RATES': {
        # For Unauthenticated users
        'anon': '10/day',
        # For Authenticated users
        'user': '50/day'
    }
}
```

### 

```views.py
from rest_framework.response import Response
from rest_framework.throttling import UserRateThrottle
from rest_framework.views import APIView

# VeryLimitedViewなど他のViewからも参照されるスロットリング用クラス
class TestThrottle(UserRateThrottle):
    rate= '5/day'

class VeryLimitedView(APIView):
    # このView(API)では上記のクラスのスロットリング回数を適用
    throttle_classes = [TestThrottle]

    def get(self, request, format=None):
        content = {
            'status': 'request was permitted'
        }
        return Response(content)
```

### 選択したViewに一括スロットリング設定(ScopedRateThrottles
)

```views.py
class ContactListView(APIView):
    throttle_scope = 'scopeA'
    ...

class ContactDetailView(APIView):
    throttle_scope = 'scopeB'
    ...

class UploadView(APIView):
    throttle_scope = 'scopeB'
```

```setting.py
REST_FRAMEWORK = {
    # throttlingでユーザーによってAPIにアクセスする回数を制限する
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ],
    'DEFAULT_THROTTLE_RATES': {
        # scopeAと設定したviewへのAPI制限回数
        'scopeA': '10/day',
        # scopeBと設定したviewへのAPI制限回数
        'scopeB': '50/day'
    }
}
```


# 参考文献
[How to throttle your API with Django Rest Framework](https://dev.to/juanbenitezdev/how-to-throttle-your-api-with-django-rest-framework-24oo
)
mrubyのターゲット

mrubyのターゲットには以下のようなものがあります。

* 32bit 1チップマイコン
* 2005年前後のルーターなどのSOC(A)
* 2010年前後のルーターなどのSOC(B)
* 携帯ゲーム機
* ガジェット
* ラズパイ
* Android
* PC UNIX(ユーザプロセス)
* PC UNIX(カーネル内)

1チップマイコンのRAMは128Kくらいから大きくても1Mくらいです。STM32やESP32などにmrubyをポートされている方がいます。SOC(A)はRAMは8M程度のターゲットです。当初は8MでもLinuxなどが動いていたようですが、いろいろ大きくなって、このクラスでLinuxを使うのは難しくなっています。SOC(B)は32M程度のRAMを想定しています。これくらいあるとLinuxやFreeBSDがどうにかのりmrubyもその上で動かせます。

build_configディレクトリの下にはゲームボーイなどの携帯ゲーム機でのビルド設定もあります。本体が高額なので、あまり現実的ではない気もします。ディスコンのガジェットの設定もあります。

ラズパイ以降はRAMが512M以上あったりストレージも大きく、rubyも動くので割愛します。

1チップマイコンはarmが主流ですがESP32は独自アーキテクチャですし、いろいろです。

SOC(A)はarmやmipsがありましたが、SOC(B)はもっぱらmipsです。

mruby/cというより小規模なリソースのCPUをターゲットにした実装もあります。

mruby本体では100K-300Kくらいをミニマムターゲットとしているようですが、拡張を入れるとものにもよりますが500Kくらいは必要になると思われます。

私はSOC(A)はmruby on YABMでSOC(B)はZRouter.orgでビルドしたFreeBSDでmrubyを使っています。SOC(A)の蟹さんは当初は8M RAMがターゲットだったのですが、32Mのものとかもあります。

SOC(B)のターゲットはLinuxベースのOpenWRTでもサポートがあります。

1チップマイコンのRAMはチップの中に内蔵されていますが、SOC(A)のRAMは外付けになります。

STM32はSDRAMを外付けできるようですが、複雑になりあまり一般的ではありません。

1チップマイコンはいろいろ新製品が出てますが、RAMが大きくなる方向には進んでいないので、当面SOC(A)との間は埋まらないような気がします。

あと、EthernetやWifi、Bluetoothなどの通信デバイスもほしいところです。

* ブートローダー無しのBearMetal
* ブートローダー有りのBearMetal
* OS有り

1チップマイコンは一番上になり、SOC(A)は2番目で、SOC(B)は3番目になります。

BearMetalの書き込み方法は以下のような方法があります。

* ISP
* JTAG
* U-BOOTなどのブートローダーのオペレーション

SOC(A)やSOC(B)のターゲットはHardOffのジャンクによくあり、数百円で入手できます。ただ本来の使い方ではないので、製品として1000円くらいで入手できるターゲットがあると良いのですが。

ただSOC(A)やSOC(B)はかなり大量に造られていて、当面入手に困る事はないと思われる。
権限が特に限定される開発環境への対処に関する考察


これは過去に~~間違って~~投稿した「トラブルFile.1閲覧も編集も一切権限がない現場で、開発を進める必要に迫られた時の処方箋」のリライト版です。紛らわしくて、経験談にも処方箋にも何にもなっていないのでタグも削除します。
間違ってページを見てしまった方が「うわっ損した時間返せ」とならないものを目指しますので、よろしくお願いします。



下記には一応、昔の記事を残しておきます。

---
備忘録を兼ねた、トラブルファイルです。
世の中は不思議に満ちています。何があっても不思議ではありません。
上記と同じ様な、奇妙キテレツな経験をする方は多いと思います（いねーよ）
そうした方、後に経験する方々の何か役に立つことがあれば、と考えて記録させて頂きます。

ケース
自分より明らかに権限上位者がいて、その方に監視されています。
その上位者の監督者は、上位者に課題達成を要求しつつ、こちらには
システムがありますが作りは非常に簡素で（そもそも素養がない方々が、時間をかけて拵えたものらしい）
制作された方は既に現場に残っていない、典型的なレガシーシステムです。
修正するにあたって、既に誰の責任でもないため「現行のシステムを一切変更しない」「修正を志向したテスト運用」それ自体は、誰にも責任は発生しないのですが、誰もが当時のことを知らず、語りたがらず、そしてここがこうした類型の最大のミステリースポットかつ特徴だと思いますが、問題点がたくさんあることは至極普通には聞かされるのですが、何故か関連する話は一方通行で深堀りや質問は一切出来ません（オイ）
当然にドキュメントは悲惨な状態です。

1 現場で使用（閲覧）可能な時間は、非常に限られている。
2 本来、何の責任も発生しないポジションなのだが、内部は責任が発生しないやり方のみを推奨する体制が徹底しており、時折リアルタイムで全く関係のない第三者が、鋭敏に反応する。
macOS MontereyでLUA4-U3-AGTE(AX88179)を使う

BUFFALO LUA4-U3-AGTEを使っているけれどもmacにつなげてもLinkUpしない
という事象に悩まされドライバを入れてもうまく動かなかったので、改善時のメモ

チップセットメーカーの最新ドライバを導入する

https://www.asix.com.tw/en/support/download

Software & Tools > Drivers > USB Ethernet ICs > AX88179 > Apple macOS 12 Drivers Installer

USB LANアダプタを取り外しておいた状態でインストーラに従ってインストールを行う
再起動後、LAUNCHPADからASIX_USB_Device_Appを起動するよう促されるので、再起動後実行する

アプリ起動直後ボタン二つだけの謎ウィンドウが出るので、Window > Zoomからウィンドウを大きくし、
Activateを押す

セキュリティ拡張機能の質問が出るので、許可して再起動する
【React】クラスコンポーネントと関数コンポーネント

## はじめに
　本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## クラスコンポーネントと関数コンポーネント

### コンポーネントとは

コンポーネントとは、UIの一部となる見た目（View）と機能（Controller）を合わせたものです。
コンポーネントを組み合わせることで一つのページを作ります。

コンポーネント単位とすることで以下の利点があります。

- 再利用することができる
- 再利用することで見た目や機能が統一できる
- 再利用することで変更したい場合に修正する箇所が減り、管理がしやすくなる

　　
このコンポーネントの定義の仕方には以下の2種類があります。

- クラスコンポーネント
- 関数コンポーネント



### クラスコンポーネントの記述方法
クラスコンポーネントは以下のように記述します。

```.js
class App extends React.Component {
  constructor(props) {
    super(props);
  }

  render() {
    return <div>I'm {this.props.name}</div>
  }
}
```

クラスコンポーネントは、以下のような特徴があります。

- React.Componentを継承する。
- constructorでpropを受け取る。
- renderメソッド内でJSXをreturnする。
- ライフサイクルやstateを持つ。

最後の「ライフサイクルやstateを持つ」については、現在はHooksが登場し、後述する関数コンポーネントに記述することができるようになったため、現在はあまりクラスコンポーネントを使わないようです。


### 関数コンポーネントの記述方法
関数コンポーネントは以下のように記述します。

```.js
const App = (props) => {
  return <div>I'm {props.name}</div>
}
```
関数コンポーネントには、以下のような特徴があります。

- 関数内でJSXをreturnする
- 引数でpropsを受け取る
- ライフサイクルやstateを持たない

前述の通り、ライフサイクルやstateについては、Hooksの登場により、関数コンポーネントも持てるようになりました。
そのため、現在では、こちらの関数コンポーネントがメインで使われているようです。

## まとめ

- コンポーネントとは、UIの一部となる見た目（View）と機能（Controller）を合わせたもの
- コンポーネントには、クラスコンポーネントと関数コンポーネントがある
- React Hooksの登場により、現在では関数コンポーネントがメイン
数式の練習②一次ハイパス・フィルタ


　数式の練習です。

#一次ハイパス・フィルタ
|　　　　　　　　　 一次ハイパス・フィルタ　回路図　　　　　　　 |
|:------------:|
|<img width="250" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/a3ec1dc8-941d-eb8c-d7e4-b289edc1d7e8.png">|
|　　**伝達関数**　　　|
|　　　　　$T(s)=\frac{1}{\frac{1}{sT_{C1R1}}+1} = \frac{sT_{C1R1}}{1+sT_{C1R1}}$　　　　|
|　$(  T_{C1R1}は時定数。  s はラプラス変数。  jω はsとする ) $|
|　　　　　**TeX記述**　　　|
|　　　　　``$T(s)=\frac{1}{\frac{1}{sT_{C1R1}}+1} = \frac{sT_{C1R1}}{1+sT_{C1R1}}$``　　　　|


###matlab
　プログラムです。

```matlab
C1=0.001;
R1=1000;
numerator = [1*C1*R1,0];
denominator = [C1*R1,1];
sys = tf(numerator,denominator)
h = bodeplot(sys);
p = getoptions(h);
p.FreqUnits = 'Hz';
setoptions(h,p)
grid on

stepplot(sys);
h = nyquistplot(sys);
```

　実行例です。
![2022-01-05 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/0aaaa377-2d80-c597-78ae-afc9091428a8.png)
![2022-01-05 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/d095f1c2-33df-3621-aef5-2c87d5154504.png)



###LTspice
<img width="550" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/239cedf5-4b6c-9d71-032f-281eda503de2.png">
【Java文法】データ型

こんにちは、コイキングです。

本記事では'データ型'について、説明したいと思います。

****

# １．データ型とは?
変数がどの様なタイプのデータかを示すのがデータタイプと言えます。
Javaでデータ型は大きく　**'プリミティブ型'と'参照型'**　に分けられます。

# 2. プリミティブ型
プリミティブ型は **変数に値の実体が格納される** データ型です。
因みに **'変数に格納される値の実体'をリテラル** と言います。

Javaでプリミティブのデータ型は8つありまして、詳しくは以下の表を参考にしてください。

**※ Javaのプリミティブデータ型**

|データの分類|データ型|メモリー空間|値の表現範囲|解説|
|------|---|---|---|---|---|
|整数|byte|1 byte|-128 ~ 127|整数データを入れられるデータ型、最も多く使われているのはint型|
||short|2 byte|-32,768 ~ 32,767||
||int|4 byte|-2,147,483,648 ~ 2,147,483,647||
||long|8 byte|-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,808||
|浮動小数点数|float|4 byte|1.4E-045 ~ 3.4E+038|浮動小数点数データを入れられるデータ型、最も多く使われているのはdouble型|
||double|8 byte|4.9E-324 ~ 1.8E+308||
|文字|char|2 byte| 0 ~ 65,535のユニコード文字|シングルクォーテーション('')で囲むユニコード文字1個を入れられるデータ型|
|論理|boolean|1 byte|true 又は false|真(true)か偽(false)の値が入れられるデータ型|

**同じデータ類のデータ型が複数存在する理由**
整数データの場合、データ型がbyte, short, int, long4つ存在します。
結論から言いますと、データ型が複数存在する理由はメモリー空間の効率良く使うためです。

例えると整数データを入れるための'変数a'があると仮定してみましょう。
また変数aに代入する値は絶対に127を超えないという条件がある状態で、変数aのデータ型をlongにしたら、変数aが占めるメモリー空間は8 byteになります。

longの代わりに変数aのデータ型をbyteにしたら、変数aが占めるメモリー空間は1 byteになります。longにしたら占めるメモリー空間が8倍も多くなるのですが、今の時代のハードウェアでは変数1個2個ぐらいはあまりメモリ問題にはならないと思います。しかし、変数を数百、数千個を使うのであればメモリーの無駄使いになり、メモリーリークになりがちです。

**各データ型別で変数を宣言して、初期化してみる**

```
// 変数宣言
short short1;
int int1;
long long1;
float float1;
double double1;
char char1;
byte byte1;
boolean boolean1;
        
// データ型別値代入
byte1 = 1;
short1 = 1;
int1 = 2;
long1 = 4L;
float1 = 0.4f;
double1 = 0.4;
char1 = 'a';
boolean1 = true;
```

# 3．参照型
参照型はJavaの1) ライブラリ又は2)プログラマーが直接実装したクラスやインターフェースを変数のデータ型にすることを言います。

参照型がプリミティブ型と違い、変数にリテラルが格納されるのではなく、インスタンスのメモリー住所の値が格納されます。

'new'オペレーターを使い、インスタンスを生成し、インスタンスのメモリー住所の値を参照型の変数に格納できます。

## 1) ライブラリクラス

```
// [クラス名] [変数名] = new [コンストラクター()];
Object object = new Object();
System.out.println(object); // java.lang.Object@{Heapのメモリー住所}
```

## 2) プログラマーが実装したクラス

```
TestDataType tdt = new TestDataType(100, "test");
System.out.println(tdt);  //basic.TestDataType@{Heapのメモリー住所}

class TestDataType{

	int testInt;
	String testStr;
	
	public TestDataType(int testInt, String testStr) {
		this.testInt = testInt;
		this.testStr = testStr;
	}
}
```

**※Stringクラスはプリミティブ型の様に値を直接代入する事ができます。**

```
// StringリテラルはHeapの"String Constant Pool"に入る
String str1 = "string1";

// 'new'オペレーターを使うとHeapにインスタンス生成
String str2 = new String("string2");
``` 

※例示コード
https://github.com/leeyoungseung/algorithmBasic/blob/master/algorithm/src/basic/B_03_DataType.java

※ 韓国語のポストは以下のURLで確認できます。
https://koiking.tistory.com/75?category=1068655
DjangoのMetaクラス

## Metaクラス
モデルクラス内部にいるやつ。
↓これ

```python:
class Book(models.Model):
    class Meta:
        db_table = 'book'
        ordering = ['created_at']

    id = models.UUIDField(...
    title = models.CharField(...
```

「モデルクラス全体に対する付加情報を記述する場所」とのこと。
### db_table
データベースにおけるテーブル名を定義するところ。
これ書かずにマイグレしたら予期せぬテーブル名になったような・・・。
大体いつも書くやつ。
### ordering
そのモデルのオブジェクトを取得する時（例：Book.objects.all()）のデフォルトの並び順を指定するところ。
上記だとcreated_atの昇順で取得される。
['-created_at']のようにハイフンを付けてあげると降順になる。
### abstract
Metaクラスに「abstract = True」と指定したクラスに一般的な情報（created_atとか）を含めてあげて、
そのクラスを継承することで、フィールドを使いまわせて便利とのこと。
（このモデルはデータベーステーブルの作成には使用されない。）

```python:
class Common(models.Model):
    class Meta:
        abstract = True

    id = models.UUIDField(...
    created_at = models.DateTimeField(...
    updated_at = models.DateTimeField(...
    is_deleted = models.BooleanField(...

class Book(Common):
    title = models.CharField(...
```
上記↑だと、Bookモデルはid, created_at, updated_at, is_deleted, titleという5つのフィールドを持つことになる。




#他にも沢山あるようです。
### 参考

[現場で使えるDjango REST Frameworkの教科書](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Django-Framework-%EF%BC%88Django-%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%EF%BC%89-ebook/dp/B07XWL8FPM)
[Model Meta options | Django documentation | Django](https://docs.djangoproject.com/en/4.0/ref/models/options/)
[ElasticCache] RedisとMemcachedの違いとは。

# はじめに
SAAの勉強をしていると避けては通れないElasticCache。
ハンズオン学習にはちょっと敷居が高い……！
それはまあいいんですけど、困ってしまうのは「 RedisとMemcachedのどちらを選択すればいいですか？」系の問題が出題されたときです。

結局RedisとMemcachedってなにが違うんだ！！！
なにが違うんだ！！！（2回目）
という自覚がAWS公式の方にあるのかは知りませんが、解説が提供されています。

https://aws.amazon.com/jp/elasticache/redis-vs-memcached/


公式の記事を読み込めば済む話ではあるのですが、勉強がてらRedisとMemcachedについて纏めてみます。

# ElasticCacheとは

本題の前に、ElasticCacheのおさらいです。

ElasticCacheを一言で言えば、AWSの提供するインメモリデータストアです。
すべてのデータは**メインメモリ（主記憶装置）**にのみ保存および管理されます。
メインメモリに直接保存されるため、データの参照時にディスクにアクセスする必要がありません。補助記憶装置（HDD、SSD）に保存されるEBSやRDSと比べて、高速な書き込み、読み込みが可能です。

最小限の応答時間で済む一方で、インメモリであるがゆえの欠点も存在します。
・障害時にデータが失われてしまう恐れがある。
・トランザクション機能がないため、データに完全性がない。

従って用途も限られます。
公式によれば、ゲームリーダーボード、キャッシュなどに推奨されるようです。ElasticCacheという名称が示す通り、キャッシュに適したサービスということですね。


まとめておくと、

|短長|内容|  
|:---|:--|
|メリット|低レイテンシーかつマイクロ秒単位の読み書きが可能。|
|デメリット|障害時にデータが失われてしまう恐れがある。トランザクション機能がないため、データに完全性がない。|

# Redis vs Memcached 

ElastiCache は、Redis と Memcached どちらかを選択することができます。
ポイントですが、Redis と MemcachedというのはAWS独自に開発されたデータストアではありません。サードパーティーの人気のあるオープンソースを、ElasticCache向きに使用しています。
RDSでmysqlやPostgreSQLを利用するのと似たような感覚ですね。
念のため、本記事はあくまでAWSにおけるRedisとMemcachedについての解説です。

どちらもインメモリなので、RDBMSと比べて高速という点は同様なのですが、それぞれに特徴があります。

以下、それぞれざっくり纏めてみます。

## Redis

"リモートディクショナリサーバー"の略です。
メモリ内key-value型のデータストア（NoSQL）であることが特徴です。

NoSQL × インメモリって、最早速さに関しては向かうところ敵なしでは……？

実際非常に高速なインメモリデータストアで、インターネット規模のリアルタイムアプリケーションを強化することができます。

他にもRedisにはできて、Memcachedにはできない機能が多数あります。

**Redisにできること（Memcachedにはできないこと）**
・データ構造の選択
・スナップショット
・レプリケーション
・クラスタリング構成
・ディスクストレージへのデータの書き出し（バックアップ）
・トランザクション
・Pub/Subメッセージング
・Lua スクリプト
・大規模なリアルタイムの地理空間データを処理するための専用コマンド。
・SSL通信機能による暗号化

MemcachedにもMemcachedにしかできないことがありますよ（震え声）。

高速性と多様性が特徴のRedisは、
ゲーム、eコマース、医療、金融サービス、IoT などの**リアルタイム性**の求められるアプリケーションに適しています。

## Memcached

メモリ上で、キーバリュー型揮発性キャッシュとして動作しています（AWS内部でどうなっているのかは、正直分かりません）。
マルチスレッドであるため複数の処理コアを使用できるのが特徴です。コンピューティング性能のスケールアップにより、多くの操作を処理できることを意味します。

ちなみに、マルチスレッドはRedisには無い機能です。
複数のコアを利用できる分、大きなデータセットに対してはRedisよりも優れたパフォーマンスを発揮できます。

スケーラブルで安全性に優れているのが特徴のMemcachedは、
ウェブ、モバイルアプリケーション、ゲーム、などの、**頻繁にアクセスされる**データをメモリ内に置く必要が場合に適しています。

# まとめ

|名称|ユースケース|  
|:---|:--|
|Redis|バックアップを始め、様々な機能が欲しい場合はこちら|
|Memcached|マルチスレッドが必要な場合はこちら|

どっちがいいのかは、正直分からないです。
調べれば調べるほどRedisとMemcachedの違いに頭は悩まされるはめになりました。
ユースケースによって最適なものは変わるよね、としか。
とはいえ、試験で出た場合は予め用意された答えを当てにいかなければなりません。
試験対策としては、こちらを参考にしてみてください。

https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/mem-ug/SelectEngine.html

# おわりに

悩ましいです。
奥が深いというか見えない話題なので、折りを見て更に調べてみようと思います。


>参考
>[Redis作者自身によるRedisとMemcachedの比較](https://yakst.com/ja/posts/3243)
>[Redisとmemcachedを比較](https://www.ossnews.jp/compare/Redis/memcached)
>[ElastiCacheはMemcachedとRedisのどっちを選ぶ？](https://dev.classmethod.jp/articles/which-choice-redis-memcached/)
WordPress　アーカイブ一覧で投稿されたサムネイルの画像を固定にする手順

新しく作ったカスタム投稿タイプでアーカイブページを作成したときに、
一覧で表示される投稿のサムネイル画像が、画像のサイズによってバラバラで統一感がなかったので、備忘録として残します。

##今回使用する関数
`add_image_size( $name, $width, $height, $crop );`
画像のサイズを登録する関数、引数にそれぞれ任意のname、横幅、縦幅、アスペクトを維持するかの指定をする

`wp_get_attachment_image_src( $attachment_id, $size, $icon );`
画像ファイルのURL、横幅、縦幅を配列として返す

`get_post_thumbnail_id();`
投稿されているサムネイルのidを取得

##手順

1,functions.phpでサムネイルを出力する設定を確認する

```
add_theme_support( 'post-thumbnails' );
```
2,functions.phpに下記を記述

```
if( function_exists('add_image_size')){
	add_image_size('new_size',200,200, true);
}
```
今回はnameをnew_sizeとする。ここは任意の名前でよい。縦横のサイズを200pxで固定
第四引数にtrueを指定し、アスペクトを維持しながら、中央から切り取った画像になる。

3,phpファイルの確認

```
$large_image_url = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID), 'new_size');

<img src="<?php echo $large_image_url[0]; ?>" width="<?php echo $large_image_url[1]; ?>" height="<?php echo $large_image_url[2]; ?>" alt="<?php bloginfo('name'); ?>" />
```

ここは一部を抜粋。


大事なのは
`wp_get_attachment_image_src`の第二引数に`add_image_size`のname（第一引数）を指定することと
imgタグのwidthとheightは配列の第一引数と第二引数を指定すること。

4,既存のサムネイルはリサイズされないので、必要であればプラグインを使って一括修正する

```
Regenerate Thumbnails
```
##参考文献
テンプレートタグ/get post thumbnail id
https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/get_post_thumbnail_id

関数リファレンス/wp get attachment image src
https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wp_get_attachment_image_src

投稿の画像サイズを均一にする＜WordPress＞
https://kaminarimagazine.com/web/2017/11/10/%E6%8A%95%E7%A8%BF%E3%81%AE%E7%94%BB%E5%83%8F%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%92%E5%9D%87%E4%B8%80%E3%81%AB%E3%81%99%E3%82%8B%EF%BC%9Cwordpress%EF%BC%9E/

関数リファレンス/add image size
https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/add_image_size
Xcode ProjectをRenameする方法

![Screen Shot 2022-01-07 at 0.29.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300780/b0530b40-e6dd-fa52-34f1-d24dee9e17cf.png)
# 概要
XcodeをRenameするとき、１箇所を変えるだけでXcodeが全て置き換えてくれるわけではなく、手作業が必要なので、その手順を記す。
__今回は通常のProjectでCocoaPodsやCarthageなどは使用していないProjectになります。(後日追記予定)__

#手順
例としてAppleというProjectがあります。

![Screen Shot 2022-01-06 at 23.56.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300780/26df9d9f-4540-22fc-cddb-99da0d141461.png)

## Step1
変更したいProjectのNavigator AreaにあるProjectのIconを選択してFile Inspectorから名前を変更します

今回はApple -> Strawberryに変更します

![Screen Shot 2022-01-07 at 0.01.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300780/aff2762b-6774-4543-007b-4dd7c6781216.png)

その時にこのような確認画面ができまのでRenameを押します。

![Screen Shot 2022-01-06 at 23.59.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300780/c6167eb3-0833-abcd-4754-5a46b6ab5b69.png)

警告が出ますが、ここもContinueで構いませんが、Backupなどをとっておきたい場合にはcommitしておくことをお勧めします。

![Screen Shot 2022-01-06 at 23.59.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300780/f04264b9-7e70-5300-0067-8da81db58d0e.png)

変更が完了したら、Project上部のSchemeからManage Schemeを選択して名前を変更します。

![Screen Shot 2022-01-07 at 0.11.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300780/71236164-bc1e-900c-e11f-95dbb590c791.png)

## Step2
Projectを閉じて、Xcodeを終了します。
Projectディレクトリにある旧Project名と同じ部分をRenameします。

![Screen Shot 2022-01-07 at 0.17.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300780/d4d248af-812f-fa0c-d57c-ad8d8a4a3ebb.png)

Renameが完了したら再度Projectを開きます

開くと名前を変更したため、このような状態になっていると思います

![Screen Shot 2022-01-07 at 0.21.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300780/02055a5b-3117-f79b-42d4-36d0bb9001dd.png)

開いた後、Renameしたフォルダを選択して、FileInspectorからLocation横にあるとフォルダアイコンのボタンから再度選択すると

![Screen Shot 2022-01-07 at 0.26.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300780/eb8f6fac-b735-b9ea-4c5e-5ad6951b742c.png)

フォルダが存在する状態に戻ります。

![Screen Shot 2022-01-07 at 0.26.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300780/bac40aab-6343-6343-26f3-0e068edcf514.png)

FileInspectorに再び戻り、Nameを新しいStrawberryに変更します。
これを全ての変更したところに適用することで変更が完了します。

![Screen Shot 2022-01-07 at 0.29.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300780/a31aab9f-f5c8-724c-d149-9c1faa45bfd2.png)

## Step2

projectからBuild Settingを選択して、plistで検索します。
出てきたPackagingのinfo.plist FileとProduct Bundle identifierを変更します。

![Screen Shot 2022-01-07 at 0.34.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300780/b56ce098-f352-33af-662e-cb06914108ac.png)

TestsやUITestsを作成している場合には同じように変更します。
ここまでで基本的なProjectだと変更完了になりますが、例えばBridging-Headerなど何か設定している場合には必ず変更が必要になりますので、検索などを使って旧ProjectNameが残っていないかを確認することをおすすめします。
推定、検定で用いる統計量一覧

#主な対象者
母分散が分かっている場合の正規分布による検定や区間推定の問題は何も見なくてもできる、または理解している人。

#概要
検定、区間推定の細かい説明や各種定理の証明はしません。
統計量の公式（？）を忘れた時のための早見表目的のページです。

#注意
筆者は一介の学部生です。不正確な部分があるかもしれません。
定理の証明は全て省略しています。また、後半の章に出てくる式は近似式も含みます。
Markdownで数式を書くことに不慣れなので誤植、見づらい等があるかもしれませんがご容赦ください。
指摘等は大歓迎です。

以下、本編です。

#一つの正規母集団

正規母集団$N(μ,σ^2)$から$n$サンプル抽出。これを$X_1,...,X_n$とする。
####基本的な統計量
$\bar{X}=\frac{1}{n}\sum_{i=1}^{n} X_i$
${S_x}^2=\frac{1}{n-1}\sum_{i=1}^{n} {(\bar{X}-X_i)}^2 $


##母平均の推定

###母分散既知の時
$Z=\frac{\bar{X}-μ}{\sqrt{\frac{σ^2}{n}}}\sim N(0,1)$

###母分散未知の時
$t=\frac{\bar{X}-μ}{\sqrt{\frac{{S_x}^2}{n}}}\sim t(n-1)$

##母分散の推定
$χ^2=\frac{(n-1){S_x}^2}{σ^2}\sim χ^2(n-1)$ 

#二つの正規母集団
正規母集団$N(\mu_1,{\sigma_1}^2)$から$m$サンプル、正規母集団$N(\mu_2,{\sigma_2}^2)$から$n$サンプル抽出。$X_1,...,X_m$、$Y_1,...,Y_n$とする。
####基本的な統計量
${S_x}^2=\frac{1}{m-1}\sum_{i=1}^{m} {(\bar{X}-X_i)}^2 $
${S_y}^2=\frac{1}{n-1}\sum_{i=1}^{n} {(\bar{Y}-Y_i)}^2 $
$S^2=\frac{\sum_{i=1}^{m} {(\bar{X}-X_i)}^2+\sum_{i=1}^{n}{(\bar{Y}-Y_i)}^2}{(m-1)+(n-1)}$

##母分散の比の推定
${F=\frac{\frac{{S_x}^2}{{σ_1}^2}}{\frac{{S_y}^2}{{σ_2}^2}}}\sim F(m-1,n-1)$

##母平均の差の推定
###母分散既知の時
${Z=\frac{(\bar{X}-\bar{Y})-(μ_1-μ_2)}{\sqrt{\frac{{σ_1}^2}{m}+\frac{{σ_2}^2}{n}}}}\sim N(0,1)$

###母分散未知だが等しい時
$t=\frac{(\bar{X}-\bar{Y})-(μ_1-μ_2)}{\sqrt{{(\frac{1}{m}+\frac{1}{n})}{S^2}}}\sim t(m+n-2)$

#ｋ個の正規母集団
$N(\mu_1,\sigma^2)$から$n_1$サンプル、...、$N(\mu_k,\sigma^2)$から$n_k$サンプル抽出。全部で$n$サンプル。
これを$X_{1,1}$,…,$X_{1,n_1}$,…,$X_{k,1}$,…,$X_{k,n_k}$とする。
###基本的な統計量
$\bar{X_i}=\frac{1}{n_i}\sum_{j=1}^{n_i} X_{i,j}$
$\bar{X}=\frac{1}{n}\sum_{i=1}^{k} \sum_{j=1}^{n_i} X_{i,j}$
$S_w=\sum_{i=1}^{k} \sum_{j=1}^{n_i} {(X_{i,j}-\bar{X_i})}^2$
$S_b=\sum_{i=1}^{k} \sum_{j=1}^{n_i} {(\bar{X_i}-\bar{X})}^2$

##母分散が等しい時に母平均が等しいかどうか検定(一元配置分散分析)
$F=\frac{\frac{S_b}{(k-1)}}{\frac{S_w}{(n-k)}}\sim F(k-1,n-k)$
####棄却域
$F_{α}(k-1,n-k)\leq{F}$


#二項母集団（母比率の推定）
各要素が$A$に属する、または属さない。
$P(X\in{A})=p,P(X\notin{A})=1-p$
抽出した$n$サンプルのうち$r$サンプルが$A$に属する。
###基本的な統計量
$\bar{p}=\frac{r}{n}$
###母比率の推定
$Z=\frac{\bar{p}-p}{\sqrt{\frac{p(1-p)}{n}}}\sim N(0,1)$
####注意
半整数補正が必要な場合がある。

#ｋ項母集団（適合度の検定）
各要素が$A_1$から$A_k$のいずれかに属する。
$P(X\in{A_1})=p_1,...,P(X\in{A_k})=p_k$
抽出した$n$サンプルのうち$A_i$に属するものが$X_i$個。$(1\leq{i}\leq{k})$
###適合度の検定
$χ^2=\sum_{i=1}^{k} \frac{{(X_i-np_i)}^2}{np_i}\sim χ^2(k-1)$
####棄却域
$χ^2_{α}(k-1)\leqχ^2$

#ｋ項×ｌ項母集団（独立性の検定）
各要素が$A_1$から$A_k$のいずれかに、また$B_1$から$B_l$のいずれかに属する。
（例：すべての生徒はA組からD組のいずれかに、また１年から３年のいずれかに属する。）
抽出した$n$サンプルのうち$A_i$に属しかつ$B_j$に属するものが$X_{i,j}$個。$(1\leq{i}\leq{k},1\leq{j}\leq{l})$
###基本的な統計量
$X_i=\sum_{j=1}^{l} X_{i,j}$
$Y_i=\sum_{i=1}^{k} X_{i,j}$
###独立性の検定
$χ^2=\sum_{i=1}^{k} {\sum_{j=1}^{l} \frac{{(X_{i,j}-\frac{{X_i}{Y_j}}{n})}^2}{\frac{{X_i}{Y_j}}{n}}}\sim χ^2((k-1)(l-1))$
####棄却域
$χ^2_{α}(k-1)(l-1)\leqχ^2$