OmniAICreator/Qiita-1.07M huggingface dataset:
Node.jsで音声合成するモジュールをつくった


## 概要

[OpenJTalk](http://open-jtalk.sourceforge.net/)という日本語の音声合成エンジンのNode.jsバインディングをつくりました。

リポジトリはこちら。
https://github.com/TanUkkii007/node-openjtalk


## 使い方

"すもももももももものうち"というセリフを読み上げます。

```js
var Speaker = require('speaker');
var OpenJTalk = require('node-openjtalk').OpenJTalk;

var fn_voice = OpenJTalk.voices.mei_normal;
var open_jtalk = new OpenJTalk({voice: fn_voice});

var speaker = new Speaker({
  channels: 1,
  bitDepth: 16,
  sampleRate: 48000
});

open_jtalk.synthesize("すもももももももものうち", function(error, buffer) {
  if (!error) {
    speaker.end(buffer);
  }
});
```

## 感想
Node.jsのネイティブアドオンを初めて作りました。既存のライブラリへのバインディングを作るのは、結構たいへんでした。ビルドを通すまでは移植職人作業で、[このとうりに](https://n8.io/converting-a-c-library-to-gyp/)進めました。ビルドが通ってからはNode.jsのインターフェースに合わせるため、データをBufferオブジェクトで取得するようにしたり、非同期なAPIを用意したりしました。

この大変さを緩和するため、より簡単な[ffiをコアモジュールにする](https://github.com/nodejs/NG/issues/3)ことがNode.jsで検討されているようです。

## 参考文献

ネイティブアドオンを作るときに参考にした文献を紹介します。

+ https://nodejs.org/api/addons.html

公式ドキュメントのネイティブアドオンの項目。このとおりに作ると複数のバージョンのNode.jsで使えないので以下のNANを使う。

+ https://github.com/nodejs/nan

NAN: Node.jsのネイティブAPIの違いを吸収し、記述を簡単にするライブラリ

+ https://github.com/workshopper/goingnative

NodeSchoolのネイティブアドオンの作り方を解説したworkshopper

+ https://n8.io/converting-a-c-library-to-gyp/

node-gypなどのモジュールの作者TooTallNateによるCライブラリをgypに移植するやり方の解説

+ https://github.com/TooTallNate/node-gyp/wiki/%22binding.gyp%22-files-out-in-the-wild

いろいろなプロジェクトのビルド定義ファイルbinding.gypを集めたwiki。このなかでもnode-canvas, node-sqlite3, node-leveldownをよく参考にしました。

+ https://github.com/mapbox/node-pre-gyp

node-pre-gypというnode-gypに変わるネイティブアドオンのビルドツール。node-openjtalkではnode-pre-gypを使いました。

+ http://enginetrouble.net/2013/07/getting-started-with-gyp.html
+ http://enginetrouble.net/2014/01/gyp-basic-functions.html

mogemimiさんによるgypの使い方の貴重な日本語の資料
Chainerで機械学習と戯れる： ２進法を学習できるか？


はじめに
=========

先日[Chainer](http://chainer.org/)というDeepLearning用のフレームワークが公開されました。

Chainerは Pythonで非常に多種多様なDeepLearningの構造を簡潔に表現して、学習・評価をすることができる素晴らしいソフトウェアだと思います。

王道な使い方はChainerのチュートリアルや下記記事などを見るとよくわかると思います。
[【機械学習】ディープラーニング フレームワークChainerを試しながら解説してみる。](http://qiita.com/kenmatsu4/items/7b8d24d4c5144a686412)

私は子供の頃からAIのようなものに憧れていて、特に [GoogleのDQN](http://wired.jp/2015/02/28/google-deepmind-atari/) は非常に驚きました。
ブロック崩しのようなゲームにおいて「ピクセルとゲームスコアの情報のみがフィードバックとして与えられた」AIが人間を凌駕する腕前に成長するとかちょっと何言っているのかわからない感じに凄いです。

そういうものはどのようにしたら実現できるのか、という興味から、
どういう問題ならDeepLearningで学習できるのか（私の技術レベルで ^^;）というのを
このChainerを使って探っていきたいと思います。
最終的には簡単なシミュレータ（言ってみればある種のゲーム）を操作する用なものが作れたら良いなぁと思います。

まあ、いきなり難しいことをやるのは大変なので、非常に簡単なモノから試していこうと思います。

お題：２進法を学習できるか？
==================

問題
-------
今回は N bit の入力を、対応する $2^N$個のどれかに出力するという問題を考えます。
中間の隠れ層は１層(H1)、もしくは、無しで試してみます。図にしてみるとこんな感じです。

![chainer_key.png](https://qiita-image-store.s3.amazonaws.com/0/11124/206caa60-0506-a08b-9765-91ad0a5b143c.png "chainer_key.png")

実験
------
使っているのは Chainer の基本的な機能だけなので説明は省きます。

[実験用のソースコード](https://github.com/mokemokechicken/PlayingChainer/blob/master/src/play1/binary.py)はこちらになります。

仕様がわかっていなかったので、学習用のデータを手作りするのが少し手間取りました。

`F.softmax_cross_entropy(y, t)` `F.accuracy(y, t)` では

* yは: ２次元で dtype=np.float32 の numpy.array を Variable にしたもの
* tは: １次元で dtype=np.int32   の numpy.array を Variable にしたもの

を作る必要がありました。
ドキュメントもそれなりに充実していますし、わからないときはドキュメントからリンクされている[Chainerのソースコード](http://docs.chainer.org/en/latest/_modules/chainer/functions/softmax_cross_entropy.html#softmax_cross_entropy) を見るとある程度簡単に調べられます。

結果
-------

最初N=4で実験してみると中間層H1なしでもあっさり学習出来ました（正答率１００％）。
当然H1を増やしても学習可能です。
ここで躓いたらどうしようと思っていましたが、とりあえず良かったです。

### Bit数と学習回数

Nはどこまでいけるのかな、と思い、N=5,6,7 と増やしていくと学習にかかる時間（回数）が増えていきました。
中間層が無い場合にNを変化させた時の学習回数は以下のようになりました。
![スクリーンショット_2015_07_11_15_46.png](https://qiita-image-store.s3.amazonaws.com/0/11124/c94eec7e-3f43-169d-27ac-99e5aa4ba7f1.png "スクリーンショット_2015_07_11_15_46.png")
指数オーダーで増えていく感じに見えます。結果が出てみるとある意味納得です。

### 中間層H1の効果

中間層をある程度与えると、学習にかかる回数が減っていきます。
それをまとめたのが以下のグラフになります。

![スクリーンショット_2015_07_11_15_50.png](https://qiita-image-store.s3.amazonaws.com/0/11124/12ba470e-f2fd-0943-e7c8-26603fb822da.png "スクリーンショット_2015_07_11_15_50.png")

Excelが苦手でちょっと見にくいですが、H1がある程度ある方が早く学習が終わることが見て取れます。

### 生結果
| N(bit) | H1 size | 回数
|-----------:|------------:|------------:|
|4 | 0	 | 3567	    
|4 | 4	 | 3285	    
|4 | 8	 | 1586	    
|4 | 16	 | 947	    
|4 | 16	 | 914	    
|5 | 0	 | 6948	    
|5 | 5	 | 6219	    
|5 | 10	 | 3216	    
|5 | 20	 | 2303	    
|5 | 32	 | 1336	    
|6 | 0	 | 16606    
|6 | 6	 | 8360	    
|6 | 12	 | 6076	    
|6 | 24	 | 3392	    
|6 | 64	 | 1447	    
|7 | 0	 | 35822    
|7 | 7	 | 11889    
|7 | 14	 | 12936    
|7 | 28	 | 6192	    
|7 | 128 | 	2459    

さいごに
=====

Chainerお手軽で楽しいです。
できて当然のようなことでも、なんか実際にできると嬉しいです。

[次回:加算と減算を同時に学習できるか？](http://qiita.com/mokemokechicken/items/81cea0ea2400451acf0d)
postgreSQLの構築

##アンインストール

1.homebrewでインストールしたpostgresqlを削除

```bash
	brew uninstall postgresql
```

2.データベースクラスタの削除

initdbで初期化する際、既に存在する場合にエラーとなるので、事前にフォルダを削除しておく必要がある。

```bash
	rm -rf /usr/local/var/postgres
```

##インストール
1.homebrewでインストール

完了するまで待機（make処理等で5分くらい掛かる）

```bash
	brew install postgresql
```

2.データベースクラスタの初期化

英語、日本語圏ではlocale設定は意味がないので使用しない。
（ソート処理が遅くなる等の弊害があるので--no-localeオプションを忘れずにつけること）


```bash
	initdb /usr/local/var/postgres -E utf8 --no-locale
```


データベース一覧が取得出来ればインストール成功

```bash
	psql -l
```

3.自動起動の設定

```bash
	ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents
	launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
```


4.環境変数の設定

環境変数PGDATAの設定。bashなら~/.bash_profile

```~/.bash_profile
	export PGDATA=/usr/local/var/postgres
```


## 参考サイト


　ロケールの設定要否について
　http://www.atmarkit.co.jp/ait/articles/0806/10/news144_2.html


http://codenote.net/mac/homebrew/187.html
http://masutaka.net/chalow/2014-02-01-1.html
http://succzero.hatenablog.com/entry/2014/09/21/133315
http://morizyun.github.io/blog/postgresql-mac-centos-rails/
http://b.pyar.bz/blog/2014/10/21/mac-postgresql-installation/
Gemのインストール、バージョン指定など

Gemコマンドを使う頃によく忘れているのでメモしておきます。

# Gemをインストール
特定のgemをインストール時はgemの名前を指定してインストールします。

```bash:gemのインストールコマンド
gem install gemの名前
```
例えばGemのbundlerをインストールは以下のように書きます。

```bash:bundlerをインストール
gem install bundler
```

## バージョンを指定してインストール

```bash:バージョンを指定してgemをインストール
gem install gemの名前 -v バージョン
```
以下はsqlite3のバージョンを指定してインストールした例です。

```bash:sqlite3をインストール
gem install sqlite3 -v "1.3.8"
```

# Gemをアンインストール
特定のgemをアンインストールする場合は `gem uninstall` でgem名を指定します。

```bash:gemのアンインストールコマンド
gem uninstall gemの名前
```

bundlerをアンインストールする例です。

```bash:bundlerをアンインストール
gem uninstall bundler
```

```bash:バージョンを指定してbundlerをインストール
gem uninstall bundler -v '1.8.5'
```

# Gemをupdate
updateした場合、最新バージョンにgemがupdateされるとおもいます。

```bash:gemのアップデートコマンド
gem update gemの名前
```
例えばGemのsqlite3のアップデートは以下のように書きます。

```
gem update sqlite3
```
つまりバージョン指定をしたい場合は、`gem install`を利用するということでしょうか。
マルチスレッド環境下での「RuntimeError: Circular dependency detected while autoloading constant xxxx」を解消した話


## 検証環境

- Rails 4.1.5
- sidekiq 3.3.2

## 事象

sidekiqでマルチスレッド処理を実行中に、autoload_pathにアクセスしたところ、下記のエラーが発生

```
    Circular dependency detected while autoloading constant Lib::MyConstant
```    

## 原因

[これ](https://github.com/rails/rails/issues/15089#issuecomment-56104328)かな。。。?

>constant autoloading works fine if constants are loaded in a sequential way. I have never seen a problem with constant autoloading that didn't uncover something wrong in the application code.


定数のautoloadingは定数がシーケンシャルにロードされる時は正常に動作する。

[ここ](https://github.com/rails/rails/commit/112077c255879351edf4530791cc4bcc7bd4005b)によると、

>If code is not eager loaded constants are loaded on demand. Constant
autoloading is not thread-safe, so if eager loading is not enabled
multi-threading should not be allowed.

eager_loadされていない定数は、必要に応じてloadされる。定数のautoloadingはthread-safeではない。
従って、eager loadingが有効になっていない場合はmulti-threadingは許容されない。


 [Rails・マルチスレッド環境で「RuntimeError: Circular dependency detected while autoloading constant xxxx」が発生する](http://www.jmuto.info/2014/04/ruby-small-story-collection.html)


## 対応

autoload_pathsではなく、eager_load_pathsを使用するように変更してみた。


### 検証用スクリプト

```
namespace :test do
  desc 'autoload with multi thread.'
  task autoload_multithread: :environment do

    t1 = Thread.new { Lib::MyConstant }
    t2 = Thread.new { Lib::MyConstant }

    t1.join
    t2.join

  end
end
```



### 変更前


```
  config.autoload_paths += %W(#{config.root}/lib/)
```

検証スクリプトでエラーが発生することを確認


### 変更後

```
  config.eager_load_paths += %W(#{config.root}/lib/)
```

eager_loadを使用して、事象が解消する事を確認できた!


## 参考資料

- [sidekiq wiki FAQ](https://github.com/mperham/sidekiq/wiki/FAQ)
- [How to Fix Circular Dependency Errors in Rails Integration Tests ](https://robots.thoughtbot.com/how-to-fix-circular-dependency-errors-in-rails-integration-tests)


- [Don't forget about eager_load when extending autoload paths](http://blog.arkency.com/2014/11/dont-forget-about-eager-load-when-extending-autoload/)
- [rails autoload and eager load paths](https://tam7t.com/rails-autoload-and-eager-load-paths/)
- [confusing about autoload_paths vs eager_load_paths in Rails 4](http://stackoverflow.com/questions/19773266/confusing-about-autoload-paths-vs-eager-load-paths-in-rails-4)
ActiveModel::AttributeMethods で重複をなくす

# AttributeMethods のできること

指定した属性に対して、まるっと同じ機能を実装する事が出来ます。
例えば、こんな感じ

```rb
class Person
  include ActiveModel::AttributeMethods

  attr_accessor :name, :age, :address
  attribute_method_prefix 'clear_'
  define_attribute_methods :name, :age, :address
  
  def initialize(name:, age:, address:)
    @name = name
    @age = age
    @address = address
  end

  private

  def clear_attribute(attr)
    send("#{attr}=", nil)
  end
end

person = Person.new
person.name = 'Bob'
person.name         #=> "Bob"
person.clear_name
person.name         #=> nil
person.age = 20
person.clear_age
person.age          #=> nil
```

複数の属性に共通の処理をさせたいとき、重複なく書けていいですね。
そんな、`AttributeMethods` にあるメソッドを紹介します。

# `attribute_method_prefix(*prefixes)`

`define_attribute_methods` で宣言した、各属性に対して、prefix を付加したメソッドを定義出来ます。
メソッドの定義は `#{prefix}_attribute` で定義して、属性名を第一引数に取ります。

```rb
class Person
  include ActiveModel::AttributeMethods

  attr_accessor :name
  attribute_method_prefix 'titleize_'
  define_attribute_methods :name

  private

  def titleize_attribute(attr)
    original = send(attr)
    titleize_str = original.split(' ').map(&:capitalize).join(' ')
    send("#{attr}=", titleize_str)
  end
end

person.name = 'tanaka taro'
person.titleize_name
person.name          #=> "Tanaka Taro"
```

# `attribute_method_suffix(*suffixes)`

名前から分かるように上の suffix 版です。`attribute_#{suffix}` を定義することが出来ます。

```rb
class Person
  include ActiveModel::AttributeMethods

  attr_accessor :name
  attribute_method_suffix '_short?'
  define_attribute_methods :name

  private

  def attribute_short?(attr)
    send(attr).length < 5
  end
end

person.name = 'Bob'
person.name_short? # => true
```

# `attribute_method_affix(*affixes)`

そして、prefix と suffix の両方をつけたいときです！

```rb
class Person
  include ActiveModel::AttributeMethods

  attr_accessor :name
  attribute_method_affix prefix: 'reset_', suffix: '_to_default!'
  define_attribute_methods :name

  private
  
  def reset_attribute_to_default!(attr)
    send("#{attr}=", 'Default Name')
  end
end

person.name = 'Bob'
person.reset_name_to_default!
person.name                   #=> "Default Name"
```

# 中を見てみる

上の三つで、まるっと便利にメソッドを定義出来ますが、一体こいつらがどんな事をやっているのかを見てみると、やはりお得意の [method_missing](http://qiita.com/pekepek/items/0b907f4d3e6ae2711569) を使ってます。

```rb
def attribute_method_prefix(*prefixes)
  self.attribute_method_matchers += prefixes.map! { |prefix| AttributeMethodMatcher.new prefix: prefix }
  undefine_attribute_methods
end
```

定義したいメソッド名を宣言する `attribute_method_prefix` です。中を見ると `AttributeMethodMatcher` のインスタンスを繰り返し作ってますね。

```rb
class AttributeMethodMatcher
  ...

  def initialize(options = {})
    @prefix, @suffix = options.fetch(:prefix, ''), options.fetch(:suffix, '')
    @regex = /^(?:#{Regexp.escape(@prefix)})(.*)(?:#{Regexp.escape(@suffix)})$/
    @method_missing_target = "#{@prefix}attribute#{@suffix}"
    @method_name = "#{prefix}%s#{suffix}"
  end

  ...
end
```

`AttributeMethodMatcher` が作られると `@regex` に正規表現を挿入してる事がわかります。この正規表現にマッチするものを `method_missing` でキャッチして、ゴリゴリとメソッドを呼び出しているんですね。

# おわり

`AttributeMethods` で、いろいろと DRY に実装できそうですね。んーそれにしても `method_missing` は便利すぎて恐ろしいなあ。
Swift 2.0 移行で出るエラーと解決方法まとめ

ざっくりとまとめていきます。随時追加予定

### CFString とかが Dictionaryのキーとしてそのまま使えなくなった

```swift
let dictionary = [
  ...,
  kCTParagraphStyleAttributeName: style
]
```

エラー:
> '_' is not convertible to 'CFString'

修正:

```swift
let dictionary = [
  ...,
  kCTParagraphStyleAttributeName as String: style
]
```

補足:
Objective-CクラスからSwiftクラスへの自動変換がされなくなったらしい。
http://stackoverflow.com/questions/29874625/dictionary-now-gives-error-not-convertible-to-booleanliteralconvertible-since

### optionを指定するところで .allZeros が無くなり、 かわりに[]を渡すように

```swift
let regex = NSRegularExpression(pattern: pattern, options: .allZeros, error: nil)
```

エラー:
> Could not find member 'allZeros'

修正:
```
swift
let regex = NSRegularExpression(pattern: pattern, options: [], error: nil)
// 注意: まだこれでもエラー。次項参照
```

補足:
RawOptionSetTypeがOptionSetTypeに置き換えられて、複合オプションの表現がビットマスクからArrayに変更になったため

### &NSError を渡していたところが軒並み try catch に移行

↑の修正をしてもまだエラーがでます

```swift
let regex = NSRegularExpression(pattern: pattern, options: [], error: nil)
```


エラー:
> Could not find an overload for 'init' that accepts the supplied arguments

修正:

```swift
do {
  let regex = NSRegularExpression(pattern: pattern, options: [])
  ...
} catch let error as NSError {
  ...
}
```

### count(), countElements() がlengthプロパティに

```swift
// swift 1.1
let count = count(text)

// swift 1.2
let count = countElements(text)
```

エラー:
> // count()
> 'count' is unavailable: access the 'count' property on the collection
> // countElements()
> use of unresolved identifier 'countElements'

修正方法:
```swift
let len = text.length
```

何回変わるんだ・・・
Ubuntu GNOME 15.04のインストールから日本語入力環境構築まで

Ubuntu GNOME 15.04のインストールから日本語入力環境の構築までをメモ。

ISOイメージをダウンロードして、インストーラに従ってインストール。
https://wiki.ubuntu.com/UbuntuGNOME/GetUbuntuGNOME

言語は日本語を選択。

インストール完了後、Mozcのインストール。

```
sudo apt-get install mozc-utils-gui ibus-mozc
```

再起動しないとUbuntuの設定メニューにMozcが反映されないため、再起動。

```
sudo shutdown -r now
```

「設定」→ 「地域と言語」を開き、【入力ソース】の「+」ボタンをクリック。

アイテムの一番下にある「その他」をクリックし、検索ボックスに「mozc」を入力。

「日本語（Mozc）」が現れるので選択して右上の「追加」ボタンをクリック。

これで入力ソースにMozcが追加された。

適当なエディタを開き、Super + Spaceキーで入力ソースをMozcに変更し、日本語が入力できるか確認。
FuelPHP:アクセス制御機能のOrmauth概念モデル

![アクセス制御概念モデル](https://lh3.googleusercontent.com/rwjxO70YGMBlCU4Z0K-jihUGMT6xO3m4h1b-9IKlrig=w2444-h1730-no "アクセス制御概念モデル")

[拡大](https://photos.google.com/share/AF1QipMSjyqB0_NSFcjJxxYk5LyCSCXC_n8fJ2EOfhqTHTwc1c5NTV1H7wMP0u80TqWlTA/photo/AF1QipPIeINXRbg1vZ5oKOMT8NGVgVdNb-qVc4qDPKJj?key=WHYzQS05ZVBGbFdRMkZILUhWdEhrRjJJUGpjWkpB "アクセス制御概念モデル")

[ACCON](https://kurobuta.jp/books/book/manual/accon//?id=19 "ACCONマニュアル")のアクセス制御（認証・認可）機能は、このOrmauthをベースに作成（管理画面を含む）しています。

* [ACCONのクラス図](http://qiita.com/maemori/items/179d47e23bc3265f6bdd)

* [FuelPHPとACCONの関連を表現したクラス図](http://qiita.com/maemori/items/6a5b3c9a8b92195550ba)
Mediawikiがデプロイ先で500エラーを起こす時に真っ先に確認すること

開発中のMediawikiをWebStormの「Deployment」機能やFTPクライアントなどを使用してデプロイすると「500 Internet Server Error」が生ずる場合があります。

これは、リモートにアップロードされた```Localsettings.php```の設定の内容がローカルのままで、かつ```php maintainance/update.php```の実行によるが```Localsettings.php```の設定が未反映であることによって引き起こされます。

具体的には、

```
#$wgScriptPath = "http://my.domain.com";
$wgScriptPath  = "http://localhost/mwiki";

#$wgServer = "http://my.domain.com";
$wgServer  = "http://localhost/mwiki";
```
といったパスがリモート／ローカル間で切り替わっていないですとか、

```
## Database settings
$wgDBtype     = "mysql";
$wgDBserver   = "localhost";
$wgDBname     = "mediawiki";
$wgDBuser     = "root";
$wgDBpassword = "passForLocal";
```
といったDBの設定がリモート／ローカルで異なることによって引き起こされます。

具体的な解決手順としては次の通りです。
1. リモート上の```LocalSettings.php```をリモート向けに再設定する
2. ```php maintainance/update.php```を実行する
これでも同じエラーが残る場合、再設定した内容に問題があるか、別の原因が考えられます。

また、同じトラブルの再発防止策として、例えばWebStormなら```LocalSettings.php```のような特定のファイルを指定してアップロード対象外にする設定を使用するですとか、手動でアップロードする際はアップロードするファイルに注意を払うといったヒューマンエラーの防止といった方法が考えられるでしょう。
unity > csharp > transform.positionの変更 

http://dotinstall.com/lessons/basic_unity/24614
javasciptで以下のように説明している。

```
transform.position.y += 0.1f;
```

transform.positionを直接変更しようとしても、c#ではエラーとなる。
http://answers.unity3d.com/questions/19888/transformposition-error.html

代わりの実装が以下。

```csharp
	void Update () {
		if (Input.GetKeyUp("space")) {
			Vector3 newPos = transform.position;
			newPos.y += 0.1f;
			transform.position = newPos;
		}
	} 
```
mackerel-plugin-fluentd-monitor を作った

mackerel-plugin-fluentd-monitorを作りました。

https://github.com/najeira/mackerel-plugin-fluentd-monitor

## 背景

Fluentdのoutputプラグインはバッファを持っており、inputから受け取ったデータを保持しています。このデータは設定された間隔や量に達することなどで送信されます。

設定がよくなかったり、あるいはoutput先への送信が失敗したりすると、このバッファはどんどん溜まることになります。

そこで、バッファの状態をモニタリングできると便利です。

## 使い方

### Build

GitHubからソースを取得し、`go build`してください。
現時点ではリポジトリにはリリース用のバイナリは用意していません。

### Fluentd

monitor_agentを有効にします。

```
<source>
  type monitor_agent
  bind 0.0.0.0
  port 24220
</source>
```

outputのプラグインにidを設定します。

```
<match *>
  id    your_plugin_id
  type  forward
  ...
</match>
```

mackerel-plugin-fluentd-monitor は「outputプラグインである」かつ「idが設定されている」という両方の条件を満たすプラグインのメトリックをMackerelに送信するようになっています。

よって、監視したいプラグインにはidを設定する必要があります。


### Mackerel

mackerel-agent.conf への記述例:

```
[plugin.metrics.fluentd-monitor]
command = "/usr/local/bin/mackerel-plugin-fluentd-monitor"
```

mkrを使ってサービスメトリックに登録する例:

```
/usr/local/bin/mackerel-plugin-fluentd-monitor | /usr/local/bin/mkr throw -service=yourservice
```

これをシェルスクリプトにしてcronに設定するなど。


## 解説

### monitor_agent

Fluentdはmonitor_agentというプラグインを内蔵しています。
http://docs.fluentd.org/articles/monitoring

以下の例のように、バッファに関連する buffer_queue_length, buffer_total_queued_size, retry_count といった値を取得することが出来ます。

```json
{
  "plugins":[
    {
      "plugin_id":"your_plugin_id",
      "type":"forward",
      "output_plugin":true,
      "buffer_queue_length":27746,
      "buffer_total_queued_size":1,
      "retry_count":0,
      "config":{ ... }
    },
    ...
]
```

設定の詳細はfluentdのドキュメントを読んでください。

本プラグインは上記のJSONを取得したあと、Mackerelに送信できる以下の形式を出力します。

```
fluentd.buffer.retry.your_plugin_id	0	1436424545
fluentd.buffer.queue.your_plugin_id	1	1436424545
fluentd.buffer.size.your_plugin_id	27746	1436424545
```
qiitaの新着記事をslackで読む 〜 RSSリーダ

#はじめに
Slackを遅まきながら使ってみた :tada: のでなにかしたかった :grimacing: のです。
単純な使い方をしたかったので、slackbotの`/feed`からやってみました。

#feedを追加
##(1)チャンネルを追加
![スクリーンショット-2015-07-11-12.40.28.png](https://qiita-image-store.s3.amazonaws.com/0/12362/7a62b7ff-a2ec-8d10-f01d-02e246f670f9.png)

##(2)feedを追加

>/feed feedのパス

タグ
`/feed http://qiita.com/tags/[タグ名]/feed.atom`

個人
`/feed http://qiita.com/[ユーザID]/feed`

![スクリーンショット-2015-07-11-12.41.37.png](https://qiita-image-store.s3.amazonaws.com/0/12362/b5d58d78-2e0b-d538-51cb-ee26f50ee6ef.png)

![スクリーンショット-2015-07-11-12.51.35.png](https://qiita-image-store.s3.amazonaws.com/0/12362/857482bf-4f1e-0e06-f3dc-80681e9cd6b1.png)

#他にも使えそうなfeed
Free版だと使える`integration`が5個までなので、代替ができればそちらの方がいいのかも

![スクリーンショット-2015-07-11-13.30.41.png](https://qiita-image-store.s3.amazonaws.com/0/12362/8d3f002a-4d93-a038-b72f-e06899f229c5.png)


##github
https://github.com/{username}/{repo}/commits/master.atom
https://github.com/{username}/{repo}/commits/{branch-name}.atom


#参考URL
http://qiita.com/tukiyo3/items/5b1051e63c7a32bfa48b
http://webapps.stackexchange.com/questions/65925/tracking-github-commits-using-rss
#さいごに
手間も頭も使わずに良い感じです。該当記事のサムネイルとかほしい。

qiita:TeamにWebhookがある。
https://qiita.com/api/webhook/docs
Ubuntu 14.04 LTS で CUDA 7.0 環境を整えたときにひっかかったこと。

# 一筋縄でいかなかったので記録。

## ハードウェア

<dl>
<dt>CPU</dt><dd>Intel i7 4770K</dd>
<dt>グラボ</dt><dd> MSI N780GTX-Ti Twin Frozr 4S OC</dd>
<dt>マザー</dt><dd>MSI MSI H87-G41 PC Mate</dd>
<dt>電源</dt><dd>KRPW-GP650W/90+</dd>
<dt>ケース</dt><dd>CORSAIR Carbide Series Air 540</dd>
</dl>

上記の部品＋αで自作。問題なく終了。


## やりたいこと
* Nsight( NVIDIA が提供する Eclipse + Cuda 開発環境 )での開発
* GTX 780 Ti を Cuda 専用に

## ひっかかったこと
* Intel i7 4770K の内臓グラフィックス(HD Graphics 4600)を Ubuntu のデスクトップ表示用にして、GTX 780 Ti を Cuda 専用にと考えていた。
* Ubuntu をインストールまではうまくいく。
* CUDA を動かすためには NVIDIA のドライバをインストールする必要がある。
* NVIDIA のドライバをインストールするには Ubuntu についてる Nouveau ドライバを排除する必要がある。
* しかしNVIDIA のドライバは内臓グラフィックスとの相性が悪いようで、インストールするとデスクトップが正常に表示されない.
* Nouveau ドライバと NVIDIA ドライバを混在させて、デスクトップは Nouveau ドライバ、CUDA 側は NVIDIA ドライバにする設定を探したが、なさそうなので諦めた（あったら知りたい）。

## 解決策
* NVIDIA のグラボで安いやつ（GTX 510）をもう一枚買ってデスクトップ表示用にして、HD Graphics 4600 を使わないことにした。

## 再度ひっかかったこと
* GTX510 のグラボを PCI-E x1 にしたので迷わず x1 のスロットに刺したのだが、x16 に刺してある GTX780ti の方から出力されてしまった。
* マザーボードの設定にこの優先順位を変えるメニューはなかった。

## 再度解決策
* x16 のスロットに x1 のカード刺しても大丈夫なのを思い出して、２個あるうちの優先順位の高い方の x16 にGTX510 を刺した。

## 感想
* 目論んでいた Nsight でデバイスコードのデバックの機能がまだβで固まったりする。
* ケースを大きめのにしておいてよかった。
* どうせ秋に Intel の Skylake の CPU がでたら、また自作機つくるなー
* NVIDIA GTX TITAN X 買っちゃおうかなー
* ２枚買っちゃおうかなー
* そしたらグラボ４枚になるから PCI-e 16x が４本いるなー
* グラボ、２スロット占有するから、ATX Entended のマザーだなー
* いよいよ水冷かなー

金銭感覚を麻痺させてがんばります。
数値をNSStringにキャストする方法（検証つき）


## 2つの方法
全部で2つってことではないですが、代表的なものとして以下があります。

### A: stringWithFormatを利用する

```objectivec
NSInteger num = 100;
NSString *str = [NSString stringWithFormat:@"%ld",num];
```

これは入門書などにも多く書かれていて一般的です。
（Cっぽい）


### B: NSNumerを利用

```objectivec
NSInteger num = 100;
NSString *str = @(num).stringValue;
```

こっちの方が割とわかりやすいかなって個人的には思います。
（Javaっぽい）

```
@(n)
```
この部分はリテラル表記を使っていて

```
[NSNumber numberWithInt:n]
```
と同じです。

したがって、NSNumberのstringValueメソッドでキャストすることができます。

## 検証

書く量が減るので __B__ 一択だろと思ってましたが、
ふと本当にいいのか？パフォーマンス大丈夫なのか？と思ったので軽い検証をしました。

`100` というログを10000回吐くまでの時間を計測しました。
計測はXcode 6から `XCTest.framework`に追加されたメソッドを利用しました。

結果は以下のようになりました。

![Kobito.AcKlPY.png](https://qiita-image-store.s3.amazonaws.com/0/42743/088dd8da-a6c8-cd45-b87a-ca657e66a209.png "Kobito.AcKlPY.png")

倍近くかかってます。
結果は面倒なので載せませんが、複数回行ったところ大体同様な結果が得られました。

Bが倍近くかかった原因としては
`NSInteger -> NSString`ではなく `NSInteger -> NSNumber -> NSString`と2回キャストを行っていることが挙げられます。

## まとめ
- 数値からNSStringへのキャストには大きく2つある
- NSNumberを利用した方がいちいちフォーマットを書く必要がなくてなんとなく楽
- 単体で言えば差は 0.1595ms

個人的には基本はBを使って、パフォーマンスを意識したい部分、文字と組み合わせる部分ではAかなと思ってます。
UIButtonでヒラギノフォントが切れる対策（追記あり）

**追記**
[簡単な方法がありました。](http://qiita.com/Sasakky/items/0243ed45113f8797e81e#%E8%BF%BD%E8%A8%98-20150718)


## 現象
UIButtonでヒラギノフォントを使用したとき
英字の `g` `j` などが画像のように切れてしまう問題があります。

![image](https://qiita-image-store.s3.amazonaws.com/0/42743/5bdc7f7e-6fe3-c4e0-fca2-e4c6b1c1a54f.png)

これはヒラギノのサイズが正確に取得できておらず、viewのframeが小さく設定されていることが問題です。

UIButtonのtitleLabelは自動で `sizeToFit`されてしまうため、frameの変更を行っても適応されないようです。

## 解決
ちょっとしたハックですが以下のようにします。

### Swift
```swift
let buttonText = "abcdefghijklmnopqrstuvwxyz"
let attributes = [
    NSBaselineOffsetAttributeName: NSNumber(float:1.0)  // buttonの文字をベースラインからgの下が入るように上にずらす
]
let attrText = NSAttributedString(string: buttonText, attributes: attributes)
self.button.setAttributedTitle(attrText, forState: UIControlState.Normal)
self.button.contentEdgeInsets = UIEdgeInsetsMake(2.0, 0, 0, 0); // button内で文字を元の位置に戻す

```


### Objective-C
```objectivec
NSString *buttonText = @"abcdefghijklmnopqrstuvwxyz";
NSDictionary *attributes = @{
                             NSBaselineOffsetAttributeName: [NSNumber numberWithFloat:1.0]  // buttonの文字をベースラインからgの下が入るように上にずらす
                             };
NSAttributedString *attrText = [[NSAttributedString alloc] initWithString:buttonText attributes:attributes];
[self.button setAttributedTitle:attrText forState:UIControlStateNormal];
self.button.contentEdgeInsets = UIEdgeInsetsMake(2.0, 0, 0, 0); // button内で文字を元の位置に戻す
```


これで綺麗に表示されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/42743/5bb10e47-3e9c-44f7-2920-40de07a84a41.png)


※ 色やサイズを変更したい場合はattributesに追加する

## 追記 2015/07/18
いろいろ悩んでましたが、もっと簡単に解決できたのでこちらを紹介

### Swift
```swift
self.button.contentVerticalAlignment = UIControlContentVerticalAlignment.Fill;
```

### Objective-C
```objectivec
self.button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
```

これは UIButtonのSuperClassのUIControlにあるプロパティで、内部のテキストや画像をボタンのframeいっぱいに表示することができるものです。

簡単だった… orz

## 参考
- http://qiita.com/yusuga/items/2be8c55ca561bba44702
mail コマンド 送信認証設定

カレントに 「.mailrc」を作成
\# cd ~
\# vi .mailrc
***
set smtp=smtp://mail.testcom.net:587
set smtp-auth=login
set smtp-auth-user=user001@testcom.net
set smtp-auth-password=your pasword
set from=user001@testcom.net
***

テストメール送信
\# mail -s "Test mail Sending" userhoge@sendtest.net
Exchange 送信スマートホスト サブミッション(587）設定

##外部送信用スマートホスト MTAへのサブミッション設定
検索チャームで 「Exchange Management Shell」を探して起動

現在の送信ポートを確認
\>Get-SendConnector -Identity "InternetRoute" | fl

サブミッション(587)に変更
\>Get-SendConnector -Identity "InternetRoute" | Set-SendConnector -Port 587
ZabbixでSSL証明書の有効期限を監視する

zabbix-agentでsslの証明書の有効期限を監視するため、
UserParameterに残り日数を出力するコマンドを書きました。

##2015/10/22 更新
UserParameter に -servername $1 を追加しました。
 [ZabbixでSSL証明書の有効期限監視(１つのサーバーに複数のホストがあるとき)](http://qiita.com/manabuishiirb/items/e958dab61bcde1d788c7#comment-44b33481b95bfee11298)

##Zabbixのアイテム設定
```
タイプ: Zabbixエージェント
キー: cert_expire_check[host,port,timeout]
データ型: 数値(整数)

host: 接続先ホスト名
port: 接続先ポート名
timeout: opensslコマンドで接続する時のタイムアウト秒
※3項目とも設定必須
```

##zabbix-agentd.confへの設定追加
```conf:zabbix-agentd.conf
Timeout=10
UserParameter=cert_expire_check[*],export UTIME=$(date +%s); expr $(( $(date --date "$(timeout $3 openssl s_client -connect $1:$2 -servername $1 < /dev/null 2>/dev/null| openssl x509 -text 2>/dev/null | awk -v UTIME=$UTIME '/Not After :/{if($$0~/N/){print $$4,$$5,$$6,$$7,$$8}else{print "@"UTIME}}')" +%s) - $UTIME )) / 86400

```
##zabbix_getでテスト
```test:zabbix_get
正常系
$ /usr/local/zabbix/bin/zabbix_get -s localhost -k cert_expire_check[ma3ki.net,443,5]
14
$ /usr/local/zabbix/bin/zabbix_get -s localhost -k cert_expire_check[ma3ki.net,465,5]
14
$ /usr/local/zabbix/bin/zabbix_get -s localhost -k cert_expire_check[mail.yahoo.co.jp,443,5]
129

接続できない場合
$ /usr/local/zabbix/bin/zabbix_get -s localhost -k cert_expire_check[ma3ki.net,80,5]
0

接続タイムアウト(zabbix-agentのタイムアウトに先に引っかかった場合)
# /usr/local/zabbix/bin/zabbix_get -s localhost -k cert_expire_check[yahoo.co.jp,443,10]
ZBX_NOTSUPPORTED: Timeout while executing a shell script.

接続タイムアウト(5秒以内に接続先の応答がない場合)
# /usr/local/zabbix/bin/zabbix_get -s localhost -k cert_expire_check[yahoo.co.jp,443,5]
0

エラーは0を返します。
```
実行中のSQLのステータスを確認する

V$SESSIONをみればよい。
以上。

と言いたいところだが、
情報が多すぎて、重くて見辛いEMのSQLリアルタイム監視のかわりに簡便に流れているSQLを監視したいという意図でV$SQLAREAなどと合わせたSQLを書いた。

移行作業の裏で、シナリオテスト、性能テストが走っていたりする忙しいDBの監視にはこういう情報があると切り分けが早くて便利だと思ったので投稿。

欲しい情報は、
・インスタンス
・スキーマ名
・SQL_ID
・待機クラス
・イベント
・経過時間
・SQLの一部
ぐらいあれば十分なので、下記のSQLで調べる。

```lang:現在流れているSQLのプランを取得 
select 
	a.INST_ID,
	a.SCHEMANAME,
	a.SQL_ID,
	a.WAIT_CLASS,
	a.EVENT,
--	b.SQL_FULLTEXT,
	trunc((sysdate - a.SQL_EXEC_START) * 24 * 60 * 60,2) as "経過",
--	a.WAIT_TIME,
	substr(b.SQL_TEXT,1, 60) as sql_head
from 
	gV$SESSION a,
	gV$sqlarea b
where 1 = 1
and status = 'ACTIVE'
and a.INST_ID = b.INST_ID
and a.SQL_ID = b.SQL_ID
order by a.INST_ID,a.SQL_EXEC_START 
;
```

おかしなイベントが発生している場合、
```
select * from table(DBMS_XPLAN.DISPLAY_CURSOR('{SQL_ID}'));
```

などで、プランをすぐに確認できる。
ただ、待機クラス・イベント自体あまり知らないので、どこかでまとめたい。
RAC特有のイベントとかあるらしいので興味ある。
CentOS-Atomic-Host-7でのネットワーク設定

etcがリードオンリーの為、ifcfg ファイルが編集できない。
nmcli 設定のメモ。

**IPアドレス固定設定**

 \# nmcli connection modify ens1 \
ipv4.method manual \
ipv4.addresses 10.1.0.201/24 \
ipv4.gateway 10.1.0.2 \
ipv4.dns "8.8.8.8 8.8.4.4" \
ipv4.dns-search "local.dev.net" \
connection.autoconnect yes

**IPアドレス自動設定（DHCP)**
 \# nmcli connection modify ens1 ipv4.method auto

**設定確認**
\# nmcli --fields ipv4 connection show ens1
***
ipv4.method:                            manual
ipv4.dns:                               8.8.8.8, 8.8.4.4
ipv4.dns-search:                        local.dev.net
ipv4.addresses:                         { ip = 10.1.0.201/24, gw = 10.1.0.2 }
ipv4.routes:                           
ipv4.ignore-auto-routes:                no
ipv4.ignore-auto-dns:                   no
ipv4.dhcp-client-id:                    --
ipv4.dhcp-send-hostname:                yes
ipv4.dhcp-hostname:                     --
ipv4.never-default:                     no
ipv4.may-fail:                          yes
***

**インターフェイスActive**
\# nmcli connection up ens1

**インターフェイスDeactive** 
\# nmcli connection down ens1 

**onboot yes**
\# nmcli connection modify ens1 connection.autoconnect yes

**ホスト名変更**
\# nmcli general hostname ホスト名

**設定反映**
\# systemctl restart NetworkManager

**設定変更**
フィールド名の前に -, + をつける
\# nmcli con mod ens1 -ipv4.dns 1
\# nmcli --fields ipv4.dns con show ens1
ipv4.dns:8.8.8.8

\# nmcli con mod ens1 +ipv4.dns 129.250.35.250
\# nmcli --fields ipv4.dns con show ens1
ipv4.dns:8.8.8.8,129.250.35.250
Python環境構築@Win7

# はじめに
Windows7にPythonのプログラミング環境を構築します。
OSの情報は以下です。
![1.JPG](https://qiita-image-store.s3.amazonaws.com/0/84205/67275c69-3686-eaed-37f8-1404241eef15.jpeg)

# Pythonダウンロード&インストール

[Pythonのホームページ](https://www.python.org/downloads/)からダウンロードします。
バージョンは3.4.3を使います。

![1.JPG](https://qiita-image-store.s3.amazonaws.com/0/84205/98f5099e-c734-e6a6-4b6d-9113969cf6fd.jpeg)

ダウンロードしたインストーラを実行します。
環境変数設定を有効にしてください。

![1.JPG](https://qiita-image-store.s3.amazonaws.com/0/84205/c214891a-097c-9dce-81e6-6b743a00a35f.jpeg)

コマンドプロンプトで`python`をタイプしてインストールできたか確認してください。

```
>python
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (In
tel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
```

エラーが表示される場合は環境変数設定が正しく設定されていません。

# pip
pipはPythonのパッケージ管理ソフトです。
ネットからPythonのソフトをインストールできます。

## error: Microsoft Visual C++ 10.0 is required

pipでnumpyをインストールするとエラーが発生します。
パッケージによってはC/C++のコンパイルが必要なものがあります。
コンパイラがインストールされていないことがエラーの原因です。

```
pip install numpy
(省略)
 error: Microsoft Visual C++ 10.0 is required (Unable to find vcvarsall.bat).
```

コンパイラをインストールすればエラーはなくなるのですが、
Pythonとは直接関係ないC/C++のコンパイラをインストールするのは手間です。
幸いなことにWindows用にコンパイルしたバイナリを配布してくれているサイトがあります。
> [Unofficial Windows Binaries for Python Extension Packages](http://www.lfd.uci.edu/~gohlke/pythonlibs/)

ここからwhl形式のファイルをダウンロードします。
pipでダウンロードしたファイルを指定してインストールします。

```
pip install numpy-1.9.2+mkl-cp34-none-win32.whl
```

# 便利なパッケージ

数値計算、グラフ作成に役立つ便利なパッケージです。

- NumPy:効率的なベクトル・行列計算に使用します。
- SciPy:数値解析に使用します。(Requires numpy)
- Matplotlib:グラフ作成に使用します(Requires numpy, dateutil, pytz, pyparsing, six, setuptools)
- Pandas:数表・時系列データ解析に使用します(Requires numpy, dateutil, pytz, setuptools)
CentOS7 でのRS232Cアクセス設定

CentOS7 のRS232C コンソールアクセス設定。
GRUB2「/etc/default/grub」を編集し設定をします。

■ 設定例

\# vi /etc/default/grub
***
～
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="serial console"
GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,9600 console=ttyS1,9600"
GRUB_DISABLE_RECOVERY="true"
GRUB_TERMINAL="console serial"
GRUB_SERIAL_COMMAND="serial --speed=9600 --unit=0 --word=8 --parity=no --stop=1"

 ***
下記コマンドで設定を反映します。

\# /usr/sbin/grub2-mkconfig -o /boot/grub2/grub.cfg
capistrano3でのデプロイを7分弱から30秒に短縮

# 1. はじめに

Railsでデプロイといえばcapistranoを使っている人が多いかと思いますが，
悩まされるのがデプロイ時間(主にassets:precompile)．
自身のさくらVPSではデプロイに7分ほどかかり，その内6分がassets:precompileでした．

現状のRails4.2.3 && capistrano 3.4.0で，
どういう設定をしたら無駄なprecompileとmigrationをスキップできるかをまとめます．

# 2. DBのmigration skip

まずはdbのmigration skipです．
こちらは公式にも方法が記されています．

```config/deploy.rb
# Defaults to false. If true, it's skip migration if files in db/migrate not modified
set :conditionally_migrate, true
```

このオプションを付け足すと，db/migrateに差分がなければmigrationをスキップします．


# 3. assets:precompile skip

次に本題のassets:precompileのスキップです．
[capistrano-faster-assets](https://github.com/capistrano-plugins/capistrano-faster-assets)というgemを利用します．

これは，

- app/assets
- lib/assets
- vendor/assets
- Gemfile.lock

の4種類に対してdiffを取り，変更がなければassets:precompileをスキップしてくれます．

Gemfileに```gem 'capistrano-faster-assets'```を追加し，
Capfileを以下のように設定します．

```rb
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/faster_assets' # 必ずrails/assetsの下に記述
require 'capistrano/rails/migrations'
```

1度目のデプロイで，キャッシュを作成し，
2回目以降は差分がなければassets:precompileをスキップしてくれます．

また，警告にも書かれていますが，

```coffeescript
text = <%= helper.get_text %>
```

このようなerb形式の記述をしていた場合，helperの内容に変更があったとしても，
assets:precompileをされない場合があるため，心に留めておいたほうが良さそうです．

# 4. その他お勧めオプション

## remote_cache

```rb
set :deploy_via, :remote_cache
```

詳細は[こちら](http://torokeru.tv/mameblog/?p=195)に記述されています．
yo ( generator-hubot ) なしに 1 分で Hubot をはじめられるシェルスクリプト

# 課題

yo や generator-hubot をうまく動かせない人が居る。

# 解決策

generator-hubot なしで Hubot をはじめられる環境を提供する。

## 例1: シェルスクリプト

**前提: Node.js がインストールされていること。**

以下のスクリプトの変数を適当に変更して実行すると良い。

例の通りに実行すると `myhubot> @myhubot ping` とすれば `PONG` が返ってくる。

```bash
#!/bin/sh

author='bouzuya <m@bouzuya.net>' # package.json の author
user_name='bouzuya'              # github の username
bot_name='myhubot'               # BOT 名

mkdir $bot_name
cd $bot_name

cat <<EOS >package.json
{ 
  "name": "$bot_name",
  "description": "$bot_name",
  "version": "1.0.0",
  "author": "$author",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/$user_name/$bot_name"
  },
  "scripts": {
    "start": "hubot -a shell -n $bot_name"
  }
}
EOS

cat <<EOS >external-scripts.json
[
  "hubot-diagnostics"
]
EOS

npm install --save coffee-script hubot hubot-diagnostics
npm start
```

# 残課題

次へのステップが示されていない。

- チャットで動かしたい → アダプターの設定の説明が必要 (TODO)
    - 参考 (Slack の場合(※古い)): [Hubot を Heroku で動かして Slack から話す - Qiita](http://qiita.com/bouzuya/items/2a200c9e8a45e2478bc2)
- スクリプトを追加したい → スクリプトの追加の説明が必要 (TODO)
    - 参考: [Hubot スクリプトを追加インストールしよう & 自分だけの Hubot スクリプトをつくろう - Qiita](http://qiita.com/bouzuya/items/4c0206d72ff22ade9339)
【Java】フィボナッチ数列を再帰関数を使い第0項から第10項目まで求め表示する

```java:Fibonacci.java

class Fibonacci {

    public static void main(String[] args) {
        for(int i=0;i<11;i+=1) {
            System.out.println(fibonacci(i));
        }
    }

    static int fibonacci(int n) {
      return (n==1||n==0)?n:fibonacci(n-2)+fibonacci(n-1);
    }

}

```
##環境
ベアボーン:Shuttle XS35GS V3
OS:win7(32bit)
JAVA SE8(jdk-8u45-windows-i586)

##解説
フィボナッチ数列を再帰関数を使い第0項から第10項目まで求め表示する。
関数fibonacciはnが0または1ならnを返し、0と1以外ならば、fibonacci(n-2)+fibonacci(n-1)を返す。
これを三項演算子を使えば、1行で記述できる。
fibonacci関数自身がfibonacciを呼び出す。これを再帰と呼び、関数fibonacciを再帰関数と呼ぶ。


##コンパイルと実行結果
```
c:\2015>javac Fibonacci.java

c:\2015>java Fibonacci
0
1
1
2
3
5
8
13
21
34
55

```

##55という数字
55って数値は、フィボナッチ数列第10項目の数字であり、また、1から10までの整数を足すと55になる。
また、原子番号55はセシウムCsである。

```
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55 
```

「フィボナッチ数列」と「1から10まで足した値」って全く関係なさそうにみえて、こんなつながりが
あることを見つけたときは驚いた。
twilioのトライアル登録してみた

## 参考

* [Twilio | Try Twilio Free](https://jp.twilio.com/try-twilio/kddi-web)
* [Twilio Cloud Communications - APIs for Voice, VoIP, and Text Messaging](https://jp.twilio.com/docs)
* [料金](http://twilio.kddi-web.com/price/)

## 登録

![t1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/50d9ccee-0eaa-6611-80da-e13c2bafd74d.png)

![a2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/145cd394-a2ad-7c50-99d1-0bfbac335137.png)

先頭の0を抜いて入力。自分の場合SMSが届かなかった（謎）のため、
`Call me insted.`をクリックし電話認証を受けた。

# 登録完了

![t4.png](https://qiita-image-store.s3.amazonaws.com/0/25728/ac91d1d2-fbe3-09b3-d3e4-38124595dc08.png)

# 電話番号をもらう

* Voice, SMS & MMS -> はじめよう を開くと電話番号がひとつもらえる。

# webブラウザからテスト発信

![ta2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/83218eb7-2b58-c4ef-d315-b5bc9910dd4c.png)

VoiceURLをコピーしておく

![a3.png](https://qiita-image-store.s3.amazonaws.com/0/25728/200ea936-da59-1bae-6e79-193a283a7852.png)

Toに電話を受けたい電話番号を入力し、URLを貼り付け。
画面下に「リクエストを発行する」ボタンがあるのでこちらをクリックすると発信される。

# トライアルの050番号に電話をかけて読み上げしてもらう

```xml:twiliodemo.xml
<Response>
<Say voice="alice" language="ja-JP">にほんごでおけ</Say>
</Response>
```

上記twiliodemo.xmlを適当なwebサーバにUPしておく。
電話番号 -> TWILIO電話番号 -> Request URL にそのURLを記述

![a.png](https://qiita-image-store.s3.amazonaws.com/0/25728/064c1b52-a28e-d511-0ea8-5136c3e583c5.png)

トライアルの050番号に電話をかけると、
「twilioへようこそ。このガイダンスはアップグレードすると消去できます。ダイヤルキーを押して下さい」
ダイヤルキーをなにか押すと、「にほんごでおけ」

が流れることを確認。

----

# その他リンク

* [すごいぜTwilio！イカスぜBeanstalk！ « サーバーワークス エンジニアブログ](http://blog.serverworks.co.jp/tech/2013/04/26/twilio/)
* [Heroku と Engine Yard と Elastic Beanstalk « サーバーワークス エンジニアブログ](http://blog.serverworks.co.jp/tech/2012/11/05/paas/)

* 電話番号利用料が月額490円
* 発信
  * 固定電話宛通信料が1分あたり9円
  * 携帯電話宛通信料が1分あたり19円
  * VoIP宛通信料が1分あたり0.25円
* 着信時の料金
  * VoIPからは1分あたり0.25円
  * VoIP以外からは1分あたり1円
【Oracle】SELECT文が複雑になるからってビューを簡単につくってはいけない。

Oracleにおけるビューを含むSELECT文の実行計画の最適化には制限があります。
(他のRDBMSだと最適化はされるかもしれません。でもその度合いには限界があるはず...)

# ビューを含むSELECT文の実行計画最適化における制限事項
ビューを含むSELECT文を書いたとき(SELECT文のFROM句にビューを含めたとき)
ビューで定義された問合せブロック（ビューで定義されたSELECT文）の内容を展開して、
SELECT文全体で実行計画を最適化する挙動（マージ）をオプティマイザーが示すこともありますが、これには以下の制限があります。

次の理由により、単純ビューのマージでは、ビューが有効にならない場合があります。
次のような、選択表示結合ビューに含まれていない構成メンバーがビューに含まれている。
・GROUP BY
・DISTINCT
・外部結合
・MODEL
・CONNECT BY
・集合演算子
・集計
・ビューがセミ結合またはアンチ結合の右側に表示される。
・ビューのSELECTリスト内に副問合せが含まれている。
・外側の問合せブロックにPL/SQLファンクションが含まれている。
・ビューが外部結合に含まれており、ビューをマージできるかどうかを判断する複数の追加の妥当性要件の1つを満たさない。

# パフォーマンスのよいSQLを書くためには
つまり、上記の条件を含むビュー定義は実行計画の最適化が行われないということになりますので、
そのようなビュー定義をすることはパフォーマンスの面で不利がある、と認識してビューをつくる必要があります。

上記の制限事項を回避しようと思うと、単純に結合するようなSELECT文にしかできません。
そう考えるとビューをつくる意義があるのか？という結論に大概の場合に行き着くのではないかと思います。
（元々のビューの存在意義は、外部スキーマとしてユーザーのアクセス権限の制御（行と列を絞り込むため）、なのでそのように利用した方がよいということになります。）

# マテリアライズド・ビューで対処しては？
とよく言われますが、リアルタイムで同期を取るには高速リフレッシュに設定しなければなりませんが、
高速リフレッシュの条件として上記制限事項が同じようにかかります。
また、完全リフレッシュをインターバルでするとなると、元のデータとのリアルタイムでの整合性はとれなくなりますし、インターバル間隔とデータ量によってはDB負荷がかなり増すのでお勧めできません。

# 結論
ビューで導出しなければならない属性があるのであれば、その属性をどこかのテーブルに追加して、
テーブル更新時のロジックにその導出するロジックを追加して更新するようにするのが、
機能面・非機能面(性能面)の両面で妥当かと思います。

# 補足
述語のプッシュ（ビューの外側で指定されたWHERE句の条件をビュー内に適用する）挙動もありますが、
※V_XXXXというVIEW、T_XXXというTABLEがあるとして。。。
１．SELECT * FROM V_XXXX AS V WHERE V.ID = 123
２．SELECT * FROM V_XXXX AS V,T_XXX AS T WHERE T.ID = 123 AND V.ID=T.ID
３．SELECT * FROM V_XXXX AS V,T_XXX AS T WHERE T.ID = 123 AND V.ID=T.PARENT_ID

１と２のように直接インデックスが効くようなキーに対して条件がリテラルで直接指定される場合（１）、または、直接指定される条件のカラムと結合されている場合（２）はプッシュされますが、
３のようにリテラルが指定されたカラムではないカラムと結合される場合にはプッシュはされません。

なので、述語のプッシュも制限がある（階層構造になっているようなデータは要注意）ので、ビューに対するアクセスでのパフォーマンスは期待しない前提で設計するのがよい、というのが基本です。



※Oracleのオプティマイザの仕様の詳細はこちら
OracleのSQL問合せ変換の仕様
http://docs.oracle.com/cd/E49329_01/server.121/b71277/tgsql_transform.htm#BABHJFGB
MacでPythonからアニメーションGIFを生成する環境設定

アニメーションGIFをPythonで作るために必要なライブラリ、ImageMagickとPythonMagickのインストールが一苦労だったので、やり方をここにメモします。

![anim_test.gif](https://qiita-image-store.s3.amazonaws.com/0/50670/cc7647f2-5fa3-3954-7966-e1cfca714a01.gif)
こんなのとか、
![quadratic_decent_anim-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/50670/dd0f96bf-a434-a495-3fe7-59c900a1e90f.gif)
こんなのとか、
![normdist_decent_0.0_anim-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/50670/1c51dc9e-c469-e97e-851e-a9a3ddf451fc.gif)
こんなのが生成できます。

##0.環境##
* OSX 10.10.3
* Macbook (Retina, 12-inch, Early 2015)
* Annaconda 3.10.0

##1.Image Magickのインストール##

```bash
sudo dscl . -append /Groups/wheel GroupMembership ＜ユーザー名＞
sudo chmod -R g+w /usr/local/include/ 
sudo chmod -R g+w /usr/local/share/man/man5
sudo chmod -R g+w /usr/local/lib/
brew link libpng
brew install imagemagick
```


##2.Python Magickのインストール##


```bash
brew install boost
brew install boost-python
sudo chmod -R g+w /usr/local/share/info
brew link libtool
```

Python Magickのダウンロード
http://www.imagemagick.org/download/python/
　※現時点では「PythonMagick-0.9.12.zip」が最新バージョン

```bash
cd /path/to/PythonMagick-0.9.12
./configure
make
```

エラーが出る。。。

```:error
CXXLD    _PythonMagick.la
clang: warning: argument unused during compilation: '-pthread'
ld: warning: directory not found for option '-L/usr/local/Cellar/freetype/2.6/lib'
```

調べてみると、自分の環境では

```
/usr/local/Cellar/freetype/2.6_1/lib/
```
が正しいパスのようだ。

修正すべきファイルを探す。

```
find ./ -type f -print | xargs grep 'freetype' -n
```

`/path/to/PythonMagick-0.9.12`の直下だったので、

```bash
vi _PythonMagick.la 
```

で、先ほどのパスのところを修正。
気を取り直して、

```bash
make
sudo make install
```


##3.お試し##

```py
%matplotlib inline 
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import animation as ani
plt.style.use('ggplot')

num_frame = 80.
x_range= 7

def animate(nframe):
    global num_frame
    plt.clf()
    a = ((5*nframe/num_frame) -.5) * np.pi
    x = np.linspace(-x_range, x_range, 200)
    y = np.sin(x+a)
    
    plt.xlim(-x_range, x_range)
    plt.ylim(-1.1,1.1)
    plt.plot(x, y, c="b")

fig = plt.figure(figsize=(12,5))
anim = ani.FuncAnimation(fig, animate, frames=int(num_frame))
anim.save('anim_test.gif', writer='imagemagick', fps=5, dpi=64)
```

出来上がり！

![anim_test.gif](https://qiita-image-store.s3.amazonaws.com/0/50670/cc7647f2-5fa3-3954-7966-e1cfca714a01.gif)
qiita > ストック数の取得 > *で検索

自分がストックした数を知りたい。

検索ボックスに「*」で検索すれば「ストック済み」の右側に表示される数が（おそらく）ストック数。

一応、上記で表示された数とストック一覧のページ数(1ページ20ストック）などから同じであるのは確認した。
30分間だけ使える超高性能PCとしてCircleCIをsshで利用

## 利点

* Jenkinsのサーバを用意しなくて良い
* CircleCIサーバ高スペック

## ログイン

* GitHubアカウントで登録
* https://circleci.com/add-projects にアクセスし、
  * 1. 自分のアカウントをクリック（これがわからなかった・・・。）
  * 2. projectを選択

![c1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/4834008e-63f6-92c0-c470-c759cc835e56.png)

## build

![c2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a6da3c69-9c42-1e5a-44d7-06cc69b7729e.png)

* なにやら出てくる。これは一旦無視

# ssh

## 右上のwith sshをクリック

![a4.png](https://qiita-image-store.s3.amazonaws.com/0/25728/199ce102-2aa6-3c71-d81b-e8e76a8e5366.png)

* 30分間だけssh接続ができる。
* `ssh -p 64599 ubuntu@54.166.9.XX`

```bash:DISK
$ df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvdh       240G   45G  193G  19% /
```

```bash:メモリ240GB
$ free -m
             total       used       free     shared    buffers     cached
Mem:        245997      80552     165445          0        104      57950
-/+ buffers/cache:      22498     223499
Swap:            0          0          0
```

```bash:
$ cat /proc/cpuinfo
# Xeon(R) CPU E5-2670@2.60GHz : 2CPU, 8コア, 2スレッドだと思う
```

## ポートフォワード

```bash:
python -m SimpleHTTPServer
ssh -p 64684 ubuntu@54.146.65.XX -NL 8000:localhost:8000
```

* http://localhost:8000 にアクセスし応答があることを確認

## dockerの利用

```bash:
sudo service docker start
sudo docker ps -a
```

# その他リンク

* [Gradleを使った Android projectを circle CIで buildする - Qiita](http://qiita.com/dagezi/items/37e6b5e4e16f70229bf8)
  * [GoClock/circle.yml](https://github.com/dagezi/GoClock/blob/master/circle.yml)
* [Django でのテスト](http://qiita.com/seizans/items/2f78f2a263c63c36b267)
* [CircleCI on Heroku - 簡易自動デプロイ circle.ymlサンプル - Qiita](http://qiita.com/shu_0115/items/496f3c46b09bbbba4d02)
* [ChatOps](http://qiita.com/tags/chatops)
  * [Slack / Hubot / GitHub / CircleCI によるChatOpsなデプロイ方法 - Qiita](http://qiita.com/s-kiriki/items/26bdf537169891b22653)
    * [ChatOps時のブランチ運用戦略(実装 / コードレビュー / 関係者確認 / 自動テスト / デプロイを円滑に行う) - Qiita](http://qiita.com/s-kiriki/items/194d266e0de070131a25)
NuGetの接続エラー

Visual Studio 2013 を使っていて、プロジェクトを別の場所で実行しようとするとNugetがエラーになり「基になる接続が閉じられました：SSL / TLSのセキュリティで保護されたチャネルの信頼関係を確立できませんでした」が表示されビルドできなくなった。

下記手順で復帰できた。

* Visual Studio のメニュー「ツール」を選択
* 「NuGetパッケージマネージャー」を選択
* 「パッケージマネージャーの設定」を選択
* 「NuGetパッケージマネージャー」の「パッケージソース」を選択、「利用可能なパッケージソース」を選択して、「http://www.nuget.org/api/v2/」を追加する。下図を参照。

![vs.png](https://qiita-image-store.s3.amazonaws.com/0/63970/d5d5de6e-a56a-0cd6-6bd9-9f33478300e1.png)
node0.12.7 で casperjs@1.1.0-beta3 をnpmにて正しくインストールする方法（Mac + nodebrew）

### `0.11.16` と `0.12.7` でインストール時の挙動が違ったのでメモ。

## 結論
1. `npm i -g casperjs@1.1.0-beta3`
1. `echo 'PHANTOMJS_EXECUTABLE=$HOME/.nodebrew/current/lib/node_modules/casperjs/node_modules/phantomjs/bin/phantomjs' >> ~/.bash_profile`
1. `source ~/.bash_profile`

## 詳細

#### 0.12.7の場合、そもそもインストール出来ない
```
npm ERR! notarget No compatible version found: casperjs@'*'
npm ERR! notarget Valid install targets:
npm ERR! notarget ["1.1.0-beta2","1.1.0-beta3"]
npm ERR! notarget
npm ERR! notarget This is most likely not a problem with npm itself.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.
```

↑のERRORにしたがって

`$ npm i -g casperjs@1.1.0-beta3`

とするとインストール可能。（v0.11.16ではバージョン指定は不要だった）

しかしこれだけだと、 `$ casperjs` で以下のERRORを吐く。

`Fatal: [Errno 2] No such file or directory; did you install phantomjs?`

phantomjsのpathを見つけられていないようなので追加。

```shell-session:.bash_profile
PHANTOMJS_EXECUTABLE=$HOME/.nodebrew/current/lib/node_modules/casperjs/node_modules/phantomjs/bin/phantomjs
```

これでnodebrew環境でも動いた。
世界は善意で満ちている。FuelPHP 1.7.3 の Presenter クラスで、引数付きのクロージャの登録に問題があった件。

# はじめに

ことの発端は、FuelPHP を 1.7.2 から 1.7.3 にアップグレートしたことなんですが、それに伴って発生した問題を解決していくまでの顛末を記録してみたいと思います。個人的には、非常に楽しい経験でした。こんな流れで、問題に対応できたという事例としても紹介できればと思います。

# 問題発生

FuelPHP を 1.7.2 から 1.7.3 へアップグレードすると Presenter クラスの利用で php がエラーを出すようになりました。

```lang:php
　Missing argument 1 for Presenter_Welcome_Hello::{closure}(), called in ...
```

Presenter クラスで、引数付きのクロージャが登録がうまく動かなくなったようです。自身が書いたコードに問題があると思い、調査するものの、解決せず行き詰まってしまいました。

# GitHub の存在を思い出す

GitHub に、何か情報があるかもと思い調べてみたら、ちゃんと履歴に残ってました。

https://github.com/fuel/core/commit/30643ab08bc07d9f8ae75ca8a337166aec5f117b

# Qiita で注意喚起。

GitHub を使えば、FuelPHP の開発者の方と話ができると思うのですが、会話できるほどに英語が使えず手詰まりに・・・。ただ、同じ理由で困ってる人がいたら、私と同じく調査に時間がかかるのも無駄なんで、注意喚起として Qiita に投稿しておきました。

http://qiita.com/yorozuone/items/c8b433e649235eeaa146

その後、同じ内容で注意喚起をされている方も発見。やっぱり、他にも、気づいた方がいらしたようです。

http://hinashiki.hateblo.jp/entry/2015/07/02/142940

# GitHub で動きが・・・

なんということでしょう、Qiita に登録後すぐ、ある日本の方が、本課題について GitHub 上で、FuelPHP の開発者の方と対応を話し合ってくれています。偶然でしょうか？
そして、なんと、解決してしまいます。「インターネット凄い」と感動した瞬間でした。

https://github.com/fuel/core/issues/1881

この対応で、クロージャの登録の方法に少し変更があったので、ドキュメントも一緒に修正されていました。

http://fuelphp.com/dev-docs/general/presenters.html#/functions

# 修正された FuelPHP を試してみる

今回の修正は、1.8 develop に対して行われているので、1.7.3 ではなく、1.8 develop を利用します。開発中のコードなので、php5.3 環境で動かないコードが含まれていました。php を 5.4 か 5.5 にすればよいのですが、すぐ対応できないので、一念発起、GitHub で修正を依頼してみました。
修正依頼のメッセージは「do not work php 5.3」これが精一杯です。ドキドキして結果を待っていたら、割とすぐに merge していただきました。なんだか軽く感動しました。
さらに、追加で1件、php5.3 で動かない部分があり、これも修正依頼して、合わせて、2件 merge してもらいました。

https://github.com/fuel/core/pull/1883
https://github.com/fuel/core/pull/1884
　
# さいごに

世界は善意で満ちているなぁと感じた一件。スマートなやり方ではなかったと思うのですが、できる範囲で発言することで、解決できることもあるんだなぁと思ったので、記録として残したいと思いました。
また、GitHub や Qiita を利用すると、SNS 的な開発（技術交流）ができるというような話を聞くこともあったのですが、記事やコードをアップするだけでは、その楽しみをなかなか実感できていませんでした。今回の件で、すこしだけ、その面白さに触れられたかもしれないです。
c++ builder XE4, 10.2 Tokyo > TeeChart > Axis > TickとMinorTickの長さ変更 > TickLength / MinorTickLength

```txt:動作確認
C++ builder XE4
    TeeChart Lite v2013.08.130414
RAD Studio 10.2 Tokyo Update 2 (追記 2018/01/10)
    TeeChart v2016.17.160129 32bit VCL
```

TeeChartの横軸（BottomAxis)のTickとMinorTickの長さ変更

```
Chart1->BottomAxis->TickLength = 10;
Chart1->BottomAxis->MinorTickLength = 6;
```
技術英語 > bloat > it will [bloat] the PostgreSQLAdapter::StatementPool cache.



http://stackoverflow.com/questions/155964/what-are-best-practices-that-you-use-when-writing-objective-c-and-cocoa?rq=1
> 5) Set your properties as nonatomic. They're atomic by default and upon synthesis, semaphore code will be created to prevent multi-threading problems. 99% of you probably don't need to worry about this and <font color=red>the code is much less bloated</font> and more memory-efficient when set to nonatomic.


https://github.com/basecamp/marginalia/issues/49
> it will <font color=red>bloat</font> the the PostgreSQLAdapter::StatementPool cache.


<hr>
http://ejje.weblio.jp/content/bloat
> ふくれさせる; むくませる; 膨大にする 

<hr>
よく使われる単語で言い換えるなら以下のようなものだろうか?
it will [much increase] the PostgreSQL...
numpyあるいはscipyの高速化に向けて@OSX

[Homebrew](http://brew.sh)については概ね仮定してる。

問題はシンプルだ。
AppleClangはOpenMPをサポートしていない。
OpenBLASのFormulaをいじってOpenMPサポートでビルドしようとすると、
ClangはOpenMPをサポートしていないと怒られる。
GCCをインストールすることから始めよう。

## GCC
OpenMPをサポートしたGCCのインストール

`brew info gcc`とすると以下のような文章を得る。

```
GCC has been built with multilib support. Notably, OpenMP may not work:
  https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60670
If you need OpenMP support you may want to
  brew reinstall gcc --without-multilib
```

multilibサポートをするとOpenMPが動かない。
なので、

```
brew install gcc --without-multlib
```

gcc5のビルドに失敗するようなら、

```
brew install gcc49 --without-multlib --with-fortran
```

gcc49の場合は`--with-fortran`をつけないとgfortranをインストールしてくれない。

## OpenBLAS

OpenMPを有効にしてOpenBLASのビルド

```
CC=/usr/local/bin/gcc-5 make OPEN_MP=1
```

## Numpy/Scipy

```
brew install numpy --with-openblas
brew install scipy --with-openblas
```