OmniAICreator/Qiita-1.07M huggingface dataset:
備忘録ネット広告用語

* UU ゆーゆー Unique User
    * ウェブサイト、またはウェブサイト内の特定のページを訪問した人の数
    * http://www.okuramkt.com/dic/effect/uu.html
* ARPU あーぷ verage Revenue Per User
    * ユーザー1人あたりの平均売上金額
    * http://cybertimes.info/words/a/words-arpu/
* ARPPU あるぷぷ（Average Revenue Per Paid User）
    * 課金ユーザー1人あたりの平均売上金額
    * http://cybertimes.info/words/a/words-arpu/
* PU ぴーゆー paying user
    * 課金ユーザー
    * http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1192762641
* KPI けーぴーあい Key Performance Indicators
    * 重要業績評価指標
    * いわゆる「数字」全般のこと
    * http://ja.wikipedia.org/wiki/%E9%87%8D%E8%A6%81%E6%A5%AD%E7%B8%BE%E8%A9%95%E4%BE%A1%E6%8C%87%E6%A8%99
* リワード広告とブースと広告の違い
    * http://リワード広告.com/%E3%83%AA%E3%83%AF%E3%83%BC%E3%83%89%E5%BA%83%E5%91%8A%E3%81%A8%E3%83%96%E3%83%BC%E3%82%B9%E3%83%88%E5%BA%83%E5%91%8A%E3%81%AE%E9%81%95%E3%81%84/
* グロス売上とネット売上
    * https://www.gmo.jp/report/analytics/03/index.php
Phalcon2系で独自Validationのエラーが出る時の対策

Phalcon1系から2系にそのまま移行しようとすると、
独自バリデーションインターフェースでこんなエラーが出ちゃう。

```
Declaration of MyValidation::validate() must be compatible with Phalcon\Validation\Validator::validate(Phalcon\Validation $validation, $attribute)
```

```php:Phalcon1系での書き方
use Phalcon\Validation\Validator;
use Phalcon\Validation\ValidatorInterface;

class MyValidation extends Validator implements ValidatorInterface
{
    public function validate($validator, $attribute)
    {
        ...
    }
}
```

2系ではこうしないとダメらしい…

```php:Phalcon2系での書き方
use Phalcon\Validation\Validator;
use Phalcon\Validation\ValidatorInterface;

class MyValidation extends Validator implements ValidatorInterface
{
    public function validate(\Phalcon\Validation $validator, $attribute)
    {
        ...
    }
}
```

投稿現在(2015/05/14)では、
公式ドキュメントも1系の書き方で記載されているので要注意！
タブ派のための checkstyle

個人的には、checkstyle 自体が提供しているルールが、spece によるインデントフォーマットをとっているので、ぜひともそれを適用したい。しかし、歴史的な事情などによりタブによるインデントを強制させたいときがあった。

残念ながら checkstyle 自体はそういうルールは提供していないので、hibernate が使っている checkstyle ルールを使う。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.1//EN" "http://www.puppycrawl.com/dtds/configuration_1_2.dtd">
<module name="Checker">
    <module name="TreeWalker">
        <!-- indent rule: via https://github.com/hibernate/hibernate-orm/blob/master/shared/config/checkstyle/checkstyle.xml#L35   -->
        <module name="RegexpSinglelineJava">
            <property name="ignoreComments" value="true" />
            <property name="format" value="^\t* +\t*\S" />
            <property name="message" value="Line has leading space characters; indentation should be performed with tabs only." />
        </module>
    </module>
</module>
```
FuelphpでWebアプリを作成した時のNetBeansに入れたプラグイン設定

また最初から構築する時に忘れそうなので、メモる。

# プラグインの導入の操作方法

* ツール→プラグイン→使用可能なプラグインタブ選択→入れたいプラグインをチェック→インストール→次→ライセンス同意にチェック→インストール→証明書の確認を続行

# 改行コード関連

## Change Line Ending on Save

* 保存時に改行コードを変更する。LF,CRLF,CR
* 保存時にUnix(LF)にして欲しい。
* 設定箇所：ツール→オプション→エディタ→Line Endingタブ→Enable adjusting the line ending→Unix(LF)

## Show and change line ending

* 右下に現在の改行コードを表示
* 設定：無し

# ファイル関連

## Show path in titlebar

* タイトルバーにファイルパスを表示する
* 設定：デフォルトでOK

## Explore from here

* ファイルをエクスプローラで開く
* 設定：デフォルトでOK

# HTML5

## HTMLカスタム

* カスタムHTML拡張をHTMLエディタに統合するためのサポートを提供します。

## HTML5キット

* HTML5アプリケーション静的クライアント側プロジェクト

# PHP

* カテゴリで必要なもの全て。大体ほとんど入れた。
* その中でも設定が必要な物は以下

## PHP CS Fixer

PHPスクリプトを自動整形するツール
まずはPHP CS Fixerをcomposerでfuelphpプロジェクトにインストール

* Gitbashを起動
* fuelphpプロジェクトに移動してcomposerでインストール

<pre>
$ cd work/fuelphp
$ php composer.phar require fabpot/php-cs-fixer --dev
</pre>

* ./fuel/vendor/fabpot/php-cs-fixer/php-cs-fixerにインストールされるので、設定でPATHを指定する。
* ツール->オプション→PHP→フレームワークおよびツールタブ選択→PHP CS Fixerを選択
* PATHにC:\Users\my_account\work\fuelphp\fuel\vendor\fabpot\php-cs-fixer\php-cs-fixerを指定
* --level = psr2
* --config = default
* --fixers = short_array_syntax (配列書くときにarray()を[]に変換したい)
* costom欄に--diff (実行時に差分を一応見たい)
* --dry-run欄 verboseとdiffに両方チェック

## PHP FuelPHP フレームワーク

* FuelPHPフレームワークのサポート。

## PHPUnit

* PHPUnitはcomposerでインストールしておく。

<pre>
$ cd ~/work/fuelphp
$ php composer.phar require phpunit/phpunit:4.6.* -dev
</pre>

* oilコマンドの設定に実行PATHを通す

```php:fuel/app/config/oil.php
'binary_path' => VENDORPATH. 'bin/phpunit',
```

* PHPUnitテスト・フレームワーク向けのサポート。
* ツール→オプション→PHP→フレームワークおよびツールタブ選択→PHPUnitを選択

* PHPUnitの実行PATHを指定
C:\Users\my_account\work\fuelphp\fuel\vendor\bin\phpunit.bat

プロジェクト毎の設定

* プロジェクト右クリ→プロパティ→テスト→テストディレクトリを選択(fuelphp\app\tests)→テストプロバイダ欄のPHPunitにチェック
* PHPUnitタブ→ブートラップの使用にチェック
C:\Users\my_account\work\fuelphp\fuel\core\bootstrap_makegood.php

* XML構成の使用にチェック
C:\Users\my_account\work\fuelphp\fuel\core\phpunit.xml

* テスト実行はAlt+F6

# 設定がごちゃごちゃになってデフォルトに戻したい時

以下の設定ファイル置き場のディレクトリを消して再起動すると初期設定に戻る。
C:\Users\my_account\AppData\Roaming\NetBeans\8.0.2

# 関連するページ
[FuelPHPとXAMPPとNetBeansで開発環境をWindows上につくる](http://qiita.com/shojimotio/items/9461609e09efb930b841)
厨二病な名前のライブラリを集めるスレ

* ミスリル。クライアントサイドMVC。 http://mithril.js.org/

  * 参考: http://qiita.com/shibukawa/items/890d24874655439932ec

* エリクサー。Erlang VMで動く言語。 http://elixir-lang.org/

  * 参考: http://qiita.com/HirofumiTamori/items/0dfdbada30c7d8f183fd
* エスナ。PHPのサーバサイドMVCフレームワーク。 http://ethna.jp/doc/
* ゴブリン。物理エンジン。 http://www.goblinphysics.com/

* オーディン。ゲームエンジン。 https://odinge.codeplex.com/
* タイタン。jQuery上のクライアントサイドMVC。 http://www.firerift.com/support/docs/titan/
* バハムート。2Dゲームエンジン。 https://code.google.com/p/bahamut-engine/
* コカトリス。トランプゲーム用エンジン。 https://github.com/jdangerx/Cockatrice
PayPal Sandboxで任意の国のアカウントを作成する方法

PayPalのsandboxアカウントは、デベロッパーサイトから作れますが
https://developer.paypal.com/developer/accounts

ここで選べる国の指定は限られています。

PayPalは、支払アカウントの登録国と配送先に指定できる国に制限がかかる場合があるので、
海外販売などを考えてPayPal導入を考えている販売者さんは、想定するお客さんの国のアカウントが上記デベロッパーサイトで作れない場合は、sandboxのアカウント登録画面から直接国を選んで作ることができます。

https://www.paypal.com/

上記URLの「sign up」をクリックした後、（気付きにくいですが）、画面下部の国旗をクリック（おそらくデフォルトではアメリカになっていると思います）すると、登録できる国の国旗が全て出てくるので、作りたい国を選択すると、その国のアカウント登録画面になります。

当然その国の言葉の画面になるので、読めない場合はGoogle翻訳さんなどの力を借りましょう。

なお、この時クレジットカードを登録する必要がありますが、その時は以下の投稿で書いているやり方でテスト用のカード番号を生成することができます。

http://qiita.com/benzookapi/items/7165898ebab9dc640425
PayPal テスト用のクレジットカード番号を生成する方法

PayPalの通常のSandboxアカウントは以下のデベロッパーサイトから作成でき、この時テストで使うクレジットカード情報も生成されますが、
https://developer.paypal.com/developer/accounts

PayPal決済以外のクレジットカード決済のテストをしたい時や、アカウント登録のテストをしたい時に、アカウントに使われていないダミーのクレジットカード情報がほしいときがあります。

その場合、以下のサイトの

https://ppmts.custhelp.com/app/answers/detail/a_id/750/

「4. On the Add Credit Card tab」

の部分で、カードブランドを選んで「Generate CC Number」を押すとカード番号を生成できます。

「PayPal test card number」とかでググるとたどり着きますが、意外としられてないかもです。
「決定性有限オートマトン」を Haskell で実装してみた

先日、Qiita で [「HaksellのStateモナドとReaderモナドで決定性有限オートマトンの実行」](http://qiita.com/yumura_s/items/f975ad070c34ec8b9d54) という記事を見かけて、以前自分も Haskell で 決定性有限オートマトンを書いたことを思い出しました。

[見直してみると](http://tsumuji.cocolog-nifty.com/tsumuji/2012/04/post-dbca.html) 、遷移関数に漏れがあるとエラーになってしまうという情けない仕様だったので少し手直しをしてみました。

なお、「決定性有限オートマトン」に関しては [「HaksellのStateモナドとReaderモナドで決定性有限オートマトンの実行」](http://qiita.com/yumura_s/items/f975ad070c34ec8b9d54) を参照してください。


# 実装の方針

* 「現在の状態」は再帰関数の変数として渡す。
* 遷移関数を連想リストで表現し、lookup 関数で探す。
* Maybe モナドを使用することで、遷移関数を見つけられなかった場合でもエラーにならないようにする。


# 実装

```Haskell:dfa.hs
-----------------------------------------------------------------------
--
-- << DFA ( 決定性有限オートマトン ) >>
--
-- 参考：
--   http://d.hatena.ne.jp/cranebird/20120327/1332857936
--   http://kurt.scitec.kobe-u.ac.jp/~kikyo/lec/07/automaton/k2.pdf
--
-----------------------------------------------------------------------

