OmniAICreator/Qiita-1.07M huggingface dataset:
Facebook iOS SDKトラブルシュート


Facebook iOS SDKを使っててエラーが返ってくるケースやその対応のまとめ。随時更新。

# remote_app_id does not match stored id.

iOSアプリに指定されているBundleIDと、Facebookアプリで指定しているiOS Native AppのBundleIDが異なります。個々の設定を確認してみましょう。

## Facebook Appの設定

![fb.png](https://qiita-image-store.s3.amazonaws.com/0/29860/8d476376-376f-d9b7-ee40-8b270c7eceae.png "fb.png")

## Xcodeの設定

![xcode.png](https://qiita-image-store.s3.amazonaws.com/0/29860/2da78bbb-51c0-e1ee-be15-98f9417f14ab.png "xcode.png")


参考

* [iOS 6 Facebook posting procedure ends up with “remote_app_id does not match stored id”](http://stackoverflow.com/questions/12671420/ios-6-facebook-posting-procedure-ends-up-with-remote-app-id-does-not-match-stor)


# The app cannot ask for publish or manage permissions along with read permissions

Facebook iOS SDKを通じてFacebookアカウントのパーミッションを取得する際、読み込みと書き込みのパーミッションを同時に指定することが出来ない。例えば、書き込み→status_update, 読み込み→emailやabout_me等を同時に指定できない。

```objectivec
#import <Accounts/Accounts.h>

NSDictionary *options = @{
    ACFacebookAppIdKey : @"your-facebook-app-id",
    CFacebookAudienceKey : ACFacebookAudienceEveryone,
    ACFacebookPermissionsKey : @[
        @"status_update",  // emailと併記できない
        @"email"
    ]
};

ACAccountStore *account    = [[ACAccountStore alloc] init];
ACAccountType *accountType = [account accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];

[account requestAccessToAccountsWithType:accountType
                                 options:options
                              completion:nil];

```

対応方法調査中…。
Fortran で QuickSort　

##クイック・ソート
再帰の例題としてよく使われる quick sort です。Fortran90 で導入された pack 関数を使うと、簡単に書けることが知られています。pack はフィルター関数に当たります。

一般には関数型言語の例題で出てくるように、

```fortran
res = [pack(x(2:), x(2:) <= x(1)), x(1), pack(x(2:), x(2:) > x(1))]
```
というように書きます。

ここでは <,=,> の三つの場合に分ける形にしてみました。値の縮退が多い場合に有利になります。

クイック・ソートは再帰でスタック領域を大量に消費するので、リンカのオプションでスタックを増やしておく必要があります。

また intel fortran では Fortran2003 semantics を有効にしておく必要があります。

##プログラム
```fortran
    module m_sort
      implicit none
    contains  
      recursive function iqsort(ix) result(ires)
        integer, allocatable :: ires(:)
        integer, intent(in)  :: ix(:)
        integer :: k
        if (size(ix) <= 1) then 
          ires = ix
        else  
          k = ix(size(ix) / 2)
          ires = [iqsort(pack(ix, ix < k)), pack(ix, ix == k), iqsort(pack(ix, ix > k))] 
        end if
      end function iqsort  
    end module m_sort  

    program qsort
      use m_sort
      implicit none
      integer :: n = 10**7
      integer, allocatable :: ix(:), iy(:)
      real, allocatable :: x(:)
      allocate( x(n) )
      call random_seed()
      call random_number(x)
      ix = x * 10**6
      iy = iqsort(ix)
      print *, all(iy(1:n - 1) <= iy(2:)), count(iy(1:n - 1) == iy(2:))
    end program qsort
```
###実行結果
```
 T 9000046
続行するには何かキーを押してください . . .
```
HomebrewのrbenvとAnsibleのgemモジュールを使う場合はuser_install=noが必要

# はじめに

OSX上でHomebrewのrbenvでrubyをインストールしてAnsibleのgemモジュールでbundlerなどグローバルにgemをインストールするプレイブックを作るときにちょっとハマったのでメモです。
プレイブックのソースは [hnakamur/ansible-role-osx-rbenv]( https://github.com/hnakamur/ansible-role-osx-rbenv ) にあります。Ansible Galaxyにも[hnakamur.osx-rbenv]( https://galaxy.ansible.com/list#/roles/1479 ) として登録しています。

# Homebrewのrbenvとrubyのインストールディレクトリ
homebrewでrbenvをインストールすると、rbenvのスクリプトは/usr/local/bin/rbenvに配備されます。一方、rbenvでインストールしたrubyは~/.rbenv/versions/以下に配備されます。

# Ansibleのgemモジュールのuser_installパラメータに注意
[Ansibleのgemモジュール]( http://docs.ansible.com/gem_module.html )にはuser_installというパラメータがあり、デフォルトはyesになっています。

[gemモジュールのソース]( https://github.com/ansible/ansible/blob/v1.7.1/library/packaging/gem#L179-L182 )を見るとyesの場合は ```--user-install``` 、noの場合は ```--no-user-install``` をgemコマンドへのオプションに指定するようになっています。オプション無しで呼び出すことはなく、必ずどちらかのオプションが指定されるわけです。

[Ansibleのgemモジュール]( http://docs.ansible.com/gem_module.html )にはexecutableパラメータがあるので、```~/.rbenv/shims/gem``` を指定すればrbenvでインストールしたgemコマンドを使うことは出来ます。

```yaml:https://github.com/hnakamur/ansible-role-osx-rbenv/blob/e1bc823b3787886e7ea66f7c90904b8ef954146b/tasks/main.yml#L33-L35
- gem: name={{ item }} state=latest user_install=no executable=~/.rbenv/shims/gem
  notify: rbenv rehash
  with_items: rbenv_global_gems
```

試してみたところ、user_install=noを指定しないと(yesを指定したのと同じ)gemは/usr/local/lib/ruby/gems/以下にインストールされました。user_install=noを指定すると希望通り ~/.rbenv/versions/{{ rbenv_ruby_version }}/lib/ruby/gems/ にインストールされることがわかりました。

なんとなく逆のイメージだったのですが、rbenvの場合は ~/.rbenv/versions/{{ rbenv_ruby_version }} のほうがシステム領域になるということなのかなと理解しました。

ということで、今回のケースではuser_install=noが必要ですという話でした。
ruby zkメモ

rubyでzookeeperを使うメモ

```ruby:Gemfile
gem 'zk'
```

インストール

```
bundle
```

or

```
gem install zk
```

APIメモ

```ruby:接続
zk = ZK.new("host:port,host:port,.../chroot")
```

```ruby:ロック
locker = zk.locker('key_name')
begin
  if ex_locker.lock!
  # do something while holding lock
  else
    raise "Oh noes, we didn't get teh lock!"
  end
ensure
  locker.unlock!
end

or 

zk.with_lock('key_name') do
  
end

```

https://github.com/zk-ruby/zk/blob/master/lib/zk/locker.rb


```ruby:etc
# node作成
zk.create(path, data, opts={})

# ephemeral mode
zk.create("/path", '', :ephemeral => true)
# => "/path"

# sequence & ephemeral
zk.create("/path", '', :sequence => true, :ephemeral => true)
# => "/path0"

# 取得
data, stat = zk.get(path, opts={})

# dataセット
zk.set(path, data, opts={})

# 存在確認
zk.exists?(path, opts={})

# 子nodeの取得
zk.children(path)
# => [ "a", "b" ]

# 削除
zk.delete("/path")
zk.delete("/path", :version => version)


#close
zk.close 
zk.close!  # pending中のイベントやthreadも強制終了
```

参考
https://github.com/zk-ruby/zk/blob/master/lib/zk/client/base.rb

https://gist.github.com/juno/1471792
【AppleScript or JavaScript＋Illustrator】アイテム用スライスのズレを解消

IllustratorでWebデザインなどを行う際にアイテムのスライスを作成しますが、
GUIでは確認できない（見えない）端数によりスライス範囲が1pxズレてしまいます。
ですので、強制的にズレない数値に置き換えます。

ポイントとしては、1回ではうまく置き換わらない（バグか？）ので2回処理します。
また、幅（Width）だけは整数値に置き換えられない（仕様なのか？バグなのか？）ため、
「スライスがズレるのは正の端数 ＞ スライスがズレないのは負の端数」を利用し、
幅が整数値でない場合だけ、見えない負の端数に強制的に置き換えます。

※高さ（Height）は、整数値になるのですが、何故かGUI上では端数になることが。。。（バグ？）

【AppleScriptの場合】

```applescript:
on run
	with timeout of (60 * 15) seconds
		try
			activate
			set start_dialog to display dialog "端数除去によりレイアウトにズレが発生する可能性があります。必ず処理完了後に確認をしてください。" with icon note giving up after 60 * 5
			if (gave up of start_dialog) then return
			
			tell application id "com.adobe.Illustrator"
				if (count of documents) is 0 then error "ファイルが開かれていません。"
				
				tell current document
					activate
					
					set select_items to selection
					if (count of select_items) is 0 then error "アイテムが選択されていません。"
					
					repeat with select_item in select_items
						tell select_item
							repeat 2 times
								set old_w to width as real
								set old_h to height as real
								set old_x to item 1 of position as real
								set old_y to item 2 of position as real
								
								set new_w to (do javascript "Math.round(" & old_w & ");") as real
								set new_h to (do javascript "Math.round(" & old_h & ");") as real
								set new_x to (do javascript "Math.round(" & old_x & ");") as real
								set new_y to (do javascript "Math.round(" & old_y & ");") as real
								
								if old_w is not new_w then set width to (new_w - 1.0E-4)
								if old_h is not new_h then set height to new_h
								if (old_x is not new_x) or (old_y is not new_y) then set position to {new_x, new_y}
							end repeat
						end tell
					end repeat
				end tell
			end tell
			
			delay 0.1
			
			activate
			set finish_dialog to display dialog "処理完了しました。" with icon note buttons {"OK"} default button 1 giving up after 60 * 15
			if (gave up of finish_dialog) then return
			
		on error err_txt
			activate
			display dialog err_txt with icon caution buttons {"OK"} default button 1 giving up after 60 * 15
			return
		end try
	end timeout
end run
```

【JavaScriptの場合】

```js:
#target "Illustrator"


try
{
	if (app.documents.length == 0){throw("ファイルが開かれていません。");}

	var select_items = app.activeDocument.selection;
	if (select_items.length == 0){throw("アイテムが選択されていません。");}
	
	with(app.activeDocument)
	{
		alert("端数除去によりレイアウトにズレが発生する可能性があります。必ず処理完了後に確認をしてください。");
		
		for (i=0; i<select_items.length; i++)
		{
			for (j=0; j<=1; j++)
			{
				with(select_items[i])
				{
					var old_w = width;
					var old_h = height;
					var old_x = position[0];
					var old_y = position[1];
					
					var new_w = Math.round(old_w);
					var new_h = Math.round(old_h);
					var new_x = Math.round(old_x);
					var new_y = Math.round(old_y);
					
					if (old_w != new_w) {width = new_w - 0.0001;}
					if (old_h != new_h) {height = new_h;}
					if ((old_x != new_x) || (old_y != new_y)) {position = [new_x, new_y];}
				}
			}
		}
	
		alert("処理完了しました。");
	}
}
catch(err_str)
{
	alert(err_str);
}
```
Salesforce1 Platform 日本語ドキュメントへの歩き方

(2014/08/29追記)
[Salesforce Developers](https://developer.salesforce.com)の上部のメニューバーの[ライブラリ]>[ドキュメント]をクリックしたときに表示される[開発者ドキュメント](https://developer.salesforce.com/docs)が日本語化されました！
めでたい！

サイトリニューアル後、[Salesforce Developers](https://developer.salesforce.com)のWebページから[Salesforce1 Platform 日本語ドキュメント](https://developer.salesforce.com/page/JP:Documentation)に辿り着くのが微妙に分かりにくくなっています(2014/8/26現在)。

上部のメニューバーの[ライブラリ]>[ドキュメント]をクリックすると、英語のドキュメントに…。
![スクリーンショット 2014-08-26 1.46.32.png](https://qiita-image-store.s3.amazonaws.com/0/33258/d6cda581-7c8c-91a2-4dc4-d58af394b3c9.png)


**「日本の開発者よ、Englishなドキュメントくらい読むがいい！」**

と言われているかのようです(；´∀｀)

でも、ちゃんと逃げ道を用意してくれています。

なんと[ライブラリ]>[開発者リソース]をクリックし、次の画面(Technical Library)で[ドキュメント]リンクをクリックすると、日本語ドキュメントのWebページに辿りつけます！

![スクリーンショット 2014-08-26 1.49.28.png](https://qiita-image-store.s3.amazonaws.com/0/33258/20c48e17-40f1-a267-f4a1-0b246c63d7c0.png)

これ、マメな！

P.S.
Googleを開いて、キーワード「Salesforce 日本語 ドキュメント」で検索しても出てきます。
centos7初期設定まとめ(ip, host)


centos6と7で設定が変わっていたので、簡単にまとめてみました。
## ipを確認する
```
# centos6の場合
$ ifconfig

# centos7の場合
$ ip a
```

## ipアドレスを設定する
```
# centos6の場合
$ sudo vi /etc/sysconfig/network-scripts/ifcfg-ethx

# centos7の場合
$ sudo vi /etc/sysconfig/network-scripts/ifcfg-enp3sx
```

### /etc/sysconfig/network-scripts/ifcfg-enp3sx
``` 
HWADDR="xxxxxxxxxxxxx"
TYPE="Ethernet"
BOOTPROTO="static"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
NAME="enp3sx"
UUID="xxxxxxxxxxxxxxxx"
ONBOOT="yes"
IPADDR=xxxxxxxxxxxxxxxxxx
NETMASK=255.255.255.0
DNS1='127.0.0.1'
DNS2='xxxxxxxxxxxxxxxxxxx'
```

## host名を設定する
```
# centos6の場合
$ sudo vi /etc/sysconfig/network

# centos7の場合
$ sudo vi /etc/hostname
```
awesome wm で特定の chrome extension のみの rule を設定する

WM_CLASS の 1 番目には各 chrome extension 固有の値が入る。
これを instance に指定すればいい。

WM_CLASS は `xprop` を実行してウィンドウをクリックすれば表示される。

## 艦これウィジェットの例

```
awful.rules.rules = {
  { rule = { instance = "crx_iachoklpnnjfgmldgelflgifhdaebnol" },
    properties = { floating = true, ontop = true } },
}
```

これで、普段は tile 化されて欲しいけれど艦これウィジェットだけ float がいいな〜とかができる。
Macの環境設定(1) Javaの開発環境を整える


## はじめに
Qiitaにアカウント登録して放置してたのですが、
せっかくなのでゆるゆると投稿していこうかと思っています。
当面は、最近買ったMacの設定と、ローカルPCのテキストに書いたまま
整理できていない、技術的なメモの整理をしてみようかと考えています。

## 前提
10年来のWindowsユーザでしたが、ふと思い立ってMBAを購入しました。
更に勢いに任せて、職場のPCもMBPにするという後先考えない行為により、
環境設定周りの諸々を調べる必要に駆られました。
個人的備忘録の意味も含めて、何をやったかを記載しておこうと思います。

私のバックボーンとしては

1. 主に使う言語はJava、これからRubyを少々やりたいかも。
2. クライアントサイドの開発（JS,CSS,HTML)もやる。
3. DBは主にMySQLとOracleを使う(仕事上の理由で）

という感じなので、環境設定もこれらに依ったものになります。

Mac OS Xのバージョンは「10.9.4(Mavericks)」を前提としています。

では、つらつらと書いていきましょう。

## JDK
Java7,Java8は[Oracleのページ](http://www.oracle.com/technetwork/java/javase/downloads/index.html)からDLできます。
基本は「Mac OS X x64」のファイルをDLして、インストーラ通りに操作すればOKです。
今回は、2014/8/20現在で最新だった、

* [Java SE 7u67](http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html)
* [Java SE 8u20](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)

を入れました。

ちなみに全然知らなかったんですが、Mac用のJava6以前のSDKは、Oracleから提供されてないんですね。
（Appleから提供されている）
仕事で必要なので、6に関しては以下からDLしてインストールしました。
http://support.apple.com/kb/DL1572?viewlocale=ja_JP

## Eclipse
[公式ページ](https://www.eclipse.org/downloads/)から好きな物の「Mac OS X 64 Bit」ファイルを落としてきて入れます。
ファイルはtar.gz形式なので、任意のディレクトリで解凍すればよいかと。
今回は[LunaのJ2EE Developers](https://www.eclipse.org/downloads/packages/eclipse-ide-java-ee-developers/lunar)を入れました。

## Eclipse日本語化
必要ないっちゃないんですが、ここ1年くらいはWindowsでPleiadesのAll in Oneを使っていたので、なんとなく日本語化しておこうかと思いました。
以下の手順で日本語化を行います。

1. Pleiadesプラグインダウンロードの[最新版](http://svn.sourceforge.jp/svnroot/mergedoc/trunk/Pleiades/build/pleiades.zip)をDLします。
2. zipファイルなので、Macではダブルクリックで解凍します。
3. 解凍されたファイルの中に「features」「plugins」フォルダあるので、これらをコピーして、先ほどインストールしたEclipseの同名フォルダに上書きします。
4. eclipse.iniに以下を追記します。
※ ${ECLIPSE_HOME}の部分はEclipseをインストールしたディレクトリに置き換えてください。
※ Macの場合、eclipse.iniは「${ECLIPSE_HOME}/Eclipse.app/Contents/MacOS」に配置されています。

```
-javaagent:${ECLIPSE_HOME}/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
```

プラグインは以下を追加しました。
全てMarketPlaceからのインストールです。

* CheckStyle(仕事上のチーム開発で必要）
* Findbugs(同上）
* STS(Spring使うことが多いので）

## Tomcat
[公式サイト](http://tomcat.apache.org/)からtar.gzファイルをDLして、任意のディレクトリに解凍するだけです。
仕事で6〜8が必要になるので、以下のものをインストールしました。

* [8.0.9](http://ftp.tsukuba.wide.ad.jp/software/apache/tomcat/tomcat-8/v8.0.9/bin/apache-tomcat-8.0.9.tar.gz)
* [7.0.55](http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/tomcat/tomcat-7/v7.0.55/bin/apache-tomcat-7.0.55.tar.gz)
* [6.0.41](http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/tomcat/tomcat-6/v6.0.41/bin/apache-tomcat-6.0.41.tar.gz)

## 次回に続く
JavaでWebアプリを開発するに当たって、とりあえず最低限のセットアップはできたかと思います。
一度に書くと長くなりそうなので、他の設定についてはまた次回書きます。
delegateでhttp proxyをinit.dから起動

Ubuntu 12.4にて。

最新版のLinux用バイナリ(64bit用)を落としてインストール

```
sudo wget -O /usr/sbin/delegated ftp://ftp.delegate.org/pub/DeleGate/bin/linux/latest/linux2.6-dg9.9.11
sudo mkdir /etc/delegate/
sudo useradd -d /etc/delegate delegate 
```

skeltonを元に起動ファイルを用意

```
sudo cp /etc/init.d/skelton /etc/init.d/delegate_8080
sudo chmod ugo+x /etc/init.d/delegate_8080
```

8080ポート用のディレクトリ用意

```
sudo mkdir /etc/delegate/8080_http_proxy
sudo chown -R delegate:delegate /etc/delegate
```

起動ファイルを修正(以下修正箇所)

```
NAME=delegate_8080
DAEMON=/usr/sbin/delegated
PIDFILE=/etc/delegate/8080_http_proxy/act/pid/8080
SCRIPTNAME=/etc/init.d/delegate_8080

do_start()
...
	start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
		-P8080 SERVER=http ADMIN=admin@example.com OWNER=delegate/delegate DGROOT=/etc/delegate/8080_http_proxy RELAY=proxy,delegate PERMIT="*:*:*" \
		|| return 2

```

rc.dに追加

```
sudo update-rc.d delegate_8080 defaults
```
JrubyでHive


Install
Gemfileに以下を追加

```gem 'jruby_hive'
```

moduleインストール
```$ bundle
```
or
```$ gem install jruby_hive
```

使い方

環境変数セット
```$ export HADOOP_HOME=[our hadoop directory path]
$ export HIVE_HOME=[your hive directory path]
```

example code

```ruby:example.rb
#!/usr/bin/env jruby
# encoding utf-8

require 'jruby_hive'

hive = Hive.new
p hive.run("show tables")
```
ruby redstorm 試してみた

jrubyでの実装とackの挙動をテスト

インストール
```$ rvm install jruby
$ rvm use jruby
$ bundle install --binstubs --path vendor/bundle
　
$ ./bin/redstorm install
$ ./bin/redstorm bundle
```

```ruby:Gemfile
source 'https://rubygems.org'
gem 'redstorm'
```

サンプル

```ruby:test.rb
require 'red_storm'
  
class TestSpout < RedStorm::DSL::Spout
  
  on_init do 
    @count = 0
  end
 
  on_send :emit => false, :reliable => false do 
    @count += 1
    num = @count
    reliable_emit(@count, num, (num % 10)) 
    sleep 1
  end
   
  on_ack do |msg_id|
    log.info("success: #{msg_id}")
  end

  on_fail do |msg_id|
    log.info("failed: #{msg_id}")
  end
end
 
class TestBolt1 < RedStorm::DSL::Bolt
  on_receive :anchor => false, :emit => false do |tuple|
    p tuple
    log.info(tuple[0])
    if(tuple[1] != 1)
      anchored_emit(tuple, tuple['num'], tuple['hashkey'])
      ack(tuple)
    else
      fail(tuple)
    end
  end
end
 
class TestBolt2 < RedStorm::DSL::Bolt
  on_receive :emit => false do |tuple|
    p tuple
    log.info(tuple[0])
    if(tuple[1] != 2)
      ack(tuple)
    else
      fail(tuple)
    end
  end
end
 
class TestTopology < RedStorm::DSL::Topology
  spout TestSpout do
    output_fields :num, :hashkey
  end
 
  bolt TestBolt1 do
    source TestSpout, :global
    output_fields :num, :hashkey
  end

  bolt TestBolt2, :parallelism => 2 do
    source TestBolt1, :fields => [ :hashkey ]
  end

  configure do |env|
    debug false
    max_task_parallelism 4
    num_workers 4
    max_spout_pending 1000
  end
end
```

実行
```$ ./bin/redstorm local test.rb 
```
Play Framework でキャッシュするクラスのlazy valはキャッシュする段階で評価される


Play Framework 2.3.2 です。

```scala
import org.joda.time._

case class Timer(endTime: DateTime) {
  lazy val secondsLeft = Seconds.secondsBetween(new DateTime(), endTime).getSeconds
}
```

こういうコードがありました。

とあるリクエストで

```scala
val timer = Timer(new DateTime().plusMinutes(5))
Cache.set("timer", timer)
```

とやって、別のリクエストで

```scala
Cache.getAs[Timer]("timer").map { timer =>
  Logger.debug(timer.secondsLeft.toString)
}
```

とやります。

リクエストするたびに数字が減ってくれるかと思いきや、数字はずっと同じままです。

`lazy val`を`def`に変えたら期待通りの挙動になりました。
コマンドの実行履歴を結果も含めて保存する

# コマンドの実行履歴を結果も含めて保存する

* ```script```コマンドを使う
 * 半年前くらいに教えてもらった
 * 終了する時は```exit```か```Ctrl+d```で一度抜ける

```
$ script /to/your/log/dir/$filename
```
TwilioならIVR（電話の自動応答システム）がスクリプト一枚でできちゃいます！

いままでいろいろTwilioの機能を紹介して来ました！
今回はTwilioで着信機能！その中で、もっとも活用されている「IVR（自動応答システム）」を作ってみたいと思います。
IVRとは？
どこかに電話をかけた際に、〇〇の場合は1を、△△の場合は2をなど、自動的に音声による案内、もしくは応答してくれるシステムを言います。

詳しくはこちら。
http://ja.wikipedia.org/wiki/自動音声応答装置

て、今までこのようなシステムを開発するためにはいろんなことを考えなくちゃならなかったですね。
システムの開発もそうだし、設備はどうする？回線は。。いろいろ複雑だったはずです。
そこで、Twilioを使えばPHPやrubyなど、一枚のスクリプト且つ短いコードでこのような自動応答システムの開発ができるようになります。

<h3>ソースコードから。</h3>

```php:twilio-ivr.php
<?php
require("twilio-php-master/Twilio/autoload.php");

use Twilio\Twiml;

$response = new Twiml();

$out_tel_to = "転送先電話番号";
$sound_url = "再生する音声ファイルのURL";

if (empty($_POST["Digits"])) {
  $gather = $response->gather(['numDigits' => 1, 'timeout' => 30]);
  $gather->say("Twilioへようこそ。電話の転送は1を音声ファイルの再生は2を電話の終了は3をおしてください。", ['language' => 'ja-jp']);
} elseif ($_POST["Digits"] == "1") {
  $response->dial($out_tel_to);
  $gather = $response->gather(['numDigits' => 1, 'timeout' => 30]);
} elseif ($_POST["Digits"] == "2") {
  $response->play($sound_url, ["loop" => 1]);
  $gather = $response->gather(['numDigits' => 1, 'timeout' => 30]);
} elseif ($_POST["Digits"] == "3") {
  $response->say("楽しいAPI Twilioのご利用ありがとうございました。", ['language' => 'ja-jp']);
}
print $response;
?>
```

<h3>twilioのPHPライブラリなどについては前回公開した記事をご覧ください！</h3>
http://qiita.com/joohounsong/items/f516f4e1f6c91572e7f5

<h3>twilio-ivr.php をTwilioの電話番号に設定する方法。</h3>
① Twilioのアカウントにログインします。
② ダッシュボードのメニューから 
  電話番号 → このファイルを設定する電話番号選択 → Twilio Request URLに
　「twilio-ivr.php」のURLをフルパスで設定します。
　※ 「twilio-ivr.php」はTwilioが参照できるウェブサーバー（ブロバール）に配置する必要があります。

<h3>これで電話の自動応答システム完成！</h3>
残りは、自分の電話番号に電話をかけて、確認してみてください。

トライアルアカウント（無料）でもお試し可能です。
この処理で再生する音声ファイルは各自用意してくださいませ。
$sound_urlに音声ファイルをフルパスで設定してください。
$out_tel_toには転送する電話番号を設定してください。トライアルアカウントならTwilioから認証された一つの電話番号にしか発信が出来ませんので、認証の電話番号を設定しましょう。

下のような処理が行われます。

<h3>動きはこんな感じです。</h3>
■ ユーザーが「050-xxxx-xxxx」に電話をかけます。
　→ 11行のメッセージを再生します。
■ ユーザーが自分の電話機から「１」を押します。
　→ ６行で指定した電話番号に電話を転送します。
■ ユーザーが自分の電話機から「２」を押します。
　→ ７行で指定した音声ファイル（mp3など）を再生します。
■ ユーザーが自分の電話機から「３」を押します。
　→ 通話を終了します。

コードより文字が多いですが、是非試してみてください！
無料で使えるスタートアップっぽいサービスメモ

スタートアップ的なサービスについてちょっと調べてみましたメモ。
無料という観点で。俺は数百円ケチっていらっとする位なら課金するぜー！とならない人向け。とても主観です。


##コード共有

###Github
王道だけどprivateリポジトリが無料で使えない。


###bitbucket
privateリポジトリ無制限で作り放題。privateリポジトリを共有する場合は5人まで大丈夫っぽい。


## チャットツール
### Slack
### hipchat

無料でそこそこ使える。最近はSlackが注目されてるぽい。
hipchatちょっと使ってみたけどUIがわかりにくかった。

## chatwork
無料でも使えるんだけど、いかんせん外部サービスとの連携が弱すぎる。APIはいつ正式サービスになるんだ、、、
人気のスライドをモバイルで保存するためのTips


##概要
最近はためになるスライド多いですね。
モバイル用のSSSSLIDEのブックマークレットを見つけられなかったので、簡単なものを作りました。
折角なので、[SSSSLIDE](http://sssslide.com/)+[Evernote](https://www.evernote.com/)で人気のスライドを保存するTipsをご紹介します。

>[SSSSLIDE](http://sssslide.com/)はスライドを縦に並べて見るサイト。
>現在は、[slideshare](http://www.slideshare.net/)と[Speaker Deck](https://speakerdeck.com/)に対応しているようです。

##なにをやるか
モバイルで閲覧中のスライドを縦に並べて、そのままEvernoteに保存します。

##どうやってやるか
以下のブックマークレットをブックマークに保存してご利用ください。

**以下SSSSLIDEからの引用です。**
>「ブックマークレット」とは、ブラウザのブックマーク (お気に入り) に登録できる簡単なプログラムです。 SSSSLIDE のブックマークレットを SlideShare や Speaker Deck のスライドページで実行すると、閲覧中のスライドを縦に並べて見ることができます。 


##ブックマークレット
以下のブックマークレットをブックマークに保存してご利用ください。

**PC用SSSSLIDE変換スクリプト（サイトで配布されているもの）**
> 
> ```js:Bookmarklet
> javascript:location.href='http://sssslide.com/'+location.href
>```
>

**モバイル用SSSSLIDE変換スクリプト**
slideshareの場合、モバイルで見ると/mobile/に飛ばされるので、それを削除するだけの簡単なものです。
> 
> ```js:Bookmarklet
> javascript:url=location.href.replace(/\/mobile/g,"");location.href='http://sssslide.com/'+url;
>```

**Evernoteに保存**
> 
> ```js:Bookmarklet
> javascript:window.location='http://s.evernote.com/grclip?url='+encodeURIComponent(location.href)+'&title='+encodeURIComponent(document.title)
>```
>

##おわりに
[Presso](https://b.hatena.ne.jp/campaign/presso)ではてなを見る方は以下の記事を参考にEvernoteを外部連携させておくと、さらに便利です。

[Evernote と はてなブックマークを連携させたら Evernote に全文で取り込めている！](http://beadored.com/evernote-hatenabookmark/)
DoctrineのLEFT JOINはまともに使えない

[DISTINCT](http://qiita.com/rana_kualu/items/f36d0351cd46f8212b49) / [LEFT JOIN](http://qiita.com/rana_kualu/items/42997ec06e02acceeb40)

```yaml:schema.yml
TableA:
  actAs:
    Timestampable: ~
  columns:
    columna:
      type: string(255)

TableB:
  actAs:
    Timestampable: ~
  columns:
    columnb:
      type: string(255)
  relations:
    TableA:
      local: a_id
      foreign: id
      type: one
      foreignType: many
```

テーブルAとBに1対多のリレーションをはっておく。

```php
	$data = Doctrine_Query::create()->from('TableA a')->leftJoin('a.TableB b')->limit(5)->execute();

	// Expected result : SELECT * FROM TableA a LEFT JOIN TableB b ON a.id = b.a_id LIMIT 5
	// Actual result : SELECT * FROM TableA a LEFT JOIN TableB b ON a.id = b.a_id WHERE a.id IN (1,2,3,4,5)
```

全体に掛けていたはずのLIMIT 5が、『テーブルAの件数が5件』という意味に勝手に書き換えられている。
ふざけてるの？

このファッキンな挙動を止める術は一応あって、

```php
	$q = Doctrine_Query::create()->from('TableA a')->leftJoin('a.TableB b')->limit(5);
	$q->setDisableLimitSubquery(true);
	$data = $q->execute();
```

で余計な変換をせず想定したとおりのLIMITがかかります。
何故こちらがデフォルトでないのか理解に苦しむ。
あと返り値がbooleanなのでメソッドチェーンできない。

さて、これでめでたしかと思えば実はそんなことはない。
帰ってくるデータは実際はDoctrine_Collectionですが、配列として示すとこんなかんじになっています。

```php
	$data = [
		0=>[
			id=>1,
			TableB=>[
				0=>[…],
				1=>[…],
				2=>[…],
			]
		],
		1=>[
			id=>2,
			TableB=>[…]
		],
		…
	];
```

テーブルBが、同じa_id毎にまとめられてしまうのだ。
これはこれで便利な機能ではあるのですが、問題はこの挙動をやめさせる手段がないことです。

[execute](http://www.doctrine-project.org/api/ormold/1.2/class-Doctrine_Core.html)の引数で、返り値の形をある程度変更できます。

```php
	// デフォルト、入れ子のDoctrine_Collectionで取得
	$data = $q->execute(array(), Doctrine_Core::HYDRATE_RECORD);
	// 入れ子の配列で取得
	$data = $q->execute(array(), Doctrine_Core::HYDRATE_ARRAY);
	// フラットな配列で取得
	$data = $q->execute(array(), Doctrine_Core::HYDRATE_ARRAY_SHALLOW);
```

配列ならフラットな形で取得できるのですが、何故かフラットなDoctrine_Collectionで取得する方法が無い。
素直にforeachループ一回で全TableBを扱わせろ。
定数に関する個人的考察

# 定数に関する個人的考察

* ふと定数ってどういう時に使うものだっけ？と思ったのでまとめてみる

## 定数とは何か？

* 定義してから変わらない(数年単位であれば変わりうるもの)
 * ex1. 円周率(3.14 => 3とかゆとり乙で話題になったアレ)
 * ex2. キャップ(上限値)、ゲーム等でユーザの成長に伴い拡張せざるをえないもの
* type(年に1,2回程度、多くても4半期、の追加がある)
 * (主に)数字に対するエイリアス

## 今回、どうしてこんなことを考えたのか？

* 月次で修正/追加のかかる定数を見つけた
 * ？？？？
* それ、定数にすべきじゃないよね？
 * なお、DBから取得出来る模様
* QPSを増やしたくないとか？
 * ローカルホストのメモリに乗せる方法なんて、どの言語でも豊富にあると思うんだがどうして定数を選んだ？

## なぜ、定数にすべきでないか？

* 定数はプログラムの一部である(デプロイの手間がかかる)
 * エンジニアの仕事の基本は『マニュアルさえ渡して、時間を与えれば誰にでも出来る簡単なお仕事をコンピュータにさせること』
 * 何のためにプログラム書いてるか自問してみよう？
* 定数のデプロイは常にプログラムの改編に繋がることを意識してもらいたい
 * デプロイ等に対するリテラシーとか政治的なアレの作用とか反作用とか知らんし、単にムダな工数を積んでるだけ。

## 個人的に定数にすべきでないと思うもの

* 更新頻度が(比較的)高いもの
 * 月次とかマスタで管理してもらいたい
* 日付、大体は記念日
 * anniversaryとかいう英語もあるやろ？
* 管理者ID/NGなID
 * なぜ、DBでマスタ管理しようと思わなかったのか

## まとめ

* その定数、本当に必要？
コメント欄などにユーザー情報を表示するHTMLとCSS

# 会員制サイトによくある構成
コメント投稿系の会員制サイトなどでよくある、ユーザー情報のヘッダ部分のHTMLとCSSを作成します。

デザインのイメージは以下
![ジバニャン.png](https://qiita-image-store.s3.amazonaws.com/0/1624/b178f7e8-b14d-9b92-f752-636b00e297cb.png)

ユーザーアイコンとユーザー名、投稿日時というよくある組み合わせです。ユーザー名の下にコンテンツを投稿した日付を表示するようにします。

# HTMLとCSS

```html:HTML
<div class="item__header clearfix">
  <span class="item__user-icon">
    <img src="./img/jibanyan.jpg" height="48" width="48" alt="ジバニャン" class="item__user-icon-img" />
  </span>
  <span class="item__user-name">
    <strong>ジバニャン</strong>
  </span>
  <span class="item__date">
    2014/08/29 19:00
  </span>
</div>
```
各情報はそれぞれspanタグで囲いました。

```css:CSS
.item__header {
  padding: 10px;
}

.item__user-icon {
  float: left;
}

.item__user-name, .item__date {
  display: block;
  margin-left: 60px;
}
```
上記以外でfloatを解除するために、bootstrapで利用できる汎用クラスのclearfixを使用しています。clearfixにスタイルがないと崩れるはずです。

spanタグを使用したため、display:block;を指定しました。

# 参考
CSSのクラス命名は[コチラ](http://qiita.com/pugiemonn/items/964203782e1fcb3d02c3)を参考にしました。
Raspberry piのGPIOを制御して、LEDを点灯する

##概要
WiringPiはRaspberry PiのGPIOを制御するためのC言語ライブラリです。
Raspberry PiのGPIOは、仮想ファイルへ割り当てられているためシェルを使うのであれば

```bash
$sudo echo 1 > /sys/class/gpio/gpio18/value
```
echoコマンドを使って、設定することが出来ます。
プログラム初学者には、分かりやすいのかも知れませんが、プログラム言語から制御するには、ちょっと面倒です。
Raspberry Piは、プログラム言語から利用しやすいように処理をラッピングしてくれます。

##ライブラリの準備

###I2Cライブラリのインストール
WiringPiからI2C通信を行う際に呼び出されるライブラリとなります。
I2C通信しないなら必要ないようですが念のためインストールしておきましょう。

```bash
$sudo aptitude install libi2c-dev
```

###WiringPiのインストール
gitでソースコードを取得してコンパイルをします。

```bash
$git clone git://git.drogon.net/wiringPi
```
ソースコードが取得し終わったらビルドします。
ビルドが成功するとインストールされますので、コマンドを確かめるためバージョンを確認します。

```bash
$cd wiringPi/
$./build
$gpio -v
gpio version: 2.20
Copyright (c) 2012-2014 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
  Type: Model B+, Revision: 1.2, Memory: 512MB, Maker: Sony
```

###gpioコマンドの動作確認
ブレッドボードなどを使って、GPIO25にLEDを接続します。
下記のコマンドは、GPIO25を出力へ設定して、点灯、消灯をテストしています。

```bash
$gpio -g mode 25 out
$gpio -g write 25 1
$gpio -g write 25 0
```

##C言語での制御
C言語から利用するのは、簡単です。

```
$gcc -o test test.c -lwiringPi
$sudo ./test
```

```c:test.c
#include <wiringPi.h>
#define GPIO25 25

int main(void) {
    if(wiringPiSetupGpio() == -1) {
        return 1;
    }
    pinMode(GPIO25, OUTPUT);
    digitalWrite(GPIO25, 1);
    delay(1000);
    digitalWrite(GPIO25, 0);
}
```
UbuntuにZabbix 2.2をインストールする

OS: Ubuntu Server 14.04
上記OSでの作業を想定しています。


#事前準備
##【まずはアップデート】
`$ sudo apt-get update`

`$ sudo apt-get dist-upgrade`

##【プログラムのインストール】
どかっと

`$ sudo apt-get install apache2 ssh language-pack-ja  mysql-server php5-mysql zabbix-server-mysql zabbix-frontend-php zabbix-agent fonts-vlgothic`
*mysqlのインストール時にrootのパスワードを設定、メモする。*


#各種設定
##【mysqlの設定】
バックアップを取り、
`$ sudo cp /etc/mysql/my.cnf /etc/mysql/my.cnf.original`

エディタで開いて、
`$ sudo vim /etc/mysql/my.cnf`

`[mysqld]`の項に下記を追記、保存
`character-set-server=utf8
skip-character-set-client-handshake`

サービスを再起動します。
`$ sudo service mysql restart`

##【データベースにZABBIXの情報流し込み】
mysqlにルートでログインします

`$ mysql -uroot -p`

データベースとユーザを作ります。
"zabbix_password"としたところは、各自で変更してください。

`mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> grant all on zabbix.* to 'zabbix'@'localhost' identified by 'zabbix_password';
mysql> quit`


ダーッと流し込みます。

`$ sudo zcat /usr/share/zabbix-server-mysql/schema.sql.gz | mysql -uzabbix -p zabbix`

`$ sudo zcat /usr/share/zabbix-server-mysql/images.sql.gz | mysql -uzabbix -p zabbix`

`$ sudo zcat /usr/share/zabbix-server-mysql/data.sql.gz | mysql -uzabbix -p zabbix`



##【zabbixの初期設定】
バックアップを取り、
`$ sudo cp /etc/zabbix/zabbix_server.conf /etc/zabbix/zabbix_server.conf.original`

エディタで開いて、
`$ sudo vim /etc/zabbix/zabbix_server.conf`

下記の行を追記・変更。
`DBName=zabbix
DBUser=zabbix
DBPassword=zabbix_password`

設定例から取出し、
`$ sudo cp /usr/share/doc/zabbix-frontend-php/examples/apache.conf /etc/apache2/conf-available/zabbix.conf`

エディタで開いて、
`$ sudo vim /etc/apache2/conf-available/zabbix.conf`

最終行に下記を追記、
`php_value max_execution_time 300
php_value memory_limit 128M
php_value post_max_size 16M
php_value upload_max_filesize 2M
php_value max_input_time 300
php_value date.timezone Asia/Tokyo`

上記のconfを適用します。
`$ sudo a2enconf zabbix`

こちらも設定例から取出し、
`$ sudo cp /usr/share/doc/zabbix-frontend-php/examples/zabbix.conf.php.example /etc/zabbix/zabbix.conf.php`

エディタで開いて
`$ sudo vim /etc/zabbix/zabbix.conf.php`

下記の内容に変更します。
`$DB['DATABASE'] = 'zabbix';
$DB['USER'] = 'zabbix';
$DB['PASSWORD'] = 'zabbix_password'`


##【zabbixのフォント設定】
フォントのシンボリックリンクを張り、
`$ sudo ln -s /usr/share/fonts/truetype/vlgothic/VL-PGothic-Regular.ttf /usr/share/zabbix/fonts/VL-PGothic-Regular.ttf`

バックアップを取ったうえで、
`$ sudo cp /usr/share/zabbix/include/defines.inc.php /usr/share/zabbix/include/defines.inc.php.original`

エディタで開き、
`$ sudo vim /usr/share/zabbix/include/defines.inc.php`

下記の行を追記・変更。
`L39:
define('ZBX_GRAPH_FONT_NAME',         'DejaVuSans'); // font file name
↓
//define('ZBX_GRAPH_FONT_NAME',         'DejaVuSans'); // font file name
define('ZBX_GRAPH_FONT_NAME',           'VL-PGothic-Regular');`

apache2をリスタートします。
`$ sudo service apache2 restart`

#【zabbix-serverの起動】
バックアップを取り、
`$ sudo cp /etc/default/zabbix-server /etc/default/zabbix-server.original`

エディタで開き、
`$ sudo vim /etc/default/zabbix-server`

下記の内容に変更。
`START=yes`

zabbixのサービスを起動します。
`$ sudo service zabbix-server start`

#ついでに
##【メールサーバーの設置】
ZABBIXからアラートメールを出したい場合で、適当なメールサーバがない場合はこのあたりで。
`$ sudo apt-get install postfix mailutils`

`$ service postfix start`
Project Eulerをhaskellで練習していく日記: Problem 31

#問題
英国の通貨はポンドとペニーから成り、コインには以下のバリエーションがある。
1p, 2p, 5p, 10p, 20p, 50p, £1 (100p), £2 (200p)

£2 = 200pをこれらのコインで用意するには、例えば以下の組み合わせがある。
1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p

このように、£2をこれらのコインで用意する場合の数を求めよ。
#回答
1pのコインで、つじつまを合わせることにし、200未満を1p以外のコインで用意する場合の数を数える。

```hs
ukcoins = [2,5,10,20,50,100,200]  -- 1のコインは200に到達しない部分を埋めるのに使うのでここには列挙しない。

-- 合計total以下のコインの組み合わせの場合の数を数える。
count _ [] = 1
count total (c:cs) = sum [count (total-m*c) cs |m<-[0..(total `div` c)]]

main = do
     print $ count 200 ukcoins
```
#感想
再帰的に数える方法を考える時間のほうがはるかに長かった。（受験生だったころならきっと一瞬で思いついたんでしょうね。）
思いつけばプログラムは非常に簡単。
Twitter Bootstrapのページを印刷するとリンクのリンク先が表示される問題をCSSで解決

Twitter Bootstrapを利用したページ印刷するときに、リンクタグのリンク先が表示される現象が生じます。

```css:CSS
@media print {
  a[href]:after {
    content: "" !important;
  }
  abbr[title]:after {
    content: "" !important;
  }
}
```
BootstrapのCSSを上書きすると表示されなくなります。
ASP.NET MVCでファイルをアップロードする

ASP.NET MVCでのファイルのアップロードは、モデルバインダが対応している以外のサポートは無いようです。バインドする型としてHttpPostedFileWrapperクラスを指定するとそれがアップロードされたファイルの受け皿になります。

```html:Upload.cshtml
@using (Html.BeginForm("UploadFile", null, FormMethod.Post, new { enctype="multipart/form-data" }))
{
	@Html.AntiForgeryToken()
	<input type="file" name="postedFile" />
	<input type="submit" value="アップロード" />
}
```

```csharp
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult UploadFile(HttpPostedFileWrapper postedFile)
{
    // postedFile.SaveAs()でファイルに保存するか
    // postedFile.InputStreamでストリームから内容を読み出して何かをする
    return new View(...);
}
```

アップロードされたファイルをLINQでデータベースに保存する場合は若干面倒です。
varbinary型のカラムはSystem.Data.Linq.Binaryにマッピングされますが、そのクラスにはbyte配列を取るコンストラクタしかなく、Streamの方にもbyte配列を取得するメソッドがありません。
とりあえず一度MemoryStreamにコピーしてからToArray()するのが最も簡単な方法のようです。

```csharp
var memStream = new MemoryStream();
postedFile.inputStream.CopyTo(memStream);
var content = new System.Data.Linq.Binary(memStream.ToArray());
memStream.Dispose();
```

参考：

* http://msdn.microsoft.com/en-us/library/system.web.httppostedfilewrapper(v=vs.118).aspx
* http://msdn.microsoft.com/en-us/library/system.data.linq.binary(v=vs.118).aspx
NAOqi pythonのインストール

Choregrapheの次はPythonでの開発がオススメされています。
今回はPythonでの開発環境のインストールをします。
ここではMacのものを示します。

NAOqiではpython2.7を使うようです。

ダウンロード
================
以下の説明に従えばよいのですが、2.1のバイナリが見つかりませんでした。
https://community.aldebaran.com/doc/2-1/dev/python/install_guide.html

そこで1.4のものを使ってみます。

まずコミュニティサイトに行きます。

https://community.aldebaran.com

ログインした後、SOFTWARES -> older software versionに進みます。

![スクリーンショット_2014-08-24_14_10_25.png](https://qiita-image-store.s3.amazonaws.com/0/52430/b8197dad-6275-88f7-8d60-937b32d4c398.png)

![スクリーンショット_2014-08-24_14_10_43.png](https://qiita-image-store.s3.amazonaws.com/0/52430/540635e2-195d-8511-0e77-c8cfb9e38ed0.png)

そこでNAOqi-1.14.5を選択して、

![スクリーンショット_2014-08-24_14_11_34.png](https://qiita-image-store.s3.amazonaws.com/0/52430/068cc153-8316-8648-95f6-40a0d8df9ef3.png)

私はMacなので、pynaoqi-python-2.7-naoqi-1.14.5-mac64.tar.gzを選択しました。

インストール
=============

解凍して、python pathを通します。

```bash
$ tar xvf Downloads/pynaoqi-python-2.7-naoqi-1.14.5-mac64.tar.gz
$ export PYTHONPATH=${PYTHONPATH}:~/pynaoqi-python-2.7-naoqi-1.14-mac64
```

動作確認
===========

以下を実行してエラーがでなければ成功です。


```bash
$ python
>>> import nqoqi
>>>
```

.bashrc更新
--------------
これからも使うために、.bashrcを編集しておきましょう。

```bash
$ echo "export PYTHONPATH=${PYTHONPATH}:~/pynaoqi-python-2.7-naoqi-1.14-mac64" >> .bashrc
$ source .bashrc
```
Munin で複数サーバのグラフを１つにまとめて表示する方法

# 複数サーバのグラフを１つにまとめたい
仮想環境は簡単に作成できて使い勝手もいいのですが沢山作りすぎてしまい仮想とはいえ個別に見るのは辛い。
で複数サーバのグラフを１つにまとめて見ることができれば楽なのでその設定方法。そしていつものごとく、少しはまる…というおち（笑）。
↓こんな感じで、2サーバ混ぜてみたｗ
![munin_05.png](https://qiita-image-store.s3.amazonaws.com/0/44540/40860f0e-99c6-19ea-b6ad-f920839f28ea.png)

# graph_order でグループ単ににまとめる(だけ)
設定してもグラフが真っ白だったので、調べたら単にプラグインとプラグインの値の指定を間違えていただけというオチでした。

```
hoge.graph_order \
  redmine_gr=redmine:load.load \
  gitlab_gr=gitlab:load.load
```

たとえば上記の「redmine_gr=:load.load」場合
　redmine_gr : ラベル
　redmine    : muninで定義しているホスト名（実ホスト名ではない） 
　load.load  : load プラグインの load プロパティ

> [munin日本語情報ノート サンプル/グラフ引数のサンプル](http://munin.jp/wiki/%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB/%E3%82%B0%E3%83%A9%E3%83%95%E5%BC%95%E6%95%B0%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB)

## プラグインのプロパティを調べる方法は、２通り。
### munin-run コマンドを使って調べる方法
plugins ディレクトリにインストールされているプラグイン名を、munin-run コマンドの引数に指定するだけ。下記の場合、load.value の値を使用したい場合は、load プロパティが使用可能だとわかる（って説明がクドイ）。

```
# munin-run load
load.value 0.22
```

### telnet コマンドを使って調べる方法
4949 ポートにアクセスしてみる。list コマンドと fetch コマンドで簡単に確認できる。

```
# telnet 192.168.11.200 4949
Trying 192.168.11.200...
Connected to 192.168.11.200.
Escape character is '^]'.
# munin node at gitlab
list
apache_accesses apache_processes apache_volume cpu df df_inode entropy forks fw_packets if_err_eth0 if_eth0 interrupts irqstats load memory netstat nfs4_client nfs_client ntp_kernel_err ntp_kernel_pll_freq ntp_kernel_pll_off ntp_offset ntp_states open_files open_inodes postfix_mailqueue postfix_mailvolume proc_pri processes swap threads uptime users vmstat
fetch load
load.value 0.00
.
```

# 設定の確認
確認作業は、Munin が node 情報を収集する間隔（５分）で行われるため多少の待ちが必要。ただ graph_order コマンドで描画されるグラフの元データは、すでに作成されたグラフ情報と重ねるだけなので指定がうまいこといけばすぐに期待とおりの結果をみることができる。

# 参考サイト

> [東京電力の電力使用状況をmuninにしてみる](http://pi.blog.jp/archives/51703574.html)
> [Loaning data from other graphs](http://munin-monitoring.org/wiki/LoaningData)
> [muninの設定(つづき)](http://d.hatena.ne.jp/over80/20080703/1215100867)
> [munin 4949](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&es_th=1&ie=UTF-8#q=munin%204949)
> [Muninでアラートメールの送信 (メール送信編)](http://castor.s26.xrea.com/blog/2007/10/19)
> [Munin/設定](http://www.sssc.cc/wiki/index.php?Munin%2F%E8%A8%AD%E5%AE%9A)
curl_execでAPI叩いても1しか返してくれなくて辛い


結論を言うとCURLOPT_RETURNTRANSFERを指定してなかったからですね。
CURLOPT_RETURNTRANSFERにTRUEを指定しないと成功時にTRUE、失敗時にFALSEをかえすようです。

デバックの時には返り値を出力して確認していたので、TRUEやFALSEではなく数値で出力されていたのが混乱を招いていました。
そのため下記のように指定する必要があります。

```php:curl_exec
$ch = curl_init($request);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec ($ch);
```

こんな事で小一時間も悩む人がこの世から消えますように。
[備忘録]AppController.mmあたりをいじっている時のUnity4.1.5迄からUnity4.2以上に上げる時の注意

AppControllerの内容がビルド時に反映されない問題が起きた
原因は
* AppController.*がビルドされる際にプロジェクトに含まれなくなっていた（正しくないかもしれないけど）

解決方法
* [テラシュールブログ 4.3.4(ios)のWWWでメモリリークが発生する問題と対策](http://tsubakit1.hateblo.jp/entry/20140225/1393254732)

今回はopenURLとdidFinishLaunchingWithOptionsの処理に自前の処理を追加したかったので以下のようなスクリプトで書いた。
基本はテラシュールブログさんの内容。
また、loadを含めないではじめやってたら失敗したのでload含めると良い
loadが何かわからない人は下記サイトが参考になる
* [ダイナミックObjective-C](http://news.mynavi.jp/column/objc/050/)

```objc:hogeController
#import "iPhone_target_Prefix.pch"
#import "UnityAppController.h"

// --- HogeController --------------------------------------------------------------------
//

@interface HogeController : UnityAppController
+(void)load;
@end

@implementation HogeController
+(void)load
{
    extern const char* AppControllerClassName;
    AppControllerClassName = "HogeController";
}

// 非推奨
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    // 処理を記述
    return YES;
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    // 処理を記述
    return YES;
}


- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
    // 処理を記述
    return YES;
}

```

なお何故このメソッドが例に出てくるかは分かる人だけ察して下さい。


以上
Ruby | Gviz で GitLab / GitLab CI / Kandan / Hubot の構成図を作成する

# Ruby | Gviz で GitLab / GitLab CI / Kandan / Hubot の構成図を作成する
## 概要
Gviz で GitLab / GitLab CI/ Kandan / Hubot の構成図を作成します。

## コード

~~~
require "gviz"

Graph do
  nodes fontname:'MS UI GOTHIC', fontsize:20
  user_nodes = {shape: :none, fontsize:10, label: ''}
  server_nodes = {width: 3, height: 2, shape: :none, fontsize:10, label: ''}
  edges fontsize: 20

  node :User1, {image: "./actor.jpg"}.merge(user_nodes)
  node :User2, {image: "./actor.jpg"}.merge(user_nodes)
  node :Kandan, {image: "./kandan.png"}.merge(server_nodes)
  node :Hubot, {image: "./hubot.jpg"}.merge(server_nodes)
  node :GitLab, {image: "./gitlab.png"}.merge(server_nodes)
  node :GitLabCI, server_nodes.merge({image: "./gitlab_ci.png", width: 3, height: 1})
  node :GitLabCIRunner, server_nodes.merge({label: 'GitLab CI Runner', width: 3, height: 1, shape: :box3d, fontsize: 30 })

  edge :"User1_Kandan", {label: <<-EOS
Send chat message to User1
Ex: User1 @User2 hello
  EOS
  }

  edge :"User2_Kandan", {label: <<-EOS
Send chat message to Hubot
Ex: @hubot PING
  EOS
  }

  edge :"Kandan_Hubot", {label: 'Send message to Hubot'}
  edge :"Kandan_User1", {label: <<-EOS
Send chat message
Ex: GitLab push!
Ex: GitLab CI build success!
  EOS
  }

  edge :"Kandan_User2", {label: <<-EOS
Send chat message
Ex: User1 @User2 hello
Ex: PONG
Ex: GitLab push!
Ex: GitLab CI build success!
  EOS
  }

  edge :"Hubot_Kandan", {len: 3, label: <<-EOS
* Send chat message from Hubot.
  Ex: PONG
* Send chat message from GitLab.
  Ex: GitLab push!
* Send chat message from GitLab CI.
  Ex: GitLab CI build success!
  EOS
  }

  edge :"User1_GitLab", {label: 'GilLab push' }
  edge :"GitLab_Hubot", {label: <<-EOS
Send pull-event-json 
to Hubot by WebHooks
  EOS
  }
  edge :"GitLab_GitLabCI", {label: 'Call GitLab CI Server'}
  edge :"GitLabCI_GitLab", {label: 'Send CI result'}
  edge :"GitLabCI_Hubot", {label: <<-EOS
Send ci-result-json 
to Hubot by WebHooks2
  EOS
  }
  edge :"GitLabCI_GitLabCIRunner", {label: 'Call GitLab CI Runner'}
  edge :"GitLabCIRunner_GitLabCI", {label: 'Send CI Run result'}
  edge :"User1_User2", {label: 'I love you'}
  edge :"User2_User1", {label: 'I hate you'}

  rank :min, [:User1, :User2]
  rank :same, [:GitLab, :Kandan]
  rank :max, [:Hubot, :GitLabCI]

  save :"gitlab_hubot_kandan", :png
end
~~~

## 出力

![gitlab_hubot_kandan.png](https://qiita-image-store.s3.amazonaws.com/0/43480/97158b15-d0a1-7877-878e-23657e966dde.png)
AndroidのUtilsクラスまとめ

# はじめに
androidのUtilsをまとめた資料が見当たらなかったので作りました。
android.*パッケージに含まれるものだけまとめています。

# TextUtils
文字列操作用Utils。
`isEmpty()`とか`equals()`とかよく使う。
文字列操作系も大体揃っていて便利。
`isGraphic()`とか`ellipsize()`とか使ったことないけど気になるメソッドもある。
`SupportLibrary`に最新版との差分をまとめた`TextUtilsCompat`がある。
http://developer.android.com/reference/android/text/TextUtils.html
http://developer.android.com/reference/android/support/v4/text/TextUtilsCompat.html

# NavUtils
Up動作を実装するのに使う。
これだけ使っても思ったように実装できないことが多い気がする。
Up動作の実装については[以前まとめた](http://qiita.com/nein37/items/6a063f5462400036920b)。
http://developer.android.com/reference/android/support/v4/app/NavUtils.html

# DatabaseUtils
DBと`Cursor`を扱うためのUtils。
`Cursor`の中身を`ContentValues`に入れるメソッドが大量にある。
`concatenateWhere()`という2つのwhere句を`AND`でつないでくれるメソッドが微妙に便利。
`SupportLibrary`に最新版との差分をまとめた`DatabaseUtilsCompat`がある。
http://developer.android.com/reference/android/database/DatabaseUtils.html
http://developer.android.com/reference/android/support/v4/database/DatabaseUtilsCompat.html

# DateUtils
`formatDateRange()`と`formatDateTime()`で色々な日付表現ができる。
でも大抵はSimpleDateFormatで事足りるイメージ。
非推奨のメソッドもあるので、使う際は注意。
http://developer.android.com/reference/android/text/format/DateUtils.html

# URLUtil
URLを扱うためのUtils。
ただし`URL`型ではなく`String`のみ受け付ける。
有効なURLかどうかを判定してくれる`isValidUrl()`やウェブURL判定の`isNetworkUrl()`、`isHttpsUrl()`あたりは使えそう。
なぜかこいつだけ名前がUtil。
http://developer.android.com/reference/android/webkit/URLUtil.html

# PhoneNumberUtils
電話番号を扱うためのUtils。
`Intent`から電話番号を取得する`getNumberFromIntent()`が`tel:`も`sip:`も対応してて便利。
表示用に日本向け(！)に整形してくれる`formatJapaneseNumber()`というのもあるらしい。
`isDialable()`とか便利そうだけどちゃんと動くのか未確認…。
http://developer.android.com/reference/android/telephony/PhoneNumberUtils.html

# AnimationUtils
リソースからアニメーションの生成をしてくれるUtils。
`loadInterpolator()`くらいしか使ったことがない…。
http://developer.android.com/reference/android/view/animation/AnimationUtils.html

# ThumbnailUtils
サムネイルの生成Utils。
なんと画像だけでなく動画からもサムネイルの生成をしてくれる。
ただし、動画の場合はサイズが2種類しか選べない。
画像からは指定サイズで作れるから二重に生成すれば良いのだが…。
http://developer.android.com/reference/android/media/ThumbnailUtils.html

# TouchUtils
タッチイベントをシミュレートするためのUtils。
ActivityInstrumentationTestCase2と合わせてUIテストに使う。
http://developer.android.com/reference/android/test/TouchUtils.html



# GLUtils
`OpenGL`扱うときに使うっぽいUtils。
使ったことがない…。
http://developer.android.com/reference/android/opengl/GLUtils.html

# GestureUtils
ジェスチャー関連の解析とかをやるときに使うらしい。
使ったことがない…。
http://developer.android.com/reference/android/gesture/GestureUtils.html

# DebugUtils
`DebugUtils.isObjectSelected()`メソッドしかない。
ログ出すときにオブジェクトの状態が`ANDROID_OBJECT_FILTER`という環境変数の設定とマッチするかチェックしてくれる。
`ANDROID_OBJECT_FILTER`環境変数ってどうやってセットするんだ？
http://developer.android.com/reference/android/util/DebugUtils.html
Androidのエミュレータで画面を回転させる(on Mac)


Eclipse(ADT)での話です。

Windowsですとcontrol + F11ですが、Macだと

アプリケーション >  システム環境設定 > キーボードより「F1、F2などのすべてのキーを標準のファンクションキーとして使用」にチェックを入れると。

でもなんとなくそれはやりたくないので・・・。

``fn + control + F11``


覚えておこうと。指つらいですけど。


参考：
http://kitakatsu.info/2011/07/04/646.html
EclipseでAndroidSDKマネージャーが表示されない…

MacでEclipseを使おうと思い、DLしたら、上部ナビゲーションにもWindowにもAndroidSDKマネージャーが表示されていない…

焦って探したら、この記事が参考になりました…
http://www.devlog.alt-area.org/?p=547
p2v/v2v時の処理時間目安

p2v/v2v時の処理時間についての目安を記載します。
※個人的な経験則からなのであくまで目安です。

ディスクタイプ（SATA/SAS/SSDなど）、ネットワーク帯域（100Mbps/1Gbps/10Gbpsなど）、p2v/v2v対象のディスク使用量から処理時間の目安を予想します。

っが、データ転送量は大体「ディスク>ネットワーク」の関係性になるはずなので、ネットワーク帯域と対象ディスク使用量から目安となる処理時間を求めます。
※SSD、10Gbps環境では試したことがないので組み合わせによっては当てはまりません。

ちなみに、1Gbps/100Mbpsネットワーク環境でのデータ転送量は以下で求めれます。

- 1Gbps ≒ 1000[Mbps] / 8[Byte] ＝ 125[MBps]
- 100Mbps / 8[Byte] ＝ 12.5[MBps]

但し、これは理論値なので実際にはここまででません。
環境にもよりますが、経験則だと以下前後になるかと思います。

- 1Gbps環境 : 12～20MBps
- 100Mbps環境 : 1.0～3.0MBps

上記を正とすれば、データ転送率は10～20%前後くらいが目安となります。
スペックによってはもう少しぶれると思いますが、大体こんなものです。


上で色々説明していますが、目安としては以下の表となります。

|ネットワーク帯域|データ容量|転送時間|
|:--:|:--:|:--:|
|1Gbps|10GB|約10分|
|100Mbps|10GB|約70分|
複数ディスプレイの境界にDockを配置すると主ディスプレイと認識されない


![スクリーンショット 2014-08-25 7.58.58 PM.png](https://qiita-image-store.s3.amazonaws.com/0/229/7d087891-953b-ebf9-6116-b72b177cf6de.png "スクリーンショット 2014-08-25 7.58.58 PM.png")

Command-Tabを押すと左のサブディスプレイの方に切り替えウィンドウが出てしまう。

これはどうやら私がDockを左に配置する設定にしていたので。Dockが左にあるということは左が主ディスプレイだという風に解釈されているらしいことがわかった。

![スクリーンショット 2014-08-25 7.59.20 PM.png](https://qiita-image-store.s3.amazonaws.com/0/229/d3cc028f-6545-8ee3-1551-669c7a6284ba.png "スクリーンショット 2014-08-25 7.59.20 PM.png")

私はキーボードから使い辛いのでDockが好きではなく常時見えないようにしていただけなので、このDockを全員利用していることを前提にした挙動が駄目な感じだと思った。オフにしたい。

* [mavericks - How to choose on which display Application Switcher shows? - Ask Different](http://apple.stackexchange.com/questions/106275/how-to-choose-on-which-display-application-switcher-shows)
PythonでHTMLタグをstripする

PHPではstrip_tagsという関数でString中のHTMLタグを簡単に除去できますが、Pythonでは標準の方法が用意されておらず自分で実装する必要があります。

ごりごり正規表現を書くのもあれなので、なにかいい方法がないか探してみました。

----

結果、調べてみた中ではこれが一番よさげ
http://stackoverflow.com/questions/753052/strip-html-from-strings-in-python

```py
from HTMLParser import HTMLParser

class MLStripper(HTMLParser):

    def __init__(self):
        self.reset()
        # stripしたテキストを保存するバッファー
        self.fed = []

    def handle_data(self, d):
        # 任意のタグの中身のみを追加していく
        self.fed.append(d)

    def get_data(self):
        # バッファーを連結して返す
        return ''.join(self.fed)

def strip_tags(html):
    s = MLStripper()
    s.feed(html)
    return s.get_data()
```

利点としては

  * 標準ライブラリだけで済むこと
  * 不完全なHTMLでもそこそこ動いてくれること

欠点としては

  * ```&gt;```や```&amp;```といった実体参照まで消えてしまうこと

が挙げられます。

HTMLの一部でもちゃんと動いてくれますし、一般的な用途であればこの方法で十分ではないでしょうか。

パフォーマンス等については未検証です。
備忘録＠Python OR セミナー

８月２３日にはじめてプログラミングのイベントに参加してきて，またある方にアウトプットは大事と言われたから，ここに書きます．

主にipython周りと，Operations Researchのときに便利なライブラリのまとめ．

# Operations Researchって

数学を使って，問題を解決する学問分野．

# ORで便利なライブラリたち

今回使ったライブラリは，以下のとおり．

| ライブラリ | 機能 |
|:--------:|:----|
|[pandas](http://qiita.com/makora9143/items/bccfaee35f2774f02c74)|クロス集計等前処理がメイン．意外に出来る子|
|[matplotlib](http://qiita.com/makora9143/items/61c3c97cb78fcf6d34b1)|グラフ描画ライブラリ．かなり綺麗にできる．|
|[scikit-learn](http://qiita.com/makora9143/items/d1883c21b9b6d06a37b3)|機械学習ライブラリ．大概の手法が入ってる．|
|[pulp](http://qiita.com/makora9143/items/9e90a533c95c24b85a94)|最適化計算ライブラリ．軽い最適化ならこれ．|
|simpy|シミュレーション用ライブラリ．待ち行列モデル等．|
|networkX|グラフ描画ライブラリ．グラフ理論ならこれ．|
|sympy|記号計算ライブラリ．文字式をそのまま解いてくれる．|

`boto`っていうAWS用のライブラリも扱ったけど，今回は割愛．


# IPythonって

IPythonは普通のInteractive Shellみたいなのと，
サーバ立てて，ブラウザからプログラミングができるようになる（notebook）すごい便利なやつ．

インストールなどは，ほかのサイトを参照すればいいと思ってる．


## 起動
セミナーでは`ipython notebook --pylab inline`というコマンドでやってたけど，なんか良くないらしい．
`ipython notebook --matplotlib inline`ってやるのがいいみたい．

ちなみに`%matplotlib (inline)`で実行したあとも出来るみたい．
`inline`はブラウザ内でグラフや図を描画するか，別ウインドウで描画するか選ぶ．

## 便利機能

### 補完
`Tab`キーを押せば補完してくれる．

### 調査
オブジェクトや関数に`?`をつけると情報を，
`??`をつけるとソースコードを見ることが出来る．

```pycon
>>> %pylab
>>> prob?
Type:        function
String form: <function prod at 0x10bfeb398>
File:        /usr/local/lib/python2.7/site-packages/numpy/core/fromnumeric.py
Definition:  prod(a, axis=None, dtype=None, out=None, keepdims=False)
Docstring:
Return the product of array elements over a given axis.

Parameters
----------
a : array_like
    Input data.
axis : None or int or tuple of ints, optional...

>>> prob??
Type:        function
String form: <function prod at 0x10bfeb398>
File:        /usr/local/lib/python2.7/site-packages/numpy/core/fromnumeric.py
Definition:  prod(a, axis=None, dtype=None, out=None, keepdims=False)
Source:
def prod(a, axis=None, dtype=None, out=None, keepdims=False):
    """
    Return the product of array elements over a given axis.

    Parameters
    ----------
    a : array_like...
```

### シェルコマンド

基本的にシェルコマンドの頭に`!`をつければ，何でも出来る．

知ってる感じだと，`cd`, `ls` ,`mv`, `cp`, `rm`, `less`, `cat`あたりはそのまま使える．vimは`!vim`じゃないとダメ．

### コマンド

いくつか便利なのをいくつか．
`%time`: 一回時間を測る．
`%timeit`: 複数回の平均時間を測る．（こっち使う方がいいかな）
`%run python_file`: python_fileを実行する．（`!python`でも可）
`%paste`: ペースト（ターミナル実行時のみ）  

## チートシート

ここで挙げているもの以外は，[チートシート](http://damontallen.github.io/IPython-quick-ref-sheets/)を参照するべし．





# scikit-learn


# pulp
準備中...．

# simpy
準備中...．

# networkX
準備中...．

# sympy
準備中...．