OmniAICreator/Qiita-1.07M huggingface dataset:
【Salesforce】リストビューから画面フローを呼び出す方法

レコード詳細ページではなく、リストビューに画面フローを配置してみました。
#リストビューにフローのアクションを配置できるのか
画面フローアクションを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2003505/cf366702-574c-8838-3db0-887c3d6f2b51.png)

作成してもアクションとして配置することはできなかった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2003505/9164a9dc-249b-a18a-bb05-241ae78fee60.png)

#リストビューにフローのボタンを配置できるのか
>
<font color="RoyalBlue">/flow/フローAPI名?retURL=リストビューのURL</font>

上記の形でフロー用のURLを記述する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2003505/9048d85d-aafa-01ff-8200-423a88cda221.png)
検索レイアウトのカスタムボタンで指定できるようになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2003505/8aa3db79-59b2-059c-6e16-a756d6bdc196.png)
設定後にリストビューに戻ると配置されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2003505/e5e46104-9822-fa64-258e-e2b8354f2da9.png)
画面フローに遷移できるようなった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2003505/3bee2c6d-46fc-a897-6e38-9862ccb1d827.png)

#ユーティリティバーから画面フローを呼び出す
リストビューとは少し違いますが、ユーティリティバーに配置する方法もあります。
ユーティリティバーのフロー設定は[アプリケーションマネージャ]-[（使用したいアプリの）編集]-[ユーティリティ項目]-[ユーティリティ項目を追加]-[フロー]から行えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2003505/1c810507-7935-0eff-3ce4-9e1cbef26902.png)

設定するとユーティリティバーから画面フローが呼び出せるようになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2003505/b822ca3e-fa53-53eb-3a4c-2fc499651412.png)

#まとめ
インライン編集でフラグをつけたレコードに画面フロー内で入力した情報を付加して一括更新したり、別OBJのレコードを作成したりもできるので、結構使えそうですね
OpsRamp AWSのオンボーディング

# 概要

OpsRampはAWS、Azure、GCPなどパブリッククラウドをAPI・監視エージェントで監視することができます。
今回はAWS環境をOpsRampにオンボーディング（OpsRampではIntegrationと呼ぶ）する手順を記載しておきます。

### 事前準備

AWSの場合、AWSのアカウント単位でOpsRampにオンボーディングします。
事前に権限のあるIAMロールを準備しておきましょう。オンボーディング時に下記3つの情報を入力します。

* アカウント番号
* アクセスキー
* セキュリティキー



# AWSのオンボーディング（Integration）

* "Setup" > "インテグレーション" > "インテグレーション" > "AWS" をクリックします
![2022-0122-1429-54.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/9b1e0502-d93a-38ca-119d-43877c86593a.jpeg)

* "Install" をクリックします
![2022-0122-1430-10.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/3392c815-dd3b-09ee-8ddf-524e7385f5f5.jpeg)

* 事前に準備したAWSアカウント情報を入力して "Install" をクリックします
![2022-0122-1431-09.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/1a75b1b6-af64-b513-f8b2-40f301f0d50f.jpeg)

* 問題なくAWSアカウントに接続できると下記画面になります。続けてAWSリソースを検出するためのプロファイルを作成するため"作成"をクリックします
![2022-0122-1432-22.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/ada40042-3664-6bd7-bc2b-a2441fc5f8a9.jpeg)

* 今回は全てのリソースを検出したいので、"Filter Criteria"では"Smart Filters"を選択します。そして、"ALL Resources"にチェックをいれます。（そうすると他のリソースは選択できないようになります）
![2022-0122-1433-50.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/e8cd5bfa-90c3-7c14-ed8e-c1026cf335b1.jpeg)
![2022-0122-1434-12.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/e48c2602-68a0-e8c7-961d-f3865203147d.jpeg)

* "アクションの実行"では"Manage Device"にだけチェックを入れておきます
* "検出スケジュール"にチェックを入れて"Save"をクリックします
![2022-0122-1436-01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/5af6b316-4edd-dbbd-6e09-f62a7b605b4c.jpeg)

* 作成したプロファイルの条件でAWS環境をスキャンするため、"Scan Now"をクリックします
![2022-0122-1436-26.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/b2560d41-6536-0006-e267-4126f195e050.jpeg)

* "Yes"をクリックします
![2022-0122-1436-37.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/236badcf-047d-2d43-d46b-14a734de0ab2.jpeg)

* スキャン中は"ステータス"が下図にようになります
![2022-0122-1436-48.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/3aa3a339-091b-1ccb-f389-50616c47ab9c.jpeg)

* スキャンが完了すると"Scan Completed Time"に時間が記録されます。小規模でも15分～30分は時間がかかりました
![2022-0122-1521-29.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/6ebd140c-231f-1ed3-2226-47ce8566d824.jpeg)

* テナントのリソース一覧を確認するとAWSが追加されていることが確認できます
![2022-0122-1522-07.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/4a273f25-da46-ae53-c3de-2b930a0f9641.jpeg)


あとは、いつもどおりMoniterで監視テンプレートを適用すると、Metricsにグラフが表示されるようになります。

おわり。
予約語のせいでPythonの仮想環境を作れなかった

これは何？
Pythonの仮想環境を作れなかったときのトラブルシューティングの話です。

# 環境
Windows 10
conda 4.10.3

# 現象
データ分析コンテストに向けて、いつも通りPythonの仮想環境を作ろうとしました。
コンソールからいつものように入力。

```console
$ conda create —name con
```

エラー発生

```console
CondaValueError: prefix already exists: C:\Users\hoge\anaconda3\envs\con
```


既に存在している？そんな仮想環境はないはず。
試しにactivateしてみる。

```console
$ conda activate con
```


```console
Could not find conda environment: con
You can list all discoverable environments with `conda info --envs`.
```

やはり仮想環境が見つからない。

# 原因
Windowsの予約語が原因でした。

分析コンテスト専用環境なので、仮想環境の名前を「con」にしてしまったのが原因。
「con」はフォルダに使用できない名前。

env配下にフォルダを生成できずエラーが発生していました。

仮想環境の名前を「contest」に変えて無事に作成完了。

```console
$ conda create —name contest
```

# 他の予約語は？
Windowsでは次の予約語をフォルダ名に使用できません。

> CON、PRN、AUX、NUL、COM1、COM2、COM3、COM4、COM5、COM6、COM7、COM8、COM9、LPT1、LPT2、LPT3、LPT4、LPT5、LPT6、LPT7、LPT8、LPT9

# というわけで

仮想環境を作成するときには予約語を避けましょう。

