OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity】TextMeshにカウントアップを表示する

### やったこと
- ３D空間にText Meshを使って、テキストを表示
- 秒でカウントアップ
- ある秒数に達したら、"FINISH"を表示

### 前提
- UnityがPCに入っている　かつ　ビルドできるようになっている

### 作る

##### TextMeshを作成する
- 左ペインで右クリックメニューを選択し、空のObjectを作成する（Create Empty）

    <img width="150" alt="スクリーンショット 2018-07-11 18.52.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/77327/a7d335d1-b5a2-60d4-6840-5ce4073921e3.png">

- 空のObjectのInspectorでText MeshをAdd Componentする（textで検索するとすぐ見つかる）

    <img width="304" alt="スクリーンショット 2018-07-18 18.45.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/77327/09618168-6ecc-7013-0326-44356fc39b88.png">

- Textに初期表示の"TIME"を入れる（Font Sizeを大きくしておくと、文字がにじまない）

    <img width="305" alt="スクリーンショット 2018-07-18 18.41.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/77327/997055d4-1e9c-8325-22c0-2a1aa4074576.png">

- Sceneに"TIME"というText Meshが表示される

##### Scriptを書く
- Assetsの下で右クリックし、Create<C# Scriptを選択

    <img width="471" alt="スクリーンショット 2018-07-18 18.54.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/77327/8d8e2608-7f80-4a26-d10e-f582fd351257.png">

- コードを書く

    ```ruby:C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MeasureTime : MonoBehaviour {
	GameObject time;
	int timeLimit;
	float deltaTime;
	int intNowTime;
	string strNowTime;
	// Use this for initialization
	void Start () {
		Debug.Log(":::::START:::::");
		time = GameObject.Find("Time");   // 時間計測用GameObjectの取得
		timeLimit = 10;   // 制限時間
	}
	// Update is called once per frame
	void Update () {
		deltaTime += Time.deltaTime;   // 経過時間
		intNowTime = (int)deltaTime;   // 経過時間の整数部分
		timeLimit = timeLimit - intNowTime;   // 実際の秒数
		strNowTime = intNowTime.ToString();   // TextMeshのGameObjectに代入するためにString型にする
		time.GetComponent<TextMesh> ().text = strNowTime;
		// 制限時間経過時の設定
		if(intNowTime > 10){
			time.GetComponent<TextMesh> ().text = ":::::FINISH:::::";
		}
	}
}
```

##### ScriptをText Meshにアタッチする
- Assetsの下のC#のファイルをHierarchyのObjectにdrag & dropする
【Swift】Optional Value が nil の場合の処理方法


# はじめに
オプショナルバリューが`nil`の場合の処理方法をまとめる

# オプショナルバリューとは
オプショナルバリューとは、nilの可能性がある値のこと
Optional()でラップされているのでこのまま値を使えません
そこで、　nilかどうかを判別して処理を分岐させる必要があります

> 初期値の設定 ??

オプショナルバリュー ?? 初期値
の形で記述すると、オプショナルバリューがnilの場合、初期値を使用することになります

```swift
var count:Int?
var price:Int

// countはnilなので、初期値5で計算する
price = 250 * (count ?? 5)
print("\(price)円です")

// 1250円です

// countがnilでなく3なので、3で計算する
count = 3
price = 250 * (count ?? 5)
print("\(price)円です")

// 750円です
```

> Opitional Binding

`オプショナルバインディング`は、オプショナルバリューがnilでなければ
値をアンラップして一時変数に代入し、nilの場合はfalseを返す機能です
この機能は`if文`、`while文`、`guard-else文`で利用できます

- if文

```swift

var str:String?
str = "Swift"

if let msg = str {
    // strがnilでない処理
    print("\(msg)ワールド")
} else {
    // strがnilの時の処理
    print("ハローワールド")
}

```

- for-in文と組み合わせて

```swift

var sum = 0
let dic:[String:Int?] = ["a":23, "b":nil, "c":10, "d":nil]

for (_, value) in dic { // for-inで辞書型を取り出した場合タプルで取得される　keyは使わないので捨てる
    if let num = value {
        sum += num // dicから取り出したvalueがnilでない時だけ実行される
    }
}
print("数値の合計は\(sum)")
```

- while文

```swift

var str:String? = "☆★"
var repeatString:String = ""
var i = 0

// strがnilでない時、アンラップしてstampに代入します　nilならwhileループを実行しません
while let stamp = str {
  repeatString += stamp
  i += 1
  if (i > 10) {
    break
  }
}
print(repeatString)
```

- guard-else文

guard-else文でオプショナルバインディングを利用することで、オプショナルバリューがnilの場合に処理を中断し、
nilでない場合は値をアンラップして変数/定数に代入しそのまま利用していくことができます
if文と異なるのは、if文ではアンラップした値を代入した変数/定数はif文のブロック内でだけ有効なローカル変数という点です

```swift

let who = "桜"
var level:Int?

func hello() {
    // levelをtheLevelにオプショナルバインディングする
    guard let theLevel = level else {
        return // theLevelがnilの時は処理を中断する
    }

    if theLevel < 10 {
        print("hello\(who)隊員")
    } else {
        print("hello\(who)上級隊員")
    }
}

// level未設定
hello()  // 処理が中断される
// level設定
level = 9
hello()

// hello桜上級隊員
```

> Optional Chain

`オプショナルチェーン`とは、オブジェクトや配列などの値に`ドットシンタックスでアクセス`する時に
対象に`?`を付けることで、値がnilだった場合に`実行時エラーを回避`する記述方法です

```swift

// ballsは配列で、タプルの値を持つ
// ballsが空のとき
// 配列操作　[Array.first]　で最初の値にアクセスできる
var balls:[ (size:Int, color:String) ] = []
var ballsize = balls.first?.size  // 値がないのでnilです　ここで処理が中断してballsizeにnilが代入されます
print(ballsize)

// ballsに値があるとき
balls = [ (size:2, color:"red" ), (size:4, color:"green") ]
ballsize = balls.first?.size
print(ballsize)
```

