OmniAICreator/Qiita-1.07M huggingface dataset:
『AngularJSアプリケーション開発ガイド』第3章 Yeoman周りが動かない問題について


『AngularJSアプリケーション開発ガイド』は、2014年4月に出た本ですが、原書は2013年4月です。ドッグイヤーなWeb業界でも特に変化の激しいフロントエンド技術の世界では、「一昔前」の本といってもよいでしょう。

そんな事情もあり、『AngularJSアプリケーション開発ガイド』は、サンプルコードがAngularJS 1.3以降では動かないという問題もありますが、今回は第3章のYeoman周りの動かし方について解説します。

## ソフトウェアのバージョンについて

以下の環境で動作確認しています。

- OS X 10.10.3
- Node.js v0.12.4
- npm 2.10.1
- yeoman 1.4.7
- bower 1.4.11
- gulp 3.8.11
- AngularJS 1.3.16

## Yeomanについて

[Yeoman](http://yeoman.io/)のもつ機能は、『AngularJSアプリケーション開発ガイド』によると、

- きわめて高速なスキャフォールディング
- 組み込みのプレビュー用サーバ
- パッケージ管理機能の統合
- 簡単なビルドのプロセス
- PhantomJS を使ったユニットテスト

とされています。しかし、現在のYeomanは、このうち、スキャフォールディング（アプリケーションの骨組み作成）に特化したツールになっています。他の機能については、それぞれに代替となるツールが登場しているためです。

それでは、『AngularJSアプリケーション開発ガイド』と同様の流れで、2015年6月現在の動かし方をみていきましょう。

## Yeomanのインストール

[Node.js](https://nodejs.org/)をインストールすると、npmコマンドもインストールされます。その上で、

```
npm install -g yo
```

を実行すれば、グローバルにyoeman(yoコマンド)がインストールされます。『AngularJSアプリケーション開発ガイド』にある「yeoman」コマンドは、現在はなくなっていて、コマンドは「yo」になっています。

## AngularJS プロジェクトの新規作成

まず、bowerとAngularJS向けのジェネレータをインストールします。

[bower](http://bower.io/)はWebフロントエンドのパッケージ管理ツールです。

ジェネレータとは、Yeomanにおけるアプリケーションのテンプレートのようなもので、AngularJS用として著名なものには[generator-angular](https://github.com/yeoman/generator-angular)があります。しかし、generator-angularは、gruntという現在では人気の無いタスクランナーを使っているため、今回は[generator-gulp-angular](https://github.com/Swiip/generator-gulp-angular)を使います（grunt版が読みたい方は、[http://ryo511.info/?p=3247](http://ryo511.info/?p=3247)を参考にしてください）。

```
npm install -g bower generator-gulp-angular
```

インストールが終わったら、適当なディレクトリに移動して、

```
mkdir myapp
cd myapp
yo gulp-angular myapp
```

でAngularJSアプリケーションのスキャフォールディングを開始します（ここでは「myapp」というディレクトリに「myapp」というアプリケーションを作成しています）。

対話形式で、いくつか質問がされます。基本的に、return連打で大丈夫です。AngularJS 1.3と、jQuery 2、そしてAngularJS用のライブラリがインストールされます。

スキャフォールディングが完了すると、以下のようなディレクトリ構造になっているはずです。

```
$ tree -L 1
.
├── bower.json
├── bower_components
├── e2e
├── gulp
├── gulpfile.js
├── karma.conf.js
├── node_modules
├── package.json
├── protractor.conf.js
└── src
```

## サーバの実行

「yeoman server」コマンドは、もうありません。かわりに、gulpを使います。

[gulp](http://gulpjs.com/)は、タスクランナーと呼ばれるツールで、様々なスクリプトの実行を行ってくれます。

gulpのインストールは、以下のコマンドで行います。

```
npm install -g gulp
```

yeomanが生成したgulpfile.jsには、ローカルサーバを起動するための記述が含まれています。サーバの起動には、

```
gulp serve
```

を実行します。実行すると、localhost:3000でWebサーバが起動し、ブラウザのタブが自動で開かれます。

![allo_gulp_angular.png](https://qiita-image-store.s3.amazonaws.com/0/33450/67dd2dd3-8e27-0d80-182e-6d29a077c15b.png "allo_gulp_angular.png")


## ルート、ビュー、コントローラの追加

generator-gulp-angularでは、ルート・ビュー・コントローラを一発で追加するコマンドは用意されていないようです。generator-angularであれば、

```
yo angular:route routeName
```

で追加できるので試してみてください。

## テストのストーリー

テストもgulpで実行します。

```
gulp test
```

## プロジェクトのビルド

これも同様にgulpで。

```
gulp build
```

以上、AngularJSアプリケーションをYeomanを使って初期化する方法をみてきました。
本記事は、2015年6月13日現在の情報です。数カ月後には古くなっている可能性が高いのでご注意を。。。
つまるところ、meta タグ viewport って何なの？

meta タグ viewport はスマホ用のページを作成する上で欠かせない。

けれども僕は、この meta タグ viewport を設定することで、何がどうなるのか？
についてまったく理解していなかった。

そこで、小一時間程調べてみた。
そのメモをここに残す。

間違っていたらご指摘お願いします。

# Viewport とは

```viewport``` とは何か？おそらく文脈によって```viewport```は様々な意味として解釈される。

まずは、```viewport```という用語を定義する。
http://eow.alc.co.jp/search?q=viewport&ref=sa

```viewport``` とは表示領域のことである。領域なので、サイズ（広さ）を持つ。

Web 開発の文脈において、```viewport```という用語は様々な意味として解釈される。
あるときはデバイスの画面。あるときはブラウザ。あるときは可視領域。
まずは、これらの曖昧さを除去するために、より具体的な```viewport```を定義する。

以下のページがとても参考になるので拝借させていただく。
http://www.quirksmode.org/mobile/viewports2.html

viewport には 2 種類ある。

- visual viewport
- layout viewport

また、これとは別に、デバイスの画面がある。ここでは、```viewport```とは呼ばずに```screen```と呼ぶ。

- screen size

上記の 3 つは明確に異なる。

また、もう一つの概念を定義する。

- zoom level

これは何だ？という質問は後で解決する。とりあえず定義する。

### layout viewport
```layout viewport```とは HTML 要素のサイズである。
ブラウザのサイズを変えたとしても、```layout viewport``` のサイズは変わらない。

### visual viewport
```visual viewport```とはブラウザの可視化領域に表示されている HTML 要素のサイズである。
ブラウザのサイズを変えると、表示される部分が変わるため、```visual viewport``` のサイズも変わる。

### screen
```screen``` とはデバイスの画面である。PC なら、そのディスプレイ。iPhone 6 Plus であれば、その幅は 414、高さは 736 である。
ブラウザのサイズを変えたとしても、```screen size``` のサイズは変わらない。

### zoom level
```visual viewport```の幅を```screen```の幅で割ったもの。

# iPhone 6 Plus における layout viewport, visual viewport, screen のサイズ

以下の HTML を参考にする
https://gist.github.com/anonymous/db97a4364f8068b47e60

screen のサイズは 414x736
body 要素の layout viewport のサイズは 1000x1000
このとき、iOS Safari で表示した場合、visual viewport のサイズはどうなるだろう？
https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/UsingtheViewport/UsingtheViewport.html において紹介されているように、iOS Safari はそのデフォルトにおいて、visual viewport のサイズを幅 980 としてしまう。だが、実際の screen の幅 414 であるため、ページの文字がとても小さくなってしまう。

要するに、iOS Safari において、幅 980 までが可視化されるが、screen の幅が 414 であるため表示しきれない。このときブラウザの挙動として、表示する HTML 要素を縮小する。実際の大きさよりも 0.4 倍の大きさで表示される。（```414 / 980 = 0.42244897959183675```）

この 0.4 が zoom level である。

# meta タグ viewport を設定するとどうなるか？

meta タグ viewport において、iOS Safari のデフォルトの```visual viewport```の幅を変えることができるのである。

https://gist.github.com/anonymous/20ec27d8963c3002fb39

meta タグ viewport のリファレンス的なページはたくさんあるのでググったほうが良い。
TestFlightにおける内部テスターと外部テスターの比較と使い分け


# 背景

iOSアプリを他人にテストしてもらう時に利用できるTestFlightの仕様についてまとめた。
どのような形でテストユーザーにアプリを配布するか検討した時に、TestFlightについてまとまって書かれているページが意外と見つからなかったのでここに記録しておく。特に、内部テスターと外部テスターの違いについて比較している。
また最後に、筆者の場合のTestFlightの利用方法についても記載した。

# TestFlightの仕様

## 内部テスター・外部テスター共通の仕様

* TestFlightを利用できるのはiOS8以上
	* TestFlightアプリをAppStoreからインストールする必要がある
* アップロードしたビルドのテスト有効期限は30日

## 内部テスターの仕様

* 最大25ユーザーまで登録可能
* 1ユーザーあたり端末は10台まで利用可能
* 当該アカウントに対して管理者もしくは開発者権限を持ったiTunesConnectユーザーのみ登録可能
	* iTunesConnectユーザーへの登録には **AppleIDではない** メールアドレスが必要
	* メールアドレスは、新しくAppleIDとして登録される

## 外部テスターの仕様

* 最大1000ユーザー(≒1000メールアドレス≒1000端末)まで登録可能
	* 一度登録したテスターの削除もできる
* メールアドレスを登録すれば利用可能
	* メールアドレスは特にAppleIDである必要はない(AppleIDでもよい)
	* 登録されたメールアドレスに対して外部テスターへの招待メールが送られてくる
	* そのメールに記載してあるURLをiOS端末で開くと、端末のAppleIDに対してテスターの権限が紐付けられる
* アプリに対して最初のビルドに対しては、テスターに配信する前に審査が必須
	* 通常のアプリ審査とは異なり1、2営業日程度で完了することが多いらしい
	* 公式には30日以内の審査との記載がある
* 2回目以降(更新用)のビルドに関しては「重要な変更」がある場合は審査が必要
	* ただし「重要な変更」かどうかは自己申告
	* 軽微な修正の場合はすぐに変更が反映される

# 筆者の場合の使い分け

上記の違いを踏まえて、筆者の場合の使い分けを書いておく。

TestFlightを利用したテストを行ってもらいたいユーザーは、基本的に外部テスターとして登録する。テストに参加してもらうためには、メールアドレスを一つ聞いておくだけでよい。最初のビルドに対する審査だけは多少時間がかかるが、二回目以降はすぐに更新が反映できるため大きな問題にはならない。

内部テスターは先にiTunesConnectユーザーとしての権限を付与する必要があるため、単なるテスターとして登録してもらう場合は利用することはない。元々管理者または開発者として登録していたユーザーに、ついでに内部テスターとして登録してもらう程度だ。

内部テスターとして登録してもらうくらいだったら、adhoc版をビルドして共有する。そちらのほうが、端末のUDIDを確認してもらうだけで利用でき、手軽だ。もし開発中のアプリがiOS7以前にも対応するとすれば、いずれにせよadhoc版を用意する必要がある。iOS7以前の端末に対してはTestFlightが利用できないからだ。

まとめると、開発グループ内向けのテストはiOSのバージョンが限定されないadhoc版で行い、開発グループ外のユーザーにテストしてもらう場合には、メールアドレスひとつで登録できるTestFlightの外部テスターとして利用してもらうということになる。

# 参考

TestFlight Beta Testing - App Store - Apple Developer
https://developer.apple.com/testflight/

iOS - TestFlightのExternal Testersが利用可能になったので使ってみた - Qiita
http://qiita.com/koogawa/items/ec876e29e7f45a240b53

iOS8からのTestFlight利用に向けて - Qiita
http://qiita.com/nofrmm/items/bd8dda556ed88577c330
sudo が使えないサーバで、ホームディレクトリに tmux, mosh をインストールして使う

sudo がなく、yum も使えない CentOS 6.4 のサーバで、ホームディレクトリに tmux と mosh をインストールして使うための手順です。6.5 とか、似たような環境で動くと思います。

# tmux

## インストール

```bash
# 作業用のディレクトリをつくる
mkdir $HOME/.tmp_install_tmux
cd $HOME/.tmp_install_tmux

# libevent のインストール
wget -O- https://sourceforge.net/projects/levent/files/libevent/libevent-2.0/libevent-2.0.22-stable.tar.gz | tar xz
cd libevent-2.0.22-stable
./configure --prefix=${HOME}/local
make && make install
cd ..

# ncurses のインストール
wget -O- http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.9.tar.gz | tar xz
cd ncurses-5.9
./configure --prefix=${HOME}/local
make && make install
cd ..

# tmux のインストール
wget -O- https://github.com/tmux/tmux/releases/download/2.0/tmux-2.0.tar.gz | tar xz
cd tmux-2.0
./configure --prefix=${HOME}/local LDFLAGS="-L${HOME}/local/lib" CFLAGS="-I${HOME}/local/include"
make && make install
cd ..

# かたづけ
cd $HOME
rm -rf ${HOME}/.tmp_install_tmux
```

以上を `install_tmux.sh` などとしてコピペして保存、`chmod u+x install_tmux.sh` して実行してもできると思います。

## 実行
```
LD_LIBRARY_PATH=$HOME/local/lib $HOME/local/bin/tmux
```
これだと面倒なので、alias をつくります。

## alias をつくる (zsh)

```
echo 'alias tmux="LD_LIBRARY_PATH=$HOME/local/lib $HOME/local/bin/tmux"' >> .zshrc
```

# mosh

mosh はローカルにもインストールしておきます。`apt` とか `yum` とか `brew` などでインストールしておいてください。

## インストール

```
# 作業用のディレクトリをつくる
mkdir $HOME/.tmp_install_mosh
cd $HOME/.tmp_install_mosh

# protobuf
wget -O- https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz | tar xz
cd protobuf-2.6.1
./configure --prefix=$HOME/local
make && make install
cd ..

# ncurses のインストール (上の tmux でインストールしてあれば不要)
wget -O- http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.9.tar.gz | tar xz
cd ncurses-5.9
./configure --prefix=$HOME/local
make && make install
cd ..

# mosh
wget -O- --no-check-certificate https://mosh.mit.edu/mosh-1.2.4.tar.gz | tar xz
cd mosh-1.2.4
PROTOC=$HOME/local/bin/protoc ./configure --prefix=$HOME/local CXXFLAGS="-I$HOME/local/include" LDFLAGS="-L$HOME/local/lib" CFLAGS="-I$HOME/local/include" PKG_CONFIG_PATH="$HOME/local/lib/pkgconfig"
make && make install
cd ..

# かたづけ
cd $HOME
rm -rf $HOME/.tmp_install_mosh
```

### 実行

ローカルから:

```
mosh ＜サーバーのIP や ホスト名＞ --server='LD_LIBRARY_PATH=$HOME/local/lib $HOME/local/bin/mosh-server'
```

`~/.ssh/config` を設定しておくと、mosh でも同様に使えるのでおすすめです。
参考) http://qiita.com/ssm_snow/items/56584b97c88d52f512d0
arc4random_uniform に値を渡す時はUInt32とかで変換をするといいらしい

超初心者ですが、自分用メモとしても記しておきます。誰かの役に立てば幸いです。

swift内で、ランダムな数値を取得したい際、
「arc4random_uniform」を使用しますが(ほかにもあるようですが)、

例:
var rnd = arc4random_uniform(10)

( rnd に 0から10 までの値が格納される )

これを、メンテナンス性を上げるべく、

let x = 10
var rnd = arc4random_uniform(x)

のように書き換えた場合、
Cannot invoke 'arc4random_uniform' with an argument list of type 
とエラーが起きてしまいます。

その場合、「UInt32」で変換処理をすることで解決しました。
つまり、
let x = 10
var rnd = arc4random_uniform(UInt32(x))

と書くことで解決しました。


swiftは、objective-cと比べるとかなり敷居は下がりましたが、あちこちでも書かれているように、型変換についてはかなり厳しいですね。
Ansible EC2 のサーバーへ inventory ファイルなしで実行する方法

参考：http://qiita.com/yunano/items/a72b4e0289bb17c14451

| version | 
|:---|
| ansible 1.9.0.1 |

EC2 amazon linux よく使うから、忘れないようにメモ。

### 疎通確認したい場合

hosts として「all」を指定することと、接続する IPアドレスの最後にカンマをつけるのがポイント。

```
$ ansible all -i "xxx.xxx.xxx.xxx," --user=ec2-user --private-key=xxx.pem -m command -a "uptime"
```

### playbook を実行したい場合

playbook の YAML の中で hosts を指定することがポイント。inventory ファイルなしでつなぐぐらいだから「all」で良いかもね。

```
$ ansible-playbook -i "xxx.xxx.xxx.xxx," --user=ec2-user --private-key=xxx.pem example.yml
```

``` yaml:example.yml
- hosts: all
　...
```
Unityオブジェクト複製基本

#複製1
```csharp
public void Duplicate(){
    GameObject orgObj = GameObject.CreatePrimitive (PrimitiveType.Capsule);
 
    for (int i = 0; i < 50; i++) {
        float x = Random.Range(-3, 3);
        float y = Random.Range(-3, 3);
        float z = Random.Range(-3, 3);
        int rotX = Random.Range(0, 360);
        int rotY = Random.Range(0, 360);
        int rotZ = Random.Range(0, 360);
        Object.Instantiate(orgObj, new Vector3(x, y, z), Quaternion.Euler(rotX, rotY, rotZ));
    }
}
```

#複製２
これはまだ編集中

```csharp

	public GameObject[] RockPre;
	float time;

	void Start () {
	
	}
	
	void Update () {
		time+=Time.deltaTime;

		if (time >= 2){

			int RockIndex=Random.Range(0,2);
			float Rock_X=Random.Range(1,8);
			Instantiate(RockPre[RockIndex],new Vector3(Rock_X,0,0),transform.rotation);

			time=0;
		}

	}
```
gem selenium-webdriverでRspecがコケた時の対処法

## 経緯
everydayrails(RSPECによるRailsテスト入門)の
「8.フィーチャスペック」内
「javascriptを利用するやりとりも含める」で以下の問題が発生したので解決策を以下に記載します。

## 問題
Gemfileにselenium-webdriverを追加しspecを走らせたところ、以下のエラーが発生。

```
Failure/Error: visit root_path
     Selenium::WebDriver::Error::WebDriverError:
       unable to obtain stable firefox connection in 60 seconds (127.0.0.1:7055)
```

## 理由
selenium-webdriverのgemのバージョンが古かったから


## 解決策その1(推奨)
※6/14修正(@jnchitoさんありがとうございます)
1,gemfileを以下に変更します。

`gem 'selenium-webdriver'`

2,ターミナルで以下のコマンドを打つと最新のgemを取得出来ます。
`bundle update selenium-webdriver`

firefoxのバージョンが上がって動かない時には、上記の方法で解決出来るようです。

## 解決策その2

gemfileを以下に変更

`gem 'selenium-webdriver', "~> 2.46.2"`

※2015年6月時点のバージョンなので、firefoxのバージョンが上がると動かなくなる可能性があります。

## 教訓
gemのバージョンを確認する。
バージョンを固定しないほうが良い場合もある。
技術英語 > Used with discipline, 

引用: Code Complete > Reasons to Use Global Data

> Used with discipline, global variables are useful in several situations:

<hr>
http://ejje.weblio.jp/content/discipline
> しつけ、規律、統制、戒律

<hr>
[Discipline Makes Strong Developers @ Coding Horror](http://blog.codinghorror.com/discipline-makes-strong-developers/)

> But there is one quality that all successful developers possess. One trait that will make or break every project.
Discipline.
AWS - セカンダリIPの追加方法

MongoDBのレプリカセットをセカンダリIPで認識させて、インスタンス不良の時に入れ替え作業を簡単にするために設定しした時のメモ

#### 環境
OS：ubuntu14.04

#### 1.AWS Management ConsoleからセカンダリIPを付与

#### 2./etc/network/interface.d配下にネットワーク設定ファイルを配布

```
# The secondary network interface eth0:1
auto eth0:1
iface eth0:1 inet static
address <SECONDARY IP>
netmask 255.255.255.0
```

#### 3.ネットワーク・インターフェース再起動

```
ifdown eth0:1
ifup eth0:1
```

#### ※参考
http://makaaso.hatenablog.com/entry/2015/04/28/061754
MongoDB - レプリカセットのノード追加・削除コマンド

レプリカセットのノードを追加・削除するコマンド

#### 確認環境

|カテゴリ  |バージョン  |
|:--------:|:----------:|
|OS        |Ubuntu14.04 |
|MongoDB   |3.0.2       |

#### レプリカセットのノード追加コマンド

```
# レプリカセットのノードを追加
rs.add('<HOST>:<PORT>')

# レプリカセットのノードを追加(Arbiter)
rs.add('<HOST>:<PORT>', true)
```

#### レプリカセットのノード削除コマンド

```
# レプリカセットのノード削除
rs.remove('<HOST>:<PORT>')
```

#### ※参考
http://makaaso.hatenablog.com/entry/2015/05/07/221229
MongoDB - データベース内の全コレクションのドキュメント件数を取得する方法

MongoDBのデータベース内全コレクションのドキュメント件数取得するコマンド
MySQLの「show collections」で表示されるCount列のようなもの

#### MongoDBのデータベース内の全コレクションのドキュメント件数を取得するコマンド

```js
mongo > db.getCollectionNames().forEach(function(v){print(v , db.getCollection(v).count());});
```

#### ※参考
http://makaaso.hatenablog.com/entry/2015/04/20/223334
MongoDB -  レプリカセットのセカンダリでクエリを発行する方法


#### mongoシェルでレプリカセットのセカンダリでクエリ実行を許可するコマンド
mongoシェルでセカンダリでのクエリ発行を有効にするときのコマンド

```
mongo > db.getMongo().setSlaveOk(true);
```

以下のコマンドでもいけるらしい。（というかこっちのほうがMongo的にあてるかも）

```js
mongo > rs.slaveOk()
```

#### ※参考
http://makaaso.hatenablog.com/entry/2015/04/19/214534
Zabbix -  大量アラート削除手順

アラート送信キューに溜まったデータを削除する方法

#### 1.Zabbixサーバ停止

```
sudo service zabbix-server stop
```

#### 2.DBデータ更新

```
mysql -u <USER> -p --host <HOST> --port <PORT>
USE zabbix
SELECT COUNT(*) FROM alerts WHERE status = "0";
UPDATE alerts SET status = "1" where status = "0";
SELECT COUNT(*) FROM alerts WHERE status = "0";
exit
```

#### 3.Zabbixサーバ起動

```
sudo service zabbix-server start
```

#### ※参考
http://makaaso.hatenablog.com/entry/2015/05/11/221522
MySQL - レプリケーションがエラーで止まった時の対処方法

MySQLのレプリケーションを運用している時に、たまに見かけるレプリケーションエラー。いつも対応方法を間違えてしまうのでその備忘録

#### エラーが発生しているクエリをスキップする場合

```
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;
```

#### 発生しているエラーをスキップする場合
「/etc/my.cnf」に追記して、MySQLを再起動

```
[mysqld]
slave-skip-errors=1677
```

#### ※参考
http://makaaso.hatenablog.com/entry/2015/05/28/053004
MySQL - 外部参照を有効／無効にする方法

mysqldumpのファイルをリストアする時に、外部参照エラーにならないようにする時に主に使用しています。

#### １．外部参照を無効にする方法

```
SET FOREIGN_KEY_CHECKS = 0;
```

#### ２．外部参照を有効にする方法

```
SET FOREIGN_KEY_CHECKS = 1;
```

#### ※参考
http://makaaso.hatenablog.com/entry/2015/05/28/053359
Jenkins - エラー「source: not found」

Jenkinsに登録したジョブがエラー発生
少しはまってしまったのでメモ

#### エラー内容

```
/tmp/hudson7506796319628811162.sh: 4: /tmp/hudson7506796319628811162.sh: source: not found
```

#### 原因
sourceコマンドが認識できない

#### 対応
1行目に以下の行を追記

```
#!/bin/bash
```

#### ※参考
http://makaaso.hatenablog.com/entry/2015/06/13/071605
androidのMQTTブローカーをsocket.ioに置き換えました。

## 概要
「ohijs0.paas.jp-e1.cloudn-service.com/」のサンプルで、
androidのMQTTブローカーをsocket.ioに置き換えました。

## 部品表
* Attiny85
* BMP085
* 基板
* ピン

## 完成品    
![](http://jsrun.it/assets/w/w/f/9/wwf9w "BMP085")       
![](http://jsrun.it/assets/7/R/Y/O/7RYOd "BMP085")       

## 回路図
![](http://jsrun.it/assets/p/F/L/1/pFL1o "BMP085")

## プログラム
* attiny85
* [jsdo](http://jsdo.it/ohisama1/p2Ls "jsdoのページ") 
* グラフ表示
* [jsdo](http://jsdo.it/ohisama1/tlxe "jsdoのページ")     

## 説明
* MQTTブローカー、sangoを使ってましたが、自前でないと。
* androidから、cloudnにemitしています。9秒間隔です。    
* androidは、nkzawaのclientを使っています。
* グラフは、socket.io.jsを使っています。
jQuery　書き方を忘れがちなフィルター関係のセレクタ

いつも忘れてしまうのでメモしときます。

#属性を指定する[attr=value]

````html
<a href=hoge.html>hoge</a>
<a href=hage.html>hage</a>
````

````js
console.log($("a[href='hoge.html']").text());
結果:hoge
````
[サンプル jsfiddle](http://jsfiddle.net/pianoscorejp/ubnjjmjs/)

#テキストを指定する:contains(text)
````html
<span>I am</span>
<span>pen</span>
````

````js
console.log($("span:contains(pen)").text());
結果:pen

````
[サンプル](http://jsfiddle.net/pianoscorejp/ubnjjmjs/1/)

#指定した要素を含んだ要素を取得:has(selector)

例：id=span2の子要素を含むdiv要素を隠します

````html
<div>div1:<span id=s1>Span1</span></div>
<div>div2:<span id=s2>Span2</span></div>
````

````js
$("div:has(#s2)").hide()
````
[サンプル](http://jsfiddle.net/pianoscorejp/ubnjjmjs/4/)

#空の要素を取得:empty
要素の中が空の場合にマッチします。

````js
$("div:empty").text("hoge");

````
[サンプル](http://jsfiddle.net/pianoscorejp/ubnjjmjs/3/)

#空じゃない要素を取得:parent

````js
$("div:parent").show();
````
要素によって空かどうかの判定が異なります。
`<p></p>`、`<span></span>`は空と判定されますが、`<br><hr><img><input>`等は空ではないと判定されます。たぶん終了タグが必要ない要素は空ではないと判定されます。
[サンプル](http://jsfiddle.net/pianoscorejp/ubnjjmjs/5/)

#非表示の要素取得:hidden

````js
$("button").click(function(){
    $("div:hidden").show();
});
ボタンをクリックすると非表示属性が表示されます。
````
だだし`opacity=0`にはマッチしません。
同様に`:visible`を指定すると、表示されている要素を取得できます。
[サンプル](http://jsfiddle.net/pianoscorejp/ubnjjmjs/2/)
WordPressで画像挿入時のリンク先をデフォルトでなしにする方法

#function.phpへ以下を追加

```lang:filename
add_filter( 'the_content', 'attachment_image_link_remove_filter' );
	function attachment_image_link_remove_filter( $content ) { 
		$content = 
		preg_replace(
		array('{<a(.*?)(wp-att|wp-content\/uploads)[^>]*><img}', 
		'{ wp-image-[0-9]*" /></a>}'), 
		array('<img','" />'), 
		$content
	);
	return $content; 
}
```
Python boto - import boto.rds2 Error "TypeError: the JSON object must be str, not 'bytes'"

boto.rds2を使用してスナップショットからRDSをリストアしようとした時にエラー発生
python3が完全にサポートされていないからかなと思われる

#### エラー内容

```
TypeError: the JSON object must be str, not 'bytes'
```

#### 対応
rds2/layer1.pyの3761行目を編集

```
body = response.read().decode('utf-8')
```

#### ※参考
http://makaaso.hatenablog.com/entry/2015/06/13/071850
Google Tag Manager を使って、アウトバウンドを計測する


いちいち、linkに対して、js を埋めなくて良い.

# 変数を調整
* 変数 : Click URL をアクティブにする

# タグを作成
* 新規tagを作成
* プロダクト : Google Analytics
* タグの種類 : 適宜
* タグを設定 : プロパティID : あなたの. トラッキングタイプ : イベント. カテゴリ, アクション, ラベル : 適宜. ラベル {{Click URL}}
* 配信するタイミング : クリック
* タグを配信するトリガー : 新規作成する

# トリガーを作成
* イベント : クリック
* トリガーを設定 : リンククリック
* 有効化のタイミング : 適宜
* 配信するタイミング : 適宜 (計測したいクリック/リンクに合わせてregexを調整)


これで Google Analytics の event にて、外部linkへのクリックを眺めることができます.
言語別ライブラリホスティングページのまとめ

ただしくはホスティングというよりもライブラリを検索出来るページって感じです。
利用されるツールとホスティングサイトを対にしています。

編集リクエストを投げていただければ積極的に取り込みたいのでよろしくお願いいたします。

## PHP

PEAR: https://pear.php.net/
PECL: http://pecl.php.net/
composer: https://packagist.org/

## Ruby
gem: https://rubygems.org/

## Python
pip: https://pypi.python.org

## Node.js
npm: https://www.npmjs.com/

## Perl
cpan: http://www.cpan.org/

## Objective-C
cocoapods: https://cocoapods.org/

## haskell

Hackage: https://hackage.haskell.org/
Ubuntu 14.04 LTS上でVirtualBox+Windows 10 Insider Previewを動かしたメモ

タイトルの通りです。公式ページに書いてある通りの内容ですが、メモとして残しておきます。

## VirtualBoxのインストール

Ubuntu 14.04 LTS標準で入るVirtualBoxは古すぎてWindows 10が利用できません。最新版のVirtualBoxをOracleから入手するのが良いでしょう。

「[Linux_Downloads – Oracle VM VirtualBox](https://www.virtualbox.org/wiki/Linux_Downloads)」を参考に、次のように作業します。


まず、`/etc/apt/sources.list`の末尾に次のように追記します。

```
deb http://download.virtualbox.org/virtualbox/debian vivid contrib
```

次に、Oracleの公開鍵を登録します。

```
$ wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -
```

ここからは普段通りの手順です。`virtualbox-4.3`パッケージをインストールしましょう。

```
$ sudo apt-get update
$ sudo apt-get install virtualbox-4.3
```

これで`virtualbox`コマンドが実行できるようになります。

### Extension Packのインストール

ゲストOSからUSBを利用したいような場合はExtension Packをインストールする必要があります。上のページからダウンロードしたものをVirtualBoxに食わせればインストールできます。

## Windows 10 Insider Previewのインストール

Windows 10 Insider Previewはオープンβバージョンみたいなもんです。Windows 10が出る頃には使えなくなるでしょうし、まだ不安定な可能性もありますが、無料なのが利点ですね。ちょっとした実験をしてすぐ消す仮想環境としてなら十分使えるはずです（もっとも、このような目的なら[Windows 8.1 Enterprise 評価版](https://technet.microsoft.com/ja-jp/evalcenter/hh699156.aspx)という選択肢もあります）。

「[Windows 10 Insider Preview ISO のダウンロード - Microsoft Windows](http://windows.microsoft.com/ja-jp/windows/preview-iso)」からISOファイルを落として、VirtualBoxからDVDドライブとしてマウントしましょう。ちなみに筆者は64bit版で試しました。

起動後、指示に従っていれば特にトラブルなくインストールが完了します。

## 参考URL

* [Linux_Downloads – Oracle VM VirtualBox](https://www.virtualbox.org/wiki/Linux_Downloads)
* [Windows 10 Insider Preview ISO のダウンロード - Microsoft Windows](http://windows.microsoft.com/ja-jp/windows/preview-iso)
Font Awesome のアイコンを必要なものだけ使う

あるサイトで、アイコンフォントに [Font Awesome](http://fortawesome.github.io/Font-Awesome/) を導入していました。

Font Awesome（現時点での最新バージョン 4.3.0）では 500 種類以上のアイコンが用意されていて、何も考えずに使用していると、woff ファイルで 70KB という結構な容量のフォントファイルを読み込むことになります。

実際にサイトで使用しているアイコンは数種類だけだったので、使っていないフォントを削ってフォントファイルの容量を軽くしてみることにしました。


## IcoMoon か Fontello か

アイコンフォントのサブセット化のサービスでは [IcoMoon](https://icomoon.io/app/) と [Fontello](http://fontello.com/) という2つのサービスが有名です。

どちらも同じようなことができるようですが、細かい設定もできて使い勝手が良かった IcoMoon を使用しました。
Fontello は、ユニコードやアイコンの名前が Font Awesome との間で変わっているものがあるなど、細かい部分で余計な手間がかかる印象でした。


## 設定

細かい IcoMoon の使い方の説明は省きますが、Font Awesome との差し替えをするのならば必要な設定が2つあります。

![IcoMoon_App_-_Icon_Font__SVG__PDF___PNG_Generator.png](https://qiita-image-store.s3.amazonaws.com/0/43792/bfcda895-42c9-fe28-19f1-0834488eba0e.png)

**Class Prefix を「fa-」にします**
こうしておくことでHTMLのクラス属性を修正する必要がなくなります

**Baseline Height を「15」にします**
デフォルトの「6.25」のままだと、Font Awesome と置き換えた時にアイコンの縦位置がずれてしまいます

これで生成したフォントファイルとスタイルシートを既存のものと差し替えれば完成です。
（fa-spin などのユーティリティクラスは IcoMoon には用意されていないので、使用しているのであれば別途用意する必要があります）

なお、フォントと同時に生成される json ファイルを使えば、選択したアイコンや設定を IcoMoon にインポートすることができるので、アイコンを後から追加したくなった場合などにも便利です。
chef-soloでパイプやリダイレクトを使ったときにログの出力フォーマットが変わってしまう件の対策

chef-solo (に限らずchef clientでも) で出力をパイプに渡すと、出力フォーマットが変わってしまうという変な仕様があります。

# 結論

パイプに渡したときに挙動を同じにするには、"-l warn -F doc"オプションを付ければよい。
つまり下記３つのコマンドは等価である。

```
$ sudo chef-solo  -c solo.rb -o hello
$ sudo chef-solo  -c solo.rb -o hello -l warn -F doc
$ sudo chef-solo  -c solo.rb -o hello -l warn -F doc | cat
```

一方、下記２つのコマンドも等価である。(上記とは振る舞いが異なる)

```
$ sudo chef-solo  -c solo.rb -o hello | cat
$ sudo chef-solo  -c solo.rb -o hello -l info -F null
```


# 解説

chef-soloを普通に呼び出した場合、下記のようになります。

```
$  sudo chef-solo  -c solo.rb -o hello
Starting Chef Client, version 12.0.3
[2015-06-13T01:43:23+09:00] WARN: Run List override has been provided.
[2015-06-13T01:43:23+09:00] WARN: Original Run List: []
[2015-06-13T01:43:23+09:00] WARN: Overridden Run List: [recipe[hello]]
Compiling Cookbooks...
Converging 1 resources
Recipe: hello::default
  * log[hello world] action write


Running handlers:
Running handlers complete
Chef Client finished, 1/1 resources updated in 2.976551 seconds
```

これは、表面上はわかりませんが、フォーマッタに"doc"を、ログレベルに"warn"を指定したのと同じことになっています。

実際、下記コマンドを叩くと同じ出力が得られます。

```
$ sudo chef-solo  -c solo.rb -o hello -l warn -F doc
```

# パイプに渡すとどうなるのか

出力先をパイプ(やリダイレクト)にすると、この挙動が変わります。

```
$  sudo chef-solo  -c solo.rb -o hello | cat
[2015-06-13T01:52:08+09:00] INFO: Forking chef instance to converge...
[2015-06-13T01:52:08+09:00] INFO: *** Chef 12.0.3 ***
[2015-06-13T01:52:08+09:00] INFO: Chef-client pid: 28241
[2015-06-13T01:52:11+09:00] WARN: Run List override has been provided.
[2015-06-13T01:52:11+09:00] WARN: Original Run List: []
[2015-06-13T01:52:11+09:00] WARN: Overridden Run List: [recipe[hello]]
[2015-06-13T01:52:11+09:00] INFO: Run List is [recipe[hello]]
[2015-06-13T01:52:11+09:00] INFO: Run List expands to [hello]
[2015-06-13T01:52:11+09:00] INFO: Starting Chef Run for DQNEO-no-MacBook-Air.local
[2015-06-13T01:52:11+09:00] INFO: Running start handlers
[2015-06-13T01:52:11+09:00] INFO: Start handlers complete.
[2015-06-13T01:52:12+09:00] INFO: Processing log[hello world] action write (hello::default line 1)
[2015-06-13T01:52:12+09:00] INFO: hello world
[2015-06-13T01:52:12+09:00] INFO: Chef Run complete in 0.497036 seconds
[2015-06-13T01:52:12+09:00] INFO: Skipping removal of unused files from the cache
[2015-06-13T01:52:12+09:00] INFO: Running report handlers
[2015-06-13T01:52:12+09:00] INFO: Report handlers complete
```

これは、フォーマッタに"null"を、ログレベルに"info"を指定したのと同じです。
実際、下記コマンドを叩くと同じ出力が得られます。

```
$ sudo chef-solo  -c solo.rb -o hello -l info -F null
```

# 教訓

暗黙のオプションデフォルト値に頼っていると混乱のもとになるので、慣れるまでは-l とか -F とかを明示的に指定して呼び出す癖をつけるのがよいと思います。
@"Xcodeで日本語リテラルをあぶり出す呪文";

Xcodeの正規表現検索でプロジェクト内の日本語(全角文字)を含む文字列(リテラル)を一挙に検索します。ローカライズするときに一時的に日本語で書いておいた場所を見つけるのに便利です。


## コピペしてお使いください


#### objc
```objc
(^|[^%])\@\"[^\"]*[^\x01-\x7E][^\"]*\"
```

#### swift
```swift
\"[^\"]*[^\x01-\x7E][^\"]*\"
```

#### マッチ例
一文字でも日本語(全角文字)を含んでいるとマッチします。
@"あ", @"あああ", @"abcあefg", @"abcdefあ"

#### 検索方法は以下の画像を参照

![xcode_search_regex.png](https://qiita-image-store.s3.amazonaws.com/0/8920/fcda54b7-233c-7c3d-3879-3dc7c90b66da.png)

全体検索のショートカットは `Cmd+Shift+F` が便利です。

## 応用編 (Objective-C)

代入、引数、三項演算子など特定のパターンを指定して検索可能です。

#### = @"文字列"

`\=\s*\@\"[^\"]*[^\x01-\x7E][^\"]*\"`

#### :@"文字列"

`\:\s*\@\"[^\"]*[^\x01-\x7E][^\"]*\"`

#### ? @"文字列"
`\?\s*\@\"[^\"]*[^\x01-\x7E][^\"]*\"`

#### , @"文字列"

`\,\s*\@\"[^\"]*[^\x01-\x7E][^\"]*\"`

#### @"文字列";

`(^|[^%])\@\"[^\"]*[^\x01-\x7E][^\"]*\"\s*\;`

#### = @"文字列" もしくは :@"文字列"

`(\=\s*\@\"[^\"]*[^\x01-\x7E][^\"]*\")|(\:\s*\@\"[^\"]*[^\x01-\x7E][^\"]*\")`
rubyのtips集

#rubyのtips集

調べていて、個人的にはぁ〜なるほどとなったtipsを紹介します。
（適宜追加する予定です。）

## Rubyのcaseを〇〇(言語名)のswitch文だと思っている人たちにぼくから一言ガツンと申し上げたい
http://melborne.github.io/2013/02/25/i-wanna-say-something-about-rubys-case/

元々、Cプログラマだった私はswitch文のcaseは定数しか指定できなくて使いづらい印象だったけど、rubyではcaseに変数や、範囲など割と柔軟に使えるんだなあという印象。

## 正規表現によるバリデーションでは ^ と $ ではなく \A と \z を使おう | 徳丸浩の日記
http://blog.tokumaru.org/2014/03/z.html

たまに聞いては、忘れてしまうtipsなのでメモ。。

## Enumerator とブロックの省略 - まめめも
http://d.hatena.ne.jp/ku-ma-me/20071129/p1

Enumeratorってどんな時に使えば良いの？って疑問に思った時に、参考にした。
＞利点の内訳が with_index が 9 割、外部イテレータが 1 割という印象...
でスッキリ

## tap
http://qiita.com/annyamonnya/items/04078bc38c57059e5dd2

tapはブロックの評価をしないので、メソッドチェーンの中にtapを挟んでデバッグ表示に使うという話が多いが、
配列に要素を追加する際に、tapを使うとコードを綺麗に書けるのもありがたい。

```rb
[].tap do |items| # itemsには[]が渡される
  users.each do |u|
    items << u.name
  end 
end # => ["taro", "hananko"]

```

## Ruby :: メソッド引数のアスタリスクの意味 [Tipsというかメモ]
http://tm.root-n.com/programming:ruby:etc:parameter_asterisk

引数を渡す際、配列にアスタリスクを付けて関数呼び出しすると、配列が展開して渡される。
関数定義の引数にアスタリスクを付けると、0個以上の引数が配列にまとめられて渡される。
AWS IOTハッカソン発表事例AWS構成説明（２）AWS基礎知識編


まずEC2インスタンスを立てるところから説明進めようと思いますが、
その前段としてまずはAWSの基礎的なところを説明しておこうと思います。

#■VPC

VPCとはVirtual Private Cloudの略で、AWS内に作成できる仮想的な独立したネットワークです。
VPCを構築することで、任意のプライベートIPアドレスやサブネットの作成を行うことができます。
また、VPC内にサブネットを作ることも可能です。
（つまり自分のネットワークが作れる、ということです）
なお、VPCは後述のリージョンを跨って作成することはできませんが、アヴェイラビリティゾーンはまたがって作成することが可能です。


#■Elastic IP

EC2インスタンスのIPアドレスは起動の都度DHCPで割り当てられます。
そのため、再起動したらIPアドレスが変わってしまったということがよくあります。
そうなると外部から特定のパブリックIPアドレス指定で接続している場合は困ってしまいますね。
そのため、AWSには特定のパブリックIPアドレスを確保し、インスタンスに紐付ける仕組みが用意されています。それがElastic IPです。
Elastic IPとインスタンスを紐付けることにより、インスタンスを再起動しても同じIPアドレスで接続することが出来るようになります。


#■リージョンとアヴェイラビリティゾーン

##リージョン
AWSを語る上でリージョンについて触れないわけにはいきません。
リージョンとは、簡単に言うとデータセンターのことです。
現在以下の９箇所があるようです。

・バージニア
・カリフォルニア
・オレゴン
・東京
・シンガポール
・シドニー
・サンパウロ
・アイルランド
・フランクフルト

ここで気をつけねばならないのはAWSが提供しているサービスは全リージョン同じではないということです。
新しいサービスなどは一部のリージョンで導入されて、徐々に他のリージョンへ展開されていきます。
例えばLamdaなどは現時点で利用できるのはバージニア、オレゴン、アイルランドの３箇所です。
（今回のAWS Summit Tokyoで新たに東京も対応することが発表されましたね）

また、AWSのサービスは組み合わせて使うことが多いと思いますが、中には同じリージョンでなければ動作させられないものもあります。それらを考慮して、利用する各サービスのリージョンをどこにするかを考えなければなりません。
例えばLamdaに関しては以下の記事が詳しいです。
http://dev.classmethod.jp/cloud/trigger-lambda-on-other-regions/

ちなみに、今回我々が利用したサービスとリージョンの対応は以下の通りとなります。

EC2   (東京）
VPC（東京）
Lamda (オレゴン）
DynamoDB(オレゴン）
Cognito (バージニア）
S3(オレゴン/東京）＊

＊ログのアップロード用バケットはオレゴン、Webアプリデータを配置しているバケットは東京に配置しています。

## アヴェイラビリティゾーン
次はアヴェイラビリティゾーン（以下、AZ)について説明したいと思います。

AZとはリージョン内で物理的に区切られたエリアです。
個々のAZは建物や電源、ネットワーク設備等が独立しています。（見たわけではないですが）
これによって複数のAZに分散してインスタンスを配置することによって
「データセンターに火災が発生してデータがロストしました。テヘ」
などということは回避することができます。

火災が発生するなどはそうそうあることではないですが、一時的なトラブルが発生すること想定しておくべきです。
その場合、複数AZにインスタンスが配置されていることでシステムの冗長性が確保されます。
例えば、あるAZ上あるインスタンスで障害が発生した場合、別のAZ上のインスタンスに先に説明したElastic IPを再マッピングすることによってサービスを継続することができます。
また、複数のAZ上にインスタンスを配置し、リクエストをELB等ロードバランサーを使って振り分けるという方法もあります。

次回はEC2のVPCやインスンタンスの具体的的立ち上げ手順、可能ならばMQTT Brokerのインストールまで説明したいと思います。
【メモ】raise error

Railsのraise errorを知った。例外を送出するものらしい。

``` raise Exceptions::AutoSaveError ```
と書いた。

これは故意的に例外を発生させたい時に使うメソッド。raiseはRanTimeErrorと出る。
 ``` raise something error ```
とすると、``` RunTimeError: something error ```と出るらしい。

![スクリーンショット 2015-06-13 0.45.20.png](https://qiita-image-store.s3.amazonaws.com/0/74581/09842820-d58f-2900-2bdb-17f8377b360c.png)

確かに出た！

すべての例外はExceptionクラスを継承していて、その中でStanderdErrorクラスを継承している例外はアプリケーションレベルの例外、継承していないエラー(NoMethodErrorなど)はシステムレベルの例外。

[例外について](http://www.atmarkit.co.jp/ait/articles/1410/30/news048.html)
【メモ】!が有る無しの違い

 ```
!のつくメソッドを多用するのはおすすめしない。
例えばこれだとsave!でこけた場合destroy!の正当性が不明になる。そうなるときちんとエラー内容を確認できなくなる。
```

というコードレビューをもらった。
正当性が不明？？なんでエラー内容が確認できない？？っていう状況。

とある人の[ブログ](http://d.hatena.ne.jp/masterpiyo/20111212/1323677704)で、

```
saveとsave!の違いは、保存出来なかった場合の振る舞いにあります。

・saveメソッドは、保存できない場合falseを返します。
・save!メソッドは、保存できない場合例外ActiveRecord::RecordInvalidが発生します。
```
ということらしい。知らなかった。

質問したら、save!のほうが失敗した時にブラックボックス化になるらしい。


なので、

```
save! -> save
destory! -> destroy
```
に変更した。
os.Exit()はDefer functionの実行を待たない

`testing`パッケージを利用してテストを記述している場合、初期化や終了後の後処理を記述するには`TestMain`関数を利用する。

```go
package test

import (
  "log"
  "os"
  "testing"
)

func TestMain(m *testing.M) {
  setup()
  code := m.Run()
  teardown()
  os.Exit(code)
}

func setup() {
  // 何らかの初期化処理...
  log.Println("setupped here.")
}

func teardown() {
  // 何らかの終了処理...
  log.Println("cleaned up here.")
}

func TestCase(t *testing.T) {
  t.Errorf("the test always fails")
}
```

この時、いつもの癖で`teadown()`を`defer`で呼ぶコードを書いてしまうとする。こんなかんじだ。

```
func TestMain(m *testing.M) {
  setup()
  defer teardown()
  code := m.Run()
  os.Exit(code)
}
```

しかし、この書き方では問題が起こる。

```txt:deferを使ってしまうとこうなる
2015/06/13 00:06:04 setupped here.
=== RUN TestCase
--- FAIL: TestCase (0.00s)
	test_test.go:29: the test always fails
FAIL
exit status 1   <--- teardown()が実行されていない!!
FAIL	github.com/harukasan/test/test	0.008s
```

`os.Exit(code)`は全てのdeferを破棄して終了する。そのため、deferが正常に実行されずに、後処理が行われないのである。

- [os.Exit - The Go Programming Language](https://golang.org/pkg/os/#Exit)
- 参考: [os.Exit()とdefer](http://qiita.com/umisama/items/7be04949d670d8cdb99c)



で、どうするかなんだけど、まず考えるのは`defer`の中で`os.Exit(code int)`を呼ぶ方法である。うまいこと終了コードを渡さないといけないので、あまり綺麗じゃないけどポインタ渡しにした。

```go
func TestMain(m *testing.M) {
  setup()
  var code int
  defer func(int *code) {
    teardown()
    os.Exit(*code)
  }(&code)

  code = m.Run()
}
```

他の方法としては、`code`をグローバル変数にする方法がある。

```go
var code = 0

func TestMain(m *testing.M) {
  setup()
  var code int
  defer func() {
    teardown()
    os.Exit(code)
  }()

  code = m.Run()
}
```

どっちもどっちっぽいし、そもそも`defer`を使うのをやめた方が綺麗なんじゃないかと思う。
PHPで単純挿入ソート

#PHPで単純挿入ソート

```php


//0～200の配列を作成。stepは1
$list = range(0, 200 , 1);
//配列をシャッフルする
shuffle($list);

echo 'ソートする配列は';
echo '<pre>';
var_dump($list);
echo '</pre>';

$listCount = count($list);

for($sortedCount = 1; $sortedCount < $listCount; $sortedCount++ ) {
    //挿入する値を保存
    $tmp = $list[$sortedCount];
    //ソート位置を探す
    //$indexは減少していく数で1以上であることかつ挿入する値よりも値が大きい時for文の中身が実施される
    for($index= $sortedCount; $index >= 1 && $list[$index - 1] > $tmp; $index--) {
        //１個ずらして保存
        $list[$index] = $list[$index - 1];
    }
    //ソート位置が決まったら挿入
    //var_dump($index); //for文の中で使われたindexの値-1がこのindex
    $indexMinusOne = $index;
    $list[$indexMinusOne] = $tmp;
}

echo 'ソート完了';
echo '<pre>';
foreach ($list as $value) {
    echo $value;
    echo '<br>';
}
echo '</pre>';


```
Live2DのモデルでTyranoBuilderを使ってゲーム開発する方法


## はじめに

前回は、Live2Dのオリジナルモデルを表示し、動かすまでをやりました。今回は、Live2Dのモデルを使って、ブラウザで動くノベルゲームを作成するまでを紹介したいと思います。

![](https://raw.githubusercontent.com/mba-hack/images/master/tyranoscript_bitbucket_sample_01.png)


使用するのは、[TyranoBuilder](http://b.tyrano.jp/download/builder)という非常にわかりやすくて、素晴らしい優秀なゲーム開発アプリです。
  
しかし、今回も[公式マニュアル](http://b.tyrano.jp/tutorial/)が非常に充実しており、あまり説明することはありませんが、それでもハマりやすそうなポイントなどもあるので、それを紹介します。

## TyranoBuilderでブラウザゲームを作成し、公開するまでの手順

- [TyranoBuilder](http://b.tyrano.jp/download/builder)をダウンロードし、解凍します。そして、中にある実行ファイルを開きます

- これだけでサンプルゲームがプレビューできるようになっています。今回は、これを少しずつ加工していくことになります。まずは、Live2Dを表示するまでの手順として、メニューから`[プロジェクト]-[拡張コンポーネント]`を選択します。

http://b.tyrano.jp/tech/page/live2d

- シナリオが作成できたら、ブラウザゲームとして出力するわけですが、メニューバーから`[プロジェクト] - [ゲームを書き出す]`を選択してください

- 出力されたディレクトリを開くと`index.html`があると思いますが、このディレクトリをWebサーバーにアップロードすることで、ブラウザゲームが動作します。

- 動作確認の方法ですが、いくつか方法があります。その一つが[TyranoScript](http://tyrano.jp/home/download)をダウンロード、解凍して、中にある実行ファイルを先ほどブラウザゲームを出力したディレクトリに置いて、実行することです。

- また、インターネットブラウザのGoogle Chromeを使用しても動作確認ができます。ただし、オプションを付けての起動になります。以下の様なコマンドを実行して、`index.html`をChromeにドラッグアンドドロップすれば、ゲームがプレイできます。

```bash:
$ /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-files
```

- 通常は、出力されたディレクトリをWebサーバーに置けば動作するはずですが、動作しないサーバーも多く、私の場合、ここでハマりました。具体的には、GitHub Pagesの[user.github.io](user.github.io)では動作しませんでした。Bitbucket Pagesの[user.bitbucket.org](user.bitbucket.org)では動作しました。HTMLはこんな感じで載せます。

```html:
<iframe src="http://username.bitbucket.org/sample/index.html" style="width:672px;height:448px"></iframe>
```

以下のページにアクセスするとサンプルゲームができます。始まりは遅いですが、1分くらい待てば始められます。

http://tyranoscript.bitbucket.org/sample
軽量かつ固定幅でも可変幅でも使えるグリッドCSS

軽量のグリッドCSSを見つけた。名前も Don't Overthink It Grids なんて初心者でも取っ付きやすそうだったので、ちょっとカジってみた。

https://css-tricks.com/dont-overthink-it-grids/

ここでも紹介されていた。

http://coliss.com/articles/build-websites/operation/css/css-tutorial-flexible-grid-by-css-tricks.html

各コラムは単純にパーセントで記述し、合計を100％にすればよい。ガターはピクセルで指定する。面倒な計算がいらなくてコリャいいわとおもったのだが、なんだ〜、コレ崩れるじゃん。作者も紹介者も気が付かないのかね？（外側グリッドのないときコラムの幅が不正確）

そこでバッチイけど自分で似たようなCSSを書いてみた。

http://qitailang.small.jp/misc/simple_grid/index.html
SwiftでperformSelectorを呼びたい！

## Swiftでは動的にメソッドを呼び出せない！
Swiftでは`performSelector`が呼び出せないため、Swiftだけ行うと限界がみえてくる。

[StackOverFlow](http://stackoverflow.com/questions/24158427/alternative-to-performselector-in-swift)に書かれているこの方法でも良いのだが、僕は同期で処理をさせたかったのでこの方法では都合が悪かった。

具体的に言うと、外部で作成したオブジェクトを自動的に別オブジェクトのインスタンス変数へ動的に設定したかったのだ。
そして、設定と同時にそのインスタンス変数を使って処理をしたかったのだ。

もちろん頑張ってコードを書けば動的メソッドを使わなくても可能だが、今後を考えるとなんとかしたい。

## Cで対応、、、は見送り
そうすると、C言語を使って対応する[StackOverFlow](http://stackoverflow.com/questions/24245262/qa-call-a-method-from-a-string-in-swift)を見つけたが・・・
この方法は僕には理解ができないので、問題が発生すると対応ができない。よって却下。

## Objective-cで対応
で、結局`Objective-c`に頼ることにした。
こういう時は頼りになるなぁ。

Objective-cで作るのは以下の二つのファイル。

```objective-c:Meta.h
#import <Foundation/Foundation.h>

@interface Meta : NSObject

+ (void)call:(id)obj method:(NSString*)method withObject:(id)withObject;

@end
```

```objective-c:Meta.m
#import "Meta.h"

@implementation Meta

// 指定オブジェクトのメソッドを引数一つで呼び出す
+ (void)call:(id)obj method:(NSString*)method withObject:(id)withObject {
    // 呼び出しメソッドのセレクターを用意
    SEL sel = NSSelectorFromString([NSString stringWithFormat:@"%@:", method]);
    
    // メソッドを呼び出します。
    // 警告が出るので、以下サイトを見て回避してます。
    // http://captainshadow.hatenablog.com/entry/20121114/1352834276
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
    [obj performSelector:sel withObject:withObject];
#pragma clang diagnostic pop
}

@end
```

作ったObjective-cのコードをSwiftで呼び出せる様に`Bridging-Header`に定義します。
Bridging-Header.hを知らない方は[こちら](http://qiita.com/syou007/items/b0c54d795d63fb84de72)を参照してください。

```objective-c:Bridging-Header.h
#import "Meta.h"
```

それをSwiftで呼び出します。

```swift
Meta.call(sampleObj(), method: "setHoge", withObject: Data())
```

callメソッドに関してはもう少し凝っても良いのだが、僕の場合はこの程度で十分だった。

### 余談
なぜかわからないのだが、`Meta.h`のメソッド名を以下の様にした場合はコンパイルエラーが発生した。

```objective-c:Meta.h
+ (void)performSelectorClass:(id)obj method:(NSString*)method withObject:(id)withObject;
```

performSelectorというキーワードが使えない感じがした。
CentOSにMariaDB最新をyumインストール

## 前提
- CentOS 6.6
- MariaDB 10.0.19

## MariaDBのPGP keyをインストール

```
# rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
```

## リポジトリの設定変更

```
# vi /etc/yum.repos.d/mariadb.repo
```

```conf:mariadb.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.0.19/centos6-x86/
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
enabled=1
```

## MariaDBをyumでインストール

```
# yum -y install MariaDB-devel MariaDB-client MariaDB-server
```

## エラーが出たらmysql-libsを削除

```
# rpm -e --nodeps mysql-libs
# yum -y install MariaDB-devel MariaDB-client MariaDB-server
```

## MariaDBの起動

```
# /etc/init.d/mysql start
```

## rootユーザーのパスワード設定

```
# /usr/bin/mysqladmin -u root password '!password'
```


おつかれさまでした
変更できてしまう定数とice_nine

Rubyにも定数はありますが、何も考えずに使うとはまるポイントがあります。ただし、それの対策に使えるgemがあります。

#破壊可能な定数
##複数回の代入
まず、Rubyでの定数は大文字から始まるものです。そして、一度代入した定数に、別の値を代入**できてしまいます**。

```rb:これでも動く
CONST=1
CONST=2
```

ただし、警告は出ますので、実用的にはやるべきではないですし、メソッド内からは定数の代入そのものを（このようには）実行できません[^1]。

## 定数への破壊的操作と`freeze`
定数として文字列や配列・ハッシュなど、ミュータブルなオブジェクトを使うと、定数として用意したオブジェクトでも、破壊的に変更することができてしまいます。こちらは警告も出ません。

```rb:破壊的変更
CONST='ruby'
CONST << 'iii'
p CONST # 'rubyiii'
```

もちろん、このような状態を放置するだけでなくて、[Object#freeze](http://docs.ruby-lang.org/ja/2.1.0/method/Object/i/freeze.html)というメソッドで、内部状態の変更を禁止することはできます。

### 依然残る問題
`freeze`をかければそのオブジェクトを破壊的に変更できなくなるので、シンボルや数値だけ入った配列や、単体の文字列であればこれで問題ありません。一方で、配列やハッシュを`freeze`しても、要素自体には破壊的な変更ができるままなので、とことん変更を禁止したいなら、さらに中身まで`freeze`する必要があります。

# `ice_nine`というGem
この状況を面倒に思う人は結構いるようで、再帰的に`freeze`をかけてくれる`ice_nine`というGemがあります（[GitHub](https://github.com/dkubb/ice_nine)、[RubyGems](https://rubygems.org/gems/ice_nine)）。

普通に`require`すると`IceNine.deep_freeze`というメソッドが現れて、これに引数を投げ込むことで中身まで`freeze`されます。

```rb:ドキュメントの例
# Deep freezes most kinds of objects
hash   = IceNine.deep_freeze('a' => '1')
array  = IceNine.deep_freeze([ 'a', 'b', 'c' ])
range  = IceNine.deep_freeze('a'..'z')
struct = IceNine.deep_freeze(Struct.new(:a, :b).new('a', 'b'))
object = IceNine.deep_freeze(Object.new)
user   = IceNine.deep_freeze(User.new(name: 'dkubb'))
```

また、追加で`require 'ice_nine/core_ext/object'`とすると、`Object#deep_freeze`が生えます。

## 名前の由来？
なぜに「nine」なんだろうと調べてみたら、[「猫のゆりかご」](https://ja.wikipedia.org/wiki/%E7%8C%AB%E3%81%AE%E3%82%86%E3%82%8A%E3%81%8B%E3%81%94)という小説にIce nineという架空の物質[^2]が登場して、これに触れた水は常温のまま同じIce nineと化す、というもので、「他のものを凍らせる」というところからこの名前を付けたようです。自分で作ったプロダクトにも、粋な名前を付けたいものです。

[^1]: `const_set()`というメソッドを使って、メソッド内で動的に定数を定義することは可能です。
[^2]: 小説の発表当時は氷Iから氷VIIIまでが発見されていました。その後に発見された氷IXも、こんな特性を持つものではありません。
PHPで単純選択ソート

#PHPで単純選択ソート

```php

//0～200の配列を作成。stepは1
$list = range(0, 200 , 1);
//配列をシャッフルする
shuffle($list);

echo 'ソートする配列は';
echo '<pre>';
var_dump($list);
echo '</pre>';

$listCount = count($list);
$isChange  = false;

for($sortedCount = 0; $sortedCount < $listCount; $sortedCount++ ) {
    //最小値のキーの変数を定義。まずは基準位置をセットする
    $minKey = $sortedCount;
    //最小値を探す
    for ($index = $sortedCount +1; $index < $listCount; $index++) {
        if ($list[$index] < $list[$sortedCount]) {
            $minKey   = $index;
            $isChange = true;
        }
        if ($isChange) {
            //最小値が変わったら
            $tmp                = $list[$sortedCount];
            $list[$sortedCount] = $list[$minKey];
            $list[$index]       = $tmp;
            $isChange           = false;
        }
    }
}

echo 'ソート完了';
echo '<pre>';
foreach ($list as $value) {
    echo $value;
    echo '<br>';
}
echo '</pre>';


```
CentOSにnginx最新をyumでインストール

## 前提
- CentOS 6.6
- nginx 1.8.0

## nginx公式
http://nginx.org/en/linux_packages.html#stable

## yumリポジトリをCentOSに登録。
```
# rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
```

# nginxをyumでインストール

```
# yum -y install nginx
```

# バージョン確認
```
# nginx -v
nginx version: nginx/1.8.0
```

--------
おつかれさまでした
CentOSにsquidをyumでインストール＋設定手順

## squidのインストール

```
# yum -y install squid
```

## プロキシサーバ側の設定

- 設定ファイル編集

```
# vi /etc/squid/squid.conf
```

```conf:squid.conf
acl CONNECT method CONNECT
# 追記 (ACLの定義追加で接続元を設定)
acl wan src xxx.xxx.xxx.xxx

# 追記 (定義したACLの許可)
http_access allow wan

# 変更(8080はバッティングしやすいので他を推奨)
http_port 8080

# 最終行に追記 (匿名サーバー化)
request_header_access Referer deny all
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all

# ホスト名定義（必要に応じて）
visible_hostname proxy.server

# クライアント情報を表示しない
forwarded_for off
```

- squidの起動

```
# /etc/rc.d/init.d/squid start 
Starting squid: [ OK ]
```

- サーバ起動時にsquidを自動起動するようにchkconfigに追加

``` 
# chkconfig squid on 
```

## クライアント側の設定（CentOS6.6）

```
# vi /etc/profile
```

```conf:/etc/profile
# 最終行に追記 (プロキシサーバーを環境変数に設定)
MY_PROXY_URL="111.222.333.444:8080"
HTTP_PROXY=$MY_PROXY_URL
HTTPS_PROXY=$MY_PROXY_URL
FTP_PROXY=$MY_PROXY_URL
http_proxy=$MY_PROXY_URL
https_proxy=$MY_PROXY_URL
ftp_proxy=$MY_PROXY_URL
export HTTP_PROXY HTTPS_PROXY FTP_PROXY http_proxy https_proxy ftp_proxy
```

- 設定の反映

```
# source /etc/profile
```

- 疎通確認
 - グローバルIPを確認してプロキシサーバ側のIPが表示されればOK

```
# curl inet-ip.info
111.222.333.444
```

## 補足

- Javaでプロキシサーバを通す場合

```java
// プロキシの情報を設定
System.setProperty("proxySet", "true");
System.setProperty("proxyHost", "111.222.333.444");
System.setProperty("proxyPort", "8080");

// 以下の通信は上で設定したプロキシが利用される
URL url = new URL("http://www.yahoo.co.jp/")
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
```

-------
おつかれさまでした
Flickrにアップロードした写真の撮影日時が間違っている場合の直し方

最近、写真サービスのFlickrが刷新され、カメラロールが使いやすくなった。時系列で写真がソートされ、タイル状に表示されるようになっている。自分でiPhoneや一眼レフで撮影した写真などExifデータがきちんと挿入されている写真は撮影日時のとおりにソートされるのだが、知人からもらった写真などのようなExifデータのない写真を撮影日時より後にアップロードすると撮影日時ではなくアップロード日でソートされてしまう。これがなかなかどうして気持ち悪い。

以下の方法で、Exifデータのない写真に撮影日時の情報を入れソート順を綺麗にすることができる。

* まず、カメラロールを開き、対象の写真を選択する(複数選択可)。
* そうすると画面下に選択した写真に対する操作をするためのビューが表示される。
* そこで`Edit`を選択すると中央に`Editing X photos`という画面が現れる。
* 次に`Data Taken`の項目を撮影日時に合わせる。
* 最後に`Save`を押せば完了である。

誰か最近リリースされたGoogle Photosで同じことをやる方法を教えてほしい。
リクエストメソッドで条件分岐したいとき

エラーが出ていて修正しようとコードを追っていったら・・・
どうやらcreateメソッドの中でパラメータを取得させている
ところで引っかかっていた。

通常の操作であるなら「ボタンを押して送信」というところを、
あるユーザーは直接URLを叩いたのかわからないがGETリクエストが
飛んでパラメータ取得できずにエラー。

最初、パラメータが存在するかしないかでの場合分けを書きプルリク
を提出。コメントをみたら「postじゃなかったらリダイレクトさせまし
ょう」となっていた。リクエストで条件分岐なんてやったことない！と
思いながらググったら出てきたのでメモ程度に残しておきす。


レファレンスでは
「[アクセスしたユーザの情報を取得(request)](http://railsdoc.com/references/request)」
というのがあった。



まあそんなんで結果はこんな感じ
postかそうでないかで場合分けしたかったので

```
 if request.post?
      p "---------"
    else
      p "---------"
    end
```
とした。。。。。。わかってしまうとすごく簡単ですね笑
コマンドラインで対応する括弧に移動する

# やり方

括弧にカーソルを合わせて `C-x C-b` するだけです。

# 説明

zsh には `vi-match-bracket` というウィジェットがありデフォルトで `C-x C-b` に割り当てられています。
括弧の種類は `()[]{}` に対応しているようです。
zsh の高機能な変数展開などを使いこなそうとすると、これらの括弧を多用することになるのでかなり便利です!
名前に vi 付いてますが Emacs 使いにもおすすめです!
AWS ElastiCache Redisを使ってみた

#AWS ElastiCache Redisを使ってみた

##背景の説明
* Rails 4でAPI開発
* Cacheサーバ: AWSのRedisを選んだ。

##設定
###AWS上の設定
[AWSのドキュメント](http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/GettingStarted.html)を参照すれば良い。
###Railsの設定
* config/environments/development.rb

```
# redis_storeとendpointのURIを設定すれば良い
config.cache_store = :redis_store, 'redis://endpoint-of-aws-redis:6379'
```

* config/initializers/redis.rb

```
require 'redis'

# ENV['REDIS'] = 'redis://endpoint-of-aws-redis:6379'
uri = URI.parse(ENV['REDIS'] || 'localhost:6379')
REDIS = Redis.new(host: uri.host, port: uri.port)
```

###Redis上
```
# 確認するため 
keys *

# キャッシュ全部を削除するため
flushall
```
RubyからCloudSearchを使う(基本)

(追記 6/12) あまりにも説明無かったので全般的に加筆。コードのところはいじってないです。

基本のところ。難しい事はしないです。

## 参考
[Amazon CloudSearch とは - Amazon CloudSearch](http://docs.aws.amazon.com/ja_jp/cloudsearch/latest/developerguide/what-is-cloudsearch.html)
[Module: Aws::CloudSearch — AWS SDK for Ruby V2](http://docs.aws.amazon.com/sdkforruby/api/Aws/CloudSearch.html)
[AWS CloudSearch を使ってみた - satococoa's blog](http://satococoa.hatenablog.com/entry/2014/12/05/215330)
[Amazon CloudSearchで全件対象のファセットを表示する。新着(123件)みたいなやつ。 ｜ Developers.IO](http://dev.classmethod.jp/cloud/amazon-cloudsearch-all-docs-facet/)


## Gem
[wellbredgrapefruit/asari](https://github.com/wellbredgrapefruit/asari)
[StevenJL/rawscsi](https://github.com/stevenjl/rawscsi)
などがあるらしいですが、
[File: README — AWS SDK for Ruby V2](http://docs.aws.amazon.com/sdkforruby/api/index.html)
こちらの公式gemを採用。理由は以下。

- 公式でもそんな複雑でも無い
- 経験上、メジャーじゃない(RDBに比べれば…)プロダクト使うときに柔軟性落ちると最初は良くても後でハマる。
- プロダクト自体が変化する可能性があるので追従してくれそう

## 認証
AWS SDKの普通の認証

```
Aws.config.update(region: "region",
                  credentials: Aws::Credentials.new("accesskey","secret"),)

```

## indexを作る。
これはweb consoleでやったので割愛。

## データを入れる
jsonは最大5MB、text-array/literal-array使うときはそれぞれ1000件制限らしいので注意。

```
client = Aws::CloudSearchDomain::Client.new(endpoint: "http://endpoint.xxx") # dashboardで見れる。document用の方
client.upload_documents(documents: {"hoge":"fuga"}.to_json, content_type: 'application/json') 

```

## データを検索する
簡単！ページングとかは次項を参照。

```
client = Aws::CloudSearchDomain::Client.new(endpoint: "http://endpoint.xxx") # dashboardで見れる。search用の方
client.search(query: 'hoge')

```

## 全データを表示する
とりあえず突っ込んだ全データ表示したくなりますよね？地味にluceneクエリを使う方法以外見当たらなかったので特記。
データ量多くなると思うので、ページング対応。
普通にlimit/offset形式のページングもありますが、取得する件数が多い(10,000件を超えると記述)ときは速度的にこちらを推奨とのこと。(参考：[Amazon CloudSearch の結果のページ分割 - Amazon CloudSearch](http://docs.aws.amazon.com/ja_jp/cloudsearch/latest/developerguide/paginating-results.html))

```
cursor = 'initial' # 最初はこの文字列固定。
loop do
  page = cl.search(
    query: '*:*',
    size: 1000, # 適当
    query_parser: 'lucene',
    cursor: cursor,
  )
  cursor = page.hits.cursor
  break if page.data.hits.hit.empty?

  page.data.hits.hit.each do |data|
    p data
  end
end

```

結果

```
#<struct id="1", fields={"hoge"=>["はまやらわ"]}, exprs=nil, highlights=nil>
#<struct id="2", fields={"hoe"=>["あ"]}, exprs=nil, highlights=nil>
...
```

## structured クエリを使う
ホントに単純なケース(webページみたいにとにかくテキスト突っ込んでid取得とか)を除けば、絞りこみ(filter_query使った方が良いですが)とかtagで完全一致にしたい…とかあるとstructuredを使う事になると思います。以下のようにspace区切りでand/or使って ()でネスト可能…という感じ。

```
page = search_client.search(
  query_parser: 'structured',
  query: "(or 'ほげ' hoge: 'ほげ')", # field指定しないと全てのtext fieldから検索される literalとかだとfield指定必須
)
```

## 所感
- 設定とかは超簡単だけど、Rubyからのサンプルはあんまり無い。公式ドキュメントが頼り。
- fieldの型変更とかで再indexすると数十分普通に待たされて急いでるとストレスフルなので、余裕が必要。
- elasticsearchに比べるとスキーマきっちり指定しないとエラーになるので柔軟性は低い…が、elasticsearchも自分でスキーマ設定するとindex作成前にする必要があるので大差は無い。
- elasticsearchで言う1indexしか1インスタンスでは作れないので、そこは残念。
IntelliJ IDEA Plugin SDKが表示されない

IntelliJ IDEAのプラグインを開発の準備として、IntelliJ IDEA Plugin SDKが見つからなかった。

本来なら
`File→Project Structure→Platform Settings→SDKs`
を選択して
`Add New SDK`
で
`IntelliJ IDEA Plugin SDK`
を追加すればいいはず。

しかし、IntelliJ IDEA Plugin SDKが表示されない。

そこで、
`Settings→Plugins`
から
`Plugin Devkit`
にチェックをいれたら無事表示されました。
Moodleのコンテキスト・ケイパビリティ・ロールについて

##対象バージョン
Moodle 2.8

##ケイパビリティとコンテキスト
has_capability()の2番目の引数にコンテキストを渡す必要がある
その際のコンテキストは、$context = context_xxxx::instance();で生成する（古いバージョンだと記法が違う）

context_xxxxには、以下の6種類がある
context_system, context_user, context_coursecat, context_course, context_module, context_block

どのcontext_xxxxを使えばいいかは、チェックしたいケイパビリティの定義部分にある'contextlevel'の値が参考になる
→必ずここに書いてある値を使わなければならないわけではないが、とりあえずcontext_systemを使っておけ的な考えだと、本来はtrue（権限あり）なのにfalseが返ってきてしまうことがある

has_capability()は、デフォルトでは$USER->idのユーザのケイパビリティをチェックする
他のユーザのケイパビリティをチェックしたければ、3番目の引数を渡せばいい

・コアのケイパビリティはだいたいlib/db/access.phpの中に定義されている
・context_xxxx系クラスの定義はlib/accesslib.phpの中に存在する

##ロールとコンテキスト
https://docs.moodle.org/2x/ja/%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6
あるコンテキストに対してロールが割り当てられた場合、それより下のコンテキストに対して常にそのロールが適用される
　例：「マネージャ」というロールは、システムロールとして割り当てることもできるし、コース内でだけ割り当てることもできる
　　　「コース作成者」というロールは、その性質上システムロールとして割り当てることしかできない（コース内で割り当てても肝心のコース作成ができないので）

##has_capability
・has_capability()の中で、管理者だったら問答無用でtrue等の処理を行うが、
　そうでない場合はhas_capability_in_accessdata()を呼び出す
・has_capability_in_accessdata()の中で、渡されたコンテキストのpath情報を見て、
　どこかの階層でCAP_ALLOWされていたりCAP_PROHIBITされていないかを見てtrue/falseを返す
→context_systemを渡すと、システムコンテキストのレベルでしかケイパビリティの有無をチェックしないが、
　context_course, context_coursecat等を渡せば、コースやコースカテゴリのレベルでもケイパビリティの有無をチェックする
→つまり、context_systemを使ってしまうと「本来はtrueなのにfalseを返してしまう」可能性が高くなる？
　「本来はfalseなのにtrueを返してしまう」という心配は要らない？