OmniAICreator/Qiita-1.07M huggingface dataset:
OpenStackに利用するデータベースに最も適したアーキテクチャーとは

　本稿では、ミランティス・OpenStackトレーニング部のインストラクターが、OpenStackに関する疑問について説明いたします。
　今回は、「複数のOpenStackコンポーネントデータベースに最も適したデータベースは？同一ノード上にデプロイすべき？それとも別々のノードに分割したほうが良い？」という疑問に対する説明です。

　OpenStackの各コンポーネントの多くは、ステートをSQLデータベース上に保持します。各コンポーネントは、独立して機能するように設計されています。そのため、OpenStackの各コンポーネントが利用するデータベースは、同一のデータベースサーバーを参照しなくてもよい設計になっています。

したがって、各コンポーネントは物理的に独立したデータベースを利用することもできますし、他のコンポーネントが既に利用しているデータベースを利用することもできます。このような様々な選択肢がある中、運用効率の視点から、同一データベースサーバー上にあるデータベースを共有して利用することをおすすめします。

　その理由は次の通りです。通常、OpenStackコンポーネントは、単一のSQLデータベース上にそれぞれ状態を保持します。データベースへのアクセス時には、OpenStack共有ライブラリであるOsloを利用します。更にOsloライブラリは、Python SQLAlchemyライブラリを活用します。したがって、理論上はOpenStackは、SQLAlchemyライブラリが対応しているSQLデータベースであれば、あらゆるデータベースを利用することができます。

　前述のとおり、OpenStackの各コンポーネントは独立して機能します。Neutronであれば、`/etc/neutron/neutron.conf`, Novaであれば、`/etc/nova/nova.conf`、というように各コンポーネント毎に設定ファイルがあります。データベースのロケーションは、これらの設定ファイル上に定義されます。
例えば、Novaの設定ファイルである nova.conf上には、データベースについて以下のように記述します。

```
[database] 
connection = mysql+pymysql://user:nova@<ip-address-of-database>//nova?charset=utf8
```

続いて、Cinderの設定ファイル上のデータベースに関する記述例です。

```
 [database]
connection = mysql+pymysql://user:cinder@<ip-address-of-database>//cinder?charset=utf8
```

　上記の記述例でわかる通り、データベースはIPアドレスで識別されます。OpenStackの各コンポーネントは、それぞれ独立したデータベースを利用できるように設計されているため、異なるIPアドレスを指定することができます。たとえデータベースの種類が各コンポーネント毎に異なっていても稼働します。つまりNeutronではSQLite、NovaはMySQL、そしてCinderではPostgreSQLと、それぞれのコンポーネントが全く異なるデータベースを利用することも可能です。

しかし、実践的な見方をすると、単一のノードもしくはクラスター上のデータベースを各コンポーネントのデータベースとして利用する方が適している、と考えられます。運用管理上、データベースサーバー数がより少ない方が効率的に運用管理できるため、メリットがあります。データベースをクラスター構成として高可用性を実現すれば、単一サーバーで稼働させる場合よりも、より大きなメリットが得られます。

　OpenStackのデプロイメントツールで最も利用されているデータベースは、MySQL/MariaDBです。OpenStackデプロイメントツールは、通常3サーバーから構成されるデータベースクラスターをインストールします。その上で、クラスターをHA化するためのコンポーネントとして、Galeraを活用します。Galeraは、MySQL/MariaDBクラスター上でデータベースの同期をとるためのツールです。

　場合によっては、データベースクラスターへアクセスするには、単一のIPアドレスを設定する必要もあるでしょう。その場合には、Pacemaker/Corosyncをはじめとする他のツールを使って、バーチャルIPアドレス（VIP)を設定します。OpenStack各コンポーネントは、バーチャルIPアドレスを介してデータベースにアクセスし、VIPの背後にある複数のデータベースのうちの一つにデータを保存します。すると、保存されたデータは、Galeraによって他のデータベースサーバーにコピーされます。

　運用管理者は、すべてのOpenStack環境をこのような構成にする必要はありません。OpenStackは柔軟性を確保するためにモジュラー構成となっています。したがって、それぞれの環境に応じたアーキテクチャーをとることができます。しかし、今日現在、高可用性を備えた単一データベースサーバーもしくは単一データベースサーバークラスターを構築してOpenStackの各コンポーネントで共有する方が、最も安定していて、かつ運用管理も容易なアーキテクチャであるといえます。