# 参考
- [ファイル、パス、および名前空間の名前付け](https://docs.microsoft.com/ja-jp/windows/win32/fileio/naming-a-file "ファイル、パス、および名前空間の名前付け")
いきなり$ rails newはダメなのか

# overview
- よく仕事で`$ rails new`してたんですけども、これよく考えたらいきなりしちゃダメな気がする
- チームで開発しているときにgemがめちゃくちゃなことになる可能性があるのでできればみんな同じ環境で作業したいな〜って思います
- gemのinstall先をグローバル環境ではなくローカルにしたらいいんじゃないかな
   - そのためにいきなり`$ rails new`するのではなく
   - まずgemfileを設定してアプリの中にbundle installできるようにしなくちゃね

# get started!

## gemファイルの作成

1. `$ mkdir test-app`
1. `$ cd test-app`
1. `$ bundle init`


## railsアプリの作成
```ruby
# frozen_string_literal: true
source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

# railsのコメントアウトを外すだけ
gem "rails"
```

## bundle install
1. `$ bundle install --path vendor/bundle`


## rails new
1. `$ bundle exec rails _x.x.x.x_ new . -d postgresql --skip-turbolinks`
   - _x.x.x.x_はrailsのバージョンです
   - `$ rails -v`したときに出たきたrailsのバージョンでアプリを指定します

# reference
- https://qiita.com/yuitnnn/items/b45bba658d86eabdbb26
AWS Cloud Practitioner Essential まとめ8

# [AWS Cloud Practitiner Essential] (https://explore.skillbuilder.aws/learn/course/1875/play/27620/aws-cloud-practitioner-essentials-japanese-ri-ben-yu-shi-xie-ban) 殴りがき

## AWS CAF(Cloud Adoption Framework)

オンプレミスからAWSクラウドへ移行したい人むけのガイダンスを集約したもの。

6つの主要な分野(パースペクティブ)がある
クラウド移行の際に組織の変更管理をガイドするために使う。


- ビジネス
    - ビジネス機能に焦点を合わせる
    - ビジネス戦略とIT戦略も併せてビジネスモデルを移行するのに役立つ
    - 該当担当者
        - ビジネスマネージャー
        - 財務マネージャー
        - 予算担当者
        - 戦略の関係者
- 人員
    - ビジネス機能に焦点を合わせる
    - <b>組織のプロセスとスタッフのスキルを新しくすることで、クラウド導入の準備を整える</b>
    - 該当担当者
        - 人事
        - 人材配置
        - 人材マネージャー
- ガバナンス
    - ビジネス機能に焦点を合わせる
    - 該当担当者
        - 最高情報責任者(CIO)
        - プログラムマネージャー
        - エンタープライズアーキテクト
        - ビジネスアナリスト
        - ポートフォリオマネージャー
- プラットフォーム
    - 技術的な機能に焦点を合わせる
    - 該当担当者
        - 最高技術責任者(CTO)
        - ITマネージャー
        - ソリューションアーキテクト
- セキュリティ
    - 技術的な機能に焦点を合わせる
    - 該当担当者
        - 最高情報セキュリティ責任者(CISO)
        - ITセキュリティマネージャー
        - ITセキュリティアナリスト
- オペレーション
    - 技術的な機能に焦点を合わせる
    - <b>運用と復旧に焦点を合わせた</b>
    - 該当担当者
        - ITオペレーションマネージャー
        - ITサポートマネージャー


## 移行戦略の6R

### リホスト (Rift & Shift)
- 単純な移行。最適化や変更はしない。
- 素早く移行するのに適するため、企業は大部分がリホストを選択する
- 最適化をする必要がない場合に選択される

### リプラットフォーム (re platform　または　Rift Tinker(手直し) & Shift)
- クラウドの最適化を行う。
- アプリケーションの中核となるアーキテクチャは変更しない


### リタイア(retire)
- 使われていないアプリケーションを削除するプロセス

### 保持(retain)
- ビジネスに重要なアプリケーションを維持する
- 移行する前、主要かつリファクタリング必要なアプリケーションや、後に延期できる作業が含まれる。


### 再購入(repurchase)
- ライセンス形式からSaaS形式的に移行する
- <b>別の製品に移行する移行戦略</b>

### リファクタリング(refactoring)
- アプリケーションのアーキテクチャの設計方法や開発方法を作り直す
- 現在の環境での実現が困難の場合に、機能・拡張性・パフォーマンスを強化する


## AWS Snowファミリー

<b>データが莫大になってくると、ネットワーク経由で送るよりストレージを物理的に運ぶ方が早い場合がある。その場合にAWS Snowファミリーのデバイスを使う。</b>
データをAWSとの間で物理的に運ぶためのデバイス。
データの規模に応じて、3種類のデバイスがある。
各デバイスにはコンピューティング機能が内蔵されている。
AWSのセキュリティ、モニタリング、ストレージ管理、コンピューティング機能として管理される。

### AWS Snowcone
最大8TB
エッジコンピューティングできる。

- 小型。
- CPU2つ。 メモリ4GB。 ストレージ8TB。のスペック

### AWS SnowBall
<b>SnowBallの中でさらに2種類のデバイスに分類される</b>

1.Snowball Edge Storage Optimized

    - 大規模なデータ移行と定期的な転送。大容量の必要とするローカルコンピューティングに適する。
    - ストレージ:
        - S3用(オブジェクトデータ)に 80TBのHDD
        - EBS用(ブロックデータ)に1TBのSDD
    - コンピューティング:
        - 仮想CPU: 40個
        - メモリ: 80Gib (EC2インスタンス(sbe1というタイプ)をサポートする)

2.Snowball Edge Compute Optimized
    
    - 機械学習・動画分析などのユースケースに強い。
    - ストレージ:
        - S3 or EBS 用に42TB(HDD)
        - EBS用に 7.68TB(SSD)


### AWS Snowmobile

大容量データを移行するための使う。(エクサバイト規模)
実際にトラックが牽引する。
改ざん防止・防水などすべてのセキュリティに備えてる。
<b>100ペタバイトまで対応</b>
docker-compose を用いて M1 Mac 等 ARM 系 CPU で動作する Apache, MariaDB, PHP の開発環境構築

# 目的

M1 Mac で PHP, MySQL もしくは MariaDB が動作する開発環境を作成する。
但し下記を満たすこと。
1. Mac 環境を汚さないように仮想環境を用いる
2. 動作速度が許容範囲内

# 結果

試行錯誤の結果、仮想マシン環境ソフトウェア Parallels Desktop で Fedora 35 Server の仮想環境を構築し、https://github.com/kotanbo/docker-lamp-for-arm を docker-compose で起動するようにした。

理想としては Docker Desktop で構築したかったが、動作速度が遅く許容できなかったため、Linux の仮想環境内で Docker を利用することとした。

当初は MySQL で構築していたが、ある程度大きいダンプファイルをインポートすると下記エラーとなって落ちるので MariaDB を選択した。

```text
2022-01-16T03:04:41.549704+09:00 0 [ERROR] [MY-013183] [InnoDB] Assertion failure: ddl0buffer.cc:204:ptr < bounds.second thread 281470673346800
InnoDB: We intentionally generate a memory trap.
InnoDB: Submit a detailed bug report to http://bugs.mysql.com.
InnoDB: If you get repeated assertion failures or crashes, even
InnoDB: immediately after the mysqld startup, there may be
InnoDB: corruption in the InnoDB tablespace. Please refer to
InnoDB: http://dev.mysql.com/doc/refman/8.0/en/forcing-innodb-recovery.html
InnoDB: about forcing recovery.
18:04:41 UTC - mysqld got signal 6 ;
Most likely, you have hit a bug, but this error can also be caused by malfunctioning hardware.
Thread pointer: 0x0
Attempting backtrace. You can use the following information to find out
where mysqld died. If you see no messages after this, something went
terribly wrong...
```

# 構築手順

#### Fedora 35 Server 構築

1. https://getfedora.org/ja/server/download/ から aarch64 イメージをダウンロード
2. Parallels Desktop を使ってイメージから Fedora 35 Server をインストール

#### Parallels Tools インストール

Mac と Fedora 35 Server 間でファイル共有するためにインストール
参考：https://download.parallels.com/desktop/v17/docs/ja_JP/Parallels%20Desktop%20User's%20Guide/32791.htm

1. Parallels のメニュー "処理" をクリックして "Parallels Tools のインストール" を選択
2. Fedora 35 Server に SSH 接続
3. Parallels Tools インストールディスクイメージをマウントしてインストール

```sh
$ cd /media/
$ mkdir cdrom
$ mount -o exec /dev/cdrom /media/cdrom
$ cd cdrom/
$ ./install
```

#### Docker, docker-compose 構築

参考：https://matsuand.github.io/docs.docker.jp.onthefly/engine/install/fedora/  

1. Fedora 35 Server に SSH 接続
2. Docker, docker-compose インストール  

```sh
$ dnf install dnf-plugins-core
$ dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo
$ dnf install docker-ce docker-ce-cli containerd.io
$ systemctl enable docker
$ systemctl start docker
$ dnf install docker-compose
$ chmod +x /usr/bin/docker-compose
```

#### ソース共有

1. https://github.com/kotanbo/docker-lamp-for-arm をクローン
2. Parallels のメニュー "デバイス" => "共有" => "構成" を選択
3. クローンしたプロジェクトを共有  
Fedora 35 Server 内の "/media/psf/" に共有される

#### Apache, MariaDB, PHP 起動

https://github.com/kotanbo/docker-lamp-for-arm/blob/main/README.md の "Usage" を参照
MontereyでXcode12.xを開く

##はじめに

こちらにもある通りmacOS MontereyではXcode13が必要条件になりました。


https://developer.apple.com/jp/news/?id=ufox7ci5


ですのでXcode12.xを入れているmacでは開けなくなってしまいます。

![スクリーンショット 2022-01-22 15.19.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552896/e21bb196-711f-d4b4-e1e9-b20d390c794a.png)
こんな具合に警告が出て立ち上げることができません。

ではどうするのか。。


##terminalから起動させる

terminalで

```
$ /Applications/Xcode\ 2.app/Contents/MacOS/Xcode
```
（※Xcode\ 2.appの部分はアプリ名なので人によって異なります）
と入力するだけです。

Finder内のアプリケーションからドラックアンドドロップすると \ 2.app/←アプリ名のところまで入力されるので、あとは**Contents/MacOS/Xcode**を入力するだけです

これでXcode12.xを起動させることができます。
termianlを閉じてしまうとXcodeも閉じてしまうので、開発している間は起動したままにしましょう。
PlatformIOでSTM32をLLで開発しようとしたらつまづいた話

# PlatformIOでSTM32をLLで開発しようとしたらつまづいた話

## やろうとしたこと

STM32CubeIDEに腹が立ったので（？）PlatformIOで開発しようとした。HALで記述したことはあったのでLLもノリでいけるやろって思ってやったら弾かれて泣いた。

## エラー内容

![スクリーンショット 2022-01-22 15.27.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628782/6b930bc1-3b41-af7a-8ff9-54fb9e054a77.png)

こんな感じで怒られた。

## 原因

PlatformIOの設定でLLが無効化されていた

## 解決策

`platformio.ini`に以下の内容を追記する。

```ini:platformio.ini

[env:nucleo_l011k4]
platform = ststm32
board = nucleo_l011k4
framework = stm32cube
; これより上は元々記述されてる

; ↓この行を追加する↓
build_flags=-D USE_FULL_LL_DRIVER

```

![スクリーンショット 2022-01-22 15.30.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628782/f2267cff-bc82-b2ec-f4e9-1b2ac0f4a0b7.png)

コンパイル通った。うれしい。

## 終わりに

おわりです。
技術書典12のオススメ本をピックアップします。

本日から技術書典12がやってますね。　

では気になった本をピックアップしていきます。　



１　[rubyとCoincheck取引APIを使った暗号資産取引プログラミング入門](https://techbookfest.org/product/6013866267901952?productVariantID=5475493795069952)


暗号資産の自作プログラミングですね。
これは需要ありそう。






２　[虎の穴ラボの薄い本。vol.5](https://techbookfest.org/product/6045315293511680?productVariantID=6092412562702336)


この内容で無料なのはすごいね。




３　[Unityチュートリアル ゼルダ風3Dアクションゲーム制作講座 スマホアプリ化対応](https://techbookfest.org/product/5403766700376064?productVariantID=5543603587776512)


お値段は少し高いが、ボリュームもあるし本格的な解説なので
これはオススメです。







４　[最高のおうちオフィスではたらく ～快適なリモートワーク環境の作り方～](https://techbookfest.org/product/5281591523803136?productVariantID=4639030710894592)




これもいい本ですね。　
リモートワークしている人は見たほうがいいですよ。









５　[UniTips Vol.8](https://techbookfest.org/product/6397159014400000?productVariantID=5969481874538496)


サイバーエージェントが出している　
本格的な解説書です。　　
私も毎回購入していますが、　とても勉強になります。






６　[2021年のディープラーニング論文を1人で読むアドベントカレンダー　下](https://techbookfest.org/product/6055647709757440?productVariantID=6618597663178752)


ディープラーニングの論文解説というのは　
とてもありがたいですね。　



７　　[ポケユナ攻略ガイドブック](https://techbookfest.org/product/6230975723864064?productVariantID=6205457242783744)


これ　私が書いた本です。
ポケモンユナイトを解説していますので　
ポケユナに興味のある方はぜひ御覧ください。
PostgreSQLのpsqlコマンドメモ

#概要
PostgreSQLのコマンドは色々あるけど、すぐ忘れてしまうのでそのメモ

#一覧

|No.|コマンド|内容|
|---|---|---|
|1|\d|テーブル一覧を表示させる|
|2|\i|SQLファイルの実行|
|3|\q|psqlの終了|

###テーブル一覧を表示させる(\d)
psqlのコンソールから入力可能

```sql:テーブル一覧表示
testdb=# \d
リレーション一覧
スキーマ|名前 |タイプ  |所有者
------------------------------------
public |test1 |テーブル | postgres
public |test2 |テーブル | postgres
```

###SQLファイルの実行
psqlのコンソールから入力可能

```sql:SQLファイルの実行
testdb=# \i SQLファイル名
```

**☆ターミナルからpsplコマンドの引数にSQLファイルをして実行することも可能**
Ex.)データベースユーザー名:user データベース名:testdb

```bash:ターミナルからのSQLファイル実行
bash$ psql -U user testdb < SQLファイル名
```

###psqlの終了

```sql:psqlの終了
testdb=# \q
```
【Project Euler】Problem 47: 素因数の個数

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

### 問題 47. 素因数の個数

原文 [Problem 47: Distinct primes factors](https://projecteuler.net/problem=47)

**問題の要約：正の整数の異なる素因数が4個になる数が初めて４つ連続する最初の数を求めよ**

異なる素因数の数は**sympy**の**factorint**の返すDICT型の長さを見れば分かります。

```python
import itertools
from sympy import factorint

ccnt = 0
for n in itertools.count(1):
  ccnt = ccnt+1 if len(factorint(n))==4 else 0
  if ccnt >= 4:
      break

print(f"Answer: {n-3}")
for i in range(n-3,n+1):
   print(i, factorint(i))
```

（開発環境：Google Colab）
【Project Euler】Problem 46: ゴールドバッハの他の予想

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

### 問題 46. ゴールドバッハの他の予想

原文 [Problem 46: Goldbach's other conjecture](https://projecteuler.net/problem=46)

**問題の要約：以下のゴールドバッハの他の予想が成り立たない最小の奇数の合成数を求めよ**

奇数の合成数は（素数$+$平方数 $\times 2$）の形で表すことができる
```math 
\begin{align}
9&=7+2 \times 1^2 \\
15&=7+2 \times 2^2 \\
21&=3+2 \times 3^2 \\
25&=7+2 \times 3^2 \\
27&=19+2 \times 2^2 \\
33&=31+2 \times 1^2 \\
\end{align}
```

```python 
import itertools
from sympy import primerange, isprime

def isSq(n):
  sq = n**(1/2)
  return sq == int(sq)

def isGconj(on): # check if a odd number follows Goldbach's other conjecture
  for pn in primerange(2,on):
    if isSq((on-pn)/2): return True
  return False

for on in itertools.count(9,2):    
  if isprime(on): continue     # on: Odd non prime  number
  if not isGconj(on):
    print(f"Answer is {on}")
    break
```
（開発環境：Google Colab）
【Project Euler】Problem 45: 三角・五角・六角数

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

### 問題 45. 三角・五角・六角数

原文 [Problem 45: Triangular, pentagonal, and hexagonal](https://projecteuler.net/problem=45)

**問題の要約：40755の次の三角・五角・六角数の共通の数を求めよ**

[Problem 44: 五角数](https://qiita.com/masa0599/items/71d76aaebd1509dbf3b9)と同様に各々の定義から2次関数を解いて三角・五角数判定関数を作ります。

```python 
import math
import itertools

def isTri(x):
	f = (-1.0 + math.sqrt(1+8*x))/2
	return (f - int(f) == 0)
 
def isPent(x):
	f = (.5 + math.sqrt(.25+6*x))/3
	return (f - int(f) == 0)


for n in itertools.count(143+1):
  hexa = n * (2*n-1)
  if isTri(hexa) and isPent(hexa):
    break
print(f"Answer: {hexa}")
```

（開発環境：Google Colab）
ReactRouter v6のSwitch⇒Routesでハマったときの解決法

#React Routerのv6を使ってみました

React Router(react-router-dom)を使ってルートパスにログインページ`<Login />`を置きたい場合、v5まではこんな感じで書いていた。

```react:v5の場合
    <Switch>
       <Route exact path="/">
         <Login />
       </Route>
    </Switch>
```

しかし、v6の場合Switchが見つからない・・・
#そもそもSwitchがRoutesに変わったらしい
そしてexactもなくなったらしい。v6ではすべて完全一致になるとのこと。
部分一致にしたい場合は"/*"みたいにワイルドカードを指定してあげればいいみたい。
まあここまではいい。

```react:Routesに変更
    <Routes>
       <Route path="/">
         <Login />
       </Route>
    </Routes>
```

これでいいかなと思いきや、なぜか表示されない・・・
デベロッパーツールでコンソールを覗くと、なにやらエラー吐いとる。

```
Uncaught Error: [undefined] is not a <Route> component. All component children of <Routes> must be a <Route> or <React.Fragment>
```

もしかして、`<Login />`がundefinedって言ってる？
調べてみるとこの書き方は出来ないっぽい。

#子ノードに入れるのではなく、element属性に突っ込むとok
```react:v6の場合
    <Routes>
       <Route path="/*" element={<Login />} />
    </Routes>
```
上記で解決。やっとログインページが見えました。
element属性に突っ込んでやる必要がありました。
すごいシンプルで見やすいかも。
JavaScript AJAX勉強

メソッドの使い方などなかなか覚えられないので、アウトプットして定着させる目的で書きます。。。

# Fetch



JavaScriptは必要な時にいつでもサーバーにリクエストを送れる。
- 入力データのSubmit
- ユーザーデータのロード
などが、ページをリロードしなくても可能になる。

JavaScriptからのリクエストはAJAX(Asynchronous JavaScript And XML)と呼ばれる。
歴史的な経緯からついた名前で、特にXMLを使う必要はない。

AJAXの方法の一つとして`fetch()`メソッドがある。
基本的な構文は以下。

```js
let promise = fetch(url, [options])
```
- url : リクエストを送るURL
- options : methodやheaderなど

`fetch()`はpromiseオブジェクトを返す。 
サーバーからの応答を見るため`then()`メソッドを使って、

Free fake APIでテスト。

https://jsonplaceholder.typicode.com/

```js
fetch('https://jsonplaceholder.typicode.com/todos/1')
  .then(response => response.json())
  .then(json => console.log(json))
```

```js:console
{
	"userId": 1,
	"id": 1,
	"title": "delectus aut autem",
	"completed": false
}
```

2行目の`response`はJavaScriptに組み込まれているResponseクラスのオブジェクト。
`response.status`でHTTPリクエストのstatusを見ることができる。

この状態ではbodyの情報にはアクセスできないので、`json()`メソッドを使ってオブジェクトにする必要がある。
実際に`json()`が返すのはpromiseオブジェクト。なので、`then()`を使ってチェーン状にすることができる。
なぜ`json()`がpromiseオブジェクトを返すのかというと、responseにはbodyの内容が含まれておらず、bodyの内容がロードされるまで待つ必要があるためらしい。
あまり理解できている自信がない・・・

https://stackoverflow.com/questions/32721850/why-is-the-response-object-from-javascript-fetch-api-a-promise


参考

https://javascript.info/fetch
GitHubでのコミットログの画像を変えたい

GitHubのコミットログの画像がGitHubのアカウント画像と違かった。

変更したくて調べてみると**git config**で見てみるといいらしい。


```
$ git config user.name
```

↑を実行すると以前のアカウントの名前になっていた。

```
$ git config --global user.name "現在のアカウント名"
```

これで変更した後、コミットしプッシュしてみると画像と名前が変わった。

理解が浅いかもしれないが、変更できた。
CentOS Stream8構築のための個人的備忘

CentOSは7系を最後に、それ以降はご無沙汰だった。最近になってCentOSサーバの構築に迫られたため、調べてみるとCentOS Streamというディストリビューションがメジャーな模様。
主流なコマンドも変わってきていると思うので、個人的な備忘録を残すことにした。
構築しながら内容を追記していこうと思う。

# ディレクトリ名を英語にする
```
LANG=C xdg-user-dirs-gtk-update
```
「Update names」を選択して再起動。再起動後は「古い名前のままにする」を選択。

# yumパッケージをupdate
```
$ yum check-update
$ yum update
```

# NWの設定
`nmcli`(Networkmanager Command Line Interface), `nmtui`(NetowrkManager Text User Interface)の2つのNW managerコマンドをよく使う。

##nmcliコマンド

```sh
# NIC状態の確認
$ nmcli device
DEVICE  TYPE      STATE     CONNECTION
enp0s3  ethernet  接続済み  enp0s3
lo      loopback  管理無し  --

# デバイスの設定を確認
$ nmcli device show
GENERAL.DEVICE:                         enp0s3
GENERAL.TYPE:                           ethernet
...

# NICが自動起動になっているか確認
$ nmcli device show enp0s3
...
connection.autoconnect:                 no
...

# NICの自動起動設定
nmcli connection modify enp0s3 connection.autoconnect yes

# ipv4に関するパラメータを取得
$ nmcli -f ipv4 con show enp0s3
ipv4.method:                            auto # DHCP有効
ipv4.dns:                               --
ipv4.dns-search:                        --
...

# IPアドレスを固定する
$ nmcli connection modify enp0s3 ipv4.method manual ipv4.addresses xxx.xxx.xxx.xxx/24

# NIC 落とし上げ
$ nmcli c down enp0s3 ; nmcli c up enp0s3
```

### nmtuiコマンド
text UIで直感的にNICの設定が可能。詳細は省略。

# firewall設定
`firewall-cmd`を使う。よく使うコマンドは次のとおり。  
恒久的な設定は`--permanent`を付与する

```sh
# 設定一覧を表示
$ firewall-cmd --list-all
# ポートを追加
$ firewall-cmd --add-port=80/tcp
# サービスを追加
$ firewall-cmd --add-service=http
# 設定をリロード
$ firewall-cmd --reload
```

# CUI起動設定
構築作業は基本的にCUIで行うため、CUIモードで起動するようにする。
`inittab`はもう使われなくなった模様。

```sh
$ cat /etc/inittab
# inittab is no longer used.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target
```
上記の指示に従う。

```sh
$ systemctl get-default
graphical.target
# runlevelは5
# runlevelを3にするには下記のようにすればよい
$ systemctl set-default multi-user.target
```

# rootユーザでのvimエイリアス
一般ユーザだと、`vi`は`vim`へのエイリアスが張られているため、予約語等に色がついていて見やすい。
rootユーザだとエイリアスが張られていないようである。なので`.bashrc`に下記を追記する。

```sh:.bashrc
alias vi='vim'
```
あとは`.bashrc`をリロードすればOK

```sh
$ source .bashrc
$ alias vi
alias vi='vim'
```
Enumに別名を与えて、拡張メソッドで取得する


メモ書き

#自前のカスタム属性
```csharp

using System;

[AttributeUsage(AttributeTargets.Field, AllowMultiple =false, Inherited =false)]
public class AliasNameAttribute: Attribute
{

    public AliasNameAttribute(string value)
    {
        this.AliasName = value;
    }

    public string AliasName { get; }
}

```

#カスタム属性を持つEnumを定義する

```csharp

public enum Fruits
{
    [AliasName("リンゴ")]
    Apple,
    [AliasName("オレンジ")]
    Orange,
    [AliasName("ブドウ")]
    Grape
}
```

#別名を取得する拡張メソッドを作る
```csharp
using System;
using System.Linq;

public static class AttributeExtention
{
    public static string ToAliasName(this Enum value)
    {
        return value
            .GetType()
            .GetField(value.ToString())
            .GetCustomAttributes(typeof(AliasNameAttribute), false)
            .Cast<AliasNameAttribute>()
            .FirstOrDefault()?.AliasName ?? value.ToString();
    }
}

```

#使い方

```csharp
// Apple → リンゴ
var appleName = Fruits.Apple.ToAliasName();
// Orange → オレンジ
var orangeName = Fruits.Orange.ToAliasName();
// Grape → ブドウ
var grapeName = Fruits.Grape.ToAliasName();
```
[Android]忙しい人のためのアーキテクチャガイドの要約～概要編～

#はじめに
###対象者
- 改定されたものの、忙しくてアーキテクチャガイドを熟読している暇などない人
- 読んでみたけども、何を言っているのか全く分からなかった人
- アーキテクチャがなぜ必要なのか分からない人
- 設計の原理原則を知りたい人

#目次
内容は、主に3つです。

###1. 設計の必要性
###2. Googleが推奨している設計パターン
###3. ベストプラクティス集

#1.設計の必要性
###UXの注意点
Androidアプリケーションは、ユーザーとAndroidOSの事を考えて開発する必要があります。

- ユーザーは、デバイス上のアプリを短時間の中で多くの操作を行うことがある。

- モバイルのリソースは限られているため、AndriodOSの最適化処理によっていつでも強制終了する可能性がある。

これを想定した時に回避すべきなのは

- コンポーネントがデータを持っていること
- コンポーネント同士が依存関係にあること

##原理原則について
そのために、大事なことは「責務の分離」

####関心の分離

例えば、Activity/FragmentはUIの描画または、エントリポイントだけを担当します。
これにより、コンポーネントが独立して機能することに繋がり、さらに、テストのしやすさにも繋がる。

####データモデルからUIを駆動する

AndroidOSによるプロセスの最適化によって解放されたり、ユーザーによっては通信環境が悪かったりと状況は様々。

そこで、データは確実に保存/保持して、そこからUIを設計していきましょうということを言っています。


#2. Googleが推奨している設計パターン
さて、どのように責務の分離をしていくのが良いのかGoogleの見解を見てみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599059/653ce695-07d3-a92f-cf55-f4de1d49a405.png)

##UI Layer
データの表示を担当

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599059/e4208a32-a1bf-9d86-4f49-7529986911ef.png)


###UI elements 
「整形」
データをレンダリングをして、表示させます。
例）ViewやJetpackCompose

###State holders
「保持」
UIに関するデータやロジックを保持します。
例）ViewModel

##Data Layer
「公開」
データを不変な値で持ち、アプリに一貫したデータを他のレイヤーに公開する役割。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599059/87043f17-c2b1-9589-ae3a-fa958c685f8b.png)

###Repository
「一元化」
データソースへのアクセスを一元化します。
（UI LayerからData Layerへのエントリポイント）
UI Layerは、データがどこからきているかを知りません。

###Data Sources
「操作」
データソースへの読み書きを行います。
つまり、アプリとデータソースとの仲介役ともいえます。
一つの情報源につき、一つのデータクラスを定義するのが良いです。


##Domain Layer
「集約」
いわゆる、ユースケース。

ViewModelの大量発生によるビジネスロジックの重複の回避などを担当。
ここは、optionとあるので必要に応じて責務を分けるのが良い。

#3. ベストプラクティス集
飛ばしましたが、依存関係を提供してくれるクラスを定義することでスケーリングに繋がります。
Androidでは、Hiltを用いることが推奨されます。

####コンポーネントは破棄されやすいので、そこでデータを保持しないこと
####Androidクラスへの依存を減らす（？：良く分からなかった・・）
####モジュールは、明確に分けて、なるべく独立させる
####車輪の再発明で労力を無駄にしない（Jetpack使ってね！むふふ・・）
####単体テスト可能にする
####通信状況が悪い時でもUXを維持するために、ローカルDBを出来る限り最新に保つ

##おわりに
いかがだったでしょうか。

次回は、UIレイヤーについて要約したいと思います。
##参考
https://developer.android.com/jetpack/guide?continue=https%3A%2F%2Fdeveloper.android.com%2Fcourses%2Fpathways%2Fandroid-architecture%23article-https%3A%2F%2Fdeveloper.android.com%2Fjetpack%2Fguide
【ExcelVBA】文字列を改行コードごとに分割して下のセルに貼り付ける

# はじめに
個人的に実施している作業の中で、「文章をセルに貼り付け、それを改行ごとに分割して下のセルに貼り付ける 」という作業があったのでマクロを組んでみました。
特定の行・列に対する操作ではないので、アクティブセルに対して作業を行うマクロとなります。

# 作業内容
1.アクティブセルを取得
2.改行コードごとに文字列を分割
3.分割した文字列を下のセルに貼り付け(ループ)

# コード

```VBA:ExcelVBA
Option Explicit
Sub splitSentencesByLine()
    'アクティブなセルを取得
    Dim sentence As Variant

    sentence = ActiveCell.Value
    
    '改行コードごとに文字列を分割
    Dim tmp As Variant
    tmp = Split(sentence , vbLf)
    
    Dim i, j As Integer
    Dim deleteCharPlace As Long

    j = 0
    
    For i = 0 To UBound(tmp)
        '下のセルに貼り付け
            Cells(ActiveCell.Row + j, ActiveCell.Column) = tmp(i)
            j = j + 1
    Next
    
End Sub
```

# 動作
・マクロ動作前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/942596/4bb6473c-844f-f110-7b62-40d0dff3481c.png)

・マクロ動作後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/942596/ead500e4-b68d-162a-1d56-a78efeca6262.png)


# 参考にしたサイト

・[VBAで文字列を改行コードで分割する](https://vbabeginner.net/split-line-feed/)
・[VBA セルの位置を取得する](https://www.tipsfound.com/vba/07022)
LaravelのAuth::attempt()がfalseを返し続ける

#TL;DR
パスワードはハッシュしてストアしましょう

#経緯
久々にLaravelの認証を触ったら小一時間ほどハマった……

#問題部分のコード
本当は例外処理を色々書いてるけど、削ってシンプルにしてます。

- ``register``メソッド：「名前」「メールアドレス」「パスワード」を入れると``User``を一つ``create``する。
- ``login``メソッド：「メールアドレス」「パスワード」を入れると、``Auth::attempt``で該当する``User``を拾ってくる。次にトークンを生成し、cookieにくっつけて``User``と一緒に返す。

という、とても典型的な認証処理です。

```php:App\Http\Controllers\AuthController.php
class AuthController extends Controller
{
    public function register(Request $req){
            $user = User::create(
                $req->only("name","email","password")
            );
            $jwt = $user->createToken("token")->plainTextToken;
            $cookie = cookie("jwt",$jwt, 60 * 24);
            return response(["user"=>$user]);
    }
    public function login(Request $req){
        if(!Auth::attempt($req->only("email","password"))){
            return response([
                "error" => "invalid credentials"
            ],Response::HTTP_UNAUTHORIZED);
        }
        $user = Auth::user();
        $jwt = $user->createToken("token")->plainTextToken;
        $cookie = cookie(
            "jwt",$jwt, 60 * 24
        );
        return response([
            "user"=>$user
        ])->withCookie($cookie);
    }
```

#発生した問題
``AughController::login()``がうまく動かない……。
``php artisan tinker``で調べてみたところ、どうも``Auth::attempt``の挙動がおかしい様子。正しいemailとpasswordを入れているのに``false``を返す。

#原因と解決
``Auth::attempt``はパスワードがハッシュされている前提で``users``テーブルを検索します。したがって``register``メソッド内で``User::create()``する際、パスワードはハッシュしてストアしなければならないとのこと。**ド基本だよ！！！**
というわけで、registerメソッドを以下のように変更します。

```php
    public function register(Request $req){
            $user = User::create([
                "name"=>$req->input("name"),
                "email"=>$req->input("email"),
                "password"=>Hash::make($req->input("password")),
            ]);
            $jwt = $user->createToken("token")->plainTextToken;
            $cookie = cookie("jwt",$jwt, 60 * 24);
            return response(["user"=>$user]);
    }
```
久々に触ると基本的なことも分かんなくなっているもんですな……。
バカ！バカ！あたいのバカ！
というわけで備忘録として残しておきます。

参考　[Auth::attempt($credentials) Always returns false in Laravel 8.76.2 -Stack Overflow](https://stackoverflow.com/questions/70421963/authattemptcredentials-always-returns-false-in-laravel-8-76-2)
Ubuntuにmariadbをバージョン指定でインストールする方法

Ubuntu20にmariadb10.4をインストールするのにハマったのでメモ。

mariadbをインストールする記事はあちこちにあるけど、バージョン指定してインストールする方法に関して記載がない。ここではバージョンを指定してインストールする方法を提示する。

## 「mariadb install repository」でググる

以下のページがヒットする。
https://mariadb.com/kb/en/mariadb-package-repository-setup-and-usage/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53489/5adba126-1eca-8fb5-c7d9-05a4d44a9f70.png)

この中ごろにきてる

```
curl -LsS https://r.mariadb.com/downloads/mariadb_repo_setup | sudo bash
```

がmariadbとその周辺ツールのインストールの基本。これでパッケージのリポジトリが指定できる。

基本はここに書かれている通りでいいのだが、途中にconfigration toolへのリンクがある
https://mariadb.org/download/?t=repo-config
一見するとインストール先のOSやLinuxのディストリビューション毎のセットアップができるように見えるが、接続先のミラーサーバーの署名が不正などの理由でUbuntu20上に10.4のリポジトリは登録できなかった。
結局はconfigration toolに頼るよりも

```
curl -LsS https://r.mariadb.com/downloads/mariadb_repo_setup | sudo bash
```

だけで大半のことはできる。
そして肝心のバージョン指定方法は

```
curl -LsS https://r.mariadb.com/downloads/mariadb_repo_setup | sudo bash -s -- --mariadb-server-version="mariadb-10.4"
```

と、`--mariadb-server-version` という引数でバージョンを指定するだけ。これで10.4のリポジトリを指すので、あとは

```
sudo apt-get install mariadb-server mariadb-client
```

と本体をインストールする。
Google Cloud Directory Sync（GCDS）でActive Directoryから同期する


# はじめに
Google Cloud Directory Sync（GCDS）とは、Active DirectoryやAzure ADのような、企業で利用中のドメコンに登録しているユーザーやグループを、Google Workspace や Cloud Identityのユーザーやグループに同期するツールです。
Linux版とWindows版があります。

# 構成
![GCDF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51320/89212763-4723-6e90-bf34-b78ef24595c2.png)

Active Directoryは、AWSのEC2上に構築しています。
マネージドサービスも存在しますが、検証用なのでお手頃に。

今回の肝となるGCDSも、AWS上に置いておきます。今回はWindows版を選択しました。
GCDSは、以下のサイトの一番上の図のようにGCEにデプロイすることも可能ですが（もしかしたら、この図の意図はサービスの主幹だけなのかも）、Active Directoryに近いところに置いておいた方が無難です。
複数のドメコンを１つのGCDSで集約する場合など、離れた場所に置く場合は経路の暗号化などの対策を。
https://cloud.google.com/architecture/identity/federating-gcp-with-active-directory-introduction

# 実施手順

## Active Directoryの設定
GCDSを使うための特別な設定変更は不要です。

蛇足ですが、検証用ADサーバーを立てる際に、クライアント端末からWorkGroupに参加できないエラーに当たりました。
結果、Security Groupの設定をミスっていたのですが、以下のサイトですごくロジカルなトラブルシューティングができました。オススメ！
https://theitbros.com/active-directory-domain-controller-could-not-be-contacted/

## GCDFのデプロイと設定
デプロイはダウンロードしたインストーラーを叩くだけですし、実行もGUIで行えます。
公式サイトも充実しています。以下あたりが参考になりました。
https://cloud.google.com/architecture/identity/federating-gcp-with-active-directory-synchronizing-user-accounts
https://cloud.google.com/community/tutorials/gcds-use-cases-common-and-complex
https://support.google.com/a/answer/3011361?hl=en

お試し環境構築時に、以下のエラーメッセージに直面しました。

```
Failed to execute query because neither the search rule, nor the LDAP connection settings specify a Base DN. To resolve this error please specify a Base DN in either the search rule or the LDAP connection settings. The Base DN provided in LDAP connection settings is used for fallback if a search rule doesn't have its Base DN specified, reason: NameNotFoundException - [LDAP: error code 32 - 0000208D: NameErr: DSID-0310021C, problem 2001 (NO_OBJECT), data 0, best match of:
```

LDAP Configurationのポート変更（389 -> 3268）で解消しました。（先に挙げた公式サイトにも記載されている内容でした。）


設定次第で、双方向同期や片方向同期どちらも可能です。
例えば、合併などである会社の所有していたADサーバー上から、ユーザーを片方向同期するような使い方が想定されます。

## 実行
GCDFには、DryRun的に実行するSimulate Sync機能があります。
最初の実行はSimulate Syncの内容を確認してから実施することを強くお勧めします。

このように、差分を確認することが可能です。
![Screenshot at Jan 22 12-48-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51320/fc72046d-7f43-534b-0d63-a6ff7100fb05.png)

双方向同期する場合は、実行をスケジュールタスクに登録して自動化しておきましょう。

# まとめ
ドメコンは、自己学習くらいにしか触っていない自分でも、GCDFにより、お手軽＆直感的にドメインユーザーの連携ができました。
実際には利用するには、細かなチューニングが必要になるケースもありますが、GCDFの除外設定などで制御可能なことも多いです。
気になった方は一度、直接触ってみましょう！
[MySQL] ERROR 1045 (28000): Access denied for user 'xxx'@'xxx.xxx.xxx.xxx'  (using password: YES) の対処法

# エラー
```
ERROR 1045 (28000): Access denied for user 'ユーザー名'@'クライアントのグローバルIP' (using password: YES)
```

# コマンド
```
mysql -h <hostname> -u <username>@<servername> -p <password>
```

# 正しくは
```
mysql -h <hostname> -u <username>@<servername> -p<password>
```

-pオプションの後にスペースを入れてはいけない。

# 参考
https://www.dbonline.jp/mysql/connect/index3.html
生物系のためのR超入門 (7) 【パッケージとインストール】

#0. はじめに
今回は**パッケージ**というものについて扱います。
必要に応じてパッケージをインストールし、利用することでたくさんの便利な機能を用いることができます。
あまり難しいことではないので、気楽にいきましょう。

【前回の記事はこちら】

https://qiita.com/Surku/items/ae16d444d6c22b0dc4e6

##0-1. この記事の達成目標
- パッケージがインストールできる。
- パッケージ内の関数を実行できる。

##0-2. 初めて登場する関数
- `inststall.packages("パッケージ名")`
 - パッケージをインストールします。
- `library("パッケージ名")`
 - パッケージを読み込みます。
- `ggplot()`
 - 詳細はいずれ扱います。図表を描く関数です。   

#1. パッケージとは？
**パッケージ**を簡単に説明すると「Rにデフォルトで入っている関数**以外**の関数集」です。
Rで実際に実験のデータを統計処理するようになると、デフォルト関数だけではできないことが多数出てきます。例えばやや複雑な図表の作製や、多重比較検定でのアルファベット振りなど…です。
そうした処理を可能にする関数がいくつかまとまって、パッケージという形でインターネット上に多数存在しています。
図表の作製には`ggplot2`パッケージや多重比較の際には`multcomp`パッケージなどがしばしば登場します。
自分のやりたい処理に応じて、必要なパッケージをインストールすることで、デフォルト以外の関数を用いることができます。

#2. インストールの仕方
パッケージのインストールの仕方にはいくつか方法がありますが、ここでコード`inststall.packages()`を使う方法を紹介します。

使い方は簡単で、引数にパッケージ名をダブルクォーテーション`""`で括って指定するだけです。
ためしに、`ggplot2`パッケージをインストールしてみましょう。
何も問題なければ、文字がバババッと出てきて、最後に「The downloaded XXXXX packages are in XXXXX」というメッセージが表示され、インストールが無事終了します。

```R
> install.packages("ggplot2")
####
いっぱいメッセージが出てきます
####
The downloaded XXXXX packages are in XXXXX
```

もし、エラーメッセージ等が出てきてインストールがうまくいかない場合は、以下の記事様がお詳しいのでご覧ください。

https://qiita.com/fujino-fpu/items/543a05044f58cde37eb3

http://ryotamugiyama.com/2020/08/03/rinstall/

#3．パッケージ内の関数の使い方
では、パッケージ内の関数を試しに使っていきましょう。
今回は`ggplot2`パッケージの`ggplot()`関数を例にします。
`ggplot2`の使い方や詳細は、またいずれまとめたいと思いますが、今回はRにデフォルトで入っているデータフレーム`iris`のデータを`ggplot()`でカラフルな散布図にしたいと思います。
コードの細かい内容は気にせず、とりあえず真似してみてください。

パッケージ内の関数を使うためには前項の`install.packages()`に加えて、読み込み`library()`が必要です。`library()`の引数にパッケージ名をダブルクォーテーション`""`で括って指定します。
`install.packages()`は最初に1回だけすればよいのですが、読み込みの`library()`はRを終了するとリセットされてしまうので、再度の実行が必要になります。

```R
> #library()をしないで実行するとエラー
> ggplot(iris, aes(x = Sepal.Length, y = Petal.Length, color = Species))+geom_point()
Error in ggplot(iris, aes(x = Sepal.Length, y = Petal.Length, color = Species)) : 
  could not find function "ggplot"

> #library()をしてから実行
> library("ggplot2")
> ggplot(iris, aes(x = Sepal.Length, y = Petal.Length, color = Species))+geom_point()
```
右下の画面に散布図が表示されたらOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445663/3aabebf1-e420-b5fb-c40b-b3c0a1a55496.png)

#4. 次回
https://qiita.com/Surku/items/11f7042874b5cde8f901
Kubernetes the hard wayする ~3.クライアント設定作成編~

# はじめに
本記事は「Kubernetes the hard wayする ~2.CA、秘密鍵、及び証明書作成編~
」の続きです。CKA取得を目指し、Kubernetes the hardwayに取り組んだ際、各章で何をやっているのかをメモしたものを投稿していきます。
本記事では元ドキュメントの「Generating Kubernetes Configuration Files for Authentication
」の部分をやっていきます。元ドキュメント及びコマンド等は以下のURLを参照のこと。
https://github.com/kelseyhightower/kubernetes-the-hard-way/blob/master/docs/05-kubernetes-configuration-files.md

# クライアント設定作成
前回作成した証明書および秘密鍵をもとに、controller-manager, kubelet, kube-proxy, scheduler, adminユーザ用の`.kubeconfig`ファイルを作成する。

## kubeapiserverのLB用IPアドレスを取得する
`.kubeconfig`ファイルはapiserverのアドレスを含むため、あらかじめapiserverのIPアドレスを知っておく必要がある。kubeapiserverのLB用に作成したIPアドレスを取得する。

```
KUBERNETES_PUBLIC_ADDRESS=$(gcloud compute addresses describe kubernetes-the-hard-way \
  --region $(gcloud config get-value compute/region) \
  --format 'value(address)')
```

## 各コンポーネントとユーザ用の.kubeconfigファイルを作成する
`.kubeconfig`ファイルを作成する際は、`kubectl`コマンドの`--kubeconfig`オプションで、作成や追記を行う`.kubeconfig`ファイルのパスを指定する。
`kubectl`コマンドで`.kubeconfig`ファイルを作成する際は、`set-cluster`、`set-credentials`、`set-context`サブコマンドを使用する。それぞれ`.kubeconfig`ファイルの`cluster`、`users`、`contexts`エントリを作成する。

各コンポーネントの`.kubeconfig`ファイルを作成する際の引数はほぼ同じだが、serverのIPアドレスが以下のように異なる。

* kubelet, kube-proxy：LBのIP
* kube-controller, kube-scheduler, adminユーザ：127.0.0.1

これはkubeletおよびkube-proxy用ファイルはworkerノードに配布し、kube-controller、kube-scheduler、adminユーザ用ファイルはcontrollerノードに配布して各コンポーネントのセットアップに使用するため。
また、user名の指定がadminユーザ用のファイルは`admin`を指定し、その他のファイルは`system:<コンポーネント名>`を指定する。

## 作成した.kubeconfigファイルを配布する
作成した`.kubeconfig.`ファイルのうち、kubelet、kube-proxyはworkerノード、controller-manager、scheduler、adminユーザ用ファイルはcontrollerノードに配布する。

# まとめ
前回の記事で作成した秘密鍵と証明書をもとに、Kubernetesのいくつかのコンポーネントで使用する`.kubeconfig`ファイルを作成した。`.kubeconfig`ファイルのいくつかの設定はコンポーネントにより異なる。作成した`.kubeconfig`ファイルをworker、controllerノードに配布した。
CentOS Stream8 でrootパスワードを忘れてしまった時の対応

CentOS Stream9をVirtualBox上で構築中、ついうっかりrootパスワードを忘れてしまったのでリセット方法をメモ。

1. カーネル選択画面で`e`を押下して編集モードに入る
1. `linux ($root)/vmlinuz-5.14.0-30.el9.x86_64 .......rd.lvm.lv=cs/swap rhgb quiet`の記述を探し、`rhgb quiet`の記述を削除
1. 削除したところに`rw init=/bin/sh`を記述
1. `Ctrl-x`で起動
1. shが起動したら、次のようにする。

```sh
passwd
# リブート後にラベルをつけ直すよう、空ファイルをtouchする。
#これがないと”Sorry, that didn't work. Please try again.”と言ってログインできない。
touch /.autorelabel
exec /sbin/init
```
これで問題なくパスワードがリセットされた。
PowerShellのプロンプト切り替え関数

## はじめに
PowerShellでプロンプトを設定した後に、元に戻す方法がわからなくて試行錯誤しました。設定の変更には`prompt`という組み込み関数の定義を変更する必要があります。元に戻す関数を定義すれば良いだけなのですが、一時的に切り替えて、また元に戻したかったので、トグルさせる関数を定義してみました。

## 初期値の確認
元に戻すためには、初期値を知る必要があります。下記のコマンドで確認をします。
`(Get-ChildItem function:prompt).Definition`
結果は下記のようになっていました。

```
"PS $($executionContext.SessionState.Path.CurrentLocation)$('>' * ($nestedPromptLevel + 1)) ";
# .Link
# https://go.microsoft.com/fwlink/?LinkID=225750
# .ExternalHelp System.Management.Automation.dll-help.xml
```
* 参考：[プロンプトについて - PowerShell(Prompt 関数の取得)](https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_prompts?view=powershell-5.1#getting-the-prompt-function)

コメント部分は不要なので、最初の行だけを利用します。
従って、プロンプトを初期値に戻すには、下記のようにすれば良いことになります。

```PowerShell
function prompt {
    "PS $($executionContext.SessionState.Path.CurrentLocation)$('>' * ($nestedPromptLevel + 1)) "
}
```

## プロンプト切り替え関数の定義
いつでも呼び出して使えるようにするには、`$profile`ファイルに関数として登録すれば良いのですが、「変更」と「元に戻す」を1つの関数で実現したくなり、試行錯誤しました。現在のプロンプトの値を得るのは`prompt`関数の呼び出しになるので、単純に`prompt`関数の中で判定して切り替えることはできません。そこで、動作をトグルする関数を定義して、その中で関数定義を切り替えることにしました。「変更」する場合のプロンプトを`"PS > "`としたので、現在の`prompt`がこれと等しいかどうかを判定して切り替えます。この判定部分と`else`の定義部分との文字列は同じにする必要があります。関数を抜けた後でも有効にするために、`function`定義は、`global:prompt`とする必要がありました。

* 参考：[関数の概要 - PowerShell(関数スコープ)](https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_functions?view=powershell-5.1#function-scope)
* 参考：[`$profile`ファイルの編集手順](https://qiita.com/e4rfx/items/243a19d7853a2a585422#%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%81%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)

### コード
```PowerShell
function toggle_prompt {
	if ((prompt) -eq "PS > ")
		{function global:prompt {"PS $($executionContext.SessionState.Path.CurrentLocation)$('>' * ($nestedPromptLevel + 1)) "}}
	else
		{function global:prompt {"PS > "}}
}
```
## 確認環境
* Windows10 Home 21H2
* PoweShell 5.1

## 参考
* [プロンプトについて - PowerShell](https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_prompts?view=powershell-5.1)
* [関数の概要 - PowerShell](https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_functions?view=powershell-5.1)

## おわりに
技術的にこれが最適かどうかはわかりませんが、とりあえず自分がやりたかったことは実現できました。
Supervisorのバージョン確認コマンドで若干詰まった

# 概要

- Supervisorのバージョン確認コマンドで若干詰まったので簡単にまとめる。

# 詰まった内容

- とあるサーバーで動作中のSupervisorのバージョン確認をしようとして下記コマンドを実行した。

    ```terminal
    $ supervisorctl version
    ```

- 下記の様にエラーが返された。どうやら当該のユーザーには実行権限がないそうだ。supervisorctlコマンドはrootユーザーじゃないといけないらしい。

    ```termianl
    $ error: <class 'PermissionError'>, [Errno 13] Permission denied: file: /usr/local/lib/pythonX.X/site-packages/supervisor/xmlrpc.py line: 560
    ```

- 下記コマンドを実行したがcommand not foundが帰ってくる。

    ```terminal
    $ sudo supervisorctl version
    ```

- 念の為当該のサーバーにrootユーザーでログインして下記コマンドを実行してもcommand not foundが帰ってくる（そりゃそうだ。）

    ```terminal
    $ supervisorctl version
    ```

# 解決内容

- rootユーザーにはsupervisorctlコマンドのパスが通ってないだけだった。下記の2通りで解決できる。
    1. rootユーザー以外で下記コマンドを実行する。

        ```temrinal
        $ sudo /usr/local/bin/supervisorctl version
        ```
    1. rootユーザーでログインして下記コマンドを実行する。

        ```terminal
        $ /usr/local/bin/supervisorctl version
        ```
Macで文字コードを確認、変更する方法

CSVファイルを読み込めなく、文字コードを変更しようとしたら苦戦したので、記録として残しておきます。




##状況
Windowsではメモ帳から文字コードを変更できた。
Macでテキストエディットから文字コード(SJIS)を変更しようとしたけど、うまくいかない。
変更できないので、CSVファイル読み込み時にエラーが発生する。


##環境
Homebrewがインストールされている


##解決方法
＜結論＞
コンソールから変更しました。
nkfコマンドというものを使用。

<br>
＜方法＞
nkfをインストール
```brew install nkf```

ファイルの文字コード確認
```nkf -g [ファイル名]```
UTF-8が出力

SJISではなかったため、変換
```nkf -s [ファイル名] > [新しいファイル名]```

作成したファイルがSJISか確認
```nkf -g [新しいファイル名]```

SJISと出力されれば、変更完了。
無事読み込みできました。

<br>
###参考サイト
https://atmarkit.itmedia.co.jp/ait/articles/1609/29/news016.html
似ている画像を探したい　Pythonでかんたんに画像の類似度を計算する

#Pythonで画像の類似度を数値にする方法です


|source|compare|distance|
|---|---|---|
|<img width="128" alt="pancake" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/14ea2185-40d8-6a2f-2df0-f7421e6c9f4d.png">|<img width="128" alt="pancake" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/14ea2185-40d8-6a2f-2df0-f7421e6c9f4d.png">|**0.0**|
|<img width="128" alt="pancake" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/14ea2185-40d8-6a2f-2df0-f7421e6c9f4d.png">|<img width="128" alt="pancake" src="https://user-images.githubusercontent.com/23278992/150622506-4cc4f865-eed2-48ef-bc7f-c140e7eadf3d.png">|**20.9**|
|<img width="128" alt="pancake" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/14ea2185-40d8-6a2f-2df0-f7421e6c9f4d.png">|<img width="128" alt="pancake" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/8753fed6-1113-fe93-6de9-f419fe2696c1.jpeg">|**30.8**|


#膨大な画像から似た画像を探すのはたいへん
現代は画像があふれる時代ですが、似ている画像を目で探すのは大変です。

#類似度を数値化すれば、自動で探せる
画像感の類似度を数値化できれば、その数値を比較して、もっとも似ている画像をかんたんに探せます。

#機械学習モデルをつかって画像類似度を数値化してくれるimgsim



#手順

imgsimをインストールして、画像を768の数値に埋め込み、埋め込み間の差分を計算する。

```python
import imgsim

img0 = cv2.imread("cake.jpg")
img1 = cv2.imread("pancake.jpg")

vtr = imgsim.Vectorizer()
vec0 = vtr.vectorize(img0)
vec1 = vtr.vectorize(img1)

dist = imgsim.distance(vec0, vec1)

print("distance =", dist)
```

>distance = 20.859903

出てきた数値が小さければ小さいほど、似ていると評価されている。

以下の例で言うと、
いちごケーキといちごケーキは同じ画像なので差分が０。
いちごケーキといちごパンケーキの方が、いちごとライオンよりも似ている、ということになる。

|source|compare|distance|
|---|---|---|
|<img width="128" alt="pancake" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/14ea2185-40d8-6a2f-2df0-f7421e6c9f4d.png">|<img width="128" alt="pancake" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/14ea2185-40d8-6a2f-2df0-f7421e6c9f4d.png">|**0.0**|
|<img width="128" alt="pancake" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/14ea2185-40d8-6a2f-2df0-f7421e6c9f4d.png">|<img width="128" alt="pancake" src="https://user-images.githubusercontent.com/23278992/150622506-4cc4f865-eed2-48ef-bc7f-c140e7eadf3d.png">|**20.9**|
|<img width="128" alt="pancake" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/14ea2185-40d8-6a2f-2df0-f7421e6c9f4d.png">|<img width="128" alt="pancake" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/8753fed6-1113-fe93-6de9-f419fe2696c1.jpeg">|**30.8**|

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
AWS セキュリティグループの上限値について

セキュリティグループに付与するルールはデフォルト60個までですが、AWS側に申請を行うことで増やすことが出来ます。
しかし、ネットワークインターフェイスのセキュリティグループの数 * 各セキュリティグループのルール数を超えた申請は出来ません。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/increase-security-group-rule-limit/
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/amazon-vpc-limits.html#vpc-limits-security-groups

Trusted Advisor のパフォーマンス
EC2 セキュリティグループルールの増大
EC2 インスタンスセキュリティグループルールの増大


Service QuotasのAmazon Virtual Private Cloud (Amazon VPC)の下記値を乗算した値が1000を超えない申請であればOK
Inbound or outbound rules per security group
Security groups per network interface
【python初心者】iRIC3.0以降に含まれるminicondaを使って「現場のための水理学」令和版を動かしてみた

# はじめに
Python使ってみたいけど、何から初めて良いかわからなかった筆者が、iRICに含まれるminicondaを使ってPython動かしてみたという記事です。
以下のような人には参考になると思います。
・iRICを使って河川の数値解析を行う人
・Python初心者

# 「現場のための水理学」令和版
[「現場のための水理学」](https://river.ceri.go.jp/contents/tool/suirigaku.html)は、私のような河川技術者にはバイブルのような資料なのですが、北海道大学の清水先生が令和版としてリニューアルしてくれました。
そして、Pythonコードも公開されているので、誰でも水理学の勉強ができてしまいます。

https://i-ric.org/yasu/nbook2/index.html

# iRIC3.0以降をインストール
iRICソフトウェアは、水工学に係る数値シミュレーションのプラットフォームで、無償で利用することができ、筆者も開発のお手伝いをしています。
iRIC3.0以降をインストールすると、python用仮想環境minicondaが一緒にインストールされます。スタートメニューにanaconda3 > anaconda prompt(miniconda3)がインストールされていればOKです。
必要に応じてiRICのメンテナンス更新を行い最新版にしてください。

https://i-ric.org/ja/


iRICとPythonの連携は、以下の記事が参考になります。
https://qiita.com/Kazutake/items/b425d5f017dc4ad97d78


# miniconda にモジュール追加
iRICで一緒にインストールされるモジュール群だけでは足りなかったようで、以下のモジュールを追加します。
anaconda prompt(miniconda3)を起動し、以下のコマンドを入力。

    conda install numpy
    conda install matplotlib
    conda install pyyaml
    conda install numba
    

# windowsに図化ソフト追加
動画保存に必要な、imagemagickというソフトをインストールします。
動画保存には他にも方法があるようですし、動画保存の部分を使わなければ必須ではありません。
http://www.imagemagick.org/script/download.php#windows


# pyファイルの保存＆ソースコードの書き換え
[現場のための水理学（令和版）](https://i-ric.org/yasu/nbook2/index.html)から移流項の計算や1次元河床変動のPythonコードをgithub経由でダウンロードします。
清水先生の公開されているソースコードそのままでは、yamlファイル読み込み時（1D、2D計算）に下記エラーがでるため、一箇所書き換えが必要でした。
セキュリティ上の問題でしょうか？Pythonには詳しくないので、別の方法でも可能かもしれません。 

■実行時エラー

    Traceback (most recent call last):
      File "main.py", line 15, in <module>
      config = yaml.load(yml)
    TypeError: load() missing 1 required positional argument: 'Loader' 

■書き換え箇所
config = yaml.load(yml)
↓
config = yaml.safe_load(yml)


# 実行方法
anaconda prompt(miniconda3)で、ソースの保存フォルダに移動し、以下のようなコマンドで実行すると、結果が表示されます。
動画保存までにはやや時間がかかりますが、ちゃんと終わります。

[後進差分](https://i-ric.org/yasu/nbook2/01_Basics_0.html#python)

    python backward.py

[1次元河床変動](https://i-ric.org/yasu/nbook2/07_Chapt07.html#python)

    python main.py config_mound


# おわりに
[現場のための水理学（令和版）](https://i-ric.org/yasu/nbook2/index.html)は、移動床河川水理学の基礎知識など、参考文献がこの資料を参照するだけで網羅されるので、たいへん有用な資料です。これを期に、Pythonや水理学の勉強を初めて見たい人は是非お試しください。
データベース、SQL・MySQLの基礎（テーブルの作成から削除）

#①SQLとは
RDBのデータ構造を定義したり、データを操作（登録、削除）するデータベース言語。

基本的な文法は主に4つで、DDL、DML、DCL、TCL。今回はこの中でもDDLとDMLに着目。

#DDL（Data Definition Language）
テーブルの作成やテーブルの更新、削除等を行う文。DDLにある文は以下の3つ。

##CREATE
テーブルの作成

##ALTER
テーブルの変更

##DROP
テーブルの削除

#DML(Data Manipulation Language)
データ操作言語と呼ばれており、SQLの中で最も頻繁に使用する言語。
主に以下の4つの文がある。

##SERECT
データの参照

##INSERT
データの挿入

##UPDATE
データの更新

##DELETE
データの削除

#早速利用してみる
##テーブルの作成
データベースを利用するにはテーブルが必要なので、まずはテーブルを作成。

```sql
CREATE TABLE languages(
   カラム名１　データ型　（制約）
   カラム名2　データ型　（制約）
   カラム名3　データ型　（制約）
);
```
テーブルを作成する手順は以下の通り。
①テーブル名を決める（CREATE TABLE テーブル名）。今回はlanguagesで設定。

②データの項目(カラム名)をリストアップする。今回はId、言語、目的、使用場所　の4つの属性を設定。

③カラムのデータ型を決める。データ型は利用するDBによって異なるが、一般的には以下のようなデータ型が用意されている。
※Javaの型と同じようなもの

>・文字列型：VARCHAR
>・数値型（整数型、少数型等）：INTEGER
>・日付型（日付のみ、または日付と時間を持つ型等）
>・バイナリ型

また、多くのDB設計では、このデータ型の設定の段階で文字数や数値の桁数を型と一緒に定義する。
定義のやり方は　データ型（桁数値　or 文字数値）。

④カラムの制約を決める。制約には主に以下の4つがある。

##主キー（primary key:PK）
データを特定するためのもの。基本的には主キーの定義は行う。

##必須（NOT NULL）
データに値がない状況を認めない時に使用する。

※ユニークキー（unique key：UK）、外部キー（foreign key：FK）は割愛。


以上を踏まえて、CREATE TABLEを組み立ててみる。

```sql
CREATE TABLE languages(
   Id　int(10)　PRIMARY KEY NOT NULL,
   language　VARCHAR　（10）,
   purpose　VARCHAR　（20）
);
```

これでRDBでは以下のような状態が完成。
![スクリーンショット 2022-01-22 11.41.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754263/c58dab45-e237-58b6-8393-e02c6f8b09a8.png)

##テーブルの変更
テーブルの変更はALTERを使用。構文は以下の通り。

```sql
ALTER TABLE テーブル名　変更操作　変更情報
```

##カラムの追加、削除
```sql
/*追加*/
ALTER TABLE テーブル名　ADD カラム名　データ型

/*削除*/
ALTER TABLE テーブル名　DROP カラム名
```
##制約の追加、削除
```sql
/*追加*/
ALTER TABLE テーブル名　ADD 制約の定義

/*削除*/
ALTER TABLE テーブル名　DROP 制約の定義
```

上記のことを踏まえ、使用場所 use というカラムを追加してみる。

```sql
ALTER TABLE languages ADD use VARCHAR（20）;
```

##テーブルの削除。
テーブルの削除はDROPを使用。不要になったテーブルを削除する場合に利用する。構文は以下の通り。

```sql
DROP TABLE languages
```
データも全て削除するため、実行する前に本当に削除しても良いか考えること。



＜前回の記事＞
・データベース、SQL・MySQLの基礎
https://qiita.com/TaikiTkwkbysh/items/8efc5faf8da2062a8a95

＜次回の記事＞
・データベース、SQL・MySQLの基礎（データの登録〜並び替えて参照）
https://qiita.com/TaikiTkwkbysh/items/d1d38dda0f5844f7603b