OmniAICreator/Qiita-1.07M huggingface dataset:
Go言語でdo-whileループする


従来のdo-while文

```example.c
int x = 0;
do {
   x = x + 1;
} while (x < 3);

printf("%d", x); // 3
```
　
Go言語でdo-whileループする場合

```example.go
x := 0
for {
 x = x + 1 
 if x > 2 {
 	break
 }
}
fmt.Println(x) // 3
```

条件が真になるまでループし続けることに注意

## 参考
- do-while文 - Wikipedia http://ja.wikipedia.org/wiki/Do-while%E6%96%87
EC-CUBE3でフォームにMasterDataを利用したSelectBoxとかの作り方

性別や職業、都道府系といったMasterData（mtb_XXX)を利用したフォームを作成する時は多い。
この実装方法が、2.13系と、3系では、当然結構違う。  
細かな仕組みは省略して、どう書かなきゃいけないかだけメモしておく。

例として、会員登録のFormに追加した時を上げている。

3.0のソースで以下の箇所を見ながらだと理解しやすいかと  
 - src/Eccube/Controller/conEntryContoroller.php
 - src/Eccube/Form/Type/*.php
 - src/Eccube/ServiceProvider/EccubeServiceProvider.php
 - src/Eccube/View/Entry/*.twig
 - src/Eccube/Entity/Master/*

## 入力フォームでマスターデータを用いたセレクトボックスの作り方

### 1. Custom Form Field Typeを作る

例として職業のセレクトボックス（JobType.php)を作る。
すでに同様の実装をおこなっているsrc/Eccube/Form/Type/PrefType.phpをコピーして、PrefType.phpと同じディレクトリに、JobType.phpとする。  
利用するMasterDataと紐づくEntityにあわせて以下の箇所を書き換える

```php
- 'class' => 'Eccube\Entity\Master\Pref'
+ 'class' => 'Eccube\Entity\Master\Job'
```
getNameも修正

```php

public function getName()
    {
-        return 'pref';
+        return 'job';
    }
```

### 2. 作成したCustom Form Field TypeをServiceProviderに登録

src/Eccube/ServiceProvider/EccubeServiceProvider.php の以下の辺りに追記

```php

$app['form.types'] = $app->share($app->extend('form.types', function ($types) use ($app) {
            $types[] = new \Eccube\Form\Type\NameType();
            $types[] = new \Eccube\Form\Type\TelType();
+           $types[] = new \Eccube\Form\Type\JobType();
```

### 3. CustomerType.php から利用する

```php
 public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $app = $this->app;

        $builder
            ->add('name', 'name', array(
                'options' => array(
                    'attr' => array(
                        'maxlength' => 50,
                    ),
                    'constraints' => array(
                        new Assert\NotBlank(),
                    ),
                ),
            ))
~~~~~~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~
+           ->add('job', 'job', array(
+                'required' => false,
+           ))
~~~~~~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~
```

### 4. テンプレートにフォームを記載

後はTwigのテンプレートファイル(src/Eccube/View/Entry/index.twig)に以下のように書く

```smarty
                 <tr>
                    <th>職業</th>
                    <td>
                        {{ form_widget(form.job) }}<br />
                        {{ form_errors(form.job) }}
                    </td>
                </tr>
```

とくに問題がなければ、これだけでFormが表示される。  

## 確認画面等での見せ方

上でフォームが作れていたら表示はもっと簡単。

2.13までのイメージだと以下のような記載をしていたものを

```smarty 
$arrJobs[$form.job_id]
```
3.0からは編集と同様に

```smarty 
{{ form_widget(form.job) }}
```

これだけで表示される。実に簡単。

もしこれでちゃんと表示されないならもろもろ別途確認
AndroidStudioでgradleの実行時にDebuggerを接続する方法


はじめに
==========

Gradleをちょいちょいカスタマイズしたり、Objectにどういうプロパティがあるかを調べるのに、
やはりDebuggerが使えると便利なときがあります。

調べてみると簡単にできるのでメモしておきます。

今回の方法は、
「コマンドラインでgradleを実行」「AndroidStudioからDebuggerを接続」という形です。

Version
----------

* MacOS(Yosemite) 10.10.3
* AndroiStudio 1.1.0
* JVM: 1.7.0
* Groovy 2.3.6
* gradle 2.2.1

方法
=======

単に下記URLの方法に従えばOKでした。
http://georgik.sinusgear.com/2014/06/23/how-to-debug-gradle-script/

が、改めて書きます。

コマンドライン側に環境変数を設定する
----------------------------

`GRADLE_OPTS` 環境変数を以下のようにセットします。

```
export GRADLE_OPTS='-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005' 
```

Android Studioの Run/Debug Configurations で remote debugの設定
-------------------

### `Run` メニューから `Edit Configurations` を選びます。

![Run_と_Menubar.png](https://qiita-image-store.s3.amazonaws.com/0/11124/33904d6b-5996-88ab-8689-1059635eaf4c.png "Run_と_Menubar.png")

### 左上の＋ボタンから `Remote` を選択

![Run_Debug_Configurations.png](https://qiita-image-store.s3.amazonaws.com/0/11124/a37b1dea-1b46-aa35-583c-395e1c3f4c89.png "Run_Debug_Configurations.png")


### 適当に名前を付けてOKを押す
Exportした時の環境変数文字列の `address=5005` と設定中の `address=5005` が同じであることは必要なのだと思います。

![Run_Debug_Configurations.png](https://qiita-image-store.s3.amazonaws.com/0/11124/7dfcf95e-8ff6-8218-3251-ab869bf951a5.png "Run_Debug_Configurations.png")

デフォルトでこうなっていると思うので、何もいじらなくてOKです。

コマンドラインからGradle起動
--------------------

コマンドラインからGradleを起動すると、 以下のようになって実行がストップします。

```
% ./gradlew myTask                                                                                                                  
Listening for transport dt_socket at address: 5005
```

デバッガをアタッチするまで待つようです。

Android StduioからRemote接続Debug
-----------------------

![GenerateEnvironmentConfigPlugin_groovy_-__buildSrc__-_app-android-multiregion-build_-____Documents_workspace_UQ_app-android-multiregion-build_.png](https://qiita-image-store.s3.amazonaws.com/0/11124/e24034c5-b9f5-5387-2511-e1dec95cbd18.png "GenerateEnvironmentConfigPlugin_groovy_-__buildSrc__-_app-android-multiregion-build_-____Documents_workspace_UQ_app-android-multiregion-build_.png")

Debugアイコンをクリックすると、Debuggerがアタッチされて、Gradleの実行が再開されます。
Breakポイントなど設置してあれば、そこで止まります。


BreakPointがきくところきかないところ
-----------------

Gradleスクリプトの中の Closure的なブロックではあまり止まらないっぽいです。

```
def appVersionCode = 1                # ←ここはBreakPointがきく
def appVersionName = "1.0.0"

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')      # ←ここはBreakPointきかない
    androidTestCompile 'junit:junit:4.11'
    androidTestCompile 'org.robolectric:robolectric:2.4'
    androidTestCompile 'org.mockito:mockito-all:1.9.5@jar'
}
```

さいごに
=========

イマイチ細かいプロパティのドキュメントとか見つからない（ぐぐり力が低いだけかな・・・）ので、これでだいぶ捗りそうです。
aws-cliのコマンド補完をする



[awc-cli](http://aws.amazon.com/jp/cli/)は、awsを操作するコマンドラインツールです。
対応しているサービスが多いため、コマンド補完できると便利ですね。
そこで、コマンドを補完する方法を紹介します。


# zshの場合

## ソースコードの取得

```
$ git clone git@github.com:aws/aws-cli.git
$ cd aws-cli
```

## 設定

```
$ source bin/aws_zsh_completer.sh
```

## 確認

```
$ aws [TAB]
```

出力結果

```
autoscaling        cloudwatch         dynamodb           elastictranscoder  kinesis            route53            sns                support                             
cloudformation     configure          ec2                elb                opsworks           s3                 sqs                swf                                 
cloudsearch        datapipeline       elasticache        iam                rds                s3api              storagegateway                                       
cloudtrail         directconnect      elasticbeanstalk   importexport       redshift           ses                sts          
```

参考資料: [Github aws-cli](https://github.com/aws/aws-cli)
RubyMotion CMTimeMake 64bit でこける


RubyMotion のバージョンは 3.8。

```
$ motion --version
3.8
```

Xcode のバージョンは 6.3。

![空白_Skitch_キャンバス.png](https://qiita-image-store.s3.amazonaws.com/0/37508/9fcc8c54-36bc-c090-9e68-58791bbfc059.png "空白_Skitch_キャンバス.png")

```Ruby	
videoComposition = AVMutableVideoComposition.videoComposition
videoComposition.renderSize = CGSizeMake(640, 480)
videoComposition.frameDuration = CMTimeMake(1, 20)
```

64bit 対応ってことで、`Rakefile` で `app.archs['iPhoneOS']` を特に指定しないでコンパイルすると、上みたいな書き方でこける。どうも `CMTimeMake` でこけてるっぽい。どうすればいいんでしょうか。

```
* thread #1: tid = 0x253249, 0x0000000184a1918c AVFoundation`-[AVMutableVideoComposition setFrameDuration:] + 72, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x24)
    frame #0: 0x0000000184a1918c AVFoundation`-[AVMutableVideoComposition setFrameDuration:] + 72
AVFoundation`-[AVMutableVideoComposition setFrameDuration:]:
->  0x184a1918c <+72>: ldr    x8, [x20, #16]
    0x184a19190 <+76>: str    x8, [sp, #64]
    0x184a19194 <+80>: ldr    q0, [x20]
    0x184a19198 <+84>: str    q0, [sp, #48]
```

こんな感じで、`EXC_BAD_ACCESS` で落ちる。

`RakeFile` に、`app.archs['iPhoneOS'] = %w(armv7 armv7s)` って書くと問題なく動く。

基本的なことかもしれないんですが、困っています。どなたかー、ヘルプー。
embulkで機種依存文字が使われたcsvファイル取り込む方法

# 【お知らせ】embulk v0.6.2以降からこの対応は不要となりました

次の手順を参考にアップデートしましょう！

* embulkのインストール・アップデート方法 - Qiita<br />
http://qiita.com/y-ken/items/31890f4f188321cb88a7

## はじめに

embulkでcsvファイルを処理する際、guessサブコマンドを用いて設定を自動生成できるのは便利ですね！
その時にcsvであればShift_JISがセットされることが多いのですが、次のような機種依存文字が使われうるファイルである場合には注意が必要です。

* ㈱なになに

※ この1文字目が機種依存文字

## guessサブコマンドを用いて設定を自動生成する

最小限の設定を手で書きます。

```
$ vim partial-config.yml
in:
  type: file
  path_prefix: ./items.csv
out:
  type: stdout
```

ここで作ったpartial-config.ymlを元に、config.ymlを生成します。

```
$ embulk guess partial-config.yml -o config.yml
```

このときプレビュー表示があるので期待通りに動いていることが分かりやすく、安心感がありますね。
出来上がったファイルは次の通りです。

```
$ vim config.yml
in:
  type: file
  path_prefix: ./items.csv
  parser:
    charset: Shift_JIS
    newline: CRLF
    type: csv
    delimiter: ','
    quote: '"'
    escape: ''
    skip_header_lines: 0
    columns:
    - {name: c0, type: string}
    - {name: c1, type: string}
    - {name: c2, type: string}
    - {name: c3, type: string}
    - {name: c4, type: string}

以下略
```

## 機種依存文字に対応させる

さて、ここからがメインです。
先ほど生成したconfig.ymlのparserの中のcharsetを、次のように書き換えます

```diff
@@ -7 +7 @@
-    charset: Shift_JIS
+    charset: MS932
```

これで、取り込む際に文字化けしなくなりました。

embulk最高ですね〜♪
テスト用SSLサーバーをGoで作る


# 経緯
* SSLでRest APIを叩くクライアントを作りたい
* 実装毎にサーバーから返る結果が違う(Go:NG/Python:OK/curl:OK)。なぜ
* アプリ内でリクエストをdumpしてheader/Bodyを見たが差異があるように見えない
* テスト用のSSLサーバーをローカルに立てて、wiresharkでパケットを見よう

# 実装
以下にやり方がまんま載っている。感謝。

Golang ListenAndServeTLS returns data when not using https in the browser
http://stackoverflow.com/questions/23494082/golang-listenandservetls-returns-data-when-not-using-https-in-the-browser
## 鍵の作成
```
# openssl genrsa -out private_key 2048
# openssl req -new -x509 -key private_key -out public_key -days 365
```
## サーバーの作成
```lang:server.go
package main

import (
        "fmt"
        "net/http"
)

func rootHander(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Hello.")
}

func main() {
        http.HandleFunc("/", rootHander)
        err := http.ListenAndServeTLS(":9444", "./public_key", "private_key", nil)
        if err != nil {
                fmt.Println(err)
        }
}
```
## 実行
```
# go build server.go && ./server &
# curl -k https://localhost:9444/
hello.
```
webにおけるキャッシュと時刻の話 

RFC7234でキャッシュについて定義されている。
https://tools.ietf.org/html/rfc7234

こちらのサイトも参考になりそう。
https://www.mnot.net/cache_docs/



# Expires

その時刻まで有効の意味。

```
Expires: Fri, 30 Oct 1998 14:19:41 GMT
```

これは1年以上未来の日付にするべきではない。



# Cache-Control

有効期限を秒数で表す。開始基準はDateヘッダーの時刻。
Expiresより優先される。

```
Cache-Control: max-age 3600
```

キャッシュさせたくない場合。

```
Cache-Control: no-cache
```

プロキシサーバーなどにキャッシュさせたくない場合。

```
Cache-Control: no-store
```

その他にプロキシサーバを制御する指定ができる。

|キャッシュ名|意味|
|:-:|:-:|
|Cache-Control: public|プロキシでキャッシュする時にユーザーが違う場合でも共有可能|
|Cache-Control: private|ユーザーごとに異なる必要がある|
|Cache-Control: no-transform|プロキシがコンテンツタイプなどを変更してはいけない|
|Cache-Control: must-revalidate|プロキシは必ずオリジンサーバーへの検証が必要|
|Cache-Control: proxy-revalidat|プロキシはオリジンサーバーへの検証が必要|
|Cache-Control: s-maxage|プロキシに対して適用されるmaxage|
|Cache-Control: stale-while-revalidate|プロキシが有効期限切れデータをクライアントに返していい猶予秒数|
|Cache-Control: stale-if-error|上位サーバーがエラーだった場合に保持しているコンテンツをクライアントに返してもいい秒数|
　
　
# Last-Modified
まずサーバー側が最終更新日付とコンテンツのハッシュをレスポンスで返す。

```
Last-Modified: Thu, 18 Dec 2014 23:45:00 GMT
Etag: "ffjjlfee38fd879fjfe78988dfg"
```

Etagはサーバーが様々な条件で生成する。

広告などで毎回内容が変わる場合でも中身のコンテンツが同じなら同じになるように工夫する必要がある。このハッシュの計算に、ディスクノードを使用すると冗長構成時に別の値になるので使用しない方がいい。
コンテンツの意味にも注意する。なんらかの一覧を取得する場合は、その一覧のどれかが更新されていれば意味的にはコンテンツが新しいことを返した方がいい。

クライアントは条件付きリクエストでコンテンツを調べる。

```
if-Modified-Since: Thu, 18 Dec 2014 23:45:00 GMT
```

もしくは、

```
if-None-Match: "ffjjlfee38fd879fjfe78988dfg"
```

```
if-None-Match: W/ "ffjjlfee38fd879fjfe78988dfg"
```

と書けば、弱い検証となり、完全一致ではないがデータの意味が一致する場合に利用する。動的に毎回一部が必ず変わるページなど。

サーバーはコンテンツに変更がなければ304を返す。


#Vary

リクエストヘッダーによってレスポンスが変化する場合は、そのことをレスポンスヘッダーであらかじめ教えておく。カンマ区切りで複数指定可能。

```
Vary: Accept
```
　
　

# HTTP時間
RFC 2616で定義されている。
HTTPで使えるのは三つ。

|RFC|例|
|:-:|:-:|
|RFC 822 (RFC 1123)|Thu, 18 Dec 2014 23:45:00 GMT|
|RFC 850 (RFC 1036から廃止)|Thursday, 18 Dec 2014 23:45:00 GMT|
|ANSI C|Thu Dec 18 23:45:00 2014|
　
　
RFC 822はRFC 1123でアップデートされた。
現在はRFC 1123を使う事が望ましい。


# インターネット標準時間
HTTPヘッダに限ってはRFC 1123が標準だが、それ以外のケースでプログラム的に日付を扱う場合はRFC 3339で定義されているインターネット標準の時刻を使う。

```
2014-12-19T23:30:00+00:00
```

+09:00を使うよりも世界標準に合わせて+00:00を使った方がいい。
その場合は、

```
2014-12-19T23:30:00Z
```

と記述する事が可能。

ただし、現実には+09:00はよく使われる。



# UNIXタイムスタンプ(epoch秒)
1970年1月1日からの経過秒数。
機械的に時刻を処理する際によく使われる。
内部的な実装でこちらの方が都合がよければ、こちらを採用しても良い。
外と通信ならインターネット標準のRFC 3339を使用する。



# GMT(グリニッジ標準時)とUTC(世界協定時)
HTTPでは時刻はGMTを使う。
二つはほぼ同時刻を表している。
UTCの方が正確だが、100年で18秒ずれる。

日本時間は9時間プラスされるので、「UTC時刻+09:00」と表記する。
Seasar2においてjQueryからActionクラスに配列を受け渡すには

現在Seasar2(SAstruts/S2JDBC)、Java、JSP、jQueryを使って
ソートしたリストの順番をDBにアップデートするアプリを作成しています。

質問があるのですが、
結論から言うと

**jQueryで作成した配列をActionクラスのメソッドに受け渡すにはどうしたらいいでしょうか？**


下記のサイトの書き方を利用して
http://alphasis.info/2011/05/jquery-ui-sortable-submit/
配列情報を持たせて画面遷移まではできるようになりました。

↓URL
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/60528/93fe8b98-2b71-b48f-517a-5f5d6ea2402b.jpeg)


しかし、Actionクラスでどのようにその配列を受けたらいいかわかりません。
その書き方がわかりません。

ActionFormにString型変数をつくり、配列の文字列をActionクラスのメソッドに受けるまではできるようになりました。

<br>
もし書き方がわかる方やアドバイス頂ける方がいればよろしくお願いします。
ファイルメーカーでのスクリプト引数とコーディング標準


#コーディング標準について
##スクリプトや関数
ファイルメーカーでソリューション開発を行う場合、かなり本格的なものを作る場合でも少人数で出来てしまいますが、あとからのメンテナンス性などをこうりょするとやはりスクリプトやリレーションの表記などに関する標準化をしていきたいところです。

そんな時に私が参考にしているサイトを紹介しておきます。
その名も[FileMakerStandards.org](http://filemakerstandards.org)。そのまんまです。(^_^;

すべてこの通りに記述しているわけではないですが、この内容を参考にして自分なりのアレンジをしていくというもの一つの方法です。

##リレーションの表記
RDBでの開発者がファイルメーカーのソリューション開発をするときに概念の違いに一番戸惑うのがリレーションではないでしょうか。
私の理解として、ファイルメーカーのリレーションはインスタンスの関連を表すオブジェクト図だと考えています。

グラフ表記としては以下のようにテキストノートを利用し、枠と色分けして表現しています。
![Relation.png](https://qiita-image-store.s3.amazonaws.com/0/68589/b9b0478c-aea1-db47-4540-e25db85b8e08.png "Relation.png")

その他、関連によってレコード作成や削除について「＋」「-」を表記するというのもアイデアとしてあるようですが私はそこまではしていません。
開発人数が増えたときには採用するかもしれませんが。

#スクリプトの引数について
スクリプトをなるべく汎用的に作成しようとすると、引数を受け取る必要がある場面が多くなります。
そこで、複数の引数を受け渡す方法についてまとめておきます。
今回はカスタム関数を利用する場合と、利用しない場合の両方を書いておきます。

##カスタム関数を利用する場合
Advanced版を利用している場合はカスタム関数を利用すると、記述をシンプルにできるのでおすすめです。

私は前述のコーディング標準で紹介した[FileMakerStandards.orgのテンプレート提供ページ](http://filemakerstandards.org/display/bp/Standards+Template+File)にあるテンプレートのカスタム関数を利用しています。

簡単なサンプルを紹介します。
その他の関数を組み合わせて必須引数とオプション引数の判定なども行えますので、詳しく知りたい方はFileMakerStandardsのサイトを参照してみてください。
###スクリプトのサンプル
カスタム関数「#Assign()」を利用します。

```FMScript:スクリプト名「引数受け取りスクリプト(パラメータ1;パラメータ2)」
1 #引数を受け取るだけのシンプル版
2 If [#Assign ( Get ( スクリプト引数 ) )]
3 	#ここに実際の処理を記述します
4 	#引数は#Assign関数でスクリプト名に書いてある変数名に格納されています
5 	#この例の場合は $パラメータ1 と $パラメータ2 という変数に値が設定されています
6 End If
```
###スクリプト呼び出し時の記述
カスタム関数「#()」を利用します。
![ScriptParam.png](https://qiita-image-store.s3.amazonaws.com/0/68589/55ae8fbc-e384-8bbd-05c8-7bad537129c1.png "ScriptParam.png")

複数のパラメータは上記のように&でつなげるだけです。
実際には引数の順番は関係無く、名前さえ合っていれば順番が入れ替わってても正常に呼び出せます。

##カスタム関数を利用しない場合
###スクリプトのサンプル
ファイルメーカーのスタンダード版しか手元に無い場合は、カスタム関数が定義出来ないので別の方法で受け渡します。
方法は色々あると思いますが、各パラメータを改行で区切った状態で受け渡しGetValue()関数で取り出すのが分かりやすいのではないでしょうか。

```FMScript:スクリプト名「引数受け取りスクリプト２(パラメータ1;パラメータ2)
1 #カスタム関数を利用しないパラメータ受け渡し例
2 変数を設定 [$パラメータ1; 値:GetValue ( Get ( スクリプト引数 ) ; 1 )]
3 変数を設定 [$パラメータ2; 値:GetValue ( Get ( スクリプト引数 ) ; 2 )]

```

###スクリプト呼び出し時の記述
呼び出し側は改行で区切って、引数の順番も守って記述します。
![ScriptParam_nofunction.png](https://qiita-image-store.s3.amazonaws.com/0/68589/6a756052-b543-f573-4ab8-c27e9a42c728.png)

説明は以上です。
これ以外にももっと良い方法があるかもしれませんので色々試したり工夫して見て下さい。
もしももっと良い方法を見つけたら是非ご紹介下さい！(^.^)
MovableType でデフォルトのアイテムアップロード先を変更しておく方法

MTディレクトリ/tmpl/cms/include/asset_upload.tmpl を一度ローカルにコピー

この一行目に以下の変数指定を追記します。
<$mt:setvar name="extra_path" value="media/"$>

これで画像アップロード時のフォルダ指定欄にデフォルト値として「media/」が入力された状態になる。

修正ファイルを MTディレクトリ/alt-tmpl/ 以下に階層を合わせてアップロード。

/alt-tmpl/cms/include/asset_upload.tmpl

アイテムのアップロード先ディレクトリが
デフォルト値で指定されるようにカスタマイズ完了。

![_www_mtmg_mt_cgi___mode=start_upload&blog_id=2.jpg](https://qiita-image-store.s3.amazonaws.com/0/42674/07c315b1-7a83-b98c-3ac6-43406b8741da.jpeg)
itamae を使って CentOS6.5 に MySQL をインストールする時の注意


# 結論
パッケージがインストール済みかのチェックに`not_if`アトリビュートを使います。

```rb
package 'http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm' do
  not_if 'rpm -q mysql-community-release-el6-5'
end

package 'mysql-community-server'
package 'mysql-community-devel'
```

# 解決した問題

```rb
package 'http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm'
```

では、インストール済みの判定に失敗します。
一度目の実行は成功します。
しかし、二回目以降の実行でエラーが出ます。


## エラー内容
エラー時の実行メッセージを見ると

```
rpm -q http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
```

が実行されています。本来は、以下を実行して欲しいです。

```
rpm -q mysql-community-release-el6-5
```

## `package`リソースの実装

itamaeで使う`package`リソースは`specinfra`というライブラリによって提供されています。

[specinfra/package.rb](https://github.com/serverspec/specinfra/blob/8b1fcf7f2c2a38a99adac90c97f4b528e166a395/lib/specinfra/command/redhat/base/package.rb#L4)の実装は

```rb
cmd = "rpm -q #{escape(package)}"
```

です。引数にurlを指定しているかは特に考慮していません。

## 対処方法
[itamaeではリソースにアトリビュートを指定することができます。](https://speakerdeck.com/ryotarai/itamae-infra-as-code-xian-zhuang-que-ren-hui?slide=22)

ここでは`not_if`アトリビュートを使います。
`'rpm -q mysql-community-release-el6-5'`が失敗した時だけ、インストールするように、以下の指定を行います。

```rb
package 'http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm' do
  not_if 'rpm -q mysql-community-release-el6-5'
end
```
android-5.1.0_r5がリリースされてたのでメモ


5.1.0_r3と5.1.0_r5の差分こみっつ

# project bootable/recovery/
5b9defe updater: Check the return value from ApplyImagePatch / ApplyBSDiffPatch
1       0       recovery.cpp
28      14      updater/blockimg.c

# project build/
1ac5b83 "LMY47O"
1       1       core/build_id.mk
128bb23 "LMY47N"
1       1       core/build_id.mk
4278529 "LMY47M"
1       1       core/build_id.mk
4522f41 "LMY47L"
1       1       core/build_id.mk
bd5479c "LMY47K"
1       1       core/build_id.mk
5a0b3c7 "LMY47J"
1       1       core/build_id.mk

# project device/asus/fugu/
f87d64d recovery: Add option to view recovery logs on Fugu
2       0       recovery/recovery_ui.cpp

# project device/htc/flounder/
02931a8 flounder: require bootloader 3.44.0.0122
1       1       board-info.txt
c9f037f flounder: require bootloader 3.44.0.0122
1       1       board-info.txt

# project frameworks/base/
67676f8 MediaProjectionPermissionActivity: Fix NPE.
6       2       packages/SystemUI/src/com/android/systemui/media/MediaProjectionPermissionActivity.java
78873f4 Avoid crashing on startup when policy forbids lockscreen camera.
9       0       packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
6       1       packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java

# project packages/services/Mms/
1e14602 Redact MMS message URL logging
38      5       src/com/android/mms/service/MmsHttpClient.java
1       2       src/com/android/mms/service/MmsService.java
2       2       src/com/android/mms/service/PhoneUtils.java

# project packages/services/Telecomm/
f7a075b DO NOT MERGE Fix NPE in Telecom
2       2       src/com/android/server/telecom/CallReceiver.java
【AndroidStudio】バージョン管理対象にしたい！したくない！の方法

Androidstudioを使い始めました。バージョン管理へ含める、含めないやり方について少しつまってしまったのでまとめます。

# 環境
Windows7
Androidstudio(1.1.0)
Git

を使用してバージョン管理を行います。

# ファイルを新しく作成すると・・・
新しくファイルを作成すると、バージョン管理に含めるか否かを聞かれるダイアログ「Add File to Git」が表示されます。
ここで「Yes」を選択すると、このファイルはバージョン管理に含まれます。つまりaddされます。
ここで「No」を選択すると、このファイルはバージョン管理に含まれません。addされていないです。
どちらかを選択し、今後ダイアログを表示させないようにもできます。

ためしに「No」を選択後、View>Tool Windows>Terminal もしくは下のToolButtonsよりTerminalを起動し、status コマンドを実行してみます。

```
git status
```

先ほど作成したファイルが「Untracked files」と表示されると思います。
また、View>Tool Windows>Changes　もしくは下のToolButtonsよりChangesを選択し、Localタブを選択します。「Unversioned Files」のリストに先ほど作成したファイルが追加されているはずです。

この状態でコミットしようとしても新規作成したファイルはコミット候補には入らず、バージョン管理されていない状態となります。

ChangesのLocalタブには、変更があったファイルが表示されます。
中でも、すでにaddされているものは「Default」リストに、まだaddされていないものは「Unversioned Files」リストに表示されます。


# バージョン管理対象にする
ファイルをバージョン管理対象にするためにはいくつか方法があります。
1. 新規作成時に表示されるダイアログでバージョン管理に含むようにする
2. Changesで「Unversioned Files」リストからはずすことによってバージョン管理対象にする
3. コマンドでバージョン管理対象にする

1つ目の方法はダイアログで「Yes」を選択するのみなので、説明は割愛します。
2つ目から説明します。

### 「Unversioned Files」リストからはずす
やり方は簡単です。
View>Tool Windows>Changes　もしくは下のToolButtonsよりChangesを選択し、Localタブを選択すると、バージョン管理されていないファイルが「Unversioned Files」リストに表示されています。
バージョン管理に含めたいファイルをドラッグ&ドロップで「Default」リストへ追加します。
以上でファイルがバージョン管理の対象に入ります。
ためしにTerminalよりstatus コマンドを実行してみると、「Changes to be committed」の群に表示されるはずです。
また、コミットしようとするとコミット候補にも表示されるはずです。

### コマンドでバージョン管理対象にする
Terminalからコマンドをうってバージョン管理対象にすることもできます。

```
git add <FileName>
```

addコマンドをうったあとにstatusコマンドを実行して確かめてみると「Changes to be committed」の群に表示され、Changesでは「Default」リストに表示されているはずです。


# .gitignore
.gitignoreファイルを使うことによって、Gitの管理下に置きたくないものを除外することができます。
.gitignoreはGitリポジトリのルートに置きます。

たとえば「test.apk」というapkファイルを新規で作成したとします。
そして以下のような.gitignoreを作成します。

```lang:.gitignore
*.apk
```

この状態でTerminalからstatusコマンドをうってみると、このapkファイルは表示されないはずです。
ChangesのLocalを開いてみても、「Unversioned Files」リストにも表示されていないはずです。

このようにgitignoreを使うことによって、(わかりにくいのですが)バージョン管理の対象に含めるかどうか、の対象にも含めないことができます。

# .gitignoreが効かない
すでにaddしてしまったファイルは、.gitignoreに記述してもバージョン管理に含まれてしまいます。

# バージョン管理から外す
バージョン管理対象から外したい場合はいまのところコマンドでしか実行できないようです。(調べたのですが見つかりませんでした。)
Terminalから実行します。

```
git rm --cached <FileName>
```

この状態でコミットすると、バージョン管理から外すことができます。
また、コミット前であれば以下のコマンドも使用できます。

```
git reset HEAD <FileName>
```

2つ目のコマンドはstatusコマンドを実行した結果に「unstageするためには～」と書いてあります。
【Unity】LitJsonを使用してデータを超カンタンにセーブする

!!注!! https://qiita.com/Ijoru/items/b68692fe4c8065041a86 にJsonUtility版の記事をアップしました。
今後は↑を使用していただいた方が、きっと幸せになれます。

-----

LitJsonとはC#で使えるJSONライブラリで、Unityでも使用可能です。
ライセンスはパブリックドメインなので、いつでもどこでも気軽に使えます。

今回は、こちらを使用してUnityでデータを超カンタンにセーブする方法をご紹介します。

# LitJsonのダウンロード
まずはLitJsonをダウンロードします。
http://lbv.github.io/litjson/

# LitJsonをUnityに放り込む
LitJson.dllをUnityにドラッグ&ドロップするだけです。
ラクチン。

# セーブ用の基底クラスの準備
もちろんLitJsonを使って直接JSONを読み書きしても構いませんが、今回は超カンタンということでセーブ用基底クラスを準備します。

```lang:C#
using UnityEngine;
using System;
using System.Collections;

abstract public class SavableSingleton<T> where T : SavableSingleton<T>, new()
{
    private static T instance;

    public static T Instance
    {
        get
        {
            if (null == instance)
            {
                LitJson.JsonMapper.RegisterExporter<float>((obj, writer) => writer.Write(Convert.ToDouble(obj)));
                LitJson.JsonMapper.RegisterExporter<decimal>((obj, writer) => writer.Write(Convert.ToString(obj)));
                LitJson.JsonMapper.RegisterImporter<double, float>(input => Convert.ToSingle(input));
                LitJson.JsonMapper.RegisterImporter<int, long>(input => Convert.ToInt64(input));
                LitJson.JsonMapper.RegisterImporter<string, decimal>(input => Convert.ToDecimal(input));
                var json = PlayerPrefs.GetString(GetSaveKey());
                if (json.Length > 0)
                {
                    instance = LitJson.JsonMapper.ToObject<T>(json);
                }
                else
                {
                    instance = new T();
                }
            }
            return instance;
        }
    }

    public void Save()
    {
        PlayerPrefs.SetString(GetSaveKey(), LitJson.JsonMapper.ToJson(this));
        PlayerPrefs.Save();
    }

    public void Reset()
    {
        PlayerPrefs.DeleteKey(GetSaveKey());
        instance = null;
    }

    private static string GetSaveKey()
    {
        return typeof(T).FullName;
    }
}
```

インスタンス生成時にJSONからデータを自動ロード、Save()メソッドでJSONにデータを保存します。
PlayerPrefs以外にJSONを保存したい場合は適当にいじっちゃってください。

# 使ってみよう
では実際に使ってみましょう。
まずはデータを格納するクラスを準備します。
（このクラスのプロパティがセーブされます

```lang:C#
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class TestSaveData : SavableSingleton<TestSaveData>
{
    public enum ItemNames {
		Hoge,
		Fuga
	}

    public string playerName = "";
    public int experience = 0;
    public List<Names> items = new List<Names>();
}
```

~~ちなみに、LitJsonでは**long、floatは使えません。**（ロード時に型変換に失敗してコケます）
int、double、stringなどを使いましょう。~~
(2015/04/15追記) LitJsonでのlong、floatの扱い方をご教授いただいたため、long、floatも扱えるようSavableSingletonを改良しました！ついでにdecimalが桁落ちするようでしたので、併せて修正しました。

また、上記ルールに添っていれば**配列やオブジェクトもそのまま保存/復元が可能**なので超便利です。

そして、下記でセーブ実行。

```lang:C#
TestSaveData.Instance.playerName = "Cat";
TestSaveData.Instance.experience = 10;
TestSaveData.Instance.items.Add(TestSaveData.ItemNames.Hoge);
TestSaveData.Instance.items.Add(TestSaveData.ItemNames.Fuga);
TestSaveData.Instance.Save();
```

セーブしたデータはTestSaveData.Instanceを初めて呼び出した際に勝手にロードされます。
例えば次回のゲーム起動時に下記コードを実行すると、「Cat」と出力されるワケです。

```lang:C#
Debug.Log(TestSaveData.Instance.playerName);
```
curl -sS https://getcomposer.org/installer | php エラー回避方法

`curl -sS https://getcomposer.org/installer | php`
で下記のエラーが出る場合、

	yamato@ubuntu:~$ curl -sS https://getcomposer.org/installer | php
	curl: (60) SSL certificate problem: unable to get local issuer certificate
	More details here: http://curl.haxx.se/docs/sslcerts.html

	curl performs SSL certificate verification by default, using a "bundle"
	 of Certificate Authority (CA) public keys (CA certs). If the default
	 bundle file isn't adequate, you can specify an alternate file
	 using the --cacert option.
	If this HTTPS server uses a certificate signed by a CA represented in
	 the bundle, the certificate verification probably failed due to a
	 problem with the certificate (it might be expired, or the name might
	 not match the domain name in the URL).
	If you'd like to turn off curl's verification of the certificate, use
	 the -k (or --insecure) option.

-k をつけると回避できる。
`curl -sS -k https://getcomposer.org/installer | php`

	yamato@ubuntu:~$ curl -sS -k https://getcomposer.org/installer | php
	#!/usr/bin/env php
	All settings correct for using Composer
	PHP Notice:  Undefined variable: caBundle in - on line 792

	Notice: Undefined variable: caBundle in - on line 792
	Downloading...

	Composer successfully installed to: /home/yamato/composer.phar
	Use it: php composer.phar
	yamato@ubuntu:~$
peg.coffeeでインデントによるオフサイドルールをパースする


考え方

- インデントする度に、現在のインデントコンテキストを保存する
- peg.jsの `& { pred... }` で、次のブロックがindentしたブロックかどうか判定する
- dedentするときには indentStackを巻き戻す

```
{
  global.ctx = {}
  ctx.indentStack = []
  ctx.indent = ""
}

start = program
program = lines:line* { type: 'program', body: lines}

line = expr
expr = SAMEDENT s:symbol + EOL? children: ( INDENT c:line* DEDENT { c })?
    {
      {type: 'expr', value: s, children}
    }

symbol = $([a-zA-Z\d]+)

EOL = "\r\n" / "\n" / "\r"

SAMEDENT
  = i:[ \t]* &{
    i.join('') is ctx.indent
  }

INDENT
  = &(
      i:[ \t]+ &{
        i.length > ctx.indent.length
      }
      {
        ctx.indentStack.push(ctx.indent)
        ctx.indent = i.join("")
      }
    )

DEDENT
  = {
    ctx.indent = ctx.indentStack.pop()
  }
```

パース用テキスト

```
a
  f
    k
  b
t
  c
  d
```

実行

```
{ type: 'program',
  body: 
   [ { type: 'expr',
       value: [ 'a' ],
       children: 
        [ { type: 'expr',
            value: [ 'f' ],
            children: [ { type: 'expr', value: [ 'k' ], children: null } ] },
          { type: 'expr', value: [ 'b' ], children: null } ] },
     { type: 'expr',
       value: [ 't' ],
       children: 
        [ { type: 'expr', value: [ 'c' ], children: null },
          { type: 'expr', value: [ 'd' ], children: null } ] } ] }
```
デバイスマネージャーのVirtualbox bridged networking driverの削除方法

VirtualBoxをダウンロードし、VagrantをインストールしてCentOS6.5の開発構築を整え、
いざvagrant upをしたのですが上手く起動せず、GUIモードで起動しようとしてもエラーが出てしまい起動せず。。。
萎えたので放置していたら、翌日ぐらいに急にネットに繋がらなくなってしまいました。

どうやらVirtualbox bridged networking driverが怪しい・・・

#解決方法
下記の手順で<b>ネットワーク接続</b>まで移動する

```
コントロールパネル→ネットワークとインターネット→ネットワークと共有センター→アダプターの設定の変更→ネットワーク接続
の順に移動する
```
![画像1.png](https://qiita-image-store.s3.amazonaws.com/0/75241/c81c5fde-c841-8e1c-9c68-33b3cee27e4a.png)

そして、
自分のパソコンが繋がっているLANを<b>右クリック</b>して<b>プロパティ</b>を開く。

<b>この接続は次の項目を使用します</b>という項目の中に(下に貼ってある画像だと上から2番目)
Virtualbox bridged networking driverがあり、
チェックボックスにチェックがついています。
このチェックを外してあげればネットに繋がりました。
![画像2.png](https://qiita-image-store.s3.amazonaws.com/0/75241/69584531-09b3-2655-77fa-bd253e3e58dd.png)
また、
デバイスマネージャーのネットアダプターのVirtualbox bridged networking driverも消えていました。


#さいごに
パソコンを起動したとき、突然赤色の×印がついてネットに接続出来なかったので、ルーターがおかしいのかなぁと思ったのですが、
他のパソコンは繋がったので、このパソコンがおかしいとなりました。
有線LANはちゃんと接続されているため、デバイスマネージャーを確認したところ、ネットアダプターの欄にVirtualbox bridged networking driverというものがあり、これが怪しいと仮定しました。とりあえず削除しようと思い、削除ボタンを押したのに消えてくれない。どうにかして消したいなと思ったので、VirtualBoxをアンインストールしたり関連ファイルも削除したのですが、消えてくれない。最終的にネットワークのプロパティでVirtualbox bridged networking driverを見つけたので、チェックボックスのチェックを外したら無事ネットが繋がりました。

最初に気づけなかったことが悔しい。
しかし、ネットに繋がり、デスクトップでまた作業ができるようになったので良かったです。
ArduinoのオーディオライブラリMozziの基礎

Mozziを勉強するにあたって自分用メモ。

リファレンスのメモ(英語がきわどいので間違ってるかもしれないｗ)

**CONTROL_RATE** ：
 updateControl()が1秒間に何回読まれるようにするか決めるレート

**audioHook()**：　
 こいつはArduinoのvoid loop ()の中に書く必要がある。こいつは一回だけ updateAudio() を呼んで、そのupdateAudio()の結果をアウトプットバッファに送ります。
loopにはこいつだけにしてほかの関数はupdateControl()に入れると動作が安定するよ。？

**void updateControl()**:
startMozzi()関数でコントロールレートを決めて使ってね。コントロールレートのレートで呼び出されます。たとえ何も描かなくてもmozziを使うにはこの関数を作る必要があります。

**int updateAudio()**:
AUDIO_RATE of 16384 Hzでオーディオ信号のアウトプットをとてもスムーズに行ってくれます。計算等の処理はここにはかかないでsetupかupdateControlを使ってね。

**int mozziAnalogRead(uint8_t pin)**
選んだピンのアナログインプットの値をほかの命令の実行を邪魔することなく読み込んでくれます。

**Q0n7 Q8n0 などQanbシリーズ**
いっぱいあります。小数点の位置を決めます。Qに続く数字が整数ビットの数。nに続く数字が少数ビットの数。基本合わせて8bitか16bitになっており7bitと15bitのやつは1bitが符号を現してます。

**float mtof(float midival)**
midiのノートナンバーを周波数の値に変えます。

**Q16n16 Q16n16_mtof	(	Q16n16 	midival_fractional	)**
よりスピードをもとめるならこれ。さらに早くしたいならQ16n16_mtof()
Timing: ~8 us.

**int8_t rand(int8_t minval, int8_t maxval)**
最小値と最大値を決めてランダムな値を取得します。

以上Mozziの基本的な機能を紹介しました。
あとはクラスをつかって自由に遊びましょう。
Windows環境のVagrantでCentOS Atomic Hostを動かす

## 1. 前提

VirtualBox, Vagrantはインストールされているものとします。

## 2. boxダウンロード

http://www.projectatomic.io/download/
の"CentOS Atomic Host(testing)"をクリックして

> CentOS-7-x86_64-AtomicHost-Vagrant-VirtualBox.box

をダウンロードします。

## 3. add box

ダウンロードしたboxを適当な名前でaddします。

```cmd
vagrant box add --name centos-atomic CentOS-7-x86_64-AtomicHost-Vagrant-VirtualBox.box
```

## 4. Vagrantfile作成

先ほどaddしたboxでVagrantfileを作ります。

```cmd
vagrant init centos-atomic
```

## 5. vagrant up（ただしエラー）

```cmd
vagrant up
```
とするとWindows環境ではrsyncがないというエラーが出ます。

```
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
"rsync" could not be found on your PATH. Make sure that rsync
is properly installed on your system and available on the PATH.
```

エラーの理由ですが、元のVagrantfileに共有フォルダーをrsyncタイプで共有する記述があるため、Windowsではrsyncがないと怒られていたのでした。

```
>more %USERPROFILE%\.vagrant.d\boxes\centos-atomic\0\virtualbox\Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.base_mac = "5254007c4727"
  config.vm.synced_folder ".", "/home/vagrant/sync", type: "rsync"
end
```

## 6. Vagrantfile修正

とりあえずsynced_folderをdisabledにします。

```rb:Vagrantfile
Vagrant.configure(2) do |config|
  #
  # ...
  config.vm.synced_folder ".", "/home/vagrant/sync", disabled: true
  # ...
end
```

## 7. vagrant up

今度は正常に起動します。

```
vagrant up
```

もちろんこのままでは共有フォルダーは使えません。
さてさて、どうしたものか。
AppEngine の便利 JobQueue クラス DeferredTask の使い方

### DeferredTask とは

TaskQueue を、URL ハンドラの実装なしに使える便利クラスです。

通常、TaskQueue は指定された URL を叩いて Task を実行します。
この挙動は厳密な設計には便利ですが、Task の種類の数だけ URL を制御しなければなりません。
新たにルーティングを設定し、新たにコントローラメソッドを実装する必要があります。

これらを廃し、より気楽に使えるようにしたのが DeferredTask クラスです。
必要な要素はたった一つ、DeferredTask interface (#run のみ) を実装したクラスのみです。

### 基本的な使い方

```java
public class SomeTask implements DeferredTask {
    @Override
    public void run() {
        Log.d("SomeTask", "Hello World!");
    }
}

// 登録
final TaskOptions option = TaskOptions.Builder.withPayload(new SomeTask());
QueueFactory.getDefaultQueue().add(option);
```

### パラメータの渡し方

プロパティ持たせて渡します。

```java
public class SomeTask implements DeferredTask {
    private static final Logger logger = Logger.getLogger(SomeTask.class.getSimpleName());

    private final String someParam;

    public SomeTask(String someParam) {
        this.someParam = someParam;
    }

    @Override
    public void run() {
        logger.info("Performing a task with someParam: " + someParam);
    }
}
```

### TaskQueue への登録

インスタンス化し Payload として TaskQueue に登録すれば勝手に処理されます。

```java
final TaskOptions option = TaskOptions.Builder
    .withPayload(new SomeTask("someparamvalue"));
QueueFactory.getDefaultQueue().add(option);
```

内部的には `POST /_ah/queue/__deferred__` でこのタスクをハンドリングしてくれる。
タスクに渡したパラメータはログや TaskQueue の管理画面に出ないので注意。

Task 内でパラメータを Log しておくことをおすすめします。

### 注意点

DeferredTask は Serializable であることに気を付けてください。内部的には、DeferredTask はシリアライズされて TaskQueue に突っ込まれ、内部的にデシリアライズされて `run()` されています。

そのため、内部クラスで実装すると、Serializable でないと思われる親クラスへの参照を持ってしまうため、正常に動きません。（多分）
同様の理由で、匿名クラスでの実装も出来ません。文法的には一番便利なのですが…

上記の理由により、親クラスの内部プロパティや、今のメソッドスコープの変数に依存した実装は出来ません。
要は、必要な情報は全て DeferredTask インスタンスに渡してあげてください。

便利な分、シリアライズの面で取り扱いが難しくなっています。この点を注意し、DeferredTask は気軽なタスクで利用しましょう。

### TaskQueue について便利情報

○ 秒後とかしたければ `countdownMillis(long)` を使う。

```java
final TaskOptions option = TaskOptions.Builder
    .withPayload(new SomeTask("someparamvalue"))
    .countdownMillis(10000); // 10 秒後
```

`taskName(String)` を使えば TaskQueue 管理画面に名前が出ます（多分）

```java
final TaskOptions option = TaskOptions.Builder
    .withPayload(new SomeTask("someparamvalue"))
    .taskName("SomeTask");
```
Objective-Cで動画の向き（orientation）を取得する

チャオ！

動画の向きが取得できなとアレやコレやが出来なくて、アレゲな時があるよね！

ウブだった頃の私は

**ダメパターン**

```
+ (UIInterfaceOrientation)orientationForTrack:(AVAsset *)asset
{
    AVAssetTrack *videoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
    CGSize size = [videoTrack naturalSize];
    CGAffineTransform txf = [videoTrack preferredTransform];
    
    if (size.width == txf.tx && size.height == txf.ty) {
        return UIInterfaceOrientationLandscapeRight;
    } else if (txf.tx == 0 && txf.ty == 0) {
        return UIInterfaceOrientationLandscapeLeft;
    } else if (txf.tx == 0 && txf.ty == size.width) {
        return UIInterfaceOrientationPortraitUpsideDown;
    } else {
        return UIInterfaceOrientationPortrait;
    }
}
```

とかやっていたんだけど、これじゃー取れない動画ががががが・・・
でも下記のやり方でやったら取れないヤツも無事とれたからこっちがオススメ！

**オススメパターン**

```
static inline CGFloat RadiansToDegrees(CGFloat radians) {
    return radians * 180 / M_PI;
};

+ (UIInterfaceOrientation)orientationForTrackWithAsset:(AVAsset *)asset
{
    AVAssetTrack *videoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
    CGAffineTransform txf = [videoTrack preferredTransform];
    CGFloat videoAngleInDegree  = RadiansToDegrees(atan2(txf.b, txf.a));
    
    switch ((int)videoAngleInDegree) {
        case 0:
            return UIInterfaceOrientationLandscapeRight;
        case 90:
            return UIInterfaceOrientationPortrait;
        case 180:
            return UIInterfaceOrientationLandscapeLeft;
        case -90:
            return UIInterfaceOrientationPortraitUpsideDown;
        default:
            return UIInterfaceOrientationUnknown;
    }
}
```

動画の横幅がおかしいとかあったら試してみて！
perlbrewで構築するPerl環境


### perlbrewとは
perlbrewは複数のPerlのバージョンをインストールして切り替えしてくれるツールです。


### perlbrewのインストール
> $ sudo apt-get install perlbrew

### perlbrewの初期化
> $ perlbrew init


<pre>
perlbrew root (~/perl5/perlbrew) is initialized.

Append the following piece of code to the end of your ~/.bash_profile and start a
new shell, perlbrew should be up and fully functional from there:

    source ~/perl5/perlbrew/etc/bashrc

Simply run `perlbrew` for usage details.

Happy brewing!
</pre>

### 現在のインストールできるバージョンの確認
> $ perlbrew available

<pre>
  perl-5.21.10
  perl-5.20.2
  perl-5.18.4
  perl-5.16.3
  perl-5.14.4
  perl-5.12.5
  perl-5.10.1
  perl-5.8.9
  perl-5.6.2
  perl5.005_04
  perl5.004_05
  perl5.003_07
</pre>

### インストールをする
> $ perlbrew install perl-5.21.10

testをスキップすると少し早く終わります。
> $ perlbrew install --notest perl-5.21.10

<pre>
Fetching perl 5.21.10 as /home/suesan/perl5/perlbrew/dists/perl-5.21.10.tar.bz2
Download http://www.cpan.org/src/5.0/perl-5.21.10.tar.bz2 to /home/suesan/perl5/perlbrew/dists/perl-5.21.10.tar.bz2
Installing /home/suesan/perl5/perlbrew/build/perl-5.21.10 into ~/perl5/perlbrew/perls/perl-5.21.10

This could take a while. You can run the following command on another shell to track the status:

  tail -f ~/perl5/perlbrew/build.perl-5.21.10.log

Installation process failed. To spot any issues, check

  /home/suesan/perl5/perlbrew/build.perl-5.21.10.log

If some perl tests failed and you still want install this distribution anyway,
do:

  (cd /home/suesan/perl5/perlbrew/build/perl-5.21.10; make install)

You might also want to try upgrading patchperl before trying again:

  perlbrew install-patchperl

Generally, if you need to install a perl distribution known to have minor test
failures, do one of these command to avoid seeing this message

  perlbrew --notest install perl-5.21.10
  perlbrew --force install perl-5.21.10
</pre>
怒られてしまったので、patchperlをインストールする
> $ perlbrew install-patchperl

再度、perl-5.21.10をインストールする
> $ perlbrew install --notest perl-5.21.10

次のコマンド切り替え可能なバージョンのリストが表示される
> $ perlbrew list
>  perl-5.21.10

切り替えを実行
> $ perlbrew switch 5.21.10

もう一度listを見るとアスタリスクがつきます。
これが現在のバージョンです。
> $ perlbrew list
>* perl-5.21.10

試しにバージョンを確認する
> $ perl -v
> This is perl 5, version 21, subversion 10 (v5.21.10) built for darwin-2level


おわり
Sublime Text2(Windows版)のカーソル移動をMac風に

Windows版のSublime Text2のキー操作をちょっとだけMac風にする。

- Ctrl+a カーソルを行頭に移動
- Ctrl+e カーソルを行末に移動
- Ctrl+b カーソルを左に移動
- Ctrl+f カーソルを右に移動
- Ctrl+p カーソルを上に移動
- Ctrl+n カーソルを下に移動
- Ctrl+h カーソル左側の文字を削除
- Ctrl+d カーソル右側の文字を削除
- Ctrl+w カーソル左側の単語を削除

`Preferences` > `Key Bindings - User`でキーバインドの定義ファイルを開いて、下のように設定する。

```json
[
	{"keys": ["ctrl+a"], "command": "move_to", "args": {"to": "hardbol"}},
    {"keys": ["ctrl+e"], "command": "move_to", "args": {"to": "hardeol"}},
    {"keys": ["ctrl+b"], "command": "move", "args": {"by": "characters", "forward": false} },
    {"keys": ["ctrl+f"], "command": "move", "args": {"by": "characters", "forward": true} },
    {"keys": ["ctrl+p"], "command": "move", "args": {"by": "lines", "forward": false} },
    {"keys": ["ctrl+n"], "command": "move", "args": {"by": "lines", "forward": true} },
    {"keys": ["ctrl+h"], "command": "left_delete"},
    {"keys": ["ctrl+d"], "command": "right_delete"},
	{"keys": ["ctrl+w"], "command": "delete_word", "args": {"forward": false, "sub_words": true}}
]
```
【Rails】Controllerのactionが引数にとるparamのデフォ値設定【初心者tips】

知ってるとDRYに書けるよねっていうtips。

# actionの引数のデフォ値をおく
```rb
def some_action
  if param[:hoge].present?
    @hoge = param[:hoge]
  else
    @hoge = "default_hoge"
  end
end
```
っていう書き方しなくてもいいよっていう話
こうかけ↓DRY

```
def some_action(hoge="default_hoge")
  @hoge = hoge
end
```
こうすると、param[:hoge]が存在する場合は、

```
  hoge = param[:hoge]
```
param[:hoge]がnilになる場合に

```
  hoge = "default_hoge"
```
になる。

# ちなみに
formで、こんな感じでリクエストおくる場合

```
  form_for(hoge_new, url:~~)
```

submitを押すと、paramへの入り方は
hogeのmodel名をhoge_modelとすると、

```
params: {~~, "hoge_model" => {hogeのattributesたち}}
```

てな感じで、formのsubmitのparamのキーにはmodel名が入る。
なので、そいつのデフォルト値を上みたいに定めたい時は、

```
def some_action(hoge_model="default_hoge_model")
  @hoge = hoge_model
end
```

こんな感じになる。

知ってると、DRYにかけるよというtipsでした。
FlashDevelopでNativeInstallerのパッケージング

## はじめに

PackageApp.batを改造することで、FlashDevelop経由でNativeInstallerのパッケージングができます。
NativeInstaller形式でパッケージし、拡張デスクトッププロファイルを有効にすればflash.desktop.NativeProcessが使用可能になります。

以下のbatファイルをPackage.batと同じ階層に置いて実行してください。

## 参考記事

+ ~~http://blog.suz-lab.com/2010/02/flashdevelopnative-installer.html~~ リンク切れ
+ [元記事のWebArchive](https://web.archive.org/web/20170911171100/http://blog.suz-lab.com/2010/02/flashdevelopnative-installer.html)

## BATファイル

*▼dos:PackageAppNative.bat*

```bat
@echo off
set PAUSE_ERRORS=1
call bat\SetupSDK.bat
call bat\SetupApplication.bat

set AIR_TARGET=
::set AIR_TARGET=-captive-runtime
set OPTIONS=-tsa none

:: ここからPackager.batの改造
if not exist %CERT_FILE% goto certificate

:: AIR output
if not exist %AIR_PATH% md %AIR_PATH%
set OUTPUT=%AIR_PATH%\%AIR_NAME%%AIR_TARGET%.exe

:: Package
echo Packaging %AIR_NAME%%AIR_TARGET%.air using certificate %CERT_FILE%...
call adt -package %OPTIONS% %SIGNING_OPTIONS% -target native %OUTPUT% %APP_XML% %FILE_OR_DIR%
if errorlevel 1 goto failed

echo.
echo AIR setup created: %OUTPUT%
echo.
goto end

:certificate
echo.
echo Certificate not found: %CERT_FILE%
echo.
echo Troubleshooting: 
echo - generate a default certificate using 'bat\CreateCertificate.bat'
echo.
if %PAUSE_ERRORS%==1 pause
exit

:failed
echo AIR setup creation FAILED.
echo.
echo Troubleshooting: 
echo - did you build your project in FlashDevelop?
echo - verify AIR SDK target version in %APP_XML%
echo.
if %PAUSE_ERRORS%==1 pause
exit

:end
pause
```
Javascriptで配列内に特定の要素が存在するかどうかの判定


JSの配列にはexistsとかcontainsなどとかいうメソッドは無いがindexOfを利用して以下のように判定できる。

```js:
var arr = ["a", "b", "c"];
			
if (arr.indexOf("a") >= 0){
  // 存在する
}

if (arr.indexOf("a") == -1){
  // 存在しない
}
```

# 参考

Javascriptで配列にある値が存在するかどうかを確認する方法について - 主にプログラムを勉強するブログ
http://d.hatena.ne.jp/artgear/20130124/javascript_array_contain_how_to
【Rails】Request-URI Too Large【GETかPOSTか】

# URIが長くなるときはPOSTメソッドを使おう
URIが長くなりすぎると、リクエストが遅れず、Request-URI Too Largeといエラーが出ることがあります。
(*1 URIはURLのより広い言い方: http://web-tan.forum.impressrd.jp/e/2010/03/09/7539)


## 長い情報をparamにもたせたい時はGETは使えない。
RailsではGetリクエストにおける、paramの情報はそのままURIに書き込まれる。なので、GETリクエストを使う限り、paramに守らせることができる情報には限りがあるということ。

## form / POSTを使おう
それでも、長い情報をparamにもたせたいんだ！というときは、postメソッドとformヘルパーを使って実装しましょう。formヘルパーに、hidden_fieldで情報をもたせて、飛ばしたいリンクにsubmitで飛ぶようにしましょう。そうすれば、問題なく情報を運びながら、目的のページをrenderできます。
ansible で role の vars を分割する

# tl;dr

結論から言うと include_vars を使えばできる。

roles/*/tasks/main.yml:

