OmniAICreator/Qiita-1.07M huggingface dataset:
Is Cloud Computing the Key to Business Growth?

Let me start with the question for you!

Have you ever used MS teams or Dropbox to store, retrieve, modify data, or for communication purposes? If your answer is yes, congratulation, you are already using cloud services.

So, if you are using cloud services ultimately means it adds value to your business.

The answer to “Is cloud computing the key to business growth?” is YES!

Cloud computing services for business have no comeback. Cloud business solutions are easy to integrate with the ongoing business process. Organizations are seeing for cloud services because it offers affordable business solutions. Whatever business you may possess, the cloud has the most suitable solutions.

From the private to public sector, from the government to BFSI, cloud services offer the best keys.

Managed cloud services may grow by $74.9 billion in 2022, says IDC.

Various businesses are moving their critical business operations to the cloud as cloud computing solutions for businesses are the most promising. The surge is occurring as more cloud technologies join the market, and more technology companies are shifting their priority to the cloud.
About Cloud Computing

Cloud computing refers to the distribution of various software applications or data, and its access is available via the internet.

Cloud computing covers data storage, networking, servers, and databases, among other tools and applications. Rather than storing crucial data on a single physical hardware device or a local storage unit, businesses can store data on the cloud and access it from anywhere and anytime.

Why Cloud Computing?

The reason cloud computing has been around for more than two decades is; it offers numerous advantages over traditional corporate practices. The main benefits are cost savings and increased business efficiency.

Data privacy is a major reason why businesses should invest in this technology. Businesses are finding it challenging to keep their data safe in today’s digital culture. Cloud allows users to access all the system’s functions and files without saving them all on a single computer. We utilize cloud computing services daily without even realizing it.

Source: https://www.esds.co.in/blog/is-cloud-computing-the-key-to-business-growth/
Scalaの勉強はじめました 13 〜スレッドセーフ〜

## はじめに
N予備校でScalaの「並行処理プログラミング」を受講しています。

## メモリの可視性
複数のスレッドで共有している状態の変数への変更は、変更したスレッドからは見えるが、もう一方のスレッドからはその変更が見えない。
「可視性がない」状態。

### yield
他の実行可能なスレッドがある場合は実行する、ない場合は待つ。

```scala
object MemoryVisibility extends App {
  var number = 0
  var ready = false

  new Thread(() => {
    while (!ready) {
      Thread.`yield`()
    }
    println(number)
  }).start()

  number = 2525
  ready = true
}
```

同期が取れていないので、実行環境によって結果はまちまち。
`ready`や`number`の変更が別スレッドから感知できないため。

### volatile アノテーション
`@volatile`がついた変数は、Javaのコンパイラとランタイムにおいて、
複数のスレッドから共有される変数と認識される。

```scala
@volatile var number = 0
@volatile var ready = false
```

アトミックな処理を求める同期化が必要な場合には使えないので、
その場合は`synchronized`ブロックを使うこと。

### 逸出
:::note
逸出とは、本来の公開すべきではないフィールドのオブジェクトや変数が公開されてしまうこと。
::: 

`var`や可変オブジェクトを利用しないのが一つの手段。
変数の宣言は`private[this] val`などで行う。

### スレッド拘束
:::note
データが必ず 1 つのスレッドからしかアクセスされないようにする
特定のスタックからインスタンスの参照が漏れることの無いようにする方法
:::

## 並列コレクション
`java.util.concurrent`の利用。
`synchronized`ブロックなどの処理をAPIとして提供する並行コレクション。

`ConcurrentHashMap`
ハッシュマップをスレッドセーフにした部品。
並行処理で更新などをしても パフォーマンスが出る。

`CopyOnWriteArrayList`
`ArrayList`はスレッドセーフでないために、並行処理を行う場合に利用する。
`Seq`や`Set`を使う場合がほとんど。

`BlockingQueue`
分散処理システムを実装できる並行処理部品。
メインスレッドが仕事をキューに入れて、ワーカースレッドが仕事のキューを消化していく。

## シンクロナイザ
:::note
スレッドの制御フローを扱える部品のこと
:::

- ラッチ
最終ステートに到着するまでせき止めておくゲートの働きをする部品
- FutureTask
計算結果が取得可能な Runnable 途中でキャンセルする機能も
- セマフォ
Semaphore 何かのリソースにアクセスさせる際、その数を制限したい時に用いる並行処理部品
- バリア
他のスレッドが全員揃ったらスタートできるといういう並行部品

## まとめ
並行処理はコード見ただけでは結果がすぐにわからない。
それぞれ違いは実際使ってみて理解していくしかないかなと思います。
UICollectionViewCellのXIBからContentViewが消えた？

![Xcode-13.1](https://img.shields.io/badge/Xcode-13.1-brightgreen) 

## はじめに
この前モブプロ？のようなことをやっていると `UICollectionViewCell` の XIB に `contentView` がない！なんでだ？ということがありました。

## 現象
どうやら Library（右上の＋ボタン）から追加すると `contentView` ありで生成され、クラスファイル作成時に Also create XIB file をチェックして追加すると `contentView` なしで生成されるようです。

<img width="500" alt="cell" src="https://user-images.githubusercontent.com/34936885/166622523-97125124-31ad-425a-b9a6-2512de572fd9.png">

Interface Builder の上のセルが XIB チェックで作成したセル、下のセルが Library から追加したセルです。

## 確認
XIB 上で `contentView` がないセルで実際に `contentView` がないか確認してみました。

```swift
 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
        return cell
 }
```

上のコードでブレークポイントを置いて以下を確認してみました。

<img width="439" alt="subviews" src="https://user-images.githubusercontent.com/34936885/166622768-6b2ade9d-b8ed-410f-b3b9-07686e9a28ce.png">

どうやら `contentView` はあるようです。

ラベルを置いて確認してみたところちゃんと `UILabel` は `contenView` 上に追加されていました。

<img width="228" alt="label_xib" src="https://user-images.githubusercontent.com/34936885/166622813-490b09f1-baac-40dc-a53c-9e0c70a71ada.png">

<img width="500" alt="label_log" src="https://user-images.githubusercontent.com/34936885/166622779-fa195328-15b5-43e1-afb1-719c33d3c634.png">

とりあえず XIB 上で `contentView` がなくても問題はないようです。

## いつから？
Xcode 13.1 と Xcode 11.0 でみてみましたがどちらも `contentView` はありませんでした。

[Do you use contentView in UICollectionViewCell if created from XIB?](https://www.reddit.com/r/swift/comments/o5ns9s/do_you_use_contentview_in_uicollectionviewcell_if/ )に Xcode の長年のバグだというコメントがありました。

いつからなんでしょう？:angel:

## おわりに
とりあえず XIB 上で `contentView` がなくても問題はないようですが気持ち悪いので Library から追加するようにしています。

結構前からみたいですがなんで今まで気づかなかったんだろう？（ずっと Library から追加してたのかな:thinking:）
Angular resolve 

今回はAngularのresolveについて書きます。
プログラミング初心者がプログラミング初心者に当てて書く記事です。
必死にコードに齧り付いているプログミング初心者に届くと幸いです。
一緒に齧り付いていきましょう。



resolveとは。
```Javascript
interface Resolve<T> {
  resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<T> | Promise<T> | T
}
```

一言で言うと『ルートがアクティブになる前にデータを用意してくれるインターフェース』です。
つまり、ルートがアクティブになる前にstateのActivatedRouteSnapshotの中のデータの読み込みが完了していることを確認してから、routeのActivatedRouteSnapshotのルートの表示を行う。



実際の使い方
1.resolveを使った関数を定義。

```Javascript
import { Injectable } from '@angular/core';
import { Resolve } from '@angular/router';

import { Observable, of } from 'rxjs';
import { delay } from 'rxjs/operators';

@Injectable({
  providedIn: 'root'
})
export class NewsResolver implements Resolve<Observable<string>> {
  resolve(): Observable<string> {
    return of('Route!').pipe(delay(2000));
  }
}
```
ここでNewsResolverというresolveを作りました。
内容は２０００ms読み込みを遅らせてから”Route!”という文字列を返すものです！

2.先ほど作ったresolveを新しく作るrouteモジュールに入れます。

```Javascript
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';

import { NewsResolver } from './news.resolver';

import { TopComponent } from './top/top.component';
import { HomeComponent } from './home/home.component';

const routes: Routes = [
  {
    path: '',
    pathMatch: 'full',
    component: HomeComponent
  },
  {
    path: 'top',
    component: TopComponent,
    resolve: { message: NewsResolver }
  }
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }
```
これでRoutesが起動するたびに、NewsResolverが起動して、messageに”Route!”が代入されるようになります。
そして、これはこのルーターがアクティブになった時、ActivatedRouteの要素dataにMessage：NewsResolverを入れることにもなる。
ActivatedRouteの中にはアクティブになっているルートのさまざまな情報が自動で格納される。

```Javascript
//ActivatedRoute.snapshotの中身
　data{
 message:NewsResolver
}
```

3."Route"を表示する。
```Javascript
import { Component, OnInit } from '@angular/core';

import { ActivatedRoute } from '@angular/router';

@Component({ ... })
export class TopComponent implements OnInit {
  data: any;

  constructor(private route: ActivatedRoute) {}

  ngOnInit(): void {
    this.data = this.route.snapshot.data;
  }
}
```
ここではTopComponentのthis.dataにActivatedRoute.route.snapshot.data『message』の中身を入れる。

この状態でルートTopの中にHTMLでdata.messsageを書くと"Route!"が表記される！！
```HTML
<p>The message: {{ data.message }}</p>

```


参考もと
https://www.digitalocean.com/community/tutorials/angular-route-resolvers
リスト

## リスト
<b>データを記録するデータ部とデータの格納位置示すポインタ部で構成されるデータ構造。
ポインタをたどることで、データを取り出すことができる。
### リスト構造の種類
<b><font color = blue>単方向リスト</font> - 次のデータへのポインタを持っている
<font color = blue>双方向リスト</font> - 次のデータへのポインタと、前のデータへのポインタを持っている。
<font color = blue>環状リスト</font> - データが環状に連結されている。

<b>リストには、データのアドレスを変更しなくても、ポインタの値を変更するだけで、データを追加したり、削除したりすることができる特徴がある。

### ポインタとアドレスの違い
<b>アドレスとはメインメモリの各バイトにつけられた、単なる番地である。 ポインタはそれが指し示す変数の全体（例えばintなら4バイトからなるメモリ領域）の場所を，その先頭バイトのアドレスでもって表している。
ServiceNow - GlideQueryのバグと回避策

GlideRecordの代わりにGlideQueryを利用してレコードを取得することもできる。
ただし、GlideQueryはArray.prototypeを利用するとエラーになる場合がある。

GlideQueryを使う直前にArray.prototypeがあると「Evaluator: org.mozilla.javascript.EcmaError: Cannot convert null to an object.」になる。

```
Array.prototype.MyFunction = function() { gs.print('Test'); }

var userCount = new GlideQuery('sys_user')
    .count();
```

ただし、同じGlideQuery文をArray.prototypeの前にも記述するとエラーは回避できる。
```
var userCount = new GlideQuery('sys_user')
    .count();

Array.prototype.MyFunction = function() { gs.print('Test'); }

var userCount = new GlideQuery('sys_user')
    .count();
```

異なるGlideQueryを記述するとエラーになるので注意。

以上
Dockerコマンド一覧

・Dockerコマンド一覧
●docker image build オプション パス
イメージを作成
例)
```
●docker image build .
カレントディレクトにDockerfileのイメージを作成
※.はカレントディレクトリを表す
```
よく使うオプション)
```
●-t：タグを付ける
#タグの書式：名前空間/イメージ名:タグ名
例：docker image build -t practice/apache:latest .
※基本的にタグは付けるようにする

●-f：ファイル名を指定(Dockerfile以外のファイルからイメージを作成)
例：docker image build -f Dockerfile-test .
※標準では同じディレクトリ内のDockerfileからイメージを作成
```