(引用元：Todd Bowman (2016) "Mirantis Training Blog: What's the best architecture for multiple OpenStack component databases?"  https://www.mirantis.com/blog/mirantis-training-blog-whats-the-best-architecture-for-multiple-openstack-component-databases/ )
UnicodeDecodeError: 'shift_jis' codec can't decode bytes in position

Shift-JISだと思ったら違ったという話…

# データ入力

## read_csvの文字コード指定

基本的にread_csvでデータを読むことが多いので、read_csv利用時の注意事項。

csvデータのエンコード形式に注意、特にWindows+excelで作成したcsvファイルの読み込み時

```py
In[36]: df = pd.read_csv('hoge.csv',header=0,encoding='Shift_JIS')
…
UnicodeDecodeError: 'shift_jis' codec can't decode bytes in position 16-17: illegal multibyte sequence
```

"UnicodeDecodeError:"が発生し。encodingの値が正しくない模様。
cp932　を指定するとうまく通った。

```
df = pd.read_csv('hoge.csv',header=0,encoding='cp932')
```


# 参考
> http://minus9d.hatenablog.com/entry/2015/07/30/225841
cocos-2dx 3.x : ビルド時間短縮(win32, 2016/08版)

#cocos の lib の build をスキップ
Cocos Studio 付属の 3.10 には prebuilt の lib があったのですが、3.12 ではなくなってました。Visual Studio で、clean -> build を行うと cocos の lib を全て再ビルドしてしまうので大変時間がかかります。

ライブラリを改造しないのであれば、最初に一度だけビルドしてもうビルドしないと思いますのでその設定方法をメモ。

#設定
1. ソリューション(右クリック)→プロパティを選択し、プロパティダイアログを開く
2. 構成プロパティ：構成を選択
3. 全部のプロジェクトの「ビルド」にチェックが入っているので、アプリのプロジェクト以外のチェックを全部外す。

これで、クリーンやリビルドしてもスキップされるようになります。
※最初の一回だけビルドをするのをお忘れなく。

以上です。
コンフルでページを跨いだアンカーリンクをつくる。

リンクの編集を開くと、
最初にアクティブになっているのが「検索」タブ。

そこから```タイトル#見出し```とやっても、#の情報が落とされて指定のタイトルに飛ぶだけ。

そりゃそうよね…検索だもの…。
でも、なんか受け付けている感じで保存されてくれちゃうからハマってしまった。

アンカーリンクを使いたい場合は、「詳細」タブで設定する必要がある。
画像の様にね。

![スクリーンショット 2016-08-05 10.16.01.jpg](https://qiita-image-store.s3.amazonaws.com/0/32839/5ac4bc36-fbfb-b00d-6ba0-bcf1e9d66920.jpeg)
Rails トークンとは

#トークンとは
ワンタイムパスワードのこと(定義としては)
カード型のハードトークンやPCにインストールして利用するソフトトークンがある。

DEVISEなどの、ユーザ認証のためのメールに記載されている、

"こちらをクリックして登録を完了してください。"

が、ワンタイムパスワード(有効化トークン、ワンタイムトークンURLとも言われたりする)。
通常、有効なのは1回だけで、期限がある(24h以内など)。プログラミングでは、ソースコードを解析する際にそれ以上細かい単位に分解できない文字列の並びの最小単位(要素名や演算子)のことをトークンという。

・具体例
DEVISEの場合
1. ユーザがsign_up(新規登録)をした際に、トークン(ワンタイムパスワード)が生成・発行される。
2. ユーザ認証のためのメールに記載されている、

"こちらをクリックして登録を完了してください(が、トークン、及びワンタイムパスワードに該当する)。"

をクリックすることにより、ソースコードを解析する際にそれ以上細かい単位に分解できない文字列の並びの最小単位(要素名や演算子)が、tableのカラムに登録される。
以下はusersテーブルのconfirmation_tokenカラム。

confirmation_token
eTy27W6bSdJPsNnQ2H-d

参考サイト
http://rails.takayukikoyama.com/login-logout/temporary-onetime-token/
http://qa.atmarkit.co.jp/q/2755
たったひとつの技術書の選び方

巻末の索引のページ数をみます。

入門書など沢山の同種類の本を目の前にしてどれが良い本なのかわからなく迷う時があります。（私は今まで優しい言葉で書かれていたり、イラストを多用していたり、カラーだったり、Amazonの評価が高かったりしたのを選んできました、しかしAmazonで発売されたばかりの本には評価が無かったりします。）
そこで巻末の索引ページを見ます。
200～300ページぐらいの本で索引が2、3ページしかなかったらハズレです。
二桁、十数ページの索引がある本はアタリです。

全てに当てはまるものではないとは思いますが、索引のページ数が少ない本は選ばないようにしたほうが無難です。
$_FILES["~~~"]["tmp_name"]で値が取れなくなった。

php5.3をphp5.6にバージョンアップした時に、$_FILES["~~~"]["tmp_name"]の処理で以下のエラーが表示されるようになりました。

```
undefined index ~~~ 
```
原因はphp.iniの設定が以下になっていたことでした。

```
file_uploads = Off
```
それを以下に変更
 
```
file_uploads = On
```

これでファイルのアップロードが可能になります。
PowerShell で ClosedXML の単純な動作速度比較

[ブログからの転載](http://1bed.allright.life/?p=2215)

# 経緯

先に書いたブログ [PowerShell で ClosedXML を使って Excel ファイルを作成する](http://1bed.saloon.jp/?p=2206) にて、「動作が軽快」と書きましたが体感でしかなかったので、単純に **多くのセルにデータを入れたら速度に差がでるか？** というのを試してみたいと思います。

しかし、単純な比較といいなが色々と勉強しながらでした。

特に、一括で貼り付ける方法は「速い」というブログ等は多く目にしましたが、実際にどのようなコードで検証して何と比べて速いのかがまとまっているのは私には見つけられませんでしたので、個人的には今回のサンプルコードがとても大切です。


# 環境

* VAIO-Z
  - CPU: Core i7-5557U 3.10 GHz (最大3.40 GHz)
  - Mem: 16GB
  - Storage: 第二世代 ハイスピードSSD(PCI Express x 4 (20 Gb/s))
* Windows 10
* PowerShell 5.0
* ClosedXML 0.76.0
* Microsoft Open XML Format SDK 
* MS Office 2016

# 計測方法

Measure-Command を利用して計測する

```ps1:ClosedXML_Pattten1の例
Measure-Command { ClosedXML_Pattern1.ps1 }
```


# 検証項目と結果

一つのシートで、100 X 100 のセルに下記のパターンでデータを入れていく

| No.| 試験内容 | COM Object | ClosedXML |
| ---| --- | --- | --- |
| 1. | セル 1 つづつ 10,000 回、データを入れる(装飾なし) | 30.4542562 sec | 0.699596 sec |
| 2. | セル 1 つづつ 10,000 回、文字色を赤、フォントの大きさを 15 のデータを入れる | 136.3952091 sec | 0.913028 sec |
| 3. | 1 行(100 セル） づつ 100 行分、データを入れる(装飾なし) | 2.0920194 sec | 0.6800917 sec |
| 4. | 1 行(100 セル） づつ 100 行分、文字色を赤、フォントの大きさを 15 のデータを入れる | 6.8155114 sec | 0.8739652 sec |
| 5. | 10,000 のセルに一括でデータを入れる(装飾なし) | 1.5663538 sec | 0.6527399 sec |
| 6. | 10,000 のセルに一括で、文字色を赤、フォントの大きさを 15 のデータを入れる | 2.1558577 sec | 0.8357458 sec |


* 今回検証に使ったサンプルコードは [GitHub](https://github.com/miyamiya/Learnning_PowerShell/tree/master/Com_vs_ClosedXML) においてあります


# 考察

xls 縛りとかがないのなら、ClosedXML を使ったほうがよいなというのが私の感想です。

また、少し面倒に感じますが、配列に入れて一気に貼り付けるほうが圧倒的に速いですので、設計段階からこの考えを取り入れていきたいです。
そろそろIDEを使えるようにしたいが、使う気にならないので、どうしようか

そろそろIDEを使えるようにしたいんだけど、全然定着しないので、現状と心境をまとめてみる。スクリプト言語をメインに使用している。仕事では、以前はPHP、最近はRubyを書いてる。

## 普段使用している環境

Linux上に構築した複数のツールを使うよくあるサーバーサイドプログラミング環境。

* Arch Linux
* Vim
* tmux
* コマンドラインツール（git,psql,sed,awk等々）

## 過去に使用したことがあるIDE

|IDE|言語|使用期間|備考|
|---|---|---|---|
|MonoDevelop | boo script | 一か月くらい|Unity、プライベート|
|Visual Studio Express | C# | 1年くらい|実務|
|RubyMine | Ruby | 5日くらい|現在お試し中|

### 各使用感

#### MonoDevelop

* 重い（遅い？）
* キーバインドが慣れない
* Pythonが嫌いになった

#### Visual Studio Express

* 勝手にコードを編集しまくる
* キーバインドが慣れない

#### RubyMine

* 動作が遅い（LinuxからWindowsにXを送ってるせいか？）
* IdeaVimによるキーバインドが、かなり良い感じだった

## 機能的に感じること

* よくVimとIDEが比較されるが、VimってIDEのエディタ部だよね
 * 私はLinux環境を丸ごとIDEとして使ってる感じ

|IDE|複合環境|
|---|---|
|エディタ部|Vim|
|ペイン|tmux|
|VCS|tmux＋各コマンド|
|DB接続|tmux＋各コマンド|

* Vimはエディタと言ったが、過去には色々試してた
  * VimShell＋mysql、psqlでシンタックスハイライト付きエディタでSQL書いて、ショートカットキーで、コンソールに送って即実行
  * Visual Studio でのコーディングが嫌で、C#をVimでコーディングしてた
      * オムニ補完やメソッド定義元へのジャンプはプラグインとツールで実現してた
  * PHPの場合、Xdebugと連動してVimで、ブレークポイントを仕込んだりすることもできる
      * もちろん変数の中も見れる

「それ、Vimで出来るよ」だけど、設定とかがすっごく面倒だよ。だから、使わなくなりました。と言う現状。あと、言語毎に設定が必要だし、レスポンスが遅かったりするのも辞めた理由。tmuxとCUIコマンドで事足りるようになってきたから、あんまり不便を感じなくなってしまった。

## 今感じるデメリット

デメリットというか、現環境と比べて、IDEを使う上で嫌だと感じること。そして、その数だけ、作業効率が落ちてしまう。

1. レスポンスの遅さ
* Vimキーバインドに慣れすぎてしまって、他のキーバインドが煩わしく感じる
  * マウスを使いたくない
* サーバーサイドプログラミングが多いので、編集から実行するまでが手間
  * 常にサーバーと同期取れるよ->同期に1秒くらいはかかるのが嫌
  * マウントしてしまえば良いのでは->保存に時間がｒｙ
* サーバー設定をするなど、他の作業をしたい時にウインドウを切り替えないといけない
* 何してるのか分からないことが怖くて検証してしまう
  * VCSやDBのGUI操作って、これちゃんと保存しているのかとか、余計なことしてないかとか、色々気になってしまう

## IDEに求めるメリット

何故、IDEを使えるようにしたいか、と言うと、IDEなりのメリットがあるから。すぐに求めていることは下記のことかな。「Vimでもできる」けど、面倒だからやりたくないこと。主にコーディングに対するメリットだけど、もっと大枠のアプリケーション開発自体を速く便利にするものもIDEにはあるんじゃないかと思っているが、そこまでは知らない。

* 補完
* メソッド定義元へのジャンプ
* コンパイル言語の場合は、実行までの設定の簡易さ
* これらが言語に依存せずに共通環境で使用できる

## 結論

要は慣れろということなんだろうけど、今感じるデメリット…というか嫌だと感じることを許容できない。特に、なんか遅いせいで、コーディング時にイライラすることが個人的に最大のデメリットであり、使い続けられない原因。1時間くらいで操作をマスターできればいいのに。最近、新人が付く機会があったら、最初にIDEを使わせた方が良いと思ってる。そして自分が教わりたい。その後Vimを教えたい。

IDEは、ある程度自動的にやってくれてGUI操作できるので、誰でも、同じように、簡単にできるようになるメリットがあると思う。コマンド覚えなくてもDB操作できたりとか。だけど、コマンドラインツールがある程度扱えるようになってからだと、今更頑張って乗り換えるメリットってなんだってなってしまう。どうしたものか。
apiでのリクエスト失敗をテストする

あるapiに書いてある、以下のコードをテストしたい

```ruby:code.rb
fail ActionController::BadRequest unless params[:application_token].in?(Settings.access_grants)
```

## 方法1: status codeで400が返ってくることをテスト

```ruby:api_spec.rb
context 'when the application token is wrong' do
  let(:application_token) { 'wrong_token' }
  it { expect(response).to have_http_status(400) }
end
```

## 方法2: errorのkeyがあることをテスト
work in progress
rspecで、let, beforeのコードの順番で紐付いたモデルが取れたり取れなかったりする


```ruby:api_spec.rb
let!(:user1) { create(:user, id: 1, finc_user_id: 1) }
let(:user2) { create(:user, id: 2, finc_user_id: 2) }
let(:partner_organization) { create(:partner_organization, id: 1) }
let(:partner_organization_branch) { create(:partner_organization_branch, partner_organization: partner_organization) }
let!(:partner_organization_branches_user) { create(:partner_organization_branches_user, partner_organization_branch: partner_organization_branch, user: user1) }

let(:url) { "/internal/v1/users/partner_organizations/" }
let(:params) { { finc_user_ids: finc_user_ids, application_token: Settings.wellness_survey.api.access_grant } }
before { get url, params }
```

だとok. ちゃんと
{"users"=>[{"id"=>1, "partner_organization_branches"=>[**中身あり**]}], "non_exist_users"=>[]}

```ruby:api_spec.rb
let(:url) { "/internal/v1/users/partner_organizations/" }
let(:params) { { finc_user_ids: finc_user_ids, application_token: Settings.wellness_survey.api.access_grant } }
before { get url, params }

let!(:user1) { create(:user, id: 1, finc_user_id: 1) }
let(:user2) { create(:user, id: 2, finc_user_id: 2) }
let(:partner_organization) { create(:partner_organization, id: 1) }
let(:partner_organization_branch) { create(:partner_organization_branch, partner_organization: partner_organization) }
let!(:partner_organization_branches_user) { create(:partner_organization_branches_user, partner_organization_branch: partner_organization_branch, user: user1) }
```
{"users"=>[{"id"=>1, "partner_organization_branches"=>[**中身なしblank**]}], "non_exist_users"=>[]}
で紐付いたユーザが取れない

原因ググり中。
API試し方メモ

# 方法1 curl
curl http://localhost:3000/internal/v1/users/partner_organizations?parameter_name=something&another=something_else


**パラメタのstringは''で囲まなくてok**


**パラメタを配列として渡したい場合：**
例えばids: [1, 2, 3]をパラメタとして渡したい時
curl http://localhost:3000/internal/v1/users/partner_organizations?いids[]=1&ids[]=2&ids[]=3
*一つずつ渡さないといけない...*

----

> curl: (3) [globbing] bad range specification in column 136

とか出る時
curl --globoff http://localhost:3000/internal/v1/users/partner_organizations\?user_ids\[\]\=1

--globoffとすれば良い

globoffドキュメント

```
-g/--globoff
              This  option  switches  off  the "URL globbing parser". When you set this option, you can
              specify URLs that contain the letters {}[] without having them being interpreted by  curl
              itself.  Note  that  these  letters  are not normal legal URL contents but they should be
              encoded according to the URI standard.
```

#方法2 rails cでconsoleを起動しrailsのapiを叩くgem HTTPartyを使う
(アプリケーションでHTTParty gemを使っていることを前提とする)
rails cでconsoleを起動、以下で行ける。
パラメタの渡し方がラク。

```
url = 'http://localhost:3000/internal/v1/users/partner_organizations'
params = {application_token: 'honya', user_id: [24, 13, 14]}
method = :get

a = JSON.parse(HTTParty.send(method, url, { body: params }).body)
```

cf) JSON.parseってやるとjson(配列形式)にしてくれる
2016-08-05 Windowsログイン > administrator | ドメイン\ユーザ名 | ユーザ名@ドメイン | .\ (PC名の自動選択)

http://qiita.com/akira6592/items/590464996581238d66a4
のコメントを書く中で思い出した事項。

コメントに記載した事項と同じですが、将来の参照用に記事にします。

## administrator

ユーザ名にadministratorと入力すると、ログオン先がドメインからPC名に変更されます。

Windows7とWindows8.1で確認。

## ドメインユーザでのログイン

以下の2通りができる場合がある (できない環境もあるかも)。
Windows7とWindows8.1で確認。

- ドメイン\ユーザ名
- ユーザ名@ドメイン

後者の入力方法は、キーボード設定が日本語・英語キーボードで整合しなくてバックスラッシュが使用できない時に、とりあえずログインしようとして使った。

これをどこで知ったかは覚えていない。
疲れたときのミスタイプで見つけたのだったか。

## PC名の自動選択
(2017/10/17 追記)

後輩から聞きました。
設定変更時などで管理者ログインが必要となった時に出てくるダイアログにて。
ユーザ名入力においてドットと円マーク(`.\`)の入力をすると、ドメインからPC名に切替わるようです。

PC名を入力する必要がなくなります。
PowerShell だけで レジストリの値とその種類を取得したい

ネタ元:http://powershell.com/cs/blogs/tips/archive/2015/04/15/getting-registry-values-and-value-types.aspx

* 1. キーが存在するか

```
(Get-Item -Path "Registry::HKLM\Software\Microsoft\Windows\CurrentVersion")
```

* 2. サブキー一覧

```
(Get-Item -Path "Registry::HKLM\Software\Microsoft\Windows\CurrentVersion").GetValueNames()
```

* 3. サブキー名を指定 Registry の Type 取得

```
(Get-Item -Path "Registry::HKLM\Software\Microsoft\Windows\CurrentVersion").GetValueKind("DevicePath")
```

* 4. サブキー名を指定して Registryの Value 取得

```
(Get-Item -Path "Registry::HKLM\Software\Microsoft\Windows\CurrentVersion").GetValue("DevicePath")
```

* 5. 特定のキー以下のサブキーのType全取得

```
$key=(Get-Item -Path "Registry::HKLM\Software\Microsoft\Windows\CurrentVersion"); $key.GetValueNames()|ForEach-Object{ $key.GetValueKind($_) }
```

* 6. 特定のキー以下のサブキーのValue全取得

```
$key=(Get-Item -Path "Registry::HKLM\Software\Microsoft\Windows\CurrentVersion"); $key.GetValueNames()|ForEach-Object{ $key.GetValue($_) }
```

* 7. 特定のキー以下のサブキーの名前, Type, Value をいい感じに出す

```
$key=(Get-Item -Path "Registry::HKLM\Software\Microsoft\Windows\CurrentVersion"); $key.GetValueNames()|ForEach-Object{$name=$_; $rv = (1 | Select-Object -Property Name, Type, Value); $rv.Name= $name; $rv.Type=$key.GetValueKind($_);$rv.Value=$key.GetValue($_); $rv }
```

Type の表示は Microsoft.Win32.RegistryValueKind がでているようなので
https://msdn.microsoft.com/ja-jp/library/microsoft.win32.registryvaluekind%28v=vs.110%29.aspx
や
http://www.atmarkit.co.jp/fdotnet/dotnettips/478registryvaluekind/registryvaluekind.html を確認してください。
【Unity拡張】Unityエディタを再起動させる

#はじめに
エディター拡張を作っていると、Unityを再起動させるというシチュエーションがよく発生します。

楽してUnityを再起動させたい、ということで作ってみました。

#ソースコード
```EditorRestartUnity.cs
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Diagnostics;

public class EditorRestartUnity
{
    [MenuItem("File/Restart")]
    static void RestartUnity()
    {
        // 別のUnityを起動したあとに自身を終了
        Process.Start(EditorApplication.applicationPath);
        EditorApplication.Exit(0);
    }
}
```


# 実行する
上記のスクリプトをプロジェクトに追加すると、 File/Exit の下にRestartが追加されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/7b6a51b7-f94d-ee09-a9e1-1fd01afca256.png)
RestartをクリックするとUnityが再起動します。　

楽してUnityが再起動できるようになりました（完
ruby oop

rubyのオブジェクト指向について自分なりの解釈でまとめてみた。

# Ruby OOP

### Object Oriented Programming
対象（オブジェクト）そのものに重点を置き、対象の振る舞いや操作が対象の属性として備わるという考え方に基づいてプログラミングすること。プログラムの再利用が容易になり、ソフトウェアの生産性を高めることができる。

### RubyにおけるObject
* 全てがオブジェクト

## インスタンスオブジェクト（インスタンス／オブジェクト）
* データを表現する基本的な単位とデータの処理の集まり
> 各種クラスからnewすることでRuby実行空間に生み出されるデータ型

```
String.new 　=> 　"　"

Stringクラス　　文字列オブジェクト
```

## クラスオブジェクト（クラス）
* オブジェクトの種類を表すもの！！オブジェクトの雛形
> オブジェクトの振る舞いを決める！！

#### 例
**たい焼き**

* たい焼きを焼く時の型　＝＞　クラス
* 出来上がったたい焼き　＝＞　インスタンス

> たい焼きの型（クラス）をもとにたい焼きというインスタンスが作られる。

### クラスとインスタンス

Stringクラスという設計図からできたインスタンス、実体

```
'Hello World'
```
上記の'Hello World'という文字列は、String クラスという設計図からつくられた、インスタンス、文字列オブジェクト

### オブジェクトとしてのクラス
**クラスはオブジェクトの雛形であり、クラスはオブジェクトの振る舞いを決める**

ここで話がおかしくなる。
**クラス自体もオブジェクトであるということ！！！**

```
オブジェクトには✖︎✖︎クラスというクラスから成り立つ=>その︎✖︎✖︎クラスにもClassクラスというクラスから成り立っている

* String.class => Class
* Hash.class => Class
* Array.class => Class
* Numeric.class => Class

```

要するに？
>* あらゆるクラスはClassという一つのクラスから作られる。
>* あらゆるクラスは、Classクラスのインスタンス、オブジェクトということ！！

### 継承
親クラス（スパークラス）から機能を受け継ぐ
> * 既存の機能はそのままで、新たな機能を追加したい時
> * 既存の機能に処理を追加し、拡張したい時

例

```
class Person
  def initialize(name)
    @name = name
  end

  def name
    @name
  end
end

class PersonCharacter < Person  # Personクラスのサブクラス(Personを継承している)
  def initialize(name, age, sex)
    super(name)
    @age = age
    @sex = sex
  end

  def age
   @age
  end

  def sex
    @sex
  end
end

me = PersonCharacter.new('tun', 25, 'man')
puts me.name #=>tun
puts me.age #=>25
puts me.sex #=>man
```

## モジュールオブジェクト(モジュール)
* クラスによく似たオブジェクト
> Module.class => Class

クラスとの相違点
> * モジュールはインスタンスを持つことができない
> * モジュールは継承できない＝＞Mix-in

### Mix-in
モジュールによる機能追加 => モジュールをクラスに混ぜ合わせるMix-in

```
 module MyModule
  # 共通機能、処理
end

class MyClass
  include MyModule # =>これがMix-inによるモジュール機能追加
  # MyClassの固
```

例
*　コメントでの指摘箇所は修正済み

```
module Behavior
  def self.description
    "I'm a Behavior Module"
  end

  def sleep
    "I'm sleeping"
  end

  def eat
    "I'm eating"
  end
end

class Person
  def initialize(name)
    @name = name
  end

  def name
    @name
  end
end

class PersonCharacter < Person # Personクラスのサブクラス
  include Behavior
  def initialize(name, age, sex)
    super(name)
    @age = age
    @sex = sex
  end

  def age
   @age
  end

  def sex
    @sex
  end
end

me = PersonCharacter.new('龍頭', 22, 'man')
puts me.name #=>龍頭
puts me.age #=>22
puts me.sex #=>man
puts me.eat #=>I’m eating
```

## この他にも？
rubyは全てがオブジェクト！！

例えば nil true falseなどもすべてがオブジェクトである。

## 一言でオブジェクト指向プログラミング
**自分なりの解釈**
### オブジェクトという部品を組み合わせていくプログラミング手法

オブジェクト指向というのは概念的な話であるから、ひとそれぞれ受け止め方が変わってくるのかなーってかんじる。ひとまず自分のなかでのオブジェクト指向とはと聞かれるとこのように答える。



最後まで読んでいただきありがとうございます。
なにか間違っていることなどあればご指摘お願いいたします。
No such file or directory @ rb_sysopen -config/apns/server_certificates_sandbox.pem (Errno::ENOENT)

## エラー
rspecでテストを書いて、走らせようとしたとき(rspec ファイル名.rb)に以下のエラーが出て走らせることができなかった。

> No such file or directory @ rb_sysopen -config/apns/server_certificates_sandbox.pem (Errno::ENOENT)

## エラー原因
config/apns/server_certificates_sandbox.pemというファイルがない

## そもそもどこで「ファイルが必要」とされ、apnsって何で、pemって何
**そもそもどこで「ファイルが必要」とされているか**
- config/initializers以下のapns.rb
- initializersはrails起動時に読み込まれるファイル
apns.rb中身

```ruby:apns.rb
apns = []
Settings.apns.certificate_file_names.each do |certificate_file_name|
  apn = Houston::Client.production
  apn.certificate = File.read("config/apns/#{certificate_file_name}")
  apns << apn
end

APNS = apns
```
確かにconfig/apns/以下のファイルを読み込むようになってる...

**じゃあapnsって何、.pemって何**
Appleのプッシュ通知に使うための秘密鍵らしい

**それがないって?!**
<img width="257" alt="Screen Shot 2016-08-05 at 07.55.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/112938/8dca2b65-06a9-04c1-23d1-421daca5813c.png">

確かにない。
requireファイルを指定しているファイルを覗いてみる
config/settings/development.local.ymlみてみる

```config/settings/development.local.yml
apns:		
   certificate_file_names:		
      'dummy_for_test.pem'
```

あれ、server_certificates_sandbox.pemはrequireされてない。。？
あ、テスト実行してるから、config/settings/test.local.ymlに書かれてるんだった

```config/settings/development.local.yml
apns:		
   certificate_file_names:		
      'server_certificates_sandbox.pem'
```

確かにserver_certificates_sandbox.pemが必要って言ってるのに、該当ファイルがなくてエラーが出ているだろうことが確認された。


### 必要とするコードがあるなら何故該当ファイルがなくなった(内輪事情)
元々server_certificates_sandbox.pemはあったらしいのだが、秘密鍵が描かれているので、githubにあげるのはマズイだろうということで、サーバーに置いておくことにしたらしい。

そのファイルだけをrailsプロジェクトから消して、しかしながら、そのファイルを必要とするコードは(本番環境ではサーバーに置くことにした鍵を使って)まだ使うため、残っていて、サーバーの秘密鍵を取れないlocal環境ではエラーが出た。

ということ。(スッキリ！)

### 解決方法
1. touch config/apns/server_certificates_sandbox.pem
ないって言われてるなら作っちゃえ
(ただgitにコミットしない配慮必要)
2. config/settings/test.local.ymlの'server_certificates_sandbox.pem'を消す
そしたら読み込むべきファイルなし、ということになるので、エラーは出なくなる
こちらはlocalファイルなので、(.gitignoreしている限り)毎回コミットするときにこのファイルはコミットしない、という配慮は必要なくなる
Processing / ControlP5 / MSC-MOD20 > rs232cTerminal (v0.1-v0.3) > 送受信タイミングを知るためのツール

```txt:動作環境
Processing 3.1.1 on Windows 8.1 pro(64bit)
ControlP5 v2.2.6
SDモジュール: MSC-MOD20 ( http://www.microtechnica-shop.jp/shopdetail/000000000026/ )
```

http://qiita.com/7of9/items/d5b8a5ed14cc5b215e44
で色々検討するうちに、今勉強中のProcessingで送受信のタイミングを見るツールを作るのもあり、かと思えてきた。

泥縄式開発。
今の時間を使って、未来の時間を節約するというa developer full of hope。

## code v0.3

[v0.3 @ github](https://github.com/yasokada/processing_160805_rs232cTerminal/releases/tag/v0.3)

v0.3までの実装

- v0.1
  - 他プロジェクトから分岐

  - 余分なものを削除
- v0.2
  - シリアル受信した文字を表示
- v0.3
  - 受信時の時刻をmsecまで表示

## 実行例

- COM6で接続 (MSC-MOD20のシリアルポート)
- MSC-MOD20の電源を入れる
  - 数回実施する

Power on boot文字列がタイムスタンプとともに表示された。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e2285a41-e4cf-9fab-535f-fbd9b6ec1114.png)


## TODO

- テキストフィールド追加
- 送信ボタン追加
- 送信ボタン押下時
  - テキストフィールドの内容をシリアル接続先に送信
  - 送信時のタイムスタンプを表示
java > link > 数値をString型に変換する > valueOf() / String.format("%05d", yournumber); / 文字列連結演算子 +

数値をString型に変換したい。

## ValueOf()

http://java-reference.sakuraweb.com/java_number_tostring.html

valueOf()を使うようだ。

## 0パディング

左を0で埋める方法。
http://stackoverflow.com/questions/473282/how-can-i-pad-an-integers-with-zeros-on-the-left

```
String.format("%05d", yournumber);
```

http://ideone.com/968wZR

```java
/* package whatever; // don't place package name! */
 
import java.util.*;
import java.lang.*;
import java.io.*;
 
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
		// your code goes here
		int value = 314;
		String msg = String.format("%05d", value);
		System.out.println(msg);
	}
}
```

```txt:結果
00314
```

## 文字列連結演算子 +

@shiracamus さんの[コメント](http://qiita.com/7of9/items/6ac8e3b6e17e127efe99#comment-737c99a064f2ee105e07)にて「文字列連結演算子」を教えていただいた。

情報感謝。
java > link > getCurrentTimeStamp()

現在時刻を取得する方法

http://stackoverflow.com/questions/1459656/how-to-get-the-current-time-in-yyyy-mm-dd-hhmisec-millisecond-format-in-java
のgetCurrentTimeStamp()

getCurrentTimeStamp()内のSimpleDateFormat()を使うには以下に記載のimportが必要。
http://qiita.com/kazuhirokomoda/items/e5898aa9b6855adf7433
> import java.text.SimpleDateFormat;
elasticsearch5 + kibana5 + logstash5 をdockerで動かす

## 参考

* [Figure out what's up with 5.0 · Issue #98 · docker-library/elasticsearch](https://github.com/docker-library/elasticsearch/issues/98)
* [dockerhub elasticsearch](https://hub.docker.com/_/elasticsearch/)
* [dockerhub kibana](https://hub.docker.com/_/kibana/)
* [logstashでapacheのアクセスログをelasticsearchに送信し、kibanaでグラフ表示 - Qiita](http://qiita.com/tukiyo3/items/b0b6b4a20d4ad4d44b80)

## docker-compose.yml

```yaml:docker-compose.yml
es:
    image: elasticsearch:5
    ports:
      - "9200:9200"
      - "9300:9300"
    volumes:
      - ./es_config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - ./es_data/:/usr/share/elasticsearch/data/
    environment:
      - ES_JAVA_OPTS=-Xms512M -Xmx512M

ki:
    image: kibana:5
    ports:
      - "5601:5601"
    links:
        - es
    environment:
      - ELASTICSEARCH_URL=http://es:9200
```

* [5.0/config/elasticsearch.yml](https://github.com/docker-library/elasticsearch/blob/master/5.0/config/elasticsearch.yml)を`./es_config/elasticsearch.yml`に記述

```yaml:./es_config/elasticsearch.yml
network.host: 0.0.0.0

# this value is required because we set "network.host"
# be sure to modify it appropriately for a production cluster deployment
discovery.zen.minimum_master_nodes: 1
```

```bash:起動
# sysctl -w vm.max_map_count=262144
docker-compose up
```

## logstash (deb)

* [Logstash](https://www.elastic.co/downloads/logstash)から`Logstash 5`のdebインストールした

```rb:logstash.conf 
input { file { path=> "/var/log/apache2/access.log" } }

filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
  date {
    match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
    locale => "en"
  }
  mutate {
    replace => { "type" => "apache_access" }
  }
}

output {
  elasticsearch { hosts => ["192.168.10.22:9200"] }
}
```

```bash:起動
sudo /usr/share/logstash/bin/logstash --path.settings=/etc/logstash/ -f logstash.conf
```

* logstash2系の場合、`/opt/logstash/bin/logstash -f logstash.conf`

![スクリーンショット_2016-08-05_17-06-39.png](https://qiita-image-store.s3.amazonaws.com/0/25728/2e9dd6b1-01d0-b142-2f36-2d99890519db.png)

* http://localhost:5601 にアクセスしログを受け取っていることを確認


## logstash (docker)

```rb:logstash.conf 
input { file { path=> "/var/log/apache2/access.log" } }

filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
  date {
    match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
    locale => "en"
  }
  mutate {
    replace => { "type" => "apache_access" }
  }
}

output {
  elasticsearch { hosts => ["192.168.10.22:9200"] }
  stdout { codec => rubydebug }
}
```

* [root権限でlogstash起動](https://github.com/docker-library/logstash/issues/11)

```bash:
docker run  \
 -it --rm -v "$PWD":/config-dir \
 -v /var/log/apache2/:/var/log/apache2/:ro \
 logstash:5 \
 gosu root logstash -f /config-dir/logstash.conf
```
技術英語 > enclose the whole expression in parentheses:

@ Code Complete (No. 6458 / 36077)

> enclose the whole expression in parentheses:

演算の優先順位が分かりにくい場合に括弧で囲う、という時に使う英語。

http://ejje.weblio.jp/content/parenthesize
から

> parenthesize the whole expression

という言い方もできそうだが、上の方が自分には頭に残りやすかった。

同じページに surround を使っている例もある。
Matlab超初心者がはじめにするべきこと

Matlabは企業•大学等で使う機会のよくある数値解析ソフトで、独自のプログラミング言語でもあります。

#Matlabの歩き方
検索してでてくるMatlab入門ページの多くはMatlabのプログラミング言語としての文法の解説ばかりです。自分が初心者の頃はMatlabの操作画面やドキュメンテーションなどの使い方がよくわからず手間取ってしまいました。そこでMatlabを使い始めたけど、どうしたら良いのかわからないというMatlab初心者の方の最初の一歩の助けになれば良いと思い、この記事を執筆します。
 
#Matlabの基本
Matlabはプログラミング言語の印象が強いように感じます。なのでMatlabの基本と言ったら基礎文法を説明するのが普通なのかもしれません。ですがこの記事の趣旨はMatlabの歩き方を知ってもらう事なので、基礎文法には触れません。まずはとにかくMatlabの実行の仕方を覚えましょう。

1. スクリプトの新規作成
ウィンドウの左上のプラスと表示されている新規作成ボタンを押します。

1. エディタでコーディング
エディタが出てくるはずです。ここでMatlab言語でプログラミングを行います。何か適当なスクリプトを書いてみてください。

1. 実行
できたら上部の再生ボタンのように見える実行ボタンを押すと、スクリプトが実行されます。これでMatlabを一応使えるようになったので、Matlabの文法を勉強できます。スクリプトは拡張子が.mのmファイルとして保存されますが、実行するたびに上書き保存されるので気をつけましょう。
 
スクリプト内で使った変数は実行後もワークスペースに残ります。ワークスペースは左側にある変数が表示されている所のことです。
ワークスペースにある変数をクリックすると、変数の中身を見る事ができ、非常に便利です。
この辺りの操作方法を知っていれば、行列の計算•for文•if文•グラフのプロット•データの読み書きなど、Matlabのプログラミング言語としての基礎練習を迷わずに行うことができるはずです。
 
#Matlabドキュメンテーション
基礎文法をある程度習得できたら、Matlab の豊富な組み込み関数を使用し、より高度な計算をしたくなります。使用する関数の名前を調べるときはGoogleで「matlab  関係する単語」のように検索しましょう。
すると、該当する組み込み関数などのMatlabドキュメンテーションがヒットするはずです。日本語で検索しても出てこない場合は英語で検索します。
※個人的な感想なのですが、ドキュメンテーション内で検索するよりもヒットしやすい気がします。
ドキュメンテーションの構成は左のカラムにまとまっています。はじめのうちは例をコピペしながらその関数の用法を少しずつ理解していくと良いでしょう。
入力引数と出力引数に何が指定されているのかに注意すると、Matlab の関数は数学や物理の関数と同じようなものなので、すぐに理解できるでしょう。
 ドキュメンテーションの読み方がわかってしまえば、後はやりたいことに合わせて知識を増やしていくだけです。for文を使ってグラフをアニメーションにしてみたり、画像や音声を読み込んで遊んでみたりと、色々やってみましょう。
 
#Matlab上達のために
Matlabには沢山の機能があります。全ては紹介しきれませんが、必ず使うであろう重要なものを列挙しておきます。ある程度Matlabに慣れてきたら、使えるようにしておく事をお勧めします。

1. スクリプトの関数化
関数は自分で簡単に作れます。コードが長くなってきたら積極的に関数化して整理しましょう。

1. データ型
Matlabには構造体やテーブル、セル配列といったデータ型があり、複数のデータをまとめて扱う事ができます。

1. Figureのプロパティ
グラフのフォントや文字サイズなどの体裁を細かく指定できます。

1. コマンドウインドウの操作
コマンドウインドウは出力やエラーの結果が表示されるだけでなく、mファイルの実行や簡易的に入力した実行文を試したりする、使用頻度の高い操作を行う場所でもあります。

1. デバッグ
スクリプトを実行したら、実行エラーは出てないのに結果がおかしいという事があります。そんな時はブレークポイントを指定し、実行を指定したところで一時停止させ、そのときの変数の値を確認する事ができます。

1. オブジェクト
 Matlabはオブジェクト指向プログラミングができるように設計されています。オブジェクトを扱う組み込み関数は意外によくあるので、自分でクラスを定義する気が無くても知っておく必要があります。
 
以上が初心者のためのMatlabの歩き方です。SimulinkやToolbox、アプリケーション、Matlab Centralなど、Matlabに関連する重要なものはまだまだありますが、上に書いた事が一通りできるようになればMatlabを使いこなせていると言って良いのではないでしょうか。
Bash on Windows をぶっ壊したときの復旧方法

とうとう使えるようになったBash on Windows！

というわけで自分も早速[Bash on Ubuntu on Windowsをインストールしてみよう！](http://qiita.com/Aruneko/items/c79810b0b015bebf30bb)とかに従ってインストールしました。

ちょっと見てみたところ/home/myhomeがなんか何処にあるかよくわからなかったので、ln -s /mnt/c/Users/myhome /home/myhomeとでもしようかと、

```
$ sudo mv /home/myhome /home/_myhome
```

したら**bashが固まったあげく`lxrun`でのインストールもアンインストールもできないにっちもさっちも逝かない状態になった**。

はい。インスコ即ぶっ壊しましたね。どうしよう。

たぶんなんかファイルシステムがイカレてるんだろうなと[【シェル芸人への道】Bash on Windowsを探検する](http://qiita.com/t_nakayama0714/items/9d7cfc5029a9b2ea423d)を参考にC:\Users\myhome\AppData\Local\lxssを消しに逝くも「使用中」とのこと。

おそらくLinux subsystemのせいだろうなと一旦Windowsの機能を切って再起動し、そこでlxssを_lxssにリネームしてからもう一回Linux subsystemを有効にして再起動すると`lxrun /install`が通るようになってましたね。

というわけで**Bash on Windows をぶっ壊したときは慌てず騒がずLinuxサブシステム機能を切ってlxssを消し飛ばしてからもう一回仕切り直しすると良さそう**ですよ。

ちなみにその後bash起動してない間にlxss/home/myhomeを_myhomeに移動し、`ln -s /mnt/c/Users/myhome myhome`することでhomeをWindowsのと合わせることにも成功しました。
XCTestでPrivateメソッドをテストする（Objective-C）

#はじめに
Objective-CのXCTestについてです。
プライベートメソッドをテストする方法を書きます。

#プライベートメソッドをテストするには?
パブリックメソッドはテストケースクラスに対象クラスをimportしてあげればテストできますね。

```objc:ModelTests.m
#import "Model.h"
```

ModelTestsはこれだけでModelクラスのパブリックメソッドをテストをできるようになります。
しかし、これだけだとプライベートメソッドのテストができません。

プライベートメソッドもテストしたいのでカテゴリを書きましょう！
テストケースクラスにカテゴリを書いて、テスト対象のプライベートメソッドを宣言してあげればいいんです。

```objc:ModelTests.m
#import "Model.h"

@interface Model (PrivateMethods)
- (NSString *)privateMethod;
@end
```

こんな感じにカテゴリを書いてあげることでプライベートメソッドもテストできます！

#テストしてみる
##テスト対象
テスト対象はこんな感じ。
パブリックメソッド1つ、プライベートメソッド1つです。

```objc:Model.h
#import <Foundation/Foundation.h>

@interface Model : NSObject
- (NSString *)publicMethod;
@end

```

```objc:Model.m
#import "Model.h"

@implementation Model
- (NSString *)publicMethod {
    NSString *string = @"publicですよー。";
    return string;
}

- (NSString *)privateMethod {
    NSString *string = @"privateですよー。";
    return string;
}
@end

```

##テストコードを書いてみる
`- (NSString *)publicMethod`と`- (NSString *)privateMethod`の
テストコードを書いてみましょう。

```objc:ModelTests.m
#import <XCTest/XCTest.h>
#import "Model.h"

// プライベートメソッドのカテゴリ
@interface Model (PrivateMethods)
- (NSString *)privateMethod;
@end

@interface ModelTests : XCTestCase
@property (nonatomic)Model *model;
@end

@implementation ModelTests

- (void)setUp {
    [super setUp];
    self.model = [Model new];
}

- (void)tearDown {
    [super tearDown];
}

#pragma mark - PublicMethods
- (void)testPublicMethod {
    XCTAssertEqualObjects([self.model publicMethod], @"publicですよー。");
}

#pragma mark - PrivateMethod
- (void)testPrivateMethod {
    XCTAssertEqualObjects([self.model privateMethod], @"privateですよー。");
}

@end

```

こんな感じでプライベートメソッドのテストコードも書くことができます！

#さいごに
カテゴリを書いて、宣言してあげるだけでパブリックメソッドと同様にテストすることが可能なので
プライベートメソッドもテストしてあげましょう！
preHandleに来るmethodがHandlerMethodとは限らない

もしかしたらやりがちなのかもしれない。まあObject型なんだから「ですよね？」という感じでもあるけど油断してたんです。

# situation
- HandlerInterceptorでリクエストの共通処理を実装
- preHandlerの引数methodをごにょごにょする
 - やっていたこととしては、handler methodにつけたアノテーションとそのパラメータで色々処理をするというもの
 - handler methodはずばりHandlerMethodという型でやってくる
 - HandlerMethodからreflectionのMethodを引っ張ってくる必要があった
- methodがHandlerMethodで何故かキャストできなくて死

# 何が起きた
- 「PreFlightHandlerはHandlerMethodにキャストできません！」的なエラーを吐いた

# PreFlightHandlerとは
situationの項に書かなかったこととして、「Corsのアクセスを捌いていた」というものがあります。

Corsはpreflightリクエストが飛んでくる……ハッ

# つまり？
対処としては、ちゃんとキャストできるか確かめましょう、でしかないわけですが、思ってもみない中身が飛んできたのでびっくりした次第でした。

この`method`に普通どんなものが来うるのか、リファレンスか何かに書いてあったら教えていただけると幸いです。
Rails 初学笔记

gem的使用说明

```
gem -v 告訴你 RubyGems 的版本
gem update --system 升級RubyGems的版本
gem install gem_name 安裝某個套件
gem list 列出安裝的套件
gem update gem_name 更新最新版本
gem update 更新所有你安裝的Gems
gem install -v x.x.x gemname 安裝特定版本
gem uninstall gem_name 反安裝
```

```
$ bundle install
```
可以只輸入bundle就是bundle install了。 每次有修改Gemfile這個檔案，都需要重新執行bundle

```
# 新增
> event = Event.new
> event.name = "Ruby course"
> event.description = "fooobarrr"
> event.capacity = 20
> event.save # 儲存進資料庫，讀者可以觀察另一個指令視窗
> event.id # 輸出主鍵 1，在 Rails 中的主鍵皆為自動遞增的整數 ID

> event = Event.new( :name => "another ruby course", :capacity => 30)
> event.save
> event.id # 輸出主鍵 2，這是第二筆資料

# 查詢
> event = Event.where( :capacity => 20 ).first
> events = Event.where( ["capacity >= ?", 20 ] ).limit(3).order("id desc")

# 更新
> e = Event.find(1) # 找到主鍵為 1 的資料
> e.name # 輸出 Ruby course
> e.update( :name => 'abc', :is_public => false )

# 刪除
> e.destroy
```
Migration檔案不需要和Model一一對應，像我們來新增一個Migration檔案來新增一個資料庫欄位，請執行:

```
$ rails g migration add_status_to_events
```
spring-cloud-aws入りのspringをlocalで動かすと怒られる

> The region can be automatically detected or explicitly configured
>> http://cloud.spring.io/spring-cloud-aws/spring-cloud-aws.html#_configuring_region

公式リファレンスにさらっと書いてあるわけですが、spring-cloud-awsはデフォルトで自身が動いているサーバーのregionを取得しようとします。もしAWS環境（EC2）内で立ち上がったものではないspringアプリケーションだった場合、regionを検出できなくて怒られ、起動に失敗します。

regionの検出についてはEC2のインスタンスメタデータを参考にしていただきたいのですが、つまりメタデータがそもそもない環境だから見に行こうとして死ぬわけですね。

local環境に限らずEC2以外で動かすには上記の節を参考に、

```application.yml
cloud.aws.region.auto: false
cloud.aws.region.static: "${your_region}"
```

と、手動で設定してあげましょう。
GoogleAppsScriptでSlack OAuth2認証

Slack Event APIをGASで使おうとして失敗した

# ScriptEditorから新規スクリプト作成

https://script.google.com

ここを開いて保存する

# ライブラリを追加する

https://github.com/googlesamples/apps-script-oauth2

OAuth2用のライブラリを追加する

ツールバーの[リソース]->[ライブラリ...]にを選択して以下のIDを入れて選択

`1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF`

最新のバージョンを選択して保存する。

# Slack Appsを登録

https://api.slack.com/apps/new

ここで登録する。

Redirect URIに`https://script.google.com/macros/d/{SCRIPT ID}/usercallback`を設定する`
{SCRIPT ID}`はスクリプトエディターのツールーバーの[ファイル]->[プロジェクトのプロパティ]から確認できる。

# コードを書く

SlackAppsの管理画面から`Client ID`と`Client Secret`をコピペする
細かい説明はコメントとライブラリのGitHubへ

```js:コード.js
var clientID = "...";
var clientSecret = "...";

// doGetはWebアプリケーションとして公開したとき呼ばれる関数
// HTMLとかを返す
function doGet(request) {
  var slackService = getSlackService();
  // アクセストークンを持ってるか調べる
  if (!slackService.hasAccess()) {
    var authorizationUrl = slackService.getAuthorizationUrl();
    var template = HtmlService.createTemplate('<a href="<?= authorizationUrl ?>" target="_blank">Authorize</a>.');
    template.authorizationUrl = authorizationUrl;
    return HtmlService.createHtmlOutput(template.evaluate());
  } else {
    return HtmlService.createHtmlOutput('OK');
  }
}

// slack から戻ってきた時呼ばれる関数 HTMLを返せる
// 本来はリダイレクトしてアプリケーションに戻ってもらうのがいい
function authCallback(request) {
  var slackService = getSlackService();
  var isAuthorized = slackService.handleCallback(request);
  if (isAuthorized) {
    return HtmlService.createHtmlOutput('Success!');
  } else {
    return HtmlService.createHtmlOutput('Denied.');
  }
}

// 手動実行して消せる
function clearService(){
  OAuth2.createService('slack')
  .setPropertyStore(PropertiesService.getUserProperties())
  .reset();
}

// OAuth2の設定
function getSlackService() {
  return OAuth2.createService('slack') // 任意の名前 slack使うからslackにしてる
  .setAuthorizationBaseUrl('https://slack.com/oauth/authorize')
  .setTokenUrl('https://slack.com/api/oauth.access')
  .setClientId(clientID)
  .setClientSecret(clientSecret)
  .setCallbackFunction('authCallback')
  .setPropertyStore(PropertiesService.getUserProperties()) // https://developers.google.com/apps-script/guides/properties
  .setScope('bot chat:write:bot channels:read channels:history'); // 複数scopeはスペース区切り
}
```

保存したら

ツールバーから[公開]->[ウェブアプリケーションとして導入]を選択して公開する。

# 作ったTokenを使うには

`slackService.getAccessToken()`でアクセストークンが取得できる

取得したTokenの使い方は自分でpayload作ってもいいのだがめんどくさいので @soundTricker さんが作ったSlackライブラリを使うのが一番手っ取り早い 詳細は以下の記事を参考にしてください

[Slack BotをGASでいい感じで書くためのライブラリを作った](http://qiita.com/soundTricker/items/43267609a870fc9c7453)

初期化コードはこんな感じ

```js
var slack = SlackApp.create(getSlackService().getAccessToken());
```

# まとめ

OAuth2のライブラリ便利だー

ちなみに失敗したってのはSlackのEvent APIを受け取るdoPostでリザルトのJSONへ辿り着くのにリダイレクトが一回挟まるが
Slackは別にリダイレクトしてくれないためエラーとなるからです。

起きたらAppEngineでリトライする
プロトコル指向プログラミングについて調べてみた


プロトコル指向プログラミングという概念について、調べたことをまとめてみました。

##プロトコル指向プログラミングとは
ものすごくざっくりいうと、プロトコル(Javaでいうインターフェース)を使ってプログラミングしようという概念です。

##なんでプロトコル？
オブジェクト指向の問題を解決するためです。
どんな問題かというと、以下の点が問題でした。

+ オブジェクト同士が他のインスタンスを共有していることを知らずに参照してしまう（暗黙の共有）
+ 親クラスのメソッド、プロパティをそのまま引き継ぐため、初期化や上書きなどの調整が必要になる
+ 複数のサブクラスを作ってもそれらを関連付けする方法がないため、
型が統一できない

このような問題点がオブジェクト指向にはあるため、プロトコルを使ってクラス関係の壁をなくそうということで、プロトコルを使うのです

##実際にやってみた

概念だけだとわかりづらいので、実際のコードで説明します
例えば、こういうプロトコルがあったとします

```Person.swift
protcol Person {
    var name : String { get set }
    var age : Int { get set }
    
    // 人間なので息を吐かせます
    func breath()
}
```

人間の情報をプロトコルにしました
で、このプロトコルを職業がエンジニアの人とアイドルの人に準拠させます

```Engineer.swift
struct Engineer : Person {
    var name: String = "watasi"
    var age: Int = 21

    func breath() {
        print("すぅ〜〜〜〜〜はぁ〜〜〜〜〜")
    }
}
```

```Idol.swift
struct Idol : Person {
    var name: String = "Takagaki"
    var age: Int = 25

    func breath() {
        print("すぅ〜〜〜〜〜はぁ〜〜〜〜〜")
    }
}
```

これで二人共、人間になれました
が、それぞれ同じ処理を準拠させた構造体( `struct` )に実装しなければなりません。
面倒ですね。

これをSwiftの機能であるプロトコル拡張を使って処理をまとめてみましょう。

```Person.swift
protcol Person {
    var name : String { get set }
    var age : Int { get set }
        
    func breath()
}

// プロトコルを拡張してメソッドを実装
extension Person {    
    func breath() {
        print("すぅ〜〜〜〜〜はぁ〜〜〜〜〜")
    }
```

これで準拠させた構造体にそれぞれ同じ処理を書く必要がなくなるのっで以下の記述のみでOK

```Engineer.swift
struct Engineer : Person {
    var name: String = "watasi"
    var age: Int = 21
}
```
```Idol.swift
struct Idol : Person {
    var name: String = "Takagaki"
    var age: Int = 25
}
```
こんな感じで、プロトコルで準拠させたクラスもしくは構造体にそれぞれ同じ処理を書かなくても、プロトコルに実装すれば効率の良いコードが書けるようになります。

##メリットはなんなの
・処理をまとめることができるので、コードが綺麗に書けるようになるよ
・プロトコルは実体を持たないので、メソッドをオーバライドする必要がないよ

##まとめ
プロトコル指向プログラミングとは、オブジェクト指向でやってきたクラス継承をプロトコルで行ってしまおうという考え方。
クラス間で共通の処理とプロパティがあるならプロトコルにかいてまとめちゃおう！
もちろんSwiftはオブジェクト指向でプログラミング可能ですが、そのオブジェクト指向の弱点であった部分を、Swiftではプロトコル指向の考え方を使って補いましたって話でした。

##参考記事
[Swift では Protocol を積極的に使おう - Qiita](http://qiita.com/mokumoku/items/2744c68fdb4bb53d0376)
[Swiftにおけるプロトコル指向プログラミング](https://www.infoq.com/jp/news/2015/06/protocol-oriented-swift)
リリースしたiOSアプリのクラッシュログを収集する

リリースしたiOSアプリが、ユーザーの端末でクラッシュすること、よくありますよね（テヘペロ）。
どれくらいクラッシュしているのか、そしてコードのどの位置でクラッシュしているのか。実はXcode7以降ならば、自動で結構役立つログが取れるんです。

1. アプリをアップロードしたXcodeを起動する。
2. "Window - Organizer"でOrganizerを開く。
3. 左のペインから対象となるアプリを選択する。
4. Crashesセグメントを選択する。

これだけで、下のようなクラッシュログが取得できます。
さらにスタックトレースをクリックすると、該当のソースコードにタグジャンプすることができます。

![image](https://qiita-image-store.s3.amazonaws.com/0/75307/93b921c0-b89c-a38e-1f94-b2d833315059.png)

詳しくは公式ドキュメントを参照してください。

https://developer.apple.com/library/ios/recipes/xcode_help-crashes_organizer/AboutCrashesOrganizer/AboutCrashesOrganizer.html#//apple_ref/doc/uid/TP40015147-CH1-SW1
Rails5にActive Admin

[Rails 4 ＆ Active Admin](http://qiita.com/hkusu/items/3b0fb7f94a254e2ed6fd)

Gemfile

```
gem 'activeadmin', github: 'activeadmin'
gem 'devise'
gem 'inherited_resources', github: 'activeadmin/inherited_resources'
gem 'ransack',             github: 'activerecord-hackery/ransack'
gem 'draper',              '> 3.x'
```



```
bundle install
```

インストール

```
rails g active_admin:install
rails db:migrate
rails db:seed
```
※ 5からは、rakeじゃなくてrails

お試し

```
rails g model Article title:string sentence:string
rails g active_admin:resource Article
```

[Rails 4 ＆ Active Admin](http://qiita.com/hkusu/items/3b0fb7f94a254e2ed6fd)
[質問]追加した要素にjQuelyでclassを追加する

jsで要素を追加した後に、追加した要素がクリックされるとjQuelyでclassがつくようにしたいのですがどうしたらいいのでしょうか？
以下のコードが動かなくて困っています。

```
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <h1>テスト</h1>
    <div id="test"></div>

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
    <script>
    (function(){
      'use strict';
      
        function show(){
        var div_element=document.createElement("div");
        div_element.id="hogehoge";
        div_element.innerHTML='あいうえお';
        var parent_object=document.getElementById('test');
        parent_object.appendChild(div_element);
      }

      addEventListener('load', function(){
        show();
      });

      $("#hogehoge").on("click", function(){
      $("#hogehoge").toggleClass("hogehoge");
      });

    })();
    </script>

  </body>
</html>
```
Swiftでスクリーンショットを取得する


## サンプルコード

```swift:ViewController.swift
class SampleProject : UIViewController {

    @IBOutlet weak var screenShot: UIImage!
    var capturedImage : UIImage?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setup()
    }
    
    private func setup() {
        capturedImage = getScreenShot() as UIImage
        screenShot.image = capturedImage
    }

    private func getScreenShot() -> UIImage {
        let rect = self.view.bounds
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
        let context: CGContextRef = UIGraphicsGetCurrentContext()!
        self.view.layer.renderInContext(context)
        let capturedImage : UIImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return capturedImage
    }
}
```
Windowsログイン時のローカルユーザーの指定は「.\ユーザー名」でOK

ActiveDirectoryに参加しているWindowsマシンの場合、
ローカルユーザーでログインする場合は「コンピューター名\ユーザー名」
という形でユーザー名を指定しします。

コンピューター名を入力するのが意外と手間なわけですが「.\ユーザー名」
という指定の仕方でも大丈夫です。

![Image7.png](https://qiita-image-store.s3.amazonaws.com/0/124069/2beb6a3d-28c2-6a58-9b7f-504a5e4a435c.png)

※WindowsXPまでは、コンボボックスでログオン先として
「*コンピューター名*（このコンピュータ）」というのを選べばよかったので楽だったのですが。
XCTestをとりあえず使ってみた。

#XCTestってなに？
iOSの単体テスト用のフレームワークで、
Xcodeでプロジェクトを作った時に一緒に作られているものです。

#とりあえず使ってみよう。
難しいことは考えず、どんなものかとりあえず実装してみましょう。

動きの確認なのでこのぐらい簡単に書いてみます。
`a + b`の結果を返すだけの記述です。

```swift:Sample.swift
import Foundation

class Sample{
    func add(a:Int,b:Int) -> Int {
        return a + b;
    }
}
```

こっちは○○○Testsのフォルダに

```swift:SampleTest.swift
import XCTest

class SampleTest: XCTestCase {
    
    override func setUp() {
        super.setUp()  
    }
    
    override func tearDown() {
        super.tearDown()
    }

    func testOK() {
        
        XCTAssertEqual(5, Sample().add(2, b: 3));
    }
    
    func testNo() {
    
        XCTAssertEqual(6, Sample().add(2, b: 3));
    }

}
```

⌘＋UでTestを実行してみるとこのような結果に

![スクリーンショット 2016-08-04 23.15.44.png](https://qiita-image-store.s3.amazonaws.com/0/134329/d5894623-e87e-fd72-4ed9-6a5107b6b3ef.png)


`XCTAssertEqual(5, Hello().add(2, b: 3));`
`XCTAssertEqual(6, Hello().add(2, b: 3));`
のそれぞれにマークが付いていますね。

これは`XCTAssertEqual`の部分が右と左がイコールかどうか、
つまり`5`or`6`と`Hello().add(2, b: 3)`の結果がイコールかをチェックしています。

なので上記の結果のように、上の`func testOK()`は緑の成功マーク
下の`func testNO()`は赤の失敗マークがつきます。

#感想
このように本来は直接打ち込んだり、アプリを操作して行うテストを、
コードで記述してしまうことで、自動的に行えるようになります。

いやー便利便利。
作ったアプリのテストで、散々手動で値の入力などを行っていたので、
もっと早く知りたかったですね。（そもそも知らなかったのが問題、、、）

`XCTAssertEqual`の部分の記述は、`XCTAssertTrue`、`XCTAssertFalse`など、
種類はいくつかあるようなので、用途に合うものを使って実装してみてください。

まだまだ不十分なところも多いとは思いますが、今回はこのぐらいで終わりです。
またそのうち追記していきますね。
Cajaで選択したファイル等を新規作成フォルダにまとめるスクリプトを作りました

> ※この記事は私の[ブログ](http://nmtysh.hatenablog.com/entry/2016/08/04/231102)にも投稿しています。

Ubuntu MATEのCaja(Nautilus)上でファイルやフォルダを整理する場合、

1. 新しいフォルダを作成
2. まとめたいファイルなどを選択
3. 作成したフォルダに移動

といくつかの操作を行う必要があります。
それなりに量がある場合にこれらの操作を毎回行うのは手間なので、
選択したファイルなどを新規作成フォルダに移動するシェルスクリプトを作成しました。


# 0. 環境

- Ubuntu MATE 16.04 LTS


# 1. スクリプトファイルを作成する

`~/.config/caja/scripts` に任意のファイル名でファイルを作成します。

    #!/bin/bash
    
    # 選択したファイルやフォルダを新しく作成したフォルダに移動する
    
    # フォルダの作成。失敗したら終了
    folder=$(date "+%Y%m%d_%H%M%S_%N")
    mkdir ./${folder} || exit 1
    
    # 作成したフォルダへ移動する
    for arg
    do
        mv "${arg}" ${folder}/
    done
    exit 0


# 2. 実行権限を付与する

作成したスクリプトファイルに実行権限を付与します。

```bash
$ chmod u+x ~/.config/caja/scripts/move.sh
```


# 3. Cajaから実行する

まとめたいファイルやフォルダを選んで、コンテキストメニューの「スクリプト」→「(1で作ったスクリプト)」を選択してスクリプトを実行します。
時刻を元にしたフォルダが作成され、その中に選択していたファイルなどが移動されます。

スクリプトで移動していますので「元に戻す」操作ができないという欠点があります。
間違えた場合は手動で戻してください。

日本語って難しい……
Clang with Microsoft CodeGen(2016/07版)でWindows.hを使うときに注意すべきこと

# 初めに
みなさん、Clang with Microsoft CodeGenは使ってますか？

まだの方は半年前に投稿した記事ですが

Clang with Microsoft CodeGenがでたので試す
http://qiita.com/yumetodo/items/bd41f31f39dd590e8c80

を見ましょう。地味にこまめに更新してます。

どんどん使える子になってきてるのでどんどん使ってあげましょう。コンパイルエラーわかりやすいですし。

# かつて存在した問題

Clang with Microsoft CodeGen(July 2016)では、Windows.hをincludeすると

```
C:\Program Files (x86)\Windows Kits\8.1\Include\um\combaseapi.h(229,21): error : unknown type name 'IUnknown'
          static_cast<IUnknown*>(*pp);    // make sure everyone derives from IUnknown
```

とか怒られていました。

**一体いつからかこれは修正されました(2016/12現在)**

# 解決策

というわけでClang with Microsoft CodeGen(July 2016)でもコンパイルが通るように

```cpp
#if defined(__c2__) &&  __clang_major__ == 3 && __clang_minor__ == 8
//To avoid compile error
//C:\Program Files (x86)\Windows Kits\8.1\Include\um\combaseapi.h(229,21): error : unknown type name 'IUnknown'
//          static_cast<IUnknown*>(*pp);    // make sure everyone derives from IUnknown
struct IUnknown;
#endif
#include <Windows.h>
```

としましょう。COM周りを使わなければClang with Microsoft CodeGen(July 2016)でもコンパイルが通るし、それ以外のバージョンにも被害は出ません。おまじない代わりにいかがですか？
Bash on Windows で powerline を使うまで

# 環境
Windows 10 Build 14393

# インストール
1. Winマークを右クリック>プログラムと機能>Windows の機能の有効化または無効化>Windows Subsystem for Linux (Beta)　にチェック
2. 設定>開発者向け>開発者モード
3. 再起動
4. コマンドプロンプトを開き `bash` でインストールが始まる
5. UNIXユーザー名とパスワードを求められるので入力してインストール完了

# セットアップ
```zsh
sudo apt-get update
sudo apt-get upgrade
```

途中`sudo: unable to resolve host`と表示されるのでホストを追加してやる

```bash
sudo sh -c 'echo 127.0.1.1 $(hostname) >> /etc/hosts'
```

## 各種インストール
### zsh
必須じゃないけどなれたらbashに戻れないので

```bash
sudo apt-get install zsh
```
#### 次回起動時にzshが実行されるようにする
`chsh`で`/etc/passwd`を変更してもbashで立ち上がるので以下のようにする。
1. `#mv /bin/bash /bin/.bash`でbashのバイナリを退避させる
2. 以下のシェルスクリプトを/bin/bashとして保存
3. `#chmod 755 /bin/bash`で実行可能な状態にする

```bash:/bin/bash
#!/bin/sh
export SHELL=/bin/zsh
exec $SHELL
exit 
 ```
### Git
```bash
sudo apt-get install git
```
### powerline
```bash
sudo apt-get install python-pip
sudo pip install --user git+git://github.com/powerline/powerline
```
パスを通す

```bash:.zshrc
export PATH=$PATH:~/.local/bin/
```
zshで使う

```bash:.zshrc
powerline-daemon -q
. ~/.local/lib/python2.7/site-packages/powerline/bindings/zsh/powerline.zsh
```

#### powerline用のフォントのインストール
powerline/fonts/
https://github.com/powerline/fonts/
~/.fontsに入れても使えないので各.ttfをダウンロードしてインストールしてコンソールから指定する

# 代替コンソールを使う
コマンドプロンプトだとフォントを変えても再起動するとMSゴシックになってるのでConEmuを使う
ConEmu 
https://conemu.github.io/

1. 初回起動時に設定画面が出るのでBashを選択する
2. Setting>Main>Main console font をさっき入れたフォントにする

# 再インストール
なんかやらかした時用

```shell:cmd.exe
lxrun /uninstall
lxrun /install
```
エラーが出てインストール出来ないので再起動してから再度 `lxrun /install`する

# 参考
Error reinstalling bash - Error 0x80070005
https://github.com/Microsoft/BashOnWindows/issues/473#issuecomment-224708711
Bash on Ubuntu on Windowsのアンインストール・インストール方法はどうしたらいいのか?
http://blog.sfpgmr.net/entry/2016/04/09/142344
sudo: unable to resolve host が表示されたら
http://qiita.com/ogomr/items/89e19829eb8cc08fcebb
Ubuntu on Windows で zshをデフォルトシェルにする
http://qiita.com/nsmr0604@github/items/7dd38faed1abd9189a83
UITableViewの最上部に移動するスニペット

UITableViewを使用している時、テーブルの最上部に戻したい時が多くある。
そんな時は下記のように`scrollToRowAtIndexPath`を用いる。

```swift
let indexPath = NSIndexPath(forRow: 0, inSection: 0)
self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: false)
```
くそブログを参考にしないために気をつけたいこと３つとオマケ🎁

まだ記事を投稿するだけの貯蓄&知識がないので、手始めにタイトルの、つまづいた経験を元に書きます。

こんな人にオススメします。

 - 早とちりしやすい人
 - 非エンジニア(私もそうです)


___

:cry:「あ〜もうつまづいて作業進まんし、わけわからん！」
と、混乱してとりあえず検索したくなる気持ちはすごくわかります。

その頭で記事を検索した時にした恐ろしい経験が以下です。

# 記事の通りコードを書き進めたら、「これでは通らなかったので注意」で終了
タイトルと、冒頭の少しで、これは自分と同じだ！と思って、すぐにその通りコードを書き直してしまったのが間違いでした。

まずは **記事全文確認すること** をオススメします。

# これだ！（→実装後）先輩「これ違うね^^」
jQueryのライブラリを使って、ごりごり実装を進めていたときのことでした。

途中エラーが出てつまづいた時、（適切なワードがわからず）検索ワードをいろいろ変えながら調べているうちに、いつの間にか最初につまづいていたところと、全然違うことを調べていました。

最初は「Aをやりたい！でも、エラーが出る」というところで検索を始めたのに、見つけた記事でやってみたら別のエラーが出る、そのエラーを解消するために別のワードで検索して、それを試す、、、ということを繰り返しているうちに、最初のAから少しずつ遠ざかっていた、ということです。

人に聞く時も、検索する時も、**「この◯◯でやりたい！」という軸を忘れず探す**ことが大事だと思いました。（当たり前だけど）

# 最後は自分で考える
つまづいている時間が嫌で、とりあえず検索したり、人に聞いたりしました（たくさん迷惑かけました:sweat_drops:）が、「**今これだけ時間をかけてやる必要があるのか？**」そもそもを考えてみるというのもありです。

自身のお勉強のためなら、根気だしてやってみてもいいかもしれないし、
お仕事なら締め切りが当然あるので、できる人にお願いするという選択肢もあります。


# オマケ？:gift:
当たり前のことかもしれませんが、虫の目になりがちな自分は、これを心がけています。

 - 処理の最終目的をノートや紙、ふせんに書いて、終始目に入るところに置く
 - 時間を置く
    - 散歩だと腰にも血が巡るので、体もスッキリしておすすめ:two_hearts: 
 - ご飯orお菓子を食べる
    - 頭に栄養がいってないかも？？ご飯は大事:exclamation: 
 - プロにお聞きするとしたらどう伝えるか考える
    - 考えている途中に、別にこの方法でなくても良いのでは？と思うこともしばしばアリ（遅いけどココでようやく俯瞰できる）

おわり
EditorスクリプトはEditor以外で使えない。逆は可能

ディレクトリ構成
Assets
┣Test.cs
┗Editor
　　┗TestEdtior.cs


```csharp
public static class TestEdtior
{
	public static void bbb ()
	{
		Test.aaa(); // これはOK.
	}
}
```

```csharp
public static class Test
{
	public static void aaa ()
	{
		//TestEditor.hogehoge(); // これは参照できない.
	}

}
```