```yaml
- include_vars: private_key.yml

- name: prepare private key
  copy: dest=~/.ssh/id_rsa content="{{ private_key }}" mode=0600

- name: prepare ssh config
  copy: dest=~/.ssh/config src=ssh_config mode=0600
```

http://docs.ansible.com/include_vars_module.html

ただし色々とハマりポイントがあった。

# vars/main.yml からインクルードしたかった

roles/*/vars/main.yml でこういう風に書きたかったんだけど、 vars はただの YAML なので、これはできないみたい。

```yaml
- include: private_key.yml
```

https://groups.google.com/d/msg/ansible-project/LgiQ6CRHRCY/M0Eq0luZbYIJ

# vars_files を使おうとした

```
ERROR: vars_files is not a legal parameter in an Ansible task or handler
```

と怒られる。 ``vars_files`` は意味的に ``vars`` と同じなので playbook でしか使えないようだ。

# タスクにタグを指定している場合 include_vars にもタグが必要

これが今回一番ハマったポイント。

```yaml
- include_vars: private_key.yml

- name: prepare private key
  copy: dest=~/.ssh/id_rsa content="{{ private_key }}" mode=0600
  tags:
    - debug

- name: prepare ssh config
  copy: dest=~/.ssh/config src=ssh_config mode=0600
```

みたいにして ansible-playbook の引数に ``-t debug`` を付けて実行した場合、

```
fatal: [127.0.0.1] => One or more undefined variables: 'private_key' is undefined
```

というエラーが出る。この場合、 include_vars にもタグが必要。

このせいで include_vars が使えないと思い込んでしまった。
include_vars もタスクの一種なので、分かってしまえば当然の話なのだけど。

## (追記) always タグ

ansible 1.9 から追加された ``always`` という特別なタグを使えば特定のタスクを常に実行できるらしいので、こういう場合に使うと便利かもしれない。

http://docs.ansible.com/playbooks_tags.html#special-tags

# Acknowledgements

include_vars が使えることは Twitter で @r_rudi さんに教えてもらいました（それと ``always`` タグについても）。ありがとうございます。

<blockquote class="twitter-tweet" lang="ja"><p><a href="https://twitter.com/knzm2015">@knzm2015</a> たしか勝手にはmain.yml以外読んでくれない覚えがありますので、 include_vars を使うのはいかがでしょう <a href="http://t.co/Vf4MUGxhUp">http://t.co/Vf4MUGxhUp</a></p>&mdash; shirou - しろう (@r_rudi) <a href="https://twitter.com/r_rudi/status/587539696990818304">2015, 4月 13</a></blockquote>
FuelPHPでユニットテストを行う設定


CentOS 6.5 環境で、

- PHPUnit
- Stagehand_TestRunner

を使った自動テストの準備。

PHPUnit, Stagehand_TestRunner のインストールをcomposerで行う場合。


# 設定

| 項目 | 設定値 |
| --- | --- |
| FuelPHPプロジェクトファイルpath | /path/to/project |


# 必要なパッケージをOSにインストール

```
# yum install php-xml
# yum install php-mbstring
```

# Stagehand TestRunner のインストール

## composer.json の設定

/path/to/project/composer.json に require-dev 項目を追加

```
"require-dev": {
    "piece/stagehand-testrunner": ">=3.6.1" 
},
```

## composerの実行

```
$ cd /path/to/project
$ php composer.phar update piece/stagehand-testrunner
```

## インストールされていることの確認

```
$ /path/to/project/vendor/bin/testrunner --version
Stagehand_TestRunner version 4.1-gba4fca8

Copyright (c) 2005-2014 KUBO Atsuhiro and contributors,
All rights reserved.
```


# PHP Unit のインストール


## composer.json の設定

```
"require-dev": {
    "phpunit/phpunit" : "4.6.*"
},
```

## composerの実行

```
$ cd /path/to/project
$ php composer.phar update phpunit/phpunit
```

## インストールされていることの確認

```
$ /path/to/project/vendor/bin/phpunit --version
PHPUnit 4.6.2 by Sebastian Bergmann and contributors.
```

# テストのテスト

## Stagehand TestRunnerの準備

```
$ cd /path/to/project/fuel
$ ./vendor/bin/testrunner compile -p ./vendor/autoload.php
```

## テストクラスの作成

``` /path/to/project/fuel/app/test/model/SampleTest.php ``` として、以下を作成

```
<?php
Class SampleTest extends PHPUnit_Framework_TestCase
{
    /**
     * @test
     */
    public function TestTest()
    {
        $this->assertTrue(true);
    }