●docker image ls オプション
イメージの一覧を表示
※オプションを使用することはほとんどない

●docker container run オプション イメージ
コンテナの作成・起動
例)
```
docker container run myapache:latest
=>latestタグのmyapacheイメージのコンテナを作成し、起動する
```
よく使うオプション)
```
●-d：コンテナをバックグラウンドで実行する(ターミナルが使えなくなるのを防ぐ)
例：docker container run -d myapache:latest

●--name：コンテナに名前を付ける
例)：docker container run --name myapache myapache:latest

●-it：標準出力とターミナルをアタッチする
例)：docker container run -it myapache:latest

●-p：コンテナのポートをホストに公開
例)：docker container run -p 8080:80 myapache:latest
=>ホストのポート番号8080とコンテナのポート番号80をマッピング
```

●docker container ls オプション
コンテナの一覧を表示
例)
```
●起動中のコンテナの一覧を表示
docker container ls

●起動中のコンテナと停止中のコンテナを全て表示
docker container ls -a
```

●docker container logs オプション コンテナ
ログを確認
例)
```
docker container logs apache
=>apacheコンテナのログを確認
```

●docker container exec オプション コンテナ コマンド
コンテナでコマンドを実行
例)
```
●docker container exec apache ls /
=>rootディレクトリの中身を表示
```
よく使うオプション)
```
●-it：標準出力とターミナルをアタッチする(シェルを終了させない)
例：docker container exec -it apache /bin/bash
```

●docker container stop オプション コンテナ
コンテナを停止
例)
```
●docker container stop apache
=>apacheコンテナを停止

●docker container stop $(docker container ls -q)
=>起動中のコンテナを全て停止
```

●docker container rm オプション コンテナ
停止中のコンテナを削除
※起動中のコンテナは削除できない
例)
```
●docker container rm apache
=>apacheコンテナを削除

●docker container rm $(docker container ls -q -a)
=>停止中のコンテナ全てを削除

●docker container rm -f コンテナ
=>起動中のコンテナを強制削除
```

●docker image rm オプション イメージ
=>イメージを削除
例)
```
●docker image rm practice/apache
=>practice/apacheイメージを削除

●docker image rm $(docker image ls -q)
=>イメージを全て削除
```

●docker system prune オプション
=>Dockerで使用していないデータを削除
例)
```
●docker system prune
=>Dockerで使用していないデータを削除

●docker system prune -a
=>buildキャッシュ、中間イメージ(タグのないイメージ)も削除

●docker system prune --volumes
=>ボリュームを削除

●docker system prune -f
=>強制削除
```
Nuxt.jsの基本1.（SSR, CSR, Universalなど…）

## 入る前に
こんにちは、アプリケーションエンジニアとして働いてるキムです。
社内では、アプリケーションエンジニアと言う職名として入ってますが、世間的にはサーバーサイドエンジニアに近い立場ですね。（バックエンド側的な感じですかね？）
フロント側については、本当にプログラミングを学び初めての時、HTMLを書きながら、コーディングてこんなものなんだとか、javascriptや、jQueryを使ってみたりとかが全部で、本格仕事を始めてからはサーバーサイドを開発するのが、思った以上楽しかったのでなかなか接するチャンスが無かったです。

今回チーム内でLaravelアプリを機能ごと分け複数のアプリとしてサービスする施策がこの２年ぐらい進めているところです。その中、サーバーサイド処理はGoで開発し、運用中です。
残りのフロント部分を今回移行することになり、自分が一度やってみます！という感覚で今回経験・勉強したことをこの場を借りて、共有してみようと思います。

この記事を始め、少なくとも２個と記事を作成する予定になります。
前回yarnと、npmについての記事を作成しておいたものがあります。興味があれば、一度読んで見てください。
まだパッケージマネジメントについてはブラックボックス的な部分が多いのでまだまだ勉強が必要ですが、なんとかこんなものなんだレベールまでは身につけたと思います。

１．最近のフロントエンドのアプリケーションについて、
２．Nuxt.jsについて
３．ESLint、Prettierなどのツールについて

これから上記の順番で作業した内容や、学んだことを整理する予定です。
よろしくおねがいします。

## CSR vs SSR
基本的にSSRとCSRについて理解する必要があります。
この２つの概念は今回使ったNuxt.jsでは最も重要な特徴かと思います。

### CSR (Client Side Rendering)
言葉通りに、クライアントサイドレンダリングです。
普段SPA(Single Page Application)でよく使ってる方法であります。
SPAとは、最初一度ページ全体をロードしておいて中身のデータだけを更新しながら使えるウェブアプリケーションのことです。
最初ページをロードする時点からはページ再読み込み（F5のルプレッシュですね）なしで、必要な部分だけサーバーからデータを取得して更新するレンダリング方法になります。
必要な部分だけ更新するので、ページの動きがかなり自然に見えます。

サーバーでViewをレンダリングするのではなく、クライアント側でHTMLをダウンロード後、jsファイルや、リソースなどを追加でダウンロードして、ユーザーのブラウザからレンダリングして見せるので、SSRよりは初期Viewをロードするときに時間がかかります。

Viewが表示された後からはすぐインターレクション（相互作用）が可能になります。

