OmniAICreator/Qiita-1.07M huggingface dataset:
JiraをServerからCloudに移行する際のハマりポイント

この記事は [**セゾン情報システムズ Advent Calendar 2021**](https://qiita.com/advent-calendar/2021/sisco) 2日目の記事です。

2021/11/30に開催された[#49 Tokyo Atlassian Community Online MeetUp](https://ace.atlassian.com/e/m8pawu/)に登壇してきました。
その資料から抜粋してJira移行時のハマりポイントを紹介します。

https://speakerdeck.com/yosuke_sakaue/jirawoserverkaracloudheyi-xing-sita-hua-tosofalsehou-falsecloudhuo-yong-nituite

### 前提
移行方式は[Jira Cloud Migration Assistant](https://ja.confluence.atlassian.com/cloud/use-the-jira-cloud-migration-assistant-to-migrate-from-server-to-cloud-993925215.html)を採用しました。
Jira Cloud Migration Assistantは移行先のデータを上書きしないので段階的な実現できます。
その反面、一部対応していないデータも存在しますので事前に確認が必要です。
移行されないデータは以下で確認ができます。

https://ja.confluence.atlassian.com/cloud/what-gets-migrated-with-the-jira-cloud-migration-assistant-993925216.html

特に、フィルターやダッシュボード、複数のプロジェクトを横断しているボード、通知スキームなどは注意が必要です。

### ハマりポイント①
***移行先環境でアカウントにJira権限が付与されない***
Jira Cloud Migration Assistantでは移行するプロジェクトを選択し、ユーザーとグループの移行オプションを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/5a8c4400-9f49-6fb7-69e0-c037b6d675df.png)

画像のように選択すると、そのプロジェクトに関連するユーザーおよびグループのみを移行する設定になります。
本来Jiraにアクセス権のあるユーザーは「jira-software-users」グループに所属していますが、「jira-software-users」そのものは対象のプロジェクトロールに含まれていないため、ユーザーは「jira-software-users」に参加していない状態で移行されます。
ゆえに移行先環境では「jira-software-users」に所属しておらず、Jiraにアクセスできません。

***解決方法***
移行前にプロジェクトのロールに「jira-software-users」を含める必要があります。
もしくはすべてのユーザー、グループを移行する「All users and groups from the jira dorectory」を選択しましょう。

### ハマりポイント②
***一部課題タイプが移行先でマッピングされず、新規で作成されてしまう***
移行元Serverの規定言語が日本語だったため、Epicが「エピック」で作成されており、マッピングができなかった（Epicの場合はエピックリンクなども外れてしまう）
Softwareタイプのストーリーやバグでも発生するので注意してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/7661ce81-b7ce-4bac-8561-cca38819d77b.png)

***解決方法***
Server側の課題タイプ名を英語表記に変更
JQL等に影響があったのでユーザーへの周知

### ハマりポイント③
***移行先環境で特定のリソースに(migrated)が付与されて重複してしまう***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/4ff2196b-6091-56bb-220d-819fd1db4cb7.png)
Migration Assistantは移行済みのエンティティ情報を保持しています
そのため以下のようなデータは重複する可能性があります

- 元のサイトと移行先サイトの両方に存在するデフォルト エンティティ
- 移行間でリセットされた移行テーブル
- 移行間で削除された一部のデータ

https://ja.confluence.atlassian.com/cloud/how-the-jira-cloud-migration-assistant-links-your-data-993925217.html

***解決策***
検証環境と本番移行先は分けてテストするか、検証終了後にCloudのリセットを実施する
重複してしまったリソースは移行完了後に手動でマージする

### ハマりポイント④
***段階的移行の場合、ServerとCloudの並行期間が発生するため、移行済みのプロジェクトは更新を止めたい***
移行元でプロジェクトへの参照権限のみに絞った権限スキームを作成し、移行済みのプロジェクトに適用する


### おわりに
これから移行を実施する方、移行を検討している方の参考になれば幸いです。

