OmniAICreator/Qiita-1.07M huggingface dataset:
KitKat(android4.4/SDK19)以降のloadUrlでjavascript実行エラーになる件の修正方法

## やりたいこと
WebView#loadUrlでhtmlを読んだ後、その内容に対してjavascriptを実行したい。
例）ある部分の文字列を置換したい、など。

## 4.3以下まで出来た記述

```java:
mWebView.setWebViewClient(new MyWebViewClient());
mWebView.loadUrl("file:///android_asset/index.html");

private class MyWebViewClient extends WebViewClient {
  @Override
  public void onPageFinished(WebView view, final String url) {
     mWebView.loadUrl("javascript:document.getElementById('sample').innerHTML = javascript changed");
  }
}
```

## 4.4.xで実行するとエラー

```
I/chromium(30811): [INFO:CONSOLE(1)] "Uncaught TypeError: Cannot set property 'innerHTML' of null", source: 
```

おそらく、4.4以降WebViewの内部実装がchroniumに変わったため出るようになったぽい。

## 修正方法

SDK19以降で追加されたメソッドWebView#evaluateJavascriptを使う。

```java
mWebView.evaluateJavascript("javascript:document.getElementById('sample').innerHTML = javascript changed", null);
```

第2引数にコールバックを登録すればJavascriptの実行結果が受け取れる。
Smartyで予約変数に可変変数を設定

例えば配列で以下のデータがあります。
商品情報にタイトル用のフィールドが3つある。レコードは1つ。

```php
{$arrProduct.title1}
{$arrProduct.title2}
{$arrProduct.title3}
```

これをせっせと{＄arrProduct.title1}{＄arrProduct.title2}{＄arrProduct.title3}.........と全部書くのは大変なので、増えることも想定して変数を変数で設定したいと考えて調べた結果のメモ。

■3回回すサンプル。とりあえずリテラル値「3」を設定しているがそこも変数にするのが良い。

```php
{section name=cnt loop=3}
  {var assing=str value="title"|cat:$smarty.section.cnt.iteration}
  {$arrProduct.$str}
{/section}
```

まぁ、可能な限りPHP側でやれという話なんですけど、Smarty側でどうしてもやらないといけない場合もあるので。

■参考サイト
http://www.smarty.net/docs/ja/language.modifier.cat.tpl
特定のフォルダを仮想ドライブとしてマウントする方法(Windows)

# 方法
やり方は簡単で、以下のコマンドを、コマンドプロンプトに入力します。

```bat:
subst <ドライブ名> <フォルダ名>
```

## 設定例
<dl>
<dt>ドライブ名</dt><dd>E:</dd>
<dt>フォルダ名</dt><dd>"C:\Users\yuichi\work"</dd>
</dl>

正しくマウントされたかどうかは、substコマンドで確認できます。

```
C:\Users\yuichi>subst
E:\: => C:\Users\yuichi\work
```

また、マウント解除は、/Dオプションを使います。

```
C:\Users\yuichi>subst /D E:

C:\Users\yuichi>subst
 
```

# 問題点
substコマンドで仮想ドライブをマウントしても、再起動するとマウントが解除されてしまいます。これは仕様のようなので、私はスタートアップフォルダに、マウントするためのバッチファイルを置いて対応しています。
Windows8.1におけるスタートアップフォルダのパスは以下の通りです。

```
C:\Users\[ユーザ名]\AppData\Roaming\Microsoft\Windows\StartMenu\Programs\Startup
```

上記のフォルダ内に、先ほどのsubstコマンドを記述したバッチを設置すれば、起動時にそれが実行され、マウントされる流れです。（文字コードをShift-JISで保存するように注意です。）

```bat:MOUNT.BAT
subst E: "C:\Users\yuichi\work"
```

# References