最近使われてるほとんどのウェブクローラー、ボットはjsファイルを実行できず、HTMLコンテンツだけ収集する動作してます。
なので、CSRの方法で作られたページはレンダリングされる前の状態なので、空ページとして認識され、これは検索エンジンに正しく漏出されないので、ウェブページヘの輸入が減る原因になることもあります。

#### CSRのメリット
- 自然なUX
- 必要な部分だけを部分的にロードする（性能）
- サーバーのテンプレートレンダリングをクライアントに分散（性能）
- コンポネントごと開発に用意（生産性）
- モバイルアプリ開発を考慮してる時、同じAPIを使えるように設計可能（生産性）

#### CSRのデメリ
- javascriptファイルをBundlingして一気にDLするので、初期レンダリングに時間がかかる（WebpackのCode Splittingで解消可能）
- 検索エンジン最適化（SEO)が難しい
- セキュリティー的にIssuesがある（フロントエンド側へのビジネスロジック最小化）

### SSR (Server Side Rendering)
サーバーサイドレンダリング
MPA(Multiple Page Application)でよく使われる方法
言葉通りに、サーバーでユーザーに見せるページを全部レンダリングして出す方法

サーバーで新しいページを養成（Request)をする方法なので、RequestをするたびにRefreshが発生する。。
Viewをサーバーでレンダリングすので、初期ロードがCSRに比べ早い。
Viewをサーバーで全部レンダリングして、HTMLとして返すので、HTML内部にすべてのコンテンツ情報が入ってる。ことでSEO適用に問題がない。

#### SSRのメリット
- SEO (検索エンジン最適化）
- 初期ロードスピードの速さ（サーバーから画面レンダリングの必須情報を先に取得できるので）

#### SSRのデメリ
- ページ移動の時画面全体がリロードされる
- ページ移動する時、不要なテンプレートも重複してロード（性能）
- サーバーでのレンダリングについての負荷（性能）
- モバイルアプリを開発するときに追加のバックエンド作業が必要（生産性）
- TTV(Time To View)とTTI(Time To Interact)間のタイムラッグが発生→ユーザーの操作に反応がない場合がある
    - UXの経験的に良くないときがある。

上で説明してるSSRの方法はもう古いSSR方法になりました。
過去、ページを移動するたびに再読込が発生したことを改善するために新しいSSR概念が登場しました。この新しいSSRを適用したアプリケーションを`Universal App`と呼ばれてます。
それではUniversal Appの一つである、Nuxt.jsについて確認してみましょう。
z88dkでMSX-DOS用アセンブラを書く

# 準備
z88dkファイルをダウンロードする。
自分の場合
http://nightly.z88dk.org/
から z88dk-win32-latest.zip をダウンロードした。

圧縮ファイルを解凍し、適当なディレクトリに配置する。
例）C:\etc\z88dk

# 開発
開発用ディレクトリを用意する。
例）C:\Projects\etc\z88dk

- 開発用バッチファイル

```dev.bat
@echo off
path C:\etc\z88dk\bin;%path%
cmd
```

- サンプルソース

```hello.asm
;z80asm -l -b -ohello.com hello.asm

	org	$0100

	ld	de, msg
	ld	c, $09
	call	5
	ret

msg:	db	"hello, world$"
```

`z80asm -l -b -ohello.com hello.asm`
を実行すると hello.com ファイルなどが作られる。

# 実行
WebMSX http://webmsx.org/ を起動する。

左下のフロッピーアイコン（Drive A）をクリックし「Add Boot Disk」を選択する。
左下の電源アイコン（System Power）をクリックし「Reset」を選択するとMSX-DOSが起動する。
エクスプローラーからhello.comをドラッグし、WebMSXのDrive Aの+FILESにドロップする。

dirコマンドで確認し、helloコマンドを実行する。

![hello.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257554/c4c61c6a-f7a6-d1d1-2061-dc891f129f6a.png)
Android Studio環境構築(5)デバイスマネージャ

# はじめに

Androidアプリの開発のために、Android Studioの環境構築をします。
この記事で取り扱う環境は、Windows10です。

:::note info
真新しい情報ではありません。体系立てて理解を整理するために、自分が理解しやすい枠組みでまとめるものです。
:::

## ひとつ前

https://qiita.com/w2mjra555/items/a5b7febe6005c7457e2f

## ひとつ先

https://qiita.com/w2mjra555/items/fca92fc46075f3a7a013

## デバイスマネージャ(Virtual Divice Manager)

## 1.デバイスマネージャの実行

### 1.1.デバイスマネージャの起動

Android Studioにようこそ画面から、「その他のアクション」＞「デバイスマネージャ(Virtual Divice Manager)」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/3b63b74d-86e9-1505-d8d4-a0d0fcdfea8a.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/9771ab4c-9fc9-d398-017c-ace4558b6aa5.png)

### 1.2.デバイスマネージャ

「デバイスの作成」を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/ec2fecb5-6cd8-aedd-4fc9-8e4ba495707a.png)

### 1.3.ハードウェアの選択

今回は`Pixel 3a`を選択して「次へ(N)」を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/04e053ab-3479-da01-d94b-39ccf4365836.png)

### 1.4.システムイメージ

APIレベル`30`が初期選択されているのを確認し、そのまま「Download」を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/25f26f5d-4178-45a4-2e8c-f09ab1b52faa.png)

### 1.5.コンポーネントのインストール

完了まで待機します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/2e8472db-f8b0-3fa6-61b8-08698428b11a.png)

### 1.6.コンポーネントのインストール完了

「完了(F)」を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/6eabc238-e2e9-6418-8409-daddc4738be5.png)

### 1.7.システムイメージ(ダウンロード済み)

先ほどの「Download」が表示されなくなったことを確認し「次へ(N)」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/568a1007-e8e0-47d7-8a8c-093b82b7ecbd.png)

### 1.8.Android 仮想デバイス(ADV)

ADV名はデフォルト(`Pixel 3a API 30`)のまま「完了(F)」を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/4c669066-00d7-7450-85ce-ccd3f4d14973.png)

デバイスが追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/f959ff09-16b7-ac94-e749-d4c38d542519.png)

## 2.仮想デバイスの日本語化(おまけ)

Android上で設定する場合と全く同じことをすれば、仮想デバイスを日本語化できる。

### 2.1.アプリ一覧からSettings＞System
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/8294c939-8919-f94f-e9a5-8ca81695cce7.png)

### 2.2.システム(System)からLanguages & Input
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/b683471a-98ad-3a7e-3a12-3087f08846d8.png)

### 2.3.言語(Languages)からAdd a language＞日本語
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/c57dde1b-57a6-baf0-bf1d-adea10b99d48.png)

### 2.4.言語(Languages)で日本語を一番上に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/6670e7e2-0957-3a8a-9721-d0d71587d222.png)

仮想デバイスが日本語化されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/b6ba87b7-4c1b-97b4-bbd8-4f13e78fbbb0.png)
配列

## データ構造
<b>データを効率よく管理するための形式
リスト、キューとスタック、木構造など

## 配列
<b>同じデータ型の複数の要素が連続してまとまったデータ構造
<font color = blue>一次元配列</font> - T = [1,2,3,4,5]
<font color = blue>二次元配列</font> - T = [ [1,2,3,4,5] , [1,2,3,4,5] ]
シェル操作の基本

### シェル操作まとめ
* シェルの初期の場所はhome
* pwd : 絶対パスで現在までのディレクトリ表示
* history : これまで使用したコマンド表示
* echo : 文字の出力
* ↑ : 使用コマンドの履歴表示
* ↓ : 最近使用したコマンド表示
* 入力の途中でTab : 過去の履歴から文字の補完をする
* ls : ファイル一覧 【オプション】| -a:隠しファイル | -l:ファイル詳細　 | -al:aとlどっちも
* ```echo 'hello' > foo.txt``` : foo.txtが作成される
```
リダイレクト	
>	出力のリダイレクト（上書き）
>>	出力をファイルに追記する（ファイルの更新）
<	入力のリダイレクト
<<	入力終端文字列を指定する
```
* ```cp foo.txt copy.txt``` : foo.txtを元にcopy.txtが作成される
* ```cp rename.txt test_dir``` : test_dirにrename.txtをコピーして格納する
* ```cat foo.txt``` : foo.txtを表示する
* ```mv foo.txt rename.txt``` : foo.txtをrename.txtへ名前変更
* ```mv <移動するディレクトリ or ファイル> <移動先>``` 移動先が移動したいファイルを指定している場合そのファイルやディレクトリの名前が変わるのは、移動させて名前を変えている。
* ```rm copy.txt``` : copy.txtを削除
* mkdir : ディレクトリ作成
* ```rm -r test_dir``` : test_dirディレクトリを削除