### 参考
[詳細！Swift 4 iPhoneアプリ開発 入門ノート Swift 4+Xcode 9対応](https://www.amazon.co.jp/Swift-iPhone%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA-%E5%85%A5%E9%96%80%E3%83%8E%E3%83%BC%E3%83%88-Xcode-9%E5%AF%BE%E5%BF%9C/dp/4800711843/ref=sr_1_2?s=books&ie=UTF8&qid=1531908595&sr=1-2&keywords=Swift+4+iPhone%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA)
【PHP】正規表現でHTMLの特定のclassを置き換える方法

最近、正規表現を触る機会が増えてきまして、その中でタイトルの方法がなかなか見つからなかったので、
「無いなら自分で書いてみよう」ということで。
# TL;DR
「before」を「after」に置き換えたい！

``` html:これを
<div class="before"> //単体
<div class="hoge before"> //前に他のクラスがついている場合
<div class="before fuga"> //後ろに他のクラスがついている場合
<div class="hoge before fuga"> //前後に他のクラスがついている場合
<div class="hoge_before fuga"> //置き換えたいクラス名を含む他のクラスがついている場合（これは置き換えない）
<div class="hoge-before fuga"> //置き換えたいクラス名を含む他のクラスがついている場合（これは置き換えない）
<div class="hogebefore fuga"> //置き換えたいクラス名を含む他のクラスがついている場合（これは置き換えない）
<div class="hoge before_fuga"> //置き換えたいクラス名を含む他のクラスがついている場合（これは置き換えない）
<div class="hoge before-fuga"> //置き換えたいクラス名を含む他のクラスがついている場合（これは置き換えない）
<div class="hoge beforefuga"> //置き換えたいクラス名を含む他のクラスがついている場合（これは置き換えない）
```

``` html:こうしたい！
<div class="after"> //単体
<div class="hoge after"> //前に他のクラスがついている場合
<div class="after fuga"> //後ろに他のクラスがついている場合
<div class="hoge after fuga"> //前後に他のクラスがついている場合
<div class="hoge_before fuga"> //置き換えたいクラス名を含む他のクラスがついている場合（これは置き換えない）
<div class="hoge-before fuga"> //置き換えたいクラス名を含む他のクラスがついている場合（これは置き換えない）
<div class="hogebefore fuga"> //置き換えたいクラス名を含む他のクラスがついている場合（これは置き換えない）
<div class="hoge before_fuga"> //置き換えたいクラス名を含む他のクラスがついている場合（これは置き換えない）
<div class="hoge before-fuga"> //置き換えたいクラス名を含む他のクラスがついている場合（これは置き換えない）
<div class="hoge beforefuga"> //置き換えたいクラス名を含む他のクラスがついている場合（これは置き換えない）
```
#サンプルコード
``` php:サンプルコード
<?php
  $pattern = '/class=((?:\s|")?)(.*?)((?:\s|")+)before((?:\s|")+)(.*?)((?:\s|")?)/';
  $replacement = 'class=$1$2$3after$4$5$6';
  $html = <<<EOT
<div class="before"> //単体
<div class="hoge before"> //前に他のクラスがついている場合
<div class="before fuga"> //後ろに他のクラスがついている場合
<div class="hoge before fuga"> //前後に他のクラスがついている場合
<div class="hoge_before fuga"> //置き換えたいクラス名を含む他のクラスがついている場合（これは置き換えない）
<div class="hoge-before fuga"> //置き換えたいクラス名を含む他のクラスがついている場合（これは置き換えない）
<div class="hogebefore fuga"> //置き換えたいクラス名を含む他のクラスがついている場合（これは置き換えない）
<div class="hoge before_fuga"> //置き換えたいクラス名を含む他のクラスがついている場合（これは置き換えない）
<div class="hoge before-fuga"> //置き換えたいクラス名を含む他のクラスがついている場合（これは置き換えない）
<div class="hoge beforefuga"> //置き換えたいクラス名を含む他のクラスがついている場合（これは置き換えない）
EOT;

$html = preg_replace($pattern, $replacement, $html);
print($html);
```
流れは下記を参照
[![image (1).png](https://qiita-image-store.s3.amazonaws.com/0/137405/9ff96669-786b-c9ea-02a7-00438f34c336.png)](https://regexper.com/#class%3D%28%28%3F%3A%5Cs%7C"%29%3F%29%28.*%3F%29%28%28%3F%3A%5Cs%7C"%29%2B%29before%28%28%3F%3A%5Cs%7C"%29%2B%29%28.*%3F%29%28%28%3F%3A%5Cs%7C"%29%3F%29)
UnityCacheServerをLinux上に立ててサービス化する

UnityCacheServerの構築＆サービス化のまとめ。

UnityCacheServer: 6.02
OS: AmazonLinux2 


## インストール

管理しやすいようにnpmでインストール

```bash
curl --silent --location https://rpm.nodesource.com/setup_12.x | sudo bash -
sudo yum -y install nodejs
sudo npm install unity-cache-server -g

→/usr/lib/node_modules/unity-cache-server/ 以下に展開される
```

## サービス化

```bash
sudo adduser unity -s /sbin/nologin
sudo chown -R unity:unity /usr/lib/node_modules/unity-cache-server
sudo vi /etc/systemd/system/unity-cache-server.service
```

```/etc/systemd/system/unity-cache-server.service
[Unit]
Description=Unity Cache Server Service
After=network.target

[Service]
Type=simple
User=unity
ExecStart=/usr/bin/unity-cache-server
Restart=on-abort

[Install]
WantedBy=multi-user.target
```
```bash
sudo systemctl enable unity-cache-server

→これで以下サービスコマンドが実行可能 ＆ サーバ再起動時に自動起動される

sudo service unity-cache-server start
sudo service unity-cache-server status
sudo service unity-cache-server stop
sudo service unity-cache-server restart
```

## 設定ファイル

/usr/lib/node_modules/unity-cache-server/config/default.yml 


## 参考URL


https://networm.me/unity-cache-server-setup.html
https://docs.unity3d.com/ja/current/Manual/CacheServer.html
https://github.com/Unity-Technologies/unity-cache-server
https://dev.classmethod.jp/cloud/aws/release-change-ebs-volume-size/
Dockerで --name 指定しないでコンテナ実行するとヘンテコなデフォルト名がつく

# 結論
知ってる人はいまさらなのだろうけど表題のとおり。

たとえばコンテナ名を指定しないで [Alpine Linux](https://hub.docker.com/_/alpine/) を起動、

```console
$ docker run -dti alpine
```

これを５回繰り返して稼働中のコンテナ一覧を表示すると

```console
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED                  STATUS              PORTS               NAMES
6da9c28e58c1        alpine              "/bin/sh"           Less than a second ago   Up 4 seconds                            happy_hopper
ca10bb5ecaa8        alpine              "/bin/sh"           Less than a second ago   Up 5 seconds                            xenodochial_gates
4c2f6b245552        alpine              "/bin/sh"           1 second ago             Up 7 seconds                            confident_heisenberg
283c516e80fe        alpine              "/bin/sh"           2 seconds ago            Up 8 seconds                            sleepy_wilson
99c3e02fb36e        alpine              "/bin/sh"           About a minute ago       Up 2 minutes                            gracious_volhard
```

みたいに勝手に変な名前がつく。最初に気づいたときはえらい狼狽して「こんな名前のコンテナ起動したことないのに！マルウェアかんせんした！たいへん！すごくやばい！」とか言語能力低下しながら慌てて docker rm しまくる始末。でもコンテナ名でググっても何もヒットしないし、あれ？これはもしかして……と思ったらそういう仕様だった、と。


- [How does Docker generate default container names? • my2cents](https://frightanic.com/computers/docker-default-container-names/)
- [Dockerコンテナのおもしろい名前 | SOTA](https://deeeet.com/writing/2014/07/15/docker-container-name/)

アンスコ挟んで形容詞と人名で構成されるので、試しただけでも以下のようなコンテナ名が生成された。

```
determined_goldstine
vigorous_easley
happy_raman
gracious_engelbart
trusting_haibt
clever_torvalds
hardcore_goldberg
lucid_mirzakhani
musing_wiles
optimistic_cray
wizardly_wing
upbeat_goldberg
admiring_mayer
vigorous_golick
lucid_hypatia
naughty_jackson
agitated_visvesvaray
loving_turing
epic_agnesi
```

やりやがったなこのやろうと勝手に憤りながら[ソースコード](https://github.com/moby/moby/blob/master/pkg/namesgenerator/names-generator.go)を覗いてみたらとても丁寧に記述されていたのでかえって安らかな気持ちになって現在に至る。

以上
AWSその３　EC2でWindows Server を立てる（自分メモ）

# この記事の対象者
AWSでIAMユーザを割り当てられて手順通り管理したり、
初心者用の本読んだりしたけど、イマイチ理解できていない人が
いきなりAWSのアカウントを作成して、四苦八苦しながら
検証や勉強の環境を作っているライブ配信を見たい人
＊ただし更新はリアルタイムではないので注意
＊Markdownも慣れていないので読みにくいと思うけど我慢できる人

# その２の内容
IAMで管理者ユーザー作成

# その３の内容
EC2を立てる

# 本来であれば
VPCの設定が先ですが、やっぱりサーバたてたいじゃないですか。

# キーペアとは
キーペアとは、EC2で利用できる、公開鍵秘密鍵です。
キーペアを作成すると、「.pem」というファイルがダウンロードできますが、
これが秘密鍵に当たります。プライベートキーです。
つまり、この「.pem」ファイルは誰にも渡してはいけません。

この「.pem」を、WindowsではAdministratorのパスワードを表示するのに使い、
LinuxではSSHの認証に用います。
まずはWindowsのお話。
EC2インスタンスを立てている間でも作成できますが、先に作っておいたほうがわかりやすいイメージです。

# キーペア作成
EC2のメニューにいき、左側ペインからキーペアを選択します。
「キーペアの作成」をクリックすると、名前を入力する欄が出ますので、
わかりやすい名前を付けておきましょう。例えばWindowsServer2012-dcなど。
作成ボタンを押すと、「WindowsServer2012-dc.pem」というファイルがダウンロードできますので、
これを保存しておきます。
なくしたらアウトなので、気を付けてください。

# EC2インスタンス作成
インスタンスとはEC2の、端的に言ってしまうとサーバの単位ことです。
あまり複雑なことを考えなくてもいいです。
EC2インスタンスといったら、構築したサーバのことだと思ってください。

左側ペインからインスタンスを選びます。
インスタンスの作成をクリックすると、インスタンス作成ウィザードが開始されます。
まずはAMIイメージの選択
簡単に言えばどのOSを使うか、ですが、正確には、「様々な設定がすでに施されているOSイメージ」です。
例えば「Microsoft Windows Server 2012 R2 with SQL Server 2016 Web 」というイメージでは、
「最初からSQLサーバ2016がインストールされているWindowsサーバ」を立てることができる、といった感じです。

今回はWindows Server 2012 R2にActiveDirectoryを構築したいので、空っぽのWindows Serverを立てます。
無料枠の対象である「Microsoft Windows Server 2012 R2 Base - ami-4e0cc331」を選択しましょう。

次はインスタンスタイプです。簡単に言えばスペックです。
お試しですので、無料枠の「t2.micro」を。
あとから変更はできませんが、イメージ化して別のインスタンスで構築しなおすこともできます。
右下の「次の手順：インスタンスの詳細の設定」をクリック。

ステップ３はインスタンスの詳細設定。
ネットワークとかの設定ですが、ひとまず、サブネットのところだけ、
「ap-northeast-1c」に設置します。1aや1d（1b？）もありますが、ひとまず1cでいいです。
あくまで検証用ですので、どこでもいいんですが。

ステップ４（追加ストレージ）、ステップ５（タグ）はいったん飛ばしましょう。
ステップ６、セキュリティグループの設定です。
これは、ネットワークの通信のルールのグループのことで、VPCのあたりでいじることになります。
余計なものが混ざらないように、既存の「default」グループを選択してください。
ステップ７で最終確認して、「作成」をクリック。
すると、キーペアを作成する・選ぶ画面が出るので、先ほど作成したキーペアを選択して、チェックを付けて、「インスタンスの作成」をクリックします。

すると、数分で構築が完了します。

今回はここまで。
JSTQB AL テストマネージャ 第1章 420分

### 参考
ありがとうございます

- [Advanced Level シラバス日本語版 テストマネージャ](http://jstqb.jp/dl/JSTQB-Syllabus.Advanced_TM_Version2012.J03.pdf)

- [スクエアリング　｜　用語集](http://squaring.jp/term/terms.do)

- [テストマネージャ試験対策勉強会](https://www.slideshare.net/mhlyc/ss-63870834)

## 1.2 テストプロセス

計画、モニタリング、及びコントロール⇒分析⇒設計⇒実装⇒実行⇒終了基準の評価とレポート⇒終了作業


![image.png](https://qiita-image-store.s3.amazonaws.com/0/10966/8f68b83d-bd59-e1b2-75bc-157428e256b5.png)

#### 1.2.1 テスト計画作業
  - テスト計画を策定し、更新すること。
  - プロジェクト全体を通じて継続する。
  - テスト戦略で特定された使命や目的を達成するために必要な、活動とリソースの特定を行う。
  - プロジェクトのガイド、計画順守の判断、及び目的達成の評価に使用されるメトリクスを収集し追跡する方法を特定する。
  - テストアプローチを定義する。
  - 対処的戦略を採用する場合は、探索的テストなどの動的テスト技法のテストチャータとツールを作成する計画が必要となることがある。

```:テスト計画とは
計画されたテスト活動の狙い、アプローチ、リソース、スケジュールを記述するドキュメント。
テストアイテム、テストすべきフィーチャ、タスク、各タスク担当者、テスト担当者の独立の度合、テスト環境、用いるテスト設計技法と開始・終了基準、それらの選択の理論的根拠、それに代替計画を必要とするあらゆるリスクを識別する。
これはテスト計画プロセスの記録である。
```

```:テストアプローチとは
特定のプロジェクトでテスト戦略を実装したものである。
典型的に、プロジェクト(テストプロジェクト)のゴール、実施されたリスクアセスメント、規定されたテストプロセスの開始点、適用するテスト設計技法、テスト終了基準、実施するテストタイプなどにもとづいた決定事項を含んでいる。
```

```:テスト戦略とは
テストをどう行えば、最も効率的で効果が高いテストができるかを示すもの。
組織や長期計画で実施すべきテストレベルと各テストレベルでのテスト内容を高位レベルで記述したもの。[ISTQB]
※テスト戦略は組織で共通化したテンプレートであり、それをもとに各プロジェクトではテストアプローチとして具体化する。[SQUARING]
```

```:テストベースとは
コンポーネント要件やシステム要件を導出できる全てのドキュメント。
テストケースの素材となる、テスト対象の性質や品質、特徴などを記したものを指す。 
例えば、要件や、アーキテクチャ、設計、インターフェース仕様など、さまざまなものがある。

```

```:テストチャータとは
テスト目的を記載したもの。
探索的テストにて使用する。
```



#### 1.2.2 テストのモニタリングとコントロール
- テストスケジュールと進捗確認方法を確立する。
- テスト成果物とテストリソースを計画と比較して追跡できるようにする。
- テスト成果物とテスト活動のステータスをテストベースに関連付ける場合、プロジェクトとビジネスのステークホルダーにとって理解可能で適切な方法で行うことが、特に重要である。
- 計画と実際の進捗との比較、及び必要に応じた是正措置の実装を含む。テストコントロールでは、必要に応じてテスト計画作業を再検討するなど、使命、戦略、及び目的を満たすようにテストをガイドする。


## 1.3テスト分析
- 何をテストするかをテスト条件の形式で定義する活動

```:テストケースとは
「この状態でこの入力を行えば、この処理が行われてこの結果が期待される」といった内容を記載したもの
```

```:テスト条件とは
テストケースにより検証できるもの。例えば、機能、トランザクション、フューチャ、品質の属性、構造要素など
```

テスト条件を指定するための詳細度合いを決定するには、以下考慮する必要がある。
詳細にテスト条件を考えると、たくさんのテスト条件を作成する傾向がある。

- テストレベル
- テストベースの詳細度と品質
- システムまたはソフトウェアの複雑性
- プロジェクトリスクとプロダクトリスク
- テストベース、テスト内容、およびテスト方法間の関係
- 使用するソフトウェア開発ライフサイクル
- 使用するテストマネジメントツール
- テスト設計及びその他のテスト成果物に関する、詳細度、及び文書化レベル
- テストアナリストのスキルと知識
- テストプロセス及び組織自体の成熟度（成熟度が高いほど、高い詳細度合いが必要となることもあれば、低い詳細度合いが可能になることもあることに注意）
- コンサルテーションのために他のプロジェクトステークホルダを利用できる可能性

## 1.4 テスト設計
- テストケースを生成する作業
- 下位テストレベルのテストでは、テスト分析とテスト設計が統合されて活動する可能性がある



## 1.5 テスト実装

- テストケース、テスト手順、テストデータを実装する活動
- テスト実行開始準備の最終チェックも含む
- テスト環境及びテストデータの詳細な説明の作成を含むことも可能

早期のテスト実装の短所

- アジャイルの場合、コードが劇的に変化し、実装作業の多くが陳腐化する可能性がある

早期のテスト実装の長所
- ソフトウェアの正しい動作状態の稼働例を提供
![image.png](https://qiita-image-store.s3.amazonaws.com/0/10966/3fe05aa3-e02a-dc0a-fd25-7d67c5a7158b.png)


## 1.6 テスト実行
- 開始基準を満たしたとき始まる

- テスト担当者に裁量を与えて、経験ベースおよび欠陥ベースの技法にて、テストしてもらう。

テスト実行での、テストマネージャの主な役割
- テスト計画に従って進捗をモニタリングし、テストを成功に導くため、コントロール活動を実行すること。


## 1.7 終了基準の評価とレポート
- レポートの詳細度合いは、テスト計画フェーズで検討し、ステークホルダーと協議が必要

## 1.8 テスト終了作業
- 主要なアウトプットを集めて、次工程の担当者に引き渡すか、保管する必要があり、この作業が終了作業である。

テスト終了作業は大きく４つの作業がある。

- テスト完了チェック
- テスト成果物の提供：次の人々へ
- 学習した教訓：振り返りミーティング等
  - 見積もりは正確であったか
  - 欠陥の傾向と結果
  - プロセス改善の余地
  - 今後対応すべき、予定外の作業が発生するか
- 成果物の保管：大切に保管
![image.png](https://qiita-image-store.s3.amazonaws.com/0/10966/158f0ee3-c0c0-7376-e727-4962b8104537.png)
[python]opencvで画像を背景白の正方形にする

# 用意するもの
- 白地の画像

# コード
```lang:python
import cv2
import os
import numpy as np

# 背景画像を読み込む
back_img = cv2.imread("背景画像のパス")

img = cv2.imread("正方形にしたい画像のパス")
tmp = img[:, :]
height, width = img.shape[:2]
if(height > width):
    size = height
    limit = width
else:
    size = width
    limit = height

start = int((size - limit) / 2)
fin = int((size + limit) / 2)
new_img = cv2.resize(back_img, (size, size))

if(size == height):
    new_img[:, start:fin] = tmp
else:
    new_img[start:fin, :] = tmp

# 保存する
cv2.imwrite("保存ディレクトリ" + file, new_img)

```
パソコンを経由でiPhone同士間のデータ移行

iTunesを使わず、iOSデバイス間でデータ転送する方法を紹介します。もちろん、Airdropでデータの転送もできますが、管理面として、あまり不便ですね。しかもすべてのデータを一括に転送できません。

EaseUS MobiMoverという[データ移行ソフト](https://jp.easeus.com/phone-transfer/mobimover-free.html)を使えば、iPhone同士間のデータ移行が可能です。機種変更の際に、写真データまたはほかの一部のデータが転送できまいエラーがよく出ます。この時役に立てるツールです。

もちろん、iPhone間のデータ移行だけではなく、iPhoneからPCへ、PCからiPhoneからPCまでの移行も問題ないです。しかし、iOS 8.0及び以上のバージョンだけ使えます。iOSデバイスのデータはあらゆる対応できます。また、データ移行以外にYouTubeなどの動画サイトからビデオをiPhoneまたはPCに導入できます。とても便利で使いやすいソフトです。

#### **- 操作手順について**

1. 2台のデバイスをパソコンに接続、初期画面で1クリック転送を選択します。
![ios-to-ios.png](https://qiita-image-store.s3.amazonaws.com/0/203250/4455efa5-bcc8-7a39-93f8-ef09cd27a8b2.png)

2.  データのカテゴリを選択して、転送をクリックすれば完成です。

かなり簡単な流れですね。ほかの操作手順もほぼ同じわずかのクリックでデータの移行と管理ができます。
RのバージョンにセンシティブなhyperGTestのエラー

# RのバージョンにセンシティブなhyperGTestのエラー  

---

GOstatsの超幾何分布検定関数hyperGTestが、結果の抽出時にエラーを吐く。タイトル通り、Rのバージョンを3.5  以上にアップグレードすると解決する。  


```
#オブジェクトparamは、hyperGTest用のGOHyperGParamsインスタンス。
GOHypG <- hyperGTest(param) 

#summary関数で結果を得る
summary(gotest_res) 
	initialize(value, ...) でエラー: 
	引数 "go_id" がありませんし、省略時既定値もありません 
```
summary関数がgo_idという引数をとるという記述も見当たらないし、同じエラーの痕跡がインターネット上になかなか見出せなかった。あとは、細かくソースを読み取るしかないが正直ダルイ。 
そんな中、ようやく見つけた記事が[こちら](https://support.bioconductor.org/p/108988/)で、GOstatsの場合もどうやらバージョンの問題ではないかと推測して、3.5へアップグレードした。アップグレード後の結果は、summary関数が通るだけなので載せないが、アップグレード前のバージョンは、3.4.6。決して現時点（2018.7.18）でも古いバージョンではない。アップグレード後のsession.infoを載せておく。  


```
> sessionInfo()
R version 3.5.1 (2018-07-02)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS High Sierra 10.13.4

Matrix products: default
BLAS: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRblas.0.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRlapack.dylib

locale:
[1] ja_JP.UTF-8/ja_JP.UTF-8/ja_JP.UTF-8/C/ja_JP.UTF-8/ja_JP.UTF-8

attached base packages:
[1] stats4    parallel  stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] dplyr_0.7.6          org.Hs.eg.db_3.6.0   annotate_1.58.0      XML_3.98-1.12        GO.db_3.6.0          GOstats_2.46.0       graph_1.58.0         Category_2.46.0      Matrix_1.2-14        AnnotationDbi_1.42.1
[11] IRanges_2.14.10      S4Vectors_0.18.3     Biobase_2.40.0       BiocGenerics_0.26.0  BiocInstaller_1.30.0

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.17           pillar_1.3.0           bindr_0.1.1            compiler_3.5.1         bitops_1.0-6           tools_3.5.1            digest_0.6.15          bit_1.1-14             tibble_1.4.2          
[10] RSQLite_2.1.1          memoise_1.1.0          lattice_0.20-35        rlang_0.2.1            pkgconfig_2.0.1        DBI_1.0.0              Rgraphviz_2.24.0       bindrcpp_0.2.2         genefilter_1.62.0     
[19] tidyselect_0.2.4       bit64_0.9-7            grid_3.5.1             glue_1.3.0             GSEABase_1.42.0        R6_2.2.2               RBGL_1.56.0            survival_2.42-6        purrr_0.2.5           
[28] magrittr_1.5           blob_1.1.1             splines_3.5.1          assertthat_0.2.0       AnnotationForge_1.22.0 xtable_1.8-2           RCurl_1.95-4.11        crayon_1.3.4          
> 
```
[Unity]Unity Cache ServerをSystemdで管理する

2018年07月18日時点のUnity Cache Serverはnpmでインストールすると良い感じに使えるらしいが、2017年に導入した時はzipでダウンロードして、サーバーに配置してみたい方法しかなかった気がする。

その際に、SystemdでUnity Cache Serverの起動をコントロールできるようにしたのを記録。
以下を /etc/init.d/unity-cache-server とかでおく。

```bash
#!/bin/sh

### BEGIN INIT INFO
# Provides: unity_cache_server
# Required-Start $network $remote_fs
# Required-Stop: $network $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Unity Cache Server.
# Description: Unity Cache Server provides fast importing
# of assets that have already been processed by any member of the team.
### END INIT INFO

if [ -f /etc/init.d/functions ]; then
    # Source function library.
 . /etc/init.d/functions
else
    echo_success () { echo -n " [ OK ] "; }
    echo_failure () { echo -n " [FAILED] "; }
fi

if [ -f /etc/sysconfig/network ]; then
        # Source networking configuration.
        . /etc/sysconfig/network

        # Check that networking is up.
        [ X\${NETWORKING} = Xno ] && exit 0
fi

##
# UnityCacheServer startup script
##

################################################################################
## EDIT FROM HERE
################################################################################

# Installation prefix
PREFIX="/opt/CacheServer"
# Username to run as
CSUSER="root"

# Arguments
ARGS="--port 8126 --path /data/CacheServer/cache5.0 --size 53687091200 --nolegacy"

################################################################################
## STOP EDITING HERE
################################################################################

# The path that is to be used for the script
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

PROG="unity_cache_server"
DAEMON_APP=$PREFIX/RunLinux.sh
DAEMON="nohup $DAEMON_APP $ARGS > /dev/null 2> /dev/null &"
RETVAL=0
PID=""

getpid() {
    PID=`ps ax | grep $PREFIX | grep -v grep | awk '{print $1}'`
}

start () {
    getpid
    if [ $PID ]; then
        echo $"$PROG (pid $PID) is already running."
        return 0
    fi

    echo -n $"Starting $PROG: "
    su -l $CSUSER -c "$DAEMON"
    RETVAL=$?
    if [ $RETVAL -eq 0 ]; then
        echo_success
        echo
    else
        echo_failure
        echo
        exit 1
    fi
}

stop () {
    getpid
    if [ ! $PID ]; then
        echo $"$PROG is not running."
        return 0
    fi
    echo -n $"Stopping $PROG: "
    su -l $CSUSER -c "kill $PID"
    RETVAL=$?
    if [ $RETVAL -eq 0 ]; then
        echo_success
    else
        echo_failure
    fi
    echo
}

restart () {
    stop
    start
}

dostatus() {
    getpid
    if [ $PID ]; then
        echo $"$PROG (pid $PID) is running."
    else
        echo $"$PROG is not running."
    fi
}

# See how we were called.
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
    dostatus
    ;;
  restart)
    restart
    ;;
  *)
    echo "Usage: unity_cache_server {start|stop|status|restart}"
    exit 1
esac

exit $RETVAL
```

あとは service／systemctl とかで操作する。

ネット上のスクリプトコピーして、カスタマイズした記憶だけはある。
ポイントはARGSでキャッシュの保存先を別途マウントしたディスク領域にしていることです。
Chokudai SpeedRun 001

[コンテストURL](https://beta.atcoder.jp/contests/chokudai_S001/)
####A
やるだけ
####B
やるだけ
####C
やるだけ
####D
たいていの言語にはソート関数がデフォルトであるからやるだけ
####E
線形探索するだけ
####F
前から見ていって、ある位置より前にある数のmaxとその数を比較すればよい
####G
文字列化して前から「ans += 今見ている桁, ans *= 10, ans %= 1000000007」を繰り返す(一番最後の桁は10倍しなくてよい)
####H
有名なDPなのでググってね！(他人任せ)
####I
しゃくとり法を使おう！分からない人はググってね！(他人ry)
累積和＋二分探索でもできるよ！分からないry
####J
BITを使おう！有名なのでググっt(ry
####K
前から見ていって、 $i$ 桁目(1-indexed)では「 $($ 今見ている桁の数 $-$ 今見ている数よりも小さい数のうち今まで出てきた数の個数 $-1)\times _NC_i$」を答えに足せば良い
コンビネーションの計算はグ(ry
####L
しらん！
Vagrantでhtaccessを有効にする

htaccessが効かなかったのでメモ

参考
http://tanaka8.com/2014/08/vagrant-apache-htaccess/

## やったこと

変更

```:/etc/httpd/conf/httpd.conf

<Directory />
    AllowOverride None
    Require all denied
</Directory>

↓

<Directory />
    AllowOverride all
    Require all denied
</Directory>

```

Apacheを再起動
[openFrameworks] スマートポインタを使ってスマートにparticleを飛ばす

先輩から教えてもらった方法をメモ。

Particleクラスみたいなものをつくって、それをvectorにぶち込んで大量に飛ばしたくなる時ってままありますよね。

##良くある実装例
###ofApp.h
```C++
vector<Particle> mParticle;
```
###ofApp.cpp
```C++
Particle tmpP;
mParticle.push_back(tmpP);
```

##スマートポインタを使った実装例
###ofApp.h
```C++
vector<ofPtr<Particle> > mParticle;
```
###ofApp.cpp
```C++
ofPtr<Particle> tmpP = ofPtr<Particle>(new Particle);
mParticle.push_back(tmpP);
```

スマートです。
MSX screen8サンプル

参考
[3章 MSX2の画面モード - テクハンwiki](http://ngs.no.coocan.jp/doc/wiki.cgi/TechHan?page=3%BE%CF+MSX2%A4%CE%B2%E8%CC%CC%A5%E2%A1%BC%A5%C9)
[Appendix A.1 BIOS 一覧 - テクハンwiki](http://ngs.no.coocan.jp/doc/wiki.cgi/TechHan?page=Appendix+A%2E1+BIOS+%B0%EC%CD%F7)

```pset.c
/*
z88dk / WebMSX
zcc +msx -lndos -create-app -bnpset pset.c
*/

int gttrig(char num)
{
#asm
	ld	a, l		; num
	call	$00d8		; GTTRIG
	ld	l, a
	ld	h, 0
#endasm
}

void nwrvrm(int addr, char data)
{
#asm
	ld	ix, 0
	add	ix, sp
	ld	a, (ix+2)	; data
	ld	l, (ix+4)	; addr
	ld	h, (ix+5)
	call	$0177		; NWRVRM
#endasm
}

void chgmdp(char mode)
{
#asm
	ld	a, l		; mode
	ld	ix, $01b5	; CHGMDP
	call	$015f		; EXTROM
#endasm
}

void main()
{
	chgmdp(8);

	int addr = 0;
	for (int y = 0; y < 212; y++) {
		for (int x = 0; x < 256; x++) {
			nwrvrm(addr++, x);
		}
	}
	while (! gttrig(0)) ;
}
```

![WMSX Screen.png](https://qiita-image-store.s3.amazonaws.com/0/257554/c9cdac5e-94ce-35fe-ac6a-52edc2ec7b32.png)
List of objects in avro format

avroの中に配列入れる方法がよくわからなかったのでメモ

これが参考になりました。

[java \- How to create schema containing list of objects using Avro? \- Stack Overflow](https://stackoverflow.com/questions/25076786/how-to-create-schema-containing-list-of-objects-using-avro)

こんな感じの親子関係を avroで定義したいとき、

```java
class Child {
    String id;
    String name;
}

class Parent {
    String name;
    list<Child> children;
}
```

こんな感じに定義する。

schema.avsc

```json
{
    "name": "Parent",
    "type":"record",
    "fields":[
        {
            "name": "name",
            "type": "string"
        },
        {
            "name":"children",
            "type":{
                "type": "array",
                "items":{
                    "name":"Child",
                    "type":"record",
                    "fields":[
                        {"name":"id", "type":"int"},
                        {"name":"name", "type":"string"}
                    ]
                }
            }
        }
    ]
}
```

データの生成はこんな感じ

```python
import avro.schema
from avro.datafile import DataFileWriter
from avro.io import DatumWriter

with open("schema.avsc", "rt") as avsc:
    schema = avro.schema.Parse(avsc.read())

with DataFileWriter(open("output.avro", "wb"), DatumWriter(), schema) as writer:
    writer.append(
            {
                "name": "parent-name",
                "children":  [
                    {"id": 1, "name": "child-name-1"},
                    {"id": 2, "name": "child-name-2"},
                    {"id": 3, "name": "child-name-3"}
                ]
            }
    )
```

ファイルを読んでみる

avro-read.py

```python

from avro.datafile import DataFileReader
from avro.io import DatumReader
import sys

file = sys.argv[1]

with DataFileReader(open(file, "rb"), DatumReader()) as reader:
    for resp in reader:
        print(resp)
```

```
$ python avro-read.py output.avro
{'name': 'parent-name', 'children': [{'id': 1, 'name': 'child-name-1'}, {'id': 2, 'name': 'child-name-2'}, {'id': 3, 'name': 'child-name-3'}]}
```
0からDB入門！！RailsのDBをMySQLに変更する方法

こんにちは。
fumimi（[@fumimi](https://twitter.com/fumimi_jp)）です。

RailsのDB（データベース）をMySQLに変更することは初心者の方が苦戦する項目の1つだといえます。

* DBってなに？？
* MySQLってなに？？
* RailsのDBってどうやって変更するの？？

という方を対象にRailsのDBをMySQLに変更する方法を解説します。

DBコンソールの立ち上げからなるべく簡単に説明しますので初心者の方もコマンドやソースコードが書かれている箇所は上から順番に読み進めてみてください。

DBやMySQLの解説を行ってから簡単なRailsのサンプルアプリケーションを作成しながらデフォルトのSQLiteからMySQLへデータベースを変更する方法を解説していきます。

理解しながらコマンドを実行したりソースコードを修正しながらやるとおよそ8分程度で読めます。

# 環境
macOS High Sierra
Ruby 2.5.1
Rails 4.1.0

# DBとは？？
DBとは **「追加、取得、削除、更新をしやすい形に整理されたデータの集まり」** です。

# MySQLとは？？
MySQLとは、世界で最も多く使われているデータベースです。

特徴は、検索のスピードが高速で機能もすぐれていることです。そのためMySQLを使うことで、ユーザーからのアクセスが多い大規模なアプリケーションに対応することができます。

データベースは高機能なものだと有料の場合もありますが、MySQLはオープンソースであるため、他のデータベースよりも低コストで使うことができます。

また、オープンソースなので非商用利用であれば無償で使用できるため、初心者でも簡単に利用できます。

# MySQL設定

多くの人がログインする可能性のあるデータベースは、常にrootユーザーのアカウントを使うことはセキュリティ上よくありません。

そのためデータベースを操作する場合には、特定のユーザーのみが特定のデータベース使えるように作業ユーザーを新しく作ることが一般的です。

それでは、作業ユーザーの作成方法から確認します。

MySQLの新規ユーザー作成と権限付与については以下の記事をご確認ください。

[0からDB入門！！MySQLで新規ユーザー作成と権限付与](https://qiita.com/fumimi/items/2223f428c40241dc9f53)

# アプリケーションの新規作成
「アプリケーションの新規作成の方法はわかる」
「MySQLに変更の方法だけしりたい」
という方はこのセクションは読み飛ばしてください。

サンプルアプリケーションの作成を行います。

```shell-session:ターミナル
$ rails new _4.1.0_ Book
```

# Rails設定

`mysql2` というGemをインストールします。

```rb:Gemfile
gem 'mysql2'
```

Gemのインストールを実行します。

```shell-session:ターミナル
$ bundle update
$ bundle install
```

RailsのDBの設定ファイルである `database.yml` というファイルを修正します。 `database.yml` は `config` というディレクトリの中にあります。 ` []`で囲まれている箇所はご自身の環境によって任意で修正してください。また、必要であればtest環境とproduction環境も同様にファイルを修正してください。

```yaml:/config/database.yml
development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: [database]
  pool: 5
  username: [username]
  password: [password]
  host: localhost
```

# テスト

```shell-session:ターミナル
$ rails g scaffold book title:string detail:string
$ rake db:migrate
```

migrate してうまくいけば完了です。
AGC023-B Find Symmetries

[問題URL](https://beta.atcoder.jp/contests/agc023/tasks/agc023_b)
**注 : この解法は公式解説に書かれている解ではありません**
##愚直解
ある $A,B$ について、 $2$ つ目の盤面がよい盤面かどうかを判定するには比較する文字が $N^2$ 個あるので $O(N^2)$ 回の比較をしなければいけません。
また、 $A, B$ の選び方は $N^2$ 通りあるので、総計算量は $O(N^4)$ になり、TLEします。
##高速化
$X_{i,j}=S_{i,j}S_{i,j+1}S_{i,j+2}...S_{i,j+N-1}, Y_{i,j}=S_{i,j}S_{i+1,j}S_{i+2,j}...S_{i+N-1,j}$ とします。ただし添え字は全て1-indexedです。
(直感的に言うと、 $X_{i,j}$ はマス $(i,j)$ から右に、 $Y_{i,j}$ はマス $(i,j)$ から下に読んでいった文字列)
この時、ある $A, B$ の選び方について $2$ つ目の盤面がよい盤面であるということは、
$X_{A+1, B+1}＝Y_{A+1, B+1}$
$X_{A+2, B+1}＝Y_{A+1, B+2}$
$X_{A+3, B+1}＝Y_{A+1, B+3}$
:
$X_{A+2, B+N}＝Y_{A+1, B+N}$
であることと同じです。これを素直に比較していては総計算量は $O(N^4)$ で変わりません。
しかし、あらかじめ $X_{i,j}$ と $Y_{i,j}$ に何らかのhash関数を用いてhash値を求めておけば、文字列の比較にかかる計算量が $O(1)$ となり、総計算量は $O(N^3)$ に落とすことができます。

[ACしたコード](https://beta.atcoder.jp/contests/agc023/submissions/2428581)
NAMAROIDの音声認識をChromeでやってみた

## **1. 概要**

[『NAMAROIDの音声認識をAmiVoiceでやってみた』](https://qiita.com/atticatticattic/items/8c6f2fb008d21384df05)に引き続き、
Chromeの音声認識機能を利用して、NAMAROID5を利用する方法を紹介します。

## **2. システム構成**
ブラウザでのクリップボードを利用する場合いろいろ制限があるため、別途nodeプロセスを動かしています。
ブラウザとnodeプロセス間は socket.io(web socket)で通信しています。

<img width="1009" alt="chat.png" src="https://qiita-image-store.s3.amazonaws.com/0/12429/f8a97a3e-d9f2-e9dd-6584-c283ae8e9e3a.png">

## **3. 使い方**
3.1は 初回のみの設定で、2回目以降は3.2を実行するだけで、利用できます。

### **3.1 初期設定**
#### **3.1.1 windows に [node](https://nodejs.org/ja/)をインストール**
  バージョンは最新版(v10以降)を利用してください。

#### **3.1.2 git公開しているプログラム一式をダウンロードしてください**
https://github.com/YoshikazuOota/chrome_namaroid
緑のボタンから、zipダウンロード、解凍してください。

![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/12429/e9aee370-9082-e6c5-bc21-ab90e79c9415.png)

#### **3.1.3 初期設定用バッチ実行**
解凍ディレクトリのルートにある『setting.bat』 を実行してください
エラーが発生した場合は、下記手順を試してください
  - 解凍ディレクトリでコマンドプロンプトを開く
     -『スタート』-> 『アクセサリ』->『コマンドプロンプト』を開く
     - 『cd [解凍ディレクトリ]』 *[解凍ディレクトリ]は自分の環境に合わせて入力

  - npm install を実行
    下記の4行をコマンドプロンプトに入力してください。

```
    npm install clipboard-polyfill
    npm install copy-paste
    npm install express
    npm install socket.io
```

### **3.2 使用方法**
#### **3.2.1 サーバ起動バッチファイルを実行**
 解凍ディレクトリのルートにある『start.bat』を実行
 上手く行かなければ、コマンドプロンプトで、解凍ディレクトリに移動してから、『node server.js 』を実行する

#### **3.2.2 NAMAROID クリップボックス版を開く**
  NAMAROID5 クリップボード対応版は下記のURLのコメント欄で公開しています。
  http://ch.nicovideo.jp/StackGamesEmpire/blomaga/ar1455406

#### **3.2.3 NAMAROID のクリップボード監視機能を有効にして、開始する**
  設定を開き『クリップボード監視機能』を有効にしてください。デフォルトではOFFです。
  設定ができたら、開始ボタンを押してください。

#### **3.2.4chrome で http://localhost:3000/ を開き、音声認識を開始ボタンを押す**
  Chrome以外で実行不可能です。
  音声認識ができれば、認識文字がブラウザ内で表示されます。
  表示された文言はNAMAROIDに転送されて、読み上げできます。

![スクリーンショット 2018-07-18 17.41.42.png](https://qiita-image-store.s3.amazonaws.com/0/12429/b3051c68-e962-9678-8582-dc66943a9fb9.png)


### **4. 感想**
Chromeの音声認識APIはフリーで使える範囲では、トップクラスのスペックだと思います。
独自の単語が登録できるAmiVoiceも魅力的ですが、導入が面倒なので、こちらもおすすめできます。

バグ・ご質問などございましたら、お問い合わせください。
Macで使われているポート番号を調べる方法

#このような悩みを持つ方に。
- 開発環境を構築しようとしたら、ポートが被ってしまった
- 自分が何番のポートを使っているかが分からない

##Finderからネットワークユーティリティを起動

Finder
↓
<code>⌘ command + ⇧ shift + G</code>
↓
<code>/System/Library/CoreServices/Applications/</code>
↓
「ネットワークユーティリティ」を機動
![スクリーンショット 2018-07-18 17.38.02.png](https://qiita-image-store.s3.amazonaws.com/0/262785/301615f1-694d-bca0-d5d9-d1b45b0b4c40.png)

##Portscanタブから自分のポート番号を検索

自分のPCのIPアドレス「127.0.0.1」を入力
↓
※必要なら「ポートを限定してテスト」でスキャンする範囲を決める
↓
scan選択
↓
現在使用しているポート番号が一覧で表示される
![スクリーンショット 2018-07-18 17.46.51.png](https://qiita-image-store.s3.amazonaws.com/0/262785/766d9460-b1c8-38c6-5664-8745a38003d3.png)

##余談
###<del>mac本体のポートをお探しの方はこちら</del>
<a href="https://support.apple.com/ja-jp/ht201736" target="_blank">Mac のポートを調べる</a>
②Raspberry Pi3で湿度と温度を取得する

# 準備するもの（周辺機器）
1.Raspberry Pi 3
2.dh11（湿度、温度センサー）
3.ブレッドボード（Raspberry Pi初心者キット使用）
4.オスジャンパー、メスジャンパー（Raspberry Pi初心者キット使用）
5.抵抗（Raspberry Pi初心者キット使用）

# dh11+ブレッドボード+Raspberry Piを接続

dh11の接続名称
![スクリーンショット 2018-07-18 17.26.32.png](https://qiita-image-store.s3.amazonaws.com/0/25698/b9c0eca7-801c-5351-cc75-233c2d09fa04.png)

Raspberry Piの接続名称
![スクリーンショット 2018-07-18 17.26.09.png](https://qiita-image-store.s3.amazonaws.com/0/25698/6038e665-1ab5-c8bf-d139-a691cc91c1b9.png)

dh11+ブレッドボード+Raspberry Piを接続
※ブレッドボードと抵抗は必須
![スクリーンショット 2018-07-18 17.25.51.png](https://qiita-image-store.s3.amazonaws.com/0/25698/35d843aa-a229-af8c-6413-451cf3b1760e.png)


# 温度・湿度を取得するサンプルpythonプログラムをダウンロード
gitインストール

```
sudo apt-get install git
```

サンプルpythonプログラムインストール

```
git clone https://github.com/szazo/DHT11_Python.git
```

# サンプルスクリプト

```dht11_example.py
import RPi.GPIO as GPIO
import dht11       # ・・・ ①
import time
import datetime

# initialize GPIO
GPIO.setwarnings(False)       # ・・・ ②
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()

# read data using pin 14
instance = dht11.DHT11(pin=14)      # ・・・ ③

while True:
    result = instance.read()    # ・・・ ④
    if result.is_valid():    # ・・・ ⑤
        print("Last valid input: " + str(datetime.datetime.now()))
        print("Temperature: %d C" % result.temperature)    # ・・・ ⑥
        print("Humidity: %d %%" % result.humidity) 

    time.sleep(1)    # ・・・ ⑦
```

※③ ジャンパーの接続先のGPIO番号を設定します。今回は接続している14を設定します。


# 温度・湿度センサーサンプルスクリプト実行

```
sudo python dht11_example.py 

Last valid input: 2018-07-21 05:49:15.232504
Temperature: 29 C
Humidity: 63 %
Last valid input: 2018-07-21 05:49:17.393183
Temperature: 28 C
Humidity: 71 %
Last valid input: 2018-07-21 05:49:21.698929
Temperature: 29 C
Humidity: 79 %
```
SQLで組み合わせを作ってみる

1から15の数字を使って要素数7の組み合わせを作る

要はこれ $$ _{15} C _7 $$


```SQL
WITH element AS(
  SELECT 
    a
  FROM 
    UNNEST(GENERATE_ARRAY(1,15)) AS a
)

SELECT
  e1.a AS a1, 
  e2.a AS a2, 
  e3.a AS a3, 
  e4.a AS a4, 
  e5.a AS a5, 
  e6.a AS a6, 
  e7.a AS a7
FROM
  element AS e1,
  element AS e2,
  element AS e3,
  element AS e4,
  element AS e5,
  element AS e6,
  element AS e7
WHERE 
  e1.a < e2.a
  AND e2.a < e3.a
  AND e3.a < e4.a
  AND e4.a < e5.a
  AND e5.a < e6.a
  AND e6.a < e7.a
```

もうちょっとスマートにしたい。
とは言えこれができたからと言って利用用途が思いついてるわけではない。
AGC003-D Anticube

##問題URL
[これ](https://beta.atcoder.jp/contests/agc003/tasks/agc003_d)
##考察
・全探索............無理............DP............無理............
・ $a$ との積が立方数になる数はどんな数だろう？
・ $2$ との積が立方数になる数...
$4$
$32$
$108$
$256$
:
・全部 $4$ の倍数だ
・ $4$ で割ると $1, 8, 27, 64...$ 立方数じゃん！
・ $2 \times 4 \times $ (立方数) は $8 \times $ (立方数) になるから立方数になるのか
・だったら $p_1^{e_1}p_2^{e_2}...p_k^{e_k}$ との積が立方数になる数は $p_1^{3-e_1}p_2^{3-e_2}...p_k^{3-e_k}$ であればいいのか
・ん、これじゃ $16$ の時とかに対応する数が $1/2$ になっちゃうな
・ $p_1^{3-e_1 \mod 3}p_2^{3-e_2 \mod 3}...p_k^{3-e_k \mod 3}$ か
・これだと $8$ の時に対応する数が $1$ じゃなくて $8$ になる
・だったら $p_1^{2-(e_1+2) \mod 3}p_2^{2-(e_2+2) \mod 3}...p_k^{2-(e_k+2) \mod 3}$
・全ての $s_i$ についてこれが5秒以内に求められるか？
・素因数分解に $O(\sqrt{s_i})$ だから計算量は $O(\displaystyle\sum_{i=1}^N\sqrt{s_i})$ になって間に合わない
・とりあえず「 $s_i$ から立方数を取り除く(＝ $e_i \mod 3$ を求める)パート」と「 $s_i$ から立方数を取り除いた後、積が立方数になる数を求めるパート」に分けて考えよう

####立方数を取り除くパート
・素因数分解と同じように、小さい立方数から割っていけばいい
・ $s_i$ までの立方数で割ればいいから、割るべき立方数の個数は $\sqrt[3]{s_i}$ 個程度
・計算量は $O(\displaystyle\sum_{i=1}^N\sqrt[3]{s_i})$ になる
・これだと最悪で $3.1\times10^8$ 程度になるからギリギリだ
・改善できないか？
・ (素数)$^3$ で割れるだけ割る、という方法が使えそう
・ $\sqrt[3]{s_i}$ 以下の素数をエラトステネスの篩であらかじめ列挙しておけばいい(計算量は $O(\sqrt[3]{s_i}\log\log\sqrt[3]{s_i})$ )
・素数の密度は素数定理より $\log_e \sqrt[3]{s_i}=\frac{1}{3}\log_e s_i$ 程度なので、立方数を取り除くパートの計算量は $O(\sqrt[3]{\max(s_1, s_2, ... s_N)}\log\log\sqrt[3]{\max(s_1, s_2, ... s_N)}+\displaystyle\sum_{i=1}^N\frac{\sqrt[3]{s_i}}{\log{s_i}})$ で間に合う

####積が立方数になる数を求めるパート
・立方数を取り除いた $s_i$ を $P_1^{E_1}P_2^{E_2}...P_k^{E_k}$ として、 $P_1^{3-E_1}P_2^{3-E_2}...P_k^{3-E_3}$ を求める ( $E_i=1,2$ )
・ただ素因数分解をする → $O(\displaystyle\sum_{i=1}^N\sqrt{s_i})$ → 間に合わない！
・あらかじめ素数を列挙して、素数だけで割って素因数分解をする → $O(\displaystyle\sum_{i=1}^N\frac{\sqrt{s_i}}{\log{s_i}})$ → 間に合わない！

ここまで書いたんですが、次の話(Code内の83行目〜91行目)に対する説明が難しすぎたのでここで諦めます
Code → https://beta.atcoder.jp/contests/agc003/submissions/2413701
php프로그래밍공부시작

今日から始まります。
私は韓国人なので韓国語でポストしようとおもいます。
でも日本語も勉強しないとだめだから日本語もつかいます。
宜しくお願い致します。

今日は水曜日ですが、私は剣道を好きなので剣友会に行く予定です。
終わったらご飯食べてちょっとでも勉強するつもりです。

そして最近本を買いますた。
Modern php, Learning php です。
Learning phpから勉強します。
出来れば1年いないに開発者で仕事するつもりです。
ChromeのLocalOverridesを使ってみよう

【以下社内向けに書いたものを再編集です】

chrome65から実装されたLocalOverridesの機能で、ローカルで指定したディレクトリに保存したファイルを編集し、devtoolsを開いてさえいれば、ページリロードしても変更した表示ができるようになっているので便利です。

## 使用例

- 本番サイトやテストサイトでの調査
- 作業中ファイルが実際のサイトに反映されたときの確認など

## 使用方法

devtoolsを開き、`Overrides` タブを選択。

![スクリーンショット 2018-07-18 15.13.16.png](https://qiita-image-store.s3.amazonaws.com/0/30278/a968f8b2-a696-bac2-38c7-88312139970b.png)

`Select folder for overrides` を選択し、ローカルディレクトリを指定します。すると、

![スクリーンショット 2018-07-18 15.13.03.png](https://qiita-image-store.s3.amazonaws.com/0/30278/26132f20-bc73-8446-181c-682947cc943a.png)

アクセスの警告がでますが、許可しましょう。


![スクリーンショット 2018-07-18 15.15.58.png](https://qiita-image-store.s3.amazonaws.com/0/30278/e8045dc9-5752-16af-8fd5-b109aa602846.png)

そして、`Page` タブで変更したいファイルを選択し、`Save for overrides` で保存します

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30278/b469a082-45c9-b9a6-0ace-1b0b64c2224f.png)

すると、`Overrides` タブの中でファイルが保存されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30278/3ce1c77e-f345-6d76-e92f-280641d9f35e.png)

`Pages` タブでも保存されたファイルにはマークが付きます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30278/2cb99261-30f6-6a49-0d9e-94e36b2bf4ef.png)

これが差し替えできるファイルになるので、自由に編集し、リロードしてみましょう。

ちなみに...
使い方として、この状態で指定したローカルディレクトリに保存してあるファイルを、別のファイルで上書きすると実は変更できたりします。
つまりローカルファイルの差し替えてテストが簡単にできる、ということになります。

工夫次第で作業効率があがるかもしれませんね。
Treasure Data で既存のテーブルと同じスキーマのテーブルを作成する

TreasureData にて、例えば巨大なテーブル A からランダムサンプリングしたテーブル B を作成したいとき、あらかじめテーブル A と同じスキーマを持ったテーブル B を作成しておく必要がある。

Web UI から良い感じにやる方法があるのかと思ったけど見当たらなかったので、td コマンドを使ってなんとかした。

``` sh
#!/bin/sh -eu

FROM_DB='sample_datasets'
FROM_TABLE='nasdaq'

TO_DB='sample_datasets'
TO_TABLE='nasdaq_sample'

SCHEMA=$(td schema:show $FROM_DB $FROM_TABLE | grep -e '^ ' | perl -ple 's/\s+//g' | tr '\n' ' ')

td table:create $TO_DB $TO_TABLE
td schema:set $TO_DB $TO_TABLE $SCHEMA
```

以下、簡単な解説。

例えば `td schema:show` は

``` console
$ td schema:show sample_datasets nasdaq
sample_datasets.nasdaq (
  symbol:string
  open:double
  volume:long
  high:double
  low:double
  close:double
)
```

このような形式でスキーマ情報を返してくるので、これを整形して

``` console
$ td schema:show sample_datasets nasdaq | grep -e '^ ' | perl -ple 's/\s+//g' | tr '\n' ' '
symbol:string open:double volume:long high:double low:double close:double
```

このような一行の文字列にすることで、 `td schema:set` に渡すことが出来るようになる。
ofxKinectForWindows2 を使ってBoneで遊ぶ

今更Kinect使い始めたのでBoneやJointの情報を使ってなんかやりたい時のメモ。

ofxKinectForWindows2のインポートの方法はこちらの記事を参考にしました。
https://qiita.com/YuYuYuYoYoYo/items/b97feda35a62eba8ec7a

##単体のJointの情報を使って何かしたい時
JointType_〇〇という定数をjointsのindexに渡してあげて取得する。

###ofApp.cpp
```C++
void ofApp::update(){
    auto bodies = kinect.getBodySource()->getBodies();
    for (auto body : bodies) {
        if (!body.tracked) continue;
        ofVec3f neckRotation = body.joints[JointType_Neck].getOrientation().getEuler(); //首の回転取得
    }
}
```



##複数のJointの情報を使って何かしたい時
全身のJointを使って複雑な処理をしたい場合はswitchで処理してやると比較的楽かも。以下は例。
###ofApp.cpp
```C++
void ofApp::update(){
    auto bodies = kinect.getBodySource()->getBodies();
    for (auto body : bodies) {
        if (!body.tracked) continue;
        ofVec3f handRightPos //右手の位置;
        ofVec3f handLeftPos; //左手の位置;
        ofVec3f shoulderRightPos; //右肩の位置;
        ofVec3f shoulderLeftPos; //左肩の位置;
        for (auto joint : body.joints) {
            TrackingState state = joint.second.getTrackingState();
            if (state == TrackingState_NotTracked) continue;
            switch (joint.second.getType()) {
                case JointType_HandRight:
                    handRightPos = joint.second.getPosition();
                    break;
                case JointType_HandLeft:
                    handLeftPos = joint.second.getPosition();
                    break;
                case JointType_ShoulderRight:
                    shoulderRightPos = joint.second.getPosition();
                    break;
                case JointType_ShoulderLeft:
                    shoulderLeftPos = joint.second.getPosition();
                    break;
                //省略~~
            }
        }
    }
}
```
あとはそれぞれのJoint間の相対位置などからポーズ認識するだけ。
ちなみにJointの定数のリストはvvvvのDocumentationのものが分かりやすかったので貼っておきます。
https://vvvv.org/documentation/kinect

Kinect for Azure楽しみっすね
Windows で adb コマンドだけ入れる

手順

- デバイスをUSBでつなぐ
- 下記ファイルを確認
  Downloads (ダウンロード) > platform-tools > adb.exe 

- 無ければ下記から SDK Platform-Tools for Windows をダウンロード & 解凍
https://developer.android.com/studio/releases/platform-tools

- adb.exe が入っているフォルダを開いて、エクスプローラーのアドレス打ち込む場所に cmd と入力
- 黒い画面が開くので、下記をそのまま入力

```
./adb.exe devices
```

`adb` デーモンが起動して、つなげるようになる
「HeadFirstデザインパターン」と「Rubyによるデザインパターン」を読んで Iterator パターン

何番煎じか判りませんがお勉強メモを残します

「[HeadFirstデザインパターン](https://www.amazon.co.jp/dp/4873112494)」第2章
「[Rubyによるデザインパターン](https://www.amazon.co.jp/dp/4894712857)」第5章

# Iterator パターン

#### 「HeadFirstデザインパターン」でのJavaコードは（だいたい）こんな感じ

異なるCorrection 例えば

- ArrayList
- "配列"

に反復処理を行いたい場合、

```java
ArrayList hogeArrayList = getHogeArrayList();

for (int i = 0, s = hogeArrayList.size(); i < s; i++) {
  Hoge hoge = (Hoge)hogeArrayList.get(i);
  // hoge への処理
}
```

```java
Hoge[] hoges = getHogeArray();

for (int i = 0, l = hoges.length; i < l; i++) {
  Hoge hoge = hoges[i];
  // hoge への処理
}
```

何か微妙に違う・・！
反復処理を統一したい！ collectionへの反復処理のカプセル化、それが

Iterator パターン

```Java
public interface Iterator {
  boolean hasNext();
  Object next();
}
```

```java
public class HogeArrayListIterator implements Iterator {
  ArrayList<Hoge> hoges;
  int position = 0;
 
  public HogeArrayListIterator(ArrayList<Hoge> hoges) {
    this.hoges = hoges;
  }
 
  public Hoge next() {
    Hoge hoge = hoges.get(position);
    position++;
    return hoge;
  }
 
  public boolean hasNext() {
    if (position >= hoges.size()) {
      return false;
    }
    else {
      return true;
    }
  }
}

public class HogeArrayIterator implements Iterator {
  Hoge[] hoges;
  int position = 0;

  public HogeIterator(Hoge[] hoges) {
    this.hoges = hoges;
  }

  public Object next() {
    Hoge hoge = hoges[position];
    position++;
    return hoge;
  }

  public boolean nesNext() {
    if (position >= hoges.length) {
      return false;
    }
    else {
      return true;
    }
  }
}
```

つかいかた

```java
ArrayList hogeArrayList = getHogeArrayList();
Hoge[]    hoges         = getHogeArray();

Iterator hogeArrayListIterator = new HogeArrayListIterator(hogeArrayList);
Iterator hogeArrayIterator     = new HogeArrayIterator(hoges);

while (hogeArrayListIterator.hasNext()) {
  Hoge hoge = (Hoge)hogeArrayListIterator.next()
  // hoge への処理
}

while (hogeArrayIterator.hasNext()) {
  Hoge hoge = (Hoge)hogeArrayIterator.next()
  // hoge への処理
}
```

#### つまり、どういうこと？

内部のcollectionを公開することなく、各アイテムに順次アクセスする方法を提供する

#### どうしてこんなことをするの？

「HeadFirstデザインパターン」では、ArrayListと配列で内部にcollectionを保持している2つのオブジェクトにおいて、
両方ともcollectionの持ち方を変えずに同じように扱いたい、というような例が挙げられていた

#### Rubyではどうなるんや？

```ruby
class ArrayIterator
  def initialize(array)
    @array = array
    @index = 0
  end

  def has_next?
    @index < @array.length
  end

  def next_item
    value = @array[@index]
    @index += 1
    value
  end
end
```

```ruby
hoges = [1, 2, 3, 4]

while hoges.has_next?
  p hoges.next_item
end
# =>
# 1
# 2
# 3
# 4
```

#### ていうか、rubyでは99%こんな事はしない

**eachにブロックを渡すだけでいいのだから**

```ruby
hoges = [1, 2, 3, 4]

hoges.each do |hoge|
  p hoge
end
# =>
# 1
# 2
# 3
# 4
```
DockerコンテナからEC2へSSHポートフォワードしてRDSに接続する

# やりたいこと
ローカルのDockerコンテナから、AWSのEC2インスタンスへSSHポートフォワードで接続して、
RDSインスタンスで起動中のMySQLへ接続する。

# はじめに
- AWS上でEC2インスタンスへSSH接続する際の `pemファイル` をダウンロードしておく

# Docker環境の構築
- ダウンロードした `pemファイル` を 以下で作成する `Dockerfileと同じディレクトリ` に配置する
- まずは適当にDockerfileを作成する

```dockerfile
FROM ubuntu:18.04

RUN apt-get update -qq && apt-get install -y openssh-client mysql-client

ENV PEM_NAME 'ec2_test.pem'
ENV RDS_ENDPOINT 'hogehoge.fugafuga.ap-northeast-1.rds.amazonaws.com'
ENV EC2_USER 'ec2-user'
ENV EC2_HOST 'hogehoge.ap-northeast-1.compute.amazonaws.com'
ENV DATABASE_USER 'test-user'
ENV DATABASE_PASSWORD 'password'

COPY ${PEM_NAME} /tmp
COPY run.sh /tmp

CMD ["bash", "/tmp/run.sh"]
```
- CMD内に書くと長くなり可読性が下がる気がしたので、SSH接続用のShellを作成
    - 作成したShellも同様に `Dockerfileと同じディレクトリ` に配置

```run.sh
#!/bin/bash

ssh -4 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
-f -N -L 3307:${RDS_ENDPOINT}:3306 \
-i /tmp/${PEM_NAME} ${EC2_USER}@${EC2_HOST}

mysql -h 127.0.0.1 -u ${DATABASE_USER} -P 3307 -p${DATABASE_PASSWORD}
```

# Dockerイメージ作成と起動
- 以下コマンドでDockerイメージを作成

```console
docker build -t rds-test:0.1 .
```

- いよいよDocker起動

```console
docker run -it rds-test:0.1
```

これで `mysqlのコンソール` が起動すればOKです。
pythonの自作モジュールを含めたプログラムのロギングの制御について

# やりたいこと
- プログラムのロギングをしたい
- mainプログラムは自作のモジュールをインポートしている
- ロギングの対象は、自分が作ったmainプログラムとモジュール
- 引数などを活用して、ロギング対象に対するログをDEBUG、INFO、WARNINGなどのログレベルの制御をまとめて行いたい

調べたらすぐできるだろうと思ったが、思いのほか試行錯誤したのでメモ書き

# たどり着いた実装

以下、要点。

- mainでhandlerをセットし、出力制御を行う。
- 各モジュールでは、loggerからログを出力し、handlerで制御を行う。
- mainで、basicConfigによる設定を行うことで、読み込むモジュール全てのloggerを取り扱う。
- basicConfigでログレベル(level)を制御すると、importしている全てのモジュールのloggerに反映されるので、Filterを併用する。
- 自分がログ制御したいloggerのみ通すFilterを設定する。
 

```python:main.py
import logging
from mylib.test


class MyLoggerFilter(logging.Filter):
    def filter(self, record):
        return (record.name == __name__) or record.name.startswith('mylib')


logger = logging.getLogger(__name__)
handler = logging.StreamHandler()
handler.addFilter(MyLoggerFilter())
logging.basicConfig(
    handlers=[handler],
    level=logging.DEBUG)
```

```python:mylib.test.py
import logging
logger = logging.getLogger(__name__)
```

# 参考
- [pythonのロギングに関するメモ
](http://joemphilips.com/post/python_logging/)
- [loggingの使い方を模索する
](https://qiita.com/toriwasa/items/fa8371c3b98aa993a2fc)
- [pythonのlogger奮闘記 ～簡単な使い方から複数ファイルを跨る使い方まで～](https://qiita.com/mimitaro/items/9fa7e054d60290d13bfc)
AWS Organizationsで子アカウント作成→パスワードどうやって設定するの？ってなったのでメモ

https://qiita.com/ai-2723/items/d82d072debdbf6d15b34

> そう、Organizationsからアカウントを発行する場合パスワード設定箇所がどこにもありません。
> アカウントを取ることはできても、このままではログインすることができないので、上記の方法を使ってパスワードの設定が必要です。ご注意ください。

設定方法が分からず1時間くらいハマった。
まずAWSをログアウトしてルートアカウントログイン画面に移動する。
作成した子アカウントのメールアドレスを入力すると、

![スクリーンショット 2018-07-18 16.12.57.png](https://qiita-image-store.s3.amazonaws.com/0/176237/e91880a6-560b-9449-3a27-e026e3d16345.png)

このパスワード入力画面に遷移する。
テキストフィールド左上の `パスワードをお忘れですか？` から発行できる。
htmlの雛形

日本語用のhtmlの雛形を提示する。以前は、ブラウザの対応状況もあって細かいテクニックも必要だった。現在のブラウザでは、HTML5/jquery/utf8だけの対応で十分でろう。shift jisを振り回さないといけなかった頃が懐かしい。なお、この雛形は文法的な側面が強く、***デザインがされていない点***に留意してほしい。

- 2018/07/19 cssとjquery部分を加えた。
- 2018/07/20 webサイトからhtml(jquery CDN)ダウンロードできるようにした。

#webサイトからダウンロード
githubも考えたが、ファイルが細かすぎ管理が煩雑になるので、今回は専用のWebサイトを用意した。

|概要|url|
|:--|:--|
|html(jquery CDN) | https://00index.com/basefile/html.html|
|stylesheet | https://00index.com/basefile/style.css|

``` :curlを使う場合の例
curl https://00index.com/basefile/html.html > html.html
curl https://00index.com/basefile/style.css > style.css
```


#HTMLの例
##jquery CDNを使う

```html:html.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />
<link rel="stylesheet"  href="style.css">
<title>タイトル</title>
<script
  src="https://code.jquery.com/jquery-3.3.1.min.js"
  integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
  crossorigin="anonymous"></script>
</head>
<body>
<main>
<p>Hello World</p>
</main>
<script>
$(function(){
});
</script>
</body>
</html>
```

##jquery CDNを使わない

```html:html.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />
<link rel="stylesheet"  href="style.css">
<title>タイトル</title>
<script src="js/jquery-3.3.1.min.js"></script>
</head>
<body>
<main>
<p>Hello World</p>
</main>
<script>
$(function(){
});

</script>
</body>
</html>
```

##jqueryの入手方法

```
curl  https://code.jquery.com/jquery-3.3.1.min.js
```

#stylesheet(css)の例

上記HTMLの例ではスタイルシートを参照している。

```css:stylesheet.css
@charset "utf-8";
p { /* 段落の一文字目を字下げする */
       text-indent: 1em;
}
```

#######誤りやもっといい方法など、ご指摘ください。