OmniAICreator/Qiita-1.07M huggingface dataset:
Docker Toolbox 導入手順メモ（Windows 7 64bit版）

# はじめに
 自己学習用にWindows 7へDocker toolboxをインストールした際の構築メモ。 

#参考記事
インストールまで
https://qiita.com/witchy/items/99235291a6bd5fdee054

#環境
Windows 7 Professional Edition (64bit)

#事前作業
**BIOSの仮想化支援機構を有効にしておく。**
BIOS⇒CPU⇒intel virtualization technology

最初から有効になっているのであれば問題なし。

VirtualBoxを使う前の事前準備。
（これを設定しなかったため、後続作業でエラーになりました・・・）

#ダウンロード
ダウンロードURL
https://docs.docker.com/toolbox/overview/#ready-to-get-started

Windows用のインストーラを取得

#インストール
１．DockerToolbox.exeを起動
２．すべて初期設定のままインストールまで実行
　　このあたりはお好みで設定変更もOK。
　　VirtualBox環境もなかったのでFULLインストール。
３．参考記事の内容にしたがって、VMDKファイルの移動
　　および、vboxファイル内のVMDK参照先修正。
４．正常終了

#起動
Docker Quickstart Terminalを起動
⇒正常に起動したらOK

#HELLO WORLD
- 通常版
`$ docker run hello-world`

- くじらに言わせる版
`$ docker run docker/whalesay cowsay Hello World!`

それぞれimageのダウンロード⇒実行まで実施


#詰まったところ、操作ログ
・Docker Quickstart Terminalを起動したが、エラー
　⇒64bit版のCPUがみあたらない、みたいな感じの内容
・Virtual Boxを起動して再度試行
　⇒VERR_VD_IMAGE_READ_ONLYのエラーが出る。
　⇒ログの内容的には「VMDKファイルへの更新権限が無い」みたいな感じなのに、
　　フォルダのアクセス権変更等でも上手くいかない
・BIOSの仮想化支援機構をオン、GUI(kitematic)経由でVM作り直し
　⇒うまくいった！

#所感
・インストールからつまづいたなぁ…
・エラー「VERR_VD_IMAGE_READ_ONLY」が出る理由がよくわからない。
　⇒色々検索してみたらVMの展開にそもそも失敗していると出力されたりするらしい。
・VirtualBoxを始めてみたけど、良さそうな仮想化ソフトですね。
　（今までVMware、Hyper-Vあたりしか触ってなかったので新鮮）
STM32CubeIDEを使ってみよう　How To STM32CubeIDE 日本語版　(2)

STM32を使用する環境としてSTM32CubeIDEのLチカまでを説明します～の続きです。

なお、本内容は、YoutbeのHow to use STM32CubeIDEをもとに作成しています。
https://www.youtube.com/watch?v=eumKLXNlM0U

前回はLEDを点滅させるところまででした。
ここからはコードの意味を含めて進めていきます。

まずは、LD2とは何でしょうか？
LD2をマウスカーソルを当ててみると以下のようなポップアップが出てきます
ここをクリックします。
![30-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/2670e848-ddc8-850c-e363-ea30fccffa55.jpeg)
矢印を押します。
![30-1-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/6f57cac0-840f-06b5-d838-1d6689fd5689.jpeg)
すると、ピンの設定内容が出てきます。
これって何でしょうか？
![30-1-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a5cfaf58-1737-e549-6c39-00e4f311b21a.jpeg)
左のツリーからプロジェクト名.iocをダブルクリックをします。
![30-1-4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/e455dc76-7419-fe4f-4bca-f4804fb6d695.jpeg)
するとピンの設定データが出てきます。
ここのLD２は何でしょうか？
EnterUserLabelを開けてみましょう。
![30-1-5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/806e71a0-39ce-00c9-a32f-53d8495bc59f.jpeg)
![30-1-6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/96dbaa2b-cd27-6417-3580-6f21a53a2a93.jpeg)
ここでLD2という名前になっていることがわかります。
![30-1-7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/796f804c-178c-358c-3159-65ae604bfb3c.jpeg)
ちなみにボタンはB1になっていることがわかります。

次はコード生成の注意点です。

コードを間違えて、BeginとEndの間に書かないとどうなるかを試してみましょう。
![30-1-8-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f212408e-be0a-f46c-fca9-759ce5b35a01.jpeg)

この状態で、ここでコードを生成してみましょう。
![30-1-8-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/e01122c8-9555-d1e8-3115-5a7537894351.jpeg)

なんということでしょう～
コードが消えてしまいました。
![30-1-8-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/8e3e5dce-3c57-8f31-69bd-da2fa9490321.jpeg)

STM32 CubeMXにおいてコード生成をした場合、必ずBeginとEndの間にコードを書くようにしましょう。

少し長いので（３）に続きます。
WordPressの記事一覧をRedashから取得する

RedashからWordPress内の記事一覧を取得したい場合、RedashからMySQLに直接接続できればよいのですが、レンタルサーバーではDBへの直接接続を許していない場合がほとんどです。

