OmniAICreator/Qiita-1.07M huggingface dataset:
Android 4.1(Jerry Beans)以降のTimePickerDialogの動作が不可解

# TimePickerDialogとは

そのまんま，時刻を設定するためのダイアログ．
画像はICS(Android 4.0.4のもの)

![01.png](https://qiita-image-store.s3.amazonaws.com/0/51949/76345771-acf0-35f7-25ad-94ea2c245bcd.png)

ICSではキャンセルボタンと設定ボタンが配置されている．
当然キャンセルボタンを押せば入力は無いし，設定を押せば入力が完了する(onTimeSet()が呼ばれる)．

# Jerry Beans以降（4.4.2 Kitkatまで確認）になると？

表示はこうなる．

![02.png](https://qiita-image-store.s3.amazonaws.com/0/51949/e82bfaf1-4852-84d4-423a-499501a5fbc7.png)

キャンセルボタンが無くなり，設定ボタンは「完了」に変わっている．
不可解なのはここから．

* バックボタンで閉じても onTimeSet() が呼ばれて入力が完了する．
* ダイアログを枠外タップして消しても onTimeSet() が呼ばれて入力が完了する．
* 完了ボタンがクリックされると，なんと onTimeSet() が2回呼ばれる．

# なんで？

意図した物かはわからない．意図したいこともよくわからない．
バグなのか？これ？

# コード上は？

## 4.0.4のコードでは，こうなっている．

http://tools.oesf.biz/android-4.0.4_r1.0/xref/frameworks/base/core/java/android/app/TimePickerDialog.java

```java:TimePickerDialog.java
public void onClick(DialogInterface dialog, int which) {
    if (mCallback != null) {
        mTimePicker.clearFocus();
        mCallback.onTimeSet(mTimePicker, mTimePicker.getCurrentHour(),
                mTimePicker.getCurrentMinute());
    }
}
```

ボタンがクリックされるとコールバックのonTimeSetを呼び出す形だ．
ただ，コンストラクタの中でボタン設定をしており，完了ボタンではコールバックを設定し，キャンセルボタンではそもそもOnClickListenerをセットしていないため、 onClickは呼ばれない。
だから，当然完了ボタンをクリックしたときのみ onTimeSet が呼び出され，入力が完了する．

では Jerry Beans以降になると？

## 4.1.1のコードではこうなっている

http://tools.oesf.biz/android-4.1.1_r1.0/xref/frameworks/base/core/java/android/app/TimePickerDialog.java#tryNotifyTimeSet

```java:TimePickerDialog.java
public void onClick(DialogInterface dialog, int which) {
    tryNotifyTimeSet();
}

public void updateTime(int hourOfDay, int minutOfHour) {
    mTimePicker.setCurrentHour(hourOfDay);
    mTimePicker.setCurrentMinute(minutOfHour);
}

public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
    /* do nothing */
}

private void tryNotifyTimeSet() {
    if (mCallback != null) {
        mTimePicker.clearFocus();
        mCallback.onTimeSet(mTimePicker, mTimePicker.getCurrentHour(),
               mTimePicker.getCurrentMinute());
    }
}

@Override
protected void onStop() {
    tryNotifyTimeSet();
    super.onStop();
}
```

Jerry Beans以降のコードになると，tryNotifyTimeSet() というメソッドが追加され，ここでコールバックのonTimeSet()を呼び出しているのがわかる．
ただ，このメソッドが onClick と，onStopで呼び出されている．
だから，TimePickerDialogを閉じると， onStop() から tryNotifyTimeSet() が呼ばれて入力が完了されてしまう．
完了ボタンをクリックすると， onClick() で tryNotifyTimeSet() が呼び出されてから，さらにダイアログが閉じたタイミングの onStop() からも tryNotifyTimeSet() が呼ばれてしまう．
もちろん，端末をスリープしただけでも onTimeSet() が呼ばれる．
入力のキャンセルができなくなっている．

# どうしてこうなった

どう対応した物か…
カレントバッファの内容をEvernoteへ


M-x toevernote で登録できます。

※ バッファを保存していないと動きません。

```toevernote.rb
#!/usr/bin/ruby

tmp_path = "/tmp/#{Time.new.to_i}"

apple_script = <<-EOF
on run argv
  repeat with arg in argv
    try
      open for access arg
      set note_text to read arg
    end try
    close access arg

    tell application "Evernote"
      create note title paragraph 1 of note_text with text note_text
    end tell
  end repeat
end run
EOF

system("nkf -s #{ARGV[0]} > #{tmp_path}")
system("osascript -e '#{apple_script}' #{tmp_path}")
```

```emacs
(defun toevernote ()
  (interactive)
  (shell-command (concat "/path/to/toevernote.rb " (buffer-file-name))))
```

path には上の ruby スクリプトを指定します。

```shell-command``` 使えば、emacs lisp 知らなくても作れるのでいいですね。
Project Eulerをhaskellで練習していく日記: Problem 21

#問題
d(n)を自然数nの真の約数の和を表す関数としよう。
Amicable pairとは、二つの自然数a/=bで d(a)=b, d(b)=aとなる組のことである。
例）220 の真の約数は 1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110であるので、d(220) = 284
逆に、284の真の約数は 1, 2, 4, 71, 142であるので、d(284)=220
このとき、220と284はAmicable pairと呼ぶ。

10000以下のAmicable pairの和を求めよ。
#回答
[Wikipediaの約数の和](http://ja.wikipedia.org/wiki/%E7%B4%84%E6%95%B0#.E7.B4.84.E6.95.B0.E3.81.AE.E5.92.8C)をカンニングしました。

```hs
import qualified List as L

-- 素因数の列を求める
divisor 1 = []
divisor n = sd : divisor q
        where sd = head [d|d<-[2..n], n `mod` d==0]
              q = n `div` sd
-- 素因数グループ化
soinsuu n = [ (p !! 0, length p) | p <- L.group $ L.sort $ divisor n]

-- 約数関数
yakusuu [] = 1
yakusuu ((p,a):xs) = ((p^(a+1)-1) `div` (p-1))* (yakusuu xs)

-- 真の約数の和
shinsum n = (yakusuu $ soinsuu n) - n

-- Amicable numbersのペアの和。ペアができない場合は0を返す。
amipairsum n = if n<d && n == shinsum d then n+d else 0
           where d = shinsum n

main = do 
      print $ sum $ map amipairsum [1..10000]
```
#感想
Wikipedia様々です。。。
それ以上の工夫はしていません。

※問題１９と２０は興味をそそらないのでスキップしました。
【xamp】XAMPPでLDAPを利用できるようにする

C:\xampp\php\php.iniのphp_ldap.dllのコメントを外して、apacheを再起動。

```php:php.ini
extension=php_ldap.dll
```

なかなか、エクステンションが読み込まれなくて、C:\xampp\phpをPATHに入れたり、PC再起動したりしてたら、いつのまにかエクステンションに入っていた。なかなかうまくいかない場合は、このあたりも試すと良いかもしれない。
Railsアプリの複雑な設定ファイルを、簡潔に管理できるようにする方法

Railsではアプリ別のconfigファイルを楽に管理できるgemは色々存在しています、例えば：
Figaro：https://github.com/laserlemon/figaro
Rails_config：https://github.com/railsconfig/rails_config

figaroの場合は全部config/application.ymlにまとめて管理し、rails_configも環境によって三つのファイルに管理となります。両方とも限っているファイルで全部設定をまとめて書こうという方針になります。でも設定ファイルがすごくややこしいアプリは存在するでしょう。
たとえば、国際化をするため、日本人向けに設定が別で、インドネシア人向けに設定が別で、全部まとめて書いておくと、とてもみづらくなるかなと思います：

```yaml
#application.yaml
en:
 config1:
  a: 1
   B: 2
  c: 3
  key1 :xxx
  key2 :yyy

jp:
 config2:

.
.
.
```
みたいになん百行も続くになってしまい、修正と管理がややこしくなるでしょう。
なので、***フォルダ*** で分離して管理した方がようかなと思います。

例えば、上のファイルを以下のようにフォルダを分離すればよいでしょう
```
config-
 |--en
 |--  |--conf.yml
 |--jp
 |--  |--conf.yml
```

こうみたいな分離仕方ができるように、フォルダ構成をもとづいて、configファイルを管理できるgemを作りました:
https://github.com/huydx/tree_config

gemの使い方はすごく簡単で、

```
gem install tree_config
```
してから

```rb
rails g tree_config:install
```
をしたら、config/settingsが生成される。
そのフォルダの中に、例えば

```
-config
  |-folder1
    -A.yml
    -B.yml
  |-folder2
    |-folder3
      -C.yml
```
のフォルダ構成を作成しておくと、Railsアプリの中で、グロバルSettings変数から

```rb
Settings.folder1.A
```
みたいにA.ymlの内容を参考できるよになる。
細かい使い方は、specのテストファイルに書いてありますので、参考して頂ければと思います。

そうやれば設定のファイルをフォルダで分離ができ、すごく簡潔に設定ファイルを管理できると思います。
[AWS 3]AWSの作業ログを採れ！AWS CloudTrailの設定だ！

2014/8/22現在でβサービスではありますが、AWS API の呼び出しを記録し、ログファイルを送信するウェブサービスがあります。
これを設定しておかない手はないでしょう。

AWS CLIが動作する環境だと思いますので、aws-cliで実施します。
AWS CLI設定：http://bit.ly/1pcLfYw

#1.ログ保存先S3バケット作成
ログの保存先を作成します。
command:
`$ aws s3 mb s3://バケット名`

result:
`make_bucket: s3://バケット名/`

#2.bucket policy設定
作成したバケットにポリシー設定します。
##jsonファイル作成
ローカルに設定するポリシーファイルを置きます。
今回は、マネージメントコンソールで作成する時にできるポリシーとします。

ファイル名:trail.json
```{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "AWSCloudTrailAclCheck20131101",
			"Effect": "Allow",
			"Principal": {
				"AWS": [
					"arn:aws:iam::903692715234:root",
					"arn:aws:iam::859597730677:root",
					"arn:aws:iam::814480443879:root",
					"arn:aws:iam::216624486486:root",
					"arn:aws:iam::086441151436:root",
					"arn:aws:iam::388731089494:root",
					"arn:aws:iam::284668455005:root",
					"arn:aws:iam::113285607260:root"
				]
			},
			"Action": "s3:GetBucketAcl",
			"Resource": "arn:aws:s3:::hn-trail"
		},
		{
			"Sid": "AWSCloudTrailWrite20131101",
			"Effect": "Allow",
			"Principal": {
				"AWS": [
					"arn:aws:iam::903692715234:root",
					"arn:aws:iam::859597730677:root",
					"arn:aws:iam::814480443879:root",
					"arn:aws:iam::216624486486:root",
					"arn:aws:iam::086441151436:root",
					"arn:aws:iam::388731089494:root",
					"arn:aws:iam::284668455005:root",
					"arn:aws:iam::113285607260:root"
				]
			},
			"Action": "s3:PutObject",
			"Resource": "arn:aws:s3:::hn-trail/AWSLogs/376390722258/*",
			"Condition": {
				"StringEquals": {
					"s3:x-amz-acl": "bucket-owner-full-control"
				}
			}
		}
	]
}
```

#3.バケットにポリシーを適用
command:
```$ aws s3api put-bucket-policy --bucket バケット名 --policy file://trail.json
```

result:
```{
    "IncludeGlobalServiceEvents": true,
    "Name": "Default",
    "S3BucketName": "バケット名"
}
```

#4.CloudTrailの設定
command:
```$ aws cloudtrail create-trail --name Default --s3-bucket-name バケット名
```
Trailの名前は、"Default"のようです。

result:
```{
    "IncludeGlobalServiceEvents": true,
    "Name": "Default",
    "S3BucketName": "hn-trail"
}
```

#5.設定確認
command:
```$ aws cloudtrail describe-trails
```

result:
```{
    "trailList": [
        {
            "IncludeGlobalServiceEvents": true,
            "Name": "Default",
            "S3BucketName": "バケット名"
        }
    ]
}
```

以上で終わりです。

S3を覗いてみましょう！
APIログが記録されているはずです！

--
20140822 initial
Git備忘録

ローカルリポジトリーとリモートリポジトリーがある。
ワーキングツリーとインデックスがある。

ローカルのmasterはワークツリーで作業してコミットしたものが
入るリポジトリー。oringin/masterはリモートリポジトリーと連動している
リポジトリ－。git fetchするとマスターだけが更新される。そしてmasterに
origin/masterをマージするとgit pullと同じになる。


```lang:ローカルリポジトリ作成
git init
```

```lang:ファイルをindexに追加する場合は
git add .
```

```lang:追加したファイルをローカルリポジトリーに登録する場合は
git commit -m "最初のファイル"
```

```lang:ログを見る
git log
```

```lang:元の状態に戻す
git reset　or git checkput -- file名
```

```lang:リモートリポジトリーにアップロード
git push
```

```lang:リモートリポジトリーからデータをコピー
git clone
```

```lang:リモートリポジトリーから最新情報をもらう
git pull
```

```lang:ローカルリポジトリーはそのままで、リモートリポジトリーを差分をゲット
git fetch
```

```lang:git管理下のファイルのファイルの削除や移動はgitコマンドで行なうように
git rm ファイル名　or git mv ファイル名元　ファイル名先
```

```lang:現在のgitの状態
git status
```

```lang:今までやってきたgitの履歴をみたい
git log
```

```lang:直前のコミットをなかったことにする
git reset --hard HEAD~
```

```lang:gitリモートの表示
git remote
```

```lang:gitリモートの一覧表示
git remote -v
```

```lang:gitリモートの登録
git remote add remote-name url
```

```lang:データをリモートリポジトリーへpush
git push -u origin master
```
【SwiftからXcodeを使う人対象】Cocoapodsのインストール


cocoapodsを2台のMacにインストールしたときに、両方ともスルッといかなかったので備忘録。

# cocoapodsのインストール手順
```
$ sudo gem install cocoapods
$ pod setup
```

これで下記エラーが発生。

```
$ zsh: command not found pod
```

rbenv関連のエラーかな、と思い、

```
$ rbenv rehash
```
をしてから再度挑戦。

```
$ pod setup
Users/kiiita/.rbenv/versions/2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/dependency.rb:298:in `to_specs': Could not find 'cocoapods' (>= 0) among 391 total gem(s) (Gem::LoadError)
```

つらい。。。
ので、再度cocoapodsをインストールし直す。

```
$ sudo gem uninstall cocoapods
$ sudo gem install cocoapods

CHANGELOG:

## 0.33.1

##### Bug Fixes

* Fix `pod spec lint` for `json` podspecs.
  [Fabio Pelosin][irrationalfab]
  [#2157](https://github.com/CocoaPods/CocoaPods/issues/2157)

* Fixed downloader issues related to `json` podspecs.
  [Fabio Pelosin][irrationalfab]
  [#2158](https://github.com/CocoaPods/CocoaPods/issues/2158)

* Fixed `--no-ansi` flag in help banners.
  [Fabio Pelosin][irrationalfab]
  [#34](https://github.com/CocoaPods/CLAide/issues/34)

Successfully installed cocoapods-0.33.1
Parsing documentation for cocoapods-0.33.1
Done installing documentation for cocoapods after 4 seconds
1 gem installed

$ pod setup

Setting up CocoaPods master repo
Setup completed (read-only access)
```

無事通りました。

このあと、作業しているxcodeディレクトリに移動して、Podfileを作成していきます。

```
$ cd /path/to/your/app
$ pod init / Podfileの作成
```

これで、Podfileが作成されました。
Podfileを開いてみると、下記のようになっています。

```
$ vim Podfile
```

```Podfile
# Uncomment this line to define a global platform for your project
# platform :ios, "6.0"

target "YourAppName" do

end

target "TinderLikeAppTests" do

end
```

あとは、installしたいファイルを記入して、インストールコマンドを打てばOK

```Podfile
# Uncomment this line to define a global platform for your project
# platform :ios, "6.0"

target "YourAppName" do
        pod "Hogehoge"
end

target "TinderLikeAppTests" do

end

```

```
$ pod install
```

すると、Podfile.lockなどが生成されます。
TortoiseSVNのtrunkとブランチをマージする

TortoiseSVNでtrunkとbranchをmergeします。

# 環境
trunk → 公開する環境
branch → 開発のみ環境

# branchを切る
右クリックから「TortoiseSVN > Branch/tag...」

![010.png](https://qiita-image-store.s3.amazonaws.com/0/47351/723225eb-e90a-440f-1f75-be1e9948721b.png)

**To path**: branches/[directory]

**Create copy in the repository from**: HEAD revision in the repository
にチェックで良いと思います。

![011.png](https://qiita-image-store.s3.amazonaws.com/0/47351/fb99a97a-0333-4b0b-daa7-524404e7252f.png)

これでbranch切れました。

# merge
branch→trunkにmergeしたいと思います。
（途中のURL変更変えれば、trunk→branchもやり方は同じ）

「TortoiseSVN > Switch...」でtrunkに切り替えておきます。
※すでに切り替えてあるのであればやらなくてOKです。

右クリックから「TortoiseSVN >Merge...」

![014.png](https://qiita-image-store.s3.amazonaws.com/0/47351/b5700f57-b24a-b4b1-fbaa-8b2e9108c267.png)

次へ

![017.png](https://qiita-image-store.s3.amazonaws.com/0/47351/33939dcf-2748-aa58-c64f-6f4326766911.png)

**URL to merge from**
[mergeしたいbranch]

**Revisiion range to merge**
all revisions
（全部mergeさせたいのでallで）

![018.png](https://qiita-image-store.s3.amazonaws.com/0/47351/700dc2a4-1fcb-1601-2888-3ff6a004d922.png)

Working copy
Compare whitespaces
のままでOKです。

![020.png](https://qiita-image-store.s3.amazonaws.com/0/47351/9b33e304-b6f5-b160-3771-91d5b7dbdee2.png)

Merge完了です。

![022.png](https://qiita-image-store.s3.amazonaws.com/0/47351/a6077f94-f6c3-62f7-b46c-9097921d10a8.png)

MeregeしたらCommitしておきましょう。

# Conflictが起きたら

Mergeをしたら競合が起きた！

![023.png](https://qiita-image-store.s3.amazonaws.com/0/47351/7efd930c-ca89-00e2-effa-90316c58f76c.png)

分かりにくいので、日本語を。

| 　 | 　 |
|:-----------|:------------|
| ローカルを優先する | リポジトリを優先する |
| 競合の編集        | [解決済みにする] |
| 後で解決する      | 全て後で解決する |

適宜、優先したいものを優先したりしてください。
競合の編集は、変更して保存したら押せるようになります。

![025.png](https://qiita-image-store.s3.amazonaws.com/0/47351/60ab4256-c789-63ff-a1f1-909706fde295.png)

これでMerge完了です。
UbuntuServerに、Mono環境を構築する


##インストール
Monoは容量が大きいためパッケージは、必要なものだけインストールできるように細分化されています。（たぶん）
ストレージ容量に余裕があって、個別にインストールするのが面倒なら開発環境か、全部インストールで、セットアップを行うのが楽です。ただし、インストールされるパッケージの数が多いので時間は掛かります。
実行環境の構築では、必要なパッケージのみをインストールした方が良いと思います。

###開発環境のインストール
https://launchpad.net/ubuntu/precise/+package/mono-devel
```bash
$sudo aptitude install mono-devel
```

###開発環境と全てのライブラリのインストール
https://launchpad.net/ubuntu/precise/+package/mono-complete
```bash
$sudo aptitude install mono-complete
```

###コンパイラのインストール
標準でインストールされるmono-cscコマンドでは、最新のC#の言語仕様で書かれたソースコードは、コンパイルできないようなので、mcsコマンドをインストールします。なお、過去コンパイラのバージョンごとに、コマンドが分かれていたが、今はどのコマンドでも内部的には同じ処理が呼ばれるようになったという情報を見たことがありますので気休めかも知れません。試しにバージョンをチェックしてみると同じバージョンが表示されるようです。
```bash
$sudo aptitude install mono-mcs
$mcs --version
Mono C# compiler version 2.10.8.1
```

##開発
###コンパイル
デフォルトのターゲットは、exeになりますので、単純にソースコードをコンパイルすると拡張子が、exeのファイルが出来上がります。初めて見た時にはギョッとしますが、言語仕様的に正常な動作です。複数のファイルをコンパイルする際には、Makefileを利用すると便利です。
```bash
$mcs HelloWorld.cs
```
###実行
```bash
$mono HelloWorld.exe
```

##デバック
###行番号をもったスタックトレースを表示させる。
```bash
$mono --debug HelloWorld.exe
```
###デバックログを出力させる。
monoが出力するログレベルを調整して問題を調査するのに利用します。
http://www.mono-project.com/docs/debug+profile/debug/
http://www.mono-project.com/docs/advanced/runtime/logging-runtime-events/
```bash
$export MONO_OPTIONS=--trace=E:all
$export MONO_LOG_MASK=all
$export MONO_LOG_LEVEL=debug
```
AndroidStudio から USB でつないだすべてのデバイスに一発でアプリをインストールしたい

デバイスの選択ダイアログのデバイス一覧、実は複数選択できるので、インストールしたいデバイスすべてを選択すれば、自動で順番に選択したすべてのデバイスにインストールしてくれます。

順番にやるので、デバイスごとにインストールされるタイミングにはラグがあります。

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/31829/e47179d0-b69c-e5cf-781a-3702b79c2470.png)
電話API? Twilio? PHPから電話の発信ができちゃいます！！

<h2>電話API? Twilio?</h2>
ご存知の方も多いかと思いますが、Twilioとは、クラウド型電話&SMS APIですね？
電話とウェブはもちろん、アプリケーション、様々なシステムなどからすんごく簡単に繋ぎます。
詳細はこちら。
http://twilio.kddi-web.com

Twilioは様々なプログラミング言語のライブラリを提供していて、PHPやRuby、JAVA、.NET、perlなどなど！のプログラミング言語から電話をかけることができる面白いAPIです。

今回はPHPを使って電話をかけてみます！

<h2>準備</h2>
① Twilioアカウント
まずは無料アカウントからTwilioの楽しみ、魅力を感じてみてください。
https://jp.twilio.com/try-twilio/kddi-web
※ 新規登録から取得したアカウントにはTwilioを体験できるポイントが設定されていて、無料でご利用可能です。

② ウェブサーバー
Twilioは基本、HTTPで通信を行い、TwiMLと呼ばれるXML形式のフィアルに命令を書きます。
その、TwiMLをウェブサーバーに格納しておけば、Twilioがそのファイルを参照し、Twilioを動かすことになります。

③ TwilioのPHPヘルパーライブラリ
ここからダウンロードできます。
https://jp.twilio.com/docs/php/install

他の言語のライブラリもありますよ。
https://jp.twilio.com/docs/libraries

この三つを用意すればPHPから電話をかける準備はオッケーです！
（開発に必要なものは各自準備してください！）

<h2>早速コードを書いてみます。</h2>
まず、ライブラリについては上記でダウンロードしたPHPライブラリのフォルダーの中に「Services」というフォルダーがあります。Servicesのみで構いませんので、参照先に配置してください。
※ ちなみにこのPHPファイル（発信を行うスクリプト）はウェブに公開されていなくてもオッケーです。

下記のソースコードを用意して、$sid 〜 $twiml までにみなさんの情報を入力します。
<h4>$sidと$token</h4> Twilioのダッシュボードにログインするとトップ画面で確認可能です。
この二つのキーでアカウントを識別します。

<h4>$tel_to</h4>
発信先番号を記入します。記入方法は国際電話番号形式にしてください。
(080xxxxxxxx → +8180xxxxyyyy）のように！
※ トライアルアカウントの場合、新規登録の際に認証を行った電話番号にしか発信ができませんので、
　認証済みの電話番号を入力してくださいませ〜！

<h4>$tel_from</h4>
発信元電話番号を記入します。ここにはTwilioの050番号を設定します。
電話番号の確認、ダッシュボード → 電話番号から確認可能です。
※ 無料の新規登録で、1つの電話番号を取得可能です！

<h4>$twiml</h4>
上で簡単に説明しました！Twilioを動かす命令語が書いてあるファイルのパスを設定します。
※ このファイルはウェブ上（グロバール）に公開されている必要があります。
なお、このファイルのセキュリティーの面に関しては「ダイジェストとベーシック」を使った参照も可能になっていますので、ご安心ください。

```php:twilio_call.php
<?php
    require("Services/Twilio.php"); // PHPライブラリ
 
    $sid = "ACxxxxxxxxxxxxxxxx"; // Account Sid
    $token = "yyyyyyyyyyyyyyyy"; // Auth Token
    $tel_to = "+8180xxxxyyyy";   // 発信先電話番号
    $tel_from = "+8150xxxxyyyy"; // 発信元電話番号
    $twiml = "http://xxx.xxx.xxx.xxx/twilio/calling.xml"; // TwiML URL
 
    $client = new Services_Twilio($sid, $token);
    $call = $client->account->calls->create($tel_from, $tel_to, $twiml);
?>
```

ここまで準備ができたら、次はTwiMLを書きましょう。
※ このファイルはウェブ上（グロバール）に公開されていてTwilioが参照可能な状態になっている必要があります。

```xml:calling.xml
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Say language="ja-jp">Twilioへようこそ。</Say>
</Response>
```

さてさて、実行してみましょう！

`php twilio_call.php`

これを実行すると"$tel_to"の電話番号に電話がかかってきて、"calling.xml"に書いてあるメッセー
"Twilioへようこそ" が電話のメッセージとして再生されるようになります。

以上！PHPから電話を発信でした！
とっても簡単で、無料から始められますので、是非お試しください！
Project Eulerをhaskellで練習していく日記: Problem 18

#問題
下のように三角にならんだ数を、上から下に上下隣接しているものを通って和を計算することを考える。
![sample.png](https://qiita-image-store.s3.amazonaws.com/0/50542/272191f1-2da0-82a6-f0e4-53f296b55ffa.png)
そうすると、この例では、最大の和は赤い数字をたどる、3 + 7 + 4 + 9 = 23　である。
同様に、以下の三角で最大の和を求めよ。
![mondai.png](https://qiita-image-store.s3.amazonaws.com/0/50542/96e76e81-3357-02bf-b8dc-67876275033b.png)
注意）総当たり（16384通り）で計算してもよいが、問題６７ではこれの１００行バージョンになります。そうなるともう総当たりでは無理なので、できれば別の策を考えること。
#回答
総当たりするなとの注意なので、以下のように計算することにする。
最底辺から逆に和を計算していく。例えば、一番左下では
　63
04　62
であるが、ここの三角では、63+62>63+4なので、63+62=125を残す。
その右の三角
　66
62　98
では、同様に66+98=164を残す。
こうすることで、最底辺を１行削ることができ、最大の和の候補が新しい最底辺に並ぶ。
これを繰り返すことで、最終的に１行になったときに最大の和が求まっている。

```hs
--三角形のデータを読む関数
--読み込ませるファイルには、以下のように数をテキストで書いておきます。
-- 75
-- 95 64
-- 17 47 82
-- 18 35 87 10
readnumfile :: IO[[Int]]
readnumfile = do
            cont <- getContents
            return $ map ((map read).words) $ lines cont

-- 底辺をと一つ上の底辺を足して大きい和の数字を一つ短い底辺として残す計算
addpath c p = [max (x+y) (x+z)| (x,(y,z)) <-zip p $ zip c (tail c)]


-- 最底辺を一つ上の底辺に足しながら短くしていく関数
shorten (c:[]) = c
shorten (c:p:cs) = shorten ((addpath c p):cs)

main = do 
     c <- readnumfile
     print $ shorten $ reverse c  --三角形を逆にして底辺からshortenに渡します。
```
#感想
総当たりではない方法を考えるのに少し時間がかかりました。
これで件の問題６７とやらは計算できるだろうか。。。
※　[問題１７](https://projecteuler.net/problem=17)は興味をそそらなかったのでスキップしました。
simple_form と bootstrap-datepicker-rails を一緒に使う

こんなやつです。Bootstrap 2 系での話ですが、3 系でも大体同じ感じでできるんじゃないでしょうか。Font Awesome も 3 系です。

![Screen Shot 2014-08-22 at 16.44.16.png](https://qiita-image-store.s3.amazonaws.com/0/3732/82ad6932-c4d6-21d8-39e9-3043701a4639.png)

まず [bootstrap-datepicker-rails の README](https://github.com/Nerian/bootstrap-datepicker-rails) を読みながら assets を追加します。言語ファイルは使うやつだけ読んだ方がいいでしょう。

そしてフィールドを追加。simple_form の append wrapper を使って、カレンダーアイコンをつけます。クラス名は datepicker でなくても良いですが、JS で使うのと一緒にしましょう。

```haml
= simple_form_for @model, html: { class: 'form-horizontal' } do |f|
  = f.input name, wrapper: :append do
    = f.input_field name, as: :string, class: 'datepicker'
    %span.add-on
      %i.icon-calendar
```

何個も使うなら helper にしても便利です。

```app/helpers/application_helper.rb
def datepicker(form, name)
  form.input name, wrapper: :append do
    form.input_field(name, as: :string, class: 'datepicker') +
    content_tag('span', class: 'add-on') do
      content_tag 'i', '', class: 'icon-calendar'
    end
  end
end
```

次は JS です。普通にやるとカレンダーアイコンをクリックした時に datepicker が出てこないので、親に date というクラスをつけて、親に datepicker を適用します。date というクラス名は Bootstrap Datepicker の仕様なので、変えられないようです。なお、日付のフォーマットは好みです。

```app/assets/bootstrap.js.coffee
$.fn.datepicker.dates.ja.format = 'yyyy-mm-dd'
$('.datepicker')
  .parent('.input-append')
  .addClass('date')
  .datepicker
    language: 'ja'
```
HibernateでEntityに関係ないアクセサを定義したい

HibernateのEntityにフィールドで宣言していないプロパティのgetter、setterを定義すると、
起動時にプロパティが見つからないと言われて、エラーが発生する。

```java
private String skills;

// setterは省略
@Column(name="skills")
public String getSkills() {
    return skills;
}

public int getRowCount() { // これに該当するプロパティが宣言されていないので、エラー。
    return rowCount;
}
```

## 解決策1：@Transientを使用する。
使用したいアクセサに@Transientをつける。

```java
private String skills;

// setterは省略
@Column(name="skills")
public String getSkills() {
    return skills;
}

@Transient
public int getRowCount() { // これに該当するプロパティが宣言されていない。
    return rowCount;
}
```

## 解決策2：getter、setterのメソッド名をやめる。
要するにis〜とか、get〜、set〜とかのメソッド名をやめれば一応動く。

```java
private String skills;

// setterは省略
@Column(name="skills")
public String getSkills() {
    return skills;
}

public int takeRowCount() { // get → takeに変える。（意味的には変わらない）
    return rowCount;
}
```

まぁ、でも自分だったら@Transientを使うかな。

参考URL
http://stackoverflow.com/questions/6107387/is-it-possible-to-ignore-some-field-when-mapping-in-annotation-entity-class
http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/
Laravel マイグレーションで View（CREATE VIEW）を作る


`Schema` クラスは対応していないので、`DB::statement()` で、SQL を流す。

以下、PostgreSQL の例。

```php
<?php

use Illuminate\Database\Migrations\Migration;

class CreateHoge extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        $sql = <<<EOT
CREATE VIEW hoge AS
SELECT column1,column2
FROM foo
EOT;

        DB::statement($sql);
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        DB::statement('DROP VIEW hoge');
    }
}
```
Debian Wheezy でEclipse4.4 Lunaの起動に失敗するときの対処方法

Debian WheezyでEclipse4.4Lunaを入れてみたが、どうも起動の際に不具合があるらしい。

eclipse.iniのopenFileのすぐ下に

--launcher.GTK_version
2

を書き加える。

【参考】
http://stackoverflow.com/questions/24872995/why-does-my-eclipse-luna-4-4-crash-on-debian-wheezy-7-4-with-oracle-jdk8-64bit
JIRAのワークフローでTransitionに条件をいろいろ追加する

##Transitionて？
JIRAのワークフローは、IssueのStatusと、その間のTransitionの組み合わせでできている。TransitionはStatusとStatusの間の移動のこと。Statusが切り替わる際に、いろいろな条件やアクションを設定することができる。
![Screenshot 2014-08-22 16.20.57.png](https://qiita-image-store.s3.amazonaws.com/0/46482/fb33b7b6-6d8b-c68c-33a3-bcc68e78c9fe.png "Screenshot 2014-08-22 16.20.57.png")

## Transitionを編集する
Transitionはワークフローの編集画面でAdd Transitionか、Statusにマウスオーバーすると表示されるコネクタからドラッグで簡単に作成できる。作成したTransitionをクリックして選択すると、Transitionの詳細パネルが出てくるのでそこから編集する。
![Screenshot 2014-08-22 16.22.06.png](https://qiita-image-store.s3.amazonaws.com/0/46482/a97e9840-773c-a8a7-dbf7-b7121c2d1959.png "Screenshot 2014-08-22 16.22.06.png")

Properties、Triggers、Conditions、Validators、Post Functionsとあるが、まずはシンプルなところでValidatorとPost Functionsを設定した。それぞれValidatorはTransitionが起きる際に、チェックするCriteriaを設定できる（例：Resolutionが編集されていること）のと、Post FunctionsはTransitionの後に起こすアクション。

例えばValidatorであれば、Field has been modified Validator で、「Resolve」というTransitionが起きた際には、「Resolution」fieldがアップデートされているというCriteriaが満たされているか監査する。

![Screenshot 2014-08-22 16.25.52.png](https://qiita-image-store.s3.amazonaws.com/0/46482/515fce8b-6e6f-0b9f-0f6e-7be9b0b355a9.png "Screenshot 2014-08-22 16.25.52.png")

Post Functionsはもっといろいろ選択できる。とりあえず「Resolve」に関して設定したのは以下の2つ。
- Assign the issue to the reporter: Reporterにアサインバックして、Resolutionを確認してもらう（直ってなかったらReopen）
- A notification will be sent to the following HIpChat rooms: ResolveされたらHipChatのルームに飛ばす

## 雑感
- とりあえず「Assign to reporter」と「Notification to HipChat」は簡単にできるし便利
- わりと多彩なことができるはずなんだが、Validatorで設定できる内容がまだ微妙で、例えば「Resolveする際には必ずResolutionがアップデートされていること」がちゃんと動かなかったりする。
- PropertyとかTriggerは外部連携でもっといろいろ使えそうなんだが、今のところまだ手が出てない
- この部分をわかりやすく解説したドキュメントが少ない・・・

おまけ
美しいBug山。テスターさんが優秀で斜度がハンパないです・・・
![Screenshot 2014-08-22 16.36.22.png](https://qiita-image-store.s3.amazonaws.com/0/46482/985f62be-52b8-8745-c950-c947b1320d2c.png "Screenshot 2014-08-22 16.36.22.png")
ASP.NET MVC5でDIはじめるガイド

# はじめに

ASP.NETでDIを使いはじめたいと思っている人向けのガイドです。
リクエスト毎に生成と破棄をしたいリソース(DbContext等)を自動的に管理することを目標としています。

DIコンテナはMSの[Unity](https://unity.codeplex.com/) を使用します。

# パッケージのインストール

ASP.NET MVC5プロジェクトに、Unityのパッケージをインストールします。

- [Unity bootstrapper for ASP.NET MVC](https://www.nuget.org/packages/Unity.Mvc/) 今のバージョンは 3.5.1404

プロジェクトの`App_Start`以下に`UnityConfig.cs`と`UnityMvcActivator.cs`が生成されます。

# 管理対象の登録

リクエスト毎に生成と破棄を自動的にやってもらいたいものをUnityに登録します。

`UnityConfig.cs`を開き、`RegisterTypes`メソッドの中に次のように記述します。

```csharp
container.RegisterType<MyDbContext>(new PerRequestLifetimeManager(), new InjectionFactory(c => new MyDBContext()/*ここで生成処理*/));
```

最初の引数として new PerRequestLifetimeManger() を渡しているのがキモです。
これがリクエスト毎に生成と破棄を行ってくれます。
InjectionFactoryは生成時の処理を自由に記述するためのファクトリです。単にnewするだけでよいのであれば、

```csharp
container.RegisterType<MyDbContext>(new PerRequestLifetimeManager()));
```
と書けばOKです。

# HttpModuleの登録

`UnityMvcActivator.cs`を開き、コメントアウトされている行を有効にします。

```csharp
Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule));
```

# 使う！

ControllerやViewの生成はもうUnityの管理下です！Controllerのコンストラクタの引数としてMyDbContextをとるようにすれば、そこにUnityで生成されたインスタンスが自動的に渡ってきます。リクエスト終了時にはDispose()がちゃんと呼ばれます！
Project Eulerをhaskellで練習していく日記: Problem 16

#問題
2^1000を１０進数で書いた時、各桁の数の和は何か？
#回答
```haskell
main = do print $ sum $ map (read . (:"")) $ show (2^1000)
```
#感想
１行で終わるので、何かずるをしているのではないかと逆に不安。。。
Project Eulerをhaskellで練習していく日記: Problem 15

#問題
2x2のグリッド上を、左上からスタートし、右と下への移動のみで、右下に至るルートは以下のように６通りである。
![p015.gif](https://qiita-image-store.s3.amazonaws.com/0/50542/a2672333-45ef-40e3-faa5-936beb9cd239.gif)
同様に、20x20の場合のルートの個数を求めよ。
#回答
```hs
fact :: Integer -> Integer
fact 0 = 1
fact n = n*fact (n-1)

path n m = (fact (n+m)) `div` (fact n) `div` (fact m)

main = do print $ path 20 20
```
#感想
最初はまともにビジュアル的に考えて以下の再帰で書いてみた。

```haskell
path n m
 | n==m = 2*(path (n-1) m)
 | n>m = path m n
 | n == 1 = m+1
 | otherwise = (path (n-1) m) + (path n (m-1))
```
しかし、これは20x20では待ちきれないほどに処理時間がかかったので、階乗で場合の数を計算して求めることにしました。
RubyでオレオレCLIツールを作って大人しめに公開する


## 環境

* MacOS
* Ruby 2.0.0p481
* RubyGems 2.4.1
* Bundler version 1.6.5


## RubyでCLIツールを作りたい！

Rubyで簡単なスクリプトを書いてちょこちょこ使っていたのですが、
毎回そのディレクトリに移動して「ruby script.rb」とかやるのが面倒でした。

色々試行錯誤しながら、こんな書き方をしてみたり。。。

```ruby:cli.rb
eval "Tools::Cli.#{ARGV[0]}"
```

```bash
ruby cli.rb hello
```

みたいなね。。。結局rubyコマンド叩いてるからあんま意味無いですね。


結局Google先生に聞いてみたところ、参考になりそうな記事が見つかったので、それを参考にやってみました。



## 作り方

そもそもbundlerにgemを作るためのコマンドが存在していたようです。
それを実行することでツールのひな形を作成することができます。


```bash
bundle gem oreore -b
tree
.
└── oreore
    ├── Gemfile
    ├── LICENSE.txt
    ├── README.md
    ├── Rakefile
    ├── bin
    │   └── oreore
    ├── lib
    │   ├── oreore
    │   │   └── version.rb
    │   └── oreore.rb
    └── oreore.gemspec

4 directories, 8 files
```

まずは、.gemspecファイルを編集します。
パラメータの解析用にThorを使うよう記述していますが、今回は特に使いません。

```ruby:oreore.gemspec
Gem::Specification.new do |spec|
  spec.name          = "oreore"
  spec.version       = Oreore::VERSION
  spec.authors       = ["Jacoyutorius"]
  spec.email         = ["jacoyutorius@oreore.jp"]
  spec.summary       = %q{TODO: Write a short summary. Required.}
  spec.description   = %q{TODO: Write a longer description. Optional.}

	~(省略)~

  spec.add_dependency "thor"
end
```

summaryやdescriptionにある"TODO"の文字列が残っていると、後にgem installする際にエラーになります。
やる気があるうちにしっかり書いておいたほうが良さげです。

Rebuild.fmでも[Readme driven development](http://rebuild.fm/52/)の話題が出てましたしね。


次に実際のコード部分。
lib/oreore以下に実際のコマンドを実装するcli.rbを作成します。

```ruby:lib/oreore/cli.rb
require "oreore"
require "thor"

module Oreore
  class CLI < Thor 
    desc "hello", "say 'hello world!'."
	def hello
	  puts "Hello World!"
	end
  end
end
```

lib以下のoreore.rbにcli.rbをrequireします。

```ruby:lib/oreore.rb
require "oreore/version"
require "oreore/cli"

module Oreore
  # Your code goes here...
end
```


```ruby:bin/oreore
#!/usr/bin/env ruby
require 'oreore'

Oreore::CLI.start
```

では実行してみます。

```bash
bundle install

chmod 777 bin/oreore
bundle exec bin/oreore hello
=> Hello World!
```

自分の環境では、「bundler: not executable: bin/oreore」というエラーが出たのでパーミッションを変更しています。

あとはgitにコミットすればOKですね。

```bash
git commit -am "initial commit"
git remote add origin git@github.com:jacoyutorius/oreore-cli-tool.git
git push -u origin master
```

ここで作ったコードは

[https://github.com/jacoyutorius/oreore-cli-tool](https://github.com/jacoyutorius/oreore-cli-tool)

にあります。


## 大人しめに公開する（Rubygems.org無視）

gitにコミットしたgemは、Gemfileを作ってbundle installすればいいのですが、これだとGemfileの居るディレクトリでしかツールを使用できません。

Rubygemsに登録すれば良いのですが、オレオレツールを世界規模で公開するのは気が引けます。
社内向けにしか公開したくない場合もありますしね。



そこで、specific_installというgemを使って、gitにあるオレオレcliをグローバルな場所（rbenvを使っていれば~/.rbenv/shims）にインストールします。
こうすることで、どこにいてもオレオレcliのコマンドが実行できます。

```bash
gem install specific_install
gem specific_install -l "git@github.com:jacoyutorius/oreore-cli-tool.git"

oreore hello
=> Hello World!
```

.gemspecをきちんと記述しないとWARNINGがたくさん出てしまいますが、ここはオレオレツールってことで気にしないでおきますね。。。



## 参考
以上、ドヤ顔で説明しましたが、ほとんど以下のQiita記事を参考にしてます。
大変参考になりました。

* [Ruby で作る、簡単 CLI ツールのススメ](http://qiita.com/rosylilly/items/d7f9667f3998cfc420d1)

* [gem installでGitHubリポジトリにある最新版をインストールする](http://qiita.com/yuku_t/items/5ab4fbe404b718999a35)
イラストレータで作った画像をスクリプト一発で Android や iOS 用に出力する最高に便利な方法

アプリ用の画像パーツを作ると、どうしても面倒くさいのが、各 dpi 向けに画像を出力する作業です。
初めて作る人にとっては、mdpi を基準として、hdpi は 2 倍、xhdpi が 3 倍…と計算していたら日が暮れた、なんてことも。

そんな時、スクリプト一発で mdpi ~ xxhdpi までのアセットを自動出力してくれるものがあったら…

https://github.com/austynmahoney/mobile-export-scripts-illustrator

Illustrator 向けですが、JavaScript で書かれたスクリプトが GitHub に落ちているではありませんか！！

## How to use

とても簡単。Illustrator のメニューから、`ファイル` > `スクリプト` > `その他のスクリプト` で、このリポジトリのスクリプトを選択します。そうすると、出力先のディレクトリを選択するよう促されるので、出力したいディレクトリを選択します。

つぎに、Android / iOS それぞれに必要なリソースの種類を選択する画面が表示されます。必要なものすべてにチェックをつけて、OK で出力が完了します。

楽しい！！✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌
便利！！✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌
GSN概説 - Part1 （名古屋大学　山本修一郎先生による）


この文章は、[youTube ビデオ: GSN概説 - Part1 （名古屋大学　山本修一郎先生）](http://www.youtube.com/watch?v=YYRVvy2TZHU)の中身です。

# GSNと説明責任

これからお話するのは説明責任(Accountabiity)とGSN(Goal Structuring Notation)との関係についてです。

## 説明責任とは

説明責任って、みなさん何かご存知でしょうか？

>システムや活動、プロセスといったものがある基準や原則に基づいていることを第三者に説明する


というのが説明責任の遂行という考え方です。

![kobito.1408688936.653221.png](https://qiita-image-store.s3.amazonaws.com/0/51055/2da07731-912f-a650-fc69-a5848d613b7f.png "kobito.1408688936.653221.png")


ということは、ある「システム」がある「原則」にしたがって開発されているということを「説明する手段」が必要で、その１つがGSNということです。

## GSN による説明

GSNが説明するのは、「システムが原則に従っていること」であり、そのためにGSNでは4つの要素（ノード）が用意されています。

![GSN-4-nodes-small.jpg](https://qiita-image-store.s3.amazonaws.com/0/51055/7db86bb1-18fc-0838-c55b-3ff849019bb0.jpeg "GSNの4つの要素")

1. **主張ノード**
上記例では「システムが原則に従っていること」がトップの主張となる。
1. **戦略ノード**
主張を直接説明するのが難しいので、さらに細かな主張に分解する必要が出てきます。その時に使われるのが、戦略ノードとよばれる分解するノード。
1. **前提ノード**
どのような前提条件に基づいてこの議論が展開されるのかを示すための前提ノード。
1. **証拠ノード**
確かにシステムがこの原則に従っているということを説明するための（分解された）最も単純な主張を説明する証拠。

このように、GSNではこの4つの基本的な構成要素を使って、主張を説明することができます。これがGSNを使って説明責任を遂行する方法です。

# 解説ビデオ

この文章は、[youTube ビデオ: GSN概説 - Part1 （名古屋大学　山本修一郎先生）](http://www.youtube.com/watch?v=YYRVvy2TZHU) の中身です。ぜひビデオをごらんください。
Project Eulerをhaskellで練習していく日記: Problem 14

#問題
与えられた自然数の初期値を以下のルールで1になるまで変換していくとする。
nが偶数の場合　→　n/2
nが奇数の場合　→　3*n+1
例えば、初期値13から始めると、
13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
となって、この列は長さ10で1に到達する。
まだ証明されていないが、全ての自然数はこの変換で最終的には1に到達すると予想されている。（「Collatz問題」と呼ばれている）
1000000以下の初期値のうち、この変換列が最も長い初期値を求めよ。
（ただし、初期値を1000000以下で初めて途中で1000000を超えることは許容する。）
#回答
```hs
import qualified List as L
ubound = 1000000

collatz x
   | x == 1 = 1
   | even x = 1+collatz (x `div` 2)
   | otherwise = 1+collatz (3*x+1)

main = do
     print $ head $ L.sort $ zip (map (negate.collatz) z) z
           where z = [y|y<-[1..ubound], 
                          not (even y && y<=half), -- 判定の必要がない部分はスキップ
                          not (even y && ((y `div` 2) -2) `mod` 3==0)]
                 half = ubound `div` 2
```
#感想
手元のＰＣで１４秒ほどの処理時間がかかりました。
地道に計算をして長さを求めています。
せめてもの努力としては、判定の必要が無いことが保障されている初期値をスキップしていることぐらいです。
なんかもっと良い計算方法がきっとありそうだ。
【CakePHP】コントローラからビューに値を渡す

コントローラーで以下のようにすることで、ビューに値を渡すことができる。

```php:set(変数名,値)の例
$this->set('price',$price);
$this->set('titel',$title);
```

以下のように配列で一気にセットすることもできる。
下記は、上と同じ結果になる。

```php:set(array(変数名=>値))の例
$this->set(
  [
    'price'=>$price,
    'titel'=>$title
  ]
)
```

さらに、compact()を使うと簡潔に記述できる。

```php:set()とcompact()を組み合わせた例
$price = 500;
$title = 'hoge';

$this->set(compact('price','title'));
```
[Ruby] XMPP のグループチャットにテキストファイルの内容を投稿する

定期的に XMPP で特定のメッセージを特定のグループチャットに送信する必要があったので作成。<del>これでさぼっていても仕事をしているように見せかけることが</del>

### 仕様
* とあるディレクトリにあるテキストファイルの内容を、とあるグループチャットに投稿する

```ruby:xmpp_bot.rb
require 'xmpp4r'
require 'xmpp4r/muc'

# メッセージが書いてあるテキスト置き場
text_file = '/ika/geso.txt'

# xmpp ログイン情報
jid = 'ika'
password = 'geso'

# グループチャット名など
bot_name = 'ika_bot'
group_chat_room_name = 'ika@conference.geso'

# xmpp サーバにログインする
def xmpp_login(jid, password)
    client = Jabber::Client.new(Jabber::JID.new(jid))
    client.connect
    client.auth(password)
    return client
end

# グループチャット部屋に入る
def group_chat_login(client, group_chat_room_name, bot_name)
    muc = Jabber::MUC::MUCClient.new(client)
    muc.join("#{group_chat_room_name}/#{bot_name}")
    return muc
end

# グループチャット部屋にメッセージを送信する
def send_group_chat_message(group_chat, group_chat_room_name, message_string)
    message = Jabber::Message.new(group_chat_room_name, message_string)
    group_chat.send(message)
end

# メイン処理
message_string = File.read(text_file, encoding: 'utf-8')
client = xmpp_login(jid, password)
group_chat = group_chat_login(client, group_chat_room_name, bot_name)
message_string = File.read(text_file, encoding: 'utf-8')
send_group_chat_message(group_chat, group_chat_room_name, message_string)

# 後始末
group_chat.exit
client.close

```
GitHubのWikiをローカルで参照する方法

## ことはじめ
「そうだ！Androidの勉強をしよう！Androidの勉強といえばmixiがGitHubでテキスト？を公開してたな。」

………

「うう…勉強しようにも移動中にPCは開けても通信回線がないからWikiが見れないよう……」

そんな貧乏臭い発想が発端です。

## 1.Wikiに上がっているファイルをチェックアウトする。
GitHubではWikiもGitで管理されているので、普通にgit cloneできるようです。
やり方はプロジェクト名の最後を.wikiにするだけ。
例）
`git clone https://github.com/mixi-inc/AndroidTraining.wiki`

## 2.Wikiで使用されているリソース（画像系のファイル）をチェックアウトする。（もしあれば）
Wikiで画像など使われている場合はそれもローカルで表示するためにチェックアウトしておきます。

例）
mixiはリソースファイルもGitHubにあげてくれているのでこれをチェックアウトします。これは本体のリポジトリの方にあがっているので、普通にリポジトリをチェックアウトします。
`git clone https://github.com/mixi-inc/AndroidTraining.git`

## 3.チェックアウトしたWikiの参照パスを書き換える。
前の手順で画像をチェックアウトした場合は、Markdownに記載されている画像への参照パスをチェックアウトした先へ修正しておきます。
（もしかしたらちゃんとブランチ切って参照パスを書き換えたほうがいいかもね！）
例）
mixiの場合は以下みたいな感じのURLが一杯記載されてるはずなので、相対パスに書き換えちゃいます。
`https://raw.github.com/mixi-inc/AndroidTraining/master/docs/resources/images/01-01/system-architecture.jpg`
↓
`../AndroidTraining/docs/resources/images/01-01/system-architecture.jpg`

## 4.ビューアでMarkdownファイルを参照して完成！
最後にチェックアウトしたMarkdownファイルをMarkdownエディタやらビューアで閲覧すれば良いだけです。
今回は完全に閲覧したいだけなので、私はChromeに以下の拡張を入れて閲覧してます。
相対パスの画像ファイルもちゃんと表示してくれるのが素敵
[Markdown Preview Plus](https://chrome.google.com/webstore/detail/markdown-preview-plus/febilkbfcbhebfnokafefeacimjdckgl)

以上です。
こんなのmixiのあのテキスト？以外になんの役に立つのかわからないけど、Markdown Preview Plusの使い勝手が良かったので宣伝したくて書きました。
ActiveRecord::PendingMigrationError

rspecコマンドを実行したところ以下のようなエラーが出ました。

```
`check_pending!': Migrations are pending; run 'bin/rake db:migrate RAILS_ENV=test' to resolve this issue. (ActiveRecord::PendingMigrationError)
```

「途中段階のものがあるからチェックして」というエラーのようです。指定通りにコマンドを実行

```
$ rake db:migrate RAILS_ENV=test
```

（RAILS_ENVは、テストや本番のデータベースに対して処理を行いたいときに使うオプッション）このコマンドを実行すると、rspecは通りました。ですが、このままではテストデータベースに対してですので、

```
$ rake db:migrate RAILS_ENV=development
```

として、デフォルトの開発環境に戻しておきます。



それにしても、$rake db:migrate を実行していたのに、なぜこんなエラーが出たのでしょうね。
ubuntu + gnome + vncserverでのGUI環境


## 背景
毎回`vncserver`経由でGUIアクセスするときに手間取って色々なパッケージをインストールしてしまうのでメモしておく。

以下環境情報。

* ubuntu: 12.04

## Desktop環境のインストール
以下のコマンドで`gnome-core`をインストールする。

```cmd:install_gnome
$ sudo apt-get update
$ sudo apt-get install gnome-core
```

`gdm`を起動してやる。

```cmd:start_gdm
$ sudo service gdm status
gdm stop/waiting
$ sudo service gdm start
gdm start/running, process 28703
$
```

インストール中に`display manager`の選択画面が表示されるので、`gdm`を選択する。

```cmd:install_ubuntu_desktop
$ sudo apt-get install ubuntu-desktop
```

![ubuntu-desktop-1.png](https://qiita-image-store.s3.amazonaws.com/0/46472/e228a26f-4801-217e-90ca-155c10573177.png "ubuntu-desktop-1.png")

![ubuntu-desktop-2.png](https://qiita-image-store.s3.amazonaws.com/0/46472/4acafc9c-655b-b7d7-afc5-80f9b3a06559.png "ubuntu-desktop-2.png")


## vncserverのインストール、設定
まずは以下のコマンドでvncserverをインストールする。

```cmd:install_vnc4server
$ sudo apt-get install vnc4server
```

いったん起動して各種設定ファイルを作成する。

```cmd:start_vncserver
$ vncserver :1

You will require a password to access your desktops.

Password:
Verify:
xauth:  file /${HOME}/.Xauthority does not exist

New '$(hostname):1 (root)' desktop is $(hostname):1

Creating default startup script /${HOME}/.vnc/xstartup
Starting applications specified in /${HOME}/.vnc/xstartup
Log file is /${HOME}/.vnc/$(hostname):1.log

$
```

`Password`は8文字以内で記入する必要があり、9文字以降は切り捨てされて登録される。
上記コマンドで`~/.vnc/xstartup`が作成される。

とりあえず`vncserver`を停止する。

```cmd:kill_vncserver
$ vncserver -kill :1
```

作成された`~/.vnc/xstartup`を以下のように編集する。

```file:~/.vnc/xstartup
#!/bin/sh

# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
# exec /etc/X11/xinit/xinitrc

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
#x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#x-window-manager &
exec gnome-session &
```

再度`vncserver`を起動。

```cmd:start_vncserver
$ vncserver :1
```
`:1`は画面番号を表し、デフォルトだと`port:5901`を表す。

## 接続してみる
いちいち`port`を開けるのは面倒なので`ssh tunnel`でアクセスする。
以下のコマンドで張れる。

```cmd:ssh_tunnel
$ ssh -fNL 3456:localhost:5901 ${user}@${ip_addr} -p ${port}
```

上記を設定することで、`localhost:3456`で`vncserver`にアクセスすることができる。

MACを使っている人は、トップバーの `移動 > サーバへ接続`で`サーバへ接続`画面が表示され、`サーバアドレス`に`vnc://localhost:3456`を指定してやるとアクセスできるはず。

![スクリーンショット 2014-08-22 13.52.48.png](https://qiita-image-store.s3.amazonaws.com/0/46472/c5987503-87ac-570b-8bea-ef5a77a3a3ff.png "スクリーンショット 2014-08-22 13.52.48.png")

先ほど入力したパスワードを指定。

![スクリーンショット 2014-08-22 13.52.53.png](https://qiita-image-store.s3.amazonaws.com/0/46472/0961e9a3-aa67-39a4-145f-8f8a130c39cb.png "スクリーンショット 2014-08-22 13.52.53.png")

すると・・・`ubuntu-desktop`が表示される！・・・はず。
![スクリーンショット 2014-08-22 14.16.19.png](https://qiita-image-store.s3.amazonaws.com/0/46472/413ec246-3df8-8e52-d6d7-f3293909e514.png "スクリーンショット 2014-08-22 14.16.19.png")

これでもう迷わないと思う。

おしまい。
cells を利用してパーシャル内のロジックを分離する

*注意: この内容は cell 3.x のものです。*
*4.x 系では大きな変更が加えられました。詳しくはこちらを参照してください。 [From Cells 3 to Cells 4 Upgrading Guide · apotonick/cells Wiki](https://github.com/apotonick/cells/wiki/From-Cells-3-to-Cells-4---Upgrading-Guide)*


概要
=====

[apotonick/cells](https://github.com/apotonick/cells) という gem を利用すると、パーシャル（のようなもの）単位でのコントローラ（のようなもの）を定義することができます。

- 再利用性を考えてパーシャルを作成したがパーシャル内にロジックが入り込んでしまっている
- 様々なビューから呼び出されるパーシャルで利用するオブジェクトを毎回コントローラで定義するのが微妙だ

のようなシチュエーションでうまい具合にロジックを分離してくれます。

実装
=====

インストール & 生成
-----

Gemfile に `cells` を加えます。

```rb:Gemfile
gem 'cells'
```

いつもどおり `bundle install`

generator を利用して必要なファイル一式を生成します。
後述の `rspec-cells` をインストールしておくと、rspec ファイルも生成されます。

`./bin/rails g cell article show -e haml`

呼び出す
-----

生成された `cells/article/show.html.haml` を view から呼び出します。

```rb
= render_cell :article, :show, article: @article
```

引数で渡された値は以下のように利用します。

```rb:app/cells/article_cell.rb
class ArticleCell < Cell::Rails
  def show(args)
    @article = args[:article]
    render
  end
end

```

Devise のヘルパーメソッドを利用したい
------

`current_user` や `user_signed_in?` などを使いたい場合はこんな感じ。

```rb:app/cells/article_cell.rb
class ArticleCell < Cell::Rails
  include Devise::Controllers::Helpers
  helper_method :user_signed_in?, :current_user

  def list(args)
    @article = args[:article]

    if user_signed_in?
      my_name = current_user.name
      ...
    end
    render
  end

end
```

Rspec
-----

rspec でテストするには `rspec-cells` gem を使うと良いです。

[apotonick/rspec-cells](https://github.com/apotonick/rspec-cells)

``` Gemfile:Gemfile
  gem 'rspec-cells'
```

devise のヘルパーを利用している場合は、`Device::TestHelpers` を利用するように設定しておきましょう。

```rb:spec/support/devise.rb
RSpec.configure do |config|
  config.include Devise::TestHelpers, :type => :cell # 追加
end

```


```rb:spec/cells/article_cell_spec.rb
describe ArticleCell, type: :cell do

  context 'cell rendering' do
    before { @article = FactoryGirl.create(:article) }
    context 'rendering list' do
      subject { render_cell(:article, :show, article: @article) }
      it { is_expected.to have_selector('div.article-container') }
      it { is_expected.to have_selector('h3.article-title', text: "「
#{@article.title}」") }
    end
    describe "assigns" do
      it "should assigns article" do
        render_cell(:article, :show, biz_service: @article)
        expect(view_assigns[:article]).to eq @article
      end
    end
  end
end
```
Gitlabと連携したJenkinsで，ブランチごとに最新の成果物を保管する

# 前提：GitlabとJenkinsはgitlab webhook pluginで連携済みである

連携方法などは他記事で詳しく解説されているので，そちらを参照ください
http://qiita.com/garbagetown/items/fe055dcfd8e0c090e610

# なんでこんなことを？

pushイベントをトリガにCIすると，大量のブランチの成果物ができあがりますが，基本的にビルドごとに上書きされてしまいます．
それをブランチごとに最新の成果物を保管しておくことが目的です．

# 要は…

一言で言えば，Gitのブランチ名でディレクトリを切って，そこにビルド成果物をコピーするだけです．

# ブランチごとに最新の成果物を保管する

手順は以下の通り

1. ビルドコマンド実行後にビルド手順の追加
2. Windowsバッチコマンドの実行，またはシェルコマンドの実行を追加
3. ブランチでディレクトリ分け
4. 成果物を保存のビルド手順を追加して，成果物の位置を指定

## シェルコマンド例

./app/build/outputs/apk/app-debug.apk がビルド成果物と仮定

```bash
mkdir -p build
branch=`echo ${GIT_BRANCH} | sed -e "s/\//_/"`
targetDir=./build/$branch
rm -rf $targetDir
mkdir -p $targetDir
cp -f ./app/build/outputs/apk/app-debug.apk $targetDir
```

バッチコマンドの2行目では，ブランチのグルーピング利用される "/" を "_" に変更しています．
例えば，origin/master ブランチであれば origin_master ディレクトリが作成され，そこにビルド成果物が保存されます．

## 成果物を保存の設定
```text
build/**/*.apk
```

## 注意

ブランチが削除されても反映されないため，定期的なメンテ（削除されたブランチの成果物の削除）を行う必要があります．
Windows でbowerする。

# Javascriptでの開発
Javascriptの開発が当たり前になり、複数のライブラリを取り扱うようになり、管理やインストール、環境の維持などが結構大変になってきていると思います。

## そこでパッケージ管理ツールの導入
Javascriptのパッケージ管理ツールである、bowerを使いたい。最近、いじっているAngularJSのライブラリを見ても、インストールにbower install xxx と書いてありるので、やはりという感じです。

## でも開発はWindows？
Macを利用できればそれでいいのですが、Macでない開発環境もある。Windowsで動作させられないかと試行錯誤したのですが、できそうですが面倒で、環境もかなり汚染される感じで、仕事で開発を行う時には使いにくい。

# こういうときこそ、Vagrantがいいね！
こういう時こそ、Vagrantを利用するのが良いだろうということで、VagrantとCentOS(これはお好きなディストでどうぞ。インストール等は読み替えてください。）だと環境を作りました。

## Vagrantでの実行
以下はCentOSのboxをcentos64等と名前を付けていますので、boxの登録が必要な場合は別途実行してください。

``` Bash:コマンド
mkdir dev
cd dev
vagrant init centos64
vagrant up
```
もし、Apache等を入れたうえでその環境を利用したい場合は、

```　VagrantFile
config.vm.network "forwarded_port", guest: 80, host: 10080
```
等として、ポートをフォワードしておくと便利かもしれません。

## 仮想マシン上でのnpm/bowerのインストール
作成した仮想マシンにvagarnt sshしておいて、以下のようなコマンドで、パッケージ管理ツールをいれて確認します。

``` bash
sudo su -
rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum install nodejs npm --enablerepo=epel
npm install -g bower
bower -v
yum install git
exit
```
これでbowerが動く環境が作成できました。
次のポイントはVagrantの特徴であるフォルダ共有を利用します。

## /vagrantディレクトリに開発用のライブラリを構築する。
Linuxの/vagrantフォルダは、共有ディレクトリとなっていて、自分のWindows機のVagrantFileを作成したフォルダが/vagrantになっています。（デフォルト機能ですがｗ）

``` bash
mkdir /vagrant/test
cd /vagrant/test
bower install angularjs
``` 
これで利用できるようになります。

##Windowsでの開発
WebStorm等で、対象フォルダをプロジェクトフォルダとして開発することで、Javascriptライブラリの管理をbowerで利用できるようになります。

Apacheを利用したい場合は、

```
sudo su -
yum install httpd
```
した上で、以下のファイルを作成し、httpdを起動させます。

``` /etc/httpd/conf.d/vagrant.conf
<Directory /vagrant/test>
        Options Indexes FollowSymLinks
</Directory>

Alias /vagrant "/vagrant/test"
```

対象ディレクトリが http://localhost:10080/vagrant/ で参照できるようになります。（上述した、foward_port設定が必要です）
カレンダーにイベントを追加する


## やりたいこと

iOS アプリからカレンダーにイベントを追加したい。

# 準備

下記フレームワークを追加します。

EventKit.framework
EventKitUI.framework


# 使用するクラス

## EKEventStore

イベントやリマインダーなど、カレンダー機能にアクセスする際に必要なクラス。生成のコストが大きいのでシングルトンクラスを作ってそこで持たせるのがいいらしい。

## EKEvent

イベントを表すクラス。イベントの件名や時刻などを設定する。

## EKEventEditViewController

イベントを作成・修正する際に使用する ViewController。

# 実装の流れ

1. シングルトンクラスで EKEventStore 生成
1. カレンダーのアクセス権取得
1. 作成したいイベント情報を作成
1. 作成するイベントの詳細を編集
1. 作成したイベントを保存

## シングルトンクラスで EKEventStore 生成

生成は普通に alloc init で。

```
self.eventStore = [[EKEventStore alloc] init];
```

## カレンダーのアクセス権取得

カレンダー機能を使用するにはユーザーの許可が必要です。 下記のようにしてユーザーから許可を得ます。

```
    EKEventStore *eventStore = [[SingletonClass sharedInstance] eventStore];

    [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error){
        if(granted){
           // ユーザーから許可が得たらここにくる。
        }else{
           // 許可が得られなかったらここにくる。エラーダイアログとか出す。
        }
    }];
}

```

ちなみにカレンダーのアクセス権は後から、iPhone の「設定」 → 「プライバシー」 → 「カレンダー」で変更が可能です。


## 作成したいイベント情報を作成

```
            EKEvent *event = [EKEvent eventWithEventStore:eventStore];
            event.title = 'イベントタイトル';
            event.startDate =  [NSDate date]; //イベント開始時刻;
            event.endDate = [NSDate dateWithTimeIntervalSinceNow:60*60*2];//イベント終了時刻;

```

## 作成するイベントの詳細を編集

EKEventEditViewController を使います。EKEventEditViewController の見た目を変更したい場合は、UINavigationControllerDelegate を使用します。

```
            EKEventEditViewController* controller = [[EKEventEditViewController alloc]
                                                     init];
            controller.eventStore = [[SingletonClass sharedInstance] eventStore];
            controller.event = event;
            controller.delegate = self; // 見た目を変更するのに使用
            controller.editViewDelegate = self; // 
            [self presentViewController:controller animated:YES completion:nil];

```

## 作成したイベントを保存

EKEventEditViewController での操作完了時、EKEventEditViewDelegate の eventEditViewController:(EKEventEditViewController *)controller didCompleteWithAction:(EKEventEditViewAction)action が発火します。保存が行われた場合は保存の処理を行い、ViewController を閉じます。

```
- (void)eventEditViewController:(EKEventEditViewController *)controller
          didCompleteWithAction:(EKEventEditViewAction)action{
    NSError *error = nil;
    
    switch (action) {
        case EKEventEditViewActionCanceled:
            break;
        case EKEventEditViewActionSaved:
            [controller.eventStore saveEvent:controller.event span:EKSpanThisEvent error:&error];
            break;
        case EKEventEditViewActionDeleted:
            break;
            
        default:
            break;
    }
    
    [controller dismissViewControllerAnimated:YES completion:nil];
}

```


# 参考にしたページ

「カレンダーとリマインダーのプログラミングガイド」

https://developer.apple.com/jp/devcenter/ios/library/documentation/EventKitProgGuide.pdf
MongoDB インストール（Amazon Linux）


http://docs.mongodb.org/ecosystem/platforms/amazon-ec2/

基本ここにぜんぶ書いてある。

## インストール

```
echo "[MongoDB]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0
enabled=1" | sudo tee -a /etc/yum.repos.d/mongodb.repo
```


```
$ sudo yum install -y mongodb-org-server mongodb-org-shell mongodb-org-tools
```

（ディレクトリの調整とかその他もろもろ設定省略）

## 起動

とりあえずデフォルト設定にて。

```
$ sudo service mongod start
```


## PHPのライブラリ追加

```
# pecl install mongo
# echo "extension=mongo.so" > /etc/php.d/mongo.ini
```


# 使い方
http://qiita.com/ANTON072/items/e0534daa4b2fb0f553eb