OmniAICreator/Qiita-1.07M huggingface dataset:
Heroku - メモ

# 経緯

- いつも焦るので、落ち着いて対応できるようにメモ。

# エラー発生時チェックリスト

まず落ち着いて

- エラー内容をよく読む
- 前回からの変更点をリストアップする
- エラー診断し、手がかりを探す
- 上記の情報を元にググる

エラー診断

- `heroku logs`
- `heroku run console --sandbox`


過去のエラー原因

- バグに気づかず（テストをサボり）
- モデル間の関連
- データベース更新忘れ
- Rubyバージョン変更後、vendor/cacheが悪さをする

# 過去に成功した対策

## `Heroku deploy fails ‘Some gems seem to be missing from your vendor/cache directory`

1. `git rm -rf vendor/cache`
2. `git add ...`
3. `git commit ...`
4. `git push heroku master`

## `failed to push some refs to 'https://git.heroku.com/my-app.git'`

1. `git rm Gemfile.lock`
2. `bundle install`
3. `git add ...`
4. `git commit ...`
5. `git push heroku master`

## スタイルシートがherokuappに反映されていない（devでは問題なし）

- [`RAILS_ENV=production bundle exec rake assets:precompile`](http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets)

## 特定のgem関連エラー

- エラー内容をコピペしてググる
- エラーに関連するgemを更新してみる

# スキーマ更新

## データ流通量が少ないアプリ

- Herokuに最新のスキーマを教える

```
git push heroku master
heroku run rake db:migrate
```

## データ流通量が多いアプリ (maintenance mode)

- maintenanceモードをonにしてから、Herokuに最新のスキーマを教える
- 作業が終わったらmaintenanceモードをoffにする

```
heroku maintenance:on

git push heroku master
heroku run rake db:migrate

heroku maintenance:off
```

## rake db:seedのサンプルデータを使用したい場合

- 危険: 今あるデータを失うことになるので、実行する前によく考えること

```
git push heroku master

heroku pg:reset DATABASE

heroku run rake db:migrate && heroku run rake db:seed
```

# herokuapp名称変更

- `heroku rename new-name`

注意点: URLが変わるので、それに影響を受けるconfig等を更新するのを忘れないこと。

# herokuappを一旦破壊し、作りなおす

1. 破壊
`heroku apps:destroy --app my-app`

2. 新規作成
`heroku create my-app`

3. プッシュ
`git push heroku -u master`

# Herokuが対応可能なRubyバージョンを確認

- https://devcenter.heroku.com/articles/ruby-support#ruby-versions


# configuration variables, secret keys, etc

config関連の秘密の変数は、ハードコードせず、ENV経由で渡すようにすること

- dev: `gem 'dotenv-rails'`等を利用すると便利
- prod: `heroku config:set KEY=value`（手作業）

Heroku config variablesについて

- https://devcenter.heroku.com/articles/config-vars

# 資料

- https://www.railstutorial.org/book
- etc
composer が古くて update に失敗

# 環境
+ PHP (5.4.17)
+ Laravel (4.1.31)

# 目的

+ Webアプリを多言語化するため、家のPCに Translation Manager を入れようとしました。

    Laravelをインストールしたディレクトリ直下の composer.json に下記を追加。

    ```php
		"require": {
		(その他のパッケージ),
		"barryvdh/laravel-translation-manager": "0.1.x"
		},
    ```

    コマンド実行。

    ```sh
    # compser update
    ```

# エラー

+ 下記エラーが発生。

    ```                                                                                                                                       
    [RuntimeException]
    Could not load package classpreloader/classpreloader in http://packagist.org: [UnexpectedValueException] Could not parse version constraint ^1.2.2: Invalid version string "^1.2.2"

    [UnexpectedValueException]                              
    Could not parse version constraint ^1.2.2: Invalid version string "^1.2.2"
    ```

# 対応

+ composer のバージョンが古くて "^1.2.2" という表記に未対応だったようです。

    下記を実行後、compser update を再実行したら正常にインストールできました。

    ```sh
    # /usr/local/bin/composer self-update
    ```

# 参考にしたページ
+ <a href="http://sukohi.blogspot.jp/2014/10/laraveltranslation-manager.html" target="_blank">Translation Manager インストール方法</a>
+ <a href="https://laracasts.com/discuss/channels/laravel/cannot-install-package-via-composer-composerjson-does-not-contain-valid-json" target="_blank">
Cannot install package via composer</a>
【コピペ用】インターバル処理 (Objective-C/Swift)


コピペ用メモ

Swift

```swift

var tm: NSTimer!

...

tm = NSTimer.scheduledTimerWithTimeInterval(
    1,
    target: self,
    selector: Selector("hoge"),
    userInfo: nil,
    repeats: true)

...

func hoge(timer: NSTimer) {
  // TODO
}
```

```swift
timer.invalidate() // 停止
```

Objective-C

```objc

NSTimer *tm;

...

tm = [NSTimer
  scheduledTimerWithTimeInterval:1.5f
  target:self
  selector:@selector(hoge:)
  userInfo:nil
  repeats:YES
];

...

-(void)hoge: (NSTimer*)timer{
    // TODO
}

...
```

```objc
[tm invalidate] // 停止
```
docker-compose.ymlのcommand:の挙動