[WP ALL EXPORT](http://www.wpallimport.com/upgrade-to-wp-all-export-pro/)のようなプラグインを使って定期的にSpreadSheetにエクスポートするみたいな方法もありますが、よりお手軽な方法を教えていただいたので残しておきます。

## JSON API経由でRedashとWordPressを接続する

Redashは公開URLに置いてあるJSON APIサーバーから情報を取得することができます。

参考 [Querying URLs & JSON APIs](https://redash.io/help/data-sources/querying/urls)

またWordPressはテーマをカスタマイズすることで任意のフィードを作成することができます。

参考 [WordPressでオリジナルのフィードを配信する方法（入り口）](https://qiita.com/kobayash/items/5bbfa1356e683e37ef35)

Redashが要求するフォーマットのフィードをWordPressから出力することで、記事一覧を取得しようという流れです。

## 実際のコード

次のファイルをテーマ内に配置します。フィードのフォーマットを定義するコードです。

```php:/feeds/redash.php
<?php
$params = [];
$args = array( 'posts_per_page' => -1 , 'post_status' => 'any' );
$all_posts = get_posts( $args );
foreach ( $all_posts as $post ) {
  setup_postdata( $post );
  $param = [
    'article_id' =>   $id,
    'status' =>       get_post_status(),
    'url' =>          get_permalink(),
    'title' =>        the_title('', '', false),
    'posted_date' =>  get_post_time('Y-m-d', false),
    'updated_date' => get_the_modified_date('Y-m-d', false),
    'category' =>     get_category_parents(get_the_category()[0]->cat_ID),
  ];
  $params[] = $param;
}
$body = [
  'columns' => [
    ['name' => 'article_id',   'type' => 'integer'],
    ['name' => 'status',       'type' => 'string'],
    ['name' => 'url',          'type' => 'string'],
    ['name' => 'title',        'type' => 'string'],
    ['name' => 'posted_date',  'type' => 'date'],
    ['name' => 'updated_date', 'type' => 'date'],
    ['name' => 'category',     'type' => 'string'],
  ],
  'rows' => $params
];
header( 'Content-Type: application/json' );
echo json_encode( $body );
exit;
?>
```

あとはfunction.phpに以下を追加します。

```php:function.php
<?php
add_action('do_feed_redash', 'do_feed_redash');
function do_feed_redash() {
  $feed_template = get_template_directory() . '/feeds/redash.php';
  load_template($feed_template);
}
?>
```

これで`/?feed=redash`にアクセスすることで、記事一覧の情報が取得できるかと思います。あとはRedashからこのURLを読み込むだけで完了です。お手軽ですね。

## 注意

* 上記のフィードは非公開記事も含まれます。フィードURLを公開することで意図せず非公開記事の存在がバレてしまう可能性もあるので気をつけましょう。

* 全記事をまとめて取得するフィードです。記事が大量にあるサイトや記事本文を含める必要がある場合には向かないかもしれません。
Java学習メモ（データ型）

Java Silverの勉強を始めたので、自分の忘備録としてUPします。
ざっくりとしたメモなので、詳細は記載してません。

第２章　Javaのデータ型の操作 
 
１．２．データ型 
・プリミティブ型 
　整数、浮動小数点数等の数値や真偽値や文字を扱う。 
　 
　種類） 
　boolean：true,false 
　Char：16bitUncode文字¥u0000〜¥uFFFF 
　byte：8bit整数-128〜127 
　short：16bit整数-32768〜32767 
　Int：32bit整数-2147483648〜2147483647 
　Long：64bit整数 
　Float：32bit単精度浮動小数点数 
　Double：64bit倍精度浮動小数点数 
 
・参照型 
オブジェクト型、配列型、列挙型。 
 
３．数値リテラル 
・アンダースコア「_」の使用方法
　桁数の多い数値リテラルの見やすさを向上させる。 
　①リテラルの先頭と末尾には記述できない
　②記号の前後には記述できない（「.」「L」「F」「0b」「0x」etc..）

５．識別子
　・予約語は使用できない
　・記号は「_」と通貨記号のみ
　・数字から始めてはいけない

９．メソッドの呼び出し
　・同じインスタンスに定義されているメソッド：メソッド名(引数)
　・インスタンスに定義されているメソッドの場合：変数.メソッド名(引数)
　・staticなメソッドの場合：クラス名.メソッド名(引数)

１１．ガーベッジコレクション
　ガーベッジコレクタによりメモリ上の使われなくなったインスタンスを探し、破棄してメモリを開放する。
【Grafana】データソースがElasticsearchのときのクエリ書き方

#はじめに
最近Grafanaを使って監視画面の作成をしていますが、Elasticsearchがデータソースの場合、クエリの書き方がいまいち分からず苦戦したので、知っていると監視画面の作成が楽になると感じたクエリの書き方をいくつか紹介します。

#環境
- Grafana5.4 (v6.0以上でも確認済）
- Elasticsearch6.6

#クエリ書かなくても
下記記のようにメトリック指定してグルーピングするだけでもクエリを書かなくてもグラフ作成をすることができます。（※画面はGrafana提供の[サンプル画面](https://play.grafana.org/d/000000107/elasticsearch-metrics-filter?orgId=1)。例示がたくさんあるのでグラフ作成の参考になります。）
![pic](https://drive.google.com/uc?export=view&id=1xporzGh4vEDTibQvtdjjRU71FBTLrRz3)

#クエリ書くとより活用できる
クエリはどんな時に活用することができるかというと、特定のサーバーのみCPU使用率やメモリディスク使用率を表示させたい、または特定のサーバー以外表示させたい等の要望に応えることができます。
※今回は、Metricbeatを使って収集したCeph情報をElasticsearchに格納しており、それを表示させたい場合のクエリを例にとりました。
##特定の情報のみ表示させたい
```
#Cephのpool-IDを1つ指定する
#[書き方]フィールド名:xxx
ceph.pool_disk.id:1
```
##特定の情報を複数指定して表示させたい
```
#複数のCephのpool-IDを指定する
#[書き方]フィールド名:xxx AMD フィールド名:xxx
ceph.pool_disk.id:1 AMD ceph.pool_disk.id:2
```
注意点は、**AND**ではなく**AMD**を使って複数指定するところです。

##特定の情報以外を表示させたい
```
#表示させないCephのpool-IDを指定する
#[書き方]NOT(フィールド名:xxx)
NOT(ceph.pool_disk.id:1)
#複数指定も可能
NOT(ceph.pool_disk.id:1 AMD ceph.pool_disk.id:2)
```
##全部の情報を表示させたい
クエリ書かなくても可能ですが一応。

```
#全部のCephのpool-IDを指定する
#[書き方]フィールド名:*
ceph.pool_disk.id:*
```
GR-ADZUKIでダイナミック点灯（２）

GR-ADZUKIでダイナミック点灯の第2弾です。

今回は、コードを変更しています。
というのは、Arrayのコードで良いサイトがあったからです。
https://www.hiramine.com/physicalcomputing/arduino/rgbbarled.html
こちらを使わせていただきました。

![GR-ADZUKI-dynamic-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/718e571e-2f5b-4cba-2ade-345a47be5790.jpeg)

ANODEPINとCATHODEPINを変更します。
int ANODEPIN[6] = { 6,9,10,11,12,13};
int CATHODEPIN[3] = { 22,23,24 };   // R, G, B

```
// (C)https://www.hiramine.com/physicalcomputing/arduino/rgbbarled.html
// 仕様：カソードコモン
int ANODEPIN[6] = { 6,9,10,11,12,13};
int CATHODEPIN[3] = { 22,23,24 };	// R, G, B

void setup()
{
	// アノードを、LOWで初期化
	for( int ano = 0; ano < 6; ano++ )
	{
		pinMode( ANODEPIN[ano], OUTPUT );
		digitalWrite( ANODEPIN[ano], LOW );
	}

	// カソードを、HIGHで初期化
	for( int cat = 0; cat < 3; cat++ )
	{
		pinMode( CATHODEPIN[cat], OUTPUT );
		digitalWrite( CATHODEPIN[cat], HIGH );
	}
}

void loop()
{
	// カソードのループ
	for( int cat = 0; cat < 3; cat++ )
	{
		digitalWrite( CATHODEPIN[cat], LOW );	// LOWに変更
		// アノードのループ
		for( int ano = 0; ano < 6; ano++ )
		{
			digitalWrite( ANODEPIN[ano], HIGH );	// HIGHに変更
			delay(5);	//点灯時間
			digitalWrite( ANODEPIN[ano], LOW );	// LOWに戻す
		}
		digitalWrite( CATHODEPIN[cat], HIGH );	// HIGHに戻す
	}
}
```
『フィナンシャルモデリング』をPythonで実装してみた（２）ポートフォリオ入門

#概要
(1)はこちら：https://qiita.com/murr83/items/bddd49025fd95c07dbbf
サイモンベニンガ著『ファイナンシャル・モデリング』（2017、ロキガ書房）の内容をPythonで実装してみました。本記事は本のp196-199に該当します。

#1. 銘柄別の日次収益率データを読み込む

(1)の記事で作ったグーグルとアップルの2011年のデータを引き続き使います。前回はdailyと名付けていましたが、今回はdataという名前でインポートします。

```python
data = pd.read_csv('daily.csv')
```

dataの中身はこんな感じです。
<img width="278" alt="スクリーンショット 2019-04-30 午後3.34.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355309/72c63984-13e7-4aa2-d208-55d60e780ca8.png">

#2. 二資産からなるポートフォリオを作る
アップル社への投資比率をxとおき、xを変化させた時のポートフォリオ全体での収益率の変化を調べて見ましょう。

```python
#二社の収益率の平均を求める
gg_mean_return = np.mean(data['Google'])
app_mean_return = np.mean(data['Apple'])
#二社の収益率の分散を求める
#二社の収益率の共分散を求める
cov_matrix = np.cov(data['Google'], data['Apple'])
gg_var_return = cov_matrix[0,0]
app_var_return = cov_matrix[1,1]
cov_return = cov_matrix[1, 0]


#-0.5~1.5までのベクトルを用意
xs = np.arange(-5, 16) * 0.1
#ポートフォリオの収益率の入れ物を用意
portfolio_returns = np.zeros(len(xs))
#ポートフォリオの標準偏差の入れ物を用意
portfolio_stds = np.zeros(len(xs))

#それぞれのxに対し、ポートフォリオの収益率と標準偏差を計算
for i in range(len(xs)):
    x = xs[i]
    portfolio_returns[i] = app_mean_return*x + gg_mean_return*(1-x)
    portfolio_stds[i] = np.sqrt((x**2)*app_var_return + 2*x*(1-x)*cov_return +((1-x)**2)*gg_var_return)
```
以下でコードを順番に解説します。

##1. dataの統計量を求める
まずは平均から始めます。
dataのGoogle列、Apple列をそれぞれ呼び出して、numpyのmeanメソッドで平均を求めます。それぞれgg_mean_return, app_mean_returnと名付けています。

```python
gg_mean_return = np.mean(data['Google'])
app_mean_return = np.mean(data['Apple'])
```
次に分散と共分散を求めます。numpyのcov()メソッドを使うと分散共分散行列が返ってきます。右上と左下の要素が共分散、左上の要素がGoogleの分散、右下の要素がAppleの分散です。

```python
cov_matrix = np.cov(data['Google'], data['Apple'])
gg_var_return = cov_matrix[0,0]
app_var_return = cov_matrix[1,1]
cov_return = cov_matrix[1, 0]
```

##2. xを変化させる
numpy.arange()を使って-0.5~1.5までの値が0.1おきに入った行列を作ります。

```python
xs = np.arange(-5, 16) * 0.1
```
実際に実験する前に結果を入れるための入れ物を作っておきましょう。

```python
portfolio_returns = np.zeros(len(xs))
portfolio_stds = np.zeros(len(xs))
```

いよいよ本題のxを変化させる作業に入ります。

```python
for i in range(len(xs)):
    x = xs[i]
    portfolio_returns[i] = app_mean_return*x + gg_mean_return*(1-x)
    portfolio_stds[i] = np.sqrt((x**2)*app_var_return + 2*x*(1-x)*cov_return +((1-x)**2)*gg_var_return)
```

ここでは期待値と分散に関する次の公式を使っています。

```math
E[\alpha X_1+\beta X_2] = \alpha E[X_1] + \beta E[X_2]\\
V[\alpha X_1+\beta X_2] = \alpha^2 V[X] + 2\alpha\beta cov[X_1, X_2] + \beta~^2 Var[X_2]
```

このfor文によってportfolio_returnとportfolio_stdには実験の結果が入りました。
見やすくするために次のような処理を行えば、

```python
#DataFrameにして見やすくする
portfolio = pd.DataFrame({'x': xs, 'return': portfolio_returns, 'std': portfolio_stds})

#x列をインデックスに指定
portfolio = portfolio.set_index('x')
```
<img width="199" alt="スクリーンショット 2019-04-30 午後4.09.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355309/0426bd69-5019-d14a-d4bc-94c92eaeac02.png">

というように結果が分かります。

<img width="932" alt="スクリーンショット 2019-05-22 19.10.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355309/f6859b9a-f84f-7623-451a-8bbd50e67a06.png">


お疲れ様でした。

#宣伝
SmartTrade社では毎週水曜日18:00から勉強会を行っています。（https://python-algo.connpass.com/）
【Laravel初心者】Laravelのプロジェクトを本番環境リリース時にしたこと

## 前提とする環境

```
ubuntu  18.04
php     7.2
Laravel 5.8
mysql   5.7.25
apache  2.4.29
```

## 本番環境ですること
サーバー自体の基本設定(言語・時間設定等)は完了している前提で、自分がLaravelのプロジェクトをローカル環境と同様に動かすために必要だったことは以下になります。

1. 各ミドルウェアの設定
2. .envの作成
3. vendor配下のインストール
4. DB設定
5. laravelプロジェクト内の権限の追加

### 各ミドルウェアの設定
ApacheやMySQLなどプロジェクトに必要な設定は当然する必要があります。
この部分は本記事では詳細割愛しますが、以前書いた記事で説明していますのでそちらを参照ください。
[【入門】ubuntu18.04にLaravel5.8のプロジェクト作成する手順](https://qiita.com/enutake/items/9e46f683543bd15231de)


### .envの作成
.envは各環境に依存する設定を記述するファイルです。
laravelプロジェクトにおいてはデフォルトで.gitignoreに登録されているため、新しい環境にプロジェクトを持っていったら毎回作成する必要があります。

プロジェクト直下に置いてある.env.exampleをコピーして、.envを作成するのがおすすめです。
例えばlaravel+mysqlのシンプル構成なら、下記のように変更しておけば問題ないでしょう。

```php:.envの例
APP_NAME=example ←自分のプロジェクト名を入れましょう
APP_ENV=production ←本番環境ならproductionに変更しましょう
APP_KEY= ←後ほど説明します
APP_DEBUG=false ←本番環境ならfalseにしましょう trueだと画面上にエラーが表示されます
APP_URL=http://hogehoge.com ←URLを入れましょう

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1 ←DBサーバーが別れている場合はDBサーバーのIPを入れましょう
DB_PORT=3306
DB_DATABASE=hoge ←このプロジェクトでアクセスするデータベースです
DB_USERNAME=fugauser ←このプロジェクトのDBアクセスで使うユーザーです
DB_PASSWORD=passwordhoge ←このプロジェクトのDBアクセスで使うパスワードです
```

composerでlaravelプロジェクトを直接作成した場合はAPP_KEYは最初から作成されているのですが、.env.exampleからコピーして手動で作成した場合は、以下のコマンドでアプリケーションキーを作成します。コマンド実行が完了すれば自動的に.envにキーが入力されます。

```php:コマンドラインでartisanを実行する
php artisan key:generate
```


### vendor配下のインストール
.envと同様に.gitignoreに設定されているため、vendorディレクトリ(laravel本体が置いてある)もインストールする必要があります。
以下のコマンドを実行すればvendor以下にlaravelがインストールされます。

```bash
composer install
```

### DB設定
他のサイトなどをみた限りでは、データベース作成などの必要はなさそうですが、自分の場合マイグレーション実行とは別にデータベース作成が必要でした。結果的に行ったこと一覧は以下になります。

- ユーザー作成
- データベース作成
- マイグレーション実行(php artisan migrate)


### laravelプロジェクト内の権限の追加
自分の場合Laravelプロジェクトで何箇所か権限がないためFatal errorが出ました。
以下のページを参考に、いくつかディレクトリに権限を付与することでエラーが解消されました。

参照：[Linuxコマンドのお勉強 再帰的にパーミッションを変更](https://qiita.com/NoTASK/items/9b0b466f9bd4eea3efe9)
[iOS] マテリアルデザインのタブ風UI

# はじめに
今更ですが、マテリアルデザインのタブ風のUIサンプルを作成しました。
完成イメージは、下記のとおりです。

<img src="https://user-images.githubusercontent.com/9479568/56944056-0a45fc00-6b5d-11e9-8790-4692936b7bb7.gif" width="250">

## UIの構造
UIの構造は、下記の3階層です。
ここまでは、通常のCollectionViewの作り方と同様です。

MenuView (UIView)
 - CollectionView
 -- MenuCell (UICollectionViewCell)

## ポイント
ポイントは、選択中のタブインジケータです。
NSLayoutAnchorを使うと、よい感じになりました。
なお、下記のサンプルは、タブを4個表示する場合の例です。

```swift:MenuBar.swift

    var horizontalBarLeftAnchorConstranit: NSLayoutConstraint?

    /// 選択中のインジケータを更新する
    func collectionView(_ collectionView: UICollectionView,
                        didSelectItemAt indexPath: IndexPath) {
        
        let x = CGFloat(indexPath.item) * frame.width / 4
        horizontalBarLeftAnchorConstranit?.constant = x
    }

    /// 選択中のインジケータを設定する
    private func setupHorizontalBar() {
        
        let horizontalBarView = UIView()
        horizontalBarView.backgroundColor = .white //インジケータの色
        horizontalBarView.translatesAutoresizingMaskIntoConstraints = false
        addSubview(horizontalBarView)
        
        horizontalBarLeftAnchorConstranit = horizontalBarView.leftAnchor.constraint(equalTo: self.leftAnchor)
        horizontalBarLeftAnchorConstranit?.isActive = true
        horizontalBarView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
        horizontalBarView.widthAnchor.constraint(equalTo: self.widthAnchor, multiplier: 1/4).isActive = true

        //インジケータの高さ                                 　　
        horizontalBarView.heightAnchor.constraint(equalToConstant: 4).isActive = true
    } 

```
## おまけ
選択中のタブインジケータにアニメーションをつけると、よりクールになります。

```swift:MenuBar.swift
    func collectionView(_ collectionView: UICollectionView,
                        didSelectItemAt indexPath: IndexPath) {
        
        let x = CGFloat(indexPath.item) * frame.width / 4
        horizontalBarLeftAnchorConstranit?.constant = x
        
        //アニメーションをつける
        UIView.animate(withDuration: 0.75,
                       delay: 0,
                       usingSpringWithDamping: 1,
                       initialSpringVelocity: 1,
                       options: .curveEaseOut,
                       animations: {
                        self.layoutIfNeeded()

        }, completion: nil)
    }
```
TwitterAPI で、OAuth認証の署名を作成する際に使用するURLに ? を付けるとエラーになる

#エラーの内容
code : 32
message : Could not authenticate you.

#エラーの原因,解決策
とても単純で、OAuth認証の署名を作成する際に使用するURLの末尾に ? が付いていることが原因です。
クエリを付ける場合は、署名を作成した後にURLの末尾に ? を付けましょう。

#環境
PHP
Twitter API

#上記のようなエラーが発生してしまうケース
下記のコードは署名部分の詳細なコードは省いてます。

```php:example_failure.php
// APIのリクエスト先URL
// ? を付けてしまうとエラーとなってしまいます
$request_url = 'https://api.twitter.com/1.1/users/show.json?' ;

/* OAuthの署名作成処理部分 */

// クエリとしてAPIへ送信するパラメータ
$params_a = array(
	"screen_name" => $twitter_id,
	"include_entities" => "false",
) ;

// パラメータがある場合、URLの末尾に追加
if( $params_a ) {
	$request_url .= http_build_query( $params_a ) ;
}
```

動作する例を以下に示します。

```php:example_success.php
// APIのリクエスト先URL
// ? はここで付けない
$request_url = 'https://api.twitter.com/1.1/users/show.json' ;

/* OAuthの署名作成処理部分 */

// クエリとしてAPIへ送信するパラメータ
$params_a = array(
	"screen_name" => $twitter_id,
	"include_entities" => "false",
) ;

// パラメータがある場合、URLの末尾に追加
if( $params_a ) {
//	ここで ? を付ける
	$request_url .= '?' . http_build_query( $params_a ) ;
}
```

とても単純なミスですが、エラーメッセージから原因を推測することが難しいですね･･･
Laravel+Dockerのmysqlで「--initialize specified but the data directory has files in it. Aborting.」というエラーが出たので解決した話



Dockerの知識が浅いくせにDockerで開発しているせいか、最近mysqlでエラーを連発して、大変な思いをしております。

その中でも頻発するエラーがこれ

```
 [ERROR] --initialize specified but the data directory has files in it. Aborting.
```


解決しても、次に出没するときには忘れてしまうので、記事として残しておくことにします。


# エラーがを解決するまでの道のり


上でも見せましたがエラーはこれ

```
 [ERROR] --initialize specified but the data directory has files in it. Aborting.
```

そして、僕はナイスな回答を見つけてしまいます。

[MySQL docker 5.7.6 and later fails to initialize database](https://github.com/docker-library/mysql/issues/69#issuecomment-269537249)

これ通りに、mysqlのimageをmariadbに変更してみました

```
image: mariadb
```

# マイグレーションをする

Laravelを使っているので、マイグレーションが必要です。

```
$ docker-compose exec phpfpm sh -c 'cd ../ && php artisan migrate'                               git:feature/5_login_register* 
                                                                                                                                       
   Illuminate\Database\QueryException  : SQLSTATE[42S02]: Base table or view not found: 1932 Table 'produce.migrations' doesn't exist i
n engine (SQL: select `migration` from `migrations` order by `batch` asc, `migration` asc)    
```

なぬ！またエラーが出た！！

というわけで、色々調べた結果、データを削除することにしました。

僕は`docker-compose.yml`に

```
volumes:
      - ./db/data:/var/lib/mysql
```

と書いてあるので、

```
$ rm -rf db/data
```

を実行して、

```
$ docker-compose down && docker-compose up -d
```

を実行して

```
$ docker-compose exec phpfpm sh -c 'cd ../ && php artisan migrate'
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table
```


おーできたできた


エラー面倒くせえっすねえ、、、

とりあえず治ったのでこれでよしでしょう！！
ionicでiOSアプリの内容をそのままAndroidアプリでも動くように試み中

## はじめに

先日、ionic使ってiOSアプリをリリースしました。
そのままAndroidアプリでも動くように挑戦中ですが、そこで詰まったところを備忘録がてら載せます。

なお、Android開発は初めてですが、以前 Android Studio の環境構築は済ませてしまっているため、Javaとかはすでに入っているところからのスタートです。


## Android setup

```
$ ionic cordova platform add android --save
```

はい、この1コマンドだけでもうAndroidのプロジェクトが完成しました。恐ろしい・・・

## とりあえずブラウザから開発ツールでスタイルを確認

```
$ npm run ionic:serve
```
これで自動的にブラウザが立ち上がるので、/ionic-labとか Path に追加すると同時にiOSアプリとAndroidアプリの動きを確認できます。（ネイティブ機能は除く）


### ボタンに英語があると全部大文字に！
そういう仕様らしいですね。googleがGOOGLEとか、twitterがTWITTERとか、大文字になってました。とりあえず、スタイルに以下を付与して解消。

```
text-transform: none;
```

参考
https://stackoverflow.com/questions/41364677/ionic-v2-button-text-in-caps
https://qiita.com/tomoima525/items/3158320777a08e6c7ade


### iOSだと左にあったボタンがAndroidだと右に全部移動してしまう

ヘッダタイトルの左側に「←」で戻るボタンを作ってたけど、Androidは全て右側に移動しててなんだか気持ち悪い感じに・・・・「✗」ボタンに変更しちゃいました。
md-arrow-round-back → md-close

```
<ion-header no-border>
  <ion-navbar hideBackButton="true">
    <ion-buttons start>
      <button ion-button (click)="onBackPage()">
        <ion-icon name="md-close"></ion-icon>
      </button>
    </ion-buttons>
    <ion-title>投稿</ion-title>
  </ion-navbar>
</ion-header>
```

## Running My App！！・・・ Cordova android emulator “cannot read property 'replace' of undefined”

```
$ ionic cordova run android --device
```

エミュレータ立ち上げて確認しようとしたらエラーが出ました。


Cordova android emulator “cannot read property 'replace' of undefined”

/platforms/android/cordova/lib/emulator.js line 202: を以下のように書き換えたら動きました。


```
var num = target.split('(API level ')1.replace(')', '');
↓ 書き換え
var num = target.match(/\d+/)[0];
```

https://stackoverflow.com/questions/44687476/cordova-android-emulator-cannot-read-property-replace-of-undefined

## エミュレータでネットワークにつながらない

一度 cordova 側でビルドしたら解決。

```
$ cordova build android
```

ソーシャルログイン系、後ネイティブ機能の呼び出しで少しいじる必要がありそうですが、それ以外は全然問題なく動いていそう・・・・
また随時更新します。
MacOSでCommand line tools for XcodeとHomebrewのインストール

#Command line tools for Xcode
rbenvをインストールするにはHomebrewが、
Homebrewを使うにはCommand line tools for Xcodeが必要です。

なのでまずXcodeをAppstoreからダウンロード（Xcodeは6GBほどあるのですごく時間がかかりました）

#Xcodeインストール
Macの既存のターミナル.appで

```
xcode-select --install
```
するとポップアップで
command line toolをダウンロードしますか
と表示されるのでインストールします。

僕の場合インストールが開始されなかったので、OSをアップデートしました。
それでもインストールできていないようだったので調べると、

Xcode->Open Developer Tool->More Developer Tools
からダウンロードできました。
（xcodeを開いて画面左上のリンゴマークの横にあるxcodeからできた）
command line tools for xcodeを選択しダウンロード。

<img width="266" alt="Menubar.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384804/42394fa2-cc4e-86e7-59d5-ce2b4a3cc1f6.png">

https://qiita.com/3yatsu/items/47470091277d46f3fde2
詳しくはこちらに書いてあります。こちらのqiitaに助けられました。

#Homebrew
Homebrewのインストールは
https://brew.sh/index_ja
にアクセスして、
インストールと書いてあるすぐ下のスクリプトをターミナルにコピーします。

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
※僕の場合はこのようなスクリプトでしたが公式サイトからコピーするようにしてください。

この後必ずenterを押してください。そしてpasswordを求められるので、Macを起動するときのいつものpasswordを入力してください。

インストール後に

```
brew doctor
```
でYour system is ready to brewと表示できればokです。

僕もここでつまずいたので、誰かのためになれば幸いです！
Githubテンプレートを使ってレビューを円滑に



結構前ではありますがGithubにテンプレート機能がついたらしいので、
IssueやPullRequestを効率的に行うためのテンプレートを作ってみました。

業務の中でPullRequestなどを見たりする上で、`explainした？`や`動作確認した？` というレベルの
コミュニケーションをレビュアーがしないといけないのはイケてないのでPullRequestやIssueを出した時点でチェックリストを満たしているってのが理想だと思います。
このテンプレを叩きに各々自由にカスタマイズして使っていただければいいなと思います。 
（使いたい人がいれば...）

ということで今回用意してみたのは3種類です。

- Issueテンプレ
  - バグ報告
  - パフォーマンス改善
- Pull Requestテンプレ

それぞれについて軽く説明していきます。

# Issueテンプレ

## バグ報告

緊急度の判断、エラー発生箇所の特定、
エラー発生条件の特定、影響範囲の特定、改修方針、
（ちなみに緊急なものには使いづらいと思います。）

<details><summary>テンプレ</summary><div>

```
---
name: 'バグ報告'
about: Create a report to help us improve
title: 'バグ報告'
labels: ''
assignees: ''

---

**バグ報告**

<!--
@name1
@name2
などのメンションを飛ばす必要がある相手を指定してください。
-->

**緊急度**j

<!--
S: 即時対応必須
A: 次回の同様の案件のリリースまでに対応が必須
B: 可能な限り次回のリリースに入れ込みたい
C: 手が空いたら対応
-->

**エラー発生箇所**

<!--
githubのリンクを貼り付ける
-->

**エラー発生条件**

<!--
など可能な限り発生条件を詳細に記述してください。
-->

**影響範囲**

<!--
エラーの発生条件を満たした人が実際にどの程度いるのかを記述してください。
-->

**改修方針**

<!--
どういう修正を行うつもりなのかを記述してください。
-->
```
</div>
</details>

## パフォーマンス改善

プロファイル結果、問題箇所、
問題点、改修方針、影響範囲

<details><summary>テンプレ</summary><div>

```
---
name: 'パフォーマンス改善提案'
about: Create a report to help us improve
title: 'パフォーマンス改善提案'
labels: ''
assignees: ''

---

**パフォーマンス改善提案**

<!--
@name1
@name2
などのメンションを飛ばす必要がある相手を指定してください。
-->

**問題箇所**

<!--
githubのリンクを貼り付ける
-->


**NYTProf結果添付**

<!--
NYTProfのURL,もしくはスクショを貼り付ける
-->

**問題点**

<!--
何が問題なのか、可能な限り詳細に書く
-->


**改修方針**

<!--
改修の方針とそれによるメリットとデメリットを書く。
改善案に迷ってる場合は複数選択肢を提示する。
-->

**影響範囲**

<!--
例えば、
直DBアクセスしている場所にキャッシュを入れるというような対応の場合、
キャッシュを前提としていない実装箇所が他にないのか、
調査検討した結果を記載し、何を調査してどう問題ないと判断できたのかという
検討の過程をここに記述してください。
-->
```
</div></details>

# Pull Requestテンプレ

機能概要、機能の必要性、
設計方針、テスト結果、explain結果

<details><summary>テンプレ</summary><div>

```
<!--
@name1
@name2
などのメンションを飛ばす必要がある相手を指定してください。
-->

**機能概要**

<!--
機能についての説明を記述してください。
また、企画/仕様書/絵コンテそれぞれへのリンクも添付すること。
-->

**機能の必要性**

<!--
なぜその機能が必要なのか記述してください。
-->


**設計方針**

<!--
大きな方針レベルで
設計/実装の方針について記述してください。
-->

**テスト結果**

<!--
単体テスト、シナリオテストがある場合はそのテスト結果を添付してください。
ない場合は、動作確認をどのように行ったのかを記述してください。
-->

**explain結果**

<!--
新規でQueryを発行する場合、もしくはQueryに修正を加えた場合、
開発環境で発行したSQLに対してのexplain結果を添付してください。
※ ただし、1万件以上のサンプルデータを流した上で計測すること。
-->
```
</div></details>


テンプレートの設定方法やIssueで複数のテンプレを使う方法については、
下記の記事で詳細に説明してくれているのでよしなにしてもらえればと。

# 参考元

GitHub の Issue Template を複数設定して使い分ける 
https://qiita.com/suzuki-hoge/items/04de7d779bed6572bb99

Github Issue Templateが公式で複数対応したので、早速利用してみた
https://tech.gamewith.co.jp/entry/2018/05/22/154951
Laravelでjson形式の設定ファイルを設置する

## 概要



Laravelでjson形式の設定ファイルを設置する最適な場所を探した結果こうなった、という紹介です。

**要件**

- 関数などを使って簡単に設定にアクセスできる
- 設定ファイルなので、ファイル自体の削除・書き込みがされない

結果的に、configにはjsonファイルを読み出す処理を書いて、別の場所にjsonファイルを設置しています。

これがベストな方法かはわかりませんが、以下の難点を避けて、要件を満たすことはできています。もっといい方法知ってるという方は、ご教示お願いします。

**注：こうはしなかったという選択肢**

configをjsonで書いておきたいっていうのはよくあると思うのですが、Laravelではヘルパー関数の`config()`で読み出せるのはPHP配列なので、単純に`config`以下にjsonファイルをおいてもうまく動作しません。

また、`storage`に設置して読み出すという方法もあり、ライブラリ（ https://github.com/labkod/laravel-config ）が作られたりしてしますが、`storage`以下のファイルはアプリケーション上から、編集・削除できるので設定ファイルを置きたくないです。(`Storage::delete()`とか)

## 解決法概要

- `config/json/`以下にjsonファイルを設置
- `config/myconfig.json.php`を作成
- 設定ファイルをリポジトリ管理したくない場合
    - `.gitignore`に追記
    - `config/json/myconfig.json.example`を作成

## 解決法詳細

### jsonファイル設置

```
$ mkdir config/json
$ mv /path/to/json/file config/json/myconfig.json
```

### `config/myconfig.json.php`を作成

condigファイルでjsonファイルを読みだし、デコードする処理を書きます。

```php:config/myconfig.json.php
<?php
return json_decode(file_get_contents(__DIR__ . '/json/myconfig.json'), true);

```

以上の設定で、Laravelのヘルパー関数`config`を使って、設定の読み出しができます。ドット記法も使えちゃいます。

```php:app/any_laravel_file.php
$config = config('myconfig.json');
```

### 設定ファイルをリポジトリ管理したくない場合

configには秘匿したい情報もあったりすると思うので、その場合は以下の手順でgit管理から外しておくといいと思います。

#### `.gitignore`に追記

```:.gitignore
config/json/*.json
```

#### `config/json/myconfig.json.example`を作成

```
$ cp config/json/myconfig.json config/json/myconfig.json.example
```

秘匿したい情報を削除。
exampleファイルのみをgit管理すればOKでしょう。

## 課題

とりあえず、一つの設定ファイルにはこれで対応できます。
この後運用した結果、設定ファイルを置き忘れるなどの管理面での問題が出てくるかもしれませんが、その際はまた考えます。
競プロ参戦記 #44 Three Religions | コドフォ #556 Div.2

せっかくの連休なので Codeforces に参加しました。

## 競プロ参戦記

この連載記事では、着手した問題の考察を自分なりに書いていきます。

- 前回: [競プロ参戦記 #43 Flipping Signs | ABC 125](https://qiita.com/vain0x/items/c3ab29132c1558f791e9)

## Codeforces Round #556 (Div. 2)

- 問題の詳細は問題一覧を参照してください。
- 問題一覧: https://codeforces.com/contest/1150

## A - Stock Arbitraging

問題概要: いま r 個の bourles を持っている。午前は N 回取引を行う。i 回目の取引では share 1個あたり bourles s_i 個のレートで、好きな数の share を購入する。午後は M 回の取引を行う。j 回目の取引では share 1個あたり bourles b_j 個のレートで、好きな数の bourles を購入する。最終的に持っている bourles の個数を最大化せよ。

考察:

午前は share が最も安いときになるべく多く買って、午後は share が最も高いときにすべて売る、というのが最適です。ただし買値より売値が低い場合は何もしないのがベストとなります。

筆者の回答 (Rust, AC): https://codeforces.com/contest/1150/submission/53510334

## B - Tiling Challenge

問題概要: N×N の盤面がある。盤面にはあらかじめいくつかのタイルが張られている。5枚のタイルが十字型につながったものを好きなだけ盤面に張る。タイルが重なることなく盤面を覆えるか判定せよ。

考察:

左上から右下に向かって貪欲にタイルを置いていき、最終的に覆えたら OK、覆えなければ NG です。

筆者の回答 (Rust, AC): https://codeforces.com/contest/1150/submission/53512823

## C - Prefix Sum Primes

問題概要: 1 または 2 が書かれた N 個のカードが与えられる。カードを好きな順番に並び替えて数列を作った。その部分和の列に含まれる素数の個数を最大化せよ。

考察:

すべてのカードが 1、またはすべてのカードが 2 であるケースでは自明です。そうでなければ、2, 1; 2, 2, ..; 1, 1, .. と並べるのがベストです。

筆者の回答 (Rust, AC): https://codeforces.com/contest/1150/submission/53514982

## D - Three Religions

問題概要: 長さ N の小文字アルファベットからなる文字列 S と、Q 個の操作が与えられる。文字列 T(h) (1≤h≤3) を空文字列とする。各操作の後の状態で、条件 (☆) が満たされるかを判定せよ。

- 操作 `+ h c` : T[h] の末尾に文字 c を挿入する。
- 操作 `- h` : T[h] の末尾の文字を削除する。
- 条件 (☆) : 文字列 S のいくつかの文字に 1, 2, 3 のいずれかを割り当てて、「各 h (1≤h≤3) につき、h が割り当てられた文字からなる S の部分文字列が T[h] に一致する」ようにできる。

- 制約: 1≤N≤10^5, 1≤Q≤10^3, |T[h]|≤250

### 考察 1. DP

例えば S = abbaab, T[1] = a, T[2] = ab, T[3] = ab という状況では、以下のような割り当てが存在するため条件を満たします。最初の a に 1 を割り当てると失敗するので注意。

```
        22 133
    S = abbaab
```

割り当ては次のような DP によって 250^3 のオーダーで計算できます。

dp[x][y][z] = k : 文字列 S, T[1], T[2], T[3] のそれぞれ長さ k, x, y, z のプリフィックスについて条件(☆)が満たされる、という条件を満たす最小の k

例えば S = abdabc, T[1] = ad, T[2] = b を考えてみます。(x, y, z) = (1, 0, 0) では次のような割り当てで条件を満たすので k = 1 です。

dp[1][0][0] = 1 (a)

```
        1
    S = a

    T[1] = a
```

(x, y, z) = (2, 0, 0) では d を割り当てる文字が S に含まれるまでプリフィックスを伸ばさないといけないので、k = 3 が最小です。

dp[2][0][0] = 3 (abd)

```
        1 3
    S = abd

    T[1] = ad
```

T[2] のほうをみていくと、まず dp[0][1][0] = 2 です。

```
         2
    S = ab

    T[2] = b
```

dp[1][1][0] は (1, 0, 0) と (0, 1, 0) からの遷移があります。つまり、先頭の a に 1 を割り当てた後に次の b に 2 を割り当てるのか、あるいは b に 2 を割り当てた後に次の a に 1 を割り当てるのか、です。前者の方が k が小さくなります。

```
    (1, 0, 0) → (1, 1, 0)

        12
    S = ab

    T[1] = a, T[2] = b
```

```
    (0, 1, 0) → (1, 1, 0)

         2 1
    S = abda

    T[1] = a, T[2] = b
```

T に1文字足したとき S がどのくらい伸びるかは、その足された文字が次に出現する位置から分かります。事前計算をすれば O(1) です。

ただしこの DP をクエリーごとに行うと TLE します。

### 考察 2. 遷移

T[1] の末尾に文字が追加されたり削除されたとしても、追加や削除の影響がないプリフィックスしか使ってない状態 (x < |T[1]|) からの遷移には影響しません。

そのため x = |T[1]| 付近の状態からの遷移をやりなおせばいいです。操作ごとにおおよそ 250^2 回の計算で済むので、ぎりぎり間に合います。

筆者の回答 (Rust, AC): https://codeforces.com/contest/1150/submission/53538910
MetaEditorのカラー設定をブラックベースに設定する

MetaEditorを使って、MQL5プログラミングを行う際に、色設定が白背景ベースになっています。長い時間プログラミングを行うには、目に優しくないので、Visual Studio 2019 と Visual Studio Code の設定を元に、配色を変更してみました。

# 目指す最終形
Before
![screenshot_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382325/9625d8e7-c21e-2cb7-0f76-71a8fc6f2c20.png)


After
![screenshot_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382325/555266f8-b288-6867-4875-7f23b6f7623b.png)

# 色の設定
## 設定場所

[ツール]-[オプション]-[カラー]

### 要素：[xxxx]

前景色：White（12×11）縦×横
背景色：Black（1×1）
→その他、わかりやすい場所を説明

### 要素：テキスト

前景色：White（一番右下）
背景色：Black（一番左上）

### 要素：テキスト選択

デフォルト

### 要素：行番号枠

前景色：変更不可
背景色：Black(一番左上）

### 要素：キーワード

前景色：CornflowerBlue（右から２列目、下から６行目）
背景色：変更不可

### 要素：コメント

前景色：MediumSeaGreen（上から３行目、右から５列目）
背景色：変更不可

### 要素：数字

前景色：PalaGreen（右から３列目、下から４行目）
背景色：変更不可

### 要素：オペレータ

前景色：White（一番右下）
背景色：変更不可

### 要素：ストリング

前景色：Goldenrod（一番右、上から３行目）
背景色：変更不可

### 要素：マクロ

前景色：SkyBlue（右から２列目、下から５行目）
背景色：変更不可

### 要素：関数とエントリーポイント

前景色：PalaGoldenrod（一番左列、下から３行目）
背景色：変更不可

### 要素：インディケータ

前景色：Green（一番上列、左から５列目）
背景色：変更不可


### 要素：既定の型と変数

前景色：Magenta（上から５行目、右から５列目）
背景色：変更不可

### 要素：インプット変数

前景色：MEdiumVioletRed（上から３行目、左から６列目）
背景色：変更不可

### 要素：非ASCII文字

前景色：DeepPink（左から３列目、上から６行目）
背景色：変更不可

以上です。さらに見やすい配色などあればコメント下さい。

# おまけ

Visual Studio 2019 での、フォントは「MS ゴシック」
VSCode では「Consolas, 'Courier New', monospace」※ monospace は、MetaEditor で使用できない様子。

個人的には、Consolas で、フォントを11pt ぐらいにすると、行間もいい感じに見えやすくなると思います。

![screenshot_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382325/0773ccfe-cd24-25c8-072b-ad93a9d6faed.png)

後は、好みかと思います。Windows だったり、Macユーザだったり、Linux だったり、、、Visual Studio だったり、Eclipse だったり。。。。
ansible aptモジュール サンプル

# ページ概要
aptによるdebパッケージのインストール/アンインストールのサンプル。

## specs

##### - 細かいオプションについて
あくまで最低限のサンプルで色々とオプションを付与できます。
それは「[apt modlueのオプションが色々あるので見てみる](https://qiita.com/maki_azuki/items/6396a5be97204162c44c)」に書いておきました。
<font color="red">特に「state」オプションは知っておいた方が良いです。少しハマった。（＝＝；</font>

##### - machine specs
ansible version : 2.7.10 (pip)
OS version : ubuntu 16.04.5 ( in conoha VPS)

- official page : [apt](https://docs.ansible.com/ansible/latest/modules/apt_module.html)
- output : [github](https://github.com/maki0922/ansible_samples/tree/master/module_samples/tasks/apt)
 - Usages: `ansible-playbook tasks/apt/<taskfile> -i inventories/inventory`

## install
##### - install 1package
```yml:tasks/apt/install_one_package.yml
- hosts: all
  user: root
  tasks:
  - name: Install the package "libvirt-bin"
    apt:
      name: libvirt-bin
```
##### - install select multi packages
どこからのバージョンからwith_items使えなくなったらしい。

```yml:tasks/apt/install_multi_packaegs.yml
- hosts: all
  user: root
  tasks:
  - name: Install multi packages
    apt:
      name:
        - vim-gnome
        - vlc
        - gimp
```
##### - install select version
複数パッケージ&バージョン指定したい場合は、前述と組み合わせでいける

```yml:tasks/apt/install_select_version.yml
- hosts: all
  user: root
  tasks:
  - name: Install the package "libvirt-bin" selected version
    apt:
      name: libvirt-bin=1.3.1-1ubuntu10.25
```

##### - install use debfile
```yml:tasks/apt/install_use_debfile.yml
- hosts: all
  user: root
  tasks:
  - name: Install vlc use DebFile
    apt:
      deb: /var/cache/apt/archives/vlc_2.2.2-5ubuntu0.16.04.4_amd64.deb
```

## remove(アンインストール)
##### - remove(単なるアンインストール)
この場合、confファイルが残る(dpkg上、「rc」扱いになる)

```yml:tasks/apt/remove_one_package.yml
- hosts: all
  user: root
  tasks:
  - name: Remove the package "libvirt-bin"
    apt:
      name: libvirt-bin
      state: absent
```
##### - purge(conf含めてアンインストール) 
configも含めて削除(apt purge相当)の場合は「purge yes」を追加する
これだと指定したパッケージの依存関係パッケージは削除されない

```yml:tasks/apt/purge_one_package.yml
- hosts: all
  user: root
  tasks:
  - name: Purge the package "libvirt-bin"
    apt:
      name: libvirt-bin
      state: absent
      purge: yes
```

##### - autoremove & purge (--auto-removeオプション)
依存関係のパッケージも含めて削除する

```yml:tasks/apt/autoremove_one_package.yml
- hosts: all
  user: root
  tasks:
  - name: Autoremove the package "libvirt-bin"
    apt:
      name: libvirt-bin
      state: absent
      purge: yes
      autoremove: yes
```

## apt Update / Upgrade

##### - apt update
```yml:tasks/apt/apt_update.yml
- hosts: all
  user: root
  tasks:
  - name: apt update
    apt:
      update_cache: yes
```

##### - apt upgrade
いくつかupgrade種別が有るので注意。[こっち](apt modlueのオプションが色々あるので見てみる)に書いておいた。
**あと、すげー時間が掛かる...**

```yml:tasks/apt/apt_upgrade.yml
- hosts: all
  user: root
  tasks:
  - name: apt upgrade
    apt:
      upgrade: yes
```
「え!!server上でvisdomを!?」

##「出来らあっ!」

こんな感じで書くこともないんですが...

さて、皆様はログデータの可視化はどうしてますか?  
最近はTensorboardなども出てきてかなり便利になってきましたね。

大抵はGPUサーバーやCPUサーバーなど、本番では自分のローカルPC上で行いたいことでしょう。

で、今回はvisdomと呼ばれる可視化ツールをサーバーで呼び出したい場合にどうするのかという話です。

検索をかけると一応以下のような記事が出てきます。

[How to connect the visdom server in my remote Server using my PC? ](https://github.com/facebookresearch/visdom/issues/288)

これを見ますと「ポートフォワーディングしてね☆」と書いてますが、
なんか上手くいきませんでした。

それよりもうちょっと良い解決法があったので、それを記述します。

## Settings

- サーバー
   - GPUサーバー  
   - GUIはなし

- ローカル
   - 自分の手元にあるPC  
   - GUIあり  
   - IPアドレス: 192.168.0.2


## ローカル

サーバー側のプログラムを実行する前に

`python -m visdom.server`

とするだけ(ここは変化なし)。

## サーバー側 

visdomのコードを書くときに

```
from visdom import Visdom
viz = Visdom('192.168.0.2')
```

とするだけ。

ただこれもプロキシとかがあると問題があるような気がします。
【Unity(C#)】Particleの粒子を一つだけ出してそのポジションを取得する方法

##Particle
Particleに関する知識が浅かったので少し沼にはまりました。

同じ苦しみを味わう人がいなくなることを願って書きます。

Particleはパラメーターが多いので
Unityを触り初めたばかりの頃は見てるだけで吐き気がしました。

とはいえ、上手く使えばとても便利なのは明白なのでマスターしといて損はないです。


##経緯
Unityで花火を作っていたのですが、音が耳元で鳴ることに違和を感じました。

そこで、

**①花火が打ちあがった先のポジションを取得**
**②AudioSource付きオブジェクトを取得した位置に移動**
**③AudioSourceから音源を再生**

という流れならいけるのでは？と思い試しました。

##花火
Particleを使った花火の作り方はこちらをご覧ください→[花火](https://qiita.com/ELIXIR/items/f28c98196540e31d4fc8)

非常にわかりやすくまとめられているので小一時間でいい感じのものが完成します。

##Particleの粒子

今回の作り方は簡潔にまとめると
**①花火の種が１つ打ちあがる(Particleの粒子１つ)**
**②花火の種が消える**
**③花火のParticleが広がる**
という構成です。

ここで一つ沼にはまる要因がありまして、
**花火の種がParticle粒子**であるため、普通のゲームオブジェクトのように
`ゲームオブジェクト名.transform.position`でポジションを取得できないという点です。

なので、普段のポジションの取得の仕方に比べ、遠回りして取得しなければなりません。

##Particle粒子のポジション取得方法

```C#:AudioSource付きゲームオブジェクトにアタッチ
    //花火の種のParticleSystem
    [SerializeField]
    ParticleSystem _particleSystem;

    ParticleSystem.Particle[] particles;

    int particleNum;

    void Start()
    {
        particles = new ParticleSystem.Particle[_particleSystem.emission.burstCount];
    }

    void Update()
    {
        //パーティクルの粒子が存在しているか確認
        if (_particleSystem.particleCount > 0)
        {
            particleNum = _particleSystem.GetParticles(particles);
            
            Vector3 particleSeedPosition = particles[0].position;

            this.gameObject.transform.position = particleSeedPosition;
        }
        else if (particleNum > 0 && _particleSystem.particleCount == 0)
        {
            //音源再生の処理
            particleNum--;
            AudioSource audioSource = this.gameObject.GetComponent<AudioSource>();
            audioSource.Play();
        }
    }
```

まず`ParticleSystem.Particle`の中に取得したい粒子を全部入れてしまいます。
今回は一つしか出ない設定なので`1`と直接書いてしまっても問題ないかと思います。
![burstCount.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/86f77ae5-b846-d82a-a3a6-b7e057c8505b.png)
パラメーターから粒子の数を取得したい場合は
上の画像のCountの下の数字を取得してくればいいので
配列初期化時の要素数に`_particleSystem.emission.burstCount`を与えてあげれば可能です。

あとは`_particleSystem.GetParticles(particles)`とすることで
指定したParticleSystem内の粒子を全て取得することができます。

```C#
Vector3 particleSeedPosition = particles[0].position;
```
最後に`particles`のindexに先頭である0を指定して
粒子のポジション取得が完了です。

##GetParticles
[スクリプトリファレンス](https://docs.unity3d.com/ja/2018.2/ScriptReference/ParticleSystem.GetParticles.html)にも記述ありましたが、
`GetParticles`は現時点で生存しているParticleの粒子を取得するので、
Start内で呼び出してしまうとまだ存在していない粒子に対してGet(取得)してしまうことになり、
うまくいきませんでした。

##デモ

![ParticleAudioSourceAdd.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/1ff4de05-027c-237c-bcd1-a36672468e10.gif)

AudioSourceが一緒に移動しているのがわかるかと思います。

前例が少ない、
エラーが出ない、
などなど、深い沼だった...

この沼から出れた瞬間の快感、病みつきになりますね。
【Github初心者のつまづき】Github上のoriginブランチにpushできない

## はじめに
GitHub初心者のmiyatadaです。
メーカでエンジニアをしています。

職場の開発環境ではSubversionを使用していますが、時代に取り残されている感が否めませんでした。
時代に追いつきたい！プルリクとかしてみたい！ということで自宅の環境で試してみることにしました。
GitHubを使い始めてつまづいた点について記録していきたいと思います。

## 実施したこと
- 共同開発者が作成したリポジトリのoriginブランチにファイルをpushする。
- 以下の記事を参考にして作業を行いました。<br>
https://qiita.com/samurairunner/items/7442521bce2d6ac9330b

## 発生した問題
- 共同開発者が作成したリポジトリのoriginブランチにファイルをpushできない。

## 原因
- リポジトリ作成者にプッシュアクセスを許可してもらう必要があった。

## 解決方法
- リポジトリの設定画面の"Collaborators"に追加してもらう。
    - "Settings"->"Collaborators"->"Search by username, full name or email address"でユーザ選択->"Add collaborator"
<img width="1006" alt="スクリーンショット 2019-04-30 14.50.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393916/74310079-0bf6-f625-0ca7-cb4e1db43be1.png">
レスポンシブ対応時の右側にできた余白を消したい

# 目的
ポートフォリオ用のサイトをレスポンシブ対応したが、スマホから表示すると右側に謎の余白ができてしまう
それをなんとかしたい

ちょっと見づらいけど右側に余白ができている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320255/ce0c08db-f920-7882-af00-3d3944ce5739.png)

# 解決法

### ラッパーでbody全体を包む

```test.html
<body>
  <div id="wrapper"> <!-- ←これを追加する -->
    <div>
     ....
    </div>
  </div>
</body>
```

#### なんで wrapper なのか
> もともとの機能を包んで、そいつの代わりに矢面に立ってくれるやつのこと

※参考
[ラッパー (wrapper)](https://wa3.i-3-i.info/word191.html)

javaのラッパークラスなどのように元クラスを包み込むイメージでしょうか
今回は下のdiv要素全体を包み込んでいる感じですかね


### css で下記を追加する

```test.css
#wrapper {
  overflow: hidden;
}
```

> overflow …… はみ出た要素の表示方法を指定する
> hidden
> 内容がボックスに収まらない場合、収まらない部分は非表示となる。内容が収まらない場合にも、スクロールバーなどは表示されない

ラッパーで包んだ下のdiv要素の余白を非表示にする、という感じですね

※参考
[★CSSリファレンス](http://www.htmq.com/css/overflow.shtml)

### スマホで表示を確認する
右側の余白が消えていることを確認する


# 参考にしたサイト
[右側に謎の余白が表示されてたけどCSSいじったら1分で直った話](http://takutyamu.net/blog/css-yohaku)
ローカルのターミナルから本番環境のリモートサーバーにrails consle(rails c)する

# はじめに

本番環境のリモートサーバーでrails consoleしたい時に便利です

Capistranoでデプロイしている前提です

`capistrano-rails-console`というgemを使います

##Gemを追加

Gemfileの一番下に`capistrano-rails-console`を追記します

```:Gemfile
group :development, :test do
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'capistrano'
  gem 'capistrano-rbenv'
  gem 'capistrano-bundler'
  gem 'capistrano-rails'
  gem 'capistrano3-unicorn'
  #以下を追記
  gem 'capistrano-rails-console'
end
```

bundle installします

```:ターミナル
bundle install
```

##Capfileの編集

Capfileに以下を追記します

```:Capfile
~省略~
require 'capistrano/rails/console'
~省略~
```
保存したら`bundle exec cap production deploy`コマンドでデプロイします

##rails consoleする

デプロイが完了したら、ローカルのターミナルでアプリケーションのディレクトリに移動して以下のコマンドを打ちます

```:ターミナル
bundle exec cap production rails:console
```

これでローカルのターミナルで、本番環境のリモートサーバーにrails cできるようになりました

間違って`destroy_all`とかしないようにご注意を・・

以上で終了です:v:
シンボルとは！？【Ruby超入門】

#シンボルとは

公式ドキュメントでは次のように説明しています。
[Ruby 2.6.0 リファレンスマニュアル](https://docs.ruby-lang.org/ja/2.6.0/class/Symbol.html)

> シンボルを表すクラス。シンボルは任意の文字列と一対一に対応するオブジェクトです。
文字列の代わりに用いることもできますが、必ずしも文字列と同じ振る舞いをするわけではありません。同じ内容のシンボルは必ず同一のオブジェクトです。

> Rubyの内部実装では、メソッド名や変数名、定数名、クラス名など の`名前'を整数で管理しています。これは名前を直接文字列として処理するよりも 速度面で有利だからです。そしてその整数をRubyのコード上で表現したものがシンボルです。

>シンボルは、ソース上では文字列のように見え、内部では整数として扱われる、両者を仲立ちするような存在です。

>名前を管理するという役割上、シンボルと文字列は一対一に対応します。 また、文字列と違い、immutable (変更不可)であり、同値ならば必ず同一です。



**文字列と似ているオブジェクトで、ソース上では文字列のように見えているが、内部的には整数として扱われている。**ということですかね。

## シンボルの書き方
**文字列は`'Ruby'`のように`'`(シングルクォート)もしくは`"`(ダブルクォート)で囲むが、シンボルは`:Ruby`というように`:`(コロン)から始まる。**

```ruby
# シンボル
:Ruby

# 文字列
'Ruby'
```

##シンボルと文字列の違い

###SymbolクラスとStringクラス

シンボルは`Symbol`クラスのオブジェクトで、文字列は`String`クラスのオブジェクトになる。

```ruby
puts :Ruby.class   #=> Symbol
puts 'Ruby'.class  #=> String
```

### 処理速度

**シンボルは内部で整数として管理されるため、文字列と比べて高速に処理できる。**

```ruby
# シンボルの方が早く処理できる
:Ruby == :Ruby
'Ruby' == 'Ruby'
```

### 同じシンボルであればオブジェクトも同じ

**文字列と違い同じ内容のシンボルは必ず同一のオブジェクトとなり、オブジェクトの数が増えないためメモリの使用効率がよくなる。**

```ruby
puts :Ruby.object_id   #=> 989668
puts :Ruby.object_id   #=> 989668
puts :Ruby.object_id   #=> 989668

puts 'Ruby'.object_id  #=> 70270585805660
puts 'Ruby'.object_id  #=> 70270585805600
puts 'Ruby'.object_id  #=> 70270585805540
```

### シンボルはimmutable(イミュータブル)

**シンボルはimmutable(変更不可)なオブジェクトのため、文字列のように破壊的な変更ができない。**
なので、「変更できない名前をつける」という用途に向いている。

```ruby
# シンボルはimmutableなので、破壊的な変更は不可能
symbol = :Ruby
puts symbol.upcase!
#=> undefined method `upcase!' for :Ruby:Symbol (NoMethodError)

# 文字列は破壊的な変更が可能
string = 'Ruby'
puts string.upcase!  #=> RUBY
```

## シンボルのまとめと主な用途

### まとめ

- **文字列とは違うが似ているため、プログラマにとって理解しやすい。**
- **内部で整数として扱っているため、文字列に比べて処理速度が速い。**
- **同じ内容のシンボルは必ず同一のオブジェクトとなるため、メモリの使用効率が良い。**
- **immutableなので、勝手に値を変えられない。**

### 主な用途

- **ハッシュのキー**
- **クラス名/メソッド名/変数名/定数名**
- **ステータス名**

**これらは文字列自体がデータではないのでシンボルを使うと良い。**
逆に文字列は「氏名」や「住所」など、文字列自体がデータであるときに使う。

**関連記事**
[ハッシュの基本【Ruby超入門】](https://qiita.com/yyykms123/items/2ceaec214f1f8a514011)

## 参考書
* [プロを目指す人のためのRuby入門](https://www.amazon.co.jp/gp/product/4774193976/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4774193976&linkCode=as2&tag=ykms1230e-22&linkId=7d182a6724516a0f1a495c33599a4946)
* [ゼロからわかる Ruby 超入門 (かんたんIT基礎講座)](https://www.amazon.co.jp/gp/product/4297101238/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4297101238&linkCode=as2&tag=ykms1230e-22&linkId=16f1470f0d06b61a190643877fd54da0)

## 参考記事
* [Rubyの文字列とシンボルの違いをキッチリ説明できる人になりたい](https://qiita.com/Kta-M/items/53a13ef60e14fcb41193)
ROIメモ

#OpenCVにおけるROIについて
##はじめに
OpenCVとPython、何ならタッチタイピングを同時に頑張る初心者
調べても分からなかったこととか、自分が躓いたところとかを書いていく備忘録
##ROIとは

ROIとは"Region Of Interest"注目領域のこと
何らかの画像処理を一部分だけとか、特定の範囲に施したい時がある
その「特定の範囲」をROIと呼ぶ
投資利益率という意味もあるらしい

##OpenCVにおけるROI
OpenCVではROIは矩形(くけい)領域にしか対応していない
矩形というのは長方形のこと
長方形領域とは言わないらしい
なんでだろう？
例えば、ヒト型、円形、星型...は別の方法で処理する

##よくある流れ
①ROIを定義
`roi = (y0,y1,x0,x1)`
長方形の左上端(x0,y0)と右下端(x1,y1)の情報が必要
コードで、またはマウスイベントにより
各変数の値を定める
※画像の範囲を超えないようにする

②ROI領域を取る
`img_roi = img[roi[0]:roi[1],roi[2]:roi[3]]`
元画像imgの高さy0-y1、幅x0-x1に当たる部分が今回のROI領域

③何かしらの処理をする
`img_roi = cv.●●(img_roi,...)`
ZFS(mirror)でスペアディスクを追加する

# ZFS(mirror)でスペアディスクを追加する

FreeBSDのセットアップ時にZFS Rootにすると、ミラーまでは作れるけど、スペアが追加出来ないため、
セットアップ完了後に追加する方法です。

ググればすぐ分かるんだけど、gpartのbackup/restoreが忘れがちなので、記事にしました。

## 前提条件

- ada0/ada1でミラー構成している
- ada2をスペアに追加する
- ZFSのボリューム名は zroot

## 操作方法

gpartでada0のパーティション構成をada2にコピーして、スペアに追加する

```
# gpart backup ada0 | gpart restore ada2
# zpool add zroot spare ada2p4
```

## 参考にした記事

* https://decomo.info/wiki/blog/2016/2016-08-02
* https://docs.oracle.com/cd/E19253-01/819-6260/gcvcw/index.html
無音区間でファイルを分割するエイリアス shell script + sox

# 目的
ファイルを分割するスクリプトを組む

# 準備

rc ファイルにスクリプトを登録する

``` shell:.bashrc
function split_sound () {
/usr/local/bin/sox -V3 $1 $2 silence -l 1 0.2 0.1% 1 0.2 0.1%: newfile : restart
}

alias splitsound=split_sound
```

設定ファイルを読み込む

```
$ source ~/.bashrc
```

# 使い方

```shell-session
$ splitsound test.wav test_part.wav
```


# 参考
- [シェルスクリプトで関数を利用する](https://qiita.com/kaw/items/034bc4221c4526fe8866)
- [SoX を使い音声ファイルの無音部分を起点にして分割する](https://qiita.com/sakaue3/items/47285ca9258605043bed)
WIP : ansibleの基本的な使い方リンク集

## 目的
簡単なお作法なんだろうけど毎回忘れるのでリンク集を作りたい（こなみかん)
出来れば先人の方のリンクをペタペタする感じにいけたらいいな（ーー

##### - module関係
- apt modlue
  - [ansible aptモジュール サンプル](https://qiita.com/maki_azuki/items/b0679959a61e00966c75):sunny:
      - [apt modlueのオプションが色々あるので見てみる](https://qiita.com/maki_azuki/items/6396a5be97204162c44c):sunny:

##### - 変数関係(Variables)
変数の操作色々あるのでここに貼っていく

- filters
  - ansibleのfilter関連調査
Python勉強用の環境構築2(PaizaCloudでサーバ作成、PaizaCloudで実装したソースをGit上にプッシュ)

##導入
前回、晴れて私用PCでGit,GitHubを使えるようになったため、今回はアプリケーション実装環境の構築に取り組みます。

##PaizaCloudの使用を検討
本来であればローカル環境で開発を進める予定でしたが、以下理由によりひとまずクラウドIDE(PaizaCloud)を使用する方針を検討。
・私用PCのSPECが低く、開発作業が円滑に進まないことが想定される為。
(PC買い替え後はローカル環境での開発に移行するかも？)
・クラウドIDEを使用した開発経験が一度もないため。
・作成したアプリケーションの導入/公開が容易な為。

##PaizaCloudでDjangoを使用した超簡単なWebページの表示まで
下記ページを参考にサーバを新規作成し、モジュールを実装。
※「メッセージの表示」まで実施。
https://paiza.hatenablog.com/entry/2018/02/28/paizacloud_django
(アカウント登録作業自体はGitHubアカウントを保持していた為、秒速で終了。
また、当面はライトプラン(月額980円)を使用する想定。無料だと24時間の使用制限が。。。)

##実装したソースをGit上にプッシュ
下記のページを参考に今回作成したソースを新規リポジトリにプッシュしました。
https://qiita.com/Hal_mai/items/3433e508a4c5fd82323c
https://reasonable-code.com/git-local-remote/

以下、手順抜粋。

【1】SSH鍵を作成(コマンドはPaizaCloudeのターミナルで実行します。)

```
$ cd /home/ubuntu
$ ssh-keygen
```

【2】作成した公開鍵を表示(コマンドはPaizaCloudeのターミナルで実行します。)

```
$ cd /home/ubuntu/ssh
$ cat id_rsa.pub
```

【3】手順【2】で確認した公開鍵をGitHubに登録する
GitHub上で「Settings」-「SSH and GPG keys」と遷移し、「Add SSH Key」を押下。
2で確認した公開鍵の内容を登録する。
※PaizaCloudを無料版で使用する場合は24時間ごとに鍵作成→登録を繰り返す必要あり。

【4】GitHubで新規リポジトリ作成
GitHub上にあらかじめ新規で登録するリポジトリを作成する。
(今回の場合は参考ページをもとにアプリを作成中の為、「mysite」とする。)

【5】Paiza上でローカルリポジトリ作成→リモートへプッシュ
以下コマンドをPazaiCloudのターミナルで実行し、作成したソースをGit上へプッシュ。

``` 
# mysiteディレクトリ(mysiteというリポジトリを作成する)へ移動
cd /home/ubuntu/mysite

# ローカルリポジトリを作成する
$ git init
$ git add .
$ git commit -m "Initial commit"

# リモートリポジトリのアクセス先を設定する(リモートリポジトリは手順【4】で作成済み。)
$ git remote add origin https://github.com/GitHubのユーザ名/mysite.git

# pushする
$ git push -u origin master
```

##Next
いったんPiazaCloudでもGitを使用したアプリケーション開発ができることを確認できたため、本日のタスクは完了。
次回は引き続きDjangoのチュートリアルを行っていく予定。(DB作成からスタート。)
今年の言語はRust その４３

# 今年の言語はRust その４３

Rustを学びます

Rustの日本語ドキュメント 2nd Edition
https://doc.rust-jp.rs/book/second-edition/

オリジナル(英語)
https://doc.rust-lang.org/book/


## 実行環境

```sh
$ cargo -V
cargo 1.33.0 (f099fe94b 2019-02-12)

$ rustup -V
rustup 1.17.0 (069c88ed6 2019-03-05)

$ rustc --version
rustc 1.33.0 (2aa4c46cf 2019-02-28)

$  cat /proc/version
Linux version 4.14.97-74.72.amzn1.x86_64 (mockbuild@gobi-build-64002) 
(gcc version 7.2.1 20170915 (Red Hat 7.2.1-2) (GCC)) 
#1 SMP Tue Feb 5 20:59:30 UTC 2019

$ uname -a
Linux ip-10-100-0-8 4.14.97-74.72.amzn1.x86_64 
#1 SMP Tue Feb 5 20:59:30 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/\*release
NAME="Amazon Linux AMI"
VERSION="2018.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2018.03"
PRETTY_NAME="Amazon Linux AMI 2018.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
Amazon Linux AMI release 2018.03

```

## 15 スマートポインタ

### 15.2 'Deref'トレイトでスマートポインタを普通の参照のように扱う

> 'Deref'トレイトを実装することで、__参照外し演算子(*)__ のふるまいをカスタマイズできる

#### 参照外し演算子で値までポインタを追いかける

以下、のコードを見ると、値と値までのポインタの違い、そして、参照外しがわかります

```rust
fn main() {
    let x = 5;
    let y = &x;

    assert_eq!(5, x);
    assert_eq!(5, *y);
}
```

#### Box<T>を参照のように使う

```rust
fn main() {
    let x = 5;
    let y = Box::new(x);

    assert_eq!(5, x);
    assert_eq!(5, *y);
}
```

Boxが参照のようにふるまうことが、分かったので、

独自実装を考えましょう


#### 独自スマートポインタを定義


```rust
struct MyBox<T>(T); // タプル構造体

impl<T> MyBox<T> {
    fn new(x: T) -> MyBox<T> {
        MyBox(x)
    }
}
```

```rust
fn main() {
    let x = 5;
    let y = MyBox::new(x);

    assert_eq!(5, x);
    assert_eq!(5, *y); // Derefが定義されていないので、参照外しできない
}
```

#### Derefトレイトを実装して型を参照のように扱う

```rust
use std::ops::Deref;


struct MyBox<T>(T); // Tuple Structure

impl<T> MyBox<T> {
    fn new(x: T) -> MyBox<T> {
        MyBox(x)
    }
}

// 参照外しの実装
impl<T> Deref for MyBox<T> {
    type Target = T;
    
    fn deref(&self) -> &T {
        &self.0 // Tuple[0]
    }
}



fn main() {
    let x = 5;
    let y = MyBox::new(x);

    assert_eq!(5, x);
    assert_eq!(5, *y);
}
```

実際は以下のコードが走る

```rust
*(y.deref())
```

つまり、以下のような2変数を取り扱い、参照渡し時には、0Indexの要素を渡すような、スマートポインタを実装できます

```rust
use std::ops::Deref;


struct MyBox<T>(T, T); // Tuple Structure

impl<T> MyBox<T> {
    fn new(x: T, y:T) -> MyBox<T> {
        MyBox(x, y)
    }
}


impl<T> Deref for MyBox<T> {
    type Target = T;
    
    fn deref(&self) -> &T {
        &self.0 // Tuple[0]
    }
}



fn main() {
    
    let y = MyBox::new(5, 10);

    assert_eq!(5, *y);
}
```

#### 関数やメソッドで暗黙的な参照外し型強制

```rust
fn hello(name: &str) {
    println!("Hello, {}!", name);
}

fn main() {
    let m = MyBox::new(String::from("Rust"));
    hello(&m);
    hello(&(*m)[..]); // 同じ意味
}
```


ここら辺は復習が必要だな。


イエス！