```


## テストクラスファイルの監視を行いながらテストの実行

```
$ cd /path/to/project/fuel
$ ./vendor/bin/testrunner phpunit -p ./vendor/autoload.php -a ./app/tests/

(略)
```


# その他オプション

## ヘルプ

```
$ ./vendor/bin/testrunner phpunit --help
```

(phpunitに対するヘルプを表示させる必要があるので、testrunner --help ではない)


## 通知

OSXの通知センターに結果を通知させる。サウンドが出るので、失敗か成功かを耳で確認できる。

```
$ ./vendor/bin/testrunner phpunit -m -p ./vendor/autoload.php -a ./app/tests/
```
日本語訳　atom-shell dialog module

atom-shellではよく使うであろう、ダイアログモジュールのAPiの翻訳です。

# ダイアログ

 `dialog`モジュールはネイティブシステムのダイアログを表示するAPIを提供します。
 Webアプリケーションはネイティブアプリケーションと同じユーザー体験を提供することができます。

以下はダイアログを表示し複数のファイルやディレクトリを選択する例です。

```javascript
var win = ...;  //ダイアログを表示するウィンドウ
var dialog = require('dialog');
console.log(dialog.showOpenDialog({ properties: [ 'openFile', 'openDirectory', 'multiSelections' ]}));
```

**Note for OS X**: もしシートのようなダイアログを表示したいなら、BrowserWindowの参照をbrowserWindow引数に与えるだけでよいです。

## dialog.showOpenDialog([browserWindow], [options], [callback])

* `browserWindow` ブラウザウィンドウ
* `options` Object　オプション
  * `title` String
  * `defaultPath` String
  * `filters` Array
  * `properties` Array - どの機能をダイアログが使うべきかを含む、以下が使用できる。 `openFile`, `openDirectory`, `multiSelections` and
    `createDirectory`
* `callback` Function

成功時にはユーザーが選択したファイルパスの配列を返却する、そうでない場合は`undefined`を返却する。

`filters`は表示や選択ができるファイルの種類を決めます。
 以下に例を書きます。

```javascript
{
  filters: [
    { name: 'Images', extensions: ['jpg', 'png', 'gif'] },
    { name: 'Movies', extensions: ['mkv', 'avi', 'mp4'] },
    { name: 'Custom File Type', extensions: ['as'] },
  ],
}
```

もし `callback` が引数として渡された場合, the APIの呼び出しは非同期になり、`callback(filenames)`によって結果が返却されます。

**Note:** Windows や Linuxではオープンダイアログはファイル選択とディレクトリ選択は同時にできません。
もし、これらのプラットフォームで['openFile', 'openDirectory']`を指定した場合はディレクトリ選択のほうが適用されます。