import Data.Maybe (fromJust)
import Data.List  (foldl')


type State = String                   -- 状態
type Delta = [((State, Char), State)] -- 遷移関数
type F     = [State]                  -- 受理状態の集合


-- isAccept 遷移関数 受理状態の集合 初期状態 文字列  =>  真偽
isAccept :: Delta -> F -> State -> String -> Bool
isAccept ds f q0 cs = (result /= Nothing) && (elem (fromJust result) f)
  where
    result = foldl' g (Just q0) cs
    g st c = st >>= \x -> lookup (x, c) ds

-- makeDfa 遷移関数 受理状態の集合 初期状態  =>  dfa
makeDfa :: Delta -> F -> State -> String -> String
makeDfa ds f q0 cs = if (isAccept ds f q0 cs) then "Accept" else "Not Accept"



-- 例 1
-- Σ = {a}, 奇数個の 'a' からなる文字列を受理する
dfa1 :: String -> String
dfa1 = makeDfa ds f q0
  where
    ds = [(("Even", 'a'), "Odd"), (("Odd", 'a'), "Even")]
    f  = ["Odd"]
    q0 = "Even"


-- 例 2
-- Σ = {a, b}, 奇数個の 'a' からなる文字列を受理する
dfa2 :: String -> String
dfa2 = makeDfa ds f q0
  where
    -- 0 : 偶数個, 1 : 奇数個
    ds = [(("0", 'a'), "1"), (("0", 'b'), "0"),
          (("1", 'a'), "0"), (("1", 'b'), "1")]
    f  = ["1"]
    q0 = "0"


-- 例 3
-- Σ = {a, b}, 奇数個の a と偶数個の b からなる文字列を受理する
-- (0 は偶数とする)
dfa3 :: String -> String
dfa3 = makeDfa ds f q0
  where
    -- 一桁目 : a, 二桁目 : b
    -- 0 : 偶数個, 1 : 奇数個
    ds = [(("00", 'a'), "10"), (("00", 'b'), "01"),
          (("10", 'a'), "00"), (("10", 'b'), "11"),
          (("01", 'a'), "11"), (("01", 'b'), "00"),
          (("11", 'a'), "01"), (("11", 'b'), "10")]
    f  = ["10"]
    q0 = "00"


-- 問 4
-- Σ = {a, b, c}, 奇数個の a と偶数個の b からなる文字列を受理する
-- (0 は偶数とする)
dfa4 :: String -> String
dfa4 = makeDfa ds f q0
  where
    -- 一桁目 : a, 二桁目 : b
    -- 0 : 偶数個, 1 : 奇数個
    ds = [(("00", 'a'), "10"), (("00", 'b'), "01"), (("00", 'c'), "00"),
          (("10", 'a'), "00"), (("10", 'b'), "11"), (("10", 'c'), "10"),
          (("01", 'a'), "11"), (("01", 'b'), "00"), (("01", 'c'), "01"),
          (("11", 'a'), "01"), (("11", 'b'), "10"), (("11", 'c'), "11")]
    f  = ["10"]
    q0 = "00"
```

```
λ> dfa1 "a"
"Accept"
λ> dfa1 "aa"
"Not Accept"
λ> dfa1 "aaa"
"Accept"
λ> dfa1 "aaab"
"Not Accept"
```

Maybe モナドと畳み込みを使うことで、コードがかなりすっきりしたと思います。
[ネタ] T4でコード補完したい！

先の記事でも書きましたが、T4ってコード補完が効かないのはかなりキツいですよね？

というわけでT4でコード補完(インテリセンス)を有効にする方法を考えてみました。

※真面目にタイトルの件でお悩みの方はVisualSudioに[これ](https://visualstudiogallery.msdn.microsoft.com/a42a8538-8d6e-491b-8097-5a8a00174d37 "Devart T4 Editor")か[これ](https://visualstudiogallery.msdn.microsoft.com/6d1223ca-5e52-49d0-a489-910f9b76396e "tangible T4 Editor")を導入するのが近道です。<br />(無料のVisual Studio 2013 Communityにも導入できます)


##概要

[前回の記事](http://qiita.com/riafeed/items/0afce5ee587a40197b48)でC#とT4を同一ファイルでまとめることが出来るのを証明(?)しましたが、これを利用すればVisual Studio(以下VS)にC#コードと思わせて補完させつつT4のコードを記述することが出来るのは自明の理ですよね？

というわけでやってみました。

##まずはアセンブリ参照

しかし、T4で使う関数や変数の実体はMicrosoft.VisualStudio.TextTemplatingネームスペースにあるTextTransformationやITextTemplatingEngineHostクラスにありますので、これをIDEが把握していなければ補完もへったくれもありません。

ですので、上記のクラスを含んでいるDLLを参照設定に加えないといけないのですが、どこにあるんでしょう？

VS2013をインストールしていれば、このDLLは(Windows8.1の場合)


・C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.VisualStudio.TextTemplating.12.0\v4.0_12.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.TextTemplating.12.0.dll
・C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.VisualStudio.TextTemplating.Interfaces.10.0\v4.0_10.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.TextTemplating.Interfaces.10.0.dll
・C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.VisualStudio.TextTemplating.Interfaces.11.0\v4.0_11.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.TextTemplating.Interfaces.11.0.dll

にありますので、それぞれ追加しておきましょう。

参照設定すると、ビルドしてできた.EXEが上記DLLに依存するのではないかという心配があるかと思いますが、試した限りでは実際に参照しない限り問題ないようです。

##コードの準備

参照設定の追加が終わったら、インテリセンスが効くようにコードを準備します。

プロジェクトにC#ファイルを追加し、プロパティのカスタムツールに「TextTemplatingFileGenerator」と入れ、下記のコードをコピペしましょう。

```csharp
/*<# GenerationEnvironment.Length -= 2; #>
<#//++++++++++++++++++++++++T4のみ認識する領域++++++++++++++++++++++++++++++++++#>
<#//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#>
<#//*///#><#+/*
//***************************C#のみ認識する領域***********************************
#if DEBUG
namespace SharpTemplate
{
    class SharpTemplate : Microsoft.VisualStudio.TextTemplating.TextTransformation
    {
#pragma warning disable 0169, 0649
        Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost Host;
#pragma warning restore 0169, 0649

        public override string TransformText()
        {
            return "";
        }

        //*///#><#+
        //----------------C#・T4共に認識するクラス機能ブロック------------------------
        public void test() {
            
        }
        //----------------------------------------------------------------------------
        //*///#><#+/*
    }
}
#endif
//*///#>
```

コピペしたら、testメソッドのところでthis.やHost.と打ち込んでみると幸せになれます。もちろんこのままT4テンプレートとして使うこともできます。

なおC#では基本利用しないクラスですから#ifディレクティブでDEBGUビルドに設定されているときのみ有効になるようになっています。
sensuでログの監視する


## Goal

* sensuでアプリケーションレイヤーの異常を検知する
* ログのテキストを監視させて、パターンマッチしたらイベントを発生させる

## Install Plugin

```bash
cd /etc/sensu/plugins
wget "https://raw.githubusercontent.com/sensu/sensu-community-plugins/master/plugins/logging/check-log.rb"
chown sensu:sensu check-log.rb
chmod +x check-log.rb
```

以下の例はブラックリスト.
500 status codeが見つかったときのみイベントを発生させる.

```json:/etc/sensu/conf.d/check_log.json
{
  "checks": {
    "access-log": {
      "command": "/etc/sensu/plugins/check-log.rb -f /var/log/httpd/access.log --pattern ' 500 ' ",
      "interval": 60,
      "subscribers": [ "production" ],
      "handlers": ["default"]
    }
  }
}
```

`"subscribers": [ "production" ]`とした場合は、監視対象サーバの`client.json`の`subscriptions`もproductionである必要がある.

`check-log.rb`コマンドに`-f`で監視対象ログファイル名、`-qまたは--pattern`で監視対象文言（パターン）を指定する.
その他`check-log.rb`コマンドではパターン例外、warn、criticalなどのレベル設定などもできる(check-log.rb参照).

ホワイトリストで監視したい場合は、以下のようにする.

```json
"command": "/etc/sensu/plugins/check-log.rb -f /var/log/httpd/access.log --pattern '.*' -E ' 200 '"
```


## ログキャッシュ用ディレクトリを作成

check-log.rbでは、前回どこまでログを読んだか(何バイト目まで読んだか)をキャッシュする.
このキャッシュの保存場所は/var/cache/check-log以下になっているので、このディレクトリに書き込み権限がない場合は、permissionを変更しておく必要がある.

パーミッションがない場合以下のエラーが出る.

```
Check failed to run: Permission denied @ dir_s_mkdir - /var/cache/check-log, [\"/usr/local/ruby-2.1.1/lib/ruby/2.1.0/fileutils.rb:250:in `mkdir'\", \"/usr/local/ruby-2.1.1/lib/ruby/2.1.0/fileutils.rb:250:in `fu_mkdir'\", \"/usr/local/ruby-2.1.1/lib/ruby/2.1.0/fileutils.rb:224:in `block (2 levels) in mkdir_p'\", \"/usr/local/ruby-2.1.1/lib/ruby/2.1.0/fileutils.rb:222:in `reverse_each'\", \"/usr/local/ruby-2.1.1/lib/ruby/2.1.0/fileutils.rb:222:in `block in mkdir_p'\", \"/usr/local/ruby-2.1.1/lib/ruby/2.1.0/fileutils.rb:208:in `each'\", \"/usr/local/ruby-2.1.1/lib/ruby/2.1.0/fileutils.rb:208:in `mkdir_p'\", \"/etc/sensu/plugins/check-log.rb:207:in `search_log'\", \"/etc/sensu/plugins/check-log.rb:135:in `block in run'\", \"/etc/sensu/plugins/check-log.rb:129:in `each'\", \"/etc/sensu/plugins/check-log.rb:129:in `run'\", \"/usr/local/ruby-2.1.1/lib/ruby/gems/2.1.0/gems/sensu-plugin-1.1.0/lib/sensu-plugin/cli.rb:56:in `block in <class:CLI>'\"]\n
```

```bash
mkdir /var/cache/check-log
chown sensu:sensu /var/cache/check-log
```

# ログ監視の動作

`"interval": 60`に設定した場合は、毎分ログの監視が実行される.
エラーパターンにマッチしたときはイベントが発生する.
前回読まれた箇所は次回スキップされるので、次の実行でエラーパターンにマッチしなければイベントは自然に消える.
イベント通知時にメール送信、slack通知などのhandlerを設定すれば期待通りのログ監視が実現できる.

# slack連携

エラー検知したらslackに通知したい場合は以下を参考.
http://qiita.com/metheglin/items/4fb833d070191a547796
AutolayoutのProportional Widthでパーセントレイアウト

# 前置き

[AutoLayoutでViewのサイズやUIレイアウトをパーセント指定する方法](http://qiita.com/emadurandal/items/04c11db5eb1117eabe1e) でpercentレイアウトする方法が記述されてておおーってなりました。

記事内ではダミービューを使った手順がメインに解説されていたので、実験の意味を込めて自分なりに手順をまとめてみました。

# 作成するレイアウト

![about_layout.png](https://qiita-image-store.s3.amazonaws.com/0/15000/5c4df00e-403c-8b43-4b1f-7696d2350636.png)

横幅に対して75%, 50%, 25%の正方形を配置するレイアウトです。
見た目のズレのわかりやすさから３つ配置しました。

手順では省いていますが、正確にこのレイアウトを作るには別途中央寄せとAspectRatioの制約を設定してください。

# Proportional Widthの設定の仕方

## 要約

AutoLayoutには、Equal Width というconstraintsが設定できるのですが、この設定内のMultiplier値を1 から任意の数に変更することで、親のViewに対して1/4のサイズにするなどの等倍以外の制約を設定できます。

## 手順

順に手順を見ていきます。

1) 親のViewとViewを選択

![parent_and_child.png](https://qiita-image-store.s3.amazonaws.com/0/15000/f4591669-83c4-3e5c-0a5d-d81e8f3d2799.png)

2) Add New ContstraintsからEqualWidthを選択
 
![equal_width_contstraints.png](https://qiita-image-store.s3.amazonaws.com/0/15000/4b320653-b9e1-db16-9a05-2dbc141e4775.png)

3) 対象のViewの`Equal Widths Contstraint` を選択して項目値のMultiplierを親のViewに対する目的の比に設定する

例えば25%にしたいのであれば、4倍すると親のViewのサイズになるので、子のViewのMultiplierを4に設定します。

![multiplier.png](https://qiita-image-store.s3.amazonaws.com/0/15000/6f4fd1d7-896a-c033-9158-48cc1c1fbdcd.png)


対象のViewを選択した時のContstraintsの一覧を見た時に、 `Equal Width to: Superview` が `Proportional Width to: Superview` に変更されていればOKです。

| Multipler設定前 | Multipler設定後 |
|-----------------|----------------|
| ![before_equal width.png](https://qiita-image-store.s3.amazonaws.com/0/15000/9a99e39b-064a-6905-0a9d-1934cf4a68ce.png) | ![after_proportional_width.png](https://qiita-image-store.s3.amazonaws.com/0/15000/89f8a1e2-91c2-1ca4-8f28-3e43f24e84e5.png) |



Multiplierが1以外になると、Xcodeの表示が `Equal Width` から `Proportional Width` に変更になります。

# 動作確認

| iphone4s   | iphone5s  | iphone6  | iphone6p |
|------------|-----------|----------|----------|
| ![iphone4s.png](https://qiita-image-store.s3.amazonaws.com/0/15000/c29cd632-7494-a289-41e8-1cb0f51cb5fc.png) | ![iphone5s.png](https://qiita-image-store.s3.amazonaws.com/0/15000/b8a78393-e455-5cf8-e8c6-ad5a22668fa5.png) | ![iphone6.png](https://qiita-image-store.s3.amazonaws.com/0/15000/e34d199e-1b30-35a9-c0fd-e017f08f5e7c.png) | ![iphone6p.png](https://qiita-image-store.s3.amazonaws.com/0/15000/b9bd48fd-5d34-097d-bc4d-a2aec105be63.png) |

すべてのサイズで期待どおりのサイズで配置できました。

# コード

- [Autolayout Labo](https://github.com/mattak/AutolayoutLabo)
マスタがスレーブに仕込みをする（手描き図）


設定の手間を省いたり、スレーブの通信が落ちてしまったときに備えて、マスタ・スレーブの設定はsshを使うようにしています。

ただ、この設定がなんとなくイメージが掴みにくいようなので、理解間違っていないかどうか図にしてみました。
Jenkinsネタは久しぶりです...。


![master-slave.jpg](https://qiita-image-store.s3.amazonaws.com/0/27976/0a186213-6d90-74a8-d566-93c935427206.jpeg "master-slave.jpg")

大事なところは、3番目。

『スレーブのサーバが、slave.jar を起動して、自分のマスターに対して指示命令を受けて動けるように待ち受け状態になる』のが最終目標。

ですから、slave.jar というjarファイルをスレーブ側に置いて、サービスとして起動しておけば、別にssh通信は要りません。

Windowsの場合は標準ではSSHが使えないので、マスターの画面をブラウザで開き、マスター上のJavaアプリを起動してslave.jarを渡してもらい、その後はWindowsサービスにslave.jarの実行を登録して待ち受け状態にするというパターンをよく使っています。
Serfで実装するHigh Availability NAT (EIP付け替えパターン)

#Serfによる冗長化

前に実装したSerf冗長化ですが、EIPを付け替える要望がありましたので、
スクリプトを実装しました。

[Serfで実装するHigh Availability NAT](http://qiita.com/SatoHiroyuki/items/5b2e872b59ea8a18b5aa)


## 構成図

![ha-nat-eip.png](https://qiita-image-store.s3.amazonaws.com/0/49877/76a52bdf-6e6b-1c4c-5efe-822be0a3530f.png)


##実装

実装方法は前と替りませんが、スクリプトが変更になります。

https://github.com/SatoHiroyuki/ha-nat-script/blob/master/ha-nat-eip

実行方法
```
ha-nat-eip -R [変更するRouteTableのTagName] -E [Allocation-id] -N 0.0.0.0/0 -r ap-northeast-1
```

Serf.confもハンドラーのスクリプトを変更する

```
{
  "node_name": "nat1",
  "enable_syslog": true,
  "tags": {
    "role": "nat"
  },
  "reconnect_interval": "4s",←疎通間隔は４秒
  "reconnect_timeout": "12s",←タイムアウト検知12秒
  "tombstone_timeout": "12s",←タイムアウト検知12秒
  "event_handlers": [
    "member-join=ha-nat-eip -R [変更するRouteTableのTagName] -E [Allocation-id] -N 0.0.0.0/0 -r ap-northeast-1 >> /var/log/ha-nat.log 2>&1"
  ]
}
```


##障害試験

Active側に障害が発生した場合は、約12秒で切り替わりが行われます。
ブログで使うHTMLタグ

強調系
---

```
<b>＜概要1＞</b>
<h2>＜概要2＞</h2>
<h3>＜概要3＞</h3>
```

赤文字
---

```
<span style="color:red">お1人様1枚限りとなります</span>
```

画像
---

```
<img alt="..." src="...url..." width="70%" />
```
テストがコケた時にスクリーンショットを取る


## 前置き

お仕事先のPJで大量にスクリーンショットを撮っているテストを見て、本当にこれ必要なのかな？
スクリーンショットってテストがコケた時だけ必要なんじゃね？と思い、RSpecのテストがコケた時にスクリーンショットを撮るようやってみました。

## やったこと

specフォルダ直下にあるspec_helper.rbに対して、以下の様に書いてみます。

````spec_helper.rb
RSpec.configure do |config|
  config.after do |example|
    if example.metadata[:type] == :feature and example.exception
        page.save_screenshot 'screenshot/テスト失敗時スクリーンショット.png'
    end 
  end 
end
````

簡単！
１つのfeatureを回し終わった後にエラーがあればCapybaraでスクリーンショットを撮る感じですね。
Windows IoT Core for Pi2 で 画面表示をしてみたｃ⌒っﾟдﾟ)っφ　ﾒﾓﾒﾓ...


① ここの[記事](http://qiita.com/tksarah/items/3b8a5b88acfb582b091a)を参考に Windows IoT Core for Pi2 をインストールする。
② Windows 10のプレビュー版にMicrosoft Visual Studio 2015 Enterprise RCをインストールする。
③ WindowsDevelopProgramForIoT.msiをインストールする。
④ Microsoft Visual Studio 2015でユニバーサルアプリのプロジェクトを生成する。
⑤ Pi2にリモートデバック接続を実行する。

ｫｵｰ!!(ﾟдﾟ屮)屮　動いた。。。簡単であった。
![IMG_20150514_120724.jpg](https://qiita-image-store.s3.amazonaws.com/0/35340/c204e234-84bc-3e5e-3b0f-180c3fd7659c.jpeg)
注意事項：Windows 10のファイヤーウォールは外すこと。

補足：リモートでPi2のコマンドプロンプトを開く

```PS:Console（管理者権限でPOWERSHELLを起動する）

net start WinRM
Set-Item WSMan:\localhost\Client\TrustedHosts -Value 192.168.32.104
remove-module psreadline -force
Enter-PsSession -ComputerName 192.168.32.104 -Credential Administrator

REM password is p@ssw0rd
```
fabric.ioでbetaテストapk配布の実装（画像まとめ、初心者向け）

Android開発には、beta版のテストを行うのにiOSのTestFlightのようなツール（simple but powerful）はほとんどないと思います。

そので、近年、fabric.ioがその一つの解決方法です。

今回、fabric.ioでbetaテストのapkを配布する手法について話したいと思います。

# fabric.ioを導入

新規アカウントを作成するか、Crashlyticユーザーであればアップグレードするかという手法があります。自分が新規ユーザーです。fabric.ioの新規登録ページにメールアドレスを入力するとこいう画面が出て、招待メールが届くとアカウントを作成できます。

![screen0.png](http://i.minus.com/iptGj7MmOnLa1.png)

# fabric.ioでCrashlyticをインストールする

Android Studioのプラグインをインストールして、そこでログインすると終了。簡単なので説明を略します。

# ProjectにCrashlyticをインストールする

fabric.ioのアイコンをクリックして、fabric.ioが提供するサビースをインストールできます（Twitter APIかCrashlyticなど。自分の場合はCrashlytic）

fabric.ioのガイダンスに従うだけでできるので、説明を略します。終了画面だけをあげます：

![screen1.png](https://qiita-image-store.s3.amazonaws.com/0/36601/bf3aa49a-82b4-888e-f8ab-841f12c0cd54.png)

# beta apk をアップして、テスターを招待するなど

この記事のメインに入ります。fabric.ioの管理画面から「Distributions」ボタンをクリックすると、APKのアップ画面がでます。ここで、debug apkなどテスト用apkをアップして、テスターを招待できるようになります。

![screen3.png](https://qiita-image-store.s3.amazonaws.com/0/36601/51836018-f7ca-d3a2-0d0b-0ff763d47d7e.png)

今回、Google Sample の Android Universal Music Player を使用して実装します。テスターを招待する後、テスターのメールへの招待が届きます。そこで、今後のガイダンスの詳細があります。その内容は：

* テスト開始など

![screen5.png](https://qiita-image-store.s3.amazonaws.com/0/36601/efff8e54-ed7f-6706-8db6-108837beed21.png)

* fabric.io の betaアプリのインストール

![screen6.png](https://qiita-image-store.s3.amazonaws.com/0/36601/e5735334-a951-9276-8585-ebb6609dc99c.png)

betaアプリを開くと、テストさせるアプリのapkをダウンロードできるようになります。ここはTestFlightとそっくりで、便利です。

テスターがアプリをインストールすることが管理画面で見えます。

![screen9.png](http://i.minus.com/ibkrJOKeFanu26.png)

# まとめ

apkをアップする際、gradleタスクでもできます：

![gradle](http://i.minus.com/idsKjRQGmTAY7.png)

fabric.io管理画面はAndroid Studio内やWebでも同じで、便利です。

fabric.ioでのテスト配布に関しては以上となります。
URLのページパラメーターを暗号化して渡す/受け取る


# はじめに
BookmarkablePageLinkを使って、値をもたせたページ遷移させると
URL欄に情報がそのまま出てしまうのでなんとかしたかった。

![スクリーンショット 2015-05-14 11.17.45.jpg](https://qiita-image-store.s3.amazonaws.com/0/57201/316a6139-94c9-ee93-447f-56d100de681e.jpeg)


# 実装画面
フォームから値を送ると
![スクリーンショット 2015-05-14 10.27.56.jpg](https://qiita-image-store.s3.amazonaws.com/0/57201/85ce9c96-f78c-d83d-8969-6d1c87579bac.jpeg)

URLに追加されるページパラメーターが難読化されている
![スクリーンショット 2015-05-14 11.04.12.jpg](https://qiita-image-store.s3.amazonaws.com/0/57201/74ca36fc-c709-5d16-3f16-6250ac2f1260.jpeg)


# ソース
ページパラメーターのエンコーダー・デコーダーを指定すればいいみたい。
参考：[wicket user-guide] (http://ci.apache.org/projects/wicket/guide/6.x/guide/single.html#urls_6) の
*Controlling how page parameters are encoded with IPageParametersEncoder* っていう節

まずは*IPageParametersEncoder*を実装した *CryptoPageaParametersEncoder*を作成

``` java:CryptoPageParametersEncoder 
public class CryptionPageParametersEncoder implements IPageParametersEncoder{
		
	@Override
	public PageParameters decodePageParameters(Url url) {
		
		PageParameters parameters = new PageParameters();

		int i = 0;
		for (String s : url.getSegments())
		{
			parameters.set(i, s);
			++i;
		}

		for (QueryParameter p : url.getQueryParameters())
		{
			//各パラメーターの暗号化を解除する処理
			parameters.add( 復号化メソッド(p.getKey(),p.getValue())));
			
		}

		return parameters.isEmpty() ? null : parameters;
	}
	
	@Override
	public Url encodePageParameters(PageParameters pageParameters) {
		Url url = new Url();

		for (int i = 0; i < pageParameters.getIndexedCount(); ++i)
		{
			url.getSegments().add(pageParameters.get(i).toString());
		}

		for (PageParameters.NamedPair pair : pageParameters.getAllNamed())
		{
			String encryptedKey = "";
			String encryptedValue = "";
			
			//各パラメーターを暗号化する処理
			encryptedKey = 暗号化メソッド（pair.getKey());
			encryptedValue = 暗号化メソッド(pair.getValue());
				 
			QueryParameter param = new QueryParameter(encryptedKey, encryptedValue);
			url.getQueryParameters().add(param);
		}		
		return url;
	}	
}

