OmniAICreator/Qiita-1.07M huggingface dataset:
PHP7.2インストールメモ for Mac（Homebrew使用）

## Homebrewインストール

#### 1. Homebrewインストール

手順は公式サイトを参照
https://brew.sh/index_ja

#### 2. Homebrewの更新
<pre>
$ brew update
$ brew upgrade
</pre>

#### 3. 環境チェック
「brew doctor」実行時に表示されるwarningを解決しておく
<pre>
$ brew doctor
Your system is ready to brew.
</pre>

#### 4. 環境変数設定（.bash_profileにPATH設定を追加）
<pre>
$ cat &gt; ~/.bash_profile &lt;&lt;EOF
&gt; export PATH=/usr/local/bin:$PATH
&gt; export PATH=/usr/local/sbin:$PATH
&gt; EOF
</pre>

#### 5. Gitをインストール
<pre>
$ brew install git
</pre>

## PHPインストール

#### 1. HomebrewでPHPをインストール
<pre>
$ brew install php@7.2
</pre>
#### 2. php.iniの設定変更
「/usr/local/etc/php/7.2/php.ini」を必要に応じて編集
<pre>
date.timezone = Asia/Tokyo
default_charset = "UTF-8"
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII
</pre>
#### 3. バージョン確認
<pre>
$ php -v
</pre>
Haskellで逆ポーランド電卓

```hs:RPN.hs
module Main where
import System.Environment (getArgs)
import Control.Applicative

data RPValue = Number Int | Plus | Minus | Multiply | Divide deriving (Eq, Show)
data Frak = F Int Int deriving (Eq)
instance Show Frak where
  show (F n 0) = "NaN"
  show (F n 1) = show n
  show (F n m) = show n ++ "/" ++ show m
type Stack = [Frak]

reduce (F 0 0) = F 0 0
reduce (F n m) = F (div n (gcd n m)) (div m (gcd n m))
plus (F n m) (F a b) = reduce $ F (n*b+a*m) (m*b)
minus (F n m) (F a b) = reduce $ F (n*b-a*m) (m*b)
multiply (F n m) (F a b) = reduce $ F (n*a) (m*b)
divide (F n m) (F a 0) = F 0 0
divide (F n m) (F a b) = reduce $ F (n*b) (m*a)

process :: Stack -> RPValue -> Stack
process (x:y:xs) Plus = (plus y x):xs
process (x:y:xs) Minus = (minus y x):xs
process (x:y:xs) Multiply = (multiply y x):xs
process (x:y:xs) Divide = (divide y x):xs
process xs (Number n) = (F n 1):xs

parse :: String -> [RPValue]
parse = map parse' . words
  where
    parse' "+" = Plus
    parse' "-" = Minus
    parse' "*" = Multiply
    parse' "/" = Divide
    parse' str = Number (read str)

calc :: String -> Stack
calc str = foldl process [] (parse str)

main = mapM_ print =<< calc.head <$> getArgs

```

```shell-session
> ./RPN " 12 7 + 5 6 * / 7 8 + 19 2 * / - 20 3 + 11 /"
23/11
68/285

> ./RPN " 12 0 / 1 3 / +"
NaN
```
tmuxの基本的なコマンド

#基本操作
C-b d : デタッチ
$ tmux list-sessions (tmux ls) : セッション確認
$ tmux attach -t mysession (tmux a) : アタッチ ※mysessionは数値でもOK
$ tmux kill-session -t mysession : セッションの終了

#ウィンドウ
C-b c : ウィンドウを作成
C-b , : ウィンドウ名を変更
C-b w : ウィンドウ一覧表示/移動
C-b p : 前のウィンドウに移動
C-b n : 次のウィンドウに移動

#ペイン
C-b " : ペイン分割(横)
C-b % : ペイン分割(縦)

C-b ! : ペイン分割解除
C-b x : ペイン強制終了

C-b o : ペイン間移動
Coqで学ぶ定理証明入門メモ

edubase Streamで配信していた、『Coqで学ぶ定理証明入門』を見てみたのでそのメモ。

# 概要
講師がCoqを使って簡単な例題を解きながら操作を説明し、
それにあわせて実際に手を動かしながら操作を体験することでCoqの使い方を学べる。
演習もあるので、説明を受けた操作をどう組み合わせるかなーといったことを考えながら試行錯誤できる。

定理証明を進めるためのツールとしてCoqの使い方に慣れましょう、という内容なので、
定理証明を学習するという目的には適していないと思う。

また、最後にオンラインドキュメントや書籍、勉強会などの参考情報があるので、
この講義を受けた後のアクションプランも分かりやすいかなと思う。

ただし、2011年の集中講義の内容らしいので、色々古い情報もある。
（特に勉強会とか）

# 時間
4.5時間程度。

* 動画は3分割されていて、1.5時間、1.5時間、1時間くらい。
* 上記に加えて、演習に0.5時間くらいかけた。

# 内容
略。時間があったら追記する。

# TODO
最後の演習が残なのでやる。

# 参考情報（と紹介されているもの）
#### [Coq本家のリファレンス] (https://coq.inria.fr)
* 本家は王道

#### [Jacques Garrigue先生の講義資料] (http://www.math.nagoya-u.ac.jp/~garrigue/lecture/)
* 数理解析・計算機数学がCoqの使い方っぽい

#### [CPDT] (http://adam.chlipala.net/cpdt/)
* Coqのすごい人の講義資料

#### [Coqt] (http://www.iij-ii.co.jp/lab/techdoc/coqt/)
* IIJのアルバイトの方が書いたCoqの入門記事

#### [Coq'Art] (http://www.amazon.co.jp/Interactive-Theorem-Proving-Program-Development/dp/3540208542)
* Coqの中身についてもがっつり書いている

#### [fm-forum] (http://www39.atwiki.jp/fm-forum/)
* 形式手法についての勉強会

#### [ProofCafe] (http://www.proofcafe.org/index.html)

#### Proof Summit

#### 函数プログラムの集い
EPEL/REMIリポジトリを追加（CentOS）  

#EPEL
**GPG KEY**

```
rpm --import http://download.fedora.redhat.com/pub/epel/RPM-GPG-KEY-EPEL  ※廃止
rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-5
rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6
```

**RPM**

```
rpm -ivh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm  ※廃止
rpm -ivh http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
rpm -ivh http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
```

#REMI
**GPG KEY**

```
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
```

**RPM**

```
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
```
Xamarinを1週間使ってみて、ネイティブアプリとモバイルWebのどちらを選ぶべきか


## Xamarinのネイティブアプリ

XamarinでAndroidのネイティブ開発は、.NETでクライアント・サーバーの開発をしている感覚に近いです。InputManみたいなコントローラーが欲しくなります。.NETコンポーネントベンダーが、Xamarin向けに有償コンポーネントを販売しています。BaaSプロバイダーでもあるTelerikのよい立ち位置です。

