OmniAICreator/Qiita-1.07M huggingface dataset:
Emacs 附属の sieve.el で Dovecot 附属の managesieve サーバに接続する

IMAP サーバ側でメールを振り分ける場合、managesieve サーバに接続して、メールを振り分ける規則を記述した Sieve スクリプトをアップロードする必要があります。

以下は、私が使っている Sieve スクリプトの一部抜粋です。

```
require ["fileinto"];
# X-Spam-Flag: YES があるメールは迷惑メールボックスに振り分け
if header :is "X-Spam-Flag" "YES"
{
    fileinto "Junk";
    stop;
}
# root/postmaster 宛のメールは管理者用メールボックスに振り分け
if anyof (address :localpart :is "to" "root",
          address :localpart :is "to" "postmaster")
{
    fileinto "Administrator";
    stop;
}
# 別メールアドレス（携帯電話）に転送
if true
{
    redirect "foo@example.net";
}
# 全てのメールを受信箱に格納
keep;
```

その上で、Emacs 上で managesieve サーバに接続するには `M-x sieve-manage RET` としてやればよいのですが、Dovecot 附属の managesieve サーバに接続する場合、認証に失敗して以下のエラーメッセージが出ることがあります。

```
Server aborted SASL authentication: Received empty AUTHENTICATE client response line.
```

これは、http://borg4.vdomains.jp/~goro/diary/2012/1765 で解説されている問題と、まったく同じ問題だと思われますので、DIGEST-MD5 を無効化してやれば良いようです。つまり、以下のように使いたい認証方式だけを選んで、~/.emacs に書いておけば良いわけです。

```el
(setq sieve-manage-authenticators '(cram-md5 plain login))
```
[PHP] forループ判定による実行速度比較

数年前「ループのカウント判定としてcount関数使うな」と注意されたことがあり、思い出したので計測してみた。

10文字の変数のカウントを10000ループで処理をした。

結果：全て変数に入れてループした方が早い。

php -version
```PHP 5.5.36 (cli) (built: May 29 2016 01:07:06) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
```

httpd -v
```Server version: Apache/2.4.18 (Unix)
Server built:   Feb 20 2016 20:03:19
```

1回目: 変数格納した方が0.0441207885742早い
変数ループ:0.0257985591888秒
count関数使用したループ:0.0699193477631秒

2回目: 変数格納した方が0.0399599075317早い
変数ループ:0.0249683856964秒
count関数使用したループ:0.0649282932281秒

3回目: 変数格納した方が0.0579628944397早い
変数ループ:0.031925201416秒
count関数使用したループ:0.0898880958557秒

4回目: 変数格納した方が0.0402450561523早い
変数ループ:0.0245311260223秒
count関数使用したループ:0.0647761821747秒

5回目: 変数格納した方が0.0388638973236早い
変数ループ:0.0247168540955秒
count関数使用したループ:0.0635807514191秒

6回目: 変数格納した方が0.037935256958早い
変数ループ:0.0240049362183秒
count関数使用したループ:0.0619401931763秒

7回目: 変数格納した方が0.0404722690582早い
変数ループ:0.0258228778839秒
count関数使用したループ:0.0662951469421秒

8回目: 変数格納した方が0.0397148132324早い
変数ループ:0.0250782966614秒
count関数使用したループ:0.0647931098938秒

9回目: 変数格納した方が0.0373675823212早い
変数ループ:0.0237381458282秒
count関数使用したループ:0.0611057281494秒

10回目: 変数格納した方が0.0383319854736早い
変数ループ:0.0248041152954秒
count関数使用したループ:0.063136100769秒

```<?php
$array = array('a' ,'b' ,'c' ,'d' ,'e' ,'f' ,'g' ,'h' ,'i' ,'j');
$count = 10000;

for($n = 1; $n < 11; $n++){
  $sum_v = 0;
  $sum_c = 0;
  for($l = 0; $l < $count; $l++){
    $time_start_v = microtime(true);
    $arrayCount = count($array);
    for ($i = 0; $i < $arrayCount; $i++) {
    }
    $time_v = microtime(true) - $time_start_v;
    $sum_v += $time_v;

    $time_start_c = microtime(true);
    for ($i = 0; $i < count($array); $i++) {
    }
    $time_c = microtime(true) - $time_start_c;
    $sum_c += $time_c;
  }
  $vc = $sum_v-$sum_c;
  echo $n . "回目: ";
  echo $sum_v > $sum_c ? "count関数の方が" . abs($sum_v-$sum_c) . "早い<br>" : "変数格納した方が". abs($sum_v-$sum_c) . "早い<br>";
  echo "変数ループ:" . $sum_v . "秒<br>";
  echo "count関数使用したループ:" . $sum_c . "秒<br><br>";
}
```
同人ゲームで使用予定の成長指標用計算式

同人ゲームを共同制作する人向けに書いた文章を、ついでに一般公開しました
私はゲーム制作素人レベルなので、間違いや数学知識の欠陥だらけなので指摘してくれると嬉しいです