`docker-compose.yml`の[document](https://docs.docker.com/compose/yml/)を読んでいて、`command:` の意味は

```
Override the default command.
```

とあったので`CMD`を上書きするのだと勘違いしていましたが、普通に`ENTRYPOINT`があれば`ENTRYPOINT`へのコマンドライン引数として渡るようです。
pを法とする楕円曲線の解の個数


```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Fermat Last Theorem</title>
<script>

(function(){
	//f(x)=x^3-x
	function f(x){
		return Math.pow(x,3)-x;
	};

	//P_maxまでの素数を求めてpに入れる
	const P_MAX=100;
	var p=[];
	prime();
	const P=p.length

	var N_p=[];//素数pごとの解の個数

	//p[i]はi番目の素数
	for(var i=0;i<P;i++){
		var count = 0;
		for(var j=0;j<p[i];j++){
			var yy=f(j)%p[i]//右辺 mod p

			//√yyだけでなく√(yy+kp)についても解になるか考える
			for(var k=0;Math.sqrt(yy+k*p[i])<p[i];k++){
				var y=Math.sqrt(yy+k*p[i]);
				if(y%1==0){
					count++;//yが整数なら解として数える
				};
			};
		};
		N_p[i]=count;
	};
	console.log("p  ："+p);
	console.log("N_p："+N_p);


	//素数を求める関数
	function prime(){
		p=[2,3]
		for(var i=5;i<P_MAX;i=i+2){
			var flag=0;
			for(var j=3;j<i/2;j=j+2){
				if(i%j==0){
					flag=1;
					break;
				};
			};
			if(flag==0){
				p.push(i)
			};
		};
	}

})();
</script>
</head>
<body>
</body>
</html>
```
golang で文字列をｎ文字で分割[遅い例]

golang で文字列をｎ文字で分割する。**（下記コードはくそ遅い例です。もっといいのはコメントいただきました）**

regexp の FindAllString で ".{80}" みたいな正規表現で切る方法もあるんですけど、いずれにせよ余りはみなきゃならないので、下記みたいに strings.Split 後普通にやるのがいいんじゃないだろうか。。。と思ってます。
+= がベンチ的にどうか？ってのは見てません。

```go
	splitlen := 80
	list := strings.Split(msg, "")
	str := ""
	for i, c := range list {
		if i > 0 && i % splitlen == 0 {
			log.Println(str)
			str = ""
		}
		str += c
	}
	if len(str) > 0 {
		log.Println(str)
	}
```

http://play.golang.org/p/Aya8xxsa8a

g(・∀・)o

追記

コメントでもらったものと比較したところ、コメントでもらったもののほうが圧倒的に速かったので、上記は悪い例ということでお見知り置きください。
@heliac2000 さんに指摘いただいたように素直に範囲指定するのがよいようです。ありがとうございました。

✧＼\ g( 'ω' )o /／✧
Androidサポート対象の端末を一括指定


Google Play Developer Consoleでサポート対象の端末をぽぽぽんと！簡単に指定できます！（なんで公式でできないんですかね...）

今回はChromeを使います

# 「端末の互換性」ウィンドウを表示
1. Google Play Developer Consoleを開く
- アプリメニューから　「APK」を選択
- 画面中ほどの「サポート対象の端末数」の下にある「リストを表示」をクリック
![スクリーンショット_2015-08-23_0_40_02.png](https://qiita-image-store.s3.amazonaws.com/0/78615/7bf5f736-8111-6185-9267-e9c2f0c2b4bd.png "スクリーンショット_2015-08-23_0_40_02.png")


するとこんな画面が出てきます。
![スクリーンショット_2015-08-23_0_40_31.png](https://qiita-image-store.s3.amazonaws.com/0/78615/eaa0467c-eda3-d5a4-d8f8-620e69ad7fce.png "スクリーンショット_2015-08-23_0_40_31.png")

# コマンド + Shift + j (mac)
ChromeデベロッパーツールのJavaScriptが実行できる「JavaScriptコンソール」がでてきます
![スクリーンショット_2015-08-23_0_41_13.png](https://qiita-image-store.s3.amazonaws.com/0/78615/c4f8edf5-e8a7-f414-6bdd-48a6d662ab21.png "スクリーンショット_2015-08-23_0_41_13.png")


# スクリプトの準備

これをコピ

```js:コピペ1
var jq = document.createElement('script');
jq.src = "//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js";
document.getElementsByTagName('head')[0].appendChild(jq);
```

ぺ！してエンター

# 一括オンオフする

次にどちらか好きなほうをコピペしてエンター

```js:全部一括で対象に
$('checkbox[aria-checked=true]').click();
```

```js:全部一括で非対象に
$('checkbox[aria-checked=false]').click();
```

５秒ほど待つと一気に変わります！画面下部の「保存」ボタンを押せば反映されます
![スクリーンショット 2015-08-23 0.42.25.png](https://qiita-image-store.s3.amazonaws.com/0/78615/fe56bafd-5305-f50d-9ca8-b56afba256ff.png "スクリーンショット 2015-08-23 0.42.25.png")

# メーカー単位で一括変更など

こちらの方の記事を参考にするといいですよ

http://qiita.com/isoparametric/items/5dd10e548af8934c4fc5

# 注意

レイアウトが変わるとスクリプトも若干変わります。実行できないなーと思ったら最近の記事をググって新しいスクリプトを探してみてください
capistrano3で指定したサブディレクトリだけデプロイする方法

プロジェクトが以下のような構造になっているとします。

```
├── client
│   ├── Capfile
│   ├── Gemfile
│   ├── Gemfile.lock
│   ├── c1.rb
│   └── config
│       ├── deploy
│       │   ├── development.rb
│       │   └── staging.rb
│       └── deploy.rb
├── common
│   └── comon1.rb
└── server
    └── s1.rb
```

このとき、capistranoでclientをデプロイするときに、commonディレクトリも同時にデプロイしたい場合の設定方法を説明します。


## client/CapfileにMultiSubDirectoryStrategyを定義

```ruby
# client/Capfile

require 'capistrano/git'

class Capistrano::Git
  module MultiSubDirectoryStrategy
    include DefaultStrategy

    def release
      git :archive, fetch(:branch), fetch(:deploy_sub_dirs).join(" "), '| tar -x -f - -C', release_path
    end
  end
end
```

## client/config/deploy.rbを編集

```ruby
# client/config/deploy.rb

set :application, 'client'
set :repo_url, 'https://github.com/k-yamada/capistrano-multi-subdirectory-deploy-sample.git'

set :deploy_to, '/tmp/capistrano-multi/client'
set :git_strategy, Capistrano::Git::MultiSubDirectoryStrategy
set :deploy_sub_dirs, ["client", "common"] # clientとcommonだけデプロイする

set :bundle_gemfile,  "client/Gemfile"
```


## デプロイ実行

```
$ bundle exec cap development deploy
```

デプロイ先には以下のように展開されます。

```
$ tree /tmp/capistrano-multi/client/current
/tmp/capistrano-multi/client/current
├── REVISION
├── client
│   ├── Capfile
│   ├── Gemfile
│   ├── Gemfile.lock
│   ├── c1.rb
│   └── config
│       ├── deploy
│       │   ├── development.rb
│       │   └── staging.rb
│       └── deploy.rb
└── common
    └── comon1.rb
```

実験用に作ったプロジェクトをgithubに置いておきました。

* github: [k-yamada/capistrano-multi-subdirectory-deploy-sample](https://github.com/k-yamada/capistrano-multi-subdirectory-deploy-sample)

# トラブルシューティング

## デプロイ時に「Could not locate Gemfile」エラーが発生する

### Solution

config/deploy.rbにGemfileのpathを指定してください。

```rb
# config/deploy.rb

set :bundle_gemfile,  "server/Gemfile"
```

## サブディレクトリにあるRailsをデプロイする場合に「assets:precompile」や「unicorn」の起動で失敗する

### Problem

サブディレクトリにあるRailsをデプロイする場合に、「[capistrano/rails](https://github.com/capistrano/rails)」と「[capistrano3/unicorn](https://github.com/tablexi/capistrano3-unicorn)」がサブディレクトリに対応していないため、デプロイ時にエラーが発生します

### Solution

railsのルートディレクトリをオプションで指定できるように、上記のgemを修正したものを作りました。
それを使うにように、Gemfileを修正します

```
# Gemfile:

group :development do
...
  gem 'capistrano-rails', github: 'k-yamada/capistrano-rails'
  gem 'capistrano3-unicorn', github: 'k-yamada/capistrano3-unicorn', :require => false
end
```

config/deploy.rbの「rails_root」オプションに、railsのルートディレクトリを指定します。

```
# config/deploy.rb

set :rails_root, 'server'
```


# その他

railsのルートディレクトリをオプションで指定できるように、修正したgem一覧

- [k-yamada/capistrano-rails](https://github.com/k-yamada/capistrano-rails)
- [k-yamada/capistrano3-unicorn](https://github.com/k-yamada/capistrano3-unicorn)
- [k-yamada/whenever](https://github.com/k-yamada/whenever)
Mongoシェルのfindで20件以上表示させる方法

MongoDBのMongoシェルでfindした時に、結果が20件以上だと`Type "it" for more`と出ますが、それを増やす場合には`DBQuery.shellBatchSize`をつかえばOKです。

```
DBQuery.shellBatchSize = 300 #<-表示させたい件数
```

これには理由があって、Mongoシェルのオペレーションで気軽に全件表示できるとMongoにフルスキャンと同等の高い負荷がかかるので、一回のフェッチサイズを20件にしているのです。
[Ruby] bundle install --pathで指定したgemのインストール先をロードパスに追加するには

ノンフレームワークで小さなプログラムを書いていたときに初めて遭遇した。

以下のようにgemを呼び出しても
"cannot load such file"となる

```
require "twitter"
```


## 解決方法

bundler/setupを読み込めばOK

```
require "bundler/setup"
require "twitter"
```
新規クラス作成時のテンプレートをカスタマイズする方法

Androidプロジェクトで新規クラスファイルを作成する際に毎度ログ出力用のタグを定義するのですが面倒です。
そこで新規クラスファイル作成時に `TAG` を定義するよう設定しました。

[Preference] -> [File and Code Templates] -> [Class] 
※Macの設定です。
![スクリーンショット 2015-08-22 23.38.11.png](https://qiita-image-store.s3.amazonaws.com/0/49585/2e5d16a2-7bc2-d77e-68db-bf499aa5d06d.png)

新規クラスファイル作成時に `TAG` を定義するよう★マークの箇所を追加しました。

```java

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
public class ${NAME} {
    private static final String TAG = ${NAME}.class.getSimpleName(); // ★
}
```

その他独自にテンプレートを作成できるようなので試してみたいと思います。
cakePHP3で画像を使ったradioFormを作る

# やりたかったこと

どの海パンを選びますか？
![mi.png](https://qiita-image-store.s3.amazonaws.com/0/39090/8360126b-edb1-1d66-7a1d-292f09323c33.png)

みたいなformが作りたかったのです。


# 作り方

基本的なformの作り方は、[公式リファレンス](http://book.cakephp.org/3.0/en/views/helpers/form.html)を見ていただくとして・・。
inputの部分ですが、こんな感じに書くといけます。

```php
// $iconsには、***.pngというファイル名が配列で格納されており、
// webroot/imgに***.pngが置かれてあるとします。
echo $this->Form->radio('icon', array_map(function ($icon) {
    return ['value' => $icon, 'text' => $this->Html->image($icon, ['alt' => $icon])];
}, $icons), ['escape' => false]);
```

どうなっているかというと、まずFormHelperのradio()の引数はこんな感じになってます。

```php:FormHelper.php
public function radio($fieldName, $options = [], array $attributes = []) {
    ...
}
```

コツとしては、\$optionsに、textで画像のhtmlを渡すこと。
もう１つ目のコツは、引数の$attributesに、escapeをfalseで渡すことです。
こうすることで、HtmlHelperで生成されたimgのhtmlが、そのままradio用の画像として使われます。
escapeを指定しないと、生成されたhtmlがサニタイズされるので、文字列のまま表示されます。


## 注意点

逆に言うと、escapeをfalseにするとサニタイズされません。
具体的には、valueとtextが対象となります。
使用するときは、十分気をつけてください。
上記の例だと、\$iconをサニタイズしたほうが良いと思います。

```php
$icon = h($icon);
```
jQueryの自作ウィジェットで「Uncaught TypeError: Cannot read property 'XXX' of undefined」となる問題を克服しました

jQueryで自作ウィジェットを作成してみたところ、以下のエラーに遭遇しました。DOM？に格納されているウィジェットのインスタンス名が間違えていたようです。

```text:エラー
Uncaught TypeError: Cannot read property 'メソッド名' of undefined
```

##環境

* CentOS 6.6
* jQuery 1.8.3/1.9.1/1.10.2/1.11.3

##問題のコード

```javascript:main.js
(function ($) {
    "use strict";

    $(function () {
        var obj1;
        $("#myWidget1").myWidget();
        obj1 = $("#myWidget1").data("jqWidget"); // ここが問題
        obj1.setContent("hello myWidget1");
    });
})(jQuery);
```

```javascript:jqWidget.js
(function($) {
    "use strict";

    $.widget("ui.jqWidget", {
        options: {
            content: "hoge"
        },

        _init: function () {
            this._update();
        },

        _update: function () {
            var opts = this.options;
            var elm = this.element;
            elm.html(opts.content);
        },

        setContent: function (str) {
            this.options.content = str;
            this._update();
        }
    });
})(jQuery);
```

```html:main.html
<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>jQuery Widget example</title>
    <link rel="stylesheet" href="vendor/jquery-ui-1.11.4.css" type="text/css" media="screen">
</head>
<body>
<div id="myWidget1"></div>
<script type="application/javascript" src="vendor/jquery-1.8.3.js"></script>
<script type="application/javascript" src="vendor/jquery-ui-1.11.4.js"></script>
<script type="application/javascript" src="js/jqWidget.js"></script>
<script type="application/javascript" src="js/main.js"></script>
</body>
</html>
```

##修正

```javascript:main.js
(function ($) {
    "use strict";

    $(function () {
        var obj1;
        $("#myWidget1").myWidget();
        obj1 = $("#myWidget1").data("ui-jqWidget"); // ここを修正
        obj1.setContent("hello myWidget1");
    });
})(jQuery);
```

## 参考

* http://nbnote.jp/blog/2011/12/jquery-widget-1/
ofxCef のビルド手順

## [ofxCef](https://github.com/ofZach/ofxCef) とは
[CEF (Chromium Embedded Framework)](https://bitbucket.org/chromiumembedded/cef) を openFrameworks から使えるようアドオン化したもの。ざっくり言うと oF に Chrome を組み込めます。
作者は Zach 先生だけど実質 [Dpt.](http://www.dpt.co/) の Hugues Bruyère 氏がメインコントリビュータの模様。  

Web + ネイティブだと最近は [Electron](https://github.com/atom/electron) が有名ですが、あちらもベースは Chromium です。

## 何が嬉しいか
Chromium の資産がまるごと oF (C++) で使えます。  

- Canvas
- WebGL
- WebSocket  

などなど。
また Google Maps や YouTube など C++ から使うのが難しかったコンテンツも埋め込めます。嬉しいですね！

## ビルドする

### 環境
- Xcode Version 6.4 (6E35b)
- openFrameworks v0.8.4

### 1.ソース類をダウンロード
CEF を[ここ](http://www.magpcss.net/cef_downloads/index.php?query=label%3A~Deprecated+label%3ACEF3+label%3Abinary#list)から、ofxCef を[ここ](https://github.com/ofZach/ofxCef/archive/master.zip)からダウンロードします。
CEF はいくつかリビジョンがありますが、今回は [cef_binary_3.2171.1979_macosx32](http://www.magpcss.net/cef_downloads/index.php?file=cef_binary_3.2171.1979_macosx32.7z) を使います。oF が 32bit なので合わせます。

**2015.08.23 追記**
Brunch 2272 以降 Mac OS X 32bit のサポートは終了したそうです。
oF v0.9.0 以降は 64bit に対応するので [Release Brunches](https://bitbucket.org/chromiumembedded/cef/wiki/BranchesAndBuilding) から落としてきたほうがよさげです。

### 2.addons フォルダに配置
ofxCef を解凍して他のアドオンと同様に addons フォルダに置きます。
中身は以下の通り。

- CEF
    - include ... CEF 本体のヘッダ群
    - lib ... ライブラリ類
- src ... ofxCef のソース
- example-ofxCEF ... サンプルプロジェクト

とりあえず example-ofxCEF に入っている Xcode プロジェクトを開くと example の他に cefHelper というターゲットがあるのがわかります。
![スクリーンショット 2015-08-22 21.48.01.png](https://qiita-image-store.s3.amazonaws.com/0/5807/1dd11d18-ea12-d9d2-0375-84bf5f284e0f.png)

README を読むとまずこのヘルパーアプリをビルドしてねと書いてありますが、ビルドすると libcef_dll_wrapper が無いために下記のエラーが出ます。

```
ld: library not found for -lcef_dll_wrapper
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

### 3.libcef_dll_wrapper をリンクして cefHelper をビルド
ここでさっき落としてきた CEF 本体を使用します。
解凍し中した中にある cefclient.xcodeproj がを開くとターゲットに ```libcef_dll_wrapper``` があるので、これを指定してビルドします。 
![スクリーンショット 2015-08-22 22.06.55.png](https://qiita-image-store.s3.amazonaws.com/0/5807/9f5cef66-2c77-d977-3bca-228a558c4b66.png)

```cef_binary_3.2171.1979_macosx32/xcodebuild/Debug``` に libcef_dll_wrapper.a ができているので、これをさっきの cefHelper にリンクします。
![スクリーンショット 2015-08-22 22.14.23.png](https://qiita-image-store.s3.amazonaws.com/0/5807/b314ef4d-c1d3-8ea1-bd64-4bddd5c0962d.png)

この状態で cefHelper のビルドをおこなうと無事成功するはず。

### 4.example のビルド
次にターゲットをexample-ofxCEF Debug に変更して、同じように libcef_dll_wrapper.a をリンクします。
ビルドして [http://mrdoob.com/](http://mrdoob.com/) が表示されれば成功です。おめでとうございます！
![1.png](https://qiita-image-store.s3.amazonaws.com/0/5807/ab380ea4-9d26-0400-4c8f-398614109073.png)

## Next...
続編として projectGenerator を使用してイチから ofxCef なプロジェクトを作成する方法を書きます。

書きました -> [ofxCef を使用した app を作る](http://qiita.com/hideyukisaito/items/85427168353cf6441d35)
OSXでPKCF#12から証明書、中間証明書、秘密鍵を保存する

グローバルサインで証明書を買った時に、PKCF#12でファイルが送られてきたんだけど、それから証明書などなどを保存する手順。

解凍ツールがあるけど、Javaアプレットでできてて、すんなりとは使えない。

OSXには、opensslのツールが入ってるんで、コマンドでやるのが楽だった。
元ネタ：http://www.jcert.co.jp/support/pdf/OpenSSL_PKCS.pdf

## 証明書

```
$ openssl pkcs12 -in sample.p12 -clcerts -nokeys -out sample.crt
```

## 中間証明書

```
$ openssl pkcs12 -in sample.pfx -cacerts -nokeys -out sample.ca-bundle
```

## 秘密鍵

```
$ openssl pkcs12 -in sample.p12 -nocerts -nodes -out sample.key
```
Enumのテストでカバレッジが100%にならない謎

# Enumの謎
列挙型のクラスに対する JUnit テストを行った際、ソースコードを全網羅しているにも関わらず、カバレッジが 100% にならないことがあります。なぜでしょう？

```java:Answer.java（テスト対象の列挙型）
public enum Answer {
    YES,
    NO;
    
    public Answer opposite() {
        return this == YES ? NO : YES;
    }
}
```

```java:AnswerTest.java（テストコード）
public class AnswerTest {

    @Test
    public void testOpposite() {
        assertThat(Answer.YES.opposite(), theInstance(Answer.NO));
        assertThat(Answer.NO.opposite(), theInstance(Answer.YES));
    }
}
```

![enum1b.png](https://qiita-image-store.s3.amazonaws.com/0/84939/79476788-fbb9-7d6c-2acb-98768c9a980d.png)

#答え
Answer#values() と Answer#valueOf(String) に対するテストコードが無いためでした。これらを追加することで、カバレッジが 100% になります。

```java:AnswerTest.java’（テストコード改）
public class AnswerTest {
    
    @Test
    public void testOpposite() {
        assertThat(Answer.YES.opposite(), theInstance(Answer.NO));
        assertThat(Answer.NO.opposite(), theInstance(Answer.YES));
    }
    
    // 追加
    @Test
    public void testValues() {
        assertThat(Answer.values(), is(new Answer[] { Answer.YES, Answer.NO }));
    }

    // 追加    
    @Test
    public void testValueOf() {
        assertThat(Answer.valueOf("YES"), theInstance(Answer.YES));
        assertThat(Answer.valueOf("NO"), theInstance(Answer.NO));
    }
}
```

![enum2b.png](https://qiita-image-store.s3.amazonaws.com/0/84939/17bbdfa0-24c7-edcf-56c7-ca68d6871b85.png)

#解説
列挙型には次の2つのメソッドが暗黙的に定義されており、コンパイラにより自動で生成されます。

* public static E[] values()
* public static E valueOf(String name)

多くのカバレッジレポートは、ソースコードではなくバイトコードに対するカバレッジを測定するものですので、このような振る舞いになったのですね。

#四方山話
ある程度の大きさのプロジェクトになると、「単体テストでは C1 カバレッジ 100% を目標とする！」「100% に満たない場合はその妥当性をレビュアが確認する！！」なんていうテスト計画が立てられちゃったりします。

values() と valueOf(String) は自動生成されるものなのでテストする必要なんてもちろん無いわけですが、「カバレッジ 100% になってないけどどうなってるの？！」なんて聞いてくる "品質保証担当者" に説明するのとテストしちゃうのと、どっちが楽かという話ですね...

　・・・

本稿は、[以前の投稿](http://qiita.com/nmby/items/bd44e28d937108fa3eb0) のソースコードからのスピンオフ記事になります。Color クラスなどのテストコードを書いていて気づいたので投稿しました。
よろしければこちらの投稿も見てやってちょ → [「リバーシで遊んで覚える Java 8.」](http://qiita.com/nmby/items/bd44e28d937108fa3eb0)

なお nmby の流儀は、test first ならぬ test later です。。。

　・・・

本稿の内容は初歩的なものでした。
Qiita の投稿に難易度フラグ（初歩～高度）なんかがあると、便利かもしれませんね。
TCP Wrapper

<h2>機能</h2>
・ /etc/hosts.allow, /etc/hosts.denyファイルに基づいてアクセス制御を行う
　- 実体は、tcpdデーモン
　- libwrapを使用しているアプリケーション(opensshサーバ、popサーバ、imapサーバ、etc)は、tcpdなしでTCP Wrapperの機能を利用する

<h2>図</h2>
![R7jCoRvx70ItfdzU-ECE65.png](https://qiita-image-store.s3.amazonaws.com/0/86906/f4e4bf14-2338-ad2e-9c06-183043fad776.png)


<h2>TCP Wrapperのアクセス制御</h2>
1, /etc/hosts.allowをチェックする
　- ここで許可されているホストは、許可

 2, /etc/hosts.denyをチェックする
　- ここで拒否されているホストは、拒否
　- ここで拒否されていないホストは、許可

<h2>記入例</h2>
example.comからのTelnetと192.168.28.0/24からの全アクセスを許可する場合

1,まずhosts.allowファイルに許可するアクセス内容を記入

```:/etc/hosts.allow
in.telnet:       .example.com
ALL:             192.168.28.
```
　*ドメイン名の先頭にピリオドを忘れないように

2, 次にhosts.denyファイルですべてのアクセスを拒否する

```:/etc/hosts.deny
ALL:   ALL
```
EclipseのADTからAndroid Studio移行時になぜかdrawableフォルダ内の画像がないと言われる


Eclipse ADTが年内いっぱいで使えなくなるということで、
Android Studioに作っていたものを移行してみたが、
フォルダに入っている画像がないよ！と言われてビルドがエラーで終了する。

そこで、pngを拡張子変更してjpgにするとビルドが通って、
アプリが実行できるようになった。

stackoverflowとかでもいくつも同じ現象を質問している人がいて、
いろいろ見てみたけど結局根本的な原因はわからず...。

[参考]
http://stackoverflow.com/questions/29023830/android-studio-crash-aapt-exe-returns-42-when-i-put-png-file-in-drawable-folde

まずはこの回避策で進めるけど、jpgはandroid的にも非推奨だったはずなので継続して調べる必要はありかも。
GPUImageVideoCameraを入力に毎フレームごとに何か処理をしたい


# 問題

まず毎フレームごとに何か処理したい場合は
処理したい画像を出力するGPUImageFilterの``frameProcessingCompletionBlock``に処理を設定する。
しかし単純に``imageFromCurrentFramebuffer``を呼び出しても上手くイメージを取得できない。対応策がわかったので記録を残す

#対応

問題は[githubのissue](https://github.com/BradLarson/GPUImage/issues/1753)にあるように
``frameProcessingCompletionBlock``処理内で``useNextFrameForImageCapture``が呼ばれることを設計者が想定していなかったことの模様。

``frameProcessingCompletionBlock``が呼び出された時点でこちらが必要としているframeがすでにfilterを通過済みのため、``frameProcessingCompletionBlock``内で``useNextFrameForImageCapture ``を呼び出しても次のフレーム用となる。


**事前に``frameProcessingCompletionBlock``処理呼び出し前に
``useNextFrameForImageCapture ``を呼び出したら上手く行った**









```swift

import UIKit
import GPUImage


class ViewController: UIViewController {

    @IBOutlet weak var outputView: GPUImageView!
    @IBOutlet weak var copyImageView: UIImageView!
    
    var videoCamera:GPUImageVideoCamera?
    var grayScalefilter:GPUImageGrayscaleFilter?

    override func viewDidLoad() {
        super.viewDidLoad()

        self.videoCamera = GPUImageVideoCamera(sessionPreset: AVCaptureSessionPreset352x288, cameraPosition: .Back)
        self.videoCamera?.outputImageOrientation = .Portrait
        
        self.grayScalefilter = GPUImageGrayscaleFilter()
        videoCamera?.addTarget(grayScalefilter)
        
        let lastFilter = grayScalefilter
        lastFilter?.addTarget(outputView)
        
        lastFilter?.frameProcessingCompletionBlock = { (output,t) in
            
            //次回frameProcessingCompletionBlockが呼び出された時のための対処
            defer { output!.useNextFrameForImageCapture() }
            
            //uiimageの取得
            guard let image = output!.imageFromCurrentFramebuffer() else {
                print("error get image!")
                return
            }
            
            //mainスレッドで処理する
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                self.copyImageView.image = image
            })
            
        }
        
        //最初のフレーム用の呼び出し
        lastFilter?.useNextFrameForImageCapture()
        videoCamera?.startCameraCapture()

    }

}

```

# 参考

https://github.com/BradLarson/GPUImage/issues/1753

http://qiita.com/rooooomania/items/68214c7771d17af2ab64
gulpを使ってsassの@importを解決しつつ差分ビルドをする

小さいアプリケーションなら、styleは変更がある度に毎回フルビルドしてしまっても1sもかからないかもしれない。
しかし大きくなって、5s以上かかると非常に苦痛だ。

というわけで差分ビルドしたい。

## Sassの差分ビルドで問題になること
差分ビルド自体は簡単で、[gulp-cached](https://github.com/wearefractal/gulp-cached)とかを使えば、前回と差分があるものだけをビルドできる。

なんだけど、その場合に問題になるのがsassの依存関係(`@import`)の解決だ。

単純に差分のあったファイルをビルドするだけだと、`@import`元を辿れない。
そうすると`@import`元のファイルが変更についてこない。

いや、でもnode-sassのwatchオプションって`@import`元辿ってるよな、あれってどうなってるんだ？？
と思って実装を見てみたら、[sass-graph](https://github.com/xzyfer/sass-graph)というnpmを使って辿っていた。

お、これ使えば差分ビルド時に依存関係の解決もできるんじゃね？？

ということでgulp taskに組み込んでみた。

## gulpfile.coffee

```coffeescript
gulp        = require 'gulp'
forEach     = require 'gulp-foreach'
sass        = require 'gulp-sass'
cache       = require 'gulp-cached'
grapher     = require 'sass-graph'
gulpIf      = require 'gulp-if'

gulp.watching = false

gulp.task 'build:sass', ->
  baseDir = "front/stylesheets/"
  graph = grapher.parseDir(baseDir)
  gulp.src "#{baseDir}/**/*.scss"
    .pipe cache('sass')
    .pipe gulpIf(@watching, forEach (currentStream, file) ->
      files = [file.path]
      addParent = (childPath)->
        # ここで@import元をたどる
        graph.visitAncestors childPath, (parent) ->
          files.push(parent) unless _.includes(files, parent)
          addParent(parent)
      addParent(file.path)
      gulp.src files, {base: baseDir}
    )
    .pipe sass().on('error', sass.logError)
    .pipe gulp.dest("public/stylesheets")


gulp.task 'watch', ->
  @watching = true
  gulp.watch "front/stylesheets/**/*.scss", ['build:sass']
```

これのおかげで、10sかかかるビルドが0.1sで済むようになった。嬉しいね。
GASで非共有Driveファイルのオーナー権限を変更する

自分がオーナー権限を持っているファイルの
オーナー権限を他人に変更すると
自動的に自分に編集権限が与えられるので
`setOwner()`でオーナー権限変更後、
自分の編集権限を削除する必要があります。


```js
var file = DriveApp.getFileById("FILE_ID_HERE");//自分がオーナーのファイル
var targetMail = "new@example.org";
var oldMail;
file.setOwner(targetMail);  
oldMail = Session.getActiveUser().getEmail();
file.removeEditor(oldMail);
```
`removeEditor()`で自分の編集権限を削除しています。
これで変更先ユーザーのみアクセスできるファイルになります。

`setOwner()`でオーナーを変更したタイミングで自動的に
「オーナー権限の譲渡」「編集へのご招待」メールが届くのを
やめさせたいけど無理そう…
define_method内でのRubyのブロックの挙動の違い


Ruby 2.2.2での確認です。

# 起こったこと
Rubyには色々なブロックの渡し方があるが、若干挙動が違うというのを今日初めて発見したのでメモ。
渡し方について、思いつく限りでは

1. Procオブジェクトを定義して渡す
2. Procオブジェクトをインラインで渡す
3. Procオブジェクトをブロックで渡す
4. Procオブジェクトをyieldで渡す

などがある。実際に挙動を確かめてみよう

```ruby:1
blk = proc{ puts "yappy" }
define_method(:bar, &blk)

bar #=> "yappy"
```

まあそうですね

```ruby:2
define_method(:foo, lambda{ puts "yappy" })

foo #=> "yappy"
```

そうですね

```ruby:3
define_method(:fob){ puts "happy" }
fob #> "yappy"
```

なるほど

```ruby:4
define_method(:fooba) do
  yield
end

fooba{ puts "yappy" } #=> LocalJumpError: no block given (yield)

```

お。

```ruby:normal
def foobar
  yield
end

foobar{ puts "yappy" } #=> yappy

```

普通に定義をしてみると問題がない

ということでエラーを取ってみると

```ruby:error

begin
 fooba{ puts "yappy" }
rescue LocalJumpError => e
 e.inspect #=> #<LocalJumpError: no block given (yield)>
 e.reason  #=> noreason
end

```

という形で、noreasonという力強いエラーが出る。

# 原因の予想

ドキュメントをみる限りだと

[Ruby 2.2.0 リファレンスマニュアル　Procクラス](http://docs.ruby-lang.org/ja/2.2.0/class/Proc.html)
> orphan な手続きオブジェクトの挙動
>Proc を生成したメソッドから脱出した後、手続きオブジェクトからの return, break は例外 LocalJumpError を発生させます。 ただし、上でも説明した通り lambda で生成した手続きオブジェクトはメソッドと同じように振る舞う ことを意図されているため、例外 LocalJumpError は発生しません。

のあたりに原因がありそうな感じがした。
詳しい人教えてください
[Elixir]Mixのカスタムタスクを作成する

#Goal
mixで使える自分用のコマンドを作成する。

#Dev-Environment
OS: Windows8.1
Erlang: Eshell V8.0, OTP18
Elixir: v1.3.0

#Wait a minute
mixで使える自分用のコマンド(カスタムタスク)を作成します。

以下の部分のみに注力したシンプルなサンプルです。

mix helpから見れる --> コマンドを実行する --> 結果が表示される

#Index
My mix command
|> Preparation
|> Creating a Command
|> Let's run

##Preparation
プロジェクトの作成を行います。

```cmd
>mix new my_mix_cmd
>cd my_mix cmd
>mix test
```

また、以下のようなディレクトリ構造とファイルの配置をして下さい。
(Phoenix-Frameworkのディレクトリ構造に習います)

ファイル: lib/mix/tasks/sample.ex

##Creating a Command
それではコマンドとなるモジュールを作成していきます。

####ファイル: lib/mix/tasks/sample.ex

```elixir
defmodule Mix.Tasks.Sample do
  use Mix.Task

  @shortdoc "My mix command sample"

  def run(args) do
    IO.puts (inspect args)
  end
end
```

コマンドの実行時に受け取った引数をただ表示するだけのコマンドです。
`@shortdoc`を入れておくとmix helpから説明が見れます。

##Let's run
それでは実行してみましょう！

まずは、mix helpに表示されるか見てみます。

```cmd
>mix help
mix                   # Run the default task (current: mix run)
...
mix sample            # My mix command sample
...
```

出ましたね。`@shortdoc`の説明も表示されています。

次は実行してみましょう。

```cmd
>mix sample
[]

```

空リストが表示されてますね。
引数は、空リストとして扱われているということでしょう。

それを確認するために引数を入力してみます。

```cmd
>mix sample hoge huge foo:bar
["hoge", "huge", "foo:bar"]
```

#### Memo: `mix sample`と`mix Sample`どちらでもコマンドは実行可能です。

よし、予想通りですね。

#Speaking to oneself
今回はここまで・・・
色々と使える関数があるみたいなんですけど、今のところは調べきれていません。

シンプルな例としては、
Phoenix-Frameworkの「mix phoenix.routes」のソースコードを参考にするとシンプルで分かりやすいです。

後は、[@ma2ge](https://twitter.com/ma2ge)氏が作成しているパンくずライブラリのコミット内容が参考になります。
参考: [Github - ma2gedev/breadcrumble_ex (implement generator for the Phoenix application)](https://github.com/ma2gedev/breadcrumble_ex/commit/369424969d38bfc8ee7c4d929a98c8372ceceeb3)

[@ma2ge](https://twitter.com/ma2ge)氏、参考にさせて頂きましたm(＿ ＿)m

もう一つ、もっと説明が欲しいと言う方は以下のリンク先が参考になります。(ちょっと古い？)
参考: [A Custom Mix Task for Phoenix App](http://learnelixir.com/blog/2014/11/04/custom-mix-task-for-phoenix-app/)

#Bibliography
[Github - ma2gedev/breadcrumble_ex (implement generator for the Phoenix application)](https://github.com/ma2gedev/breadcrumble_ex/commit/369424969d38bfc8ee7c4d929a98c8372ceceeb3)
[A Custom Mix Task for Phoenix App](http://learnelixir.com/blog/2014/11/04/custom-mix-task-for-phoenix-app/)
[PR]Qiitaでストックした投稿を検索するアプリをReact + Railsで作った

#何をやったか
Reactの練習も兼ねて、Qiitaでストックした投稿を検索するためのアプリを作りました。
http://qiita-stocker.net/#/signin

#どうしてやったか
* Qiitaの投稿ストック数が150を超えて、ストック一覧がいよいよ混沌としてきていた。
* JavaScriptとRubyの記事が同時に表示されたり、ストックの中から目当ての記事を探すのがめんどくさくなってきて、なんかいい感じのUIがあれば簡単に探せるのではないかなと思った。
* Reactの練習がしたかったので、なにか題材を探していた。



#何ができるか
####フォローしているタグから絞り込めたり
[![Gyazo](https://i.gyazo.com/8e07dd1336e9890f310a6ca7196edc07.gif)](https://gyazo.com/8e07dd1336e9890f310a6ca7196edc07)



####フォローしているユーザーで絞り込めたり
[![Gyazo](https://i.gyazo.com/15f064ec9705cbb04077ca67b13e8fc6.gif)](https://gyazo.com/15f064ec9705cbb04077ca67b13e8fc6)



####当然キーワード検索できたりします
[![Gyazo](https://i.gyazo.com/a5061e46fe73759a2fa67731846df0fa.gif)](https://gyazo.com/a5061e46fe73759a2fa67731846df0fa)


#どうやって作ったか

###1. クライアントサイド
React.jsによるコンポーネントで全て作成し、browserifyとgulpを使ってbundleしました。
アーキテクチャはFluxを使いました。

jsかscssが更新された時、gulpが変更を検知してwatchfyを使って差分のみbabelでコンパイルして、BrowserSyncでライブリロードしてくれるような開発環境を構築しました(そこらへんのgulpfileとかの設定はまた別途記事にしようと思います)。

###2. サーバーサイド
Rails4.2.3からQiitaAPIを叩いて、叩いた結果をJSONでクライアントサイドに渡すように作りました。

#参考にした記事とか
1. ざっくりGulp.js入門（Mac向け）
http://qiita.com/kazukichi/items/884a1379eea5918689ed

2. Browserify: それはrequire()を使うための魔法の杖
http://qiita.com/cognitom/items/4c63969b5085c90639d4

3. 複数ブラウザ/端末を同期してくれるBrowserSyncが便利
http://qiita.com/yuichiroharai/items/b3daf45ff209f303bf50

4. [Rails]production環境で動かす
http://qiita.com/a_ishidaaa/items/74de8bdaecd637063c40

5. [Qiita] QiitaにおけるOAuth認証の流れ（PhoneGap/Cordova版）
http://qiita.com/nutti/items/688de20382e60286d26d
【しずおかアプリ部】活動ログ　第六回

![しずおかアプリ部3.png](https://qiita-image-store.s3.amazonaws.com/0/88105/318e97ba-5fe4-a0fa-ab85-4b25657cf72f.png)


■タイトル
第六回


■開催日
２０１５年８月２２日（土）　１６：００～１８：００


■参加者
６名


■活動内容（概要）
・イラストレーターさん実演「ペンタブ＆クリスタ」
　部員ペンタブ体験
・保坂プレゼン「Cocos2d-xで作る物理演算ゲーム　～触れてみようChipmunk編～」
※菅原プレゼンは時間の都合行えなかった為、次回に繰り越し


■活動内容（詳細）
【実演・プレゼン】

・「ペンタブとCLIP STUDIO」
　～ペンタブとCLIP STUDIOを使って女の子の顔を描く工程を紹介～

　　下書き
　　　・ラスターレイヤーにシャーペンを使って下書きを描く
　　　　イラストレーターさんは太めのシャーペンが書きやすいとのこと

　　　・あくまで下書きなので、何本も線を描いて当たりをつけていく

　　　・ブラシ（ペン）はカスタマイズ可能
　　　　公式ストアや一般の人たちが作ったカスタマイズブラシを追加が可能
![下書き.png](https://qiita-image-store.s3.amazonaws.com/0/88105/0d72b6bb-a942-9a9a-9372-b0f23c780b47.png)


　　ペン入れ
　　　・下書きのレイヤーを薄くし、ベクターレイヤーを追加
　　　　自分が線を引きやすい角度にキャンバスを回転させながら、納得のいく線が描けるまで描いては消しを繰り返す。
　　　　この時、線のはみ出しについては気にしなくてよいので、良い線が描けるように頑張る。

　　　・ベクター用の消しゴムを使ってはみ出した線を簡単削除
　　　　はみ出した部分だけを自動で削除してくれるので、とても便利なツール

　　　・目、鼻、口などの顔のパーツは別レイヤーに作成
　　　　顔は何度もやり直す可能性があるのと、表情の差し替えを容易に行えるようにするため


　　　ベクターレイヤーのメリット
　　　　拡大縮小、移動、回転などの作業で線の劣化が起きない
　　　　キャンバスの解像度変更にも耐えれる
　　　　線の太さや色を後から変更可能
　　　　ベクター消しゴムが使える


　　色塗り
　　　・ペン入れしたレイヤーを色塗り用の参照設定とし、別レイヤーで色塗りを行う
　　　　参照設定してあるレイヤーの囲まれている部分が、色塗り用のレイヤーの塗りつぶし範囲となる。
　　　　この設定のおかげで、線画に影響を与えることなく色塗りを行うことができる。
　　　　塗り残されてしまった部分を簡単に塗り足せるツールもある。

　　　・影とハイライトについて
　　　　影は別レイヤーにして、レイヤーに乗算効果を与えておく
　　　　ハイライトは別レイヤーにして、レイヤーにオーバーレイ効果を与えておく
　　　　そうすることで、ベースの色を変えるだけで影やハイライトの色が追従して自然な色となる
　　　　（完ぺきではないので、調整が必要な場合もある）

　　　　その他の方法として「グリザイユ画法」というものがある
　　　　グレースケールで絵を描き、オーバーレイで色を重ねる。
　　　　ハイライトや影はグレースケールの時に描いたものを使うこととなる。
![完成.png](https://qiita-image-store.s3.amazonaws.com/0/88105/237240ca-be6b-f89f-de2d-41773baf5fe4.png)


　・部員ペンタブ体験
　　しずおかアプリ部プログラマーの絵の才能は…
![体験1.png](https://qiita-image-store.s3.amazonaws.com/0/88105/8c3e2eb9-ac15-c35f-f66e-5f57b6ab9938.png)
![体験2.png](https://qiita-image-store.s3.amazonaws.com/0/88105/36147f30-ff99-9b06-f2f1-5d0e91e4b6d8.png)
![体験3.png](https://qiita-image-store.s3.amazonaws.com/0/88105/79d2f6df-35bd-57c3-4185-83fc24393fef.png)


・「Cocos2d-xで作る物理演算ゲーム　～Chipmunk編～」
　<A HREF="http://monolizm.com/sab/pdf/第六回_プレゼン資料(Cocos2d-xで作る物理演算ゲーム　～Chipmunk編～).pdf">第六回_プレゼン資料_保坂(Cocos2d-xで作る物理演算ゲーム　～Chipmunk編～).pdf</A>

　Cocos2d-x + Chipmunkを使って、「チキンが地面に落ちる」をコーディング。
　物理演算用のシーンに重力を設定し、地面オブジェクトとチキンオブジェクトに画像と物理動作を設定。
　実機で実行すると、チキンが地面に落ちるというシュールなシーンが描画された。
caseで遊びたい

```rb:caseで条件分岐をしてみよう
shingo = "桃色"
case shingo
when "赤"
	puts "止まれ"
when "青"
	puts "行け"
when "黄色"
	puts "止まれなければ注意して行け"
else
	puts "帰れ"
end
````

これ、止まれとか行けとかランダムかなんかで
代入されるような形ってどうやるんでしょう
この場合`shingo`の中身が変化するように
avahi-daemon

```bash:インストール
sudo apt-get install -y avahi-daemon
```

avahi-daemon は dbus サービスを必要とするため、
コンテナで動かす場合は dbus サービスを起動しておくこと。

```bash:起動
service dbus start
service avahi-daemon start
```

ホスト名を `〜.local`にしておく。

* /etc/hostname

## 名前解決

avahi-daemon をインストールすると nsswitch.conf が修正されていると思いますが、そうでなければ以下とする。

```text:/etc/nsswitch.conf
hosts:          files mdns4_minimal [NOTFOUND=return] dns
```


## 利用方法

* http://〜.local
* `ssh 〜.local`

でアクセスができるようになる。DHCP環境で活躍。
elf / elfsharp > シンボル文字列テーブルの場所 > .strtab

elfsharpを元にsymbolの読込みは成功した。

問題はシンボル文字列テーブルがどこにあるかということ。

http://softwaretechnique.jp/OS_Development/Tips/ELF/elf01.html
によると
> .strtab 
> このセクションは文字列が格納されています。 だいたいの共通文字列はシンボルテーブルエントリーに関連する名前となります。 オブジェクトファイルにシンボル文字列テーブルが格納されているローダブルセグメント がある場合、そのセクションの属性はSHF_ALLOC ビットが1となり、その他のビットは0となります。

とある。

```bash
$ readelf -S Test.elf
There are 21 section headers, starting at offset 0x24b58c:
Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 2047d0 000000 00      0   0  4
  [ 1] .shstrtab         STRTAB          00000000 2047d0 0000ed 00      0   0  4
  [ 2] .strtab           STRTAB          00000000 2048c0 016a79 00      0   0  4
  [ 3] .symtab           SYMTAB          00000000 21b33c 030230 10      2 10822  4
```
とあり、.strtabにシンボル文字列テーブルが入っているようだ。
elfsharp > private void ReadSymbols()


Symbolsを読込むメインの処理 ReadSymbols()。

[elfsharp/ELFSharp/ELF/Sections/SymbolTable.cs](https://github.com/konrad-kruczynski/elfsharp/blob/0a361d9feaa4b4282c929a3de060198e1385d571/ELFSharp/ELF/Sections/SymbolTable.cs)

```csharp
private void ReadSymbols()
        {
            using(var reader = ObtainReader())
            {
                entries = new List<SymbolEntry<T>>();
                var adder = elf.Class == Class.Bit32 ? Consts.SymbolEntrySize32 : Consts.SymbolEntrySize64;
                for(var i = 0; i < Header.Size; i += adder)
                {
                    var value = 0UL;
                    var size = 0UL;
                    var nameIdx = reader.ReadUInt32();
                    if(elf.Class == Class.Bit32)
                    {
                        value = reader.ReadUInt32();
                        size = reader.ReadUInt32();
                    }
                    var info = reader.ReadByte();
                    reader.ReadByte(); // other is read, which holds zero					
                    var sectionIdx = reader.ReadUInt16();
                    if(elf.Class == Class.Bit64)
                    {
                        value = reader.ReadUInt64();
                        size = reader.ReadUInt64();
                    }
                    var name = table == null ? "<corrupt>" : table[nameIdx];
                    var binding = (SymbolBinding)(info >> 4);
                    var type = (SymbolType)(info & 0x0F);
                    entries.Add(new SymbolEntry<T>(name, value.To<T>(), size.To<T>(), binding, type, elf, sectionIdx));
                }
            }
        }
```

`Consts.SymbolEntrySize32`は以下のように定義されている。

[elfsharp/ELFSharp/ELF/Consts.cs](https://github.com/konrad-kruczynski/elfsharp/blob/0a361d9feaa4b4282c929a3de060198e1385d571/ELFSharp/ELF/Consts.cs)

```csharp
public const int SymbolEntrySize32 = 16;
```
Bootstrap Datetimepicker でページ遷移するとカレンダーが表示されない

インストールとかは省略。
こんな感じでBootstrap Datetimepickerを実装します。

```lang:assets/javascript/bootstrap.js.coffee
$(".datetimepicker").datetimepicker({
    format: 'YYYY年MM月DD日',
    locale: 'ja',
  })
```
viewの方からは以下のように

```lang:hoge.html.slim
    .form-group
      #datetimepicker.input-group.date.datetimepicker
        input.form-control[type="text"]
        span.input-group-addon
          span.glyphicon.glyphicon-calendar
```
そのままだとちゃんとカレンダーのアイコンをクリックするとニョキッとカレンダーが現れます。

んがしかし！ページ遷移をするとなぜだかリロードしないとカレンダーが表示されないんです。
調べてみると、これはRailsのTurbolinksのせいらしい。必要なとこだけ描画するので、jsとかいちいちリロードしない。
参考：[[RailsでjQueryが動かないと思ったら](http://www.workabroad.jp/posts/1133)]
このためにTurbolinksを外すわけにもいかないし…。

で、どうすればいいかというと、coffeescriptに
「$(document).on 'ready page:load', -> 」を付加してやる。これだけ。
StackOverflowにあったこの方法。
[[datepicker does not display the calendar](http://stackoverflow.com/questions/16724524/datepicker-does-not-display-the-calendar)]

```lang:assets/javascript/bootstrap.js.coffee
$(document).on 'ready page:load', -> $(".datetimepicker").datetimepicker({
    format: 'YYYY年MM月DD日',
    locale: 'ja',
  })
```
Zabbix2.2(CentOS7.X)でSNMPTTを設定(Zabbix 2.2 インストール(CentOS 7.X)の続き)

### １、事前準備

■以下のファイルを対象サーバの任意の場所に配置
※本件では/tmp を使用する。
snmptt_1.4.tgz
perl-Config-IniFiles-2.83-4.1.noarch.rpm 
perl-Net-SNMP-v5.0.1-1.pp-rh73.noarch.rpm

### ２、パッケージ のインストール
■yum からインストールを実行

\# yum -y install perl-Crypt-DES perl-Digest-HMAC perl-Digest-SHA perl-Socket6 perl-Crypt-DES

\# yum -y install perl-Sys-Syslog perl-List-MoreUtils perl-IO-stringy
\# yum -y install net-snmp-utils net-snmp-perl perl perl-Net-SNMP perl-Config-IniFiles perl-Module-Build perl-Time-HiRes
\# yum -y install perl-Digest-SHA1
\# rpm -ivh perl-Config-IniFiles-2.83-4.1.noarch.rpm perl-Net-SNMP-v5.0.1-1.pp-rh73.noarch.rpm

\# useradd -s /sbin/nologin snmptt

\# cd /tmp
\# cp -p snmptt_1.4.tgz /usr/src
\# cd /usr/src
\# tar xvfz snmptt_1.4.tgz

\# cd snmptt_1.4

\# cp ./snmptt /usr/sbin
\# cp ./snmptthandler /usr/sbin/
\# cp ./snmptthandler-embedded /usr/sbin/
\# cp ./snmptt.ini /etc/snmp/
\# cp ./snmpttconvertmib /usr/sbin/

\# chmod 755 /usr/sbin/snmptt
\# chmod 755 /usr/sbin/snmptthandler
\# chmod 755 /usr/sbin/snmptthandler-embedded
\# chmod 755 /usr/sbin/snmpttconvertmib

\# mkdir /var/log/snmptt
\# chown snmptt:snmptt /var/log/snmptt
\# mkdir /var/spool/snmptt/
\# chown snmptt:snmptt /var/spool/snmptt/

\# cp snmptt-init.d /etc/rc.d/init.d/snmptt

\# cd /usr/lib/systemd/system
\# pwd

\# touch snmptt.service
\# vi snmptt.service

```
[Unit]
Description=SNMP Trap Translator
Wants=network-online.target
After=syslog.target network-online.target

[Service]
Environment="CONFIG=/etc/snmp/snmptt.ini"
ExecStart=/usr/sbin/snmptt -c ${CONFIG}
ExecReload=/bin/kill -HUP ${MAINPID}
Type=forking
PIDFile=/var/run/snmptt.pid
Restart=always
TimeoutStopSec=320s
KillMode=process
RestartSec=5s

[Install]
WantedBy=multi-user.target
```

\# systemctl daemon-reload

\# cd /usr/src/snmptt_1.4
\# cp snmptt.logrotate /etc/logrotate.d/snmptt

### ３、関連ファイルの設定
■設定ファイルの編集
\# cd /etc/snmp/
\# vi snmptt.ini

以下の様に編集

```
# mode = standalone
mode = daemon

# net_snmp_perl_enable = 0
net_snmp_perl_enable = 1

# net_snmp_perl_best_guess = 0
net_snmp_perl_best_guess = 2

\# date_time_format =
date_time_format = %Y/%m/%d %Y %H:%M:%S

# sleep = 5
sleep = 1

# syslog_enable = 1
syslog_enable = 0
```

■メッセージファイルの編集
\# vi snmptt.conf

以下の様に編集

```
EVENT general .* "LOGONLY" Normal
FORMAT zabbixtrap $aA $ar で未知のSNMP Trapが送信されました。$-*
```

■プロセスを起動
\# systemctl start snmptt
\# systemctl status snmptt
\# systemctl enable snmptt
\# systemctl is-enabled snmptt

■snmptrapdの設定を変更
\# cd /etc/sysconfig/
\# vi snmptrapd

以下の様に編集

```
OPTIONS="-m +ALL -On"
````

■プロセスを再起動
\# systemctl restart snmptrapd
\# systemctl restart snmptt

\# cd /var/log/snmptt/
\# touch snmptt.log
\# chown snmptt:snmptt snmptt.log

■テスト
\# snmptrap -v2c -c <Community> localhost '' .1.3.6.1.6.3.1.1.5.3 test i 0
\# tail /var/log/snmptt/snmptt.log
※　出力メッセージが書き足されていれば成功

### おしまい
RedmineのREST APIを使ったサンプル


* [CSVファイルを読み込んで、REST API経由でRedmineにウォッチャーを追加する](https://gist.github.com/vividtone/271a6a7ece6cfb5f565e)
* [RedmineからREST APIを使って特定のプロジェクトのWikiページのソースをファイルに保存する。
](https://gist.github.com/vividtone/151f0c65036a0d844bd0)
* [CSVファイルを読み込んでRedmineにREST API経由でユーザーを登録する
](https://gist.github.com/vividtone/15ed9b221d4cbd54d744)
* [RedmineからREST APIを使ってユーザーの一覧を取得しCSV形式で出力する](https://gist.github.com/vividtone/712ff4a8d5ece4f606b1)
Dockerコンテナを直接OpenvSwitchに接続するには(lxcドライバ使用)

# dockerのドライバをlxcに変更
dockerサービスを一旦止めて
`service docker.io stop`
再起動(lxcドライバ指定)
`docker -d -e lxc`
端末一個取られるのでscreenとか使っとくべき

# OpenvSwitchでブリッジ作成
`ovs-vsctl add-br ovs-br0`
これだけでOK
ポートとかはコンテナが起動した時に作成する

# Dockerコンテナ起動
## 起動コマンド
```bash:run.sh
docker run -i -t \
--net=none \
--lxc-conf='lxc.network.type=veth' \
--lxc-conf='lxc.network.ipv4=192.168.111.50' \
--lxc-conf='lxc.network.flags=up' \
--lxc-conf='lxc.network.name=eth0' \
--lxc-conf='lxc.network.script.up=/home/ovs_ifup/ovs-br0' \
--lxc-conf='lxc.network.script.down=/home/ovs_ifdown/ovs-br0' \
trema_controller:latest /bin/bash`
```

```bash:ovs_ifup/ovs-br0
#!/bin/bash
sudo ifconfig $5 0.0.0.0 up
sudo ovs-vsctl add-port ovs-br0 $5
```

```bash:ovs_ifdown/ovs-br0
#!/bin/bash
sudo ifdown $5
sudo ovs-vsctl del-port ovs-br0 $5
```


# 参考
* [CentOS6.6でDockerコンテナに固定IPアドレスを付けホストと同じネットワークで使う(ドライバ変更方法)]
(http://www.skyarch.net/blog/?p=3530)
* [OpenvSwitchで仮想ネットワークを作る2(lxcコンテナをOpenvswitchにつなぐ)]
(http://steady-inc.hatenablog.com/entry/2014/05/21/110951)
[Swift] UISearchBar で検索をして結果を表示した後に、スクロールしたらキーボードを隠す・非表示にする

scrollViewの動作時に、searchBarからfirstResponderをとってあげればいいようです。
ここでは、resultSearchControllerがsearchBarのcontrollerになってます。

```swift
override func scrollViewWillBeginDecelerating(scrollView: UIScrollView) {
        self.resultSearchController.searchBar.resignFirstResponder()
}

override func scrollViewWillBeginDragging(scrollView: UIScrollView) {
        self.resultSearchController.searchBar.resignFirstResponder()
}
````
keepalivedのstateとpriority、nopreemptの関係

# はじめに

keepalivedがvrrpで冗長化を行う際に`keepalived.conf`の中で設定する、 `state` と `priority`、あと`nopreempt` について挙動を調べてみました。

こちらに各ノードでstateの設定を行った際に発生する挙動をまとめて頂いていますが、これとpriorityの関係がよくわからなかったのがきっかけです。
http://dev.tapweb.co.jp/2010/12/294

keepalivedのバージョンは以下です。

```
Keepalived v1.2.7 (09/26,2012)
```

# それぞれの値の意味について

まずはおおまかな意味から。

## `STATE` [MASTER|BACKUP]

keepalived起動時に、どちらのstateで起動しようとするか。ただし、一旦起動してもすぐにコンバージョンが行われ、結果的には `priority` の優先順序に従う。

## `priority` (数値)

より値が高いものがMASTERに選出される。

## `nopreempt`

よりpriorityの高いノードがVRRPに参加した時に、MASTER/BACKUPの状態を維持するかどうか。このオプションを設定していると、状態を維持し続ける。設定しないと、より高いpriorityのノードへMASTER stateが移る。state設定を`BACKUP`にしないと効果がない。

# それぞれの値を併用した時の挙動について

全部のパターンを網羅できないので、おおまかに記載します。

## Server1: MASTER 100 , Server2: BACKUP 50 

| 操作 | Server1| Server2|
|------------------------|----------------------------------------|---------------------------------------|
| server1:keepalived起動 | MASTER | (DOWN) |
| server2:keepalived起動 | MASTER | BACKUP |
| server1:keepalived停止 | (DOWN) | MASTER |
| server1:keepalived起動 | MASTER | BACKUP |

よりpriorityの高いServer1が参加した時に、MASTERが移動しています。

## Server1: BACKUP 100 , Server2: BACKUP 50 

どちらのサーバもBACKUP設定に変更します。

| 操作 | Server1| Server2|
|------------------------|----------------------------------------|---------------------------------------|
| server1:keepalived起動 | MASTER | (DOWN) |
| server2:keepalived起動 | MASTER | BACKUP |
| server1:keepalived停止 | (DOWN) | MASTER |
| server1:keepalived起動 | MASTER | BACKUP |

こちらも同様。よりpriorityの高いサーバ側にMASTERが移動します。

## Server1: BACKUP 100 nopreempt, Server2: BACKUP 50 nopreempt

`nopreempt`オプションを追加します。

| 操作 | Server1| Server2|
|------------------------|----------------------------------------|---------------------------------------|
| server1:keepalived起動 | MASTER | (DOWN) |
| server2:keepalived起動 | MASTER | BACKUP |
| server1:keepalived停止 | (DOWN) | MASTER |
| server1:keepalived起動 | BACKUP | MASTER |

前回と違い、サーバが復旧してもMASTER状態だったノードは状態を維持し続けます。

ここまでが概ね通常利用するパターンでしょうか。

## Server1: MASTER 50 , Server2: BACKUP 100 

普通はやらないようなパターンです。
MASTERの方がpriorityが低く、BACKUPの方を高く設定しています。

| 操作 | Server1| Server2|
|------------------------|----------------------------------------|---------------------------------------|
| server1:keepalived起動 | MASTER | (DOWN) |
| server2:keepalived起動 | BACKUP | MASTER |
| server1:keepalived停止 | (DOWN) | MASTER |
| server1:keepalived起動 | BACKUP | MASTER |

よりpriorityの高いサーバが参加した時にMASTERが移動します。その後、MASTER設定のサーバ1が参加しても、サーバ1はすぐにBACKUP stateに移行します。

# conf上のstate MASTER設定は意味があるのか？

こうして見ると、state設定がMASTERだったとしても、結局priorityで判断されるので、果たして`state MASTER`は意味があるのだろうか？と思えてきます。

と思ったら、`man 5 keepalived.conf`にこんな記述が。

> Initial state, MASTER|BACKUP
> As soon as the other machine(s) come up,
> an election will be held and the machine
> with the highest "priority" will become MASTER.
> So the entry here doesn’t matter a whole lot.

そんなに重要じゃないよ、と。

ちなみに、同一priorityの場合は先にkeepalivedを起動していた方がMASTERに選出されます。
Cocos2d-x Android実機転送するときに上書きインストールしたい


Cocos2d-x v3.2 で確認


```bash
cocos run -p android
```

このようにcocos runコマンドを使用すると
古いapkをアンインストールしてから新しく作成したapkをインストールするという動作になる。

そうしないで上書きインストールしたい場合は次のようにする

```bash
cocos compile -p android && adb install -r bin/debug/android/MYPROJECTNAME-debug.apk

```
Neovimとdeopleteを入れる

neovimとかdeopleteとかいうものがあるらしいので試してみました。入れただけとも言う。

# Neovimってなんだ
github: [Neovim](https://github.com/neovim/neovim)
Readme.mdをざっくり日本語にしてみると、
> Neovimは以下の目的のため積極的にvimをリファクタするプロジェクトです

> * メンテナンスを簡単にしてコントリビューションを促進する
* 複数の開発者の間で仕事を分割する
* コアのソースコードの変更なしに新旧のUIの作成を可能にする
* 新しいプラグインアーキテクチャで拡張性を改善

英語があっているか定かではないので、続きはReadme.mdとwikiで。

[Neovim-jp](http://neovim-jp.org/) というものもある、こちらには [NVim と Vim の相違点 - Neovim-jp](http://neovim-jp.org/translations/help/vim_diff.html) があるので読むとなんとなく従来のvimとの違いがわかる

# deopleteってなんだ

github: [deoplete](https://github.com/Shougo/deoplete.nvim)
暗黒美夢王さん作成の、いわばneovim用neocomplete。__まだα版__。バッファにある単語とかファイルパスくらいは補完してくれる

# neovimとdeopleteを入れてみる

deopleteはpython3を含むので、pip3で入れる。

```bash
sudo pip3 install neovim
```

deopleteのようにpythonが必要なものを入れるのでなければhomebrewでもいける。
homebrewで入れてなおかつpythonもやりたい場合は、pythonモジュールが必要らしいが見当たらない。見つかったら教えてください

```bash
brew tap neovim/neovim
brew install --HEAD neovim
```

あとの設定は、neovim用に ```~/.nvim/``` だとか ```~/.nvimrc``` だとかを用意する必要があるが、vimとだいたいいっしょ。

# deopleteを入れてみる

どうやら[neobundle](https://github.com/Shougo/neobundle.vim)がそのままnvimでも使えちゃうっぽいのでそっちが早い。手動で ```~/.nvim/``` 以下に置いてもいい。

```vim:.nvimrc
set runtimepath+=~/.nvim/bundle/neobundle.vim/

call neobundle#begin(expand('~/.nvim/bundle/'))
NeoBundleFetch 'Shougo/neobundle.vim'
NeoBundle 'Shougo/deoplete.nvim'

call neobundle#end()
filetype plugin indent on
NeoBundleCheck

let g:deoplete#enable_at_startup = 1 ":DeopleteEnable実行でもよい
```

neobundle.vimを ```~/.nvim/bundle/``` においたり ```neobundle#begin()``` で ```~/.nvim/bundle``` を指定したりと、ディレクトリが ```.vim``` から ```.nvim``` に変わる以外はいつものneobundleと一緒。

あとはneobundleにdeopleteをダウンロードしてきてもらって、 ```:UpdateRemotePlugins``` とか、 ```:DeopleteEnable``` とかすると入る。

# まとめ
すでに ```.nvimrc``` をgithubにあげている人もいるので参考にしよう

時間が経てばneovim専用プラグインとか出てきてneovim > vimになる日もあるんだろうか。
【Wordpress】ショートコードの作成方法


## 作成方法

便利ショートコードを追加できるプラグインはたくさんあるけど、もうちょっとこうしたいんだよな〜って時がある。

そういった場合は、ショートコードを自作しちゃおう。
例えば、ボタン専用のショートコードを作成したい場合は、functions.phpに以下のように記述するだけ。
これだけでショートコードが作成できる。

```php:functions.php
function shortcode_buttun($arg) {
	extract(shortcode_atts(array (
		'text' => 'お問い合わせ',
		'href' => './',
		'target' => '',
		'type' => 'default'
	), $arg));
	if($target != '') $target = ' target="'.$target.'"';
  return '<button class="l-btn type-'.$type.'"><a href="'.$href.'"'.$target.'>'.$text.'</a></button>';
}

add_shortcode('button', 'shortcode_buttun');
```


## 使い方

functions.phpにショートコード作成のコードを記述したら、投稿ページなどで使用できる。

デフォルトのまま使いたい場合
__[button]__

引数を指定する場合
__[button text=送信! href=http://~ target=_brank]__

## get_template_part()を使う場合

`get_template_part()` は 'require_once()' でロードしているため、投稿の一番上に表示されてしまいます。
`ob_start()` を使い、レンダリングのバッファを取得しておくことで、ショートコードが呼び出されたタイミングでテンプレートを表示することができます。

```
/**
 * LPフォームテンプレートを呼び出すショートコード
 * @return [type] [description]
 */
function hoge_template_shortcode() {
  ob_start();
  get_template_part('./template/hoge');

  return ob_get_clean();
}
add_shortcode('hoge_template', 'hoge_template_shortcode');
```

### 参考
- [関数リファレンス/add shortcode](http://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/add_shortcode)
- [WordPressのショートコードで任意のテンプレートを呼び出す](http://blog.mah-lab.com/2014/05/23/wordpress-shortcode-template/)
[Swift] 文字列の分割

```swift
var str = "a b c"
var arr = split(str) {$0 == " "}
// => [a,b,c]
```

```swift
import Foundation
var arr = str.componentsSeparatedByString(" ")
// => [a,b,c]
```

どっちでもできるけど、下の方が綺麗な感じがします。