* [Syncfusion](http://www.syncfusion.com/products/xamarin)
* [Telerik](http://www.telerik.com/xamarin-ui)
* [Steema](http://www.steema.com/xamarinforms)
* [ComponentOne](http://www.componentone.com/Members/xuni.aspx)
* [DevExpress](https://www.devexpress.com/Products/Xamarin/)
* [Infragistics](http://www.infragistics.com/infragistics-xamarin-forms)

エンタープライズの.NETエンジニアがモバイルファーストを指向するとき、モバイルに入りやすいです。Xamarin.FormsではXAMLも使えます。ただ、クラサバの時代からあるインストールと配布の問題はそのままです。カジュアルな関心事のために、ネイティブアプリをインストールしません。モバイルにインストールできるアプリの数には限りがあります。ブラウザだけですぐに最新情報を配信できるWebが開発の現場で選ばれてきました。

## GoogleのモバイルWeb

Googleが2014年の葛藤を経てWebに戻ってきたようです。ブランド力やロイヤリティの高いサービス以外は、これから数年モバイルWebを優先して整備する需要が多くなりそうです。

* [グーグルはモバイルWebにどんな備えをしているのか？](http://readwrite.jp/archives/18142)
* [ネイティブアプリ活況下でのWeb](http://blogos.com/article/102996/)
* [Googleの視点からスマホの集客を考える](http://msnjnp.hatenablog.com/entry/2015/01/09/085224)
* [The Future of the Web (According to Google)](https://divshot.com/blog/opinion/the-future-of-the-web-according-to-google/)
春だ！IoTだ！sango経由でTesselとMQTTで通信だ！

2015年でIoTがドカーンとアレで何かが凄いらしいのでTesselとサーバを通信させてあれこれ遊ぼうとしているんだけど、どうもTesselはネットワークとか色々弱いので低コストなプロトコルと評判のMQTTで通信してみる。
MQTTサーバ構築とかは面倒なので[sango](https://sango.shiguredo.jp/)の無料のライトプランを利用。試してないけど、sangoじゃなくても[CloudMQTT](http://www.cloudmqtt.com/)とかでも似た感じだと思う。

### publisher (tessel)
```javascript:tessel-publisher.js
var mqtt = require("mqtt"),
    config = require("./config.json"),
    client = mqtt.createClient(config.port, config.host, config.options),
    tessel = require('tessel'),
    climate = require('climate-si7020').use(tessel.port['A']);

climate.on('ready', function ready() {
  console.log('climate ready');
  setInterval(function() {
    climate.readTemperature(function(err, temperature) {
      if (err) return;

      var msg = temperature.toString();
      console.log(msg);
      client.publish(config.topic + "/tessel", msg);
    });
  }, 20000);
});
```

こんな感じで気温を取ってきてpublishするだけのプログラムを作成。
MQTT部分は[MQTT.js](https://github.com/mqttjs/MQTT.js)を使った。2015/1/15時点での最新版は1.0.1なんだけど機能がだいぶ増えてて依存性も増えてるっぽいので、今回は[v0.3.13](https://github.com/mqttjs/MQTT.js/tree/v0.3.13)を利用。Tesselはnode.jsとの互換性に割と難があるので、依存が増えると罠を踏みがち。

ユーザ情報とかの設定ファイルも安心と信頼の生json。こんな感じ。

```json:config.json
{
  "host": "lite.mqtt.shiguredo.jp",
  "port": 1883,
  "options": {
    "username": "username@github",
    "password": "xxxxxx",
    "keepalive": 10000
  },
  "topic": "username@github"
}
```

## subscriber (server)
```javascript:subscriber.js
var mqtt = require("mqtt"),
    config = require("./config.json"),
    client = mqtt.createClient(config.port, config.host, config.options);

client.subscribe(config.topic + "/#");

client.on("message", function(topic, message) {
  console.log(topic, message.toString());
});
```

で、普通にサーバ側で動作させる、subscribeして受け取ったメッセージを出力するだけのプログラムを用意。こっちはなんでもいいんだけど、別に別言語にする理由もないのでnode.jsにした。設定ファイル使いまわせるし。

## 実行結果

### publisher (tessel)
```
$ tessel run tessel-publisher.js 
TESSEL! Connected to TM-00-04-f0009a30-005e4f56-5cba6249.
INFO Bundling directory /Users/hogelog/repos/hogelog/js/hello-mqtt
INFO Deploying bundle (469.00 KB)...
INFO Running script...
climate ready
25
25
26
```

### subscriber (server)
```
$ node subscriber.js 
hogelog@github/tessel 25
hogelog@github/tessel 25
hogelog@github/tessel 26
```

tesselが取得した気温情報をサーバ側で受け取れている。

ちょっと前、TesselとIRCプロトコルで通信してみようと[アレコレめっちゃ苦労した](https://github.com/hogelog/node-irc-tessel)結果不安定で無理だなーと諦めたんだけど、MQTT使ったら当然のように普通にあれこれ通信できて笑える。IoT向けなプロトコルとしても注目されてて、それを動作させるために[Tesselの中の人も頑張ってる](https://forums.tessel.io/t/attempting-to-use-mqtt/50)んだし当たり前かもしれないけど。時代はMQTT。

↑の方に書いたソースコードとかは https://github.com/hogelog/hello-mqtt-node に全部あります。

### 参考にしたページとか
- https://www.npmjs.com/package/mqtt
- http://blog.technical.io/post/98339010407/mqtt-on-tessel
訪問者の有無を確認してからApacheを再起動させる方法

再起動する前に訪問者がいないかどうか確認する。

> tail -f access_log

tailにオプション-fを付けることでログが常に表示される。


訪問者がいなくなった瞬間にApacheを再起動させてくれる httpd gracefulを使用します。

> /etc/init.d/httpd graceful

ちなみに再起動前にエラーチェックはしましょう。
> /etc/init.d/nginx configtest
getopt

ヘッダ \<unistd.h\>

```c

int getopt(int argc, char *const argv, const char *options)

```

argvに格納されたオプション・リストから次の文字を取得し、その１文字を返す。
取得する文字がなくなった場合-1を返す。その場合、optind と argc を比較し、オプションの終端に達したかチェックすること。

options には利用するオプション文字を指定しておく。
options に指定しておいた文字列が argv に存在しない場合'?'が返る。

コロン(:)が付けられたオプション文字には引数を必要とする。(-p <i>name</i>)
オプションに引数を要する場合、optarg にそのオプションの引数が格納される。

２つのコロン(::)が付けられたオプション文字は任意の指定を許可する(GNU 拡張)

<b>int opterr </b>

不正なオプションが指定された場合 非ゼロの値が設定され、標準エラー出力にメッセージを出力する。
明示的にゼロを設定するとgetopt()はエラーメッセージを出力しないが、'?'文字はエラーを指し示している。

<b>int optopt</b>

不正なオプションが指定された場合にその文字を格納する。

<b>int optind</b>

<i>argv</i> の次のインデックスを指す。初期値として1が与えられる。
getopt()は一回の呼び出しにより、すべてのオプションを走査する。
この値をチェックすることで残りのオプションを調べられる。

<b>char* optarg</b>

オプションに引数を要する場合、そのオプションへの引数を手当てする。


サンプル

オプションに引数を要するオプション

```c 
int main(int argc, char* argv[])
{
    int c = getopt(argc, argv, "a:");

    if(argc==1) {
        fprintf(stderr, "require option: %c\n", optopt);
        return 1;
    }
    if(c=='?' || optind!=3) {
        return 1; /* エラーメッセージは自動的に手当される */
    }

    const char* a = optarg;
    fopen(a, "w");
    ....
    return 0;
}

```

オプション -a -b -c や -abc を許可する。("abc"は順不同)
同時に指定されるとマズイことになるオプションに気をつける。

```c

int main(int argc, char* argv[])
{
    int c;
    while( (c=getopt(argc, argv, "abc")) != -1) { ... }
    return 0;
}

```
GNU C Library -getopt
http://www.gnu.org/software/libc/manual/html_node/Getopt.html
現役学生と将来のプログラマのためのProcessing#1


#目的
現役の専門学校学生さん達にProcesingを学んでもらうために記述しています。
ついでに、将来のプログラマ、教育に関わっている人達に何かの助けになるといいな。
もっと評価されていいと思う。

#インストール
プラットフォームを選択してダウンロードして下さい。
その後はzip展開だけです。（多分）

https://processing.org/download/?processing
![kobito.1421330011.865512.png](https://qiita-image-store.s3.amazonaws.com/0/33317/706723c5-00a7-847f-54d2-7abb6f34dfa2.png "kobito.1421330011.865512.png")

#起動
起動するとWindowが出ます。背景がキリンなのは私の趣味ですあしからず。
![スクリーンショット 2015-01-15 23.05.04.png](https://qiita-image-store.s3.amazonaws.com/0/33317/32800f25-3f20-2d23-2b08-431c50411134.png "スクリーンショット 2015-01-15 23.05.04.png")

##サンプル実行
File->Examplesからテキトーに選んでみます。Run!
![スクリーンショット 2015-01-15 23.15.07.png](https://qiita-image-store.s3.amazonaws.com/0/33317/f6c0a99d-e0df-ebdd-2ddc-40c7e83c7eb7.png "スクリーンショット 2015-01-15 23.15.07.png")

###BackGroundImage
![スクリーンショット 2015-01-15 23.25.02.png](https://qiita-image-store.s3.amazonaws.com/0/33317/bbd3a971-bf23-2d4c-34d8-f10d79ce08fe.png "スクリーンショット 2015-01-15 23.25.02.png")

###SineWave
![スクリーンショット 2015-01-15 23.10.49.png](https://qiita-image-store.s3.amazonaws.com/0/33317/3f11a498-c881-761b-8b36-66a7554983b5.png "スクリーンショット 2015-01-15 23.10.49.png")

###3dモデル作成
http://shapeshifter.io/
MacへModern.ieをインストールする

#Modern.ieの利点
Modern.ieを使えば仮想マシン上でWindowsとIEを動かすことができます。
1月に入ってサイトがリニューアルされ、ダウンロード方法が変わったのでメモしておきます。
#事前準備
インストールする前にVirtualBoxをインストールしておきます。
#仮想マシンのダウンロード
以下のURL(modern.ieのダウンロードページ)にアクセスします。
[https://www.modern.ie/ja-jp/virtualization-tools#downloads](https://www.modern.ie/ja-jp/virtualization-tools#downloads)
次に、ダウンロードするマシン、プラットフォームを選択し"Download Zip Archive"を選択します。![スクリーンショット 2015-01-14 20.44.27.png](https://qiita-image-store.s3.amazonaws.com/0/65320/ee9d7926-ca30-ee1b-3f9e-c020942078b2.png)
かなりダウンロードに時間がかかるので気長に待ちます。
#仮想マシンのインストール
ダウンロードされたZipファイルをダブルクリックして解凍します。
展開すれば画像のようなOVAファイルができているはずです。![OVAファイル](https://qiita-image-store.s3.amazonaws.com/0/65320/bb1c5eb4-47b2-d7a3-b652-72c6d786cf50.png)
ダブルクリックするとVirtualBoxで開き、インストールできます。
FTPでリモートにファイルを転送できないとき

FTPでファイルが転送できないときは**権限に原因がある場合**があります。お試しあれ。

今回はこれで引っかかりました。

1. リモート側の転送したいディレクトリの権限をチェック

> ls -la

実行結果
drwxr-xr-x  (755)

2. chmodで権限を一旦777にする

> chmod 777 hoge

実行結果
drwxrwxrw (777)

3. FTPから再度転送する
複数人で開発するとき git 管理から外す指定方法 3 パターンの使い分け

周りを眺めてると意外とプロジェクトルートの gitignore に環境依存の指定を大量に書いてるプロジェクトや、「exclude は知らなかった」とかのケースあったので、まとめてみる。

# gitignore (global)

* ホームディレクトリ内に置いといたファイル内容を、全 git プロジェクトで共通して除外指定するやり方
* 利用シーン
    * **自分の環境に依存する**
    * **特定のプロジェクトに依存せず無視したい**
* 例
    * `.DS_Store`
    * `Thumbs.db`
    * `Session.vim`

## global な gitignore の設定方法

### 方法1

OSX の場合 `$HOME/.config/git/ignore` を配置して書いていけばOK。

`$ man gitignore` や [Git - gitignore Documentation](http://git-scm.com/docs/gitignore) を確認すると、次のように書いてあるので、デフォルトにならうことにした。

>  Its default value is `$XDG_CONFIG_HOME/git/ignore`. If `$XDG_CONFIG_HOME` is either not set or empty, `$HOME/.config/git/ignore` is used instead.

### 方法2

よくみかける設定方法はこっち。

```console
$ git config --global core.excludesfile $HOME/.gitignore_global
```

とすると

```cfg:~/.gitconfig
[core]
    excludesfile = /home/${USERNAME}/.gitignore_global
 
```

と追記される。



# gitignore (local)

* `GIT_PROJECT_ROOT/.gitignore` に無視したい対象を書いていく、一番ポピュラーなやり方
* 利用シーン
    * **プロジェクト依存**
    * 開発者間で無視する対象を **共有したい**
* 例
    * `.rspec`
    * `/log`
    * `/tmp`

開発者の環境依存なファイルは global なほうの gitignore で、というルールにしてしまえば、完全にそのプロジェクト固有で無視したいものだけを書けるのですっきりする

# exclude

* `GIT_PROJECT_ROOT/.git/info/exclude` に書くやり方
* 利用シーン
    * **プロジェクト依存**
    * 開発者間で無視する対象を **共有したくない**

プロジェクト依存なので global な gitignore に書きたくないけど、共同作業してる開発者に共有するかんじでもない、みたいなときに

いまのところ僕は使ったことない


# 参考

* [Git - gitignore Documentation](http://git-scm.com/docs/gitignore "Git - gitignore Documentation")
    * `$ man gitignore` でも同じやつ見られる
* [github/gitignore](https://github.com/github/gitignore "github/gitignore")
    * github が公開してる gitignore のテンプレート集で、これみながら設定しとけばだいたい大丈夫
* [gitignore.io - Create Useful .gitignore Files For Your Project](https://www.gitignore.io/ "gitignore.io - Create Useful .gitignore Files For Your Project")
    * いちいち手動で書いていくのだるい、コマンドで一発でうまいこと生成してほしい派の人向け
Railsプロジェクトを最速Herokuデプロイ

## 前提条件

- ローカルでRailsプロジェクトが生成できる
- herokuアカウント作成済
- heroku toolbeltインストール済


## Rails

```shell:
$ rails new {project name}
```

Herokuはsqliteは使用できない等、制約がある。

なのでGemfileを調整：

```ruby:Gemfile
source 'https://rubygems.org'
ruby '2.0.0' 	# rubyバージョンを指定


# 7行目くらいにあるsqliteの指定をコメントアウト：
# gem 'sqlite3'


# 末尾に以下追加：

#####################
# add gems
#####################

group :development, :test do
  gem 'sqlite3'
end
 
group :production do
  gem 'pg'
  gem 'therubyracer-heroku'
  gem 'thin'
end

group :production, :staging do
  gem 'rails_12factor'
end
```

注意：
ローカルrubyバージョンとGemfileに記載したrubyバージョンは合わせる必要がある。
（合っていない場合の対処については<del>別途記事を書く予定</del>  書きました：[rbenvでローカル及びHerokuのRubyバージョンを合わせたい](http://qiita.com/m_sano9999/items/f6e93bbed2934b4add0a)）

問題がなければ再インストール：

```shell:
$ cd {project path}
$ bundle install
```

## Git

```shell:
$ git init
```

## Heroku
ログインしてなければする：

```shell:
$ heroku login
```

Heroku側にアプリの場所作る：

```shell:
$ heroku create
```

create直後はランダムなアプリ名を付与されるので、
HerokuのDashboardへ行き、任意のアプリ名に変更する。

アプリ名を変更した時点で、gitのリモートリポジトリパスも変更する必要がある（参考：[Updating Git remotes - Renaming Apps from the CLI | Heroku Dev Center](https://devcenter.heroku.com/articles/renaming-apps#updating-git-remotes)）

なので：

```shell:
$ git remote rm heroku
$ heroku git:remote -a {変更したアプリ名}
```

更にプロジェクト直下にProcfile用意、以下を記述：

```ruby:Procfile
web: bundle exec rails server thin -p $PORT -e $RACK_ENV
```

色々揃ったのでHerokuへpush：

```shell:
$ git add -A
$ git commit -m "first commit"
$ git push heroku master
```

ページが無事開ければOK：

```shell:
$ heroku open
```
プログラマになること#6


#記述する動機
私、とある専門学校でPGを教えています。はや８年。いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、あえて公開していきたいと思います。全て実例です。個人名は秘密！！

#８年の成果
![スクリーンショット 2015-01-15 21.21.27.png](https://qiita-image-store.s3.amazonaws.com/0/33317/c3e73ad4-be1e-6532-bf80-d26732729448.png "スクリーンショット 2015-01-15 21.21.27.png")
##「病気」
専門学校、特に認可校の場合、誰でも入学可能です。
従って、問題を抱えていても、「入学」は出来ます。
ここで「病気」というのは「本当の病」です。
ADHD、LD、対人恐怖、境界性人格障害、うつ病、アダルトチルドレン症候群、XX依存（私はドクターではないので、断定はできないです。知人のドクターも多分そうでしょうとのことでした）
平均で３割です。

##「未学習」
大丈夫です。学歴なんぞいりません。
10年分を取り戻します。
半分は翌年以降にコンピュータ関連に就職。
半分はコンピュータ以外に就職。
皆、笑って生きてます。時々会いに来てくれます。

##「就職」
卒業と同時に、Web、システム、制御、その他プログラマとして頑張ってます。

##教える限界
私はお医者では無いので、「病」を治すことはできません。
Rails4のhas_many throughで多対多のリレーションを実装する

僕の運営しているサービス「[Combinator](https://www.combinator.jp/ja/projects "Combinator")」には、仲間集めをしているプロジェクトがたくさん掲載されています。それらのプロジェクトに対して、カテゴリを持たせるたせる開発を行います。具体的には、「Qiita」は、「ウェブサービス」といったカテゴリを持ったプロジェクトであるといった表現ができるようにします。

今回は、has_many throughで多対多のリレーションを実装しました。

![スクリーンショット 2015-01-15 20.53.04.png](https://qiita-image-store.s3.amazonaws.com/0/48577/c94de153-fda8-8e55-1043-3414b1060222.png)


>１プロジェクトは複数のカテゴリに属するので、「プロジェクト」から見ると「カテゴリ」は"多"です。
>１つのカテゴリには、多数のプロジェクトが存在するので、「カテゴリ」から見ると「プロジェクト」も"多"です。
>このような関係を「多対多関係」といいます。

#マイグレーションファイルを作成する

テーブルを普通に作成し、最後に中間テーブルに両方のテーブルの外部キーを定義して作成します。
Categoryモデルとcategoriesテーブルの作成します。

>$ rails g model Category title:string
>$ rake db:migrate

Projectモデルとprojectsテーブルの作成します。

>$ rails g model Project title:string 
>$ rake db:migrate

CategoryProjectモデルとcategories_projectsテーブルの作成します。

>$ rails g model CategoryProject category_id:integer project_id:integer
>$ rake db:migrate


#モデルにhas_manyを追加する

##Categoryモデル
```rb:app/models/category.rb
class Category < ActiveRecord::Base
  has_many :category_projects
  has_many :projects, through: :category_projects
end

# throughオプションによりcategory_projects経由でprojectsにアクセスできるようになる
# category.projectsでプロジェクトにアクセスができる
```

##Category_projectモデル(中間テーブル)
```rb:app/models/category_project.rb
class CategoryProject < ActiveRecord::Base
  belongs_to :category
  belongs_to :project
end
```

##Projectモデル
```rb:app/models/project.rb
class Project < ActiveRecord::Base
  has_many :category_projects
  has_many :categories, through: :category_projects
end

# throughオプションによりcategory_projects経由でcategoriesにアクセスできるようになる
# project.categoriesでカテゴリにアクセスができる
```


これらによって、
あるCategory属性を持つProjectを全て抽出したり
あるProjectに付与されているCategory属性を抽出できるようになる。

Controller・View周りの実装については次回！

参照：
http://ruby-rails.hatenadiary.com/entry/20141204/1417688260
複数選択チェックボックスを入力必須にする方法

ラジオボタンと同様にただ「required」を付ければ良いと思っていましたが、チェックボックスだと違いました。

> required属性について
ラジオボタンとは異なり、チェックボックスでは部品単位で指定することになります。

ということで、jQueryのプラグインvalidate.jsを使うことに。

以下はサンプル。

```html

<!doctype html>
<html>
<head>
<meta charset="utf-8" content="">
<title>jquery.validateのサンプル</title>
<link href="http://code.jquery.com/ui/1.9.2/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js" type="text/javascript" ></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js" type="text/javascript"></script>
<script src="./dist/jquery.validate.min.js"></script>
 
<!-- スクリプト部分 -->
<script type="text/javascript">
$(document).ready(function() {
    $("#testForm").validate({});
});
</script>
</head>
 
<!-- HTML部分 -->
<body>
    <form id="testForm" method="POST" action="./index.html">
      <input type="text" name="testinput" class="required"/>
      <br/>
      <input type="submit" value="submit"/>
    </form>
</body>
</html>

```

また、複数チェックした場合にPHPで値を受け取りたい場合は配列を使う。

```html+php

<input type="checkbox" name="test[]" value="hoge" />hoge<br />
<input type="checkbox" name="test[]" value="fuga" />fuga<br />
<input type="checkbox" name="test[]" value="piyo" />piyo<br />

<?php
$test = $_post['foo'];
var_dump($test);

array(3) {
  [0]=>
  string(4) "hoge"
  [1]=>
  string(4) "fuga"
  [2]=>
  string(4) "piyo"
}
WordPressでSQL Serverを使用しているときに「Fatal error: Cannot access empty property」というエラーが出たときの対処方法

本来はWordPressのデータベースにSQL Serverを使うことはできませんが、
[WP Db Abstraction](https://wordpress.org/plugins/wordpress-database-abstraction/)というプラグインを導入することで使えるようになります。Windows統合認証でシングルサインオンできるプラグインなどがあるのでWindows環境でWordPressを使うのはなかなか便利です。

# 問題発生

が、WP Statisticsというアクセス解析のプラグインを追加したところ、アクセス解析の結果表示部分に「Fatal error: Cannot access empty property」というエラーが表示されてうまく動きませんでした。

このエラーは以下の場所で発生しているのでWP Db Abstractionが原因ということで間違いないようです。

```php:wp-db-abstraction/drivers/pdo.php--行594
$this->last_result = $this->result->fetchAll(PDO::FETCH_OBJ);
```

エラーはPDOのfetchAllメソッドの中で発生しています。PDO::FETCH_OBJを指定した場合、fetchAllメソッドは戻り値としてカラム名をプロパティ名としたオブジェクトが返ってくるのですが、どうやらそのプロパティ名がおかしいため(おそらく空?)エラーになっているようです。

エラーになるときに実行されたSQLは以下のものでした。

```sql
SELECT SUM(visit) FROM wp_statistics_visit WHERE last_counter = '2014-12-02'
```

どうやら「SUM(visit)」という名前のプロパティを作ろうとして失敗しているようです。エラーはempty propertyなので、あるいはプロパティに使えない名前として明示的に空文字列にした挙句に失敗しているのかもしれません。

# 原因

WP Db Abstractionはなかなかきわどいことをしているプラグインで、WordPressのデータベース接続オブジェクトが入っている$wpdb変数を独自のオブジェクトに入れ替えて、そのオブジェクトでSQLをSQL Serverで実行できる形に変換するということを行っています。

MySQLとSQL ServerではSQLの記述方法が異なる場合があり、たとえば最後に挿入した行のIDを取得する方法はMySQLでは``LAST_INSERT_ID()``ですが、SQL Serverでは``@@IDENTITY``です。その他``LIMIT``が``TOP``だったりと色々と差があるのですが、これらを逐一変換するという実に面倒なことを行っています。

それらの変換が必要なパターンのうち``SUM(visit)``のようなSELECT文に計算式が指定されるパターンが漏れているようです。

とはいえWordPress本体には記事の件数表示があるので``COUNT(*)``などにも対応していないとは考えずらいので該当する処理を探したところ、以下のように``COUNT()``にだけ対応したコードがありました。

```php:wp-db-abstraction\translations\sqlsrv\translations.php--行480
        // Computed
        // This is done as the SQLSRV driver doesn't seem to set a property value for computed
        // selected columns, thus WP doesn't have anything to work with.
        if (!preg_match('/COUNT\((.*?)\) as/i', $query)) {
            $query = preg_replace('/COUNT\((.*?)\)/i', 'COUNT(\1) as Computed', $query);
        }
```

この処理からすると、MySQL用のPDOドライバが計算式にComputedという別名を自動的に付けるという挙動にWordPressが依存しているということなのでしょうか。

# 解決方法

以下のようにSUM関数も置換対象になるように修正すれば動作するようになります。

```php:wp-db-abstraction\translations\sqlsrv\translations.php--行480
        // Computed
        // This is done as the SQLSRV driver doesn't seem to set a property value for computed
        // selected columns, thus WP doesn't have anything to work with.
        if (!preg_match('/(COUNT|SUM)\((.*?)\) as/i', $query)) {
            $query = preg_replace('/(COUNT|SUM)\((.*?)\)/i', '\1(\2) as Computed', $query);
        }
```
Resolve circular dependencies with webpack

Replace class reference with `require()`

# example

```coffeescript:foo.coffee

Bar = require './bar'

class Foo
  @foo: () -> 'foo'
  @bar: () -> Bar.bar

```

```coffeescript:bar.coffee

Foo = require './foo'

class Bar
  @foo: () -> Foo.foo
  @bar: () -> 'bar'

```

# solution

```coffeescript:foo.coffee

class Foo
  @foo: () -> 'foo'
  @bar: () -> require('./bar').bar

```

```coffeescript:bar.coffee

class Bar
  @foo: () -> require('./foo').foo
  @bar: () -> 'bar'

```

or with container


```coffeescript:container.coffee


class Container
  get: (name)->
     Foo = require 'foo'
     Bar = require 'bar'
     (0, eval)(name)
```

```coffeescript:foo.coffee
container = require('container')
class Foo
  @foo: () -> 'foo'
  @bar: () -> container.get('Bar').bar
```


#ref
http://slidedeck.io/unindented/webpack-presentation
Gitを使って差分ファイルと差分情報を簡単に納品するコマンドのメモ

納品を行った後、修正依頼が来て修正対応後 納品する際に「差分ファイルと差分情報が欲しい」と言われることも多々あると思います。
この場合に手動でチマチマやっていると時間がかかりますが、Gitだと簡単に情報がまとめられるとのことなのでそれらの情報をメモしてみます。

# やりたいことの流れ
* 初回納品
    * 納品バージョンのタグを付ける 
    * 全てのファイルをZIPにする
* 修正依頼が来てファイルを修正する
    * 修正バージョンのタグを付ける
    * 差分ファイルをZIPにする
    * 差分情報をメモする

## 初回納品/全てのファイルをZIPにする
まずは納品したいブランチでタグを付ける。納品用ブランチを作っておくとよいと思う。
例としてtag名はv1.0

* 注釈付きタグ名付与

```
$ git tag -am "納品 Ver1.0" v1.0
```
* タグを反映

```
$ git push origin v1.0
```

または全部のタグをPUSH

```
$ git push origin --tags
```

* ZIP化
    * そして納品したいtagをZIP化する。ここでは「v1.0」を「hoge.zip」。最新版をZIP化したい場合はHEADでもOK
        * rootはファイルを入れるフォルダ名
        * hogeは圧縮ファイルの名前

```
$ git archive --format=zip --prefix=root/ v1.0 > ../hoge.zip
```

上記で１階層上にhoge.zipができている。
中身を確認して納品


## 修正対応後 差分ファイルと差分情報をまとめる。
ここから本題
まずは修正してタグ名まで付ける。

```
$ git tag -am "修正納品 Ver1.1" v1.1
$ git push origin v1.1
```

### 差分ファイルのみZIPにする
タグとタグ間の差分ファイルをまとめてZIPにします。変更のあったファイルのみ圧縮されるので納品用にピッタリ。

```
$ git archive --format=zip --prefix=root/ v1.1 `git diff --name-only v1.0 v1.1` -o ../hoge.zip
```
> リネームしたり削除したファイルがあってエラーが出たらフィルターを掛ける。

```
$ git archive --format=zip --prefix=root/ v1.1 `git diff --name-only --diff-filter=AMCR v1.0 v1.1` -o ../hoge.zip
```
> 追加・修正・コピー・リネームしたファイル
> おかしい場合は git diff --name-status --diff-filter=AMC v1.0 v1.1 で該当ファイル一覧をチェックしてフィルターを変更してみるとよい。
> 後ろのdiffで v1.0 v1.1 としているのは v1.0からv1.1へ削除や加えたファイルなどがあるため。修正なら逆でも問題ないがフィルターの追加と削除の意味が逆になるっぽい。

| フィルタ | 意味 |
|:-----------|:-----------|
| M | 修正 |
| A | 追加 |
| C | コピー |
| R | リネーム |
| D | 削除 |


### 差分情報（Diff）をメモする
* まずは修正したファイルの一覧情報を取得

```
git diff --name-status v1.0 v1.1
```
> --name-statusでファイル名と変更ステータスのみ表示

* 次に修正したファイルの詳細情報をDIFF

```
$ git diff --diff-filter=M v1.0 v1.1
```

* ファイルでHTMLのみピックアップしたい場合は以下

```
$ git diff --diff-filter=M v1.0 v1.1 *.html
```

* UTF8でなくてファイルがSJISなどで保存されている場合は以下

```
$ git diff --diff-filter=M v1.0 v1.1 *.html | iconv -f SJIS
```

* リネームとかしててファイルを指定していしたい場合は

```
$ git diff --diff-filter=M v1.0:test.html v1.1:index.html
```

* 適当にコピってメモ帳に貼り付け

便利！だけど、まだまだ難しい。
現役学生と元教え子ちゃんの為のPHP入門#2

#目的
学生さんにPHPを学んでもらうために記述しています。
ついでに、「初心者」さん限定ですが、参考までに
わかってる人たちには不要な記事です。

#挙動確認編
ターミナルよりコマンド発行しバージョン確認。
ローカルホストにinfo.phpを配置し確認。

##コマンド
ターミナルよりphp -v

##ローカルホスト
以下MAMPにて
スタートページからphpinfo
これはMAMP標準のphpinfoのページですね。
環境がちょいと古いので5.4.4です。
2015/01/15時点では5.5.xと成るはず。

![kobito.1421321457.105798.png](https://qiita-image-store.s3.amazonaws.com/0/33317/00add3a0-aec2-6eaf-c858-43ca55560171.png "kobito.1421321457.105798.png")

##ドキュメントルート
/Applications/MAMP/htdocsに　/myphptestを作成します。
info.phpを配置。
```php:info.php
<?php
phpinfo();
?>
```

![スクリーンショット 2015-01-15 20.44.51.png](https://qiita-image-store.s3.amazonaws.com/0/33317/c6a59764-b686-6279-b4a0-618496aa15cc.png "スクリーンショット 2015-01-15 20.44.51.png")

##ポイント
ローカルホストのOS、サーバー環境のセットアップによって、色々と混乱しちゃうけど、「ブラウザが識別するローカルホストのルートはどこ？」「php.infoがちゃんと見える？」
配色センスがいらなくなる便利ツールサイト coolors/colores


配色って結構迷いますよね。プレゼンを作るにも、既存のテンプレートを流用してばかりだと工夫がなく相手からも飽きられてしまう恐れもあります。


配色ごときに時間を取られたくないという方も多いと思います。色を重要な要素として扱うか否かは、個人差がありそうですね。そこで、センスの良い配色をシンプルに示してくれるサイトをご紹介します。



### coolors

http://coolors.co

 
上記リンクへ飛んで、「スペースキー」を押してみてください。配色がどんどん変わります。

もちろん、ある一色だけを固定して他を変えたり、気に入った配色をエクスポートしたりできます。
ユーザアカウントを作って、配色を保存したり、シェアしたりすることもできます。

![Image.png](https://qiita-image-store.s3.amazonaws.com/0/12790/2596091e-f4a6-da5d-57ae-c652537a4e52.png)



### colores

http://colores.manugarri.com/

coolorsと名前が似ているのですが、colores。

このサイトは、文字列を打ち込むと、その文字列にマッチする画像を検索してくれ、その画像から配色を抽出してくれます。

例えば、「Lion」とうちこむと、ライオンの画像と、その配色が一覧形式で示されます。なかなかよく出来ていますね。

![Image.png](https://qiita-image-store.s3.amazonaws.com/0/12790/f85644ed-49e2-414e-2d74-fc3a13846749.png)


### まとめ
配色に時間をかけたくない方も、じっくり考えたいかもそのとっかかりとして、上記サイトを利用してみてはいかがでしょうか？
資料を見た方に、「配色センスあるな～」、と思われること間違いなしです！
最近のOpenCVを使ってみる

久しく使ってなかった OpenCV を Windows 環境で使ってみるテスト。
特に Algorithm 関連で以前から使い方が変っているため、
ORB によるキーポイント導出を例にコードを書いてみる。

## SDK のインストール
[OpenCV](http://opencv.org/downloads.html) から Windows 用の
SDK をダウンロード。今回は D:\SDK\opencv に解凍しました。

### 他に必要な物
* コンパイラ (今回は Visual Studio を使用)
* CMake

## CMakeLists.txt を記述
VC の sln を生成するために CMakeLists.txt を記述します。
linux だと大抵 apt-get やら yum やら pacman やらでインストールできます。
また OpenCV_DIR の設定も不必要かもしれません。

```cmake
cmake_minimum_required(VERSION 2.8)
project(opencv_test)

# OpenCV のルートディレクトリをセット
set(OpenCV_DIR "D:/sdk/opencv/opencv/build")
find_package(OpenCV REQUIRED)
if( OpenCV_FOUND)
  include_directories( ${OpenCV_INCLUDE_DIRS} )
  add_executable( opencv_test main.cpp )
  target_link_libraries( opencv_test ${OpenCV_LIBS} )
endif()
```

## コードの記述
簡単に ORB 特徴量を算出するコードは以下のように。確か ver 2.3 より前は
```cv::OrbFeatureDetector``` やら ```cv::OrbDescriptorExtractor``` など
各アルゴリズム毎にクラスが乱立してたように覚えているのですが、最近は
ベースとなる Algorithm クラスのスーパークラスとして実装されているようです。
特にググってすぐ出てくるようなページを参考にするとクラスが無いとかで
怒られます(←経験済み

```c++
#include<opencv2/opencv.hpp>
#include<iostream>
#include<vector>
int main(int argc, char** argv){
  // 画像の読み込み
  cv::Mat img = cv::imread("lena_std.tif", 0);

  // ORB 特徴量の検出器をインスタンス化
  auto detector = cv::ORB::create();

  // ORB キーポイントの検出
  std::vector<cv::KeyPoint> orbkeys;
  detector->detect(img, orbkeys);

  // 各キーポイントの評価値を算出
  cv::Mat descriptors;
  detector->compute(img, orbkeys, descriptors);
  return 0;
}
```

# まとめ
最近の OpenCV を使った ORB 特徴量の算出について簡単に触ってみました。
MySQLをScalikeJDBCとHikariCPで使う

*HikariDataSource*のまま*DataSourceconnectionPool*に渡してしまえばOK

基本的な書き方は以下のとおり

```scala
import javax.sql.DataSource
import scalikejdbc._
import com.zaxxer.hikari._

class Sample {
  ConnectionPool.add('master, new DataSourceConnectionPool(getDataSource))

  def getDataSource: javax.sql.DataSource = {
      val host = "localhost"
      val port = 3306
      val database = "master"
      val user = "foobar"
      val password = "foobar"
      val dataSourceClassName = "com.mysql.jdbc.jdbc2.optional.MysqlDataSource"
    
      val ds = new HikariDataSource()
      ds.setDataSourceClassName(dataSourceClassName)
      ds.addDataSourceProperty("url", s"jdbc:mysql://$host/$database")
      ds.addDataSourceProperty("user", user)
      ds.addDataSourceProperty("password", password)
      ds
  }
  
  // あとはScalikeJDBCを使う
  def findAll = {
    val result = NamedDB(Symbol("master")) readOnly { implicit session =>
      Hogehoge.findAll
    }
  }
  
}
```

HikariDataSourceオブジェクトを作成して`ConnectionPool`に登録。
scalikejdbcでborrowする。

### ハマりポイント
*dataSourceClassName*を設定しないとうまくいかない。`ds.setDataSourceClassName(dataSourceClassName)`が必要。

MySQLへの接続がうまくいっていないとborrowするときに *NullPointerException* が発生する。スタックトレースを見ても何故発生しているのかわからなかった。。。(´･_･`)

いろいろ試してみた結果 *dataSourceClassName* が必要みたい。
Mac OS X で PIC 焼いて Lチカしてみる : その3 PICにプログラムを書き込む為の回路を構築


[ツール・ラボ » 電子工作入門](https://tool-lab.com/category/electronics/electronics_101/page/6/)

こちらを参考にしながら、PICを焼いて、Lチカしてみる

# やること

1. [PICの解説](http://qiita.com/kasei-san/items/0f27b37932d9d0c3095d)
1. [開発環境の構築](http://qiita.com/kasei-san/items/e5b233c6b06363b85cca)
1. **PICにプログラムを書き込む為の回路を構築(今回)**
1. コードを実装、コンパイル、PICに書き込む
1. Lチカ回路の構築、動作確認

# 回路図

![PIC12F683_fzz_-_Fritzing_-__回路図表示_.png](https://qiita-image-store.s3.amazonaws.com/0/5329/3b0ffb3a-4611-ed3f-73b8-2eef48496e14.png "PIC12F683_fzz_-_Fritzing_-__回路図表示_.png")


# 必要なパーツ

- PIC書き込み器([PICKIT3](http://akizukidenshi.com/catalog/g/gM-03608/))
- [PIC12F683 I/P](http://akizukidenshi.com/catalog/g/gI-00801/)
- 10KΩ抵抗(プルアップ用)
- 10μFコンデンサ(パスコン用)

# 回路の解説

## 概要

PICKIT3 から PIC にプログラムを書き込むため、
PIC の書き込み用の端子を PICKIT3 に接続している

## 端子の解説

データシートより

![41211D_book_-_pic12f683_pdf_-_Vimperator.png](https://qiita-image-store.s3.amazonaws.com/0/5329/ec19c8f3-56f7-f12f-cfed-288c4fa34e01.png "41211D_book_-_pic12f683_pdf_-_Vimperator.png")

今回出てこない端子については割愛

**VDD** : 電源電圧(プラス側)
**VSS** : 電源電圧(マイナス側)

- Dは **Drain** (排出口)、Sは **Source** (源)の略
  - 電子の流れを水に例えている
  - SourceからDrainに向かって電子が流れる
      - 電圧を掛けると、電子は+の方向に流れる
- あえてGNDではなく、VSSと書くのは、VSSは必ずしも0Vではないから
  - VDDとVSSの間に動作可能な電位差(3〜5V)があれば動作する
  - でも、メーカーによってはGNDって書いている所もあるらしい

**GPn** : GPIO(General Purpose Input/Output) 汎用入出力

  - GP0〜GP5まで

**VPP** : 書き込み用電源

- VDD < VPP となると書き込みモードに移行する
- データシートには、(GP3/MCLR/VPP)と書かれており、3つの役割を持っているピン


**MCLR** :  Master Clearの略

- PICをリセットする端子
- MCLRは、VSSになると起動するので **プルアップ** が必要
  - プルアップについては別途解説

**ICSP** : In-Circuit Serial Programming

```
ICSP(In Circuit Serial Programming)とはPICをICソケットからはずすことなく、 基板組み込みのままプログラムを書き込む方法です。
ただし、PICライタのICSP端子にそのままPICを接続することはできません。
事前にICSPに対応した回路設計が必要です。
```
- [ICSP page](http://einstlab.web.fc2.com/PIC/ICSP.html)


**ICSPDAT** : ICSP用データ入力端子
**ICSPCLK** : ICSP用クロック端子

- PIC12F683 I/P は内部にクロックを持っているが、ICSP利用時は、PICライターからのクロックを利用する

# 単に PIC の端子と PICKIT をつなげば良いだけのはずなのに、抵抗やらコンデンサやら入っているのは何で?

- 抵抗については、こっちに書いた → [プルアップ抵抗について解説](http://qiita.com/kasei-san/items/2b95b60597ce6b153d61)
- コンデンサについては、パスコンでググると良い

# 参考

- [PIC12F683のデータシート](http://akizukidenshi.com/download/ds/microchip/pic12f683.pdf)
APNS / GCMのリクエスト制限

# APNS / GCMのリクエスト制限

APNSとGCMでPush通知を行う際に１回のリクエストで送信出来る端末（リクエストサイズ）数には上限があるのですが、どれぐらいだったかすぐ忘れてしまうので備忘も兼ねて。

## APNS

（2015年01月18日追記）
iOS8以降の情報をキャッチアップ出来ておらず、ペイロードデータの上限が誤っていましたので、修正しましたm(__)m

（2016年10月28日追記）
iOS9以降の上限について記載しました。

* iOS8未満の場合、ペイロードデータの上限は256バイトまで。
* iOS8の場合、ペイロードデータの上限は2Kバイトまで。
* iOS9以降の場合、ペイロードデータの上限は4Kバイトまで。
* 1回の通信で全パケットが5000〜7000バイトを超えるとAPNSから切断される？（非公式）
* パケットの制限はかなり緩いが、速くリクエストしすぎるとエラーになるので、1リクエストあたり10ミリ〜50ミリ秒程度のインターバルを空けたほうがよい？（非公式）

4番目と5番目の情報は非公式かつ相反するものなので、結局は自分で確かめるしかないと思うのですが、"少なくとも秒間9000メッセージは送信出来る"という記載がAppleの公式ドキュメントにあるそうなので、ひとまず、あまり一度に大容量のメッセージを送信せず、ちょくちょくスリープ処理を入れれば問題ないかと思います。

## GCM

* ペイロードデータの上限は4096バイトまで。
* マルチキャスト送信の場合は最大1000端末まで。

どちらも公式情報なので、安心です。

## どうすればよいのか

上記の制限があるので、マルチOS対応の場合サーバアプリは、Pushメッセージは140文字以内（Pushでそんなに長いメッセージは送らないはず⇒Twitterと同じ文字数だけあれば充分では！という理屈）にして、数千台以上に一気に送りたい場合は、GCMに合わせて1000件ずつに分割、かつ、APNSに配慮して各処理の間で0.1秒くらいインターバル空けて、APNS及びGCMにリクエストすればほぼほぼ大丈夫かなと思いますが、他に良き案があれば教えてください。

※参考サイトにもありますが、PHPer御用達のApnsPHPは、デフォルトで1回送った後に10ミリ秒のスリープ処理を入れるようになっているので、その場合はあまり気にしなくてよいかもしれません。

### 参考サイト

GCM アーキテクチャの概要：
http://www.techdoctranslator.com/android/guide/google/gcm/gcm
これは罠。PHPでiPhone端末にPUSH通知を送る際の落とし穴：
http://liginc.co.jp/programmer/archives/2355
これは罠。PHPでiPhone端末にPUSH通知を送る際の落とし穴」は(一部)罠：
http://norii.hatenablog.com/entry/2013/10/09/021216
Apple Push Notification Service：
https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html
input要素用のid属性とname属性の値を取得する

EditorTemplateなどでヘルパーを使わずにinput要素を出力したい時がありますが、id属性とname属性の値をどう調達すれば良いのか悩みます。フィールドは入れ子になっていたり配列になっていたりする場合があるので決め打ちで書くことはできません。

ASP.NET MVC 4以降であればIdForヘルパーとNameForヘルパーが用意されているのでそれを使えばよいです。

```html
<input type="text" id="@Html.IdFor(m => m.Example)" name="@Html.NameFor(m => m.Example)" />
```

そうではない残念な環境やヘルパーが使えない場合などは以下のようにして取得します。

```html
@{
    var name = ExpressionHelper.GetExpressionText(m => m.Example);
    var id = ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(name);
    var fullName = ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);
}
<input type="text" id="@id" name="@fullName" />
```

参考
* [MSDN: NameExtensions.IdFor<TModel, TProperty> メソッド](http://msdn.microsoft.com/ja-jp/library/hh833709(v=vs.118).aspx)
* [MSDN: NameExtensions.NameFor<TModel, TProperty> メソッド](http://msdn.microsoft.com/ja-jp/library/hh833703(v=vs.118).aspx)
* [MSDN: ExpressionHelper.GetExpressionText メソッド](http://msdn.microsoft.com/ja-jp/library/system.web.mvc.expressionhelper.getexpressiontext(v=vs.118).aspx)
* [MSDN: TemplateInfo.GetFullHtmlFieldId メソッド](http://msdn.microsoft.com/ja-jp/library/system.web.mvc.templateinfo.getfullhtmlfieldid(v=vs.118).aspx)
* [MSDN: TemplateInfo.GetFullHtmlFieldName メソッド](http://msdn.microsoft.com/ja-jp/library/system.web.mvc.templateinfo.getfullhtmlfieldname(v=vs.118).aspx)
【Linux】Crontab設定

#よく忘れるのは私の頭のせいです。
crontab..よく忘れるｗ
忘れないのは構築で泣いたことばかりだ。。よし、わざとジョブを失敗させて怒られてみようか。

構築で移行させたり性能みたりとかで使う場面がありますね。毎回ネットみてその場しのぎです。
ならわかりやすくまとめておこうってことで、crontabの設定書式をおさらいしてますのん。


##crontab書式のまとめ

---
・各フィールドの間隔は半角スペース。
・記述書式は左から　「分 時 日 月 曜日 実行するコマンドとかスクリプトファイルパス」
・曜日は0からはじめても7で完結させてもいいですのん。
・スケジュールは毎回実施する場合は各フィールドにワイルドカード(*)を記述する。
・実行間隔を指定できる。（間隔値）
・不規則な複数の日付を指定できる。（共存）

---

##crontabを使うときのオプション
ようはcrontabを編集したり確認したりするお作法ね。編集する際にログインしたユーザだけ設定させたり動作させるとか。ここでやるんです。
運用するようになったらユーザー指定は必要ですね。さくっと実行したいなってときはユーザ指定はいらんのですが、root権限でしかやったことがないというｗ

~~~コマンド書式.ruby
crontab [ -u username ] { -l -r -e }
~~~

~~~crontabをユーザー指定して編集.ruby
crontab -u amachan -e 　←←←いち元さんなら特にユーザー指定しなくてもよろしおすぅ。
~~~


|引数|説明|
|:--|:--|
|-u|ユーザーを指定します。|
|-l|現在のcrontab設定を表示させます。|
|-r|crontabの設定を削除する場合ね。昔/var/logをrmしてしまった私は、だれかに代行してもらうか、一回ゲロはいてからみんなのレビューのもと指差し確認しながら実施しています。|
|-e|crontabのスケジュールを編集します。これがメインです。削除も一行ずつ確認しながらできるのでこちらでやりましょう。おえっ;|



##crontabの記述方法

~~~crontabの基本的な記述例.ruby
#コメント
分 時 日 月 曜日 実行コマンドやスクリプト
~~~


##各フィールドのスケジュールの指定「範囲」

以下のとおり範囲内の数値にて指定どおりスケジュール設定をします。

|フィールド|分|時|日|月|曜|
|:--|:--|:--|:--|:--|:--|
|範囲|0-59|0-23|1-31|1-12|0-7（日曜は0か7）|
|特に指定が無い場合|(*)は毎分|(*)は毎時|(*)は毎日|(*)は毎月|(*)は毎曜|

##不規則なスケジュールの指定方法「共存」「間隔値」

||説明|設定値例|各フィールドに設定した結果|
|:--|:--|:--|:--|
|共存|複数の決めた時間で実施したい場合に設定する|1,5,6-9|時:1時5時6時7時8時9時に実施。日:1日5日6日7日8日9日、月:同じく。。|
|間隔値|決めた範囲の中で一定の間隔を設けて実施したい場合に指定する|1-7/2|分:1分3分5分7分、時:1時3時5時7時、曜:月水金日|


##設定例
以下は三国志13の戦法のようですが「机上空論」を発動しただけなので、ご自身で確認をば！

~~~ruby
#30分ごとに実施したい
*/30 * * * * /usr/local/amachan.sh
~~~

~~~ruby
#9時から21時の間で10分ごとに実施したい
*/10 9-21 * * * /usr/local/amachan.sh
#⇒9時10分、9時20分...(省略)...21時50分で終了かな..
~~~

~~~ruby
#土曜と日曜の0時～7時までの2時間ごと12分に実施したい
12 0-7/2 * * 6,7 /usr/local/amachan.sh  ←←曜日は（0,6）でもいい
#⇒土曜0時12分、2時12分、4時12分、6時12分、日曜もおなじ..かな..
~~~

~~~ruby
#3/4と9/4の0時05分に実施したい
5 0 4 3,9 * /usr/local/amachan.sh
#⇒日付も別日とかできんのかな？そしたらもう一個定義とかなるんでしょうかね。
~~~

た、たぶんこれでいいはず；


##実際動かしてみた
まあ、実例があったほうがいいとおもって。。。やってみるといろいろあるんです。もちろん初期設定が出来てないときなんかは動かねーｗ　なんのひねりもないスケジュールなんで不要なら飛ばしてください。

###こんなこともありました
どっかのパブリッククラウドレンタルしてCentOSを初期設定してなかったので、cronだから時間設定せねば！ってJST直したんですけど、直後はcrondのログとか整合が取れなくて動作しなかったです。予断ですが一回リブートしました。

リブートしたらログされていて、/var/log/cron　でエスケープされていることがわかったので修正して成功しました。
⇒￥(実際には\)入れないとここの記述例でいう%移行の記述内容は無視されますのん。

###ふつうに実施結果

~~~ruby
# crontab -l
00 23 * * 4 /usr/sbin/chkrootkit >/home/chadmin/chkrootkit_`date +\%Y\%m\%d`
05 3 * * 5 /usr/sbin/chkrootkit >/home/chadmin/chkrootkit_`date +\%Y\%m\%d`
~~~

**成功**

~~~ruby
# ls -al /home/chadmin/
total 24
drwxr-xr-x  2 root root 4096 Jan 16 03:05 .
drwxr-xr-x. 3 root root 4096 Jan 15 16:43 ..
-rw-r--r--  1 root root 4699 Jan 15 23:00 chkrootkit_20150115
-rw-r--r--  1 root root 4699 Jan 16 03:05 chkrootkit_20150116
~~~

はいできました。なんのまとめもありません。
それでは、サヨナラさよなら！
Nightwatch.js: 「何かの表示に成功するまで」UI要素をクリック

#背景

クリックできる UI要素 `A` があって、`A` をクリックするとその場にポップアップメニューが開く、というUIは広く使われている。

ところが、「`A` のクリックを拾ってメニューを出す」部分がオレオレロジックで実装されており、`A` 自体が表示された後、*しばらく待って*から `click` イベントを飛ばさないとメニューが開かない、ということがたまにある。ない？ あったんや！

この場合、「しばらく」のタイミングをテキトーに決めうってしまうと、必ず他の環境でテストがこけるので、「メニューが開くまで `A` のクリックを試行する」ようなテストコードを書きたい。要するに:

```js
while (!exists('#menu')) {
    click('#A');
    sleep(100); // さすがに busy loop はあかん
}
```

のようなことがしたい。

#つらみ

Nightwatch.js では、「あるUI要素が存在するまで待つ」関数は提供されている: `.waitForElementPresent()`
ところが、この API は:

 + 指定されたDOM要素がみつかれば、なら次のことをする
 + 指定のタイムアウト時間までみつからなければ *テストがこける*

という仕様になっており、failure handler に相当するものをこちらで教えてあげることができない。大変つらい。ばーかばーか。

これをどうにかする方法を探し始めるとそれだけで半日ムダになるので、せめて1時間ぐらいのムダですむことを期待してここにメモを残す。

#方針

もう少し低レベルの API である `.element()` を使って、存在を判定する。

#実装

```js
module.exports = {
    menu: function(client) {
      function waitForMyMenu(andThen) {
        // "#A" のクリックをトリガーに "#menu" が現れるまで、100ms 間隔で trial & error
        client
          .click('#A')
          // "#menu" が見つかるか
          .element('css selector', '#menu', function(e) {
            if (e.status < 0) { // e.status < 0 なら見つからなかった
              // 100ms まってリトライ
              client.pause(100, function() { waitForMyMenu(andThen) })
            } else {
              // console.log(e); // かくにんよかった！
              andThen();
            }
          });
      }
  
      waitForMyMenu(function() {
        // ここに、本来やりたかった "#menu" に対するテスト
        ...
      });
    }
}
```

`.element()` で存在を判定し、なければ少し (100ms) 待ってから、再帰でリトライしている。

当然だが、リトライ回数があまりにも多くなると、stack overflow する。てえるこおる除去は甘え。そこまでぐるぐる回っちゃったらテスト失敗でいいんじゃないかな！ 5回ぐらいで打ち切りたい時は適当にカウンターを仕込もう。
TravisCIでiOSアプリのipaファイルを作って実機に配信する時に便利だったもの

TravisCIを使ってCI(継続的インテグレーション)の環境を構築しようとしたけれど、ググっても手順がやや複雑で環境構築が大変そうに見えた。色々自動化できないか探してみると、iOS開発に大変便利なツール群が見つかった。それらを使って環境構築すると、イイ感じに構築できたのでメモ。

# 大変参考になる文献
- [iOSアプリのプロビジョニング周りを図にしてみる - Qiita](http://qiita.com/fujisan3/items/d037e3c40a0acc46f618)
- [Travis CIで配布可能なIPAを作成して配布する - Qiita](http://qiita.com/nomadmonad/items/baf089e7d7bcf27ab8ee)

# TravisCIと一緒に利用して便利だったもの
- Rakefile
- xctool
- nomad-cli

## Rakefile
- [http://docs.ruby-lang.org/ja/2.1.0/library/rake.html](http://docs.ruby-lang.org/ja/2.1.0/library/rake.html)
- TravisCIに標準でインストール済み
- Rakefileを使って```script: rake myapp:test```というように書いておくとシェルスクリプトを書くよりも楽に書ける部分がある
    - 特にブランチ名で処理を分けたい時にRubyの正規表現が使えるので楽
    - すべてをRakefileにしようとせず、シェルスクリプトの呼び出しを```sh```メソッドを使うようにすると便利

## facebook/xctoolを利用する
- [https://github.com/facebook/xctool](https://github.com/facebook/xctool)
- TravisCIに標準でインストール済み（というか[普通に設定するとxctoolを使ってテストが実行される](http://docs.travis-ci.com/user/languages/objective-c/#Default-Test-Script)）
- 以下のようにシェルスクリプトに書いておいて環境変数でWORKSPACE_NAMEとかを設定すると後々他のプロジェクトでも使い回したりできて楽
    - ビルドを実行
        - ```xctool -workspace ${WORKSPACE_NAME} -scheme ${BUILD_SCHEME} -configuration ${CONFIGURATION} -sdk iphonesimulator build```
    - テストを実行
        - ```xctool -workspace ${WORKSPACE_NAME} -scheme ${TEST_SCHEME} -configuration ${CONFIGURATION} -sdk iphonesimulator test```

## nomad-cliを使う
- [http://nomad-cli.com/](http://nomad-cli.com/)
- AFNetworkingでおなじみ[matttさん](https://twitter.com/mattt)が作った便利ツール群
- TravisCIに標準で入ってるっぽいことが[公式ブログの記事](http://blog.travis-ci.com/2014-04-15-xcode-51-ios-71-osx-109/)で書かれているが、利用できなかったのでbefore_installにnomad-cliを追記した
    - ```before_install: gem install cupertino shenzhen --no-ri --no-rdoc```
- iOSの証明書やプロビジョニングプロファイルをダウンロードできる「Cupertino」、ipaファイルをビルド・配布する「Shenzen」などで構成されている
- Cupertino
    - Provisioning Profileをダウンロードして名前を環境変数```PROVISIONING_FILE_NAME```に代入
        - <code>PROVISIONING_FILE_NAME=`ios profiles:download -u "${IOS_DEV_EMAIL}" -p "${IOS_DEV_PASSWORD}" "${IOS_DEV_PROVISIONING_NAME}"    | sed -e "s/Successfully downloaded: '\(.*\)'/\1/g"`</code>
        - ここを自動化できると、デバイスを追加してもProvisioning Profileをアップロードし直したりしなくて済むので楽
- Shenzen
    - ipaファイルを生成する
        - ```ipa build --configuration ${BUILD_CONFIG} --scheme #{SCHEME} CODE_SIGN_IDENTITY='iPhone Developer'```
    - Deploygateで配信する
        - ```ipa distribute:deploygate --api_token #{DEPLOYGATE_API_TOKEN} --user_name #{DEPLOYGATE_USER_NAME}```
    - [ShenzenのREADMEにも書いてある](https://github.com/nomad/shenzhen#building--distribution)ように、TestFlightやDeploygateの配信が超簡単になる
    - TestFlight, HockeyApp, Crashlytics, Deploygateによる配布、FTP, SFTP, Amazon S3による保存、iTunes Connectへのバイナリ提出などが自動化できる（最高だ！）

# その他

[自分のブログに書いた記事](http://d.akiroom.com/2015-01/travis-ci-ios-ipa-test-flight-deploygate-distribution-tips/)なのですが、他にもTipsがあったらお聞きしたいと思ってQiitaにも貼りました。
Sublime Text 3 で構文エラーチェックする設定のまとめ


Macの場合を例に説明していきます。

事前にPackage Controlをインストールしてプラグインの管理が行えるようにしておきましょう。

`cmd + shift + P` でCommand Paletteが表示されるので、[Install Package] からプラグインのインストールに進んでください。

![スクリーンショット 2015-01-14 22.22.04.png](https://qiita-image-store.s3.amazonaws.com/0/42958/7a7d77c5-a0cc-0173-14d5-4f9f5b2f649a.png "スクリーンショット 2015-01-14 22.22.04.png")


## 基本プラグインをインストール
### SublimeLinter

まず上記のプラグインをPackage Controlからインストールしましょう。
構文エラーを自動的にチェックするためのプラグインです。
エラーのある箇所に印がついて、エラー理由を指摘してくれます。

![スクリーンショット 2015-01-15 9.50.43.png](https://qiita-image-store.s3.amazonaws.com/0/42958/58509560-a626-8153-a4d1-78df907a2621.png "スクリーンショット 2015-01-15 9.50.43.png")

![スクリーンショット 2015-01-15 9.52.14.png](https://qiita-image-store.s3.amazonaws.com/0/42958/c0b328e9-f213-b8ae-5975-b42c6cc2af72.png "スクリーンショット 2015-01-15 9.52.14.png")

このプラグインと別にそれぞれの言語に対応したプラグインをインストールしていきます。


## SCSSの構文チェック
### SublimeLinter-contrib-scss-lint
上記プラグインをPackege Controlからインストール。

追加でターミナルから以下を入力し、scss_lintをインストール。(要Gem)
`$ sudo gem install scss_lint`

![スクリーンショット 2015-01-15 9.54.13.png](https://qiita-image-store.s3.amazonaws.com/0/42958/c113f6b8-55a2-8c0a-9f6e-2573bfeab173.png "スクリーンショット 2015-01-15 9.54.13.png")

SCSSの構文チェックが出来るようになります。
エラーのある箇所は行数の左側に印が付きます。

## Javascriptの構文チェック
### SublimeLinter-jshint
上記プラグインをPackege Controlからインストール。
ターミナルから以下を入力し、jshintをインストール。(要npm)
`$ sudo npm install -g jshint`
Sublime Textを再起動。

Javascriptの構文チェックが出来るようになります。

## PHPの構文チェック
### SublimeLinter-php
### SublimeLinter-phplint
上記2プラグインをPackege Controlからインストール。
ターミナルから以下を入力し、phplintをインストール。(要npm)
`$ sudo npm install -g phplint`

PHPの構文チェックが出来るようになります。

PSR2準拠の構文チェックを行いたい場合は、追加で下記のプラグインをインストールしてください。
### SublimeLinter-phpcs
SublimeLinterでPHP(PSR2準拠)の構文チェックが可能になる。
追加でターミナルから以下を入力する
`$ cd /usr/lib/php`
`$ sudo php install-pear-nozlib.phar`(pearをインストールしていない場合)
`$ sudo pear install PHP_CodeSniffer`
`$ phpcs -i`

![スクリーンショット 2015-01-15 9.30.44.png](https://qiita-image-store.s3.amazonaws.com/0/42958/38faed2a-e6ca-ba58-91e8-bebd85389cc8.png "スクリーンショット 2015-01-15 9.30.44.png")

上記のような表示が出ていれば成功です。

## 表示スタイルの変更
`cmd + shift + P` でCommand Paletteが表示されるので、[SublimeLinter:Choose Mark Style] を選択します。
![スクリーンショット 2015-01-15 18.44.03.png](https://qiita-image-store.s3.amazonaws.com/0/42958/14e6eb96-dbd7-9aaf-ffaa-54268e14b26e.png "スクリーンショット 2015-01-15 18.44.03.png")

スタイルのリストが表示されるのでお好みのスタイルを選択してください。

![スクリーンショット 2015-01-15 18.48.04.png](https://qiita-image-store.s3.amazonaws.com/0/42958/530b1f64-63b7-1d4e-bd67-cc569c2a749c.png "スクリーンショット 2015-01-15 18.48.04.png")
スタイルの見え方などについては下記リンクを参照してください。
http://sublimelinter.readthedocs.org/en/latest/mark_styles.html
enchant.jsとtmlib.jsを使ったゲーム作成フレームワーク「enforce」チュートリアル（６）ジャンプさせる

ここでは、「**game01**」というディレクトリ内で作業しているという前提で説明しています。

# ジャンプ出来るようにする
キーを押したらクマがジャンプするようにスクリプトを修正してみます。
まずは、「**enforceMain.coffee**」のクマのキャラクターオブジェクト生成部分に、重力パラメータを追加します。

```coffeescript
class enforceMain
    constructor:->
        bearobj = addObject
              ・
            （略）
              ・
            width: 32
            height: 32
            gravity: 1 ← 追加分
              ・
            （略）
              ・
```

次に、前回までの「**bearChara.coffee**」の「**behavior**」を下記のように修正します。

```coffeescript
    behavior:->
        super()
        switch @_processnumber
            when 0
                axes = PADAXES[0]
                @x += axes[HORIZONTAL] * 4
                @y += axes[VERTICAL] * 4
                buttons = PADBUTTONS[0]

                # 以下追加分
                if (@y > SCREEN_HEIGHT - @height)
                    @y = SCREEN_HEIGHT - @height
                if (buttons[1])
                    @ys = -20
　　　　　　　　　# 追加ここまで

                if (buttons[0])
                    addObject
                        image: 'bear'
                        motionObj: bullet
                        x: @x
                        y: @y
                        ys: -16
                        width: 32
                        height: 32
                        animlist: [
                            [100, [0, 1, 0, 2]]
                        ]
```
修正が終わりましたら保存してコンパイルし、ブラウザをリロードしてください。
前回までは画面中央に止まっていたクマが下に落ちていき、画面最下段で止まります。
そこでキーボードの「x」キーか、ジョイパッドのボタン2を押してください。
クマがジャンプするはずです。

キャラクター生成時に加えたパラメータ「gravity」は、この値が毎フレーム、y方向の加速度に加算されるため、移動量が徐々に増えるため放物線を描くように下に落ちて行きます。
キャラクター自体のスクリプト（**bearChara.coffee**）で、画面の最下段より下に行こうとした場合は、それ以上下へ行かないように制御します。
そして、「x」キーかジョイパッドのボタン2が押された場合は、y方向の移動量を一気に「-20」にするので上へ移動します。
一気に増えたy方向の移動量がフレーム毎にgravityづつ変化するので、再び下に落ちてくるという仕組みになっています。


[チュートリアル（５）](http://qiita.com/digitarhythm/items/e37d25e2abafd9db55e7) <--- ⬛︎ ---> [チュートリアル（７）](http://qiita.com/digitarhythm/items/58422db419d00bd6ae74)

---

[enforceチュートリアル一覧](http://qiita.com/digitarhythm/items/9e75c871f5ce582a4d01)