OmniAICreator/Qiita-1.07M huggingface dataset:
Xcode8.3環境で特定のプロビジョニングファイルを消す

# はじめに
ユーザがProvisioningFileを意識しなくても済むように・・・ってアプリ設計をのポリシーを感じるXcode8.3

Accountsからは

- ダウンロードは全部まとめてのみ：`Download All Profiles`
- どのプロビジョニングファイルがあるかわからない

というようになりました。

![スクリーンショット-2017-04-30-7.12.09.png](https://qiita-image-store.s3.amazonaws.com/0/12362/b112ab34-f739-72a7-7749-656f0a05a780.png)

## ダウンロードしたProvisioning File

ダウンロードしたプロビジョニングファイルの置き場所をみるには
アプリをアーカイブして、書き出し時に表示されるリンクから辿れます


![スクリーンショット-2017-04-30-7.33.31.png](https://qiita-image-store.s3.amazonaws.com/0/12362/4a3177eb-ab52-f119-70ed-0043b99e68a1.png)

![スクリーンショット-2017-04-30-7.04.31.png](https://qiita-image-store.s3.amazonaws.com/0/12362/59322fd6-df04-6169-ff02-92a37dd8c207.png)

隠しリンクのように。
ユーザのホーム配下ライブラリ以下にあります。前のバージョンからパスは変わってませんが、知ってないとわからないです。
>~/Library/MobileDevice/Provisioning\ Profiles

## Provisioning FileのUUID

<img width="550" alt="スクリーンショット 2017-04-30 10.40.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/cdd08711-525a-e5fe-e456-06f3c96a0fe4.png">

autosigning がついている場合も
Build Settings > `Provisioning File(Deplicated)` で `Other...`を選択した場合に表示されます。
確認後は元の設定にもどせば問題ありませんでした。

![スクリーンショット-2017-04-30-10.21.25.png](https://qiita-image-store.s3.amazonaws.com/0/12362/3bb64ee5-211f-f023-357b-750aee32ab8f.png)

# 特定のプロビジョニングファイルを消す
## Xcode経由で削除
アーカイブ後に表示されるリンクか、FinderなどからUUIDを確認しながら消す方法が取れます。
## Terminal経由で削除
CIなどでプロビジョニングファイルを消す場合にTerminal経由で消したい場合に

実行する前に下記前提が満たされているか動作を確認してから実行します。

- 削除対象のプロビジョニングファイルのUUIDを取得
- `>~/Library/MobileDevice/Provisioning\ Profiles`から削除する

### OSXがSierraになってからsecurityコマンドでstderrorが出力
>security cms -D -i `hogehoge.mobileprovision` 2> /dev/null

OSXがSierraになってからsecurityコマンドでstderrorが出力されるようになっており
fastlaneでもissueになっていました。Sierraの場合はstderrorは捨てるようにしました。
https://github.com/fastlane/fastlane/issues/6387

Sierra以降はこの書き方だとstderrorが出力され
思ったような結果になりませんでした。
>security cms -D -i `hogehoge.mobileprovision`

結果次のコマンドでプロビジョニングファイルを削除しています。
>$ xmllint <(security cms -D -i `hogehoge.mobileprovision` 2> /dev/null) --xpath '/plist/dict/key[text()="UUID"]/following-sibling::string[position()=1]/text()' | xargs -I{} rm ~/Library/MobileDevice/Provisioning\ Profiles/{}.movileprovisioin

### 参考
http://qiita.com/mattak/items/dcb25ad7e12501d1525d
http://itpro.nikkeibp.co.jp/article/COLUMN/20140331/547143/

# さいごに
XcodeではプロビジョニングファイルをUUIDで管理することからは遠ざける改修がされていますのでCIで使うには
fastlaneを使う方が楽、という結論に行きがちなのですが、fastlaneの対応を待てない場合の対処としては押さえておいた方がよいかとおもいます。

:apple: はautosigningで技術者の難易度をさげた改修をしているようで、解決要素がみえにくい状況になっているに気づいているのかなと。CIにはまったく使いにくい改修なので、別ラインでCI対応も考えて欲しいと思っています。
ESP32でBluetoothイヤホンを作ってみた

![DSC_0039.JPG](https://qiita-image-store.s3.amazonaws.com/0/174906/8976a39d-a96a-4147-1a5d-074a5caefad8.jpeg)

ケータイなどからBluetoothを通じて無線で音楽を聴くことができます。今回は音の出力にVS1033搭載MP3デコーダボードを使いました。生の音声データであるPCMへのデコードはesp32側でやっているので音の出力はもっと安価なDAC (https://www.adafruit.com/product/3006 とか。インターフェースはSPIではなくI2Sですが) につなぐだけでも同じようにできると思います。

#準備
以下のものを使用しました。

- [ESP32-DevKitC] (http://akizukidenshi.com/catalog/g/gM-11819/) ESP32 1480円：秋月
- VS1033搭載MP3デコーダボード 2492円：Switch Science (販売終了)

#配線
ESP32とデコーダーボードを以下のように配線します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/174906/cc34c53d-2175-362f-e4f6-16020ec5c161.png)


# プログラム
プログラムは[esp32_BT_Speaker](https://github.com/MhageGH/esp32_BT_Speaker)になります。[esp-idf](https://github.com/espressif/esp-idf)の examples>bluetooth>a2dp_sink にVS1033へのSPI出力のコードを追加しただけです。これをesp-idfでESP32に書き込みます。

# ペアリングと再生
スマホなどからBluetoothデバイスをサーチするとESP_SPEAKERというのが出てきます。これとペアリングします。このままスマホで音楽を再生するとこのBluetoothイヤホンから音がなります。
[Docker編メモ]HTMLもWeb構築もわからない素人がPython+FlaskでWebサービスを作ってみる

これは、エンジニア未経験のど素人が、終末エンジニアとして
PythonとFlaskでWebアプリを作成するためのメモ記事です。

[ランディングページ](http://qiita.com/yuusei/items/0c202309743214fdce2f)
[Flask](http://qiita.com/yuusei/items/15f38a6abd431d093d2e)
[Docker] このページ
	[Dockerコマンド](http://qiita.com/yuusei/items/640c85da1a1bf43fe72f)
[Web開発](http://qiita.com/yuusei/items/cf738b0849fc932a64e6)

このページはDocker編のメインページであり、
Dockerの基礎知識と、Docker開発に必要な環境に絞って記載します。
細かいコマンドや、[FlaskのTutorialアプリ](https://flask-docs-ja.readthedocs.io/en/latest/tutorial/)のDockerコンテナ内での再現については別途作成予定です。

[flaskrをDockerコンテナ内に再現してみた] Coming Soon…


#Dockerとは何か？
2017年1月とちょっと古い記事になるんですが、[@itの記事](http://www.atmarkit.co.jp/ait/articles/1701/30/news037.html)をかいつまみます。

・Dockerは仮想化のためのツールである(※仮想化とは、一つのPC上で複数のOSを操作できる様にすること。[OracleのVirtualBox](https://www.virtualbox.org)とか)
・Dockerの仮想化は「コンテナ管理型」と呼ばれ「ハイパーバイザー型」や「ホスト型」に対して軽量なのが特徴である
・DockerはDockerイメージと呼ばれる概念でアプリケーション開発に必要な環境とアプリ自身をパッケージ化しユーザー間で共有できる
・Linuxに付属のコンテナ管理機能に加えAPIを使って全世界の開発者同士の成果物を渡し合える

つまり、Dockerは「OSと切り離し、開発環境とアプリだけをパッケージ化する事により、開発者と管理者に負担が大きい従来の開発プロセスを簡易化し、高速化した」と言う事になるんだと思います。

従来の仮想化ツールが

1)OS(ホスト)上にもう一つOS(ゲスト)を作る
2)ゲストOS上に開発環境を築く
3)ゲストOS上の開発環境上でアプリケーションを作成する

と言うステップを踏んでいたのに対し、Dockerは

1)OS(ホスト)上に仮想化された開発環境を築く
2)開発環境上でアプリケーションを作成する

と言うステップらしく「OSと開発環境を切り離し、開発環境だけ仮想化する事で」軽量な仮想化環境を実現しているようです。

言い方を変えると、従来の仮想化の思想が”PC上にもう一つPCを作る(=2つのOS)”なのに対し、Dockerは”OSは一つ。開発環境は2つ”となっており~~それはもはや従来の定義における仮想化とは言えない気がするけども~~従来の重い仮想化に対し、軽妙な仮想化を提供できるようになったわけです。

このような「コンテナ管理型」のシステムを実現するために、DockerはLinuxに依存しています。
ですが、WindowsOSユーザーが使えないと言うわけではなく、Winユーザー向けにも[Docker for Windowsが2016年7月に正式リリースされ、ハードルが下がりました](http://www.publickey1.jp/blog/16/docker_for_macwindows_1.html)。

ちなみに、LaptopはMacBookを、DeskTopはLenovoを使っている自分はDocker for Windowsを知らずに、Docker Composeを未だに使っていました。この機会にDocker for Windowsに切り替えようかしら・・・


#Dockerのインストールおよび必要なDocumentsについて
インストールは英語の公式サイトから。

[Docker for Ubuntu](https://www.docker.com/docker-ubuntu)
[Docker for Mac](https://www.docker.com/docker-mac)
[Docker for Windows](https://www.docker.com/docker-windows)

[英語の公式サイト](https://www.docker.com)
[Docker ドキュメント日本語化プロジェクト](http://docs.docker.jp/index.html)

続きは後日更新予定
Linuxコマンドの使い方をブラウザで確認するコマンドを作った

Linuxコマンドの使い方を調べるときに、manコマンドの説明を見ても分かりにくいと感じて、ブラウザで調べることが多々あって面倒だなと感じていました。
そこで、コマンドの説明が書かれたページをブラウザで表示するためのコマンド`bman`を作成しました。

github: [t-yng/bman](https://github.com/t-yng/bman)

![bman_usge.gif](https://qiita-image-store.s3.amazonaws.com/0/54838/53ac2f42-1c3d-7752-35f9-2788d0ddedc4.gif)

## 使い方
### インストール方法
リポジトリをローカルにクローンして、`install.sh`を実行してください。

```shell-session
$ git clone https://github.com/t-yng/bman && cd bman
$ sh ./install.sh
```

`/usr/local/bin/`にシンボリックリンクが作成されます。
シンボリックリンクの作成場所は、環境に応じて`instal.sh`の中身を書き換えて、適宜変更してください。

※ スクリプトはRubyで書かれているので、**Rubyの実行環境が必要**になります。

### マニュアルの表示
マニュアルページを表示したいコマンドを引数に渡すだけです。

```shell-session
$ bman ls
```
### マニュアルの更新
新しいコマンドの追加や表示するマニュアルページの更新は`--config`オプションで実行できます。
コマンドと対応するマニュアルページを入力することで、新しくコマンドとマニュアルページを追加できます。

もし既存のコマンドを指定した場合は、表示するマニュアルページを更新されます。

```shell-session
$ bman --config
add or update manual
command: awk
url of manual: https://hydrocul.github.io/wiki/commands/awk.html
```

コマンドとマニュアルページの一覧は`manual.json`に記述されているので、エディタでファイルを直接開いて、修正することも出来ます。

```manual.json
{
	"manual": [
		{
			"command": "&",
			"url": "http://itpro.nikkeibp.co.jp//article/COLUMN/20060224/230589/"
		},
		{
			"command": "&&",
			"url": "http://itpro.nikkeibp.co.jp//article/COLUMN/20060224/230604/"
		},

		...
```
fit failure summary on nodes : Insufficient cpu (1)

```bash:jobをうごかしたく
$ kubectl create -f <Deploy.yml>
```

上のようにカジュアルに、k8s の jos を使おうとおもったら、うまくうごかず。

```bash:pod詳細を見る
$ kubectl describe pod <POD>
```

で、pod の状態をしらべてみると、下記の失敗がでていた。

```bash
fit failure summary on nodes : Insufficient cpu (1)
```

よくわからなかったのですが、cpu が不十分で、pod が作られていないようでした。

クラスタの node 数を確認したら 1　となっていたので、とりあえず、2 に増やしたら無事動くようになりました。

```bash:resize
$ gcloud container clusters resize <CLUSTER-NAME> --size=2
```
Ref. http://qiita.com/mochizukikotaro/items/078a919f873a0f153ae9

失敗時の表示テキストがわかりやすいと本当に嬉しい気持ちになります。
RedShiftのシステム構成

データウェアハウスに関する基本的な内容をまとめてみたものです。データウェアハウスに関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[RedShiftのシステム構成] (https://www.techcrowd.jp/redshift/designpattern-2/)

# [awscli syncパターン] (https://www.techcrowd.jp/redshift/designpattern-2/)

EC2からS3へデータをアップロードし、S3上からRedShiftへデータをロードします。
Amazon Redsihftへデータをロードする方法として、最も一般的です。

メリット
・ローカルディレクトリとS3の内容を同期させることができる
・AWSコマンドラインインターフェイスが実行できる場合は、プラットフォームに依存しない
・後の処理を実行するタイミングを容易に調節できる

デメリット
・ローカルサーバーが複数の場合は、システム構成が複雑になる
・障害対策を独自で実装しなくてはならない


# [fluentd・S3中継パターン] (https://www.techcrowd.jp/redshift/designpattern-2/)

ログ収集ツールfluentdを使って、S3上からRedShiftへデータをロードする。

メリット
・プラグインを用意すれば、簡単に使用できる
・複数のサーバーを使用する場合でも、容易にシステムの構築・運用できる
・S3上のディレクトリの整理も可能となる

デメリット
・fluentdの使用方法に注意する必要がある
・S3のディレクトリ構造次第で、問題が発生する可能性がある
・RedShiftへのデータのロード方法を別途用意しなくてはならない


# [fluentd・ダイレクトパターン] (https://www.techcrowd.jp/redshift/designpattern-2/)

fluentdを使って、手軽にデータをRedShiftにロードする。
fluentd・S3中継パターンと同じような構成であるが、一括処理でRedShiftにデータをロードするために、あまりS3を意識することがない。

メリット
・簡単にRedShiftへデータを投入することができる
・プラグインを用意すれば、簡単に使用できる

デメリット
・設定によってはロードが多発して、パフォーマンスが低下することもある
RedShiftのテーブル設計のポイント

データウェアハウスに関する基本的な内容をまとめてみたものです。データウェアハウスに関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[RedShiftのテーブル設計のポイント] (https://www.techcrowd.jp/redshift/tabledesign/)

# [ディスクIOを最小にする] (https://www.techcrowd.jp/redshift/tabledesign/)

RedShiftでパフォーマンスをあげるためは、ディスクIOを最小にする必要があります。

使用するデータに対して、不必要な型を使うと無駄にディスクにアクセスしてしまいます。
RedShiftでは、
・マルチバイト文字
・数値型
・文字型
・日時型
・ブール型
など多数の型が用意されていますので適切な型を使用すると共に、データの桁数についても注意しなくてはなりません。
使用するデータのバイト数も調べておいて、できるだけ効率的にデータを格納すれば、ディスクIOを少なくすることができます。


# [ネットワーク転送を最小にする] (https://www.techcrowd.jp/redshift/tabledesign/)

ネットワークの転送量を小さくすることも、RedShiftでパフォーマンスをあげるのに効果的です。
RedShiftでは列ごとに圧縮方式を指定できますので、データの内容に合った圧縮方式を選べます。

テーブルを作成する時に手動で圧縮方式を選ぶこともできますが、COPYコマンドを行うとRedShiftが自動的にデータの内容を解析して、適切な圧縮方式を適用します。
データを圧縮することでネットワークの転送量が少なくなって、RedShiftのパフォーマンスが向上します。
RedShiftの導入手順

データウェアハウスに関する基本的な内容をまとめてみたものです。データウェアハウスに関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[RedShiftの導入手順] (https://www.techcrowd.jp/redshift/steps/)

# [Amazon Redshiftクラスタの立ち上げ] (https://www.techcrowd.jp/redshift/steps/)

Amazon Redshiftを利用するには、まずRedshiftのメニューを開いてクラスターを立ち上げます。

表示されるメニューに従って、
・クラスタ識別子
・DB名
・DB接続ポート
・マスターユーザー名
・パスワード
をなど設定します。

そして、ノード設定においてクラスタ内のノードの設定などを行うと、クラスターが作成されて起動されます。

クラスターを起動しましたら、クライアントからのアクセスの認可に関する設定を行います。


# [クラスタへの接続] (https://www.techcrowd.jp/redshift/steps/)

クラスタへの接続は、PostgreSQLと互換性のあるSQLクライアントで行います。

作成したクラスタの情報をSQLクライアントの接続情報に設定すれば接続できる状態となります。

クラスタ固有の接続文字列については、Amazon Redshift管理コンソールのクラスタページで調べることができます。


# [テーブル作成] (https://www.techcrowd.jp/redshift/steps/)

クラスターに接続できるようになれば、データベースの操作することが可能です。
最初に、CREATE TABLE文を使ってテーブルを作成することになりますが、パフォーマンス向上のために、データの内容に応じてdist_keyやsort_keyを使う必要があります。


# [データのアップロード、クエリ] (https://www.techcrowd.jp/redshift/steps/)

Amazon S3からデータをコピーすることで、作成したテーブルにデータをアップロードでできます。
RedShiftのコピーコマンドは、データの内容を分析して最適な圧縮方式を選んでくれますので、パフォーマンスの向上が望めます。

アップロードしたテーブル上のデータに対しては、クエリを実行してさまざまな操作ができます。
RedShift 豊富な圧縮エンコード

データウェアハウスに関する基本的な内容をまとめてみたものです。データウェアハウスに関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[豊富な圧縮コード] (https://www.techcrowd.jp/redshift/compressed/)

# [圧縮率をあげることがパフォーマンスの向上につながる] (https://www.techcrowd.jp/redshift/compressed/)

圧縮は、データのサイズを小さくする処理です。
圧縮率をあげることでデータを格納するスペースが少なくなり、ストレージからの転送量が減少するので、パフォーマンスが向上します。

特にビッグデータを扱うAmazon Redshiftでは、わずかな時間に積み重ねが重要です。
Amazon Redshiftがデフォルトの状態では、データを圧縮しないraw形式でデータが格納されますので、パフォーマンスを向上させるために圧縮方式を手動で設定するか、COPYコマンドによって自動的に圧縮方式を適用させなくてはなりません。


# [列ごとに圧縮エンコードを選択することも可能] (https://www.techcrowd.jp/redshift/compressed/)

Amazon RedShiftでは、以下の圧縮方式がサポートされています。

・raw エンコード
・バイトディクショナリエンコード
・デルタエンコード
・LZO エンコード
・Mostly エンコード
・ランレングスエンコード
・text255とtext32k エンコード

手動で圧縮方式を指定する場合は、CREATE TABLE ステートメントを用います。
既に作成されている列に対して圧縮方式を変更することはできませんが、追加する列に対して圧縮方式を設定することは可能です。
XCodeでサブディレクトリに配置したファイルが読み込めない場合の対処メモ

## やりたいこと

サーバーサイドの環境が、開発環境、ステージング環境、本番環境など複数用意されている。
アプリ側から見た接続先が複数に分かれるので、ソースコードにべた書きするのではなく property list に外だしして、動的に読み分けたい。

こんな感じで property listを用意して
<img width="237" alt="NPUrl_swift.png" src="https://qiita-image-store.s3.amazonaws.com/0/20160/5f51a135-a6b3-e2ed-1917-e700e5305266.png">

こんな感じで読み込みが行われる。

```swift
let path = bundle.path(forResource: "dev1",
                       ofType:"plist",
                       inDirectory:"Properties")
let dict = NSDictionary.init(contentsOfFile: path!)!
```

## はまったこと

上記の `path` が `nil` になってしまう。

## 原因と対処方法

プロジェクトに各ファイルは追加されていたが、ディレクトリが追加されていないので読み込みに失敗していた。

1. まず、プロジェクト内の好きな位置にディレクトリを **Finderで** 作成する
2. 左ペインから `Add files to プロジェクト名` を選択し、**ディレクトリ** を追加する
3. 読み込まれたディレクトリに、好きな property list を追加する

XCodeの左ペインには通常 **黄色い** ディレクトリが表示されますが、上記手順で追加すると **青い** ディレクトリになります（上記キャプチャは正しい手順で登録した状態なので青い）。 `inDirectory` は青いディレクトリしか読み込まれない、というのが今回の原因でした。
3コマンドでMastodon


- 今話題のmastdonがどんなものか試したい皆様、少なくともmacだったら3回コマンドを打てばローカル環境で試せますよ！
- 諸々の開発系コマンドが入ってることが前提ですが…（笑）

## 1コマンド目!

- githubからmastdonをダウンロードします。Desktopでもどこでもいいです。

```sh
sh-3.2$ git clone https://github.com/tootsuite/mastodon.git
```

## 2コマンド目!!

- ディレクトリを移動します。

```sh
sh-3.2$ cd mastodon/
```

## 3コマンド目!!!

- 起動します！もろもろインストールが始まりますのでしばしおまちください。

```sh
sh-3.2$ vagrant up
```

## 安心してください！Mastdon動いてますよ！

- ブラウザで localhost:3000 を開いてみましょう。

![open.png](https://qiita-image-store.s3.amazonaws.com/0/51116/67907a84-2ed6-b48c-519c-af2648eb9cf6.png "open.png")

## いろいろ使うには…

- git cloneしたmastdonディレクトリに.env.production.sampleというのがあります。
- これを.env.productionという名前でコピーしていろいろ設定してください。
- これにはもうちょっとコマンドを叩く必要がありますが…
pip3によるパッケージのインストール

pip3でpythonのパッケージをインストールしたのですが、インポートしてもモジュールが使えないのですが、pipでインストールしたディレクトリまで行ってそこでプログラムを実行しないとインポートできないのでしょうか？　そうなるとかなり面倒な気がするのですがいかがでしょうか？　非常に初歩的な質問で申し訳ないのですが教えてください！
良い設計にはしっかりとした分析が大事

# はじめに

ソフトウェア開発では、設計が重んじられる傾向がないだろうか。

私も設計が大事だということは理解しており、「エリック・エヴァンスのドメイン駆動設計」などの書籍を元に、設計手法について勉強してきた。

しかし設計という行為は **ある問題に対する解決策を導く作業** であることから、良い設計をするためには **ソフトウェアで扱う問題を明確にする作業** が欠かせないと最近では思っている。そしてこの問題を明確にする行為は **分析** と呼ばれる。

この記事では、分析が大事な理由、分析とは何をする行為なのかについて、私が学習した内容をまとめる。

# 分析が大事な理由

分析が大事なのは **分析なしでは設計ができないから** である。

先ほど述べた通り設計とは分析で明らかになった問題に対する解決策を導く行為である。したがって **分析で明らかにできなかった問題に対しては設計作業をすることができない** ことになる。

例えば[図書館の本貸出サービス](http://lab.aratana.jp/entry/2015/07/03/085553)では、以下のようなケースがあることに気づく必要がある。

- 返却を2週間延滞した利用者が貸出予約していた図書が貸出可能になったケース

上記ケースへのアクションとしては「返却を延滞した利用者は延滞した時点で貸出予約を取り消される」や「返却を延滞した場合でも貸出予約は1週間は有効である」などが考えられるが、どの仕様になるかは図書館の業務に依る。

上記ケースに気づけず、実装が仕様と一致していなかった場合不具合となる。そして不具合修正には以下のような問題がある。

- 設計が腐敗する
不具合を発見した工程にも依るだろうが、特にSST(System Simulation Test)以降に発見された不具合の場合、「他の処理に影響が出ない修正案を採用する」傾向が強くなる。この場合一から設計をやり直すことはなく、既存の設計構造の中に不具合を修正するためのその場しのぎのコードが実装されることになり、 **当初あった設計意図が失われる** ことになる。

- 信用を失う
上記のような簡単なケースについて考慮が足らなかった場合、または難しいケースだったとしても考慮漏れが頻発した場合、その人（最悪のケースでは企業）への信頼は失われる。また、不具合を出した人は再発防止活動など、本来の開発業務とは関係のない作業をさせられる羽目になる。

# 何すれば良いの

まずは **業務を学ぶ** 必要がある。開発者が業務を学ぶと言うと「えっ？」と思う人も多いようだが、ソフトウェアで扱う問題はユーザの業務から生じたものであることから、問題を明確にするために業務を学ぶことは欠かせない。先に挙げた問題（返却を2週間延滞した利用者が貸出予約した図書が貸出可能になったケース）もシステム化対象の図書館の業務について知っていれば問題にはならない。

次に **業務を知っている人と会話をするための言葉を学ぶ** 必要がある。英語ができない人が洋書を読んでも内容を理解できないように、業務で使用する言葉を知らない人が業務を理解することはできない。例えば先の例では「図書は書籍と雑誌に分かれる」とあるが、「書籍」と「雑誌」の定義や違いを曖昧なままにして業務を正しく理解できるはずがない。

業務について学ぼうとすると、業務に詳しい人が身近にいないという問題が発生する。そんな場合は他の教材を探すしかない。例えば「利用規約」は業務知識が詰まった良い教材だと思う。

最後に **モデルを検証する** 。具体的には「モデルの言葉で問題領域について話すことができるか」を検証する。個人的な経験ではこのプロセスを軽視、または実施しない人が多いと思う。その結果実装段階になって、 **その場しのぎで** モデルを変更することになる。こうなると当初あった設計意図が失われ、ソフトウェアが必要以上に複雑化する。

# 最後に

良い設計をするためには、業務知識を反映させたモデルを作成する必要があることを述べた。このモデルは曖昧さがなく、開発に関わる全ての人が共通認識できる概念のみで構成する必要がある。

# 参考資料

- [エリック・エヴァンスのドメイン駆動設計](https://www.amazon.co.jp/%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF%E3%83%BB%E3%82%A8%E3%83%B4%E3%82%A1%E3%83%B3%E3%82%B9%E3%81%AE%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88-Architects%E2%80%99Archive-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E3%81%AE%E5%AE%9F%E8%B7%B5-%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF%E3%83%BB%E3%82%A8%E3%83%B4%E3%82%A1%E3%83%B3%E3%82%B9/dp/4798121967/ref=sr_1_1?ie=UTF8&qid=1471096153&sr=8-1&keywords=%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88)

- [実践ドメイン駆動設計](https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88-Object-Oriented-SELECTION-%E3%83%B4%E3%82%A1%E3%83%BC%E3%83%B3-%E3%83%B4%E3%82%A1%E3%83%BC%E3%83%8E%E3%83%B3/dp/479813161X/ref=tmm_other_meta_binding_swatch_0?_encoding=UTF8&qid=1493377908&sr=8-2)

- [花束問題をDDDで考える](http://sssslide.com/speakerdeck.com/hidenorigoto/hua-shu-wen-ti-woddddekao-eru)
jenkinsでブランチを選択してチェックアウト


git cloneした後、リモートブランチ一覧から選択してチェックアウトするようにした際のjenkinsファイルの一部を抜粋しました。

```text
stage 'Git clone'
	git credentialsId: "${env.GIT_ID}", url: "${env.GIT_SERVICE_URL}"

stage 'CheckOut Branch'
	def branchlist = (sh(script: 'git branch -r', returnStdout: true)).replaceAll(/(.*?)origin\//,"")
	def selectedbranch = input id: 'selectbranch',
		  message: 'selectbranch',
		  ok: 'Okay',
		  parameters: [
		  [ 
			$class: 'ChoiceParameterDefinition', choices: branchlist, 
			name: 'Take your pick',
			description: 'A select box option'
		  ]
	]  
	sh(script: "git checkout ${selectedbranch}", returnStdout: true)
```

*    env.GIT_IDはjenkis側でもっているGIT-ID
*    env.GIT_SERVICE_URLは環境変数で設定しているGITのURL
RedShift 複数ノードで構成されるクラスタ

データウェアハウスに関する基本的な内容をまとめてみたものです。データウェアハウスに関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[複数ノードで構成されるクラスタ] (https://www.techcrowd.jp/redshift/nodes/)

# [リーダーノードとコンピュートノードで構成されるクラスター] (https://www.techcrowd.jp/redshift/nodes/)

Amazon Redshiftクラスターは、リーダーノードとコンピューティングノードから構成されます。

リーダーノードはクライアントから受け取ったクエリを解析して、実行計画を作ります。
作成した計画を実行するためにコンピューティングノードのスケジュールを管理し、実行結果をクライアントに返すのがリーダーノードの役割です。

コンピューティングノードはリーダーノードが作成した実行計画に従って、クエリの処理を行います。
実行結果はリーダーノードに送信し、クライアントと直接連絡することはありません。


# [ノードは専用のOS・メモリ・ストレージを持っている] (https://www.techcrowd.jp/redshift/nodes/)

クラスターを構成するノードは、それぞれ専用のOS・メモリ・ディスクストレージが割り当てられます。ノードでは複数のプロセスが動作していますが、稼動しているプロセスの数はCPUコア数と同じです。

コンピューティングノードに割り当てられたディスクストレージは、複数のスライスに分割されて使用され、具体的なスライスの数はクラスターのノードサイズに応じて決まります。


# [ノードタイプ] (https://www.techcrowd.jp/redshift/nodes/)

各ノードで使用するCPU・メモリ・ストレージ容量などは、ノードタイプによって決まります。

ノードタイプは
・パフォーマンスへの負荷が高いワークロード用のSSD（ソリッドステートストレージ）ベースのDC
・大容量データ用のHDDベースのDS
の2種類です。
RedShiftの特徴が生きる用途

データウェアハウスに関する基本的な内容をまとめてみたものです。データウェアハウスに関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[RedShiftの特徴が生きる用途] (https://www.techcrowd.jp/redshift/usage/)

# [RedShiftの特徴が生きる用途・生きない用途] (https://www.techcrowd.jp/redshift/usage/)

Amazon Redshift は、高速・高機能のフルマネージド型のデータウェアハウスサービスです。
大規模なデータを処理するのが得意ですが、少量のデータを扱ったり度々データを更新する作業には向いていません。

RedShiftの特徴が生きる用途
・扱うデータセットが数百GB以上の場合
・複雑なSQLを使用するが、同時に実行するSQLの数が少ない
・データの更新を度々行わず、一括で導入する
・これらのことから、RedShiftはデータウェアハウスとして使うのが最適

RedShiftの特徴が生きない用途
・データ量が少ない
・SQLを同時に複数動作させる場合
・データを更新する頻度が多い
・RedShiftに向かない作業については、Amazon DynamoDB・Amazon ElastiCache・一般的なリレーショナルデータベースの使用が適している


# [AWSの各種サービスの中でのRedShiftの位置付け] (https://www.techcrowd.jp/redshift/usage/)

AWSには、特徴のある4つのデータ・ストアが提供されています。
4つのデータ・ストアは、SQLとNoSQLに分類できます。

### SQL
Amazon RedShift
・大量のデータの集計と分析を高速で行うデータウェアハウスです
・BIツールなどを使って企業活動のための分析などに使われます

Amazon RDS
・クラウド上のリレーショナルデータベースが必要な時に、便利に使えるデータベースです
・MySQL・PostgreSQL・Oracle・MS SQL Serverから選択できます

### NoSQL

Amazon DynamoDB
・大規模なデータを処理する場合でも、レイテンシンを低く抑えられるKVSです
・複雑な処理をするは得意でありませんが、大量のデータを処理するのに向いています

Amazon ElastiCache
・完全マネージド型のメモリキャッシュです
・WEBアプリケーションを高速で動かしたい時に使います
hhvmをソースからインストールする方法


hhvm2.4.0をCentOS6にインストールした際の作業記録をまとめました。

### 環境
---

*    CentOS６
*    gcc4.7

##### 関連モジュールのインストール
```text
yum --enablerepo=epel install -y openldap-devel memcached cmake mysql-devel pcre-devel gd-devel libicu-devel bzip2-devel oniguruma-devel readline-devel libc-client-devel libcap-devel pam-devel elfutils-libelf-devel libxslt-devel libevent-devel libmcrypt-devel libdwarf-devel ncurses-devel
```
##### boostのインストール
```text
wget http://sourceforge.net/projects/boost/files/boost/1.55.0/boost_1_55_0.tar.gz/download -O boost_1_55_0.tar.gz
tar xzvf boost_1_55_0.tar.gz
cd boost_1_55_0
./bootstrap.sh -libdir=/usr/lib64 --includedir=/usr/local/include
./b2
./b2 install
ldconfig
```
##### curlのインストール
```
git clone git://github.com/bagder/curl.git
cd curl
./buildconf
./configure --prefix=/usr/local --libdir=/usr/lib64
make -j8 2>&1 | tee make.log
make install
ldconfig
```
##### glogのインストール
```
cd /usr/local/src/
git clone https://github.com/google/glog
cd glog/
autoreconf --force --install 
./configure --prefix=/usr/local --libdir=/usr/lib64
make -j8 2>&1 | tee make.log
make install
ldconfig
```
##### libmemcachedのインストール
```
cd /usr/local/src/
wget http://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
tar xzvf libmemcached-1.0.18.tar.gz
cd libmemcached-1.0.18
./configure --prefix=/usr/local --libdir=/usr/lib64
make -j8 2>&1 | tee make.log
make install
ldconfig
```
##### jemallocのインストール
```
cd /usr/local/src/
wget http://www.canonware.com/download/jemalloc/jemalloc-3.5.1.tar.bz2
tar xjvf jemalloc-3.5.1.tar.bz2
cd jemalloc-3.5.1
./configure
make -j8 2>&1 | tee make.log
make install
ldconfig
```
##### tbbのインストール
```
cd /usr/local/src/
wget https://www.threadingbuildingblocks.org/sites/default/files/software_releases/linux/tbb2017_20161004oss_lin_0.tgz
tar -xzf tbb2017_20161004oss_lin_0.tgz
cd tbb2017_20161004oss
mkdir -p /usr/include/serial
cp -a include/serial/* /usr/include/serial/
mkdir -p /usr/include/tbb
cp -a include/tbb/* /usr/include/tbb/
cp ./lib/intel64/gcc4.4/libtbb.so.2 /usr/lib64/
ln -s /usr/lib64/libtbb.so.2 /usr/lib64/libtbb.so
# ldconfig
```
##### hhvmのインストール
```
export CMAKE_PREFIX_PATH=/usr/local
git clone git://github.com/facebook/hhvm.git		
cd hhvm
git checkout HHVM-2.4.0
git submodule update --init --recursive
cmake .
make -j8 2>&1 | tee make.log
cp hphp/hhvm/hhvm /usr/bin/
```
```
# hhvm --version
HipHop VM 2.4.0 (rel)
Compiler: tags/HHVM-2.4.0-0-gc82fcd8e6199c500454b1a8b930a876ef2c1522b
Repo schema: a536a1d1567b1fb5d722c0349a3296d4e8589f96
```
RedShift 線形スケールを可能にしたMPPな仕組み

データウェアハウスに関する基本的な内容をまとめてみたものです。データウェアハウスに関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[線形スケールを可能にしたMPPな仕組み] (https://www.techcrowd.jp/redshift/mpp/)

# [並列分散で処理を行う単位:ノードスライス] (https://www.techcrowd.jp/redshift/mpp/)

Redshiftは一つのノードでCPUのコアと同じ数のプロセスが動作していますので、Redshiftの分散処理はノード単位ではなくノードスライス単位となります。
各ノードスライスは専用のCPUコア・メモリ・ディスクを使って、独立して動作しています。

このように独立性が高いノードにデータとクエリの負荷を分散できるので、MPP(Massively Parallel Processing)が可能となり、線形スケールを実現することができました。


# [クラスターの作成に使用できるノード] (https://www.techcrowd.jp/redshift/mpp/)

クラスターの作成に使用できるノードタイプは、Dense Storage(DS)ノードとDense Compute(DC)ノードの2種類です。

・Dense Storageノード
ハードディスクドライブHDD）が使用されているノードで、大規模なデータウェアハウスを低コストで作成できます

・Dense Computeノード
高速CPU・大容量RAM・SSD（Solid-State Disk）で構成されたノードで、高パフォーマンスのデータウェアハウスが作成できます


# [データの分散方式] (https://www.techcrowd.jp/redshift/mpp/)

データを分散する方法として、均等分散・KEY分散・ALL分散のいずれかが選択できます。

・均等分散
ラウンドロビン方式によって、複数のスライス間に均等にデータが分散されます。
均等分散はデフォルトの分散方式で、分散方式をしない場合は均等分散が採用されます。

・KEY分散
特定のカラムを分散キーにして、各ノードスライスにデータが分散されます。
分散キーとなったカラムの値によってデータが分散されますので、同じ値を持つデータは同じノードスライスに配分されます。

・ALL分散
テーブルの内容全てを、各ノードに分散する方法です。
各ノードが大量のデータを持つことになるので、データの更新・挿入などをするのに時間がかかります。
そのため、頻繁にデータを更新する作業には向いていません。
Amazon RedShiftの特徴

データウェアハウスに関する基本的な内容をまとめてみたものです。データウェアハウスに関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[Amazon RedShiftの特徴] (https://www.techcrowd.jp/redshift/feature/)

# [カラムナーデータベースとMPP] (https://www.techcrowd.jp/redshift/feature/)

RedShiftの特徴として、カラムナーデータベースとMPPがあげられます。

### カラムナーデータベース
大規模なデータを扱うデータウェアハウスは、カラムごとの処理を行うカラムナーデータベースが有効です。

・カラムナーデータベースはある特定のカラムだけ操作できるので、集計処理などを高速で行うことができます
・同一のカラムの内容は、同じデータが繰り返して使われることが多いので、圧縮効率が良くなるために記憶領域を有効に使えます

 

### MPP(Massively Parallel Processing)

RedShiftはMPPによって、リソースを共有せずに線形スケールを可能とするシェアード・ナッシングを実現しています。
そのため、インスタンスを追加することでデータの容量を増やすだけではなく、処理能力も向上させることも可能です。
大量のデータを扱うデータウェアハウスは、このような機能を持つことが不可欠となっています。


# [高度な圧縮機能] (https://www.techcrowd.jp/redshift/feature/)

Amazon Redshiftには、Byte dictionary・Delta・Mostlynなどの高度な圧縮方法が複数用意されています。
圧縮効率はデータの内容によって効率が左右されるために、どの圧縮方法を選択するのが良いのか分からない場合もありますが、Redshiftはデータの内容を解析して最適な圧縮方法を採用する機能を持っています。
そのため、データに適していない圧縮を行って、メモリを無駄に使うことがありません。


# [圧倒的に安価] (https://www.techcrowd.jp/redshift/feature/)

一般的なデータウェアハウスを購入する場合よりも、Amazon Redshiftを利用することで年間の費用を1/10～1/1000にすることも可能です。
しかも、機能的には一般的なデータウェアハウスとほとんど変わりませんので、クラウド環境でデータウェアハウスを利用する場合は、Amazon Redshiftが最もコストパフォーマンスの良い選択肢の一つとなります。


# [クラウド上のデータウェアハウスなので手軽に使える] (https://www.techcrowd.jp/redshift/feature/)

Amazon RedShiftはクラウド上のデータウェアハウスなので、AWSマネジメントコンソールを数回クリックするか、プログラムからAPIを呼び出すだけで簡単に使うことができます。
システムのことは、ほとんどAmazon RedShiftが自動的に管理してくれますので、データウェアハウスのためにエンジニアを雇用する必要もありません。
Amazon RedShiftは手軽に使えて、コストも削減できるデータウェアハウスです。
Tomcat basic認証で特定のIPアドレスをバイパスする


TomcatでBasic認証してさせているとき、特定のIPアドレスだけバイパスする方法が
下記に記載されてました。
http://stackoverflow.com/questions/7631974/tomcat-bypass-basic-authentication-for-specified-ip-address

ただ、この方法では１つのIPしか対応してないので、下記のように少し変更して複数のIPに対応できるようにしました。

```java:AutoLoginValve.java
package remoteuservalve; 
import java.io.IOException;
import java.security.Principal;
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;

import javax.servlet.ServletException;

import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.realm.GenericPrincipal;
import org.apache.catalina.valves.ValveBase;

public class AutoLoginValve extends ValveBase {

    private String trustedIpAddress;
    public AutoLoginValve() {
    }

    @Override
    public void invoke(final Request request, final Response response) 
             throws IOException, ServletException {
        final String remoteAddr = request.getRemoteAddr();
		String[] trustedIpAddressArray=trustedIpAddress.split(",");
		List<String> trustedIpAddressList = Arrays.asList(trustedIpAddressArray);
        final boolean isTrustedIp = trustedIpAddressList.contains(remoteAddr);
        if (isTrustedIp) {
            final String username = "myTrusedUser";
            final String credentials = "credentials";
            final List<String> roles = new ArrayList<String>();
            roles.add("user");
            roles.add("admin");

            final Principal principal = new GenericPrincipal(username, 
                credentials, roles);
            request.setUserPrincipal(principal);
        }

        getNext().invoke(request, response);
    }

    public void setTrustedIpAddress(final String trustedIpAddress) {
        this.trustedIpAddress = trustedIpAddress;
    }
}
```

server.xmlでは下記のようにカンマ区切りします。
```text：server.xml
<Valve className="remoteuservalve.AutoLoginValve" trustedIpAddress="192.168.1.10,192.168.1.11" />
```
ＲＡＤツールを作りたいから矢印から作ったよ

RADツールが作りたくなって、まずは、矢印のコンポーネントを作成をした。
Githubで公開中。
https://github.com/NNNIC/Yajirushi

# 概要

７種類の矢印を描画するUnity用コンポーネント

![](
https://raw.githubusercontent.com/NNNIC/wiki_depot/master/yajirushi/alltypes.png)

# 使い方

## 1. 矢印のゲームオブジェクト生成

![](https://raw.githubusercontent.com/NNNIC/wiki_depot/master/yajirushi/c01.png)

## 2. 矢印のタイプ選択

ヒエラルキーパネルで"Arrow"を選択し、インスペクターのTypeプロパティをにて選択

![](https://raw.githubusercontent.com/NNNIC/wiki_depot/master/yajirushi/c02.png)

## 3. シーンパネルのハンドルで調整

![](https://raw.githubusercontent.com/NNNIC/wiki_depot/master/yajirushi/c03.png)

---
https://github.com/NNNIC/Yajirushi
DWHはRDBと何が違うのか

データウェアハウスに関する基本的な内容をまとめてみたものです。データウェアハウスに関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[DWHはRDBと何が違うのか] (https://www.techcrowd.jp/datawarehouse/)

# [データウェアハウスとRDBのアーキテクチャ] (https://www.techcrowd.jp/datawarehouse/)

データウェアハウスとRDBでは、アーキテクチャが異なります

    データウェアハウスは列単位で処理ができる列指向DB
    RDBは行単位で入出力を行う

集計処理を行う場合は特定の行の値だけ処理をしますが、データウェアハウスとRDBはアーキテクチャの違いから次のように処理速度に差が生じます。
・データウェアハウスは必要な列のみ読み込むので高速の処理が可能
・RDBは行全体を読み込んでから必要なデータを取り込むので、処理が遅くなる

そのため、大量のデータの集計処理や分析をするには、RDBよりもデータウェアハウスの方が高速で処理することができるのです。

しかし、データの追加や更新をする時は、データウェアハウスの方が効率は悪化します。
データウェアハウスは列単位でデータを処理するために、追加や更新する時は不要なデータまで読み込まないと処理ができないからです。
データの追加・更新を頻繁に行う処理は、データウェアハウスよりもRDBが適しています。


# [集計処理にデータウェアハウスが使われる理由] (https://www.techcrowd.jp/datawarehouse/)

特定の列のみのアクセスで済むことが多い集計処理などには、列指向DBであるデータウェアハウスには適しています。データの追加や更新が多いと性能が悪化ことを考慮して、データウェアハウスはデータの書き込み処理をできるだけ行わないように使用されます。

分析処理では、さまざまな列を検索対象とします。RDBでは検索処理を高速化するために少数の列にインデックスをはりますが、検索対象が増えると対応することができません。

その点、データウェアハウスは、列単位で処理が行われるために、高速での検索処理が可能です。数多く検索が行われる分析処理においても、RDBよりもデータウェアハウスを用いた方が効率的に作業することができます。
CentOS 6 yum-cron パッケージについて

1. yum-cron パッケージは yum パッケージアップデートを自動実行する cron job を設置するパッケージ
2. デフォルト設定では yum update でパッケージアップデートまで行われてしまう
3. チェックのみ、またはアップデートパッケージのダウンロードのみを行いたい場合、/etc/sysconfig/yum-cron 設定を編集し、それぞれ CHECK_ONLY=yes , DOWNLOAD_ONLY=yes を設定する必要あり。
データウェアハウスの概要とRedShift

データウェアハウスに関する基本的な内容をまとめてみたものです。データウェアハウスに関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[データウェアハウスの概要] (https://www.techcrowd.jp/datawarehouse/summary-2/)

# [データウェアハウスは何のために存在しているのか] (https://www.techcrowd.jp/datawarehouse/summary-2/)

一般的なリレーショナルデータベースでもデータの集計などを行えますが、データが多くなると処理に時間がかかって効率的な作業が難しくなります。そのため、大量のデータを効率良く処理できるようなシステムが必要となり作られたのがデータウェアハウスです。

データウェアハウスは、リレーショナルデータベースよりも大量のデータを高速で処理できるような構造が採用されています。

しかし、データウェアハウスは幅広い用途で用いられるものではなく、大量のデータを扱う特定の用途向けのシステムとして使われるものです。


# [データウェアハウスの特徴] (https://www.techcrowd.jp/datawarehouse/summary-2/)

データウェアハウスには大量のデータの集計や分析が効率的にできるように、特定の行に対する処理が得意な列指向データベース(カラムナデータベース)が用いられます。
列指向データベースは一般的なリレーショナルデータベースよりも、大量のデータを高速で処理することが可能な集計や分析に特化されたデータベースです。

そして、容易にスケールアウトできるように、分散処理が容易な構造となっています。
そのため、急に処理するデータ量が増えても短期間でスケールアウトができますし、性能を向上するために簡単にスケールアウトできるので低コストでシステムを構築することが可能です。


# [代表的なデータウェアハウス] (https://www.techcrowd.jp/datawarehouse/famous/)

データウエアハウス(DWH)を構築するために、DWH用のDBMSとストレージを含む専用ハードウエアから構成されるDWHアプライアンスを導入するケースが少なくありません。
DWHアプライアンスの代表的な製品としては、OracleのExadataやIBMのNetezzaなどがあります。

Oracle Exadata
・会社規模の利用や大規模なデータを扱う
・Oracle Databaseを使用
・オンラインのトランザクション処理にも適している

IBM Netezza
・企業内の一部の部署で使うことを想定している
・オープンソースPostgreSQLをもとにしている
・複雑な処理をするのに適している

DWHアプライアンスは最初からデータウエアハウスが構築されているために、複雑なチューニングやカスタマイズをしなくても、十分に性能が発揮できます。しかし、より低コストで手軽に使えるクラウド上のデータウエアハウスAmazon RedShiftなども、利用者が増えています。


# [AWSのデータウェアハウス: RedShift] (https://www.techcrowd.jp/datawarehouse/summary-2/)

AWSのデータウェアハウス、RedShiftは圧倒的に安価、容易にスケールアウトでき、フルマネージドのサービスのため手軽に扱うことができます。機能的な特徴として、カラムナーデータベースとMPP、サービス面としての特徴として圧倒的に安価、フルマネージドのサービスがあげられます。
 

### カラムナーデータベース
大規模なデータを扱うデータウェアハウスは、カラムごとの処理を行うカラムナーデータベースが有効ですが、RedShiftもカラムナーデータベース(カラム型DB)です。

・カラムナーデータベースはある特定のカラムだけ操作できるので、集計処理などを高速で行うことができます
・同一のカラムの内容は、同じデータが繰り返して使われることが多いので、圧縮効率が良くなるために記憶領域を有効に使えます

 

### MPP(Massively Parallel Processing)

RedShiftはMPPによって、リソースを共有せずに線形スケールを可能とするシェアード・ナッシングを実現しています。そのため、インスタンスを追加することでデータの容量を増やすだけではなく、処理能力も向上させることも可能です。大量のデータを扱うデータウェアハウスは、このような機能を持つことが不可欠となっています。

 

### 圧倒的に安価

一般的なデータウェアハウスを購入する場合よりも、Amazon Redshiftを利用することで年間の費用を1/10～1/1000にすることも可能です。
しかも、機能的には一般的なデータウェアハウスとほとんど変わりませんので、クラウド環境でデータウェアハウスを利用する場合は、Amazon Redshiftが最もコストパフォーマンスの良い選択肢の一つとなります。

 

### クラウド上のデータウェアハウスなので手軽に使える

Amazon RedShiftはクラウド上のデータウェアハウスなので、AWSマネジメントコンソールを数回クリックするか、プログラムからAPIを呼び出すだけで簡単に使うことができます。
システムのことは、ほとんどAmazon RedShiftが自動的に管理してくれますので、データウェアハウスのためにエンジニアを雇用する必要もありません。
Amazon RedShiftは手軽に使えて、コストも削減できるデータウェアハウスです。
NICの各種パラメータの設定


##### /etc/rc.localに下記を設定し、起動時にすべてのNICに対して下記パラメータを設定できるようにしてみました。


*    NICオフロードの無効化

    パケット分解処理（tso）とスキャッタギャザー機能（gro）及びチェックサム(rx,tx)を無効化

*    バッファサイズの変更


     設定可能な上限よりも大きい値を指定すると反映されないので
     先にethtool -gで上限を確認した後、ethtool -Gで設定しています。
    
    
*    送信キューのサイズを変更

    ifconfigのtxqueuelenオプションで指定しています。
  
  
---  


```text:/etc/rc.local
OFFLOADPARAM="tso gro rx tx"
function setofflod() { for param in ${OFFLOADPARAM}; do ethtool -K $1 $param off ; done }
function getmaxbuf() { param=`echo $2 | tr "[:lower:]" "[:upper:]"`; ethtool -g $1 | gawk '$1 ~ /^'"${param}"':/ {print $2}' | head -1; }
function setcurbuf() { for param in tx rx; do max=`getmaxbuf $1 $param` ; ethtool -G $1 $param $max ; done }
function settxqlen() { ifconfig $1 txqueuelen 10000 ; }
function setnicparam() { setofflod $1;setcurbuf $1;settxqlen $1 ;}
for nic in `ip link | gawk -F': ' '$1 ~ /^[0-9]/&&$2 ~ /^eth/ {print $2}'`; do { setnicparam $nic ;} ; done
unset setofflod
unset getmaxbuf
unset setcurbuf
unset settxqlen
unset setnicparam
EOF
```
node.js経由でアプリケーションを操作する


[ここ](http://qiita.com/yan16/items/ffb8c791405f5e8eac25)でJail環境を作成した際に
どうしても、rootユーザーでの実行が必要なコマンド(具体的にはプロセスの起動・停止)など
を許可する必要が生じまして、node.js経由で実行できるようにしました。

### 処理内容
---

*    クライアントはhttp経由でコマンド実行
*    サーバは127.0.0.1からしか処理をしか受け付けない
*    実行したいコマンドはfuncsの要素として定義
*    cmdにコマンドを、actionに引数を指定するようにする
*    実行した処理はログに記録

##### [スクリプト本体](https://github.com/yan164/application_control_nodejs)
---
```js:/opt/app_manage/index.js
var express = require('express');
var app = express();
var execSync = require('child_process').execSync;
var log4js = require('log4js');

log4js.configure({
    appenders: [
        {
            "type": "file",
            "category": "action",
            "filename": "/var/log/app_manage/action.log",
            "pattern": "-yyyy-MM-dd"
        },
    ]
});

var loggerAction = log4js.getLogger('action');

funcs = {
        "tomcat" : function(action) {
                        var cmd = "/etc/init.d/tomcat " + action
                        var result = execSync(cmd);
                        return result ;
        },
        "apache" : function(action) {
                        var cmd = "/etc/init.d/httpd " + action
                        var result = execSync(cmd);
                        return result ;
        }
}

app.get('/:user/:target/:action', function (req, res) {
  var user = req.params.user ;
  var target = req.params.target ;
  var action = req.params.action ;
  var logmsg = "USER: " + user + " TARGET: " +  target + " ACTION: " + action ;
  loggerAction.info(logmsg);
  var msg = funcs[target](action);
  res.send(msg + "\n");
});

var server = app.listen(8888,'localhost',function () {
  var host = server.address().address;
  var port = server.address().port;
  console.log('Example app listening at http://%s:%s', host, port);
});
```

##### SysVinitスクリプトの作成
```
$ initd-forever -a /opt/app_manage/index.js -n app_manage
```
##### スクリプト編集
```
# vi app_manage
------------------------------------------
#
# initd a node app
# Based on a script posted by https://gist.github.com/jinze at https://gist.github.com/3748766
#

export PATH=/usr/local/nodejs/bin:$PATH
------------------------------------------
```

##### 自動起動の設定
```
# chmod +x app_manage 
# mv app_manage /etc/init.d/
# chkconfig --add app_manage
# chkconfig app_manage on
# chkconfig app_manage --list
app_manage      0:off   1:off   2:on    3:on    4:on    5:on    6:off
```
##### クライアントからの実行方法
```text:apacheを停止する場合
curl http://127.0.0.1:8888/`whoami`/apache/stop
```
```text:apacheを起動する場合
curl http://127.0.0.1:8888/`whoami`/apache/start
```
```text:tomcatを停止する場合
curl http://127.0.0.1:8888/`whoami`/tomcat/stop
```
```text:tomcatを起動する場合
curl http://127.0.0.1:8888/`whoami`/tomcat/start
```
Visual Studio / WPF > IDE > コマンドライン引数を設定する | ショートカットキーの設計ミス

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

実行時引数(コマンドライン引数)をデバッグ時にどこで設定するか調べた。

https://msdn.microsoft.com/ja-jp/library/1ktzfy9w(v=vs.100).aspx

1. [プロジェクト(P)] > [XXXのプロパティ(E)]
2. [デバッグ]タブ
3. [コマンドライン引数]フィールド、に書く

(ショートカットでP,Eしようとしたら、「テンプレートのエクスポート(E)」になる。IDEの設計ミス。)


![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f5eec5b2-0719-032f-0d3d-4457ae13b3c9.png)
[Swift3] 配列を複数の条件で並び替える（ソート）

# はじめに
アプリ内でデータベースを利用していないときに、
配列をソートするサンプルです。

例えば、
リリース日の降順、いいね数の降順にソートしたいときに活用します。

NSSortDescriptorで検索条件を指定して、
NSMutableArrayのsortUsingDescriptorsを利用してソートする方法がありますが、
SwiftでNSMutableArray型をあまり利用したくないため、
Array型の配列をソートするサンプルをご紹介します。

# サンプル
## 1. ソート条件を指定するためのデータを用意する

```swift:
    typealias SortDescriptor<Value> = (Value, Value) -> Bool
```
## 2. 複数のソート条件を結合するメソッドを用意する

```swift:
    func combine<Value>(sortDescriptors: [SortDescriptor<Value>]) -> SortDescriptor<Value> {

        return { lhs, rhs in
            for isOrderedBefore in sortDescriptors {
                if isOrderedBefore(lhs,rhs) { return true }
                if isOrderedBefore(rhs,lhs) { return false }
            }
            return false
        }
    }
```

## 3. 使い方

### 3.1. リリース日といいね数を管理するクラスを定義する

```swift:
struct Item {
    var releaseDate = ""
    var like = 0
}
```

### 3.2. 配列にデータを登録する

```swift:
    let items: [Item] = [
        Item(releaseDate:"2016-01-01 01:01", like: 100),
        Item(releaseDate:"2017-10-10 10:10", like: 100),
        Item(releaseDate:"2017-10-10 10:10", like: 120),
        Item(releaseDate:"2017-10-10 10:10", like: 80),
        Item(releaseDate:"2017-10-10 12:10", like: 80),
        Item(releaseDate:"2017-09-10 10:10", like: 100),
        Item(releaseDate:"2017-01-01 10:10", like: 100)
    ]
```

### 3.3. ソート条件を指定する
リリース日の降順、いいね数の降順に指定する例です。

```swift:
    let sortedByReleaseDate: SortDescriptor<Item> = { $0.releaseDate > $1.releaseDate }
    let sortedBylike: SortDescriptor<Item> = { $0.like > $1.like }
```

### 3.4. 複数のソート条件を結合する 

```swift:
    let combined: SortDescriptor<Item> = combine(
        sortDescriptors: [sortedByReleaseDate,sortedBylike]
    )
```

### 3.5. ソートする

```swift:
   let result = items.sorted(by: combined)
```

### 3.6. 結果を確認する


```swift:
    _ = result.map {
        print($0)
    }
```

出力結果は、下記のとおりです。
リリース日の降順、いいね数の降順に並びました。

```
Item(releaseDate: "2017-10-10 12:10", like: 80)
Item(releaseDate: "2017-10-10 10:10", like: 120)
Item(releaseDate: "2017-10-10 10:10", like: 100)
Item(releaseDate: "2017-10-10 10:10", like: 80)
Item(releaseDate: "2017-09-10 10:10", like: 100)
Item(releaseDate: "2017-01-01 10:10", like: 100)
Item(releaseDate: "2016-01-01 01:01", like: 100)
```

# まとめ
便利なメソッドがNS○○クラスにしか提供されていないことはよくありますね。
そのために、データ型を変更するのは嫌ですね。

Extensionで復活させる方法もありますが、
今回は、下記のサイトにまとめられていたため、
共有の意味で記事を書かせて頂きました。

### 参考記事
[Sort Description in Swift](http://chris.eidhof.nl/post/sort-descriptors-in-swift/)
Nodejs


```bash:@docker/ubuntu
$ apt-get install -y nodejs npm
$ npm cache clean
$ npm install n -g
$ n stable
$ ln -sf /usr/local/bin/node /usr/bin/node
$ ln -sf /usr/local/bin/npm /usr/bin/npm
$ apt-get purge -y nodejs npm
$ chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}

```
Python3.5(anaconda3-4.2)


```bash:@docker/ubuntu
$ apt-get update && apt-get --assume-yes install vim wget bzip2 libgomp1 libpng12-0 libgtk2.0-0 iproute2 iputils-ping
$ wget https://repo.continuum.io/archive/Anaconda3-4.2.0-Linux-x86_64.sh
$ bash ./Anaconda3-4.2.0-Linux-x86_64.sh -b -p $HOME/anaconda3
$ export PATH=”$HOME/anaconda3/bin:$PATH”
$ echo ‘PATH=/root/anaconda3/bin:$PATH’ >$HOME/.bashrc
$ conda install -y -c https://conda.anaconda.org/menpo opencv3
```
windowsでTensorFlow その6

#概要
windowsのTensorFlowで、強化学習やってみた。
環境のルールを変えて、壁打ちをやってみた。

#写真
![hh.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/707946d8-8957-6561-dd27-5c2fdcc37688.jpeg)

#環境
windows 7 sp1 64bit
anaconda3
tensorflow 1.0
pyqt5

#動画
https://www.youtube.com/watch?v=symTUK-nCh4
Visual Studio / WPF > イベント > アプリ実行時に何かをする | link:Application_Startup と Window_Loaded または Window_Initialized の同時使用での注意

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

アプリ起動時に何かを処理する、という処理を検討してみた。

参考: https://msdn.microsoft.com/ja-jp/library/system.windows.application.startup(v=vs.110).aspx

App_Startup()というのを使うようだ。

## 手順

- App.xamlの編集
  - `<Application x:Class=...`のタグ(?)にて`Startup=`を追加
  - `<新しいイベントハンドラー>`を選択
      - `Application_Startup`が追加された
      - `App_Startup`ではない?
  - F12でC# script編集画面に移動
  - 処理を実装

## コード

```xml:App.xaml
<Application x:Class="_170430_t0723_WpfApp1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:_170430_t0723_WpfApp1"
             StartupUri="MainWindow.xaml"
             Startup="Application_Startup">
    <Application.Resources>
         
    </Application.Resources>
</Application>
```

```App.xaml.cs
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;

namespace _170430_t0723_WpfApp1
{
    /// <summary>
    /// App.xaml の相互作用ロジック
    /// </summary>
    public partial class App : Application
    {
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            MessageBox.Show("Good morning");
        }
    }
}
```

### はまりポイント

一度追加した`Application_Startup()`の消し方が不明。

下手に消すと、コードの整合性がとれなくなるのか、IDEエラーが発生して修正できなくなる。

C++ Builderの方がこの点では良い。

### リンク

[Application_Startup と Window_Loaded または Window_Initialized の同時使用での注意 @ パイナップルの芯](http://blog.goo.ne.jp/emebius/e/66c199d9d366706175422fbd18405136)

> 両方書いておくと先に App.xaml.cs で ShutDown() が呼ばれてもアプリは終了せず、そのまま MainWindow の処理が進んでいきます……。

上記のApplication_Startup()以外にもWindow_Loaded()というのがあるようだ。
また、実装仕方によっては「はまる」ポイントがありそう。
Visual Studio / WPF > ウィンドウ > 別のウィンドウを開く

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

C++ Builderで頻繁に使う「２つのフォームがあり、片方のフォームからもう片方のフォームを開く」ということをVS/WPFではどのように行うか。
それをしているのが下記のビデオ。

[youtube動画: Open new window from another window in WPF - Part - 10](https://www.youtube.com/watch?v=KT1kaNG_e3U&index=36&list=WL)

## 手順

- ソリューションエクスプローラでウィンドウを追加
   - 右クリック
   - 追加(D)
   - ウィンドウ(I)
   - ウィンドウ(WPF)、を選択
       - 名前(例): Window2.xaml
- 元のウィンドウ(MainWindow)のコード > Button押下イベント
   - Window2のインスタンスを生成
   - Show()を実行
   - this.Close()
      - MainWindowを閉じたい場合

## コード

### MainWindow

```xml:MainWindow.xaml
<Window x:Class="_170430_t0655_openWindow.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_170430_t0655_openWindow"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <TextBlock Text="1st"/>
            <Button x:Name="B_open" Content="Open"  Click="B_open_Click"/>
        </StackPanel>
    </Grid>
</Window>
```

```MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace _170430_t0655_openWindow
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void B_open_Click(object sender, RoutedEventArgs e)
        {
            Window2 awin2 = new Window2();
            awin2.Show();
            this.Close();
        }
    }
}
```

### Window2

```Window2.xaml
<Window x:Class="_170430_t0655_openWindow.Window2"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_170430_t0655_openWindow"
        mc:Ignorable="d"
        Title="Window2" Height="300" Width="300">
    <Grid>
        <TextBlock Text="2nd"/>
    </Grid>
</Window>
```

### 実行例

MainWindow
![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/8e6d3f60-77d1-cd57-449f-8eff6fa12b16.png)

MainWindowのボタンを押すと、Window2(下記)が開く。MainWindowは閉じる。
![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/0e8bd165-9575-c5b1-08b3-717dbd3588ad.png)

### C++ Builder XE4との違い

- アプリ実行時のフォーム自動生成はどうする?
   - 今のところどのようにするか不明
- Window2に関するincludeをせずとも、Window2のインスタンスを生成できる
   - C#による違いなのかも
技術英語 > at a decent pace / decay

@http://thecodist.com/article/the-six-goals-of-every-programming-project

> Decisions made locally, quickly but with understanding, and by people who know whats going on, almost always result in moving forward **at a decent pace**.

意訳「決定は、ローカルで、すばやいが、きちんと理解され、背景を知っている人によって行われる。結果としてほとんどの場合、**きちんとしたペースで**物事が進んでいく」

https://www.merriam-webster.com/dictionary/decent
> decent
> : good enough but not the best : adequate or acceptable

反対の状況として

> ..., create processes that get in the way, demand inflexible rules, operate in total chaos, insist on millions of meetings and signatures and approval cycles and argue endlessly about trivial things, and watch the days go by. 

意訳「障害となるプロセスを作り、フレキシブルでない規則に従うことを要求する。完全に混乱のもと実施され、非常に多くの会議、署名、承認サイクルを要求する。とるにたらないことについて延々と議論をし、日々が過ぎていく。」

Rie fuさんのdecay。

https://www.merriam-webster.com/dictionary/decay
> 2 :  to decrease usually gradually in size, quantity, activity, or force

ある程度までは決まりというのは効率向上に貢献する一方、決まりが増えすぎると反対に効率が下がるという経験はしている。

**適度な数で抑えておくのが良い**。

あるいは、多くの規則はあるが、時々の状況によって取捨選択して良いとする。
色温度からRGB（sRGB）に変換

　途中まで書いたのですが、HTMLテーブルがうまくはたらかないので、詳細ははてなブログで。
　［追記］書きました！　こちらの記事です。→[色温度からRGB（sRGB）に変換（完成版）](http://zwxadz.hateblo.jp/entry/2017/05/02/065537)

## 何をするの？

　こういうの見たことありませんか？　色温度に対応するsRGB値を求めるコードを実装します。

　![daylight.png](https://qiita-image-store.s3.amazonaws.com/0/151076/137d584f-f11a-9180-3645-16c74996742e.png)

## 処理の大筋

1. 色温度の範囲チェック
2. 色温度→xy色度座標
3. xyz→線形sRGB
4. 線形sRGBを規格化
5. 線形sRGB→非線形sRGB
6. 非線形sRGBを量子化（0〜255の整数）
7. 量子化sRGB→0xAARRGGBB

### コードはもちろんJava

　なぜなら、あなたもまた（以下略

```java
	public static int daylight(double tcp) {
		double x, y, z, r, g, b;
		if (tcp < 4000.0) {
			throw new IllegalArgumentException();
		}
		else if (tcp <= 7000.0) {
			x = -4.6070E9 / (tcp * tcp * tcp) + 2.9678E6 / (tcp * tcp) + 0.09911E3 / tcp + 0.244063;
		}
		else if (tcp <= 25000.0) {
			x = -2.0064E9 / (tcp * tcp * tcp) + 1.9018E6 / (tcp * tcp) + 0.24748E3 / tcp + 0.237040;
		}
		else {
			throw new IllegalArgumentException();
		}
		y = -3.000 * (x * x) + 2.870 * x - 0.275;
		z = 1.0 - x - y;
		
		r = 3.2406 * x - 1.5372 * y - 0.4986 * z;
		g = -0.9689 * x + 1.8758 * y + 0.0415 * z;
		b = 0.0557 * x - 0.2040 * y + 1.0570 * z;
		
//		double maxRgb = Math.max(Math.max(r, g), b);
//		r /= maxRgb;
//		g /= maxRgb;
//		b /= maxRgb;
//		r = (r <= 0.0031308) ? 12.92 * r : 1.055 * Math.pow(r, 1.0 / 2.4) - 0.055;
//		g = (g <= 0.0031308) ? 12.92 * g : 1.055 * Math.pow(g, 1.0 / 2.4) - 0.055;
//		b = (b <= 0.0031308) ? 12.92 * b : 1.055 * Math.pow(b, 1.0 / 2.4) - 0.055;
		
//		上のコメントアウト部分は、今回のシチュエーションでは分岐を省略して
//		以下のようにできます
		
		double maxRgb = Math.max(Math.max(r, g), b);		
		r = 1.055 * Math.pow(r / maxRgb, 1.0 / 2.4) - 0.055;
		g = 1.055 * Math.pow(g / maxRgb, 1.0 / 2.4) - 0.055;
		b = 1.055 * Math.pow(b / maxRgb, 1.0 / 2.4) - 0.055;
		
		int rr = (int) (255.0 * r + 0.5);
		int gg = (int) (255.0 * g + 0.5);
		int bb = (int) (255.0 * b + 0.5);
		return 0xFF000000 | (rr << 16) | (gg << 8) | bb;
	}
```
phpからRustを触るに当たって勉強したこと(メモリとかGC)


## メモリ周りについて
rustのウリの1つとしてはメモリ安全が挙げられる。

ただ、phpのようなgcが勝手に動く言語をやってきた自分にはどういうことが
ありがたいのかが具体的にわからない。

__rustにはGCがないけどメモリ安全 ← ?__
という疑問があったので、メモリ周りの知識とか
GCについて勉強してみた

### ヒープメモリ
まずは、__動的メモリ割り当て__
不要になれば、割り当てられたメモリを解放すること

何のために必要なの？
例えば、膨大なデータが入るからといって
データを格納する配列を10万個用意しても
ムダになる可能性がある。
実行時に効率よく割り当てておきたい。

そのために用意されているのが__ヒープ領域__
プログラムが自由に読み書きできる領域のこと
(動的メモリ管理で使用されるメモリ空間)

通常はプログラムが終了すればヒープ領域は解放される
何らかの原因で、アプリケーションが獲得したメモリが解放されず
メモリが空間に残ってしまうことがある
これが`メモリリーク`と呼ばれるもの

ヒープ領域は ~New領域~ と ~Old領域~ に分けられて使われる

- New領域には生成されたあとすぐ廃棄される(寿命の短い?)オブジェクトが入る。
- Old領域にはそうでない寿命の長いオブジェクトが入る


## GCについて
GCについての理解は、メモリを使いすぎないようにするものくらいにしか知らなかった。

実は大きく分けて2つあるらしい

* Scavenge GC

New領域を対象としたメモリのクリーンを行う
すぐ廃棄されるオブジェクトを対象にするので動きは早い
→ 動く頻度が多く、多くのオブジェクトを対象にしないことが多いため

* Full GC

Old領域を含む全領域に対してのメモリクリーン
Scavenge GCよりかは実行に時間がかかる

__GCを意識したプログラミング__
メモリに優しいプログラムを書くには、オブジェクトの寿命を延ばさない

寿命の長いオブジェクトが多くあると、Old領域に割り当てられるものが増え
Full GCに時間がかかる

__phpのGC__ については下記スライドが大変参考になりました
[PHP の GC の話](https://www.slideshare.net/y-uti/php-gc)
5.3以前では参照カウント方式における循環参照が解決できなかったのは
初めて知りました。。
`unset($value)`の必要性。。

GCということで最近見たgolangについてのものも面白かったです
[Go言語のリアルタイムGC　理論と実践 | プログラミング | POSTD](http://postd.cc/golangs-real-time-gc-in-theory-and-practice/)

GCが、レイテンシ / スループットのどちらに最適化を行うのか、
自分が作るアプリケーションはどちらが適切なのか
1つ判断軸が増えるなぁと。けどこういうのって、既存のものに何かしら
限界が近づいて考慮されるものなんだろうな。。
だって、言語レベルで変えなきゃいけないって相当ですよね、、

### スタティック領域
プログラムの開始から終了までメモリ割り当てが変化しない部分

### スタック領域
メモリ上のローカル変数やメソッドの情報を格納する領域のこと

## ジェネリクス
静的型付け言語において冗長なコードを書かなくて済むような仕組み
関数で、複数の型に対応した引数書きたいとか

```
struct Point<T> {
    x: T,
    y: T,
}

let int_origin = Point { x: 0, y: 0 };
let float_origin = Point { x: 0.0, y: 0.0 };
```

```
fn test<T>(x: T) {
	x + 1
}
let f = test;
let x = test(1);
println!("x is: {}", x);
```

## 所感

普段気にすることのない低レイヤー、ハードウェア側のことを
勉強するいい機会になった
とりあえず何か作ろう、何か。