- [スーパーユーザーのためのWindowsコマンド再入門：subst――パスをドライブ名に割り当て - ITmedia エンタープライズ](http://goo.gl/Z7L18f)
- [Windowsで特定のフォルダを仮想ドライブとしてマウントする方法](http://goo.gl/JMwlu)
dockerでsshを起動する場合、UsePAM noにしてたらノーパスログインでちょいハマり


dockerのコンテナでsshd起動する時は、

``` sshd_config
UsePAM no
```

にしないで、

``` sshd_config
UsePAM yes
```

``` /etc/pam.d/sshd
session    optional     pam_loginuid.so
```

パスワードが空だとノーパスログインできないので。

``` Dockerfile
RUN sed -i '/pam_loginuid\.so/s/required/optional/' /etc/pam.d/sshd
```

Dockerfileにはこれで。
node.js で Google URL Shortener を使って短縮 URL を作る

備忘録です.

ローカルで作ったプロジェクトを runstant 用に出力する grunt タスクを作ってて
そんとき必要になったやつ.

Google の goo.gl を使ってます.

### https バージョン

```js
var https = require('https');

var shortenURL = function(url, callback) {
    var req = https.request({
        host: 'www.googleapis.com',
        path: '/urlshortener/v1/url',
        method: 'POST',
        headers: {'Content-Type': 'application/json'},

    }, function(res) {
        var str = '';
        res.on('data', function(chunk) {
            str += chunk.toString();
        });
        res.on('end', function() {
            var d = JSON.parse(str);
            callback(d);
        });
    });

    req.write('{"longUrl" : "' + url + '"}\n');
    req.end();
};

// 実行
shortenURL("http://tmlife.io", function(d) {
    console.log(d.id); // http://goo.gl/pZPJLf
});

```


### request バージョン

https でバカ正直に実装してたのですが, 
request モジュールを使えばもっとサクッとやれます.

@kjunichi san の[こちら](http://kjunichi.cocolog-nifty.com/misc/2014/08/nodejsgoogle-ur.html)を参考


```js
var request = require('request');

var shortenURL = function(url, callback) {
    request.post({
        url: "https://www.googleapis.com/urlshortener/v1/url",
        headers: {
            'Content-Type': 'application/json'
        },
        json: true,
        body: JSON.stringify({
            longUrl: url
        }),
    }, function(error, response, body) {
        callback(body);
    });
};

shortenURL("http://tmlife.io", function(d) {
    console.log(d.id); // http://goo.gl/pZPJLf
});
```
Windowサイズと同じサイズのDOMを作る


カラーボックスを作る場合など、Windowサイズと同じ
width, height を持ったDOMを作り

```
background: #fff;
opacity: 0.5;
```

くらいでフィルター的に使いたいケースってあると思います。

![スクリーンショット 2014-09-24 14.48.17.png](https://qiita-image-store.s3.amazonaws.com/0/43677/a459a6a9-79e2-1a17-cd91-66cd632aea7a.png "スクリーンショット 2014-09-24 14.48.17.png")


※こんな感じ

僕は今までbodyに

```
height: 100%;
```
をつけた上で、フィルターとなるDOMに対しても同じように

```
height: 100%;
```

を適用することでwindowと同じ高さを持ったDOMを
作っていたのですが、

```
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
```


というやり方によっても同様の目的を実現できるようです。

bodyに

```
height: 100%;
```

をあてちゃうと、いろいろと副作用的な不具合が起きてしまうので、
こっちのやり方のほうが良さそうです。
Railsアプリを作るときいつもやること 〜ドメイン・SSL編

## 独自ドメインを設定する
* ムームードメインで管理しているドメインを、
* [CloudFlare](https://www.cloudflare.com/)を使って、
* herokuアプリに設定する

手順は、
1. herokuのSettingページより登録したいドメインを追加（ルート&wwwを追加）
2. CloudFlareへの独自ドメインの登録
3. CloudFlareのDNS設定画面でAレコードを削除
4. 代わりにCNAMEレコードで「Name」に独自ドメイン、「value」にherokuから提供されているドメインを追加
5. Freeプランで先へ進む
6. 「Change your name servers with your DNS provider」みたいなのが出るので、表示されている情報をムームドメインの「GMOペパボ以外のネームサーバを使用する」から登録

これで数分待つと、独自ドメインにアクセスするとherokuアプリが呼ばれるようになる。
ちなみにGoogle AppsのメールもCloudFlareにMXレコードを登録すると扱えるようになる。

変更状況が気になる場合は、

```lang:console
$ dig example.com NS
```
とすることで、DNSのステータスを確認できる。変更されてなかったら、TTLを確認して、のちほど再度digする。

参考：
・ [[Heroku] CloudFlareを利用したルートドメインの設定方法](http://codenote.net/heroku/2755.html)
・ [DNSに関する基本ガイド - Google Apps 管理者用 ヘルプ](https://support.google.com/a/answer/48090?hl=ja)

## SSLを設定する
* 独自ドメインを設定したherokuアプリに対して、
* DNSimpleで取得したSSLを設定する

手順は、
1. DNSimpleからSSL証明書を購入
2. Private Keyを作成
3. Certificate Fileを用意
4. herokuにSSLのアドオンを追加
5. herokuに`key`と`crt`を追加
6. CNAMEレコードを変更
7. Railsの設定を更新

### 1. DNSimpleからSSL証明書を購入（有料：年$20〜）
基本的には画面に沿って情報を入力すれば問題ないはず。購入すると、「Send Email to Approve SSL Certificate」という画面に遷移するので、表示されている中から一つメールアドレスを選択して、確認メールを受信する。到着まで数分待つ。
確認メールの中にリンクと確認コードがあるので、リンク先のフォームにコードを入力すれば承認完了。


### 2. Private Keyを作成
確認コードを入力すると、Private Keyが表示した画面に移る。そこでの表示内容をコピーして、`server.key`というファイル名でローカルに保存する。


### 3. Certificate Fileを用意####
DNSimpleから「Your EssentialSSL Certificate for ...」というタイトルでもう一つメールが送られてくる。このメールに添付されている4つのファイルをローカルに保存して、1つのファイルにまとめる。

```lang:console
$ cat www_example_com.crt COMODORSAAddTrustCA.crt COMODORSADomainValidationSecureServerCA.crt AddTrustExternalCARoot.crt > server.crt
```
4つのファイルの順番に注意。先頭が自分のドメインのもので、最後がCARootになるように指定する。


### 4. herokuにSSLのアドオンを追加（有料：月$20）

```lang:console
$ heroku addons:add ssl:endpoint
```

### 5. herokuに`key`と`crt`を追加
```lang:console
$ heroku certs:add server.crt server.key
```

### 6. CNAMEレコードを変更
まずはエンドポイントを確認

```lang:console
$ heroku certs:info
Fetching SSL Endpoint example-2121.herokussl.com info for example... done
Certificate details:
Expires At: 2012-10-31 21:53:18 GMT
Issuer: C=US; ST=CA; L=SF; O=Heroku; CN=www.example.com
Starts At: 2011-11-01 21:53:18 GMT
Subject: C=US; ST=CA; L=SF; O=Heroku; CN=www.example.com
...
```
この`example-2121.herokussl.com`を使ってCloudFlareのDNSを更新。

### 7. Railsの設定を更新
```lang:config/environments/production.rb
config.force_ssl = true
```
テストもしてみる

```lang:console
$ curl -kvI https://www.example.com
```

これでOK！

参考：
・ [Purchasing an SSL Certificate from DNSimple](https://devcenter.heroku.com/articles/ssl-certificate-dnsimple)
・ [SSL Endpoint](https://devcenter.heroku.com/articles/ssl-endpoint)
・ [Certificate Installation: NGINX](https://support.comodo.com/index.php?/Default/Knowledgebase/Article/View/789/37/certificate-installation-nginx)
ChromeExtension開発(browserAction)でデベロッパーツールを使う方法

通常のデベロッパーツールを出しても、"browser_action"内のスクリプトに記述したconsole.log等は出力されませんが、下図のようにポップアップした画面で右クリック→「要素を検証」、で"browser_action"で出力されるデベロッパーツールが起動します。

![デベロッパツール.png](https://qiita-image-store.s3.amazonaws.com/0/50690/d1155089-c04d-5bad-aeca-7d012facf35a.png)


参考：
Google Chrome Extension開発でのポップアップ画面について | offsidenowの日常を綴ったブログ http://offsidenow.phpapps.jp/archives/1548
GitHubに登録した公開鍵が分からなくなったのでfingerprintで特定する

GitHubなど公開鍵を登録して秘密鍵でアクセスするサービスはいくつもあるが、大体どの公開鍵を登録したか忘れる。
だいたいそんなサービスではfingerprintが表示されるので、それを比較すれば登録した公開鍵を特定できる。
そもそも鍵をちゃんと管理できてれば、こんなことをする必要はないのでこれで安心して登録しまくってはいけない。

`ssh-keygen` の `-l` オプションで確認する。
`-f` オプションがなければインタラクティブになる。

```bash
$ ssh-keygen -l -f ~/.ssh/id_rsa.pub -E md5
2048 00:a0:00:a0:00:00:a0:a0:a0:00:00:aa:00:00:00:aa  id_rsa (RSA)
```
インストーラが無いWindowsサービスアプリをインストールする方法

##概要
**Windowsサービスアプリを作ったけどインストーラ作るの面倒な人向け**

##環境
* Windows Server2008 R2
* .NET FrameWork 4.0

##手順
1.インストール

```:コマンドプロンプト
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\installUtil.exe "Appのパス"
```

2.アンインストール

```:コマンドプロンプト
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\installUtil.exe /u "Appのパス"
RubyKaigi2014 Day3

[RubyKaigi 2014](http://rubykaigi.org/2014/) の 3日目まとめ

# おはよう Rails

// とりとめもなく、気になったワードだけピックアップしておく

- ECのパッケージを使う場合に比べて、Railsフレームワークの知見（デプロイ、テスト、etc）を活用できたのは嬉しい
- `rake setup` で ミドルウェアのセットアップ等含めて実施してくれる
- Rails new してちょっと準備したら gem が 100個くらい入るじゃないですか
  - padorino 使ってると辛い
     - Railsじゃなくても動くべきじゃん！というgemがRails実装に依存してたりして...
     - Railsを選ばないと辛い
- gemを手直ししたい
  - pull-req出す or monkey patch どっち?
  - private repo に fork して、パッチ宛てて、private gem serverにupしてる
- gemを入れるのに抵抗がある
  - vs. gem入れないと世界規模でコピペしてる感じで嫌だ
  - 消し忘れたgemがGemfileに残ってる
  - 未使用のgemを検出するgemとか欲しい
- cron辛い
  - https://github.com/javan/whenever

# Speeding up Rails 4.2

- Aaron
- たこ焼き仮面
- RedHat
  - ManageIQ .. 仮想マシン管理ツール
- Rails Contributors (コミット数 No.1)

## Rack

- もう終わり
- **Rackは楽じゃない**
- the_metal 作った。うまくいけば Rack2.0 になる
- 今のRackの問題
  - env .. どこでもだれでも変更できる (== グローバル変数)
  - ストリーミングめんどい
  - the_metal のアプローチ
     - `call(req, res)` .. req と res はIOのようなインタフェースを持つ
     - tenderlove/the_metal

## Rails4.2 speed up

- Adequate Record
  - ActiveRecord の速度を2倍にする
- benchmark/ips というgem使ってる
- Blackbox Testing に使ってる
  - Routes と link_to には関係がある?
     - 要素数に相関は無いが、パラメータ数には正の相関がある
- `GC.stat()`
  - allocation_tracer も便利(ブロック内で確保されたobjectを確認したりできる)
- リクエスト処理内部で一時的に作られるオブジェクトを減らした話
  - String -> Buffer -> String と変換していたのを、中間のBufferを無くした
- 呼び出し側がルールを守るならば、呼び出される側をシンプルにできる
  - 呼び出す側が nil を渡さないなら nil チェックを省略できる
  - 呼び出す側が常にStringを渡すなら `.to_s` を省略できる

## まとめ

- 一番早いコードは存在しないコード
- メソッドが扱うオブジェクト種別を限定すれば、コードはシンプルになる。シンプルなコードは早くなる。
- 計測すること measure, measure, measure
- Rails4.2 は今までで一番早いRailsになる

# Practical Metaprogramming in Application

- moro
- はじめる! cucumber
- 永和システムマネジメント
- idobata

## ゴール

- メタプログラミング怖くないよー
- メタプログラミング使いすぎるとメタメタになっちゃうよー

## メタプログラミング

- コード実行時に言語構成要素を動的に生成する
- Rubyの言語構成要素
  - class /module
  - object
  - method
  - proc

```ruby
class Book
  def title
    @title
  end
  def title=(t)
    @title = t
  end
end
# --
class Book
  attr_accessor :title
end
```
 - これもメタプログラミング

## Pitfail

- 使いすぎるとよくわからんなる (読みにくい、メンテしにくい)

## 実際のアプリケーション開発でどうやって活かすか

- 問題領域を一段メタなところに広げて、コードをシンプルに書くことを考えると、ちょうど良い
- AR の `has_many :reviews`
  - `reviews` を取ってきて配列を返す... のではなく、 Association Object を返すだけ
  - `Book#reviews.build` みたいなのは Association Object が面倒みてる
  - 直接親子関係を返すのではなく、その関係性を表現するオブジェクトを用意する
     - 関係性を表現する部分ではなるべくメタプログラミングを使わない
     - ユーザが使いたい/使わせたいインタフェースに繋ぎこむところだけメタプログラミングを使って。

## Case: Post / Comment / Photo

# Everything is Broken: A Story of Hope

- http://rubykaigi.org/2014/presentation/S-JonanScheffler
- Jonan Scheffler
- New Relic の中の人
- OREGON から。すげえ日本語上手い
- Diffie-Hellman の説明を、色の混ぜあわせを使って説明してた

# Fluentd Hacking Guide

- sonotsさん
- vimプレゼンテーション
  - これは後でビデオ見るほうが分かりやすいかも
  - 或いはコード読むべし
protectedへのアクセスが出来る？

Smartyの勉強を始めたところ、よく分からないことで躓いた。


BaseSmartyは共通設定と関数のオーバーライド、そしてdata変数の定義。
FormではBaseSmartyの継承とフォーム用のデータのセット、そしてメソッド呼び出し。


```php:BaseSmarty.php
require_once('Smarty-3.1.19/libs/Smarty.class.php');

class BaseSmarty extends Smarty
{
    protected $data;

    public function __construct()
    {
        parent::__construct();

        $this->template_dir = 'templates/';
        $this->compile_dir  = 'templates_c/';
        $this->config_dir   = 'configs/';
        $this->cache_dir    = 'cache/';
    }

    protected function display($template = null, $cache_id = null, $compile_id = null, $parent = null)
    {
        foreach ($this->data as $k => $v) {
            $this->assign($k, $v);
        }
        return parent::display($template);
    }
}
```


```php:Form.php
require_once('BaseSmarty.php');

class Form extends BaseSmarty
{
    public function __construct()
    {
        parent::__construct();
    }

    protected function showForm()
    {
        $this->data['content_tpl'] = 'form.tpl';
        $this->data['params'] = array(
            'request'  => 'ご意見',
            'question' => '質問',
            'other'    => 'その他',
        );

        $this->display('template.tpl');
    }
}

$smart = new Form();
$smart->showForm();
```

まずこの時点でForm.phpにアクセスしたところページが表示されるはずが真っ白。

そしてこれは知人の「displayがprotectedになってるから以下の2行から呼び出せていない」

```php:Form.php
$smart = new Form();
$smart->showForm();
```

という助言で解決。ここってクラス外って扱いなんですね。そりゃそうか。

```php:Form.php
protected function display(…
↓
public function display(…
```

ということで上記のようにpublicに修正。
Form.phpにアクセスすると確かに表示されている。成功か！

しかしここで疑問。
`showForm()`もprotectedでありクラス外、なはずが何故か呼び出せている…？

試しに

```php:Form.php
$a = 1;
…中略…
$smart->a;
```

としても呼び出せない。publicならもちろん呼び出せる。

なんでだろう…？

cakePHPでは[こういった](http://blog.generace.co.jp/2013/05/09/639)話もあるようだけど、うーん…分からない！
ImagickでPDF複数ページ画像化でハマった点

PDFを画像化するかーという時にお世話になったこのサイト
http://ameblo.jp/linking/entry-10997312536.html

PDFが画像1枚ならこのサイトの情報だけで2014年現在も問題ないんですが、
ここにきて初めて複数ページのPDFの画像変換をやることになりまして
このサイトの通りにコーディングしたところ、Exception Errorになりました。

> set ImageIndex method is deprecated and its use should be avoided

なんじゃろなーと思いながら上記エラーメッセージで検索するもよくわからない。
そしてようやくマニュアルに返る事を思いつきます。

http://php.net/manual/ja/imagick.setimageindex.php

> **このメソッドは非推奨です。**
> **このメソッドは非推奨です。**
> **このメソッドは非推奨です。**

ほう。じゃあ代わりに紹介されているsetIteratorIndexでも使ってみますか?

```php:
$im = new imagick();
$im->setResolution(144,144);
$im->readimage($file_path . '/' . $pdf_name);
$page_count = $im->getImageScene();

for($i = 0; $i <= $page_count-1; $i++) {
    $im->setIteratorIndex($i);
    $im->setImageFormat('jpeg');
    $im->writeimage($file_path.'/'.$image_name . $i . $extension);
}

$im->destroy();

$jpg = array();
for($i = 0; $i <= $page_count - 1; $i++) {
    $jpg[] = 'data:image/png;base64,' . base64_encode(file_get_contents($file_path . '/'  . $image_name . $i . $extension));
    unlink($file_path.'/'.$image_name . $i . $extension);
}
$this->view->jpgs = $jpg;
```

上々ね。
というわけで気持ちよくなったついでにSmarty側のコードも。

```php:
{foreach item=jpg from=$jpgs}
    <img src="{$jpg}" alt="file" class="image-view"><br />
{/foreach}
```

View側は別におもしろくなかった。
それではお疲れ様でした。よい開発ライフを。
[PHP] 1からnまで連続する正の整数があります。それらの中に「7」がいくつあるか数えてください。

## 問題

某広告メールに載っていたアルゴリズムの問題を転載。

```
1からnまで連続する正の整数があります。
それらの中に「7」がいくつあるか数えてください。
```



## プログラム
手っ取り早く``PHP``で書いてしまいました。あとで``C``で書いてみます。かも。。

// ご助言いただき、非公開記事へ移動しました。
http://qiita.com/pb_tmz08/private/5f413a69f35125b263b2
previmに感動したのでcssをQiita仕様にしてみた

* preview/css/user_custom.css に書けば話は済むのですが・・・。

![スクリーンショット 2014-09-24 13.01.25.png](https://qiita-image-store.s3.amazonaws.com/0/25728/de42fbf8-f2c3-386e-5b3c-54a684fd4f91.png)


# インストール

```diff:~/.vimrc
  NeoBundle 'plasticboy/vim-markdown'
- NeoBundle 'kannokanno/previm'
+ NeoBundle 'tukiyo/previm'
  NeoBundle 'tyru/open-browser.vim'
```

# NeoBundleインストール

```bash:NeoBundleインストール
mkdir -p ~/.vim/bundle
git clone \
 https://github.com/Shougo/neobundle.vim \
 ~/.vim/bundle/neobundle.vim
```

## .vimrc

```vim:
"必須
set runtimepath+=~/.vim/bundle/neobundle.vim/
call neobundle#begin(expand('~/.vim/bundle/'))
NeoBundleFetch 'Shougo/neobundle.vim'

""""""""""""""""""""""""""
" render - :PrevimOpen
NeoBundle 'plasticboy/vim-markdown'
NeoBundle 'tukiyo/previm'
NeoBundle 'tyru/open-browser.vim'

"必須
call neobundle#end()
filetype plugin indent on
NeoBundleCheck "未インストールのプラグインの確認

""""""""""""""""""""""""""
" markdown
let g:vim_markdown_initial_foldlevel=1
```
AWSのUbuntuLinuxにVNCを“まともに”インストールする方法

Amazon Web ServiceのEC2のUbuntuLinuxにTigerVNCを“まともに”インストールする方法です。

##はじめに

###今回の“まともに”とは
#####1. AWS上のLinuxをリモートからGUIで操作できる
vncserverが起動すればOK
#####2. RStudioなどQtを使用するGUIアプリ普通に使える
vnc4serverが抱えているQtが落ちる問題の回避
#####3. VMWarePlayerで仮想のWindowsが動作する
TigerVNCのインストール方法／環境によってビデオデバイス周りで発生するバグの回避
（AWSがXenで構成されている関係で、VirtualBoxは動きません）

X環境や、ウィンドウマネージャのインストール・設定およびVNCの設定は省略します。あくまでインストールと起動確認までです。

単純にapt-getするだけなら記事にする必要もないのですが、これをやって大いにハマったので現状での解決策をメモします。

###実行環境は
「Ubuntu Linux(Ubuntu Server 14.04 LTS (HVM), SSD Volume Type - ami-a1124fa0)」(64bit)です。
インスタンスタイプはc3.xlargeを選択。

##インストール手順

###1. gdebiをまだ入れていない場合はインストール。
```shell-session
[user@test ~]# sudo apt-get install gdebi
```

###2. TigerVNCのサイトで、対象ファイルのURLを調べる。
http://tigervnc.sourceforge.net/tiger.nightly/

今回の場合は
http://tigervnc.sourceforge.net/tiger.nightly/ubuntu-14.04LTS/amd64/tigervncserver_1.3.80+20140921git2607a0ef-3ubuntu1_amd64.deb
（URLは2014/09現在、活発に更新されているようです。上記サイトでの確認は必須と思います。）

###3. ファイルを取得
次のコマンドでファイルを取得

```shell-session
[user@test ~]# wget 対象ファイルのURL
```

今回の場合は

```shell-session
[user@test ~]# wget http://tigervnc.sourceforge.net/tiger.nightly/ubuntu-14.04LTS/amd64/tigervncserver_1.3.80+20140921git2607a0ef-3ubuntu1_amd64.deb
```

###4. インストールの実行
```shell-session
[user@test ~]# sudo gdebi 取得したファイルのファイル名
```

###5. vncserverを起動

次のコマンドでvncserverを起動

```shell-session
[user@test ~]# vncserver
```
パスワードを２回入力して起動すればOK

###6. 接続確認

WindowsなどのクライアントにTigerVncViewer(Tiger以外のものでも接続可能)をインストールし、

**対象インスタンスのアドレス::5901**

で接続できればOK

##手順に至るまでの経緯（失敗例）

###1. vnc4serverではQtが落ちる
まず、apt-getで入れられるvnc4serverをインストール。

普通に起動し、Windowsからの接続もOK

あれ！？、Unityが起動しない？

Xfceだと動くからまあいいか。GUIのコンフィグ画面がいくつか落ちるけど、これは我慢できる。

あれ！？、**RStudioが「Segmentation fault」で起動しない？**
－＞　**これは我慢できない（涙。**

海外の掲示板を見ていると、どうも**VNCとQtの相性が悪いらしい**。

###2. TigerVNCをapt-getでインストール、は“使えない”！
どうやらTigerVNCというのがあるらしい。
昔出ていたTightVNCなどの良いとこ取りらしい。

ググってインストール完了。

普通に起動し、接続もOK

RStudioも無事に起動！

CTRL-Spaceのインプットメソッド切り替えが効かなくなったけど、まあいいか。

VMWarePlayerで仮想マシンを起動すると「ビデオデバイスの検出に失敗したよ！」とか見慣れないメッセージが出る？

**仮想マシンでエフェクトっぽい画像処理が入るとVNCを巻き込んでフリーズする**。
－＞　**使えない（涙。**

始めはVMWare周りを疑って試行錯誤するも、治らない。

前出の方法でTigerVNCを入れなおして解決。

##最後に

AWS上のLinuxにVMWareを入れてWindowsを動かすというのはレアケースと思いますが、最近はメモリやコア数が多くて安いインスタンスタイプがあるので、実機より便利なのではと妄想した結果の記事です。

Windows ServerのインスタンスやAmazon WorkSpacesもありますが、今回はあくまでAWS上にGUIのLinux環境を構築するついでとしてVMWareで遊ぼうとした結果です。

VNC経由での仮想マシンの使用感ですが、ウィンドウを移動させる際などでもたつきますが、まあまあ使えるレベルと感じました（通信環境にも依存します。クライアントのWindows側のタスクマネージャーではTigerVNCViewerが最大6Mbpsくらいで通信していました）。マシン自体はXeonで構成されている比較的ハイエンドなものなので、重いプログラムの実行などCPUパワーが必要なシーンでの処理速度は普段使っているノートPCよりも高速な印象です。

（ 色々試行錯誤した結果です、誤りや、もっと良い方法があればコメントでご指摘ください m(_ _)m ）
MavericksにDogapiをインストールする

# 問題

```
$ pip install dogapi
```

エラーがでてインストールできない

```
    if 'llvm-gcc' in data:

TypeError: argument of type 'NoneType' is not iterable
```

# 原因
Mavericksからコンパイラがgccからllvmになったため、`xcode-select`に含まれる`Command Line Tool`がインストールしていないと、C拡張のライブラリに依存するパッケージをビルドすることができなくなった。

# 解決

```
$ xcode-select --install
$ sudo xcodebuild -license
```
CodeIQ 中学入試から：単位のある計算をRubyで解く

問題はこちら
https://codeiq.jp/ace/nabetani_takenori/q1058

```rb
# -*- coding: utf-8 -*-
CV = {
  '日'=>24*60*60,'時間'=>60*60,'分'=>60,'秒'=>1,
  'km'=>1000*100*10,'m'=>100*10,'cm'=>10,'mm'=>1,
  'kg'=>1000000,'g'=>1000,'mg'=>1,
}
 
def to_unit(s)
  s.scan(/\d+[^\d]+/).inject(0) {|sum, e|
    e =~ /(\d+)(.+)/
    sum += $1.to_i * CV[$2]
  } * (s[0] == '-' ? -1 : 1)
end

def solve(q)
  l_sum, r_sum = q.split('=').map{|s|
    s.scan(/[+-]?\d+[^+-]+/).inject(0){|sum, e| sum += to_unit(e)}
  }
  x_pos = (q =~ /(-?)□([^+-=]+)/)
  ret = x_pos < q.index('=') ? r_sum - l_sum : l_sum - r_sum
  ret *= -1 if $1 == '-'
  ret / CV[$2]
end

DATA.readlines.each do |line|
  no,q1,q2 = line.strip.split(/\s+/)
  a1 = solve(q1)
  a2 = solve(q2)
  print no + "\t" + a1.to_s + "\t" + a2.to_s + "\t"
  puts a1 == a2 ? ' o' : ' x'
end
__END__
T01	3m20cm-3m10cm-□mm=5mm	□kg=95000g
T02	2kg+500g+□g=3kg200g	□m=700000mm
T03	12kg+1kg500g+□g=13kg700g	720000秒=□時間
T04	2時間30分-□時間=90分	□km=1000m
T05	1日-□分=23時間20分	40000mm=□m
T06	3日-□秒-71時間59分30秒=7秒	23000g=□kg
T07	23時間30分+29分+60秒=□日	□km=1000m
T08	1日+23時間15分+□分+120秒=2日	43000m=□km
T09	1km-1m-1cm-1mm=□mm	□kg=998989000g
T10	3m20cm-5cm2mm-20cm8mm+□cm=312cm	□km=18000m
T11	1日-1時間-1分-1秒=□秒	297860400秒=□時間
T12	1kg-1g=□g	□日=23976時間
T13	□日-1時間-1分-1秒=82739秒	1000g=□kg
T14	4km-3995m-480cm-□mm=20cm	□km=0m
T15	12m30cm-7m43cm-45cm2mm-□mm=3m80cm	14832時間=□日
T16	0m+□km=0mm	0g=□kg
T17	24時間+□分=1日	□日=0時間
T18	4cm3mm+□km+5mm=48mm	0分=□時間
T19	□分+24時間+7日+14分34秒=777634秒	□日=2053440分
T20	122日+20時間35分24秒=□秒	10614924000g=□kg
T21	240km-218987m-8780cm-77648mm=□mm	□日=500341248時間
T22	120分+46分-□分=1時間19分	720分+9300分-4800分=□時間
T23	100kg+32kg-36kg=□kg	296mg-100mg-□mg=100mg
T24	533448650mm-□km-52122650mm=203326000mm	270840秒+□時間+683832秒=22日15時間11分12秒
T25	83m+□m+130m=626m	137km260m55cm2mm+377910000mm-□km=102km170m55cm2mm
T26	1000kg+1000kg-1609kg=□kg	4時間+3時間14分-43分=□分
T27	704kg720g-235kg-4kg720g=□kg	1425日-480日-480日=□日
T28	24629793500mg+4359473400mg-12783kg266g900mg=□kg	□kg=16206000000mg
T29	789m-250m-244m=□m	275210g+□kg+126380g=696590g
T30	625cm-□cm-300cm=1m	219km100m+□km+153km=597100m
T31	1564200g-498kg-404200g=□kg	331日3時間34分+658日20時間58分-□日=328日32分
T32	219kg645g600mg-□kg=66kg645g600mg	148387424mm+□km=301387424mm
T33	57m+10460cm+□m=32360cm	10cm+□mm=26cm2mm
T34	1437日3時間9分-□日-31733100秒=7071840秒	1157700分+748680分-□日=483660分
T35	4608816秒+□日=67940016秒	50cm+1000mm-□mm=76cm7mm
T36	220kg300g+60kg355g-□kg=50655g	□km+127km501m10cm=357501100mm
T37	5088分+4日3時間-5508分=□時間	137651880mg-28kg300g290mg-□kg=17kg351g590mg
T38	72460m-□km=4km460m	18時間14分+2日3時間40分+□時間=496440秒
T39	12000mg+28g-□g=0mg	98km125m71cm-3831300cm-1981271cm=□km
T40	55220mm+389910mm+□m=1km25m13cm	1604904秒+1957249秒-□時間=17日1時間29分13秒
```
iPhone6/iPhone6 Plus画面対応用の起動画像を用意しました


前回のエントリーの続きです。

iPhone6/iPhone6 Plusの画面対応について
http://qiita.com/uebo/items/854c284ed11aca741d93

前回の記事で、各種iPhoneの画面対応するには、

1. 各iPhone画面解像度に対応した起動画像を用意する
2. プロジェクトファイルのLaunch Screen Fileにxibファイルを設定する

上記2つの方法どちらかを選択する、というようなことを書きました。

そして、2番のLaunch Screen FileのほうはiOS8のみの機能のため、今からアプリを新規で作成となると、iOS7も対応しておきたい場合は必然的に1番の選択肢しかないかと思います。

最新のXcode6（6.0.1）で新規プロジェクトを作成すると、デフォルトで2番のLaunch Screen Fileが設定されていますが、1番の方法に変更する必要があります。

新規でプロジェクトを作成して、サクッと各画面の動作を見たいとき用に黒い起動画面を用意したので、利用したい方は下記からどうぞ。

1. iPhone3GS
Default.png
320 x 480
https://gist.github.com/uebo/a6cfecd08900c889af11/raw/4c8ca6f693f96d511e9113c0eb59eec552354e42/Default.png

2. iPhone4, iPhone4s
Default@2x.png
640 x 960
https://gist.github.com/uebo/a6cfecd08900c889af11/raw/35b84cffeb4db607983c8383fa9199731dc3aba0/Default@2x.png

3. iPhone5, iPhone5s
Default-568h@2x.png
640 x 1136
https://gist.github.com/uebo/a6cfecd08900c889af11/raw/0891b7aabfcf3422423b109c8beed2bab838c607/Default-568h@2x.png
 
4. iPhone6
Default-667h@2x.png
750 x 1334
https://gist.github.com/uebo/a6cfecd08900c889af11/raw/474b3145da27830066688236b838ff51cca35281/Default-667h@2x.png
 
5. iPhone6 Plus
Default-736h@3x.png
1242 x 2208
https://gist.github.com/uebo/a6cfecd08900c889af11/raw/96e7bc8d556a09ab0b71bacce5c8a9b0124ba494/Default-736h@3x.png

まとめて見る場合はこちら
https://gist.github.com/uebo/a6cfecd08900c889af11

---
iPhone6が発売されて数日経ちましたが、GoogleやFacebookなど大手含めて、まだ大画面に最適化されてるアプリが少ないですね。iPhone6の発表で画面の詳細が明らかになったので、大画面化が予想されていたとはいえ、対応が間に合ってないのかと思いますが。

せっかくのiPhone6/6Plusの大画面が今のところあまり生かされていないのが、ちょっと寂しい気もしますが、約2週間前に発表でAppleの審査期間のことも考えると、現状は仕方がないかなと。

開発でいうと、UIKit系のアプリはAutolayoutの理解がマストになりそうですね。
[bootstrap] sidebarにアコーディオンを実装する

けっこう探した（つもりだ）けど、よいサンプルが見つからなかったので、自前で実装しました。


```html:sidebar.html
<div class="col-xs-3 col-xs-2 sidebar">
  <ul class="nav nav-sidebar">
    <li data-toggle="collapse" href="#collapse-A">
      <a href="#"><span class="caret"></span> menu A</a>
    </li><!-- collapse を正常に動作させるためには、閉じタグが必要。閉じないと、下記のリンクをクリックしたときに、collapse が発火する -->
    <ul id="collapse-A" class="collapse">
      <li><a href="A-1">A-1</a><!-- 閉じタグ省略可能 -->
      <li><a href="A-2">A-2</a><!-- 閉じタグ省略可能 -->
      <li><a href="A-3">A-3</a><!-- 閉じタグ省略可能 -->
    </ul>
    <li data-toggle="collapse" href="#collapse-B"><a href="#"><span class="caret"></span> menu B</a></li><!-- collapse を動作させるために閉じタグが必要 -->
    <ul id="collapse-B" class="collapse">
      <li><a href="B-1">B-1</a><!-- 閉じタグ省略可能 -->
      <li><a href="B-2">B-2</a><!-- 閉じタグ省略可能 -->
      <li><a href="B-3">B-3</a><!-- 閉じタグ省略可能 -->
    </ul>
  </ul>
</div>
```

入れ子のリストが、あまりかっこよくない。。。


ので、list-style-typeを指定しました。

```html:sidebar2.html
<div class="col-xs-3 col-xs-2 sidebar">
  <ul class="nav nav-sidebar">
    <li data-toggle="collapse" href="#collapse-A">
      <a href="#"><span class="caret"></span> menu A</a>
    </li>
    <ul id="collapse-A" class="collapse" style="list-style-type:none;">
      <li><a href="A-1"><span class="fa fa-angle-double-right fa-fw"></span> A-1</a>
      <li><a href="A-2"><span class="fa fa-angle-double-right fa-fw"></span> A-2</a>
      <li><a href="A-3"><span class="fa fa-angle-double-right fa-fw"></span> A-3</a>
    </ul>
    <li data-toggle="collapse" href="#collapse-B">
      <a href="#"><span class="caret"></span> menu B</a>
    </li>
    <ul id="collapse-B" class="collapse" style="list-style-type:none;">
      <li><a href="B-1"><span class="fa fa-angle-double-right fa-fw"> B-1</a>
      <li><a href="B-2"><span class="fa fa-angle-double-right fa-fw"> B-2</a>
      <li><a href="B-3"><span class="fa fa-angle-double-right fa-fw"> B-3</a>
    </ul>
  </ul>
</div>
```




### 参照

 * [sidebarのサンプル](http://getbootstrap.com/examples/dashboard/)
 * [collapseの動作](http://getbootstrap.com/javascript/#collapse)
 * [Font Awesome](http://fortawesome.github.io/Font-Awesome/icons/)
外付けSDカードにデータを保存


##そもそも
Androidは外部SDに保存するパスがバラバラなので、あまり外部ストレージに保存するのは推奨されない。それでも保存したい時の話。
http://techbooster.org/android/application/16004/

##内部ストレージのパス
内部ストレージへのパスは
`Environment.getExternalStorageDirectory()`
メソッドで取得する。(メソッド名は外部っぽいけど内部)

##端末の外部ストレージのパス取得
端末を繋いだ状態でAndroid Studioのナビバーのドロイドくんをクリックし、Android Device Monitorを起動

`/system/etc/vold.fstab` を保存書き出ししてファイルをエディタで開く。

```
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
# ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# NOTE: This file has been modified by Sony Mobile Communications AB.
# Modifications are licensed under the licence above.

dev_mount ext_card /storage/sdcard1 auto /devices/platform/msm_sdcc.3/mmc_host
dev_mount usbdisk /storage/usbdisk auto /devices/platform/msm_hsusb_host
```
最後の2行に外部ストレージのパスが書いてある。
この端末の場合
`/storage/sdcard1` ← MicroSD
`/storage/usbdisk ` ← USB Port

となる。

あとは内部ストレージと同じように使える。

参考)
http://nobuo-create.net/sdcard-2/
UnityでiOSのコンパスにアクセスする


Inputクラスからコンパスの向きを検出できる。よく似た機能のGPSとは使い方が違うのでハマってしまった。

GPSの場合は公式のサンプルにもあるように<code>LocationService.Start</code>を呼び、タイムアウトなどを扱う事で緯度経度にアクセスできるという仕組み。

[LocationService.Start](http://docs.unity3d.com/ScriptReference/LocationService.Start.html)

```UnityScript:GPSを使う例
function Start () {
        // First, check if user has location service enabled
        if (!Input.location.isEnabledByUser)
            return;
        // Start service before querying location
        Input.location.Start ();
        // Wait until service initializes
        var maxWait : int = 20;
        while (Input.location.status
               == LocationServiceStatus.Initializing && maxWait > 0) {
            yield WaitForSeconds (1);
            maxWait--;
        }
        // Service didn't initialize in 20 seconds
        if (maxWait < 1) {
            print ("Timed out");
            return;
        }
        // Connection has failed
        if (Input.location.status == LocationServiceStatus.Failed) {
            print ("Unable to determine device location");
            return;
        }
        // Access granted and location value could be retrieved
        else {
            print ("Location: " + Input.location.lastData.latitude + " " +
                   Input.location.lastData.longitude + " " +
                   Input.location.lastData.altitude + " " +
                   Input.location.lastData.horizontalAccuracy + " " +
                   Input.location.lastData.timestamp);
        }
        // Stop service if there is no need to query location updates continuously
        Input.location.Stop ();
    }
```

コンパスの場合はStartメソッドは無く、enabledにtrueを代入するとコンパスから値を取得できるようになる。

```CSharp:コンパスを使うスクリプト
using UnityEngine;
using System.Collections;

public class ComRotate : MonoBehaviour {

	// Use this for initialization
	void Start () {
		Input.compass.enabled = true;
	}
	
	// Update is called once per frame
	void Update () {
		transform.rotation = Quaternion.Euler(0, -Input.compass.trueHeading, 0);
	}
}
```

iOSのバージョンによる違いやAndroidでどう動くのかなどは調べていません。
２つのファイルの各行を交互にマージする

```text:1.txt
1
2
3
```

```text:a.txt
a
b
c
```

```text:
> paste -d "\n" 1.txt a.txt
1
a
2
b
3
c
```

Cygwin でもできた。

#参考
- [シェルスクリプトで複数ファイルを交互に操作する方法 - BIGLOBEなんでも相談室](http://soudan1.biglobe.ne.jp/qa2733271.html)
- [Linuxコマンド集 - 【paste】ファイルを水平方向に連結する：ITpro](http://itpro.nikkeibp.co.jp/article/COLUMN/20131209/523511/)
Railsをbundlerでプロジェクト毎に管理

普通に`gem install rails`とかしちゃうと大量の依存gemがシステムにインストールされてしまってなんかクリーンじゃない。
ということでタイトルの通り、Rails自体もbundlerでプロジェクト毎にインストールする。

まずはApplication名にしたい名前のディレクトリを作成

```
$ mkdir hoge
$ cd hoge
```

`bundle init`で`Gemfile`の作成

```
$ bundle init
Writing new Gemfile to /home/vagrant/sandbox/Gemfile
```

Gemfileで`rails`gemを指定

```ruby
# A sample Gemfile
source "https://rubygems.org"

gem "rails"
```

railsをbundlerで指定のディレクトリにインストール

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

`bundle exec rails new .`でカレントディレクトリにRailsプロジェクトを作成
Gemfileを上書きしてよいか聞かれるので、`Y`を打つ。

```
$ bundle exec rails new .
       exist
      create  README.rdoc
      create  Rakefile
      create  config.ru
      create  .gitignore
    conflict  Gemfile
Overwrite /home/vagrant/sandbox/Gemfile? (enter "h" for help) [Ynaqdh]
```

サーバー起動

```
$ bundle exec rails s
```
rails4 grape 参考サイト

使い方
http://tnakamura.hatenablog.com/entry/2014/02/25/115706

http://qiita.com/anoworl/items/756f01cc3d188ebad139

http://morizyun.github.io/blog/rails-grepe-api-heroku-ruby/

クラス分割
http://tnakamura.hatenablog.com/entry/2014/07/08/113000
Ruby/Railsチェックポイント


Ruby on Rails学んでみてるけれど、結局何ができてればいいの？という人のためにチェックポイントをまとめてみました。

## 勉強の際の参考文献

以下の2つは、通しで読んでみたら良いドキュメント

Rails Tutorial
本家：https://www.railstutorial.org/
日本語版：http://railstutorial.jp/

Rails Guide
本家：http://guides.rubyonrails.org/
日本語版：http://ruby.studio-kingdom.com/rails/guides/getting_started


その他なら、ネットに頼らず本を買ってそれをひと通りやってみるほうが、知識を体系的に習得するのが速い気がしています。

Rubyはプログラミング経験者ならまずRailsから入って、適宜調べるのでも学べる気がしています。

## Ruby


- for, whileを使わないループがかける
- String"", Array[], Hash{}に対してどういう操作が出来るか理解している
- map(&:to_i)の意味がわかる
- メソッドが?や!で終わることがあるがそれぞれどういうことを指し示しているか理解している
- メソッドを動的に作る方法2つ：define_method, method_missingについて理解している
- `[["a","b"],[1,2]].to_tsv => "a\tb\n3\t4"` ということが出来る

## Rails


- MVC, ORマップ, RESTFul 3つのキーワードの大まかな理解と、Railsとの対応の理解
- Railsのディレクトリ構成、いつ単数形でいつ複数形か等の規約が理解できている
- rails g scaffoldで作られる構成が自分で0から作成できる
- railsで作られたあるページのURLをみて、それに関係するView/Controllerが探し出せる
- xxx_pathの生成ルールを理解し、使えるオプションを理解している
 - 規約を用いて勘を使う方法と、`config/routes.rb`や`rake routes`などからちゃんと特定する方法の両方出来ると良い
- モデルで1対1,1対多,多対多の関係をdeleteの挙動を含め適切に構築できる
- 適切にモデルに対するクエリ(`where`など)をかける
 - 特にjoinが発生する複数モデルにまたがる時にeagerloadを考慮できる

### いらない部分

- FormHelperに関する理解

必要になった時に調べれば何の問題もないし、最近はJSでview template書く事が多いので要らないし、[simple_form](https://github.com/plataformatec/simple_form)使った方がいいことも多い。
ただし、link_toだけはそれでも使うことが多いので[UrlHelper](http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html)については理解すること。

## その他gemまわり

- pryの使い方
 - binding.pryを用いたデバッグ法
 - メソッドの定義場所の特定
- RSpec
 - factory_girl

## その他参考になるリンク

[Rubyはじめての人がRails開発に参加するときに最初に知っておくべきこと](http://qiita.com/awakia/items/42525adb473c7cc6b811) by [awakia](http://qiita.com/awakia)
[rails開発に加わる前に学んで欲しいこと](http://qiita.com/reikubonaga/items/60b4f6ee0a86ed06e83b) by [reikubonaga](http://qiita.com/reikubonaga)
[新人エンジニアに読んで欲しい英語ドキュメントまとめ (Ruby/Rails編)](http://engineer.wantedly.com/2013/12/26/getting-started.html) by [kawasy](http://qiita.com/kawasy)
【間違い】UnicornとかのSocketに `/tmp/` ディレクトリを使っちゃダメらしい

ごめんなさい、以下の記述は全部忘れてください。`/tmp`意外はdeployするユーザーの権限がないのでsocketの作成ができません。

なぜ動かなかったのかはわかりませんが、全部元に戻したらまた動き出しました。

### こっから元の記述(間違えてた)


何もUnicornの設定を変えてないはずなのにこんなエラーが出て困る。

>2014/09/24 04:08:49 [error] 1547#0: *1887 upstream timed out (110: Connection timed out) while reading response header from upstream, client: xxx.xxx.xxx.xxx,  server: examle.com, request: "GET /static_pages/about HTTP/1.1", upstream: "http://unix:/tmp/unicorn.examle.sock:/static_pages/about", host: "examle.com"

## 原因？

どうやら "`/tmp` にソケットファイルを置くんじゃねーよ！ `/var/sockets` とか `/var/run` におけ！" というお触れが出てるっぽいのでそれが原因じゃないかなと思う。(これ書いてる時は未解決)

いずれにせよsocketを `/tmp` に置くのはやめといたほうが良さげです。

http://serverfault.com/questions/463993/nginx-unix-domain-socket-error/464025
macでwine使うならEasyWine.appがオススメ

# wineプロジェクト派生

| プロジェクト名        | 日本語 | 作者                | 特徴                |
|:----------------------|:-------|:--------------------|:--------------------|
| CrossOver             | ×     | CodeWeavers     | 有償。Microsoft Office の動作に強い印象 |
| cedega                | ×     | transgaming         | 無料？3Dゲームが多く動く |
| playonline (playonmac)  | ×     | transgaming         | 無料。3Dゲームが多く動く(cedegaより活動が活発な印象) |
| WineBottler           | ×     | Mike Kronenberg | IE8などワンクリックでインストールできる |
| NXWine                | △     | mattintosh4     | wineのX不要版 (しかしライブラリの都合Xインストールした方がいい) |
| Nihonshu              | △     | mattintosh4     | NXWineの修正 (コマンドライン専用) |
| MikuInstaller         | △     | uunnie          | 同梱されているwineが2008年で止まっている |
| MikuInstaller-Kai-Kit | △     | mattintosh4     | MikuInstallerを最新のWineに更新     |
| EasyWine              | ○     | mattintosh4     | 黙ってこれを使っとけ    |


# EasyWine

* [? EasyWine.app ? - ? mattintosh note ?](http://mattintosh.hatenablog.com/entry/20140706/1404653173)
* [Nihonshu - 日本語 Mac OS X 用カスタム Wine バイナリ part.2 - NAVER まとめ](http://matome.naver.jp/odai/2140238022377155001)

## インストール

![1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/1535cbbe-c46e-7d73-008d-f362eb4f6464.png)

![2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/d1ed5d01-1c7d-408c-101a-4cc451393536.png)

![3.png](https://qiita-image-store.s3.amazonaws.com/0/25728/cc5b9fc7-95f1-07e7-4500-9044869a912c.png)

![4.png](https://qiita-image-store.s3.amazonaws.com/0/25728/1c8f0b93-1dd2-54c7-6ac8-c4f27ea42ab3.png)

## EXEの実行

* EXEの実行は、Wineエクスプローラから実行すること。
  * MacのFinderからexeをダブルクリックしても実行されない。

### wsh 5.6 のインストール

* [Download Windows Script](http://www.microsoft.com/ja-jp/download/details.aspx?id=1406)
  * script.exe をインストールしておく。

![vbscript.png](https://qiita-image-store.s3.amazonaws.com/0/25728/c65b7b4e-6cb6-ac79-1522-680c3c113c36.png)

![スクリーンショット 2014-09-24 8.51.38.png](https://qiita-image-store.s3.amazonaws.com/0/25728/3598c1e2-4d80-fbcd-a054-867744c42733.png)


![kaoriya-vim.png](https://qiita-image-store.s3.amazonaws.com/0/25728/cd77314e-ecb9-3efd-ad4a-da9412202512.png)

# mfc42.dllをインストール

* [MFC42.DLL & MSVCRT.DLLのダウンロード : Vector ソフトを探す！](http://www.vector.co.jp/soft/dl/win95/util/se040499.html)
  * c:\windows\system32\ にdllをコピーする。

![スクリーンショット 2014-09-24 9.04.58.png](https://qiita-image-store.s3.amazonaws.com/0/25728/b564642a-8a00-68b7-273e-42a68d75eb7e.png)

* MFC42.dllを必要なアプリケーションが動作するようになります。
* Wineエクスプローラーは色々残念なのでファイラーを別途用意したほうがいいです。


![phpstorm8.png](https://qiita-image-store.s3.amazonaws.com/0/25728/2a83c7c5-3638-3ddd-3426-b542050c86e9.png)

# DirectX 9cをインストール

* [DirectX End-User Runtimes (June 2010)](http://www.microsoft.com/en-us/download/details.aspx?id=8109)
* [FAQ 8.1. Wine は DirectX をサポートしていますか？ Wine で Microsoft の DirectX をインストールすることはできますか？](http://wiki.winehq.org/FAQ_ja#head-0c37c567536ebf39ad1d9c5eb0b0fe5ca345a91b)

![directx.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a2965cf3-fb79-b4a2-bd7c-36399343ddb5.png)

動作するかは未確認。

## PATH

* /Applications/EasyWine.app/Contents/Frameworks/bin/

----

## 以下Linux用wineで動作確認

* IPMessenger 64bit版 -> 動いた
pepperメモ Pythonで書く最低限のブロックの作り方


初投稿なのでテストも兼ねてメモ作成。
GIFはLICEcapで作成。

* Pythonで書く最低限のブロックの作り方

* 作り方
 ![testgif.gif](http://gifzo.net/bCEgYJtfkQ.gif) 

* 使い方
 * INとOUTに通常通り線をつなぐだけです。
   
- 追記
 - GIFはそのまま上げられないのか…残念…
 - どこかに上げてリンク張る形に後で変えよう…
Makefileテンプレ

-

```Makefile
# Makefile

# プログラム名とオブジェクトファイル名
TARGET = sandbox
OBJS = main.o

# 定義済マクロの再定義
CC = llvm-gcc
CFLAGS = -g -Wall
LDFLAGS = -lstdc++

# サフィックスルール適用対象の拡張子の定義
.SUFFIXES: .cpp .o

# プライマリターゲット
.PHONY: all
all: depend $(TARGET)

# プログラムの生成ルール
$(TARGET): $(OBJS)
	$(CC) $(LDFLAGS) -o $(TARGET) $^
	ls -al $(TARGET)

# サフィックスルール
.cpp.o:
	$(CC) $(CFLAGS) -c $<

# ファイル削除用ターゲット
.PHONY: clean
clean:
	$(RM) $(TARGET) $(OBJS) depend.inc

# 実行
.PHONY: run
run:
	./$(TARGET)

depend:
	makedepend *.h *.cpp


```
Vagrant入門


手持ちのPCで開発していくと分けわかんない環境になっていって収集がつかなくなるので開発環境は仮想化しておくとやり直しや同じものを２台用意したりするのがとっても簡単になります。ツールはvagrantを使います。
## 準備
vagrantを動かすためにはvmwareかvirtualboxのどちらか仮想環境が必要です。今回はvirtualbox

### virtualboxインストール
以下からダウンロードしてインストールします

https://www.virtualbox.org/

## vagrant
### vagrantインストール
以下からダウンロードしてインストールします
https://www.vagrantup.com/

### centosで開発環境を作ってみる
vagrantは元になるosの雛形を自由に選べます
以下で検索して好きな雛形を見つけてください。
https://vagrantcloud.com/discover/featured

今回はcentosを例にします

#### 初期化
```
mkdir Vagrant
cd Vagrant
vagrant init chef/centos-6.5
```
Vagrantfileという開発環境設定ファイルが出来上がります

### Vagrantfileを編集

今回は２台分の環境を作成します
Vagrantfileに設定してあげるだけで２台用意できます

- host
仮想開発環境の親分
- sandbox
遊び倒して問題があったら気楽に消せる砂場

```
vi Vagrantfile
```

`config.vm.box = "chef/centos-6.5"`の行(13行目あたり)をコメントアウトして以下を追記します

```diff
- config.vm.box = "chef/centos-6.5"
+ # config.vm.box = "chef/centos-6.5"

+   config.vm.define "host" do |node|
+         node.vm.box = "chef/centos-6.5"
+         node.vm.hostname = "host"
+         node.vm.network :private_network, ip: "192.168.66.51"
+   end
+
+   config.vm.define "sandbox" do |node|
+         node.vm.box = "chef/centos-6.5"
+         node.vm.hostname = "sandbox"
+         node.vm.network :private_network, ip: "192.168.66.52"
+   end
```

### vagrant 起動！
```
vagrant up
```
２台立ち上がったか確認します

```
$ vagrant status
Current machine states:

host                      running (virtualbox)
sandbox                   running (virtualbox)

This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.
```

#### 接続確認
```
vagrant ssh host
vagrant ssh sandbox
```
確認できたらexitで抜けてくる

### sandboxを操作設定

hostからsandboxを操作できるように設定していきます

#### ssh設定
hostに接続して

```
vagrant ssh host
```

ssh設定して

```
vi .ssh/config
```

```.ssh/config
Host sandbox
	HostName 192.168.66.52
```

```
chmod 600 .ssh/config
ssh-keygen -t rsa # いろいろ聞かれるが開発環境なので全部エンターでok
```
```
ssh-copy-id sandbox
Are you sure you want to continue connecting (yes/no)? yes
vagrant@192.168.66.52's password: #vagrantのパスワードは vagrant
```
確認

```
ssh sandbox
```
接続確認できたらexitしてhostに戻ります


#### 構成管理(ansible)インストール
開発環境を簡単にセットアップできるようにansibleという構成管理ツールを入れます

```
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo rpm -Uvh epel-release-6-8.noarch.rpm
sudo yum -y install ansible
ansible --version # 確認
```
設定ファイルを作成

```
mkdir ansible
cd ansible
vi hosts # ansible対象環境の設定
```

```~/ansible/hosts
[sandbox]
192.168.66.52
```

```
vi ansible.cfg # ansible設定
```

```~/ansible/ansible.cfg
[defaults]
hostfile = ./hosts
```

ping確認
pongと返ってくればok!

```
$ ansible all -m ping
192.168.66.52 | success >> {
    "changed": false,
    "ping": "pong"
}
```

今回はansibleにはあまり触れてませんがこれを利用してプロジェクトごとに開発に必要なパッケージを設定しておいて別々に構築とかできるようになるので便利です。

### vagrant終了
hostからexitで抜けたあと以下のコマンドで２台ともshutdownできます


```
vagrant halt
```

# まとめ
- node.js用、solr用などいろいろ開発環境をhostのansibleからインストールできるので便利
- インストールパッケージを設定ファイルに記述できるので再利用しやすい
- 以前vagrantを触ったときは手こずった気がしてたが今回はすんなりいった。安定してきたのかな？
- ansibleもドキュメントが豊富でわかりやすくなってきた。英語だけどねorz　http://docs.ansible.com/
- スナップショット、dockerを利用してもうちょっと便利にしたい
iOSアプリのユーザ行動分析ツールReproをRubyMotionに組み込んでみる


## Reproとは
* iOSアプリの操作内容を動画として記録することで、ユーザの行動を観察/分析に役立てることができるアナリティクスツールになります。SDKとして提供されており、CocoaPodsからも利用できます。
* Lean開発に代表される仮説・検証のサイクルをまわすサービス開発では、重用されていくツールだと思います。
* Reproのサイトは[こちら](https://repro.io/apps)


## 導入手順

### motion-cocoapodsのセットアップ

* gemのインストール

```ruby:Gemfile
gem 'motion-cocoapods'
```

* プロジェクトでmotion-cocoapodsを利用する設定  
  (Rakefileにrequireステートメントを追加)

```ruby:Rakefile
require 'rubygems'
require 'motion-cocoapods'
```

* CocoaPodsで扱えるライブラリ情報のセットアップ  
  (PCでCocoaPods、またはmotion-cocoapodsを一度も利用したことがない場合必要)

```bash
pod setup
```

### Reproのサイトにアプリ登録

* [Repro](https://repro.io)にアクセスし、ユーザ登録後に、アプリ > 新規アプリの登録で任意のアプリ名を登録すると、下記のようなObjective-Cのサンプルコードが出力される。ここではtoken情報をコピーする。

```objective-c:AppDelegate.m
#import <Repro/ReproInsight.h>;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

  [ReproInsight setupWithToken:@"<発行されたtoken>"];

  return YES;
}
```


### Reproをプロジェクトに組み込む

* RakefileにCocoapodsライブラリのReproを利用するための設定

```ruby:Rakefile
Motion::Project::App.setup do |app|
  #...  
  app.pods do
    pod 'Repro'
  end
end

```

* Reproをインストールする

```bash
bundle exec rake pod:install
```

* app_delegate.rbにReproサイトで取得したトークンを設定

```ruby:app/app_delegate.rb
class AppDelegate
  def application(application, didFinishLaunchingWithOptions:launchOptions)
    #...
    ReproInsight.setupWithToken("<Reproサイトで取得したtoken>")
  end
end
```

### アプリを起動して、操作を記録する
※ シミュレータでの方法を記載します。

* シミュレータを起動

```bash
bundle exec rake
```

* 適当に操作する。
* ホームボタンを押す(Cmd + Shift + H)


### 操作記録を確認する
* [Repro](https://repro.io/apps)の該当アプリの「インサイト」を選ぶ。
* アプリのインサイトを選択し、該当する動画のアイコンをクリックし、動画を再生する。

* 動画サンプル
<a href="http://www.youtube.com/watch?feature=player_embedded&v=BWJzX55aHxc
" target="_blank"><img src="http://img.youtube.com/vi/BWJzX55aHxc/0.jpg" 
alt="Repro on Rubymotion" width="240" height="180" border="10" /></a>
マルチパートアップロード対応のS3cmdを使ったファイルアップロード

# 問題

通信環境が悪かったため、ファイルサイズが大きいとタイムアウトしてしまう。
また、パッケージでインストールされるs3cmdは、マルチパートアップロードに対応していないため、ファイルサイズが大きいとタイムアウトしてしまう。

```
$ s3cmd put example.tar.gz s3://yourbacket/
```

出力結果

```
  704512 of 9100252     7% in    1s   457.09 kB/s  failed
WARNING: Upload failed: /example.tar.gz ([Errno 104] Connection reset by peer)
WARNING: Retrying on lower speed (throttle=0.00)
WARNING: Waiting 3 sec...
```

# 解決
最新版(1.5.0-rc1)を使う

## インストール


```
$ cd /var/tmp/
$ wget http://downloads.sourceforge.net/project/s3tools/s3cmd/1.5.0-rc1/s3cmd-1.5.0-rc1.tar.gz
$ tar xvzf s3cmd-1.5.0-rc1.tar.gz
$ cd s3cmd-1.5.0-rc1
$ python ./setup.py install
```

ダウンロード元：[sourceforge s3cmd](http://sourceforge.net/projects/s3tools/files/s3cmd/)

## Versionの確認

```
$ /usr/local/bin/s3cmd --version
```

出力結果

```
s3cmd version 1.5.0-rc1
```

## アクセスキー／シークレットキーの設定

```
$ /usr/local/bin/s3cmd --configure
```

## オプションの確認

```
$ /usr/local/bin/s3cmd | grep multipart
```

出力結果

```
                        multipart upload parts.  Restarts/parts files that
                        put) and there are multiple partial uploads.  Use
                        s3cmd multipart [URI] to see what UploadIds are
                        used multiple times. For instance set 'Expires' or
  --disable-multipart   Disable multipart upload on files bigger than
                        --multipart-chunk-size-mb
  --multipart-chunk-size-mb=SIZE
                        Size of each chunk of a multipart upload. Files bigger
                        than SIZE are automatically uploaded as multithreaded-
                        multipart, smaller files are uploaded using the
  show multipart uploads
      s3cmd multipart s3://BUCKET [Id]
  abort a multipart upload
  list parts of a multipart upload
```

## アップロード

`multipart-chunk-size-mb`で分割ファイルサイズを選択する。単位はメガバイト
5MB以上に設定する必要がある。5MBに指定したら成功した。デフォルトは15MB。

```
$ /usr/local/bin/s3cmd --multipart-chunk-size-mb=5 put <your file> <your s3path>
```

# トラブルシュート

```
./s3cmd ls
```

```
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ImportError trying to import dateutil.parser.
Please install the python dateutil module:
$ sudo apt-get install python-dateutil
  or
$ sudo yum install python-dateutil
  or
$ pip install python-dateutil
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Traceback (most recent call last):
  File "./s3cmd", line 2530, in <module>
    except (ParameterError, InvalidFileError), e:
NameError: name 'ParameterError' is not defined
```

## 解決

python-dateutilをインストールする

for ubuntu

```
$ sudo apt-get install python-dateutil
```

for centos

```
$ sudo yum install python-dateutil
```
migu-1m フォントの「波ダッシュ」字形の修正

こんにちは。

------------

migu-1m フォント [migu-1m-20150712.zip](https://osdn.net/projects/mix-mplus-ipa/releases/) 版では、「波ダッシュ」(0u301c) が適切な字形へ修正され、したがって本稿のような自力作業は不要のようです。

------------

migu-1m フォントは、「波ダッシュ」(0u301c) がひっくり返った字形を採用しているので、適切な字形へ修正。fontforge コマンドを利用し、「全角チルダ」の字形を利用。

```sh
#!/bin/sh
for f in "migu-1m-regular.ttf migu-1m-bold.ttf"
do
  fontforge -c 'Open($1);Select(0uff5e);Copy();Select(0u301c);Paste();Save();' $f
done
```

もしくは、

```sh
#!/usr/bin/env fontforge -script
# http://iij.dl.sourceforge.jp/mix-mplus-ipa/59022/migu-1m-20130617.zip

flist = ["migu-1m-regular.ttf", "migu-1m-bold.ttf"]
i = 0
while (i < SizeOf(flist))
  Open(flist[i])
  Select(0uff5e) # fullwidth tilde
  Copy()
  Select(0u301c) # wave dash
  Paste()
  Generate(flist[i])
  Print(flist[i] + " is overwritten.")
  Close()
  i += 1
endloop
```

---------------------

また「[プログラミング用フォント Ricty](https://github.com/yascentur/Ricty)」の ricty_generator.sh と misc/glyph_replacer.pe (字形修正用) とを用いて Ricty フォント作成の homebrew の formula を書くと（ほぼ [homebrew-font] (https://github.com/sanemat/homebrew-font) そのものですが）、 

```ruby
require 'formula'

class InconsolataFonts < Formula
  homepage 'http://levien.com/type/myfonts/inconsolata.html'
  url 'http://levien.com/type/myfonts/Inconsolata.otf'
  sha1 '7f0a4919d91edcef0af9dc153054ec49d1ab3072'
  version '1.0.0'
end

class Migu1MFonts < Formula
  homepage 'http://mix-mplus-ipa.sourceforge.jp/'
  version '20130617'
  sha1 'a0641894cec593f8bb1e5c2bf630f20ee9746b18'
  url "http://sourceforge.jp/frs/redir.php?m=iij&f=%2Fmix-mplus-ipa%2F59022%2Fmigu-1m-#{version}.zip"
end

class Ricty < Formula
  homepage 'https://github.com/yascentur/Ricty'
  version '3.2.4'
  sha1 '7fc8adcc74656d9e2e1acd325de82f0f08a6d222'
  url "https://github.com/yascentur/Ricty/archive/#{version}.tar.gz"

  depends_on 'fontforge'

  def install
    share_fonts = share+'fonts'

    Formula['inconsolata-fonts'].brew { share_fonts.install Dir['*'] }
    Formula['migu1-m-fonts'].brew { share_fonts.install Dir['*'] }

    ['migu-1m-regular.ttf', 'migu-1m-bold.ttf'].each do |f|
        system './misc/glyph_replacer.pe', share_fonts + f, '0u301c', '0uff5e'
    end

    system 'sh', './ricty_generator.sh', share_fonts+'Inconsolata.otf',
                                         share_fonts+'migu-1m-regular.ttf',
                                         share_fonts+'migu-1m-bold.ttf'

    share_fonts.install Dir['Ricty*.ttf']
  end

  test do
    system "false"
  end

  def caveats; <<-EOS.undent
    ***************************************************
    Generated files:
      #{Dir[share+'fonts/Ricty*.ttf'].join("\n      ")}
    ***************************************************
    To install Ricty:
      $ cp -f #{share}/fonts/Ricty*.ttf ~/Library/Fonts/
      $ fc-cache -vf
    ***************************************************
    EOS
  end
end
```
jCanvasのレイヤーを使ってみた

水玉コラを作るサイト
[こちら](http://canvas5.x.fc2.com/demo.html)
![a.jpg](https://qiita-image-store.s3.amazonaws.com/0/54926/9c96068c-3826-8ea8-d87f-d8461803d454.jpeg)

使用Canvasライブラリ　[jCanvas](http://calebevans.me/projects/jcanvas/docs/draggableLayers/)
***
追記（2014/10/15）
高機能版:[水玉コンポ](http://canvas5.x.fc2.com/c.html)
***
追記（2015/7/10）
HTML5 Audioを使った[水玉ボイス](http://canvas5.x.fc2.com/voice.html)
Web Speech APIを使った[水玉スピーチ](http://canvas5.x.fc2.com/speech.html)
***
追記（2016/2/17）
[水玉コンポ ver.2](http://canvas5.x.fc2.com/g.html)