```

次に、Applicationクラスのinitメソッドで、暗号化してやりとりを行いたいページに上記エンコーダーをマウントする。

```java:MyApplication.java
public class MyApplication extends WebApplication {
    public MyApplication() {
    }

    /**
     * @see org.apache.wicket.Application#getHomePage()
     */
    @Override
    public Class getHomePage() {
    	return Page1.class;
    }
    
    @Override
    protected void init() {
    	super.init();
    
    	//Page2ページに作成したエンコーダーをマウント
    	mount(new MountedMapper("/cryptedPageParameter/", Page2.class, new CryptionPageParametersEncoder()));
    }
```

# 終わりに
最初このやり方がわからなくて、パラメータを各ページのコンストラクタで暗号・復号化してたから大変だった。
勉強になりました。ありがとう [wicket user-guide] (http://ci.apache.org/projects/wicket/guide/6.x/guide/single.html)
Chromeの設定をいい感じにする(Windows)

以下症状が発生した時にいろいろ調べて解消したので覚書。

##目的
* 右上の名前が表示されないようにする
* Rounded Mugenフォントが表示されるようにする
* 特定の文字(その時々で違う)が表示されなくなるのを解消する

##方法
0. Chromeを開いてアドレスバーに`chrome://flags`と入力
0. 以下の部分を変更(上の症状の順に対応)
 * 新しいアバター メニューを有効にする　→　`無効`　を選択 
 * DirectWrite を無効にする　→　`有効にする`をクリック(`無効にする`になっていればそのままでOK)
 * ラスター スレッドの数 →　`1` を選択
0. `今すぐ再起動`をクリック

環境は`Windows7+chrome`ですが、Direct～以外は`Mac`や`Linux`でも設定できるようです。
最近、俺の中で人気の iTerm2 の Color scheme (2015年5月)

以前 [最近、俺の中で定着してきた Color Theme](http://qiita.com/luckypool/items/df65dcbea7ab98fa0d49) という記事を書いたのはもう 2014/02/17 でした。
当時は Tomorrow が結構気に入っていたのですが、そろそろ気分も変わったころなので、最近、良いなって思ったもの [Iterm2-color-schemes](http://iterm2colorschemes.com/) から3つ紹介します。

## お気に入り3つ

※ 画像は [mbadolato/iTerm2-Color-Schemes](https://github.com/mbadolato/iTerm2-Color-Schemes) のものをリンクしています。

### Brogrammer

The Brogrammer themes were created by [bahlo](https://github.com/bahlo/iterm-colors)

![Brogrammer](https://github.com/mbadolato/iTerm2-Color-Schemes/raw/master/screenshots/brogrammer.png)

- 鮮やかな印象なので、ここ最近夏っぽくなったので、そういう気持ちで使ってます

### Japanesque

The Japanesque theme was created by [aereal](https://github.com/aereal/dotfiles/blob/master/colors/Japanesque/Japanesque.itermcolors)


![Japanesque](https://github.com/mbadolato/iTerm2-Color-Schemes/raw/master/screenshots/japanesque.png)

- 淡い雰囲気なので、疲れた時は気分かえてこんな感じで

### Thayer Bright

The Thayer Bright theme was found [t3chnoboy](https://github.com/t3chnoboy/thayer-bright-iTerm)

![Thayer Bright](https://github.com/mbadolato/iTerm2-Color-Schemes/raw/master/screenshots/thayer_bright.png)

- ビビット感がちょうどいい

## インストール

下記のリポジトリを clone するか zip で落とすかしましょう

- https://github.com/mbadolato/iTerm2-Color-Schemes

```
git clone git@github.com:mbadolato/iTerm2-Color-Schemes.git
```

あとは Preference -> Profiles -> Colors から

![screen-shots.png](https://qiita-image-store.s3.amazonaws.com/0/17133/5092a329-9102-6bad-8918-c2b39f660aeb.png)

最後に、

かっこいいものを公開しているリポジトリには敬意を表してスターをつけときました :yum: 

- https://github.com/mbadolato/iTerm2-Color-Schemes
- https://github.com/bahlo/iterm-colors
- https://github.com/aereal/dotfiles
- https://github.com/t3chnoboy/thayer-bright-iTerm


以上！
Chromeのフォーム入力履歴から特定のものを消す

Chromeを使っていて普段は便利に思っているフォームの入力履歴保存機能ですが、たまーに残ると困るIDを入力したりすることがあります。
例えば、一時的に他の人（あるいはテスト用）のアカウントを使う場合など。もしくは逆で普段はテスト用しか使わないけど、仕方がなく別のアカウントでログインしなければならなかった時。
こんな時に例外的なアカウントの情報が残るとあとあと間違って選択する可能性があったり、そもそも残っていることが気になったり…
なので、この例外的な奴だけを消したい！

1. 該当フォームの入力欄をクリックして選択肢（記録されている入力履歴）を表示させます
2. 消したい履歴にカーソルを当てます
3. 「Shift」＋「Del」

これでいけました。

macの場合は「Del」が「Command」＋「Delete」なのでその読み替えしたらできるらしいです。


P.S.　どなたかの記事で見た内容でしたが、ネタ元不明になってしまってました。
　　　ヘルプ調べて記事にしてくださっていたどなたかに感謝。
Trello API を叩きたい 〜なにはともあれ token が欲しい〜

Trello API を使ったコマンドラインツールを作りたい
=====

って事で [Trello API](https://trello.com/docs) を読みながら模索中．

Token
-----
見たところ Trello は GitHub のように直接 token を生成する手段が無いみたいなので api key を取得して，そこから token を取得のための認証ページに遷移する URL を生成する必要があるみたい．

### API Key の取得
まず API を使うには認証が必要になるので
https://trello.com/1/appKey/generate
にアクセスして api key を取得する．
api key と一緒に secret も取得できるけど，今のところ必要そうな感じはしない...

### Token の取得
次に取得した api key 等の情報を元に token のリクエストを行うのだけども，
OAuth はユーザによる認証が必要になるのでコマンドラインツールだけでは簡潔させられない．
今回は api key を設定したらそこからURLを生成するスクリプトを作って手動で頑張る事に．
https://gist.github.com/da0shi/41ff723e8cdc39725f72#file-tokenrequesturi
スクリプト内で設定されているパラメーターは

* `key`: 取得した API Key
* `name`: アプリケーションの名前
* `expiration`: token の失効期限  
設定できる期間は4種類で，never に設定すれば失効する事が無くなる
  - 1hour
  - 1day
  - 30days
  - never`
* `scope`: token の有効範囲  
`,`区切りで並べることで複数の範囲を指定可能
  - read
  - write
  - account
* `response_type`: OAuth 上で必要となるパラメーター  
基本的に "token" でいいみたい．ここは別途調べねば... [UpdateMe]

その他にも

* `callback_method`: 認証ページの表示方法
  - postMessage: ポップアップ
  - fragment: リダイレクト
* `return_url`: 俗にいう Callback URL．認証後に飛ばすページを設定する．

生成した URL にアクセスすると認証ページが表示されるのでそこを認証すると

```
You have granted access to your Trello information.

To complete the process, please give this token:

  {Your Application Token}
```

というページが表示されて token が取得できる．
return_url を設定すると指定された URL に `token` という名前のパラメーターが付与されて返ってくる．

とりあえず Trello の token 取得についてはこんな感じ

ちなみに自分が認証した token に関しては
https://trello.com/{username}/account
のページにアクセスすると確認，取り消しができるようになっている．  
`{username}`の部分は自分のユーザ名に置き換えてくださいな
CasperJsでPhantomJSのWARNINGを出力させないようにする

homebrewでCasperJSをインストールすると実行するときに下記のようなWARNINGが出力される。

```
2015-05-14 10:52:33.756 phantomjs[17333:7675163] *** WARNING: Method userSpaceScaleFactor in class NSView is deprecated on 10.7 and later. It should not be used in new applications. Use convertRectToBacking: instead. 
```

PhantomJSのバージョンが1.9.8なのが問題らしい。
homebrewでは自動的にPhantomJSが1.9.8になるので、npmでインストールし直す。

```
npm install -g phantomjs@1.9.7-15
npm install -g casperjs
```

これでWARNINGが消える。
Grapeのroutesを表示するRakeタスク

```ruby:lib/tasks/application.rake
namespace :routes do
  task :api => :environment do
    Grape::API.subclasses.each do |subclass|
      subclass.routes.each do |e|
        puts "%-10s %-6s %-24s %s" % [subclass, e.route_method, e.route_path, e.route_description]
      end
      puts
    end
  end
end
```

```
$ rake routes:api
MyApi  GET    /api/action1             コメント1
MyApi  PUT    /api/action2             コメント2
MyApi  DELETE /api/action3             コメント3
(snip)
```

・サブクラスすべてを表示する必要はないかも
・参照 https://github.com/search?type=Code&ref=searchresults&q=routes%20task%20grape
・Grape側でタスクが用意されてないので各自自作しているようです
GoogleMapAPIv3でよく使うやつメモ。

### 住所、郵便番号からマップの位置変更

~~~ javascript
// 中心変更
var changeCenter = function (address) {
    var geocoder = new google.maps.Geocoder();
    geocoder.geocode({'address': address}, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            var location = results[0].geometry.location;
            var lat = location.lat();
            var lng = location.lng();
            var latlng = {lat: lat, lng: lng};
            map.setCenter(latlng);
        } else {
            console.log("Geocode was not successful for the following reason: " + status);
        }
    });
};
changeCenter('富山市');
~~~

### 現在地追跡

~~~ javascript
/**
 * 現在地追跡
 * @param {Function} func
 * @return {Void}
 */
watchCurrentPosition: function (func) {
    var self = this;
    if (navigator.geolocation) {
        navigator.geolocation.watchPosition(
            function (info) {
                var lat = info.coords.latitude;
                var lng = info.coords.longitude;
                var center = new google.maps.LatLng(lat, lng);
                func(center);
            },
            function (info) {
                //alert('現在地取得エラー' + info.code);
                return;
            },
            {enableHighAccuracy: true, timeout: 6000, maximumAge: 600000}
        );
    } else {
        //alert('本ブラウザではGeolocationが使えません');
        return;
    }
}
~~~

### マップオプション取得
~~~ javascript
 /**
 * マップオプション取得
 * @param {google.maps.LatLng} latLng
 * @return {Object} options
 */
getMapOptions: function (latLng) {
    var options = {
        zoom: 15,
        minZoom: 12,
        maxZoom: 20,
        center: latLng,
        disableDoubleClickZoom: true,
        draggable: true,
        mapTypeId: google.maps.MapTypeId.ROADMAP,
        zoomControl: false,
        streetViewControl: false,
        mapTypeControl: false,
        mapTypeControlOptions: {
            style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
            position: google.maps.ControlPosition.TOP_RIGHT
        },
        panControl: false
    };
    return options;
}
~~~


### スマホ、モバイル判定

~~~
/**
 * スマホ判定
 * @return {Boolean}
 */
isSmartPhone: function () {
    var userAgent = navigator.userAgent;
    if (userAgent.indexOf('iPhone') != -1 ||
        userAgent.indexOf('iPod') != -1 ||
        (userAgent.indexOf('Android') != -1 && userAgent.indexOf('Mobile') != -1)) {
        return true;
    }
    return false;
}
,
/**
 * モバイル判定
 * @return {Boolean}
 */
isMobile: function () {
    var userAgent = navigator.userAgent;
    if (userAgent.indexOf('iPhone') != -1 ||
        userAgent.indexOf('iPad') != -1 ||
        userAgent.indexOf('iPod') != -1 ||
        userAgent.indexOf('Android') != -1) {
        return true;
    }
    return false;
}
~~~
wicked pdfで生成したpdfを自動ダウンロード


## 忙しい人向けに

コントローラのRenderする箇所をこんな感じで書いてやれば良い

```rb
  pdf = render_to_string pdf: "#{params[:id]}.pdf", #PDFファイル名
                            template: "xxx/show.pdf.erb", #ビューファイル
                            encoding: "UTF-8",
                              layout: "pdf.html" #レイアウトファイル
          send_data(pdf) #ファイルのDL開始
```

## 詳しく
PDFを出力してくれるgemであるwicked_pdfは大変便利だ。
他のPrawnのように独自DSLを使うことなくErbやHamlでPDFを生成出来て非常に効率がよい

Railsのプロジェクトでwicked_pdfを使ってPDFを出力する場合は、普通にrenderしてしまうと
1. フォームボタン押下
2. PDFのページに遷移
3. PDFをブラウザ操作で「ファイル名前をつけて保存」などしてPCに保存

と言う流れになる、これはこれで中身を確認してからDLできるのでよいが

1. フォームのボタン押下
2. PDFダウンロード開始

と言うように一段階ステップを少なくしたい

**wicked pdf って何とか、環境構築する場合はこちらが参考にしてください**
[RailsアプリでPDFを出力する (Heroku対応)](http://qiita.com/awakia/items/d53ab583f214703f6afa)


## 対象のコード

### PDF表示版(通常)

```xxx_controller.rb
  def show
    @some_model = SomeModel.new(params)

    respond_to do |format|
      format.html { redirect_to xxx_path(format: :pdf, debug: 1) }
      format.pdf do
          render     pdf: "#{params[:id]}",
                encoding: "UTF-8",
                  layout: "pdf.html",
            show_as_html: params[:debug].present? # デバッグ用　パラメタにdebug=1とあるとHTMLを開く
      end
    end
  end
```



### PDFダウンロード版
```xxx_controller.rb
  def show
    @some_model = SomeModel.new(params)

    respond_to do |format|
      format.html { redirect_to xxx_path(format: :pdf, debug: 1) }
      format.pdf do
        # デバッグ用　パラメタにdebug=1とあるとHTMLを開く
        if params[:debug].present?
          render     pdf: "#{params[:id]}",
                encoding: "UTF-8",
                  layout: "pdf.html",
            show_as_html: true
        # ここで、PDFを生成してクライアントに送る
        else
          pdf = render_to_string pdf: "#{params[:id]}.pdf", #PDFファイル名
                            template: "xxx/show.pdf.erb", #ビューファイル
                            encoding: "UTF-8",
                              layout: "pdf.html" #レイアウトファイル
          send_data(pdf) #ファイルのDL開始
        end
      end
    end
  end
```

refs:

* [wicked pdf公式](https://github.com/mileszs/wicked_pdf)
* [Rails ファイルのダウンロード](http://qiita.com/akkun_choi/items/64080a8e17930879b4da)
配達先住所の入力について

Express Checkoutにおいて配送先住所を「SetExpressCheckout」APIでプロパティに指定するのが一般的だと思うのですが、配送先住所を入手する必要が無い場合には、パラメーターに入力せずに決済手段としての機能だけを利用するという事も可能なのでしょうか？
Erlang学習1

### インストール

MacOSX 10.10 yosemiteにソースから入れる
http://www.erlang.org/download.html
(OTP 17.5 Source File (64.1 MB)を入れた。)

otp_src_17.5.tar.gzを解凍してリネームしてデスクトップに置く。

~~~
yoshida-book% sudo mv Desktop/erlang /usr/local
yoshida-book% cd /usr/local/erlang
yoshida-book% ./configure
yoshida-book% make
yoshida-book% make install
~~~


### 実行
~~~
yoshida-book% erl
Erlang/OTP 17 [erts-6.4] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]
 
Eshell V6.4  (abort with ^G)
1> 42.
42
2> 3.7.
~~~

### メモ
Erlangにおける符号"="は代入ではなく、パターン照合処理
右辺を評価して左辺と一致するかを調べる
左辺が未束縛変数が場合は右辺と同じにする
共有メモリを持たず単純なメッセージ交換で平行処理を行う
一つの変数に値を何度も代入できるとすると並列処理が複雑になる

~~~ txt 
数
    整数(Integer)
    浮動小数点数(float)
    100
アトム
    Erlangにおける不変定数
    アトムは小文字英語から始まり、英数字が続く
    atom
タプル
   複数個のデータを一つとしてまとめたい時に使用する型
   {Term1, . . . ,TermN}
リスト
   [Term1, . . . ,TermN]
~~~


数     https://gist.github.com/niiyz/012fe6feb360bacc082f
アトム https://gist.github.com/niiyz/9a0d541249656e257674
リスト https://gist.github.com/niiyz/9cb4b774029a03408dde

参考: http://erlangworld.web.fc2.com/data_types/atom.html
JavaScript 即時関数間の行き来

ぐぐっても簡単な説明が出なかったのでメモです

Dog.jsと
Garden.jsを読み込んで
それぞれ即時関数でくくったけど
アクセスできなくて悩んだ

```js:Dog.js
;(function(){
    // 犬Class
    var Dog = function(aName){
        this.name = aName;
    };
    Dog.prototype.run = function(){
        console.log(this.name + 'が' + '走ったぞ！！！');
    };
    // windowオブジェクトのプロパティにしてあげると
    window.Dog = Dog;
})();
```

```js:Garden.js
;(function(){
    // こっちでポチ生成できる
    var pochi = new Dog('ポチ');
    pochi.run();
    // ポチが走ったぞ！！！
})();
```

庭でポチが走れました
JavaScript コールバックの作り方


ぐぐっても簡単な説明がなかったのでメモです
関数の引数として関数を渡して実装


バナナは
黄色


```js:callback.js
;(function(){

    // 
    var sayYellow = function(){
       console.log('黄色');
    };

    
    var sayBanana = function(aCallback){
        console.log('バナナは');
        aCallback();
    };

    // sayYellow関数を引数で渡す
    sayBanana(sayYellow);

    // 無名関数を書いて渡すのもあり
    sayBanana(function(){
        console.log('黄色');
    });

    // バナナは
    // 黄色
    
    // と出力される

})();
```

animate()や
setTimeout()や
addEventListener()
でいつも何となく使ってるけど
必要になって自分で作るとどうなんやと思いました
【Java初心者】いざとなったらよくわからなかったので改めて調べた～floatとdoubleに誤差が出る理由～

Java初心者向けです。

[Effectivie Java](http://www.amazon.co.jp/EFFECTIVE-JAVA-%E7%AC%AC2%E7%89%88-Java-Series/dp/4621066056)に「正確な答えが必要ならば、floatとdoubleを避ける」という項目があります。
ここを読んで改めて調べたのでまとめます。

# floatとdoubleは誤差があることがある
以下のプログラムを実行してみる。

```lang:java
System.out.println(1.03 - 0.42);
```

すると、コンソールには以下のように表示される。

```lang:コンソール
0.6100000000000001
```

期待値は0.61であるが、このように誤差が出てしまう。

# なぜ誤差がうまれるのか
float型とdouble型は、科学計算と工学計算のために設計されており、それらは2進浮動小数点算術を行う。
2進浮動小数点算術は、広い範囲の大きさに対して正確な近似を行うために設計されている。そのため正確な結果を提供しない。
(Effectivie Javaより)



# 2進浮動小数点算術とは
float型とdouble型はIEEE 754の規格で設計されている。
[Primitive Data Types](http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html)
この規格で用いられているのが2進浮動小数点算術である。

### 浮動小数とは
例として、「1.12」という数字を挙げる。
1.12は以下のようにあらわすこともできる。

$1.12 × 10^0$
$0.112 × 10^1$
$11.2 × 10^{-1}$


このように、(仮数) × (基数)(指数)であらわせる形を**浮動小数形式**という。
また「1.12」という表現は、浮動小数形式に対して**固定小数形式**という。

2進浮動小数点は2進数を用いて、小数を表現する方法。

# 2進浮動小数点算術で誤差が出るのはなぜか
たとえば「0.5」という10進数を2進数で表すとどうなるか。
答えは「0.1」である。
(小数の10進数を2進数に変換するときは、10進数の小数部を小数が0になるまで2倍する)
ほかにも、「0.625(10)」は「0.101(2)」となるし、「0.25(10)」は「0.01(2)」となる。

では「0.1」という10進数を2進数で表すとどうなるだろうか。
答えは「0.00011001100110011......」となり表現しきれない。
よって、2進数の小数では表現しきれないものがあり、誤差になってしまう。

# 正確な値が必要なときはBigDecimalを使う
たとえばお金の計算を行いたい場合は、正確な値が必要となる。
そんなときはBigDecimalを使用する。
[BigDecimal](http://docs.oracle.com/javase/jp/7/api/java/math/BigDecimal.html)
(詳しい使い方はまた別な記事で)

一番最初に実行してみたプログラムをBigDecimalをつかって実行すると以下のようになる。

```lang:java
BigDecimal num = new BigDecimal("1.03").subtract(new BigDecimal("0.42"));
System.out.println(num.toString());
```

```lang:コンソール
0.61
```

ただし、BigDecimalは遅いなどの問題もある。
BigDecimalを使うのか、floatとdoubleを使うのか、を考える必要がある。
(このあたりも別な記事で)



# 参考
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
http://docs.oracle.com/javase/jp/7/api/java/math/BigDecimal.html
ECMAScript 6のクラスのコンストラクタでオブジェクトをreturnしてみる

ECMAScript 3より前は知りませんが、ES3以降のJavaScriptのコンストラクタ関数は、new付きで呼ばれていても、returnでオブジェクトを返すとそっちを優先するという、謎機能がありました。

```js
function TestClass() {
    return {
        method: function() {
            console.log("good night");
        }
    }
}

TestClass.prototype.method = function () {
    console.log("good morning");
};

var obj = new TestClass();
obj.method(); // -> good night
```

ECMAScript 6はそういえばどうなんだろうなーと思ってio.jsの2.0.1で試したみたら、同じ結果になりました。use strictが必要なのね。

```js
"use strict"

class TestClass {
    constructor() {
        return {
            method: function () {
                console.log("good night");
            }
        };
    }

    method() {
        console.log("hello world");
    }
}

var obj = new TestClass();
obj.method(); // -> good night
```

というわけで、newで呼ばせるんだけど、実体は保存しておいたインスタンスを返すというシングルトンパターンとかは今までどおりできそうです。
npm install very slow in container

Doing `npm install` on a container when building image is notoriously slow. It should be slow because it's on a virtual machine (I was using `boot2docker`), but it's like heaven and earth when compared to npm install on host machine. Try using `npm install --verbose`, on host machine you won't be able to read the log because it scrolls so fast. While on a container, you can see it's stopping every now and then -- especially when creating a `.cache.json` file.

Try this before `npm install`:
> `npm config set registry http://registry.npmjs.org/`

eg:

```
# Dockerfile
RUN npm config set registry http://registry.npmjs.org/ && npm install --no-optional --verbose
```

It works magic for me! :shipit:
Arch Linuxでwineを動かしてみる

```bash:
$ sudo pacman -S wine zenity

# ない場合は、/etc/pacman.confで[multilib]が追加されているか確認する
$ vim /etc/pacman.conf
[multilib]
Include = /etc/pacman.d/mirrorlist

# 文字化けを直す
$ mkdir -p ~/.wine/drive_c/windows/Fonts
$ sudo cp /usr/share/fonts/TTF/*.ttf ~/.wine/drive_c/windows/Fonts

# プログラムを起動する
$ wine path/to/hoge.exe

# winetricksをインストールする(不要)
$ yaourt -S winetricks

# フォントをインストールする(不要)
$ winetricks allfonts

# フォントを綺麗にする(不要)
$ winetricks fontsmooth-rgb
```

##その他

###winetricksでsha1sum mismatch! Renameのエラーが出る場合、それを回避する方法

```bash:
$ winetricks vcrun6
> sha1sum mismatch! Rename /home/{mainuser}/.cache/winetricks/vcrun6/vc6redistsetup_enu.exe and try again.

$ sha1sum ~/.cache/winetricks/vcrun6/vc6redistsetup_enu.exe
> afji48djsie494jaiodsdaoa045992vfdhsioj44 ~/.cache/winetricks/vcrun6/vc6redistsetup_enu.exe

$ sudo vim /usr/bin/winetricks
load_vcrun6() {
- w_download http://storefront.steampowered.com/download/vc6redistsetup_enu.exe b058jifdja40jkfsdjalj4vcdla5brie4gfds44w
+ w_download http://storefront.steampowered.com/download/vc6redistsetup_enu.exe afji48djsie494jaiodsdaoa045992vfdhsioj44
}
```

```sh
$ winecfg
```

追記 : 修正しました。
@dk4130523 さん、ありがとうございます。

https://qiita.com/dk4130523/items/c1543132c0e470031315
Effective C++ (3rd) > 29項 > 投げない保証(nothrow guarantee) > 必ず予定の仕事を実行し、例外を投げない

引用: Effective C++ 第3版

> 関数が例外に対し投げない保証 (nothrow guarantee)をする

> これは、「必ず予定の仕事を実行し、例外を投げない」ということです。

関連キーワード:
- basic guarantee
- strong guarantee
cocos2d-x で Sprite とかを shared_ptr や unique_ptr でも扱う。

みなさん、おはにちばんは。
いきなりですが、cocos2d-x 管理下に置かれたアイツらを STL のスマートポインタで扱いたくないですか。[^1]
retain, release を呼び出すのめんどくさいし、良くミスしますからね。
というわけで、shared_ptr 及び unique_ptr でうまく扱えるようにする方法を書きたいと思います。

# shared_ptr で扱う
まずは shared_ptr で扱えるようにしてみたいと思います。
shared_ptr には Deleter をコンストラクタで指定することができるので、
create 関数で生成したポインタを shared_ptr に包み込む関数を作ればうまくいくはずです。

```cpp
template <typename T>
std::shared_ptr<T> make_shared_cocos(T *ptr)
{
    ptr->retain();
    return std::shared_ptr<T>(ptr, [](T *qtr) { qtr->release(); });
}
```

やっていることは、shared_ptr を作成する直前に retain を 1 回呼び出して、
すべての shared_ptr が破棄されたときに release を 1 回呼び出しています。

使い方は以下のようにします。

```cpp
std::shared_ptr<cocos2d::Sprite> sharedSprite = make_shared_cocos(Sprite::create("hoge.png"));
```

これで cocos2d-x のメモリ管理下でも shared_ptr を使えるようになりました。
注意点としては、これによって cocos2d-x 側で持っている参照カウントが当てにならなくなります。
**getReferenceCount の値によって挙動を変える処理をしている場合は注意してください。**

# unique_ptr
次は unique_ptr を使えるようにしてみましょう。[^2]
unique_ptr は shared_ptr と違い、Deleter をクラスのテンプレート引数に指定する方式になっています。
毎回 Deletor を指定するのはミスしそうですし、ついでにエイリアスも作っちゃいましょう。

```cpp
struct cocos_deleter
{
    void operator()(cocos2d::Ref *ptr)
    {
        ptr->release();
    }
};

template <typename T>
using unique_cocos_ptr = std::unique_ptr<T, cocos_deleter>;

template <typename T>
unique_cocos_ptr<T> make_unique_cocos(T *ptr)
{
    ptr->retain();
    return unique_cocos_ptr<T>(ptr);
}
```

やっていることは、unique_ptr の Deleter に cocos_deleter というものを使用させるようにしています。
cocos_deleter には、unique_ptr が破棄された時に release を呼び出すようにお願いしています。
shared_ptr と同じように扱えるようにするため、make_unique_cocos というものも定義しています。

使い方は以下のようになります。

```cpp
unique_cocos_ptr<Sprite*> uniqueSprite = make_unique_cocos(Sprite::create("hoge.png"));
```

これで cocos2d-x のメモリ管理下でも unique_ptr を使えるようになりました。
注意点としては、shared_ptr と同じく cocos2d-x 側で持っている参照カウントが当てにならなくなります。
あと、**std::unique_ptr**\<Sprite\*\> と使うことはできないので注意してください。

# 最後に
いかがでしたでしょうか。
これでいい感じに shared_ptr, unique_ptr でメモリ管理できているのではないでしょうか。
それでは。

----
[^1]: 書いた後に cocos2d::RefPtr なるものを知りましたが、最新のリファレンスにも載ってないし、微妙そう。
[^2]: たいていの場合 addChild とかしちゃうから unique じゃないだろうっていう感じはしますが、オブジェクトプールする時のためやパフォーマンスのためだと考えればアリ?
Effective C++ (3rd) > 29項 > 強い保証(strong guarantee) > 例外が投げられた場合、プログラムの状態は、その関数の呼び出し前のものに戻される

引用: Effective C++ 第3版

> 関数が例外に対し強い保証(strong guarantee)をする

> これは、「例外が投げられた場合、プログラムの状態は、その関数の呼び出し前のものに戻される」という意味です。そのような関数の呼び出しは、成功すれば完全に成功し、失敗すれば呼び出しの効果が完全に消えるので、アトミックと呼ばれます。

関連キーワード: 
- basic guarantee
- nothrow guarantee
Effective C++ (3rd) > 29項 > 基本保証(basic guarantee) > 例外が投げられても、...すべてのものの状態が有効に保たれる ... どのオブジェクトもデータ構造も無効にならず...

引用: Effective C++ 第3版

> - 関数が例外に対し基本保証(basic guarantee)をする

>これは、「例外が投げられても、プログラム中のすべてのものの状態が有効に保たれる」という意味です。どのオブジェクトもデータ構造も無効にならず、すべてのオブジェクトが内部的にも矛盾のない状態に保たれるということです。

関連キーワード:
- strong guarantee
- nothrow guarantee
技術英語 > more like / むしろ...に近い > achieving [more like] 80 percent test coverage

Code CompleteかReadable Codeにあった文

... achieving more like 80 percent test coverage

<hr>
http://eow.alc.co.jp/search?q=more+like&ref=sa
> more like a friend than a mother

http://loe.org/series/series.html?seriesID=27
> George looked <font color=red>more like</font> a lost soul from the Age of Aquarius than like the smooth-talking entrepreneur who had just wangled himself some extremely valuable face space in Nature.

thanをともなう場合もあり、「...よりも、むしろxxx」というような使い方をするようだ。

more likeがないxxx rather than...の場合よりも強調されるのだろうか？
歌詞タイムで歌詞をコピーできるテキストエリアを作成するブックマークレット


タイトルが長い。

# はじめに

[歌詞タイム](http://www.kasi-time.com/)でコピペするブックマークレットはいくつかあって愛用していました。

[歌詞タイム コピペ ブックマークレット - Google 検索](https://www.google.co.jp/webhp#q=%E6%AD%8C%E8%A9%9E%E3%82%BF%E3%82%A4%E3%83%A0%20%E3%82%B3%E3%83%94%E3%83%9A%20%E3%83%96%E3%83%83%E3%82%AF%E3%83%9E%E3%83%BC%E3%82%AF%E3%83%AC%E3%83%83%E3%83%88)

しかし、最近リニューアルしたとかなんとかでどれもこれも動かないのでjsの練習を兼ねて自分で書いてみました。ブックマークレット大好きです。

# 書いたやつ

![Imgur](http://i.imgur.com/gAl9H5Z.png)

[歌詞タイムでコピペできるブックマークレット - Hatena::Let](http://let.hatelabo.jp/eai04191/let/hJmfqenU-cFp)

ブックマークレットってどこに投稿すればいいのかわからない感じですがHatena::Letというサイトがあることをついさっき知ったのでアップしてみました。

せっかくなのでUserScriptにしてアクセスしたときに自動でやってくれるようにすればよかったと思いましたがもう気力がないので無理です。後で何とかします。[^1]

[^1]: しません。

あとjQuery使わないで頑張って書いてたのに歌詞タイム自体がjQuery使ってて悲しい気分になった。

---

以上