OmniAICreator/Qiita-1.07M huggingface dataset:
Cordovaのフォルダ構成について

#はじめに
前回の[「Cordovaの環境構築をしてみる」](http://qiita.com/katsu_suzuki/items/2a9251f8a13812b03664)で構築した環境を使用してフォルダ構成、config.xmlについてまとめていきます。

#フォルダ構成
SampleCordovaフォルダ内の各ファイル、フォルダの概要は以下の通りとなります。

####SampleCordovaフォルダ
ファイル・フォルダ|概要
---|---
config.xml|各プラットフォームに展開されるCordova用設定ファイル
hooks|Cordovaコマンドをカスタマイズする際に利用するフック<br>（例:プラットフォーム追加後に処理を追加するなど）
platforms|追加したプラットフォーム毎のフォルダが生成される。<br>プラットフォーム毎のフォルダ内にXcode用のプロジェクトファイルがある。
plugins|追加したプラグインがここに格納され、各プラットフォームに展開される。
www|各プラットフォームに展開されるテンプレートファイル<br>HTML、CSS、Javascriptが格納されている。

実際にアプリとして組み込まれるファイルはplatformsフォルダ配下のみとなります。
SampleCordova/wwwの内容を変更し、```cordova build```または```cordova emulate```を行うとwwwフォルダ配下のファイルが各プラットフォームに展開されます。

#config.xmlについて
Cordovaの設定はconfig.xmlに記載していきます。
以下は、プロジェクトを生成した際に設定されている項目について記載します。
####Config.xml
項目名|概要
---|---
widget|アプリの識別子(Bundle Identifier)、バージョン番号を記載します。
name|アプリ名
description|アプリの概要を記載します。
author|アプリの作成者を記載します。
content|アプリ起動時、最初にWebViewにロードするコンテンツ(htmlなど)を指定します。<br>外部のURL(http://〜)を指定することでアプリ起動時に外部のコンテンツを表示できます。<br>但し、外部のURLを指定する場合は、ホワイトリストでアクセスできるように指定する必要があります。
access|ホワイトリスト指定。*を指定している場合は、特に制限なくアクセスできます。<br>ドメインで指定することもでき、アクセスできる範囲を限定することができます。
allow-intent| Cordova5から追加された模様。URLSchemeとして、別アプリを起動する際に予め定義しておく必要があります。
platform|特定のプラットフォームのみに反映する場合に利用します。

その他、config.xmlの詳細は以下を参照してください。
- [Cordova Document「The config.xml File」](http://cordova.apache.org/docs/en/edge/config_ref_index.md.html#The%20config.xml%20File)
- [Cordova Document「Whitelist Guide」](http://cordova.apache.org/docs/en/edge/guide_appdev_whitelist_index.md.html#Whitelist%20Guide)

またconfig.xmlはプラットフォームで共通の項目とプラットフォーム毎で異なる場合ありますので注意が必要です。
virtualenv導入後、workonコマンドでアラートが出た時の対応 (MacOS10.10 + Python3.4)

MacOS環境にvirtualenv環境構築に関する備忘録  
virtualenvwrapper使用時に、workonコマンドで作業環境を切り替えた時に発生したアラートの対処法について、忘れないようにメモ。

環境

+ MacOS 10.10
+ Python 3.4.1
+ virtualenv 13.1.0
+ virtualenvwrapper 4.6.0

python3.xはHomebrew経由で、
virtualenvとvirtualenvwrapperはpip経由で導入。


アラートについて
virtualenvの環境構築後、workonコマンド起動すると、pythonの参照パスまわりでアラートが出ていた。

調査したところ、stackoverflowにいくつか対処例がありました。
http://stackoverflow.com/questions/6968914/getting-a-python-virtual-env-error-after-installing-lion


自分の環境では、実行するPythonのパスが違ってたため、アラートが出力されていました。なので、virtualenvwrapperが使用するpythonが2.x系列であったのを、python3.x系列に変更して対応。

簡潔に、、、
.bash_profileにvirtualenvで使用するPythonのパスを入れればOK。

```bash

#Setup virtual envwrapper for python in case default doesn't work
VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3.4
export VIRTUALENVWRAPPER_PYTHON

# needed for virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/projects
source /usr/local/bin/virtualenvwrapper.sh

```

コマンドラインからworkonを実行して、アラートが出なければ修正完了！

以上！
Javaでプリミティブ型→ラッパークラス変換時のvalueOfとnewの使い分け

# 概要
Javaでプリミティブ型→ラッパークラス変換時のvalueOfとnewの使い分けについて書いてみます。
Javadocとか実装を見ればわかることですが、あまり意識したことがなかったので。
ちゃんと中身読まないとダメですね。。。

# 調査(Integer)
```
int num = 0;
Integer obj1 = new Integer(num);
Integer obj2 = Integer.valueOf(num);
```
上記二つの違いはなんでしょうか。
ちょっとプログラムを書いてみます。

## プログラム
```java
    public void test() {
        check(-129);
        check(-128);
        check(0);
        check(127);
        check(128);
    }
    
    private void check(int value) {
        Integer value1 = Integer.valueOf(value);
        Integer value2 = Integer.valueOf(value);
        
        StringBuilder builder = new StringBuilder();
        builder.append(valueOfString(value1));
        if (value1 == value2) {
            builder.append(" == ");
        } else {
            builder.append(" != ");
        }
        builder.append(valueOfString(value2));
        
        System.out.println(builder.toString());
    }
    
    private String valueOfString(Integer value) {
        return String.format("Integer.valueOf(%4d)", value);
    }
```

## 実行結果
```
Integer.valueOf(-129) != Integer.valueOf(-129)
Integer.valueOf(-128) == Integer.valueOf(-128)
Integer.valueOf(   0) == Integer.valueOf(   0)
Integer.valueOf( 127) == Integer.valueOf( 127)
Integer.valueOf( 128) != Integer.valueOf( 128)
```

# まとめ
valueOfなら一部範囲のみですがインスタンスを使いまわしていることがわかりました。
（※範囲外はnewするようになってます。また、範囲は変更できるようです）
新規インスタンス生成が不要の場合はvalueOfを使用すれば良さそうです。

ここではIntegerで説明していますが、Longなど他のラッパークラスでも同様になっています。
uGUI webサーバーから画像をダウンロードして表示


WWWクラスとRawImageをつかって
Webサーバー上にある豚くん画像を表示します！！！

![12021927_673085316126630_10284087_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/76843/9b3fe633-ca86-baad-af1a-4fdba7df5f63.jpeg)


# WWWクラスを知る

Webサーバーからデータをダウンロードすためには、WWWクラスを使用する。

```csharp:hoge
string url = "http://www.hogehoge.com/hugahuga.png";
WWW www = new WWW(url);
```
こんな感じで

**WWWクラスのコンストラクタに引数としてURLを渡すとWWWオブジェクトを生成**
し、**バックグラウンドでダウンロードを開始**するそうです。

公式マニュアル WWWクラス
http://docs.unity3d.com/jp/current/ScriptReference/WWW.html


# 実装します。

1.HierarchyからCreate→UI→Raw Image を追加。


![12028922_673085342793294_202875955_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/76843/cf7114ed-8d50-acb6-79ac-9bded2bd9e70.jpeg)


## Raw Imageって何？普段のImageとなにが違うの？

こちらが詳しいっす
http://hiyotama.hatenablog.com/entry/2015/07/02/090000

ImageとRaw Imageの違いは何かというと、ImageはSprite画像限定でしたが、Raw ImageはSprite限定ということはなく、Texture画像も使える。
その代わり、Imageに比べて機能が制限されている。(Image Typeが選択できないとか)

公式マニュアル　Raw Image
http://docs.unity3d.com/ja/current/Manual/script-RawImage.html





2, Raw Imageに下記スクリプトをアタッチして実行！


```csharp:hoge

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class ImageDownloder : MonoBehaviour {


	IEnumerator Start(){
		
		// wwwクラスのコンストラクタに画像URLを指定
		string url = "http://www.wanpug.com/illust/illust3038.png";
		WWW www = new WWW(url);

		// 画像ダウンロード完了を待機
		yield return www;

		// webサーバから取得した画像をRaw Imagで表示する
		RawImage rawImage = GetComponent<RawImage>();
		rawImage.texture = www.textureNonReadable;

		//ピクセルサイズ等倍に
		rawImage.SetNativeSize();
	}

}
```

豚くん表示された！(最初の画像)


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



完





シルバーウィークは
これといって浮いた予定がない例外なので
Unity道場しようと思います。。
Railsを始めて、1ヶ月半の初心者が過去の自分に向けたRails及びRuby tips（before、after編）


* Railsを始めて1ヶ月半でこれ最初に知っておけばもっと楽に綺麗に実装できたのにって思ったものをまとめました。
* あまり深くは説明していませんので、詳細は調べてください。

※ Railsというか、activesupportの機能のものも入っています。

## nilガード

変数`val`の値が入っていなかった場合のみ空の値を入れたい場合

### before

```
if val.nil?
  val = []
end
```

### after

```
val ||= []
```

## try

変数staffにnilが入っている可能性のある場合

### before

```
staff ? staff.name : 'none'
```

### after

```
staff.try(:name) || 'none'
```

## find_or_create_by

* findしてなかったらcreateしたい場合

### before

```
name = 'hogehoge'
user = User.find_by(name: name)
user ||= User.create(name: name)
```

### after

```
User.find_or_create_by(name: 'hogehoge')
```


## concern

* adminしかアクセスできない属性を持っている画面があったとしてその属性をControllerに書きたい場合

### before

* 各Controllerごとに書いていくの辛い…

```app/controlllers/hoge_fuga_controller.rb
class HogeFugaController < ApplicationController
  before_action :authenticate_user!


  def index
    # 実装
  end

  private

  def require_admin!
    if current_user.nil? || !current_user.admin?
      redirect_to root_path, notice: '権限ない旨のメッセージ'
    end
  end
end
```


### after

* 処理と属性が分かれてすっきり

```app/controlllers/hoge_fuga_controller.rb
class HogeFugaController < ApplicationController
  include Concerns::AdminAccessible

  def index
    # 実装
  end

  ...
end
```

```app/controllers/concerns/admin_accessible.rb
module Concerns
  concern :AdminAccessible do
    included do
      before_action :require_admin!

      private

      def authenticate_user!
        if current_user.nil? || !current_user.admin?
          redirect_to root_path, notice: '権限ない旨のメッセージ'
        end
      end
    end
  end
end
```


## Model内からの検索

* 会社に紐づく社員を社員IDで紐付けを行いたい場合

### before

```
Staff.find_by(company_id: params[:company_id], id: params[:id])
```

### after

```
@company.staff.find(params[:id])
```


## simple_form

* viewにてformを生成する時

※ 以下以外にもエラーメッセージの処理とか色々よしなにやってくれるので便利

### before

```
- form_for(@user) do |f|
  div.field
    = f.label :name
    = f.text_field :name
  div.actions
    f.submit
```

### after

```
- simple_form_for(@user) do |f|
  = f.input :name
  = f.input :age
  = f.button :submit
```

## hash

### before

```rb
users.map { |v| v[:id] }
```

### after

```rb
users.map(&:id)
```

### 最後に
 * Railsは探せば探す程、便利メソッド、gemがある気がします。
 * 他にもこんなのを知っとくといいよ的なやつがあったら教えてください
 * 間違いなどありましたら、指摘していただけると嬉しいです。


### 参考記事

[activesupport - Object#tryの意外な挙動 - Qiita](http://qiita.com/jkr_2255/items/fb9b66a61c18cd51fbdc)
Chromeエクステンションを作ろう：オプション画面編


説明で使用した拡張機能は[こちら](https://chrome.google.com/webstore/detail/redmine-lazy-applicant/dofmgcleeckgckfapnhookpocglpbmgp)からインストールできます. 一人でも多くの方に利用いただければ幸いです.
ソースコードは[こちら](https://bitbucket.org/dhun-h/lazy-applicant)から閲覧できます.


## オプション画面とは

Chrome拡張機能の設定画面です.
オプション画面では、[Chrome-Javascript-API](https://developer.chrome.com/extensions/api_index)を利用することができます.

このプラグインでも利用した機能になります.

といっても、特に説明することはありません. 一般的なWebページの作り方と同様になります.

~~詳細は[公式サイト](https://developer.chrome.com/extensions/optionsV2)を参照してください.~~

、、、あれ？
OptionsとOptionsV2があるけど、OptionsV2が新しいんじゃないんか〜〜い！！
この記事を書いていて気が付きました. orz

詳細は[公式サイト](https://developer.chrome.com/extensions/options)を参照してください.


## プラグインで実装したこと
* プラグインの設定を変更できるHTML+Javascriptを提供
* ストレージの設定の読み込み
* ストレージへ設定を保存

## マニフェストファイルの設定 (抜粋)

実装バージョンを間違えたので、参考にならないかもしれません、、、

```json:manifest.json
   ,"options_ui": {
        "page": "js/option-page/options.html"
       ,"open_in_tab": true
    }
```

詳細は[公式サイト](https://developer.chrome.com/extensions/optionsV2#step-1)を参照してください.
最新バージョンの公式サイトは[こちら](https://developer.chrome.com/extensions/options#step_1)

### page

オプション画面のURLを指定します.

### chrome_style

Chromeユーザーエージェントのスタイルシートを適用する場合は`true`を指定します.
ドキュメントでは`true`が推奨されていますが、どことなく気に入らない外観ためプラグインでは`false`にしました.

### open_in_tab

Chrome拡張機能タブにオプション画面を表示する場合は`false`を指定します.
`true`を指定すると、オプション画面は新しいタブに表示されます.

プラグインでは、`true`を指定しました.

#### open_in_tab=true

![option-page-true.png](https://qiita-image-store.s3.amazonaws.com/0/74102/749df59f-b37b-3699-0cbf-e9544636ce92.png "option-page-true.png")

#### open_in_tab=false

![opton-page-false.png](https://qiita-image-store.s3.amazonaws.com/0/74102/5e9d8cc3-a1dc-6e9e-a1ad-131e781fc503.png "opton-page-false.png")


## 説明で紹介したプラグインのソースコード
* [manifest.json](https://bitbucket.org/dhun-h/lazy-applicant/src/f371e1be0e9d66311bf81555e098b71c25886eb7/src/manifest.json?at=master&fileviewer=file-view-default)
* [options.js](https://bitbucket.org/dhun-h/lazy-applicant/src/f371e1be0e9d66311bf81555e098b71c25886eb7/src/js/option-page/options.js?at=master&fileviewer=file-view-default)
chainer-gogh をインストールしてみる

[画風を変換するアルゴリズム]
(https://research.preferred.jp/2015/09/chainer-gogh/)
が公開された。

機械学習にもpythonにも不慣れだが、とにかく動かしてみたい人も多いだろう。
そこで、手抜きの補足記事を書く。

[mattya/chainer-gogh]
(https://github.com/mattya/chainer-gogh)


###**chainer-gogh.pyのインストール**
右上にある
[download zip]
から上記GitHubのデータを全て取得する。それを展開し、
この中にあるchainer-gogh.pyを記事に書かれているように引数を与えてコマンドラインから実行すれば、Linux, Windows, MacOSXのどれからでも実行が可能です。

chainer-gogh.pyを実行する前に、chainerをインストールする必要があって
pipというツールを用います。pipがインストールしてあれば、OSの種類によらず
以下のコマンドで、chainerがインストールされます。

\>pip install chainer


###**そもそも、pythonが入っていないという人は**
Windowsの場合には,
Python(x,y) 
http://python-xy.github.io/

を入れておく。
Python単体のインストーラでは、numpyやmatplotlibなどのライブラリがないので、追加でインストールするものが増えてしまうので、Python(x,y)を入れるのを推奨する。

Ubuntuの場合だと apt-get, MacOSXの場合だとhomebrewを使って必要なライブラリをインストールしておく。

MacOSXの人は、ぜひ他のMacOSXのユーザーの記事で、Python2.7をインストールする記事を読んでおくことを勧めます。MacOSXに元々入っているpythonと新たにいれたいPython2.7とでPythonの環境がぶつからないようにすることを事前に調べておくのがよいかと思います。pyenv なども調べておいた方が良いかもしれません。(MacOSXユーザーではないのでちゃんとしたことが書けなくてすみません。）

pipが環境にインストールされているかどうかは、コンソールで
\>pip　--help
と入力して使い方が表示されるようだったら、
\>pip install chainer
が実行可能です。

###**pipのインストール**
もし、そうでなかったら、pipのインストールをします。
(pipのインストールについては各OSごとに記事があるので検索してください。)
Python for Windows インストールメモhttp://www.aoki.ecei.tohoku.ac.jp/~ito/python_windows.html
によれば
setuptools (easy_install)
\> python ez_setup.py
\> easy_install pip
の2段階のインストールになるようです。
(既に自分のPCには自分でインストールしていましたが、手順は忘れてしまっていた。)

VirtualBox上のubuntuで実行すると次の状況だった。
>VirtualBox:~$ pip
プログラム 'pip' はまだインストールされていません。 次のように入力することでインストールできます:
sudo apt-get install python-pip

とインストール方法を示してくれた。そこで
\>sudo apt-get install python-pip
と実行するとpipがインストールされた。
続いて
\>sudo pip install chainer
としてインストールが実行された。

###**chainer-goghの実行**
\>pip install chainer
が済んだあとならば、
CPU実行であれば次のようにして、実行できます。
input.png style.png は
とりあえず、
sample_images/cat.png
sample_images/style_0.png
をコピーして用いてみました。

\>python chainer-gogh.py -i input.png -s style.png -o output.png -g -1

途中結果がoutput.pngのディレクトリに表示されるので
気長にみています。

CPU実行は、シングルコアの処理ですので、1日かかっても終わらないという具合です。

GPUの設定をして、GPU版の実行をしたいところです。

###**付記：インストール作業をするときには管理者権限で実行してください。**
Windowsの場合だと、[スタートメニュー]
から[コマンドプロンプト]を選ぶ際に右クリックして[管理者権限で実行]をします。
apt-getの場合には
sudo apt-get
として管理者権限で実行します。

CPU版で実行させる範囲においてはPythonの関係が全て32bit版でも動作していました。

GPUを使おうとするためには、以下のことを考慮して環境を作り直す必要がありそうです。
・OS：64bit版
・Pythonのビルドは(64bitか32bit)？
・Cudaのバージョンと（64bitか32bitか)
・numpy他


###追記：エラー発生時
IOError: [Errno 2] No such file or directory: 'nin_imagenet.caffemodel'

https://gist.github.com/mavenlin/d802a5849de39225bcc6
以下のサイトからnin_imagenet.caffemodel ファイルを入手して、実行ディレクトリにおきました。

caffemodel_url: https://www.dropbox.com/s/0cidxafrb2wuwxw/nin_imagenet.caffemodel?dl=1
Chainer [モデルをダウンロード](https://github.com/mattya/chainer-gogh)
のNINでみつけました。


###**追記：別データで動作**
　後日、chainer-goghを別データで動作させてみた。前に動作させたときに比べ、処理の数字が増えていくのが速い。処理データによる違いなのか、一度計算した後で、次に処理するのが速くなる何か計算済みのキャッシュが働くのか、まだ調べていない。シングルCPUで遅いと思っている人でも、まずは動かしてみることです。


###**追記：「Chainerチュートリアル -v1.5向け- ViEW2015」**

[「Chainerチュートリアル -v1.5向け- ViEW2015」がslideshare](http://www.slideshare.net/ryokuta/chainer-v15-view2015)で公開されています。

Cython言語を使うようになっている。

開発者による記事 [画風を変換するアルゴリズム](https://research.preferred.jp/2015/09/chainer-gogh/)
Rundeck でパスフレーズを使った秘密鍵認証を設定する


プロジェクトでジョブスケジューラーが必要になり、噂のRundeckを試してみようと、とりあえず Vagrant 上の CentOS をリモートホストにみたてて Hello World! とか気楽に考えてたら異常にハマったので記念に。 

## バージョン

Rundeck: rundeck-launcher-2.5.3.jar

## ノードの設定

今回は jar ファイル起動でプロジェクト名は「demo」という名前にしてます。設定ファイルは `RD_BASE/projects/demo/etc/resources.xml` になります。

```xml:resources.xml
<node name="node1" description="test node" tags="" osArch="x86_64" osFamily="unix" osName="CentOS" osVersion="6.5" hostname="192.168.28.100" username="vagrant"
  ssh-keypath="/Users/hogemoge/.ssh/id_rsa"
  ssh-authentication="privateKey"
  ssh-password-option="option.sshKeyPassphrase" />
```

## アドホックコマンドでは利用できない

クライアント側の公開鍵をリモート側の authorized_keys に追記してコマンド実行を試してみたんですが、見事に AuthenticationFailure になります。

で、[Rundeck ドキュメント（2.5.3）/ ユーザーマニュアル / プラグイン](http://rundeck.org/docs/jp/manual/08-plugins.html#ssh-秘密鍵パスフレーズの設定) に以下のような記載がありました。

>さらに秘密鍵パスフレーズ認証にはいくつかの必要事項と制限があります:
>
>1. 秘密鍵認証にてパスフレーズを要求するノードには予め定義されたジョブを通してのみ実行が可能です。アドホックコマンドでは実行できません。（今のところ）
>1. そのようなノード上で実行される各ジョブには実行前にパスフレーズを入力してもらうようセキュアオプションの定義がされていなければなりません。
>1. 秘密鍵パスフレーズ認証を使う全てのノードでは入力するパスフレーズと定義されたセキュアオプション定義とがマッチする必要があります。または同じパスフレーズを共有して使う場合は同じ Option 名（またはデフォルトのまま）を使う必要があります。（例えば、同じ秘密鍵を共有して使う場合など）

いやぁ・・・全然気がつきませんでした。正直、ここだけでもかなりの時間を失ったのですが。

>1. 秘密鍵認証にてパスフレーズを要求するノードには予め定義されたジョブを通してのみ実行が可能です。アドホックコマンドでは実行できません。（今のところ）

一応、英語の方ですが、何度も何度も読んでましたよ。理解してんのかっつう話です。

> Therefore Private Key Passphrase authentication has several requirements and some limitations:
>
>1. Private Key-authenticated nodes requiring passphrases can only be executed on via a defined Job, not via Ad-hoc commands (yet).

## ジョブの設定

ジョブについてもユーザーマニュアルにいろいろ書かれてますが、XMLしか例がないので GUI でどうしたらいいのか分かりませんでした。

とりあえず、こうします。

![スクリーンショット 2015-09-15 22.46.04.png](https://qiita-image-store.s3.amazonaws.com/0/23886/f6a62e15-f0d5-9a82-4669-f3ae6c285c35.png "スクリーンショット 2015-09-15 22.46.04.png")

`OptionName` は何でもいいんじゃないかと思うんですが、マニュアルに以下のように書かれていて、

>オプションの定義 `secureInput` に `true` をセットします。このオプション名（ここでいう `secureInput`）は自由に決めて構いませんが、ノードの設定でデフォルト値として使われている `sshKeyPassphrase` を使うのが一番簡単です。

とりあえず何の事か分からないけれど、 **sshKeyPassphrase を使うのが一番簡単です** って耳元で囁かれたような気がしたので `sshKeyPassphrase` にしてます。

`Input Type` は **Secure Remote Authentication** にして、`Required` を **Yes** にします。そーすると、ジョブを実行する際にパスフレーズを入力するトコがイイ感じに出てきます。

![スクリーンショット 2015-09-15 22.49.11.png](https://qiita-image-store.s3.amazonaws.com/0/23886/82c63f41-7121-3b4e-c3a9-87ae57a28e7f.png "スクリーンショット 2015-09-15 22.49.11.png")

ここにパスフレーズ打って *Run Job Now* です！

![スクリーンショット 2015-09-15 22.58.26.png](https://qiita-image-store.s3.amazonaws.com/0/23886/623abcb8-9971-80bd-fd87-980d0524bb4d.png "スクリーンショット 2015-09-15 22.58.26.png")

夢にまで見た *Succeeded*！諦めかけてた **COMPLETE 100%** です！！
ひゃっほおーーー！！

ちなみにプロジェクトで使用する場合、秘密鍵にパスフレーズは設定しません。
正規表現でのAsciiコードのチェック

**色々と勘違いがあったので内容を含めて訂正**

**Asciiコード(21~7eの範囲をチェックする)**

```shell-session
!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
```

**正規表現**

これ、そのまま書くと、「\」をエスケープしていないのでエラーになります。

エラーの箇所を抜粋して実行。
```shell-session
("\").match(/^[!-~]+$/)
→SyntaxError
```

なのでエスケープして実行。

```shell-session
("!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~").match(/^[!-~]+$/)
["!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"]
```

成功！
(Mac)SSHで作業中、標準出力をMacのクリップボードへ流し込む

あると便利。
なくても、ターミナル上の文字を選択してコピーできるけども面倒くさい。

## 要約

sshの-Rオプションでサーバー上からローカルのMacへログイン可能にしておく。
sshでリモートコマンド実行でpbcopyへ流し込む。

## 前提

### ユーザー・アドレス等

|name | value|
|---|---|
|リモートサーバーのアドレス | target|
|リモートサーバーのユーザー | hoge|
|トンネルで使用するポート   | 9080|
|Macのユーザー | piyo|

## 準備

### MacのSSHログインを有効化

Macの設定でSSHログインを有効にしておく。

システム環境設定 -> 共有 -> リモートログイン

上記項目にチェックを入れる

## 接続

ログインする。

```bash
ssh hoge@target -R 9080:localhost:22
```

リモートからMacへsshできるか確認する。(二度目以降は不要)

```bash
ssh foo@localhost -p 9080
```

## 実際にコピーしてみる

```bash
# on remote server
echo copy test | ssh foo@localhost -p 9080 'cat | pbcopy'
```

## 便利な設定

正直、上記コマンドは面倒臭い。
エイリアスを貼っておけばスマートに利用できる。

```bash
alias local_copy="ssh foo@localhost -p 9080 'cat | pbcopy'"
# example
cat test.txt | local_copy
```

毎回 `-R` オプションのSSHは面倒臭い。
確か、`.ssh/config` に記述すれば`-R`オプションと同じことができるはず。
確認次第追記予定。
ブラウザエラーでページが表示されないままになったとき

# 背景
開発環境のWebページで何かの拍子に503等が出てしまう
↓
しばらくして他の人はアクセスできるようになったのに、自分だけアクセスできない。
スーパーリロードも効かない。。。

# 表示エラー例
```lang:
Service Temporarily Unavailable 503
```

```lang:
Bad Request
Your browser sent a request that this server could not understand.
Size of a request header field exceeds server limit.
Cookie
/n
```

# 解決法
ブラウザのキャッシュとCookie削除。
（めっちゃ初歩的だった。。。）
CentOS 6.4 の日本語化

先日、仮想マシンVMWareでCentOS 6.4をインストールした。
英語デフォルトなので日本語化。

こちらへアクセス

http://www.linuxpc.pro/query?os=CentOS_6&p=advanced_settings&f=2

[1]～[8]の手順に従う
※[8]でログインし直してもダメなら再起動する。

[9]～[10]
※[10]で入力メソッドが見当たらなかった場合

システム→管理→ソフトウェアの追加/削除→"IBus"で検索

"The Anthy engine for IBus input platform"をチェックして適用→入力メソッドを実行

[11]～[14]に従っていけば終了。
MovaTesting開発の心得(1)　ー　Android StudioでNDK Debug - ①

[MovaTesting](https://www.movatesting.com/)は、クラウド上でアプリ・Webサイトやゲーム、デザインのテストが行える実機検証・自動テストサービスです。テストコードの自動生成、人工知能による自動テスト、動画の自動保存、開発ツールとの連携などの特徴があります。


これまで、C/C++による開発が多く、Eclipseを使っていましたが、Android StudioのNDK対応が発表されたので、期待を込めて実際に使ってみました。自分用のメモを兼ねて投稿します。

#準備

1.Android Studioの最新版にUpdateします。
![20150909153802.png](https://qiita-image-store.s3.amazonaws.com/0/92807/0bcdfe4d-dafa-b089-fb43-4d081b968a4d.png)


2.Google公式NDKサンプルをダウンロードします。
　https://github.com/googlesamples/android-ndk

#ProjectのBuild
1.Android Studioでhello-jniのプロジェクトをOpenします。
2.Project - Open Module SettingsでDebuggableをtrue, JniDebuggableをtrueに変更します。
![スクリーンショット 2015-09-15 16.18.34.png](https://qiita-image-store.s3.amazonaws.com/0/92807/cde13b96-d7c4-d410-66f4-408763b82d72.png)
3.Build - Make ProjectでBuildする
　　NDK機能がデフォルトで有効化されているため、何の設定変更も必要なし、勝手にhello-jni.cをビルドしてくれます。「Error:(68, 0) Gradle DSL method not found: 'android()'」のエラーメッセージが出た場合、build.gradleのbuildTypesを以下のように修正する必要があります。

```
        debug {
            ndk.with {
                debuggable = true
            }
        }

```
   
#Native Debugを試す
1.hello-jni.cにブレークポイントを設定します。
![20150909170610.png](https://qiita-image-store.s3.amazonaws.com/0/92807/dcb1b2d9-1c26-cede-cbd5-b8a08c649db5.png)

2.Run - Debug...で「app-native」をクリックします。

![20150909170051.png](https://qiita-image-store.s3.amazonaws.com/0/92807/83d56aee-7546-0a9a-0566-491dacc59571.png)

3.consoleに次のLogが出力されます。
![20150909171851.png](https://qiita-image-store.s3.amazonaws.com/0/92807/d24bebc9-7617-50f5-8502-63867b963218.png)

4.でも、ブレークポイントで止めることが出来ません。
[Android StudioのNDK開発機能を使おう！](http://qiita.com/eaglesakura/items/c4af7989b03904d66ebe)を参考して、起動直後のブレークポイントで停止させることができました。

次回は、何らかのイベントで発生した後のC/C++プログラムデバッグ方法を紹介します。

最後に、スマホアプリ・サイトを開発中の方は、ぜひ[MovaTesting](https://www.movatesting.com/)を一度試してみてください。
gem validates_url 使ってみた

[validates_url](https://github.com/perfectline/validates_url) という gem を使ってみました

名前のとおり URL のバリデーションをしてくれる gem で、custom validator で実装してたのを簡単にしてくれます

# install

```
# add this to your Gemfile
gem "validate_url"
```

# 使い方

```
class User < ActiveRecord::Base

  validates :homepage, url: { allow_blank: true }

end
```

どんなチェックをしてるか見てみた

```
  uri = Addressable::URI.parse(value)
  unless uri && uri.host && schemes.include?(uri.scheme) && (!options.fetch(:no_local) || uri.host.include?('.'))
```

* `UIR.parse` できること
* `host` があること
* `scheme`（http or https）を含むことを含むこと
* オプションの `no_local` 指定がある場合、host に `.` を含むこと

バリデーションエラーはデフォルトで **[属性名] is not valid url** となってますが、I18n 対応で変更できます

# 参考

* https://github.com/perfectline/validates_url
Storyboardでカスタムビューを見やすく表示する

これ、どうしてなのか分からないんですがXcodeでカスタムビューに指定しても基本的にスーパービューの見た目で表示されます。
 ![スクリーンショット 0027-09-15 午後9.13.24.png](https://qiita-image-store.s3.amazonaws.com/0/24979/aac5c12b-75a5-f5eb-3bfa-5838ae4db323.png)
これです。どこにカスタムビューがあるかわかりますか？
わからないですよね。

こうなってたらいいですよね。
![スクリーンショット 0027-09-15 午後9.11.07.png](https://qiita-image-store.s3.amazonaws.com/0/24979/315d8606-c03b-d92c-1792-149ca3a1ed00.png)
IBDesignableを使うとわりと簡単に実装できます。
以下をコピペで大丈夫です。

```swift
    override func drawRect(rect: CGRect) {
        #if TARGET_INTERFACE_BUILDER
        
        CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(),
            UIColor(red:0.941, green:0.941, blue:0.941, alpha: 1).CGColor)
        CGContextFillRect(UIGraphicsGetCurrentContext(), rect)
        
        var className = NSStringFromClass(self.dynamicType)
        className = className.substringFromIndex(className.rangeOfString(".")!.endIndex)
        let attr = [
            NSForegroundColorAttributeName : UIColor(red:0.796, green:0.796, blue:0.796, alpha: 1),
            NSFontAttributeName : UIFont(name: "Helvetica-Bold", size: 28)!
        ]
        let size = className.boundingRectWithSize(rect.size, options: NSStringDrawingOptions.allZeros, attributes: attr, context: nil)
        className.drawAtPoint(CGPointMake(rect.width/2 - size.width/2, rect.height/2 - size.height/2), withAttributes: attr)
        
        if rect.height > 78.0 {
            let subTitle:NSString = "Prototype Content"
            let subAttr = [
                NSForegroundColorAttributeName : UIColor(red:0.796, green:0.796, blue:0.796, alpha: 1),
                NSFontAttributeName : UIFont(name: "Helvetica-Bold", size: 17)!
            ]
            let subTitleSize = subTitle.boundingRectWithSize(rect.size, options: NSStringDrawingOptions.allZeros, attributes: subAttr, context: nil)
            subTitle.drawAtPoint(CGPointMake(rect.width/2 - subTitleSize.width/2, rect.height/2 - subTitleSize.height/2 + 30), withAttributes: subAttr)
        }
        
        #endif
    }
```

ちょいちょい純正と違うのですが大体これで事足りると思います。
BaseViewか何かに書いて継承させるといいですよ！
第三者に優しいStoryboardを作ろう。
arduino mega ピン配置

##atmega2560
![PinMap2560sma_.png](https://qiita-image-store.s3.amazonaws.com/0/18104/1f69b7e3-d16a-7c94-e0a3-b20ecf7ef202.png)

##ピン配置
```
PA0   D22
PA1   D23
PA2   D24
PA3   D25
PA4   D26
PA5   D27
PA6   D28
PA7   D29
PB0   D53
PB1   D52
PB2   D51
PB3   D50
PB4   D10 (OC2A)
PB5   D11 (OC1A)
PB6   D12 (OC1B)
PB7   D13 (OC0A)
PC0   D37
PC1   D36
PC2   D35
PC3   D34
PC4   D33
PC5   D32
PC6   D31
PC7   D30
PD0   D21 (SCL)
PD1   D20 (SDA)
PD2   D19 (TX1)
PD3   D18 (RX1)
PD4   
PD5   
PD6   
PD7   D38
PE0   D0 (RX0)
PE1   D1 (TX0)
PE2   
PE3   D5 (OC3A)
PE4   D2 (OC3B)
PE5   D3 (OV3C)
PE6   
PE7   
PF0   A0
PF1   A1
PF2   A2
PF3   A3
PF4   A4
PF5   A5
PF6   A6
PF7   A7
PG0   D41
PG1   D40
PG2   D39
PG3   
PG4
PG5   D4  (OC0B)
PH0   D17 (RX2)
PH1   D16 (TX2)
PH2   
PH3   D6 (OC4A)
PH4   D7 (OC4B)
PH5   D8 (OC4C)
PH6   D9 (OC2B)
PH7   
PJ0   D15 (RX3)
PJ1   D14 (TX3)
PJ2
PJ3
PJ4
PJ5
PJ6
PJ7   
PK0   A8
PK1   A9
PK2   A10
PK3   A11
PK4   A12
PK5   A13
PK6   A14
PK7   A15
PL0   D49
PL1   D48
PL2   D47
PL3   D46 (OC5A)
PL4   D45 (OC5B)
PL5   D44 (OC5C)
PL6   D43
PL7   D42
```
concrete5 harvest festival ー 2015 Autumn　スタッフリレーカレンダー(仮)

What's harvest festival ？

concrete5のコミュニティでconcrete5の楽しさをたくさん収穫した人たちが、これから知りたいと思っているたくさんの人たちに種をまく、楽しい楽しい収穫祭イベントです。
といっても勉強会とかスタッフとか堅苦しい言葉は抜き！
みなさんのお手伝いをするのは、コーディネーターと呼んでください。
一緒に収穫祭を楽しんで行こうと思っています。

そんな、コーディネータが開催までのリレー形式で
イベントについて語ります！
XHTMLの時にブロック要素全体をリンク化

XHTMLの時にaタグでブロック要素を囲えません。
そのため、jsでブロック要素をリンク化します。
記事風のブロック要素を既存のXHTMLサイトに適用するというのも増えるのでメモ。
それならHTML5にすればと思いますが、そうもいかないのがお金と時間の都合。


##jQuery
```js
$(document).ready(function() {
	$(".linkbox").click(function() {
		window.location.href = ($(this).find("p.readmore a").attr("href"));
	});
	$("txt.readmore").addClass("none");
	$(".linkbox").hover(
		function(){
			$(this).addClass("linkbox_hover");
	},
		function(){
			$(this).removeClass("linkbox_hover");
	});
```

##HTML
```html
<div class="unit linkbox">
	<div class="thumbnail">
		<div class="pic"></div>
		<p class="category navy"></p>
	</div>
	<div class="detail">
		<p class="txt"></p>
		<div class="profile clearfix">
			<div class="pic"></div>
		</div>
		<p class="readmore none"><a href="#">( p.readmore )詳細はこちら</a></p>
	</div>
<!-- /.unit --></div>
```

##CSS
```css
.linkbox_hover{
	width:300px;
	border:1px solid #999;
	line-height:1.5;
	padding:10px;
	margin:20px;
}
.linkbox_hover{
	background:#b1e4fa;
	cursor:pointer;
}
```



引用：RedLine Magazine : ボックス全体をリンクにしたい http://redline.hippy.jp/lab/misc/post_37.php
jQueryの「return false；」を追加しJavaScriptのオフとオンに対応

「return false」を最後の行に追加JavaScriptがオフの時には、
aタグの画像に飛び、オンの時は画像の切り替えになります。

```ruby:filename.js
	$(function(){
		$("a").click(function(){
			("img").attr("src",$(this).attr("href"))
			.attr("alt",$(this).text());
			return false;
		});
	});

```
ベイズ推定のPHP習作メモ

昔、「ハッカーと画家」を読んで作ったベイズ推定のPHP習作が見つかった。
ベイズ推定自体あまり使う機会はないのだけどメモ。

```php:bayesian.php
<?php
mb_internal_encoding('UTF-8');

$gpp = false;

if (isset($_POST['e'])) {
    $g = $b = array();
    foreach ($_POST['g'] as $row) {
    // 全角を半角に、trimして、サニタイズ
     $v = htmlspecialchars(trim(preg_replace('/　/', ' ', $row)));
     if ($v != '') {
        $g[] = $v;
     }
    }
    foreach ($_POST['b'] as $row) {
     $v = htmlspecialchars(trim(preg_replace('/　/', ' ', $row)));
     if ($v != '') {
        $b[] = $v;
     }
    }

    // 総単語数
    $total = array('g'=>sizeof($g), 'b'=>sizeof($b));

    $tbl = array();

    // Good、Badでの出現回数
    foreach($g as $row) {
        if (!isset($tbl[$row])) {
             $tbl[$row] = array('g'=>0,'b'=>0);
        }
        $tbl[$row]['g']++;
    }

    foreach($b as $row) {
        if (!isset($tbl[$row])) {
            $tbl[$row] = array('g'=>0,'b'=>0);
        }
        $tbl[$row]['b']++;
    }

    // Goodの確率テーブルを作成
    foreach($tbl as $k=>$v) {
        $tbl[$k]['gp'] =  max(.01,min(.99, $tbl[$k]['g'] / $total['g']));
        $tbl[$k]['bp'] =  max(.01,min(.99, $tbl[$k]['b'] / $total['b']));
        $tbl[$k]['gpp'] = ($tbl[$k]['gp'] / ($tbl[$k]['gp']+$tbl[$k]['bp']));
    }

    $c = htmlspecialchars(preg_replace('/　/', ' ', $_POST['c']));
    $cw = array_unique(split(' ', $c));

    // 対象単語配列がGoodである確率を算出
    $gp = $bp = 1;
    $res = array();
    foreach ($cw as $row) {
        if (!isset($tbl[$row])) {
             continue;
        }
        $gp *= $tbl[$row]['gpp'];
        $bp *= (1 - $tbl[$row]['gpp']);
        $res[$row] = $tbl[$row];
    }
    $gpp = $gp / ($gp+$bp);
}
?><html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<h1>bayes</h1>
<form method="POST" action="index.php">
<table border="2">
<tr><td>Good Sentence</td><td>Bad Sentence</td></tr>
<?php
for ($i=0;$i<10;$i++) {
    $gv = isset($g[$i]) ? $g[$i] : '';
    $bv = isset($b[$i]) ? $b[$i] : '';
?>
<tr>
<td><input type="text" name="g[]" value="<?php echo $gv; ?>" size="50"/></td>
<td><input type="text" name="b[]" value="<?php echo $bv; ?>" size="50"/></td>
</tr>
<?php
}
$cv = isset($c) ? $c : '';
?>
</table>
Check Sentence<br />
<input type="text" name="c" value="<?php echo $cv; ?>" size="100" /><br />
<input type="submit" name="e" />
</form>
<?php
if ($gpp !== false) {
?>
<hr />
<?php echo $cv; ?>
<br />
Good Probablility:<?php echo $gpp; ?><br />
<pre>
total:
<?php print_r($total); ?>
words:
<?php print_r($res); ?>
<?php
}
?>
</body></html>
```
HTML／CSSを自在に操れるjQueryの命令

jQueryでは、$("...")の内側にセレクターを書き、
その後ろに.(ドット)で命令を記述する、という約束でしたので、.(ドット)の後ろに来る部分です。
CSSのプロパティを変更する命令の主な10種類があります。

##CSSのプロパティを変更する命令の主な10種類
1.テキストの変更と取得
2.HTMLの変更と取得
3.HTMLの挿入
4.HTMLの移動
5.他の要素で包む
6.要素の置き換え
7.要素の削除
8.属性値の変更と取得
9.class属性の追加と削除
10.CSSの制御


##HTML／CSSを操作する命令


|HTML／CSSを操作する命令||
|:---|:---|
|命令名・書式|意味|
|属性値の変更と削除|
|attr("属性名","属性値")|指定した属性の値を変更する|
|attr("属性名")|指定した属性を取得する|
SublimeTextに入れるべきプラグイン

コーディングをする時に、作業効率が上がるプラグイン

##Package Control
Sublime Text にパッケージを入れるためのパッケージ管理ツール
##View In Browser
ショートカットブラウザーをプレビュー
##HTML5
HTML5の自動補完
##IMESupport
インライン入力
##Japanize
メニューバーを
##SublimeLinter-jshint
jsの構文チェック
##TrailingSpaces
不要な全角半角をハイライト表示
##MaterialTheme
GoogleのMaterial Design
##SublimeLinter
リアルタイムにコードのエラーをチェック。さらに個別(jshint)のようにあります。
##Compass
Compassをビルドするパッケージ
##ConvertToUTF8
UTF-8以外の文字に対応
##Emmet
スニペットとショートカットの組み合わせ
##All AUTOcomplete
標準の自動補完（オートコンプリート）機能を強化し、マッチする文字列があればサジェストする
##AutoFileName
パスなどを入力する時に、ファイル名を補完する。
##BracketHighlighter
括弧の強調表示
##ColorHighlighter
16進数、rgbとかの色コードを実際の色で表示
##CSScomb
cssを整形
Travis CIでxcodebuildを使用する

# はじめに
[Travis CI](https://travis-ci.org)でObjective-Cプロジェクトをビルドする場合、デフォルトで[xctool](https://github.com/facebook/xctool)が実行されるが（[Building an Objective-C Project](http://docs.travis-ci.com/user/languages/objective-c/)）、xctool自体の問題でエラーになることがある。

このため、`xctool`ではなく`xcodebuild`を使用する設定ファイル（`.travis.yml`）を紹介する。

# ビルドのカスタマイズ
Travis CIのビルドは2つのステップで構成される：

1. `install`: 必要な依存物をインストール
2. `script`: ビルドスクリプトを実行

インストールステップ、スクリプトステップに加え、インストールステップの前、スクリプトステップの前後でカスタムコマンドを実行することができる。詳細は[Customizing the Build](http://docs.travis-ci.com/user/customizing-the-build/)を参照のこと。

# 設定ファイル（`.travis.yml`）のサンプル

```yaml
language: objective-c
osx_image: xcode7
before_install:
  - gem install xcpretty
before_script:
  - set -o pipefail
script:
  - xcodebuild -project name.xcodeproj -scheme schemename -destination destinationspecifier -sdk sdkname test | xcpretty -c
```

# 各行の説明
* `language`
    * 言語（`objective-c`）を指定する。
* `osx_image`
    * Xcode / SDKを指定してする。
    * 対応バージョンは[Supported OS X/iOS SDK versions](http://docs.travis-ci.com/user/languages/objective-c/#Supported-OS-X-iOS-SDK-versions)を参照のこと。
* `before_install`
    * `xcodebuild`の結果を見やすくするために[xcpretty](https://github.com/supermarin/xcpretty)を`install`の前にインストールする。
* `before_script`
    * `xcodebuild`でのエラーを取得するために`pipefail`オプションを有効にする。
* `script`
    * `xcodebuild`を実行し、結果を`xcpretty`に渡すようにスクリプトステップを上書きする。
    * `xcodebuild`で必要なパラメータは以下の通り：
        * `-project`: ビルドするプロジェクト名。（例：`TravisCI.xcodeproj`）
        * `-scheme`: ビルドするスキーム。（例：`TravisCI`）
        * `-destination`: ビルド先のデバイス。詳細は`man xcodebuild`を参照のこと。（例：`'platform=iOS Simulator,name=iPhone 6s'`）
        * `-sdk`: 使用するSDK名。詳細は`xcodebuild -showsdks`を参照のこと。（例：`iphonesimulator`）
cakephp2でのdebugkitの設定

project_name/pluginsで以下を実行

```
git clone --single-branch --branch 2.2 git://github.com/cakephp/debug_kit.git DebugKit
```

project_name/app/Controller/AppController.php

```
class AppController extends Controller {
	public function beforeFilter() {
		if (Configure::read('debug') >= 2) {
			$this->Toolbar = $this->Components->load('DebugKit.Toolbar');
		}
	}
}
```

project_name/app/View/Layouts/default.ctp

```
	<?php echo $this->element('sql_dump'); ?>//を削除する
```
【php】ニコニコ動画APIをまとめてみた

# はじめに

ニコニコ動画が大好きなのでニコニコ関連のwebサービスを作りたいと思い、初心者ながらphpで各ニコニコAPIをクラス化しました。
※悪い点がいっぱいあると思うのでご指摘いただけるとありがたいです。

## 使い方

[GitHub](https://github.com/yuki540net/NicoKit)にあげているNicoKitをダウンロードしていただける使えます。

各クラスの使い方はヘッダーのコメントに書いています。
返却される値はすべてJSON形式です。

### 各クラス
ニコニコ動画情報クラス
`NicoInfo.php`

ニコニココンテンツ検索クラス
`NicoSearch.php`

ニコニコ関連タグクラス
`NicoTags.php`

ニコニコ毎時ランキングクラス
`NicoRank.php`

ユーザ投稿動動画クラス
`NicoUser.php`

今後、その他のAPIも追加できたらなと思います。
direnv で複数 python バージョンで開発・検証

# 位置付け

ほとんど参考文献のまま。
自分用に、とりあえずコピペすると使えるように書いた。

direnv, pythonz, virtualenv など


# インストール
```
####### install packages
sudo apt-get -y install build-essential zlib1g-dev libbz2-dev libssl-dev libreadline-dev libncurses5-dev libsqlite3-dev libgdbm-dev libdb-dev libexpat-dev libpcap-dev liblzma-dev libpcre3-dev curl python-pip

####### install pythonz
curl -kL https://raw.github.com/saghul/pythonz/master/pythonz-install | bash
echo '[[ -s $HOME/.pythonz/etc/bashrc ]] && source $HOME/.pythonz/etc/bashrc' >> $HOME/.bashrc
source ~/.bashrc

####### install virtualenv
sudo pip install virtualenv

####### install direnv
curl -L -o direnv https://github.com/zimbatm/direnv/releases/download/v2.5.0/direnv.linux-amd64
sudo install direnv /usr/local/bin
echo 'type direnv > /dev/null 2>&1 && eval "$(direnv hook bash)" ' >> $HOME/.bashrc
```

# ほしい python をインストール

```
pythonz list -a
# Available Python versions
  # cpython:
     2.4
     2.4.1
     2.4.2
     2.4.3
     2.4.4
     2.4.5
     2.4.6
     2.5
     2.5.1
     2.5.2
     2.5.3
以下略
```

こんな感じでインストール
```
pythonz install 3.4.0
```

# python バージョン設定

開発したいパスで以下を実行

```
cd /PATH/TO/YOUR/PYTHON/PATH
echo 'layout python $(pythonz locate 3.4.0)' > .envrc
direnv allow
```

# バージョン変更
`.envrc` を変更して、 `direnv allow`

# パッケージインストール
`pip list` すると、そのバージョンのローカルなパッケージのみが入っていることがわかる。

```
pip install ???
```
でインストール

# 参考文献
http://qiita.com/jnotoya/items/ca9a0dfee6b9f084f4da
CircleCIの導入

# GitHubとCircleCIの登録
CircleCIを使うには、GitHubの登録をしないといけません

## GitHub
こちらから登録をします。
https://github.com/

## CircleCI
こちらから、GitHubのアカウントでログインをします。
https://circleci.com/

#リポジトリの作成
GitHubにログインをしたら、下記のボタンをクリックします。
![スクリーンショット 2015-09-15 18.23.03.png](https://qiita-image-store.s3.amazonaws.com/0/92473/9f89b47a-fa6a-fb4d-b479-8abc800caea4.png)

そうすと下の画面に進み、Repository nameをつけ、「Create repository」をクリックするとリポジトリが作成されます。
![スクリーンショット 2015-09-15 18.24.46.png](https://qiita-image-store.s3.amazonaws.com/0/92473/89bdc1a1-8996-cbf6-5dc9-368332282d65.png)

下記のようになれば、リポジトリの作成は成功です。
![スクリーンショット 2015-09-15 18.27.28.png](https://qiita-image-store.s3.amazonaws.com/0/92473/ee98c6a0-71b2-17f6-eee2-f8299bba9c3a.png)

#GitHubとCircleCIの連携
CircleCIの画面から作成したリポジトリの登録をします。
画面左にあるプラスドライバーのようなアイコンをクリックし、先ほど作成したリポジトリの登録をします。
![スクリーンショット 2015-09-15 18.52.06.png](https://qiita-image-store.s3.amazonaws.com/0/92473/8b9f5bea-0784-a70f-1209-986af238997d.png)


#Gitを使う
作業ディレクトリを作り、リポジトリをクローンします。

```
mkdir hoge
cd hoge
git clone https://github.com/HiromitsuIwata/sample.git
cd sample
```

適当にファイルを作成します。

```lang:Sample.php
<?php
class Sample
{
    public function helloWorld()
    {
    	return 'hello world!';
    }
}
```
そして、テストコードも作成します。
テストコードは関数名の最初にtestをつけるか、アノテーションで`@test`をつけることで、その関数がテストを実行する対象となります。

```lang:SampleTest.php
<?php
require_once('./Sample.php');
class SampleTest extends PHPUnit_Framework_TestCase
{
    public function testハローワールド()
    {
    	$Sample = new Sample();
        $this->assertEquals($Sample->helloWorld(), 'hello world!');
    }

    /**
     * @test
     */
    public function aaa()
    {
    	$Sample = new Sample();
        $this->assertEquals($Sample->helloWorld(), 'aaaaa');
    }
}
```

CircleCIでテストを実行するための設定ファイルを作成します。

```lang:circle.yml
test:
  override:
    - phpunit SampleTest
```

3つのファイルを作成したら、pushします。

```
git add Sample.php
git add SampleTest.php
git add circle.yml
git commit -m "add test"
git push
```
pushした時点でCircleCIのほうでテストが実行されます。
下記の画像のように表示されたら、成功です。
わざとテストコードをエラーにさせているので、Failedが表示されます。
![スクリーンショット 2015-09-15 19.05.27.png](https://qiita-image-store.s3.amazonaws.com/0/92473/a7402fe4-7fa2-d9bb-cf77-d933b9b59304.png)
詳細を見るには、該当の行をクリックすると確認できます。
テストが成功した場合には、FailedのところがFixedになります。

#まとめ
GitHubの登録をして、リポジトリ作成・クローンし、CircleCIとGitHubの連携、テストコードの作成・pushすることで、簡単にCircleCIを使うことができます。
JavaScriptでTwitterのトレンドを一覧表示する

JavaScriptのみでTwitterのAPIから最新のトレンドを取得する。
以下の記事を参考にさせていただきました。
[今話題のHTML5とjavascriptを使って、Tweet検索アプリを作ってみる](http://www.dfx.co.jp/dftalk/?p=10985)
## Twitter API
今回使用するAPIはこちら。
`https://api.twitter.com/1.1/trends/place.json`
[GET trends/place - トレンドを取得する](https://syncer.jp/twitter-api-matome/get/trends/place)
## アクセストークン
Twitter APIを使用するには認証が必要となります。
認証に必要なKeyは[Twitter Developers](https://dev.twitter.com/)で取得してください。
## 認証用ライブラリ
こちらからダウンロードして使っています。
http://oauth.googlecode.com/svn/code/javascript/

## サンプルコード
アクセストークン(consumerKey等)は各自取得した値に変更して下さい。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8" />
    <title>My Web App</title>
</head>
	
<script type="text/javascript" src="js/jquery-1.11.3.min.js"></script>
<script type="text/javascript" src="js/oauth.js"></script>
<script type="text/javascript" src="js/sha1.js"></script>
	
<body>
    <div id="twitter">
        <div class="listView">
        </div>
    </div>

    <script type="text/javascript">
        var consumerKey    = "xxxx";
        var consumerSecret = "xxxx";
        var accessToken    = "xxxx";
        var tokenSecret    = "xxxx";

        function getTwitter(action, woeid)	 {
 
            var accessor = {
                consumerSecret: consumerSecret,
                tokenSecret: tokenSecret
            };
 
            var message = {
                method: "GET",
                action: action,
                parameters: {
                    oauth_version: "1.0",
                    oauth_signature_method: "HMAC-SHA1",
                    oauth_consumer_key: consumerKey,
                    oauth_token: accessToken,
					id: woeid,
					exclude: "hashtags",
                    callback: "update"
                }
            };
 
            // 認証関係
            OAuth.setTimestampAndNonce(message);
            OAuth.SignatureMethod.sign(message, accessor);
            var url = OAuth.addToURL(message.action, message.parameters);
 
            // ajaxによる通信
            $.ajax({
                type: message.method,
                url: url, // リクエスト先のURL
                dataType: "jsonp",
                jsonp: false,
                cache: true,
            });
        }
 
        // UIの更新
        function update(data){
            $(".listView").empty();
            var result = data[0].trends;                // 取得したデータから、メソッドチェーンで必要なものを取得
            for( var i = 0; i < result.length; i++ ) {
                var name = result[i].name;              // トレンドワード
                var url = result[i].url;                // トレンドワードの検索結果リンク
                
                // トレンドワードを一覧表示
                $(".listView").append('<div>' + name + ' | ' + url + '</div>');
            }
        }
 
        $(window).load(function(){
			// リクエスト先のURL
			var url = "https://api.twitter.com/1.1/trends/place.json";
			// WOEID
			var woeid = 23424856;
			// Tweet検索関数の呼び出し
			getTwitter(url, woeid);
        });
 
    </script>
 
</body>
</html>
```
ActionControllerを継承したController外(Model, rake task等)でURLヘルパーを使用したい場合の対処法


## Context
- hogefuga_url/higefoge_path などのurlヘルパーはController内で定義されており、ActionControllerを継承したController内では適切にパスとして機能する。
- link_toで渡す"hogefuga_url" / "higefoge_path"を読み込んで適切なURLを生成・紐付けしてくれるのがURLヘルパー（別名：pathヘルパー）である。

- サンプルコード（adminからuserへのメッセージを作成し、引数にメッセージ内容とリンクを渡している）

 ```ruby
  task test_task: :environment do
    User.where(start_date: Date.today).each do |user|
      user.send_admin_message("message", edit_user_url(token: user.token))
    end
  end
```

## Problem
- 例えば、モデル内やrake task内において、あるurlを読み込みたい場合や引数で渡したい場合がある。そのときにただ foga_url を渡すと、NoMethodErrorが出てしまう。

## Solution
- 原因は、Model内やrake task内では ```Rails.application.routes.url_helpers``` 内で定義されているURLヘルパーがincludeされていないこと。
- よって該当するrake taskやmodel内において、
 
 ```ruby
include Rails.application.routes.url_helpers
```
を追加してあげれば良い。
GcmTaskServiceの内部実装の推測とコーナーケースの挙動

# 本ドキュメントについて

[GcmTaskService](https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager)の内部実装を推測し、公式ドキュメントからは読み取れないコーナーケースでの挙動を説明する。

# GcmTaskServiceとは

GcmTaskServiceは、Google Play Services 7.5から入った、ネットワークやバッテリの状態に合わせたバックグラウンド処理を行ってくれる仕組みである。

GcmTaskServiceを使うと、ネットワークに繋がっているときにサーバーとデータを同期する、というような処理を簡単に書くことができる。

# GcmTaskServiceの動作の疑問点

GcmTaskServiceのドキュメントはちょっと…なので、コーナーケースの動作がどうなっているかが読み取れない。例えば、

- taskの処理時間がPeriodicTaskのインターバルよりも長い場合にはどうなるのか。
- taskの処理中に別のtaskをスケジュールするとどうなるのか。その際、setUpdateCurrentの値はどう影響するのか。
- onRunTaskの戻り値のRESULT_SUCCESSとRESULT_FAILUREはどう違うのか
- onRunTaskがRESULT_RESCHEDULEを返して次の実行待ち中に、別のtaskをスケジュールするとどうなるのか。

# GcmTaskServiceの中身はきっとこうなっている

GcmTaskServiceのソースコードは公開されていないが、いろいろ実験を行って、内部実装を推測した。この推測した内部実装から、GcmTaskServiceのコーナーケースの挙動を理解することができる。

## schedule()でtaskをスケジュールする時

taskは、tagをキーとしたmapで管理されている。同じtagのtaskは(一つのGcmTaskServiceにつき)mapに一つしか存在しない。taskが実行するときにはmapから抜かれるので、taskの実行が開始された後に、実行中のtaskと同じtagのtaskをmapに入れることは可能。

**setUpdateCurrent(false)でschedule()を読んだ場合**
mapに既にエントリが有る場合には何もしない。

**setUpdateCurrent(true)でschedule()を読んだ場合場合**
mapにエントリがあれば上書き、なければセット。
同じtagを持つ実行中のtaskがなければ、次にtaskを実行する時刻を設定する。

## task実行直前

taskを実行する(onRunTask()を呼び出す)前に、mapからそのエントリを抜く。エントリを抜くという事は、実行中のtaskと同じtagのtaskをmapに追加することが可能。

## task実行直後

まず、taskのタイプとonRunTask()の戻り値に応じて、以下が行われる。onRunTask()の戻り値のRESULT_SUCCESSとRESULT_FAILUREで動作に違いはない。

**OneoffTask + RESULT_SUCCESS/RESULT_FAILUREの場合**
何もしない。

**OneoffTask + RESULT_RESCHEDULEの場合**
back-off付きで、実行したのと同じtaskをsetUpdateCurrent(false)でmapに追加する。既にmapに同じtagのtaskがある場合には、mapへの追加は行わない。

**PeriodicTask + RESULT_SUCCESS/RESULT_FAILUREの場合**
taskの元々のインターバルで、実行したのと同じtaskをsetUpdateCurrent(false)でmapに追加する。既にmapに同じtagのtaskがある場合には、mapへの追加は行わない。

**PeriodicTask + RESULT_RESCHEDULEの場合**
back-off付きで、実行したのと同じtaskをsetUpdateCurrent(false)でmapに追加する。既にmapに同じtagのtaskがある場合には、mapへの追加は行わない。

その後、この時点でmapに登録されているtaskがあれば、次にtaskを実行する時刻を設定する。実行時刻は、task実行直後からの相対時間。


# 先の疑問点への解答

- taskの処理時間がPeriodicTaskのインターバルよりも長い場合にはどうなるのか。
→ task完了後にmapに再度入れなおす(再スケジュールする)ので、次のtask実行時刻はtask完了時刻から計算される。

- taskの処理中に別のtaskをスケジュールするとどうなるのか。その際、setUpdateCurrentの値はどう影響するのか。
→ taskは処理直前にmapから抜かれるので、task処理中は別のtaskをmapに入れることができる。mapにエントリは無いので、setUpdateCurrentの値には関係なく別のtaskをmapに入れることができる。

- onRunTaskの戻り値のRESULT_SUCCESSとRESULT_FAILUREはどう違うのか
→ 違いはない。

- onRunTaskがRESULT_RESCHEDULEを返して次の実行待ち中に、別のtaskをスケジュールするとどうなるのか。
→ RESULT_RESCHEDULEの場合は、次の実行時刻にback-offが付いているだけで、それ以外は通常のtaskと違いはない。setUpdateCurrent=trueなら上書きできるし、setUpdateCurrent=falseなら上書きできない。

# その他GcmTaskServiceのハマりどころ

## IntentFilterの文字列

IntentFilterにSERVICE_ACTION_EXECUTE_TASKをセットするようにと書いておきながら、コード例は
    
    <action android:name="com.google.android.gms.gcm.ACTION_TASK_READY" />

と違う文字列なっていて混乱するが、実は

    public static final String SERVICE_ACTION_EXECUTE_TASK = "com.google.android.gms.gcm.ACTION_TASK_READY";

と定義されていて、同じ文字列になっている。

## taskの内容はGoogle Play Serviceが覚えている

一度セットしたtaskは、アプリではなくGoogle Play Serviceが覚えている。アプリのアップデート後にsetUpdateCurrent(false)でtaskをスケジュールしようとしても、前のtaskが残っているため上書きできないことがあるので注意。

## スケジュールされたタスクの一回目のonRunTaskは遅れる

最初の呼び出しは、1-2分くらいかかるようだ。setExecutionWindow()やsetPeriod()で近い未来を指定しても、すぐには実行されない。
Twilioを始めて躓いてるんだって？じゃあコレを読んでみるといい。

電話とインターネットを簡単に繋いでくれるTwilio。
非常にありがたい存在ではあるけれども、使い始めるにあたってとっつきにくいところも。

自分が始めるときに理解に時間がかかった点、もたついた点を残しておくので、
これから始める人の敷居が少しでも下がれば幸い。

## "Voice"と"Client"の違いが分からない問題
Twilioを始めようと思って、公式サイトをとりあえず眺めていると、
「[Twilioには3つの機能があります](http://twilio.kddi-web.com/function/)」と出てくる。"Voice", "Client", "SMS"。

SMSはまぁ分かる。電話に対してメッセージ送れるんでしょ？（使ったことないけど）

問題は[Voice](http://twilio.kddi-web.com/function/voice/)と[Client](http://twilio.kddi-web.com/function/client/)。
機能一覧を見ると、一言一句同じなわけで…。なんなのさ？

とりあえず以下の認識があれば困らないと思う。

* Voice -> 一般の電話も扱えるよ！
* Client -> ブラウザやスマホアプリからも電話できるよ！

厳密なこと言い出すと通信回線が違うので音質が…とかあるんだろうけど、
通話できることには変わりないので気にしない。

機能一覧が全く同じということは、一般電話/ブラウザ/スマホアプリで、同等のことが実現可能ということ。
素晴らしい！

## 自分の知ってる「電話番号」と違う問題
Twilioで取得する「電話番号」は、普通の電話番号とは性質が異なるので、
メンタルモデルを構築するのにちょっと苦労する。

* 自分の知ってる「電話番号」
 * 1対1の通話のみ
 * 通話中であれば繋がらない
* Twilioで取得する「電話番号」
 * 何人でも同時通話できる
 * 誰かが通話中でも関係なく処理してくれる

一言で表すと、Twilio電話番号はTwilioにアクセスするためのインターフェース。

普通の電話のように電話番号の先に特定の端末があるのではなく、
Twilio電話番号の先にはTwilioのシステムがあり、
Twilioが設定に応じていい感じに通話の接続をしてくれる。

特定の端末ではなく、Twilioのシステムに向かって電話をかけているというイメージが重要。
[こちら](http://qiita.com/Kta-M/items/42d35a6314ed89adb135)の記事も参照してもらえると、ちょっと具体的な話になっているので分かりやすいかも。

## なんだかAPIとかの種類がいっぱいある問題
公式ドキュメントの[Twilio Docs](https://jp.twilio.com/docs)を見ると、
APIやライブラリのリファレンスが色々あって、何をどう使えばいいのか最初はちょっと戸惑う。
主に使うのは以下の4つ。

* [TwiML](https://jp.twilio.com/docs/api/twiml)
* [Helperライブラリ](https://jp.twilio.com/docs/libraries)
* [Client](https://jp.twilio.com/docs/client)
* [REST API](https://jp.twilio.com/docs/api/rest)

### TwiML
Twilioにどういう動作をして欲しいかを記述するXMLで、Twilioの要。
電話を転送したり、文章を読み上げたり、MP3ファイルを再生したり、通話を録音したり、押されたキーの情報を取得したり（○○に関するお問い合せは1番を、…とかいうやつ）、いろいろできる。

TwiMLを直書きしてどこかのサーバに置くか、TwiMLを生成するWebアプリを作成するかして、
「このTwilio電話番号に着信があったら、このURLからTwiMLを取得して！」という感じで設定を行うことで、Twilioアプリは成り立っている。

設定画面はこんな感じ。
![スクリーンショット_2015-07-20_16_11_27.png](https://qiita-image-store.s3.amazonaws.com/0/39565/33f3eebe-c92f-87e1-6a1c-149cddfc160d.png "スクリーンショット_2015-07-20_16_11_27.png")

### Helperライブラリ
前述の`TwiML`のところで書いた「TwiMLを生成するWebアプリ」を作成したり、
Webアプリ内で後述の`REST API`の機能を使ったりするためのHelperライブラリ。
PHP, Ruby, Java, nodeなど、いろんな言語に対応している。

### Client
ブラウザやスマホアプリ(Client)の動作を書くためのライブラリ。
普通の電話機に備わっている、着信を受け取ったり、通話を開始したりといった機能をコレで書く感じ。
自分で書けるので、着信があった時に画面にコレを表示して…など、いろいろと自由にできる。
Webアプリの場合はjs, スマホの場合はAndroid, iOS向けのSDKが用意されている。

### REST API
Twilioの機能がひと通り使えるWeb API。
直接使ったことはないけど、`Helperライブラリ`で機能を使うので、見ておいたほうが吉。

## 効率的に動作確認をするにはどうすればいいか分からない問題

いざ実装を始めると、やっぱり要所要所で動作確認がしたくなるもの。
でも、Twilioが動作するには、Twilioからアプリに対してアクセスできなければならない。
スマホアプリなら実機ですぐに試せるだろうけど、
Webアプリの場合はローカルで動作させていても動作確認できない！
とはいえ、ちょっと修正するごとにいちいちデプロイするのもめんどくさすぎる。。

そんなときはコレ。[ngrok](https://ngrok.com/)!!
macでhomebrewを使っていれば、コマンド2つでとりあえず外部からアクセスできるようになる。

```
$ brew cask install ngrok
$ ngrok 3000
```

ただ、これだとURLが毎回ランダムに変わってしまうので、
固定したい場合には登録（無料）が必要。

[ココ](https://dashboard.ngrok.com/user/signup)からサインアップを行い、
ダッシュボードのMainタブに出ているコマンドを実行すればOK。

```
$ ./ngrok authtoken 2ioCxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

としたあとに、

```
$ ngrok -subdomain=hogehoge　3000
```

これでできたngrok経由のURLをTwilioに設定してあげれば、デプロイ無しで動作確認できる。
素晴らしい。

ngrokについてもうちょっと詳しく：http://liginc.co.jp/web/programming/156484
nkfコマンドの罠？

# nkfコマンドとは
Linuxで使える文字コード変換の王道？コマンドです。
オプションで、文字コード判別も利用できます。

今回はその文字コード変換で嵌ったのでめもめも :pencil2: 

## 環境
こんな感じ

```
Linux VirtualBox 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux


DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04 LTS"

# nkf -v
Network Kanji Filter Version 2.1.3 (2013-11-22) 
Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa).
Copyright (C) 1996-2013, The nkf Project.

```

## まずnkfの動きのおさらい
utf8のファイルとeucのファイルを準備します。

```
* 中身はこんな感じ
root@VirtualBox:/tmp# cat utf8-aiu.txt 
あいうえお
root@VirtualBox:/tmp# cat euc-aiu.txt 
あいうえお

* コードはちゃんとちがう
root@VirtualBox:/tmp# od -x utf8-aiu.txt 
0000000 81e3 e382 8481 81e3 e386 8881 81e3 0a8a
0000020
root@VirtualBox:/tmp# od -x euc-aiu.txt 
0000000 a2a4 a4a4 a6a4 a8a4 aaa4 000a
0000013
```

### 変換してみる(euc → utf8)

```
* ターミナルの設定がutf8なので普通にやるとバケバケ
root@VirtualBox:/tmp# cat euc-aiu.txt 
����������

* nkf -wでutf8にするとバケない（ちゃんと変換できてますねー）
root@VirtualBox:/tmp# nkf -w euc-aiu.txt 
あいうえお
```

ここまではOK！

次

### 文字コード判定してみる

```
root@VirtualBox:/tmp# nkf -g euc-aiu.txt 
EUC-JP

root@VirtualBox:/tmp# nkf -g utf8-aiu.txt 
UTF-8
```

よさげ。

次。

## 変な文字(unicode)でやってみる

```
root@VirtualBox:/tmp# cat unicode.txt 
«

root@VirtualBox:/tmp# od -x unicode.txt 
0000000 abc2 000a
0000003
```

こいつの、文字コードは？

```
root@VirtualBox:/tmp# nkf -g unicode.txt 
EUC-JP
```

!!!　UTF-8じゃない。

で、いろいろ調べてみると。。

「«」(abc2）のバイトコードはeucでも存在しており（eucだと「束」）どうやらバイトコードかぶっていたようです。
で、さらにネットを漁ると、nkfの文字列判定の優先度があるっぽく、同一範囲だと
EUC-JP　→　SJIS　→　JIS　→　UTF-8
の順で判定されるみたいです。

でも、、、

```
root@VirtualBox:/tmp# nkf -w unicode.txt 
束
root@VirtualBox:/tmp# nkf -e unicode.txt 
«
```
これって逆じゃない？と思いました。。

変換後の状態は普通でしたが。。

```
root@VirtualBox:/tmp# nkf -w unicode.txt  > w-u.txt
root@VirtualBox:/tmp# nkf -e unicode.txt  > e-u.txt
root@VirtualBox:/tmp# od -x w-u.txt 
0000000 9de6 0a9f
0000004
root@VirtualBox:/tmp# od -x e-u.txt 
0000000 abc2 000a
0000003
```

ここだけよくわからず。。

念のため、以下(変な文字＋utf8範囲の文字)も確認

```
root@VirtualBox:/tmp# cat unicode.txt 
«あ

root@VirtualBox:/tmp# nkf -g  unicode.txt 
UTF-8

root@VirtualBox:/tmp# nkf -w unicode.txt 
«あ

＜ターミナルの設定をEUCにして＞
root@VirtualBox:/tmp# nkf -e unicode.txt 
あ
```

これは想定どおり動いてくれました。


完。


# おまけ
nkfの文字コード変換して上書きするオプション「--overwrite」 よく使います。