### 絶対パスと相対パス
```/```: ルートディレクトリから指定して設定する。
```ls /``` ルートディレクトリの一覧表示

#### 相対パス
* ```.``` : 「.」ひとつでカレントディレクトリを表す
* ```..``` : 「.」ふたつで上位ディレクトリを表す


### Linuxについて
Bronze DBA 模試2 復習アウトプット1

# 表領域の拡張
<font color="Red">データファイル</font>に対して何か行う。
・<font color="Red">データファイル</font>の追加
・<font color="Red">データファイル</font>のサイズを手動で拡張する
・<font color="Red">データファイル</font>のAUTOパラメータをONにして、自動拡張する

# 停電編
停電でインスタンス停止の場合、「チェックポイント」が効かないため
インスタンスリカバリを実行する

①インスタンスリカバリはSMONで実行する。
　SMONの[S]は、システム。
　ロールフォワードして、ロールバックする。
　ロールフォワードするときは
　REDOログファイルの情報を使って、停止前に動いていたチェックポイントまで戻す。
②データベースオープン
③未コミットのロールバック
　ロールバックする理由：
　　トランザクションに残っている変更を取り込んだ場合に、データが不正になる可能性があるため
　　一旦トランザクションの変更情報を戻す。

# 自動メモリー管理おさらい
「MAX」がつくパラメータは<font color="blue">静的パラメータ</font>
「MAX」がつかないパラメータは<font color="Red">動的パラメータ</font>

初期化パラメータは
「MEMORY_〇〇_TARGET」しか存在しない。
ここは暗記。

# アーカイブログモードの破損対応
前回はクリティカル領域での破損を勉強したが、
今回はクリティカル領域以外での破損を勉強する。

まず
表領域の中で大きく二つ存在する。
・クリティカル表領域
・クリティカル以外の表領域

#### クリティカル表領域
SYSTEM表領域
UNDO表領域

#### クリティカル以外の表領域
そのまま。
上記(クリティカル表領域)以外なので
クリティカル表領域がなんなのか？を覚えることができれば仕分け可能。

### 本題
アーカイブログモード　かつ
クリティカル表領域以外の場合の
破損対応
#### 回答
アーカイブログモードなので
データベースをオープンしたままリカバリが可能。
破損した箇所だけオフラインにしてリカバリして戻す。

# SMONの役割
インスタンスリカバリを行う

# フラッシュバックドロップについて
### DROP TABLEの状態
TABLE→ゴミ箱へgo

### フラッシュバックドロップ
ゴミ箱からテーブルを元に戻す。
<font color="Red">※ただし、外部制約キーだけは戻せないので
再設定する。</font>

# REDOログファイル
2つ以上のグループで循環して記録する(ログローテーション)

### ログの単位
メンバー：ログファイル1つ
グループ：メンバーの複数版

# SCOPE句のおさらい
| SCOPE句 | 変更の適用範囲 |
|:--|:--|
|  MEMORY | 変更の反映はその時だけ、再起動したら元に戻る |
|  SPFILE | SPFILEだけ変更されている状態。再起動することで実際に反映される  | 
|  BOTH | 即時反映だし、SPFILEも更新される。　再起動後も反映される  | 

# 個別コンポーネントパラメータの場合
設定した値が最小値になる。
では、<font color="Red">個別コンポーネントパラメータとは？</font>
**共有プールなど、プールサイズのこと。**
それ以外は
個別コンポーネントではない。

# ソフトウェアを配置する場所
ORACLE_HOME
何度も出題されるため覚えるしかない。
# 自動SQLチューニングアドバイザの自動実行
・SQLプロファイルだけ
# リスナー：statusコマンド
・ログファイルの場所
・サマリー
・リスナーアドレス
# メモリー関連アドバイザおさらい

| アドバイザ名 | どの管理が有効か？ |
|:--|:--|
|  メモリーアドバイザ | <font color="Red">自動メモリー管理</font>が有効 |
|  SGAアドバイザ | <font color="Red">自動共有メモリー管理</font>が有効 | 
|  PGAアドバイザ | <font color="Red">自動共有メモリー管理、手動共有メモリー管理</font>が有効| 

# CREATE USER
デフォルト表領域が省略された場合、データベースに指定された表領域が設定される。

# 索引について
制約が使用禁止になると、索引は削除される。

# リスナー複数挙動
リスナー１が、起動した後に
リスナー2が起動しても影響なし。
それぞれが稼働する。

# ADDMの使い方(監視ツール)
自動分析の場合：対象が直近だけになる
手動分析の場合：分析対象の範囲を指定できる
# DBCAの使い方(データベース作成ツール)
<font color="Red">結論：シードテンプレートが効率的。</font>
・DBCAで直接コピーする方法はなし。
・非シードテンプレートは、データディクショナリ作成のため、時間がかかる。
・汎用を使ったものは、構造が完全一致しない。
・手動は非効率。 Data Pump→SQL*loaderは取り込めない。
アルゴリズム

## アルゴリズム
<b>何らかの問題を有限の時間で解くための手順
## 変数
<b>データを格納する領域。
・フローチャートでの記述
5 -> intA
↑数値「5」を変数intAに代入
'基本情報' -> txtA
↑文字列「基本情報」を変数intAに代入
intA + 1 -> intA
↑変数intAに1を加える
## フローチャートと擬似言語
### フローチャート
<b>↓フローチャートの記号
![original 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/1a6828bc-f9a0-3780-fb4e-f4495da37072.jpeg)
### アルゴリズムの制御構造
<b><font color = blue>順次</font>
<font color = blue>選択</font>
<font color = blue>繰返し</font>
上記三つの制御構造の組合せでできている。
#### 順次
<b>Aの次にBその次にCという感じ
#### 選択
<b>双岐選択 - 2つの処理のうちいずれかを選択する
多岐選択 - 3つ以上の処理のうちいずれかを選択する
#### 繰返し
<b>前判定繰返し - 繰返し処理の前で終了条件の判定を行う。1回も実行しないこともある。
後判定繰返し - 繰返し処理の後で終了条件の判定を行う。少なくとも1回は実行する。
### 構造化プログラミング
<b>プログラム全体を機能ごとに分割し、順次・選択・繰返しだけを用いることを原則とする手法

アルゴリズムをたどって変数の変化を追跡することを<font color = blue>トレース</font>という。

### 擬似言語
![kyotsu1a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/62443617-979b-fe9d-b27a-759cf6a432de.jpeg)
### 決定表
<b>条件とその条件に対する動作とを表で整理したもの
【Flutter】（簡単）バリデーションを実装する手順

# はじめに
今回は自分がよく忘れてしまう`flutter`でのバリデーションの手順を自分用に記録していきたいと思います。
# ステップ１ TextFormFieldを作る
```dart:validation_example.dart
Column(
    children : [
        TextFormField(),
    ],
)
```
# ステップ２　Formで囲んでkeyを割り当てる
```dart:validation_example.dart
final _formKey = GlobalKey<FormState>(); //keyを定義

 @override
  Widget build(BuildContext context) {
                    .
                    .
                    .
  Form(
    key : _formKey, //keyを割り当てる
      child : Column(
        children : [
          TextFormField(),
      ],
    )
  ),
```
# ステップ３ バリデーションを実装する
```dart:validation_example.dart
Form(
  key : _formKey, //keyを割り当てる
    child : Column(
      children : [
        TextFormField(
          // バリデーションの実装ーーーーーーーーーーーーーーーー
          validator: (value) {
             if (value == null || value.isEmpty) {
               return '何か文字を入力してください'; 
             }
             return null;
           },
           // バリデーションの実装ーーーーーーーーーーーーーーーー
      ),
    ],
  )
),
```
# ステップ４ バリデーションメソッドを呼び出して、バリデーションをかける
今回は決定ボタンを押した際に、フォームに入力した文字を`print`で出力したいと思います。
```dart:validation_example.dart
Form(
  key : _formKey, //keyを割り当てる
    child : Column(
      children : [
        TextFormField(
          // テキストフォームに入力された値（value）をtextという変数に代入する
          onChanged: (value) {
            text = value;
          },
            // バリデーションの実装ーーーーーーーーーーーーーーーー
            validator: (value) {
               if (value == null || value.isEmpty) {
                 return '何か文字を入力してください'; 
               }
               return null;
             },
             // バリデーションの実装ーーーーーーーーーーーーーーーー
       ),
       // フォームとボタンの間に空白をつける
       SizedBox(
          height: 30.0,
       ),
       //決定ボタン
       ElevatedButton(
          child: Text('決定'),
            onPressed: () {
              // バリデーションメソッドを用いてバリデーションをかける↓
              if (_formKey.currentState!.validate()) { 
                 print(text);
              }
            },
       ),
    ],
  )
),
```

