OmniAICreator/Qiita-1.07M huggingface dataset:
APIについて個人的にまとめてみる。

注意書き：間違ってたら指摘してください。
# 考えてみる。
### 「ソフトウェアの一部を公開して、他のソフトウェアと機能を共有できるようにしたもの」([参照](https://www.sejuku.net/blog/7087))
　API(Application Programming Interface)とは実物なのか？それとも実体のない概念的なものなのか？どっちなのだろう。上の文章自体は理解できるけど、まだ人に説明するほどに理解はできていない。という風に書きながら少しわかったけど、MinecraftでいうMODというものに近いのでは。便利だからみんな使ってねというものなのかもしれない。すごい、めっちゃ理解できてる気だけはしている。
　参照しているページを読み進めたけど、違うかも。いや、あってるけど強みがまた別なように思った。例として書かれていたログイン機能がすごくわかりやすい。アカウントを必要とするサービスで、毎回のようにアカウントを作らされたらユーザーも大変だということと理解しました。あってるかな。よくホットペッパーとかのアクセスでGoogleMapが使われてるけどこれがapiなのか。感動。
# まとめ
APIとは、製作者とユーザーがどちらも得をするシステムの中にあって、なにか一つ特定のものとしての名前ではない、大きく括ったサービス名のようなものである。どういったシステムかというと、誰かが作ったサービスをほかの人も使っていいよとしてあげる優しいシステム。例えば、アカウント登録でいうGoogleだったりTwitterだったりは、わかりやすいかもしれない。加えるならQiitaでいう登録時のGithubとか。ほかにも埋め込みのGoogleMapだったりもAPIだと言える。
【随時更新】良く知らない用語をまとめてみる。

## MTG
ミーティングの略
## コーポレートサイト
その企業のホームページ的なやつ
## リポジトリ
保管場所っていう意味で、プロジェクト、バージョン、ファイル管理とかとか
## メタデータ
ある情報やデータについて、それが何であるかを記述したもの。メタ発言のメタと同じ
## ワイルドカード
なんでもいいよ、なにか入るかもしれないし入らないかもしれないよ。というもの
例えば*(任意の長さの文字列)を使えば、コーポレート*(コーポレートなんたらかんたら)や、*サイト(なんたらかんたらサイト)を検索したいときに良い？
## アジャイル開発
細かい機能単位で「計画→設計→実装→テスト」のサイクルを繰り返す開発手法
## IoT (Internet of Things)
家電とか工場の機械とか、すべてのものをインターネットにつなげること
## オウンドメディア
自社で運用するブログとかメディア。
## インフラ
ハードウェアとかソフトウェアとか。インフラが整備されてるからアプリとかが作れて利用できるんだよというやつ。
## API (Application Programming Interface)
https://qiita.com/Ryooosk_2143/items/882a69c3813221334789
## パス
ファイルとかフォルダの場所のこと
## フレームワーク
システムを開発するために必要な機能が既に用意されている枠組みのこと
JavascriptからActionTextに値を設定/取得する方法

# 概要
モーダルで入力させてその内容を書き戻すことをしたくて、jsを使用して値の設定/取得をおこなったのでその備忘録です。

# コード
jsでActionTextに初期値を設定する
`$('trix-editor').val(rich_text.body);`


