OmniAICreator/Qiita-1.07M huggingface dataset:
クエリビルダで生成したインスタンスに別テーブルの情報を付加してビューに渡す方法

**※コメント欄にてLaravelの機能を利用した方法をご教授頂きました。
　実装する際にはそちらを参照頂いた方がよいです。**


**やりたいこと**

以下のようなDB設計のアプリケーションがあった場合に、あるページに会議情報の一覧とそれらに出席するユーザの人数を、それぞれの会議情報について付加して表示する。

```
ユーザテーブル：ユーザ情報を表現する
会議テーブル：会議の日程等の情報を表現する
ユーザ、会議テーブル：会議に出席するユーザを表現する
user
 -id
 -name
kaigi
 -id
 -date
kaigi_user
 -kaigi_id
 -user_id
```

例えば、以下のように会議室のデータをインスタンス化してビューに渡す方法が簡単です。しかし、ユーザの人数も合わせてビューに渡そうと思うと、kaigi_userのテーブルからそれぞれkaigiのkaigi_idが持つuser_idの数をcountしたデータをインスタンスに付加する必要があり、laravelに用意されているクエリビルダでは出来ないと思いました（私にはやり方がわかりませんでした）。

```php
$kaigis = DB::table('kaigi')->get();
```
**方法**
方法としては簡単で、DB::tableの返り値は単なるオブジェクトのようです（userクラス単体のインスタンスであれば、Userというインスタンスになり、joinしたクラスで生成するとstdClassになるようです）。
PHPでは未定義のメンバ変数であっても、代入すれば自動的に定義されますので、それぞれのインスタンスにcount情報を付加すれば解決出来ます。

例えば、以下のような感じです。

```php
foreach($kaigis as $value){
  $array = DB::table('kaigi_user')->wehre('kaigi_id', '=', $value->id) -> get();
  $value->sanka_user_count = count($array);
}
```

この例でいえば、生成したインスタンスにsanka_user_countというメンバ変数が付加されてビューに渡されますので、これをビューから参照すればよいです。

（他にもやり方がありそうです。もっとよいやり方があればご教授ください。）
link_toを複数範囲に設定する。

<h2>通常のlink_toヘルパーメソッドの使用法</h2>

link_toヘルパーメソッドは、文字やボタンなどにリンクを貼付けるためのもので、htmlのaタグを生成する。
そのため、通常は以下のように使用する。
 
 



```slim
= link_to "こちらのページ",user_sign_up_page_path,{:class => btn_sign_up}
```




これは、以下のようなHTMLを生成する。

```html
<a class="btn_sign_up", href="/user/sign_up_page">こちらのページ</a>
```






<h2>複数範囲に使用する</h2>
aタグの間に複数のdiv要素を入れて、それらすべてがリンクを持つようにしたい場合がある。そのような意味で複数範囲に使用するとさす。
そのような場合は以下のようにする。

```slim
= link_to user_sign_up_page_path,{:class => btn_sign_up} do
   .user_picture
   .user_input_text
    | 
      こちらのページ
```

これで複数範囲にリンクを指定できる。
Mac開発環境構築メモ


予定より早くmacbookair買えた(retina版待ちたかったけど..)
環境構築していくうえでやったことのメモ

**システム環境設定**

*Dock*

* サイズ小さく
* 自動的に隠すOn

*TrackPad*

* タップでクリックOn
* スクロールの方向：ナチュラルOff

*共有*

* 名前をここで変更する

**Finder**

*環境設定*

* 詳細 > すべてのファイル名拡張子を表示On

*表示*

* タブバーなどバー系諸々表示On
* 表示オプション > 常にリスト表示 > デフォルトとして使用

ここまでGUIで設定したけどTerminalから設定できたりするのかしら？
****

**Terminal**

あとで

**Xcode周り**

あとで

**homebrew/-cask**

あとで

**dotfiles**

あとで

**vi**

あとで

**参考**

http://hakashun.me/?p=149
http://qiita.com/hidekuro/items/4c926587f3a1cb2ec1e0
http://qiita.com/koshihikari/items/8c1d3a0d4df32adba761
http://mizchi.hatenablog.com/entry/2014/03/02/090517

**感想**