## dialog.showSaveDialog([browserWindow], [options], [callback])

* `browserWindow` ブラウザウィンドウ
* `options` Object
  * `title` String
  * `defaultPath` String
  * `filters` Array
* `callback` Function

成功した場合はユーザーが選択したファイルのパスを返却し、それ以外の場合は`undefined`を返却します。

`filters` は見ることができるファイルの種類を特定します。
`dialog.showOpenDialog` の例を見てみましょう。

もし `callback` が引数として渡された場合, the APIの呼び出しは非同期になり、`callback(filenames)`によって結果が返却されます。

## dialog.showMessageBox([browserWindow], options, [callback])

* `browserWindow` ブラウザウィンドウ
* `options` Object
  * `type` String - `"none"`, `"info"`, `"warning"`より選べます。
  * `buttons` Array - ボタンのための文字列の配列
  * `title` String - メッセージボックスのタイトル, プラットフォームによっては表示されないものがあります。
  * `message` String - メッセージボックスの内容
  * `detail` String - メッセージの追加情報
  * `icon` [NativeImage](native-image.md)
* `callback` Function

メッセージボックスを表示し、メッセージボックスが閉じられるまでブロックします。
クリックしたボタンのインデックスを返却します。

もし`callback`が引数に渡された場合, API 呼び出しは非同期となり、
結果は `callback(response)`を通じて返却されます。

## dialog.showErrorBox(title, content)

エラーメッセージを表示するモーダルダイアログを表示します。
このAPIはよくスタートアップの早い段階で利用されるため、
`app`の`ready`イベントを放つ前に安全に呼ぶことができます。