# 最後に
今回は自分がよく手順を忘れるバリデーションの実装の仕方を自分が見返すようにまとめました。
もしに役に立ったならいいねおねがいします！
【業務改善】デスクワークの軽量化　メール自動送信編

## PowerAutemateDesktopを活用した業務改善！
皆さん、こんにちは！私は北海道の小売業で働いているサラリーマンです！
普段の業務は営業ではなく、会社として環境や社会への貢献に取り組む業務をメインに働いています。
その業務の中で会社で行う募金活動を全従業員に発信するというものがあります。
この業務は、定期的にルーチン業務として発生し、意外と手間のかかる作業です。
今回はデスクワークの軽量化を目指し、**PowerAutemateDesktop**を使い、メール送信の自動化を行い業務改善ができるか取り組んでみました。
## 出来上がったものを動画にしてみました！
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">PowerAutomateDesktop(PAD)で業務改善してみた！今回はメールの自動送信です！<a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a> <a href="https://twitter.com/hashtag/PowerAutomateDesktop?src=hash&amp;ref_src=twsrc%5Etfw">#PowerAutomateDesktop</a> <a href="https://twitter.com/hashtag/%E6%A5%AD%E5%8B%99%E6%94%B9%E5%96%84?src=hash&amp;ref_src=twsrc%5Etfw">#業務改善</a> <a href="https://twitter.com/hashtag/%E3%83%A1%E3%83%BC%E3%83%AB%E8%87%AA%E5%8B%95%E9%80%81%E4%BF%A1?src=hash&amp;ref_src=twsrc%5Etfw">#メール自動送信</a> <a href="https://t.co/1phLQviCfH">pic.twitter.com/1phLQviCfH</a></p>&mdash; 佐々木広大 (@sasakikoudai930) <a href="https://twitter.com/sasakikoudai930/status/1523587088972582913?ref_src=twsrc%5Etfw">May 9, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



## 取り組みの効果
今回、作成した募金案内メールですが、この後、募金回収案内メールを送る業務がセットでついてきます。大体、このようなメール1本作成するのに通常30分ほどかかり、そして、このようなメール案内をする業務が募金の他にも2つほどありますので、月間6本はこのようなメールを作成します。結果、今回作成したツールを使用し、定例で発信しているメールに運用すれば**1か月で3時間分**の業務改善ができ、**年間で36時間分**の業務改善となります。

## 使用したツール
- [PowerAutemateDesktop](https://powerautomate.microsoft.com/ja-jp/desktop/)
- [Outlook](https://outlook.live.com/mail/0/)
- [Excel](https://www.microsoft.com/ja-jp/microsoft-365/excel)

## 作業の手順
<details><summary>手順１：Excelで、実施する募金の内容や期間・メール本文などをまとめる。
<img width="900" alt="スクリーンショット (122).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2621180/bdaa3e96-1587-54f1-2e6e-29add615663b.png">

<details><summary>手順２：Power Autemate Desktopで自動化の流れを作成
<img width="700" alt="sisutemu .png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2621180/36f77c42-2192-6699-bf58-2f96f8acd045.png">

※大まかな流れ
> ①メッセージ表示・・・まず最初に、これから実行する処理が募金案内メールであることに確認
> ②Outlookの起動・・・メール送信するため、Outlookを起動
> ③Excelの読み取り・・・メールに記載する内容をExcelから読み取り、メールに反映
> ④メールの送信・・・指定した宛先にメールを送信
> ⑤メール送信完了報告・・・ExcelとOutlookを閉じてメール送信完了のポップアップで終了

## 検証
**ちゃんとメールが自動送信されてました！**
<img width="900" alt="メールエクセル.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2621180/7fc29931-7ec5-d680-d133-7a50d1ea4d41.png">

## あとがき
まだまだ、**PowerAutemateDesktop**にはたくさんの活用できれば業務改善につながるツール沢山あります。
例えば、フォルダの自動作成やファイルやデータの移動、リマインダー通知の発信など400種類を超えるアクションを自動化することが出来るので、これからいろいろ試していきたいです。
最後まで読んでいただき、ありがとうございました。
Android Studio環境構築(4)SDKマネージャ

# はじめに

Androidアプリの開発のために、Android Studioの環境構築をします。
この記事で取り扱う環境は、Windows10です。

:::note info
真新しい情報ではありません。体系立てて理解を整理するために、自分が理解しやすい枠組みでまとめるものです。
:::

## ひとつ前

https://qiita.com/w2mjra555/items/9790e32c01d6e53e4bc0

## ひとつ先

https://qiita.com/w2mjra555/items/e7d18bb43cf3b7da8cdb

# SDKマネージャ

## 1.SDKマネージャの実行

### 1.1.SDKマネージャの起動

Android Studioにようこそ画面から、「その他のアクション」＞「SDKマネージャ」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/a1d3cffc-8ad3-2d72-2538-5a30b15dfea5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/bd175875-4eae-3f2f-c05f-72542a088920.png)

### 1.2.SDKプラットフォームの確認

設定を確認しておく。必要になったら別バージョンのSDKを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/a3b14538-5a25-01ae-c5fc-a9369f0280ad.png)

2022年5月3日時点の最新バージョンのデフォルトでは、
* `Android API 32`

のみにチェックが入っているようです。

### 1.3.SDKツールの確認

設定を確認しておく。必要になったらツールを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/32a2d9a0-eb8a-2c0e-c6ce-d1e7bad688fa.png)

さらに、ビルドツールの詳細はこうなっているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/ae07d453-d75f-546c-4982-f663ebf64a8f.png)

2022年5月3日時点の最新バージョンのデフォルトでは、
* `Android SDK Build-Toolsの一部`
  * `32.1.0-rc1`
  * `32.0.0`
* `Android Emulator`
* `Android SDK Platform-Tools`
* `Intel x86 Emulator Accelerator(HAXM installer)`

にチェックが入っていますね。

## 2.SDKマネージャの再実行(SDKプラットフォームの追加)

「ツール」からも起動できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/64422b25-c6eb-9f26-5188-48924bd5e4db.png)


### 2.1.SDKプラットフォームの追加

以下を追加します。チェックボックスをチェックして「適用(A)」を押下します。
* `Android 11.0(R)`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/bd3ee63c-3c2d-05c6-e26f-8a4fafa161b7.png)

### 2.2.変更の確認

使用されるディスクサイズを確認し「OK」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/c5de54b3-624b-7e61-d15d-e90743160e04.png)

### 2.3.コンポーネントのインストール

完了まで待機します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/48b6e63a-ce43-13ca-ebae-df653ddb3b75.png)

### 2.4.コンポーネントのインストール完了

「完了(F)」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/422f505e-f721-3336-cb2c-caf955132e8f.png)
Android Studio環境構築(3)初期設定

# はじめに

Androidアプリの開発のために、Android Studioの環境構築をします。
この記事で取り扱う環境は、Windows10です。

:::note info
真新しい情報ではありません。体系立てて理解を整理するために、自分が理解しやすい枠組みでまとめるものです。
:::

## ひとつ前

https://qiita.com/w2mjra555/items/88eb12472c39409b51e8

## ひとつ先

https://qiita.com/w2mjra555/items/a5b7febe6005c7457e2f

# Android Studio初期設定

## 1.セットアップウィザードの実行

### 1.1.Android Studioの起動

Android Studioを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/b55e7258-3820-ceee-95f7-d6a4d7d2ee0f.png)

### 1.2.Android Studioセットアップウィザード
「次へ(N)」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/32385bae-bbdd-fc85-540e-b91bb62c0b10.png)

### 1.3.インストールタイプ

デフォルト(標準)のまま「次へ(N)」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/8d5f6976-700c-6f12-f0ee-c23b444118df.png)

### 1.4.UIテーマの選択
好みでよい部分ですが、ここでは「ライト」を選択して「次へ(N)」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/7a931217-a7dd-83ed-4dce-09bf3073b209.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/97d7216f-106b-fa9a-7839-e6b8f40a831f.png)


### 1.6.設定の検証
内容を確認し「次へ(N)」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/ee1ad9db-8b40-72c2-fee4-3d60c0932b91.png)


### 1.7.ご使用条件
ライセンスの内容を確認し、すべて「受諾」にして「完了」を押下します。
(何故かここだけライトっぽくないUIになりました)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/fa7d51a5-8be7-8050-8c3a-913ed3d415f9.png)

### 1.8.コンポーネントのダウンロード
完了まで待機します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/443fb9de-7fd5-7a40-aaa2-1d12fec68bcd.png)


