OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry PiにMonoを入れるまで

Raspberry Piにmonoを入れる。
#前提
* 使用するRaspberry Pi: Raspberry Pi 2
* microSD: SDHC 32GB Class10
* microSDへのイメージ書き込み用OS: Windows 10
* microSDに書き込むOS: Raspbian (Debian Wheezy May 2015)

#Raspbian書き込み
1. Raspberry Pi公式Webサイトの[リンク](https://www.raspberrypi.org/downloads/raspbian/)よりイメージをダウンロードし、ZIPファイルを解凍する。
2. [Win32DiskImager](http://sourceforge.net/projects/win32diskimager/)を使用して解凍したイメージファイルをmicroSDに書き込む

#Raspbian初期設定
1. 初回起動すると"Raspberry Pi Software Configuration Tool"が起動するので、"1. Expand Filesystem"を実行してから、"9. Advanced Options" => "A5 Device Tree"を選択して"No"でDevice Treeを無効にする。
2. "Finish"で再起動すると、microSDHCのサイズにファイルシステムがリサイズされる。(注: Device Treeを無効にするのは、有効だとGPIO周りの挙動が古いバージョンと違うため、一部ソフトウエアの挙動がおかしくなる問題を修正する目的があります)

#Raspbianアップデート
(ここからSSHで操作しても問題ありません)
1. pi / raspberryでログインし、`sudo apt-get update` をしてパッケージリストを更新します
2. `sudo apt-get upgrade`でアップデートを行います。

#monoインストール
[mono Project](http://www.mono-project.com/docs/getting-started/install/linux/)のサイトを参考にしましょう。
1. aptにmonoのレポジトリ用の鍵をインポートします。
`sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF`
2. aptのパッケージソースに追加します。
`echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list`
3. パッケージリストを更新します。
`sudo apt-get update`
4. monoをインストールします。
`sudo apt-get install mono-complete`

#monoの確認
以下のようにすると確認できます。
>pi@raspberrypi ~ $ mono-csc --version
>Mono C# compiler version 4.0.3.0
>pi@raspberrypi ~ $
[小ネタ]AWS CLIのS3コマンドでのエンドポイントがコマンドによって違った

小ネタ。
Proxy経由でのみアクセスできる環境でAWS CLIでS3コマンドを使って色々やろうとしたらコマンドによってはNGだったのでその時の調査メモ。

# 環境

+ Amazon Linux AMI 2015.03
+ S3アクセスできるIAMロールを付与

# 結論

Proxyで接続先のホストの絞り込みをしていて、コマンドによっては接続先エンドポイントが違うことにより、接続ができなかった。

# 調査

```
$aws s3 ls --debug
・・・
2015-08-18 12:07:28,834 - MainThread - botocore.vendored.requests.packages.urllib3.connectionpool - INFO - Starting new HTTPS connection (1): s3.amazonaws.com
```

エンドポイントは`s3.amazonaws.com`らしい。


```
$aws s3 ls s3://toshihirock-cloudtrail --debug
・・・
2015-08-18 12:07:48,508 - MainThread - botocore.vendored.requests.packages.urllib3.connectionpool - INFO - Starting new HTTPS connection (1): toshihirock-cloudtrail.s3.amazonaws.com
```

エンドポイントにバケット名が追加されて`toshihirock-cloudtrail.s3.amazonaws.com`になっていた!この時の接続がだめだった。。。
unity > EventSystem > uGUI上にマウスカーソルがあるかのチェック > EventSystem.current.IsPointerOverGameObject ();

```txt:動作確認
Unity 5.1.1-f1 on Mac OS X 10.8.5
```

参考
http://cignoir.hatenablog.jp/entry/2014/08/28/141653


##準備
1. UI > Toggleを２つ置く。名前はToggle1とToggle2とする
2. それぞれのToggleに以下のスクリプトを関連づける

##code

```csharp
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems; // for EventSystem.XXX

public class CheckOver : MonoBehaviour {
	void Update () {
		bool res = EventSystem.current.IsPointerOverGameObject ();
		if (res) {
			Debug.Log("over:" + gameObject.name);
		}
	}
}
```

##動作
マウスカーソルをいずれかのToggleの上に置くと以下のようなメッセージがConsoleに表示される。

```
over:Toggle1
```
sourcetreeをmacで使う際のsshキーの設定

##macでsshキー作成
ターミナルを開いて以下のコマンドを叩く

```
ssh-keygen -t rsa
```
いろいろ向こうから訪ねてくるけどここは頑なにreturnを押し続ける。

なにやらキーができましたよ的なメッセージが出たら今度は以下のコマンドを叩いて出てきた文字列をとりあえずコピー

```
less /Users/[ユーザー名]/.ssh/id_rsa.pub
```


##bitbucketに登録

画面右上のアイコンの隣にある「▼」から「アカウントの管理」に移動
今度は画面左側の「SSHキー」を押して「鍵を追加」
「label」は自分が分かるものでOK
「key」はさっきコピーした文字列を押す

登録完了
Pythonでウィンドウを作りたい

専門学校時代にC++を習っていたけど
自分だけが上達しなかったというコンプレックスから
ずっとプログラミングから逃げていました。

だけど、どこからともなく、情熱が燃え上がってきて
ソフトウェアなり、ゲームなりを作りたくなってきたので
ドットインストールで学習して
その後英語のサイト開いたりしてわかった事
なぜだかはわからないけど、"setup.py"がないというエラーが出て、
色々なライブラリが開けないということ。
ちなみに、"setup.py"のパスを実行するとエラーになりました。

"pygema"は64bitに対応していない？ようだという事
SDLのインストールの仕方がわからないと思っていたら
"setup.py"に原因があるんではないかということ

Cのライブラリがダメなら、Javaのライブラリをインストールすればいいのではないかと思って検索したら
このような動画がヒットしたのでもう少し粘ってみたいと思っています。

https://www.youtube.com/watch?v=4Jm4NEbxRMs

今は
`# -*- coding:utf-8 -*-
from javax.swing import JFrame,JButton,JOptionPane
`
と書いた時点で当然のようにImportErrorが表示されているので
何かをインストールしなくちゃけ無いんだなという事は分かっていますが、なにをインストールするかはこれから調べます。
unity > go > refers to the GameObject you're trying to use.

以下のページを見ていて、goはなにかというとGameObjectのことだった。

http://forum.unity3d.com/threads/2-canvas-based-navigations-but-only-1-event-system-permitted.265890/

> "go" refers to the GameObject you're trying to use. 

```csharp
es.SetSelectedGameObject(go, null);
```
[Grails]Cacheプラグインでblockのkey毎にキャッシュを消す方法

#概要
GrailsのCacheプラグインで、GSPの中で利用できる`<cache:block>`というタグが有ります。
`<cache:block></cache:block>`で囲まれた中の処理はキャッシュされ、2度目のアクセスからはキャッシュされた内容が返されるので、処理速度の向上が図れます。

また、`key`属性を使うことで、ページごとに異なった内容をキャッシュさせることも出来ます。
`<cache:block key="contentId-123>`みたいな感じですね。

#問題点
Serviceのキャッシュなどと違い、何故かこの`<cache:block>`には、key毎にキャッシュを削除するメソッドが存在しません。
なので、特定のページ（例えばcontentId-123の商品を表示しているページ）の`<cache:block>`でキャッシュされたものをクリアする、と言うことが出来ません。
キャッシュをクリアするためには`grailsCacheAdminService.clearBlocksCache()`というメソッドを使うしかありません。処理的には問題ありませんが、消す必要のないキャッシュまで全て消えてしまいます。

#対策
自前で処理を追加します。
方法は色々有りますが、私は以下のようにしています。

##キャッシュの作成
キャッシュの生成自体は上のサンプル通りです。
適当なGSP内で、キャッシュしたい内容を`<cache:block>`で囲みます。

```groovy
<cache:block key="contentId-${contentId}">
...ココに重い処理。この部分がキャッシュされる
</cache:block>
```

##キャッシュの削除メソッド
どこかのServiceに以下のメソッドを追加。

```groovy
@CacheEvict(value='grailsBlocksCache', key="#key")
void clearBlockCacheByKey(String key){}
```

**value='grailsBlocksCache'** というvalueは固定です。コレはCacheプラグインが自動で付与しているものです。

##削除メソッドを呼ぶ
ココが味噌です。先ほどclearBlockCacheByKeyに削除したいキャッシュのkeyを渡すだけなのですが、実は`<cache:block>`taglibを使うと、指定したkeyにGSPのクラス名が付与されています。
フォーマットは`{GSPのクラス名}:{自分で指定したkey}`となっています。
余り効率的なコードではありませんが、私は以下のようにして、`grailsBlocksCache`に紐付いているkey名を一気に取得して、その中から、自分が指定したkey名を含むものを探しだして、先ほどの`clearBlocksCacheByKey`に渡すようにしています。

```groovy
def deleteCacheBlock() {

    String valueForCacheBlock = "grailsBlocksCache" // コレは固定
    String deleteKey = "contentId-123"    // この値を指定して、削除したいキャッシュのキーを切り替える

    String targetCacheKey = grailsCacheManager.getCache(valueForCacheBlock).getAllKeys().find {String key ->
        key.split(':')[-1] == deleteKey

    }
    if (targetCacheKey) {
        myCacheService.clearBlockCacheByKey(targetCacheKey)
    }
    render "ok"
}
```

#まとめ
特に難しい内容でもなく、理想的な対処方法ではありませんが、ちょっとハマったのでメモです。
いやいや、もっと効率的な方法あるよとか、そもそもそのためにXXXというメソッドがあるよ、など有りましたら教えていただけると嬉しいです。。。

#参考
http://grails-plugins.github.io/grails-cache/ref/Tags/block.html
windowsキーのコマンドでアクティブの画面をセカンドディスプレイに移動できたじゃん　あれをmacでもやりたい

某日に仕事用PCをwindowsからmacに切り替え
windowsでさくさく使えてたショートカットが使えないだけで案外ストレスフル
ということで必死にググった内容をここにまとめておく

Spectacleのインストール
こちらを参照
http://loumo.jp/wp/archive/20140312222642/

セカンドディスプレイへの移動はさることながら、画面の分割も思いのままになる。

ショートカットの記号わかんないよって人は一旦ここをおさらい
https://support.apple.com/ja-jp/HT201236

# セカンドディスプレイ移動先で画面分割できないんだけど...

明確な解決方法は見つからず、とりあえずshiftitのインストール
http://smcomemory.com/mac-app-454

Spectacleとshiftitの合わせ技で解決
できればもっとスマートなやり方が良いのでご存知の方は教えてください
laravelでgeometry型から緯度経度を取ってくる時に使うスコープ

例えばshopsテーブルにあるlatlongというカラムがgeometry型だったとして、ここから緯度経度を引っ張り出したい時がある。
特にgooglemapを埋め込む時にやれ中央にマーカーを置きたいとなると緯度経度が必要になる。

せっかくlaravelを使っているのであれば、スコープを使って一工夫
そもそもスコープって何って人はこちらを参照
http://laravel.com/docs/5.0/eloquent#query-scopes

shopsテーブルのmodelに以下を記述

```
public function scopeLatlong($q)
{
    return $q->select(array('*', DB::raw('X(latlong) as `lat`'), DB::raw('Y(latlong) as `long`')));
}
```
このスコープを使うことで緯度の入ったlatカラム,経度の入ったlongカラムを追加した状態でテーブルのデータを取得できるようになる。

続いてcontroller側でshopsテーブルのidが指定のidのデータを取得

```
$latlong = Shop::latlong()->find($id);
```

こんな感じで緯度経度が取得できる。

```
$latlong->lat  //緯度
$latlong->long //経度
```
【Firefox】user agent switcher のUAの種類を増やす

user agent switcherといえば

Firefoxで上部のメニューバーの地球みたいな :earth_africa: マークを押すと
UAが選べて、選択した状態でwebページを開くとUAに合わせたページを表示してくれる。
いわゆる「UA偽装」というものである。

さて、ならばiPhoneの動作確認を...
「iPhone 3」の表示しか見当たらず
デフォルトの種類がやや乏しい。
ということで対応UAの種類を増やす方法を教えていただいたのでメモ

# useragentswitcher.xmlを入手

例の、地球みたいな :earth_africa: マークを押す
一番下の「User Agent Switcher」→ 「options」を選択

「Download lists of user agents to imoprt...」というURLをクリック
もしくは
http://forums.chrispederick.com/discussion/7/a-large-regularly-updated-import-list-of-user-agents に移動（※2015/07/14）

何やら英語がいろいろ書かれているけど、
「A Large, Regularly Updated Import List Of User Agents」とやら、UAの設定を新しくしました的な記述があるので、その記載してあるURLに移動
http://techpatterns.com/forums/about304.html
（※2015/07/14）

「Direct Download」というリンクがあるのでそこを右クリック→「名前を付けてリンク先を保存」
「useragentswitcher.xml」がダウンロードできる。

# useragentswitcher.xmlを設定

気を取り直してもう一度
例の、地球みたいな :earth_africa: マークを押す
一番下の「User Agent Switcher」→ 「options」を選択

出てきたウィンドウの下半分くらいの「Import/Export」から「Import」を選択
先程ダウンロードした「useragentswitcher.xml」を選択
Vim の Command-T によるファイル検索とおすすめの設定

Vim でファイルを開くのに Command-T を使い始めてから2年経ちました。十分に速く、便利なので重宝しています。

ここでは Command-T についての短い説明と、私のおすすめの設定を紹介したいと思います。

## 短い説明

作者である Greg Hurrell 氏が次のように説明しています。

> Command-T プラグインを使えば、非常に高速で直感的なファイル検索が、最小のキーストロークでできるようになります。TextMate のキーバインドからアイデアを得たので "Command-T" という名前にしました。
> 
> ファイルはパスでインクリメンタル検索され、かつ、検索キーワードに対して関連の高いパスを順に一覧します。例えば、あるディレクトリの直下のディレクトリ名、ファイル名をキーワードに優先してヒットさせます。
http://www.vim.org/scripts/script.php?script_id=3025

私は普段フレームワークコードを含めて 4800 程度のフロントエンドのファイルを扱っています。Command-T　は上記の重みづけのアルゴリズムによって、少ないキーワードでディレクトリの深くにあるうろ覚えのファイルをほぼ意図どおりに見つけることができてしまうのが特徴です。また多少typoしても上位に表示されることが多いです。

[インストール方法は vim.org のページが簡潔ですので、ぜひ試してみてください](http://www.vim.org/scripts/script.php?script_id=3025)。利用に当たって、VimがRubyサポートバージョンであること、C拡張のコンパイルも必要であることに注意してください。

## よく使うコマンド

およそ作業中に使うコマンドは下の2つです。自由なキーに割り当てると良いと思います。

### `:CommandT <対象ディレクトリ>`

対象ディレクトリの配下にあるファイルを対象に検索します。

### `:CommandTBuffer`

バッファから検索します。

## おすすめの設定

使い込んでいると、少し気になる挙動があります。これを解決する、おすすめの設定を紹介したいと思います。あなたの設定の参考になれば幸いですが、言ってることが結構細かいので注意してください。

こちらがCommand-Tの私の設定です。

```
""""""""""""""""""""""""""""""""
"  Key Maps -- Command-T
""""""""""""""""""""""""""""""""
let s:commandTHeight=18
let g:CommandTMaxHeight=s:commandTHeight
let g:CommandTMinHeight=s:commandTHeight
let g:CommandTClearMap=['<C-u>', '<C-w>']
let g:CommandTCancelMap=['<C-[>', '<C-c>', '<Esc>']
let g:CommandTMaxDepth=20
nnoremap  ,t :CommandTFlush<CR>\|:CommandT<Space><UP>
nnoremap  <silent> ,l :CommandTFlush<CR>\|:CommandT<CR>
nnoremap  <silent> ,b :CommandTFlush<CR>\|:CommandTBuffer<CR>
```

### 検索結果を同じ高さにする

デフォルトの設定では検索結果を画面いっぱいに表示します。これをインクリメンタル検索で絞り込むと、検索結果上位の表示位置が徐々に下がっていき、目で追うのが辛いです。

検索結果上位が上部に表示されますが・・・
![full.png](https://qiita-image-store.s3.amazonaws.com/0/11136/f0a375f9-9cf0-e0e5-db2f-2df9b1a4c0a8.png)

絞り込むと下に移動して目で追わなくてはなりません。
![part.png](https://qiita-image-store.s3.amazonaws.com/0/11136/51a1467b-3d9f-7099-56cb-a08894e8bdfd.png)

これを回避するために、表示領域の高さを固定する設定をします。

```
let s:commandTHeight=18
let g:CommandTMaxHeight=s:commandTHeight
let g:CommandTMinHeight=s:commandTHeight
```

![fixed.png](https://qiita-image-store.s3.amazonaws.com/0/11136/6521833c-6cdf-aebe-2d79-05f887c9fbd2.png)

これによって、結果が絞り込まれても検索上位の位置が変化せず、目に優しくなりました。

### 過去の `<対象ディレクトリ>` から選べるようにする

作業中の `<対象ディレクトリ>` は、およそ5種類程度なのではないでしょうか。毎回入力するのは面倒です。また前回指定した `<対象ディレクトリ>` が最初に入っていると、都合がいい事が多いのではないでしょうか。

```
nnoremap  ,t :CommandTFlush<CR>\|:CommandT<Space><UP>
```

ここではキーバインドに `,t` を指定しています。上のように設定することで、Command-T の引数として前回入力したディレクトリを表示します。例えば前回の `<対象ディレクトリ>` が `web/WEB-INF` だった場合、

`:CommandT web/WEB-INF`

とコマンドエリアに表示され、`Enter` で検索が始まります。また `UP`（上キー）で、前々回のディレクトリを表示します。`UP`を押すたびに、

`:CommandT web/js`
`:CommandT web/css`
`:CommandT src`

といったように、コマンド履歴をたどる要領で、ディレクトリを絞り込んでから検索を始めることができ便利です。

書いていて思った以上に細かいネタになり動揺していますが、こちらからは以上です。
MeteorでGitHubログイン時にEmail情報を取得する方法(bruz:github-api)


[MeteorでGitHubアカウントと連携する方法(github-accounts)](http://qiita.com/n-oshiro/items/d89447af48a189d0105b) の手順で連携した GitHub アカウント情報には Email 情報が含まれていませんでした。
いろいろ調査した結果、GitHub アカウントから Email 情報を取得する方法がわかりましたので、その方法を以下で解説します。

なお、Meteor と GitHub との連携方法については、[前の記事](http://qiita.com/n-oshiro/items/d89447af48a189d0105b)をご参照ください。

[今回の記事のサンプルコード](https://github.com/nobutakaoshiro/meteor-accounts-github-example/tree/get-github-email)

# GitHubアカウントから Email 情報を取得する方法

## 1. bruz:github-api パッケージを追加する

```bash:bash$
meteor add bruz:github-api
```

## 2. client/lib ディレクトリと server/lib ディレクトリを作成

```bash:bash$
mkdir -p client/lib server/lib
```

## 3. GitHub ログイン時に Email を取得するコードを追加

```javascript:client/lib/accounts.js
Accounts.ui.config({
    requestPermissions: {
        github: ['user:email']
    }
});
```

```javascript:server/lib/accounts.server.js
Accounts.onLogin(function(info) {
  var user = info.user;
  if(user) {

  var github = new GitHub({
        version: "3.0.0", // required
        timeout: 5000     // optional
    });

    github.authenticate({
      type: "oauth",
      token: user.services.github.accessToken
    });

    try {
      var result = github.user.getEmails({user: user.services.github.username});
      var email = _(result).findWhere({primary: true});

      Meteor.users.update({
        _id: user._id
      },
      {
        $set: {
          'profile.email': email.email,
          'services.github.email': email.email
        }
      })
    }
    catch(e) {
      console.log(e.message);
    }
  }
});
```

## 4. Email を表示するためのコードをテンプレートに追加

テンプレートファイルの好きな場所に以下のコードを追加します。

```html:app.html
{{#if currentUser}}
  <h2>Email: {{currentUser.profile.email}}</h2>
{{/if}}
```

## 5. Meteor アプリにアクセスし、GitHub アカウントでログインする

```bash:bash$
meteor
```

で Meteor アプリケーションを起動したら、ブラウザで http://localhost:3000/ にアクセスします。
その後 GitHub アカウントでログインをすると、Email 情報が取得できます。
すでにログインをしている場合は、一度ログアウトし、再度ログインを試してみてください。

# 参考

* [nullreferenceexception - the accounts-github package is causing my meteor user to have a null email - Stack Overflow](http://stackoverflow.com/questions/24689889/the-accounts-github-package-is-causing-my-meteor-user-to-have-a-null-email)
カッコの補完を手軽にカッコ良く

Vimの閉じ括弧補完の王道と言えば次のような感じでしょうか?

```
inoremap { {}<LEFT>
inoremap ( ()<LEFT>
```
ワタクシも、しばらくこれで満足しておりました。

でもですよ。
以下の様なコードを書くとき、少しだけ煩わしい。

```
if (bool){
	// any code
}
```

`if (bool)`までは良いです。
その次の`{`を入力したら`}`が補完されて、`[Enter]`キー押して、`[Tab]`キー押して…

きぃぃ！これも補完したい！！

ということで、以下を`.vimrc`に追記しましょう。

```
inoremap { {}<Left>
inoremap {<Enter> {}<Left><CR><ESC><S-o>
inoremap ( ()<ESC>i
inoremap (<Enter> ()<Left><CR><ESC><S-o>
```
ちなみに3行目の`()<ESC>i`は、ワタクシがいつも叩いているキー。Vimmerっぽくない？？

せっかくなので、みんなやってるGIFアニメを貼り付けてみましょう。
![parenthesis.gif](https://qiita-image-store.s3.amazonaws.com/0/45349/7781bfb7-84ee-d5f6-9fed-f44a3ef4ce8f.gif "parenthesis.gif")

これでも、煩わしさを感じる時があるんですよね。
日本語入力している時とか、ペアコーディングで、ワタクシのVimに慣れていない人が`()`と打ってしまった時とか。

それは、また次回のネタに。
CustomViewを作成してaddSubviewする方法

# 手順

1. CustomView.xibを作成
 + New File > User Interface > View 
+ CustomView.swiftを作成
 + New File > Source > Cocoa Touch Class
 + Class: CustomView
 + Subclass of: UIView
 + Language: Swift
+ CustomView.xibの `File's Owner`の`identity inspector`を開き Custom Class > Classを「CustomView」にする
+ ViewControllerに`contentView`という名前のUIViewを追加し、`contentView`にCustomViewを`addSubview`を使って追加する


## CustomView.swift

https://gist.github.com/bwhiteley/049e4bede49e71a6d2e2

```swift
CustomView.swift:

class CustomView : UIView {
  @IBOutlet weak private var contentView:UIView!
  // other outlets
    
  override init(frame: CGRect) { // for using CustomView in code
    super.init(frame: frame)
    self.commonInit()
  }
    
  required init(coder aDecoder: NSCoder) { // for using CustomView in IB
    super.init(coder: aDecoder)
    self.commonInit()
  }
    
  private func commonInit() {
    NSBundle.mainBundle().loadNibNamed("CustomView", owner: self, options: nil)
    contentView.frame = self.bounds
    contentView.autoresizingMask = .FlexibleHeight | .FlexibleWidth
    self.addSubview(contentView)
  }
}
```

## ViewController.swift

```swift
class ViewController: UIViewController {
  override func viewDidLoad() {
    super.viewDidLoad()

    self.view.layoutIfNeeded() // contentViewの正しいboundsを取得するために必要
    var bounds = CGRect(x: 0, y: 0, width: contentView.bounds.width - 10, height: contentView.bounds.height)
    var view = CustomView(frame: bounds)
    self.contentView.addSubview(view)
  }
}
```
古いディレクトリを漁ったら、アイデアスケッチみたいなファイルが居たので供養しておく

多分JSでエラーが発生した時に、サーバーへ通知してJSのエラーログを保存したかったんだと思う。

```html
<script type="text/javascript" src="ErrorHandler.js"></script>
<script>
    new __ErrorHandler().listen('gif.gif', 'img');
    null.createElement('hoge');
</script>
```

```js
function __ErrorHandler () {
    self = this;
    this.listen = function(sendTo, sendType) {
        window.onerror = function(message, url, line) {
            // 再起防止
            window.onerror = null;
            if (console.log) {
                console.log(message);
                console.log(url);
                console.log(line);
            }
            if (sendTo) {
                if (!sendType) sendType = 'img';
                if (sendType == 'img') self.sendAsImage({
                    'sendTo' : sendTo,
                    'message' : message,
                    'url' : url,
                    'line' : line
                });
            }
        }
    }
    this.sendAsImage = function (obj) {
        var img = document.createElement('img');
        img.src = self.buildSendTo(obj);
        img.onabort = function () {document.getElementsByTagName('body')[0].removeChild(img);}
        img.onload  = function () {img.onabort();}
        document.getElementsByTagName('body')[0].appendChild(img);
    }
    this.buildSendTo = function (obj) {
        var sendTo = '';
        sendTo = obj.sendTo;
        if (!sendTo.match(/\?/)) sendTo += '?';
        else                     sendTo += '&' ;
        sendTo += 'url='     + encodeURIComponent(obj.url) + '&';
        sendTo += 'line='    + encodeURIComponent(obj.line) + '&';
        sendTo += 'message=' + encodeURIComponent(obj.message);
        return sendTo;
    }
    return this;
}
```
1行でLAMP環境の構築ができるyumコマンドのメモ

コマンド実行前にyum updateするのを忘れずに。

(∩^o^)⊃━☆゜.*
```
 yum install httpd httpd-devel mysql mysql-server mysql-devel php php-mysql php-common php-gd php-mbstring php-mcrypt php-devel php-xml
```

参考元 : http://www.rackspace.com/knowledge_center/article/how-to-install-a-lamp-stack-on-centos-fedora-or-red-hat
AWS Device Farm 最新デバイスプロファイル一覧


# はじめに
AWS Device Farm で利用可能な"デバイス"の一覧は、以下で既に記事にされており、この記事は**二番煎じ**であります。
http://qiita.com/tt2004d/items/325e8a93f01a2f83a174

Device Farm におけるデバイスとは "デバイスプロファイル"であり、製造メーカー／型＆モデル／OS バージョン／キャリアの組み合わせで一意になるように取り扱っています。そのため、メーカーやキャリアなどの組み合わせの情報も重要になります。

また、Device Farm ではデフォルトのままだと利用可能なデバイスが試用デバイスの数個のみに制限されており、APIから返却される一覧も数が少なくなります。~~**すべてのデバイスを利用するには、マネージメントコンソールから解除申請が必要です。**~~
現在は解除なしですべてのデバイスを選択できます。

## ですので、解除申請済みのAPIの返却値を「**そのまま**」載せました。

~~↓2015/8/18 時点の全デバイスプロファイル一覧~~
~~https://gist.github.com/shimy/760f99452cefbefbdd6d~~
~~↓最新版（2015/8/27時点）~~
~~https://gist.github.com/shimy/5b826d5684a35d943c75~~
↓最新版（2015/12/17時点）
https://gist.github.com/shimy/b3c47370fd1d3623ad9a

```shell-session
$ aws devicefarm list-devices --region us-west-2

{
    "devices": [
        {
            "formFactor": "TABLET", 
            "name": "Apple iPad Mini 2", 
            "resolution": {
                "width": 1536, 
                "height": 2048
            }, 
            "image": "NA", 
            "platform": "IOS", 
            "heapSize": 0, 
            "memory": 17179869184, 
            "model": "iPad Mini 2", 
            "os": "7.1.2", 
            "cpu": {
                "frequency": "MHz", 
                "architecture": "ARMv8 (A32, A64)", 
                "clock": 1400.0
            }, 
            "arn": "arn:aws:devicefarm:us-west-2::device:3B33A0062E6D47B4A50437C48F9141F6", 
            "manufacturer": "Apple"
        }, 
        {
            "formFactor": "TABLET", 
            "name": "Apple iPod Touch 5th Gen", 
            "resolution": {
                "width": 640, 
                "height": 1136
            }, 
            "image": "NA", 
            "platform": "IOS", 
            "heapSize": 0, 
            "memory": 68719476736, 
            "model": "iPod Touch 5th Gen", 
            "os": "8.1.2", 
            "cpu": {
                "frequency": "MHz", 
                "architecture": "ARMv7", 
                "clock": 1200.0
            }, 
            "arn": "arn:aws:devicefarm:us-west-2::device:8BF08BA1178D4DF7B46AB882A62FFD68", 
            "manufacturer": "Apple"
        }, 
・・・
```

# 免責
個人の意見です。
【Android】TabLayoutでViewPager渡したのにタブが表示されない

Design Support Libraryを導入してめっちゃ簡単に色々作れるやんけ！と思って
TabLayoutとViewPagerの連携を実装したのに

```lang:NG
        ViewPagerAdapter adapter = new ViewPagerAdapter(getFragmentManager());
        mViewPager.setAdapter(adapter);
        mTabLayout.setTabsFromPagerAdapter(adapter);
        mTabLayout.setupWithViewPager(mViewPager);

```

こうすると何故かTabが反映されない（ViewPagerは元気に動いてる）
なんでや！ってなったので色々試していたところ

```lang:OK
        ViewPagerAdapter adapter = new ViewPagerAdapter(getFragmentManager());
        mViewPager.setAdapter(adapter);
        mTabLayout.post(new Runnable() {
            @Override
            public void run() {
                mTabLayout.setupWithViewPager(mViewPager);
            }
        });
```

こうすると無事反映された！
詳細は引き続き調査する予定。でもとりあえず動いてよかった。
MacでRundeckのセットアップ


# インストール＆初期起動

公式サイトのDownloadページからrundeck-launcher-xxx.jarをダウンロードして、適当なフォルダで以下のコマンドを実行

```
$ java -jar rundeck-launcher-2.5.3.jar

WARNING: HTTPS is not enabled, specify -Drundeck.ssl.config=/Users/yusuzuki/rundeck/server/config/ssl.properties to enable.
2015-08-17 14:45:54.580:INFO:oejs.Server:jetty-7.6.0.v20120127
・
・
・
2015-08-17 14:46:17.423:INFO:/:Initializing Spring FrameworkServlet 'grails'
2015-08-17 14:46:17.482:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:4440

```

初期起動するとjarを実行したディレクトリにディレクトリやコンフィグファイルが生成される。

またブラウザで以下のURLから管理画面が表示される
http://localhost:4440/

* ID: admin
* PASS: admin

![Rundeck.png](https://qiita-image-store.s3.amazonaws.com/0/70370/d6c39fd5-8a36-a9ba-aae7-ccc8eeef3fe0.png "Rundeck.png")

# 初期設定を行う

## 管理DBをMySQLに変更する

### Rundeck用のDBを作成する
configでDB名を指定するためなんでもよい

```bash:
[root@yusuzuki]
mysql -u root -p
mysql> create database rundeck;
mysql> use rundeck;
mysql> grant ALL on rundeck.* to 'rundeck'@'localhost' identified by '******';
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| fetchdb            |
| mysql              |
| rundeck            |
+--------------------+
mysql> exit;
```

### Rundeckデータベースの設定
MySQL接続情報に書き換える

```cofig:server/config/rundeck-config.properties
dataSource.dbCreate = update
dataSource.url = jdbc:mysql://localhost/rundeck?autoReconnect=true
dataSource.username = rundeck
dataSource.password = *******
```


## SMTPの設定を行う

```cofig:server/config/rundeck-config.properties
grails.mail.host=localhost
grails.mail.port=25
```

設定オプションは下記のドキュメント参照
http://rundeck.org/docs/administration/email-settings.html


## Nodeの追加

```

```
Railsのbefore_saveでハマった話


modelのbefore_actionでbool型の値を代入して更新するというコード。

```mode.rb
before_save do
	self.closed = false
end
```

ですが、いくら更新しても更新に失敗してしまう。
rails consoleで実行してみると以下の様な感じ。

```bash
irb(main):004:0> e = Event.first
irb(main):009:0> e.closed = true
=> true
irb(main):010:0> e.save
   (0.5ms)  BEGIN
   (0.2ms)  ROLLBACK
=> false
```

エラーも吐かれないし何が原因なんだろうと数時間悩んでしまったのですが。。
問題は先程のbefore_saveでした。


```event.rb
before_save do
	self.closed = false
end
```

self.closedにfalseを代入した際の値がfalseになっており、before_saveメソッドがそのままfalseを返して、以降の更新処理がRollbackされていたのでした。
falseを返さなければ良いのでselfを返すようにしたところ問題なく更新できるようになりました。


```event.rb
before_save do
	self.closed = false
	self
end
```

原因がわかってしまえば単純なんですが今回は長い時間ハマってしまいました。悔しい。
Ruby: コンソールから1行入力する

Rubyでコンソールから入力を受け取る方法です。

```rb
print "Please input your name: "
STDOUT.flush

# chompは文字列末尾の\nを取り除く
name = gets.to_s.chomp

# 入力した値を使用してメッセージを出力
puts "Hello #{name}!"


# 数値をコンソールから入力する
print "Please input your age: "
STDOUT.flush
age = gets.to_i
puts "You are #{age} years old."
# Note: 数値以外の入力があると、ArgumentErrorが発生します。
```


```lang:出力例
Please input your name: hoge
Hello hoge!
Please input your age: 128
You are 128 years old.
```

この記事は@suin氏によるCrystal言語の記事のパクりです。[Crystal: コンソールから1行入力する](http://qiita.com/suin/items/f1d6ba9206bd74bf4ef0)

rubyとcrystalは、ほんとソックリですね!
Crystal: コンソールから1行入力する

Crystal言語でコンソールから入力を受け取る方法です。

```rb
print "Please input your name: "
STDOUT.flush

# chompは文字列末尾の\nを取り除く
name = gets.to_s.chomp

# 入力した値を使用してメッセージを出力
puts "Hello #{name}!"


# 数値をコンソールから入力する
print "Please input your age: "
STDOUT.flush
age = gets.to_i
puts "You are #{age} years old."
# Note: 数値以外の入力があると、ArgumentErrorが発生します。
```

```text:出力例
Please input your name: suin
Hello suin!
Please input your age: 28
You are 28 years old.
```
NSUserDefaultsに多様なオブジェクトを格納する

##NSUserDefaultsに格納できるオブジェクトタイプは限定的
自分自身知らなかったのですが、```NSUserDefaults```には ```setObject:forKey:``` なんてメソッドがあります。```setObject:```なんて言ってるのでテッキリ、どんなオブジェクトでも指定できるのかなと思ったのですが、案外そうでもなく、結局は plist に格納できるオブジェクトタイプに限定されている模様。
で、ドキュメントを見ても実際そのように書いてあるのですね...。
> The value parameter can be only property list objects: NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary.

そしてまた、```NSArray```や```NSDictionary```のようなコレクションクラスの場合、そのコレクション内に入れるものも上記のオブジェクトタイプに限られます。

##オブジェクトを何とかシリアライズして保存する
例えば```UIColor```を保存したい場合はどうしましょうか。
考えてみれば、```UIColor```を何らかの方法でシリアライズすれば良いのだと思います。```UIColor```の場合は簡単で、色を扱うクラスですので R, G, B, Aの 4 要素を使ってシリアライズしても良いかと。
下記の例ですと、red, green, blue, alphaの要素を```NSDictionary```形態に変換しています。

```objc
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
UIColor *color = [UIColor redColor];

//格納
CGFloat r, g, b, a;
[color getRed:&r green:&g blue:&b alpha:&a];  //RGBA要素を取り出す
[userDefaults setObject:@{@"red":@(r), @"green":@(g), @"blue":@(b), @"alpha":@(a)} forKey:@"color"];

//取出し
NSDictionary *dic = [userDefaults objectForKey:@"color"];
r = ((NSNumber *)dic[@"red"]).doubleValue;
g = ((NSNumber *)dic[@"green"]).doubleValue;
b = ((NSNumber *)dic[@"blue"]).doubleValue;
a = ((NSNumber *)dic[@"alpha"]).doubleValue;
UIColor *color_new = [UIColor colorWithRed:r green:g blue:b alpha:a];
```

##```NSKeyedArchiver```を使う
なにやら色々書きましたが...。```NSCoding``` に準拠したクラスであれば、```NSKeyedArchiver```を使ってしまうのも手です。

```objc
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
UIColor *color = [UIColor redColor];

//格納
[userDefaults setObject:[NSKeyedArchiver archivedDataWithRootObject:color] forKey:@"color"];

//取出し
UIColor *color_new = [NSKeyedUnarchiver unarchiveObjectWithData:[userDefaults objectForKey:@"color"]];
```

ちなみに些細なことですが、 plist に```NSData```を格納するとバイナリに base64 的なエンコードが掛かって文字列で格納されるようなので、少しファイルサイズが大きくなります。(plistがテキスト形態の場合)
保持するデータが単純なクラスの場合、できるだけ```NSDictionary```形態の方が良いかも知れません。が、面倒さを考えたらやっぱり```NSData```ですかね...、些細な問題ですし。
Android Studioでunit test用のフォルダがソース用として認識されないときの対処

http://tools.android.com/tech-docs/unit-testing-support

上記を見れば一発なのですが、src/test/javaとフォルダを作るとうまくいくようです。

androidTestだとかinstrumentationTestみたいなフォルダを作ってその下にjavaフォルダを置いても、ソース用のフォルダとして認識されないのでその下にテストようのパッケージを作ることが出来ませんでした。

参考まで
DataTemplateを使う時に覚えておきたい。親ViewのViewModelをRelativeSourceで直接バインディング

##はじめに
WPFの画面遷移の基本は、ContentControlとDataTemplateの組み合わせによるViewの切り替えです。
非常に強力な機構なのですが、データ型(ViewModelクラスの種別)によって、Viewが切り替わるというルールなので、DataTemplateが参照している(DataContextに格納されている)ViewModelは、データクラスとなります。
ContentControlの想定している利用ケースが、データを全て持ったViewModelであり多くの場合は、この方が都合が良いのですが、画面の一部分を切り替えるような画面遷移にContentControlを利用した場合に、不都合が生じる場合があります。
![DataTemplateバインディング.jpg](https://qiita-image-store.s3.amazonaws.com/0/7839/47f97c5c-5ab2-fd16-504b-8e855acb3229.jpeg)
不都合といっても単純に、親のViewが持っているViewModelをDataTemplateの参照しているViewModelへコピーする手間がかかるという程度の話なのですが、表示するだけではなく値を永続化する場合には、厄介なことになります。

##親ViewのViewModelをバインディングする
WPFのバインディング機構を熟知されている方なら当然のテクニックなのですが、RelativeSourceで親Viewに対してバインディングを行う事ができます。
独特な書き方なので、暗記するかメモして利用するといいでしょう。

```xaml:Test.xaml
<Slider Width="100"
        Height="16"
        Maximum="2"
        Minimum="0.1"
        Value="{Binding DataContext.ZoomValue,
                RelativeSource={RelativeSource FindAncestor,
                AncestorType={x:Type view:ParentView}}, Mode=TwoWay}" />
```
バインディングの書式は、色々とあるのですが、ContentControlが複数階層になっていても大丈夫な親Viewを直接検索する方法が、最も単純で簡単な方法です。
M Preview端末上でChromeの同期が取れないときの対処方法

せこせことAndroid M PreviewをNexusに焼いて使っていたのだけれど、何でかChromeのブックマーク同期が出来なかったので、メモ。

## 対処法
Permissionが諸々falseのままになっているのでtrueを設定してあげる。

[アプリ] -> [Chrome] -> [許可]

Runtime Permissionがうまいこと有効になっていなかっただけだったわけですけど、Google謹製アプリでもまだ対応されているわけではないのですね。。
Visual Studio 2015 RTM の Intellisense が英語になる問題


Visual Studio 2015 RTM版をインストールしたら、RCでは日本語だった Intellisense のツールチップがなぜか英語になった。

#（半分だけ）解決する方法
1. オプション→[テキスト エディター]→[C#]→[Intellisense]→[入力候補一覧]のチェックを全部外して、オプションを閉じる
![image](https://qiita-image-store.s3.amazonaws.com/0/89950/500e6040-88a2-59b3-64ae-8c2b0f8780ec.png)
2. もう一度オプションを開き、外したチェックを元に戻す

これで、**.NET 4.6 では**日本語のツールチップが出るようになる。

#.NET 4.6 以外
.NET 4.5 向けプロジェクトでは相変わらず英語のまま。
どうやら現時点では、プロジェクトのターゲットフレームワークを .NET 4.6 にしないと日本語は出ないらしい……
そういえば VS2013 のときも似たような不具合があって、Update で修正されたことがあったので、VS2015 でも Update 待ちということになるのだろうか……？
Xfceのデスクトップになにも表示されなくなってしまったとき

Xubuntu 14.04 を再起動したら、デスクトップにアイコンが表示されず、右クリックもできず、壁紙も設定したものではなくデフォルトのものから変更できなくなっていました（設定しても反映されない）。

最初は、設定 > デスクトップ > メニュー でデスクトップにアイコンを表示しない設定にしてしまったのかと思いましたが、そういうわけでもないようです。再起動しても直らず、おそらくデスクトップの機能を提供するサービスが立ち上がってなさそうです。

解決策としては、 terminal で

```
$ xfdesktop
```

でデスクトップが復活します。
[Eclipseメモ] エディタ設定

##タブ・改行・スペースの表示・非表示

設定 > 一般 > JStyle

##カラーテーマ

設定 > 外観 > 色テーマ

##エディタのフォント設定

設定 > 外観 > 色とフォント
 -> 構造化テキストエディター ->構造化テキスト・エディターのテキスト・フォント(デフォルト)
　and その他フォントとあるトコロ。

##カラーコード詳細設定

設定 > Java > エディター > 構文の色の指定
(cssはwebにあったり。)

##保管時にオート・ソースフォーマット

設定 > Java > 保管アクション -> 保管時に選択したアクションを実行 -> 編集した行をフォーマット

##設定のエクスポート/インポート

メニューバー > ファイル > インポート または　エクスポート

##インストールしてるソフトウェアとプラグインの確認とアンインストール

ヘルプ > Eclipseについて > インストール詳細

##ソフトウェア・プラグインのインストール

ヘルプ > Eclipseマーケットプレース or 新規ソフトウェアのインストール





あとなにがあったかな。。
Rails4.2.3 / rspec3.3.0 / spork1.0.0rc4 で Exception encountered: #<NameError: uninitialized constant RSpec::Core::CommandLine> と出る問題

https://github.com/manafire/spork/blob/38c79dcedb246daacbadb9f18d09f50cc837de51/lib/spork/test_framework/rspec.rb
このようにgemを書き換えるというワークアラウンド
うーん…

##参考
[コミット](https://github.com/manafire/spork/commit/38c79dcedb246daacbadb9f18d09f50cc837de51)
[参考ブログ](http://toifan.daiwa-hotcom.com/wordpress/?p=271)
SQLAlchemyでテーブルを作るときにハマったメモ


SQLAlchemyでテーブルをつくろうと思ったが、予想以上にハマったのでメモ。

## テーブル定義

テーブルは、Baseを継承したクラスで定義する。(複数の方法があるようだがコレに統一)


```python
from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()


class User(Base):
	__tablename__ = 'users'

	id = Column(Integer, primary_key=True)
	name = Column(String)
	fullname = Column(String(255))
	password = Column(String(255))
```

declarative_baseを実行してBaseクラスを作成する。クラス定義はコレを継承。

`__tablename__`でテーブル名を決めることが可能。
「クラス名は単数、テーブル名は複数」というRailsっぽい事も可能になる。


## テーブルの作成(基本)

テーブルの作成は、`metadata.create_all`で一括して行うのが基本

```python
engine = create_engine("mysql+pymysql://<user>:<pass>@<host>/<dbname>?charset=utf8")
Base.metadata.create_all(bind=engine)
```

上記で作成したBaseクラスの`metadata.create_all`に、データベースエンジンを渡す。
これによりBaseを継承しているテーブル群が、一括してCREATE TABLEされる。

エンジンの作成は、[公式ドキュメント](http://docs.sqlalchemy.org/en/rel_1_0/core/engines.html)が詳しい。別途、PyMySQLのようにデータベースクライアントが必要。


## テーブル再作成
create_allは一度実行すると二回目以降は実行されない。このため、別途SQLなどでテーブルを削除した後、再度実行してもテーブルが作られない。

この場合は、引数で、`checkfirst=False`とする。

```python
Base.metadata.create_all(bind=engine, checkfirst=False)
```


## テーブルを指定して作成したい

create_allは一括でテーブルをつくってくれるが、テーブルを指定して作成した場合もある。
この場合は、tables引数にテーブル情報を渡すことで可能になる。
テーブル情報は、テーブル定義クラスの`__table__`プロパティに入っている。

```python
Base.metadata.create_all(bind=engine, tables=[User.__table__])
```

気をつけたいポイントとしては、tablesには配列で渡すコトと、`__table__`プロパティを渡すこと。
create_allにテーブルを指定するのは、名前的にシックリこない……　が仕方がない。


## primary_keyを連番にしたくない
他所のデータベースからデータを手元に持ってきて、ゴニョゴニョしたいときなどは、primary_keyを連番にしたくない。

primary_keyを連番にはしたくない場合は、`autoincrement`を`False`で指定する。

```python
class User(Base):
	__tablename__ = 'users'

	id = Column(Integer, primary_key=True, autoincrement=False)
	name = Column(String)
	fullname = Column(String(255))
	password = Column(String(255))
```
OpenSSL周りのアップデートでわかったことと、便利だったこと

メモ。

# 勘違いしてたこと
* yum updateをするとメジャーバージョンも上がる

そんなことなかった。
上がるのはマイナーバージョンのみ。
上げるときはアップグレードする必要があるっぽいよ。

---

# 使ってて便利だったコマンド

```lang:OSのバージョン確認(よく忘れる)
cat /etc/redhat-release
```
　

```lang:アップデートする
yum update openssl
```

`yum update openssl openssl-devel` と指定しなくても最新化できるっぽい。
というか、できた。
(最新化後にこのコマンド打っても「もう最新や～」ってお断りされた)


```lang:opensslのバージョン確認
rpm -qa | grep openssl
```
バージョンアップ前後で結果を取得しておかなきゃ…！
　

```lang:opensslのバージョン情報確認
rpm -q --changelog openssl
```
このコマンドでどの脆弱性に対応したかわかる。
パイプつけて`rpm -q --changelog openssl | less -R` にするのおススメ。
見やすい。
【Choregraphe】Gitで管理しているプロジェクトを開く際の注意点メモ

#<i class="fa fa-book" style="font-size:1em;"></i> 問題
複数人でプロジェクトのバージョン管理をGitで行うケースが必ずあると思います。その際の注意点として。

Choregrapheのプロジェクトファイルと同階層に.gitフォルダーを配置すると、Choregrapheが.gitをロードしようとしてバグる。動作検証できなくなる。保存できない。等の事象が発生する。

#<i class="fa fa-book" style="font-size:1em;"></i> 解決
単純です。ディレクトリ構造をわけて、上の階層で`git init`すればいい。


![スクリーンショット 2015-08-18 15.18.34.png](https://qiita-image-store.s3.amazonaws.com/0/67591/24be1f4d-8402-792d-8ab9-5b70b6154507.png)



このパターンで何なく動きました。
fluent-agent-liteをRHEL/CentOSインストール時に詰まるとこ2箇所

# これは何？

tagomorisさんのfluent-agent-liteをRHEL/CentOSにインストールする際には、

　https://github.com/tagomoris/fluent-agent-lite

README.mdにあるINSTALL -> RHEL/CentOSに従ってrpmをビルドすることになります。

が、僕のやり方がまずかったのか、ビルド手順の下記で2回ほどつまづきました。

> 5. run 'rpmbuild -ba SPECS/fluent-agent-lite.spec'


修正箇所はPull requestしたので取り込まれる間までのメモ
(内容間違ってたら取り込まれないかもしれないけど)




READMEより引用したrpmのビルド手順はこちら。
via. https://github.com/tagomoris/fluent-agent-lite
> RHEL/CentOS
> 
> To build your rpm package, do 5 steps below.
> 
> 1. Download (newest version) tarball, and place it on SOURCES/ .
> 2. Download package/fluent-agent-lite.conf, and place it on SOURCES/ .
> 3. Fix SOURCES/package/fluent-agent-lite.conf as you want (ex: server name or servers list), and add servers list for your own.
> 4. Download SPECS/fluent-agent-lite.spec, and place it on SPECS/ .
> 5. run 'rpmbuild -ba SPECS/fluent-agent-lite.spec'
>
> To install each RHEL/CentOS host, use yum server, or copy and rpm -i on each host.
> 
> NOTE: yum install perl-devel and QA_RPATHS=$[0x001] rpmbuild -ba may help you if rpmbuild fails on your build environment.


# fluent-agent-liteをRHEL/CentOSインストール時に詰まるとこ2箇所

## [PRがmergeされたので再発しません] 1. cpamnを取ってくるところ

### エラー内容

```
# rpmbuild -ba SPECS/fluent-agent-lite.spec
(snip)
Can't locate object method "Internal" via package "Server" (perhaps you forgot to load "Server"?) at /root/rpmbuild/BUILDROOT/fluent-agent-lite-1.0-original.x86_64/usr/local/fluent-agent-lite/bin/cpanm line 1.
error: Bad exit status from /var/tmp/rpm-tmp.BbU1TC (%install)
```


### 原因

cpanmの中身が

```bash:/root/rpmbuild/BUILDROOT/fluent-agent-lite-1.0-original.x86_64/usr/local/fluent-agent-lite/bin/cpanm
Internal Server Error
```
となっている。

cpanmは下記install.shで、配布元からcurlで取得している。

```bash:/root/rpmbuild/BUILDROOT/fluent-agent-lite-1.0-original.x86_64/usr/local/fluent-agent-lite/bin/install.sh

curl -s -L http://xrl.us/cpanm > $INSTALLDIR/bin/cpanm
```

http://xrl.us/cpanm 
にアクセスすると500 Internal Server Errorが返ってきていた。
(2015/08/18時点に確認、19日には復旧していた)




そして、配布元を確認すると、
via. https://github.com/miyagawa/cpanminus の"Downloading the standalone executable"

> https://cpanmin.us/ 

から取得するのがいいみたい。
(8/18時点でもこちらからはcpanmが取得出来ていました)

README.mdのHistoryを確認すると、下記で書き換わっていた。
https://github.com/miyagawa/cpanminus/commit/fa971c02a9d3f857c5c0576aa43365f66d495f18#diff-04c6e90faac2675aa89e2176d2eec7d8


### 対応

Pull requestが受け入れられるまでの暫定対応

install.sh内のcpanmのURLを置き換える

```bash:bin/install.sh
-curl -s -L http://xrl.us/cpanm > $INSTALLDIR/bin/cpanm
+curl -s -L http://cpanmin.us > $INSTALLDIR/bin/cpanm

via. https://github.com/tagomoris/fluent-agent-lite/pull/26/files
```

8/19時点でhttp://xrl.us/cpanmも復旧しているので、
受け入れられなかった場合は都度対応でもいいかもね。

## 2. %install 後の check-buildroot でコケる

メモを無くしてしまったので詳細書けず。。

https://gist.github.com/sonots/9225542
こちらを参考に

```
export QA_SKIP_BUILD_ROOT=1
```

してからrpmbuildすることで解決出来ました。
特定のproductFlavor/buildTypeでだけ使用するライブラリプロジェクトを作る


# 1 前提
AndroidStudio 1.3
productFlavor、buildTypeの設定は完了していて、以下のflavorがあるものとする
develop
staging
producFlavorの設定の仕方は以下を参照。
AndroidStudio1.3でproductFlavor (外部参照jarまで差し替えるよ)
http://qiita.com/le_skamba/items/af290f53f6d5ac0a2603

# 2 最終目標
あるproductFlavor/buildTypeでだけ、使用するライブラリプロジェクトを作成し、参照する

# 3 手順

## (1) ライブラリプロジェクトを作成

「File」-「New」-「New Module」で必要なライブラリプロジェクトタイプを選び、必要な情報を記入後、Finishをクリック。
当然importでも問題ない。

## (2) build.gradle(app)のdependenciesに記述を追加。

staging flavorにおいて、作成したnewLibraryを参照する場合。

```build.gradle(app)
dependencies {
	(省略)

	stagingCompile project(':newLibrary')
}
```


ProductFlavorsを使いこなすと、ガワが違うだけだったり、広告SDKだけ変えて・・・なんていう横展開アプリも楽に作れるようになりますね。
Mac OSX用にパッケージ化したアプリはCMD+C,CMD+Vによるコピー＆ペーストができない。


▼コマンドで起動するときはコピペできるけれど、パッケージ化をするとできなくなる。
> electron . 

Windowsだと発生していないよう。Macの場合は自分で実装する必要がありそう。

## 参考
CMD + C / CMD + V (clipboard) not working #1902
https://github.com/atom/electron/issues/1902

## 実装するには

### メニューの実装の仕方
bengotow/electron-sample-apps/menus - GitHub
https://github.com/bengotow/electron-sample-apps/tree/master/menus

### クリップボードの実装の仕方
electron/docs/api/clipboard.md - Github
https://github.com/atom/electron/blob/master/docs/api/clipboard.md
CentOS + nginx + PHP (on Vagrant) 環境構築

CentOS6.4 + nginx1.8.0 + PHP5.3.3の環境をVagrantを使って作る

## phpとphp-fpmとnginxをインストール

```
yum instal -y php
yum install -y php-fpm
yum install -y nginx
```

## php-fpmの設定&起動

php-fpmの設定ファイルを変更
9000番ポート経由というのはなんとなく嫌だったので、unixソケットに切り替え

```/etc/php-fpm.d/www.conf
- user = apache
- group = apache
+ user = nginx
+ group = nginx

- listen = 127.0.0.1:9000
+ listen = /var/run/php5-fpm.sock
```

起動

```
/etc/init.d/php-fpm restart
```

## nginxの設定&起動

設定ファイルを変更

```
include /etc/nginx/conf.d/*.conf;
```

デフォルトでconf.d/以下の*.confファイルをすべて読むようになっているのでnginx.confはさわらず、default.confを修正

```/etc/nginx/conf.d/default.conf
  location / {
-     root   /usr/share/nginx/html;
-     index  index.html index.htm;
+     root   /var/www/htdocs;
+     index  index.php;
  }

- #location ~ \.php$ {
- #    root           html;
- #    fastcgi_pass   127.0.0.1:9000;
- #    fastcgi_index  index.php;
- #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
- #    include        fastcgi_params;
- #}

+ location ~ \.php$ {
+     root           /var/www/htdocs;
+     fastcgi_pass   /var/run/php5-fpm.sock;
+     fastcgi_index  index.php;
+     fastcgi_param  $document_root /$fastcgi_script_name;
+     include        fastcgi_params;
+ }
```

nginx起動
```
nginx
```

## アクセスするPHPファイルを作成

適当に

```/var/www/htdocs/index.php
echo "hogehoge";
```

## テスト
ブラウザで仮想サーバーの
http://プライベートIP/index.php
にアクセスしてhogehogeが表示されればOK

## 遭遇したエラー&解決方法

### ブラウザでアクセスしても "File Not Found"となる

ログを見る。

以下のエラーの場合

```/var/log/nginx/error.log
FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream
```

僕の場合はfastcgi_paramのパスが間違っていた。
このあたりを要確認


以下のエラーの場合

```/var/log/nginx/error.log
open() "/var/www/htdocs/index.html" failed (13: Permission denied)...（略）
```

アクセスしようとしている
/var/www/htdocs/index.html
に権限がないとのこと。

このファイル自体の権限は問題なかったが、
親ディレクトリの/var/wwwに権限が無くてPermissionDeniedとなっていた。
結構ありがちな問題。

```
chmod 755 /var/www
```
で解決

### ブラウザでアクセスすると"An error occurred."とエラーがでる

```/var/log/nginx/error.log
*1 connect() to unix:/var/run/php5-fpm.sock failed (2: No such file or directory) while connecting to upstream 
```

php-fpmが起動していないもしくは設定が反映されていないので
php-fpmを起動（再起動）で解消

```
/etc/init.d/php-fpm restart
```

### ブラウザでアクセスしても真っ白で何も表示されていない


PHPのエラーが出ていたり・・・（初期設定でエラー表示はないので画面に何も表示されない）

```/var/log/nginx/error.log
FastCGI sent in stderr: "PHP message: PHP Parse error:  syntax error...（略）
```


### 

## 参考
http://qiita.com/puttyo_bubu/items/5bf554ef2790f6435c32
http://kawatama.net/web/1352
http://qiita.com/utano320/items/36b6eac2bbd5bb5657f6
http://hotolab.net/blog/nginx_simple/
Vagrant 仮想マシンの状態をboxとして保存する

※ 仮想マシンが起動状態で

```
vagrant package
```
でカレントディレクトリにpackage.boxという名の現在のマシンイメージが保存される（僕の環境だと2.5分くらいかかった）

↑でできたファイルを

```
vagrant box add hoge package.box
```

でボックスに追加することができる
※ 追加と同時に仮想マシンはシャットダウンされる。

追加されているか確認

```
vagrant box list
```

hoge が追加されていればOK
文字コードを指定してgrepする。

今時EUCのファイルなんて殆ど使わないが、grepせざるをえなくなったのでメモ。
コンソールはUTF8なのでそのままだとgrepできない。
ただ、やることは単純でnkfで検索したい文字をeuc-jpにしてファイルをgrep。
そして結果をUTF8にしているだけ。
ただし、**LANG=ja_JP.eucjp**にしないとeuc-jpでgrepができないので注意。
ちなみにgrepのバージョンは2.6。

```bash
LANG=ja_JP.eucjp grep -rn `echo "あたたたた" | nkf -e` * | nkf -w
```

manには下記の様に書いてあって LC_ALL、LC_なんちゃら、LANGの順で優先的にロケールが使われるらしい。

    ENVIRONMENT VARIABLES
        The behavior of grep is affected by the following environment variables.

        The locale for category LC_foo is specified  by  examining  the  three  environment
        variables  LC_ALL,  LC_foo, LANG, in that order.  The first of these variables that
        is set specifies the locale.  For example, if LC_ALL is not set, but LC_MESSAGES is
        set  to  pt_BR,  then  the  Brazilian Portuguese locale is used for the LC_MESSAGES
        category.  The C locale is used if none of these environment variables are set,  if
        the  locale  catalog  is  not  installed, or if grep was not compiled with national
        language support (NLS).

nkf使わないでeuc-jpでシェルスクリプトを書いて実行する手もある。
shift_JISは**LANG=ja_JP.sjis, nkf -s**にすれば動く。多分。
How to use tunnels

[PowとtunnelsでRailsのローカル開発環境にSSL導入 - 一から勉強させてください(￣ω￣;)](http://dangerous-animal141.hatenablog.com/entry/2014/06/14/000000)を読んで、やってみたらエラーになるんです…。

```
% sudo tunnels 443 3000
/Users/maangie/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/dependency.rb:315:in `to_specs': Could not find 'tunnels' (>= 0) among 11 total gem(s) (Gem::LoadError)
Checked in 'GEM_PATH=/Users/maangie/.gem/ruby/2.2.0:/Users/maangie/.rvm/rubies/ruby-2.2.1/lib/ruby/gems/2.2.0', execute `gem env` for more information
	from /Users/maangie/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/dependency.rb:324:in `to_spec'
	from /Users/maangie/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_gem.rb:64:in `gem'
	from /Users/maangie/.rvm/gems/ruby-2.2.1/bin/tunnels:22:in `<main>'
	from /Users/maangie/.rvm/gems/ruby-2.2.1/bin/ruby_executable_hooks:15:in `eval'
	from /Users/maangie/.rvm/gems/ruby-2.2.1/bin/ruby_executable_hooks:15:in `<main>'
```

で、`rvmsudo` を使えばオッケーでした。

```
% rvmsudo tunnels 443 3000
Warning: can not check `/etc/sudoers` for `secure_path`, falling back to call via `/usr/bin/env`, this breaks rules from `/etc/sudoers`. Run:

    export rvmsudo_secure_path=1

to avoid the warning, put it in shell initialization file to make it persistent.

In case there is no `secure_path` in `/etc/sudoers`. Run:

    export rvmsudo_secure_path=0

to avoid the warning, put it in shell initialization file to make it persistent.
127.0.0.1:443 --(--)--> 127.0.0.1:3000
Ready :)
```

なんか警告でてますけど、動きました。

c.f. [Could not find Tunnels Exception · Issue #1 · jugyo/tunnels](https://github.com/jugyo/tunnels/issues/1)
ConoHaで利用しているDockerを日次再起動する

# はじめに

ConoHa VPS内で起動しているDockerコンテナに接続できなくなることがあり、日次cronでDockerを再起動することで回避したので、記載しておきます。

**2016/2/2 追記**
VPSをCentOS7で作成し、新しいバージョンのDockerを利用した際にコンテナが無反応になる現象を回避することができました。

# 再起動シェルの配置

## シェル内容

```sh:docker-restart.sh
#!/bin/bash

CHECK_PS=(`docker ps -q`)

for list in ${CHECK_PS[@]}
do
    docker stop ${list}
    if [ $? != 0 ];
    then
        exit 1;
    fi
done

/etc/rc.d/init.d/docker restart
if [ $? != 0 ];
then
    exit 1;
fi

for list in ${CHECK_PS[@]}
do
    docker start ${list}
    if [ $? != 0 ];
    then
        exit 1;
    fi
done

exit 0
```

## 動作概要

直前まで起動していたコンテナを記憶し、Docker再起動後に該当のコンテナを復活させます。

# あとがき

Dockerのコンテナが利用不能になってしまう原因が追えていない為、原因が判明したらそちらへの対処をしたいです。
Elixirで進捗どうですか書いてみた

若干、旬を過ぎた感はありますが....勉強のアウトプットがてら書いてみました。

例によって元ネタ
[「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるプログラム](http://elephnote.com/blog/archives/936)

他の方のelixir解
[Elixirで進捗どうですか？](http://qiita.com/A-gen/items/6a8974d4dc7e3f4695f7)

```ex:shinchoku.ex
defmodule Shinchoku do

  @list ["進捗", "どう", "です", "か"]
  @len length(@list)
  @success Enum.join(@list)

  defp get_random do
     Enum.at(@list, :random.uniform(@len) - 1)
  end

  defp doudesuka(s) do
    case String.ends_with?(s, @success) do
      true -> "#{s}???\n#{String.length(s)}文字で煽られました。！！！！！"
      false -> doudesuka(s <> get_random)
    end
  end

  def doudesuka do
    :random.seed :os.timestamp
    doudesuka(get_random)
  end
end

IO.puts Shinchoku.doudesuka

```

けっか

```
> mix run shinchoku.ex
かどうですどうかどうかどうですですですかですですどう進捗進捗進捗どうどうどうですかかです進捗どう進捗進捗進捗かかどう進捗かかどうどうどう進捗かどうかどうどうどうですですどうですかかかどう進捗進捗進捗ですかかどう進捗かかですです進捗ですどうですですかですどうですか進捗どうどうかか進捗か進捗どうかですです進捗ですですですです進捗ですかですですかかどうどうです進捗進捗です進捗どう進捗か進捗どう進捗どうです進捗進捗です進捗どうかですです進捗どうです進捗ですかどうどうか進捗か進捗どう進捗どうどう進捗です進捗進捗ですですかかどうですかですかですどうかかか進捗どうですですどうどう進捗ですどうです進捗進捗か進捗進捗かかかかどう進捗かどう進捗進捗ですかかかですどうどうですどうかですどうですですです進捗進捗どうですか???
353文字で煽られました。
```
sublime text2 > ファイル差分の表示 > Diffy > {差分表示:Ctrl+k / Ctrl+d} / {差分クリア:Ctrl+k / Ctrl+c}

```txt:動作確認
Windows 7 Pro 32bit
```

Sublime text2でファイル差分を見るパッケージとしてDiffyをインストールした。

使い方は
1. 比較する2つのファイルを2画面レイアウトで表示
2. ctrl+k, ctrl+d と入力

ファイル差分がある場合は、手順２にて差分が強調表示される。

差分がない場合はメッセージも何も表示されないのでDiffyが動いているかわからなかった。[差分を見る]という実行をした時に、何か("差分がない"のメッセージを表示するなど)レスポンスが欲しい。

差分の表示を解除するには
1. ctrl+k, ctrl+c と入力
負荷テストツール Siege メモ



## インストール

```
$ wget http://download.joedog.org/siege/siege-3.1.0.tar.gz

# latest の場合は下記
# wget http://download.joedog.org/siege/siege-latest.tar.gz

$ tar zxvf siege-3.1.0.tar.gz
$ cd siege-3.1.0
$ ./configure
$ make 
$ sudo make install

$ cp doc/siegerc ~/.siegerc

```

## オプションの確認

```
$ siege
SIEGE 3.1.0
Usage: siege [options]
       siege [options] URL
       siege -g URL
Options:
  -V, --version             VERSION, prints the version number.
  -h, --help                HELP, prints this section.
  -C, --config              CONFIGURATION, show the current config.
  -v, --verbose             VERBOSE, prints notification to screen.
  -q, --quiet               QUIET turns verbose off and suppresses output.
  -g, --get                 GET, pull down HTTP headers and display the
                            transaction. Great for application debugging.
  -c, --concurrent=NUM      CONCURRENT users, default is 10
  -i, --internet            INTERNET user simulation, hits URLs randomly.
  -b, --benchmark           BENCHMARK: no delays between requests.
  -t, --time=NUMm           TIMED testing where "m" is modifier S, M, or H
                            ex: --time=1H, one hour test.
  -r, --reps=NUM            REPS, number of times to run the test.
  -f, --file=FILE           FILE, select a specific URLS FILE.
  -R, --rc=FILE             RC, specify an siegerc file
  -l, --log[=FILE]          LOG to FILE. If FILE is not specified, the
                            default is used: PREFIX/var/siege.log
  -m, --mark="text"         MARK, mark the log file with a string.
  -d, --delay=NUM           Time DELAY, random delay before each requst
                            between .001 and NUM. (NOT COUNTED IN STATS)
  -H, --header="text"       Add a header to request (can be many)
  -A, --user-agent="text"   Sets User-Agent in request
  -T, --content-type="text" Sets Content-Type in request
```

## 使い方メモ


### Basic認証

~/.siegerc

```
login = ユーザー名:パスワード
```

### URLリストをファイルから読み込む

```
$ siege -c 400 -r 100 --file ファイル名

```