jsでActionTextから入力値を取得する
`    $modal_fields.find('trix-editor').text()`
タグ含めて取得できないので↓の方が良い(contentはActionTextで表示するフィールド名）
`    $modal_fields.find('input[name="content"]').val()`
EC2 に tomcat を構築する方法

# はじめに
私は実務未経験の駆け出しインフラエンジニアです。
EC2 に Tomcat を構築することがあったので備忘録としてまとめます。

# 目次
[1.はじめに](#-はじめに)
[2.セキュリティグループの設定](#-セキュリティグループの設定)
[3.EC2インスタンスにtomcatインストール](#-EC2インスタンスに-tomcat-インストール)
[4.参考](#-参考)


# セキュリティグループの設定
下記のようにセキュリティグループ設定のインバウンドルールにカスタム TCP で 8080 のポートを追加します。
※追加し忘れると Tomcat のトップ画面(猫さん画面)が表示されません。

![スクリーンショット 2022-05-12 17.35.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156198/7984bc65-901a-caca-4b39-47816bdde04f.png)

# EC2 インスタンスに tomcat インストール
EC2インスタンスに yum コマンドでインストールします。

Tomcatのインストール方法は複数ありますが今回はyumコマンドを使用した簡単な方法で実施します。

手順は下記の順番です。
1. Java 8 開発環境をインストール
2. Tomcat インストール
3. Tomcat の起動 

Tomcat は WEB で Java を動かすための仕組みなので、前提として Java をインストールしておく必要があります。
インストールした Java のバージョンを表示し、確認します。

```terminal
sudo yum install java-1.8.0-openjdk-devel
java -version
```
 
java のインストールが完了したら、Tomcat をインストールします。
インストールした Tomcat のバージョンを表示し、確認します。

```terminal
sudo yum install tomcat
sudo yum install tomcat-webapps tomcat-admin-webapps
tomcat version
```

Tomcat のインストールが完了したら、Tomcat を起動します。
起動後、ステータスを確認します。
Tomcat が active になっていれば OK。

```terminal
sudo systemctl start tomcat
systemctl status tomcat
```

起動確認後、
AWS 管理コンソールでパブリック IPv4 アドレス を確認して「パブリック IPv4 アドレス:8080」でブラウザからアクセスすると、無事Tomcatの猫さん画面が表示されました。

![スクリーンショット 2022-05-17 9.14.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156198/d390490d-67c0-a0b1-ccf7-3477340a6ef3.png)


# 参考

https://it-mikeiken.com/ec2instance-tomcat-install
Android studio error launching をバッサリ見限る

### Android studioを使っていると、更新がたまにきます。
で、更新して起動すると、
![mpF5q.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1132630/ae55ae00-bf74-6ec5-3072-cbe13cf51c53.jpeg)
とよく出ます。
Android studio error launching
could not find main class com/intellij/idea/main
#### 先に言いますが、根本的な解決方法がよく分かりません。
調べると、
* program filesにAndroidstudioが2つ以上あるときは、最新以外のを消せ！
* 最新のJDKバージョン（C：\ Program Files \ Java \ jdk1.8...）を指すようにJAVA_HOMEを設定し直せ！
* ユーザーフォルダ内の…
* 全削除！再インストール！！

と多々でてきますが、どれもうまくいかない時があります。

### そもそもの原因は？
どうやら、日本語化している状態で更新するとなるようです。しかも、必ずではない！
そして、アンインストール→再インストールしてもエラーが出る！ことがある…。
「Android」でフォルダ検索すると沢山出てくる…　これ全部削除？？

### 私は諦めた！
初期化して最初からやりたい！
### そんなあなたに！
#### C:\Users\<ユーザー名>\AppData\Local\Google\AndroidStudio2021.
を削除すると、再インストールせずに初期設定から始まります！

安定した環境構築って、難しい…
#### というか、いろんなところにフォルダ作りすぎ！！！
PHPDocによる型情報の補足

## PHPDocとは？
PHPDocとはコードに詳細な情報を記述することができる、特別な種類のコメント文です。

これを書くことで下記のメリットがあります。

- 型チェックされる。（予期しない値が渡されないか確認できる）
- IDEで補完が効きやすくなる。
- 静的解析がより正確に実行できる。（PHPStan 等）

## タグの説明
- **propaty**
各クラスでModelクラスや別クラスを呼びだしている場合に必要。
また、定義しないと未定義のプロパティとなり、アクセスできない。

- **param、return**
引数、戻り値の情報を記載するためのタグ。

- **var**
変数、オブジェクトのプロパティの情報を記述する。

- **method**
クラスのメソッドに関する情報を補足する。
マジックメソッドなどアクセス不可なものを保管する。
（例）findBy、findAllBy等


## 開発環境
- PHP 7.4.12
- CakePHP 4.2.5

## サンプルコード
```php:MainController.php
/**
 * ○○デフォルトページ用のコントローラーのファイル
 *
 * @property \App\Model\Table\ArticlesTable $Articles
 */
class MainController extends AppController
{
	/**
	 * メインページ
	 *
	 * @return void
	 */
	public function index(): void
	{
		$this->loadModel('Articles');

		$date = $this->Articles->findDate(id: 1, inputDate: new FrozenDate());
	}
    /**
     * サンプル
     *
     * @return void
     */
    public function sample(): void
    {
        try {
            /** @var string|false $foo */
            $foo = json_encode([1, 2]);
            if ($foo === false) {
                throw new Exception('Exception発生');
            }
            /** @var string $foo */
            $this->test($foo);
        } catch (Exception $e) {
            echo $e->getMessage();
        }
    }
}
```
```php:ArticlesTable.php
/**
 * @method \Cake\ORM\Query findById(int $id)
 * @method \Cake\ORM\Query findAllById(int $id)
 */
class ArticlesTable extends AppTable
{
	/**
	 * イニシャライズ
	 *
	 * @param array $config コンフィグ
	 * @return void
	 */
	public function initialize(array $config): void
	{
		parent::initialize($config);

		$this->setTable('articles');
		$this->setEntityClass('App\Model\Entity\Article');
		$this->setPrimaryKey('id');
	}

	/**
	 * データを取得
	 *
	 * @param int $id Id
	 * @param \Cake\I18n\FrozenDate $inputDate 日付
	 * @return \App\Model\Entity\Article|null データ
	 */
	public function findDate(int $id, FrozenDate $inputDate): ?Article
	{
		return $this->find()
			->where([
				"{$this->getAlias()}.id" => $id,
				"{$this->getAlias()}.input_date" => $inputDate,
			])
			->first();
	}
}

```
## VSCodeでは、このように関数が表示される
![スクリーンショット 2022-05-16 164533.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496693/f94cc768-0eca-2d7f-2ee8-fe647b0f6434.png)
![スクリーンショット 2022-05-17 085256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496693/99b63708-c90f-7ec1-526a-b7908543e2b1.png)
## 最後に
型の指定を明確にすると、可読性が各段と上がるため、
開発の際は、ぜひ活用してみてください。
【JavaScript】クリップボードコピー(navigator.clipboard.writeText)が使えないときの対応方法

端末&ブラウザによって、クリップボードコピー(navigator.clipboard.writeText)が使えなかったので、
使えないときの対応を行いました。そのメモを残しておきます。誰かの助けになれば幸いです。

# 対応方針① window.clipboardData.setData

以下の記事を読むと
- [JavaScript: document.execCommand("copy") の代替](https://qiita.com/e99h2121/items/4166deba79e1bb8e77dd)

navigator.clipboardが使えないときは、window.clipboardData.setData('Text', ~~) で代替できると書いてありました。

しかし、window.clipboardDataのclipboardDataが色々とやってみても使えなかったため、断念しました。
(※ 何かwindowオブジェクトの設定がミスってるのかも)

```
var clipboardText = "clipboard";
if(navigator.clipboard == undefined) {
  window.clipboardData.setData('Text', clipboardText);
} else {
  navigator.clipboard.writeText(clipboardText);
}
```


# 対応方針② document.execCommand

以下の記事を読んで

- [Android端末でLIFF内のクリップボードコピー(navigator.clipboard.writeText)に失敗する](https://www.line-community.me/ja/question/61bc50b869e9a56508e56c4e) 
- https://gist.github.com/wilsonpage/6f15d9b173584195eaa5dee42215bd81

document.execCommandを使ったところうまくいきました。

ただ、「document.execCommand」は非推奨なので、あまり使いたくなかったですが、今後、navigator.clipboardがすべてのブラウザ&端末で使えるようになると思うので(たぶん)、一旦のように書けます

```
export const copyTextToClipboard = (text: string): void => {
  if (navigator.clipboard) return  navigator.clipboard.writeText(text);

  const isIos = navigator.userAgent.match(/ipad|iphone/i);
  const textarea = document.createElement('textarea');
  textarea.value = text;
  document.body.appendChild(textarea);
  if (isIos) {
    const range = document.createRange();
    range.selectNodeContents(textarea);
    const selection = window.getSelection();
    selection?.removeAllRanges();
    selection?.addRange(range);
    textarea.setSelectionRange(0, 999999);
  } else {
    textarea.select();
  }
  const result = document.execCommand('copy');
  document.body.removeChild(textarea);
};
```

「navigator.clipboard」が使えるときは使って、使えないときは、「document.execCommand」を使うようにしました。

# 最後に一言

何か間違っている点があれば、教えて頂けたら幸いです。
よろしくお願い致します。
また「いいね！」してもらえるとすごい嬉しいです！！
Django - Hello Worldまで

## 環境
Mac M1
python 3.8

## インストール

```
pip install django
```

##　プロジェクト作成
必要ファイルが生成されるので、プロジェクトを入れたいディレクトリで以下コマンドを実行

```
django-admin startproject プロジェクト名
```

## runserver

```
python manage.py runserver
```
ローカルのアドレスが表示されるのでアクセス
以下の画面が表示できればOK
![スクリーンショット 2022-05-17 8.28.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482906/804748d6-439d-523d-5fc1-cad89ceb907d.png)


開発用サーバーを停める場合は、【 control + c 】で停止

## setting.pyの変更
### 107行目くらいをjaに変更

```diff_python
- LANGUAGE_CODE = 'en-us'
+ LANGUAGE_CODE = 'ja'
```

### 109行目くらいをAsia/Tokyoに変更

```diff_python
- TIME_ZONE = 'UTC'
+ TIME_ZONE = 'Asia/Tokyo'
```

## アプリ関係のフォルダ作成

manage.pyがあるディレクトリで
```
python manage.py startapp アプリ名
# python manage.py startapp app
```

アプリ名(app)のフォルダが生成されればOK

## 作成したアプリの登録

```diff_python
INSTALLED_APPS = [
+   'app.apps.AppConfig'
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]


```
保存すると以下Classが生成

```app/app.py
class AppConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'app'

```

## pathの設定
```diff_python
from django.contrib import admin
- from django.urls import path
+ from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
　　　　　　　　# appにあるurlsファイルを参照
+   path('app/', include('app.urls'))
]
```

## 作成したアプリ内にurls.pyを作成
```
# 中身
rom django.urls import path
from . import views

app_name = 'app'

urlpatterns = [
    path('',views.index, name='index'),
]
```

## view.pyに追加で記述
```
from django.http import HttpResponse

def index(request):
    return HttpResponse('Hello World')
```

## サーバー起動して確認
http://127.0.0.1:8000/app

Hello Worldが表示されればOK

続きは[こちら](https://qiita.com/__chicken__/items/fcc9a2aa3dd108f72289)
100日後くらいに個人開発するぞ！day028

## 今日もHTML＆CSS中級編を復習してみた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/fc77a9cb-eecd-9795-b45b-639ad87e97d7.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/967558c2-c93f-9f62-3778-264963e6644c.png)


## 今日の備忘録


### 要素を固定する方法
- `position: fixed;`を用いると常に要素を画面上の指定した位置に固定できる
    - 固定する位置はtop・left・right・bottomを使って指定する
    - 例：imgを左上から10px下で20px右の位置に固定したい場合
        - `img{`
            - `position:fixed;`
            - `top:10px;`
            - `left:20px;`

### 要素の重なり順を指定する方法
- z-indexプロパティで要素の重なりの順序を指定できる
- 整数値で指定して値が大きいほど上に表示される
    - 例：`<header>`の重なり順を10に指定する場合
        - `header{z-index:10}`
- z-indexプロパティは必ずpositionプロパティと併用する必要がある
データサイエンスで便利なやつ（随時更新）

# Pandas.DataFrame.isin()
条件に合致するデータを探すときに重宝。
①文字列があるかの確認(Trueか否か)。
![20220517-074840.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001770/23726fef-1b1e-5a1a-17d8-3c4b3dc301f3.jpeg)

②複数条件で、データの抽出
![20220517-074640.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001770/d1287070-a2bf-920e-cd88-1a657bb0d49b.jpeg)

# pandas.DataFrame.groupby()
これを使うことで、特定の列を軸とした集計が可能になる。ここでは、性別とidを軸として集計。![20220517-075438.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001770/531487e6-f3f9-1477-ac45-273d4d80e9d3.jpeg)



参考文献
　東京大学のデータサイエンティスト育成講座(著者：塚本 邦尊, 山田 典一, 大澤 文孝, 中山 浩太郎, 松尾 豊)
Ubuntu 20.04とCloudflareでDKIMを設定する


前提：CloudflareでDNSを管理しているサーバがUbuntu 20.04で、デフォルト設定のpostfixにより送信しています。

### OpenDKIMの設定

OpenDKIMの設定は https://www.lonnie.co.jp/linux/jessie-dkim-dmarc/ を参考にさせていただきましたが、こちらは1つのサーバで複数のドメインを扱っていないのでもっと簡単でした。

まずopendkimをインストールします。

~~~~
sudo apt update
sudo apt install -y opendkim opendkim-tools
~~~~

ここからはsudoでやるとめんどいので「sudo su -」でrootになって作業します。
ドメイン名は架空の foobar.net にします。

~~~~
mkdir -p /etc/mail/keys
cd /etc/mail/keys
opendkim-genkey -b 2048 -s 20220517fb -d foobar.net
chown -R opendkim:opendkim ../keys
chmod 700 ../keys
chmod 600 *
~~~~

これで /etc/mail/keys に 20220517fb.private と 20220517fb.txt ができます。
次に /etc/opendkim.conf を編集しますが、変更するのは以下の3行だけです。

~~~~
Domain                  foobar.net
KeyFile                 /etc/mail/keys/20220517fb.private
Selector                20220517fb
~~~~

/etc/default/opendkim は以下のようにRUNDIRを変更し、SOCKET=行はすべてコメントアウトしておきます。参考にしたところでは opendkim.sock を使っているのですが、それではエラーになってしまったので。

~~~~
RUNDIR=/var/spool/postfix/run/opendkim
#RUNDIR=/run/opendkim
~~~~

### postfixの設定

/etc/postfix/main.cf の最後に以下を加えます。

~~~~
 Milter configuration
# OpenDKIM
milter_default_action           = accept
milter_protocol                 = 6
smtpd_milters                   = inet:127.0.0.1:8892
non_smtpd_milters               = inet:127.0.0.1:8892
~~~~

postfixとopendkimをリスタートしておきます(reloadでいいかも)。

~~~~
sudo systemctl restart postfix opendkim
~~~~

### CloudflareのDNSでDKIMを設定する

ここが他で調べても一番わからなかったところ。/etc/mail/keys/20220517fb.txt の内容は以下のようになっています。もちろん数字はこんなに連続してません。適当な値を入れてます。

~~~~
20220517fb._domainkey  IN      TXT     ( "v=DKIM1; h=sha256; k=rsa; "
          "p=00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"
          "222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222223" )  ; ----- DKIM key 20220517fb for foobar.net
~~~~

これをCloudflareのDNSのTXTレコードに入れるわけですが、「Add record」して、以下のように20220517fb.txtの内容からダブルクォートを取り除いた文字列を入れます。
![Screenshot_20220517_072253.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114661/4257a796-788f-c4b6-6458-9950d90acf89.png)
最初はよくわからないので 「( "v=DKIM1;」から括弧もダブルクォートも全部含めて入れてたので失敗してました。

### DNSのDKIM設定を確かめる

https://dmarcly.com/tools/dkim-record-checker# に行って、以下のようのドメイン名とセレクターを入れて「Check DKIM Record」をクリックします。

![Screenshot_20220517_073233.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114661/4f92f6fd-81dc-3bd3-69da-f219f7f52a5f.png)


「Success! Everything appears fine with your DKIM record.」と出ればうまく設定されています。

### メールを送ってみる
いつものように
~~~~
echo hello|mail -s "DKIM test" foo.bar@gmail.com
~~~~
などとしてテストメッセージを送ってみます。
送られたほうでそのメッセージのソースを見て
~~~~
Authentication-Results: mx.google.com;
       dkim=pass header.i=@foobar.net header.s=20220517fb ...
~~~~

などとなっていれば成功です。

以上
PostgreSQLで配列の値がNULLもしくは空の場合はtrueとなる関数を作る

# はじめに
PostgreSQLでは配列の長さを返す関数は空配列の場合NULLを返します。
```sql
SELECT array_length('{}'::TEXT[], 1) IS NULL;
 ?column? 
----------
 t
(1 row)
```
空配列をチェックする場合は以下のようになりますが、意味がわかりにくいです。
```sql
IF p_array IS NULL OR array_length(p_array, 1) IS NULL THEN
```
そこで関数を作成しました。

# プログラム

```sql
-- 配列が空かどうかチェックする
-- 引数
--   p_array : 配列
-- 戻り値
--   配列が空の時true
CREATE OR REPLACE FUNCTION is_array_empty(
  p_array anyarray
) RETURNS BOOLEAN AS $$
DECLARE
BEGIN
  RETURN p_array IS NULL OR ARRAY_LENGTH(p_array, 1) IS NULL;
END;
$$ LANGUAGE plpgsql;

```

使ってみると一目瞭然です。
```sql
IF is_array_empty(p_array) THEN
```
新人エンジニアによるNWインフラメモ①


# はじめ
本記事について、IT業界のインフラを支えるNW業界でよく使用される用語を記載しています。
基本的には自身のメモに代わりに投稿しようと考えたことから、本投稿に至ります。


## :point_up_tone3:インフラ業界のNWの位置づけ
現代でNWはとても重要であり、必要不可欠かつ、切っても切れない関係である。また、生活や仕事で欠かせない要素の必つだといえる。例えば人とコミニケションを取る手段の一つであり、モノを動かしたりすることもできる。NWを使用することで、或いは経由することで様々な用途が使用。記者はNWの監視を業務として行っているが、NWが使用できなくなれば、様々な人が困ることになる。最近では某大手通信キャリアが大規模障害が発生し、全国の人に影響が出たといわれている（何千万人らしい......）<br>
以上を踏まえ、様々な物事から結びついていることから、NWは重要な要素言えるだろ


## :bulb:用語:bulb:
下記の用語は、これまで常駐していたところで、学んだ用語です。

- ***OTDR（Optical Time Domain Reflectometer＝<font color="#cf0025;">光パルス試験機</font>）***
光通信NW内で<font color="#cf0025;">光の測定を行う機器</font>のこと。この機器を使用し光信号の伝送や距離測定や検出を行い、NW内でどの部分で光信号断があったかを確認する。<br>

- ***抜栓***
ケーブルを抜くこと。

- ***芯線***
ケーブルや電線などの線の<font color="#cf0025;">中心部分</font>のことを指す。


- ***波長貸し***
光ケーブルを貸し出すためのサービスを提供する形態の一つ。
<font color="#cf0025;">WDM</font>（光波長多重通信）を多重化した波長を、一部<font color="#cf0025;">貸し出す</font>ことを指す。

- ***PT盤***
光ファイバーを通信業者の最寄りの局から使用者建物へ回線を引き込み、集約されている装置を指す。


- ***PD盤***
PT盤をさらに使用者建物の中で分散させるための装置を指す。

- ***ダークファイバー***
電気通信事業者が所有する<font color="#cf0025;">未使用</font>の光回線のこと。基本的には、回線だけが敷かれており、光通信及び光信号が通っているにもかかわらず使用していない回線。


- ***ライトファイバー***
電気通信事業者が所有する使用の<font color="#cf0025;">光回線</font>のこと。基本的には、回線が敷かれており、光通信及び光信号が通っていいて契約や予備回線などで使用されている回線。

- ***光回線終端装置***
電気通信事業者から回線を引っ張って、<font color="#cf0025;">光信号断</font>から<font color="#cf0025;">デジタル信号</font>へ変換する機器及び装置のことを指す。


- ***モデム***
電気通信事業者から回線を引っ張って、<font color="#cf0025;">アナログ信号（回線）</font>から<font color="#cf0025;">デジタル信号</font>へ変換する機器及び装置のことを指す。

- ***CE-RT***（Customer Edge router ）
NWに接続する顧客側の入り口となるルータのことを指す。
【通信事業者側RT】------------【<font color="#cf0025;">顧客RT側</font>】

- ***PE-RT***（Provider Edge router）
NW側に接続する顧客側の入り口となるルータのことを指す。
【<font color="#cf0025;">通信事業者RT側</font>】------------【顧客RT側】

- ***光回線（インターネット回線）***
光信号による通信回線。安定して早いが高価


- ***ADSL回線インターネット回線）***
アナログ信号をによる通信回線。ノイズなどの影響があるが不安定になることがあるが、安価。


- ***CATV回線（インターネット回線）***
テレビケーブル（有線）を使用した回線　最近は安定していて、安価。
  etc.....（ほかにも用語があるが、ここでの紹介はこれまで）
<br>

:::note
- ***NW***は現代おいて、必要不可欠な要素である。
- NW業界では***専門用語***が多数あり、覚えるのが大変
- ***ネット***で調べても出てこないとこが多い
:::

今後も、いろいろな用語をメモしていこうと思っているので、近々第二弾のメモを投稿しようと思います。（自分のメモとして）
FreeBSDでAndroid USBデザリング

FreeBSD/i386 12.3RでAndoridをUSBにつないでUSBデザリングモードにするとカーネルモジュールがロードされue0が生えてきます。

dhclientをue0で上げるとプライベートが降ってきました。なぜかクラスCのプライベートアドレスなのに対向のアドレスの一番下が1ではなく129でした。

dhclientはデフォルトルートを設定できますが、設定済みの場合は設定しません。このためdhclientを起動する前にデフォルトルートを削除しておくと良いです。

後は/etc/resolv.confを設定すればインターネットに接続できます。

インターネット接続がない状態でのインターネット接続は結構大変です。

とりあえずこれはWin10で書きました。
何いっ！PyCharmのリファクタリングで楽にソースの修正ができるやとっ！

# はじめに
次の記事を読んで「会話調！ええやんけ！」と思い、試験的に無職やめ太郎(@Yametaro)氏の構文（関西弁による会話調）を真似しています。
筆者はエセ関西人なので関西弁チョットデキル。

まぁいわゆる「やってみた」記事っちゅうやつですな！
ガッファファ・・・！

https://qiita.com/Yametaro/items/21b8772e6c0d1d77e176



# 実行環境
- macOS Big Sur バージョン 11.6.4
- PyCharm 2022.1(Community Edition)
    - JetBrains日本語化パックを利用して日本語表記にしてるで！
    - 自分みたいに英語を見たらじんましんが出る人におすすめやで！

本文中に出てくるソースは以下リポジトリのソースやで！

https://github.com/Yumihiki/weather_report


https://pleiades.io/pages/pleiades_jetbrains_manual.html

# ストーリー
ある日のワイ
「あ〜、このメソッド名微妙やなってissue立ててたん忘れてた！」
![スクリーンショット 2022-05-15 21.01.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277999/530a65d1-182a-95e5-8cf4-753705dea423.png)

``` Python
from main import main
```
「他のモジュールで呼び出すと上のようになってんねんけど、他のモジュールで見たらmainって何やねんって思うねんな・・・」


「いつもの様に手でポチポチ変更するか・・・」
「でも手動でやるのはだるすぎ太郎や」
「この前100箇所で呼ばれている関数名を変更したけどGrep地獄&修正漏れまくり太郎やったわ・・・」
「エンジニアたるもの楽できひんか調べようやないか・・・！」

**（100分後）**
「いや〜、ヤンジャンで連載中の**君のことが大大大大大好きな100人の彼女**は面白いな！」
「100言うてたらついつい読んでしまった！」
「アカンアカン、こんなんしてたらマネージャーに叱られるわ！」

**（100分後）**
「お、この[コードのリファクタリング](https://pleiades.io/help/pycharm/refactoring-source-code.html)って機能便利そうやな！」
「いっちょやっ太郎やないかい！」

「直したいところで右クリックしてみよか、知らんけど」
「今回なら次のmainのところやな」
``` Python
def main(is_local_debug=True) 
```
「リファクタリング にカーソルを合わせて...」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277999/912333a3-f5cf-e2c6-5b26-f714ede1de58.png)
「名前の変更 をクリックと...」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277999/6576a14a-8f44-2ac3-99a3-a0e68f74481f.png)
「新しいウィンドウが出てきた！」
「こいつに100カノ... じゃなくて新しい関数名を定義してやる、っと」
「天気情報を教えてくれるし、weather_reportとしておこうか」
![スクリーンショット 2022-05-15 21.04.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277999/ddd97af5-25ca-0320-d285-ed0b1586eb3b.png)
「これでリファクタリングをクリック...と」
![スクリーンショット 2022-05-15 21.05.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277999/66a15a23-0180-f5e7-b97b-0950baaf6d32.png)
「おお！下の画面にリファクタリングプレビューって出てきた！」
「呼び出しているところをこうやってプレビューしてくれるんやな！」
「リファクタリング実行 をポチッとな・・・！」

![スクリーンショット 2022-05-15 21.05.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277999/86de605f-d61f-55e2-586b-dd0a4eef7252.png)

「おお！変わったで！」
「自動でimport文のところも変えてくれてるやないか！」
「これなら100箇所呼ばれていてもバッチリ対応できそうやないか！」
「何？ファイル名や変数名でも同じ様なことができるやと？」
「怖いもんなしや！100人の彼女でも100人乗れる物置でもどんと来い！やで！」
![スクリーンショット 2022-05-15 21.05.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277999/3e41f2d6-10a2-ff11-a2ab-8071f590f637.png)

# まとめ
- PyCharmによるリファクタリングは便利
    - （JetBrains製品のIDEは同等の機能があるはず）
    - 変数名を一括で変更したいケースや関数名の修正など、手作業でいちいちしなくて済む
- 会話調の記事は書きやすい
指定フォルダ配下の指定ファイルを再帰的に取得し置換する

## 概要
Python初心者です。
指定フォルダ配下の指定ファイルを再帰的に取得し置換します。

```
import glob

CURL_FILE_NAME = "input.txt"
TARGET = ".\\test\\**\\" + CURL_FILE_NAME

TARGET_STR = "XXX "
REPLACE_STR = "XXX -i "

# 指定フォルダ配下の指定ファイルを再帰的に取得
for f in glob.glob(TARGET, recursive=True) :
    print(f)

    with open(f, 'r', encoding="utf-8") as r:
        data = r.read()
        # 置換
        new_data = data.replace(TARGET_STR, REPLACE_STR)

    # ファイル更新
    with open(f, 'w', encoding="utf-8") as w:
        w.write(new_data)

```
2022/5/17主にITとかセキュリティの記事

SonicWallのVPN製品に複数の脆弱性 - アップデートが公開
https://www.security-next.com/136502

米政府、「CVE-2022-26925」を緊急対応リストから一時削除 - DCへの影響で
https://www.security-next.com/136499

「Apache Tomcat」に脆弱性 - 2月までの更新で修正済み
https://www.security-next.com/136505

ランサムウェア攻撃の身代金の算出方法とは？　リークされた内部情報から明らかに(5/13)
https://kn.itmedia.co.jp/kn/spv/2205/13/news086.html

巧妙なバックドア「Saitama」を発見、ヨルダン政府組織を攻撃(5/15)
https://news.mynavi.jp/techplus/article/20220515-2345168/

Windows 11向け累積更新プログラム「KB5013943」に認証できなくなる不具合(5/15)
https://news.mynavi.jp/techplus/article/20220515-2345201/

進化するデータセンターで新たな役割担う注目9職種とは（下）(5/13)
https://project.nikkeibp.co.jp/idg/atcl/19/00290/042200003/

スティーブ・ジョブズが「世界一普及した動画フォーマット」を葬った裏事情(5/15)
https://www.appbank.net/2022/05/15/technology/2234102.php

【第8回】Operational Excellence 実行の勘どころ マスターブラックベルトが語る本音の話(5/13)
https://www.gmp-platform.com/article_detail.html?id=14077&lang=ja

NFTビジネスの活性化、官民の連携に大きな期待FIN/SUM2022パネルディスカッション(5/11)
https://bizgate.nikkei.co.jp/article/DGXZQOCD291EO029042022000000?channel=BSH04019

そのシステムを放置すれば破産しかない、技術的負債の「正体」を正しく知る(5/16)
https://xtech.nikkei.com/atcl/nxt/column/18/02066/051300001/

他の言語で動くコードがRustでは動かない、鬼門の「所有権」を理解する(5/16)
https://xtech.nikkei.com/atcl/nxt/column/18/01920/051000008/

業務からAIまで幅広く使えるPython、今こそ使えるようになろう(5/16)
https://xtech.nikkei.com/atcl/nxt/column/18/02030/041500001/
Google Meet のWebカメラがChromeの 『ハードウェアアクセラレーションが使用可能な場合は使用する』 にチェックが入っていた場合認識されない。 


タイトル通り動きませんでした。

色々調べても出てこなかったし、意外な所な理由だったのでメモしときます。

unityroom に　WebGLでアプリを投稿していた時に負担をGPUに分けたくてアクセラレーションをONにしてたので不便極まりないです……はぁ。
Rails関連で記事にするほどじゃないけど、まとめておきたいものを列挙する感じの記事です

## ルーティング



ルーティングは、ブラウザから届いたリクエスト（HTTPメソッド＋URL）に対して、コントローラーで定義したアク


ションを


結びつける仕組み。


Ruby on Railsではroutes.rbというファイルにルーティングに関するコードを書いていくことでルーティングを


実現させることができる。


MVCモデルと密接に関係していて、よく使うのでどういう特徴があるのかきちんと理解しておくべきです。



## モデル 



Railsにおけるモデルとは、簡単に言うとデータベースにアクセスする為の機能を持ったクラス（オブジ


ェクト）のことを言います。


コントローラーの命令に従って、データベースから何らかの情報を取り出したり、あるいはデータベース


に何らかの情報を書き込んだりするのがモデルの主な仕事です。要はデータベースとの橋渡し役ですね。



## gemの追加をしたらbundle install



これはよく忘れるので繰り返し覚えましょう。gemfileにテキストエディタで追加して、ターミナルで


bundle installできます。例えばこんな感じ。


```ruby:gemfile
gem 'bcrypt'
```


```ruby:rei
$ bundle install
```
非同期でNo route mach Get...

## 備忘録で書きます。

いいいね機能実装し、jQueryで非同期処理を行いました。
最初はエラーも出ず順調順調でしたが、、、

## jQueyで非同期が完了した後のこと...

### javascriptファイルを独自に作成

application.jsに
```
:
import "jQuery";

import "sample.js";
:
```
のような形で記述していました。

jqueryと独自のjavascriptファイルが何やら邪魔をしていたようで一旦、import"sample.js"の記述を削除しました。

すると、エラーも出ずに元どおりになりました。

まだ個人的な問題は解決せずつまずいていますが、Turbolinks関連や、htmlのレスポンスの詳細などに加えて、Webpack関連も少ししれたのでもっと勉強していきたいと思います。

下記の記事を教えて頂いた@mochi_yu2さん。本当にありがとうございます。


参考
https://qiita.com/fujishiro380/items/12e39ec85f162ce6b3c8
https://qiita.com/mamosan/items/ff336b5cc0a1a95e03a7
https://ja.javascript.info/onload-ondomcontentloaded


https://qiita.com/morrr/items/54f4be21032a45fd4fe9#%E3%83%AD%E3%83%BC%E3%83%89%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%82%92%E3%81%A8%E3%82%8B
素因数分解を Java でやってみる

素因数分解を Java でやってみる
```Java
		int num = 360;              // 素因数分解する数字（素因数で割った結果を入れながら処理）
		int i = 2;                  // 素因数（2から始めてインクリメントしながら処理）

        System.out.println("素因数分解する数字：" + num);

		while (i <= num) {          // 素因数分解する数字 num が素因数 i より小さい間、繰り返す
			int j = 0;              // 素因数で割れる回数（毎回、初期化して割れる間はインクリメントしながら処理）
			while (num % i == 0) {  // 素因数分解する数字 num が 素因数 i で割り切れる間、繰り返す
				num /= i;           // 素因数分解する数字 num に 素因数 i で割った値を代入
				j++;                // 素因数で割れる回数 j をインクリメント
			}
			if (j > 0) {            // 素因数で割れる回数 j が0より大きい時、素因数 i と割れる回数 j 出力（素因数分解できた時）
				System.out.println(i + "が" + j);
			}
			i++;                    // 素因数 i をインクリメント
		}
```

出力結果
```
素因数分解する数字：360
2が3
3が2
5が1
```
SQLデータベース（RDB）の基礎知識

# SQLデータベースの例

Oracle社のOracle Database、Microsoft社のMicrosoft SQL ServerやAccess、オープンソースのMySQLやPostgreSQLなどがある。

それぞれ異なるデータベース・エンジンを搭載し、どれもSQLで操作可能。

# SQL（Structured English Query Language）

データベースを制御するための言語。

## SQLの3要素

3要素は、データベースを制御したり操作したりする際に使い分けられ、すべて命令文で動詞と目的語を組み合わせた構文。

### 1. DDL (Data Definition Language)

DDL(データ定義言語)は、RDBMSで扱うオブジェクト（テーブルやインデックスなど）の構造や、オブジェクト同士の関係を定義する構文。

- CREATE：新しいデータベースやテーブルなどのオブジェクトを定義する
- JOIN：テーブル同士を結合する
- DROP：定義したオブジェクトを削除する
- ALTER：定義したオブジェクトの内容を変更する
- TRUNCATE：データをすべて削除する

### 2. DML (Data Manipulation Language)

DML (データ操作言語)は、データベースを操作するための構文。

目的語やさまざまな条件を示すキーワードと組み合わせて使用。

目的語には「～以上」「～以下」などの条件をつけることもでき、SQL関数と呼ばれる関数を使用可能。

- SELECT：データベースを検索する
- INSERT：データを挿入する
- DELETE：データを削除する
- UPDATE：データを更新する

### 3. DCL (Data Control Language)

DCL (データ制御言語)は、データへのアクセスを制御する構文。

トランザクションやシステムを管理したり、ユーザーのアクセス権を制御したりするために使用。

- GRANT：ユーザー権限を付与する
- REVOKE：ユーザー権限を削除する
- BEGIN：トランザクションを開始する
- COMMIT：トランザクションを確定する
- ROLLBACK：トランザクションを取り消す

## SQLによるデータベースの操作方法

### 1. 対話型

ユーザーがプログラムの**コマンドライン**などでSQLのコマンドを打ち込み、直接操作する方法。

この場合は、処理の結果が表示されるのを待って次の命令を送る。

### 2. 埋め込み型

Javaなどほかのプログラミング言語で記述したソースコードに直接SQL文を埋め込み、動的に操作する方法。

ほかのプログラムに埋め込むことで、SQLを**システムの一部**として使用します。

命令文をネスト構造（入れ子）にして、命令1の結果に応じて「～ならば命令2、そうでなければ命令3」などの処理を行うことで、最終的な結果を得る。これをサブクエリという。

# RDB ( Relational Database)

RDBはデータ同士の関係をテーブル（表形式）で表現し、テーブルとテーブルが連携してデータの構造を表現。

SQLデータベースは、リレーショナルデータベース。

NoSQLデータベースは、リレーショナルでない。

# Praimary Key

RDBのテーブル内でレコードを一意に識別することができるように指定される項目（列/**[カラム](https://e-words.jp/w/%E5%88%97.html)**
）。

# Foreign Key

RDBで、テーブルのある列に、別のテーブルの特定の列に含まれる項目しか入力できないようにする制約。また、その際に指定する列。

参照先のデータの変更に追随して自動的に参照元も書き換えるよう指定したり、参照先の削除や変更を禁じるよう指定することもできる。

例えば、受注テーブルの顧客コードの列に、顧客テーブルの顧客コードの列を外部キーとして設定すれば、顧客テーブルに登録されていない顧客コードを受注テーブルに誤って入力してしまうことを防ぐことができる。既存顧客から選択して入力するような形にすることもできるようになる。

# 参考

- [https://hnavi.co.jp/knowledge/blog/sql/](https://hnavi.co.jp/knowledge/blog/sql/)
VLANインターフェースのACLで許可すべき通信まとめ


ルータ（L3SW）でVLANインターフェース作成時に、VLANインターフェースにACLを設定することがあるかと思います。
この時VLANインターフェースで各種プロトコルを使用している場合、そのプロトコルを使用するのに必要な通信をACLで許可してあげないと、プロトコルがうまく動かなかったりします。
例えば２台のルータで同じVLANインターフェースを設定し、冗長化のためVRRP（あるいはHSRP）を使用することがあるかと思います。VRRPではお互いのルータに設定されているVLANインターフェースの生存確認のため、定期的にHelloパケットを送信し、返答があるか確認しています。そのためACLでそのHelloパケットが破棄されていると、返答がないためお互いに相方がダウンしたとみなし自分がActive機に昇格します。結果外のネットワークから見ると同じIPプレフィックスが２ヶ所から広報しているように聞こえてしまいます。
なので各プロトコルごとに必要なACLを開けるべき通信の内容をまとめました(備忘録的に)。


|プロトコル|許可すべきIPアドレス|補足|
|:--------:|:-----------------:|:---:|
|HSRPv1(IPv4)|224.0.0.1|生存確認のためのHelloパケットを送出するために用いられるマルチキャストアドレス|
|HSRPv2(IPv4)|224.0.0.102|生存確認のためのHelloパケットを送出するために用いられるマルチキャストアドレス|
|HSRPv2(IPv6)|FF02::66|生存確認のためのHelloパケットを送出するために用いられるマルチキャストアドレス|
|VRRP(IPv4)|224.0.0.18|生存確認のためのHelloパケットを送出するために用いられるマルチキャストアドレス|
|VRRP(IPv6)|FF02::12|生存確認のためのHelloパケットを送出するために用いられるマルチキャストアドレス|
|OSPF|224.0.0.5|すべてのOSPFネイバーの生存確認のためのHelloパケットを送出するために用いられるマルチキャストアドレス|
|OSPF|224.0.0.6|BR／BDRのOSPFネイバーの生存確認のためのHelloパケットを送出するために用いられるマルチキャストアドレス|
|OSPFv3|FF02::5|すべてのOSPFネイバーの生存確認のためのHelloパケットを送出するために用いられるマルチキャストアドレス|
|OSPFv3|FF02::6|BR／BDRのOSPFネイバーの生存確認のためのHelloパケットを送出するために用いられるマルチキャストアドレス|
|BGP|ネイバーからのTCP179番の通信|BGPネイバーを確立するためには、ネイバー同士でTCP179番のセッションを確立する必要があるため|
インターフェースとローカルな構造体

ginのsessionsを見ていた際にこんなのがあったのでメモとして。
外部にはインターフェイスとして公開し内部ではローカルな構造体として定義しそれで処理を行なっている。

```golang
type Session interface {
    MethodA()
    MethodB()
}

type session struct {
}

func (s *session) MethodA() {
}

func (s *session) MethodB() {
}
```
【Swift】Storyboardを使わずにコードのみで実装する準備

# はじめに
たぶんUIKitを使っている人からしたら当たり前の事なのかもしれないですが、
私はUIKit初心者で毎回忘れるので自分用に書き残しておきます。

# Storyboardを削除
「Main」を右クリックして「Delete」を選択
![スクリーンショット 2022-05-17 0.44.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/104fddd2-0e8c-71b9-36a3-1879aeb8e814.png)

Move to Trashを選択
![スクリーンショット 2022-05-17 0.46.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/1e98c549-eb4c-fb73-41c2-910082437a58.png)
|Move to Trash|Remove Reference|
|-|-|
|完全に削除|Xcodeの参照を削除|

おそらくこんな感じの使い分けだと思います。

# Infoを編集
`Storyboard Name`を削除します。
![スクリーンショット 2022-05-17 0.50.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/1c173b0e-b502-1b8e-0379-d1a2e45d4172.png)

こうなります
![スクリーンショット 2022-05-17 0.53.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/bb0fd5ef-674f-7d52-8e00-5ee5eca522cb.png)

# Mainの削除
「Deployment Info」の「Main Interface」に入力されている`Main`を削除します。
![スクリーンショット 2022-07-06 18.05.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/31ca427f-22bf-02c5-52fc-0208598662c4.png)


# SceneDelegateを編集
②を編集します。
![スクリーンショット 2022-05-17 0.54.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/47a4f311-e66e-c8b4-cccb-bc02618eb2fe.png)

これが完成形です
![スクリーンショット 2022-05-17 0.56.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/f303282b-7e5f-f69a-7b0a-60e59b3d6915.png)

```diff_swift
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
-    guard let _ = (scene as? UIWindowScene) else { return }

+    if let windowScene = scene as? UIWindowScene {
+        let window = UIWindow(windowScene: windowScene)
+        window.rootViewController = ViewController.init()
+        self.window = window
+        window.makeKeyAndVisible()
+    }
}
```

# おわり
これでコードのみで実装できるようになりました。
StroyboardみたいにUIパーツを配置していく系はとても苦手です。。
【Rails】RailsチュートリアルをRails7でやってみる-第1章 ゼロからデプロイまで(起動確認まで)

# はじめに
復習ついでに、RailsチュートリアルをRails7でやってみようという記事です。
__完走(続きが記述)できるかは筆者の仕事状況・疲労とやる気次第です__ 、ご了承下さい。

Rails7になっての変更点はスペシャリストの方々が
纏めてくださっているので調べてください。
自分はぶっつけ本番ですので頓挫するかもしれませんがやるだけやってみます。

熟練者ではないので、6版のチュートリアルを見ながらやってみて
差分でエラーが出たら勉強しながらトライしていこうという目的も込でやってみます。

一応メモ書き程度に捉えておいてください。

* 開発環境
WSL(Ubuntu-20.04LTS)
VSCode
Rails 7.0.2.3
Ruby 3.1.0

環境構築まではRailsガイドに沿って実施済み

https://railsguides.jp/getting_started.html

一応、Webpacker、Node.jsは使わなくなったとのことなので、最低限留意して進めます。

多分、以下のポイントを軒並み踏んで苦戦していくと思いますがご容赦ください。

https://qiita.com/jnchito/items/5c41a7031404c313da1f

## アプリケーション作成
とりあえず、細かなオプションを指定せず
DBだけpostgresqlにしました。
```rails _7.0.1_ new hello_app -d postgresql```
(筆者はPostgreSQLの方に慣れているだけなので、当てはまらない方はデフォルトで良いと思います)

フロントエンド周りにも大幅な変更が加わった、とのことなので
正直このオプション指定しかしていない時点で不安が残りますが、とにかく進めます。

毎回忘れるので、オプションについては以下の記事を参考にしました

https://zenn.dev/yukito0616/articles/7cd2dde18c90d4

はい、作成は無事に完了しました。
Gemfileの中身が色々異なりますが、とりあえず見なかったことにして進めます。

内容は変更せず、このまま
```bundle install```を実行します。

```rails s```の代わりに```bin/env```らしいので
必要な以下をインストールしておきます。
```gem install foreman```
(普通に```rails s```コマンドを使用できましたが、
情報不足の可能性があるので後々調べておきます)

さて、```rails s```できたはいいけど```localhost:3000```にアクセスすると
```ActiveRecord::NoDatabaseError```で怒られますね…

```bin/rails db:create```してください書いてあるから実行するか…
(怒られない方はそのまま進めてください)

再度トライ…はい、例の画面が出ました。
(と思ったらRails初期画面変わったのか…こんなシンプルになってしまって悲しい…)
![スクリーンショット 2022-03-29 214238.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010426/09f171b0-380d-9a35-a00c-9abd887cedb6.png)

Windows 10 or 11(WSL2)で
```systemctl```を動作させるには工夫が必要なようなので、PostgreSQLを利用される方は
```rails s```前に毎回
```sudo service postgresql start```を実行してください。

https://snowsystem.net/other/windows/wsl2-ubuntu-systemctl/

次に続く…かは筆者の頑張り次第です…
ICLR2022の宝くじ仮説論文

# 概要

この記事では、[ICLR2022](https://iclr.cc/)の宝くじ仮説論文をまとめます。[^1]
[^1]: 画像や数式は論文から引用しています。


# 宝くじ仮説の復習

宝くじ仮説 (Lottery Ticket Hypothesis) は、ICLR2019でFrankleらによって提案された仮説です。
> ランダムに初期化された密なニューラルネットワークは、ある部分ネットワークとして当たりくじ(winning ticket)を持つ。当たりくじを初期値として、元の密なニューラルネットワークを学習したのと同様の精度にすることができる。

https://arxiv.org/abs/1803.03635


CVPR2020では、Ramanujanらが、宝くじ仮説よりも強い主張である"強い宝くじ仮説" (Strong Lottery Ticket Hypothesis) と、当たりくじを見つけるための方法であるedge-popup algorithmを提案しました。
> 十分にパラメータ数の多いランダム初期値のニューラルネットワークは部分ネットワークを持つ。その部分ネットワークは学習せずに元のネットワークと同じ精度を持つ。

https://arxiv.org/abs/1911.13299


# Proving the Lottery Ticket Hypothesis for Convolutional Neural Networks

https://openreview.net/forum?id=Vjki79-619-

(ICLR2022 Poster)
概要：強い宝くじ仮説の証明。
新規性：CNNの場合で強い宝くじ仮説を証明した。(従来の証明はfully-connected layerのネットワークの場合だった。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/52812346-cd48-e6a4-a221-d32a13fbd9ae.png)
キモ：まず畳み込み1個を刈ったもので任意に近似できることを示して (Lemma 1.2) それを全ネットワークに広げる。
評価：LeNet5で実験した。


# On the Existence of Universal Lottery Tickets

https://arxiv.org/abs/2111.11146

(ICLR2022 Poster)
概要：宝くじ仮説の拡張。
新規性：Universal Lottery Ticket (Universal LT) の提案と存在証明をした。
> 十分にパラメータ数の多いネットワークは、学習無しで部分ネットワークにUniversalな当たりくじを持つ。そのUniversalな当たりくじにMLPを1層加えれば、他のタスクも適用できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/e66fddfd-bc2e-cb59-e583-af3a7ec26dfb.png)
キモ：転移学習のように、MLPを1層加えることによって他のタスクに適用できるようにする。
評価：実験で、Universal LTを構成することができることを示した。


# Dual Lottery Ticket Hypothesis

https://arxiv.org/abs/2203.04248

(ICLR2022 Poster)
概要：Dual Lottery Ticket Hypothesis (DLTH) の提案
新規性：当たりくじを見つけるのに学習が必要ない方法を提案した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/5d249a8a-7cf4-e6c1-c141-9b5a2b282428.png)
キモ：DLHTを実証するために、当たりくじを見つけるアルゴリズムRandom Sparse Network Transformation (RST)を提案した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/21c63b66-c7cc-d4ec-68e1-78c4c5e5603a.png)
$\lambda$をだんだん大きくする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/fdaec3e4-1bc2-ebc1-5f7b-39d242f13852.png)
評価：ResNetとCIFARで、学習ありの方法相当まで刈れることを示した。


# Peek-a-Boo: What (More) is Disguised in a Randomly Weighted Neural Network, and How to Find It Efficiently 

https://openreview.net/forum?id=moHCzz6D5H3

(ICLR2022 Poster)
概要：PaB. 強い宝くじ仮説で、当たりくじを効率的に見つける方法。
新規性：強い宝くじよりも高性能なネットワーク (disguisedなnetwork) をedge-popupアルゴリズムよりも効率的に見つけられる方法を提案した。
キモ：PaBのネットワーク探索においては、枝刈り後、符号のみを入れかえる (unmask) 処理を入れることによってネットワークを探索する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/12fe62a4-bded-cd38-078a-e07889091244.png)
評価：ResNet, CIFARで実験した。
ベン図を使ってif文を理解する

## はじめに
プログラマーでif文を書かない人はいないと思います。
ですが、条件が2つ以上になった時に「？？？」となってしまう人が多いのでは。
この記事では、「ベン図」というフレームワークを使って2つの条件を見える化していきます。

## 対象者
この記事は下記のような人を対象にしています。

- 駆け出しエンジニア
- プログラミング初学者
- 中学・高校で数学苦手なのにプログラマーになってしまった人

## 結論
ベン図を使えばif文は怖くない！

## ベン図とは
ベン図とは、複数の条件を見える化するフレームワークの一つ。
イギリスの数学者、ジョン・ベンが考案したことからベン図と呼ばれる。
アイデアをMECE(抜け漏れなく)にするためのチェックによく使われる。
システムの設計段階や障害対応に活躍する。

## if文を書くための論理演算子
| 論理演算子 |    内容     |    使用例    |
|---|-------------|------------|
|&&  |かつ(AND)             |A && B            |
|&#124;&#124;  |または(OR)             |A &#124;&#124; B            |
|!     |~ではない(NOT)             |!A            |

## ベン図を使ったif文実例
- A 
![A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2157342/92ae2820-6308-8f2d-68a1-6ac6ed496825.png)

- B 
![B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2157342/ca002e48-37e4-419e-d4fd-c62c0f953f8a.png)

- !A (Aではない)
![!A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2157342/2a5f2150-cd85-e349-3f55-136de6aba3f5.png)

- !B (Bではない)
![!B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2157342/4cca14d5-47f9-4be3-86f3-6d600f630d49.png)

- A && B (AかつB)
![A||B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2157342/c6127ae7-7211-5882-e85b-f8473e048997.png)

- !A && B (AではないかつB)
![!A&&B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2157342/b82d92f1-4043-5b44-bded-0b09153bbc50.png)

- A && !B (AかつBではない)
![A&&!B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2157342/05f6c77e-b4fe-5501-fe6b-fb74428b31b2.png)

- A || B (AまたはB)
![A&&B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2157342/5c3da46c-e796-962c-95ac-0f1e1e61ce90.png)

- !A && !B
![!A&&!B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2157342/bb5d2010-ee69-f083-c22a-21af3bdf5c92.png)

- !(A || B)
![!A&&!B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2157342/bb5d2010-ee69-f083-c22a-21af3bdf5c92.png)

## おわりに
ベン図を使ってif文の2つの条件についてまとめました。

## 参考記事
[【PHP入門】論理演算子](https://medium-company.com/php-%E8%AB%96%E7%90%86%E6%BC%94%E7%AE%97%E5%AD%90/)
TerraformでAzure環境構築するための事前のAzure認証設定

# 概要
Terraformを使用してMicrosoft Azureの環境構築を行う場合、Terraform planコマンドもしくはTerraform Applyコマンドを実行前には、Azureへの認証を済ませておく必要があります。認証せずにコマンドを実行すると下記のようなエラーになります。
```
Error: building AzureRM Client: obtain subscription(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxx) from Azure CLI: parsing json result from the Azure CLI: waiting for the Azure CLI: exit status 1: ERROR: Please run 'az login' to setup account.
```
TerraformがサポートしているAzure認証方法は現在4種類ありますが、その中でも下記リンク先の認証方法を採用するのが有用だと思いました。
[Authenticating using a Service Principal with a Client Secret](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/guides/service_principal_client_secret)
以下、上記リンク先を参考に実施した認証設定を備忘録として書いておきます。

# 設定検証環境
Windows10 Home Edition

# 設定手順
最初にWindowsのコマンドプロンプトからAzure CLIのaz loginコマンドを実行して、一度Azure環境にログオンします。Azure CLIについては下記のリンク先を参照ください。
[Azure CLIドキュメント](https://docs.microsoft.com/ja-jp/cli/azure/)
ログオン時にはブラウザ認証が必要になりますので、画面の指示に従い対応します。
```
az login
```
ブラウザ認証が完了すると、az loginの出力結果がJSON形式でコマンドプロンプトに表示されます。(以下はサンプルです。)
```
[
  {
    "cloudName": "AzureCloud",
    "homeTenantId": "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx",
    "id": "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx",
    "isDefault": true,
    "managedByTenants": [],
    "name": "Azure サブスクリプション 1",
    "state": "Enabled",
    "tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx",
    "user": {
      "name": "aaaa@test.com",
      "type": "user"
    }
  }
]
```
上記出力のうち、この後の設定で必要になる項目をメモしておきます。
* id ： SUBSCRIPTION_ID
* tenantid ： TENANT_ID

次に、TerraformでAzure環境作成を行う際のロールの設定を行います。今回は自身のAzure環境設定を行うことが目的のため、下記のコマンドで所有者ロールを付与します。SUBSCRIPTION_IDには上記でメモした値を指定します。
```
az ad sp create-for-rbac --role="Owner" --scopes="/subscriptions/SUBSCRIPTION_ID"
```
上記コマンド実行後、以下の内容が出力されます。(以下はサンプル)
```
{
  "appId": "xxxxxxx-xxxx-xxxx-xxxxxxxx",
  "displayName": "azure-cli-2022-05-16-13-02-26",
  "password": "xxxxxxx-xxxxxxxxxxx",
  "tenant": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
```
ここで、下記をメモしておきます。
* appid：CLIENT_ID
* password ：CLIENT_SECRET
* tenant ： TENANT_ID

# ユーザー環境変数の設定
Windowsのユーザー環境変数に下記4つの変数を新規登録します。
* 変数名：ARM_CLIENT_ID、変数値：上記CLIENT_IDの内容
* 変数名：ARM_CLIENT_SECRET、変数値：上記CLIENT_SECRETの内容
* 変数名：ARM_SUBSCRIPTION_ID、変数値：上記SUBSCRIPTION_IDの内容
* 変数名：ARM_TENANT_ID、変数値：上記TENANT_IDの内容

ユーザー環境変数の登録が終わってしまえば、以後は事前のAzure認証を気にすることなく、Terraformを使用したAzure環境構築を実施することが可能です。
プラグインマニホールド電磁弁をMIL20PコネクタでPLCとつなぐ。

### PLC側
- PLC側コネクタFCN40P
RY41NT2P
NZ2GFCF1-32T　CClink-IEF
AJ65SBTCF1-32T　CClink
- ケーブル　FCN40P-MIL20P
FA-CBL30FM2V
30は3mの意味。

- PLC側コネクタMIL20P
FX5-C32EYT/D
NZ2GFCM1-16T CClink-IEF
KV-NC16EX Ethernet/IP
- ケーブルMIL20P-MIL20P
ミスミHIFS-SS-SB-20-3
三菱SC FA-CBL30MMH20

### マニホールド側
CKD製のマニホールドで端子方式が「T50」が対応している。
- CKD MN4GB1/2/3の場合の例。
MN4GB220R-C8-T50-8-3
シングル　MN4GB219R-00-A2N-3
ダブル　MN4GB229R-00-A2N-3
ブランクプレート:N4GB2R-MP-C

SMCの端子方式10PG1系列も対応しているように見えるが、電源供給のためにケーブルに細工する必要があり、ちょいめんどい。
電磁弁側は9連×2位置+コモン2まで対応しているが、PLC側は出力16点+コモン4なので8連までにすること。

https://www.ckd.co.jp/kiki/jp/digitalcatalog/standard/pneumatic_valve1/HTML5/pc.html#/page/233


https://www.ckd.co.jp/kiki/jp/digitalcatalog/standard/pneumatic_valve1/HTML5/pc.html#/page/337

SMCマニホールドピンアサイン

https://ca01.smcworld.com/catalog/New-products/mpv/s11-103-sy/index.html#target/page_no=60

CKDマニホールドピンアサイン

https://www.ckd.co.jp/kiki/jp/digitalcatalog/standard/pneumatic_valve1/HTML5/pc.html#/page/893

FCN40P-MIL20Pケーブル

https://www.mee.co.jp/sales/fa/meefan/product_information/products/fa-cbl10fm2v.html
25.4mmピッチ取り付け光電センサー

半導体不足の影響でキーエンスPZシリーズの納期が6か月になったので。

光電センサーは各社取り付けが25.4mmピッチM3統一してあり、気分でメーカー選んでよい。
価格は基本はオプテックスFAがやや安、キーエンスやや高だが、個数まとめて買うときはキーエンスは他社より強引に下げてくる。
保全はオプテックス、案件はキーエンスになることが多い。
NPNの赤色光現行機種を並べた。
竹中やSICKはBGS反射の取り付けが異なるため載せていない。
オプテックス・エフエーはIO-link対応。不要ならZ3にする。

ケーブル引き出し
|メーカー|  キーエンス  |  オムロン  |オプテックス|
| ---- | ---- |----  |----  |
|透過型 | PZ-G51N |E3Z-LT61 2M|Z4T-2500N|
|回帰反射|PZ-G61N|E3Z-LR61 2M|Z4R-400N|
|BGS反射| PZ-M31|E3Z-LL61 2M|Z4B-30N|

キーエンスは検知距離の長いPZ-M71
オプテックス・エフエーはスポットレーザーのBGS-ZL30Nがある。

M8コネクタ
|メーカー|  キーエンス  |  オムロン  |オプテックス|
| ---- | ---- | ----  | ----  |
|透過型 |PZ-G51CN|E3Z-LT66|Z4T-2500CN4|
|回帰反射|PZ-G61CN|E3Z-LR66|Z4R-400CN4|
|BGS反射|PZ-M32|E3Z-LL66|Z4B-30CN4|

キーエンスはM12コネクタPZ-M33あり。
1:茶
2:白
3:青
4:黒
M8 A-cordingは順に1243なので違和感ある。

金属筐体
キーエンスPZ-G → PR-G
オムロンE3Z → E3ZM
オプテックス・エフエーのZT-Mはやや型落ち感ある
JPRS とは

## 勉強前イメージ

ドメイン的ななにか

## 調査

### JPRS とは

Japan Registry Services の略で、JPドメイン(.jp)の登録・管理を行う企業(レジストリ)になります。
JPドメインのDNSの運用も行っています。

元々JPドメインの登録・管理は日本ネットワークインフォメーションセンター(JPNIC)が行っていましたが
登録数も増加し、非営利で行うのに限界が来たので民営化したのがJPRSになります。

一般のレジストラから申請を行って、実際の登録や変更を行っています。
JPRS自身もレジストラとして業務を行っています。

### レジストリ？レジストラ？

詳細は [こちら](https://qiita.com/miyuki_samitani/items/ac8bf32554872a701735) に書いていますが
以下になります。

- レジストリ : トップレベルドメインの登録・変更管理を行っている
- レジストラ : ドメインを登録する事業者。個人はレジストラを通してレジストリにドメインの申請を行う。

## 勉強後イメージ

ふんわり見たことあったけど、事業者なんだ・・・
JPRSはレジストリなのね。

## 参考

- [JPRS （Japan Registry Service Co., Ltd.）](https://atmarkit.itmedia.co.jp/icd/root/81/24146081.html)
- [JPRS 【Japan Registry Service】 日本レジストリサービス](https://e-words.jp/w/JPRS.html)
arduino GPSモジュールの動作確認方法

arduinoでGPSモジュールを使ってなんか作るときに、はじめにこれでモジュール本体の動作確認を行えます。
使うのはGY-NEO06MV2というモジュールです。
アンテナが別になっているので、まずは本体に接続しましょう。
![IMG_20220516_222923.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1831303/337c647c-22f5-3e99-3765-58e3ea8d0fd0.jpeg)

![IMG_20220516_223811.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1831303/8e5f59a1-f379-a0c8-4e65-874612892430.jpeg)
【各端子の意味】
VCC:電源
RX:GPSモジュール信号受信
TX:GPSモジュール信号送信
GND:接地側

arduinoと以下のように接続しましょう。
【GPSモジュール】->  【arduino】
VCC             ->   5V
RX              ->   4ピン  
TX              ->   3ピン
GND             ->   GND

次にarduinoに以下のプログラムをローディングします。
```gps_test.ino
#include <SoftwareSerial.h>

SoftwareSerial mySerial(3, 4); // RX, TX

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(57600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
}

void loop() { // run over and over
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
}
```

ローディングしたらシリアルモニタを開きます。
そうするとGPSモジュールから送られてきた位置情報が表示されます。
![FSzoNvxVsAEuCFE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1831303/69e178cf-908e-32ad-821a-23fe4e4bcd7b.png)

でも、お前はあほなので表示が出ずに悩むはずだ。
表示が出ないからなんかデータシートとかみたり、ネットの記事をみたりしてよくわからず、とりあえず配線とかいじくってみたりするはずだ。
でもやっぱりでない。お前があほだからだ。
お前はあほな上にインドア派だから家のなかでずっと悩んでいるはずだ。
GPSモジュールをつけたままarduinoを外に放り投げろ。外にいけ。
GPSモジュールは初回の電波を受信することで測位が有効になる。
これは屋外でないとうまくいかない。
外においてしばらくすると、GPSモジュールのLEDがチカチカし始める。
チカチカしているということは測位が有効になったということだ。あほめ。
そこで再びシリアルモニタを開くと位置情報が表示されているはずだ。

これでGPSからの各種情報を受け取ることができます。
いろいろ試してみましょう。

オワリ
Selenium使う際のエラー対応

# はじめに
最近Pythonを始めた初学者です。現在スクレイピンを学習中ですが、Selenumを使う際に、エラーに遭遇したのでまとめます。

# 使用環境とバージョン
・Jupyter Lab
・Python 2.7.16

# エラーの起こったタイミング
Seleniumのwebdriverをインストールし、Chromを立ち上げ立ち上げました。その後に、idを取得しようと、find_element_by_id()を使用した所、下記エラーをはきました。
```
selenium.find_element_by_id("value") NameError: name 'selenium' is not defined Exception ignored in: > Traceback (most recent call last):
```

# 原因と対策
調べてみると、Seleniumの最新バージョンのSelenium4から書き方が変わり、非推奨になったらしいです。
現在は...
書き方に関しては、
```
find_element(By.ID, "id-name")
```
と書くのが推奨されているようです。

またそれに加えてimpot文も合わせて入力する必要があります。
```
from selenium.webdriver.common.by import By
```
これを忘れてしまうと、エラーが出ます。
以下に他の書き方もまとめるので、エラーに当たった方は参考にしていただけると幸いです。

# 新しい書き方一覧
### class指定
- 今までの書き方(class指定)
```
browser.find_element_by_class_name("class-name")
```
- 新しいの書き方(class指定)
```
browser.find_element(By.CLASS_NAME, "class-name")
```
### name指定
- 今までの書き方(name指定)
```
browser.find_element_by_name("element_name")
```
- 新しいの書き方(name指定)
```
browser.find_element(By.NAME, "element_name")

```
### cssセレクタ指定
- 今までの書き方(cssセレクタ指定)
```
browser.find_element_by_css_selector("element_css_selector")
```
- 新しいの書き方(cssセレクタ指定)
```
browser.find_element(By.CSS_SELECTOR, "element_css_selector")
```
IPA資格の勉強方法

とあるコミュニティで記事化の要望をいただき、こちらに書かせていただきます。
なお、この記事は午前に焦点を当てたものです。


過去問インプットの時にたくさんの問題をやると思うのですが、以下3つの点を意識しながらやると飲みこみが上がると思います。

# 1つの問いに対して"1つの正答3つの誤答"から「1粒で4度おいしい学習」をする
Q→Aを丸暗記するのは不毛です。
出題者も「知らない人が見たら誤答するであろう」選択肢を用意してくるので、それらの選択肢についてもインプットするのが吉です。
全く関連のないワードが並ぶこともありますが多くの場合は何らか関係しているワードなので、正答に迷ったらなおのこと誤答選択肢についても理解を深める必要があります。

# 翌日に「前日に誤答した問題の反復」をして、かつ「新しい問題に取り組む」。いわゆる螺旋式にする。
これは忘却曲線のアレです。
取りこぼした問題は翌日かならず"誤答選択肢含めて"復習しましょう。
私は鳥頭なので、これをやらないと忘れてしまいます。

# 全く役に立たない問題というのは数少ないので「この知識が今の業務のアレと関係しているなぁ」という気づきを探す
暗記ゲーってつまらなくないですか？実務に関連していないことのほうが少ない試験なので、芋づる的に覚える手段としてこれは有効だと思っています。
rubyにおけるオブジェクトとメソッドについて

# rubyにおけるオブジェクトとメソッドについて
```
puts "apple".length
```
## オブジェクトとは
文字列や値、配列や浮動小数点等　物。
上記のコードでいう __apple__
## メソッドとは
オブジェクトに意味を与えるもの
上記のコードを参照すると __puts__      __length__
appleというオブジェクトの文字数を表示してになる。

#### 補足

オブジェクトやメソッドは言語によって捉え方が違う。
学習していく中で語句の知識を深めていきたい。
基本情報（半加算器と全加算器）

全く聞いたことがない言葉なので意味不明でしたが、加算器とは**2進数の足し算（つまり加算）を行う回路**を**加算器**と呼ぶそうです。

加算器には**半加算器**と**全加算器**があります

半加算器は１桁の２進数を2つ加算。
全加算器は１桁の２進数を3つ加算。

よくわからないので一つ一つ見ていきます。

## 半加算器

半加算器を理解するためには、２進数の１桁（ビット）同士で行われる足し算に、どんなパターンがあるか考えると良いようです。

```
  0          0          1         1
+ 0        + 1        + 0       + 1
-----     ------     ------    ------ 
  0          1          1        10
```

4パターンです。
![Half_adder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/762b4867-8276-15a3-726a-5fa75e2b310c.png)
ANDゲートが半分丸でORゲートが三日月でNOTゲートがおでんです。

入力A、入力B、出力S（SUM）、桁上げ出力C（Carry Out)の回路図で入力と出力の関係になっています。
Cは桁上がりした２桁目の数に当たる出力でSは１桁目の数に当たる出力です。

真理値表にまとめると

|  A   |  B   |  C   |
| :---: | :---:| :---: |
|   0  |  0  |  0  |
|   0  |  1  |  0  |
|   1  |  0  |  0  |
|   1  |  1  |  1  |

|  A   |  B   |  S   |
| :---: | :---:| :---: |
|   0  |  0  |  0  |
|   0  |  1  |  1  |
|   1  |  0  |  1  |
|   1  |  1  |  0  |


```
   0
+  1
-----
  01
// CSの順番で表示されるということですね
```


つまり出力Cは論理積（AND）。出力Sは排他的論理和（XOR）。
この二つが組み合わさって半加算器が出来上がっています。

なんとなくわかった。ような。気がします。

## 全加算器

```
  0 1 1 1 1 1 1 0 1
+ 0 1 1 0 1 1 1 1 1
---------------------
  1 1 1 0 1 1 1 0 0
 ~~~~~~~~~~~~~~~  ~~
  全加算器が必要    半加算器でOK
```
２桁目以降は下位の桁から繰り上がってくる可能性があるため、半加算器では対応ができません。
そのため、２桁目以降は全加算器が必要となります。

![Full_adder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/87345705-7d8b-2381-e512-be02c6c22f2c.png)

全加算器は半加算器と論理和回路（OR回路）を組み合わせることで作ることができるようです。
半加算器は2つの組み合わせが必要です。

半加算器と比べると入力口が一つ増えて計算式は

```
   A
+  B
-----
 C S
   +
   C
```
となるようです。


##  まとめ
なんとなく理解しましたが、しっくりこないので何回か復習してみようと思います。