### 1.9.コンポーネントのダウンロード完了
「完了」を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/94829045-2f7c-e25b-9588-df927dc57a66.png)

Android Studioにようこそ画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/57915d27-725d-4831-929d-dcd2980a4aef.png)
#Scratch 3.0（公式）などで独自拡張機能を使わない外部との通信【概要編】（ブラウザの開発者ツールのコンソール、JavaScript、WebSocket が関連、 #toio でも利用可）

デフォルトでは外部と自由に通信をする機能がない
　「公式版の Scratch（ https://scratch.mit.edu/ ）」
や、
　「toio Do（ https://toio.github.io/toio-visual-programming/beta/?category=do ）」
を、以下のようにリアルタイム通信で連動させることができたりする仕組みの話を、この記事で取り扱います。詳細は続きの記事で書こうと思っていて、今回は概要を記事化してみます。

https://twitter.com/youtoy/status/1521537596056567808

今回の仕組みに関係してくる主なキーワードは、以下のとおりです。

- ブラウザの開発者ツール（の中のコンソール）
- JavaScript（Node.js を使うもの、ブラウザ上で動かすバージョン）
- リアルタイム通信（WebSocket のサーバー・クライアント）

ちなみに、1つ前に書いていた以下の記事の内容も、今回の話に少し関連していたりします。

●#Scratch 3.0 のキー入力イベントをブラウザのコンソール（開発者ツール）の JavaScript からランダムに繰り返し発生させてみる - Qiita
　https://qiita.com/youtoy/items/f9e4ab248d3bdd0463f0

## 今回の仕組みの概要
まずは、今回の仕組みの概要を「構成要素」・「」示します。

こちらが今回の構成要素の話です。

- Scratch を開いたブラウザタブ（開発者ツールのコンソールで JavaScript を実行）
- toio Do を開いたブラウザタブ（開発者ツールのコンソールで JavaScript を実行）
- Node.js のプログラム（WebSocketサーバー機能を動かすだけのもの）

「Scratch」と「toio Do」の 2つのタブをシンクロさせるリアルタイム通信は、Node.js のプログラムを介した WebSocket で実現しています。また、toio Do と Scratch を開いたブラウザタブでは、「以下に書いたそれぞれのブロックのプログラム」を動かしつつ、さらにそれと合わせて「ブラウザの開発者ツールのコンソールを開いて入力した、以下の処理を実行する JavaScript のプログラムが動いています。

次は、ブロックのプログラムで実装した内容の話です。

- toio Do： 
   - toio の姿勢検出を動かし、toio のどの面が上を向いているかによって、それに対応した出力（数字）を得る
   - 上記の姿勢検出の出力を画面上に表示する（変数ブロックを利用）
   - 一定時間ごとに、上記の姿勢検出の出力を取得し、その結果によってスプライトの位置や背景の内容を変える
- Scratch： 
   - 矢印キーが押されたら、その結果によってスプライトの位置や背景の内容を変える

そして以下は、ブラウザの開発者ツールのコンソールで動かしているプログラムで実行している内容の話です。

- toio Do を開いたタブ： 
   - toio Do の画面上に表示されている変数の出力の数字（姿勢検出の結果）を、定期的に取得する
   - 上記の取得した数字を、WebSocketサーバーに送る
- Scratch を開いたタブ： 
   - WebSocketサーバーから情報を受けとる
   - 情報を受けとったタイミングで、ブラウザ上でのキー押下イベントをプログラムから発生させる

あとは、上記の「WebSocketサーバー」に該当するプログラムを、Node.js で動かしています。その内容は、パッケージの「ws」を使った 10行くらいのプログラムになっています。

以上のどの内容も、シンプルな内容になるよう作っています。これにより、冒頭に掲載していた動画のような内容を実現しました。

## おわりに
ひとまず概要編を書いたので、実際に使ったプログラムの詳細についてなどは、続きの記事として別で書ければと思っています。

__※ 【追記】 続きの記事を書きました__
　[●Scratch 3.0（公式）などで独自拡張機能を使わない外部との通信【ソースコード編】（ブラウザの開発者ツールのコンソール、JavaScript、WebSocket が関連） - Qiita](https://qiita.com/youtoy/items/8f40a4dcd3867785a445)

あとは、今回使ったものと別の環境も組み合わせて使ってみるようなことや（例えば、個人的には Stretch3　や AkaDako などいったものを組み合わせてみようと思っています）、通信部分に MQTT といった IoT の通信に使われる仕組みも組み合わせた「公式の Scratch（や他のサービス等）での IoT の活用」といった、デバイス連携も試して紹介できればと思います（簡単な動作確認はできているので、実現可能なことは確認済みだったりします）。

### 【追記】 Stretch3・AkaDako でインターネット経由の LINEアプリ連携（IoT的なこと）
インターネット経由での HTTPリクエストを組み合わせた、IoT的なことができました。
LINE Botサーバーがブラウザとの WebSocket通信も行う、といった構成です。

https://twitter.com/youtoy/status/1521807632243499008

### 【追記2】 Scratch のソースにてを加えて IoT をやる話
Scratch で IoT的なことや外部との通信をやる話は、公式の Scratch を使うやり方ではない方向であれば、過去に自分がやった事例で MQTT が扱える独自拡張を作ってしまう、というものががありました。Node.js で実装できる機能であれば、こちらのほうが王道という感じではあります。

https://twitter.com/youtoy/status/1289968726704455680

https://twitter.com/youtoy/status/1293489857516380161
Excel数式の事例集

# はじめに

Excel 2019 on Windows10 を対象としています。
公開されている情報を参照して、プライベートの時間に整理したものです。
順次追記予定です。

# 次の行の追加を考慮した集計

集計セルの次の行を追加するときに、通常の参照方法であれば集計範囲が移動してしまうが、集計範囲の上側だけ移動させずに固定したい場合がある。例えば、下図では灰色行が集計セルになっており、赤ペン箇所に行を追加したい。

- `ADDRESS(ROW()+1,COLUMN())`により集計セルの次の行のアドレスを取得することで対応できる
- 参考：[How to get the current column name in Excel?](https://superuser.com/questions/316239/how-to-get-the-current-column-name-in-excel)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139562/a4181ae4-2530-176b-c52b-1a7cd6245da2.png)

# 条件に一致するセル数のカウント

- `COUNTIF(検索範囲, "<>")`：空欄でないセルをカウントする
- `COUNTIF(検索範囲, "*□*")`：□を含むセルをカウントする
Android Studio環境構築(2)日本語化

# はじめに

Androidアプリの開発のために、Android Studioの環境構築をします。
この記事で取り扱う環境は、Windows10です。

:::note info
真新しい情報ではありません。体系立てて理解を整理するために、自分が理解しやすい枠組みでまとめるものです。
:::

## ひとつ前
https://qiita.com/w2mjra555/items/b76ce2d1fd3691738ed5

## ひとつ先
https://qiita.com/w2mjra555/items/9790e32c01d6e53e4bc0

# Android Studio日本語化

## 1.プラグインの入手

> Pleiades は Eclipse のような Java アプリケーションを日本語化するためのツールです。


環境に応じて取得します。

https://mergedoc.osdn.jp/#pleiades.html#PLUGIN

## 2.日本語化

### 2.1.プラグインの実行

> 7-Zip で zip を解凍して setup.exe でインストーラーを起動

とあるので、素直に7-Zipで解凍してみます。

https://www.7-zip.org/

解凍先のフォルダで、`setup.exe`を実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/6d6da02b-7635-cb9a-2f32-ba259398087e.png)

セットアップ画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/a8215740-b535-a9fa-8c80-9eb1c27cf50a.png)


### 2.3.日本語化するアプリケーションの指定

「選択…」を押下して、Android Studioインストール先の対象のexeを指定します。

`(インストール時に構成の設定で指定したインストール場所)\bin\studio64.exe`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/bba8daf9-b2ad-8f98-68e8-b93c6a81ee65.png)

:::note info
ここに表示されるパスは、Android Studioの完全なアンインストールをする際に、実はちょっと参考になります。Android Studioは、コントロールパネルからのアンインストールだけでは、色々と残骸が残ってしまうため、キレイに戻したければ、手動で消して回らないといけないようです。ただ、ここに挙がっているもので全てでもありませんが…。
:::

### 2.4.日本語化

「日本語化する」を押下します。
完了したらメッセージが出るので「OK」を押下し、さらに「終了」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/1dcacfe8-767a-c774-82d2-b80019a40f2a.png)


起動してみると、日本語化されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/438c311c-23e7-e0fc-b78a-79678eab31c7.png)
データ基盤問題集