# 基本指標値
まず、最大ステージ数A（30とする）とパラメーターが2倍になる為に要するステージ数x（SRPG・TDの場合。RPGならプレイ時間等がいいだろう）を仮定します
今回はx=6と仮定しました。その場合は
√2の6乗根（≒1.12）になります
その場合のグラフは以下の通りになります
![基本成長式.png](https://qiita-image-store.s3.amazonaws.com/0/106244/49ab23ce-362d-f6b7-5b3c-8592860f061e.png)
実際は複数のパラメーターを有する事の方が多いので、パラメーター数の累乗根で計算する事になります
（2パラメーターある場合、双方を*2にすると実質戦闘力が*4になってしまう為。例えばHP200、攻撃力20のキャラはHP100、攻撃力10のキャラを連続して4回倒せてしまう）

## 敵の基本成長指標値
敵の基本成長指標値は、最低攻略ラインB（今回は制作チームが攻略出来るギリギリの難易度）\*0.5（初期ステージ）~0.8（最終ステージ）と仮定します
式にすると(1.12^x)\*(0.5+/(A/0.3))になります
グラフで表すと以下の赤線の通りです
![render.png](https://qiita-image-store.s3.amazonaws.com/0/106244/1f2dab28-10a7-28e9-2b0e-df24d6b53598.png)
全体的にこのグラフを軸に、細々と修正を加えていく感じでいいと判断しました
Code Climate Webhook の設定方法

公式ページの情報が古く、いつも混乱するのでメモ。

#Code Climate へ GitHub リポジトリを登録する。

``Add Open Source Repo`` > ``オーナー名/リポジトリ名`` の形式で ``GitHub repo name`` を入力する。 > ``Import Repo from GitHub``

**Note:**

``https://github.com/オーナー名/リポジトリ名.git`` の形式で入力するとエラーになる。

#GitHub へ Webhook を登録する。

Code Climate へ登録した GitHub リポジトリをブラウザで開く。 > ``Settings`` > ``Webhooks & services`` > ``Add service`` > ``CodeClimate`` > ``Token`` へ ``https://codeclimate.com/webhooks`` を入力。 > ``Update service``
Boto3でLambdaを起動させる


```
import boto3

client = boto3.client('lambda')

#Lambdaのevent変数に入れる値
query = {
	"test1": "test",
	"test2": "test"
}

#Lambdaを実行
response = client.invoke(
	FunctionName='LAMBDA_FUNCTION_NAME',
	InvocationType='RequestResponse',
	LogType='Tail',
	Payload= query
)

#レスポンスを読む
res = response['Payload'].read()
```

参考：http://boto3.readthedocs.io/en/latest/reference/services/lambda.html#Lambda.Client.invoke
文化祭で人数と来ている方々を記録するコード

文化祭でいちいち紙に書くのがめんどくさいので作りました。
というかカウンターが壊れたので。

暇つぶし程度に作ったのですがこれから文化祭に使いたい方はどうぞ使ってください。

```ruby:bunkasai.rb
class Questionnaire
  @@persons = []
  def self.input
    person = {}
    puts "名前を入力してください"
    person[:name] = gets.chomp
    puts "あなたは次のうち、どのような方ですか？\n[1]校内生\n[2]保護者\n[3]受験生\n[4]受験生の保護者\n[5]その他"
    person[:occupation] = gets.to_i
    @@persons << person
    puts "入力ありがとうございました"
  end

  def self.show_allperson
    line = "_________________________"
    puts line
    index = 1
    @@persons.each do |person|
      puts "[#{index}]人目 名前:#{person[:name]} 層#{person[:occupation]}"
      index += 1
    end
    puts "#{index}人来場者が来ました"
  end
end


while true do
puts "あなたは初めてこれを入力しますか？\n[1]初めて入力\n[2]もう入力した"
  num = gets.to_i
  if num == 1
    puts "入力に移ります"
    Questionnaire.input
  elsif num == 2
    puts "ご利用ありがとうございました\n \n"
  elsif num = 72
    Questionnaire.show_allperson
  else
    puts "無効な数値です"
  end
end
```
GitLabでバックアップをS3にとる+定期的にバックアップを削除する

GitLabではバックアップ先にAWSのS3を利用することができます。

設定方法は基本的に[公式のドキュメント](https://docs.gitlab.com/ce/raketasks/backup_restore.html#upload-backups-to-remote-cloud-storage)通りです。

# EC2のIAMロールを使う方法

GitLabをEC2で動かしている場合では、IAMロールを使うことでアクセストークンの埋め込みを避けることがができます。
公式のドキュメントには記載がありませんが、以下の設定でIAMロールを使うことができました。
これは、GitLabのバックアップファイルのアップロードに使われているFogというライブラリで対応しているためです。

## 設定方法

以下の様に設定することで、IAMロールを使ってS3バックアップが可能です。

```rb
gitlab_rails['backup_upload_connection'] = {
  'provider' => 'AWS',
  'region' => 'リージョン名',
  'aws_access_key_id' => '',    # 空だけど必要
  'aws_secret_access_key' => '',# 空だけど必要
  'use_iam_profile' => true,
}

gitlab_rails['backup_upload_remote_directory'] = 'バケット名'
```

必須項目のバリデーションがかかっているので、`aws_access_key_id`, `aws_secret_access_key`を空のまま残して`'use_iam_profile' => true`を指定するとIAMロールが使えます。


これは以下で報告されている、公式対応のMRがマージされるまでの回避策になると思います。

- https://gitlab.com/gitlab-org/gitlab-ce/issues/12756
- https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/5910

# S3にアップロードされたバックアップファイルを定期的に消去する方法

GitLab側でのバックアップでは、`backup_keep_time`の期限を過ぎたファイルは自動で削除されます。しかし、S3にアップロードした場合ではこの期限が適用されずに、バックアップファイルが全て蓄積されていきます。

この対応策として[削除スクリプトを使う方法](http://qiita.com/hosopy/items/6fe4988481c3723fb248)がありますが、S3の[ライフサイクル](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/object-lifecycle-mgmt.html)という機能を使う方が容易です。
このS3のライフサイクル機能では、指定期間後にファイルを削除したり、Glacierなどの低価格な長期保存ストレージに移動したりすることが容易にできます。

## 設定方法

S3のバケットプロパティにある「ライフサイクル」から設定可能です。

![](https://i.gyazo.com/648d2a3d6a3578f64480dd8be34346ba.png)

以下のように、任意の経過日数後に削除するという設定が可能です。

![](https://i.gyazo.com/3a2843f3a46f84d0cbadc49fc61db825.png)
PythonでKNNを使った手書き文字認識

[OpenCVのチュートリアル](http://docs.opencv.org/3.1.0/d8/d4b/tutorial_py_knn_opencv.html)で学ぶ、手書文字認識。

今年配属されてきた新人さんが、「大学時代は、文字認識をやっていました」というので、自分もその一端に触れてみようという試みです。

# 辞書データの入手
辞書データとして、OpenCVの配布物に含まれているdigits.pngを使います。残念ながら、Anaconda環境で```conda install --channel https://conda.anaconda.org/menpo opencv3```した環境にはdigits.pngは含まれていませんでした。

これは、0から9までの数字を手書きしたものの画像データになります。実際に、日本語でOCRを作ろうとすると、そのまま実装すると膨大な辞書データを作る必要ができます。ワタナベさんとかサイトウさんとかの漢字のバリエーションもちゃんと見分けようとすると、そりゃあもう大変なことになりそうです。なんとかなるんでしょうか？

# その前にKNNとは
Wikipediaには、[k近傍法](https://ja.wikipedia.org/wiki/K%E8%BF%91%E5%82%8D%E6%B3%95)としてエントリーがあります。
特に[図](https://ja.wikipedia.org/wiki/K%E8%BF%91%E5%82%8D%E6%B3%95#/media/File:KnnClassification.svg)が、KNNを非常に端的に説明していて分かりやすいです。

すなわち、未知のサンプルが、ある座標の空間においてA群に属するものなのかB群に属するものなのかを判別したい場合に、「近傍にある既知の分類済データが多い方の群に属する」と判断する、というものです。

さて、概念を理解できたとして、これはpython(+OpenCV)では簡単に使えるようになっています。

# 辞書データを1文字ずつにバラす

```Python
cells = [np.hsplit(row,100) for row in np.vsplit(gray,50)]
```
これは、何をしているか？というと、digits.pngという画像が1000x2000のサイズで、各数字が20x20サイズで500回ずつ書かれているのを受けて、縦を100で、横を50で割ったものを、cellsに配列として格納していることを示しています。しかし、実際のところ、理解できないというか、自分では絶対に書けません。
np.hsplit()や、np.vsplit()という配列の分割の仕方があるということが分かっただけで十分かもしれません。

# trainingセットとtestセットへの分割
これを、xというnumpyの配列に格納した後、各数字の250個をtrainingセットに、残りの250個をtestセットに分割します。

```Python
x = np.array(cells)

train = x[:,:50].reshape(-1,400).astype(np.float32)
test = x[:,50:100].reshape(-1,400).astype(np.float32)
```

また、それぞれのデータに対して、ラベルを設定します。
```np.arange(10)```すると、0から9までの10この連続した整数の配列```array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])```が作られるので、それを250回繰り返してラベルにします。

```Python
k = np.arange(10)
train_labels = np.repeat(k,250)[:,np.newaxis]
test_labels = train_labels.copy()
```

# KNN実行
いよいよKNNを実行します。k=5で実行してみます。

```Python
knn = cv2.KNearest()
knn.train(train,train_labels)
ret,result,neighbours,dist = knn.find_nearest(test,k=5)
```

実は、上記はエラーになります。[チュートリアル](http://docs.opencv.org/3.1.0/d8/d4b/tutorial_py_knn_opencv.html)が間違っているらしい。
上記の3行は、以下のように書き換えます。

```Python
knn = cv2.ml.KNearest_create()
knn.train(train,cv2.ml.ROW_SAMPLE,train_labels)
ret, results, neighbours, dist = knn.findNearest(test, 5)
```

判別器の成績を見てみます。

```Python
matches = results==test_labels
correct = np.count_nonzero(matches)
accuracy = correct*100.0/results.size
print(accuracy)
```

![20160909006.png](https://qiita-image-store.s3.amazonaws.com/0/15553/33f714d1-33f9-398c-a1c8-0a27a1a5310a.png "20160909006.png")

今回の実行結果は、```91.76```ということになりました。
数字だけ10文字の判別でこの精度は、ちょっと低いかなという印象です。

今日は、ひとまずここまで。

## 今回のコード
- https://github.com/fukuit/Python_SelfLearning/blob/master/ocr_knn.py
9/9　今日の学習内容〜フラッシュについて学習〜

###今日の学習内容
***
今日はリダイレクションの時によく利用される機能である**フラッシュ**について触れていきました。

>フラッシュは、アクションとアクションの間で情報を受け渡す機能です。
[改定3版基礎RubyOnRails](https://www.amazon.co.jp/dp/4844338153)より引用

フラッシュオブジェクトに情報を入れておくことで、リダイレクション後のアクションにて文字列を取り出せるようです( ´ ▽ ` )ﾉ

さて、サクッと新しいアクションを用意して、フラッシュを使ってみましょう！

もし、私の学習記録を読みながら学習を進められている方がおられましたら、そろそろアクションの作り方を覚えられたのではないでしょうか？(￣▽￣)

これまで読んだことはなかったけど、この記事を見てやってみたいと思われた方がいらっしゃれば、[これまでの記事](http://qiita.com/shouxuohs/items)を読みながら進めていただければと思います。
私が悪戦苦闘している様が見て取れると思います笑

話が逸れましたが、フラッシュを使う準備をしていきましょう！
下記の画像を参考に、``leson_controller.rb``に書き加えていってください( ´ ▽ ` )ﾉ

![スクリーンショット 2016-09-10 0.02.34.png](https://qiita-image-store.s3.amazonaws.com/0/137880/c92b8945-46b0-3536-7ef7-021e4d6aff1f.png)

コードを書き加えた後、``rails s -b $IP -p $PORT``コマンドをターミナルに叩き込み、出てきたリンクをクリックしてください。

これまで、私と同じように勧めてこられた方は、下記のようなページに飛ぶと思います( ´ ▽ ` )ﾉ

![スクリーンショット 2016-09-10 0.12.51.png](https://qiita-image-store.s3.amazonaws.com/0/137880/510c6005-4e2c-361f-ce53-15ded433220a.png)

その後、先ほど作成したフラッシュを使うアクションのパス``/lesson/``を書き足してEnterキーを押していただくと...

![スクリーンショット 2016-09-10 0.18.16.png](https://qiita-image-store.s3.amazonaws.com/0/137880/164c1685-aaa5-a456-d2f2-cc0279c879ce.png)

フラッシュオブジェクトに代入された文字列"practice5に移動します"が表示されたことと、``practice5``に移動していることが確認できるかと思います( ´ ▽ ` )ﾉ

では、表示されたページをリロードしてみてください。

すると...

![スクリーンショット 2016-09-10 0.29.15.png](https://qiita-image-store.s3.amazonaws.com/0/137880/dd578459-c933-6741-6193-72a0665d29a9.png)

何も表示されなくなってしまいます( ；´Д｀)

これは、フラッシュのデータがアクション→リダイレクション→アクションの流れが済むと、消去されてしまうことに起因するようです。

それによって、``flash[:notice]``が**nilになる**ので、何も表示されなくなるわけですね(￣▽￣)

###あとがき
***
今日はフラッシュについて学習していきました。
明日はアクション・コールバックについて学習していきたいと思っています( ´ ▽ ` )ﾉ

どうでもいいことなのですが、バイトに行っていて書く時間が取れず、9/9の学習内容と銘打っておきながら、9/10に投稿となってしまいました(T ^ T)
これまで、毎日更新してきたので、ちょっと残念です...

最後まで読んでくださり、ありがとうございましたm(_ _)m

###参考にさせていただいたサイトなど
***
- [改定3版基礎RubyOnRails](https://www.amazon.co.jp/dp/4844338153)
- [cloud9](https://ide.c9.io)
uGUIのTweenで忘れてはいけない一つのこと

**UIが消えても、単に透明になっただけで、レイキャストは有効になったままだから、消えたUIはしっかりとGameObject.SetActive(false)で無効化しておくこと！**

以上！

今日アプリ作って、これに悩まされました…Editorで原因わかってホッとしました…
Azure AppServiceでMoodleのcronを動かす簡単な方法

# 概要
AzureのAppServiceに展開したMoodleでCronを実行する方法である。
CLIのcron.phpを実行するBatchファイルを作成して、Webジョブに登録するのが一番簡単であったので、その方法を解説する。

## バッチファイル
以下のようなバッチファイルを作成する。

``` bat:cron.bat
@echo off
php D:\home\site\wwwroot\admin\cli\cron.php
```

## Webジョブに登録する

AppService の画面を表示する。
![Q0pf9oR4tBFth6F1473434025_1473434086.png](https://qiita-image-store.s3.amazonaws.com/0/116241/ff90d6bb-8ca7-c1f2-c827-dca17cf28754.png)

そこからWebジョブの画面を表示し、［追加］ボタンをクリックする。
![FVI5z1wXtbo0zMC1473434129_1473434147.png](https://qiita-image-store.s3.amazonaws.com/0/116241/ea460e84-7df2-e2f2-e7c1-90cf9e9978c4.png)

以下のように設定する。
![Euu6Th2a7K1nZY51473434170_1473434187.png](https://qiita-image-store.s3.amazonaws.com/0/116241/6484d0e4-a4ee-6b74-cae2-0595fff10aeb.png)


ファイルのアップロードには、上記のバッチファイルを選択してアップロードする。
Cron式は左から{second} {minute} {hour} {day} {month} {day of the week}となっており、画面の例は30分に1回実行する設定である。

ここで［OK］ボタンをクリックすると設定は完了。
Macの音声入力の便利さと認識精度の検証

＊今回のこの記事はすべてマックに向かって話すことで自動入力しています。


マックに向かって話すだけで文字入力してくれる「音声入力コマンド」はとても便利なので、ぜひ使いましょう！！

#使用方法
次のように選択します。
<img src="http://blog-imgs-90.fc2.com/t/e/a/teapipin/I_160128-00031.png" alt="I_160128-00031.png" border="0" height="450" width="502"></a>

<img title="Onseikomando.png" src="http://blog-imgs-90.fc2.com/t/e/a/teapipin/I_Onseikomando.png" alt="Onseikomando" border="0" height="385" width="599">

#利点
何が便利かというと、キーボードを打たなくていいことです。キーボードを素早く打つためにはそれなりに訓練する必要があります。マックが使いやすいといっても文字を表現するためには、最低限覚えなければいけないキーボード操作が必要です。


そのためにマックを使うのが億劫になっている方もいらっしゃるでしょう。


　
音声入力コマンドを使えば、全くと言っていいほどキーボードを使って文字を入力する必要がありません。


なぜならばこの音声入力コマンドは非常に言葉の認識機能が優れているため、高精度で文字の入力ができるためです。


iPhoneのsiriを使っているような気分です。


文章中よく使う記号については、例えば句読点は「てん」「まる」と発声すれば「、」「。」としてくれます。


もちろんそれでも入力ミスが発生する場合がありますが、その時はキーボードにちょっと手を伸ばして修正するだけで済みます。


　
ということで例えばgoogleなどで検索を行う際はこの音声入力コマンドを使うのはとても楽です。またワードなどで長文を入力する際においても認識効率が非常に高いため、非常に重宝する機能となります。


とてもおすすめなのでみなさんも使ってみてくださいね。


もちろん、iPhoneのSiriなどと同じで周りに人がいるときには使うのはためらわれますけどね　汗。



#精度検証
認識率の精度を検証しました！
　・[マックの音声入力コマンドの認識率が高すぎる！日常用語での精度はなんとほぼ100％！！ - creativi.tea](http://teapipin.blog10.fc2.com/blog-entry-748.html)
　・[マックの音声入力コマンドの認識率は専門用語においてもほぼ100％の精度だった！！ - creativi.tea](http://teapipin.blog10.fc2.com/blog-entry-750.html)

自分のブログ記事を紹介させていただきます。転記しようかと思いましたが、疲れましたのでご容赦ください。
iPhoneアプリ開発に必要だと思うもの（後編） （※2011年2月執筆：懐古録）

**※本内容は2011年2月に自分でメモしていた内容です。5年以上経過してiPhoneアプリの環境は様変わりしました。当時と現在との違いを認識していただければと思い、アップしました。**

<hr>
　
以前の[前編](http://qiita.com/teapipin/items/55fa910808eb898d450b)に続いて、今回は後編を書いてみました。

#（６）プログラム言語（Objective-C）
アップル独自のObjective-Cを勉強する必要があります。
アップルに限らず、どのOSのアプリケーション開発も自社開発のプログラム言語で書くのが当たり前なので仕方ないですね。
Objective-cはC言語と似ていますが、<font color="red">そこそこ</font>違っています。この<font color="red">そこそこ</font>ってのが痛いですね。全然違っていれば混乱しないので紛らわしくないので。
例えば配列に値を入れる時と抜き出すときでは書き方が異なります。
一緒にしてくれれば楽なんですけどね。C言語を始めとする多くプログラム言語が一緒なので不便です。
他にも数値の比較と文字列の比較の仕方が違っていたりして、ややこしいです。。。

まあ、文句はこれくらいにして自分の思うことを書きます。
一般にどの言語の勉強も最初は標準出力（ディスプレイ）に*"Hello World!"*を出力することから始まります。
だだ、これってイミフですし、基礎から積み上げていくのって大事だけどおもしろ味がないですよね。

iPhoneアプリの場合先におもしろいアプリがあり、自分も作ってみたいと開発を目指す場合がほとんどなので、まずはそのアプリを作るために必要なものだけを勉強するのがいいと思います。
理解できなければコピペで済ましてもいいと思います。勉強が進めばあるときハッと分かる日が来るものです。それだからこそ勉強は楽しい！！
そのため、難しい（でも大事な）理論などは後からでもいいと思います。（オブジェクト指向、retainなど）
まあ情報が少ないので必要な文法がすぐに見つかるかは微妙ですけど。

#（７）アイデア
これにつきますね。
会社などで大規模にやるのならばいろいろな部署の人が意見を出し合い、市場調査なんかもできるのと違って、個人での開発はやれることが限られています。だから会社がやるようなことをやるのは難しい。
一方会社としては利益が出るような内容のアプリでないといけないわけで、このへんにヒントがあるでしょうね。つまり、個人がおもしろいと思うちょっとした大きさで会社が手を出せないアプリを開発するようなのがいいと思います。
そのためにはふだんから自分がどういう機能があればもっと便利かということを考えればいいですね。てぃーはこのあたりを攻めていこうと思っています。

 
以上、こんな感じにまとめてみました。てぃーの個人的意見でした。
iPhoneアプリ開発に必要だと思うもの（前編） （※2011年1月執筆：懐古録）

**※本内容は2011年1月に自分でメモしていた内容です。5年以上経過してiPhoneアプリの環境は様変わりしました。当時と現在との違いを認識していただければと思い、アップしました。**

<hr>
　
何とかiPhoneアプリのリリースまで行きつけたことでちょっと自信がついた、てぃーです。
２回に分けてアプリ開発に必要だと思うものを挙げてみます。

#（１）マック
これがないと開発はできません。ウィンドウズで開発できるようなソフトもありますが（Mono TouchやUnityなど）、最終段階で必ずマック本体は必要になります。しかも、IntelのCPUを使ったここ５年ほどのマシンじゃないとだめなので、安く済まそうと中古で結構昔のマシンを購入しても意味ないです。。。

ふだんウィンドウズを使っている方には２台持ちはお金と場所を取ってしまいますので注意です。ウィンドウズとは操作性も微妙に違うので慣れるのは個人差がありますね。てぃーは2001年からマックとウィンドウズの両方を使っていますが、ウィンドウズの方が使う頻度が圧倒的に多いのでマックには未だ慣れません。。。

#（２）iPhone / iPod touch / iPad
最低でも１つは必要だと思います。マックの開発環境Xcodeの中にこれらのエミュレータが入っているので動作確認はできますが、傾けたりすることはできないでこのような機能を使ったアプリを作る場合はないと確認作業ができません。そもそもふだんからこれらを使っていないとアプリのアイデアを思い浮かべるのは大変だと思いますよ。

てぃーはiPod touchだけを持っており、WiMAXでネットに繋いでいます。iPhoneを持たない理由は[こちらの記事](http://teapipin.blog10.fc2.com/blog-entry-7.html)へ。電車に乗っていると周りの人の大半がiPhoneを持ってタップしているのでちょっとうらやましいと思う時もありますが、iPod touchを愛していきます。
ちなみにこのiPod touchは2009年12月に所有していたネットブックを売ったお金で買いました。当時はネットブックに陰りが見え始めた頃でした。流行っていたのでネットブックを買ってしまいましたが、ネット専用機としての機能（操作性や起動時間）が微妙で手放すことにしました。今やネットブックのポジションはiPhone / iPadの指定席になってしまいましたね。自分の先見性に感謝します（←誰

#（３）Apple Developer Programへの登録料（年10,800円）
自作のアプリを公開する場合はもちろんのこと、自分のiPhone / iPod touch / iPadに送るだけでも年10,800円の登録料が必要になります。自分だけしか使わないアプリであってもです。年単位の更新なので最初のアプリが完成する直前に申し込まないと損をすることになります。登録作業はやや面倒ですが１～２日で完了します。

#（４）情報収集力
これも大事ですね。iPhoneアプリ開発はとにかく情報が乏しいですから。
プログラミング言語の勉強については、本も多く出ていますが大半はあるサンプルアプリを作りながら必要な文法などを勉強していくものであるため、必ずしも自分がほしい情報が載っているとは限りません。ネットでの検索では、必要な機能の例をうまく検索に引っかかるようにキーワードを入れて検索しないと泥沼にはまってしまいます。そして、どうがんばっても出てこない場合は海外のブログや掲示板を利用する必要も生じてくると思います。てぃーの場合も何度もこれらに助けられました。

また、アプリの登録方法については本では秘守義務に当たるそうであまり詳しく載っているものがありません。ネットで調べる必要がありますが、この登録方法についてはその方法が頻繁に変わるためすぐに情報が古くなってしまいます。てぃーの場合もW-8BENというPDFが送られてくるという情報を得ていたので少しの間待ってしまいました。いつの間にか規約が変わり不要になったと知ったのはしばらくしてからです（[該当記事](http://teapipin.blog10.fc2.com/blog-entry-9.html)）。


#（５）英語力
悲しいことですけど必要です。登録に関するアップルのサイトも送られてくるメールも全て英語です。

![代替テキスト](http://blog-imgs-45.fc2.com/t/e/a/teapipin/20110120003243096.png) 
![代替テキスト](http://blog-imgs-45.fc2.com/t/e/a/teapipin/mm20110103-2.png) 

登録では不具合が生じると英語でアメリカ本社に問い合わせる必要があります。日本語で書いて日本法人に送る手もあるらしいのですが、返事がアメリカ本社からの英語のメールとなってしまいます。うまく日本語に翻訳されていればいいのですが、あまり見かけないですね。これを機に勉強するのもいいと思います。てぃーも英語は長らく離れていたのでがんばろうと思いました。
　
　
続きはまた今度ということで。（[後編はこちら](http://qiita.com/teapipin/items/34bc2b451ae09564a148)）
今回一番言いたかったことはズバリお金が必要ということです（汗
手軽なモーション作成について


Pepperのハッカソンに出たときに聞かれたので、とりあえずモーション作成の小ネタをいくつか。
美しいモーションを作るとかではなく、時間制限ある中で知っておくと楽だよ。
という程度です。

##参考資料
PepperアニメーションTips
http://qiita.com/Atelier-Akihabara/items/adbcbf5de1c04767ca93

##環境
choregraphe2.4.3

##反転
![image](https://qiita-image-store.s3.amazonaws.com/0/60999/a23e8add-bdd2-3ae6-21cc-34c3e52cc418.png)
右手を振った後に左手を振る。というようなモーションを作るときに便利です。
右手を振るモーションのキーフレームを選択して所望のフレームにペースト、そのあとに反転作業をかけてください。

##ミラーリング
![image](https://qiita-image-store.s3.amazonaws.com/0/60999/9285319f-2a2e-cb1a-4390-fe5751e8b629.png)
拝むポーズとかの場合はミラーリングが便利ですね。

##拡大縮小
![image](https://qiita-image-store.s3.amazonaws.com/0/60999/adb67fb0-f6b8-a95a-2179-8203030cc01e.png)
タイムラインの数字のちょっと上のあたり(矢印のあたり)をドラッグすると帯状の物が出てきます。
この紫色の三角をドラッグすると、水色で包まれた範囲のキーフレームを拡大縮小することができます。
最初はゆっくり目でモーションを作って、危なくない程度までスピードアップさせる、とかで使いますね。

##フレームレートの変更
よしもとロボ研の高橋さんはダンスを作るときに30フレームに合わせている、と言ってました。
![image](https://qiita-image-store.s3.amazonaws.com/0/60999/49a3ea97-2006-3e09-0cfd-82c97726e403.png)
</br>
![image](https://qiita-image-store.s3.amazonaws.com/0/60999/8d7858c3-557a-f1d6-421e-320a4c162fc6.png)
音楽と同期をとるときにBPM計算をしやすいからでしょうか?
最悪、踊りのほうでタイミングが取れなくなったら、音楽のBPMを編集ソフトで調整したほうが早い、という考えだと思われます。


##Restモードとタイムラインエディターを使ったアニメーションモードもどき
choregrapheのRestボタン(右上の月のマーク)を押すと、膝と腰の前後以外の関節は固定が解除されるので、片手で各部位を支えた状態で取れるポーズに関しては、各関節ごとに手早く登録をすることができます。

初心者の方が「Animation mode」とインスペクタパネルでの各部位の調整をした後に、「キーフレーム中に保存された関節」「全身」で1コマずつポーズをコマドリしていくのに対して

このやり方では、アニメを作るときのように「頭の位置は動いてないけど口だけ動いてる動画を作るとき」は「動いている口」の部分だけ書き足していくように、
「各部位の関節位置だけ保存しておいて、好きなフレームに追加していく」という作り方になります。

登録の際には動かしている関節ごとに、ショートカットキーを使っていくと便利ですね。(頭部[F9]、腕[F10]、脚部[F11]キー)
とりあえず実践してみましょう。


「腕だけ」とか「頭だけ」でポーズをとっておきます
![image](https://qiita-image-store.s3.amazonaws.com/0/60999/1fb7b011-ef5e-16cf-7732-f97d62287840.png)
最終フレームをメモったうえで、それよりも後に記憶させておくと「パレット」のように使えて便利ですね。

特にRestモードを使った設定で「楽だなー」と思ったのは、腰(上体？)を左右に動かすモーションですね。
![image](https://qiita-image-store.s3.amazonaws.com/0/60999/a4ec0948-49a3-6872-78df-4d2df54d78c4.png)
「脚部」で記憶させることができます。


登録し終わったらタイムラインエディタを立ち上げて
![image](https://qiita-image-store.s3.amazonaws.com/0/60999/d034b765-e5f1-b7fb-1be4-afc1e0831ef6.png)

キーフレームを使うモードで編集。HipRoll以外を消去してコピーし、好きなタイミングのキーフレームのHipRollを消去、差し替えをします。
![image](https://qiita-image-store.s3.amazonaws.com/0/60999/e57397bf-939d-ef73-a65a-8ca5a705a905.png)
これで、好きなタイミングで上体を振ることができる。という感じです。
(左右に振りたい場合は、HipRollの関節に対して上記の反転を使ってみてください。タイムラインエディタ上でも各関節のキーフレームごとに使用できます。)

同じことは、指の握りでもできるので、「Animation modeだと指が設定できないなあ」とお困りの方は、指(LかRのArmをクリックしてHandを選択)
のモーションに応用してみましょう。



--
色々と技っていえるレベルかなあ、というような小技を紹介してみました。
タイムライン、アニメーションの作成に関してはあんまり投稿がないので、皆さんも色々と技を共有してくれると嬉しいですね。
【Excel】セルのIMEの文字入力モードを自動で切り替える方法 

エクセルでセルのIMEの文字入力モードを自動で切り替える方法についてです。

住所録のように列方向に入力する文字種（全角・半角・数字など）が決まっている場合、いちいちIMEの入力モードを切り替えるのは面倒ですね。

次のようにすれば、セルごとに文字入力モードを自動で切り替えることができます。
<h1>方法</h1>
例えば、次のような住所録で氏名は必ず日本語入力モードにしたい場合、まず氏名を入力するセルを選択します。
<a href="http://blog-imgs-81.fc2.com/t/e/a/teapipin/515C15E6_image.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 5px; display: inline; padding-right: 0px; border-top-width: 0px" alt="image" src="http://blog-imgs-81.fc2.com/t/e/a/teapipin/2F07111E_image_thumb.png" border="0" height="240" width="436"></a>

「データ」タブの「データツール」の「データの入力規則」をクリックします。
 <a href="http://blog-imgs-81.fc2.com/t/e/a/teapipin/50F273A2_image.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 5px; display: inline; padding-right: 0px; border-top-width: 0px" alt="image" src="http://blog-imgs-81.fc2.com/t/e/a/teapipin/0E82621D_image_thumb.png" border="0" height="131" width="543"></a>


表示される「データの入力規則」ウィンドウで、「日本語入力」タブをクリックし、「日本語入力欄」の右の下矢印をクリックして「オン」を選択、OKボタンを押します。
<a href="http://blog-imgs-81.fc2.com/t/e/a/teapipin/7E09F121_image.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 5px; display: inline; padding-right: 0px; border-top-width: 0px" alt="image" src="http://blog-imgs-81.fc2.com/t/e/a/teapipin/720800ED_image_thumb.png" border="0" height="372" width="414"></a>


このようにしておけば、「氏名」を入力するセルを選択すると、日本語入力モードが自動でオンになります。

なおこの「データの入力規則」ウィンドウでは、他のタブで他の入力規則を付けることができるので、よりセル入力の効率を高めることができます。
Ruby、Railsを学ぶ上で参考になる厳選サイト


今回は初心者必見のRubyまたはRuby on Rails入門サイトをご紹介させていただきます！

## Progate

#### サイトリンク：[Progate](http://prog-8.com/mypage)

* 対象：プログラミング初心者
* 時間：1〜2週間

### オススメポイント
* 基礎からスライドで学べる
* ブラウザでコードを書いたり、コマンドを実行できる
* 特に準備入らず！

## 小学生でもわかるRuby on Rails入門

#### サイトリンク：[小学生でもわかるRuby on Rails入門](https://openbook4.me/projects/92)

* 対象：プログラミング初心者
* 時間：1〜2時間

### オススメポイント
* railsのインストールからアプリケーションの開発まで学べる
* データベースを使った機能など第一歩にオススメ

## Ruby on Railsドキュメント

#### サイトリンク：[Ruby on Railsドキュメント](http://railsdoc.com/)

* 対象：他プログラミング言語習得者～Rails初心者
* 時間：1ヶ月

### オススメポイント
* railsのあらゆるコードや技術が細かく記載
* 必要な知識だけ引き出すのにもってこい

※注意　更新されていない

## Ruby on Rails ガイド

#### サイトリンク https://railsguides.jp/

* 対象：Rails初心者〜中級者
* 時間：1ヶ月以上

### オススメポイント
* railsのあらゆるコードや技術が細かく記載
* 必要な知識だけ引き出すのにもってこい


## MacでRuby on Railsの開発環境を構築する

#### サイトリンク：[MacでRuby on Railsの開発環境を構築する](http://chi-kun.hatenablog.com/entry/2016/07/11/201623)

* 対象：Macユーザー
* 時間：30分程度
Ruby の文字列配列・シンボル配列を複数行で書く

以前書いた [Ruby の正規表現を複数行で書く](http://qiita.com/scivola/items/04270095eb4c17ab8c92) の続編です。初心者向け。

# 文字列の配列

文字列の配列を書くとき，`%w` が使えますよね。

```rb
%w[apple banana cherry durian] #=> ["apple", "banana", "cherry", "durian"]
```

しかし，リストが長くなると見にくくなります。また，ソースコードを修正したとき，差分を取っても違いが分りづらくなります。

`%w` は改行も区切りとして使え，かつ先頭・末尾の区切り記号は無視されますので，項目ごとに改行してはどうでしょうか。

```rb
%w[
  apple
  banana
  cherry
  durian
]
```

これだと，要素の一部を修正したとき，差分を取れば以下のようにどこが変更になったか一目で分ります。

```diff
 %w[
   apple
   banana
-  chely
+  cherry
   durian
 ]
```

# シンボルの配列

シンボルの配列は，`%w` の代わりに `%i` を使うだけで，文字列の配列と同じです。

```rb
field_names = %i[
  title
  publisher
  published_year
  price
]

#=> [:title, :publisher, :published_year, :price]
```


# 参考

リファレンスマニュアル：[%記法](http://docs.ruby-lang.org/ja/2.3.0/doc/spec=2fliteral.html#percent)
rails5を入れようとしたらnokogiriで怒られた

rails5をinstallしようとしたら、nokogiriの１．６．８がinstall出来なくて怒られた
`vim Gemfile`で編集

``` Gemfile
source 'https://rubygems.org'

gem 'rails', '5.0.0.rc1'
```

bundle installを実行

```
bundle install --path vendor/bundle
```


すると以下みたいなErrorが出てinstall失敗する。


```
An error occurred while installing nokogiri (1.6.8), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.6.8'` succeeds before bundling.
$
```

qiitaを探してたら同じ問題ハマってる記事を発見
参考：[bundler でnokogiriがインストールできなかった件の対応 実はbrew側の問題だった](http://qiita.com/rojiuratech/items/3e392ff8a4451163efa6)

参考にCommand打ってみる

```
$ brew link --force libxml2
Linking /usr/local/Cellar/libxml2/2.9.4... 17 symlinks created
$ brew link --force libxslt
Linking /usr/local/Cellar/libxslt/1.1.28_1... 22 symlinks created
$
```

再度bundl installしてみると無事成功

```
$ bundle install --path vendor/bundle
```
Re:dash でダッシュボード内のグラフを全てまとめて更新する

Chrome なら動くと思う。

```js
Array.from(document.querySelectorAll('button.btn-sm > i.zmdi-refresh')).map((e) => e.parentNode.click())
```

## 2017/05/16 追記

いつのまにかダッシュボード画面に Refresh ボタンができていた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/208/135c32b6-61b4-5bb4-b897-f72a022a2c39.png)
zplugとpreztoのインストール @macOS

# 前提
・macOS
・Homebrew導入済み
・zshインストール済み

# 手順

```shell
$ brew install zplug
```

~/.zshrc内へ追記

```
export ZPLUG_HOME=/usr/local/opt/zplug
source $ZPLUG_HOME/init.zsh

zplug "sorin-ionescu/prezto"
```

zshを再起動して

```shell
$ zplug install
```

symbolik linkをはる。

```shell
$ ln -s /usr/local/opt/zplug/repos/sorin-ionescu/prezto $HOME/.zprezto
```

これより，.zshrc, .zlogin, .zlogout, .zprofile, .zshenvが上書きされてしまうため必要なら退避させておく。

preztoのインストール手順に従い，

```shell
$
setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
```

ファイルが既に存在するてきなエラーが表示されたら，そのファイルを消しておく。さっきせっかく書いた.zshrcも消されてしまうので，同様のないようを再生成された.zshrcに書き込む。　

参考
http://qiita.com/ticonz/items/fae0d576b3bb00857b50
Rubyインストール手順


##Homebrewでrbenvをインストール

下記コマンドを実行する

	$ brew update
	$ brew install readline ruby-build rbenv
	
##Pathの設定をする

`~/.zshrc`または`~/.bash_profile`の使っている方のファイルに下記のpath設定を行う
	
	export PATH=$HOME/.rbenv/bin:$PATH
	eval "$(rbenv init -)"
	
設定後下記コマンドを実行しpathを有効化する

	$ source ~/.zshrc or ~/.bash_profile
	
##rbenvを使いrubyをインストールする

インストール可能なRubyのバージョンを確認する

	$ rbenv install -l
	
インストールしたいversionを指定しRubyをインストールする
	
	$ rbenv install インストールしたいversion
	
インストール完了後、使用できるversion一覧を確認する

	$ rbenv versions
	
先ほどインストールしたversionを指定し下記コマンドを実行する
	
	$ rbenv global インストールしたversion
	
最後に下記コマンド実行し指定のversionが反映されていればOK

	$ ruby --version
自作ゲームのソースコードを公開したよ

======================

こいつら

* [フハハエンジン](https://github.com/totetero/fuhaha_engine) 自作ゲームエンジン
* [ホッピンパペット](https://github.com/totetero/hopping_puppet) フハハエンジンを用いたスマホゲーム
* [グルリンダッシュ](https://github.com/totetero/gururin2) フハハエンジンを用いたスマホゲーム

## なぜに公開

いろいろなソースコードを実行するのがプログラマーにとって最も勉強になると思い、
これまでも公開可能なコードは極力公開するようにしてきました。

今回公開したコードも、これまでのアプリインストール数から、
コードを非公開にする経済的価値はないと判断し、
未来のゲームプログラマーに少しでも役に立ってくれればと思い公開しました。

## なしてUnityでない

最近はどこもかしこもUnityだらけです。
Unityは高度な機能を手軽に使えるとても素晴らしいツールです。
でもツールの使用感は納得がいっていません。
事あるごとにAssetProgressを走らせたり
AssetBundleが融通が利かなかったり。

仕事でイライラしながら使っているのに、
趣味でもイライラしながらなんてまっぴらごめんです。

プログラマってviかemacsかで戦争を起こすような人種なのに
あんな使いにくいツールをおとなしく使っているなんて信じられない。

## どうしてC言語

c言語が好きだから。
メモリ管理は手動でやらないと鳥肌が立つタイプの人間です。

## ゲームエンジンとして何が素晴らしいの

あんまり素晴らしくないです。
自分にとって最低限必要な機能しか実装していません。
その分ゲームエンジンとしてはいろいろと軽くなっています。
ゲームのソースコードがまるまる公開されることはあまりないと思うので、
こんな実装もあるのだという参考にしていただけたらと思います。
よく使うコメントアウト


複数行の処理を使ったり使わなかったりするとき。

```
/*
何か素敵なコード
複数行のコード
//*/
```
上記コメントはたった一文字追加するだけでコメントを解除できます。

```
//*
何か素敵なコード
複数行のコード
//*/
```
c言語とかなら`#ifdef`とかのマクロを使う方がいいのかもしれないけど、
マクロはなんか苦手で。
0から9までの数をすべて足すコードを書いてみたらモヤモヤした。


### モヤモヤは解決したので、補足で説明を記載しました。
例のあの本やら記事やらを見て。もちろんダサいループは使いません。
（似たような事してるけど）

## 最初に投稿したけど、処理系依存で駄目過ぎた例↓
``` main.cpp
#include <iostream>
#include <functional>
using namespace std;

int main() {
    typedef std::pair<int, int> pair;
    std::function<pair(pair)> proc = [&proc](pair p) {
        return p.second <= 9 ? proc(make_pair(p.first+=p.second, ++p.second)) : p;
    };
    cout << proc(make_pair(0, 0)).first << endl;
    return 0;
}
```
>45
Program ended with exit code: 0

うーん、微妙！ｗ

もっと頭良い方法ありそうだと思いました、なんか絶妙に微妙。
（※ラムダで再帰はカッコよさ気に見えるけど、良い子は普通の関数で再帰しよう！）

## 何故上記のコードは駄目だったか。
**処理が左から右に処理されるとは限らないから。**

``` main.cpp
#include <iostream>
#include <functional>
using namespace std;

int main() {
    typedef std::pair<int, int> pair;
    std::function<pair(pair)> proc = [&proc](pair p) {
        return p.second <= 9 ? proc(make_pair(p.first+p.second, p.second+1)) : p;
    };
    cout << proc(make_pair(0, 0)).first << endl;
    return 0;
}
```

再帰時の
**proc(make_pair(p.first+p.second, p.second+1))**
が米を頂いての変更点です。
**proc(make_pair(p.first+=p.second, ++p.second))**
の場合だと、処理系によっては **右から左に評価される場合もあります** 
参考：米欄 と http://www.jpcert.or.jp/sc-rules/c-exp10-c.html

なので、下記の ideone だけ出力が違う結果が出てしまっていました。
(コードの動きの説明は冗長かもしれませんが、想定せずに先にp.secondがインクリメントされてしまったという事です。)

~~**まるで基礎が出来ていないという事が露呈されてしまった。**~~

## 

## more feature（妄想です）
``` C++XXXX
#include <iostream>
using namespace std;

int main() {
    cout << [](auto p) {
        return p.second <= 9 ? this(make_pair(p.first+=p.second, p.second+1)) : p;
    }(make_pair(0, 0)).first << endl;
    return 0;
}
```

~~**こんな感じで書けたら、なんかちょっとカッコいいなとか思った。**~~


## ここからモヤモヤ　※解決済み
上記の正しく動く方のコード、
私の Xcode や paiza.io だと出力は **45** なのですが、
何故か ideone だと結果が **55** になったのがモヤモヤ。

### Xcode
![スクリーンショット 2016-09-09 21.03.42.png](https://qiita-image-store.s3.amazonaws.com/0/102952/9f9755e1-2253-13f3-01e3-1cb27367ee0b.png "スクリーンショット 2016-09-09 21.03.42.png")

### paiza.io
![スクリーンショット 2016-09-09 21.00.30.png](https://qiita-image-store.s3.amazonaws.com/0/102952/f7250d0d-d418-d0f2-76f2-e8b4249524ea.png "スクリーンショット 2016-09-09 21.00.30.png")

### ideone
![スクリーンショット 2016-09-09 21.01.30.png](https://qiita-image-store.s3.amazonaws.com/0/102952/6bc67990-3eca-6144-cc15-275a3176cd90.png "スクリーンショット 2016-09-09 21.01.30.png")

~~**後地味にideaone広告多すぎ**~~

![iO.jpg](https://qiita-image-store.s3.amazonaws.com/0/102952/a7496a52-7249-ce0e-5592-321ecb90ccbc.jpeg "iO.jpg")
「オフラインリアルタイムどう書く第6回(続柄)」の問題を解いてみた


[横浜へなちょこプログラミング勉強会](https://yhpg.doorkeeper.jp/)にて過去に出題された[続柄](http://nabetani.sakura.ne.jp/hena/ord6kinship/)を解いてみた。
回答にかかった時間は20分ぐらい。

「1〜13 までの女性は全員三人ずつ娘を生んでいる」とあるが、いくつか実装を見てみたところ14以降の女性が子なしであることを考慮していないように見える。
テストデータにはそのようなデータがないため考慮する必要がないのかもしれないが、なんとなく気になったので世代チェックもするようにしている。

```ruby
class FamilyTree
  def initialize children, max_generation, me
    @me = me.to_i
    @children = children
    @max_generation = max_generation

    g = @me
    begin @generation = (@generation || 0) + 1 end while (g = mother(g)) != 0
  end

  def check other
    other = other.to_i
    return "me" if @me === other
    return "mo" if mother(@me) === other
    return "da" if mother(other) === @me and @generation < @max_generation
    return "si" if mother(@me) === mother(other) and @me != other
    return "au" if mother(mother(@me)) === mother(other)
    return "ni" if mother(@me) === mother(mother(other)) and @generation < @max_generation
    return "co" if mother(mother(@me)) === mother(mother(other))
    "-"
  end

  def mother me
    (me + 1) / @children
  end
end

test = <<_TEST
/*#0*/ test( "5->2", "mo" );
/*#1*/ test( "28->10", "au" );
/*#2*/ test( "1->1", "me" );
/*#3*/ test( "40->40", "me" );
/*#4*/ test( "27->27", "me" );
/*#5*/ test( "7->2", "mo" );
/*#6*/ test( "40->13", "mo" );
/*#7*/ test( "9->3", "mo" );
/*#8*/ test( "4->1", "mo" );
/*#9*/ test( "1->3", "da" );
/*#10*/ test( "12->35", "da" );
/*#11*/ test( "3->8", "da" );
/*#12*/ test( "6->19", "da" );
/*#13*/ test( "38->40", "si" );
/*#14*/ test( "9->8", "si" );
/*#15*/ test( "4->2", "si" );
/*#16*/ test( "15->16", "si" );
/*#17*/ test( "40->12", "au" );
/*#18*/ test( "10->4", "au" );
/*#19*/ test( "21->5", "au" );
/*#20*/ test( "8->2", "au" );
/*#21*/ test( "3->5", "ni" );
/*#22*/ test( "11->39", "ni" );
/*#23*/ test( "2->13", "ni" );
/*#24*/ test( "13->32", "ni" );
/*#25*/ test( "14->22", "co" );
/*#26*/ test( "40->34", "co" );
/*#27*/ test( "5->8", "co" );
/*#28*/ test( "12->10", "co" );
/*#29*/ test( "1->27", "-" );
/*#30*/ test( "8->1", "-" );
/*#31*/ test( "12->22", "-" );
/*#32*/ test( "2->40", "-" );
/*#33*/ test( "32->31", "-" );
/*#34*/ test( "13->14", "-" );
_TEST

require 'minitest/autorun'

describe 'Family Tree' do
  test.split("\n").each do |line|
    t, n, input, expect = line.match(/^\/\*#(\d+)\*\/\stest\(\s+"([^"]+)",\s+"([^"]+)"\s*\);$/).to_a
    me, other = input.split("->")
    tree = FamilyTree.new 3, 4, me
    it input do
      assert_equal expect, tree.check(other)
    end
  end
end

```
オラ用 チーム管理 資料 置き場 ニャ

自分用

## Team Metrix


### Team Metrix ＃１

#### チームスコア

* アウトプット
   * 質、量、デリバリーの点で顧客が満足しているか？
* コラボレーション能力
   * チーム内に、一致団結した働きを後押しする動きがあるか？
* 個々のメンバーの成長
   * メンバーが知識、スキル、能力を伸ばしているか？

#### チームの有効性

* 絶対的な方向性
   * チームに、明確で挑戦しがいがあり、達成に意義を見いだせるような共通目標がある
* 強力な構造
   * 人員と構成
   * タスクに対して開始から完了まで責任を負っているか
   * 許容される振る舞いを定めた明確な規範があるか
* 支えとなるコンテキスト
   * 必要なリソース、情報、研修が得られているか
   * 適切な成功報酬が用意されているか
* 共通の思考様式
   * メンバーは強力な共通のアイデンティティを持っているか
   * メンバーが互いに進んで情報を共有し、相手の制約事項やコンテキストを理解しているか


### リーダー振る舞い ＃１

<table>

<tr>
<th></th><th>技術面</th><th>心理面</th>
</tr>

<tr>
<th>動機付ける</th><td>個人の背景に合わせる</td><td>リフレーミングをする</td>
</tr>

<tr>
<th>可能にさせる</th><td>適切な情報を提供する</td><td>リスクテイクを許容する</td>
</tr>

</table>



### 自己組織化のマトリクス表

![team.png](https://qiita-image-store.s3.amazonaws.com/0/106271/56b9f010-da59-a99c-8979-68dbd070b415.png)


### 参考

* https://www.infoq.com/articles/what-are-self-organising-teams 原文
* https://www.infoq.com/jp/articles/what-are-self-organising-teams 日本語

### リーダーシップスタイル

![leadershipstyle.png](https://qiita-image-store.s3.amazonaws.com/0/106271/551ee8a2-c557-3400-38ac-41ac8e761764.png)


### チームの前向きさと生産性

![teamcondition.png](https://qiita-image-store.s3.amazonaws.com/0/106271/e5c2c8b8-9e91-fa73-d7b3-a59b0137927a.png)



### 参考

* https://www.infoq.com/articles/exercises-building-better-teams 原文
* https://www.infoq.com/jp/articles/exercises-building-better-teams 日本語
* http://teamcoachinginternational.com/programs/program-team-diagnostic/
sfWidgetFormInputCheckboxのバグ調査

※ symfony1.4を対象としています
# チェックボックスがオフにならない
symfony1.4でフォームを作成していて、チェックボックスが必要だったので設置した

```php:
$this->widgetSchema['testCheckbox'] = new sfWidgetFormInputCheckbox();
```

チェックボックスをonにしてPOSTすると、フォームのvalueは'on'となる

```php:
$form['testCheckbox']->getValue();
=> 'on' 
```

では外した時はどうなるのか？
見た目上はチェックは外れていない。。。

```php:
$form['testCheckbox']->getValue();
=> '' 
```

空文字列が返ってくる、が、チェックは外れない。。。

# sfWidgetFormInputCheckboxのrenderメソッドを調査

```php:widget/sfWidgetFormInputCheckbox.class.php
public function render($name, $value = null, $attributes = array(), $errors = array())
{
    if (null !== $value && $value !== false)
    {
        $attributes['checked'] = 'checked';
    }

    if (!isset($attributes['value']) && null !== $this->getOption('value_attribute_value'))
    {
        $attributes['value'] = $this->getOption('value_attribute_value');
    }

    return parent::render($name, null, $attributes, $errors);
}
```

renderメソッドで$valueは指定していないが、

```php:
if (null !== $value && $value !== false)
{
    $attributes['checked'] = 'checked';
}
```

ここでchecked属性がセットされている模様。
いろいろ調べてみると、以下のページが見つかる
http://www.devexp.eu/2009/04/23/sfwidgetforminputcheckbox-unchecked-bug/

このページを真似て、checked属性を付与している判定箇所を以下のように書き換えてみる。

```php:
if (null !== $value && $value !== false && $value !== '')
{
    $attributes['checked'] = 'checked';
}
```

このようにすると、renderメソッドでのcheckboxオフオン判定が正常に行われるようになる
Play Framework 2.5: 空のプロジェクトをHerokuにデプロイするまで

現在、Play Frameworkを勉強中ですが、公式ドキュメントを参考にHerokuで動かそうとしてみたら、ドキュメントの情報が古かったためかテンプレートそのままのプロジェクトを動かすのにかなり時間がかかりました。
最新版のPlayをHerokuで動かすまでの情報がまとまっているページも見つからなかったため、備忘録としてまとめました。

# 環境

- Mac OS X El Capitan
- Play Framework 2.5.6
- Heroku Toolbelt 3.43.10
- Heroku CLI 5.2.40
- Playのテンプレートは`play-java`を使用

# プロジェクトの作成
ターミナルから以下のコマンドを実行。

```
$ activator new [project-name] [template-name]
```

テンプレート名は、`play-java`など。分からなければ入力しないでおくことで、対話的に選択できます。
プロジェクト名にはアルファベット大文字を使わないことをオススメします(入っていてもいいですが、あとで`Procfile`がややこしくなります)。

# とりあえず実行

```
$ cd project-name
$ activator run
```

http://localhost:9000 を開いて少し待てば、"Your new application is ready."と書かれた緑色のページが表示されるはず。

# Procfileを作成する
Herokuで動作させるために、プロジェクトのルートディレクトリに、`Procfile`というファイルを作成し、以下の内容を1行だけ書き込みます。

```Procfile
web: target/universal/stage/bin/[project-nameを小文字で] -Dhttp.port=${PORT} -Dplay.crypto.secret=${APPLICATION_SECRET}
```

`[project-nameを小文字で]`の部分だけ変更してください。
もしプロジェクト名にアルファベット大文字を使用している場合は、ここだけ**小文字に直して**書き込みます。
また**途中に改行を入れないでください**。改行の前にバックスラッシュを入れても動きませんでした。

# gitローカルリポジトリを作成

```
$ git init
$ git add .
$ git commit -m "init"
```

# Herokuのアプリを作成する
Heroku Toolbeltが使用できる場合は、コマンドラインから作業できます。
ない場合はブラウザ版のHerokuからどうぞ。

```
$ heroku create
```

先に`git init`しておくと、ここで勝手に`git remote add heroku`してくれます。

# Herokuのアプリに、Application Secret キーを設定

```
$ heroku config:add APPLICATION_SECRET=[適当な文字列]
```

キーはとりあえずここでしか使いません。また忘れてもHerokuの設定から確認できるので、てきとーに入力してください。
Herokuブラウザ版から設定する場合は、Settings/Config Variables から、KEY=APPLICATION_SECRET を追加してください。

[16.9.11 追記] Activatorにもキーを生成する機能がありました。

```
$ activator playGenerateSecret
[info] Generated new secret: DHM@4lP?(略)
$ heroku config:add APPLICATION_SECRET="DHM@4lP?(略)"
```

参考: http://stackoverflow.com/questions/27171321/what-is-the-activator-command-to-generate-application-secret

# Herokuへpush・デプロイ

```
$ git push heroku master
```

pushに続いてビルド・デプロイが走ります。
うまくデプロイできたようなら、

```
$ heroku open
```

でアプリを開いてみましょう。
"Your new application is ready."と書かれたそっけないページが表示されれば完了です。
Macのtreeコマンドでindex.html的なものを作る

ディレクトリ内に index.html なものを生成したい。
サブディレクトリには不要なので、ルートだけに tree.html が欲しい。
具体的には、Jenkinsのビルド成果物を Amazon S3 にアップロードするときに使いたい。
tree コマンドが使えそう。

# 結論から

treeコマンドの `-H baseHREF   Prints out HTML format with baseHREF as top directory.` というオプションを使う。

# 実行結果

```sh:-Hオプション無しで実行
$ tree
```
```shell-session:結果
.
├── nya.html
└── subdir
    └── neko.html

1 directory, 2 files
```

-H の baseHREF に`.`を指定してみる

```sh:-Hオプション付きで実行
$ tree -H .
```

```shell-session:結果
<!DOCTYPE html>
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <meta name="Author" content="Made by 'tree'">
 <meta name="GENERATOR" content="$Version: $ tree v1.7.0 (c) 1996 - 2014 by Steve Baker, Thomas Moore, Francesc Rocher, Florian Sesser, Kyosuke Tokoro $">
 <title>Directory Tree</title>
 <style type="text/css">
  <!-- 
  BODY { font-family : ariel, monospace, sans-serif; }
  P { font-weight: normal; font-family : ariel, monospace, sans-serif; color: black; background-color: transparent;}
  B { font-weight: normal; color: black; background-color: transparent;}
  A:visited { font-weight : normal; text-decoration : none; background-color : transparent; margin : 0px 0px 0px 0px; padding : 0px 0px 0px 0px; display: inline; }
  A:link    { font-weight : normal; text-decoration : none; margin : 0px 0px 0px 0px; padding : 0px 0px 0px 0px; display: inline; }
  A:hover   { color : #000000; font-weight : normal; text-decoration : underline; background-color : yellow; margin : 0px 0px 0px 0px; padding : 0px 0px 0px 0px; display: inline; }
  A:active  { color : #000000; font-weight: normal; background-color : transparent; margin : 0px 0px 0px 0px; padding : 0px 0px 0px 0px; display: inline; }
  .VERSION { font-size: small; font-family : arial, sans-serif; }
  .NORM  { color: black;  background-color: transparent;}
  .FIFO  { color: purple; background-color: transparent;}
  .CHAR  { color: yellow; background-color: transparent;}
  .DIR   { color: blue;   background-color: transparent;}
  .BLOCK { color: yellow; background-color: transparent;}
  .LINK  { color: aqua;   background-color: transparent;}
  .SOCK  { color: fuchsia;background-color: transparent;}
  .EXEC  { color: green;  background-color: transparent;}
  -->
 </style>
</head>
<body>
	<h1>Directory Tree</h1><p>
	<a href=".">.</a><br>
	├── <a href="./nya.html">nya.html</a><br>
	└── <a href="./subdir/">subdir</a><br>
	&nbsp;&nbsp;&nbsp; └── <a href="./subdir/neko.html">neko.html</a><br>
	<br><br>
	</p>
	<p>

1 directory, 2 files
	<br><br>
	</p>
	<hr>
	<p class="VERSION">
		 tree v1.7.0 © 1996 - 2014 by Steve Baker and Thomas Moore <br>
		 HTML output hacked and copyleft © 1998 by Francesc Rocher <br>
		 JSON output hacked and copyleft © 2014 by Florian Sesser <br>
		 Charsets / OS/2 support © 2001 by Kyosuke Tokoro
	</p>
</body>
</html>
```

ほぼ、期待するものが出来上がった！

# 環境

* OS X Elcapitan (10.11.3)
* tree v1.7.0

# おまけ

直下のサブディレクトリ内に tree.html を作ってまわるワンライナー

```sh
$ find . -maxdepth 1 -type d -exec tree {} -H . -o {}/tree.html \;
```
Visio2016のVBAを使って、Excel2016のシートに値を書き込む

VBAを書くのイヤだなーっていいつつ今回も書いていて解決方法がやっと見つかったのでメモ

```vba:xlsfromvisio.bas
Dim ExcelSheet as Object

Set ExcelSheet = CreateObject("Excel.Application")
ExcelSheet.Workbooks.Open [読みたいExcelのシート]

' シートに書き込む場合は
' ExcelSheet.ActiveSheet.Cells(row,col).Value = 1
' といった具合にExcelオブジェクトの接頭語が付く
' 今回は  ExcelSheet.
ExcelSheet.ActiveSheet.Cells(row,col).Value = "内容"

ExcelSheet.ActiveWorkbook.Save
ExcelSheet.Application.Quit

Set ExcelSheet = Nothing
```

今回はActiveSheetへの書き込みができればよかったので試してないですが、任意のシートへアクセスする場合はExcelでシートにアクセスする要領でSheet("名前")みたいにすればいいんじゃないでしょうか。
CloudFront が http2 に対応したので検証してみた

# CloudFront が http/2 に対応しました。

## 設定手順

　２０１６年9月８日(__たぶん__)より新規作成する場合は、デフォルトで __http/2__ が有効となるようになりました。既存のディストリビューションでは設定を変更し__有効__にすることが可能です。

[Distributions] → [General] → [Edit] から有効にすることが可能です。
<img width="551" alt="スクリーンショット_2016-09-09_17_53_04.png" src="https://qiita-image-store.s3.amazonaws.com/0/131489/7c04c6c7-9804-65cf-6453-2afaed04cdca.png">

## 動作確認
__jmeter__を使い、常にアクセスし続けるようにし__error__が返って来ないことを確認しました。

CloudFront が__deploy__ 後に __h2load__ コマンドで確認しました。
h2load に関しては下記の URL を参考にしました。
https://blog.cloudflare.com/tools-for-debugging-testing-and-using-http-2/

下記がコマンド実行結果です。

```
% h2load  https://xxxxxx.cloudfront.net/index.html                                       
starting benchmark...
spawning thread #0: 1 total client(s). 1 total requests
TLS Protocol: TLSv1.2
Cipher: ECDHE-RSA-AES128-GCM-SHA256
Server Temp Key: ECDH P-256 256 bits
Application protocol: h2
progress: 100% done

finished in 70.53ms, 14.18 req/s, 7.78KB/s
requests: 1 total, 1 started, 1 done, 1 succeeded, 0 failed, 0 errored, 0 timeout
status codes: 1 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 562B (562) total, 278B (278) headers (space savings 22.78%), 208B (208) data
                     min         max         mean         sd        +/- sd
time for request:    16.54ms     16.54ms     16.54ms         0us   100.00%
time for connect:    52.84ms     52.84ms     52.84ms         0us   100.00%
time to 1st byte:    69.73ms     69.73ms     69.73ms         0us   100.00%
req/s           :      14.23       14.23       14.23        0.00   100.00%
```

**Application protocol: h2** となっており、 http/2 でアクセス確認が取れました！！

## まとめ
既存の CloudFront にサービス影響なく__有効__にできるのはいいなーと思いました。
PAssertとMoqを同時に使用する際のの注意点

# 覚書
**自分用のメモ**
PAssert.IsTrueの中でMoqのオブジェクト使用した比較は避けたほうがよい。比較した結果がTrueならば問題がないが、FalseだとPAssertの失敗時の情報を表示するというありがたい機能で例外が発生するから
なぜOptionはTraversableOnceをmix-inしてないのにそのように振る舞えるの？

## はじめに

ListのflatMapはGenTraversableOnceを返す高階関数を期待しているが、以下のようにOption型を返してもコンパイルエラーは起きない。

```scala
scala> List(1,2,3,4).flatMap { v => if(v % 2 == 0) Some(v) else None }
res0: List[Int] = List(2, 4)
```

で、確認すると、

```scala
scala> val a: scala.collection.GenTraversableOnce[String] = Option("hello")
a: scala.collection.GenTraversableOnce[String] = List(hello)
```

代入できる。
リ、リストかぁ（´-`）.｡oO

## TraversableOnceをmix-inしているのかな？

![option.png](https://qiita-image-store.s3.amazonaws.com/0/159/2b0780dd-8ea9-c757-d406-edda8c7c5fc4.png)

...していない。

## ということは？
Scalaの場合もうアレしかない、Implicit Conversion!

https://github.com/scala/scala/blob/v2.11.8/src/library/scala/Option.scala#L17

```scala
object Option {

  import scala.language.implicitConversions

  /** An implicit conversion that converts an option to an iterable value
   */
  implicit def option2Iterable[A](xo: Option[A]): Iterable[A] = xo.toList

```

なるほど、`toList` している。
スッキリ。
ログ集計でよく使うbigqueryの基本的な関数


bigqueryにアクセスログやアプリケーションログを蓄積していて、色々クエリを書いている中で、BIGQueryの便利な関数を使う機会が多かったのでメモを公開しとく。
いつも忘れてて毎回調べるのでまとめてみた。

個人的によく使う4パターン！！


##定番 日付テーブル(tablename_yyyymmdd)に対して、テーブルまたいで期間で検索したい

BigQueryに時系列のデータを入れる際のスタンダードパターン(?)で、テーブル名をtablename_yyyymmddとかにして日次でテーブルを作るケースがよくある。そんな時、テーブルまたいで日付で条件指定したい時のケース

(例)accesslog_20160801
    accesslog_20160802...
    accesslog_20160901...
上記のようなテーブル構成から2016-08-20から2016-09-01までのあるデータを抽出したい

- TABLE_DATE_RANGE関数を使う

```
SELECT *
FROM (TABLE_DATE_RANGE( [プロジェクト名:dataset名.accesslog_],
       TIMESTAMP('2016-08-20'),
       TIMESTAMP('2016-09-01'))) 
```

##定番 	TIMESTAMP型のデータをUTC→JSTに変換

BigQueryに入るデータはUTCフォーマットされてインサートされるが、分析するときはJSTで見たいって時。

- STRFTIME_UTC_USEC,TIMESTAMP_TO_USECを使う

(例)datetimeというTIMESTAMP型のデータに+09:00して日本時間に変換する

```
SELECT (STRFTIME_UTC_USEC(TIMESTAMP_TO_USEC(datetime) + 32400000000, "%Y/%m/%d %H:%M:%S") AS jsttime
FROM [プロジェクト名:dataset名.accesslog_20160906]
```

![Google_BigQuery.jpg](https://qiita-image-store.s3.amazonaws.com/0/40850/ea959f36-20a7-84f9-c55b-baad0d46ed84.jpeg "Google_BigQuery.jpg")

##日付単位でデータを集計したい

rowデータに対して毎回クエリを投げるとそれなりのスキャンが走るので、日付毎にアクセス数を別テーブルに保存してそっちで集計する時に使う

- DATE関数を使う

(例)2016-08-20から2016-09-01間の日単位のレコード数をだす

```
SELECT 
  (STRFTIME_UTC_USEC(TIMESTAMP_TO_USEC(datetime) + 32400000000, "%Y/%m/%d %H:%M:%S")) AS jsttime,
  count(*)
FROM (TABLE_DATE_RANGE( [プロジェクト名:dataset名.accesslog_],
       TIMESTAMP('2016-08-20'),
       TIMESTAMP('2016-09-01'))) 
GROUP BY jsttime

```

##特定フィールドのデータをコンバートする

これは、特殊な事情かもしれないが、Re:dashで可視化する事を想定した時に、わかりやすい値でないとグラフ化してもあんまりうれしくない事がある。

例えば、IISログでポート番号毎にアクセス数だしたいけどRe:dashグラフ上にポート番号出てきても直感的に何だかわかる人は少ないとかそういう時に使う。

- REGEXP_REPLACE関数

(例)s_portフィールドの値が、8888→xxx.com,8889→yyy.comとデータをコンバートして、s_port単位のレコード数を出す

```
SELECT DATE(STRFTIME_UTC_USEC(TIMESTAMP_TO_USEC(datetime) + 32400000000, "%Y/%m/%d %H:%M:%S") ) as day,
  CASE
    WHEN s_port = '8888'
  　　THEN REGEXP_REPLACE(s_port,".+",'xxx.com')
    WHEN s_port = '8889'
  　　THEN REGEXP_REPLACE(s_port,".+",'yyy.com')  
    ELSE
        s_port
     END AS s_port,
  count(s_port) AS requerst_count
FROM [プロジェクト名:dataset名.accesslog_20160906]
GROUP BY day,s_port
ORDER BY requerst_count DESC

```

Re:dashで見た時に、ポート番号で何件とか出るより、xxx.com何件とか見れたほうが視覚的にやさしい。

※CASE分でひたすら分岐するのはバッドケースな気もするので、UDFとか使えばもうちょい綺麗に書けるのかもですがまだそこには手つけてない。

##参考

ttps://cloud.google.com/bigquery/query-reference#datetimefunctions
ChromebookからのSecure Shell利用時に日本語入力

uim-fepを使いつつ、ALT+SPACEで日本語モードを切り替えるようにすればうまく行く模様


```shell-session
$ sudo apt-get install -y uim-fep uim-anthy
$ cd
$ cat << EOF > .uim
(define-key generic-on-key? '("<Shift> " "<Control> " "<Control>\\" "<Alt> "))
(define-key generic-off-key? '("<Shift> " "<Control> " "<Control>\\" "<Alt> "))
EOF
$ uim-fep
```

Rainbow StreamでTwitterしたいがためだけに調べていた
CentOS7にMailCatcherインストール


CentOS7にMailCatcherインストール

```shell-session
yum install ruby
yum -y install ruby-devel
yum install gcc
yum install gcc-c++
yum install sqlite-devel
gem install mailcatcher
mailcatcher --http-ip IPアドレス
cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/mailcatcher.xml
```

ファイル編集

```shell-session
vi /etc/firewalld/services/mailcatcher.xml
```

```xml:mailcatcher.xml
<short>mailcatcher</short>
<port protocol="tcp" port="1080"/>
```

```shell-session
firewall-cmd --reload
firewall-cmd --add-service=mailcatcher
firewall-cmd --permanent --add-service=mailcatcher
```

テスト

```shell-session
telnet IPアドレス 1025
HELO example.com
MAIL FROM: user@example.com
RCPT TO: test@example.com
DATA
From: user@example.com
Subjet: test
test
.
QUIT
```

ブラウザから確認
http://IPアドレス:1080
複数フィールドのvalidation

※ symfony1.4を対象にしています

# 複数フィールドのvalidation
特定のフィールドに値が入っている時のみ、他の特定フィールドにvalidationをかけたいときがある
symfony1.4のドキュメントを見ると
http://symfony.com/legacy/doc/forms/1_4/ja/02-form-validation
にグローバルバリデータとして紹介されている

用意されているクラスは
http://www.symfony-project.org/api/1_4/sfValidatorSchema#method_setpostvalidator
こちらにのっているものだけで、その他の場合は自分で実装する形になる

# 実装方法
## PostValidatorを利用する
PreValidatorもあるらしい、けどPostValidatorを推奨している

formクラスのsetupメソッド内で

```php:
$this->validatorSchema->setPostValidator(
  new sfValidatorCallback(
    array('callback' => array($this, 'postValidatorMethod'))
    array('invalid' => 'エラーメッセージ')
  )
);
```

とする
callbackメソッド（postValidatorMethod）を定義する

```php:
public function postValidatorMethod($validator, $values)
{
  // ここでの$valuesはvalidation済フォームデータ
  if ($values['特定のフィールド1'] !== '') {
    // $values['特定のフィールド2']をチェックするとか
  }
}
```

postValidatorとsfValidatorCallbackを利用すると、フォーム全体のデータを使って自由にvalidationをかけることができる
postValidator（グローバルバリデータ）を使ってvalidationエラーが発生した場合、エラー内容はgetGlobalErrors()で取得できる