数年前macbookpro買ったときは[ここ](http://d.hatena.ne.jp/amachang/20080318/1205824212)参考に設定した
diffコマンドで特定の差異を無視する(-Iオプション --ignore-matching-lines)

完全にタイトル通りですw

```:shell
newgyu:~/temp$ diff a.txt c.txt --unified 
--- a.txt	2014-08-18 23:41:29.164423119 +0900
+++ c.txt	2014-08-18 23:40:55.720423888 +0900
@@ -1,4 +1,4 @@　　

-aaaa: 1234
+aaaa: 12345678
 bbb: /path/to/?query=value
 getHeader("head1"): "xxxxx"
 getHeader("head1"): "xxxxx"
@@ -6,5 +6,5 @@
 getHeader("head1"): "xxxxx"
 getHeader("head1"): "xxxxx"
 getHeader("head1"): "xxxxx"
-ccc: HOGEHOGE
+ccc: FUGAHOGE
 header: hoge=fuga

```

こんなdiffが出るときに ccc が nullじゃなくて何か[A-Z]+ な値（大文字英字）が入っていれば差異は無視したいとき。ありますよね。

表題どおり-Iオプションで正規表現を指定することで除外できます。

```:shell
newgyu@newgyu-UX31E:~/temp$ diff a.txt c.txt --unified -I "ccc: [A-Z]\+" 
--- a.txt	2014-08-18 23:41:29.164423119 +0900
+++ c.txt	2014-08-18 23:40:55.720423888 +0900
@@ -1,4 +1,4 @@
-aaaa: 1234
+aaaa: 12345678
 bbb: /path/to/?query=value
 getHeader("head1"): "xxxxx"
 getHeader("head1"): "xxxxx"
```

ccc: null という時は無視したくないです。

```:shell
newgyu@newgyu-UX31E:~/temp$ diff a.txt b.txt --unified -I "ccc: [A-Z]\+" 
--- a.txt	2014-08-18 23:41:29.164423119 +0900
+++ b.txt	2014-08-18 23:58:43.588399334 +0900
@@ -1,4 +1,4 @@
-aaaa: 1234
+aaaa: 1254
 bbb: /path/to/?query=value
 getHeader("head1"): "xxxxx"
 getHeader("head1"): "xxxxx"
@@ -6,5 +6,5 @@
 getHeader("head1"): "xxxxx"
 getHeader("head1"): "xxxxx"
 getHeader("head1"): "xxxxx"
-ccc: HOGEHOGE
+ccc: null
 header: hoge=fuga
```
VMware ESXi スタンドアロン環境でHWバージョン9以降の仮想マシンを扱う方法（！サポート外！）

VMware ESXi をスタンドアロン環境で利用する場合、vSphreClientで直接ESXiへ接続することになるが、WebClientを経由しないこの利用方法の場合、HWバージョンが9以降の仮想マシンについては、CPU・メモリの割り当て変更といった設定の編集ができない。
新規仮想マシンの作成でもHWバージョン8までしか選択できないのだが、既存の仮想マシンの右クリックメニュー中にある「仮想ハードウェアのアップグレード」を行うとバージョンを9以降に上げることができる。
HWバージョンを上げると仮想マシン構成の上限が引き上がったり、仮想マシンのGuestOS内でCPUの仮想化支援機能(vmx)を利用できるようになったりとメリットがあるので、スタンドアロン環境でもHWバージョン9以降を利用したいケースもあると思われる。
しかしうっかりこのアップグレードを行ってしまうと、以降vSphereClientでは仮想マシンの設定の編集ができなくなり、困ってしまう。
正規の方法としては製品版（ないしは体験版）でvCenterServerを導入し、vSphereWebClientを利用しない限り、HWバージョン9以降の仮想マシンを扱うことはできないのだが、サポート外の方法（※）でスタンドアロンのESXi環境でもHWバージョン9以降の仮想マシンを扱う方法がある。
正確には、HWバージョンをダウングレードする方法がある。その方法は下記の通り。

1. vSphereClientのインベントリ画面にて、対象の仮想マシンを右クリック→「インベントリから削除」する　（誤って「ディスクから削除」しないように）
2. 対象の仮想マシンイメージが格納されているデータストアを参照し、[仮想マシン名].vmxをダウンロードする
3. ダウンロードしたvmxファイルをメモ帳等で開き、「virtualHW.version = "X"」(Xは仮想マシンのHWバージョン)となっている箇所を「virtualHW.version = "8"」と書き換える
4. 編集後のvmxファイルを、データストアブラウザにてダウンロードした場所と同じ場所に上書きでアップロードする
5. アップロードしたvmxファイルを右クリック→「インベントリへの追加」をする

これでvSphereClient上から見える仮想マシンのHWバージョンは8へ戻る。設定の編集も可能となるので、適宜編集し、再度アップグレードすればHWバージョンを9以降の最新に戻すことができる。

※知る限り、あくまでサポート外。VMwareコミュニティに少し記載がある程度で、公式の動作保証はない。ただ個人用途の環境であれば利用価値はあるかと思われる。あくまで個人の責任範囲で実施ください。

※（2014/11/16追記）vSphereClient 5.5 build-1993072にて、HWバージョン9以降の仮想マシンの設定変更も可能となりました。（ただしHWバージョン9以降の機能は利用できません。）
RubyMotionでGUIなしの環境からビルドしたい

Developer Programの証明書をインストールするためのキーチェーンを作る(これはGUIで作った)
キーチェーンの名前は「xxx」だとして以下説明。

そのキーチェーンp12ファイルをインポート

```
security import xxx.p12 -k xxx.keychain -P [p12ファイルを作る時に設定したパスフレーズ] -T /usr/bin/codesign
```

次のようなシェルスクリプトで実行

```
cd /Users/shida/work/xxx/ios
# rvm環境だとして
. /Users/shida/.rvm/environments/ruby-1.9.3-p484@xxx_ios
security unlock-keychain -p [キーチェーンを作る時に設定したパスワード]
rake archive
```

rakeする前に「security unlock-keychain」しとかないと

```
 User interaction is not allowed.
```

みたいなエラーがどうしても出てしまうが、unlockしておくと回避出来るっぽい。
CentOS 7でOS管理者パスワードを忘れた時に変更する方法

# 従来との違い

管理者のパスワードを忘れてログインできなくなった場合はシングルユーザモードに入ってパスワードを変更する、というのがCentOSのみならずLinux全般でのお作法であった。

しかしCentOS 7では旧来のシングルユーザモードに相当するレスキューモードに入ってもrootユーザのパスワードを要求されるので、その手は使えなくなっている。
エマージェンシーモード（レスキューモードとの違いはルートパーティションだけ読み取り専用でマウントする）というのもあるが同様にrootユーザのパスワードを入力する必要がある。

CentOS 7では以下のURLに書かれている方法を使用するが、検証の結果、手順に多少誤りがあるようなので、より良い手順を書き出しておく。
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sec-Terminal_Menu_Editing_During_Boot.html

# パスワード変更の手順

1. GRUB2の起動画面のカーネル選択時に`e`を押して起動オプションの編集モードに入る
1. linux, linux16, linuxefiのいずれかで始まる行があるので、この行の`rhgb`を削除し（さもないとキーボード入力が反映されない）、`LANG=ja_JP.UTF-8`があればこれも削除し（日本語で出力されても文字化けするだけ）、`rw init=/bin/sh`を最後に追加する
1. `Ctrl+x`を押して起動する
1. `passwd`（rootユーザが無効で他に管理者ユーザがあるなら`passwd <管理者ユーザ>`）で任意のパスワードを設定する
1. SELinuxがEnforcingの場合は`touch /.autorelabel`を実行する（通常のモードに戻る際に一度SELinuxのリラベリング処理が走るようになる。これを実行しないとログインできない）
1. `exec /sbin/init`を実行して通常のモードに移行する（上記URLには`exec /sbin/reboot`で再起動しても良いと書いてあるが、これはエラーになった）

# 終わりに

逆に、この手順を封じて管理者パスワードを変更できなくする方法はないか探してみたが見つけていない。
つまり、コンソールの前に座られるとrootユーザのパスワードを好き放題できるということなので、本当にそうされてはならない場合はBIOS/UEFIやディスクにパスワードを掛けるなどをしなければならない。

CentOS 6でも/etc/sysconfig/initのSINGLE行を`SINGLE=/sbin/sulogin`とすればCentOS 7と同様にシングルユーザモードでrootユーザのパスワードを要求されるようになるが、上記手順と同じ方法でパスワードの変更が可能である（SELinuxがEnforcingでも`touch /.autorelabel`は不要だったが）。
Xcode 6 Beta で Storyboard とか シミュレーターでサイズとかレイアウトが変


iOSでHello Worldを表示するアプリケーションを書いてこい、という宿題が出ました。

なんて簡単な宿題だろうか、3分で終わってしまうじゃんか、と思いつつ、Empty Application がないためのロスで1時間使ったあと、速攻で終わらせようとすると・・・

- Storyboardのサイズが変
- シミュレータを起動すると変なとこにボタンとかがある

## Size Classes

iOS 8では1つの storyboard でiPhone と iPad の両方をデザインできる Size Classes というのが追加されています。

ここにも普通に書いてあります。

https://developer.apple.com/library/prerelease/ios/documentation/DeveloperTools/Conceptual/WhatsNewXcode/Articles/xcode_6_0.html

とりあえず無効にしてこれまで通りにするには、
Storyboards のインスペクタで `Use Size Classes` を無効にします。
Xcode 6 Beta で Empty Application テンプレートが消失

　
iOSでHello Worldを表示するアプリケーションを書いてこい、という宿題が出ました。

なんて簡単な宿題だろうか、3分で終わってしまうじゃんか、と思いつつ、いつもの通り Xcode で Empty Application を選んで速攻で終わらせようとすると・・・

## Empty Application がない

![スクリーンショット 2014-08-18 22.35.02.png](https://qiita-image-store.s3.amazonaws.com/0/29846/0c8b80aa-2a26-fae4-def9-227ab8cc3a56.png "スクリーンショット 2014-08-18 22.35.02.png")

ない！
ないんだけど！！！

簡単そうに見えた宿題がいきなり牙を剥いてきた。

## Empty Application テンプレートはなくなりました。

すでに Xcode 6 Beta 3 から Empty Application のテンプレートは用意されなくなっていました。

「黙って Storyboards を使え」ってことなんでしょうか。

http://www.reddit.com/r/iOSProgramming/comments/2a3jyr/xcode_6_beta_3_removes_empty_application_option/

### 対策

1. ないものはない。あきらめる。
2. 旧バージョンからもってくる。
   場所はここ（らしい）  
   `{Xcode.app}/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project Templates/iOS/Application/`
3. ネットで探す

あきらめるのがよいでしょう。
ModのMainクラスをIntelliJのTemplate機能で生成する

```java:MyMod.java
@Mod(modid = MyMod.MODID, name = MyMod.MODNAME, version = MyMod.VERSION)
public class MyMod{
    public static final String MODID = "MyMod";
    public static final String MODNAME = "MyMod";
    public static final String VERSION = "1.0.0";

    @EventHandler
    public void preInit(FMLPreInitializationEvent event) {
    }

    @EventHandler
    public void init(FMLInitializationEvent event) {
    }

    @EventHandler
    public void postInit(FMLPostInitializationEvent event) {
    }
}
```

MinecraftのModを作る時毎回こんなソースコードを書くと思います。
・・・めんどくさいですよね？

ここではIntelliJ IDEAのFile and Code Templates機能を使ってModのMainクラス作成を半自動化する方法を紹介します。

やり方は、
IntelliJのメニューバーからFile>Settingsで設定画面を表示し、
右側のメニューからFile and Code Templatesを選択します。

上部の緑色の＋ボタンを押します。
`Name:ModEntryClass`
`Extension:java`
その下の入力欄には

```text:
 #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end

import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;

@Mod(modid = ${NAME}.MODID, name = ${NAME}.MODNAME, version = ${NAME}.VERSION)
public class ${NAME} {
    public static final String MODID = "${NAME}";
    public static final String MODNAME = "${NAME}";
    public static final String VERSION = "1.0.0";

    @EventHandler
    public void preInit(FMLPreInitializationEvent event)
    {
    }

    @EventHandler
    public void init(FMLInitializationEvent event)
    {
    }

    @EventHandler
    public void postInit(FMLPostInitializationEvent event)
    {
    }
}
```

を入力してOKボタンを押して保存します。

IntelliJの画面に戻ってAlt+1でProjectツリーペインを表示します。
ソースコードのフォルダを右クリックし、New>Java Classを選択します。
`Name:`
`Kind:Class`
のCreate New Classダイアログが表示されるので、ModのMainクラス名を入力し、KindをClassからModEntryClassに変更してOKを押してください。
先ほど作成したテンプレートの${NAME}がModのMainクラス名に置換されたソースコードが生成されます。
超やっつけでネットワーク経由で var_dump 的なことをする

単純に `var_dump()` では困るとき（Ajax とか）。

ファイルに出力したり、

[FirePHP](https://addons.mozilla.org/ja/firefox/addon/firephp/) や [Chrome Logger](http://craig.is/writing/chrome-logger) を使ってみたり、

いろいろ方法はあると思いますが、準備とか無しでもっとやっつけでやりたいとき。

次のような関数をどこかで定義します。

```php
<?php
function trace($data)
{
    static $sock;
    if (isset($sock) === false){
        $sock = fsockopen('192.0.2.123', 12345);
    }
    if ($sock) {
        fwrite($sock, json_encode($data, JSON_UNESCAPED_UNICODE) . "\n");
    }
}
```

192.0.2.123 で nc で待ち受けます。

```console
$ nc -lk 12345
```

PHP で次のように呼び出します。

```php
<?php
trace(123);
trace(['key' => 123]);
```

192.0.2.123 のコンソールに垂れ流されます。

```console
$ nc -lk 12345
123
{"key":123}
```

---

次のように変更すれば、

```php
<?php
function trace($data)
{
    static $sock;
    if (isset($sock) === false){
        $sock = fsockopen('udp://192.0.2.123', 12345);
    }
    if ($sock) {
        fwrite($sock, json_encode($data, JSON_UNESCAPED_UNICODE) . "\n");
    }
}
```

UDP でもできます。

```console
$ nc -ukl 12345 -w 0
123
{"key":123}
```

---

次のように変更すれば、

```php
<?php
function trace($data)
{
    static $sock;
    if (isset($sock) === false){
        $sock = fsockopen('tls://192.0.2.123', 12345);
    }
    if ($sock) {
        fwrite($sock, json_encode($data, JSON_UNESCAPED_UNICODE) . "\n");
    }
}
```

TLS でもできます。

```console
$ sudo openssl s_server -key /etc/pki/tls/private/localhost.key -cert /etc/pki/tls/certs/localhost.crt -accept 12345 -quiet
123
{"key":123}
```
イケてるTechブログを作るときの6つの手順


皆さんは技術系のブログを書くときや、ブログを立ち上げよう！っていう時にどうし(て)ますか？

私もいざ立ち上げようとなったときに、色々調べたんですが、以下を満たすブログ投稿ツールの中では下記の3つが良さそうという結論に至りました。

* markdownに対応している
* syntax-highlight表示ができる
* 設定や投稿などの運用が楽

候補に挙がったのは、

1. [Ghost](https://ghost.org/)
・[medium](https://medium.com/)とtumblrの間という感じのTeck系にも使えてオシャレで高機能なブログ投稿ツール。
・syntax-highlightにも対応
・markdownで書ける
・有料でぼちぼち高いなという印象(無料お試しで使ってみたけど、ツールとしてはかなり良い！！)

2. [WordPress](https://wordpress.com/)
・高機能だけど、設定がめんどくさいのと作り込もうとすると微妙に時間がかかる

3. [Tumblr](https://www.tumblr.com/)
・高機能で設定が簡単。
・基本無料
・syntax-highlightにも対応させられる
・markdownで書ける


以上の特徴から、うちはTumblrでTechBlogを書くことに決定！！

となれば、Tumblrでイケてるブログを作ろうってことになるので、以下Tumblrでイケてる(雰囲気の)Techブログを作るときの手順をまとめてみました。


##1. tumblrでコードがハイライト表示されるようにする
syntax-highlightができるようにするには、google-code-prettifyを読み込ませるのが一番早そうです。
```<head>```タグの中に下記のコードを挿入すればgoogle-code-prettifyでsyntax-highlightが設定できます。


```headタグ内
<!-- Code syntax highlight -->
<link href="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css" type="text/css" rel="stylesheet" />
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript " src="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js"></script>
<script type="text/javascript">
$(function(){ 
    $('pre').css({
        'overflow-x': 'scroll',
        'background-color': '#f6f6f6',
        'border': '1px dotted #ccc',
        'padding': '0.8em'
    });
    $('pre code').addClass('prettyprint');
    prettyPrint();
});
</script>
```

##2. デザインをカスタマイズする
cssもカスタマイズできるので、theme gallaryから探してみるか自分でcssを書いてカスタマイズしてみましょう！
[google-code-prettifyのデザインギャラリーはこちら](http://google-code-prettify.googlecode.com/svn/trunk/styles/index.html)

##3. イケてるエディタと連携して、Tumblrに投稿できるように設定する
一番おすすめなのは、「StackEdit」というオンラインエディタです。
[StackEditはこちら](https://stackedit.io/)

「StackEdit」がイケてる理由は下記7つ。

* マークダウンに対応
* 主要な記法はショートカットが用意されている
* リアルタイムにプレビューが見れる
* Evernote, Dropbox, Tumblr, Blogger, Gist, Google Drive, WordPress, SSH serverなど主要なサービスやサーバーとの連携・同期が簡単
* 画像も埋め込める
* 文字数カウンタや行数、パラグラフ数などもリアルタイムにチェックできる
* HTMLコードとしてexportもできる

※細かいことを挙げればもっとある。

##4. シェアボタンを導入する

###1. 自分で導入
Tumblr自体、HTMLコードを編集できるので、自分で入れたい方はソースコードをいじって導入できます。

###2. 簡単におしゃれなシェアボタンを導入する
すごく手軽におしゃれなシェアボタンを導入するならAddThisが提供しているシェアツールを使うといいです。
[AddThisのシェアツールはこちら](http://www.addthis.com/)

AddThisで生成したコードをTumblrのHTMLコードの編集画面で挿入すれば導入完了！

##5. GoogleAnalyticsを導入する
下記リンクを参照してGoogleAnalyticsを導入してください。
[TumblrでGoogleAnalyticsを設定する](https://www.tumblr.com/docs/ja/google_analytics)


##終わりに

こんな感じで、とりあえず自分のテストアカウントを作ってみました！
[実際に作ったブログはこちら](http://okappy.tumblr.com/)


うちも頑張って技術のアウトプットをしていこうと思います！！
[Atrae Tech Blog](http://atraetech.tumblr.com/)
UIAppearanceを使って[UINavigationBar setTranslucent:NO];


昔話をします。　　
　　


かつて、iOS7がありました。  
iOS7では、次のコードがクラッシュしたといいます。  

```objc
[[UINavigationBar appearance] setTranslucent:NO];
```

コンパイル時にエラーを検出できず、実行時にクラッシュして多くの開発者が涙を流しました。  


ある開発者は、こんなコードをアプリのあちこちに書き散らしました。

```objc
[navigationController.navigationBar setTranslucent:NO];
```

また、他の開発者はこんなクラスを作りアプリ全体で使うようにしました。

```objc
@implementation HRCommonNavigationViewController

- (instancetype)initWithRootViewController:(UIViewController *)rootViewController {
    self = [super initWithRootViewController:rootViewController];
    if (self) {
        self.navigationBar.translucent = NO;
    }
    return self;
}
@end
```

1年経ち、iOS8が登場しました。
するとどうでしょう、iOS7では動かなかった`[[UINavigationBar appearance] setTranslucent:NO];`が動くようになり、`UINavigationBar`の`translucent`をったった一行で変更できるようになりました。
そして、アプリ全体に散らばった微妙なコードを前に再び涙を流したということです。

ただ、`UINavigationBar`の透過をオフにしたかっただけなのです。

昔話終わり。

## UIAppearance

**という訳なので、以下はiOS7にも対応する必要のある開発者にだけ有益です。**  
また、公式のドキュメントを見つけられていない部分が幾つかあります。  

### 何故クラッシュするか


[UI_APPEARANCE_SELECTOR](https://developer.apple.com/library/ios/recipes/UIAppearanceContainer_Protocol/Reference/Reference.html#//apple_ref/c/macro/UI_APPEARANCE_SELECTOR)

> The property type may be any standard iOS type: id, NSInteger, NSUInteger, CGFloat, CGPoint, CGSize, CGRect, UIEdgeInsets or UIOffset. Axis parameter values must be either NSInteger or NSUInteger. UIKit throws an exception if other types are used in the axes.

iOS7で例外がthrowされるのは、たぶんUIAppearanceは`BOOL`に対応していないため。

また、とあるブログによると、

http://petersteinberger.com/blog/2013/uiappearance-for-custom-views/

> Update: As of iOS 8, BOOL is now supported for UIAppearance.

とのこと。

確かに、iOS8では`UIAppearance`でBOOLをセットしてもクラッシュしません。

コンパイルエラーにならず、iOS7で動かすとクラッシュするアプリが激増しそうな予感がしますがどうなんでしょう。

てっきり`UINavigationBar`が対応していないのかと思いましたが、`UIAppearance`の制限のようです。  


## UIAppearance+Category

```objc
NSLog(@"[UINavigationBar appearance] = %@", [UINavigationBar appearance]);
```
実行してみると分かりますが、`_UIAppearance`は呼び出されたメソッドを`NSInvocation`として保持して必要な時に呼び出しているだけなので、カテゴリが使えます。

カテゴリで追加したメソッドもUIViewがUIWindow以下にaddSubViewされたタイミングで実行されます。

>iOS applies appearance changes when a view enters a window,
[UIAppearance_Protocol](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIAppearance_Protocol/index.html)


ただし、(iOS7)で使えるのはパラメーターが、
`id`,` NSInteger`, `NSUInteger`, `CGFloat`, `CGPoint`, `CGSize`, `CGRect`, `UIEdgeInsets` or `UIOffset`の場合だけ。
これ以外では、`NSInvalidArgumentException`がthrowされます。

なので、こんなコードを書きました。

```objc
// UINavigationBar+Translucent.m
@implementation UINavigationBar (Translucent)
- (void)hr_setTranslucent:(NSInteger)flag {
    [self setTranslucent:(BOOL) flag];
}
@end

// AppDelegate.m
[[UINavigationBar appearance] hr_setTranslucent:0];
```

AppDelegateで呼ぶのはproxyのほうなので`hr_setTranslucent:`の中が実行されるのは、`UINavigationBar`がaddSubViewされたタイミングです。


NSIntegerに変換して、UIAppearanceに登録して、実行時にBOOLに直すだけ。
アホかと思いますが、これが正しく動きます。

是非、明日からお使いください。
Apacheのチューニングメモ

個人的Apacheチューニングのメモ。
間違いがあったら教えて下さい！

# prefork

## 前提
Apacheでは、リクエストはApacheの子サーバプロセスが処理する。

子サーバプロセスは動的にforkで生成されたり、殺されたりする。
が、forkはとても重い処理なので、forkが発生しないように設定するのがよい。

## チューニング方針
負荷が高かろうが低かろうが常に一定数のプロセスが動いている状態にする。

## preforkの動作
MaxClientsは絶対値。
子プロセス数はこの値を超えない。

（以下正確ではないですが簡単に）
Apacheは負荷が高くなってきたら

* 子プロセスを生成していく
* アイドル状態の子プロセスはMinSpareServers以上になるよう維持
* MaxClients以上の子プロセスは生成しない
* MinSpareServersよりMaxClientsが強い

負荷が低くなってきたら

* プロセスがアイドル状態になっていく
* アイドル状態の子プロセスがMaxSpareServers以下になるよう殺す

負荷が低い状態が続くと

* 子プロセスをMinSpareServersになるまで殺す

## 結論
MaxClients = MinSpareServers = MaxSpareServers = N
にすると、

* 低負荷状態ではMinSpareServers=N個のアイドルプロセスが確保される
* 高負荷状態では最大MaxClients=N個のプロセスしか作成されない
* 応答しているプロセスが0でもMaxSpareServers=N個のアイドル状態は許されている

つまり、forkが発生しません。

Nですが、
(サーバのメモリ)/(1個の子プロセスが使用する最大のメモリ量)
が上限値となります。
子プロセスが使用するメモリ量はモニタリングして把握しましょう。

以下、Nを500とした時の設定サンプルです。

```
StartServers 500
MaxClients 500
MinSpareServers 500
MaxSpareServers 500
ServerLimit 500
MaxRequestsPerChild 0
```

## 性能パラメータ
### StartServers
起動時に生成される子サーバプロセスの数。デフォルトは5。
子サーバプロセス数は負荷に応じて動的に変化するのであまり意味はない。
常に動かしときたい数に設定しとくのがベター。

> http://httpd.apache.org/docs/2.2/ja/mod/mpm_common.html#startservers

#### 設定サンプル
```
StartServers 5
```

### MinSpareServers
アイドル状態にいる子サーバプロセスの最小（希望）個数。デフォルトは5。
つまり、常にこの数のプロセスはアイドルでいてくださいね、という値。

アイドル状態の子サーバプロセスが足りなければ、最高で1プロセス/秒のペースで新規に子サーバプロセスを生成する。

この値を大きくするのは悪い発想らしい。

> http://httpd.apache.org/docs/2.2/ja/mod/prefork.html#minspareservers

#### 設定サンプル
```
MinSpareServers 5
```

### MaxSpareServers
アイドル状態にいる子サーバプロセスの最大（希望）個数。デフォルトは10。
つまり、アイドル状態の子サーバプロセスの数がこの値をこえた時は小サーバプロセスを殺してくださいね、という値。

この値を大きくするのは悪い発想らしい。

#### 設定サンプル
```
MaxSpareServers 19
```

### MaxClients
応答できる同時リクエスト数。デフォルトは256。
つまり、起動される子サーバプロセスの最大数。

> http://httpd.apache.org/docs/2.2/ja/mod/mpm_common.html#maxclients

#### 設定サンプル
```
MaxClients 256
```

### ServerLimit
`MaxClients`に指定可能な値の上限。
つまり`MaxClients`より多い値ならなんでもよい。

が、あんまり大きすぎると余分な未使用共有メモリが割り当てられたり、不安定になる。
`MaxClients`がデフォルト（256）より大きい場合のみ、適切な値を設定する。

> http://httpd.apache.org/docs/2.2/ja/mod/mpm_common.html#serverlimit

#### 設定サンプル
```
ServerLimit 256
```

### MaxRequestsPerChild
個々の子サーバプロセスが扱うことのできるリクエストの総数。デフォルトは10000。
つまり、子サーバプロセスが起動してからこの数だけリクエストを捌くと死ぬ。

0に設定すると無制限。

メモリリークなど起こった場合リークし続けるが、0にしておけばforkされる回数は大幅に減る。

> http://httpd.apache.org/docs/2.0/ja/mod/mpm_common.html#maxrequestsperchild

#### 設定サンプル
```
MaxRequestsPerChild 10000
```
gitで未追跡（untracked)なファイルもまとめて退避(stash)する


# stash便利ですよね

git stashを使えば作業中のファイルを一旦退避させておいて、別のブランチで作業し、その後また戻ってきて再開するってことができますね。

```
$ git branch
* original
hogehoge
master 

# 作業中のファイルを一旦退避
$ git stash
# 退避できたか確認してみる
$ git stash list

# ブランチ変更
$ git checkout hogehoge
$ ~hogehogeブランチでなんか開発作業~

#　ブランチを元に戻す
$ git checkout original

# 退避を元に戻す
$ git stash pop
```

# でもstashってtrackedなファイルだけなんでしょ・・・・

git stashだと追跡してる(tracked)なファイルだけを退避してくれます。
なので追跡してない(addしてない）ファイルはそのまま残っちゃいます。

その状態でブランチ切り替えしたら追跡してないファイルがそのまま次のブランチでも残るので変更が混ざってしまいそうで嫌になります。


# そんなときは-uオプションを使いましょう

```
#以下どちらでも可能
$ git stash -u
$ git stash --include-untracked

#忘れそうならメッセージも添えられます
$ git stash -u "あんな変更やこんな変更"
```

こうすれば追跡してないファイルも含めて退避できますし、後で元通りにも戻せます。

ちなみに、CentOS6.5だとgit1.7.1とかがはいってたりしますが、それだと古すぎて使えません。
できればgitは2.x系をソースからコンパイルするなどしてインストールしておきましょう。


# いらなければdropしちゃいましょう。

別のブランチで作業するために退避させる時だけでなく、いらないものをまとめて消すことにも使えます。

F／Wの自動生成コマンドなどで自分が変更したもの以外のものまで生成されちゃって、なんかリポジトリに登録されているものと微妙に違いがあった場合、それをそのままコミット＆プッシュしちゃうと誰かとコンフリクト起こしちゃう可能性があります。
まぁコンフリクト起こしてでもやる必要あったりしますが・・・・（汗

取り急ぎリリースしたい場合には自分の変更に関するものだけコミットしてあとの生成物は華麗にスルー・・・というか綺麗に消し去りたい場合は以下のようにできます。


```
$ git add <コミットしたいファイル>
$ git commit -m "このファイルは残す"
$ git stash -u "こいつらはいらないファイルたち"

# いらないファイルは全部消し去る
$ git stash drop
```

untrackedは残っているとresetできなかったりいろいろ面倒なので綺麗さっぱりしたいときにはこれが使えます。
そもそも自動生成物なら、間違って消してもまた生成しなおせばいいだけなので問題ありませんね。
自動生成以外のファイルはくれぐれも慎重にdropしましょう。


なお、追跡外のファイルだけを削除するなら以下もできます。

```
# 実際に消す前に消すファイルの一覧を確認
$ git clean -n

# 消す！(.gitignoreで指定したものは削除されない）
$ git clean -f

# .gitignore分も含めて消したいなら
$ git clean -xf
```

# 退避してそのまま作業すすめちゃったらstash内容を別ブランチに移しましょう

stashしたもののそのままそのブランチで作業したり、別のブランチからもどってきた後popするの忘れて作業続行したりすることもあります。

そんなときに思い出したかのようにpopしちゃうとコンフリクトする可能性があるので、stashしていた内容を一旦別ブランチに切り出しましょう。


```
# とりあえず変更をコミット
$ git commit -m "変更をコミット"

# 一旦別ブランチにstash内容を取り出す
$ git stash branch tmp-branch

# あとはマージするなりrebaseするなりお好きにどうぞ
$ git merge <元ブランチ>
```


これでもうstashは怖くありませんね
XAMPPの中にあるMYSQLにMySQL Workbenchで接続する方法


ローカルでDBをいじりたいときにmysqlを直接ダウンロードする方法と
XAMPPをダウンロードしてその中に入ってるmysqlを起動させる方法と2種類あると思います。
他にもあると思いますが、僕はこの2種類を主に使います。
ターミナルからmysqlを起動させる方法もあるのですが、GUIを使う場合```MySQL Workbench```
というツールを使っています。

<h3>接続方法</h3>
そのときにXAMPPの中にあるMYSQLに接続する設定を調べたので書いておきます。
![スクリーンショット 2014-08-18 21.51.56.png](https://qiita-image-store.s3.amazonaws.com/0/44144/533f9ceb-e87a-f3fc-1090-1fb6b5e0c806.png)

結論からいうと、この画像の通りにすれば接続できるはずです。

```Connection Name```には好きな名前を。

```Connection Method```には```Local Socket/Pipe```を。

```Socket/Pipe Path```には```/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock```を。

```UserName```には作成したユーザー名を(rootでもいいと思います)。

これで以上です。

するとXAMPPの中にあるMYSQLに接続できるはずです！
Slack で別ドメインの人を招待して運用する方法良い方法(調査中)

Slack で他のドメインの人を招待して運用するにはどうしたら良さげか考えてみたメモ。

結論から書くと、調査中で、良い方法が見つかってないです。

Slack 自体の使い方とか便利な使い方とかは http://qiita.com/tags/slack とかググるといっぱい出てくるので省略。

## まず、外部ドメインの招待を有効にする

自分が管理者で、招待したいチームの設定で Signup Mode を Invitation Only にする。

```
Team Administration > Administration - Setting > Signup Mode : Invitation Only
```

これで、`Team Administration > Administration - Setting > Invitations` から別ドメインの人へ招待を出せるようになる。

Invite New Members ボタンで表示される画面のメールアドレス欄に任意のメールアドレスを入力して、 Send Invitations すると、そのメールアドレスに招待が届く。

届いたら後は普通に参加してもらう。

この時、招待を受け取った人にアカウントが無い場合は新規作成されるはず。

## 外部ドメインの人を招待した時の挙動

(当たり前なんですが、)外部ドメインの人を招待した時の挙動としては以下のようになる。

- 一度招待した人は、入ろうと思えば、そのチームの全ての Channel に入れる
- Private Group は、同一ドメインの人と同じ扱いで、Private Group に招待しない限り見れない。
- DM は招待したチーム内の DM として扱われ、招待した人が別のチームに所属している場合、招待したチームの画面(URL)へアクセスしなければならない
- 通知自体は別のチームに所属していてもちゃんと届く
- ブラウザでチームを切り替えるには、チームメニューっぽい場所の「↓」から Switch to (other team) を選択する

複数のプロジェクトを横断して参加してる・して欲しい時、また、各々プロジェクト間で参加者が違う時、上記のような状態になるとちょっとダメ。

- 各プロジェクトで channel 使いたい
- けど、この状態だと関係ない人も関係ない channel に入ろうと思えば入れてしまうっぽい
- かと言って、 Private Group だけで管理すると、単一スレッドになるので、あんまり嬉しくない。
- 出来れば、各プロジェクトごとに目的別とかで Channel を使いたい。

## どうしたら良さそう？

相手に「これとこれとこれの Channel に Join してくださいー」とするのが良いかな？

それでも大丈夫な場合は良いけど、基本的にはダメな気がする。

で、各プロジェクトごとに Slack 用意したら良さそう！と、思ったわけですが、これは利用上良いのか悪いのかまだ調べてません。

外部のドメインの人を巻き込んだ複数のプロジェクトで効率的に Slack を運用している方がいたら是非教えて頂けないでしょうか？
高速、高精度、省メモリな線形分類器、SCW 

今回は機械学習アルゴリズム、SCW(Exact Soft Confidence-Weighted Learning)の紹介です。

まずはどれだけすごいか見てみてください。

```
SCW    time:0.003194    accuracy:1.000
SVC    time:0.010297    accuracy:0.903
```

使用しているデータセットはscikit-learnの手書き文字認識用のものです。

上がSCW、下がscikit-learnのSVCで学習、分類した結果です。timeは学習にかかった時間、accuracyは精度を表しています。

結果を見ればわかるように、SCWは非常に高速に学習することができます。
また、SCWは逐次学習が可能です。すなわち、データをひとつずつ入力しても学習することができます。つまり、データを全てメモリ上に展開して学習させなくてもよいのです。

精度はデータセットに依存します。というのも、SCWは線形分類器だからです。
線形分離不可能なデータに対してはSCWでは精度が落ちてしまいますが、線形分離可能、もしくはそれに近いかたちで分布しているデータに対しては高い精度を得ることができます。

scikit-learnの手書き文字認識データセットは線形分離可能だったようで、精度100%という結果が得られました。

アルゴリズムについてですが、ここでは解説は行いません。
すでにかずー氏が[アルゴリズムの解説](http://kazoo04.hatenablog.com/entry/2012/12/20/000000)をブログに上げているのでそちらをご覧ください。
また、もとの論文は[こちら](http://icml.cc/2012/papers/86.pdf)にあります。

SCWのコードは[私のGitHub](https://github.com/IshitaTakeshi/SCW)に置いてあります。
以下がテストに用いたコードです。SCWのリポジトリをcloneした後、scw.pyが置いてるディレクトリで以下のコードを実行してください。
テストコードは[Gist](https://gist.github.com/IshitaTakeshi/58fbf89e053206440cd9)にも上げてあるのでそちらからもどうぞ。

```py:digits_recognition.py
from __future__ import division

import time

import numpy as np
from sklearn.datasets import load_digits, make_classification
from sklearn.svm import SVC
from matplotlib import pyplot

from scw import SCW1


def generate_dataset():
    digits = load_digits(2)

    classes = np.unique(digits.target)
    y = []
    for target in digits.target:
        if(target == classes[0]):
            y.append(-1)
        if(target == classes[1]):
            y.append(1)
    y = np.array(y)

    return digits.data, y


def calc_accuracy(resutls, answers):
    n_correct_answers = 0
    for result, answer in zip(results, answers):
        if(result == answer):
            n_correct_answers += 1
    accuracy = n_correct_answers/len(results)
    return accuracy


X, y = generate_dataset()

N = int(len(X)*0.8)
training, test = X[:N], X[N:]
labels, answers = y[:N], y[N:]

scw = SCW1(len(X[0]), C=1.0, ETA=1.0)
t1 = time.time()
scw.fit(training, labels)
t2 = time.time()
results = scw.predict(test)
accuracy = calc_accuracy(results, answers)
print("SCW    time:{:3.6f}    accuracy:{:1.3f}".format(t2-t1, accuracy))

svc = SVC(C=10.0)
t1 = time.time()
svc.fit(training, labels)
t2 = time.time()
results = svc.predict(test)
accuracy = calc_accuracy(results, answers)
print("SVC    time:{:3.6f}    accuracy:{:1.3f}".format(t2-t1, accuracy))
```
Eclipseのカスタマイズメモ (1) Gradle対応


#1. 目的
今までAntしか使ったことがなく、Mavenは敬遠してたけど、
このままずっとAntを使い続けて新しいビルドツールの便利な点を使わないのはもったいないので、
Mavenをすっ飛ばしてGradleの使い方を覚えていこうと思う。

#2. 環境構築
MacBook Proへインストールしてみる

##2-1. Gradleのインストール

###2-1-1. HomeBrewのインストール
下記コマンドを実行

```Bash
$ ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
```

Enterを押下してインストール

###2-1-2. Gradle本体のインストール
下記コマンドを実行

```Bash
$ brew install gradle
```

バージョンの確認

```Bash
$ gradle -v
```

###2-1-3. Spring Tools Suite　のインストール
Eclipseを起動し、メニューバーの「ヘルプ」-「Eclipseマーケットプレース」を起動し、"STS" を検索

Spring Tools Suite の Luna用のバージョンを探し、インストールを実行
実行後、再起動を促されるのでEclipseを再起動

###2-1-4. Gradleプラグインのインストール
再起動後、初期画面に STS Dashboard が追加されるので、開く。

「拡張」タブを開き、"Gradle"を検索。
Gradle Supportが一覧に表示されるので選択し、「インストール」を押下。

###2-1-5. Gradleプロジェクトの作成
Project Explorer上で右クリック - 「新規」-「その他」-「Gradle」-「Gradleプロジェクト」を選択し、「次へ」を押下
プロジェクト名を入力し、サンプル・プロジェクトのJava QuickStartを選択し「完了」をクリック


ここまででEclipse上で開発できる状態になった。 (2014/08/18)
Ruby | Gviz gem の内部 DSL の基本

# Ruby | Gviz gem の内部 DSL の基本
## 概要
Gviz gem の内部 DSL の基本構成要素について。

※ 私は graphviz を単独で使ったことが無い状態で Gviz を利用しはじめています。
その点において、おかしな記述があるかもしれません。

## node
ノード。 gviz の DSL では、 *route* + ノード名（シンボル） によって記述する。
引数が可変長になっているので複数指定も可能。

### ソースコード
~~~ruby:nodes.rb
require 'gviz'
Graph do
  route :Hubot
  route :Kandan
  route :GitLab, :GitLabCI
  save(:nodes, :png)
end
~~~

### 出力

![nodes.png](https://qiita-image-store.s3.amazonaws.com/0/43480/307ab92d-b699-4f65-8bbf-54bafb409ab3.png)

nodeset によって、定義済みの node のリストにアクセスできます。
Hashを取得したい場合は、 @nodes でアクセスできます。

### ソースコード

~~~ruby:nodeset.rb
require 'gviz'
require 'pp'

Graph do
  route :Hubot
  route :Kandan
  route :GitLab, :GitLabCI
  pp nodeset
  pp @nodes
end
~~~

### 出力

~~~
$ ruby nodeset.rb
[#<struct Gviz::Node id=:Hubot, attrs={}>,
 #<struct Gviz::Node id=:Kandan, attrs={}>,
 #<struct Gviz::Node id=:GitLab, attrs={}>,
 #<struct Gviz::Node id=:GitLabCI, attrs={}>]
 {:Hubot=>#<struct Gviz::Node id=:Hubot, attrs={}>,
 :Kandan=>#<struct Gviz::Node id=:Kandan, attrs={}>,
 :GitLab=>#<struct Gviz::Node id=:GitLab, attrs={}>,
 :GitLabCI=>#<struct Gviz::Node id=:GitLabCI, attrs={}>}
~~~

## edge
エッジ。gviz の DSL では、 *route* + エッジ（Hash） によって記述する。
引数が可変長になっているので複数指定も可能。

### ソースコード
~~~ruby:edges.rb
require 'gviz'
Graph do
  route Kandan: :Hubot
  route Hubot: :Kandan
  route GitLab: :Hubot
  route GitLab: :GitLabCI
  save(:edges, :png)
end
~~~

### 出力

![edges.png](https://qiita-image-store.s3.amazonaws.com/0/43480/05ae54cf-3e74-33e4-b67d-49c531eff228.png)

## edgeset
node と nodeset 、 edge と edgeset は同じ構成なので
edgeset に関する説明は省略。

## rank
グラフのランクを以下のシンボルから設定します。

~~~ruby
[:same, :min, :max, :source, :sink]
~~~

### 設定例1

~~~ruby:rank.rb
require 'gviz'
Graph do
  route Kandan: :Hubot
  route Hubot: :Kandan
  route GitLab: :Hubot
  route GitLab: :GitLabCI
  rank :min, :Kandan
  rank :same, :GitLab, :Hubot
  rank :max, :GitLabCI
  save(:rank1, :png)
end
~~~

### 出力

![rank1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/62b65482-d843-12c3-4ac1-466dacfd2c05.png)

### 設定例2

~~~
require 'gviz'
Graph do
  route Kandan: :Hubot
  route Hubot: :Kandan
  route GitLab: :Hubot
  route GitLab: :GitLabCI
  rank :max, :Kandan
  rank :same, :GitLab, :Hubot
  rank :min, :GitLabCI
  save(:rank2, :png)
end
~~~

### 出力

![rank2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/13946e05-e940-c74a-75a5-c96e4270b1ae.png)

## subgraph

サブグラフ。

### ソースコード

~~~ruby:subgraph.rb
require 'gviz'
Graph do
  route Kandan: :Hubot
  route Hubot: :Kandan
  route GitLab: :Hubot
  route GitLab: :GitLabCI
  subgraph do
    global label:'GitLab CI'
    route :GitLabCI => :GitLabCiRunner1
    route :GitLabCI => :GitLabCiRunner2
  end
  save(:subgraph, :png)
end
~~~

### 出力

![subgraph.png](https://qiita-image-store.s3.amazonaws.com/0/43480/49fe2e98-9661-155f-8b38-2efbe07f748e.png)

## 参照
* Gviz 作者さんの Gviz 関連記事の目次ページ
http://melborne.github.io/2014/02/27/gviz-posts/

* Gviz GitHub
https://github.com/melborne/Gviz
配列を渡して正規表現オブジェクトをつくる

# Regexp.union以前

どれかにマッチする正規表現を動的に作りたいという時。
なにも考えずに普通に書くと、

```ruby:string_regexp.rb
words = %w(foo bar baz)
regexp = Regexp.new(words.join('|'))
```

こんな風に書くと思います。（僕はそうでした）

## 悪くないけど

`"foo"`、`"bar"`、`"baz"` のいずれかにマッチする
正規表現である`"foo|bar|baz"`という**文字列**を組み立ててから、
それをRegexp.newに渡して正規表現オブジェクトを得る。
というのが少し遠回りですね。

# そこでRegexp.union

```ruby:regexp_union.rb
words = %w(foo bar baz)
regexp = Regexp.union(words)
```

一度、文字列で正規表現を組み立てたりせず
直接配列を渡して、正規表現オブジェクトを作っているので
Regexp.unionを使わないコードと比べて、より直感的になったのではないでしょうか。

# 引数の配列には正規表現オブジェクトも入れられる

```ruby:regexp_union_regexp.rb
parts = [/^foo$/, /^bar/, /baz$/]
regexp = Regexp.union(parts)
```

文字列（というか多分 ~~to_s~~ `to_str`できるオブジェクト）だけでなく
正規表現そのものを要素に持つ配列も渡すことができます。

# 参考

[class Regexp](http://docs.ruby-lang.org/ja/2.0.0/class/Regexp.html)
Rails4でSubmitボタンにFontAwesomeのアイコンを埋め込む


色々調べたところ、sanitizeを使う方法や、ブロックで渡す方法などがヒットしましたが、どれもうまくいきませんでした。

最終的にStackOverflowの[ここ](http://stackoverflow.com/questions/14999294/bootstrap-icon-in-a-submit-tag-rails-form)を参考にしたところうまくいきました。

Formのsubmit_tagを使うのがそもそも駄目だった様子。
**button_tag**を使うのがポイントでした。

### ☓

```ruby:index.html.erb
<%= f.submit sanitize('<i class="fa fa-search"></i>検索'), :class =>"btn btn-default btn-s-md" %>
```

### ◯

button_tagであれば他のどの方法でもOKでした。

```ruby:index.html.erb
<%= button_tag :type => "submit", :class =>"btn btn-default btn-s-md" do %>
  <i class="fa fa-search"></i>検索
<% end %>


<%= button_tag sanitize('<i class="fa fa-search"></i>検索'), :type => "submit",
	:class =>"btn btn-default btn-s-md" %>


<%= button_tag '<i class="fa fa-search"></i>検索'.html_safe, :type => "submit", 
	:class =>"btn btn-default btn-s-md" %>
```



### 参考

[bootstrap icon in a submit_tag rails form](http://stackoverflow.com/questions/14999294/bootstrap-icon-in-a-submit-tag-rails-form)
jekyllとcompassとlivereloadでフロントエンド開発

Gemfileを以下のように編集。

```rb
# -*- mode: ruby; -*-

source 'https://rubygems.org'

gem 'jekyll'
gem 'jekyll-compass'
gem 'compass', '~> 0.12.7'
gem 'breakpoint'
gem 'guard'
gem 'guard-jekyll-plus', '~> 1.4.9'
gem 'guard-livereload', '~> 2.3.0'
```

`bundle install`を実行。

```shell-session
bundle install
```

Guardfileを編集。

```rb
guard 'jekyll-plus', :serve => true do
  watch /.*/
  ignore /^_site/
end

guard 'livereload' do
  watch /.*/
end
```

`guard`を起動。

```shell-session
guard
```

`http://localhost:4000`にアクセス。

Livereloadのブラウザ拡張をインストール。
http://feedback.livereload.com/knowledgebase/articles/86242-how-do-i-install-and-use-the-browser-extensions-

Livereloadのボタンを押すと、guardを起動したコンソールで、`22:46:58 - INFO - Browser connected.`と表示される。

これでファイルを編集するとブラウザが自動更新されるようになる。
初心者がPythonの練習

初心者のボクがPythonに挑戦します。
追記：Python3形式にしました。

# 環境
[Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja) で実行しています。

~~環境構築についてはUbuntuの中で試します。~~
~~http://qiita.com/pugiemonn/items/7257aa01897011469131~~

# HelloWorld
printでHelloWorldという文字列を出力します。

```python:HelloWorld!
print("HelloWorld!")
```
# 変数
変数に10を代入します。

```python:Python
val_int = 10
val_float = 1.23
val_boolean = True
```
TrueやFalseは頭文字が大文字です。

## 複数代入
`,`を並べると変数に複数代入できます。

```python:変数を複数代入
a, b, c = 10, 30, 40
print(a)
print(b)
print(c)

#出力
10
30
40
```

## リスト
リストは値が順番に並べられているものです。

```python:Python
number = [2, 40, 3]
string_text = ['a', 'b', '8']



# リストのアクセス方法
>>> number[1]
40
```

## ディクショナリ
キーとバリューがペアのハッシュのことです。ディクショナリは順番を保持しません。

```python:Python
args = {80: 30, 2: 'piyo', 'hoge': 90}

# ディクショナリのアクセス方法
>>> args[80]
30
>>> args["hoge"]
90
```


# コメント
## 1行コメント
コメントは#を使用します。

```python:Python
# 1行のコメント
```
## 複数行コメント
複数行のコメントです。

```python:Python
"""
コメントだよおおおおおおおお
"""
```

# 四則演算
計算しちゃいます。

```python:Python
hoge = 100 + 2200
hoge = hoge / 100
hoge = hoge * 2

print hoge # 46
```

## 階乗

```python:Python
hoge = 10 ** 2

print hoge # 100
```

# for ループ

```python:ループ
i = 0
for _ in range(10):
  i += 1
  print i

# 出力
1
2
3
4
5
6
7
8
9
10
```

# 条件文 if 文
if 文の使い方です。

```python
vv = 50

if vv < 100:
  vv = '00'
  
print(vv)

# 出力
00
```

## elsif 文
if がもしもしならば、あるいはもしの場合に `elsif` を使用します。

```python
vv = 200

if vv < 100:
  vv = '00'
elif vv < 1000:
  vv = '0' + str(int(vv / 100))
  
print(vv)

# 出力
02
```



# 標準入力

```python:Python
h1 = input()

print(h1)

# 入力
10

# 出力
10
```

## 標準入力の型

```python:Python
h1 = input()
print(type(h1))

# 入力
10

# 出力
<class 'str'>
```
入力すると `str` 型になります。

# 関数
インデントで管理しています。

```python:Python
def spam():
  hoge = 12
  return hoge
        
print(spam()) # 12
```

# 文字列の結合
`+`で文字列を結合できました。

```python:文字列の結合
hoge = 'hoge'
print('piyo' + hoge)#　piyohoge
```

# 感想
お疲れ様でした(☝ ՞ਊ ՞)
RailsとGoogle Maps API / Turbolinksでマップが読み込まれない時の対処法

またまたTurbolinkネタ。
よくつまづくからメモが多いのです。

<!-- extract -->

結論。ドキュメント通りにやる。
これです…。
https://developers.google.com/maps/documentation/javascript/tutorial

非同期に読み込むにはこんなコード。ドキュメントより。

```js
function loadScript() {
  var script = document.createElement('script');
  script.type = 'text/javascript';
  script.src = 'https://maps.googleapis.com/maps/api/js?v=3.exp&' +
      'callback=initialize';
  document.body.appendChild(script);
}
```

　　
普通に読み込む時はapiキーが必要なので、必要だろうと思って付け加えるとダメです。

```js
//こうすると…
script.src = 'https://maps.googleapis.com/maps/api/js?' +
	  	'key=XxxxxyC9HPscInexxxxxlYsUCekQLkHOK06ST3c'

//こんなエラーがでます。
Failed to execute 'write' on 'Document': It isn't possible to write into a document from an asynchronously-loaded external script unless it is explicitly opened. 
```

　　
あと、コールバックで何もやらないやといって```callback=initialize```を省略してもダメです。
APIはpage:loadのタイミングで読み込みたいけど使うのは後、みたいな時。

```coffee
initialize = ->
  # do nothing
```

　　
とかやってコールバック用の関数を用意してください。
　　

Turbolinksなので、
$(document).on('page:load', ready)のタイミングで実行するんですが、
何回も読み込んでしまってもダメなので、下のようになりました。

```coffee
window.initializeMap = ->
	# do nothing

#Google maps apiの動的読み込み
getGoogleMapApi = ->
	if window.google == undefined
		script = document.createElement('script')
		script.type = 'text/javascript'
		script.src = 'https://maps.googleapis.com/maps/api/js?v=3.exp&' +
	      					'callback=initializeMap'
		script.async = true
		document.body.appendChild(script)

ready = ->
	getGoogleMapApi()
	#他のいろんなこと…

# For turbolinks
$(document).ready(ready)
$(document).on('page:load', ready)
```

以上です。
Bootstrapのdropdownメニューにテキストフォームを実装する

Bootstrapのdropdownはclickすると閉じる実装になっているので、textformにfocusした瞬間に閉じてしまう。
そこでjsでdropdown自体をclickしても閉じないようにする。

```lang:html
<div class="dropdown-menu_wrapper">
  <a class="dropdown-toggle" data-toggle="dropdown">
    <p>メニュー</p>
  </a>
  <div class="dropdown-menu" role="menu">
    <ul>
      <li>
        <input type="text" name="example1">
      </li>
      <li>
        <input type="text" name="example2">
      </li>
      <li>
        <input type="text" name="example3">
      </li>
    </ul>
  </div>
</div>
```

```lang:js
$(document).ready(function() {
    $(".dropdown-menu").click(function(e) {
        e.stopPropagation();
    }); 
});
```
Panamax を Windowsで試してみた。

そろそろ、VagrantやDockerを触ってみようかと思いつつも、仕事で使うならGUIがあったほうがチームで共有しやすい？こともあるなと思っていたところなので、
Panamaxを試してみた。

試用スペック
==========
OS:Windows8.1
CPU:Core i5
Memory: 8GB
FTTHなブロードバンド回線

紹介
===
http://www.wired.com/2014/08/panamax/
Windowsでの手順
http://alankent.wordpress.com/2014/08/13/playing-with-docker-coreos-and-panamax-on-windows/

インストール手順など
===============
ほぼ上記のサイトの通り。
実行にはCygwinと、VagrantとPanamaxのインストールが必要になる。
cygwinはgnupack (http://sourceforge.jp/projects/gnupack/)
VirtualBoxはインストール済み（4.2以降が必要）だったので、実際の手順は
Vagrant1.6.3をインストール。（1.6以降が必要）
そして次のコマンドをうつ。
（事前にPATHを通ししておけばもう少しスマートで、curlも普通のcygwinだと入っているかもしれない。また、curlの代わりに、wgetでいけそうな気もするけれど、panamaxの実行時にもたくさん使われるので入れておく。）
```
$ apt-cyg install curl
$ cd 
$ mkdir .panamax
$ cd .panamax
$ export PATH=$PATH:/c/Program\ Files/Oracle/VirtualBox/:/c/HashiCorp/Vagrant/bin
$ 
$ curl -O http://download.panamax.io/installer/pmx-installer-latest.zip
$ unzip pmx-installer-latest.zip
$ ./panamax init
```

インストール後はhttp://127.0.0.1:8888 でWebコンソールが上がっていた。
記事をよく読めばよかったけれどこれはDockerのGUIというよりかは、PaaSとか、
AWS CloudFomation的なものだった。

![2014-08-18 20.32.38.jpg](https://qiita-image-store.s3.amazonaws.com/0/35758/e440031c-4bba-3833-8f41-f7669520aa3c.jpeg)

↑こんな感じにPanamaxロゴを出したかったら、現状ではTerminalをLANG=C、キャラセット UTF-8的なことをしないといけない。

Minttyでいうとこんな感じ

![スクリーンショット 2014-08-18 20.01.22.png](https://qiita-image-store.s3.amazonaws.com/0/35758/859c3486-27f5-fa93-f9ba-ef88a50096c0.png)

アプリケーションの実行
===================
一番上のSearchから、キーワードで検索して、Templateもしくは、Docker Image
をRunするとアプリケーションが起動する。

いくつか試してみた感じでは、後述のポートの管理などを意識して書いてあるのが違うのか、Templateのほうがすぐ動くものが多い感じ。

![qiita20140818-3.jpg](https://qiita-image-store.s3.amazonaws.com/0/35758/859c4770-0a68-806c-afdf-85dbf57411d0.jpeg)


こんな感じで、Templateは複数ホスト構成になっている。

![qiita20140818-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/35758/cc4f0728-62f6-0502-e7a8-eb7a309b9870.jpeg)


ポートの管理
===========
Manage / Dashboard / Applications / アプリケーション名と進んで、
Application Service を選択すると、Portsというところがある。
ここで、Dockerの外、内のポートをGUIで選択することができる。
（ポートフォワードの管理がWebUIからできる。）

![qiita20140818.jpg](https://qiita-image-store.s3.amazonaws.com/0/35758/0c2ef838-ebe4-df37-4fff-b822b646d8a8.jpeg)

ただしここでPortの一覧に出てくるのは、Dockerの内外なので、VirtualBoxの内外のポートフォワードについてはVirtualBoxのNativeなGUIもしくは次のようなコマンドで設定変更している。

```
# /c/Program\ Files/Oracle/VirtualBox/VBoxManage.exe controlvm panamax-vm natpf1 rule5,tcp,,1237,,80
```

環境変数の管理
===========
同じくAplication Serviceを選択すると環境変数の値なども設定できる。
これのおかげで、ipythonのDockerイメージではDockerの環境に入ることなく
パスワードを設定できた。

現状の所感
=========
試用した機器のスペックのせいか忍耐力が必要だった。
VirtualBoxのメモリ容量が少なかったので、割り当てを増やすと少し快適になった。
今のこの環境・バージョンだと処理が終わらないことが多く快適とはいいがたいかもしれない。今の環境のせいか、製品クオリティには感じられないけれど、大した時間はかからなかったので試してみる分にはいいと思う。
個人的には
./panamax sshしてCoreOS(alpha)のロゴ見たり、
docker ps -aとかして気分を楽しむことはできたので少し満足。
※内部では、google/cadvisorとかも動いています。
Bootstrapのdropdownメニューをjsで開く

```lang:html
<div class="header_menu_desc_wrapper">
  <a class="dropdown-toggle" data-toggle="dropdown">
    <p>メニュー</p>
  </a>
  <div class="dropdown-menu" role="menu">
    <ul>
      <li>
        <p>ドロップダウン1</p>
      </li>
      <li>
        <p>ドロップダウン2</p>
      </li>
      <li>
        <p>ドロップダウン3</p>
      </li>
    </ul>
  </div>
</div>

<a class="open_dropdown">ドロップダウンメニューを開く</a
```

```lang:js
$(".open_dropdown").click(function() {
   $('.dropdown-toggle').dropdown('toggle');
   return false;
});
```
uStateでシーンの状態管理をしよう！ゆるふわゲームジャムの事例ちょこっと紹介

# はじめに

この記事は[Unity アセット真夏のアドベントカレンダー 2014 Summer！](http://unityassetjp.doorkeeper.jp/events/12843)１８日目の記事となります。

# uStateとは？

[ウダサンコウボウ](http://udasankoubou.blogspot.jp/2014/05/unityustate.html)さんが配布しているスクリプトベースのステートマシンアセット

# 今回話すこと

自分がGameJam中によく使うuStateを使ったシーンの状態管理を紹介します。
[#ゆるふわゲームジャム](https://atnd.org/events/54480)での結果演出の際の事例と合わせて紹介します。

# 使い方

（詳しくはウダサンコウボウさんを参照して下さい！）

## 必要なもの

uStateでは状態管理を実現する為に以下のものが必要となります
* uStateMachineを継承したHogeStateMachineクラス
* uStateGeneric<HogeStateMachine>を継承したFooStateクラス

基本的にはuStateMachine直下に各Stateのゲームオブジェクトを配置し、
uStateMachineはそれを見に行く感じ

# ゆるふわゲームジャムでの実例 戦闘演出

ゆるふわゲームジャムで作成したけのじゃ！では入力後に、自分と相手のプレイヤーが同時に選択した行動を行い、各段階にて演出をさせる事をやりました。

## まず戦闘演出に必要なステートを考える。

ざっくり列挙
 * 初期化
 * 準備演出
 * 戦闘演出
 * 結果演出

これらをシーンに配置したらこんな感じ
![Battle_unity_-_unity_-_PC__Mac___Linux_Standalone.png](https://qiita-image-store.s3.amazonaws.com/0/12129/b68eada3-94ba-a2c1-0f49-ff4d4d2b3ff6.png)

### BattleStateMachine

インスペクタはこんな感じ

 * DefaultStateName
  * シーンに遷移した直後の状態の名前
 * TransitionLimit
  * 使ってないのでわかってない…（ごめんなさい）

![Battle_unity_-_unity_-_PC__Mac___Linux_Standalone_と_Gyazo_-_67c7663fc0300bff86cf380fbd8ae5ec_png.png](https://qiita-image-store.s3.amazonaws.com/0/12129/f63c99b9-a7ac-0fac-6a3e-62b9043bbdbc.png)

今回はbattleStateMachineにPlayerも含めてしまっていたけどこれはあまり良い方法ではなさそう（GameJamでオラオラした結果です。。。）

### シーンのステータス制御の仕方

基本的にはuStateGeneric<HogehogeStateMachine>を継承した各状態の中に書きます。

### よく使うuStateGenericのメソッド

#### StateEnter

状態に遷移した直後のメソッド

#### StateStay

MonoBihaviourでいうUpdateみたいなもん

#### StateExit

現在の状態から抜ける時の処理

#### Reset

初期状態の設定等（初期のState名等を設定する）

### 状態遷移のやりかた

準備状態の時のコード
```csharp:battleStateReady.cs

	
	protected override void Reset ()
	{
		base.Reset();
		
		// 三秒後にShoot状態に遷移
		exitByTime = new ExitByTime(3.0f, "Shoot");
	}

```
// すぐに遷移したい場合はこんな感じ
exitByTime = new ExitByTime(0.0f, "遷移したいState名");
```

#### 外から状態を変更する場合

自分で用意したuStateMachineの参照をもって↓みたいにするとうまく動くかも

```csharp
uStateMachine stateMachine;

stateMachine.TransitionState("遷移するState名");
```

### つかってよかったこと

#### 状態ごとの処理をクラスごとに分けて書くことができた。
* 攻撃前の演出はReadyStateに
* 戦闘演出に必要な事はBattleStateに
* 戦闘結果演出に必要なことはResultStateに
#### 動かすだけならすぐできる
* スクリプトベースのなのでコードを読めば使い方がすぐわかる。

### 悪かったこと

#### 状態の遷移が見えづらい
* ノードベースと違って見えない

## おわりに

uStateはスクリプトベースで管理できる為コレまでスクリプト上で状態管理をしていた人からするととても使いやすい気がします。
最近だとノードベースの状態管理のアセットなんかも最近は安価でかつ高機能ではあるのですが習熟に時間がかかる部分もあるため自分はuStateを推しています。

雑なまとめとなってしまいましたがuState是非お試し下さい〜

明日は束田 大介さんの記事となります！！
REVEALに触発されてView階層を動的に3D化するツールを作ってみた

iOSのView階層を動的に3D化するサードパーティ製ツール
http://revealapp.com
に触発されて似たようなもののプロトを作ってみた。

##REVEALについて

* View構造をリアルタイムに3D化して可視化できる
* View構造のデバッグに便利
* 動的にぐりぐりできる
* 動的に要素の中身もいじれるっぽい
* __有料（商用利用は1エンジニアあたり$179）__

<img src="https://qiita-image-store.s3.amazonaws.com/839/46724/36c53fb2-e626-9636-e809-84ce6bd29c28.png" style="width:300px"/>

http://revealapp.com
公式で動画閲覧するとイメージがつきやすい

## 有料なのでオレオレ版作ってみた

有料（しかも高い）のでどんなもんか自作してみた

↓プロト動作イメージ
<img src="https://qiita-image-store.s3.amazonaws.com/839/46724/636371f7-d496-4a21-2a7d-15caa334473c.png" style="width:300px"/>

↓画面をぐりぐり動かしたりも可能


<img src="https://qiita-image-store.s3.amazonaws.com/839/46724/e1d4161e-e6cb-537b-2c78-01e933a72c8f.png" style="width:300px"/>

### できること
* シミュレータで画面回遊するとブラウザに上記イメージのView構造が反映される
* 3Dぽく拡大縮小/ぐりぐりできる
* それぞれのViewのクラス名が見える

それだけ。
IE対策：互換表示させない。

IEのバージョンごとにレンダリング方法が変わり、
互換表示と標準表示方法があるやっかいなIEの対策。

<meta http-equiv="X-UA-Compatible" content="IE=edge"/>

IEでWebページを正しく表示できない場合に、
互換モードになっていることが多いです。

常に標準モードになる`<meta>`タグを入れておくようにします。

```html
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
```

上記を、

1. `<head>`内に入れる。
2. cssやjsファイルが記述されている箇所の前に入れる。  
（外部のファイルの読み込みがあるとそこで表示モードが決定してしまうそうです。）

`content="IE=edge"`はIEの最新バージョンの標準モードを表しています。
IE7を使用している場合は、IE7、IE10を使用している場合はIE10のレンダリングモードで表示されます。

IE7であろうが、IE11であろうが、
IE8のレンダリングモードにしたいときは、
`content="IE=8"`という風に指定もできます。

# IE11　

![キャプチャ_.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/756e4fe0-b727-76a1-773b-ba21acd5a190.png)

IE11のドキュメントモードの既定値はEdgeです。

IE10のドキュメントモードが最後の新しいドキュメントモードになり、
IE11からは、Edgeモードになりました。

IE10以前のブラウザ環境で、
互換させたいときは、これまで通り`<meta>`タグでサポートします。

## 参考

IEに互換表示をさせないX-UA-Compatibleの指定
http://www.loconoco.info/?p=665

IE=edgeが効かない場合の対処法
http://www.useful-notes.com/others/ie-edgenotvalid/

IE8以降のバージョンでレンダリングモードをmeta要素で指定する時のまとめ
http://mj-wave.com/post-714/

Web制作者は注意！ Internet Explorer 11で変更された「互換性」
http://www.buildinsider.net/web/ie11attention/01
[Swift]２項演算子をオブジェクトに閉じ込めて遊んでみた


## ２項演算子を閉じ込めるクラス

```swift:Operator2.swift
class Operator2<T, U, V>{

    private let f: (T, U) -> V
    
    // ２項演算子で初期化できるか試してみる。
    init(f:(T, U) -> V){
        self.f = f
    }
    
    subscript(arg1: T) -> (U -> V) {
        get {
            return { (arg2: U) -> V in
                return self.f(arg1, arg2)
            }
        }
    }
    
    subscript(arg1: T, arg2: U) -> V {
        get {
            return f(arg1, arg2)
        }
    }
}
```

## テスト

```swift:main.swift
let f: Operator2<Int, Int, Int> = Operator2(+) // '+'演算子で初期化
println(f[3, 7]) // subscriptを使って配列っぽく引数を渡すのはご愛嬌
        
let f2: Operator2<Double, Double, Double> = Operator2(*) // 今度はかけ算
let f3 = f2[3.14] // 3.14を掛ける関数を得る。
println(f3(2))    // f3はsubscriptと無関係なので普通の括弧で呼び出す。
println(f3(3))
println(f3(4))
```

一見うさんくさいコードだけど動きます。

## 感想

subscriptを使うと、わりと関数呼び出しっぽくなる気がする…。

subscript使いまくってすべての関数をカリー化して、[]が関数呼び出しなのか配列の参照なのかわからないぐらいに…とか妄想（…実際にやるとは言わない）。
Scalaで手っ取り早くHelloWorld


Classとか作るのめんどい場合、Appトレイトを継承したシングルトンobjectを使えばよい

```HelloWorldApp.scala
object HelloWorldApp extends App {
  val name:String = if (args.length > 0) args(0) else "World";
  println ("Hello %s".format(name))
}

HelloWorldApp.main(args)
```

行末でmainを呼ばないと`scala`コマンドに食わせた時に実行してくれない。

実行してみる。

```
[masato] $ scala HelloWorldApp.scala Hoge
Hello Hoge
```
ffmpegで静止画と音声をくっつけた映像を作る

#ffmpegで静止画と音声をくっつけた映像を作る
mp3tubeみたいなのやりたいって感じ

##方針
1. 静止画を映像データにする
2. 上記の映像と音声を合成する
3. (ﾟдﾟ)ｳﾏｰ

##手順
* 手元に静止画`image.jpg`と音声`sound.wav`がある
* `image.jpg`から`image.avi`を作る→`image.avi`と`sound.wav`を合成する

```bash
$ ffmpeg -f image2 -r 1 -loop 1 -t hh:mm:ss -i image.jpg image.avi
$ ffmpeg -i image.avi -i sound.wav out.avi
```

* `-f`で画像を入力するという事を教える
* `-r 1`でフレームレートを指定
* `-loop 1`は`-loop_input`の代替として使った。`-loop_input`は入力ストリームをループさせる。
* `-t hh:mm:ss`で時間を指定する。数字をそのまま書けば秒として認識される（っぽい）
* `-i image.jpg`で静止画を指定、`image.avi`として出力させる。
* このとき`-vcodec`とか使って映像を自由にいじれる。`-s`使って映像サイズを指定する事も可能。
* フレームレートがかなり低いので、この時点で容量がかなり少なくなるはず。あまり品質を気にする必要はないと思われる。
* `image.avi`と`sound.wav`の合成は特に難しいことはない。ここで`-acodec`とかして音声をエンコードする事も可能。映像に関して何も書かなければ映像ストリームはコピーされる。

映像のエンコード、音声のエンコードはそれぞれ作る時点で行ったほうが無駄が少ないと思う。

##一連の処理を行うスクリプト

```bash
#!/bin/bash

CMDNAME=`basename $0`

if [ $# -ne 6 ]; then
	echo "Usage: $CMDNAME [-i image] [-s sound] [-o output]" 1>&2
	exit 1
fi

while getopts i:s:o: OPT
do
	case $OPT in
		"i" ) image="$OPTARG";;
		"s" ) sound="$OPTARG";;
		"o" ) output="$OPTARG";;
		* ) echo "Usage: $CMDNAME [-i image] [-s sound] [-o output]" 1>&2
		exit 1;;
	esac
done


dur=`ffmpeg -i $sound 2>&1 | grep Duration | sed -e s/Duration:\ // -e s/,.*//`

ffmpeg -f image2 -r 1 -loop 1 -t $dur -i $image temp.mp4 -s 1920x1080 -vcodec libx264 -y -threads 0
ffmpeg -i temp.mp4 -i $sound $output -acodec libfaac -threads 0
rm temp.mp4

exit
```

色々雑だけどまぁいいやこれで。引数をとるスクリプトを書きたかったからこういうの作っただけ。

見ればわかるけど、

* `-s 1920x1080`
* `-vcodec libx264`
* `-acodec libfaac`

って感じでエンコしてるよ。

###つかいかた
`Usage: $CMDNAME [-i image] [-s sound] [-o output]`
わかるよね。

* `-i`で画像を指定
* `-s`で音声を指定
* `-o`で出力先を指定