# 問題
データ基盤設計において、統合型データ基盤を採用した場合のメリットを、データレイク型データ基盤を採用した場合と比較して３つ述べよ。

# 回答例
1. データレイク型では、blobとしてあらゆるデータを一元管理することでサイロ化を防ぐ設計とするが、統合型では監視・運用基盤をデータ基盤に組み込むことで、設計、実装面での負荷を下げ、サイロ化を防ぐことができる。

2. データレイク型ではデータクレンジングや加工の為にETLを設計・実装する必要があり、インタフェースやセキュリティ面での設計負荷が高いが、統合型の場合は製品仕様にある程度委ねることができるため、設計負荷が低い。

3. データレイク型では、blobとしてあらゆるデータを格納・保管することが可能であり、この点RDBMSを採用する統合型は格納データの制限を受けるが、統合管理ツールによってNoSQL及びHadoop等分析基盤とのデータベース越しのグータッチを可能とすることで、格納データの制限を受けにくくすることができる。


# 解説
データレイク型と統合型を比較しつつ、主に以下3点について論じる。
1. サイロ化について
2. 何でもいいから設計負荷について
3. データベース越しのグータッチについて

>> **データベース越しのグータッチ**
異なるデータセットを扱うデータベース（e.g. MongoDBとCosmosDBとRedshift等）間をシームレスに結合・集計すること。頻出表現である。

分散型についても同様に比較することができるようにしましょう。
【Swift】レビューについて

# やり方1
アプリ内でレビュー依頼を行う
```Swift
import StoreKit // 必須

if let windowScene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene {
    SKStoreReviewController.requestReview(in: windowScene)
}
```

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/b56ad744-4885-ad76-533f-84368b744140.gif">

# やり方2
AppStoreのレビュー欄に遷移する
```Swift
guard let url = URL(string: "https://itunes.apple.com/app/id{アプリID}?action=write-review") else { return }
UIApplication.shared.open(url)
```
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/f3390e15-ba09-d42a-66fa-0682a6216c82.gif">

# 使い分け
### やり方1
**メリット**
- アプリ内で完結するのでUXがいい

**デメリット**
- ユーザーの設定次第で表示されない可能性がある

### やり方２
**メリット**
- 確実にレビュー画面を表示できる

**デメリット**
- AppStoreに遷移するのでUXが悪い

自動表示はやり方1
ボタン表示はやり方２
このような使い分けがいいと思います。

アプリ10個リリースして思うことはレビューはお願いしないとしてくれないってことです
個人開発者にとってレビューはモチベなのでレビュー依頼機能は絶対に実装しましょう
hyper-vの仮想ネットワークスイッチで躓いたこと

## hyper-vのデフォルトスイッチの誤解
私は"windows10pro"の環境でubuntuserverを入れようとして度々インストールエラーに陥った。
当初は固定IPの設定に問題があるのかと思ったが、実際はそれ以前の問題だった。

何故なら…、**wifiアダプターでは`defaultswitch`を利用できない**…からである。

試しにhyper-vで仮想スイッチの設定を開いてみよう。

![defultswitch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608196/2d83f155-c4f4-0bdf-a2df-49f329671ae7.png)

上の画像の様にdefaultswitchでは設定自体がノンアクティブ状態になっており変更できない。
あるいはホストのネットワーク接続で無理やりブリッジすることは出来るかもしれないが、
下手に触るよりは新規で外部仮想スイッチを作り下の画像の様にwifiアダプターに接続した方が良いかもしれない。

![外部仮想スイッチ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608196/eafbc15a-aef8-52a4-ae10-3cc4e9b4f072.png)

結果として、ubuntuserverをインストール出来たので一先ず一件落着。
AWS公式資料で挑むMLS認定(1)-試験ガイドを読む

## はじめに

AWS認定機械学習–専門知識(AWS Certified Machine Learning - Specialty)(MLS-C01)
の試験準備を、AWS公式資料をベースに、演習交えながら進めようと思います。
資格もさることながら、真の機械学習スペシャリストを目指したい。

※ 余談で、別試験で頂いた50%割引試験バウチャーを使えるとのこと。

## MLS資格とは

[AWS認定ページ](https://aws.amazon.com/jp/certification/certified-machine-learning-specialty)から

- この資格は、組織がクラウドイニシアチブを実装するための重要なスキルを持つ人材を特定して育成するのに役立ちます
- `AWS Certified Machine Learning - Specialty`を取得すると、AWSで下記機械学習(ML)分野に関する専門知識を認定します
    - モデルの構築
    - トレーニング
    - チューニング
    - デプロイ

## 試験ガイドを読む

[AWS Certified Machine Learning - Specialty(MLS-C01) 試験ガイド](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-ml/AWS-Certified-Machine-Learning-Specialty_Exam-Guide.pdf)に、
出題内容と比率が記載されていました。

次のタスクについての受験者の能力も検証されるとのことです。

- 特定ビジネス課題に対し適切な機械学習アプローチを選択し、その正当性を説明する
- 機械学習ソリューションの実装に適したAWSサービスを特定する
- スケーラビリティ、コストの効率生、信頼性、安全性に優れた機械学習ソリューションを設計および実装する

## 出題範囲の分野

- 第1分野: データエンジニアリング
    - 1.1 機械学習のデータリポジトリを作成する
    - 1.2 データ取り込みソリューションを特定および実装する
    - 1.3 データ変換ソリューションを特定および実装する
- 第2分野: 探索的データ分析
    - 2.1 モデリング用のデータをサニタイズおよび準備する
    - 2.2 特徴エンジニアリングを実行する
    - 2.3 機械学習のデータを分析および視覚化する
- 第3分野: モデリング
    - 3.1 ビジネス上の課題を機械学習の課題として捉え直す
    - 3.2 特定の機械学習課題に対し適切なモデルを選択する
    - 3.3 機械学習モデルのトレーニングを行う
    - 3.4 ハイパーパラメータの最適化を実施する
    - 3.5 機械学習モデルを評価する
- 第4分野: 機械学習の実装とその運用
    - 4.1 パフォーマンス、可用性、スケーラビリティ、回復性、および耐障害性を備えた機械学習ソリューションを構築する
    - 4.2 特定の課題に対して適切な機械学習サービスと機能を提案および実装する
    - 4.3 基本的な AWS セキュリティプラクティスを機械学習ソリューションに適用する
    - 4.4 機械学習ソリューションのデプロイと運用を行う

## 出題範囲のツール、テクノロジー、概念

- 取り込み/収集
- 処理/ETL
- データ分析/可視化
- モデルトレーニング
- モデルのデプロイ/推論
- 運用型
- AWS機械学習アプリケーションサービス
- 機械学習に関連する言語(Python、Java、Scala、R、SQLなど)
- ノートブックおよび統合開発環境(IDE)

## 出題範囲のAWSサービスと機能

- アナリティクス
    - Amazon Athena
    - Amazon EMR
    - Amazon Kinesis Data Analytics
    - Amazon Kinesis Data Firehose
    - Amazon Kinesis Data Streams
    - Amazon QuickSight
- コンピューティング
    - AWS Batch
    - Amazon EC2
- コンテナ
    - Amazon Elastic Container Registry(Amazon ECR)
    - Amazon Elastic Container Service(Amazon ECS)
    - Amazon Elastic Kubernetes Service (Amazon EKS)
- データベース
    - AWS Glue
    - Amazon Redshift
- IoT
    - AWS IoT Greengrass
- 機械学習
    - Amazon Comprehend
    - AWS Deep Learning AMIs(DLAMI)
    - AWS DeepLens
    - Amazon Forecast
    - Amazon Fraud Detector
    - Amazon Lex
    - Amazon Polly
    - Amazon Rekognition
    - Amazon SageMaker
    - Amazon Textract
    - Amazon Transcribe
    - Amazon Translate
- マネジメントとガバナンス
    - AWS CloudTrail
    - Amazon CloudWatch
- ネットワークとコンテンツ配信
    - Amazon VPC
    - AWS Identity and Access Management(IAM)
- サーバーレス
    - AWS Fargate
    - AWS Lambda
- ストレージ
    - Amazon Elastic File System (Amazon EFS)
    - Amazon FSx
    - Amazon S3

おっと、盛沢山で、初耳のサービス名もあるようです。
でも、よく見ると機械学習に特化したサービスは十個程度ですかね。

## 出題範囲外のAWSサービスと機能

- AWS Data Pipeline
- AWS DeepRacer
- Amazon Machine Learning(Amazon ML)

## おわりに

勢いを頼りにスタート切りました。
後は、各分野の知識を身につけながら、AWSジャーニーを楽しむのみです。

##### [次回] [AWS公式資料で挑むMLS認定(2)-AI/機械学習(ML)の基本](https://qiita.com/mingchun_zhao/items/7daeda4ffaf38b416d7e)
Android Studio環境構築(1)インストール

# はじめに

Androidアプリの開発のために、Android Studioの環境構築をします。
この記事で取り扱う環境は、Windows10です。

:::note info
真新しい情報ではありません。体系立てて理解を整理するために、自分が理解しやすい枠組みでまとめるものです。
:::

## ひとつ先

https://qiita.com/w2mjra555/items/88eb12472c39409b51e8

# Android Studioインストール

## 1.Android Studioの入手

公式サイトから最新版を取得します。

https://developer.android.com/studio

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/1c4a3b65-71c6-8df5-404b-9297b6bc9da6.png)