### 関連リンク
- [Cloud移行ガイド](https://www.atlassian.com/ja/migration/plan/cloud-guide?tab=phased#introduction)
- [クラウドへの移行方法の比較](https://support.atlassian.com/ja/migration/docs/compare-cloud-migration-methods/)
- [日本語環境で Jira Cloud Migration Assistant を利用する前のチェックリスト](https://confluence.atlassian.com/jpns/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B8%E3%83%99%E3%83%BC%E3%82%B9/%E6%97%A5%E6%9C%AC%E8%AA%9E%E7%92%B0%E5%A2%83%E3%81%AB%E7%89%B9%E6%9C%89%E3%81%AE%E5%95%8F%E9%A1%8C%E3%81%A8%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0/jira-cloud-migration-assistant)
IBM Technology Zone の歩き方

##IBM Technology Zone
IBM Technology Zone (以下 Techzone)はIBM Solutionのトライアルができる環境です。
利用には、IBMID（要登録、無料）が必要です。

IBMIDの登録方法は[こちら](https://qiita.com/Shumpei_Kubo/items/564126081dea547dd742)

2021年12月現在、Techzone では 10種類のサービスを試すことができます。
課題解決の近道に、ソリューションが有用かどうか、ご自身で判断いただけるよう、どうぞ実際に動かしてみてください。

**IBM Technology Zone URL**
https://techzone.ibm.com/

![スクリーンショット 2021-12-01 10.57.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245231/fd3229cb-f09d-38eb-1174-d4b2e1869b72.png)

###トライアル可能な製品
現在は以下の製品がラインナップされています。

**Cloud Pak for Data**
**IBM Observability by Instana APM**
**Cloud Pak for Business Automation**
**Watson Assistant: Intelligent virtual agent**
**Cloud Pak for Integration**
**IBM DataStage**
**IBM Sterling Supply Chain Business Network**
**IBM Security Verify SaaS**
**IBM Security MaaS360 with Watson**
**IBM Planning Analytics with Watson**

###機能概要

**Cloud Pak for Data**
オープンで拡張可能なデータプラットフォーム、愛称はCP4D
マルチクラウド環境下でさまざまなデータをAIと分析に利用できるようデータファブリックを提供します。
トライアル内のすべての製品ドキュメントとラボガイドにアクセスできます。
構築のヒントになるサンプルプロジェクトが多数提供されています。

**IBM Observability by Instana APM**
話題のInstana、ハイブリッドクラウド向けのエンタープライズ可観測性プラットフォームをお試しください。

**Cloud Pak for Business Automation**
高速なプロセスとより短いクライアント待機時間–それがAIを活用した自動化の素晴らしさ
14日間の無料トライアルに登録し、製品ドキュメント、ラボガイド、および対象分野の専門家によるサポートをお試しください。

**Watson Assistant: Intelligent virtual agent**
Watson Assistantインテリジェント仮想エージェント
あらゆるチャネルで、顧客の問題解決を支援します。30日間の無料トライアルに登録して、製品ドキュメント、ラボガイド、サポートを体験ください。

**Cloud Pak for Integration**
アプリケーションの速度と品質の向上—それがAIを活用した統合の価値です。
14日間の無料トライアルを提供しています。

**IBM DataStage**
クラウドネイティブデータ統合を使用してAIイノベーションを加速する方法を体験してください。

**IBM Sterling Supply Chain Business Network**
API機能とのEDI統合の力を強化する信頼できるスケーラブルな企業間ネットワークについてご体験ください。
30日間のトライアル環境を提供しています。

**IBM Security Verify SaaS**
単一のクラウドネイティブIDソリューションで従業員と消費者のIDおよびアクセス管理を一元化する方法を体験してください。一定条件のもと、要件をトライアルテナントを本番環境に直接移行も可能です。90日間の無料トライアルを提供しています。

**IBM Security MaaS360 with Watson**
AI主導の統合エンドポイント管理（UEM）を使用してモバイルワーカーを管理および保護する方法を体験してください。
30日間の無料トライアル環境を提供しています。

**IBM Planning Analytics with Watson**
企業全体の財務計画と運用計画を合理化および統合する方法を学びます。
30日間の無料トライアルを提供しています。

###最後に
トライアル環境ではLabのサンプルデータの提供が停止していたり、利用できるリージョンが限定されているものもあります。お気づきの点は、提供環境のFeedbackよりコメントください。
counter measure for pyenv install error

# while install old version python by pyenv

```

CFLAGS="-I$(brew --prefix openssl)/include -I$(brew --prefix bzip2)/include -I$(brew --prefix readline)/include -I$(xcrun --show-sdk-path)/usr/include" LDFLAGS="-L$(brew --prefix openssl)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install --patch 3.6.5 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1)
```
JDBC基礎


```DBManager.java

package jp.co.sss.jdbc.chapter01;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DBManager {
 /** ドライバクラス名 */
 private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
 /** 接続する DB の URL */
 private static final String URL = "jdbc:oracle:thin:@localhost:1521:XE";
 /** DB 接続するためのユーザ名 */
 private static final String USER_NAME = "jdbc_user";
 /** DB 接続するためのパスワード */
 private static final String PASSWORD = "systemsss";
 /**
 * DB と接続する
 *
 * @return DB コネクション
 * @throws ClassNotFoundException
 * ドライバクラスが見つからなかった場合
 * @throws SQLException
 * DB 接続に失敗した場合
 */
 public static Connection getConnection() throws ClassNotFoundException,SQLException {
 //JDBC ドライバクラスを JVM に登録
 Class.forName(DRIVER);
 //DB に接続
 Connection conn = DriverManager.getConnection(URL, USER_NAME,PASSWORD);
 System.out.println("DB に接続しました");
 return conn;
 }
 /**
  * DB との接続を切断する
  *
  * @param connection
  * DB との接続情報
  */
  public static void close(Connection connection) {
  if (connection != null) {
  try {
  connection.close();
  System.out.println("DB と切断しました");
  } catch (SQLException e) {
  e.printStackTrace();
  }
  }
  }
  /**
  * PreparedStatement をクローズする
  *
  * @param preparedStatement
  * ステートメント情報
  */
  public static void close(PreparedStatement preparedStatement) {
  if (preparedStatement != null) {
  try {
  preparedStatement.close();
  } catch (SQLException e) {
  e.printStackTrace();
  }
  }
  }

  /**
   * ResultSet をクローズする
   *
   * @param resultSet
   * SQL 検索結果
   */
   public static void close(ResultSet resultSet) {
   if (resultSet != null) {
   try {
   resultSet.close();
   } catch (SQLException e) {
   e.printStackTrace();
   }
   }
   }
  }

```
##各種定数を定義
private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
 /** 接続する DB の URL */
 private static final String URL = "jdbc:oracle:thin:@localhost:1521:XE";
 /** DB 接続するためのユーザ名 */
 private static final String USER_NAME = "jdbc_user";
 /** DB 接続するためのパスワード */
 private static final String PASSWORD = "systemsss";

##getConnectionメソッド

Connection型のgetConnectionを定義　
throwsでエラーの時に返すエラー処理を記述

Class.forName(DRIVER)；でオラクルとのやり取りを出来るようにする
ドライバは「ojdbc7.jar」

DriverManager.getConnectionでDBに接続する処理を書く。
引数のURL,USER,PASSをもとにDB 接続に成功すると、このメソッドは Connection 型のオブジェクトが戻り値として返される。
JAVA　継承



```Constant2301.java

package lesson23;

public class Constant2301 {
 public static final String POLICE = "警察官";
 public static final String TEACHER = "教師";
 public static final String CHEF = "料理人";
}

```

```Chef2301.java
package lesson23;

public class Chef2301 extends Worker2301 {

	public Chef2301(String name, int age) {
		super(Constant2301.CHEF, name, age);
	}

	public void doWork() {
		System.out.println("食事を作ります。");
	}
}

```

```Display2301..java
package lesson23;

public class Display2301 {

	public static void displayWorkers(Worker2301[] workers) {
		for(Worker2301 worker : workers) {
			worker.showIntroduction();
			worker.doWork();
		}
	}

}

```

```Police2301.java

package lesson23;

public class Police2301 extends Worker2301 {

	public Police2301(String name, int age) {
		super(Constant2301.POLICE, name, age);
	}

	public void doWork() {
		System.out.println("地域や人々の安全を守ります。");
	}
}


```

```Sample2301.java

package lesson23;

public class Sample2301 {
	 public static void main(String[] args) {

		Worker2301[] workers = new Worker2301[3];


		// サブクラスのオブジェクトを配列に追加
		 // 警察官クラスのオブジェクトを生成して、コンストラクタを呼び出す
		 workers[0] = new Police2301("田中", 28);
		 // 教師クラスのオブジェクトを生成して、コンストラクタを呼び出す
		 workers[1] = new Teacher2301("佐藤", 53);
		 // 料理人クラスのオブジェクトを生成して、コンストラクタを呼び出す
		 workers[2] = new Chef2301("鈴木", 31);
		 // 出力用クラスに各オブジェクト情報を渡す
		 Display2301.displayWorkers(workers);


	 }
}

```

```Teacher.java

package lesson23;

public class Teacher2301 extends Worker2301 {

	public Teacher2301(String name, int age) {
		super(Constant2301.TEACHER, name, age);

	}

	public void doWork() {
		System.out.println("知識を教えます。");
	}
}

```

```Worker2301.java

package lesson23;

public abstract class Worker2301 {

	protected String job;
	protected String name;
	protected int age;

	Worker2301(String job, String name, int age){

		this.job = job;
		this.name = name;
		this.age = age;

	}

	public void showIntroduction() {
		System.out.println("名前は" + name + "、年齢は" + age + "歳、職業は" + job + "です。");
	}

	public abstract void doWork();

	public String getJob() {
		return job;
	}

	public void setJob(String job) {
		this.job = job;
	}



	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

```















##使われた用語
【CSS】margin: 0 auto;とmargin: auto;の違いとは

# ？？？「margin: auto;だと上下にもautoされちゃうよ」
いいえ。一緒です。
上下のmarginもautoになりますが、結果的に0になります。

> If 'margin-top', or 'margin-bottom' are 'auto', their used value is 0.

[W3C Visual formatting model details](https://www.w3.org/TR/CSS2/visudet.html#inline-replaced-height)

# ？？？「じゃあmargin: auto;でよくね？」
確かにそうなんだけど。
今後の仕様変更でもしmarginの上下の初期値が変更になったらそのサイト修正が必要になる気がするので
僕はmargin: 0 auto;派で行きたいと思います。

ご意見ください。
バージョン管理システム（GitとSVNの違い）

## はじめに
開発の現場ではどのようなバージョン管理システムを利用するのがよいでしょうか。
アプリケーションはソースコードを含めたファイルの集合によって作られています。
開発の現場ではファイルの変更も頻繁に、かつ複数名で行われることが多いです。

そうなると大変となるのがソースコードの管理です。

この記事ではバージョン管理システムの導入を検討している方のためによく聞かれるGitとSVNの違いについてエンジニアの視点から伝えします。


## バージョン管理とは...
バージョン管理システムとはソースコード等のファイルを管理するシステムです。
いつ、だれが、どこにファイルを作成したか、また更新を加えたのか、などの過去のバー所を保持することができます。
障害や要望が発生した際にある時点のバージョンまで遡ることが容易になります。

また、同じソースコードに対して複数人が同時に作業を行ってもソースコードの最新版を見失わないようになります。

GitもSVNも共にバージョン管理システムであり、古典的なバージョン管理システムであるCVSからの流れを汲んでいます。


## GitとSVNの違い
GitとSVNの大きな違いはバージョン管理システムの種類にあります。
Gitは分散型バージョン管理システム
SVNは集中型バージョン管理システムとなります。

集中型バージョン管理システムでは、リポジトリ（ファイルのバージョン管理を行う場所）はリモート環境のみに存在します。
開発メンバーはリモート環境のリポジトリにアクセスし、各ローカル環境にあるファイルをコミットしたり、ローカル環境へチェックアウトしたりします。

※コミット：新バージョンとしてのファイル保存
※チェックアウト：特定バージョンのファイル取得

分散型バージョン管理システムでは、リポジトリはリモート環境のみではなく、開発メンバーの各ローカル環境にも存在します。
メンバーは自身のローカル環境のリポジトリを作る際は、リモート環境のリポジトリから特定のバージョン情報をプル（Pull）して各ローカルにリポジトリを作成します。
メンバーは開発を行った際にローカル環境でコミットやチェックアウトを行います。
ローカル環境でコミットしたファイルについては適切なタイミングでプッシュを行い、リモート環境のリポジトリへコミットを反映させます。


## Gitについて
[公式サイト](https://git-scm.com/)

### Gitソースコード管理のイメージ
![02.キャプチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2109986/9ddbb7fe-4ce5-3848-6368-1a5da5c57ce4.png)

### 特徴（メリット・デメリット）
Gitの場合ローカルにあるリポジトリに自身のソースを登録することが可能なので、自分の作業の履歴を作ることが可能です。
チーム全体の履歴だけでなく、自分の開発履歴まで管理できるのが特徴です。

また、サーバ障害などでリポジトリが消えてしまったとしても、SVNの場合履歴の復元までは不可能ですが、Gitの場合は誰かのローカル環境のリポジトリから復元すれば、サーバから取得時点にはなりますが、履歴まで復元することが可能です。

デメリットとしては、慣れてしまえば簡単ですがそれなりに覚えることが多い点です。
プロジェクト内で初めて使う人が多い場合、使用方法などを浸透させるのに時間がかかります。


## SVN（Subversion）について
[公式サイト](https://subversion.apache.org/)

### SVNソースコード管理のイメージ
![01.キャプチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2109986/c76747a5-8e37-9bbf-a378-24e3b0653982.png)

### 特徴（メリット・デメリット）
仕組みが簡単な点がメリットです。
SVNを扱う際も操作がとてもシンプルなので覚えることが少なく、すぐにプロジェクト内で浸透させることが可能です。

デメリットとしては、やはりバージョンの管理がローカルでできない点です。
例えばソースを開発しているときに、細めにコミットし個人で履歴を持ちたいことはあると思います。
SVNの場合、サーバに対してコミットを行うことになるので、たくさんの開発者で共有しているリポジトリに対して細めにコミットは難しくなります。


##　おわりに
それぞれの特徴や違いを理解できましたでしょうか。

それぞれのメリットやデメリットを理解した上で導入をご検討ください。
複数名での開発時にとても便利になると思います。
mozc起動時のデフォルト入力をひらがなにする

# はじめに
ubuntuで日本語入力するのにmozcを使っていると、起動時に直接入力になっている
GUIからポチポチやれば設定を変えれるけど、毎回やるのがめんどくさい
デフォルト変えれるみたいなので変更してみた

# 環境
Ubuntu20.04

# やり方

```bash
$ sudo apt update
$ sudo apt install build-essential devscripts -y
$ sudo vim /etc/apt/sources.list
```

`deb-src http://jp.archive.ubuntu.com/ubuntu/ focal main restricted`のコメントを外す

```bash
$ sudo apt update
$ sudo apt build-dep ibus-mozc
$ apt source ibus-mozc
$ cd mozc-2.23.2815.102+dfsg/
```

`kActivatedOnLaunch`をtrueに設定する

```bash
$ vim src/unix/ibus/property_handler.cc
```

```property_handler.cc
#if IBUS_CHECK_VERSION(1, 5, 0)
//const bool kActivatedOnLaunch = false; //この条件をtrueにする
const bool kActivatedOnLaunch = true;
#else
const bool kActivatedOnLaunch = true;
#endif  // IBus>=1.5.0
```

ビルドしてインストールする

```
$ dpkg-buildpackage -us -uc -b
$ sudo dpkg -i ../mozc*.deb ../ibus-mozc*.deb
```


再起動するとmozcのデフォルト入力がひらがなになった状態で起動する

以上
文字列をランダムなストリームに変換する

与えられた文字列をバラバラにして、ランダムに並び替えて出力する Enumerator を返すメソッドというものを考えてみましょう、と思ったのですが…

まずは、愚直に1文字ずつ取り出す仕方を考えると、文字列を配列に変換して、`Array#delete_at`を使うかなと。こんな感じ。

```ruby:random_stream1.rb
def random_stream1(str)
  tmp = str.chars
  Enumerator.new do |y|
    tmp.size.times do
      y << tmp.delete_at(rand(tmp.size))
    end
  end
end

str = "Ruby is smart programming language!"
stream1 = random_stream1(str)
stream1.to_a.join    #=>"rlg uin!yaR rsgansbae tugmmamrop ig"
```

それよりも、便利メソッド`Array#shuffle`を使えば、もっと簡単か。せっかくストリームにしているので、改行コードがあったところで切ってみることにしましょう。

```ruby:random_stream2.rb
def random_stream2(str)
  str.chars.shuffle.to_enum
end

str = "Ruby is smart programming language!\n"
stream2 = random_stream2(str)
stream2.to_a.join                         #=>"gniaasanmoy\n grgietsla p mg!u umrbRr"
stream2.take_while { _1 != "\n" }.join    #=>"gniaasanmoy"
```

でも、メモリ効率を考えて Enumerator を返しているのに、途中で配列に直しているのがどっちもいまいちって感じがするんですよねー…　なんかうまい方法はないもんですかねえ。
Unity Android 画面設定 ナビゲーションバーの表示

##0.0 はじめに
Unityで作ったアプリのデフォルト設定はナビゲーションバーが表示されません。ナビゲーションバーとは下に出てくる丸や三角や四角のボタンです。この設定では下からスワイプすることで表示はできますが、しばらくすると消えてしまいます。この記事では最初からナビゲーションバーを表示する方法、ナビゲーションバーを保持する方法を書いています。

##1.0 ナビゲーションバー常時表示
下記を最初のシーン入れます。これでアプリが立ち上がったらすぐにナビゲーションバーが表示されます。

```C#:Test.cs
void Awake(){
    Screen.fullScreen = false;
}
```

##2.0 戻るボタンの有効化（◁ボタン）
戻るボタンは1.0を設定しただけでは有効になりません。下記を各シーンに入れると戻るボタンを有効にして、アプリを終了させることができるようになります。

```C#:Test.cs
void Start () {
	Input.backButtonLeavesApp = true;
}
```
【Ruby on rails】 記事閲覧数を表示させる

ホームページ閲覧数を表示させる機能を追加

ruby 2.6.3p62
rails 5.2.6

# 1.新規実行内容

Gemfileに以下を追記

```
gem 'impressionist', '~>1.6.1'
```

railsバージョンとimpressionistバージョンによっては
エラーが発生するので注意

```
bundle install
```

```
rails g impressionist
```

impressionistテーブルを作ると以下が自動で作成されますが
使うのは1カラム(session_hash)である

```create_impressions_table.rb
class CreateImpressionsTable < ActiveRecord::Migration[5.2]
  def self.up
    create_table :impressions, :force => true do |t|
      t.string :impressionable_type
      t.integer :impressionable_id
      t.integer :user_id
      t.string :controller_name
      t.string :action_name
      t.string :view_name
      t.string :request_hash
      t.string :ip_address
      t.string :session_hash
      t.text :message
      t.text :referrer
      t.text :params
      t.timestamps
    end
    add_index :impressions, [:impressionable_type, :message, :impressionable_id], :name => "impressionable_type_message_index", :unique => false, :length => {:message => 255 }
    add_index :impressions, [:impressionable_type, :impressionable_id, :request_hash], :name => "poly_request_index", :unique => false
    add_index :impressions, [:impressionable_type, :impressionable_id, :ip_address], :name => "poly_ip_index", :unique => false
    add_index :impressions, [:impressionable_type, :impressionable_id, :session_hash], :name => "poly_session_index", :unique => false
    add_index :impressions, [:controller_name,:action_name,:request_hash], :name => "controlleraction_request_index", :unique => false
    add_index :impressions, [:controller_name,:action_name,:ip_address], :name => "controlleraction_ip_index", :unique => false
    add_index :impressions, [:controller_name,:action_name,:session_hash], :name => "controlleraction_session_index", :unique => false
    add_index :impressions, [:impressionable_type, :impressionable_id, :params], :name => "poly_params_request_index", :unique => false, :length => {:params => 255 }
    add_index :impressions, :user_id
  end

  def self.down
    drop_table :impressions
  end
end
```

```
rails db:migrate
```

# 2.既存ファイルへ追加

閲覧数を表示させたい、viewファイルのモデルに追記する。

```post.rb
class Post < ApplicationRecord

  is_impressionable # 閲覧数確認のため追加

end
```

「app/views/posts/show.html.erb」に表示させたいため
以下のような記載を追記

```app/controllers/posts.controller.rb
class PostsController < ApplicationController

  impressionist actions: [:show] # showアクションで閲覧数確認のため追加

 def show
    @post = Post.find(params[:id])
    impressionist(@post, nil, unique: [:session_hash.to_s])  # 閲覧数確認のため追加
 end

....

end
```

コントローラファイルへの追記部分二か所についてですが

①「impressionist :actions=> [:show]」という書き方でも大丈夫ですが、
　静的コード解析ツールのrubocop実行時に文法的にお叱りを受けてしまいました。
②.to_sメソッドをつけない場合は
「TypeError can't quote Rack::Session::SessionId」エラーが発生してしまったので
文字列に変換させましょう

最後にviewファイルに以下のような追記をすれば、閲覧数を表示させることができます。

```app/views/posts/show.html.erb
<%= @post.impressionist_count %>
```
ionicのサンプルプロジェクトを紹介

# ionicとは
モバイル（iOS、Android）、デスクトップアプリを作るためのフレームワークです。 言語は「Angular」「React」「JavaScript」「Vue」で使うことができます。
URL：[Ionic Framework](https://ionicframework.com/jp/docs/intro)

ionicはプロジェクト作成の際に、大枠となるサンプルプロジェクトを提案してくれます。サイドバーやタブだけでなく、カメラやマップがついた機能もあります。

# 必要なもの
* Node.js

# 始め方
コンソール（Windows）または、ターミナル（Mac）を開いてください。  
まず、ionicをnpmでインストールします。以下コマンドを入力してください。
```npm i -g ionic```
※モバイルアプリの開発の場合は以下を入力してください。Cordovaというモバイルアプリ開発用のフレームワークをインストールしています。
```npm i -g cordova ```
  
事前準備はこれだけです。  
続いて、プロジェクトの作り方です。以下を入力してください。
```ionic start```  

たまに、上記コマンドを入力すると、エラーが出る場合があります。  その場合は、以下を入力してから再度上記のコマンドを入力してください。
```npm cache clean --force```

ここから対話形式の質問に答えていきます。  

* ? Framework（AngularかReactかを選択してください。）
* ? Project name（素敵な名前をつけましょう。）
* ? Start template（テンプレートを選ぶことができます。Reactを例に挙げます。）
    * blank  
        シンプルな画面が作成されます。![01template_blank.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529686/009004f2-4c9b-a43b-b554-9fb73160bfa8.png)
    * list  
        リストが並んだ状態でページが作成されます。
        また、それぞれのリストはクリックするとページが遷移する状態になっています。![02template_list.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529686/4b8939cc-899d-6258-8bc7-6301a1627d72.png)
    * my-first-app  
        タブで切り替えができるページが作成されます。2つ目のページにはカメラが付いてます。添付している画像はPCで作成したサンプルプロジェクトですが、カメラが付いていれば特に何もしなくても機能をつけることができます。![03templat_my-first-app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529686/9959ed21-2887-022c-70fa-f9576b49af0b.png)
    * sidemenu  
        サイドメニュー付きのプロジェクトが作成されます。クリックするとそのページに遷移します。個人的には一番よく使うサンプルになるのかなと思っています。![04template_sidemenu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529686/5b5b75a2-ae4a-d2c3-8222-44697ab0ba71.png)
    * tabs  
        タブの着いたページが作成されます。my-first-appに近いですが、タブだけ付いているものでよりシンプルな作りになっています。
    * conference  
        最も凝ったプロジェクトが作成されます。サイドメニューもタブも付いていて、プロジェクトを始めると横にスライドするチュートリアルからスタートします。サイドメニューにはログイン・ログアウトのページやダークモードへの切り替えボタンも付いています。また、MapはGoogleMapと連携できるものが既に着いた状態で始まるので、お試しで始めるには色々付いてて面白いかもしれません。（GoogleMapはAPIキーを発行する必要があります。）
![05template_conference.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529686/ba3109f0-913e-ddb1-41fe-eb7f39e6dd6a.png)



上記に回答すると、自動でアプリが生成されます。  
アプリを立ち上げるには、以下コマンドを入力します。
```cd [作成したプロジェクト名]
npm start
```
上記コマンド実行後、自動でブラウザが立ち上がりますが、もし上がらない場合は「 http://localhost:4200/ 」 を見てみてください。

では、良いIonicLifeを！
IBMCloud Vyatta IPsecVPNにおける未サポート機能について

##未サポートの内容
Vyattaを用いてIPsecVPNをする場合、下記二点は未サポートになる。
1. <font color="red">トラフィックベース rekey</font>
2. <font color="red">vpn idel-timeout</font>

##トラフィックベースのrekey(lifetime kilobytes)
rekeyのタイミングを通信データ量で実施する方法

Ciscoだと下記の設定

```
　◆　Ciscoルータ
　(config)# crypto ipsec security-association lifetime [ seconds seconds | kilobytes kilobytes ]

◆　Cisco ASA
　(config)# crypto ipsec security-association lifetime { seconds number | kilobytes { number | unlimited} }
```

[参考:IPsec IKE Phase 2 - Cisco Configuration](https://www.infraexpert.com/study/ipsec11.html)

[参考:Cisco ASA シリーズコマンドリファレンス](https://www.cisco.com/c/ja_jp/td/docs/security/asa/asa-command-reference/A-H/cmdref1/c5.html)

####解決策
vyattaとの対向機器でトラフィックベースのrekeyを実装しない
実装していた場合は、無効化する事でvyattaとのIPsecVPNが安定する

```
set security-association lifetime kilobytes disable
```

##vpn idle-timeout
設定した時間で接続上の通信アクティビティがない場合、接続を終了する

Ciscoだと下記の設定

```
vpn-idle-timeout { minutes | none} [alert-interval minutes ]
```

[参考:Cisco ASA シリーズコマンドリファレンス](https://www.cisco.com/c/ja_jp/td/docs/security/asa/asa-command-reference/T-Z/cmdref4/v.html)

####解決策
vyattaとの対向機器でvpn idle-timeoutを設定しない
QAからの情報発信～CEDEC登壇をしてみたおはなし～

◆この記事を読むのにかかる時間：約5分程度
◆この記事の主な対象者：品質管理に関する業務に携わる方

##1.はじめに
みなさま今年も一年お疲れ様でした。
アドベントカレンダーの時期がやってまいりました。

普段私はゲームのQA担当として品質管理業務に従事をしており、
プロダクトとの折衝・障害や費用の削減のほかに、
他社のQAの方々と連携しての技術研究会などの情報発信についても推進を行っています。

今年は以下の弊社QAチームでの取り組みの講演者としてもCEDECで発表をさせていただきました。
**[「モバイルアプリQAテスト自動化の取り組み～CEDEC2019からの変遷～」](https://cedil.cesa.or.jp/cedil_sessions/view/2488)**
※内容については今回は割愛いたしますので、もしご興味があれば上記資料をご覧ください。

ゲームQAの業界からも積極的に登壇を行い、業界全体を盛り上げていければと考えているため、
実際にCEDECへ出てみてよかったことや採択にあたってのポイントなどについてお伝えできればと思います。
※あくまで私個人の感じたことですので、その点はご留意ください。

##2.登壇してみてよかったこと
今回登壇してみて、私自身がよかったと感じたことを数点ピックアップしてみました。

**①自身のスキルアップを意識するようになった**
資料作成や発表を行うにあたって理解度を上げる必要があったため、
今回発表した内容に関する知識の理解度向上や、資料作成・発表の練習など
準備から発表までの経験を通じて、自己研鑽に対して前向きになれたと思います。

**②自ら発信することで新たな情報も取り入れられる**
普段接することのない方から様々な意見や感想や質問をいただくことで、
違った角度からの意見や知らない手法などが見えてくるため、自身の知見が広がりました。
特にQAの情報交換が行える機会は他の職種と比べても少ないため、貴重な場だと感じました。

**③新たに得た知識を用いて、日常業務における品質向上の取り組みに繋げられた**
発表までの経験を通じて知識理解を深めた得たことで、日々の業務がより円滑に進められたり、
検証効率化の導入検討の幅が広がるなど、自身の業務の質をあげていくことにも繋がりました。

**④やりきることで「また登壇できるように頑張ってみよう」というマインドになる**
達成感や自信を得られることで、次もまた登壇してみたいと思うようになり、
結果的に業務全体へのモチベーションにも繋がりました。
（自分たちの発表に対してSNSで反響をいただけたことも、普段ではあまり感じえない嬉しい一面でした）

##3.登壇してみて大変だったこと（振り返り）
個人的にはよかったことの方が多かったと感じましたが、大変な部分もありました。

**①定常業務を行いつつの準備は大変**
資料作成やプロット作成などの他にも、
法務や広報、プロダクトの方々など関係各所との連携や発表練習など、
思っていた以上に、準備期間にやるべきことがたくさん出てきます。
定常の業務の合間を縫って進めていく必要があるので、
しっかり準備できるように、採択後はすぐに計画を立てて進めておく必要がありました。
（3～4か月ほどの期間がありますが、気づけばあっという間に本番を迎えることになります）

**②オンラインでの登壇というのが感覚的に慣れづらく難しかった**
対面による大勢の方々の前での発表とはまた違った緊張感があり、
オンラインでの発表というのもなかなか慣れないものです。
事前発表の練習の仕方などもリモート想定に寄せて練習回数を重ねておくなど、
より一層工夫をしておく方がよいと感じました。

##4.テーマ採択に向けて工夫した点
今回採択されるために私が工夫した点も併せてご紹介したいと思います。
参考になれば幸いです。
※あくまで私見のため採択を保証するものではございません。

**①続きが気になるようなタイトルにしてみた**
2019年に弊社QAチームから1回登壇をしている題材であったため、
「モバイルアプリQAテスト自動化の取り組み～CEDEC2019からの変遷～」といった形で、
2年前の続編というシナリオ感を出し「その後どうなったのか」が気になり、
聞いてみたくなるようなタイトルにしてみました。


**②なるべく敷居を下げ、幅広い方向けの内容になるようにしてみた**
エンジニアでなくても行える、QA主導での自動化や効率化をテーマとして扱っていたこともあり、
他の方々が参考にしやすく、より聞いてもらいやすい内容となるように、
なるべく取り入れやすい手法を中心に紹介内容を選定しました。

##5.まとめ
今回の話のまとめです。
**①自己研鑽の意識やモチベーションの向上によりスキルアップが見込める**
**②自ら情報を発信することで新たな知見が得られ業務に活かせる**
**③準備や発表などの大変な部分もあるがその過程も含めて楽しい**
**④採択されるためには工夫が必要**

実際に取り組んでみて、大変なことも多くありましたが、
その過程も含めて楽しみつつ成長に繋げられたと感じました。

##6.おわりに
いかがだったでしょうか。
この記事を読んで「来年は私もCEDEC登壇を目指してみよう」とか
「情報を発信していこうかな」など思っていただける方がいれば幸いです。

CEDECのセッション内容などもQAからの情報発信はまだまだ少なく感じますので、
より積極的に発信を行っていき、これからのゲームQAの業界を更に盛り上げていければと思っています。
それでは皆さま、よい年末をお過ごしください！
IBMCloud VRA IPSEC制約事項Tips

# IPSEC VPNにおける制約事項

IBMCloudのVRAでは、IPSECを利用する際に"lifetime kilobytes"、"idle-timeout"コマンドをサポートしないため注意が必要。

Cisco機器などではIPSECのRenewタイミングとして時間(sec)だけではなく、ファイルサイズによる制限設定もできるが、VRA側ではlifetime kilobytesに対応していないため、対向機器では設定は削除する。

もしlifetime kilobytes設定をCisco機器側に入れてしまっていると、通信が不安定になるので要注意。
もし入れた場合も接続自体に問題が起きないので、一見問題がないように思ってしまうが、おそらくCisco側のKilobytes指定量のデータ通信量を超えたタイミングでIPSECSAのリセットがかかると思われ、IPSEC通信が定期的に途切れる事象が発生する。
wireへのregのassignで"Cannot assign a packed type to an unpacked type"

エラー内容を検索して逆に混乱してしまったので。

```verilog
module hoge_module(
    input wire clk,
    ...,
    output wire[31:0] out_dat_sigs
);

reg out_dat_regs[31:0]; 
assign out_dat_sigs = out_dat_sigs;
```

において、`assign out_dat_sigs = out_dat_sigs;`で`Cannot assign a packed type to an unpacked type`というエラーを吐く。
分かってしまえばそのままだったが、これは`out_dat_regs`を配列で宣言していることが原因だった。

```verilog
reg out_dat_regs[31:0];  // 1bitレジスタ32個の配列
reg[31:0] out_dat_regs;  // 32bitレジスタ
```

C#等書いた後だと、配列宣言に違和感を感じないので脳がバグる。
マルチテナント SaaS を設計する際に参考になった資料




弊社 LIGHTz 初のアドベントカレンダー1発目でございます :fire:

弊社、絶賛 SaaS システムの開発中で、度々設計が議論になります。
そこで、備忘録も兼ねて参考になった資料を一言添えて挙げていきます。
....... 一発目なのに備忘録の投稿をお許しください :pray: 

これから SaaS を作る皆様、↓もおすすめです。

https://qiita.com/nassy20/items/1b92af91f92c7ab81e85

# リソースと分離編
- [マルチテナントSaaSのテナント分離をRow-Level Securityに移行した - Sansan Builders Blog](https://buildersbox.corp-sansan.com/entry/2021/05/10/110000)
    - 分離に関して各社の奮闘と生きた事例を見ることができます
- https://mitomasan.hatenablog.com/entry/2016/05/25/210151
    - あまり他の記事ではあまり言及されていない観点について述べられています
      - url(ドメイン)設計
      - DBの接続先の切り替えはユーザーのリクエストを処理する最初の段階でフレームワークレベルで行う
      - クォータ・スロットリング
      - ロギング
      - SSOの仕組みをなるべく備える理由
- [マルチテナント SaaS パターン - Azure SQL Database | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/azure-sql/database/saas-tenancy-app-design-patterns)
    - プールとテナント単位データベースの組み合わせの例が載っている
- [RDBを使わない究極のマルチテナント. 先日、SmartHRさんのDB移行の話が話題になりました。 | by takezaki | vtecx](https://blog.vte.cx/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%86%E3%83%8A%E3%83%B3%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6-fc42f21a64c5)
    - スクラッチする部分が多そうですが、スケールに悩まなくて良さそうです
- [AWS サーバーレスサービスによるマルチテナント SaaS ソリューションの構築 | Amazon Web Services ブログ](https://aws.amazon.com/jp/blogs/news/building-a-multi-tenant-saas-solution-using-aws-serverless-services/)
    - server less で作る場合にテナントデプロイパイプラインが参考になりそうです
- [RLSを用いたマルチテナント実装 for Django](https://www.slideshare.net/shimizukawa/a-multitenant-implementation-using-rls-for-django)
    - RLS の対応方法が具体的に書かれている貴重な資料
- [マルチテナント設計色々考えて、結局何もしなかった話 - Speaker Deck](https://speakerdeck.com/estie/marutitenantoshe-ji-se-kao-ete-jie-ju-he-mosinakatutahua)
    - 業務の特性とフェーズを考慮してガチガチに固めない話
- [マルチテナントのアプリケーション実装〜実践編〜](https://www.slideshare.net/YoshikiNakagawa2/ss-251625836)
    - DB レベルでは論理的な分離を採用し、DB、ORM以外にもさまざまな工夫で守る
    - シャーディングを見据えたスキーマ設計がとても参考になる
    - ORM にテナントキーを自動挿入
    - クエリモニタリングを実施
- [テナント分離⽅式の使い分けとバランス](https://speakerdeck.com/yaggy/tenantofen-li-shi-noshi-ifen-ketobaransu-saas-engineering-meetup-kitukuohuibento?slide=22)
    - サイロモデル、ブリッジモデル、プールモデルの選択要件の図が分かりやすいです

# アクセス制御編
- [業務システムにおけるロールベースアクセス制御 - Qiita](https://qiita.com/kawasima/items/8dd7eda743f2fdcad78e)
    - RBAC の基礎とアンチパターンが参考になりました
- [システムのアクセス制御 (操作権限管理) 設計 | knooto](https://knooto.info/software-design-access-control/#4-%E5%8D%98%E4%B8%80%E3%83%AD%E3%83%BC%E3%83%AB%E6%96%B9%E5%BC%8F)
    - 規模別の権限設計に関して記載があります
- [アプリケーションにおける権限設計の課題 - kenfdev’s blog](https://kenfdev.hateblo.jp/entry/2020/01/13/115032)
    - 権限設計の多岐にわたる考察が記載されています


以上です。
:snowflake: LIGHTz アドベントカレンダー2021 頑張っていきましょう! :snowflake:
[Rails]Chartkick×Chart.jsで面グラフ(Area chart)を作成する

# はじめに
面グラフとは、
折れ線グラフを塗りつぶしたグラフです。こんなグラフ。
![面グラフ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882861/5973dbe8-0337-688f-6fa3-dee39465802d.png)


Railsでグラフを表示するには Chartkick がとても便利。
デザインが綺麗で扱いやすい Chart.js と組み合わせてグラフを作っていきます。

# 環境
Rails 6.1.3
Ruby 2.7.2

# インストール　
```ruby:Gemfile
gem "chartkick"
```
```console:ターミナル
bundle install
yarn add chartkick chart.js
```
```js:app/javascript/packs/application.js
import "chartkick/chart.js"
```
これで導入は完了です。

# 実装
## 1. データの準備
```ruby:models/sample.rb
class Sample < ApplicationRecord
  def self.data
    data = {
      Sat, 24 May 2020: 50,
      Sun, 25 May 2020: 100,
      Mon, 26 May 2020: 34
    }
  end
end
```
モデルで `data = {x軸(横)の数値: y軸(縦)の数値}`のハッシュになるように成形。

## 2. 呼び出し
```ruby:controllers/samples_controller.rb
class SamplesController < ApplicationController
  def index
    @data = Sample.data
  end
end
```
Viewで表示できるように、コントローラで呼び出します。

## 3. 表示
```rhtml:views/samples/index.html.erb
<%= area_chart @data, min: 0, max: 100 %>
```
Viewで表示。
`min`、`max`で y軸(縦)の最大値と最小値を設定しています。

## 4. レイアウト変更

#### グラフ個別に設定
ディベロッパーツールでグラフの`id`を確認して、CSSを適用できます。

```css:sample.css
#chart-1 {
　　width: 100%;
 min-width: 100%;
 max-width: 100%;
}
```

#### すべてのグラフに設定
サイトのすべてのグラフに対して共通の設定をする場合は、`config/initializers/chartkick.rb`で設定できます。

```ruby:config/initializers/chartkick.rb
Chartkick.options = {
  height: "250px",
  width: "500px",
  colors: [ "#219ebc",
            "#bdbdbd"
          ]
}
```
上記で変更した場合は`rails s`でサーバーを再起動すると設定が反映されます。

レイアウトは色々と変更できるので、公式サイトで確認してみてください。
[Chart.js](https://www.chartjs.org/docs/latest/)


完成！

以上です。
何かありましたら是非コメントお願い致します。

# 参考
- Chartkick 公式
https://chartkick.com/#installation

- Chart.js 公式
https://www.chartjs.org/docs/latest/
事業会社に勤めつつ副業で開発するということ

## ご挨拶

ディップ株式会社で主にバックエンド(Rails等)とインフラ(AWS)の開発・保守・運用を担当している @raitehu です。
本業で1つのサービスのグロースにじっくりと腰を据えて取り組みつつ、
副業でいくつかの開発業務を担当したので実体験を元によかったこと・悪かったことお話します。

## 刺さったら嬉しい対象読者

- 事業会社 or 受託開発で悩んでいる学生さん
- 副業やってみたいけど一歩が踏み出せない現役エンジニア

## 副業のよかったところ

まずはよかったところからです。

### 開発経験が積める

事業会社で働くことのメリットの1つとして、自己紹介でも挙げたように「1つのサービスのグロース」に関われるというものがあります。
長い時間をかけて1つのサービスを育て上げていくと、表面的には分からないようなシステムの良いところ・悪いところが見えてきます。
エンジニアの力として、良いところを伸ばし・悪いところを改善するための **長期的な視点を獲得できる** というのは非常に大きなメリットでしょう。

裏を返せば長い期間同じチーム・同じプロジェクトに携わることのデメリットは **開発経験が単一なものになりがち** な点です。
チーム内のシニアエンジニアやテックリードが言っていることや、運用されているアーキテクチャ・ディレクトリ構成が
世間のスタンダードなのか、それともローカルルールなのかはパッと見ではわかりません。

そこで、副業として異なるチーム・異なるプロジェクトに参画し、
異なる思想を持つエンジニアと深く関わっていくことや、異なる思想で作られ運用されているシステムを開発することは
時に大変ではありますがより **広い視野を獲得できる** という大きなメリットがありました。

言い換えると、「自分が持っている知識を副業で生かした上で、副業で得られた知見を本業に還元できる」ということですね。

### お金がもらえる

これは言わずもがなですが、特に **個人事業主であればPCやガジェット類、書籍は経費として処理できます。**
もちろん使った分は自分のお財布から出ていく事実は変わりませんが、
副業で開発して力を付けた報酬で開発環境をアップデートし、より生産性を上げていくことができるというのは良いサイクルに思えます。

本業がテレワークメインの方に限られる話ではありますが、
より快適な住環境・職場環境を手に入れることは本業にも良い影響をもたらします。

## 副業のつらいところ

### 確定申告が必要になる

年明けごろから界隈で話題になる恒例行事ですね。
会社員一本でやっているときは経理の専門家たちがよしなにしてくれていることをすべて自分でやる必要が出てきます。
また、ふるさと納税のワンストップ制度も使えなくなるのでその辺の手間は格段に増えます。
青色申告までする場合は複式簿記を付ける必要も出てきます。
複式簿記の例として、クレジットカードで支払いをした際はカードを使った時と引き落とされたときの2回帳簿を付ける必要があります。

とはいえ最近は[freee]や[やよいの青色申告]などのサービスを利用することでかなり障壁は低いですが、それでも面倒は面倒です。

### オーバーワークになる

副業とはいえ仕事は仕事ですから期限を守る義務と納品物に対する責任が発生します。
クライアントに「本業が忙しくて...」という言い訳は一切通用しません。

一例として駆け出しのエンジニアが単価2,000[JPY/hour]で月に10万円稼ぐことを考えると、
100,000[JPY] / 2,000[JPY/hour] = 50時間が月の労働時間になります。
本業の方で20営業日の月に1日1時間程度残業をした場合、
20[days] * 1[hour] = 20時間が月の残業時間になります。
単純に本業 + 副業で考えると **月の時間外の労働時間は70時間** になります。

一般に過労と呼ばれるのは残業時間が以下の3つのいずれかに当てはまる場合です。

- 45時間以上を6か月以上続ける
- 平均80時間以上を2～6か月続ける
- 単月100時間を1か月

cf: [過労死ラインは何時間？](https://partners.en-japan.com/qanda/desc_800)

10万円を稼ごうと思うだけでも過労死ラインギリギリの厳しい現実が見えてきます。

## 実際やってどうだったのか

デメリットの方で厳しい現実も少し書きましたが、若いうちに多くの経験を積むことや設備投資が気軽にできることのメリットがデメリットを遥かに上回っているというのが実感です。
ほぼ1年の実体験を元に書いた記事ですが、誰かの参考になれば嬉しいです。
コメント欄に質問いただければ可能な限りお返事します。
素数の魅力

#前書き

12月1日。本日、いよいよ公開です！

https://jojo-portal.com/anime/so/


ストーンオーシャンの登場人物の中に、「プッチ神父」という教誨師が出てきます。
彼は、数学者でもないのに「素数」が好きだといいます。

>**落ち着くんだ…
『素数』を数えて落ち着くんだ…
『素数』は1と自分の数でしか割ることのできない孤独な数字……
わたしに勇気を与えてくれる**

２、３、５、７、１１、１３、１７、１９・・・・
確かに「１と自分の数でしか割ることのできない」数字（自然数）は素数と呼ばれますが、プッチ神父は素数を「孤独な数字」と表現し、「わたしに勇気を与えてくれる」と共感を持って自分の生活に取り入れています。
文系の私は、素数は小学校で習ったきり、生活の中で携わったことがありません。
いや、むしろ素数と言えば、プッチ神父の真似をして「落ち着きたいとき」に数えるくらいしか生活の中で取り入れていません。

今日は、そんな**「素数」の魅力について調べてみました。**　という話。

#素数の歴史

素数の歴史は古く、紀元前1600年には発見されていたようですね。

>紀元前1600年頃のエジプト第2中間期において、素数の初等的な性質が部分的に知られていたことが、リンド数学パピルスなどの資料によって示唆されている。例えば分数をエジプト式分数で表す場合、素数と合成数の場合で異なる計算をしなければならないからである。しかし、記録に残っている限りにおいて、明確に素数を研究対象としたのは古代ギリシア人が最初である。紀元前約300年頃に書かれたユークリッドの『原論』には素数が無数に存在することや、その他の素数の性質が証明されている。また、ユークリッドはメルセンヌ素数から完全数を構成する方法を示している。ギリシアの数学者、エラトステネスに因んで名付けられたエラトステネスの篩（ふるい）は、素数を列挙するための計算方法である。

https://ja.wikipedia.org/wiki/%E7%B4%A0%E6%95%B0

#そして、2000年以上も未解明。多くの数学者を魅了してきた。

素数は歴史的に偉大な多くの数学者たちの間で研究され、そして、まだ解明されていないことがたくさんあるらしいです。
英語で **「prime number」** っていうそうです。「最も重要な」「最高位の」数という意味。

https://diamond.jp/articles/-/239057


#素数に挑んだ数学者たち

著名な学者たちがこぞって数式化しようとしているらしいです。

https://analytics-notty.tech/is-there-a-law-for-prime-numbers/


#暇な会議中にも素数のことを考えて、大発見したという逸話も。

「ウラムの螺旋」という素数が創り出す不思議な模様は、暇な会議中に素数を落書きしていて発見されたとか。

https://wakara.co.jp/mathlog/20200920

#双子素数？ 三つ子素数？ セクシー素数？
一般人には気をひく名称ですが、学者たちは大真面目に分類しているのでしょう。素数の法則を発見しようとして。

https://www.huffingtonpost.jp/nissei-kisokenkyujyo/sexy-primes_b_17763708.html

#素数ゼミ

種の保存のため、セミも素数を利用している。

https://tenki.jp/suppl/romisan/2016/08/18/14811.html

#暗号化の技術

素数の性質を利用して暗号化の技術に使われている。これが一番身近に素数のお世話になっていることなのかもしれない。

https://news.mynavi.jp/kikaku/20161027-a004/

#見つけ方

素数を素早く見つける方法。今から約2000年前に、古代ギリシャのエラトステネスさんという方が考えた方法。

https://analytics-notty.tech/how-to-find-prime-number-quickly/


#覚え方

日本人限定の語呂合わせ。これは習わなかったな。今の小学生向けかな？
プッチ神父には必要ない、っていうか、わからないだろうな。

https://media.qikeru.me/prime-number-euphony/


以上、素数に関する魅力について調べてみました。
他にも面白い素数の魅力をご存じでしたらぜひ教えてくださいね。
基本情報・午前の得点60↑のために

#はじめに
私は今回受けた令和3年度下期基本情報技術者試験にて、
午前と午後と共に60↑のラインを超えることが出来ました。
![a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301725/ccb2472f-fff8-a2ad-844a-bcb3c7e9c64b.jpeg)
![aaaaa.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301725/5e1038cb-64ec-fad9-8402-39f8c22ea956.jpeg)


そんな私ですが、<font color="red">一日に何時間も掛けてみっちり勉強していた訳ではありません。</font>
今回は実際に私が行っていた勉強法について紹介致します。

#ストラテジを制する者は基本情報を制す
![b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301725/e85347ad-f2a0-6935-1671-8e8d4cbbfbbe.jpeg)

私の午前試験のスコアレポートの結果はこんな感じです。
<font color="red">ストラテジが80%と高い正答率を誇っているのが分かります。</font>
<br>
<font color="blue">なぜストラテジを推すのか</font>
<br>
理由は、<font color="blue">テクノロジと違って対策がしやすく、その上で問題数が20問あるからです。</font>

対策のしやすさと言うのには、
\------------------------------------------------------------------------------------
・（テクノロジと違って）単語の数が少なく、覚えきりやすい。
（過去に問題で出たものがよく出題される）⇒<font color="blue">過去問を使った勉強が生かされる。</font>

・<font color="blue">計算問題は少し勉強するだけで対策することができる（簿記関連の公式等）。</font>
\------------------------------------------------------------------------------------
というものがあります。

[システム戦略、システム企画、経営戦略マネジメント、技術戦略マネジメント、ビジネスインダストリ、企業活動]
これらは大体が単語の意味を聞かれるものや、計算問題です。
しっかり覚えきりましょう。

私はアプリを使って単語帳を自作し、活用しました。<font color="blue">（単語帳を作ること自体が勉強になります）</font>

唯一の鬼門として法務があります。
勉強してすべて覚えきるのが一番なのですが、<font color="red">捨ててもいいと思います。</font>
過去問を何度か解けば大体の傾向が見えてくるため、慣れが早い人ならばある程度解くことができるからです。

#さいごに
マネジメントとストラテジは、単語の意味をしっかり覚えて過去問を解いていれば安定していく、
というのが私の私見です。

逆にテクノロジは、本番の試験において<font color="red">今までになかったようなハードウェアの問題が出たり、
過去問で見かけなかったような問題が多数出る感じがすると私は思います。</font>

そのテクノロジを安定させるために勉強するのは最低限当たり前の事です。
私は過去問で出たテクノロジの単語は8割以上覚えきりました。

ですが、
<font color="blue">勉強量が少ない上で安定させやすいストラテジを完璧にすることで、
点数に余裕が生まれるのではないでしょうか？</font>

テクノロジのみに重きをおかず、ぜひストラテジも勉強してみてください。

>私が勉強に使用したサイト
>https://www.fe-siken.com/
>![aaaaaaaaaaaaaaaaaaaaaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301725/5767ba3c-182d-5c7e-b706-1078221384c8.png)
I18nを使いながらPCでもスマホでも狙ったところでレスポンシブに改行する

## やりたいこと
Railsでガチでフランス語のアプリを個人開発しています。:fr:

タイトルや文章をブラウザで表示したいとき、PCブラウザは横に長いから改行は要らないが、スマホブラウザでは改行を入れないと見栄えが悪いってことあると思います。しかもお任せしちゃうと「いや、そこで改行しないで...、ダサい！」ってところで改行してくれてしまいます。

こんな感じで↓

![minnfra.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/0c69a449-a472-f955-e0dd-aaa4564d7bd6.png)

これをPCブラウザの時は、
>ようこそ「みんなでフランス語」へ
みんなでフランス語、日本語の知識を共有しましょう

スマホの時は、

>ようこそ
「みんなでフランス語」へ
みんなでフランス語、日本語の知識を
共有しましょう

という具合で改行したいです。

HTMLで`<br>`タグを仕込んで、CSS側の`display`とメディアクエリを活用して制御すれば良いかと思ったのですが、RailsのビューでI18nを使ってしまっている。。ゆくゆくは多言語対応したいから、I18nはそのまま使いたい。

あると思います。

例えばコードがこんな感じになっているとします。

```erb:posts/index.html.erb
<h2 class="title"><%= t('.title') %></h2>
```

```yaml:posts/views.ja.yaml
---
ja:
  posts:
    title: "ようこそ<br>「みんなでフランス語」へ"
```

## 実装！

２ステップです。

### 1. keyを`hoge_html`にするとhtml_safeとして読んでくれる

I18nはsuffixに`_html`とあるとhtml_safeと判断してくれるそうです。
なので、`title`を`title_html`にします。

```erb:posts/index.html.erb
<h2 class="title"><%= t('.title_html') %></h2>
```

```yaml:posts/views.ja.yaml
---
ja:
  posts:
    title_html: "ようこそ<br>「みんなでフランス語」へ"
```

これはRailsの公式ドキュメントに書いてあります↓

>the translation will be marked as html_safe if the key has the suffix “_html” or the last element of the key is “html”. Calling translate("footer_html") or translate("footer.html") will return an HTML safe string that won't be escaped by other HTML helper methods.

https://api.rubyonrails.org/classes/ActionView/Helpers/TranslationHelper.html#method-i-translate

#### でも調子に乗ってclass属性を入れると...

```yaml:views.ja.yaml
---
ja:
  posts:
    title_html: "ようこそ<br class="for-mobile">「みんなでフランス語」へ"
```

>I18n::InvalidLocaleData - can not load translations from /Users/USER_NAME/dev/APP_NAME/config/locales/views.ja.yml: #<Psych::SyntaxError: (<unknown>): did not find expected key while parsing a block mapping at line 128 column 7>:

こんな感じで怒られました。

### 2. ならばCSS（SCSS）で工夫してあげる

localeのyamlでは`<br>`と属性なしのままにしておいて、CSSのセレクタで工夫してあげよう！ということで`<br>`をCSSで親要素から指定してスタイルを設定すればやりたいことが実現できました。

```scss
.title {

  br {
    display: none;

    @media (max-width: 414px) {
      display: inline;
    }
  }
}
```

## 最後に
ご指摘などあればよろしくお願いします！

会社の同僚からこんなのもあるよと教えてもらいました。
https://twitter.com/clockmaker/status/1461503892693213193?s=20

ちなみに、このアプリ、リリースしてガチで使いたいし、ガチで使ってもらいたいので、Instagramから始めました（[リンク](https://www.instagram.com/minnfra.officiel/)）。
Google Cloud アップデート (11/25-12/1/2021)

### Certificate Authority Service: [Nov 24, 2021](https://cloud.google.com/certificate-authority-service/docs/release-notes#November_24_2021)
- v1:
    - CA Serviceの[サンプルコードをドキュメントに追加](https://cloud.google.com/certificate-authority-service/docs/samples)

### Operations Suite: [Nov 24, 2021](https://cloud.google.com/stackdriver/docs/release-notes#November_24_2021)
- Cloud Monitoring:
    - GKEワークロードのモニタリングへのインジェスチョンへ課金が発生するのが2/1/2022からになったよ

### Anthos on bare metal: [Nov 29, 2021](https://cloud.google.com/anthos/clusters/docs/bare-metal/latest/release-notes#November_29_2021)
- 1.8:
    - 1.8.6リリース！
        - kubernetes 1.20
    - CVE-2021-30465, CVE-2021-37750, CVE-2021-41103の修正
    - [既知の問題](https://cloud.google.com/anthos/clusters/docs/bare-metal/1.8/troubleshooting/known-issues)の追加

### Anthos clusters on VMware: [Nov 29, 2021](https://cloud.google.com/anthos/clusters/docs/on-prem/1.9/release-notes#November_29_2021)
- 1.8.5-gke.3リリース！
    - kubernetes 1.20.9-gke.701
    - 色々改善と不具合修正

### SAP: [Nov 30, 2021](https://cloud.google.com/solutions/sap/docs/release-notes#November_30_2021)
- SAP Landscape Management用のGoogle Cloud Connector 2.2.16リリース
    - Windowsサーバ上のデータセンタエディションをサポート

### VMware Engine: [Nov 30, 2021](https://cloud.google.com/vmware-engine/docs/release-notes#November_30_2021)
- internal workload VMで外部IPを確保する際のプロセスが変わってprivate cloudフィールドが追加されたよ
- 1ノードだけのprivate cloudをテストやPoC用に作れるようになったよ
    - 60日後に自動で削除される
    - SLAでカバーされるのは最低3ノード必要なので注意

### Anthos clusters on VMware: [Nov 30, 2021](https://cloud.google.com/anthos/clusters/docs/on-prem/1.9/release-notes#November_30_2021)
- 1.7.6-gke.6リリース！
    - kubernetes 1.19.15-gke.1900
    - 複数の改善と不具合修正


### ディスクレーマ
- アップデートの内容はあくまでも個人の理解していることを書いています。正しい内容はリリースノート等を確認下さい。
- リリース内容できるだけ拾うようにしているのですが、抜けていそうなリリースノートは追加するのでぜひ教えて下さい！(一覧[ここ](https://qiita.com/kenzkenz/items/ac18a359b803dbb6b490)で更新してます。)
Alexa Conversations 入門スキルをペライチで表現してみる

2021/12/7 Alexa Developer Console の Alexa Conversations 部分に大きなアップデートがあり、以下の記事は古いものとなってしまいました。というか、この記事を上げる前からアップデートされていたみたいだ。~~また、hostedスキルでも「Alexa Conversations 入門」が作成できない状況になっているようです。~~　現在は作成できます。

> November 2021
The Alexa Conversations developer console experience has been upgraded. To migrate your skill to the new experience, click the associated link in the developer console banner. The following updates are the primary differences between non-migrated and migrated skills.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426739/92231037-908f-f9da-006a-43b90bfe98ea.png)

アップデート版のペライチはこちらを参照してください。
[アップデートされたAlexa Conversationsを触ってみる](https://qiita.com/takara328/items/dfe762ecc3befd51b884)

---
以下、スマートスピーカー Advent Calendar 2021　1日目　の記事

2021/11/27 スキルのテンプレートに、Alexa Conversations入門というものが追加されていることに気づいた。このテンプレートを使ってhostedスキルを作成し、`スキルの呼び出し名` を設定してビルドするだけで簡単にAlexa Conversationsが試せるようになっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426739/c3f68dfa-9958-f6b0-24c7-8ea3c7a4e01c.png)



この入門スキルは、好きな色を聞いて保管する。保管した情報を言うという２つのサンプルダイアログで構成されている。ちょっと会話がぎこちないところもあるけど、そこはいったん目を瞑って:grin:。

そして、Alexa Conversations入門スキルを全体の作りをペライチで表現すると以下のような感じになる。これでほぼカバーできているのではないかと思っている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426739/452cdf06-693e-b589-2abd-da5b5f08e33f.png)


入門スキルを起動するとLaunchRequestではなく、Alexa ConversationsのWelcome応答から始まるように作られている。これは、`インターフェース` - `Alexa Conversations` - `セッション開始時にAlexa Conversationsをダイアログマネージャーとして使用する` のチェックがオンになっているから。オンの場合は、スキル起動＝Alexa Conversationsになるし、オフの場合は、スキル起動＝LaunchRequestとなる。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426739/1c101e44-9fa4-65c7-2a64-329c3d49c063.png)



ダイアログを増やしたり、会話を長くしたりして遊んでみると理解が深まると思います。

おわり
【JavaScript】モジュール⑥　ダイナミックインポート


#はじめに

Udemyの[【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)の講座の振り返りです。

前回の記事


https://qiita.com/nao0725/items/58be6a9db276d120425f


#目的

* モジュールについての理解を深める

#本題
###1.ダイナミックインポート

exportで宣言された変数や関数を非同期で読み込める

**前提**

moduleAの変数や関数をmoduleBで使用したい

```moduleA.js
export let publicVal = 0;

export function publicFn() {
  console.log('publicFn called')
}

export default 1;
``````

####例1

通常のモジュールの読み込みは以下の通り

````moduleB.js
// importを使用した場合
import { publicFn, publicVal } from './moduleA.js';
// moduleAで定義した通りpublicFn called'と出力される
publicFn();
`````

上記をダイナミックインポートにすると下記の通りとなる

````moduleB.js

// importという関数を宣言する
// 引数にはファイル名を記述し、Promiseが帰ってくるので、thenメソッドで繋げる
// thenの中に関数を定義し、中身を確認する
import('./moduleA.js').then(function (modules) {
  // publicFnやpublicValが入ったオブジェクトが以下のように返ってくる
  console.log(modules);
  // それを使って出力結果を表示する
  modules.publicFn();
  // public calledと出力される
})

// // Module {Symbol(Symbol.toStringTag): 'Module'}
// default: (...)
// publicFn: (...)
// publicVal: (...)
```````

####例2

awaitとasyncを使用することも可能

````moduleB.js
async function fn() {
  // importの実行部分をawaitで受けて変数に格納
  const modules = await import('./moduleA.js')
  // 使いたい関数を下記のように実行
  modules.publicFn();
}
fn();
``````


今日はここまで！

#参考にさせて頂いた記事

* [【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)
* [Let'sプログラミング JavaScript入門](https://www.javadrive.jp/javascript/)
スクラム開発での「ふりかえり」にて改善アクションを決める上で工夫したこと

## はじめに
スクラムイベントの一つである「ふりかえり」にて、
改善アクションを決定・実行していくため、これまで工夫した点等をまとめます。
同じような課題で悩まれている方々の参考になればと思います。

## 課題だったこと
1. アクションのアイデアはたくさんでるが、優先順位が決めずらい
2. アクションの完了時期が曖昧
3. アクションの現状ステータスが曖昧


## 工夫したこと
1. 優先順位に関しては、**「アクションを実行する労力」**、**「解消される痛み」** の2軸で各アクションの相対評価行った。
各アクションの評価(配置)は再調整可能とすることで、考えすぎずに進めることができると思う。
アクションが一通りでたら、**「少ない労力で解消される痛みが大きいもの」**から優先的に実行していく
![ふりかえりアクション.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234000/adae4dce-39d4-b364-cf45-4f5caa9b7ece.png)
2. 完了時期が曖昧という課題に関しては、**「次回のふりかえりまでに完了できるサイズのアクションにする」**ことで対応。
例えば、
**問題：**  サービスダウンに気づけなかった
に対して
**アクション：** 自動監視をいれる
だと、監視項目が多いと完了するまでに時間がかかってしまう、完了条件が曖昧なため何をすれば完了なのかが分かりずらい。
そのため、
**アクション：** ヘルスチェック用のエンドポイントがリターンコード200を返さない場合、通知を行う
といったように、より具体的かつ実現可能なレベルまでアクションを落とし込むとよいと思う。

3. 現状ステータスが曖昧という課題に関しては、**「アクションをSprintのタスクとして管理」**、**「ふりかえりの冒頭に前回やると決めたアクションの現状を確認する」**ことで対応。
Sprintの期間が長い場合は、ふりかえり時のみでなく、もう少し頻度高く現状を確認するとよいかもしれない。

## 参考にしたサイト
https://qiita.com/98lerr/items/423a3e8ee44e118091bf#effort--pain
仮想通貨ボットの概要と意義

# このAdvent Calendarについて

はじめまして、[Hoheto](https://twitter.com/i_love_profit)と申します。

筆者は普段から「仮想通貨botter」として活動しており、仮想通貨におけるボット構築＆運用についての知見やノウハウを発信したりしています。

今回のAdvent Calendarではおそらく複数個の枠を確保できると思いますので、小分けにして体系的にボットについて説明したいと思います。
そもそも、Qiita読者層の中には「仮想通貨ボットって何？（怪しいんじゃないの？）」というイメージを持たれている方も多いのではないでしょうか？

人は自らが知らないものを恐れるといいます。
まずはなんとなくでも構いませんので、**エンジニアスキルと札束で人を殴ってお金を巻き上げる「仮想通貨ボットの世界」**に触れていただければと思います。


# 仮想通貨ボットとは

エンジニアの方には馴染みがあると思いますが、そもそもボット（bot）とは「何かをトリガーにして特定のタスクを走らせるプログラム」の総称です（例：特定の時刻がきたら自動でツイートするプログラム、など）。

仮想通貨の世界にも様々な種類のボットが存在します。
例えばビットコインの現在価格を知らせるようなものも、広義でいうと「仮想通貨ボット」に分類されるでしょう。

ここでいう「仮想通貨ボット」とは、特に **「利益獲得を目的として仮想通貨取引を自動で行うためのプログラム」** のことを指します。

株式、インデックス、為替などの既存アセットにおいても、自動取引システムは存在します（収益が上がるかどうかは置いておいて）が、仮想通貨ボットによる自動取引も概念としては同じです。

ただ、仮想通貨においては**世界中の主要取引所が豊富なAPIを提供**しており、リアルタイムにさまざまな情報を取得したり、プログラムから注文を出したりする環境が整っています。
これにより、**身近なプログラミング言語やライブラリのみを利用して**ボットを構築することが可能です。
「システム」という形式張った名称ではなく、よりカジュアルな「ボット」という名称が定着しているのはこのような理由のため、と筆者は考えています。

なお、筆者の自己紹介文に「**botter**」という記載がありますが、botterとは仮想通貨ボットを構築し、実際に取引をさせて継続的に収益を得ている人たちのことです。

# プログラムからの仮想通貨取引

上述の通り、仮想通貨取引所はそれぞれが情報取得や注文受付のためのAPIを提供しています。

ただし、統一規格が存在しないため、それぞれのAPI仕様はバラバラなのが現状です。
これらをカバーするため、共通のフォーマットで各取引所のAPIをラッピングしたオープンソースのライブラリの開発が進んでいます。
本記事では、「[ccxt（CryptoCurrency eXchange Trading Library）](https://github.com/ccxt/ccxt)」というライブラリを取り上げます。

以下の例は、Pythonとccxtを利用してビットコイン（ティッカーシンボル「BTC」）を購入するプログラムです。

```python
import ccxt
api = ccxt.bitflyer({"apiKey": "MY_API_KEY", "secret": "MY_SECRET"})
api.create_order(symbol="BTC/JPY", type="MARKET", side="BUY", amount=0.001)
```

この例では、日本のbitFlyerという取引所で0.001 BTCを「成行」で購入しています。
たった3行で発注処理が完結していることから、開発効率の高さが伝わってくると思います（当然、実運用するボットではエラーハンドリングを別途行います）。

※「成行」という言葉の意味が分からない方は、「成行 指値」でググってください。


# 仮想通貨ボットの意義

誕生してからの歴史の浅い仮想通貨は、既存アセットのような厳しい規制が少なく、公的資金や大型ファンドといった大規模な資金を持つプレイヤーの参入もまだまだ少ない状況です。

そんな中で世界中に玉石混合の様々な取引所が存在しており、それぞれ閉じられた市場を展開しているため、歪みや非効率性がそこかしこに存在します。

仮想通貨ボットの意義とは、「**これらの歪みや非効率性を収益源として継続的な取引を行い、仮想通貨市場の効率化に貢献すること**」です。

個人個人の動きとしては、単純に「**継続的・安定的に収益を得る**」という経済的インセンティブのもと、収益化できる歪みや非効率性を探す、という逆の手順となります。

上手く収益源を回収できるボットを構築できれば、単純に将来的な値上がりを期待して行う「Buy & Hold」のような投資戦略よりもはるかに安定した収益を生み出すことが可能です。
洗練されたボットは長期的な運用に耐えうる投資戦略として、あなたの資産ポートフォリオの中で第一線級の活躍をしてくれるでしょう。

# 仮想通貨ボットの一例

**例1. 買い注文と売り注文を交互に繰り返すプログラム**
安い価格で買ってそれよりも高い価格で売るという、細かく売買を繰り返し行うことで利益を積み上げるプログラム。
買いと売りの差額を積み上げることで収益化を図ります。

**例2. 複数の取引所の価格を監視し、鞘が開いたときに注文を行うプログラム**
取引所Aで安い価格で買い、取引所Bで高い価格で売ることで、価格の差（鞘、といいます）を収益化するプログラム。
「裁定取引」や「アービトラージ（アビトラ）」と呼ばれます。

詳細やその他のボットについては後述します。


# つづく…

本日はここまでです。

次回の更新をお楽しみに！（続くかな…？）