書いている時点では`android-studio-2021.1.1.23-windows.exe`でした。

## 2.インストール

### 2.1.インストーラの実行
ダウンロードした`android-studio-XXXXXXXXXXX-windows.exe`を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/d78915f7-a1f6-8703-3dc1-e58dc3fc92e9.png)

### 2.2.Android Studioセットアップを始める
「次へ(Next)」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/27a20eb2-cae8-fe46-0086-b8cd91d1b58a.png)

### 2.3.コンポーネントの選択
デフォルト(すべて選択状態)のまま「次へ(Next)」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/2904ed85-d62a-586f-707e-6419c96a13ce.png)

### 2.4.構成の設定(インストール場所)
デフォルトのまま「次へ(Next)」を押下します。
`C:\Program Files\Android\Android Studio`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/11b897d8-1b1c-ff3d-ac70-c47ba39944b9.png)

### 2.5.スタートメニューフォルダの選択
デフォルトのまま「インストール(Install)」を押下します。
`Android Studio`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/ea10d5b8-430f-6f11-b4f8-f61cbd6856cc.png)

:::note info
おそらく、インストール後のここに反映されると思われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/b66ee7e4-4b84-160a-720b-d4543099d6bb.png)
:::

### 2.6.インストール

完了まで待機します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/47375bda-f75b-52ff-706d-ed0d8e7a051c.png)

### 2.7.インストールの完了

「次へ(Next)」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/65d0aa77-f4fc-14d6-fda0-37e4f8ac6fa6.png)

### 2.8.Android Studioセットアップの完了
「Start Android」チェックボックスは一旦チェックを外して「完了(Finish)」を押下します。
チェックしたまま進んでもよいのですが、今回はここで中断します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/ac6a589a-9c91-50a0-c3e8-66fabd428360.png)
とりあえず　starshipを　入れてくれ

## starship

:::note
ターミナルのプロントをめっちゃいい感じにしてくれるツール
Rustで書かれているのもエモい
:::

https://starship.rs/

## どんな感じ？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2013882/409feca2-5480-2980-f826-123e01322bc6.png)

エモい
（なんかミスってそうだけど）

## インストール
### mac

1. starshipを入れる
```zsh
brew install starship
```

2.シェルの設定
```zsh:zshの場合
eval "$(starship init zsh)"
```
```zsh:bashの場合
eval "$(starship init bash)"
```

以上！

## option
見た目をデフォルト以外に変えたいなら...

```zsh
mkdir -p ~/.config && touch ~/.config/starship.toml
```

https://starship.rs/config/

このページに従って好きに変更する！!
VirtualBox + Ubuntu 20.04セットアップ忘備録

VirtualBoxへのUbuntu 20.04のインストールは完了している前提

# VirtualBoxとWSLは共存できない?
最新のVirtualBoxとWSLは共存できるらしいが、筆者環境だとできなかったので以下の手順でWSLを無効化した。

https://qiita.com/GeekMasahiro/items/eee9193d8f4ae93d9d9a

以下抜粋
PowerShellで以下を実行する
```sh
Disable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
```

# ホストWindowsからsshアクセスする
VirtualBoxのGUI画面からターミナルを開いて作業するのも良いが、Windowsにインストールされているターミナルソフトからsshアクセスして使いたい。

## 1. sshサーバーのインストール
こちらの手順を参考にする。
https://codechacha.com/ja/ubuntu-install-openssh/

以下抜粋

```sh
sudo apt update
sudo apt install openssh-server
sudo systemctl enable ssh
sudo systemctl start ssh
```

## 2. VirtualBoxのネットワーク設定
UbuntuをシャットダウンしてVirtualBoxの設定を変更できるようにする。

### アダプター1の設定
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106314/5fc075b4-5c98-1576-669f-fb7e5a3ec07b.png)

`ネットワーク` -> `アダプター1` -> `ポートフォワーディング`
アダプター1を有効化し、割当を`NAT`にする

以下を設定

![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106314/5ba39950-7c3c-11ce-d25d-549f0b33798b.png)

- 名前:`ssh` (適当に)
- プロトコル: `TCP`
- ホストポート: `22`
- ゲストポート: `22`

### アダプター2の設定
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106314/8ebeb67f-941c-de5b-7ae7-225d23cd9d96.png)

`ネットワーク` -> `アダプター2`
アダプター2を有効化し、割当を`ホストオンリーアダプター`にする

### ホストネットワークマネージャの設定
以下のように設定する。
![6-ホストネットワークマネージャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106314/00c09794-9ae4-7d93-4282-f4d70b518ea7.png)


IP: `192.168.56.1`
マスク: `255.255.255.0`
DHCPは無効化する

## 3. Ubuntu 20.04のネットワーク設定

`Setting` -> `Network`
![9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106314/a51caca4-fe6e-20e2-c7a2-ae7183966205.png)


### Ethernet (enp0s3): NATアダプター
特に設定は不要だが、わかりやすいように名前を`InterNet`に変更する。インターネット接続に使用する。

### Ethernet (enp0s8): ホストオンリーアダプター
![10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106314/d8a50c4b-572e-3bb9-3a74-fbe938964ace.png)

VirtualBoxのホストオンリーアダプターに相当する。
+から設定を追加して名前を`SSH-host`とする。
IPv4アドレスを`192.168.56.101`に設定する。ストネットワークマネージャの値(`192.168.56.1`)と異なる値を入れる。

## 4. ネットワークの有効化
![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106314/1f8b356b-4fb7-bcaa-f20e-b0ef4e8129d4.png)

右上のメニューから`enp0s3`が`InterNet (NAT)`、`enp0s8`が`SSH-host(ホストオンリーアダプター)`となるようにする。

この状態でWindows PCから`192.168.56.101`にssh接続することができる。
さくらのVPS スタートアップスクリプトで入れたCentOSのMastodonのアップデート

さくらのVPS スタートアップスクリプトで入れたCentOSのMastodonのアップデートを行う際に、案外、大切かもという(自分用の)備忘です。当たり前の方には当たり前のことです。
* https://vps.sakura.ad.jp/news/startup-mastodon/

入れた後の話です。例えば僕の環境ではスタートアップスクリプトでv3.5.1が入り、今回、v3.5.2に上げました。
~~~
$ sudo systemctl stop mastodon-*.service
~~~
これはいいですよね。次です。細かいところですが。
~~~
$ sudo su - mastodon
~~~
sudo su -は、sudo -iでも(のほうがモダンで)いいんでしょうけど、その辺は育ちと手の馴染みかと思います。ユーザーmastodonに切り替わったらlive以下でいつものアップデート手順を行います。
さくらVPSのスタートアップスクリプトがあまりに楽で追加設定が不要なこともあり、今回suのところで一瞬あれってなり、備忘しておくことにしました。以上です。
【MYSQL】カラム追加とインデックスと外部キーを同時に行う


些細なところで、あれ、どうしたらいいんだとなったので、残しておく。


カラム追加と外部キー名指定とインデックス名を指定したい場合は以下のように書ける。
```sql
CREATE TABLE `article_types` (
    `id` int NOT NULL,
    ...
);

ALTER TABLE `articles` 
    ADD COLUMN `article_type_id` INT NOT NULL COMMENT '記事種別',
    ADD INDEX `index_article_type_id` (`article_type_id`), // index名を付けたい場合
    ADD CONSTRAINT `fk_articles_article_type_id` FOREIGN KEY  (`article_type_id`) 
        REFERENCES `article_types` (`id`) 
            ON DELETE RESTRICT
            ON UPDATE CASCADE;
```


外部キーを設定すると自動でインデックスが作成されます。**xxx_ibfk**というような名前で。
独自に名前を決めたい場合は、
```sql
 ADD INDEX `インデックス名` (`カラム名`)
```

逆に消すときは
```sql
ALTER TABLE `articles`
    DROP FOREIGN KEY `fk_articles_article_type_id`,
    DROP COLUMN `article_type_id`;
```